From 5bab1883aa1d5ad08c28742c4f559a385c39c2e5 Mon Sep 17 00:00:00 2001 From: yui0303 Date: Mon, 20 May 2024 00:49:36 +0800 Subject: [PATCH 01/17] chore: add comment --- lab05/kernel/src/entry.S | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lab05/kernel/src/entry.S b/lab05/kernel/src/entry.S index 70635565d..8d7d4fd22 100644 --- a/lab05/kernel/src/entry.S +++ b/lab05/kernel/src/entry.S @@ -203,7 +203,7 @@ ret_from_fork: bl schedule_tail // preemptive enable cbz x19, ret_to_user mov x0, x20 - blr x19 //should never return + blr x19 //should never return, except for kp_to_user ret_to_user: bl disable_irq From 9fd0abcb3dc7ca9c76b00359967d01fb8a55e2bf Mon Sep 17 00:00:00 2001 From: yui0303 Date: Thu, 23 May 2024 20:51:19 +0800 Subject: [PATCH 02/17] chore: typo --- lab05/README.md | 2 +- lab05/kernel/src/sys.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lab05/README.md b/lab05/README.md index 56e82e60f..1360ac749 100644 --- a/lab05/README.md +++ b/lab05/README.md @@ -1,4 +1,4 @@ -# OSC2023-Lab04 +# OSC2023-Lab05 | Github Account | Student ID | Name | |----------------|------------|---------------| diff --git a/lab05/kernel/src/sys.c b/lab05/kernel/src/sys.c index 5c1f84b3d..de7614d8d 100644 --- a/lab05/kernel/src/sys.c +++ b/lab05/kernel/src/sys.c @@ -90,7 +90,7 @@ int sys_fork() // [TODO] { unsigned long stack = (unsigned long)balloc(THREAD_SIZE); if((void*)stack == NULL) return -1; - memzero_asm(stack, 4*THREAD_SIZE); + memzero_asm(stack, THREAD_SIZE); return copy_process(0, 0, 0, stack); } From b7132591e196d7a82ec3c18312b9bb16d68d4848 Mon Sep 17 00:00:00 2001 From: yui0303 Date: Thu, 30 May 2024 22:37:34 +0800 Subject: [PATCH 03/17] chore: asyn.io syscall.img --- lab05/initramfs.cpio.1 | Bin 0 -> 247296 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 lab05/initramfs.cpio.1 diff --git a/lab05/initramfs.cpio.1 b/lab05/initramfs.cpio.1 new file mode 100644 index 0000000000000000000000000000000000000000..35e0f5d180be495377046d74f2ef420cfed2e269 GIT binary patch literal 247296 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 literal 0 HcmV?d00001 From b1ca7263d315522073830131805e175dbd1729d7 Mon Sep 17 00:00:00 2001 From: yui0303 Date: Sun, 9 Jun 2024 20:47:01 +0800 Subject: [PATCH 04/17] feat: init lab7 and finish the draft of ls, mkdir of rootfs --- lab07/bootloader/Makefile | 49 ++ lab07/bootloader/include/base.h | 6 + lab07/bootloader/include/bootload.h | 16 + lab07/bootloader/include/gpio.h | 12 + lab07/bootloader/include/io.h | 11 + lab07/bootloader/include/mini_uart.h | 26 + lab07/bootloader/include/type.h | 9 + lab07/bootloader/src/boot.S | 35 + lab07/bootloader/src/bootload.c | 41 ++ lab07/bootloader/src/bootloader_main.c | 74 ++ lab07/bootloader/src/io.c | 32 + lab07/bootloader/src/linker.ld | 22 + lab07/bootloader/src/mini_uart.c | 69 ++ lab07/bootloader/src/type.c | 1 + lab07/initramfs.cpio | Bin 0 -> 247296 bytes lab07/kernel/Makefile | 54 ++ lab07/kernel/include/alloc.h | 25 + lab07/kernel/include/bootload.h | 15 + lab07/kernel/include/cpio.h | 37 + lab07/kernel/include/devicetree.h | 94 +++ lab07/kernel/include/entry.h | 30 + lab07/kernel/include/errno.h | 9 + lab07/kernel/include/fork.h | 26 + lab07/kernel/include/io.h | 14 + lab07/kernel/include/irq.h | 12 + lab07/kernel/include/lib.h | 12 + lab07/kernel/include/mailbox.h | 8 + lab07/kernel/include/mem.h | 31 + lab07/kernel/include/mini_uart.h | 26 + lab07/kernel/include/mm.h | 6 + lab07/kernel/include/peripherals/base.h | 6 + lab07/kernel/include/peripherals/gpio.h | 12 + lab07/kernel/include/peripherals/irq.h | 29 + lab07/kernel/include/peripherals/mailbox.h | 23 + lab07/kernel/include/peripherals/mini_uart.h | 26 + lab07/kernel/include/reboot.h | 8 + lab07/kernel/include/schedule.h | 71 ++ lab07/kernel/include/shell.h | 12 + lab07/kernel/include/string.h | 12 + lab07/kernel/include/sys.h | 52 ++ lab07/kernel/include/timer.h | 14 + lab07/kernel/include/tmpfs.h | 31 + lab07/kernel/include/type.h | 13 + lab07/kernel/include/vfs.h | 73 ++ lab07/kernel/include/video.h | 6 + lab07/kernel/src/alloc.c | 714 +++++++++++++++++++ lab07/kernel/src/boot.S | 48 ++ lab07/kernel/src/bootload.c | 43 ++ lab07/kernel/src/cpio.c | 182 +++++ lab07/kernel/src/devicetree.c | 94 +++ lab07/kernel/src/entry.S | 235 ++++++ lab07/kernel/src/fork.c | 119 ++++ lab07/kernel/src/io.c | 54 ++ lab07/kernel/src/irq.S | 11 + lab07/kernel/src/irq.c | 84 +++ lab07/kernel/src/kernel_main.c | 54 ++ lab07/kernel/src/lib.c | 87 +++ lab07/kernel/src/linker.ld | 24 + lab07/kernel/src/mailbox.c | 67 ++ lab07/kernel/src/mini_uart.c | 65 ++ lab07/kernel/src/mm.S | 6 + lab07/kernel/src/reboot.c | 18 + lab07/kernel/src/schedule.S | 24 + lab07/kernel/src/schedule.c | 103 +++ lab07/kernel/src/shell.c | 278 ++++++++ lab07/kernel/src/string.c | 68 ++ lab07/kernel/src/sys.S | 97 +++ lab07/kernel/src/sys.c | 140 ++++ lab07/kernel/src/timer.S | 32 + lab07/kernel/src/timer.c | 25 + lab07/kernel/src/tmpfs.c | 269 +++++++ lab07/kernel/src/vfs.c | 319 +++++++++ lab07/kernel/src/video.c | 75 ++ 73 files changed, 4525 insertions(+) create mode 100644 lab07/bootloader/Makefile create mode 100644 lab07/bootloader/include/base.h create mode 100644 lab07/bootloader/include/bootload.h create mode 100644 lab07/bootloader/include/gpio.h create mode 100644 lab07/bootloader/include/io.h create mode 100644 lab07/bootloader/include/mini_uart.h create mode 100644 lab07/bootloader/include/type.h create mode 100644 lab07/bootloader/src/boot.S create mode 100644 lab07/bootloader/src/bootload.c create mode 100644 lab07/bootloader/src/bootloader_main.c create mode 100644 lab07/bootloader/src/io.c create mode 100644 lab07/bootloader/src/linker.ld create mode 100644 lab07/bootloader/src/mini_uart.c create mode 100644 lab07/bootloader/src/type.c create mode 100644 lab07/initramfs.cpio create mode 100644 lab07/kernel/Makefile create mode 100644 lab07/kernel/include/alloc.h create mode 100644 lab07/kernel/include/bootload.h create mode 100644 lab07/kernel/include/cpio.h create mode 100644 lab07/kernel/include/devicetree.h create mode 100644 lab07/kernel/include/entry.h create mode 100644 lab07/kernel/include/errno.h create mode 100644 lab07/kernel/include/fork.h create mode 100644 lab07/kernel/include/io.h create mode 100644 lab07/kernel/include/irq.h create mode 100644 lab07/kernel/include/lib.h create mode 100644 lab07/kernel/include/mailbox.h create mode 100644 lab07/kernel/include/mem.h create mode 100644 lab07/kernel/include/mini_uart.h create mode 100644 lab07/kernel/include/mm.h create mode 100644 lab07/kernel/include/peripherals/base.h create mode 100644 lab07/kernel/include/peripherals/gpio.h create mode 100644 lab07/kernel/include/peripherals/irq.h create mode 100644 lab07/kernel/include/peripherals/mailbox.h create mode 100644 lab07/kernel/include/peripherals/mini_uart.h create mode 100644 lab07/kernel/include/reboot.h create mode 100644 lab07/kernel/include/schedule.h create mode 100644 lab07/kernel/include/shell.h create mode 100644 lab07/kernel/include/string.h create mode 100644 lab07/kernel/include/sys.h create mode 100644 lab07/kernel/include/timer.h create mode 100644 lab07/kernel/include/tmpfs.h create mode 100644 lab07/kernel/include/type.h create mode 100644 lab07/kernel/include/vfs.h create mode 100644 lab07/kernel/include/video.h create mode 100644 lab07/kernel/src/alloc.c create mode 100644 lab07/kernel/src/boot.S create mode 100644 lab07/kernel/src/bootload.c create mode 100644 lab07/kernel/src/cpio.c create mode 100644 lab07/kernel/src/devicetree.c create mode 100644 lab07/kernel/src/entry.S create mode 100644 lab07/kernel/src/fork.c create mode 100644 lab07/kernel/src/io.c create mode 100644 lab07/kernel/src/irq.S create mode 100644 lab07/kernel/src/irq.c create mode 100644 lab07/kernel/src/kernel_main.c create mode 100644 lab07/kernel/src/lib.c create mode 100644 lab07/kernel/src/linker.ld create mode 100644 lab07/kernel/src/mailbox.c create mode 100644 lab07/kernel/src/mini_uart.c create mode 100644 lab07/kernel/src/mm.S create mode 100644 lab07/kernel/src/reboot.c create mode 100644 lab07/kernel/src/schedule.S create mode 100644 lab07/kernel/src/schedule.c create mode 100644 lab07/kernel/src/shell.c create mode 100644 lab07/kernel/src/string.c create mode 100644 lab07/kernel/src/sys.S create mode 100644 lab07/kernel/src/sys.c create mode 100644 lab07/kernel/src/timer.S create mode 100644 lab07/kernel/src/timer.c create mode 100644 lab07/kernel/src/tmpfs.c create mode 100644 lab07/kernel/src/vfs.c create mode 100644 lab07/kernel/src/video.c diff --git a/lab07/bootloader/Makefile b/lab07/bootloader/Makefile new file mode 100644 index 000000000..3a9d087ed --- /dev/null +++ b/lab07/bootloader/Makefile @@ -0,0 +1,49 @@ +ARMGNU ?= aarch64-linux-gnu + +COPS = -Wall -ffreestanding -nostdinc -nostdlib -nostartfiles -fno-stack-protector -g -Iinclude +ASMOPS = + +BUILD_DIR = build +SRC_DIR = src + + +all: clean bootloader.img + +.PHONY: clean +clean: + rm -rf $(BUILD_DIR) *.img + +$(BUILD_DIR)/%_c.o: $(SRC_DIR)/%.c + mkdir -p $(@D) + $(ARMGNU)-gcc $(COPS) -c $< -o $@ + +$(BUILD_DIR)/%_s.o: $(SRC_DIR)/%.s + $(ARMGNU)-gcc $(ASMOPS) -c $< -o $@ + + +C_FILES = $(wildcard $(SRC_DIR)/*.c) +ASM_FILES = $(wildcard $(SRC_DIR)/*.S) +OBJ_FILES = $(C_FILES:$(SRC_DIR)/%.c=$(BUILD_DIR)/%_c.o) +OBJ_FILES += $(ASM_FILES:$(SRC_DIR)/%.S=$(BUILD_DIR)/%_s.o) + +# DEP_FILES = $(OBJ_FILES:%.o=%.d) +# -include $(DEP_FILES) + +bootloader.img: $(OBJ_FILES) $(SRC_DIR)/linker.ld + $(ARMGNU)-ld -T $(SRC_DIR)/linker.ld -o $(BUILD_DIR)/bootloader.elf $(OBJ_FILES) + $(ARMGNU)-objcopy $(BUILD_DIR)/bootloader.elf -O binary bootloader.img + +.PHONY: run debug test +run: bootloader.img + qemu-system-aarch64 -M raspi3b -kernel bootloader.img -display none -serial null -serial pty \ + -initrd ../initramfs.cpio \ + -dtb ../bcm2710-rpi-3-b-plus.dtb + +test: bootloader.img + qemu-system-aarch64 -M raspi3b -kernel bootloader.img -display none -serial null -serial stdio + +dump: bootloader.img + qemu-system-aarch64 -M raspi3b -kernel bootloader.img -display none -d in_asm + +debug: all + qemu-system-aarch64 -M raspi3b -kernel bootloader.img -display none -serial null -serial stdio -S -s diff --git a/lab07/bootloader/include/base.h b/lab07/bootloader/include/base.h new file mode 100644 index 000000000..fb8886d5b --- /dev/null +++ b/lab07/bootloader/include/base.h @@ -0,0 +1,6 @@ +#ifndef _BASE_H +#define _BASE_H + +#define MMIO_BASE 0x3F000000 + +#endif \ No newline at end of file diff --git a/lab07/bootloader/include/bootload.h b/lab07/bootloader/include/bootload.h new file mode 100644 index 000000000..3dda28e56 --- /dev/null +++ b/lab07/bootloader/include/bootload.h @@ -0,0 +1,16 @@ +#ifndef __BOOTLOAD_H__ +#define __BOOTLOAD_H__ + +#define KernelAddr 0x80000 +#define BootAddr 0x60000 + +#include "mini_uart.h" +#include "io.h" +#include "type.h" + +extern uint32_t __bss_end; + +void reallocate(); +void load_kernel(); + +#endif diff --git a/lab07/bootloader/include/gpio.h b/lab07/bootloader/include/gpio.h new file mode 100644 index 000000000..9fc10379b --- /dev/null +++ b/lab07/bootloader/include/gpio.h @@ -0,0 +1,12 @@ +#ifndef _GPIO_H +#define _GPIO_H + +#include "base.h" + +#define GPFSEL1 ((volatile unsigned int*)(MMIO_BASE+0x00200004)) +#define GPSET0 ((volatile unsigned int*)(MMIO_BASE+0x0020001C)) +#define GPCLR0 ((volatile unsigned int*)(MMIO_BASE+0x00200028)) +#define GPPUD ((volatile unsigned int*)(MMIO_BASE+0x00200094)) +#define GPPUDCLK0 ((volatile unsigned int*)(MMIO_BASE+0x00200098)) + +#endif diff --git a/lab07/bootloader/include/io.h b/lab07/bootloader/include/io.h new file mode 100644 index 000000000..64b657fb0 --- /dev/null +++ b/lab07/bootloader/include/io.h @@ -0,0 +1,11 @@ +#ifndef __IO_H__ +#define __IO_H__ + +#include "mini_uart.h" + +void printf(char* str); +void printfc(char c); +void printf_hex(unsigned int d); +char read_char(); + +#endif \ No newline at end of file diff --git a/lab07/bootloader/include/mini_uart.h b/lab07/bootloader/include/mini_uart.h new file mode 100644 index 000000000..659dd83c0 --- /dev/null +++ b/lab07/bootloader/include/mini_uart.h @@ -0,0 +1,26 @@ +#ifndef _MINI_UART_H +#define _MINI_UART_H + +#include "base.h" + +#define AUX_ENABLES ((volatile unsigned int*)(MMIO_BASE+0x00215004)) +#define AUX_MU_IO_REG ((volatile unsigned int*)(MMIO_BASE+0x00215040)) +#define AUX_MU_IER_REG ((volatile unsigned int*)(MMIO_BASE+0x00215044)) +#define AUX_MU_IIR_REG ((volatile unsigned int*)(MMIO_BASE+0x00215048)) +#define AUX_MU_LCR_REG ((volatile unsigned int*)(MMIO_BASE+0x0021504C)) +#define AUX_MU_MCR_REG ((volatile unsigned int*)(MMIO_BASE+0x00215050)) +#define AUX_MU_LSR_REG ((volatile unsigned int*)(MMIO_BASE+0x00215054)) +#define AUX_MU_MSR_REG ((volatile unsigned int*)(MMIO_BASE+0x00215058)) +#define AUX_MU_SCRATCH ((volatile unsigned int*)(MMIO_BASE+0x0021505C)) +#define AUX_MU_CNTL_REG ((volatile unsigned int*)(MMIO_BASE+0x00215060)) +#define AUX_MU_STAT_REG ((volatile unsigned int*)(MMIO_BASE+0x00215064)) +#define AUX_MU_BAUD_REG ((volatile unsigned int*)(MMIO_BASE+0x00215068)) + + +void uart_init(); +char uart_recv(); +char uart_recv_io(); +void uart_send(char c); +void uart_send_string(const char* str); + +#endif \ No newline at end of file diff --git a/lab07/bootloader/include/type.h b/lab07/bootloader/include/type.h new file mode 100644 index 000000000..90b369a00 --- /dev/null +++ b/lab07/bootloader/include/type.h @@ -0,0 +1,9 @@ +#ifndef __TYPE_H__ +#define __TYPE_H__ + +typedef unsigned char uint8_t; +typedef unsigned int uint16_t; +typedef unsigned long int uint32_t; +typedef unsigned long long int uint64_t; + +#endif diff --git a/lab07/bootloader/src/boot.S b/lab07/bootloader/src/boot.S new file mode 100644 index 000000000..4579e1f8c --- /dev/null +++ b/lab07/bootloader/src/boot.S @@ -0,0 +1,35 @@ +.section ".text.boot" + +.global _start +_prologue: + mov x20, x0 + mov x1, #0x0000 + movk x1, #5, lsl #16 // 0x50000 + str x20, [x1] + +_start: + mrs x0, mpidr_el1 + and x0, x0,#0xFF // Check processor id + cbz x0, master // if cpu_id == 0, then booting + b proc_hang // Otherwise, hang + +proc_hang: + b proc_hang + +master: + adr x0, __bss_start + adr x1, __bss_size + bl memzero + + adr x1, _start + mov sp, x1 + bl main // jump to kernel_main c code + b proc_hang // should never come here + +memzero: + str xzr, [x0], #8 // xzr: a register holds zero + subs x1, x1, #8 + b.gt memzero + ret + +// adr: Load a label's relative address into the target register. \ No newline at end of file diff --git a/lab07/bootloader/src/bootload.c b/lab07/bootloader/src/bootload.c new file mode 100644 index 000000000..8f6febcce --- /dev/null +++ b/lab07/bootloader/src/bootload.c @@ -0,0 +1,41 @@ +#include "bootload.h" + +// uint64_t* BootHead = (uint64_t*)KernelAddr; +// uint64_t* CopyHead = (uint64_t*)BootAddr; +// uint64_t* bss_end = (uint64_t*)(&__bss_end); + +void reallocate() +{ + uint64_t* BootHead = (uint64_t*)KernelAddr; + uint64_t* CopyHead = (uint64_t*)BootAddr; + uint64_t* bss_end = (uint64_t*)(&__bss_end); + int i = 0; + while(BootHead != bss_end){ + printf("\n"); + printf_hex(i); + i++; + *CopyHead = *BootHead; + CopyHead++; + BootHead++; + } + printf("\nCopy done."); +} + +void load_kernel() +{ + unsigned int kernel_size = 0; + for(int i=0; i<4; i++){ + kernel_size <<= 8; + kernel_size |= (uart_recv() & 0xff); + } + + printf("\nKernel Size: "); + printf_hex(kernel_size); + printf("\n"); + + unsigned char* kernel = (unsigned char*)(0x80000); + unsigned char* kernel_ptr = kernel; + for(unsigned int i=0; i 0x????? - 0x20000 +***** need to branch hereh ***** -> 0x????? - 0x20000 + 4 + + . + . + . + +0x80000: kernel start address + +0x?????: load_kernel() +*/ + +void readcmd(char*); + +void *dtb_addr = 0; // Due to the variable is used in the assembly code, must be declared as global variable + + +void main() +{ + uart_init(); + + while(1) + { + printf("\nType load for bootloading: "); + char cmd[10]; + readcmd(cmd); + if(cmd[0] == 'l' && cmd[1] == 'o' && cmd[2] == 'a' && cmd[3] == 'd') + { + break; + } + } + + reallocate(); + asm volatile("b -131068"); // jump to same place in bootloader + // 0x20000 = 131072 + // 0x20000 - 4 = 131068 + printf("\nListening New Kernel"); + load_kernel(); + printf("\nFinished Loading"); + + asm volatile("mov %0, x20" : "=r" (dtb_addr)); + printf("\nDTB Address (Bootloader): "); + printf_hex(dtb_addr); + + // asm volatile ( + // "mov x30, 0x80000;" + // "ret" + // ); + asm volatile("blr %0" + : + : "r" (0x80000)); +} + +void readcmd(char *x) +{ + char input_char; + int input_index = 0; + x[0] = 0; + while( ((input_char = read_char()) != '\n')) + { + x[input_index] = input_char; + ++input_index; + printfc(input_char); + } + + x[input_index]=0; // null char +} diff --git a/lab07/bootloader/src/io.c b/lab07/bootloader/src/io.c new file mode 100644 index 000000000..63d0aa432 --- /dev/null +++ b/lab07/bootloader/src/io.c @@ -0,0 +1,32 @@ +#include "io.h" + +void printf(char* str) +{ + uart_send_string(str); +} + +void printfc(char c) +{ + uart_send(c); +} + +void printf_hex(unsigned int d) +{ + printf("0x"); + unsigned int td = d; + for(int i=28; i>=0; i-=4){ + int tmp = (td >> i) & 0xf; + if(tmp < 10){ + printfc('0'+tmp); + } + else{ + printfc('a'+tmp-10); + } + } +} + +char read_char() +{ + char c = uart_recv_io(); + return c; +} diff --git a/lab07/bootloader/src/linker.ld b/lab07/bootloader/src/linker.ld new file mode 100644 index 000000000..6b2ee8a0e --- /dev/null +++ b/lab07/bootloader/src/linker.ld @@ -0,0 +1,22 @@ +SECTIONS +{ + . = 0x80000; + .text : + { + KEEP(*(.text.boot)) + *(.text) + } + .rodata :{ *(.rodata) } + .data : { *(.data) } + .bss : + { + . = ALIGN(0x8); + __bss_start = .; + *(.bss) + . = ALIGN(0x8); + __bss_end = .; + } + . = ALIGN(0x8); + _end = .; +} +__bss_size = (__bss_end - __bss_start)>>3; \ No newline at end of file diff --git a/lab07/bootloader/src/mini_uart.c b/lab07/bootloader/src/mini_uart.c new file mode 100644 index 000000000..2c4d3c00f --- /dev/null +++ b/lab07/bootloader/src/mini_uart.c @@ -0,0 +1,69 @@ +#include "gpio.h" +#include "mini_uart.h" + +void uart_init() +{ + // set the alternate function for GPIO14 and GPIO15 + unsigned int selector; + selector = *GPFSEL1; + selector &= ~(7<<12); // size gpio14 to 0 for gpio14 is bits 12-14 + selector |= 2<<12; // set to alt5 for gpio14 + selector &= ~(7<<15); // size gpio15 to 0 for gpio15 is bits 15-17 + selector |= 2<<15; // set to alt5 for gpio15 + *GPFSEL1 = selector; + + // GPIO initilaization + *GPPUD = 0; // disable pull up/down for all GPIO pins + unsigned int i = 150; + while(i--) asm volatile("nop"); + *GPPUDCLK0 = (1<<14) | (1<<15); // enable clock for gpio14 and gpio15 + i = 150; + while(i--) asm volatile("nop"); + *GPPUDCLK0 = 0; // disable clock for gpio14 and gpio15 + + // initialize mini uart + *AUX_ENABLES = 1; //Enable mini uart (this also enables access to its registers) + *AUX_MU_CNTL_REG = 0; //Disable auto flow control and disable receiver and transmitter (for now) + *AUX_MU_IER_REG = 0; //Disable receive and transmit interrupts + *AUX_MU_LCR_REG = 3; //Enable 8 bit mode + *AUX_MU_MCR_REG = 0; //Set RTS line to be always high + *AUX_MU_BAUD_REG = 270; // 115200 baud + *AUX_MU_CNTL_REG = 3; //Finally, enable transmitter and receiver +} + +char uart_recv() +{ + char r; + // bit 0 == 1, if receiver holds valid byte + do{asm volatile("nop");}while(!(*AUX_MU_LSR_REG & 0x01)); + return *AUX_MU_IO_REG; + // return r == '\r'?'\n':r; + +} + +char uart_recv_io() +{ + char r; + do{asm volatile("nop");}while(!(*AUX_MU_LSR_REG & 0x01)); + r = *AUX_MU_IO_REG; + return r == '\r'?'\n':r; +} + +void uart_send(char c) +{ + // bit 6 == 1, if transmitter is empty + while (1) { + if ((*AUX_MU_LSR_REG)&0x20) break; + } + *AUX_MU_IO_REG = c; + +} + +void uart_send_string(const char* str) +{ + while(*str){ + if(*str == '\n') + uart_send('\r'); + uart_send(*str++); + } +} \ No newline at end of file diff --git a/lab07/bootloader/src/type.c b/lab07/bootloader/src/type.c new file mode 100644 index 000000000..a521f5fdd --- /dev/null +++ b/lab07/bootloader/src/type.c @@ -0,0 +1 @@ +#include "type.h" diff --git a/lab07/initramfs.cpio b/lab07/initramfs.cpio new file mode 100644 index 0000000000000000000000000000000000000000..0676fb1584617bc4d73624b3b212a12133e97d8e GIT binary patch literal 247296 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 list of areas in physical memory which are reserved + |-------------------| + | free space | + |-------------------| + | structure block | + |-------------------| + | free space | + |-------------------| + | strings block | + |-------------------| + | free space | + |-------------------| +*/ + +/* All the header fields are 32-bit integers, stored in big-endian format. */ +typedef struct fdt_header { + uint32_t magic; + uint32_t totalsize; // total size of DT block + uint32_t off_dt_struct; // offset to the structure block + uint32_t off_dt_strings; // offset to the strings block + uint32_t off_mem_rsvmap; // offset to the memory reservation block + uint32_t version; + uint32_t last_comp_version; + uint32_t boot_cpuid_phys; // physical address of the boot CPU + uint32_t size_dt_strings; // size of the strings block + uint32_t size_dt_struct; // size of the structure block +} fdt_header; + + +/* + Memory reservation block + Composed of sequence of tokens with data shown below. + Each token in the structure block, and thus the structure block itself, + shall be loacted at a 4-byte aligned offset from the beginning of the devicetree blob. + + Five tokens types: (32-bit big-endian integers) + 1. FDT_BEGIN_NODE (0x00000001) be followed by the node's uint name as extra data + 2. FDT_END_NODE (0x00000002) + 3. FDT_PROP (0x00000003) + 4. FDT_NOP (0x00000004) + 5. FDT_END (0x00000009) + + FDT_BEGIN_NODE -> ... -> FDT_END_NODE + + - (Optional) Any number of FDT_NOP tokens + - FDT_BEGIN_NODE + - The node’s name as a null-terminated string + - [zeroed padding bytes to align to a 4-byte boundary] + - For each property of the node + - (Optional) Any number of FDT_NOP tokens + - FDT_PROP token + * property infomation + * aligned to a 4-byte boundary +*/ + +/* + The strings block contains strings representing all the property names used in the tree. +*/ + + +/* 32-bit big-endian integers */ +typedef struct fdt_prop { + uint32_t len; // length of the property value + uint32_t nameoff; // offset into the strings block for the property name +} fdt_prop; + +void fdt_traverse(void(*callback_func)(char*, char*, fdt_prop*)); +uint32_t endian_swap(uint32_t value); + +#endif \ No newline at end of file diff --git a/lab07/kernel/include/entry.h b/lab07/kernel/include/entry.h new file mode 100644 index 000000000..872bec449 --- /dev/null +++ b/lab07/kernel/include/entry.h @@ -0,0 +1,30 @@ +#ifndef _ENTRY_H__ +#define _ENTRY_H__ + + +#define SYNC_INVALID_EL1t 0 +#define IRQ_INVALID_EL1t 1 +#define FIQ_INVALID_EL1t 2 +#define ERROR_INVALID_EL1t 3 + +#define SYNC_INVALID_EL1h 4 +#define IRQ_INVALID_EL1h 5 +#define FIQ_INVALID_EL1h 6 +#define ERROR_INVALID_EL1h 7 + +#define SYNC_INVALID_EL0_64 8 +#define IRQ_INVALID_EL0_64 9 +#define FIQ_INVALID_EL0_64 10 +#define ERROR_INVALID_EL0_64 11 + +#define SYNC_INVALID_EL0_32 12 +#define IRQ_INVALID_EL0_32 13 +#define FIQ_INVALID_EL0_32 14 +#define ERROR_INVALID_EL0_32 15 + +#define SYNC_ERROR 16 +#define SYSCALL_ERROR 17 + +#define S_X0 0 + +#endif \ No newline at end of file diff --git a/lab07/kernel/include/errno.h b/lab07/kernel/include/errno.h new file mode 100644 index 000000000..8f4fbd285 --- /dev/null +++ b/lab07/kernel/include/errno.h @@ -0,0 +1,9 @@ +#ifndef __ERRNO_H__ +#define __ERRNO_H__ + +#define RERROR -1 +#define WERROR -1 +#define CERROR -1 +#define LERROR -1 + +#endif \ No newline at end of file diff --git a/lab07/kernel/include/fork.h b/lab07/kernel/include/fork.h new file mode 100644 index 000000000..c85fc4cb1 --- /dev/null +++ b/lab07/kernel/include/fork.h @@ -0,0 +1,26 @@ +#ifndef __FORK_H__ +#define __FORK_H__ + +// int copy_process(unsigned long fn, unsigned long arg); +#include "schedule.h" + +int copy_process( + unsigned long flags, + unsigned long fn, + unsigned long arg, + unsigned long stack); +int move_to_user_mode(unsigned long pc); + +struct pt_regs { + unsigned long regs[31]; + unsigned long sp; + unsigned long pc; + unsigned long pstate; +}; + +struct pt_regs * task_pt_regs(struct task_struct *tsk); +void kp_user_mode(unsigned long func); + +#define PSR_MODE_EL0t 0x00000000; + +#endif \ No newline at end of file diff --git a/lab07/kernel/include/io.h b/lab07/kernel/include/io.h new file mode 100644 index 000000000..d1e5333e5 --- /dev/null +++ b/lab07/kernel/include/io.h @@ -0,0 +1,14 @@ +#ifndef __IO_H__ +#define __IO_H__ + +#include "mini_uart.h" + +void printf(const char* str); +void printfc(const char c); +void printf_hex(const unsigned int d); +void printf_int(const int d); +char read_char(); + +#define debug() printf("\r\n [DEBUG] : "); printf(__FILE__); printf(" : "); printf_int(__LINE__) + +#endif \ No newline at end of file diff --git a/lab07/kernel/include/irq.h b/lab07/kernel/include/irq.h new file mode 100644 index 000000000..21f2fd7f1 --- /dev/null +++ b/lab07/kernel/include/irq.h @@ -0,0 +1,12 @@ +#ifndef __IRQ_H__ +#define __IRQ_H__ + +#define EL1_IRQ_TIMER_PRIORITY 0x1 +#define EL1_IRQ_UART_PRIORITY 0x2 + +struct irq_task_struct; + +void task_head_init(); +void test_func(); + +#endif \ No newline at end of file diff --git a/lab07/kernel/include/lib.h b/lab07/kernel/include/lib.h new file mode 100644 index 000000000..cb370038c --- /dev/null +++ b/lab07/kernel/include/lib.h @@ -0,0 +1,12 @@ +#ifndef __LIB_H__ +#define __LIB_H__ + +#include "type.h" + +uint32_t strtol(const char *sptr, uint32_t base, int size); +uint64_t atoi(const char *str); +uint64_t atoi_hex(const char *str); +uint64_t pow(int base, int exp); +void assert(int condition, char* message); + +#endif \ No newline at end of file diff --git a/lab07/kernel/include/mailbox.h b/lab07/kernel/include/mailbox.h new file mode 100644 index 000000000..694bd6d19 --- /dev/null +++ b/lab07/kernel/include/mailbox.h @@ -0,0 +1,8 @@ +#ifndef __MAIULBOX_H__ +#define __MAILBOX_H__ + +void get_board_revision(); +void get_memory_info(); +void mailbox_call(unsigned int *mailbox); + +#endif \ No newline at end of file diff --git a/lab07/kernel/include/mem.h b/lab07/kernel/include/mem.h new file mode 100644 index 000000000..f355738b4 --- /dev/null +++ b/lab07/kernel/include/mem.h @@ -0,0 +1,31 @@ +#ifndef __MEM_H__ +#define __MEM_H__ + +#include "type.h" + +extern uint64_t _heap_start; + +#define HEAP_END (uint64_t)(&_heap_start + 0x100000) + +#define USER_PROCESS_SP 0x200000 +#define USER_START_ADDR 0x100000 + + +// malloc +#define FRAME_SIZE 4096 // 4KB +// #define MAX_LEVEL 16 +#define MAX_LEVEL 18 // log_2(FRAME_NUM) about 17.~ + +// #define MALLOC_START_ADDR 0x10000000 +// #define MALLOC_END_ADDR 0x20000000 +#define MALLOC_START_ADDR 0x00000000 +#define MALLOC_END_ADDR 0x3C000000 +#define MALLOC_TOTAL_SIZE (MALLOC_END_ADDR - MALLOC_START_ADDR) +#define FRAME_NUM MALLOC_TOTAL_SIZE / FRAME_SIZE + +#define MAX_BUDDY_SYSTEM_LIST 10 + +#define MEMORY_POOL_SIZE 4 +#define MEMORY_POOL_DEPTH 4 + +#endif \ No newline at end of file diff --git a/lab07/kernel/include/mini_uart.h b/lab07/kernel/include/mini_uart.h new file mode 100644 index 000000000..eed952d7b --- /dev/null +++ b/lab07/kernel/include/mini_uart.h @@ -0,0 +1,26 @@ +#ifndef _MINI_UART_H +#define _MINI_UART_H + +#define BUFF_SIZE 256 + +void uart_init(); +char uart_recv(); +void uart_send(const char c); +void uart_send_string(const char* str); + +void enable_uart_interrupt(); +void disable_uart_interrupt(); +void enable_uart_recv_interrupt(); +void disable_uart_recv_interrupt(); +void enable_uart_trans_interrupt(); +void disable_uart_trans_interrupt(); + +void uart_buff_init(); + +void async_uart_puts(char* buff); +int async_uart_gets(char* buff, int size); + +void async_uart_read_handler(); +void async_uart_write_handler(); + +#endif \ No newline at end of file diff --git a/lab07/kernel/include/mm.h b/lab07/kernel/include/mm.h new file mode 100644 index 000000000..d97596341 --- /dev/null +++ b/lab07/kernel/include/mm.h @@ -0,0 +1,6 @@ +#ifndef __MM_H__ +#define __MM_H__ + +void memzero_asm(unsigned long src, unsigned long n); + +#endif \ No newline at end of file diff --git a/lab07/kernel/include/peripherals/base.h b/lab07/kernel/include/peripherals/base.h new file mode 100644 index 000000000..1d3265580 --- /dev/null +++ b/lab07/kernel/include/peripherals/base.h @@ -0,0 +1,6 @@ +#ifndef __PERIPHERALS_BASE_H__ +#define __PERIPHERALS_BASE_H__ + +#define MMIO_BASE 0x3F000000 + +#endif \ No newline at end of file diff --git a/lab07/kernel/include/peripherals/gpio.h b/lab07/kernel/include/peripherals/gpio.h new file mode 100644 index 000000000..b6a104ab3 --- /dev/null +++ b/lab07/kernel/include/peripherals/gpio.h @@ -0,0 +1,12 @@ +#ifndef _GPIO_H +#define _GPIO_H + +#include "peripherals/base.h" + +#define GPFSEL1 ((volatile unsigned int*)(MMIO_BASE+0x00200004)) +#define GPSET0 ((volatile unsigned int*)(MMIO_BASE+0x0020001C)) +#define GPCLR0 ((volatile unsigned int*)(MMIO_BASE+0x00200028)) +#define GPPUD ((volatile unsigned int*)(MMIO_BASE+0x00200094)) +#define GPPUDCLK0 ((volatile unsigned int*)(MMIO_BASE+0x00200098)) + +#endif \ No newline at end of file diff --git a/lab07/kernel/include/peripherals/irq.h b/lab07/kernel/include/peripherals/irq.h new file mode 100644 index 000000000..54672e0f5 --- /dev/null +++ b/lab07/kernel/include/peripherals/irq.h @@ -0,0 +1,29 @@ +#ifndef __PERIPHERALS_IRQ_H__ +#define __PERIPHERALS_IRQ_H__ + +#include "peripherals/base.h" + +// BCM2835 page. 112-116 +#define IRQ_BASIC_PENDING ((volatile unsigned int*)(MMIO_BASE+0x0000B200)) +#define IRQ_PENDING_1 ((volatile unsigned int*)(MMIO_BASE+0x0000B204)) // Holds All interrupts 0...31 from the GPU side. +#define IRQ_PENDING_2 ((volatile unsigned int*)(MMIO_BASE+0x0000B208)) // 32...63 +#define FIQ_CONTROL ((volatile unsigned int*)(MMIO_BASE+0x0000B20C)) +#define ENABLE_IRQS_1 ((volatile unsigned int*)(MMIO_BASE+0x0000B210)) // Writing a 1 to a bit will set the corresponding IRQ enable bit. (0-31) +#define ENABLE_IRQS_2 ((volatile unsigned int*)(MMIO_BASE+0x0000B214)) // (32-63) +#define ENABLE_BASIC_IRQS ((volatile unsigned int*)(MMIO_BASE+0x0000B218)) +#define DISABLE_IRQS_1 ((volatile unsigned int*)(MMIO_BASE+0x0000B21C)) +#define DISABLE_IRQS_2 ((volatile unsigned int*)(MMIO_BASE+0x0000B220)) +#define DISABLE_BASIC_IRQS ((volatile unsigned int*)(MMIO_BASE+0x0000B224)) // AUX interrupt. 29 + +#define AUX_INT (1 << 29) + +// QA7 page. 16 +#define CORE0_IRQ_SOURCE ((volatile unsigned int*)(0x40000060)) // Get the IRQ source for the core 0. + +#define SYSTEM_TIMER_IRQ_1 (1 << 1) +#define GPU_IRQ (1 << 8) + +#define ESR_ELx_EC_SHIFT 26 +#define ESR_ELx_EC_SVC64 0x15 + +#endif \ No newline at end of file diff --git a/lab07/kernel/include/peripherals/mailbox.h b/lab07/kernel/include/peripherals/mailbox.h new file mode 100644 index 000000000..7e9e5c2c7 --- /dev/null +++ b/lab07/kernel/include/peripherals/mailbox.h @@ -0,0 +1,23 @@ +#ifndef __PERIPHERALS_MAILBOX_H__ +#define __PERIPHERALS_MAILBOX_H__ + +#include "peripherals/base.h" + +#define MAILBOX_BASE MMIO_BASE + 0xb880 + +#define MAILBOX_READ ((volatile unsigned int*)(MAILBOX_BASE )) // M0: CPU read from GPU +#define MAILBOX_STATUS ((volatile unsigned int*)(MAILBOX_BASE + 0x18)) // M0: Check GPU statue +#define MAILBOX_WRITE ((volatile unsigned int*)(MAILBOX_BASE + 0x20)) // M1: CPU write to GPU + +#define MAILBOX_EMPTY 0x40000000 +#define MAILBOX_FULL 0x80000000 + +#define GET_BOARD_REVISION 0x00010002 +#define GET_ARM_MEMORY 0x00010005 +#define REQUEST_CODE 0x00000000 +#define REQUEST_SUCCEED 0x80000000 +#define REQUEST_FAILED 0x80000001 +#define TAG_REQUEST_CODE 0x00000000 +#define END_TAG 0x00000000 + +#endif \ No newline at end of file diff --git a/lab07/kernel/include/peripherals/mini_uart.h b/lab07/kernel/include/peripherals/mini_uart.h new file mode 100644 index 000000000..bb55ba2fe --- /dev/null +++ b/lab07/kernel/include/peripherals/mini_uart.h @@ -0,0 +1,26 @@ +#ifndef __PERIPHERALS_MINI_UART_H__ +#define __PERIPHERALS_MINI_UART_H__ + +#include "peripherals/base.h" + +#define AUX_ENABLES ((volatile unsigned int*)(MMIO_BASE+0x00215004)) +#define AUX_MU_IO_REG ((volatile unsigned int*)(MMIO_BASE+0x00215040)) +#define AUX_MU_IER_REG ((volatile unsigned int*)(MMIO_BASE+0x00215044)) // Interrupt Enable Register (BCM2835 page. 12) +#define AUX_MU_IIR_REG ((volatile unsigned int*)(MMIO_BASE+0x00215048)) // Shows the interrupt status. (BCM2835 page. 13) +#define AUX_MU_LCR_REG ((volatile unsigned int*)(MMIO_BASE+0x0021504C)) +#define AUX_MU_MCR_REG ((volatile unsigned int*)(MMIO_BASE+0x00215050)) +#define AUX_MU_LSR_REG ((volatile unsigned int*)(MMIO_BASE+0x00215054)) +#define AUX_MU_MSR_REG ((volatile unsigned int*)(MMIO_BASE+0x00215058)) +#define AUX_MU_SCRATCH ((volatile unsigned int*)(MMIO_BASE+0x0021505C)) +#define AUX_MU_CNTL_REG ((volatile unsigned int*)(MMIO_BASE+0x00215060)) +#define AUX_MU_STAT_REG ((volatile unsigned int*)(MMIO_BASE+0x00215064)) +#define AUX_MU_BAUD_REG ((volatile unsigned int*)(MMIO_BASE+0x00215068)) + + +#define ENABLE_RCV_IRQ (1 << 0) +#define ENABLE_TRANS_IRQ (1 << 1) + +#define AUX_MU_IIR_REG_READ (1 << 2) +#define AUX_MU_IIR_REG_WRITE (1 << 1) + +#endif \ No newline at end of file diff --git a/lab07/kernel/include/reboot.h b/lab07/kernel/include/reboot.h new file mode 100644 index 000000000..e47678792 --- /dev/null +++ b/lab07/kernel/include/reboot.h @@ -0,0 +1,8 @@ +#ifndef __REBOOT_H__ +#define __REBOOT_H__ + +void set(long addr, unsigned int value); +void reset(int tick); +void cancel_reset(); + +#endif \ No newline at end of file diff --git a/lab07/kernel/include/schedule.h b/lab07/kernel/include/schedule.h new file mode 100644 index 000000000..dd35ba820 --- /dev/null +++ b/lab07/kernel/include/schedule.h @@ -0,0 +1,71 @@ +#ifndef __SCHEDULE_H__ +#define __SCHEDULE_H__ + +#define THREAD_CPU_CONTEXT 0 // offset of cpu_context in task_struct + + +#ifndef __ASSEMBLER__ + +#define THREAD_SIZE 4096 + +#define NR_TASKS 64 + +#define FIRST_TASK task[0] +#define LAST_TASK task[NR_TASKS-1] + +#define TASK_RUNNING 0 +#define TASK_ZOMBIE 1 +#define TASK_STOPPED 2 + +#define PF_KTHREAD 2 + +extern struct task_struct *current; +extern struct task_struct * task[NR_TASKS]; +extern int nr_tasks; + +struct cpu_context { + unsigned long long x19; + unsigned long long x20; + unsigned long long x21; + unsigned long long x22; + unsigned long long x23; + unsigned long long x24; + unsigned long long x25; + unsigned long long x26; + unsigned long long x27; + unsigned long long x28; + unsigned long long fp; // x29 + unsigned long long sp; + unsigned long long pc; // x30 +}; + +struct task_struct { + struct cpu_context cpu_context; + long state; + long counter; + long priority; + long preempt_count; + unsigned long stack; + unsigned long flags; + int pid; +}; + +extern void sched_init(void); +extern void schedule(void); +extern void timer_tick(void); +extern void preempt_disable(void); +extern void preempt_enable(void); +extern void switch_to(struct task_struct* next); +extern void cpu_switch_to(struct task_struct* prev, struct task_struct* next); +extern void enable_irq(void); +extern void disable_irq(void); +extern void kill_zombies(void); +extern void exit_process(void); + +#define INIT_TASK \ +/*cpu_context*/ { {0,0,0,0,0,0,0,0,0,0,0,0,0}, \ +/* state etc */ 0,0,1, 0, 0, PF_KTHREAD, 0\ +} + +#endif +#endif \ No newline at end of file diff --git a/lab07/kernel/include/shell.h b/lab07/kernel/include/shell.h new file mode 100644 index 000000000..cf6dd6e14 --- /dev/null +++ b/lab07/kernel/include/shell.h @@ -0,0 +1,12 @@ +#ifndef __SHELL_H__ +#define __SHELL_H__ + +typedef struct cmd { + char *name; + void (*func)(int argc, char *argv[]); + char help_msg[100]; +} cmd; + +void readcmd(char [256]); +void shell_loop(); +#endif \ No newline at end of file diff --git a/lab07/kernel/include/string.h b/lab07/kernel/include/string.h new file mode 100644 index 000000000..edf5814b4 --- /dev/null +++ b/lab07/kernel/include/string.h @@ -0,0 +1,12 @@ +#ifndef __STRING_H__ +#define __STRING_H__ + +#include "type.h" + +int strcmp(const char *str1, const char *str2); +char* strcpy(char* dest, const char* src); +char* strncpy(char* dest, const char* src, int n); +uint32_t strlen(const char* str); +char *strtok(char* str, const char* delim); + +#endif \ No newline at end of file diff --git a/lab07/kernel/include/sys.h b/lab07/kernel/include/sys.h new file mode 100644 index 000000000..5a26dde92 --- /dev/null +++ b/lab07/kernel/include/sys.h @@ -0,0 +1,52 @@ +#ifndef __SYS_H__ +#define __SYS_H__ + +#define __NR_syscalls 18 + +#define SYS_GETPID_NUM 0 // syscall number +#define SYS_UARTREAD_NUM 1 +#define SYS_UARTWRITE_NUM 2 +#define SYS_EXEC_NUM 3 +#define SYS_FORK_NUM 4 +#define SYS_EXIT_NUM 5 +#define SYS_MBOX_CALL_NUM 6 +#define SYS_KILL_NUM 7 + + +#define SYS_OPEN_NUM 11 +#define SYS_CLOSE_NUM 12 +#define SYS_WRITE_NUM 13 +#define SYS_READ_NUM 14 +#define SYS_MKDIR_NUM 15 +#define SYS_MOUNT_NUM 16 +#define SYS_CHDIR_NUM 17 + +#ifndef __ASSEMBLER__ + +#include "type.h" + +int sys_getpid(); +size_t sys_uartread(char buf[], size_t size); +size_t sys_uartwrite(const char buf[], size_t size); +int sys_exec(const char *name, char *const argv[]); +int sys_fork(); +void sys_exit(int status); +int sys_mbox_call(unsigned char ch, unsigned int *mbox); +void sys_kill(int pid); + +// lab7 +int sys_open(const char *pathname, int flags); +int sys_close(int fd); +long sys_write(int fd, const void *buf, unsigned long count); +long sys_read(int fd, void *buf, unsigned long count); + +// you can ignore mode, since there is no access control +int sys_mkdir(const char *pathname, unsigned mode); + +// you can ignore arguments other than target (where to mount) and filesystem (fs name) +int sys_mount(const char *src, const char *target, const char *filesystem, unsigned long flags, const void *data); +int sys_chdir(const char *path); + +#endif + +#endif \ No newline at end of file diff --git a/lab07/kernel/include/timer.h b/lab07/kernel/include/timer.h new file mode 100644 index 000000000..7591b62d0 --- /dev/null +++ b/lab07/kernel/include/timer.h @@ -0,0 +1,14 @@ +#ifndef __TIMER_H__ +#define __TIMER_H__ + +extern void core_timer_enable(); +extern void core_timer_disable(); +extern unsigned long long get_cpu_cycles(); +extern unsigned int get_cpu_freq(); +extern void set_timer_asm(unsigned int sec); + +void timer_init(); +void irq_timer_handler(); +void set_timer(unsigned int sec); + +#endif \ No newline at end of file diff --git a/lab07/kernel/include/tmpfs.h b/lab07/kernel/include/tmpfs.h new file mode 100644 index 000000000..2ed05d345 --- /dev/null +++ b/lab07/kernel/include/tmpfs.h @@ -0,0 +1,31 @@ +#ifndef __TMPFS_H__ +#define __TMPFS_H__ + +#define COMPONENT_SIZE 15 +#define ENTRIES_PER_DIR 16 +#define TMPFS_MAX_FILE 4096 + +#include "vfs.h" + +struct tmpfs_internal { + char* name; // file name or directory name + unsigned long size; + char* data; + int type; // DIR_NODE or FILE_NODE + // struct vnode* parent; + struct vnode* children[ENTRIES_PER_DIR]; + // struct vnode* next; +}; + +int tmpfs_list(struct vnode* dir_node); +int tmpfs_lookup(struct vnode* dir_node, struct vnode** target, const char* component_name); +int tmpfs_mkdir(struct vnode* dir_node, struct vnode** target, const char* component_name); +int tmpfs_create(struct vnode* dir_node, struct vnode** target, const char* component_name); +int tmpfs_close(struct file* file); +int tmpfs_open(struct vnode* file_node, struct file** target); +int tmpfs_read(struct file* file, void* buf, size_t len); +int tmpfs_write(struct file* file, const void* buf, size_t len); +int tmpfs_setup_mount(struct filesystem* fs, struct mount* mount); +int tmpfs_register(); + +#endif \ No newline at end of file diff --git a/lab07/kernel/include/type.h b/lab07/kernel/include/type.h new file mode 100644 index 000000000..91acd4bd5 --- /dev/null +++ b/lab07/kernel/include/type.h @@ -0,0 +1,13 @@ +#ifndef __TYPE_H__ +#define __TYPE_H__ + +typedef unsigned char uint8_t; +typedef unsigned short uint16_t; +typedef unsigned int uint32_t; +typedef unsigned long long uint64_t; + +typedef unsigned long long size_t; + +#define NULL (void*)0 + +#endif diff --git a/lab07/kernel/include/vfs.h b/lab07/kernel/include/vfs.h new file mode 100644 index 000000000..69b83e3ac --- /dev/null +++ b/lab07/kernel/include/vfs.h @@ -0,0 +1,73 @@ +#ifndef _VFS_H__ +#define _VFS_H__ + +#include "type.h" + +#define DIR_NODE 0 +#define FILE_NODE 1 + +#define MAX_FILESYSTEM 16 +#define MAX_OPEN_FILE 16 +#define OFFSET_FD 3 // 0, 1, 2 are reserved for stdin, stdout, stderr +#define O_CREAT 00000100 + +struct vnode { + struct vnode* parent; + struct mount* mount; + struct vnode_operations* v_ops; + struct file_operations* f_ops; + void* internal; +}; + +// file handle +struct file { + struct vnode* vnode; + size_t f_pos; // RW position of this file handle + struct file_operations* f_ops; + int flags; +}; + +struct mount { + struct vnode* root; + struct filesystem* fs; +}; + +struct filesystem { + char* name; + int (*setup_mount)(struct filesystem* fs, struct mount* mount); +}; + +struct file_operations { + int (*write)(struct file* file, const void* buf, size_t len); + int (*read)(struct file* file, void* buf, size_t len); + int (*open)(struct vnode* file_node, struct file** target); + int (*close)(struct file* file); + // long lseek64(struct file* file, long offset, int whence); +}; + +struct vnode_operations { + int (*lookup)(struct vnode* dir_node, struct vnode** target, + const char* component_name); + int (*create)(struct vnode* dir_node, struct vnode** target, + const char* component_name); + int (*mkdir)(struct vnode* dir_node, struct vnode** target, + const char* component_name); + int (*list)(struct vnode* dir_node); +}; + +struct vnode* vfs_get_node(const char* pathname, struct vnode** target_dir); +int register_filesystem(struct filesystem* fs); +int vfs_open(const char* pathname, int flags, struct file** target); +int vfs_close(struct file* file); +int vfs_write(struct file* file, const void* buf, size_t len); +int vfs_read(struct file* file, void* buf, size_t len); +int vfs_mkdir(const char* pathname); +int vfs_mount(const char* target, const char* filesystem); +int vfs_lookup(const char* pathname, struct vnode** target); +int vfs_list(const char* pathname); + +extern struct mount* rootfs; +extern struct filesystem global_fs[MAX_FILESYSTEM]; +extern struct file_descriptor_table global_fd_table; + +#endif \ No newline at end of file diff --git a/lab07/kernel/include/video.h b/lab07/kernel/include/video.h new file mode 100644 index 000000000..6d4dde4fb --- /dev/null +++ b/lab07/kernel/include/video.h @@ -0,0 +1,6 @@ +#ifndef __VIDEO_H__ +#define __VIDEO_H__ + +void start_video(); + +#endif \ No newline at end of file diff --git a/lab07/kernel/src/alloc.c b/lab07/kernel/src/alloc.c new file mode 100644 index 000000000..747ba6ffe --- /dev/null +++ b/lab07/kernel/src/alloc.c @@ -0,0 +1,714 @@ +#include "alloc.h" +#include "mem.h" +#include "io.h" +#include "lib.h" + +#define UNUSED(x) (void)(x) + +static char* HEAP_HEADER; +static char* HEAP_REAR; + +void mem_init() +{ + HEAP_HEADER = (char*)&_heap_start; + HEAP_REAR = HEAP_HEADER; +} + +void* simple_malloc(uint32_t size) +{ + if((void*)HEAP_REAR + size > (void*)HEAP_END){ + + return (char*)0; + } + char* ret = HEAP_REAR; + HEAP_REAR += size; + return ret; +} + +// ========================================== + +static uint64_t pow_2(uint32_t n); + +extern uint64_t _kernel_end; +static uint64_t* _kernel_end_ptr = &_kernel_end; +static uint64_t* _heap_start_ptr = &_heap_start; + +#ifndef QEMU +extern uint64_t CPIO_START_ADDR_FROM_DT; +extern uint64_t CPIO_END_ADDR_FROM_DT; +#endif + +struct frame_t{ + struct frame_t* next; + struct frame_t* prev; // [TODO] maintain prev pointer + uint32_t index; + uint8_t level; + uint8_t status; +}; + +struct flist_t{ + struct frame_t* head; +}; + +struct buddy_system_list_t{ + void* base_addr; + uint32_t index; + uint8_t max_level; +}; + +struct memory_pool_t{ + uint8_t frame_used; + uint8_t chunk_used; + uint32_t size; + uint32_t chunk_per_frame; + uint32_t chunk_offset; // use to get the offset of chunk in a frame + struct chunk_t* free_chunk; + void *frame_base_addrs[MEMORY_POOL_DEPTH]; +}; + +struct chunk_t{ + struct chunk_t* next; + struct chunk_t* prev; +}; + +static struct frame_t frame_arr[FRAME_NUM]; +static struct flist_t flist_arr[MAX_LEVEL + 1]; +static struct memory_pool_t memory_pools[MEMORY_POOL_SIZE]; +static struct buddy_system_list_t buddy_system_list[MAX_BUDDY_SYSTEM_LIST]; + +#define FREE 0 +#define ALLOCATED 1 +#define LARGE_CONTIGUOUS 2 +#define RESERVED 3 + + +static void add_to_flist(struct flist_t* flist, struct frame_t* frame) +{ + struct frame_t *curr = flist->head; + while(curr) + { + if(curr->next)curr = curr->next; + else break; + } + if(curr) curr->next = frame; + else + { + // printf("\r\n[SYSTEM INFO] Add Frame: "); printf_int(frame->index); printf(" to Level: "); printf_int(frame->level); + flist->head = frame; + // printf("\r\n[SYSTEM INFO] Frame status: "); printf_int(frame->status); + } +#ifdef DEBUG + printf("\r\n[DEBUG] Leave add_to_flist"); +#endif +} + +static void remove_from_flist(struct flist_t* flist, struct frame_t* frame) +{ + struct frame_t *curr = flist->head; + struct frame_t *prev = NULL; + int next_index = frame_arr[frame->index + pow_2(frame->level) - 1].next == NULL \ + ? -1 : frame_arr[frame->index + pow_2(frame->level) - 1].next->index; + frame_arr[frame->index + pow_2(frame->level) - 1].next = NULL; + while(curr) + { + if(curr == frame) + { + if(prev) prev->next = next_index == -1 ? NULL : &frame_arr[next_index]; + else flist->head = next_index == -1 ? NULL : &frame_arr[next_index]; +#ifdef DEBUG + printf("\r\n[DEBUG] Remove Frame: "); printf_int(frame->index); printf(" from flist Level: "); printf_int(frame->level); +#endif + // curr->next = NULL; + return; + } + prev = curr; + curr = curr->next; + } +#ifdef DEBUG + printf("\r\n[DEBUG ERROR] Frame Not Found in flist!"); +#endif + return; +} + +static uint64_t pow_2(uint32_t n) +{ + return 1 << n; +} + +void memory_reserve(uint64_t start, uint64_t end, char* msg) +{ +#ifdef DEBUG + printf("\r\n[SYSTEM INFO] Reserve Memory from: "); printf_hex(start); printf(" to: "); printf_hex(end); +#endif + uint32_t start_index = (start - 0) >> 12; + uint32_t end_index = (end - 0) >> 12; + +#ifdef DEBUG + printf("\r\n[SYSTEM INFO] Reserve Memory from Frame: "); printf_int(start_index); printf(" to Frame: "); printf_int(end_index); + printf(" for "); printf(msg); +#endif + if(start_index == end_index) + frame_arr[start_index].status = RESERVED; + else + for(int i=start_index; i= (uint64_t)buddy_system_list[i].base_addr) + { + return i; + } + else{ + if( addr >= (uint64_t)buddy_system_list[i].base_addr + && addr < (uint64_t)buddy_system_list[i+1].base_addr ) + { + return i; + } + } + } + return -1; +} + +void print_bslist(int argc, char* argv[]) +{ + printf("\r\n========== buddy system list =========="); + for(int i=0; ilevel = get_lower_bound_level(free_cnt); +#ifdef DEBUG + printf("\r\n[DEBUG] Free Start Frame: "); printf_int(free_start->index); + printf(", Level: "); printf_int(free_start->level); +#endif + buddy_system_list[bid].index = free_start->index; + buddy_system_list[bid].base_addr = (void*)(uint64_t)(MALLOC_START_ADDR + free_start->index * FRAME_SIZE); + buddy_system_list[bid++].max_level = free_start->level; + frame_arr[free_start->index + pow_2(free_start->level) - 1].next = NULL; + add_to_flist(&flist_arr[free_start->level], free_start); + is_free_start = 1; + free_cnt = 0; + free_start = NULL; + } + } + else{ + if(is_free_start){ + buddy_system_list[bid].base_addr = &frame_arr[i]; + frame_arr[i].status = FREE; + free_start = &frame_arr[i]; + is_free_start = 0; + free_cnt = 1; + } + else{ + frame_arr[i].status = LARGE_CONTIGUOUS; + frame_arr[i].level = 0; + free_cnt++; + } + } + if(i== FRAME_NUM-1 && is_free_start==0 && free_start != NULL){ + free_start->level = get_lower_bound_level(free_cnt); +#ifdef DEBUG + printf("\r\n[DEBUG] Free Start Frame: "); printf_int(free_start->index); + printf(", Level: "); printf_int(free_start->level); printf(" "); printf_int(free_cnt); +#endif + buddy_system_list[bid].index = free_start->index; + buddy_system_list[bid].base_addr = (void*)(uint64_t)(MALLOC_START_ADDR + free_start->index * FRAME_SIZE); + buddy_system_list[bid++].max_level = free_start->level; + frame_arr[free_start->index + pow_2(free_start->level) - 1].next = NULL; + add_to_flist(&flist_arr[free_start->level], free_start); + is_free_start = 1; + free_cnt = 0; + free_start = NULL; + } + } + +#ifdef DEBUG + int tag = 0; + printf("\r\n[SYSTEM INFO] Buddy System List (Start Frame, base_addr, max_level): \n"); +#endif + for(int i=0; i "); +#endif + if(buddy_system_list[i].base_addr == NULL) break; +#ifdef DEBUG + printf("( "); printf_int(buddy_system_list[i].index); printf(", "); + printf_hex((uint64_t)buddy_system_list[i].base_addr); printf(", "); + printf_int(buddy_system_list[i].max_level); printf(" )"); + tag = 1; +#endif + } +} + +void print_flist(int argc, char* argv[]) +{ + printf("\r\n========== free list =========="); + for(int i=0; i<=MAX_LEVEL; i++) + { +#ifdef DEBUG + printf("\r\n[DEBUG] Level: ");printf_int(i); +#endif + struct frame_t* frame = flist_arr[i].head; + int sign = 0; + while(frame != NULL) + { + if(frame->status == FREE) + { + if(sign == 0) { printf("\r\n[SYSTEM INFO] Level: "); printf_int(i); printf(", Frame: "); } + if(sign) printf("-> "); + printf_int(frame->index); + sign = 1; + // frame = frame->next; + frame = frame_arr[frame->index + pow_2(frame->level) - 1].next; +#ifdef DEBUG + if(frame != NULL) {printf(" (expected next: "); printf_int(frame->index); printf(")");} +#endif + } + } +#ifdef DEBUG + printf("\r\n[DEBUG] Leave Level: ");printf_int(i); +#endif + } +#ifdef DEBUG + printf("\r\n[DEBUG] Leave print_flist"); +#endif +} + +void print_allocated(int argc, char* argv[]) +{ + printf("\r\n=========== allocated ==========="); + for(int i=0; inext; + } +#ifdef DEBUG + printf("\r\n[DEBUG] Allocated Frame Count: "); printf_int(cnt); printf(", Expected Count: "); printf_int(expected_cnt); + printf(" , level: "); printf_int(level); +#endif + assert(cnt == expected_cnt, "Allocated Frame Count Error!"); + i--; + } + } + printf("\n==============================="); +} + +static uint64_t round_size(uint64_t size) // return size to the nearest power of 2 +{ + uint64_t ret = 1; + while(ret < size) ret <<= 1; + return ret; +} + +static uint8_t get_level(uint32_t size) +{ + uint8_t level = 0; + for(int i=FRAME_SIZE; iindex; +#ifdef DEBUG + printf("\r\n[DEBUG] From Level: "); printf_int(from_level); + printf("\r\n[DEBUG] Start Index: "); printf_int(start_index); +#endif + remove_from_flist(&flist_arr[from_level], frame); + + while(from_level > level) // e.g. get level 4 frame, but only have level 6 frame + { + from_level--; + uint64_t level_size = pow_2(from_level); + uint32_t split_index = start_index + level_size; + + frame_arr[split_index].level = from_level; + frame_arr[split_index + level_size - 1].next = NULL; + + frame_arr[split_index].status = FREE; + // printf("\r\n[SYSTEM INFO] Split Frame: "); printf_int(split_index); printf(", Level: "); printf_int(from_level); + add_to_flist(&flist_arr[from_level], &frame_arr[split_index]); + } + frame->status = ALLOCATED; + frame->level = level; + frame_arr[start_index + pow_2(level) - 1].next = NULL; +#ifdef DEBUG + printf("\r\n[SYSTEM INFO] Allocate Frame: "); printf_int(frame->index); +#endif + ret = (void*)(uint64_t)(MALLOC_START_ADDR + start_index * FRAME_SIZE); + break; + } + } + if(ret == NULL) + { + printf("\r\n[SYSTEM ERROR] No Enough Memory!"); + } +#ifdef DEBUG + print_flist(0, NULL); + print_allocated(0, NULL); +#endif + return ret; +} + +static void* get_buddy_address(void* ptr, uint8_t level) +{ + return (void*)((uint64_t)ptr ^ (pow_2(level) * FRAME_SIZE)); +} + +static uint32_t get_buddy_index(void* ptr, uint8_t level) +{ + return ((uint64_t)get_buddy_address(ptr, level) - MALLOC_START_ADDR) >> 12; +} + +int bfree(void* ptr) +{ + uint8_t max_level = buddy_system_list[get_bid((uint64_t)ptr)].max_level; + uint32_t offset = buddy_system_list[get_bid((uint64_t)ptr)].index; + + struct frame_t* curr_frame = &frame_arr[((uint64_t)ptr - MALLOC_START_ADDR) >> 12]; + + switch(curr_frame->status) + { + case FREE: +#ifdef DEBUG + printf("\r\n[SYSTEM ERROR] Frame Already Free!"); +#endif + return 1; + case LARGE_CONTIGUOUS: +#ifdef DEBUG + printf("\r\n[SYSTEM ERROR] Frame is belong to Large Contiguous Frame!"); +#endif + return 1; + case RESERVED: +#ifdef DEBUG + printf("\r\n[SYSTEM ERROR] Frame is Reserved!"); +#endif + return 1; + default: + break; + } + + // printf("\r\n[SYSTEM INFO] Free Frame Address: "); printf_hex((uint64_t)ptr); + // buddy address = curr address ^ (block size) + struct frame_t* buddy_frame = &frame_arr[get_buddy_index((ptr-offset*FRAME_SIZE), curr_frame->level)+offset]; +#ifdef DEBUG + printf("\r\n[SYSTEM INFO] Free Frame: "); printf_int(curr_frame->index); printf(", Level: "); printf_int(curr_frame->level); + printf("\r\n[SYSTEM INFO] Buddy Frame: "); printf_int(buddy_frame->index); printf(", Level: "); printf_int(buddy_frame->level); +#endif + if(buddy_frame->status != FREE) + { +#ifdef DEBUG + printf("\r\n[SYSTEM INFO] Buddy Frame is not FREE!"); +#endif + curr_frame->status = FREE; + } + else + { +#ifdef DEBUG + printf("\r\n[SYSTEM INFO] Buddy Frame is Free!"); +#endif + } + while(buddy_frame->status == FREE && curr_frame->level < max_level) + { + curr_frame->status = FREE; +#ifdef DEBUG + printf("\r\n[SYSTEM INFO] Merge Frame:"); printf_int(curr_frame->index); printf(" and Frame: "); printf_int(buddy_frame->index); + printf(" to Level: "); printf_int(curr_frame->level + 1); +#endif + +#ifdef DEBUG + printf("\r\n[DEBUG] remove_from_flist: level: "); printf_int(buddy_frame->level); printf(" index: "); printf_int(buddy_frame->index); +#endif + remove_from_flist(&flist_arr[buddy_frame->level], buddy_frame); + + uint32_t merge_index; + if(buddy_frame->index < curr_frame->index) + { + merge_index = buddy_frame->index; + frame_arr[buddy_frame->index + pow_2(buddy_frame->level) - 1].next = curr_frame; + curr_frame->status = LARGE_CONTIGUOUS; + } + else + { + merge_index = curr_frame->index; + frame_arr[curr_frame->index + pow_2(curr_frame->level) - 1].next = buddy_frame; + buddy_frame->status = LARGE_CONTIGUOUS; + } + +#ifdef DEBUG + printf(" with head frame: "); printf_int(merge_index); +#endif + + curr_frame = &frame_arr[merge_index]; + curr_frame->level++; + if(curr_frame->level == max_level) + { + break; + } + buddy_frame = &frame_arr[get_buddy_index((void*)(uint64_t)(MALLOC_START_ADDR + (merge_index-offset) * FRAME_SIZE), curr_frame->level) + offset]; +#ifdef DEBUG + printf("\r\n[SYSTEM INFO] New Frame: "); printf_int(curr_frame->index); printf(", Level: "); printf_int(curr_frame->level); + printf("\r\n[SYSTEM INFO] New Buddy Frame: "); printf_int(buddy_frame->index); printf(", Level: "); printf_int(buddy_frame->level); +#endif + } +#ifdef DEBUG + printf("\r\n[SYSTEM INFO] Add Frame:"); printf_int(curr_frame->index); printf(" to Level: "); printf_int(curr_frame->level); +#endif + add_to_flist(&flist_arr[curr_frame->level], curr_frame); + return 0; +} + +void bfree_wrapper(int argc, char *argv[]) +{ + if(argc != 2){ + printf("\nUsage: test_bfree "); + return; + } + uint64_t index = atoi(argv[1]); + if(index >= FRAME_NUM){ + printf("\nIndex out of range"); + return; + } + if(!bfree((void*)(MALLOC_START_ADDR + index * FRAME_SIZE))) + { + print_flist(0, NULL); + print_allocated(0, NULL); + } +} + +void memory_pool_init() +{ + for(int i=0; isize = size; + memory_pool->chunk_per_frame = FRAME_SIZE / size; +} + +static int get_memory_pool_id(uint64_t size) +{ + uint64_t r_size = round_size(size); + + if(r_size >= FRAME_SIZE) return -1; // larger than frame size, use general balloc + + for(int i=0; i= r_size) + { + return i; + } + else if(memory_pools[i].size == 0) + { +#ifdef DEBUG + printf("\r\n[DEBUG] Init New Memory Pool with chunk size: "); printf_int(r_size); +#endif + init_memory_pool_with_size(&memory_pools[i], r_size); + return i; + } + } + return -2; +} + +void* dynamic_alloc(uint64_t size) +{ + + int ret = get_memory_pool_id(size); + switch(ret) + { + case -1: + printf("\r\n[SYSTEM ERROR] Larger than Frame Size! Please use General balloc!"); + return 0; + case -2: + printf("\r\n[SYSTEM ERROR] No Enough Memory Pool! Please use General balloc!"); + return 0; + default: + break; + } + + struct memory_pool_t* memory_pool = &memory_pools[ret]; + + void* res = NULL; + + if(memory_pool->free_chunk != NULL) + { + res = memory_pool->free_chunk; + memory_pool->free_chunk = memory_pool->free_chunk->next; // point to the next free chunk + return res; + } + + if(memory_pool->frame_used >= MEMORY_POOL_DEPTH * memory_pool->chunk_per_frame) + { + printf("\r\n[SYSTEM ERROR] No Enough Memory Pool Frame!"); + return res; + } + + if(memory_pool->chunk_used >= memory_pool->frame_used * memory_pool->chunk_per_frame) + { + if(memory_pool->frame_used == 0) + { + printf("\r\n[SYSTEM INFO] Create First Frame for Memory Pool with size: ");printf_int(memory_pool->size); + } + else + { + printf("\r\n[SYSTEM INFO] The Frame of Memory Pool with size: ");printf_int(memory_pool->size);printf(" is Full! "); + printf("Create a New Frame!"); + } + + void* new_frame = balloc(FRAME_SIZE); + memory_pool->frame_base_addrs[memory_pool->frame_used] = new_frame; + memory_pool->frame_used++; + memory_pool->chunk_offset = 0; + } + + printf("\r\n[SYSTEM INFO] Allocate Chunk in Memory Pool with size: "); printf_int(memory_pool->size); + // printf(" in Frame: "); printf_int(((struct frame_t*)memory_pool->frame_base_addrs[memory_pool->frame_used - 1])->index); + + res = memory_pool->frame_base_addrs[memory_pool->frame_used - 1] + memory_pool->chunk_offset * memory_pool->size; + printf("\r\n[SYSTEM INFO] Allocate Chunk at address: "); printf_hex((uint64_t)res); + memory_pool->chunk_offset++; + memory_pool->chunk_used++; + + return res; +} + +int dfree(void* ptr) +{ + int memory_pool_index = -1; + for(int i=0; i>12; // 2^12 = 4096 = FRAME_SIZE + struct memory_pool_t* memory_pool = &memory_pools[memory_pool_index]; + + // check whether the chunk is already in the free chunk list + struct chunk_t* head_free_chunk = memory_pool->free_chunk; + while(head_free_chunk) + { + if(head_free_chunk == ptr) + { + printf("\r\n[SYSTEM ERROR] Chunk Already Free!"); + return 1; + } + head_free_chunk = head_free_chunk->next; + } + + printf("\r\n[SYSTEM INFO] Free Chunk in Frame: "); printf_int(frame_index); + memory_pool->chunk_used--; + struct chunk_t* last_free_chunk = memory_pool->free_chunk; + memory_pool->free_chunk = (struct chunk_t*)ptr; + memory_pool->free_chunk->next = last_free_chunk; + + printf("\r\n[SYSTEM INFO] Free Chunk at address: "); printf_hex((uint64_t)ptr); + return 0; +} \ No newline at end of file diff --git a/lab07/kernel/src/boot.S b/lab07/kernel/src/boot.S new file mode 100644 index 000000000..30d694fb6 --- /dev/null +++ b/lab07/kernel/src/boot.S @@ -0,0 +1,48 @@ +.section ".text.boot" + +.globl _start +_start: + mrs x0, mpidr_el1 + and x0, x0,#0xFF // Check processor id + cbz x0, master // if cpu_id == 0, then booting + b proc_hang // Otherwise, hang + +proc_hang: + b proc_hang + +master: + bl from_el2_to_el1 + +exception_table: + bl set_exception_vector_table + +bss_init: + adr x0, __bss_start + adr x1, __bss_size + bl memzero + + adr x1, _start + mov sp, x1 + bl main // jump to kernel_main c code + b proc_hang // should never come here + +memzero: + str xzr, [x0], #8 // xzr: a register holds zero + subs x1, x1, #8 + b.gt memzero + ret + +// adr: Load a label's relative address into the target register. + +set_exception_vector_table: + adr x0, exception_vector_table // get the base address of the exception vector table + msr vbar_el1, x0 // set the base address of the exception vector table + ret + +from_el2_to_el1: + mov x0, (1 << 31) // EL1 uses aarch64 + msr hcr_el2, x0 // msr: Status Register <-- Register (page 1924) + mov x0, 0x3c5 // EL1h (SPSel = 1) with interrupt disabled (D = 1, A = 1, I = 1, F = 1, M[3:0] = 5) + msr spsr_el2, x0 // Save the current processor's state + msr elr_el2, lr // Save the exception return address + eret // return to EL1 (use eret to return from the exception) \ No newline at end of file diff --git a/lab07/kernel/src/bootload.c b/lab07/kernel/src/bootload.c new file mode 100644 index 000000000..9c0e0ae2f --- /dev/null +++ b/lab07/kernel/src/bootload.c @@ -0,0 +1,43 @@ +#include "bootload.h" +#include "mini_uart.h" +#include "io.h" + +// uint64_t* BootHead = (uint64_t*)KernelAddr; +// uint64_t* CopyHead = (uint64_t*)BootAddr; +// uint64_t* bss_end = (uint64_t*)(&__bss_end); + +void reallocate() +{ + uint64_t* BootHead = (uint64_t*)KernelAddr; + uint64_t* CopyHead = (uint64_t*)BootAddr; + uint64_t* bss_end = (uint64_t*)(&__bss_end); + // int i = 0; + while(BootHead != bss_end){ + // printf("\n"); + // printf_hex(i); + // i++; + *CopyHead = *BootHead; + CopyHead++; + BootHead++; + } + printf("\nCopy done."); +} + +void load_kernel() +{ + unsigned int kernel_size = 0; + for(int i=0; i<4; i++){ + kernel_size <<= 8; + kernel_size |= (uart_recv() & 0xff); + } + + printf("\nKernel Size: "); + printf_hex(kernel_size); + printf("\n"); + + unsigned char* kernel = (unsigned char*)(0x80000); + unsigned char* kernel_ptr = kernel; + for(unsigned int i=0; ic_namesize, 16, 8); + int filesize = strtol(head->c_filesize, 16, 8); + + // char *filename = (void*)head + head_size; + char filename[256]; + strncpy(filename, (void*)head + head_size, namesize); + /* The above statement equal to the following: + char filename[256]; + strncpy(filename, (void*)head + head_size, namesize); + + In New ASCII format, the filename is followed by the header + */ + + if(strcmp(filename, "TRAILER!!!") == 0) break; + + printf("\r\n"); + printf(filename); + + uint32_t offset = head_size + namesize; + if(offset % 4 != 0) offset = ((offset/4 +1)*4); + if(filesize % 4 != 0) filesize = (filesize/4 +1)*4; + /* New ASCII format + header size + filename size must be multiple of 4 + filesize must be multiple of 4 + */ + + head = (void*)head + offset + filesize; + /* + Why (void*)head instead of head? + In C, when you add an integer to a pointer, + in this case, + head = head + (offset + filesize)*sizeof(cpio_newc_header) in practical. + But (offset + filesize) is the byte size, not the number of cpio_newc_header. + So, we need to cast head to void* to make it byte size. + */ + } +} + +void cpio_cat(int argc, char **argv) +{ + // printf("\nFilename: "); + // char input_filename[256]; + // readcmd(input_filename); + if(argc < 2){ + printf("\nUsage: cat "); + return; + } + char *input_filename = argv[1]; + +#ifndef QEMU + cpio_newc_header* head = (void*)(uint64_t)CPIO_START_ADDR_FROM_DT; +#else + cpio_newc_header* head = (void*)(uint64_t)CPIO_ADDR; +#endif + + uint32_t head_size = sizeof(cpio_newc_header); + + while(1) + { + int namesize = strtol(head->c_namesize, 16, 8); + int filesize = strtol(head->c_filesize, 16, 8); + + char *filename = (void*)head + head_size; + + uint32_t offset = head_size + namesize; + if(offset % 4 != 0) offset = ((offset/4 +1)*4); + + if(strcmp(filename, "TRAILER!!!") == 0){ + printf("\nFile not found"); + break; + } + else if(strcmp(filename, input_filename) == 0){ + /* The filedata is appended after filename */ + char *filedata = (void*)head + offset; + printf("\n"); + for(int i=0; i"); + return; + } + + char *input_filename = argv[1]; + +#ifndef QEMU + cpio_newc_header* head = (void*)(uint64_t)CPIO_START_ADDR_FROM_DT; +#else + cpio_newc_header* head = (void*)(uint64_t)CPIO_ADDR; +#endif + + uint32_t head_size = sizeof(cpio_newc_header); + while(1) + { + int namesize = strtol(head->c_namesize, 16, 8); + int filesize = strtol(head->c_filesize, 16, 8); + + char *filename = (void*)head + head_size; + + uint32_t offset = head_size + namesize; + if(offset % 4 != 0) offset = ((offset/4 +1)*4); + + if(strcmp(filename, "TRAILER!!!") == 0){ + printf("\nFile not found"); + break; + } + else if(strcmp(filename, input_filename) == 0){ + /* The filedata is appended after filename */ + char *filedata = (void*)head + offset; + char *user_program_addr = (void*)(uint64_t)USER_START_ADDR; + for(int i=0; ioff_dt_struct); + uint32_t dt_string_off = endian_swap(dt_header->off_dt_strings); + + void* dt_struct_addr = (void*)*DTB_ADDR + dt_struct_off; + char* dt_string_addr = (void*)*DTB_ADDR + dt_string_off; + + + printf("\nDT String Address: "); + printf_hex((uint64_t)(void*)dt_string_addr); + printf("\nDT Struct Address: "); + printf_hex((uint64_t)(void*)dt_struct_addr); + + printf("\nMagic: "); + printf_hex(endian_swap(dt_header->magic)); + if(dt_header->magic == (uint32_t)0xd00dfeed) + { + printf("Magic Failed\n"); + return; + } + + + char* node_name; + char* prop_name; + + while(1) + { + uint32_t token = endian_swap((*(uint32_t*)dt_struct_addr)); + + switch (token) + { + case FDT_BEGIN_NODE: // It shall be followed by the node’s unit name as extra data. + { + node_name = (char*)dt_struct_addr + 4; // tage size is 32bits = 4bytes + uint32_t size = strlen(node_name); // size of node name + uint32_t offset = 4 + size + 1; + + if(offset % 4 !=0) offset = ((offset/4 + 1)*4); // align to 4bytes (32bits) + dt_struct_addr = dt_struct_addr + offset; + + break; + } + case FDT_END_NODE: //This token has no extra data; so it is followed immediately by the next token + { + dt_struct_addr = dt_struct_addr + 4; break; + } + case FDT_PROP: + { + fdt_prop* prop_ptr = (fdt_prop*)(dt_struct_addr + 4); + uint32_t offset = 4 + sizeof(fdt_prop) + endian_swap(prop_ptr->len); + + if(offset % 4 != 0) offset = ((offset/4 + 1)*4); + dt_struct_addr = dt_struct_addr + offset; + + prop_name = (void*)dt_string_addr + endian_swap(prop_ptr->nameoff); + + callback_func(node_name, prop_name, prop_ptr); + + break; + } + case FDT_NOP: + { + dt_struct_addr = dt_struct_addr + 4; break; + } + case FDT_END: + { + dt_struct_addr = dt_struct_addr + 4; break; + } + default: + return; + } + } + +} + +// big endian to little endian +uint32_t endian_swap(uint32_t value) +{ + uint32_t ret = 0; + uint8_t* ptr = (void*)&value; + ret = (ptr[0] << 24) | (ptr[1] << 16) | (ptr[2] << 8) | ptr[3]; + return ret; +} + diff --git a/lab07/kernel/src/entry.S b/lab07/kernel/src/entry.S new file mode 100644 index 000000000..8d7d4fd22 --- /dev/null +++ b/lab07/kernel/src/entry.S @@ -0,0 +1,235 @@ +#include "entry.h" +#include "sys.h" +#include "peripherals/irq.h" + +.section ".text" + +.global set_exception_vector_table + + +// save general registers to stack +.macro save_all el + //bl save_all_debug + sub sp, sp, 16*17 + stp x0, x1, [sp ,16 * 0] // storing the contents of x0 and x1 to the address pointed by the stack pointer sp with an offset of 16 bytes + stp x2, x3, [sp ,16 * 1] // stp: Store Pair and it's used to store a pair of 64-bit (8-byte) registers to memory + stp x4, x5, [sp ,16 * 2] + stp x6, x7, [sp ,16 * 3] + stp x8, x9, [sp ,16 * 4] + stp x10, x11, [sp ,16 * 5] + stp x12, x13, [sp ,16 * 6] + stp x14, x15, [sp ,16 * 7] + stp x16, x17, [sp ,16 * 8] + stp x18, x19, [sp ,16 * 9] + stp x20, x21, [sp ,16 * 10] + stp x22, x23, [sp ,16 * 11] + stp x24, x25, [sp ,16 * 12] + stp x26, x27, [sp ,16 * 13] + stp x28, x29, [sp ,16 * 14] + + .if \el == 0 // using two distinct stack pointers for EL0 and EL1 + mrs x21, sp_el0 + .else + add x21, sp, 16*17 // using the same stack pointer for EL1 & sp will be switched by the cpu_switch_to function + .endif + + mrs x22, elr_el1 + mrs x23, spsr_el1 + + stp x30, x21, [sp ,16 * 15] + stp x22, x23, [sp ,16 * 16] +.endm + +// load general registers from stack +.macro load_all el + //bl load_all_debug + ldp x22, x23, [sp ,16 * 16] + ldp x30, x21, [sp ,16 * 15] + + .if \el == 0 + msr sp_el0, x21 + .endif + + msr elr_el1, x22 + msr spsr_el1, x23 + + ldp x0, x1, [sp ,16 * 0] + ldp x2, x3, [sp ,16 * 1] + ldp x4, x5, [sp ,16 * 2] + ldp x6, x7, [sp ,16 * 3] + ldp x8, x9, [sp ,16 * 4] + ldp x10, x11, [sp ,16 * 5] + ldp x12, x13, [sp ,16 * 6] + ldp x14, x15, [sp ,16 * 7] + ldp x16, x17, [sp ,16 * 8] + ldp x18, x19, [sp ,16 * 9] + ldp x20, x21, [sp ,16 * 10] + ldp x22, x23, [sp ,16 * 11] + ldp x24, x25, [sp ,16 * 12] + ldp x26, x27, [sp ,16 * 13] + ldp x28, x29, [sp ,16 * 14] + ldr x30, [sp, 16 * 15] + add sp, sp, 16*17 +.endm + +.macro ventry label + b \label // branch to a handler function. + .align 7 // entry size is 0x80, .align will pad 0 +.endm + + +.global exception_vector_table +.align 11 // vector table should be aligned to 0x800 (2^11 = 0x1000_0000_0000 = 0x800) +exception_vector_table: + + //========================================================== + // Exception from the current EL while using SP_EL0 (exception level not changed) + + ventry SYNC_EL1T /* Synchronous EL1t */ + ventry IRQ_EL1T /* IRQ or vIRQ EL1t */ + ventry FIQ_EL1T /* FIQ or vFIQ EL1t */ + ventry SERROR_EL1T /* SError or vSError EL1t */ + + + //========================================================== + // Exception from the current EL while using SP_ELx (exception level not changed) + + ventry SYNC_EL1H /* Synchronous EL1h */ + ventry EL1_IRQ /* IRQ or vIRQ EL1h */ + ventry FIQ_EL1H /* FIQ or vFIQ EL1h */ + ventry SERROR_EL1H /* SError or vSError EL1h */ + + //========================================================== + // Exception from a lower EL and all lower ELs are AArch64 (Moves to higher exception level) + + ventry EL0_SYNC /* Synchronous EL0t */ + ventry EL0_IRQ /* IRQ or vIRQ EL0t */ + ventry FIQ_64_EL0T /* FIQ or vFIQ EL0t */ + ventry SERROR_64_EL0T /* SError or vSError EL0t */ + //========================================================== + // Exception from a lower EL and all lower ELs are AArch32 Moves to higher exception level + + ventry SYNC_32_EL0T /* Synchronous 32-bit EL0t */ + ventry IRQ_32_EL0T /* IRQ or vIRQ 32-bit EL0t */ + ventry FIQ_32_EL0T /* FIQ or vFIQ 32-bit EL0t */ + ventry SERROR_32_EL0T /* SError or vSError 32-bit EL0t */ + + +.macro handle_invalid_entry el, type + save_all \el + mov x0, #\type + mrs x1, spsr_el1 + mrs x2, elr_el1 + mrs x3, esr_el1 + bl invalid_exception_entry + b error_hang +.endm + +SYNC_EL1T: + handle_invalid_entry 1, SYNC_INVALID_EL1t + +IRQ_EL1T: + handle_invalid_entry 1, IRQ_INVALID_EL1t + +FIQ_EL1T: + handle_invalid_entry 1, FIQ_INVALID_EL1t + +SERROR_EL1T: + handle_invalid_entry 1, ERROR_INVALID_EL1t + +SYNC_EL1H: + handle_invalid_entry 1, SYNC_INVALID_EL1h + +EL1_IRQ: + save_all 1 + bl irq_handler + load_all 1 + eret + +FIQ_EL1H: + handle_invalid_entry 1, FIQ_INVALID_EL1h + +SERROR_EL1H: + handle_invalid_entry 1, ERROR_INVALID_EL1h + +EL0_SYNC: //[TODO] + save_all 0 + mrs x25, esr_el1 + lsr x24, x25, #ESR_ELx_EC_SHIFT + cmp x24, #ESR_ELx_EC_SVC64 // check if the exception is a system call + b.eq el0_svc + handle_invalid_entry 0, SYNC_ERROR // if not a system call, handle the exception + +EL0_IRQ: + save_all 0 + bl irq_handler + load_all 0 + eret + +FIQ_64_EL0T: + handle_invalid_entry 0, FIQ_INVALID_EL0_64 + +SERROR_64_EL0T: + handle_invalid_entry 0, ERROR_INVALID_EL0_64 + +SYNC_32_EL0T: + handle_invalid_entry 0, SYNC_INVALID_EL0_32 + +IRQ_32_EL0T: + handle_invalid_entry 0, IRQ_INVALID_EL0_32 + +FIQ_32_EL0T: + handle_invalid_entry 0, FIQ_INVALID_EL0_32 + +SERROR_32_EL0T: + handle_invalid_entry 0, ERROR_INVALID_EL0_32 + + +// creates alias +sc_nr .req x25 // number of system calls +scno .req x26 // syscall number +stbl .req x27 // syscall table pointer + +.global from_el1_to_el0 +from_el1_to_el0: + mov x2, 0x3c0 + msr spsr_el1, x2 + msr sp_el0, x1 // pass the stack pointer address from arg + msr elr_el1, x0 // pass the program's start address from arg + eret + +.global ret_from_fork // entry point for executing the process +ret_from_fork: + bl schedule_tail // preemptive enable + cbz x19, ret_to_user + mov x0, x20 + blr x19 //should never return, except for kp_to_user + +ret_to_user: + bl disable_irq + load_all 0 + eret + +el0_svc: + adr stbl, sys_call_table // load syscall table pointer + uxtw scno, w8 // syscall number in w8, uxtw: Unsigned Extend Word + mov sc_nr, #__NR_syscalls + bl enable_irq + cmp scno, sc_nr // check upper syscall limit + b.hs ni_sys // hs: higher or same + + ldr x16, [stbl, scno, lsl #3] // address in the syscall table, x16 = stbl[scno] + blr x16 // call sys_* routine + b ret_from_syscall + +ret_from_syscall: + bl disable_irq + str x0, [sp, #S_X0] // returned x0 (overwritten the original x0 value on the stack) + load_all 0 + eret + +ni_sys: + handle_invalid_entry 0, SYSCALL_ERROR + +error_hang: + b error_hang \ No newline at end of file diff --git a/lab07/kernel/src/fork.c b/lab07/kernel/src/fork.c new file mode 100644 index 000000000..1ceaea029 --- /dev/null +++ b/lab07/kernel/src/fork.c @@ -0,0 +1,119 @@ +#include "fork.h" +#include "alloc.h" +#include "schedule.h" +#include "io.h" +#include "mm.h" + +extern void ret_from_fork(void); +extern int nr_tasks; +extern struct task_struct * task[NR_TASKS]; +extern void memzero(unsigned long begin, unsigned long len); + +int copy_process( + unsigned long flags, + unsigned long fn, + unsigned long arg, + unsigned long stack) +{ + preempt_disable(); + struct task_struct *p; + + int pid = -1; + for(pid = 0; pid< NR_TASKS; pid++) + if(task[pid] == NULL) break; + if(pid == -1) + { + printf("\r\n[ERROR] Thread limit exceeded"); + goto finish; + } + // p = (struct task_struct *) balloc(sizeof(struct task_struct)); + p = (struct task_struct *) balloc(THREAD_SIZE); + printf("\r\n[INFO] Process allocated at "); printf_hex((unsigned long)p); + if (!p) + return -1; + + struct pt_regs *childregs = task_pt_regs(p); + memzero_asm((unsigned long)childregs, sizeof(struct pt_regs)); + memzero_asm((unsigned long)&p->cpu_context, sizeof(struct cpu_context)); + + if(flags & PF_KTHREAD) // is a kernel thread + { + p->cpu_context.x19 = fn; + p->cpu_context.x20 = arg; + } + else + { + struct pt_regs *cur_regs = task_pt_regs(current); + + // copy the current process state to the new process + for(int i=0; iregs[0] = 0; // child process return value + // next sp for the new task is set to the top of the new user stack + // save the stack pointer to cleanup the stack when task finishes + unsigned long stack_used = current->stack + THREAD_SIZE - cur_regs->sp; + + // copy the stack to the new process + childregs->sp = stack + THREAD_SIZE - stack_used; + for(int i=0; isp)[i] = ((char*)cur_regs->sp)[i]; + + p->stack = stack; + } + p->flags = flags; + p->priority = current->priority; + p->state = TASK_RUNNING; + p->counter = p->priority; + p->preempt_count = 1; //disable preemtion until schedule_tail + + + p->cpu_context.pc = (unsigned long)ret_from_fork; // for the first time, pc is set to ret_from_fork + p->cpu_context.sp = (unsigned long)childregs; + + task[pid] = p; + p->pid = pid; + printf("\r\n[INFO] Process created with pid: "); printf_int(pid); +finish: + preempt_enable(); + return pid; +} + +int move_to_user_mode(unsigned long pc) +{ + struct pt_regs *regs = task_pt_regs(current); // get current process state + // memzero_asm((unsigned long)regs, sizeof(struct pt_regs)); + + regs->pc = pc; // point to the function that need to be executed in user mode + regs->pstate = PSR_MODE_EL0t; // EL0t is user state + + unsigned long stack = (unsigned long)balloc(THREAD_SIZE); //allocate new user stack + memzero_asm(stack, THREAD_SIZE); + + if (!stack) { // if stack allocation failed + return -1; + } + + // allocate stack for user process + // set sp to the top of the stack + regs->sp = stack + THREAD_SIZE; + current->stack = stack; + return 0; +} + + +// calculate the location of pt_regs in the task_struct +// task_struct is allocated at the end of the stack +// pt_regs is allocated at the top of the task_struct +struct pt_regs * task_pt_regs(struct task_struct *tsk){ + unsigned long p = (unsigned long)tsk + THREAD_SIZE - sizeof(struct pt_regs); + return (struct pt_regs *)p; +} + +void kp_user_mode(unsigned long func){ // Kernel process(func pass by argu) to user mode + printf("\r\nKernel process started. Switching to user mode..."); + int err = move_to_user_mode(func); + if (err < 0){ + printf("Error while moving process to user mode\n\r"); + } +} \ No newline at end of file diff --git a/lab07/kernel/src/io.c b/lab07/kernel/src/io.c new file mode 100644 index 000000000..9bc72b584 --- /dev/null +++ b/lab07/kernel/src/io.c @@ -0,0 +1,54 @@ +#include "io.h" + +void printf(const char* str) +{ + uart_send_string(str); +} + +void printfc(const char c) +{ + uart_send(c); +} + +void printf_hex(const unsigned int d) +{ + printf("0x"); + unsigned int td = d; + for(int i=28; i>=0; i-=4){ + int tmp = (td >> i) & 0xf; + if(tmp < 10){ + printfc('0'+tmp); + } + else{ + printfc('a'+tmp-10); + } + } +} + +void printf_int(const int d) +{ + int td = d; + if(td < 0){ + printf("-"); + td = -td; + } + if(td == 0){ + printf("0"); + return; + } + int digits[10]; + int cnt = 0; + while(td > 0){ + digits[cnt++] = td % 10; + td /= 10; + } + for(int i=cnt-1; i>=0; i--){ + printfc('0'+digits[i]); + } +} + +char read_char() +{ + char c = uart_recv(); + return c; +} diff --git a/lab07/kernel/src/irq.S b/lab07/kernel/src/irq.S new file mode 100644 index 000000000..ee0531406 --- /dev/null +++ b/lab07/kernel/src/irq.S @@ -0,0 +1,11 @@ +.section ".text" + +.global enable_irq +enable_irq: + msr daifclr, 0xf + ret + +.global disable_irq +disable_irq: + msr daifset, 0xf + ret \ No newline at end of file diff --git a/lab07/kernel/src/irq.c b/lab07/kernel/src/irq.c new file mode 100644 index 000000000..21d7686f1 --- /dev/null +++ b/lab07/kernel/src/irq.c @@ -0,0 +1,84 @@ +#include "peripherals/irq.h" +#include "peripherals/mini_uart.h" + +#include "irq.h" +#include "io.h" + +extern void enable_irq(); +extern void disable_irq(); +extern void irq_timer_handler(); + +static char *entry_error_messages[] = { + "SYNC_INVALID_EL1t", + "IRQ_INVALID_EL1t", + "FIQ_INVALID_EL1t", + "ERROR_INVALID_EL1T", + + "SYNC_INVALID_EL1h", + "IRQ_INVALID_EL1h", + "FIQ_INVALID_EL1h", + "ERROR_INVALID_EL1h", + + "SYNC_INVALID_EL0_64", + "IRQ_INVALID_EL0_64", + "FIQ_INVALID_EL0_64", + "ERROR_INVALID_EL0_64", + + "SYNC_INVALID_EL0_32", + "IRQ_INVALID_EL0_32", + "FIQ_INVALID_EL0_32", + "ERROR_INVALID_EL0_32", + + "SYNC_ERROR", + "SYSCALL_ERROR" +}; + +static void show_debug_msg(int type, unsigned long spsr, unsigned long elr, unsigned long esr) +{ + printf("\r\n"); + printf(entry_error_messages[type]); + printf(", SPSR: "); + printf_hex(spsr); + printf(", ELR: "); + printf_hex(elr); + printf(", ESR: "); + printf_hex(esr); +} + +void irq_handler(int type, unsigned long spsr, unsigned long elr, unsigned long esr) +{ + disable_irq(); + + unsigned int irq = *CORE0_IRQ_SOURCE; + switch(irq) + { + case SYSTEM_TIMER_IRQ_1: + irq_timer_handler(); + break; + default: + printf("\r\nUnknown irq: "); + printf_hex(irq); + break; + } + enable_irq(); +} + +void invalid_exception_entry(int type, unsigned long spsr, unsigned long elr, unsigned long esr) +{ + + show_debug_msg(type, spsr, elr, esr); +} + +// void el0_irq_entry(int type, unsigned long spsr, unsigned long elr, unsigned long esr) +// { +// disable_irq(); +// show_debug_msg(type, spsr, elr, esr); +// enable_irq(); +// } + +void svc_exception_entry(int type, unsigned long spsr, unsigned long elr, unsigned long esr) +{ + disable_irq(); + show_debug_msg(type, spsr, elr, esr); + enable_irq(); +} diff --git a/lab07/kernel/src/kernel_main.c b/lab07/kernel/src/kernel_main.c new file mode 100644 index 000000000..fa338c83a --- /dev/null +++ b/lab07/kernel/src/kernel_main.c @@ -0,0 +1,54 @@ +#include "io.h" +#include "fork.h" +#include "schedule.h" + +extern void shell_loop(); +extern void frame_init_with_reserve(); +extern void memory_pool_init(); +extern void mem_init(); +extern void uart_init(); +extern void timer_init(); +extern void enable_irq(); +extern void initramfs_callback(void*); +extern void rootfs_init(); + +#ifndef QEMU +extern void fdt_traverse(void (*callback)(void*)); +#endif + +static void multiple_init(); + +extern struct task_struct *current; + +int main() +{ + multiple_init(); + enable_irq(); + +#ifndef QEMU + fdt_traverse(initramfs_callback); +#endif + frame_init_with_reserve(); + + rootfs_init(); + + printf("\nWelcome to Yuchang's Raspberry Pi 3!\n"); + + // copy_process((unsigned long)(void*)&shell_loop, 0); + copy_process(PF_KTHREAD, (unsigned long)(void*)&shell_loop, 0, 0); + + while(1){ + kill_zombies(); + schedule(); + } + return 0; +} + +static void multiple_init() +{ + mem_init(); + uart_init(); + memory_pool_init(); + timer_init(); + // rootfs_init(); +} \ No newline at end of file diff --git a/lab07/kernel/src/lib.c b/lab07/kernel/src/lib.c new file mode 100644 index 000000000..82bff2bfa --- /dev/null +++ b/lab07/kernel/src/lib.c @@ -0,0 +1,87 @@ +#include "lib.h" +#include "io.h" + +uint32_t strtol(const char *sptr, uint32_t base, int size) +{ + uint32_t ret = 0; + int i=0; + + while((sptr[i] != '\0') && (i= '0' && sptr[i] <= '9'){ + ret = ret * 16 + (sptr[i] - '0'); + } + else if(sptr[i] >= 'a' && sptr[i] <= 'f'){ + ret = ret * 16 + (sptr[i] - 'a' + 10); + } + else if(sptr[i] >= 'A' && sptr[i] <= 'F'){ + ret = ret * 16 + (sptr[i] - 'A' + 10); + } + else{ + break; + } + } + else if(base == 8 || base == 2){ + if(sptr[i] >= '0' && sptr[i] <= '9'){ + ret = ret * base + (sptr[i] - '0'); + } + else{ + break; + } + } + i++; + } + return ret; +} + +uint64_t atoi(const char *str) +{ + uint64_t ret = 0; + int i=0; + while(str[i] != '\0' && (str[i] >= '0' && str[i] <= '9')){ + ret = ret * 10 + (str[i] - '0'); + i++; + } + return ret; +} + +uint64_t atoi_hex(const char *str) +{ + uint64_t ret = 0; + int i=0; + while(str[i] != '\0'){ + if(str[i] >= '0' && str[i] <= '9'){ + ret = ret * 16 + (str[i] - '0'); + } + else if(str[i] >= 'a' && str[i] <= 'f'){ + ret = ret * 16 + (str[i] - 'a' + 10); + } + else if(str[i] >= 'A' && str[i] <= 'F'){ + ret = ret * 16 + (str[i] - 'A' + 10); + } + else{ + break; + } + i++; + } + return ret; +} + +uint64_t pow(int base, int exp) +{ + uint64_t ret = 1; + while(exp-- > 0){ + ret *= base; + } + return ret; +} + +void assert(int condition, char* message) +{ + if(!condition){ + printf("\nAssertion failed: "); + printf(message); + printf("\n"); + while(1); + } +} \ No newline at end of file diff --git a/lab07/kernel/src/linker.ld b/lab07/kernel/src/linker.ld new file mode 100644 index 000000000..4eb74d510 --- /dev/null +++ b/lab07/kernel/src/linker.ld @@ -0,0 +1,24 @@ +SECTIONS +{ + . = 0x80000; + .text : + { + KEEP(*(.text.boot)) + *(.text) + } + .rodata :{ *(.rodata) } + .data : { *(.data) } + .bss : + { + . = ALIGN(0x8); + __bss_start = .; + *(.bss) + . = ALIGN(0x8); + __bss_end = .; + } + . = ALIGN(0x8); + _kernel_end = .; + . = ALIGN(0x8); + _heap_start = .; +} +__bss_size = (__bss_end - __bss_start)>>3; \ No newline at end of file diff --git a/lab07/kernel/src/mailbox.c b/lab07/kernel/src/mailbox.c new file mode 100644 index 000000000..664680d96 --- /dev/null +++ b/lab07/kernel/src/mailbox.c @@ -0,0 +1,67 @@ +#include "peripherals/mailbox.h" + +#include "mailbox.h" +#include "io.h" + +void get_board_revision() +{ + unsigned int mailbox[7]; + mailbox[0] = 7 * 4; // buffer size in bytes + mailbox[1] = REQUEST_CODE; + // tags begin + mailbox[2] = GET_BOARD_REVISION; // tag identifier + mailbox[3] = 4; // maximum of request and response value buffer's length. + mailbox[4] = TAG_REQUEST_CODE; + mailbox[5] = 0; // value buffer + // tags end + mailbox[6] = END_TAG; + + mailbox_call(mailbox); // message passing procedure call, you should implement it following the 6 steps provided above. + + // printf("0x%x\n", mailbox[5]); // it should be 0xa020d3 for rpi3 b+ + printf("\nBoard revision: "); + printf_hex(mailbox[5]); +} + +void get_memory_info() +{ + unsigned int mailbox[8]; + mailbox[0] = 8 * 4; // buffer size in bytes + mailbox[1] = REQUEST_CODE; + // tags begin + mailbox[2] = GET_ARM_MEMORY; // tag identifier + mailbox[3] = 8; // maximum of request and response value buffer's length. + mailbox[4] = TAG_REQUEST_CODE; + mailbox[5] = 0; // value buffer + mailbox[6] = 0; + // tags end + mailbox[7] = END_TAG; + + mailbox_call(mailbox); // message passing procedure call, you should implement it following the 6 steps provided above. + + printf("\nARM base memory address: "); + printf_hex(mailbox[5]); + printf("\nARM memory size: "); + printf_hex(mailbox[6]); + +} + +void mailbox_call(unsigned int* mailbox) +{ + unsigned int mesg = (((unsigned long)mailbox) & ~0xf) | 8; + + while(*MAILBOX_STATUS & MAILBOX_FULL){ // // Check if Mailbox 0 status register’s full flag is set. if MAILBOX_STATUS == 0x80000001, then error parsing request buffer + asm volatile("nop"); + } + + *MAILBOX_WRITE = mesg; + + while(1){ + while(*MAILBOX_STATUS & MAILBOX_EMPTY){ + asm volatile("nop"); + } + if(mesg == *MAILBOX_READ){ + break; + } + } +} \ No newline at end of file diff --git a/lab07/kernel/src/mini_uart.c b/lab07/kernel/src/mini_uart.c new file mode 100644 index 000000000..f43431f60 --- /dev/null +++ b/lab07/kernel/src/mini_uart.c @@ -0,0 +1,65 @@ +#include "peripherals/mini_uart.h" +#include "peripherals/gpio.h" + +#include "mini_uart.h" +#include "string.h" + +void uart_init() +{ + // set the alternate function for GPIO14 and GPIO15 + unsigned int selector; + selector = *GPFSEL1; + selector &= ~(7<<12); // size gpio14 to 0 for gpio14 is bits 12-14 + selector |= 2<<12; // set to alt5 for gpio14 + selector &= ~(7<<15); // size gpio15 to 0 for gpio15 is bits 15-17 + selector |= 2<<15; // set to alt5 for gpio15 + *GPFSEL1 = selector; + + // GPIO initilaization + *GPPUD = 0; // disable pull up/down for all GPIO pins + unsigned int i = 150; + while(i--) asm volatile("nop"); + *GPPUDCLK0 = (1<<14) | (1<<15); // enable clock for gpio14 and gpio15 + i = 150; + while(i--) asm volatile("nop"); + *GPPUDCLK0 = 0; // disable clock for gpio14 and gpio15 + + // initialize mini uart + *AUX_ENABLES = 1; //Enable mini uart (this also enables access to its registers) + *AUX_MU_CNTL_REG = 0; //Disable auto flow control and disable receiver and transmitter (for now) + *AUX_MU_IER_REG = 0; //Disable receive and transmit interrupts + *AUX_MU_LCR_REG = 3; //Enable 8 bit mode + *AUX_MU_MCR_REG = 0; //Set RTS line to be always high + *AUX_MU_BAUD_REG = 270; // 115200 baud + *AUX_MU_CNTL_REG = 3; //Finally, enable transmitter and receiver +} + +char uart_recv() +{ + + char r; + // bit 0 == 1, if receiver holds valid byte + do{asm volatile("nop");}while(!(*AUX_MU_LSR_REG & 0x01)); + r = (char)(*AUX_MU_IO_REG); + return r == '\r'?'\n':r; + +} + +void uart_send(const char c) +{ + // bit 6 == 1, if transmitter is empty + while (1) { + if ((*AUX_MU_LSR_REG)&0x20) break; + } + *AUX_MU_IO_REG = c; + +} + +void uart_send_string(const char* str) +{ + while(*str){ + if(*str == '\n') + uart_send('\r'); + uart_send(*str++); + } +} \ No newline at end of file diff --git a/lab07/kernel/src/mm.S b/lab07/kernel/src/mm.S new file mode 100644 index 000000000..3998c53d5 --- /dev/null +++ b/lab07/kernel/src/mm.S @@ -0,0 +1,6 @@ +.globl memzero_asm +memzero_asm: + str xzr, [x0], #8 + subs x1, x1, #8 + b.gt memzero_asm + ret \ No newline at end of file diff --git a/lab07/kernel/src/reboot.c b/lab07/kernel/src/reboot.c new file mode 100644 index 000000000..9d8153f62 --- /dev/null +++ b/lab07/kernel/src/reboot.c @@ -0,0 +1,18 @@ +#define PM_PASSWORD 0x5a000000 +#define PM_RSTC 0x3F10001c +#define PM_WDOG 0x3F100024 + +void set(long addr, unsigned int value) { + volatile unsigned int* point = (unsigned int*)addr; + *point = value; +} + +void reset(int tick) { // reboot after watchdog timer expire + set(PM_RSTC, PM_PASSWORD | 0x20); // full reset + set(PM_WDOG, PM_PASSWORD | tick); // number of watchdog tick +} + +void cancel_reset() { + set(PM_RSTC, PM_PASSWORD | 0); // full reset + set(PM_WDOG, PM_PASSWORD | 0); // number of watchdog tick +} \ No newline at end of file diff --git a/lab07/kernel/src/schedule.S b/lab07/kernel/src/schedule.S new file mode 100644 index 000000000..4dd8af0d4 --- /dev/null +++ b/lab07/kernel/src/schedule.S @@ -0,0 +1,24 @@ +#include "schedule.h" + +.globl cpu_switch_to +cpu_switch_to: + mov x10, #THREAD_CPU_CONTEXT + add x8, x0, x10 // x8 = the pointer points to current thread's cpu_context + mov x9, sp + stp x19, x20, [x8], #16 // store callee-saved registers + stp x21, x22, [x8], #16 + stp x23, x24, [x8], #16 + stp x25, x26, [x8], #16 + stp x27, x28, [x8], #16 + stp x29, x9, [x8], #16 + str x30, [x8] + add x8, x1, x10 // x8 = the pointer points to next thread's cpu_context + ldp x19, x20, [x8], #16 // restore callee-saved registers + ldp x21, x22, [x8], #16 + ldp x23, x24, [x8], #16 + ldp x25, x26, [x8], #16 + ldp x27, x28, [x8], #16 + ldp x29, x9, [x8], #16 + ldr x30, [x8] // restore pc + mov sp, x9 + ret \ No newline at end of file diff --git a/lab07/kernel/src/schedule.c b/lab07/kernel/src/schedule.c new file mode 100644 index 000000000..d61fe437b --- /dev/null +++ b/lab07/kernel/src/schedule.c @@ -0,0 +1,103 @@ +#include "schedule.h" +#include "irq.h" +#include "alloc.h" +#include "io.h" + +static struct task_struct init_task = INIT_TASK; +struct task_struct *current = &(init_task); +struct task_struct * task[NR_TASKS] = {&(init_task), }; +int nr_tasks = 1; + +void preempt_disable(void) +{ + current->preempt_count++; +} + +void preempt_enable(void) +{ + current->preempt_count--; +} + + +void _schedule(void) +{ + preempt_disable(); + int next,c; + struct task_struct * p; + while (1) { + c = -1; + next = 0; + for (int i = 0; i < NR_TASKS; i++){ // find the task with the maximum counter + p = task[i]; + if (p && p->state == TASK_RUNNING && p->counter > c) { + c = p->counter; + next = i; + } + } + if (c) { // found & break for switch to the task + break; + } + // if no task is found, increase the counter of all tasks + for (int i = 0; i < NR_TASKS; i++) { + p = task[i]; + if (p) { + p->counter = (p->counter >> 1) + p->priority; + } + } + } + switch_to(task[next]); + preempt_enable(); +} + +void schedule(void) +{ + current->counter = 0; + _schedule(); +} + +void switch_to(struct task_struct * next) +{ + if (current == next) + return; + struct task_struct * prev = current; + current = next; + cpu_switch_to(prev, next); +} + +void schedule_tail(void) { + preempt_enable(); +} + + +void timer_tick() +{ + --current->counter; + if (current->counter>0 || current->preempt_count >0) { + return; + } + current->counter=0; + enable_irq(); + _schedule(); + disable_irq(); +} + +void kill_zombies() +{ + for (int i = 0; i < NR_TASKS; i++) { + if (task[i] && task[i]->state == TASK_ZOMBIE) { + struct task_struct * p = task[i]; + task[i] = 0; + printf("\r\n[KILL] zombies, pid: "); printf_int(p->pid); + bfree(p); + } + } +} + +void exit_process() +{ + preempt_disable(); + current->state = TASK_ZOMBIE; + bfree((void*)current->stack); + preempt_enable(); + schedule(); +} \ No newline at end of file diff --git a/lab07/kernel/src/shell.c b/lab07/kernel/src/shell.c new file mode 100644 index 000000000..feba5bfdf --- /dev/null +++ b/lab07/kernel/src/shell.c @@ -0,0 +1,278 @@ +#include "shell.h" +#include "mini_uart.h" +#include "mailbox.h" +#include "reboot.h" +#include "io.h" +#include "string.h" +#include "alloc.h" +#include "lib.h" +#include "timer.h" +#include "irq.h" +#include "fork.h" +#include "schedule.h" +#include "vfs.h" + +#define delay(x) for(int i=0; ipid); printf("\t,loop: "); printf_int(i); + delay(1000000); + schedule(); + } + current->state = TASK_ZOMBIE; + while(1); +} + +static void user_foo() +{ + // printf("Fork Test , pid : %d\n",getpid()); + printf("\r\nFork Test, pid: "); printf_int(getpid()); + uint32_t cnt = 1,ret=0; + + if((ret=fork()) == 0){ //pid == 0 => child + printf("\r\n===== Child Process ====="); + unsigned long cur_sp; + asm volatile("mov %0, sp" : "=r"(cur_sp)); + // printf("first child pid: %d, cnt: %d, ptr: %x, sp : %x\n", getpid(), cnt, &cnt, cur_sp); + printf("\r\nfirst child pid: "); printf_int(getpid()); printf(", cnt: "); printf_int(cnt); + printf(", ptr: "); printf_hex((unsigned long)&cnt); printf(", sp: "); printf_hex(cur_sp); + ++cnt; + + if ((ret = fork() )!= 0){ + asm volatile("mov %0, sp" : "=r"(cur_sp)); + // printf("first child pid: %d, cnt: %d, ptr: %x, sp : %x\n", getpid(), cnt, &cnt, cur_sp); + printf("\r\nfirst child pid: "); printf_int(getpid()); printf(", cnt: "); printf_int(cnt); + printf(", ptr: "); printf_hex((unsigned long)&cnt); printf(", sp: "); printf_hex(cur_sp); + } + else{ + while (cnt < 5) { + asm volatile("mov %0, sp" : "=r"(cur_sp)); + // printf("second child pid: %d, cnt: %d, ptr: %x, sp : %x\n", getpid(), cnt, &cnt, cur_sp); + printf("\r\nsecond child pid: "); printf_int(getpid()); printf(", cnt: "); printf_int(cnt); + printf(", ptr: "); printf_hex((unsigned long)&cnt); printf(", sp: "); printf_hex(cur_sp); + delay(1000000); + ++cnt; + } + } + exit(); + } + else{ //pid > 0 => parent + printf("\r\n===== Parent Process ====="); + printf("\r\nParent Process, pid: "); printf_int(getpid()); + printf(" child pid: "); printf_int(ret); + unsigned long cur_sp; + asm volatile("mov %0, sp" : "=r"(cur_sp)); + printf(" cnt: "); printf_int(cnt); printf(" , ptr: "); printf_hex((unsigned long)&cnt); + printf(" , sp: "); printf_hex(cur_sp); + exit(); + } +} + +static void multiple_thread_test(int argc, char *argv[]) +{ + for(int i = 0; i < 5; ++i) { + copy_process(PF_KTHREAD, (unsigned long)&foo, 0, 0); + } +} + +static void to_user_test(int argc, char *argv[]) +{ + copy_process(PF_KTHREAD, (unsigned long)&kp_user_mode, (unsigned long)&user_foo, 0); +} + +/* ===================================================================== */ + + +static void hello(int argc, char **argv) +{ + printf("\nHello, World!"); +} + +static void help(int argc, char **argv) +{ + for(int i=0; i 0){ + input_index--; + printf("\b \b"); + } + continue; + } + x[input_index] = input_char; + ++input_index; + printfc(input_char); + } + + x[input_index]=0; // null char +} + +int split_command(char* command, char *argv[]) +{ + int argc = 0; + + char *token = strtok(command, " "); + while(token != NULL) + { + argv[argc] = token; + argc++; + token = strtok(0, " "); + } + return argc; +} \ No newline at end of file diff --git a/lab07/kernel/src/string.c b/lab07/kernel/src/string.c new file mode 100644 index 000000000..35b3778cd --- /dev/null +++ b/lab07/kernel/src/string.c @@ -0,0 +1,68 @@ +#include "string.h" +#include "io.h" + +int strcmp(const char* a, const char* b) +{ + while(*a == *b){ + if(*a == '\0') + return 0; + a++; + b++; + } + return *a - *b; +} + +char* strcpy(char* dest, const char* src) +{ + char* ret = dest; + while(*src){ + *dest = *src; + dest++; + src++; + } + *dest = '\0'; + return ret; +} + +char* strncpy(char* dest, const char* src, int n) +{ + char* ret = dest; + while(n--){ + *dest = *src; + dest++; + src++; + } + *dest = '\0'; + return ret; +} + +uint32_t strlen(const char* str) +{ + uint32_t len = 0; + while(*str){ + len++; + str++; + } + return len; +} + +char *strtok(char* str, const char* delim) +{ + // printf("\r\nstr: "); printf(str); + static char* p = 0; + if(str != 0) p = str; + if(p == 0) return 0; + char* ret = p; + while(*p){ + if(*p == *delim){ + *p = '\0'; + p++; + return ret; + } + p++; + // printf("\r\np++"); + } + // printf("\r\nret: "); printf(ret); printf(", "); printfc(ret[0]); printf(", "); printf_int(ret[0] == NULL); + if(ret[0] == 0) return NULL; + return ret; +} \ No newline at end of file diff --git a/lab07/kernel/src/sys.S b/lab07/kernel/src/sys.S new file mode 100644 index 000000000..cc70ea6c8 --- /dev/null +++ b/lab07/kernel/src/sys.S @@ -0,0 +1,97 @@ +#include "sys.h" + +// reason for using w8 is that x0-x7 are used for passing arguments +// the such warpper functions are not inlcuded in the real linux kernel +// they often are packed in the different language's standard library, such as glibc + +// svc #0 is used to generate synchronous exception + +.global getpid +getpid: + mov w8, #SYS_GETPID_NUM + svc #0 // using svc to generate synchronous exception + ret + +.global uartread +uartread: + mov w8, #SYS_UARTREAD_NUM + svc #0 + ret + +.global uartwrite +uartwrite: + mov w8, #SYS_UARTWRITE_NUM + svc #0 + ret + +.global exec +exec: + mov w8, #SYS_EXEC_NUM + svc #0 + ret + +.global fork +fork: + mov w8, #SYS_FORK_NUM + svc #0 + ret + +.global exit +exit: + mov w8, #SYS_EXIT_NUM + svc #0 + ret + +.global mbox_call +mbox_call: + mov w8, #SYS_MBOX_CALL_NUM + svc #0 + ret + +.global kill +kill: + mov w8, #SYS_KILL_NUM + svc #0 + ret + +.global open +open: + mov w8, #SYS_OPEN_NUM + svc #0 + ret + +.global close +close: + mov w8, #SYS_CLOSE_NUM + svc #0 + ret + +.global write +write: + mov w8, #SYS_WRITE_NUM + svc #0 + ret + +.global read +read: + mov w8, #SYS_READ_NUM + svc #0 + ret + +.global mkdir +mkdir: + mov w8, #SYS_MKDIR_NUM + svc #0 + ret + +.global mount +mount: + mov w8, #SYS_MOUNT_NUM + svc #0 + ret + +.global chdir +chdir: + mov w8, #SYS_CHDIR_NUM + svc #0 + ret \ No newline at end of file diff --git a/lab07/kernel/src/sys.c b/lab07/kernel/src/sys.c new file mode 100644 index 000000000..de7614d8d --- /dev/null +++ b/lab07/kernel/src/sys.c @@ -0,0 +1,140 @@ +#include "sys.h" +#include "schedule.h" +#include "fork.h" +#include "mini_uart.h" +#include "io.h" +#include "alloc.h" +#include "cpio.h" +#include "lib.h" +#include "type.h" +#include "string.h" +#include "peripherals/mailbox.h" + +extern struct task_struct *current; +extern void memzero_asm(unsigned long src, unsigned long n); +#ifndef QEMU +extern unsigned long CPIO_START_ADDR_FROM_DT; +#endif + +int sys_getpid() +{ + return current->pid; +} + +size_t sys_uartread(char buf[], size_t size) +{ + for(size_t i=0; ic_namesize, 16, 8); + int filesize = strtol(head->c_filesize, 16, 8); + + char *filename = (void*)head + head_size; + + uint32_t offset = head_size + namesize; + if(offset % 4 != 0) offset = ((offset/4 +1)*4); + + if(strcmp(filename, "TRAILER!!!") == 0){ + printf("\r\n[ERROR] File not found"); + break; + } + else if(strcmp(filename, name) == 0){ + /* The filedata is appended after filename */ + char *filedata = (void*)head + offset; + void* user_program_addr = balloc(filesize+THREAD_SIZE); // extra page in case + if(user_program_addr == NULL) return -1; + memzero_asm((unsigned long)user_program_addr, filesize+THREAD_SIZE); + for(int i=0; ipc = (unsigned long)user_program_addr; + cur_regs->sp = current->stack + THREAD_SIZE; + + preempt_enable(); + break; // won't reach here + } + + if(filesize % 4 != 0) filesize = (filesize/4 +1)*4; + head = (void*)head + offset + filesize; + } + return -1; // only failure +} + +int sys_fork() // [TODO] +{ + unsigned long stack = (unsigned long)balloc(THREAD_SIZE); + if((void*)stack == NULL) return -1; + memzero_asm(stack, THREAD_SIZE); + return copy_process(0, 0, 0, stack); +} + +void sys_exit(int status) // [TODO] +{ + exit_process(); +} + +int sys_mbox_call(unsigned char ch, unsigned int *mbox) // [TODO] +{ + unsigned int mesg = (((unsigned int)(unsigned long)mbox) & ~0xf) | (ch & 0xf); + while(*MAILBOX_STATUS & MAILBOX_FULL){ // // Check if Mailbox 0 status register’s full flag is set. if MAILBOX_STATUS == 0x80000001, then error parsing request buffer + asm volatile("nop"); + } + + *MAILBOX_WRITE = mesg; + + while(1){ + while(*MAILBOX_STATUS & MAILBOX_EMPTY){ + asm volatile("nop"); + } + if(mesg == *MAILBOX_READ){ + return mbox[1] == REQUEST_SUCCEED; + } + } + return 0; +} + +void sys_kill(int pid) // [TODO] +{ + struct task_struct* p; + for(int i=0; ipid == pid){ + preempt_disable(); + printf("\r\nKilling process: "); printf_int(pid); + p->state = TASK_ZOMBIE; + preempt_enable(); + return; + } + } + printf("\r\nProcess not found: "); printf_int(pid); + return; +} + +void * const sys_call_table[] = {sys_getpid, sys_uartread, sys_uartwrite, sys_exec, sys_fork, sys_exit, sys_mbox_call, sys_kill}; \ No newline at end of file diff --git a/lab07/kernel/src/timer.S b/lab07/kernel/src/timer.S new file mode 100644 index 000000000..1d3a466b2 --- /dev/null +++ b/lab07/kernel/src/timer.S @@ -0,0 +1,32 @@ +.section ".text" + +.global core_timer_enable +core_timer_enable: + mov x0, 1 + msr cntp_ctl_el0, x0 // enable + mov x0, 2 + // mrs x0, cntfrq_el0 + ldr x1, =0x40000040 // timer interrupt control register for core 0 + str w0, [x1] // unmask timer interrupt + ret + +.global core_timer_disable +core_timer_disable: + mov x0, 0 + msr cntp_ctl_el0, x0 // disable + ret + +.global get_cpu_cycles +get_cpu_cycles: + mrs x0, cntpct_el0 + ret + +.global get_cpu_freq +get_cpu_freq: + mrs x0, cntfrq_el0 + ret + +.global set_timer_asm +set_timer_asm: + msr cntp_tval_el0, x0 + ret \ No newline at end of file diff --git a/lab07/kernel/src/timer.c b/lab07/kernel/src/timer.c new file mode 100644 index 000000000..0dcd61513 --- /dev/null +++ b/lab07/kernel/src/timer.c @@ -0,0 +1,25 @@ +#include "timer.h" +#include "alloc.h" +#include "string.h" +#include "type.h" +#include "io.h" + +extern void timer_tick(); + +void timer_init() +{ + core_timer_enable(); + set_timer(1); +} + +void irq_timer_handler() +{ + set_timer_asm(get_cpu_freq()>>5); + timer_tick(); +} + +void set_timer(uint32_t sec) +{ + uint64_t cycles = get_cpu_freq() * sec; + set_timer_asm(cycles); +} diff --git a/lab07/kernel/src/tmpfs.c b/lab07/kernel/src/tmpfs.c new file mode 100644 index 000000000..f23b6f361 --- /dev/null +++ b/lab07/kernel/src/tmpfs.c @@ -0,0 +1,269 @@ +#include "tmpfs.h" +#include "alloc.h" +#include "errno.h" +#include "io.h" +#include "string.h" + +#define min(a, b) ((a) < (b) ? (a) : (b)) + +struct file_operations *tmpfs_f_ops; +struct vnode_operations *tmpfs_v_ops; + +static struct vnode* tmpfs_create_vnode(const char *name, int type, struct vnode *parent); + +int tmpfs_setup_mount(struct filesystem* fs, struct mount *mount) // mount the filesystem to the mount point +{ + mount->fs = fs; + mount->root = tmpfs_create_vnode("/", DIR_NODE, NULL); + return 0; +} + +static struct vnode* tmpfs_create_vnode(const char *name, int type, struct vnode *parent) +{ + struct tmpfs_internal *internal = (struct tmpfs_internal*)dynamic_alloc(sizeof(struct tmpfs_internal)); + + if(sizeof(name) > COMPONENT_SIZE){ + printf("[ERROR] File name too long\n"); + return NULL; + } + internal->name = (char*)dynamic_alloc(COMPONENT_SIZE); + strcpy(internal->name, name); + internal->size = 0; + if(type == FILE_NODE){ + internal->data = (char*)balloc(TMPFS_MAX_FILE); + } + else{ + internal->data = NULL; + } + internal->type = type; + // internal->parent = parent; + // internal->next = NULL; + for(int i=0; ichildren[i] = NULL; + } + struct vnode *vnode = (struct vnode*)dynamic_alloc(sizeof(struct vnode)); + vnode->parent = parent; + vnode->mount = NULL; + vnode->v_ops = tmpfs_v_ops; + vnode->f_ops = tmpfs_f_ops; + vnode->internal = internal; + return vnode; +} + +int tmpfs_register() +{ + // check if tmpfs already registered + int i=0; + for(; iwrite = tmpfs_write; + tmpfs_f_ops->read = tmpfs_read; + tmpfs_f_ops->open = tmpfs_open; + tmpfs_f_ops->close = tmpfs_close; + + tmpfs_v_ops->lookup = tmpfs_lookup; + tmpfs_v_ops->create = tmpfs_create; + tmpfs_v_ops->mkdir = tmpfs_mkdir; + tmpfs_v_ops->list = tmpfs_list; + + return 0; +} + +int tmpfs_write(struct file* file, const void* buf, size_t len) +{ + // Given the file handle, VFS calls the corresponding write + // method to write the file starting from f_pos, then updates + // f_pos and size after write. (or not if it’s a special file) + // Returns size written or error code on error. + + // 1. write len byte from buf to the opened file. + // 2. return written size or error code if an error occurs. + struct vnode *vnode = file->vnode; + struct tmpfs_internal *internal = (struct tmpfs_internal*)vnode->internal; + if(internal->type == DIR_NODE){ + printf("[ERROR] Cannot write to a directory\n"); + return WERROR; + } + + if(file->f_pos + len > TMPFS_MAX_FILE){ + printf("[ERROR] File size exceeded\n"); + return WERROR; + } + + // memory copy + for(int i=0; idata[file->f_pos + i] = ((char*)buf)[i]; + } + file->f_pos += len; + internal->size += len; + return len; +} + +int tmpfs_read(struct file* file, void* buf, size_t len) +{ + // Given the file handle, VFS calls the corresponding read method + // to read the file starting from f_pos, then updates f_pos after read. + // (or not if it’s a special file) + + // 1. read min(len, readable size) byte to buf from the opened file. + // 2. block if nothing to read for FIFO type + // 2. return read size or error code if an error occurs. + + struct vnode *vnode = file->vnode; + struct tmpfs_internal *internal = (struct tmpfs_internal*)vnode->internal; + if(internal->type == DIR_NODE){ + printf("[ERROR] Cannot read a directory\n"); + return RERROR; + } + + size_t readable_size = min(len, internal->size - file->f_pos); + + // memory copy + for(int i=0; idata[file->f_pos + i]; + } + file->f_pos += readable_size; + return readable_size; +} + +int tmpfs_open(struct vnode* file_node, struct file** target) +{ + return 0; // the steps for checking the file is implemented in vfs_open +} + +int tmpfs_close(struct file* file) +{ + // 1. release the file handle + // 2. Return error code if fails + if(file == NULL){ + printf("[ERROR] File pointer cannot be NULL\n"); + return CERROR; + } + return 0; // vfs_close will free the file pointer +} + +int tmpfs_create(struct vnode* dir_node, struct vnode** target, const char* component_name) +{ + // create an regular file on underlying file system, + // should fail if file exist. Then passes the file’s vnode back to VFS. + + // 1. Create a new file in the directory + // 2. Return error code if fails + struct tmpfs_internal *internal = (struct tmpfs_internal*)dir_node->internal; + if(internal->type == FILE_NODE){ + printf("[ERROR] Cannot create file in a file\n"); + return CERROR; + } + + if(strlen(component_name) > COMPONENT_SIZE){ + printf("[ERROR] File name too long\n"); + return CERROR; + } + + // for(int i=0; ichildren[i] == NULL){ + // internal->children[i] = tmpfs_create_vnode(component_name, FILE_NODE, dir_node); + // *target = internal->children[i]; + // return 0; + // } + // } + if(internal->size + 1 > ENTRIES_PER_DIR){ + printf("[ERROR] No space for new file\n"); + return CERROR; + } + internal->children[internal->size] = tmpfs_create_vnode(component_name, FILE_NODE, dir_node); + *target = internal->children[internal->size]; + internal->size++; + return 0; +} + +int tmpfs_mkdir(struct vnode* dir_node, struct vnode** target, const char* component_name) +{ + // 1. Create a new directory in the directory + // 2. Return error code if fails + printf("\r\ntmpfs mkdir"); + struct tmpfs_internal *internal = (struct tmpfs_internal*)dir_node->internal; + if(internal->type == FILE_NODE){ + printf("[ERROR] Cannot create directory in a file\n"); + return CERROR; + } + + if(strlen(component_name) > COMPONENT_SIZE){ + printf("[ERROR] Directory name too long\n"); + return CERROR; + } + + // for(int i=0; ichildren[i] == NULL){ + // internal->children[i] = tmpfs_create_vnode(component_name, DIR_NODE, dir_node); + // *target = internal->children[i]; + // return 0; + // } + // } + if(internal->size + 1 > ENTRIES_PER_DIR){ + printf("[ERROR] No space for new directory\n"); + return CERROR; + } + internal->children[internal->size] = tmpfs_create_vnode(component_name, DIR_NODE, dir_node); + *target = internal->children[internal->size]; + internal->size++; + return 0; +} + +int tmpfs_lookup(struct vnode* dir_node, struct vnode** target, const char* component_name) +{ + // 1. Lookup the vnode in the directory + // 2. Return error code if fails + struct tmpfs_internal *internal = (struct tmpfs_internal*)dir_node->internal; + if(internal->type == FILE_NODE){ + printf("[ERROR] Cannot lookup in a file\n"); + return LERROR; + } + + for(int i=0; ichildren[i]->internal; + if(internal->children[i] != NULL && !strcmp(child_internal->name, component_name)){ + *target = internal->children[i]; + return 0; + } + } + // printf("[ERROR] File not found\n"); + return LERROR; +} + +int tmpfs_list(struct vnode* dir_node) +{ + // 1. List all the files in the directory + // 2. Return error code if fails + + struct tmpfs_internal *internal = (struct tmpfs_internal*)dir_node->internal; + + if(internal->type == FILE_NODE){ + printf("[ERROR] Cannot list in a file\n"); + return LERROR; + } + + for(int i=0; isize; i++){ + struct tmpfs_internal *child_internal = (struct tmpfs_internal*)internal->children[i]->internal; + printf("\r\n"); printf(child_internal->name); printf("\t"); printf(child_internal->type == FILE_NODE ? "FILE" : "DIR"); + } + return 0; +} \ No newline at end of file diff --git a/lab07/kernel/src/vfs.c b/lab07/kernel/src/vfs.c new file mode 100644 index 000000000..c02261188 --- /dev/null +++ b/lab07/kernel/src/vfs.c @@ -0,0 +1,319 @@ +#include "vfs.h" +#include "alloc.h" +#include "string.h" +#include "tmpfs.h" +#include "errno.h" +#include "tmpfs.h" +#include "io.h" + + +struct mount* rootfs; +struct filesystem global_fs[MAX_FILESYSTEM]; +// struct file_descriptor_table global_fd_table; + + +static struct vnode* next_step(struct vnode* start_node, const char* pathname, struct vnode** target_dir); +static struct file* create_file(struct vnode* vnode, int flags); +static char* get_file_name(const char* pathname); + +// void global_fd_table_init() +// { +// for(int i=0; iname = (char*)dynamic_alloc(16); + strcpy(tmpfs->name, "tmpfs"); + + tmpfs->setup_mount = tmpfs_setup_mount; + register_filesystem(tmpfs); + + rootfs = (struct mount*)dynamic_alloc(sizeof(struct mount)); + tmpfs->setup_mount(tmpfs, rootfs); +} + + +int register_filesystem(struct filesystem* fs) { // ensure there is sufficient memory for the filesystem + // register the file system to the kernel. + // you can also initialize memory pool of the file system here. + if(!strcmp(fs->name, "tmpfs")) + { + //initialize memory pool of the file system + return tmpfs_register(); + } + // [TODO] + // else if(!strcmp(fs->name, "initramfs")) + // { + // return initramfs_register(); + // } + return -1; +} + +int vfs_open(const char* pathname, int flags, struct file** target) { + // 1. Lookup pathname + // 2. Create a new file handle for this vnode if found. + // 3. Create a new file if O_CREAT is specified in flags and vnode not found + // lookup error code shows if file exist or not or other error occurs + // 4. Return error code if fails + + struct vnode* vnode; + int ret = vfs_lookup(pathname, &vnode); + if(ret != 0 && flags != O_CREAT){ + printf("[ERROR] Cannot find the file\n"); + return -1; + } + else if(ret == 0 && flags == O_CREAT){ + printf("[ERROR] File already exists\n"); + return -1; + } + else if(flags == O_CREAT){ + struct vnode* target_dir; + vfs_get_node(pathname, &target_dir); + if(target_dir == NULL){ + printf("[ERROR] Cannot find the parent directory\n"); + return -1; + } + + char* file_name = get_file_name(pathname); + + ret = target_dir->v_ops->create(target_dir, &vnode, file_name); + + *target = create_file(vnode, flags); + + if(ret != 0){ + printf("[ERROR] Cannot create the file\n"); + return -1; + } + return ret; + } + + struct file* file = create_file(vnode, flags); + if(vnode->f_ops->open(vnode, &file) != 0){ + printf("[ERROR] Cannot open the file\n"); + return -1; + } + + *target = file; + + return 0; +} + +int vfs_close(struct file* file) { + // 1. release the file handle + // 2. Return error code if fails + int ret = file->f_ops->close(file); + return ret; +} + +int vfs_write(struct file* file, const void* buf, size_t len) { + // 1. write len byte from buf to the opened file. + // 2. return written size or error code if an error occurs. + int ret = file->f_ops->write(file, buf, len); + return ret; +} + +int vfs_read(struct file* file, void* buf, size_t len) { + // 1. read min(len, readable size) byte to buf from the opened file. + // 2. block if nothing to read for FIFO type + // 2. return read size or error code if an error occurs. + int ret = file->f_ops->read(file, buf, len); + return ret; +} + +int vfs_mkdir(const char* pathname) +{ + + struct vnode* target_dir; + struct vnode* vnode = vfs_get_node(pathname, &target_dir); + if(vnode != NULL) + { + printf("[ERROR] Directory already exists\n"); + return CERROR; + } + + if(target_dir == NULL) + { + printf("[ERROR] Cannot find the parent directory\n"); + return CERROR; + } + struct vnode* new_dir; + char* file_name = get_file_name(pathname); + printf("\r\n[MKDIR] pathname: "); printf(pathname); printf(" , filename: "); printf(file_name); + printf("\r\ntarget_dir: "); printf_int(target_dir == rootfs->root); + int ret = target_dir->v_ops->mkdir(target_dir, &new_dir, file_name); + if(ret != 0) + { + printf("[ERROR] Cannot create directory\n"); + return CERROR; + } + return 0; +} + +int vfs_mount(const char* target, const char* filesystem) // mount the filesystem to the target +{ + struct mount* mount_point = (struct mount*)dynamic_alloc(sizeof(struct mount)); + struct filesystem* fs = (struct filesystem*)dynamic_alloc(sizeof(struct filesystem)); + + // int ret = vfs_lookup(target, NULL); + // if(ret == 0) + // { + // printf("[ERROR] Target already exists\n"); + // return CERROR; + // } + + struct vnode* target_dir; + vfs_get_node(target, &target_dir); + if(target_dir == NULL) + { + printf("[ERROR] Cannot find the parent directory\n"); + return CERROR; + } + + fs->name = (char*)dynamic_alloc(16); + if(!strcmp(filesystem, "tmpfs")) + { + + strcpy(fs->name, "tmpfs"); + + fs->setup_mount = tmpfs_setup_mount; + + } + else if(!strcmp(filesystem, "initramfs")) + { + strcpy(fs->name, "tmpfs"); + + // fs->setup_mount = tmpfs_setup_mount; + } + else + { + printf("[ERROR] Filesystem not found\n"); + return CERROR; + } + + register_filesystem(fs); + fs->setup_mount(fs, mount_point); + + target_dir->mount = mount_point; + mount_point->root->parent = target_dir->parent; + + return 0; +} +int vfs_lookup(const char* pathname, struct vnode** target) +{ + struct vnode* vnode = vfs_get_node(pathname, NULL); + if(vnode == NULL) + { + return -1; + } + *target = vnode; + return 0; +} + +int vfs_list(const char* pathname) +{ + struct vnode* vnode; + int ret = vfs_lookup(pathname, &vnode); + + if(ret != 0) + { + printf("[ERROR] Cannot find the directory\n"); + return -1; + } + + ret = vnode->v_ops->list(vnode); + if(ret != 0) + { + printf("[ERROR] Cannot list the directory\n"); + return CERROR; + } + return 0; +} + +struct vnode* vfs_get_node(const char* pathname, struct vnode** target_dir) +{ + struct vnode* start_node; + + if(pathname[0] == '/'){ + start_node = rootfs->root; + return next_step(start_node, pathname+1, target_dir); + } + // else{ // [TODO] relative path + // return next_step(start_node, pathname, target_dir); + // } + return NULL; +} + +static struct vnode* next_step(struct vnode* start_node, const char* pathname, struct vnode** target_dir) +{ + char* tmp_path = (char*)dynamic_alloc(strlen(pathname)+1); + strcpy(tmp_path, pathname); + char* token = strtok(tmp_path, "/"); + // if(strlen(token) == 0) { token = NULL; } + struct vnode* current_node = start_node; + + while(token != NULL){ + *target_dir = current_node; + printf("\r\n[Next Step] token: "); printf(token); + if(!strcmp(token, "..")){ + if(current_node->parent == NULL){ + return NULL; + } + current_node = current_node->parent; + } + else if(!strcmp(token, ".")){ + // do nothing + } + else{ + struct vnode* next_node; + if(current_node->v_ops->lookup(current_node, &next_node, token) != 0){ + return NULL; + } + current_node = next_node; + } + printf("\r\nsame: "); printf_int(current_node->parent == rootfs->root); + token = strtok(NULL, "/"); + } + + return current_node; +} + +static struct file* create_file(struct vnode* vnode, int flags) +{ + struct file* file = (struct file*)dynamic_alloc(sizeof(struct file)); + file->vnode = vnode; + file->f_pos = 0; + file->f_ops = vnode->f_ops; + file->flags = flags; + return file; +} + + +static char* get_file_name(const char* pathname) +{ + char* file_name = (char*)dynamic_alloc(16); + int i; + for(i = strlen(pathname)-1; i >= 0; i--){ + if(pathname[i] == '/'){ + break; + } + } + if(i == -1){ + strcpy(file_name, pathname); + } + else{ + strcpy(file_name, pathname+i+1); + } + return file_name; +} \ No newline at end of file diff --git a/lab07/kernel/src/video.c b/lab07/kernel/src/video.c new file mode 100644 index 000000000..1f9840436 --- /dev/null +++ b/lab07/kernel/src/video.c @@ -0,0 +1,75 @@ +#include "video.h" +#include "cpio.h" +#include "fork.h" +#include "string.h" +#include "io.h" +#include "alloc.h" +#include "lib.h" + +extern struct task_struct *current; +extern void memzero_asm(unsigned long src, unsigned long n); +#ifndef QEMU +extern unsigned long CPIO_START_ADDR_FROM_DT; +#endif + +void start_video(int argc, char *argv[]) +{ + +#ifndef QEMU + cpio_newc_header* head = (void*)(uint64_t)CPIO_START_ADDR_FROM_DT; +#else + cpio_newc_header* head = (void*)(uint64_t)CPIO_ADDR; +#endif + + uint32_t head_size = sizeof(cpio_newc_header); + + char *target_name = "syscall.img"; + + while(1) + { + int namesize = strtol(head->c_namesize, 16, 8); + int filesize = strtol(head->c_filesize, 16, 8); + + char *filename = (void*)head + head_size; + + uint32_t offset = head_size + namesize; + if(offset % 4 != 0) offset = ((offset/4 +1)*4); + + if(strcmp(filename, "TRAILER!!!") == 0){ + printf("\nFile not found"); + break; + } + else if(strcmp(filename, target_name) == 0){ + /* The filedata is appended after filename */ + char *filedata = (void*)head + offset; + + printf("\r\n[INFO] File found: "); printf(target_name); printf(" in CPIO at "); printf_hex((unsigned long)filedata); + printf("\r\n[INFO] File Size: "); printf_hex(filesize); + + void* user_program_addr = balloc(filesize+THREAD_SIZE); // extra page in case + if(user_program_addr == NULL) return; + memzero_asm((unsigned long)user_program_addr, filesize+THREAD_SIZE); + for(int i=0; istate = TASK_STOPPED; + + unsigned long tmp; + asm volatile("mrs %0, cntkctl_el1" : "=r"(tmp)); + tmp |= 1; + asm volatile("msr cntkctl_el1, %0" : : "r"(tmp)); + + copy_process(PF_KTHREAD, (unsigned long)&kp_user_mode, (unsigned long)user_program_addr, 0); + + preempt_enable(); + break; + } + + if(filesize % 4 != 0) filesize = (filesize/4 +1)*4; + head = (void*)head + offset + filesize; + } + return; +} \ No newline at end of file From 723457b4360d869255999ea7a5f4ab7ff6e1e01c Mon Sep 17 00:00:00 2001 From: yui0303 Date: Sun, 9 Jun 2024 22:01:13 +0800 Subject: [PATCH 05/17] feat: add cwd --- lab07/kernel/include/schedule.h | 4 ++- lab07/kernel/src/alloc.c | 2 +- lab07/kernel/src/fork.c | 1 + lab07/kernel/src/shell.c | 11 +++++++- lab07/kernel/src/tmpfs.c | 32 ++++++++++----------- lab07/kernel/src/vfs.c | 49 +++++++++++++++++++-------------- 6 files changed, 59 insertions(+), 40 deletions(-) diff --git a/lab07/kernel/include/schedule.h b/lab07/kernel/include/schedule.h index dd35ba820..8728083ff 100644 --- a/lab07/kernel/include/schedule.h +++ b/lab07/kernel/include/schedule.h @@ -48,6 +48,7 @@ struct task_struct { unsigned long stack; unsigned long flags; int pid; + char* cwd; }; extern void sched_init(void); @@ -64,7 +65,8 @@ extern void exit_process(void); #define INIT_TASK \ /*cpu_context*/ { {0,0,0,0,0,0,0,0,0,0,0,0,0}, \ -/* state etc */ 0,0,1, 0, 0, PF_KTHREAD, 0\ +/* state etc */ 0,0,1, 0, 0, PF_KTHREAD, 0, \ +/* cwd */ "/" \ } #endif diff --git a/lab07/kernel/src/alloc.c b/lab07/kernel/src/alloc.c index 747ba6ffe..d42eb9fe1 100644 --- a/lab07/kernel/src/alloc.c +++ b/lab07/kernel/src/alloc.c @@ -659,7 +659,7 @@ void* dynamic_alloc(uint64_t size) // printf(" in Frame: "); printf_int(((struct frame_t*)memory_pool->frame_base_addrs[memory_pool->frame_used - 1])->index); res = memory_pool->frame_base_addrs[memory_pool->frame_used - 1] + memory_pool->chunk_offset * memory_pool->size; - printf("\r\n[SYSTEM INFO] Allocate Chunk at address: "); printf_hex((uint64_t)res); + printf("\r\n[SYSTEM INFO] Allocate Chunk at address: "); printf_hex((uint64_t)res); printf(", in Frame: "); printf_int(((uint64_t)res - MALLOC_START_ADDR) >> 12); memory_pool->chunk_offset++; memory_pool->chunk_used++; diff --git a/lab07/kernel/src/fork.c b/lab07/kernel/src/fork.c index 1ceaea029..df4def9aa 100644 --- a/lab07/kernel/src/fork.c +++ b/lab07/kernel/src/fork.c @@ -66,6 +66,7 @@ int copy_process( p->state = TASK_RUNNING; p->counter = p->priority; p->preempt_count = 1; //disable preemtion until schedule_tail + p->cwd = current->cwd; p->cpu_context.pc = (unsigned long)ret_from_fork; // for the first time, pc is set to ret_from_fork diff --git a/lab07/kernel/src/shell.c b/lab07/kernel/src/shell.c index feba5bfdf..608fdbeb3 100644 --- a/lab07/kernel/src/shell.c +++ b/lab07/kernel/src/shell.c @@ -24,6 +24,7 @@ static void multiple_thread_test(int argc, char *argv[]); static void to_user_test(int argc, char *argv[]); static void rootfs_ls(int argc, char *argv[]); static void rootfs_mkdir(int argc, char *argv[]); +static void print_cwd(int argc, char *argv[]); extern void cpio_list(int argc, char *argv[]); extern void cpio_cat(int argc, char *argv[]); @@ -55,7 +56,8 @@ cmd cmds[] = {.name = "multi_thread", .func = &multiple_thread_test, .help_msg = "\nmulti_thread\t: test multiple threads"}, {.name = "to_user", .func = &to_user_test, .help_msg = "\nto_user\t: test user mode"}, {.name = "start_video", .func = &start_video, .help_msg = "\nstart_video\t: start video"}, - {.name = "fl", .func= &print_flist, .help_msg = "\nfl\t: print free list"} + {.name = "fl", .func= &print_flist, .help_msg = "\nfl\t: print free list"}, + {.name = "cwd", .func=&print_cwd, .help_msg = "\ncwd\t: print current workding directroy"} }; static void shell() @@ -241,6 +243,13 @@ static void rootfs_mkdir(int argc, char *argv[]) } } + +static void print_cwd(int argc, char *argv[]) +{ + printf("\nCurrent Working Directory: "); + printf(current->cwd); +} + void readcmd(char x[256]) { char input_char; diff --git a/lab07/kernel/src/tmpfs.c b/lab07/kernel/src/tmpfs.c index f23b6f361..d5368b393 100644 --- a/lab07/kernel/src/tmpfs.c +++ b/lab07/kernel/src/tmpfs.c @@ -23,7 +23,7 @@ static struct vnode* tmpfs_create_vnode(const char *name, int type, struct vnode struct tmpfs_internal *internal = (struct tmpfs_internal*)dynamic_alloc(sizeof(struct tmpfs_internal)); if(sizeof(name) > COMPONENT_SIZE){ - printf("[ERROR] File name too long\n"); + printf("\r\n[ERROR] File name too long"); return NULL; } internal->name = (char*)dynamic_alloc(COMPONENT_SIZE); @@ -59,12 +59,12 @@ int tmpfs_register() { if(global_fs[i].name == NULL)break; if(!strcmp(global_fs[i].name, "tmpfs")){ - printf("[ERROR] tmpfs already registered\n"); + printf("\r\n[ERROR] tmpfs already registered"); return -1; } } if(i == MAX_FILESYSTEM){ - printf("[ERROR] No space for new filesystem\n"); + printf("\r\n[ERROR] No space for new filesystem"); return -1; } @@ -99,12 +99,12 @@ int tmpfs_write(struct file* file, const void* buf, size_t len) struct vnode *vnode = file->vnode; struct tmpfs_internal *internal = (struct tmpfs_internal*)vnode->internal; if(internal->type == DIR_NODE){ - printf("[ERROR] Cannot write to a directory\n"); + printf("\r\n[ERROR] Cannot write to a directory"); return WERROR; } if(file->f_pos + len > TMPFS_MAX_FILE){ - printf("[ERROR] File size exceeded\n"); + printf("\r\n[ERROR] File size exceeded"); return WERROR; } @@ -130,7 +130,7 @@ int tmpfs_read(struct file* file, void* buf, size_t len) struct vnode *vnode = file->vnode; struct tmpfs_internal *internal = (struct tmpfs_internal*)vnode->internal; if(internal->type == DIR_NODE){ - printf("[ERROR] Cannot read a directory\n"); + printf("\r\n[ERROR] Cannot read a directory"); return RERROR; } @@ -154,7 +154,7 @@ int tmpfs_close(struct file* file) // 1. release the file handle // 2. Return error code if fails if(file == NULL){ - printf("[ERROR] File pointer cannot be NULL\n"); + printf("\r\n[ERROR] File pointer cannot be NULL"); return CERROR; } return 0; // vfs_close will free the file pointer @@ -169,12 +169,12 @@ int tmpfs_create(struct vnode* dir_node, struct vnode** target, const char* comp // 2. Return error code if fails struct tmpfs_internal *internal = (struct tmpfs_internal*)dir_node->internal; if(internal->type == FILE_NODE){ - printf("[ERROR] Cannot create file in a file\n"); + printf("\r\n[ERROR] Cannot create file in a file"); return CERROR; } if(strlen(component_name) > COMPONENT_SIZE){ - printf("[ERROR] File name too long\n"); + printf("\r\n[ERROR] File name too long"); return CERROR; } @@ -186,7 +186,7 @@ int tmpfs_create(struct vnode* dir_node, struct vnode** target, const char* comp // } // } if(internal->size + 1 > ENTRIES_PER_DIR){ - printf("[ERROR] No space for new file\n"); + printf("\r\n[ERROR] No space for new file"); return CERROR; } internal->children[internal->size] = tmpfs_create_vnode(component_name, FILE_NODE, dir_node); @@ -199,15 +199,15 @@ int tmpfs_mkdir(struct vnode* dir_node, struct vnode** target, const char* compo { // 1. Create a new directory in the directory // 2. Return error code if fails - printf("\r\ntmpfs mkdir"); + struct tmpfs_internal *internal = (struct tmpfs_internal*)dir_node->internal; if(internal->type == FILE_NODE){ - printf("[ERROR] Cannot create directory in a file\n"); + printf("\r\n[ERROR] Cannot create directory in a file"); return CERROR; } if(strlen(component_name) > COMPONENT_SIZE){ - printf("[ERROR] Directory name too long\n"); + printf("\r\n[ERROR] Directory name too long"); return CERROR; } @@ -219,7 +219,7 @@ int tmpfs_mkdir(struct vnode* dir_node, struct vnode** target, const char* compo // } // } if(internal->size + 1 > ENTRIES_PER_DIR){ - printf("[ERROR] No space for new directory\n"); + printf("\r\n[ERROR] No space for new directory"); return CERROR; } internal->children[internal->size] = tmpfs_create_vnode(component_name, DIR_NODE, dir_node); @@ -234,7 +234,7 @@ int tmpfs_lookup(struct vnode* dir_node, struct vnode** target, const char* comp // 2. Return error code if fails struct tmpfs_internal *internal = (struct tmpfs_internal*)dir_node->internal; if(internal->type == FILE_NODE){ - printf("[ERROR] Cannot lookup in a file\n"); + printf("\r\n[ERROR] Cannot lookup in a file"); return LERROR; } @@ -257,7 +257,7 @@ int tmpfs_list(struct vnode* dir_node) struct tmpfs_internal *internal = (struct tmpfs_internal*)dir_node->internal; if(internal->type == FILE_NODE){ - printf("[ERROR] Cannot list in a file\n"); + printf("\r\n[ERROR] Cannot list in a file"); return LERROR; } diff --git a/lab07/kernel/src/vfs.c b/lab07/kernel/src/vfs.c index c02261188..7612036be 100644 --- a/lab07/kernel/src/vfs.c +++ b/lab07/kernel/src/vfs.c @@ -5,7 +5,9 @@ #include "errno.h" #include "tmpfs.h" #include "io.h" +#include "schedule.h" +extern struct task_struct* current; struct mount* rootfs; struct filesystem global_fs[MAX_FILESYSTEM]; @@ -71,18 +73,18 @@ int vfs_open(const char* pathname, int flags, struct file** target) { struct vnode* vnode; int ret = vfs_lookup(pathname, &vnode); if(ret != 0 && flags != O_CREAT){ - printf("[ERROR] Cannot find the file\n"); + printf("\r\n[ERROR] Cannot find the file"); return -1; } else if(ret == 0 && flags == O_CREAT){ - printf("[ERROR] File already exists\n"); + printf("\r\n[ERROR] File already exists"); return -1; } else if(flags == O_CREAT){ struct vnode* target_dir; vfs_get_node(pathname, &target_dir); if(target_dir == NULL){ - printf("[ERROR] Cannot find the parent directory\n"); + printf("\r\n[ERROR] Cannot find the parent directory"); return -1; } @@ -93,7 +95,7 @@ int vfs_open(const char* pathname, int flags, struct file** target) { *target = create_file(vnode, flags); if(ret != 0){ - printf("[ERROR] Cannot create the file\n"); + printf("\r\n[ERROR] Cannot create the file"); return -1; } return ret; @@ -101,7 +103,7 @@ int vfs_open(const char* pathname, int flags, struct file** target) { struct file* file = create_file(vnode, flags); if(vnode->f_ops->open(vnode, &file) != 0){ - printf("[ERROR] Cannot open the file\n"); + printf("\r\n[ERROR] Cannot open the file"); return -1; } @@ -139,25 +141,27 @@ int vfs_mkdir(const char* pathname) struct vnode* vnode = vfs_get_node(pathname, &target_dir); if(vnode != NULL) { - printf("[ERROR] Directory already exists\n"); + printf("\r\n[ERROR] Directory already exists"); return CERROR; } if(target_dir == NULL) { - printf("[ERROR] Cannot find the parent directory\n"); + printf("\r\n[ERROR] Cannot find the parent directory"); return CERROR; } struct vnode* new_dir; char* file_name = get_file_name(pathname); printf("\r\n[MKDIR] pathname: "); printf(pathname); printf(" , filename: "); printf(file_name); - printf("\r\ntarget_dir: "); printf_int(target_dir == rootfs->root); + int ret = target_dir->v_ops->mkdir(target_dir, &new_dir, file_name); if(ret != 0) { - printf("[ERROR] Cannot create directory\n"); + printf("\r\n[ERROR] Cannot create directory"); + dfree(file_name); return CERROR; } + dfree(file_name); return 0; } @@ -177,7 +181,7 @@ int vfs_mount(const char* target, const char* filesystem) // mount the filesyste vfs_get_node(target, &target_dir); if(target_dir == NULL) { - printf("[ERROR] Cannot find the parent directory\n"); + printf("\r\n[ERROR] Cannot find the parent directory"); return CERROR; } @@ -198,7 +202,7 @@ int vfs_mount(const char* target, const char* filesystem) // mount the filesyste } else { - printf("[ERROR] Filesystem not found\n"); + printf("\r\n[ERROR] Filesystem not found"); return CERROR; } @@ -228,14 +232,14 @@ int vfs_list(const char* pathname) if(ret != 0) { - printf("[ERROR] Cannot find the directory\n"); + printf("\r\n[ERROR] Cannot find the directory"); return -1; } ret = vnode->v_ops->list(vnode); if(ret != 0) { - printf("[ERROR] Cannot list the directory\n"); + printf("\r\n[ERROR] Cannot list the directory"); return CERROR; } return 0; @@ -249,9 +253,10 @@ struct vnode* vfs_get_node(const char* pathname, struct vnode** target_dir) start_node = rootfs->root; return next_step(start_node, pathname+1, target_dir); } - // else{ // [TODO] relative path - // return next_step(start_node, pathname, target_dir); - // } + else{ // [TODO] relative path + start_node = vfs_get_node(current->cwd, NULL); + return next_step(start_node, pathname, target_dir); + } return NULL; } @@ -265,10 +270,10 @@ static struct vnode* next_step(struct vnode* start_node, const char* pathname, s while(token != NULL){ *target_dir = current_node; - printf("\r\n[Next Step] token: "); printf(token); if(!strcmp(token, "..")){ if(current_node->parent == NULL){ - return NULL; + current_node = NULL; + goto next_step_end; } current_node = current_node->parent; } @@ -278,14 +283,16 @@ static struct vnode* next_step(struct vnode* start_node, const char* pathname, s else{ struct vnode* next_node; if(current_node->v_ops->lookup(current_node, &next_node, token) != 0){ - return NULL; + current_node = NULL; + goto next_step_end; } current_node = next_node; } - printf("\r\nsame: "); printf_int(current_node->parent == rootfs->root); + // printf("\r\nsame: "); printf_int(current_node->parent == rootfs->root); token = strtok(NULL, "/"); } - +next_step_end: + dfree(tmp_path); return current_node; } From 47ecdebc97a9b7c0e63a5c3400906411e0c654d9 Mon Sep 17 00:00:00 2001 From: yui0303 Date: Mon, 10 Jun 2024 04:24:18 +0800 Subject: [PATCH 06/17] feat: add chdir and fix the problem of cwd --- lab07/kernel/include/schedule.h | 4 +- lab07/kernel/include/vfs.h | 2 + lab07/kernel/src/alloc.c | 7 +- lab07/kernel/src/fork.c | 4 +- lab07/kernel/src/shell.c | 19 +++++- lab07/kernel/src/string.c | 1 + lab07/kernel/src/vfs.c | 112 ++++++++++++++++++++++++++++++++ 7 files changed, 143 insertions(+), 6 deletions(-) diff --git a/lab07/kernel/include/schedule.h b/lab07/kernel/include/schedule.h index 8728083ff..317da8574 100644 --- a/lab07/kernel/include/schedule.h +++ b/lab07/kernel/include/schedule.h @@ -19,6 +19,8 @@ #define PF_KTHREAD 2 +#define MAX_PATH_LEN 256 + extern struct task_struct *current; extern struct task_struct * task[NR_TASKS]; extern int nr_tasks; @@ -48,7 +50,7 @@ struct task_struct { unsigned long stack; unsigned long flags; int pid; - char* cwd; + char cwd[MAX_PATH_LEN]; }; extern void sched_init(void); diff --git a/lab07/kernel/include/vfs.h b/lab07/kernel/include/vfs.h index 69b83e3ac..84aeb4279 100644 --- a/lab07/kernel/include/vfs.h +++ b/lab07/kernel/include/vfs.h @@ -10,6 +10,7 @@ #define MAX_OPEN_FILE 16 #define OFFSET_FD 3 // 0, 1, 2 are reserved for stdin, stdout, stderr #define O_CREAT 00000100 +#define MAX_PATH_LEN 256 struct vnode { struct vnode* parent; @@ -65,6 +66,7 @@ int vfs_mkdir(const char* pathname); int vfs_mount(const char* target, const char* filesystem); int vfs_lookup(const char* pathname, struct vnode** target); int vfs_list(const char* pathname); +int vfs_chdir(const char* relative_path); extern struct mount* rootfs; extern struct filesystem global_fs[MAX_FILESYSTEM]; diff --git a/lab07/kernel/src/alloc.c b/lab07/kernel/src/alloc.c index d42eb9fe1..8b0de8b71 100644 --- a/lab07/kernel/src/alloc.c +++ b/lab07/kernel/src/alloc.c @@ -2,6 +2,7 @@ #include "mem.h" #include "io.h" #include "lib.h" +#include "mm.h" #define UNUSED(x) (void)(x) @@ -627,7 +628,9 @@ void* dynamic_alloc(uint64_t size) if(memory_pool->free_chunk != NULL) { res = memory_pool->free_chunk; + memzero_asm(res, memory_pool->size); memory_pool->free_chunk = memory_pool->free_chunk->next; // point to the next free chunk + printf("\r\n[SYSTEM INFO] Allocate Chunk at address: "); printf_hex((uint64_t)res); printf(", in Frame: "); printf_int(((uint64_t)res - MALLOC_START_ADDR) >> 12); return res; } @@ -655,14 +658,14 @@ void* dynamic_alloc(uint64_t size) memory_pool->chunk_offset = 0; } - printf("\r\n[SYSTEM INFO] Allocate Chunk in Memory Pool with size: "); printf_int(memory_pool->size); + // printf("\r\n[SYSTEM INFO] Allocate Chunk in Memory Pool with size: "); printf_int(memory_pool->size); // printf(" in Frame: "); printf_int(((struct frame_t*)memory_pool->frame_base_addrs[memory_pool->frame_used - 1])->index); res = memory_pool->frame_base_addrs[memory_pool->frame_used - 1] + memory_pool->chunk_offset * memory_pool->size; printf("\r\n[SYSTEM INFO] Allocate Chunk at address: "); printf_hex((uint64_t)res); printf(", in Frame: "); printf_int(((uint64_t)res - MALLOC_START_ADDR) >> 12); memory_pool->chunk_offset++; memory_pool->chunk_used++; - + memzero_asm(res, memory_pool->size); return res; } diff --git a/lab07/kernel/src/fork.c b/lab07/kernel/src/fork.c index df4def9aa..70e75aece 100644 --- a/lab07/kernel/src/fork.c +++ b/lab07/kernel/src/fork.c @@ -3,6 +3,8 @@ #include "schedule.h" #include "io.h" #include "mm.h" +#include "vfs.h" +#include "string.h" extern void ret_from_fork(void); extern int nr_tasks; @@ -66,7 +68,7 @@ int copy_process( p->state = TASK_RUNNING; p->counter = p->priority; p->preempt_count = 1; //disable preemtion until schedule_tail - p->cwd = current->cwd; + strcpy(p->cwd, current->cwd); p->cpu_context.pc = (unsigned long)ret_from_fork; // for the first time, pc is set to ret_from_fork diff --git a/lab07/kernel/src/shell.c b/lab07/kernel/src/shell.c index 608fdbeb3..ab845368a 100644 --- a/lab07/kernel/src/shell.c +++ b/lab07/kernel/src/shell.c @@ -25,6 +25,7 @@ static void to_user_test(int argc, char *argv[]); static void rootfs_ls(int argc, char *argv[]); static void rootfs_mkdir(int argc, char *argv[]); static void print_cwd(int argc, char *argv[]); +static void change_dir(int argc, char *argv[]); extern void cpio_list(int argc, char *argv[]); extern void cpio_cat(int argc, char *argv[]); @@ -57,7 +58,8 @@ cmd cmds[] = {.name = "to_user", .func = &to_user_test, .help_msg = "\nto_user\t: test user mode"}, {.name = "start_video", .func = &start_video, .help_msg = "\nstart_video\t: start video"}, {.name = "fl", .func= &print_flist, .help_msg = "\nfl\t: print free list"}, - {.name = "cwd", .func=&print_cwd, .help_msg = "\ncwd\t: print current workding directroy"} + {.name = "cwd", .func=&print_cwd, .help_msg = "\ncwd\t: print current workding directroy"}, + {.name = "cd", .func=&change_dir, .help_msg = "\ncd\t: change the directory"} }; static void shell() @@ -220,7 +222,7 @@ static void reboot(int argc, char **argv) static void rootfs_ls(int argc, char *argv[]) { if(argc == 1){ - vfs_list("/"); + vfs_list(current->cwd); } else if(argc == 2){ vfs_list(argv[1]); @@ -250,6 +252,19 @@ static void print_cwd(int argc, char *argv[]) printf(current->cwd); } + + +static void change_dir(int argc, char *argv[]) +{ + if(argc == 2){ + vfs_chdir(argv[1]); + } + else{ + printf("\nUsage: cd [path]"); + return; + } +} + void readcmd(char x[256]) { char input_char; diff --git a/lab07/kernel/src/string.c b/lab07/kernel/src/string.c index 35b3778cd..dd7d84e6c 100644 --- a/lab07/kernel/src/string.c +++ b/lab07/kernel/src/string.c @@ -57,6 +57,7 @@ char *strtok(char* str, const char* delim) if(*p == *delim){ *p = '\0'; p++; + if(ret[0] == 0) return NULL; return ret; } p++; diff --git a/lab07/kernel/src/vfs.c b/lab07/kernel/src/vfs.c index 7612036be..9e0fa7266 100644 --- a/lab07/kernel/src/vfs.c +++ b/lab07/kernel/src/vfs.c @@ -17,6 +17,7 @@ struct filesystem global_fs[MAX_FILESYSTEM]; static struct vnode* next_step(struct vnode* start_node, const char* pathname, struct vnode** target_dir); static struct file* create_file(struct vnode* vnode, int flags); static char* get_file_name(const char* pathname); +static void simplify_path(char* pathname); // void global_fd_table_init() // { @@ -245,6 +246,44 @@ int vfs_list(const char* pathname) return 0; } + +int vfs_chdir(const char* relative_path) +{ + char* current_abs_path = current->cwd; + char* new_abs_path = (char*)dynamic_alloc(strlen(current_abs_path) + strlen(relative_path) + 4); + strcpy(new_abs_path, current_abs_path); + if(relative_path[0] == '/'){ // absolute path + strcpy(new_abs_path, relative_path); + } + else{ // relative path + strcpy(new_abs_path, current_abs_path); + strcpy(new_abs_path + strlen(current_abs_path), relative_path); + } + + if(new_abs_path[strlen(new_abs_path)-1] != '/'){ // add '/' at the end + new_abs_path[strlen(new_abs_path)] = '/'; + new_abs_path[strlen(new_abs_path)+1] = '\0'; + } + + // printf("\r\n[CHDIR] new_abs_path: "); printf(new_abs_path); + struct vnode* vnode = vfs_get_node(new_abs_path, NULL); + + if(vnode == NULL) + { + printf("\r\n[ERROR] Cannot find the directory"); + return CERROR; + } + + simplify_path(new_abs_path); + printf("\r\n[CHDIR] new_abs_path(simplified): "); printf(new_abs_path); + + preempt_enable(); + strcpy(current->cwd, new_abs_path); + preempt_disable(); + + return 0; +} + struct vnode* vfs_get_node(const char* pathname, struct vnode** target_dir) { struct vnode* start_node; @@ -323,4 +362,77 @@ static char* get_file_name(const char* pathname) strcpy(file_name, pathname+i+1); } return file_name; +} + +static void simplify_path(char* pathname) +{ + + printf("\r\n"); printf(__func__); + #define MAX_SEGMENTS 256 + + char* tmp_path = (char*)dynamic_alloc(strlen(pathname)+1); + char* new_path = (char*)dynamic_alloc(strlen(pathname)+1); + + strcpy(tmp_path, pathname); + + char* segments[MAX_SEGMENTS]; + int n_segments = 0; + + char* token = strtok(tmp_path, "/"); + int isFirst = 1; // avoid the first NULL token + while(token != NULL || isFirst == 1){ + isFirst = 0; + if(token != NULL){ + segments[n_segments] = (char*)dynamic_alloc(strlen(token)+1); + // printf("\r\nsegment at: "); printf_hex(segments[n_segments]); printf(" , "); printf_int(n_segments); + strcpy(segments[n_segments++], token); + } + token = strtok(NULL, "/"); + } + + // printf("\r\n"); printf(segments[0]); printf_hex((void*)segments[0]); + + // for(int i=0; i 0){ + need_idx--; + } + } + else{ + need_segment[need_idx++] = i; + } + } + + // printf("\r\n[DEBUG] need_idx: "); printf_int(need_idx); + + for(int i=0; i Date: Mon, 10 Jun 2024 19:03:53 +0800 Subject: [PATCH 07/17] feat: add initramfs --- lab07/kernel/include/cpio.h | 5 + lab07/kernel/include/initramfs.h | 33 +++++ lab07/kernel/include/tmpfs.h | 2 +- lab07/kernel/include/vfs.h | 2 +- lab07/kernel/src/alloc.c | 4 +- lab07/kernel/src/cpio.c | 29 ++++ lab07/kernel/src/initramfs.c | 234 +++++++++++++++++++++++++++++++ lab07/kernel/src/shell.c | 14 ++ lab07/kernel/src/sys.c | 6 +- lab07/kernel/src/tmpfs.c | 8 +- lab07/kernel/src/vfs.c | 63 +++++++-- lab07/kernel/src/video.c | 6 +- 12 files changed, 382 insertions(+), 24 deletions(-) create mode 100644 lab07/kernel/include/initramfs.h create mode 100644 lab07/kernel/src/initramfs.c diff --git a/lab07/kernel/include/cpio.h b/lab07/kernel/include/cpio.h index f19594b2f..4d6102060 100644 --- a/lab07/kernel/include/cpio.h +++ b/lab07/kernel/include/cpio.h @@ -32,6 +32,11 @@ void cpio_exec(int argc, char **argv); #ifndef QEMU void initramfs_callback(char* node_name, char* property_name, fdt_prop* prop); + +extern uint64_t CPIO_START_ADDR_FROM_DT; +extern uint64_t CPIO_END_ADDR_FROM_DT; #endif +int cpio_newc_parser(cpio_newc_header** head, char** filename, char** filedata); + #endif \ No newline at end of file diff --git a/lab07/kernel/include/initramfs.h b/lab07/kernel/include/initramfs.h new file mode 100644 index 000000000..13cadfca2 --- /dev/null +++ b/lab07/kernel/include/initramfs.h @@ -0,0 +1,33 @@ +#ifndef __INITRAMFS_H__ +#define __INITRAMFS_H__ + +#define COMPONENT_SIZE 15 +#define ENTRIES_PER_DIR 16 +#define INITRAMFS_MAX_FILE 4096 + +#include "vfs.h" +#include "cpio.h" + +struct initramfs_internal { + char* name; // file name or directory name + unsigned long size; // child count for directory + char* data; + int type; // DIR_NODE or FILE_NODE + // struct vnode* parent; + struct vnode* children[ENTRIES_PER_DIR]; + // struct vnode* next; +}; + +int initramfs_list(struct vnode* dir_node); +int initramfs_lookup(struct vnode* dir_node, struct vnode** target, const char* component_name); +int initramfs_mkdir(struct vnode* dir_node, struct vnode** target, const char* component_name); +int initramfs_create(struct vnode* dir_node, struct vnode** target, const char* component_name); +int initramfs_close(struct file* file); +int initramfs_open(struct vnode* file_node, struct file** target); +int initramfs_read(struct file* file, void* buf, size_t len); +int initramfs_write(struct file* file, const void* buf, size_t len); +int initramfs_setup_mount(struct filesystem* fs, struct mount** mount); +int initramfs_register(); +// int parse_initramfs(); + +#endif \ No newline at end of file diff --git a/lab07/kernel/include/tmpfs.h b/lab07/kernel/include/tmpfs.h index 2ed05d345..e9d633295 100644 --- a/lab07/kernel/include/tmpfs.h +++ b/lab07/kernel/include/tmpfs.h @@ -25,7 +25,7 @@ int tmpfs_close(struct file* file); int tmpfs_open(struct vnode* file_node, struct file** target); int tmpfs_read(struct file* file, void* buf, size_t len); int tmpfs_write(struct file* file, const void* buf, size_t len); -int tmpfs_setup_mount(struct filesystem* fs, struct mount* mount); +int tmpfs_setup_mount(struct filesystem* fs, struct mount** mount); int tmpfs_register(); #endif \ No newline at end of file diff --git a/lab07/kernel/include/vfs.h b/lab07/kernel/include/vfs.h index 84aeb4279..383534ec8 100644 --- a/lab07/kernel/include/vfs.h +++ b/lab07/kernel/include/vfs.h @@ -35,7 +35,7 @@ struct mount { struct filesystem { char* name; - int (*setup_mount)(struct filesystem* fs, struct mount* mount); + int (*setup_mount)(struct filesystem* fs, struct mount** mount); }; struct file_operations { diff --git a/lab07/kernel/src/alloc.c b/lab07/kernel/src/alloc.c index 8b0de8b71..5ccf2efc8 100644 --- a/lab07/kernel/src/alloc.c +++ b/lab07/kernel/src/alloc.c @@ -628,7 +628,7 @@ void* dynamic_alloc(uint64_t size) if(memory_pool->free_chunk != NULL) { res = memory_pool->free_chunk; - memzero_asm(res, memory_pool->size); + memzero_asm((uint64_t)res, memory_pool->size); memory_pool->free_chunk = memory_pool->free_chunk->next; // point to the next free chunk printf("\r\n[SYSTEM INFO] Allocate Chunk at address: "); printf_hex((uint64_t)res); printf(", in Frame: "); printf_int(((uint64_t)res - MALLOC_START_ADDR) >> 12); return res; @@ -665,7 +665,7 @@ void* dynamic_alloc(uint64_t size) printf("\r\n[SYSTEM INFO] Allocate Chunk at address: "); printf_hex((uint64_t)res); printf(", in Frame: "); printf_int(((uint64_t)res - MALLOC_START_ADDR) >> 12); memory_pool->chunk_offset++; memory_pool->chunk_used++; - memzero_asm(res, memory_pool->size); + memzero_asm((uint64_t)res, memory_pool->size); return res; } diff --git a/lab07/kernel/src/cpio.c b/lab07/kernel/src/cpio.c index ee3cce41b..35458a2ce 100644 --- a/lab07/kernel/src/cpio.c +++ b/lab07/kernel/src/cpio.c @@ -162,6 +162,35 @@ void cpio_exec(int argc, char **argv) } +int cpio_newc_parser(cpio_newc_header** head, char** pathname, char** filedata) +{ + int ret = 1; + int namesize = strtol((*head)->c_namesize, 16, 8); + int filesize = strtol((*head)->c_filesize, 16, 8); + // *c_mode = (*head)->c_mode; + + uint32_t head_size = sizeof(cpio_newc_header); + + char *filename = (void*)(*head) + head_size; + *pathname = filename; + + uint32_t offset = head_size + namesize; + if(offset % 4 != 0) offset = ((offset/4 +1)*4); + + if(strcmp(filename, "TRAILER!!!") == 0){ + // do nothing + } + else{ + /* The filedata is appended after filename */ + *filedata = (void*)(*head) + offset; + ret = 0; + } + + if(filesize % 4 != 0) filesize = (filesize/4 +1)*4; + *head = (void*)(*head) + offset + filesize; + return ret; +} + #ifndef QEMU void initramfs_callback(char* node_name, char* property_name, fdt_prop* prop) { diff --git a/lab07/kernel/src/initramfs.c b/lab07/kernel/src/initramfs.c new file mode 100644 index 000000000..394209064 --- /dev/null +++ b/lab07/kernel/src/initramfs.c @@ -0,0 +1,234 @@ +#include "initramfs.h" +#include "alloc.h" +#include "errno.h" +#include "io.h" +#include "string.h" +#include "lib.h" +#include "cpio.h" + +struct vnode_operations *initramfs_v_ops; +struct file_operations *initramfs_f_ops; + + +static struct vnode* initramfs_create_vnode(const char *name, int type, struct vnode *parent); +static int isFileInSubDir(const char* pathname); + +int initramfs_setup_mount(struct filesystem* fs, struct mount **mount) // mount the filesystem to the mount point +{ + (*mount)->fs = fs; + (*mount)->root = initramfs_create_vnode("/", DIR_NODE, NULL); + +#ifndef QEMU + cpio_newc_header* head = (void*)(uint64_t)CPIO_START_ADDR_FROM_DT; +#else + cpio_newc_header* head = (void*)(uint64_t)CPIO_ADDR; +#endif + // vfs_chdir("/initramfs"); + while(1) + { + char* pathname; + char* filedata; + char c_mode[5]; + strncpy(c_mode, head->c_mode, 5); + int ret = cpio_newc_parser(&head, &pathname, &filedata); + if(ret == 1)break; + // printf("\r\n[INITRAMFS INFO] Mount Archive: "); printf(pathname); printf("\t, cmode: "); printf(c_mode); + struct initramfs_internal *root_internal = (struct initramfs_internal*)(*mount)->root->internal; + + if(!strcmp(c_mode, "00008")){ // file + if(!strcmp(pathname, ".") || !strcmp(pathname, "..") || isFileInSubDir(pathname))continue; + struct vnode *filevnode = initramfs_create_vnode(pathname, FILE_NODE, (*mount)->root); + struct initramfs_internal *fileinode = (struct initramfs_internal*)filevnode->internal; + fileinode->data = filedata; + fileinode->size = 0; + root_internal->children[root_internal->size++] = filevnode; + printf("\r\n[INITRAMFS INFO] Mount Archive: "); printf(pathname); printf("\t, cmode: "); printf(c_mode); + } + else if(!strcmp(c_mode, "00004")){ // directory + // cannot create directory in initramfs + } + else{ + printf("\r\n[ERROR] Unsupported file type"); + return -1; + } + } + printf("\r\n[INITRAMFS INFO] Mounting complete"); + + return 0; +} + +static struct vnode* initramfs_create_vnode(const char *name, int type, struct vnode *parent) +{ + struct initramfs_internal *internal = (struct initramfs_internal*)dynamic_alloc(sizeof(struct initramfs_internal)); + + if(sizeof(name) > COMPONENT_SIZE){ + printf("\r\n[ERROR] File name too long"); + return NULL; + } + internal->name = (char*)dynamic_alloc(COMPONENT_SIZE); + strcpy(internal->name, name); + internal->size = 0; + if(type == FILE_NODE){ + internal->data = (char*)dynamic_alloc(INITRAMFS_MAX_FILE); + } + else{ + internal->data = NULL; + } + internal->type = type; + // internal->parent = parent; + // internal->next = NULL; + for(int i=0; ichildren[i] = NULL; + } + struct vnode *vnode = (struct vnode*)dynamic_alloc(sizeof(struct vnode)); + vnode->parent = parent; + vnode->mount = NULL; + vnode->v_ops = initramfs_v_ops; + vnode->f_ops = initramfs_f_ops; + vnode->internal = internal; + return vnode; +} + +int initramfs_register() +{ + // check if tmpfs already registered + int i=0; + for(; ilookup = initramfs_lookup; + initramfs_v_ops->list = initramfs_list; + initramfs_v_ops->create = initramfs_create; + initramfs_v_ops->mkdir = initramfs_mkdir; + + initramfs_f_ops->open = initramfs_open; + initramfs_f_ops->read = initramfs_read; + initramfs_f_ops->write = initramfs_write; + initramfs_f_ops->close = initramfs_close; + + return 0; +} + +int initramfs_list(struct vnode* dir_node) +{ + // 1. List all the files in the directory + // 2. Return error code if fails + + printf("\r\n[INITRAMFS LIST]"); + struct initramfs_internal *internal = (struct initramfs_internal*)dir_node->internal; + + if(internal->type == FILE_NODE){ + printf("\r\n[ERROR] Cannot list in a file"); + return LERROR; + } + + + for(int i=0; isize; i++){ + struct initramfs_internal *child_internal = (struct initramfs_internal*)internal->children[i]->internal; + printf("\r\n"); printf(child_internal->name); printf("\t"); printf(child_internal->type == FILE_NODE ? "FILE" : "DIR"); + } + return 0; +} + +int initramfs_lookup(struct vnode* dir_node, struct vnode** target, const char* component_name) +{ + // 1. Lookup the vnode in the directory + // 2. Return error code if fails + struct initramfs_internal *internal = (struct initramfs_internal*)dir_node->internal; + if(internal->type == FILE_NODE){ + printf("\r\n[ERROR] Cannot lookup in a file"); + return LERROR; + } + + for(int i=0; ichildren[i]->internal; + if(internal->children[i] != NULL && !strcmp(child_internal->name, component_name)){ + *target = internal->children[i]; + return 0; + } + } + // printf("[ERROR] File not found\n"); + return LERROR; +} + +int initramfs_mkdir(struct vnode* dir_node, struct vnode** target, const char* component_name) +{ + // Alawys return -1 because we are not implementing mkdir in initramfs + return -1; +} + +int initramfs_create(struct vnode* dir_node, struct vnode** target, const char* component_name) +{ + // Alawys return -1 because we are not implementing create in initramfs + return -1; +} + +int initramfs_close(struct file* file) +{ + // 1. release the file handle + // 2. Return error code if fails + if(file == NULL){ + printf("\r\n[ERROR] File pointer cannot be NULL"); + return CERROR; + } + return 0; // vfs_close will free the file pointer +} + +int initramfs_open(struct vnode* file_node, struct file** target) +{ + // 1. Allocate file handle + // 2. Return error code if fails + struct file *file = (struct file*)dynamic_alloc(sizeof(struct file)); + file->vnode = file_node; + file->f_pos = 0; + *target = file; + return 0; +} + +int initramfs_read(struct file* file, void* buf, size_t len) +{ + struct initramfs_internal *internal = (struct initramfs_internal*)file->vnode->internal; + if(internal->type != FILE_NODE) + { + printf("\r\n[ERROR] Not a file"); + return -1; + } + char *dst = (char*)buf; + char *src = &((char *)internal->data)[file->f_pos]; + int i = 0; + for (; isize; i++) { + dst[i] = src[i]; + } + return i; +} + +int initramfs_write(struct file* file, const void* buf, size_t len) +{ + //cannot write on initframfs + return -1; +} + + + +static int isFileInSubDir(const char* pathname) +{ + for(int i=0; ifs = fs; - mount->root = tmpfs_create_vnode("/", DIR_NODE, NULL); + (*mount)->fs = fs; + (*mount)->root = tmpfs_create_vnode("/", DIR_NODE, NULL); return 0; } @@ -260,7 +260,7 @@ int tmpfs_list(struct vnode* dir_node) printf("\r\n[ERROR] Cannot list in a file"); return LERROR; } - + printf("\r\n[TMPFS LIST]"); for(int i=0; isize; i++){ struct tmpfs_internal *child_internal = (struct tmpfs_internal*)internal->children[i]->internal; printf("\r\n"); printf(child_internal->name); printf("\t"); printf(child_internal->type == FILE_NODE ? "FILE" : "DIR"); diff --git a/lab07/kernel/src/vfs.c b/lab07/kernel/src/vfs.c index 9e0fa7266..162b275a9 100644 --- a/lab07/kernel/src/vfs.c +++ b/lab07/kernel/src/vfs.c @@ -4,6 +4,7 @@ #include "tmpfs.h" #include "errno.h" #include "tmpfs.h" +#include "initramfs.h" #include "io.h" #include "schedule.h" @@ -27,6 +28,8 @@ static void simplify_path(char* pathname); // } // } +void initramfs_init(); + void rootfs_init() { @@ -44,7 +47,34 @@ void rootfs_init() register_filesystem(tmpfs); rootfs = (struct mount*)dynamic_alloc(sizeof(struct mount)); - tmpfs->setup_mount(tmpfs, rootfs); + // printf("\r\n[ROOTFS] rootfs: "); printf_hex(rootfs); + tmpfs->setup_mount(tmpfs, &rootfs); + + // printf("\r\n[ROOTFS] rootfs: "); printf_hex(rootfs); + initramfs_init(); +} + +void initramfs_init() +{ + struct filesystem* initramfs = (struct filesystem*)dynamic_alloc(sizeof(struct filesystem)); + initramfs->name = (char*)dynamic_alloc(16); + strcpy(initramfs->name, "initramfs"); + + initramfs->setup_mount = initramfs_setup_mount; + register_filesystem(initramfs); + + vfs_mkdir("/initramfs"); + + struct vnode* target_dir; + struct vnode* vnode = vfs_get_node("/initramfs", &target_dir); + vnode->mount = (struct mount*)dynamic_alloc(sizeof(struct mount)); + // printf("\r\n[INITRAMFS] vnode: "); printf_hex(vnode); + // printf("\r\n[IDNITRAMFS] vnode->mount: "); printf_hex(vnode->mount); + // printf("\r\nsame: "); printf_int(target_dir == rootfs->root); + initramfs->setup_mount(initramfs, &(vnode->mount)); + + // printf("\r\n[IDNITRAMFS] vnode->mount: "); printf_hex(vnode->mount); + // printf("\r\n[INITRAMFS] initramfs initialized"); } @@ -56,11 +86,10 @@ int register_filesystem(struct filesystem* fs) { // ensure there is sufficient m //initialize memory pool of the file system return tmpfs_register(); } - // [TODO] - // else if(!strcmp(fs->name, "initramfs")) - // { - // return initramfs_register(); - // } + else if(!strcmp(fs->name, "initramfs")) + { + return initramfs_register(); + } return -1; } @@ -155,7 +184,15 @@ int vfs_mkdir(const char* pathname) char* file_name = get_file_name(pathname); printf("\r\n[MKDIR] pathname: "); printf(pathname); printf(" , filename: "); printf(file_name); - int ret = target_dir->v_ops->mkdir(target_dir, &new_dir, file_name); + + int ret; + if(target_dir->mount != NULL){ // check if it is a mount point + ret = target_dir->mount->root->v_ops->mkdir(target_dir->mount->root, &new_dir, file_name); + } + else { + ret = target_dir->v_ops->mkdir(target_dir, &new_dir, file_name); + } + if(ret != 0) { printf("\r\n[ERROR] Cannot create directory"); @@ -208,7 +245,7 @@ int vfs_mount(const char* target, const char* filesystem) // mount the filesyste } register_filesystem(fs); - fs->setup_mount(fs, mount_point); + fs->setup_mount(fs, &mount_point); target_dir->mount = mount_point; mount_point->root->parent = target_dir->parent; @@ -236,8 +273,12 @@ int vfs_list(const char* pathname) printf("\r\n[ERROR] Cannot find the directory"); return -1; } - - ret = vnode->v_ops->list(vnode); + if(vnode->mount != NULL){ // check if it is a mount point + ret = vnode->mount->root->v_ops->list(vnode->mount->root); + } + else { + ret = vnode->v_ops->list(vnode); + } if(ret != 0) { printf("\r\n[ERROR] Cannot list the directory"); @@ -321,7 +362,9 @@ static struct vnode* next_step(struct vnode* start_node, const char* pathname, s } else{ struct vnode* next_node; + // printf("\r\n[DEBUG] mount: "); printf_int(current_node->mount != NULL); if(current_node->v_ops->lookup(current_node, &next_node, token) != 0){ + printf("\r\n123"); current_node = NULL; goto next_step_end; } diff --git a/lab07/kernel/src/video.c b/lab07/kernel/src/video.c index 1f9840436..8ea0d3924 100644 --- a/lab07/kernel/src/video.c +++ b/lab07/kernel/src/video.c @@ -8,9 +8,9 @@ extern struct task_struct *current; extern void memzero_asm(unsigned long src, unsigned long n); -#ifndef QEMU -extern unsigned long CPIO_START_ADDR_FROM_DT; -#endif +// #ifndef QEMU +// extern unsigned long CPIO_START_ADDR_FROM_DT; +// #endif void start_video(int argc, char *argv[]) { From 8640d5fd54a7891090b8a51e37dd735eae4f792d Mon Sep 17 00:00:00 2001 From: yui0303 Date: Mon, 10 Jun 2024 19:04:30 +0800 Subject: [PATCH 08/17] feat: add script for creating cpio archive --- lab07/create_fs.sh | 4 ++++ lab07/initramfs.cpio | Bin 247296 -> 405504 bytes lab07/initramfs/dir1/f3 | 1 + lab07/initramfs/dir1/f4 | 1 + lab07/initramfs/f1 | 1 + lab07/initramfs/f2 | 1 + 6 files changed, 8 insertions(+) create mode 100755 lab07/create_fs.sh create mode 100644 lab07/initramfs/dir1/f3 create mode 100644 lab07/initramfs/dir1/f4 create mode 100644 lab07/initramfs/f1 create mode 100644 lab07/initramfs/f2 diff --git a/lab07/create_fs.sh b/lab07/create_fs.sh new file mode 100755 index 000000000..88b71b68e --- /dev/null +++ b/lab07/create_fs.sh @@ -0,0 +1,4 @@ +#!/bin/bash + +(cd initramfs && find . | cpio -o -H newc > ../initramfs.cpio) + diff --git a/lab07/initramfs.cpio b/lab07/initramfs.cpio index 0676fb1584617bc4d73624b3b212a12133e97d8e..fdcb66b79bba0ce271857b8c73905fa724f0bbd4 100644 GIT binary patch literal 405504 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 Date: Mon, 10 Jun 2024 19:21:05 +0800 Subject: [PATCH 09/17] chore: add specific debug for memory and fix the allocation problem for filedata --- lab07/kernel/Makefile | 10 ++++- lab07/kernel/src/alloc.c | 86 ++++++++++++++++++++---------------- lab07/kernel/src/initramfs.c | 2 +- lab07/kernel/src/vfs.c | 5 +-- 4 files changed, 59 insertions(+), 44 deletions(-) diff --git a/lab07/kernel/Makefile b/lab07/kernel/Makefile index 49c48715d..bf4e55536 100644 --- a/lab07/kernel/Makefile +++ b/lab07/kernel/Makefile @@ -12,8 +12,14 @@ all: clean makedir kernel8.img ifdef DEBUG COPS += -DDEBUG endif -# DEBUG: COPS += -DDEBUG -# DEBUG: all + +ifdef BUDDY_SYSTEM_DEBUG +COPS += -BUDDY_SYSTEM_DEBUG +endif + +ifdef DYNAMIC_ALLOC_DEBUG +COPS += -DYNAMIC_ALLOC_DEBUG +endif .PHONY: clean clean: diff --git a/lab07/kernel/src/alloc.c b/lab07/kernel/src/alloc.c index 5ccf2efc8..0fd8ef37f 100644 --- a/lab07/kernel/src/alloc.c +++ b/lab07/kernel/src/alloc.c @@ -98,7 +98,7 @@ static void add_to_flist(struct flist_t* flist, struct frame_t* frame) flist->head = frame; // printf("\r\n[SYSTEM INFO] Frame status: "); printf_int(frame->status); } -#ifdef DEBUG +#ifdef BUDDY_SYSTEM_DEBUG printf("\r\n[DEBUG] Leave add_to_flist"); #endif } @@ -116,7 +116,7 @@ static void remove_from_flist(struct flist_t* flist, struct frame_t* frame) { if(prev) prev->next = next_index == -1 ? NULL : &frame_arr[next_index]; else flist->head = next_index == -1 ? NULL : &frame_arr[next_index]; -#ifdef DEBUG +#ifdef BUDDY_SYSTEM_DEBUG printf("\r\n[DEBUG] Remove Frame: "); printf_int(frame->index); printf(" from flist Level: "); printf_int(frame->level); #endif // curr->next = NULL; @@ -125,7 +125,7 @@ static void remove_from_flist(struct flist_t* flist, struct frame_t* frame) prev = curr; curr = curr->next; } -#ifdef DEBUG +#ifdef BUDDY_SYSTEM_DEBUG printf("\r\n[DEBUG ERROR] Frame Not Found in flist!"); #endif return; @@ -138,13 +138,13 @@ static uint64_t pow_2(uint32_t n) void memory_reserve(uint64_t start, uint64_t end, char* msg) { -#ifdef DEBUG +#ifdef BUDDY_SYSTEM_DEBUG printf("\r\n[SYSTEM INFO] Reserve Memory from: "); printf_hex(start); printf(" to: "); printf_hex(end); #endif uint32_t start_index = (start - 0) >> 12; uint32_t end_index = (end - 0) >> 12; -#ifdef DEBUG +#ifdef BUDDY_SYSTEM_DEBUG printf("\r\n[SYSTEM INFO] Reserve Memory from Frame: "); printf_int(start_index); printf(" to Frame: "); printf_int(end_index); printf(" for "); printf(msg); #endif @@ -210,7 +210,7 @@ void frame_init_with_reserve() int is_free_start = 1; int free_cnt = 0; struct frame_t* free_start = NULL; -#ifdef DEBUG +#ifdef BUDDY_SYSTEM_DEBUG printf("\r\n[DEBUG] Frame NUM: "); printf_int(FRAME_NUM); printf("\r\n[DEBUG] free_start: "); printf_hex((uint64_t)free_start); #endif @@ -224,7 +224,7 @@ void frame_init_with_reserve() frame_arr[i].next = &frame_arr[i+1]; } else{ -#ifdef DEBUG +#ifdef BUDDY_SYSTEM_DEBUG printf("\r\n[DEBUG] Frame: "); printf_int(i); printf(", next is NULL"); #endif frame_arr[i].next = NULL; @@ -234,7 +234,7 @@ void frame_init_with_reserve() if(frame_arr[i].status == RESERVED){ if(is_free_start==0 && free_start != NULL){ free_start->level = get_lower_bound_level(free_cnt); -#ifdef DEBUG +#ifdef BUDDY_SYSTEM_DEBUG printf("\r\n[DEBUG] Free Start Frame: "); printf_int(free_start->index); printf(", Level: "); printf_int(free_start->level); #endif @@ -264,7 +264,7 @@ void frame_init_with_reserve() } if(i== FRAME_NUM-1 && is_free_start==0 && free_start != NULL){ free_start->level = get_lower_bound_level(free_cnt); -#ifdef DEBUG +#ifdef BUDDY_SYSTEM_DEBUG printf("\r\n[DEBUG] Free Start Frame: "); printf_int(free_start->index); printf(", Level: "); printf_int(free_start->level); printf(" "); printf_int(free_cnt); #endif @@ -279,17 +279,17 @@ void frame_init_with_reserve() } } -#ifdef DEBUG +#ifdef BUDDY_SYSTEM_DEBUG int tag = 0; printf("\r\n[SYSTEM INFO] Buddy System List (Start Frame, base_addr, max_level): \n"); #endif for(int i=0; i "); #endif if(buddy_system_list[i].base_addr == NULL) break; -#ifdef DEBUG +#ifdef BUDDY_SYSTEM_DEBUG printf("( "); printf_int(buddy_system_list[i].index); printf(", "); printf_hex((uint64_t)buddy_system_list[i].base_addr); printf(", "); printf_int(buddy_system_list[i].max_level); printf(" )"); @@ -303,7 +303,7 @@ void print_flist(int argc, char* argv[]) printf("\r\n========== free list =========="); for(int i=0; i<=MAX_LEVEL; i++) { -#ifdef DEBUG +#ifdef BUDDY_SYSTEM_DEBUG printf("\r\n[DEBUG] Level: ");printf_int(i); #endif struct frame_t* frame = flist_arr[i].head; @@ -318,16 +318,16 @@ void print_flist(int argc, char* argv[]) sign = 1; // frame = frame->next; frame = frame_arr[frame->index + pow_2(frame->level) - 1].next; -#ifdef DEBUG +#ifdef BUDDY_SYSTEM_DEBUG if(frame != NULL) {printf(" (expected next: "); printf_int(frame->index); printf(")");} #endif } } -#ifdef DEBUG +#ifdef BUDDY_SYSTEM_DEBUG printf("\r\n[DEBUG] Leave Level: ");printf_int(i); #endif } -#ifdef DEBUG +#ifdef BUDDY_SYSTEM_DEBUG printf("\r\n[DEBUG] Leave print_flist"); #endif } @@ -341,7 +341,7 @@ void print_allocated(int argc, char* argv[]) { int cnt = 0; int expected_cnt = pow_2(frame_arr[i].level); -#ifdef DEBUG +#ifdef BUDDY_SYSTEM_DEBUG int level = frame_arr[i].level; #endif printf("\r\n[SYSTEM INFO] Allocated Frame: "); printf_int(frame_arr[i].index); printf(", Level: "); printf_int(frame_arr[i].level); @@ -351,7 +351,7 @@ void print_allocated(int argc, char* argv[]) i++; curr = curr->next; } -#ifdef DEBUG +#ifdef BUDDY_SYSTEM_DEBUG printf("\r\n[DEBUG] Allocated Frame Count: "); printf_int(cnt); printf(", Expected Count: "); printf_int(expected_cnt); printf(" , level: "); printf_int(level); #endif @@ -380,7 +380,7 @@ void* balloc(uint64_t size) { uint32_t r_size = round_size(size); uint8_t level = get_level(r_size); -#ifdef DEBUG +#ifdef BUDDY_SYSTEM_DEBUG printf("\r\n[SYSTEM INFO] Round Size: "); printf_int(r_size); printf(", Level: "); printf_int(level); #endif void* ret = NULL; @@ -392,7 +392,7 @@ void* balloc(uint64_t size) { uint8_t from_level = i; int start_index = frame->index; -#ifdef DEBUG +#ifdef BUDDY_SYSTEM_DEBUG printf("\r\n[DEBUG] From Level: "); printf_int(from_level); printf("\r\n[DEBUG] Start Index: "); printf_int(start_index); #endif @@ -414,7 +414,7 @@ void* balloc(uint64_t size) frame->status = ALLOCATED; frame->level = level; frame_arr[start_index + pow_2(level) - 1].next = NULL; -#ifdef DEBUG +#ifdef BUDDY_SYSTEM_DEBUG printf("\r\n[SYSTEM INFO] Allocate Frame: "); printf_int(frame->index); #endif ret = (void*)(uint64_t)(MALLOC_START_ADDR + start_index * FRAME_SIZE); @@ -425,7 +425,7 @@ void* balloc(uint64_t size) { printf("\r\n[SYSTEM ERROR] No Enough Memory!"); } -#ifdef DEBUG +#ifdef BUDDY_SYSTEM_DEBUG print_flist(0, NULL); print_allocated(0, NULL); #endif @@ -452,17 +452,17 @@ int bfree(void* ptr) switch(curr_frame->status) { case FREE: -#ifdef DEBUG +#ifdef BUDDY_SYSTEM_DEBUG printf("\r\n[SYSTEM ERROR] Frame Already Free!"); #endif return 1; case LARGE_CONTIGUOUS: -#ifdef DEBUG +#ifdef BUDDY_SYSTEM_DEBUG printf("\r\n[SYSTEM ERROR] Frame is belong to Large Contiguous Frame!"); #endif return 1; case RESERVED: -#ifdef DEBUG +#ifdef BUDDY_SYSTEM_DEBUG printf("\r\n[SYSTEM ERROR] Frame is Reserved!"); #endif return 1; @@ -473,32 +473,32 @@ int bfree(void* ptr) // printf("\r\n[SYSTEM INFO] Free Frame Address: "); printf_hex((uint64_t)ptr); // buddy address = curr address ^ (block size) struct frame_t* buddy_frame = &frame_arr[get_buddy_index((ptr-offset*FRAME_SIZE), curr_frame->level)+offset]; -#ifdef DEBUG +#ifdef BUDDY_SYSTEM_DEBUG printf("\r\n[SYSTEM INFO] Free Frame: "); printf_int(curr_frame->index); printf(", Level: "); printf_int(curr_frame->level); printf("\r\n[SYSTEM INFO] Buddy Frame: "); printf_int(buddy_frame->index); printf(", Level: "); printf_int(buddy_frame->level); #endif if(buddy_frame->status != FREE) { -#ifdef DEBUG +#ifdef BUDDY_SYSTEM_DEBUG printf("\r\n[SYSTEM INFO] Buddy Frame is not FREE!"); #endif curr_frame->status = FREE; } else { -#ifdef DEBUG +#ifdef BUDDY_SYSTEM_DEBUG printf("\r\n[SYSTEM INFO] Buddy Frame is Free!"); #endif } while(buddy_frame->status == FREE && curr_frame->level < max_level) { curr_frame->status = FREE; -#ifdef DEBUG +#ifdef BUDDY_SYSTEM_DEBUG printf("\r\n[SYSTEM INFO] Merge Frame:"); printf_int(curr_frame->index); printf(" and Frame: "); printf_int(buddy_frame->index); printf(" to Level: "); printf_int(curr_frame->level + 1); #endif -#ifdef DEBUG +#ifdef BUDDY_SYSTEM_DEBUG printf("\r\n[DEBUG] remove_from_flist: level: "); printf_int(buddy_frame->level); printf(" index: "); printf_int(buddy_frame->index); #endif remove_from_flist(&flist_arr[buddy_frame->level], buddy_frame); @@ -517,7 +517,7 @@ int bfree(void* ptr) buddy_frame->status = LARGE_CONTIGUOUS; } -#ifdef DEBUG +#ifdef BUDDY_SYSTEM_DEBUG printf(" with head frame: "); printf_int(merge_index); #endif @@ -528,12 +528,12 @@ int bfree(void* ptr) break; } buddy_frame = &frame_arr[get_buddy_index((void*)(uint64_t)(MALLOC_START_ADDR + (merge_index-offset) * FRAME_SIZE), curr_frame->level) + offset]; -#ifdef DEBUG +#ifdef BUDDY_SYSTEM_DEBUG printf("\r\n[SYSTEM INFO] New Frame: "); printf_int(curr_frame->index); printf(", Level: "); printf_int(curr_frame->level); printf("\r\n[SYSTEM INFO] New Buddy Frame: "); printf_int(buddy_frame->index); printf(", Level: "); printf_int(buddy_frame->level); #endif } -#ifdef DEBUG +#ifdef BUDDY_SYSTEM_DEBUG printf("\r\n[SYSTEM INFO] Add Frame:"); printf_int(curr_frame->index); printf(" to Level: "); printf_int(curr_frame->level); #endif add_to_flist(&flist_arr[curr_frame->level], curr_frame); @@ -595,7 +595,7 @@ static int get_memory_pool_id(uint64_t size) } else if(memory_pools[i].size == 0) { -#ifdef DEBUG +#ifdef BUDDY_SYSTEM_DEBUG printf("\r\n[DEBUG] Init New Memory Pool with chunk size: "); printf_int(r_size); #endif init_memory_pool_with_size(&memory_pools[i], r_size); @@ -630,7 +630,9 @@ void* dynamic_alloc(uint64_t size) res = memory_pool->free_chunk; memzero_asm((uint64_t)res, memory_pool->size); memory_pool->free_chunk = memory_pool->free_chunk->next; // point to the next free chunk +#ifdef DYNAMIC_ALLOC_DEBUG printf("\r\n[SYSTEM INFO] Allocate Chunk at address: "); printf_hex((uint64_t)res); printf(", in Frame: "); printf_int(((uint64_t)res - MALLOC_START_ADDR) >> 12); +#endif return res; } @@ -644,12 +646,16 @@ void* dynamic_alloc(uint64_t size) { if(memory_pool->frame_used == 0) { +#ifdef DYNAMIC_ALLOC_DEBUG printf("\r\n[SYSTEM INFO] Create First Frame for Memory Pool with size: ");printf_int(memory_pool->size); +#endif } else { +#ifdef DYNAMIC_ALLOC_DEBUG printf("\r\n[SYSTEM INFO] The Frame of Memory Pool with size: ");printf_int(memory_pool->size);printf(" is Full! "); printf("Create a New Frame!"); +#endif } void* new_frame = balloc(FRAME_SIZE); @@ -662,7 +668,9 @@ void* dynamic_alloc(uint64_t size) // printf(" in Frame: "); printf_int(((struct frame_t*)memory_pool->frame_base_addrs[memory_pool->frame_used - 1])->index); res = memory_pool->frame_base_addrs[memory_pool->frame_used - 1] + memory_pool->chunk_offset * memory_pool->size; +#ifdef DYNAMIC_ALLOC_DEBUG printf("\r\n[SYSTEM INFO] Allocate Chunk at address: "); printf_hex((uint64_t)res); printf(", in Frame: "); printf_int(((uint64_t)res - MALLOC_START_ADDR) >> 12); +#endif memory_pool->chunk_offset++; memory_pool->chunk_used++; memzero_asm((uint64_t)res, memory_pool->size); @@ -691,7 +699,7 @@ int dfree(void* ptr) return 1; } - uint32_t frame_index = ((uint64_t)ptr - MALLOC_START_ADDR) >>12; // 2^12 = 4096 = FRAME_SIZE + // uint32_t frame_index = ((uint64_t)ptr - MALLOC_START_ADDR) >>12; // 2^12 = 4096 = FRAME_SIZE struct memory_pool_t* memory_pool = &memory_pools[memory_pool_index]; // check whether the chunk is already in the free chunk list @@ -705,13 +713,15 @@ int dfree(void* ptr) } head_free_chunk = head_free_chunk->next; } - - printf("\r\n[SYSTEM INFO] Free Chunk in Frame: "); printf_int(frame_index); +#ifdef DYNAMIC_ALLOC_DEBUG + printf("\r\n[SYSTEM INFO] Free Chunk in Frame: "); printf_int(((uint64_t)ptr - MALLOC_START_ADDR) >>12); +#endif memory_pool->chunk_used--; struct chunk_t* last_free_chunk = memory_pool->free_chunk; memory_pool->free_chunk = (struct chunk_t*)ptr; memory_pool->free_chunk->next = last_free_chunk; - +#ifdef DYNAMIC_ALLOC_DEBUG printf("\r\n[SYSTEM INFO] Free Chunk at address: "); printf_hex((uint64_t)ptr); +#endif return 0; } \ No newline at end of file diff --git a/lab07/kernel/src/initramfs.c b/lab07/kernel/src/initramfs.c index 394209064..88e9b6399 100644 --- a/lab07/kernel/src/initramfs.c +++ b/lab07/kernel/src/initramfs.c @@ -69,7 +69,7 @@ static struct vnode* initramfs_create_vnode(const char *name, int type, struct v strcpy(internal->name, name); internal->size = 0; if(type == FILE_NODE){ - internal->data = (char*)dynamic_alloc(INITRAMFS_MAX_FILE); + internal->data = (char*)balloc(INITRAMFS_MAX_FILE); } else{ internal->data = NULL; diff --git a/lab07/kernel/src/vfs.c b/lab07/kernel/src/vfs.c index 162b275a9..5624b7a63 100644 --- a/lab07/kernel/src/vfs.c +++ b/lab07/kernel/src/vfs.c @@ -364,7 +364,6 @@ static struct vnode* next_step(struct vnode* start_node, const char* pathname, s struct vnode* next_node; // printf("\r\n[DEBUG] mount: "); printf_int(current_node->mount != NULL); if(current_node->v_ops->lookup(current_node, &next_node, token) != 0){ - printf("\r\n123"); current_node = NULL; goto next_step_end; } @@ -410,11 +409,11 @@ static char* get_file_name(const char* pathname) static void simplify_path(char* pathname) { - printf("\r\n"); printf(__func__); + // printf("\r\n"); printf(__func__); #define MAX_SEGMENTS 256 char* tmp_path = (char*)dynamic_alloc(strlen(pathname)+1); - char* new_path = (char*)dynamic_alloc(strlen(pathname)+1); + char* new_path = (char*)dynamic_alloc(strlen(pathname)+1); strcpy(tmp_path, pathname); From 6f549cced001a826b50d07f66376b0d72927d223 Mon Sep 17 00:00:00 2001 From: yui0303 Date: Tue, 11 Jun 2024 04:49:42 +0800 Subject: [PATCH 10/17] feat: finish syscall open, close, write, and read --- lab07/kernel/include/initramfs.h | 1 + lab07/kernel/include/schedule.h | 8 +- lab07/kernel/include/tmpfs.h | 1 + lab07/kernel/include/user_demo.h | 14 ++ lab07/kernel/include/vfs.h | 8 +- lab07/kernel/src/fork.c | 14 ++ lab07/kernel/src/initramfs.c | 40 ++++-- lab07/kernel/src/shell.c | 88 ++---------- lab07/kernel/src/sys.c | 78 +++++++++- lab07/kernel/src/tmpfs.c | 19 ++- lab07/kernel/src/user_demo.c | 235 +++++++++++++++++++++++++++++++ lab07/kernel/src/vfs.c | 34 +++-- 12 files changed, 428 insertions(+), 112 deletions(-) create mode 100644 lab07/kernel/include/user_demo.h create mode 100644 lab07/kernel/src/user_demo.c diff --git a/lab07/kernel/include/initramfs.h b/lab07/kernel/include/initramfs.h index 13cadfca2..9aa1cb6b5 100644 --- a/lab07/kernel/include/initramfs.h +++ b/lab07/kernel/include/initramfs.h @@ -12,6 +12,7 @@ struct initramfs_internal { char* name; // file name or directory name unsigned long size; // child count for directory char* data; + unsigned long filesize; int type; // DIR_NODE or FILE_NODE // struct vnode* parent; struct vnode* children[ENTRIES_PER_DIR]; diff --git a/lab07/kernel/include/schedule.h b/lab07/kernel/include/schedule.h index 317da8574..5392a441d 100644 --- a/lab07/kernel/include/schedule.h +++ b/lab07/kernel/include/schedule.h @@ -19,12 +19,14 @@ #define PF_KTHREAD 2 -#define MAX_PATH_LEN 256 +// #define MAX_PATH_LEN 256 extern struct task_struct *current; extern struct task_struct * task[NR_TASKS]; extern int nr_tasks; +#include "vfs.h" + struct cpu_context { unsigned long long x19; unsigned long long x20; @@ -51,6 +53,7 @@ struct task_struct { unsigned long flags; int pid; char cwd[MAX_PATH_LEN]; + struct file_descriptor_table fd_table; }; extern void sched_init(void); @@ -68,7 +71,8 @@ extern void exit_process(void); #define INIT_TASK \ /*cpu_context*/ { {0,0,0,0,0,0,0,0,0,0,0,0,0}, \ /* state etc */ 0,0,1, 0, 0, PF_KTHREAD, 0, \ -/* cwd */ "/" \ +/* cwd */ "/", \ +/*fd table*/ {0, {0}} \ } #endif diff --git a/lab07/kernel/include/tmpfs.h b/lab07/kernel/include/tmpfs.h index e9d633295..d673611f7 100644 --- a/lab07/kernel/include/tmpfs.h +++ b/lab07/kernel/include/tmpfs.h @@ -11,6 +11,7 @@ struct tmpfs_internal { char* name; // file name or directory name unsigned long size; char* data; + unsigned long filesize; int type; // DIR_NODE or FILE_NODE // struct vnode* parent; struct vnode* children[ENTRIES_PER_DIR]; diff --git a/lab07/kernel/include/user_demo.h b/lab07/kernel/include/user_demo.h new file mode 100644 index 000000000..7ebabd664 --- /dev/null +++ b/lab07/kernel/include/user_demo.h @@ -0,0 +1,14 @@ +#ifndef __USER_DEMO_H__ +#define __USER_DEMO_H__ + +#define delay(x) for(int i=0; icpu_context, sizeof(struct cpu_context)); + // clear the file descriptor table + p->fd_table.count = 0; + for(int i=0; ifd_table.fds[i] = NULL; + if(flags & PF_KTHREAD) // is a kernel thread { p->cpu_context.x19 = fn; @@ -62,6 +67,15 @@ int copy_process( ((char*)childregs->sp)[i] = ((char*)cur_regs->sp)[i]; p->stack = stack; + + // copy the file descriptor table + p->fd_table.count = current->fd_table.count; + for(int i=0; ifd_table.fds[i] != NULL){ + p->fd_table.fds[i] = (struct file *)dynamic_alloc(sizeof(struct file)); + p->fd_table.fds[i] = current->fd_table.fds[i]; + } + } } p->flags = flags; p->priority = current->priority; diff --git a/lab07/kernel/src/initramfs.c b/lab07/kernel/src/initramfs.c index 88e9b6399..f7f5459a4 100644 --- a/lab07/kernel/src/initramfs.c +++ b/lab07/kernel/src/initramfs.c @@ -6,6 +6,8 @@ #include "lib.h" #include "cpio.h" +#define min(a, b) ((a) < (b) ? (a) : (b)) + struct vnode_operations *initramfs_v_ops; struct file_operations *initramfs_f_ops; @@ -28,6 +30,7 @@ int initramfs_setup_mount(struct filesystem* fs, struct mount **mount) // mount { char* pathname; char* filedata; + int filesize = strtol(head->c_filesize, 16, 8); char c_mode[5]; strncpy(c_mode, head->c_mode, 5); int ret = cpio_newc_parser(&head, &pathname, &filedata); @@ -39,10 +42,13 @@ int initramfs_setup_mount(struct filesystem* fs, struct mount **mount) // mount if(!strcmp(pathname, ".") || !strcmp(pathname, "..") || isFileInSubDir(pathname))continue; struct vnode *filevnode = initramfs_create_vnode(pathname, FILE_NODE, (*mount)->root); struct initramfs_internal *fileinode = (struct initramfs_internal*)filevnode->internal; - fileinode->data = filedata; + strncpy(fileinode->data, filedata, filesize); fileinode->size = 0; + fileinode->filesize = filesize; root_internal->children[root_internal->size++] = filevnode; - printf("\r\n[INITRAMFS INFO] Mount Archive: "); printf(pathname); printf("\t, cmode: "); printf(c_mode); + printf("\r\n[INITRAMFS INFO] Mount Archive: "); printf(pathname); + for(int i=0; i<10-strlen(pathname); i++) printf(" "); + printf("\t, cmode: "); printf(c_mode); } else if(!strcmp(c_mode, "00004")){ // directory // cannot create directory in initramfs @@ -136,10 +142,12 @@ int initramfs_list(struct vnode* dir_node) return LERROR; } - + printf("\r\nName \tType"); + printf("\r\n-----------------------"); for(int i=0; isize; i++){ struct initramfs_internal *child_internal = (struct initramfs_internal*)internal->children[i]->internal; - printf("\r\n"); printf(child_internal->name); printf("\t"); printf(child_internal->type == FILE_NODE ? "FILE" : "DIR"); + printf("\r\n"); printf(child_internal->name); for(int j=0; j<15-strlen(child_internal->name); j++) printf(" "); + printf("\t"); printf(child_internal->type == FILE_NODE ? "FILE" : "DIR"); } return 0; } @@ -201,19 +209,21 @@ int initramfs_open(struct vnode* file_node, struct file** target) int initramfs_read(struct file* file, void* buf, size_t len) { - struct initramfs_internal *internal = (struct initramfs_internal*)file->vnode->internal; - if(internal->type != FILE_NODE) - { - printf("\r\n[ERROR] Not a file"); - return -1; + struct vnode *vnode = file->vnode; + struct initramfs_internal *internal = (struct initramfs_internal*)vnode->internal; + if(internal->type == DIR_NODE){ + printf("\r\n[ERROR] Cannot read a directory"); + return RERROR; } - char *dst = (char*)buf; - char *src = &((char *)internal->data)[file->f_pos]; - int i = 0; - for (; isize; i++) { - dst[i] = src[i]; + + size_t readable_size = min(len, internal->filesize - file->f_pos); + + // memory copy + for(int i=0; idata[file->f_pos + i]; } - return i; + file->f_pos += readable_size; + return readable_size; } int initramfs_write(struct file* file, const void* buf, size_t len) diff --git a/lab07/kernel/src/shell.c b/lab07/kernel/src/shell.c index a303741c4..edaf34d32 100644 --- a/lab07/kernel/src/shell.c +++ b/lab07/kernel/src/shell.c @@ -20,8 +20,6 @@ static void clear(int argc, char *argv[]); static void mailbox(int argc, char *argv[]); static void test_malloc(int argc, char *argv[]); static void reboot(int argc, char *argv[]); -static void multiple_thread_test(int argc, char *argv[]); -static void to_user_test(int argc, char *argv[]); static void rootfs_ls(int argc, char *argv[]); static void rootfs_mkdir(int argc, char *argv[]); static void print_cwd(int argc, char *argv[]); @@ -35,11 +33,14 @@ extern void cpio_exec(int argc, char *argv[]); extern void print_flist(int argc, char *argv[]); extern void start_video(int argc, char *argv[]); extern void print_flist(int argc, char *argv[]); +extern void multiple_thread_test(int argc, char *argv[]); +extern void user_fork_test(int argc, char *argv[]); +extern void user_open_test(int argc, char *argv[]); +extern void user_open_test_initramfs(int argc, char *argv[]); +extern void user_read_test(int argc, char *argv[]); +extern void user_write_test(int argc, char *argv[]); +extern void user_write_test_initramfs(int argc, char *argv[]); -// system call -extern int getpid(); -extern int fork(); -extern void exit(); int split_command(char* command, char *argv[]); @@ -58,7 +59,12 @@ cmd cmds[] = {.name = "reboot", .func = &reboot, .help_msg = "\nreboot\t: reboot the device"}, {.name = "exec", .func = &cpio_exec, .help_msg = "\nexec\t: execute a file in the cpio archive"}, {.name = "multi_thread", .func = &multiple_thread_test, .help_msg = "\nmulti_thread\t: test multiple threads"}, - {.name = "to_user", .func = &to_user_test, .help_msg = "\nto_user\t: test user mode"}, + {.name = "user_fork", .func = &user_fork_test, .help_msg = "\nto_user\t: test user mode"}, + {.name = "user_open", .func = &user_open_test, .help_msg = "\nuser_open\t: test user open file"}, + {.name = "user_open_ramfs", .func = &user_open_test_initramfs, .help_msg = "\nuser_open_ramfs\t: test user open file in initramfs"}, + {.name = "user_read", .func = &user_read_test, .help_msg = "\nuser_read\t: test user read file"}, + {.name = "user_write", .func = &user_write_test, .help_msg = "\nuser_write\t: test user write file"}, + {.name = "user_write_ramfs", .func = &user_write_test_initramfs, .help_msg = "\nuser_write_ramfs\t: test user write file in initramfs"}, {.name = "start_video", .func = &start_video, .help_msg = "\nstart_video\t: start video"}, {.name = "fl", .func= &print_flist, .help_msg = "\nfl\t: print free list"}, {.name = "cwd", .func=&print_cwd, .help_msg = "\ncwd\t: print current workding directroy"}, @@ -100,74 +106,6 @@ void shell_loop() extern struct task_struct *current; -static void foo() -{ - for(int i = 0; i < 10; ++i) { - printf("\r\nThread id: "); printf_int(current->pid); printf("\t,loop: "); printf_int(i); - delay(1000000); - schedule(); - } - current->state = TASK_ZOMBIE; - while(1); -} - -static void user_foo() -{ - // printf("Fork Test , pid : %d\n",getpid()); - printf("\r\nFork Test, pid: "); printf_int(getpid()); - uint32_t cnt = 1,ret=0; - - if((ret=fork()) == 0){ //pid == 0 => child - printf("\r\n===== Child Process ====="); - unsigned long cur_sp; - asm volatile("mov %0, sp" : "=r"(cur_sp)); - // printf("first child pid: %d, cnt: %d, ptr: %x, sp : %x\n", getpid(), cnt, &cnt, cur_sp); - printf("\r\nfirst child pid: "); printf_int(getpid()); printf(", cnt: "); printf_int(cnt); - printf(", ptr: "); printf_hex((unsigned long)&cnt); printf(", sp: "); printf_hex(cur_sp); - ++cnt; - - if ((ret = fork() )!= 0){ - asm volatile("mov %0, sp" : "=r"(cur_sp)); - // printf("first child pid: %d, cnt: %d, ptr: %x, sp : %x\n", getpid(), cnt, &cnt, cur_sp); - printf("\r\nfirst child pid: "); printf_int(getpid()); printf(", cnt: "); printf_int(cnt); - printf(", ptr: "); printf_hex((unsigned long)&cnt); printf(", sp: "); printf_hex(cur_sp); - } - else{ - while (cnt < 5) { - asm volatile("mov %0, sp" : "=r"(cur_sp)); - // printf("second child pid: %d, cnt: %d, ptr: %x, sp : %x\n", getpid(), cnt, &cnt, cur_sp); - printf("\r\nsecond child pid: "); printf_int(getpid()); printf(", cnt: "); printf_int(cnt); - printf(", ptr: "); printf_hex((unsigned long)&cnt); printf(", sp: "); printf_hex(cur_sp); - delay(1000000); - ++cnt; - } - } - exit(); - } - else{ //pid > 0 => parent - printf("\r\n===== Parent Process ====="); - printf("\r\nParent Process, pid: "); printf_int(getpid()); - printf(" child pid: "); printf_int(ret); - unsigned long cur_sp; - asm volatile("mov %0, sp" : "=r"(cur_sp)); - printf(" cnt: "); printf_int(cnt); printf(" , ptr: "); printf_hex((unsigned long)&cnt); - printf(" , sp: "); printf_hex(cur_sp); - exit(); - } -} - -static void multiple_thread_test(int argc, char *argv[]) -{ - for(int i = 0; i < 5; ++i) { - copy_process(PF_KTHREAD, (unsigned long)&foo, 0, 0); - } -} - -static void to_user_test(int argc, char *argv[]) -{ - copy_process(PF_KTHREAD, (unsigned long)&kp_user_mode, (unsigned long)&user_foo, 0); -} - /* ===================================================================== */ diff --git a/lab07/kernel/src/sys.c b/lab07/kernel/src/sys.c index 852e8a3f5..c0507b78e 100644 --- a/lab07/kernel/src/sys.c +++ b/lab07/kernel/src/sys.c @@ -16,6 +16,8 @@ extern void memzero_asm(unsigned long src, unsigned long n); // extern unsigned long CPIO_START_ADDR_FROM_DT; // #endif +void foo(){}; + int sys_getpid() { return current->pid; @@ -137,4 +139,78 @@ void sys_kill(int pid) // [TODO] return; } -void * const sys_call_table[] = {sys_getpid, sys_uartread, sys_uartwrite, sys_exec, sys_fork, sys_exit, sys_mbox_call, sys_kill}; \ No newline at end of file +int sys_open(const char *pathname, int flags) +{ + printf("\r\n[SYSCALL] open: "); printf(pathname); printf(", flags: "); printf_int(flags); + for(int i=0; ifd_table.fds[i] == NULL){ + int ret = vfs_open(pathname, flags, ¤t->fd_table.fds[i]); + if(ret == 0){ + printf("\r\n[SYSCALL OPEN] File descriptor: "); printf_int(i + OFFSET_FD); printf(" , File: "); printf(pathname); + return i + OFFSET_FD; + } + break; + } + } + return -1; +} + +int sys_close(int fd) +{ + printf("\r\n[SYSCALL] close: "); printf_int(fd); + if(fd < OFFSET_FD || fd >= MAX_OPEN_FILE + OFFSET_FD) return -1; + int ret = vfs_close(current->fd_table.fds[fd - OFFSET_FD]); + current->fd_table.fds[fd - OFFSET_FD] = NULL; + return ret; +} + +long sys_write(int fd, const void *buf, unsigned long count) +{ + printf("\r\n[SYSCALL] write: fd: "); printf_int(fd); printf(", count: "); printf_int(count); + return vfs_write(current->fd_table.fds[fd - OFFSET_FD], buf, count); +} +long sys_read(int fd, void *buf, unsigned long count) +{ + printf("\r\n[SYSCALL] read: fd: "); printf_int(fd); printf(", count: "); printf_int(count); + return vfs_read(current->fd_table.fds[fd - OFFSET_FD], buf, count); +} + +// you can ignore mode, since there is no access control +int sys_mkdir(const char *pathname, unsigned mode) +{ + return 0; +} + +// you can ignore arguments other than target (where to mount) and filesystem (fs name) +int sys_mount(const char *src, const char *target, const char *filesystem, unsigned long flags, const void *data) +{ + return 0; + +} +int sys_chdir(const char *path) +{ + return 0; +} + +void * const sys_call_table[] = { + sys_getpid, + sys_uartread, + sys_uartwrite, + sys_exec, + sys_fork, + sys_exit, + sys_mbox_call, + sys_kill, + // lab5 advanced + foo, + foo, + foo, + // lab7 + sys_open, + sys_close, + sys_write, + sys_read, + sys_mkdir, + sys_mount, + sys_chdir + }; \ No newline at end of file diff --git a/lab07/kernel/src/tmpfs.c b/lab07/kernel/src/tmpfs.c index ff199fe0d..1f806bdaa 100644 --- a/lab07/kernel/src/tmpfs.c +++ b/lab07/kernel/src/tmpfs.c @@ -36,6 +36,7 @@ static struct vnode* tmpfs_create_vnode(const char *name, int type, struct vnode internal->data = NULL; } internal->type = type; + internal->filesize = 0; // internal->parent = parent; // internal->next = NULL; for(int i=0; if_pos); + for(int i=0; idata[file->f_pos + i] = ((char*)buf)[i]; } - file->f_pos += len; - internal->size += len; + file->f_pos += written_size; + internal->filesize += written_size; return len; } @@ -134,7 +136,7 @@ int tmpfs_read(struct file* file, void* buf, size_t len) return RERROR; } - size_t readable_size = min(len, internal->size - file->f_pos); + size_t readable_size = min(len, internal->filesize - file->f_pos); // memory copy for(int i=0; iinternal; if(internal->type == FILE_NODE){ printf("\r\n[ERROR] Cannot list in a file"); return LERROR; } - printf("\r\n[TMPFS LIST]"); + + printf("\r\nName \tType"); + printf("\r\n-----------------------"); for(int i=0; isize; i++){ struct tmpfs_internal *child_internal = (struct tmpfs_internal*)internal->children[i]->internal; - printf("\r\n"); printf(child_internal->name); printf("\t"); printf(child_internal->type == FILE_NODE ? "FILE" : "DIR"); + printf("\r\n"); printf(child_internal->name); for(int j=0; j<15-strlen(child_internal->name); j++) printf(" "); + printf("\t"); printf(child_internal->type == FILE_NODE ? "FILE" : "DIR"); } return 0; } \ No newline at end of file diff --git a/lab07/kernel/src/user_demo.c b/lab07/kernel/src/user_demo.c new file mode 100644 index 000000000..4cbc9d7b4 --- /dev/null +++ b/lab07/kernel/src/user_demo.c @@ -0,0 +1,235 @@ +#include "user_demo.h" +#include "fork.h" +#include "schedule.h" +#include "io.h" +#include "sys.h" + +// system call +extern int getpid(); +extern int fork(); +extern void exit(); +extern int open(const char *pathname, int flags); +extern int close(int fd); +extern int read(int fd, void *buf, unsigned long count); +extern int write(int fd, const void *buf, unsigned long count); + +static void user_multiple_thread_test_foo(); +static void user_fork_test_foo(); +static void user_open_test_foo(); +static void user_open_test_initramfs_foo(); +static void user_read_test_foo(); +static void user_write_test_foo(); +static void user_write_test_initramfs_foo(); + +// lab5 +void multiple_thread_test(int argc, char *argv[]) +{ + for(int i = 0; i < 5; ++i) { + copy_process(PF_KTHREAD, (unsigned long)&user_multiple_thread_test_foo, 0, 0); + } +} + +void user_fork_test(int argc, char *argv[]) +{ + copy_process(PF_KTHREAD, (unsigned long)&kp_user_mode, (unsigned long)&user_fork_test_foo, 0); +} + +// lab7 + +void user_open_test(int argc, char *argv[]) +{ + copy_process(PF_KTHREAD, (unsigned long)&kp_user_mode, (unsigned long)&user_open_test_foo, 0); +} + +void user_open_test_initramfs(int argc, char *argv[]) +{ + copy_process(PF_KTHREAD, (unsigned long)&kp_user_mode, (unsigned long)&user_open_test_initramfs_foo, 0); +} + +void user_read_test(int argc, char *argv[]) +{ + copy_process(PF_KTHREAD, (unsigned long)&kp_user_mode, (unsigned long)&user_read_test_foo, 0); +} + +void user_write_test(int argc, char *argv[]) +{ + copy_process(PF_KTHREAD, (unsigned long)&kp_user_mode, (unsigned long)&user_write_test_foo, 0); +} + +void user_write_test_initramfs(int argc, char *argv[]) +{ + copy_process(PF_KTHREAD, (unsigned long)&kp_user_mode, (unsigned long)&user_write_test_initramfs_foo, 0); +} + +// ------------------------------------------------------------------ + +static void user_multiple_thread_test_foo() +{ + for(int i = 0; i < 10; ++i) { + printf("\r\nThread id: "); printf_int(current->pid); printf("\t,loop: "); printf_int(i); + delay(1000000); + schedule(); + } + current->state = TASK_ZOMBIE; + while(1); +} + +static void user_fork_test_foo() +{ + // printf("Fork Test , pid : %d\n",getpid()); + printf("\r\nFork Test, pid: "); printf_int(getpid()); + uint32_t cnt = 1,ret=0; + + if((ret=fork()) == 0){ //pid == 0 => child + printf("\r\n===== Child Process ====="); + unsigned long cur_sp; + asm volatile("mov %0, sp" : "=r"(cur_sp)); + // printf("first child pid: %d, cnt: %d, ptr: %x, sp : %x\n", getpid(), cnt, &cnt, cur_sp); + printf("\r\nfirst child pid: "); printf_int(getpid()); printf(", cnt: "); printf_int(cnt); + printf(", ptr: "); printf_hex((unsigned long)&cnt); printf(", sp: "); printf_hex(cur_sp); + ++cnt; + + if ((ret = fork() )!= 0){ + asm volatile("mov %0, sp" : "=r"(cur_sp)); + // printf("first child pid: %d, cnt: %d, ptr: %x, sp : %x\n", getpid(), cnt, &cnt, cur_sp); + printf("\r\nfirst child pid: "); printf_int(getpid()); printf(", cnt: "); printf_int(cnt); + printf(", ptr: "); printf_hex((unsigned long)&cnt); printf(", sp: "); printf_hex(cur_sp); + } + else{ + while (cnt < 5) { + asm volatile("mov %0, sp" : "=r"(cur_sp)); + // printf("second child pid: %d, cnt: %d, ptr: %x, sp : %x\n", getpid(), cnt, &cnt, cur_sp); + printf("\r\nsecond child pid: "); printf_int(getpid()); printf(", cnt: "); printf_int(cnt); + printf(", ptr: "); printf_hex((unsigned long)&cnt); printf(", sp: "); printf_hex(cur_sp); + delay(1000000); + ++cnt; + } + } + exit(); + } + else{ //pid > 0 => parent + printf("\r\n===== Parent Process ====="); + printf("\r\nParent Process, pid: "); printf_int(getpid()); + printf(" child pid: "); printf_int(ret); + unsigned long cur_sp; + asm volatile("mov %0, sp" : "=r"(cur_sp)); + printf(" cnt: "); printf_int(cnt); printf(" , ptr: "); printf_hex((unsigned long)&cnt); + printf(" , sp: "); printf_hex(cur_sp); + exit(); + } +} + +static void user_open_test_foo() +{ + printf("\r\nUser Open Test pid: "); printf_int(getpid()); + // char buff[] = "Hello, World!"; + int fd = open("test.txt", O_CREAT); + if(fd == -1){ + printf("\r\nOpen file failed!"); + exit(); + } + printf("\r\nOpen file success, fd: "); printf_int(fd); + // write(fd, buff, sizeof(buff)); + close(fd); + exit(); +} + +static void user_open_test_initramfs_foo() +{ + printf("\r\nUser Open Test Initramfs pid: "); printf_int(getpid()); + // char buff[] = "Hello, World!"; + int fd = open("/initramfs/test.txt", O_CREAT); + if(fd == -1){ + printf("\r\nOpen file failed!"); + exit(); + } + printf("\r\nOpen file success, fd: "); printf_int(fd); + // write(fd, buff, sizeof(buff)); + close(fd); + exit(); +} + +static void user_read_test_foo() +{ + printf("\r\nUser Read Test pid: "); printf_int(getpid()); + char buff1[100]; + int fd1 = open("/initramfs/f1", 0); + if(fd1 == -1){ + printf("\r\nOpen file failed!"); + exit(); + } + printf("\r\nOpen file success, fd: "); printf_int(fd1); + read(fd1, buff1, sizeof(buff1)); + printf("\r\nRead content f1: "); printf(buff1); + + char buff2[4]; + int fd2 = open("/initramfs/f2", 0); + if(fd2 == -1){ + printf("\r\nOpen file failed!"); + exit(); + } + printf("\r\nOpen file success, fd: "); printf_int(fd2); + read(fd2, buff2, sizeof(buff2)); + printf("\r\nRead content f2: "); printf(buff2); + read(fd2, buff2, sizeof(buff2)); + printf("\r\nRead content f2: "); printf(buff2); + close(fd1); + close(fd2); + exit(); +} + +static void user_write_test_foo() +{ + printf("\r\nUser Write Test pid: "); printf_int(getpid()); + char buff[] = "Hello, World!"; + int fd = open("/write.txt", O_CREAT); + if(fd == -1){ + printf("\r\nOpen file failed!"); + exit(); + } + printf("\r\nOpen file success, fd: "); printf_int(fd); + write(fd, buff, sizeof(buff)); + close(fd); + + int fd2 = open("/write.txt", 0); + if(fd2 == -1){ + printf("\r\nOpen file failed!"); + exit(); + } + printf("\r\nOpen file success, fd: "); printf_int(fd2); + char buff2[100]; + read(fd2, buff2, sizeof(buff2)); + printf("\r\nRead content write.txt: "); printf(buff2); + close(fd2); + exit(); +} + +static void user_write_test_initramfs_foo() +{ + printf("\r\nUser Write Test Initramfs pid: "); printf_int(getpid()); + char buff[] = "Hello, World!"; + int fd = open("/initramfs/f1", 0); + if(fd == -1){ + printf("\r\nOpen file failed!"); + exit(); + } + printf("\r\nOpen file success, fd: "); printf_int(fd); + int size = write(fd, buff, sizeof(buff)); + if(size < 0) { + printf("\r\nWrite file failed!"); + exit(); + } + close(fd); + + int fd2 = open("/initramfs/f1", 0); + if(fd2 == -1){ + printf("\r\nOpen file failed!"); + exit(); + } + printf("\r\nOpen file success, fd: "); printf_int(fd2); + char buff2[100]; + read(fd2, buff2, sizeof(buff2)); + printf("\r\nRead content f1: "); printf(buff2); + close(fd2); + exit(); +} \ No newline at end of file diff --git a/lab07/kernel/src/vfs.c b/lab07/kernel/src/vfs.c index 5624b7a63..dce1c2cff 100644 --- a/lab07/kernel/src/vfs.c +++ b/lab07/kernel/src/vfs.c @@ -14,6 +14,8 @@ struct mount* rootfs; struct filesystem global_fs[MAX_FILESYSTEM]; // struct file_descriptor_table global_fd_table; +extern struct file_operations *initramfs_f_ops; + static struct vnode* next_step(struct vnode* start_node, const char* pathname, struct vnode** target_dir); static struct file* create_file(struct vnode* vnode, int flags); @@ -120,25 +122,26 @@ int vfs_open(const char* pathname, int flags, struct file** target) { char* file_name = get_file_name(pathname); - ret = target_dir->v_ops->create(target_dir, &vnode, file_name); - - *target = create_file(vnode, flags); + if(target_dir->mount != NULL) + ret = target_dir->mount->root->v_ops->create(target_dir->mount->root, &vnode, file_name); + else + ret = target_dir->v_ops->create(target_dir, &vnode, file_name); if(ret != 0){ printf("\r\n[ERROR] Cannot create the file"); return -1; } + *target = create_file(vnode, flags); return ret; } struct file* file = create_file(vnode, flags); + *target = file; if(vnode->f_ops->open(vnode, &file) != 0){ printf("\r\n[ERROR] Cannot open the file"); return -1; } - *target = file; - return 0; } @@ -146,13 +149,18 @@ int vfs_close(struct file* file) { // 1. release the file handle // 2. Return error code if fails int ret = file->f_ops->close(file); + dfree(file); return ret; } int vfs_write(struct file* file, const void* buf, size_t len) { // 1. write len byte from buf to the opened file. // 2. return written size or error code if an error occurs. - int ret = file->f_ops->write(file, buf, len); + int ret; + if(file->vnode->mount != NULL) + ret = file->vnode->mount->root->f_ops->write(file, buf, len); + else + ret = file->f_ops->write(file, buf, len); return ret; } @@ -350,7 +358,7 @@ static struct vnode* next_step(struct vnode* start_node, const char* pathname, s while(token != NULL){ *target_dir = current_node; - if(!strcmp(token, "..")){ + if(!strcmp(token, "..")){ // [TODO] might have bugs when the path contains mount points if(current_node->parent == NULL){ current_node = NULL; goto next_step_end; @@ -362,14 +370,18 @@ static struct vnode* next_step(struct vnode* start_node, const char* pathname, s } else{ struct vnode* next_node; - // printf("\r\n[DEBUG] mount: "); printf_int(current_node->mount != NULL); - if(current_node->v_ops->lookup(current_node, &next_node, token) != 0){ + if(current_node->mount != NULL && \ + current_node->mount->root->v_ops->lookup(current_node->mount->root, &next_node, token) == 0){ + current_node = next_node; + } + else if(current_node->v_ops->lookup(current_node, &next_node, token) == 0){ + current_node = next_node; + } + else{ current_node = NULL; goto next_step_end; } - current_node = next_node; } - // printf("\r\nsame: "); printf_int(current_node->parent == rootfs->root); token = strtok(NULL, "/"); } next_step_end: From e2b42509ef2f271de8d02ff1b7ace2cc11742c7d Mon Sep 17 00:00:00 2001 From: yui0303 Date: Tue, 11 Jun 2024 15:21:02 +0800 Subject: [PATCH 11/17] finish lab7 basic --- lab07/initramfs.cpio | Bin 405504 -> 405504 bytes lab07/kernel/include/initramfs.h | 3 +- lab07/kernel/include/tmpfs.h | 1 + lab07/kernel/include/vfs.h | 5 +- lab07/kernel/src/initramfs.c | 11 ++++ lab07/kernel/src/shell.c | 17 ++++- lab07/kernel/src/sys.c | 69 ++++++++------------ lab07/kernel/src/tmpfs.c | 15 +++-- lab07/kernel/src/vfs.c | 104 +++++++++++++++++++------------ lab07/kernel/src/video.c | 2 +- 10 files changed, 134 insertions(+), 93 deletions(-) diff --git a/lab07/initramfs.cpio b/lab07/initramfs.cpio index fdcb66b79bba0ce271857b8c73905fa724f0bbd4..3014be52bda9bae66317d84a917b8a3d2fac4a9a 100644 GIT binary patch delta 41 xcmZp8AkpwZVuB&7xvQzA^Yn*$Y+{W*tv-ycK1{7X%&k5wtv;+0{|`b4S@gv delta 41 xcmZp8AkpwZVuB&7nWL+l^Yn*$Y+{W*tv-ycK1{7X%&k5wtv;+0{}3w4VeG{ diff --git a/lab07/kernel/include/initramfs.h b/lab07/kernel/include/initramfs.h index 9aa1cb6b5..276f6720e 100644 --- a/lab07/kernel/include/initramfs.h +++ b/lab07/kernel/include/initramfs.h @@ -3,7 +3,7 @@ #define COMPONENT_SIZE 15 #define ENTRIES_PER_DIR 16 -#define INITRAMFS_MAX_FILE 4096 +#define INITRAMFS_MAX_FILE 4096*128 #include "vfs.h" #include "cpio.h" @@ -27,6 +27,7 @@ int initramfs_close(struct file* file); int initramfs_open(struct vnode* file_node, struct file** target); int initramfs_read(struct file* file, void* buf, size_t len); int initramfs_write(struct file* file, const void* buf, size_t len); +int initramfs_getsize(struct vnode* vnode); int initramfs_setup_mount(struct filesystem* fs, struct mount** mount); int initramfs_register(); // int parse_initramfs(); diff --git a/lab07/kernel/include/tmpfs.h b/lab07/kernel/include/tmpfs.h index d673611f7..1c2beee77 100644 --- a/lab07/kernel/include/tmpfs.h +++ b/lab07/kernel/include/tmpfs.h @@ -26,6 +26,7 @@ int tmpfs_close(struct file* file); int tmpfs_open(struct vnode* file_node, struct file** target); int tmpfs_read(struct file* file, void* buf, size_t len); int tmpfs_write(struct file* file, const void* buf, size_t len); +int tmpfs_getsize(struct vnode* vnode); int tmpfs_setup_mount(struct filesystem* fs, struct mount** mount); int tmpfs_register(); diff --git a/lab07/kernel/include/vfs.h b/lab07/kernel/include/vfs.h index 36ff30e04..dc23c6ccd 100644 --- a/lab07/kernel/include/vfs.h +++ b/lab07/kernel/include/vfs.h @@ -10,6 +10,7 @@ #define MAX_OPEN_FILE 16 #define OFFSET_FD 3 // 0, 1, 2 are reserved for stdin, stdout, stderr #define O_CREAT 00000100 +#define O_RW 00 #define MAX_PATH_LEN 256 struct vnode { @@ -42,7 +43,8 @@ struct file_operations { int (*write)(struct file* file, const void* buf, size_t len); int (*read)(struct file* file, void* buf, size_t len); int (*open)(struct vnode* file_node, struct file** target); - int (*close)(struct file* file); + int (*close)(struct file* file); + int (*getsize)(struct vnode* vnode); // long lseek64(struct file* file, long offset, int whence); }; @@ -72,6 +74,7 @@ int vfs_mount(const char* target, const char* filesystem); int vfs_lookup(const char* pathname, struct vnode** target); int vfs_list(const char* pathname); int vfs_chdir(const char* relative_path); +int vfs_exec(const char* pathname, char* const argv[]); // int vfs_cat(const char* pathname); [TODO] extern struct mount* rootfs; diff --git a/lab07/kernel/src/initramfs.c b/lab07/kernel/src/initramfs.c index f7f5459a4..675b57e3d 100644 --- a/lab07/kernel/src/initramfs.c +++ b/lab07/kernel/src/initramfs.c @@ -35,6 +35,10 @@ int initramfs_setup_mount(struct filesystem* fs, struct mount **mount) // mount strncpy(c_mode, head->c_mode, 5); int ret = cpio_newc_parser(&head, &pathname, &filedata); if(ret == 1)break; + if(filesize > INITRAMFS_MAX_FILE){ + printf("\r\n[SYSTEM INFO] File: "); printf(pathname); printf(" is too large to fit in initramfs"); + continue; + } // printf("\r\n[INITRAMFS INFO] Mount Archive: "); printf(pathname); printf("\t, cmode: "); printf(c_mode); struct initramfs_internal *root_internal = (struct initramfs_internal*)(*mount)->root->internal; @@ -49,6 +53,7 @@ int initramfs_setup_mount(struct filesystem* fs, struct mount **mount) // mount printf("\r\n[INITRAMFS INFO] Mount Archive: "); printf(pathname); for(int i=0; i<10-strlen(pathname); i++) printf(" "); printf("\t, cmode: "); printf(c_mode); + printf("\t, size: "); printf_hex(filesize); } else if(!strcmp(c_mode, "00004")){ // directory // cannot create directory in initramfs @@ -125,6 +130,7 @@ int initramfs_register() initramfs_f_ops->read = initramfs_read; initramfs_f_ops->write = initramfs_write; initramfs_f_ops->close = initramfs_close; + initramfs_f_ops->getsize = initramfs_getsize; return 0; } @@ -233,6 +239,11 @@ int initramfs_write(struct file* file, const void* buf, size_t len) } +int initramfs_getsize(struct vnode* vnode) +{ + struct initramfs_internal *internal = (struct initramfs_internal*)vnode->internal; + return internal->filesize; +} static int isFileInSubDir(const char* pathname) { diff --git a/lab07/kernel/src/shell.c b/lab07/kernel/src/shell.c index edaf34d32..c95669710 100644 --- a/lab07/kernel/src/shell.c +++ b/lab07/kernel/src/shell.c @@ -25,6 +25,7 @@ static void rootfs_mkdir(int argc, char *argv[]); static void print_cwd(int argc, char *argv[]); static void change_dir(int argc, char *argv[]); static void rootfs_touch(int argc, char *argv[]); +static void rootfs_exec(int argc, char *argv[]); extern void cpio_list(int argc, char *argv[]); @@ -57,7 +58,7 @@ cmd cmds[] = {.name = "clear", .func = &clear, .help_msg = "\nclear\t: clear the screen"}, {.name = "s_malloc", .func = &test_malloc,.help_msg = "\nmalloc\t: simple malloc function"}, {.name = "reboot", .func = &reboot, .help_msg = "\nreboot\t: reboot the device"}, - {.name = "exec", .func = &cpio_exec, .help_msg = "\nexec\t: execute a file in the cpio archive"}, + {.name = "cpio_exec", .func = &cpio_exec, .help_msg = "\nexec\t: execute a file in the cpio archive"}, {.name = "multi_thread", .func = &multiple_thread_test, .help_msg = "\nmulti_thread\t: test multiple threads"}, {.name = "user_fork", .func = &user_fork_test, .help_msg = "\nto_user\t: test user mode"}, {.name = "user_open", .func = &user_open_test, .help_msg = "\nuser_open\t: test user open file"}, @@ -68,7 +69,8 @@ cmd cmds[] = {.name = "start_video", .func = &start_video, .help_msg = "\nstart_video\t: start video"}, {.name = "fl", .func= &print_flist, .help_msg = "\nfl\t: print free list"}, {.name = "cwd", .func=&print_cwd, .help_msg = "\ncwd\t: print current workding directroy"}, - {.name = "cd", .func=&change_dir, .help_msg = "\ncd\t: change the directory"} + {.name = "cd", .func=&change_dir, .help_msg = "\ncd\t: change the directory"}, + {.name = "exec", .func=&rootfs_exec, .help_msg = "\nexec\t: execute a file in the rootfs"} }; static void shell() @@ -197,6 +199,17 @@ static void rootfs_touch(int argc, char *argv[]) } } +static void rootfs_exec(int argc, char *argv[]) +{ + if(argc == 2){ + vfs_exec(argv[1], 0); + } + else{ + printf("\nUsage: exec [path]"); + return; + } +} + static void print_cwd(int argc, char *argv[]) { diff --git a/lab07/kernel/src/sys.c b/lab07/kernel/src/sys.c index c0507b78e..56d41e3f5 100644 --- a/lab07/kernel/src/sys.c +++ b/lab07/kernel/src/sys.c @@ -41,51 +41,32 @@ size_t sys_uartwrite(const char buf[], size_t size) int sys_exec(const char *name, char *const argv[]) // [TODO] { -#ifndef QEMU - cpio_newc_header* head = (void*)(uint64_t)CPIO_START_ADDR_FROM_DT; -#else - cpio_newc_header* head = (void*)(uint64_t)CPIO_ADDR; -#endif - uint32_t head_size = sizeof(cpio_newc_header); - - while(1) - { - int namesize = strtol(head->c_namesize, 16, 8); - int filesize = strtol(head->c_filesize, 16, 8); - - char *filename = (void*)head + head_size; + struct file *file; + int ret = vfs_open(name, O_RW, &file); + if(ret == -1){ + printf("\r\n[ERROR] Cannot open file: "); printf(name); + return -1; + } - uint32_t offset = head_size + namesize; - if(offset % 4 != 0) offset = ((offset/4 +1)*4); + int filesize = file->vnode->f_ops->getsize(file->vnode); + void* user_program_addr = balloc(filesize+THREAD_SIZE); - if(strcmp(filename, "TRAILER!!!") == 0){ - printf("\r\n[ERROR] File not found"); - break; - } - else if(strcmp(filename, name) == 0){ - /* The filedata is appended after filename */ - char *filedata = (void*)head + offset; - void* user_program_addr = balloc(filesize+THREAD_SIZE); // extra page in case - if(user_program_addr == NULL) return -1; - memzero_asm((unsigned long)user_program_addr, filesize+THREAD_SIZE); - for(int i=0; ipc = (unsigned long)user_program_addr; - cur_regs->sp = current->stack + THREAD_SIZE; + preempt_disable(); // leads to get the correct current task - preempt_enable(); - break; // won't reach here - } + struct pt_regs *cur_regs = task_pt_regs(current); + cur_regs->pc = (unsigned long)user_program_addr; + cur_regs->sp = current->stack + THREAD_SIZE; - if(filesize % 4 != 0) filesize = (filesize/4 +1)*4; - head = (void*)head + offset + filesize; - } - return -1; // only failure + preempt_enable(); + return 0; } int sys_fork() // [TODO] @@ -167,29 +148,31 @@ int sys_close(int fd) long sys_write(int fd, const void *buf, unsigned long count) { printf("\r\n[SYSCALL] write: fd: "); printf_int(fd); printf(", count: "); printf_int(count); + if(fd < OFFSET_FD || fd >= MAX_OPEN_FILE + OFFSET_FD) return -1; return vfs_write(current->fd_table.fds[fd - OFFSET_FD], buf, count); } long sys_read(int fd, void *buf, unsigned long count) { printf("\r\n[SYSCALL] read: fd: "); printf_int(fd); printf(", count: "); printf_int(count); + if(fd < OFFSET_FD || fd >= MAX_OPEN_FILE + OFFSET_FD) return -1; return vfs_read(current->fd_table.fds[fd - OFFSET_FD], buf, count); } // you can ignore mode, since there is no access control int sys_mkdir(const char *pathname, unsigned mode) { - return 0; + return vfs_mkdir(pathname); } // you can ignore arguments other than target (where to mount) and filesystem (fs name) int sys_mount(const char *src, const char *target, const char *filesystem, unsigned long flags, const void *data) { - return 0; - + printf("\r\n[SYSCALL] mount:"); printf(src); printf(" to "); printf(target); printf(" with filesystem: "); printf(filesystem); + return vfs_mount(target, filesystem); } int sys_chdir(const char *path) { - return 0; + return vfs_chdir(path); } void * const sys_call_table[] = { diff --git a/lab07/kernel/src/tmpfs.c b/lab07/kernel/src/tmpfs.c index 1f806bdaa..96456db50 100644 --- a/lab07/kernel/src/tmpfs.c +++ b/lab07/kernel/src/tmpfs.c @@ -59,10 +59,10 @@ int tmpfs_register() for(; iread = tmpfs_read; tmpfs_f_ops->open = tmpfs_open; tmpfs_f_ops->close = tmpfs_close; + tmpfs_f_ops->getsize = tmpfs_getsize; tmpfs_v_ops->lookup = tmpfs_lookup; tmpfs_v_ops->create = tmpfs_create; @@ -197,6 +198,12 @@ int tmpfs_create(struct vnode* dir_node, struct vnode** target, const char* comp return 0; } +int tmpfs_getsize(struct vnode* vnode) +{ + struct tmpfs_internal *internal = (struct tmpfs_internal*)vnode->internal; + return internal->filesize; +} + int tmpfs_mkdir(struct vnode* dir_node, struct vnode** target, const char* component_name) { // 1. Create a new directory in the directory diff --git a/lab07/kernel/src/vfs.c b/lab07/kernel/src/vfs.c index dce1c2cff..ce1bc359e 100644 --- a/lab07/kernel/src/vfs.c +++ b/lab07/kernel/src/vfs.c @@ -7,6 +7,7 @@ #include "initramfs.h" #include "io.h" #include "schedule.h" +#include "fork.h" extern struct task_struct* current; @@ -22,17 +23,9 @@ static struct file* create_file(struct vnode* vnode, int flags); static char* get_file_name(const char* pathname); static void simplify_path(char* pathname); -// void global_fd_table_init() -// { -// for(int i=0; iname = (char*)dynamic_alloc(16); @@ -58,25 +55,21 @@ void rootfs_init() void initramfs_init() { - struct filesystem* initramfs = (struct filesystem*)dynamic_alloc(sizeof(struct filesystem)); - initramfs->name = (char*)dynamic_alloc(16); - strcpy(initramfs->name, "initramfs"); + // struct filesystem* initramfs = (struct filesystem*)dynamic_alloc(sizeof(struct filesystem)); + // initramfs->name = (char*)dynamic_alloc(16); + // strcpy(initramfs->name, "initramfs"); - initramfs->setup_mount = initramfs_setup_mount; - register_filesystem(initramfs); + // initramfs->setup_mount = initramfs_setup_mount; + // register_filesystem(initramfs); - vfs_mkdir("/initramfs"); + // vfs_mkdir("/initramfs"); - struct vnode* target_dir; - struct vnode* vnode = vfs_get_node("/initramfs", &target_dir); - vnode->mount = (struct mount*)dynamic_alloc(sizeof(struct mount)); - // printf("\r\n[INITRAMFS] vnode: "); printf_hex(vnode); - // printf("\r\n[IDNITRAMFS] vnode->mount: "); printf_hex(vnode->mount); - // printf("\r\nsame: "); printf_int(target_dir == rootfs->root); - initramfs->setup_mount(initramfs, &(vnode->mount)); + // struct vnode* vnode = vfs_get_node("/initramfs", 0); + // vnode->mount = (struct mount*)dynamic_alloc(sizeof(struct mount)); + // initramfs->setup_mount(initramfs, &(vnode->mount)); - // printf("\r\n[IDNITRAMFS] vnode->mount: "); printf_hex(vnode->mount); - // printf("\r\n[INITRAMFS] initramfs initialized"); + // vnode->mount->root->parent = vnode->parent; + vfs_mount("/initramfs", "initramfs"); } @@ -213,24 +206,18 @@ int vfs_mkdir(const char* pathname) int vfs_mount(const char* target, const char* filesystem) // mount the filesystem to the target { - struct mount* mount_point = (struct mount*)dynamic_alloc(sizeof(struct mount)); + // struct mount* mount_point = (struct mount*)dynamic_alloc(sizeof(struct mount)); struct filesystem* fs = (struct filesystem*)dynamic_alloc(sizeof(struct filesystem)); - // int ret = vfs_lookup(target, NULL); - // if(ret == 0) - // { - // printf("[ERROR] Target already exists\n"); - // return CERROR; - // } - - struct vnode* target_dir; - vfs_get_node(target, &target_dir); - if(target_dir == NULL) + struct vnode* vnode = vfs_get_node(target, 0); + if(vnode == NULL) { - printf("\r\n[ERROR] Cannot find the parent directory"); - return CERROR; + vfs_mkdir(target); + vnode = vfs_get_node(target, 0); } + vnode->mount = (struct mount*)dynamic_alloc(sizeof(struct mount)); + fs->name = (char*)dynamic_alloc(16); if(!strcmp(filesystem, "tmpfs")) { @@ -242,9 +229,9 @@ int vfs_mount(const char* target, const char* filesystem) // mount the filesyste } else if(!strcmp(filesystem, "initramfs")) { - strcpy(fs->name, "tmpfs"); + strcpy(fs->name, "initramfs"); - // fs->setup_mount = tmpfs_setup_mount; + fs->setup_mount = initramfs_setup_mount; } else { @@ -253,10 +240,9 @@ int vfs_mount(const char* target, const char* filesystem) // mount the filesyste } register_filesystem(fs); - fs->setup_mount(fs, &mount_point); + fs->setup_mount(fs, &vnode->mount); - target_dir->mount = mount_point; - mount_point->root->parent = target_dir->parent; + vnode->mount->root->parent = vnode->parent; return 0; } @@ -333,6 +319,42 @@ int vfs_chdir(const char* relative_path) return 0; } + +int vfs_exec(const char* pathname, char* const argv[]) +{ + struct file* file; + int ret = vfs_open(pathname, O_RW, &file); + + if(ret != 0) + { + printf("\r\n[ERROR] Cannot open the file"); + return CERROR; + } + + int filesize = file->vnode->f_ops->getsize(file->vnode); + void* user_program_addr = balloc(filesize+THREAD_SIZE); + + vfs_read(file, user_program_addr, filesize); + + printf("\r\n[EXEC] File: "); printf(pathname); printf(" , size: "); printf_hex(filesize); + + preempt_disable(); // leads to get the correct current task + + current->state = TASK_STOPPED; + + unsigned long tmp; + asm volatile("mrs %0, cntkctl_el1" : "=r"(tmp)); + tmp |= 1; + asm volatile("msr cntkctl_el1, %0" : : "r"(tmp)); + + copy_process(PF_KTHREAD, (unsigned long)&kp_user_mode, (unsigned long)user_program_addr, 0); + + preempt_enable(); + + return 0; +} + + struct vnode* vfs_get_node(const char* pathname, struct vnode** target_dir) { struct vnode* start_node; diff --git a/lab07/kernel/src/video.c b/lab07/kernel/src/video.c index 8ea0d3924..2a1a6c999 100644 --- a/lab07/kernel/src/video.c +++ b/lab07/kernel/src/video.c @@ -23,7 +23,7 @@ void start_video(int argc, char *argv[]) uint32_t head_size = sizeof(cpio_newc_header); - char *target_name = "syscall.img"; + char *target_name = "vfs1.img"; while(1) { From 41afa0aa36d0469e4042b685585fee57ede3fb76 Mon Sep 17 00:00:00 2001 From: yui0303 Date: Tue, 11 Jun 2024 20:14:46 +0800 Subject: [PATCH 12/17] feat: finish advanced 1 fix the problem of `static void simplify_path(char* pathname)`. The function will modify the contents of `struct file_operations global_dev[MAX_DEV_REG];` --- lab07/kernel/include/dev_uart.h | 12 +++++ lab07/kernel/include/vfs.h | 6 ++- lab07/kernel/src/dev_uart.c | 58 ++++++++++++++++++++ lab07/kernel/src/fork.c | 14 ++++- lab07/kernel/src/shell.c | 4 ++ lab07/kernel/src/sys.c | 33 +++++++----- lab07/kernel/src/user_demo.c | 26 +++++++++ lab07/kernel/src/vfs.c | 94 ++++++++++++++++++++++----------- 8 files changed, 199 insertions(+), 48 deletions(-) create mode 100644 lab07/kernel/include/dev_uart.h create mode 100644 lab07/kernel/src/dev_uart.c diff --git a/lab07/kernel/include/dev_uart.h b/lab07/kernel/include/dev_uart.h new file mode 100644 index 000000000..5f07be050 --- /dev/null +++ b/lab07/kernel/include/dev_uart.h @@ -0,0 +1,12 @@ +#ifndef __DEV_UART_H__ +#define __DEV_UART_H__ + +#include "vfs.h" + +int dev_uart_register(); +int dev_uart_write(struct file *file, const void *buf, size_t len); +int dev_uart_read(struct file *file, void *buf, size_t len); +int dev_uart_open(struct vnode *file_node, struct file **target); +int dev_uart_close(struct file *file); + +#endif \ No newline at end of file diff --git a/lab07/kernel/include/vfs.h b/lab07/kernel/include/vfs.h index dc23c6ccd..ac3f7b217 100644 --- a/lab07/kernel/include/vfs.h +++ b/lab07/kernel/include/vfs.h @@ -7,8 +7,9 @@ #define FILE_NODE 1 #define MAX_FILESYSTEM 16 +#define MAX_DEV_REG 16 #define MAX_OPEN_FILE 16 -#define OFFSET_FD 3 // 0, 1, 2 are reserved for stdin, stdout, stderr +#define OFFSET_FD 0 // 0, 1, 2 are reserved for stdin, stdout, stderr #define O_CREAT 00000100 #define O_RW 00 #define MAX_PATH_LEN 256 @@ -70,6 +71,7 @@ int vfs_close(struct file* file); int vfs_write(struct file* file, const void* buf, size_t len); int vfs_read(struct file* file, void* buf, size_t len); int vfs_mkdir(const char* pathname); +int vfs_mknod(const char* pathname, int id); int vfs_mount(const char* target, const char* filesystem); int vfs_lookup(const char* pathname, struct vnode** target); int vfs_list(const char* pathname); @@ -77,6 +79,8 @@ int vfs_chdir(const char* relative_path); int vfs_exec(const char* pathname, char* const argv[]); // int vfs_cat(const char* pathname); [TODO] +int register_dev(struct file_operations* f_ops); + extern struct mount* rootfs; extern struct filesystem global_fs[MAX_FILESYSTEM]; // extern struct file_descriptor_table global_fd_table; diff --git a/lab07/kernel/src/dev_uart.c b/lab07/kernel/src/dev_uart.c new file mode 100644 index 000000000..d0eddfab8 --- /dev/null +++ b/lab07/kernel/src/dev_uart.c @@ -0,0 +1,58 @@ +#include "dev_uart.h" +#include "mini_uart.h" +#include "alloc.h" + +struct file_operations dev_file_operations = { + dev_uart_write, + dev_uart_read, + dev_uart_open, + dev_uart_close, + 0 // getsizeq +}; + + +int dev_uart_register() +{ + uart_send_string("\r\n[INFO] Registering uart device..."); + return register_dev(&dev_file_operations); +} + +int dev_uart_write(struct file *file, const void *buf, size_t len) +{ + uart_send_string("\r\n[INFO] Writing to console..."); + const char *cbuf = buf; + for (int i = 0; i < len;i++) + { + uart_send(cbuf[i]); + } + return len; +} + +int dev_uart_read(struct file *file, void *buf, size_t len) +{ + uart_send_string("\r\n[INFO] Reading from uart..."); + for (int i = 0; i < len; i++) + { + ((char*)buf)[i] = uart_recv(); + } + return len; +} + +int dev_uart_open(struct vnode *file_node, struct file **target) +{ + uart_send_string("\r\n[INFO] Opening uart device..."); + (*target)->vnode = file_node; + (*target)->f_ops = &dev_file_operations; + return 0; +} + +int dev_uart_close(struct file *file) +{ + dfree(file); + return 0; +} + +int dev_uart_op_deny() +{ + return -1; +} diff --git a/lab07/kernel/src/fork.c b/lab07/kernel/src/fork.c index 036d18a78..7fb5c823f 100644 --- a/lab07/kernel/src/fork.c +++ b/lab07/kernel/src/fork.c @@ -43,6 +43,18 @@ int copy_process( for(int i=0; ifd_table.fds[i] = NULL; + // create stdin, stdout, stderr + // p->fd_table.fds[0] = (struct file*)dynamic_alloc(sizeof(struct file)); + // p->fd_table.fds[1] = (struct file*)dynamic_alloc(sizeof(struct file)); + // p->fd_table.fds[2] = (struct file*)dynamic_alloc(sizeof(struct file)); + vfs_open("/dev/uart", O_RW, &p->fd_table.fds[0]); + vfs_open("/dev/uart", O_RW, &p->fd_table.fds[1]); + vfs_open("/dev/uart", O_RW, &p->fd_table.fds[2]); + // printf("\r\n[INFO] File descriptor table created"); + // printf("\r\n[INFO] File descriptor 0: "); printf_hex((unsigned long)p->fd_table.fds[0]); + // printf("\r\n[INFO] File descriptor 1: "); printf_hex((unsigned long)p->fd_table.fds[1]); + // printf("\r\n[INFO] File descriptor 2: "); printf_hex((unsigned long)p->fd_table.fds[2]); + if(flags & PF_KTHREAD) // is a kernel thread { p->cpu_context.x19 = fn; @@ -133,4 +145,4 @@ void kp_user_mode(unsigned long func){ // Kernel process(func pass by argu) to u if (err < 0){ printf("Error while moving process to user mode\n\r"); } -} \ No newline at end of file +} diff --git a/lab07/kernel/src/shell.c b/lab07/kernel/src/shell.c index c95669710..1d64b1dc0 100644 --- a/lab07/kernel/src/shell.c +++ b/lab07/kernel/src/shell.c @@ -41,6 +41,8 @@ extern void user_open_test_initramfs(int argc, char *argv[]); extern void user_read_test(int argc, char *argv[]); extern void user_write_test(int argc, char *argv[]); extern void user_write_test_initramfs(int argc, char *argv[]); +extern void user_stdout_test(int argc, char *argv[]); +extern void user_stdin_test(int argc, char *argv[]); int split_command(char* command, char *argv[]); @@ -66,6 +68,8 @@ cmd cmds[] = {.name = "user_read", .func = &user_read_test, .help_msg = "\nuser_read\t: test user read file"}, {.name = "user_write", .func = &user_write_test, .help_msg = "\nuser_write\t: test user write file"}, {.name = "user_write_ramfs", .func = &user_write_test_initramfs, .help_msg = "\nuser_write_ramfs\t: test user write file in initramfs"}, + {.name = "user_stdout", .func = &user_stdout_test, .help_msg = "\nuser_stdout\t: test user stdout"}, + {.name = "user_stdin", .func = &user_stdin_test, .help_msg = "\nuser_stdin\t: test user stdin"}, {.name = "start_video", .func = &start_video, .help_msg = "\nstart_video\t: start video"}, {.name = "fl", .func= &print_flist, .help_msg = "\nfl\t: print free list"}, {.name = "cwd", .func=&print_cwd, .help_msg = "\ncwd\t: print current workding directroy"}, diff --git a/lab07/kernel/src/sys.c b/lab07/kernel/src/sys.c index 56d41e3f5..82ff01c51 100644 --- a/lab07/kernel/src/sys.c +++ b/lab07/kernel/src/sys.c @@ -104,20 +104,23 @@ int sys_mbox_call(unsigned char ch, unsigned int *mbox) // [TODO] void sys_kill(int pid) // [TODO] { - struct task_struct* p; - for(int i=0; ipid == pid){ - preempt_disable(); - printf("\r\nKilling process: "); printf_int(pid); - p->state = TASK_ZOMBIE; - preempt_enable(); - return; - } + // struct task_struct* p; + // for(int i=0; ipid == pid){ + // preempt_disable(); + // printf("\r\nKilling process: "); printf_int(pid); + // current->state = TASK_ZOMBIE; + // preempt_enable(); + // return; + // } + // } + if(task[pid] == NULL){ + printf("\r\nProcess not found: "); printf_int(pid); + return; } - printf("\r\nProcess not found: "); printf_int(pid); - return; + task[pid]->state = TASK_ZOMBIE; } int sys_open(const char *pathname, int flags) @@ -127,7 +130,7 @@ int sys_open(const char *pathname, int flags) if(current->fd_table.fds[i] == NULL){ int ret = vfs_open(pathname, flags, ¤t->fd_table.fds[i]); if(ret == 0){ - printf("\r\n[SYSCALL OPEN] File descriptor: "); printf_int(i + OFFSET_FD); printf(" , File: "); printf(pathname); + printf("\r\n[SYSCALL] open: File descriptor: "); printf_int(i + OFFSET_FD); printf(" , File: "); printf(pathname); return i + OFFSET_FD; } break; @@ -155,6 +158,7 @@ long sys_read(int fd, void *buf, unsigned long count) { printf("\r\n[SYSCALL] read: fd: "); printf_int(fd); printf(", count: "); printf_int(count); if(fd < OFFSET_FD || fd >= MAX_OPEN_FILE + OFFSET_FD) return -1; + // printf("\r\n[SYSCALL] read: fd: "); printf_hex((unsigned long)current->fd_table.fds[fd - OFFSET_FD]); return vfs_read(current->fd_table.fds[fd - OFFSET_FD], buf, count); } @@ -172,6 +176,7 @@ int sys_mount(const char *src, const char *target, const char *filesystem, unsig } int sys_chdir(const char *path) { + printf("\r\n[SYSCALL] chdir: "); printf(path); return vfs_chdir(path); } diff --git a/lab07/kernel/src/user_demo.c b/lab07/kernel/src/user_demo.c index 4cbc9d7b4..2088f2418 100644 --- a/lab07/kernel/src/user_demo.c +++ b/lab07/kernel/src/user_demo.c @@ -20,6 +20,8 @@ static void user_open_test_initramfs_foo(); static void user_read_test_foo(); static void user_write_test_foo(); static void user_write_test_initramfs_foo(); +static void user_stdout_test_foo(); +static void user_stdin_test_foo(); // lab5 void multiple_thread_test(int argc, char *argv[]) @@ -61,6 +63,16 @@ void user_write_test_initramfs(int argc, char *argv[]) copy_process(PF_KTHREAD, (unsigned long)&kp_user_mode, (unsigned long)&user_write_test_initramfs_foo, 0); } +void user_stdout_test(int argc, char *argv[]) +{ + copy_process(PF_KTHREAD, (unsigned long)&kp_user_mode, (unsigned long)&user_stdout_test_foo, 0); +} + +void user_stdin_test(int argc, char *argv[]) +{ + copy_process(PF_KTHREAD, (unsigned long)&kp_user_mode, (unsigned long)&user_stdin_test_foo, 0); +} + // ------------------------------------------------------------------ static void user_multiple_thread_test_foo() @@ -232,4 +244,18 @@ static void user_write_test_initramfs_foo() printf("\r\nRead content f1: "); printf(buff2); close(fd2); exit(); +} + +static void user_stdout_test_foo() +{ + write(1, "\nhello\n", 6); + exit(); +} + +static void user_stdin_test_foo() +{ + char buf[100]; + read(0, buf, 20); + write(1, buf, 20); + exit(); } \ No newline at end of file diff --git a/lab07/kernel/src/vfs.c b/lab07/kernel/src/vfs.c index ce1bc359e..f25f0908a 100644 --- a/lab07/kernel/src/vfs.c +++ b/lab07/kernel/src/vfs.c @@ -8,12 +8,13 @@ #include "io.h" #include "schedule.h" #include "fork.h" +#include "dev_uart.h" extern struct task_struct* current; struct mount* rootfs; struct filesystem global_fs[MAX_FILESYSTEM]; -// struct file_descriptor_table global_fd_table; +struct file_operations global_dev[MAX_DEV_REG]; extern struct file_operations *initramfs_f_ops; @@ -23,9 +24,6 @@ static struct file* create_file(struct vnode* vnode, int flags); static char* get_file_name(const char* pathname); static void simplify_path(char* pathname); - -void initramfs_init(); - void rootfs_init() { // pre init @@ -38,6 +36,12 @@ void rootfs_init() global_fs[i].name = NULL; } + for(int i=0; iname = (char*)dynamic_alloc(16); strcpy(tmpfs->name, "tmpfs"); @@ -46,30 +50,18 @@ void rootfs_init() register_filesystem(tmpfs); rootfs = (struct mount*)dynamic_alloc(sizeof(struct mount)); - // printf("\r\n[ROOTFS] rootfs: "); printf_hex(rootfs); tmpfs->setup_mount(tmpfs, &rootfs); - // printf("\r\n[ROOTFS] rootfs: "); printf_hex(rootfs); - initramfs_init(); -} - -void initramfs_init() -{ - // struct filesystem* initramfs = (struct filesystem*)dynamic_alloc(sizeof(struct filesystem)); - // initramfs->name = (char*)dynamic_alloc(16); - // strcpy(initramfs->name, "initramfs"); - - // initramfs->setup_mount = initramfs_setup_mount; - // register_filesystem(initramfs); - - // vfs_mkdir("/initramfs"); - - // struct vnode* vnode = vfs_get_node("/initramfs", 0); - // vnode->mount = (struct mount*)dynamic_alloc(sizeof(struct mount)); - // initramfs->setup_mount(initramfs, &(vnode->mount)); - - // vnode->mount->root->parent = vnode->parent; + // initramfs vfs_mount("/initramfs", "initramfs"); + + // devfs + vfs_mkdir("/dev"); + int uart_id = dev_uart_register(); + printf("\r\nUART ID: "); printf_int(uart_id); + vfs_mknod("/dev/uart", uart_id); + // int framebuffer_id = dev_framebuffer_register(); + // vfs_mknod("/dev/framebuffer", framebuffer_id); } @@ -88,13 +80,29 @@ int register_filesystem(struct filesystem* fs) { // ensure there is sufficient m return -1; } +int register_dev(struct file_operations* f_ops) +{ + for(int i=0; iwrite; + global_dev[i].read = f_ops->read; + global_dev[i].open = f_ops->open; + global_dev[i].close = f_ops->close; + return i; + } + } + return -1; +} + int vfs_open(const char* pathname, int flags, struct file** target) { // 1. Lookup pathname // 2. Create a new file handle for this vnode if found. // 3. Create a new file if O_CREAT is specified in flags and vnode not found // lookup error code shows if file exist or not or other error occurs // 4. Return error code if fails - struct vnode* vnode; int ret = vfs_lookup(pathname, &vnode); if(ret != 0 && flags != O_CREAT){ @@ -204,6 +212,17 @@ int vfs_mkdir(const char* pathname) return 0; } +int vfs_mknod(const char* pathname, int id) +{ + + struct file* file = (struct file*)dynamic_alloc(sizeof(struct file)); + + vfs_open(pathname, O_CREAT, &file); + file->vnode->f_ops = &global_dev[id]; // set the file operations + vfs_close(file); + return 0; +} + int vfs_mount(const char* target, const char* filesystem) // mount the filesystem to the target { // struct mount* mount_point = (struct mount*)dynamic_alloc(sizeof(struct mount)); @@ -309,9 +328,15 @@ int vfs_chdir(const char* relative_path) return CERROR; } - simplify_path(new_abs_path); - printf("\r\n[CHDIR] new_abs_path(simplified): "); printf(new_abs_path); + // printf("\r\n[INFO] File descriptor 0: "); printf_hex((unsigned long)current->fd_table.fds[0]); + // printf("\r\n[INFO] File descriptor 1: "); printf_hex((unsigned long)current->fd_table.fds[1]); + // printf("\r\n[INFO] File descriptor 2: "); printf_hex((unsigned long)current->fd_table.fds[2]); + // simplify_path(new_abs_path); + // printf("\r\n[CHDIR] new_abs_path(simplified): "); printf(new_abs_path); + // printf("\r\n[INFO] File descriptor 0: "); printf_hex((unsigned long)current->fd_table.fds[0]); + // printf("\r\n[INFO] File descriptor 1: "); printf_hex((unsigned long)current->fd_table.fds[1]); + // printf("\r\n[INFO] File descriptor 2: "); printf_hex((unsigned long)current->fd_table.fds[2]); preempt_enable(); strcpy(current->cwd, new_abs_path); preempt_disable(); @@ -392,9 +417,14 @@ static struct vnode* next_step(struct vnode* start_node, const char* pathname, s } else{ struct vnode* next_node; - if(current_node->mount != NULL && \ - current_node->mount->root->v_ops->lookup(current_node->mount->root, &next_node, token) == 0){ - current_node = next_node; + if(current_node->mount != NULL){ + if(current_node->mount->root->v_ops->lookup(current_node->mount->root, &next_node, token) == 0){ + current_node = next_node; + } + else{ + current_node = NULL; + goto next_step_end; + } } else if(current_node->v_ops->lookup(current_node, &next_node, token) == 0){ current_node = next_node; @@ -511,4 +541,4 @@ static void simplify_path(char* pathname) dfree(tmp_path); dfree(new_path); // return pathname; -} \ No newline at end of file +} From c7dd1a8a2b1fa664229407d4651fd379f3f50b3c Mon Sep 17 00:00:00 2001 From: yui0303 Date: Wed, 12 Jun 2024 15:38:02 +0800 Subject: [PATCH 13/17] feat: finish advance 2 --- .gitignore | 1 + lab07/kernel/include/dev_framebuffer.h | 23 ++++ lab07/kernel/include/mailbox.h | 1 + lab07/kernel/include/peripherals/mailbox.h | 5 +- lab07/kernel/include/sys.h | 9 +- lab07/kernel/include/vfs.h | 4 +- lab07/kernel/src/dev_framebuffer.c | 134 +++++++++++++++++++++ lab07/kernel/src/initramfs.c | 3 +- lab07/kernel/src/mailbox.c | 21 ++++ lab07/kernel/src/sys.S | 15 ++- lab07/kernel/src/sys.c | 38 +++++- lab07/kernel/src/tmpfs.c | 3 +- lab07/kernel/src/vfs.c | 7 +- 13 files changed, 250 insertions(+), 14 deletions(-) create mode 100644 lab07/kernel/include/dev_framebuffer.h create mode 100644 lab07/kernel/src/dev_framebuffer.c diff --git a/.gitignore b/.gitignore index e5613c6ba..3e7376c80 100644 --- a/.gitignore +++ b/.gitignore @@ -3,5 +3,6 @@ *.img *.d *.elf +initramfs.cpio.test **yuchang** \ No newline at end of file diff --git a/lab07/kernel/include/dev_framebuffer.h b/lab07/kernel/include/dev_framebuffer.h new file mode 100644 index 000000000..3ba45a40a --- /dev/null +++ b/lab07/kernel/include/dev_framebuffer.h @@ -0,0 +1,23 @@ +#ifndef _DEV_FRAMEBUFFER_H__ +#define _DEV_FRAMEBUFFER_H__ + +#include "vfs.h" + +struct framebuffer_info +{ + unsigned int width; + unsigned int height; + unsigned int pitch; + unsigned int isrgb; +}; + +#define SEEK_SET 0 + +int dev_framebuffer_register(); +int dev_framebuffer_write(struct file *file, const void *buf, size_t len); +int dev_framebuffer_read(struct file *file, void *buf, size_t len); +int dev_framebuffer_open(struct vnode *file_node, struct file **target); +int dev_framebuffer_close(struct file *file); +long dev_framebuffer_lseek64(struct file *file, long offset, int whence); + +#endif diff --git a/lab07/kernel/include/mailbox.h b/lab07/kernel/include/mailbox.h index 694bd6d19..46f26015f 100644 --- a/lab07/kernel/include/mailbox.h +++ b/lab07/kernel/include/mailbox.h @@ -4,5 +4,6 @@ void get_board_revision(); void get_memory_info(); void mailbox_call(unsigned int *mailbox); +int mailbox_call_s(unsigned char ch, unsigned int *mbox); #endif \ No newline at end of file diff --git a/lab07/kernel/include/peripherals/mailbox.h b/lab07/kernel/include/peripherals/mailbox.h index 7e9e5c2c7..454eb13a3 100644 --- a/lab07/kernel/include/peripherals/mailbox.h +++ b/lab07/kernel/include/peripherals/mailbox.h @@ -20,4 +20,7 @@ #define TAG_REQUEST_CODE 0x00000000 #define END_TAG 0x00000000 -#endif \ No newline at end of file +#define MBOX_CH_PROP 8 +#define MBOX_TAG_LAST 0 + +#endif diff --git a/lab07/kernel/include/sys.h b/lab07/kernel/include/sys.h index 5a26dde92..ae3f6528f 100644 --- a/lab07/kernel/include/sys.h +++ b/lab07/kernel/include/sys.h @@ -1,7 +1,7 @@ #ifndef __SYS_H__ #define __SYS_H__ -#define __NR_syscalls 18 +#define __NR_syscalls 20 #define SYS_GETPID_NUM 0 // syscall number #define SYS_UARTREAD_NUM 1 @@ -20,6 +20,8 @@ #define SYS_MKDIR_NUM 15 #define SYS_MOUNT_NUM 16 #define SYS_CHDIR_NUM 17 +#define SYS_LSEEK64_NUM 18 +#define SYS_IOCTL_NUM 19 #ifndef __ASSEMBLER__ @@ -47,6 +49,9 @@ int sys_mkdir(const char *pathname, unsigned mode); int sys_mount(const char *src, const char *target, const char *filesystem, unsigned long flags, const void *data); int sys_chdir(const char *path); +long sys_lseek64(int fd, long offset, int whence); +long sys_ioctl(int fd, unsigned long request, unsigned long arg); + #endif -#endif \ No newline at end of file +#endif diff --git a/lab07/kernel/include/vfs.h b/lab07/kernel/include/vfs.h index ac3f7b217..36a642add 100644 --- a/lab07/kernel/include/vfs.h +++ b/lab07/kernel/include/vfs.h @@ -46,7 +46,7 @@ struct file_operations { int (*open)(struct vnode* file_node, struct file** target); int (*close)(struct file* file); int (*getsize)(struct vnode* vnode); - // long lseek64(struct file* file, long offset, int whence); + long (*lseek64)(struct file* file, long offset, int whence); }; struct vnode_operations { @@ -85,4 +85,4 @@ extern struct mount* rootfs; extern struct filesystem global_fs[MAX_FILESYSTEM]; // extern struct file_descriptor_table global_fd_table; -#endif \ No newline at end of file +#endif diff --git a/lab07/kernel/src/dev_framebuffer.c b/lab07/kernel/src/dev_framebuffer.c new file mode 100644 index 000000000..ba0745f86 --- /dev/null +++ b/lab07/kernel/src/dev_framebuffer.c @@ -0,0 +1,134 @@ +#include "vfs.h" +#include "dev_framebuffer.h" +#include "io.h" +#include "alloc.h" +#include "mailbox.h" +#include "peripherals/mailbox.h" +#include "string.h" + + +extern void disable_irq(); +extern void enable_irq(); + +//The following code is for mailbox initialize used in lab7. +unsigned int width, height, pitch, isrgb; /* dimensions and channel order */ +unsigned char *lfb; /* raw frame buffer address */ + +struct file_operations dev_framebuffer_operations = { + dev_framebuffer_write, + 0, // read + dev_framebuffer_open, + dev_framebuffer_close, + 0, // getsize + dev_framebuffer_lseek64 +}; + +unsigned int __attribute__((aligned(16))) mbox_s[36]; + +int dev_framebuffer_register() +{ + printf("Registering framebuffer device..."); + //The following code is for mailbox initialize used in lab7. + mbox_s[0] = 35 * 4; + mbox_s[1] = TAG_REQUEST_CODE; + + mbox_s[2] = 0x48003; // set phy wh + mbox_s[3] = 8; + mbox_s[4] = 8; + mbox_s[5] = 1024; // FrameBufferInfo.width + mbox_s[6] = 768; // FrameBufferInfo.height + + mbox_s[7] = 0x48004; // set virt wh + mbox_s[8] = 8; + mbox_s[9] = 8; + mbox_s[10] = 1024; // FrameBufferInfo.virtual_width + mbox_s[11] = 768; // FrameBufferInfo.virtual_height + + mbox_s[12] = 0x48009; // set virt offset + mbox_s[13] = 8; + mbox_s[14] = 8; + mbox_s[15] = 0; // FrameBufferInfo.x_offset + mbox_s[16] = 0; // FrameBufferInfo.y.offset + + mbox_s[17] = 0x48005; // set dembox_sh + mbox_s[18] = 4; + mbox_s[19] = 4; + mbox_s[20] = 32; // FrameBufferInfo.dembox_sh + + mbox_s[21] = 0x48006; // set pixel order + mbox_s[22] = 4; + mbox_s[23] = 4; + mbox_s[24] = 1; // RGB, not BGR preferably + + mbox_s[25] = 0x40001; // get framebuffer, gets alignment on request + mbox_s[26] = 8; + mbox_s[27] = 8; + mbox_s[28] = 4096; // FrameBufferInfo.pointer + mbox_s[29] = 0; // FrameBufferInfo.size + + mbox_s[30] = 0x40008; // get pitch + mbox_s[31] = 4; + mbox_s[32] = 4; + mbox_s[33] = 0; // FrameBufferInfo.pitch + + mbox_s[34] = MBOX_TAG_LAST; + + // this might not return exactly what we asked for, could be + // the closest supported resolution instead + if (mailbox_call_s(MBOX_CH_PROP, mbox_s) && mbox_s[20] == 32 && mbox_s[28] != 0) + { + mbox_s[28] &= 0x3FFFFFFF; // convert GPU address to ARM address + width = mbox_s[5]; // get actual physical width + height = mbox_s[6]; // get actual physical height + pitch = mbox_s[33]; // get number of bytes per line + isrgb = mbox_s[24]; // get the actual channel order + lfb = ((void *)((unsigned long)mbox_s[28])); // raw frame buffer address + } + else + { + printf("Unable to set screen resolution to 1024x768x32\n"); + } + + return register_dev(&dev_framebuffer_operations); +} + +int dev_framebuffer_write(struct file *file, const void *buf, size_t len) +{ + enable_irq(); + if (len + file->f_pos > pitch * height) + { + printf("\r\n[ERROR] Invlaid Write framebuffer!"); + len = pitch * height - file->f_pos; + } + for(int i=0; if_pos))[i] = ((char*)buf)[i]; + } + file->f_pos += len; + disable_irq(); + return len; +} + +int dev_framebuffer_open(struct vnode *file_node, struct file **target) +{ + printf("\r\n[INFO] Opening framebuffer device..."); + (*target)->f_pos = 0; + (*target)->vnode = file_node; + (*target)->f_ops = &dev_framebuffer_operations; + return 0; +} + +int dev_framebuffer_close(struct file *file) +{ + dfree(file); + return 0; +} + +long dev_framebuffer_lseek64(struct file *file, long offset, int whence) +{ + if (whence == SEEK_SET) + { + file->f_pos = offset; + return file->f_pos; + } + return -1; +} diff --git a/lab07/kernel/src/initramfs.c b/lab07/kernel/src/initramfs.c index 675b57e3d..3e05dd72a 100644 --- a/lab07/kernel/src/initramfs.c +++ b/lab07/kernel/src/initramfs.c @@ -131,6 +131,7 @@ int initramfs_register() initramfs_f_ops->write = initramfs_write; initramfs_f_ops->close = initramfs_close; initramfs_f_ops->getsize = initramfs_getsize; + initramfs_f_ops->lseek64 = NULL; return 0; } @@ -252,4 +253,4 @@ static int isFileInSubDir(const char* pathname) if(pathname[i] == '/')return 1; } return 0; -} \ No newline at end of file +} diff --git a/lab07/kernel/src/mailbox.c b/lab07/kernel/src/mailbox.c index 664680d96..c3ef7dc13 100644 --- a/lab07/kernel/src/mailbox.c +++ b/lab07/kernel/src/mailbox.c @@ -64,4 +64,25 @@ void mailbox_call(unsigned int* mailbox) break; } } +} + +int mailbox_call_s(unsigned char ch, unsigned int *mbox) +{ + + unsigned int mesg = (((unsigned int)(unsigned long)mbox) & ~0xf) | (ch & 0xf); + while(*MAILBOX_STATUS & MAILBOX_FULL){ // // Check if Mailbox 0 status register’s full flag is set. if MAILBOX_STATUS == 0x80000001, then error parsing request buffer + asm volatile("nop"); + } + + *MAILBOX_WRITE = mesg; + + while(1){ + while(*MAILBOX_STATUS & MAILBOX_EMPTY){ + asm volatile("nop"); + } + if(mesg == *MAILBOX_READ){ + return mbox[1] == REQUEST_SUCCEED; + } + } + return 0; } \ No newline at end of file diff --git a/lab07/kernel/src/sys.S b/lab07/kernel/src/sys.S index cc70ea6c8..9fecd659f 100644 --- a/lab07/kernel/src/sys.S +++ b/lab07/kernel/src/sys.S @@ -94,4 +94,17 @@ mount: chdir: mov w8, #SYS_CHDIR_NUM svc #0 - ret \ No newline at end of file + ret + +.global lseek64 +lseek64: + mov w8, #SYS_LSEEK64_NUM + svc #0 + ret + + +//.global ioctl +//ioctl: +// mov w8, #SYS_IOCTL_NUM +// svc #0 +// ret \ No newline at end of file diff --git a/lab07/kernel/src/sys.c b/lab07/kernel/src/sys.c index 82ff01c51..0925bca1e 100644 --- a/lab07/kernel/src/sys.c +++ b/lab07/kernel/src/sys.c @@ -9,6 +9,7 @@ #include "type.h" #include "string.h" #include "peripherals/mailbox.h" +#include "dev_framebuffer.h" extern struct task_struct *current; extern void memzero_asm(unsigned long src, unsigned long n); @@ -84,6 +85,7 @@ void sys_exit(int status) // [TODO] int sys_mbox_call(unsigned char ch, unsigned int *mbox) // [TODO] { + printf("\r\n[SYSCALL] mbox_call: "); printf_int(ch); unsigned int mesg = (((unsigned int)(unsigned long)mbox) & ~0xf) | (ch & 0xf); while(*MAILBOX_STATUS & MAILBOX_FULL){ // // Check if Mailbox 0 status register’s full flag is set. if MAILBOX_STATUS == 0x80000001, then error parsing request buffer asm volatile("nop"); @@ -150,7 +152,7 @@ int sys_close(int fd) long sys_write(int fd, const void *buf, unsigned long count) { - printf("\r\n[SYSCALL] write: fd: "); printf_int(fd); printf(", count: "); printf_int(count); + // printf("\r\n[SYSCALL] write: fd: "); printf_int(fd); printf(", count: "); printf_int(count); if(fd < OFFSET_FD || fd >= MAX_OPEN_FILE + OFFSET_FD) return -1; return vfs_write(current->fd_table.fds[fd - OFFSET_FD], buf, count); } @@ -174,12 +176,40 @@ int sys_mount(const char *src, const char *target, const char *filesystem, unsig printf("\r\n[SYSCALL] mount:"); printf(src); printf(" to "); printf(target); printf(" with filesystem: "); printf(filesystem); return vfs_mount(target, filesystem); } + int sys_chdir(const char *path) { printf("\r\n[SYSCALL] chdir: "); printf(path); return vfs_chdir(path); } + +long sys_lseek64(int fd, long offset, int whence) +{ + long ret; + if(whence == SEEK_SET) // used for dev_framebuffer + { + current->fd_table.fds[fd - OFFSET_FD]->f_pos = offset; + ret = offset; + } + else // other is not supported + { + ret = -1; + } + + return ret; +} + +// ioctl 0 will be use to get info +// there will be default value in info +// if it works with default value, you can ignore this syscall +long sys_ioctl(int fd, unsigned long request, unsigned long arg) +{ + printf("\r\n[SYSCALL] ioctl: fd: "); printf_int(fd); printf(", request: "); printf_hex(request); + return 0; +} + + void * const sys_call_table[] = { sys_getpid, sys_uartread, @@ -200,5 +230,7 @@ void * const sys_call_table[] = { sys_read, sys_mkdir, sys_mount, - sys_chdir - }; \ No newline at end of file + sys_chdir, + sys_lseek64, + sys_ioctl + }; diff --git a/lab07/kernel/src/tmpfs.c b/lab07/kernel/src/tmpfs.c index 96456db50..13487a034 100644 --- a/lab07/kernel/src/tmpfs.c +++ b/lab07/kernel/src/tmpfs.c @@ -80,6 +80,7 @@ int tmpfs_register() tmpfs_f_ops->open = tmpfs_open; tmpfs_f_ops->close = tmpfs_close; tmpfs_f_ops->getsize = tmpfs_getsize; + tmpfs_f_ops->lseek64 = NULL; tmpfs_v_ops->lookup = tmpfs_lookup; tmpfs_v_ops->create = tmpfs_create; @@ -278,4 +279,4 @@ int tmpfs_list(struct vnode* dir_node) printf("\t"); printf(child_internal->type == FILE_NODE ? "FILE" : "DIR"); } return 0; -} \ No newline at end of file +} diff --git a/lab07/kernel/src/vfs.c b/lab07/kernel/src/vfs.c index f25f0908a..c740516de 100644 --- a/lab07/kernel/src/vfs.c +++ b/lab07/kernel/src/vfs.c @@ -9,6 +9,7 @@ #include "schedule.h" #include "fork.h" #include "dev_uart.h" +#include "dev_framebuffer.h" extern struct task_struct* current; @@ -59,9 +60,9 @@ void rootfs_init() vfs_mkdir("/dev"); int uart_id = dev_uart_register(); printf("\r\nUART ID: "); printf_int(uart_id); - vfs_mknod("/dev/uart", uart_id); - // int framebuffer_id = dev_framebuffer_register(); - // vfs_mknod("/dev/framebuffer", framebuffer_id); + vfs_mknod("/dev/uart", uart_id); + int framebuffer_id = dev_framebuffer_register(); + vfs_mknod("/dev/framebuffer", framebuffer_id); } From 3f42a6c1832394006d5a2f5f8c4578345fafb0df Mon Sep 17 00:00:00 2001 From: yui0303 Date: Wed, 12 Jun 2024 16:48:36 +0800 Subject: [PATCH 14/17] chore: remove some comments and add t he flags for debug --- lab07/kernel/src/sys.c | 36 +++++++++++++++++++++--------------- lab07/kernel/src/vfs.c | 9 +-------- 2 files changed, 22 insertions(+), 23 deletions(-) diff --git a/lab07/kernel/src/sys.c b/lab07/kernel/src/sys.c index 0925bca1e..23dd3bb32 100644 --- a/lab07/kernel/src/sys.c +++ b/lab07/kernel/src/sys.c @@ -85,7 +85,9 @@ void sys_exit(int status) // [TODO] int sys_mbox_call(unsigned char ch, unsigned int *mbox) // [TODO] { +#ifdef SYSCALL_DEBUG printf("\r\n[SYSCALL] mbox_call: "); printf_int(ch); +#endif unsigned int mesg = (((unsigned int)(unsigned long)mbox) & ~0xf) | (ch & 0xf); while(*MAILBOX_STATUS & MAILBOX_FULL){ // // Check if Mailbox 0 status register’s full flag is set. if MAILBOX_STATUS == 0x80000001, then error parsing request buffer asm volatile("nop"); @@ -106,18 +108,9 @@ int sys_mbox_call(unsigned char ch, unsigned int *mbox) // [TODO] void sys_kill(int pid) // [TODO] { - // struct task_struct* p; - // for(int i=0; ipid == pid){ - // preempt_disable(); - // printf("\r\nKilling process: "); printf_int(pid); - // current->state = TASK_ZOMBIE; - // preempt_enable(); - // return; - // } - // } +#ifdef SYSCALL_DEBUG + printf("\r\n[SYSCALL] kill: "); printf_int(pid); +#endif if(task[pid] == NULL){ printf("\r\nProcess not found: "); printf_int(pid); return; @@ -127,7 +120,9 @@ void sys_kill(int pid) // [TODO] int sys_open(const char *pathname, int flags) { +#ifdef SYSCALL_DEBUG printf("\r\n[SYSCALL] open: "); printf(pathname); printf(", flags: "); printf_int(flags); +#endif for(int i=0; ifd_table.fds[i] == NULL){ int ret = vfs_open(pathname, flags, ¤t->fd_table.fds[i]); @@ -143,7 +138,9 @@ int sys_open(const char *pathname, int flags) int sys_close(int fd) { +#ifdef SYSCALL_DEBUG printf("\r\n[SYSCALL] close: "); printf_int(fd); +#endif if(fd < OFFSET_FD || fd >= MAX_OPEN_FILE + OFFSET_FD) return -1; int ret = vfs_close(current->fd_table.fds[fd - OFFSET_FD]); current->fd_table.fds[fd - OFFSET_FD] = NULL; @@ -152,15 +149,18 @@ int sys_close(int fd) long sys_write(int fd, const void *buf, unsigned long count) { - // printf("\r\n[SYSCALL] write: fd: "); printf_int(fd); printf(", count: "); printf_int(count); +#ifdef SYSCALL_DEBUG + printf("\r\n[SYSCALL] write: fd: "); printf_int(fd); printf(", count: "); printf_int(count); +#endif if(fd < OFFSET_FD || fd >= MAX_OPEN_FILE + OFFSET_FD) return -1; return vfs_write(current->fd_table.fds[fd - OFFSET_FD], buf, count); } long sys_read(int fd, void *buf, unsigned long count) { +#ifdef SYSCALL_DEBUG printf("\r\n[SYSCALL] read: fd: "); printf_int(fd); printf(", count: "); printf_int(count); +#endif if(fd < OFFSET_FD || fd >= MAX_OPEN_FILE + OFFSET_FD) return -1; - // printf("\r\n[SYSCALL] read: fd: "); printf_hex((unsigned long)current->fd_table.fds[fd - OFFSET_FD]); return vfs_read(current->fd_table.fds[fd - OFFSET_FD], buf, count); } @@ -173,13 +173,17 @@ int sys_mkdir(const char *pathname, unsigned mode) // you can ignore arguments other than target (where to mount) and filesystem (fs name) int sys_mount(const char *src, const char *target, const char *filesystem, unsigned long flags, const void *data) { +#ifdef SYSCALL_DEBUG printf("\r\n[SYSCALL] mount:"); printf(src); printf(" to "); printf(target); printf(" with filesystem: "); printf(filesystem); +#endif return vfs_mount(target, filesystem); } int sys_chdir(const char *path) { +#ifdef SYSCALL_DEBUG printf("\r\n[SYSCALL] chdir: "); printf(path); +#endif return vfs_chdir(path); } @@ -205,7 +209,9 @@ long sys_lseek64(int fd, long offset, int whence) // if it works with default value, you can ignore this syscall long sys_ioctl(int fd, unsigned long request, unsigned long arg) { - printf("\r\n[SYSCALL] ioctl: fd: "); printf_int(fd); printf(", request: "); printf_hex(request); +#ifdef SYSCALL_DEBUG + printf("\r\n[SYSCALL] ioctl: fd: "); printf_int(fd); printf(" , request: "); printf_hex(request); +#endif return 0; } diff --git a/lab07/kernel/src/vfs.c b/lab07/kernel/src/vfs.c index c740516de..774f7e943 100644 --- a/lab07/kernel/src/vfs.c +++ b/lab07/kernel/src/vfs.c @@ -389,7 +389,7 @@ struct vnode* vfs_get_node(const char* pathname, struct vnode** target_dir) start_node = rootfs->root; return next_step(start_node, pathname+1, target_dir); } - else{ // [TODO] relative path + else{ start_node = vfs_get_node(current->cwd, NULL); return next_step(start_node, pathname, target_dir); } @@ -491,18 +491,11 @@ static void simplify_path(char* pathname) isFirst = 0; if(token != NULL){ segments[n_segments] = (char*)dynamic_alloc(strlen(token)+1); - // printf("\r\nsegment at: "); printf_hex(segments[n_segments]); printf(" , "); printf_int(n_segments); strcpy(segments[n_segments++], token); } token = strtok(NULL, "/"); } - // printf("\r\n"); printf(segments[0]); printf_hex((void*)segments[0]); - - // for(int i=0; i Date: Thu, 13 Jun 2024 04:25:27 +0800 Subject: [PATCH 15/17] chore: base file from `lab07` --- lab08/create_fs.sh | 4 + lab08/initramfs.cpio | Bin 0 -> 405504 bytes lab08/initramfs/dir1/f3 | 1 + lab08/initramfs/dir1/f4 | 1 + lab08/initramfs/f1 | 1 + lab08/initramfs/f2 | 1 + lab08/kernel/Makefile | 60 ++ lab08/kernel/include/alloc.h | 25 + lab08/kernel/include/bootload.h | 15 + lab08/kernel/include/cpio.h | 42 ++ lab08/kernel/include/dev_framebuffer.h | 23 + lab08/kernel/include/dev_uart.h | 12 + lab08/kernel/include/devicetree.h | 94 +++ lab08/kernel/include/entry.h | 30 + lab08/kernel/include/errno.h | 9 + lab08/kernel/include/fork.h | 26 + lab08/kernel/include/initramfs.h | 35 + lab08/kernel/include/io.h | 14 + lab08/kernel/include/irq.h | 12 + lab08/kernel/include/lib.h | 12 + lab08/kernel/include/mailbox.h | 9 + lab08/kernel/include/mem.h | 31 + lab08/kernel/include/mini_uart.h | 26 + lab08/kernel/include/mm.h | 6 + lab08/kernel/include/peripherals/base.h | 6 + lab08/kernel/include/peripherals/gpio.h | 12 + lab08/kernel/include/peripherals/irq.h | 29 + lab08/kernel/include/peripherals/mailbox.h | 26 + lab08/kernel/include/peripherals/mini_uart.h | 26 + lab08/kernel/include/reboot.h | 8 + lab08/kernel/include/schedule.h | 79 ++ lab08/kernel/include/shell.h | 12 + lab08/kernel/include/string.h | 12 + lab08/kernel/include/sys.h | 57 ++ lab08/kernel/include/timer.h | 14 + lab08/kernel/include/tmpfs.h | 33 + lab08/kernel/include/type.h | 13 + lab08/kernel/include/user_demo.h | 14 + lab08/kernel/include/vfs.h | 88 +++ lab08/kernel/include/video.h | 6 + lab08/kernel/src/alloc.c | 727 +++++++++++++++++++ lab08/kernel/src/boot.S | 48 ++ lab08/kernel/src/bootload.c | 43 ++ lab08/kernel/src/cpio.c | 211 ++++++ lab08/kernel/src/dev_framebuffer.c | 134 ++++ lab08/kernel/src/dev_uart.c | 58 ++ lab08/kernel/src/devicetree.c | 94 +++ lab08/kernel/src/entry.S | 235 ++++++ lab08/kernel/src/fork.c | 148 ++++ lab08/kernel/src/initramfs.c | 256 +++++++ lab08/kernel/src/io.c | 54 ++ lab08/kernel/src/irq.S | 11 + lab08/kernel/src/irq.c | 84 +++ lab08/kernel/src/kernel_main.c | 54 ++ lab08/kernel/src/lib.c | 87 +++ lab08/kernel/src/linker.ld | 24 + lab08/kernel/src/mailbox.c | 88 +++ lab08/kernel/src/mini_uart.c | 65 ++ lab08/kernel/src/mm.S | 6 + lab08/kernel/src/reboot.c | 18 + lab08/kernel/src/schedule.S | 24 + lab08/kernel/src/schedule.c | 103 +++ lab08/kernel/src/shell.c | 271 +++++++ lab08/kernel/src/string.c | 69 ++ lab08/kernel/src/sys.S | 110 +++ lab08/kernel/src/sys.c | 242 ++++++ lab08/kernel/src/timer.S | 32 + lab08/kernel/src/timer.c | 25 + lab08/kernel/src/tmpfs.c | 282 +++++++ lab08/kernel/src/user_demo.c | 261 +++++++ lab08/kernel/src/vfs.c | 538 ++++++++++++++ lab08/kernel/src/video.c | 75 ++ 72 files changed, 5401 insertions(+) create mode 100755 lab08/create_fs.sh create mode 100644 lab08/initramfs.cpio create mode 100644 lab08/initramfs/dir1/f3 create mode 100644 lab08/initramfs/dir1/f4 create mode 100644 lab08/initramfs/f1 create mode 100644 lab08/initramfs/f2 create mode 100644 lab08/kernel/Makefile create mode 100644 lab08/kernel/include/alloc.h create mode 100644 lab08/kernel/include/bootload.h create mode 100644 lab08/kernel/include/cpio.h create mode 100644 lab08/kernel/include/dev_framebuffer.h create mode 100644 lab08/kernel/include/dev_uart.h create mode 100644 lab08/kernel/include/devicetree.h create mode 100644 lab08/kernel/include/entry.h create mode 100644 lab08/kernel/include/errno.h create mode 100644 lab08/kernel/include/fork.h create mode 100644 lab08/kernel/include/initramfs.h create mode 100644 lab08/kernel/include/io.h create mode 100644 lab08/kernel/include/irq.h create mode 100644 lab08/kernel/include/lib.h create mode 100644 lab08/kernel/include/mailbox.h create mode 100644 lab08/kernel/include/mem.h create mode 100644 lab08/kernel/include/mini_uart.h create mode 100644 lab08/kernel/include/mm.h create mode 100644 lab08/kernel/include/peripherals/base.h create mode 100644 lab08/kernel/include/peripherals/gpio.h create mode 100644 lab08/kernel/include/peripherals/irq.h create mode 100644 lab08/kernel/include/peripherals/mailbox.h create mode 100644 lab08/kernel/include/peripherals/mini_uart.h create mode 100644 lab08/kernel/include/reboot.h create mode 100644 lab08/kernel/include/schedule.h create mode 100644 lab08/kernel/include/shell.h create mode 100644 lab08/kernel/include/string.h create mode 100644 lab08/kernel/include/sys.h create mode 100644 lab08/kernel/include/timer.h create mode 100644 lab08/kernel/include/tmpfs.h create mode 100644 lab08/kernel/include/type.h create mode 100644 lab08/kernel/include/user_demo.h create mode 100644 lab08/kernel/include/vfs.h create mode 100644 lab08/kernel/include/video.h create mode 100644 lab08/kernel/src/alloc.c create mode 100644 lab08/kernel/src/boot.S create mode 100644 lab08/kernel/src/bootload.c create mode 100644 lab08/kernel/src/cpio.c create mode 100644 lab08/kernel/src/dev_framebuffer.c create mode 100644 lab08/kernel/src/dev_uart.c create mode 100644 lab08/kernel/src/devicetree.c create mode 100644 lab08/kernel/src/entry.S create mode 100644 lab08/kernel/src/fork.c create mode 100644 lab08/kernel/src/initramfs.c create mode 100644 lab08/kernel/src/io.c create mode 100644 lab08/kernel/src/irq.S create mode 100644 lab08/kernel/src/irq.c create mode 100644 lab08/kernel/src/kernel_main.c create mode 100644 lab08/kernel/src/lib.c create mode 100644 lab08/kernel/src/linker.ld create mode 100644 lab08/kernel/src/mailbox.c create mode 100644 lab08/kernel/src/mini_uart.c create mode 100644 lab08/kernel/src/mm.S create mode 100644 lab08/kernel/src/reboot.c create mode 100644 lab08/kernel/src/schedule.S create mode 100644 lab08/kernel/src/schedule.c create mode 100644 lab08/kernel/src/shell.c create mode 100644 lab08/kernel/src/string.c create mode 100644 lab08/kernel/src/sys.S create mode 100644 lab08/kernel/src/sys.c create mode 100644 lab08/kernel/src/timer.S create mode 100644 lab08/kernel/src/timer.c create mode 100644 lab08/kernel/src/tmpfs.c create mode 100644 lab08/kernel/src/user_demo.c create mode 100644 lab08/kernel/src/vfs.c create mode 100644 lab08/kernel/src/video.c diff --git a/lab08/create_fs.sh b/lab08/create_fs.sh new file mode 100755 index 000000000..88b71b68e --- /dev/null +++ b/lab08/create_fs.sh @@ -0,0 +1,4 @@ +#!/bin/bash + +(cd initramfs && find . | cpio -o -H newc > ../initramfs.cpio) + diff --git a/lab08/initramfs.cpio b/lab08/initramfs.cpio new file mode 100644 index 0000000000000000000000000000000000000000..3014be52bda9bae66317d84a917b8a3d2fac4a9a GIT binary patch literal 405504 zcmeFad(b4=RVP+GJxGcXyC9@k2!uUfX1yPoS?{W>s;tbc_dDzT%*xExbW78#d3Mi8 z5E51+VMCbxL*K3d3nG@;ki!Pq1nWQiXhORlEe@M?z#kd`5q5+fUylUF!P-W!;c(j; z+P`zN>g(#BMu_=p8i-JK*O#xG_ny~%opaB*@mxF?PsHPyL^6}F#&M(*^%|Yyse1i^ zGoEC#*<3v%vvlm;1Amga2X61*B=?u12c_-HOD7uiJfG0h?ETxzOJp%^w>@XY-~YFl zJzqY-`Ok4ads@4F>)-SI@}+NAzkYW2pT6Pz!>|0=Yp;C$&u;z5H~;M9)35)s=i9Zf z-+aRJbCjOG`;{j?_$ObwcW+90)9=qG|LRv?zij`(z4vNgyLZ_m-@B*EXO}&v^bXHX z=^ZQk2RwK0ydS^IPki}<9?yr)en7kX#FL)WH}U*~9!)-b|Lz`XK7{+vJn^BAzvl5w z?_B<15%8;ul|4crrM=jx})Kp%fJQn0Ua1k&o1w-?>|2!TJN5pLIzm+OT=4Bi?izSeEbgZ zCVsHI@QiTOp72cn9^r!gA5Q;Sm)Ac;d?0*Jz<0X-K1#pKm-4s+d=7a4Ubwsm51yp7 zpb=nqc|zsj`VQbFxaj*!kZDSDpNGH6cz6lrG5Vi`PMhBc8mfR@b$RnYGT6YITcOjR z1|2;}`}dH>a|-fvJ||32j#)o$Mb&)-aG zx4)6oZh!Og<;XWKKM{EovI^Qq7z}5j({H1kdkfF)p9fC&f~Zdm$PCGcqn-kn+uWx; z5G&ljVi8F)kTatpi%Y>eit9)1pWuk?eHv!4Mj=8q7KB6ofc*Pcre)`r~loPHMk z1|PmmwD}*XE`v@U$`|xIvq5WWV?eJvbbY{674_!w|9x+I2YfkvPIN>$-G_N`w%O$c zp4_4910GXe-}tk8(_7zvYy7Fdxc7@^BtKLxWa?a&Zn?6<(*B!!)2sLH{qS3#a_a-} zljZkX_;dwXy!5_Z{qRIiKSMa-{bw)TdV|tj(jupX*FU1?Q5VNsxIV8__~yp$o3pCt z^ojTF=!0+m!-H>b;`&Y$GKC-H>kYv5EzfJ8{Uw$sp54K>>a!>LH*r2M7yZoFfZx;L z)jvD0r;*cNdcyMsY7bl-BB#HAdv^VLTCB-%sBh;QJS#A<4kQ`2K@~Z!k`v_U`V} zC!TNpGxTrYAl@IAaryF>|NO1D^Dg=jZoxfnTI|%fzXmS<4#Bj?<5ukSf7-!xE|;&n zc>EEA!ho?XZurj1I1^5P5;&gAIN<;p_>o7*z@1AE%J~0+`*R+hh^IgQm%#Sx2eAFZUk5fv zJe?oHrh!&~?OTuF;cq?!+kb_7hTm)AX&rf-!|9PuKmM1%`MCo)pJUfF#=7*apQ14o zwE<{TF^<4E@2AJkYrlDe+Ofkn;ENBz@bh~Z9O?8Q@2_8zPC39s`SH7U8+BxSbze5g z?~{;U>IbSAL!4cDS;O_eMO(>ad-u+jkI3n#A1d?5aerUt-?Lq?!NiY?|*YEary?{pFQI_RUiXz;!NLNdM&}^;^Pm?#p{XFG}8Y8 z+U5Ic3oNa(OM3~t{aND2)0b}Fd0Kb-pw|nh{|&zT?ZfXpMfTlz_uW@PL&y|s?>vyH ze}X)|a+v$`ha=e#rpLuoG*Z&mb1Nuv(`E`7I2hUwP6i@#nl>e)T`Q38! zOYZW!vitUDkmol*2O0yow4ijCzkC}sr9O)ABYL4{I(-Ar&VndEsNbgVK9BtA+mGzq z$k*L(zr6dF+kYGPocpQrZtx-$0pOMeO(#5XsP z{*}Y@nw$PFc4g@(ORMC6|4agW66o;hCq9TVjXOSdN~a+97p@+D|C;;#|GE4A%4N^= z@{^w*qfU)4c|HqTeD;lNDD&)>F&_P88Y5!t`g-ZKf_%>C{}c|N86M@dh5e&Zq7=GnG44^BXJsO4|-M!-&9vCCC z?;eEn14zRGjtBUz5iFO#T-?Lr$_ME1^dJ0#Lzo>G=GXRgL%JZYX`b}vzCPV@)BNH= znqL54cjKGSdtOscEziDg|K6^i{!3O*|4V}ZX^i=v#`w?Ufryn){}5^a{=Iv@c#n>u$!DJduAf1Bm-f8u04BPA0x)Tiowq*a>H^;S)K^#;XFm*j20gcF zj(_&U7{5L3x$C)1^CcQ@VBCiJ7TV@Nc@6VF%n9%Q7~zKUF*o=jN`HywvN#j}Y0m0F zy7POKe~aXP_x=X~JG-Vi9?Heo`u3$KJtHcg>X(i=I>88?0ZWHxGUkhS-}=;lx1-B$ z&JLQ;Jd({lzJxSia?AcIaMj(q`+3i;^64i*4>qs-l1rbPjGo%<{k-|DPwnUj+?k#N zxB{NjJGdu&z6m^OzR7T-`j7c1!S}!7`F%Rxhv^P<4{!dk=e9@t;#j-+pWdK(CG{CJ z&m?#W$Dblude5!#?;;NYv;;labJjlW($Jih(w|+%yaBkr_I3~`Mrkz64N>pd_cVum?TcR=-}>V18z-NB4f-PI>z+?vo)COA zrzN;cfKi>V2=Rdx+CS8pO^gJtiZik2#MU)A7U~^&Ma^eG?G#B5^=Uyi~kq>J(k(Th= zr{zvw|52Xh1>ASf+4q2t=5ptF?dW|%a{1v~w>^LQlV88{ImpMe&i`|kyG402-O@F} zdj}7}N7t0czxjXf>(%bd<$vwgCCJSk$#eJ3l;`d@a-O^2EPC$#q3XH&M^(?=|E-Dn zcN03UD)Op6!Dz(JR1d0`PC<*iXYaZ7LsS;w_!~rzz3hDf^P>*|Ub?5cgL2N_y$-z! zc*kgryqUZ|D&1E+FaH|xc%SDtJum<3zi{;_Oul~)`mKFFfb)@M{qsvqejoV`W2;-B zDUGpy=kMeEJC|N|o^sDUx_2(U{2JQyr$3K$@9|8Z2Yz=z)3Xn<_T}aO3}s)6fe(NB zlmGY*1ZvH$jg#kca+EbFm5E8Jo5ef(LO%v{ckatn9d&k_w8>WU2B()(U#g4 z)Q@|=^$=~}>$&~xVY-K5{+x^J&wi&gR5seyJFo@330nQ?VcLhweJJg3f2XumHuAdz z82|V%-NP_mzVtOVc0pS~V;A6l_nY|ceNP<77RD>+NAKRde2MA&_c9YYO!IKQJKTvU zZxTJfQ`#zE0Nq(y!0`>>{Y|vve~5Db$cr{V=(+psqrOLbPd1nLouF3Xkgi_)g!IuH zSDwH2kyk(Z(Q7x@L;QL1rE4#o96Uey=#}fwUAyY}4nF0^VMgbxpwoWXIJb#pCsjT_4uf70SSvfb6{`nVP zx&IRPJ2+F67agMX+>0-M{MDBd?yYBccm9pIPmpvIxbKta@1@;$A_MGxUc0Mv_#et< zS5ET${SL15Q`cX({tDRi(VOlo>HJ>0Z`4DXPw7`bapi?)uAS@vzxm45>o1&yUb+Ed zo&d7-#UI@N&^6~4>J$Lf4 zS8rV5=-9tEo;?}-#Ea)oyeIC9XRkf?5?xK7y?*lq|6jd%?Z(MVH(n&>K1DAJCvQ83 zH?9+R=nG15@;uUB`Pen_scS!e?U_fUujBE_o(keqFI~U-h(sroXJ7o}3ErK&_|cPR zUcGVS8p_xKB0lxe7jJz05g#@1_~gpTGtXXs?&>}<0K0-OpS$uCH&3p7^4iT8pTBnU ziR)Ldy(m7#D6>Hs+XwRM62W#woqXgc2ng}1o7X?~!jN6OY~C&oj?ndxkQq zx{`5TkV^)S=gQTqAcp_PS)+z@dpOwpPkKE6@YUy;oV&#Jcz_?vdhp^a5TH+>@w|HS z%!^39GgWG3UUaA=#uvVW|gJViblo|SMim{f`Z zUXX*lF8jDql;k>CX)FGUkmtBMfDd!L?&p+X-7;c)W3e?jNAhZp*e%)RiR{=p&9S9~ zGq6R+_NEzo0S!e+jcW++0mq9r^=3H=WtE{2gMm|vW^|4>kRO~ z`)Cb#C7r>dh%`xCO=XSE#22pg!`vv$5kCTaI31|?^T)!2_<%gKfw7Q6JA*M!roibO zpP4D+X{i}RMVE>y6$7&Eg`9!sXr=p!W8vYe(D_v;YC?C%B zJDr7Dj-ss!#?X%CZK+uI>j{3`&yBm$W^;PQ0W8o33 z2&Evmilb%n=jP!tWJ9&=6wy8l`0FSa?P?J+Gf6I#W-L*YS6i!>bDUD!(PH}2%E#nv zCmOAVW3AO7w@|Y7cDpI~6K!tPFGU=uR$2qv1@wzOuBq zI*ToNCmw6s#xHeb6s|lD={55jWp_(*|H_4+gW!b)7WM@6>?6(mnd$< zsIVPi)w@rraEUO7_Wr{CdWc_@Ko!4`N|d%@ipe+XIpE3_)WzC6jU{KmrBKUf%2evvb03X0R?Ag+?W2-~p6bC-OmhJd}TfSA34WZWV*ht^o43?SX zRB2g*jk>W?VQHEvqn`LLTHk}?M9I$y9C#fC9_WX?(z2gi7v`00HQe+yWeaUqv5@i2 z`ct8~a)!Q^781KdGc|J5Y1J9#`?fSy9DAAvA9TksH9MYegBK0R8)(p~7_nTxSL~K> z-*@a~uO4o!jbdjCp3ALH)<7HVyC@!1)wJB2^%rPI&^9epbKngLDP8MrjJCEMNEln> zlx8G66O1L`)#geoVyfvZ>N)Dfv~Al?4Kmdll+=D@SuvGGr{_p<@M{VhIBnopw+*M` z7)!Lf&ZyT_GZ;IH&R~+7^twT>4uN=w^?Uyv(D1ejd9n%zw71_}_IteP^g8ws zb;h0o-(}4n`p~|`3!P3iU&0ul#w*6A(WCmdhv%K1DUVXa^4fN>fxZ~Bl}l4UZi}`y z*oaNBs%vJs=^bvwS!*>(S;JC>)oInqqW@5B4Q=nx2UwTAs=Nu)T%#E1pst6ywqdF^ z+Awyl4$=N<-BD?>7AK=_Yt^Wt9hAzgasyr0#qr=}%rX4laHTEQLY>rFnM6P*^cy)H ze5k9fh-7rj!==y+iIaMBSsun`+a7pyi~Kw> z>#XNpIh$yg0yDc13~$r5S#PG~VzG%X$I}DQ&M%;D2C1EkdFzvOdhJWp1v8Nm7RmHz zDNg-kev}DQdyXHfAQz#&JCRl}zHCfe;ZBuDS=9H^`w&07aQ_h)twLd5hwh03KH)6o zPV+wwZ5YboFfZi*GZ#*_!(v)cTWec$&}(e9Py>C*U@i?CwXo{XRup|$3nYt`dRq-g z)~2}Bx9ZXWQYmB;KtGQ;p+D>$`MqA`%#RWr<_uBHL5oMxtBhsUSK;D*j3fMGJ%jO1 z0dwdQaLQvojWL5z2_%JFzA>n)`AT!zccM<*ae&RpaU2uZmTmO9S-%x2jOC6rnGF_p zTH6ktmE*KFTgT_{oWKJYnmd)e`YMmPLY_2T!Ld;F(^z{fTzp(IP9RSu?_={p9dk{E zU{3|dnL=PR%lgM0>Q9*Km4Y+Cy>J{fy+hNnoGEVUz`eG#2gS({kb3K3JHznA8{q0- z2C$Kve2v#R$WJ{19)!J>Ofpbum;Iw{0=l9+@nkRO@AM2>#DW#jhg)I(AI7}UFMuaf zFiCobuo|q$khL(kuw!U%%{9ia4&-X(@anssr&MMGk z(l5cFVDrC}Kkw(21nC*VXk#!=gkC0m;qf~gZ<4MgDQlSb)Q)g(}j<&Q2 z8yh!He7dD;JaeYym=H%hvGhf91MfOmFI2OPi{sqetqa5zJMRL)*|_b>^RO` zETsdZt=R4^8W!3x%$-bE7OB3s*7dcNCYn&b1b;ADFC6ln(U9o)PJfS*DbUQPuOupW zjE;ijh{3#~bzvtyV92K3PuMR7$Ea!?^pwRt9~e$Mxar-64#@4> zzNcs4#o=>eJ-dHfdgx4nF!~2C^lL~H_W5y5?E}Zj?C<%XU7irBAba*u8RzNV$;BaD zp#OOmhqxT3IZv>^pm7KK{sgo^yMxzpfpHVH*K{zr_j&Bk?9CDX9KufYIlQN0P%fkQ zql!F-3AmuYra!zM1|QK}V=P18viuJ6+~>vkd;UFrd%@!`%WMC955xYRilgiOb1v-l zx$?xj%q0FWyu7?l7x#~I*}VVgh*!jW6gNr)LCyevJ3!nsuj4h*7J71)jvgn%WCMuc zK8iER6aDUgcaAeXqJw?o@=W)KPzL5HVLWu@&P{W{zq)|Bxi1g0%<3%F6MDv;)4&%O z_^;C?4#*JCLFGlbp-!`(&iQyQ9N=)?-Sg0e_&MDl1pin@xZdO9<}+gSaIY`^*AIS! zMu)Idu>^Ml_yAr;H@XKcG2CP45shJYa8cc$AAPes_=HTnqBf2mx=(h);weM@)V=z(@iCoWc^H@Vjj+@bGd9(lc41wt<)z!?z@> z0VcNx@(11#-;Q@+UUQz=UapC5BU#`R1Pf$?+EvVZyx=g4HwZ%a zF4w|=OtodDDy?}+4;50mEI0P+I)}87L1ckTq7Bd0(Vp#b4U6274_8PSy{S(l8oF{% za)rJDKzO0kY&Y8jecGF^R(;#+*j){JU+CgfvLgkd1BO1EY&Nh*Icl`L6?3U^Z?G%= zl3q>)?a4k%_9@l2y08lxGH?^{D?6%`gDp308DzhOEtl+s)&_i&GQc`!E9)V z)s?}bE2ipcAMejJ3xS$#NIGnsaVBeav^wc^w&4G+&!LMW9FQe%g2w37-21tW=!N~& zOY#mGLY;;^&9)}s1M0ZlEa|y*LR)q)KhL*EP@;=9p<2xkGFz*f#(IDV>PQ@H>}4`? z(=em8N{Al{URi8)_|CQr8#Qd~=Af$h5*X97Hs%O8APZj4U?~PJbR|kO0`F1QCe3)E zl6@Sua%%&br#7@=iW42?ms-IY#$+cRH#T-C+v_%KFdg*jt8#g4iv7hl#g%iIzQWe# zNTv2}92fLK1*l`Vf3$?q&pfKxK2a~P34e^TK z5{saflu`4MogVfGn6S212|_0pH7zgfIn5H*90;(fRtBB2IxkfgWV>(5ViESrs5Ol1 z*|`{IFHw&s#l?6=d zi}_hBbu@mUeq#*Bacy~B!+H{|1)(-J6&Zppkh5NUo$R1)W?@ScR$>fzYW-4kpp1o} z0oj7RatPZ@s0q7{X2xsyehQoW6gZGAS8EVI+L30wUFc@W-j4c|4~^y0dQgl(zG8)J zc#QHP-4{LloL^T0vp&CY+bKygF)oVmVF@PJR&|x6zCoC(!3q>Z^%&qWGYr zir2SJ8un+i3OgXiAj`I`#oB-!b~UGIJ2BXx(#3H<2>W?lge+oRmRZu4<=HSMPEcOQ z*mNdnFE2dK;&s?OX6vA%V!aXB{xNQ{q-ZYTQ<{x+6ZG1e=s)Ccp;KuTydq%EnYORC zE)SEa6Lr{`QO_YqPOLlF<`%8+MpRqY%9LP#wx>~8isx@2wbp64E?rk2lKs1vYF0s%V{Yxw8RP4#H?Ddmw{(X z*u`O2!|2O$YQT%+s#l%#ixv z&1tFPm}N;GL@Fa6=4Yto7p@=fc!b6#8868g*$2CY@kpMBXQla?Ypur(UqTQXtA?yD zI}+x0QR?HuRUw;5>sGd22_4G>9$qYefuwacYDA9%UH36{)ZYyacKle1L#*o|+QSyLJJ_{r0|dlDC4sf9QmsEgzrI3W zZXwx*a3@>!14Zrmu;?ScojLIhDY0%42f=^Hhr{c43Hp7Vn2QG0xb%hgmECKKaK zbvCsMRd0CI3@?B;>d27n)WAo}&ndrixuToL$qN)m_F-5m(eLf}ab7P7LLA@+jXeac zdaF#7d3ZDmE|q-BiL(Za$raTnp%$JH`0M~*cKWjYlXv}GYcFDe7W7}9*9!ul+1glr zH!W(x=KX0b*W`1Hawrb_APx-8H5YeE3o{+lV=#apGcTyjnc!fYO7NJhJ`jYgy`qc# zp<#W%5PSi=%=K+zMbNyEei5D%pbOx*WLnmm?MB(?CcDtjTFjoo{HIc~ zB`!qrfr1VMx(evInaySsTx@efuQTq)CgC_gBAY4Arw9>Rhe~T>kAw%Z_c15ThQ;w>)n7yMp}&Hbb)GN(BqLq~*4n ziY5C=%=NLh3%nj>NM&&(Jji~-))|nUnd5cTh($JLmdQU5_AsNGg)IcI;ta!4RUyzx&Mlu@YY(=Os$Xh$0!8>%0N+Ui_>=7+13yEt-I0pvMkL$n4B#UQ z*|e(ARR`g}Cxv*TAKAK(ga;ZZ~|HE;mEPMPf5E&5&utQk{;J4=3ySs?6t^ z9lpF#p<`TAtE0Mm`Og0$FRaB-XwDg`t$5Vir~+Fc)+u;V7vP`c`lyzGhi*iZ zja+@qTZUO9`waO9%M=uE;hxw(Tj|IhrnSU>9*hblMP++&JTjax$j~{(mIVV`H^(5`rw^86x zoW%yKe0HFaP17>s%EpdC--SgO55wr&P3Sb>dsP``eExtI}0CM@&|$c zDtz=%f8x{bCY9_I8nDGldQ%?jme_Ec|BE3LDmSrSg4R;e8WOaLI1A%a3Tx35Ib>S?RyXz89!evM8HFv3PCwW{%2f0C;gU_0SBghHqR?mlFUaG^FD zw%fQ)exCheO2Jw{vUAE>i}!7Ztm+Pqu~!9R3G>*6N8Q~>M#{DF!NnOx?O4qc z(PpXD!hAcCB9#QUET=+ApHeq^L47&U#D!prJN?IL3%H2Z2u+ z$JN@|Ci=vz9^9IZb+!Q=wAzoZrvm1GP*bCgr2Zzs)mB;~LI+^yb*#H(V`v#?jNj-P z;3Al44oC9N#&shu(u>+nvNxHkIWnbXV;!#z>vGkXAFrBIUsleH+m(K?i}s70aayLS zPT}`2K);TBk*7~@$K3V8xYrdjLt?#GeR&}q*vHIv?R~&DK`0=G4_*_GC_WG5u0O7} zi`ikxhD{AnGP3}KmEiYUsmha9H<$zSaG;xnU1TCGA)hp+CSsAV5$3ar zuq(GH%aQ5>JbYIVvVXw@&IE`cbA8n4YIi_}rsa4fpP0$ZX}P3$Gu?)4cuDpg2SX7w zaNA*Q!ffadLkc?%&3VvXEgpXLZrs-+-o&|$lfZw#MhMx7JEqd;6mz_+XXb zJjq=gLt55u(ISZ6rV~xoA1I4#(9DjWfLx7^Fy4J2_qW}UU!til2MmwBt(o2I@FJLp zJrlM-*2YqWVD*CRoWNs$(5I9+v(qy8-D@A}ysg%mZ{gbtKjs6-@IJfqK4u38vs+So zkiZ&XPNv3z(&9(HEpTwzf4Dm{9QMz4`I^SoL?8Qb(tWDqodNSX{K%F00@9f^nz#Tx z-LU}BVEr52x7m1u#)JFgyq*L8^K0bo*a~6-?Nhz`=RN!nlteTo7<4_z}-t`6ajDB>$&kBEC9!h`tF4l0}MDr`PN<-*?xKRVOg4Y*Ky#N!!#fcc12T(oCeD;rf1 zLZ{GZ&qyy-4UIGHNV2ai8i8nXh3~)v0vqy0Yb$x3WRyrjc_TpCvG5qd2SX=&%AU+5 zM{Ilzn7v{M9H1q>(Bj4pniC zWz>~WIZHBx!=(?^A@Y+0Z;yrtA#h$V!aV#qG4FI~??v5ArrYgaQJk#H-6-NBiex9V z%U$TRb2ZmS;wAkJ^der^3xfE0U7tK_L(ePFBgM$BIO=)Bh^-UlX`j1=*1j{{b&)+Mx=V=JNxqQ={Lv)ndsGR!Jow+y zbMT7cWqY9$jY>LKCI@`3dIWqr&_Lp`#~!7aH(|9S$qttuAZ}uuD^nNXten zs!bkomsGdy;xIRF)0mxA7@Xhn0okEy>*9e6#1~afQI(l(QYE{egt&XKrx6TxG-Z{I zuh^xo&AQ&!q?As2UQ7?ww`5O9a5%!5V=#4rsfzJ@xj;p8xQfV_N#zk*EU0JTz zrNC&j+E&&(KS|IU@pcg;2kF$5Po5>}^|hKupky(K`b;rCtFS+-`nZQV70RLx=4kZ; zjRxui^|ySiT8Gafd}nPHv~9u$)+Adkc(bX%CLSXDcs;b1t8Fh2A2grSw?|)#RZ;+PwN+xi!{dUypwG!y z&Gl)|%>$5E*wxA@*vqk2!6w_9iaH@Fwz!byLX}JV=6ize<3+L5J}hA zT+QK6P>q^mc^g3cG1(z(OGEuE_SSKUY%`fAu7B~>b9l}$d72_03g5^g)2$%LV+ zPT_~R%*+mgbqKaMg*rg%04j)Y85_lNYuG$sCkT~*O9M4o$GJY~RcGa3p-J(^!hAmv zN~|iT;Y-6l)y4ZE*24y))iB~!OVEScfpNENKtB(Cc$;id7p~{T5$3ZCc?IuVXe-H& zob_q&7e<>(v3H9FvK41Di7jjd)yXypy${)(e5kwT5~_I^duk)R>u(0r0{kCCTSIHW zM-Oe4Q)zY7_)JM{Np}suTpj*>1>2J3%-j!N*Gbn-{o}(9mk2-6oy6XmfgRo}7niK&yJO(0?;8pbQ zx&nR#5%_FoP5Ub9<*=5X^U-dx3%|!0z9IiXU(<@mYL=5G9>H$oG+6vcdhW!A&2=!` z2uHn8qJUOTE}2$Pw`hHnEpG;GYP*im?sBofsO{gB5!0Le)$F1=-$waDqaxP|{InUK zqu&UYGnowhN~=(UEDbf3ZNd)Hc8qD2WCu1|*l|qwK5DQP)?kCmBYvs|TUELZe6-=l z9uB%vhxi4XRHxp~I>Ts%;zujT!UO$zOb=SHGs72^@IcH3>IWrnd)bY4%X(;@!MXsU zwBUW?erj&pz0pdHd$+a^>rfoS9#YKBDYN|iY&`ouSH9m-4>x2^ck!`JR zYv~;PB4^!>-9Y081zxqd!{fsB+{X#QraXtwe-UjG+9ulzIm)T^yp>1%fnY8mOmSc6 z$m_;fiLOx(pv#JtZMgMQyJbtm67Z-mVUwb`?Cp@aN_n@v*`S0r9QfHS=(NcPFO)@} zQvfcNZf8U&hy7FKN7tt?jC zZYb{a59Wh7w;K4Qwe5pW9kJ|Gvc)d(o8o77w?-V}j}~m}4u)Vg9X@U1WSd*J3TiA_ z>-dBEDAH(;v7T(aY_|u9!8&7Ol#8}j)Su&^b)pe3^e?%&(C-%cRz9=sD+s_&F;o)i zkuq0`Vr)_`$I~+_G#20^h&BdwORUPR_$<6mWD@JdbUULMqmf#;Nwz{7dqD4n{s}gg zkrGCD;Z84VRU7Mo20eQ)>DwYMy*y<$JEXnPLHZ1`sUW;Pel&)s;_(c^KEm`>XR%I0 zF>g2$t;!{6onZ`^nj0p3Oh7)@KbHByJzW0euKXB2@E@^{gC9!lp(x9H^w>=Y^A{wtA`hJeaHc zC(+c*Fw2lF*bK-<2=(-k>E8CXg1rupz{a!Vjd#C0I`n%{*wqf~IAlLywgcDqrq^Ax zNk;4PCPJ|x$ridZyg7LUXs1&4deXz|$BGB&wh(Lbc|6NKKL{~rxB|Qm;=RW7st&u; zirdCpct&wlm#~34PP-eeo>ObDW8LxPapFN6wGcdeJJbWVDXgiowDg*E>+>|WtEh7Q z{$?{_JaH&?Eo#%=e-Ox!!jIv^bg`tTK9c_GoKS!HMGxbO`~HHEcsi(VkiQ!2&SPa6 z7kR%tOE*%64}0W<7mzA+pW2kgC1rJF@00paF^>%o&}~s}F`rZhKmHu@19cf~SAL$G zWy2NkXcbAw{KP_Apiyd9uIMV$h@{X4BbFX?s5@TJ_2a^$m}?;Z0uHLv=XLwwp6WDc zKebBmPgwE8m=`e*rp{*AbM2h?j`-FrGz;hQwCBlV!~-A@`Q0Dkvp)zYc92cBMt*|k z#tFeVh@t%Xb96Pkql;q?K0EK~`{Uxr17*LH8>T--Kj-SV>5PL73-@*Wo#guXzxf^> zkDun>sl@N`<2zC3@xS{XKOR5Lzf*~ijUQwaMthEN9{d<+Eh5>AaL_ZFTVYtI!!AO) zY^34cb)~Qwa$IUAPb$H=RBw&b_556}E!ThMooOwN8w1i&`$t%pNN|Hz^oMvb z$^dSfU$P(l0pMX;FT!EnxH#<@J`1+9Ef(yF%Ulsz9pJb zZ1kjw+~CQ62fcvhzz}h)1M<7Wfmjnj{#+rOSRuBWh8U<-(lG&6=-(kXBs1j&^vyYn zvo1hzC)PNr#Y;B9JH#X~4EWl58T>8O3 zwM+2h8tGxj8WaYLVG%=q%EykD;Ik^j$1`LbIf2=6tYzJu6D)Tjnl1Fs}bWbDb+9~9yCw7|9}Bu}i)hz9I3#gt_? zt3tJ%#eSb$yC7CAvPWb8Ir4+U+JMxoWI2^(1_S&|A4MMJ;8B-xP{n}X0oLhSus2%NM4^`OBb6U18 z%tpQ3pxBDkuy<3r-L5pYijDm~?Z!ro29=;J+Un|P?JnvZ))_NZ8LctmT-p}PTZ!79 zO#}8p*eRNzw_2h#7Q#d~wi0}CXm2anZ{U}c#yY%0B-_9JV2TUAV}JYScE9=3c!Uwe!La>eR87w8uXWKYHV3X08)c1Ws1 zR^V4YXy#T*7yC1XLu)$(zfv;_9~-g>!q*0|I1NXEE*2|_NWBb&-fQYAAXRKh5elOLU_;^D#5i^<36pwAlaolKHOBciD|pj zYOitME$G2cU@7L~WJgwl*);ZygYF8xUKDrGa9~@8AEANRgHBpS8rU3Q!!bCh8>#_5}~B<6HpyR)W`R9QL&$e9ME;aXX6YY3oC8}__>o{0j4WCJ8+_Tq^BZ|k_X7)kYG})eUuyJBNHSE{q%a$ft(96Z3Ot_bsA4x^bj~0vVjBkNM-TM$(KK+#=SGSU6>S< zU?hxn8ClqKTa8EnDxH{NT4sKurU3_RI8qOOM!*I5jLgZREl;xQGO~p0q=vS+Xk))P zq(fZJCHbrtDR%7uu?u?<3;j{HH7QNl`nro^fxg_=U3K6CnWH$=kf9XTve=4IoKMrU zfgpMn;3d^C#x={K0LBqI+?wQWYQ(^;*v zIe&XJHj|T$r6z=AAMl4@H^=^)_7sjrp_U69*`1fwY2Ul_>3y#-)0Z2A?cY~p?Jnv+ z>ilS}rc*t5*9H?xepsqxEW4wZL)jYHt1f;ZRwZJ0qnpN_nb`^IIremx;w;vM6jZyL zz=-0Du3-QdQbKVxs0nZ)DkHuq+Nlx-P(G|lK)_Hf-$l$v@XJ>-2k>SyLWmWd7w7%r zU>frd^<`ug;b)Cvj+;+WJyqs-mogoG>nqXVvAXw-Wux4ZNWBs24n_Kgalx=7Z#G=dK$*-zSB9z}Q?X zO6|Ou>Q{Q3s=ASe8&eC-)`MkrRd)2+CRY%2CDEy_Q=!o|)h~MC56pb2EUft%!^l|j z@dCzhb>v3Z!!GqUnE{IGpMr3Pkb(vykVEqm5Y5vJ@3kPYZ zEj?c`N2Sf2YywOdJ=APBkR3u>V}mPN-=?pESVz)x;Qs}?8(KEW959=$&SEEEKLE-% z?1w*R%#w7P4^rj0c)N=+JGEKV7rL+`TU>%qY~3h(jQ$1j_9Up(Nylzl+H&N^5G4~J z*$sx)#PUUHpM(+2J9r2*$&N#>95dgjP+y0AjWE|Fnh~9FZEJqoCl7SQ@4^SshuNEH z4HV=G>(X_^MZ%m7%!VvLHvkw`W$YV__=2_u^MJdbB5Vl`Y#d|<)Xa7_sKhIoQar8C zHd+b&IHoOboYWae&<8z2z=6d(0@om?T+A_a%Vh_#Ih;W z&<9J~(tPj_WVE5R0OxCL;iq=AdDLG;1#hAr*F!)%|LrvD-8PUhzWtUAh!DW;y)sgGsdZ~>BE+}x1Tdy_I`v| zw?LsWCW;eN0-f?iF~hFE9qKvpWA{^A^EPY4$v+r%4ssQPUoETke-$l{@t$no5OQji z+~eFXxVr}qZkvUB_&&M^;ZUPJVNs`sSi505&Gn)K*x{=NpKAE+K=%`})X}@{S9?x_ z-MSF;0r%&hWH;U&?j9)Y2G8JAhcP(DY`CWWm2{w37ll65^XcwRa6Dt!>t6Y=DD}3FtW*EW~VsBtf1q$Lv#EwM$Rw z{$`H7FQbbWz+sY3fYZ9CHuXPr&GC>QR<{{aep-O;g(_@r8~r}d`d>=-m=5B}jxWR$ zR_ghf2=N;bj}U&cqY+m$_R3` zA$}e2Ab1Y)1N@BUuHPJV@z{5h{B-s>Fg(a_&W-!Q-~f$*Ck+J1zmvwzpb3+Ge9!V` zeIK3^a^Qy!{n7}rB@W7E8C~EH(QS_hwIA-7owYZBAE3E(WoOr)4TZVw58`Iq)b4}Am=oqD?#7Ng`RR7ZSK>_3=CTk3&99k24WzpQRs$Xk0PHf z%O-mp*`~;65YOR1Nc*|4y$5ZIZHYDRh#@JZq=k};CVl=Y@{c)E-*TjF12T8K{+!L5 z*f@h|MSH(ey91lDQW=)UTLug5k;rU=u$76}+s;-I({BSEHu#`2UqRYyknQ2Ze8TA3 z&QVNGLIL|aNTig2-nI~T z6DB0mEs{+Nel6H%(2kOB3llx)YHj8pL^M|sqYyR?75fzyqvY#`Z=lZ#!q;sBJ0bC{ z30q(nK9f0Z7AvgV@(g_1)=)5m;V6G7E7o2S9$^migo-&Rl8=|hd{B)bU}v^9-~)cZ zhDLk$nIh@sQ}APx$d*>XeuZS)B>S6UVL!s9khEv9%EnPAWDioY?jQS|k!>ZI85G0j z#u7ScKaN;IupcM2>#U9o9Bc&x*p;&^?j-q1G5d0~3VV(Sx`X!Jk{%pLQcBK}f6!Lh zkbRSEy6{z?SgP2w(=I~4KE^mu=bD`ea0{w{pZEm3R!%j`g~dwIM`+WJ;7_#UCSoc< zw!jSh2X82z9m;~gGTDwP7Hz5o9H5g1oTwLLGrKIz#mu@~OVrwxc9`E5o9+1k`wvli zYP)jKNmgp1N*eLi!q~kp(u-s}i1&%TA`R$Uv8Up|T1-u)#?zjGM>{C?F|GgbBPIdj ziz<^KWFGtVxxQYIFKVC2hKU%qQofMct`NX$YQd)nHmLSeteW+;Hx{m}G%aUkhMRJ4 zvz?^1U?enCqRz%nE8T*T3MaX6y=7&YUlal~PGaHSuAM&;Cg1~&3DIxE2M6|}V#Prm zNZ9bOMj)OgES-Y}H_SXvH zq`@9#6f3i8e!SSiC>5+EQ44<01HHeA98vEBT^q(xt<@Yd#o{L_h&^2qQf`B{f!Et>!}B3*R#ZzFYVX{$5%fu{dE{v*8Ov-NRoA*N##FV%_zFURaL z8|V=Cwpm__Y7#bQ$C7fXky*BQjEOINAP?+8w}tti`eSHhC$JY6;j+bBA$=7`I~G`P zrL<{DDSt8nJz)qu@xj;GM|<}H2Mu!x#1h4xsZx4t%DzqnYZ<&N6=|^l9TZup*Q6W{ zO|dorJS(*~!lb_Lm+?MTHF|;7QSdAuC}f4R%i)}p0OTmy~ANo z9rmNDT5fhI$V;HSSc|Lvz}SkNYNHdWVM}%Dhc7-pVetkr55OFq$J{hH_J=DiD^hLE z(|RlHv^vRJ4Eqvbea=+y*0HW<1U<*D&w)&m41o?f+W66P1@T3<@mzLL)Y~avWmV-; zneYhfWBTYv7qqry(L)U?B~8<(NFpGZKPAs zvHnMJP$1e{%=?e2ZvgajV%00-x1$MPH>Toe&)rCr?P(kQa zSIJH~YqDLL+xXN1$RG#!M`y=gE%77UAfwGA%Y8QLp*>Q85s*Tq5sBn>A8ZPa1=l26_qO9ln0Ji!6frFOkDVVV zaAi=udH2{mOwpa~^j2G^HVf+s@3fXp>#5bMRhSfA`wiP$&YHq6kLmPCu5=meGV2rQ zudw#&7a-EHPg z^uuobNcb2YZfw-YT0d&?0-NDHWRn6;#23_a$d%*B!Ga=>Wi^$J@EfOx7yzi}nu9&^ z-2MLKMYc-5+azDG8z80t7R5ehevpszxj*N*ebeR0-XU*==-I_!RU;e79zWg<3Vctl{(4k}{fx%jYz{>>W~|5I^?k#Rn4C1F!rC=-0$9t&?3&am2cq6g zuGAc@p#$=lauL6buzX4ou^Cp8T(dnMt9ikR@a-gzd6;)ZHc~b>gPwxN{xx!AH~zi& ze0Gm5jY0SJOnL@;=k67a8PHMbIJxkba^!Y1t}K*>jrn^OdIH@pPskPkJr(?pSR6So zV)jjH&~wAyU)9Fue4#eyLvzTNT7>>x>cS>Kz7;vu^;?78jQm~5UPAhLvZdKx*ccEe&&K|K1H@B=t{A>u zIjl2Zhm*2@T%0v*yN#ICqz^b)Lqw%s2Z@q_r{9$3>O_|x@pe=c|tS91gXCdERX zP|P^!QDCPkFR(8Ve9$OnssZ}js!sM<#E!&!6>$ZlGW-R}_MjmS74XC=GZpSU{fTdC zMx=4cPwOsmkUSsjp#2{yKm2H|3Gm6ywsZJmVeiC63OaYJTO;2&_yLk#mh64Z9s)U{ zz1PSejKxr;cR`Xb4RYn~dqg%+8*wGc_X|9O{e*B9yOB%^ab>aIvE_z0hr?Dk~wCGP*qJwN>bZDUK!iqe8E?fgUfa zVqe8{uMp^VJ7O2UJ+Q}7d`!YI2pNm4dXZ5L^xCyA$Ki)tshM9hTl;Nv3mA`fY2QtO z?Qu6)P+UF0M|QJrX(LKSv}%zW^n%5}IW0kKiRvn=q6A-rfdo|<7Lz7^DR z9bxtVvv(d!j%!Dd{T6yp(0dXDz4zV#{Qs}mlNZfaKS`^VG<*~LB6MRoG))56o65>8 zcg>g=UK*Rw=c4<^4E?CL@5*P&Azm2?dqzE$?r*u@7>?;!ICBHLJ9bTQXS4|EPZ|%^ zL41}N*XLn4D*HvMSxp5K<>hR4Ht_|eO>2b|M{yXz$7Z*z?v{6ZRvBI|`)2R-LM!%V zHEwse_vYZxr$3WukErG)Y;Dncw0$Q3aOuWPuXC5~9epRnysG$+dw6Q&bbe63KHY`z zvZ-_gFK#Veugp@ZK_Wf5uBzvD#d|*QjR^M6?Xs0b1ZaKjH17q>Rsd7jtugnmZjX9p zxZtL;2Yu>H$U#ST#7w9>OrU|-?6_;Ax2tu5{)C3+N^v=h9oB&`vG=gAzjoOFyV#=P z*T6|zPo}%{BV>Qb>JYz! zkMRe&oG{ybXxW(Ud>!XLV=`60E${R*u;+EE0S_!u9u6_L=j>zp5`+^q2Co^w$HA@+ zmr$H9u&7(-Rk&tL3B|}#8H5pz5?*o#r}MB_gje_D9Q$|T;f}NUgERJ*TKtKAHOV&* zpD6rsdXH=P5PV-K8O#=1McPl{K^Z>nknXjhkeafqnBj|Y$}ymHly$jC;~n$zgi5f z7aAk;TLIFB2RF|6zzj#%WF;LMHW$eiYjdd7iMpxX(z?5waKADURcMTg*?xwbpc=4e&#P3_>g?t-5+8|CnEdB}{f;%Ii`+4<&C+$uijYf}SvKH&Et zZO9h>3XiUbz@XyV(cgq~4z?}iNSi6}Ky(&g)%*0;?(Ul-c)6+C$M}QzBiiE?J|e7r z()uRu@57BHtU+WtpEn1@r<3M)wLMNIj+r%f@CUntCqd& zU3!o9dA4|2Iob>CQ#@OPtEI8M5p&d9Ulz^8(m9VL2XPe)YZXVkz#h)}q;@aw~a3I5(k#~gfy2w#vkO~V1UV|EA0ryafS<=y|aIa^;Y-n zSX{fuY98LDdbde^p2s#wEXBcwxe6XaNpVt#^fmD0%c5Vu!`TW1n$a0!Jw7LPq%d9h z-Lx0ug>f`}xbAD!SmN2Z>v(8|e2zaTo&HD&u(8yuWz+YJ^gN3AAE6`Rg{IDAR$bxO za9-L`tGL9or<6E%a_BY_8+H9!(Rbj}r^inZM)M{&c-V&jIA&B4ud~~}xtsLixroe? z_Xxb>$0{{k+}gMHW)X`_(dYaef6z!YN(&&Zb-fWC-sZ_0+r0LoRk^=Zt6lG4^mrA#AewcYkTeMKxUb2VC&X3WKkAd&EYp@TiR6bv_ z!TR?8Jcb;22mvLg+)wZa$$QA*Oe6no_+6X_@rnA{$7`L}yv!rH4_N8qvI;DPP{sgW z;G+*-yE|E%(I8<*D!sO|8AJ=s-f(IslD9|p;ymrk`jUNgSR>?%CPkZX}?EkjxldATL_c3$`<{!#7@F2#kANLBrpKnXi%|EcmDwA3K zukvN;OB_|TGi{JJ+&j*O33Eo&#&&_=>c5&x|@6g&fy^uylU>z>WPGg39qbj z3LFGi6Mo>hGq5={^8HZev`Sm}0{IzUjBb38meNL zRf*2>;OF>~EoZOw5I;B*L+ZET=XIQSOc{Rur}EGqer!naOvcJ7+bTu3&+K%59uZ%Z zGL#;EUxZUk{~IJ@^6?<1=CB{(q@LE2qM`?n2>-O&X9sf~d=J%#=zMXtz|Bz%e#pw!L9{zc1U!G!pWr1aDQ~7+p`gPH zvqq?&WrDJ`W23%@^mp@l0=v(rlIg!(mzZ|SkALR>%8cyp+(-BH`#CR^M`Q%tFi? z{yAUsOJ24K_Ae?M-P}B+g`oUt&#ccJIGot+O}%Voqf!jAA+{HXa_Bndw;!`7s;-Pb zm+3$6ynj6#{@}MAn{tRJ0#{DY!h6)eDbx4El%4maV7{)lqTa>zQNAM)_El^i+gjUc zKb;k{2mM&055MjA?{etcdTr`j`*_*nbx-vl-8t;C;*EnEppw2^ioNdR`m2+5}uGgh};pfcmTML_-k+ijrJp4C}AUpKPVgr&Y&0i!5<_}-nwbQhv|aj zb`P!cWqD5!f5rLgi>6I}E&uOdzq!m#Mt$C&KPX!=l*l4zHMnK$FnI&#J5%rIpSo*o z@3L_zRu&p;a7BFmuVT&U{3#wJwmjNHoI-KcXtPlAx!zmPtec)pk0aeDD1Nw&AaNMd3NN=Yscf7@};7aRgt5*p`0$LGU=~ zXn~;_?OOPdaP9my^O~;J8M)bgq%bH`7OKrLbIC6k;Ohd+`LwU*eNz4ynG=r;ZWO#l z&o+Eh!}$`o&J|y(T01?P`Q3szP3siAqA_^vTv)DbUU1UD6s=|lth&EWt=LaV)3XSs zX5;(6n}RdOhH;m(pzJaqO*+q#s2|3~c2PlS=*$=>3O@!@17pU$C5xF`-}wiGB4 zCvD%3Medhn)P*a|c#-{`SaupKtMfct9G1et2(eRx*s)_RxJlrh*zQ56kFAr(JvDEC zt|0U!U%NwNE)uwB6|XWxA6FkT*r0UdXa~l)H*PuATfTdl9o<)Lx?MEq*+Hh?udT{Y zw=ZlN94(Zi85iYpeY}3826ojQTOlVmON^F}&Wv`cJZ?`fX(oGLOX?$K!9IfRjY~Og z=_|2!01u~sn6|KmkE0VT+b`JiZUNM@cNX{TKpc?zE0I7Q<_&vwLKh z=VuX{F$_qsHW$6cW4je_#+~J%HN}pKk&-@IALX$Vea$PMC<#+6b}P+Op<<~$qfhwb zLgSS+0ZnGjQ&qJI{xG3Mvj~RKI>2KofqjhK^@jK9{bO}#Zqu=~9dqYwu!5>@;`b3q ztu}ma!nJ4T(L65muctdB=2WV(Nv%fI8|(UKQc!z2?R6aD4>o!mVS&t}aHY&V>$n~I zyB*43mZ?0%^w@2kZV=xwjy+@z{zMrc7_`DOAJ0Kw^pz9u2wdvX_HuA{h(EZP?<;8e z;RtI5r}gU=%&3IJO$z>C|1+iFDrT;2#}dJMiui`~-*L;enTtAJZ#C=Kr&jOm!E+wh zv(4FUo`M7DR8HB{UX%%Ghzb(~g95LCTZCq+z3KS)4rMaf=LF5lc}wvJJ@1Z2Y2vcF zp~sp%j~A)l;$!77y5_KH>Nn<+GkA;qc8bXj%|bt0OmBr5I8FsDEpyGLDQ9=t8n4>B z47@uyQW$l>p5tS1o$iAQ21kG!d7uo!a=Rlhx0z0psp5Pl-wdz#T&?%HQoZra_S?_Q zKL0`fU?AeOqsL|N?9WqH8;$K^GMKP{Tqpf&L2E;{Uvo3tv`q}DQg3+OhxY9-Hmcn4 zDeft@cQh-RdoNRXUsLp7vEjbpi zEi?zSSR_ymA2Jp(xnDhR)A|}O@Kx4qLzbNDg-AUIU#QV6mnv(BMm zuC*v-zsjYYwzayaSQlm61@Kv2hys5cB6*(M zJ&yO`wC-Tb(zQtu?)AI)gX~+tt5W^p1XH#5h7EjMJLV7a%Zm7Djz`0=<0N{up2@%L z)jV7f^kop6sP>@X1y?WY%7&t|jwy)w|9AYS`|+40*X#|=B2M1n<-BnmQ}GM;m^olq zi3B!K%YDpE4KgwOoccI8Fy-*BkgBq5tKhWwoV8=gbn1D-AWE^&}$hLK%BHq76Zuo+gP9eiSh z&5+(5OYOmH`p*5isoj~AyX#UkUI|Vco5dmc)DJdbh~Tw{%);o3qKgWKvjyX%41Rlj z^kDlhtAzWl7vl@d9Pwwr+Ttg^wz*snnN1x1>lRU_HDC>)uy;e2)t?4vF?)?Lg+rne_JUQ)0V~UD~xG zQV04g5f~5j!vj05z~G3dl_gV*jfWWz%Hbb) zg!%w|VL!iy-^mB`Df9UTb5Df>-aDtq7GG212Xpo`wmyxMzf2;p+W@w9Y1Eqa zR`%9+`hD~6`;Pzh^Z&~6Usv6q^27hN$DdNI|Mf-x*B<|M)%__y{7vn_S;?Q*ncL-? zxD{qE4q-m$Z|00YDf=OOCD99}sLc6Vk0Sy6F1v#Zr`38iKSE!0IE_}(>`FJ!$*5IY zj`e#j5Zb6;R@*&V!z9V$C_cQC4Ek`FKK%8BKc%^dzlY`?;!yapH27TmpCo&_WRN@* zO7-q|I_k*wbj={yAnh`%+LLyjn?;vUn2oSP*}2gjePr(JwffO{a<;gx@{2(|f<8EB zUd~&79pOjwsl?g}ey{TxWstVC_-m#toI4_cb~SU{G6Pem%pv-zg!;n(8Rg>+ZFLT z;_8LcwY*Pv*i6NS)GZvmJwD@LZ0Ll7(^fpoB0i$(9(=}|_nz(=`wE;$@(foG4vE*0 zP9eVsPn3jQQKhV6V3cNTsl-)Q4As%r<@=Sup4Zgv;}v*z!am7sQ+lJcmtr2JgtN(h6o>al+jQ7t*=^TumSi{Po&eb& zYz|{DG4-Ocjiy&QWMbDTKj3TdHL*2vA05FD(3Zi+#@>(}p+n!Du7!xxqDBr2m%Ge?OMCTq(~y6^LZzf3s-pun&Ug zn|@xz_DtQn9=18*mGHkT%jwmkd8_DTX1CSkmJzph-thU5;EB?`1ZST$TyUC1U^XkP zy)|RS5>LYLa65;`jk`*}TN=inNg8bayvv+KJ0BMPB=IWIHw@Jo#@H^aIqnah4_0oC zv%A&|9lu%OX-QjyYD)re6(xF<7=DlufPVx zY3W~9eQ!Kn$CABg!?^@=%XGoHb;j}LIe$Ms9`T1)8_cfv!qp8d)~!ax$Kzvmz04=3 zU;XfJp+^7PL^<%qFfn-IgKLoa6K!e5^|C{Z1vLCtsP{;BcO7!psluo_+y&h=`i`6U zRQxD(AFr?VX7jWMgKcv>X`KuG81~|5pdNmD=@vXNI7cmf3C^YZ>6%siJZV~Q7eVQG z;Yai#{-D9t{5IaV8ar(5$(Fh_jg6E%t|Nc41+ahsTwkgWF=K zmTsT)6c6AWrSmhpafIXYIX18OWR_ePZ>wbPkoGFXFis+R z3HTQHTrXngvgRR=OQnv})l=lm03gn&S6|-?`&rU!sT@`~FgiS&F8xZ_;LelYriq)V zwgDG;#r1yST7W;^V$z#7?$>Ocyf45NO07bvJa)5I=DsS{KgAzZj4k|!ljn95{Rd(O z!y%(zjXJT!y&gSfP=Ul+;Zo$CMEn}$M_V-`Ga_`0+Y5wOk) z`lIx_3HYu0r}(y$q4?g;B&c|@_UHJ6fjDufL#)SO`uLD^SS!3{X4fhPV!eEo-iLx? zHE?x9k?5`t=Pow{n}tV5Ov|-mK1%ZyjL@3&bA#o+I&6TQ;Ky#EIV$~KGq2$*;LTav z;jMz-PLuO?yP5pSo#^p6o1WIl+0LzE zqJ3Qz!8*fRVsgTreRc3LVXc2rwgnMtQwC>3Ut6&_=Wqt;SHceYHi8ClK`Mt#I&Afa zJ@E&%PJN6&XgFhmP$rZq^@-GX$$)p-&4HU`&a(TB({pbnd-=enQ;ZkFZSd8Yb6It> z=gcE3ZuY}U*Kh8nz63E4xeI_ryNmZ(7y)@?Irg?W*32mDf=xQl2!j z_O5kX>n!sz{vftK+56Zd8jL7{^>r|#<0`K1V~OeR^~{7UjsUo44(V9Z--xyYDlqb8lWh z{kBY6KBPosmN*7IU=07!Dd+Rhikj*_zXphK4ZxFFGw@dpjoD7&%Ff!|3sSel)EeTe0|n7XI$X|@3GoiKK6g-C(a+Z&t|d4N9Ms?rFwpxcp|Tqi3hk7OW*R0n^h{jZAW2Gb%lTU ze}5g8_x1GD3CwkmZ-8^V%<`V{eAVNB(*!?$LmQ;Ip0HppD6@_*eA7M}8?<+Z_%_5v zU&q1vSduqnP<^T^E}>#WJ}6M@n53S!gM!uT*Y}fotV-jNSoU(4*Krk&TsrkF_X_Zc z2DcHl2iI2RsT{iRpPQ(^h;>-1;!S$v=I{5675C7|C2RR({c`BE+M)7%R9}bG_Y|j- zBu?@6+J1uHsE*X$dNOkxL+1CTVKS8e#yFL;KVXFPtK93+9?hE7VBIMXZ{bI7vT?f` z@MypIY8y8@+LP&u@J&DSh6BSH?)Rlrr^Z?0EB|k-_D5L&0q+;W&9|$a=}mii^*j2L z<}Jz${!IURS%Fb9-`74p=!nas!pk&oxUQ|9Oc#f9IdOu>Kl*u<~hcYR0VQ8@+wo zqo(A~@Pa8LzRgy9DS9&&zHrd+^7P%h3jF)Z!5x*}`8RLg|EaB14#$a6x2pR996X-1 zzVTjr1P4C`YdYmmmf;-f`=-pA@BjSyR(CT=d42aIeW3U6zNXK$&s2Xh`E$N}%%Ji$@6YvTKX6;L*RPe}O!_?(z|n6G>w>Hc{=zWPO8c!xgFd$qf4@OrJfQ@`Q0 z;lAjz_vd>4ksR$kbPfMEUmP{Yhhi@3dj?Zstmr!*OA*>$^EftegVUHj3N}r%&!P~* zTa5ml)_3!{Fa|yR7=wDP@vHC2Zm-{Kh^uhAE@#dBlDzXC|8r9g@^83%{Pkn$tB$#! z>DbDT_6?d#%pQWWaqpn><@=>7)Wc+xwZP0(dQUR_UD?+|?MSS)Kskla)lhAzF-AGG z2aQr6^gVs=Q%RZn>IZtcOgHz_>)s*X##Rka%EWjBOUSOtW4~{75`F9s zt{`Q!V|+*WLJV9-xEj1pV$)#5<8>qNTA}zkvkx_@*tZ<5BN+|2PxdS3MsNc&HUnAW z%aksyGrol6)h@!7leQ@NH}NY&!j%;}QM^Fv-Q*d*j)@P4_81zFM(?$Vy*@-)Q?y?Q z9jc0a*||=v>=J*jILLrM3lsiaQXkS@M`Jta1OkT^TtK)*XtxRr0fQCZO1w&we=DcB zgNxf}jwT^_w9(*IJWlwIh-6V7%C@d==diR<+-kKQtWY735m}9IFW2n z4)OLsmO_puOSA5VhVc`2(K8yfRbk@7n`J8%Hr01m=QPk~tsUKkdzZ?j9Ldx${DiQh zVlxy+5+6}<^|D@TIGNRJ$5o_MjvUaw#r_Fen8lCTQycah`&MB`8RGuD{-L6%PRw2u zJ8s)fk{@uvYFgTAycTv`r5yB^W^Hr7-Rq}h3cbYn@wq-{i_0RMZHsXPpN;Pu%m>}Y z*e$x4H(T4bbt;yQBi9OMiLtul?_jt0JeW|K`J1Hr`&7~#MPas?EO@f`vTz>e;x(&Z zfi1`A8~q$QuVvz$I@fGG_1cuC#2*|yty;Gi&)y>2OrT%u6d>QZw@$z4)UugnstK>> zVc+dI+}lR2a&%^kS(3PFniEo8^sKQ<`V-`5N@Dzh&6(%kp2sN%^XI$;M_6lv_&Fso z^z`Dk+fS}u{?!Ge*`O)-N^jtP2m^7B&+2`6ooD0N5;^aMqT6NVw2a5FXSbvo_wshm z*-d9Ny=&#L03Kb3s+&}2&0OjGwtS=@vQs&BOJZps<~@W{v0H|P8W<}Q1#X=aGJw{pi{@ksuCwIO>@`U zpNa=(LLAc!*t3-*q~Ax1po{oth`^<7(eD}GnnU3ht?&m}%^Gk6i}}sG_Zrqa#9b*( zTh&fuG?gw?dIL6Cg`c(*UW0K?I5had2F#!Mim%!Nb6f?f)$TJ}h^&{fzS}K1!}z(h zoUIs3q0Sug*r&>&eRwO@L0_xNd;^XHUw)D7EUm+^->>eNTVtKcE!#lbvICE3Jh|Ru zPQ0>1-%-xSeXuAnLAZ8cZ0@ThzLz*rgU1HGs<$AHS#kPUC-dX0@Tkk)>ug%NL%nia zjVtc+T>2D$ko6;SNW-@3XugS+pPg7NUI@hDV0Nm}@|3oz4HE=BokNVw<%X+NwLeTW z;6t>)qYjJ{ur8=jI`jF}yx@U>m*J;5kL;myUU8%lUjC}h z(L<#VwdVU}=scWO+|DICg|~L6U0C-NPZ5rxHK*#B@{ zo*C!;&Svf&>&NHu(CT>SOy^V^_EVmGOF8w+F;7_}!Sr@s3Y#Th8l;|h=VxY~NW4O(J`sT90 zD{>~gXQ5XgXPs#SiKrLY4w!+`;nkjG@$X^d79udD&T6z#PzO-ek+G?mTYU7t;I=J$ z(;pM-eXm}P`uXzz|Hg8JApmXc+lQ$7eYt##^B&OSLSQu#f1k|IU&+p*@xqdrcRsdh z>dllxP4t;$>gIi^x4lyuDZKXUEd%5i4=P(G2|M@$ez3uBubON1Ba^)Iv`)(he5#8$ zccktE1@6?-9mQh3HdrlZ9dkAprYaq|&y_<(_(NHK+H(0@IDgDSIx_&-PaMkNQ>Hx@ zufnl>TOS(9S%^r4^#b`f7!}(VxP`g&=7Ec4qWAnVWH6)+M$5&S19bn7rFT1U!M`t) zGfjn5vwy(VezeKcdU1}(1oneoZgVK4i^GgKYU)$!TPHMaS!Yk}Xs_<$AO6`X6mshH z;SaXQk21XLMP+%H2Wp+*z3=oh4xz@0=CAIx;5wlI2lHcdaznpJxGsGQobzFP2E0|P zd`dDG`}RJrZS2J#Er&AiXZzcH@t(gD#YhjVb#3~S`p_T7#aGd&`|B&cVBNTM>q#_s zg{!yj#;1X}oqjob%~7KWe?fa4gB5(?44*vLa`m_N(R*y@na>7OY$8hjy!4OH=8qI) zGjYlA$&76?z8N1~{ZU(ck~eBC?)N$KEcPnXm%hsJ!G5Lo_!ASFiSlnX>jrD8pM))F z3HR}ZKk@FLyY&Cc@wvME#FhTn9-pYi&t2nx?eV#~{KS=hS9`oQ)pTCsOeLI_b@A&g zX9~jWE&EgO{-C3Ez$|2;+GrHxY#kiLS6Q^Bvi*9rG??rxbns%ty_)fxNNyO&-8(a* zvBuBXPniYe3+Mh?56wM3@Sj)_l<#T=s`&W21&=r5dYw@0RW@%V-5rS^SgVgzo*Jgfjx?8SO)L=J(Gw>HV-Yy*1`H7ri@S zv+i8HFR-V*eBbeLkLA5}GY3|N-6WR9F5KYJ1XC-?*W0u07TiH>Sh8a^(!P#ozkBAm z(TajWYrm*XiHQ~Wp@R750kEM!Ht6I7t#c=EbBl0`WG795C1IljuOQwU*c3cF@lOqB zC)7o+lbD2O%0?U-&%|7;8!gN=@!32$cP==Jhy0yqiR&gDB7=rrH+MKr)h2APRev8! z^jkD*gASTeqr~))ox{@kfvo|*hL0tVn_M#jCV$EF)2@4t znKoDn&y!x9c#t6sy3O2q;U!|u6dTa+V#j)sYkTLuEI5X1FhpUs@Dy&u>B9Fr9@_;n zt9j+(c8Kcp^yqKWh&3G7A{t&7+QQ!hf2+M`6zY0MIx)_rAR8-^`lBe4;<$zaTALFUGhmf_W=WndYBZEg#O5cC9nM?8LnSzkz21 z&hY|Qe@w9V3U`tvZbD~C#tI4eo${5<&G3a`cx<_`%jUtvX*5H@`H7oQH^pD-UVhy&& ziIbBF4I8`pj&;0`ojp@>trnP4X_^Qgt5+9YC}9P;xb3blv`Y=UZ;t&5x}w5%;6}Oj z1nyLL_;jZ)_Bh1Mkzd1NE*?^$H0<5m_vDise~Let>OCjKhzt8`ajL=E5Go#yZgadE zQEyY}F*hp7$e|s&qQNL_ubbRh$YwEthsigbL=ahT-bUSfE zfH{Q90uxz)Q-^oM#Ok_j-VTb-`zik5Fuv1To1WcYz{xY0ob64mB?>5UB>!cnq`B8#qu%^KJ5}bL-@g7i}A7p7rJ!t2apaa zdxC?B7fZ~;i2A^%_=DT~3eI>R{HrK^g@(B25PSQ@;VIU}cMr~Oan)!LvehorkHABj zqp-VqUAUTHvtF*&XS~$3xvUMNG1kC=zt$J$a5ft|@CS*( z6svrSKR8RcL&N2iHaQCjW2BC6Qel!f4U@rP=>m;qkA`^Xob5ATO~5WI@Mp~!Ab-^P z11;3>aCW!Rv1|uwu_Sww3%DUzqT)o_BmA%w6OwUby}Em*t6V8En$*P=PUSzvAJn;^ zF%Ee92Xhm`-tx_W^JqQSsmickNq0_e{MK2QV%ulnzIx25XUdZvq3H}}tJsL(gKNYe z;YHpui!}2qv6ElbYX=@-hH$-Jaspg;9^dA0woj=r=bXuO)ZQ){PvX6gu)#84nYH*= zW-ETnJ~5EU$++99mM^p0Y*ZW!Tix@mIGuHRV22@OT#xy~)ebt+WPw1iuRFPtvo9ar zNTCu9Q@x?`!3`vK*Os|lzzGy1t4Mu3>popV6z0J_*uq)EfW2t;cGKx<8Oe*E;Nz0M z?=0_rA>k9MtO+YOc=^}4O}@xE^28b`KjcIp8_smM>GSz%zmC_=V*(?jd0B@mgIOqD z-qpv`;)>Rcgx1R%F?waxoe*?5oW6COy=>Fm1W~&LvElH4b^exN@Vk%1A53A#S1~4S{pygvZEGruf((s8M>%p>AKBXgIeUpaQlx^D0O@KZw zubYSNv(;FD*BR}HAimn1X?Y0J5ivpMHnYLgH1SKx#JTZtA%7pe^O(dHn&+EJ2_@Ei?yXrG?nhUmxp*;7dNHt)(;CFS|=^8dd0PydB? z{i_HjeYFSp*$sM&*Qm_O#7Qlgxj=51x!2XD?|I!MgJtmQ&r%hY!_T|sLQ@XYpWpZU z#542LKb)0sc5P&Q7vA`w3ZU0-ypw0IOaD>*cMpCXOXI3292eedfypL++g zjuw&(i5lPH<`|ysC$jHf<7dB8+q~OHe|@*t&(C=MU2g3uj9rj?@%5m_F22Be{n}(E z>>Fusak>~1ng8~^(W>-ee|L9v!36VRQ~@y=`*$4&+qe@KUZtsk&gvkhV>`t=*M;Z zfsa=+ulm!IY?g2a;Tder7x->Me2~wjue|-}D}FhYcRhaQU3dM%dn%Rsr~eQ?nSLWq zs_ADchxidD)(dU&#?I9bzt{4AtgrvFR6+HDcl&OoZKz?$XG$htdawNXdF1bULEnG} zrg}E9-t_&ii)?urXv-%p;n_>x`THFGnM{i(DI9|Klifd1&O!}3nKfUt4+i&+*s)n)Pc zY>xsu2dI4XFWMj;biT(Q?Ua!Y(q|GJ6y=loQ+3At&Kj%O?tZ^go+Ht%6O?^phDOeD zaSvl(heKrvziAn5KM$=wZ*BNdm@42<#GHrQ*gUhV78t>+7w=SpTa#VggZzVmiEFHT zd@A{ULE}x=G;33svwv>?tWWE^)$wt2iTi_XtB>v=I!eAhUN{@L2wXdNj@<)(8a6QO zN7(3_=>3JHZ3XUtjkmLlzjE z1x}P~R+e7SVIFbX?6E#L@6xuRJld$5Kb$(eyX=|!io=BM&*Tq$xoP`&NOb~shW|Tw zt#DfDMXH<#*%H%EaoB_xQjTWTU88Gjjj&tAvgR|p2uH@ET~p26ATh>EHl*@=ESY}A z)tH9H$?S@HqmR&Eqyve@8g^f>HO2#2hl)R|@@5 zE4!TCmV~r}JJA`suJBQC+bp~{_$9(Y2~XOR%`S)?>7(VKEyR1cxnuf2_cV15re}0> z?H(KuaLr~3jkr7O0+{adu}k;7FT7U$2%etst7iMQ>gTX|MV-mCe#%59Xj~R=OL%Z* zUXX@tsI_f%p8j6oW2N}IP$JMhyJ+jC)Q>5P4X0sW0Ec3no_RlaTsxL(MOX3NGjv@) z>;*RYWBcU7<(WOf`KjyTT%6A1vvH}ESJiE6AANeM)cm%#>XrO_i%cO}s+t>0*j=0c z{AGMDKT;UhUNgteZym;Dtmb9!De}%d3XjMVb}2pJSYbVf137Bc!I}my>$3IMlg%z| zuj`dcqf%}!XAqIDnPzGGXl8&u)?U}f1LQ%x4wG9=dI`ccYS5Opp%_ zbk-*)5KxRp+8pgcaYx7W6~=`n>^?RS#+DD4ce`io^y;QrHw;!YbgfI1_vOR0zaH1U zaIW}Vhv6I(TLM1Yi}4Q!ZatW~-Spy|?M5^B`|n%9JM%$#+gzdGX5u4#q&--RqVi*b zn<%~=cwp5*qq*do`O>oC3s>Mk?i#0F=f18L?&~-@cnA2*iqkis4S5B=1E;I(VYhzR zwI*C6;-2J~8*l`ej`OYRtatZX`R&3!6b{4XeHAM_+-fRcl5WF?68l^F_@4farYo4U zdmcR8esP*0b{u%2Ywrt$YK3=J3NKRdn#K*Z6LZ+F!Yg!MDaU2znmA<(Z1ofJA7*~S zclk9*xUWzQ{@ya^u(f)G_R{O@PshuKU9i9qPHwPpJ&#vIb*O-JVYx# zx}IiQYvFWe;a=xs*a}@cSJ|XP+vfQO9upoDJ8=!h0sbNFF?3%QOA*|O*TisEIW~!x z<;B~V-cFl^X)=TZfA}cOCqF1x?ryX5ScOub;t%$xN&5Sqb+1@t|Ij@?8qeyf5Q^`P z_9fknN(VfQ?#tzQ318e?sRWyg`lcLU{P0o1K`?+~%-RTpp3o*}*9ymBv16R&b}f6| z9%t?K{N8tS=<((zlR>?5-QwE7Tw;BSKe$Pa@J|R;!Eo4Pq*}*EHQ2rc7j|uR-=(r( zlXkB(Oe~M-Gd9B7=A5lzCylSbaKP6}V9#kZ9q&i%SJgszxgRI3EIeY2K7*Xw4WVlZ z|5li&!LVv=aM0dzZugkdLrh)FZyon*5BW=7?9whUHd1fSe4hBC4QaeacJ<(JnuWui zYNPjG*)MG2=MGpW*ydx64l=kbTxK+c7cFa~SbUXIhv-rJsw+)2e1u%XxCMP9?YPY7a}|Bz<|J zoxLvg@5G~htaDw@eK^lm4Xx1}fA50moKNSB$QS^~0dYO~3C61)VWik-c&9x_Wf9)^aBIV<>P&r@Yv@X)Mz)RfYmfdR>9{uZr{-|hSwI$;t`^-@by2txIy6%r_ zzi;2 z7@X6-xs~6x%TE0Kt3uXYX& z=f$nJ>l3a3lgr(HNEepvRg1M|p3?8cd3#^a+~iMc3v-Wu(x=qn$hm+e^7Vyp{@v?M z`ur;FGL>o}BaLDD8)fJU-<6La>*`mkLWKN#{_Y>j_J>;hz?=7Y;aTI;=nN~VE#7tZf$V-?;zxh|!}Yn>BDMGD z*>|O?4DWXNDv#S$rdcn#WZiu4a`R(B5@Xn&r{6!-wZ8AE7k^UU`olf`^EVg=`KL7w zJ01}^uP=Max%Go~o&P*f|M@QrHURdaX^wIrfwlQ6hwQn3jpX-_cYBcMa?q5+yNbuj z=YOe0e=_~bWS#iO$JctxD*u;C+5@on155KUoDi`%uSWavuT%`*_sooMe|!YcK)Df< zdaHi**GcjNGYR-XJ;^C&+|Kj(@~$7V>HMb3pic=87j~k5#CFLpO$+T4H1iR)+iwS0c~iwqQdw_>PTT z9-e~18l+bVZ_RMNqR*EXWwRn2E@pY_YIWV52NS!k@wGI*i8MQB;!ol@thxAvO zw{U1XhlL#!cM;r4xIvfvVMBqtxwgQecx@A_%nPXvMt9I6lMCl!2J=jE6GTIk=r?kIxl4oTe|K@9KJR z^2DbSCe>`M80On1u%KPYKeC}IeQU;dz(s9h``xLRVj1nfa?oJ|VD@F7Y7n%uoj_pT zsBGyk@U*_5Je~_CJFK`rXpubJIN|0Y(QL zh{ ze43fRjlCj69v!ZYmZBNS6)zF69oSx~R zU29Aty-YgD$tk=`G|n#ZJlE$bwt3>=P4M4M!yk-C)5JeJEE;FpuDza*PO8WMm_LYK zw<)#C^tW{j^bu;=u{4%fj2d0&D{C;iaUY}4xR z!4p@_OLTY4wo=|Jh6$+IL4#CyD7K>(;|b21!Q8|9#l2tcoM-GAinV{6KdAOll3SsF zcGEtJxr%sjiO!5ZHDZn8njv%u_DEz07vcOB|Apb?wXRm?$(^%L7taR!e;Ljo*dThY ze(b~naiwh8+lQ0jxLS(bE}0m0)5JD!)v)nOUzj>F*jg9dU1O*e~i24o>pgj@0?2EeDU*_M*=f{wHhi`0BF%RqRf+0~}~@1i0Sm@jg=u zW{b!9WZGlxv^*ksX_O#?N&q!#;N~Ai$~i?U&^^ zpXdc*(w9E3YC-%m7{6#b^{)1`;K11F_F-wS zCihg%Dh(g-?E>S($Udak;qkQ7Wi3-bQIGl8>D?ZGTQmG~=zGkt-_@C^1lw<#91U94 zV4y~v)XsTlS)pbB)K1kPL|%&Fs~aoei$@;{ZX?lnZ`k4XSL@gaBle}E?C(n1 zfE^07?OI`dUTr#eZ_YSRZJz7L=xXKaS|5UWh=cf->AIR@O!=q?`pLh~AN-pwnmwjj zKm4+AP5D-m{QhQKjP+W5PCi~`=CnrMsb}#WTfpZKt^se&*sIz0bF|^MUCcM-cdq1`FWH%WaO>&|MV>zS?oKv|jo?GLQIc z$h-~~m3tB2VZDIY#*+EC)yK&pm!fVoXX=HSXTWIHr~bqEgUY}1?T-_#^_6s4-?y7_ zlK840oz(;iM`D*Xb7lAPRSxnfJk}sPd_)7aqCUie;F?$eZi zazmq=eU#c=V|wYgx9P*=$ux(Wpmvg)rAaWy7X z$MDV$JiutXv zLV<+h>QGlIo64a3ejurg@AmppUg4}{%1^>?zOZI}Abn0Gc?WTP^{lRu%-dnJuVB0~H+bvg>tPGSL5E!Yg|F|K0r+$Ne_!j9_5aVV_4j4@zr8nhJY7Jx zk31OX(t~ez=M7~LZ%iLkPhY?P9v|ipAN=oKuUztbPWjpHdi^6G|8Qq&-ZTVjG+zuM z<;B@BzYQ|Snt4_E|9L&`_kEuq_x^|L{x=`|ywA^i*XMtKuXmZgzsKB9Sy&g~w27nU zFxv(^t$Dnc`Glb-(s{$Rjx z;xry*Z`Hohf5;Z&kO#$JCVwVRs#nflrhfUp>_+-L7#Q*z?7>NdVg6q{FEb0mgQA=& zufIptUgzC5{Ps`a4^qF_!88uub*}xKsW;W#`(b#%l$Ww-tooeJK+wc^Fl9CU?6RsK zFtM|q>UT;i_n*%nWNsv5x|PWvRj9XmC?+j=XP*rx&mYSUo4j5=RVh!`POT6hB!aQQ z#7*>TCtR)z#cnMcU(dJu&h38v{JH!=cq}I0W?s)Hv|rb_Q0z0tN+M1i zS0d~lUvMXm==Fq&qa$oYdW7O133HO~vW>rQ0W1ewTmjpKdnGmsmc4oWck%}*19k7W z16KY(a0}2`I7YAo%&yPf6MPUnq1yIi_Mu_vffKlEu$&OMne6gwunq7w!&NJ?XP1tu zS2LPgzllGH?Ots_A?VNO@Z?L^?)-LI-d%Wd!gOpfC-nNryRZ@Ri+xCO?SxwyY$i1| zcGYzidoI4%c7xbT9`mmytV4W5mDl>y`GW>4XCbElj1oy>XD2_x&B%iup_J?O={t&l zH}9HuSi?;~3y;6a-UaRhE~R*j>likz#+G=4;I-0D4e|ar@dp_njK^pvC*k41F+=bvvVg7-06I2OCxmLfDeY&CR{L=m}|b?Cf}cTPOVw#+36i`&pA51 zcK$c=2P5fXg!o!T;*!y?g&l}LD6CAntw#4XR^O(B`$Rv}vi8U2C=txw(Q@@HEB`d{ z7W)q08(yCkV3W49z+%sUqlH<5eiwg`G2OjHi8m=NRO!#g;BdtdQUhmGe*wpQbV8}j zK9OIy#gT4AG|!(UMhsoACdAf~JMO-^sxKs)U*dR?AL zx?-6zbKjw7H*z-v{KS6~e~|W=)LpnJ@M+yOIH65&u{q-!O-^?Yl4A#>y-50;Suifp zd|czVj;D+Et)B(c4}aU420*8$imyi(3pbr(hbjl7k^M2tMe1Tbc6R7 zON`6Rv$Mt)4*%NqI+I3n)H&Z~V3xBh21M!?u1yJ!;|pw8+)k`juQ1v-Va^@h((4uC z95ugEX6*Qn?(gCc!htM#8V9R2b7T>pl47TR3QY0O$THSZ=bLs<&+6vv#v7qtfOwE- zSPD1rE}S!@KbRg!8&TXq9uv5PDQ}a)-u^(dEIjxee^Bc*iP_^TvEZ@x$reYSI<%q~ z)y8e+O!7?}<7u!?3}g7d9oOx|;^}=I<4tJ{Z%7(Lfd?_J$RqRfhBz%XG*QES^j;?# zJG|a|Yma^Vo%KU{k@3j~`Ge{@emTq;&XkLNb|O%%WNySk1@oUX&d2zEHLkT&VOTxR z+K2S$0^T-`I@k226OM!9IQhZ#@vw66QRTZ%P*JcZ_#Z7<44<2L$$N#-4?pi27h!M^ z+9$mHAb*hkwAn-Zdv3G;h!`h=c`6A`gnqeM17h%fi;?p16dzvuA;`(hPpNY4)IJ>B z+Adw-Ete8_?Jz#zJgN=4#JpQQO3UQk9w(~7L46*6!3AlL^_}qorkkTpKgl07<WH< z_S}DDZE*Ec^==O`pW_eeT!w)~u_ScF?uE8>gSiL~vqH~(Zg9MohNnb%*a_w$ZZ>zg&ci*YiESaYNeyR3l^2>gwu?>JfD7GAl6g2S-9h0#zl%SJ4Z-JV z{InZtoza74IcCF#JEt=IA+{P|fIb`F&P|G0ayN0-%a(9M_Aa@Ya1byZ^PS(qACw)+ zOlV&X@}oTYV>0l@3*H>HH(nrcN9D*JGpFM2*y&C8DId3apb1-Ilkm54{3iaOmJ*YK zKlyyL$2=t;oj>-ace(WWp?%2~gMq@Tzl+8K&-~3(3{`Xhy007!Lm@Yp-^L#_cq7I5 z(GI3il;g6xu;=(n;5XlGV({~ar>K3S(9yg05x>|@OS@+}#y&FP%T`7;U>=)s3J~HfA7$3r> zHuwbi={N8PLx1Q`Y7EMu<{<~B9PhlCxk_z8GJ2gn&mO5|tJYcGH|Zmv0lHln=L5!y zncfWkrr-VP{6WpTN^dNJXT^CXLqd(g`uuz=@89VUpK(MNzWL$^W$;$$0-zs7%N-$|QN4$Il;@l_7<*^r;+a1Euvji8r2JV?7oFwJeg`E60=*DPyNKQZ!mdN1~VuB7XBdT zU3~deZ`{*7$nzE-3x`VG;-nDFq@9>sn9pY2Lu<8rX6HG#gC?g1-_9z6_l&{Wz@pqc zuM4w>n>@OmYWwLni`Qk$`d$1%4uWXgIMlsxW%)nC&pFnI^V@6)k1>h=JGdtNIZyhQ z;AvTDJ{ml#>t*K!V&7pm0@HDcHQ_b(*otC&2YWYImb>P6zl}dgJIGI%5FbuEu(;h0 zM&D7K7O#)4YYa^#bO^;Ua`)7I44bGeEKq!eIS<1N= z`g{0;vNzzfkmF;hx-lbPKJ%N@L z57O{hi(T}`)^NP`a3^}iw+rr<_6PZc_z4=#a;>l8nwR52@~*zb{1lfBdz z7J}34%}fkSy9pOHm6xU-v7ToA$sOOr7rvM2?ql_^mdz%Nv8P+BB#xTfPFegitP102 zf{$em?8DgE(U|!Ve~>jnK1E$Z(Aw1na?M1&|uRKSIb%;L0ngJFdY!LhpP7d|{ zaNHNVklvm?mAWZTA^MPLbH>LX;}4oW8-9h@p-J>BfBz9gH=%k;pap7TK;nmC)$bXv z(W`ZesZb#6uGZCCrr{|jCo$Dl(+0$YBs#SALNV2pckqvR-+PtlXSo6VVdrI2{Pmu` zH(9~=oQq@hLH=NXGO*vHE##}Gf0Ts+C6~z?^9%D5Ycrhd;%c_q)<%Vr`rR{Y*NAl} z`+M-Z+7vbqd)|+)=>KqL;YFEo43_SC(zZ*F!KJ};#*{5~G&rH!jkfw2f6&JU$-Krp z`wwALemSCsLvGdz_84f^?o+4pC^0XVE5Quf#`us}=@9Km>^F=$ME%Lu@=veDTm-jE z`l9v&tfSd&Mx%qmVHY|)0~mqC!zmFbl317GseOt+NZrx~j1MZ-k4;0n)I(?>N1oXt zJ|*~78Gbez_$w=h-gZCQE9W=K6LWE@UX2FBXjATdP1-O#l{EajbeH)E9$k2YTx`A) zNgOl%WA4ye;*Vidjx^&(oR)CyWBkFlX5^cz*^3_u}8yvy}vwT z!O=8mRnetHQlUA%?kek)_9t39z(8_}TUlCq>y0qN?!7&+QsK;^9=#2oRulVMjq~kd z_==58aD#%C-9K!XeS!KSsB4 zGT0|@@blchh9Gl_w1wnB$m;`E>)O|os&C=UELCqJS&gKy13&zjfXubK06ot zWBfs5NBSy<))M(LXrHd~nLcOq^aG8kv!68n4|V6Et~j1V-v?>)kM?-3I3{}l7b z66~&X@65etzNR=`>ZTCdn3Y;SBO}s3?p$(?bvY%muS85}qF2k0lKtT*QOGUK*iHYU zE)|;_&|bw`7iiyD^BtR4@(Nph>2~wo8LpA9jdQav_?!GemDggdHRCSz;o$_VQHU`% zdslc$RxG3P_$|ZpGaO<+nmD}Xb0r_0q$k+so>|Pm2=~M;oVQ6k7~bWw+rll;D=g7C zNH<-C>+MV*>2aw(FFH0_4j@EDs&+aA`?D%_Rj6+U^2 z9z0GFQ{G>=jO-cT*7a_obSiHjjg{RXb^|S%XEtr{gRVG53m}Eh@CUv2MCnv7rmxUm zq}jkZz8u*{AJv*gr+TfrQa|$fmUiT9P!NrvUSpC?yttsF$ZS}4I_tpnyg0OTh2e~K zE_vyngP;L_x*L{W;;;(0`VxN-3x4oH;c9wtTrV3!?B&n9AlC&A%ofJOLYkB`t{ko_&xt*2GhSV!FSo;Hi@&wLAz>}d%jxI zSBf3jQNbB3k`sX320-c5gQ-isk;C_G&-znOtCjKAlv&036?4{gfq&3d zh;{AQ4pCfB1P$mDaZe}JW^8-$AbIa^=MM@Od}D*MN$1#gQa*Xr!`qJcxn92><|O-M zEKp1U%iS(}+h;N2b{QPHU9P?C;1+y?Klp1s$drFMUUj8wCg$Yz$M?D4^5uCXpWWQW zYxLp~Y1m8og2E48eZkzU-^m|*m-D|o8?D@5>*?J$WykxyIyd{vl;2rf8^6hy7K7WY zv5$fMH7C96Snqz@uk+t>yvz1$dEY-Idw#k8uVtwjex2hUm%Lr$T*_x*fLYhEKG666 zm;3Qk|G#|a`=|cavwr9OTl(%_zyFuNF`sIU`E!^LS;h%N9CK+6r<3&p&Y3M!5SOW+ zpZEWiU7vpc*8BPA8~^SJ^PZ)-kmsLu7%$8^@@J0JxDS5~j+%L+{;rq~@liuQc!SKG z;#!F#R>BT5uX3(NoNSX(O*W>4)RUd{6nzx`jNC$_=+g8v_3d4{xn+z1C-5 z`AiHg*az!M24Q0Cc&N-Cw~){Izrr6>Va!AGc*wMU?djD=DX)3fxp}SYuebm3JcVO{ zIX^@655**!ykG@ytz+=c*Lqv^@~Rv9(Z~6NmI}zvn{t_cs)EvA)h>8!TSeLzdm>}2 z+Lr21{aL&=VQmR6r0rGfHlF9&`h)6&gLRv}L+$b#{6UR{KRKkar$w<$Q(@h!1-&V+ zDO+lPEVs_Hr1A~6DtUi(6xuW@!;^JcrEU%>buLSXyln%PREz{gWOXFE7Lc; z2BWp`7Tai3!EGyq&R_`I)ArI@Cm%)!5e^l4erOGXouSz&jKsO)6D`ZfU3Aig>TP)s z-CEB5+Um!?#ve2dpMGnlu^5V%yDZdyym(TDAf99WG=bV4hVbK`t z3v?ne@;*ia;0Kg9!tQ#E*r~7tY;X(4Z*B7Dn6?#BUdzNwGqsG(;8MM~)2YCBG`vCh zRS9g6p6ZABgR(_8M}R$8 zEEtH%v4-}k^f?PnPm?wgy)5V1MBd6(TC|PBeHf z#d;*A{wChZNBM()t(UZBdyoI>(rEY$PiPK$n7A+y)rH|cHfR@(GMG-Tb-Kl8v+=;m zY?kN_X0wH3adDfCl!wh(7r=1(|zgJ9GsU08>tWR2jBi_uV1JRyuFRFFNF4VX-C@- z7ET)>UO^n-^jNsR$w^l`r6b2yWn=KP40+SuxJ@>=UN<|}#<lPPV*k+vul0iwkfCY^ruY#~(C(L+kD+d9$epaalsdL@`b!W;b_T&^)HtiB@-9 z4TDZ52IB=_gK>PIf}OoHG_*;7=8Y z&-DSjz&hQ_`g8n2vuq0bx8w(>?52N!|EKrchP@=VMLCS!M&e*Me691S-K{#4`K$*f zTj_+YW%QOFq@>|m3Qb)!4-ZdwAbbIpqt)d&13r#l#Z zj6axD(XmDQJhOKYh92?_reW@v)=Y}&$&^m5exOvk#V7TBRdE`GQFV$XYkp1#!_w0{ zrW$v0*?~_>2UXZ+c7AVfaXkMVvuJs6Ga3-8hwTr}`#lp+zXn#*_$?Ib??k1J@ae&S(W8Mb*?L+)Q?M0^Uqpae)|g$22*$ zl|LHpptzl#hE*S>L)%5~a9Z5XrEoogwrKLYyd<17xnAKn3gc9c*N0+AHiO!;UCa?{ zmbBeP<&kcZhtbYBon-T|niM|9A2fYic3^|@M{L!uz|yzF7`Di#;H#HY&a@uxluOpA zRY^VSq3_7|p?rYGe-r1Ny{OhQF<+)o zn#6b8+We08H~#aR``p>t;+Yw+)35pu)k0~#9)!d7UCX*Xmb1It%|H;oiYG;`;R$_y z_ci|DdmaCtCygEW61d(xJDb+oS)bit>+!THCJtw25Re(?mI?M!Mc=yQzs|FV@bm=Ca0#$YxB!V#I(zmq=4BiQh z3G`v7i@sHF@7u-tp|S0D*weCBfolg|fE}{eHgB8N@j;j+a6bhmFJ-G4@$-jGZViRXQ=u!t)m0$IN%{+7V z4gR3o(c6#yYFk0;no*lFcvBZ_*0d3|E1C>gl(cI}cQ7Z$XWsWewxL`rc4b{cKL?uv z&xL=d^1rcnoqmBo=(VeN|K^$a1#=(u`y4taHen&G?A6~*Jvr-T27SRCg6s=&AoDhI z4$5Y*LXIXzV>{UUSNMY}|Jw%YM*aP`N|IliLzv*xX1t=Et8a95jn`fu);k>5@au=P zo?YThpTv~X=JbB*h5n&2*gO9D{J|JnyVISwPGBkLYFDN*Xiwm4 zK5;SBH@s_qfDJ0*(;Xft^j~(UZ+P|b2lWphbH|bdSuFIu!^8iL9e-4HV8_u8;Gcf2 z(|)nzo8zw8E7CV(+QWI{rOENAd&%A^N8G2SeOC^)!nM#mmjm7NgZ$L~V(%Kx52Lrt zZB@<>WAS44SS#{2+LZp$_wujEb&fqx$DL^pyTPMBMn95gO`uXXv+4z!(Bpzv5F>eq!E{uY1GjFha zxeC9;AEf+#D}=K&M2^Z3+a#!T$~%bvgL|&>#mVhP{CK19b^^i|`s_Zc=vk7_4}BAZ zIpm3xmu+BKZUG(GyU|nxcLVGE7Jo37#SU>-y7&;m1i_lt5qO$#G~EX6CV~GD?NA4t zc?CyJxS%`7KMy{F&g)~{As1iW4?heZWCLzUrQ>njGPJ#dc#vPpKbZ1OF;uTQ>Hw8tXNW3uijCmw$7EO;z9ZUbzv!?Uzfca`fS5V0z&z$v-1uggUE zPV!E>oe+Ne75-qUR63!7ioaQT9q9|Jz1lW8ht!V~@bD6aS-m~a9IRQg(5lYsv%~E{ z?ls|`nFKf?9N~37x{Qw|`I7JMw~YQ2d&^i_6iO>Te@j@UaoSVCh(2I$yN?gw^MUrLNv#yQQtaftDw;* zEz53nbXg@M)@8P+l;Z)_5A7;BtkvhEY0oykADj&Mt5; zJEL&2;L9!(k%p%|DqYI~`l9d*KgJ)#4&sZ99Y6ClHh@pX3!&H}t+BPjSZeUu!mVAP z&5yIsbf;)lPNivmoB^xdTvyeU+tL2Jy2LNiHath8qlgcF-Rpug6Mq~;H%c0VHvYKk z{JF{YKF1%FPdb;z4q~@jDHDnWW{AHzIs!AM{Nx;z{xtb4(djFfwhOq}#b>%vj_0SP zn`4*v%fO{J>ajyl&P`kK_-Yfda>I3eKEvp`k|$D}t}H%yX^komSvE=-KTCMp!r#t6 z$U4WbxFm1RrepA>{2$KMg15Hf5IS%(8`XPi9qmQ^(hv>Z+L`2K>AyD5I~*RxH9D6r z++ga0ynE8K>g*WpZRh7@C-7+ZW1(FLA4qbpTz!SZ6-^JY9N~hdJ}9T^Ae#j* z3=ibJLieU>|Oy0iZBNKDmeQfY_kT;F?qE)$# zn&a8xu*joLP$`G~p_t)sbvFHLyULi=q+QWwIv2)gd-PZroAY^~^5}#s!VgW~mK`pC z#}4Y_bNoTZD*T0>9cHXW9|J5$lON+OIH1-JbLO>5BY#|OOGjwF^%eI%QfiFr!DA}` zAEi21*{KWKOBI}7b&{NIlM$0^_vX|~lUV`%F2nU?%_U4QyVUzW#vh~x42Q_f8D{US z1-cJS?5c2D)_%ktv5q2N>Md11p(~s(hiVI_ljuyYtNEg#9L~xi+Qb&h?+)l2*}2mN zBXBqU*7!8B9mlU6wc>Z0w&mJg%{7e8T|VRSI{$9|LE;b9tQ3P``iJ2UvD+xLQtXBD z_G(Vv;Md#-)=VDhd7;=UlJ0f4O^n9YqY|#~csX?3u>&IeGTD>3R4|+N=rmz1sk9%`_fc;wBZzV=oe`Z?S_0s!Nb#mP; z+vii9oQ*YNPi$|DNP!F1u>CqgTl7{q?xKaz$PeQ-fb`q`;+C95VLR~RC3L^^5T}RV z*>d^`{-EaNh6!v&!dY?FY_h4!Stlz%F%(f&cR9WB#^I z!|~Fw;eVD}-Hpc&16TVPf6$cAE0@8Y)mM0+Jpq=^q48K3h}rP7r{#)Si)k!?=f#}t z70*1IbNSFIFB+)5THGm@KndJYMVAcdp+7yJch6=neT+XyF*%4~Fva%0xty}as*%G> z?G0PDCO3>}&wjYEov7dD-WpD((MkjlaJn|vRLl!FY;xtx*P_YYv}(6&m_V*FQ&&xy zV|(=@Jm*vVLGJOElA0J9)Bp5B+Elvb9Pl*AJL&aHY3_;x9E&b(VwqlLHf1!JhKhK2 zKET%2c4XV?mFCc!(PXJ1Q4a=UG%OA9^Rkz>XZggp_=Dg$0(01-7~7J4(sA;i!IHYd zWRS$bCU6;Uvov*|_g?gLn)Tb^eX$pRr0ZcjJ7Emg!IEqPPTLg@CvK{#oc{=aQ2M9( zeRFU>X)m;Mp0EX*grM0AJF%$jLRQOv9lEPooNM5;Dm%Ej`3!wyv!`9O+5%# zQ(f>7=4tXLs>tHky_(58x8u8R9?#2Z61%5+m->U)UE)X?r%d_zP}XMb#ppM##--oR zAEbx;iZ@qAGh!#bLwK#hTvZQxm=THb%Hz%ogEoEI>8vXJO~4^|;(#}B+1R8%d&h6* z556!?W6P^P)ceih)ss2(Te#{>?lS64vCPbmK3^?jua8^yWcaA{wv=DoaKEK!J04 znJ0PXejCb^d7n%I!x2wcuuZwzr`Qqx9F1Z@>3RcKVpjS(|SG( z&ZDwWz7RemI&m(iIL+4)3Zj4PwJUO1_=!Q}Uc7Mh5|u(7$!;C&Uw-O_G2-L=L9a2W zjhLqYvj>)KmMTX%4_azBoa(-F=rU{nOmK_-OfSh8BwIbsC!AEp&cE6uA5h!;0)LQS zVccLor*LLpqW)rmwTYW)@;1o7682jJYVLDr%!~@d>!>ogrt^cVzx;4cN%CuShSPeb z5InZ^J}N}KH~6e-gV<#3R^6uXdA$3a>M2$6ee6)1;$C}t8YZ4!{gXE3OC5ae!Q_-( zH%4puSBxKCSdYnDCVoN&UvM4Oi~!FOFt|+m)~-bDb|iOiH{$13{qjBjpc&^)UK2H} z);OJ;*L%xT3+YqEC&N3SjNk*pnxy*(R$w$y3)5%2kI%#p{{=pt$ww$YOapGxUcPR= z0FKhv_=Dmnr+mr%GPZ6wd;C3=%j6k^PjRN)_#G_wX`5=Z8fR%f<&f2}+ZA|H+*iYC zQJ%+h$KZr+LmW>0*~E!CYsz;vSc%~}t~2?JfN6;(=QNF^q-c>v5B^(r^l&#NFBf_l`d-At>0IPnB5*1#9hO8 zC%ekv&D2MP+(mVKs{y!P{cz{JydIP1z$JMjBH7JfN#F1>{-DMp-S_vp!_xR^##mKG zpkHP0;8uj=7(5)jobn6jOsI|U+^9@qvqrR6$_%Hc(ba)|0N^Ye;Tw|gstlG{DJi7MY^2l zRwa=OJSNA7otW15^^_lqS}a^s{!V<4V2G!dgMWB@9StV2J^Y^M^3k@lx6~naS{Cjf z;}4qoSZnE!@)cnOb}8>JI1b~h@ABx~4Mr*d^;cCN<$Zyvh;JTxcC4%6T1BV4S9w^#B&DsBNEd4>Fl;Q!#8_}^*& z=f*Dvr4jIH0p>YfD8rmG&WcUge2uFO+7!;vD&^J&OW$bSv_AzG~?a`^xSadIo&+!LS(&i%$$>^d`Cu(Cc-{2Z%Pil0) z$zyphTvO{*>l|_#r!CyU!sM8Y1V*t&1e~njji%?D#2I{G0lpEOP!Hs`L`zY)fqPQl zo|D&4x{t!thELUpu%1nE{yF}j^f-<14r4FXVi9k(g#&4~>7&x1PSBq#^-(Nbua2hA zNG}%E`suuI$aH5>H_zcT-bgJQ=b>`;p(6?xE!dGA=+?rmTM@f40q3dWyaF#LzaRF{ zzU%>b==fv&L5)w`e~nFEyNZE1$9z|!7?>woJjlPBDKbY4$Fp-HlpEF_t4!{+7&*bb zRd6=hzMV-{Y&Qz_29_)iEo}`fYB-ONOZM8IY@K)G)uOUhu0`4t*eBdUuyye#c|Ucg z+;_@>S#5Exx14u+ok%?(EzPancKqDef8$`^_8P0U(zId73R+;~;`*amD}8DDxY|`@ zdyRlc!w>F(HB}nX-7f5Y#yiVW4MN3 zh|+%T(r?JE`Z4~X$*ZJ2nZ_&AKUj15PLFX6eRlP6V#WehceO7b?0~;>UPZyYW6w;Z z**aPFv3X}qd(OOkuidG+$FBIZml=5??W>czCJU*?B|RxPolC>yi1h9~ny^*g_Zj}6 zS9~m>Et&JJ!9Bw9-NR>9{iX9V?4te4c-0WEv&<%=7}{Eq)1x0AL}uh#>@Mz^^frfRRzY+re`e< z&4G{1jKyZ51!cuIj+NWJ$|^UU-iW2Bokp=+u37P?ll|i&oUftH#ple&Rju?jc!i1m zv}~tu(LCC)u|lfPew@GYch+!VUEaC(p`8Ek@&^q^Q2T$r);#n(A@DS_{uMu#6Qhp| zCz|(g-7oGcTvNrZ4(b^+-!{l>M-O&qv%Pn-C%CHZ%J$LR4|>@fu|C0ED|+ozr*>vD zwmUY9mE!HrItG2w)7SWe%#HG!F;_BG{&o1RQm|j^N5;2(NB9#D@uEBqA%19dtk>B= zEq`mTBJ(-9UcJNMS8!Fyi)=1@E&rfdGn#oG-_EwBSYGp73Af9X1Q)u&V}v2VuUWu< zvKfju|xLgUg*1i{Oqs$ zq@R2H#dZF-5A};*%5VA!*Fd6J(~4uq3}Co->LcJ}Xp#_@u}SA!8`wA9i4%(5a8I{YvJvW=P+eN--a@$o& z1^sB3gT2W)ApG;$wQn!{?bY9nUa$F<-_0L1xVpw;9j`HK2}#a$gD!1+^Ry|q;c|NY z)@xh#v$*YySHov#RG}`&(F?y2LuIqut$O_(%>8@(LCSAwZqu{DV|*8)cDT1*mo}KI zVlk)}_`k*`^p3&zO|hTPIODQR5GGBz^(XZU{&l;y!JT#GAHW~fSS;VWkACUZ9RCJ= zwV3O+)?EH04!_~DC{92JQ@^xN6${1O|8yVrA7O+kq}rVHAdMCccHnDa9ivzww=-S+ zId-r%<9O8vI0&y5??~Hn*T+A{4ig_FZ9?{9W<9GlXN)}Xme1{g4gN8Q*2RiJ)0$j$ zW5zaN%f)AB`{&e$R|l+#u_Gq}n#q3@@LTHVS8|H}AxF+vrKG0Zrd^3g$H{0OYdq39 za=d=&P#nlRH@n77?T^3`UiX(mXe_PapEI0A)+PoQRO8W}9$#w67wavHtw=rHy_ECK zNIYH}r5=M?YevRAuo6qD^ z;Q8M;%=fB1`kZMS!oX#lkG+!7`r!|h+r(hvLk$JcIrTLoKBAD@OLEWTjo-JE!Ee`q zPvO?x_MMe{5C2!2bqT)6HF$~J?}F__oOGu1ApW212RQ=$gCFA$8vlaq(EY%UpS7*& zug2HN-^_fSD-PM7w?}Y5GNiz0x@~X(e7#^g___j=T|QK4KPsL)etNoTd`99?iE|eK z_XOujqf2J&0)KGDS^E@!(A0s(P1A6^@dg_#a*X&=s*gafxEvgk=Lj+F@>lZ^mV?H> z+i1e!RCxwQ|CC%nM(+~;BUC}wPW~?M>9WHrJlkV@#rVXG7AE{E$Hl(~2JtceplPGB zLzps$X$IhychLqv3$zLZwb_Og>yF%3ux@2({ z!_MfDDHI%6TBPHun}H)qY&rL!f&Jhp@K-;^A2ju$K4#)_UwEftM0|<-BXVip$XO@+ zY5mrCrQGsg)1JU>FON!Wn<%esr%~~AUd4+HjL^Vj+?`?5nmVa;$PW}8RCei8a~_mW z%my2@k(8n?Kg1uT4bgY~(!Mf>>cbZeh*vi~L#ve2>>t<~7`L$n? z&zgU7L2@y7;0$(X-|D~8{S}U&J`6s1ZOubzP`}5@ZsT_*KD-E2SPUU0+K-|AI-kdB zf9<%_I!7O?LS=mIwTD;y+vNHpPaHT1pOHrAr}7VKp2!VpOln`uf7_PUuYpvd#CRf& z=1jvIV~D3nyNsO`_-lzmubQu{6LT~|ZGw=a!am@JDDXSG*)Jp4>21|IKXO;TS8L!< zxL2zz5}hG>mS6@=v%LX`Sb-!6&!4`ms3J(yGO;9LYJfZjCk9 z)HssfU(rd6R`;!d?R2{AbJ6I_2ATKJAe8oNHsR8?;37opk9Dx#+!#;Oy?rvh*E}&H_Z7aiCT+rs z=dZQJJ<&3G62-d%XEI#J=K;K(IiqvHcU2s~*&z-?d_2_!JVRjz=)Hc7KWJiZP5;2} zO!J~`jjkicPHa;9cD8+HE^~7AEtR_u&L{e!U~9sxp26Pd_=DbBiuGYyZOd=L@mh8mJBhtO zL;JdHM3IO*4`<=WFghy(Pt}{J;|#6+SU|=q5V<9Dh)CK}LQi&I$QNW2C)oI-O0|#wFG$>AkwnqPlw`Mdwk;}UGEA8_v#_w16%{_5)|IR^2XD(+R)NmUb zTzjlHqzz6U;0*IEYmDiv-Vf!r{rsWUCq|>Rn4Lx|JE8oV!urtQyfA)Bi_dVkC--%< z(2V2;PI_0_)Z(r+D(9xPil6sxob`qAivFRt^$hku#ve5Cw(9FXup3{XG~CV~={sv6 zuv$36^lQ!o^-VI|%Lh}-YpUY@RgF2q`=);v`S)vo#A^1++S zdM`m-zDRFb&IYe`_UN-aQQz~@+QpIs--4n%;(?N-@m=pVdp_b#0~UEFwz|N)#l9zh zcr-VO@{Wz<$ZxLKFo6I6!Y$34|F8eBFGaUhF~p3!+FKiL6sL+?PZ`Y^V!g@nVRU5l z6`^2`Q18KX)t}z0)s^AIm@J#T8RJ6SG7=v2<&-9npSYJf7;E+Gy`0Ncm-hJd*f7EgN0g8Kc>t4=^V)uXjz9Qn zdnUfm*h4>|{o(_C%Aa*9#MZg(n6E> z7VS>QK}Iub4O_Fe2ss?$7WC=nB$FgzMtRM|IYIZgEC)1|G%UU z#O}Qg;hYA0qP^o4VUFMrmuJ0FFU=#?^zOt%R)2c#U1odAPNfa70nJ@(dEr;y7kz<0 z_{KJ6N3nEbd{Pm(gRjFoL8^t<-g)m~6nSf=zUJ z<>%DpFYyOob-rvycJJTSvoKr50dNZVN1b?mpO*)RJ$TApuPYST;lY6olpS1DBFd(3 zxm{iNj<4|tf90yFa%f}1?tkLwJZ?zHZ}~!QXXPV3{lUN0`xrcUke55*&D|OZ-(7(| z@#+I+()ykG2faCw-{w%+f9;RDCY}xRi#O((GUK<(o#72WxK8{m{ydF|rtliKmG55b zApX(cbm%u;{qQHQ!TjNa|NPR=e{6W$W}fkVnYkrqG=eA)c94r^odS#E-kUlRCrVr> z6Q|AChdpo({g&1b;)9v>gI8$k=jV4mIbP}8^;^Gu=g;q$-yfO@-}ouKy?)5e92tl$ zuqe$rRE1ej^EPj7pfAL9v$j^uusMFdQ?K53y`R0e{H=fev<<>)cPqY7| z{FK}OmHdOkguHv{8DeZOYe=)l*&6>u_{AGk+#Fog;qJNKQXgiS{JQsy5oXL29;6C* zt%bb%fPJc$SKV-5KFuHGMsmN%>kN;AAL5{Fo?U9&a6~AQS6-eu*HD_wEicOl8rx=F zskTDf)BAMjSsZUm>p0H!`2GArziF@hlqsWf51Lq+09qQ%9cobI${H@E`_t@QoZ5hm z)Hboao|d8Gc;;`8uMXkJ;T}Hud?C2)hbXt%2nZLngt<@$rmg*M{-E}VCFY2~+E#ur zoK9miFsk%jIlJ&TvX7Tf5uL$I0`8OphEv9ur+jPy?eW>G_e;DlXK;^pC5fhI;<`M! zU*iv2-u(&^x6nDyDu=~7C_gp+l%nUq&Jdq`RvsOAAL6;F%!%l8?T5p5=5>G-Bsij% z7f<*Pei(elt2=+=JHEspM2i-wp>`iG6XOtEoYfgD2Ru`lNCtc?BODWajl4|wQrl<| z;-@bJp6k=Xa9%t0XY6JeeDoSTu&)RoTVD+`d%FOj*V`te42>C)bO_&q#7t?%DF z)CYY-zs5_`PJJbVf6!=CT#S zu>jwo5p_Fp%7`Xv+r^h#QP~^B$jdJ#{E#}s7NY_9G5#QSkVlj;-v6_e3Bgs4^}!0r zQ^Y+qTA`7eLvAwa1Y8+g+Uuftg~w#a?`AR)_?!4R=NsjNd^+R}aLefMO5YWXEt83# zm+|``TK4bkH2DYDk$XCl25?A!ia+>Tmr)n3p!h6|kyTOtur|w#9XT}9SKX!gYEL#w!d3TM(Cv*U8jS+J}7CmxhzZ z4P-Pg{sM}b;B?}CHu#-DbK7h`%s$$*72fu59)3%61Nb9{AFW;N2#~KaLH(O?h%pGv z`K*3To0(hUFZU+?c(`h@Jz+Rf;&5<4aAsoxZaLs`IT`*2XjJGKLh)R%MBnT;oHljPf$!)h=ojFe8R7kvmi(l%dxJbzLCeVo zN6HHaR)hZI1q^*Mw4F$C)7-AjIzYLO@U@Tvr#zpJ*9bAeC2DFT>|t!5;tyIXJ8L!L zcc*{wzjAg7D`p&p6G)89Ix#@=mGP<3I4>i~$S&o(BQJVc1*4u0Cpxdf3^rBpPVRFC zn14M7JK0noZgBWmCyVFh0o)+EMn|;=m#D@bcdGmFLH;1^i9TWRMB9q>j@3t7_aBaS zdylWb0ES;5!X3QP@5`fFx;u@}6JV{~MtIaZr83Oj7dUP9Lb`omYa4P6;tOiJj z6T#zE)dBb>?MT>Qasn5U{FXuVhlfl0q;G2n_TXEi{&XB(G~y=L&uRZf5m7^Dsh+<5}U*8awX#d1zPKja|}xfTa;1a9BK^ z@SVVB7z^x2cg^=)(5Z!w_6*X7#P5QO2i^(BK)a$XqTBf?{-DS2(HMwk2Yu!I=p?WM ze6Z5JJDGI6cTIMyqtzffW9;g8hOv5Ve$V76Q+qP2WcJDN5nO}&oh9!h4yum5d%EWv z56TVqQT;}`ya46Y75&@pd-$QS-OK0rgOuH@0jb;Ssq{c&o$->KqU2>JKBtl|#nR*3 zIK>CdspysaHnX;=~OFj28`wz-5PAXbLn1*&pM`3P`Y=sR<*sVj_crA zb8xugN_F5ot79h{6<*8dKE@ve`(W$3C3oUAt+|^qiS>jqXSn@nJ?@a&&LsOe=Cn%w zm`vNv2)J!F%YCQ)yHB)62i3=h_P@ED;c?E!w_L$#jZ&*?__CXH65Ug;Ih@|Z&PI6& z83&|={8TQyq^Tcc591g8hc+0!&FhU?yOIJL?pM}}Fx-3H>;L62+B;@H8nCKy^s~+S zCy&;J`a0`Tw=#{B=rxo(?h^UM!)YWE{wuso#v6Ad?kT?wH*_6y`XWZ8JVkuCK*l|0vwSyoR&s2!XbJilCJQ z`xR|j{+B~|6u=c@FPizj+VMeoNAz8^&A|nqoipnyH??WZwv|vkd?&6gy^po8=|R%j zL_4Pa3+sd=MA^V@7hss{J#Dk^WP;Ue`U2{cWX*9PFX3~Besa}bT`KlEScTu#`4oQ; zeIE8m+JBn3D6OqR${|Q!*-d8oUNu|}x60OS(I`(?Ocv2#C|Xf}#&7BN#C(xLYnlpP zH)x553ZZhQQo2!psmo?@wF<#6iIVfK6ICHWLjrXS$RG8g0Qp?Ix*bV&UAU}|4$ z3qP>eo5v$_SlDe6H*k++!J*4kZ9(VQ=MSx*L6xZ976y?eNq z9r^n9b~n2J8h`NZPki~};)T)(e&@ru+`Gb)#7_|{MGjG1(XGgBGniV9i(Q+y0Asa=HtIlCdg{lF2pHKO}3* zOySt;*3!2}SDN!IC$stt&%)CT&Snhz9)Ixd6UQHJa*~;P05|APz+DfHlRW?-sEm{6 zcwXsErpx6O)q~xkotqX`emFzqdi5YqKo9Vq!`(r<(_m|S>Z|-g+7(R-4*9@||^Gje3Tr8k>#%6w4c0ZoyAbT7E1@!C87%L?VL7s`cMDI!vnmyes?`RJh86KfUxn<n}n75{Gxk2GlVRve;DrAA5tMEH;~GVHV_!%VKHr=Q@%duRK|;P z^$k-jVScoY9Qdj5VRcx81Hbl8da_>agYB>RvwV=^`LP$y6|H)Ia%zrZ`5bYvzWw4v z4D_xvnA`$zS6W}=52}Cao>~U$=Un?+aj(s5p5?zbdd|Wn1La}uJVgI=gP7f|H6}Mn zN7{~Ue7_A(&r-UBZ6^4!e1hci`VxQ88yXd_z*tYQjh|P%-;@#_1lY%hI+a;K${{A)oAZ0f^Q0>!o?=|iyW`UY0 zl~%W9g}4{xJ1p?1@Q@~I0c+oAchAie6M1pM`tSX;gNL`n@y0RnAVZCasuMAy-<|S2H^;jI$GbX3`IX|0s{=xA=pK z7cp(i)8CC*WbJYS;E@GvFgOVPID>vBns@XOv`@3eP-=g`@q{1LVy`{Brk=4;3<1tS zsJ^~GZg#p|y@FfallQ>a_=DVk+7e?f;}m>@Nv)3G7@s@5Z15*A54A1zS;bpa+KXFn zTrU$Joq0;{ZGa|GmHppB+(tXS$lcTR?JO?c62%~yc~k4*-_9TOi)+UitFe~cy3tDu z{m1rQI1cqdjEm8DB_@Qi=iWMJ5cw_~QW^KMT4Z0`8u+(hHP0^b$>26_{{%jY?-N`Q zt-G)B2MwOex`Y_FS~+IB9r)RXUk<05xp;9~S*KP)b4YWY2rq^gHwMRUDcg?^D8nv# zQ0`&_U#&?So1#a!Vxh?QpzGQNQ}`BtP;s1FOMdpie71rgUSZrp_j~1bj>-13G>k1~ zv-(K+Xt8O!ln&Y2wj%yk`OpgBr)?7Rasjh!!krhck;G=Qx{80cQO?9~@dq{L#(cqT zE_QCUiKpm*JE6he-q-3QJnN@XqdE468Lt}4gn!we=HWXe$=|nI?QQhy;0IIIF?xM< zc&U5t!wvicCrDLz73&h5rQhHWnlU#PC>~=Q2V9vx&TlJ@s?x5Fa=Xdx-pUMo^!-X> zZHLdz@k;$*ed{Ef_Uce@vr({RbZHHzF55mX9I(K221wUxo^Q*q@dp*pNsO2^sWWFt zN1m~2)yI}hZPi$v!@Fgg#eC37IZx)5WO|UIKMZzGHYski`UbHNHkxy=Jr*^u*yiI(U)=g=+vFKUs8oPO?JW9;tD?I)Cj)qdF zy`fH$OB`xo<#5QwgD$1;%pOtO5H?uC2@W2L=If) zz_&`IcFXyYmbwby+D@m6u~la9xW)UW-fN!n_L9tveyf!9zT@xn2bC+)tk=za&e(+( zs4jqYD(Ae$W9AmcM1$*cjve9UyuX9?|8%nCe%wUc4md!!8ecc|rR^=TtDYCuVHd22 zR)y=n;~#Fqxo!05c3ZY7a+#Z?9EkE+d=5}nnvvY_3uD0z3Qs*+d!%I7}Bfr-} zAK}11jqYVuzUqbZIsPF28p_IjN6(eKPYNZYnRx3h)fF$cW{(vc%nA{&C~U#IJT{Am zeCN^=6$W6<=ILF0y57_gt=+cBb7`%*(}M4^DPk|fTX*w(@HxHL%{Ffy4r1ScB!=cU zEj4ZZxO|f}v~2iY-Q)LtRy95AGryLGvfFuzv&<725+{s5&NE5T=JoEVmFWb z&x_V&eyF*#fD`z~@CRSqok zJUb^&rBlaRhqb~#g+J(Fm|pQs-KZ{p;o!aUg^1%2er|lK59UDDG8W^xbO1T0F2&C56X=HR(|hV(6k-t5~lE(=D-H0TR%21!clhpk>O7BH1iZMxvs;ajs6Dyps-4d ziB5hj{g!^-%!_7iXt;EK^6zp{<#;`W(P&8K&FTa65o|cX8&qB!tta@KSu61V_c^bB z7k|*~YgHZ&^;>auz4ouQqS`rs&^qf?maWk~AOM={TYX6DVR8gf_~*LBo_weES`z*+ z_k;Fi*2=GYqx++W`K+-?-vJ*^Ydrmqd|rAsTuHUdzs44>{*Q;g*W5o&EPaO#W7qq> z^Q`NyHKX@C-kZF!2>%z@6rXY32eIErX>q>lRO@~IVCwic^9QZJ3g(rcB58d{-U+=n zemeY(+%v{k@kF@z!%sE%pD|iGE|+$0gV$h_-ex||efd0p5Nwh! z$5+ig-;zJv=x?DUOAcaj z;>X*q5uS>#@dvq2KlryPK6Y(G8QP}$w+^+9Xk-`4p^HP@{%Uhx_Q0Fa`SLgwS>wAC zKIqmL-~0d%C!_~0AhY09@I{!^muxC!aJ!Zlc-VF$)ZoWE=Qc>(k}g~L^TJAV*7 zmP5R9otW_|*@?6s4td@vvqc?H){5ofI2q}i%Ksas{fG;QFGzSZx~Iyy)@f5-zsq&- z8{rP{1i!@}+-hD^`PG+w(Msw1xUVX3X61*gWYFW3KduUoQ`jch;J&uEGr`Tg4Rs0c^Wur4f%c_IkU=}?{G&t*HFlubAZ`p0E zDLXhi547aezrMjA^lztr?9iM`o~4`GlKOMSlwEl=;rG(6x{OnmeR6iIm+1qWAWj^3 zG@a*ipQ=2H!&y8JU+eHFP3={AcYb7ok9E%Bq!9=34BVvA3CDAZt%k4j75*Txk&IK(ZDNOWP-9e}Zm$|X zYvNDDdbQedF*>8soJbygQ#`cnF%I2Wpf=nm=ae^yCZ#xAZ~@&7T9wR=&j_(4i@C?? zGMcu+IR@m1>tZW82i3QVXje*O)Si5dKgi@kdsFoJGCtbS zKZ>;X)Ya({8(wUJb_5PYXHXa72;w)VKG5rXKIfL3>EI+pCu##o>KaX6@Xnw(!SHXN zLt#H|mfU`xHtgh6`3E&;jNyiXZ%Rv=wML?Rel)7((yTDLxrs?_$Nbjm6Faj#6Sn}* zv3g8xV)t~mX3F|R=k=K+2f(v>b9&CIQQpIwT(>6vK|7jWi$7Q!mm3~`aKQeZx`Q80 zTN{{MmmlH}GUf)>iQAT-sTkuFv0?CmiCyT7N7=|O7Vk#UMnxCGn#A*$bTV(+y!3)y zbgyV5wzM|am*H_)IUa3mak0bMRV;lxUeD#tWc1if<_u!J)+9Ek!I?UtouMHN$5x;J zT>e2HRPuJs5y#Htca3oWBT=y1Dq5Dkbbm^WMj$tj$7jn%1`ScWi7mvHz@;M(A8iYa zyxMj$gT^i0o(!vWBIY6n4~9UKKh}q0b^YQDGOp1|ZsLo$z&T8sxm10G*B{{z()L5~ zUMn=6o+{)f(A=$jyUc(6LFE*>9+K_rKG}QJN4@GT-OZlcN#8vaWX?P++${I>nZ>5+ z@kx@`$ErVi2$LosubnBTuWh@Gt~2xK0q*BvdUFny8~UQc2%Su`{VD#S=RZJi3sW?Q z)XKH6GQ`&Jg7?DKicRu}Y((LFsFwa=$vwP5uh&D8ZeO&!)j z>$ED4{M)`0Xcc0Y7;Cp{rrNuJRomGhF*J+KqjT8W+2r^5gR%o(P;-1+H!G*rHKUj- zjvpS&<#}EWnyLL`eQNm*%UWt>?R}>~pmc9RGyKQ!2VXu=JnY7s{;Lh*n!&wW2|F0w z8{I>5+8NeLWuy6I(P9JJe-wW(nm@K5nv=JqT;ieQ z{t(X{_oL9UxQhIf_=A1GD3R?{{$KGZy`(O#u%^mctCqDF!`m(1j$Q_{;^`Pp90#k! zKZZYue_Bn;l=)Q`Z(B^=(Au`Pd#?DG*7K3~U26~L8f>S|!Cmwc9F_hl{6SEHoVdKQ zL&v*ad9U>E0fK4wl-xb6lb!1yeYXkS)cuN+q|`T9~+?7xuy0%;cW> zGmM~=tRc0ae0HYjr6`AWipntc0M@3u`7;jI;q-?Z+Ni@LeWi?D)Q_iO`=_-l|8^UG zc1kw-BxaqDB^j_cp8llzFl9|W+UfK#zN~A%qOsRJn>~##eB&@}S=hLEjApO)Y8&2o zL;jAR`zn1Gd|km@E?ga@oNhH7A6}fs;BrLoqjp}-)3IUHNseOW7V)!{N$gbm8h_C2 z`Dz}1jh~l$DNIV(r{YP3udz_91q#FKWjsqyj*A}oJ}Ts?TPt>4m;y1_U<%JL{t1I! zP4ET7v*21LQTrBukaB`+iYlne(0m+|e;JKv3?PlwXd2HUWW{(?k-s!;bS&Fru%@|u z*~-^K?ip}}by~U0gadLt0Zt|Ui_yp9wd@P<`uF7@^jqfM%f+C!74_4$(}8JrK0D2B zY4~<)aiiv7n&Td2#0Nj;noBOePQm!*-Tp`%3vvyD^Hhq?YD{_OZSXgItkMtt5`R$D z0A|h}oOt|{uRR{cl^>4Z2Nw&ZP1|rg=yNJ}W2ZxXLLClESQ6s!PK34b>jixN+bHF`Za$JcUmA-=|1p3!jA#qJ* zqLdfROl?Jaa^Q#Sy8L(8nxHQB;!6sP0@EVq^(*-Y6`Mi~IPnTsNBot0nETs!w&%ja z>8FOjNiL^K?y&IRLvU9MrP!kzxkaxJXgK0enY@ZC1X;k$rFkhGGxGcK8ja3x@dp*N z>&ujep$oT`dlx~c7ENF`Lz}_pt1`kVf;TlUmym6o2lCerX;yAHgm=?2IS9M=Hn>mb z2B$4UoB({iOrc}^lFD`THU6Mko8}winB(cFW#FMPt|A!0{ghoAI}3|BS+K(3u_nLU zvrNz4KGwm)^wzIr54q00-CCWN`Tq40@!wjV=%wkVZ>jv{d;CGhTFV!P7c35^^p0sy z==F)a?5xpwbsKiOlFk>W@Idb5@`1Z03`Q6ZyeM(L?ww%uzB)CVWFy0ODjb_S9x6V_ z_^NsS?fgNlgZx{c?_lpkv?s=YG>g&7X3TZ*}kODy1FqCC}m6se z`vSnXN-0{gr8c}fZ&`kxeSz*gp@((5pss6LG4wHKpjC^0bBH33s?EH=M3H7kmRQ%xb zF?SYs)5$D)tx9ijOE+nAB!$^zE&BTkhzwi?9`SR5Z-qMOCc$tQV7Xml8@|II>|buo zXN}}Dy=IJDlS4XFjOAOEVZ0NaTzf6}Ugcr6*Vr@zQ}T7KuIXfy@P@YO?_Jsy<#yb| z{INP6C-t<|J3Eeb8Lc`||GIVVjlabo+%!%Qo%-N?^bKOFq>VqIUFCfgvo@OFHiLI>oZkQq8U~HePFT0gAxU6)gpGELV>6xycN_UvOtPjNgN(Nuw_`JZn4E*);tTkkesXyww&Dkpe!B^$uu8eE@ZAtcO{1`gvBd_?;VRaA;F-fs)4jvX zyphvudRf^WFt!@{$d5{IxpkH+-(j@!t+8QKtcNzia&Q^!`M<><)Oww=Mp>JX-%0yI z<2R5`ioLC3sC}VQIi5xqb$)5v#KAnz&#riO=D34fZu0xBeQli*i}Lj{DC7>KKxp4D zq--lcU44r`=+Cu?k5+k2`4zWL`8lU^SzN-v0~FjqYVhWOre3~t@orYF{{FJO zI*l{Cd-$z>i?72unkpQZ-{TLy^8%T5FTQ2+mPmU^@t3rzU@w%gI|n#+a{U`<4NY^7 zto_p1e4ZPXRq^^bMfSDrV@Imp!=UBv4x{iX7>|FAKd9JU*1MG1N1yQO;O(PjuQ<3x zqz!5~sDL=KK==oCfO#;3pWF5>hIWX(+-2->>vBGfa_8Wz3AUCv2T#eb^9RM1kk3bl z$D6>WkpGk}mV`T*@{8Z~#?4>2)UN41TlwkyzRCye(JFr#?BdsAJ$^du5~std{&oJ~ zn=ACTh1bf{_hSR){yCRXFCO8!eVN9$!{~iAJZ!_q<6=+_t%`pCDsa8c3boZ&`Gc>r zzd4VlKB$w${LUQyI)1?g&6S_mo9Fsb*qmF}WABn?P8|)b=7E=kX2#0h3HGTmfqQV#2^?G<>SW)`KloE8 zvPEr8cFM+gpV4*B6?39f#)r^j{lMFzbNwrwAT#!n8;UW{wh~!__D5WyQEE^cp>@2v@egryMQ05`N+c!G1B9jXfW|x{A1=Sp5OP1)1Pv1{{MC8 zJKkk}_4WVjcj-O)`>%F+pTpm^oba3YwOP~nO5ze>jLEMo8&ppD!GAx0@LjgIJ-^-v zU3>rief^i$lo`Iq5RLi}c6c~W(Bh4j+Lr2vYS6qS-wA6>op6DVeVRYW@8FwOJ21cb ziw?l+HP=nPL6t%GRG0$i`kd(p)W>vf)-m!E`)c%?*L>@-cl12!h zp{+e#>!82+t&)fTQzrU`XRp?vdLP$*9>0S>s62q4?jyPw(vLbdSY-5x9+5m?_W-}!DPq2YStJ`!zJ<%)<)OW_wo2h9C7z%dd?uGSVd18t2OE2R~1F z#=ez*P;J1p5pjBzJC=!{Hw1S*ktd@3wA&ecKL)>)&$Nr*S`X!&5${MmuBO|*WuL3H zbn)Os-OP;pE?hylxA=qJ z+#5JF@91eJD3kb%=)>XHH5j46MBMbFy^qKIrF=0|+ivcwtI@5^6vFTX!K~Ub`BSCY zNx8vnP0l0m!Zldom-vH5&&cPqSA{t3J&7G?r6u4n7SuLm6K!j3&2H_%cosnevg>b; z%bm(Fx7o~{BR+cie_q^RgExz(fQFgIEAka79^gCtLFSBPZ3HFAaB+kcN8n`MbL8$) zn-DghzqTWlc+V=|oJq=AFADB6IoKyJ{@$d1N%@ztN4p(4H_yq-a!zKc`sJD`pYN?i z98s+BxA=p8)=`tm^mirQPK|hkSOXNj@?g&fKL2c3?|ykk}Hw1KwTc zX_4Pcc+b$qxq@GwoQfaHKPXBHYY*12tnJLYgY}27eLgu|xe`|p^(U*xwa06L;HD(hu3|CL}<~Y_fu}0RU zoLnZxlzY=n_mAsKx`>vN^iKy=qZ#%mSRYxrA5Or7w+4{3KF#dSwCC~p`n9muc6r8m`a=T!$9XsAx6;%4ywIPtjehN{-W!f@;%P>w zXQ!AV2O_*Vv@6$7;mUm|^`(b9s#q8C24@F2(ebiEi>1%&)qj|Ab zJVS-GYN3au=&5;LK5p$sQ`p+AU5&sSL@>FDFvF#NUuT=dVGOQr5x%<9z7mIVa~H&u zRU4;uvIK9ta(AmA%s*(lH+ygP{c2->*<$vve#@8Do+H_BrDwCzrW;wob#D7dVBs3l z;BZLK1m56qYxd(@^K-AkfABHrIpn)L`B-5XdSr^zJvp40x!}Xj7q8cR(7Jvu|Db$h z9QY5shm6sKHej$b;W)yhEOU)A$7vJfhg3a=aER&%g->AQ+;7{?M(1v}ijJ_oD4x=l zPJamgUQcfNPI5Ew$Ak;+_r2(boMg*G+V{2mgKvKU&t^_B<>sH)^%@Do+LQYEx>nv< zj<=5*e>L%By=37!eK*0opgP1}Lg@;}KR{M9e|F1E`5!&#F( zFZ`ogiFcfKI35q=8d$IDV|))q!;CA5{c!os{DXdrJSFmVzWlqY5_64b;ma!a4=?JC zAz+udovaOF_NpB}49alqPO($q@!SV@@m(?PI}~T7ukixSbX92i_x;1u9)u8jzg*`$|2F>M8v}T?$$MO=Bp>|8ci!LS zp$yQ5jZ?!m8OP%)=a2M@g@pgIsvM8#{@g;-=`Ax)q!-`HA5loWI~ zX}`6hRQ+jX5V_{I_t>6zc15tjlHsql!8WAfXLKN)l;gCM`12F!u3mw+gN=QRe=_lc zl)fqcpyk!S)&$vxq~Q~&kG2+k5I>Tq;-7)Xv|I3mi06ggn(Xny6QpY?ExEP@|3zF# zY}>Z%d1#uM7;)%aIxeq;e+XavvHU^uFI+aN`tM9i@#AA21VRv(2)jFcE!z*))W+_X z#}*9_Pxfo+ZMO4SC!NOzG!j2je5i_x9-hG!TX<4?Wugq<#2*9~x9I!RnAK9Bz?Q`v zBuuG1c%}es-7@?;>Q$UgSNY7NDFtpNoKsk>JqilD0gI~QPo8&Oy%z@)<$G?v^lkh> zd_wBu|tSJrpym@E3`^>Gfa z&bD%Q##zIw!yf=m(d2VA#s&{>(qQL`9f{tk`kuI+-^3prR$G4B0`9E(4j3$RjBA&P z5674WSH8B=x!j=GI5f-WTRPL~MdqR6A!;8Qy(6EmyLJz}Jl_UeY#1yHEi;2r6TcH1 ztL)%)^hFEAfNf8ryNbImjBj>*dx8p+rmjx_J^9@*ypT6EsPinpPV9HQVpLJlG zh|{%c#8;{Qa#AQB=sVrr`B8?e+D>1aX>h{r?b@72;I3NdM?Lt({6W8!Ra~Wy?M2Y| z7Gd*U#&YnZ>S#6F;>5zqX=~15ZuQr1t#UHCnX?-wHdm)rC{LOw%u<`HNm3bLBPV zFSspNaYDe#G1Xed@GU-d!% zd!+WQhnpFG9e+?5TF~h0dj4YCcVq(rWGp+C9BqI`w&8e{o3~UtpY}IdGw=ZbCj>9( z-rY!7x~Ozk3tM~1=qI{xaio1HPMSNSPw$ztg{ftv?w0ndCL6l8)?C!sv#m3)5@e^CC1#y?ECSAVUB(OU@CLp}MEFwfV^ zZt9d>%u1bc%^xWqt;V5Y`!A0<72xv`Q?LrZv=qoj!G4L*KR$!Wgr|M@Rdgat&XrS!XiZ zcP7WXJ-616R657G1O1^ypS%w@_pxGEGG{5a-MvF@$M<%ma9thieDBzfG)UEy2~`4kp0P6N_~nOOMaGW5oDto0t%a@ge7C-|SjK9U_k}6?<#r+hz|Qsc?35saegkm3+AKOs~uW^(e#D z4vbu*DTZ)%@lV)^~y(VMi&`-E+{ce%inGq~oxsxQ>tq@-P$F8VH|kQD*@sAPhh zXMT{pW(U(tY8bu1KRjlJ*;}S?IDR32@O5To0r26UOWsNRC+Ls4jEUG{F4hyPE3P0s z0bi6k&F9Mul0EJRud8zxTkV}#gX@Rgn4i*GA8-jOg}#nID1M{CYE8c-U!0qwBw?GTeR!0XzVYcsi@@uH;IZNEH102tt*+CF z>=@CHM`n+n-Ca}Z?bKS7h=bX_tycc=uDTxfr^its`55`LyY8;L?e?qN_Aa>iI{qMe zg&#=X<<}f~`BbV*W-bOx=6!rNGt1gFi`BWd* z8uwJGZAR5ykM1xRCefCH1U_h{^JFj?wGHOPl=x_^}j&uI(5G+nqTk#~;=iTfmF+brB$ zH@Dp5gB-gAYFT3RW#9{DPJ>bGSUAScg>B+ESb=~31MvsnXB7%%@bVY_1lLQ20e^ze zxt=(bV^5snL3fwEm~!kb;ee@Q(5j#J-REIYOI-G&qR|=M=kj^0TDcS3+Wd((ro$hk ztxYviS!?E?SEu2}-?;JnQMLRh*XQrQpO;H$4yg=YISj@`9*zcwdU1pg%V#|4OR~Rj zl{Wip&JJXEo4n)S4MKs{AQo8;k}%na_kV&v_%1S1oF1Xs!v$H=)Ew~bGS8dFj7X|n zr)fRS9`Y)?9alC2?|fSdtqPrJK0K<0!w4wvzKcKjfos0okiI3};0MOMHr!z5r^#Jo zo_L}ZVSjqA*)po1xwFnaQ|TLeAoBoaW^P*>SkUbZ@PYUT_=CU2IaD_El`PgrI7956 z&}L$qwl+c5nWWF@L>IirG@DGzw}~g>s+qXLA3Q?s?@0dc4~{>my#Mz4G~OA0U^d3T zkx#*kGQ-i#Z=5BI56))TEGVniBTadl^Yol@DHh(h@dx=y)3-kLD{gt$yNu|dxZueSmxxt_NYX0EIn#gaz zwGx#F#YU7ZM_CZZ5u1zhX0WF$`$^hk?Yo$KDz7FfzwhTCj~YMR*L$QN#vhb!3brl7 z9p$III@M#)%0^>WS9`K0Z&2S|pT-K;(AX)S>F)Z|=Rbd!D(AD_=Vfy;K7=2i)pv_*M82-Bc{CGK7%@>-TuoFKV5 zANl>I{J$;__2HG{NAm|YzjSrf{q<$$C2pBmgZN}&FR{AJ31)6h`o^(k{kp2&O*wwA z45lrD8du-LAM~(T`moN1(&tpaHnD#+J}i@W@*l}1b%4Rn9kQ7 zqhmD2rcJCYTk-iywuzIaSXu7`cEkJdi=-oot@yk6gQ|b}5cQ6aFAmDPW_5bC*2krI zXLal;vc=~o&lDUHgKL6~tX%vU%GgeN@Cf0*m}K~bV1nq2ek9>Les(I~5`Qqwd}V>t z^zDUpyg7Y%H%8->Gm`KoxLfHsbsq;yK$Bka6ZO8G&cl}&^4<&YOoN?(nfx|=6@Sp2 zSv7x~_{APSU;f8gvj&*9m_qI;OQ$Rai`oi zpJk6|zN7E`r}S0v2fG>o{8M7>vbs7GdTXB_9>|~?QyibEIEx;)i+&(H(;-fd4L%0e zv}>e;w-#7o>a<29l{}x|*b-;aZi#P5-}$5TMezs4HQ02$`Dhcx=1!6L&%zd!**Ckl zK_56u2A81XYlO{dot<$%8^{zn)C z!VYX|ES*-yK{(N`S|wO4oSqgVI7DDCiTSA&c6(=M*Et8r4`&v;H0yysN?*$#R5`GP zYLDQxN8F-47PAy{khs0Vi8T+w=``_LZ{5q%H5~49D}c`6gt_<3Jj+3^(-=N731Xy9 zz(}^*H<@$Ne|%*9XD{FjZJVX}d~84LJKUEB;|g21yYIR7VCr-di&Lr-LQ=24Ygjkx zvAC(Pw)7*}LcPoEFUbA|ypgt!2?Dw6)a-NDawhMzpPyaA|Er0N1 z?q#f_zwS$%mTlHH);N51h@)E=MVvhCl{_bNH#e29rUsWi^}iI)jy*QJzE}Dx{vdmM&Y7G!4ZczgYTw-`T`eGf`G}C0bZa{w zts3E0uMoVZ@Kd-j7sr^`(pNW;mi}gx*f-cq&^cy|JR|7C724S2*qhk&ttT;r!8E1O zxmH|3ID>lRwYjhFd2HC$&UpZ}CxImW-rnWMSRS^?JCDjn|m!{t7k<;JXmRpNn1H%mW# zi#UCmiuiTt(B7rX$?HJ%(tIW!sa1154L#OX>;94S`Vwz=_kpBu&8qtD1cgBVQ2 zKzufem*mEaJue%=uaeHCtXJj?_BH%L?Pd85F1pss7M1oNYMt^ma!S_2uDippXIIr; z!%6#VjnXPGuEmDL96U9{HRjjKlzDdQxC{Dzhv$(7Jmxa@i8<`|Db}D#=}7(V25Kg) z@Xu)7EBDm7d`X>);&M|DGum=?b-2GemxU$X+w1mUjz4J57G19#rahYIR(dgVL)&10 zFmJ?99QDv_L>nem=;7xX*!rUOe7n|qqxDi_E44eEGK1m17(CpHhg7;Z*;?1+WtG`a zPfFRq@|-PfF4@81n%!S+=8@-L#~<_+loN5B!JdpQjdsDVY4qpiTd6Bgdl|cirFJ9l z$^3A_{n&->b?YS14?Y(!=(qAXtsZOLZsk(CIkDh+kPEI0slYk_M)*#jUVj^ZQ2VX7 z&Fzy-4)2Yw;tjF~K{p#sQQ4>01_!yH?Leb8jy4GExgPq1+wpD#E?7Jccg@qtzr6PI z#ckK0Ty^}>#XrIye3eI>wU0Pn>xCi@Vm4PY<$%NX-0vE@>^V7|({ePRu?vCGnZ1wp zqu8a33H%}KZ{-idO;g_0!St9vtP%#ZA@e5x9kqpdj*rRSeWcI$kN9SfR4BhM<#H&XqvZn03 zuQBv`H1nJ0I10_l*mTN&nm;K26!{RCwHWdnG*#fTBFx!yWM-7u+}V^uMJb?3t-|jb-IH>37{KXF{L& zsQ-|hUs>HM{-gGu|GEoJ{Z~1H&u7YV(^d9X|Dta7!5yS)sb6KY#Q18u&-4cD z+?)gdElr}im5P@>VN&+J^s4soT~o;s&vjP*o=aVrxyG|In0^4B%wAjf)xXWwP}65t zHf%ld)&%z8^dm4HW8V%{O1Z!wnkx-1R>{7{Qv1iy8J>@cVdPp?8k~+%WFNrJ24B;he;Ld4oxn!AmOf`18x;T zUK*zWaYwH0@-}XDb=Fp;sw%<0J+0VZ?7LpxU+*!0c1>A$ZO%TXU8r||(qC=Czntz9 zv&U@(pUZCdu+@Q+sSI(rcX8si7~Wdp*;0I?9(Lw5n4z#JqXQ-^P`ozrk$y>E#vi17 z+6PL@i*uUV#O&?5MGRZUCnVgTT&wq$o5m&w4x)Tvs}`S8WoW@MN`Ymj#Jhv@1lZ=< zwG(g-w$L>3p@<`=B<|qvC2<<0Y1kSQtPE#(Z2m8agidYM>*LD z&HU;U-lfj}zDzr5&W!tn>EHv)Wo%mVjj-pf7229`w1j~u&fZStAb#K+QdC`dlQcT9 z!_!xUix{pZ=J#|-?IEqv-(b$doqtJR#~(Dl8k#dHgSbkRqf3mAjn9Ih!f*De8|>|# z4yx*_fkrC%x8XwN)8}OC;)sLl)`imwXU2Y)dOX`Hk6UMa{NI@KZy$w0e-(d_yleOv zy<^Q=rmbXiC*Gi6wnXv$;F{9+rSH0O)egkB^0$u<>%k-zYlNe?@ul{JTdOP9qvL|L zxGQ*fDxcyLeopY+T&35&uj3EOmxq2OJFohf;pD|i#pD&tBSTxLO*%%`*l>dDd3dsM z#XKF9o!IK`Kkt@#yBc&N)#37bSV$wabbY2n#OeZz)tJ!u_?!&SR%1!&i}-`=v*}YB zI}}2`I`k{XJaawTuBWn-9y8Y9S-Wt4!J+tVaN2f(*pH9g{&B!I4Q~jjWL+q35+}u8 z=?<#No|9^oZpm^+*x>n*hb#E&bV-)|mu344`GfQ+btR1tb9wtc{4Q7v(oMthb;odO zcL}g5G&#}jYwfDFP|3fjt4thh+s~p7x!@TL@W7P!Z=1!Yt2L6k;qSf@K0)#e(#>Cz z#v~u;Rm+Qb8@|XId$%}ijhW-#TTtADpU%#$NGP!@HusC#i8gH7^U+cH7GHqx>rXJQ zX$sD6#(y3E@JgwAb8XFs#2bXqD?IAiIx#P`rO%w-%y*$;ah15and&9^jJh4p>_(d} zvKJnLZZky+XD;mye){)xk-jeeAY)tW#8jA+&tmRf)=OLFBH^_3 z-*WZ3bYr7vtL5SUw@UsHJnx(NJ1SP#p)dFzSH$@nKHC$;xSKsQVeDA)=h+j}EDIfT4KENE*N&7cVVmc;w z_tP#tn4&iXZ_!V5D2lNrJS`I-mYIjI87z(0x@Xc?@dssdHS-jG zYeVd@ql1pQ+5+An>xRZ+X1{!hU$d^y*5V150+$kV)amLZa`D`yYVzvtssA%rE%|m` z&Vzko?B2l)G5QL#T}R-tk)9dxi5KR%-uo*4p!Omr7K7mqh32y!`+$1RO%dOi`SzR) zJ<7*eVHm9k7qKh5lXA5?-rUxS{Px+tPf)Z9x$OnG8u+DqW?s0j?#_I1dK?S=bMMie zj5a1!dh5=)wn7_W3Ey?mu2?Xvwu7(Y53(PjUupU%YBQ1|1|M^28P0sTk9IkGrE(FT zT{x5rroknn&vd;tiG_yq>$u`{GHv_-*tcjLFi*9gqsO{3chjfiJ&q`poD4xt7K|VKzx9jC)4JOZeqhw>zZ8MHa(q}k2B5u>jBr8pM3EX0oej?5=7P@XFfVU;kx`v)#!e!+UG0uR zxPqb0AQf5ftsv8}wJF5Hn|&>|9;Cvy-}%D$gPtFN)vaoG!Z}f8&>2MjeX^ZVxAyl?h({6Y04@~-+8pVRDF_)n$sVwX@Zy-<5_F5%fBsW`L@ZG+>SZ$A8?Pt~{eNXBAI*?r^V+cup6@QSwOy4oFoX9U_(pf~=Rvws7 z_-)N)x(tUPVpXfoGhw^yiZBl@aqd{oGI#ickfNHE$l%iKUlYUYVSjM<#OK=$N>QZ) z9Kyq3mEIL{kzF7a-Vau(FXIoIwjh_Xr^yFawtk%p&DyB8dMA&k(mMCV@ltF-VsTRc z86+RoHWWeSn8w57(KR`B?#uIW&?+1UqxflXOrHv~h&jOUDrYw%o~q6bT8J{o<`S?NAYmpgJlLrDX>lQ-b$PUqom4#Mr!i7pCyig z5#{RcUeyMMm)6;z#k1Y68pO3NuFj3>ez&hBr7OA_l)@$j zYGE7h^U8mCEc?rw9>0x0sJ3`r8C0`Pwm&d6y)xMUL1plsXYjVp$F_~?S@Rxsp!J(E zp7qE3(`os5toNezz$A8S%;xswyZD2q2(LahyRV@LAXRV`$iO^y=_{HvrlJ z(Q|8GzuWuO;~Ckp#pMGA4%K!SEObw~8DI2ClKB#I#seP@wXylE+c9sL{}4f%nY;-9 zdgaHw{;U7JzC(R#ayHldx!2#s`F_vK)hI{dBlzIdJJZUR$ECmVPF+5(`CO0QylDJl ze>i_o`S38nkH^pB#jHKpB?6l$+`1rsvdi_;6=on!7nS{GUo~92*Ft5!COK-C{j`r>?kAw9ossS!?;8)?e-6&1*gF z@>N4dGjoLQeAJs>y!!gbqwf9brTp=Cr2n%q>wAFx2{(1$@T9O&bn!c*v-6KWg)Nbw z)aGnqFcY5Yvr5YE`}xNsb)+`aduk)vMmVomR_?v_t^92YCr%i3_CLfQROZZYe5%)t z`J0Rv9^nx35#bQvKR()HdVIRg74K0t_L=(n@1-u;Qo@Ij_szcU<8vFzqomUVU`d)@Hb+2qA-9|-W;Tw7feN6}~Us{H<5S-g9%y8p5KL91)} zl9z9@hnH4{<{<6qlSz|5*;Xl%&L>CWYVQ_HbgB4+(tj$0X^U^<4^n5w&PbNbW!jw1 zPn%m^dT%LdcOt1GI!fvK@#3!Q!|SoJN)D=_2It4dn>(n-f0jRJ8ed~umwYs2FbP9hZ+;1N!RtcTK0gb!)BgW?drF`R#fKZvej?v|2{Xd0hq z@y@{1oH1n~USC^rz5MVh;03z*7IEyFZh8gw5x1~&dHl{dPAkmzx7{W23dYP4*Aow#Ub1$ydiyXZ{5sUdr z>jggS!eNyM@Z~UAY8`yrrfyzZuXebDM&$am99^IGIQ>lR$TP790o=gB=~v(<>T{+I zmAC(xXoq<8w9MW6lagY^3A$PoKu z4*VE!YK!O+yf&k4`$ybCy=VGSeKG5;(VDv>`W)9(Cgr>mvxd{cJ_ z$7paC54OUw$#hhQ19t)+>0tY2&wQSs z(IyONKrFpbJ{VljXC*MTHhFPNwNjQ?F-nr9R5;VRyqPkWEwPqHWR zR=78<&g1n3w(rR^lYvWO;+qlQ?Jx2N`5WHZz?>gKnSc-dIjs@Wj83C39dF%J@?~g` zos^yEl%3?}p1%?|Eq`(n34RZK%D|l8o`Z*g-^A&Ya|b=biu7myh&!nF9(H0xDx8~p z<~ei=pAqyJ&v5uA)Kj24nvS!L@~n4r8`;gGz0d837%0NIyHk#53&Ww;srX;}U|r&W zbfq`gBhI7N1=eTEa(=Yv^4UASBDqVlpDYEp7T8&DHE;K`gXNKaz+CyHT@u6=e8LaL zGsM0j&?!ufcx!*cAEf_K50RSk51t4Qb}v5X!m%d1w<;M{95m&H%YoRXtSfa7nGcgjMVYpI2A_iX*X9|7Gzri1D5hG7)!?dRL>%6_Eo|W97S-rK= z^@rn6=JwUP)%E%&>xcTTZxVHwkMLo^2SYsg<~X~b%w|J`#0E7CiqbseOH5R3h(?M_=D@k+-{6ht@Xk`LN62T z%)xXxt=-o39&>v=Grw-PaMNf9&0YB3vIjgh%k2B)E5v;1wrAs6Dl@sdr9$x^h&- ztF3VK0hg|3FG3fu9O^Yj>mQ9*)?sO1uXfDQHfwFWdjbXMoVLM5^m;(oBb&}=JC41k zy_nmO%hazZ~iBD-| zX7hLjzWnX%bm)g@7`ywTS-U#&T}Xr;?S2c5%jBb-ssCO6pkl)wn(gIOnJW^ety}d? zXT1?))tN_I!$5YbjV;*6YyId(RT$11Q7hPO272dJ4!wm|YB#NQ&#hFfA8buyrOM*g zngx5!Y_@Q@@_jZr!+3C8O=Jd-b1pElmhoZ3ZusuG{VGJt{C)nQ*?Z*ZJF#3Kn_b7R zL_0l>G>36{YetubFg|cv4AnN$g)(iE(Hg4@TLtzCU92zIHqbg9k^LmxqT4-v9y#gt z=8{@8cguSXyQ6Pib0YWKtTW$V&g()DZ;ijlAH1&iEq-5qLc;iz5%p8_+2kv1_LH&$ z!F&Agu3;^l>r^m_KuGbd$l^ua??lBqEF1CjbapuI<7o8mlKnwHy8FBQ!MlC8*~4NZ z`eX}y+u`2!+P_i+edqQ0!{Z}79;SGmWAZz;4C!QDBApJ{xsON1Qvy1j@__!sO5Ad}3 zwUEnx34gG8PQB~@{iy5%K9~XXSBs+0QG|ms`?)Q=F|yx?r=`@4#3t+7#m+%J(K>RuXX1x42nb&949;80Ps4B<%atQWlp2N8VLplnFTHogN&*#>to*1Afb&CV1ntzMz&I>4vV?9i}ZJnimI$*iH;wR!8-?|thhyvMpPA4jGR@SCG4#|ED+ zgR^;if}b$czn3NLHQ6(OMcLE6>o(14fHq=$e2Q20d*A%I?qP>CI2Y}4z_;;&)(7n% z`-ry}`nhuZA9G{+75_zjZo9d9wwKa#GW*N-Uh_YG^=Ep+aKV%z@lmG-c(waq#<`m0 zUvhcnU@r~k{0s#ic5n~bUf3u1{zc_bUcGT1xj4bub|Jf@!C*P#d}lelGcCVO9SZ-D zjZ|}uCV%rDJQvPW%t97(skPBQ+|;!{o`3Y3At%tAScy?&6*@ec&hl1u2a#2FaEX=r z7c2g4{6XqW`Vq>j%3(N>S?L#>%A{`yPrww%Yn8D%-bPpR-s19Thr!Q?VJAE!4u+B8`AX7qH9qh0d@G#1IG~B=#HWavnW5tBSj+MjafLYEFrsKy>FMn)dQQyEH^ms*p`i3V%S#(C{Ox}fi za0)&)w_U)*MH7Z1&Yd()#lKX%w6x+V_8TS+q%el`h*(!E$|5_SI16fz7dPtnxPyi# zRmW-TYxskfd=KRRpco%ql*zZL-vZ!CU{B>a9JP$>!aPR{4gRD0hKoLy;`fnHj|)aW za#!PLdwat_K7(BmJdghN8F&7~8#MM;UVj;X(Ciss!vS69z$WWo#AM?Fw{hH@$&YxI z)VJHB|A5uG?KqmEx#NA+r+KQ=3wRyo$#EgqBe zvNonn?x~qioR?*zE&5yTpk9AHe^53<&I`UF=S5#g`iS%=_(7)q(;k12IRzcz!(w#K z?=kPlrrTC*I^vME_f>;?fGOSVaCj2y9{FRsXkV?P-^Cx)7&qfQh`t-Pd5r}dY?c_O zj19QvJ;f$-R(7>ndYqT_aPMvpnpZaf4!RZwWGK^9QxhASP6{7+&65=)frd_;)a`-jXiS#ZnQ*c<%h@V|Tu+@6Nt!-_zr6G{$*6 zFn8?*_zLYJ9PrtO1KsD0UKpAFB(UHm~!Q(%KT5Bsk%zR}2zxA6C94=?jTW^fE#!KAKE*l<|x?F`s< zW_E0%Eh-M9dj^*RUwc+|&rZ2u-|SegvRV^|Z3U<8`Ca@$&OAPB9n$*-8=T{dQkHgQ z@v*W?nLu)w9fl(7Ta59auV?nv6^vT2X0W@KPU`}xTvc%`)}#(vd3PH$&wcv1dDXf#0uialNj>zhxufRzXCB_TanVhoHsOCv1iW>hO=Shm?tJJI>y?o+N|g4 z=GEEN6TPW_(@0HcwccRDC?>vZ2Rv|r9wi$O%sI4N66pGJza^4*Zrsb z!PK5Ou!))@{$!^!aZ=~ftsN;}?N05UTC=}PH22H)YI2Kb(uLtY2%iprnzmvFj;E~- zHeOb5rd+KZ@`(d~V}s&L<(Jw1G*li`b1nR#Dx+(z*F5!#`C>F-FVYcBmuW3~${l>CRN?T<6-wDZ;}0eVzJ<7jF@LeErPHjT@*T&w zmfuiZ2wgGyz90R8#yVcwPA{vG@&RV9&oREUB;klW_iSe3bg6xemWkEHSC^0IZ(Ez7 zk9}b~WJU40dLH2nuCMLP@Jwvo-Kvm`_BZynQS2WsPS_6Ad~0C6Z2@@lPxynK+;Ruz z8aTEaO^3evNUx`0Y0LXMvAwqk%S$>_B@diM*>vb!ZSulCLFJ$wz^J4zVfG@PzYiHU z=W$_Se7@V&nUJSwKFgn+^GWj@I<(HMt1FGc^^^ErXZ#rqwdG(hPN!{S`mk%!V-p{w z_RiPo<%6p~=MQEp%lr8FSikTf{atBGzPK#+b>N9jK>il$H^Mr>H;wOtMDxL8)d+ME zeA6ux+nHC&cUR@nTWTZ4gOo46&mZgs5hcmY+_k~cR1SlGxE&zF%oE=E-k+4~_%pHh)e0q|9C9H!d)U4168#a_?Fl$A;vS{Adh# z`6F(D<`DiKXK*ExXY(J=%_CgduFi$B+0uZFh3pXYp@s{|!r+|Hhln%yg#QTFi`m-k z+@Dvsv)v}LmHo84fpZ$&_*YT*f$2Zv4~_=W$8v7>O#6~;VwLe5_Y;jGO-UXmSNslo zUSH9eUV3&h)y+mY$g9px-%&YL|5TfbtEBf$+ZbDv9}Xutjwy!YW)|oc2=1UPxJ*!% z^JpG#AMZ`uiRGf`ZbnXpZRk9h1^$dbcnE|twa_Z>0V^G~E!W<}YD1IJyk?cnDNk0{ z>^&l!yBYuDZkqixc{Tl?$3M6jLj^=E_1AS7OwjOAz1RGIq0;WqKUv+fn{+wQK#2%>5PScCM-5=w}!m6+t^g=%q ze~>wr_3qQ9{C|{5^VRuzTLGgTkUFd@}FL!tavZ z+RTqyZ@J7mrL~Hrx#S<<59-HFUi9C)JRdjoMDw?>!6BSM&j$y-9hv1acKDx!KdAhC zY6sRF_9~jUxl}H#b>t?Q>Q=Ux(>J}jk@->n=2W{l{?9WS4tgU10`hFU;IS z)xOtE9{IdJXOe|1(9^Agr?KAh9m=Zwt6zC-^KJ+8ef{3A5}(m}ruI@h{SE%0@b1?| z{-mGri{F;%BjVi29#Ir0ko_23TG_QthB!}>Z)~EhuO4p8S}R=5<3Ff8zn3)L&6xN0 z3%~jdZLD@S^QI#^HYsn=Pnkzv zeVjX9zcx?Ib8lRj*Zio;po{!*M)?@u+#x?Y3+Q*1Ppj(-R*u=jC|XKBoXue{!4ob# z%M2?{3Y&akP_+`@#vkZ z;*hO&*a22(KIS+$v|G~8dYHInU_GC4oFB~}^yX6PS>seZRJ93Z076dnr_Dh$G}tD3 zE;?l)umkKGC-f}G;>BRI=u0CKtZgQo16(JMJyLp=ZC?95-AKbBeB(Diia$txHNHJR zUdF@wY!&sj&NE^y#1+Gfe8I~BlO^wPrG(pnjo4{4%fwlNe`jB5kJthHO<2RgGuW;G1{oUd8{U_Q1T9@CZBhsX-T~+4yAJ~z;}7!pJ^r9#aDkEKo0+{dihqwksCf^bJbg*yw?A=u ziiJbHx9R(`zc<{J&1-ZAjSghKer~3-;8oLS8~$n9kBxd%@vyWs&;9CO^gnS={v&UY zb~Sic5w1_{w2a*bk&*>b~iSV*6UzR0eRHcO2z%*Zowf7!wGO`Kk*;^ z{I2PLd{_DWGyb6ZXuY+F)mGVkaff9S8;I61rKI5xQl>P07<-@igZU16Xs#K*ny)`D zCetoo(jJ0&9~&+)`10jvYe#*iYvL`FKVfVs6R*-vR|b`1bA7L`w~gJZ6e>kZ$Kdv~ zngz{JvBeK7H^2tf2mX8hV0tls^9PTQygQqf6P06dzMgL%_#CJl<=^EGYOTp?&%yf1 znx~jVlp8y5m^Kjqw+_DP=bo_IbQ9xPAd|mLc*r_y;Wrgx%AZEJcB(R%EIYfpb2ubg z&r7nNI49#@5Pz^RRSdV>;IW=vV|)4s^?EB-NB9-}ia%)lUMNJ;oJHZ_Jjk>92>f8- z{qZXLx^QK8jQMo8jKOem18WoJWNf?*?8=4J!?pu<-9~F|c%iB3o;pLBI?}%5KPT}A z*~9;*_=C^(V(DZe^P|%UCU?of?jC!Px6)?5rB_J<>UC*vV{{yRp;EBOdPZ9~w~D9j zN=($1{qnO&ckFsO-Y)3tD@u9$S&#Q2yiH0Q$m#2?HIs-1T+EVE}c zXN%aPc7$(6pKk4F2Y9EeQ)YCrSR>{Y#dxiTvXA{Te%dbc=R|%gObz~3V&=MwzVl3D z8=7RuLl@puo9D!f10Vbo{-9#yfnR|QHNXtuK0eX-B(9m8UXS2m&9jBaPIKsHjz;FX zFz;RJet6018>QvUk=DI;(Wdk>V@E$V>&!QGtq;;aZp>$+k;eWtnNGu*>SPPc!KD=- za&saZ+hbr%6NA#l-k&MprzDf?f;nn{|IBmebQ)kk@EZRnf3SJ($^PO4uYe;EI4GW3 zc2Fe7R=ss!`Qsn_LB=?FjZ{WH#t?Rv`&@un3nb=L|15dF-i+gVHp z)7lk3B+fkf><534X;=GL{6x@=XT8=M+;U^*q#eo+XYtY0t&FcBIH&D&YupNN6LVru z-#f${#P909BH@GbTuX2F=qw`RTHM!*^e){cEtD-xQI_`nLC=0r#t6r=Xv=MU-(?aT68@$6ujU)`>Yam|`oUGD14t*gs| ztF_jb)j1qao-Wz{l7wy6xfpwMR}b9VVE<6Qv-me;GW{DEA^hXh!#?lN?L_<9bV9S^ zWxp=uf*b!89nny68%X^;@dwE|=R-A`uUR2zDkQj@;WsnI>gqfX2LF1-OU-dHR__g` z9e;4s=@9|0pS=8C{-9#H85_ZeodCPe+ZOnKRObGRYp+OypD)?q4gQ6^dpn5OJ0#g>m=EBrWeU}7KL13 zJ%~D6G#>YZtotSWL43YcE9QE)!Ta%j|IZ#@pKpY>>rM%+pUrXAiG=Nq3gegJz`@VUPiKAcy5 z$46OG=Rz-f2qfLF|J|pI4a4R9;0yk`Z_z#sj{60_n$);DnsR>9 z80Xw14UR11>TmJ~h2tS?`YZn6C)?rg=J`L|)Zh3OchD<}`5(*~-v<0M+*8)+6!1Ul zR8RPwT+)fot<`A$Q2yY5$nXDl8_dA&K4d@U@_Z%q%$zfguZmv%{1>)g*Dao3w^ zWW(1Q@~>(SjgRTN6pCJrZJBeH`jr{?zN%@aZ)p+DE2iSu(`Kud)is@5m@9pK=%asV zeb%FRgxIqAyyjHai}e0LY!)YdYYp$MaMP)jvS$n_(P3oO9!;*(xwcbIZ?mIA^fuVgTmG2zvjhZFk_YR zFqm9h&gxdiR;_%|25`=V&l)U+c#0|ME0&v1yU)Da0<$4TS-M;z-c(+GC5%l55Vlkcd_>x#W!eiqq`~y+vP+_8`^KAp@9_)ygQgs^@fge{5`;%Vj5rJ4CRiYR zHR-(?eyoYJ2QE;KZ|^lXlYb0br|oV~aTwP%xJS}Nl^$%IJ|;X7&Z=p<&)h*h|3Umg zwSwo9f-fFZ|G7jT(VPS3>fHJsCWSt3i+tK)FskyTbVyE#)4sg78|7Z*dbzHW=TqW% zk`^g;V0bWN_-ua02s(@!6Ynwde*6LaK?;$!y8Lf^QG&kd)f!=2k2|*Fx6-eqLFj_# zJBT7OzGs;1yOGfrTlEe*H8yH|#oM`3c0X;^O3lM+zB)?t8Dd-X+$=r6FaDr>)-*Qo zEn)4LR=42z;F@-vagj&+Shy>Fe>I0sS57B)%?vhId`R{kjBw!R>lX2x$Jf?AHA8O+ zv)RTkEZbX`SWCZ)KPdaDnQO6uqV;-ToxJf3x7Mj=?k(n0o4%g9b>XZo#?iS2cd)v9 z^wH#8gP&F4qR!xXflWOn=vA0KoPF_;TEk&URKG9&pt0k!KaJ+)ahZ9f1aVA<~vjnad-7ov-_-2Vi8p*-QnW-Eq5BMI~yLf9A`r5h+o(l&0P5ePk zx~$pi0J}xYF=GL&{kjBO2#2&$v98U$h3;rco4$uzfot?ct1}utI{{+l-sykfqi~nN zTUPLy7+-MM)`gv$DS)qkPy9jU%}>9o9;4tp#_vd)yX94EyBSW~R(Z54?{3>AvG^K% zHhOEV(L^k?HMhadVhwz<&TJVg*tcxB!|R6dBd}w5s+kDBClEV?+5X`8gY+j#672VBE*-FdqMMmHu+x@rk2UQ68RNIEewntKvB4ZGsZ+=F`I?6m0|F{j`riLbKkc)->mQB4|?Z|X$+-KTfEYC(v*jI z#ZD?-npa2lYVaCl&r}*uMpabbz-B9~@%t$p+5sdf`06wEE9=o^`HaN_*)bD&Nd48= zOf>YqBmSV;gMYznHxb(wOS7oMddIoK9@ibX&+OBu$=x(|ZtjB1>uS-NtPUrq;Xf}I z$!j}-7CrNo+pEL<153|LA8rDFlzq=_t!vlsj6Y~>O!D)UPpK~=or&7HfmsTl|FFIB>Fx+Me!%a5e1am{npDk>C zf5spDs`!J)!|f5sndTf=oIyNMj!4z}R?QkuT9318O{e26CY zU*->zKg;M$7<`jVv$n%IM|y3&Yhu zOE3A~;I-m2XdW;=@4kzRk3{B4uoA;nJ7I%=z*W0F-4QW_J5H{c3d;~@$+uta3HE1ys8MWGe2^DFqMwa~6mO8pss@XO*4 z8eT1R-ZlNnXL&qUqj9ee#)Tom7nsgY;87F$lWB_!Z9zHUkFvAB+siN1a zC5SJW*rOeA8MI=5#vlCF_=6PYl15YhGbZ)%91X~h)$Lb$+i8DuI}k(kyuW5I;DhJF zD*iL^2kBEugAKm1O_kyO-0)&^tK}nn$aXiw**+K84PuGYzLnVzQa=xWkhYi;I8dWO z*9Ttfz0|n8Kiw;SMdy3#yv4_oa~XC><~@8qq7kr2W2%wwM=VR);xm4Z zo-koTt_H+8Vs^ z5fwqt--&NiMfwi5adEA9-BleVgVt*gXWEk6<{}Rtb^6IilooT8sJ*XMS4&nfTsyhp|`zr|kB;*4wRQ-5E10|P{-mKc`$-K1>X zX3jG2$yap4XWse!y|Q@sUUmQ0ng1X8gI-?ME~;zw8}EAcJ!_*r{l2MwP^3?p`BW7X zbJL@&uSEmbCxQP^uO z>O40nu4c8+W|xSaZcaXo4KCu^#AgzpEp@76-xf{-)+VkO9I@}?4{CW%|7lYkB`eee%$S3)+(|N~{ z|Gr}9`Fp}g&W~~S)a=uzVql144BY7;{YM;C`qK_vQ02)}p6}uhQVgv%S>wB=xzo41 z&jC6WQ!QRGKKpHHp~C$#{Mm5koa{Ygy<$37chdTnFBmc5jinej$zoC*vsdB3yH zEbpnqtqPrR(@2LI|FlwLs*VQn9(R5w1%k&k8@P>W*)>?#|^rZA{ z{6X3L49*$#zw8od|rqJjIQ70axGty|9zI=BpWP z_nf@2K;chgVnb3UI8EvG_Ph9l-r2#}q2tThactHI=LT-mPR(k^bp}w=zF9~5Ru?UX z)5!^>$>TbWxdBe(&S{ToU^rmya3b9f+K>@!q=Pjv*uZb$XMP`lkTVecR^QY|eAO8F z*E&&uwCrefo2_-ut2Hr&#a~W$CaEwSXAFvwemAmpj*o%$T$iTAq3kf`$+vVaGw1?f zUjeIykJ$vTV!e67(fZ%w4{rY=e^B-Su(MD*yoz~oi>2utu3jIfK-ym&Pp;)QJg*#F z;nHM!t1m$};LBiYD{#&Q_+V!>iRB|z z(CO7QhdgELxW2@kZ{rV2=Z3X#JiWr3OcN)Rc*@3~&Bj-zo}Wx-)!ZN|osauvIro){ zIo2wp`H7)_AgmT_@JuXQM4z2XA>QB2I6Dak(wY6`=cqm0=cF?@du(GPkNRTUOXb>1 zX#T^WV1e(-oyWkyv7h)pNn7+U@CVJA-RK$knxKQb`_95Qi8(7y?Cf|AUPp5}i?y*V zT(8dP5@MaX+70ZBnHgAAi*=B(uqVFho;}EU?zAKIoAX5T5^*x--*4j&8ZGRkFOV(f zsWkQ{Q6Jt&zS*oaFCDs*M!9;K&5lF%Eveb;+O38x>JmLk)|%AbN1$3K2@iah4R)Pe zVS38$H;2rjc+U=#cf~0DHvS;_VZKuPr@iy5d}e~4PMy~`JpP$4nr5Ahru@b9ypbPZ zw|x@xvHa|W7W-8r5=M__xQ~GiI&pL$hd=l}^Kxb<9^h5 zb&sqc=gYF*UT3Uey>1<}B_a!tDGPr@IR-Q;CIIT0Mrz#bo1l)%;841W7z>qH8vTr!UYw||p&g6rMPw+pnQ zKMjA7>Qy=FWiVN;U-Tb&E|4%iV!paxrnh)oedtKuPlI0SGPst{g;wfk;}33=h2UEU z@;x?8+qgZ}!1a~=%Wd4h+>eD>^i*&X@CU=Ey_5Wz_=BlJkzmMZ7reDN#UXt6tqi*F z3=sPf2&UDqc6jv_O2HFKQ~QAL{?qUW=~j~%8Z7UzZ5rX#r_|5v7Vj}k(B^Di%5OV7 zXJodXz9zQopM*ciI5+s`cZ*O5f2Fw5>4eWk zd?4&z!fx_K;+mxmhXhTt@8b`e_E4Tl_!USKRkrs{FhN^jgZKH`l~B@-x7O!JISNlr zcHb442RPb{Sc<|tgi)Coc(SPq*Qq^IbLr~wS%V>nr{pE^s6Hp7@u@n1JLA@~e2*A; z=shVGmx*r{PGk2d+x58>-EO2$?6bN>wDHtwr0e~a%%!&Gu{6YLyJdBq9 zqcLI1>GO5YvHaDUtA62ljq#?uVUv#IGY-Gea0>IpvCQe7eB!as8_h_#FK|)aGJMoH zc5bu|KjY4yc!QLgdilcmgJ%DyF(5mMxV6zRI&%H1lgD?Req@6yq0I?5B&5Dh3`p9) z+<7Ezd@^Ppx6N=nRn9&<$sJrO#T^7+UZE5Ffj7T#=g*JApl!xkxqW_w1B3E5b!^N7 zr)9{MuHfAD#-qMOFWb91{xt-!O%BDF^(5>2$St+U1<| z`Dg>id7k>!bAN#`l3LV56L@Xd7WP3meF}ngh?6$CuJ-xKwV%xn9yj^ry)M?F@8J(J zR~hV|GO%X&{O4v1+Zr*}%$NY9O-u7u`jGL;&FLp%z2tbuarT@z9b(lfEW6<%Re$mbT<<8@ri zr==}Bn6?_%h3}(TEgY>5lkT#bx9rJH{K3HY@dt&|MSaBWLo3)176(S?u%9w}&UkZM zFP-Ye%YA-}O<13ez7<#*>&kupv`-;711D1B6Q1p96^JAU!KKzAaX&Ra)z$_JRICea zQ9V5ooeRA5b@2zKX&JJ*;AH-0adatl2sF*awd*=|IQmSF>zhUHoDKxpYt(IiKXgbu zW0zEbHGfxNJb?2qAR9!OmlBJI9cWU{)?@W-pea}Rw)le^a%OzBjgK-uw@F{LHw}%d zt?nplr90(oW?V~kqPu9;p4ZUmrr7)8sy5En&a2@hkiD?4eB3g_9w#DNZF#BzbO9T zd%UqHv1kMQG>q@DIa3+``5-ZIRKBin7SFTZF%;Iydt!}-Wzgw}z$Q}8;+Y*Z@0PR~ z80XsK@Rc}wH-i^y&Qp57{)IpIMezq;{faZM@qK5^E7O`wxb&1Hzj^$<78*pYaF3EdF5jHUG(H+SI?s0(qxe zP22E7b{^I7op{u$cW@7QoEi2i_@hv+N9OsQ#`A-|bvaxLspL7Z4W9zn=yAVI{uzJp z+u{$Jei2NT$FYhlsAm1#g4ZBB&)#Y651Ddwi1=DrUB>={bKWC@CH`Yz7KA?-{#p2g z)+;8|bdD|OH4en#l#eCns)+6}Mjo4H{E^v2W2-QgIM~fi9cxiR5nZm zzL@D#HjqRL5=gQ;*6<&WlyPwoptc&*qbT# zJZ^b$)-280UCywYZofoH$W5O!L5N@*CCO zEQlI*gh%qMxL~q{8NL~h;_fK@v;0BDu2t1q)VB{^NBK6n>FN?~yA${Q@N!6tbe!s_4TuJtS3gdd~`}cDE_WIq=eiDB$Y?0_A+<(fw=Agp~W}-Np$iuaS=9;8m z@*jKT2*)z5%~(Z^K|S~m)+9x+8*>6)Q{z#v8+b(E3n~|%_>Sbnr}sUMqqty# z-;n=L{^pzDRn(nRJgTwaie-g+44U~D_y?6n{3Gt;QF_qO!#*tYs*H>DS;qy}bK*bU4EAElv z6$(ZpoG-cl5AX*Mb=Bv;acjjkk&Qm4)vv|ud1J@9PxyD`UJF)faCUQ)q9Z3095$O= zoZ^=ko}lRD>!f}kb?k_N=enGKGk=h-fyfY3yWs zZ@|@*IzW_#G&^(pOb-7kt6y@9O06T&gWx67*KBYwQ@Cn^*Z#@*llX(-`dTr#v!pGHSe&V<+lSM;LtxQ?7_e*|;&n%yx-`JQc|2lPbV zFNmG!2R+!}hJsK3GyFldCXhK*$x_g3_4bOsOg|?-s7LKVvswj*f_o?Ue;2$q*WBfj zu^`A*s0TL%ikP=%<>xWKIs+df!yNsM>1X6u^-kc<{~&)*E0Etw);XFsTvXs%B zZ0(M*VY#Q^gKO%2`BfMa{ zyWCUB1*~ejuDepJvps9u*DajYAXW?UCaD{?nK*+*d$sDe;7<6A9kQR2TF_-R#>+VW z-_D=OA5{Aum3xGmaD%(b*X)lKpVTRubj$k*9%@w z3x80He2=x6zmHE}e!Aht|5A#&f zBtPdq53adq?XsaZ5Zu*0n1XPszRqD>a&@Yc_X=N6xMJYfd=|Wu`@rY#^w<0B|6G4C z^rh#)KALW^N*uxsduTQ;y_wUS1JK@Ax9w_nlsJv#vEF>{(qL(+;JDe2bgQggUHn1& zmd)?NgB0Eu4o7mP0vlSuALO(BXZVBIA9F_{Hn~5U&sclNS_nQW9Qjx+u}d$qugbEc zQ)95%tJZl>`I{xjXwLMC^SX5(<;lC91Iv+klNm$O>#}XS_^0trSF`X3Pb!b4*<&6I zR@6|;H0zp!M<{Vz3|cjPrCZ=JU*`o}9KT{mJvw zrTm;YgElBrpOs|#m;Z=qHRh}GNx%dRa3FMN3sK{Vmf+5Of=!JqaB9emWLgrOYu=oK{`; zSW9N@*u%HuBlv@j^nOxF>}y4Gjb>xt&hK9LkB@7*ti|v4V)EFhx31wF;fWrp*LQM; z>C=Nu1Ki^zzS&$jCea+>%uBtO&|k#bA@f^ZVb#_@`0pV56Y;wcvzxA5dUt(ub5Bn{ zpw6veQTssr?asD4UMc=yWxE{e%LV*FdvtWypTZy1mE3T<4~G~l78s80P;ypsDA{vbD(K2?Yf(^qg0a1JnL;;qOhL2RqM7Va83AXnX7hdy+= zPCCXlzJovL)$fx^>0|hVvcJO5VmstB*h{zKKn~_X;nng&&V@ssgYyD>@H*KQFPCKg zik;sl*V4!E2a!WRYytn$toa0Yl7sc^(CkRQTmjT1ckaFr3ye{wYRA0z@!W~u=P!Ny@AvM1`J}>a_+WV7Wo@hW8VU=MeG0g* z#3rx?*L31XUd4)j=q2W|r>R^H+mGQ7(jE@tDJ1SSd@4C=d6v|zI{Pfar)16}|1^)g zE|oHN1AJYvAu}(zt-8d-e*%9{+750YZIu{FOJZCk#wSxm7ZNX$h;x0sES8S>3NfPd zBvlUZ{lvfmZSl+F_xcR}pxXPY{v`Wx_I}jM(ODnnt94_w%GMrR_;b>3sna*u`QUwel!g2Jo{%+kr+`M6d9FL{X;SZ`Y>75I*ua!>^ zaLzft(J`?KHe6b`5h~xY-$gegcXz!Ig-lEU@w?=3Bfr{l*%`whY{y&4#Mxfk+Bt7( zw{42LY~AEv=MN5B_rjuBom?4nR>BJs9KYMVmhUnqamu_PkK)+D#~b#mUSklGT#&vY zSb0ujbioRRzZ`2igIoE~OM)BB;gt0bevod1(+Drha;VX_dd1qt**Y^;XurjI{5Ad{ zK4if=k2f!!%vTGoGd^a)xOeNpR(OiUyUD!9d_nA+nm<$wVt(IkTxmZ!vsG^CGJN3- z*p9?p49>l$vtE&NH;BDX1;e}TT5wUxr>8iC)Pe&)VspB3?R1O0sdd-Lw|)YDFxH(X zC3jxsRLEV*leXpbUwO|vwTxPStaK9Q0Z=hh1YX4}=k3gs+|3eaL9S+ENAlzs9p7Ad zIdIH}scT}N&-UEG3qFh7^F-{vOJ{`hN3K-rtnKm7p&x2RhWK#{4D_$@2P;H}h<^9Z z_(WdQ_H;Q;ZC5J_7>`@qZim_m^sTaVFp1Ac7fgGr&Wb#mQdidyu2gxOU2V!WJmg!Ctp8@h~1PIk=6m0ph_FPc7CF%(D#vgJDVdbK46Kn@Hfp)ESe5pfG}-zC3jihe|HZIZdJ9>-Dnoamf-JNHpAvfJnO z9*~3@2jajpo&I0u4^lIMxu<^LmH1u8K6^n-L5X;6Fh_XB+%I_qi-*Gto_#9R^kVh0 zUMxp&`;E#V-I%=ll*D-|-Sit?`r^E@Uh&nCngzl^cZvO3bw+l((O$laMt`@?tXwlS zzZcW^MO*k7{~~{Iw`nHf-gHA1nDoaf2&v6l1Rd z2mdR7@aNPY40Ry$d4gDK)u-q`YL6~`jQSI@{<6?nBJr|Y%xyLp?Is1j`2+*FApm~< z|D8Yh)9Mc@KAOyjvR)D!P&OjE;81Hv*1~nI*D8kG!BVXp?Dwp5754EGUHldP;6GJ= zP(O&zr>yP!C2Fai!EExZbI!zLsBWeDlso)<{vZYtE5z%zQ%c{1;Tg;}Kp%^ew{O9R zltbCb=ko`dBjz3aB69zw#%O7u0=MPW9sHKQ6&3yvA&r<6Wu7@=PSR?AbzobUS62Fm(SCBOeZI}1SSN#6` zqw9Zk?I-aEX@NRK4#9N3aGkH~8ay=aH#HTgnK*q=$5Q!9L`EWsdw~pTZwhQfR`Z z<(bIAy%*V#0o&H$o(}I7bH83ap2ZINyv!6e`BL~(GT=I3grCA6eCy+D+*P*1z5~BR zrQUb%?wGbKA0xT%I^^^*;D-oSD7j6^H~Jy`LDko#7O)ts%+ZXoC?jqytd~;&`|xZq zoN5|QBOKJm0<4y?w@RO)R+)Eelb;s3;0y|1P2~Yg$+b$zi=5*_`xEY<{O#xQ2eIcm z^Kys}#t!{VIbNSUyc~Wp+Uk?{)TkEtJ^Wrp{CaDA_Wp4F9N>rVRuq4VoS*nj-}tl2 zliE|Y7o`s2KgAzp96|@7UEn5(mCG4&?Shjlj%JaZq2RRe8x@uS7u7Fb*Q?Q?b4%u% z$z*o7s=WDwrtmJ{!F=%t$L9NUKj08jBh&8=HrdXue6F7o+M^V%5oDYxXx3e?zKSUW z?x@B4xL4KT!I}BWer0}sACezR4Oj>DIh7Og?%L!BRyptZ9Cbyd-lpO+&fwE^Cb{F* zxDOT}J$aC`JICJc;)&jbKRB3!tE(}9T3P=Te~|SJrV*~~GO^6)KwVMBqQUyD z17ZM#mucg}#?BWHms&Vg6PyOjrbI24T0_+zgg@9xlD{i=bk6yst@wk5nfqtlLHXOy z;}0@69hMRsgYPh-&D%$KPQqIr&&Z?5eT92nRCysAzBw3eo*p(F%)w~rV+(x94*lso zcf5UfogH_CKS)27b(a|2KgS=mWQ`<0nMlbZi8_uszj%XV{sPBn!i^VsjO@l6 z-1fc^EYI%xPL9z$Tsttq$=2Ve$8ri*;h5=$Yt-6;>HTB%2Wh(+b1|-VeZ^cM`4j0w zV1v^3&8joMZ;RCVAeXM^N&QXNu_tV5u_xxphsa{y1sB9eN3A=_Eh>3L?X$@>>!0Ee zV&iJ%dbV})T&;VSH+XJv)Bu8fq%X{iyPz68}C1cKPc-#?0oV_ zl8;ktJ4c+`d?xi??br2?sT7oB$03IWc>tKxZzr%#__urF45-6791_Rz0sKK#XA~Ds ztv!WrwQ{Jbf-E^4erT8G!j5!`%}ZIBbZL(NM6;ThsxBoAcBi~R`xpl(UM)X*nV z99zBV^4NY1V#F_~n#Qb2Qstwwx>V!kU0}~{_d%?G8%%1CVm?i*%B$iL5p3k-WQb8JbYA9u>6PL~r<6ZLhChh^Q$K`r#nGwnw`<`*p23^% z@X!PJInm$`s&yCZNLdpfox&~H519w=!mT0aD@RoLgM#16dYJRv+X?Ogj&lb?aG(qU z4ss<5{6V#jdix(dlQ^vXrv9#V=YZKteK@e^2=E87eer8iMv-~`MNWl%L)75!7kBJK zWZ-24_=7Tr9TKTk*OXYrqhIQk!I{CE=~{aPLW)T62Q68DX^E42#%J|{D|i-tJit0b z5u(B$#J($WFA0B;_%TQG_mdKOAZ|(elRBcoA5{HHBlc`dtwHfc;9HULD?HwQmamte z{3!PEOODUc&@X*_jxMAnzx44-AOG)nAf{>;$mc=~O0W<8AY2DIB-g7}ND@ym=LH%O(q^1Fyxb%)*#)_(nxjFcth+#KC_EfADL~ zM0{mT54nUY)}r6+r0(vC_yt3F2;@7x;%}@H(?BghU+@}oL#mv!AHyGf+cb6|9gDS8 zB|cp|2ZE)Ys{Y_6{`aA0QtZprU;e;s!vX7VR>|XIdqW8C=)`^^3on zTyZ{p8tFrD2#qT_Y&~!?qeS|s%59hPT(i~sApW5EbiTz=jnm1JUQDK68#dcVqapCosVnd`RKl zJ*W4=?pQlNBv2F%l;kn3fkAx;e^5k_F&CZa_(u1yju-5Fa!<;95NkMt^$<)PJYhE) zw=UPs+8BbP4X=e>>awF2)~E0XEj4MRv6Eaip}{GaT3*600`IW9R`cRs;WZ}$W6-r0 zOUE%tqUbpW&R_h%31WLchChgXlnouf`+ogAQNs?WtzaPCj+L6_GNWmEzixoZ>eJcs z*mCVN{EyN+p%sYVM~+Y752`MurHj>m-z}1>)+c|RU+rA-Ic;#uu7<77cJn-ree*b; zJoFAYv+&p-8e)=!OG*Ke$!J1aY~@?P<1 z^=>YF+I*R~490@{7Tk98Is8H42`dhro;xnfvv#uY?tJn!SE*rZR(#VQcV|caQJ4m! zWnsKrty_0!dyhdW;{|DnV<0B$FVr9WS^Pm2A0xRqF?jN9Gj3_ES^KzNdB=JpGw7!h zuin)wKMK}qmwR>*I$b(%UEZhSAU=jasA7&~eWmstnqH;`EIcozq_S2Lxnhh3)T$kt z_qNEPx%>R(>DM++sb_x>e=yt+sx_9xDXQ@c-DJ|TC!yKGTTS@>PTQ_mn||uZ81=?I zz@oqkG5x<%fADAV2WdC>F>5PotFU(G4C58WA1%w3wuCcL<2cJYMe+ro5n=-`hunJ9 zA@qjgcn1ji*ZG6AQV#HQF%fl!vEl4>CBB-POIka7?H90VazWB$a6w53D5qc`pTZwx zAN!U;^rGT4M6fTJRN{l!y>Ot0M=5*%E{EVTfYsiNnDufL+D`$ zW-Hx^|J>o{^9MyQ3GI?{2eUi8d9e=#HzUC7OAc)0_ z8PB4@AJiGjJma##pRM-qnnf-kwGW<#^N!S2vp%0c$T|dmbLJV&iSId6^dj{V(M?qN zgW~7)?dh79ch#Cjt;cvJFNpM=u502 z!A4|0DbuH9Jtk4#YCZOzGr#6e^(gDK-(UZuYd?uUXvuf~?htN{tWDnQlVF&jo~z0~ zp*5rFtY+mT| zRQE#t2KSXFypQko5Vrrfzws7X!~5p;z`aet6(%NABhF9Wh)$#(a{MP(k9dD-BCZ{OuUSy}2<;TPsPJWn^?*vB!XHEq4(UoVUc+tXbv~E595(9DkO?SBflEu)?P44*c4BMMAGFd`PLk_6ht!#!cGJ9If(l#&nDNgU%ZN z2%JptC{OAr`W2~HG$p_25S+QbdXA2*W~14fUQ?gLA8a!ht9?1Xo_d1xabRk~VFphd zNX}Z}Delse=Z-!$e7OTJS2+|e#eLp2($ml34+^K5{LR>e)P^XXGbFJC{}Zm4-(*Z; zJTi9F!7{1Q8SBhi&&GOnYY`tVHP9xX!yi=Z73PqFtaG&XtU!*EE;@*HJP$6UXO9E( zn5M4f;JP&vwHmd(6vin&UGgP<3V%@T?_|6ZJ|y`s*Ruon9oud)N8~z=haOA~+`I{{ z_AG6>2D!C^&e_eqZo9PhG5kU0uL}LU)p&nTK1=4g)C4Xkc5YN=k0Y@#tD-Z=(dRDy z%ZyiCGv3kE`Y)0C9R8sA3{~EO+;(-H%N&6{%N$W$b*_6zYo@cCWt>9NYh9nz=u4Ym zP$$`(XxcRSG5kUCAu@L)wWapl`tSrz{J2Kf9oU)7vD`5igM+hs=C8fvwK8q!#=m6S)~jQWFu*MvSbR*Q{QhFr9|Z#NmUa(!wCcRV9!1x7OG+qwSup=Z|JT>IX4^0z^+ zf^KG?!ylA=YJohV^(tc!xIsqiHAmFBY^)m>YcXgZb+_nIqchpuy>S09$5d?O8lFDz!_gQnO}UPU3f8zDnr_9Ku~>_=AiC z)L{K35oPbxzELG%%5 z$Jw)*q}_l9=pj78L;wd%oDrx$DE_p-n658{JuMFV6P!DNI#Cb2&dBfw#Six&HOrY? zmK*q8-{}K9EyQ)Az#r5SPO(ls18jkQgboB(<2k%LqQj%ZA8e4e`AA+- z`W0iBJ~HE@7%#C4L4ZYEV3NKF^laW`am<0;14o)z#9}Fm-wi8CWpe+B!)w- zN8|V<$7kv3mp*>!AUV znMfp8Fprj&s3#Ji!ylA(3$7O8-pp;X&sD-m+(pbEYJ15uqg(ZOrB+``POp>W-N6SX z?;7#$AHpBB!uk^7TrECp!E?Cz>z;xS)z@R`E(8Vi;t*vKH{xO@tK zP{EpDgyJ_)eT?T?UiwgLRz6Y}t^jsGUOuq2-3@<`PYk??pDQKYDQd{sl55l=UnF@! z$j@mA_9OMb#Aly^%LZRePRW(`N2lKf8=}_OU=ANq@>NOR#%9g;{Ji9P!k5Nxj|;w? zO5faOp_g2#{w3SUiHi!SV*<)?|eA6k^_%A zejBUFoLp{ll*n1TA?lYAU>;{?;nW+XmWp%Vdo21XAG`DnaE1} zUTEt4?IZYuw4Z+T)=wGVqNQo}`sq{W2b@#5oFjBQ$1i8hCC4VY6;tbOW!Fg!zz0Y5 zPvH-W4%F~uF;0;WQO7Q>?p!#7;0NHEeuw;OFT=OZ9{s#cExuHyGEH5Jt+HR-v_FSG zNWVJBI4kuE+Ob^O?Y{=O0=eSw-5O2L?0^kQ{k~L_8cccWrY`KP4_~SWUUkP${UP-S z!3~($uyHlsrdOFA{FHSQ+W;FpVHa0;kTLOFo45Ya!x_gIwkNJSFE#q`$$bca(2{s* z4jvIEe(w)le`kY*#IO&OF>qBa~9R8r-=2M9~jP3I}^*!K~ z7hmWhXPxsM&)Ib-{AOk!n^&TB9a)~SA@^x(8I%5aXcs<)Kd9D##EUUby}UWRX697C zS|_(-gF$=Kx_gdhCy(xu}zM?SC5;1ANDz-|i3N%~o2e3Bfg$Pr`S zh_&qQ_33zx*dcd(x`R}zR4+UktH7u3;L_)bAGFA``yu>6;cK&2uf+Qeah!dX}{V>mBBkDj?Btvnd3G! zdyGc2Wwz|u*ocr-~icvGY&i59(^I%d$k~bBU9dI7@Qn=#~~^ zlbdpUJ&mrUHYyR-7gN@hj=4WLLH-UQWcM-rLFrRgJA)pW&XEUwaKxz7AhFX~*S9W= zuW95eOtY~}H+7|6T;PBU(ychb6Fz}IC~a0J^Ev%Q*DZ-9mxE5j84L@19;k1-6|~?O zwmkr=U7Y1P+^Ems4}SG4OLU=P?BBe>u&=RgT_c+|$;_!m#xAfVn3^M8HN*-zU-Eb< z#>*AUZLB7pm`$bl0LrN*#i+eF}e2*#osJx&JDLN#fYqvkRXA zgK>+MSgKNQK7%y#IAJBC3uPCAc?#$2Q}~0@e^~R$I!idVV(V(`k|!C>^Pa{y)70Q_ zq6BF-lr@n0fBwRbgF$VdUeeYx395j8%xfi|2Fa_4B`dElXi>!AuZM};3 z*`v50U;OmgvClgOj$5ju<#poz#O^~*vG^py{>TM2ZtKjO zxy-FRe14idhC{pfn-VdrkW=5UE~+-D52|+aOnt%kb;o4B z`=0M1@kfUY9g2U%Vo9T<2|B(}YV;j>O`~O==kKbf2lZiPo|HFHqnGQfVc-=@N@~d=A}9-n)}uF&WtA=%e_9^zXMEaO9=?h~4+K=T6&+lE~@WK5ec~ z@;~CY9#a$Ugg?cc_~2Cv2NP^coiE|BNnAOYm7LU^`t5IESTD}6zsaN2k;BL2o$!N$ z+4)s)B2Mqsl)5&`2Q_%*{i5GLY+{*AWtr108Q*E3{IjI3-wxIVZ#!3GsMKfC(*4C{ z;CiEmJ22z^j&^%KexCPlD*wB1r>f-2`V9UcdSFbgBbcn&=}(q$l{4hSO0e+;i}F)_ zu&G9P-*0{2G~^oGNQr|_VMAb1 zUO@cg!UMvesdOjx(D)tiHiX+(4r@5(y3)T{55{!sn=aJ&DzE5AVZA)&yK;Ovb&6wr z?G5HaiFGH}u4*HBEq$}=^4*)x(Y_Uo9QvpUuQTMUQtMCZ75ajmtOd^k3l%y4?38+X zxy)^weT-Wf_vAF5_rf^t?3z`ln9IQX<2$I0R-~^XAHUO@ws$?jopej;8NUyi-xy;# zS*Ma?iKoX+H%b4*21Y5kz+i+i@>%AVVcYD%I(wb98qZFv{-plk!1Q-(?r9eu1vUDL zHe5sDOqyM=V!zQ5bscAl4NZTkq<4&k&U{X*&w!mnY?Ds{%Xv?*e8V|P{%juW=Wl)Q|W_m+CMPw@9 zscCehJ_s22_-)HJZ3oBtVg12s1FWL9fXBOh#&Ur{lCVKAa0ZL+HGjLWpSIC%l-Gx@ zN19e2nNu~VXmoWYgTnjYlAr@{44E5b3^4CSgE$4j{%QA!zTua=olW0joB}VO2!F8S zljo;34D8LuEtTp^l6qzIOr>+Jr1rVNi@GhxTYq-ByU+ha{lQ%Q)jy?HZO@uLI+vgn zxBMVKaqS`bohEFq(v#aRpR6Vllx%I>(6fw@jZUM?S|gz*yHF6>2dVK3c@lbWu063Q z>;Y`hUcr|#;13#exo5XRH&dw{*uu5I2silSzzBWvjQaPfYsZ`G?7Ug2jf5X67#Dj1 z1`b(Y{@Dpe9HTB8r2XWkJGT8&n(y6E5Bm-z44>^gPxI|I6KF9?BWUZEB9vV8;d%4u;eqG z%$DbQ8a*p1z#IyL7?Mr9f6dv>e`jzM-5wq9c zo_++U_Joa^z1!AZ=oWeH+|!8s!O2c?)dp`~`1W}cJ6PgBjgf;8Y!{AHkf(M|ZRYOD zXwbk&q;k(Ke#{JQ2V5H$@qmwEesFddJynbrbr|xJh ze{rstTD=kTgBmdb!K{5E8{%??!Yw2gzD51f{K(svh(!s6$2tmz z=}E{vgp(^AL|&`w2KQg&l-!t-@62|nj~VBCkRRO~d#2r=7fpNp8hfRD55MeU(r!Es zYkmek^ZI!_#>7ve_Cs2NJjY;ZIp*rzoLtED*FeV5-MHQGrZ;!4-wSK4IrWPC2JH*vdg|o)abf0$*AaF0UP+HWiw-y^ z^szj8!sgMBl7~Lv`wLbbjX zY;>PhmyelE-qdnqT5sKVas2Mo6ZOx?k!P+1_f+`^8PMEqi>lo`ZZLF!uDP4P&~)V|?P-@GN~tWLtUm*}{J(aTLIQndxdd z+xXt8Ft~X+zFhoa@?9(hGFonQC@nITx~!AY2{jWt)w5fC)+SqmHFDK)Yk6IDZr$sy z6nhlY*nDXvV~9^)VKDV^uy0ZGwbpnJoPukVYQ9-&xMsemP9xoQ{CG#5yPz%h>J;zI zNAX_w47nd?>NEzcr^of(z3JHT7Pyzm_*gj?%r#lQYt^%tmBD4%X-rP}k-N$q=kfAV zV;q3XDQg+=@8PH>=a}fIl`LGS@!WX2?jD}$pNKAw$zJHLC~KR&K$@=@LG#pJP1Z(YMVy8iv>mf|O8m_9vrj>Jun2ZMep zBB}K(3g5GH1hXySkeyhX(5L>J$&h7k~tMr`xVcQFMsRfWB7xDZF2uYd5}x#yXsK=iD#iq(hoj> zKltC|Af^F-`$g0-UaoT@fInQot>yUYTRdem!okw15DSb^rfSE$`0?C{-{ZU7`SkEl zCogfH406W_smITa$cc9BU9cXy9PzIxelhlJ-W;GR0ZJrBpN&)^TLc8d&x z1IWJwes-y^y%ie|Wm5uv_qO?ja+#X+ayv4T=fn2>0y%fpYlKkq zy;eRSwzKxEbH+906jfeAu!|4j58~HVSc1r+!7(cL$@#X$Q?=7{i%l;&u+rK5sds!p zQ)~N%U^fOhlyEDkG4(0+2W6iteMjQq%7P7&kJ_|e*UjNFZXNq>;Y6FwCUx$>w_f;o zB)2GX*hb$IY~f@0gGvwVrO3yAuxdy|uBA-T+daVo1haeL2Nhlp97pdaIbQMoHmhK^ z;5$;=@^kouI=Qq%o)>Wq#A3}B58~O$N93>J;*7`m;PB~F-;11zoaiLB+O7uHt)KOg z=`;9)#Ef7U>=C4MDc!_w{p2bzR|_!0JlGHZMZsvR@H(3Xv5)m?H1A%IjaD+*`568n zjn|crN({O{6w|it4vqo2IKk(AY+2oZ=~H6Y_^hjC>KbM4yISpG*GeD59~3`>_+r$) zEu+uf_WFP%*{O(ru-=B{{Gxi|Qr&lHL0nH z4B$)E!PRXz)!Oo|ur#TKH5C2_ScS14ImG~c&~J&^AEcA{Q@wu%A?E(}?e**`rU2jn?bG5b z1Zx9Pz#9 zccX_vZsu9{w}V(P-6DU1x;yke!TnKoy*je65L(858`Rs4hNK4E#_IULHJYBC+Hu7j|6$J zCNLQAi$6R|=^nW3fIdplx!_Vm{I2;m*qwaGs#<3l;y&-4E_sDY))Y)-+nKF`ojuy- zid+0uq5{#c=tkmL!Kij?xQ`|7ed69fYF*GX-2xxnHPhG4)$1gmra$ZnKD*-mtg$l5 z$6%6G*o5GHLCdCwoM1=NmLu3P{!Z|;Qv4gfrm!?#%Qbb{!It(iu<#k`=z-OaLm7J9 z)4OS21hH!m;MbavHTCH|OmKhcN80VTAgH7z^doUt_~wvf9N zGP_l$noEtAeVD`bOMZ5%C5{RDtk~eNbJLs1lD>KAWU#LZR=ZH`622{*&%i#L{O&~A zl3=-eaB(>SW7H|n6=ogZfGt{lrwRTfoL8`}5_$y}^_}%`lRI{r9m~#}^j|PTbHAEo zD)&QAcj@od<#QmIfW$sy=VjRBqYPscb4AV!21oCl#{!$_FM(s17GOi<*c5&BWDJA<&e#&fPn*}cIk>H8Z?$#m zorD*R4Dw$hwSMW;rjaA=eXBTWz~JR*Q+gftqi!zPdyX9w!|ROr;vwu zrNQdauNJ@uGxJArNPNJg5kE8^yL`;s$J_MjC)nx${1p3S9^qcn$1;UULi#iLO~SQ4 z_lSLq;C3fo*as zH)UM*ep>xO_V)ax0ZUbSZ$ByORu%-UVR-uaJf!h6UIBn z-gI2MB+C=`Rhkyu(z$=FCbEgbdHRH7n5s;UiIU)gao3@Y2!DUPzziSMe7G95?Ts9n zPNA0B858%J9oI*ykJCr^ZW%`zgX$8eAcw?w$0}#Hx6d_>%g1h}tLtsiv)H%1U2rJ& zOH(>RMs0HU>+SNkMFQd55j&&PcKMu9%PiT~=G~xmaAo;@lVDVBwc1eTRKM-ve$eYc{E+Blm|>ZkU{3ujA!y z0VrTTTvoOFzIGA}B^ZXBF@+tJde0CCah~mYb}ILgzNOkCeF>f>aR$<-h$T=bf0r0V zxu$8QIJE&N=S=*?(g)AwlAHz2dQkUScy~hi83H576KOu;eB%$6ANAFF5Vt28{}dZ( z|0I8qdscz7f^4czgVePWf63W5Sht4bnZkh1+kn_Efk4juCn~rLHpO#57a*O*%NUQ2 zm-C}mEZl3?^ez6(T+heCbu!D{CRgKDTNQ5cLH2fD@%N*8eLatI=SkA&HdZyobCr-Z z^&59r@Kc5B@W^jhL?5~(YatEJ5O&Pmt^88z{)?Wt-QflLfr>|tdA`d!-@WlUbr7CV za))WwKpcYIeBo*e$N3cgAWgNV(sxx(XZD0?-&hi>lE4qA<}7Xeu=C$!_>x5)l{_T1 z`~dzSQplVt|52Sw*+^3OL}6Yy;!45w;G`Cm9MbL(OH(hyYeV{%aOeVOuq@)clle&O zP`-;XyIhy~oBLFb<;Kfp^Lp)$GTrzh`|7RM_Ttogy&e+Vr@jn>lm4VI&k1X{&HJ+B zPnlHZd%hjvSo`f|Xy1hta!8zp;+Z4E);A9hHl7e{(vkHy$Jbc(^{B3?ek^vwSUkjX z{w@CCApvhl>4E>?p&Bj$zx{{UyBZ_EBo>Sm-EdzMGPkPByhe@kJf>T6{+s+k)gs!0 z&0Fm>ed-kW?JKXPZAw5mEWgE(tGDx?l0ja42!9Z~pT@k`F$rq)S%<*4h|ye1Ba!WW z@8A0PcJ19iKZZZ3?3`M=Oxd(C>F+gw_yX}U%Jft3wTo)L`tO?_zAm9h=4%$@;>%;$ zV<2ZP4f`rwS6LH$oyx}~>$&f)iOL!8Il}j;ueH?o@ShqZTmq_W#eCu>bi6t zna?Hum0Z;J;Y1t*`*#U3%ZRU0)1$#3WR6sE`)ZFH_!ky_+gsS5xK9z`59%7cUp1%8 z8W=9B=)-TH(Ia*vxfNwT5PeDi5gl=eK0l2=D0`N0Z6a%3ID;4bFT}xx`%hW7(>GO} zN9n}afb`=JQI#thbwiIndj2!f)H zrN}4aN>uoRDldkNS=a*dP~-JU9ZO%0Q=$hEF&g|q>VCX!89Ahu+TE?o-dr2CE3>HZ z2br&!>uB^r>{*NZ{xmq`rq|tS2Hqh)xrp!w)qGC(vFKauV_!wfxos=rAFYEM;OmVD ze~@(nz5&T6gE|;`odP(;H74~G5?{8L(;^;HJUx!(i>!7nO4YvD0Qgg=OB zFy_h}jU0*CHkX)^3lcd}V1V#Uqrx8)Ip8U9$Xu=MUWIjFN?zUEIOL{Agg?ldO4){B zI`pf%+i3bG7>TN9nd(G^KNzk%ShJ&xW~2TBAHXlFv$r)HkAk5`hCg_aJi>G?{@JhR zGcdB`P|RiT{jS!W6_gJv68u5gkI|oWa1dwEmDnEm|F%B97mLf6k&g_2P}Yfuez`u? z*5Liaz(_vGT^?Vp^wBf}AwDwvLD5GdJ#8n6g&{|<|0G_asyP(8D^{nq$nXbc%mu%L zvpRKmrwZvLZhrB_xNCH7ZZ?Pte~__O;$*Oo1a&MA^?eSQ*Ei7(xg(5JKPvn|=~VE2 z>0DwbTHbyw&9gHr%-f!6jF;u8@CWfD=(;7_C5clcf2FZ~o}9~y*NCY6ozdVAe)DC) zwL1uB@BsF)lw6!DUgMkpllOfzfAB|gpcL`teLR2gM{>OVpdZg4{E-}DCCKvm{6X0V z%JE<913x?OhyZ`^2XY``H28ymE{E87B>00ru#d>_2gNj$|5JE_TjmboqA~}nYx2hk z9lzxGEM@)D$1i>S9e3bYzxq4w>i_ti>;suEh|ehn=H(Iib#}Re>y%YY8S@DK-}ijN zbK)!oCsB)lkKzxi`ib}&XuWUu;Xh6#wuHtn)8rt*M;GS)5qUnDKd4)@@PIyuB^CTX zFqbxX4tv>fLXQl8kQiO|7t(C7T8p@=?Likk;J==^G6UY%PSLN39zN!X>aJi_*7#02??ki$?-*VKitLOIq^1#we z174Wahl>V(Q1C&RK$uAgLTkir%i^Kr3U_Xqa*p7@7r-HLi|C-UBT5d+S!@H8Jm+Y zDp$Qy&Y4U}chOfA_=EH+#;S}~JSRGiH!D$x41L6EqkD%UwYPR;_=9EEQmhe23#l92 zV2ql_;e581&thwqP30oPAGD|yfgGEcKBH32*0(Ff@5W}&LA8({9|lq352`gHa*%(u z=-C~KQ;IW(OKx`aRY+wb!ygpmfY%mBmSeAfad)!|xS-@{Cy#fo6&?Pd#IPnLshf7| zU!Kd%wmxZHJIm~B2X8VH9sXch=0Q!j*bkbI*RxpgL?)TyImnwD8UCP(R|2!m_{8mc zcKs^j7qOSjj~VJuM1(&mIXk7@hXnaarsu$*){^k?6kaR)D~S_`0Dn;W4{}JXH}zMD z$!H%`jGtUrvdAzH0sbKCbrsV&cH^T60EdCJt(9tHj&ZKkdGb`3(6 zctkh67W-D5TSSWre^AX8aD%Dcg>LYlsQn>=AdJf0fN0+x@3@)YuJC#6h=GAMz`w~K z4DFopR`M{tgBwI2;%Aip#Tg0yAeaICLB)L(Ii#PF*hA@p`;2VSs6VK%4tTX-2D;?X zkhZI_xIoSi$s->T{@|Nuz`9E12Iu~xgTAbH!|_V>tqAZ3MGi~WBnPDla=2g;vR+S+ z$4G2f?C10OgW}hvq4cZ1O%4LZJ5X(>#)xjoUleyU3iSu+N9e;|o+Yn=*av$-HP*&O z4@eRb{-9b9Qj>w&k0B34#xJpx(PFiZ41bXJVhdoLj{sfpiaDKi{N}mC_ns3!RwU{V zGS{g|&$Fk)xWcB&+L*FgfqxnVyD>b-i0}uo2eAwI^QYBX^DDLKiW;J2d~xvZs81G^ z`h%8?v05oG>XUKnQe3SXaAG6REpU?2-b`RYn`57dyC>WvYTM^+8s`*+oJio9Vr3>UcU1KY$NicZP zx6E!-_=AjBa^QnoUJrTQAm=ps{Bn}}xcBJiBEuhK#wf_x`|=ua&qpMI@~M|+Hm;jf zzSXcEx)qiBgHm^w!eFjz`$q9bokjAmrkdkLKUj8SMs)atKp)g{zV@|QV2|lv%KS-`9Y$S2t)_1-i!{1QF z##4Q%3w(Fy<*4unWvr68zI&m*9;e%NICmcT0N~kHr!MnIWcY(J?h=#X+ZT6|>2KL@ zq({qScDZU;g>kzO8U7&LN954lATgFPmc5|VI6y}{Eo&v+5`R_%>JQ4Yo&5%WQT9=? z7Z<;eJg5VCBnKP^e3y^r5B^9FL=fNf$MXk&B*$AHAI~5BksQ*ekmcj~gFli3e>+a! z&*u;RNDkBy3I5;@jzQ($B`?|Rwd+=>_lR$iyqpo?4>AsAJb$`G4Y3%w`6j!g zsLV_9_927R9E?c)LAujBwuE{PiNx7i-O)h03{6S)5m_OEDpSga;WbGG1k)!XHEqsavwGO{d9OJ1f{= zAG>JMr<(V|JQ)@KAYA7>^<+yA==RN=- zeC+~uVU6#)zRIp6!ylv;WWqNK_M@;aW8aLoIl*uS>ui>a)VX40_=9TPtv?)(`hVVy z8jO<1GS+-~%|gC<=thP=$OMR;AJ6&gi}H!cA+>{J#Ksu4`{oso41drf|B7!tE46LP z7?+!82e{L$N)CEzNshbG;SW-y$ZoefDa(|#J7;#1X;kJ9Z%`at%gFEtDR9VoSL%Jx z!(=Z7hr67~>K3oSaU;VYq;@;@;jkYhzXA21C@qQv)HXpbOT}A8qW+-dAYvc&)Ky%Z zij5O_(1X;#6WL^M9s&N~A(IPi@iRz2q9zV|L6L*kc{qhUm)B9?4>F${+l@~D3hzCf zFO~C0>_y2VxlN+LAH;ukP@F+A3=Z186eVP-SEw#TgFh(i-KlWAfY4~S8n;yYsf#5# zi3)#E_JbCjS{ZZu$Rhk3YKg0w>vSyqb5Y!0WQ=_rN*lm{#~wdLG&QUTOZ$^zw_OGO8r56yLV+4s&5HT zO%CF%R9YAqVN-;}60cL?4V%fzn9;7<1Hayj_;vs&=%n?OFdMH zZF_%?pW#s0hw3}LS9Bt_t2k49P+mubKZuV3I~QA!*gcg)ikEUD>pJzTSt~|^KdAU! z=urF(qC4qNtQYwYU5gI6rbnRupyc|Xt*AoAUc@+9GCpz2e1e^;{{Q*>L42YYB?nze zFBi~>*qq4K)^v+!5#bL8_SAmM!CVdh^h+Mm2X-#Xi2{ERIlwqod=fek`xaZ_H6}7@ zjrLLD4|?`vrCAJ4;IpBDsGI=l&GRaGIolHJ?%VLCJim>ft}prTxQ0JFCEP-MkMbUT zclfn^&nI_ea|HK-yo*gRxh~ioxfuWK^lZMXDZkV4JsaGp2@eRaocEI2Zt~e8zdHoK zD2F*VbKTM;GiN-F(dKUlJZF3*D8VYI{h-eCNjte9M=I@>oSf0%4+eJqsDs%u#;P%@ za_%pj-MkHd0uJODUBtkqV(=n!;5%#Xla259I%_qaomTys-K_?uzgu%pyYTg5ZQ&{4 zAFc?u%D1KNpTYP1*(u-O?QJ{HOSQIz|08P$>E0alZR@UApIcvi=X@7jK=@9F-oRCR zKJ54FV7#KvxiV*LqEEis)jTj$20rU?VCMK-H28z8cV%zR4S;`V71H=cUHX&Qz|c3a zg^2J6sVlk*=Wc2qm$mZ#H9Da?blt4_N{`Xt50VRqyj^uo$38O0ZTaO%Ulv|!tRj4` zsPG2^^We(5mJMuXzN&P|(I?|+kNz})KNyQj{Xu+J)Shq0*;HsR&+L1)F=Tv+J=~e! zy6h6V6%GDiu-C*VT9_<6na}7;G5S<)IBI1c%U7%u75*Uk+EvZRb8qxy4wdn~!eevU z$*v|VqYxGTAeg}m8`qwm)U0J}8k`ubQqAY~WfV@2N>uoRKJ^T+fx@A;x?mP#-w+$O zSzA?2>LWj*!XK1;2F&MLW~^n6>Y;z=%^t-2$UHa+?A#I5F1AicE5>ZLw?O)I8!WmTlU9~5S1bihW5^Y-VL zHw;{#@0MfPO^sAPQGEq}=l75AKm1S*c^|TTI)Ctoa^N!+kMGOhlS4H;d=w+k{L`S$*O#f@5<<= zaF6f0%O~z@y;v{QGSFU{>948Xe-zYL82<*9W2O(i5f%O*zFqV{e5;%S|C4{7IAm>=ZLINUMX3HD`moC4A7LM! zkysh(85A3Vu?Dlu;aeP!Jv#+AuPHhFz#SETZM9tutXn_p;}dQRZWVIe#v^d7E_Ivm z<=r~L?gc(7c;$aPd5>q~7jK$(Hx-{WkHu?m9lvdpzT-7>j+dhrl(EA1kMG&+_=8u= zGpqG!dmy;1#9w^3x02TgA+gh7An*sruVS<8n=x`+N}aoC)F0F=sfj8!A+Z;29sc0X z-}&IlbMEa8|7b+`gT%rxHZgag4;fl}qboY>(U(kkM#vG3`h(0DQgekv@&{+KhjnKW z?BEzt^A24Yk>L+2pQucES~7jCXWg9v)+|^xxl;X9Au{|yi5+8{Wt@sFGS_Kf$GSnW zD|qej-mk`@!XHEr#N#Hkq_xx-r@}gxes@j^+hXgQ+3QwB>JLiHBE#-v@$3@&(1eQ$ zFEV9XY0X`AQ_aZKA4DNBt(`yivUiz}z;3YZ=5Uowwx*9)bm|Xc=Q{CwPY)iax0Z1h z4*jd)c;iL^94A8jL2#Rbc5r4saTtwYaAOWM;0nLG&%O~I{-E$yu#e2K-zvrW%}ehV zBUX$xQ+G@ZRwFw6L1Ig+HZ{=UOE5M`JmP3^ZO)$+%Q#)ik>L+A?5h19kJL3F&Xt3B zMdlN=_SFx}^A^vU^Nm_&$-Xx42Cb75#7~ZWUxDG=j)hGo4Tdv0XOoBVF?&20v-_&$ z9BP%sA)ZVgCdKsrtS9!dtA40uQ-^aWyPp(OcFfaFeY#JU59y0P>^r`*^^Nluv}pI- zr+2QsupdULO@9HqB>%LugXT$_)Eb0%Gjx!_m9F#mBJtwL5Y`Tt>4Y_kaPAbpi|>dA ze^Ay|YA+~VO7@0rd=4TDMx)~1Wp7@F^wsV;rnCCOaDqJmSg;rT3*dzp!NM<3`i?Gp z02u=%PEgj;;rDZ&WPii)ejP7w3)yjdK3rC{`@VJxf=Lhz_klYU%{~L6B*?E+M~#RJp%ke>L;o;m$`o;GiP{D zk%jyj+&|U7KED1SP5;pm5&qzh#E44$!9SM+zg!gfgMTgr79O4YgFg}_{QH})CirbQ z9&=g6I(!Cy@c$x26!?Qbltayhyz8wG^?rH&jw$#Q{@@Sg_Pz2$ig}Vb8o}`G z{d@dD<vs5%;d&Ro7qwrNzwz_= zgR=J%eW*k9Kz(X?&YG7POL-QN`h#k0l886q8H?W?-W^*=G5i?*QV}u={6QI8v1w^` zXb&QX+V|4_#cCH7{-D}8!6!lv#k-T&x}_zy*{3D(`kayA531Ua2odhfZ^HzOGSe}DED5sEF=*ws;0poTvBtX0e=u2XWWhoe~`f`^gA#vVeI4=T~W_6l?O)! z3o+0~H28zzf<$0{?1FfJH-E5zEED{r@FD$@x08B`W6o}8(t0-59p4Iq)-bR)8@E)d zFQ0xbqh~6eYbCYM4PNKo?s)6ZE_e6oKKkAGpPk+=SAX?Ssa4yvW{=J#D8(&5$WL5* zIKmf%Ln%GE?efWLBC%hu8aJ@ZDs5_X8s!^(NC4XK5DQlrXIs}T#UH$cm|7DIo&2@J z(J_rVm`Lqb=w>Rl10lk#W8iOy8_v%H{|+DZK6UMQbDfm43vC6jL50=my@dL5>vtVdZ z;SZu4=Dog_;Dqbd@!{MBMl*Te?%Z~L#aI>%{-D?f{W%FfI0)=6b}ihy=GaQt@2l0T z7Zv`XhF@LQP$#G3(Vrv^qe5QJ)-qdJPqV4W@CU^{^aK3CK{L(RG-TdjEmG|~b}^$k zKGdSZAC&P>KO~a-%?$I%St<@d^{uXXFJvRbAJipR7wg-M?iPzDs@FP$Cu=LgIw$n8 z$nXbc%zYo=Q!LuSN+!!edEU`GMyzi|g+HiSTJ4=f<{j6^dJFi8IiLNATEjIf8Xxkzy8G^{QVvI_4?Nx_;m+<-GN_s;Qz1g z06qqeU;IJ8OHCcK9^wnam8#a^^BCmOf_Kri@C`TBX~4DmI^~+m{V4B`)$whR%WXX5 zb1AQAnC>7|cida~(Yq0pdVHGAV@}84DQlzDf{<%LE<2`?Ia;aKHF2?X1NXc! z^+%zad=yfeV1swJs{j6c6q>Qe)=YSXQ^MWl8jHtjFl(=DKd4dfi6C*?0Uu0{gHo?~ z-<~to_^z;8tpxLv+E%UBtPlvVOX1A?AI68vlVAKn@+0knAifNY#TX29;~AxnGdNdW zJKb`MPEDPIpziqTrfd9v?On;1>PmJkd*Fe;!hlG6B#;2nsR4-|btpjsbpx+juBrW_ z9{O{^oDlI>1mP|5N)uObh6?y@^z>|ih zox7e59MxIHVtu*Y%pX}X4ARWJ(q;#3i$xONnC%<9|Y#`7Hd{Jb3?N* zgdK9>7T{LkxONfC0NAlp7)=Y9_&U!E;K*gA?T_jfXXG4WWE3s14gMV_F4Sm64N zJkaxbv@X2v_R>?Tefj;k+pnNeE)KQk*kavz;&Y+f$oYfsZv!iRNOmuk!sS)2x9h#o zzRSYBF|>lZB%GsxkS6Fh;q~|-DSj*}`>Uv&Z<1X}dP>U?t@Perk5*`R%C5Lim>$gw z8+F-pbiagg|6!Oeyv{h-$IhngyFcgZLgR*AN7&p}&L7N;C_gS_w_mNu)8MRYHG8XH zTDBpZCrcjrwrs!Km-CI)_5QlPjQmxtax~@2VLX`5&WRYL1+M62!MrFh2ImeMji)T} zgaW+B^4^L3>)2c+^o3DyqQN7IF6cPdD3|CTvvoYh`Gdk>IEY7wP!n9Mm0xPBN@xuS zp`djx*0@FWT{-mMEl0d4!{$ZkH$rG%Zmm{!nnR0)Xq8AoT3EQY7q{FfNGlUL+T9Pw z4*F3v^^JIrXXFAYK>VvdkTRAIY;*n~4r4HS!AT`9=~{K-E%ZgBa6E{h?Rpgs^+<6V zv9Re!;i?xYS~n6ly<2$b-Ec2)4G+*D-L!AvP?oDxH8HxlZil#Zu*4uGpY%mRhAqc@ zkP<2{O#ihkpZ)f69lKrj#_W4z?X_eYwq5~_ZR#&OsRaEKM`(AhLSMdxEA`!Ki-9t0 z`PR6>sxWIn)3)Z+-qZ8?{Gg?|-rrWy;ld6o+&+P`n=)Q4m7K_ zPrcM%{0;QmIe)OZPTUYi9L-B1ozRZrKUG@yLY4wNWT+^_nYPm0D;_vl*}l0!&zI#m z-yYb3LwWd_v-Rx}^=SvCW9gIEK~`V=%@vQjni!2IB_ zr1(E$_i=vU>0c_Z*gx~Z{+8CCx#j#p>cdmt9jUJ6(J}Y0^-Pif? zTGAfi+)!cp;`~9(X(w$t_?neGN{TIo^tY>t(|{`J4N&|(?+e`v(!Rj4izR7fkl!iA zn>c{9Bn}kuhVb{V!rGj213CG~BibU)AN(9&iuvbQzt&kUm`)0LRaVL|PKqZrU5LMF zmO7!Ve+WH6dcl8kx0oge?Mvs^v#`%Zo>;rY`GXAagKi|loG>0kV=};`RB(EL|9z^t zOj>8a4e(m76F!K!!h{K|30E92-9&BDeLz1kK40?y!_}*%Hm*|6Xe@#0kzfpzc#gy= zc@>st&L4!%9ZqLW(ylPe|@X`iW{)1M;8b;0^>>wWs#W>GyIL1Z7Y*B&BGLOFtco-Dl z->V(?xOG~$b30zEt@M(N?})pQI1@SPcUoEYz2W~6jC;17OApX|q0`pZE z*A@86W*M#Ek65Yf+u+d^!h516Dm0tNk8G|bPOUQxr}L^w^T#-UFgR_)T#_`5!R{!I z*UW0|?^|iz$WH5>=4+92Ua8}l)!ppAqKa*E*S;FtdtfvIZ>egIx}D9u?hzO-aCqb( zE7WZ!VJ<_7JrWn0Fkr%im%zVP=cB&DG!y7m%8H+88Eb<%f6y0;T!1oPrzP+$9X&S07k}UVa2*cJ; zhDh>M5_~p}{2JGxvA5Uw+iS^^^8Ew-A?FYN-}n!HpAGDRoO1r)|Be6PAIS&j4-Pt* zuZ?RqhRbkllE$Zcz3QfV&37|>b~>()&TF{d`_g~|MpBs}-w{J~!c7T=XefJcBwfJfjTF9JUM%A7yQ`Gdrb0=Cd0zb)Va zj5j$b`tY`4yvRBDe4+-NK+N6A#GN0jt-yb3z+ql5Zrf|{!})On5Z2872N6%;T{^HY z5x#oBSzN-^p!cW4FNm}b{|a*^-1$dMMOn`B?J&=`D*O)D;67qZOrFCB5M0WR2298( zG%Pqs0>yh{27^hNV2jeWBDJ9G*% z&Ptu`Ys*Ty(WQ1Y%?o)}nvYwrK^L&=Jaq6?JiKQYH@Vh1(=kph?P&WDY0bCpWwZ=W zvm1`prF-05=`@FiWjQul&dZ|YaR0$VEqOqC2yNKNEJWgzf?sL~24cBq7z{W<#1s0f zDm53-b=AOe1wRS+TVW7q?^ts0l!H9NR6E4oOXfjdNT%J=E9cqf08iG{xzj(R{iWu& z%&p1&2f^)nD?DXSJUPZ~geGt9f?LY?bKro91!0_j5cKyjDZ-n~$0oWrdGvAGBoa(?&ID$#ts!zEg8C%(mLhMu*nC zj(B^}Lq27Bg4j20oJ*@u*qXs|UI>fBeZ5#V+TcNUM(*)&u2I_v46kZ(|3SnJZPkwQ zfwrc5!d#t2s&}>2DHeB8nG%OP?HA)j^M+|Z8D+XO%f#+9)rAT1x-;hl9=E#4JOiA3 zb(`i*_2G8ahuEDwoJ7v`?h+n|&hF8XM8!_((6ZjPHhS1~h3#H5FjtqZQ%DE*ALRan zoIl7s&T;t$&$09Y;QoW)E|CRf1e}FB_^(M~82L;#-3NG*TZs0#=5^a|}Ja``tS>M*goKU6< z-ok}q@SOinZ5444zAxN=kn;zLg9pqI6g(90E^S;?zZ^NgIG2I@57NEOl6Vf(Zz$)4 zFsv0*hDj@lcr5JR7yIEpsAj@5*JnH9fzDkj=x{vem9RH>aZ>3e!fbyLx8?qW6gc8G zpfX+@#Tk{>UzKve#v{NHqd9VvBa^Oky?T}Ik0|D!&jsX%a)Z4puUxV9?;bwC$KU*0 zd?$Ptd>F<(xc^{zEu%a!P95c?9pC4L0U^`}H||H1M&{aGW1 z`fl_bYg5oJ{b-w5T-iB5=RsMYu?I)qoT9HmV|H{BQM_3mXdC;|^b)GXhnwcOR{zZ2YQtZes1*Q@b^s+tcyFjx}u? zXWDM|wpyv1A?BH`>xeT27Gnn(H^BT~A331Bv2o~Llg1LBIYFL!6Ks@)`wv=qwk2;Z zaJt~D!|DUxayP6KuZZe{u#nel;2S-joTJz47xH(4F6U)}{eg?fzywh@Fw z;C-f!?rrCw>A7=6Oy}SQfMeHpJ2=J(tDQq@7V#BGd8t>MtaA^TJYj)(v<()zyWIA5_xM<6Qg@L{yB)mJ zV*d!KTxbLw??He*C3P*i{~+Px(qdoe3;4ha$L&FEPezr*S92jyXLlc1x3_;wy=gW1 zsI(ooGgh%4?DURtT`lbW<1NE6iyWX@z~8&bQx|%|Ny&#Kjm~^WxZ(Xcn@_b#FU$4y z#67*m?0yPuUzPh09`d5O!90U4G-jb=s%{fq8Q-;}mx_{->(UrlA>oCKRBX`9O^wTbHnuL^ zReERzTVb%rjWh1I=w7QV+fKiR)?`4y2r)% zoliX2Z_0Cg72_Y=e~@`gVmycDM*6Hzg>mUow=0{jG40<|qYFK5U|bA?BF#ja{6IRL z45TWUb|S`*%5kAG?!T-P_sj?PA3U^x3AUlp*@*ceZHhhbw7uT@46k zOpVjMOo4$^klvz)>2aqA`P6;H|8<-rEuZuA&DlX?65N0A66cpoRu3($6IgF`KODb# z!mxIh)8uRoisL$tty(=an)eXr20I^!8_dp=@?0r#HJmY%x7D=jKXIXF@IP|&Z8B(# zoBI#OSz#i&PHHqgV3ox4MmzLemh!Y^n}pb71?^Qx@kiHyf#`UOc#&l}buQ;GVgDJI z`SK#);1S>v;1S>v;1T$P5h%y3Ie(Dz2RVQ61Hbt(NW%RGx&I*N4<3m-%=v@a4cNS_ zUDI(QEBlD?nnZYnasD9pALRVOWx9Nf-n*NdQV;6jypji~F}qbKz#W>LKgj(DIe)Ns zOx@bVYF_Kd`)vvTO5v7C4V)+7CUgEE_a6iK+Rr=)NQe~PAH2;$3 zD}#$sdQ{LnOc9mw0PK5hwwPSK+)IG3U<}zKPr9(+{)5x4v6m~6r(D1zf)qgMIY)fB zTw2^q93;6elzZYDi@px$559PS)VHI42j>sIjwH-Gp=pd|;r@fntC96j37+^Z z4kSGft{lc(xc?yM4?<&dJu3Pa@RW4UAN=e=$o&U7e~@`2y4taQ-Kb;EAN=A+$o&Uz z7;B@6`ek8L0?1c!TCJLuf%jOw0~bcSIvE$@oVe4_G8DJu*?8;CTSLXiJWe%$uN$-w z;qk`!Gm)LT0`x_fKfN~6v#_|4k<@`bJKlpZ-a{eH+Mu|6ANYF{- z{6X$NxRLkq#?9QuU~G@n$PorOHZ1Vuxc?yM4|4y(*SH(!4`RH!PL=Zq=Z#g_sm0@K zoc6W+c;OGM;Mn5+gWP`*xG?7r{&c!<|G}RE!Z&#Ycm#L^cm)1`MS$ij(l}=2sq2pI zs!4N0Xy}wYDX=iH`P9R$`U3!zOb@=I)a|3G&f0oo)6yF4&TL%2n+>ODtM|!f+E&-m zO0=8z2~{h)j@kOYI^DF|^UZ#^+_q-=zI8XZaj;qKf~j0LC+zdsXVVAcJCM$(KLsYr z^j9$F0QUeN8Z140v1fr+3%*wQH?*YtCidN-u}sqxDzqeg9{)rCyqRuhVRw}!{Tjx8 zJ95tXgPcF;|2UXlYn(sG`GcH4$oYfN?}c_V=MN_RL}67cMoHeBq_8fdsDy+Mz(Ae~h#)|cDO{E-#IAg$eop=~6+TPJhYb4gfYTnm?JldjbR zT)&AoQK{`(R~y*&yy(xN?K?4|rCd`t75Fc1$4SF%K3wwKgjuml5ma&LYlztFqOjiA;G6tRQ6X3`SnV6T5t1EfeUnB2efb(71pJt$vCdD*6kozP5$Ixz}EE{veBuPd0uu975fz z9%*gEmxm}ESVJviO8qZr-1-&fE%p!3AH?sfuUhg$-yNVW%j6nAmP}R_Tv9C8suOR+ zY9$KCgBYHPSK&~P!fOk9s9kJ}k)m}YVbhBQr+*C(T~;jz&y5wiI#m--f{=OXn^=Ab zWX%m6uJ}x73j1HYyIxrBYl-lGTg-Z873=8JmgVF8z-I1w_(%xlN=4!?JE=6NG|%B% z``vmQ+$?PpUb1cg&&NQ}T3*-|m^QM|7o6IAdS0I&R885wu6COs^NI&?Y%|h%g}x;_ z0qN9xmhn|nnO7V&QdHmi&l)=E8<5sKOx_Nv5x?cz`)z)lKaQ7Ep2VJn_Ja!EkbVQxOx>{< zk@q0IvbpOj-mv`sY~|M;y0!Bm^}66Ae=RI8_*i@x^jS$O7hGY853k^Nh3OZ4QS#UNsr>0# z{^_~==hqXRe_?C?-7c5^^IS?3{2NHpXfPbgs)V8rOof(`Y};R!k~A2jnD%JQo|mN6 zbNO5hCttTew&d5^pNI4%!vFZofBhT&|9SYYfBN$IY(HgSTWtTo{(QOo{K3cjz23K6 z{^sY8Ui~#Me(U$YdHi~hKl+6 literal 0 HcmV?d00001 diff --git a/lab08/initramfs/dir1/f3 b/lab08/initramfs/dir1/f3 new file mode 100644 index 000000000..93ca8fc0c --- /dev/null +++ b/lab08/initramfs/dir1/f3 @@ -0,0 +1 @@ +This is f3 diff --git a/lab08/initramfs/dir1/f4 b/lab08/initramfs/dir1/f4 new file mode 100644 index 000000000..397683db2 --- /dev/null +++ b/lab08/initramfs/dir1/f4 @@ -0,0 +1 @@ +This is f4 diff --git a/lab08/initramfs/f1 b/lab08/initramfs/f1 new file mode 100644 index 000000000..5d12ba17a --- /dev/null +++ b/lab08/initramfs/f1 @@ -0,0 +1 @@ +This is f1 diff --git a/lab08/initramfs/f2 b/lab08/initramfs/f2 new file mode 100644 index 000000000..688c067f3 --- /dev/null +++ b/lab08/initramfs/f2 @@ -0,0 +1 @@ +This is f2 diff --git a/lab08/kernel/Makefile b/lab08/kernel/Makefile new file mode 100644 index 000000000..bf4e55536 --- /dev/null +++ b/lab08/kernel/Makefile @@ -0,0 +1,60 @@ +ARMGNU ?= aarch64-linux-gnu + +COPS = -Wall -ffreestanding -nostartfiles -nostdlib -g -Iinclude +ASMOPS = -Iinclude + +BUILD_DIR = build +SRC_DIR = src + +all: clean makedir kernel8.img + + +ifdef DEBUG +COPS += -DDEBUG +endif + +ifdef BUDDY_SYSTEM_DEBUG +COPS += -BUDDY_SYSTEM_DEBUG +endif + +ifdef DYNAMIC_ALLOC_DEBUG +COPS += -DYNAMIC_ALLOC_DEBUG +endif + +.PHONY: clean +clean: + rm -rf $(BUILD_DIR) *.img + +makedir: + mkdir -p $(BUILD_DIR) +$(BUILD_DIR)/%_c.o: $(SRC_DIR)/%.c + $(ARMGNU)-gcc $(COPS) -MMD -c $< -o $@ + +$(BUILD_DIR)/%_s.o: $(SRC_DIR)/%.S + $(ARMGNU)-gcc $(ASMOPS) -MMD -c $< -o $@ + + +C_FILES = $(wildcard $(SRC_DIR)/*.c) +ASM_FILES = $(wildcard $(SRC_DIR)/*.S) +OBJ_FILES = $(C_FILES:$(SRC_DIR)/%.c=$(BUILD_DIR)/%_c.o) +OBJ_FILES += $(ASM_FILES:$(SRC_DIR)/%.S=$(BUILD_DIR)/%_s.o) + +DEP_FILES = $(OBJ_FILES:%.o=%.d) +-include $(DEP_FILES) + +kernel8.img: $(OBJ_FILES) $(SRC_DIR)/linker.ld + $(ARMGNU)-ld -T $(SRC_DIR)/linker.ld -o $(BUILD_DIR)/kernel8.elf $(OBJ_FILES) + $(ARMGNU)-objcopy $(BUILD_DIR)/kernel8.elf -O binary kernel8.img + +.PHONY: run debug QEMU +run: clean makedir kernel8.img + qemu-system-aarch64 -M raspi3b -kernel kernel8.img -display none -serial null -serial stdio -initrd ../initramfs.cpio + +dump: kernel8.img + qemu-system-aarch64 -M raspi3b -kernel kernel8.img -display none -d in_asm + +gdb: clean makedir kernel8.img + qemu-system-aarch64 -M raspi3b -kernel kernel8.img -display none -serial null -serial stdio -S -s -initrd ../initramfs.cpio + +QEMU: COPS += -DQEMU +QEMU: run \ No newline at end of file diff --git a/lab08/kernel/include/alloc.h b/lab08/kernel/include/alloc.h new file mode 100644 index 000000000..ffbcbebf6 --- /dev/null +++ b/lab08/kernel/include/alloc.h @@ -0,0 +1,25 @@ +#ifndef __ALLOC_H__ +#define __ALLOC_H__ + +#include "type.h" + +void mem_init(); +void* simple_malloc(uint32_t size); + +struct frame_t; +struct free_t; +struct memory_pool_t; +struct chunk_t; + +void frame_init_with_reserve(); + +void* balloc(uint64_t size); +int bfree(void* ptr); + +void memory_pool_init(); +void* dynamic_alloc(uint64_t size); +int dfree(void* ptr); + +void memory_reserve(uint64_t start, uint64_t end, char* msg); + +#endif \ No newline at end of file diff --git a/lab08/kernel/include/bootload.h b/lab08/kernel/include/bootload.h new file mode 100644 index 000000000..a15f9b56a --- /dev/null +++ b/lab08/kernel/include/bootload.h @@ -0,0 +1,15 @@ +#ifndef __BOOTLOAD_H__ +#define __BOOTLOAD_H__ + +#define KernelAddr 0x80000 +#define BootAddr 0x60000 + +#include "type.h" + +extern uint32_t __bss_end; +extern uint32_t __bss_size; + +void reallocate(); +void load_kernel(); + +#endif diff --git a/lab08/kernel/include/cpio.h b/lab08/kernel/include/cpio.h new file mode 100644 index 000000000..4d6102060 --- /dev/null +++ b/lab08/kernel/include/cpio.h @@ -0,0 +1,42 @@ +#ifndef __CPIO_H__ +#define __CPIO_H__ + +#include "devicetree.h" + +#ifdef QEMU + #define CPIO_ADDR 0x8000000 +#else + #define CPIO_ADDR 0x20000000 +#endif + +typedef struct cpio_newc_header { + char c_magic[6]; + char c_ino[8]; + char c_mode[8]; + char c_uid[8]; + char c_gid[8]; + char c_nlink[8]; + char c_mtime[8]; + char c_filesize[8]; + char c_devmajor[8]; + char c_devminor[8]; + char c_rdevmajor[8]; + char c_rdevminor[8]; + char c_namesize[8]; + char c_check[8]; +} cpio_newc_header; + +void cpio_list(int argc, char **argv); +void cpio_cat(int argc, char **argv); +void cpio_exec(int argc, char **argv); + +#ifndef QEMU +void initramfs_callback(char* node_name, char* property_name, fdt_prop* prop); + +extern uint64_t CPIO_START_ADDR_FROM_DT; +extern uint64_t CPIO_END_ADDR_FROM_DT; +#endif + +int cpio_newc_parser(cpio_newc_header** head, char** filename, char** filedata); + +#endif \ No newline at end of file diff --git a/lab08/kernel/include/dev_framebuffer.h b/lab08/kernel/include/dev_framebuffer.h new file mode 100644 index 000000000..3ba45a40a --- /dev/null +++ b/lab08/kernel/include/dev_framebuffer.h @@ -0,0 +1,23 @@ +#ifndef _DEV_FRAMEBUFFER_H__ +#define _DEV_FRAMEBUFFER_H__ + +#include "vfs.h" + +struct framebuffer_info +{ + unsigned int width; + unsigned int height; + unsigned int pitch; + unsigned int isrgb; +}; + +#define SEEK_SET 0 + +int dev_framebuffer_register(); +int dev_framebuffer_write(struct file *file, const void *buf, size_t len); +int dev_framebuffer_read(struct file *file, void *buf, size_t len); +int dev_framebuffer_open(struct vnode *file_node, struct file **target); +int dev_framebuffer_close(struct file *file); +long dev_framebuffer_lseek64(struct file *file, long offset, int whence); + +#endif diff --git a/lab08/kernel/include/dev_uart.h b/lab08/kernel/include/dev_uart.h new file mode 100644 index 000000000..5f07be050 --- /dev/null +++ b/lab08/kernel/include/dev_uart.h @@ -0,0 +1,12 @@ +#ifndef __DEV_UART_H__ +#define __DEV_UART_H__ + +#include "vfs.h" + +int dev_uart_register(); +int dev_uart_write(struct file *file, const void *buf, size_t len); +int dev_uart_read(struct file *file, void *buf, size_t len); +int dev_uart_open(struct vnode *file_node, struct file **target); +int dev_uart_close(struct file *file); + +#endif \ No newline at end of file diff --git a/lab08/kernel/include/devicetree.h b/lab08/kernel/include/devicetree.h new file mode 100644 index 000000000..f89d11aee --- /dev/null +++ b/lab08/kernel/include/devicetree.h @@ -0,0 +1,94 @@ +#ifndef __DEVICETREE_H__ +#define __DEVICETREE_H__ + +#include "type.h" + + +/* +0x50000: devicetree blob address +*/ + +#define DTB_ADDR ((volatile uint64_t *)0x50000) + +#define FDT_BEGIN_NODE 0x01 +#define FDT_END_NODE 0x02 +#define FDT_PROP 0x03 +#define FDT_NOP 0x04 +#define FDT_END 0x09 + +/* + |-------------------| + | struct fdt_header | + |-------------------| + | free space | + |-------------------| + | memory reservation| -> list of areas in physical memory which are reserved + |-------------------| + | free space | + |-------------------| + | structure block | + |-------------------| + | free space | + |-------------------| + | strings block | + |-------------------| + | free space | + |-------------------| +*/ + +/* All the header fields are 32-bit integers, stored in big-endian format. */ +typedef struct fdt_header { + uint32_t magic; + uint32_t totalsize; // total size of DT block + uint32_t off_dt_struct; // offset to the structure block + uint32_t off_dt_strings; // offset to the strings block + uint32_t off_mem_rsvmap; // offset to the memory reservation block + uint32_t version; + uint32_t last_comp_version; + uint32_t boot_cpuid_phys; // physical address of the boot CPU + uint32_t size_dt_strings; // size of the strings block + uint32_t size_dt_struct; // size of the structure block +} fdt_header; + + +/* + Memory reservation block + Composed of sequence of tokens with data shown below. + Each token in the structure block, and thus the structure block itself, + shall be loacted at a 4-byte aligned offset from the beginning of the devicetree blob. + + Five tokens types: (32-bit big-endian integers) + 1. FDT_BEGIN_NODE (0x00000001) be followed by the node's uint name as extra data + 2. FDT_END_NODE (0x00000002) + 3. FDT_PROP (0x00000003) + 4. FDT_NOP (0x00000004) + 5. FDT_END (0x00000009) + + FDT_BEGIN_NODE -> ... -> FDT_END_NODE + + - (Optional) Any number of FDT_NOP tokens + - FDT_BEGIN_NODE + - The node’s name as a null-terminated string + - [zeroed padding bytes to align to a 4-byte boundary] + - For each property of the node + - (Optional) Any number of FDT_NOP tokens + - FDT_PROP token + * property infomation + * aligned to a 4-byte boundary +*/ + +/* + The strings block contains strings representing all the property names used in the tree. +*/ + + +/* 32-bit big-endian integers */ +typedef struct fdt_prop { + uint32_t len; // length of the property value + uint32_t nameoff; // offset into the strings block for the property name +} fdt_prop; + +void fdt_traverse(void(*callback_func)(char*, char*, fdt_prop*)); +uint32_t endian_swap(uint32_t value); + +#endif \ No newline at end of file diff --git a/lab08/kernel/include/entry.h b/lab08/kernel/include/entry.h new file mode 100644 index 000000000..872bec449 --- /dev/null +++ b/lab08/kernel/include/entry.h @@ -0,0 +1,30 @@ +#ifndef _ENTRY_H__ +#define _ENTRY_H__ + + +#define SYNC_INVALID_EL1t 0 +#define IRQ_INVALID_EL1t 1 +#define FIQ_INVALID_EL1t 2 +#define ERROR_INVALID_EL1t 3 + +#define SYNC_INVALID_EL1h 4 +#define IRQ_INVALID_EL1h 5 +#define FIQ_INVALID_EL1h 6 +#define ERROR_INVALID_EL1h 7 + +#define SYNC_INVALID_EL0_64 8 +#define IRQ_INVALID_EL0_64 9 +#define FIQ_INVALID_EL0_64 10 +#define ERROR_INVALID_EL0_64 11 + +#define SYNC_INVALID_EL0_32 12 +#define IRQ_INVALID_EL0_32 13 +#define FIQ_INVALID_EL0_32 14 +#define ERROR_INVALID_EL0_32 15 + +#define SYNC_ERROR 16 +#define SYSCALL_ERROR 17 + +#define S_X0 0 + +#endif \ No newline at end of file diff --git a/lab08/kernel/include/errno.h b/lab08/kernel/include/errno.h new file mode 100644 index 000000000..8f4fbd285 --- /dev/null +++ b/lab08/kernel/include/errno.h @@ -0,0 +1,9 @@ +#ifndef __ERRNO_H__ +#define __ERRNO_H__ + +#define RERROR -1 +#define WERROR -1 +#define CERROR -1 +#define LERROR -1 + +#endif \ No newline at end of file diff --git a/lab08/kernel/include/fork.h b/lab08/kernel/include/fork.h new file mode 100644 index 000000000..c85fc4cb1 --- /dev/null +++ b/lab08/kernel/include/fork.h @@ -0,0 +1,26 @@ +#ifndef __FORK_H__ +#define __FORK_H__ + +// int copy_process(unsigned long fn, unsigned long arg); +#include "schedule.h" + +int copy_process( + unsigned long flags, + unsigned long fn, + unsigned long arg, + unsigned long stack); +int move_to_user_mode(unsigned long pc); + +struct pt_regs { + unsigned long regs[31]; + unsigned long sp; + unsigned long pc; + unsigned long pstate; +}; + +struct pt_regs * task_pt_regs(struct task_struct *tsk); +void kp_user_mode(unsigned long func); + +#define PSR_MODE_EL0t 0x00000000; + +#endif \ No newline at end of file diff --git a/lab08/kernel/include/initramfs.h b/lab08/kernel/include/initramfs.h new file mode 100644 index 000000000..276f6720e --- /dev/null +++ b/lab08/kernel/include/initramfs.h @@ -0,0 +1,35 @@ +#ifndef __INITRAMFS_H__ +#define __INITRAMFS_H__ + +#define COMPONENT_SIZE 15 +#define ENTRIES_PER_DIR 16 +#define INITRAMFS_MAX_FILE 4096*128 + +#include "vfs.h" +#include "cpio.h" + +struct initramfs_internal { + char* name; // file name or directory name + unsigned long size; // child count for directory + char* data; + unsigned long filesize; + int type; // DIR_NODE or FILE_NODE + // struct vnode* parent; + struct vnode* children[ENTRIES_PER_DIR]; + // struct vnode* next; +}; + +int initramfs_list(struct vnode* dir_node); +int initramfs_lookup(struct vnode* dir_node, struct vnode** target, const char* component_name); +int initramfs_mkdir(struct vnode* dir_node, struct vnode** target, const char* component_name); +int initramfs_create(struct vnode* dir_node, struct vnode** target, const char* component_name); +int initramfs_close(struct file* file); +int initramfs_open(struct vnode* file_node, struct file** target); +int initramfs_read(struct file* file, void* buf, size_t len); +int initramfs_write(struct file* file, const void* buf, size_t len); +int initramfs_getsize(struct vnode* vnode); +int initramfs_setup_mount(struct filesystem* fs, struct mount** mount); +int initramfs_register(); +// int parse_initramfs(); + +#endif \ No newline at end of file diff --git a/lab08/kernel/include/io.h b/lab08/kernel/include/io.h new file mode 100644 index 000000000..d1e5333e5 --- /dev/null +++ b/lab08/kernel/include/io.h @@ -0,0 +1,14 @@ +#ifndef __IO_H__ +#define __IO_H__ + +#include "mini_uart.h" + +void printf(const char* str); +void printfc(const char c); +void printf_hex(const unsigned int d); +void printf_int(const int d); +char read_char(); + +#define debug() printf("\r\n [DEBUG] : "); printf(__FILE__); printf(" : "); printf_int(__LINE__) + +#endif \ No newline at end of file diff --git a/lab08/kernel/include/irq.h b/lab08/kernel/include/irq.h new file mode 100644 index 000000000..21f2fd7f1 --- /dev/null +++ b/lab08/kernel/include/irq.h @@ -0,0 +1,12 @@ +#ifndef __IRQ_H__ +#define __IRQ_H__ + +#define EL1_IRQ_TIMER_PRIORITY 0x1 +#define EL1_IRQ_UART_PRIORITY 0x2 + +struct irq_task_struct; + +void task_head_init(); +void test_func(); + +#endif \ No newline at end of file diff --git a/lab08/kernel/include/lib.h b/lab08/kernel/include/lib.h new file mode 100644 index 000000000..cb370038c --- /dev/null +++ b/lab08/kernel/include/lib.h @@ -0,0 +1,12 @@ +#ifndef __LIB_H__ +#define __LIB_H__ + +#include "type.h" + +uint32_t strtol(const char *sptr, uint32_t base, int size); +uint64_t atoi(const char *str); +uint64_t atoi_hex(const char *str); +uint64_t pow(int base, int exp); +void assert(int condition, char* message); + +#endif \ No newline at end of file diff --git a/lab08/kernel/include/mailbox.h b/lab08/kernel/include/mailbox.h new file mode 100644 index 000000000..46f26015f --- /dev/null +++ b/lab08/kernel/include/mailbox.h @@ -0,0 +1,9 @@ +#ifndef __MAIULBOX_H__ +#define __MAILBOX_H__ + +void get_board_revision(); +void get_memory_info(); +void mailbox_call(unsigned int *mailbox); +int mailbox_call_s(unsigned char ch, unsigned int *mbox); + +#endif \ No newline at end of file diff --git a/lab08/kernel/include/mem.h b/lab08/kernel/include/mem.h new file mode 100644 index 000000000..f355738b4 --- /dev/null +++ b/lab08/kernel/include/mem.h @@ -0,0 +1,31 @@ +#ifndef __MEM_H__ +#define __MEM_H__ + +#include "type.h" + +extern uint64_t _heap_start; + +#define HEAP_END (uint64_t)(&_heap_start + 0x100000) + +#define USER_PROCESS_SP 0x200000 +#define USER_START_ADDR 0x100000 + + +// malloc +#define FRAME_SIZE 4096 // 4KB +// #define MAX_LEVEL 16 +#define MAX_LEVEL 18 // log_2(FRAME_NUM) about 17.~ + +// #define MALLOC_START_ADDR 0x10000000 +// #define MALLOC_END_ADDR 0x20000000 +#define MALLOC_START_ADDR 0x00000000 +#define MALLOC_END_ADDR 0x3C000000 +#define MALLOC_TOTAL_SIZE (MALLOC_END_ADDR - MALLOC_START_ADDR) +#define FRAME_NUM MALLOC_TOTAL_SIZE / FRAME_SIZE + +#define MAX_BUDDY_SYSTEM_LIST 10 + +#define MEMORY_POOL_SIZE 4 +#define MEMORY_POOL_DEPTH 4 + +#endif \ No newline at end of file diff --git a/lab08/kernel/include/mini_uart.h b/lab08/kernel/include/mini_uart.h new file mode 100644 index 000000000..eed952d7b --- /dev/null +++ b/lab08/kernel/include/mini_uart.h @@ -0,0 +1,26 @@ +#ifndef _MINI_UART_H +#define _MINI_UART_H + +#define BUFF_SIZE 256 + +void uart_init(); +char uart_recv(); +void uart_send(const char c); +void uart_send_string(const char* str); + +void enable_uart_interrupt(); +void disable_uart_interrupt(); +void enable_uart_recv_interrupt(); +void disable_uart_recv_interrupt(); +void enable_uart_trans_interrupt(); +void disable_uart_trans_interrupt(); + +void uart_buff_init(); + +void async_uart_puts(char* buff); +int async_uart_gets(char* buff, int size); + +void async_uart_read_handler(); +void async_uart_write_handler(); + +#endif \ No newline at end of file diff --git a/lab08/kernel/include/mm.h b/lab08/kernel/include/mm.h new file mode 100644 index 000000000..d97596341 --- /dev/null +++ b/lab08/kernel/include/mm.h @@ -0,0 +1,6 @@ +#ifndef __MM_H__ +#define __MM_H__ + +void memzero_asm(unsigned long src, unsigned long n); + +#endif \ No newline at end of file diff --git a/lab08/kernel/include/peripherals/base.h b/lab08/kernel/include/peripherals/base.h new file mode 100644 index 000000000..1d3265580 --- /dev/null +++ b/lab08/kernel/include/peripherals/base.h @@ -0,0 +1,6 @@ +#ifndef __PERIPHERALS_BASE_H__ +#define __PERIPHERALS_BASE_H__ + +#define MMIO_BASE 0x3F000000 + +#endif \ No newline at end of file diff --git a/lab08/kernel/include/peripherals/gpio.h b/lab08/kernel/include/peripherals/gpio.h new file mode 100644 index 000000000..b6a104ab3 --- /dev/null +++ b/lab08/kernel/include/peripherals/gpio.h @@ -0,0 +1,12 @@ +#ifndef _GPIO_H +#define _GPIO_H + +#include "peripherals/base.h" + +#define GPFSEL1 ((volatile unsigned int*)(MMIO_BASE+0x00200004)) +#define GPSET0 ((volatile unsigned int*)(MMIO_BASE+0x0020001C)) +#define GPCLR0 ((volatile unsigned int*)(MMIO_BASE+0x00200028)) +#define GPPUD ((volatile unsigned int*)(MMIO_BASE+0x00200094)) +#define GPPUDCLK0 ((volatile unsigned int*)(MMIO_BASE+0x00200098)) + +#endif \ No newline at end of file diff --git a/lab08/kernel/include/peripherals/irq.h b/lab08/kernel/include/peripherals/irq.h new file mode 100644 index 000000000..54672e0f5 --- /dev/null +++ b/lab08/kernel/include/peripherals/irq.h @@ -0,0 +1,29 @@ +#ifndef __PERIPHERALS_IRQ_H__ +#define __PERIPHERALS_IRQ_H__ + +#include "peripherals/base.h" + +// BCM2835 page. 112-116 +#define IRQ_BASIC_PENDING ((volatile unsigned int*)(MMIO_BASE+0x0000B200)) +#define IRQ_PENDING_1 ((volatile unsigned int*)(MMIO_BASE+0x0000B204)) // Holds All interrupts 0...31 from the GPU side. +#define IRQ_PENDING_2 ((volatile unsigned int*)(MMIO_BASE+0x0000B208)) // 32...63 +#define FIQ_CONTROL ((volatile unsigned int*)(MMIO_BASE+0x0000B20C)) +#define ENABLE_IRQS_1 ((volatile unsigned int*)(MMIO_BASE+0x0000B210)) // Writing a 1 to a bit will set the corresponding IRQ enable bit. (0-31) +#define ENABLE_IRQS_2 ((volatile unsigned int*)(MMIO_BASE+0x0000B214)) // (32-63) +#define ENABLE_BASIC_IRQS ((volatile unsigned int*)(MMIO_BASE+0x0000B218)) +#define DISABLE_IRQS_1 ((volatile unsigned int*)(MMIO_BASE+0x0000B21C)) +#define DISABLE_IRQS_2 ((volatile unsigned int*)(MMIO_BASE+0x0000B220)) +#define DISABLE_BASIC_IRQS ((volatile unsigned int*)(MMIO_BASE+0x0000B224)) // AUX interrupt. 29 + +#define AUX_INT (1 << 29) + +// QA7 page. 16 +#define CORE0_IRQ_SOURCE ((volatile unsigned int*)(0x40000060)) // Get the IRQ source for the core 0. + +#define SYSTEM_TIMER_IRQ_1 (1 << 1) +#define GPU_IRQ (1 << 8) + +#define ESR_ELx_EC_SHIFT 26 +#define ESR_ELx_EC_SVC64 0x15 + +#endif \ No newline at end of file diff --git a/lab08/kernel/include/peripherals/mailbox.h b/lab08/kernel/include/peripherals/mailbox.h new file mode 100644 index 000000000..454eb13a3 --- /dev/null +++ b/lab08/kernel/include/peripherals/mailbox.h @@ -0,0 +1,26 @@ +#ifndef __PERIPHERALS_MAILBOX_H__ +#define __PERIPHERALS_MAILBOX_H__ + +#include "peripherals/base.h" + +#define MAILBOX_BASE MMIO_BASE + 0xb880 + +#define MAILBOX_READ ((volatile unsigned int*)(MAILBOX_BASE )) // M0: CPU read from GPU +#define MAILBOX_STATUS ((volatile unsigned int*)(MAILBOX_BASE + 0x18)) // M0: Check GPU statue +#define MAILBOX_WRITE ((volatile unsigned int*)(MAILBOX_BASE + 0x20)) // M1: CPU write to GPU + +#define MAILBOX_EMPTY 0x40000000 +#define MAILBOX_FULL 0x80000000 + +#define GET_BOARD_REVISION 0x00010002 +#define GET_ARM_MEMORY 0x00010005 +#define REQUEST_CODE 0x00000000 +#define REQUEST_SUCCEED 0x80000000 +#define REQUEST_FAILED 0x80000001 +#define TAG_REQUEST_CODE 0x00000000 +#define END_TAG 0x00000000 + +#define MBOX_CH_PROP 8 +#define MBOX_TAG_LAST 0 + +#endif diff --git a/lab08/kernel/include/peripherals/mini_uart.h b/lab08/kernel/include/peripherals/mini_uart.h new file mode 100644 index 000000000..bb55ba2fe --- /dev/null +++ b/lab08/kernel/include/peripherals/mini_uart.h @@ -0,0 +1,26 @@ +#ifndef __PERIPHERALS_MINI_UART_H__ +#define __PERIPHERALS_MINI_UART_H__ + +#include "peripherals/base.h" + +#define AUX_ENABLES ((volatile unsigned int*)(MMIO_BASE+0x00215004)) +#define AUX_MU_IO_REG ((volatile unsigned int*)(MMIO_BASE+0x00215040)) +#define AUX_MU_IER_REG ((volatile unsigned int*)(MMIO_BASE+0x00215044)) // Interrupt Enable Register (BCM2835 page. 12) +#define AUX_MU_IIR_REG ((volatile unsigned int*)(MMIO_BASE+0x00215048)) // Shows the interrupt status. (BCM2835 page. 13) +#define AUX_MU_LCR_REG ((volatile unsigned int*)(MMIO_BASE+0x0021504C)) +#define AUX_MU_MCR_REG ((volatile unsigned int*)(MMIO_BASE+0x00215050)) +#define AUX_MU_LSR_REG ((volatile unsigned int*)(MMIO_BASE+0x00215054)) +#define AUX_MU_MSR_REG ((volatile unsigned int*)(MMIO_BASE+0x00215058)) +#define AUX_MU_SCRATCH ((volatile unsigned int*)(MMIO_BASE+0x0021505C)) +#define AUX_MU_CNTL_REG ((volatile unsigned int*)(MMIO_BASE+0x00215060)) +#define AUX_MU_STAT_REG ((volatile unsigned int*)(MMIO_BASE+0x00215064)) +#define AUX_MU_BAUD_REG ((volatile unsigned int*)(MMIO_BASE+0x00215068)) + + +#define ENABLE_RCV_IRQ (1 << 0) +#define ENABLE_TRANS_IRQ (1 << 1) + +#define AUX_MU_IIR_REG_READ (1 << 2) +#define AUX_MU_IIR_REG_WRITE (1 << 1) + +#endif \ No newline at end of file diff --git a/lab08/kernel/include/reboot.h b/lab08/kernel/include/reboot.h new file mode 100644 index 000000000..e47678792 --- /dev/null +++ b/lab08/kernel/include/reboot.h @@ -0,0 +1,8 @@ +#ifndef __REBOOT_H__ +#define __REBOOT_H__ + +void set(long addr, unsigned int value); +void reset(int tick); +void cancel_reset(); + +#endif \ No newline at end of file diff --git a/lab08/kernel/include/schedule.h b/lab08/kernel/include/schedule.h new file mode 100644 index 000000000..5392a441d --- /dev/null +++ b/lab08/kernel/include/schedule.h @@ -0,0 +1,79 @@ +#ifndef __SCHEDULE_H__ +#define __SCHEDULE_H__ + +#define THREAD_CPU_CONTEXT 0 // offset of cpu_context in task_struct + + +#ifndef __ASSEMBLER__ + +#define THREAD_SIZE 4096 + +#define NR_TASKS 64 + +#define FIRST_TASK task[0] +#define LAST_TASK task[NR_TASKS-1] + +#define TASK_RUNNING 0 +#define TASK_ZOMBIE 1 +#define TASK_STOPPED 2 + +#define PF_KTHREAD 2 + +// #define MAX_PATH_LEN 256 + +extern struct task_struct *current; +extern struct task_struct * task[NR_TASKS]; +extern int nr_tasks; + +#include "vfs.h" + +struct cpu_context { + unsigned long long x19; + unsigned long long x20; + unsigned long long x21; + unsigned long long x22; + unsigned long long x23; + unsigned long long x24; + unsigned long long x25; + unsigned long long x26; + unsigned long long x27; + unsigned long long x28; + unsigned long long fp; // x29 + unsigned long long sp; + unsigned long long pc; // x30 +}; + +struct task_struct { + struct cpu_context cpu_context; + long state; + long counter; + long priority; + long preempt_count; + unsigned long stack; + unsigned long flags; + int pid; + char cwd[MAX_PATH_LEN]; + struct file_descriptor_table fd_table; +}; + +extern void sched_init(void); +extern void schedule(void); +extern void timer_tick(void); +extern void preempt_disable(void); +extern void preempt_enable(void); +extern void switch_to(struct task_struct* next); +extern void cpu_switch_to(struct task_struct* prev, struct task_struct* next); +extern void enable_irq(void); +extern void disable_irq(void); +extern void kill_zombies(void); +extern void exit_process(void); + +#define INIT_TASK \ +/*cpu_context*/ { {0,0,0,0,0,0,0,0,0,0,0,0,0}, \ +/* state etc */ 0,0,1, 0, 0, PF_KTHREAD, 0, \ +/* cwd */ "/", \ +/*fd table*/ {0, {0}} \ +} + +#endif +#endif \ No newline at end of file diff --git a/lab08/kernel/include/shell.h b/lab08/kernel/include/shell.h new file mode 100644 index 000000000..cf6dd6e14 --- /dev/null +++ b/lab08/kernel/include/shell.h @@ -0,0 +1,12 @@ +#ifndef __SHELL_H__ +#define __SHELL_H__ + +typedef struct cmd { + char *name; + void (*func)(int argc, char *argv[]); + char help_msg[100]; +} cmd; + +void readcmd(char [256]); +void shell_loop(); +#endif \ No newline at end of file diff --git a/lab08/kernel/include/string.h b/lab08/kernel/include/string.h new file mode 100644 index 000000000..edf5814b4 --- /dev/null +++ b/lab08/kernel/include/string.h @@ -0,0 +1,12 @@ +#ifndef __STRING_H__ +#define __STRING_H__ + +#include "type.h" + +int strcmp(const char *str1, const char *str2); +char* strcpy(char* dest, const char* src); +char* strncpy(char* dest, const char* src, int n); +uint32_t strlen(const char* str); +char *strtok(char* str, const char* delim); + +#endif \ No newline at end of file diff --git a/lab08/kernel/include/sys.h b/lab08/kernel/include/sys.h new file mode 100644 index 000000000..ae3f6528f --- /dev/null +++ b/lab08/kernel/include/sys.h @@ -0,0 +1,57 @@ +#ifndef __SYS_H__ +#define __SYS_H__ + +#define __NR_syscalls 20 + +#define SYS_GETPID_NUM 0 // syscall number +#define SYS_UARTREAD_NUM 1 +#define SYS_UARTWRITE_NUM 2 +#define SYS_EXEC_NUM 3 +#define SYS_FORK_NUM 4 +#define SYS_EXIT_NUM 5 +#define SYS_MBOX_CALL_NUM 6 +#define SYS_KILL_NUM 7 + + +#define SYS_OPEN_NUM 11 +#define SYS_CLOSE_NUM 12 +#define SYS_WRITE_NUM 13 +#define SYS_READ_NUM 14 +#define SYS_MKDIR_NUM 15 +#define SYS_MOUNT_NUM 16 +#define SYS_CHDIR_NUM 17 +#define SYS_LSEEK64_NUM 18 +#define SYS_IOCTL_NUM 19 + +#ifndef __ASSEMBLER__ + +#include "type.h" + +int sys_getpid(); +size_t sys_uartread(char buf[], size_t size); +size_t sys_uartwrite(const char buf[], size_t size); +int sys_exec(const char *name, char *const argv[]); +int sys_fork(); +void sys_exit(int status); +int sys_mbox_call(unsigned char ch, unsigned int *mbox); +void sys_kill(int pid); + +// lab7 +int sys_open(const char *pathname, int flags); +int sys_close(int fd); +long sys_write(int fd, const void *buf, unsigned long count); +long sys_read(int fd, void *buf, unsigned long count); + +// you can ignore mode, since there is no access control +int sys_mkdir(const char *pathname, unsigned mode); + +// you can ignore arguments other than target (where to mount) and filesystem (fs name) +int sys_mount(const char *src, const char *target, const char *filesystem, unsigned long flags, const void *data); +int sys_chdir(const char *path); + +long sys_lseek64(int fd, long offset, int whence); +long sys_ioctl(int fd, unsigned long request, unsigned long arg); + +#endif + +#endif diff --git a/lab08/kernel/include/timer.h b/lab08/kernel/include/timer.h new file mode 100644 index 000000000..7591b62d0 --- /dev/null +++ b/lab08/kernel/include/timer.h @@ -0,0 +1,14 @@ +#ifndef __TIMER_H__ +#define __TIMER_H__ + +extern void core_timer_enable(); +extern void core_timer_disable(); +extern unsigned long long get_cpu_cycles(); +extern unsigned int get_cpu_freq(); +extern void set_timer_asm(unsigned int sec); + +void timer_init(); +void irq_timer_handler(); +void set_timer(unsigned int sec); + +#endif \ No newline at end of file diff --git a/lab08/kernel/include/tmpfs.h b/lab08/kernel/include/tmpfs.h new file mode 100644 index 000000000..1c2beee77 --- /dev/null +++ b/lab08/kernel/include/tmpfs.h @@ -0,0 +1,33 @@ +#ifndef __TMPFS_H__ +#define __TMPFS_H__ + +#define COMPONENT_SIZE 15 +#define ENTRIES_PER_DIR 16 +#define TMPFS_MAX_FILE 4096 + +#include "vfs.h" + +struct tmpfs_internal { + char* name; // file name or directory name + unsigned long size; + char* data; + unsigned long filesize; + int type; // DIR_NODE or FILE_NODE + // struct vnode* parent; + struct vnode* children[ENTRIES_PER_DIR]; + // struct vnode* next; +}; + +int tmpfs_list(struct vnode* dir_node); +int tmpfs_lookup(struct vnode* dir_node, struct vnode** target, const char* component_name); +int tmpfs_mkdir(struct vnode* dir_node, struct vnode** target, const char* component_name); +int tmpfs_create(struct vnode* dir_node, struct vnode** target, const char* component_name); +int tmpfs_close(struct file* file); +int tmpfs_open(struct vnode* file_node, struct file** target); +int tmpfs_read(struct file* file, void* buf, size_t len); +int tmpfs_write(struct file* file, const void* buf, size_t len); +int tmpfs_getsize(struct vnode* vnode); +int tmpfs_setup_mount(struct filesystem* fs, struct mount** mount); +int tmpfs_register(); + +#endif \ No newline at end of file diff --git a/lab08/kernel/include/type.h b/lab08/kernel/include/type.h new file mode 100644 index 000000000..91acd4bd5 --- /dev/null +++ b/lab08/kernel/include/type.h @@ -0,0 +1,13 @@ +#ifndef __TYPE_H__ +#define __TYPE_H__ + +typedef unsigned char uint8_t; +typedef unsigned short uint16_t; +typedef unsigned int uint32_t; +typedef unsigned long long uint64_t; + +typedef unsigned long long size_t; + +#define NULL (void*)0 + +#endif diff --git a/lab08/kernel/include/user_demo.h b/lab08/kernel/include/user_demo.h new file mode 100644 index 000000000..7ebabd664 --- /dev/null +++ b/lab08/kernel/include/user_demo.h @@ -0,0 +1,14 @@ +#ifndef __USER_DEMO_H__ +#define __USER_DEMO_H__ + +#define delay(x) for(int i=0; i (void*)HEAP_END){ + + return (char*)0; + } + char* ret = HEAP_REAR; + HEAP_REAR += size; + return ret; +} + +// ========================================== + +static uint64_t pow_2(uint32_t n); + +extern uint64_t _kernel_end; +static uint64_t* _kernel_end_ptr = &_kernel_end; +static uint64_t* _heap_start_ptr = &_heap_start; + +#ifndef QEMU +extern uint64_t CPIO_START_ADDR_FROM_DT; +extern uint64_t CPIO_END_ADDR_FROM_DT; +#endif + +struct frame_t{ + struct frame_t* next; + struct frame_t* prev; // [TODO] maintain prev pointer + uint32_t index; + uint8_t level; + uint8_t status; +}; + +struct flist_t{ + struct frame_t* head; +}; + +struct buddy_system_list_t{ + void* base_addr; + uint32_t index; + uint8_t max_level; +}; + +struct memory_pool_t{ + uint8_t frame_used; + uint8_t chunk_used; + uint32_t size; + uint32_t chunk_per_frame; + uint32_t chunk_offset; // use to get the offset of chunk in a frame + struct chunk_t* free_chunk; + void *frame_base_addrs[MEMORY_POOL_DEPTH]; +}; + +struct chunk_t{ + struct chunk_t* next; + struct chunk_t* prev; +}; + +static struct frame_t frame_arr[FRAME_NUM]; +static struct flist_t flist_arr[MAX_LEVEL + 1]; +static struct memory_pool_t memory_pools[MEMORY_POOL_SIZE]; +static struct buddy_system_list_t buddy_system_list[MAX_BUDDY_SYSTEM_LIST]; + +#define FREE 0 +#define ALLOCATED 1 +#define LARGE_CONTIGUOUS 2 +#define RESERVED 3 + + +static void add_to_flist(struct flist_t* flist, struct frame_t* frame) +{ + struct frame_t *curr = flist->head; + while(curr) + { + if(curr->next)curr = curr->next; + else break; + } + if(curr) curr->next = frame; + else + { + // printf("\r\n[SYSTEM INFO] Add Frame: "); printf_int(frame->index); printf(" to Level: "); printf_int(frame->level); + flist->head = frame; + // printf("\r\n[SYSTEM INFO] Frame status: "); printf_int(frame->status); + } +#ifdef BUDDY_SYSTEM_DEBUG + printf("\r\n[DEBUG] Leave add_to_flist"); +#endif +} + +static void remove_from_flist(struct flist_t* flist, struct frame_t* frame) +{ + struct frame_t *curr = flist->head; + struct frame_t *prev = NULL; + int next_index = frame_arr[frame->index + pow_2(frame->level) - 1].next == NULL \ + ? -1 : frame_arr[frame->index + pow_2(frame->level) - 1].next->index; + frame_arr[frame->index + pow_2(frame->level) - 1].next = NULL; + while(curr) + { + if(curr == frame) + { + if(prev) prev->next = next_index == -1 ? NULL : &frame_arr[next_index]; + else flist->head = next_index == -1 ? NULL : &frame_arr[next_index]; +#ifdef BUDDY_SYSTEM_DEBUG + printf("\r\n[DEBUG] Remove Frame: "); printf_int(frame->index); printf(" from flist Level: "); printf_int(frame->level); +#endif + // curr->next = NULL; + return; + } + prev = curr; + curr = curr->next; + } +#ifdef BUDDY_SYSTEM_DEBUG + printf("\r\n[DEBUG ERROR] Frame Not Found in flist!"); +#endif + return; +} + +static uint64_t pow_2(uint32_t n) +{ + return 1 << n; +} + +void memory_reserve(uint64_t start, uint64_t end, char* msg) +{ +#ifdef BUDDY_SYSTEM_DEBUG + printf("\r\n[SYSTEM INFO] Reserve Memory from: "); printf_hex(start); printf(" to: "); printf_hex(end); +#endif + uint32_t start_index = (start - 0) >> 12; + uint32_t end_index = (end - 0) >> 12; + +#ifdef BUDDY_SYSTEM_DEBUG + printf("\r\n[SYSTEM INFO] Reserve Memory from Frame: "); printf_int(start_index); printf(" to Frame: "); printf_int(end_index); + printf(" for "); printf(msg); +#endif + if(start_index == end_index) + frame_arr[start_index].status = RESERVED; + else + for(int i=start_index; i= (uint64_t)buddy_system_list[i].base_addr) + { + return i; + } + else{ + if( addr >= (uint64_t)buddy_system_list[i].base_addr + && addr < (uint64_t)buddy_system_list[i+1].base_addr ) + { + return i; + } + } + } + return -1; +} + +void print_bslist(int argc, char* argv[]) +{ + printf("\r\n========== buddy system list =========="); + for(int i=0; ilevel = get_lower_bound_level(free_cnt); +#ifdef BUDDY_SYSTEM_DEBUG + printf("\r\n[DEBUG] Free Start Frame: "); printf_int(free_start->index); + printf(", Level: "); printf_int(free_start->level); +#endif + buddy_system_list[bid].index = free_start->index; + buddy_system_list[bid].base_addr = (void*)(uint64_t)(MALLOC_START_ADDR + free_start->index * FRAME_SIZE); + buddy_system_list[bid++].max_level = free_start->level; + frame_arr[free_start->index + pow_2(free_start->level) - 1].next = NULL; + add_to_flist(&flist_arr[free_start->level], free_start); + is_free_start = 1; + free_cnt = 0; + free_start = NULL; + } + } + else{ + if(is_free_start){ + buddy_system_list[bid].base_addr = &frame_arr[i]; + frame_arr[i].status = FREE; + free_start = &frame_arr[i]; + is_free_start = 0; + free_cnt = 1; + } + else{ + frame_arr[i].status = LARGE_CONTIGUOUS; + frame_arr[i].level = 0; + free_cnt++; + } + } + if(i== FRAME_NUM-1 && is_free_start==0 && free_start != NULL){ + free_start->level = get_lower_bound_level(free_cnt); +#ifdef BUDDY_SYSTEM_DEBUG + printf("\r\n[DEBUG] Free Start Frame: "); printf_int(free_start->index); + printf(", Level: "); printf_int(free_start->level); printf(" "); printf_int(free_cnt); +#endif + buddy_system_list[bid].index = free_start->index; + buddy_system_list[bid].base_addr = (void*)(uint64_t)(MALLOC_START_ADDR + free_start->index * FRAME_SIZE); + buddy_system_list[bid++].max_level = free_start->level; + frame_arr[free_start->index + pow_2(free_start->level) - 1].next = NULL; + add_to_flist(&flist_arr[free_start->level], free_start); + is_free_start = 1; + free_cnt = 0; + free_start = NULL; + } + } + +#ifdef BUDDY_SYSTEM_DEBUG + int tag = 0; + printf("\r\n[SYSTEM INFO] Buddy System List (Start Frame, base_addr, max_level): \n"); +#endif + for(int i=0; i "); +#endif + if(buddy_system_list[i].base_addr == NULL) break; +#ifdef BUDDY_SYSTEM_DEBUG + printf("( "); printf_int(buddy_system_list[i].index); printf(", "); + printf_hex((uint64_t)buddy_system_list[i].base_addr); printf(", "); + printf_int(buddy_system_list[i].max_level); printf(" )"); + tag = 1; +#endif + } +} + +void print_flist(int argc, char* argv[]) +{ + printf("\r\n========== free list =========="); + for(int i=0; i<=MAX_LEVEL; i++) + { +#ifdef BUDDY_SYSTEM_DEBUG + printf("\r\n[DEBUG] Level: ");printf_int(i); +#endif + struct frame_t* frame = flist_arr[i].head; + int sign = 0; + while(frame != NULL) + { + if(frame->status == FREE) + { + if(sign == 0) { printf("\r\n[SYSTEM INFO] Level: "); printf_int(i); printf(", Frame: "); } + if(sign) printf("-> "); + printf_int(frame->index); + sign = 1; + // frame = frame->next; + frame = frame_arr[frame->index + pow_2(frame->level) - 1].next; +#ifdef BUDDY_SYSTEM_DEBUG + if(frame != NULL) {printf(" (expected next: "); printf_int(frame->index); printf(")");} +#endif + } + } +#ifdef BUDDY_SYSTEM_DEBUG + printf("\r\n[DEBUG] Leave Level: ");printf_int(i); +#endif + } +#ifdef BUDDY_SYSTEM_DEBUG + printf("\r\n[DEBUG] Leave print_flist"); +#endif +} + +void print_allocated(int argc, char* argv[]) +{ + printf("\r\n=========== allocated ==========="); + for(int i=0; inext; + } +#ifdef BUDDY_SYSTEM_DEBUG + printf("\r\n[DEBUG] Allocated Frame Count: "); printf_int(cnt); printf(", Expected Count: "); printf_int(expected_cnt); + printf(" , level: "); printf_int(level); +#endif + assert(cnt == expected_cnt, "Allocated Frame Count Error!"); + i--; + } + } + printf("\n==============================="); +} + +static uint64_t round_size(uint64_t size) // return size to the nearest power of 2 +{ + uint64_t ret = 1; + while(ret < size) ret <<= 1; + return ret; +} + +static uint8_t get_level(uint32_t size) +{ + uint8_t level = 0; + for(int i=FRAME_SIZE; iindex; +#ifdef BUDDY_SYSTEM_DEBUG + printf("\r\n[DEBUG] From Level: "); printf_int(from_level); + printf("\r\n[DEBUG] Start Index: "); printf_int(start_index); +#endif + remove_from_flist(&flist_arr[from_level], frame); + + while(from_level > level) // e.g. get level 4 frame, but only have level 6 frame + { + from_level--; + uint64_t level_size = pow_2(from_level); + uint32_t split_index = start_index + level_size; + + frame_arr[split_index].level = from_level; + frame_arr[split_index + level_size - 1].next = NULL; + + frame_arr[split_index].status = FREE; + // printf("\r\n[SYSTEM INFO] Split Frame: "); printf_int(split_index); printf(", Level: "); printf_int(from_level); + add_to_flist(&flist_arr[from_level], &frame_arr[split_index]); + } + frame->status = ALLOCATED; + frame->level = level; + frame_arr[start_index + pow_2(level) - 1].next = NULL; +#ifdef BUDDY_SYSTEM_DEBUG + printf("\r\n[SYSTEM INFO] Allocate Frame: "); printf_int(frame->index); +#endif + ret = (void*)(uint64_t)(MALLOC_START_ADDR + start_index * FRAME_SIZE); + break; + } + } + if(ret == NULL) + { + printf("\r\n[SYSTEM ERROR] No Enough Memory!"); + } +#ifdef BUDDY_SYSTEM_DEBUG + print_flist(0, NULL); + print_allocated(0, NULL); +#endif + return ret; +} + +static void* get_buddy_address(void* ptr, uint8_t level) +{ + return (void*)((uint64_t)ptr ^ (pow_2(level) * FRAME_SIZE)); +} + +static uint32_t get_buddy_index(void* ptr, uint8_t level) +{ + return ((uint64_t)get_buddy_address(ptr, level) - MALLOC_START_ADDR) >> 12; +} + +int bfree(void* ptr) +{ + uint8_t max_level = buddy_system_list[get_bid((uint64_t)ptr)].max_level; + uint32_t offset = buddy_system_list[get_bid((uint64_t)ptr)].index; + + struct frame_t* curr_frame = &frame_arr[((uint64_t)ptr - MALLOC_START_ADDR) >> 12]; + + switch(curr_frame->status) + { + case FREE: +#ifdef BUDDY_SYSTEM_DEBUG + printf("\r\n[SYSTEM ERROR] Frame Already Free!"); +#endif + return 1; + case LARGE_CONTIGUOUS: +#ifdef BUDDY_SYSTEM_DEBUG + printf("\r\n[SYSTEM ERROR] Frame is belong to Large Contiguous Frame!"); +#endif + return 1; + case RESERVED: +#ifdef BUDDY_SYSTEM_DEBUG + printf("\r\n[SYSTEM ERROR] Frame is Reserved!"); +#endif + return 1; + default: + break; + } + + // printf("\r\n[SYSTEM INFO] Free Frame Address: "); printf_hex((uint64_t)ptr); + // buddy address = curr address ^ (block size) + struct frame_t* buddy_frame = &frame_arr[get_buddy_index((ptr-offset*FRAME_SIZE), curr_frame->level)+offset]; +#ifdef BUDDY_SYSTEM_DEBUG + printf("\r\n[SYSTEM INFO] Free Frame: "); printf_int(curr_frame->index); printf(", Level: "); printf_int(curr_frame->level); + printf("\r\n[SYSTEM INFO] Buddy Frame: "); printf_int(buddy_frame->index); printf(", Level: "); printf_int(buddy_frame->level); +#endif + if(buddy_frame->status != FREE) + { +#ifdef BUDDY_SYSTEM_DEBUG + printf("\r\n[SYSTEM INFO] Buddy Frame is not FREE!"); +#endif + curr_frame->status = FREE; + } + else + { +#ifdef BUDDY_SYSTEM_DEBUG + printf("\r\n[SYSTEM INFO] Buddy Frame is Free!"); +#endif + } + while(buddy_frame->status == FREE && curr_frame->level < max_level) + { + curr_frame->status = FREE; +#ifdef BUDDY_SYSTEM_DEBUG + printf("\r\n[SYSTEM INFO] Merge Frame:"); printf_int(curr_frame->index); printf(" and Frame: "); printf_int(buddy_frame->index); + printf(" to Level: "); printf_int(curr_frame->level + 1); +#endif + +#ifdef BUDDY_SYSTEM_DEBUG + printf("\r\n[DEBUG] remove_from_flist: level: "); printf_int(buddy_frame->level); printf(" index: "); printf_int(buddy_frame->index); +#endif + remove_from_flist(&flist_arr[buddy_frame->level], buddy_frame); + + uint32_t merge_index; + if(buddy_frame->index < curr_frame->index) + { + merge_index = buddy_frame->index; + frame_arr[buddy_frame->index + pow_2(buddy_frame->level) - 1].next = curr_frame; + curr_frame->status = LARGE_CONTIGUOUS; + } + else + { + merge_index = curr_frame->index; + frame_arr[curr_frame->index + pow_2(curr_frame->level) - 1].next = buddy_frame; + buddy_frame->status = LARGE_CONTIGUOUS; + } + +#ifdef BUDDY_SYSTEM_DEBUG + printf(" with head frame: "); printf_int(merge_index); +#endif + + curr_frame = &frame_arr[merge_index]; + curr_frame->level++; + if(curr_frame->level == max_level) + { + break; + } + buddy_frame = &frame_arr[get_buddy_index((void*)(uint64_t)(MALLOC_START_ADDR + (merge_index-offset) * FRAME_SIZE), curr_frame->level) + offset]; +#ifdef BUDDY_SYSTEM_DEBUG + printf("\r\n[SYSTEM INFO] New Frame: "); printf_int(curr_frame->index); printf(", Level: "); printf_int(curr_frame->level); + printf("\r\n[SYSTEM INFO] New Buddy Frame: "); printf_int(buddy_frame->index); printf(", Level: "); printf_int(buddy_frame->level); +#endif + } +#ifdef BUDDY_SYSTEM_DEBUG + printf("\r\n[SYSTEM INFO] Add Frame:"); printf_int(curr_frame->index); printf(" to Level: "); printf_int(curr_frame->level); +#endif + add_to_flist(&flist_arr[curr_frame->level], curr_frame); + return 0; +} + +void bfree_wrapper(int argc, char *argv[]) +{ + if(argc != 2){ + printf("\nUsage: test_bfree "); + return; + } + uint64_t index = atoi(argv[1]); + if(index >= FRAME_NUM){ + printf("\nIndex out of range"); + return; + } + if(!bfree((void*)(MALLOC_START_ADDR + index * FRAME_SIZE))) + { + print_flist(0, NULL); + print_allocated(0, NULL); + } +} + +void memory_pool_init() +{ + for(int i=0; isize = size; + memory_pool->chunk_per_frame = FRAME_SIZE / size; +} + +static int get_memory_pool_id(uint64_t size) +{ + uint64_t r_size = round_size(size); + + if(r_size >= FRAME_SIZE) return -1; // larger than frame size, use general balloc + + for(int i=0; i= r_size) + { + return i; + } + else if(memory_pools[i].size == 0) + { +#ifdef BUDDY_SYSTEM_DEBUG + printf("\r\n[DEBUG] Init New Memory Pool with chunk size: "); printf_int(r_size); +#endif + init_memory_pool_with_size(&memory_pools[i], r_size); + return i; + } + } + return -2; +} + +void* dynamic_alloc(uint64_t size) +{ + + int ret = get_memory_pool_id(size); + switch(ret) + { + case -1: + printf("\r\n[SYSTEM ERROR] Larger than Frame Size! Please use General balloc!"); + return 0; + case -2: + printf("\r\n[SYSTEM ERROR] No Enough Memory Pool! Please use General balloc!"); + return 0; + default: + break; + } + + struct memory_pool_t* memory_pool = &memory_pools[ret]; + + void* res = NULL; + + if(memory_pool->free_chunk != NULL) + { + res = memory_pool->free_chunk; + memzero_asm((uint64_t)res, memory_pool->size); + memory_pool->free_chunk = memory_pool->free_chunk->next; // point to the next free chunk +#ifdef DYNAMIC_ALLOC_DEBUG + printf("\r\n[SYSTEM INFO] Allocate Chunk at address: "); printf_hex((uint64_t)res); printf(", in Frame: "); printf_int(((uint64_t)res - MALLOC_START_ADDR) >> 12); +#endif + return res; + } + + if(memory_pool->frame_used >= MEMORY_POOL_DEPTH * memory_pool->chunk_per_frame) + { + printf("\r\n[SYSTEM ERROR] No Enough Memory Pool Frame!"); + return res; + } + + if(memory_pool->chunk_used >= memory_pool->frame_used * memory_pool->chunk_per_frame) + { + if(memory_pool->frame_used == 0) + { +#ifdef DYNAMIC_ALLOC_DEBUG + printf("\r\n[SYSTEM INFO] Create First Frame for Memory Pool with size: ");printf_int(memory_pool->size); +#endif + } + else + { +#ifdef DYNAMIC_ALLOC_DEBUG + printf("\r\n[SYSTEM INFO] The Frame of Memory Pool with size: ");printf_int(memory_pool->size);printf(" is Full! "); + printf("Create a New Frame!"); +#endif + } + + void* new_frame = balloc(FRAME_SIZE); + memory_pool->frame_base_addrs[memory_pool->frame_used] = new_frame; + memory_pool->frame_used++; + memory_pool->chunk_offset = 0; + } + + // printf("\r\n[SYSTEM INFO] Allocate Chunk in Memory Pool with size: "); printf_int(memory_pool->size); + // printf(" in Frame: "); printf_int(((struct frame_t*)memory_pool->frame_base_addrs[memory_pool->frame_used - 1])->index); + + res = memory_pool->frame_base_addrs[memory_pool->frame_used - 1] + memory_pool->chunk_offset * memory_pool->size; +#ifdef DYNAMIC_ALLOC_DEBUG + printf("\r\n[SYSTEM INFO] Allocate Chunk at address: "); printf_hex((uint64_t)res); printf(", in Frame: "); printf_int(((uint64_t)res - MALLOC_START_ADDR) >> 12); +#endif + memory_pool->chunk_offset++; + memory_pool->chunk_used++; + memzero_asm((uint64_t)res, memory_pool->size); + return res; +} + +int dfree(void* ptr) +{ + int memory_pool_index = -1; + for(int i=0; i>12; // 2^12 = 4096 = FRAME_SIZE + struct memory_pool_t* memory_pool = &memory_pools[memory_pool_index]; + + // check whether the chunk is already in the free chunk list + struct chunk_t* head_free_chunk = memory_pool->free_chunk; + while(head_free_chunk) + { + if(head_free_chunk == ptr) + { + printf("\r\n[SYSTEM ERROR] Chunk Already Free!"); + return 1; + } + head_free_chunk = head_free_chunk->next; + } +#ifdef DYNAMIC_ALLOC_DEBUG + printf("\r\n[SYSTEM INFO] Free Chunk in Frame: "); printf_int(((uint64_t)ptr - MALLOC_START_ADDR) >>12); +#endif + memory_pool->chunk_used--; + struct chunk_t* last_free_chunk = memory_pool->free_chunk; + memory_pool->free_chunk = (struct chunk_t*)ptr; + memory_pool->free_chunk->next = last_free_chunk; +#ifdef DYNAMIC_ALLOC_DEBUG + printf("\r\n[SYSTEM INFO] Free Chunk at address: "); printf_hex((uint64_t)ptr); +#endif + return 0; +} \ No newline at end of file diff --git a/lab08/kernel/src/boot.S b/lab08/kernel/src/boot.S new file mode 100644 index 000000000..30d694fb6 --- /dev/null +++ b/lab08/kernel/src/boot.S @@ -0,0 +1,48 @@ +.section ".text.boot" + +.globl _start +_start: + mrs x0, mpidr_el1 + and x0, x0,#0xFF // Check processor id + cbz x0, master // if cpu_id == 0, then booting + b proc_hang // Otherwise, hang + +proc_hang: + b proc_hang + +master: + bl from_el2_to_el1 + +exception_table: + bl set_exception_vector_table + +bss_init: + adr x0, __bss_start + adr x1, __bss_size + bl memzero + + adr x1, _start + mov sp, x1 + bl main // jump to kernel_main c code + b proc_hang // should never come here + +memzero: + str xzr, [x0], #8 // xzr: a register holds zero + subs x1, x1, #8 + b.gt memzero + ret + +// adr: Load a label's relative address into the target register. + +set_exception_vector_table: + adr x0, exception_vector_table // get the base address of the exception vector table + msr vbar_el1, x0 // set the base address of the exception vector table + ret + +from_el2_to_el1: + mov x0, (1 << 31) // EL1 uses aarch64 + msr hcr_el2, x0 // msr: Status Register <-- Register (page 1924) + mov x0, 0x3c5 // EL1h (SPSel = 1) with interrupt disabled (D = 1, A = 1, I = 1, F = 1, M[3:0] = 5) + msr spsr_el2, x0 // Save the current processor's state + msr elr_el2, lr // Save the exception return address + eret // return to EL1 (use eret to return from the exception) \ No newline at end of file diff --git a/lab08/kernel/src/bootload.c b/lab08/kernel/src/bootload.c new file mode 100644 index 000000000..9c0e0ae2f --- /dev/null +++ b/lab08/kernel/src/bootload.c @@ -0,0 +1,43 @@ +#include "bootload.h" +#include "mini_uart.h" +#include "io.h" + +// uint64_t* BootHead = (uint64_t*)KernelAddr; +// uint64_t* CopyHead = (uint64_t*)BootAddr; +// uint64_t* bss_end = (uint64_t*)(&__bss_end); + +void reallocate() +{ + uint64_t* BootHead = (uint64_t*)KernelAddr; + uint64_t* CopyHead = (uint64_t*)BootAddr; + uint64_t* bss_end = (uint64_t*)(&__bss_end); + // int i = 0; + while(BootHead != bss_end){ + // printf("\n"); + // printf_hex(i); + // i++; + *CopyHead = *BootHead; + CopyHead++; + BootHead++; + } + printf("\nCopy done."); +} + +void load_kernel() +{ + unsigned int kernel_size = 0; + for(int i=0; i<4; i++){ + kernel_size <<= 8; + kernel_size |= (uart_recv() & 0xff); + } + + printf("\nKernel Size: "); + printf_hex(kernel_size); + printf("\n"); + + unsigned char* kernel = (unsigned char*)(0x80000); + unsigned char* kernel_ptr = kernel; + for(unsigned int i=0; ic_namesize, 16, 8); + int filesize = strtol(head->c_filesize, 16, 8); + + // char *filename = (void*)head + head_size; + char filename[256]; + strncpy(filename, (void*)head + head_size, namesize); + /* The above statement equal to the following: + char filename[256]; + strncpy(filename, (void*)head + head_size, namesize); + + In New ASCII format, the filename is followed by the header + */ + + if(strcmp(filename, "TRAILER!!!") == 0) break; + + printf("\r\n"); + printf(filename); + + uint32_t offset = head_size + namesize; + if(offset % 4 != 0) offset = ((offset/4 +1)*4); + if(filesize % 4 != 0) filesize = (filesize/4 +1)*4; + /* New ASCII format + header size + filename size must be multiple of 4 + filesize must be multiple of 4 + */ + + head = (void*)head + offset + filesize; + /* + Why (void*)head instead of head? + In C, when you add an integer to a pointer, + in this case, + head = head + (offset + filesize)*sizeof(cpio_newc_header) in practical. + But (offset + filesize) is the byte size, not the number of cpio_newc_header. + So, we need to cast head to void* to make it byte size. + */ + } +} + +void cpio_cat(int argc, char **argv) +{ + // printf("\nFilename: "); + // char input_filename[256]; + // readcmd(input_filename); + if(argc < 2){ + printf("\nUsage: cat "); + return; + } + char *input_filename = argv[1]; + +#ifndef QEMU + cpio_newc_header* head = (void*)(uint64_t)CPIO_START_ADDR_FROM_DT; +#else + cpio_newc_header* head = (void*)(uint64_t)CPIO_ADDR; +#endif + + uint32_t head_size = sizeof(cpio_newc_header); + + while(1) + { + int namesize = strtol(head->c_namesize, 16, 8); + int filesize = strtol(head->c_filesize, 16, 8); + + char *filename = (void*)head + head_size; + + uint32_t offset = head_size + namesize; + if(offset % 4 != 0) offset = ((offset/4 +1)*4); + + if(strcmp(filename, "TRAILER!!!") == 0){ + printf("\nFile not found"); + break; + } + else if(strcmp(filename, input_filename) == 0){ + /* The filedata is appended after filename */ + char *filedata = (void*)head + offset; + printf("\n"); + for(int i=0; i"); + return; + } + + char *input_filename = argv[1]; + +#ifndef QEMU + cpio_newc_header* head = (void*)(uint64_t)CPIO_START_ADDR_FROM_DT; +#else + cpio_newc_header* head = (void*)(uint64_t)CPIO_ADDR; +#endif + + uint32_t head_size = sizeof(cpio_newc_header); + while(1) + { + int namesize = strtol(head->c_namesize, 16, 8); + int filesize = strtol(head->c_filesize, 16, 8); + + char *filename = (void*)head + head_size; + + uint32_t offset = head_size + namesize; + if(offset % 4 != 0) offset = ((offset/4 +1)*4); + + if(strcmp(filename, "TRAILER!!!") == 0){ + printf("\nFile not found"); + break; + } + else if(strcmp(filename, input_filename) == 0){ + /* The filedata is appended after filename */ + char *filedata = (void*)head + offset; + char *user_program_addr = (void*)(uint64_t)USER_START_ADDR; + for(int i=0; ic_namesize, 16, 8); + int filesize = strtol((*head)->c_filesize, 16, 8); + // *c_mode = (*head)->c_mode; + + uint32_t head_size = sizeof(cpio_newc_header); + + char *filename = (void*)(*head) + head_size; + *pathname = filename; + + uint32_t offset = head_size + namesize; + if(offset % 4 != 0) offset = ((offset/4 +1)*4); + + if(strcmp(filename, "TRAILER!!!") == 0){ + // do nothing + } + else{ + /* The filedata is appended after filename */ + *filedata = (void*)(*head) + offset; + ret = 0; + } + + if(filesize % 4 != 0) filesize = (filesize/4 +1)*4; + *head = (void*)(*head) + offset + filesize; + return ret; +} + +#ifndef QEMU +void initramfs_callback(char* node_name, char* property_name, fdt_prop* prop) +{ + // reference: https://stackoverflow.com/questions/73974443/how-does-the-linux-kernel-know-about-the-initrd-when-booting-with-a-device-tree + if((strcmp(node_name, "chosen") == 0) && (strcmp(property_name, "linux,initrd-start") == 0)){ + void *data = (void*)prop + sizeof(fdt_prop); + CPIO_START_ADDR_FROM_DT = endian_swap(*(uint32_t*)data); + printf("\nInitramfs Start Address from DT: "); + printf_hex(CPIO_START_ADDR_FROM_DT); + } + if((strcmp(node_name, "chosen") == 0) && (strcmp(property_name, "linux,initrd-end") == 0)){ + void *data = (void*)prop + sizeof(fdt_prop); + CPIO_END_ADDR_FROM_DT = endian_swap(*(uint32_t*)data); + printf("\nInitramfs End Address from DT: "); + printf_hex(CPIO_END_ADDR_FROM_DT); + } +} +#endif \ No newline at end of file diff --git a/lab08/kernel/src/dev_framebuffer.c b/lab08/kernel/src/dev_framebuffer.c new file mode 100644 index 000000000..ba0745f86 --- /dev/null +++ b/lab08/kernel/src/dev_framebuffer.c @@ -0,0 +1,134 @@ +#include "vfs.h" +#include "dev_framebuffer.h" +#include "io.h" +#include "alloc.h" +#include "mailbox.h" +#include "peripherals/mailbox.h" +#include "string.h" + + +extern void disable_irq(); +extern void enable_irq(); + +//The following code is for mailbox initialize used in lab7. +unsigned int width, height, pitch, isrgb; /* dimensions and channel order */ +unsigned char *lfb; /* raw frame buffer address */ + +struct file_operations dev_framebuffer_operations = { + dev_framebuffer_write, + 0, // read + dev_framebuffer_open, + dev_framebuffer_close, + 0, // getsize + dev_framebuffer_lseek64 +}; + +unsigned int __attribute__((aligned(16))) mbox_s[36]; + +int dev_framebuffer_register() +{ + printf("Registering framebuffer device..."); + //The following code is for mailbox initialize used in lab7. + mbox_s[0] = 35 * 4; + mbox_s[1] = TAG_REQUEST_CODE; + + mbox_s[2] = 0x48003; // set phy wh + mbox_s[3] = 8; + mbox_s[4] = 8; + mbox_s[5] = 1024; // FrameBufferInfo.width + mbox_s[6] = 768; // FrameBufferInfo.height + + mbox_s[7] = 0x48004; // set virt wh + mbox_s[8] = 8; + mbox_s[9] = 8; + mbox_s[10] = 1024; // FrameBufferInfo.virtual_width + mbox_s[11] = 768; // FrameBufferInfo.virtual_height + + mbox_s[12] = 0x48009; // set virt offset + mbox_s[13] = 8; + mbox_s[14] = 8; + mbox_s[15] = 0; // FrameBufferInfo.x_offset + mbox_s[16] = 0; // FrameBufferInfo.y.offset + + mbox_s[17] = 0x48005; // set dembox_sh + mbox_s[18] = 4; + mbox_s[19] = 4; + mbox_s[20] = 32; // FrameBufferInfo.dembox_sh + + mbox_s[21] = 0x48006; // set pixel order + mbox_s[22] = 4; + mbox_s[23] = 4; + mbox_s[24] = 1; // RGB, not BGR preferably + + mbox_s[25] = 0x40001; // get framebuffer, gets alignment on request + mbox_s[26] = 8; + mbox_s[27] = 8; + mbox_s[28] = 4096; // FrameBufferInfo.pointer + mbox_s[29] = 0; // FrameBufferInfo.size + + mbox_s[30] = 0x40008; // get pitch + mbox_s[31] = 4; + mbox_s[32] = 4; + mbox_s[33] = 0; // FrameBufferInfo.pitch + + mbox_s[34] = MBOX_TAG_LAST; + + // this might not return exactly what we asked for, could be + // the closest supported resolution instead + if (mailbox_call_s(MBOX_CH_PROP, mbox_s) && mbox_s[20] == 32 && mbox_s[28] != 0) + { + mbox_s[28] &= 0x3FFFFFFF; // convert GPU address to ARM address + width = mbox_s[5]; // get actual physical width + height = mbox_s[6]; // get actual physical height + pitch = mbox_s[33]; // get number of bytes per line + isrgb = mbox_s[24]; // get the actual channel order + lfb = ((void *)((unsigned long)mbox_s[28])); // raw frame buffer address + } + else + { + printf("Unable to set screen resolution to 1024x768x32\n"); + } + + return register_dev(&dev_framebuffer_operations); +} + +int dev_framebuffer_write(struct file *file, const void *buf, size_t len) +{ + enable_irq(); + if (len + file->f_pos > pitch * height) + { + printf("\r\n[ERROR] Invlaid Write framebuffer!"); + len = pitch * height - file->f_pos; + } + for(int i=0; if_pos))[i] = ((char*)buf)[i]; + } + file->f_pos += len; + disable_irq(); + return len; +} + +int dev_framebuffer_open(struct vnode *file_node, struct file **target) +{ + printf("\r\n[INFO] Opening framebuffer device..."); + (*target)->f_pos = 0; + (*target)->vnode = file_node; + (*target)->f_ops = &dev_framebuffer_operations; + return 0; +} + +int dev_framebuffer_close(struct file *file) +{ + dfree(file); + return 0; +} + +long dev_framebuffer_lseek64(struct file *file, long offset, int whence) +{ + if (whence == SEEK_SET) + { + file->f_pos = offset; + return file->f_pos; + } + return -1; +} diff --git a/lab08/kernel/src/dev_uart.c b/lab08/kernel/src/dev_uart.c new file mode 100644 index 000000000..d0eddfab8 --- /dev/null +++ b/lab08/kernel/src/dev_uart.c @@ -0,0 +1,58 @@ +#include "dev_uart.h" +#include "mini_uart.h" +#include "alloc.h" + +struct file_operations dev_file_operations = { + dev_uart_write, + dev_uart_read, + dev_uart_open, + dev_uart_close, + 0 // getsizeq +}; + + +int dev_uart_register() +{ + uart_send_string("\r\n[INFO] Registering uart device..."); + return register_dev(&dev_file_operations); +} + +int dev_uart_write(struct file *file, const void *buf, size_t len) +{ + uart_send_string("\r\n[INFO] Writing to console..."); + const char *cbuf = buf; + for (int i = 0; i < len;i++) + { + uart_send(cbuf[i]); + } + return len; +} + +int dev_uart_read(struct file *file, void *buf, size_t len) +{ + uart_send_string("\r\n[INFO] Reading from uart..."); + for (int i = 0; i < len; i++) + { + ((char*)buf)[i] = uart_recv(); + } + return len; +} + +int dev_uart_open(struct vnode *file_node, struct file **target) +{ + uart_send_string("\r\n[INFO] Opening uart device..."); + (*target)->vnode = file_node; + (*target)->f_ops = &dev_file_operations; + return 0; +} + +int dev_uart_close(struct file *file) +{ + dfree(file); + return 0; +} + +int dev_uart_op_deny() +{ + return -1; +} diff --git a/lab08/kernel/src/devicetree.c b/lab08/kernel/src/devicetree.c new file mode 100644 index 000000000..cfb61bfe8 --- /dev/null +++ b/lab08/kernel/src/devicetree.c @@ -0,0 +1,94 @@ +#include "devicetree.h" +#include "string.h" +#include "io.h" +#include "type.h" + +void fdt_traverse(void(*callback_func)(char*, char*, fdt_prop*)) +{ + fdt_header *dt_header = (fdt_header*)(*DTB_ADDR); + printf("\nDTB Address (Function): "); + printf_hex((uint64_t)(void*)(dt_header)); + + uint32_t dt_struct_off = endian_swap(dt_header->off_dt_struct); + uint32_t dt_string_off = endian_swap(dt_header->off_dt_strings); + + void* dt_struct_addr = (void*)*DTB_ADDR + dt_struct_off; + char* dt_string_addr = (void*)*DTB_ADDR + dt_string_off; + + + printf("\nDT String Address: "); + printf_hex((uint64_t)(void*)dt_string_addr); + printf("\nDT Struct Address: "); + printf_hex((uint64_t)(void*)dt_struct_addr); + + printf("\nMagic: "); + printf_hex(endian_swap(dt_header->magic)); + if(dt_header->magic == (uint32_t)0xd00dfeed) + { + printf("Magic Failed\n"); + return; + } + + + char* node_name; + char* prop_name; + + while(1) + { + uint32_t token = endian_swap((*(uint32_t*)dt_struct_addr)); + + switch (token) + { + case FDT_BEGIN_NODE: // It shall be followed by the node’s unit name as extra data. + { + node_name = (char*)dt_struct_addr + 4; // tage size is 32bits = 4bytes + uint32_t size = strlen(node_name); // size of node name + uint32_t offset = 4 + size + 1; + + if(offset % 4 !=0) offset = ((offset/4 + 1)*4); // align to 4bytes (32bits) + dt_struct_addr = dt_struct_addr + offset; + + break; + } + case FDT_END_NODE: //This token has no extra data; so it is followed immediately by the next token + { + dt_struct_addr = dt_struct_addr + 4; break; + } + case FDT_PROP: + { + fdt_prop* prop_ptr = (fdt_prop*)(dt_struct_addr + 4); + uint32_t offset = 4 + sizeof(fdt_prop) + endian_swap(prop_ptr->len); + + if(offset % 4 != 0) offset = ((offset/4 + 1)*4); + dt_struct_addr = dt_struct_addr + offset; + + prop_name = (void*)dt_string_addr + endian_swap(prop_ptr->nameoff); + + callback_func(node_name, prop_name, prop_ptr); + + break; + } + case FDT_NOP: + { + dt_struct_addr = dt_struct_addr + 4; break; + } + case FDT_END: + { + dt_struct_addr = dt_struct_addr + 4; break; + } + default: + return; + } + } + +} + +// big endian to little endian +uint32_t endian_swap(uint32_t value) +{ + uint32_t ret = 0; + uint8_t* ptr = (void*)&value; + ret = (ptr[0] << 24) | (ptr[1] << 16) | (ptr[2] << 8) | ptr[3]; + return ret; +} + diff --git a/lab08/kernel/src/entry.S b/lab08/kernel/src/entry.S new file mode 100644 index 000000000..8d7d4fd22 --- /dev/null +++ b/lab08/kernel/src/entry.S @@ -0,0 +1,235 @@ +#include "entry.h" +#include "sys.h" +#include "peripherals/irq.h" + +.section ".text" + +.global set_exception_vector_table + + +// save general registers to stack +.macro save_all el + //bl save_all_debug + sub sp, sp, 16*17 + stp x0, x1, [sp ,16 * 0] // storing the contents of x0 and x1 to the address pointed by the stack pointer sp with an offset of 16 bytes + stp x2, x3, [sp ,16 * 1] // stp: Store Pair and it's used to store a pair of 64-bit (8-byte) registers to memory + stp x4, x5, [sp ,16 * 2] + stp x6, x7, [sp ,16 * 3] + stp x8, x9, [sp ,16 * 4] + stp x10, x11, [sp ,16 * 5] + stp x12, x13, [sp ,16 * 6] + stp x14, x15, [sp ,16 * 7] + stp x16, x17, [sp ,16 * 8] + stp x18, x19, [sp ,16 * 9] + stp x20, x21, [sp ,16 * 10] + stp x22, x23, [sp ,16 * 11] + stp x24, x25, [sp ,16 * 12] + stp x26, x27, [sp ,16 * 13] + stp x28, x29, [sp ,16 * 14] + + .if \el == 0 // using two distinct stack pointers for EL0 and EL1 + mrs x21, sp_el0 + .else + add x21, sp, 16*17 // using the same stack pointer for EL1 & sp will be switched by the cpu_switch_to function + .endif + + mrs x22, elr_el1 + mrs x23, spsr_el1 + + stp x30, x21, [sp ,16 * 15] + stp x22, x23, [sp ,16 * 16] +.endm + +// load general registers from stack +.macro load_all el + //bl load_all_debug + ldp x22, x23, [sp ,16 * 16] + ldp x30, x21, [sp ,16 * 15] + + .if \el == 0 + msr sp_el0, x21 + .endif + + msr elr_el1, x22 + msr spsr_el1, x23 + + ldp x0, x1, [sp ,16 * 0] + ldp x2, x3, [sp ,16 * 1] + ldp x4, x5, [sp ,16 * 2] + ldp x6, x7, [sp ,16 * 3] + ldp x8, x9, [sp ,16 * 4] + ldp x10, x11, [sp ,16 * 5] + ldp x12, x13, [sp ,16 * 6] + ldp x14, x15, [sp ,16 * 7] + ldp x16, x17, [sp ,16 * 8] + ldp x18, x19, [sp ,16 * 9] + ldp x20, x21, [sp ,16 * 10] + ldp x22, x23, [sp ,16 * 11] + ldp x24, x25, [sp ,16 * 12] + ldp x26, x27, [sp ,16 * 13] + ldp x28, x29, [sp ,16 * 14] + ldr x30, [sp, 16 * 15] + add sp, sp, 16*17 +.endm + +.macro ventry label + b \label // branch to a handler function. + .align 7 // entry size is 0x80, .align will pad 0 +.endm + + +.global exception_vector_table +.align 11 // vector table should be aligned to 0x800 (2^11 = 0x1000_0000_0000 = 0x800) +exception_vector_table: + + //========================================================== + // Exception from the current EL while using SP_EL0 (exception level not changed) + + ventry SYNC_EL1T /* Synchronous EL1t */ + ventry IRQ_EL1T /* IRQ or vIRQ EL1t */ + ventry FIQ_EL1T /* FIQ or vFIQ EL1t */ + ventry SERROR_EL1T /* SError or vSError EL1t */ + + + //========================================================== + // Exception from the current EL while using SP_ELx (exception level not changed) + + ventry SYNC_EL1H /* Synchronous EL1h */ + ventry EL1_IRQ /* IRQ or vIRQ EL1h */ + ventry FIQ_EL1H /* FIQ or vFIQ EL1h */ + ventry SERROR_EL1H /* SError or vSError EL1h */ + + //========================================================== + // Exception from a lower EL and all lower ELs are AArch64 (Moves to higher exception level) + + ventry EL0_SYNC /* Synchronous EL0t */ + ventry EL0_IRQ /* IRQ or vIRQ EL0t */ + ventry FIQ_64_EL0T /* FIQ or vFIQ EL0t */ + ventry SERROR_64_EL0T /* SError or vSError EL0t */ + //========================================================== + // Exception from a lower EL and all lower ELs are AArch32 Moves to higher exception level + + ventry SYNC_32_EL0T /* Synchronous 32-bit EL0t */ + ventry IRQ_32_EL0T /* IRQ or vIRQ 32-bit EL0t */ + ventry FIQ_32_EL0T /* FIQ or vFIQ 32-bit EL0t */ + ventry SERROR_32_EL0T /* SError or vSError 32-bit EL0t */ + + +.macro handle_invalid_entry el, type + save_all \el + mov x0, #\type + mrs x1, spsr_el1 + mrs x2, elr_el1 + mrs x3, esr_el1 + bl invalid_exception_entry + b error_hang +.endm + +SYNC_EL1T: + handle_invalid_entry 1, SYNC_INVALID_EL1t + +IRQ_EL1T: + handle_invalid_entry 1, IRQ_INVALID_EL1t + +FIQ_EL1T: + handle_invalid_entry 1, FIQ_INVALID_EL1t + +SERROR_EL1T: + handle_invalid_entry 1, ERROR_INVALID_EL1t + +SYNC_EL1H: + handle_invalid_entry 1, SYNC_INVALID_EL1h + +EL1_IRQ: + save_all 1 + bl irq_handler + load_all 1 + eret + +FIQ_EL1H: + handle_invalid_entry 1, FIQ_INVALID_EL1h + +SERROR_EL1H: + handle_invalid_entry 1, ERROR_INVALID_EL1h + +EL0_SYNC: //[TODO] + save_all 0 + mrs x25, esr_el1 + lsr x24, x25, #ESR_ELx_EC_SHIFT + cmp x24, #ESR_ELx_EC_SVC64 // check if the exception is a system call + b.eq el0_svc + handle_invalid_entry 0, SYNC_ERROR // if not a system call, handle the exception + +EL0_IRQ: + save_all 0 + bl irq_handler + load_all 0 + eret + +FIQ_64_EL0T: + handle_invalid_entry 0, FIQ_INVALID_EL0_64 + +SERROR_64_EL0T: + handle_invalid_entry 0, ERROR_INVALID_EL0_64 + +SYNC_32_EL0T: + handle_invalid_entry 0, SYNC_INVALID_EL0_32 + +IRQ_32_EL0T: + handle_invalid_entry 0, IRQ_INVALID_EL0_32 + +FIQ_32_EL0T: + handle_invalid_entry 0, FIQ_INVALID_EL0_32 + +SERROR_32_EL0T: + handle_invalid_entry 0, ERROR_INVALID_EL0_32 + + +// creates alias +sc_nr .req x25 // number of system calls +scno .req x26 // syscall number +stbl .req x27 // syscall table pointer + +.global from_el1_to_el0 +from_el1_to_el0: + mov x2, 0x3c0 + msr spsr_el1, x2 + msr sp_el0, x1 // pass the stack pointer address from arg + msr elr_el1, x0 // pass the program's start address from arg + eret + +.global ret_from_fork // entry point for executing the process +ret_from_fork: + bl schedule_tail // preemptive enable + cbz x19, ret_to_user + mov x0, x20 + blr x19 //should never return, except for kp_to_user + +ret_to_user: + bl disable_irq + load_all 0 + eret + +el0_svc: + adr stbl, sys_call_table // load syscall table pointer + uxtw scno, w8 // syscall number in w8, uxtw: Unsigned Extend Word + mov sc_nr, #__NR_syscalls + bl enable_irq + cmp scno, sc_nr // check upper syscall limit + b.hs ni_sys // hs: higher or same + + ldr x16, [stbl, scno, lsl #3] // address in the syscall table, x16 = stbl[scno] + blr x16 // call sys_* routine + b ret_from_syscall + +ret_from_syscall: + bl disable_irq + str x0, [sp, #S_X0] // returned x0 (overwritten the original x0 value on the stack) + load_all 0 + eret + +ni_sys: + handle_invalid_entry 0, SYSCALL_ERROR + +error_hang: + b error_hang \ No newline at end of file diff --git a/lab08/kernel/src/fork.c b/lab08/kernel/src/fork.c new file mode 100644 index 000000000..7fb5c823f --- /dev/null +++ b/lab08/kernel/src/fork.c @@ -0,0 +1,148 @@ +#include "fork.h" +#include "alloc.h" +#include "schedule.h" +#include "io.h" +#include "mm.h" +#include "vfs.h" +#include "string.h" + +extern void ret_from_fork(void); +extern int nr_tasks; +extern struct task_struct * task[NR_TASKS]; +extern void memzero(unsigned long begin, unsigned long len); + +int copy_process( + unsigned long flags, + unsigned long fn, + unsigned long arg, + unsigned long stack) +{ + preempt_disable(); + struct task_struct *p; + + int pid = -1; + for(pid = 0; pid< NR_TASKS; pid++) + if(task[pid] == NULL) break; + if(pid == -1) + { + printf("\r\n[ERROR] Thread limit exceeded"); + goto finish; + } + // p = (struct task_struct *) balloc(sizeof(struct task_struct)); + p = (struct task_struct *) balloc(THREAD_SIZE); + printf("\r\n[INFO] Process allocated at "); printf_hex((unsigned long)p); + if (!p) + return -1; + + struct pt_regs *childregs = task_pt_regs(p); + memzero_asm((unsigned long)childregs, sizeof(struct pt_regs)); + memzero_asm((unsigned long)&p->cpu_context, sizeof(struct cpu_context)); + + // clear the file descriptor table + p->fd_table.count = 0; + for(int i=0; ifd_table.fds[i] = NULL; + + // create stdin, stdout, stderr + // p->fd_table.fds[0] = (struct file*)dynamic_alloc(sizeof(struct file)); + // p->fd_table.fds[1] = (struct file*)dynamic_alloc(sizeof(struct file)); + // p->fd_table.fds[2] = (struct file*)dynamic_alloc(sizeof(struct file)); + vfs_open("/dev/uart", O_RW, &p->fd_table.fds[0]); + vfs_open("/dev/uart", O_RW, &p->fd_table.fds[1]); + vfs_open("/dev/uart", O_RW, &p->fd_table.fds[2]); + // printf("\r\n[INFO] File descriptor table created"); + // printf("\r\n[INFO] File descriptor 0: "); printf_hex((unsigned long)p->fd_table.fds[0]); + // printf("\r\n[INFO] File descriptor 1: "); printf_hex((unsigned long)p->fd_table.fds[1]); + // printf("\r\n[INFO] File descriptor 2: "); printf_hex((unsigned long)p->fd_table.fds[2]); + + if(flags & PF_KTHREAD) // is a kernel thread + { + p->cpu_context.x19 = fn; + p->cpu_context.x20 = arg; + } + else + { + struct pt_regs *cur_regs = task_pt_regs(current); + + // copy the current process state to the new process + for(int i=0; iregs[0] = 0; // child process return value + // next sp for the new task is set to the top of the new user stack + // save the stack pointer to cleanup the stack when task finishes + unsigned long stack_used = current->stack + THREAD_SIZE - cur_regs->sp; + + // copy the stack to the new process + childregs->sp = stack + THREAD_SIZE - stack_used; + for(int i=0; isp)[i] = ((char*)cur_regs->sp)[i]; + + p->stack = stack; + + // copy the file descriptor table + p->fd_table.count = current->fd_table.count; + for(int i=0; ifd_table.fds[i] != NULL){ + p->fd_table.fds[i] = (struct file *)dynamic_alloc(sizeof(struct file)); + p->fd_table.fds[i] = current->fd_table.fds[i]; + } + } + } + p->flags = flags; + p->priority = current->priority; + p->state = TASK_RUNNING; + p->counter = p->priority; + p->preempt_count = 1; //disable preemtion until schedule_tail + strcpy(p->cwd, current->cwd); + + + p->cpu_context.pc = (unsigned long)ret_from_fork; // for the first time, pc is set to ret_from_fork + p->cpu_context.sp = (unsigned long)childregs; + + task[pid] = p; + p->pid = pid; + printf("\r\n[INFO] Process created with pid: "); printf_int(pid); +finish: + preempt_enable(); + return pid; +} + +int move_to_user_mode(unsigned long pc) +{ + struct pt_regs *regs = task_pt_regs(current); // get current process state + // memzero_asm((unsigned long)regs, sizeof(struct pt_regs)); + + regs->pc = pc; // point to the function that need to be executed in user mode + regs->pstate = PSR_MODE_EL0t; // EL0t is user state + + unsigned long stack = (unsigned long)balloc(THREAD_SIZE); //allocate new user stack + memzero_asm(stack, THREAD_SIZE); + + if (!stack) { // if stack allocation failed + return -1; + } + + // allocate stack for user process + // set sp to the top of the stack + regs->sp = stack + THREAD_SIZE; + current->stack = stack; + return 0; +} + + +// calculate the location of pt_regs in the task_struct +// task_struct is allocated at the end of the stack +// pt_regs is allocated at the top of the task_struct +struct pt_regs * task_pt_regs(struct task_struct *tsk){ + unsigned long p = (unsigned long)tsk + THREAD_SIZE - sizeof(struct pt_regs); + return (struct pt_regs *)p; +} + +void kp_user_mode(unsigned long func){ // Kernel process(func pass by argu) to user mode + printf("\r\nKernel process started. Switching to user mode..."); + int err = move_to_user_mode(func); + if (err < 0){ + printf("Error while moving process to user mode\n\r"); + } +} diff --git a/lab08/kernel/src/initramfs.c b/lab08/kernel/src/initramfs.c new file mode 100644 index 000000000..3e05dd72a --- /dev/null +++ b/lab08/kernel/src/initramfs.c @@ -0,0 +1,256 @@ +#include "initramfs.h" +#include "alloc.h" +#include "errno.h" +#include "io.h" +#include "string.h" +#include "lib.h" +#include "cpio.h" + +#define min(a, b) ((a) < (b) ? (a) : (b)) + +struct vnode_operations *initramfs_v_ops; +struct file_operations *initramfs_f_ops; + + +static struct vnode* initramfs_create_vnode(const char *name, int type, struct vnode *parent); +static int isFileInSubDir(const char* pathname); + +int initramfs_setup_mount(struct filesystem* fs, struct mount **mount) // mount the filesystem to the mount point +{ + (*mount)->fs = fs; + (*mount)->root = initramfs_create_vnode("/", DIR_NODE, NULL); + +#ifndef QEMU + cpio_newc_header* head = (void*)(uint64_t)CPIO_START_ADDR_FROM_DT; +#else + cpio_newc_header* head = (void*)(uint64_t)CPIO_ADDR; +#endif + // vfs_chdir("/initramfs"); + while(1) + { + char* pathname; + char* filedata; + int filesize = strtol(head->c_filesize, 16, 8); + char c_mode[5]; + strncpy(c_mode, head->c_mode, 5); + int ret = cpio_newc_parser(&head, &pathname, &filedata); + if(ret == 1)break; + if(filesize > INITRAMFS_MAX_FILE){ + printf("\r\n[SYSTEM INFO] File: "); printf(pathname); printf(" is too large to fit in initramfs"); + continue; + } + // printf("\r\n[INITRAMFS INFO] Mount Archive: "); printf(pathname); printf("\t, cmode: "); printf(c_mode); + struct initramfs_internal *root_internal = (struct initramfs_internal*)(*mount)->root->internal; + + if(!strcmp(c_mode, "00008")){ // file + if(!strcmp(pathname, ".") || !strcmp(pathname, "..") || isFileInSubDir(pathname))continue; + struct vnode *filevnode = initramfs_create_vnode(pathname, FILE_NODE, (*mount)->root); + struct initramfs_internal *fileinode = (struct initramfs_internal*)filevnode->internal; + strncpy(fileinode->data, filedata, filesize); + fileinode->size = 0; + fileinode->filesize = filesize; + root_internal->children[root_internal->size++] = filevnode; + printf("\r\n[INITRAMFS INFO] Mount Archive: "); printf(pathname); + for(int i=0; i<10-strlen(pathname); i++) printf(" "); + printf("\t, cmode: "); printf(c_mode); + printf("\t, size: "); printf_hex(filesize); + } + else if(!strcmp(c_mode, "00004")){ // directory + // cannot create directory in initramfs + } + else{ + printf("\r\n[ERROR] Unsupported file type"); + return -1; + } + } + printf("\r\n[INITRAMFS INFO] Mounting complete"); + + return 0; +} + +static struct vnode* initramfs_create_vnode(const char *name, int type, struct vnode *parent) +{ + struct initramfs_internal *internal = (struct initramfs_internal*)dynamic_alloc(sizeof(struct initramfs_internal)); + + if(sizeof(name) > COMPONENT_SIZE){ + printf("\r\n[ERROR] File name too long"); + return NULL; + } + internal->name = (char*)dynamic_alloc(COMPONENT_SIZE); + strcpy(internal->name, name); + internal->size = 0; + if(type == FILE_NODE){ + internal->data = (char*)balloc(INITRAMFS_MAX_FILE); + } + else{ + internal->data = NULL; + } + internal->type = type; + // internal->parent = parent; + // internal->next = NULL; + for(int i=0; ichildren[i] = NULL; + } + struct vnode *vnode = (struct vnode*)dynamic_alloc(sizeof(struct vnode)); + vnode->parent = parent; + vnode->mount = NULL; + vnode->v_ops = initramfs_v_ops; + vnode->f_ops = initramfs_f_ops; + vnode->internal = internal; + return vnode; +} + +int initramfs_register() +{ + // check if tmpfs already registered + int i=0; + for(; ilookup = initramfs_lookup; + initramfs_v_ops->list = initramfs_list; + initramfs_v_ops->create = initramfs_create; + initramfs_v_ops->mkdir = initramfs_mkdir; + + initramfs_f_ops->open = initramfs_open; + initramfs_f_ops->read = initramfs_read; + initramfs_f_ops->write = initramfs_write; + initramfs_f_ops->close = initramfs_close; + initramfs_f_ops->getsize = initramfs_getsize; + initramfs_f_ops->lseek64 = NULL; + + return 0; +} + +int initramfs_list(struct vnode* dir_node) +{ + // 1. List all the files in the directory + // 2. Return error code if fails + + printf("\r\n[INITRAMFS LIST]"); + struct initramfs_internal *internal = (struct initramfs_internal*)dir_node->internal; + + if(internal->type == FILE_NODE){ + printf("\r\n[ERROR] Cannot list in a file"); + return LERROR; + } + + printf("\r\nName \tType"); + printf("\r\n-----------------------"); + for(int i=0; isize; i++){ + struct initramfs_internal *child_internal = (struct initramfs_internal*)internal->children[i]->internal; + printf("\r\n"); printf(child_internal->name); for(int j=0; j<15-strlen(child_internal->name); j++) printf(" "); + printf("\t"); printf(child_internal->type == FILE_NODE ? "FILE" : "DIR"); + } + return 0; +} + +int initramfs_lookup(struct vnode* dir_node, struct vnode** target, const char* component_name) +{ + // 1. Lookup the vnode in the directory + // 2. Return error code if fails + struct initramfs_internal *internal = (struct initramfs_internal*)dir_node->internal; + if(internal->type == FILE_NODE){ + printf("\r\n[ERROR] Cannot lookup in a file"); + return LERROR; + } + + for(int i=0; ichildren[i]->internal; + if(internal->children[i] != NULL && !strcmp(child_internal->name, component_name)){ + *target = internal->children[i]; + return 0; + } + } + // printf("[ERROR] File not found\n"); + return LERROR; +} + +int initramfs_mkdir(struct vnode* dir_node, struct vnode** target, const char* component_name) +{ + // Alawys return -1 because we are not implementing mkdir in initramfs + return -1; +} + +int initramfs_create(struct vnode* dir_node, struct vnode** target, const char* component_name) +{ + // Alawys return -1 because we are not implementing create in initramfs + return -1; +} + +int initramfs_close(struct file* file) +{ + // 1. release the file handle + // 2. Return error code if fails + if(file == NULL){ + printf("\r\n[ERROR] File pointer cannot be NULL"); + return CERROR; + } + return 0; // vfs_close will free the file pointer +} + +int initramfs_open(struct vnode* file_node, struct file** target) +{ + // 1. Allocate file handle + // 2. Return error code if fails + struct file *file = (struct file*)dynamic_alloc(sizeof(struct file)); + file->vnode = file_node; + file->f_pos = 0; + *target = file; + return 0; +} + +int initramfs_read(struct file* file, void* buf, size_t len) +{ + struct vnode *vnode = file->vnode; + struct initramfs_internal *internal = (struct initramfs_internal*)vnode->internal; + if(internal->type == DIR_NODE){ + printf("\r\n[ERROR] Cannot read a directory"); + return RERROR; + } + + size_t readable_size = min(len, internal->filesize - file->f_pos); + + // memory copy + for(int i=0; idata[file->f_pos + i]; + } + file->f_pos += readable_size; + return readable_size; +} + +int initramfs_write(struct file* file, const void* buf, size_t len) +{ + //cannot write on initframfs + return -1; +} + + +int initramfs_getsize(struct vnode* vnode) +{ + struct initramfs_internal *internal = (struct initramfs_internal*)vnode->internal; + return internal->filesize; +} + +static int isFileInSubDir(const char* pathname) +{ + for(int i=0; i=0; i-=4){ + int tmp = (td >> i) & 0xf; + if(tmp < 10){ + printfc('0'+tmp); + } + else{ + printfc('a'+tmp-10); + } + } +} + +void printf_int(const int d) +{ + int td = d; + if(td < 0){ + printf("-"); + td = -td; + } + if(td == 0){ + printf("0"); + return; + } + int digits[10]; + int cnt = 0; + while(td > 0){ + digits[cnt++] = td % 10; + td /= 10; + } + for(int i=cnt-1; i>=0; i--){ + printfc('0'+digits[i]); + } +} + +char read_char() +{ + char c = uart_recv(); + return c; +} diff --git a/lab08/kernel/src/irq.S b/lab08/kernel/src/irq.S new file mode 100644 index 000000000..ee0531406 --- /dev/null +++ b/lab08/kernel/src/irq.S @@ -0,0 +1,11 @@ +.section ".text" + +.global enable_irq +enable_irq: + msr daifclr, 0xf + ret + +.global disable_irq +disable_irq: + msr daifset, 0xf + ret \ No newline at end of file diff --git a/lab08/kernel/src/irq.c b/lab08/kernel/src/irq.c new file mode 100644 index 000000000..21d7686f1 --- /dev/null +++ b/lab08/kernel/src/irq.c @@ -0,0 +1,84 @@ +#include "peripherals/irq.h" +#include "peripherals/mini_uart.h" + +#include "irq.h" +#include "io.h" + +extern void enable_irq(); +extern void disable_irq(); +extern void irq_timer_handler(); + +static char *entry_error_messages[] = { + "SYNC_INVALID_EL1t", + "IRQ_INVALID_EL1t", + "FIQ_INVALID_EL1t", + "ERROR_INVALID_EL1T", + + "SYNC_INVALID_EL1h", + "IRQ_INVALID_EL1h", + "FIQ_INVALID_EL1h", + "ERROR_INVALID_EL1h", + + "SYNC_INVALID_EL0_64", + "IRQ_INVALID_EL0_64", + "FIQ_INVALID_EL0_64", + "ERROR_INVALID_EL0_64", + + "SYNC_INVALID_EL0_32", + "IRQ_INVALID_EL0_32", + "FIQ_INVALID_EL0_32", + "ERROR_INVALID_EL0_32", + + "SYNC_ERROR", + "SYSCALL_ERROR" +}; + +static void show_debug_msg(int type, unsigned long spsr, unsigned long elr, unsigned long esr) +{ + printf("\r\n"); + printf(entry_error_messages[type]); + printf(", SPSR: "); + printf_hex(spsr); + printf(", ELR: "); + printf_hex(elr); + printf(", ESR: "); + printf_hex(esr); +} + +void irq_handler(int type, unsigned long spsr, unsigned long elr, unsigned long esr) +{ + disable_irq(); + + unsigned int irq = *CORE0_IRQ_SOURCE; + switch(irq) + { + case SYSTEM_TIMER_IRQ_1: + irq_timer_handler(); + break; + default: + printf("\r\nUnknown irq: "); + printf_hex(irq); + break; + } + enable_irq(); +} + +void invalid_exception_entry(int type, unsigned long spsr, unsigned long elr, unsigned long esr) +{ + + show_debug_msg(type, spsr, elr, esr); +} + +// void el0_irq_entry(int type, unsigned long spsr, unsigned long elr, unsigned long esr) +// { +// disable_irq(); +// show_debug_msg(type, spsr, elr, esr); +// enable_irq(); +// } + +void svc_exception_entry(int type, unsigned long spsr, unsigned long elr, unsigned long esr) +{ + disable_irq(); + show_debug_msg(type, spsr, elr, esr); + enable_irq(); +} diff --git a/lab08/kernel/src/kernel_main.c b/lab08/kernel/src/kernel_main.c new file mode 100644 index 000000000..fa338c83a --- /dev/null +++ b/lab08/kernel/src/kernel_main.c @@ -0,0 +1,54 @@ +#include "io.h" +#include "fork.h" +#include "schedule.h" + +extern void shell_loop(); +extern void frame_init_with_reserve(); +extern void memory_pool_init(); +extern void mem_init(); +extern void uart_init(); +extern void timer_init(); +extern void enable_irq(); +extern void initramfs_callback(void*); +extern void rootfs_init(); + +#ifndef QEMU +extern void fdt_traverse(void (*callback)(void*)); +#endif + +static void multiple_init(); + +extern struct task_struct *current; + +int main() +{ + multiple_init(); + enable_irq(); + +#ifndef QEMU + fdt_traverse(initramfs_callback); +#endif + frame_init_with_reserve(); + + rootfs_init(); + + printf("\nWelcome to Yuchang's Raspberry Pi 3!\n"); + + // copy_process((unsigned long)(void*)&shell_loop, 0); + copy_process(PF_KTHREAD, (unsigned long)(void*)&shell_loop, 0, 0); + + while(1){ + kill_zombies(); + schedule(); + } + return 0; +} + +static void multiple_init() +{ + mem_init(); + uart_init(); + memory_pool_init(); + timer_init(); + // rootfs_init(); +} \ No newline at end of file diff --git a/lab08/kernel/src/lib.c b/lab08/kernel/src/lib.c new file mode 100644 index 000000000..82bff2bfa --- /dev/null +++ b/lab08/kernel/src/lib.c @@ -0,0 +1,87 @@ +#include "lib.h" +#include "io.h" + +uint32_t strtol(const char *sptr, uint32_t base, int size) +{ + uint32_t ret = 0; + int i=0; + + while((sptr[i] != '\0') && (i= '0' && sptr[i] <= '9'){ + ret = ret * 16 + (sptr[i] - '0'); + } + else if(sptr[i] >= 'a' && sptr[i] <= 'f'){ + ret = ret * 16 + (sptr[i] - 'a' + 10); + } + else if(sptr[i] >= 'A' && sptr[i] <= 'F'){ + ret = ret * 16 + (sptr[i] - 'A' + 10); + } + else{ + break; + } + } + else if(base == 8 || base == 2){ + if(sptr[i] >= '0' && sptr[i] <= '9'){ + ret = ret * base + (sptr[i] - '0'); + } + else{ + break; + } + } + i++; + } + return ret; +} + +uint64_t atoi(const char *str) +{ + uint64_t ret = 0; + int i=0; + while(str[i] != '\0' && (str[i] >= '0' && str[i] <= '9')){ + ret = ret * 10 + (str[i] - '0'); + i++; + } + return ret; +} + +uint64_t atoi_hex(const char *str) +{ + uint64_t ret = 0; + int i=0; + while(str[i] != '\0'){ + if(str[i] >= '0' && str[i] <= '9'){ + ret = ret * 16 + (str[i] - '0'); + } + else if(str[i] >= 'a' && str[i] <= 'f'){ + ret = ret * 16 + (str[i] - 'a' + 10); + } + else if(str[i] >= 'A' && str[i] <= 'F'){ + ret = ret * 16 + (str[i] - 'A' + 10); + } + else{ + break; + } + i++; + } + return ret; +} + +uint64_t pow(int base, int exp) +{ + uint64_t ret = 1; + while(exp-- > 0){ + ret *= base; + } + return ret; +} + +void assert(int condition, char* message) +{ + if(!condition){ + printf("\nAssertion failed: "); + printf(message); + printf("\n"); + while(1); + } +} \ No newline at end of file diff --git a/lab08/kernel/src/linker.ld b/lab08/kernel/src/linker.ld new file mode 100644 index 000000000..4eb74d510 --- /dev/null +++ b/lab08/kernel/src/linker.ld @@ -0,0 +1,24 @@ +SECTIONS +{ + . = 0x80000; + .text : + { + KEEP(*(.text.boot)) + *(.text) + } + .rodata :{ *(.rodata) } + .data : { *(.data) } + .bss : + { + . = ALIGN(0x8); + __bss_start = .; + *(.bss) + . = ALIGN(0x8); + __bss_end = .; + } + . = ALIGN(0x8); + _kernel_end = .; + . = ALIGN(0x8); + _heap_start = .; +} +__bss_size = (__bss_end - __bss_start)>>3; \ No newline at end of file diff --git a/lab08/kernel/src/mailbox.c b/lab08/kernel/src/mailbox.c new file mode 100644 index 000000000..c3ef7dc13 --- /dev/null +++ b/lab08/kernel/src/mailbox.c @@ -0,0 +1,88 @@ +#include "peripherals/mailbox.h" + +#include "mailbox.h" +#include "io.h" + +void get_board_revision() +{ + unsigned int mailbox[7]; + mailbox[0] = 7 * 4; // buffer size in bytes + mailbox[1] = REQUEST_CODE; + // tags begin + mailbox[2] = GET_BOARD_REVISION; // tag identifier + mailbox[3] = 4; // maximum of request and response value buffer's length. + mailbox[4] = TAG_REQUEST_CODE; + mailbox[5] = 0; // value buffer + // tags end + mailbox[6] = END_TAG; + + mailbox_call(mailbox); // message passing procedure call, you should implement it following the 6 steps provided above. + + // printf("0x%x\n", mailbox[5]); // it should be 0xa020d3 for rpi3 b+ + printf("\nBoard revision: "); + printf_hex(mailbox[5]); +} + +void get_memory_info() +{ + unsigned int mailbox[8]; + mailbox[0] = 8 * 4; // buffer size in bytes + mailbox[1] = REQUEST_CODE; + // tags begin + mailbox[2] = GET_ARM_MEMORY; // tag identifier + mailbox[3] = 8; // maximum of request and response value buffer's length. + mailbox[4] = TAG_REQUEST_CODE; + mailbox[5] = 0; // value buffer + mailbox[6] = 0; + // tags end + mailbox[7] = END_TAG; + + mailbox_call(mailbox); // message passing procedure call, you should implement it following the 6 steps provided above. + + printf("\nARM base memory address: "); + printf_hex(mailbox[5]); + printf("\nARM memory size: "); + printf_hex(mailbox[6]); + +} + +void mailbox_call(unsigned int* mailbox) +{ + unsigned int mesg = (((unsigned long)mailbox) & ~0xf) | 8; + + while(*MAILBOX_STATUS & MAILBOX_FULL){ // // Check if Mailbox 0 status register’s full flag is set. if MAILBOX_STATUS == 0x80000001, then error parsing request buffer + asm volatile("nop"); + } + + *MAILBOX_WRITE = mesg; + + while(1){ + while(*MAILBOX_STATUS & MAILBOX_EMPTY){ + asm volatile("nop"); + } + if(mesg == *MAILBOX_READ){ + break; + } + } +} + +int mailbox_call_s(unsigned char ch, unsigned int *mbox) +{ + + unsigned int mesg = (((unsigned int)(unsigned long)mbox) & ~0xf) | (ch & 0xf); + while(*MAILBOX_STATUS & MAILBOX_FULL){ // // Check if Mailbox 0 status register’s full flag is set. if MAILBOX_STATUS == 0x80000001, then error parsing request buffer + asm volatile("nop"); + } + + *MAILBOX_WRITE = mesg; + + while(1){ + while(*MAILBOX_STATUS & MAILBOX_EMPTY){ + asm volatile("nop"); + } + if(mesg == *MAILBOX_READ){ + return mbox[1] == REQUEST_SUCCEED; + } + } + return 0; +} \ No newline at end of file diff --git a/lab08/kernel/src/mini_uart.c b/lab08/kernel/src/mini_uart.c new file mode 100644 index 000000000..f43431f60 --- /dev/null +++ b/lab08/kernel/src/mini_uart.c @@ -0,0 +1,65 @@ +#include "peripherals/mini_uart.h" +#include "peripherals/gpio.h" + +#include "mini_uart.h" +#include "string.h" + +void uart_init() +{ + // set the alternate function for GPIO14 and GPIO15 + unsigned int selector; + selector = *GPFSEL1; + selector &= ~(7<<12); // size gpio14 to 0 for gpio14 is bits 12-14 + selector |= 2<<12; // set to alt5 for gpio14 + selector &= ~(7<<15); // size gpio15 to 0 for gpio15 is bits 15-17 + selector |= 2<<15; // set to alt5 for gpio15 + *GPFSEL1 = selector; + + // GPIO initilaization + *GPPUD = 0; // disable pull up/down for all GPIO pins + unsigned int i = 150; + while(i--) asm volatile("nop"); + *GPPUDCLK0 = (1<<14) | (1<<15); // enable clock for gpio14 and gpio15 + i = 150; + while(i--) asm volatile("nop"); + *GPPUDCLK0 = 0; // disable clock for gpio14 and gpio15 + + // initialize mini uart + *AUX_ENABLES = 1; //Enable mini uart (this also enables access to its registers) + *AUX_MU_CNTL_REG = 0; //Disable auto flow control and disable receiver and transmitter (for now) + *AUX_MU_IER_REG = 0; //Disable receive and transmit interrupts + *AUX_MU_LCR_REG = 3; //Enable 8 bit mode + *AUX_MU_MCR_REG = 0; //Set RTS line to be always high + *AUX_MU_BAUD_REG = 270; // 115200 baud + *AUX_MU_CNTL_REG = 3; //Finally, enable transmitter and receiver +} + +char uart_recv() +{ + + char r; + // bit 0 == 1, if receiver holds valid byte + do{asm volatile("nop");}while(!(*AUX_MU_LSR_REG & 0x01)); + r = (char)(*AUX_MU_IO_REG); + return r == '\r'?'\n':r; + +} + +void uart_send(const char c) +{ + // bit 6 == 1, if transmitter is empty + while (1) { + if ((*AUX_MU_LSR_REG)&0x20) break; + } + *AUX_MU_IO_REG = c; + +} + +void uart_send_string(const char* str) +{ + while(*str){ + if(*str == '\n') + uart_send('\r'); + uart_send(*str++); + } +} \ No newline at end of file diff --git a/lab08/kernel/src/mm.S b/lab08/kernel/src/mm.S new file mode 100644 index 000000000..3998c53d5 --- /dev/null +++ b/lab08/kernel/src/mm.S @@ -0,0 +1,6 @@ +.globl memzero_asm +memzero_asm: + str xzr, [x0], #8 + subs x1, x1, #8 + b.gt memzero_asm + ret \ No newline at end of file diff --git a/lab08/kernel/src/reboot.c b/lab08/kernel/src/reboot.c new file mode 100644 index 000000000..9d8153f62 --- /dev/null +++ b/lab08/kernel/src/reboot.c @@ -0,0 +1,18 @@ +#define PM_PASSWORD 0x5a000000 +#define PM_RSTC 0x3F10001c +#define PM_WDOG 0x3F100024 + +void set(long addr, unsigned int value) { + volatile unsigned int* point = (unsigned int*)addr; + *point = value; +} + +void reset(int tick) { // reboot after watchdog timer expire + set(PM_RSTC, PM_PASSWORD | 0x20); // full reset + set(PM_WDOG, PM_PASSWORD | tick); // number of watchdog tick +} + +void cancel_reset() { + set(PM_RSTC, PM_PASSWORD | 0); // full reset + set(PM_WDOG, PM_PASSWORD | 0); // number of watchdog tick +} \ No newline at end of file diff --git a/lab08/kernel/src/schedule.S b/lab08/kernel/src/schedule.S new file mode 100644 index 000000000..4dd8af0d4 --- /dev/null +++ b/lab08/kernel/src/schedule.S @@ -0,0 +1,24 @@ +#include "schedule.h" + +.globl cpu_switch_to +cpu_switch_to: + mov x10, #THREAD_CPU_CONTEXT + add x8, x0, x10 // x8 = the pointer points to current thread's cpu_context + mov x9, sp + stp x19, x20, [x8], #16 // store callee-saved registers + stp x21, x22, [x8], #16 + stp x23, x24, [x8], #16 + stp x25, x26, [x8], #16 + stp x27, x28, [x8], #16 + stp x29, x9, [x8], #16 + str x30, [x8] + add x8, x1, x10 // x8 = the pointer points to next thread's cpu_context + ldp x19, x20, [x8], #16 // restore callee-saved registers + ldp x21, x22, [x8], #16 + ldp x23, x24, [x8], #16 + ldp x25, x26, [x8], #16 + ldp x27, x28, [x8], #16 + ldp x29, x9, [x8], #16 + ldr x30, [x8] // restore pc + mov sp, x9 + ret \ No newline at end of file diff --git a/lab08/kernel/src/schedule.c b/lab08/kernel/src/schedule.c new file mode 100644 index 000000000..d61fe437b --- /dev/null +++ b/lab08/kernel/src/schedule.c @@ -0,0 +1,103 @@ +#include "schedule.h" +#include "irq.h" +#include "alloc.h" +#include "io.h" + +static struct task_struct init_task = INIT_TASK; +struct task_struct *current = &(init_task); +struct task_struct * task[NR_TASKS] = {&(init_task), }; +int nr_tasks = 1; + +void preempt_disable(void) +{ + current->preempt_count++; +} + +void preempt_enable(void) +{ + current->preempt_count--; +} + + +void _schedule(void) +{ + preempt_disable(); + int next,c; + struct task_struct * p; + while (1) { + c = -1; + next = 0; + for (int i = 0; i < NR_TASKS; i++){ // find the task with the maximum counter + p = task[i]; + if (p && p->state == TASK_RUNNING && p->counter > c) { + c = p->counter; + next = i; + } + } + if (c) { // found & break for switch to the task + break; + } + // if no task is found, increase the counter of all tasks + for (int i = 0; i < NR_TASKS; i++) { + p = task[i]; + if (p) { + p->counter = (p->counter >> 1) + p->priority; + } + } + } + switch_to(task[next]); + preempt_enable(); +} + +void schedule(void) +{ + current->counter = 0; + _schedule(); +} + +void switch_to(struct task_struct * next) +{ + if (current == next) + return; + struct task_struct * prev = current; + current = next; + cpu_switch_to(prev, next); +} + +void schedule_tail(void) { + preempt_enable(); +} + + +void timer_tick() +{ + --current->counter; + if (current->counter>0 || current->preempt_count >0) { + return; + } + current->counter=0; + enable_irq(); + _schedule(); + disable_irq(); +} + +void kill_zombies() +{ + for (int i = 0; i < NR_TASKS; i++) { + if (task[i] && task[i]->state == TASK_ZOMBIE) { + struct task_struct * p = task[i]; + task[i] = 0; + printf("\r\n[KILL] zombies, pid: "); printf_int(p->pid); + bfree(p); + } + } +} + +void exit_process() +{ + preempt_disable(); + current->state = TASK_ZOMBIE; + bfree((void*)current->stack); + preempt_enable(); + schedule(); +} \ No newline at end of file diff --git a/lab08/kernel/src/shell.c b/lab08/kernel/src/shell.c new file mode 100644 index 000000000..1d64b1dc0 --- /dev/null +++ b/lab08/kernel/src/shell.c @@ -0,0 +1,271 @@ +#include "shell.h" +#include "mini_uart.h" +#include "mailbox.h" +#include "reboot.h" +#include "io.h" +#include "string.h" +#include "alloc.h" +#include "lib.h" +#include "timer.h" +#include "irq.h" +#include "fork.h" +#include "schedule.h" +#include "vfs.h" + +#define delay(x) for(int i=0; icwd); + } + else if(argc == 2){ + vfs_list(argv[1]); + } + else{ + printf("\nUsage: ls [path]"); + return; + } +} + + +static void rootfs_mkdir(int argc, char *argv[]) +{ + if(argc == 2){ + vfs_mkdir(argv[1]); + } + else{ + printf("\nUsage: mkdir [path]"); + return; + } +} + +static void rootfs_touch(int argc, char *argv[]) +{ + if(argc == 2){ + // vfs_create(argv[1]); + } + else{ + printf("\nUsage: touch [path]"); + return; + } +} + +static void rootfs_exec(int argc, char *argv[]) +{ + if(argc == 2){ + vfs_exec(argv[1], 0); + } + else{ + printf("\nUsage: exec [path]"); + return; + } +} + + +static void print_cwd(int argc, char *argv[]) +{ + printf("\nCurrent Working Directory: "); + printf(current->cwd); +} + + + +static void change_dir(int argc, char *argv[]) +{ + if(argc == 2){ + vfs_chdir(argv[1]); + } + else{ + printf("\nUsage: cd [path]"); + return; + } +} + +void readcmd(char x[256]) +{ + char input_char; + int input_index = 0; + x[0] = 0; + while( ((input_char = read_char()) != '\n')) + { + if(input_char == 127){ + if(input_index > 0){ + input_index--; + printf("\b \b"); + } + continue; + } + x[input_index] = input_char; + ++input_index; + printfc(input_char); + } + + x[input_index]=0; // null char +} + +int split_command(char* command, char *argv[]) +{ + int argc = 0; + + char *token = strtok(command, " "); + while(token != NULL) + { + argv[argc] = token; + argc++; + token = strtok(0, " "); + } + return argc; +} \ No newline at end of file diff --git a/lab08/kernel/src/string.c b/lab08/kernel/src/string.c new file mode 100644 index 000000000..dd7d84e6c --- /dev/null +++ b/lab08/kernel/src/string.c @@ -0,0 +1,69 @@ +#include "string.h" +#include "io.h" + +int strcmp(const char* a, const char* b) +{ + while(*a == *b){ + if(*a == '\0') + return 0; + a++; + b++; + } + return *a - *b; +} + +char* strcpy(char* dest, const char* src) +{ + char* ret = dest; + while(*src){ + *dest = *src; + dest++; + src++; + } + *dest = '\0'; + return ret; +} + +char* strncpy(char* dest, const char* src, int n) +{ + char* ret = dest; + while(n--){ + *dest = *src; + dest++; + src++; + } + *dest = '\0'; + return ret; +} + +uint32_t strlen(const char* str) +{ + uint32_t len = 0; + while(*str){ + len++; + str++; + } + return len; +} + +char *strtok(char* str, const char* delim) +{ + // printf("\r\nstr: "); printf(str); + static char* p = 0; + if(str != 0) p = str; + if(p == 0) return 0; + char* ret = p; + while(*p){ + if(*p == *delim){ + *p = '\0'; + p++; + if(ret[0] == 0) return NULL; + return ret; + } + p++; + // printf("\r\np++"); + } + // printf("\r\nret: "); printf(ret); printf(", "); printfc(ret[0]); printf(", "); printf_int(ret[0] == NULL); + if(ret[0] == 0) return NULL; + return ret; +} \ No newline at end of file diff --git a/lab08/kernel/src/sys.S b/lab08/kernel/src/sys.S new file mode 100644 index 000000000..9fecd659f --- /dev/null +++ b/lab08/kernel/src/sys.S @@ -0,0 +1,110 @@ +#include "sys.h" + +// reason for using w8 is that x0-x7 are used for passing arguments +// the such warpper functions are not inlcuded in the real linux kernel +// they often are packed in the different language's standard library, such as glibc + +// svc #0 is used to generate synchronous exception + +.global getpid +getpid: + mov w8, #SYS_GETPID_NUM + svc #0 // using svc to generate synchronous exception + ret + +.global uartread +uartread: + mov w8, #SYS_UARTREAD_NUM + svc #0 + ret + +.global uartwrite +uartwrite: + mov w8, #SYS_UARTWRITE_NUM + svc #0 + ret + +.global exec +exec: + mov w8, #SYS_EXEC_NUM + svc #0 + ret + +.global fork +fork: + mov w8, #SYS_FORK_NUM + svc #0 + ret + +.global exit +exit: + mov w8, #SYS_EXIT_NUM + svc #0 + ret + +.global mbox_call +mbox_call: + mov w8, #SYS_MBOX_CALL_NUM + svc #0 + ret + +.global kill +kill: + mov w8, #SYS_KILL_NUM + svc #0 + ret + +.global open +open: + mov w8, #SYS_OPEN_NUM + svc #0 + ret + +.global close +close: + mov w8, #SYS_CLOSE_NUM + svc #0 + ret + +.global write +write: + mov w8, #SYS_WRITE_NUM + svc #0 + ret + +.global read +read: + mov w8, #SYS_READ_NUM + svc #0 + ret + +.global mkdir +mkdir: + mov w8, #SYS_MKDIR_NUM + svc #0 + ret + +.global mount +mount: + mov w8, #SYS_MOUNT_NUM + svc #0 + ret + +.global chdir +chdir: + mov w8, #SYS_CHDIR_NUM + svc #0 + ret + +.global lseek64 +lseek64: + mov w8, #SYS_LSEEK64_NUM + svc #0 + ret + + +//.global ioctl +//ioctl: +// mov w8, #SYS_IOCTL_NUM +// svc #0 +// ret \ No newline at end of file diff --git a/lab08/kernel/src/sys.c b/lab08/kernel/src/sys.c new file mode 100644 index 000000000..23dd3bb32 --- /dev/null +++ b/lab08/kernel/src/sys.c @@ -0,0 +1,242 @@ +#include "sys.h" +#include "schedule.h" +#include "fork.h" +#include "mini_uart.h" +#include "io.h" +#include "alloc.h" +#include "cpio.h" +#include "lib.h" +#include "type.h" +#include "string.h" +#include "peripherals/mailbox.h" +#include "dev_framebuffer.h" + +extern struct task_struct *current; +extern void memzero_asm(unsigned long src, unsigned long n); +// #ifndef QEMU +// extern unsigned long CPIO_START_ADDR_FROM_DT; +// #endif + +void foo(){}; + +int sys_getpid() +{ + return current->pid; +} + +size_t sys_uartread(char buf[], size_t size) +{ + for(size_t i=0; ivnode->f_ops->getsize(file->vnode); + void* user_program_addr = balloc(filesize+THREAD_SIZE); + + if(user_program_addr == NULL){ + printf("\r\n[ERROR] Cannot allocate memory for file: "); printf(name); + return -1; + } + + vfs_read(file, user_program_addr, filesize); + vfs_close(file); + + preempt_disable(); // leads to get the correct current task + + struct pt_regs *cur_regs = task_pt_regs(current); + cur_regs->pc = (unsigned long)user_program_addr; + cur_regs->sp = current->stack + THREAD_SIZE; + + preempt_enable(); + return 0; +} + +int sys_fork() // [TODO] +{ + unsigned long stack = (unsigned long)balloc(THREAD_SIZE); + if((void*)stack == NULL) return -1; + memzero_asm(stack, THREAD_SIZE); + return copy_process(0, 0, 0, stack); +} + +void sys_exit(int status) // [TODO] +{ + exit_process(); +} + +int sys_mbox_call(unsigned char ch, unsigned int *mbox) // [TODO] +{ +#ifdef SYSCALL_DEBUG + printf("\r\n[SYSCALL] mbox_call: "); printf_int(ch); +#endif + unsigned int mesg = (((unsigned int)(unsigned long)mbox) & ~0xf) | (ch & 0xf); + while(*MAILBOX_STATUS & MAILBOX_FULL){ // // Check if Mailbox 0 status register’s full flag is set. if MAILBOX_STATUS == 0x80000001, then error parsing request buffer + asm volatile("nop"); + } + + *MAILBOX_WRITE = mesg; + + while(1){ + while(*MAILBOX_STATUS & MAILBOX_EMPTY){ + asm volatile("nop"); + } + if(mesg == *MAILBOX_READ){ + return mbox[1] == REQUEST_SUCCEED; + } + } + return 0; +} + +void sys_kill(int pid) // [TODO] +{ +#ifdef SYSCALL_DEBUG + printf("\r\n[SYSCALL] kill: "); printf_int(pid); +#endif + if(task[pid] == NULL){ + printf("\r\nProcess not found: "); printf_int(pid); + return; + } + task[pid]->state = TASK_ZOMBIE; +} + +int sys_open(const char *pathname, int flags) +{ +#ifdef SYSCALL_DEBUG + printf("\r\n[SYSCALL] open: "); printf(pathname); printf(", flags: "); printf_int(flags); +#endif + for(int i=0; ifd_table.fds[i] == NULL){ + int ret = vfs_open(pathname, flags, ¤t->fd_table.fds[i]); + if(ret == 0){ + printf("\r\n[SYSCALL] open: File descriptor: "); printf_int(i + OFFSET_FD); printf(" , File: "); printf(pathname); + return i + OFFSET_FD; + } + break; + } + } + return -1; +} + +int sys_close(int fd) +{ +#ifdef SYSCALL_DEBUG + printf("\r\n[SYSCALL] close: "); printf_int(fd); +#endif + if(fd < OFFSET_FD || fd >= MAX_OPEN_FILE + OFFSET_FD) return -1; + int ret = vfs_close(current->fd_table.fds[fd - OFFSET_FD]); + current->fd_table.fds[fd - OFFSET_FD] = NULL; + return ret; +} + +long sys_write(int fd, const void *buf, unsigned long count) +{ +#ifdef SYSCALL_DEBUG + printf("\r\n[SYSCALL] write: fd: "); printf_int(fd); printf(", count: "); printf_int(count); +#endif + if(fd < OFFSET_FD || fd >= MAX_OPEN_FILE + OFFSET_FD) return -1; + return vfs_write(current->fd_table.fds[fd - OFFSET_FD], buf, count); +} +long sys_read(int fd, void *buf, unsigned long count) +{ +#ifdef SYSCALL_DEBUG + printf("\r\n[SYSCALL] read: fd: "); printf_int(fd); printf(", count: "); printf_int(count); +#endif + if(fd < OFFSET_FD || fd >= MAX_OPEN_FILE + OFFSET_FD) return -1; + return vfs_read(current->fd_table.fds[fd - OFFSET_FD], buf, count); +} + +// you can ignore mode, since there is no access control +int sys_mkdir(const char *pathname, unsigned mode) +{ + return vfs_mkdir(pathname); +} + +// you can ignore arguments other than target (where to mount) and filesystem (fs name) +int sys_mount(const char *src, const char *target, const char *filesystem, unsigned long flags, const void *data) +{ +#ifdef SYSCALL_DEBUG + printf("\r\n[SYSCALL] mount:"); printf(src); printf(" to "); printf(target); printf(" with filesystem: "); printf(filesystem); +#endif + return vfs_mount(target, filesystem); +} + +int sys_chdir(const char *path) +{ +#ifdef SYSCALL_DEBUG + printf("\r\n[SYSCALL] chdir: "); printf(path); +#endif + return vfs_chdir(path); +} + + +long sys_lseek64(int fd, long offset, int whence) +{ + long ret; + if(whence == SEEK_SET) // used for dev_framebuffer + { + current->fd_table.fds[fd - OFFSET_FD]->f_pos = offset; + ret = offset; + } + else // other is not supported + { + ret = -1; + } + + return ret; +} + +// ioctl 0 will be use to get info +// there will be default value in info +// if it works with default value, you can ignore this syscall +long sys_ioctl(int fd, unsigned long request, unsigned long arg) +{ +#ifdef SYSCALL_DEBUG + printf("\r\n[SYSCALL] ioctl: fd: "); printf_int(fd); printf(" , request: "); printf_hex(request); +#endif + return 0; +} + + +void * const sys_call_table[] = { + sys_getpid, + sys_uartread, + sys_uartwrite, + sys_exec, + sys_fork, + sys_exit, + sys_mbox_call, + sys_kill, + // lab5 advanced + foo, + foo, + foo, + // lab7 + sys_open, + sys_close, + sys_write, + sys_read, + sys_mkdir, + sys_mount, + sys_chdir, + sys_lseek64, + sys_ioctl + }; diff --git a/lab08/kernel/src/timer.S b/lab08/kernel/src/timer.S new file mode 100644 index 000000000..1d3a466b2 --- /dev/null +++ b/lab08/kernel/src/timer.S @@ -0,0 +1,32 @@ +.section ".text" + +.global core_timer_enable +core_timer_enable: + mov x0, 1 + msr cntp_ctl_el0, x0 // enable + mov x0, 2 + // mrs x0, cntfrq_el0 + ldr x1, =0x40000040 // timer interrupt control register for core 0 + str w0, [x1] // unmask timer interrupt + ret + +.global core_timer_disable +core_timer_disable: + mov x0, 0 + msr cntp_ctl_el0, x0 // disable + ret + +.global get_cpu_cycles +get_cpu_cycles: + mrs x0, cntpct_el0 + ret + +.global get_cpu_freq +get_cpu_freq: + mrs x0, cntfrq_el0 + ret + +.global set_timer_asm +set_timer_asm: + msr cntp_tval_el0, x0 + ret \ No newline at end of file diff --git a/lab08/kernel/src/timer.c b/lab08/kernel/src/timer.c new file mode 100644 index 000000000..0dcd61513 --- /dev/null +++ b/lab08/kernel/src/timer.c @@ -0,0 +1,25 @@ +#include "timer.h" +#include "alloc.h" +#include "string.h" +#include "type.h" +#include "io.h" + +extern void timer_tick(); + +void timer_init() +{ + core_timer_enable(); + set_timer(1); +} + +void irq_timer_handler() +{ + set_timer_asm(get_cpu_freq()>>5); + timer_tick(); +} + +void set_timer(uint32_t sec) +{ + uint64_t cycles = get_cpu_freq() * sec; + set_timer_asm(cycles); +} diff --git a/lab08/kernel/src/tmpfs.c b/lab08/kernel/src/tmpfs.c new file mode 100644 index 000000000..13487a034 --- /dev/null +++ b/lab08/kernel/src/tmpfs.c @@ -0,0 +1,282 @@ +#include "tmpfs.h" +#include "alloc.h" +#include "errno.h" +#include "io.h" +#include "string.h" + +#define min(a, b) ((a) < (b) ? (a) : (b)) + +struct file_operations *tmpfs_f_ops; +struct vnode_operations *tmpfs_v_ops; + +static struct vnode* tmpfs_create_vnode(const char *name, int type, struct vnode *parent); + +int tmpfs_setup_mount(struct filesystem* fs, struct mount **mount) // mount the filesystem to the mount point +{ + (*mount)->fs = fs; + (*mount)->root = tmpfs_create_vnode("/", DIR_NODE, NULL); + return 0; +} + +static struct vnode* tmpfs_create_vnode(const char *name, int type, struct vnode *parent) +{ + struct tmpfs_internal *internal = (struct tmpfs_internal*)dynamic_alloc(sizeof(struct tmpfs_internal)); + + if(sizeof(name) > COMPONENT_SIZE){ + printf("\r\n[ERROR] File name too long"); + return NULL; + } + internal->name = (char*)dynamic_alloc(COMPONENT_SIZE); + strcpy(internal->name, name); + internal->size = 0; + if(type == FILE_NODE){ + internal->data = (char*)balloc(TMPFS_MAX_FILE); + } + else{ + internal->data = NULL; + } + internal->type = type; + internal->filesize = 0; + // internal->parent = parent; + // internal->next = NULL; + for(int i=0; ichildren[i] = NULL; + } + struct vnode *vnode = (struct vnode*)dynamic_alloc(sizeof(struct vnode)); + vnode->parent = parent; + vnode->mount = NULL; + vnode->v_ops = tmpfs_v_ops; + vnode->f_ops = tmpfs_f_ops; + vnode->internal = internal; + return vnode; +} + +int tmpfs_register() +{ + // check if tmpfs already registered + int i=0; + for(; iwrite = tmpfs_write; + tmpfs_f_ops->read = tmpfs_read; + tmpfs_f_ops->open = tmpfs_open; + tmpfs_f_ops->close = tmpfs_close; + tmpfs_f_ops->getsize = tmpfs_getsize; + tmpfs_f_ops->lseek64 = NULL; + + tmpfs_v_ops->lookup = tmpfs_lookup; + tmpfs_v_ops->create = tmpfs_create; + tmpfs_v_ops->mkdir = tmpfs_mkdir; + tmpfs_v_ops->list = tmpfs_list; + + return 0; +} + +int tmpfs_write(struct file* file, const void* buf, size_t len) +{ + // Given the file handle, VFS calls the corresponding write + // method to write the file starting from f_pos, then updates + // f_pos and size after write. (or not if it’s a special file) + // Returns size written or error code on error. + + // 1. write len byte from buf to the opened file. + // 2. return written size or error code if an error occurs. + struct vnode *vnode = file->vnode; + struct tmpfs_internal *internal = (struct tmpfs_internal*)vnode->internal; + if(internal->type == DIR_NODE){ + printf("\r\n[ERROR] Cannot write to a directory"); + return WERROR; + } + + if(file->f_pos + len > TMPFS_MAX_FILE){ + printf("\r\n[ERROR] File size exceeded"); + return WERROR; + } + + // memory copy + int written_size = min(len, TMPFS_MAX_FILE - file->f_pos); + for(int i=0; idata[file->f_pos + i] = ((char*)buf)[i]; + } + file->f_pos += written_size; + internal->filesize += written_size; + return len; +} + +int tmpfs_read(struct file* file, void* buf, size_t len) +{ + // Given the file handle, VFS calls the corresponding read method + // to read the file starting from f_pos, then updates f_pos after read. + // (or not if it’s a special file) + + // 1. read min(len, readable size) byte to buf from the opened file. + // 2. block if nothing to read for FIFO type + // 2. return read size or error code if an error occurs. + + struct vnode *vnode = file->vnode; + struct tmpfs_internal *internal = (struct tmpfs_internal*)vnode->internal; + if(internal->type == DIR_NODE){ + printf("\r\n[ERROR] Cannot read a directory"); + return RERROR; + } + + size_t readable_size = min(len, internal->filesize - file->f_pos); + + // memory copy + for(int i=0; idata[file->f_pos + i]; + } + file->f_pos += readable_size; + return readable_size; +} + +int tmpfs_open(struct vnode* file_node, struct file** target) +{ + return 0; // the steps for checking the file is implemented in vfs_open +} + +int tmpfs_close(struct file* file) +{ + // 1. release the file handle + // 2. Return error code if fails + if(file == NULL){ + printf("\r\n[ERROR] File pointer cannot be NULL"); + return CERROR; + } + return 0; // vfs_close will free the file pointer +} + +int tmpfs_create(struct vnode* dir_node, struct vnode** target, const char* component_name) +{ + // create an regular file on underlying file system, + // should fail if file exist. Then passes the file’s vnode back to VFS. + + // 1. Create a new file in the directory + // 2. Return error code if fails + struct tmpfs_internal *internal = (struct tmpfs_internal*)dir_node->internal; + if(internal->type == FILE_NODE){ + printf("\r\n[ERROR] Cannot create file in a file"); + return CERROR; + } + + if(strlen(component_name) > COMPONENT_SIZE){ + printf("\r\n[ERROR] File name too long"); + return CERROR; + } + + // for(int i=0; ichildren[i] == NULL){ + // internal->children[i] = tmpfs_create_vnode(component_name, FILE_NODE, dir_node); + // *target = internal->children[i]; + // return 0; + // } + // } + if(internal->size + 1 > ENTRIES_PER_DIR){ + printf("\r\n[ERROR] No space for new file"); + return CERROR; + } + internal->children[internal->size] = tmpfs_create_vnode(component_name, FILE_NODE, dir_node); + *target = internal->children[internal->size]; + internal->size++; + return 0; +} + +int tmpfs_getsize(struct vnode* vnode) +{ + struct tmpfs_internal *internal = (struct tmpfs_internal*)vnode->internal; + return internal->filesize; +} + +int tmpfs_mkdir(struct vnode* dir_node, struct vnode** target, const char* component_name) +{ + // 1. Create a new directory in the directory + // 2. Return error code if fails + + struct tmpfs_internal *internal = (struct tmpfs_internal*)dir_node->internal; + if(internal->type == FILE_NODE){ + printf("\r\n[ERROR] Cannot create directory in a file"); + return CERROR; + } + + if(strlen(component_name) > COMPONENT_SIZE){ + printf("\r\n[ERROR] Directory name too long"); + return CERROR; + } + + // for(int i=0; ichildren[i] == NULL){ + // internal->children[i] = tmpfs_create_vnode(component_name, DIR_NODE, dir_node); + // *target = internal->children[i]; + // return 0; + // } + // } + if(internal->size + 1 > ENTRIES_PER_DIR){ + printf("\r\n[ERROR] No space for new directory"); + return CERROR; + } + internal->children[internal->size] = tmpfs_create_vnode(component_name, DIR_NODE, dir_node); + *target = internal->children[internal->size]; + internal->size++; + return 0; +} + +int tmpfs_lookup(struct vnode* dir_node, struct vnode** target, const char* component_name) +{ + // 1. Lookup the vnode in the directory + // 2. Return error code if fails + struct tmpfs_internal *internal = (struct tmpfs_internal*)dir_node->internal; + if(internal->type == FILE_NODE){ + printf("\r\n[ERROR] Cannot lookup in a file"); + return LERROR; + } + + for(int i=0; ichildren[i]->internal; + if(internal->children[i] != NULL && !strcmp(child_internal->name, component_name)){ + *target = internal->children[i]; + return 0; + } + } + // printf("[ERROR] File not found\n"); + return LERROR; +} + +int tmpfs_list(struct vnode* dir_node) +{ + // 1. List all the files in the directory + // 2. Return error code if fails + printf("\r\n[TMPFS LIST]"); + struct tmpfs_internal *internal = (struct tmpfs_internal*)dir_node->internal; + + if(internal->type == FILE_NODE){ + printf("\r\n[ERROR] Cannot list in a file"); + return LERROR; + } + + printf("\r\nName \tType"); + printf("\r\n-----------------------"); + for(int i=0; isize; i++){ + struct tmpfs_internal *child_internal = (struct tmpfs_internal*)internal->children[i]->internal; + printf("\r\n"); printf(child_internal->name); for(int j=0; j<15-strlen(child_internal->name); j++) printf(" "); + printf("\t"); printf(child_internal->type == FILE_NODE ? "FILE" : "DIR"); + } + return 0; +} diff --git a/lab08/kernel/src/user_demo.c b/lab08/kernel/src/user_demo.c new file mode 100644 index 000000000..2088f2418 --- /dev/null +++ b/lab08/kernel/src/user_demo.c @@ -0,0 +1,261 @@ +#include "user_demo.h" +#include "fork.h" +#include "schedule.h" +#include "io.h" +#include "sys.h" + +// system call +extern int getpid(); +extern int fork(); +extern void exit(); +extern int open(const char *pathname, int flags); +extern int close(int fd); +extern int read(int fd, void *buf, unsigned long count); +extern int write(int fd, const void *buf, unsigned long count); + +static void user_multiple_thread_test_foo(); +static void user_fork_test_foo(); +static void user_open_test_foo(); +static void user_open_test_initramfs_foo(); +static void user_read_test_foo(); +static void user_write_test_foo(); +static void user_write_test_initramfs_foo(); +static void user_stdout_test_foo(); +static void user_stdin_test_foo(); + +// lab5 +void multiple_thread_test(int argc, char *argv[]) +{ + for(int i = 0; i < 5; ++i) { + copy_process(PF_KTHREAD, (unsigned long)&user_multiple_thread_test_foo, 0, 0); + } +} + +void user_fork_test(int argc, char *argv[]) +{ + copy_process(PF_KTHREAD, (unsigned long)&kp_user_mode, (unsigned long)&user_fork_test_foo, 0); +} + +// lab7 + +void user_open_test(int argc, char *argv[]) +{ + copy_process(PF_KTHREAD, (unsigned long)&kp_user_mode, (unsigned long)&user_open_test_foo, 0); +} + +void user_open_test_initramfs(int argc, char *argv[]) +{ + copy_process(PF_KTHREAD, (unsigned long)&kp_user_mode, (unsigned long)&user_open_test_initramfs_foo, 0); +} + +void user_read_test(int argc, char *argv[]) +{ + copy_process(PF_KTHREAD, (unsigned long)&kp_user_mode, (unsigned long)&user_read_test_foo, 0); +} + +void user_write_test(int argc, char *argv[]) +{ + copy_process(PF_KTHREAD, (unsigned long)&kp_user_mode, (unsigned long)&user_write_test_foo, 0); +} + +void user_write_test_initramfs(int argc, char *argv[]) +{ + copy_process(PF_KTHREAD, (unsigned long)&kp_user_mode, (unsigned long)&user_write_test_initramfs_foo, 0); +} + +void user_stdout_test(int argc, char *argv[]) +{ + copy_process(PF_KTHREAD, (unsigned long)&kp_user_mode, (unsigned long)&user_stdout_test_foo, 0); +} + +void user_stdin_test(int argc, char *argv[]) +{ + copy_process(PF_KTHREAD, (unsigned long)&kp_user_mode, (unsigned long)&user_stdin_test_foo, 0); +} + +// ------------------------------------------------------------------ + +static void user_multiple_thread_test_foo() +{ + for(int i = 0; i < 10; ++i) { + printf("\r\nThread id: "); printf_int(current->pid); printf("\t,loop: "); printf_int(i); + delay(1000000); + schedule(); + } + current->state = TASK_ZOMBIE; + while(1); +} + +static void user_fork_test_foo() +{ + // printf("Fork Test , pid : %d\n",getpid()); + printf("\r\nFork Test, pid: "); printf_int(getpid()); + uint32_t cnt = 1,ret=0; + + if((ret=fork()) == 0){ //pid == 0 => child + printf("\r\n===== Child Process ====="); + unsigned long cur_sp; + asm volatile("mov %0, sp" : "=r"(cur_sp)); + // printf("first child pid: %d, cnt: %d, ptr: %x, sp : %x\n", getpid(), cnt, &cnt, cur_sp); + printf("\r\nfirst child pid: "); printf_int(getpid()); printf(", cnt: "); printf_int(cnt); + printf(", ptr: "); printf_hex((unsigned long)&cnt); printf(", sp: "); printf_hex(cur_sp); + ++cnt; + + if ((ret = fork() )!= 0){ + asm volatile("mov %0, sp" : "=r"(cur_sp)); + // printf("first child pid: %d, cnt: %d, ptr: %x, sp : %x\n", getpid(), cnt, &cnt, cur_sp); + printf("\r\nfirst child pid: "); printf_int(getpid()); printf(", cnt: "); printf_int(cnt); + printf(", ptr: "); printf_hex((unsigned long)&cnt); printf(", sp: "); printf_hex(cur_sp); + } + else{ + while (cnt < 5) { + asm volatile("mov %0, sp" : "=r"(cur_sp)); + // printf("second child pid: %d, cnt: %d, ptr: %x, sp : %x\n", getpid(), cnt, &cnt, cur_sp); + printf("\r\nsecond child pid: "); printf_int(getpid()); printf(", cnt: "); printf_int(cnt); + printf(", ptr: "); printf_hex((unsigned long)&cnt); printf(", sp: "); printf_hex(cur_sp); + delay(1000000); + ++cnt; + } + } + exit(); + } + else{ //pid > 0 => parent + printf("\r\n===== Parent Process ====="); + printf("\r\nParent Process, pid: "); printf_int(getpid()); + printf(" child pid: "); printf_int(ret); + unsigned long cur_sp; + asm volatile("mov %0, sp" : "=r"(cur_sp)); + printf(" cnt: "); printf_int(cnt); printf(" , ptr: "); printf_hex((unsigned long)&cnt); + printf(" , sp: "); printf_hex(cur_sp); + exit(); + } +} + +static void user_open_test_foo() +{ + printf("\r\nUser Open Test pid: "); printf_int(getpid()); + // char buff[] = "Hello, World!"; + int fd = open("test.txt", O_CREAT); + if(fd == -1){ + printf("\r\nOpen file failed!"); + exit(); + } + printf("\r\nOpen file success, fd: "); printf_int(fd); + // write(fd, buff, sizeof(buff)); + close(fd); + exit(); +} + +static void user_open_test_initramfs_foo() +{ + printf("\r\nUser Open Test Initramfs pid: "); printf_int(getpid()); + // char buff[] = "Hello, World!"; + int fd = open("/initramfs/test.txt", O_CREAT); + if(fd == -1){ + printf("\r\nOpen file failed!"); + exit(); + } + printf("\r\nOpen file success, fd: "); printf_int(fd); + // write(fd, buff, sizeof(buff)); + close(fd); + exit(); +} + +static void user_read_test_foo() +{ + printf("\r\nUser Read Test pid: "); printf_int(getpid()); + char buff1[100]; + int fd1 = open("/initramfs/f1", 0); + if(fd1 == -1){ + printf("\r\nOpen file failed!"); + exit(); + } + printf("\r\nOpen file success, fd: "); printf_int(fd1); + read(fd1, buff1, sizeof(buff1)); + printf("\r\nRead content f1: "); printf(buff1); + + char buff2[4]; + int fd2 = open("/initramfs/f2", 0); + if(fd2 == -1){ + printf("\r\nOpen file failed!"); + exit(); + } + printf("\r\nOpen file success, fd: "); printf_int(fd2); + read(fd2, buff2, sizeof(buff2)); + printf("\r\nRead content f2: "); printf(buff2); + read(fd2, buff2, sizeof(buff2)); + printf("\r\nRead content f2: "); printf(buff2); + close(fd1); + close(fd2); + exit(); +} + +static void user_write_test_foo() +{ + printf("\r\nUser Write Test pid: "); printf_int(getpid()); + char buff[] = "Hello, World!"; + int fd = open("/write.txt", O_CREAT); + if(fd == -1){ + printf("\r\nOpen file failed!"); + exit(); + } + printf("\r\nOpen file success, fd: "); printf_int(fd); + write(fd, buff, sizeof(buff)); + close(fd); + + int fd2 = open("/write.txt", 0); + if(fd2 == -1){ + printf("\r\nOpen file failed!"); + exit(); + } + printf("\r\nOpen file success, fd: "); printf_int(fd2); + char buff2[100]; + read(fd2, buff2, sizeof(buff2)); + printf("\r\nRead content write.txt: "); printf(buff2); + close(fd2); + exit(); +} + +static void user_write_test_initramfs_foo() +{ + printf("\r\nUser Write Test Initramfs pid: "); printf_int(getpid()); + char buff[] = "Hello, World!"; + int fd = open("/initramfs/f1", 0); + if(fd == -1){ + printf("\r\nOpen file failed!"); + exit(); + } + printf("\r\nOpen file success, fd: "); printf_int(fd); + int size = write(fd, buff, sizeof(buff)); + if(size < 0) { + printf("\r\nWrite file failed!"); + exit(); + } + close(fd); + + int fd2 = open("/initramfs/f1", 0); + if(fd2 == -1){ + printf("\r\nOpen file failed!"); + exit(); + } + printf("\r\nOpen file success, fd: "); printf_int(fd2); + char buff2[100]; + read(fd2, buff2, sizeof(buff2)); + printf("\r\nRead content f1: "); printf(buff2); + close(fd2); + exit(); +} + +static void user_stdout_test_foo() +{ + write(1, "\nhello\n", 6); + exit(); +} + +static void user_stdin_test_foo() +{ + char buf[100]; + read(0, buf, 20); + write(1, buf, 20); + exit(); +} \ No newline at end of file diff --git a/lab08/kernel/src/vfs.c b/lab08/kernel/src/vfs.c new file mode 100644 index 000000000..774f7e943 --- /dev/null +++ b/lab08/kernel/src/vfs.c @@ -0,0 +1,538 @@ +#include "vfs.h" +#include "alloc.h" +#include "string.h" +#include "tmpfs.h" +#include "errno.h" +#include "tmpfs.h" +#include "initramfs.h" +#include "io.h" +#include "schedule.h" +#include "fork.h" +#include "dev_uart.h" +#include "dev_framebuffer.h" + +extern struct task_struct* current; + +struct mount* rootfs; +struct filesystem global_fs[MAX_FILESYSTEM]; +struct file_operations global_dev[MAX_DEV_REG]; + +extern struct file_operations *initramfs_f_ops; + + +static struct vnode* next_step(struct vnode* start_node, const char* pathname, struct vnode** target_dir); +static struct file* create_file(struct vnode* vnode, int flags); +static char* get_file_name(const char* pathname); +static void simplify_path(char* pathname); + +void rootfs_init() +{ + // pre init + // global_fd_table_init(); + // 1. create a tmpfs filesystem + // 2. create a rootfs mount + // 3. setup rootfs mount + for(int i=0; iname = (char*)dynamic_alloc(16); + strcpy(tmpfs->name, "tmpfs"); + + tmpfs->setup_mount = tmpfs_setup_mount; + register_filesystem(tmpfs); + + rootfs = (struct mount*)dynamic_alloc(sizeof(struct mount)); + tmpfs->setup_mount(tmpfs, &rootfs); + + // initramfs + vfs_mount("/initramfs", "initramfs"); + + // devfs + vfs_mkdir("/dev"); + int uart_id = dev_uart_register(); + printf("\r\nUART ID: "); printf_int(uart_id); + vfs_mknod("/dev/uart", uart_id); + int framebuffer_id = dev_framebuffer_register(); + vfs_mknod("/dev/framebuffer", framebuffer_id); +} + + +int register_filesystem(struct filesystem* fs) { // ensure there is sufficient memory for the filesystem + // register the file system to the kernel. + // you can also initialize memory pool of the file system here. + if(!strcmp(fs->name, "tmpfs")) + { + //initialize memory pool of the file system + return tmpfs_register(); + } + else if(!strcmp(fs->name, "initramfs")) + { + return initramfs_register(); + } + return -1; +} + +int register_dev(struct file_operations* f_ops) +{ + for(int i=0; iwrite; + global_dev[i].read = f_ops->read; + global_dev[i].open = f_ops->open; + global_dev[i].close = f_ops->close; + return i; + } + } + return -1; +} + +int vfs_open(const char* pathname, int flags, struct file** target) { + // 1. Lookup pathname + // 2. Create a new file handle for this vnode if found. + // 3. Create a new file if O_CREAT is specified in flags and vnode not found + // lookup error code shows if file exist or not or other error occurs + // 4. Return error code if fails + struct vnode* vnode; + int ret = vfs_lookup(pathname, &vnode); + if(ret != 0 && flags != O_CREAT){ + printf("\r\n[ERROR] Cannot find the file"); + return -1; + } + else if(ret == 0 && flags == O_CREAT){ + printf("\r\n[ERROR] File already exists"); + return -1; + } + else if(flags == O_CREAT){ + struct vnode* target_dir; + vfs_get_node(pathname, &target_dir); + if(target_dir == NULL){ + printf("\r\n[ERROR] Cannot find the parent directory"); + return -1; + } + + char* file_name = get_file_name(pathname); + + if(target_dir->mount != NULL) + ret = target_dir->mount->root->v_ops->create(target_dir->mount->root, &vnode, file_name); + else + ret = target_dir->v_ops->create(target_dir, &vnode, file_name); + + if(ret != 0){ + printf("\r\n[ERROR] Cannot create the file"); + return -1; + } + *target = create_file(vnode, flags); + return ret; + } + + struct file* file = create_file(vnode, flags); + *target = file; + if(vnode->f_ops->open(vnode, &file) != 0){ + printf("\r\n[ERROR] Cannot open the file"); + return -1; + } + + return 0; +} + +int vfs_close(struct file* file) { + // 1. release the file handle + // 2. Return error code if fails + int ret = file->f_ops->close(file); + dfree(file); + return ret; +} + +int vfs_write(struct file* file, const void* buf, size_t len) { + // 1. write len byte from buf to the opened file. + // 2. return written size or error code if an error occurs. + int ret; + if(file->vnode->mount != NULL) + ret = file->vnode->mount->root->f_ops->write(file, buf, len); + else + ret = file->f_ops->write(file, buf, len); + return ret; +} + +int vfs_read(struct file* file, void* buf, size_t len) { + // 1. read min(len, readable size) byte to buf from the opened file. + // 2. block if nothing to read for FIFO type + // 2. return read size or error code if an error occurs. + int ret = file->f_ops->read(file, buf, len); + return ret; +} + +int vfs_mkdir(const char* pathname) +{ + + struct vnode* target_dir; + struct vnode* vnode = vfs_get_node(pathname, &target_dir); + if(vnode != NULL) + { + printf("\r\n[ERROR] Directory already exists"); + return CERROR; + } + + if(target_dir == NULL) + { + printf("\r\n[ERROR] Cannot find the parent directory"); + return CERROR; + } + struct vnode* new_dir; + char* file_name = get_file_name(pathname); + printf("\r\n[MKDIR] pathname: "); printf(pathname); printf(" , filename: "); printf(file_name); + + + int ret; + if(target_dir->mount != NULL){ // check if it is a mount point + ret = target_dir->mount->root->v_ops->mkdir(target_dir->mount->root, &new_dir, file_name); + } + else { + ret = target_dir->v_ops->mkdir(target_dir, &new_dir, file_name); + } + + if(ret != 0) + { + printf("\r\n[ERROR] Cannot create directory"); + dfree(file_name); + return CERROR; + } + dfree(file_name); + return 0; +} + +int vfs_mknod(const char* pathname, int id) +{ + + struct file* file = (struct file*)dynamic_alloc(sizeof(struct file)); + + vfs_open(pathname, O_CREAT, &file); + file->vnode->f_ops = &global_dev[id]; // set the file operations + vfs_close(file); + return 0; +} + +int vfs_mount(const char* target, const char* filesystem) // mount the filesystem to the target +{ + // struct mount* mount_point = (struct mount*)dynamic_alloc(sizeof(struct mount)); + struct filesystem* fs = (struct filesystem*)dynamic_alloc(sizeof(struct filesystem)); + + struct vnode* vnode = vfs_get_node(target, 0); + if(vnode == NULL) + { + vfs_mkdir(target); + vnode = vfs_get_node(target, 0); + } + + vnode->mount = (struct mount*)dynamic_alloc(sizeof(struct mount)); + + fs->name = (char*)dynamic_alloc(16); + if(!strcmp(filesystem, "tmpfs")) + { + + strcpy(fs->name, "tmpfs"); + + fs->setup_mount = tmpfs_setup_mount; + + } + else if(!strcmp(filesystem, "initramfs")) + { + strcpy(fs->name, "initramfs"); + + fs->setup_mount = initramfs_setup_mount; + } + else + { + printf("\r\n[ERROR] Filesystem not found"); + return CERROR; + } + + register_filesystem(fs); + fs->setup_mount(fs, &vnode->mount); + + vnode->mount->root->parent = vnode->parent; + + return 0; +} +int vfs_lookup(const char* pathname, struct vnode** target) +{ + struct vnode* vnode = vfs_get_node(pathname, NULL); + if(vnode == NULL) + { + return -1; + } + *target = vnode; + return 0; +} + +int vfs_list(const char* pathname) +{ + struct vnode* vnode; + int ret = vfs_lookup(pathname, &vnode); + + if(ret != 0) + { + printf("\r\n[ERROR] Cannot find the directory"); + return -1; + } + if(vnode->mount != NULL){ // check if it is a mount point + ret = vnode->mount->root->v_ops->list(vnode->mount->root); + } + else { + ret = vnode->v_ops->list(vnode); + } + if(ret != 0) + { + printf("\r\n[ERROR] Cannot list the directory"); + return CERROR; + } + return 0; +} + + +int vfs_chdir(const char* relative_path) +{ + char* current_abs_path = current->cwd; + char* new_abs_path = (char*)dynamic_alloc(strlen(current_abs_path) + strlen(relative_path) + 4); + strcpy(new_abs_path, current_abs_path); + if(relative_path[0] == '/'){ // absolute path + strcpy(new_abs_path, relative_path); + } + else{ // relative path + strcpy(new_abs_path, current_abs_path); + strcpy(new_abs_path + strlen(current_abs_path), relative_path); + } + + if(new_abs_path[strlen(new_abs_path)-1] != '/'){ // add '/' at the end + new_abs_path[strlen(new_abs_path)] = '/'; + new_abs_path[strlen(new_abs_path)+1] = '\0'; + } + + // printf("\r\n[CHDIR] new_abs_path: "); printf(new_abs_path); + struct vnode* vnode = vfs_get_node(new_abs_path, NULL); + + if(vnode == NULL) + { + printf("\r\n[ERROR] Cannot find the directory"); + return CERROR; + } + + // printf("\r\n[INFO] File descriptor 0: "); printf_hex((unsigned long)current->fd_table.fds[0]); + // printf("\r\n[INFO] File descriptor 1: "); printf_hex((unsigned long)current->fd_table.fds[1]); + // printf("\r\n[INFO] File descriptor 2: "); printf_hex((unsigned long)current->fd_table.fds[2]); + + // simplify_path(new_abs_path); + // printf("\r\n[CHDIR] new_abs_path(simplified): "); printf(new_abs_path); + // printf("\r\n[INFO] File descriptor 0: "); printf_hex((unsigned long)current->fd_table.fds[0]); + // printf("\r\n[INFO] File descriptor 1: "); printf_hex((unsigned long)current->fd_table.fds[1]); + // printf("\r\n[INFO] File descriptor 2: "); printf_hex((unsigned long)current->fd_table.fds[2]); + preempt_enable(); + strcpy(current->cwd, new_abs_path); + preempt_disable(); + + return 0; +} + + +int vfs_exec(const char* pathname, char* const argv[]) +{ + struct file* file; + int ret = vfs_open(pathname, O_RW, &file); + + if(ret != 0) + { + printf("\r\n[ERROR] Cannot open the file"); + return CERROR; + } + + int filesize = file->vnode->f_ops->getsize(file->vnode); + void* user_program_addr = balloc(filesize+THREAD_SIZE); + + vfs_read(file, user_program_addr, filesize); + + printf("\r\n[EXEC] File: "); printf(pathname); printf(" , size: "); printf_hex(filesize); + + preempt_disable(); // leads to get the correct current task + + current->state = TASK_STOPPED; + + unsigned long tmp; + asm volatile("mrs %0, cntkctl_el1" : "=r"(tmp)); + tmp |= 1; + asm volatile("msr cntkctl_el1, %0" : : "r"(tmp)); + + copy_process(PF_KTHREAD, (unsigned long)&kp_user_mode, (unsigned long)user_program_addr, 0); + + preempt_enable(); + + return 0; +} + + +struct vnode* vfs_get_node(const char* pathname, struct vnode** target_dir) +{ + struct vnode* start_node; + + if(pathname[0] == '/'){ + start_node = rootfs->root; + return next_step(start_node, pathname+1, target_dir); + } + else{ + start_node = vfs_get_node(current->cwd, NULL); + return next_step(start_node, pathname, target_dir); + } + return NULL; +} + +static struct vnode* next_step(struct vnode* start_node, const char* pathname, struct vnode** target_dir) +{ + char* tmp_path = (char*)dynamic_alloc(strlen(pathname)+1); + strcpy(tmp_path, pathname); + char* token = strtok(tmp_path, "/"); + // if(strlen(token) == 0) { token = NULL; } + struct vnode* current_node = start_node; + + while(token != NULL){ + *target_dir = current_node; + if(!strcmp(token, "..")){ // [TODO] might have bugs when the path contains mount points + if(current_node->parent == NULL){ + current_node = NULL; + goto next_step_end; + } + current_node = current_node->parent; + } + else if(!strcmp(token, ".")){ + // do nothing + } + else{ + struct vnode* next_node; + if(current_node->mount != NULL){ + if(current_node->mount->root->v_ops->lookup(current_node->mount->root, &next_node, token) == 0){ + current_node = next_node; + } + else{ + current_node = NULL; + goto next_step_end; + } + } + else if(current_node->v_ops->lookup(current_node, &next_node, token) == 0){ + current_node = next_node; + } + else{ + current_node = NULL; + goto next_step_end; + } + } + token = strtok(NULL, "/"); + } +next_step_end: + dfree(tmp_path); + return current_node; +} + +static struct file* create_file(struct vnode* vnode, int flags) +{ + struct file* file = (struct file*)dynamic_alloc(sizeof(struct file)); + file->vnode = vnode; + file->f_pos = 0; + file->f_ops = vnode->f_ops; + file->flags = flags; + return file; +} + + +static char* get_file_name(const char* pathname) +{ + char* file_name = (char*)dynamic_alloc(16); + int i; + for(i = strlen(pathname)-1; i >= 0; i--){ + if(pathname[i] == '/'){ + break; + } + } + if(i == -1){ + strcpy(file_name, pathname); + } + else{ + strcpy(file_name, pathname+i+1); + } + return file_name; +} + +static void simplify_path(char* pathname) +{ + + // printf("\r\n"); printf(__func__); + #define MAX_SEGMENTS 256 + + char* tmp_path = (char*)dynamic_alloc(strlen(pathname)+1); + char* new_path = (char*)dynamic_alloc(strlen(pathname)+1); + + strcpy(tmp_path, pathname); + + char* segments[MAX_SEGMENTS]; + int n_segments = 0; + + char* token = strtok(tmp_path, "/"); + int isFirst = 1; // avoid the first NULL token + while(token != NULL || isFirst == 1){ + isFirst = 0; + if(token != NULL){ + segments[n_segments] = (char*)dynamic_alloc(strlen(token)+1); + strcpy(segments[n_segments++], token); + } + token = strtok(NULL, "/"); + } + + int need_segment[MAX_SEGMENTS]; + int need_idx = 0; + for(int i=0; i 0){ + need_idx--; + } + } + else{ + need_segment[need_idx++] = i; + } + } + + // printf("\r\n[DEBUG] need_idx: "); printf_int(need_idx); + + for(int i=0; ic_namesize, 16, 8); + int filesize = strtol(head->c_filesize, 16, 8); + + char *filename = (void*)head + head_size; + + uint32_t offset = head_size + namesize; + if(offset % 4 != 0) offset = ((offset/4 +1)*4); + + if(strcmp(filename, "TRAILER!!!") == 0){ + printf("\nFile not found"); + break; + } + else if(strcmp(filename, target_name) == 0){ + /* The filedata is appended after filename */ + char *filedata = (void*)head + offset; + + printf("\r\n[INFO] File found: "); printf(target_name); printf(" in CPIO at "); printf_hex((unsigned long)filedata); + printf("\r\n[INFO] File Size: "); printf_hex(filesize); + + void* user_program_addr = balloc(filesize+THREAD_SIZE); // extra page in case + if(user_program_addr == NULL) return; + memzero_asm((unsigned long)user_program_addr, filesize+THREAD_SIZE); + for(int i=0; istate = TASK_STOPPED; + + unsigned long tmp; + asm volatile("mrs %0, cntkctl_el1" : "=r"(tmp)); + tmp |= 1; + asm volatile("msr cntkctl_el1, %0" : : "r"(tmp)); + + copy_process(PF_KTHREAD, (unsigned long)&kp_user_mode, (unsigned long)user_program_addr, 0); + + preempt_enable(); + break; + } + + if(filesize % 4 != 0) filesize = (filesize/4 +1)*4; + head = (void*)head + offset + filesize; + } + return; +} \ No newline at end of file From 68f02aad4ccbb8256d87f6bdb1b853f9e4045053 Mon Sep 17 00:00:00 2001 From: yui0303 Date: Thu, 20 Jun 2024 17:53:45 +0800 Subject: [PATCH 16/17] chore: add flags --- lab07/kernel/Makefile | 4 ++++ lab07/kernel/src/sys.S | 10 +++++----- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/lab07/kernel/Makefile b/lab07/kernel/Makefile index bf4e55536..d78176373 100644 --- a/lab07/kernel/Makefile +++ b/lab07/kernel/Makefile @@ -21,6 +21,10 @@ ifdef DYNAMIC_ALLOC_DEBUG COPS += -DYNAMIC_ALLOC_DEBUG endif +ifdef SYSCALL_DEBUG +COPS += -DSYSCALL_DEBUG +endif + .PHONY: clean clean: rm -rf $(BUILD_DIR) *.img diff --git a/lab07/kernel/src/sys.S b/lab07/kernel/src/sys.S index 9fecd659f..9aa5adaef 100644 --- a/lab07/kernel/src/sys.S +++ b/lab07/kernel/src/sys.S @@ -103,8 +103,8 @@ lseek64: ret -//.global ioctl -//ioctl: -// mov w8, #SYS_IOCTL_NUM -// svc #0 -// ret \ No newline at end of file +.global ioctl +ioctl: + mov w8, #SYS_IOCTL_NUM + svc #0 + ret \ No newline at end of file From c37908ff4e735121ad98ba42ddebba8ddb25dbda Mon Sep 17 00:00:00 2001 From: yui0303 Date: Thu, 27 Jun 2024 21:03:20 +0800 Subject: [PATCH 17/17] feat: lab8 --- lab8/bootloader/FAT_R.txt | 1 + lab8/bootloader/bcm2710-rpi-3-b-plus.dtb | Bin 0 -> 32761 bytes lab8/bootloader/config.txt | 3 + lab8/bootloader/include/bcm2837/rpi_base.h | 6 + lab8/bootloader/include/bcm2837/rpi_gpio.h | 25 + lab8/bootloader/include/bcm2837/rpi_uart1.h | 19 + lab8/bootloader/include/power.h | 8 + lab8/bootloader/include/shell.h | 23 + lab8/bootloader/include/uart1.h | 11 + lab8/bootloader/include/utils.h | 11 + lab8/bootloader/makefile | 42 + lab8/bootloader/src/boot.S | 52 + lab8/bootloader/src/link.ld | 30 + lab8/bootloader/src/main.c | 48 + lab8/bootloader/src/shell.c | 113 ++ lab8/bootloader/src/uart1.c | 83 + lab8/bootloader/src/utils.c | 133 ++ lab8/create_diskimg/create_img.sh | 42 + lab8/create_diskimg/initramfs.cpio | Bin 0 -> 1057792 bytes lab8/create_diskimg/sdcard/FAT_R.TXT | 1 + .../sdcard/bcm2710-rpi-3-b-plus.dtb | Bin 0 -> 32761 bytes lab8/create_diskimg/sdcard/bootcode.bin | 1652 +++++++++++++++++ lab8/create_diskimg/sdcard/config.txt | 3 + lab8/create_diskimg/sdcard/fixup.dat | Bin 0 -> 6745 bytes lab8/create_fs/create_cpio.sh | 11 + lab8/create_fs/initramfs.cpio | Bin 0 -> 1057792 bytes lab8/create_fs/lab3_user_proc/linker.ld | 5 + lab8/create_fs/lab3_user_proc/makefile | 23 + lab8/create_fs/lab3_user_proc/user_proc.S | 12 + .../initramfs_providedbyTA.cpio | Bin 0 -> 247296 bytes lab8/create_fs/rootfs/file0.txt | 2 + lab8/create_fs/rootfs/file1.txt | 11 + lab8/debug.gdb | 2 + lab8/initramfs.cpio | Bin 0 -> 1057792 bytes lab8/kernel/bcm2710-rpi-3-b-plus.dtb | Bin 0 -> 32761 bytes lab8/kernel/include/bcm2837/rpi_base.h | 7 + lab8/kernel/include/bcm2837/rpi_gpio.h | 25 + lab8/kernel/include/bcm2837/rpi_irq.h | 24 + lab8/kernel/include/bcm2837/rpi_mbox.h | 17 + lab8/kernel/include/bcm2837/rpi_mmu.h | 8 + lab8/kernel/include/bcm2837/rpi_uart1.h | 19 + lab8/kernel/include/cpio.h | 41 + lab8/kernel/include/dev_framebuffer.h | 24 + lab8/kernel/include/dev_uart.h | 15 + lab8/kernel/include/dtb.h | 28 + lab8/kernel/include/exception.h | 81 + lab8/kernel/include/fat32.h | 208 +++ lab8/kernel/include/initramfs.h | 37 + lab8/kernel/include/irqtask.h | 22 + lab8/kernel/include/list.h | 223 +++ lab8/kernel/include/mbox.h | 63 + lab8/kernel/include/memory.h | 71 + lab8/kernel/include/mmu.h | 69 + lab8/kernel/include/power.h | 9 + lab8/kernel/include/sched.h | 70 + lab8/kernel/include/sdhost.h | 8 + lab8/kernel/include/shell.h | 29 + lab8/kernel/include/signal.h | 47 + lab8/kernel/include/stddef.h | 11 + lab8/kernel/include/string.h | 24 + lab8/kernel/include/syscall.h | 34 + lab8/kernel/include/timer.h | 29 + lab8/kernel/include/tmpfs.h | 38 + lab8/kernel/include/uart1.h | 18 + lab8/kernel/include/vfs.h | 91 + lab8/kernel/initramfs.cpio | Bin 0 -> 1057792 bytes lab8/kernel/makefile | 56 + lab8/kernel/src/boot.S | 83 + lab8/kernel/src/cpio.c | 45 + lab8/kernel/src/dev_framebuffer.c | 124 ++ lab8/kernel/src/dev_uart.c | 49 + lab8/kernel/src/dtb.c | 152 ++ lab8/kernel/src/entry.S | 196 ++ lab8/kernel/src/exception.c | 93 + lab8/kernel/src/fat32.c | 1309 +++++++++++++ lab8/kernel/src/initramfs.c | 163 ++ lab8/kernel/src/irqtask.c | 65 + lab8/kernel/src/link.ld | 27 + lab8/kernel/src/main.c | 42 + lab8/kernel/src/mbox.c | 23 + lab8/kernel/src/memory.c | 380 ++++ lab8/kernel/src/mmu.c | 166 ++ lab8/kernel/src/sched.S | 59 + lab8/kernel/src/sched.c | 179 ++ lab8/kernel/src/sdhost.c | 243 +++ lab8/kernel/src/shell.c | 219 +++ lab8/kernel/src/signal.c | 68 + lab8/kernel/src/string.c | 313 ++++ lab8/kernel/src/syscall.c | 418 +++++ lab8/kernel/src/timer.c | 163 ++ lab8/kernel/src/tmpfs.c | 212 +++ lab8/kernel/src/uart1.c | 172 ++ lab8/kernel/src/vfs.c | 343 ++++ lab8/toolbox/send_image_to_bootloader.py | 62 + 94 files changed, 9186 insertions(+) create mode 100644 lab8/bootloader/FAT_R.txt create mode 100644 lab8/bootloader/bcm2710-rpi-3-b-plus.dtb create mode 100644 lab8/bootloader/config.txt create mode 100644 lab8/bootloader/include/bcm2837/rpi_base.h create mode 100644 lab8/bootloader/include/bcm2837/rpi_gpio.h create mode 100644 lab8/bootloader/include/bcm2837/rpi_uart1.h create mode 100644 lab8/bootloader/include/power.h create mode 100644 lab8/bootloader/include/shell.h create mode 100644 lab8/bootloader/include/uart1.h create mode 100644 lab8/bootloader/include/utils.h create mode 100644 lab8/bootloader/makefile create mode 100644 lab8/bootloader/src/boot.S create mode 100644 lab8/bootloader/src/link.ld create mode 100644 lab8/bootloader/src/main.c create mode 100644 lab8/bootloader/src/shell.c create mode 100644 lab8/bootloader/src/uart1.c create mode 100644 lab8/bootloader/src/utils.c create mode 100755 lab8/create_diskimg/create_img.sh create mode 100644 lab8/create_diskimg/initramfs.cpio create mode 100644 lab8/create_diskimg/sdcard/FAT_R.TXT create mode 100644 lab8/create_diskimg/sdcard/bcm2710-rpi-3-b-plus.dtb create mode 100644 lab8/create_diskimg/sdcard/bootcode.bin create mode 100644 lab8/create_diskimg/sdcard/config.txt create mode 100644 lab8/create_diskimg/sdcard/fixup.dat create mode 100755 lab8/create_fs/create_cpio.sh create mode 100644 lab8/create_fs/initramfs.cpio create mode 100644 lab8/create_fs/lab3_user_proc/linker.ld create mode 100644 lab8/create_fs/lab3_user_proc/makefile create mode 100644 lab8/create_fs/lab3_user_proc/user_proc.S create mode 100644 lab8/create_fs/lab5_user_fork/initramfs_providedbyTA.cpio create mode 100644 lab8/create_fs/rootfs/file0.txt create mode 100644 lab8/create_fs/rootfs/file1.txt create mode 100644 lab8/debug.gdb create mode 100644 lab8/initramfs.cpio create mode 100644 lab8/kernel/bcm2710-rpi-3-b-plus.dtb create mode 100644 lab8/kernel/include/bcm2837/rpi_base.h create mode 100644 lab8/kernel/include/bcm2837/rpi_gpio.h create mode 100644 lab8/kernel/include/bcm2837/rpi_irq.h create mode 100644 lab8/kernel/include/bcm2837/rpi_mbox.h create mode 100644 lab8/kernel/include/bcm2837/rpi_mmu.h create mode 100644 lab8/kernel/include/bcm2837/rpi_uart1.h create mode 100644 lab8/kernel/include/cpio.h create mode 100644 lab8/kernel/include/dev_framebuffer.h create mode 100644 lab8/kernel/include/dev_uart.h create mode 100644 lab8/kernel/include/dtb.h create mode 100644 lab8/kernel/include/exception.h create mode 100644 lab8/kernel/include/fat32.h create mode 100644 lab8/kernel/include/initramfs.h create mode 100644 lab8/kernel/include/irqtask.h create mode 100644 lab8/kernel/include/list.h create mode 100644 lab8/kernel/include/mbox.h create mode 100644 lab8/kernel/include/memory.h create mode 100644 lab8/kernel/include/mmu.h create mode 100644 lab8/kernel/include/power.h create mode 100644 lab8/kernel/include/sched.h create mode 100644 lab8/kernel/include/sdhost.h create mode 100644 lab8/kernel/include/shell.h create mode 100644 lab8/kernel/include/signal.h create mode 100644 lab8/kernel/include/stddef.h create mode 100644 lab8/kernel/include/string.h create mode 100644 lab8/kernel/include/syscall.h create mode 100644 lab8/kernel/include/timer.h create mode 100644 lab8/kernel/include/tmpfs.h create mode 100644 lab8/kernel/include/uart1.h create mode 100644 lab8/kernel/include/vfs.h create mode 100644 lab8/kernel/initramfs.cpio create mode 100644 lab8/kernel/makefile create mode 100644 lab8/kernel/src/boot.S create mode 100644 lab8/kernel/src/cpio.c create mode 100644 lab8/kernel/src/dev_framebuffer.c create mode 100644 lab8/kernel/src/dev_uart.c create mode 100644 lab8/kernel/src/dtb.c create mode 100644 lab8/kernel/src/entry.S create mode 100644 lab8/kernel/src/exception.c create mode 100644 lab8/kernel/src/fat32.c create mode 100644 lab8/kernel/src/initramfs.c create mode 100644 lab8/kernel/src/irqtask.c create mode 100644 lab8/kernel/src/link.ld create mode 100644 lab8/kernel/src/main.c create mode 100644 lab8/kernel/src/mbox.c create mode 100644 lab8/kernel/src/memory.c create mode 100644 lab8/kernel/src/mmu.c create mode 100644 lab8/kernel/src/sched.S create mode 100644 lab8/kernel/src/sched.c create mode 100644 lab8/kernel/src/sdhost.c create mode 100644 lab8/kernel/src/shell.c create mode 100644 lab8/kernel/src/signal.c create mode 100644 lab8/kernel/src/string.c create mode 100644 lab8/kernel/src/syscall.c create mode 100644 lab8/kernel/src/timer.c create mode 100644 lab8/kernel/src/tmpfs.c create mode 100644 lab8/kernel/src/uart1.c create mode 100644 lab8/kernel/src/vfs.c create mode 100755 lab8/toolbox/send_image_to_bootloader.py diff --git a/lab8/bootloader/FAT_R.txt b/lab8/bootloader/FAT_R.txt new file mode 100644 index 000000000..5d2252cd1 --- /dev/null +++ b/lab8/bootloader/FAT_R.txt @@ -0,0 +1 @@ +fat_r test \ No newline at end of file diff --git a/lab8/bootloader/bcm2710-rpi-3-b-plus.dtb b/lab8/bootloader/bcm2710-rpi-3-b-plus.dtb new file mode 100644 index 0000000000000000000000000000000000000000..38395a23fc90767680815c7f43bbfb3a290c2af0 GIT binary patch literal 32761 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�D&OoC_~4g9tivONVZxf$G+%wkS(-3$L@6`g_7TDCjX zZ0wGe1kn#$y$N03GHt`At5nL~a;sv6?tVfLDtBzZfvLbSPPlEX)KP=ol3y$FuZ?K# zXq{r6RCi!U&_G1m5U=65R9h>Z>G;rAvqX;HRd$z~6%TKR)pAgjR>?KEc2EoOFI}HT z(Zk+nZg2C&R%k#PL<|DCfDac}0}-x51h)~K?qcnF74kM)Fxcu&T_b z;N~L)VOxvMMmg|KwHr9ZRqhdz%wl+uLlI??rK2!lgi~v-g%I6`f&Mc>*Fc1>5Jg9` z^17#s*d9?dyRD%lOrK+iLQh^iVS_5lE(U?YdK6{9i&rZx;GjZX*QY@bZ2zJ#%`RG- zkJK}Q(H=>QUv1*wgAN>)c8|B*&27)R8E*hT~6VH+RLhvRq~;)h{3J~sayp*djcq?x^z z*=bP$8ODfDCznO<1T0!-efE&~Xu4M?b4?Ws7QJ>Z)|qMrada*+YQ<9qvbpLa3nJ%q zqJM5wVdWq~YHPXb@qjovoJ|L>VpsV3h4W*g84}b?cxp=Ca`=_C$B&co(w^hZu*X+ysto}0S)*bX?FdxfaP>9TytA4wwD77_a_A9Hp#OVEWA!Fl_#JplwLCf-}ERJi*| MwhYsc7a#HeA5G>kdjJ3c literal 0 HcmV?d00001 diff --git a/lab8/bootloader/config.txt b/lab8/bootloader/config.txt new file mode 100644 index 000000000..15654a481 --- /dev/null +++ b/lab8/bootloader/config.txt @@ -0,0 +1,3 @@ +kernel=bootloader.img +arm_64bit=1 +initramfs initramfs.cpio 0x8000000 diff --git a/lab8/bootloader/include/bcm2837/rpi_base.h b/lab8/bootloader/include/bcm2837/rpi_base.h new file mode 100644 index 000000000..e3259e8de --- /dev/null +++ b/lab8/bootloader/include/bcm2837/rpi_base.h @@ -0,0 +1,6 @@ +#ifndef _RPI_BASE_H_ +#define _RPI_BASE_H_ + +#define PERIPHERAL_BASE 0x3F000000 + +#endif /*_RPI_BASE_H_ */ diff --git a/lab8/bootloader/include/bcm2837/rpi_gpio.h b/lab8/bootloader/include/bcm2837/rpi_gpio.h new file mode 100644 index 000000000..e5133708a --- /dev/null +++ b/lab8/bootloader/include/bcm2837/rpi_gpio.h @@ -0,0 +1,25 @@ +#ifndef _RPI_GPIO_H_ +#define _RPI_GPIO_H_ + +#include "bcm2837/rpi_base.h" + +#define GPFSEL0 ((volatile unsigned int*)(PERIPHERAL_BASE+0x00200000)) +#define GPFSEL1 ((volatile unsigned int*)(PERIPHERAL_BASE+0x00200004)) +#define GPFSEL2 ((volatile unsigned int*)(PERIPHERAL_BASE+0x00200008)) +#define GPFSEL3 ((volatile unsigned int*)(PERIPHERAL_BASE+0x0020000C)) +#define GPFSEL4 ((volatile unsigned int*)(PERIPHERAL_BASE+0x00200010)) +#define GPFSEL5 ((volatile unsigned int*)(PERIPHERAL_BASE+0x00200014)) +#define GPSET0 ((volatile unsigned int*)(PERIPHERAL_BASE+0x0020001C)) +#define GPSET1 ((volatile unsigned int*)(PERIPHERAL_BASE+0x00200020)) +#define GPCLR0 ((volatile unsigned int*)(PERIPHERAL_BASE+0x00200028)) +#define GPLEV0 ((volatile unsigned int*)(PERIPHERAL_BASE+0x00200034)) +#define GPLEV1 ((volatile unsigned int*)(PERIPHERAL_BASE+0x00200038)) +#define GPEDS0 ((volatile unsigned int*)(PERIPHERAL_BASE+0x00200040)) +#define GPEDS1 ((volatile unsigned int*)(PERIPHERAL_BASE+0x00200044)) +#define GPHEN0 ((volatile unsigned int*)(PERIPHERAL_BASE+0x00200064)) +#define GPHEN1 ((volatile unsigned int*)(PERIPHERAL_BASE+0x00200068)) +#define GPPUD ((volatile unsigned int*)(PERIPHERAL_BASE+0x00200094)) +#define GPPUDCLK0 ((volatile unsigned int*)(PERIPHERAL_BASE+0x00200098)) +#define GPPUDCLK1 ((volatile unsigned int*)(PERIPHERAL_BASE+0x0020009C)) + +#endif /*_RPI_GPIO_H_*/ diff --git a/lab8/bootloader/include/bcm2837/rpi_uart1.h b/lab8/bootloader/include/bcm2837/rpi_uart1.h new file mode 100644 index 000000000..959130656 --- /dev/null +++ b/lab8/bootloader/include/bcm2837/rpi_uart1.h @@ -0,0 +1,19 @@ +#ifndef _RPI_UART1_H_ +#define _RPI_UART1_H_ + +#include "bcm2837/rpi_base.h" + +#define AUX_ENABLES ((volatile unsigned int*)(PERIPHERAL_BASE+0x00215004)) +#define AUX_MU_IO_REG ((volatile unsigned int*)(PERIPHERAL_BASE+0x00215040)) +#define AUX_MU_IER_REG ((volatile unsigned int*)(PERIPHERAL_BASE+0x00215044)) +#define AUX_MU_IIR_REG ((volatile unsigned int*)(PERIPHERAL_BASE+0x00215048)) +#define AUX_MU_LCR_REG ((volatile unsigned int*)(PERIPHERAL_BASE+0x0021504C)) +#define AUX_MU_MCR_REG ((volatile unsigned int*)(PERIPHERAL_BASE+0x00215050)) +#define AUX_MU_LSR_REG ((volatile unsigned int*)(PERIPHERAL_BASE+0x00215054)) +#define AUX_MU_MSR_REG ((volatile unsigned int*)(PERIPHERAL_BASE+0x00215058)) +#define AUX_MU_SCRATCH ((volatile unsigned int*)(PERIPHERAL_BASE+0x0021505C)) +#define AUX_MU_CNTL_REG ((volatile unsigned int*)(PERIPHERAL_BASE+0x00215060)) +#define AUX_MU_STAT_REG ((volatile unsigned int*)(PERIPHERAL_BASE+0x00215064)) +#define AUX_MU_BAUD_REG ((volatile unsigned int*)(PERIPHERAL_BASE+0x00215068)) + +#endif /*_RPI_UART1_H_ */ diff --git a/lab8/bootloader/include/power.h b/lab8/bootloader/include/power.h new file mode 100644 index 000000000..baf990974 --- /dev/null +++ b/lab8/bootloader/include/power.h @@ -0,0 +1,8 @@ +#ifndef _POWER_H_ +#define _POWER_H_ + +#define PM_PASSWORD 0x5a000000 +#define PM_RSTC 0x3F10001c +#define PM_WDOG 0x3F100024 + +#endif /*_POWER_H_*/ diff --git a/lab8/bootloader/include/shell.h b/lab8/bootloader/include/shell.h new file mode 100644 index 000000000..702f5eb14 --- /dev/null +++ b/lab8/bootloader/include/shell.h @@ -0,0 +1,23 @@ +#ifndef _SHELL_H_ +#define _SHELL_H_ + +#define CLI_MAX_CMD 3 +#define CMD_MAX_LEN 32 +#define MSG_MAX_LEN 128 + +typedef struct CLI_CMDS +{ + char command[CMD_MAX_LEN]; + char help[MSG_MAX_LEN]; +} CLI_CMDS; + +void cli_cmd_clear(char*, int); +void cli_cmd_read(char*); +void cli_cmd_exec(char*); +void cli_print_banner(); + +void do_cmd_help(); +void do_cmd_loadimg(); +void do_cmd_reboot(); + +#endif /* _SHELL_H_ */ diff --git a/lab8/bootloader/include/uart1.h b/lab8/bootloader/include/uart1.h new file mode 100644 index 000000000..329d25c81 --- /dev/null +++ b/lab8/bootloader/include/uart1.h @@ -0,0 +1,11 @@ +#ifndef _UART1_H_ +#define _UART1_H_ + +void uart_init(); +char uart_getc(); +char uart_recv(); +void uart_send(unsigned int c); +int uart_puts(char* fmt, ...); +void uart_2hex(unsigned int d); + +#endif /*_UART1_H_*/ diff --git a/lab8/bootloader/include/utils.h b/lab8/bootloader/include/utils.h new file mode 100644 index 000000000..e65ece675 --- /dev/null +++ b/lab8/bootloader/include/utils.h @@ -0,0 +1,11 @@ +#ifndef _UTILS_H_ +#define _UTILS_H_ + +#define VSPRINT_MAX_BUF_SIZE 128 + +unsigned int sprintf(char *dst, char* fmt, ...); +unsigned int vsprintf(char *dst,char* fmt, __builtin_va_list args); + +int strcmp(const char*, const char*); + +#endif /* _UTILS_H_ */ diff --git a/lab8/bootloader/makefile b/lab8/bootloader/makefile new file mode 100644 index 000000000..b81bad692 --- /dev/null +++ b/lab8/bootloader/makefile @@ -0,0 +1,42 @@ +ARMGNU ?= aarch64-linux-gnu + +CFLAGS = -Wall -nostdlib -nostartfiles -ffreestanding -Iinclude -mgeneral-regs-only +ASMFLAGS = -Iinclude + +BUILD_DIR = build +SRC_DIR = src +#--------------------------------------------------------------------------------------- + +C_FILES = $(wildcard $(SRC_DIR)/*.c) +ASM_FILES = $(wildcard $(SRC_DIR)/*.S) +OBJ_FILES = $(C_FILES:$(SRC_DIR)/%.c=$(BUILD_DIR)/%_c.o) +OBJ_FILES += $(ASM_FILES:$(SRC_DIR)/%.S=$(BUILD_DIR)/%_s.o) + +DEP_FILES = $(OBJ_FILES:%.o=%.d) +-include $(DEP_FILES) + +$(BUILD_DIR)/%_c.o: $(SRC_DIR)/%.c + @mkdir -p $(@D) + $(ARMGNU)-gcc $(CFLAGS) -MMD -c $< -o $@ + +$(BUILD_DIR)/%_s.o: $(SRC_DIR)/%.S + $(ARMGNU)-gcc $(ASMFLAGS) -MMD -c $< -o $@ + +bootloader.img: $(SRC_DIR)/link.ld $(OBJ_FILES) + $(ARMGNU)-ld -T $(SRC_DIR)/link.ld -o $(BUILD_DIR)/bootloader.elf $(OBJ_FILES) + $(ARMGNU)-objcopy $(BUILD_DIR)/bootloader.elf -O binary bootloader.img + +all: bootloader.img + +clean: + rm -rf $(BUILD_DIR) *.img + +run_std: + qemu-system-aarch64 -M raspi3b -kernel bootloader.img -serial null -serial stdio -initrd initramfs.cpio -dtb bcm2710-rpi-3-b-plus.dtb + +run_pty: + qemu-system-aarch64 -M raspi3b -kernel bootloader.img -serial null -serial pty -initrd initramfs.cpio -dtb bcm2710-rpi-3-b-plus.dtb + +debug: + qemu-system-aarch64 -M raspi3b -kernel bootloader.img -display none -S -s + diff --git a/lab8/bootloader/src/boot.S b/lab8/bootloader/src/boot.S new file mode 100644 index 000000000..c872f56a7 --- /dev/null +++ b/lab8/bootloader/src/boot.S @@ -0,0 +1,52 @@ +/* ARMv8 Assembly Instruction */ +/** + +mov x0, x1 + sets: x0 = x1 +ldr x0, + load 32bits from to x0 +ldr w0, + load 64bits from to w0 +cbz x0, &Gzq!K+L4X!~ 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

-e!a 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 UK7Zw1jl*ekMO}WXtLW$dAG(TTm;e9( literal 0 HcmV?d00001 diff --git a/lab8/create_diskimg/sdcard/FAT_R.TXT b/lab8/create_diskimg/sdcard/FAT_R.TXT new file mode 100644 index 000000000..5d2252cd1 --- /dev/null +++ b/lab8/create_diskimg/sdcard/FAT_R.TXT @@ -0,0 +1 @@ +fat_r test \ No newline at end of file diff --git a/lab8/create_diskimg/sdcard/bcm2710-rpi-3-b-plus.dtb b/lab8/create_diskimg/sdcard/bcm2710-rpi-3-b-plus.dtb new file mode 100644 index 0000000000000000000000000000000000000000..38395a23fc90767680815c7f43bbfb3a290c2af0 GIT binary patch literal 32761 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�D&OoC_~4g9tivONVZxf$G+%wkS(-3$L@6`g_7TDCjX zZ0wGe1kn#$y$N03GHt`At5nL~a;sv6?tVfLDtBzZfvLbSPPlEX)KP=ol3y$FuZ?K# zXq{r6RCi!U&_G1m5U=65R9h>Z>G;rAvqX;HRd$z~6%TKR)pAgjR>?KEc2EoOFI}HT z(Zk+nZg2C&R%k#PL<|DCfDac}0}-x51h)~K?qcnF74kM)Fxcu&T_b z;N~L)VOxvMMmg|KwHr9ZRqhdz%wl+uLlI??rK2!lgi~v-g%I6`f&Mc>*Fc1>5Jg9` z^17#s*d9?dyRD%lOrK+iLQh^iVS_5lE(U?YdK6{9i&rZx;GjZX*QY@bZ2zJ#%`RG- zkJK}Q(H=>QUv1*wgAN>)c8|B*&27)R8E*hT~6VH+RLhvRq~;)h{3J~sayp*djcq?x^z z*=bP$8ODfDCznO<1T0!-efE&~Xu4M?b4?Ws7QJ>Z)|qMrada*+YQ<9qvbpLa3nJ%q zqJM5wVdWq~YHPXb@qjovoJ|L>VpsV3h4W*g84}b?cxp=Ca`=_C$B&co(w^hZu*X+ysto}0S)*bX?FdxfaP>9TytA4wwD77_a_A9Hp#OVEWA!Fl_#JplwLCf-}ERJi*| MwhYsc7a#HeA5G>kdjJ3c literal 0 HcmV?d00001 diff --git a/lab8/create_diskimg/sdcard/bootcode.bin b/lab8/create_diskimg/sdcard/bootcode.bin new file mode 100644 index 000000000..23429a14d --- /dev/null +++ b/lab8/create_diskimg/sdcard/bootcode.bin @@ -0,0 +1,1652 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + firmware/bootcode.bin at master · raspberrypi/firmware · GitHub + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+ + + +
+ Skip to content + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+ + + + + + +
+ + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + +
+ + + + + +
+ + +
+ + + + + + + +Permalink + +
+ +
+
+ + + master + + + + +
+
+
+ Switch branches/tags + +
+ + + +
+ +
+ +
+ + +
+ +
+ + + + + + + + + + + + + + + + + +
+ + +
+
+
+
+ +
+ +
+ + +
+ +
+
+
+

Name already in use

+
+
+ +
+
+
+
+ +
A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch? +
+ +
+
+ + +
+
+ + + + Go to file + +
+ + + + +
+
+
+ + + + + + + + + +
+ +
+
+ + @popcornmix + + +
+ + Latest commit + bfbd42e + Oct 14, 2022 + + + + + + History + + +
+
+
firmware: arm_dt: Export the bootloader EEPROM RSA public key via device-tree
+
+firmware: Add tryboot A_B mode
+ +
+ +
+
+ + + 1 + + contributor + + +
+ +

+ Users who have contributed to this file +

+
+ + + + + + +
+
+
+
+ + + + + + + + + +
+ +
+ + +
+ + 51.2 KB +
+ +
+ + + + +
+
+ +
+
+ +
+ +
+
+ + + +
+ +
+ View raw +
+
+ +
+ + + + +
+ + +
+ + +
+
+ + + +
+ +
+ + +
+ +
+ + +
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + diff --git a/lab8/create_diskimg/sdcard/config.txt b/lab8/create_diskimg/sdcard/config.txt new file mode 100644 index 000000000..15654a481 --- /dev/null +++ b/lab8/create_diskimg/sdcard/config.txt @@ -0,0 +1,3 @@ +kernel=bootloader.img +arm_64bit=1 +initramfs initramfs.cpio 0x8000000 diff --git a/lab8/create_diskimg/sdcard/fixup.dat b/lab8/create_diskimg/sdcard/fixup.dat new file mode 100644 index 0000000000000000000000000000000000000000..e928ee3fc1bf00e638365cfa0bc4c9d94940bd7f GIT binary patch literal 6745 zcmeHLUx*cD6#str?009!>v+4adf8pK)wXTjmZ(iCMAXDAO{y1Dq)f6R5wZ}(h$7A2 z3L+mQ^(6?QKza-8B^0E`q=!K8t)d`&i0DBmsdK*h&dfLC+`Zo2G=t9EnRCAL_q*pi z-=CT005yBOa32hHf%RSF-NcVMg$1}o1|P%J=ieUVWou3xT-MD}<*mqK+Zb#TVcw)+ zlmf0UH8_x@4D7$nOK|xP&$_r&m2t%?>5aP}9BTAtP~i`o=I+C}#iM;)JA)_Zch#xr zW5~kk1#@+gyTiNn9-ZN*S*8o$_!`Kg_d;P|uRV=0H0y|1p>^6zA5&dioV~5{fb;Lj zbjQY)dDUz_ZOot682*_C-&>g=#+UkyIlPM;UFY_P7kG_e{6SwT7v68nYB*#fYjNjp z)2ae2vW6O~u&*X4)~PJf_ts4Gv-IZ_7Qw8u3{7l;vCRfivprz#6tz=>?nK5;APKic4au-bzMeXz{oSe#O;k}m`j$lvS;Mk(B zt2gKS*Oir8c)YOomS-F@T!tRII>!v@p_0t)Yaq6=&M*YA-F!122qYmhP>dEX@6327gxr8Lue# zy-uvHP^W=loD-Vo4A z;`6aAg?ygCKAw<#L}6HO#~W=*;sFlJfvdu(lSZrY)J$+bZ+3X8pcZeT z@i-Hc9IOc1mLMs_5}d)uSA|IGr~rc``|AYXTr3VoD4W1xAn!?3q|;Mz&`oFOA1yv| z?~^0p>PVvX)&LaxSEUX`WFZWhM-vLU0+JK3$!ow@&Q+{JH#0R$r&a66M#r}IoZ zYUt)eyjf*XssYrxznQ45b<WRw*eNqS&qc7S3W4(J zkh1+@pr8{pQcwJ$%S}G6Y-Zr{c>b28{VLLkf(J-E?N{|a=lZKqk zXN2HXo_20@@MggB8x>@@yw2n)KR$CJaz&+LYD>xU@VdKXj=T9Ih=8i!NL-5DEmW+q zeWYZ0%QoZkT#&cPQfjlIVDdK6Dp_lD zz?D({-j`iCOW}$Xu~YVRL~?^6f3DW|qtG+Xz{HbbwnM3-s|MHeY=njRd(SnN-5JL_ zs-V_&d^*~aoj92bu>wZUL^FUU-KqF`s{WSYonS4Qbc4qEnpu3E@F0fH5ni+gyY>)H TT!2(M{@_o%dmo8$>KOh8=fLZL literal 0 HcmV?d00001 diff --git a/lab8/create_fs/create_cpio.sh b/lab8/create_fs/create_cpio.sh new file mode 100755 index 000000000..f1270ba2c --- /dev/null +++ b/lab8/create_fs/create_cpio.sh @@ -0,0 +1,11 @@ +#!/bin/sh + +# Go to rootfs folder +# Select all files and put into archives +# '-o, --create' Run in copy-out mode +# '-H FORMAT' archive format, +# newc: SVR4 portable format + +cd rootfs +find . | cpio -o -H newc > ../initramfs.cpio +cd .. diff --git a/lab8/create_fs/initramfs.cpio b/lab8/create_fs/initramfs.cpio new file mode 100644 index 0000000000000000000000000000000000000000..08fa914524bd41a9ecc4d0eb44983850986ebc91 GIT binary patch literal 1057792 zcmeFa3#=sBc^=kxhmZBFEs76Bf~a_JRli?V{qC;ruCA(nzpLNR>Z%&<%yP%%zGh~% z6i9_5Qi%l!hIJDq0!2g`g+?OLj>W(Ug0W>~83l%v*a;t!jUaGxXGuB=Bm<_X2%ea$ z$@ib?zSA>1qNu&SBN1TD^zG`ZQ|J7z^ZLK@pNeH;*;qUlOJtJSGQMN6RJ>lL?^v>y zd*GWArLwVFJe_6N@BeYq#bW9EmmWAv?0yL@ly<+oBwf$N%PDsM&E>^2sZ1?Z-DRKH zmAkv}rX+|ba7p*> zDbnc$*9qOjwG+C>%6^aQ?wzObx$wm2-|upL;PgG}-6!7RI(Z$}-|teT)2Ft-k>&&V z{mCaj@R3_C*W}KH_lHg|d?0k}a&<1^xlcafdifHryIeO%@1lGz9DV-i9j-4w?Q(td z(i`{K^)s42?fUZRyIpthf$w`CblrY0(%%8UcqZh!@z=*L*U?k1k3Btp{emlW`oWvG z@4Q>Ri*kO(h4NLG>nYc3t|7_n^n>bc*E?MAJw+Z5r$f0fQ@JF^d!KeOe&6``KmOG> zAcIrzMtmZTbWe2M#`gzKe@&I1e(l1`8hH5N?)SHkUjE{dYjP^Ga)zf!OXrmL@8i15 z<@$o_R6P0Pces9TKh2Z$ya>8c2GM;7c^{!HDx-Ek?RzP|chc`)bM8GIaJ~G+e|K-9 z9^D)jSi1Xp5Ur%UH$MKGj$XGiymJA(Kt7NIlj-S&?fL!dCnW3b^%K|tOMgVVrL_1~ zT&|DY0pFw#mKUxOkLnYy$zLO0kpIK!KjrB9eWVBC_ZWJo^LJAEZN8Mp9q_ZS1L(rh zJ#_F6N(&i*c1I^v4$kj@UZRVhKY~qDn)^EZhfIe@D38hC6+3zDosgjd+7(AP|1+Zv zy0K#?(D%=|koG@98rMzG7)D*Q@eSF#T%Q`9CSA7~?O8nkIoLhw67v2E<@G0&Z&*`x(;PPAa(&5V zKXn3LZgZb-!L0E6CFl1s{f4b?^Z1hM)>9|Pu$5Cco+W$RPm4Ns^ogVKDQKX4UI$J4 zd8@cj^##vA1^tHZ_#L}D1s(U+uG?2Y(-V*ZT_?W&G5ES?xo&q!{%*$xTtDR+5UuxB20f4t*!54mEB@g4^lyR}knUXSQ_Hu^pE75AIDa z-@EriZ+zUT52R1z_XXF@_{mpb^G8o^>&I#Q+p?AzfH zmGS4!>J*;&{p~ZS71zlVPj2OdXD;kL^9M+CCk&gy2ln+9(DhB%txx>|>KMCr2hS?c z9p_%h_gT5R{x#9M z>T~#vFn?^jQ;Iwr2G9cE?oHhx88WO?*7h0yxrRIcAPr- z&v)nGo`TlRpNJXEshezy^N!5jL=TNKP~SKBLW* zIr)J(57Zi{N|B7QUeZe~t?W1r5`%*oebuaA=9 zx9R#;hTmZ4G{!pm=1{yx4?TZp|M}zGiHhg{?ss_pcOQEG%lPfkmOJ@haqf)y z{s|lN?b`Y?o4J)c`AN$A5%&Ch-a7Vo-TcyKbMAVM`}82E0nwpF(?#^9?)S(zGW}7{~+t zz~4HPfis_ZM+dwf*OAInVvk zR=;0_tYJTF9NW#>QAb$@Fz|^zVa~-@>zZ za2@=7$#wd!lYfBne{(;-<99QPPv0?KVC4cac9myVduXj%?@I?)F)3_iW5{a)q7^AKm6Kr#cO5w|^PWe|Dd~ zTMm7HZ~H9C2lV{x(U&qO$9U#%A^qRpPk-v9zqL)Tp)9qW``uF!^ofweC!To!9cNzf zC70{TlNTY6PwqdjKFQ?qv)kt{U2sh`m(D>UpP{oG_k!jpGRN)@9pPf zJ8ArTY5ob)&|LWSUERIur1|T6Y5sSlIUB>?`YR`p`L_N3oo$=ov|axl$qMb`9khc? zzpjfX-$2@L;rV-POz)&4`-eQg^50PUXH@C*laT8t(Wj+cFWcas&Yu8HD(v))kMG*Y zUuW&k=?_77e%EdC9_3>Gbo=NXt|66A<9rQ%7@`q=A(jr; zB=iAy-}w0dw3W-&F9VrS-@xXVpF^6@Ib~Cw)OKyw&5I|mLLSU_@Ht05*O@%k+dJRL zu8$x;5A#KVSI~2E2fvA*uY*tWDKOqZANd%FzW)=~@5}K%O?Tj5di{r7w_WOIM(Xwd z>KgeDXk37?4x^WNWOnnlSCtv#!%sJ7{Iq6-H@jaA5_g}{~N~2=_k2=ntCqKch&wOTd^E0=v9e?5$e1i5@ zU7xrxCi=*4L1o^gGT|pXJ4Zh7pS>5p!k?%7==#yO?@jK@ZfieepF6&(4Z3yl+jrLkw4A_d7c(rx2b-f7EmVaf%!YY%drQ1lD}m;XMc_O zL_VyIMq1);mzFzz?MHZ)7kJ-ZXU~H^ny;VnwUzfV+2sds-gf<)pZMyXPs2W*v;XaB z_9o@Y{D)VF?=3w&>fR8@_v)AY?sHcyI%fP((&&1*Ih6F_MbRDGiKkv10UutAJF;8vc7P{ z?DvuPPLEh!r*ZT@{Q=kH>3@3kvVGC{?$U4j=;d4JKc41@#bkBXKbfD{}_wT$tU(~3*!~^qj&FJIAXZY&SnDp zX&%mZ%RA}hb&}_IN?QR9kUL8YI=%+Jzm9hN8z}c*xzXnPU3Z^*)bnWX30M2+?LE>t z{dVDa@)$J@hj{tQkBQG-yY&2(554m2vsbRMi}>^6OIKbv-n)MM>?L5DmtC)3y?o=j z{IU0PtLe;(hsa{UHfyZ*{E&s@2F-L)-tmrsK7xqS87E*q8)rKkM%^K_D(W#@YS z#aCVct*o5uNdNo`H}2oW?=784%8L#`{OF4>e&m&xFy?2+_Se}n!Y)B#|9;}^zPNo( zV1(VzYkPJ^|3lfhocoEh`&+tF7q7l>^#;`R>~-gsc=lVo59XrGi`wNMyY#{{SB|%Y zU%zqr>I=t#m##sW$NrD`gWH^O{l!;EAln1KuUxw?R@cP|6meX8;qvyr_@NhHydl=L zi8T@?iwX2{!@73HE#!Z8e|~oV)kohSvjp3GDW6xb-%ogP`Qj_b&s=)Jf8+QgS3mmE z;}5@b?Gi`FHvL8Yx#Rwizj$`VeeB$L?#f4BqO-{sZhz(am21Z@U3-y?=pxsUfv}JVVCgaM=$;O_2WygUb+6_^H+|4 z?CRw!FA5i#WY#ES^FUr564e)YpIT>7Z>@FR~%d;IFv8_yj(=>uCc zx*QZPUc2()tJiN_fpI)=jM(LE`s3#=y>R)XSFY_pclpZmxcJah$H!H6`S_(vAHMp+ zhlPvJKY!^Z>*2hQkLfbAisSe;&8u(9>3*7oa1nZWQv%S7%Pbp+o-FpwNpLxtIKFn} z(&fE$Z!Qb%AEkTs+SMCZ_7lFj(1#Ol#roqfJVSZ3q32yQHRTQ z>GEX=%lk3bh$G#O4tD=lm+No5@;s|=j*?w2$eCr$q>MBAMl$CcxB4&MfPw!QI+4rA z&%B6SUbxJv^uVd2$JcLMx^^SN>dijeu8SC;(-Dg&lBskio0Bem=$Xq`o^`J7U)Rc& zYOTJzPR+6hpX~O6kB_JSB0t`8Fv-eKq%&u9Y|qc`{RPu_M%Qz z&)av(<1fKIqMPK-=-=}6z_q^wG=5k5*wINml%*{Dd=Kg20Uoz>dlSyTGrQXH_&xA_ zW>2JxtzGSO!tQ+!@WA8_`dR&;c5BPW*>B?QdxQ_7nMh@0$h|*wjqW`*J`%x_cO=EU zycG0~(rJGpTJnv&8PE{NwX`o0k9&vHBCl}~p6DEM93SWW;iQz47hX%tjl9Kd$SY-n zhV1A4)nzE#XpKfnE^3GPR)XieQ7+DLzELpiPo&e{GKaP~D0xRR%9Evo@mUTg{0X_> z=V+yS@k8<9Dbx6@hCUg3NyH1Jhiq**HOz);m*z=Z zFF?*B(F&SiL&6y6Nyxl_?=XGx;Eni%?EPe4u(xr{*25BLkK?+AYe?gcf%lB1WVN^_ zo#(k=z@3Oj4#kIeREv2M(U@n%cnArVR@x|4a&~DQMfo{f%$6WWMavwlJ%N?wNZ~6{f1=gSv>ErTd>V>v29b`^Cg1$ zL-7&drb$09Rox?RB2pRpN&cW6cJ7v80A) zrhD!7+$e?7R{0}n$8wffsCl(GKk8*iop2*B)zg#VIy10M9rADo*Zpi7`fz*7wZx(L z@Ry@SKevpbW%6cc!4YgjF|8!YJ_Gt|C>QN&0X8#E%;iQTUX_*`vzxW;V#`(|+QQ65 zq)a;;t_CB`Wj{NYGuCFa&U@o6ZrCe^Y`a=qM602Mryg#v%q474gpG>%*$8bH)%SST zHJjkKFKX<<#;Fm>6#T!k=iyI-y>>KqQbY=6(eC3`*5>xP!ujVqb zL9sG6#BRn7d(b;p+qTt#ZAZ$MwW!#3u7~rwt;PzlImJ>IWm`0Kx~DZq!}e+{nfgMh zwHjX3rw;P0ch^Fj+7|SS=k5=^+A;?HGF_maqFrq$mY|nw%~?EB>B-$tAN`m+Rq~nP zQBPc(15YJWn|V7Oj7y*cOPS=s59l3qEpgGdlmU2(fgexPvOVA}*Q`o5DS>i;ttw|1g&}`jMtyroBUDRQ3kU_JoN3y+c zp;N@~o^36JwrQ>yeRm+5)YR@;Z>fvE zh_OXhZiIrP&8i3?-F8Jx86Gv@FZ6!ls)2qS7lb%7#2|cWp5SeN7+(y9NGg zmTtFgeSvn@9(FrQ8e>Pn?vIn>ZpZJ|U=VMye(#P`T-GaS2gOpeR7cl!em-~!a}2LLSZ)c`Ks&jT$05iG z{YF-U9%@Q6B6ey zi`*DHCrMeN!v%4{lP`X?H4TBayKt#ZrC9&KpJD^iw+*ao5JF)XEdDMU8km zI!~mA3t{3N@xyeG+H-tR1-TIQ-SL!+@nwC|47Mvg%A&rP?g#kkx%&^_a2W{l8hlS2 z_z7kxcbflkXv0trhj}Rnnz>-26%^k?FrUJWYVOj*_jRbQe| zuCE%f3W3o2&P0O0L|P^z5)5vu$uQv~AnKxoPR$PR477@*}A& zj;H;(l~OkYduiLv^~UztJQwA`3(cL1Zf%*vTp>rEF8?T6@zPj(6g~gAWE4l9a?Zo% zgBs?VGSQy&kJ5SHaGLRsIMkmY*Dd;|pnGoHXnF^RZQ2w3qyxXzh1D;N2cXnl3tDN$ zC+>h(8#92l)ZnYU#=(ASap)lEE~gW|a;xMWZsPD2y-T~{4leoOl3QXd z0v-%|ut55S(GI&+st0WTm-Obmyc{P#LlA8Y#)&8g4X50VcMa(Bl6TmK)*fNmUI1#LUuGsKBK zFf3bLn8b~RA9ifAp>tfbC#6UI`y~`VP6a9=Qx`q$cMdD-L@1kF0G@Fbc_G9$KWeFlizuDv8A2KX(ZntJL8=3FpPSnMhN5AhYr#U^kJz@ zvVYi)ZO?>a$~W8ytU(olTZt)>3FS-l`xCYNzTTM(Nse#z^C+8w z%skpsq;f~-D9DZ&%{yCqfGwxJ!dP&#vWpXkcG3feZ0h}ly`q1Fs>Z=jS=i};@wBCz z?w#v^-M;C0x&~eBUnkYG-)~9}pD7qd|KNsy4QYZNFV3lb;5do>J^QoG6DH+n*B&b4 zEZti<*{2KgKg(jDm;E$n33ewm?m*ukhc{?@@ET4qZld;@4o3GbkKH%BbHG3Qw3B@H ze^W6im&yB4MV`?FUeI6DA6^SWk7%wjmZ4`^etUWD@?!cud!C*>=kcfIwY$EfVfUMg zqx0Q$F6j0+_QX5NB>gbH+`L97_m4B%ynpF{XQX=+H;nrsP9Hv7LY!}2!)=l+{NyYh zU5*C{0|?=F7~f=1^tu1s8P9Zy4)%zbP=R01Ue1=RO z&iVQOdZBN~XrFc}mgtUyAJEI>M!z9T4ENagkjAiEx~Oi@ho0FUd|V=3Q5#1Woe%WQ z9@4hYk)98Cc+ti>ZR%N(lsTh`WF5jMz{i8IBW6DwXe5IGPeGB7d!05Ge7HFo>6xui z+d#^T;90U&AG6y%`-ARCZ-+ZDuQ|(XXV)aRp%mrgLoA@1@g&kh8uY`jYC@4AhN(I$%f}@XwP=M1_kcGhhrp6 z-qfd&3>~{CyF%XpBHZw4wi>OzHtEim%bw-7t&R%6FMRPy$rkX2XOPhklR`&$aLcUbHB~3=hHz**KFI%M(0!J&!NI(lN;cK^w3Pz+@u|17l7T6gI*_+QaxVgRC9IRqVgK3OY*UDj zy2&W~Xuz%-z@0n5Gx3bMPFaNOiiJ|IBUJQoe`+Ze@b4$Am*kPQ1*=$56;e%Fyvw{ZrW7mRT5K>$!HtCIJzjwXp`Ai3g zCjYxAv%1oscZ6gu<>9^QM&4JobWsDw8Dq9)g)8H3djtJ%`y4tszyVuw$7zgC&Apdf z3vS@AZnAgS5b8AWG|L=A52)i-qo`$9adpwg{5;nh!ig?aqm@dopWc|26xIWTP)A}= zV>g|a8oCj#mIM4C>Xw9Nn{RJQz^H+-8~uvxiDOL9+L#0IfGl_|jinek(d0162)ajE z>lD+4Lijkaa&rxvr#7@~2xATKOEqr~B9a}8>1!*H>2?}bKnLC0vQ!!wLT|oFa-}S$ zufW=DvDg}Ks(cCj6lZxi@`8=Ji`9UcL7PQ={$Y+d^-~hHQ|@F+ZlgXs^@8dv`UK0W zP&<_+onSqTyIV*Chbm5Ny_y2{(Ex6X-;uG=pA?1>zpnVr4mxU{`io^0zHGawTWYMh z7IWFeWVz_Ad907^UDxRMJbDw|*!gAF*>7x~D#9H}In(%hir(9qp6<7U21ojol zXM!V?59>bf;pM!V?3?!ZxzkRGvVn0?h!2W@T$`0;g8Bxbk~5>jh%$yhr(9c(-DBAU zA62Zju~WdGjS6r;j6oJHOO3QZJ8(6-Vc8L2P^rSG=Ldcs6JU#2mt_>yMQJ*S2xFAj z*4OPZ+RJl~vv>`d$8_bl6|6TR>>uMMQw(S09=TCpH6X8zf&N44HnqGdHC{){iFPHXAqT(9(XBl;;jCxNvF1}Me=&IZe>8Wn04*ey| zlgP;8wexa;=Yd0&76~3p!_d$9!3)-iq2IPFf36!!G*W49F)4-yrZC2um}L`q8FaP) zE)HA`qc790f-kbGZe`pnnC|#8kie>#jpE7Mu^g~xII7j0wiyIUOECv8TsG&!xP984 zd(FNsD%p03A9}a*xO4G?^`4wJm+^K7h0@$s{Gh3lrg1CUDWThGcXM8OyzW>0k)#%! z_jB-qdYY!y1-=RFoZNtF7b^3a3%8EW~t>xVNQp|MHYO*TgOU?)EsO0(d!I9qYe)u`@?N2B#+T~Zcp z5p%mR^>M*UG!sv0W~NpSB&IVy;ltFc7F-6#@scyAk8{8at!yKclQNpolFDi)SZXYz zety)+FH)Xi)fv+<9h_eu%$LCCnV5gGIXLABh{BN*uuqzYbC?5pppRNRT&SC>XS&iC zjg{hQEc+9sRS1^^ZJO$h`?0Vli~V&N{UZ5x0r>PMok%iX0xpC?f|w6tTm^Z#IclS* zTwht9r1FRmDcM!n|Iv|u@h>J0kHUyY9m=%k0W zMDVd}{m5tjJJ7v<{x-8gYN1avq+^WXFo7j8z|*!k4ikLWoJJ?`t9ZG=22crV5b;7d zC!OVHCU7;9$DXhIkUr|~Mh07bEQA5p^^oj=MQsmu?qGnR*e}PimQ}3w`smk}=*vwc zTNCeuRXp!~)h4{}=D?nj-jEXO25}Jm`+C?vf1AiZ%NF|3yNw09xy6|-2#?zFGgvGq(Lo|UN>`>6 zGhcBBhmGJIe4~yG2&V==YHmjPo!J%rc$~UGafA;8sYJiG)yG-AAPR9nA2jxeV%1xD zEYE_&p?@Lgl6H(WSj?`dK1Hj+F_F&>=w<6K+g*9vzpJfz1k^(Qi?ez`|)px_B z7Hrm=M6wM&J1+%dzz1<)Xs$ZEQ(C}u%#Xnce$2X{GN(}+<5Z%@VD*70WbGB5><$&{ z0|w9w=w-Mk*%aMV2M#uk(?+{fIJ2c4AG`0jT^o<30QgsX_igU66#2Fk@_jzu7O}qN zOuw&>w=BB1<-zak<82Y^Th8<_`e1WPn$O@fjMKVK!q5V|7N?jHT$dSvmLCqex*M@`j)534>%g zbBEyr@fs{US_i;r1TMizR0Pcn=@a6)D0~4Nmq+D6s5#49K?+<9K-_FN%)#2 zV*PhAyXbXt;v`sR3@~2Ul0ll(9!4LIT*6F5$P{vdgMeheOphZa45s`w$X2pTW5hoJ zV-pe6Wpy%^D8?-&dy3)glsBdh|4LT2m2AmU{6!Pk74REihJ@pac@w^*#io*sBzg(V z^|7`Kx*n#TEwc_Iz4D_{+{p9bF=;$rAt4!-=@*vPW@0+dC54HSJKKA69R;o4NU zxo9QrUiZVmSwRo*HNwBePa``A z#!9j^tqRU59#0_omUF(inAD=}Rlm84QfzH!8xILQ(F!w+xt%xbsCQhu&6iO{kQd_i ztU|*S#ZWI?(y8u2AJmQC_%ZDt-8y zDW;{e=vS;pOZSJ$o4mH*W4%a1Ta_At!aTm78b-j-BguAK%mov*Tt(t@42LhR75Ere z)VSmDS<0~HoWAwH$O~&RWSVmZs!JaAHY@`R#5x5x>H^|(oEX(2_|WulqMogdcvCm3 zgwIfX6!45CFoD5FsaA)DMzc6iRQ&K4`#8z7!CG=l^#FIvb-_M;yzIM=GK&%YbRM2`C;stTOo4%qYCR%LN9Z!}* zSA)p)uNgl#?v!Yks6H$~E9;T|Xc6 zkGg9F9Hjbo%mW8v3L6D<70?X~%A-J6nl%U@mJK=sAgu&^-EINvA>gc#{UuHB2#DiR za{9Wz<~1*8>pkWdIv*>j8$&L@V!bTAjJ8R#5Mw^yG$PrVca91Wq-***F>Z&jMgx4n z^HHB{3MTA|u)&dKO$g^`IJyBYVh8AV*AxN%SazWr)I;@EShTEaWn_%kh0JsTc_FS- zj72KZl2M9U=i`B%u3=#n7n;ijH^rHwkE0m*ddVMLOTJk&?*o*KH70$8GpT{L0XcWd z&GKLn5rJ_UHN?`Pu0$x#7V%INOB-ofF~kkp)uug&p{+HvnVAw0@`ZYm8rWhJ5vlRU zJlgQ0zsX|FS!yH5oAdLL=Az>?jVDyBt#ab{(U+C7QM0)kr@Y!G3_c3eNPn5j^ku>{ zO+6;BtqA{tgewy-NiRH+^neo}Q-ss<1r zx}belEm7vswtq&QY!h`W-Nxv zac)sc1`-~*rg#0?qOS_`s3A~nwjoBOmAOcuy^_~rB)t?=ab7A4qsV$ZHs)i!=r8ow zjdrPSPP`i2)ANxqDUO39qkv5fq6>c5;sI+n&&>zgZ)(FaMx;3iV#+wK+R8N0CuTJN z#;C6{b@-r_UU)T$V*Up=HQGq(Z{lnn1Z>C$`BEM@FeboX#5#s^vzew!es3)=29xP@ zualqkhh1N9Z8j3vb4GMK_$KVh%UPDzrl-$!fOcNPx?47emhg@78(jlkL=(;7$llqw zZpekYVXHxSlc5+xLtNBXvFe~ERXn-TvN7>wr1Yp&?iD&{zbF`|X&A}`asN^H*O4#s z^k}V!vtAg#HJM;YtoN!d&cy?Jm|@rM2e1iZ0ekr1HtC4==YiezMwM0}GbmcX)IcSJ z1sJW2C&YrO!muaTa|J(Q?a0@TYBPbmdSNHLA(A`9LhG|@IH&PCgykGQ@G;r_cXurqrwudgc-r+GPb$>Scw z3)a97DBjSlE;|TQLoxKxIGTIHXTfBI3mCU6^7+SCpx4dSXzekTL2I=iS|^ShST{cC z>R2OVpsgY~8#8-6U|4adZLuq%k!Ki(-v1pN$6{yG2>HSnK2B z+jfDKJbu~05Pl@^myQFf<0bxC)V?b$YlB52??gUFa+=nqp0 z9EavSXs_lE-+DWK*Fx_28OBNEKY$U!c4D?6*V~0GFKOx8%45Wu15+I!CeLA?@T=n7 zWOab?^8ij8#dvpkZoB$!_@0$=m`iNw-(j_TyZ}60FZzZoXG^UWjpfPiVi?l0c8eB4 zbl2^0vi3k(gh4YLJr27X9$>utK<;n)L2-$Ovgk8Dc33m}vE_?s9&`<0fvk0H z;hf-OchIAhIm2lg{m!`ub>32HEVl4Xg&*<)YlQ*n3Je+ptSf< zYzqQhb`Ng984tT_+k6duW1x?HIO#6c;l4rh8U4tW#RAedYcz2Jc{*bOu)+E_`rTsV z4H^&bj4<|3FD3Q=&oB{5-zVhjNI)!x!3B`n_EjbH?)n z57To&%onsJYmOhjcj(_l>&}iSZ~9FiI_Nr$5y_sIOttMAb8H)-k$o{|8%w&&ktU~Gu%aCR_!fs6C?9NcEr$6 z;*t72e8ri*h);}@Dc+9i1lnAyMcBC`7kc8Y9`{8?a%PR;nHbqUl9ltpxESJOyasp; z<4dLk+;(EAy!*M$##Wx&CA3HpX%G%LN zF`ip|iqVYn-0^tW9hU^qd7nwdr#kUkc$CSP#c#q+k;I8f+>Oy;M|f^XI=~!^zJabLg%kU#b2v;0--9hZF6Xt1N&x8iKL4F70!eahWU*koI`3 zAbykZGl~a;-;TuzW)Y*p;s@cQCw}KD_yrD!74T*U*aC2A+9T4muou-jhkch6r|se} zH*e9HomCiozvTnAL)F&d11H#DR51iaV%VfYxSxo9_kgDn4OTd5mh{B3H;(IT5&Loa z5jzM30efHC{R;fT*qamjv#>{JGgy+ktJT=qQxbY18>4+P5&KzP=CQY)mntRp)nj}R z4d*;|Z3n(lF9x023jS&V_(TlyMjaR6D~Ln#OCjm6F3o$$}sCnfCas0Do4rQ5SP6ltmrP!RiMZ4b%tfZ}~{2 zhL}af&RPm&+W-dEAgmU;S(kx{2M8ap1y)j}<>nEC#{9H_Q7_(I`=+Z+2X=-%*|5Ky z0l%tG3r1$q#;h9-OGRJJ=(Wu$;yfv~M_UOMasYAFWqh{fXuq)_-}43H%d(++QoyG= zxIe&pSbw+@#D3Kx{NR>v)G6uk&%+G#(0vnaCB>1mJ`M50Xj5tL z-9nzQ;!HZe0Y*?6Z~XB45a#4T-8B|)%>(SI4soxy?oaZFe++DNwT>7)v{iPw*;Zmx zIk_RMz0yTP~S>_=#~N{fD{O>uX)4vfv; z3H7mNWu5>&2%NBHfB>vRIPXzo?Nnz~M{E$*ESTd0=tjgqNQ}B=t+OgaAAW3nHZ>h;P{Pu1na{o8r~1f->8L`Fy=BRrCC$5uBml@R!o*G~!At zaDps!C6H+V2Wi>*q(Zg>%oaF~f!IeCSYZ_yR1W*6s=%sJE%2ib*4Cik5!<9MU{dW` zD`OABW!gVlJ`^A5&m)@O1kQ|DRN@1BE>J%xx?77*xKq*svozKPM2mCYGwLO0men0D zg_wI|d9V(})~x~UxjA9jpWbyhs{vqG^SWjz1FZ4E-nDihjt^mLHA_up5f?e_w5>WC zH#qPrg)JZFuIC;u>TgIh#QYb~CZTPz+_0mpQp=e+>_6bo`l1v3&bOsieI$ohs0Z+6 zMM@UJ`l;Qr#6b~!)E2;`XkYeLKv*W-o9?tmtNtR{Tg6oVJYpwG#JmvW~)F3Pi+ z59@!@YeDP7uFlN|YL{EeOqUxS*dXoUVd{{xJB7WSqrl7!vC>O#1b1%G;d}L9Cu9#) z*bwben^G;TV*pRsSU1o_LsqK<%NC8DC0`xuYf#r&eGhc776AAGHYY^=K)XGNS2o>d zE027#g>|XcJ52qEVy-7+!m;#djaA4fffriiqZClz!;(5TBZE$PzT9*IF^{)D>&Lid z-y^Op4}9v_%T6IIc7e|XAEUF;V;FxlfvwvZf>kxdvSGVqDI24lx3!}F90#ov4Y}ce$&*Xv-8P`g& z)YJ@&qKFYh8-uzfRHSBX8eGNG@l|}XnbIDkp=z)}SRsu);P*oR1dL@U2eG|yyBjtu z^_5SBpWUDEY_KoAG+~$>(w^%ee+FSH*xnu=8pBiZxCUb%V*0AFy-ouWcQ6#LNJV&^ z0R~KrwVG;R&&}piiB;5<7|fNW+Njb_$fH(IZT6=K?SidUhd|gVbDGQ&-?SG5!`Jbf z%|Ec#X9WxrKOe&Ze+cbFsO0LaX(^BZrbZYJT+)d1!k4KuyUE(jpRIVu;p9{|O0X?p z280p9Jw0H)w;fin^WhQMxOTYl?sq4LUN;O}Z4bvG{D5HxPV7y$GjEZN)}(ca_J$-Z zbPK%MIc(5QrR@Bq`{$3956EpURHd{1EO+`K#_Yio^xD|(HKJ8C;7&_!6Kmoc?W4K? z25Q@_PPlR=t(}i`tCz>g2fe6;=-J^=4`5SRQ)Q~D75Ua@DZH+t!u5LV^_c0zroC%X zn|ASoV1^uij3?%cB|r6n{8wj!`qNLk7+2hn7lg&rL3M-T)qp#XbSauJWp}544 zO|%6nrFQI!&eHWz5^XT{(t{6ms|z}RTznL=b?m=@gX;8I-QN36bsDmtm_@`VEcrpi zjXe)0_Il8Da85i&dTZnx`7?Xk>Eto;0TM|3&WHHf9mEqm2$QW+oS?C`0{{mxls~(U zu4a35aO}uu-`o2Bxb*Qr*>B|s^B<$1bNt)%je`vfcXj-&2`LQ;CmFAA|{`J;yi?aSXH;k?8F7%#`X|t@vHj;*XN59BvxIjj0)9)i@H!A)9%D7E(P!@&t2y&{H~dBv2bIO1 zczEX&!*<+Jvp3IS4KG*Bta#9kJ?#j0rnNNA9+0-uJHWa`q8qZJKcs_U8g$eAl6~k8 z2oKVF5f1Cdg-KWUn8409Sg;RFAqF2BFc|U^;ayEmj2iq!*rSuhRT0*KdnUyj&Jmwi z2~{OQb!0^adVS<0vc>7a_5pzIK`;3wN&G}U+oO{+TAC+!DofA#M;cgklaMli(Av7}!4xu_dZrsCUJ&RObo5 zgI~b30Yn_?fc5yEC!3SL8asDsvmP+i7e zhKP3!CsOg+8W0O;NBr3u@3JgpfC)PLi|U921lBg+xFgeU*#!NB6&(q%pux_fX_P4jy$G2UQHj9blcVNpYxDE;b$%fye41 z;)>SbBiw{MGi7XCR&JKo*ynMh7Yj|%jTa~_X7K+b2Gk07@D5er=2V;?TRTfZrf4CxzGIxbl7@ zyOcY4KT|NUvI2-JHNuFoAxsdlHrR_(w`KU!(OzLMPH{1|l`7)7SS%F$6R9ywt~TlU zhj{;>8RWGH?U{#qJ<# z73wWsY~>ZKN3OPV86h;@gt6*^-qDvTQ@kKBDd;JH7%+Nwi%R>Y0y`v(&8W3Pg&f}Y zC7a;4))qzJQE{xF@y???#6iLqc5~iy@j+v#IM-T^dbIw6Y?tczU|rtCC#`m~wZiXC zUh}to3n3RH99i~fQg~+^d{>C|qJ0N-8`v`92zBf|Xr~mU0ppVi@D!T)hSX{| zC}yg$5+kWVA{aGF_4TGd%Aj5~P%p`_&v{TC=X`i?C3LOCfUgx0Tka2!T5)9|3|U;6 zV8!Z7K|#n}+s4{z#7x?wuC;<4(SDpQh7SVMWbcdv#)z%c@N5i-s_FERv51`tP|}l*0$;Xc6+(XWWBB7 z$ViOWrV@`PdZ0f5+#K)Uv?d5N3N#(s2zOpoCO!AUqxIa;skT__?EQUJ*6yPIqs|Xk zN-Eh!bge%w=LW@c+O*nQDUhiWUUmKhdsSlZZgkUlXJ%%MdX9HGi!rv>h3Hp0Yu}Le z7hM4Wk0zsqWxpCl5K#&Hi=v$>VgTjAngnbZs^&V_^AY;;RE<8O+4KPR3eE|$UZFpU zxCh!Iv<&gndLhfr#@z;D2D9GvMm8B1b`U>EJquH4wapG-!fE&vKgandPi6 zxNNqCRC8IDSJ7;AR2WSwi(z*uc##`)LF-Y^c~F0j@gdCzDb~(eH+=S<6p8_3bFDD7 z^Fp#$?yf7!S{$qmH85TE7nNnn)~f4lKB~#_c4d_e3^&PM!Hsxe7E5Jf&CduRW6{G$ zF@~!lH|lpeu^EcPHsv9F@OZ}zeDLQyc#YJetOfE zmMa^>;(A7y0P{r;RLj}O4qIE}1y{7bOGt5?Fdne$10F-ag zi+Ik6DQYwyq{?yrb{AuIYO|;>bZAGmIE9|rx>0r+{R{Tn6X8-PAG=|yi=nfJC_#XP z8w|{`=?T+&5{7_xa1m@0jzhO>BUdj|Ux)V^VXjFsBRS#RQoZz^JjfBBa~~uhhBwn1 zDA*O&rEAz133E0m8@2%70BBg2@ZMnTFKDTN2b}jQ0!y%gaS#ru8m*3Bj+N8JSW26& z)gt5Aq0r2e#i4v<5rnBDSuXjygys=R3#`f;=5{usTAvO1zPN2xbjp zp1YEWE|5!t2Ifb!gVX`^fv*+TGX#>g(j+;{rxIz6jajg7q^aUQo|y;{jC~-IVHEF? zp}b{ONQyP60TUq}=-S(S0ISuD4Xlp=9<@96&v9)6n-UXRYUwE#wMu$W3x&O?BiI9h z9#~kW>Op)UlMSr}I9p?jIJJY#qy8)@xZ}0Z8t)O^v2gZ%#>>J+oa0a!FPmC2J`clx zG#2Rn?byN^iBU(Ozp5QgP9b|*D-8K-*b@S4K`iC*?f;04oH0%XrVlK0ho3WEc5#GQ zw?JECjAc6_``V?kYy_QnJJfU1$M&N%XD!x-Q+zP$9PBEBxLQ{0|14P^;yz*DFmh^? zoZ}1^-2Mg+PMd|_h<$Vp;-O0KghibiVC{xsH&*jDXh*CXVyY3h1K&@;REBSRT_><=S&FZL{jfe2`!G-{4QcUTWAPaH4g10++uAHFD?UFcA5I(#*#O#h zwDBZT`Z#nudmIjlz9`iX*gHP#9hRUE>yhu<)b^f}2G@yQsuvuY9@!M>46$Am|1S?= zS8LMO;SQo_FF(-FWbVYx!55GBZc?1ijt9mE#mzbUelR*9WAI4>0gCUWaWiDXY#-0F zyjkCe>%<)Np~1g2#NHBn<+6;<@rUHLkL&c#F3bf8i=rbQFiV>ec-i1N8k-*GAR0)( zc)z2wA1BG55dxcFHV>Y*SP#_`+@ufs2p&H5Ry8PuDNd+{{YCNq!31LL(#1w797}nt zRGIkgGgL3wm=rp+tyKVawc0fqNOtbS&9QkC@*(-bP8_`iP(QJMAM2;ECN|3Id%UWt zcsE*h(CJTRn-JVxVgc_YgAbMPg``CLa#|(YuP`jbM~wZsl1Xgr9_{4&Jz?A`fG^Ug z7i&aESnrDW-m&ti%mW;dzef2HAFz8aiq}Lrb0{ADaLK3uHj-GdhGZHYDR*h5lGigP&|PI$Z(14gX|qH zEGCT3tt{=yiCsZD@F~)sd17KA>mj@|KHYB*5d&9Z`|TV+5iAR$8SNG7In@j3As$c4 zKCNY9-%UVBykoAb1}qwd<^oM>${xec;L&w(lgxNilpmTmhaVK<Ob+qL`F2 z6d$ya*Mx5pri)kw+DjGh?6eB-ua7Ve)VM}F1m64#=qEh^*UBnJDL-Gz+7NB}0pf|a z+Qgnpuq`M9|DhY&&kkiFUYW3C+KV<>1P|~@gHF_ok&#*CXF_^as>Z9Wax2Jh3XRsR zkM|EzdTP6}@JW`dfpQA_s|E4)zEC%mX=A@nyem?NzZLIP?3?q6Ay;{NXW+pO+WVN+ ze|WJc0rnS_$9~v6-q+{EdcnS^eIg7Kd)SJ(e0sCQ23`{rF-5?jS_`3K)K>0Du)I{& zteGCHOWpNmoKpRvz*G*~Ybzyp@_I6u;DWWLnPG8J*r0J733j*b{DC-u9%xL6ej713 zz>f-L8~Z>4!^1l|>3y8Q##tMcOzE9WFY6V;c&A_k@9YEik;AOjlOn(Rrf(PZ^;%JK z360mVo&)0$_^Pu=+uMlE@t=QZQ_=ec2Fg~gEQCGqnVU)q^@eucXn1k1-kCnKTS6aiiVc)=U@J?FR zuB;Qim5hDTfJff(2zBQnDHtcVUcSB;o z;dK)ZdRyr>CYu1>OSkOWN@lg`i=M>IW$Tpk1_GN59EP&&}{(!Q-2JP>=<})0U=ww z8PJw7v}3;2Mobx|nDi#%@Dm206AxmYJ@oEA@StKYfxSfW&QvkAF(gkrgtZLrrGhkg z{~a7zsMq8i4ot8%06HtS*3ofo)hpqCvZ8l=%Y*QN{x4eT6;~w@SY;M@`+?EV!|1yU z!?3UbCgp1(z#LRaWr1$4h*LBVV{sYXVgvv01J~%UvSeRH~ zzi=8WVQ=Tzron|0HQp2|zW79{_q+c7LQqq4c@Wu%M#WHyGOe50l)6a+d)Y2G&EO{5 zjLy6Is=sj$23=*)3oA;g(WXsae5LtHSoZq*Mrc>+?NAl3RHuIU{Noe0-yr4zn4|NU zoBBuIV7Y0AD$Q9+YXReCWE2{Y5vi zY^Gn(T1iiNS>clD;1KI$dgw>zw6|%w`k$zc0@2=L-hW7c1E_!G!Tcd!K9ZdFD+oLTgg|(db5MK>aJ3cc zaKUHRqUChHjIC20Cp-D93A-{jv55(iAr9z|zHMu{z=yCwCYwi=`*vK!_zN!x#byTg z4-)~Z>=*p+V8%w=P>#ko#qK<@DK#?x%RhF8F2T~iHhLi%w2 zl0S=Y(g*lp@kK;4P8j|4$H5RxD`sqx)#0jEkyn1ixGqZzg>(Y@1Eye`2u-4OZ(Dr? zd0THyu!m*uvFif`E_K>(-Z^#wQ}oNSyUUGTod&hIds5A$wB&Nx%#RBWe#71^XHF28 z$9#HZSDJ)%nYA(eS6F*>2%PrMQpElH2>s(32dq9gyzKooC(%hb!Atq&gwK^nt$sb| z_c4$!e_obGl9J4X z__f`|9ssE4s*QK#Iq&yF%M#o93Xn#9j|gG+M0PqWS@U3GIRW*z|#6ANpxV6^2R=)p2HL1fp;0 zwkK=o00DiiT{-of?YVoH^_BN4z}tC7?HxOSQvp+;J!%pAI6zkm zUn2Ft-y_HO`S{DFsPF6J`}%l0B=CK^`twN@_!*72*&K>6W~|5IwOzxGJvnJgg|%zw z1hAHk;hNMb`@-&Yw%8c1-~;j&vmvj9ZTVzB_GVayvW?bgq~xM@h;Jo$%){J6!bsWN z41Nk8@2`>S+wt%D=d(L*X$-o;My>*ov&;#H|50qj(p>OUOS@SeoSq#(;hD zEWF>ZkNp(kD@JTr7VFGc!Gz@f|JgeaCC9ZR$bJjGC+Iy1g5G;?0RI11?8%E}tDmIR zN*cb2eG$4b9GWJ9>rG{4)~x?zml{+Pvs!Y1U9cIwMK7HYdZ~;Bv{7lZ3gt>8FIveJk9gv{v2Jyixw>n{ zyztW4ggzJDKW6Ahy?s|cQx5UUNZ2##v2=gS{l;)i$HJK#*xj*ff;*!{NPp6Js1D+@ z#JD~W!%^8UQq5{Am?$r2v$KgWC~aCRq&SMh2tGEuWp%f_+q25>df7L7rx#kWFRO98 zyS+CDhd%w8M0-RvFJWto)}!q+`G-q4ZhD=&bnoapA?8)Zhup(c8>jPw`t|89gqKaF zBY1IZ>3U_BN(~a}$#qpdw=3TBd2d9pcW#%hBqBiTYo~cHV73C7!fuVZcXfNzE5ijh zl|ATFXF?7-vLj|f?B$g~hO37Z?a@_;-@na$l#dBv+$`li=eG99i@Td#xfCFz!>0L9LS8wEFvpwWvtzYCZR69KykC({Md6*tTlm zA?eYpn`_eNZ16#RNFH!E58zi`Xx2-GJ780(%(5AUZ$J_7Y5CP+XuZ%F zncoVKHaxg-#s_9Nx+W{>(6G5ku2`ExrB2jM?UvTv-Guv<;VCkohiJ1G`kU|&Ufs3C zu!P$hKB4$i-S7l{8hz+78cy%&!L);^6dW2U%vCCLb30b@o-JlS#UBiU6-3bHdv+|= zyDB;a_sq53c{WF@dT(k6$8{I{tl21skIO@5d=*Et8_&)+kK$JGIbWL^xbp$O2WdmL z@K<TmzpL$WGI7kTv6COVr}iZIuuE`Mr5k#fVvrNAHd(doW$)5^ zw9m7}%gWJSV4vdI8eA=n?TwhD*7~w&CYH{5#QIre+<%Hc7zz0?Ev=T15weeP_x;|q z(uiz_sp@D5rnc`+61NGw4(82Qi~K-ej#K|&XZEY_br(xacSi{Rt6 zn1MetM&Lnumo7YS_B5OFB9%C>%qOI|{4xF@_XYz@K3!=?D2_8+;Ow3KL#(&DXUF2& zJy!GZF4enD>hnCdL1HNmHq2G<5K4-ZI;5|GCtnu*`W?BDtjtHu(~#$CrlE97(hLFx2ILV%5>UM-uxXQby*#Qz8#2`@BtCbQ}azlQVD zj#|Yfo;{_+xsyY;nb@f7*NVOapFTZ)dN7(dxxvFW{Kqk)ig=yf_RZa-56?wpmb^#c z9Y0p7;o{c5wKt1cWQsoL=lFw0qET7^X|3yx=fUSf%p$k`30k z_vbO>z(WWqG39=OKSzU+KdJXJ5uSjoy{OxX!eFvJCVFSvKQxRU)GoGqr(~@Uql&56YKlZ*)*2}3ZQdO znzPhL_=8-FOluj^ddSNyvA6TWH}SWne7cv)S3B)S_GC0Ux}}`qr{o}e5d)6bt_Ns{ zo@KJJtIw?cadq}e-RDMpqRIV%?r_L4J}jL3%Yg?mUj4XN@cn#Sif;aaJyw~_;(wJd zQ(xk!s-0+(%0SO6L1a>iQrXpk5*44G)#D9l~dp# zxSH?-w|*M+jn6S>4*ZXqd+S$Kkp3AAq(tCs zqs?q$CZZ*%x+bp%tAVo#-f=BQuCH+@fse&Ca8tVQOlwnVOgE+velkHDR&C$OlQ zYY*XZmYGz3W1<}Al{7GvCp0Yo0qcCc9@b`7j*P<)Bm0LWn<-9L*z)ktlPxS9;WZOD z3ELz#Vfv7nJG@Qc_OhqzNWRQmZekCA);4PH`7i$ahrIv%uI3x+)o{Q3&w~!nT0=Dt zIr<~}6DPwNZFuy&;l!VxD6I2|^^e>9JBc!w`u=C%{Vt!GyZHu_G`48!TG*`0V%j07 z7{bg|c<tiQIP$O|2N{Idehy@&T}>J5O{0s;mo%_@}IF4|LuDIm{ncBvt<@y-tf=) znqTs=O|XAa+34oxAuR;uPkUy4=D^{^Zg1*kD;t$!kPWfDIFv)zF~9woJyCUK{JBj3 zdFTD>+3*Ly?bwtzkioQ*Vb!O*V@O+7O#7%|0s{@jFc&1X+LJh1?33^h@<|s$E1+Ty!t7TqQLI)1yNE;Qaws=FiMqh&{CV)!+gSiRQ;>Zn z>4W23m*ZZhlbHHepVoNy`@O~iYXfy2%HwQ1p01q3;&i<(wgt%M(0oQAhG4q9^w>=t45oJlF#+tdS>19WO^LwK0)#8&ARi>$S*(p zbBD&Qzjj0$(agl_SnvU3c-A+?-?9yV%_|Deu{{^OkHZjUQ;Z|{D#W(*;}3$zNkL)}Hb&vd;KxOAAhV@Fi8yKd zb}VwgETb-5VaAK>@5HjxSXrIt+2XJi4n~Nb8pMtrYr#zd@5FWwI(=-NJnpG^`*Q`M zFZtRX8gr4rJ*#+?A^N!bkiiC}8%H}Z#=UXNsowJ4%k1dBYSZnaInNF<{eEp#e!6{O z%iw6C9L=~Wm+Ry8BQ>zA?$`=BxmjYgd~{~COXYEUdPy_c`&v>TDGT-yY;Ro3X-i*; zy#shS{lm0{EqolEVA+1bmUj!Fp1rfUX9wbd)L*&W`tHRmi}`o}bg&p+JDuGlyF5RO z*o(BJJ) z{<2KvA*RP}>vV(oj&bZEYw#z^_`skQp80qV`l7F#ct_w;kG7YCyF>iJ#e82u%MV9b zD>$uRw_rvk9BxwZ2m7BX1y?b1Z9A3-)>Fhcr2mdvuFYK3@p`LS$3C@sXAhq9xSnm! zZu1lzK&NubruL#tNJCVZAQ%*Q4csC$Q|(R1$9E``!9FKwR?b_BKj?XPG)fbf)eSw? z?0LLM^%fs1htV~MO;f)ymz=>{3aHcdIZ%hq_+-eut3 z!I8qK1NIyrgX?r3R4_OK+{goE5SH5=dAZGWnoJevGx=tC#pi0h&z0(pXSUydX7>3H z@&^MEryV^mgJ*x9vf5~D7n8w+1>`#EUkh3rvi+Ky*`{q`NR@iS>prw^hp|!RhEH)% zvAv^N$=rLH!uy({|B4Ow1t%v>{MAG6*z(XAOc$T_IpkX230`q>JugrPsq*LegMmQp zc#Gl7!a5P6KgU>iQ`LO9Js#c0=|<)GVEw4i8?)Z1fgbGoQGKBGh`cF2@3kQ~Gvgeb z@Rgpgp4IatanITl_xiBFpS^=LMb&2XKk31qqb~$h=S{omRNb`Vz$cE4QE-|`3ObM5gAqZ@f5ZW`mfB}|R>pdS%G)!R%W!E2#8 zn8hN2a`=$3h{^rxd7IYPc!95K_pwv=z3I%Zv`;tm$eP2C@dv@7I+sF_C7E>&4Rfu{ ztlRj+)E3FYxKs{Y4z1*deGxt}*9mwTZFUg{a!AZq8%&3Csb4MndnDOI`D?sz0CAFi zK3AiB2jQIUSGUA?iM}qG`Iw=xo?TsH6o&Gj;|~UkLFO#xW@N+ViW32pXVr>L22J@R7aKI z=$6c1Gtc?8-C*4xt^Iw;mtTqFXX2OUU}H-#`!&wr<_xa29bI}Bdd}t8{LFri^IVwr zK=!UVLPzj;Ll>A>kK^m=U{9N=PS!b=mitvM<+QEUJ;k~x+b)35>OvIw;}FU7-0pF_ z52tkpTb8a(ig2&r#UEtf0$!Es4=0$ay*F&&+uAXIkY85BM{_(Hh8-u-tMyF&Wv}Mp zf}k&h*hIAl1uwXISywg`opnq>%>TdRKi!YVB)Mj9Xclqu4ln188W7_Z>@*ePP*>{P9EHjMk0;nSQIjQ_c8G`}T93IXfkJy`d?+T(j%sBuWN2Wtm1SI(rjZ=Vv|ZS2yn6_Gm7 zUx~nYpdTLCX$3a7_L9AGdrdi{`=b17Zu~82Fg>Tq5BR3fXH@2t4Ay4G`@`^rPs>BP zIu2He*Pa6(BnfZR?i`oFiu~*N%Gz~J+}Co5hYW=S-`oH%0udD7)`QdMB56(*dyw2P%-^8sj zdvOT!Ie#-}{7Kml;VX$=Fhym~*LoZY;CI;_TsW=Pqxli~qQhylie^{3c}_;H(sHcd zYk|;4{j%Eb(HbU69!K%von+95yY%6&C;TbRMf^Q9_YjA|kEOxq+W#ck()b55gu-lu70S+y?&u?PXRpJjw8IrDPf z^6LmcnolLxR`7eB&nSbmrNv(}W#QZr3AC%3Bm{Z2*GvM!aA@& zR!u!knj-QTW=*AZ7Q zl&a*hI9(~ zJ$RyQe3is`S%AA*QCuIeBQR{|len|+8~H{XpHW>q&^}kv4wxUXA}1k zJ{$O($ zdx@zRjcqi&${`cGPWb^}gRhCL5uDj*Zi*)rYCSVvgBVlf7kxsbiK@7L)H`j$XDzQY z&Rmz{_39p3zWm!(I7R_5lCo{XPCbx{ZweyD0hXhZQ?j<<;tl@&wBm%QpVePFM zE0%Z?hKJiZJZ{`o`rXnn{!G$f^XFaWB-;6~=qHI+iN0Z|&M?MyS_@EeEZTf@#*}xj_?E&R%7e=(JDpk0ax?LuI9J#zSY=aYbXEkQRP!1e;1V{yDmRhwnLo7+-|WyT(b)ct2{ie^c>t4JGFHC zq^EcQ=O~?@*^MI{m(Q_z#V51mx_Db9bBDB7A&%+lu^Pu%Bb)isk%f?b%SZHaj1OC| ze5@asOQ^SM4;&oa8IL4lU|pVl=F4JdeGl%OOK%8%wul82vEAYhZdqCp>kb2AX-M2b zn|uqmu@#Td+b9+pZHBI8dwkkm+>AJpyFuNG%x5#KL5Ko0b|d54XX^65?NRUFu}{Fa zz~_1qGnX|Fd0Z-WoUWcCX9fUqM!ov_Uf9o)UQ6Y$!hzA@*>vew!UlJq^fpc0M70gL z$Sbb*3)cet@fMTbv~j;?>*Rd_u25*rB;;W0fX;pY%B4 zf+-Fu`;iywkln;>HKhIG1Nj9Er-Wu}M)w+vAL9=)Pi6LH?I(!chd+zvde*W|HRDch z`%=VtrYJ{Kde61Wsx3^@UFX`wNu}?X=qvFaG3`|U*WNS~svNW6al_Z8eTaZ{PS78v z-%Y@8)j!3zoeahIb|yi^leIs`9}L8aLmgs02Ghrfq{CX_H8Z;yk{3(ZmK@0xiHUjc8<+753O z{C1k0x7*buSfQ2p6n{{*?=*fa_tjYXqVn&FQcq}pTZ8SquM$UF_6%+02 zstDE@-V&1&?(D0Bj|pr2i?S_}Y9 zS#h%;R=R$3F9qhS_T5UCuh}j^cU#$A`o1Uj`F_)?&X@Np@oHD~R;;{^I+60Ek+pZN z+gfLtkMRew^~v7H9?@V#5v;F+X=TisSaD)cBDPmX*r4rY3Vl(|f0(IHn)CU-eAYR; z1dI=*UTa^VeNK40Ow~>&r(2Ij`t>;)BJIY%t&%hRA*G_)WiVfSm4h0>u?8gO(evCh8utwR9bq@Savcc-St2Q$6 z6f&XZu0L&7HZ4z_L7AeJlvh)x$~oB0ZkO#*4P9>jj;)M#N zs6Dv0Do^FmegE7<{Y9+9QWbB~8#jNyXRNq~PA*x?AM2Mxr_~OX=cD>Mq`s#(og{IJ zx7YR){6=-8_STb`+ZZyxFAbBS{5Qs_oc#eKq+jJ;kM?NRtOn~&d3Xyya+8hQ-GE2? z#aG+7+0mX%SA=i+nKv95&TzjkojNtn5?}d$W3@lZ0tk4&5N^I*?M!dl%d6kfpEPe# zX7FeF*UJiwlKH;&=|M+a9wo>8|2zJR>@uYXF}BGFW5f4nFt7EW%A!1P77y`H{jseN zl<%){pn?NliyzUw)U5|bvh8X9`_%aUx9i}|3E>CdYs^pXm*$|n;*lt3m*Nd-{EFKm z!m;M3K+3hQXI?8Fme~XF%;%2u2Y#+u`uNXFBHQ(s%+a5I~ ze})%K8S!nl+Dp-!vG9e1hL@-B)>Yu&R}Su|^v=I|^Zrk5rE)k+#hu^1?gxf!?d#WrNpi)t&kcuMPJ_ zpS?fV^N-|c@1bk>zxm>*F+LP?QQtF|3S&jz`B;k3_L|4Bfg7C0>`}03ntc|95Z+?+ z@3g*~&xJAQ;l~)%YmHxhPj-9#UPD}k({(v(=9lE1_xPWia*%(+-Q%wxOJ8-&{Y=MJ zezb4UTw?YRl#P1_oiE=nRiPdxo2&(9uF`vw>F>(E9%@HowFSy4e6EISON}wgp*?7n z`k?RWd!I_m)K@>y%PkL6pJc(&2k(daGTJHmrLY*SW3->JHvRo8?<$9WlQ*ByCZ?V7 z(*-B+^(A$7S2@1goS%L!sX-VAX5XuO@K*i$Jx-J-I6y|zgiQr&Saf>~bKt!@lU1Zy zxq9`Jb8S|h&+esxCtRb`oivL11Ee%FPKb}{o#>bBNAd~AwtxLleyVfL*SgLveleN8 zZ8PC*>HE~WibH`fE`;pgW`ZSg`pYkHQ#0=4x!zC zuEy2NvKSvGdd=tR7L4!ea!gddpe8uk?IDBuXhW-+#FpEn3@CAvQD@=KVQ^3p4-Zi9Jb$p=Y|epI-M4`8Kv{cv2?D8(2biO&Oc9brPEf8y>G4dDjZX&zXIwQN_OHXdTIDz<0|E#zcg!``|VyoB~$1n&X3RaIa^#7;cQ!sBlv85-(WuIF2-)r z#k|?twyjgKbR4->FiVWp9e)SAz30J%%FN#+)!(O*<|qoY&1Auo#g~QiFc+^`{R(V3 zM&Ib?(0MHr@6@?wd{EK^N*JrDbC z$Kl>KYL%liTg;NgRnwf1>Y`_jUDBT*KT{Ip4{Xjn_x3zaIha4^EjYqj8^q5kfuW}t zx7~hn_42PS7|jMv!B=_%_d^(nb9`3s!|Oa7$Ck)>FBIJ_E2m{VhCRC_&A6AhbIxu$ zo9SIEhXwHHI#k`HI&0=i-?!x>1))8#TXkYl%~9&>_>hcC4+xn)Zx(UwY$%@%mGkFS zICpgyX|(G&dB=B@MHu1e1y{{ogYxGf>2n*8WsH zI1}QSX271U93lNaQUqPZKSKmAZHs=-_|_Z>w`hewz-rcj8(7S5=DpXj-XZQvY1*oG z8l$Onq0$?$!7BW;rSKYzbHbs)4>n-_#8-UP7MSBINUe6C*+OK!jP>1a$r;AarR8kJ zSPFIKkjFk%4(-ERu@3rLRpuLT9Qg8!WM^p|hW&nZ$J`q0Om5i*+Lj%7MB~Zz9&_TA z9r})PHtvH(feFI317mYvCGow)i5fgM@KwD9amLMU;OQJ`g);--b|=hR_&k7H(nj>LVWv2B2C>S# z6FKFVcWE0OdM2(P`mis%!`ydRGgpgKyr0}sjTZa-m(?$Pia*F)S-Y*|r^Eh->+;Mv z?{_wH_gFtZkB3&rJ7+ql+OWsE5gwt%$+{xkwKgTD;Fz-EA5U7Rp!woAy@VoR7&f*J_K4o`Wd@=dMfL6+gxwMCT>DJ5Fn-%;M(uqs+U+wG4IS z>$aGU=EG~Y=dR}j{mvJT%l?blgF%o%;v-*(B^qDCbtI4QYS9_JcbKaTS0ujXneh|u z9x~1IYds1qlJk82;O6CPIhxL@ht|!VCPtIb@dp#~^TC$EQS-1IPo}eacQSlc%EO%# zPiBb~5g=x5%s#JLECu7lJ`W31I#+>cqL`_peR|3a^XJ^LeJ@5Lx7=ZSitKdm)1HI1 z2@RKfrx1;8BdL6NIo(how29mPzT|7)?y&j&#pK(Q*p~#vjZ1`e{h%XWU!5}oA7cxV z@uLtv_8QgMKzJFgF?`sQ>)FedSE>EX>P2dc&@MadHv+|hbG~@3?%losHiVCg*_-~D zSnqrFYShn{|Nl3ZBMbp(W8XeR)$hyYTb%cR9v1?uk@)*$hW<)+7L6B{#JuydO;c~C z9BQJ^BvUuetXqis~?%$SmZIqR6SxiD4f$bGIHD#9Pi^3#^f-@^H07Sfpk$bRBb2A?wRv3M1Z z<=gtuNX|k;BCHq4zrm>3w!kgSr8f^;EEB!wmmz~8Z7^Cc&K#ioe=NP*feZe9nVe}V zq?-K$uJ)r%p4N+VL?*Bw^m3a+Azd71#8Fe9Qr|kEY0El$YDar@AOG;rPN9%frw@Oy zJ${toT`wxjyF5_q1n+&PpK%B^PBedYuLai$1vr==o0A**MZ$IITi~1z<1^r`TIExc zx!AY&acyHS{%ARrc|Y6V=8O0Il_*AfV6AJ@pVWu`FfP7|M%`au=>_Y?rCU#;xhq_~ zbvHf@#O?IU(QA$xMfeNa>lm!y3upM`xt6QHwU6FoL(hCRm|_!A^5><0d^UfiAe)Ix zhEHZ}oAJ%~=<1K!+LOFdYjMBNnP;(AnZEQ@jt}-Lwa1^B&`gwnt64W#Q~e}tK})!g zFZ_vj|JPa3M>g59e4%t*1)FV*@=H@I6I*( zdY!~1JX1E}(0C^1V%=zAu8Gg)!MSt6Q9R`DJWE_R;Sd=#^t!pjajG_9gRT1eP@>3dtVbE>n&I>OQbEepUh8H{5i(K0~_hrE`T!SGBtA(d%HpQlHElSZuJxE9gyy3iK>9{6MBh(v<;>6C|oJ=iQZPGM;&aemP>?hEq=S8KK( zUaSu-Yc#p_^Bj_#Wz!xddQM}O=(O%D3)?VUVR)){a5b(M-=z^#tJbfYcbk>OVNHNA z;#;mLOY82AP5aZgKGv^flO-iw$_u3j@nMUEI^z@l3I7FY>3T87Wf9ClV=egS$LjGE0v|v}Z9(~7#L`_b5h<=+eDoDlaRAOH z?v3Ji!6Qu1gjL<$U9J=B)WoOSE!L+(Y1w~@e3i8{k-l@2Xj$kD!0--W6-GHBOwI zOla8H&3CNheeCR+l54fVluFY?@L0XN=t2oA$i;1UeW6`y*nM;CPtX+=wgWfHwI^_= z!o#OKeX++OW{&(C7IX2C3Z-H1-o7WF-1t-c!Bp=#Ax2!-UyD->)`n2=aCDpF)rfkV zN{_iwNk$Is&=n2Nd8=CJ-m)$7L@dFL%GRBF)}rHc2U}D31x_X1S3alQ%ct9k69UX3 zR2G=X0-QR$8zxrQZS!_eeBMv-2Z!;U*4iBXioMVt4c0rnu6BNuwDXfIe?t#|naEx? ziGxg^zh!gy=?%aJO{_$IyXi94=h7@2BrKMfaqwxE;2FXX_F9aW9k|e?gFk?DNZAt{ zOuSfP9!As$KE)s0-dAwO``}+i=_@qEJ%`xaFAh(!HokjsZi}l%gOIIunSKNw${dB= z&FjL|1e^78wLaserp;w-7>%(82HfnWX5x<;j^T+p?J@z6JLhbl`Dy}oS%E)m#sK-F&L3!@ zhKIAejgDnIP>Utmn_R#R!4efG(jMW5rI?V68|&5GGhO9Mk(??AFg)LktPcSf_>e|m7IO~=tc^a zXqf5^l@D$pvAed+GG~V zo)%ZMW+b#;)`-z7qwa*D!{PL;tcZVfHzW)+3{z z#|!PJ{dkvJZ%fBp88?6-u?H<5%VAmBV33AS^jHs;rSd5q0qdJIyryi^Zf*kfae3W5 zbf2xp0=&*>KLqjB=1j{&kdBB6I=7h(o~DUkN+!;Yj|=(x=&cVMnSQIamiw&IML2g# zY>hSt@zsu!goNj4xI_E&{4Srm{qtZrkbZl>C(2#WL_UGdyFKbE>GwIhn7Xojn^lC5 z@ds5$y0G%kYx#OR#zvxc;w({4-n{|q9WciRY{uXM{NL3JzZ`ZvxXSIywPtnH^|@X8 zI#8Uj5JXsLCk8Y7TBC);IdDr1Ag3(u-N*QY!ZW#^X;;%WrkPFuf>T&d45#CW@=My9 zGDspZ_rQltJkG_7ang%{m7ESy9CI@%&>sAozVKRc@4V6OuzWE;h;yX&1*7MGQ+2F0 zU!Up4uce>Z&HGC4&v<{zmdf8)x#4wz*D8HsJKM$h*xWsD=kTsrg;l<|pV#m^X*hB2 zCNR%eJv6Q14i1&~WYEz~G=Is?AbZ0H(;JU^V})PkC=GAccNxg{_iL5oi+6YR(oQ;X zOxs0gXZ7<4s-mAkms9*stUc4yN<5(J3Me&F=52V4K3+#Je$NAhlkae_> zWJuKb7B|Q6Y(J5G{~AC0mD=XrKKkpsy?%bi>+f=FPhsqWkkCBH&E`8 ziS?%Me_dqD%RpN`X$j9>^3LDq=+9(YJW1gYw4dx&y7uRiU+Jb(V}55Xr%&_1Wi*hW zp5ctMKf#ZY`_1hl)FSsF-;7b}p7VqFjg*lG`#P1|;67>(hccLUG+es8zR%uV zHeSx(#OPCbl??Cht8KVnh_(oFpU)-Q*Jv~7isXrMpgY0bqk7Xr1=Ib%>QcU7reCRy z@@Ldr(v|}0tEO2af%P)6ep%parthHfqKj`i&+zx4&tcN9O#SJ_ucoha6!prw@pJ!f z%D|b;8FDZ68?_7Tf}^?&1e)hysDI6tM~OK^1D3`|^O-Q!cq z?+Y4lx~5s1!kqnc`)7Sx->r_1n@ijuY+HSF2hmaT?eW6dz(wHNxpV9u@YAq?VL!q~ z-$d^(ByB5j2W-@xds@1r+eIjmC`?m9=>nO1aXaU$Pkx{*%spTIUE@?-xI|!do!MWy zoZ`#L=HBpeOf(6_!GqU@A&5MKv)OjpwctrA#-E8_R+K#l?5aR~IBZIuejl>H;4E;W zWV5pLf)4YD(`JwL!FiXq4du~B)%@Yq;oW7=+*ceXY=0(y;LAg zG)`t$)Ej+-{vsVnG}f^Df~_$gz(T}xI4@&qx|V~zlr{({wiIy{_uzg_bh%RKhg#X? z?6xGN9o&h|&~=56g4<@{y}>UL4oY~^mTY!G>_{Ii2W=tV!_6Jj|GB5Bb1*%ln``&r zfPiZ@OK8O1Sr@=`mycb#=Y8R|>PPVOgkLq=w^cuf%`56mru9=MGC||Acw54QGxLHp zWJ9fOtMl~t0v{{I*M$;+?%73KH>G||S!_5B`vN!=Sl7w6)19-oa%rM#+cTl?tKOQq(wwNtN+eb44^s)B3HZH$%Cyx)#t8^4D!e&0JF!s=GqrDrIykdfUaG?uB#3 z=Q<4MnAj5V*4&1ve8P=_BpIS`?KZ3*1EU z?Z5-84jRoR*UXoe4PUqd2Xfaq^*Z-;t#Dt*(ZM^wXI7lP0d2@D@Etf^We>ac!>%>q z8WHy-$J~G;z;v8%RcF1s*UE1f_MvbXF7K;Y;o(+O`I2-SK9tzs(#QAoZ!}%OoZa)_ z;r5Hu1hM153tf9(AXF>7vr>4Gg4Z-|pq-e*eidG!^GZ1`GuOl^TVSi7kpD3A6TZu@ zNy2@FV(|BtL5Ho?Bea)ZXMZ}5E}BVjZ5Eh&@cN-r1QNYv>G?dfhRqp+ec~Zn@zM1( z(^?CsGYj`RAH!DY+PTUm9oja}H}IJ7nAnMHFb?n!X^)}%s#uEPPP`_Dv&ykayeu!? zzVvq5EKHLj9QeaWVLtgmxpH@#oyRJa`V@b#KTXo#_pE!xBKwE#@zHozPlZr?ceF3* zW>h-hVRT-IQn zujlu^n?sK`H<=9TmFpJQ2Idm$Q~beAYJ`76s0xO|9wXH{KB~d?CAhF_tNSjM1)H>c zrD0-uOrNn4);8yC4LfOk1%?B@RswrYqv?1*V!x^u!pr?QX=ULNWAqv1+-?Y6OZd0K zL=A>jYlDOKmUFwulpbR0Vt(tmUwg=3>SC96fw7T#bLR8J7i~!6HL|M*htn(^?o=DS z|H^)03qN9y{YjlvoW#KZTA-rf=BgNvYlsZI@+E-n1qF?C<8ptsdD^mT?dx5h} z_&k1_H=1?10w5<){S<$2evb}4*Jfnarp7gP}q>SRVzRa5(8g=s7DEGJ8ArRh?Efn_AA3n{_I=ZC86(5+~`)6YcDE zsedOP?PHzmdhWw{u4-tF=JQjgPW9*Yucy` z_UYbpme`Fy$RG55;n+7-NA=yf5gqi#r|2kts}N^2SBuuYMPv5VemEC?UUe2U#|O^e z#?}&$ZBv^~&XeFJ5FKyzOLREC7e?1-n;2yJ8-aP*6B6??ziRGgqw8(Nd(IzUJbLHX zH}IMhO}@;fv`qlR!yn84+}}3%@h&pS+a|ojZ{c*`)F$v-h)4DyPID%(9OPf4V*6Mu z2Of_cd~VrzrHSl~lh@UwqqUYZxgSG;GdktP)+K*bb3fUEe%&7T)3z&{+dI8q^W3>~ zE;3I)5K^Syn`zcO^WVIAp8{Uu9=GgXv+(F&7xYI(3#%;|AK7P)TF^b-_tABKT>E{y zKjYchb#&pc`$2*N{~t)d@^486BR#v}wf6GzQD;~zc(9t>lBrxx9{Wyj#0 z_RX#Qwq1Uz0J4)9TM6}~=O6jk%P+V_+4;txwCuexoo#yks`eA3<~}g&*T-=K7pNR2 zJ~FY1NmCqU%yoZW``sqrfB4{wciVGG(P_{qR;s@Tm#|zIIpCNp112vkzqV`w~C;>mRPqy%wpxKhM4^ zRb_a$%U5~at}@Mf(IxBVdzYIZ3z8Va_B{Rmsjl^XPrdk)`qm%r@t?oJILJS(aoF*Q z$a#I)OU|tywCnumdHT$FhO`WR&hiSJB$2yl$Q&-so~lO&h^s>yoUD zXNkdXQ3m6rjpTE+#h24RKhb93Mc-#Aao0YSzOd7vbY1-V(=$gS&aLEI71|zGqF@?} z+Y%f6>RbcUK<9D{FM+sfiuI)!M=n~4?i_8uG5AyV`sy@#XSh`R$L?lVci?H#`_x2W zur!?y(G~gNI_a3RtLi1rwW)WU4tNv>=<~*3#ZH=#`@lB-JITL>p$6?LICnUc#{=0=k z+c_-kpty_RPQnek_Ha` z{RSMtXmFa?M&O3hf2Dm4Z_vaZ1Z%J=C&EK^_#QTV@WKw5w2P$++z_902fkZ}al#q* zgXK_tP(P{Q(>gE5#PKrNCKwd9tn8dKU5fTdiPxCEWzNCvJbQeu(BU+F34K@BgOevd zl`yGhYsE0%Hh~50LjI8rP3c=Rz5_056Wi}jy%fu6|CNId8vwH}`&5IVo$Uky^G0P$ ze<9zLLovNNHur|d=z2ZR?bor7_wwPq?OZDRdgOV!WU8#&Me3NgSe@xZ;Gb|)tC6X@ zoJVupR%EU@q8sa^?wul7qjY0qBVl#>#Tq{+`Gb7ABlmBXg0AnMzp(!qEYRiT$YDKF}%vmX0s#LV?0^4+9)I56lIVf*1wT7W&7pO_swrO7vs~+ z{B7(N8S?0GZL~zizc%p_6;~9W1rz_ystqQy$_68x(F$E(WJ@PD+^dE*+~)L52kly8 z66s~qK~7HLU7~SziRZaKPqEDt4{w71ZW{hzJenr{*S`5^tw%{ zRi?j{i$X>M;@&W?FmJ;3wL?W049Z>I!Djo-GveC0;t-x$t$S$qg(pd`Z-_>!BP~b{ zv+x~TllyAZzjay-^c9&G&g6Y=yVk4KyIPU-5bj)>ri#!#7vE(9iP8WMNsjt^6RCH`)XoDd87Az& zvN4+B)6rYP>16&@|Nallp*?}|!T^Lwo3f+W!Ag)N~4IjNa8d6gW)m$Kn`dTacti*O2G zz1yhPh9pf4P-+izaoPo`XH7A9lD7F39^5TsrB8mS&q)e-ECx zYF?tdW44v@UNKBS%?=u*!b7ngwHQxu)(qwz-Y@R`YUey-&rq!W+x$Vbhmzb1{j;0) zQOs4ugG+Q~^r;bR6xR%)L$F68JGcnvulO$vC$Dw2GEeTDeY$uy*#FCL2Ehi=bM<2< z4u~sd%icbm1jp4<wvSNg)#k-^rw;O-hjt=X;LYR8h?Ggbb#`GfCy z>TUNjXCC=F)&qrd`^kERFGdxg4E$r1}Fg zrp1|~q<1QA<^!C0(-}5WoK5P1%CHxGuJAuud&gIo{jXwosvY1!gCoH8PLKDQQZQRQ z&L`6zYo}HCPx*si*n{6Trfl>v_UzexqT3y>(vR%e#4~=bLmBqDg8>0fwQs*H$N5Ar z5R<<2c~uMIm%;c&(-|KO=AWsXtFb3}3~%c++Q=>JR`_gqcdd7|rv(SbPPY$Bdo{VI za#m^hfNvKVCr0)my$+A3oi1yc`iXkXzfSM=_}iM{pF`hchW)P2OeNTU)8uH-ss;l! z;-q%YJIe|!`=@rQ1|jlN3}4+?0be}&P;eWG#(TpKx4&A)Mkrs}g$jpJEY)|;k^C_- zxgJqH&T}5bq|5h7Nv&Ch!?U$XRd&+@>UxqEZQd1~`qKSoz8SJ(Ow%tIW+zf9NF9AnByMbJT~k(Dl?}w@=iUA@7Mx9hj0yeYsOy9wy&F>HKUbUqmb!k3fKP8 z#xG#=x&a(8-aI&joBLxEevxng>}2>*@>Np2Mmf6&q~WJd<=8>lgD=jUX?BFQ_5k;!0ne)iTtMZ5$23 zmRFf7`zp1^1U#*ZpA-L-m=_F&P91%Z)qir&UnxJ^eZ+j9P=5LJhAIkBgUCvgi zo+?J{aiia%u*B~(<0k1@{khMF0%TIIDHGfTNA_6Ttu8olSS3rpH&83m+OCR@HIdF^ZEQe-zhKe zc4XcTn|%f2mAS!NA72k!7!Eq*;xBxC&kVqy^Z)x=pRE6XcCEiJ%m3}YvE%6ivVG*i zIF}xLyE|_vgLq^5n0os9{rC7VfB4{k?|S8u-*d{(cGv44`S^!BQ}d=FSflx32q`bl zhWTxfIo8ap%Ky*nalh~T{J8f&T=&2E;OBjQ*1JCc`+L31^!+{Ne#*kS0H;kHHHXF`!1@~(UwtbmHrd&&)5KE3yb)B zJ<5=u`mr7v6Z9z-N(a8V`jo@h<;K8Ixd#{ebNPd^WBIlh8X!VpBJ$lA$H?EGk`v`a z`xh`7o$vLYe#GC=up*z4phIT2f%t3PzP-FU+-7{-%x`oJ=}BnKR+;qtC-4UYh7+gp zD0{2+js8Qn7>7J41~d6Hc~ZS{_A>R$_hmQI=fS{`*I*A$A`J8Y;(3`_5FQleRC)b9 zs`fhXw&Ayb0)LSD#SW%%@UC<1=S;n+?%of>1E#!`MPt?HbOwSZ#)B!V>1UT!{eX#` z^;Ex8Qn~+p{vdNB8Plyy{-{E|)k869$vgXOIC=h9cG%?g@~KLBx^`-X_#hFC4JK}) zUpwJ)T_|>I(fE44-7n{XqvBMUi*auE>*vqq55i+H`8M-^F;)_B;z|CZrUxRIcw;8Tlkv+R~RK1$f z)cQ^QL2UPG0}4TZMu#U~x_0Nc)AH`ZlM|+6gE^tsN8W{vkYDUWifbp_%3w38sj;iB ztJrh##kL#7R`QsCEnywv8>+n4pUxjNSUC$Z{b!U&8aq4r5pG5v^a!O~uTS4m{JVMA zw8I*10$O%v^L>_xx`%a^)~tbymM;JO3zO3cze##>9zB} zkv|wo7bC>iDiW8Bel6@k{6S%5(rq=mud(_z9o#4SnU=LbE=P%A_KudTXIc5DiMQBy z_}=jPtN@#|odp(q1{^KS67;+HgN*6!B}%+WX`xDgHU@_)hL9RKoB9hl=A#ozW%h~u zx;4Jt(2JSY@A=ejnpn(E8~Trl$>w?E@VQ+KZqoV9V|AWf+n4HLncDwG{$Q{-nK6F* zDg#)jxU@WoA`sY$E5DUMS)N2uE7ayf{V==*JyIOdypJE80|&U=gfj}f#%~H zzjbu&IQMaGEe)RQ^k~scIki&*J7gd{e?%7ECWgiooR@BR{=4{t+E|^R_@x`XzgS{i zW}cljws82@uGg6~lB3S~HUqPqT`?e1zi@3za2#J?yW)0Yt$Kygz6o>g=$2lu5a+1* zl`><;e{_Ere-I92$_>>eo^;2Mqe@2$Ejym78dwNzkXE)vm^#a6$M8i_J zfp_7YA^pMhK-!4n2J)D|B}{pn6!!K9nq}d^=lFwKr%B8nUx@{ewNJJ<`qZHn#i%xJ zGiQ=-;uueZbz&I9_wBfDCl*id>lklJV|YW-7z#XyaYY`PpEty5siBD)?xXiQ(b(bj z-dlU@+wZI&(u<5wKFA+b*YV3?&Tyt&?6VVrY9(_c4l0=coN+$J_p5QOoeIP1an?Sh zM;Gw6an!k{FP(549LLEIu8)V6gO4iTb%Kh5HNpRA$zu52#7o{QjDGle&$tMKgU~+V zQP!I@Af!R4G!w_@GEE07JGsNNq1D={SbeUvykuqU^ar3 zh5ar3DmBu!)jJ6@Wq$`(miY>Q9p@6wRwCOI8vnErSo*aP**z?9GU6b<2q3osqxCk- zTj+7FAN}LAMUO29%ExFnx(hg7H?^c3Hz?|q6&#xH(0;$pAJn+e*~09_wJ)b_IO9c} zvbAci&g7kWM{$_P__9@N#4*hb>jY2i*E{!BF}-QJ!|C*%18bHxFnF`(rkv`T{3&MN zqCB`(Zfb1Wqz*1fd#vw_7cku%ZTd<6pecvWmyzIhsPn4)597(+Gipzg+4B-jh}E6- zp*oQdoNL9}1m}#6IGvs{)kwLV4bv8fSFY6asAtVfp5fE8_$eOet2H`x`VaYDJhSKi zBWr`Jm#TMrkog>cQ0FoXEQ%$e^S9|<(n|X7Z;8k@l65B0*kl$RX8TUJAKy{OqlU`5 z!gVjStsBfmc$gJ>?sJ3VwKO~>%EL}D7jd(>!*w3+IZbQ}p-pNyTio;5;qVI$L^$87 zLwtfis56o|*R98)xrppRV5dCcYgy+pFKkA2fCniug`nwlV*l zi#G7d?Y3e&9M;7NW~uqXzk^oTVXwT<#Iap$!UkOEUXskiY3U9M_xWA?L2L*d_;zkm%#yo_vtG7@8?txF#e{=^>6q{Q7XF~@P-a5= zYLFl0$sdz}H(v1OsJ-z5fjcTk?wC0hcgId|x=;DI%>zx?5}Sm-mE$+@2ep)#6#U8O zqdn#+`RM$yFTKm9&kyZOwipZ)R{dQx7I@}wo?@t?1JHftXc!8)x%@W%purm{#*cO| zg`ymn)rCFBR|3EJZWDu_KRiY48-s()!*@VZT>CJUxomH+QDd=*PihvkElt&`~#BkM|elx4pNm-CTfzry$sHnqVg zz)!z{KN$K$e^O&m4mA%sFy(mX#mrS|3zE_6I5j-o-D;W}M4A$r8TY3LZfB1|ey70{xM<|2Oa&CML;;I1r8cdn> zyZ`_BgJ#def5JYtCq2IQa9Ynz75z2-Gy6{3lyX?kPLHp0n9u$iWl%0nd$49^;C4+9 zdgwK4DCPJowZ~UE)E@70_-BK^Rylsu{mW|a_4wIFf5CnQk79~r)AT~W@-e!L)!6PN&cQYUMB-p+M;F)<=5Km)H{sSNWaeT=ORWMB?-r|3NTkaq#4O$$3y` z3*`qaTHLv4bUTf7$8HhrqSB~d$Yb{{^y0}>8J}%3U?%Ov+`@b|>mFLG-7`DSxg9h)E%2Bc?Nr-Ow^_U{W7hBD4{{Jh+s2{pg)7Vd5q{3GKAhiXLwJly{NKSf;m>)}w**hi zO7qd+QC%-PFA)0v<2%^9!Lr;nzx!?cLE1rn!i4y6+JVLGb};&m z;L5hSOPlNbF8-hhGw@~Rn59&=J}yarP^=ua3HD#Gk!Q!w-c~^lQ{vCT zQE>Ozconw{{B5=Gl3#dYGw0IowNB5V`&c#MsWgT8{x1GtjQEM*6(O`-)py`5f^mW& zkY6~Rt37RD_c!y7Cso+t<+g&qMtrn;n(x5p)c65k=C_`=YYh|SCB6fk$&9Tj^xOD@ z%t@2!3cXpQ{YhSmb=Oj?J7OccHrPzHc5_4R!l2!}bRaj*o2_hr>+~+Y!s!XLtay-y z$6D;7KemSBwTC;=Bfed5zqCKdAH+}4XqIbz71z8R50ZEFCFZBNY}ngWX9K4TO|=l5 zW^ZOrd|Z9=`CsOm`ovhqY`rVT?W9S|xGR+;+<1mtj>HKNEZ` zb6_9F&W^^+hxmi63GyidgJF>nT%a{g3$FB`>&e`qJ^?c(&*(8LzNY3%gXUx zqN1_wG5{V07F7}kg>Q0Pc-jOQZF_2u-ElqYrqI?tJdPOO!U=E>#aU#Y0<-!Qe^5L- z`Bc%jX%C9P*}!iP<5MyNYo(tP4-LNq!{xN9CZ?-5C$gy3@5LMV@_-P!ul8eIvyF!3 z`q1~h%h1QsHW(C2==Q<8L(qqA2A)>J&Z5{@m(j=ggQn_f1XB*J+lu8xteUNK%;Bpo zdoFDtuDs^b-lg3P%x>cRq{^;qH45SB_GvHr{d(m&N~}Zl8P*K20AYjRe{gcB_lM)Y z(1rB&^r_TMaSG9gM4K}{{uqDI?Ah=u#12iOU-|owAi4?FQvxke69W=I46A<6c#U4I zQ%r>dS$DOr-ZBkOF*%8;wwg8|9wgDBwHJ!1ro4lH#QWZ>L_f<7;14@5o8qtc^u5Un zzUN#VqYv^21C)XN9&I6CJ^iCB6ezh&-k4vQmsp$OTo+ff)wVV&l+^E@S-VE8L)qVh z*VU%5dD!!Qd`16m^<(_Ow`Syn!ys<~ae7(OsBL30TpQ)fr ziKIefeBG7T39U~wcYuLpmAA6Ebk`eUgxz~U3y7b|B|?D83K zxDW9MO`kAzqI%JZ#wkPMj_#(><~bZXCfBJ~>>j!o;G0h+Lf_nLNw3y)Nu{Pu=be3Xk@s^D+LQ@gu$L z&|IQe2CdU&pJ{VOPv2J$Tl-1fKki&|j&(UDv9Cl-XrfokkCOf2C{f5Q%-Bu;qAnGi z8_-_GTNh~GSo0m5SMmy5ed%`d-5IWtuZ?rFFZi4ML6z5HtTp2<_2J(hR^7t*o^D`V`Kbkna=5r+X>p-PUU`7 zA5nV{Myq;K`E#0E%;D9MXLD#btmAKor-ttw3*qaS(li3gqQERQFG-sCTrjkY7Lh2wI{@Fs2)5{ z5mVk@xQy%>-`4eRp>!&5AB~mWAa(;SnrAj`@Pn>6MGGK>&+rGm_C)DaFQ%{1UZmN; zIldg(M<3OiMW=eLx>7&#`IdI%Y)}x5pk8B=O}x0EqsVMnb~@|8^t?EsZ2p?oNRIP~JPVm%Vs9nlHE z7xWy|9mBDm$Q)ymFd>84=}UD8?E3ZDy!bu;WCqi}Fu`}(-!_S}#zDJkmV3Th(pQQd z*ipe5ERqv|+y+4D)Pt!@y^+uVcK)Dl!|VS4de8b(Ppg&j)|6Sr`4w~4b%B4-Rfu)% z*bY%#PXrC<6LC)`)n;sa@gRBcZ|4sR7kp!bvPtLIby7Zg)x+D4_qkrb9_A$bWGqlj z0L$Gjd)sF*;&vGvx?Qfl?BEuBgFpCdJ;;=QIbL<8YbNI8^~d+Q-}2>oB%j^f#cTB9 z5oy><`GUd^UVXvbtl!BWe3$dTJR7atU+d}JH)Y5By*fAh%aq?)TN}U0mllKDtg(-Q z{WT}O>sar8+pqKAa=gp-YkA*4Bzu0j{;y@J8GfDP9+$jb<6O#TVSriJu|ClE{+Ijl zQ~$qw=liGr*0X-+{agC(U%&sCzcHU`jrnt!4_U?uLmYEy4X2a!0?wH&QxKP_pP%>t zlwF^G|JM8Y=Ntd-3G<$%xsd0dbr>(qI`U_Z)VL3S4UU?5qyDa#4)IY#K6r!7oZ?!E zBUZu=Gp};4cr|@5ZR$7j2Wca(Iq8Sv$b3)v%({gSD3J-6sZ@t!MUinN6 zE!YR^N(NzK?0Bfm9=DLs`M<&+RAJ0R^LWU#eeLPhM=7s)*137D>#w)}@H~ZMfjK`z z^bf@(n!I2IZ>?kS&ewWd_42A4`q9VvgO&=&&zo|YeyW1fU)3&nY+FUz7keUOtJ;?8 zPyJcEHeqcEE~M>M>o%U}+WLd)gM)ROzC-Qu8~j0yg+Do@v8P3`OjBXqs|CF&uPIw< ze=N7ov!wD3wkmmlbrjk(D#Md?S*30cDRnMOhrM8wJT#11d``!g_=DV21}oDyyauDS z@D|%>Q^9R3gw9|H+SB&ZS|=Yy2N4bxdVXjPf}Nq+DU8Iq;}b2*$6a*Nh3aj258YbM z{o3lszQ!Lk4WE8%rQ~}^s$G^15Ih%8eyHn=mV|8^~;& zkD)u zG4eh}0^kRfH^T0EjM%BL1Z;2%#&2!%=a{w?QC`c$OEa~M&EQhKxYMb?cQm{~_*DsP zke=#?`Gc}UYlQdugZA@2^1;^d-qw9X)3rnHM^n}eU=!M?l*d_}&Gzq!K+L4X!~ zleQB8x0S9ayicRK7*2p|MWv5;d9F2#Bz zrT!+~$w&Evf326aW_yqS>e6WV3{PkddYHH{5Y>g@J~n6&_5UPp76Rn&iI1-2jK4_cawyn}jSZZdP2 zX2h?}f_Q+MD(?a3 z1+(g0;NyHY|KMxQZQ2t3gQ-Gm5t?vfCM>5d&0@E`Zr&Ax;P$DXMEzjTgN^bC9!}Ld zqzbZSYp_dkxRl#2+hso#X%FeU?MOX%SXRz(YHRXIV+-TeQ#cdzH@rIX4!YSU*nkaR z>`u14Y}@FkK8p)*1#GHzKgS<5eM9T+D0#D~2XR?K#6&SpC1y8wUC=zH*ojtmTn{Az zvBIVS_6b)wcWCu)sY_Uzp{c;NzqP58XA(?SSZx(OOX(+0mQHp;yPPu?U*Jy_htKr^ zyTCf#%ldQtL9=WM`nTiB*E%t$v_Xy2U5;eN}N9gi&>hC2M|82gB0SJf<3V za@m1TO9xfhW_EsWZ*sFlr_`y=PWM&rKz`01daB@7!7lYioqUi#NbWWaVGS)?WRu3- zkPnSz?shLG4AQTaz0~>xOy57xA;V=~SE) zS`ow?%zKPge#RSc&IDNWY?0jM(vM6cf!^o?L4#S&mI`Zx{Fpc zyzt|{y0?z#3>qw*w#V2DjtCyg`1Tq8An}J(!OK^G9r)6@hwM2lHgSO%bjLI~wUs{_ z?x47xorYB(r9<0A?{He&&ZTfYfwpM!y1XQuG`U{kHwxoaj@O4`NH&Aovt7&)YnHU# zMdguhl84dGIGtqkv6>V<#ve3&TXtZB@<(jduE5f_!x*;6r{JrXQ_i#=?vzW`s8vZl z>g7|c8n#ZSM}hZE(S@zErlGBIDKP@2Sd z+uHn&_Ba0XoBQ0^+2WZQu+y*l57k0xy&io1NcuaQ!W(gci*$mzZj0yB% zr;EN-Z|~d1`k}GycG%OhR)K2=UVt64*EV*1i9bkx_*b0Etmh{)@>42bBBe8JiE`0L z)K7Tr+}q6>&Yk=fneb+BIl81~2uxJF{FQhgW~ArjL7f@9K~a8x{=v5m)W@&;#$Boy zqD*Qav?1ElhG_w~#_7V{!j7vGEEEc%`8~Mu56QoKb7B)`J?K&gSCwD&fz3Q~_6`1^ z+R@vO{%Tu6>zYxUGI&!LY}T|9wJVwoSd_GDNp~PG$jxJr^=nnRf2(`LM)ovUwjb&c0vAJ#h@*6{0xw4Pn! zOrOM*(&qGj>V^KHG1xo)`TW5cTD#Mow@zRw=jBg$P2*Zy|0xF;&cE29bq@#Y7i{v* zb^4D#gheg)+<5IXRoY+dc%A>_ZBPL{JAT@g^ec3jb)09IdHo0c^J-V7GH6fWYd&!? z)Hl3qe}D}t;?o@-DD+=;sBd`n@dxz}A9Kf&1X(Qfy~D%*jU9hfbzsNQ4&a}Dt*sC&uYDo5O>rF~Zpw!*d0JeLFA^Mm}<{$lSM&JUxv%xzW9 z4`cCS_E;kGpXW|#sytbkGBd&q;SWopJ>pB{HP=NcGRM!5>V z#2=*mek+8tG(?Wd5ZffEbjmx3|ATw3^2N#RM*MiA?{)&h7y9fzs_0pg&kubQgE{1h zlb3B^S#ALx*t^kG1a|}L{1$&Omc-60oW-48zu9%KV1;GjQnSzk;vE zedQ5oldn&{Q?$n-&116eC?_6%?JRgKIBo-Mu*0*oQg@Z>BM`AFtH3F_vaicT_)hXp zyPXhz`xX9RsZ=_lfr`Ibc^&BstG(JbIfvAb6Y%g7g;~8l&m62-ve2r|>$Ah{LGCr- zpP2+WAspd#KDvyLCi#-@?zfEo6no29TI0pH_=E7ggwv`ms4nQ68H?^)q?~B2MXG2T zXQhdJcoYNI^rqaY#+QZQu)n>}_SlWB^rcQZGo7CL!>gNfpH1u0$y(>-Gkr`YE}zUl zNc;#c0Zq4Ne&ruMo9UPPcw4$@cwVk@pC<5)!pT++QMXfbVL~*=s8QcKXse*nCoRiv zbaYuIBi3cMsFdRY)er3|Ijq&^qiN4Jz8{_d8 zvf#@u6Oo3eJt|$x0s5lw3_r#n#17(%j2%DoG&X=w#S5X>BdxKu!dPnX*}|<|pv{l7 z&vd6~RZgX8eVhTS-CS4Il-tq%ySl_L(l$Itqoarqe%ioIM z_CCiSlutUB#tve)S}7BX1ZIf8IXVI}ru^g_l>RjNEYayJm$nPI*u`hMQI6-QrJG}y z_shVgHtMlMPtHwS@%U;JuyVt7d_KeIx{@bSoUSZBcxjC)4_P)!7(YvR+QQ$?Kgc@A zuec;{&ZcAVrTibx)q=OS;t)D;GaJ==Y8~xG{n8K(-P)PtW$C{*&pR9*#WgyYF5F=1 zg1mduv+M|udfj(%A>Cfvv>|ctJgiOJRk(S@@yGas>eG~4W1!c+m76mb>_yYm!Mcyu zF7tM!wz}QMz3S{3?QQ4hWhd}x_hX@52p>ptu3UYE!xc>rupHrnramaA>L8m1FANXx ztv9(oe`XciPfp176AeYX|1ticuqYWKT#8`}TTI@*<0BJu+kI^CbdWcV_M%m}jhf@x z;;_i0O;9O^{h^rQZ*?~PYrD#r)udg~W;z$fXM6Nm7n}2Wpz`R1E5Z*=-%n6y03W3~ zSJ|lx+DjFjUv-k4ZIcm`Yxm~VOOsgv{Vv1xWX&Z^FuT+9JS(inzrTIUClL&&0Rj@@jCx*{z2jo)vOeQVfu&R53$=Qv{LMa^7d*@ z-r(2V2i8m;>3N~pDw6JXw@r-3)}(!c13YK7MESux$sLOC7p`-4i64}?k@yQYjvic; zJZ#YweW^j52J6RSPg=bn;}3c|F{ZEoHII99dw~5~+;1gDSAS+&+x61>Qgw3OE!*c) zoScm{Voz*uj7WhC*0B9LL0j}zIPRi_(8v$tHh}co{^FLLL}5Gd;w5yy^bn_q-`R5d z3I3qx7h`{vdyQAJK@V~yn;(o3?`&{f&sOuhW{iVtyA=01a9u~c5PNa};OHJv1>jC2)4))OmkneCjtQ^|Q+7X6*;gXAZhJ*uXAziGly}>0|!3PQ&ri zvEhG~TiuPv4+B^G7=O@|&nuU~oz+)(pgjSW&Y|&G7l_&Lv!~^XS&L~bfak@W>=n;E zn{)ZlDK8qRy;|HUmp}>JQAL*w=%GJ7pLfq@E`5wYNHIBxVKBw^y}6vS#j26ROYIF? zwk9`>Y0rMRv7M;j=H41krqN0S4{*9R*Hp|4IBas|%h#gG-Lz`AYnVW;GE-MgnPYqP zBRuC*{6X&VmXewn8PostLfTZiXqiuo6%&cAyE$oVl*rb@bj{lw`cjpxA=qLI0AFnqZr$gebRCApTUy4!eo%d zz$S1RZnHFXpZ8w$bei?s;eD|ef28YSJ3C>_S${e;vB3S)6O&v?@Eex%muzW8>K&T+;G38bE7w>Imzsy zRqwyvuXp|HogX{iu>ktQS6?^Z?X@*Cy?Eu+RqgGy$7de3e1WIinlaWfZfh*mfi3Kr zeOv2g8<*bgmeYT+MQ{Jq@v0Afo%)7({$=da6zMlQ0bX2Vz_LuN6SnYvVK_^2znXE5 z`>nMB_n9Yw)H3#|N zKORiEnMeKJdVqBT+Ekctd;zZl{*+y>-*&y9U+?*QPl_X}z1EOgqP*uyJ?o+MfSD(G z=6)N>lzE>_0>c>|S&v~8nv3SWsuNRp#0X38;XC|6+KqmgIh>o#|7u6Cht`UJaRzBC zv@hjd(=~LD)ZgLTNr%&tt=tc_!5^PSig-@0Z@@6&od49=sn zP`(g8BRX*|r#Q{m5elMz?6oU$Son!S|cKBhB4yf{6ViVsEwGW z|FZ{{ZI&uWIS*QDH=OFebLcW_|4eX;{!A~)7$jRg&L^By#m>LlBp*=Q`~rWFUt!!} zKBsVIU!wkEfwhU7Y4SG6zY_La1ZwVcXv~ZX!|SLrxTf=itH1nkPD%1>bcWM{i{T@OixZoa!l6@qO%2o8n%3dKxC4U;UFdO5{(q6u9z5tHW z*Z70tC#QVL{W7+0ID7m(l*{B9gimp%-1vT_<468D!__gq;7ZLA{^qX1qk1{;#3-LB zh>HZih98a`ZH6<6&-g?9!GOt$!i`4L&g-ihGijS@vl?eZbKYS{Mp2bIcv&yHdu+_I<7PLwpJmyhRSgXCQTlyP9Q^l2pb}=Q~^%Lhxmh@ ze_F-mLAlBQ$ULB!ebX-xQS_gd%CU*Irl-fLdq^F?DU~j2+pXVMiJ09U7sOq|cPG2b z;LX%Wgxp1Se5(PtUj1~yqxk2=S--L@Z6|OVzWlHSIP{hr_t4cegNPs8{r$0@2U)zSt%^yr+)5m zz52J_de_`5*1VtN55C5I%||BI-Lxeizh~kw!1;ERnL3DYpF6Y%>53ZvVnw=~=T;?= z3p^&rhn<+#_w|$?idrmOQ~pkTk6?(WmVsuYu|52r=kn3Ev$xbCc3KwhAL9?2 z`B-b|kn$B_1a>L!E;tV3tMBsY-3>-7JbaC=O$P3)$*WoEil5y+JF!)w({)45GA5S-Qe>joCbP6%D)@J`$9N?43ACGS5CfUSaN*=IexDX1FBCLGo zUZJ1tmh0u*nRc$m{%;<-|2#A&$qv)s=_6dMhqqVqKq_tlA9;oRh~WR=oA}>p|L4Y` z*|rmbRuMh8lJFe->2OyMT`-UJZ5_?*>_gz{#)(4-`9i%?0x6vaI0%lq<`GCe2hORT|4?Y_h0)< z?9lonm1VJ!BImE_f<6(@{E$B_X7-`s+_0leoQ_>P-RL*ZKD?IZIyuJ?f@Y{|G&z}L z$mPX7mv%6IcYN)|3HC8(8tu`k(O7gZi_h@~Q_|)m4$0`EP$z0*G2h@CW>0E#z{z8I zFI-dWRO=ja8mBGX!NTO2j08rpMg*L!-;Ji{o5UG>U;(}noKO$swnR%&xPg08-=34# zPr8r7)P_&hhp?VaasD~}p!7J6@D5`y)nXBEwS@y|x9OwOpia=AEA>$YhF#+eP;=BScC%+%|(7x;e zc9u9fi+bc(cLn4?=-7k8OU+BiS|h~+BKTH-Qt2Iq`YrbYL;h}acmx^>|?lwV2ILw z?b2_^t@<(kpvkMGJ(abm^-Rd=;79_)a>b6!QkykpNyquDxH z_OW?qOnc6}e6QW9xyP>fvzHlpBJHb_x+V*$#w9%|IGszw zpe>p6t-(FQ@!i8`RsE&&GVG%L%Xrlgud~c1qZry+k<+6e9zu@%S+_!bQxK* zEvFMiuVF%tVY_-`XeLIcj6QhNaS!5Y51mYvHK$#-+nYSP0QHaY2UP{e&!%TB4$Xm& z%#6imp#^2dH;$Fty~-*#oZg6~sGUZ!TdrC0r<48TBAlEt(bL!XgUpTcn=w~1RsMDOtx~XG>qo}7eMk5c5AmWr4k3PMbgb9eK`no4 zuOjm~xn8});8$=}$%||*d@cW=Su>h>9^cNkrC46`TnV?!lmr*L!DECWz^_@rf3g{h zNTb#&Jko(BGx{y@=seLDjb5+$mfy`EG`PCPV;!$CYY9otbb~H!eDky^x8ZVn{nl$+ z_OrO{j90^FXH=ms$k7YG5JP3N+pT*29nAfE{6WfZX>QZA!DDWhgS!ziLoOm0-DKx6!2T>=T~xy{vk)sSEZz;+@@WLN5{!%9&0?(IdZ&y z=};WVJ2$(=P3@1s5?=S0LTD_l;h!^{Mb;(;7gXcXo*rLn$QSD^i>*jK-My6a%}6|6 z8>JqDT5NhQ{egE zIL!B|Jo=nz8^XY4n~%Mc(fZ*Jl-tB$;zJDu&^h%rBR-;#+e>oK<2jl{evIl4;uf1?9lzdj-R!y>95Au z$luI-ohuI6p0`JEKr*DjXu5510DQe*I{3N*lwCelX+J8SJbrq*X?#ZFQHgUG0QUsv zNux_<>;ivq#aa6lf6&x{#!b_3yzvGbEOLzaQmT(YuDBc=lII99?ebUi5SD|+zuRcS z;Z%7BM*oytKt}Hp|07gE)=vH|@9DC`Dm>d`e8u?0j20&RD#yjY2L|ym{-9~2vO}0M zhiPBLPZ>^#uUuMAz>4v0X3(8ogDpjL568}`kA{@tu*qL1KXwKzO}j$X54vP=7Q@cy zktq}$S6Zaws+)l$No+aypn?71DDYQ5#ve5Gp+08fa$k6-Vnlq2{3CK{-pE-e{AvBx zc%|I(U(=qzZ7+{XY?~;rZKqN3bY8`a42;mgWZa!$)0#S|bjS}B98`AcQ*$1aPs|1z zw2_peEqi`wK0l2A^{&c#kcPH%~dF|GlWa7ZYk)KU_ zYdj~!EA`ln^zcE$QA^*8ldIDKAFR5Y;`qKUmM*KN|JcghKgJ(4G3#b*^7*x2lFyod zazS!2ci;?mXy59;()|^Vpgs&fcx}x?X;8n%%5LL#CO*6fR9FllCEAan{W_n=X@Bjw z(>g~Vt3qXb?X`zj{M+REB2OGR2%nKg=cn=yYM#gqX-sNg%zxXK)~|t7p~QG1jpj_l z8)Jy4NV|-k75Hn3La&;ytP^uILT!SOqryJmhA8kmyV)-z*XeE5IzMt(zE^ADP`FpC zEE1g|dX``YO|%D_Gsoo~e2PDa9r_)wO=+Fyt-&X^xcad;*wU)SuN=uav~G~qoR%LbYE&>)odYc}E1w%{T}>yLG{b!k0A*h@P*z(1OF9d`k5 zvb*^he^B$Esf!l<+;Bbu(R?m^YbPRROoUs_Jlq&h)4hE%z1KW3A@>!&wI*%Cis!Gj z#XZq7c@o9D17|W^$L9gOojId(z;{&~z}X=VLwr2d1w2Dx2k5eTFiyjDx^%tv zwZM*jk#@FyW-fDb^(~dV56&n0qF`&nte(N%=lFx(T8i~yT5Zd3!SPyl7(0o*Ktubw zY($ZWJP&8#$1pl815eePr{fLHT6}8J$)Hwumkr__vQhd8c?Ze;=y7Plnb!^0TsThF z@H$OyQLt%GD-}L5c<3fN{~Ui%bwKRumT}68`KsaC5#4P1w(?3B&}~cQgSJNhhqq=lJ(0`0_bcu5EXMCw_su3?t9^ee~Eo+SFtlkghw*CB})+a`zw3wYnD?6e5n!@_f;Jh$?N{i2Mw})C+k3MLANr&&By8^K9aNPF?NmUR)}I z4$IdxdA!`i#5G(zawxh7@rB2x9+VgI@AC)oZ)izE`?5S7J>j3GyOAMITE&PJ$SXYJ)ZU5UkarMSv=S)QF|`qHHQ#9^p^D9@|%LS9%q)<;hIPvnpBrbe=LSaw#Edm@`D4sF&$V0fbrTE4;Yl%&IE9b?9!|FLmt zy-s`b`Hk+Td8>4hrP1jthKBQ5?KEkg{r+0Gbn2o3n=Zs!r`9}G3DvIo;PSzn%X%+C zT)s$eSErC$_r4yv4pJe|R)E ziSmw(urEcoR58SiyV_eDZWO1ATTdCy7-GH2@nLji^cA6C zj!^Hxbk(2UtK=Ai47IpD)`um6f>UA}s?}a-usi2$d+7wb`Q<*Cn+8vvX3NRg>qllY z1t(bAo8*q1kRQuG=*1ONIuo-*Ke2RcwH?uoU@dQ+kaXk?+&gTo`HCecV?|e|O-i}z zgcrysjWe1d3vT1Oa_VIV(HLv>>%E-IRhRbo^w==M2}hKV{doYBlJnYrevUu*YI`QW z&)7phq5ikjDMja@F(44gSsteY9?CM|(gzH7f!3f`xErXBrzg00>>g2nJJLdv_ZIC= z$3aFjY7JYnwg@>K;uv|Hy^rw+RaOrVpc2%kbYPojgU@f}l#fe12jWOg`;K1I2iCZ{ zpO7=3;?r$}5pu42nb`Ho>WsQ_=drBEM}yd7IbW0aQuQFLV8Huq1_ymkoWc+B2Ngf2 zc~E8d9@ygT%e^*dID^=wF^x7A8WnV3=@+J57#u{WhC|nV-Zo7Wmw$>qj&|E0IR?Yo zdU#b3-T`rnI??k1u9sd?O+0^%KZpgdI`auzRY`t1(9S-f0||yqvCht=7TH>%%lVYN z)2_~ke4*g4Rh3gz?MdY}6~h-`i!sjzq*JHV&zR$lb-th9*Z;Hhdp@8U9T$?*x|u}4U`>RR3gfzZ@FDv z_l~de2Y=VZfE5qJ^jJI)%zGcc#xMn;mzF|2;W_SKJn@U zX43kd`3Jo@k>BP}*?;Yix+b0t^NTm;nKI+I%AMg2KDbW&EdD%=iKg%xx0UZ+>mdHo z-*o6VUj6VVuEG4_ga7=}&wp%q+h(5eeVMr>W;B8*5O$D@W}O0y;@+D&5hqGqC=;j6 z*oQrE4*iza58{KF^@CSv>gVToJ~>|L+x1(&eCN;anBO0o3E%iByuE(N%^VqsEwCuf zIaGyNPxCf!ZJ;m2bhEZr%&<9rzEiK>cD>wRQ~u7YejrpY9h)XsAsKn zIV_78@3lX=sB4Q(U)r1c@Yb8WNq^@dzM8&EHmR#9zFyzOIo~B-E_94HWxvq7X)-U)HkIvIg-SwLH$ZzbGS>@J4dr!0fr2LfI z|CRiM!i2ng=^0{dFl$J&$JrYHMEJ!URNNd~)Zy;A-clcCnf$u#aXYZ2e4P?Y;ixq+WOcOknSnAWTcG>-?0GS zpb>RDamt7$YTLz^TT$5?#K_ApCj5{(!xp0f_%Z$I7UFTiWZQc!kGg$M0q`5%`<@@iY*O7ZVk_K={e~Lf&T9;85t)TcUjFDO|q5rsZj6YHLaV=Z$MLXxd`Q1(; z>9iY_e6TjlmU8=6B^^05(^ujFR3Fq49Kv;a4aO@B1zQl8i`U82P}+xl*O!Kq#tmdN zFa83Gnc#Hdem3}>Ky%w{Kg>Sbv=!d=ZytV2a|8Gzhaat7>O7oEhQ$m6rUZvwMR)S3%3k21m*Z z2Udgr;{^!6j;HBkW;ppW+W%Dm!a6<9DZj z@V|0)2`gqCg%e1O%Q`VY^Of4ktRV!VET5@J{Y?2AF?6 z2RqqR9&T{>SSO3;B1L`gv$q+KpY(eSoDAA8=Sap75Q( zW*7_XM|aKlT+pe7kM<1GhQ#lJiwE8b#z4EGEu!1`DgL0x@6i~DW(R%c{OBaG1AMU3 zy*rt7ymw7@tE1H*I%DkWcZRWgY<|z=C{ueft7P`c@ey2u`<*54BMz#Ly?eUn8xP72 z_fh>uy1W48)D`{P?tA#5u-(h&_=A+)tO2Rp>Z$ZVW1aDmoTB7qCO)T z5d%MOEN-alUVB&Ya&V_;$LUlnZU&6z8QmIeymRSZiO)KwQc${gvsSges*da6S#xl> z;!1VkJgZ|T8x>y5=RU?C1p8p?x+QnwHLbauF^TnrFlV^^Xg%(b+Rh~VIp(xV{+LYL z%?P+{Hp_jd{ku=JMhDf$hW5X?oZ)fK#5TDy`08tzxti!j`K-RuA5Fxoq2KN_&AarCpz`X`Up zh59<{QMWRUljt>+JMI$s#lvYN68Zmu)jXPp+@UVE-uG!MujE=?Hpg9=?_`42Yx)A}lVr_tATQx_hJJF@UR^5oI#`9@*7+2F5Pcr@ zNZNmzxG1fyLdqdXU)fD&`Cc_#4!6qIZP6%CSWFhtU?^Hqf5va=_QZUVLTj1|UN>lo zh6=q33SPo^K>$ubw??4fwAeRN3t`e15bYYRWH z*PF*9b6D7I5;t&(0U_OCipgvTwzFW_##mo2Q=gsb#|#WdC2~BB^T@qj-<;++=eMle4IZccI35S>@Flov}v3nY4IW*{+f!Dku?2s*p zPFZE>kL)#)?lW>^y`?vsamsv9;{i>Pe{?Unr19E2{^R^XvxZWY8Qz9CQLIVO=(EgT z;O(3?b^1^L$HN1>xPEs%Jv_0+ED4PM#y`FEKjqUsXFd9=4|hp_UlQ14{w}QJ&p6O8 zqoA^bwO`5SW-Rto+mq+F;NqWh7`#u#)$&qURBQ9>SO=Y(Yk!Izl+%j~^6Ypj{M)^~ zmg9d;b(lS|8JmQa`TU}LJTrtWs(%>n*dJ0MCO44Ej5ZJ$;$bmupHsd*=Tydva`g>U zEMb1MjU4!?@L_dWg9E?zPI|Il?St*F`LleG;`y-`&K0eCe{yP$V)-0#vA+G{L=5z< zG??51a93Ji;}5ET>YiE#>*rkiTXC<=Yo6u5HhRv&B?IMQ?L0*Pbc2}Ptu-b$Nk`g_ zZG68CPtQ`igKZ}Gv3!E$^7;~g&>I>RufSMOv5lWsyx)`(9t7COhB}p5b(Lsu&yO`+ zY>!8QFGbuC{O{t^2^#}nQl78X9?T%)cUK*72LApv{vc&HJW%b^b?-IqC}x40D3w;X zWresG`Y5{C7QwQ%9Uk6;UVma+Te#i!zm(Y$nY2tkvdLQ`5m-vI?f0%d_ z>@oGBxC5WBb5>r>4qBVwcWy;^Ud3@5;2?$vDSspWceoWE_lPoginK2{Vc=|T9b64Q z5*X*#_=E5Eq`r$y{%t9iEyg;xG``Ue<<6kV>2}oq4fa7hvDAL-RU}LPz_iik>||>0 ziad&{oAx<^-NLd=eE;|OgH(cS@D4D4pKmqa5n3otmvU|f^uV8<7*Yona+D=WkJUoA z?~vXPEp$VN_Z9gQGt%LuEv;?@#X48o6u617xi9etwKnqXz#d-)49RzVjKRvK_dBQW zsvf{9O`nB(&}me5i~7AYzE#dnuqLgTR3TSd)K@b*EsV1hd}h)Qga0Ux=ePKSiWf0$ z%hTVDS!C^U0^pGaY%n+o{WybuCYpEj5wuUU#ZYR0!1071)MBqayQZG8Q49gjK&ZaH zKW=uqUA=-^-IMpg*Z70nf7%jbF5?t@gGsH9-x!}eyln6%Fb}mY^;yMRRN9MMZ(J`E zADwwh?`?o4QI-AQLfl3>y~y3u_3bP!-4ewhnR!#|;or_5^owi97^|_C+`7?A3;oCT zT{sT)K#YsgcqJx;vFF}8XAt==98wwgvRY(c+#2||U^UM!@yXyeZvO;6itiI#5Usnf z@dpi_%DRLYw^})7yB+x1hF=b+nz?v!TUn=8LUTxSod_?67dHmSZYkT34=BSfdQk3S z17EF48=Im>xMHEm_n_RY{H!vu93uMvbu_Ywo%T+Z}A5;=Ei)%Z7z0h zwTY+bfIFeV-rm>hBRuP;QKLEbhZ(OL%Y=W~pXT8^B+1{mTkUQ1>);1d)-ig0b$F?J z?!yiI11CsTcopjsoTcC351KJI7APKL8wXsOKF)6|j;hkGjdHum?cT}^eDwWFV{M1e z&GAb8V14T(oA&BZaI;acWprr`r!Lz*E*!AHbOuP*YMyV)uki;J&q<7!HK{XaNJpNr zYSqVp>2$u51Qy}s9W7kgIN zUDt`-bxUuM2>>9gyr#wo`<10M<`;LZEr@f(0 zl1m(FVC8Vg#f4mNhSF-a*UEu;z4(7(Z)(A4uLf^k{6Tnv>j`~G{6XmrgKZj4?g#jT z;?;WklxXJXpwfmL_f-RJjy~~*0XV0H)@~6;E-4Cex9^wxIx>ehII~yJl(Sk?Z5Q6^rfc}B54hg-N5~3m@bUG7mCl zS>kLHe@fj%b|rBU`=eSo+l~4o^ZMx$?OBOUV~2)!%!kgxLvdPW-Z66>l|&9)>cF>3 zq;|{ske0d%;Mz{7im_E@@VLeMrQU0v^7fLn)#$)Cd#YBVaa*iG0<-EUx_WyLUl+YUHDw;EqJ_NDDDv8$dJ)?pW{hgOB_ zzT+Qm!ntkq=yqGSYcHAiNzKM;auZ!W)|2(;@(;2m`SBH)wTTKV>{BnmauwU`X{F|l z;Yha@e{5R;LSHz#!VBbU9^4+8$t^$f$L4lyyt8wM{;sy|1ybiSy2DF5vm?LPLm%P5 zKaK8XR=(}$a86}y3>O1vMFLO!&`UreDFEF*UdI>9u8vPfFy?IH!U@7 z{kVLSHMDH_UESmNeO9slpNDR{K1Zyj*XG$DstMt+Jf7u{-fMcEM3jwjh?_)QoZ$~rM<3!3sxGV= z#^|1d&%bkR>$aGBp@P_#=x_IDlDS;`Qp0hQhAZ4B0e-e~btbiJZdrLWTepi1W4oA- zUJk3!VGzzV%Cn+}BZ|+ak6#`h_mg_e@{M20KS;%d3d31~0{nIS;8C*U@;tWeXtfaQ zJf_>r%_hG6u!>v{@ytJkKPVfh86UX`h%@5&DZl9-=mu}Lv=RHBSzPj=a$+}+`_GHk zWqzo+vw#!$$M6SV+@3@0l9m}i_@G{JsJ|23uw^d=Y8mVkW*s~xSA|(@o?I*n$A1!k zFjWlgey~9mUUl-u3ZJBwr#@)+8cR72N&bl%T=2OdiNHUDKlsL-X!ndZO-r&~WZFv3xG{gL5L^EC4mFS)M6qK*Cr{-Cf*i-}Ht zEd7>#-pq?;ZD_c3e)8{fQRR3&gwbe7=FRE@^bu@0z#CLv8?7h!n^`OH{`Wbre;0qy z>}ypX4)t4cb-nhlwW8WNf6zMXRhF&MJ|F;^>sx(D>tS*PQTXS&#GZVo^;#1CF!zJ@ zWY)^Bd!zfKhxx3rN#6k zuQj9hJKmeTu?YVc*c6{}-3PJXM`>}s>Qw7}{$T3(H}eOrzY6A+pCV~}NZtv(Hhwz% zjodTFSMfx+_`^>%_@6OaIxd%XZiQd8?R(*GXl^LKoa%&oWZq^z&VBhje-LbvFUMES zJ>QZ)+~{vo*1zs4*JYRSpCSrratDS|g<7d|$tSF6Iogb*?$Vn%B(3MR(Mt|uapK3@ ztr4Dzuki=DPe1s#DL!^>LmAqp`nL|Xjc8;S%At!x-2Q5FUiQG7(E0K>6uw` zP`)@}Bj9U^jtgLgzlHe_-bLEz%JDkT#n18${-AVf@rkP`Y44=*C*`YzQ>X3XE?%AR zGs>eJYXNkm&iLRP;AzUYCjL{R?YIf)yuvkDpT!P}Yj&;W!!To67$irTvHth%ZQZGrFhBxz=e@UcbwA@EhR{ z@C3ibAKYqQQ~A}GebGwk`nazuaAxI)t7OpQls~Qtk5kwt*xyrlve#BYW8CQ_1;=ZS6;T9qUx`#bu*2Ld&Xy-e49zNHjR>V=!uLt#8?FtSLJ< zIuEqu)W5#LAM|ghe(cbkOP-~h+LHQn#gtunG~xHsuDXmC{68Ed3Szfg5=FAU0dVe7x{x|TbYGSpglfi;3~uCQd=Qr!4?0K zF^bKqc+BwA0*6%P1W&Ndrf_a_?TnsdbhMf8YZoVOjjq$V8mao)YySBTe^3K1oP7QE z<_;|`LwnHpN?uwU8V-FGUDia6oQZDhjOJ*zIshLe?+Uob+U~-Q0<@_fv1$3tW>Vy| zCI3<~XQL_lSQne$;}1&1BZYqR@E{Hm{R96#7(VS=*v>6UzQGPbJtrp$AC>_7XIG~0 zmwoo+*g|eMxQ}(t;iM4<@C@9f(Fw@g1ASfDoCC+Czmh$f{tTW|s04O*4Vjn4?NC5ySo=`xzO z!Z`-yhwEZ1IS19ZifC6#W7M8}j6cZaL3{<;x!`GLu1<{Lh+jJ-OzT#i-7-Gf&_9Z_ z_te$t5*uD@f_4NBL}ySJ;t1k5r#{f@dp_ruo9W;rL?>zkNa`9*UhvMKIKl95pF?3k zZkF7Bo;K{{Q~3uqXN=*7fp1Dnnzcrve10^l<4>INk)`{Deps5(+6tQ9Ofr(w{j7QnXE*9@b(MClV!kWbMmvl03+Pw6FU39N# zBet|Q*O%dOSvekUYjLr|*;OokJYLV`&1Cf0Oy&$?z1Ac)r@@&zp`D>2498ZV|6Kk- zA5`*o%@N1Wx#{j7A_gkH=@rMg|R0yNNBtmB6JV4Ycgx4S857PES@m?!5 zot`S>CeYlie7nql{Xyjvx*n44>pt0g)JMJQE#1wY+ezO&6J*XjEZi*j^qIw`>hVdE z*ThOIVD~pJQbYJM=kQ>p$wtKGlm)7%<_g!lb=NfFM&cR*u5*(HODf~fDf}FU#vO~wa zU3stc?*W2o_mtc{tdpJVALF_GqUd9LzkSa7%jZ9ZKRANm?D1$Rvc{+%JPn)F&jHkE zTet19=sz|dyT#p)E(IA_W`z=g8s~ose~@U9jPCl6Eqd{*J>7%!MZwis_HPF9I+VE!O;q*5UMr8rrDCBYmZeUDS`KVf&}GEB|&Ies)SW z`XpwZk0lwfH=h2a`Y>fpJ=*E?Futs7zoN0%Jexg@E_~xKZCTj3c#LMR_G%m6ctie< zpZh9(7kpj8TrON4rJQax93Nhs#^7>9@1u5J&eO4B)JcwFt#GkPmYTo`93P-saq>{T$lne*kB6JF#ZXHT}|)> z!?WO8CQeA!NmPRFS_lZFDT#W3Z;VeA&v^ zLhc!Gg>_oF%Y*}RJpoQ7{)^Ga- zYjLCIV4C9|WyA+R=bB3{zD~jT=H32C91C&{g7Z|0&T33~=WXyee5}$B{Stpr)c|JB z9-Mgml&?J=#g!k9-v<{9q)pp!JLq#NcVnkRedJwdjEcvdP2in8Jz$w`fxnNq?-}lU z#S$0K(_KthU*ivI4MEI^+EF9CJw8_W6OE=U<#WJ2Tyk8A8$?1R*qWd&_TozlivrUk=JhN22Njz_3^?%$S4aGndzky%c(&)l!s(}m zzez5qO75`m-$QU$3#Hhj8@WZV4`?{zPno=mD+F1<%%yoL9W(O#@fwZJZ}A5ev+K*0 zhM^0$mU|aLrxs0MH$$7j=c_WpDS|gOFPD&QoCosP4rx|yID~i8GC2sl_cpjs<_4!N zL!1D7y-cBF{F2Ib^fmsVS)1k?=sAb@xF|HyQ!Tpq78aoS%Ia#p6;ISsZ+p|p1 z-agjB!t~a!WDmK{z1>=!mihkm5%J$zo#>_Mrf;eI<$L@=##+l4h8HXjr}U0#Pw4fD zyX>sdd376hyOPcqr|>}TLB@9Lw4!kIFzV4l1^}aean`9%ycPbp4Ivy%M$oQ&x z{_Xrht%LkqpYLGrL$oKxe>98H%4W=hSFU)BLT`2N?JA`m@g>jU*{Oo%;Ky1o+S2MX zx~-cg_{r`0$W-&T^UU7e;MjJX=t$aRTKZD{L1MtF!^guLKQ-P2@Q+9Gy=XaeNy3Nh z1RAw+?zmaNeOM1#TC?2R&8F}Rx0?kc11m%C6kmH4TqX#XuoG7bA3WS6{{AigAo~Zh z4H1vW9IZaVcsZ`ky2(PVvYWeM;sL7S0pC~8HpGWjXy;2_+gbY0W$I?Lyx*2yXvg%a zC+TC{3mQ>y@z6~LuUTQsSMm=g3#tCIvksGc7L0sfydv3GIPCn5^9l8^)l~f8@-cT7 zchku%daX)ta7#C7b0me?WG(vp3Wy9`1|IQqfp3L6=qAB%7ht(vVjI50AM9Ul%x8_{ zGreYvT$4jOQ;g+Xm0`RSom_h@_+I5F-_I6y4P%%qFcEc5FY?Owtm)b?P%_vDhIc-LUet(-L|nrdN-Y?cD3~7Tl~SrEKlFa zfYC+Jw@{2&1fFIhKZ&iZ_->dX-(YN?tS`HjG`OsErJqIcN$Hucp5%ZerU9|Ef%=E9 zbuM)nVof{-b1SJ?w8#1me^3Fc_0i)*9&+2{k#@&mnU(Crjg*JiaK3ZyMeplCGwM4g z>`bzz9D|Iv8@FRKf0&$u;NlDToPKh7CAQ)Rl771hr?5)IpY<*NpnPbob+dlfz0HcX zo7EA?D7Lzt^Qbt9IW=K|iv}>%!J3&Z3K&^z@0;a{$9wU(^5w(6d$}BrTw2$Ybv_>R zhv_^$DBX*Lshu4>F5lu0zO+kNw=+=D4)EO&M@^%!h_S^6&fzN7eBhbGP1C)@%e;}( zYkFDP9Wb^U`pAz;Z@G1rE8k(X@~yF9Q>=$J!E$gJ?D@aNAJlrCvPM~(kl#uBLgP1( zPl~;*VyJzgQaPSR7Il7U+r+^<&(E%ScILQ)TW<3Et$l5s5{vTnGAQH@qd;iiFQjZM zKV5x`Kj_c3h>uozP5BkKPWd^fZcKe}zFAztzylQAKx**jfTmu)bMbCgt^WS9ygH3D zyLfr68Wv@86MWhXC zIH-U)vOxF;c7S;>gP+^>E{1l9z1(H&aqDtEjB@ATtO>T3I0sM3uk#1Rm5|RzhsT@1 zrjY-XE|!ElnevO@^~TL#xYVxcK3n=LKLss45T;F~M- zwuRTq)AwTo<^DOBQ7<0hxqX?&x5MatH9Ty?$Kzs94y}rQ|0;03%?h>ESNVglvcEZx zraq{X#r)13{yKia1iqoHRaQ^>w=sVtJ ze)aYL>v!or`uneTd7s1IwVd#q__bNn_)6juVT{SIEE`l#`N4lbfAC$lw>`h!2wi*s z{eAtH*OVE)#}JMB5O#PtPSE0wmfDu;hicHgB;N^ZOr3CnkA0dy$nW5rRy#1i`HK#~ z>owO+zCo2i_f(hy=lY!K2h_)OZPqdJ6Z>lPo7a5mGx@T4uimHc*LB0GdvVyfWVm+v zE^dg&31dz+Yopia^qzm?FnI-Khq+fe(Qk+k8TJ`n6E3N3Xuj9G^lXs>&yq$6pP{Wi zUF)E~`K^+N|5GOVhG(zVpn4zIejdMrKd3x_p6(;M800#jkNO#7JS-fWwBFjr-eZqf z7K+5d`_SU#EwrnrH&*E~c3TEllRxe~Uh({!`GY>?H1O^ho$x<4sGX|b_&zRti9g71s!YmN?X?s1SGFGZtz3sDPrdFh zWjAfgCx82R80*ysv3g=~4Y%&3kMCbjwZUY^zG~JOOv5Ge5Y|T5)%WrbzT2(pME%(G zWz*P%4Kn_dL*wWKCR1m+ZHD0+jMMNBy!=?;A%-9IOv|s0FEY|3*Ba-_>jytidB(n# ze^70}v=MQ7l{=P+pf?0}J&`A({IuH{d_M-il+Uz_-&zmloe}RyJg%nOzGa`QwRG|D zg^7!YJ!yE7;thU}Kd3su7;y(fzQ#BmIj6v&j6SINb(GiWi^^w>J!zM}3Bv@V>Ilc| zB;Cx6`z}4d2)^M2_|&`!mI97TZpbh32W5hp!)QO#T3+{(oQ7-i28w@H5dVPk?9;BX z2RocQT#ii3FZ;n;yYJK$Du!P=(Hb-mnv0qiH=<+u2Q-rO5F zH1FtXCMc8mjOfGR*EJZS!9?8jqrH#E{H1&`RNHRutEM$gFSvsZ;U?LCPdXr(3KFc#D{WD{*`Y|U=%!FU!y1G4LHkIS9P zFt^#vog+Sa`hQ;BV1qY{r+|i;#w+p_DIVZE{6Xf7WNic`$Z&Cl6-VG?-gD&cQkxJq zp1-yum3Yr8-<(OxSuYCiGdb8NFaF-7eo6V4u}8ZdIXBPA%W_U;sru!bDxdGIL>y79 z@VEGbe%4USdm0|5D;x)Zvur`j(nWU{{tEL!$-3+!gPO2dat2DHu3POqH;0k-f2S3) zuN|iz&u`0S*wcE-tOb6azrr7k`ya{2YOY+AZGwl1&l5K`0FDsoh|76tjWe;lFM_UJ z?!2ndFQn0TnUQm^1Fj}~ZR2FhHD{e1+E68x^9oEb=XRp)$2yw-7JsmJ%`2`&n7Qzr z8et*%VRRRFR~fjSiQ2GwO04Sl@ul76K8JjErb#|B8_wLN26kXeZ;;p$z60J}=4p}N zOL))F#kqoCo}7vw%0DPd3TqG6u&nLOx`XwHuzw~!u)#x(Jgu{zB%xRDWxMH_?}gM{omKdo^YgGz?cy_2xL%GqFb2q?}wP z#*};0P4|!MOS*`blJrjpQ#f>R0gGtwwrOAFtn3yS&&&dxwz-5?*QGCwO#Zb`TudHO>F{l|GX=C{(*`n=Gew2gl4tlk@rZ{lf2r)Q^_ zA_pS8IkYR+PvOdaDD|a>JE~Y0@djrHIMXN60TITKpR~`n!^iRu$_{dLdv<6)p$EJ! z_6_Je9vGK2M=+NqvgB&6jBC4Ud{;~5_tzPHKDkehuKg(a@1EHi{6C9lG(|UHQ5*41 zySLWGZ?9(IP4w>HPG-*La=UIOz596q}XK9qk@{hWcuFTBa?BHCx9)yG5D6n)fEhv{p7Z=-p!Ry;$6 zwQ8YX;ZeP3sr#9<7sZV|q^)4mdiadQ{MlT{n1 zb+QC+yK;A{AIv{!x;J}o_Wf#Of7xR8uzt&z)t)2SZ>49m(WV<&!F6u?M_}O^(%^7N z&jjA!aBKGCT=R3U!GG{E=sD!OJNZ~)7*zym$~4>&KIxOe9*dnF8`o>V;uMo zyoZd@gEnBWGvPSGqbzfcGRJ8X>Io>vE?A7>_ z^%D8Z^xFZ`oYjHZ)>*QY5$M_zMgcw)iyW#RX;}2S0;*`kN`Lge-O3XbTg)b}FAH1kHhCsf=?PP5b zy{}ra{h$QL?ifA#AJ1K28`~CAzI|a<{5JmJr*=iM>9;RDfNPR@Q9T$O>Q(+9?TW0e z8z-l}ow5$`J&yz5<65|8gsYtf+r%lb3SJAX?~OnBo4lC(Y?=`hfbCGLFYp&L8O)3km;aRXHBf{kesv(_3bqNH4yXKd3yY@ISRLn!W%%@AyqUd~iBV zzKD;QX|d<15ThM95KR3QvlA|~KF-&0&tQcAG=Gpe`~P4$-Wcl#`#4Z_yy0aZRz;dU zg4S|+@{=50vp)NEVpMMij|pNYG5KKLAS>^5|B?@HIq>UG|1;0t{YSs9ZvQ0SG)RY^P%bSqg>x}rb^k`G{I_z1WlC9&5T#Nt^E9q^`Z5nFcR;0)eZAy z5Q;r(t0A$8oWF}Xuq`~ zSN&;a5V_{I_t>6zc15tjlHsql!8WAfXLKN)l;gCM`12F!u3mw+gN=QRe=_lcbbeF( zLCY(D%?Yv%Ny8^lA8jr8AbuoI#Xkd&X}91B5zh;~HQD2ZCrH;)T5@d*{)@Pf*tTui z^UyRiG2+mf<;>X842!tRm5q5X@TDBjosg2z&k1ZM= zp6u7s+id5vPCAbbXe555_)rxWJv@Uew(z9(@Nx@Guxl&d(KuF{!DQwrQlIH#~$dlVFQ0~S@qpFHondMyqn%IDmC>D%~&_=MEQ z$ukmOF zEH#IFD}I>*E|;oo(gr zjI)MUhd%(CqRHoKj13;%q`}S=I}*K7wLNh?zllFMthW5r1>9M+9WYqN7}qWnAC5i^ zu6%8!bGbpWacGv$w{)h}i_AmCL)1PrdPm-0ckLc{dA<#{*f3ZYT4n~LCVnS2R@uSp z=!+JJ0o$HLcNKSC7~kvyahMv`fw(A>n?G9}75AH4iQUVb@gkkLuEJTXtGQG@g0JJf zroaw^4S})M#KnGNU+KklHlqJxZ^wrME(=(c#v8C2KW)98p458n!IZ9?K5N4?5vOa@ zh_6!p<)lzN(001J^P>z`wVl2;)8K^L+qF55z+JV@k9zQn`GbBdtGG%Z%Zs4#EyCuz zjOE}*)zNCU#fgQJ)7F^7*y^v}TIFPNH%&a+jjl8*$%lA$Enx`vcA&nv%~Ka30yFn8 z|Hww_`O5QCW(}|3Ga6@Kz#r6i6E{J7oA>X?-wHdm)rC{LOw%r;`HNm3W92pFFSspN zaYDe#G1Xed_6U-d!zd!+WQ zhnpFG9e+?5TF~h0dj4WscVq(rWGp+C9Cd(3w&8e{o3~UtpY}JIGw=ZbCj>9(-rY!7 zx~Mc(3tM~1=qI{xaio1HPMSNSP45}Ag{ftv?w0ndCL6l8)?Cm}zim2`g*e^CC1#y?D{S9`67(OU@CLp}MEFwWP@Zt9d> z%u1bc%^xWqt;V5Y`!A0<1>o}$Q?LrZv=qoj!j_>~}{vi7T`hl>DS3j4pp>Nv=VT{?~qoegtxrVRRtTP$yJCozx zo?GijDxG8Bf&NgUPuho@`&h9n8M74I?%pA_<9j<&xUPqX5?uh?)>Q-8( z&cxcZ%E!gm@dxoCedohq8c~DWoR(!jeL3&V+ws15!G+@T6xcjMt5|MCzbWB!*e6yf z?Hj%zJ`8Zwmf&h|2NPiDiN(5(rOLUc>`U#iuIBEW%Ivb4T<`11_O_djBWq-3zKlPp zK4Sc}O-u;I_>gn6Z+0!A4w1)~inX=zZLZ z6h%waoq!{P3uYQ{niIL(s+X0nkB0>n`D%WLzQhg1nPXq`Mf^dvC$QP~7;o~#y?EZ2 zi&;b8avrmtHtRyxSNM{2uc>w}VJ#DvR5`r79`W!iTj!NDMKck`RCE}gbN5+TVuhxU zpNDSyin3iN<~n;~yuw3wBPDz@s)((DW8d>%#vfE4SGzJ>Je8YpH0iJwwHIYf)_T1c zo#B)Sf0OH0EWbZIdXrXppRf)0E*F@x2iLe)^@X~dl(Z|;Mc<_qvLav~l}vE+%ny>+ z>|lCH4Wk$MhsVq?d&?9K$1mg$zV@t406zS4NjoS11pP6VF%Vmf#k#P%;tIkO@I@KZ ze7?*e+2eljx;l5U)!vCUxPI7;`6)daC~rgS@NiSJ;CdhPuk#~oz3;^~`Kz@FgaT{- z0hgds=M^ z{F*~ApGxJ)jKyHdyp9izS5MqjJRdJ!4UsWA;2p#YWaax@C=c>_)!{HNpX%dUA*#aw0k^A+$YJ~X5rqtx#b=o zuLV?vF7FiCGFxiLqe}X^w&N5P*9--O81)0)R9q{ck&zt&;NU9vCX+6yv z@+!L>M>YcQd|L{w3Y};^JgSAm2q^Eqi$C~*YrgA{wk6)+2gbZM++fD1$z6S(c%o!s ze|oN2GOC@qv(7zJ=^J_=;{bVPY+D;x(CrNHf%pgbgTKW&lsEL1EapczL#&<9W@4DO zHbLf@q|fO@7re$Wn@r2Mi3@SnOkCj)9--EEoc`_)jz6fh|MvLQ-|2o}Hpah^cfpG? z-O-G1>?Mm2_GZ{D$gAcf4S5>#bWOe#3-8M|9Bf-!gG=&3vjv zQpR97=aqSBz) zh_dA<3F0_nb5Yt1_LOBkNqww+7n4q<)tpN2`}*Ti{fGN{jq```2c?^WZOd>+`6;hV z^%%6W(U{fMnrz7nly}#szQQpyc8X`ZyZ-e4&!45pd9U|=*_@0I;m3QmAJVD5Ci~NC zJ!i%dlV5M0K^anS|K*{zS2xSr%Gk9?d(;~MOuEfp(r2O9U~SBH(y#XPbXUQT^!}3n zU+0JN@bdAa`GXo?y4vdg`Y_`Xw@j=-e6p~YSY5^hGqxsuL?cKRIF5QGO8_N$K=hK9{Xpf^gahs zt1RB&Fq*3mtEI;9(rSHM{6W(m&3ZmX{U>R!hHI^{sZ`1y7qiytyu<{U&et8IV>HI5 zO{^?i@%c)&iIb&RS??3>hx-@k4y2+>ey3c zi_cGaZ!fIl z&FRCtF&d}rk%TwF-AczP`#4wvn)HgFsMqau9=^no*IsyM8teqjZVXa~YG9pdEJ;A3D-yGA;A zYk?J}PHQw$N%IMgEpZm@miUIWoj*FiDE^?h2Ai%o9&Mu7+{qIEENoGkeY1O8p3sSC z3l~c~?K(WKIy$sqoR0KG(|!9knxuBiRkD8>O=h9t4Kft56<>TXM>v?UlRr4Wh(E}D z?A3?HRcTFXT*Vg0{5FUj#g%|ht8lM-%Uu z=`WjP^X#Nk7*a-4VLyL(eieVvtYb;L=7|mK1GD}MM*NIX)9H0ZKHx8k{}IN3umhVK zOQ)575Ki=~RtXjhyQjqn4iVT(Vt#6c-QL;RbNZelG#2Sa-beedrx9(->8V>il6+mZj!q|IeoMofeX$&8k1Tj)4U?f|u zo6J7xKRz=5vlj4$w$0LfKDHnB9qvnmeub^u-S=F3Fm*bK#VOSZA*t8jHLM%uSlrZC zTiTIqq26KE7bJfJ-bmWLHWm#9u#sPqarO}X?9;><%=hmtVYX=3wr=peM*a4rL_C}X z#h)pG(TIOz3kz|G)dyBqabX!?bIt!2?Dw6)a-NDawhMzpPyg`zTK?e2*h^nW zf8CcjE!)g(%yIbY5J$H#ia2@dD|t@lZf+`HO${!4%6}=I9cygjTP`}Je}xuj%|*Nq zyBvNC1qM-%SVK?q+8qhXw?X} zdWGOMg`dKOu{g%SmcF`)wDdQl#J<5^g3d90(<}3JvrcbDIQzf)7s|&{4u$J^`{8@HzedFc*J+-TbwvATBIjrj=#^Ug( zG_0PFEuepU-#x7&)EoR$>2RW`3tnvF8xTD`E|XrRbTQ|oc7^|Z)ip8xj-By!+X-*i zU&SA^y58LF&EeWB`TVEk$}#>`&K%8k<_fURR_SohA1?RVEH`EjtP&4Ax>@>ZTg2(h zRK%}ChxRUAPM!yX>{OZ)cl=;f+!M=t+sI@G=!9mk{*`m_^L#RZ1-)O#6-%9Ncr_5luF9r{{;vtppO}5rGd0A!l)056@ zV0q3KHka(+aLw*7H}lB#*YO8^1*JqBXRs$@OQT+}Ya0D|`Bv)4Q(wleVX59odon+q za6fjTdEGh*^n=gE3;L}*POHaSw_CZCZcZ$?9^``SLMpHhfDyjWPtU)NKdANA+vfJk zCWrS%SMdf}gP@y@rl{=GYlDN_&vu|u8%G<2^;{4A!R>gr0T(PDhr8x!L<`Qoq(V4Z6)}z>^ ziwXQ8>~G}{!c9}!)xh+aKdcf4vmx;&{T^FJ{6~DVM=F%x7johKJ{LX= z;1CuFJ{V}l4*P9tJ4gj~g(tmvJiGK{Nv!*`Q&#T(k`feiy5}d%} z451|&J?&@UfvfmAKchjMyuOh^Dc>CT z=Qx(n4X2j>(R^G^`y(+1ucf27gVIPXtn$afEPI4cNZlmAi$D0T12eZ!7f@6!liWAw z(ZsUjj)zNup`Ycp6l#s9?VDqTb~`7yAGG4zK`6Mve_cpZ@UhHq&-2?Zr1m_8kxW z;fE{cei_F8Er)Cg*u9b-20&Jx?ct92j|=Xbar)nq5!TF%O-Di3Oc5e28 z|CTDz*h;}mpD-!=UV2q~_^zqsh->YYzvoaBW~}k-45l4`C$rYpeYJ11G}Q2!l?_`L z-kiW1oOT4pW9-|ZN+}l@M02IV#VXnNSZeYlZF^pWxItS-t$y`sZ>L?nkkEXfi zI9mHU{-EY-GiNIgCLadNX7d#0hU^2_+2CuM{V#o)wiDP$*V5-qW23^M(f8jRw13<- z@v*>iTt9YRbS~YL?ApX$1BcT2#-$7wkLMo8$m6}4SaSUi+Js>zl_qvgxOjh@vX{mw zK-`gQyS$BCUG241s47aZZ%-@s7yGW4_Sb8SpIws|o}0aosTa!KpY&H-@GqzP#O!ff z!RNBuJ#2O0WXeMv?p>UCErz#Nc(xSZsE3_74Q41T%IJUz3ly(Se57B_FXIoAKdl3$ z<;6Ztbz;_b-6Do9;}a6@Pp;Mb%1vXF0|!yMuvLrCs64db7^T26Q{vshc>-*6?b-=A z2U}>G_)x@=(<$!Y@15c_NYk)2CdLu*BMmpQ42Q~1z}LeTc%pv$N#Y_!PLFc35t{kc zCcHz9|9zNx(wG_d3Ddy`mc!Vz$k&iAhIyOEFf(pOcr);pddpf8p zuLc^aq~C@Ml~13Ot&1ZLs#_OME1VhoUFz{{r#x<*@$r9S&cA&W2K`n1LDH`7WAu(S zZkf80&7F9Ie%TVm_k(Ln+n2uU%2hoO-^$-UKCB0WSga9_;>MTS6K<`pSdWei*5a<< z-6?;HPx$$S@8;@!-TONJpnQ2~SF-b}jTuf}tW->1!8|h5h3ceZbd3!sxSoe68&}NJ zLD`9|?*8*`nYXJ!CsG|QuZM*+QcKroIz+54uvqm8^^eb|;n}J$>HH%8AnR<}l==>t zkgpEyiayU+kGAWn?4-x^HF(x8oL_J#ejA*&T_E=3Be#DXuua1o0xDS-ikrkqu~)i- zYO?2~TBTdEoDnv7e&pc_{`$Nm%l^x<{e}EN+LW4-`iD8Z^&Wl~%mwMD;rO~^IJLV3 z*c6(a==QaC)mo_JU(}T+Hn#0&QJY-w3_5sV%ImkyV$; zZ|GIai+CHp$QpaMIBSiWQiRK2;j#zW!_!sitp^=zFOm)g>2&TrKoXAzEG`H@ak^!RapUHn1%w&sbcFe#tK*t@Kkwv0u>X=%UZ z>UHVHM$uNw!~buU{2_SWH}iK?tgu60@I9`G^EZ69CyH@5duGDevEL=R@64rYkaSD5WO0*{UJnGv6OVXpPsSMdk67BR6H40k9rpY>P=)N^i%_{NO4=Va(n zKE?{eXg#=yU0I!!tKISDwoc@?&-Q(SqE*OkFTmBnFWoca!hLmj=8MzgSm>X7kM3l& zF=wT>?wo5Yv=Nr@T^H?&1;c7P_$vM&>k-x=vGj~G{1W2Y_Oq%vzMn{g=Kxg!{{jLmxS?jdtZ zZZDhr=+Qg(;CaBabJxrt6%5tzI_*8!@`U=V1a^z!$*d9Nb7OeBo*yZ5E_0MwziAD} z`BnTuOqZnJ9Q2Q1wizOJ@M<0J9X$>CdK`U^q$u;l$}9`mRNpsPGzQS$OD(dORv~$T zABgCtFul@kb%rB(4`14|x{|5E*Dl>#>)a!CFFNf^P5i+}J5WZ~x$=el!G!i4 z)@DdnOn!n^m$)fiT3T=kzuf9}CsvYuUT-k9YT5o{I-AWl8mzPX&53rY`A5Es0ewbo zbU00p4~xeDv^SCwE{L8eQUjv1!5Q3K&>20Z3(Hex=(~Rve~>+_)``?LeWcr@ZiEZ! z+Qduo;+AxyV2I>Z@jtYN0dtp6?~Q(b&m^Ar_8Cwra6hN+jaVNU)#+yJB$C_J?ihqC z7}^X{k@emRG8|i*LM*)5*JA5IDs20mFN{Cv`2kqns#YiL6O{+;LFC^jJAod-IA6G@ z#X7Q4-X7}X>-v_7*iOgT*SBbLGWW51X-tB{=(KrCOfS7%kxD6UhWX)PxLcmg36HS9 zD{gvz-@Kdm&AyI5sJ2AfRo>!rnl%gmlq)ZG3Hj0!)d%|$t`14Xp`~jZ9Orz)Wd7n4 z-Jec-@EFH@1=d$h*8ZwLGcW0LI^WL&*<~_@kmOhK2l-~&j)~<&ddZXaB1*Q>z<9!M zYb?`YI0O-^T6LZY+g(?Ld2onx$8?st!ykkc)vQDYmuCN(7+w$igS#g_-)>Nf>O8<9 zJPcOpT_G3Q1ybStV3qnZ{-CJ~QYm|yd|+kk*S^rqjjF5n>G4!r=bkuTiY-ViPRc)n zwVzYE#o2b{vjh#eD>yb&WrUx;Ht%&i<^}T)5u}+(i}0^k zdd%~``tS7_%2R{0Io{V^dlTpTJuX+HY=w{DgHvx$D_b6izTg*Rlevqx7>$M@jP2=nL`^XdESiVH>kyq}x7md|Pa)f(PB*JYQF z8Zw$0BXsAZ-1Owt);}I~?@te?~KOIA8iU-B0;Im z-ojueTaBkD#tua{Tuz1FRKH<=SBj57Nl;twiu<~Kf->&AR1 z{e?$3guF#K1o)4S`j{S{Zga(JOg8Etcp~@eZB;DG#PDzL7sjnHf7HNiv72a~eN& zZgpwBrKH`7q>AV$rR&FwyRHwf$Hpo-sD>Ks9~*D(pdSBO{-CLR^=)Ay?8}o2j6L(+ zB6lHP4!o9h0p1jLUSbNSrN4=--HqMRUdy|y6ZqRF97osx6n_xzfy%vox+cz#Q_4+? zS2QkrF^td*71q~=$0eLZDlEVw>L(r^dGA$(&v{|tW+UBlchB^}W;KF{Kv zfvGuT@(jC-!x!%mN z(Th)nHYjZd>=n&BH!n`6@YWjkQ}GGKUBebCohJbGH@?)^#0x4oCn=jJ?gONCSSRXu596;jup254A((aNy8YN+fX?Wn$(_15T6t%KVjKIqI(=1ls!XDbhG0e@8OTKp`3W7B9! zzrq{Wd8av~0V!Lx=1#-Q25YYO9+W3|nk|m0+6v_<-M$;PXn*D0oVmoWL#wh-c%&oE zS}B#OkA}}fGKWg&IO3#;SGhWY%gy0@{+Im0_Ie>r#%n5(KPA)d{A#DGrR;oDcL>L5 za8q!hbe*x2!(ikl8=rZ!rec_@_l>?qn~-gnc0XpUIiWp^KC5Djrf${l=@?zqh1u@0 z6^1{otxqO`GG#+U*Qk7!m-J8REGn10w3vM`)192o}ket z3}`?sy-+?FT+e4EFts*maZ9yQmRRJ$Upl&}Kl(S$GSsEkNY;K)dXR3lqdN83^vagL z=JwOa#LibflmMC=X!M~i)T#6__~f4*v?}dD?o4c~)vcOm5%1wD-kMKqkKaFKPvWI; zZ(5zl>kDk(lV>Iam&C+3Bfi^TrKqc0tA-Ba>qXpfzg zo#>REauNxC4}HqOoZp^v}p3#JH8^hOR}FV1-BO1S#LFO_p^iLk#@jX`J`SF#1?$Q55_aZ zz9G;lOpSPJf5IQ6{ZI~(n$i!R2oH8IKIg)*Cj-@Ynsi%T=776@2hV5JpN>O|dJH{g zH@Cc5=!(1!)5qn<5cLsPuzhQxFAXM0`KR~yez-6!9zwp0F!Tl(|GF`Wi90vhF3OG% zTOGg87&cg;+gHjKI_&r9vDv?1 zJqSNK1L0qZ0$#KLmN_=@{C*ia_;Q5$_%gKY}${2%y(>&4t|j8m=k!aqVU6Yb2w zbU3Zu*7Y7^dp$G1ZntpLs0WQ*_};PxJT=R#`{XOccUATzDg3tM-{udh-4gE;%!@uaXg!{V z{&GI`biVaPPRx-Iym57<{An5nSL2XUoA+ zRxw0LKiDlgSngVVp^9Gy_Yzy9*Sx6p>|P83$VH#o9;$M6mmRd2R1dYk>c%IN=|+JpZ^{-88i5jAw$>&~;&>7i%(Kul{q ztIn3}3sS9<6XyqnPteTGbP|c}vbnT>n%XzY?6dnrX?ZyK?p>0%aB&Ys&@L07(#p){ z@d|wT+u7;R4$&}n_eC>zb>zE{2tC^U78;kyM>|vhyZk}LhCMXf%c&AqBurbk>YL7b zBl@Z{kG6(^>{JU|u#eaL(TyrI>@}iRu-gpu&Z``H3$4^{TI-%$saQYQn#M|%#jQ09 z_L|vj;d15kEOLhN;I^8`3?AoPU}P=h!-n1P-E;d@h%@u|`GaQdk)!Rza)E4i9lsLo z^f=NO#^KEwT`I!(z-cm6-AEV8)J;ZntPX4y*ei4}zhK)y>vTl&lW>b}_w;$>q}Q8E zYSG*+?=|d>zIDxs+;6kae1AEw3qia!{vLnuy4tt+efbFq<5NP^PSIzRudrE9$_@nY z@xMEUwQ#Oe!6X79#j_%d7j?fA73;8U#Lv^&;kb{Z(Ys6b2mR>o@A3!l_T6R;i;d`$ zE%0rJd)sUON*45)*ZY(Eqye5j?Cs!###WBJIT*<8(Ow_d_04>BPqw|XQq0f4&mV+t z*-&0A#SeTPzp^jBZ~lcx*`^249sGW91J%U~0}?4e-e7p~bV2|b+&K(%iQ8?84K0mRgex4f-=d!;h zce@p_QNNBq_}lXTH4gI^GDaVxi<`bdVu8IlJ}|-o?P?Ex&e?h1kBQa9j(2;kwOP*i z;3WJ_{vbbvp6qpu(|}2-#vPsi!vPId+&>k#mxo_nlMS#w#w~Rc>L>vwm>!)O_fP2p zy5K*MKls1)`QIx8d>YLP4g1B@?(TG&IaI4QZ{GU7PyK}VnD^!5$j||Pb2Rzb;L~Mr zHg8Sv6DIoilBBgJYX-0=d%Absrr8ZpNA!*tY+6P#@qvP&8amOajQ=EK|5^4pZ5@DJHY zHP&eGH?P5SVL!zvWHFXn8?D1lS^MMpN3R)j0=s^CyM-?-Ed;}25y8u4`+Tv=njPHDLspZ9panC#4ED{KewK-{_X z```>3ZeR=>3f#f5V!~m^%3*WBEawQ*@nff#Ken)_Z{QDlydpq-!;>K|+M}~4@4`Je z1s|K+E@0xK2}2R*P8z4;Un*W&T5%Nn4HE}a7(;qQtg97yksVK*1=Yuk8})nKLBo@( zsgjs2D9U&bFaYsOc1K$khN$@&*D*|@-M95-juBVHxt z?Y3w?V0CUgj;3htcwhBtUtr5jfV3g7^VpKSWBlLqzh=I61Ah` zMtjlH#fePLt3{r#ec=G}<+QNSbOb)v~eoI#IM`|cy}#~;8SBp+c;4h_7% z>}Ea#&+wOkk4a0KHj_^{EBq0_`_ZLMlt)%@F`qLw?MXP;NBh}7HY=G{Io8-M9+UI3 zHYQK*shLllmt~_Z`djXxo_{@mP&PyM3%()yMPEqzh_om8L8kuG9)FNA1s&nTVsy^$ zG4IHx+g5Bk;*hoXRfBtgDc$UFcoOR#`7#~UujbM3;t#5in|>Zd-woTm`hpEMON>+c z23+%=Vv{*5yV@*0&dYkZcee-4s~Z3ZT?+%VpP2$0b&8*;IIp)Zu?0(*>)Vgj+T#w2 zL-@n_gIZ@06DnH_FK;b$V3dCRI~Z4QNtftisR(^McYgG-J73m!XWzB&>2Wt2V?Q34 zyY>Qng?bSV_-w<0?z2ZP3{9M}^a6d$Z{iQqmbBhT_Oq2+Dxbn{K{!tD)cs?Vvr2f#Uo4gC2%6 zo5j{f-xbV_xve{^I<0P`wo>Up(BjOD6wDx z1Nke#@gyE9@h!iLKd4~}Y;fmc|26tI8rks{{vPe&Wgf^3j)5zf)YSh#bI>M;8Ngg&&uxEDHrUU9qUzAYvQo2;Iuuzi$BPo$A_&$df#A!b9_iHKj9B%iv;HAmM*CbeBM1cwfq1w;HUVmJR@Vc zm5hO4k?xsTLHu|ULw^1+pG@&rAckuzQW}{3h6XFv?76{kHjEte#H2;XSZh_A`8?gc zI=gzJH}!8Csp+iN8%*fM#CPq02QJV9h3AYmD)^vqR5-P1f-w0A`CGZCD^c;f|CB$N z+7kyhQFFwf>~tnh>Rh_DBju~zsohg+)^~~Ke%W44Zt+aIFuVuh)8S9kR?NWhwAI1J z%k0gNtGPoyao}$(P<*NUGTWbq%7bdIg+Ekfbj|ger(Q8%j3(?wI%1J$^lyk$QnXV3 z!yz*aMf1hOvltv%hsE$Rtz}QSgYT3o9G{^aaWn&;4=b#7fUwJFk4yP$H&L|g$L<-r7ij5vfS5!CpH23Td3U#>jd94z6%n~2ai=H&_wV} zw@hqjo+;g3Br|i@21ipq4F2JEfDAKFc;}PTt$E$|r^5mq z7UC063x4eh^!uEq9Jzcy|Ajv|4xHP3oA^nYyU1@GU=SJjI^5;nwK|RsNhj%1AMnyg z+yadud>?yoohHrZAJ^s)u54HPLfLGoK>9*<2>MXNg=ArHPUu6#8GOQjgzLpKFCN|B}{50fi?2R*N? zs826FyO_#mBOK&a=BDi^pDKTfP1)6{*G=6RTa+ITCpeDDhT~=y=oSd>ATPK~keBml z9&aD-P1}j(qUdf$PK9mgJeURkj6Zk?gfg|zD(?X+9n~$z-o$D{lhHh9mdzsoQ;5+puKWbMU-MK%f*Bh}1sMcRRm5*@5LXy>FdU`{qx>A5_;-W^{hSNq@n7P5eP&Q4`*o_hsRC$!=}N zN6oh!W}ebq#i_C6AK(w_$4y%F@138I8@kZ=Eo^WIXVCM(fp14*IgB0tC*cn&J)i1< zIfu21#%&JeOLHCLAEvl9V>Rms*0;KqE#~w|Z){|Ilt21=tk?DX+~{53#2-|;m3|%X zJeVi^qb{tjFizk!lI_(4aVxmz+n}W-Jm-D>Q2wCTY)tzxoHW_xUPo7$fmsVP_E5C% zIg>};ulJeLLKf)hR>9MlZ}|*)Rr=Mgyt;YUgZaFE?^h@9(R`-*Qa$|*{-E&g*FpNE zpYe;|mT4p6+{qqM6ep1N7+hM}wM~N9Pm*qIqRg)zZp&ONT+QP@C_le?`GNyag&kdEU(x}fU?dDSdlpm{${T&XuS6=TjG=-_Y z&00`vF!D%UJ=4p(euF%UTcQGHjmG!A)BAgQ@$Sh7+Kh#)!6^&b?erV(eg;0H!|0JH zA11l10ck56^NRP+^fA)CX?pM1UG-n@1EiOU2v6-fvG;zpQ zJL~`}G#_(p9NI1EXFW{ZGO(V{IL?pe4|-!M<*a@x9;)huJOCl5`qSnh8X9a9Jr|v_ z5ZD2BjT3s7WAS3JS@fk53D!0f&H=8I#~vxY$~Mpao^GV!5Wex7AH^Rez3ShdA20pk zy|;?`TIU(D7UGKGMY`bSfXR|}xKhGxz((venq}fF!N0Sw)JN<9{wAzp;PKbu*$7wu2nlmEyYq+Si) zRfOvkJ1t|kL8N3sR5`&93mg8R)5dNd?(n-^@dn|-=7bFoE~ARZN~^1J|8n!Q$QZIwNi0^xLa_@!f*l{>QDSfKfi0* zAD>k^|BOGVHd=2jVzpIvU)*8Y#0H{yOlQ*Y2gy^KHjKSb{K0$&Jv7(!Uyauv2ZL#s z4`~g-xQ`8&7<~Eiv$dl<(>3vyNuMybl!;eqrz?ZXvAMq2*W1Q!RSK0NrDJe=TFru{ ztJva)l^bA#Y6Jg0e=xn6zxjj5N8X*y%8AM`IA71V4}1=kkMi&G2Q}AZwdP>{WX@Ae zBJz!$H%uLf|62#&^m9*GZMunZERe}xCOl-FweXt?G38IATRT-5OqQKp-8mc*t>-0K zPn?tSFNi-_m@0-_Ztz&ouCYDsgL1tUt0Vl1e#IX&elKJqY4)OUa2}*tZ3KR>@cwue zeOS5afyKbYkHoQ>PG*9iJOc`n2@t;re2U)}a zr}%@<_G0N|BJ-ou2qt&Q!R{V=khaohzNJ-31L}2XZDVvCe4$dX$b3d!IJb(Y?Mh74 zmHqOwNO$adYL|m+cXczBoD>UcA`@|p2462=XHY~GdG<%EK zqIQIDMw@Q!s0Vnbt5arlv6v&~6~%b1hO&?SGJe`F^XEi1l^5V<*# zjqNcorinr6V(-rs@KcgWcEK1mz<=hsb2<&MA9#&_lRwxz_hf(Zfmgs02pkm8EITL? zW2@e}ul(^3{vdsvv_>i;AAJapzbj5^J9ApHblL}ZgoX31Z=*B!62-%2w@=*gE4k-_ zxvV&;lwaZaXrm+gOb6VIUv`rXIM0R;tBjdT{$~8a`*_m|m%8hOe~5l&)9oy#gK6!G z9};_>eD;Gs$grz*EPf*B#xq}Q4sN-zbJ7mwhqL%->Q=_r5S-I?x;1Wvw~0Bir|%tN z4&rxpUvc7t@?1-A_vkDl<67L;i}WttNNd_YIs3oOAAClLYbahQSl+tOaMpqD60UXY zR3a8cI{(2RBoFMD(5<(XKlB9T59V(&Z}i*esvFrXQ|OtZm7lIHW+Qt#gC8%9mhtMD zmR2qC6Qz6C9>*uK+O9UZhHXq-n`t??u8!`1n?EQXr1X0Yf6(CZxB0AHYmKw6YmX}* z{6Vv)^ZEPJSi$IUw)^yPe0QAFN!yCvFJ#?eFjGM$Wvzdip8{-D7I?{mim{OzoV`y|s~KRKFRW=s5Ce&G+Y z|FC?^fQ%Z2LvSKq9hwHLYj>2j=D~TfcL{Z-7pJ&iY#*uqWqEAg!{^l^cW+m!*bPfJ z8-Aw^Jo4=1AL&fvn$AQtCp*r)_ILS%H#?KvJ?g;ww|stZje@E8rm4k!~E)YU5sni#OiWadu|{+A?dv-ZWA(QFfzzE?VpC0yke{Lt**QOJi9WVQJ zAs5{Eujq(|irYZy=ZQZ^(%B!X(tOPdK~o{Y-3-5(Ay!A{c`*3bGhS+ri?ModIPLg@ zn@*1iaQ)=v@A3x~%gxvbKI{b8b>6nX_oEW`UmSZy8vK0725;~$jc*~m5J3iwdZs+`XbhzK1Czi+I1U#^O z*{@2cz$kMG%+g=NAEX_8;1uunMY?}w-}$qAyk39DPW-3`uT7DG{qtes-R0A((B>d* z)Jve2JD`Dj99&ah!XJcV`;iZ&=fACsPkF?xWMJyyjd8y5DdPvQX9l19d*Q=*)pva4 zC3Py0X_|>Gw)zOswllnOO zCTVbF=~sV~KPVgzVbfpn2S3>ke>ctl;ikUhSKL7_E9O6#GrkS@XSk=V(<$J8)Ty5E zJGrD2om;EX{Gt58|B&AQ?KYT!-F?V@%;EV;=*sLfjjxKH{rm^EU)L?3U-@8NNPad< zAeuvT{jWKM;cV`j_dKmLrCoVppK1JT{w*0%K89XCd?xm|mvA$m|C{Q=7ksvxSJuy3 zW@@jY04?<7v@S^ANpt?nxFM3 z9wD}D-mfv0`69hP5SztG-&(_aE8KJ{rR*6)N^}@mwMUa{b}%{Szl}d=;^SzqR8?D6 z+XmBRf9T=3%m**r8C)Tn>*fZRP<<1hUGEOK#0qR7P0TWP={Tuf-gU>|Y-O;5a?^Ft z2*C&Y+xUZ8JDUBC@DCmGt2A{G40MwT_CXn9-TOE))7%t7K{VXyP-Lk3TPC+Nn+ zI~sW0upRgmKG}|JtHLb4i9hJ2S^l~)PoLIc;vw>2HA|c4Wf_kVpG)y_#M#3BTSt$~ zAHf!{7=iEu+t?qil5D`N6@`-sYrw`uowUirXHL}baR|RG{-AJm`LB6#7))QKKMW?< zmb1E*u~jQw)B&6`;j;!yA)aDN`ikYI)9y3ww!mzNQI;;3h&Pp&U%A`5!M|w#5_|9i za~78S%lT#eLD_fB_()sAZYG?+ehLyQyG)x<8%opW=al^}PCl^zqQBX4XIuKn?%ui) z0tj2G1wJC}(K7V~AJSlYb=f7+vwh>uzxVis{6Uis*?0`*5(&biAV!=8ZxbvKzMAx2 z4L{bz*#j3S$G7*Io5??htuesDIJni;t|>v6|c{8rkPGzeYrdGFTB&(h%~wZhK0|Dao|~oT_r)KS&zkxMz9q~Z z)9Mx+A6(Op(=YO99}9P-?XTwW>B{Nku9?B+iVw-YgAoq=eBC0R^Z44@r)KCaVK&?N zg=Ks55_9Qy@dsr;HDfI{P_$m}tCQEC;nq6!%)P}}YSY$Jw=SI3#W*^*;0{)Ik3O25 zYw)uQT+|snFR-bn1icEghqEs}QfoLYiR$;oA2fDc)~C^2eRK_L>@;x(-Fitn%h6oZ z_i*AVIL<^%Y?i>)qWfhZ9p5Z*NFzBoIWy%$`2pVpdlzr5LR(vR!E?btzllGnL6v^D{zgTXmv)zXD2|c+&k?Ld=%~yc*_bt z6a5Pg+q$rGGX?PV?}PJ+Jq>uh>b& zOY`ceUJYJ@teHyV$*79z8`x}xIetHdLpy*Z1z&x}dSyMjET6G>AUkFt52?Kxn~A#K zcf=o5eef5|b`!B}u{4W1%y;Z7>~Y*1C56&iI4I#w0&q`IP!1(wV3oAKQ7%8OM6lATiYa z<>T_&9v^+%L>(SqFpRl%2i~T=A;{Ascxjaa`J!WG1H)~mFx+GVPB1sL{Mo|R_hb^{DJNV1(%Fvxb*_P>9dT^guypSG;=$gLoPVY-d)$iKm*;%&Q}V}>i2a-{30}WnfcMZKJO0A?%ltv|K}Wq1Ce1Ylg1Rgb^J(;?=P#5F_{wOQ^yX}l7bAPM1tDdj>QiAw` zi9Ol@mq9D`XZ*o$jXy|cE@?F7KVwoK*Jwa?tZu*3+fMtN+kqIO=lwN%0UtaUR`H*S zKS-NO8f@^5Z7L7%Yr~7pt(K4QA=}*yXZu`WH;5%p`&MQ@Nc}wgLF!^o;6U{T9UpkD z_f-Az{&cVS6`k*`^A;aV_GQ>18Tat{h(^F7jjfuY>>rOmcwXJxAF(W{i_iEudd?gz z_?~2i7??%<+zPDdI)4S(>BjlMB!o_j`KiX2S-`Sk4>Yx%?fg4Y-)EXIW( z{zce`H79ZCv+uLZ5d07D2TeMZK5r9mo__xKbdzg<0>(G|<4vBmPp-nDdh=$CZwdL) z_--aBSrUg`JBUis+aSH!0c zZ-jNGnLkx0ilwYHoArU#2sB6GBGk|4dwNgTtbe@sn1pm`nlw;TCSJ-u(x9jBHvWF} z-lF^ZE-fiOA9`-qDAuM*0~hy7Wi7srd=&KCNwD+k9Q(HX(h_=~*JSh><*WQDogb&} ze|~PR)wj5BKBKfq+v1&9?wc}Ew!D08wB9lNzSrk?iw>_WyzBRWuTP49O8IqpzkY)} z=~TI!?*u<1onTQLJ?Dr}e%|lle~LZD^RLruzjvy?n?A3#k5^tF@1uR1J($Xubel3X zX;7X_Stze&Owmu8<8wW{$CUSL-XndO-(sz3vBx##sqa_XzyQ&yC5EMbHz^yp8MDl5 z@)h0io_BhGFE8G`SJ}UH=Kn|jpqEzFi^^K<#yehZ&)TR>zi+A?6lqgtJXOKO-1I2x z>yn@i<7ZvrEKIHzyy)1{ZN{;xmcQmO9n3ZwsdZYZKQCj@b9{2Q@vb!IFZ-M9FC~q9+NAU+=W6(Pz zue!0i)nJT0_q2MjjDYVTB&MAjNi?1b$4%?xN6;JOT4u)`d-9*6cz(#?AZ=Eq?f$4lBB)r z82m51gad;e4_r`Kka@50+CMnIh(D-4YsONIoyrH#i^1+5eKO%>q?7d6>Ad5}e_yfl z{5|0#=f^mEYW8VUF)+k22JUo__9Koe?P&)tsQl!~&v)?$$%f{dtnppb*y-Ed=K!6G zsTQvopZ&J9P~mwLs*VQn9(RkOc#eY1|Vtu9&&r;`&% zlg4!#a|4{nozouGz;M9Y;Y7L}v>_wdNC#_Tuz}yg&-_0AAbTMAt-h&`_^L6|uX&>W zXxY)|He2hQS8HMli@%)iOj2Pu&KMLU{cdFI93KPgxh_qKL)oFvlWyr;X3zz|z5-SY zAF~Nw#eDOGqxHYVAKd;${-EpuU}vFrcop;F7E9APT)jR{fwaFmo?OdqcwRZU!llXd zTA$T!Y1~feBNfK4HRaxtjxe0z4hU}q{-8h7JIB`jN$=FE9CzQzA5qYB#ViW@cbfE#^V`!k+l1d)6T5xzmo+Z_X3VOT@_-f4_}CXtc1CzCgB^r_flR zM16Q8`DU}yymaVJ8s+L`HaiYkx1?sXYquJ*C`1jN5xFv>t?h9{%8a&&!^jkat#lGP{99rr&mJ*F7?S zoG;6Id!4a@^}2N!cHt1V{lj(7@0+ar-2P4839ffD-!9OK{xtkS zidXrlm%(H?e$jvAS|DM1#CUbTOmFeF+R%}-p9a0uWpFK@3$4`8#vj}!3&FPz4hN2@$-oE+b{TdBp`;Zd{|j>T)G;I$iGC5M%3c~p&6 z`sZHy+xUZ;(>~JAwWlLPKD4gTi+Wv+D;SmCv>41TN0(H0w+MCcSBe{*PWW8J2g2?p z>?U6%u36e}NYFI z07shQV@)tPW`l(XY0DJF>x*(B_025>i_y1|;=g?mUt< zJ{dEQ+h(|(%4Z**y5dH-yiK z(egr*t62|F=U}fp;)jaE>4!Unz0`0vmjFFDLxLwW3s$9rTz-$ z=eWd41t0x3{vg@|8x5}N<56Ftm+f60f86j=6_-MFbRoaGm1a zjx-wKV(GF9Uhj5*Shk95Hvzu|k7|oQ2ruE;8DsZvDPKItPXIpN@15;^9bAq$e~CUM z3_jP8mZyg=@?H5N@IG?^dcRwj*kQwH+qbM?OIz8!WjwW{Pn&t0dZ&LAvx70$j&FCY zGthb^D6m@}tDTpF#ltjaF*c?Plj)XLhmHXlSu=b{Uy_d&a=l@=kK~~vEN~$%BsdS+ zoPjl(sUR5N!yoj@^LvMj%zrOoe0{H;;9k`PaHP)+yQq(zu}wsgNkjzT9);n&H9cpN!pL-E6^v< z1%y;OH zD$bs`!uQdv7LHbjNq1SzTlVB8{$Swy_=CdfqCVpGp%v^0ivuHcSWlTXXS}(smrnKK zzhUHoDKw8Yt(IiKXgbuW0zEb zIe%B6KY;TtAR9y&mlBJI9cYrz)?@W-pea}Rw)le^Qf7R$jgK-uw@F{LHw}%dt?npl zr90(oW?V~kqPu9;p4ZUmCfobrsy5En&a2@hkiD?3eB3g_9w#DNZFvFtttWZulw?TYClX zt8m^n*Re=1TNnmX;mz(C-|kbfb-sJwNNe=F;t!fVQ}ea2Qhv;V54+iG=|1{Tp4NWh zFp705H~+SoKEQRpqHPx!p5_AQ%opV~{K0&6yKJ}o!*P2T9d`2F#h>#BzbO9TyT7p} zv8V(5G>q@D*;5(+`5-ZIl)tWT7SA)^(G}K8dt!}-Wzgw}z$Q}8;+Y*Z@0PR~=;vDF z@R2xcH-i^y%+vXP{tJKbi{cNy+7)|V^v&tJMpMh?%*EqI5VtO@JAtEkIeHqjpqk_>vFghQps~*8$JcD(c^xb{4@UGx5Xbc z?IM^gk7E^AP|f;cEC_!v{Il=}tyfH_ z>HPn(_aEAh8#~uFdM%`Kq;i%hDrYK3ru)B&|3Oi!-P_08{eIhRTRfvVnk|V-p+FQW zU}6IJa^7|z98QU`WM7q*YuJc;=;z$hA(P$3v$<=$SiO<){4&WJA5(u&^{H}-3Vd1B zr)anA63K_b+;3;#&%>{!CMe+AU|A%$TF9TFPtq5uzw|l$!I*K$K&BNwEiwcf@WK0w zb;-#$$8BU15!C4q`HPvhUd1~u$Nl)?r^g?|9~3(;OPw*fzv546r@VdQ>e+`S{yZ*) zb=Gtlvn}?pGTzFm28+JLVDT2^B9rB)&RG0!@duSJGA8@?kQ*nQC=}Db@S65!WNnrp z8+MvU+AMX!#22RcW;_aaN6vqjKPa_p<<{!lZ;iZ;65He(?Jc?OZd{MS%X#yTL|^dL z7~h1eBd5;!Z7dhQpt3dIC(pl584v#%{vbbG|7w@ST<3kmJ)sl$cH+;YP11JB@kb6F zPF~mfjL1dKJei-qP9-zC`Fbsn@;Y&BQx68t$|Kba!U-4)8iQk`pbp4O6NopanGx;0m|H>ca z_Q@?&G76USCF{3#$@j|}!r#&95A-SIs7nFJa4p7tV4e}4Uy^(BwZ3_O@B8E5e&_xA z>;7R^Z~grC{sX@yr>KDV4!#$?$nXCNfADK8;a%U3H~&t?CURVIS-wNzBeLhB*5HG^ zlRKCGq>kV3@f25*{hz|P-unK%9KXGO_p_hG9}HV0`Uv-*a<4h)aDtgA4kz+(Eupz4 z>6iS+9y!9XOlvb%Q6o_L`|tH3_x-mv|8~#i`p>LC_?`K1|Ap(IG)0m#A!IFh1*p_p=c-FtTgYx*d@&_%|55MeO zbnw>0yLO+tnF;!+Y`8SdY9+guUWGMD5$wjCfY;P`6zm2b5%_}2#V5WaIq~UzkK-sV znBX_$|C7J@CU_Nf=M;}>EVyD>;U0r#{ssO)r4j##`*@TdH1x0!%e*S%B7K%K++%P_ zj&PijU{GEt8PsL^0{lU-vsisvKke72)WhqhebXqD6Hu}x&7k7@O5F?-(FaqbiTUAfnSRT`Y#9Hr>U$pnYZ zCKspp<%K6GI{7-O-$xxgV&J(h=ikg9q^qD1@J|^t4~$KrO(wcG?d*EwYxQpUfTX5i z4*eT&HKh&^Wg*SZoIaDof6D5Y+@ezJNc13hiS#ua9LyB1n&7p6a{eU#V7R^(PLT}Q z$^@v%c9=LtyGHFnsZnNz^&s(SnTk_EyJoL@|5}5m!@U+<0j{CsCZrY{eJISw8Rj*HdHcY~!1~Bz8QNr3<<=Fws64JC=h`2^T)k#@3{t*lTj&8j zk@pK?C;CATHn^eS)Bg;AP^}4MPF1oL^jf{WqA%0W$q(vLd(f;_!J**Z3I5*&ugx`g zxnwK|auw>qO@Sijty%eb%&*SChsZETe`ER?`Bl9Wxbr{AAJhuucan9ErVSSrxR~V5 zRXJO`V{BONDfr-;dS8AOhJ-(DZ4d0BG=JFYl7FeS%EcO~@}<(gW;1qo_Bc7K?Y*$N zfo(a05B}Nd?W&E}*3T^3qs}}tyZOWT5YF3_yoETJRNb@xhx&uz9EVQQ{aY4XoUvy2 zBIhpmRB{2U+OF%a)aq={+V*t|XElh`LcB@phHWO!V9{Q!x-Ga9K4XXMr=%8iS&i{B z&i}XbXYvQtzDMOAp(fnmuJSeeW5p+Rie}w21y?f$*WM}KYOK=a>eHX@b^F*2d(`!U zm(#)@)FR(wZRYRe)0dxaICib=n6-b5KM3ym&0*<&r2pNNE+6QpZcLeP!xN+`UDfeual2PTj*i zRW!-ZxzB@Z?peERs0{>nbq}T>oT{&L7?)g~>g2t`*AuQ7_%)ve@8mx4`8)mfKKnn{ z9}Iozd9aVBTdWd?aKj#&jZ1Il^yUDx_tkB?njIxhBYCVhpSv_zS}Hhhwjz9R?f6yKs-SwyN2X!Sk-0s66McO_|W(h_hb6piV z?$EUvsT9=az#lvW=#+oxP~=xN)jx$lDBUW7bM2C*eBL$WdPz;^HS>lOc;E)`2OpPHOZa3FT?_4l&RV=FMd3C;`jJ2 zcRoEnr~V*vn3Mpdu?XP^FV$7Cl|y_Ba!L4*V&_9g_=E5fWM3&biHvjQ+~@EIHSN61 zS7;~WD{=&TR8V7GNPMrz5m5IPypW4xC;rphQ>0~YUfGurEMO6mxpRl3i+neS?-tIH2GpKo#m=JHo4RGKW2q*xWIp0{qHZnyq{ga>dmtS)H(#PL%2Y&UdzvHg{@89`LAOHKk`(Hk(a2q}t-gjBss=bE7LS&x; z?klkgtid&%_>ot!q91yRx$J2wm&5jB_=B{EgLn#wdkvpTj#{22b*s)kOYkX~^TTF9hxuyVSgo?P#}@vav|H-*4R$`b zV4M?d1kU1z@CV6bsT>WG0}Ct{J0Ok<8G5&5;#DM%qwuv~oW?%%AT1bNGX_ zJEm>LCn9oCW38Z_^6NZ&K<;&u+KyfE$AQJthj!p(e&eurw0-+}tTv|4!sqY@C5N!c zpz@^V)0K9@HBw>=V1lPUxkllaf*YG-xRh`l{j9%R_YXI3SRlt^>2vslYD{|Pg6wPM z(*vAyj&F2Ktbz@f7H)*fckFl3&B)zdFGL{|6F~efIo!yvc3gJG@CV!RRx)w6*S2=f zo7!!gqApuE`Pcb_!`8j9C{`y|#+;S#f&|C!Hm~Koj7gj_FUX@fcJT3r{i@d(#3UD_ zZwOYNlNepFLg6pRn$F->KJ=2{26H%Ny@Ma5+u$_9i?SSQ^sQd8wsE%3j1}5%aUOq- zKZp-m@Xq7SODFTyLhFo=SupP1daxCqBJplAuQ6W``=;g(6@!@HcNnCRu3S6aB5!KlHS(>Wz#oit z=Sj((S2-1Om-3`-IsI4O^G+?J)*maKgn0l|%oKrF@ydBS^CWk(#95H5nb?s$`9;S! z7hVn=^I__m*ypo7ckqJGBKJHIyYJE&;rx*+l{#yC{B!7sT9F}s+yVprYy80q(IKMW zy)!tEFDbZ^U(#<-m0@AkEYbsHH0fw-ey;uat+UU zZg%I|pp(qJZe9-l_F4H!nd|fSVk;>at-=6BFLnTju||H>JQzDQvi>4}a0IT!Eh|i) z)dZOE^6A~{cT5sc%l$s}PDvTCkVOWs^m=s^e6y+YLkRXvT-&m9979RTG@0M|n!t1Qx4&M0Fo+8dPh2NCV@u>IrvBt= zwKjXHB(ZF{j=f%Oi2;xU14(F$PI5%t0^E1WFPfqskz1Q&uB*p!R6ZvL<_@PcQb3N^i0 zy{s3@5!`;GGDtTj?>;4Qo=P|UhL^rLudG*mHKb;NaL`?1e^#B5-EOp(ucFc4turgv zOwI4bG=9+*KE}VuAKYzPj^FALZ-Z^M=B}S^sl3oezWLfYtc&vf^VZxgUb&J{n>q=w zW#VbfbKZ{6mxCeml@qv;%L$J64`&x7+vEu9pUv2!f z!_?CbY;fA;U*!+}#QKARamzd+rou@)sSLzri@ZKurw*R3#)5XNRJ%B=OTeM-sgS?Y zQoiKB#vlAS^#|F56LKta2nH&+r#wX-?mveNX(|?+{kgX3+N=#*IpW7k{!rZDiW|k) zE5O13${+kW^#?;8$b6n4mRj{G`j6V9OCO{Dgsi_Tbe2fG>=tvI4Mw|3fp0#+0B#6? zpZ|a75B{|JgNlzP^P#Ml#0Hd&h%PwP+L5(zUF)@qA$PD;D+l{M>s*C>yhIm&g+KUD z)gROk;`1qM`+kX9YG*K;JnNh@@ffOGsXpZnKc7E{fy4^&y6u$G_h5JivklP4qU7yc z@FC?;HuCxWLFR~g2fv8if2lEA+NZ#6d36WBrEf)rKZxDjclQZ0(C9OJsA1V3Zr}^k zr6}7T8UCQ~Qm}K5q;E`boLe;}NIoDnHb;a%80IRA>8xLbGYG~Bzf0y7;hm|u6F>0h z^9NO%C4U2BaNti5fnCR9SR%jo#H?8&!XIQ#v5*EG`2OMU8wdE0@PE}MiQ7XbNX7&t z<1?2rsDFV!$f86RBK-WDTPV*D)a0|&x`gXt%>dSjy6-Qkk+H;Yq~aB1%|hGdeexB* zKmX|ZA6@%N{6Siv4v|AJoiAMH>$(OHjr&ba1!^WvAJnl_z7i3Fn;-JntPkK1N_#?X zRM>KnNBDzshBCeHxztRQ*!GL?AHhqww}()b=u+0mB3gLk?Ln$ zuhlb$kKqrBP0JDXp|5@+eTs|pn{t~yiK+tx@hh=A_mbwRXM%T*$#a<_|JbMS2bC0> zaA|oaa&YfOHe|rIb-1U)d&S(ZSC410Lq0DvMNPgG{*(;34jAF5@CV=e_!@VWt+4OF zFHx!Y-Mc%c?aIeU?z;{-eGK>^f)z?`Q}T^|2!BxZb*Tj`1}k$kV=T&uTMO&u6u>?_ z8w{tKhSLZKwXp!JW$dler>Irt-P+`*MJ_ml!dFvyz*2Ip67nMF_|X1@J1BqqdHg}_ zxz4;C;)Ah6KU0p^Cl4=&UyQc;CBQ}Xi`VsPbm-iY z`DQYi-K{Eb{-7zm3wSVJ{K2vL{@f2Zgw)9NyMs-(vn!wLr-b$>g=+*EX9}8i*Q>8$ z%78m+@jmWVb$D=QzOrALpWlb%hf)L9L48i;guJ^p`GHl=J3dEUQK`47_>437be&1= zxHayB1xQaG`kx4U?vH{lNs=HTjT44_ulKgAzpeS>L)Yr9M=GdfULl(A^A ze(Qi30O4iY_^`3_#lxi*PSpgb0kbJli>203^#|b(c9P`p${n3^{%9-yU}5I|8Fx_r z_Vf6Ij7^87#Kzz|%xLrW5uTIqmd7*lC~{xnUKdqf$cAqYMw_RH4F_{D8v57*AF@M# zI?o+%-(6?N9pMksPi5UD2KUeL2Q676$xkLyvPhziW6m$$;F!O_HoIU0*t&4zMIIx& z@dmfOZv@M;yS|fSG!NGfOmMRG_vx{mf>k(Xy5SnNwqSbySp7lTuEt!9t6g6)S4jRu z`ViQlw0*Pc%v>Xt({=0#n_BFNIr1U0n0LVi@zGK1PI8M%9#Q*ja?Sdu z_=DKETD$7#MX)LoLebV3xm$Dj(`NK&B+8drd&Ru{qW);n^2{@StX?}NoCwB?kKqrh zbydi@dG^UG>cc4?+)~2ZZq$o0$kvqFVEt}IP}K*kKqr>dJsFG zJd)(&6x+@b=Qf{7y;u8nJ!C2c<=An^VL=`M=JeYMY!m+No;U;Qa1MvWaeM%OP}Ld5 zg;Q%!;oGeVw*o(JO0J6)!^G+M}3H6Du?P82+GITgg6& z(-MALJ)S)!^0Q^dqUL#al=7;xPO&SzX9{qi79FB6>)C`Z>*BJO{uutC+PC6|VlEf_ znfXx0;XG|*T2y*6#C`-DIXM|(lnR}fxnFvv_|Yll50T*y;{VhS;aqWa>ig|lIFM)X z<~uy}0Dew1_=9TQ#X3^f#7C!a3-&|i!Mkv4$oa|<75<>$x3V7QJok2jdw}EI!4MoM zLx6)^i2{F6t)t%l2hSu9Yrm<#Yu!0uwo)Gs>^TDbL2O_AT9i>_o_~>3Vc!rn`1{2j z`w$s;83F#FjA4gFYSlF*R`KYUdS!5C@MgN!9)XY|68u3+)?ZrU+6D5t5Q7rzLq7=DK@Q3FsuhyNlM<7$ zn>@;GwQrQG?5(PGYyC0&!Gmg)U?AYHGQnXFD%L{P(O{n2sx|w)m{^P!)^Oh5nU{Pu z=@hHN|01scL->O-M@w8HYe6MLr~{d^Re*zTX|d}0uyD-86}Q$4o>5j-yPSemNuJ0z ze)BKa9}HuX670uu{)ld5?U701E7Us4_VcpIg6Y6(F)On$W*ojz(G*Mte-?4@AHpB} zS~C$}8Ph{9p^CNWH#@1jdm?_p5FP^gPOtbItHd-=%g-0QhTM=U=j_Mu2j4c0T}a1b zEmet67teuUX{V|`xQYLL=$RDzGWC}~Fxzmzx|>z<_}Jc%2dv}+>JQSN-gcpIP6Dmk z+NoECa|37ABd?{O6I^!fn=5b|;aHi}Ci6z!>&j{*D#oYq2X*XNa?8KRSaJpzwm|*j zuO?TV51&T*5FA3|N)B5OoXjYZKB{ut5I$aiwuH}|BhTF!KJ5uiFa{q| zcz4g~y|6ph&JPI`g##sdOlx3JAHp9L5oF9oCpx~-{j1{zJD=Q>G9Sbm&R{(R69-S& zjmE9Zb+a~x;Aq2Zp_jVssD!&BVIJ?0BelYpWsdZO1TeD>1U=_^UGw&JK z;rO0mt+l5fr?Y_TEd0#{+~CjP4@!=VgQgAB$%ZR)x6eAzXRP&8BiHpC>*vnOj;y>_ zJX*b*3!gS$CN6`q;JyX7-FyyzPV*#~l zhvvO4a%k>8e|h?~jZ^B`AH*LF_k(JUC2@*s{6aUGwCqV}w(wRHzQ5D9>(!>8IxS^PoT4SvkpirOly-8sW}Me#?=a-}WdOw>5evQCkF!Docnz{?@G z9(4%4p*Y?FLjHCBAgz=G{9H^#ondS^dtHgIrsk5?&R+WkY?@q22hChhiyTihRJk14JhjEI3i+M$O zQ*FkxXz&MhhBD8%Z188R{kvw73rOvQr{TOKb=9oT=MSM=gUP(+AY3Rditik?e{-Cr--RqE7q+Y)NleJY0A4=9Y`#bs) zYe=vWnNP~}DOrz6)VErXz30rYxl=vLI_>w@|LEFJ;tyK#-M>48ntZKTOG~g583*M0pPhV0K1bh_b?AS-U-sH^hQ2lVUKN`c z`aIRWP`|-_r3vrjdp(5h|Lt$QMb_}Xxjk@i6L5uz$<&DRlQ*IhX@?yD$<-s?pBi~` zO}_i9z5iV%!7GsCC)FR6-~5e77&etA>i8Pr2OsrAn|?+=ku|a0_i%kLwFzm&2h<-7 z@2B*m-}E5QMJ8n9A{dD4qJMdwjUkJ&6ExIFSdWk44~iUr+P5stqc*BhTb8TwZEvw$ zHO`xL`Zb6Z$xWF5ApRhISaJ`BhbZRT^8<4P*rDq+^h?kDz(?S( zeF%S0y0_Tn*YVbkP8GOpwLY1XH;SBzY2WVRs}@XTO@t`iEW4S7lK|i7GwKgYzt<$! zf?zpe-X$KjM1S5UeEL@9p0|i=$KPufR6asGMJ_6Q*nTk%L3Jl8o1In|WPN zSm)P(y#LBC2M@=eCGnLaOBJlJX}SZywqB9YYYQJz>aTqQe~@vLwlhboyqq!JqW++> z#yJ?4NFFFKguCJb>W2@O{wx-wA=kN#H%*AS7j<2VlAblK|nsAuG z(*}~WR(OiLwB)&?j}2e$z{^z*g-datca8M)bNGY8X(oR&HX*ekO6Lqo?7;to>*Y5Y zlNgVT9d)owYIMdrv(~e*Ufo*6hf58#$>;C~)p~_Fq#)}YtvxG{qoj)tVja(e3+dV8 zz&xg@YdN@X%|xw6Z7+p!icgn(iJ!tBRQo#_uY?at{>%03zXhc`h}9%ZZ&EmD%G+EX=Ct4080j zi~lm?71xY+G`0Rqq&|l~C_Y1#w;;D&UFR}KV9zo~6jz<=9@3iW>}DCKkn~#DCpG%g zCK%L7HYb`kO@0i2P<)8Y9Z7AeJ-0qQK@&f&(RBxQCUY!z%*Ei~?4J2+FL|v@8#=id z$1|clz9*vUp-gC^=GWb##LVMoV9+Atoo&Wb#^H9;nn&F&derDlHg_-FKg==J8o8Fi z6V<7a9H_ z;{dtTE~TkfnLPYTzm+BbG?+nvpSnca>ZtGsLpe_6OJM}jZqGld>ji&s@4}Oc5PuMT z1ln=-tR`tUpaFUaPcRX{!4hW#>JN%PEik6*OJPro!~O*4PM}WI1FthO{6X=mNttl$8gMIJBU8eOeFY&%pLFs#m6N+YM#lVa5ahH zkn7Pne#!A!ditf0U;6kv?!d2p^>^IWKlx5e_Dvk(R}{?njUiCaNMXT&(SA`!jyDuy z`avcV$ra3_r6uZ##OLq_rQL$7g}66!o9uIyFcNnW^M~4A^33Q~JzlBRmy*-#Q2Xw^`^VSE_$Yr;!`}?H~?@m<7Q(WvwJOko^q&LH>!xTfDBzuL?2ZL>!|Z&Qmem8ncq*J7*e7dP$C z;SbWU4l>S4y@GZuS9bfaL9RfqIDEH8(=$6@gHpdQ)uaYfp1P?EJL|)j>Va3?@l$_D z{XuX8CN^wbjkoDlW(PlI-NZJ)22a?<6&_?v{MP2JfAnz1F^27ltIkV}K74W?!XLCG zUYdhPgo)q#1J~c#U?DN=!(KOWkJkKqrhH6Za~j8iXf4zHOx z)vwmcZP{;5`*YWuWnP1B?%K<`^;r>qaGG4ILAP_=4MdM0#ve>H>TQC&yF=zU=IoTr z7rk~evv-S~ofR+^e3>JLUNLR78#!;M=El} zm^WfAyL){)UL$tM9iQ$Xl`7Q>PsS?nsXMszdEy5x^6Y*He^B_^tko;=euEtC8|0ww zpyV=;@hV4M>SIiDeUJvc-l)07`_?hwv&@4Mxl+M7KZZY8E|6!Ou^0O&RLhn5V>Wpe zrKa<37?>wLVy(Ii4)8=}j&*ggaQf_8sEI)%@`p{6X5U_EBZ;0i1n@cQy*_%J6FcrYW%5Uhjr}yQ}~0rTI;ebk@;NWq$SRhTsgX> z#n|Mg9A8hPE2)i2MD@j#HKk+j4^EK3LkQV@41ZAil-16l2c~o6K_473>NH5~bk_B) z3*&1VxeC*4EYnS0sTUVG;DU53PVj_J;15ch)yaHLKhbqdV#(#8({KjE!k!1}+inFd zIEHNxz-kv~c@8(~Gx&pF{mK$us2KYZ1I|eHVRb)PJQb$-aUkqoWINsEy;6>S%eLxIeM`kW(x^iLgI%L5mdr17zAw!4aAF)`{C~1O@Z z2Dee!hN{b_E^7oU8XKaTq&&olbR@CRup_miVQ`&IlaoIq;a zp#$a)YN-jwg*S=ms6Hp_7d~^4|3&|zM_Cm7yY&anA05$(73(Z3G$l4q7@ zv>%=wZ5CWa4QF!y+sW|}{6W#b8h>cJ%Eu!8U;3367#93s`c=r&ls8IWLT#flkw5D2Py!MC_^rp(ggfC+F(*EFmBPUUn^NaXcx)0^4rV1MHK%_28yMD$^XqT&D0SrUF?lEa z;9z!s6`Y9Edo`u5jq*VaUU|Rh_Ya#`CR17FbW6r}8YurPY3sLxb-~-t)fg)ES+sP2 zaT&PYsNoLGxWA*_o{yjB{hP}FF5Iaqxw1ZkKZqU}Q|kyOYj*mRC0ykU`LGgfyuqUU zR3B`r5#IM(-!~1p1~*dT;8WNTSf=0X3nvV064~HXsXAs&e0p8s#Nb2vlhd>LE~$f- z>W~)@|G4mg@MkLBNj)@v$GZ*T_LajLj=8S%Z`Ok`-TI~rHNMI#`cYUfkNK_~UrwFk z7+-sXxlm%=$+fH6NM1|d?7DpSrgOA!1tW((YQpOb`Kr|VlX``|U?*$Av%o?{&ObY) zo?b3<+h!l*R>nO!jpw~Ejyt<%)hXsO@c#G?YNHkDYskm%w5IJ{PjDyQl6uDPL*_Te zSWecd7+P&kuj7pz$D2f-QtWC1 zq3e;R)ko%3%_$mPUCE&E{;C2wcbw-~3u%O}Dg z?D*vQX$=E=vvEtM`jVtx89h_!Tq~)4Zt$XR%kkEqUGDDl|4@H0SAX?Ssa4yvW{=J# zD8(&5$WL5*NPedYo2&HXw#z50i3BBE8#nYUV`QV#D6`f`sL3uAMD{^y{6e0D-kWPr z>Y6rG(Eil3j{x~o~pFE@fed^lr<~loXR%#>RhYH5U zUVwo^)|Y>Ff)U54iw0>wx#^B=zm(>CH`K$v!|!uU-<~YJVSaNf4wHp(W_;@DFUElS zp}V6#v*Jm-#gGSCLuu(a>%V<>a3yv@#u~WUv)IEG{+)2~#y#sk%B^0+m<;2?Yu^a2 zgQiFBJ_2ADJI{9psz&6nL@w)6$F+Oi*I;k_sQ#d5q$keKF&?{k0{zOpnfk_}4jwG| z3@5YYyxeQ9MlZitK5Wc$N+6^v-szmJYG1}(Gj zuY>r-891%-q~3UW-GQ@<!nt2#QdN}Oh7PeUssKoRZiUo@jUI{1;&QBoS|?FiG^=be>6Yx_9bFb0^zZa zf?;|Rau4C;3I~zb>bk-G7da(2rsO-b9qMDo`5xp)H^-i7_vb~^Ucbg(Dc{2{yO^{a zkHeaufzP~t9*;5clc@cWmLShDSXz#`IyWa5a{V=sF?2U>H@xZ1o$L3)T5C?dBELa< zgUMr8GLD=1*)Np_*vCTd+VCZaZo<9_n0lo+CMVZ7s6b;rw|V zrjGl5Yp`q0JDq)gjbD%ZfeyT&HTO!?`V9E3a4f-Y(%50EFS#eTYjZ^E=@>&-?cfYN zY=c953w4eBo9MF2m?kkLW|uLl{U{tZiL#Zo*Nw+>m&;dc({*4tJ8BQocKoE+dr;~v zRsF#rzMij)Y_qO8hn62dwmQ#4#?e|B-RZUm&4S0ewP|mXk5G=#&du~7?e3&@?o0X=^1OQP z?iw52XVv9nW|KFy+?du|_gx&nJM~2UGjimaE5SWgKEk+t-{tFt>fyvXl-Qdxr&>2) ze`15*pOSM&VhJU`MMldWAFbygUkHpn{b|FP?(i6&cs4vs-x1kXo_)6P-$@(=uwQ1n zTFy4UcPb2SUXCvpf0%q13xSN58y!lEOr7N51rmSBxsb=+EBSDjn; zx+}#V#WXfwTFDsVlUEo_eH`pt)O@Wqo&%@g8l{?VmKv^^@2S&BcO5_8QRgmbi@iF< zd-GAe*F8h-$C)~f!RqO8eRpp}6$eS#}zeQ-0*GGRJwm zywn&6;Bv}ZM*Mp?s>wMfI%*{g7iv5=p02ycrds*2RbFPZ8{)EFyje5Ok88|g?qp4t zv@X?BZR=JN9ldm3-l)U-sKyU&xwdsmwZluU$yttX@8#OzQJ!3$<@4jE9(kTWPi;)} zkv+Qon8m)DF;>=2%5PqlUkm@!SreAy{qnART+JTO8LwHJi;qV=O0kSL{zSW^ZEF2q z*Lt_5;S9=q-4gsj`RY_1Zr+e}g4WqJ&X#bE9N#$~cBLX2NOP0Z<#n87bM{2n?Ak1~ zudz;a8j__aE%j1`Sm2pjdJ<6A_xL1M^$E_XgX z{L{%xoF{|aaYE|xb0fKrS7O_$>ue|GU_E|3Cb7hMn0^Wt&sVWbEn$0NC!wu`Fc>eJ z%0@gFwwCC7h^SIYO6@Xfj{HqOXY`fB@^E~NFS=%wsL%yH-hgGUoPlznAc z{9$y?GX6Wk8hJ|J1Q9#5u2<7)UHwJJ>}=NK^{(H1IEK_%7IlN!Vdsp2LPVCDtm>YL z-sjn|+9c5&@h$TkzdMv&)30Q_lH+T<;>X?HW09|3cHAN1ISaU_j&IMyaqBbqgR0#k zgWv%2FM*$3>T7Ss#zWbZfFJ(fFF8I-LBI6zOCNv79r)F+{*Jr)zkjD-XyG*R-WwLO zfoWZtL-29&H_?~HG$Qjp&)@Y2nN$Jc64MXj56U``Ij~%&CcWH_jO6*SeZN4?UG*9v z)O@d%&xh@-J?ortO*uuCmk{jYL->REbrqH%vS@IO%6)RaZShp?G~Hs;iw>-GHh=0J zAJEj=z9HC+0S+bH3TjM!O8r6E=Sts^c(}4)gXE(&t=DyPxQtuJzFRoaX0u71JMgU+ zJ|4*}iX67l_XJz`82+Hr1A8g*u^+4&5|L{uQ}lLEumHjAUid+UmjlPqyGf2$e80^q zm@W8@)VBN_{-91S?U3h1Tm!LKv&DmWcJdMVYq&V$F+Mna`qcL#ry?ghiLJJ)fpzO= zePsF!{va_U*adq8>0C-Tv0Fd63e434j4%)OgMU#l+A6%xWo4o5}}Ie}WT29VP>OaIwpE!Gh2D|G_Qx!XGq^%+X4PNzZ<{1RsHwpqtJ{!$n)tHPVComjm2X%fD=w0z1oz!hfmhQSB=lT z)N9_i=S(%eE38(l3-=YfG+M1$AyD(0+JDlOEJQfS93sik%Z1KNTli+u^X(b_;aE*- zDk1~;Qgv{38&0*hyelkCYGDn9{{dEE>_<*903Y<*;`>zdkQxK=M~mO;>r{D);buq& z{&osSIT6FJpWnSqcs_f+GtVY>vh_^7W2J?>Ufl=jWd2m|pFxPZzkPc>yNW5m_ka7e z_)7Urkpq6M-R+=*c`Ptzc3`I(uK{)}W7N(!M~guL>|qy_(wob6{<;nF@QBfi;1&V6 znz6vg-`aRaspAaJRo71Ai*~??IR`=A@zYJ$$hYM2+vzz?&u$IKK*etcW8c^eLOe%& z@A=*6VUU}7)_r+F<>L!K6mFbHKhc1*Y1OOnzq9MrB;i17Hkmyl=KPuhu|YY z9;^ur2K?d=&r-SvE<2!)5_B%O)DXXGehqdf-?6IJ8HTved#6iYp^`NPQ`vTAt6*o3 zwz=XKf0d{}^eeiNI94#K-5Ty=iF=>8_m5f^^h~$F2Y1c%b#wJP$*1WLdxFodct2~b zO!6_9WED0ccwf-6sUauWk+kIqc8tFhJgpS}hOa3sjn{Hbop!LLy$mdThB|s+wc}8R z9{2QaTIuALxj8+BKF@nrj+t&$C(F&tOEsNcHCKs0=G;&8A#p$nEon{5jyGp)jfpMf zE``i))v4xEqh%lFaQ%{>-D-(rf<7xYIPBc?CbFb&UOE}P|dv*C72qqx0&)9hxHu)&S*u-3sGlRj=JLj>0XR6dpUOP^~tlqcHWWA9U ze2_kJ9^Q$|I661nObWwW_=YpR4NB=nwwWI-uD4NZbi$sy-_IPd|-S|F}iXYOi*#7PX2i#`zsGhe|`Y}^Y$az@iV)othN3%|S zmFXt9-+Qq14KW3R0}3uY`VLzgDxC-M-s(B-^;21O-|h8k3tlS&uJTjQgs&|zNc1V> zAzo>)di1LW@WIUdQ5+HTh5T|3sCq_2tf z^VX;T#BW|HMW4o=sa57LL?4Vb`3e^9wiRs1w-M7crQs(o2K3J<#wYv-+{UMyDIqxsTn?YdWA#}8btQ`dy? zj8IeP+k?k?Q005x!f-QO2OU#3{%jG2XGt+3oFfjpOpMo9XI$Tl6gUEpHbb ziv7}*j*wBC-2HmHyls&{_;$q3=(JrvXVfxF_O*F8Xq_DFjohNdEtGD@!X}fh6snVR zHhCByv&VBWyRTZ#p;k#8;>qM;QcUm9dSV~D>W5l3bvSpj`$;i{Z(cX`={{LLq%Z!k z57xN#iNA9EVE5docdos#A4aJy^8;-usCLj|X;UaO>ssLqitk$Tqgwp0Nsy4y1)%I~~4r0@}dCE+O zRckY;)(_L_^fEndZ|WQ`uj5nwFp6nwtE#OU<)2i4kbPjRTxQZl9aJ_z9%@T$;dB+2 zw4H7y_R4}K*6umXaliT61^d{)yrDSv1vpsvgXKqkbsog+Nyb0L zM%q8gALO1@;H)5+ZEA=Zpm6mgENF3Gj}V$l)C?-CvJCmfqtOkkz=0kvd(vJd`=yN zCzRY_nl%uIU^id5n!<5Dg+EABt*P`~mD8C$VcIvA#Hu9l!>Kt-8$ay)HyOTUkw+yD zNi9EsKZq1Er^=i+HLc` z?D$hARr#K8M>y7gdl}kyA%z?gr=fV}$guUzgM*DH1eN2lUqdbr4mYn}4e^9lE zwqWyCJ58TD1%CU=YiXMj5Dv?4apdal{HJ7)7azhO1n;LY?{!Rq8hzFw@GW9Am(oaN zd*A!FKE7Rh_s@^v4=OvS)-F>vZA|)m4IsWie2g;v)O+osny>!*riZUf=#lxF1-bb0 z81@**nM=dI3fEQE1Yf7}G0A%FyKACy#(R$Ned=p1^*#Kj#t6Bj`m_2Q|9#o`*Q2^F zT}S3~iGL**wS71d$H4wwLd-JaYt-~;@CTVARouSX;|BhPh2QoT_9yOBMEHZc2JctR z>9Pifiz@o?+h_EM-AHalnGZx?(tkup9HP%p;}6Q7C0v`xS{KgX1^)|iaN+(_*6s97 zRp(JUF*YFm_yhTav^`wc3Km67qUqX_cV4ys(61;xpo>rE55hAL8;~)BHDn^?`v-!c zsADPe$+!{~{-DZ>A!8P{fIQTAeNxBLSL2lEK}3uOe~`K#Z(BwVsik&z>#{f3M(xTh zD*Qp_E9N>HeGq%r;=Vr(4!P-dx0-=>h)*se{6RIJ(|s)Z7W>#&(Qh3n0z6nO6>RF~bQQ;4U>kiiJ=%U%EzrY9Zi|Xuc&Bmi(=#k+M9wd)2or{0= z>-h|fEIAZ&*?YgMHD?9o!-@odQ1)Z=CmkHb8FVGK2mZgUkMG6e@@3>B!ylA&;-O!z zPqj68|1dC;4|12sS1Wxq%|M8c41ZAckw{P5Nn&Bh5$r#SSEy?1)P%R_yi1LpNjbVKe4Bh`-ze^5FV zd|x`3*ol_6UrY1s%nI|iXBy*WIV$`?{0O>k$#zNN6voej=TClekc1t<_qF;N`ZNK1b&@euHZUl6;sAMg8%nD zpYWVGOTkIhBH*L=gQ|Waz6M(F+kNM=%zKZyH^nBKP>_3P@ny}vxL zG}C|=CiUT>!5L+w(-_AVF^D1a-Gx^?g5{7e z*Nnj<5gw}K@cVrJAaexxCX<88=kwHF1rHo2hTnY+b`HlpBK$$!LKBunOoNuV^elKU zrl#`j!V6}ssz!xBNH7(#V#Ht_wAg8rA!ez8zuo9a{^t93T#68Xka1UVwTyOlrf|mQ zv@Wnq^bD$nXa(YDFN&=B3Z5RI~N%3h}$K*>g}W)##gXOM>tEd6>;f(*IoiqNoohvhKPWM*2}$av z-TIg3GPA8uTG!4pJKMpV%tVJjSeAKE(=GOc=HvA&7Cezjrg#qWrbdQ8sN$8tY%@M_ zyPjRY%J@a>CG%s3`V$f14@%BXY4;&Pev;`qFsQX8d_0BM%Kl2?1R}s6l>UPp66;O< z6=E{l2NmNd*Oe?X3`BrG$a-DHG|*Q3C2;j+5idFbQy1)6#VJ#N@bmeDw3j6oW0usz z@qFv7^kAu+l%f<+9y?-SU=8qZ z@&`jZXS|g>Oz+?Z(TDgMrGIfof)mj?Qhh4|{6Ue!k~PUeX@VRsn1rm? z6XY=x+ZFryeEy*Lb!jO5s&A8nK=BS#+o>_4Tk;ph-Hby0LHZH;u$O1aYasT)UQms- zanS>kM1()6)`Qe!p!Q?P1CjAd>}0f9ts}!9q`lYz80RBE7rbIlXC1$J?(n_m#E%t; z`h(1MYSQ!U=`gOasj@bvY*yf(2ElF&4>BVBLF_^70{;AIwbuMfZMvd{Xc=D|ygTZX zMWz0rC1b2s3XJ+>+`1H3s|NYrsJ|#R3vmL`x4=82P=AoMAojuhF&!=1!&9%xTmqP5 zSFsIhDMp1qDDlTEbj9a0yt&;&_eg#Q$twy*sQOk!_=9S`)(p=tY)9z=`A*l^N@@}e zUi2-q8x{T_)O6iyisS7{Hv+vc+n4*-Ix&_{vgl?wVbbgZ5G&L`WN{{ zja++`)d#aqDia<4pvonac=YkL+a1>*tjQysvfSc4U#!-fk>L-LD+(J)+_&|e@5k^r zRI%|?U+Mzi-FZ1G{6QJ3B(CpXsISNAb{)>0M?L^}w$-W2JQ5lHpp3i3Wcc>Qon-o3 z_8aNZGMQbj8dhQ4E<}bu2=@^=G&e|$WsGGnC^Zhy5l_onNw>tG6@mJLvTSF+fnSt; zlRMH~sPa!5_)-*2l;52Y)1o^eJTdc>dszmt&J*B@jrNd9AK_ZL2^370dkv$u^5e~^2PZ}))^ z#c*G%HnkbzOtk4E+lmZ-5MQEiCL|9W#=$?U4c;vIAd4&CO!XqfA4DJS0}w>ThY8?3 zX=fYwu)w0o0~s0qpyUX@?1*Df`FF`nHhb;573w|WTO==MMEHY@LmAJXE>S})25!E| z?kFnrlDvJ$ATX)!w(&eEV9C5PvWMmUcNV+t0ZV zKnP#EfL&PQyRNUY>&Wm2sRfzv&4T?XtjpLp<84kboWVMqr6P5%7#aSc8h7gt$D{tA zccTWQ(>o?4RQZglvA)F`sstxn1^W$n(Hon#u7`NJC&$JR13{6PvFvfhmXWAGC^?AOM?G~F z7pG$5L>}}YHSk0>*_%gzKX}OG0$cnH(vPT#!(LG2;B_8OAY%6fMy94{a=+O5Vd)qd(? ziB6)zAC&!|1*cZV+&;1h|At!Ps^&T!3;$dc_=Do7^2~>=Thzl6A*2qhM#c~Ejnc28 z!XNa^t)t6WMVnCw910nuRNXj{Bg6{j&%#?nH-g`)=W-T z#xj0kC+eEmK4-|g4WFwyM#TU9DP#Bl<(gphU+V@LYQXR1x88V5$d}`L=o+*|xXV%x zRbt!TpW|mZ6!xL|4(}D6i0vxQ6d#n=5#bNwW5CYE79@60<&ff~+{n64{c6^V(clj% zeiu3ve}m{w`V;F#{zKQIL$2u&s6QyVK4>edkg*pr4wj5hoHCza=c@mIK7SCO=tapv zSJKM`bRsq(%Gh7vDMG1s4#$)1fzT z)t(Rg{W=)0sB^B&8Jp;nuXZ&L%#?x8dK{QJJ{JxCAnRS(n{xx;-&ut;eo>eHBsMVg z4QwGI{6Xr9?!vj7n#X0Wynl^O=nh>stG?1>H28z$!Xa;0UDL6T%yCnUt$k; z=C>}pglqLb=NWOMe^YPppJ()vgysz-s zTz0an$;v21g+B;p@WRHmrzbUQ8Jh+t#;R2FxqTUh)1wj<{-94i18ksh=&df8#n?B* z#%qv$}8wm48?52_wNDRQbEqIuUWoA`XYzPpSQS zWcY(WlmoHEH~s1S!5_+@eCq72GN(eYcl=;@_X0Ueu%^s)sh+e zoJ}06Q~wmNU^%GE|Wp_T+1dd@j>=-J{FIYV*FGarI*#6zR8`&e2@A*{`0*3 z`Q;4**XO(CSawq*)lXDk!Qc7)+#mgm`zs5(&`{Y`>ov-zK{MoqH2FCR~E8l9n>UFXzU*o$n zx+&b_yKec|Z+iY>rM|r+-&b=)>FC3kYmV(mPAl;zhsW=I=Un}v9K0tA{J|f|AvPWb z{@{<~hz@`7-RFKi{JI0b?!d1*@aqozx&!|&cK{y)hhQIJYzeP*OYj`Q*HnBWfRx&s z2+o7w@k8qms(l~rRPE+b*6FgJf)~R7f+g@M_&onUn?IOU_nStCc(dB$lIt}?&5S7V z2L-1kUMY-wMHq$Gs^FOELvKWdKZtJ^JrLh2r@;T@pC=AkTV)$-{8KhI$6YMqsSLEOYo4$79bhNK9+zkGBN*J60}Z&sukN#NM29~pycO&tbL_WDv3~Q? zyTynVW6jhZ6NA-=4u6o?601!ObodgCO%jhdT3nm+XT>s3mvUtIgABWBzsDnW4Ty8) zAYPIAM6G@G1M|GabLM=bmRYi|&AUPCIrfWN@YH{JluLI5LE_!(}>QjUt>o#qZ)f zqQM`OwUycnN|%zoVH=-=$b!+RxOdr`mmz(%dyeU>zA&6%4*(YI1^)tg;YG0U%agvN z%N{_+K#3ESwRHIX+$Y)JaJ*l~%iBVB+@24YRqej7oq}Kz1jBvc4h6Yk3MloSf#7N- z=h>cTr_vnSquTOrC-<6ms`X)*V;ihTn$3DKfx<)vIluNOvR{t?e~|i#s?BBYpUBJ^ z-cw{De+KtY^{qEU?p1)%XK7~K{LpgpQ1EKoT_n%^(WR6BK ze0%>Me^B{!X_kuLkh#zzB>6obsyR{q76JaCy0Zsj+rJK3uYA{UkR>AZ2N_x42Rixo zT-IN@CAlV|!5`#)%lb-V9nXU5y+%AJo~^uy41Z9`A)HnTiEZ|2NxVL1B>01>_9H@s`*L~2*ZW9L zJ)in&p5Ri^;19~Z*DVW4go~knj7u0h`9)XMvrOf| zQNcnC^brmIV7MR=*dMzf9^lO%EFjAS|0sM&zvS(tp5mCZ+nKbUjdjPjf}k}F?9Ik4 zmFml{Xa|udu%MbDs z*B*}W1>sOiPj0(>vYJTj*Q>@2?6OLm8l6V@MjsM@Hax__6~@`tbxZLFFCnJZ1Vbl( zt#EWqV-6-#yA`^bO6@?1aO)WO8{&rZv%tT@N4-y7JKkJp=gmrOBx5!?rzF2J4x=z< zgkar&eBwI;CuVVKB{$u%?U&Mg?`G+n_mS^Arf*M{-Y~zp6^F^fI5R%=^cOz#`k}i! zGDnC0PZ2>5i!~JMlkCVUh5SL`D#L}Oj$%~!gZQY3$B^}vmR_u~ZTN#F^hW$ZZ2l}5 zT2%Oh=!SW(uO&F)dUbp_cY)DN-nToqU0*SlMT0*mwn2YRf)5S?yNg{5_pUj%()Igl z_3A~1Kd9kXmo?PM>3H-fiNmOnm$S9ZR@T#ODl+^*u@C(Ke{j%DGd2yGH&}~QJC9w= zD2@-csPG46Jk$?~C%0 zDdWFBe)-+-$9;DF!T&13w?D|H_tW`<-x~Yhp1k$(>HNX}*8Kmtjx3+fAN-H@{?QBk zTH;OlbpGHUHU0P3qQD>geVc#(T5LQD{K4P1`}ePZ@dtl@M}EEjbq9XkfnRsv*B$u( zt2=;?f#Vl{(C<=H$E=6=f^em(b@)66d9>hNbS-?tO?4V@t-emVrgA^Z`(t%{8{~2u z5BXfmD;lOdNYx$pR(|wu1f?FIX7iZS@psA^Da2ig8wJ0_@Akca_ZNRq@@9Ir)XcJi z;{V6qyT?YJW%qs6Gm^X*S&!8&u##5Du=##Ji_ap9MY8y+B3XPC$s$>-s?p47cf60$ z&dh3M?8<6M25dw?td0c;iU4a88L_pFAsIoCG$7lfD1XF(4M$qb&R+>X9I znON)2`P^T9iAspNpt^TbN`_6A@jgix9xJaGgqh5sg>kd`*N`@SWA4rb!VD&2)&7}c;88U zEQYG?QO2t>EQ<-8ZYUe%KBJoV#<_Ei% zO2f00xy@|PSo_vMDwSf+kF%|&rd9?@?CWy#%=Ukkv{fp#ua}0_mTV4m zqcAi)laFV|PBYz8`N4eDUGdU*zSuo^I@CXfTe%AP$wFo-o;xkImF7!kFK{Dn?s74+ zy=?QSTZ>0S9doNIv6Dh+boaFFa5TG|$PXO$6}FaQ!|ij6RvtFL$zK2F{z02_=sb!i zdkdNDLMhR{W@V8n+1?7{>x^N!Yjek2r9^kq=ERqZ#gfe<2N%zkD^uFE^4xV{G9}yd zzP41%WUX$@rb_cU+yB?OX}U=FvNeC^CzYS?o)}B6Z=4jmCi7ckeWUG1t0vd%+?eM6 z!QK3!nR9DjHSE`lL;2;y_;B}H?_|I2uR1iF>3fT7@%@Fhl^u7P4fRBBW-GBav6+|} z-I$+hU5iidCTF`lw_;r@$(@bW9qLCZlbyHCE32i%u-W=9+1e1wYZe){YWH)N-rmN^ z(q#NF)nj_l)ZXl#?bqhl+&@^#jy*8&BNj4`}u)r&(=`#^tg9ve9`1ipo;G>r^mXm z@qYJ?{*sORk7iG2xBDh`*N?VV0^Pm5R@ZFYxOT*?ZEfx!EGBZr^z2w>u=W1f^zP<- zylr`Pey?XaF}ARg92?(R9$VgD-rGEM*V6jI(%$&aV%z=n!r1-P#K`o_W`1b*v}7%M z@UwMM+efzN&TKSp6!P2cCENEH^qn}r&aG84UD$qB(d>*U8g#2`l%?s%?%rNC_Yby@ zjE)?Qr?T<(OtPoA*S2^+n;adwVil(3a)WwdsjO81!_#nLzSIc{26SP>ZhtvfbT=8D6foBIci zjcrG-?MY=X>C)8J(W==O&1EM>a%S80pgq-*i*9utwXY23vWo+`XuLnyzA|u_O${7c zU*aH}G8?2Ty@%P+v9Z?aseGc}+U=}09j;)kNId(Zwiz}U^RXh~r#XGO!P_hUUpmV4 zyNDg#b|=@_u-z`%9^2EMxxUk3vwyPH-rIN3J~(!mU7Xra_73evXL@#$6J73VpXoB2 zwryK&`=^^rnoK<;07~=#_M3>>eun^b@b^4*% z6Xe5AdGD69$$?+$SNZ4Cv~qHCskwj9&G(tzNH^zX<1viM*qqdq?dh@kKkq7zVe8E1 z4eVQSp7}vrE6kk067z~9&Te9Svj4>FCmwAc6nAa7da*k`(Mp*ymf-A>*cd4L9NAN% zpDX9){z0>IIbr8zjk~#6&B5YktUQLyW}ZJs%e(N!{2}FIW#;C1=Q#(^*4bz5d>eOf z_Ug=TpzY@v$_*^_#wIq4tqb?>+gaK+SAM>&$O*>g{=q&gk0=-y3x~$zL(JLQW%IJ` zjK4kGhXKBqU43?rTVK!NX7AC`RL|*Ne&X10Z_jT{j^zjYdJ2UTi^I-I8$4kyZrswD zTAtpTwKLAGOwQ-e?Y^URVd1`sHP;q3_YbBH3uf!jA;oOU zc+Lh7`ctLtZkx-sc?@05C6=$^w(V_Y{-n5JbAlE&(Qk9UQMcFC=2uqca*K98;{E&U zy|$08)V`mO=cmkO^TbIZ7SC_B^^InyW33CUA8YO(+}&8s7Kex9HU_%}jt7Ng&-(G| z@KRS{V`(kE6VGjJE>2Axxod6ac#+GV7uI?Y6066%iLTx4xvBWp)auO4c7NLDcx@iu z%Aio1S}hFQT83cmk-f;w0W%*wXY*f+o9X#QTV`VRD#xNb`FO#};O73pol>IT_ONc7 z9S57sE462GTm9n$V>^4+m$AM1oMo^12-n}C&r`nWm)aVH1+&3p{nXywqp9O~|3GPo zH4GcJCp>R%d$N!znN9RObtUEI=!Z9wd#7V3gJV6*sr8kOVqtF}epu+UNNtT@bN?Xy z%+7`VvEk_E>1fAH>u`4ca5TDpG-d|=MxvW}n+rVQ9oGo+gf=%glH5NYv3Wx0+I@d^ zIb*{KN4>kJb8QRbZLWW7V>r(CA$=q3Eb(8f>4YQgb0b@^-PFp_@rpfLn_=e}@LMni zzPW$U&F9&;^0CcZEMFSm877CE9v6Ms{`*+p*O>Hzv(cbtzvcZfA2gY;Bey^2O8P_8m8ltZ^O2 z-ZcIu*A>du{}Hgcf3Pv<4_;jw=EKUgxqq-R=MUCX9?kuOBYn1B+uCd!E;HW5#^=<* z!TiG1L2+$ner6-Rl-`<~JjxGko9@JMlQv(A4dLxl-h`paL7V5axm3=bTs5P^4s&Fb z=49$AgtDLJ{=sX2)%4m#pou^efhGbk9s)a#E8HaX=o|s_6ZLj z+Ma<)_}(y|HykJRinrKfLmg{Z~#`XxYPw0tjxO>*@y2fpftL;y+`L|MnJ$vb3?_D%CHf~Gp z4EODPY`0h%URds#zrQ)NlCm>d7dQI`H%>17N%(kAIE!45~<2YwMGCyShHP0Um=DnC#>rSOp zwh1_Tbi8>KYv1naYTxNTY1_^fN;|gf1J~V8ceU>JjCFABtoOBLY?y6vWoA6p6YDU% zx6K~%MxmHD?7Nq(E-iX@zU&ESFi1Z>>JOdQ=4tbMw`QHU1**^XtUun3YjtU-tT>wI4>r#qZ0;X)XPjH}ZTlR9a{!v>58B=(j)2VBJPZ4nY|_QH z$gQ0WEiLZuXOE(Tw#V+E`>_4E=ODW~aFAT-J4_x79Y)!27q@+ODf_tqFB@!F#Ns7%8uRM^>>1;p$)W{K4k_ zLH6L;oS|*Ov!Cs|T((B_0_R+FEkpDCLHagx>~lbG2-bwSxmH^;jIAX0vADjk`Lljd z+k%~$yW>3Df7D%mrf`(kmADABCzVgk*ngBg$Z5uZZf&vJH6a98e5*8m|Z@K$5)RE@wJ)G#l@+WQCnxa z)L}RStc@MmxPh(z-LW#D+}t?yKsRFv9TWm+;w7S z%N^Q1`--?um= zoZH!G>**O?H+!kbcUOOC(^VSfGHaecXk+-;HJvNPi<4&C)G(b~EDf6dROSeaF>Fv` zFSYhn$e0}~+c#-`iiHekJ~2l-9+VyNbPZZrCCr}Xh}pk2+lhU#;bhOMjq|j%E}R!f z^Zdc%nW^#P-mO%8zPOb(Ok=h$!1mY;X8MfBnX8SNty#l&$mYl|yO=wV&2G*d?~g?{ zk6IUkeFF|@)4>*Utz*ZV#Q~f5wYXwto49RuXEuK7^fRyhu+2fixI^>&!RGmc%p;lY zt>*cI&HaP6-*3(4Ad_u73(ft5+x^SfPsMI(X(+eq_DR}Ad0?+Lzf|0|IeF#+i@DX^ z+4;=e>fn4PeX>*-?w>6VudUfxX-7M0GnH#L0@BC3yQWj3S~kxgWPW^jcD*z|Yv;hW zr&m)$y_4hj^E*?;_T8zO;~ksp-d^uK-JWjES1z89dJFEd``xwqzQn=e?DG0aXTf;Z z%D}Fq&A<0sIrW=8;e4L$8>5nKOdbqj^_tXhlZoY`QZthD`dWK_H?K_mM^x?xNEC4&3@nfU~ckg zFgI@Vg{E_4ZS7MjbzHFbTe-=6rhO_uzde6ajE-gp=F_Q}VstE9=ta1!&rBru`WH`A zJ-e&zBkR_2w*D4D)@f6#2s_S`?}OYZHT>?V8rGRfBandnN_cGS*EPL6hLM+e)t z+k4w8m-jrkdvwq}a=$&7SxX*mcW<5!<#$huxn0|Dx0g?J?;UOBhC{ab8s z_S;yUjs4KawehwaZHZDEh-#@mHNlXtOpCDHa{yighZN*P^Q7>sc@&mTN0lokx#t!KRA#+&9qG>yAL|j z$A@!ver5Y%VYticiS12p?jLNPKWOuU^g(R7zRiKy{4D2u-5=x(msV%9f%TWHSGK(v z!5I~-!yK~9?E_doZkw5%JlHO7=WTw)#*nu;lP+6oo zG(^q)gRKk349)Wg4TR7yJWuVd?+AQa8*92wbN`_B0ixTXcQp48ij!>J3CkFRU-SGy zcUGg*Pnn*mwFi>-wpY%^T$<+(Hun#jjmf3)(%_!$Q<`t?AN0>4Y@R>Z+&}2fM$E+1 zy$35(6V3gD7tSMWoxrJ)#mr_Gk( z&?;v(9uCBMMx#5nj&o|)&UG_eh<3)C+dq?AKFze7ebLp)(deQXptSt}jPJ1_AQ;1A z9IyJ-+&|bnf3Pz(-P}KDwno`ESQ<7viOv0k&GQFW#@3HkGKEan$i(vaRBo$%#CRiV z`{bJE4>tD?HqRf_xLb4opp92|a5eW2#<~^*rPlt}IIY~uhdOSIx0>evd_(i89M?VFkCI9}-58d#n>o?Mykom$E*4lQ>dPjV%52NUjo zy>)t}r#H5;K03GBGc&*5bG)#6w7asnwmUu6u`ub6O^$Z6vCJ}s`?$={+rRA2=F0TSOtycqkRNQbvERP2Vsrms zbN}GZIWy_5xqq;^f3UfKu(^NG?Dv}O=H~vv{9r!nu6SuYU+kVdwWG^$D_0>uS;$Pq zbEl;?vje$Q9I`X!=1XR8a2s2YTZ>0S9doNIv6Dh+boaFFa5TG|$PXO$6}FaQ!|ii6 zu4T>i0&Vq(wcqTUxZk$cbFgf4+p*GM%xwEkCUSFQZBr}v?fk{niF~1NaCoq1roQ*!M%X10^cd5C5&|$N~F@6k(pk57NYunD{VGD=d z*%e@l{$)09cka8h#a{URgO;z3#h$T~`L&eUmUZSDE3PvuYkNt}U7FfDTFtiJ&t)e@ zj_l0DgZ5NME_={p_E7unc_JYno=X_`&poeO7oX|7hT!GGm%q2vDI(Y)!j!LL$3?6J7LZAqG;+~HDwXRhyb zc;tTfX123;KiN5Qn2b+m_X_>HcIM-5d%R~m+uQDJBexH>Z?)~8ZZ2(}a4n22A1tn| z>=w35C+x8;VCU8BTe=EJ)hqud4&qbptT==eKk}e83Rh;rJXk*V2ir%m9}70c#2V*W z20vFG8)k1a3xxUj(ddZqW?&)bme#VeqXld)}`oe(yv&!pMELw zrPu6zB=TU_5dP%Z%lE#1?>i#D`)VZef4%mt$L@WFrk{)a?%AJP{w>4c%<@J)&Cm4Xp~xe1KY8{WiRo8A zc=<~UmWNO4`A_eC>9_AivS&jsot-oD%RO=bk-d*ZBEK1le9yztmm|OE`}r8*hm3AZ z1G+!7xQ!pDN#kc;s`&jl@h$ND8^O0%yCYxv?SKC`o4EI2_bbldc^uG6*?sG)zY~;e z8N&}>w!9cVhJ(ZO?B(+P`TK`pU4H-2c)@n-1$i4b01p1DGwKyy(5o_mm=Bk zAukqx*#FN4W&Hz`1Nm*Sa_9a#@n4RYI6k!e_+?;a5tO}^!FS--Ff!VMG9ewi|Ip}# zF2dh4p2p948U8(2h7Ue&>9raEbVVMOBEPWvAoBh@XMI+W3_Eaj?wGj`?0M4MlDV-ET^_Z8n~h}+WmT-klw{C{Ozk{_opol!u(v|x;*@qavDEhcK@2Wk)Pc?`|Fn8F9q+Mzh5cG@vCL` z*X;Y>vg_|y85+MEUwj=5{;KgNIDTMddG@aH?gOhA-2e4}k0a&#$a|3=AdR!h#G|u+ zYi`WkKQi}knftHI{W)|0z+4MwJk)#kc2It<4zzsF!~gAGj&)*+BxA1KB-DvG~?-M`ru*K@jS&{NT_xIr+B@CxX z`rg;>?VbHAFP?I|-~6|UM+y6m%rJl74SgTJ9@IVPc>ImXqf?{n@xO>XT7$k~!1s~A z9N8iLdp{ESgnMVa2j98(U;B>S7C&PcH9Nzc$ z#t)x||MOmWOYe#FKUWU_{Z?NLqq9E<%J6~JMWfAO>}1dDCU0iHfA8!wmY4hwf=Ta( zpR@bOJ>l}`%`S&VKIk<4=9-tN+l| zc^B8&_dHA*uSLG{GrJ=ehkIB0-iPz{E|8DE?d0RPzWQIChk5^dAO0iz4n{w1VZQ0G ziu~ri55Cvr;Y(ltyY`Mc@}E1IX8An(-iLkW|DPDIRQx7B<^28^Wxw}K{#%>(i)XLi zd-UO}3qd|hpL+Nk7VaPV;oc9z{bD)XZ(ADoA`gDg(fz@v9{$G`$A9hnKMVZ-Rr$Ac zex7vN?maqdTX1d9&jhk}_wSpZziDAVwD&H)$PYgJYnJ}6`tc=x(9!)~IlkA*VgHiF z`3Hu>&z5PqSHj=RU;p>t3a}u5j;B5udH6{Sd)8&?cP%_3++VTy3Hzh>f_&V25QP0V z<*@e^b~y6zI|PT+_GOdPttN-> zMSj-GoQ$ZX@xc#09JO!wZLzQ|Wj)3J z-fQ1yd>YOI8osYg!_PcH!-L<8LBp>a4ZnI$!w*6O&sAvnc=_9Xmk*N@E?i>Tr{iPh z=Le0B3*{d9VOQ=yRW7?SZy64+{&U*?Z>p}e;P0icf3xflK6=aUX~P{xi64Ggh^P+! zvvM8$2d)nOH_-N~)p66soZt6<_~E}azn^;i_?I5L`W^U#-;Dm>`+N8|8Fu#5mXDt{ zJs=wSQpwWe-t_rTCX6q>_0>SX{nl51%cXJlDZ{EO@(8{4>{HhMylU>f$S*`JEtBaV zp^KSJ`J?x(y)!-MqaPt}mcGgUAHe@T^fPmj|L9>6+C@EE`VZjg^7Ho_?d~4E#nL_N zN<1>XWry^UBMYW?LZj)y&Y!)THXZ1rZ+-QDDC1JrLk$yjBiFY4n)&&)AZ_Zvf@DO? zryqXB@Nl})uLbzL>+noGk}mkIua@z%ygS|7@@n)v{Lr4s&mUSoou1|CRM7Xo+WT`H z&uRMb(}v@xB99`8U*1i;`?uafpK^LiUqCN;bbRt%4|e~F#W7%58Xhk1uI^i&@bf=W zW_E9FM4Iw{|2rS-{fhtCW%@WX$^Fn(-l@coG^^TR!;VRu@-Ur?K}gywP_y@8zqE zcME*^=?9M@|L&*0@!`)Ie|)y||DH`gAWqj`dXs#Y>484(q2b^Bf9HM0bH4mEyKKg^n$VYz|i+uDi=OZ8e?@N)7{?)4KQ>&(DE?HblFFA~yOFdY+_t3ET z=+c*C}H? z|6$}y|L8vieFT@rKeIlY;xRg_ruCcm9RF7Rc6QIz^;gaP$KM;tzWR^veW~w2oCF#o}VgMnfxuwy{@v{vuAkWzqB+>wgkLqxYL((`f-_e{)T<8@R|Al&+uQ3 zH!bXk|3@%}@vX1^qoDu26#3ncnT);{iTpE@Z(nzPZ0o;Ty>Md<>gQVf`%$;=ugvr6 z&-(t>>h$;7%lsK#f7SnPed#lwF8glv?$O^a`*G>dN6-^K`XBvpVLHp<{&m?8x^^Y6 zM!Ic$+FRzDv9PJpe+-N?sUtR(HX z|HapS^z(1Fy!Up?yKlbN^6u;Jy!qxATi$u|-M2sg<@ert`-^-S86J)Ptyps8B%hq3fn^*2lTTAfavu}R> z$GOXX_N{kY?BAE)ee<1`AAjfV*WY~i-BKl&FTV(^uB-}=lKU;BJ99Hffhman|^-e+3^|J@63{KRWteErQgdIn#4 z=grT&_3nFbzH=e1mX=-jy6nH@v#)*ejnBXNjvwxgH@{#nL!nw)lJ0fOkH7Yrx4!t9 z!B@WUh1Y((7>>K8h1V_bz4`8YEhA+=UwI;?b3db$*jw*C;iIKx=gV)sH|Q9|&~Way z70p}k&a`yAVWXn@pAxUB(nAPd&VL^@fs}h`rGE~i*L9J zupO{?%e(Kr_Rf3#j`RHNMP9K6j^FUe=vZ`oVsdKwwI6-`jW>TRck=kM#<9vJS>#XG)prTdDzslNHuWU4Pp98Bwn z#^`tyO^o8jD!QjeF zdUk$ow;&oDjg``!o7`Pr>DhC6o?abH#@AL(4hs2&TKV8T@}2Op)!j?=1Nlp=_qAOX zpT2=B`k83+%YZoazL8id&BM)H*GVBap=VrlNYP%+Rh>gV!CTZ5Frl5I-Xd4HmQ!Oc z-o@#3KYs8_eB7g->RD-2ZpP*pw`cn{xwc}NmGnv99Q7JM1IeC@(!~w)E%nUz z6UGVt6UKyZ1Xe!1y5GzXWhHx|2fBQ@fX+ak!GQW|`z>eS#d<#if?N z@*xoK9>}z0v`r(W7Wj@AArp`jOk}?yHsOr+I(0 zHRbZWus+!-eB_Fsg#|K+Z`Jq+KcfA%T+y-Cw{(!+oLyOra1FaaV_&u068cdY?Q&E4m^w8Ci{ds)vv8t90ao6`1inb<}qteB^=&-;f33 zA!H@8>3QgzqPurxsJ()Z_-T17%Xiux-A5qYI9 z)x%G<{4DjvI!Qm4+IXVRBV7|-5_YsPv?=rzsEdTX4NPjqNqUxUx^JzkSix$g7~?(l zqgFn{@4=BeiH?N63Ll33_|IeeTTYLhPiJ$&Lay4_TK#e9!?p5s8}Gq`zdn;k!ijpw zJNU-WTdjL|%kPsBmb}#R52pC(U2aVzHu_7#N3L{z`*ayL{x{k_<)5(VT>f|6)6a2vO!gFzO{<&T4iDtC@{Sws_xV`) zerwf}+j=h=`&QfL`)KbhAG`yrdUf$aacu#<0weYNq-PQbx&ZnZ@v6?HHj_EVk7rg_ z+?dlqa@_IbWn-k$Ly70M@Te89aO$z~4A=Ip#!@}yF(8+(iOyl#Kl-oIr^!1qoQr-4 z@{GEQ?tp$7&vj;$?@IiZH~!{k@{93UG)+HX>acZzcg%Y-mPy^K)}QftN?{0BD^Iue zKF9&}FV+{deQhV)gPp!z*Co%hYn^*sYR_rsrh6uj{kYI2HAl$U3Vl2um+(E~cM5-7 zcw825khbYlrb9_jpf2*B@fF*`eVR`1Z81hg-H_ZB&A8N6c#nI=X_TJEwS2$ayLr^| zIA<7-YR|}g#$Ke0DE>ye7xIwYiXz)3*TF<%FVJK?KGz2%47$5?1KM=)&OtmeCHlEn z{JqJ87<|R^WwI!YlVlV8$C!)aQyPtQm3A$cKF9G;beXvs{4kdQuWg%$8YdcYc6beaAOa>or`Wk~ubvy_ zDqk8$R9`}RXdvIaioSdaa<9J>Ac%j}tN#9oio&LRKNi(2@Lb7w_9#y(4~PzmF03>d){U ztl+7s-eK2Y;9WKP8}*L#`Gb$3m3Euw3%Y{q2ll!-Joyj1tSivido8Snx(;)GINDPm zEA&qPJG?}{Q1cvoYZNZwbVQeE*4(2%_TqSgajJ6vMqzN#Yor$tmiP<93F~JEWA7K- zO1%r_cf#}Q(gXbXtKEn5(1>TzA-Sr$R8_{5bx`R}wDI)u7~3Tt+I`V{0Uu#j9uo}4 zyaF9T>B3h&KM{{;3%g3AQLdl9=GMd;)R8ChT5hkTBY+d*n)LO2efc6kp*zJ=0XFM< zq>0Y2xiGb};G{8N{4@%KtJ3i?;vP8+t;+9(v0?E8{blnjoWgPF+38R86RXry^o{YU zzRk_-gzM}0Yhe7j=&R^&)OY1cE;v>6IvYE9f|tO`+I#$0a55a|JEL>=E+1Gwnt8y0 zXB02buHV9Vm*Kp45bHW54)(@^ zcCh|D`*iC5CUK}IE~V@D@vGrb&pR+!?d&}DFYtS!9j)k|_2~kl(Rb^~+fDjW+L!W^ zUk`8SUb+dRbfe+v4JP@ za!VMohUIuDm(!TvWqB9vm-+F($^UJ*K|0JASJR7b?%jOf)YNW#EkhrNKAy&P8Q=5k zp`Y*T-roj3ic_>OhD|=S_KtFY7VHSWJUbO~ zKKdz)iz+?(g4ZdBS~w~G+jc8-o19|2o4kM-^Gup6cp4hO93EwUOM8Wsmg^_g(8a1@ z=dUMy8d`2DjOefB(qE(u-x@0gzn<3hYMtE~z3dwG6hT(Fva zG%Uk>bW?eL+IWN!>&Mu~r01J*wO0B(J{z|~1~HHC^!?S0>r2CDZoJCIBdkAp?*D3C z>uK|Top7RuwH7M(TH)olmg|R;AFXZG^L1Q5zUO@}y8U%dH$ju))wn6oidWxix$<{c z+}otHTHJRf-`Am|T0ZpdI`LHVt9X33n!gv}ou7yB{j<;?j!Vza66f;{t33Gbv(n_p z<=;PRyx(r&eQb39?Uu)8ewqk05ojXNM4*X46M^ao{8?`MmG`H0t0VeizkOOPSbH$B zvN)Zb>5H!PuEwGVot6D_;W%GZgu?mIv#n?9WbBf>uce2US<8ph9*Mfz=F3?|d`ZV{#Gdnmu9?zvt{WR}7 zUOuhNp`~NR-NWL|+JdZwsjYi*`}LvWF5@JOs0*oBdNWr{q-y2qw%#MdM8{pjN_62O zcaSYt;Q)_0Ub|wi9P+B3_>>-HBUyhJaPqOyJ!M%h57{blw7epRUZ8Bsvp|}{TKES_f=9@|?4Zymp?yMLEADz-WRY<4WjEo&a*wpber^*h<$-#S-8r7&`GD_( zuk=O4L(sdpp6*v$t?<>{@$rLx>M?W1w&%Quy)N7ReH-vD^X=4gT%OCD-Vdba6J!N!ihn61}wk!L$;dAKIeguV?vb}_>slGw>L}Bj%TMyXZ zfiGnnq#k#7Hk~C-U%qp%bf}L$KdJueyYJpMPOM|nK0?w;&rPjppAPZ`oU}%gItm{3 zU{H@Ac#OP~fAI^r@Xq+Wyl19oPi-mRv>!(5I#)Nci>$w5J)h`D zZXk1zS=dggC;wOa8Okk}>;iYv+1MC!=|cl`ig&ba)O+qp8@-e7em_}xxosC3XoF?T zsIo?Fwau;jLq16Np`Klt{~ESNvAqH&$SGtNG7%Xj`4m5yy09l$?LU~Q{ZrfG%g@`! zNAU+Zx&49h3P!9~EAItBX2(_!-2Q27>_98_t&mHS&GlgC>l{iGyuhC4*;H~u^$u6E z-1bkO@+_%~#M3(N3E;NzzeTF};vs(c>7W?R3KPjFXCI?HrXyP+`1k2=)O~=H?KP-kXH+^ddA=;a z`UZ}Q4;T4=8NUf9>_BCU?K|j3@DlAB>tTsQ{T48kPTMGK{B$b$GP@}kWR%G%*#}TP z5gxT%>)Cc-*EXV2xgcjHaKYc{}vnkP}z&}3U5TAwF!=KWludOgj4;LL)HgCe%_|NpCh?6jiv(ava?qqLg zSfAn>eNe^|e7eZD+VBap8;L)#qVM7NS(*EVk7Og$>?iiJ55x9jxH?MSHMZj8;@?Z2 z-zA=McE3FP(G?602ihQb3XH&v{QF~P^mQ1ASUHYOsNaJtJM@9R!PsuFf1R|5U;Pvx z8{IQ*h#zz)bgJ{Xo)2I7crZpSzN)-8Uei4~!&d*;zQ$$1g>Q_*fD@O-WE7^??5GGA z?w!t7*8QoE!X@m&kBXz3>+^Uc?nOgI&RG3GR}bE=?*(>RhslY3^X&Fqg5t|AA^{cgXX62^&V#@Cge?=}LLa2iS<9R~ZUdUmdpTi#ya)ukDV}xH{2SHx(F02#KKUN>v*CoPqH~Lw5)fggpRoW+H zZ&|mx=$36cl`%k8ffX0+7;#?EFNi19rs{jR%}e%goMMk|b0D_|hP1h&vC-K0=|Kau z_-&8+?=|i9RP@r|+zI6)>=N%>_t2nZ-UY17GKxN&U*}dg`>}C&2v%S=Go8Iq_k7wL zaqs5|T4{sDQ|d2V)Iq)aCmu7q43b;OH(xJ6&pav)CmCZVuNN>Pd>JS7Z6BwAm#5Rw zsi6%0K=9(;r?(OKC=EYd|6b!9ysI{z_e6fnG8x_h8$T}QEJ=^Cfp9q4m&8B(E3Eu} ziXWGMuRJuu_0#q5;VJdgFWMNb!cXvp$!o%clU=SIKu^~_{6v1vakBQWd}f8xMOOkV z=I<}VsS&tbl}3eT8>5!~TWu`wJile!$~IBJ1+0jNG0xcPq8pn+*8;0Rzp(iV>;;>j z!Ljx9QZ}$7CT!3HgfD)sqWO7z7f$Fzj8pR*Zlj*S$dfa)bCOStuek8#eh>Pz^Z?#7 zu9uB2_H!xSYVPyEp`J8Ft8`9Z->Hg`;iUc=I-|ldCZM=3xTYVhwfEllZD)ZQe(Is` zF8T5ERm)D8kD2T(oXhawtP^Aq?IrCY_e-6VoqH37O&=rfRrg+Gte&v>MLi2$!b$js zbqU(^YWN7RwTYQcg}qDsQV%VnJB&%yXB%Tjw+{Hn#slcDcv#9trf`wFvA>d${WV{9 z)kEK1@pCPlJWPCibWeQ)6WsX3-dKRm#koVtIMTf<7}P_@IZm>{^kjV#4mabPJ#x>s zZ9O#J1wR#>u>EoczdY;rq3(_L-FR|~aX_W}qVSdIy*R&j^E?%sNsb-Q=j<%J;Ur^# zO7}&>X>hV_^jZ0(T6p@!^!ZeGq>l?Hy}#?O=w;0uA>PWSG*Ygf+SeHgz z%0F?_S5|tyD?hmYd+z;j&-)&F7)Rs0>Rk8a26iqp7;0( z`oY0C0dWTN3c(o?tlQ8$V5OgAx@)aI;$6YUr$acge&D>1tG7?*26JDGK?U=jtkV!r zUFdh0$2-HR`1IYCd(lWzzpHr7OO zPPD&9P-_M2b-|5u)BU{+q;Y);pKl1^g3Fq(rS-$1oq)|-dh_UB`yv)}8<7whr;y$j(md{f-@@Fwf9!*X5Wac>)ktKt_e z*Wn}DI@)&jN`>*!Gcunx0RFg2{)3~>N9bSBqw|YJ<5hXNt?x=dG5w@nD&@DDi`*qF z~ZzqhwoQr($4l4@#-6TC^|+m)fbfxhFo&Au$IowQsrGpL( z@2kvh9)C-Fm(=dbP6hfDWlFxNH@L!yIFPr#POUWHxrMde9JaC!PPf}-uZ4H`k^K~~ zlAS>KPW6%Z@SNhqy={Dm-%pQwwJYIr2Rmq_zY-2}+4J;DVQzJ%YXG|$*fuH_x07M} zB0Mjzr@M&9m+#=CxWQL-5;{~Sjlf7afep4`uz>|#)B$kOUT8;uxjqP|mGzTe^3Qsb zM0flEmuL87cO$cJYnOVjWAl*sNJo4N7OG#+C%o2Tea=3m+5_I-Hdad8?4C?grm{uE zd*m#2iF@kaPGM~i+C?9ArW#*7%{zE(X+73XTCv`>%3fFMAnzzQWSpHL?Dhqr7pT1W z-YA^l1M-Ir9n#gGWNY*=J(i8V%zrY5<-h-+$k z=#cO11!G^g^cTri+A)Rq-D>vhX#20iPxkDAxQ z%pO83>mm6zF*TW5*oYP-FND+fY~N-+(>{%ip&s!Z<|kym>ay~So>UDpAE)%dMh;n| zFmkDT6+06~n`mx?3k|fp@ssG}*z{CSuz%ouj}ms!R!{qnkrVVABrlLneqE||ul>>! zOGkTL17#VE3=jMFaUwmnwdkwp3S98CbYSRi1U^bbW#z9swl%e`EJr71cHynz@q%k( zm{*c6OuoW-4L@tG?qr+`b!mXfC zwwWm#FnW)UDgL6Z@yiq0qyCxl9d?oHe!m_*1Ycwq?WFKfdhoDpb)u{J80r3b%`b?? zU{4+PcFcCByUKeJWs}LqK%^sA!kAtFUho(B1_%G5KJgx#_Oy}s_4|(8Q@3bK6elkF zwr~l%&s#?ICKs*lUEH4=$aSla_6_>ciUbC* zJyZ9hyaOj>|r|FkR$bILBf1 z7$^A+Y(RK?s&=<*FOa$_Uc%LQg~I!8I4`&PtaQWW2#vhs`$ZdBCimH+kNq&$*9rC* zDjr;9_G)iz0<5Sr=ilgO`}@O=^3-i78_R7h-6kg0;#RuI0iQnZ)h-3~ zqt;%0^a|`5w#}=LNSw@+Tx}+Y|vS$#dE_#w#>ds5wBwSIa{q-jO!4 z!_j8+N$!A?^cLyvuG~ZI;>CBgUFUmRiQE4}U!<*MeB!)sd5*u26MbXGE$I7cOqIAA zfr+1nPd~B@{wywEB}h2a@|s`R>_^aT>;k1M-?O zVmy^`FfRIliUZfr$8F#H>4xvAZ_p|kiao-MdGc@x<5#g!H@>HNQ2NIj4@YK^xAef& ziXW$R1NfP=8QZ)l%g(91ZEV8vpQn8Bj3vgDDz!@rE<_;Q{80|9CsLaA z^88)#2i>gsV|>cDPbd1YQ%Bz(?AH2oi{Pg@dGgNsCf?KU^>LPsHr6*#2E<4FFEUP| z9hY;G7n0W!lKK;13zf1YAmloxLwLDsw8>AkaP znz7wrJWk;i2A4I7-!3>QU&?3L)%Re&>Ae3dy`UOTDGct5T<^fb&kOfqeEetm4c0E$ z9K3gyUNFxP@Ra;r=KAs8_4``+xQuQ;jH`z>E>+>F%2{#ezKHAm>HO}pH16WJbIQ-} zuA=kYXZg;?vfMf}8-wt_DIWiw?)B|OaYeV>>(H$*wOqv&{;v0bmR(`;XBmTL-kS(C z5ojXNMBv3jKy6no_r=Q1%}`qli|f9>8EWocEY)ye4Pk6`cat?sta)SYMk^bACQPwKebK%#{*qz|)W?MQwXy>)G zDNfw$Q+78(_<7)-GdFimFYaZk2cKGgz-{?>%$*(Yr*$`SUmq1d-8Oz*fDe4zAhq)T zH1FX{&URLs^-=izeTiQ9XKQx;!dmX9!J*zT)z;Xi{_hjkwN6& z)~KFd6))|f%8fmF{_|bHiMIZ#JXHIR47;iwM2{lx=vLL@@ZZS}fUsiiKX~c+d0?fq znQOB7+D`cXsyzF7!Y^@9Km7OMd+`La+W$s7N_(1_Ew$=B?})QExiz8nD+P zGbb+DP%l=(N&7sM*RV^yBMsUIDusfS} zYo4fsikGyZk@)m3j1k{&o1cV}-~Mo~_qgzcXrv7yA7F|<`Wcsv0l+UCeM9lXxm;(V zxVGTq628wDyJtubJdsVLNnNE3x%3Vh=F@lE7!g0|F(wk$xrG&VMHu12|2~bn#~+xm zA0In4;Bu9{j4)0-QwNFD?bMxTyvv@?5!+^(=v--|U8 z)E{hvVEd|A%-UY__O)ldu<1s+jM*qn)ji56+@EPQPLjRQ#u%IM8$DP&@NrUq9)5XN zOsHqnNo+?+j)T9Q^Xha2^f>6DJ)qu+Cb^Bkh%}TQuJ|0<{B|jNxH@=HjAm7~(sOPC zCx6|JXaOUwd!jv1y1s7SD14NTXv3vHfxOn3EP4#@r;hp#_6JLqdZ#w+U~a7qxeQN; zudu~)o%#pX@YDKnW&&)mO@>S(9%MP`qlb#8v}c+3%EN8Dq{Sb5Dsj<$)Q;1?lMWS| zS&RBOsegtXfgivXTRh@HbfD{CC5*!^^$@y{O~`L>Qy+o%w~deDCoTTgkJA^%TalIM zPr@wGm&^I}PHhb`B^;LcX!CrW(2;2W$TwG5XA0w^XVpFGo6;1`a+R0cbd?souY1Z% z{LVXMxU+XSpQy|aAjkN&nO;hQ2YjWv19rZSL_3Jiq4;q*n^{=Ya;bYN19*u(ogatp zZxbKIOArn*0)Kpf_qUCW;ukHH9eI)t%zKUVP^Lp26Vvi5oM?Y|NBd2k^<|Op@m+9H zTY=n{%}vtA9-HF7=uW3&GyMbWr->uA8`696r+nPDE1HleJ1o;3!5D_usq z1K+6|*egUv)4n6CbW!hkUmK6WMh&`#+6_lTvgars8#WsuOHLLdGpYA{qJ^Exg%D>R+UAI9Sj44(5p(&anps&A=$ z+_oz!r~~j5ZFNO<8cwpOCx6&Q;vw*%C>9Cvm{ z#YbSoMH`~>Yy?)-a8mg!q_frS@tExjm2d$yPL@#Y!$&{+$$Yico2+yob;Wx z!;ODC`v^f9@s08jM!4t*>L(~Hu4un$S81r;!BgaobkcJdZ47DOfO7+^D)K9c=Sf>@ zyk}fQ^@(TNec`0Oqv((eR&HNMc^|cJN0YH0@t*w4y=i%oSG_Bh`qO-;+%8}f z-tX+NQViBU+Ws*1sUTNeJ$3sFp4_uS9TiSbBP1^Nf#r(kU5$#XrG zr`vFqOZw;MI5EZ+{A$)c!;F1&gb(mxpURW_paP!2z8`JEisL`peR$00C1e=mHr3)F z4P=pU!fo^%r*J~g@o`e!%MTA94|Q)mx%a-JGfZcy*#W7>hq4W(G<_EtMq22U;jr>Y z9~^yicWcegEIXe^SDD_XD;ntA`#1&nLCTD!glU()z@E(Tw_4A#dx)$L*EeJqse!@8 z@Llfg55i;yhxh4=yUY5TYIn)QZDORjg_W-x1ULn93V&Otr48{_px0Qaa+`E9U$t!= z^{#ZfJfm~?V-ZRpor|BkXPdL}&GW|2bCh z{n+8EowE_>PtM+NShipCEP2M79OEY^s~C?`9{|}-KK;6(OiMFfU zihgrRJqu%1!O8Rj;+NiCJ+10GD}HOy{yg4Sr~UlxQ}I)IJ&yPy&?l+0*zpT=Ec%pO z8uL6)@owRBRhfwHppRUiToPY7{xN>wFR*3sq+UupmKl$)V|Oh&w(ey8RW#kj@6Uph zY;HT9%jC51le^S8*(Do(xQk=wb?+`>aT!g*sa_pi7}Vp6kAzh^J5ibcxs0Z}`0X60 zC;6csEH3jyU7qhu55rfwl-^y$;xd{8`#PR=D(I7*7YY zFumZ$m?*f>XY;Y6uWR=H26)fKz5gBl#E<5qNGlxwU4Ir%^!fdaOrMvr0mAxy zX5z0F?k>L*CjJ^1y}Qa~E(#ve1)kN$qZE(dZ@$ZzRHIFKU`>zKZpfd$1@^Ew_r~TG zY}_;G2R}KlApg}|#w~oFRT?jft32sUTb_N|^}T98kU5$1xl!S8ibLUXS@R%%)Atw2 zRbHy)LEpkQ>lu$>en#J~%CG$S?Zs7L?%H?d!FQq2f2Ph=bWr%HeEuJP>dB8ESNOi3 z@OQ;enD+29xCC>boE>|9*4B0C567wJ>%{TA{fg%6xKBfKwfLVVp63-NOutV@_#4mu z_v_yK@m)9UUHAX(oVUA0!;*(2s9CB3<7>zSI>Q8sCvGs)Puuy{XE|s-E8XN zyfZ#Gxw1IP`4OzcFo5D%x>ble%Bno(t#qS)W<^{5)(EJR34WXdfT$ z$;WMAo)GGhf3RbZ!5n~6R%H~t=T?p zBtAaovX$V|!~N6b>88VoCY#GF*ttdxvvKI-qkHPN&WXkLgw~qfbe^vppD?mHp-$VI zG%k8?(xq)9&%1Mpo_gYyZ4UNM+1c2YdBf}G?I!&Tr|^ERdh#PbSIKzv2+~0ZP?*bH z*;s-mbTQF*lli_*TuL8#eHq=CeM`mC&K?r&RV{z;6Lp&OY`^_1eEnG zK@XT{pS0%PpkFj!=8_NMf*-5-gCD?%?@BZ5s(quJ#8Z+>&_P|LFX@M?H=obyk2L9v zh%S{Mds%D-+u3>W?PyiQfOphU;$p22&x8SY+AQ`pNVX`C)TO2M!4msj*vG-%5!(xq zj7<(Y8wv0Z@j#bs(1hb4u4m1EJ>f+&{SoC~ZLz-LO6Ec{GBqq)c&|D^UDcj*KMwW* zEtqLC_5iWY0!*IV*VeuUZiIsl(Ij5=q$<@FYeP~P;WRtE$$g_1Pk@mwRR^uxjO9Qr1na7M=rzRvTw+! zK1(O`F`uo=S}%j+Oh>Fe$kj&7$@n-vSV`@7MFd4Z(^&9m2oEMK+aKj z2}d2|9rBNMM0Co%sr=UykJ6;x!%NVEtl?RD3plYxT=fpVBOLN*EfpIEcQcN2XGKl0(xylP7+AcNtFcTxTYqX`cog_zD@V zwu>~z#}E4TJ&a}e8GovmU<6H~x1PM+v>&C7i!Mmt0-DqY#bf!$q(C&_8G zXL>Ie-uLwe$~>Ik@H6@M`>kfzZW#GYokTAH8_6K0gREq{K=RSnQ}=^apV?!RpPR;@ zp7@luaFQ(Ny|35NufvbzDRvKN=eUsF)IH>pbWis7ql5B{T!K#mn|0~VuwE@1aD5$| zu^0av_x0rIHvEVV;Y2?ly^cEQ+b<^@m(Y#4`+vriVXCsMX~s4-3CpwbSzw~3RVmT*GnM)$6clgZbz9Cvuy zUa{)_F7CIdZux2X_wX?~ZFnzr5U<%@GuvhON1m$>!1Hb55{}!amwUzs@PiCa_V>?) zF;G3gZ#CH)_OEBv(~Ic^JO)OjnJu>O$iMF@EdElPQCo*`;dg{@-VP>un`3>e?K4L8-Z6P@0K3@ zRr+bXL*9};`4;cXZ%uu{YZHCEJbQ-~oEZP4zf7Nxc;Vl};;gfIG_cloN?YREQ2WMT zwLYHcX*5oZud&aY^l5wHr)oAruWQ>#whPhs#ZT%xtNlPWx^}SAP6Q~Zk0VUNZX+=A z(+H=Jj_vEc`tJ0?8hqpPkbf_%$+K`$e6?Kq!58)3#?&t#lUnz+X!hS<*dJXlUS&N9 z8GbIut-YgfjqPJ=BV4@ZZ+;@}`h(a&^ydtqp%&eD>AkSJZk=;{Rqlf*4%~1&$fVWr z!s$WuV8ZvO`@4iiEm}mY+2DIZr}FF9rT6IO*vEI*(oooMrX#T7hwU|`C$|<|ckR9C zb$0mbt!vlxm+feslYKhPHQY5EuA=80C(m}nHE{^@PxzU!Eo2jQZ`SMpE6uBDyG!3i zbM=1j#lBoP|4;M$qS_J@PPO~TH;k1xCUKYe4{?M73KVQw~7AK~2HO3X5 z6*tCxgTKpYyKCP>GjlBTFMRsIjd@ydyGeedZ6#elt-F3NoN&>pS#wtnGx7nB^mlyx z7ze#sl2JNg>*Ww}`Q!gxD#a6HrBuhw6rALqt{%WLe<`!$O7MXh_mT5{&T zFRmLnxAA7CBtUT7gXzq_#?jryAxf6YQ7tABrJc*67v4%%$QQX{8dCvQ3@}>B3 z;Z@eaXdUa*#3#CM)AeZHB?F+7uV#!rH%~cXFRKjhhNDdVDvqM_;y!>DlG;{oHi=)Nen2 z-QQF?&l->Dxvu-H>H6VorS1E9-uJa=yzKpL&>T+hHqv<7IK#B@TrDo&U$yTy@lI*n zL|iu=hiI#X&rPS-jIW766M-fIO$6=+0>1pe?)}}!!R=9T86J!s+5T9!K9)7I*kt2* zVr6k!>k6uczddRjA9FZ=>{&>r`l6ftu_MOqazoL|no6y$47;pBXYCW=z%CqT<8yU$ zDf)R~445+`!)v_5c+~sMI(qFrQaU$BdE;Ud?QV_N@z_Loy>h*HT;*@0zt7p!Pq!m`xvESu`6ZHWqH5uH~8wVkE?*XFyd?;_5fTr zpEu!udv2KhXKrsJa}(HC5M8&!8P|(dw6MmVcIhVa9FBuFv7UC3dam_{%O)2^+x2pE z^S(vLnAsA!Em_UJTH@#8K8#`bS@H^;wAULtZ$9_+$0(dwTN#=(qX=?o;cwt z{KwZ)r_XC&f)ErwxU4tj{II8yOYq0~$=C||=4BX2x75B(`DI@)dYPVa#ZU2EJV*T6 z2PE1X<@y-W-|(NqH2d^dyU+CJU3m2DYTxxvvWESBP)@lfOn| zME?sO5>3I}Q!uA_9XTbOz(JT)bL9^iCH_#}<Mseh6s#2LniI)+}vnuG9K^10Q66noX#tIvJ~XrSLHy0llBJ|uBauA(3JHu*~F zsNBdGboqJ;eyYhD!oYuFET}`$dEl9JY;S8}eX=vmGw6^Dxr5`K+1L(qzhS!v?2jOA z>LqE2|3tIz-X=!GOIV(maGbvTVp zpRjG7FitwNk@_W`l5JMSciZ>~Bhr&>gckT&?GOAddZyPWbDS9*#)Km{jCMwLFDNrGL%z!2 z_*B;g`*hH&Z*t)k*83n^u!C`38&F^bkAW?5Vp{`zxrcAX^SI~^N>}b};N};4SW1(^Cy6WbEEX@rb-U3r^Un39k`i52Ne^rp+!8 zbf6m`6B6AA&fYZd8i9|}AU*z&-RL!x9pxrn2!2}5=kj5GQaHkJJ}WXs*JbS)vP-gB z_)^Erwoe~23D=iz+)Jj@p3*N;+R8&CT%{>lE?rtW3-W1kWA=hwm|A0KiVHpy24I4n zC-`D{dbJZ?Va_FNe@y1mq zw+IgK6BzmYAo=X4!+pK=mH5<8L7t<#DlX-r5w6k%BlS_R^Q7^ycr2O@*E{qH!l46H zD}Vo;cyDKXVrgY%(bbz2uID;}aA1U3c&+8Ni@cohESZ`W{A zoa~#{4xz4B~!Ha2~Xf_u{2a_tE`r?%FYp?-R| zeJ@&RTa@RX|$$EbIdJ3N&$YpZILy`bTG+*~v1YTw zws&sR3|m=S4$sOMl=bf_bXr*cZW|-wR~{uVM-LXW=-&ftiMA)pIN1AZ_CBKERmq<# z_b2z3A&ZnJc*4iY>_D%RHasKSoQ@V(&-eB#X_swJQBNg1X+somqj4fV(q=y;_#Mtq zZ4KqJ9Tj?Ivq1a7;W@o?F1G2+9uXLVTZrc<2l$P-O6r{Cn!^UJF#m!5mXJNSvfUBn z9peP(ZPY#0X=rW4uR^EMN_jIzpna^2^@g!fJ*dkjjpb4M(EN15_iHvTShY;R{}MZt z#M20jNFz)$&$QdarV1SumIN$1HjDcAAkgUUXApH{*& z`ls~KnbEDq)96#wzW{@C`)lY4m*R4vKHA>KGQQL`#jP}P;bZa~n~9G2@k)>CPcGi~ z=MNfixmWv6nn}TX|Q($;r}nH%C-mU%1Q$2Kzs!-JGS`RK`l^FOv>B zJ86Lv?U+0JtE>w^6Jr(g>1+;rhmwuY3oFv)PxEc++oP8s59M<7yZ8=Y)Wbi%AKE{{ zGBzw7o%l765~LiowYtZpZS?2HhdL%E&H7(&)qGN(zn=Yf&ZtVOrp`+QRGz1iDz^QGb?o&)_fmg+NG}oi1>ZSFXnD-1d&*I^VZ`F|MJmlicR=N_wC?j>))$ z`0uXbBf69~(wi&JL9ZxY*UvtxnH4PSo{J$Ka= zPUJP5x0`%kTAA#WeLBX_l`igG#m1)#I?>HH`fK-zZwfEkfB4FuU-4F^5mFKXrasot0Sf-f3Q!i+wc#$2ca=%0Qc`Kd4o z$#deM-BX%(wXQ*zXmsmX-FTck>%sL|=!-Ew;^Rd>8N4nV*Sju;(z)&mPQpa)1)Qvp zU&&v2Oi}*m_cLb17`TsFVK|ZJg4Y-)+1$+SEcZv}7zelxj+#Rty}N*w@-6oqCp&k; z*K@qFGS)B4zg%P(^9b-7*lCZVcSk{@UCwbKc=F;b;0Dw3Tjctc{T}9ssY^o6ozXXNL0@JWt#CHQqSBWNn$J zsB^4aQds3%&sVv~IK~2)b7q`-wKq1-#riMJGlb{%l*aRP!}&7%x>fD0YJ3F$%w5)_ z4~FBu&NJgutSM8N=ZO(%i;loWE`{bhOinr7&znDCEhShf?6c%SafDsQpIHN?`WL44 zS<<{t*f3p{XYgPw#9el8{8R0Zvi8>r$j^0XsO492k%rb~>YeY_3V&1Y{j{!guk;lr zyqAaf^7E{&(x_Gz`u418)DvE5$*m`h{3uK{SAK57troxD-9-G2h(q-H?oFrb$L-(W zbUL>kpHDmYw~<~W(zp$}n{hS~Xd=)=pou^efj?^qgxl<=dH#0A>@qAEb7Cz%<086v z4)61?6~~K=S*<)-KYnlFXtI;DbZvd_C}(PGooOxiU@O0fUt53H%K8q*@xV5m#*2nm zn0}sFhe|%{!KD^n;rFZwwe_hBm9-kTq}$&H{ys+V4rkA3UqCpYH}y>X{gxJK-$tHp zI!<9UKJovv_pZT_X6Joh&kilJmhwd+%Th^B77d`$XxtiipwVb_<97va_;Mj+~M|h>~5ER3$aDq#dW^ zB$nh#WfM`8=Xc)zHxAxuU~roTh8oQFp7WmfT%PBDp7WgNT;D-=4(K{%=V_SIj#a+z zUN?_d%}=zkhJrqM8eh-iz0IFj&$WskxmV@yy3#`rdg58NvF)zavDMDtzM|7GM%O!B z>{}?pN9~d4>*DpY`G_W+5j>5LtAyuTOYR;mokKn?FZxn<2UX>p!mO*>`b>2_?6N#w zM>^s3G#+a4h75EMG)CzQYrR*P?gFzrB~G04*L%6hoaoWnGW5Vr@39k2xGB3Lj=jDY z(cj_=yFt9xa>tZV3OH|yrQa}B*9+Mnhs zJ+eSt?m)o5w#;U^`g7!)p5Ma1Uo@`DKn{dOE*0E!p?7|}lg!g5 z)W#GKK37MR%ivHbwT^^wc-r%3rrq6l3Y_lv|AkKsNV z*-{%CI~X1khR~`sxU?JO~+qC>3o&X^F{o$KV%TRMGr1>Ezm$ep!;q8_rCu;JYOb`Uxxh1 zw~v+dRNu}}!oQb}_JFP>ozCiA1eb8!Y-^j-fuaMqXDYaFTs8u2E-X)%;rlXae7f*s z?}CBamu$J=wvMEa6YurzymvQ+vGJd2Yw8=3p{4frG4e(C&>ted=%Vmk-eq{cY8r6z z`(w4OwyBAZT)SP*9J=RFw!`q?#E|+j`ZIoW3+bM#>MC#qFX+Oqk{#vO?NxccOnQ}1 zUxK`-PwU@pU*!zt#>!^(eo@|Q+@W+~mwwBa8TvouhP_Oq@tJwPd8_;R{CK{fHZ7gS z9GJ?u41d>^Ml_(K7$Zn;+IidwaN5a_=G7i?W!LbHQTPQH{c7?@ zxY!?Ro7ctjW%ChMa+9&P!LfAr!th?-Zg~8UUL_tl`Fx$`$KE9VN_=9Wm`EoErxM#d zAFS*SoR)@gFn8tHoSonHF3aO}q=O#*sqWh+_Z%;TF<0Wt6Z#&T0X=)3K9Bn%$%pfY z>dR<EzSKMcm`P_a@50zweUi^x*iS#l zIG6j5c!v%;NKVazDbL)25!?Y4tf%_xE?432I?{?4<_U$5?@Fc|AEsl%wlQNc(Q#Pr z-pm*BZro2>LLYO_FZL7Zvvcc3oz0M*R(#v9-o_q(yGz1-8-a3txm6iA^b8xb+S!)qaveU?eyxiQNou$#aSL7FY7M?eS zkIEI_)SZu!KgYw_7M*XQZE#M=?zyPmmx^wqeR8%89QYyY=6r8*K3o{#!V7%(IviV4yalw|8MDefF!=cA7lV29+PYUb$puTv(-Sy3 znQAGKH)WCrT(!o)vrl(D{h}Y8%z6_2Ju;=a$`f~2xI23+h1Gi%C!IOt?9l9_okz2~ zKnzd#4Cal4JAPCSZ4EgCFJJGoet0vRpLU9TaL<#{YQ2X!cyxls3Z$*4EKydNUY<4Ii#`?2&NX@A{blaS z3i`2NT|)f=c`+w|ZABP;rS*n+m8pBOSjR!eRewIs^}@?9^Q1pzI;iPjx??!IS!%X* zq0ODeLM}!e`fc%Y5m!1#dXIh%+g!F2b`<3(Pp$WW4|+=do=<1JaPrIX%csqaAMB=i zPoIxnN!xHZ&7{rFIjxH?W{x{R}u7MHnGt+Vr7FD#x`j!*a2 zSpT5rfc?JdqIVri_M~r)zdwR4ak4-3%V!OPxk8PbZWB)6C|c>mncw7@vAyPzF0G%Y z?RGiKtBSeo3v5<*hu!hLx6Bjv4lbNnD|}iV-^6=iC71CTb0R!nuD|PuVt0{V`uK#s zYHfF5x2ZZ0u5#tx1P13VQ#9hzck2#BH*PtnPEwo0l|7_xIrPPdP)jv+d%t%nA`bVGM&GUl&*Uxc{qcVnLg z{_CVybf^yW?7P=l-bM5B>A)Y1=NYRqc4bX2*=+NVuHWN5Yb82s!ShASJ1u^gj#|&B zrL9+ZEt<{>ldThub5(l7`T5UR&HFmi`}EZE`(@O6uP{H}Rs70N?p5--&a|Qj_i6e1 zal`(nrM<{|<$aMf^@w{Oj6{cckgM<)?h6E7An*c#7YMvS;ExLe>H~fEj|=ao@#$l6 zUjJ!%eJ_Qdg$46=?5DJ?D4p#0Txefhva=vlHV4Pks4xx}d0xxp+Ooq3)%z`!|MMbWqE~La z?K1@%ch7=-YxE*moF^`LkL@m0=P)Vvwqqr1ID3a)q0ZUEeI9w1;+J!pUwD8kwg~a27LM=fQdzjf_49d_So!7Phc@gO^a%3p z)5Y^?b|v!UpZ%(pZ+doca&j-*ywH{(TC{J&t&X-Y^W$u6YP*;rjpT`Pbzc{@yHAJw zyCzd%oBmm01#OhYch;)BRrW|C6JeT=3+Pk0o%xKZ%_u$Rd?r(ECH9=_%>HS2I_U0$ z?d2s~8?-(6HU^T8M^6$)etwzi9W}XMquUsto!bbbx!d?{nMf z3TLOFUnDoutGXXUY18qx+(w68QD}P&e7?`)2OGZ2xS5F`^h^&nk*D^mP;X#`?8xS# zexL`sRKDD2g^`aF^6Sn6hwQlY{NlE7l01p7*@gBl^vY%M5r*OKe1Z{YL(pTCBdpL_ zJR`H{s(RW_;@7|1f%*e8jT_PnOZ|Ma6|AUN(x5BQJ6FL+IHAMQ-($NidGgf#J%^>? zOeVhI_IJ>}p{rI~tA`8;C+bH!QvDfYU*026%b9|cDf(&J9Q`5ps31%5M*X9!d0t=2 z+Zo^Hx$F4(STVOn`QiDOdg25g$P{$2w+$Q^BM?3~bTBY`*ijwl>5iVA%x?7_XW=au zeG|qBT+u=FfyfW(!*Oaovk#5?TF6`dn`{M@S5K_yQ>1^uina$Gc2~}1q*fU!AKj!eo#sjO4%%fu&`%Rin>q~}WJERtvWHGW-z&eTx#$6OfNXKiLy@i) z5A_HW&Hh-ObpwSg2 zXYo*vccMpgWauI0G+5(Sm_PPJUa&=FC(s9ShfJ|MSC9+c#F6fy|H9S`a9hvl4k+1; z!5Q{=(e98KbNjH}UiFiA{L}-Bv&s-or_GCdbJdG}Ju4kpfG2GgocO6cY>D*jgd3~% zOl>*4067#+nm4gKXEyker`^NS(_T4;ZFh~ds~qKdQ?BTMCuGV05vDezdsW~=Y0h$K zFJK~>QC!-ZaH8$G@XFjEy6NP(|9DaJJU4}p%7sp7_wkWmdg_G!sNTQUm~%W?TM2Zq z-B)MxSHYR_)9+zpY*fW5H0Or=NS5SE&Y)8?*V|PcYrGi-ePGrQlwM;O+wdEKra><*+!3(UbQafVIl2<$@XQoH;K)FaJJD(Oqv> z^rBCXZMwvyY)Xy$+#P+UTbYwm8s^uSE77y!_&lEQbN3bP(j+lFf2{EeYg_c2$=%Hu z@~HEEq^UPHDo^~?a%B&Manc-~KfYsJOCGe36S!3REI&;Bm+FK*LgQlHgS%hK%`sN- z<>)ry1b)Iy`bu+%YIm{`u$i=epgAJ+t&d49zxqneJAe~1>CX>HwxH#<*y55c--SNv z79FMefx!Ojh^~%xFKIs)V`0e!X=FFl!bf4ki7|=lq?XGZVY;ogZO7&aeY@YM^QQfx zn>Hprt~NDx&_9G7>Gx9sMo;$V!p3*i?!ZaoM%R~OYgBX>W1_{((k|;5=tE>%G~wPf zJ}Td*>DYgK26nzs9s{f6v6**|Z4I4t0;kHj4V5}(BdV1)ocvkKuq0HNg$7ysyGjm2W9mDC) zx!g6}4SBZi*E+&!^xVd9$rAHw(05So*vBS+s$5(|hC*@8UZ~nmw-J+CGzlkM<`5JI z*?Lx3u}?yEgRbUs$b?+%c)m-(H!X5`~Mbq4i`1Ir8SNLslMIW}N{NXW%!mq<+FAIA-G^c!8 zp0@=b(IGnBI#cETet6KH0lh!3t9)y@$^)#}JLJ#(>YdzL>FXT^Eh#Ji4i{X9;TZTah; zALlmsMVDOWB5Tb@>V4R~4j!IGp4UNFIFB%${xfm?=deGV*Z1;sn0KCiervr~m>=(t zgI|1yF%s|od-?V5kDGfMMt|IJc){-r1YRKU0)g*k1k~4^$NgT$p%!oF!Q?z~YUTaB zht=Y{tAAjd@0QGr%-U9*zG?Oc@LL*f-{L1f@7Uv*n(eC2&-nR0@7O@U&kug)JEr&3 zskP2rVz)H9puMl>b=d>T9v zQmr!!Ps8E7@4;()e(1y*?c0u*kCDxPkI_EP%kNd=q2pBkZN^D7CO5Z=tZiOK_nd|m zd2uH6wD$_Py{pwVVbSBeH;tcYVV&cmGK9|JOoMo>8@f9!G4`X@Bk3oGFhcKOzwuXEwWeZTFLHmUF0)3(3^ zoZ$%`>F=xG>o(r_M;LNaIfIlB%b3ozvG>Zyki4l!Kfh;ugK-9d{L|EXoUXUTP896HZ{?JZa(hlRXpG28{gU1Hh1ofbzRO-ALje3_d*;LcL%xiLBEOC z?S0bw?F+1AA5cfGuB=Y{a^!!O7?C&SP{*oA^+zfnSMsAi&40)DrQnfsW?%u|J|3st z0}&3ldqbMY7di3uqHIp&)t71FK5J~0zxYKzK!bkNoo}lMC*G@mx$gs9xc4H=^JSlP zXARhh7TE{tgC*1T!buq6(oey^WC~s2>qs9bjqQ<}%i`guE99F~8?JX2JX$s&IR`w zsh#;UOxb?@Ju7^auTPu&j3=Opz6*UtxcaZue73NY4ek^}fAbEVq&s-n(}f@1d>-t; ziF^8x5q|8W;!G!UB|XL5mioAGy-~h+sh2C9um5>+U`D^@GyN zMHbG3)6?S6Pm-s`fV4rzLn^0U*!bnBY%q~Mt#+n1Hr&>cwC^BS^}P0N;UWvEnPLWc zV9!_>1N6^|^@Zr@^R`vuK^HnxdR%3SUZ010_*Jf4Y-Gthco9CjFgLK$S>BY6Vy>5P z+FKYG|Cu(VHmv-?&5u*dPrJnaA`N|r()w;au<^_A%LXH1fy*=RGYjQOA1BrE)7sfm zd(zpWOvGb^6B*Hucu!$(9V3EG%g=o>|dD8v>xak`T{w@ z#yrb@vU?)kxPGudvCWTio+eMolG2fXb>6_z))SLjWeKOb#pJZGz?Hs2o+i?Ts_n-+ z#(kutZJj0)@GQ9??&My&xmH|c3~c5W(!Kp#+tqf)7)pIE>1)wm&oJTS+bm$AZ{BuJ z1$Uy--h?BVlJ03b3ar2q9QKN%N#{2`&6p1iPupAF)6%tqUKDM&2`6kL;UGKMrxW>- zoh%(iUxyyTezJaT20wB`-;UjQ`rN>A&eHYNi~3mV2CR-_-5zjQm7Z-O{IGD|aF=S4khjSduvkwQ=$Z z(_YVK%IBZjlw=C~{8(=0H@G`Y`^ITc(z#$#?C!TawaaDB^=Pb&{y`6sH~N^fj_T*N z=H*JZIYF2A?2yfgr<^UW`6g(Aj)20O#|d7cN#hq`rSUoQcK$tA@bB9>w8fp`>L_^e z(|n)!L*~Fq@&iuNONp7G>iuE(NfVyyk&VK;ddiSr7G3rJj<@f28-?yX0 zSKCayiTB_sIbf_W-4&cwuzURM9Ha8_UHAsS@SL{dxcdMr=Y$i}V{T1~c>>8bW2u|e z=c3bheVo*O?3~mJGR1rW{S@uTUmN0G^?a+vP0Vbh-5fhII5pwMYJM5=(-z5Zs-q*L z^t!`9^YZ9O^qOp2rLC7NsT|71ukz`ORgbcN!~=6Iydyq3TlVsqcVvN^m4WO@7X7lw zi}?tZk(eo2?BjWP-)>Mkxum^`Kb4Q%fCv3IVSc-SAMl!NPgbx!z8gxso^YMc3GVC` zPT1wD1N6R+liE0a12ky-B--TO1U@QLG)U&Pc6p**RrPJ4i_VlK7dMb6FhZwM26Iv) zv%!6u*qRO}@O1rMaITiN$ULg#Ni^OTS6E>as2``VtKLNfKhim-b5F=lMHl;F31=4t z>tDXDO*yi?f_`Bhi>KBbKw+r-MvPfQLNYp!97PO?{V_+ zk^gBpsV!0-dHUrhV}nEfIPbQ|lIZYht>x!lu&R93kRf3dxJ}i&#HEvhd)p*GHa0SR zIHNr^I8^hDt51Vyylt*eBjbw8+ykZi?35R}I=KIrJAeY2T#3!hZ*Hzs=bwlR7D^-c zw&CN`BN~IYcJX^coIP)R>!00YzVFMNozLFo-nH%KZ8shyo?rg+&#ye4)V~*zlZ(Vf&#P{pC#*zs(4RlscIWVPcWwlwK94vt56(SS zi%aEHvUREXA~JH`xNclm+4lre&m&IEqcEQW?fc2yUDiL(%YUtSJ*|ai^5Bj!#=^>* zIb@Azo+q53Rc(*86V_I?R)&X|6G6VGLK}K2E|5mpW&x50B#aye=3cH|vItzfR!i|2*O({>2A-;xzY* z%RV4@hIiJu_^}qivwo~MA&ab8D6R67%UTY5>-4O0pEpJ+uJ`Ou2+Ne-)k=3;!$dQC z4Yha2-807ArGB>NqIehKLutUDbwWM+?nUyu$+)7~?M=yPx>BHQ!HW&TgwKH?rQj z+O;&A+?tp_`7K`MeLFcnA64Q(F4)X34$b&y7?|(A=nqVnJJNgFFRT2|N7e0#CA#JE zO?STEa#1|a6CccNJ;$9_Q+c-siPI?&t+<^3p}m}k->b$6_8=aYemaFW|3*|YXTrHW z^vhNGzesw%10x!I_vVo~NddI6NAM#0hx0nMba)sa;-JsN;o;}>?DmQCcef2M(Gxx| z9OlD+=KL43hko(HYx#-8H%-o}gXx9fd>XW{u8L078Aj1}vS#b|r1IsmZ=1eId+uxT ztT5f>qjOgZujOh@(?2`r#|!Hx|2(dLt{OV)hfYwEu)z&~x7_4p<2*WCd&8gB_H-`- z=T>}tD<2=gIQl}|a+PvprnKgv}3;k@dJlk`RPtgC$|DZ$ThQXA3t zq8Hj1m%tABI_;beaamKJoX^JCGqAF_F}vE)zQp}0+_A-vXYOX949P5*AVY+O`vuCa zH%5MWqpgi=IzNefavYIbT#W)@^q^cF!o@z`%9~nAjeGwnC|O zB+UCop2>rJGsEe`W~tfTLkBK8tAz{+CtUhe;@1nOT3D%lL62}67;akJF7@Y;Gw4G{ zT;{I6)35_)^6ehjHl;SVD@>%f*>{hgLf_NRXdiw(aq_X6oZmSyexn^ge>zca11HH7 z_gtLD^JT*Wou68qJ?z*QPPoiVKtrv6H-!`O4Hnop)S1pLXGRJW-~`>!i;lW19<|b; z$FzrPEZu$L`vJA|HZ;^5BVV4VJDmrYzHXmN?B$j^%EC$gGVKojaOJOsL9MWz&dnJ2 zi=p3ev127K>5;jC?R@`+WQw*fTkfXt@#{o%;$r_W--sU_?&G90sA1a(8y`INz6yJBbvnPy6 zt!LyATR=9HyZ@`da;!c1YZ4Uk{@Jmy{0#(jB$PSJc5u5hA{V|=A&-2R=$Y9Az< zhH&nFLcf5K_?4S$4ekr|^Eu0w;OJ{o*=%ncIn5JU%EWkzUypF#!}>sTuEQ@TyJdr z@+hBw)EzooV`AC9v_;udvKeSA$O!3ZgW^{%dYXQacVT%`9JyfV+fZtA*ecL-)A#iV zE8&E!OK0OEU%V4uv`gj)2tzON!_OF4JmVr~np+@kW@md5eGaaSQ_$PUBf6e8>f1=z zwYsxFb5Fj`6wNo`3Mc6CapL)yhrPmKxqB-=I_u65A}bnK&}Nt)L9fd`0;l7&D&Z`5 z-mS4DV`J{VSK7U3L8c_fH-QgjigIiL>JR#u?}kRkF&dxSKKkt8>S&?3I(InRmUjJ< z($;bZ28!LmU2BV@$f4q3^Go*;W_KH8?EJaiSC)3NOBga3UXzi&;{8ovCHm>-WN%BZ zq|<}@FFK+t%cFKbZ}5j~X`KxjQ`Zji5?*XL|@<^CgVfLd!8 zqNUzA2_Lz^{C#j&j^thTX8UYl^1qt8(<|ptUFMAyxOK$++9v?y`jQiI3KV< zez3uOdy06-YBhhmgND4@Y^8^Hn!{APR=yg`=o$A}V^k}Dl`s2Ax)a^uW5nG$LEOE9 z-Ho!%JLj6N5AdsfpP%yII9%t>Rvkp`F=uG5Ea(?2@ zFvCLe?Czfa6Zlozr`^F*#WGkMR2p35LT6=r_xcmnJWOBlp0=jBa(^5J|H|iCV{umg zqM?=@Tsh~Huile2(^9JPSHYjW6|= zn6tYrW0o*(!isuCp3u)v=xAHlQ+pGSwOn*G`AIi1e$m_j*irU$N5@DtZB+*6^UMJ= zci`JvVOnqUSvbkXp26BawNWy!3s`pZkI8fbT>L4KAGPN$0rSQz+fdhZW5ET z$`*aN%mHa^YImO;h_9!)>Jy)kN6QmkzP>V-5AtX_0Dr$s=Dj+n8+#RY7Ogk=PV~uD zpKRx)E4-c5MYS+fKd*Kd+{5Gbg>G%0wi(#BU45z9<*C8yIdheLlQ=xBY-m&*(Thu4 zs)b3-uu9*kxdU)QuLbxWt6efgzj0Z1J%Ksk6Z0Y$lr!c<8OO~QHYXUv?3FfmkQe4$G~fQb$rAKSp4b~feG|qX{2^n= z0>7}VIXrB<%iI9*f_<@@cFow_VUWY||H0^ZuYFMB@!RLeC#)E=Eu_=4K3-uiz=5@_ zaJc_`kSy=9rx#tsI?VAH=lRk}K2P|ClkYP3f(&TgfU^bsm=|R}j_~l0xm~Tr`+4El zUIYB$@}H+?@x>ab_5~>HI$ZWkDWB&Fms+&K2lGlkPvR{Y&)FJ^%}@G2tveC#v^;sI zwfEEF)k=F?!-R>})%A>f+V>MQA9Wi4%7b?2f3y0wVsIY1#FOumuKH~2y}^3S@f<<0 zPH=J_K=DytFvRh zc>4l@7YMvS;MpP|T_pF}mUcUH7w?yKZzosRL)Aqw85nHoWiKi}&hXV5yD87>q3~vN z5ifGt!(wNs2AGRv-_LsIQYZVD+5heTcC#n%kJ>49&#;$we7>(m`=OMl+?(a}a;1xQ zx$K_=n=t>{Pkj-WJisIp^w|;sJ)p~!Ui`tA8$ftE`q~F$2e6=Ue7=-iipXo!P!R>>c8g%E)kS{+De)>$`#;9+L3+6ni ztMj%u`YQOsJ__^VKkIA(xGJ1>h-~=s;-7Q1JE$B^wq?J1{|j5+>4VVIKJDlAgGV@TKP~6b{I)4wN1S@#Lm8rnGndu#gi{G8 z_t-2x{nRshR%bnx)^|D6$+>FQb@~1qcdzI^mG#2L_ELNM*z&>b6#nVdtnKZ!a~f^U z?K{cgYMp=y;jB4J4#WDdf2-)uE7Sug@khTwTS3?KOb<3GJhhkI7yZbN!f{!*<@^&^ zaK>k^IGQY$=EnUq`cLz(v@cGR7dYuGnd(LTKJ5&=h(}xIJ$h3%)U(FP=NTE1T+;{X zd>}YMKkp<%@W!1NPs89m?|qy$x`I26gp=0fc~&0?Hpn!xCHkKwPAbE9b>0-Z@beCw zpkK0-o*g;YJ%(ptR4Q#&^YC%vP9tH2t9qf{c$SUs)BG$kB5%Je{K&XJ#-;BfJUz11 z5B)mZ$yvj*FgWWSY1Mwnn{N!Fr(8MK?iQA(s`vPvz^QUxnJ~#YY54c7aSCI_To82d zqm8NUa|RBa^vt~<+lQ;o=wM_4oy_xD_~>0`F1TApJfiP?c?#pCGm8Fr2pdi5>w%HV zP?>(4lP=IZ-8~GS=xl|{HahA*dD)f6`jNa!yE#*i1o?Sk9-ywBJ8R#R`p)XJ3 zp&qVy6;8gs=B^zuP#k0jdE(9s?vEKCUf-qfKkaTh;vTH*4*2>gjH8d!Oh>`pktIxI ztNUX+=}l;=2RW_h!RJ)cDb<5D-)U);%~C-C!*@s0F(E&1@nkVo_!eZRsP*U;9GIc!#yC!D0G zPn)Merj(|hxYQ~OIggXN->^v>6_4J;w2mdeT-cc zo`2z9ZJkRD&kG12xi@8NhU-AQ*%{rF_w*Q6!io78&Bb9$&`#AiDSg;Qw-mc`g+*)2 z?w!dF_qqA;PHS(%2p7GjG-2B7`79b}V_icBd)m{Ci;U?#YiZkKx$0eP`^kPcM}kao zt_A$4dyRRD-ThnAbI4Bho-)JA_TalY8^*pqCa3u|rh%4vV&j)39B`rE$LaXKqTmh- z;(!PJ5kH>6Pxpx7nmy$1rqehC{DU@qyazwHcP+U4!5`0^h7+<$8y2lT{q^#z?7)Sm zjRE*@cvbGy;Xah04F-1?5m!2zc~KuH-A#8gU!GEKU%Bc*d&@P3s)Z4AEVOstY5j(r z>V=J8j`%q_-?LY6d*yZCTIJpz+NHy*a)%LVndA3y(l}cAI=9lVC2W2Q7n2sfE*R8{fejdQ#&BXa+aJ?QBolmw^+0WU8`OBYfnNANDjjVZWY8 zSFz7zC$L|^$B8*Sej3-1C;8mOpZM`z&1X2ADr2i!c9qX_+jL`&Jp8pt&0{eK0B_h) zej52XyGL4VEFUMv$c+D(qf)QYU4 z@@!7OT*^n5vWuHLV8s|m^o8lJ_p|8m<^S9`RqjwjhNPpIyV5=P*rSXYeT=pKtaAPN zdT^5d?wJ|cpxrB8y>Y2k9<+uk+2Z007YrDmRPKfvP&?(_RCBNn zt#PK=BuBElXNk>R&g@>%9jJ>Etfex?h)fovGinc@0!1U zp!pWXzX?3fDpPd%E_SouW}fiRPP*{~{hR&VystZV?)tRgu2%Yg<~rv#+oHlp_pT8} zdB_m`2sXHMH{oZ|d(-bu;8d~2pTMWuw{L6_AKfIJ!gDm}V&M{Y*PAD*^8w_eyB2Rd zMyexW^~Bg%_*7iRGKwn~`SEcDC;$GwjqQo$rGc3|Kf9kUuK7Bpmn&LsvnyKdJaoIy z^OOE~5!(QL;!qm$#4AWgg&%-i_$27!&Qc^1k96S=n;AJKM<(@EKQ5~nA}GZ&6i z87n?d_}mCi)`oq1K{PxM?y)>Qt=(ONJfZ8V_ebCEJ}z8$$2f)NI752;!fot~^uhW< zP;!`_+xmQr)6?&0zY12__Tgd1HH?*S(|X-`>qR)_T1(N>=8rClPv=~&iM^TJQOEv9 z#>ddZngbWa>)vz9_URNYe%NjDLmy*fXxdNi?o#iIox?N8KwoP3_*(~|w&dfne7HN$ z-dN-%%o}4##z+2~%xM^f!^3&q)U)c4@g8F@>O4#f@&E?N1{gAqt%Zlu@s71E=7=@# zqH=s!@%=FT3cqcxPbcFy_Hi;sWj>ZUUF3mz6Xuxsfh9k}z(Z@JjH`q7g;aHIiM(0+ zV~w4C7_KaDeF7}}^6}p`e0+Msv|jZYI|&<~e88SP32Jxt?HI%Hc3*Gw(=W&69QYsvUJw?o`fg#Kxydbe{JPN5w}rSR=)T^f5Zd z<9MCMjSp>X7|bI-iIY#yZS)`WeA4$cT2IE-6YHne?%aK2!5#y>Igk6aGH>$zY4o3$ zrqj}&6|TI)aTId~Y)Cv*ab5_f7J7U1j?`U3Z?>mEVheULf!S zffoq8K;Q)eH-UiPN6LQ_bkw^{@p|2Ez4>@ncdd@0i=U>m`8E=LUO0XDnYC1C(6^fB5Bl8QA$~l6 z-~VNJylNU@gxo)kZ_!QvPC9>2rQXR!uMy`wXUD4YWbyf@dwP@?F0}b)Laxg9MbihA z)uzp-Q-1O9_UIbz3J<%;9C>rbG5jw4to}~>U~9=BI*e~viC(!E<@Yl2RTge7+QR(s zjLk%RbZxEo3R67Vl)_GP)u!n4kZX6=-Ej8f`+DA|8~X!DzxiRF5HF0zYKfd3_`tDivA3moc?7;#%AG(HS*4^D9VcdClS$;2@F2IR1t-%>o z>?YBLyPD~4VJ|oBK$u?CCGEggvCBV~PCN6<(b+7qb1wZbu;m6%YweB_0y$__NTsw4rLRPdtOnoD5 z&c!o%6`s;}H;L0^qNNB9(7oydn?0TXYno!&f{_)6lDzTwlD1DN2_Pa&|id8 zPv8P>vcZvYbRG3Z9R6Ll{ahxU%EU!B>|Q6ghlFQgG`8E4KM()sjdL1KU_-g=Uy=OK z<`{$fbjp7jelMFwW#S@B>_hUy@N;L%MelwDGuj|BI=z=~#Z~*2j12EJZETnNtM~qb zjdY-J!bPs=AEmFL>9YJ@Hk~jL4|?|RR6q}5`=Nv3m%EP6bAJ|XRr&dD&(xN?&oq@t z7sB^K3Jd8+;f4N2&Xmt(`Mqp9m1`gN9bN6%I9yCGE^HjG+Wo%WQ@jHkcfZ(naKD)1 zgWGxZ)xpZGdce*W_tb_S;zy0wQ_ z_f(*B&!eA-C%r?SXX*a*P;dv7-9Ks8d~hGD=8mynNguYYz)HHHUf6`oaah^i=>9%% zox?m$Zo=59E%k5A=R3_#C(l~#lCYrtr1G4PMvtS5&^?-4CN1qRJa54`!O?2(!#vdE zS!Gx6(y{%KvdzzGKR#CIcJj#&jLm};{#rPpuXxAVXmG-Ql6^_IudA6CP@BWmd;;<6 zflIgy%H^NiLs{7?&wVk3)#BC1M}Bm*^1(&_>z(hS-*`V1pBx=8442?vV-X)C<>l*h zjj4GT=AmBC0bO=KQ|0ax-FbpNg>LqFJ7zrZ`ju<#F`*q!hU7PKS!d;f<{LvDyi zdqlRBzg%pB#m+f*2eRfdYw2zuC;a~XIAI>@@htk$OOh${RWR3bd_UH4yo>qV_sjOv zgX$CM>%fV2#rT@s{5x>M_~`kjbrf|W&ckQ$b-sC}qi+ivl=&yd^7KEdU&exro%zWg zB+k~#@DOJ?$e*+tmoNs#2GKVM&O46^uF8WvZ{kll;a1z9>2;k&MbCnje-=n{)#w!6 zlO^7X3m@Qw?(y^Y{n!KHaf;-pmaBG39yg7X!)m&1ihC|(bBZ_G33J%URd#q{hj8XJ zg%g;$Fnh;1Nb=?KbmtN_wx|beTlE*rU)I8;Rv2~_^QWRmZap!hOxlpfqoM(~jdSsRa>IVnaT_oaUp|dm`>2W2T-@#w z57r-8Z=wC^9x?Jle^Jl#9p%ZB_~;xzI0flzt^fLT+|=B7SWZ<>^e4<~Fy{lEvX}jF zjnA`mvC@ZK>;ulaCR>*(?N%6ZUqNus4{7Kdd|dD|{=;s^*7C=JVcP5U9OjK@&F4!m z9P1~KPuk8bcl87^A-zN&hb^wTOKbzqUiNa4iV72`Y2$uVCF&nIv)S<>DVl^>p;qwM~np*H4-!HV&-;)Z#s z=QA`=9xl2DoHSOj`{eph@L8E#AWUsfI5BU>*q3oJc`=V1;M8}!%=ZF6^+Upq(9a`JhnB(-mov}@D2d2if?z}kmk_-2-3GCH&yQ`Zq-bPDtnY+cd zo41D;w}G?9F!UpmPk8rnswWm_l_i?!>vX3v`ucQv3eJrm+f93g&bg*T;wR$=yG|C7 zN6Ulo*@5C=`0lk#-=3Q{piJaR^>bTfrxsqq30G~YI^W{yCE=#MF30j@>1wpol!a}@ z8dG76c%GXI?();vL^RZ*?>2>r&cJ0}Dr66M&*+(x@l$z!94EP|g^$8E`X}6XUNvt* zezysar_tj0x4S&f!in~Tz3yx*(>=A?DD4fMEnIvT{lvS@sg+yRpFIs5|2;U>ynEb} zr!z4O#Y11w{`6z6T*DyN=qE&5pN2-ZCo7uGxbW2|Aq zw|=x8!g$9z9_v$#{h1G7og$oPu61OC{nDw*zP(_~ZR-uJN!$Hw!93N;@pL#3|GA#{ z_+^O(^oBqGt?&!GZZ4s1O7m8HSC2gkfnJ*5&=~rpE(AB5+jF+)lXs1Y2A}Sm@QV)i zS!kcR!Y=08`U+zk>pQ_i>+;Njk`Hq+C-FHRS33N>@2A}a4o@pnSTOJH&kH>*o&R2W zI6Szk+^qqcTvhrC=T;?_l5XaDTV`4fjkqx4Un8 znCGh7-Q6?TKRDe#<$?!$$7h1~mc+&D?jESPVJD@4AN%w>JzZ~p{xgxt_kASt$yXZg z{_~Gi+&|d(M}OzxE0G70hv|R*@9svv*zVyvcL?WMj_@{FpzVwmE z(FYd(iAXN>@Z*(di}Oi){>hg<`Pug(k)}TuA3ip|AOC3N!4FvcN5-$EX^Xu3 z?{7pRcRn8Z@mDrJxEpDE_@nn9Jo;$vLo4TJBUXMc68U)K{m2@aJ^az!gUClBKk(4< z2*zeKs<`1l(U$M1K)`VarkcMXGw#v6QEoYdoF50kE(wTBiLKY9PIg-0ThzaNRT9{t2eB0ulP`55VwMz@s#-H$A9lgkuk z{N~+i+#evnzr^$33*Nob8u`+%{eO=)b9e5q|6>>LI1gy0?!NogUk~cFg5jgP#*5)& zI5wg=3BxdJv}c35`5zr^RyX%skAB*4j9A=1X>lU=jmCCsYh`l{`$**L z>ks=P4;<}7mj0Jb?yW6Z-rpjx|B!s!a}OR_oqy1md+_a{+=K7jz1#NfyDznUV6tl1 zw>cUfwjTYVmGgKf^5Cx;Pmkl)o_0)TkdJcq$ar}W{aVDt%AUU%JU8%cvR=*Oz3fqg z$;!hfON+euajlKr`P!Y0heiYWd|)*BdFSjs?Zwi6-0HXOQ9O{lhepTagUEw>M$=1% z0paj9Wqds@MIJ1He^Vd>k)MvNLC>8(7x{z>vwENoT=>^M@`;FrTmEgh_WQwy-!Pda ztsn1mf9^Q_$Ncm!J(>PzD(U@rum8w#`tSGBTX|2E|Ff0!f5v3TFnefqgS_0gx;NS! z=B^!n!`j~HpV@f$Gsa8dhry`r(a)Mca;MGdkar?SU$^?UdiW;T{13Ec!zn_(hTp@I zVU3P4ydL5A>NIQZ=I;Ofc=M6fiysb-R?cF$E*>6K^0GR4gx{-U^7{7gKi<6m{rA_u z`bUp{;UV%vxh7LpS-Ky{j*I(m9&f(>`0)>Y_p3pBpgvuG?$aPwxhrCQsn2+2LTUl zM}N(po&Wu|qZs^{{JQ6c_M>;9Rs7}Jk7g^heoFk^Z+HA{dbG}wMtNA8kxH5{f9qbF zwD~W@ALSZ2Uo1ut)p%lg8usj|@X(Ak6Qd_0pJ~fWG_im4?Xg{cY>tzD?cxW!$~{%|H0=lXce~ z;w>)Tavev_@*6Mz9yE!M`yEIBQ-!9gT)rRh@vj^mfn5I2=C7uSbRN0>^MovSI^JDg z6fM#`u=D6AjK`{s!-L7d57&@^ zM|V!j`2S+h)jDeEI{K@p(Drvd+Wy)_Xe)OeZTqz43@fAU_iEJPKM2wGU)!_e@4c?0 zY0INZXC!&_*;DBJhDYb;oF5zO&hPycHWWI*bgJ1AX6OC%dilM7@HTqP*8#s6qT#QK zhH~=gFU$X4@+fNbkY8g(Z(AE#e_drGzaKIAr5~6y8{*-eFXhbt?@U)Z*{-|`3h#eUkIh&wda7g?xQX92R7e7 zaW>y~zxv-f+sD0szx!yJxL^6H_5bS+AOC_2%k>=1Rnz=hCCz_voaTPd(YNgV!`C85 z8Iyqz%q88O_j;UMd^Ri>@An+_Tl{}vdigl+h>KgU#Jyv6`xmK?SMEG`^vZb92faUX z^xs;#-|*8#(k|V4CEc$Xh9*-^-$hKO{)*-CtA6~3ApVTvTRA^ZIZbySJZu_wef>|l zda(Y|;{07p`^drr9MVUB-OB$JKfn7ye!Z3aUah448O!tAh66T0fCcgHe)EB0N*@J( z;AK72(YGw@Vcg1(k3S&Y&sqMY{gia%`$5`oR?!fYJ^B`)r{loV02mg_! zzwgr*8Fl!)EPewS`?)*+)@0DqylwH{_2cJ)_Yuw7pO$`6@he@L^X*hiCrB9em z6WFKa(IW%<=U?~JzZazcKP%~9y&KuQ`;nhpw>GtYC-QZ};_KhKXJtP8C9_9=2^-OD z*Y`({CM=(aJiqs+O?GmrY8jEtQQF=Sx53gjRK{!m`#yU=>C@1VaXkOC3JpK?1P%AU zH3bcS%V_vp$21tO7FL^vAE~^HIzG%sbm>mg`2!XwYIK~a_Z+m`{bpLU1oB}xyz(#p ztWR?}p!q%FX7S?YXPoqb+SC0Y&M$az{+iWm#lHEu$a|TiVnl8GcPj1lAGvn=UqSyX zX7jyb_Fp7oA~tsPFD>q$di?ko9y@z4h=)uXkKg()iT_$I_3$T+*Pk?f*B|*(*=WLV zb0DA0ne2S`tHE5rcfb0pu8fC2WO&9S4;bS={2{a7UWt4dxyyJ7d&BHD8*iCz{@wR% z{AXjr5C0szS@||L_(9^|VJvGd_0O0!V)3faR{nkDzViOh812r_7|+Tz+xo$sk3`le zpY}CwV{~Y=IRh8Z!csO~{P4S9{qHNdRL1Ov3FAmN_V{Is^UFcmzh=CS2W|J~BKOCR zzG8T|apf-u_`Kur%stS!`MY1O;AgzMc?#pz=s9|1&+zjdF>;KI1=rk-14;SwALnRJl zR^mUrYvTsv^}RoFfBn}iK61d^Lc_=2{}CIHnC=PEMhxS}RtE1surT7}Y;0)l&ZTDz z`Q9)7;`;qxeDHR|*WR=FqVjJ?zIJy5`WVwf*L}*gIh3m3^0B#+0EIkhQWZ`P;i6jQl6}_nE7S7@iN)kq50{k+w2T z9^6>icxh-hJ{gNw#&hq(r{&}Hrp1Ln#f>(+|09hqFXO!u?$R55jOD6)Rq$>=E`Rj? zgUG-AiQj(o4U>;I%Ky*9q5I_N=9cckcZDA4!%rUn=KnpOS38!=|0ZZlCO40gkqR5SxC-S9#`bWWh zij(i(vH30KV|3Om>+j!j@>}zr*;e-rQ*5l?{8Q%s=AAE^q%STSANdo zeP3kr^TyvJ!}Q@NoPPPze{N;p>9BhEw?FZhADR51LmL|+Kk$L!@qxuF8TNlS6bD{E zFx}GdwcKB^I;Y+qd@yM`#oFAi)!)H0EF)@VWUY*eXH~{*z{kI~u|uL(8KdXG%8OG2 zE7QLfy=QYAPVd<>vhbf;nWkG#=sh=oQjwj%Y459YX7T?9@oUMP)!C!}J(%zP?pOb* z)8Qunzx6TG(RU(|-!c96O*bF;QJd474CZAuCup|9hpm3Rip*>7&yP2E&UkN}70>AU zi~jqMS{w7}viH{R9{frrjw?SK!RGn!H~e&AIxFe^btMiqe3jSAJM#FL*^OXQ^Zmz7 zKh}Ex>y9QjXK(%YgKt~Bxk@~TExN_p$KziQVf)d@gE#zmVVb`Y@cI|eibL6^TOZk4 zzz2raulRAp<%Z(^##wPG+wyy4H2!NpUYN$acYe#+E~YE6U5xh+zhmh>_L3)CX0KR3 z`r+fdcif!6WTw@R6VA87J9Y8_c%Bt^(r7T;U0kE%+s5~IOppIdEB9YDna+<#K76BA zdeir;xqPg_T9y4JU%&Tb$xpxi>gVr$>dT-0^u4!Tp#ATyFW&n?gBRZL=~v(U+`ZQ$ zUwQNOci$Lkh`rv?@W#D2Kl8@Bf&YtdzWZ7w_|13T{>-NceVM#oo_O`0H(zV$dHLPX zfAQ0n!$;Sq-&Qs*AL5gr zpJx!QnqB1cZ+-a-Myo659gF|@FT8vF(w-}H_K_EVUCGbA_10&<{KcN&F;aP|rs-0I z-XKEozPI{5SxMLB2s_TJ;;Ygh%BE6IZ}okJuKt(b{KA{>S~Y$8o#0in`kXvo)Uz^Q z9)JDEUj4#r_ZljMzw_?vZ+@Yn^^0#Cm<{nCk0&ZQTliaF29V01J>Pr#7}m(kn^qAG z(_eVK^8V$$x4zu)+N)oPzuWNHH$V5ehR=NY?N_7x>3#l)$uy+k_eY)YbFTefvJu9O^NY~4se(UYe)<`sC!40oA zy!OVMpL<=Ajj&fO<>y}g3-2_%`jva{y!H8e4L|ng>-XO3df6d!U}YSh$ZHY6Dn&JX z>MuY<*URs``I#@g`ngg#NsYJ-UwQN0HyVQYt(EG1J<;{@+xI^6<~#4+vr0Shx9)-~ z@f+TF^$V|m?%vyey4UZ0-U36Z8XBftaKjg0{mh$R_)OQ!pa1-;Uo3_5ZfGFb33)?L zCC*o#$muvvZ`aFKFHb};dM(&xL#4iHa`?pG+Lzyaw<{7ctehaNTE)F-IaSn31X17x z6^A<+R1sD0qL3@$;EU_Q&0|F1xd;2-Yj50pjf^G($*2|-zz~VN`ughzM(oF(QnPrX z!@d7XB=YCK{COwm0l1Nf@#nH$dFx#hpdT~k`Fg`^Z&~awyzZLJYS084-g)=cx8Ln> za_O@ddD)Cm{J@h?a`K`cC1u*@b4&%_eaBRr&IHyUjcpZO{$wj{XWyC&F$y{Z$zfo$xS` z8gjqqs2)!6QK3858~m%vm3Vv(+^RfL7Ztfuow#?;0S^v$qu;d;^j3wB>NC7OCwxFN zq&geT`yXMvs~aD^iLuyvsyo)0O2pO&2I9S)V=e2kL8HNr&7=ledV6|eYg?m@r z=v<3N8+)Sh_P*3`W;a$EA6}1*4zf4}48$g)rkfL~m>uJ?U+UWUoJjP>do$^l#?Dl{aXi%=U28|K;}i3l*hJ@W zG&*g>C!&qxv1lefUCehh&g>lKqvd2%uH3aaS{mC(l}kgpaw*wUUMY2zOHKXdu8pZu zsXbmUP3G1|M>ccAjmgIGXscxuZRwr2{w0%%_1bk36N%h)@eyzA>1~Ow4aX;Xvdz)0 zM9ajo)rHXy?)K~1OieAfw;b#h|n9f-dis9jg^a~A#;0-hfI0pV6a?j$3I|v z*!%V=pV9R=EpXnL1 zaRx@B>nz zhRvTTC)-n{Z2N%KNv>R6G@jD!ryxcs zdVA8;!_f5JR-rhXE068;mGf!CISH*slgUumhWYyp^R&6`{6>s7_%!U}$d}36Mt3>i zo-*2dEPUL;EKXCm@jh6}4vqIT4~*D}wbrKI&W`KiBep)>-Q3&R-MsF2XtPTM2MS}8 z!{xDqPAh-7oE(}c<>S4jl~SynPg+=dYHv9`kY8-HJKLK^tWFX}UthVnGh#GbeYIyx zD;xbwBQ1-I3tfvQe>3H-{6IM$?=OuV3>UL~1Jj9-erqqWc;i6ky7-9q_9UApVneas z@$tr<&S*Y8xM}UxuuEE9G#SQC$kLe6XKf%oyuT7pbv8xYriP0fqw%)3-La;|V%FM1 zzRxh995lWI`e#p|tXG$iU8>0*M!A;tHV&uB`XpL_5 z#T!#oP3y7Vj>)w+_#5pe=S>-tacc)A|HU0}9y7Tgp4#2+m`%(!74xgBOYP~Q_Qu4( z^1{MSVXWPBRlLLW*l;PCo{o+8G_EfXtuMCEj-+M=HrEaYSIfn`;n9>hSQ#3y`e&~{?oWFuQF^@07M(LZhFnqEzt%xv`TWM(^hrc!%{#igNg zd33&<>loiH4tJym7uwsW5*>4UD?>Y(!P4R3!APuUKDxF%+Ey-4jqY|%we>d7v@h%z z_e=(pCZoxb?RC>#wD+E&mi5%t`^(;*k$CU;fbr2hu+_OxF6Adn$##>gCZoM%{8$@U zIWT?NH-XtzR?!G-IvL8Y;2QzMj#;u0AK<*3ONtp^@y)e$!@0@0Rg0GBrHdZKt0%3dyCx zCXq&6c|I6Vr3sJsp$FnWeTB>&Ke< z$6AW*>&wZ5;%f8c;PiHEanbA&tAkQ@bHw;DdRLc9$=!ugcGY<5Hh%0|8s%o=ZFp`f zmG7LIUnp7prGu5-f!@u`TyfqJ)^N`XVmJt-T1J6xGA~2 z+`B)rJz?L5nQfj;6-{TQM+Ta=mNz?R_sXlybGg>8#nnRJS~U&xiZ`{%7LW=!4;gSm-($I$XpdU4dAm&>KyrRl`Xem=dhX?32OTNuon4sO0G zA2hYx(7x+0Oplmu+Q}AHnp!*i#&b&t`T5-LO44kLq0DSsVyiR1YxL%}GjnZ)Y`@*} z-)e1QbG}q6+dT&zb1S3S<%!*iLS|=SshsS#`r0%M%JatGbSYn6DCc)g@0Qn=7PA9p zJ9d>iw-%4j}G|i1Pj+(x;kMs-;mAeki{%fC~Oig5(*9PK4Gt(=k zb8~Zv{kipy4bx|3a4nR&TMhr#*>bi#S;{Rf?_>(?(6cZ%xZmHjJiEKR)L1AlEtFQR z&6GBc-`%OwYP0FL?vaIs$>CA6@v&F(2Qy2wH_>xhmpn#iicO_bddB)$q6gtW~0q;vVLP|-0EREJJ*)XFOIG5cFwkTZA{PZj;(fY9qu+BCR>q}6^Hd|$LwKg zX{5B;Jypmyn=P<3YprUkn9XGlyUN2`owKX+>851&)LOZDZMkV?et&#(^q^%vu`m@K zH#@#J)_U1`P`cQ}G<|8tbVdhqF}&TgwXnavm>TSvA8pwxjl>g&{Zm^@_8o(cj*anD zcmIlE7wfdP8As1`G)-^x_wP6NOm`M~20C|o``326He>6JYXb@Nx&5pOM%(DSd-^kG zU(RgKB^D+dtt|Rp-nTYxUAg~gS=(z(G>+TcQ`GoL43azJzo_XjD<^8>(x}lKP4vzu zy81h_bNi)S*?Nt`T)tRY8Ha0ks8DE`h=}k{e&u0^D`-QIE@x$zH-k9pM zY+9_Jw=rQX(X>cX z({!RV;P|vR#%tL|00*hr#;L~fsL9WCkJUkM(s<*f;yNY;v_1)Jg83++8Rh=E{2m zvAyzaQ)17)Txs8z-8Efob+x){@plUg?M*q_fgAtz#fD>znI7gD5~gF!PPBQM#Fg!L zXKylB(woZJxZm6XXGb^p?6tM@W(KfH2X`9Bz}6VpuJEx{Ebp!(R%NS~Vm_CTu60IN zH%EFVn>x2wI+A&qrLM}|bLFj-?!oBVcvEaWHV}`lrCJ-K8Dy!s(Js_%O!dYXQ(v(k zWDd}95A6TS{GXL!brY^8Rz ztu*b&r$;6e*2io+RxDj1U&xz&Z8Ezym|vt!YcZ6qa<1$uZ=)Of9Z!VWkG2ROJ1a}p zuQ{5Fjvx1+{}sxGVY-#qX+h zQK8-8w4OP(oz3rfSnF&~&9<5S8v3JNtUgM)Ipp7Dr(E9d8trdcJM6MsYVB@vQv>Dx zLLiH@_qqM){bWCwkT3Mdd#6YIdUqIt<7I!fWXdqJ&-x`PcilP)MQxrkt$J`gRp{p3mHtd_pGZ%b)rB8U)w|~>;@h05 zF>L)qlg+PLoJ4cX{OE^hH0AzZ{a+)Q{t<+;)3LSoVJSlsH*Wn_Nw66CYy@Cf`@|9{Nt+c5HJr&#FjF@B6*ha1m^rI~xq zUBia0&_&zeN1DoCV^4~@LdOvp{H(rRqVY;P>iPQqVy0sQomwrD%pFZ&-Dbbm#-4=9 zk&~aO(TG48Pl;q>Pb|=}#z#{$WAUA=pc|;X4oi!ywm7-<^;rE_ zK8?|NbBveqPPb-wEvz8p4lkFd@epgadNBN>)?mjSW4YbIzRgVIfvpGFnn<6`BgAc9 z%GRJ(c5H5|#GH|>N3o7mVqGBXT>Lh7UoLI*9ojnKOrm#+xtYd5A6mVr-CYY8h6!VR zBX_)$$`0Cz@z&Oq=$c40PVIMQn~gT+t=(Fa4K@t-cB7j)yZETBof&Ve(ew@5`c%Kw z18WY$=GxkhtpycljW>H|7_2O==R5o6Swl55J(zpACN9XvsvH~1+HHVU%ScP-Txl$6 zYqRlWIh$r)E^FAcKFj)4wp3iSb-{efcH`|H_?E$(M*O?hn5@Xmt!sI9xQ)`{Qb ze`t97Fx|7h)YobAXts7WYwOO7ww`HeiU<8A)^(HVvE{`s``FpaRw+Aa{Kr}A1&@Jp zS7~%A)o3<+XS8uVnxxEY`fH^vxOQjlVr^-#R4VQmmVK-r4;$V#2c5NbR-?h@V-LFG zU0war{_f4?jZ8dtu)Ew+4A!BUe@|vyTUpsz?CP8DZ*GhY%#O57mGa4PTjT6@vQ}!J z+*n#TwEC~~Ie4z&&t$2o2OAxAAB!GzHQD-W6Y_2{WNq5k(@Mn+s|Rc2rPQcW#F(l*>C#++N_OqTQx2X45ViBh4!h5*2dM&rc~G5LgT{W zn5|LU8hc@7GSl2+Hoem^*T92i(KtR}TQSTto@oaot9vW!px@O+mi2L4D=!|H%%ejm z3SArHw)`?RQeN#ymAkw12c_1*rN!APTRK>p-WwZRFLW*M9QH-WhHUt1Yi;G^=={dv zRO6WOGrB#}WO!Ul09M3O&`-*PmIi_8hbe+N<>mrP3sNYKS_q z{V+{S={{SB8r>}Cr}}N}W7gJf?YU#4u(Fw6>xk#G@#3O&)Q$8Pd!06yT^`Msa^0f` z$>E{i&Ar{_gGSpQv6$NH>?&LRJEP$`7;&~7`f5BHT^^ZOWi8P3Xn$$N>Dlq(nDq_W zrk>s9_MSvzPkcY$F|wN}wAy?~-qxRt$AW!Bw0R*|&ta{j+vXXYZC$F6DRt+p-dg7u z)A7!&<;j(e!|Y*eVLc2QenB56ymbCY|$^bK8;!^O_Ej_iib=S)oRZ8U9Unr)7%d-|~4Z|l#6 zNm~ar8)SFBl*w9}9qD1)msJ?e?T&4&c64o6c?h}SGKbn$8F7HYd>Dj+I}O}{>^SGCfkR4nlrOA`?H4EVZr*3)Z)m(#LP%jm(e^_ zC^b**kFEAvo0ztBW^3mrN9B&imBXQ(xx_(NcCNTrNZR^yX>-7H)wx*XUT=D8As&kkG;ek$4{ZH&!rIP+ zwR_fa&Fx>dx|&#O%l9v}%~<{QO>B0omm0^f%7vx3b*Qo3-bULRX8l~;c(FZV)^C?e z@!_Sm-r4?v=;$$#_TKcw%Q|*k(bS=Zd8zTi>*` zbGPo_zht~wy_6RYlC7hKuF+H}pPSmw6k;38?JMgY$>oW;uKl+4`Kiq8d|`8RqFfkD zrdHY})|zd6X080n?IW;9uuTSqgI5FsAQ`+InGWXm)ToH8@_FPfg?& z6JxV`o$R;Yi>24p-Bv%gFtzTqr*A{$MHWxekdd6&B z$O=i=c+l)B!>cKZj-p(;5XMx`_|Mp}@nKW@7 z@x;WiHD{xr`D*(WZRup$_7d3~OJyFpI)7($`~GLl2GzoEt}SmiM!hOW- zRsE{^1~a?=TGv-H$)Et-+|898J7$f|;t&+*=5Agm^&8*BZ;+z;|Jo0~zWzuGb{h_@_2Cui?zI{q;x3NpRR($2mgk|(fe-Ixzy~R8&AYzr`Yte?v16DD z|KYySJ&&0e`&8BEVa9`MXyz-uc$Y5z0UP>-`WoC*I;GFL8y}nI<#;x4e(Ta(j`#C# z?~Oll1MI8If9c#Gx#e%U$v<-ZmS+9i7yYL{{&v&-mLLApAHStp|Mo>c(;wzcsq+kv zZC-wz!qDPDCofJ2@3&0_IR|FIne|1EgPf3IzHO%GY2Vm+5E)l5f7CIN|kqibh*a8B9 zLaE*zPe=B8UYKK_bq$_j_*2EYn>}a6fx-rYtpYo@!EEla^Rt>+%y!H4K9LJXv>)8ZYUa3U?#|cc*}})V?E*Ssn*|>cM{O;P z5c^{l8%oDE7!JG)Q1ZS3=QS}0Yd1k!Eq(VZf8 zD~o5^oj&0`IJe`>bvcgj7Z$$qA?%YeamK3R= z_-+RljUDzu@zbQ|V619e*X#3Ie7vmMw^xhit)i2ekvQ&_5w~{!#fJn>^il?6o;BPN z<1R3p1$zt;t_5$;YmQyZN-k6OT4Rs?&^+=HIi#R||1u{rKOPqSXYa==|o^pHn+gtg)^}RcU^~sajJd6_ObgKZfCz; zJ04%#bbp1tS)7*sW!3k_({(J_dp4X)FtoSQw4H_!R|@$ra1*6HGGX4MjfVXa>e z)(j4B-#geCZ<^dGQLnQd`Y-?f|6B`SjJD34@xe97xJ|Xe0`XG_F&5zG_#D+1ayaW$ zVN@ONg6{e;5I!S*6nMrJOknfu3sR|cO7`MXFKc)rh7$0;0~ z+-|WyT(b)ct30;!^c>t){4@s)fw2VM@hY94*^O`~Y$mw|Sk7v88)x7_g3Yf_`9Ya^ zp~$?v&lZn)VNsEnhg1BIi}7KDZ(cuu^$YvxfrEoPJ0`J?$B3`w~51Lqt5`OJMrjZ(ZnADV?{e=JL`EC z9#5yXzOU{FOzRW&kAg-uhnH&yx6P zAP1I@(c#&2(JNttJI^}^=NS8a11|E4>+gkY0seTeCh4n_qg%@Iyg`5W*x#F#alElks0 z=h}BKjlH)7E*NKh5a%&>?M*|W$}tNbH+)^%hX`0F^DG=&@j>9P!qH>={>;9(eqUfKLLTl2`4VL@rumN@w2oMTkK)sjfm}Jo$4R)Jz#PeJ>i*0-Xg>%-s zlVJGi+FB2PR`4H!sFu60#&Afh^6!bV|A6Og4Yu>b){Y*Jv*~F~T!pz+Oti17B3Ng5 z`&z%?n7(X$Ojzq*$hH`-9;vk&cGh5D_R7uS*rHc3s=DDWcGB+29>n2?Uga0JUlgPG z{Y9cZ2h1^W`H@$s0cibSO&u>KYXG1pE)zF;zRAoNhf988)m$v0Prx8>iKF5nbNh zae;RU(Wgkj^PHJ}{i8zNgARVTW)EHGnf;sIqh6|$&T!Iqv#;9*l8cl#7T)ye zJhl((GP>mkn_;~luI;YlL%32e@20(FbI$xFGS1}j=p5kvXRxnxU9K5+rfJ__n7^I2 zU`YJEhL<17V18_{>(F1Y35h@qA3jzeDLxN+x7_uo&B~_bfvHhT0}GhC8kyjNb+g-L zdsJ)2;M&R7&agRPuD-kqk)+z4W|4pPkk{I;(^!6qBFEwV$KQXZUHm=>1s(LucXwsK zrG9Dq_hg+M)K}E$K^yaL^Mda@z`o9FVP~(+d35jB15PB+y$1Qr;01T^1Mv;r!F3Kz zjoawq1a$VqW?|ZhH`up#+CSf4QQuHtDBokFHCYkXuL%vEaV$B8Fl z2|VF`0!)w#FVFLRB^4&l187y(#}D}IHF+-P>wS><1RreUb0>M|f7(g972*88JW8OS zlpyh-s5^F?H;+Mkc=d%D8|Xp?pUy-)((R;BYOER*0O`^*LX)Sg<6C9VD5<3 zhYofwS<4^mmxJAEhsyI&eI1hSyrQ!i3qNv`joaP8$@9e*e$_g=W(*j4{({qH*zazCtXKaV zxleYDv&2{Z-&pN0vH%|5FRMqpUA3n-?d7F+IkvQB-jWl<;yz0ihkv=3Fld9L=h3U} z2ll&vx%z+kL%hUC=dv<#ys>8U$Cq5H^Jeh?3p8`A280A$b^fkDS2bKfJ)23B7qq9p7eEZNzUl9&*>7k+_%7e$oce#i=Grf> zO-!Kow|@WgyZ(QXV%aF96X+wSM~RoU(C16fBCU~m*BkMT+MX+@1K48 zZ`Jj!N4mED)>GHvR7`Ir+n!jXO%W1IQv`x@UeeO<$~o(I-h|2seWpK6%8 zX)QDle{DBg=@;=56gD*&Vs9(h2x0t;pul+Uc>$7)d^rvLhy2n%A^q1shpDeze z#sqV&Hx+j7w~K!9cgw$;OzmtY!|!G^pQ)|<2m4~0)5sbRI_xh^AMmlyrHTZ%i5Q(n zUA10QH}UkScTn6kBlFiYsLuf?dPe0&1Vl~gxV|P+XwF#lq7)_6|OZDTs@-$gkw$Gzzs&M6Z^nt34 ze#y5o=txJ^6uLG6%04B>77m6ZJmuZY(j&9K29s2Qe=0qoKCN*!x|zGjbGwJHbhTmP zRf^-a2IG(|TO2C!)f5AAU2GDEs=33Bx)--A(jki9J{m*f$|kv7cncG%(Lg%v#SFiBMHfVgIy#9UJ&CE@;Q0#UGMj>Bc+8a zZWo~hv2{{Go$F1b(QdTg$K>$Oul}X|HVUZ&%ERq`vzTYGFA851-bDT6`)+L4P4m9m z-6CeExRGo4XcqRKj)g4`{+-^ZuZ&z?2%Biix@7vvW@Tyo*_r$B<^9~eOMj#8!iAVW zm?jkQZ z93JrQ9BctxS}`JBk62Xq8gZ98{@fMdY(CYV-3%C>|8_xlG;Do2ctL#8&Li8Y8*H*8 z+|MHJ9(bDS;H8SLy)Imr`~3QD5sxzlcMt@D*q5(WAGX8dq1Wm z{URMxoJ_c%gKLA>dJzpu;_4YWREHmy_uRoV<6<*E-LO|@!6$OGH)CKAXGqv_pD|#y z?yF`l8yc2+m)ors-QKUy-tCJgNm~IZ{JG=o z7M!WLmll|hjSnUb#)H<|V7fnqvj}(A>(I7iFtD+(TKeYR0~3!6A0NhV_5L&zgo9@6 zwDH|Czqm(_x91!^BPJX1zdxYmHZjW=z_GJJH46gap zmmELr3;kSNHJ{U7Jw?%1a5cLKUXHJVCv2_5n6TPj_H3Op{Xi*viahKGw)UEhoq8g^ zP`$Fs%GNl(p5PPoQ;)3uj52@hpShrH?(o}6#bM++Puke4!5*!S)u^=ZwP-p1QN7Ch z^K7}Cz*b%4L0o2ogW!kYg^G*;`2qBZZ<*evt2ZzYaDsRXSw@Uxhv(sb(LdU;##r&j z62WCOp1<}U>u?EtYR=~y{9$9Meu8+_7Ittix|`c;?DN>er^2FsJkHf4hO>*l()SbQ zO7Y0eng(B(IaRTDn+;*bm2&*LP~^;dIbi|z5%Cesep&?g%s(xSi(M<#lYL!suOH1PGJvIlZ*FqES1xXgS0`Lb*bUE)ACK@gwJ)pr zOuReZ2V;xPlPi2y&IRy6aKhn(3gCzE(=s&k)ciJr8-&k-yKho&7z0Tw6KXs2TaW&T z5%}!r9+n-(ZF_NU}vJx@C^7n~U`s^lQ%g4RJRG`-AIbK8lZ%J>CjTIXPRw=AAK zZ?U~*bD^gf#t-GS_BM*Sc`(@DdJ&oo;$T?kk@M(m@bMvb?JJ(=A#82vbxT!vk;nPW z8!@?I!0R`^ z*s{{L2d!W8mS=5R$T7TtNhvP-G@iW{L(j!=)nX1uK5v3eTO7Q2g*B&vEWP<`-)f&u zQT%_(_pGx*uYN2CqbpRe9Iwwc*q~x~xNF)uR3f%>2F(0n^_S&mHdNcpgUeB3o_uY( z=#XO6mbxB(49G-a-S~uwY}ilqJnfz9(GmVNjCC{K<8yogzz+yc$oOF1-sJnw#bnyx zI@RXg9xgvKJ~Ev3+8j8pVP||xK5S%>k58w`cu&>4XE(i>_s-YnJe~_jR;N`ia9xG1 zn-|8WPAt2Qu-FTa1CPi2xz4fwn1HRn*n$llIBnVevwE8}I_bh-7Ku6ACXpKN!T zPFKWWJ(@krPiHHw=M?#gCPUa?s;A6y-V9D^<>#_Z0CvSt$(Oe6Q@fc>?}v7-badmp z3>-n`7{*q%U!UZTiCey$zvU0lqhgFE2Z^z;LhU`Ud$B%&v25E3!VAw9DYrkmMZ4J9 zV}BvqF0}U3Mp{Bh)T*ZLkGl*Tr?1mE4L2VeobSHs=p~eQsco z{P_n8_7FuP?9@iLqa81RsR_fuBn{7tC$}?M6o;o+wIA81ipTZCMz_EWgb`w%-Wc24 z8!LF*@KkNy``mu_f7cGnMG9Q)7aT|Ufx!-Z?#*I;o=QiD^?OpWA%%s00dKDw0orw! zx1IFY*MC$F+U=Yj)W73dzWYOhy*5|s`y$?J+UYysPS?OQH{m_SQN4hHzFyOLs{h?u zZyW1Zzx+u#l&D4ZdE-!j!KU!3a=WFQZ0n~I=_>kxtn?89db}ggn%^yS<8T^b) z#uh6(^@r?N-wpNu{9?hr;$M70G+sqxLwq%G=Uw}f%LXI$V`)@ehslwXIHOf8pWTCr zOKQf*o0Ix)xA|jo&~9gYVmPU${`~iAe=wGryK1NEv6AS8w%2679^AXk1zmmH*DJj$ zkCH{^U}EWEL;dOtz5Y{jG^-=xFHkh5zsL43e``$B_6N5GKj9kOq(j6!IK1wgg^zRc zJN4VRF>ZY8)4Nappd3^|&F?=X&$~z_Q-sM5#1nknUva=ew({Tav($W*Iptk_^ZYg5 z|5Shc<=%hi4`V-Oo%8M6dZw6d;d_k#ovZ%&-~1!TpKtU3bjN@C<3F{|pa1Ni{`m84 z{-5sn$NEE{8pNh4kXy#;|=>*nLJ}d{~RB}ZX_O5m6&+soHE!>DB~{AHGFsj zt;#J(y@_cj+*!UfehkQ0XZZoYMAe(N(tqlMZJB!Od}$u~kBTScFA~6SJbPHI!!Fp_ z6Nh~;g&a0CFc{g1$kpU?)UX#3qto!Jgmv(lE56|weqKL0sAs!=Tj_?8sBA

-e!a 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 UK7Zw1jl*ekMO}WXtLW$dAG(TTm;e9( literal 0 HcmV?d00001 diff --git a/lab8/kernel/bcm2710-rpi-3-b-plus.dtb b/lab8/kernel/bcm2710-rpi-3-b-plus.dtb new file mode 100644 index 0000000000000000000000000000000000000000..38395a23fc90767680815c7f43bbfb3a290c2af0 GIT binary patch literal 32761 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�D&OoC_~4g9tivONVZxf$G+%wkS(-3$L@6`g_7TDCjX zZ0wGe1kn#$y$N03GHt`At5nL~a;sv6?tVfLDtBzZfvLbSPPlEX)KP=ol3y$FuZ?K# zXq{r6RCi!U&_G1m5U=65R9h>Z>G;rAvqX;HRd$z~6%TKR)pAgjR>?KEc2EoOFI}HT z(Zk+nZg2C&R%k#PL<|DCfDac}0}-x51h)~K?qcnF74kM)Fxcu&T_b z;N~L)VOxvMMmg|KwHr9ZRqhdz%wl+uLlI??rK2!lgi~v-g%I6`f&Mc>*Fc1>5Jg9` z^17#s*d9?dyRD%lOrK+iLQh^iVS_5lE(U?YdK6{9i&rZx;GjZX*QY@bZ2zJ#%`RG- zkJK}Q(H=>QUv1*wgAN>)c8|B*&27)R8E*hT~6VH+RLhvRq~;)h{3J~sayp*djcq?x^z z*=bP$8ODfDCznO<1T0!-efE&~Xu4M?b4?Ws7QJ>Z)|qMrada*+YQ<9qvbpLa3nJ%q zqJM5wVdWq~YHPXb@qjovoJ|L>VpsV3h4W*g84}b?cxp=Ca`=_C$B&co(w^hZu*X+ysto}0S)*bX?FdxfaP>9TytA4wwD77_a_A9Hp#OVEWA!Fl_#JplwLCf-}ERJi*| MwhYsc7a#HeA5G>kdjJ3c literal 0 HcmV?d00001 diff --git a/lab8/kernel/include/bcm2837/rpi_base.h b/lab8/kernel/include/bcm2837/rpi_base.h new file mode 100644 index 000000000..99b05f4fa --- /dev/null +++ b/lab8/kernel/include/bcm2837/rpi_base.h @@ -0,0 +1,7 @@ +#ifndef _RPI_BASE_H_ +#define _RPI_BASE_H_ + +#include "rpi_mmu.h" +#define PERIPHERAL_BASE PHYS_TO_VIRT(0x3F000000) + +#endif /*_RPI_BASE_H_ */ diff --git a/lab8/kernel/include/bcm2837/rpi_gpio.h b/lab8/kernel/include/bcm2837/rpi_gpio.h new file mode 100644 index 000000000..e5133708a --- /dev/null +++ b/lab8/kernel/include/bcm2837/rpi_gpio.h @@ -0,0 +1,25 @@ +#ifndef _RPI_GPIO_H_ +#define _RPI_GPIO_H_ + +#include "bcm2837/rpi_base.h" + +#define GPFSEL0 ((volatile unsigned int*)(PERIPHERAL_BASE+0x00200000)) +#define GPFSEL1 ((volatile unsigned int*)(PERIPHERAL_BASE+0x00200004)) +#define GPFSEL2 ((volatile unsigned int*)(PERIPHERAL_BASE+0x00200008)) +#define GPFSEL3 ((volatile unsigned int*)(PERIPHERAL_BASE+0x0020000C)) +#define GPFSEL4 ((volatile unsigned int*)(PERIPHERAL_BASE+0x00200010)) +#define GPFSEL5 ((volatile unsigned int*)(PERIPHERAL_BASE+0x00200014)) +#define GPSET0 ((volatile unsigned int*)(PERIPHERAL_BASE+0x0020001C)) +#define GPSET1 ((volatile unsigned int*)(PERIPHERAL_BASE+0x00200020)) +#define GPCLR0 ((volatile unsigned int*)(PERIPHERAL_BASE+0x00200028)) +#define GPLEV0 ((volatile unsigned int*)(PERIPHERAL_BASE+0x00200034)) +#define GPLEV1 ((volatile unsigned int*)(PERIPHERAL_BASE+0x00200038)) +#define GPEDS0 ((volatile unsigned int*)(PERIPHERAL_BASE+0x00200040)) +#define GPEDS1 ((volatile unsigned int*)(PERIPHERAL_BASE+0x00200044)) +#define GPHEN0 ((volatile unsigned int*)(PERIPHERAL_BASE+0x00200064)) +#define GPHEN1 ((volatile unsigned int*)(PERIPHERAL_BASE+0x00200068)) +#define GPPUD ((volatile unsigned int*)(PERIPHERAL_BASE+0x00200094)) +#define GPPUDCLK0 ((volatile unsigned int*)(PERIPHERAL_BASE+0x00200098)) +#define GPPUDCLK1 ((volatile unsigned int*)(PERIPHERAL_BASE+0x0020009C)) + +#endif /*_RPI_GPIO_H_*/ diff --git a/lab8/kernel/include/bcm2837/rpi_irq.h b/lab8/kernel/include/bcm2837/rpi_irq.h new file mode 100644 index 000000000..8423dfea0 --- /dev/null +++ b/lab8/kernel/include/bcm2837/rpi_irq.h @@ -0,0 +1,24 @@ +#ifndef _RPI_IRQ_H_ +#define _RPI_IRQ_H_ + +#include "bcm2837/rpi_base.h" + +/* +The basic pending register shows which interrupt are pending. To speed up interrupts processing, a +number of 'normal' interrupt status bits have been added to this register. This makes the 'IRQ +pending base' register different from the other 'base' interrupt registers +p112-115 https://cs140e.sergio.bz/docs/BCM2837-ARM-Peripherals.pdf +*/ + +#define IRQ_BASIC_PENDING ((volatile unsigned int*)(PERIPHERAL_BASE+0x0000B200)) +#define IRQ_PENDING_1 ((volatile unsigned int*)(PERIPHERAL_BASE+0x0000B204)) +#define IRQ_PENDING_2 ((volatile unsigned int*)(PERIPHERAL_BASE+0x0000B208)) +#define FIQ_CONTROL ((volatile unsigned int*)(PERIPHERAL_BASE+0x0000B20C)) +#define ENABLE_IRQS_1 ((volatile unsigned int*)(PERIPHERAL_BASE+0x0000B210)) +#define ENABLE_IRQS_2 ((volatile unsigned int*)(PERIPHERAL_BASE+0x0000B214)) +#define ENABLE_BASIC_IRQS ((volatile unsigned int*)(PERIPHERAL_BASE+0x0000B218)) +#define DISABLE_IRQS_1 ((volatile unsigned int*)(PERIPHERAL_BASE+0x0000B21C)) +#define DISABLE_IRQS_2 ((volatile unsigned int*)(PERIPHERAL_BASE+0x0000B220)) +#define DISABLE_BASIC_IRQS ((volatile unsigned int*)(PERIPHERAL_BASE+0x0000B224)) + +#endif /*_RPI_IRQ_H_*/ diff --git a/lab8/kernel/include/bcm2837/rpi_mbox.h b/lab8/kernel/include/bcm2837/rpi_mbox.h new file mode 100644 index 000000000..ba1001472 --- /dev/null +++ b/lab8/kernel/include/bcm2837/rpi_mbox.h @@ -0,0 +1,17 @@ +#ifndef _RPI_MBOX_H_ +#define _RPI_MBOX_H_ + +#include "bcm2837/rpi_base.h" + +#define MBOX_BASE (PERIPHERAL_BASE+0x0000B880) + +// The register access to a mailbox +// https://jsandler18.github.io/extra/mailbox.html +#define MBOX_READ ((volatile unsigned int*)(MBOX_BASE+0x00)) +#define MBOX_POLL ((volatile unsigned int*)(MBOX_BASE+0x10)) +#define MBOX_SENDER ((volatile unsigned int*)(MBOX_BASE+0x14)) +#define MBOX_STATUS ((volatile unsigned int*)(MBOX_BASE+0x18)) +#define MBOX_CONFIG ((volatile unsigned int*)(MBOX_BASE+0x1C)) +#define MBOX_WRITE ((volatile unsigned int*)(MBOX_BASE+0x20)) + +#endif /*_RPI_MBOX_H_ */ diff --git a/lab8/kernel/include/bcm2837/rpi_mmu.h b/lab8/kernel/include/bcm2837/rpi_mmu.h new file mode 100644 index 000000000..0452ce6df --- /dev/null +++ b/lab8/kernel/include/bcm2837/rpi_mmu.h @@ -0,0 +1,8 @@ +#ifndef _RPI_MMU_H_ +#define _RPI_MMU_H_ + +#define PHYS_TO_VIRT(x) (x + 0xffff000000000000) +#define VIRT_TO_PHYS(x) (x - 0xffff000000000000) +#define ENTRY_ADDR_MASK 0xfffffffff000L + +#endif /*_RPI_MMU_H_ */ diff --git a/lab8/kernel/include/bcm2837/rpi_uart1.h b/lab8/kernel/include/bcm2837/rpi_uart1.h new file mode 100644 index 000000000..959130656 --- /dev/null +++ b/lab8/kernel/include/bcm2837/rpi_uart1.h @@ -0,0 +1,19 @@ +#ifndef _RPI_UART1_H_ +#define _RPI_UART1_H_ + +#include "bcm2837/rpi_base.h" + +#define AUX_ENABLES ((volatile unsigned int*)(PERIPHERAL_BASE+0x00215004)) +#define AUX_MU_IO_REG ((volatile unsigned int*)(PERIPHERAL_BASE+0x00215040)) +#define AUX_MU_IER_REG ((volatile unsigned int*)(PERIPHERAL_BASE+0x00215044)) +#define AUX_MU_IIR_REG ((volatile unsigned int*)(PERIPHERAL_BASE+0x00215048)) +#define AUX_MU_LCR_REG ((volatile unsigned int*)(PERIPHERAL_BASE+0x0021504C)) +#define AUX_MU_MCR_REG ((volatile unsigned int*)(PERIPHERAL_BASE+0x00215050)) +#define AUX_MU_LSR_REG ((volatile unsigned int*)(PERIPHERAL_BASE+0x00215054)) +#define AUX_MU_MSR_REG ((volatile unsigned int*)(PERIPHERAL_BASE+0x00215058)) +#define AUX_MU_SCRATCH ((volatile unsigned int*)(PERIPHERAL_BASE+0x0021505C)) +#define AUX_MU_CNTL_REG ((volatile unsigned int*)(PERIPHERAL_BASE+0x00215060)) +#define AUX_MU_STAT_REG ((volatile unsigned int*)(PERIPHERAL_BASE+0x00215064)) +#define AUX_MU_BAUD_REG ((volatile unsigned int*)(PERIPHERAL_BASE+0x00215068)) + +#endif /*_RPI_UART1_H_ */ diff --git a/lab8/kernel/include/cpio.h b/lab8/kernel/include/cpio.h new file mode 100644 index 000000000..e662bee51 --- /dev/null +++ b/lab8/kernel/include/cpio.h @@ -0,0 +1,41 @@ +#ifndef _CPIO_H_ +#define _CPIO_H_ + +/* + cpio format : https://manpages.ubuntu.com/manpages/bionic/en/man5/cpio.5.html + We are using "newc" format + header, file path, file data, header ...... + header + file path (padding 4 bytes) + file data (padding 4 bytes) (max size 4gb) +*/ + +#define CPIO_NEWC_HEADER_MAGIC "070701" // big endian constant, to check whether it is big endian or little endian + +extern void* CPIO_DEFAULT_START; +extern void* CPIO_DEFAULT_END; + +// Using newc archive format +struct cpio_newc_header +{ + char c_magic[6]; // fixed, "070701". + char c_ino[8]; + char c_mode[8]; + char c_uid[8]; + char c_gid[8]; + char c_nlink[8]; + char c_mtime[8]; + char c_filesize[8]; + char c_devmajor[8]; + char c_devminor[8]; + char c_rdevmajor[8]; + char c_rdevminor[8]; + char c_namesize[8]; + char c_check[8]; +}; + +/* write pathname, data, next header into corresponding parameter*/ +int cpio_newc_parse_header(struct cpio_newc_header *this_header_pointer, + char **pathname, unsigned int *filesize, char **data, + struct cpio_newc_header **next_header_pointer); + +#endif /* _CPIO_H_ */ diff --git a/lab8/kernel/include/dev_framebuffer.h b/lab8/kernel/include/dev_framebuffer.h new file mode 100644 index 000000000..4ca5a8565 --- /dev/null +++ b/lab8/kernel/include/dev_framebuffer.h @@ -0,0 +1,24 @@ +#ifndef _DEV_FRAMEBUFFER_H_ +#define _DEV_FRAMEBUFFER_H_ + +#include "stddef.h" +#include "vfs.h" + +struct framebuffer_info +{ + unsigned int width; + unsigned int height; + unsigned int pitch; + unsigned int isrgb; +}; + +int init_dev_framebuffer(); + +int dev_framebuffer_write(struct file *file, const void *buf, size_t len); +int dev_framebuffer_read(struct file *file, void *buf, size_t len); +int dev_framebuffer_open(struct vnode *file_node, struct file **target); +int dev_framebuffer_close(struct file *file); +long dev_framebuffer_lseek64(struct file *file, long offset, int whence); +int dev_framebuffer_op_deny(); + +#endif diff --git a/lab8/kernel/include/dev_uart.h b/lab8/kernel/include/dev_uart.h new file mode 100644 index 000000000..b46dceed4 --- /dev/null +++ b/lab8/kernel/include/dev_uart.h @@ -0,0 +1,15 @@ +#ifndef _DEV_UART_H_ +#define _DEV_UART_H_ + +#include "stddef.h" +#include "vfs.h" + +int init_dev_uart(); + +int dev_uart_write(struct file *file, const void *buf, size_t len); +int dev_uart_read(struct file *file, void *buf, size_t len); +int dev_uart_open(struct vnode *file_node, struct file **target); +int dev_uart_close(struct file *file); +int dev_uart_op_deny(); + +#endif diff --git a/lab8/kernel/include/dtb.h b/lab8/kernel/include/dtb.h new file mode 100644 index 000000000..fb7c451d5 --- /dev/null +++ b/lab8/kernel/include/dtb.h @@ -0,0 +1,28 @@ +#ifndef _DTB_H_ +#define _DTB_H_ + +#define uint32_t unsigned int +#define uint64_t unsigned long long + +// manipulate device tree with dtb file format +// linux kernel fdt.h +#define FDT_BEGIN_NODE 0x00000001 +#define FDT_END_NODE 0x00000002 +#define FDT_PROP 0x00000003 +#define FDT_NOP 0x00000004 +#define FDT_END 0x00000009 + +extern char* dtb_ptr; + +typedef void (*dtb_callback)(uint32_t node_type, char *name, void *value, uint32_t name_size); + +uint32_t uint32_endian_big2lttle(uint32_t data); +uint64_t uint64_endian_big2lttle(uint64_t data); + +void traverse_device_tree(void *base, dtb_callback callback); //traverse dtb tree +void dtb_callback_show_tree(uint32_t node_type, char *name, void *value, uint32_t name_size); +void dtb_callback_initramfs(uint32_t node_type, char *name, void *value, uint32_t name_size); + +void dtb_find_and_store_reserved_memory(); + +#endif diff --git a/lab8/kernel/include/exception.h b/lab8/kernel/include/exception.h new file mode 100644 index 000000000..c0d8b20c4 --- /dev/null +++ b/lab8/kernel/include/exception.h @@ -0,0 +1,81 @@ +#ifndef _EXCEPTION_H_ +#define _EXCEPTION_H_ + +#include "bcm2837/rpi_irq.h" + +#define CORE0_INTERRUPT_SOURCE ((volatile unsigned int *)(PHYS_TO_VIRT(0x40000060))) + +#define IRQ_PENDING_1_AUX_INT (1<<29) +#define INTERRUPT_SOURCE_GPU (1<<8) +#define INTERRUPT_SOURCE_CNTPNSIRQ (1<<1) + +typedef struct trapframe +{ + unsigned long x0; + unsigned long x1; + unsigned long x2; + unsigned long x3; + unsigned long x4; + unsigned long x5; + unsigned long x6; + unsigned long x7; + unsigned long x8; + unsigned long x9; + unsigned long x10; + unsigned long x11; + unsigned long x12; + unsigned long x13; + unsigned long x14; + unsigned long x15; + unsigned long x16; + unsigned long x17; + unsigned long x18; + unsigned long x19; + unsigned long x20; + unsigned long x21; + unsigned long x22; + unsigned long x23; + unsigned long x24; + unsigned long x25; + unsigned long x26; + unsigned long x27; + unsigned long x28; + unsigned long x29; + unsigned long x30; + unsigned long spsr_el1; + unsigned long elr_el1; + unsigned long sp_el0; +} trapframe_t; + +#define MEMFAIL_DATA_ABORT_LOWER 0b100100 // 0x24 esr_el1 +#define MEMFAIL_INST_ABORT_LOWER 0b100000 // 0x20 EC, bits [31:26] + +#define TF_LEVEL0 0b000100 // iss IFSC, bits [5:0] textbook p11-17 +#define TF_LEVEL1 0b000101 +#define TF_LEVEL2 0b000110 +#define TF_LEVEL3 0b000111 + +typedef struct{ + unsigned int iss : 25, // Instruction specific syndrome + il : 1, // Instruction length bit + ec : 6; // Exception class +} esr_el1_t; + +void sync_64_router(trapframe_t *tpf); +void irq_router(trapframe_t *tpf); +void invalid_exception_router(); + +static inline void el1_interrupt_enable() +{ + __asm__ __volatile__("msr daifclr, 0xf"); +} + +static inline void el1_interrupt_disable() +{ + __asm__ __volatile__("msr daifset, 0xf"); +} + +void lock(); +void unlock(); + +#endif /* _EXCEPTION_H_ */ diff --git a/lab8/kernel/include/fat32.h b/lab8/kernel/include/fat32.h new file mode 100644 index 000000000..768267c63 --- /dev/null +++ b/lab8/kernel/include/fat32.h @@ -0,0 +1,208 @@ +#ifndef FAT32_H +#define FAT32_H + +#include "list.h" +#include "vfs.h" + +#define BLOCK_SIZE 512 +#define CLUSTER_ENTRY_PER_BLOCK (BLOCK_SIZE / sizeof(struct cluster_entry_t)) +#define DIR_PER_BLOCK (BLOCK_SIZE / sizeof(struct dir_t)) +#define INVALID_CID 0x0ffffff8 // Last cluster in file (EOC), reserved by FAT32 + +struct partition_t { + unsigned char status; + unsigned char chss_head; + unsigned char chss_sector; + unsigned char chss_cylinder; + unsigned char type; + unsigned char chse_head; + unsigned char chse_sector; + unsigned char chse_cylinder; + unsigned int lba; + unsigned int sectors; +} __attribute__((packed)); + +struct boot_sector_t { + unsigned char jmpboot[3]; + unsigned char oemname[8]; + unsigned short bytes_per_sector; + unsigned char sector_per_cluster; + unsigned short reserved_sector_cnt; + unsigned char fat_cnt; + unsigned short root_entry_cnt; + unsigned short old_sector_cnt; + unsigned char media; + unsigned short sector_per_fat16; + unsigned short sector_per_track; + unsigned short head_cnt; + unsigned int hidden_sector_cnt; // Default Boot Sector ends here + unsigned int sector_cnt; // FAT32 definition + unsigned int sector_per_fat32; + unsigned short extflags; + unsigned short ver; + unsigned int root_cluster; + unsigned short info; + unsigned short bkbooksec; + unsigned char reserved[12]; + unsigned char drvnum; + unsigned char reserved1; + unsigned char bootsig; + unsigned int volid; + unsigned char vollab[11]; + unsigned char fstype[8]; +} __attribute__((packed)); + +struct fat_info_t { + struct boot_sector_t bs; // boot_sector from MBR Partition Table + unsigned int fat_lba; // FAT Region in FAT fs Definition + unsigned int cluster_lba; // Data Region in FAT32 fs Definition +}; + +// attr of dir_t +#define ATTR_READ_ONLY 0x01 +#define ATTR_HIDDEN 0x02 +#define ATTR_SYSTEM 0x04 +#define ATTR_VOLUME_ID 0x08 +#define ATTR_LFN 0x0f +#define ATTR_DIRECTORY 0x10 +#define ATTR_ARCHIVE 0x20 +#define ATTR_FILE_DIR_MASK (ATTR_DIRECTORY | ATTR_ARCHIVE) + +// Directory structure for FAT SFN +// http://elm-chan.org/docs/fat_e.html +struct dir_t { + unsigned char name[11]; + unsigned char attr; + unsigned char ntres; + unsigned char crttimetenth; + unsigned short crttime; + unsigned short crtdate; + unsigned short lstaccdate; + unsigned short ch; + unsigned short wrttime; + unsigned short wrtdate; + unsigned short cl; + unsigned int size; +} __attribute__((packed)); + +// Directory structure for FAT LFN +// https://blog.csdn.net/ZCShouCSDN/article/details/97610903 +struct long_dir_t { + unsigned char order; + unsigned char name1[10]; + unsigned char attr; + unsigned char type; + unsigned char checksum; + unsigned char name2[12]; + unsigned short fstcluslo; + unsigned char name3[4]; +} __attribute__((packed)); + +struct cluster_entry_t { + union { + unsigned int val; + struct { + unsigned int idx: 28; + unsigned int reserved: 4; + }; + }; +}; + +struct filename_t { + union { + unsigned char fullname[256]; + struct { + unsigned char name[13]; + } part[20]; + }; +} __attribute__((packed)); + +struct fat_file_block_t { + /* Link fat_file_block_t */ + struct list_head list; + unsigned int oid; // offset if of file, N = offset N* BLOCK_SIZE of file + unsigned int cid; // cluster id + unsigned int bufIsUpdated; + unsigned int isDirty; + unsigned char buf[BLOCK_SIZE]; +}; + +struct fat_file_t { + /* Head of fat_file_block_t chain */ + struct list_head list; + unsigned int size; +}; + +struct fat_dir_t { + /* Head of fat32_inode chain */ + struct list_head list; +}; + +struct fat_mount_t { + /* Link fat_mount_t */ + struct list_head list; + struct mount *mount; +}; + +// type of struct fat32_inode +#define FAT_DIR 1 +#define FAT_FILE 2 + +struct fat32_inode { + const char *name; + struct vnode *node; // redirect to vnode + struct fat_info_t *fat; + /* Link fat32_inode */ + struct list_head list; + /* cluster id */ + unsigned int cid; // cluster id + unsigned int type; + union { + struct fat_dir_t *dir; + struct fat_file_t *file; + }; +}; + +int register_fat32(); + +int fat32_mount(struct filesystem *fs, struct mount *mount); +int fat32_lookup(struct vnode *dir_node, struct vnode **target, const char *component_name); +int fat32_create(struct vnode *dir_node, struct vnode **target, const char *component_name); +int fat32_mkdir(struct vnode *dir_node, struct vnode **target, const char *component_name); +int fat32_isdir(struct vnode *dir_node); +int fat32_getname(struct vnode *dir_node, const char **name); +int fat32_getsize(struct vnode *dir_node); + +int fat32_write(struct file *file, const void *buf, size_t len); +int fat32_read(struct file *file, void *buf, size_t len); +int fat32_open(struct vnode *file_node, struct file **target); +int fat32_close(struct file *file); +long fat32_lseek64(struct file *file, long offset, int whence); +int fat32_sync(struct filesystem *fs); + +unsigned int alloc_cluster(struct fat_info_t *fat, unsigned int prev_cid); +unsigned int get_next_cluster(unsigned int fat_lba, unsigned int cluster_id); + +struct vnode *_create_vnode(struct vnode *parent, const char *name, unsigned int type, unsigned int cid, unsigned int size); + +int _lookup_cache(struct vnode *dir_node, struct vnode **target, const char *component_name); +struct dir_t* __lookup_fat32(struct vnode *dir_node, const char *component_name, unsigned char *buf, int *buflba); +int _lookup_fat32(struct vnode *dir_node, struct vnode **target, const char *component_name); + +int _readfile(void *buf, struct fat32_inode *data, unsigned long long fileoff, unsigned long long len); +int _readfile_fat32(struct fat32_inode *data, unsigned long long bckoff, unsigned char *buf, unsigned int bufoff, unsigned int size, unsigned int oid, unsigned int cid); +int _readfile_cache(struct fat32_inode *data, unsigned long long bckoff, unsigned char *buf, unsigned long long bufoff, unsigned int size, struct fat_file_block_t *block); +int _readfile_seek_fat32(struct fat32_inode *data, unsigned int foid, unsigned int fcid, struct fat_file_block_t **block); +int _readfile_seek_cache(struct fat32_inode *data, unsigned int foid, struct fat_file_block_t **block); + +int _writefile(const void *buf, struct fat32_inode *data, unsigned long long fileoff, unsigned long long len); +int _writefile_fat32(struct fat32_inode *data, unsigned long long bckoff, const unsigned char *buf, unsigned int bufoff, unsigned int size, unsigned int oid, unsigned int cid); +int _writefile_cache(struct fat32_inode *data, unsigned long long bckoff, const unsigned char *buf, unsigned long long bufoff, unsigned int size, struct fat_file_block_t *block); +int _writefile_seek_fat32(struct fat32_inode *data, unsigned int foid, unsigned int fcid, struct fat_file_block_t **block); +int _writefile_seek_cache(struct fat32_inode *data, unsigned int foid, struct fat_file_block_t **block); + +void _sync_dir(struct vnode *dirnode); +void _do_sync_dir(struct vnode *dirnode); +void _do_sync_file(struct vnode *filenode); + +#endif diff --git a/lab8/kernel/include/initramfs.h b/lab8/kernel/include/initramfs.h new file mode 100644 index 000000000..494744b1e --- /dev/null +++ b/lab8/kernel/include/initramfs.h @@ -0,0 +1,37 @@ +#ifndef _INITRAMFS_H_ +#define _INITRAMFS_H_ + +#include "stddef.h" +#include "vfs.h" + +#define INITRAMFS_MAX_DIR_ENTRY 100 + +// initramfs basically is same as tmpfs, but it is read-only + +struct initramfs_inode +{ + enum fsnode_type type; + char* name; + struct vnode *entry[INITRAMFS_MAX_DIR_ENTRY]; + char *data; + size_t datasize; +}; + +int register_initramfs(); +int initramfs_setup_mount(struct filesystem *fs, struct mount *_mount); + +int initramfs_write(struct file *file, const void *buf, size_t len); +int initramfs_read(struct file *file, void *buf, size_t len); +int initramfs_open(struct vnode *file_node, struct file **target); +int initramfs_close(struct file *file); +long initramfs_lseek64(struct file *file, long offset, int whence); +long initramfs_getsize(struct vnode *vd); + +int initramfs_lookup(struct vnode *dir_node, struct vnode **target, const char *component_name); +int initramfs_create(struct vnode *dir_node, struct vnode **target, const char *component_name); +int initramfs_mkdir(struct vnode *dir_node, struct vnode **target, const char *component_name); +int initramfs_sync(struct filesystem *fs); + +struct vnode *initramfs_create_vnode(struct mount *_mount, enum fsnode_type type); + +#endif /* _INITRAMFS_H_ */ diff --git a/lab8/kernel/include/irqtask.h b/lab8/kernel/include/irqtask.h new file mode 100644 index 000000000..395bea0b7 --- /dev/null +++ b/lab8/kernel/include/irqtask.h @@ -0,0 +1,22 @@ +#ifndef _IRQTASK_H_ +#define _IRQTASK_H_ + +#include "list.h" + +// smaller is more preemptive +#define UART_IRQ_PRIORITY 1 +#define TIMER_IRQ_PRIORITY 0 + +typedef struct irqtask +{ + struct list_head listhead; + unsigned long long priority; + void *task_function; +} irqtask_t; + +void irqtask_add(void *task_function, unsigned long long priority); +void irqtask_run(irqtask_t *the_task); +void irqtask_run_preemptive(); +void irqtask_init_list(); + +#endif diff --git a/lab8/kernel/include/list.h b/lab8/kernel/include/list.h new file mode 100644 index 000000000..65ba89fea --- /dev/null +++ b/lab8/kernel/include/list.h @@ -0,0 +1,223 @@ +#ifndef LIST_H +#define LIST_H + +#include + +/* + * Circular doubly linked list implementation. + * + * Some of the internal functions ("__xxx") are useful when + * manipulating whole lists rather than single entries, as + * sometimes we already know the next/prev entries and we can + * generate better code by using them directly rather than + * using the generic single-entry routines. + * + * https://github.com/torvalds/linux/blob/master/include/linux/list.h + * https://elixir.bootlin.com/linux/latest/source/scripts/kconfig/list.h#L24 + */ + +typedef struct list_head { + struct list_head *next, *prev; +}list_head_t; + +#define LIST_HEAD_INIT(name) { &(name), &(name) } + +#define LIST_HEAD(name) \ + struct list_head name = LIST_HEAD_INIT(name) + +/** + * INIT_LIST_HEAD - Initialize a list_head structure + * @list: list_head structure to be initialized. + * + * Initializes the list_head to point to itself. If it is a list header, + * the result is an empty list. + */ +static inline void INIT_LIST_HEAD(struct list_head *list) +{ + list->next = list; + list->prev = list; +} + +static inline void __list_add(struct list_head *new, + struct list_head *prev, + struct list_head *next) +{ + next->prev = new; + new->next = next; + new->prev = prev; + prev->next = new; +} + +/** + * list_add - add a new entry + * @new: new entry to be added + * @head: list head to add it after + * + * Insert a new entry after the specified head. + * This is good for implementing stacks. + */ +static inline void list_add(struct list_head *new, struct list_head *head) +{ + __list_add(new, head, head->next); +} + +/** + * list_add_tail - add a new entry + * @new: new entry to be added + * @head: list head to add it before + * + * Insert a new entry before the specified head. + * This is useful for implementing queues. + */ +static inline void list_add_tail(struct list_head *new, struct list_head *head) +{ + __list_add(new, head->prev, head); +} + +/* + * Delete a list entry by making the prev/next entries + * point to each other. + * + * This is only for internal list manipulation where we know + * the prev/next entries already! + */ +static inline void __list_del(struct list_head * prev, struct list_head * next) +{ + next->prev = prev; + prev->next = next; +} + +static inline void list_del_entry(struct list_head *entry) +{ + __list_del(entry->prev, entry->next); +} + + +/** + * list_is_head - tests whether @list is the list @head + * @list: the entry to test + * @head: the head of the list + */ +static inline int list_is_head(const struct list_head *list, const struct list_head *head) +{ + return list == head; +} + + +/** + * list_empty - tests whether a list is empty + * @head: the list to test. + */ +static inline int list_empty(const struct list_head *head) +{ + return head->next == head; +} + +/** + * list_for_each - iterate over a list + * @pos: the &struct list_head to use as a loop cursor. + * @head: the head for your list. + */ +#define list_for_each(pos, head) \ + for (pos = (head)->next; !list_is_head(pos, (head)); pos = pos->next) + +/** + * list_empty - tests whether a list is empty + * @head: the list to test. + */ +static inline int list_size(const struct list_head *head) +{ + list_head_t *pos; + int i= 0; + list_for_each(pos, head) + { + i++; + } + return i; +} + +/* "typeof" is a GNU extension. + * Reference: https://gcc.gnu.org/onlinedocs/gcc/Typeof.html + */ +#if defined(__GNUC__) +#define __LIST_HAVE_TYPEOF 1 +#endif /* defined(__GNUC__) */ + +/** + * container_of() - Calculate address of object that contains address ptr + * @ptr: pointer to member variable + * @type: type of the structure containing ptr + * @member: name of the member variable in struct @type + * + * Return: @type pointer of object containing ptr + */ +#ifndef container_of +#ifdef __LIST_HAVE_TYPEOF +#define container_of(ptr, type, member) \ + __extension__({ \ + const __typeof__(((type *) 0)->member) *__pmember = (ptr); \ + (type *) ((char *) __pmember - offsetof(type, member)); \ + }) +#else /* __LIST_HAVE_TYPEOF */ +#define container_of(ptr, type, member) \ + ((type *) ((char *) (ptr) -offsetof(type, member))) +#endif /* __LIST_HAVE_TYPEOF */ +#endif /* container_of */ + +/** + * list_entry() - Calculate address of entry that contains list node + * @node: pointer to list node + * @type: type of the entry containing the list node + * @member: name of the list_head member variable in struct @type + * + * Return: @type pointer of entry containing node + */ +#define list_entry(node, type, member) container_of(node, type, member) + +/** + * list_first_entry() - get first entry of the list + * @head: pointer to the head of the list + * @type: type of the entry containing the list node + * @member: name of the list_head member variable in struct @type + * + * Return: @type pointer of first entry in list + */ +#define list_first_entry(head, type, member) \ + list_entry((head)->next, type, member) + +/** + * list_for_each_entry - iterate over list entries + * @entry: pointer used as iterator + * @head: pointer to the head of the list + * @member: name of the list_head member variable in struct type of @entry + * + * The nodes and the head of the list must be kept unmodified while + * iterating through it. Any modifications to the the list will cause undefined + * behavior. + * + * FIXME: remove dependency of __typeof__ extension + */ +#ifdef __LIST_HAVE_TYPEOF +#define list_for_each_entry(entry, head, member) \ + for (entry = list_entry((head)->next, __typeof__(*entry), member); \ + &entry->member != (head); \ + entry = list_entry(entry->member.next, __typeof__(*entry), member)) +#endif /* __LIST_HAVE_TYPEOF */ + +/** + * iter_for_each_entry - iterate over list entries from @iter + * @entry: pointer used as iterator + * @iter: pointer to the start of this iteration + * @head: pointer to the head of the list + * @member: name of the list_head member variable in struct type of @entry + * + * FIXME: remove dependency of __typeof__ extension + */ +#ifdef __LIST_HAVE_TYPEOF +#define iter_for_each_entry(entry, iter, head, member) \ + for (entry = list_entry(iter, __typeof__(*entry), member); \ + &entry->member != (head); \ + entry = list_entry(entry->member.next, __typeof__(*entry), member)) +#endif /* __LIST_HAVE_TYPEOF */ + +#endif diff --git a/lab8/kernel/include/mbox.h b/lab8/kernel/include/mbox.h new file mode 100644 index 000000000..d5f9514ff --- /dev/null +++ b/lab8/kernel/include/mbox.h @@ -0,0 +1,63 @@ +#ifndef _MBOX_H_ +#define _MBOX_H_ + +extern volatile unsigned int pt[36]; + +// Mailbox Register MMIO +// https://jsandler18.github.io/extra/mailbox.html +// include/bcm2837/rpi_mbox.h + +// Mailbox Channels +// https://github.com/raspberrypi/firmware/wiki/Mailboxes +typedef enum { + MBOX_POWER_MANAGEMENT = 0, + MBOX_FRAMEBUFFER, + MBOX_VIRTUAL_UART, + MBOX_VCHIQ, + MBOX_LEDS, + MBOX_BUTTONS, + MBOX_TOUCHSCREEN, + MBOX_UNUSED, + MBOX_TAGS_ARM_TO_VC, + MBOX_TAGS_VC_TO_ARM, +} mbox_channel_type; + +// Status Code from Broadcom Videocode Driver +// brcm_usrlib/dag/vmcsx/vcinclude/bcm2708_chip/arm_control.h +enum mbox_status_reg_bits { + BCM_ARM_VC_MS_FULL = 0x80000000, + BCM_ARM_VC_MS_EMPTY = 0x40000000, + BCM_ARM_VC_MS_LEVEL = 0x400000FF, +}; + +enum mbox_buffer_status_code { + MBOX_REQUEST_PROCESS = 0x00000000, + MBOX_REQUEST_SUCCEED = 0x80000000, + MBOX_REQUEST_FAILED = 0x80000001, +}; + +// Tag +// https://github.com/raspberrypi/firmware/wiki/Mailbox-property-interface +// Included partition only +typedef enum { + /* Videocore */ + MBOX_TAG_GET_FIRMWARE_VERSION = 0x1, + + /* Hardware */ + MBOX_TAG_GET_BOARD_MODEL = 0x10001, + MBOX_TAG_GET_BOARD_REVISION, + MBOX_TAG_GET_BOARD_MAC_ADDRESS, + MBOX_TAG_GET_BOARD_SERIAL, + MBOX_TAG_GET_ARM_MEMORY, + MBOX_TAG_GET_VC_MEMORY, + MBOX_TAG_GET_CLOCKS, + +} mbox_tag_type; + + +#define MBOX_TAG_REQUEST_CODE 0x00000000 +#define MBOX_TAG_LAST_BYTE 0x00000000 + +int mbox_call(mbox_channel_type, unsigned int); + +#endif /*_MBOX_H_*/ diff --git a/lab8/kernel/include/memory.h b/lab8/kernel/include/memory.h new file mode 100644 index 000000000..3d8aee537 --- /dev/null +++ b/lab8/kernel/include/memory.h @@ -0,0 +1,71 @@ +#ifndef _MEMORY_H_ +#define _MEMORY_H_ + +#include "bcm2837/rpi_mmu.h" +#include "list.h" + +/* Lab2 */ +void* s_allocator(unsigned int size); +void s_free(void* ptr); + +/* Lab4 */ +#define BUDDY_MEMORY_BASE PHYS_TO_VIRT(0x0) // 0x10000000 - 0x20000000 (SPEC) -> Advanced #3 for all memory region +#define BUDDY_MEMORY_PAGE_COUNT 0x3C000 // let BUDDY_MEMORY use 0x0 ~ 0x3C000000 (SPEC) +#define PAGESIZE 0x1000 // 4KB +#define MAX_PAGES 0x10000 // 65536 (Entries), PAGESIZE * MAX_PAGES = 0x10000000 (SPEC) + +typedef enum { + FRAME_FREE = -2, + FRAME_ALLOCATED, + FRAME_IDX_0 = 0, // 0x1000 + FRAME_IDX_1, // 0x2000 + FRAME_IDX_2, // 0x4000 + FRAME_IDX_3, // 0x8000 + FRAME_IDX_4, // 0x10000 + FRAME_IDX_5, // 0x20000 + FRAME_IDX_6, // 0x40000 + FRAME_IDX_FINAL = 7, // 0x80000 + FRAME_MAX_IDX = 8 +} frame_value_type; + +typedef enum { + CACHE_NONE = -1, // Cache not used + CACHE_IDX_0 = 0, // 0x20 + CACHE_IDX_1, // 0x40 + CACHE_IDX_2, // 0x80 + CACHE_IDX_3, // 0x100 + CACHE_IDX_4, // 0x200 + CACHE_IDX_5, // 0x400 + CACHE_IDX_FINAL = 6, // 0x800 + CACHE_MAX_IDX = 7 +} cache_value_type; + +typedef struct frame +{ + struct list_head listhead; // store freelist + int val; // store order + int used; + int cache_order; + unsigned int idx; +} frame_t; + +void init_allocator(); +frame_t *release_redundant(frame_t *frame); +frame_t *get_buddy(frame_t *frame); +frame_t *coalesce(frame_t *frame_ptr); + +void dump_page_info(); +void dump_cache_info(); + +//buddy system +void* page_malloc(unsigned int size); +void page_free(void *ptr); +void page2caches(int order); +void* cache_malloc(unsigned int size); +void cache_free(void* ptr); + +void* kmalloc(unsigned int size); +void kfree(void *ptr); +void memory_reserve(unsigned long long start, unsigned long long end); + +#endif /* _MEMORY_H_ */ diff --git a/lab8/kernel/include/mmu.h b/lab8/kernel/include/mmu.h new file mode 100644 index 000000000..b882e42d0 --- /dev/null +++ b/lab8/kernel/include/mmu.h @@ -0,0 +1,69 @@ +#ifndef _MMU_H_ +#define _MMU_H_ + +#include "stddef.h" + // tcr_el1: The control register for stage 1 of the EL1&0 translation regime. +#define TCR_CONFIG_REGION_48bit (((64 - 48) << 0) | ((64 - 48) << 16)) // T0SZ[5:0] The size offset for ttbr0_el1 is 2**(64-T0SZ): 0x0000_0000_0000_0000 <- 0x0000_FFFF_FFFF_FFFF +#define TCR_CONFIG_4KB ((0b00 << 14) | (0b10 << 30)) // T1SZ[21:16] The size offset for ttbr1_el1 is 2**(64-T1SZ): 0xFFFF_0000_0000_0000 -> 0xFFFF_FFFF_FFFF_FFFF +#define TCR_CONFIG_DEFAULT (TCR_CONFIG_REGION_48bit | TCR_CONFIG_4KB) // TG0[15:14] Granule size for the TTBR0_EL1: 0b00 = 4KB // TG1[31:30] Granule size for the TTBR1_EL1: 0b10 = 4KB + +#define MAIR_DEVICE_nGnRnE 0b00000000 // ((MAIR_DEVICE_nGnRnE << (MAIR_IDX_DEVICE_nGnRnE * 8)) | (MAIR_NORMAL_NOCACHE << (MAIR_IDX_NORMAL_NOCACHE * 8))) +#define MAIR_NORMAL_NOCACHE 0b01000100 // mair_el1: Provides the memory attribute encodings corresponding to the possible AttrIndx values for stage 1 translations at EL1. +#define MAIR_IDX_DEVICE_nGnRnE 0 // ATTR0[7:0]: 0b0000dd00 Device memory, dd = 0b00 Device-nGnRnE memory +#define MAIR_IDX_NORMAL_NOCACHE 1 // ATTR1[14:8] 0booooiiii Normal memory, oooo = 0b0100 Outer Non-cacheable, iiii = 0b0100 Inner Non-cacheable + +#define PD_TABLE 0b11L // Table Entry Armv8_a_address_translation p.14 +#define PD_BLOCK 0b01L // Block Entry +#define PD_UNX (1L << 54) // non-executable page frame for EL0 if set +#define PD_KNX (1L << 53) // non-executable page frame for EL1 if set +#define PD_ACCESS (1L << 10) // a page fault is generated if not set +#define PD_RDONLY (1L << 7) // 0 for read-write, 1 for read-only. +#define PD_UK_ACCESS (1L << 6) // 0 for only kernel access, 1 for user/kernel access. + +#define PERIPHERAL_START 0x3c000000L +#define PERIPHERAL_END 0x3f000000L +#define USER_KERNEL_BASE 0x00000000L +#define USER_STACK_BASE 0xfffffffff000L +#define USER_SIGNAL_WRAPPER_VA 0xffffffff9000L + +#define MMU_PGD_BASE 0x1000L +#define MMU_PGD_ADDR (MMU_PGD_BASE + 0x0000L) +#define MMU_PUD_ADDR (MMU_PGD_BASE + 0x1000L) +#define MMU_PTE_ADDR (MMU_PGD_BASE + 0x2000L) + +// Used for EL1 +#define BOOT_PGD_ATTR (PD_TABLE) +#define BOOT_PUD_ATTR (PD_TABLE | PD_ACCESS) +#define BOOT_PTE_ATTR_nGnRnE (PD_BLOCK | PD_ACCESS | (MAIR_DEVICE_nGnRnE << 2) | PD_UNX | PD_KNX | PD_UK_ACCESS) // p.17 +#define BOOT_PTE_ATTR_NOCACHE (PD_BLOCK | PD_ACCESS | (MAIR_NORMAL_NOCACHE << 2)) + +#ifndef __ASSEMBLER__ + +#include "sched.h" +#include "exception.h" + +typedef struct vm_area_struct +{ + + list_head_t listhead; + unsigned long virt_addr; + unsigned long phys_addr; + unsigned long area_size; + unsigned long rwx; // 1, 2, 4 + int is_alloced; + +} vm_area_struct_t; + +void *set_2M_kernel_mmu(void *x0); +void map_one_page(size_t *pgd_p, size_t va, size_t pa, size_t flag); + +void mmu_add_vma(struct thread *t, size_t va, size_t size, size_t pa, size_t rwx, int is_alloced); +void mmu_del_vma(struct thread *t); +void mmu_map_pages(size_t *pgd_p, size_t va, size_t size, size_t pa, size_t flag); +void mmu_free_page_tables(size_t *page_table, int level); + +void mmu_memfail_abort_handle(esr_el1_t* esr_el1); + +#endif //__ASSEMBLER__ + +#endif /* _MMU_H_ */ diff --git a/lab8/kernel/include/power.h b/lab8/kernel/include/power.h new file mode 100644 index 000000000..bd8e84b1d --- /dev/null +++ b/lab8/kernel/include/power.h @@ -0,0 +1,9 @@ +#ifndef _POWER_H_ +#define _POWER_H_ + +#include "bcm2837/rpi_mmu.h" +#define PM_PASSWORD 0x5a000000 +#define PM_RSTC PHYS_TO_VIRT(0x3F10001c) +#define PM_WDOG PHYS_TO_VIRT(0x3F100024) + +#endif /*_POWER_H_*/ diff --git a/lab8/kernel/include/sched.h b/lab8/kernel/include/sched.h new file mode 100644 index 000000000..c99a9e101 --- /dev/null +++ b/lab8/kernel/include/sched.h @@ -0,0 +1,70 @@ +#ifndef _SCHED_H_ +#define _SCHED_H_ + +#include "list.h" +#include "vfs.h" + +#define PIDMAX 32768 +#define USTACK_SIZE 0x4000 +#define KSTACK_SIZE 0x4000 +#define SIGNAL_MAX 64 + +extern void switch_to(void *curr_context, void *next_context); +extern void store_context(void *curr_context); +extern void load_context(void *curr_context); +extern void *get_current(); + +typedef struct thread_context +{ + unsigned long x19; + unsigned long x20; + unsigned long x21; + unsigned long x22; + unsigned long x23; + unsigned long x24; + unsigned long x25; + unsigned long x26; + unsigned long x27; + unsigned long x28; + unsigned long fp; + unsigned long lr; + unsigned long sp; + void* pgd; // use for MMU mapping (user space) +} thread_context_t; + +typedef struct thread +{ + list_head_t listhead; + thread_context_t context; + char* data; + unsigned int datasize; + int iszombie; + int pid; + int isused; + char* stack_alloced_ptr; + char* kernel_stack_alloced_ptr; + void (*signal_handler[SIGNAL_MAX+1])(); + int sigcount[SIGNAL_MAX + 1]; + void (*curr_signal_handler)(); + int signal_is_checking; + thread_context_t signal_saved_context; + list_head_t vma_list; + char curr_working_dir[MAX_PATH_NAME+1]; + struct file* file_descriptors_table[MAX_FD+1]; +} thread_t; + +extern thread_t *curr_thread; +extern list_head_t *run_queue; +extern list_head_t *wait_queue; +extern thread_t threads[PIDMAX + 1]; + +void schedule_timer(char *notuse); +void init_thread_sched(); +void idle(); +void schedule(); +void kill_zombies(); +void thread_exit(); +thread_t *thread_create(void *start, unsigned int filesize); +int thread_exec(char *data, unsigned int filesize); + +#endif /* _SCHED_H_ */ diff --git a/lab8/kernel/include/sdhost.h b/lab8/kernel/include/sdhost.h new file mode 100644 index 000000000..fb7cd6b80 --- /dev/null +++ b/lab8/kernel/include/sdhost.h @@ -0,0 +1,8 @@ +#ifndef _SDHOST_H_ +#define _SDHOST_H_ + +void readblock(int block_idx, void* buf); +void writeblock(int block_idx, void* buf); +void sd_init(); + +#endif /* _SDHOST_H_ */ diff --git a/lab8/kernel/include/shell.h b/lab8/kernel/include/shell.h new file mode 100644 index 000000000..8c7caf695 --- /dev/null +++ b/lab8/kernel/include/shell.h @@ -0,0 +1,29 @@ +#ifndef _SHELL_H_ +#define _SHELL_H_ + +#define CMD_MAX_LEN 0x100 +#define MSG_MAX_LEN 0x100 + +typedef struct CLI_CMDS +{ + char command[CMD_MAX_LEN]; + char help[MSG_MAX_LEN]; +} CLI_CMDS; + +int cli_cmd_strcmp(const char*, const char*); +void cli_cmd_clear(char*, int); +void cli_cmd_read(char*); +void cli_cmd_exec(char*); +void cli_print_banner(); + +void do_cmd_cat(char*); +void do_cmd_dtb(); +void do_cmd_exec(char*); +void do_cmd_help(); +void do_cmd_hello(); +void do_cmd_info(); +void do_cmd_ls(char*); +void do_cmd_setTimeout(char* msg, char* sec); +void do_cmd_reboot(); + +#endif /* _SHELL_H_ */ diff --git a/lab8/kernel/include/signal.h b/lab8/kernel/include/signal.h new file mode 100644 index 000000000..f228de096 --- /dev/null +++ b/lab8/kernel/include/signal.h @@ -0,0 +1,47 @@ +#ifndef _SIGNAL_H_ +#define _SIGNAL_H_ + +#define SIGHUP 1 /* Hangup (POSIX). */ +#define SIGINT 2 /* Interrupt (ANSI). */ +#define SIGQUIT 3 /* Quit (POSIX). */ +#define SIGILL 4 /* Illegal instruction (ANSI). */ +#define SIGTRAP 5 /* Trace trap (POSIX). */ +#define SIGABRT 6 /* Abort (ANSI). */ +#define SIGIOT 6 /* IOT trap (4.2 BSD). */ +#define SIGBUS 7 /* BUS error (4.2 BSD). */ +#define SIGFPE 8 /* Floating-point exception (ANSI). */ +#define SIGKILL 9 /* Kill, unblockable (POSIX). */ +#define SIGUSR1 10 /* User-defined signal 1 (POSIX). */ +#define SIGSEGV 11 /* Segmentation violation (ANSI). */ +#define SIGUSR2 12 /* User-defined signal 2 (POSIX). */ +#define SIGPIPE 13 /* Broken pipe (POSIX). */ +#define SIGALRM 14 /* Alarm clock (POSIX). */ +#define SIGTERM 15 /* Termination (ANSI). */ +#define SIGSTKFLT 16 /* Stack fault. */ +#define SIGCLD SIGCHLD /* Same as SIGCHLD (System V). */ +#define SIGCHLD 17 /* Child status has changed (POSIX). */ +#define SIGCONT 18 /* Continue (POSIX). */ +#define SIGSTOP 19 /* Stop, unblockable (POSIX). */ +#define SIGTSTP 20 /* Keyboard stop (POSIX). */ +#define SIGTTIN 21 /* Background read from tty (POSIX). */ +#define SIGTTOU 22 /* Background write to tty (POSIX). */ +#define SIGURG 23 /* Urgent condition on socket (4.2 BSD). */ +#define SIGXCPU 24 /* CPU limit exceeded (4.2 BSD). */ +#define SIGXFSZ 25 /* File size limit exceeded (4.2 BSD). */ +#define SIGVTALRM 26 /* Virtual alarm clock (4.2 BSD). */ +#define SIGPROF 27 /* Profiling alarm clock (4.2 BSD). */ +#define SIGWINCH 28 /* Window size change (4.3 BSD, Sun). */ +#define SIGPOLL SIGIO /* Pollable event occurred (System V). */ +#define SIGIO 29 /* I/O now possible (4.2 BSD). */ +#define SIGPWR 30 /* Power failure restart (System V). */ +#define SIGSYS 31 /* Bad system call. */ +#define SIGUNUSED 31 + +#include "exception.h" + +void signal_default_handler(); +void check_signal(trapframe_t *tpf); +void run_signal(trapframe_t* tpf,int signal); +void signal_handler_wrapper(); + +#endif /* _SIGNAL_H_ */ diff --git a/lab8/kernel/include/stddef.h b/lab8/kernel/include/stddef.h new file mode 100644 index 000000000..1698bc3f3 --- /dev/null +++ b/lab8/kernel/include/stddef.h @@ -0,0 +1,11 @@ +#ifndef STDDEF_H +#define STDDEF_H + +#define NULL 0 +#define size_t unsigned long + +/* Offset of member MEMBER in a struct of type TYPE. */ +#undef offsetof /* in case a system header has defined it. */ +#define offsetof(TYPE, MEMBER) __builtin_offsetof (TYPE, MEMBER) + +#endif diff --git a/lab8/kernel/include/string.h b/lab8/kernel/include/string.h new file mode 100644 index 000000000..f4ba13fa4 --- /dev/null +++ b/lab8/kernel/include/string.h @@ -0,0 +1,24 @@ +#ifndef _STRING_H_ +#define _STRING_H_ + +#include "stddef.h" +#define VSPRINT_MAX_BUF_SIZE 0x100 + +unsigned int sprintf(char *dst, char* fmt, ...); +unsigned int vsprintf(char *dst,char* fmt, __builtin_va_list args); + +unsigned long long strlen(const char *str); +char* strcat(char *dest, const char *src); +char* strncat(char *dest, const char *src, int n); +int strcasecmp(const char *s1, const char *s2); +int strcmp(const char*, const char*); +int strncmp(const char*, const char*, unsigned long long); +char* memcpy(void *dest, const void *src, unsigned long long len); +char* strcpy(char *dest, const char *src); +void* memset(void *s, int c, size_t n); +char* strchr(register const char *s, int c); + +char* str_SepbySpace(char* head); +int atoi(char* str); + +#endif /* _STRING_H_ */ diff --git a/lab8/kernel/include/syscall.h b/lab8/kernel/include/syscall.h new file mode 100644 index 000000000..169552061 --- /dev/null +++ b/lab8/kernel/include/syscall.h @@ -0,0 +1,34 @@ +#ifndef _SYSCALL_H_ +#define _SYSCALL_H_ + +#include "exception.h" +#include "stddef.h" + +int getpid(trapframe_t *tpf); +size_t uartread(trapframe_t *tpf, char buf[], size_t size); +size_t uartwrite(trapframe_t *tpf, const char buf[], size_t size); +int exec(trapframe_t *tpf, const char *name, char *const argv[]); +int fork(trapframe_t *tpf); +void exit(trapframe_t *tpf, int status); +int syscall_mbox_call(trapframe_t *tpf, unsigned char ch, unsigned int *mbox); +void kill(trapframe_t *tpf, int pid); +void signal_register(int signal, void (*handler)()); +void signal_kill(int pid, int signal); +void* mmap(trapframe_t *tpf, void *addr, size_t len, int prot, int flags, int fd, int file_offset); +void sigreturn(trapframe_t *tpf); + +int open(trapframe_t *tpf, const char *pathname, int flags); +int close(trapframe_t *tpf, int fd); +long write(trapframe_t *tpf, int fd, const void *buf, unsigned long count); +long read(trapframe_t *tpf, int fd, void *buf, unsigned long count); +int mkdir(trapframe_t *tpf, const char *pathname, unsigned mode); +int mount(trapframe_t *tpf, const char *src, const char *target, const char *filesystem, unsigned long flags, const void *data); +int chdir(trapframe_t *tpf, const char *path); +long lseek64(trapframe_t *tpf, int fd, long offset, int whence); +int ioctl(trapframe_t *tpf, int fd, unsigned long request, void *info); +int sync(trapframe_t *tpf); + +unsigned int get_file_size(char *thefilepath); +char *get_file_start(char *thefilepath); + +#endif /* _SYSCALL_H_*/ diff --git a/lab8/kernel/include/timer.h b/lab8/kernel/include/timer.h new file mode 100644 index 000000000..894a23b9c --- /dev/null +++ b/lab8/kernel/include/timer.h @@ -0,0 +1,29 @@ +#ifndef _TIMER_H_ +#define _TIMER_H_ + +#include "list.h" +//https://github.com/Tekki/raspberrypi-documentation/blob/master/hardware/raspberrypi/bcm2836/QA7_rev3.4.pdf p13 +#define CORE0_TIMER_IRQ_CTRL PHYS_TO_VIRT(0x40000040) + +typedef struct timer_event +{ + struct list_head listhead; + unsigned long long interrupt_time; + void *callback; + char *args; +} timer_event_t; + +extern struct list_head *timer_event_list; + +void core_timer_enable(); +void core_timer_disable(); +void core_timer_handler(); + +void add_timer(void *callback, unsigned long long timeout, char *args, int bytick); +unsigned long long get_tick_plus_s(unsigned long long second); +void set_core_timer_interrupt(unsigned long long expired_time); +void set_core_timer_interrupt_by_tick(unsigned long long tick); +void timer_list_init(); +int timer_list_get_size(); + +#endif /* _TIMER_H_ */ diff --git a/lab8/kernel/include/tmpfs.h b/lab8/kernel/include/tmpfs.h new file mode 100644 index 000000000..50367d448 --- /dev/null +++ b/lab8/kernel/include/tmpfs.h @@ -0,0 +1,38 @@ +#ifndef _TMPFS_H_ +#define _TMPFS_H_ + +#include "stddef.h" +#include "vfs.h" + +// SPEC basic Note #3 +#define MAX_FILE_NAME 15 +#define MAX_DIR_ENTRY 16 +#define MAX_FILE_SIZE 4096 + +struct tmpfs_inode +{ + enum fsnode_type type; + char name[MAX_FILE_NAME]; + struct vnode *entry[MAX_DIR_ENTRY]; + char *data; + size_t datasize; +}; + +int register_tmpfs(); +int tmpfs_setup_mount(struct filesystem *fs, struct mount *_mount); + +int tmpfs_write(struct file *file, const void *buf, size_t len); +int tmpfs_read(struct file *file, void *buf, size_t len); +int tmpfs_open(struct vnode *file_node, struct file **target); +int tmpfs_close(struct file *file); +long tmpfs_lseek64(struct file *file, long offset, int whence); +long tmpfs_getsize(struct vnode *vd); + +int tmpfs_lookup(struct vnode *dir_node, struct vnode **target, const char *component_name); +int tmpfs_create(struct vnode *dir_node, struct vnode **target, const char *component_name); +int tmpfs_mkdir(struct vnode *dir_node, struct vnode **target, const char *component_name); +int tmpfs_sync(struct filesystem *fs); + +struct vnode *tmpfs_create_vnode(struct mount *_mount, enum fsnode_type type); + +#endif /* _TMPFS_H_ */ diff --git a/lab8/kernel/include/uart1.h b/lab8/kernel/include/uart1.h new file mode 100644 index 000000000..933b9c816 --- /dev/null +++ b/lab8/kernel/include/uart1.h @@ -0,0 +1,18 @@ +#ifndef _UART1_H_ +#define _UART1_H_ + +void uart_init(); +char uart_recv(); +void uart_send(char c); +int uart_sendline(char* fmt, ...); +char uart_async_getc(); +void uart_async_putc(char c); +int uart_puts(char* fmt, ...); +void uart_2hex(unsigned int d); + +void uart_interrupt_enable(); +void uart_interrupt_disable(); +void uart_r_irq_handler(); +void uart_w_irq_handler(); + +#endif /*_UART1_H_*/ diff --git a/lab8/kernel/include/vfs.h b/lab8/kernel/include/vfs.h new file mode 100644 index 000000000..aa3f78030 --- /dev/null +++ b/lab8/kernel/include/vfs.h @@ -0,0 +1,91 @@ +#ifndef _VFS_H_ +#define _VFS_H_ + +#include "stddef.h" + +#define MAX_PATH_NAME 255 +#define MAX_FD 16 +#define O_CREAT 00000100 +#define SEEK_SET 0 +#define SEEK_CUR 1 +#define SEEK_END 2 +#define MAX_FS_REG 0x50 +#define MAX_DEV_REG 0x10 + +enum fsnode_type +{ + dir_t, + file_t +}; + +struct vnode +{ + struct mount *mount; // Superblock : represents mounted fs + struct vnode_operations *v_ops; // inode & dentry Ops: represents kernel methods for vnode + struct file_operations *f_ops; // file Ops : represents process methods for opened file + void *internal; // vnode itself : directly point to fs's vnode + struct vnode *parent; +}; + +// file handle +struct file +{ + struct vnode *vnode; + size_t f_pos; // RW position of this file handle + struct file_operations *f_ops; + int flags; +}; + +struct mount +{ + struct vnode *root; + struct filesystem *fs; +}; + +struct filesystem +{ + const char *name; + int (*setup_mount)(struct filesystem *fs, struct mount *mount); + int (*sync)(struct filesystem *fs); +}; + +struct file_operations +{ + int (*write)(struct file *file, const void *buf, size_t len); + int (*read)(struct file *file, void *buf, size_t len); + int (*open)(struct vnode *file_node, struct file **target); + int (*close)(struct file *file); + long (*lseek64)(struct file *file, long offset, int whence); + long (*getsize)(struct vnode *vd); +}; + +struct vnode_operations +{ + int (*lookup)(struct vnode *dir_node, struct vnode **target, const char *component_name); + int (*create)(struct vnode *dir_node, struct vnode **target, const char *component_name); + int (*mkdir)(struct vnode *dir_node, struct vnode **target, const char *component_name); + int (*isdir)(struct vnode *dir_node); + int (*getname)(struct vnode *dir_node, const char **name); + int (*getsize)(struct vnode *dir_node); +}; + +extern struct filesystem reg_fs[MAX_FS_REG]; + +int register_filesystem(struct filesystem *fs); +int register_dev(struct file_operations* fo); +struct filesystem *find_filesystem(const char *fs_name); +int vfs_open(const char *pathname, int flags, struct file **target); +int vfs_close(struct file *file); +int vfs_write(struct file *file, const void *buf, size_t len); +int vfs_read(struct file *file, void *buf, size_t len); +int vfs_mkdir(const char *pathname); +int vfs_mount(const char *target, const char *filesystem); +int vfs_lookup(const char *pathname, struct vnode **target); +int vfs_mknod(char* pathname, int id); +int vfs_sync(struct filesystem *fs); + +void init_rootfs(); +void vfs_test(); +char* get_absolute_path(char* path,char* curr_working_dir); + +#endif /* _VFS_H_ */ diff --git a/lab8/kernel/initramfs.cpio b/lab8/kernel/initramfs.cpio new file mode 100644 index 0000000000000000000000000000000000000000..08fa914524bd41a9ecc4d0eb44983850986ebc91 GIT binary patch literal 1057792 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

-e!a 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 UK7Zw1jl*ekMO}WXtLW$dAG(TTm;e9( literal 0 HcmV?d00001 diff --git a/lab8/kernel/makefile b/lab8/kernel/makefile new file mode 100644 index 000000000..3de158103 --- /dev/null +++ b/lab8/kernel/makefile @@ -0,0 +1,56 @@ +ARMGNU ?= aarch64-linux-gnu + +CFLAGS = -Wall -nostdlib -nostartfiles -ffreestanding -Iinclude -mgeneral-regs-only +ASMFLAGS = -Iinclude + +BUILD_DIR = build +SRC_DIR = src +#--------------------------------------------------------------------------------------- + +C_FILES = $(wildcard $(SRC_DIR)/*.c) +ASM_FILES = $(wildcard $(SRC_DIR)/*.S) +OBJ_FILES = $(C_FILES:$(SRC_DIR)/%.c=$(BUILD_DIR)/%_c.o) +OBJ_FILES += $(ASM_FILES:$(SRC_DIR)/%.S=$(BUILD_DIR)/%_s.o) + +DEP_FILES = $(OBJ_FILES:%.o=%.d) +-include $(DEP_FILES) + +$(BUILD_DIR)/%_c.o: $(SRC_DIR)/%.c + @mkdir -p $(@D) + $(ARMGNU)-gcc $(CFLAGS) -MMD -c $< -o $@ + +$(BUILD_DIR)/%_s.o: $(SRC_DIR)/%.S + $(ARMGNU)-gcc $(ASMFLAGS) -MMD -c $< -o $@ + +kernel8.img: $(SRC_DIR)/link.ld $(OBJ_FILES) + $(ARMGNU)-ld -T $(SRC_DIR)/link.ld -o $(BUILD_DIR)/kernel8.elf $(OBJ_FILES) + $(ARMGNU)-objcopy $(BUILD_DIR)/kernel8.elf -O binary kernel8.img + +all: kernel8.img + +clean: + rm -rf $(BUILD_DIR) *.img + +run: + cp -f ../create_diskimg/sdcard.img . + qemu-system-aarch64 -M raspi3b \ + -display none \ + -kernel kernel8.img \ + -serial null -serial stdio \ + -initrd initramfs.cpio \ + -drive if=sd,file=sdcard.img,format=raw \ + -dtb bcm2710-rpi-3-b-plus.dtb + +run_display: + qemu-system-aarch64 -M raspi3b -kernel kernel8.img -serial null -serial stdio -initrd initramfs.cpio -dtb bcm2710-rpi-3-b-plus.dtb + +debug: + cp -f ../create_diskimg/sdcard.img . + qemu-system-aarch64 -M raspi3b \ + -display none \ + -kernel kernel8.img \ + -serial null -serial stdio \ + -initrd initfs.gz \ + -drive if=sd,file=sdcard.img,format=raw \ + -dtb bcm2710-rpi-3-b-plus.dtb -S -s + diff --git a/lab8/kernel/src/boot.S b/lab8/kernel/src/boot.S new file mode 100644 index 000000000..06acf6ee9 --- /dev/null +++ b/lab8/kernel/src/boot.S @@ -0,0 +1,83 @@ +#include "mmu.h" + +.section ".text.boot" + +.global _start + +_start: + // Switch from EL2 to EL1 . + bl from_el2_to_el1 + +set_mmu_configuration: + // set paging configuration (up : 0xffff000000000000 low : 0x0000000000000000) + ldr x4, = TCR_CONFIG_DEFAULT + msr tcr_el1, x4 + + // Set Used Memory Attributes + ldr x4, =((MAIR_DEVICE_nGnRnE << (MAIR_IDX_DEVICE_nGnRnE * 8)) | (MAIR_NORMAL_NOCACHE << (MAIR_IDX_NORMAL_NOCACHE * 8))) + msr mair_el1, x4 + + // set and enable MMU + ldr x4, = MMU_PGD_ADDR // PGD's page frame at 0x1000 + ldr x1, = MMU_PUD_ADDR // PUD's page frame at 0x2000 + + ldr x2, = BOOT_PGD_ATTR + orr x2, x1, x2 // combine the physical address of next level page with attribute. + str x2, [x4] // [MMU_PGD_ADDR] = MMU_PUD_ADDR | BOOT_PGD_ATTR + + ldr x2, = BOOT_PUD_ATTR + mov x3, 0x00000000 + orr x3, x2, x3 // [MMU_PUD_ADDR] = 0x00000000 | BOOT_PUD_ATTR + str x3, [x1] // 1st 1GB mapped by the 1st entry of PUD + mov x3, 0x40000000 + orr x3, x2, x3 // [MMU_PUD_ADDR + 8] = 0x40000000 | BOOT_PUD_ATTR + str x3, [x1, 8] // 2nd 1GB mapped by the 2nd entry of PUD + + msr ttbr0_el1, x4 // load PGD to the bottom translation-based register. + msr ttbr1_el1, x4 // also load PGD to the upper translation based register. + + mov sp, 0x3c000000 // temp stack + bl set_2M_kernel_mmu + + mrs x2, sctlr_el1 // sctlr_el1: Provides top level control of the system, including its memory system, at EL1 and EL0. + orr x2 , x2, 1 // sctlr_el1[0]: EL1&0 stage 1 address translation enabled/disabled. + msr sctlr_el1, x2 + + // indirect branch to the upper virtual address + ldr x2, =set_exception_vector_table + br x2 + +set_exception_vector_table: + adr x1, exception_vector_table + msr vbar_el1, x1 + +setup_stack: + // set top of stack at 0xffff00003c000000 (last usable memory) + ldr x3, =_stack_top + mov sp, x3 + +setup_bss: + ldr x1, =__bss_start + ldr w2, =__bss_size +init_bss: + cbz w2, run_main + str xzr, [x1], #8 + sub w2, w2, #1 + cbnz w2, init_bss + +run_main: + ldr x1, =dtb_ptr + str x0, [x1], #8 + bl main // branch and update lr with "main" + +proc_hang: + wfe // waiting in low-power state + b proc_hang + +from_el2_to_el1: + mov x1, (1 << 31) // hcr_el2: Execution state control for EL2 + msr hcr_el2, x1 // RW[31]: 0b1 The processor execution environment for EL1 is AArch64 + mov x1, 0x3c5 // spsr_el2: Holds the saved process state when an exception is taken to EL2. + msr spsr_el2, x1 // (1)[1111] 00 (2)[0101] -> (1) EL2-PSTATE.DAIF Disabled (2) Exception level = EL1h + msr elr_el2, lr // elr_el2: When taking an exception to EL2, holds the address to return to. + eret // eret: Perform an exception return. EL2 -> EL1 diff --git a/lab8/kernel/src/cpio.c b/lab8/kernel/src/cpio.c new file mode 100644 index 000000000..352dee86f --- /dev/null +++ b/lab8/kernel/src/cpio.c @@ -0,0 +1,45 @@ +#include "cpio.h" +#include "dtb.h" +#include "string.h" + +void* CPIO_DEFAULT_START; +void* CPIO_DEFAULT_END; + +static unsigned int parse_hex_str(char *s, unsigned int max_len) +{ + unsigned int r = 0; + for (unsigned int i = 0; i < max_len; i++) { + r *= 16; + if (s[i] >= '0' && s[i] <= '9') r += s[i] - '0'; + else if (s[i] >= 'a' && s[i] <= 'f') r += s[i] - 'a' + 10; + else if (s[i] >= 'A' && s[i] <= 'F') r += s[i] - 'A' + 10; + else return r; + } + return r; +} + +int cpio_newc_parse_header(struct cpio_newc_header *this_header_pointer, char **pathname, unsigned int *filesize, char **data, struct cpio_newc_header **next_header_pointer) +{ + if (strncmp(this_header_pointer->c_magic, CPIO_NEWC_HEADER_MAGIC, sizeof(this_header_pointer->c_magic)) != 0) return -1; + + *filesize = parse_hex_str(this_header_pointer->c_filesize,8); + *pathname = ((char *)this_header_pointer) + sizeof(struct cpio_newc_header); + + unsigned int pathname_length = parse_hex_str(this_header_pointer->c_namesize,8); + unsigned int offset = pathname_length + sizeof(struct cpio_newc_header); + offset = offset % 4 == 0 ? offset:(offset+4-offset%4); + *data = (char *)this_header_pointer+offset; + + if(*filesize==0) + { + *next_header_pointer = (struct cpio_newc_header*)*data; + } + else + { + offset = *filesize; + *next_header_pointer = (struct cpio_newc_header*)(*data + (offset%4==0?offset:(offset+4-offset%4))); + } + if(strncmp(*pathname,"TRAILER!!!", sizeof("TRAILER!!!"))==0) *next_header_pointer = 0; + + return 0; +} diff --git a/lab8/kernel/src/dev_framebuffer.c b/lab8/kernel/src/dev_framebuffer.c new file mode 100644 index 000000000..9385d0fdf --- /dev/null +++ b/lab8/kernel/src/dev_framebuffer.c @@ -0,0 +1,124 @@ +#include "vfs.h" +#include "dev_framebuffer.h" +#include "uart1.h" +#include "memory.h" +#include "mbox.h" +#include "string.h" +#include "exception.h" + +#define MBOX_CH_PROP 8 + +//The following code is for mailbox initialize used in lab7. +unsigned int width, height, pitch, isrgb; /* dimensions and channel order */ +unsigned char *lfb; /* raw frame buffer address */ + +struct file_operations dev_framebuffer_operations = {dev_framebuffer_write, (void *)dev_framebuffer_op_deny, dev_framebuffer_open, dev_framebuffer_close, dev_framebuffer_lseek64, (void *)dev_framebuffer_op_deny}; + +int init_dev_framebuffer() +{ + //The following code is for mailbox initialize used in lab7. + pt[0] = 35 * 4; + pt[1] = MBOX_TAG_REQUEST_CODE; + + pt[2] = 0x48003; // set phy wh + pt[3] = 8; + pt[4] = 8; + pt[5] = 1024; // FrameBufferInfo.width + pt[6] = 768; // FrameBufferInfo.height + + pt[7] = 0x48004; // set virt wh + pt[8] = 8; + pt[9] = 8; + pt[10] = 1024; // FrameBufferInfo.virtual_width + pt[11] = 768; // FrameBufferInfo.virtual_height + + pt[12] = 0x48009; // set virt offset + pt[13] = 8; + pt[14] = 8; + pt[15] = 0; // FrameBufferInfo.x_offset + pt[16] = 0; // FrameBufferInfo.y.offset + + pt[17] = 0x48005; // set depth + pt[18] = 4; + pt[19] = 4; + pt[20] = 32; // FrameBufferInfo.depth + + pt[21] = 0x48006; // set pixel order + pt[22] = 4; + pt[23] = 4; + pt[24] = 1; // RGB, not BGR preferably + + pt[25] = 0x40001; // get framebuffer, gets alignment on request + pt[26] = 8; + pt[27] = 8; + pt[28] = 4096; // FrameBufferInfo.pointer + pt[29] = 0; // FrameBufferInfo.size + + pt[30] = 0x40008; // get pitch + pt[31] = 4; + pt[32] = 4; + pt[33] = 0; // FrameBufferInfo.pitch + + pt[34] = MBOX_TAG_LAST_BYTE; + + // this might not return exactly what we asked for, could be + // the closest supported resolution instead + if (mbox_call(MBOX_TAGS_ARM_TO_VC, (unsigned int)((unsigned long)&pt)) && pt[20] == 32 && pt[28] != 0) + { + pt[28] &= 0x3FFFFFFF; // convert GPU address to ARM address + width = pt[5]; // get actual physical width + height = pt[6]; // get actual physical height + pitch = pt[33]; // get number of bytes per line + isrgb = pt[24]; // get the actual channel order + lfb = PHYS_TO_VIRT((void *)((unsigned long)pt[28])); + } + else + { + uart_puts("Unable to set screen resolution to 1024x768x32\n"); + } + + return register_dev(&dev_framebuffer_operations); +} + +int dev_framebuffer_write(struct file *file, const void *buf, size_t len) +{ + lock(); + if (len + file->f_pos > pitch * height) + { + uart_puts("????\r\n"); + len = pitch * height - file->f_pos; + } + memcpy(lfb + file->f_pos, buf, len); + file->f_pos += len; + unlock(); + return len; +} + +int dev_framebuffer_open(struct vnode *file_node, struct file **target) +{ + (*target)->f_pos = 0; + (*target)->vnode = file_node; + (*target)->f_ops = &dev_framebuffer_operations; + return 0; +} + +int dev_framebuffer_close(struct file *file) +{ + kfree(file); + return 0; +} + +long dev_framebuffer_lseek64(struct file *file, long offset, int whence) +{ + if (whence == SEEK_SET) + { + file->f_pos = offset; + return file->f_pos; + } + return -1; +} + +int dev_framebuffer_op_deny() +{ + return -1; +} diff --git a/lab8/kernel/src/dev_uart.c b/lab8/kernel/src/dev_uart.c new file mode 100644 index 000000000..2aade4967 --- /dev/null +++ b/lab8/kernel/src/dev_uart.c @@ -0,0 +1,49 @@ +#include "vfs.h" +#include "dev_uart.h" +#include "uart1.h" +#include "memory.h" + +struct file_operations dev_file_operations = {dev_uart_write, dev_uart_read, dev_uart_open, dev_uart_close, (void *)dev_uart_op_deny, (void *)dev_uart_op_deny}; + +int init_dev_uart() +{ + return register_dev(&dev_file_operations); +} + +int dev_uart_write(struct file *file, const void *buf, size_t len) +{ + const char *cbuf = buf; + for (int i = 0; i < len;i++) + { + uart_async_putc(cbuf[i]); + } + return len; +} + +int dev_uart_read(struct file *file, void *buf, size_t len) +{ + char *cbuf = buf; + for (int i = 0; i < len; i++) + { + cbuf[i] = uart_async_getc(); + } + return len; +} + +int dev_uart_open(struct vnode *file_node, struct file **target) +{ + (*target)->vnode = file_node; + (*target)->f_ops = &dev_file_operations; + return 0; +} + +int dev_uart_close(struct file *file) +{ + kfree(file); + return 0; +} + +int dev_uart_op_deny() +{ + return -1; +} diff --git a/lab8/kernel/src/dtb.c b/lab8/kernel/src/dtb.c new file mode 100644 index 000000000..57d6eb9f3 --- /dev/null +++ b/lab8/kernel/src/dtb.c @@ -0,0 +1,152 @@ +#include "bcm2837/rpi_mmu.h" +#include "dtb.h" +#include "uart1.h" +#include "string.h" +#include "cpio.h" +#include "memory.h" + +char* dtb_ptr; + +//stored as big endian +struct fdt_header { + uint32_t magic; + uint32_t totalsize; + uint32_t off_dt_struct; + uint32_t off_dt_strings; + uint32_t off_mem_rsvmap; + uint32_t version; + uint32_t last_comp_version; + uint32_t boot_cpuid_phys; + uint32_t size_dt_strings; + uint32_t size_dt_struct; +}; + +// memory reservation block - https://zhuanlan.zhihu.com/p/144863497 +struct fdt_reserve_entry { + uint64_t address; + uint64_t size; +}; + +uint32_t uint32_endian_big2lttle(uint32_t data) +{ + char* r = (char*)&data; + return (r[3]<<0) | (r[2]<<8) | (r[1]<<16) | (r[0]<<24); +} + +uint64_t uint64_endian_big2lttle(uint64_t data) +{ + char *r = (char *)&data; + return ((unsigned long long)r[7] << 0) | ((unsigned long long)r[6] << 8) | ((unsigned long long)r[5] << 16) | ((unsigned long long)r[4] << 24) | ((unsigned long long)r[3] << 32) | ((unsigned long long)r[2] << 40) | ((unsigned long long)r[1] << 48) | ((unsigned long long)r[0] << 56); +} + +void traverse_device_tree(void *dtb_ptr, dtb_callback callback) +{ + struct fdt_header* header = dtb_ptr; + if(uint32_endian_big2lttle(header->magic) != 0xD00DFEED) + { + uart_puts("traverse_device_tree : wrong magic in traverse_device_tree"); + return; + } + // https://abcamus.github.io/2016/12/28/uboot%E8%AE%BE%E5%A4%87%E6%A0%91-%E8%A7%A3%E6%9E%90%E8%BF%87%E7%A8%8B/ + // https://blog.csdn.net/wangdapao12138/article/details/82934127 + uint32_t struct_size = uint32_endian_big2lttle(header->size_dt_struct); + char* dt_struct_ptr = (char*)((char*)header + uint32_endian_big2lttle(header->off_dt_struct)); + char* dt_strings_ptr = (char*)((char*)header + uint32_endian_big2lttle(header->off_dt_strings)); + + char* end = (char*)dt_struct_ptr + struct_size; + char* pointer = dt_struct_ptr; + + while(pointer < end) + { + uint32_t token_type = uint32_endian_big2lttle(*(uint32_t*)pointer); + + pointer += 4; + if(token_type == FDT_BEGIN_NODE) + { + callback(token_type, pointer, 0, 0); + pointer += strlen(pointer); + pointer += 4 - (unsigned long long) pointer % 4; //alignment 4 byte + }else if(token_type == FDT_END_NODE) + { + callback(token_type, 0, 0, 0); + }else if(token_type == FDT_PROP) + { + uint32_t len = uint32_endian_big2lttle(*(uint32_t*)pointer); + pointer += 4; + char* name = (char*)dt_strings_ptr + uint32_endian_big2lttle(*(uint32_t*)pointer); + pointer += 4; + callback(token_type, name, pointer, len); + pointer += len; + if((unsigned long long)pointer % 4 != 0) pointer += 4 - (unsigned long long)pointer%4; //alignment 4 byte + }else if(token_type == FDT_NOP) + { + callback(token_type, 0, 0, 0); + }else if(token_type == FDT_END) + { + callback(token_type, 0, 0, 0); + }else + { + uart_puts("error type:%x\n",token_type); + return; + } + } +} + +void dtb_callback_show_tree(uint32_t node_type, char *name, void *data, uint32_t name_size) +{ + static int level = 0; + if(node_type==FDT_BEGIN_NODE) + { + for(int i=0;imagic) != 0xD00DFEED) + { + uart_puts("traverse_device_tree : wrong magic in traverse_device_tree"); + return; + } + + // off_mem_rsvmap stores all of reserve memory map with address and size + char *dt_mem_rsvmap_ptr = (char *)((char *)header + uint32_endian_big2lttle(header->off_mem_rsvmap)); + struct fdt_reserve_entry *reverse_entry = (struct fdt_reserve_entry *)dt_mem_rsvmap_ptr; + + // reserve memory which is defined by dtb + while (reverse_entry->address != 0 || reverse_entry->size != 0) + { + unsigned long long start = PHYS_TO_VIRT(uint64_endian_big2lttle(reverse_entry->address)); + unsigned long long end = uint64_endian_big2lttle(reverse_entry->size) + start; + memory_reserve(start, end); + reverse_entry++; + } + + // reserve device tree itself + memory_reserve((unsigned long long)dtb_ptr, (unsigned long long)dtb_ptr + uint32_endian_big2lttle(header->totalsize)); +} diff --git a/lab8/kernel/src/entry.S b/lab8/kernel/src/entry.S new file mode 100644 index 000000000..76d4126d6 --- /dev/null +++ b/lab8/kernel/src/entry.S @@ -0,0 +1,196 @@ +// save general registers to stack +.macro save_all + sub sp, sp, 32 * 9 + stp x0, x1, [sp ,16 * 0] // store pair of registers + stp x2, x3, [sp ,16 * 1] + stp x4, x5, [sp ,16 * 2] + stp x6, x7, [sp ,16 * 3] + stp x8, x9, [sp ,16 * 4] + stp x10, x11, [sp ,16 * 5] + stp x12, x13, [sp ,16 * 6] + stp x14, x15, [sp ,16 * 7] + stp x16, x17, [sp ,16 * 8] + stp x18, x19, [sp ,16 * 9] + stp x20, x21, [sp ,16 * 10] + stp x22, x23, [sp ,16 * 11] + stp x24, x25, [sp ,16 * 12] + stp x26, x27, [sp ,16 * 13] + stp x28, x29, [sp ,16 * 14] + str x30, [sp, 16 * 15] + // information for nested interrupt + mrs x0, spsr_el1 + str x0, [sp, 16 * 15 + 8] + mrs x0, elr_el1 + str x0, [sp, 16 * 16] + mrs x0, sp_el0 + str x0, [sp, 16 * 16 + 8] + ldp x0, x1, [sp, 16 * 0] +.endm + +// load general registers from stack +.macro load_all + ldp x0, x1, [sp ,16 * 0] + ldp x2, x3, [sp ,16 * 1] + ldp x4, x5, [sp ,16 * 2] + ldp x6, x7, [sp ,16 * 3] + ldp x8, x9, [sp ,16 * 4] + ldp x10, x11, [sp ,16 * 5] + ldp x12, x13, [sp ,16 * 6] + ldp x14, x15, [sp ,16 * 7] + ldp x16, x17, [sp ,16 * 8] + ldp x18, x19, [sp ,16 * 9] + ldp x20, x21, [sp ,16 * 10] + ldp x22, x23, [sp ,16 * 11] + ldp x24, x25, [sp ,16 * 12] + ldp x26, x27, [sp ,16 * 13] + ldp x28, x29, [sp ,16 * 14] + ldr x30, [sp, 16 * 15] + // information for nested interrupt + ldr x0, [sp, 16 * 15 + 8] + msr spsr_el1,x0 + ldr x0, [sp, 16 * 16] + msr elr_el1, x0 + ldr x0, [sp, 16 * 16 + 8] + msr sp_el0, x0 + ldp x0, x1, [sp ,16 * 0] // restore x0 instead of elr_el1 + add sp, sp, 32 * 9 +.endm + + +.macro ventry label + .align 7 // entry should be aligned to 0x80 (2^7) + b \label +.endm + +.align 11 // vector table should be aligned to 0x800 (2^11) +.global exception_vector_table + +// exception_vector_table definition +// https://github.com/torvalds/linux/blob/v4.14/arch/arm64/kernel/entry.S#L367 +exception_vector_table: + //Exception from the current EL while using SP_EL0 + ventry el1t_sync_invalid // Synchronous EL1t + ventry el1t_irq_invalid // IRQ EL1t + ventry el1t_fiq_invalid // FIQ EL1t + ventry el1t_error_invalid // Error EL1t + + //Exception from the current EL while using SP_ELx + ventry el1h_sync // Synchronous EL1h + ventry el1h_irq // IRQ EL1h + ventry el1h_fiq_invalid // FIQ EL1h + ventry el1h_error_invalid // Error EL1h + + //Exception from a lower EL and at least one lower EL is AArch64 + ventry el0_sync_64 // Synchronous 64-bit EL0 + ventry el0_irq_64 // IRQ 64-bit EL0 + ventry el0_fiq_invalid_64 // FIQ 64-bit EL0 + ventry el0_error_invalid_64 // Error 64-bit EL0 + + //Exception from a lower EL and at least all lower EL are AArch32 + ventry el0_sync_invalid_32 // Synchronous 32-bit EL0 + ventry el0_irq_invalid_32 // IRQ 32-bit EL0 + ventry el0_fiq_invalid_32 // FIQ 32-bit EL0 + ventry el0_error_invalid_32 // Error 32-bit EL0 + + +el1t_sync_invalid: + save_all + mov x0,0 + bl invalid_exception_router + load_all + eret +el1t_irq_invalid: + save_all + mov x0,1 + bl invalid_exception_router + load_all + eret +el1t_fiq_invalid: + save_all + mov x0,2 + bl invalid_exception_router + load_all + eret +el1t_error_invalid: + save_all + mov x0,3 + bl invalid_exception_router + load_all + eret + + +el1h_sync: + save_all + mov x0,4 + bl invalid_exception_router + load_all + eret +el1h_irq: + save_all + mov x0, sp // trapframe + bl irq_router + load_all + eret +el1h_fiq_invalid: + save_all + mov x0,6 + bl invalid_exception_router + load_all + eret +el1h_error_invalid: + save_all + mov x0,7 + bl invalid_exception_router + load_all + eret + +el0_sync_64: + save_all + mov x0, sp // trapframe + bl sync_64_router + load_all + eret +el0_irq_64: + save_all + mov x0, sp // trapframe + bl irq_router + load_all + eret +el0_fiq_invalid_64: + save_all + mov x0,10 + bl invalid_exception_router + load_all + eret +el0_error_invalid_64: + save_all + mov x0,11 + bl invalid_exception_router + load_all + eret + + +el0_sync_invalid_32: + save_all + mov x0,12 + bl invalid_exception_router + load_all + eret +el0_irq_invalid_32: + save_all + mov x0,13 + bl invalid_exception_router + load_all + eret +el0_fiq_invalid_32: + save_all + mov x0,14 + bl invalid_exception_router + load_all + eret +el0_error_invalid_32: + save_all + mov x0,15 + bl invalid_exception_router + load_all + eret diff --git a/lab8/kernel/src/exception.c b/lab8/kernel/src/exception.c new file mode 100644 index 000000000..4b80e0825 --- /dev/null +++ b/lab8/kernel/src/exception.c @@ -0,0 +1,93 @@ +#include "bcm2837/rpi_uart1.h" +#include "uart1.h" +#include "exception.h" +#include "timer.h" +#include "irqtask.h" +#include "syscall.h" +#include "sched.h" +#include "signal.h" +#include "mmu.h" + +void sync_64_router(trapframe_t* tpf) +{ + unsigned long long esr_el1; + __asm__ __volatile__("mrs %0, esr_el1\n\t": "=r"(esr_el1)); + // esr_el1: Holds syndrome information for an exception taken to EL1. + esr_el1_t *esr = (esr_el1_t *)&esr_el1; + if (esr->ec == MEMFAIL_DATA_ABORT_LOWER || esr->ec == MEMFAIL_INST_ABORT_LOWER) + { + mmu_memfail_abort_handle(esr); + return; + } + + el1_interrupt_enable(); + unsigned long long syscall_no = tpf->x8; + if (syscall_no == 0) { getpid(tpf); } + else if(syscall_no == 1) { uartread(tpf,(char *) tpf->x0, tpf->x1); } + else if (syscall_no == 2) { uartwrite(tpf,(char *) tpf->x0, tpf->x1); } + else if (syscall_no == 3) { exec(tpf,(char *) tpf->x0, (char **)tpf->x1); } + else if (syscall_no == 4) { fork(tpf); } + else if (syscall_no == 5) { exit(tpf,tpf->x0); } + else if (syscall_no == 6) { syscall_mbox_call(tpf,(unsigned char)tpf->x0, (unsigned int *)tpf->x1); } + else if (syscall_no == 7) { kill(tpf, (int)tpf->x0); } + else if (syscall_no == 8) { signal_register(tpf->x0, (void (*)())tpf->x1); } + else if (syscall_no == 9) { signal_kill(tpf->x0, tpf->x1); } + else if (syscall_no == 10) { mmap(tpf,(void *)tpf->x0,tpf->x1,tpf->x2,tpf->x3,tpf->x4,tpf->x5); } + else if (syscall_no == 11) { open(tpf, (char*)tpf->x0, tpf->x1); } + else if (syscall_no == 12) { close(tpf, tpf->x0); } + else if (syscall_no == 13) { write(tpf, tpf->x0, (char *)tpf->x1, tpf->x2); } + else if (syscall_no == 14) { read(tpf, tpf->x0, (char *)tpf->x1, tpf->x2); } + else if (syscall_no == 15) { mkdir(tpf, (char *)tpf->x0, tpf->x1); } + else if (syscall_no == 16) { mount(tpf, (char *)tpf->x0, (char *)tpf->x1, (char *)tpf->x2, tpf->x3, (void*)tpf->x4); } + else if (syscall_no == 17) { chdir(tpf, (char *)tpf->x0); } + else if (syscall_no == 18) { lseek64(tpf, tpf->x0, tpf->x1, tpf->x2); } + else if (syscall_no == 19) { ioctl(tpf, tpf->x0, tpf->x1, (void*)tpf->x2); } + else if (syscall_no == 20) { sync(tpf); } + else if (syscall_no == 50) { sigreturn(tpf); } + el1_interrupt_disable(); +} + +void irq_router(trapframe_t* tpf) +{ + if (*IRQ_PENDING_1 & IRQ_PENDING_1_AUX_INT && *CORE0_INTERRUPT_SOURCE & INTERRUPT_SOURCE_GPU) { + if (*AUX_MU_IIR_REG & (1 << 1)) // can write + { + *AUX_MU_IER_REG &= ~(2); // disable write interrupt + irqtask_add(uart_w_irq_handler, UART_IRQ_PRIORITY); + irqtask_run_preemptive(); + } + else if (*AUX_MU_IIR_REG & (0b10 << 1)) // can read + { + *AUX_MU_IER_REG &= ~(1); // disable read interrupt + irqtask_add(uart_r_irq_handler, UART_IRQ_PRIORITY); + irqtask_run_preemptive(); + } + } else if(*CORE0_INTERRUPT_SOURCE & INTERRUPT_SOURCE_CNTPNSIRQ) { + core_timer_disable(); + irqtask_add(core_timer_handler, TIMER_IRQ_PRIORITY); + irqtask_run_preemptive(); + core_timer_enable(); + el1_interrupt_disable(); + if (run_queue->next->next != run_queue) schedule(); + } + if ((tpf->spsr_el1 & 0b1100) == 0) { check_signal(tpf); } + el1_interrupt_disable(); +} + +void invalid_exception_router(unsigned long long x0){ + // TBD +} + +static unsigned long long lock_count = 0; +void lock() +{ + el1_interrupt_disable(); + lock_count++; +} + +void unlock() +{ + lock_count--; + if (lock_count == 0) + el1_interrupt_enable(); +} diff --git a/lab8/kernel/src/fat32.c b/lab8/kernel/src/fat32.c new file mode 100644 index 000000000..cd26a5ce3 --- /dev/null +++ b/lab8/kernel/src/fat32.c @@ -0,0 +1,1309 @@ +#include "fat32.h" +#include "memory.h" +#include "sdhost.h" +#include "string.h" +#include "list.h" +#include +#include "uart1.h" +#include "exception.h" + +struct list_head mounts; // Store all new mountpoints that probably need to be sync'd + +struct vnode_operations fat32_v_ops = { + fat32_lookup, fat32_create, fat32_mkdir, + fat32_isdir, fat32_getname, fat32_getsize +}; + +struct file_operations fat32_f_ops = { + fat32_write, fat32_read, fat32_open, + fat32_close, fat32_lseek64, +}; + +int register_fat32() +{ + struct filesystem fs; + fs.name = "fat32"; + fs.setup_mount = fat32_mount; + fs.sync = fat32_sync; + INIT_LIST_HEAD(&mounts); + return register_filesystem(&fs); +} + +/* filesystem methods */ +int fat32_mount(struct filesystem *fs, struct mount *mount) +{ + struct partition_t *partition; + struct fat_info_t *fat; + struct fat_dir_t *dir; + struct fat32_inode *data; + struct vnode *oldnode, *node; + struct fat_mount_t *newmount; + unsigned int lba; + unsigned char buf[BLOCK_SIZE]; + + // Read partition table from MBR, which is at first block + readblock(0, buf); + // MBR format + // 000 ~ 1BD: Code area + // 1BE ~ 1FD: Master Partition Table + // 1FE ~ 1FF: Boot Record Signature + + // https://lexra.pixnet.net/blog/post/303910876 + partition = (struct partition_t *)&buf[0x1be]; + // check Boot Record Signature, constants + if (buf[0x1fe] != 0x55 || buf[0x1ff] != 0xaa) + { + return -1; + } + // https://en.wikipedia.org/wiki/Partition_type + if (partition[0].type != 0xb && partition[0].type != 0xc) // check Partition type, only FAT32 + { + return -1; + } + lba = partition[0].lba; + readblock(partition[0].lba, buf); + + node = kmalloc(sizeof(struct vnode)); + data = kmalloc(sizeof(struct fat32_inode)); + fat = kmalloc(sizeof(struct fat_info_t)); + dir = kmalloc(sizeof(struct fat_dir_t)); + newmount = kmalloc(sizeof(struct fat_mount_t)); + + memcpy((void *)&fat->bs, (void *)buf, sizeof(fat->bs)); + + // According to FAT fs design, FAT Region is after reserved sectors + // https://en.wikipedia.org/wiki/Design_of_the_FAT_file_system + fat->fat_lba = lba + fat->bs.reserved_sector_cnt; + fat->cluster_lba = fat->fat_lba + fat->bs.fat_cnt * fat->bs.sector_per_fat32; + + INIT_LIST_HEAD(&dir->list); + + // oldnode should attach mount the fs + oldnode = mount->root; + + node->mount = oldnode->mount; + node->v_ops = oldnode->v_ops; + node->f_ops = oldnode->f_ops; + node->parent = oldnode->parent; + node->internal = oldnode->internal; + + data->node = node; + data->fat = fat; + data->cid = 2; // In FAT32, Root Directory Table starts from cluster #2 + data->type = FAT_DIR; + data->dir = dir; + + oldnode->mount = mount; + oldnode->v_ops = &fat32_v_ops; + oldnode->f_ops = &fat32_f_ops; + oldnode->internal = data; + + lock(); + list_add(&newmount->list, &mounts); + unlock(); + newmount->mount = mount; + + return 0; +} + +int fat32_lookup(struct vnode *dir_node, struct vnode **target, const char *component_name) +{ + if (((struct fat32_inode *)dir_node->internal)->type != FAT_DIR) return -1; + if (!_lookup_cache(dir_node, target, component_name)) return 0; + return _lookup_fat32(dir_node, target, component_name); +} + +int fat32_create(struct vnode *dir_node, struct vnode **target, const char *component_name) +{ + if (((struct fat32_inode *)dir_node->internal)->type != FAT_DIR) return -1; + if (!fat32_lookup(dir_node, target, component_name)) return -1; + *target = _create_vnode(dir_node, component_name, FAT_FILE, -1, 0); + return 0; +} + +int fat32_mkdir(struct vnode *dir_node, struct vnode **target, const char *component_name) +{ + if (((struct fat32_inode *)dir_node->internal)->type != FAT_DIR) return -1; + if (!fat32_lookup(dir_node, target, component_name)) return -1; + *target = _create_vnode(dir_node, component_name, FAT_DIR, -1, 0); + return 0; +} + +int fat32_isdir(struct vnode *dir_node) +{ + return (((struct fat32_inode *)dir_node->internal)->type == FAT_DIR) ? 1 : 0; +} + +int fat32_getname(struct vnode *dir_node, const char **name) +{ + *name = ((struct fat32_inode *)dir_node->internal)->name; + return 0; +} + +int fat32_getsize(struct vnode *dir_node) +{ + if (((struct fat32_inode *)dir_node->internal)->type == FAT_DIR) return 0; + return ((struct fat32_inode *)dir_node->internal)->file->size; +} + +/* file_operations methods */ +int fat32_write(struct file *file, const void *buf, size_t len) +{ + struct fat32_inode *data; + int filesize; + int ret; + + if (fat32_isdir(file->vnode)) return -1; + if (!len) return len; + + filesize = fat32_getsize(file->vnode); + data = file->vnode->internal; + + ret = _writefile(buf, data, file->f_pos, len); + if (ret <= 0) { + return ret; + } + + file->f_pos += ret; + if (file->f_pos > filesize) { + data->file->size = file->f_pos; + } + + return ret; +} + +int fat32_read(struct file *file, void *buf, size_t len) +{ + struct fat32_inode *data; + int filesize; + int ret; + + if (fat32_isdir(file->vnode)) return -1; + + filesize = fat32_getsize(file->vnode); + data = file->vnode->internal; + + if (file->f_pos + len > filesize) { + len = filesize - file->f_pos; + } + if (!len) return len; + + ret = _readfile(buf, data, file->f_pos, len); + if (ret <= 0) return ret; + + file->f_pos += ret; + return ret; +} + +int fat32_open(struct vnode *file_node, struct file **target) +{ + (*target)->vnode = file_node; + (*target)->f_pos = 0; + (*target)->f_ops = file_node->f_ops; + return 0; +} + +int fat32_close(struct file *file) +{ + file->vnode = NULL; + file->f_pos = 0; + file->f_ops = NULL; + return 0; +} + +long fat32_lseek64(struct file *file, long offset, int whence) +{ + int filesize; + int base; + + if (!fat32_isdir(file->vnode)) return -1; + + filesize = fat32_getsize(file->vnode); + + if (filesize < 0) return -1; + + switch (whence) + { + case SEEK_SET: + base = 0; + break; + case SEEK_CUR: + base = file->f_pos; + break; + case SEEK_END: + base = filesize; + break; + default: + return -1; + } + + if (base + offset > filesize) + { + return -1; + } + file->f_pos = base + offset; + + return 0; +} + +int fat32_sync(struct filesystem *fs) +{ + struct fat_mount_t *entry; + + list_for_each_entry(entry, &mounts, list) + { + _sync_dir(entry->mount->root); + } + + return 0; +} + +// ------------------------------------------------------------------------ +// Utils +// + +unsigned int get_next_cluster(unsigned int fat_lba, unsigned int cluster_id) +{ + struct cluster_entry_t *ce; + unsigned int idx; + unsigned char buf[BLOCK_SIZE]; + + if (cluster_id >= INVALID_CID) + { + return cluster_id; + } + + // Get fat allocation table and its cluster entry in Data region + fat_lba += cluster_id / CLUSTER_ENTRY_PER_BLOCK; + idx = cluster_id % CLUSTER_ENTRY_PER_BLOCK; + + readblock(fat_lba, buf); + ce = &(((struct cluster_entry_t *)buf)[idx]); + + return ce->val; +} + +unsigned int alloc_cluster(struct fat_info_t *fat, unsigned int prev_cid) +{ + struct cluster_entry_t *ce; + unsigned int fat_lba; + unsigned int cid; + int found; + unsigned char buf[BLOCK_SIZE]; + + fat_lba = fat->fat_lba; + cid = 0; + // find unused cluster by clusters -> fats + while (fat_lba < fat->cluster_lba) { + found = 0; + readblock(fat_lba, buf); + + for (int i = 0; i < CLUSTER_ENTRY_PER_BLOCK; ++i) { + ce = &(((struct cluster_entry_t *)buf)[i]); + + if (!ce->val) { + found = 1; + break; + } + + ++cid; + } + + if (found) { + break; + } + fat_lba += 1; + } + // Only called if prev_cid is larger than 0xfffffff8, realloc ce; + if (found && prev_cid) { + unsigned int target_lba; + unsigned int target_idx; + + target_lba = fat_lba + prev_cid / CLUSTER_ENTRY_PER_BLOCK; + target_idx = prev_cid % CLUSTER_ENTRY_PER_BLOCK; + readblock(target_lba, buf); + ce = &(((struct cluster_entry_t *)buf)[target_idx]); + ce->val = cid; + writeblock(target_lba, buf); + } + + if (!found) { + uart_sendline("fat32 alloc_cluster: No space!"); + return -1; + } + + return cid; +} + +/* vnode_operations methods */ +struct vnode *_create_vnode(struct vnode *parent, const char *name, unsigned int type, unsigned int cid, unsigned int size) +{ + struct vnode *node; + struct fat32_inode *info, *data; + char *buf; + int len; + + info = parent->internal; + len = strlen(name); + + buf = kmalloc(len + 1); + node = kmalloc(sizeof(struct vnode)); + data = kmalloc(sizeof(struct fat32_inode)); + + strcpy(buf, name); + + data->name = buf; + data->node = node; + data->fat = info->fat; + data->cid = cid; + data->type = type; + + if (type == FAT_DIR) { + struct fat_dir_t *dir; + dir = kmalloc(sizeof(struct fat_dir_t)); + INIT_LIST_HEAD(&dir->list); + data->dir = dir; + } else { + struct fat_file_t *file; + file = kmalloc(sizeof(struct fat_file_t)); + INIT_LIST_HEAD(&file->list); + file->size = size; + data->file = file; + } + + node->mount = parent->mount; + node->v_ops = &fat32_v_ops; + node->f_ops = &fat32_f_ops; + node->parent = parent; + node->internal = data; + + // attach to parent's dir_t or file_t list + list_add(&data->list, &info->dir->list); + + return node; +} + +int _lookup_cache(struct vnode *dir_node, struct vnode **target, const char *component_name) +{ + struct fat32_inode *data, *entry; + struct fat_dir_t *dir; + int found; + + data = dir_node->internal; + dir = data->dir; + found = 0; + + list_for_each_entry(entry, &dir->list, list) { + if (!strcasecmp(component_name, entry->name)) { // same as strcmp, but tr [:lower:] + found = 1; + break; + } + } + if (!found) { + return -1; + } + *target = entry->node; + return 0; +} + +struct dir_t *__lookup_fat32(struct vnode *dir_node, const char *component_name, unsigned char *buf, int *buflba) +{ + struct dir_t *dir; + struct fat32_inode *data; + struct fat_info_t *fat; + struct filename_t name; + unsigned int cid; + int found, dirend, lfn; + + data = dir_node->internal; + fat = data->fat; + cid = data->cid; + + found = 0; + dirend = 0; + + memset(&name, 0, sizeof(struct filename_t)); + + while (1) { + int lba; + + lba = fat->cluster_lba + (cid - 2) * fat->bs.sector_per_cluster; // cluster start from #2 + readblock(lba, buf); + + // only called by sync, to update buffer + if (buflba) { + *buflba = lba; + } + + for (int i = 0; i < DIR_PER_BLOCK; ++i) { + unsigned char len; + dir = (struct dir_t *)(&buf[sizeof(struct dir_t) * i]); + + if (dir->name[0] == 0) { + dirend = 1; + break; + } + + if ((dir->attr & ATTR_LFN) == ATTR_LFN) { + struct long_dir_t *ldir; + int n; + + lfn = 1; + + ldir = (struct long_dir_t *)dir; + n = (dir->name[0] & 0x3f) - 1; // every lfn entry has 16 bytes + // update filename_t if it is LFN + for (int i = 0; ldir->name1[i] != 0xff && i < 10; i += 2) { + name.part[n].name[i / 2] = ldir->name1[i]; // LDIR_Name1 1th ~ 5th + } + for (int i = 0; ldir->name2[i] != 0xff && i < 12; i += 2) { + name.part[n].name[5 + i / 2] = ldir->name2[i]; // LDIR_Name2 6th ~ 11th + } + for (int i = 0; ldir->name3[i] != 0xff && i < 4; i += 2) { + name.part[n].name[11 + i / 2] = ldir->name3[i]; // LDIR_Name3 12th ~ 13th + } + + continue; + } + + if (lfn == 1) { + if (!strcasecmp(component_name, (void *)name.fullname)) { + found = 1; + break; + } + + lfn = 0; + memset(&name, 0, sizeof(struct filename_t)); + continue; + } + + lfn = 0; + len = 8; + + // SFN lookup + while (len) { + if (dir->name[len - 1] != 0x20) { + break; + } + len -= 1; + } + + memcpy((void *)name.fullname, (void *)dir->name, len); + name.fullname[len] = 0; + + len = 3; + + while (len) { + if (dir->name[8 + len - 1] != 0x20) { + break; + } + len -= 1; + } + + if (len >= 0) { + strcat((void *)name.fullname, "."); + strncat((void *)name.fullname, (void *)&dir->name[8], len); + } + + if (!strcasecmp(component_name, (void *)name.fullname)) { + found = 1; + break; + } + + memset(&name, 0, sizeof(struct filename_t)); + } + + if (found) { + break; + } + + if (dirend) { + break; + } + + // try next cluster and lookup again + cid = get_next_cluster(fat->fat_lba, cid); + + if (cid >= INVALID_CID) { + break; + } + } + + if (!found) { + return NULL; + } + + return dir; +} + +int _lookup_fat32(struct vnode *dir_node, struct vnode **target, const char *component_name) +{ + struct vnode *node; + struct dir_t *dir; + unsigned int type, cid; + unsigned char buf[BLOCK_SIZE]; + + dir = __lookup_fat32(dir_node, component_name, buf, NULL); + + if (!dir) { + return -1; + } + + if (!(dir->attr & ATTR_FILE_DIR_MASK)) { + return -1; + } + + cid = (dir->ch << 16) | dir->cl; // upper part of cluster id + lower part of cluster id + + if (dir->attr & ATTR_ARCHIVE) { + type = FAT_FILE; + } else { + type = FAT_DIR; + } + + node = _create_vnode(dir_node, component_name, type, cid, dir->size); + + *target = node; + + return 0; +} + + +int _writefile_seek_cache(struct fat32_inode *data, unsigned int foid, struct fat_file_block_t **block) +{ + struct fat_file_block_t *entry; + struct list_head *head; + + head = &data->file->list; + + if (list_empty(head)) { + return -1; + } + + list_for_each_entry(entry, head, list) { + *block = entry; + if (foid == entry->oid) { // offset match + return 0; + } + } + + return -1; +} + +int _writefile_seek_fat32(struct fat32_inode *data, unsigned int foid, unsigned int fcid, struct fat_file_block_t **block) +{ + struct fat_info_t *info; + unsigned int curoid, curcid; + + info = data->fat; + + // block is from cache + if (*block) { + curoid = (*block)->oid; + curcid = (*block)->cid; + + if (curoid == foid) { // offset match + return 0; + } + + curoid++; + curcid = get_next_cluster(info->fat_lba, curcid); + } else { + curoid = 0; + curcid = fcid; + } + + // create new block in cache + while (1) { + struct fat_file_block_t *newblock; + + newblock = kmalloc(sizeof(struct fat_file_block_t)); + + newblock->oid = curoid; + newblock->cid = curcid; + newblock->bufIsUpdated = 0; + newblock->isDirty = 1; + + list_add_tail(&newblock->list, &data->file->list); + + *block = newblock; + + if (curoid == foid) { + return 0; + } + + curoid++; + curcid = get_next_cluster(info->fat_lba, curcid); + } +} + +int _writefile_cache(struct fat32_inode *data, unsigned long long bckoff, const unsigned char *buf, unsigned long long bufoff, unsigned int size, struct fat_file_block_t *block) +{ + int wsize; + + // if cache block is not updated yet, read from sdcard + if (!block->bufIsUpdated) { + // read the data from sdcard + struct fat_info_t *info; + int lba; + + info = data->fat; + lba = info->cluster_lba + (block->cid - 2) * info->bs.sector_per_cluster; + + readblock(lba, block->buf); + + block->bufIsUpdated = 1; + } + + wsize = size > BLOCK_SIZE - bckoff ? BLOCK_SIZE - bckoff : size; + memcpy((void *)&block->buf[bckoff], (void *)&buf[bufoff], wsize); + + return wsize; +} + +int _writefile_fat32(struct fat32_inode *data, unsigned long long bckoff, const unsigned char *buf, unsigned int bufoff, unsigned int size, unsigned int oid, unsigned int cid) +{ + struct list_head *head; + struct fat_info_t *info; + struct fat_file_block_t *block; + int lba; + int wsize; + + head = &data->file->list; + info = data->fat; + + block = kmalloc(sizeof(struct fat_file_block_t)); + + wsize = size > BLOCK_SIZE - bckoff ? BLOCK_SIZE - bckoff : size; + // read the address from sdcard and write it + if (cid >= INVALID_CID) { + memset(block->buf, 0, BLOCK_SIZE); + } else { + lba = info->cluster_lba + (cid - 2) * info->bs.sector_per_cluster; + + readblock(lba, block->buf); + } + + memcpy((void *)&block->buf[bckoff], (void *)&buf[bufoff], wsize); + + block->oid = oid; + block->cid = cid; + block->bufIsUpdated = 1; + block->isDirty = 1; // wait for sync + + list_add_tail(&block->list, head); + + return wsize; +} + +int _writefile(const void *buf, struct fat32_inode *data, unsigned long long fileoff, unsigned long long len) +{ + struct fat_file_block_t *block; + struct list_head *head; + unsigned int foid; // first block id + unsigned int coid; // current block id + unsigned int cid; // target cluster id + unsigned long long bufoff, result; + int ret; + + block = NULL; + head = &data->file->list; + foid = fileoff / BLOCK_SIZE; + coid = 0; + cid = data->cid; + bufoff = 0; + result = 0; + + // Seek, find the particular offset + ret = _writefile_seek_cache(data, foid, &block); + + if (ret < 0) { + ret = _writefile_seek_fat32(data, foid, cid, &block); + } + + if (ret < 0) { + return 0; + } + + // Write + while (len) { + unsigned long long bckoff; + + bckoff = (fileoff + result) % BLOCK_SIZE; + + if (&block->list != head) { + // cache has the blocks to be written + ret = _writefile_cache(data, bckoff, buf, bufoff, len, block); + cid = block->cid; + block = list_first_entry(&block->list, struct fat_file_block_t, list); + } else { + // Read block from sdcard, create cache, then write it + cid = get_next_cluster(data->fat->fat_lba, cid); + ret = _writefile_fat32(data, bckoff, buf, bufoff, len, coid, cid); + } + + if (ret < 0) { + break; + } + + bufoff += ret; + result += ret; + coid += 1; + len -= ret; + } + + return result; +} + + +int _readfile_seek_cache(struct fat32_inode *data, unsigned int foid, struct fat_file_block_t **block) +{ + struct fat_file_block_t *entry; + struct list_head *head; + + // check the cache list + head = &data->file->list; + + // if cache is none, return not found + if (list_empty(head)) { + return -1; + } + + // find that offset in cache + list_for_each_entry(entry, head, list) { + *block = entry; + if (foid == entry->oid) { + return 0; + } + } + + return -1; +} + +int _readfile_seek_fat32(struct fat32_inode *data, unsigned int foid, unsigned int fcid, struct fat_file_block_t **block) +{ + struct fat_info_t *info; + unsigned int curoid, curcid; + + info = data->fat; + + // if block found in cache, change to that offset in fat32 + if (*block) { + curoid = (*block)->oid; + curcid = (*block)->cid; + + if (curoid == foid) { + return 0; + } + + curoid++; + curcid = get_next_cluster(info->fat_lba, curcid); + + if (curcid >= INVALID_CID) { + return -1; + } + } else { + curoid = 0; + curcid = fcid; + } + + while (1) { + // add new offset block to cache + struct fat_file_block_t *newblock; + + newblock = kmalloc(sizeof(struct fat_file_block_t)); + + newblock->oid = curoid; + newblock->cid = curcid; + newblock->bufIsUpdated = 0; + newblock->isDirty = 0; + + list_add_tail(&newblock->list, &data->file->list); + + *block = newblock; + + if (curoid == foid) { + return 0; + } + + curoid++; + curcid = get_next_cluster(info->fat_lba, curcid); + + if (curcid >= INVALID_CID) { + return -1; + } + } +} + +int _readfile_cache(struct fat32_inode *data, unsigned long long bckoff, unsigned char *buf, unsigned long long bufoff, unsigned int size, struct fat_file_block_t *block) +{ + int rsize; + + if (!block->bufIsUpdated) { + // read the data from sdcard + struct fat_info_t *info; + int lba; + + info = data->fat; + lba = info->cluster_lba + (block->cid - 2) * info->bs.sector_per_cluster; + readblock(lba, block->buf); + + block->bufIsUpdated = 1; + } + + // if the size is overflow, resize it + rsize = size > BLOCK_SIZE - bckoff ? BLOCK_SIZE - bckoff : size; + + memcpy((void *)&buf[bufoff], (void *)&block->buf[bckoff], rsize); + + return rsize; +} + +int _readfile_fat32(struct fat32_inode *data, unsigned long long bckoff, unsigned char *buf, unsigned int bufoff, unsigned int size, unsigned int oid, unsigned int cid) +{ + struct list_head *head; + struct fat_info_t *info; + struct fat_file_block_t *block; + int lba; + int rsize; + + head = &data->file->list; + info = data->fat; + + block = kmalloc(sizeof(struct fat_file_block_t)); + + rsize = size > BLOCK_SIZE - bckoff ? BLOCK_SIZE - bckoff : size; + lba = info->cluster_lba + (cid - 2) * info->bs.sector_per_cluster; + + // read from fat32 + readblock(lba, block->buf); + + memcpy((void *)&buf[bufoff], (void *)&block->buf[bckoff], rsize); + + block->oid = oid; + block->cid = cid; + block->bufIsUpdated = 1; + + list_add_tail(&block->list, head); + + return rsize; +} + +int _readfile(void *buf, struct fat32_inode *data, unsigned long long fileoff, unsigned long long len) +{ + struct fat_file_block_t *block; + struct list_head *head; + unsigned int foid; // first block id + unsigned int coid; // current block id + unsigned int cid; // target cluster id + unsigned long long bufoff, result; + int ret; + + block = NULL; + head = &data->file->list; + foid = fileoff / BLOCK_SIZE; + coid = 0; + cid = data->cid; + bufoff = 0; + result = 0; + + // Seek, find the particular offset + ret = _readfile_seek_cache(data, foid, &block); + if (ret < 0) { + ret = _readfile_seek_fat32(data, foid, cid, &block); + } + + if (ret < 0) { + return 0; + } + + // Read + while (len) { + unsigned long long bckoff; + + bckoff = (fileoff + result) % BLOCK_SIZE; + + if (&block->list != head) { + // cache found + ret = _readfile_cache(data, bckoff, buf, bufoff, len, block); + + cid = block->cid; + block = list_first_entry(&block->list, struct fat_file_block_t, list); + } else { + // Read block from sdcard, create cache + cid = get_next_cluster(data->fat->fat_lba, cid); + + if (cid >= INVALID_CID) { + break; + } + + ret = _readfile_fat32(data, bckoff, buf, bufoff, len, coid, cid); + } + + if (ret < 0) { + break; + } + + bufoff += ret; + result += ret; + coid += 1; + len -= ret; + } + + return result; +} + + +void _do_sync_dir(struct vnode *dirnode) +{ + struct fat32_inode *data, *entry; + struct list_head *head; + struct dir_t *dir; + struct long_dir_t *ldir; + unsigned int cid; + int lba, idx, lfnidx; + unsigned char buf[BLOCK_SIZE]; + + data = dirnode->internal; + head = &data->dir->list; + cid = data->cid; + idx = 0; + lfnidx = 1; + + if (cid >= INVALID_CID) { + uart_sendline("fat32 _do_sync_dir: invalid dirnode->data->cid"); + } + + // get the buf from dirnode's offset + lba = data->fat->cluster_lba + (cid - 2) * data->fat->bs.sector_per_cluster; + readblock(lba, buf); + + list_for_each_entry(entry, head, list) { + struct dir_t *origindir; + const char *name; + const char *ext; + int lfn, namelen, extpos, i, buflba; + unsigned char lookupbuf[BLOCK_SIZE]; + + name = entry->name; + + // If entry is a old file, update its size + origindir = __lookup_fat32(dirnode, name, lookupbuf, &buflba); + + if (origindir) { + if (entry->type == FAT_FILE) { + origindir->size = entry->file->size; + writeblock(buflba, lookupbuf); + } + continue; + } + + // Else if entry is a new file + ext = NULL; + extpos = -1; + + do { + + namelen = strlen(name); + if (namelen >= 13) { + lfn = 1; + break; + } + for (i = 0; i < namelen; ++i) { + // get idx of extension name + if (name[namelen - 1 - i] == '.') { + break; + } + } + if (i < namelen) { + ext = &name[namelen - i]; + extpos = namelen - 1 - i; + } + if (i >= 4) { + lfn = 1; + break; + } + if (namelen - 1 - i > 8) { + // SFN: 8.3 + lfn = 1; + break; + } + + lfn = 0; + } while(0); + + // Seek idx to the end of dir + while (1) { + dir = (struct dir_t *)(&buf[sizeof(struct dir_t) * idx]); + + if (dir->name[0] == 0) { + break; + } + + idx += 1; + + if (idx >= 16) { // if idx is over Directory Entry, create a new one + unsigned int newcid; + + writeblock(lba, buf); + + newcid = get_next_cluster(data->fat->fat_lba, cid); + if (newcid >= INVALID_CID) + { + newcid = alloc_cluster(data->fat, cid); + } + + cid = newcid; + + lba = data->fat->cluster_lba + (cid - 2) * data->fat->bs.sector_per_cluster; + + readblock(lba, buf); + idx = 0; + } + } + + // Write LFN + if (lfn) { + int ord; + int first; + + ord = ((namelen - 1) / 13) + 1; + first = 0x40; // LAST_LONG_ENTRY flag in LFN LDIR_Ord + + for (; ord > 0; --ord) { + int end; + ldir = (struct long_dir_t *)(&buf[sizeof(struct long_dir_t) * idx]); + + ldir->order = first | ord; + ldir->attr = ATTR_LFN; + ldir->type = 0; + // TODO: Calculate checksum, SFN + LFN + ldir->checksum = 0; + ldir->fstcluslo = 0; + + first = 0; + end = 0; + + for (i = 0; i < 10; i += 2) { + if (end) { // padding 0xff if filename end + ldir->name1[i] = 0xff; + ldir->name1[i + 1] = 0xff; + } else { + ldir->name1[i] = name[(ord - 1) * 13 + i / 2]; + ldir->name1[i + 1] = 0; + if (ldir->name1[i] == 0) { + end = 1; + } + } + } + for (i = 0; i < 12; i += 2) { + if (end) { + ldir->name2[i] = 0xff; + ldir->name2[i + 1] = 0xff; + } else { + ldir->name2[i] = name[(ord - 1) * 13 + 5 + i / 2]; + ldir->name2[i + 1] = 0; + if (ldir->name2[i] == 0) { + end = 1; + } + } + } + for (i = 0; i < 4; i += 2) { + if (end) { + ldir->name3[i] = 0xff; + ldir->name3[i + 1] = 0xff; + } else { + ldir->name3[i] = name[(ord - 1) * 13 + 11 + i / 2]; + ldir->name3[i + 1] = 0; + if (ldir->name3[i] == 0) { + end = 1; + } + } + } + + idx += 1; + + if (idx >= 16) { + unsigned int newcid; + + writeblock(lba, buf); + + newcid = get_next_cluster(data->fat->fat_lba, cid); + if (newcid >= INVALID_CID) { + newcid = alloc_cluster(data->fat, cid); + } + + cid = newcid; + + lba = data->fat->cluster_lba + (cid - 2) * data->fat->bs.sector_per_cluster; + readblock(lba, buf); + + idx = 0; + } + } + } + + // Write SFN + dir = (struct dir_t *)(&buf[sizeof(struct dir_t) * idx]); + + // TODO: Set these properties properly + dir->ntres = 0; + dir->crttimetenth = 0; + dir->crttime = 0; + dir->crtdate = 0; + dir->lstaccdate = 0; + dir->wrttime = 0; + dir->wrtdate = 0; + + if (entry->type == FAT_DIR) { + dir->attr = ATTR_DIRECTORY; + dir->size = 0; + } else { + dir->attr = ATTR_ARCHIVE; + dir->size = entry->file->size; + } + + if (entry->cid >= INVALID_CID) { + entry->cid = alloc_cluster(data->fat, 0); + } + + dir->ch = (entry->cid >> 16) & 0xffff; + dir->cl = entry->cid & 0xffff; + + if (lfn) { + int lfni; + + // Creating SFN body + // TODO: handle lfnidx + for (i = 7, lfni = lfnidx; i >= 0 && lfni;) { + dir->name[i--] = '0' + lfni % 10; + lfni /= 10; + } + + lfnidx++; + // numeric-tail: ~n (1 <= n <= 6) + dir->name[i--] = '~'; + + // TODO: handle letter case + memcpy((void *)dir->name, name, i + 1); + } else { + // TODO: handle letter case + for (i = 0; i != extpos && name[i]; ++i) { + dir->name[i] = name[i]; + } + + for (; i < 8; ++i) { + dir->name[i] = ' '; // in SFN, each part is padded with space + } + } + + // SFN format: 8.3 + // TODO: handle letter case + for (i = 0; i < 3 && ext[i]; ++i) { + dir->name[8 + i] = ext[i]; + } + + for (; i < 3; ++i) { + dir->name[8 + i] = ' '; + } + + idx += 1; + + if (idx >= 16) { + int newcid; + + writeblock(lba, buf); + + newcid = get_next_cluster(data->fat->fat_lba, cid); + if (newcid >= INVALID_CID) { + newcid = alloc_cluster(data->fat, cid); + } + + cid = newcid; + + lba = data->fat->cluster_lba + (cid - 2) * data->fat->bs.sector_per_cluster; + + // TODO: Cache data block of directory + readblock(lba, buf); + + idx = 0; + } + } + + if (idx) { + writeblock(lba, buf); + } +} + +void _do_sync_file(struct vnode *filenode) +{ + struct fat_file_block_t *entry; + struct fat32_inode *data; + struct list_head *head; + unsigned int cid; + + data = filenode->internal; + head = &data->file->list; + cid = data->cid; + + if (cid >= INVALID_CID) { + //uart_sendline("fat32 _do_sync_file: invalid cid"); + return; + } + + list_for_each_entry(entry, head, list) { + int lba; + + if (entry->oid == 0) { + // cache is valid but not sync'd, just an informational warning + if (!(entry->cid >= INVALID_CID) && data->cid != entry->cid) { + uart_sendline("_do_sync_file: cid isn't sync"); + } + + entry->cid = data->cid; + } + + if (entry->cid >= INVALID_CID) { + entry->cid = alloc_cluster(data->fat, cid); + } + + // if the file is sync'd, pass + if (!entry->isDirty) { + continue; + } + + // cache buf is not updated, initialize it to avoid error + if (!entry->bufIsUpdated) { + memset(entry->buf, 0, BLOCK_SIZE); + entry->bufIsUpdated = 1; + } + + // sync to fat32 fs + lba = data->fat->cluster_lba + (entry->cid - 2) * data->fat->bs.sector_per_cluster; + writeblock(lba, entry->buf); + + entry->isDirty = 0; + + cid = entry->cid; + } +} + +void _sync_dir(struct vnode *dirnode) +{ + struct fat32_inode *data, *entry; + struct list_head *head; + + // Init: dirnode is mounted fs + data = dirnode->internal; + head = &data->dir->list; + + _do_sync_dir(dirnode); + + list_for_each_entry(entry, head, list) { + if (entry->type == FAT_DIR) { + _sync_dir(entry->node); // recursive to next dirnode + } else { + _do_sync_file(entry->node); + } + } +} diff --git a/lab8/kernel/src/initramfs.c b/lab8/kernel/src/initramfs.c new file mode 100644 index 000000000..701518ba4 --- /dev/null +++ b/lab8/kernel/src/initramfs.c @@ -0,0 +1,163 @@ +#include "initramfs.h" +#include "vfs.h" +#include "string.h" +#include "memory.h" +#include "cpio.h" +#include "uart1.h" + +struct file_operations initramfs_file_operations = {initramfs_write, initramfs_read, initramfs_open, initramfs_close, initramfs_lseek64,initramfs_getsize}; +struct vnode_operations initramfs_vnode_operations = {initramfs_lookup, initramfs_create, initramfs_mkdir}; + +int register_initramfs() +{ + struct filesystem fs; + fs.name = "initramfs"; + fs.setup_mount = initramfs_setup_mount; + fs.sync = initramfs_sync; + return register_filesystem(&fs); +} + +int initramfs_setup_mount(struct filesystem *fs, struct mount *_mount) +{ + _mount->fs = fs; + _mount->root = initramfs_create_vnode(0, dir_t); + struct initramfs_inode *ramdir_inode = _mount->root->internal; + + // add all file in initramfs to filesystem + char *filepath; + char *filedata; + unsigned int filesize; + struct cpio_newc_header *header_pointer = CPIO_DEFAULT_START; + int idx = 0; + + while (header_pointer != 0) + { + int error = cpio_newc_parse_header(header_pointer, &filepath, &filesize, &filedata, &header_pointer); + //if parse header error + if (error) + { + uart_sendline("%s", "error\r\n"); + break; + } + + //if this is not TRAILER!!! (last of file) + if (header_pointer != 0) + { + // only support file (no dir) + struct vnode * filevnode = initramfs_create_vnode(0, file_t); + struct initramfs_inode *fileinode = filevnode->internal; + fileinode->data = filedata; + fileinode->datasize = filesize; + fileinode->name = filepath; + ramdir_inode->entry[idx++] = filevnode; + } + } + + return 0; +} + +struct vnode *initramfs_create_vnode(struct mount *_mount, enum fsnode_type type) +{ + struct vnode *v = kmalloc(sizeof(struct vnode)); + v->f_ops = &initramfs_file_operations; + v->v_ops = &initramfs_vnode_operations; + v->mount = _mount; + struct initramfs_inode *inode = kmalloc(sizeof(struct initramfs_inode)); + memset(inode, 0, sizeof(struct initramfs_inode)); + inode->type = type; + inode->data = kmalloc(0x1000); + v->internal = inode; + return v; +} + +// file operations +int initramfs_write(struct file *file, const void *buf, size_t len) +{ + // read-only + return -1; +} + +int initramfs_read(struct file *file, void *buf, size_t len) +{ + struct initramfs_inode *inode = file->vnode->internal; + + if (len + file->f_pos > inode->datasize) + { + memcpy(buf, inode->data + file->f_pos, inode->datasize - file->f_pos); + file->f_pos += inode->datasize - file->f_pos; + return inode->datasize - file->f_pos; + } + else + { + memcpy(buf, inode->data + file->f_pos, len); + file->f_pos += len; + return len; + } + return -1; +} + +int initramfs_open(struct vnode *file_node, struct file **target) +{ + (*target)->vnode = file_node; + (*target)->f_ops = file_node->f_ops; + (*target)->f_pos = 0; + return 0; +} + +int initramfs_close(struct file *file) +{ + kfree(file); + return 0; +} + +long initramfs_lseek64(struct file *file, long offset, int whence) +{ + if (whence == SEEK_SET) + { + file->f_pos = offset; + return file->f_pos; + } + return -1; +} + +// vnode operations +int initramfs_lookup(struct vnode *dir_node, struct vnode **target, const char *component_name) +{ + struct initramfs_inode *dir_inode = dir_node->internal; + int child_idx = 0; + for (; child_idx < INITRAMFS_MAX_DIR_ENTRY; child_idx++) + { + struct vnode *vnode = dir_inode->entry[child_idx]; + if (!vnode)break; + struct initramfs_inode *inode = vnode->internal; + if (strcmp(component_name, inode->name) == 0) + { + *target = vnode; + return 0; + } + } + return -1; +} + +int initramfs_create(struct vnode *dir_node, struct vnode **target, const char *component_name) +{ + // read-only + return -1; +} + +int initramfs_mkdir(struct vnode *dir_node, struct vnode **target, const char *component_name) +{ + // read-only + return -1; +} + +int initramfs_sync(struct filesystem *fs) +{ + return 0; +} + +long initramfs_getsize(struct vnode *vd) +{ + struct initramfs_inode *inode = vd->internal; + return inode->datasize; +} diff --git a/lab8/kernel/src/irqtask.c b/lab8/kernel/src/irqtask.c new file mode 100644 index 000000000..fb78201e6 --- /dev/null +++ b/lab8/kernel/src/irqtask.c @@ -0,0 +1,65 @@ +#include "irqtask.h" +#include "exception.h" +#include "memory.h" +#include "uart1.h" + +int curr_task_priority = 9999; +struct list_head *task_list; + +void irqtask_init_list() +{ + task_list = kmalloc(sizeof(list_head_t)); + INIT_LIST_HEAD(task_list); +} + +void irqtask_add(void *task_function,unsigned long long priority){ + + irqtask_t *the_task = kmalloc(sizeof(irqtask_t)); //need to kfree by task runner + the_task->priority = priority; + the_task->task_function = task_function; + + lock(); + struct list_head *curr; + list_for_each(curr, task_list) + { + if (((irqtask_t *)curr)->priority > the_task->priority) + { + list_add(&the_task->listhead, curr->prev); + break; + } + } + if (list_is_head(curr, task_list)) list_add_tail(&(the_task->listhead), task_list); // for the time is the biggest + unlock(); +} + +void irqtask_run_preemptive(){ + while (1) + { + lock(); + if (list_empty(task_list)) + { + unlock(); + break; + } + + irqtask_t *the_task = (irqtask_t *)task_list->next; + if (curr_task_priority <= the_task->priority) + { + unlock(); + break; + } + list_del_entry((struct list_head *)the_task); + int prev_task_priority = curr_task_priority; + curr_task_priority = the_task->priority; + + unlock(); + irqtask_run(the_task); + curr_task_priority = prev_task_priority; + kfree(the_task); + } +} + +void irqtask_run(irqtask_t *the_task) +{ + ((void (*)())the_task->task_function)(); +} diff --git a/lab8/kernel/src/link.ld b/lab8/kernel/src/link.ld new file mode 100644 index 000000000..ee5b2083e --- /dev/null +++ b/lab8/kernel/src/link.ld @@ -0,0 +1,27 @@ +SECTIONS +{ + . = 0xffff000000000000; + . += 0x80000; + _kernel_start = .; + .text : { KEEP(*(.text.boot)) *(.text .text.* .gnu.linkonce.t*) } + .rodata : { *(.rodata .rodata.* .gnu.linkonce.r*) } + PROVIDE(_data = .); + .data : { *(.data .data.* .gnu.linkonce.d*) } + .bss (NOLOAD) : { + . = ALIGN(16); + __bss_start = .; + *(.bss .bss.*) + *(COMMON) + __bss_end = .; + } + _kernel_end = .; + _heap_start = .; + + . = 0xffff00002c000000; + _stack_end = .; + . = 0xffff00003c000000; + _stack_top = .; + + /DISCARD/ : { *(.comment) *(.gnu*) *(.note*) *(.eh_frame*) } +} +__bss_size = (__bss_end - __bss_start) >> 3; diff --git a/lab8/kernel/src/main.c b/lab8/kernel/src/main.c new file mode 100644 index 000000000..e44684fd8 --- /dev/null +++ b/lab8/kernel/src/main.c @@ -0,0 +1,42 @@ +#include "uart1.h" +#include "shell.h" +#include "dtb.h" +#include "memory.h" +#include "exception.h" +#include "irqtask.h" +#include "timer.h" +#include "sched.h" +#include "vfs.h" + +void main(char* arg){ + char input_buffer[CMD_MAX_LEN]; + + dtb_ptr = PHYS_TO_VIRT(arg); + traverse_device_tree(dtb_ptr, dtb_callback_initramfs); // get initramfs location from dtb + + init_allocator(); + + uart_init(); + irqtask_init_list(); + timer_list_init(); + + init_thread_sched(); + + init_rootfs(); + + uart_interrupt_enable(); + el1_interrupt_enable(); // enable interrupt in EL1 -> EL1 + core_timer_enable(); + +#if DEBUG + cli_cmd_read(input_buffer); // Wait for input, Windows cannot attach to SERIAL from two processes. +#endif + + cli_print_banner(); + while(1){ + cli_cmd_clear(input_buffer, CMD_MAX_LEN); + uart_puts("# "); + cli_cmd_read(input_buffer); + cli_cmd_exec(input_buffer); + } +} diff --git a/lab8/kernel/src/mbox.c b/lab8/kernel/src/mbox.c new file mode 100644 index 000000000..530412d28 --- /dev/null +++ b/lab8/kernel/src/mbox.c @@ -0,0 +1,23 @@ +#include "bcm2837/rpi_mbox.h" +#include "mbox.h" + +/* Aligned to 16-byte boundary while we have 28-bits for VC */ +volatile unsigned int __attribute__((aligned(16))) pt[36]; + +int mbox_call( mbox_channel_type channel, unsigned int value ) +{ + // Add channel to lower 4 bit + value &= ~(0xF); + value |= channel; + while ( (*MBOX_STATUS & BCM_ARM_VC_MS_FULL) != 0 ) {} + // Write to Register + *MBOX_WRITE = value; + while(1) { + while ( *MBOX_STATUS & BCM_ARM_VC_MS_EMPTY ) {} + // Read from Register + if (value == *MBOX_READ) + return pt[1] == MBOX_REQUEST_SUCCEED; + } + return 0; +} + diff --git a/lab8/kernel/src/memory.c b/lab8/kernel/src/memory.c new file mode 100644 index 000000000..8c455652d --- /dev/null +++ b/lab8/kernel/src/memory.c @@ -0,0 +1,380 @@ +#include "memory.h" +#include "list.h" +#include "uart1.h" +#include "exception.h" +#include "dtb.h" +#include "cpio.h" +#include "mmu.h" + +extern char _heap_start; +static char* htop_ptr = &_heap_start; + +extern char _kernel_start; +extern char _kernel_end; +extern char _stack_end; +extern char _stack_top; + +#ifdef DEBUG + #define memory_sendline(fmt, args ...) uart_sendline(fmt, ##args) +#else + #define memory_sendline(fmt, args ...) (void)0 +#endif + +// ------ Lab2 ------ +void* s_allocator(unsigned int size) { + // -> htop_ptr + // htop_ptr + 0x02: heap_block size + // htop_ptr + 0x10 ~ htop_ptr + 0x10 * k: + // { heap_block } + // -> htop_ptr + + // 0x10 for heap_block header + char* r = htop_ptr + 0x10; + // size paddling to multiple of 0x10 + size = 0x10 + size - size % 0x10; + *(unsigned int*)(r - 0x8) = size; + htop_ptr += size; + return r; +} + +void s_free(void* ptr) { + // TBD +} + +// ------ Lab4 ------ +static frame_t* frame_array; // store memory's statement and page's corresponding index +static list_head_t frame_freelist[FRAME_MAX_IDX]; // store available block for page +static list_head_t cache_list[CACHE_MAX_IDX]; // store available block for cache + +void init_allocator() +{ + frame_array = s_allocator(BUDDY_MEMORY_PAGE_COUNT * sizeof(frame_t)); + + // init frame_array + for (int i = 0; i < BUDDY_MEMORY_PAGE_COUNT; i++) + { + if (i % (1 << FRAME_IDX_FINAL) == 0) + { + frame_array[i].val = FRAME_IDX_FINAL; + frame_array[i].used = FRAME_FREE; + } + } + + //init frame freelist + for (int i = FRAME_IDX_0; i <= FRAME_IDX_FINAL; i++) + { + INIT_LIST_HEAD(&frame_freelist[i]); + } + + //init cache list + for (int i = CACHE_IDX_0; i<= CACHE_IDX_FINAL; i++) + { + INIT_LIST_HEAD(&cache_list[i]); + } + + for (int i = 0; i < BUDDY_MEMORY_PAGE_COUNT; i++) + { + // init listhead for each frame + INIT_LIST_HEAD(&frame_array[i].listhead); + frame_array[i].idx = i; + frame_array[i].cache_order = CACHE_NONE; + + // add init frame (FRAME_IDX_FINAL) into freelist + if (i % (1 << FRAME_IDX_FINAL) == 0) + { + list_add(&frame_array[i].listhead, &frame_freelist[FRAME_IDX_FINAL]); + } + } + + /* Startup reserving the following region: + Spin tables for multicore boot (0x0000 - 0x1000) + Devicetree (Optional, if you have implement it) + Kernel image in the physical memory + Your simple allocator (startup allocator) (Stack + Heap in my case) + Initramfs + */ + memory_sendline("\r\n* Startup Allocation *\r\n"); + memory_sendline("buddy system: usable memory region: 0x%x ~ 0x%x\n", BUDDY_MEMORY_BASE, BUDDY_MEMORY_BASE + BUDDY_MEMORY_PAGE_COUNT * PAGESIZE); + dtb_find_and_store_reserved_memory(); // find spin tables in dtb + memory_reserve(PHYS_TO_VIRT(MMU_PGD_ADDR), PHYS_TO_VIRT(MMU_PTE_ADDR+0x2000)); // // PGD's page frame at 0x1000 // PUD's page frame at 0x2000 PMD 0x3000-0x5000 + memory_reserve((unsigned long long)&_kernel_start, (unsigned long long)&_kernel_end); // kernel + memory_reserve((unsigned long long)&_stack_end, (unsigned long long)&_stack_top); // heap & stack -> simple allocator + memory_reserve((unsigned long long)CPIO_DEFAULT_START, (unsigned long long)CPIO_DEFAULT_END); +} + +void* page_malloc(unsigned int size) +{ + memory_sendline(" [+] Allocate page - size : %d(0x%x)\r\n", size, size); + memory_sendline(" Before\r\n"); + dump_page_info(); + int val; + // turn size into minimum 4KB * 2**val + for (int i = FRAME_IDX_0; i <= FRAME_IDX_FINAL; i++) + { + + if (size <= (PAGESIZE << i)) + { + val = i; + memory_sendline(" block size = 0x%x\n", PAGESIZE << i); + break; + } + + if ( i == FRAME_IDX_FINAL) + { + memory_sendline("[!] request size exceeded for page_malloc!!!!\r\n"); + return (void*)0; + } + + } + + // find the smallest larger frame in freelist + int target_val; + for (target_val = val; target_val <= FRAME_IDX_FINAL; target_val++) + { + // freelist does not have 2**i order frame, going for next order + if (!list_empty(&frame_freelist[target_val])) + break; + } + if (target_val > FRAME_IDX_FINAL) + { + memory_sendline("[!] No available frame in freelist, page_malloc ERROR!!!!\r\n"); + return (void*)0; + } + + // get the available frame from freelist + frame_t *target_frame_ptr = (frame_t*)frame_freelist[target_val].next; + list_del_entry((struct list_head *)target_frame_ptr); + + // Release redundant memory block to separate into pieces + for (int j = target_val; j > val; j--) // ex: 10000 -> 01111 + { + release_redundant(target_frame_ptr); + } + + // Allocate it + target_frame_ptr->used = FRAME_ALLOCATED; + memory_sendline(" physical address : 0x%x\n", BUDDY_MEMORY_BASE + (PAGESIZE*(target_frame_ptr->idx))); + memory_sendline(" After\r\n"); + dump_page_info(); + + return (void *) BUDDY_MEMORY_BASE + (PAGESIZE * (target_frame_ptr->idx)); +} + +void page_free(void* ptr) +{ + frame_t *target_frame_ptr = &frame_array[((unsigned long long)ptr - BUDDY_MEMORY_BASE) >> 12]; // PAGESIZE * Available Region -> 0x1000 * 0x10000000 // SPEC #1, #2 + memory_sendline(" [+] Free page: 0x%x, val = %d\r\n",ptr, target_frame_ptr->val); + memory_sendline(" Before\r\n"); + dump_page_info(); + target_frame_ptr->used = FRAME_FREE; + frame_t* temp; + while ((temp = coalesce(target_frame_ptr)) != (frame_t *)-1)target_frame_ptr = temp; + list_add(&target_frame_ptr->listhead, &frame_freelist[target_frame_ptr->val]); + memory_sendline(" After\r\n"); + dump_page_info(); +} + +frame_t* release_redundant(frame_t *frame) +{ + // order -1 -> add its buddy to free list (frame itself will be used in master function) + frame->val -= 1; + frame_t *buddyptr = get_buddy(frame); + buddyptr->val = frame->val; + list_add(&buddyptr->listhead, &frame_freelist[buddyptr->val]); + return frame; +} + +frame_t* get_buddy(frame_t *frame) +{ + // XOR(idx, order) + return &frame_array[frame->idx ^ (1 << frame->val)]; +} + +frame_t* coalesce(frame_t *frame_ptr) +{ + frame_t *buddy = get_buddy(frame_ptr); + // frame is the boundary + if (frame_ptr->val == FRAME_IDX_FINAL) + return (frame_t*)-1; + + // Order must be the same: 2**i + 2**i = 2**(i+1) + if (frame_ptr->val != buddy->val) + return (frame_t*)-1; + + // buddy is in used + if (buddy->used == FRAME_ALLOCATED) + return (frame_t*)-1; + + list_del_entry((struct list_head *)buddy); + frame_ptr->val += 1; + buddy->val += 1; + memory_sendline(" coalesce detected, merging 0x%x, 0x%x, -> val = %d\r\n", frame_ptr->idx, buddy->idx, frame_ptr->val); + return buddy < frame_ptr ? buddy : frame_ptr; +} + +void dump_page_info(){ + unsigned int exp2 = 1; + memory_sendline(" ----------------- [ Number of Available Page Blocks ] -----------------\r\n | "); + for (int i = FRAME_IDX_0; i <= FRAME_IDX_FINAL; i++) + { + memory_sendline("%4dKB(%1d) ", 4*exp2, i); + exp2 *= 2; + } + memory_sendline("|\r\n | "); + for (int i = FRAME_IDX_0; i <= FRAME_IDX_FINAL; i++) + memory_sendline(" %4d ", list_size(&frame_freelist[i])); + memory_sendline("|\r\n"); +} + +void dump_cache_info() +{ + unsigned int exp2 = 1; + memory_sendline(" -- [ Number of Available Cache Blocks ] --\r\n | "); + for (int i = CACHE_IDX_0; i <= CACHE_IDX_FINAL; i++) + { + memory_sendline("%4dB(%1d) ", 32*exp2, i); + exp2 *= 2; + } + memory_sendline("|\r\n | "); + for (int i = CACHE_IDX_0; i <= CACHE_IDX_FINAL; i++) + memory_sendline(" %5d ", list_size(&cache_list[i])); + memory_sendline("|\r\n"); +} + +void page2caches(int order) +{ + // make caches from a smallest-size page + char *page = page_malloc(PAGESIZE); + frame_t *pageframe_ptr = &frame_array[((unsigned long long)page - BUDDY_MEMORY_BASE) >> 12]; + pageframe_ptr->cache_order = order; + + // split page into a lot of caches and push them into cache_list + int cachesize = (32 << order); + for (int i = 0; i < PAGESIZE; i += cachesize) + { + list_head_t *c = (list_head_t *)(page + i); + list_add(c, &cache_list[order]); + } +} + +void* cache_malloc(unsigned int size) +{ + memory_sendline("[+] Allocate cache - size : %d(0x%x)\r\n", size, size); + memory_sendline(" Before\r\n"); + dump_cache_info(); + + // turn size into cache order: 32B * 2**order + int order; + for (int i = CACHE_IDX_0; i <= CACHE_IDX_FINAL; i++) + { + if (size <= (32 << i)) { order = i; break; } + } + + // if no available cache in list, assign one page for it + if (list_empty(&cache_list[order])) + { + page2caches(order); + } + + list_head_t* r = cache_list[order].next; + list_del_entry(r); + memory_sendline(" physical address : 0x%x\n", r); + memory_sendline(" After\r\n"); + dump_cache_info(); + return r; +} + +void cache_free(void *ptr) +{ + list_head_t *c = (list_head_t *)ptr; + frame_t *pageframe_ptr = &frame_array[((unsigned long long)ptr - BUDDY_MEMORY_BASE) >> 12]; + memory_sendline("[+] Free cache: 0x%x, val = %d\r\n",ptr, pageframe_ptr->cache_order); + memory_sendline(" Before\r\n"); + dump_cache_info(); + list_add(c, &cache_list[pageframe_ptr->cache_order]); + memory_sendline(" After\r\n"); + dump_cache_info(); +} + +void *kmalloc(unsigned int size) +{ + lock(); + memory_sendline("\n\n"); + memory_sendline("================================\r\n"); + memory_sendline("[+] Request kmalloc size: %d\r\n", size); + memory_sendline("================================\r\n"); + // if size is larger than cache size, go for page + if (size > (32 << CACHE_IDX_FINAL)) + { + void *r = page_malloc(size); + unlock(); + return r; + } + // go for cache + void *r = cache_malloc(size); + unlock(); + return r; +} + +void kfree(void *ptr) +{ + lock(); + memory_sendline("\n\n"); + memory_sendline("==========================\r\n"); + memory_sendline("[+] Request kfree 0x%x\r\n", ptr); + memory_sendline("==========================\r\n"); + // If no cache assigned, go for page + if ((unsigned long long)ptr % PAGESIZE == 0 && frame_array[((unsigned long long)ptr - BUDDY_MEMORY_BASE) >> 12].cache_order == CACHE_NONE) + { + page_free(ptr); + unlock(); + return; + } + // go for cache + cache_free(ptr); + unlock(); +} + +void memory_reserve(unsigned long long start, unsigned long long end) +{ + start -= start % PAGESIZE; // floor (align 0x1000) + end = end % PAGESIZE ? end + PAGESIZE - (end % PAGESIZE) : end; // ceiling (align 0x1000) + + uart_sendline("Reserved Memory: "); + uart_sendline("start 0x%x ~ ", start); + uart_sendline("end 0x%x\r\n",end); + + // delete page from free list + for (int order = FRAME_IDX_FINAL; order >= 0; order--) + { + list_head_t *pos; + list_for_each(pos, &frame_freelist[order]) + { + unsigned long long pagestart = ((frame_t *)pos)->idx * PAGESIZE + BUDDY_MEMORY_BASE; + unsigned long long pageend = pagestart + (PAGESIZE << order); + + if (start <= pagestart && end >= pageend) // if page all in reserved memory -> delete it from freelist + { + ((frame_t *)pos)->used = FRAME_ALLOCATED; + memory_sendline(" [!] Reserved page in 0x%x - 0x%x\n", pagestart, pageend); + memory_sendline(" Before\n"); + dump_page_info(); + list_del_entry(pos); + memory_sendline(" Remove usable block for reserved memory: order %d\r\n", order); + memory_sendline(" After\n"); + dump_page_info(); + } + else if (start >= pageend || end <= pagestart) // no intersection + { + continue; + } + else // partial intersection, separate the page into smaller size. + { + list_del_entry(pos); + list_head_t *temppos = pos -> prev; + list_add(&release_redundant((frame_t *)pos)->listhead, &frame_freelist[order - 1]); + pos = temppos; + } + } + } +} diff --git a/lab8/kernel/src/mmu.c b/lab8/kernel/src/mmu.c new file mode 100644 index 000000000..d6a9942bc --- /dev/null +++ b/lab8/kernel/src/mmu.c @@ -0,0 +1,166 @@ +#include "bcm2837/rpi_mmu.h" +#include "mmu.h" +#include "memory.h" +#include "string.h" +#include "uart1.h" + +void* set_2M_kernel_mmu(void* x0) +{ + // Turn + // Two-level Translation (1GB) - in boot.S + // to + // Three-level Translation (2MB) - set PUD point to new table + unsigned long *pud_table = (unsigned long *) MMU_PUD_ADDR; + + unsigned long *pte_table1 = (unsigned long *) MMU_PTE_ADDR; + unsigned long *pte_table2 = (unsigned long *)(MMU_PTE_ADDR + 0x1000L); + for (int i = 0; i < 512; i++) + { + unsigned long addr = 0x200000L * i; + if ( addr >= PERIPHERAL_END ) + { + pte_table1[i] = ( 0x00000000 + addr ) + BOOT_PTE_ATTR_nGnRnE; + continue; + } + pte_table1[i] = (0x00000000 + addr ) | BOOT_PTE_ATTR_NOCACHE; // 0 * 2MB // No definition for 3-level attribute, use nocache. + pte_table2[i] = (0x40000000 + addr ) | BOOT_PTE_ATTR_NOCACHE; // 512 * 2MB + } + + // set PUD + pud_table[0] = (unsigned long) pte_table1 | BOOT_PUD_ATTR; + pud_table[1] = (unsigned long) pte_table2 | BOOT_PUD_ATTR; + + return x0; +} + +void map_one_page(size_t *virt_pgd_p, size_t va, size_t pa, size_t flag) +{ + size_t *table_p = virt_pgd_p; + for (int level = 0; level < 4; level++) + { + unsigned int idx = (va >> (39 - level * 9)) & 0x1ff; // p.14, 9-bit only + + if (level == 3) + { + table_p[idx] = pa; + table_p[idx] |= PD_ACCESS | PD_TABLE | (MAIR_IDX_NORMAL_NOCACHE << 2) | PD_KNX | flag; // el0 only + return; + } + + if(!table_p[idx]) + { + size_t* newtable_p =kmalloc(0x1000); // create a table + memset(newtable_p, 0, 0x1000); + table_p[idx] = VIRT_TO_PHYS((size_t)newtable_p); // point to that table + table_p[idx] |= PD_ACCESS | PD_TABLE | (MAIR_IDX_NORMAL_NOCACHE << 2); + } + + table_p = (size_t*)PHYS_TO_VIRT((size_t)(table_p[idx] & ENTRY_ADDR_MASK)); // PAGE_SIZE + } +} + + +void mmu_add_vma(struct thread *t, size_t va, size_t size, size_t pa, size_t rwx, int is_alloced) +{ + size = size % 0x1000 ? size + (0x1000 - size % 0x1000) : size; + vm_area_struct_t* new_area = kmalloc(sizeof(vm_area_struct_t)); + new_area->rwx = rwx; + new_area->area_size = size; + new_area->virt_addr = va; + new_area->phys_addr = pa; + new_area->is_alloced = is_alloced; + list_add_tail((list_head_t *)new_area, &t->vma_list); +} + +void mmu_del_vma(struct thread *t) +{ + list_head_t *pos = t->vma_list.next; + vm_area_struct_t *vma; + while(pos != &t->vma_list){ + vma = (vm_area_struct_t *)pos; + if (vma->is_alloced) + kfree((void*)PHYS_TO_VIRT(vma->phys_addr)); + list_head_t* next_pos = pos->next; + kfree(pos); + pos = next_pos; + } +} + +void mmu_map_pages(size_t *virt_pgd_p, size_t va, size_t size, size_t pa, size_t flag) +{ + pa = pa - (pa % 0x1000); // align + for (size_t s = 0; s < size; s+=0x1000) + { + map_one_page(virt_pgd_p, va + s, pa + s, flag); + } +} + +void mmu_free_page_tables(size_t *page_table, int level) +{ + size_t *table_virt = (size_t*)PHYS_TO_VIRT((char*)page_table); + for (int i = 0; i < 512; i++) + { + if (table_virt[i] != 0) + { + size_t *next_table = (size_t*)(table_virt[i] & ENTRY_ADDR_MASK); + if (table_virt[i] & PD_TABLE) + { + if(level!=2)mmu_free_page_tables(next_table, level + 1); + table_virt[i] = 0L; + kfree(PHYS_TO_VIRT((char *)next_table)); + } + } + } +} + +void mmu_memfail_abort_handle(esr_el1_t* esr_el1) +{ + unsigned long long far_el1; + __asm__ __volatile__("mrs %0, FAR_EL1\n\t": "=r"(far_el1)); + + list_head_t *pos; + vm_area_struct_t *vma; + vm_area_struct_t *the_area_ptr = 0; + list_for_each(pos, &curr_thread->vma_list) + { + vma = (vm_area_struct_t *)pos; + if (vma->virt_addr <= far_el1 && vma->virt_addr + vma->area_size >= far_el1) + { + the_area_ptr = vma; + break; + } + } + // area is not part of process's address space + if (!the_area_ptr) + { + uart_sendline("[Segmentation fault]: Kill Process\r\n"); + thread_exit(); + return; + } + + // For translation fault, only map one page frame for the fault address + if ((esr_el1->iss & 0x3f) == TF_LEVEL0 || + (esr_el1->iss & 0x3f) == TF_LEVEL1 || + (esr_el1->iss & 0x3f) == TF_LEVEL2 || + (esr_el1->iss & 0x3f) == TF_LEVEL3) + { + //uart_sendline("[Translation fault]: 0x%x\r\n",far_el1); // far_el1: Fault address register. + // Holds the faulting Virtual Address for all synchronous Instruction or Data Abort, PC alignment fault and Watchpoint exceptions that are taken to EL1. + + size_t addr_offset = (far_el1 - the_area_ptr->virt_addr); + addr_offset = (addr_offset % 0x1000) == 0 ? addr_offset : addr_offset - (addr_offset % 0x1000); + + size_t flag = 0; + if(!(the_area_ptr->rwx & (0b1 << 2))) flag |= PD_UNX; // 4: executable + if(!(the_area_ptr->rwx & (0b1 << 1))) flag |= PD_RDONLY; // 2: writable + if( the_area_ptr->rwx & (0b1 << 0) ) flag |= PD_UK_ACCESS; // 1: readable / accessible + map_one_page(PHYS_TO_VIRT(curr_thread->context.pgd), the_area_ptr->virt_addr + addr_offset, the_area_ptr->phys_addr + addr_offset, flag); + } + else + { + // For other Fault (permisson ...etc) + uart_sendline("[Segmentation fault]: Kill Process\r\n"); + thread_exit(); + } + +} diff --git a/lab8/kernel/src/sched.S b/lab8/kernel/src/sched.S new file mode 100644 index 000000000..6b7d930c3 --- /dev/null +++ b/lab8/kernel/src/sched.S @@ -0,0 +1,59 @@ +.global switch_to +switch_to: + stp x19, x20, [x0, 16 * 0] + stp x21, x22, [x0, 16 * 1] + stp x23, x24, [x0, 16 * 2] + stp x25, x26, [x0, 16 * 3] + stp x27, x28, [x0, 16 * 4] + stp fp, lr, [x0, 16 * 5] + mov x9, sp + str x9, [x0, 16 * 6] + //mrs x9, ttbr0_el1 + //str x9, [x0, 16 * 6 + 8] + + ldp x19, x20, [x1, 16 * 0] + ldp x21, x22, [x1, 16 * 1] + ldp x23, x24, [x1, 16 * 2] + ldp x25, x26, [x1, 16 * 3] + ldp x27, x28, [x1, 16 * 4] + ldp fp, lr, [x1, 16 * 5] + ldp x9, x0, [x1, 16 * 6] + mov sp, x9 + msr tpidr_el1, x1 + + dsb ish // ensure write has completed, lock for context switch + msr ttbr0_el1, x0 // switch translation based address. + tlbi vmalle1is // invalidate all TLB entries in stage 1, el1 and inner shareable + dsb ish // ensure completion of TLB invalidatation + isb // clear pipeline + + ret + +.global store_context +store_context: + stp x19, x20, [x0, 16 * 0] + stp x21, x22, [x0, 16 * 1] + stp x23, x24, [x0, 16 * 2] + stp x25, x26, [x0, 16 * 3] + stp x27, x28, [x0, 16 * 4] + stp fp, lr, [x0, 16 * 5] + mov x9, sp + str x9, [x0, 16 * 6] + ret + +.global load_context +load_context: + ldp x19, x20, [x0, 16 * 0] + ldp x21, x22, [x0, 16 * 1] + ldp x23, x24, [x0, 16 * 2] + ldp x25, x26, [x0, 16 * 3] + ldp x27, x28, [x0, 16 * 4] + ldp fp, lr, [x0, 16 * 5] + ldr x9, [x0, 16 * 6] + mov sp, x9 + ret + +.global get_current +get_current: + mrs x0, tpidr_el1 + ret diff --git a/lab8/kernel/src/sched.c b/lab8/kernel/src/sched.c new file mode 100644 index 000000000..016f92c8c --- /dev/null +++ b/lab8/kernel/src/sched.c @@ -0,0 +1,179 @@ +#include "sched.h" +#include "exception.h" +#include "memory.h" +#include "timer.h" +#include "uart1.h" +#include "signal.h" +#include "mmu.h" +#include "string.h" + +thread_t *curr_thread; +list_head_t *run_queue; +list_head_t *wait_queue; +thread_t threads[PIDMAX + 1]; + +void init_thread_sched() +{ + lock(); + run_queue = kmalloc(sizeof(list_head_t)); + wait_queue = kmalloc(sizeof(list_head_t)); + INIT_LIST_HEAD(run_queue); + INIT_LIST_HEAD(wait_queue); + + //init pids + for (int i = 0; i <= PIDMAX; i++) + { + threads[i].isused = 0; + threads[i].pid = i; + threads[i].iszombie = 0; + } + + thread_t* idlethread = thread_create(idle,0x1000); + curr_thread = idlethread; + asm volatile("msr tpidr_el1, %0" ::"r" (&idlethread->context)); + unlock(); +} + +void idle(){ + while(1) + { + kill_zombies(); //reclaim threads marked as DEAD + schedule(); //switch to next thread in run queue + } +} + +void schedule(){ + lock(); + do{ + curr_thread = (thread_t *)curr_thread->listhead.next; + } while (list_is_head(&curr_thread->listhead, run_queue) || curr_thread->iszombie); + unlock(); + switch_to(get_current(), &curr_thread->context); +} + +void kill_zombies(){ + lock(); + list_head_t *curr; + thread_t *t; + list_for_each(curr,run_queue) + { + t = (thread_t *)curr; + if (t->iszombie) + { + list_del_entry(curr); + mmu_free_page_tables(t->context.pgd,0); + mmu_del_vma(t); + for(int i = 0; i < MAX_FD;i++) + { + if (t->file_descriptors_table[i]) + vfs_close(t->file_descriptors_table[i]); + } + kfree(t->kernel_stack_alloced_ptr); + kfree(PHYS_TO_VIRT(t->context.pgd)); + t->iszombie = 0; + t->isused = 0; + } + } + unlock(); +} + +int thread_exec(char *data, unsigned int filesize) +{ + thread_t *t = thread_create(data, filesize); + + mmu_add_vma(t, USER_KERNEL_BASE, t->datasize, (size_t)VIRT_TO_PHYS(t->data) , 0b111, 1); + mmu_add_vma(t, USER_STACK_BASE - USTACK_SIZE, USTACK_SIZE, (size_t)VIRT_TO_PHYS(t->stack_alloced_ptr), 0b111, 1); + mmu_add_vma(t, PERIPHERAL_START, PERIPHERAL_END - PERIPHERAL_START, PERIPHERAL_START, 0b011, 0); + mmu_add_vma(t, USER_SIGNAL_WRAPPER_VA, 0x2000, (size_t)VIRT_TO_PHYS(signal_handler_wrapper), 0b101, 0); + + t->context.pgd = VIRT_TO_PHYS(t->context.pgd); + t->context.sp = USER_STACK_BASE; + t->context.fp = USER_STACK_BASE; + t->context.lr = USER_KERNEL_BASE; + + //copy file into data + for (int i = 0; i < filesize;i++) + { + t->data[i] = data[i]; + } + + //disable echo when going to userspace + curr_thread = t; + + vfs_open("/dev/uart", 0, &curr_thread->file_descriptors_table[0]); // stdin + vfs_open("/dev/uart", 0, &curr_thread->file_descriptors_table[1]); // stdout + vfs_open("/dev/uart", 0, &curr_thread->file_descriptors_table[2]); // stderr + + //disable echo when going to userspace + add_timer(schedule_timer, 1, "", 0); + // eret to exception level 0 + asm("msr tpidr_el1, %0\n\t" + "msr elr_el1, %1\n\t" + "msr spsr_el1, xzr\n\t" // enable interrupt in EL0. You can do it by setting spsr_el1 to 0 before returning to EL0. + "msr sp_el0, %2\n\t" + "mov sp, %3\n\t" + "dsb ish\n\t" // ensure write has completed + "msr ttbr0_el1, %4\n\t" + "tlbi vmalle1is\n\t" // invalidate all TLB entries + "dsb ish\n\t" // ensure completion of TLB invalidatation + "isb\n\t" // clear pipeline" + "eret\n\t" ::"r"(&t->context),"r"(t->context.lr), "r"(t->context.sp), "r"(t->kernel_stack_alloced_ptr + KSTACK_SIZE), "r"(t->context.pgd)); + + return 0; +} + + +//malloc a kstack and a userstack +thread_t *thread_create(void *start, unsigned int filesize) +{ + lock(); + + thread_t *r; + for (int i = 0; i <= PIDMAX; i++) + { + if (!threads[i].isused) + { + r = &threads[i]; + break; + } + } + INIT_LIST_HEAD(&r->vma_list); + r->iszombie = 0; + r->isused = 1; + r->context.lr = (unsigned long long)start; + r->stack_alloced_ptr = kmalloc(USTACK_SIZE); + r->kernel_stack_alloced_ptr = kmalloc(KSTACK_SIZE); + r->signal_is_checking = 0; + r->data = kmalloc(filesize); + r->datasize = filesize; + r->context.sp = (unsigned long long)r->kernel_stack_alloced_ptr + KSTACK_SIZE; + r->context.fp = r->context.sp; + strcpy(r->curr_working_dir, "/"); + + r->context.pgd = kmalloc(0x1000); + memset(r->context.pgd, 0, 0x1000); + + //initial signal handler with signal_default_handler (kill thread) + for (int i = 0; i < SIGNAL_MAX; i++) + { + r->signal_handler[i] = signal_default_handler; + r->sigcount[i] = 0; + } + + list_add(&r->listhead, run_queue); + unlock(); + return r; +} + +void thread_exit(){ + lock(); + curr_thread->iszombie = 1; + unlock(); + schedule(); +} + +void schedule_timer(char* notuse){ + unsigned long long cntfrq_el0; + __asm__ __volatile__("mrs %0, cntfrq_el0\n\t": "=r"(cntfrq_el0)); //tick frequency + add_timer(schedule_timer, cntfrq_el0 >> 5, "", 1); +} diff --git a/lab8/kernel/src/sdhost.c b/lab8/kernel/src/sdhost.c new file mode 100644 index 000000000..ba0ed32b8 --- /dev/null +++ b/lab8/kernel/src/sdhost.c @@ -0,0 +1,243 @@ +// mmio +#define KVA 0xffff000000000000 +#define MMIO_BASE (KVA + 0x3f000000) + +// SD card command +#define GO_IDLE_STATE 0 +#define SEND_OP_CMD 1 +#define ALL_SEND_CID 2 +#define SEND_RELATIVE_ADDR 3 +#define SELECT_CARD 7 +#define SEND_IF_COND 8 + #define VOLTAGE_CHECK_PATTERN 0x1aa +#define STOP_TRANSMISSION 12 +#define SET_BLOCKLEN 16 +#define READ_SINGLE_BLOCK 17 +#define WRITE_SINGLE_BLOCK 24 +#define SD_APP_OP_COND 41 + #define SDCARD_3_3V (1 << 21) + #define SDCARD_ISHCS (1 << 30) + #define SDCARD_READY (1 << 31) +#define APP_CMD 55 + +// gpio +#define GPIO_BASE (MMIO_BASE + 0x200000) +#define GPIO_GPFSEL4 (GPIO_BASE + 0x10) +#define GPIO_GPFSEL5 (GPIO_BASE + 0x14) +#define GPIO_GPPUD (GPIO_BASE + 0x94) +#define GPIO_GPPUDCLK1 (GPIO_BASE + 0x9c) + +// sdhost +#define SDHOST_BASE (MMIO_BASE + 0x202000) +#define SDHOST_CMD (SDHOST_BASE + 0) + #define SDHOST_READ 0x40 + #define SDHOST_WRITE 0x80 + #define SDHOST_LONG_RESPONSE 0x200 + #define SDHOST_NO_REPONSE 0x400 + #define SDHOST_BUSY 0x800 + #define SDHOST_NEW_CMD 0x8000 +#define SDHOST_ARG (SDHOST_BASE + 0x4) +#define SDHOST_TOUT (SDHOST_BASE + 0x8) + #define SDHOST_TOUT_DEFAULT 0xf00000 +#define SDHOST_CDIV (SDHOST_BASE + 0xc) + #define SDHOST_CDIV_MAXDIV 0x7ff + #define SDHOST_CDIV_DEFAULT 0x148 +#define SDHOST_RESP0 (SDHOST_BASE + 0x10) +#define SDHOST_RESP1 (SDHOST_BASE + 0x14) +#define SDHOST_RESP2 (SDHOST_BASE + 0x18) +#define SDHOST_RESP3 (SDHOST_BASE + 0x1c) +#define SDHOST_HSTS (SDHOST_BASE + 0x20) + #define SDHOST_HSTS_MASK (0x7f8) + #define SDHOST_HSTS_ERR_MASK (0xf8) + #define SDHOST_HSTS_DATA (1 << 0) +#define SDHOST_PWR (SDHOST_BASE + 0x30) +#define SDHOST_DBG (SDHOST_BASE + 0x34) + #define SDHOST_DBG_FSM_DATA 1 + #define SDHOST_DBG_FSM_MASK 0xf + #define SDHOST_DBG_MASK (0x1f << 14 | 0x1f << 9) + #define SDHOST_DBG_FIFO (0x4 << 14 | 0x4 << 9) +#define SDHOST_CFG (SDHOST_BASE + 0x38) + #define SDHOST_CFG_DATA_EN (1 << 4) + #define SDHOST_CFG_SLOW (1 << 3) + #define SDHOST_CFG_INTBUS (1 << 1) +#define SDHOST_SIZE (SDHOST_BASE + 0x3c) +#define SDHOST_DATA (SDHOST_BASE + 0x40) +#define SDHOST_CNT (SDHOST_BASE + 0x50) + +// helper +#define set(io_addr, val) \ + asm volatile("str %w1, [%0]" ::"r"(io_addr), "r"(val) : "memory"); + +#define get(io_addr, val) \ + asm volatile("ldr %w0, [%1]" : "=r"(val) : "r"(io_addr) : "memory"); + +static inline void delay(unsigned long tick) { + while (tick--) { + asm volatile("nop"); + } +} + +static int is_hcs; // high capcacity(SDHC) + +static void pin_setup() { + set(GPIO_GPFSEL4, 0x24000000); + set(GPIO_GPFSEL5, 0x924); + set(GPIO_GPPUD, 0); + delay(15000); + set(GPIO_GPPUDCLK1, 0xffffffff); + delay(15000); + set(GPIO_GPPUDCLK1, 0); +} + +static void sdhost_setup() { + unsigned int tmp; + set(SDHOST_PWR, 0); + set(SDHOST_CMD, 0); + set(SDHOST_ARG, 0); + set(SDHOST_TOUT, SDHOST_TOUT_DEFAULT); + set(SDHOST_CDIV, 0); + set(SDHOST_HSTS, SDHOST_HSTS_MASK); + set(SDHOST_CFG, 0); + set(SDHOST_CNT, 0); + set(SDHOST_SIZE, 0); + get(SDHOST_DBG, tmp); + tmp &= ~SDHOST_DBG_MASK; + tmp |= SDHOST_DBG_FIFO; + set(SDHOST_DBG, tmp); + delay(250000); + set(SDHOST_PWR, 1); + delay(250000); + set(SDHOST_CFG, SDHOST_CFG_SLOW | SDHOST_CFG_INTBUS | SDHOST_CFG_DATA_EN); + set(SDHOST_CDIV, SDHOST_CDIV_DEFAULT); +} + +static int wait_sd() { + int cnt = 1000000; + unsigned int cmd; + do { + if (cnt == 0) { + return -1; + } + get(SDHOST_CMD, cmd); + --cnt; + } while (cmd & SDHOST_NEW_CMD); + return 0; +} + +static int sd_cmd(unsigned cmd, unsigned int arg) { + set(SDHOST_ARG, arg); + set(SDHOST_CMD, cmd | SDHOST_NEW_CMD); + return wait_sd(); +} + +static int sdcard_setup() { + unsigned int tmp; + sd_cmd(GO_IDLE_STATE | SDHOST_NO_REPONSE, 0); + sd_cmd(SEND_IF_COND, VOLTAGE_CHECK_PATTERN); + get(SDHOST_RESP0, tmp); + if (tmp != VOLTAGE_CHECK_PATTERN) { + return -1; + } + while (1) { + if (sd_cmd(APP_CMD, 0) == -1) { + // MMC card or invalid card status + // currently not support + continue; + } + sd_cmd(SD_APP_OP_COND, SDCARD_3_3V | SDCARD_ISHCS); + get(SDHOST_RESP0, tmp); + if (tmp & SDCARD_READY) { + break; + } + delay(1000000); + } + + is_hcs = tmp & SDCARD_ISHCS; + sd_cmd(ALL_SEND_CID | SDHOST_LONG_RESPONSE, 0); + sd_cmd(SEND_RELATIVE_ADDR, 0); + get(SDHOST_RESP0, tmp); + sd_cmd(SELECT_CARD, tmp); + sd_cmd(SET_BLOCKLEN, 512); + return 0; +} + +static int wait_fifo() { + int cnt = 1000000; + unsigned int hsts; + do { + if (cnt == 0) { + return -1; + } + get(SDHOST_HSTS, hsts); + --cnt; + } while ((hsts & SDHOST_HSTS_DATA) == 0); + return 0; +} + +static void set_block(int size, int cnt) { + set(SDHOST_SIZE, size); + set(SDHOST_CNT, cnt); +} + +static void wait_finish() { + unsigned int dbg; + do { + get(SDHOST_DBG, dbg); + } while ((dbg & SDHOST_DBG_FSM_MASK) != SDHOST_HSTS_DATA); +} + +void readblock(int block_idx, void* buf) { + unsigned int* buf_u = (unsigned int*)buf; + int succ = 0; + if (!is_hcs) { + block_idx <<= 9; + } + do{ + set_block(512, 1); + sd_cmd(READ_SINGLE_BLOCK | SDHOST_READ, block_idx); + for (int i = 0; i < 128; ++i) { + wait_fifo(); + get(SDHOST_DATA, buf_u[i]); + } + unsigned int hsts; + get(SDHOST_HSTS, hsts); + if (hsts & SDHOST_HSTS_ERR_MASK) { + set(SDHOST_HSTS, SDHOST_HSTS_ERR_MASK); + sd_cmd(STOP_TRANSMISSION | SDHOST_BUSY, 0); + } else { + succ = 1; + } + } while(!succ); + wait_finish(); +} + +void writeblock(int block_idx, void* buf) { + unsigned int* buf_u = (unsigned int*)buf; + int succ = 0; + if (!is_hcs) { + block_idx <<= 9; + } + do{ + set_block(512, 1); + sd_cmd(WRITE_SINGLE_BLOCK | SDHOST_WRITE, block_idx); + for (int i = 0; i < 128; ++i) { + wait_fifo(); + set(SDHOST_DATA, buf_u[i]); + } + unsigned int hsts; + get(SDHOST_HSTS, hsts); + if (hsts & SDHOST_HSTS_ERR_MASK) { + set(SDHOST_HSTS, SDHOST_HSTS_ERR_MASK); + sd_cmd(STOP_TRANSMISSION | SDHOST_BUSY, 0); + } else { + succ = 1; + } + } while(!succ); + wait_finish(); +} + +void sd_init() { + pin_setup(); + sdhost_setup(); + sdcard_setup(); +} diff --git a/lab8/kernel/src/shell.c b/lab8/kernel/src/shell.c new file mode 100644 index 000000000..3579debfc --- /dev/null +++ b/lab8/kernel/src/shell.c @@ -0,0 +1,219 @@ +#include +#include "shell.h" +#include "uart1.h" +#include "mbox.h" +#include "power.h" +#include "cpio.h" +#include "string.h" +#include "dtb.h" +#include "memory.h" +#include "timer.h" +#include "sched.h" + +#define CLI_MAX_CMD 9 + +extern int uart_recv_echo_flag; +extern char* dtb_ptr; +extern void* CPIO_DEFAULT_START; + +struct CLI_CMDS cmd_list[CLI_MAX_CMD]= +{ + {.command="cat", .help="concatenate files and print on the standard output"}, + {.command="dtb", .help="show device tree"}, + {.command="exec", .help="execute a command, replacing current image with a new image"}, + {.command="hello", .help="print Hello World!"}, + {.command="help", .help="print all available commands"}, + {.command="info", .help="get device information via mailbox"}, + {.command="ls", .help="list directory contents"}, + {.command="setTimeout", .help="setTimeout [MESSAGE] [SECONDS]"}, + {.command="reboot", .help="reboot the device"} +}; + +void cli_cmd_clear(char* buffer, int length) +{ + for(int i=0; i= CMD_MAX_LEN ) break; + c = uart_async_getc(); + if ( c == '\n') break; + buffer[idx++] = c; + } +} + +void cli_cmd_exec(char* buffer) +{ + if (!buffer) return; + + char* cmd = buffer; + char* argvs = str_SepbySpace(buffer); + + if (strcmp(cmd, "cat") == 0) { + do_cmd_cat(argvs); + } else if (strcmp(cmd, "dtb") == 0){ + do_cmd_dtb(); + } else if (strcmp(cmd, "exec") == 0){ + do_cmd_exec(argvs); + } else if (strcmp(cmd, "hello") == 0) { + do_cmd_hello(); + } else if (strcmp(cmd, "help") == 0) { + do_cmd_help(); + } else if (strcmp(cmd, "info") == 0) { + do_cmd_info(); + } else if (strcmp(cmd, "ls") == 0) { + do_cmd_ls(argvs); + } else if (strcmp(cmd, "setTimeout") == 0) { + char* sec = str_SepbySpace(argvs); + do_cmd_setTimeout(argvs, sec); + } else if (strcmp(cmd, "reboot") == 0) { + do_cmd_reboot(); + } +} + +void cli_print_banner() +{ + uart_puts("\r\n"); + uart_puts("=======================================\r\n"); + uart_puts(" OSC 2024 Lab8 Shell \r\n"); + uart_puts("=======================================\r\n"); +} + +void do_cmd_cat(char* filepath) +{ + char* c_filepath; + char* c_filedata; + unsigned int c_filesize; + struct cpio_newc_header *header_ptr = CPIO_DEFAULT_START; + + while(header_ptr!=0) + { + int error = cpio_newc_parse_header(header_ptr, &c_filepath, &c_filesize, &c_filedata, &header_ptr); + if(error) break; + if(strcmp(c_filepath, filepath)==0) + { + uart_puts("%s", c_filedata); + break; + } + if(header_ptr==0) uart_puts("cat: %s: No such file or directory\n", filepath); + } +} + +void do_cmd_dtb() +{ + traverse_device_tree(dtb_ptr, dtb_callback_show_tree); +} + +void do_cmd_help() +{ + for(int i = 0; i < CLI_MAX_CMD; i++) + { + uart_puts(cmd_list[i].command); + uart_puts("\t\t\t: "); + uart_puts(cmd_list[i].help); + uart_puts("\r\n"); + } +} + +void do_cmd_exec(char* filepath) +{ + char* c_filepath; + char* c_filedata; + unsigned int c_filesize; + struct cpio_newc_header *header_ptr = CPIO_DEFAULT_START; + + while(header_ptr!=0) + { + int error = cpio_newc_parse_header(header_ptr, &c_filepath, &c_filesize, &c_filedata, &header_ptr); + if(error) break; + + if(strcmp(c_filepath, filepath)==0) + { + uart_recv_echo_flag = 0; // syscall.img has different mechanism on uart I/O. + thread_exec(c_filedata, c_filesize); + } + if(header_ptr==0) uart_puts("cat: %s: No such file or directory\n", filepath); + } + +} + +void do_cmd_hello() +{ + uart_puts("Hello World!\r\n"); +} + +void do_cmd_info() +{ + // print hw revision + pt[0] = 8 * 4; + pt[1] = MBOX_REQUEST_PROCESS; + pt[2] = MBOX_TAG_GET_BOARD_REVISION; + pt[3] = 4; + pt[4] = MBOX_TAG_REQUEST_CODE; + pt[5] = 0; + pt[6] = 0; + pt[7] = MBOX_TAG_LAST_BYTE; + + if (mbox_call(MBOX_TAGS_ARM_TO_VC, (unsigned int)((unsigned long)&pt)) ) { + uart_puts("Hardware Revision\t: "); + uart_2hex(pt[6]); + uart_2hex(pt[5]); + uart_puts("\r\n"); + } + // print arm memory + pt[0] = 8 * 4; + pt[1] = MBOX_REQUEST_PROCESS; + pt[2] = MBOX_TAG_GET_ARM_MEMORY; + pt[3] = 8; + pt[4] = MBOX_TAG_REQUEST_CODE; + pt[5] = 0; + pt[6] = 0; + pt[7] = MBOX_TAG_LAST_BYTE; + + if (mbox_call(MBOX_TAGS_ARM_TO_VC, (unsigned int)((unsigned long)&pt)) ) { + uart_puts("ARM Memory Base Address\t: "); + uart_2hex(pt[5]); + uart_puts("\r\n"); + uart_puts("ARM Memory Size\t\t: "); + uart_2hex(pt[6]); + uart_puts("\r\n"); + } +} + +void do_cmd_ls(char* workdir) +{ + char* c_filepath; + char* c_filedata; + unsigned int c_filesize; + struct cpio_newc_header *header_ptr = CPIO_DEFAULT_START; + + while(header_ptr!=0) + { + int error = cpio_newc_parse_header(header_ptr, &c_filepath, &c_filesize, &c_filedata, &header_ptr); + if(error) break; + if(header_ptr!=0) uart_puts("%s\n", c_filepath); + } +} + +void do_cmd_setTimeout(char* msg, char* sec) +{ + add_timer(uart_sendline,atoi(sec),msg,0); +} + +void do_cmd_reboot() +{ + uart_puts("Reboot in 5 seconds ...\r\n\r\n"); + volatile unsigned int* rst_addr = (unsigned int*)PM_RSTC; + *rst_addr = PM_PASSWORD | 0x20; + volatile unsigned int* wdg_addr = (unsigned int*)PM_WDOG; + *wdg_addr = PM_PASSWORD | 5; +} + diff --git a/lab8/kernel/src/signal.c b/lab8/kernel/src/signal.c new file mode 100644 index 000000000..d98309abe --- /dev/null +++ b/lab8/kernel/src/signal.c @@ -0,0 +1,68 @@ +#include "signal.h" +#include "sched.h" +#include "syscall.h" +#include "memory.h" +#include "mmu.h" + +void check_signal(trapframe_t *tpf) +{ + lock(); + if(curr_thread->signal_is_checking) + { + unlock(); + return; + } + //prevent nested running signal handler + curr_thread->signal_is_checking = 1; + unlock(); + for (int i = 0; i <= SIGNAL_MAX; i++) + { + store_context(&curr_thread->signal_saved_context); + if(curr_thread->sigcount[i]>0) + { + lock(); + curr_thread->sigcount[i]--; + unlock(); + run_signal(tpf,i); + } + } + lock(); + curr_thread->signal_is_checking = 0; + unlock(); +} + +void run_signal(trapframe_t* tpf,int signal) +{ + curr_thread->curr_signal_handler = curr_thread->signal_handler[signal]; + + //run default handler in kernel + if (curr_thread->curr_signal_handler == signal_default_handler) + { + signal_default_handler(); + return; + } + + asm("msr elr_el1, %0\n\t" + "msr sp_el0, %1\n\t" + "msr spsr_el1, %2\n\t" + "mov x0, %3\n\t" + "eret\n\t" + :: "r"(USER_SIGNAL_WRAPPER_VA + ((size_t)signal_handler_wrapper % 0x1000)), + "r"(tpf->sp_el0), + "r"(tpf->spsr_el1), + "r"(curr_thread->curr_signal_handler)); +} + +void signal_handler_wrapper() +{ + //elr_el1 set to function -> call function by x0 + //system call sigreturn + asm("blr x0\n\t" + "mov x8,50\n\t" + "svc 0\n\t"); +} + +void signal_default_handler() +{ + kill(0,curr_thread->pid); +} diff --git a/lab8/kernel/src/string.c b/lab8/kernel/src/string.c new file mode 100644 index 000000000..b746dfb5a --- /dev/null +++ b/lab8/kernel/src/string.c @@ -0,0 +1,313 @@ +#include "string.h" +#include + +unsigned int vsprintf(char *dst, char* fmt, __builtin_va_list args) +{ + long int arg; + int len, sign, i; + char *p, *orig=dst, tmpstr[19]; + + // failsafes + if(dst==(void*)0 || fmt==(void*)0) { + return 0; + } + + // main loop + arg = 0; + while(*fmt) { + if(dst-orig > VSPRINT_MAX_BUF_SIZE-0x10) + { + return -1; + } + // argument access + if(*fmt=='%') { + fmt++; + // literal % + if(*fmt=='%') { + goto put; + } + len=0; + // size modifier + while(*fmt>='0' && *fmt<='9') { + len *= 10; + len += *fmt-'0'; + fmt++; + } + // skip long modifier + if(*fmt=='l') { + fmt++; + } + // character + if(*fmt=='c') { + arg = __builtin_va_arg(args, int); + *dst++ = (char)arg; + fmt++; + continue; + } else + // decimal number + if(*fmt=='d') { + arg = __builtin_va_arg(args, int); + // check input + sign=0; + if((int)arg<0) { + arg*=-1; + sign++; + } + if(arg>99999999999999999L) { + arg=99999999999999999L; + } + // convert to string + i=18; + tmpstr[i]=0; + do { + tmpstr[--i]='0'+(arg%10); + arg/=10; + } while(arg!=0 && i>0); + if(sign) { + tmpstr[--i]='-'; + } + if(len>0 && len<18) { + while(i>18-len) { + tmpstr[--i]=' '; + } + } + p=&tmpstr[i]; + goto copystring; + } else + if(*fmt=='x') { + arg = __builtin_va_arg(args, long int); + i=16; + tmpstr[i]=0; + do { + char n=arg & 0xf; + tmpstr[--i]=n+(n>9?0x37:0x30); + arg>>=4; + } while(arg!=0 && i>0); + if(len>0 && len<=16) { + while(i>16-len) { + tmpstr[--i]='0'; + } + } + p=&tmpstr[i]; + goto copystring; + } else + if(*fmt=='s') { + p = __builtin_va_arg(args, char*); +copystring: if(p==(void*)0) { + p="(null)"; + } + while(*p) { + *dst++ = *p++; + } + } + } else { +put: *dst++ = *fmt; + } + fmt++; + } + *dst=0; + return dst-orig; +} + +unsigned int sprintf(char *dst, char* fmt, ...) +{ + __builtin_va_list args; + __builtin_va_start(args, fmt); + unsigned int r = vsprintf(dst,fmt,args); + __builtin_va_end(args); + return r; +} + +unsigned long long strlen(const char *str) +{ + size_t count = 0; + while((unsigned char)*str++)count++; + return count; +} + +char *strncat(char *dest, const char *src, int n) +{ + char *t; + + t = dest; + + while (*t) { + t++; + } + + while (n > 0 && *src) { + *t = *src; + t++; + src++; + n--; + } + + *t = '\0'; + + return dest; +} + +char* strcat (char *dest, const char *src) +{ + strcpy (dest + strlen (dest), src); + return dest; +} + +int strcasecmp(const char *s1, const char *s2) +{ + char c1, c2; + + while (1) { + c1 = *s1++; + c2 = *s2++; + + if (!c1 || !c2) { + break; + } + + if ('A' <= c1 && c1 <= 'Z') { + c1 |= 0x20; + } + + if ('A' <= c2 && c2 <= 'Z') { + c2 |= 0x20; + } + + if (c1 != c2) { + break; + } + } + + return c1 - c2; +} + +int strcmp(const char* p1, const char* p2) +{ + const unsigned char *s1 = (const unsigned char*) p1; + const unsigned char *s2 = (const unsigned char*) p2; + unsigned char c1, c2; + + do { + c1 = (unsigned char) *s1++; + c2 = (unsigned char) *s2++; + if ( c1 == '\0' ) return c1 - c2; + } while ( c1 == c2 ); + return c1 - c2; +} + +int strncmp (const char *s1, const char *s2, unsigned long long n) +{ + unsigned char c1 = '\0'; + unsigned char c2 = '\0'; + if (n >= 4) + { + size_t n4 = n >> 2; + do + { + c1 = (unsigned char) *s1++; + c2 = (unsigned char) *s2++; + if (c1 == '\0' || c1 != c2) + return c1 - c2; + c1 = (unsigned char) *s1++; + c2 = (unsigned char) *s2++; + if (c1 == '\0' || c1 != c2) + return c1 - c2; + c1 = (unsigned char) *s1++; + c2 = (unsigned char) *s2++; + if (c1 == '\0' || c1 != c2) + return c1 - c2; + c1 = (unsigned char) *s1++; + c2 = (unsigned char) *s2++; + if (c1 == '\0' || c1 != c2) + return c1 - c2; + } while (--n4 > 0); + n &= 3; + } + while (n > 0) + { + c1 = (unsigned char) *s1++; + c2 = (unsigned char) *s2++; + if (c1 == '\0' || c1 != c2) + return c1 - c2; + n--; + } + return c1 - c2; +} + +char* memcpy(void *dest, const void *src, unsigned long long len) +{ + char *d = dest; + const char *s = src; + while (len--) + *d++ = *s++; + return dest; +} + +char* strcpy (char *dest, const char *src) +{ + return memcpy (dest, src, strlen (src) + 1); +} + +void *memset(void *s, int c, size_t n) +{ + char *start = s; + for (size_t i = 0; i < n; i++) + { + start[i] = c; + } + + return s; +} + +char* strchr (register const char *s, int c) +{ + do { + if (*s == c) + { + return (char*)s; + } + } while (*s++); + return (0); +} + +char* str_SepbySpace(char* head) +{ + char* end; + while(1){ + if(*head == '\0') + { + end = head; + break; + } + if(*head == ' ') + { + *head = '\0'; + end = head + 1; + break; + } + head++; + } + return end; +} + +// A simple atoi() function +int atoi(char* str) +{ + // Initialize result + int res = 0; + + // Iterate through all characters + // of input string and update result + // take ASCII character of corresponding digit and + // subtract the code from '0' to get numerical + // value and multiply res by 10 to shuffle + // digits left to update running total + for (int i = 0; str[i] != '\0'; ++i) + { + if(str[i] > '9' || str[i] < '0')return res; + res = res * 10 + str[i] - '0'; + } + + // return result. + return res; +} diff --git a/lab8/kernel/src/syscall.c b/lab8/kernel/src/syscall.c new file mode 100644 index 000000000..acfa404ef --- /dev/null +++ b/lab8/kernel/src/syscall.c @@ -0,0 +1,418 @@ +#include "syscall.h" +#include "cpio.h" +#include "sched.h" +#include "stddef.h" +#include "uart1.h" +#include "exception.h" +#include "memory.h" +#include "mbox.h" +#include "signal.h" +#include "mmu.h" +#include "string.h" +#include "dev_framebuffer.h" + +int getpid(trapframe_t* tpf) +{ + tpf->x0 = curr_thread->pid; + return curr_thread->pid; +} + +size_t uartread(trapframe_t *tpf,char buf[], size_t size) +{ + int i = 0; + for (int i = 0; i < size;i++) + { + buf[i] = uart_async_getc(); + } + tpf->x0 = i; + return i; +} + +size_t uartwrite(trapframe_t *tpf,const char buf[], size_t size) +{ + int i = 0; + for (int i = 0; i < size; i++) + { + uart_async_putc(buf[i]); + } + tpf->x0 = i; + return i; +} + +//In this lab, you won’t have to deal with argument passing +int exec(trapframe_t *tpf,const char *name, char *const argv[]) +{ + mmu_del_vma(curr_thread); + INIT_LIST_HEAD(&curr_thread->vma_list); + + // use virtual file system + char abs_path[MAX_PATH_NAME]; + strcpy(abs_path, name); + get_absolute_path(abs_path, curr_thread->curr_working_dir); + + struct vnode *target_file; + vfs_lookup(abs_path,&target_file); + curr_thread->datasize = target_file->f_ops->getsize(target_file); + + curr_thread->data = kmalloc(curr_thread->datasize); + curr_thread->stack_alloced_ptr = kmalloc(USTACK_SIZE); + + asm("dsb ish\n\t"); // ensure write has completed + mmu_free_page_tables(curr_thread->context.pgd, 0); + memset(PHYS_TO_VIRT(curr_thread->context.pgd), 0, 0x1000); + asm("tlbi vmalle1is\n\t" // invalidate all TLB entries + "dsb ish\n\t" // ensure completion of TLB invalidatation + "isb\n\t"); // clear pipeline + + mmu_add_vma(curr_thread, USER_KERNEL_BASE, curr_thread->datasize, (size_t)VIRT_TO_PHYS(curr_thread->data) , 0b111, 1); + mmu_add_vma(curr_thread, USER_STACK_BASE - USTACK_SIZE, USTACK_SIZE, (size_t)VIRT_TO_PHYS(curr_thread->stack_alloced_ptr), 0b111, 1); + mmu_add_vma(curr_thread, PERIPHERAL_START, PERIPHERAL_END - PERIPHERAL_START, PERIPHERAL_START, 0b011, 0); + mmu_add_vma(curr_thread, USER_SIGNAL_WRAPPER_VA, 0x2000, (size_t)VIRT_TO_PHYS(signal_handler_wrapper), 0b101, 0); + + //memcpy(curr_thread->data, new_data, curr_thread->datasize); + struct file *f; + vfs_open(abs_path, 0, &f); + vfs_read(f, curr_thread->data, curr_thread->datasize); + vfs_close(f); + + for (int i = 0; i <= SIGNAL_MAX; i++) + { + curr_thread->signal_handler[i] = signal_default_handler; + } + + + tpf->elr_el1 = USER_KERNEL_BASE; + tpf->sp_el0 = USER_STACK_BASE; + tpf->x0 = 0; + return 0; +} + +int fork(trapframe_t *tpf) +{ + lock(); + thread_t *newt = thread_create(curr_thread->data,curr_thread->datasize); + + //copy signal handler + for (int i = 0; i <= SIGNAL_MAX;i++) + { + newt->signal_handler[i] = curr_thread->signal_handler[i]; + } + + for (int i = 0; i <= MAX_FD; i++) + { + if (curr_thread->file_descriptors_table[i]) + { + newt->file_descriptors_table[i] = kmalloc(sizeof(struct file)); + *newt->file_descriptors_table[i] = *curr_thread->file_descriptors_table[i]; + } + } + + list_head_t *pos; + vm_area_struct_t *vma; + list_for_each(pos, &curr_thread->vma_list){ + // ignore device and signal wrapper + vma = (vm_area_struct_t *)pos; + if (vma->virt_addr == USER_SIGNAL_WRAPPER_VA || vma->virt_addr == PERIPHERAL_START) + { + continue; + } + char *new_alloc = kmalloc(vma->area_size); + mmu_add_vma(newt, vma->virt_addr, vma->area_size, (size_t)VIRT_TO_PHYS(new_alloc), vma->rwx, 1); + memcpy(new_alloc, (void*)PHYS_TO_VIRT(vma->phys_addr), vma->area_size); + } + mmu_add_vma(newt, PERIPHERAL_START, PERIPHERAL_END - PERIPHERAL_START, PERIPHERAL_START, 0b011, 0); + mmu_add_vma(newt, USER_SIGNAL_WRAPPER_VA, 0x2000, (size_t)VIRT_TO_PHYS(signal_handler_wrapper), 0b101, 0); + + int parent_pid = curr_thread->pid; + + //copy stack into new process + for (int i = 0; i < KSTACK_SIZE; i++) + { + newt->kernel_stack_alloced_ptr[i] = curr_thread->kernel_stack_alloced_ptr[i]; + } + + store_context(get_current()); + //for child + if( parent_pid != curr_thread->pid) + { + goto child; + } + + void *temp_pgd = newt->context.pgd; + newt->context = curr_thread->context; + newt->context.pgd = VIRT_TO_PHYS(temp_pgd); + newt->context.fp += newt->kernel_stack_alloced_ptr - curr_thread->kernel_stack_alloced_ptr; // move fp + newt->context.sp += newt->kernel_stack_alloced_ptr - curr_thread->kernel_stack_alloced_ptr; // move kernel sp + + unlock(); + + tpf->x0 = newt->pid; + return newt->pid; + +child: + tpf->x0 = 0; + return 0; +} + +void exit(trapframe_t *tpf, int status) +{ + thread_exit(); +} + +int syscall_mbox_call(trapframe_t *tpf, unsigned char ch, unsigned int *mbox_user) +{ + lock(); + + unsigned int size_of_mbox = mbox_user[0]; + memcpy((char *)pt, mbox_user, size_of_mbox); + mbox_call(MBOX_TAGS_ARM_TO_VC, (unsigned int)((unsigned long)&pt)); + memcpy(mbox_user, (char *)pt, size_of_mbox); + + tpf->x0 = 8; + unlock(); + return 0; +} + +void kill(trapframe_t *tpf,int pid) +{ + lock(); + if (pid >= PIDMAX || pid < 0 || !threads[pid].isused) + { + unlock(); + return; + } + threads[pid].iszombie = 1; + unlock(); + schedule(); +} + +void signal_register(int signal, void (*handler)()) +{ + if (signal > SIGNAL_MAX || signal < 0)return; + + curr_thread->signal_handler[signal] = handler; +} + +void signal_kill(int pid, int signal) +{ + if (pid > PIDMAX || pid < 0 || !threads[pid].isused)return; + + lock(); + threads[pid].sigcount[signal]++; + unlock(); +} + +//only need to implement the anonymous page mapping in this Lab. +void *mmap(trapframe_t *tpf, void *addr, size_t len, int prot, int flags, int fd, int file_offset) +{ + // Ignore flags as we have demand pages + + // Req #3 Page size round up + len = len % 0x1000 ? len + (0x1000 - len % 0x1000) : len; + addr = (unsigned long)addr % 0x1000 ? addr + (0x1000 - (unsigned long)addr % 0x1000) : addr; + + // Req #2 check if overlap + list_head_t *pos; + vm_area_struct_t *vma; + vm_area_struct_t *the_area_ptr = 0; + list_for_each(pos, &curr_thread->vma_list) + { + vma = (vm_area_struct_t *)pos; + // Detect existing vma overlapped + if ( ! (vma->virt_addr >= (unsigned long)(addr + len) || vma->virt_addr + vma->area_size <= (unsigned long)addr ) ) + { + the_area_ptr = vma; + break; + } + } + // take as a hint to decide new region's start address + if (the_area_ptr) + { + tpf->x0 = (unsigned long) mmap(tpf, (void *)(the_area_ptr->virt_addr + the_area_ptr->area_size), len, prot, flags, fd, file_offset); + return (void *)tpf->x0; + } + // create new valid region, map and set the page attributes (prot) + mmu_add_vma(curr_thread, (unsigned long)addr, len, VIRT_TO_PHYS((unsigned long)kmalloc(len)), prot, 1); + tpf->x0 = (unsigned long)addr; + return (void*)tpf->x0; +} + + +int open(trapframe_t *tpf, const char *pathname, int flags) +{ + char abs_path[MAX_PATH_NAME]; + strcpy(abs_path, pathname); + get_absolute_path(abs_path, curr_thread->curr_working_dir); + for (int i = 0; i < MAX_FD; i++) + { + if(!curr_thread->file_descriptors_table[i]) + { + if(vfs_open(abs_path, flags, &curr_thread->file_descriptors_table[i])!=0) + { + break; + } + + tpf->x0 = i; + return i; + } + } + + tpf->x0 = -1; + return -1; +} + +int close(trapframe_t *tpf, int fd) +{ + if(curr_thread->file_descriptors_table[fd]) + { + vfs_close(curr_thread->file_descriptors_table[fd]); + curr_thread->file_descriptors_table[fd] = 0; + tpf->x0 = 0; + return 0; + } + + tpf->x0 = -1; + return -1; +} + +long write(trapframe_t *tpf, int fd, const void *buf, unsigned long count) +{ + if (curr_thread->file_descriptors_table[fd]) + { + tpf->x0 = vfs_write(curr_thread->file_descriptors_table[fd], buf, count); + return tpf->x0; + } + + tpf->x0 = -1; + return tpf->x0; +} + +long read(trapframe_t *tpf, int fd, void *buf, unsigned long count) +{ + if (curr_thread->file_descriptors_table[fd]) + { + tpf->x0 = vfs_read(curr_thread->file_descriptors_table[fd], buf, count); + return tpf->x0; + } + + tpf->x0 = -1; + return tpf->x0; +} + +int mkdir(trapframe_t *tpf, const char *pathname, unsigned mode) +{ + char abs_path[MAX_PATH_NAME]; + strcpy(abs_path, pathname); + get_absolute_path(abs_path, curr_thread->curr_working_dir); + tpf->x0 = vfs_mkdir(abs_path); + return tpf->x0; +} + +int mount(trapframe_t *tpf, const char *src, const char *target, const char *filesystem, unsigned long flags, const void *data) +{ + char abs_path[MAX_PATH_NAME]; + strcpy(abs_path, target); + get_absolute_path(abs_path, curr_thread->curr_working_dir); + + tpf->x0 = vfs_mount(abs_path,filesystem); + return tpf->x0; +} + +int chdir(trapframe_t *tpf, const char *path) +{ + char abs_path[MAX_PATH_NAME]; + strcpy(abs_path, path); + get_absolute_path(abs_path, curr_thread->curr_working_dir); + strcpy(curr_thread->curr_working_dir, abs_path); + + return 0; +} + +long lseek64(trapframe_t *tpf, int fd, long offset, int whence) +{ + if(whence == SEEK_SET) + { + curr_thread->file_descriptors_table[fd]->f_pos = offset; + tpf->x0 = offset; + } + else + { + tpf->x0 = -1; + } + + return tpf->x0; +} +extern unsigned int height; +extern unsigned int isrgb; +extern unsigned int pitch; +extern unsigned int width; +int ioctl(trapframe_t *tpf, int fb, unsigned long request, void *info) +{ + if(request == 0) + { + struct framebuffer_info *fb_info = info; + fb_info->height = height; + fb_info->isrgb = isrgb; + fb_info->pitch = pitch; + fb_info->width = width; + } + + tpf->x0 = 0; + return tpf->x0; +} + +int sync(trapframe_t *tpf) +{ + for (int i = 0; i < MAX_FS_REG;i++) + { + if(!reg_fs[i].name) continue; + vfs_sync(®_fs[i]); + } + tpf->x0 = 0; + return tpf->x0; +} + +void sigreturn(trapframe_t *tpf) +{ + //unsigned long signal_ustack = tpf->sp_el0 % USTACK_SIZE == 0 ? tpf->sp_el0 - USTACK_SIZE : tpf->sp_el0 & (~(USTACK_SIZE - 1)); + //kfree((char*)signal_ustack); + load_context(&curr_thread->signal_saved_context); +} + + + + +char* get_file_start(char *thefilepath) +{ + char *filepath; + char *filedata; + unsigned int filesize; + struct cpio_newc_header *header_pointer = CPIO_DEFAULT_START; + + while (header_pointer != 0) + { + int error = cpio_newc_parse_header(header_pointer, &filepath, &filesize, &filedata, &header_pointer); + if (error) break; + if (strcmp(thefilepath, filepath) == 0) return filedata; + if (header_pointer == 0) uart_puts("execfile: %s: No such file or directory\r\n", thefilepath); + } + return 0; +} + +unsigned int get_file_size(char *thefilepath) +{ + char *filepath; + char *filedata; + unsigned int filesize; + struct cpio_newc_header *header_pointer = CPIO_DEFAULT_START; + + while (header_pointer != 0) + { + int error = cpio_newc_parse_header(header_pointer, &filepath, &filesize, &filedata, &header_pointer); + if (error) break; + if (strcmp(thefilepath, filepath) == 0) return filesize; + if (header_pointer == 0) uart_puts("execfile: %s: No such file or directory\r\n", thefilepath); + } + return 0; +} + diff --git a/lab8/kernel/src/timer.c b/lab8/kernel/src/timer.c new file mode 100644 index 000000000..d5e369ff6 --- /dev/null +++ b/lab8/kernel/src/timer.c @@ -0,0 +1,163 @@ +#include "timer.h" +#include "uart1.h" +#include "memory.h" +#include "string.h" +#include "exception.h" + +#define STR(x) #x +#define XSTR(s) STR(s) + +struct list_head *timer_event_list; + +void timer_list_init() +{ + unsigned long long tmp; + asm volatile("mrs %0, cntkctl_el1": "=r"(tmp)); + tmp |= 1; + asm volatile("msr cntkctl_el1, %0":: "r"(tmp)); + + timer_event_list = kmalloc(sizeof(list_head_t)); + INIT_LIST_HEAD(timer_event_list); +} + +void core_timer_enable() +{ + __asm__ __volatile__( + "mov x1, 1\n\t" + "msr cntp_ctl_el0, x1\n\t" // enable + + "mov x2, 2\n\t" + "ldr x1, =" XSTR(CORE0_TIMER_IRQ_CTRL) "\n\t" + "str w2, [x1]\n\t" // unmask timer interrupt + :::"x1","x2"); +} + +void core_timer_disable() +{ + __asm__ __volatile__( + "mov x2, 0\n\t" + "ldr x1, =" XSTR(CORE0_TIMER_IRQ_CTRL) "\n\t" + "str w2, [x1]\n\t" // unmask timer interrupt + :::"x1","x2"); +} + +void timer_event_callback(timer_event_t *timer_event) +{ + ((void (*)(char *))timer_event->callback)(timer_event->args); // call the callback store in event + list_del_entry((struct list_head *)timer_event); // delete the event + kfree(timer_event->args); // kfree the arg space + kfree(timer_event); + + //set interrupt to next time_event if existing + if (!list_empty(timer_event_list)) + { + set_core_timer_interrupt_by_tick(((timer_event_t *)timer_event_list->next)->interrupt_time); + } + else + { + set_core_timer_interrupt(10000); // disable timer interrupt (set a very big value) + } +} + +void core_timer_handler() +{ + lock(); + //disable_interrupt(); + if (list_empty(timer_event_list)) + { + set_core_timer_interrupt(10000); // disable timer interrupt (set a very big value) + unlock(); + return; + } + + timer_event_callback((timer_event_t *)timer_event_list->next); // do callback and set new interrupt + unlock(); +} + +// give a string argument to callback timeout after seconds +void add_timer(void *callback, unsigned long long timeout, char *args, int bytick) +{ + timer_event_t *the_timer_event = kmalloc(sizeof(timer_event_t)); //need to kfree by event handler + + // store argument string into timer_event + the_timer_event->args = kmalloc(strlen(args) + 1); + strcpy(the_timer_event->args, args); + + if(bytick == 0) + { + the_timer_event->interrupt_time = get_tick_plus_s(timeout); // store interrupt time into timer_event + }else + { + the_timer_event->interrupt_time = get_tick_plus_s(0) + timeout; + } + + the_timer_event->callback = callback; + + // add the timer_event into timer_event_list (sorted) + struct list_head *curr; + + lock(); + list_for_each(curr, timer_event_list) + { + if (((timer_event_t *)curr)->interrupt_time > the_timer_event->interrupt_time) + { + list_add(&the_timer_event->listhead, curr->prev); // add this timer at the place just before the bigger one (sorted) + break; + } + } + + if (list_is_head(curr, timer_event_list)) + { + list_add_tail(&the_timer_event->listhead, timer_event_list); // for the time is the biggest + } + + + // set interrupt to first event + set_core_timer_interrupt_by_tick(((timer_event_t *)timer_event_list->next)->interrupt_time); + unlock(); +} + + +// get cpu tick add some second +unsigned long long get_tick_plus_s(unsigned long long second) +{ + + unsigned long long cntpct_el0 = 0; + __asm__ __volatile__("mrs %0, cntpct_el0\n\t" + : "=r"(cntpct_el0)); //tick now + + unsigned long long cntfrq_el0 = 0; + __asm__ __volatile__("mrs %0, cntfrq_el0\n\t" + : "=r"(cntfrq_el0)); //tick frequency + + return (cntpct_el0 + cntfrq_el0 * second); +} + +// set timer interrupt time to [expired_time] seconds after now (relatively) +void set_core_timer_interrupt(unsigned long long expired_time) +{ + __asm__ __volatile__( + "mrs x1, cntfrq_el0\n\t" //cntfrq_el0 -> relative time + "mul x1, x1, %0\n\t" + "msr cntp_tval_el0, x1\n\t" // set expired time + :: "r"(expired_time):"x1"); +} + +// directly set timer interrupt time to a cpu tick (directly) +void set_core_timer_interrupt_by_tick(unsigned long long tick) +{ + __asm__ __volatile__( + "msr cntp_cval_el0, %0\n\t" //cntp_cval_el0 -> absolute time + :: "r"(tick)); +} + +int timer_list_get_size() +{ + int r = 0; + struct list_head *curr; + list_for_each(curr, timer_event_list) + { + r++; + } + return r; +} diff --git a/lab8/kernel/src/tmpfs.c b/lab8/kernel/src/tmpfs.c new file mode 100644 index 000000000..a0f571c27 --- /dev/null +++ b/lab8/kernel/src/tmpfs.c @@ -0,0 +1,212 @@ +#include "tmpfs.h" +#include "vfs.h" +#include "string.h" +#include "memory.h" +#include "uart1.h" + +struct file_operations tmpfs_file_operations = {tmpfs_write,tmpfs_read,tmpfs_open,tmpfs_close,tmpfs_lseek64,tmpfs_getsize}; +struct vnode_operations tmpfs_vnode_operations = {tmpfs_lookup,tmpfs_create,tmpfs_mkdir}; + +int register_tmpfs() +{ + struct filesystem fs; + fs.name = "tmpfs"; + fs.setup_mount = tmpfs_setup_mount; + fs.sync = tmpfs_sync; + return register_filesystem(&fs); +} + +int tmpfs_setup_mount(struct filesystem *fs, struct mount *_mount) +{ + _mount->fs = fs; + _mount->root = tmpfs_create_vnode(0,dir_t); + return 0; +} + +struct vnode* tmpfs_create_vnode(struct mount* _mount, enum fsnode_type type) +{ + struct vnode *v = kmalloc(sizeof(struct vnode)); + v->f_ops = &tmpfs_file_operations; + v->v_ops = &tmpfs_vnode_operations; + v->mount = 0; + struct tmpfs_inode* inode = kmalloc(sizeof(struct tmpfs_inode)); + memset(inode, 0, sizeof(struct tmpfs_inode)); + inode->type = type; + inode->data = kmalloc(0x1000); + v->internal = inode; + return v; +} + +// file operations +int tmpfs_write(struct file *file, const void *buf, size_t len) +{ + struct tmpfs_inode *inode = file->vnode->internal; + // write from f_pos + memcpy(inode->data + file->f_pos, buf, len); + // update f_pos and size + file->f_pos += len; + if(inode->datasize < file->f_pos) inode->datasize = file->f_pos; + return len; +} + +int tmpfs_read(struct file *file, void *buf, size_t len) +{ + struct tmpfs_inode *inode = file->vnode->internal; + // if buffer overflow, shrink the request read length + // read from f_pos + if(len+file->f_pos > inode->datasize) + { + len = inode->datasize - file->f_pos; + memcpy(buf, inode->data + file->f_pos, len); + file->f_pos += inode->datasize - file->f_pos; + return len; + } + else + { + memcpy(buf, inode->data + file->f_pos, len); + file->f_pos += len; + return len; + } + return -1; +} + +int tmpfs_open(struct vnode *file_node, struct file **target) +{ + (*target)->vnode = file_node; + (*target)->f_ops = file_node->f_ops; + (*target)->f_pos = 0; + return 0; +} + +int tmpfs_close(struct file *file) +{ + kfree(file); + return 0; +} + +long tmpfs_lseek64(struct file *file, long offset, int whence) +{ + if(whence == SEEK_SET) + { + file->f_pos = offset; + return file->f_pos; + } + return -1; +} + + +// vnode operations +int tmpfs_lookup(struct vnode *dir_node, struct vnode **target, const char *component_name) +{ + struct tmpfs_inode *dir_inode = dir_node->internal; + int child_idx = 0; + // BFS search tree + for (; child_idx <= MAX_DIR_ENTRY; child_idx++) + { + struct vnode *vnode = dir_inode->entry[child_idx]; + if(!vnode) break; + struct tmpfs_inode *inode = vnode->internal; + if (strcmp(component_name, inode->name) == 0) + { + *target = vnode; + return 0; + } + } + return -1; +} + + +int tmpfs_create(struct vnode *dir_node, struct vnode **target, const char *component_name) +{ + struct tmpfs_inode *inode = dir_node->internal; + if(inode->type!=dir_t) + { + uart_sendline("tmpfs create not dir_t\r\n"); + return -1; + } + + int child_idx = 0; + for (; child_idx <= MAX_DIR_ENTRY; child_idx++) + { + if (!inode->entry[child_idx]) break; + struct tmpfs_inode *child_inode = inode->entry[child_idx]->internal; + if (strcmp(child_inode->name,component_name)==0) + { + uart_sendline("tmpfs create file exists\r\n"); + return -1; + } + } + + if (child_idx > MAX_DIR_ENTRY) + { + uart_sendline("DIR ENTRY FULL\r\n"); + return -1; + } + + if (strlen(component_name) > MAX_FILE_NAME) + { + uart_sendline("FILE NAME TOO LONG\r\n"); + return -1; + } + + struct vnode *_vnode = tmpfs_create_vnode(0, file_t); + inode->entry[child_idx] = _vnode; + + struct tmpfs_inode *newinode = _vnode->internal; + strcpy(newinode->name, component_name); + + *target = _vnode; + return 0; +} + +int tmpfs_mkdir(struct vnode *dir_node, struct vnode **target, const char *component_name) +{ + struct tmpfs_inode *inode = dir_node->internal; + + if (inode->type != dir_t) + { + uart_sendline("tmpfs mkdir not dir_t\r\n"); + return -1; + } + + int child_idx = 0; + for (; child_idx <= MAX_DIR_ENTRY; child_idx++) + { + if (!inode->entry[child_idx]) + { + break; + } + } + + if(child_idx > MAX_DIR_ENTRY) + { + uart_sendline("DIR ENTRY FULL\r\n"); + return -1; + } + + if (strlen(component_name) > MAX_FILE_NAME) + { + uart_sendline("FILE NAME TOO LONG\r\n"); + return -1; + } + + struct vnode* _vnode = tmpfs_create_vnode(0, dir_t); + inode->entry[child_idx] = _vnode; + + struct tmpfs_inode *newinode = _vnode->internal; + strcpy(newinode->name, component_name); + + *target = _vnode; + return 0; +} + +long tmpfs_getsize(struct vnode* vd) +{ + struct tmpfs_inode *inode = vd->internal; + return inode->datasize; +} + +int tmpfs_sync(struct filesystem *fs) +{ + return 0; +} diff --git a/lab8/kernel/src/uart1.c b/lab8/kernel/src/uart1.c new file mode 100644 index 000000000..c2cf5fff3 --- /dev/null +++ b/lab8/kernel/src/uart1.c @@ -0,0 +1,172 @@ +#include "bcm2837/rpi_gpio.h" +#include "bcm2837/rpi_uart1.h" +#include "bcm2837/rpi_irq.h" +#include "uart1.h" +#include "exception.h" +#include "string.h" + +//implement first in first out buffer with a read index and a write index +char uart_tx_buffer[VSPRINT_MAX_BUF_SIZE]={}; +unsigned int uart_tx_buffer_widx = 0; //write index +unsigned int uart_tx_buffer_ridx = 0; //read index +char uart_rx_buffer[VSPRINT_MAX_BUF_SIZE]={}; +unsigned int uart_rx_buffer_widx = 0; +unsigned int uart_rx_buffer_ridx = 0; + +int uart_recv_echo_flag = 1; + +void uart_init() +{ + register unsigned int r; + + /* initialize UART */ + *AUX_ENABLES |= 1; // enable UART1 + *AUX_MU_CNTL_REG = 0; // disable TX/RX + + /* configure UART */ + *AUX_MU_IER_REG = 0; // disable interrupt + *AUX_MU_LCR_REG = 3; // 8 bit data size + *AUX_MU_MCR_REG = 0; // disable flow control + *AUX_MU_BAUD_REG = 270; // 115200 baud rate + *AUX_MU_IIR_REG = 0xC6; // disable FIFO + + /* map UART1 to GPIO pins */ + r = *GPFSEL1; + r &= ~(7<<12); // clean gpio14 + r |= 2<<12; // set gpio14 to alt5 + r &= ~(7<<15); // clean gpio15 + r |= 2<<15; // set gpio15 to alt5 + *GPFSEL1 = r; + + /* enable pin 14, 15 - ref: Page 101 */ + *GPPUD = 0; + r=150; while(r--) { asm volatile("nop"); } + *GPPUDCLK0 = (1<<14)|(1<<15); + r=150; while(r--) { asm volatile("nop"); } + *GPPUDCLK0 = 0; + + *AUX_MU_CNTL_REG = 3; // enable TX/RX +} + +char uart_recv() { + char r; + while(!(*AUX_MU_LSR_REG & 0x01)){}; + r = (char)(*AUX_MU_IO_REG); + if(uart_recv_echo_flag){ + uart_send(r); + if(r =='\r') {uart_send('\r');uart_send('\n');} + } + return r=='\r'?'\n':r; +} + +void uart_send(char c) { + while(!(*AUX_MU_LSR_REG & 0x20)){}; + *AUX_MU_IO_REG = c; +} + +void uart_2hex(unsigned int d) { + unsigned int n; + int c; + for(c=28;c>=0;c-=4) { + n=(d>>c)&0xF; + n+=n>9?0x37:0x30; + uart_send(n); + } +} + +int uart_sendline(char* fmt, ...) { + __builtin_va_list args; + __builtin_va_start(args, fmt); + char buf[VSPRINT_MAX_BUF_SIZE]; + + char *str = (char*)buf; + int count = vsprintf(str,fmt,args); + + while(*str) { + if(*str=='\n') + uart_send('\r'); + uart_send(*str++); + } + __builtin_va_end(args); + return count; +} + + +// uart_async_getc read from buffer +// uart_r_irq_handler write to buffer then output +char uart_async_getc() { + *AUX_MU_IER_REG |=1; // enable read interrupt + // do while if buffer empty + while (uart_rx_buffer_ridx == uart_rx_buffer_widx) *AUX_MU_IER_REG |=1; // enable read interrupt + lock(); + char r = uart_rx_buffer[uart_rx_buffer_ridx++]; + if (uart_rx_buffer_ridx >= VSPRINT_MAX_BUF_SIZE) uart_rx_buffer_ridx = 0; + unlock(); + return r; +} + + +// uart_async_putc writes to buffer +// uart_w_irq_handler read from buffer then output +void uart_async_putc(char c) { + // if buffer full, wait for uart_w_irq_handler + while( (uart_tx_buffer_widx + 1) % VSPRINT_MAX_BUF_SIZE == uart_tx_buffer_ridx ) *AUX_MU_IER_REG |=2; // enable write interrupt + lock(); + uart_tx_buffer[uart_tx_buffer_widx++] = c; + if(uart_tx_buffer_widx >= VSPRINT_MAX_BUF_SIZE) uart_tx_buffer_widx=0; // cycle pointer + unlock(); + *AUX_MU_IER_REG |=2; // enable write interrupt +} + +int uart_puts(char* fmt, ...) { + __builtin_va_list args; + __builtin_va_start(args, fmt); + char buf[VSPRINT_MAX_BUF_SIZE]; + + char *str = (char*)buf; + int count = vsprintf(str,fmt,args); + + while(*str) { + if(*str=='\n') + uart_async_putc('\r'); + uart_async_putc(*str++); + } + __builtin_va_end(args); + return count; +} + +// AUX_MU_IER_REG -> BCM2837-ARM-Peripherals.pdf - Pg.12 +void uart_interrupt_enable(){ + *AUX_MU_IER_REG |=1; // enable read interrupt + *AUX_MU_IER_REG |=2; // enable write interrupt + *ENABLE_IRQS_1 |= 1 << 29; // Pg.112 +} + +void uart_interrupt_disable(){ + *AUX_MU_IER_REG &= ~(1); // disable read interrupt + *AUX_MU_IER_REG &= ~(2); // disable write interrupt +} + + +void uart_r_irq_handler(){ + if((uart_rx_buffer_widx + 1) % VSPRINT_MAX_BUF_SIZE == uart_rx_buffer_ridx) + { + *AUX_MU_IER_REG &= ~(1); // disable read interrupt + return; + } + uart_rx_buffer[uart_rx_buffer_widx++] = uart_recv(); + if(uart_rx_buffer_widx>=VSPRINT_MAX_BUF_SIZE) uart_rx_buffer_widx=0; + *AUX_MU_IER_REG |=1; +} + +void uart_w_irq_handler(){ + if(uart_tx_buffer_ridx == uart_tx_buffer_widx) + { + *AUX_MU_IER_REG &= ~(2); // disable write interrupt + return; // buffer empty + } + uart_send(uart_tx_buffer[uart_tx_buffer_ridx++]); + if(uart_tx_buffer_ridx>=VSPRINT_MAX_BUF_SIZE) uart_tx_buffer_ridx=0; + *AUX_MU_IER_REG |=2; // enable write interrupt +} + diff --git a/lab8/kernel/src/vfs.c b/lab8/kernel/src/vfs.c new file mode 100644 index 000000000..fff02c0ca --- /dev/null +++ b/lab8/kernel/src/vfs.c @@ -0,0 +1,343 @@ +#include "vfs.h" +#include "tmpfs.h" +#include "memory.h" +#include "string.h" +#include "uart1.h" +#include "initramfs.h" +#include "dev_uart.h" +#include "dev_framebuffer.h" +#include "sdhost.h" +#include "fat32.h" + +struct mount *rootfs; +struct filesystem reg_fs[MAX_FS_REG]; +struct file_operations reg_dev[MAX_DEV_REG]; + +int register_filesystem(struct filesystem *fs) +{ + for (int i = 0; i < MAX_FS_REG;i++) + { + if(!reg_fs[i].name) + { + reg_fs[i].name = fs->name; + reg_fs[i].setup_mount = fs->setup_mount; + reg_fs[i].sync = fs->sync; + return i; + } + } + return -1; +} + +int register_dev(struct file_operations *fo) +{ + for (int i = 0; i < MAX_FS_REG; i++) + { + if (!reg_dev[i].open) + { + // return unique id for the assigned device + reg_dev[i] = *fo; + return i; + } + } + return -1; +} + +struct filesystem* find_filesystem(const char* fs_name) +{ + for (int i = 0; i < MAX_FS_REG; i++) + { + if (strcmp(reg_fs[i].name,fs_name)==0) + { + return ®_fs[i]; + } + } + return 0; +} + + + +int vfs_open(const char *pathname, int flags, struct file **target) +{ + // 1. Lookup pathname + // 3. Create a new file if O_CREAT is specified in flags and vnode not found + struct vnode *node; + if (vfs_lookup(pathname, &node) != 0 && (flags & O_CREAT)) + { + int last_slash_idx = 0; + for (int i = 0; i < strlen(pathname); i++) + { + if(pathname[i]=='/') + { + last_slash_idx = i; + } + } + + char dirname[MAX_PATH_NAME+1]; + strcpy(dirname, pathname); + dirname[last_slash_idx] = 0; + if (vfs_lookup(dirname,&node)!=0) + { + uart_sendline("cannot ocreate no dir name\r\n"); + return -1; + } + node->v_ops->create(node, &node, pathname+last_slash_idx+1); + *target = kmalloc(sizeof(struct file)); + node->f_ops->open(node, target); + (*target)->flags = flags; + return 0; + } + else // 2. Create a new file handle for this vnode if found. + { + *target = kmalloc(sizeof(struct file)); + node->f_ops->open(node, target); + (*target)->flags = flags; + return 0; + } + + // lookup error code shows if file exist or not or other error occurs + // 4. Return error code if fails + return -1; +} + +int vfs_close(struct file *file) +{ + // 1. release the file handle + // 2. Return error code if fails + file->f_ops->close(file); + return 0; +} + +int vfs_write(struct file *file, const void *buf, size_t len) +{ + // 1. write len byte from buf to the opened file. + // 2. return written size or error code if an error occurs. + return file->f_ops->write(file,buf,len); +} + +int vfs_read(struct file *file, void *buf, size_t len) +{ + // 1. read min(len, readable size) byte to buf from the opened file. + // 2. block if nothing to read for FIFO type + // 2. return read size or error code if an error occurs. + return file->f_ops->read(file, buf, len); +} + +int vfs_mkdir(const char *pathname) +{ + char dirname[MAX_PATH_NAME] = {}; // before add folder + char newdirname[MAX_PATH_NAME] = {}; // after add folder + + // search for last directory + int last_slash_idx = 0; + for (int i = 0; i < strlen(pathname); i++) + { + if (pathname[i] == '/') + { + last_slash_idx = i; + } + } + + memcpy(dirname, pathname, last_slash_idx); + strcpy(newdirname, pathname + last_slash_idx + 1); + + // create new directory if upper directory is found + struct vnode *node; + if(vfs_lookup(dirname,&node)==0) + { + node->v_ops->mkdir(node,&node,newdirname); + return 0; + } + + uart_sendline("vfs_mkdir cannot find pathname"); + return -1; +} + +int vfs_mount(const char *target, const char *filesystem) +{ + struct vnode *dirnode; + // search for the target filesystem + struct filesystem *fs = find_filesystem(filesystem); + if(!fs) + { + uart_sendline("vfs_mount cannot find filesystem\r\n"); + return -1; + } + // get its upper directory, if no, create new mountpoint + if(vfs_lookup(target, &dirnode)==-1) + { + uart_sendline("vfs_mount cannot find dir\r\n"); + return -1; + }else + { + dirnode->mount = kmalloc(sizeof(struct mount)); + fs->setup_mount(fs, dirnode->mount); + } + return 0; +} + +int vfs_lookup(const char *pathname, struct vnode **target) +{ + int is_fat = 0; + if (pathname[1]=='b' && pathname[2]=='o' && pathname[3]=='o' && pathname[4]=='t') + is_fat = 1; + // if no path input, return root + if(strlen(pathname)==0) + { + *target = rootfs->root; + return 0; + } + + struct vnode *dirnode = rootfs->root; + char component_name[MAX_FILE_NAME+1] = {}; + int c_idx = 0; + // deal with directory + for (int i = 1; i < strlen(pathname); i++) + { + if (pathname[i] == '/') + { + component_name[c_idx++] = 0; + // if fs's v_ops error, return -1 + if (dirnode->v_ops->lookup(dirnode, &dirnode, component_name) != 0) return -1; + // redirect to mounted filesystem + while (dirnode->mount) + { + dirnode = dirnode->mount->root; + if(is_fat) break; + } + c_idx = 0; + } + else + { + component_name[c_idx++] = pathname[i]; + } + } + + // deal with file + component_name[c_idx++] = 0; + // if fs's v_ops error, return -1 + if (dirnode->v_ops->lookup(dirnode, &dirnode, component_name) != 0) return -1; + // redirect to mounted filesystem + while (dirnode->mount) + { + if(is_fat) break; + dirnode = dirnode->mount->root; + } + // return file's vnode + *target = dirnode; + + return 0; +} + +// for device operations only +int vfs_mknod(char* pathname, int id) +{ + struct file* f = kmalloc(sizeof(struct file)); + // create leaf and its file operations + vfs_open(pathname, O_CREAT, &f); + f->vnode->f_ops = ®_dev[id]; + vfs_close(f); + return 0; +} + +int vfs_sync(struct filesystem *fs) +{ + return fs->sync(fs); +} + +void init_rootfs() +{ + // sd_init + sd_init(); + + // tmpfs + int idx = register_tmpfs(); + rootfs = kmalloc(sizeof(struct mount)); + reg_fs[idx].setup_mount(®_fs[idx], rootfs); + + // initramfs + vfs_mkdir("/initramfs"); + register_initramfs(); + vfs_mount("/initramfs","initramfs"); + + // fat32 + vfs_mkdir("/boot"); + register_fat32(); + vfs_mount("/boot", "fat32"); + + // dev_fs + vfs_mkdir("/dev"); + int uart_id = init_dev_uart(); + vfs_mknod("/dev/uart", uart_id); + int framebuffer_id = init_dev_framebuffer(); + vfs_mknod("/dev/framebuffer", framebuffer_id); +} + +void vfs_test() +{ + // test read/write + vfs_mkdir("/lll"); + vfs_mkdir("/lll/ddd"); + // test mount + vfs_mount("/lll/ddd", "tmpfs"); + + struct file* testfilew; + struct file *testfiler; + char testbufw[0x30] = "ABCDEABBBBBBDDDDDDDDDDD"; + char testbufr[0x30] = {}; + vfs_open("/lll/ddd/ggg", O_CREAT, &testfilew); + vfs_open("/lll/ddd/ggg", O_CREAT, &testfiler); + vfs_write(testfilew, testbufw, 10); + vfs_read(testfiler, testbufr, 10); + uart_sendline("%s",testbufr); + + struct file *testfile_initramfs; + vfs_open("/initramfs/get_simpleexec.sh", O_CREAT, &testfile_initramfs); + vfs_read(testfile_initramfs, testbufr, 30); + uart_sendline("%s", testbufr); +} + +char *get_absolute_path(char *path, char *curr_working_dir) +{ + // if relative path -> add root path + if(path[0] != '/') + { + char tmp[MAX_PATH_NAME]; + strcpy(tmp, curr_working_dir); + if(strcmp(curr_working_dir,"/")!=0)strcat(tmp, "/"); + strcat(tmp, path); + strcpy(path, tmp); + } + + char absolute_path[MAX_PATH_NAME+1] = {}; + int idx = 0; + for (int i = 0; i < strlen(path); i++) + { + // meet /.. + if (path[i] == '/' && path[i+1] == '.' && path[i+2] == '.') + { + for (int j = idx; j >= 0;j--) + { + if(absolute_path[j] == '/') + { + absolute_path[j] = 0; + idx = j; + } + } + i += 2; + continue; + } + + // ignore /. + if (path[i] == '/' && path[i+1] == '.') + { + i++; + continue; + } + + absolute_path[idx++] = path[i]; + } + absolute_path[idx] = 0; + + return strcpy(path, absolute_path); +} + diff --git a/lab8/toolbox/send_image_to_bootloader.py b/lab8/toolbox/send_image_to_bootloader.py new file mode 100755 index 000000000..0f802fb89 --- /dev/null +++ b/lab8/toolbox/send_image_to_bootloader.py @@ -0,0 +1,62 @@ +#!/usr/bin/env python3 + +from serial import Serial +from pwn import * +import argparse +from sys import platform + +if platform == "linux" or platform == "linux2": + parser = argparse.ArgumentParser(description='NYCU OSDI kernel sender') + parser.add_argument('--filename', metavar='PATH', default='kernel8.img', type=str, help='path to kernel8.img') + parser.add_argument('--device', metavar='TTY',default='/dev/ttyUSB0', type=str, help='path to UART device') + parser.add_argument('--baud', metavar='Hz',default=115200, type=int, help='baud rate') + args = parser.parse_args() + + with open(args.filename,'rb') as fd: + with Serial(args.device, args.baud) as ser: + + kernel_raw = fd.read() + length = len(kernel_raw) + + print("Kernel image size : ", hex(length)) + for i in range(8): + ser.write(p64(length)[i:i+1]) + ser.flush() + + print("Start sending kernel image by uart1...") + for i in range(length): + # Use kernel_raw[i: i+1] is byte type. Instead of using kernel_raw[i] it will retrieve int type then cause error + ser.write(kernel_raw[i: i+1]) + ser.flush() + if i % 100 == 0: + print("{:>6}/{:>6} bytes".format(i, length)) + print("{:>6}/{:>6} bytes".format(length, length)) + print("Transfer finished!") + +else: + parser = argparse.ArgumentParser(description='NYCU OSDI kernel sender') + parser.add_argument('--filename', metavar='PATH', default='kernel8.img', type=str, help='path to kernel8.img') + parser.add_argument('--device', metavar='COM',default='COM3', type=str, help='COM# to UART device') + parser.add_argument('--baud', metavar='Hz',default=115200, type=int, help='baud rate') + args = parser.parse_args() + + with open(args.filename,'rb') as fd: + with Serial(args.device, args.baud) as ser: + + kernel_raw = fd.read() + length = len(kernel_raw) + + print("Kernel image size : ", hex(length)) + for i in range(8): + ser.write(p64(length)[i:i+1]) + ser.flush() + + print("Start sending kernel image by uart1...") + for i in range(length): + # Use kernel_raw[i: i+1] is byte type. Instead of using kernel_raw[i] it will retrieve int type then cause error + ser.write(kernel_raw[i: i+1]) + ser.flush() + if i % 100 == 0: + print("{:>6}/{:>6} bytes".format(i, length)) + print("{:>6}/{:>6} bytes".format(length, length)) + print("Transfer finished!")

-e!a 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 UK7Zw1jl*ekMO}WXtLW$dAG(TTm;e9( literal 0 HcmV?d00001 diff --git a/lab8/create_fs/lab3_user_proc/linker.ld b/lab8/create_fs/lab3_user_proc/linker.ld new file mode 100644 index 000000000..faee5d7b1 --- /dev/null +++ b/lab8/create_fs/lab3_user_proc/linker.ld @@ -0,0 +1,5 @@ +SECTIONS +{ + . = 0x80000; + .text : { *(.text) } +} diff --git a/lab8/create_fs/lab3_user_proc/makefile b/lab8/create_fs/lab3_user_proc/makefile new file mode 100644 index 000000000..590bdf420 --- /dev/null +++ b/lab8/create_fs/lab3_user_proc/makefile @@ -0,0 +1,23 @@ +ARMGNU ?= aarch64-linux-gnu + +BUILD_DIR = build +#--------------------------------------------------------------------------------------- + +ASM_FILES = $(wildcard *.S) +OBJ_FILES += $(ASM_FILES:%.S=$(BUILD_DIR)/%_s.o) + +DEP_FILES = $(OBJ_FILES:%.o=%.d) +-include $(DEP_FILES) + +$(BUILD_DIR)/%_s.o: %.S + @mkdir -p $(@D) + $(ARMGNU)-gcc -c $< -o $@ + +user_proc.img: linker.ld $(OBJ_FILES) + $(ARMGNU)-ld -T linker.ld -o $(BUILD_DIR)/user_proc.elf $(OBJ_FILES) + $(ARMGNU)-objcopy $(BUILD_DIR)/user_proc.elf -O binary user_proc.img + +all: user_proc.img + +clean: + rm -rf $(BUILD_DIR) *.img diff --git a/lab8/create_fs/lab3_user_proc/user_proc.S b/lab8/create_fs/lab3_user_proc/user_proc.S new file mode 100644 index 000000000..2d9837651 --- /dev/null +++ b/lab8/create_fs/lab3_user_proc/user_proc.S @@ -0,0 +1,12 @@ +// Run `svc 0` 5 times; svc (el0 -> el1) system calls +.section ".text" +.global _start +_start: + mov x0, 0 +1: + add x0, x0, 1 + svc 0 + cmp x0, 5 + blt 1b +1: + b 1b diff --git a/lab8/create_fs/lab5_user_fork/initramfs_providedbyTA.cpio b/lab8/create_fs/lab5_user_fork/initramfs_providedbyTA.cpio new file mode 100644 index 0000000000000000000000000000000000000000..0676fb1584617bc4d73624b3b212a12133e97d8e GIT binary patch literal 247296 zcmeFadu-%ccHdV$vsx`?ted%d@}clzbt z5cc+6pPsV&-rgJ2LnUEv@5=)(_YY1F=i|de```868~ICxdZN&ZPX2Xgj9Q*v@ATj> zu|wtQU3c_uO!f^W{2WeiGEc7e-JgB;)mPqpv-^#&d?}O3JbW(m`3Ls<%hiAITl+6& zo@Vy5fAnvj&wQuN!oRd||HbjAkN>00ub=y?$?xue@VEZy-hcRefAQ`2zWW!C|N5W& zMcX&u|MkpYO?~&>=Q6)Ydh-44=RWu6zwyyWYcIAv|401(a`k`sJMTZg`@e?re>n5O zvrpUa`RBg#xlHEs`#(JX!E>L;Jo%o*e=ajVy#ML^y`}lQ-GA%3&wu&bnatX==Reo6 z|NQ4W+A^8k3zqL&&t=|z#o{xW$19(toafJd=iDbUfAC@^^MAkc;YT4}bU*s}%pdIk zVCI95tZpBDA@lSzmj0R5$?|k$-un+$GnsRr&iu@atKWM*)3N`B$4{UA;P?kd=NB_Z ze>{`D(Hz5V;=GHd%ifzG{sOUpH7|GC9yGMV4aJpSa9 z|LwWVulO{dB7cwZZ8YHfnU#IcXhEZ+nD#T2_kW$UyuXt?d+}=K?ce{mAFYj_d%V&X z(iO{qSKi%+-}r~&-3h~I&s$v#AHyMFy8nFsx)}citn=|t_Ve-Qc(B>Sl<~~!a|JCrE1; z8SlwEfsS22Gk)QV{O3$=NmG1>e=oel$Dc8J7fgPxWS;J2ere@#=G*V=cUoI9?7%gI zH!OT?_k$MhS(wc{eXO*%@@XdX;cPx_E}wQe^R(?;zTDM(nvHz;(CF^k@72uHZ>zj7 zQMS?eaz1>^(tg73-_1OIUunLcfA)=h_${MBo}W*`P>25{PvaN!;eTdf=5Ma-|FY5h z)g&&Y`}KSoe>)%khCTmH`~6*ehbHeP7vBMczUMQ)0*>$7yWD@*WcRVP3$A}Tk>gDM zI`dxUv(VTd9Dln1uPn@3_~#b>riFiM;m=$6#}-;XlcA3Nx03f4+Q7Fz`Q#T&jz9V* znWz6L@AR$l5B6U*o$^n{jdyD!ZJ&E$@AK(P-^^IkvisiTzKwfp@5XCKh~N9%lQwHF z`@6jVV!CI4K5jT=a_7EzZgu}pT{-!3zxS`kpN`vebcUt-H2gh#HEDbB@zHlPPahdy zAN{k;(>eItP2@iFA7}1C|J;vfJ{RIl_K>>}|IJT)E@SalUI(H5K5JzSA4vD+j~DZQ z%IAOXVE!-V^ZRsP{IO#GA9DGP-U0ew&gcITYcGb;{vRjr@UgW;<1JtubkD1%Z$^G( zb^l9Nm+ij}CLPbdY}c7{!sY3{;gg{p!)O1W*?U5d8a~gscJJ(#>4u;Gf6(8>_ZZ%p zy$35d7h}Eu-F#Vw`7^HFd!(#C{>zWn9{BHx~^V=3j8~HDTPP2OMed@^{T6sThvQkLf_QN6V zf0a*r&h-CPbo7hoo<4i=c2dvrAAYiFbYA!Q9w+&JC7%M zl6stboaFr%`MfVFZ*S(w50JO>+|!rP%bmBMwp;!-&)@qAe~Wqkz{l$HOXtRa{7IYT z`S&gT=Y9IjXF`3(^XYFJt?`MWKicmx{(20DZ$9_Af<9^c%#(j(?~#5c;IsFcCp!f> z`EFiL{y~tF{}%ap(d5wVg^>3B&pi3(miDV3ee|mz1sP1zfyqmT+20HDWPRwjtWAE) z`l`On+k3`4*UuTfapV2NZzOishu`?UKx6+$O($N-JjJ%!|54MCFIspm^Gg|{WqRiW z>;;qiKmWGrWb2DR_;KoO^i4l~mh|VaAuL2kVJl?N-MTmWkHI~E|0BkGxTbG4y8Bng zpIYB~5BkXZZL^Kw(QLJl&fkXy zNvEB}j?am}zaJVM=rd|I7I^FQ;> z?Ar8Lj`#oVA9%d-`<6b~qh{;1ed_%m+c(U>kMtSC_#>mi^Y2+4cHg-5V{Pa{UqZKa{U}qgVGn`(*!f;AhwG+qJ#tfWa-Jl`r3(eKzx7KYoCXoH0DHfv$pu_3x&8 zL;puz+Adl>2Q8oV|ImM*dRjT5-CEi<`d9jDOZ!sW`#*L*l$GyyEk5Ko{`POVdgbwM zLoUDY_-W=}|BdfH`+1X(*Z2P4{lUkS8EpF3sCS+p_~RNL{>A@S9J3VV^1n;klF7}p zp3Dc|yOH_ej|Vd!{7E+R!9Ty1`QZPU%zW^tv)1R&nk_VGWlcU8FbW~Q2T%mG|&s18!doIXt>a+cGp{>7Y;XnTOGHWmX<8yECy^w^9-0z)x z``gc3_)C`VlbN-zSpA+Eru&}@`sMAvYqZaG*?aicf8#%YX7cmb?D_e&%xAu5czn;& z?HcyK9i^eJ-!t9P_RaBM9#7ue)9+21PBHs+)86012GV%RXxuUy6OE!Vo7CgatWRlA zqcKtiRxV8nR;GXRdhbeJ@7X=F@ZZosT3nC|!=3TYr;G>5&fl`<1v#_y{{`vOWYh9K z`#+O$_J`m2N68p*GV=$YG97&`lleo_Z{G>yKpSIOy9nc9jm50L{NSojmzQ~sxqQ00 zD$~7QDV_243;wx{_x3$s_T1Xt)4!8XgI!m`^R3JuA){diAw;-+h6HH`@;UyZg=? zUwyCbJ#vtu?JJh{l`p;4{laTM^V+K^>8CBa%}qmfzwlFUd@&_m+v@9YeZ9?|wY~L| zZLfaqop)X{GI?IQU--$l-uZG$rWuQFd!_Bw*WY;ai%M*~y<$1veC21~ZF}YG2HIC% zYy0UpzWCZ(-7f@i9vY2DC1vHnEKjQKCw>+tx?gzrjW2!ml{a_eEGcQ*zW&C0ueT-X zuipORPrvfjS6};Ld-n_Py!NFx-hJ=2cS>lrwXKBceEPQ6U-{}6-+b*IpYOGwdE>n( z4{zb#*WP%qJ9%%$V7RzzXua|7&9+Nlw3#yd$15OoaC4ghJ;KQZC-4thphP^CBy@G= zHlrGZ8~fj@ufO&x1x+Ter$Bh=t@rFL{PZilg;(GD%2%vTLGqSW^8d#}9nURQXz zp54p~)`uYb3hlXGIiC4e)+D|62KK}N^nTkJvl=cZR?j z0^b)1v`-%I@8by4@ervk_i4p1u4U)sd~W3G`Fqm~+2MuG+~S?C?AFrA^3HPC_DlNR zz1Dk4KjL`KFW0%dve0>Jc50!sk20=bI{#8!zV1&8UgDRqf4#eJc47B6b>Hmio!Q#G zyHu~=M)%&t%C*I7U^qHAu--8_JS*C*j+OX?XYi>vHkB}59O=0)`h=~Dm3Zvy-|6E$ zSE^H^o*}n`mnR0rORHfezJ@NZjNae5JK885swo#4rX7l>R>4aA^sL?4UfUTNKCCX( z13kX-X#0Alw5vN^{pj*aY05qGZSbUV5t#v2ofKB0uW>qkrrw`H&aYFAnL;NJHBAS-E@UQ}#mN{q^pdo4Ju& zb1OUIvDsLO?&#pk{7n05sPph__te+}7N?NcI4us$t%9t7mA#Kh-#}*ZhX33Q3-Rl~>yZ-3zCF;;~@%Gl- z&5bdhAv59;8A;Qtq$7{o?n1}%;GOKPiMu16cla%3muGShJ4b2Pq`5ZLzAUji8E>I??7*X`Y_H<86^f5G(erT(6UHB*j z6P}?9Btz&*bkj-Lo8r4;rsrY-AIa17(i+d{uaE`$G^Hoxz8d*Lr`_IM*&4q(wmv!B zu?s%PCVe91+??OMB779eHbuwNkCf|Y)82g};#BXB>5i!qoMu;T{%1Hx|NLloXcW0o zyFreqD{ZM7c`BD?vORkl`q_oW17jZ9n#hu{qmQ9aVXQz~ByS@yDOV=+jBc)T?#gZf ztC`&_@wAU}^^D`ekv55qguRL!#%cWhjr&W%j=Ysy+Y}ZG)yI|_kINn|SEokAg9m?| zrjLXZ?T|R+#@DUfHL~T$WaOnT<A5QmZ!%;o1m}qY5XDqYjg;QdBld+5h1$rE~=wCJXZ?eSn|(#D9B?m=dR zOB^!xJ~^C>$9%unF*Df%AM{U^u<_66`&57OVsrWDx@Mdc>NwTDgKnC=b2Z?Bo>tun z<8hzI%BL;YP8t<29y@0*-0Gyivw9E*R@K_#JG*nYkt;CLxKDN_Wnc?nk5R7L+`^ry zP3Dhp&d!86r)yLFK^`m3k;)FGoJQeMu3X{NZu1$T@0-mowCCr5LcInq_tO6{ew95< z-O=Iv7>A(GXsg%`*q39QmzP!VLituV{zh+ZPmE>za*P9pHqPHBj&)DwGHH8h;~6hg z%0s?#b!t?6QUlswwlnGbE!|s8&KQrhdvrc?FS12celx?8I!rC~q1&a`!9;T}@MI&tFa{(Kw!3Tt`gF<8 z`q=o8_~%;XcTBBkkt^;i>7p1X=_cflITw{D8qEwvyIjba<3Uf~G;1@YVJ!h!;pgWX z8MBJ-o!-9tvU`$olG*>(Ul{f|@b~KlF*g2Qb1u9W+4P=I(Q8I1x{R;*$^LCO`SQA5 zI-2=2;iU0AHY4*|;6pp*UgdU_*tF}xwr0MhoL$MB7@9}jV1H*H>4@I7Piv8xQgA*k8Acl zkUr*D_st4bFU=!rEFn8I(eGDwy?%*tQW=EU_not|%Y}X+KX()E!`wuYTJ(H7Lw=Y? zq<_RNMXs3JQ~AxpB#n-E5Z|<$P+zmteO*0H=u~WIKUajVLXTl1`Fy3<7ec$Ee00CZ zh--~!cn(&`)KEun7%vc)#(%TopwAz21h4el+?Uu2VI0^I*6@@*4%t_rx%YBd^<3H5 z^!eydJyzJA{yDP5xKQgHJZly%F&*(Gp0)Pq=U#$LFi({q-zX0uc8%-;@>2dz@3@V# zlezbju+Z+3^__TqU3P#kKkYiMLo@EhhxDr2QmT&0+n}Ehbdf7BPn09x;!rf26?*zwTa#?iMh?_9-(Sf_04L@(8S8m_xm2F8ow5rF zHuI~{#OBvpnEF|8(i|{pnuWn(bUa2}qle*D^(~njmOL2p zlBfLsiZCyeqOWbPG-WP=9kFH6tKRU|hikYu6%$Ng6OUFEKC2Wu*a2#D< zy^-{T)z{hcsq1>;P)%8)>&N(MI8+k{2D6thKk`5DJJ637Y|rX!0rBX=YU)IY!trZ-F2QWuQS>MuGA<+usq%yWx8g_m^ z=}~y8S03?SE@ZsQxS6>s*1VYmrvA(sv(~BgQQ}yiiE*Lao3rP~HSXp9z`S6Zel#p& zIjUEkk6Ml}V*eQDm~>ySPY@ zvRkFzweXQv55?6|PFh-(_TwLa9MJTR^?rlHQW#%ra`&_PPn*Cf$+uIk|-@+a^_T}8)SsX2QPG#lJ zc>DPLl?#-oy?847v|%N_32k0(mHAq*@cRP&p3|dT3(vLg-u|)8g-4!dtK;Q)WeqKt z-Cfz(t*T@$ERI;9ZtFA;RkQxvzb_lrk!;j*tmB066>(U(Jxoq=BQ^iI3a74eS7}K z0Y6V*;M+NN2Yy|&H-&x#I<#HwU7@UIVI`d87liY?iesHS?OmtErQw83VqakwA!llL z*rmt|xG01sd-!FKsU5Som}d*wY{A!Iz$)*rQ@l1BFVR`*%uRC+#h)eQ8e6hl8>HVt zMyS91pfDz(e?niY>}o@Fk#O?5oBXlfgLa&zkyxn?w0r!{agWR=a-Te9EFu|#---EL zm-=euPYe6|*Sl!PtQp&x^LEa<-0kXIM0Qzkr=1hh=E)D%dMD6OnT%;fUm@whiZ-lt zgpI<=)8LwS^k}blZDZ$d;rupo4u3k2pgco%mT-2Vvzs$f_AC)UQ$nT@Q@oo5=U0j=B{}ucB#6NliorBK8cS<$& zKQv9x=JcNZz#Te^i#Gy&c%V%YN8d)f=Nj7BojmvBWYwk7Aw19r%a>7MkJ{{ou+oja<7p&y9yY%MIun=Q3!Xo-%X8{O+d+nCEA;im$wn>6l<6G#H=^HX4`Jb1 zN}Hq{%155ocl*|aiF8!(kCC6#k*^Tad;Xhso#13=4O0A!$|k1HmFlZ!;HdHl(f^g? zO*r8PYHj!8J!~UniGGd!u#};33mD3#Z5B43PN81rH>E^JnVyn=0JRh0Q7%MpQC{Eb z{OZW$eDDcIJ1duda{gAZ0mibu^WYS>E%7G%L}Mi4eI1&0Eq-hdvhy{1C5-p*Q(LZ{ zaXgp^r(2g2-+r zCy@qQo%V}f6Fz!Bw7b=%%@xh5l$-Noe4sqdlA)N6=!f%|`MvD2H+ipqoJQZpc!eJ_ z(GpQ(JqxK^Iw#=&Gr1K zAy{Jca=jZzSo!im`_uv$FP!9LYzf`A_WN9EP382yK+QYi`Bk;;*I8TS=yZ-!JDsx`3hK zKp%umff1Nde?ND|SciFtnFrYcje7{?hd!}4nA=UxuS1LSHBRx^=$d&$(qKbjQx(fP z8M*R!Fh?!9D#V+t=^C41sq4ml&C7rb&zOe+Cw`ifQJxO-qas|m4mMlf_NP4xmpDWo zRYqFqWxN^J;-R2ttbJgsC-L*EiJ#UU^P7^$fYKu`YE$%O!bvuCIByvAp80As|0Cop z=)wHB+mBOXoVaIxUG#j|3|wLwqK^%O|5V+FFz79J7I=1Y37OEmp3-7x3#a~p%i-H2 zot8HEG0I~^T5p4(uZW9n0>;N0BYRsS=DXSVs;lM@!K=_ep?mYTRcV;_<&?(&T?JPB z=*K9t#J-@Ms87}NxX+vFT6}~*x;xi4SHX}zS3EWw8&3}&;Klbn8o!tI*Hf@dlkZNb z9&t#yqgQ*nrSnR#&g&?~aK6pW-s!@};RaZN+0Eg#lD6l0Z^pH+6TH#~OQtklD78Ud z`;&~BUk2$d^qaQ}urs%Id#9LVrmiIzkw1?U_O{0%lB-%!so<3RA@+Vk5Cd_=?3 z_1Bu`ATDh_??8R?IvLpk8($V{me6BvAkHWMlB7p|g_R$t__F-9>d=hP)AiTLl*Z|$ zK1NgI3Ar$RO@45)U+4$0({+tJQJ*4C*8klOG5wlv*0=5v#4i61dxgB>7zNpl#_ zC-Gc3VG}V=&3)WQ9l*%x8TvWtC+1f|{`|NHds=n?@yzS3^-Xl~6Wz4%BygyPrg)Xj z>Fu3Vj0`7@*RUCtk2wLART7$gFn6)zCGR^6%t%uWf31|p*Q=bLFpru1EfjTl@~sne z5d9_nA=i_a2QRMmF$eQz^IdzBw2`!WR}%*|>`S98)t|B%D~p~Fm4?vAbM2p<^fml2 z@20f__`$y%`xH~>Nt_Hbn*KkuMqUe|1O&Cv)KrPsYe#kWEz zp7=%>^@{7tJ-P)Q9QK|V9^A+2R2SmeOX$Bj294snJ9F`-1H<0FWGo{d;!tI_O6d7x zT*4S`dZDL}wnF~|eys1IhnW{h<_3D#kU_4ACrvUAPUZ>n2P7GRj$P&bv5maCjH+2TKR5fdXEu% zlAD2##}|5j&Agd)ua=fDqF+MSdj5}djc!MmRa*w@dU4-aZ5qT zCw5jtxC7RXF8-ePPhQTr`uO;I=4LMV-lAMR!w$v9m|E!UlMRMm z3cRqF&c3D2HF=ds`~5>2dnW#y6^br$F1fE(wq#RRYE!fwXwc_lhhwLTCZS}8GJHJv z%kL9dfoq(%*%%f1!?%O^gyQUg>0tOHq^`Qx`z6$#E-!z`2X-TN7i~`17ilEl162Qy z4697ike)I;_Q<-=uj@wRBs$o@$iCjWt>Z80?2`ID`KiF3;+;}2+6|#_q73w{x2Z(~ znY%r=vWc&(^+$Iv%3lj{q>=v=u#%rZt-`zbqs^qr#ZlsrvB~-DMQCL^ z<_c$BX@kV^-q3OO4dHMu2)jV^E4YL(WdX_o6<>}OZKdd zW&0NNj+v(Iat({9mAU{+2~dki_#IXb((Ff=eRh;AdV^ba zQ{%m6;3FEsW_sa9|NW(*L4IJwZ)mt@gXf$D<6O7w7wJ~|G3EDRn*Tcb{=@K-KRa+* zUh2CqoP62X8Ip6=p;;k(nBS8}qPMlXwgIo~hveD7(BQ)D#lBtX3*mHkr1Q@9^2K3v z4DE>fSf0@JYRjrGc2XK<9;e*3#Z7dP@+hS375q#XZ{oQbAw1CUjy>!fyfHk~o}3>j zo>9UN+U%pQ2j~gL4bm6rCf}CQu615|U~+4f-?h9BMu*4gJx-A^sfBAW7|_3-sQ^!H&>9Y-u|7?$FQy>TbO#qb&c<}SNG1PnWeq0)t;&Ko8b&~ z8cygac!3`Bt2qI5f@GOc^9Uz}6WAb2MSna(uo&vy5`*47%#H*P_2Xb9d7`}vQ~5hY zuT$=D``|-ln7MfF!Nud`=lb-nn-LaJ$otHc4;aN`V@kg0YyA5}_h@{kddDGp-H+>$ zL-0j+(N78w(L;vis}ozzW2EboT3-;4$(cI*?U?V(@XMb?luss`1Cfnf$YXW^cp+cZ z8yx(P_C!2B?dc;)>&K2<)3)eKR3;(zws48Vlh#okQxn$qO3&vedfnQiJ%fMjV%3Mb z#PXnLhlTVVl*L(>Vwv-+*dgSljmP-tp0?N5zf-W`o6+t>L-h(+AxrKoSfaNk!#sib zLk>2_Hpj?MUAe~o^7D+ynEE`w=&wP}g6LL;2=8L+^X7*{pM}EbKr;bI8h_SO{ z`S+u~1Z-vB3Lor+U>Dn%Cd_G??dj>n{50y`(>!>6@a!AD)W8M%554iAr_X%T?(Knr z{H#%qFe2o>sH4JnYy$or(>vzNk8|w!txMW@EK}f3e%d=@npm$j3YWNCVZ;0hdV}!; z^OODzA!{JPUeC7=~V`!KFcBkx5w zevj}-9M4OAWSQRQj6VLu!dNFcW2kZn(b=;d*#WSk%@m(8&i3cSwzg^8K{w|6SmrT3 zPH}&$vKom=TG^tD9`O8et$rzKALY*CV^`qM@WL&P5h;`P6563}i^PNB=+(|^u}=}O zl0K(@W4=Ojg<1n7e_9=y5eIE_N8ru)limR**)6i&!+VeV#nL$XuHuOxXs=Gqjo8EY)R2E*p(aTz-*q=@or3ycT_~9kfGz z9ZRmwCZaTCNjNcfVNRZS=G{tgGX0Ib+LN%xf{g@iwfR!clDoJbCvmSjvc{{qX+H;3 zf=Mh(+nhH;{{?*bJuSv+ax+>`H_*ot&Uq%t9q#Wkp*ZbB7<#+8g`|ktOP*)qP)P~dQ zec!$k|H;Lsp`tE4yHZd=V!8XcDxl<*!xJ9a)|t8L9?X&B;TvRq9_YAIaOze;45h zb*~1WLYlk}<;IJSRl zt*crL4ok;-U_X&)Rx9(Zk`BJv^T+&@_fIGO@KeXw9_;42HYdPOYx2~c{Y}I(?)5m! zM;rSacn6e6`KK8t@lMEhl9+d4+|S+v#`S6V3CC(f=A|f8w5rY5O6kPA#xc70A#>#H zH)H*XH7otGcD4HG?ltC+nF9b@LiQ6dH_W;KbDzE}u3M@8)$*b`u$M>sbQM?6khvG_ z0;kFAtW zylWjUjW?x9#&l`^rJ37J=HrxKc?j8)_;JBW^-?|KP|uU~rsDWlc0rm%w)6kH1&iWbcBl!MktiCF=}{OetNZ(3jil*X8O_iEp1Lv_qShD#%pfTXDrylvTVd zUR9#eiqDFi7q1TEvzRh}Wpi0!ADYcU_-87|$LU(nPD?1h71qMH@{|izR{UJ?-_M~i z`F_UWtnOzBoFQ%&d!m6C=7dkC|$D|gtl#GW_y zZY*S%?{F4vK6hi<_MhD58EGu-fjtB&v-N6QJ4dRELiR6#0cXzm)+l?Gs`-)DzOg&N zx0`M2c(;A8<$}s2tevyg$l>e2HQ(I4_o(zNQ#JUMO9O7x4{n5S$9r0>QTyt+@O<0+ z^$v32eS?&%`%&VNOTO(an$>Z5@~Olx^0PE@t7I?tQE;d>PuiYd@pAI06gd!2gzRg( z-#vb_+B()F9qlmfoQ(J?a(Z%C;)QT>Yquu-Tn~&?20o?aiw0i6O=tAEKRJX-=Md@7 z#dAGFbP)BoJ*tlmE0_LI?~OBg{=OA(qOU)!4r$NPVTbjD*iqCS+bXRLA16Nm!iv5B z;HCSMz)G}PYqIs)%gFsyv`tyuXw)P&QcjxJSQzS zJ=gp-8!OR`L-3+Laed?ap|hrN{0@ z@De@tc_Y`zgyIORl_~9wS9s55<^YhF#m=6w zjnU1^JG*nYJudO}_U_f2&;w6&6Etb7yhDD9Lx*|(8jTUg?6VtZGCj^ z0(u#lkX+%5rGg zZ$(#PKMAw(&dp8V?$pUe_iB5zH_;T&3RRazhN6Y+ z>zel^c_$7X9{e5N8ZWF5pvQQ2CpS3-9>|s24%m4ciGC29L**0lZDwInE~M@09Ux1L z>3kWwZX`Y`8(OqE>ZQ7PUtK&$Hz7~FPxXiBd7f2MU(%3v^!`jou7AmVg;mZ6uHd6K zOdp3`Cz|BfpX$-*5PIyX<(-!Ehly@Nrbw?umB50;Y$#iQ$0FUE3Q$3AcA2e82= zhZ7&aN>4bQ>%5Om;O7U3Z!|V4U%c?{sFQ49;x*61JMFnNFs!t~iT;N;`fu8-*G0m| zhv1^V0=+Mvo6yD|o60W@hjZDRUDxIxjc=*nkljl<)uYj&ctW30C+Py>{TV^-H3vW_ zTSm46&uJU@D?~@rzoV=4qumi-9*@LF4Yr2*jljcH`_@>t*L;Lb23?5Gq}}t3zeeMu z@I>l$)BFm;TMf-#w_rQoy`4ucVGYR_|)dM0lKkscZ7RvRn>=f zhRmuQ+Ai2+uS|sV9@L+F!W#b>9d_p0Mt4D%F-NEV1G*YpQeLAmqI~g9{~}#7do$a| zyiWJv!!3L{(Ef@(>X5MnE9@ER4CXhm1LLz~)Ezm1j>aaOgQA|C7n5Dhz1pz%1Jp4+ z7W|G%j=+c?eTd#?Gq6g-N$=-&ZY|v(kNK|9dydEKv`^~1a%ZX?Uq#3m*P=s+41$rz zNzds!!u)sekC410p7B0}5g|5$#tF(xDBkNGiiX-9GDY2>lN&AdF{EH3c&?}*xhVumn&#cf!h0}rhayG%vZxqhHSb0!jd?0yB=2i}V z*Hd+BM5tOaJ}=_L99#0QY}+%;I7dhR1Ru_+96Se=$OQiV=o4mw{L$|tV_uffVa(g4 zl>rTOk#Hhx_8O;f!p`wHsqJm|_CDyjx_I#HeZgiJUQY7^k|u}p4JMjCM2A5On=;O; zbd15VH&>SC?3-o9b#%ScMuy^nvAxGBxlSlEmlE?Xdx0~V@w0OG@_UG`kJ}qM3u<6c zn*U1p_6K>EyL<0577srgYpUO+4voY}WeY2B8zeX-dWv*QkMiz9P`bGe1s?-+R-`A>YNkNb;Q zA@?^nX6-v0iTxD({l>bz!oBnvdvZ*kg05mdN@DTVVCvB-O*77psWlc7t-@AkiGiIVp>@N5Ta*N(~e*CcQwI(HA#d|YD(I%wt zVeO5%5as}=3u6v%Q>OJx9+R|d&LUEN+8QqL_-Lgcl)Q>3#y*UbWY;$nmvXek+hJkB zzNyg8Vyp@{nO#8nvb)o1rQ58eEyw#w#HaIKj6IS(<@e)AE)si^Hj5v>#KvMw$xm~h zMT)J3&tdOGd?#b%>hzN2D#(w?1AmDxgM)S{{n&E<*gSsM`fkhzU4Ix)t@!*nILYUB zu(?c63qOUEmj|!Nhacg@jbhttMJy`uB%G?X!G%FJq2x$d<<pzuvYQ<+ooDRxE zHCR+iLtDOeIoFF^=_h)vh(#ry#5e07vd=5k{dmuU-<2@OSBa-qd?uVU2gg_fKViqi zqkMm$aU^tG5sz{_2`AR$P9o-wP+k{C+NCkN6q){&}s}zPwuVwtD)H zbKP1U`!oK|5I95N41qHQnuCDv>#DhK4p%2jr5YS+O>?p}sxS4p?##~(&P)vQ{RsA9 z@(l^*IGLy8$2I$@_2c=>&Drejts9rq=Ar7#?a7oTjKGF-df}TI%Oi*S%kcXw<7@kl z`2tvKU%6)oXhNzZkw=jku;Ainb3MRo|nO>-n-h+mD)wkH=iT5XWLq6dRY@a_K_zXa4!t$bBRSx)o!`3SKX^EC*iDp5`Mr$=cKjn2LIx@Qb;{0 z3wcaShdh80&qXs1)xYtcBvaB$@IhN;Ea~%AThHUBgC=7U@um02Sr%Kt4t^fIAFVVD zh@*{C7JGfTCl9#OXK}7UxfLUc5x2e z$Oj+dNwVt8RbN@`` zfF0kVTeJA~(Yzon>w!TMACptdFuL3y8hl-vJ zUg?>-W3K*%q55WIg)>#WfA7yImXAvJ;7L0}Z;Rfe-J#Ky?bVt zkBULH`8+MInQsIOjn%bxr*Ck!*W;xAN`6Nw;ZW%rI;zv?#((H`ug~E}y3ePrwx0D$ zC))A_CwbAFS&WlxWcjhFghi!i$W3;3qA;_J&bIG~Ga)nnKZl#d<8PqgZZK{aKG zE}`sjbSm#pdT6+P@S*STD&aJ?d3kwz`Qk9xAXn&U^?>w$=d{6!TxYhjH z^`f6?lh_4dBON3<=t|}bq#tcRbr)E5nm;zBsW%4IlqcH4NxGbPZ`U!dBaQSaeh=v9 z_@TRLd*~zCo}BH+2IU^Tgq$Qk>vET4yIMRDdK;X%7ypdwYUFq&f|AF@Zk$Xpw8Mjs$~EMQ>im}>!Z+4$27HwHK(Bwr%ho3H)&;Ntm_T?fr- z>ePrd&}RNgd?8Ef>%v}e^EJ?OWn-(|-Z^P$3wjPNF;CJf=pxdCjeKMYLomD1KNHGB zjtcwojh5!T;x!-HDJOvyH2H&Xa6-mu6U22+FKv|gz`)N}-fx5QQP=xReFOMB6ka>M zQ`>$H#N)(RR(T17zpco>hI}DOAL{*Kt9Tg|y=H{snRf+W$^CH7`yVX6Ydh0BJGrDh zafqG)6^(-U~DmziX7IF{iLX*7Y7$PP1@=Zt?va zzvjoX1RM9hr9beemiW8Gf28?V3vyOGqoFz|JctwT0^d-H{|nN2e?anw#9k?3#QFqw zo!Y$0ZZuA!BVEe(T9B7=7=erOq+@wyH}RQbWmwt-(*!$Y3|W$X(zjs(KEXd( z=DUpa=yQz$xNjsbaoL_&%8x-*24P$dI%&3l=h1rK`hZWT>sG>|953S4eDEExseJpYc#Un2 zfBf*9?1|GZUrK!V;d@Q=6qe(w)#Al(@WWSaTdOhM+NJZO@=vF=hE~JjFn)?SIo}O6 z;tA84LANQ7y<>LAu<^Ht#5))44$H#TX%FRi%lDt&n zrGSym^O6pmnf3G8?ahgS;mtDh3dhBbdEex(5^t^cOgyv3!uZ1T2X3s>f?GZ1jlLDS zo>r@03nxNsYWCcvVMaZ`k@1elk9h!m`sp{{wKvI+c<^Pu1gw!${j|UQG-D;)7_Tw5 z05iXaQ0cwz^!DBNzqGVGXTAbD&`3+us&T?bq2GU^IK~=`W%;r1h52^Y;J9bJpEh1( z92e$;^Ly-z;~JHETH9W-mz=fl(tQI(AJ4@a9_@;6<+1-oYk!o|it^)YC;k+dtRvVu ziOsXIhevx+!rD@P&HE_zQu&0)DtlnGkM$_!iSI^+o@enG;%t16-KcpxFw%Tg5?5T4 zIx2sn&HfeSRrg0NuaWu0TO2Yknb_CZH%U9w_auGV1Uh4aF%uE{%HS7e78s z{L$zAVmiNkK25#p)4qNAx~>vB9+if;tZF}+66IBJS-n^2;d)VXk;Ko3_U%6U5 z4okP#)fs$hh+gw*csxqtmykW-^^%`Tc$GV^1rNuoO=EIE2y4U&)xoY)! z6;KyOe4B?e0JYY$9_jCn_HzC#oNZ)n0{;r)t1*&MTdCrOJ?`{N^{8`P27O{R{UYsL z`wyp0FN(L?YE=K!;^T(-5^0pK=3Fi1^W!?kFus?*0wHvC*~t*LbN?y z$&mbS@l5HOjS=H7WJo+EYfs6VW-WS3IDvyONeh(@9VPit-4)W`kyqzzNvHc}ej`u( zpc~cqz#H*=J6h)^YH5GcC6pQCLmR^`V$VUmmwa?~eSx#;oYm*N0z5Eo6kj^4%ovg~ zc(3B0u#s{lI(l!^3%%tIZQ3O?B!A-BhmFLDvY~}-Lfw3QdGE#Zokd=iM*S6gRAgU~hc=7uh;^Lm z#NL60g^gi+`oz9@Vx08NM%tHTO1@cDUZe35M$nUPgcsyl{SWdjeun1D)@pn?=zlL5Y0wlrm_i{JENbG z-wWOun4w>lu7BuCiGMoy)iZ_23j2M~E%?Ex)dv(9A!A@mnfTTKU#^i`$vh#pgXk)3 z1WsO_M28T&4|&4IOev-gAzK$`(G@x&gC**jei)b0q$2TrQ%aYDZ* zjB<64eA55Xw!=F#yBvM!^`Gj|j8Irf4|7lZL$1R)e>uTF8IAFZK152M%C@&ca^j-uLyS zL4RR;OLllq{5(It4$Zh0?Rfk|Jbkgodb0JvNjjeT&kS#LP+#;2{S~qT2FM0DqPM_8 zbjpXek2vpBLbOCX&eIHBVjAKBd1C#EHU*#9PuL35Q+}=lT`#?({I!Pk1t&!y;jnB%+FcM1Il&WgugN2ai= zRd>c}UiTE_WooHUzRU2#Mtbl=o*5^=lh+5$!p74PPMRyAzLFu@LE>W|;hlMH%}0@5 z=~fIUmC5-j$q4OHI5EGCzbxzxU*~|Ko#XW9WaV!Jdq8|aSGTA6Y z_4FEjEnewcROj}oiSBgYMaDaABCl(eS0U%eXm`AKWNOpAt*Rd*6h?$`@yqi=pxk#neaH7ALw~#BQx^N8F&fpeD!{TcHZ|C?NqvxK1Ag<8z<;NoAZ?5 zw{dG|sb_QTQh{IjEYNvyWKMA*#5bM!BLYKki)4=XfV{C*Nt=^i3)mnPmOk;{68Uq> z`yD~wF;9TqM%z=HhSz5NEAVN&^1hiP&^cD-dSfiq4yy7=V|COyG*2hKp0jzu)OP~@ z75q?APBSoqM$9w!^xN1?Jiq;LEi0_RCZur&0N`gi&~*$B)hK}Yi?4|@8h?OcB0ofO;a z@N)L%T;J%;?J&;(uj0GeA++INb4H9?i7Vg~bm@FpBTBayD*3?R{O533vs9nTTnXc4 z=wP!$3!Lc3!neQjwg5aaS8*%1wu!$(>Bf`73cCDhy-j0#?D7Xao12Wgc#d3DBR@V3 z{U3Rm8isiPqPc1=4(8R zi|{ENY_Ft0WekN)sWFuJYt>NrgfQ3wrLuB3Rz=@CDyw*Iy|k>JD-SpCOwZ)5<>xV( zmyrCmDn8;%bwht@&f{=wO6#B4=j#u_C(JJ)Ly_Gua(Q>ieE1FGdu`-K;&a2>58|g) zL*YbSc}X!PAD5Fk=j+ITzXh_NN~s9|@C4 zpHl|?o@lmeTZ1q081}J-`MB_{hcISgEXMkX$BS_?cvYI$s})1pT&;qWFi}{7la28U z^~=vGDjnl~=8TvF_n7VUj&Jir)|e-`b7%A3bXVUf^8mHrs5J!WwE|YEx56S$_T3F{ z=eW5t_Ae{FLUb7G2*?`PX`U~xWAO23@`sMYmmhK{|9)J9De?5LDmyOYB<{sa947W) zWG{v}aNGN9YrCv@$9dv=#vb&QVQ;L>kuo2EtW{gjR$`PWVLv#R+K(zAA1jXfBb zUCTZ5QtT;Ho|D7~+TtS#(M!>Khv}(c`?>WK_ELhC@*bxSDkBb=e`XJq+F#7;acI_( zH|DEw4<5{ggr8lT{G|QyuKhj%rKyF7a%oi-G_)^MaXu`Uzh3d4RxQ_}uRQTt9^#ee zxS?pIy$d}%E{$sPiEAtG2GX%~MI78qJf$uj2;y(K*_a9fxDq+E#6MONQ7txRV_?&;aGEOsQ zz?wvj25&TQKx#BDUA9D2EsX@ zddkjWn9`0#--q?C<8jLqZ>*u9PY$bBBc9v*dEs2E_)&P=`qe8x{GcZq)yCGl?~dKQ zmiQ|whcUW7;9}oG5k6{<+}EqFM=eJ@>5O2xdK@Qy{OWG-qos4m<;tQj4L+#y-xOwD z)z)VU>tRQ&V?FW-r^D)yRySmzxBvW0^o4296(?U{=2N2NoWGtcMCQbg&X%DEPI`}> zcp@A&7jf+Mtwn#UUf2z)Yg$OT(BQm-e~xY7=@ooT*xqQbCr@(ErpL%%U!U%{P_1lH zN8UAhL}%qZ4!TbE58E1`$rE|_K?AzTn$oF_%|9G0@dK-P($}L6)lvpDS=Z3nZr07^ za}B*9-VY0vA6XzRJ`lLRcZbb#J@>(Ze$>AUuC@M)P7)2B(}>>_{3w4dbv$lb(VV*3 z*{AOq+S;#uPrGM|XLf8boXr*gX(93h7PMFLAcrcqT!`!q&fFXrzPz55KRWDLwLR=} z^3qN{P4u72JZ{}<$uFAdVcJ5tx3$iW>6viW0{p}$wgUI`?ZmNnnfn80>8yUNcqitIqj1(m{MS+ zdgj}mWS%ymHl}pc^X^E`9dOv*y?Qgo;jsI)(azxS7!1Gyxf1@oAMm5?qSL`JUjMAM z?zN;>9pgS4*-{%CdpI;G4B=II2x&LS$x(3exN-i7a#XftN;X8APE%TiwbZ+sv?^C2 z=j?sI3nskF#QvRM&W(-~WKDfF_B!XnbiT^hxt43%A2JBu;)jsA7I>f^kbhhM++SBy z=cAKl=v#m>$#%0>6kA0of#qIfRv zD0Mz=9&qygvD#M0)I`^Kr@3d2{2a=57#f%uR9{Aa#&2#Rd;Pe&3LL=;zObugNBMVq z+&Uj6zv$DKATR3E`Zhc7a)xqsX|3R2l;;|EC|?}XZ+V%a|3hxr%QSLjW}a`}%0Hh^ z=dWqg(pk)biN;atSFb$c0UgB{L3-29<4%Cn#`4Ir+9RRt8on_~eZfV)wED;WH}sI- zG#koerSIZmf2eKNtIkI)M_4KBxzsT*mhD{_+PbkBkN?rDqyr~kuX5Meo1|a5GO@7J zo^2nPYG3F6;nHS*xje*!d7xu+cE0T$wT|`32S5Dj-FHrIg}M;OT#1(_^gT8MdbXNA z4}X!A!}&w?WwgI?HU;tcLeiSTT<7eT`n!76^*CiDD3$)7cBnZ-jk$!E&NribD#--T zs5g2UT%mAlZfrf)_25leq@(W@CxcffXVH_oKTaL%kym_R2cyTe?xb;i-1am^rH`Y1 z(1s3^EwG`_2M_ca_9guzvLy_~heGoqSeHG;^}vWS;EOirZ75_%;}qoH%T!_h+Vc57 z{D;z?Av65I0Q*5Y%BL-VUHtyHPgAeD9;Y1m@nd1NFL0AgVP9&V0L-K_n0I09tUk%t zExx9oW1Ne>Bc7py9`;PlgDLm;z({;RCF`kv-Q_s-t4Chdg?U2Z<3q_*sE6s8*fwSi zCO#hR^{y>%FNbkIZ3%shpI_`J^52?U+0oey>1n06{pua;@i$)*;oAt%^>Qm3Clv}O z*_j?A#(B~mde2Hvhdh_l)Mt+Wmvn@K`Lfhb+kombN_)A5%(LOm_1`d1?3E5HEnn&_D9hhsg zwK_Xn)5CeT_NnB|Idi@zIUg>J2&oJ8@H!k@Qgussw=-t>d0_DI=NFTC^mN@ToD_nk z;G{EWoE@5- zwDV}@3&ilGp2@s%;^RkjXluwBczM0g`T_Q2vE1O}C&(-MPyCz|R^s1>(%Z}zl$@Qa zh*RmA#$tWJFS~&5@igLV+9~pZpC{$jdJl8(=md=w$lFX=f>z8g_nPlTpNi)Yn!ND* zD1Ne%ek@s+P`^M~%n4vy5l3HXz2UNG%1;*SILNr(pXa$*czK$o*TbfRE8oIT% zd(qZ~);4n6j)IQL)Orv2pr_RDc|Mzklc(e9)8=kJ z+|2TvJ|DZ1wh?fe$(o&0uAP;SFW_XhCFL+CX1t?wq2RDG8=RmXC*BybEjHo=e}8397f0U zeSfTPKy$#pZ>rVTp=3|`ruh94Y>CqT(9>rPgSkSDn_3Aca1^if;mmJx&)8n`NJrLB z)8<{y$|_(k`vRLa_^>Pby=9*8<$;BgwZg;R@ku-vRtg!PF(<R6RdGPY;#fek9k6d*s zgtQfFC%*nwUk86hMSWBWr)uA2tECG#Sszq2CS~Of|Avfh@O4<~CxJO$y^mI_f3^I; ze=?3KZyy~WLv&cj1!z^vS1YB{J4V0M1B*&!NQbpj{j24rfYTA}@JhJE&tzkrHklGe zgxJd2_PryGSziPHZsV#xM6sOJ~4Sa)yn%xr}MJJHS>6W9-Q$XzQ4ds zzwV*Ai{)gcnt0afHScoL^{bW+JaZDv-H=}8Xg#M|K2JJb0Vn3`tUZ)`JH+Hmf6RR_mkV~_mc}<2fFD2M;nNYf zv2%CCuNhFjPt&T`1st3|KVijsx%c&@w1li-GJX#7W_4%YfjxxGOA?2kV=aNTQPvW) zE~PSx^9ikmllUXlJ5yXd=9OQ2*5lYOpmg;N!GB`w{3Deqo=!RxKMLVT*YwjR`ZqsE zjt*fTipKtN9hARP80YbH+0UpwK$M}hDo^*#3`P5382Qj-%%A_h2x-~x#y$(K>&dV9 z&^yq*59>*<*0MYwTqoms#;S~6S(EFzX!DPu-{U!JB|2-teXaD$rH}bYyDyiwS@CH+ zRf?0X6Q?;Yzj1l~{N(nL80Q$!ZQTU5I95N41qHQzF!bfALzsHm%5j$r^lk&>vCm%oZ>5C z!Mq*&DQzptHTHWhbmkWAEXb72!Clv0=s5rP12%kf^Y;7=`Kh~Z`-XFVe|3D#UgG(O z*;&2?_;JB2u7~bzPtpeGI@uo;<50`}z0vWGTSE^E{w-AgX^}7StFY7dnSxF5vtZvE ztp$r}(t`Kc=0af(6S}RAm9XLL9eRa#&K~Y+>U-QY{_JrpbN|o$t(9;hec?RIlY&gx?mrKJG_WJu?V z)pw$|`Ed^qIs;gcCyV3H&L@|idGF~foG0aZGumLnN%H^0+D#e;iZh?k;Vdh4FiWT6lmfwg~B_7K(nlM2nELzMMv4<>_z@Z`d*D5#-zR#eF%u5_$4xztYOh z&JIjYZr!@L(6Kz2vv0%Q9qGKokF&AE>pP?5kvu_H{<^T;Js-N>G?|KR`bJ>|Z_wg9 zYlXVy_edfWF;B<^{3+hfd|pzUQGU+(Ob&PKvgcf9_RINnkne-_JBzk9XnXK&3?v)Tfsf{x;y>0L14VZaZBO>=g8iTzV+`4d*Jc+N_h0bpD%2DtUhVgek!HBaV=rQOBD|8n3$Sk_5nf8wP=$ z{=iJ*hU~&(AKz>RE8Z)4&=u&NdSozd+eQ}olcIr>BVs31$!jrWhP=6+>y+0OW0oU6yrW5wJS z^yB%LX5s`M$P|3Aw+$Q^BM?6@_^^NWQCDG{Cm%f_fv}3uUW+ldT|n&BTg6MfwMWL7&SHze*DIIgWo#(8}f`_9a~SU zQ(7GQo;;Hm+qZM~lkYQEixW1Lon;I8#j6ihk7k6TEBguEgx>bLTx}11s7CO9K zU41<5PO?dP*g~-m!;V6B7|%!_i67|mo}?RzPpd~W;=~hS7?&6(j7NO@@@Q`lI7xS5 z>(D28Ov+s&d-R9s8gQeJ#5M&NY$%O)MGre)z9y`f$qio3hM%4{1CulwqK|IUm`?K~ zdIs;ZALyrvr%jc^1{smffb5}@(Dy3uun;|f4v;Obc_{Lw)u9=2;@OYYSvOF;bc1X@ zY)-W$`Z9ieV_QExQ~qkh#E1U+!|;s_!-Fv~eQY!B?@D;99v&z4f7q7DnA!nzC*VZ8 zESY1ldig(%*N6i@bTdEhX=h;0da=qaJp*aq2{#{8Do=Jrr8+d@nfTEh8G4904c537 z=f|GN3%0221o}XH$n5lvZ!3gv(n$Bve_?ATxUG!J2bAo_z3Qbt zewu+rB^tu1+`PD(tIqlNtbAYrp0rhP;wO6864}{_Fjl)hbwAhz$f0o3yovdoS>;EW z=7;5aXZ{?v`5NgI9hG@fq4=Oq$ddmNr#2+ND%3-HDuuKcFp|*_~=@CsziSj{I8uK4|TG(lIURbS7-BA$(ix;e%Kfr6>y5? z+>js1l0wNDe2V90hkC~vuLvK78q?uJM|=lAd&aY!;aKN9N6(dwg3qR68qV*dZzh+K z!;YED=I`-*unUkg`h9+WpAYW}d$xaTtpqFbiqB@_BYL8b++Z_tc8!;0q7r_?h8KpOt&&8 zr98~9F;}8{rSWwvxyJVu?b0MMoD=e4g~R_@<3XkE>0MJ?tCAj`aOhg3-bL zT-f+f?GBtYZVY`XwnkoeF(%55E^e}pfj&gG#S`I4<0JZ>r{Z<-4D9^&-WXUF$7art zZHi7R!6`p(11ITn*&MW6=z-J9(p=%(Xpx8HN_@6T81olw&ET8X&cIHsXL(Mj@tDV> z+;!qJqO@e$mXbAWHrjk?s^qR!uu0=1jbGww#R%+*KBl*}k)K4TnLTPYfacGUQ$Oxb z!EgjF&7iuLge)_qrZn zlOHMVy;efMeDSL;v3z;dX)I4Ueu2<-|dHMHyPtIZ;KwI{@l|} z!C~P}-!$0j$6NsISY;_B?%LE+*c$^~#h-?-h*NUKK0wx?j>|hZGcUK^JuTVM4wk4vXn`NeahV~cAk%%?L~1#X-dJM70?jeRpH>;aAEW<-Nfd(kxaqI&u? zTr0j+Lh*;Ksq1)*q4;`)>}6q(hvt;amDwuzh!61@)|vAD`>BKW4Cr~ap~_7QRR&nG zcgWBE>Y2i{{LPMo7ts`7VXZFM%zQH>`EHw@DeZAXl}8xXbnHxwkJI&W>C_{?cqs|P z_vy?Au=QWr%vw_?T|MafGD>J$`TFx|TH#uJDP%4(Z9Y=Z%#~7*Z{<*I8?E5V&htc;N4rlc}L*NX7GXy@) z2&k{CCj2<#kXE;9FsUX@TG^*PF0J0(ef{fvw`At#tZl`)G0pw}ev2cW_xb6XXY6qt zp6xEo&-n6AJ2vp|>%%qk9n%l8!}qR@w{Px_ENJg*wIO>z*~6o~_A39hVkQ0wksIbN z!KPX~4oe5d$eW+vJWW`6e7I&`Qrek?!*HnfIe6WkA1pbe-RgLGjBNgUjP_A&eUFYK^hpPrV6ILZ<)gto7E+55dA?j*4iZ|oB9mk&(PU4GiYL(-^T)fu0**{+{4e|2(W9J+SK5o*|)Bgp2raFRNpB!H8Ryy*E z*OS0Xw2>v+#r>VThx&OG?}X~tE44l0iGAVovbOB?VBGG!-#_*^X#EqOn}wC|i9^11 z=XEZ13Eyuk(;v9WcvtpLJRMy(5+lln4)0j+QT>tV6H0#6 zr}<}mUy3?%&I~N5x5uNLABZ^K{DxehT;#;-McJIltCwlgHX0k1ulk}N;6Xp$owrql z6VLU2@%I5P_`QhheAIjStN|PGBKtsnuw=SfI0+*{`YGx!nL-zM9qDn>*dDn#Djq)H z_VUGH%EJE&Klnlah!^?};-sU{-{M{GyHTO&_>eIQJnotdt&$GD(3#TXqA7lT9hz}1x(cz8CGX%x z{K&#w|I)R+HR&kkdWomK#klx;+K}3?$_F=}CheMbiTy<$`Vi&yVKcDtG(2rE5*CEq z^L%t+Z_?wWcYIhoTkPx!_VQF;`_5?pOxWif`&>)Ii8$GvvY$Mkp8sZEiwD}7$4TSz zv0UH6?C8~pdWOD0POvd6*-z#tGK}j7`r6m|LFX`eLY9<|@(c3@mbaOhq|p*ibGe>r zVL>Q;g*;7Uw+pr(&lvZSkG54#CaAOIg0z!c*^6mukuk8DTgblLcYnRm&KN_f&n15v z@6C)8PTpn#3w`tU+En5bmG&ka!IXT5=_s%QOK{lQ8R-evrl%S6fnmA5)z>d~FQFI3 zTPxv&Z6q9I2YWt|FWJe`QS^1_A?zpX*JijzZs^;w8_UlP6ib$_=e?+p<=uc)F;(lx z6E>7^lK)4~C)fC=!-fz}@$+i$=>s10^i6M@6F26Ul#jU*#s<2_Ht=K3X124KmU!}W zatThH<|B{dwPv%0o!Mn9FS}aX!V)WDF2TdqVHfF1g1}#GX(;&lnCqbRYH-=Y1kD zS4khjSduvkwQ4?9*vdJ zKjWI|5$(G~cKCA#>m)`2i>CrS_S@g8wkC$rI1@$VTB=GiAurf;KurcBSTe zz)CW2ejTov-?_q?Ho6+W;u_xz55l-VCrJ5JJoVL;ge}MUO!tK*z zVNHs80?9RFsgu;_;?sv7C$%3tC$)r3F<(GGMf>q-Z?&}TGppG!$Bqn6O@y(U zr=e@wBIQkWb&V>&d>Ck69vz8ZlWnWK&5|Y2fiBmgPhYI}DEmisV2*`nq(^7VUasgP z3*3wbvL{*ev?z=D2+?St*|pTgd3kR)D4#;|p2R=VM{dA_{+l@8E~pQ9O?LL=u`T+B zQe8{JpmP$R-NFgGT<-wA?{QKar*D7n?W&+}6J1nMmO|P@ zp1=s51`XzqCV0&rgKYV zC$EcrTzjyKlJzfdYePr2SJJP}7v?PcHgeZ*<<>SPMn-lm9(hrzEAXB6}H zLE`7A)Q^+LN7skpq_zk>%Jg)5E)5L&abBy)lKAkvrd{I~tRP=0G9-+W@It|txO7tD zw@vb6V46pQ>p%~MNVo-i=NlJIZarJ=cGSxY`Y712A>-V)zgR* z^WgZg$}R2<_gr1PSc{BQn>LK=^821Z>NMiSJPPwE@cy7@bCdPYYU`ht?)ug3il2SXHFAN@T#`Q+6ikb_m_qSnG-?2sOR+J$ms2b?aTU&JscY1#~ci6mc)Yz zvIr)c#}W=<-r&)=?S)$H);#HHlP8ap@FL`$GuEe$s&BO+7$Y|;hK*k*@a3OIoK%0+ zgFSJY`z2%_5Ot>Rta0&UEr5IdSZ_iWS+h`Hm8X!k9QM}fUUW}eDE?W)WDm6F+Z2D? zkiAcoJH54hRb`zvjNn(ivlo>$Jk=+x@tNHdd_;xsCk+(l*ObSHX?53g_9w(LrDtjR zS~X5Qv)532cY>cW<}UTKH5a9;r5?%y{;U(~-iNi6camwvbJ&}b-^(1mhudNGX%~MI78qJfzyRR+~-w$ zf4XXUG;R;Wf;~K(n=3cZ6z4x07p<8qt{eB9Ugg`6?8#++{$@|_fp1&${bc6s?st#h zT)B3)dvT=a{=|Igw|G@{Yu3Cvu2ctwU^AZ^obhKEnD4Ij2c~zrvRm3OtMaSks&!I{ zZ-so*o$t5Qibpl+!Q9q!!g)2(YaJxYb0S^|IsZd@siwZiO_S_FEK)De;mJP{m&}=P zE)V^3-1^s&pYOnk2Opk1GNl~A8+!z6(LbEmNz>smKBPgP$MNxfc6Pnw{9UWzC4S=b z!f`$PJ?FoWJ@ku@PrD`!-!!T84yG59^J(zHx+*$RXBfp_>6>ldo#-oM-!^@b_S~n{ zS#k2^qjOh^PYboC>CcY&bg_Q&=W+eHYWQp(Ite9VLl}Rz+~j1n8Xc~^;fJ+7`9;m{yoqQ;L;@cBC3%LOk z>WDmy&CP^;(%`{8_9-%kJw|!t_clEFi055-eEfAYuo6A&W6w`m7noV?<2h}CXY$_> z_kUn}dn@q^0S;iP^#zrGSSb3?k$$2~?)gDe^y9LciIen2;jF8DC#jvE;iNXA??o?k z<`%&Y`6_o#hqSDzPtM=E#GZkr-0JMzuFggLr{H6YANTlXfrexjOpqbs;(h_T&Bn;n z8@YP^p3YAamX0Hab9cMD7UAEw2cQ4?)cx(-o9hqwh8gwe4E65v-KjLc4so2mdBzyA zAUm$@({>f_{RK5chM?i=scZEu$hh9=jg6kG%VWLf>#=u6>H7QEyTHWu0Ca5cUcDLD zy_S2*pxn`+Z2Q{o#o&hyTy$0o84^x}^r@t87EWncseQqZaOxkrkXzsFTSm^{4;^t7 zUw!4U182(Z?O!*gHn%BEq_^33kDfx`)6Zxhelv0MSWV7vl#JhK2k@V5-|GM;$rFAq z%GLR(@rlkK&domRdLWz#nU{cvw7-+W3Hb&K>>J*h&MlAL+@1g@_=aC})KT$B%ZDD* z9;&fyZ^`!q()2bwG#eu?PrN&w2baF?oNC`1U+mfwPU@Fwchrwi*J&7}#cf<$yM%u+ z^cx{|tmGwobFP1Vxo=f6MO&9GcT)KHcOpIsv45Cv-BUy=RFbIT`w*W!F(zsE z$RW1C|KHx3ueFggd-yC@l05+umbJtJPA~uS=y;Nh-9Va{Q-8OghF4#@40{m#``SjRGIrlotFx$h@}W-ygmo@r~^V z+T8RRf7pujrD!h^XAHUdxp6juok`g`%*@j^Kz;+`C&oDDSKgD( z9zSi4LE1Fr6Z;AM0!H#{`t@}cFErNE&6XhcCS^Gbyn23e&UaC!ka6eOqrfJ%DL>c- z=mhUcm`(-TawYvQ4cub7E~@`l9xfHUoVH8R0$pp!}Mmrx^!%R?3@YOu;bPQ1&@&73djt zydJR;Q;@hI@2O)19~;QK)z{%&Yw9^?Ex?W6y4@oV|~^4I#s+Qd>G zpM1A2otwLysbZ~dEhC4P!RA-@k(Xi{d`jofQ@paJEW6|(gXNlx`ikeHz)JcV=d`z# zD|LDm|6=ON?#^8qY4+KaRJoOxwV6W@*VS@Y?iV%6>=wM0tOnIZ9_ z5AwwI9mYBOX|{h;Oe(*NZ~MIlo!VZR(l@|LJ!}k=h}XpGZjR-Y*BcuAmGyuP@`DW) z?J3G3tIhgT3>xa5NGm-&(}!ulwqEBl-jfa*qq_QSU;9bjiSCFP5nHD!dwQN?qa5)p zr%BgW_|?brv;KpNUsJS?zeZWg^*8E`>nw4uBw`pV-x3jVEU&{%YV(8_QAHqhd?{%Eoe#c&F8HLndBKZ)VJ-~D|~k2GG{4q z6Dz(W@`QfArlZrkp8ZW8>r!+y^{JbfzvvqPJKA2In)=v$w<&`gd-#Cy9YkBJq;-_{ z;$(_FgWc(zeWC|Bl5b?Nfm8PFGKW)lqvPQd|5jO^ckls&m2`{}lWuKGA1OW{=cXz4 z$(elJlsYC}lgCsix_p0keXpwH*%|o9Ht~DCU48nudEICo!Lc$ z9OvzKRUDo$7Us2i`etR{zI(s8wzKk~dCuInM~TBtZ9}7Fq?eSwREJ4zUSn+3cK}Z4 zwF31}HG!H)hqD(y$d?KB- zymqh&lrLHXmHF}hZ2HeBdwS7Dti!bC zI1fuFMV`18rDp&XJxaNt8>+0TL zhjtzL@VXNZKCeqVz4MsglCwuFx+9=mbuab!^bvta1RfC>ECT8x)4{ejp0&$+zv*~# zbw5_k^L{8CZ7uR*${v<R5$-)_HU|1$f(k=jN5NnAT0x z-|4LWv8Lmh8{Ug&6f9#p46JM`rkqKTr%ow6@D6qZW!RTb9&(24AV>5Ybq@WGe9lEF z50r`Zd%m6Ll#8;BJQ>p<(mD!^(wb7%5!f=3{&`p5xon;%TzQk_9-Af7&v!=8de+l-W6GIM&Q-In%in(^_KNXT_RkNF zwkIb)@0_izaJ{;?miG3ha~c!RCy%EWn%@LW$Y;%2IV|d$n?e`YJOd}_SC*F6KK2yHup35KSHGKeM4X6eBu1ou7rq>_{Z(LV-Le8I@^3xVu*-Ex0LuQjC){=-Y1@x_0hlA zcG}||^6h8?edITc@+1$#NaaPQ3|D!@$Qj#DK8{8`(MNr?ve}ctQrii*mijphH&ZQ`U_f zmiTy&Y*B9R)s)sc4v>b{^l$`{XWv+HET9m#u{^O@`s5}*_L$GrPvO=j%~&%u%1rxM17P2Ct^_2 zzqkh%^f&#Cam83m%!jSBq^ z4VlAcwLNiCPj~WDAXC0GOkC>Pf)4B@`oQ_j)Ia;5S9WI>PSU>AAJd)%m91HR19?klblcdX0Ak{#l?#d4kcn;4Ozw|u9heVF&sKp%TIe|GAgW>RF#=d7h2eg4{v#rDti zZ1#~LQ=Dr7Kfb+lp39lpL-ic8(~MJ=uu6OIv(JXPZ^We2wR0M1874NdEpZ@){)kg6 zUQrdpf->O2c*Ku;@H37WX|jiMY&z#5;9vFW)*k#S?phW5A3`hov>rKdfup zu2Oh9n1hduS0knl@ldKhSj8@)tU4OMXvE3bbnW$Wx0v^p`yJd{?i{KPBYZ6Mcb>U^ zLrufNCblC#?f#zA^SoEycx#QgJ@m_rS0jcI@8aW+I605D-kdhZwKvJXTz&)WamLy@ zoSawD20Ag;8F?7=we2DU(2340>7h(*{E!s$f@kQXAB#&bzzY4Ozl~?CH*KD8PggRO z;*O>B_sSEgF{7BD)Zx_r?WDF!2aS#O$5#1nQBPneM>((h;`Nw4u1ivv{m^=m0rU#( z{n&n88&|{elr@|>oW^Z_2XE*}=L^sbZse!4Jxfsr+OCnQ##)W|m{K41G&o_uw!PP| z&$JWRuMly>VWO0WJP^tpW1rSckWZss=H=x0~Iwrk}n*qpIl z+DDeYZ2dk4E9N-TSJFM~d+CVs-!o2)7;4CnItt&Faqh84nKMR=U4ORS=&uJS_4i*t zKOWHUEjMgj>e_=A`i?rv{T4UMQ=TtZ?`n(77bzGpKWW5wU`m1lkNnH%DO`MW_73ILXP4VdwM~s+aOFyc(YjOQRe~aZufk(GC zr7Nb`&9Tp1yI%W|=M#)?>6iV!`P_LP)2djljQ{vL*MCnu5g+5Okw<&T5aS3oxVoGC zZuE}&SsP9bTl^Y6&9VL9kn-pzaVmW@=wfjx)BWe)oBjamG1lU^W8^myt7~&(@oA*Y zWh`ro{6t*ADaP+RIQqV`J@<2uUy4unN`Ia2n@Y<#r_!3vLr+GYuV25q#5O=5H2);)@2%V#fOB?NN`GhINA%+ z@DS3LJl)jq?m?c=b!vI;o~gy_^ta`m-nmng{tL}o^icz;dFD1_Pb#9 zWpZJGc@1;raaynI^}C4E*Vk81I{A-oi_hEjug}<8d`$enk{@~C;o2zk>S}#qvAMQH-K_nw#?C&B+*Vkh0E^f@*W-py zq^G3yuJ_nU*!a`~_UuWp-=)7DlW=UUeU)uRy2kNZdfn^f{Y_~#kC}dv=X=RMitEih zhylMeCsaDm_LqbNvrpFq18I- z(!10<%6A9JOIi0Q`Mj^TBTx5T=Y7@pSkEH@j|e;>@QA=80;516j*(uEf{tOgDX;gP z4x5ibwRc-w*rWM*ee+^vb8?nFh5R^oK%RSl>gpU6{e!HxovF#0#r~9s3nn{z-@g+QYUOw`C zU)R(h+bpl|o4>o(7wN-)&G#N8J`rcuD`NX~*LUUbKHiUX@%L8fLy?a`UgJlPdMoXJ zJ+@!c*T-eAj~H==6Z!^;NnPDwk!fh0TPSHj|Hbv0`;d!%>JTS%bR8dM-qE{XpV7rP z>1_Ts5@TNZetFMYDm3`Fnm5kg=hz{!T-^8H507_!M~smBoA{P)#&_O}dn$cqie95k zFK5S^@|4Q+&p18SMG9^4OvqjNzU})JW%aa0I=zPP#h8a&=dEf0XCC)KTa< z^2>j>;kVziw&|Kk z|8qab4k>ZxS-<@D`(A|;XIiT>sMt-?Mf&U0%uDui(+|Y-wkhw<9bUeR=hEqCu^rE5 zF^3`Fzm*r|TYWcdoa*?6KKlgYzBbFd*}0={>-(p~FGy!s4msy@ymRu3xEK70U&D{s zMRjovjQha5w3`l{x5>I=$|P-+te*O;TiueMm8nYhtF{HufW!(Fc*y z)ziJ#r1oEBWa0GL!O_)hGwv_gr~}1`6uDx2R9`_;zx?+5o|wpk_c5jddI;MO9Spz3 zI_f2U7Jb$FV*1z0VUB0I_-5(6j0-6i>PPWHe(ENselGFB-zdfW%@Im}LSQ(|XdnmyRqdza6RRD=agX!S=y7xrx<}tK z@6!KDzXkJzOlx{x@-U2h+iu3vN&6$U&AauVh!wh>diLf%Z-5oobvU7~c*faiaKe7l zz9c{DYWxEBIa2)zlp6*vWgE21zr2UCu~(jWG33?p8u9TOU2Q$2=zpKZ6#d5Y`By)d zznw2!!M}5nh>>+geeRr^XC)8Ay07R;@tGR2PmFnjJ%w(Lymq=qzoVD19nkr)9Ch&A z{)z3hdVZ2)j52?u{cLlm`ER;>jm~C19Oa4rDSpGkrEJIcn`c!+`~{vdhlPLm#O{P= zu%I6?-p3z04Y{El{Sn!+ep76Mt+(qr2C{z4I^7*{;yT91DR~&iz4W7(lqvL8p$JydSlW;#k^Vq^}yCVw@~_r!0Jc6S^nXAFr_o%6W?NQPF6elptdFdJRAmuC9na?F09P%BoZ5=Q0U)Et#mxo=2|5SQRhlv?&(ubUn zN(1Qx=k9Y1qU-vK{wGd9lOBrimDil}(WcE)>7?a|6 z)V?eAd**emT1x}Vh?71(_`%;DZT%)j*`|G#e4C4T4GOzFwp(6H$2edlUy(-FK5B7V zf0bg1SL+X~x6uELBSu~5FTV4})Sn;i_;`*VoT~Th)_)@%qwNP>+MFr6(iymRB?WIhp{2z!Zq_h>~?IeI1emoAJ%=z8~6J2 z)e9~C6!@g?tP!iHk_q(^V;r`)zDsNa&R$1+^L2<7f_+f>2=KcwU*-o^`pSoeOW95x zPSC_Rb&aE2EE;1&iW6&B%c zN`eSm62@bYqp*kVV|kLH=T zfwOZM#u4Qc-Xl)K#G+eU(!^M2Ok?zQXL+j5jkoNk)AP6M&n_rG{p#!_%Odia>L7n@ z?((9Hz4qz-Y4#h?Ci3L>85h~9!%LhXNyZr(N8>kyRti0~RSUvyxl{j0jd$LAThm#nY)|DAWp7h{rW!>$* z~^hx-z54gC1;6=CZWUdJA(}c>Hlb^{E%^kQesDATzuh zamn?iH7op7%$4N7Oe62{S3DFE;k=RdepN-oTo4iqBU0soLk$WgYQ;nE1rDqyfDV{om%_I?cX> zi52};{9QfvC{%iB&%%A?=G`t$>nqG{(%1gloYk*0v8e>IH8yL2* zLXM_aE1lKe_hQ}Savgc}x*ytnw^Irp%%}4&$3v{w=l!%j=yy8tbeDEJ)!8loF6|BD z-A=UMrR`32mic#SW7zMOw0nOSI;Z%&<%yP%%zGh~% z6i9_5Qi%l!hIJDq0!2g`g+?OLj>W(Ug0W>~83l%v*a;t!jUaGxXGuB=Bm<_X2%ea$ z$@ib?zSA>1qNu&SBN1TD^zG`ZQ|J7z^ZLK@pNeH;*;qUlOJtJSGQMN6RJ>lL?^v>y zd*GWArLwVFJe_6N@BeYq#bW9EmmWAv?0yL@ly<+oBwf$N%PDsM&E>^2sZ1?Z-DRKH zmAkv}rX+|ba7p*> zDbnc$*9qOjwG+C>%6^aQ?wzObx$wm2-|upL;PgG}-6!7RI(Z$}-|teT)2Ft-k>&&V z{mCaj@R3_C*W}KH_lHg|d?0k}a&<1^xlcafdifHryIeO%@1lGz9DV-i9j-4w?Q(td z(i`{K^)s42?fUZRyIpthf$w`CblrY0(%%8UcqZh!@z=*L*U?k1k3Btp{emlW`oWvG z@4Q>Ri*kO(h4NLG>nYc3t|7_n^n>bc*E?MAJw+Z5r$f0fQ@JF^d!KeOe&6``KmOG> zAcIrzMtmZTbWe2M#`gzKe@&I1e(l1`8hH5N?)SHkUjE{dYjP^Ga)zf!OXrmL@8i15 z<@$o_R6P0Pces9TKh2Z$ya>8c2GM;7c^{!HDx-Ek?RzP|chc`)bM8GIaJ~G+e|K-9 z9^D)jSi1Xp5Ur%UH$MKGj$XGiymJA(Kt7NIlj-S&?fL!dCnW3b^%K|tOMgVVrL_1~ zT&|DY0pFw#mKUxOkLnYy$zLO0kpIK!KjrB9eWVBC_ZWJo^LJAEZN8Mp9q_ZS1L(rh zJ#_F6N(&i*c1I^v4$kj@UZRVhKY~qDn)^EZhfIe@D38hC6+3zDosgjd+7(AP|1+Zv zy0K#?(D%=|koG@98rMzG7)D*Q@eSF#T%Q`9CSA7~?O8nkIoLhw67v2E<@G0&Z&*`x(;PPAa(&5V zKXn3LZgZb-!L0E6CFl1s{f4b?^Z1hM)>9|Pu$5Cco+W$RPm4Ns^ogVKDQKX4UI$J4 zd8@cj^##vA1^tHZ_#L}D1s(U+uG?2Y(-V*ZT_?W&G5ES?xo&q!{%*$xTtDR+5UuxB20f4t*!54mEB@g4^lyR}knUXSQ_Hu^pE75AIDa z-@EriZ+zUT52R1z_XXF@_{mpb^G8o^>&I#Q+p?AzfH zmGS4!>J*;&{p~ZS71zlVPj2OdXD;kL^9M+CCk&gy2ln+9(DhB%txx>|>KMCr2hS?c z9p_%h_gT5R{x#9M z>T~#vFn?^jQ;Iwr2G9cE?oHhx88WO?*7h0yxrRIcAPr- z&v)nGo`TlRpNJXEshezy^N!5jL=TNKP~SKBLW* zIr)J(57Zi{N|B7QUeZe~t?W1r5`%*oebuaA=9 zx9R#;hTmZ4G{!pm=1{yx4?TZp|M}zGiHhg{?ss_pcOQEG%lPfkmOJ@haqf)y z{s|lN?b`Y?o4J)c`AN$A5%&Ch-a7Vo-TcyKbMAVM`}82E0nwpF(?#^9?)S(zGW}7{~+t zz~4HPfis_ZM+dwf*OAInVvk zR=;0_tYJTF9NW#>QAb$@Fz|^zVa~-@>zZ za2@=7$#wd!lYfBne{(;-<99QPPv0?KVC4cac9myVduXj%?@I?)F)3_iW5{a)q7^AKm6Kr#cO5w|^PWe|Dd~ zTMm7HZ~H9C2lV{x(U&qO$9U#%A^qRpPk-v9zqL)Tp)9qW``uF!^ofweC!To!9cNzf zC70{TlNTY6PwqdjKFQ?qv)kt{U2sh`m(D>UpP{oG_k!jpGRN)@9pPf zJ8ArTY5ob)&|LWSUERIur1|T6Y5sSlIUB>?`YR`p`L_N3oo$=ov|axl$qMb`9khc? zzpjfX-$2@L;rV-POz)&4`-eQg^50PUXH@C*laT8t(Wj+cFWcas&Yu8HD(v))kMG*Y zUuW&k=?_77e%EdC9_3>Gbo=NXt|66A<9rQ%7@`q=A(jr; zB=iAy-}w0dw3W-&F9VrS-@xXVpF^6@Ib~Cw)OKyw&5I|mLLSU_@Ht05*O@%k+dJRL zu8$x;5A#KVSI~2E2fvA*uY*tWDKOqZANd%FzW)=~@5}K%O?Tj5di{r7w_WOIM(Xwd z>KgeDXk37?4x^WNWOnnlSCtv#!%sJ7{Iq6-H@jaA5_g}{~N~2=_k2=ntCqKch&wOTd^E0=v9e?5$e1i5@ zU7xrxCi=*4L1o^gGT|pXJ4Zh7pS>5p!k?%7==#yO?@jK@ZfieepF6&(4Z3yl+jrLkw4A_d7c(rx2b-f7EmVaf%!YY%drQ1lD}m;XMc_O zL_VyIMq1);mzFzz?MHZ)7kJ-ZXU~H^ny;VnwUzfV+2sds-gf<)pZMyXPs2W*v;XaB z_9o@Y{D)VF?=3w&>fR8@_v)AY?sHcyI%fP((&&1*Ih6F_MbRDGiKkv10UutAJF;8vc7P{ z?DvuPPLEh!r*ZT@{Q=kH>3@3kvVGC{?$U4j=;d4JKc41@#bkBXKbfD{}_wT$tU(~3*!~^qj&FJIAXZY&SnDp zX&%mZ%RA}hb&}_IN?QR9kUL8YI=%+Jzm9hN8z}c*xzXnPU3Z^*)bnWX30M2+?LE>t z{dVDa@)$J@hj{tQkBQG-yY&2(554m2vsbRMi}>^6OIKbv-n)MM>?L5DmtC)3y?o=j z{IU0PtLe;(hsa{UHfyZ*{E&s@2F-L)-tmrsK7xqS87E*q8)rKkM%^K_D(W#@YS z#aCVct*o5uNdNo`H}2oW?=784%8L#`{OF4>e&m&xFy?2+_Se}n!Y)B#|9;}^zPNo( zV1(VzYkPJ^|3lfhocoEh`&+tF7q7l>^#;`R>~-gsc=lVo59XrGi`wNMyY#{{SB|%Y zU%zqr>I=t#m##sW$NrD`gWH^O{l!;EAln1KuUxw?R@cP|6meX8;qvyr_@NhHydl=L zi8T@?iwX2{!@73HE#!Z8e|~oV)kohSvjp3GDW6xb-%ogP`Qj_b&s=)Jf8+QgS3mmE z;}5@b?Gi`FHvL8Yx#Rwizj$`VeeB$L?#f4BqO-{sZhz(am21Z@U3-y?=pxsUfv}JVVCgaM=$;O_2WygUb+6_^H+|4 z?CRw!FA5i#WY#ES^FUr564e)YpIT>7Z>@FR~%d;IFv8_yj(=>uCc zx*QZPUc2()tJiN_fpI)=jM(LE`s3#=y>R)XSFY_pclpZmxcJah$H!H6`S_(vAHMp+ zhlPvJKY!^Z>*2hQkLfbAisSe;&8u(9>3*7oa1nZWQv%S7%Pbp+o-FpwNpLxtIKFn} z(&fE$Z!Qb%AEkTs+SMCZ_7lFj(1#Ol#roqfJVSZ3q32yQHRTQ z>GEX=%lk3bh$G#O4tD=lm+No5@;s|=j*?w2$eCr$q>MBAMl$CcxB4&MfPw!QI+4rA z&%B6SUbxJv^uVd2$JcLMx^^SN>dijeu8SC;(-Dg&lBskio0Bem=$Xq`o^`J7U)Rc& zYOTJzPR+6hpX~O6kB_JSB0t`8Fv-eKq%&u9Y|qc`{RPu_M%Qz z&)av(<1fKIqMPK-=-=}6z_q^wG=5k5*wINml%*{Dd=Kg20Uoz>dlSyTGrQXH_&xA_ zW>2JxtzGSO!tQ+!@WA8_`dR&;c5BPW*>B?QdxQ_7nMh@0$h|*wjqW`*J`%x_cO=EU zycG0~(rJGpTJnv&8PE{NwX`o0k9&vHBCl}~p6DEM93SWW;iQz47hX%tjl9Kd$SY-n zhV1A4)nzE#XpKfnE^3GPR)XieQ7+DLzELpiPo&e{GKaP~D0xRR%9Evo@mUTg{0X_> z=V+yS@k8<9Dbx6@hCUg3NyH1Jhiq**HOz);m*z=Z zFF?*B(F&SiL&6y6Nyxl_?=XGx;Eni%?EPe4u(xr{*25BLkK?+AYe?gcf%lB1WVN^_ zo#(k=z@3Oj4#kIeREv2M(U@n%cnArVR@x|4a&~DQMfo{f%$6WWMavwlJ%N?wNZ~6{f1=gSv>ErTd>V>v29b`^Cg1$ zL-7&drb$09Rox?RB2pRpN&cW6cJ7v80A) zrhD!7+$e?7R{0}n$8wffsCl(GKk8*iop2*B)zg#VIy10M9rADo*Zpi7`fz*7wZx(L z@Ry@SKevpbW%6cc!4YgjF|8!YJ_Gt|C>QN&0X8#E%;iQTUX_*`vzxW;V#`(|+QQ65 zq)a;;t_CB`Wj{NYGuCFa&U@o6ZrCe^Y`a=qM602Mryg#v%q474gpG>%*$8bH)%SST zHJjkKFKX<<#;Fm>6#T!k=iyI-y>>KqQbY=6(eC3`*5>xP!ujVqb zL9sG6#BRn7d(b;p+qTt#ZAZ$MwW!#3u7~rwt;PzlImJ>IWm`0Kx~DZq!}e+{nfgMh zwHjX3rw;P0ch^Fj+7|SS=k5=^+A;?HGF_maqFrq$mY|nw%~?EB>B-$tAN`m+Rq~nP zQBPc(15YJWn|V7Oj7y*cOPS=s59l3qEpgGdlmU2(fgexPvOVA}*Q`o5DS>i;ttw|1g&}`jMtyroBUDRQ3kU_JoN3y+c zp;N@~o^36JwrQ>yeRm+5)YR@;Z>fvE zh_OXhZiIrP&8i3?-F8Jx86Gv@FZ6!ls)2qS7lb%7#2|cWp5SeN7+(y9NGg zmTtFgeSvn@9(FrQ8e>Pn?vIn>ZpZJ|U=VMye(#P`T-GaS2gOpeR7cl!em-~!a}2LLSZ)c`Ks&jT$05iG z{YF-U9%@Q6B6ey zi`*DHCrMeN!v%4{lP`X?H4TBayKt#ZrC9&KpJD^iw+*ao5JF)XEdDMU8km zI!~mA3t{3N@xyeG+H-tR1-TIQ-SL!+@nwC|47Mvg%A&rP?g#kkx%&^_a2W{l8hlS2 z_z7kxcbflkXv0trhj}Rnnz>-26%^k?FrUJWYVOj*_jRbQe| zuCE%f3W3o2&P0O0L|P^z5)5vu$uQv~AnKxoPR$PR477@*}A& zj;H;(l~OkYduiLv^~UztJQwA`3(cL1Zf%*vTp>rEF8?T6@zPj(6g~gAWE4l9a?Zo% zgBs?VGSQy&kJ5SHaGLRsIMkmY*Dd;|pnGoHXnF^RZQ2w3qyxXzh1D;N2cXnl3tDN$ zC+>h(8#92l)ZnYU#=(ASap)lEE~gW|a;xMWZsPD2y-T~{4leoOl3QXd z0v-%|ut55S(GI&+st0WTm-Obmyc{P#LlA8Y#)&8g4X50VcMa(Bl6TmK)*fNmUI1#LUuGsKBK zFf3bLn8b~RA9ifAp>tfbC#6UI`y~`VP6a9=Qx`q$cMdD-L@1kF0G@Fbc_G9$KWeFlizuDv8A2KX(ZntJL8=3FpPSnMhN5AhYr#U^kJz@ zvVYi)ZO?>a$~W8ytU(olTZt)>3FS-l`xCYNzTTM(Nse#z^C+8w z%skpsq;f~-D9DZ&%{yCqfGwxJ!dP&#vWpXkcG3feZ0h}ly`q1Fs>Z=jS=i};@wBCz z?w#v^-M;C0x&~eBUnkYG-)~9}pD7qd|KNsy4QYZNFV3lb;5do>J^QoG6DH+n*B&b4 zEZti<*{2KgKg(jDm;E$n33ewm?m*ukhc{?@@ET4qZld;@4o3GbkKH%BbHG3Qw3B@H ze^W6im&yB4MV`?FUeI6DA6^SWk7%wjmZ4`^etUWD@?!cud!C*>=kcfIwY$EfVfUMg zqx0Q$F6j0+_QX5NB>gbH+`L97_m4B%ynpF{XQX=+H;nrsP9Hv7LY!}2!)=l+{NyYh zU5*C{0|?=F7~f=1^tu1s8P9Zy4)%zbP=R01Ue1=RO z&iVQOdZBN~XrFc}mgtUyAJEI>M!z9T4ENagkjAiEx~Oi@ho0FUd|V=3Q5#1Woe%WQ z9@4hYk)98Cc+ti>ZR%N(lsTh`WF5jMz{i8IBW6DwXe5IGPeGB7d!05Ge7HFo>6xui z+d#^T;90U&AG6y%`-ARCZ-+ZDuQ|(XXV)aRp%mrgLoA@1@g&kh8uY`jYC@4AhN(I$%f}@XwP=M1_kcGhhrp6 z-qfd&3>~{CyF%XpBHZw4wi>OzHtEim%bw-7t&R%6FMRPy$rkX2XOPhklR`&$aLcUbHB~3=hHz**KFI%M(0!J&!NI(lN;cK^w3Pz+@u|17l7T6gI*_+QaxVgRC9IRqVgK3OY*UDj zy2&W~Xuz%-z@0n5Gx3bMPFaNOiiJ|IBUJQoe`+Ze@b4$Am*kPQ1*=$56;e%Fyvw{ZrW7mRT5K>$!HtCIJzjwXp`Ai3g zCjYxAv%1oscZ6gu<>9^QM&4JobWsDw8Dq9)g)8H3djtJ%`y4tszyVuw$7zgC&Apdf z3vS@AZnAgS5b8AWG|L=A52)i-qo`$9adpwg{5;nh!ig?aqm@dopWc|26xIWTP)A}= zV>g|a8oCj#mIM4C>Xw9Nn{RJQz^H+-8~uvxiDOL9+L#0IfGl_|jinek(d0162)ajE z>lD+4Lijkaa&rxvr#7@~2xATKOEqr~B9a}8>1!*H>2?}bKnLC0vQ!!wLT|oFa-}S$ zufW=DvDg}Ks(cCj6lZxi@`8=Ji`9UcL7PQ={$Y+d^-~hHQ|@F+ZlgXs^@8dv`UK0W zP&<_+onSqTyIV*Chbm5Ny_y2{(Ex6X-;uG=pA?1>zpnVr4mxU{`io^0zHGawTWYMh z7IWFeWVz_Ad907^UDxRMJbDw|*!gAF*>7x~D#9H}In(%hir(9qp6<7U21ojol zXM!V?59>bf;pM!V?3?!ZxzkRGvVn0?h!2W@T$`0;g8Bxbk~5>jh%$yhr(9c(-DBAU zA62Zju~WdGjS6r;j6oJHOO3QZJ8(6-Vc8L2P^rSG=Ldcs6JU#2mt_>yMQJ*S2xFAj z*4OPZ+RJl~vv>`d$8_bl6|6TR>>uMMQw(S09=TCpH6X8zf&N44HnqGdHC{){iFPHXAqT(9(XBl;;jCxNvF1}Me=&IZe>8Wn04*ey| zlgP;8wexa;=Yd0&76~3p!_d$9!3)-iq2IPFf36!!G*W49F)4-yrZC2um}L`q8FaP) zE)HA`qc790f-kbGZe`pnnC|#8kie>#jpE7Mu^g~xII7j0wiyIUOECv8TsG&!xP984 zd(FNsD%p03A9}a*xO4G?^`4wJm+^K7h0@$s{Gh3lrg1CUDWThGcXM8OyzW>0k)#%! z_jB-qdYY!y1-=RFoZNtF7b^3a3%8EW~t>xVNQp|MHYO*TgOU?)EsO0(d!I9qYe)u`@?N2B#+T~Zcp z5p%mR^>M*UG!sv0W~NpSB&IVy;ltFc7F-6#@scyAk8{8at!yKclQNpolFDi)SZXYz zety)+FH)Xi)fv+<9h_eu%$LCCnV5gGIXLABh{BN*uuqzYbC?5pppRNRT&SC>XS&iC zjg{hQEc+9sRS1^^ZJO$h`?0Vli~V&N{UZ5x0r>PMok%iX0xpC?f|w6tTm^Z#IclS* zTwht9r1FRmDcM!n|Iv|u@h>J0kHUyY9m=%k0W zMDVd}{m5tjJJ7v<{x-8gYN1avq+^WXFo7j8z|*!k4ikLWoJJ?`t9ZG=22crV5b;7d zC!OVHCU7;9$DXhIkUr|~Mh07bEQA5p^^oj=MQsmu?qGnR*e}PimQ}3w`smk}=*vwc zTNCeuRXp!~)h4{}=D?nj-jEXO25}Jm`+C?vf1AiZ%NF|3yNw09xy6|-2#?zFGgvGq(Lo|UN>`>6 zGhcBBhmGJIe4~yG2&V==YHmjPo!J%rc$~UGafA;8sYJiG)yG-AAPR9nA2jxeV%1xD zEYE_&p?@Lgl6H(WSj?`dK1Hj+F_F&>=w<6K+g*9vzpJfz1k^(Qi?ez`|)px_B z7Hrm=M6wM&J1+%dzz1<)Xs$ZEQ(C}u%#Xnce$2X{GN(}+<5Z%@VD*70WbGB5><$&{ z0|w9w=w-Mk*%aMV2M#uk(?+{fIJ2c4AG`0jT^o<30QgsX_igU66#2Fk@_jzu7O}qN zOuw&>w=BB1<-zak<82Y^Th8<_`e1WPn$O@fjMKVK!q5V|7N?jHT$dSvmLCqex*M@`j)534>%g zbBEyr@fs{US_i;r1TMizR0Pcn=@a6)D0~4Nmq+D6s5#49K?+<9K-_FN%)#2 zV*PhAyXbXt;v`sR3@~2Ul0ll(9!4LIT*6F5$P{vdgMeheOphZa45s`w$X2pTW5hoJ zV-pe6Wpy%^D8?-&dy3)glsBdh|4LT2m2AmU{6!Pk74REihJ@pac@w^*#io*sBzg(V z^|7`Kx*n#TEwc_Iz4D_{+{p9bF=;$rAt4!-=@*vPW@0+dC54HSJKKA69R;o4NU zxo9QrUiZVmSwRo*HNwBePa``A z#!9j^tqRU59#0_omUF(inAD=}Rlm84QfzH!8xILQ(F!w+xt%xbsCQhu&6iO{kQd_i ztU|*S#ZWI?(y8u2AJmQC_%ZDt-8y zDW;{e=vS;pOZSJ$o4mH*W4%a1Ta_At!aTm78b-j-BguAK%mov*Tt(t@42LhR75Ere z)VSmDS<0~HoWAwH$O~&RWSVmZs!JaAHY@`R#5x5x>H^|(oEX(2_|WulqMogdcvCm3 zgwIfX6!45CFoD5FsaA)DMzc6iRQ&K4`#8z7!CG=l^#FIvb-_M;yzIM=GK&%YbRM2`C;stTOo4%qYCR%LN9Z!}* zSA)p)uNgl#?v!Yks6H$~E9;T|Xc6 zkGg9F9Hjbo%mW8v3L6D<70?X~%A-J6nl%U@mJK=sAgu&^-EINvA>gc#{UuHB2#DiR za{9Wz<~1*8>pkWdIv*>j8$&L@V!bTAjJ8R#5Mw^yG$PrVca91Wq-***F>Z&jMgx4n z^HHB{3MTA|u)&dKO$g^`IJyBYVh8AV*AxN%SazWr)I;@EShTEaWn_%kh0JsTc_FS- zj72KZl2M9U=i`B%u3=#n7n;ijH^rHwkE0m*ddVMLOTJk&?*o*KH70$8GpT{L0XcWd z&GKLn5rJ_UHN?`Pu0$x#7V%INOB-ofF~kkp)uug&p{+HvnVAw0@`ZYm8rWhJ5vlRU zJlgQ0zsX|FS!yH5oAdLL=Az>?jVDyBt#ab{(U+C7QM0)kr@Y!G3_c3eNPn5j^ku>{ zO+6;BtqA{tgewy-NiRH+^neo}Q-ss<1r zx}belEm7vswtq&QY!h`W-Nxv zac)sc1`-~*rg#0?qOS_`s3A~nwjoBOmAOcuy^_~rB)t?=ab7A4qsV$ZHs)i!=r8ow zjdrPSPP`i2)ANxqDUO39qkv5fq6>c5;sI+n&&>zgZ)(FaMx;3iV#+wK+R8N0CuTJN z#;C6{b@-r_UU)T$V*Up=HQGq(Z{lnn1Z>C$`BEM@FeboX#5#s^vzew!es3)=29xP@ zualqkhh1N9Z8j3vb4GMK_$KVh%UPDzrl-$!fOcNPx?47emhg@78(jlkL=(;7$llqw zZpekYVXHxSlc5+xLtNBXvFe~ERXn-TvN7>wr1Yp&?iD&{zbF`|X&A}`asN^H*O4#s z^k}V!vtAg#HJM;YtoN!d&cy?Jm|@rM2e1iZ0ekr1HtC4==YiezMwM0}GbmcX)IcSJ z1sJW2C&YrO!muaTa|J(Q?a0@TYBPbmdSNHLA(A`9LhG|@IH&PCgykGQ@G;r_cXurqrwudgc-r+GPb$>Scw z3)a97DBjSlE;|TQLoxKxIGTIHXTfBI3mCU6^7+SCpx4dSXzekTL2I=iS|^ShST{cC z>R2OVpsgY~8#8-6U|4adZLuq%k!Ki(-v1pN$6{yG2>HSnK2B z+jfDKJbu~05Pl@^myQFf<0bxC)V?b$YlB52??gUFa+=nqp0 z9EavSXs_lE-+DWK*Fx_28OBNEKY$U!c4D?6*V~0GFKOx8%45Wu15+I!CeLA?@T=n7 zWOab?^8ij8#dvpkZoB$!_@0$=m`iNw-(j_TyZ}60FZzZoXG^UWjpfPiVi?l0c8eB4 zbl2^0vi3k(gh4YLJr27X9$>utK<;n)L2-$Ovgk8Dc33m}vE_?s9&`<0fvk0H z;hf-OchIAhIm2lg{m!`ub>32HEVl4Xg&*<)YlQ*n3Je+ptSf< zYzqQhb`Ng984tT_+k6duW1x?HIO#6c;l4rh8U4tW#RAedYcz2Jc{*bOu)+E_`rTsV z4H^&bj4<|3FD3Q=&oB{5-zVhjNI)!x!3B`n_EjbH?)n z57To&%onsJYmOhjcj(_l>&}iSZ~9FiI_Nr$5y_sIOttMAb8H)-k$o{|8%w&&ktU~Gu%aCR_!fs6C?9NcEr$6 z;*t72e8ri*h);}@Dc+9i1lnAyMcBC`7kc8Y9`{8?a%PR;nHbqUl9ltpxESJOyasp; z<4dLk+;(EAy!*M$##Wx&CA3HpX%G%LN zF`ip|iqVYn-0^tW9hU^qd7nwdr#kUkc$CSP#c#q+k;I8f+>Oy;M|f^XI=~!^zJabLg%kU#b2v;0--9hZF6Xt1N&x8iKL4F70!eahWU*koI`3 zAbykZGl~a;-;TuzW)Y*p;s@cQCw}KD_yrD!74T*U*aC2A+9T4muou-jhkch6r|se} zH*e9HomCiozvTnAL)F&d11H#DR51iaV%VfYxSxo9_kgDn4OTd5mh{B3H;(IT5&Loa z5jzM30efHC{R;fT*qamjv#>{JGgy+ktJT=qQxbY18>4+P5&KzP=CQY)mntRp)nj}R z4d*;|Z3n(lF9x023jS&V_(TlyMjaR6D~Ln#OCjm6F3o$$}sCnfCas0Do4rQ5SP6ltmrP!RiMZ4b%tfZ}~{2 zhL}af&RPm&+W-dEAgmU;S(kx{2M8ap1y)j}<>nEC#{9H_Q7_(I`=+Z+2X=-%*|5Ky z0l%tG3r1$q#;h9-OGRJJ=(Wu$;yfv~M_UOMasYAFWqh{fXuq)_-}43H%d(++QoyG= zxIe&pSbw+@#D3Kx{NR>v)G6uk&%+G#(0vnaCB>1mJ`M50Xj5tL z-9nzQ;!HZe0Y*?6Z~XB45a#4T-8B|)%>(SI4soxy?oaZFe++DNwT>7)v{iPw*;Zmx zIk_RMz0yTP~S>_=#~N{fD{O>uX)4vfv; z3H7mNWu5>&2%NBHfB>vRIPXzo?Nnz~M{E$*ESTd0=tjgqNQ}B=t+OgaAAW3nHZ>h;P{Pu1na{o8r~1f->8L`Fy=BRrCC$5uBml@R!o*G~!At zaDps!C6H+V2Wi>*q(Zg>%oaF~f!IeCSYZ_yR1W*6s=%sJE%2ib*4Cik5!<9MU{dW` zD`OABW!gVlJ`^A5&m)@O1kQ|DRN@1BE>J%xx?77*xKq*svozKPM2mCYGwLO0men0D zg_wI|d9V(})~x~UxjA9jpWbyhs{vqG^SWjz1FZ4E-nDihjt^mLHA_up5f?e_w5>WC zH#qPrg)JZFuIC;u>TgIh#QYb~CZTPz+_0mpQp=e+>_6bo`l1v3&bOsieI$ohs0Z+6 zMM@UJ`l;Qr#6b~!)E2;`XkYeLKv*W-o9?tmtNtR{Tg6oVJYpwG#JmvW~)F3Pi+ z59@!@YeDP7uFlN|YL{EeOqUxS*dXoUVd{{xJB7WSqrl7!vC>O#1b1%G;d}L9Cu9#) z*bwben^G;TV*pRsSU1o_LsqK<%NC8DC0`xuYf#r&eGhc776AAGHYY^=K)XGNS2o>d zE027#g>|XcJ52qEVy-7+!m;#djaA4fffriiqZClz!;(5TBZE$PzT9*IF^{)D>&Lid z-y^Op4}9v_%T6IIc7e|XAEUF;V;FxlfvwvZf>kxdvSGVqDI24lx3!}F90#ov4Y}ce$&*Xv-8P`g& z)YJ@&qKFYh8-uzfRHSBX8eGNG@l|}XnbIDkp=z)}SRsu);P*oR1dL@U2eG|yyBjtu z^_5SBpWUDEY_KoAG+~$>(w^%ee+FSH*xnu=8pBiZxCUb%V*0AFy-ouWcQ6#LNJV&^ z0R~KrwVG;R&&}piiB;5<7|fNW+Njb_$fH(IZT6=K?SidUhd|gVbDGQ&-?SG5!`Jbf z%|Ec#X9WxrKOe&Ze+cbFsO0LaX(^BZrbZYJT+)d1!k4KuyUE(jpRIVu;p9{|O0X?p z280p9Jw0H)w;fin^WhQMxOTYl?sq4LUN;O}Z4bvG{D5HxPV7y$GjEZN)}(ca_J$-Z zbPK%MIc(5QrR@Bq`{$3956EpURHd{1EO+`K#_Yio^xD|(HKJ8C;7&_!6Kmoc?W4K? z25Q@_PPlR=t(}i`tCz>g2fe6;=-J^=4`5SRQ)Q~D75Ua@DZH+t!u5LV^_c0zroC%X zn|ASoV1^uij3?%cB|r6n{8wj!`qNLk7+2hn7lg&rL3M-T)qp#XbSauJWp}544 zO|%6nrFQI!&eHWz5^XT{(t{6ms|z}RTznL=b?m=@gX;8I-QN36bsDmtm_@`VEcrpi zjXe)0_Il8Da85i&dTZnx`7?Xk>Eto;0TM|3&WHHf9mEqm2$QW+oS?C`0{{mxls~(U zu4a35aO}uu-`o2Bxb*Qr*>B|s^B<$1bNt)%je`vfcXj-&2`LQ;CmFAA|{`J;yi?aSXH;k?8F7%#`X|t@vHj;*XN59BvxIjj0)9)i@H!A)9%D7E(P!@&t2y&{H~dBv2bIO1 zczEX&!*<+Jvp3IS4KG*Bta#9kJ?#j0rnNNA9+0-uJHWa`q8qZJKcs_U8g$eAl6~k8 z2oKVF5f1Cdg-KWUn8409Sg;RFAqF2BFc|U^;ayEmj2iq!*rSuhRT0*KdnUyj&Jmwi z2~{OQb!0^adVS<0vc>7a_5pzIK`;3wN&G}U+oO{+TAC+!DofA#M;cgklaMli(Av7}!4xu_dZrsCUJ&RObo5 zgI~b30Yn_?fc5yEC!3SL8asDsvmP+i7e zhKP3!CsOg+8W0O;NBr3u@3JgpfC)PLi|U921lBg+xFgeU*#!NB6&(q%pux_fX_P4jy$G2UQHj9blcVNpYxDE;b$%fye41 z;)>SbBiw{MGi7XCR&JKo*ynMh7Yj|%jTa~_X7K+b2Gk07@D5er=2V;?TRTfZrf4CxzGIxbl7@ zyOcY4KT|NUvI2-JHNuFoAxsdlHrR_(w`KU!(OzLMPH{1|l`7)7SS%F$6R9ywt~TlU zhj{;>8RWGH?U{#qJ<# z73wWsY~>ZKN3OPV86h;@gt6*^-qDvTQ@kKBDd;JH7%+Nwi%R>Y0y`v(&8W3Pg&f}Y zC7a;4))qzJQE{xF@y???#6iLqc5~iy@j+v#IM-T^dbIw6Y?tczU|rtCC#`m~wZiXC zUh}to3n3RH99i~fQg~+^d{>C|qJ0N-8`v`92zBf|Xr~mU0ppVi@D!T)hSX{| zC}yg$5+kWVA{aGF_4TGd%Aj5~P%p`_&v{TC=X`i?C3LOCfUgx0Tka2!T5)9|3|U;6 zV8!Z7K|#n}+s4{z#7x?wuC;<4(SDpQh7SVMWbcdv#)z%c@N5i-s_FERv51`tP|}l*0$;Xc6+(XWWBB7 z$ViOWrV@`PdZ0f5+#K)Uv?d5N3N#(s2zOpoCO!AUqxIa;skT__?EQUJ*6yPIqs|Xk zN-Eh!bge%w=LW@c+O*nQDUhiWUUmKhdsSlZZgkUlXJ%%MdX9HGi!rv>h3Hp0Yu}Le z7hM4Wk0zsqWxpCl5K#&Hi=v$>VgTjAngnbZs^&V_^AY;;RE<8O+4KPR3eE|$UZFpU zxCh!Iv<&gndLhfr#@z;D2D9GvMm8B1b`U>EJquH4wapG-!fE&vKgandPi6 zxNNqCRC8IDSJ7;AR2WSwi(z*uc##`)LF-Y^c~F0j@gdCzDb~(eH+=S<6p8_3bFDD7 z^Fp#$?yf7!S{$qmH85TE7nNnn)~f4lKB~#_c4d_e3^&PM!Hsxe7E5Jf&CduRW6{G$ zF@~!lH|lpeu^EcPHsv9F@OZ}zeDLQyc#YJetOfE zmMa^>;(A7y0P{r;RLj}O4qIE}1y{7bOGt5?Fdne$10F-ag zi+Ik6DQYwyq{?yrb{AuIYO|;>bZAGmIE9|rx>0r+{R{Tn6X8-PAG=|yi=nfJC_#XP z8w|{`=?T+&5{7_xa1m@0jzhO>BUdj|Ux)V^VXjFsBRS#RQoZz^JjfBBa~~uhhBwn1 zDA*O&rEAz133E0m8@2%70BBg2@ZMnTFKDTN2b}jQ0!y%gaS#ru8m*3Bj+N8JSW26& z)gt5Aq0r2e#i4v<5rnBDSuXjygys=R3#`f;=5{usTAvO1zPN2xbjp zp1YEWE|5!t2Ifb!gVX`^fv*+TGX#>g(j+;{rxIz6jajg7q^aUQo|y;{jC~-IVHEF? zp}b{ONQyP60TUq}=-S(S0ISuD4Xlp=9<@96&v9)6n-UXRYUwE#wMu$W3x&O?BiI9h z9#~kW>Op)UlMSr}I9p?jIJJY#qy8)@xZ}0Z8t)O^v2gZ%#>>J+oa0a!FPmC2J`clx zG#2Rn?byN^iBU(Ozp5QgP9b|*D-8K-*b@S4K`iC*?f;04oH0%XrVlK0ho3WEc5#GQ zw?JECjAc6_``V?kYy_QnJJfU1$M&N%XD!x-Q+zP$9PBEBxLQ{0|14P^;yz*DFmh^? zoZ}1^-2Mg+PMd|_h<$Vp;-O0KghibiVC{xsH&*jDXh*CXVyY3h1K&@;REBSRT_><=S&FZL{jfe2`!G-{4QcUTWAPaH4g10++uAHFD?UFcA5I(#*#O#h zwDBZT`Z#nudmIjlz9`iX*gHP#9hRUE>yhu<)b^f}2G@yQsuvuY9@!M>46$Am|1S?= zS8LMO;SQo_FF(-FWbVYx!55GBZc?1ijt9mE#mzbUelR*9WAI4>0gCUWaWiDXY#-0F zyjkCe>%<)Np~1g2#NHBn<+6;<@rUHLkL&c#F3bf8i=rbQFiV>ec-i1N8k-*GAR0)( zc)z2wA1BG55dxcFHV>Y*SP#_`+@ufs2p&H5Ry8PuDNd+{{YCNq!31LL(#1w797}nt zRGIkgGgL3wm=rp+tyKVawc0fqNOtbS&9QkC@*(-bP8_`iP(QJMAM2;ECN|3Id%UWt zcsE*h(CJTRn-JVxVgc_YgAbMPg``CLa#|(YuP`jbM~wZsl1Xgr9_{4&Jz?A`fG^Ug z7i&aESnrDW-m&ti%mW;dzef2HAFz8aiq}Lrb0{ADaLK3uHj-GdhGZHYDR*h5lGigP&|PI$Z(14gX|qH zEGCT3tt{=yiCsZD@F~)sd17KA>mj@|KHYB*5d&9Z`|TV+5iAR$8SNG7In@j3As$c4 zKCNY9-%UVBykoAb1}qwd<^oM>${xec;L&w(lgxNilpmTmhaVK<Ob+qL`F2 z6d$ya*Mx5pri)kw+DjGh?6eB-ua7Ve)VM}F1m64#=qEh^*UBnJDL-Gz+7NB}0pf|a z+Qgnpuq`M9|DhY&&kkiFUYW3C+KV<>1P|~@gHF_ok&#*CXF_^as>Z9Wax2Jh3XRsR zkM|EzdTP6}@JW`dfpQA_s|E4)zEC%mX=A@nyem?NzZLIP?3?q6Ay;{NXW+pO+WVN+ ze|WJc0rnS_$9~v6-q+{EdcnS^eIg7Kd)SJ(e0sCQ23`{rF-5?jS_`3K)K>0Du)I{& zteGCHOWpNmoKpRvz*G*~Ybzyp@_I6u;DWWLnPG8J*r0J733j*b{DC-u9%xL6ej713 zz>f-L8~Z>4!^1l|>3y8Q##tMcOzE9WFY6V;c&A_k@9YEik;AOjlOn(Rrf(PZ^;%JK z360mVo&)0$_^Pu=+uMlE@t=QZQ_=ec2Fg~gEQCGqnVU)q^@eucXn1k1-kCnKTS6aiiVc)=U@J?FR zuB;Qim5hDTfJff(2zBQnDHtcVUcSB;o z;dK)ZdRyr>CYu1>OSkOWN@lg`i=M>IW$Tpk1_GN59EP&&}{(!Q-2JP>=<})0U=ww z8PJw7v}3;2Mobx|nDi#%@Dm206AxmYJ@oEA@StKYfxSfW&QvkAF(gkrgtZLrrGhkg z{~a7zsMq8i4ot8%06HtS*3ofo)hpqCvZ8l=%Y*QN{x4eT6;~w@SY;M@`+?EV!|1yU z!?3UbCgp1(z#LRaWr1$4h*LBVV{sYXVgvv01J~%UvSeRH~ zzi=8WVQ=Tzron|0HQp2|zW79{_q+c7LQqq4c@Wu%M#WHyGOe50l)6a+d)Y2G&EO{5 zjLy6Is=sj$23=*)3oA;g(WXsae5LtHSoZq*Mrc>+?NAl3RHuIU{Noe0-yr4zn4|NU zoBBuIV7Y0AD$Q9+YXReCWE2{Y5vi zY^Gn(T1iiNS>clD;1KI$dgw>zw6|%w`k$zc0@2=L-hW7c1E_!G!Tcd!K9ZdFD+oLTgg|(db5MK>aJ3cc zaKUHRqUChHjIC20Cp-D93A-{jv55(iAr9z|zHMu{z=yCwCYwi=`*vK!_zN!x#byTg z4-)~Z>=*p+V8%w=P>#ko#qK<@DK#?x%RhF8F2T~iHhLi%w2 zl0S=Y(g*lp@kK;4P8j|4$H5RxD`sqx)#0jEkyn1ixGqZzg>(Y@1Eye`2u-4OZ(Dr? zd0THyu!m*uvFif`E_K>(-Z^#wQ}oNSyUUGTod&hIds5A$wB&Nx%#RBWe#71^XHF28 z$9#HZSDJ)%nYA(eS6F*>2%PrMQpElH2>s(32dq9gyzKooC(%hb!Atq&gwK^nt$sb| z_c4$!e_obGl9J4X z__f`|9ssE4s*QK#Iq&yF%M#o93Xn#9j|gG+M0PqWS@U3GIRW*z|#6ANpxV6^2R=)p2HL1fp;0 zwkK=o00DiiT{-of?YVoH^_BN4z}tC7?HxOSQvp+;J!%pAI6zkm zUn2Ft-y_HO`S{DFsPF6J`}%l0B=CK^`twN@_!*72*&K>6W~|5IwOzxGJvnJgg|%zw z1hAHk;hNMb`@-&Yw%8c1-~;j&vmvj9ZTVzB_GVayvW?bgq~xM@h;Jo$%){J6!bsWN z41Nk8@2`>S+wt%D=d(L*X$-o;My>*ov&;#H|50qj(p>OUOS@SeoSq#(;hD zEWF>ZkNp(kD@JTr7VFGc!Gz@f|JgeaCC9ZR$bJjGC+Iy1g5G;?0RI11?8%E}tDmIR zN*cb2eG$4b9GWJ9>rG{4)~x?zml{+Pvs!Y1U9cIwMK7HYdZ~;Bv{7lZ3gt>8FIveJk9gv{v2Jyixw>n{ zyztW4ggzJDKW6Ahy?s|cQx5UUNZ2##v2=gS{l;)i$HJK#*xj*ff;*!{NPp6Js1D+@ z#JD~W!%^8UQq5{Am?$r2v$KgWC~aCRq&SMh2tGEuWp%f_+q25>df7L7rx#kWFRO98 zyS+CDhd%w8M0-RvFJWto)}!q+`G-q4ZhD=&bnoapA?8)Zhup(c8>jPw`t|89gqKaF zBY1IZ>3U_BN(~a}$#qpdw=3TBd2d9pcW#%hBqBiTYo~cHV73C7!fuVZcXfNzE5ijh zl|ATFXF?7-vLj|f?B$g~hO37Z?a@_;-@na$l#dBv+$`li=eG99i@Td#xfCFz!>0L9LS8wEFvpwWvtzYCZR69KykC({Md6*tTlm zA?eYpn`_eNZ16#RNFH!E58zi`Xx2-GJ780(%(5AUZ$J_7Y5CP+XuZ%F zncoVKHaxg-#s_9Nx+W{>(6G5ku2`ExrB2jM?UvTv-Guv<;VCkohiJ1G`kU|&Ufs3C zu!P$hKB4$i-S7l{8hz+78cy%&!L);^6dW2U%vCCLb30b@o-JlS#UBiU6-3bHdv+|= zyDB;a_sq53c{WF@dT(k6$8{I{tl21skIO@5d=*Et8_&)+kK$JGIbWL^xbp$O2WdmL z@K<TmzpL$WGI7kTv6COVr}iZIuuE`Mr5k#fVvrNAHd(doW$)5^ zw9m7}%gWJSV4vdI8eA=n?TwhD*7~w&CYH{5#QIre+<%Hc7zz0?Ev=T15weeP_x;|q z(uiz_sp@D5rnc`+61NGw4(82Qi~K-ej#K|&XZEY_br(xacSi{Rt6 zn1MetM&Lnumo7YS_B5OFB9%C>%qOI|{4xF@_XYz@K3!=?D2_8+;Ow3KL#(&DXUF2& zJy!GZF4enD>hnCdL1HNmHq2G<5K4-ZI;5|GCtnu*`W?BDtjtHu(~#$CrlE97(hLFx2ILV%5>UM-uxXQby*#Qz8#2`@BtCbQ}azlQVD zj#|Yfo;{_+xsyY;nb@f7*NVOapFTZ)dN7(dxxvFW{Kqk)ig=yf_RZa-56?wpmb^#c z9Y0p7;o{c5wKt1cWQsoL=lFw0qET7^X|3yx=fUSf%p$k`30k z_vbO>z(WWqG39=OKSzU+KdJXJ5uSjoy{OxX!eFvJCVFSvKQxRU)GoGqr(~@Uql&56YKlZ*)*2}3ZQdO znzPhL_=8-FOluj^ddSNyvA6TWH}SWne7cv)S3B)S_GC0Ux}}`qr{o}e5d)6bt_Ns{ zo@KJJtIw?cadq}e-RDMpqRIV%?r_L4J}jL3%Yg?mUj4XN@cn#Sif;aaJyw~_;(wJd zQ(xk!s-0+(%0SO6L1a>iQrXpk5*44G)#D9l~dp# zxSH?-w|*M+jn6S>4*ZXqd+S$Kkp3AAq(tCs zqs?q$CZZ*%x+bp%tAVo#-f=BQuCH+@fse&Ca8tVQOlwnVOgE+velkHDR&C$OlQ zYY*XZmYGz3W1<}Al{7GvCp0Yo0qcCc9@b`7j*P<)Bm0LWn<-9L*z)ktlPxS9;WZOD z3ELz#Vfv7nJG@Qc_OhqzNWRQmZekCA);4PH`7i$ahrIv%uI3x+)o{Q3&w~!nT0=Dt zIr<~}6DPwNZFuy&;l!VxD6I2|^^e>9JBc!w`u=C%{Vt!GyZHu_G`48!TG*`0V%j07 z7{bg|c<tiQIP$O|2N{Idehy@&T}>J5O{0s;mo%_@}IF4|LuDIm{ncBvt<@y-tf=) znqTs=O|XAa+34oxAuR;uPkUy4=D^{^Zg1*kD;t$!kPWfDIFv)zF~9woJyCUK{JBj3 zdFTD>+3*Ly?bwtzkioQ*Vb!O*V@O+7O#7%|0s{@jFc&1X+LJh1?33^h@<|s$E1+Ty!t7TqQLI)1yNE;Qaws=FiMqh&{CV)!+gSiRQ;>Zn z>4W23m*ZZhlbHHepVoNy`@O~iYXfy2%HwQ1p01q3;&i<(wgt%M(0oQAhG4q9^w>=t45oJlF#+tdS>19WO^LwK0)#8&ARi>$S*(p zbBD&Qzjj0$(agl_SnvU3c-A+?-?9yV%_|Deu{{^OkHZjUQ;Z|{D#W(*;}3$zNkL)}Hb&vd;KxOAAhV@Fi8yKd zb}VwgETb-5VaAK>@5HjxSXrIt+2XJi4n~Nb8pMtrYr#zd@5FWwI(=-NJnpG^`*Q`M zFZtRX8gr4rJ*#+?A^N!bkiiC}8%H}Z#=UXNsowJ4%k1dBYSZnaInNF<{eEp#e!6{O z%iw6C9L=~Wm+Ry8BQ>zA?$`=BxmjYgd~{~COXYEUdPy_c`&v>TDGT-yY;Ro3X-i*; zy#shS{lm0{EqolEVA+1bmUj!Fp1rfUX9wbd)L*&W`tHRmi}`o}bg&p+JDuGlyF5RO z*o(BJJ) z{<2KvA*RP}>vV(oj&bZEYw#z^_`skQp80qV`l7F#ct_w;kG7YCyF>iJ#e82u%MV9b zD>$uRw_rvk9BxwZ2m7BX1y?b1Z9A3-)>Fhcr2mdvuFYK3@p`LS$3C@sXAhq9xSnm! zZu1lzK&NubruL#tNJCVZAQ%*Q4csC$Q|(R1$9E``!9FKwR?b_BKj?XPG)fbf)eSw? z?0LLM^%fs1htV~MO;f)ymz=>{3aHcdIZ%hq_+-eut3 z!I8qK1NIyrgX?r3R4_OK+{goE5SH5=dAZGWnoJevGx=tC#pi0h&z0(pXSUydX7>3H z@&^MEryV^mgJ*x9vf5~D7n8w+1>`#EUkh3rvi+Ky*`{q`NR@iS>prw^hp|!RhEH)% zvAv^N$=rLH!uy({|B4Ow1t%v>{MAG6*z(XAOc$T_IpkX230`q>JugrPsq*LegMmQp zc#Gl7!a5P6KgU>iQ`LO9Js#c0=|<)GVEw4i8?)Z1fgbGoQGKBGh`cF2@3kQ~Gvgeb z@Rgpgp4IatanITl_xiBFpS^=LMb&2XKk31qqb~$h=S{omRNb`Vz$cE4QE-|`3ObM5gAqZ@f5ZW`mfB}|R>pdS%G)!R%W!E2#8 zn8hN2a`=$3h{^rxd7IYPc!95K_pwv=z3I%Zv`;tm$eP2C@dv@7I+sF_C7E>&4Rfu{ ztlRj+)E3FYxKs{Y4z1*deGxt}*9mwTZFUg{a!AZq8%&3Csb4MndnDOI`D?sz0CAFi zK3AiB2jQIUSGUA?iM}qG`Iw=xo?TsH6o&Gj;|~UkLFO#xW@N+ViW32pXVr>L22J@R7aKI z=$6c1Gtc?8-C*4xt^Iw;mtTqFXX2OUU}H-#`!&wr<_xa29bI}Bdd}t8{LFri^IVwr zK=!UVLPzj;Ll>A>kK^m=U{9N=PS!b=mitvM<+QEUJ;k~x+b)35>OvIw;}FU7-0pF_ z52tkpTb8a(ig2&r#UEtf0$!Es4=0$ay*F&&+uAXIkY85BM{_(Hh8-u-tMyF&Wv}Mp zf}k&h*hIAl1uwXISywg`opnq>%>TdRKi!YVB)Mj9Xclqu4ln188W7_Z>@*ePP*>{P9EHjMk0;nSQIjQ_c8G`}T93IXfkJy`d?+T(j%sBuWN2Wtm1SI(rjZ=Vv|ZS2yn6_Gm7 zUx~nYpdTLCX$3a7_L9AGdrdi{`=b17Zu~82Fg>Tq5BR3fXH@2t4Ay4G`@`^rPs>BP zIu2He*Pa6(BnfZR?i`oFiu~*N%Gz~J+}Co5hYW=S-`oH%0udD7)`QdMB56(*dyw2P%-^8sj zdvOT!Ie#-}{7Kml;VX$=Fhym~*LoZY;CI;_TsW=Pqxli~qQhylie^{3c}_;H(sHcd zYk|;4{j%Eb(HbU69!K%von+95yY%6&C;TbRMf^Q9_YjA|kEOxq+W#ck()b55gu-lu70S+y?&u?PXRpJjw8IrDPf z^6LmcnolLxR`7eB&nSbmrNv(}W#QZr3AC%3Bm{Z2*GvM!aA@& zR!u!knj-QTW=*AZ7Q zl&a*hI9(~ zJ$RyQe3is`S%AA*QCuIeBQR{|len|+8~H{XpHW>q&^}kv4wxUXA}1k zJ{$O($ zdx@zRjcqi&${`cGPWb^}gRhCL5uDj*Zi*)rYCSVvgBVlf7kxsbiK@7L)H`j$XDzQY z&Rmz{_39p3zWm!(I7R_5lCo{XPCbx{ZweyD0hXhZQ?j<<;tl@&wBm%QpVePFM zE0%Z?hKJiZJZ{`o`rXnn{!G$f^XFaWB-;6~=qHI+iN0Z|&M?MyS_@EeEZTf@#*}xj_?E&R%7e=(JDpk0ax?LuI9J#zSY=aYbXEkQRP!1e;1V{yDmRhwnLo7+-|WyT(b)ct2{ie^c>t4JGFHC zq^EcQ=O~?@*^MI{m(Q_z#V51mx_Db9bBDB7A&%+lu^Pu%Bb)isk%f?b%SZHaj1OC| ze5@asOQ^SM4;&oa8IL4lU|pVl=F4JdeGl%OOK%8%wul82vEAYhZdqCp>kb2AX-M2b zn|uqmu@#Td+b9+pZHBI8dwkkm+>AJpyFuNG%x5#KL5Ko0b|d54XX^65?NRUFu}{Fa zz~_1qGnX|Fd0Z-WoUWcCX9fUqM!ov_Uf9o)UQ6Y$!hzA@*>vew!UlJq^fpc0M70gL z$Sbb*3)cet@fMTbv~j;?>*Rd_u25*rB;;W0fX;pY%B4 zf+-Fu`;iywkln;>HKhIG1Nj9Er-Wu}M)w+vAL9=)Pi6LH?I(!chd+zvde*W|HRDch z`%=VtrYJ{Kde61Wsx3^@UFX`wNu}?X=qvFaG3`|U*WNS~svNW6al_Z8eTaZ{PS78v z-%Y@8)j!3zoeahIb|yi^leIs`9}L8aLmgs02Ghrfq{CX_H8Z;yk{3(ZmK@0xiHUjc8<+753O z{C1k0x7*buSfQ2p6n{{*?=*fa_tjYXqVn&FQcq}pTZ8SquM$UF_6%+02 zstDE@-V&1&?(D0Bj|pr2i?S_}Y9 zS#h%;R=R$3F9qhS_T5UCuh}j^cU#$A`o1Uj`F_)?&X@Np@oHD~R;;{^I+60Ek+pZN z+gfLtkMRew^~v7H9?@V#5v;F+X=TisSaD)cBDPmX*r4rY3Vl(|f0(IHn)CU-eAYR; z1dI=*UTa^VeNK40Ow~>&r(2Ij`t>;)BJIY%t&%hRA*G_)WiVfSm4h0>u?8gO(evCh8utwR9bq@Savcc-St2Q$6 z6f&XZu0L&7HZ4z_L7AeJlvh)x$~oB0ZkO#*4P9>jj;)M#N zs6Dv0Do^FmegE7<{Y9+9QWbB~8#jNyXRNq~PA*x?AM2Mxr_~OX=cD>Mq`s#(og{IJ zx7YR){6=-8_STb`+ZZyxFAbBS{5Qs_oc#eKq+jJ;kM?NRtOn~&d3Xyya+8hQ-GE2? z#aG+7+0mX%SA=i+nKv95&TzjkojNtn5?}d$W3@lZ0tk4&5N^I*?M!dl%d6kfpEPe# zX7FeF*UJiwlKH;&=|M+a9wo>8|2zJR>@uYXF}BGFW5f4nFt7EW%A!1P77y`H{jseN zl<%){pn?NliyzUw)U5|bvh8X9`_%aUx9i}|3E>CdYs^pXm*$|n;*lt3m*Nd-{EFKm z!m;M3K+3hQXI?8Fme~XF%;%2u2Y#+u`uNXFBHQ(s%+a5I~ ze})%K8S!nl+Dp-!vG9e1hL@-B)>Yu&R}Su|^v=I|^Zrk5rE)k+#hu^1?gxf!?d#WrNpi)t&kcuMPJ_ zpS?fV^N-|c@1bk>zxm>*F+LP?QQtF|3S&jz`B;k3_L|4Bfg7C0>`}03ntc|95Z+?+ z@3g*~&xJAQ;l~)%YmHxhPj-9#UPD}k({(v(=9lE1_xPWia*%(+-Q%wxOJ8-&{Y=MJ zezb4UTw?YRl#P1_oiE=nRiPdxo2&(9uF`vw>F>(E9%@HowFSy4e6EISON}wgp*?7n z`k?RWd!I_m)K@>y%PkL6pJc(&2k(daGTJHmrLY*SW3->JHvRo8?<$9WlQ*ByCZ?V7 z(*-B+^(A$7S2@1goS%L!sX-VAX5XuO@K*i$Jx-J-I6y|zgiQr&Saf>~bKt!@lU1Zy zxq9`Jb8S|h&+esxCtRb`oivL11Ee%FPKb}{o#>bBNAd~AwtxLleyVfL*SgLveleN8 zZ8PC*>HE~WibH`fE`;pgW`ZSg`pYkHQ#0=4x!zC zuEy2NvKSvGdd=tR7L4!ea!gddpe8uk?IDBuXhW-+#FpEn3@CAvQD@=KVQ^3p4-Zi9Jb$p=Y|epI-M4`8Kv{cv2?D8(2biO&Oc9brPEf8y>G4dDjZX&zXIwQN_OHXdTIDz<0|E#zcg!``|VyoB~$1n&X3RaIa^#7;cQ!sBlv85-(WuIF2-)r z#k|?twyjgKbR4->FiVWp9e)SAz30J%%FN#+)!(O*<|qoY&1Auo#g~QiFc+^`{R(V3 zM&Ib?(0MHr@6@?wd{EK^N*JrDbC z$Kl>KYL%liTg;NgRnwf1>Y`_jUDBT*KT{Ip4{Xjn_x3zaIha4^EjYqj8^q5kfuW}t zx7~hn_42PS7|jMv!B=_%_d^(nb9`3s!|Oa7$Ck)>FBIJ_E2m{VhCRC_&A6AhbIxu$ zo9SIEhXwHHI#k`HI&0=i-?!x>1))8#TXkYl%~9&>_>hcC4+xn)Zx(UwY$%@%mGkFS zICpgyX|(G&dB=B@MHu1e1y{{ogYxGf>2n*8WsH zI1}QSX271U93lNaQUqPZKSKmAZHs=-_|_Z>w`hewz-rcj8(7S5=DpXj-XZQvY1*oG z8l$Onq0$?$!7BW;rSKYzbHbs)4>n-_#8-UP7MSBINUe6C*+OK!jP>1a$r;AarR8kJ zSPFIKkjFk%4(-ERu@3rLRpuLT9Qg8!WM^p|hW&nZ$J`q0Om5i*+Lj%7MB~Zz9&_TA z9r})PHtvH(feFI317mYvCGow)i5fgM@KwD9amLMU;OQJ`g);--b|=hR_&k7H(nj>LVWv2B2C>S# z6FKFVcWE0OdM2(P`mis%!`ydRGgpgKyr0}sjTZa-m(?$Pia*F)S-Y*|r^Eh->+;Mv z?{_wH_gFtZkB3&rJ7+ql+OWsE5gwt%$+{xkwKgTD;Fz-EA5U7Rp!woAy@VoR7&f*J_K4o`Wd@=dMfL6+gxwMCT>DJ5Fn-%;M(uqs+U+wG4IS z>$aGU=EG~Y=dR}j{mvJT%l?blgF%o%;v-*(B^qDCbtI4QYS9_JcbKaTS0ujXneh|u z9x~1IYds1qlJk82;O6CPIhxL@ht|!VCPtIb@dp#~^TC$EQS-1IPo}eacQSlc%EO%# zPiBb~5g=x5%s#JLECu7lJ`W31I#+>cqL`_peR|3a^XJ^LeJ@5Lx7=ZSitKdm)1HI1 z2@RKfrx1;8BdL6NIo(how29mPzT|7)?y&j&#pK(Q*p~#vjZ1`e{h%XWU!5}oA7cxV z@uLtv_8QgMKzJFgF?`sQ>)FedSE>EX>P2dc&@MadHv+|hbG~@3?%losHiVCg*_-~D zSnqrFYShn{|Nl3ZBMbp(W8XeR)$hyYTb%cR9v1?uk@)*$hW<)+7L6B{#JuydO;c~C z9BQJ^BvUuetXqis~?%$SmZIqR6SxiD4f$bGIHD#9Pi^3#^f-@^H07Sfpk$bRBb2A?wRv3M1Z z<=gtuNX|k;BCHq4zrm>3w!kgSr8f^;EEB!wmmz~8Z7^Cc&K#ioe=NP*feZe9nVe}V zq?-K$uJ)r%p4N+VL?*Bw^m3a+Azd71#8Fe9Qr|kEY0El$YDar@AOG;rPN9%frw@Oy zJ${toT`wxjyF5_q1n+&PpK%B^PBedYuLai$1vr==o0A**MZ$IITi~1z<1^r`TIExc zx!AY&acyHS{%ARrc|Y6V=8O0Il_*AfV6AJ@pVWu`FfP7|M%`au=>_Y?rCU#;xhq_~ zbvHf@#O?IU(QA$xMfeNa>lm!y3upM`xt6QHwU6FoL(hCRm|_!A^5><0d^UfiAe)Ix zhEHZ}oAJ%~=<1K!+LOFdYjMBNnP;(AnZEQ@jt}-Lwa1^B&`gwnt64W#Q~e}tK})!g zFZ_vj|JPa3M>g59e4%t*1)FV*@=H@I6I*( zdY!~1JX1E}(0C^1V%=zAu8Gg)!MSt6Q9R`DJWE_R;Sd=#^t!pjajG_9gRT1eP@>3dtVbE>n&I>OQbEepUh8H{5i(K0~_hrE`T!SGBtA(d%HpQlHElSZuJxE9gyy3iK>9{6MBh(v<;>6C|oJ=iQZPGM;&aemP>?hEq=S8KK( zUaSu-Yc#p_^Bj_#Wz!xddQM}O=(O%D3)?VUVR)){a5b(M-=z^#tJbfYcbk>OVNHNA z;#;mLOY82AP5aZgKGv^flO-iw$_u3j@nMUEI^z@l3I7FY>3T87Wf9ClV=egS$LjGE0v|v}Z9(~7#L`_b5h<=+eDoDlaRAOH z?v3Ji!6Qu1gjL<$U9J=B)WoOSE!L+(Y1w~@e3i8{k-l@2Xj$kD!0--W6-GHBOwI zOla8H&3CNheeCR+l54fVluFY?@L0XN=t2oA$i;1UeW6`y*nM;CPtX+=wgWfHwI^_= z!o#OKeX++OW{&(C7IX2C3Z-H1-o7WF-1t-c!Bp=#Ax2!-UyD->)`n2=aCDpF)rfkV zN{_iwNk$Is&=n2Nd8=CJ-m)$7L@dFL%GRBF)}rHc2U}D31x_X1S3alQ%ct9k69UX3 zR2G=X0-QR$8zxrQZS!_eeBMv-2Z!;U*4iBXioMVt4c0rnu6BNuwDXfIe?t#|naEx? ziGxg^zh!gy=?%aJO{_$IyXi94=h7@2BrKMfaqwxE;2FXX_F9aW9k|e?gFk?DNZAt{ zOuSfP9!As$KE)s0-dAwO``}+i=_@qEJ%`xaFAh(!HokjsZi}l%gOIIunSKNw${dB= z&FjL|1e^78wLaserp;w-7>%(82HfnWX5x<;j^T+p?J@z6JLhbl`Dy}oS%E)m#sK-F&L3!@ zhKIAejgDnIP>Utmn_R#R!4efG(jMW5rI?V68|&5GGhO9Mk(??AFg)LktPcSf_>e|m7IO~=tc^a zXqf5^l@D$pvAed+GG~V zo)%ZMW+b#;)`-z7qwa*D!{PL;tcZVfHzW)+3{z z#|!PJ{dkvJZ%fBp88?6-u?H<5%VAmBV33AS^jHs;rSd5q0qdJIyryi^Zf*kfae3W5 zbf2xp0=&*>KLqjB=1j{&kdBB6I=7h(o~DUkN+!;Yj|=(x=&cVMnSQIamiw&IML2g# zY>hSt@zsu!goNj4xI_E&{4Srm{qtZrkbZl>C(2#WL_UGdyFKbE>GwIhn7Xojn^lC5 z@ds5$y0G%kYx#OR#zvxc;w({4-n{|q9WciRY{uXM{NL3JzZ`ZvxXSIywPtnH^|@X8 zI#8Uj5JXsLCk8Y7TBC);IdDr1Ag3(u-N*QY!ZW#^X;;%WrkPFuf>T&d45#CW@=My9 zGDspZ_rQltJkG_7ang%{m7ESy9CI@%&>sAozVKRc@4V6OuzWE;h;yX&1*7MGQ+2F0 zU!Up4uce>Z&HGC4&v<{zmdf8)x#4wz*D8HsJKM$h*xWsD=kTsrg;l<|pV#m^X*hB2 zCNR%eJv6Q14i1&~WYEz~G=Is?AbZ0H(;JU^V})PkC=GAccNxg{_iL5oi+6YR(oQ;X zOxs0gXZ7<4s-mAkms9*stUc4yN<5(J3Me&F=52V4K3+#Je$NAhlkae_> zWJuKb7B|Q6Y(J5G{~AC0mD=XrKKkpsy?%bi>+f=FPhsqWkkCBH&E`8 ziS?%Me_dqD%RpN`X$j9>^3LDq=+9(YJW1gYw4dx&y7uRiU+Jb(V}55Xr%&_1Wi*hW zp5ctMKf#ZY`_1hl)FSsF-;7b}p7VqFjg*lG`#P1|;67>(hccLUG+es8zR%uV zHeSx(#OPCbl??Cht8KVnh_(oFpU)-Q*Jv~7isXrMpgY0bqk7Xr1=Ib%>QcU7reCRy z@@Ldr(v|}0tEO2af%P)6ep%parthHfqKj`i&+zx4&tcN9O#SJ_ucoha6!prw@pJ!f z%D|b;8FDZ68?_7Tf}^?&1e)hysDI6tM~OK^1D3`|^O-Q!cq z?+Y4lx~5s1!kqnc`)7Sx->r_1n@ijuY+HSF2hmaT?eW6dz(wHNxpV9u@YAq?VL!q~ z-$d^(ByB5j2W-@xds@1r+eIjmC`?m9=>nO1aXaU$Pkx{*%spTIUE@?-xI|!do!MWy zoZ`#L=HBpeOf(6_!GqU@A&5MKv)OjpwctrA#-E8_R+K#l?5aR~IBZIuejl>H;4E;W zWV5pLf)4YD(`JwL!FiXq4du~B)%@Yq;oW7=+*ceXY=0(y;LAg zG)`t$)Ej+-{vsVnG}f^Df~_$gz(T}xI4@&qx|V~zlr{({wiIy{_uzg_bh%RKhg#X? z?6xGN9o&h|&~=56g4<@{y}>UL4oY~^mTY!G>_{Ii2W=tV!_6Jj|GB5Bb1*%ln``&r zfPiZ@OK8O1Sr@=`mycb#=Y8R|>PPVOgkLq=w^cuf%`56mru9=MGC||Acw54QGxLHp zWJ9fOtMl~t0v{{I*M$;+?%73KH>G||S!_5B`vN!=Sl7w6)19-oa%rM#+cTl?tKOQq(wwNtN+eb44^s)B3HZH$%Cyx)#t8^4D!e&0JF!s=GqrDrIykdfUaG?uB#3 z=Q<4MnAj5V*4&1ve8P=_BpIS`?KZ3*1EU z?Z5-84jRoR*UXoe4PUqd2Xfaq^*Z-;t#Dt*(ZM^wXI7lP0d2@D@Etf^We>ac!>%>q z8WHy-$J~G;z;v8%RcF1s*UE1f_MvbXF7K;Y;o(+O`I2-SK9tzs(#QAoZ!}%OoZa)_ z;r5Hu1hM153tf9(AXF>7vr>4Gg4Z-|pq-e*eidG!^GZ1`GuOl^TVSi7kpD3A6TZu@ zNy2@FV(|BtL5Ho?Bea)ZXMZ}5E}BVjZ5Eh&@cN-r1QNYv>G?dfhRqp+ec~Zn@zM1( z(^?CsGYj`RAH!DY+PTUm9oja}H}IJ7nAnMHFb?n!X^)}%s#uEPPP`_Dv&ykayeu!? zzVvq5EKHLj9QeaWVLtgmxpH@#oyRJa`V@b#KTXo#_pE!xBKwE#@zHozPlZr?ceF3* zW>h-hVRT-IQn zujlu^n?sK`H<=9TmFpJQ2Idm$Q~beAYJ`76s0xO|9wXH{KB~d?CAhF_tNSjM1)H>c zrD0-uOrNn4);8yC4LfOk1%?B@RswrYqv?1*V!x^u!pr?QX=ULNWAqv1+-?Y6OZd0K zL=A>jYlDOKmUFwulpbR0Vt(tmUwg=3>SC96fw7T#bLR8J7i~!6HL|M*htn(^?o=DS z|H^)03qN9y{YjlvoW#KZTA-rf=BgNvYlsZI@+E-n1qF?C<8ptsdD^mT?dx5h} z_&k1_H=1?10w5<){S<$2evb}4*Jfnarp7gP}q>SRVzRa5(8g=s7DEGJ8ArRh?Efn_AA3n{_I=ZC86(5+~`)6YcDE zsedOP?PHzmdhWw{u4-tF=JQjgPW9*Yucy` z_UYbpme`Fy$RG55;n+7-NA=yf5gqi#r|2kts}N^2SBuuYMPv5VemEC?UUe2U#|O^e z#?}&$ZBv^~&XeFJ5FKyzOLREC7e?1-n;2yJ8-aP*6B6??ziRGgqw8(Nd(IzUJbLHX zH}IMhO}@;fv`qlR!yn84+}}3%@h&pS+a|ojZ{c*`)F$v-h)4DyPID%(9OPf4V*6Mu z2Of_cd~VrzrHSl~lh@UwqqUYZxgSG;GdktP)+K*bb3fUEe%&7T)3z&{+dI8q^W3>~ zE;3I)5K^Syn`zcO^WVIAp8{Uu9=GgXv+(F&7xYI(3#%;|AK7P)TF^b-_tABKT>E{y zKjYchb#&pc`$2*N{~t)d@^486BR#v}wf6GzQD;~zc(9t>lBrxx9{Wyj#0 z_RX#Qwq1Uz0J4)9TM6}~=O6jk%P+V_+4;txwCuexoo#yks`eA3<~}g&*T-=K7pNR2 zJ~FY1NmCqU%yoZW``sqrfB4{wciVGG(P_{qR;s@Tm#|zIIpCNp112vkzqV`w~C;>mRPqy%wpxKhM4^ zRb_a$%U5~at}@Mf(IxBVdzYIZ3z8Va_B{Rmsjl^XPrdk)`qm%r@t?oJILJS(aoF*Q z$a#I)OU|tywCnumdHT$FhO`WR&hiSJB$2yl$Q&-so~lO&h^s>yoUD zXNkdXQ3m6rjpTE+#h24RKhb93Mc-#Aao0YSzOd7vbY1-V(=$gS&aLEI71|zGqF@?} z+Y%f6>RbcUK<9D{FM+sfiuI)!M=n~4?i_8uG5AyV`sy@#XSh`R$L?lVci?H#`_x2W zur!?y(G~gNI_a3RtLi1rwW)WU4tNv>=<~*3#ZH=#`@lB-JITL>p$6?LICnUc#{=0=k z+c_-kpty_RPQnek_Ha` z{RSMtXmFa?M&O3hf2Dm4Z_vaZ1Z%J=C&EK^_#QTV@WKw5w2P$++z_902fkZ}al#q* zgXK_tP(P{Q(>gE5#PKrNCKwd9tn8dKU5fTdiPxCEWzNCvJbQeu(BU+F34K@BgOevd zl`yGhYsE0%Hh~50LjI8rP3c=Rz5_056Wi}jy%fu6|CNId8vwH}`&5IVo$Uky^G0P$ ze<9zLLovNNHur|d=z2ZR?bor7_wwPq?OZDRdgOV!WU8#&Me3NgSe@xZ;Gb|)tC6X@ zoJVupR%EU@q8sa^?wul7qjY0qBVl#>#Tq{+`Gb7ABlmBXg0AnMzp(!qEYRiT$YDKF}%vmX0s#LV?0^4+9)I56lIVf*1wT7W&7pO_swrO7vs~+ z{B7(N8S?0GZL~zizc%p_6;~9W1rz_ystqQy$_68x(F$E(WJ@PD+^dE*+~)L52kly8 z66s~qK~7HLU7~SziRZaKPqEDt4{w71ZW{hzJenr{*S`5^tw%{ zRi?j{i$X>M;@&W?FmJ;3wL?W049Z>I!Djo-GveC0;t-x$t$S$qg(pd`Z-_>!BP~b{ zv+x~TllyAZzjay-^c9&G&g6Y=yVk4KyIPU-5bj)>ri#!#7vE(9iP8WMNsjt^6RCH`)XoDd87Az& zvN4+B)6rYP>16&@|Nallp*?}|!T^Lwo3f+W!Ag)N~4IjNa8d6gW)m$Kn`dTacti*O2G zz1yhPh9pf4P-+izaoPo`XH7A9lD7F39^5TsrB8mS&q)e-ECx zYF?tdW44v@UNKBS%?=u*!b7ngwHQxu)(qwz-Y@R`YUey-&rq!W+x$Vbhmzb1{j;0) zQOs4ugG+Q~^r;bR6xR%)L$F68JGcnvulO$vC$Dw2GEeTDeY$uy*#FCL2Ehi=bM<2< z4u~sd%icbm1jp4<wvSNg)#k-^rw;O-hjt=X;LYR8h?Ggbb#`GfCy z>TUNjXCC=F)&qrd`^kERFGdxg4E$r1}Fg zrp1|~q<1QA<^!C0(-}5WoK5P1%CHxGuJAuud&gIo{jXwosvY1!gCoH8PLKDQQZQRQ z&L`6zYo}HCPx*si*n{6Trfl>v_UzexqT3y>(vR%e#4~=bLmBqDg8>0fwQs*H$N5Ar z5R<<2c~uMIm%;c&(-|KO=AWsXtFb3}3~%c++Q=>JR`_gqcdd7|rv(SbPPY$Bdo{VI za#m^hfNvKVCr0)my$+A3oi1yc`iXkXzfSM=_}iM{pF`hchW)P2OeNTU)8uH-ss;l! z;-q%YJIe|!`=@rQ1|jlN3}4+?0be}&P;eWG#(TpKx4&A)Mkrs}g$jpJEY)|;k^C_- zxgJqH&T}5bq|5h7Nv&Ch!?U$XRd&+@>UxqEZQd1~`qKSoz8SJ(Ow%tIW+zf9NF9AnByMbJT~k(Dl?}w@=iUA@7Mx9hj0yeYsOy9wy&F>HKUbUqmb!k3fKP8 z#xG#=x&a(8-aI&joBLxEevxng>}2>*@>Np2Mmf6&q~WJd<=8>lgD=jUX?BFQ_5k;!0ne)iTtMZ5$23 zmRFf7`zp1^1U#*ZpA-L-m=_F&P91%Z)qir&UnxJ^eZ+j9P=5LJhAIkBgUCvgi zo+?J{aiia%u*B~(<0k1@{khMF0%TIIDHGfTNA_6Ttu8olSS3rpH&83m+OCR@HIdF^ZEQe-zhKe zc4XcTn|%f2mAS!NA72k!7!Eq*;xBxC&kVqy^Z)x=pRE6XcCEiJ%m3}YvE%6ivVG*i zIF}xLyE|_vgLq^5n0os9{rC7VfB4{k?|S8u-*d{(cGv44`S^!BQ}d=FSflx32q`bl zhWTxfIo8ap%Ky*nalh~T{J8f&T=&2E;OBjQ*1JCc`+L31^!+{Ne#*kS0H;kHHHXF`!1@~(UwtbmHrd&&)5KE3yb)B zJ<5=u`mr7v6Z9z-N(a8V`jo@h<;K8Ixd#{ebNPd^WBIlh8X!VpBJ$lA$H?EGk`v`a z`xh`7o$vLYe#GC=up*z4phIT2f%t3PzP-FU+-7{-%x`oJ=}BnKR+;qtC-4UYh7+gp zD0{2+js8Qn7>7J41~d6Hc~ZS{_A>R$_hmQI=fS{`*I*A$A`J8Y;(3`_5FQleRC)b9 zs`fhXw&Ayb0)LSD#SW%%@UC<1=S;n+?%of>1E#!`MPt?HbOwSZ#)B!V>1UT!{eX#` z^;Ex8Qn~+p{vdNB8Plyy{-{E|)k869$vgXOIC=h9cG%?g@~KLBx^`-X_#hFC4JK}) zUpwJ)T_|>I(fE44-7n{XqvBMUi*auE>*vqq55i+H`8M-^F;)_B;z|CZrUxRIcw;8Tlkv+R~RK1$f z)cQ^QL2UPG0}4TZMu#U~x_0Nc)AH`ZlM|+6gE^tsN8W{vkYDUWifbp_%3w38sj;iB ztJrh##kL#7R`QsCEnywv8>+n4pUxjNSUC$Z{b!U&8aq4r5pG5v^a!O~uTS4m{JVMA zw8I*10$O%v^L>_xx`%a^)~tbymM;JO3zO3cze##>9zB} zkv|wo7bC>iDiW8Bel6@k{6S%5(rq=mud(_z9o#4SnU=LbE=P%A_KudTXIc5DiMQBy z_}=jPtN@#|odp(q1{^KS67;+HgN*6!B}%+WX`xDgHU@_)hL9RKoB9hl=A#ozW%h~u zx;4Jt(2JSY@A=ejnpn(E8~Trl$>w?E@VQ+KZqoV9V|AWf+n4HLncDwG{$Q{-nK6F* zDg#)jxU@WoA`sY$E5DUMS)N2uE7ayf{V==*JyIOdypJE80|&U=gfj}f#%~H zzjbu&IQMaGEe)RQ^k~scIki&*J7gd{e?%7ECWgiooR@BR{=4{t+E|^R_@x`XzgS{i zW}cljws82@uGg6~lB3S~HUqPqT`?e1zi@3za2#J?yW)0Yt$Kygz6o>g=$2lu5a+1* zl`><;e{_Ere-I92$_>>eo^;2Mqe@2$Ejym78dwNzkXE)vm^#a6$M8i_J zfp_7YA^pMhK-!4n2J)D|B}{pn6!!K9nq}d^=lFwKr%B8nUx@{ewNJJ<`qZHn#i%xJ zGiQ=-;uueZbz&I9_wBfDCl*id>lklJV|YW-7z#XyaYY`PpEty5siBD)?xXiQ(b(bj z-dlU@+wZI&(u<5wKFA+b*YV3?&Tyt&?6VVrY9(_c4l0=coN+$J_p5QOoeIP1an?Sh zM;Gw6an!k{FP(549LLEIu8)V6gO4iTb%Kh5HNpRA$zu52#7o{QjDGle&$tMKgU~+V zQP!I@Af!R4G!w_@GEE07JGsNNq1D={SbeUvykuqU^ar3 zh5ar3DmBu!)jJ6@Wq$`(miY>Q9p@6wRwCOI8vnErSo*aP**z?9GU6b<2q3osqxCk- zTj+7FAN}LAMUO29%ExFnx(hg7H?^c3Hz?|q6&#xH(0;$pAJn+e*~09_wJ)b_IO9c} zvbAci&g7kWM{$_P__9@N#4*hb>jY2i*E{!BF}-QJ!|C*%18bHxFnF`(rkv`T{3&MN zqCB`(Zfb1Wqz*1fd#vw_7cku%ZTd<6pecvWmyzIhsPn4)597(+Gipzg+4B-jh}E6- zp*oQdoNL9}1m}#6IGvs{)kwLV4bv8fSFY6asAtVfp5fE8_$eOet2H`x`VaYDJhSKi zBWr`Jm#TMrkog>cQ0FoXEQ%$e^S9|<(n|X7Z;8k@l65B0*kl$RX8TUJAKy{OqlU`5 z!gVjStsBfmc$gJ>?sJ3VwKO~>%EL}D7jd(>!*w3+IZbQ}p-pNyTio;5;qVI$L^$87 zLwtfis56o|*R98)xrppRV5dCcYgy+pFKkA2fCniug`nwlV*l zi#G7d?Y3e&9M;7NW~uqXzk^oTVXwT<#Iap$!UkOEUXskiY3U9M_xWA?L2L*d_;zkm%#yo_vtG7@8?txF#e{=^>6q{Q7XF~@P-a5= zYLFl0$sdz}H(v1OsJ-z5fjcTk?wC0hcgId|x=;DI%>zx?5}Sm-mE$+@2ep)#6#U8O zqdn#+`RM$yFTKm9&kyZOwipZ)R{dQx7I@}wo?@t?1JHftXc!8)x%@W%purm{#*cO| zg`ymn)rCFBR|3EJZWDu_KRiY48-s()!*@VZT>CJUxomH+QDd=*PihvkElt&`~#BkM|elx4pNm-CTfzry$sHnqVg zz)!z{KN$K$e^O&m4mA%sFy(mX#mrS|3zE_6I5j-o-D;W}M4A$r8TY3LZfB1|ey70{xM<|2Oa&CML;;I1r8cdn> zyZ`_BgJ#def5JYtCq2IQa9Ynz75z2-Gy6{3lyX?kPLHp0n9u$iWl%0nd$49^;C4+9 zdgwK4DCPJowZ~UE)E@70_-BK^Rylsu{mW|a_4wIFf5CnQk79~r)AT~W@-e!L)!6PN&cQYUMB-p+M;F)<=5Km)H{sSNWaeT=ORWMB?-r|3NTkaq#4O$$3y` z3*`qaTHLv4bUTf7$8HhrqSB~d$Yb{{^y0}>8J}%3U?%Ov+`@b|>mFLG-7`DSxg9h)E%2Bc?Nr-Ow^_U{W7hBD4{{Jh+s2{pg)7Vd5q{3GKAhiXLwJly{NKSf;m>)}w**hi zO7qd+QC%-PFA)0v<2%^9!Lr;nzx!?cLE1rn!i4y6+JVLGb};&m z;L5hSOPlNbF8-hhGw@~Rn59&=J}yarP^=ua3HD#Gk!Q!w-c~^lQ{vCT zQE>Ozconw{{B5=Gl3#dYGw0IowNB5V`&c#MsWgT8{x1GtjQEM*6(O`-)py`5f^mW& zkY6~Rt37RD_c!y7Cso+t<+g&qMtrn;n(x5p)c65k=C_`=YYh|SCB6fk$&9Tj^xOD@ z%t@2!3cXpQ{YhSmb=Oj?J7OccHrPzHc5_4R!l2!}bRaj*o2_hr>+~+Y!s!XLtay-y z$6D;7KemSBwTC;=Bfed5zqCKdAH+}4XqIbz71z8R50ZEFCFZBNY}ngWX9K4TO|=l5 zW^ZOrd|Z9=`CsOm`ovhqY`rVT?W9S|xGR+;+<1mtj>HKNEZ` zb6_9F&W^^+hxmi63GyidgJF>nT%a{g3$FB`>&e`qJ^?c(&*(8LzNY3%gXUx zqN1_wG5{V07F7}kg>Q0Pc-jOQZF_2u-ElqYrqI?tJdPOO!U=E>#aU#Y0<-!Qe^5L- z`Bc%jX%C9P*}!iP<5MyNYo(tP4-LNq!{xN9CZ?-5C$gy3@5LMV@_-P!ul8eIvyF!3 z`q1~h%h1QsHW(C2==Q<8L(qqA2A)>J&Z5{@m(j=ggQn_f1XB*J+lu8xteUNK%;Bpo zdoFDtuDs^b-lg3P%x>cRq{^;qH45SB_GvHr{d(m&N~}Zl8P*K20AYjRe{gcB_lM)Y z(1rB&^r_TMaSG9gM4K}{{uqDI?Ah=u#12iOU-|owAi4?FQvxke69W=I46A<6c#U4I zQ%r>dS$DOr-ZBkOF*%8;wwg8|9wgDBwHJ!1ro4lH#QWZ>L_f<7;14@5o8qtc^u5Un zzUN#VqYv^21C)XN9&I6CJ^iCB6ezh&-k4vQmsp$OTo+ff)wVV&l+^E@S-VE8L)qVh z*VU%5dD!!Qd`16m^<(_Ow`Syn!ys<~ae7(OsBL30TpQ)fr ziKIefeBG7T39U~wcYuLpmAA6Ebk`eUgxz~U3y7b|B|?D83K zxDW9MO`kAzqI%JZ#wkPMj_#(><~bZXCfBJ~>>j!o;G0h+Lf_nLNw3y)Nu{Pu=be3Xk@s^D+LQ@gu$L z&|IQe2CdU&pJ{VOPv2J$Tl-1fKki&|j&(UDv9Cl-XrfokkCOf2C{f5Q%-Bu;qAnGi z8_-_GTNh~GSo0m5SMmy5ed%`d-5IWtuZ?rFFZi4ML6z5HtTp2<_2J(hR^7t*o^D`V`Kbkna=5r+X>p-PUU`7 zA5nV{Myq;K`E#0E%;D9MXLD#btmAKor-ttw3*qaS(li3gqQERQFG-sCTrjkY7Lh2wI{@Fs2)5{ z5mVk@xQy%>-`4eRp>!&5AB~mWAa(;SnrAj`@Pn>6MGGK>&+rGm_C)DaFQ%{1UZmN; zIldg(M<3OiMW=eLx>7&#`IdI%Y)}x5pk8B=O}x0EqsVMnb~@|8^t?EsZ2p?oNRIP~JPVm%Vs9nlHE z7xWy|9mBDm$Q)ymFd>84=}UD8?E3ZDy!bu;WCqi}Fu`}(-!_S}#zDJkmV3Th(pQQd z*ipe5ERqv|+y+4D)Pt!@y^+uVcK)Dl!|VS4de8b(Ppg&j)|6Sr`4w~4b%B4-Rfu)% z*bY%#PXrC<6LC)`)n;sa@gRBcZ|4sR7kp!bvPtLIby7Zg)x+D4_qkrb9_A$bWGqlj z0L$Gjd)sF*;&vGvx?Qfl?BEuBgFpCdJ;;=QIbL<8YbNI8^~d+Q-}2>oB%j^f#cTB9 z5oy><`GUd^UVXvbtl!BWe3$dTJR7atU+d}JH)Y5By*fAh%aq?)TN}U0mllKDtg(-Q z{WT}O>sar8+pqKAa=gp-YkA*4Bzu0j{;y@J8GfDP9+$jb<6O#TVSriJu|ClE{+Ijl zQ~$qw=liGr*0X-+{agC(U%&sCzcHU`jrnt!4_U?uLmYEy4X2a!0?wH&QxKP_pP%>t zlwF^G|JM8Y=Ntd-3G<$%xsd0dbr>(qI`U_Z)VL3S4UU?5qyDa#4)IY#K6r!7oZ?!E zBUZu=Gp};4cr|@5ZR$7j2Wca(Iq8Sv$b3)v%({gSD3J-6sZ@t!MUinN6 zE!YR^N(NzK?0Bfm9=DLs`M<&+RAJ0R^LWU#eeLPhM=7s)*137D>#w)}@H~ZMfjK`z z^bf@(n!I2IZ>?kS&ewWd_42A4`q9VvgO&=&&zo|YeyW1fU)3&nY+FUz7keUOtJ;?8 zPyJcEHeqcEE~M>M>o%U}+WLd)gM)ROzC-Qu8~j0yg+Do@v8P3`OjBXqs|CF&uPIw< ze=N7ov!wD3wkmmlbrjk(D#Md?S*30cDRnMOhrM8wJT#11d``!g_=DV21}oDyyauDS z@D|%>Q^9R3gw9|H+SB&ZS|=Yy2N4bxdVXjPf}Nq+DU8Iq;}b2*$6a*Nh3aj258YbM z{o3lszQ!Lk4WE8%rQ~}^s$G^15Ih%8eyHn=mV|8^~;& zkD)u zG4eh}0^kRfH^T0EjM%BL1Z;2%#&2!%=a{w?QC`c$OEa~M&EQhKxYMb?cQm{~_*DsP zke=#?`Gc}UYlQdugZA@2^1;^d-qw9X)3rnHM^n}eU=!M?l*d_}&Gzq!K+L4X!~ zleQB8x0S9ayicRK7*2p|MWv5;d9F2#Bz zrT!+~$w&Evf326aW_yqS>e6WV3{PkddYHH{5Y>g@J~n6&_5UPp76Rn&iI1-2jK4_cawyn}jSZZdP2 zX2h?}f_Q+MD(?a3 z1+(g0;NyHY|KMxQZQ2t3gQ-Gm5t?vfCM>5d&0@E`Zr&Ax;P$DXMEzjTgN^bC9!}Ld zqzbZSYp_dkxRl#2+hso#X%FeU?MOX%SXRz(YHRXIV+-TeQ#cdzH@rIX4!YSU*nkaR z>`u14Y}@FkK8p)*1#GHzKgS<5eM9T+D0#D~2XR?K#6&SpC1y8wUC=zH*ojtmTn{Az zvBIVS_6b)wcWCu)sY_Uzp{c;NzqP58XA(?SSZx(OOX(+0mQHp;yPPu?U*Jy_htKr^ zyTCf#%ldQtL9=WM`nTiB*E%t$v_Xy2U5;eN}N9gi&>hC2M|82gB0SJf<3V za@m1TO9xfhW_EsWZ*sFlr_`y=PWM&rKz`01daB@7!7lYioqUi#NbWWaVGS)?WRu3- zkPnSz?shLG4AQTaz0~>xOy57xA;V=~SE) zS`ow?%zKPge#RSc&IDNWY?0jM(vM6cf!^o?L4#S&mI`Zx{Fpc zyzt|{y0?z#3>qw*w#V2DjtCyg`1Tq8An}J(!OK^G9r)6@hwM2lHgSO%bjLI~wUs{_ z?x47xorYB(r9<0A?{He&&ZTfYfwpM!y1XQuG`U{kHwxoaj@O4`NH&Aovt7&)YnHU# zMdguhl84dGIGtqkv6>V<#ve3&TXtZB@<(jduE5f_!x*;6r{JrXQ_i#=?vzW`s8vZl z>g7|c8n#ZSM}hZE(S@zErlGBIDKP@2Sd z+uHn&_Ba0XoBQ0^+2WZQu+y*l57k0xy&io1NcuaQ!W(gci*$mzZj0yB% zr;EN-Z|~d1`k}GycG%OhR)K2=UVt64*EV*1i9bkx_*b0Etmh{)@>42bBBe8JiE`0L z)K7Tr+}q6>&Yk=fneb+BIl81~2uxJF{FQhgW~ArjL7f@9K~a8x{=v5m)W@&;#$Boy zqD*Qav?1ElhG_w~#_7V{!j7vGEEEc%`8~Mu56QoKb7B)`J?K&gSCwD&fz3Q~_6`1^ z+R@vO{%Tu6>zYxUGI&!LY}T|9wJVwoSd_GDNp~PG$jxJr^=nnRf2(`LM)ovUwjb&c0vAJ#h@*6{0xw4Pn! zOrOM*(&qGj>V^KHG1xo)`TW5cTD#Mow@zRw=jBg$P2*Zy|0xF;&cE29bq@#Y7i{v* zb^4D#gheg)+<5IXRoY+dc%A>_ZBPL{JAT@g^ec3jb)09IdHo0c^J-V7GH6fWYd&!? z)Hl3qe}D}t;?o@-DD+=;sBd`n@dxz}A9Kf&1X(Qfy~D%*jU9hfbzsNQ4&a}Dt*sC&uYDo5O>rF~Zpw!*d0JeLFA^Mm}<{$lSM&JUxv%xzW9 z4`cCS_E;kGpXW|#sytbkGBd&q;SWopJ>pB{HP=NcGRM!5>V z#2=*mek+8tG(?Wd5ZffEbjmx3|ATw3^2N#RM*MiA?{)&h7y9fzs_0pg&kubQgE{1h zlb3B^S#ALx*t^kG1a|}L{1$&Omc-60oW-48zu9%KV1;GjQnSzk;vE zedQ5oldn&{Q?$n-&116eC?_6%?JRgKIBo-Mu*0*oQg@Z>BM`AFtH3F_vaicT_)hXp zyPXhz`xX9RsZ=_lfr`Ibc^&BstG(JbIfvAb6Y%g7g;~8l&m62-ve2r|>$Ah{LGCr- zpP2+WAspd#KDvyLCi#-@?zfEo6no29TI0pH_=E7ggwv`ms4nQ68H?^)q?~B2MXG2T zXQhdJcoYNI^rqaY#+QZQu)n>}_SlWB^rcQZGo7CL!>gNfpH1u0$y(>-Gkr`YE}zUl zNc;#c0Zq4Ne&ruMo9UPPcw4$@cwVk@pC<5)!pT++QMXfbVL~*=s8QcKXse*nCoRiv zbaYuIBi3cMsFdRY)er3|Ijq&^qiN4Jz8{_d8 zvf#@u6Oo3eJt|$x0s5lw3_r#n#17(%j2%DoG&X=w#S5X>BdxKu!dPnX*}|<|pv{l7 z&vd6~RZgX8eVhTS-CS4Il-tq%ySl_L(l$Itqoarqe%ioIM z_CCiSlutUB#tve)S}7BX1ZIf8IXVI}ru^g_l>RjNEYayJm$nPI*u`hMQI6-QrJG}y z_shVgHtMlMPtHwS@%U;JuyVt7d_KeIx{@bSoUSZBcxjC)4_P)!7(YvR+QQ$?Kgc@A zuec;{&ZcAVrTibx)q=OS;t)D;GaJ==Y8~xG{n8K(-P)PtW$C{*&pR9*#WgyYF5F=1 zg1mduv+M|udfj(%A>Cfvv>|ctJgiOJRk(S@@yGas>eG~4W1!c+m76mb>_yYm!Mcyu zF7tM!wz}QMz3S{3?QQ4hWhd}x_hX@52p>ptu3UYE!xc>rupHrnramaA>L8m1FANXx ztv9(oe`XciPfp176AeYX|1ticuqYWKT#8`}TTI@*<0BJu+kI^CbdWcV_M%m}jhf@x z;;_i0O;9O^{h^rQZ*?~PYrD#r)udg~W;z$fXM6Nm7n}2Wpz`R1E5Z*=-%n6y03W3~ zSJ|lx+DjFjUv-k4ZIcm`Yxm~VOOsgv{Vv1xWX&Z^FuT+9JS(inzrTIUClL&&0Rj@@jCx*{z2jo)vOeQVfu&R53$=Qv{LMa^7d*@ z-r(2V2i8m;>3N~pDw6JXw@r-3)}(!c13YK7MESux$sLOC7p`-4i64}?k@yQYjvic; zJZ#YweW^j52J6RSPg=bn;}3c|F{ZEoHII99dw~5~+;1gDSAS+&+x61>Qgw3OE!*c) zoScm{Voz*uj7WhC*0B9LL0j}zIPRi_(8v$tHh}co{^FLLL}5Gd;w5yy^bn_q-`R5d z3I3qx7h`{vdyQAJK@V~yn;(o3?`&{f&sOuhW{iVtyA=01a9u~c5PNa};OHJv1>jC2)4))OmkneCjtQ^|Q+7X6*;gXAZhJ*uXAziGly}>0|!3PQ&ri zvEhG~TiuPv4+B^G7=O@|&nuU~oz+)(pgjSW&Y|&G7l_&Lv!~^XS&L~bfak@W>=n;E zn{)ZlDK8qRy;|HUmp}>JQAL*w=%GJ7pLfq@E`5wYNHIBxVKBw^y}6vS#j26ROYIF? zwk9`>Y0rMRv7M;j=H41krqN0S4{*9R*Hp|4IBas|%h#gG-Lz`AYnVW;GE-MgnPYqP zBRuC*{6X&VmXewn8PostLfTZiXqiuo6%&cAyE$oVl*rb@bj{lw`cjpxA=qLI0AFnqZr$gebRCApTUy4!eo%d zz$S1RZnHFXpZ8w$bei?s;eD|ef28YSJ3C>_S${e;vB3S)6O&v?@Eex%muzW8>K&T+;G38bE7w>Imzsy zRqwyvuXp|HogX{iu>ktQS6?^Z?X@*Cy?Eu+RqgGy$7de3e1WIinlaWfZfh*mfi3Kr zeOv2g8<*bgmeYT+MQ{Jq@v0Afo%)7({$=da6zMlQ0bX2Vz_LuN6SnYvVK_^2znXE5 z`>nMB_n9Yw)H3#|N zKORiEnMeKJdVqBT+Ekctd;zZl{*+y>-*&y9U+?*QPl_X}z1EOgqP*uyJ?o+MfSD(G z=6)N>lzE>_0>c>|S&v~8nv3SWsuNRp#0X38;XC|6+KqmgIh>o#|7u6Cht`UJaRzBC zv@hjd(=~LD)ZgLTNr%&tt=tc_!5^PSig-@0Z@@6&od49=sn zP`(g8BRX*|r#Q{m5elMz?6oU$Son!S|cKBhB4yf{6ViVsEwGW z|FZ{{ZI&uWIS*QDH=OFebLcW_|4eX;{!A~)7$jRg&L^By#m>LlBp*=Q`~rWFUt!!} zKBsVIU!wkEfwhU7Y4SG6zY_La1ZwVcXv~ZX!|SLrxTf=itH1nkPD%1>bcWM{i{T@OixZoa!l6@qO%2o8n%3dKxC4U;UFdO5{(q6u9z5tHW z*Z70tC#QVL{W7+0ID7m(l*{B9gimp%-1vT_<468D!__gq;7ZLA{^qX1qk1{;#3-LB zh>HZih98a`ZH6<6&-g?9!GOt$!i`4L&g-ihGijS@vl?eZbKYS{Mp2bIcv&yHdu+_I<7PLwpJmyhRSgXCQTlyP9Q^l2pb}=Q~^%Lhxmh@ ze_F-mLAlBQ$ULB!ebX-xQS_gd%CU*Irl-fLdq^F?DU~j2+pXVMiJ09U7sOq|cPG2b z;LX%Wgxp1Se5(PtUj1~yqxk2=S--L@Z6|OVzWlHSIP{hr_t4cegNPs8{r$0@2U)zSt%^yr+)5m zz52J_de_`5*1VtN55C5I%||BI-Lxeizh~kw!1;ERnL3DYpF6Y%>53ZvVnw=~=T;?= z3p^&rhn<+#_w|$?idrmOQ~pkTk6?(WmVsuYu|52r=kn3Ev$xbCc3KwhAL9?2 z`B-b|kn$B_1a>L!E;tV3tMBsY-3>-7JbaC=O$P3)$*WoEil5y+JF!)w({)45GA5S-Qe>joCbP6%D)@J`$9N?43ACGS5CfUSaN*=IexDX1FBCLGo zUZJ1tmh0u*nRc$m{%;<-|2#A&$qv)s=_6dMhqqVqKq_tlA9;oRh~WR=oA}>p|L4Y` z*|rmbRuMh8lJFe->2OyMT`-UJZ5_?*>_gz{#)(4-`9i%?0x6vaI0%lq<`GCe2hORT|4?Y_h0)< z?9lonm1VJ!BImE_f<6(@{E$B_X7-`s+_0leoQ_>P-RL*ZKD?IZIyuJ?f@Y{|G&z}L z$mPX7mv%6IcYN)|3HC8(8tu`k(O7gZi_h@~Q_|)m4$0`EP$z0*G2h@CW>0E#z{z8I zFI-dWRO=ja8mBGX!NTO2j08rpMg*L!-;Ji{o5UG>U;(}noKO$swnR%&xPg08-=34# zPr8r7)P_&hhp?VaasD~}p!7J6@D5`y)nXBEwS@y|x9OwOpia=AEA>$YhF#+eP;=BScC%+%|(7x;e zc9u9fi+bc(cLn4?=-7k8OU+BiS|h~+BKTH-Qt2Iq`YrbYL;h}acmx^>|?lwV2ILw z?b2_^t@<(kpvkMGJ(abm^-Rd=;79_)a>b6!QkykpNyquDxH z_OW?qOnc6}e6QW9xyP>fvzHlpBJHb_x+V*$#w9%|IGszw zpe>p6t-(FQ@!i8`RsE&&GVG%L%Xrlgud~c1qZry+k<+6e9zu@%S+_!bQxK* zEvFMiuVF%tVY_-`XeLIcj6QhNaS!5Y51mYvHK$#-+nYSP0QHaY2UP{e&!%TB4$Xm& z%#6imp#^2dH;$Fty~-*#oZg6~sGUZ!TdrC0r<48TBAlEt(bL!XgUpTcn=w~1RsMDOtx~XG>qo}7eMk5c5AmWr4k3PMbgb9eK`no4 zuOjm~xn8});8$=}$%||*d@cW=Su>h>9^cNkrC46`TnV?!lmr*L!DECWz^_@rf3g{h zNTb#&Jko(BGx{y@=seLDjb5+$mfy`EG`PCPV;!$CYY9otbb~H!eDky^x8ZVn{nl$+ z_OrO{j90^FXH=ms$k7YG5JP3N+pT*29nAfE{6WfZX>QZA!DDWhgS!ziLoOm0-DKx6!2T>=T~xy{vk)sSEZz;+@@WLN5{!%9&0?(IdZ&y z=};WVJ2$(=P3@1s5?=S0LTD_l;h!^{Mb;(;7gXcXo*rLn$QSD^i>*jK-My6a%}6|6 z8>JqDT5NhQ{egE zIL!B|Jo=nz8^XY4n~%Mc(fZ*Jl-tB$;zJDu&^h%rBR-;#+e>oK<2jl{evIl4;uf1?9lzdj-R!y>95Au z$luI-ohuI6p0`JEKr*DjXu5510DQe*I{3N*lwCelX+J8SJbrq*X?#ZFQHgUG0QUsv zNux_<>;ivq#aa6lf6&x{#!b_3yzvGbEOLzaQmT(YuDBc=lII99?ebUi5SD|+zuRcS z;Z%7BM*oytKt}Hp|07gE)=vH|@9DC`Dm>d`e8u?0j20&RD#yjY2L|ym{-9~2vO}0M zhiPBLPZ>^#uUuMAz>4v0X3(8ogDpjL568}`kA{@tu*qL1KXwKzO}j$X54vP=7Q@cy zktq}$S6Zaws+)l$No+aypn?71DDYQ5#ve5Gp+08fa$k6-Vnlq2{3CK{-pE-e{AvBx zc%|I(U(=qzZ7+{XY?~;rZKqN3bY8`a42;mgWZa!$)0#S|bjS}B98`AcQ*$1aPs|1z zw2_peEqi`wK0l2A^{&c#kcPH%~dF|GlWa7ZYk)KU_ zYdj~!EA`ln^zcE$QA^*8ldIDKAFR5Y;`qKUmM*KN|JcghKgJ(4G3#b*^7*x2lFyod zazS!2ci;?mXy59;()|^Vpgs&fcx}x?X;8n%%5LL#CO*6fR9FllCEAan{W_n=X@Bjw z(>g~Vt3qXb?X`zj{M+REB2OGR2%nKg=cn=yYM#gqX-sNg%zxXK)~|t7p~QG1jpj_l z8)Jy4NV|-k75Hn3La&;ytP^uILT!SOqryJmhA8kmyV)-z*XeE5IzMt(zE^ADP`FpC zEE1g|dX``YO|%D_Gsoo~e2PDa9r_)wO=+Fyt-&X^xcad;*wU)SuN=uav~G~qoR%LbYE&>)odYc}E1w%{T}>yLG{b!k0A*h@P*z(1OF9d`k5 zvb*^he^B$Esf!l<+;Bbu(R?m^YbPRROoUs_Jlq&h)4hE%z1KW3A@>!&wI*%Cis!Gj z#XZq7c@o9D17|W^$L9gOojId(z;{&~z}X=VLwr2d1w2Dx2k5eTFiyjDx^%tv zwZM*jk#@FyW-fDb^(~dV56&n0qF`&nte(N%=lFx(T8i~yT5Zd3!SPyl7(0o*Ktubw zY($ZWJP&8#$1pl815eePr{fLHT6}8J$)Hwumkr__vQhd8c?Ze;=y7Plnb!^0TsThF z@H$OyQLt%GD-}L5c<3fN{~Ui%bwKRumT}68`KsaC5#4P1w(?3B&}~cQgSJNhhqq=lJ(0`0_bcu5EXMCw_su3?t9^ee~Eo+SFtlkghw*CB})+a`zw3wYnD?6e5n!@_f;Jh$?N{i2Mw})C+k3MLANr&&By8^K9aNPF?NmUR)}I z4$IdxdA!`i#5G(zawxh7@rB2x9+VgI@AC)oZ)izE`?5S7J>j3GyOAMITE&PJ$SXYJ)ZU5UkarMSv=S)QF|`qHHQ#9^p^D9@|%LS9%q)<;hIPvnpBrbe=LSaw#Edm@`D4sF&$V0fbrTE4;Yl%&IE9b?9!|FLmt zy-s`b`Hk+Td8>4hrP1jthKBQ5?KEkg{r+0Gbn2o3n=Zs!r`9}G3DvIo;PSzn%X%+C zT)s$eSErC$_r4yv4pJe|R)E ziSmw(urEcoR58SiyV_eDZWO1ATTdCy7-GH2@nLji^cA6C zj!^Hxbk(2UtK=Ai47IpD)`um6f>UA}s?}a-usi2$d+7wb`Q<*Cn+8vvX3NRg>qllY z1t(bAo8*q1kRQuG=*1ONIuo-*Ke2RcwH?uoU@dQ+kaXk?+&gTo`HCecV?|e|O-i}z zgcrysjWe1d3vT1Oa_VIV(HLv>>%E-IRhRbo^w==M2}hKV{doYBlJnYrevUu*YI`QW z&)7phq5ikjDMja@F(44gSsteY9?CM|(gzH7f!3f`xErXBrzg00>>g2nJJLdv_ZIC= z$3aFjY7JYnwg@>K;uv|Hy^rw+RaOrVpc2%kbYPojgU@f}l#fe12jWOg`;K1I2iCZ{ zpO7=3;?r$}5pu42nb`Ho>WsQ_=drBEM}yd7IbW0aQuQFLV8Huq1_ymkoWc+B2Ngf2 zc~E8d9@ygT%e^*dID^=wF^x7A8WnV3=@+J57#u{WhC|nV-Zo7Wmw$>qj&|E0IR?Yo zdU#b3-T`rnI??k1u9sd?O+0^%KZpgdI`auzRY`t1(9S-f0||yqvCht=7TH>%%lVYN z)2_~ke4*g4Rh3gz?MdY}6~h-`i!sjzq*JHV&zR$lb-th9*Z;Hhdp@8U9T$?*x|u}4U`>RR3gfzZ@FDv z_l~de2Y=VZfE5qJ^jJI)%zGcc#xMn;mzF|2;W_SKJn@U zX43kd`3Jo@k>BP}*?;Yix+b0t^NTm;nKI+I%AMg2KDbW&EdD%=iKg%xx0UZ+>mdHo z-*o6VUj6VVuEG4_ga7=}&wp%q+h(5eeVMr>W;B8*5O$D@W}O0y;@+D&5hqGqC=;j6 z*oQrE4*iza58{KF^@CSv>gVToJ~>|L+x1(&eCN;anBO0o3E%iByuE(N%^VqsEwCuf zIaGyNPxCf!ZJ;m2bhEZr%&<9rzEiK>cD>wRQ~u7YejrpY9h)XsAsKn zIV_78@3lX=sB4Q(U)r1c@Yb8WNq^@dzM8&EHmR#9zFyzOIo~B-E_94HWxvq7X)-U)HkIvIg-SwLH$ZzbGS>@J4dr!0fr2LfI z|CRiM!i2ng=^0{dFl$J&$JrYHMEJ!URNNd~)Zy;A-clcCnf$u#aXYZ2e4P?Y;ixq+WOcOknSnAWTcG>-?0GS zpb>RDamt7$YTLz^TT$5?#K_ApCj5{(!xp0f_%Z$I7UFTiWZQc!kGg$M0q`5%`<@@iY*O7ZVk_K={e~Lf&T9;85t)TcUjFDO|q5rsZj6YHLaV=Z$MLXxd`Q1(; z>9iY_e6TjlmU8=6B^^05(^ujFR3Fq49Kv;a4aO@B1zQl8i`U82P}+xl*O!Kq#tmdN zFa83Gnc#Hdem3}>Ky%w{Kg>Sbv=!d=ZytV2a|8Gzhaat7>O7oEhQ$m6rUZvwMR)S3%3k21m*Z z2Udgr;{^!6j;HBkW;ppW+W%Dm!a6<9DZj z@V|0)2`gqCg%e1O%Q`VY^Of4ktRV!VET5@J{Y?2AF?6 z2RqqR9&T{>SSO3;B1L`gv$q+KpY(eSoDAA8=Sap75Q( zW*7_XM|aKlT+pe7kM<1GhQ#lJiwE8b#z4EGEu!1`DgL0x@6i~DW(R%c{OBaG1AMU3 zy*rt7ymw7@tE1H*I%DkWcZRWgY<|z=C{ueft7P`c@ey2u`<*54BMz#Ly?eUn8xP72 z_fh>uy1W48)D`{P?tA#5u-(h&_=A+)tO2Rp>Z$ZVW1aDmoTB7qCO)T z5d%MOEN-alUVB&Ya&V_;$LUlnZU&6z8QmIeymRSZiO)KwQc${gvsSges*da6S#xl> z;!1VkJgZ|T8x>y5=RU?C1p8p?x+QnwHLbauF^TnrFlV^^Xg%(b+Rh~VIp(xV{+LYL z%?P+{Hp_jd{ku=JMhDf$hW5X?oZ)fK#5TDy`08tzxti!j`K-RuA5Fxoq2KN_&AarCpz`X`Up zh59<{QMWRUljt>+JMI$s#lvYN68Zmu)jXPp+@UVE-uG!MujE=?Hpg9=?_`42Yx)A}lVr_tATQx_hJJF@UR^5oI#`9@*7+2F5Pcr@ zNZNmzxG1fyLdqdXU)fD&`Cc_#4!6qIZP6%CSWFhtU?^Hqf5va=_QZUVLTj1|UN>lo zh6=q33SPo^K>$ubw??4fwAeRN3t`e15bYYRWH z*PF*9b6D7I5;t&(0U_OCipgvTwzFW_##mo2Q=gsb#|#WdC2~BB^T@qj-<;++=eMle4IZccI35S>@Flov}v3nY4IW*{+f!Dku?2s*p zPFZE>kL)#)?lW>^y`?vsamsv9;{i>Pe{?Unr19E2{^R^XvxZWY8Qz9CQLIVO=(EgT z;O(3?b^1^L$HN1>xPEs%Jv_0+ED4PM#y`FEKjqUsXFd9=4|hp_UlQ14{w}QJ&p6O8 zqoA^bwO`5SW-Rto+mq+F;NqWh7`#u#)$&qURBQ9>SO=Y(Yk!Izl+%j~^6Ypj{M)^~ zmg9d;b(lS|8JmQa`TU}LJTrtWs(%>n*dJ0MCO44Ej5ZJ$;$bmupHsd*=Tydva`g>U zEMb1MjU4!?@L_dWg9E?zPI|Il?St*F`LleG;`y-`&K0eCe{yP$V)-0#vA+G{L=5z< zG??51a93Ji;}5ET>YiE#>*rkiTXC<=Yo6u5HhRv&B?IMQ?L0*Pbc2}Ptu-b$Nk`g_ zZG68CPtQ`igKZ}Gv3!E$^7;~g&>I>RufSMOv5lWsyx)`(9t7COhB}p5b(Lsu&yO`+ zY>!8QFGbuC{O{t^2^#}nQl78X9?T%)cUK*72LApv{vc&HJW%b^b?-IqC}x40D3w;X zWresG`Y5{C7QwQ%9Uk6;UVma+Te#i!zm(Y$nY2tkvdLQ`5m-vI?f0%d_ z>@oGBxC5WBb5>r>4qBVwcWy;^Ud3@5;2?$vDSspWceoWE_lPoginK2{Vc=|T9b64Q z5*X*#_=E5Eq`r$y{%t9iEyg;xG``Ue<<6kV>2}oq4fa7hvDAL-RU}LPz_iik>||>0 ziad&{oAx<^-NLd=eE;|OgH(cS@D4D4pKmqa5n3otmvU|f^uV8<7*Yona+D=WkJUoA z?~vXPEp$VN_Z9gQGt%LuEv;?@#X48o6u617xi9etwKnqXz#d-)49RzVjKRvK_dBQW zsvf{9O`nB(&}me5i~7AYzE#dnuqLgTR3TSd)K@b*EsV1hd}h)Qga0Ux=ePKSiWf0$ z%hTVDS!C^U0^pGaY%n+o{WybuCYpEj5wuUU#ZYR0!1071)MBqayQZG8Q49gjK&ZaH zKW=uqUA=-^-IMpg*Z70nf7%jbF5?t@gGsH9-x!}eyln6%Fb}mY^;yMRRN9MMZ(J`E zADwwh?`?o4QI-AQLfl3>y~y3u_3bP!-4ewhnR!#|;or_5^owi97^|_C+`7?A3;oCT zT{sT)K#YsgcqJx;vFF}8XAt==98wwgvRY(c+#2||U^UM!@yXyeZvO;6itiI#5Usnf z@dpi_%DRLYw^})7yB+x1hF=b+nz?v!TUn=8LUTxSod_?67dHmSZYkT34=BSfdQk3S z17EF48=Im>xMHEm_n_RY{H!vu93uMvbu_Ywo%T+Z}A5;=Ei)%Z7z0h zwTY+bfIFeV-rm>hBRuP;QKLEbhZ(OL%Y=W~pXT8^B+1{mTkUQ1>);1d)-ig0b$F?J z?!yiI11CsTcopjsoTcC351KJI7APKL8wXsOKF)6|j;hkGjdHum?cT}^eDwWFV{M1e z&GAb8V14T(oA&BZaI;acWprr`r!Lz*E*!AHbOuP*YMyV)uki;J&q<7!HK{XaNJpNr zYSqVp>2$u51Qy}s9W7kgIN zUDt`-bxUuM2>>9gyr#wo`<10M<`;LZEr@f(0 zl1m(FVC8Vg#f4mNhSF-a*UEu;z4(7(Z)(A4uLf^k{6Tnv>j`~G{6XmrgKZj4?g#jT z;?;WklxXJXpwfmL_f-RJjy~~*0XV0H)@~6;E-4Cex9^wxIx>ehII~yJl(Sk?Z5Q6^rfc}B54hg-N5~3m@bUG7mCl zS>kLHe@fj%b|rBU`=eSo+l~4o^ZMx$?OBOUV~2)!%!kgxLvdPW-Z66>l|&9)>cF>3 zq;|{ske0d%;Mz{7im_E@@VLeMrQU0v^7fLn)#$)Cd#YBVaa*iG0<-EUx_WyLUl+YUHDw;EqJ_NDDDv8$dJ)?pW{hgOB_ zzT+Qm!ntkq=yqGSYcHAiNzKM;auZ!W)|2(;@(;2m`SBH)wTTKV>{BnmauwU`X{F|l z;Yha@e{5R;LSHz#!VBbU9^4+8$t^$f$L4lyyt8wM{;sy|1ybiSy2DF5vm?LPLm%P5 zKaK8XR=(}$a86}y3>O1vMFLO!&`UreDFEF*UdI>9u8vPfFy?IH!U@7 z{kVLSHMDH_UESmNeO9slpNDR{K1Zyj*XG$DstMt+Jf7u{-fMcEM3jwjh?_)QoZ$~rM<3!3sxGV= z#^|1d&%bkR>$aGBp@P_#=x_IDlDS;`Qp0hQhAZ4B0e-e~btbiJZdrLWTepi1W4oA- zUJk3!VGzzV%Cn+}BZ|+ak6#`h_mg_e@{M20KS;%d3d31~0{nIS;8C*U@;tWeXtfaQ zJf_>r%_hG6u!>v{@ytJkKPVfh86UX`h%@5&DZl9-=mu}Lv=RHBSzPj=a$+}+`_GHk zWqzo+vw#!$$M6SV+@3@0l9m}i_@G{JsJ|23uw^d=Y8mVkW*s~xSA|(@o?I*n$A1!k zFjWlgey~9mUUl-u3ZJBwr#@)+8cR72N&bl%T=2OdiNHUDKlsL-X!ndZO-r&~WZFv3xG{gL5L^EC4mFS)M6qK*Cr{-Cf*i-}Ht zEd7>#-pq?;ZD_c3e)8{fQRR3&gwbe7=FRE@^bu@0z#CLv8?7h!n^`OH{`Wbre;0qy z>}ypX4)t4cb-nhlwW8WNf6zMXRhF&MJ|F;^>sx(D>tS*PQTXS&#GZVo^;#1CF!zJ@ zWY)^Bd!zfKhxx3rN#6k zuQj9hJKmeTu?YVc*c6{}-3PJXM`>}s>Qw7}{$T3(H}eOrzY6A+pCV~}NZtv(Hhwz% zjodTFSMfx+_`^>%_@6OaIxd%XZiQd8?R(*GXl^LKoa%&oWZq^z&VBhje-LbvFUMES zJ>QZ)+~{vo*1zs4*JYRSpCSrratDS|g<7d|$tSF6Iogb*?$Vn%B(3MR(Mt|uapK3@ ztr4Dzuki=DPe1s#DL!^>LmAqp`nL|Xjc8;S%At!x-2Q5FUiQG7(E0K>6uw` zP`)@}Bj9U^jtgLgzlHe_-bLEz%JDkT#n18${-AVf@rkP`Y44=*C*`YzQ>X3XE?%AR zGs>eJYXNkm&iLRP;AzUYCjL{R?YIf)yuvkDpT!P}Yj&;W!!To67$irTvHth%ZQZGrFhBxz=e@UcbwA@EhR{ z@C3ibAKYqQQ~A}GebGwk`nazuaAxI)t7OpQls~Qtk5kwt*xyrlve#BYW8CQ_1;=ZS6;T9qUx`#bu*2Ld&Xy-e49zNHjR>V=!uLt#8?FtSLJ< zIuEqu)W5#LAM|ghe(cbkOP-~h+LHQn#gtunG~xHsuDXmC{68Ed3Szfg5=FAU0dVe7x{x|TbYGSpglfi;3~uCQd=Qr!4?0K zF^bKqc+BwA0*6%P1W&Ndrf_a_?TnsdbhMf8YZoVOjjq$V8mao)YySBTe^3K1oP7QE z<_;|`LwnHpN?uwU8V-FGUDia6oQZDhjOJ*zIshLe?+Uob+U~-Q0<@_fv1$3tW>Vy| zCI3<~XQL_lSQne$;}1&1BZYqR@E{Hm{R96#7(VS=*v>6UzQGPbJtrp$AC>_7XIG~0 zmwoo+*g|eMxQ}(t;iM4<@C@9f(Fw@g1ASfDoCC+Czmh$f{tTW|s04O*4Vjn4?NC5ySo=`xzO z!Z`-yhwEZ1IS19ZifC6#W7M8}j6cZaL3{<;x!`GLu1<{Lh+jJ-OzT#i-7-Gf&_9Z_ z_te$t5*uD@f_4NBL}ySJ;t1k5r#{f@dp_ruo9W;rL?>zkNa`9*UhvMKIKl95pF?3k zZkF7Bo;K{{Q~3uqXN=*7fp1Dnnzcrve10^l<4>INk)`{Deps5(+6tQ9Ofr(w{j7QnXE*9@b(MClV!kWbMmvl03+Pw6FU39N# zBet|Q*O%dOSvekUYjLr|*;OokJYLV`&1Cf0Oy&$?z1Ac)r@@&zp`D>2498ZV|6Kk- zA5`*o%@N1Wx#{j7A_gkH=@rMg|R0yNNBtmB6JV4Ycgx4S857PES@m?!5 zot`S>CeYlie7nql{Xyjvx*n44>pt0g)JMJQE#1wY+ezO&6J*XjEZi*j^qIw`>hVdE z*ThOIVD~pJQbYJM=kQ>p$wtKGlm)7%<_g!lb=NfFM&cR*u5*(HODf~fDf}FU#vO~wa zU3stc?*W2o_mtc{tdpJVALF_GqUd9LzkSa7%jZ9ZKRANm?D1$Rvc{+%JPn)F&jHkE zTet19=sz|dyT#p)E(IA_W`z=g8s~ose~@U9jPCl6Eqd{*J>7%!MZwis_HPF9I+VE!O;q*5UMr8rrDCBYmZeUDS`KVf&}GEB|&Ies)SW z`XpwZk0lwfH=h2a`Y>fpJ=*E?Futs7zoN0%Jexg@E_~xKZCTj3c#LMR_G%m6ctie< zpZh9(7kpj8TrON4rJQax93Nhs#^7>9@1u5J&eO4B)JcwFt#GkPmYTo`93P-saq>{T$lne*kB6JF#ZXHT}|)> z!?WO8CQeA!NmPRFS_lZFDT#W3Z;VeA&v^ zLhc!Gg>_oF%Y*}RJpoQ7{)^Ga- zYjLCIV4C9|WyA+R=bB3{zD~jT=H32C91C&{g7Z|0&T33~=WXyee5}$B{Stpr)c|JB z9-Mgml&?J=#g!k9-v<{9q)pp!JLq#NcVnkRedJwdjEcvdP2in8Jz$w`fxnNq?-}lU z#S$0K(_KthU*ivI4MEI^+EF9CJw8_W6OE=U<#WJ2Tyk8A8$?1R*qWd&_TozlivrUk=JhN22Njz_3^?%$S4aGndzky%c(&)l!s(}m zzez5qO75`m-$QU$3#Hhj8@WZV4`?{zPno=mD+F1<%%yoL9W(O#@fwZJZ}A5ev+K*0 zhM^0$mU|aLrxs0MH$$7j=c_WpDS|gOFPD&QoCosP4rx|yID~i8GC2sl_cpjs<_4!N zL!1D7y-cBF{F2Ib^fmsVS)1k?=sAb@xF|HyQ!Tpq78aoS%Ia#p6;ISsZ+p|p1 z-agjB!t~a!WDmK{z1>=!mihkm5%J$zo#>_Mrf;eI<$L@=##+l4h8HXjr}U0#Pw4fD zyX>sdd376hyOPcqr|>}TLB@9Lw4!kIFzV4l1^}aean`9%ycPbp4Ivy%M$oQ&x z{_Xrht%LkqpYLGrL$oKxe>98H%4W=hSFU)BLT`2N?JA`m@g>jU*{Oo%;Ky1o+S2MX zx~-cg_{r`0$W-&T^UU7e;MjJX=t$aRTKZD{L1MtF!^guLKQ-P2@Q+9Gy=XaeNy3Nh z1RAw+?zmaNeOM1#TC?2R&8F}Rx0?kc11m%C6kmH4TqX#XuoG7bA3WS6{{AigAo~Zh z4H1vW9IZaVcsZ`ky2(PVvYWeM;sL7S0pC~8HpGWjXy;2_+gbY0W$I?Lyx*2yXvg%a zC+TC{3mQ>y@z6~LuUTQsSMm=g3#tCIvksGc7L0sfydv3GIPCn5^9l8^)l~f8@-cT7 zchku%daX)ta7#C7b0me?WG(vp3Wy9`1|IQqfp3L6=qAB%7ht(vVjI50AM9Ul%x8_{ zGreYvT$4jOQ;g+Xm0`RSom_h@_+I5F-_I6y4P%%qFcEc5FY?Owtm)b?P%_vDhIc-LUet(-L|nrdN-Y?cD3~7Tl~SrEKlFa zfYC+Jw@{2&1fFIhKZ&iZ_->dX-(YN?tS`HjG`OsErJqIcN$Hucp5%ZerU9|Ef%=E9 zbuM)nVof{-b1SJ?w8#1me^3Fc_0i)*9&+2{k#@&mnU(Crjg*JiaK3ZyMeplCGwM4g z>`bzz9D|Iv8@FRKf0&$u;NlDToPKh7CAQ)Rl771hr?5)IpY<*NpnPbob+dlfz0HcX zo7EA?D7Lzt^Qbt9IW=K|iv}>%!J3&Z3K&^z@0;a{$9wU(^5w(6d$}BrTw2$Ybv_>R zhv_^$DBX*Lshu4>F5lu0zO+kNw=+=D4)EO&M@^%!h_S^6&fzN7eBhbGP1C)@%e;}( zYkFDP9Wb^U`pAz;Z@G1rE8k(X@~yF9Q>=$J!E$gJ?D@aNAJlrCvPM~(kl#uBLgP1( zPl~;*VyJzgQaPSR7Il7U+r+^<&(E%ScILQ)TW<3Et$l5s5{vTnGAQH@qd;iiFQjZM zKV5x`Kj_c3h>uozP5BkKPWd^fZcKe}zFAztzylQAKx**jfTmu)bMbCgt^WS9ygH3D zyLfr68Wv@86MWhXC zIH-U)vOxF;c7S;>gP+^>E{1l9z1(H&aqDtEjB@ATtO>T3I0sM3uk#1Rm5|RzhsT@1 zrjY-XE|!ElnevO@^~TL#xYVxcK3n=LKLss45T;F~M- zwuRTq)AwTo<^DOBQ7<0hxqX?&x5MatH9Ty?$Kzs94y}rQ|0;03%?h>ESNVglvcEZx zraq{X#r)13{yKia1iqoHRaQ^>w=sVtJ ze)aYL>v!or`uneTd7s1IwVd#q__bNn_)6juVT{SIEE`l#`N4lbfAC$lw>`h!2wi*s z{eAtH*OVE)#}JMB5O#PtPSE0wmfDu;hicHgB;N^ZOr3CnkA0dy$nW5rRy#1i`HK#~ z>owO+zCo2i_f(hy=lY!K2h_)OZPqdJ6Z>lPo7a5mGx@T4uimHc*LB0GdvVyfWVm+v zE^dg&31dz+Yopia^qzm?FnI-Khq+fe(Qk+k8TJ`n6E3N3Xuj9G^lXs>&yq$6pP{Wi zUF)E~`K^+N|5GOVhG(zVpn4zIejdMrKd3x_p6(;M800#jkNO#7JS-fWwBFjr-eZqf z7K+5d`_SU#EwrnrH&*E~c3TEllRxe~Uh({!`GY>?H1O^ho$x<4sGX|b_&zRti9g71s!YmN?X?s1SGFGZtz3sDPrdFh zWjAfgCx82R80*ysv3g=~4Y%&3kMCbjwZUY^zG~JOOv5Ge5Y|T5)%WrbzT2(pME%(G zWz*P%4Kn_dL*wWKCR1m+ZHD0+jMMNBy!=?;A%-9IOv|s0FEY|3*Ba-_>jytidB(n# ze^70}v=MQ7l{=P+pf?0}J&`A({IuH{d_M-il+Uz_-&zmloe}RyJg%nOzGa`QwRG|D zg^7!YJ!yE7;thU}Kd3su7;y(fzQ#BmIj6v&j6SINb(GiWi^^w>J!zM}3Bv@V>Ilc| zB;Cx6`z}4d2)^M2_|&`!mI97TZpbh32W5hp!)QO#T3+{(oQ7-i28w@H5dVPk?9;BX z2RocQT#ii3FZ;n;yYJK$Du!P=(Hb-mnv0qiH=<+u2Q-rO5F zH1FtXCMc8mjOfGR*EJZS!9?8jqrH#E{H1&`RNHRutEM$gFSvsZ;U?LCPdXr(3KFc#D{WD{*`Y|U=%!FU!y1G4LHkIS9P zFt^#vog+Sa`hQ;BV1qY{r+|i;#w+p_DIVZE{6Xf7WNic`$Z&Cl6-VG?-gD&cQkxJq zp1-yum3Yr8-<(OxSuYCiGdb8NFaF-7eo6V4u}8ZdIXBPA%W_U;sru!bDxdGIL>y79 z@VEGbe%4USdm0|5D;x)Zvur`j(nWU{{tEL!$-3+!gPO2dat2DHu3POqH;0k-f2S3) zuN|iz&u`0S*wcE-tOb6azrr7k`ya{2YOY+AZGwl1&l5K`0FDsoh|76tjWe;lFM_UJ z?!2ndFQn0TnUQm^1Fj}~ZR2FhHD{e1+E68x^9oEb=XRp)$2yw-7JsmJ%`2`&n7Qzr z8et*%VRRRFR~fjSiQ2GwO04Sl@ul76K8JjErb#|B8_wLN26kXeZ;;p$z60J}=4p}N zOL))F#kqoCo}7vw%0DPd3TqG6u&nLOx`XwHuzw~!u)#x(Jgu{zB%xRDWxMH_?}gM{omKdo^YgGz?cy_2xL%GqFb2q?}wP z#*};0P4|!MOS*`blJrjpQ#f>R0gGtwwrOAFtn3yS&&&dxwz-5?*QGCwO#Zb`TudHO>F{l|GX=C{(*`n=Gew2gl4tlk@rZ{lf2r)Q^_ zA_pS8IkYR+PvOdaDD|a>JE~Y0@djrHIMXN60TITKpR~`n!^iRu$_{dLdv<6)p$EJ! z_6_Je9vGK2M=+NqvgB&6jBC4Ud{;~5_tzPHKDkehuKg(a@1EHi{6C9lG(|UHQ5*41 zySLWGZ?9(IP4w>HPG-*La=UIOz596q}XK9qk@{hWcuFTBa?BHCx9)yG5D6n)fEhv{p7Z=-p!Ry;$6 zwQ8YX;ZeP3sr#9<7sZV|q^)4mdiadQ{MlT{n1 zb+QC+yK;A{AIv{!x;J}o_Wf#Of7xR8uzt&z)t)2SZ>49m(WV<&!F6u?M_}O^(%^7N z&jjA!aBKGCT=R3U!GG{E=sD!OJNZ~)7*zym$~4>&KIxOe9*dnF8`o>V;uMo zyoZd@gEnBWGvPSGqbzfcGRJ8X>Io>vE?A7>_ z^%D8Z^xFZ`oYjHZ)>*QY5$M_zMgcw)iyW#RX;}2S0;*`kN`Lge-O3XbTg)b}FAH1kHhCsf=?PP5b zy{}ra{h$QL?ifA#AJ1K28`~CAzI|a<{5JmJr*=iM>9;RDfNPR@Q9T$O>Q(+9?TW0e z8z-l}ow5$`J&yz5<65|8gsYtf+r%lb3SJAX?~OnBo4lC(Y?=`hfbCGLFYp&L8O)3km;aRXHBf{kesv(_3bqNH4yXKd3yY@ISRLn!W%%@AyqUd~iBV zzKD;QX|d<15ThM95KR3QvlA|~KF-&0&tQcAG=Gpe`~P4$-Wcl#`#4Z_yy0aZRz;dU zg4S|+@{=50vp)NEVpMMij|pNYG5KKLAS>^5|B?@HIq>UG|1;0t{YSs9ZvQ0SG)RY^P%bSqg>x}rb^k`G{I_z1WlC9&5T#Nt^E9q^`Z5nFcR;0)eZAy z5Q;r(t0A$8oWF}Xuq`~ zSN&;a5V_{I_t>6zc15tjlHsql!8WAfXLKN)l;gCM`12F!u3mw+gN=QRe=_lcbbeF( zLCY(D%?Yv%Ny8^lA8jr8AbuoI#Xkd&X}91B5zh;~HQD2ZCrH;)T5@d*{)@Pf*tTui z^UyRiG2+mf<;>X842!tRm5q5X@TDBjosg2z&k1ZM= zp6u7s+id5vPCAbbXe555_)rxWJv@Uew(z9(@Nx@Guxl&d(KuF{!DQwrQlIH#~$dlVFQ0~S@qpFHondMyqn%IDmC>D%~&_=MEQ z$ukmOF zEH#IFD}I>*E|;oo(gr zjI)MUhd%(CqRHoKj13;%q`}S=I}*K7wLNh?zllFMthW5r1>9M+9WYqN7}qWnAC5i^ zu6%8!bGbpWacGv$w{)h}i_AmCL)1PrdPm-0ckLc{dA<#{*f3ZYT4n~LCVnS2R@uSp z=!+JJ0o$HLcNKSC7~kvyahMv`fw(A>n?G9}75AH4iQUVb@gkkLuEJTXtGQG@g0JJf zroaw^4S})M#KnGNU+KklHlqJxZ^wrME(=(c#v8C2KW)98p458n!IZ9?K5N4?5vOa@ zh_6!p<)lzN(001J^P>z`wVl2;)8K^L+qF55z+JV@k9zQn`GbBdtGG%Z%Zs4#EyCuz zjOE}*)zNCU#fgQJ)7F^7*y^v}TIFPNH%&a+jjl8*$%lA$Enx`vcA&nv%~Ka30yFn8 z|Hww_`O5QCW(}|3Ga6@Kz#r6i6E{J7oA>X?-wHdm)rC{LOw%r;`HNm3W92pFFSspN zaYDe#G1Xed_6U-d!zd!+WQ zhnpFG9e+?5TF~h0dj4WscVq(rWGp+C9Cd(3w&8e{o3~UtpY}JIGw=ZbCj>9(-rY!7 zx~Mc(3tM~1=qI{xaio1HPMSNSP45}Ag{ftv?w0ndCL6l8)?Cm}zim2`g*e^CC1#y?D{S9`67(OU@CLp}MEFwWP@Zt9d> z%u1bc%^xWqt;V5Y`!A0<1>o}$Q?LrZv=qoj!j_>~}{vi7T`hl>DS3j4pp>Nv=VT{?~qoegtxrVRRtTP$yJCozx zo?GijDxG8Bf&NgUPuho@`&h9n8M74I?%pA_<9j<&xUPqX5?uh?)>Q-8( z&cxcZ%E!gm@dxoCedohq8c~DWoR(!jeL3&V+ws15!G+@T6xcjMt5|MCzbWB!*e6yf z?Hj%zJ`8Zwmf&h|2NPiDiN(5(rOLUc>`U#iuIBEW%Ivb4T<`11_O_djBWq-3zKlPp zK4Sc}O-u;I_>gn6Z+0!A4w1)~inX=zZLZ z6h%waoq!{P3uYQ{niIL(s+X0nkB0>n`D%WLzQhg1nPXq`Mf^dvC$QP~7;o~#y?EZ2 zi&;b8avrmtHtRyxSNM{2uc>w}VJ#DvR5`r79`W!iTj!NDMKck`RCE}gbN5+TVuhxU zpNDSyin3iN<~n;~yuw3wBPDz@s)((DW8d>%#vfE4SGzJ>Je8YpH0iJwwHIYf)_T1c zo#B)Sf0OH0EWbZIdXrXppRf)0E*F@x2iLe)^@X~dl(Z|;Mc<_qvLav~l}vE+%ny>+ z>|lCH4Wk$MhsVq?d&?9K$1mg$zV@t406zS4NjoS11pP6VF%Vmf#k#P%;tIkO@I@KZ ze7?*e+2eljx;l5U)!vCUxPI7;`6)daC~rgS@NiSJ;CdhPuk#~oz3;^~`Kz@FgaT{- z0hgds=M^ z{F*~ApGxJ)jKyHdyp9izS5MqjJRdJ!4UsWA;2p#YWaax@C=c>_)!{HNpX%dUA*#aw0k^A+$YJ~X5rqtx#b=o zuLV?vF7FiCGFxiLqe}X^w&N5P*9--O81)0)R9q{ck&zt&;NU9vCX+6yv z@+!L>M>YcQd|L{w3Y};^JgSAm2q^Eqi$C~*YrgA{wk6)+2gbZM++fD1$z6S(c%o!s ze|oN2GOC@qv(7zJ=^J_=;{bVPY+D;x(CrNHf%pgbgTKW&lsEL1EapczL#&<9W@4DO zHbLf@q|fO@7re$Wn@r2Mi3@SnOkCj)9--EEoc`_)jz6fh|MvLQ-|2o}Hpah^cfpG? z-O-G1>?Mm2_GZ{D$gAcf4S5>#bWOe#3-8M|9Bf-!gG=&3vjv zQpR97=aqSBz) zh_dA<3F0_nb5Yt1_LOBkNqww+7n4q<)tpN2`}*Ti{fGN{jq```2c?^WZOd>+`6;hV z^%%6W(U{fMnrz7nly}#szQQpyc8X`ZyZ-e4&!45pd9U|=*_@0I;m3QmAJVD5Ci~NC zJ!i%dlV5M0K^anS|K*{zS2xSr%Gk9?d(;~MOuEfp(r2O9U~SBH(y#XPbXUQT^!}3n zU+0JN@bdAa`GXo?y4vdg`Y_`Xw@j=-e6p~YSY5^hGqxsuL?cKRIF5QGO8_N$K=hK9{Xpf^gahs zt1RB&Fq*3mtEI;9(rSHM{6W(m&3ZmX{U>R!hHI^{sZ`1y7qiytyu<{U&et8IV>HI5 zO{^?i@%c)&iIb&RS??3>hx-@k4y2+>ey3c zi_cGaZ!fIl z&FRCtF&d}rk%TwF-AczP`#4wvn)HgFsMqau9=^no*IsyM8teqjZVXa~YG9pdEJ;A3D-yGA;A zYk?J}PHQw$N%IMgEpZm@miUIWoj*FiDE^?h2Ai%o9&Mu7+{qIEENoGkeY1O8p3sSC z3l~c~?K(WKIy$sqoR0KG(|!9knxuBiRkD8>O=h9t4Kft56<>TXM>v?UlRr4Wh(E}D z?A3?HRcTFXT*Vg0{5FUj#g%|ht8lM-%Uu z=`WjP^X#Nk7*a-4VLyL(eieVvtYb;L=7|mK1GD}MM*NIX)9H0ZKHx8k{}IN3umhVK zOQ)575Ki=~RtXjhyQjqn4iVT(Vt#6c-QL;RbNZelG#2Sa-beedrx9(->8V>il6+mZj!q|IeoMofeX$&8k1Tj)4U?f|u zo6J7xKRz=5vlj4$w$0LfKDHnB9qvnmeub^u-S=F3Fm*bK#VOSZA*t8jHLM%uSlrZC zTiTIqq26KE7bJfJ-bmWLHWm#9u#sPqarO}X?9;><%=hmtVYX=3wr=peM*a4rL_C}X z#h)pG(TIOz3kz|G)dyBqabX!?bIt!2?Dw6)a-NDawhMzpPyg`zTK?e2*h^nW zf8CcjE!)g(%yIbY5J$H#ia2@dD|t@lZf+`HO${!4%6}=I9cygjTP`}Je}xuj%|*Nq zyBvNC1qM-%SVK?q+8qhXw?X} zdWGOMg`dKOu{g%SmcF`)wDdQl#J<5^g3d90(<}3JvrcbDIQzf)7s|&{4u$J^`{8@HzedFc*J+-TbwvATBIjrj=#^Ug( zG_0PFEuepU-#x7&)EoR$>2RW`3tnvF8xTD`E|XrRbTQ|oc7^|Z)ip8xj-By!+X-*i zU&SA^y58LF&EeWB`TVEk$}#>`&K%8k<_fURR_SohA1?RVEH`EjtP&4Ax>@>ZTg2(h zRK%}ChxRUAPM!yX>{OZ)cl=;f+!M=t+sI@G=!9mk{*`m_^L#RZ1-)O#6-%9Ncr_5luF9r{{;vtppO}5rGd0A!l)056@ zV0q3KHka(+aLw*7H}lB#*YO8^1*JqBXRs$@OQT+}Ya0D|`Bv)4Q(wleVX59odon+q za6fjTdEGh*^n=gE3;L}*POHaSw_CZCZcZ$?9^``SLMpHhfDyjWPtU)NKdANA+vfJk zCWrS%SMdf}gP@y@rl{=GYlDN_&vu|u8%G<2^;{4A!R>gr0T(PDhr8x!L<`Qoq(V4Z6)}z>^ ziwXQ8>~G}{!c9}!)xh+aKdcf4vmx;&{T^FJ{6~DVM=F%x7johKJ{LX= z;1CuFJ{V}l4*P9tJ4gj~g(tmvJiGK{Nv!*`Q&#T(k`feiy5}d%} z451|&J?&@UfvfmAKchjMyuOh^Dc>CT z=Qx(n4X2j>(R^G^`y(+1ucf27gVIPXtn$afEPI4cNZlmAi$D0T12eZ!7f@6!liWAw z(ZsUjj)zNup`Ycp6l#s9?VDqTb~`7yAGG4zK`6Mve_cpZ@UhHq&-2?Zr1m_8kxW z;fE{cei_F8Er)Cg*u9b-20&Jx?ct92j|=Xbar)nq5!TF%O-Di3Oc5e28 z|CTDz*h;}mpD-!=UV2q~_^zqsh->YYzvoaBW~}k-45l4`C$rYpeYJ11G}Q2!l?_`L z-kiW1oOT4pW9-|ZN+}l@M02IV#VXnNSZeYlZF^pWxItS-t$y`sZ>L?nkkEXfi zI9mHU{-EY-GiNIgCLadNX7d#0hU^2_+2CuM{V#o)wiDP$*V5-qW23^M(f8jRw13<- z@v*>iTt9YRbS~YL?ApX$1BcT2#-$7wkLMo8$m6}4SaSUi+Js>zl_qvgxOjh@vX{mw zK-`gQyS$BCUG241s47aZZ%-@s7yGW4_Sb8SpIws|o}0aosTa!KpY&H-@GqzP#O!ff z!RNBuJ#2O0WXeMv?p>UCErz#Nc(xSZsE3_74Q41T%IJUz3ly(Se57B_FXIoAKdl3$ z<;6Ztbz;_b-6Do9;}a6@Pp;Mb%1vXF0|!yMuvLrCs64db7^T26Q{vshc>-*6?b-=A z2U}>G_)x@=(<$!Y@15c_NYk)2CdLu*BMmpQ42Q~1z}LeTc%pv$N#Y_!PLFc35t{kc zCcHz9|9zNx(wG_d3Ddy`mc!Vz$k&iAhIyOEFf(pOcr);pddpf8p zuLc^aq~C@Ml~13Ot&1ZLs#_OME1VhoUFz{{r#x<*@$r9S&cA&W2K`n1LDH`7WAu(S zZkf80&7F9Ie%TVm_k(Ln+n2uU%2hoO-^$-UKCB0WSga9_;>MTS6K<`pSdWei*5a<< z-6?;HPx$$S@8;@!-TONJpnQ2~SF-b}jTuf}tW->1!8|h5h3ceZbd3!sxSoe68&}NJ zLD`9|?*8*`nYXJ!CsG|QuZM*+QcKroIz+54uvqm8^^eb|;n}J$>HH%8AnR<}l==>t zkgpEyiayU+kGAWn?4-x^HF(x8oL_J#ejA*&T_E=3Be#DXuua1o0xDS-ikrkqu~)i- zYO?2~TBTdEoDnv7e&pc_{`$Nm%l^x<{e}EN+LW4-`iD8Z^&Wl~%mwMD;rO~^IJLV3 z*c6(a==QaC)mo_JU(}T+Hn#0&QJY-w3_5sV%ImkyV$; zZ|GIai+CHp$QpaMIBSiWQiRK2;j#zW!_!sitp^=zFOm)g>2&TrKoXAzEG`H@ak^!RapUHn1%w&sbcFe#tK*t@Kkwv0u>X=%UZ z>UHVHM$uNw!~buU{2_SWH}iK?tgu60@I9`G^EZ69CyH@5duGDevEL=R@64rYkaSD5WO0*{UJnGv6OVXpPsSMdk67BR6H40k9rpY>P=)N^i%_{NO4=Va(n zKE?{eXg#=yU0I!!tKISDwoc@?&-Q(SqE*OkFTmBnFWoca!hLmj=8MzgSm>X7kM3l& zF=wT>?wo5Yv=Nr@T^H?&1;c7P_$vM&>k-x=vGj~G{1W2Y_Oq%vzMn{g=Kxg!{{jLmxS?jdtZ zZZDhr=+Qg(;CaBabJxrt6%5tzI_*8!@`U=V1a^z!$*d9Nb7OeBo*yZ5E_0MwziAD} z`BnTuOqZnJ9Q2Q1wizOJ@M<0J9X$>CdK`U^q$u;l$}9`mRNpsPGzQS$OD(dORv~$T zABgCtFul@kb%rB(4`14|x{|5E*Dl>#>)a!CFFNf^P5i+}J5WZ~x$=el!G!i4 z)@DdnOn!n^m$)fiT3T=kzuf9}CsvYuUT-k9YT5o{I-AWl8mzPX&53rY`A5Es0ewbo zbU00p4~xeDv^SCwE{L8eQUjv1!5Q3K&>20Z3(Hex=(~Rve~>+_)``?LeWcr@ZiEZ! z+Qduo;+AxyV2I>Z@jtYN0dtp6?~Q(b&m^Ar_8Cwra6hN+jaVNU)#+yJB$C_J?ihqC z7}^X{k@emRG8|i*LM*)5*JA5IDs20mFN{Cv`2kqns#YiL6O{+;LFC^jJAod-IA6G@ z#X7Q4-X7}X>-v_7*iOgT*SBbLGWW51X-tB{=(KrCOfS7%kxD6UhWX)PxLcmg36HS9 zD{gvz-@Kdm&AyI5sJ2AfRo>!rnl%gmlq)ZG3Hj0!)d%|$t`14Xp`~jZ9Orz)Wd7n4 z-Jec-@EFH@1=d$h*8ZwLGcW0LI^WL&*<~_@kmOhK2l-~&j)~<&ddZXaB1*Q>z<9!M zYb?`YI0O-^T6LZY+g(?Ld2onx$8?st!ykkc)vQDYmuCN(7+w$igS#g_-)>Nf>O8<9 zJPcOpT_G3Q1ybStV3qnZ{-CJ~QYm|yd|+kk*S^rqjjF5n>G4!r=bkuTiY-ViPRc)n zwVzYE#o2b{vjh#eD>yb&WrUx;Ht%&i<^}T)5u}+(i}0^k zdd%~``tS7_%2R{0Io{V^dlTpTJuX+HY=w{DgHvx$D_b6izTg*Rlevqx7>$M@jP2=nL`^XdESiVH>kyq}x7md|Pa)f(PB*JYQF z8Zw$0BXsAZ-1Owt);}I~?@te?~KOIA8iU-B0;Im z-ojueTaBkD#tua{Tuz1FRKH<=SBj57Nl;twiu<~Kf->&AR1 z{e?$3guF#K1o)4S`j{S{Zga(JOg8Etcp~@eZB;DG#PDzL7sjnHf7HNiv72a~eN& zZgpwBrKH`7q>AV$rR&FwyRHwf$Hpo-sD>Ks9~*D(pdSBO{-CLR^=)Ay?8}o2j6L(+ zB6lHP4!o9h0p1jLUSbNSrN4=--HqMRUdy|y6ZqRF97osx6n_xzfy%vox+cz#Q_4+? zS2QkrF^td*71q~=$0eLZDlEVw>L(r^dGA$(&v{|tW+UBlchB^}W;KF{Kv zfvGuT@(jC-!x!%mN z(Th)nHYjZd>=n&BH!n`6@YWjkQ}GGKUBebCohJbGH@?)^#0x4oCn=jJ?gONCSSRXu596;jup254A((aNy8YN+fX?Wn$(_15T6t%KVjKIqI(=1ls!XDbhG0e@8OTKp`3W7B9! zzrq{Wd8av~0V!Lx=1#-Q25YYO9+W3|nk|m0+6v_<-M$;PXn*D0oVmoWL#wh-c%&oE zS}B#OkA}}fGKWg&IO3#;SGhWY%gy0@{+Im0_Ie>r#%n5(KPA)d{A#DGrR;oDcL>L5 za8q!hbe*x2!(ikl8=rZ!rec_@_l>?qn~-gnc0XpUIiWp^KC5Djrf${l=@?zqh1u@0 z6^1{otxqO`GG#+U*Qk7!m-J8REGn10w3vM`)192o}ket z3}`?sy-+?FT+e4EFts*maZ9yQmRRJ$Upl&}Kl(S$GSsEkNY;K)dXR3lqdN83^vagL z=JwOa#LibflmMC=X!M~i)T#6__~f4*v?}dD?o4c~)vcOm5%1wD-kMKqkKaFKPvWI; zZ(5zl>kDk(lV>Iam&C+3Bfi^TrKqc0tA-Ba>qXpfzg zo#>REauNxC4}HqOoZp^v}p3#JH8^hOR}FV1-BO1S#LFO_p^iLk#@jX`J`SF#1?$Q55_aZ zz9G;lOpSPJf5IQ6{ZI~(n$i!R2oH8IKIg)*Cj-@Ynsi%T=776@2hV5JpN>O|dJH{g zH@Cc5=!(1!)5qn<5cLsPuzhQxFAXM0`KR~yez-6!9zwp0F!Tl(|GF`Wi90vhF3OG% zTOGg87&cg;+gHjKI_&r9vDv?1 zJqSNK1L0qZ0$#KLmN_=@{C*ia_;Q5$_%gKY}${2%y(>&4t|j8m=k!aqVU6Yb2w zbU3Zu*7Y7^dp$G1ZntpLs0WQ*_};PxJT=R#`{XOccUATzDg3tM-{udh-4gE;%!@uaXg!{V z{&GI`biVaPPRx-Iym57<{An5nSL2XUoA+ zRxw0LKiDlgSngVVp^9Gy_Yzy9*Sx6p>|P83$VH#o9;$M6mmRd2R1dYk>c%IN=|+JpZ^{-88i5jAw$>&~;&>7i%(Kul{q ztIn3}3sS9<6XyqnPteTGbP|c}vbnT>n%XzY?6dnrX?ZyK?p>0%aB&Ys&@L07(#p){ z@d|wT+u7;R4$&}n_eC>zb>zE{2tC^U78;kyM>|vhyZk}LhCMXf%c&AqBurbk>YL7b zBl@Z{kG6(^>{JU|u#eaL(TyrI>@}iRu-gpu&Z``H3$4^{TI-%$saQYQn#M|%#jQ09 z_L|vj;d15kEOLhN;I^8`3?AoPU}P=h!-n1P-E;d@h%@u|`GaQdk)!Rza)E4i9lsLo z^f=NO#^KEwT`I!(z-cm6-AEV8)J;ZntPX4y*ei4}zhK)y>vTl&lW>b}_w;$>q}Q8E zYSG*+?=|d>zIDxs+;6kae1AEw3qia!{vLnuy4tt+efbFq<5NP^PSIzRudrE9$_@nY z@xMEUwQ#Oe!6X79#j_%d7j?fA73;8U#Lv^&;kb{Z(Ys6b2mR>o@A3!l_T6R;i;d`$ zE%0rJd)sUON*45)*ZY(Eqye5j?Cs!###WBJIT*<8(Ow_d_04>BPqw|XQq0f4&mV+t z*-&0A#SeTPzp^jBZ~lcx*`^249sGW91J%U~0}?4e-e7p~bV2|b+&K(%iQ8?84K0mRgex4f-=d!;h zce@p_QNNBq_}lXTH4gI^GDaVxi<`bdVu8IlJ}|-o?P?Ex&e?h1kBQa9j(2;kwOP*i z;3WJ_{vbbvp6qpu(|}2-#vPsi!vPId+&>k#mxo_nlMS#w#w~Rc>L>vwm>!)O_fP2p zy5K*MKls1)`QIx8d>YLP4g1B@?(TG&IaI4QZ{GU7PyK}VnD^!5$j||Pb2Rzb;L~Mr zHg8Sv6DIoilBBgJYX-0=d%Absrr8ZpNA!*tY+6P#@qvP&8amOajQ=EK|5^4pZ5@DJHY zHP&eGH?P5SVL!zvWHFXn8?D1lS^MMpN3R)j0=s^CyM-?-Ed;}25y8u4`+Tv=njPHDLspZ9panC#4ED{KewK-{_X z```>3ZeR=>3f#f5V!~m^%3*WBEawQ*@nff#Ken)_Z{QDlydpq-!;>K|+M}~4@4`Je z1s|K+E@0xK2}2R*P8z4;Un*W&T5%Nn4HE}a7(;qQtg97yksVK*1=Yuk8})nKLBo@( zsgjs2D9U&bFaYsOc1K$khN$@&*D*|@-M95-juBVHxt z?Y3w?V0CUgj;3htcwhBtUtr5jfV3g7^VpKSWBlLqzh=I61Ah` zMtjlH#fePLt3{r#ec=G}<+QNSbOb)v~eoI#IM`|cy}#~;8SBp+c;4h_7% z>}Ea#&+wOkk4a0KHj_^{EBq0_`_ZLMlt)%@F`qLw?MXP;NBh}7HY=G{Io8-M9+UI3 zHYQK*shLllmt~_Z`djXxo_{@mP&PyM3%()yMPEqzh_om8L8kuG9)FNA1s&nTVsy^$ zG4IHx+g5Bk;*hoXRfBtgDc$UFcoOR#`7#~UujbM3;t#5in|>Zd-woTm`hpEMON>+c z23+%=Vv{*5yV@*0&dYkZcee-4s~Z3ZT?+%VpP2$0b&8*;IIp)Zu?0(*>)Vgj+T#w2 zL-@n_gIZ@06DnH_FK;b$V3dCRI~Z4QNtftisR(^McYgG-J73m!XWzB&>2Wt2V?Q34 zyY>Qng?bSV_-w<0?z2ZP3{9M}^a6d$Z{iQqmbBhT_Oq2+Dxbn{K{!tD)cs?Vvr2f#Uo4gC2%6 zo5j{f-xbV_xve{^I<0P`wo>Up(BjOD6wDx z1Nke#@gyE9@h!iLKd4~}Y;fmc|26tI8rks{{vPe&Wgf^3j)5zf)YSh#bI>M;8Ngg&&uxEDHrUU9qUzAYvQo2;Iuuzi$BPo$A_&$df#A!b9_iHKj9B%iv;HAmM*CbeBM1cwfq1w;HUVmJR@Vc zm5hO4k?xsTLHu|ULw^1+pG@&rAckuzQW}{3h6XFv?76{kHjEte#H2;XSZh_A`8?gc zI=gzJH}!8Csp+iN8%*fM#CPq02QJV9h3AYmD)^vqR5-P1f-w0A`CGZCD^c;f|CB$N z+7kyhQFFwf>~tnh>Rh_DBju~zsohg+)^~~Ke%W44Zt+aIFuVuh)8S9kR?NWhwAI1J z%k0gNtGPoyao}$(P<*NUGTWbq%7bdIg+Ekfbj|ger(Q8%j3(?wI%1J$^lyk$QnXV3 z!yz*aMf1hOvltv%hsE$Rtz}QSgYT3o9G{^aaWn&;4=b#7fUwJFk4yP$H&L|g$L<-r7ij5vfS5!CpH23Td3U#>jd94z6%n~2ai=H&_wV} zw@hqjo+;g3Br|i@21ipq4F2JEfDAKFc;}PTt$E$|r^5mq z7UC063x4eh^!uEq9Jzcy|Ajv|4xHP3oA^nYyU1@GU=SJjI^5;nwK|RsNhj%1AMnyg z+yadud>?yoohHrZAJ^s)u54HPLfLGoK>9*<2>MXNg=ArHPUu6#8GOQjgzLpKFCN|B}{50fi?2R*N? zs826FyO_#mBOK&a=BDi^pDKTfP1)6{*G=6RTa+ITCpeDDhT~=y=oSd>ATPK~keBml z9&aD-P1}j(qUdf$PK9mgJeURkj6Zk?gfg|zD(?X+9n~$z-o$D{lhHh9mdzsoQ;5+puKWbMU-MK%f*Bh}1sMcRRm5*@5LXy>FdU`{qx>A5_;-W^{hSNq@n7P5eP&Q4`*o_hsRC$!=}N zN6oh!W}ebq#i_C6AK(w_$4y%F@138I8@kZ=Eo^WIXVCM(fp14*IgB0tC*cn&J)i1< zIfu21#%&JeOLHCLAEvl9V>Rms*0;KqE#~w|Z){|Ilt21=tk?DX+~{53#2-|;m3|%X zJeVi^qb{tjFizk!lI_(4aVxmz+n}W-Jm-D>Q2wCTY)tzxoHW_xUPo7$fmsVP_E5C% zIg>};ulJeLLKf)hR>9MlZ}|*)Rr=Mgyt;YUgZaFE?^h@9(R`-*Qa$|*{-E&g*FpNE zpYe;|mT4p6+{qqM6ep1N7+hM}wM~N9Pm*qIqRg)zZp&ONT+QP@C_le?`GNyag&kdEU(x}fU?dDSdlpm{${T&XuS6=TjG=-_Y z&00`vF!D%UJ=4p(euF%UTcQGHjmG!A)BAgQ@$Sh7+Kh#)!6^&b?erV(eg;0H!|0JH zA11l10ck56^NRP+^fA)CX?pM1UG-n@1EiOU2v6-fvG;zpQ zJL~`}G#_(p9NI1EXFW{ZGO(V{IL?pe4|-!M<*a@x9;)huJOCl5`qSnh8X9a9Jr|v_ z5ZD2BjT3s7WAS3JS@fk53D!0f&H=8I#~vxY$~Mpao^GV!5Wex7AH^Rez3ShdA20pk zy|;?`TIU(D7UGKGMY`bSfXR|}xKhGxz((venq}fF!N0Sw)JN<9{wAzp;PKbu*$7wu2nlmEyYq+Si) zRfOvkJ1t|kL8N3sR5`&93mg8R)5dNd?(n-^@dn|-=7bFoE~ARZN~^1J|8n!Q$QZIwNi0^xLa_@!f*l{>QDSfKfi0* zAD>k^|BOGVHd=2jVzpIvU)*8Y#0H{yOlQ*Y2gy^KHjKSb{K0$&Jv7(!Uyauv2ZL#s z4`~g-xQ`8&7<~Eiv$dl<(>3vyNuMybl!;eqrz?ZXvAMq2*W1Q!RSK0NrDJe=TFru{ ztJva)l^bA#Y6Jg0e=xn6zxjj5N8X*y%8AM`IA71V4}1=kkMi&G2Q}AZwdP>{WX@Ae zBJz!$H%uLf|62#&^m9*GZMunZERe}xCOl-FweXt?G38IATRT-5OqQKp-8mc*t>-0K zPn?tSFNi-_m@0-_Ztz&ouCYDsgL1tUt0Vl1e#IX&elKJqY4)OUa2}*tZ3KR>@cwue zeOS5afyKbYkHoQ>PG*9iJOc`n2@t;re2U)}a zr}%@<_G0N|BJ-ou2qt&Q!R{V=khaohzNJ-31L}2XZDVvCe4$dX$b3d!IJb(Y?Mh74 zmHqOwNO$adYL|m+cXczBoD>UcA`@|p2462=XHY~GdG<%EK zqIQIDMw@Q!s0Vnbt5arlv6v&~6~%b1hO&?SGJe`F^XEi1l^5V<*# zjqNcorinr6V(-rs@KcgWcEK1mz<=hsb2<&MA9#&_lRwxz_hf(Zfmgs02pkm8EITL? zW2@e}ul(^3{vdsvv_>i;AAJapzbj5^J9ApHblL}ZgoX31Z=*B!62-%2w@=*gE4k-_ zxvV&;lwaZaXrm+gOb6VIUv`rXIM0R;tBjdT{$~8a`*_m|m%8hOe~5l&)9oy#gK6!G z9};_>eD;Gs$grz*EPf*B#xq}Q4sN-zbJ7mwhqL%->Q=_r5S-I?x;1Wvw~0Bir|%tN z4&rxpUvc7t@?1-A_vkDl<67L;i}WttNNd_YIs3oOAAClLYbahQSl+tOaMpqD60UXY zR3a8cI{(2RBoFMD(5<(XKlB9T59V(&Z}i*esvFrXQ|OtZm7lIHW+Qt#gC8%9mhtMD zmR2qC6Qz6C9>*uK+O9UZhHXq-n`t??u8!`1n?EQXr1X0Yf6(CZxB0AHYmKw6YmX}* z{6Vv)^ZEPJSi$IUw)^yPe0QAFN!yCvFJ#?eFjGM$Wvzdip8{-D7I?{mim{OzoV`y|s~KRKFRW=s5Ce&G+Y z|FC?^fQ%Z2LvSKq9hwHLYj>2j=D~TfcL{Z-7pJ&iY#*uqWqEAg!{^l^cW+m!*bPfJ z8-Aw^Jo4=1AL&fvn$AQtCp*r)_ILS%H#?KvJ?g;ww|stZje@E8rm4k!~E)YU5sni#OiWadu|{+A?dv-ZWA(QFfzzE?VpC0yke{Lt**QOJi9WVQJ zAs5{Eujq(|irYZy=ZQZ^(%B!X(tOPdK~o{Y-3-5(Ay!A{c`*3bGhS+ri?ModIPLg@ zn@*1iaQ)=v@A3x~%gxvbKI{b8b>6nX_oEW`UmSZy8vK0725;~$jc*~m5J3iwdZs+`XbhzK1Czi+I1U#^O z*{@2cz$kMG%+g=NAEX_8;1uunMY?}w-}$qAyk39DPW-3`uT7DG{qtes-R0A((B>d* z)Jve2JD`Dj99&ah!XJcV`;iZ&=fACsPkF?xWMJyyjd8y5DdPvQX9l19d*Q=*)pva4 zC3Py0X_|>Gw)zOswllnOO zCTVbF=~sV~KPVgzVbfpn2S3>ke>ctl;ikUhSKL7_E9O6#GrkS@XSk=V(<$J8)Ty5E zJGrD2om;EX{Gt58|B&AQ?KYT!-F?V@%;EV;=*sLfjjxKH{rm^EU)L?3U-@8NNPad< zAeuvT{jWKM;cV`j_dKmLrCoVppK1JT{w*0%K89XCd?xm|mvA$m|C{Q=7ksvxSJuy3 zW@@jY04?<7v@S^ANpt?nxFM3 z9wD}D-mfv0`69hP5SztG-&(_aE8KJ{rR*6)N^}@mwMUa{b}%{Szl}d=;^SzqR8?D6 z+XmBRf9T=3%m**r8C)Tn>*fZRP<<1hUGEOK#0qR7P0TWP={Tuf-gU>|Y-O;5a?^Ft z2*C&Y+xUZ8JDUBC@DCmGt2A{G40MwT_CXn9-TOE))7%t7K{VXyP-Lk3TPC+Nn+ zI~sW0upRgmKG}|JtHLb4i9hJ2S^l~)PoLIc;vw>2HA|c4Wf_kVpG)y_#M#3BTSt$~ zAHf!{7=iEu+t?qil5D`N6@`-sYrw`uowUirXHL}baR|RG{-AJm`LB6#7))QKKMW?< zmb1E*u~jQw)B&6`;j;!yA)aDN`ikYI)9y3ww!mzNQI;;3h&Pp&U%A`5!M|w#5_|9i za~78S%lT#eLD_fB_()sAZYG?+ehLyQyG)x<8%opW=al^}PCl^zqQBX4XIuKn?%ui) z0tj2G1wJC}(K7V~AJSlYb=f7+vwh>uzxVis{6Uis*?0`*5(&biAV!=8ZxbvKzMAx2 z4L{bz*#j3S$G7*Io5??htuesDIJni;t|>v6|c{8rkPGzeYrdGFTB&(h%~wZhK0|Dao|~oT_r)KS&zkxMz9q~Z z)9Mx+A6(Op(=YO99}9P-?XTwW>B{Nku9?B+iVw-YgAoq=eBC0R^Z44@r)KCaVK&?N zg=Ks55_9Qy@dsr;HDfI{P_$m}tCQEC;nq6!%)P}}YSY$Jw=SI3#W*^*;0{)Ik3O25 zYw)uQT+|snFR-bn1icEghqEs}QfoLYiR$;oA2fDc)~C^2eRK_L>@;x(-Fitn%h6oZ z_i*AVIL<^%Y?i>)qWfhZ9p5Z*NFzBoIWy%$`2pVpdlzr5LR(vR!E?btzllGnL6v^D{zgTXmv)zXD2|c+&k?Ld=%~yc*_bt z6a5Pg+q$rGGX?PV?}PJ+Jq>uh>b& zOY`ceUJYJ@teHyV$*79z8`x}xIetHdLpy*Z1z&x}dSyMjET6G>AUkFt52?Kxn~A#K zcf=o5eef5|b`!B}u{4W1%y;Z7>~Y*1C56&iI4I#w0&q`IP!1(wV3oAKQ7%8OM6lATiYa z<>T_&9v^+%L>(SqFpRl%2i~T=A;{Ascxjaa`J!WG1H)~mFx+GVPB1sL{Mo|R_hb^{DJNV1(%Fvxb*_P>9dT^guypSG;=$gLoPVY-d)$iKm*;%&Q}V}>i2a-{30}WnfcMZKJO0A?%ltv|K}Wq1Ce1Ylg1Rgb^J(;?=P#5F_{wOQ^yX}l7bAPM1tDdj>QiAw` zi9Ol@mq9D`XZ*o$jXy|cE@?F7KVwoK*Jwa?tZu*3+fMtN+kqIO=lwN%0UtaUR`H*S zKS-NO8f@^5Z7L7%Yr~7pt(K4QA=}*yXZu`WH;5%p`&MQ@Nc}wgLF!^o;6U{T9UpkD z_f-Az{&cVS6`k*`^A;aV_GQ>18Tat{h(^F7jjfuY>>rOmcwXJxAF(W{i_iEudd?gz z_?~2i7??%<+zPDdI)4S(>BjlMB!o_j`KiX2S-`Sk4>Yx%?fg4Y-)EXIW( z{zce`H79ZCv+uLZ5d07D2TeMZK5r9mo__xKbdzg<0>(G|<4vBmPp-nDdh=$CZwdL) z_--aBSrUg`JBUis+aSH!0c zZ-jNGnLkx0ilwYHoArU#2sB6GBGk|4dwNgTtbe@sn1pm`nlw;TCSJ-u(x9jBHvWF} z-lF^ZE-fiOA9`-qDAuM*0~hy7Wi7srd=&KCNwD+k9Q(HX(h_=~*JSh><*WQDogb&} ze|~PR)wj5BKBKfq+v1&9?wc}Ew!D08wB9lNzSrk?iw>_WyzBRWuTP49O8IqpzkY)} z=~TI!?*u<1onTQLJ?Dr}e%|lle~LZD^RLruzjvy?n?A3#k5^tF@1uR1J($Xubel3X zX;7X_Stze&Owmu8<8wW{$CUSL-XndO-(sz3vBx##sqa_XzyQ&yC5EMbHz^yp8MDl5 z@)h0io_BhGFE8G`SJ}UH=Kn|jpqEzFi^^K<#yehZ&)TR>zi+A?6lqgtJXOKO-1I2x z>yn@i<7ZvrEKIHzyy)1{ZN{;xmcQmO9n3ZwsdZYZKQCj@b9{2Q@vb!IFZ-M9FC~q9+NAU+=W6(Pz zue!0i)nJT0_q2MjjDYVTB&MAjNi?1b$4%?xN6;JOT4u)`d-9*6cz(#?AZ=Eq?f$4lBB)r z82m51gad;e4_r`Kka@50+CMnIh(D-4YsONIoyrH#i^1+5eKO%>q?7d6>Ad5}e_yfl z{5|0#=f^mEYW8VUF)+k22JUo__9Koe?P&)tsQl!~&v)?$$%f{dtnppb*y-Ed=K!6G zsTQvopZ&J9P~mwLs*VQn9(RkOc#eY1|Vtu9&&r;`&% zlg4!#a|4{nozouGz;M9Y;Y7L}v>_wdNC#_Tuz}yg&-_0AAbTMAt-h&`_^L6|uX&>W zXxY)|He2hQS8HMli@%)iOj2Pu&KMLU{cdFI93KPgxh_qKL)oFvlWyr;X3zz|z5-SY zAF~Nw#eDOGqxHYVAKd;${-EpuU}vFrcop;F7E9APT)jR{fwaFmo?OdqcwRZU!llXd zTA$T!Y1~feBNfK4HRaxtjxe0z4hU}q{-8h7JIB`jN$=FE9CzQzA5qYB#ViW@cbfE#^V`!k+l1d)6T5xzmo+Z_X3VOT@_-f4_}CXtc1CzCgB^r_flR zM16Q8`DU}yymaVJ8s+L`HaiYkx1?sXYquJ*C`1jN5xFv>t?h9{%8a&&!^jkat#lGP{99rr&mJ*F7?S zoG;6Id!4a@^}2N!cHt1V{lj(7@0+ar-2P4839ffD-!9OK{xtkS zidXrlm%(H?e$jvAS|DM1#CUbTOmFeF+R%}-p9a0uWpFK@3$4`8#vj}!3&FPz4hN2@$-oE+b{TdBp`;Zd{|j>T)G;I$iGC5M%3c~p&6 z`sZHy+xUZ;(>~JAwWlLPKD4gTi+Wv+D;SmCv>41TN0(H0w+MCcSBe{*PWW8J2g2?p z>?U6%u36e}NYFI z07shQV@)tPW`l(XY0DJF>x*(B_025>i_y1|;=g?mUt< zJ{dEQ+h(|(%4Z**y5dH-yiK z(egr*t62|F=U}fp;)jaE>4!Unz0`0vmjFFDLxLwW3s$9rTz-$ z=eWd41t0x3{vg@|8x5}N<56Ftm+f60f86j=6_-MFbRoaGm1a zjx-wKV(GF9Uhj5*Shk95Hvzu|k7|oQ2ruE;8DsZvDPKItPXIpN@15;^9bAq$e~CUM z3_jP8mZyg=@?H5N@IG?^dcRwj*kQwH+qbM?OIz8!WjwW{Pn&t0dZ&LAvx70$j&FCY zGthb^D6m@}tDTpF#ltjaF*c?Plj)XLhmHXlSu=b{Uy_d&a=l@=kK~~vEN~$%BsdS+ zoPjl(sUR5N!yoj@^LvMj%zrOoe0{H;;9k`PaHP)+yQq(zu}wsgNkjzT9);n&H9cpN!pL-E6^v< z1%y;OH zD$bs`!uQdv7LHbjNq1SzTlVB8{$Swy_=CdfqCVpGp%v^0ivuHcSWlTXXS}(smrnKK zzhUHoDKw8Yt(IiKXgbuW0zEb zIe%B6KY;TtAR9y&mlBJI9cYrz)?@W-pea}Rw)le^Qf7R$jgK-uw@F{LHw}%dt?npl zr90(oW?V~kqPu9;p4ZUmCfobrsy5En&a2@hkiD?3eB3g_9w#DNZFvFtttWZulw?TYClX zt8m^n*Re=1TNnmX;mz(C-|kbfb-sJwNNe=F;t!fVQ}ea2Qhv;V54+iG=|1{Tp4NWh zFp705H~+SoKEQRpqHPx!p5_AQ%opV~{K0&6yKJ}o!*P2T9d`2F#h>#BzbO9TyT7p} zv8V(5G>q@D*;5(+`5-ZIl)tWT7SA)^(G}K8dt!}-Wzgw}z$Q}8;+Y*Z@0PR~=;vDF z@R2xcH-i^y%+vXP{tJKbi{cNy+7)|V^v&tJMpMh?%*EqI5VtO@JAtEkIeHqjpqk_>vFghQps~*8$JcD(c^xb{4@UGx5Xbc z?IM^gk7E^AP|f;cEC_!v{Il=}tyfH_ z>HPn(_aEAh8#~uFdM%`Kq;i%hDrYK3ru)B&|3Oi!-P_08{eIhRTRfvVnk|V-p+FQW zU}6IJa^7|z98QU`WM7q*YuJc;=;z$hA(P$3v$<=$SiO<){4&WJA5(u&^{H}-3Vd1B zr)anA63K_b+;3;#&%>{!CMe+AU|A%$TF9TFPtq5uzw|l$!I*K$K&BNwEiwcf@WK0w zb;-#$$8BU15!C4q`HPvhUd1~u$Nl)?r^g?|9~3(;OPw*fzv546r@VdQ>e+`S{yZ*) zb=Gtlvn}?pGTzFm28+JLVDT2^B9rB)&RG0!@duSJGA8@?kQ*nQC=}Db@S65!WNnrp z8+MvU+AMX!#22RcW;_aaN6vqjKPa_p<<{!lZ;iZ;65He(?Jc?OZd{MS%X#yTL|^dL z7~h1eBd5;!Z7dhQpt3dIC(pl584v#%{vbbG|7w@ST<3kmJ)sl$cH+;YP11JB@kb6F zPF~mfjL1dKJei-qP9-zC`Fbsn@;Y&BQx68t$|Kba!U-4)8iQk`pbp4O6NopanGx;0m|H>ca z_Q@?&G76USCF{3#$@j|}!r#&95A-SIs7nFJa4p7tV4e}4Uy^(BwZ3_O@B8E5e&_xA z>;7R^Z~grC{sX@yr>KDV4!#$?$nXCNfADK8;a%U3H~&t?CURVIS-wNzBeLhB*5HG^ zlRKCGq>kV3@f25*{hz|P-unK%9KXGO_p_hG9}HV0`Uv-*a<4h)aDtgA4kz+(Eupz4 z>6iS+9y!9XOlvb%Q6o_L`|tH3_x-mv|8~#i`p>LC_?`K1|Ap(IG)0m#A!IFh1*p_p=c-FtTgYx*d@&_%|55MeO zbnw>0yLO+tnF;!+Y`8SdY9+guUWGMD5$wjCfY;P`6zm2b5%_}2#V5WaIq~UzkK-sV znBX_$|C7J@CU_Nf=M;}>EVyD>;U0r#{ssO)r4j##`*@TdH1x0!%e*S%B7K%K++%P_ zj&PijU{GEt8PsL^0{lU-vsisvKke72)WhqhebXqD6Hu}x&7k7@O5F?-(FaqbiTUAfnSRT`Y#9Hr>U$pnYZ zCKspp<%K6GI{7-O-$xxgV&J(h=ikg9q^qD1@J|^t4~$KrO(wcG?d*EwYxQpUfTX5i z4*eT&HKh&^Wg*SZoIaDof6D5Y+@ezJNc13hiS#ua9LyB1n&7p6a{eU#V7R^(PLT}Q z$^@v%c9=LtyGHFnsZnNz^&s(SnTk_EyJoL@|5}5m!@U+<0j{CsCZrY{eJISw8Rj*HdHcY~!1~Bz8QNr3<<=Fws64JC=h`2^T)k#@3{t*lTj&8j zk@pK?C;CATHn^eS)Bg;AP^}4MPF1oL^jf{WqA%0W$q(vLd(f;_!J**Z3I5*&ugx`g zxnwK|auw>qO@Sijty%eb%&*SChsZETe`ER?`Bl9Wxbr{AAJhuucan9ErVSSrxR~V5 zRXJO`V{BONDfr-;dS8AOhJ-(DZ4d0BG=JFYl7FeS%EcO~@}<(gW;1qo_Bc7K?Y*$N zfo(a05B}Nd?W&E}*3T^3qs}}tyZOWT5YF3_yoETJRNb@xhx&uz9EVQQ{aY4XoUvy2 zBIhpmRB{2U+OF%a)aq={+V*t|XElh`LcB@phHWO!V9{Q!x-Ga9K4XXMr=%8iS&i{B z&i}XbXYvQtzDMOAp(fnmuJSeeW5p+Rie}w21y?f$*WM}KYOK=a>eHX@b^F*2d(`!U zm(#)@)FR(wZRYRe)0dxaICib=n6-b5KM3ym&0*<&r2pNNE+6QpZcLeP!xN+`UDfeual2PTj*i zRW!-ZxzB@Z?peERs0{>nbq}T>oT{&L7?)g~>g2t`*AuQ7_%)ve@8mx4`8)mfKKnn{ z9}Iozd9aVBTdWd?aKj#&jZ1Il^yUDx_tkB?njIxhBYCVhpSv_zS}Hhhwjz9R?f6yKs-SwyN2X!Sk-0s66McO_|W(h_hb6piV z?$EUvsT9=az#lvW=#+oxP~=xN)jx$lDBUW7bM2C*eBL$WdPz;^HS>lOc;E)`2OpPHOZa3FT?_4l&RV=FMd3C;`jJ2 zcRoEnr~V*vn3Mpdu?XP^FV$7Cl|y_Ba!L4*V&_9g_=E5fWM3&biHvjQ+~@EIHSN61 zS7;~WD{=&TR8V7GNPMrz5m5IPypW4xC;rphQ>0~YUfGurEMO6mxpRl3i+neS?-tIH2GpKo#m=JHo4RGKW2q*xWIp0{qHZnyq{ga>dmtS)H(#PL%2Y&UdzvHg{@89`LAOHKk`(Hk(a2q}t-gjBss=bE7LS&x; z?klkgtid&%_>ot!q91yRx$J2wm&5jB_=B{EgLn#wdkvpTj#{22b*s)kOYkX~^TTF9hxuyVSgo?P#}@vav|H-*4R$`b zV4M?d1kU1z@CV6bsT>WG0}Ct{J0Ok<8G5&5;#DM%qwuv~oW?%%AT1bNGX_ zJEm>LCn9oCW38Z_^6NZ&K<;&u+KyfE$AQJthj!p(e&eurw0-+}tTv|4!sqY@C5N!c zpz@^V)0K9@HBw>=V1lPUxkllaf*YG-xRh`l{j9%R_YXI3SRlt^>2vslYD{|Pg6wPM z(*vAyj&F2Ktbz@f7H)*fckFl3&B)zdFGL{|6F~efIo!yvc3gJG@CV!RRx)w6*S2=f zo7!!gqApuE`Pcb_!`8j9C{`y|#+;S#f&|C!Hm~Koj7gj_FUX@fcJT3r{i@d(#3UD_ zZwOYNlNepFLg6pRn$F->KJ=2{26H%Ny@Ma5+u$_9i?SSQ^sQd8wsE%3j1}5%aUOq- zKZp-m@Xq7SODFTyLhFo=SupP1daxCqBJplAuQ6W``=;g(6@!@HcNnCRu3S6aB5!KlHS(>Wz#oit z=Sj((S2-1Om-3`-IsI4O^G+?J)*maKgn0l|%oKrF@ydBS^CWk(#95H5nb?s$`9;S! z7hVn=^I__m*ypo7ckqJGBKJHIyYJE&;rx*+l{#yC{B!7sT9F}s+yVprYy80q(IKMW zy)!tEFDbZ^U(#<-m0@AkEYbsHH0fw-ey;uat+UU zZg%I|pp(qJZe9-l_F4H!nd|fSVk;>at-=6BFLnTju||H>JQzDQvi>4}a0IT!Eh|i) z)dZOE^6A~{cT5sc%l$s}PDvTCkVOWs^m=s^e6y+YLkRXvT-&m9979RTG@0M|n!t1Qx4&M0Fo+8dPh2NCV@u>IrvBt= zwKjXHB(ZF{j=f%Oi2;xU14(F$PI5%t0^E1WFPfqskz1Q&uB*p!R6ZvL<_@PcQb3N^i0 zy{s3@5!`;GGDtTj?>;4Qo=P|UhL^rLudG*mHKb;NaL`?1e^#B5-EOp(ucFc4turgv zOwI4bG=9+*KE}VuAKYzPj^FALZ-Z^M=B}S^sl3oezWLfYtc&vf^VZxgUb&J{n>q=w zW#VbfbKZ{6mxCeml@qv;%L$J64`&x7+vEu9pUv2!f z!_?CbY;fA;U*!+}#QKARamzd+rou@)sSLzri@ZKurw*R3#)5XNRJ%B=OTeM-sgS?Y zQoiKB#vlAS^#|F56LKta2nH&+r#wX-?mveNX(|?+{kgX3+N=#*IpW7k{!rZDiW|k) zE5O13${+kW^#?;8$b6n4mRj{G`j6V9OCO{Dgsi_Tbe2fG>=tvI4Mw|3fp0#+0B#6? zpZ|a75B{|JgNlzP^P#Ml#0Hd&h%PwP+L5(zUF)@qA$PD;D+l{M>s*C>yhIm&g+KUD z)gROk;`1qM`+kX9YG*K;JnNh@@ffOGsXpZnKc7E{fy4^&y6u$G_h5JivklP4qU7yc z@FC?;HuCxWLFR~g2fv8if2lEA+NZ#6d36WBrEf)rKZxDjclQZ0(C9OJsA1V3Zr}^k zr6}7T8UCQ~Qm}K5q;E`boLe;}NIoDnHb;a%80IRA>8xLbGYG~Bzf0y7;hm|u6F>0h z^9NO%C4U2BaNti5fnCR9SR%jo#H?8&!XIQ#v5*EG`2OMU8wdE0@PE}MiQ7XbNX7&t z<1?2rsDFV!$f86RBK-WDTPV*D)a0|&x`gXt%>dSjy6-Qkk+H;Yq~aB1%|hGdeexB* zKmX|ZA6@%N{6Siv4v|AJoiAMH>$(OHjr&ba1!^WvAJnl_z7i3Fn;-JntPkK1N_#?X zRM>KnNBDzshBCeHxztRQ*!GL?AHhqww}()b=u+0mB3gLk?Ln$ zuhlb$kKqrBP0JDXp|5@+eTs|pn{t~yiK+tx@hh=A_mbwRXM%T*$#a<_|JbMS2bC0> zaA|oaa&YfOHe|rIb-1U)d&S(ZSC410Lq0DvMNPgG{*(;34jAF5@CV=e_!@VWt+4OF zFHx!Y-Mc%c?aIeU?z;{-eGK>^f)z?`Q}T^|2!BxZb*Tj`1}k$kV=T&uTMO&u6u>?_ z8w{tKhSLZKwXp!JW$dler>Irt-P+`*MJ_ml!dFvyz*2Ip67nMF_|X1@J1BqqdHg}_ zxz4;C;)Ah6KU0p^Cl4=&UyQc;CBQ}Xi`VsPbm-iY z`DQYi-K{Eb{-7zm3wSVJ{K2vL{@f2Zgw)9NyMs-(vn!wLr-b$>g=+*EX9}8i*Q>8$ z%78m+@jmWVb$D=QzOrALpWlb%hf)L9L48i;guJ^p`GHl=J3dEUQK`47_>437be&1= zxHayB1xQaG`kx4U?vH{lNs=HTjT44_ulKgAzpeS>L)Yr9M=GdfULl(A^A ze(Qi30O4iY_^`3_#lxi*PSpgb0kbJli>203^#|b(c9P`p${n3^{%9-yU}5I|8Fx_r z_Vf6Ij7^87#Kzz|%xLrW5uTIqmd7*lC~{xnUKdqf$cAqYMw_RH4F_{D8v57*AF@M# zI?o+%-(6?N9pMksPi5UD2KUeL2Q676$xkLyvPhziW6m$$;F!O_HoIU0*t&4zMIIx& z@dmfOZv@M;yS|fSG!NGfOmMRG_vx{mf>k(Xy5SnNwqSbySp7lTuEt!9t6g6)S4jRu z`ViQlw0*Pc%v>Xt({=0#n_BFNIr1U0n0LVi@zGK1PI8M%9#Q*ja?Sdu z_=DKETD$7#MX)LoLebV3xm$Dj(`NK&B+8drd&Ru{qW);n^2{@StX?}NoCwB?kKqrh zbydi@dG^UG>cc4?+)~2ZZq$o0$kvqFVEt}IP}K*kKqr>dJsFG zJd)(&6x+@b=Qf{7y;u8nJ!C2c<=An^VL=`M=JeYMY!m+No;U;Qa1MvWaeM%OP}Ld5 zg;Q%!;oGeVw*o(JO0J6)!^G+M}3H6Du?P82+GITgg6& z(-MALJ)S)!^0Q^dqUL#al=7;xPO&SzX9{qi79FB6>)C`Z>*BJO{uutC+PC6|VlEf_ znfXx0;XG|*T2y*6#C`-DIXM|(lnR}fxnFvv_|Yll50T*y;{VhS;aqWa>ig|lIFM)X z<~uy}0Dew1_=9TQ#X3^f#7C!a3-&|i!Mkv4$oa|<75<>$x3V7QJok2jdw}EI!4MoM zLx6)^i2{F6t)t%l2hSu9Yrm<#Yu!0uwo)Gs>^TDbL2O_AT9i>_o_~>3Vc!rn`1{2j z`w$s;83F#FjA4gFYSlF*R`KYUdS!5C@MgN!9)XY|68u3+)?ZrU+6D5t5Q7rzLq7=DK@Q3FsuhyNlM<7$ zn>@;GwQrQG?5(PGYyC0&!Gmg)U?AYHGQnXFD%L{P(O{n2sx|w)m{^P!)^Oh5nU{Pu z=@hHN|01scL->O-M@w8HYe6MLr~{d^Re*zTX|d}0uyD-86}Q$4o>5j-yPSemNuJ0z ze)BKa9}HuX670uu{)ld5?U701E7Us4_VcpIg6Y6(F)On$W*ojz(G*Mte-?4@AHpB} zS~C$}8Ph{9p^CNWH#@1jdm?_p5FP^gPOtbItHd-=%g-0QhTM=U=j_Mu2j4c0T}a1b zEmet67teuUX{V|`xQYLL=$RDzGWC}~Fxzmzx|>z<_}Jc%2dv}+>JQSN-gcpIP6Dmk z+NoECa|37ABd?{O6I^!fn=5b|;aHi}Ci6z!>&j{*D#oYq2X*XNa?8KRSaJpzwm|*j zuO?TV51&T*5FA3|N)B5OoXjYZKB{ut5I$aiwuH}|BhTF!KJ5uiFa{q| zcz4g~y|6ph&JPI`g##sdOlx3JAHp9L5oF9oCpx~-{j1{zJD=Q>G9Sbm&R{(R69-S& zjmE9Zb+a~x;Aq2Zp_jVssD!&BVIJ?0BelYpWsdZO1TeD>1U=_^UGw&JK z;rO0mt+l5fr?Y_TEd0#{+~CjP4@!=VgQgAB$%ZR)x6eAzXRP&8BiHpC>*vnOj;y>_ zJX*b*3!gS$CN6`q;JyX7-FyyzPV*#~l zhvvO4a%k>8e|h?~jZ^B`AH*LF_k(JUC2@*s{6aUGwCqV}w(wRHzQ5D9>(!>8IxS^PoT4SvkpirOly-8sW}Me#?=a-}WdOw>5evQCkF!Docnz{?@G z9(4%4p*Y?FLjHCBAgz=G{9H^#ondS^dtHgIrsk5?&R+WkY?@q22hChhiyTihRJk14JhjEI3i+M$O zQ*FkxXz&MhhBD8%Z188R{kvw73rOvQr{TOKb=9oT=MSM=gUP(+AY3Rditik?e{-Cr--RqE7q+Y)NleJY0A4=9Y`#bs) zYe=vWnNP~}DOrz6)VErXz30rYxl=vLI_>w@|LEFJ;tyK#-M>48ntZKTOG~g583*M0pPhV0K1bh_b?AS-U-sH^hQ2lVUKN`c z`aIRWP`|-_r3vrjdp(5h|Lt$QMb_}Xxjk@i6L5uz$<&DRlQ*IhX@?yD$<-s?pBi~` zO}_i9z5iV%!7GsCC)FR6-~5e77&etA>i8Pr2OsrAn|?+=ku|a0_i%kLwFzm&2h<-7 z@2B*m-}E5QMJ8n9A{dD4qJMdwjUkJ&6ExIFSdWk44~iUr+P5stqc*BhTb8TwZEvw$ zHO`xL`Zb6Z$xWF5ApRhISaJ`BhbZRT^8<4P*rDq+^h?kDz(?S( zeF%S0y0_Tn*YVbkP8GOpwLY1XH;SBzY2WVRs}@XTO@t`iEW4S7lK|i7GwKgYzt<$! zf?zpe-X$KjM1S5UeEL@9p0|i=$KPufR6asGMJ_6Q*nTk%L3Jl8o1In|WPN zSm)P(y#LBC2M@=eCGnLaOBJlJX}SZywqB9YYYQJz>aTqQe~@vLwlhboyqq!JqW++> z#yJ?4NFFFKguCJb>W2@O{wx-wA=kN#H%*AS7j<2VlAblK|nsAuG z(*}~WR(OiLwB)&?j}2e$z{^z*g-datca8M)bNGY8X(oR&HX*ekO6Lqo?7;to>*Y5Y zlNgVT9d)owYIMdrv(~e*Ufo*6hf58#$>;C~)p~_Fq#)}YtvxG{qoj)tVja(e3+dV8 zz&xg@YdN@X%|xw6Z7+p!icgn(iJ!tBRQo#_uY?at{>%03zXhc`h}9%ZZ&EmD%G+EX=Ct4080j zi~lm?71xY+G`0Rqq&|l~C_Y1#w;;D&UFR}KV9zo~6jz<=9@3iW>}DCKkn~#DCpG%g zCK%L7HYb`kO@0i2P<)8Y9Z7AeJ-0qQK@&f&(RBxQCUY!z%*Ei~?4J2+FL|v@8#=id z$1|clz9*vUp-gC^=GWb##LVMoV9+Atoo&Wb#^H9;nn&F&derDlHg_-FKg==J8o8Fi z6V<7a9H_ z;{dtTE~TkfnLPYTzm+BbG?+nvpSnca>ZtGsLpe_6OJM}jZqGld>ji&s@4}Oc5PuMT z1ln=-tR`tUpaFUaPcRX{!4hW#>JN%PEik6*OJPro!~O*4PM}WI1FthO{6X=mNttl$8gMIJBU8eOeFY&%pLFs#m6N+YM#lVa5ahH zkn7Pne#!A!ditf0U;6kv?!d2p^>^IWKlx5e_Dvk(R}{?njUiCaNMXT&(SA`!jyDuy z`avcV$ra3_r6uZ##OLq_rQL$7g}66!o9uIyFcNnW^M~4A^33Q~JzlBRmy*-#Q2Xw^`^VSE_$Yr;!`}?H~?@m<7Q(WvwJOko^q&LH>!xTfDBzuL?2ZL>!|Z&Qmem8ncq*J7*e7dP$C z;SbWU4l>S4y@GZuS9bfaL9RfqIDEH8(=$6@gHpdQ)uaYfp1P?EJL|)j>Va3?@l$_D z{XuX8CN^wbjkoDlW(PlI-NZJ)22a?<6&_?v{MP2JfAnz1F^27ltIkV}K74W?!XLCG zUYdhPgo)q#1J~c#U?DN=!(KOWkJkKqrhH6Za~j8iXf4zHOx z)vwmcZP{;5`*YWuWnP1B?%K<`^;r>qaGG4ILAP_=4MdM0#ve>H>TQC&yF=zU=IoTr z7rk~evv-S~ofR+^e3>JLUNLR78#!;M=El} zm^WfAyL){)UL$tM9iQ$Xl`7Q>PsS?nsXMszdEy5x^6Y*He^B_^tko;=euEtC8|0ww zpyV=;@hV4M>SIiDeUJvc-l)07`_?hwv&@4Mxl+M7KZZY8E|6!Ou^0O&RLhn5V>Wpe zrKa<37?>wLVy(Ii4)8=}j&*ggaQf_8sEI)%@`p{6X5U_EBZ;0i1n@cQy*_%J6FcrYW%5Uhjr}yQ}~0rTI;ebk@;NWq$SRhTsgX> z#n|Mg9A8hPE2)i2MD@j#HKk+j4^EK3LkQV@41ZAil-16l2c~o6K_473>NH5~bk_B) z3*&1VxeC*4EYnS0sTUVG;DU53PVj_J;15ch)yaHLKhbqdV#(#8({KjE!k!1}+inFd zIEHNxz-kv~c@8(~Gx&pF{mK$us2KYZ1I|eHVRb)PJQb$-aUkqoWINsEy;6>S%eLxIeM`kW(x^iLgI%L5mdr17zAw!4aAF)`{C~1O@Z z2Dee!hN{b_E^7oU8XKaTq&&olbR@CRup_miVQ`&IlaoIq;a zp#$a)YN-jwg*S=ms6Hp_7d~^4|3&|zM_Cm7yY&anA05$(73(Z3G$l4q7@ zv>%=wZ5CWa4QF!y+sW|}{6W#b8h>cJ%Eu!8U;3367#93s`c=r&ls8IWLT#flkw5D2Py!MC_^rp(ggfC+F(*EFmBPUUn^NaXcx)0^4rV1MHK%_28yMD$^XqT&D0SrUF?lEa z;9z!s6`Y9Edo`u5jq*VaUU|Rh_Ya#`CR17FbW6r}8YurPY3sLxb-~-t)fg)ES+sP2 zaT&PYsNoLGxWA*_o{yjB{hP}FF5Iaqxw1ZkKZqU}Q|kyOYj*mRC0ykU`LGgfyuqUU zR3B`r5#IM(-!~1p1~*dT;8WNTSf=0X3nvV064~HXsXAs&e0p8s#Nb2vlhd>LE~$f- z>W~)@|G4mg@MkLBNj)@v$GZ*T_LajLj=8S%Z`Ok`-TI~rHNMI#`cYUfkNK_~UrwFk z7+-sXxlm%=$+fH6NM1|d?7DpSrgOA!1tW((YQpOb`Kr|VlX``|U?*$Av%o?{&ObY) zo?b3<+h!l*R>nO!jpw~Ejyt<%)hXsO@c#G?YNHkDYskm%w5IJ{PjDyQl6uDPL*_Te zSWecd7+P&kuj7pz$D2f-QtWC1 zq3e;R)ko%3%_$mPUCE&E{;C2wcbw-~3u%O}Dg z?D*vQX$=E=vvEtM`jVtx89h_!Tq~)4Zt$XR%kkEqUGDDl|4@H0SAX?Ssa4yvW{=J# zD8(&5$WL5*NPedYo2&HXw#z50i3BBE8#nYUV`QV#D6`f`sL3uAMD{^y{6e0D-kWPr z>Y6rG(Eil3j{x~o~pFE@fed^lr<~loXR%#>RhYH5U zUVwo^)|Y>Ff)U54iw0>wx#^B=zm(>CH`K$v!|!uU-<~YJVSaNf4wHp(W_;@DFUElS zp}V6#v*Jm-#gGSCLuu(a>%V<>a3yv@#u~WUv)IEG{+)2~#y#sk%B^0+m<;2?Yu^a2 zgQiFBJ_2ADJI{9psz&6nL@w)6$F+Oi*I;k_sQ#d5q$keKF&?{k0{zOpnfk_}4jwG| z3@5YYyxeQ9MlZitK5Wc$N+6^v-szmJYG1}(Gj zuY>r-891%-q~3UW-GQ@<!nt2#QdN}Oh7PeUssKoRZiUo@jUI{1;&QBoS|?FiG^=be>6Yx_9bFb0^zZa zf?;|Rau4C;3I~zb>bk-G7da(2rsO-b9qMDo`5xp)H^-i7_vb~^Ucbg(Dc{2{yO^{a zkHeaufzP~t9*;5clc@cWmLShDSXz#`IyWa5a{V=sF?2U>H@xZ1o$L3)T5C?dBELa< zgUMr8GLD=1*)Np_*vCTd+VCZaZo<9_n0lo+CMVZ7s6b;rw|V zrjGl5Yp`q0JDq)gjbD%ZfeyT&HTO!?`V9E3a4f-Y(%50EFS#eTYjZ^E=@>&-?cfYN zY=c953w4eBo9MF2m?kkLW|uLl{U{tZiL#Zo*Nw+>m&;dc({*4tJ8BQocKoE+dr;~v zRsF#rzMij)Y_qO8hn62dwmQ#4#?e|B-RZUm&4S0ewP|mXk5G=#&du~7?e3&@?o0X=^1OQP z?iw52XVv9nW|KFy+?du|_gx&nJM~2UGjimaE5SWgKEk+t-{tFt>fyvXl-Qdxr&>2) ze`15*pOSM&VhJU`MMldWAFbygUkHpn{b|FP?(i6&cs4vs-x1kXo_)6P-$@(=uwQ1n zTFy4UcPb2SUXCvpf0%q13xSN58y!lEOr7N51rmSBxsb=+EBSDjn; zx+}#V#WXfwTFDsVlUEo_eH`pt)O@Wqo&%@g8l{?VmKv^^@2S&BcO5_8QRgmbi@iF< zd-GAe*F8h-$C)~f!RqO8eRpp}6$eS#}zeQ-0*GGRJwm zywn&6;Bv}ZM*Mp?s>wMfI%*{g7iv5=p02ycrds*2RbFPZ8{)EFyje5Ok88|g?qp4t zv@X?BZR=JN9ldm3-l)U-sKyU&xwdsmwZluU$yttX@8#OzQJ!3$<@4jE9(kTWPi;)} zkv+Qon8m)DF;>=2%5PqlUkm@!SreAy{qnART+JTO8LwHJi;qV=O0kSL{zSW^ZEF2q z*Lt_5;S9=q-4gsj`RY_1Zr+e}g4WqJ&X#bE9N#$~cBLX2NOP0Z<#n87bM{2n?Ak1~ zudz;a8j__aE%j1`Sm2pjdJ<6A_xL1M^$E_XgX z{L{%xoF{|aaYE|xb0fKrS7O_$>ue|GU_E|3Cb7hMn0^Wt&sVWbEn$0NC!wu`Fc>eJ z%0@gFwwCC7h^SIYO6@Xfj{HqOXY`fB@^E~NFS=%wsL%yH-hgGUoPlznAc z{9$y?GX6Wk8hJ|J1Q9#5u2<7)UHwJJ>}=NK^{(H1IEK_%7IlN!Vdsp2LPVCDtm>YL z-sjn|+9c5&@h$TkzdMv&)30Q_lH+T<;>X?HW09|3cHAN1ISaU_j&IMyaqBbqgR0#k zgWv%2FM*$3>T7Ss#zWbZfFJ(fFF8I-LBI6zOCNv79r)F+{*Jr)zkjD-XyG*R-WwLO zfoWZtL-29&H_?~HG$Qjp&)@Y2nN$Jc64MXj56U``Ij~%&CcWH_jO6*SeZN4?UG*9v z)O@d%&xh@-J?ortO*uuCmk{jYL->REbrqH%vS@IO%6)RaZShp?G~Hs;iw>-GHh=0J zAJEj=z9HC+0S+bH3TjM!O8r6E=Sts^c(}4)gXE(&t=DyPxQtuJzFRoaX0u71JMgU+ zJ|4*}iX67l_XJz`82+Hr1A8g*u^+4&5|L{uQ}lLEumHjAUid+UmjlPqyGf2$e80^q zm@W8@)VBN_{-91S?U3h1Tm!LKv&DmWcJdMVYq&V$F+Mna`qcL#ry?ghiLJJ)fpzO= zePsF!{va_U*adq8>0C-Tv0Fd63e434j4%)OgMU#l+A6%xWo4o5}}Ie}WT29VP>OaIwpE!Gh2D|G_Qx!XGq^%+X4PNzZ<{1RsHwpqtJ{!$n)tHPVComjm2X%fD=w0z1oz!hfmhQSB=lT z)N9_i=S(%eE38(l3-=YfG+M1$AyD(0+JDlOEJQfS93sik%Z1KNTli+u^X(b_;aE*- zDk1~;Qgv{38&0*hyelkCYGDn9{{dEE>_<*903Y<*;`>zdkQxK=M~mO;>r{D);buq& z{&osSIT6FJpWnSqcs_f+GtVY>vh_^7W2J?>Ufl=jWd2m|pFxPZzkPc>yNW5m_ka7e z_)7Urkpq6M-R+=*c`Ptzc3`I(uK{)}W7N(!M~guL>|qy_(wob6{<;nF@QBfi;1&V6 znz6vg-`aRaspAaJRo71Ai*~??IR`=A@zYJ$$hYM2+vzz?&u$IKK*etcW8c^eLOe%& z@A=*6VUU}7)_r+F<>L!K6mFbHKhc1*Y1OOnzq9MrB;i17Hkmyl=KPuhu|YY z9;^ur2K?d=&r-SvE<2!)5_B%O)DXXGehqdf-?6IJ8HTved#6iYp^`NPQ`vTAt6*o3 zwz=XKf0d{}^eeiNI94#K-5Ty=iF=>8_m5f^^h~$F2Y1c%b#wJP$*1WLdxFodct2~b zO!6_9WED0ccwf-6sUauWk+kIqc8tFhJgpS}hOa3sjn{Hbop!LLy$mdThB|s+wc}8R z9{2QaTIuALxj8+BKF@nrj+t&$C(F&tOEsNcHCKs0=G;&8A#p$nEon{5jyGp)jfpMf zE``i))v4xEqh%lFaQ%{>-D-(rf<7xYIPBc?CbFb&UOE}P|dv*C72qqx0&)9hxHu)&S*u-3sGlRj=JLj>0XR6dpUOP^~tlqcHWWA9U ze2_kJ9^Q$|I661nObWwW_=YpR4NB=nwwWI-uD4NZbi$sy-_IPd|-S|F}iXYOi*#7PX2i#`zsGhe|`Y}^Y$az@iV)othN3%|S zmFXt9-+Qq14KW3R0}3uY`VLzgDxC-M-s(B-^;21O-|h8k3tlS&uJTjQgs&|zNc1V> zAzo>)di1LW@WIUdQ5+HTh5T|3sCq_2tf z^VX;T#BW|HMW4o=sa57LL?4Vb`3e^9wiRs1w-M7crQs(o2K3J<#wYv-+{UMyDIqxsTn?YdWA#}8btQ`dy? zj8IeP+k?k?Q005x!f-QO2OU#3{%jG2XGt+3oFfjpOpMo9XI$Tl6gUEpHbb ziv7}*j*wBC-2HmHyls&{_;$q3=(JrvXVfxF_O*F8Xq_DFjohNdEtGD@!X}fh6snVR zHhCByv&VBWyRTZ#p;k#8;>qM;QcUm9dSV~D>W5l3bvSpj`$;i{Z(cX`={{LLq%Z!k z57xN#iNA9EVE5docdos#A4aJy^8;-usCLj|X;UaO>ssLqitk$Tqgwp0Nsy4y1)%I~~4r0@}dCE+O zRckY;)(_L_^fEndZ|WQ`uj5nwFp6nwtE#OU<)2i4kbPjRTxQZl9aJ_z9%@T$;dB+2 zw4H7y_R4}K*6umXaliT61^d{)yrDSv1vpsvgXKqkbsog+Nyb0L zM%q8gALO1@;H)5+ZEA=Zpm6mgENF3Gj}V$l)C?-CvJCmfqtOkkz=0kvd(vJd`=yN zCzRY_nl%uIU^id5n!<5Dg+EABt*P`~mD8C$VcIvA#Hu9l!>Kt-8$ay)HyOTUkw+yD zNi9EsKZq1Er^=i+HLc` z?D$hARr#K8M>y7gdl}kyA%z?gr=fV}$guUzgM*DH1eN2lUqdbr4mYn}4e^9lE zwqWyCJ58TD1%CU=YiXMj5Dv?4apdal{HJ7)7azhO1n;LY?{!Rq8hzFw@GW9Am(oaN zd*A!FKE7Rh_s@^v4=OvS)-F>vZA|)m4IsWie2g;v)O+osny>!*riZUf=#lxF1-bb0 z81@**nM=dI3fEQE1Yf7}G0A%FyKACy#(R$Ned=p1^*#Kj#t6Bj`m_2Q|9#o`*Q2^F zT}S3~iGL**wS71d$H4wwLd-JaYt-~;@CTVARouSX;|BhPh2QoT_9yOBMEHZc2JctR z>9Pifiz@o?+h_EM-AHalnGZx?(tkup9HP%p;}6Q7C0v`xS{KgX1^)|iaN+(_*6s97 zRp(JUF*YFm_yhTav^`wc3Km67qUqX_cV4ys(61;xpo>rE55hAL8;~)BHDn^?`v-!c zsADPe$+!{~{-DZ>A!8P{fIQTAeNxBLSL2lEK}3uOe~`K#Z(BwVsik&z>#{f3M(xTh zD*Qp_E9N>HeGq%r;=Vr(4!P-dx0-=>h)*se{6RIJ(|s)Z7W>#&(Qh3n0z6nO6>RF~bQQ;4U>kiiJ=%U%EzrY9Zi|Xuc&Bmi(=#k+M9wd)2or{0= z>-h|fEIAZ&*?YgMHD?9o!-@odQ1)Z=CmkHb8FVGK2mZgUkMG6e@@3>B!ylA&;-O!z zPqj68|1dC;4|12sS1Wxq%|M8c41ZAckw{P5Nn&Bh5$r#SSEy?1)P%R_yi1LpNjbVKe4Bh`-ze^5FV zd|x`3*ol_6UrY1s%nI|iXBy*WIV$`?{0O>k$#zNN6voej=TClekc1t<_qF;N`ZNK1b&@euHZUl6;sAMg8%nD zpYWVGOTkIhBH*L=gQ|Waz6M(F+kNM=%zKZyH^nBKP>_3P@ny}vxL zG}C|=CiUT>!5L+w(-_AVF^D1a-Gx^?g5{7e z*Nnj<5gw}K@cVrJAaexxCX<88=kwHF1rHo2hTnY+b`HlpBK$$!LKBunOoNuV^elKU zrl#`j!V6}ssz!xBNH7(#V#Ht_wAg8rA!ez8zuo9a{^t93T#68Xka1UVwTyOlrf|mQ zv@Wnq^bD$nXa(YDFN&=B3Z5RI~N%3h}$K*>g}W)##gXOM>tEd6>;f(*IoiqNoohvhKPWM*2}$av z-TIg3GPA8uTG!4pJKMpV%tVJjSeAKE(=GOc=HvA&7Cezjrg#qWrbdQ8sN$8tY%@M_ zyPjRY%J@a>CG%s3`V$f14@%BXY4;&Pev;`qFsQX8d_0BM%Kl2?1R}s6l>UPp66;O< z6=E{l2NmNd*Oe?X3`BrG$a-DHG|*Q3C2;j+5idFbQy1)6#VJ#N@bmeDw3j6oW0usz z@qFv7^kAu+l%f<+9y?-SU=8qZ z@&`jZXS|g>Oz+?Z(TDgMrGIfof)mj?Qhh4|{6Ue!k~PUeX@VRsn1rm? z6XY=x+ZFryeEy*Lb!jO5s&A8nK=BS#+o>_4Tk;ph-Hby0LHZH;u$O1aYasT)UQms- zanS>kM1()6)`Qe!p!Q?P1CjAd>}0f9ts}!9q`lYz80RBE7rbIlXC1$J?(n_m#E%t; z`h(1MYSQ!U=`gOasj@bvY*yf(2ElF&4>BVBLF_^70{;AIwbuMfZMvd{Xc=D|ygTZX zMWz0rC1b2s3XJ+>+`1H3s|NYrsJ|#R3vmL`x4=82P=AoMAojuhF&!=1!&9%xTmqP5 zSFsIhDMp1qDDlTEbj9a0yt&;&_eg#Q$twy*sQOk!_=9S`)(p=tY)9z=`A*l^N@@}e zUi2-q8x{T_)O6iyisS7{Hv+vc+n4*-Ix&_{vgl?wVbbgZ5G&L`WN{{ zja++`)d#aqDia<4pvonac=YkL+a1>*tjQysvfSc4U#!-fk>L-LD+(J)+_&|e@5k^r zRI%|?U+Mzi-FZ1G{6QJ3B(CpXsISNAb{)>0M?L^}w$-W2JQ5lHpp3i3Wcc>Qon-o3 z_8aNZGMQbj8dhQ4E<}bu2=@^=G&e|$WsGGnC^Zhy5l_onNw>tG6@mJLvTSF+fnSt; zlRMH~sPa!5_)-*2l;52Y)1o^eJTdc>dszmt&J*B@jrNd9AK_ZL2^370dkv$u^5e~^2PZ}))^ z#c*G%HnkbzOtk4E+lmZ-5MQEiCL|9W#=$?U4c;vIAd4&CO!XqfA4DJS0}w>ThY8?3 zX=fYwu)w0o0~s0qpyUX@?1*Df`FF`nHhb;573w|WTO==MMEHY@LmAJXE>S})25!E| z?kFnrlDvJ$ATX)!w(&eEV9C5PvWMmUcNV+t0ZV zKnP#EfL&PQyRNUY>&Wm2sRfzv&4T?XtjpLp<84kboWVMqr6P5%7#aSc8h7gt$D{tA zccTWQ(>o?4RQZglvA)F`sstxn1^W$n(Hon#u7`NJC&$JR13{6PvFvfhmXWAGC^?AOM?G~F z7pG$5L>}}YHSk0>*_%gzKX}OG0$cnH(vPT#!(LG2;B_8OAY%6fMy94{a=+O5Vd)qd(? ziB6)zAC&!|1*cZV+&;1h|At!Ps^&T!3;$dc_=Do7^2~>=Thzl6A*2qhM#c~Ejnc28 z!XNa^t)t6WMVnCw910nuRNXj{Bg6{j&%#?nH-g`)=W-T z#xj0kC+eEmK4-|g4WFwyM#TU9DP#Bl<(gphU+V@LYQXR1x88V5$d}`L=o+*|xXV%x zRbt!TpW|mZ6!xL|4(}D6i0vxQ6d#n=5#bNwW5CYE79@60<&ff~+{n64{c6^V(clj% zeiu3ve}m{w`V;F#{zKQIL$2u&s6QyVK4>edkg*pr4wj5hoHCza=c@mIK7SCO=tapv zSJKM`bRsq(%Gh7vDMG1s4#$)1fzT z)t(Rg{W=)0sB^B&8Jp;nuXZ&L%#?x8dK{QJJ{JxCAnRS(n{xx;-&ut;eo>eHBsMVg z4QwGI{6Xr9?!vj7n#X0Wynl^O=nh>stG?1>H28z$!Xa;0UDL6T%yCnUt$k; z=C>}pglqLb=NWOMe^YPppJ()vgysz-s zTz0an$;v21g+B;p@WRHmrzbUQ8Jh+t#;R2FxqTUh)1wj<{-94i18ksh=&df8#n?B* z#%qv$}8wm48?52_wNDRQbEqIuUWoA`XYzPpSQS zWcY(WlmoHEH~s1S!5_+@eCq72GN(eYcl=;@_X0Ueu%^s)sh+e zoJ}06Q~wmNU^%GE|Wp_T+1dd@j>=-J{FIYV*FGarI*#6zR8`&e2@A*{`0*3 z`Q;4**XO(CSawq*)lXDk!Qc7)+#mgm`zs5(&`{Y`>ov-zK{MoqH2FCR~E8l9n>UFXzU*o$n zx+&b_yKec|Z+iY>rM|r+-&b=)>FC3kYmV(mPAl;zhsW=I=Un}v9K0tA{J|f|AvPWb z{@{<~hz@`7-RFKi{JI0b?!d1*@aqozx&!|&cK{y)hhQIJYzeP*OYj`Q*HnBWfRx&s z2+o7w@k8qms(l~rRPE+b*6FgJf)~R7f+g@M_&onUn?IOU_nStCc(dB$lIt}?&5S7V z2L-1kUMY-wMHq$Gs^FOELvKWdKZtJ^JrLh2r@;T@pC=AkTV)$-{8KhI$6YMqsSLEOYo4$79bhNK9+zkGBN*J60}Z&sukN#NM29~pycO&tbL_WDv3~Q? zyTynVW6jhZ6NA-=4u6o?601!ObodgCO%jhdT3nm+XT>s3mvUtIgABWBzsDnW4Ty8) zAYPIAM6G@G1M|GabLM=bmRYi|&AUPCIrfWN@YH{JluLI5LE_!(}>QjUt>o#qZ)f zqQM`OwUycnN|%zoVH=-=$b!+RxOdr`mmz(%dyeU>zA&6%4*(YI1^)tg;YG0U%agvN z%N{_+K#3ESwRHIX+$Y)JaJ*l~%iBVB+@24YRqej7oq}Kz1jBvc4h6Yk3MloSf#7N- z=h>cTr_vnSquTOrC-<6ms`X)*V;ihTn$3DKfx<)vIluNOvR{t?e~|i#s?BBYpUBJ^ z-cw{De+KtY^{qEU?p1)%XK7~K{LpgpQ1EKoT_n%^(WR6BK ze0%>Me^B{!X_kuLkh#zzB>6obsyR{q76JaCy0Zsj+rJK3uYA{UkR>AZ2N_x42Rixo zT-IN@CAlV|!5`#)%lb-V9nXU5y+%AJo~^uy41Z9`A)HnTiEZ|2NxVL1B>01>_9H@s`*L~2*ZW9L zJ)in&p5Ri^;19~Z*DVW4go~knj7u0h`9)XMvrOf| zQNcnC^brmIV7MR=*dMzf9^lO%EFjAS|0sM&zvS(tp5mCZ+nKbUjdjPjf}k}F?9Ik4 zmFml{Xa|udu%MbDs z*B*}W1>sOiPj0(>vYJTj*Q>@2?6OLm8l6V@MjsM@Hax__6~@`tbxZLFFCnJZ1Vbl( zt#EWqV-6-#yA`^bO6@?1aO)WO8{&rZv%tT@N4-y7JKkJp=gmrOBx5!?rzF2J4x=z< zgkar&eBwI;CuVVKB{$u%?U&Mg?`G+n_mS^Arf*M{-Y~zp6^F^fI5R%=^cOz#`k}i! zGDnC0PZ2>5i!~JMlkCVUh5SL`D#L}Oj$%~!gZQY3$B^}vmR_u~ZTN#F^hW$ZZ2l}5 zT2%Oh=!SW(uO&F)dUbp_cY)DN-nToqU0*SlMT0*mwn2YRf)5S?yNg{5_pUj%()Igl z_3A~1Kd9kXmo?PM>3H-fiNmOnm$S9ZR@T#ODl+^*u@C(Ke{j%DGd2yGH&}~QJC9w= zD2@-csPG46Jk$?~C%0 zDdWFBe)-+-$9;DF!T&13w?D|H_tW`<-x~Yhp1k$(>HNX}*8Kmtjx3+fAN-H@{?QBk zTH;OlbpGHUHU0P3qQD>geVc#(T5LQD{K4P1`}ePZ@dtl@M}EEjbq9XkfnRsv*B$u( zt2=;?f#Vl{(C<=H$E=6=f^em(b@)66d9>hNbS-?tO?4V@t-emVrgA^Z`(t%{8{~2u z5BXfmD;lOdNYx$pR(|wu1f?FIX7iZS@psA^Da2ig8wJ0_@Akca_ZNRq@@9Ir)XcJi z;{V6qyT?YJW%qs6Gm^X*S&!8&u##5Du=##Ji_ap9MY8y+B3XPC$s$>-s?p47cf60$ z&dh3M?8<6M25dw?td0c;iU4a88L_pFAsIoCG$7lfD1XF(4M$qb&R+>X9I znON)2`P^T9iAspNpt^TbN`_6A@jgix9xJaGgqh5sg>kd`*N`@SWA4rb!VD&2)&7}c;88U zEQYG?QO2t>EQ<-8ZYUe%KBJoV#<_Ei% zO2f00xy@|PSo_vMDwSf+kF%|&rd9?@?CWy#%=Ukkv{fp#ua}0_mTV4m zqcAi)laFV|PBYz8`N4eDUGdU*zSuo^I@CXfTe%AP$wFo-o;xkImF7!kFK{Dn?s74+ zy=?QSTZ>0S9doNIv6Dh+boaFFa5TG|$PXO$6}FaQ!|ij6RvtFL$zK2F{z02_=sb!i zdkdNDLMhR{W@V8n+1?7{>x^N!Yjek2r9^kq=ERqZ#gfe<2N%zkD^uFE^4xV{G9}yd zzP41%WUX$@rb_cU+yB?OX}U=FvNeC^CzYS?o)}B6Z=4jmCi7ckeWUG1t0vd%+?eM6 z!QK3!nR9DjHSE`lL;2;y_;B}H?_|I2uR1iF>3fT7@%@Fhl^u7P4fRBBW-GBav6+|} z-I$+hU5iidCTF`lw_;r@$(@bW9qLCZlbyHCE32i%u-W=9+1e1wYZe){YWH)N-rmN^ z(q#NF)nj_l)ZXl#?bqhl+&@^#jy*8&BNj4`}u)r&(=`#^tg9ve9`1ipo;G>r^mXm z@qYJ?{*sORk7iG2xBDh`*N?VV0^Pm5R@ZFYxOT*?ZEfx!EGBZr^z2w>u=W1f^zP<- zylr`Pey?XaF}ARg92?(R9$VgD-rGEM*V6jI(%$&aV%z=n!r1-P#K`o_W`1b*v}7%M z@UwMM+efzN&TKSp6!P2cCENEH^qn}r&aG84UD$qB(d>*U8g#2`l%?s%?%rNC_Yby@ zjE)?Qr?T<(OtPoA*S2^+n;adwVil(3a)WwdsjO81!_#nLzSIc{26SP>ZhtvfbT=8D6foBIci zjcrG-?MY=X>C)8J(W==O&1EM>a%S80pgq-*i*9utwXY23vWo+`XuLnyzA|u_O${7c zU*aH}G8?2Ty@%P+v9Z?aseGc}+U=}09j;)kNId(Zwiz}U^RXh~r#XGO!P_hUUpmV4 zyNDg#b|=@_u-z`%9^2EMxxUk3vwyPH-rIN3J~(!mU7Xra_73evXL@#$6J73VpXoB2 zwryK&`=^^rnoK<;07~=#_M3>>eun^b@b^4*% z6Xe5AdGD69$$?+$SNZ4Cv~qHCskwj9&G(tzNH^zX<1viM*qqdq?dh@kKkq7zVe8E1 z4eVQSp7}vrE6kk067z~9&Te9Svj4>FCmwAc6nAa7da*k`(Mp*ymf-A>*cd4L9NAN% zpDX9){z0>IIbr8zjk~#6&B5YktUQLyW}ZJs%e(N!{2}FIW#;C1=Q#(^*4bz5d>eOf z_Ug=TpzY@v$_*^_#wIq4tqb?>+gaK+SAM>&$O*>g{=q&gk0=-y3x~$zL(JLQW%IJ` zjK4kGhXKBqU43?rTVK!NX7AC`RL|*Ne&X10Z_jT{j^zjYdJ2UTi^I-I8$4kyZrswD zTAtpTwKLAGOwQ-e?Y^URVd1`sHP;q3_YbBH3uf!jA;oOU zc+Lh7`ctLtZkx-sc?@05C6=$^w(V_Y{-n5JbAlE&(Qk9UQMcFC=2uqca*K98;{E&U zy|$08)V`mO=cmkO^TbIZ7SC_B^^InyW33CUA8YO(+}&8s7Kex9HU_%}jt7Ng&-(G| z@KRS{V`(kE6VGjJE>2Axxod6ac#+GV7uI?Y6066%iLTx4xvBWp)auO4c7NLDcx@iu z%Aio1S}hFQT83cmk-f;w0W%*wXY*f+o9X#QTV`VRD#xNb`FO#};O73pol>IT_ONc7 z9S57sE462GTm9n$V>^4+m$AM1oMo^12-n}C&r`nWm)aVH1+&3p{nXywqp9O~|3GPo zH4GcJCp>R%d$N!znN9RObtUEI=!Z9wd#7V3gJV6*sr8kOVqtF}epu+UNNtT@bN?Xy z%+7`VvEk_E>1fAH>u`4ca5TDpG-d|=MxvW}n+rVQ9oGo+gf=%glH5NYv3Wx0+I@d^ zIb*{KN4>kJb8QRbZLWW7V>r(CA$=q3Eb(8f>4YQgb0b@^-PFp_@rpfLn_=e}@LMni zzPW$U&F9&;^0CcZEMFSm877CE9v6Ms{`*+p*O>Hzv(cbtzvcZfA2gY;Bey^2O8P_8m8ltZ^O2 z-ZcIu*A>du{}Hgcf3Pv<4_;jw=EKUgxqq-R=MUCX9?kuOBYn1B+uCd!E;HW5#^=<* z!TiG1L2+$ner6-Rl-`<~JjxGko9@JMlQv(A4dLxl-h`paL7V5axm3=bTs5P^4s&Fb z=49$AgtDLJ{=sX2)%4m#pou^efhGbk9s)a#E8HaX=o|s_6ZLj z+Ma<)_}(y|HykJRinrKfLmg{Z~#`XxYPw0tjxO>*@y2fpftL;y+`L|MnJ$vb3?_D%CHf~Gp z4EODPY`0h%URds#zrQ)NlCm>d7dQI`H%>17N%(kAIE!45~<2YwMGCyShHP0Um=DnC#>rSOp zwh1_Tbi8>KYv1naYTxNTY1_^fN;|gf1J~V8ceU>JjCFABtoOBLY?y6vWoA6p6YDU% zx6K~%MxmHD?7Nq(E-iX@zU&ESFi1Z>>JOdQ=4tbMw`QHU1**^XtUun3YjtU-tT>wI4>r#qZ0;X)XPjH}ZTlR9a{!v>58B=(j)2VBJPZ4nY|_QH z$gQ0WEiLZuXOE(Tw#V+E`>_4E=ODW~aFAT-J4_x79Y)!27q@+ODf_tqFB@!F#Ns7%8uRM^>>1;p$)W{K4k_ zLH6L;oS|*Ov!Cs|T((B_0_R+FEkpDCLHagx>~lbG2-bwSxmH^;jIAX0vADjk`Lljd z+k%~$yW>3Df7D%mrf`(kmADABCzVgk*ngBg$Z5uZZf&vJH6a98e5*8m|Z@K$5)RE@wJ)G#l@+WQCnxa z)L}RStc@MmxPh(z-LW#D+}t?yKsRFv9TWm+;w7S z%N^Q1`--?um= zoZH!G>**O?H+!kbcUOOC(^VSfGHaecXk+-;HJvNPi<4&C)G(b~EDf6dROSeaF>Fv` zFSYhn$e0}~+c#-`iiHekJ~2l-9+VyNbPZZrCCr}Xh}pk2+lhU#;bhOMjq|j%E}R!f z^Zdc%nW^#P-mO%8zPOb(Ok=h$!1mY;X8MfBnX8SNty#l&$mYl|yO=wV&2G*d?~g?{ zk6IUkeFF|@)4>*Utz*ZV#Q~f5wYXwto49RuXEuK7^fRyhu+2fixI^>&!RGmc%p;lY zt>*cI&HaP6-*3(4Ad_u73(ft5+x^SfPsMI(X(+eq_DR}Ad0?+Lzf|0|IeF#+i@DX^ z+4;=e>fn4PeX>*-?w>6VudUfxX-7M0GnH#L0@BC3yQWj3S~kxgWPW^jcD*z|Yv;hW zr&m)$y_4hj^E*?;_T8zO;~ksp-d^uK-JWjES1z89dJFEd``xwqzQn=e?DG0aXTf;Z z%D}Fq&A<0sIrW=8;e4L$8>5nKOdbqj^_tXhlZoY`QZthD`dWK_H?K_mM^x?xNEC4&3@nfU~ckg zFgI@Vg{E_4ZS7MjbzHFbTe-=6rhO_uzde6ajE-gp=F_Q}VstE9=ta1!&rBru`WH`A zJ-e&zBkR_2w*D4D)@f6#2s_S`?}OYZHT>?V8rGRfBandnN_cGS*EPL6hLM+e)t z+k4w8m-jrkdvwq}a=$&7SxX*mcW<5!<#$huxn0|Dx0g?J?;UOBhC{ab8s z_S;yUjs4KawehwaZHZDEh-#@mHNlXtOpCDHa{yighZN*P^Q7>sc@&mTN0lokx#t!KRA#+&9qG>yAL|j z$A@!ver5Y%VYticiS12p?jLNPKWOuU^g(R7zRiKy{4D2u-5=x(msV%9f%TWHSGK(v z!5I~-!yK~9?E_doZkw5%JlHO7=WTw)#*nu;lP+6oo zG(^q)gRKk349)Wg4TR7yJWuVd?+AQa8*92wbN`_B0ixTXcQp48ij!>J3CkFRU-SGy zcUGg*Pnn*mwFi>-wpY%^T$<+(Hun#jjmf3)(%_!$Q<`t?AN0>4Y@R>Z+&}2fM$E+1 zy$35(6V3gD7tSMWoxrJ)#mr_Gk( z&?;v(9uCBMMx#5nj&o|)&UG_eh<3)C+dq?AKFze7ebLp)(deQXptSt}jPJ1_AQ;1A z9IyJ-+&|bnf3Pz(-P}KDwno`ESQ<7viOv0k&GQFW#@3HkGKEan$i(vaRBo$%#CRiV z`{bJE4>tD?HqRf_xLb4opp92|a5eW2#<~^*rPlt}IIY~uhdOSIx0>evd_(i89M?VFkCI9}-58d#n>o?Mykom$E*4lQ>dPjV%52NUjo zy>)t}r#H5;K03GBGc&*5bG)#6w7asnwmUu6u`ub6O^$Z6vCJ}s`?$={+rRA2=F0TSOtycqkRNQbvERP2Vsrms zbN}GZIWy_5xqq;^f3UfKu(^NG?Dv}O=H~vv{9r!nu6SuYU+kVdwWG^$D_0>uS;$Pq zbEl;?vje$Q9I`X!=1XR8a2s2YTZ>0S9doNIv6Dh+boaFFa5TG|$PXO$6}FaQ!|ii6 zu4T>i0&Vq(wcqTUxZk$cbFgf4+p*GM%xwEkCUSFQZBr}v?fk{niF~1NaCoq1roQ*!M%X10^cd5C5&|$N~F@6k(pk57NYunD{VGD=d z*%e@l{$)09cka8h#a{URgO;z3#h$T~`L&eUmUZSDE3PvuYkNt}U7FfDTFtiJ&t)e@ zj_l0DgZ5NME_={p_E7unc_JYno=X_`&poeO7oX|7hT!GGm%q2vDI(Y)!j!LL$3?6J7LZAqG;+~HDwXRhyb zc;tTfX123;KiN5Qn2b+m_X_>HcIM-5d%R~m+uQDJBexH>Z?)~8ZZ2(}a4n22A1tn| z>=w35C+x8;VCU8BTe=EJ)hqud4&qbptT==eKk}e83Rh;rJXk*V2ir%m9}70c#2V*W z20vFG8)k1a3xxUj(ddZqW?&)bme#VeqXld)}`oe(yv&!pMELw zrPu6zB=TU_5dP%Z%lE#1?>i#D`)VZef4%mt$L@WFrk{)a?%AJP{w>4c%<@J)&Cm4Xp~xe1KY8{WiRo8A zc=<~UmWNO4`A_eC>9_AivS&jsot-oD%RO=bk-d*ZBEK1le9yztmm|OE`}r8*hm3AZ z1G+!7xQ!pDN#kc;s`&jl@h$ND8^O0%yCYxv?SKC`o4EI2_bbldc^uG6*?sG)zY~;e z8N&}>w!9cVhJ(ZO?B(+P`TK`pU4H-2c)@n-1$i4b01p1DGwKyy(5o_mm=Bk zAukqx*#FN4W&Hz`1Nm*Sa_9a#@n4RYI6k!e_+?;a5tO}^!FS--Ff!VMG9ewi|Ip}# zF2dh4p2p948U8(2h7Ue&>9raEbVVMOBEPWvAoBh@XMI+W3_Eaj?wGj`?0M4MlDV-ET^_Z8n~h}+WmT-klw{C{Ozk{_opol!u(v|x;*@qavDEhcK@2Wk)Pc?`|Fn8F9q+Mzh5cG@vCL` z*X;Y>vg_|y85+MEUwj=5{;KgNIDTMddG@aH?gOhA-2e4}k0a&#$a|3=AdR!h#G|u+ zYi`WkKQi}knftHI{W)|0z+4MwJk)#kc2It<4zzsF!~gAGj&)*+BxA1KB-DvG~?-M`ru*K@jS&{NT_xIr+B@CxX z`rg;>?VbHAFP?I|-~6|UM+y6m%rJl74SgTJ9@IVPc>ImXqf?{n@xO>XT7$k~!1s~A z9N8iLdp{ESgnMVa2j98(U;B>S7C&PcH9Nzc$ z#t)x||MOmWOYe#FKUWU_{Z?NLqq9E<%J6~JMWfAO>}1dDCU0iHfA8!wmY4hwf=Ta( zpR@bOJ>l}`%`S&VKIk<4=9-tN+l| zc^B8&_dHA*uSLG{GrJ=ehkIB0-iPz{E|8DE?d0RPzWQIChk5^dAO0iz4n{w1VZQ0G ziu~ri55Cvr;Y(ltyY`Mc@}E1IX8An(-iLkW|DPDIRQx7B<^28^Wxw}K{#%>(i)XLi zd-UO}3qd|hpL+Nk7VaPV;oc9z{bD)XZ(ADoA`gDg(fz@v9{$G`$A9hnKMVZ-Rr$Ac zex7vN?maqdTX1d9&jhk}_wSpZziDAVwD&H)$PYgJYnJ}6`tc=x(9!)~IlkA*VgHiF z`3Hu>&z5PqSHj=RU;p>t3a}u5j;B5udH6{Sd)8&?cP%_3++VTy3Hzh>f_&V25QP0V z<*@e^b~y6zI|PT+_GOdPttN-> zMSj-GoQ$ZX@xc#09JO!wZLzQ|Wj)3J z-fQ1yd>YOI8osYg!_PcH!-L<8LBp>a4ZnI$!w*6O&sAvnc=_9Xmk*N@E?i>Tr{iPh z=Le0B3*{d9VOQ=yRW7?SZy64+{&U*?Z>p}e;P0icf3xflK6=aUX~P{xi64Ggh^P+! zvvM8$2d)nOH_-N~)p66soZt6<_~E}azn^;i_?I5L`W^U#-;Dm>`+N8|8Fu#5mXDt{ zJs=wSQpwWe-t_rTCX6q>_0>SX{nl51%cXJlDZ{EO@(8{4>{HhMylU>f$S*`JEtBaV zp^KSJ`J?x(y)!-MqaPt}mcGgUAHe@T^fPmj|L9>6+C@EE`VZjg^7Ho_?d~4E#nL_N zN<1>XWry^UBMYW?LZj)y&Y!)THXZ1rZ+-QDDC1JrLk$yjBiFY4n)&&)AZ_Zvf@DO? zryqXB@Nl})uLbzL>+noGk}mkIua@z%ygS|7@@n)v{Lr4s&mUSoou1|CRM7Xo+WT`H z&uRMb(}v@xB99`8U*1i;`?uafpK^LiUqCN;bbRt%4|e~F#W7%58Xhk1uI^i&@bf=W zW_E9FM4Iw{|2rS-{fhtCW%@WX$^Fn(-l@coG^^TR!;VRu@-Ur?K}gywP_y@8zqE zcME*^=?9M@|L&*0@!`)Ie|)y||DH`gAWqj`dXs#Y>484(q2b^Bf9HM0bH4mEyKKg^n$VYz|i+uDi=OZ8e?@N)7{?)4KQ>&(DE?HblFFA~yOFdY+_t3ET z=+c*C}H? z|6$}y|L8vieFT@rKeIlY;xRg_ruCcm9RF7Rc6QIz^;gaP$KM;tzWR^veW~w2oCF#o}VgMnfxuwy{@v{vuAkWzqB+>wgkLqxYL((`f-_e{)T<8@R|Al&+uQ3 zH!bXk|3@%}@vX1^qoDu26#3ncnT);{iTpE@Z(nzPZ0o;Ty>Md<>gQVf`%$;=ugvr6 z&-(t>>h$;7%lsK#f7SnPed#lwF8glv?$O^a`*G>dN6-^K`XBvpVLHp<{&m?8x^^Y6 zM!Ic$+FRzDv9PJpe+-N?sUtR(HX z|HapS^z(1Fy!Up?yKlbN^6u;Jy!qxATi$u|-M2sg<@ert`-^-S86J)Ptyps8B%hq3fn^*2lTTAfavu}R> z$GOXX_N{kY?BAE)ee<1`AAjfV*WY~i-BKl&FTV(^uB-}=lKU;BJ99Hffhman|^-e+3^|J@63{KRWteErQgdIn#4 z=grT&_3nFbzH=e1mX=-jy6nH@v#)*ejnBXNjvwxgH@{#nL!nw)lJ0fOkH7Yrx4!t9 z!B@WUh1Y((7>>K8h1V_bz4`8YEhA+=UwI;?b3db$*jw*C;iIKx=gV)sH|Q9|&~Way z70p}k&a`yAVWXn@pAxUB(nAPd&VL^@fs}h`rGE~i*L9J zupO{?%e(Kr_Rf3#j`RHNMP9K6j^FUe=vZ`oVsdKwwI6-`jW>TRck=kM#<9vJS>#XG)prTdDzslNHuWU4Pp98Bwn z#^`tyO^o8jD!QjeF zdUk$ow;&oDjg``!o7`Pr>DhC6o?abH#@AL(4hs2&TKV8T@}2Op)!j?=1Nlp=_qAOX zpT2=B`k83+%YZoazL8id&BM)H*GVBap=VrlNYP%+Rh>gV!CTZ5Frl5I-Xd4HmQ!Oc z-o@#3KYs8_eB7g->RD-2ZpP*pw`cn{xwc}NmGnv99Q7JM1IeC@(!~w)E%nUz z6UGVt6UKyZ1Xe!1y5GzXWhHx|2fBQ@fX+ak!GQW|`z>eS#d<#if?N z@*xoK9>}z0v`r(W7Wj@AArp`jOk}?yHsOr+I(0 zHRbZWus+!-eB_Fsg#|K+Z`Jq+KcfA%T+y-Cw{(!+oLyOra1FaaV_&u068cdY?Q&E4m^w8Ci{ds)vv8t90ao6`1inb<}qteB^=&-;f33 zA!H@8>3QgzqPurxsJ()Z_-T17%Xiux-A5qYI9 z)x%G<{4DjvI!Qm4+IXVRBV7|-5_YsPv?=rzsEdTX4NPjqNqUxUx^JzkSix$g7~?(l zqgFn{@4=BeiH?N63Ll33_|IeeTTYLhPiJ$&Lay4_TK#e9!?p5s8}Gq`zdn;k!ijpw zJNU-WTdjL|%kPsBmb}#R52pC(U2aVzHu_7#N3L{z`*ayL{x{k_<)5(VT>f|6)6a2vO!gFzO{<&T4iDtC@{Sws_xV`) zerwf}+j=h=`&QfL`)KbhAG`yrdUf$aacu#<0weYNq-PQbx&ZnZ@v6?HHj_EVk7rg_ z+?dlqa@_IbWn-k$Ly70M@Te89aO$z~4A=Ip#!@}yF(8+(iOyl#Kl-oIr^!1qoQr-4 z@{GEQ?tp$7&vj;$?@IiZH~!{k@{93UG)+HX>acZzcg%Y-mPy^K)}QftN?{0BD^Iue zKF9&}FV+{deQhV)gPp!z*Co%hYn^*sYR_rsrh6uj{kYI2HAl$U3Vl2um+(E~cM5-7 zcw825khbYlrb9_jpf2*B@fF*`eVR`1Z81hg-H_ZB&A8N6c#nI=X_TJEwS2$ayLr^| zIA<7-YR|}g#$Ke0DE>ye7xIwYiXz)3*TF<%FVJK?KGz2%47$5?1KM=)&OtmeCHlEn z{JqJ87<|R^WwI!YlVlV8$C!)aQyPtQm3A$cKF9G;beXvs{4kdQuWg%$8YdcYc6beaAOa>or`Wk~ubvy_ zDqk8$R9`}RXdvIaioSdaa<9J>Ac%j}tN#9oio&LRKNi(2@Lb7w_9#y(4~PzmF03>d){U ztl+7s-eK2Y;9WKP8}*L#`Gb$3m3Euw3%Y{q2ll!-Joyj1tSivido8Snx(;)GINDPm zEA&qPJG?}{Q1cvoYZNZwbVQeE*4(2%_TqSgajJ6vMqzN#Yor$tmiP<93F~JEWA7K- zO1%r_cf#}Q(gXbXtKEn5(1>TzA-Sr$R8_{5bx`R}wDI)u7~3Tt+I`V{0Uu#j9uo}4 zyaF9T>B3h&KM{{;3%g3AQLdl9=GMd;)R8ChT5hkTBY+d*n)LO2efc6kp*zJ=0XFM< zq>0Y2xiGb};G{8N{4@%KtJ3i?;vP8+t;+9(v0?E8{blnjoWgPF+38R86RXry^o{YU zzRk_-gzM}0Yhe7j=&R^&)OY1cE;v>6IvYE9f|tO`+I#$0a55a|JEL>=E+1Gwnt8y0 zXB02buHV9Vm*Kp45bHW54)(@^ zcCh|D`*iC5CUK}IE~V@D@vGrb&pR+!?d&}DFYtS!9j)k|_2~kl(Rb^~+fDjW+L!W^ zUk`8SUb+dRbfe+v4JP@ za!VMohUIuDm(!TvWqB9vm-+F($^UJ*K|0JASJR7b?%jOf)YNW#EkhrNKAy&P8Q=5k zp`Y*T-roj3ic_>OhD|=S_KtFY7VHSWJUbO~ zKKdz)iz+?(g4ZdBS~w~G+jc8-o19|2o4kM-^Gup6cp4hO93EwUOM8Wsmg^_g(8a1@ z=dUMy8d`2DjOefB(qE(u-x@0gzn<3hYMtE~z3dwG6hT(Fva zG%Uk>bW?eL+IWN!>&Mu~r01J*wO0B(J{z|~1~HHC^!?S0>r2CDZoJCIBdkAp?*D3C z>uK|Top7RuwH7M(TH)olmg|R;AFXZG^L1Q5zUO@}y8U%dH$ju))wn6oidWxix$<{c z+}otHTHJRf-`Am|T0ZpdI`LHVt9X33n!gv}ou7yB{j<;?j!Vza66f;{t33Gbv(n_p z<=;PRyx(r&eQb39?Uu)8ewqk05ojXNM4*X46M^ao{8?`MmG`H0t0VeizkOOPSbH$B zvN)Zb>5H!PuEwGVot6D_;W%GZgu?mIv#n?9WbBf>uce2US<8ph9*Mfz=F3?|d`ZV{#Gdnmu9?zvt{WR}7 zUOuhNp`~NR-NWL|+JdZwsjYi*`}LvWF5@JOs0*oBdNWr{q-y2qw%#MdM8{pjN_62O zcaSYt;Q)_0Ub|wi9P+B3_>>-HBUyhJaPqOyJ!M%h57{blw7epRUZ8Bsvp|}{TKES_f=9@|?4Zymp?yMLEADz-WRY<4WjEo&a*wpber^*h<$-#S-8r7&`GD_( zuk=O4L(sdpp6*v$t?<>{@$rLx>M?W1w&%Quy)N7ReH-vD^X=4gT%OCD-Vdba6J!N!ihn61}wk!L$;dAKIeguV?vb}_>slGw>L}Bj%TMyXZ zfiGnnq#k#7Hk~C-U%qp%bf}L$KdJueyYJpMPOM|nK0?w;&rPjppAPZ`oU}%gItm{3 zU{H@Ac#OP~fAI^r@Xq+Wyl19oPi-mRv>!(5I#)Nci>$w5J)h`D zZXk1zS=dggC;wOa8Okk}>;iYv+1MC!=|cl`ig&ba)O+qp8@-e7em_}xxosC3XoF?T zsIo?Fwau;jLq16Np`Klt{~ESNvAqH&$SGtNG7%Xj`4m5yy09l$?LU~Q{ZrfG%g@`! zNAU+Zx&49h3P!9~EAItBX2(_!-2Q27>_98_t&mHS&GlgC>l{iGyuhC4*;H~u^$u6E z-1bkO@+_%~#M3(N3E;NzzeTF};vs(c>7W?R3KPjFXCI?HrXyP+`1k2=)O~=H?KP-kXH+^ddA=;a z`UZ}Q4;T4=8NUf9>_BCU?K|j3@DlAB>tTsQ{T48kPTMGK{B$b$GP@}kWR%G%*#}TP z5gxT%>)Cc-*EXV2xgcjHaKYc{}vnkP}z&}3U5TAwF!=KWludOgj4;LL)HgCe%_|NpCh?6jiv(ava?qqLg zSfAn>eNe^|e7eZD+VBap8;L)#qVM7NS(*EVk7Og$>?iiJ55x9jxH?MSHMZj8;@?Z2 z-zA=McE3FP(G?602ihQb3XH&v{QF~P^mQ1ASUHYOsNaJtJM@9R!PsuFf1R|5U;Pvx z8{IQ*h#zz)bgJ{Xo)2I7crZpSzN)-8Uei4~!&d*;zQ$$1g>Q_*fD@O-WE7^??5GGA z?w!t7*8QoE!X@m&kBXz3>+^Uc?nOgI&RG3GR}bE=?*(>RhslY3^X&Fqg5t|AA^{cgXX62^&V#@Cge?=}LLa2iS<9R~ZUdUmdpTi#ya)ukDV}xH{2SHx(F02#KKUN>v*CoPqH~Lw5)fggpRoW+H zZ&|mx=$36cl`%k8ffX0+7;#?EFNi19rs{jR%}e%goMMk|b0D_|hP1h&vC-K0=|Kau z_-&8+?=|i9RP@r|+zI6)>=N%>_t2nZ-UY17GKxN&U*}dg`>}C&2v%S=Go8Iq_k7wL zaqs5|T4{sDQ|d2V)Iq)aCmu7q43b;OH(xJ6&pav)CmCZVuNN>Pd>JS7Z6BwAm#5Rw zsi6%0K=9(;r?(OKC=EYd|6b!9ysI{z_e6fnG8x_h8$T}QEJ=^Cfp9q4m&8B(E3Eu} ziXWGMuRJuu_0#q5;VJdgFWMNb!cXvp$!o%clU=SIKu^~_{6v1vakBQWd}f8xMOOkV z=I<}VsS&tbl}3eT8>5!~TWu`wJile!$~IBJ1+0jNG0xcPq8pn+*8;0Rzp(iV>;;>j z!Ljx9QZ}$7CT!3HgfD)sqWO7z7f$Fzj8pR*Zlj*S$dfa)bCOStuek8#eh>Pz^Z?#7 zu9uB2_H!xSYVPyEp`J8Ft8`9Z->Hg`;iUc=I-|ldCZM=3xTYVhwfEllZD)ZQe(Is` zF8T5ERm)D8kD2T(oXhawtP^Aq?IrCY_e-6VoqH37O&=rfRrg+Gte&v>MLi2$!b$js zbqU(^YWN7RwTYQcg}qDsQV%VnJB&%yXB%Tjw+{Hn#slcDcv#9trf`wFvA>d${WV{9 z)kEK1@pCPlJWPCibWeQ)6WsX3-dKRm#koVtIMTf<7}P_@IZm>{^kjV#4mabPJ#x>s zZ9O#J1wR#>u>EoczdY;rq3(_L-FR|~aX_W}qVSdIy*R&j^E?%sNsb-Q=j<%J;Ur^# zO7}&>X>hV_^jZ0(T6p@!^!ZeGq>l?Hy}#?O=w;0uA>PWSG*Ygf+SeHgz z%0F?_S5|tyD?hmYd+z;j&-)&F7)Rs0>Rk8a26iqp7;0( z`oY0C0dWTN3c(o?tlQ8$V5OgAx@)aI;$6YUr$acge&D>1tG7?*26JDGK?U=jtkV!r zUFdh0$2-HR`1IYCd(lWzzpHr7OO zPPD&9P-_M2b-|5u)BU{+q;Y);pKl1^g3Fq(rS-$1oq)|-dh_UB`yv)}8<7whr;y$j(md{f-@@Fwf9!*X5Wac>)ktKt_e z*Wn}DI@)&jN`>*!Gcunx0RFg2{)3~>N9bSBqw|YJ<5hXNt?x=dG5w@nD&@DDi`*qF z~ZzqhwoQr($4l4@#-6TC^|+m)fbfxhFo&Au$IowQsrGpL( z@2kvh9)C-Fm(=dbP6hfDWlFxNH@L!yIFPr#POUWHxrMde9JaC!PPf}-uZ4H`k^K~~ zlAS>KPW6%Z@SNhqy={Dm-%pQwwJYIr2Rmq_zY-2}+4J;DVQzJ%YXG|$*fuH_x07M} zB0Mjzr@M&9m+#=CxWQL-5;{~Sjlf7afep4`uz>|#)B$kOUT8;uxjqP|mGzTe^3Qsb zM0flEmuL87cO$cJYnOVjWAl*sNJo4N7OG#+C%o2Tea=3m+5_I-Hdad8?4C?grm{uE zd*m#2iF@kaPGM~i+C?9ArW#*7%{zE(X+73XTCv`>%3fFMAnzzQWSpHL?Dhqr7pT1W z-YA^l1M-Ir9n#gGWNY*=J(i8V%zrY5<-h-+$k z=#cO11!G^g^cTri+A)Rq-D>vhX#20iPxkDAxQ z%pO83>mm6zF*TW5*oYP-FND+fY~N-+(>{%ip&s!Z<|kym>ay~So>UDpAE)%dMh;n| zFmkDT6+06~n`mx?3k|fp@ssG}*z{CSuz%ouj}ms!R!{qnkrVVABrlLneqE||ul>>! zOGkTL17#VE3=jMFaUwmnwdkwp3S98CbYSRi1U^bbW#z9swl%e`EJr71cHynz@q%k( zm{*c6OuoW-4L@tG?qr+`b!mXfC zwwWm#FnW)UDgL6Z@yiq0qyCxl9d?oHe!m_*1Ycwq?WFKfdhoDpb)u{J80r3b%`b?? zU{4+PcFcCByUKeJWs}LqK%^sA!kAtFUho(B1_%G5KJgx#_Oy}s_4|(8Q@3bK6elkF zwr~l%&s#?ICKs*lUEH4=$aSla_6_>ciUbC* zJyZ9hyaOj>|r|FkR$bILBf1 z7$^A+Y(RK?s&=<*FOa$_Uc%LQg~I!8I4`&PtaQWW2#vhs`$ZdBCimH+kNq&$*9rC* zDjr;9_G)iz0<5Sr=ilgO`}@O=^3-i78_R7h-6kg0;#RuI0iQnZ)h-3~ zqt;%0^a|`5w#}=LNSw@+Tx}+Y|vS$#dE_#w#>ds5wBwSIa{q-jO!4 z!_j8+N$!A?^cLyvuG~ZI;>CBgUFUmRiQE4}U!<*MeB!)sd5*u26MbXGE$I7cOqIAA zfr+1nPd~B@{wywEB}h2a@|s`R>_^aT>;k1M-?O zVmy^`FfRIliUZfr$8F#H>4xvAZ_p|kiao-MdGc@x<5#g!H@>HNQ2NIj4@YK^xAef& ziXW$R1NfP=8QZ)l%g(91ZEV8vpQn8Bj3vgDDz!@rE<_;Q{80|9CsLaA z^88)#2i>gsV|>cDPbd1YQ%Bz(?AH2oi{Pg@dGgNsCf?KU^>LPsHr6*#2E<4FFEUP| z9hY;G7n0W!lKK;13zf1YAmloxLwLDsw8>AkaP znz7wrJWk;i2A4I7-!3>QU&?3L)%Re&>Ae3dy`UOTDGct5T<^fb&kOfqeEetm4c0E$ z9K3gyUNFxP@Ra;r=KAs8_4``+xQuQ;jH`z>E>+>F%2{#ezKHAm>HO}pH16WJbIQ-} zuA=kYXZg;?vfMf}8-wt_DIWiw?)B|OaYeV>>(H$*wOqv&{;v0bmR(`;XBmTL-kS(C z5ojXNMBv3jKy6no_r=Q1%}`qli|f9>8EWocEY)ye4Pk6`cat?sta)SYMk^bACQPwKebK%#{*qz|)W?MQwXy>)G zDNfw$Q+78(_<7)-GdFimFYaZk2cKGgz-{?>%$*(Yr*$`SUmq1d-8Oz*fDe4zAhq)T zH1FX{&URLs^-=izeTiQ9XKQx;!dmX9!J*zT)z;Xi{_hjkwN6& z)~KFd6))|f%8fmF{_|bHiMIZ#JXHIR47;iwM2{lx=vLL@@ZZS}fUsiiKX~c+d0?fq znQOB7+D`cXsyzF7!Y^@9Km7OMd+`La+W$s7N_(1_Ew$=B?})QExiz8nD+P zGbb+DP%l=(N&7sM*RV^yBMsUIDusfS} zYo4fsikGyZk@)m3j1k{&o1cV}-~Mo~_qgzcXrv7yA7F|<`Wcsv0l+UCeM9lXxm;(V zxVGTq628wDyJtubJdsVLNnNE3x%3Vh=F@lE7!g0|F(wk$xrG&VMHu12|2~bn#~+xm zA0In4;Bu9{j4)0-QwNFD?bMxTyvv@?5!+^(=v--|U8 z)E{hvVEd|A%-UY__O)ldu<1s+jM*qn)ji56+@EPQPLjRQ#u%IM8$DP&@NrUq9)5XN zOsHqnNo+?+j)T9Q^Xha2^f>6DJ)qu+Cb^Bkh%}TQuJ|0<{B|jNxH@=HjAm7~(sOPC zCx6|JXaOUwd!jv1y1s7SD14NTXv3vHfxOn3EP4#@r;hp#_6JLqdZ#w+U~a7qxeQN; zudu~)o%#pX@YDKnW&&)mO@>S(9%MP`qlb#8v}c+3%EN8Dq{Sb5Dsj<$)Q;1?lMWS| zS&RBOsegtXfgivXTRh@HbfD{CC5*!^^$@y{O~`L>Qy+o%w~deDCoTTgkJA^%TalIM zPr@wGm&^I}PHhb`B^;LcX!CrW(2;2W$TwG5XA0w^XVpFGo6;1`a+R0cbd?souY1Z% z{LVXMxU+XSpQy|aAjkN&nO;hQ2YjWv19rZSL_3Jiq4;q*n^{=Ya;bYN19*u(ogatp zZxbKIOArn*0)Kpf_qUCW;ukHH9eI)t%zKUVP^Lp26Vvi5oM?Y|NBd2k^<|Op@m+9H zTY=n{%}vtA9-HF7=uW3&GyMbWr->uA8`696r+nPDE1HleJ1o;3!5D_usq z1K+6|*egUv)4n6CbW!hkUmK6WMh&`#+6_lTvgars8#WsuOHLLdGpYA{qJ^Exg%D>R+UAI9Sj44(5p(&anps&A=$ z+_oz!r~~j5ZFNO<8cwpOCx6&Q;vw*%C>9Cvm{ z#YbSoMH`~>Yy?)-a8mg!q_frS@tExjm2d$yPL@#Y!$&{+$$Yico2+yob;Wx z!;ODC`v^f9@s08jM!4t*>L(~Hu4un$S81r;!BgaobkcJdZ47DOfO7+^D)K9c=Sf>@ zyk}fQ^@(TNec`0Oqv((eR&HNMc^|cJN0YH0@t*w4y=i%oSG_Bh`qO-;+%8}f z-tX+NQViBU+Ws*1sUTNeJ$3sFp4_uS9TiSbBP1^Nf#r(kU5$#XrG zr`vFqOZw;MI5EZ+{A$)c!;F1&gb(mxpURW_paP!2z8`JEisL`peR$00C1e=mHr3)F z4P=pU!fo^%r*J~g@o`e!%MTA94|Q)mx%a-JGfZcy*#W7>hq4W(G<_EtMq22U;jr>Y z9~^yicWcegEIXe^SDD_XD;ntA`#1&nLCTD!glU()z@E(Tw_4A#dx)$L*EeJqse!@8 z@Llfg55i;yhxh4=yUY5TYIn)QZDORjg_W-x1ULn93V&Otr48{_px0Qaa+`E9U$t!= z^{#ZfJfm~?V-ZRpor|BkXPdL}&GW|2bCh z{n+8EowE_>PtM+NShipCEP2M79OEY^s~C?`9{|}-KK;6(OiMFfU zihgrRJqu%1!O8Rj;+NiCJ+10GD}HOy{yg4Sr~UlxQ}I)IJ&yPy&?l+0*zpT=Ec%pO z8uL6)@owRBRhfwHppRUiToPY7{xN>wFR*3sq+UupmKl$)V|Oh&w(ey8RW#kj@6Uph zY;HT9%jC51le^S8*(Do(xQk=wb?+`>aT!g*sa_pi7}Vp6kAzh^J5ibcxs0Z}`0X60 zC;6csEH3jyU7qhu55rfwl-^y$;xd{8`#PR=D(I7*7YY zFumZ$m?*f>XY;Y6uWR=H26)fKz5gBl#E<5qNGlxwU4Ir%^!fdaOrMvr0mAxy zX5z0F?k>L*CjJ^1y}Qa~E(#ve1)kN$qZE(dZ@$ZzRHIFKU`>zKZpfd$1@^Ew_r~TG zY}_;G2R}KlApg}|#w~oFRT?jft32sUTb_N|^}T98kU5$1xl!S8ibLUXS@R%%)Atw2 zRbHy)LEpkQ>lu$>en#J~%CG$S?Zs7L?%H?d!FQq2f2Ph=bWr%HeEuJP>dB8ESNOi3 z@OQ;enD+29xCC>boE>|9*4B0C567wJ>%{TA{fg%6xKBfKwfLVVp63-NOutV@_#4mu z_v_yK@m)9UUHAX(oVUA0!;*(2s9CB3<7>zSI>Q8sCvGs)Puuy{XE|s-E8XN zyfZ#Gxw1IP`4OzcFo5D%x>ble%Bno(t#qS)W<^{5)(EJR34WXdfT$ z$;WMAo)GGhf3RbZ!5n~6R%H~t=T?p zBtAaovX$V|!~N6b>88VoCY#GF*ttdxvvKI-qkHPN&WXkLgw~qfbe^vppD?mHp-$VI zG%k8?(xq)9&%1Mpo_gYyZ4UNM+1c2YdBf}G?I!&Tr|^ERdh#PbSIKzv2+~0ZP?*bH z*;s-mbTQF*lli_*TuL8#eHq=CeM`mC&K?r&RV{z;6Lp&OY`^_1eEnG zK@XT{pS0%PpkFj!=8_NMf*-5-gCD?%?@BZ5s(quJ#8Z+>&_P|LFX@M?H=obyk2L9v zh%S{Mds%D-+u3>W?PyiQfOphU;$p22&x8SY+AQ`pNVX`C)TO2M!4msj*vG-%5!(xq zj7<(Y8wv0Z@j#bs(1hb4u4m1EJ>f+&{SoC~ZLz-LO6Ec{GBqq)c&|D^UDcj*KMwW* zEtqLC_5iWY0!*IV*VeuUZiIsl(Ij5=q$<@FYeP~P;WRtE$$g_1Pk@mwRR^uxjO9Qr1na7M=rzRvTw+! zK1(O`F`uo=S}%j+Oh>Fe$kj&7$@n-vSV`@7MFd4Z(^&9m2oEMK+aKj z2}d2|9rBNMM0Co%sr=UykJ6;x!%NVEtl?RD3plYxT=fpVBOLN*EfpIEcQcN2XGKl0(xylP7+AcNtFcTxTYqX`cog_zD@V zwu>~z#}E4TJ&a}e8GovmU<6H~x1PM+v>&C7i!Mmt0-DqY#bf!$q(C&_8G zXL>Ie-uLwe$~>Ik@H6@M`>kfzZW#GYokTAH8_6K0gREq{K=RSnQ}=^apV?!RpPR;@ zp7@luaFQ(Ny|35NufvbzDRvKN=eUsF)IH>pbWis7ql5B{T!K#mn|0~VuwE@1aD5$| zu^0av_x0rIHvEVV;Y2?ly^cEQ+b<^@m(Y#4`+vriVXCsMX~s4-3CpwbSzw~3RVmT*GnM)$6clgZbz9Cvuy zUa{)_F7CIdZux2X_wX?~ZFnzr5U<%@GuvhON1m$>!1Hb55{}!amwUzs@PiCa_V>?) zF;G3gZ#CH)_OEBv(~Ic^JO)OjnJu>O$iMF@EdElPQCo*`;dg{@-VP>un`3>e?K4L8-Z6P@0K3@ zRr+bXL*9};`4;cXZ%uu{YZHCEJbQ-~oEZP4zf7Nxc;Vl};;gfIG_cloN?YREQ2WMT zwLYHcX*5oZud&aY^l5wHr)oAruWQ>#whPhs#ZT%xtNlPWx^}SAP6Q~Zk0VUNZX+=A z(+H=Jj_vEc`tJ0?8hqpPkbf_%$+K`$e6?Kq!58)3#?&t#lUnz+X!hS<*dJXlUS&N9 z8GbIut-YgfjqPJ=BV4@ZZ+;@}`h(a&^ydtqp%&eD>AkSJZk=;{Rqlf*4%~1&$fVWr z!s$WuV8ZvO`@4iiEm}mY+2DIZr}FF9rT6IO*vEI*(oooMrX#T7hwU|`C$|<|ckR9C zb$0mbt!vlxm+feslYKhPHQY5EuA=80C(m}nHE{^@PxzU!Eo2jQZ`SMpE6uBDyG!3i zbM=1j#lBoP|4;M$qS_J@PPO~TH;k1xCUKYe4{?M73KVQw~7AK~2HO3X5 z6*tCxgTKpYyKCP>GjlBTFMRsIjd@ydyGeedZ6#elt-F3NoN&>pS#wtnGx7nB^mlyx z7ze#sl2JNg>*Ww}`Q!gxD#a6HrBuhw6rALqt{%WLe<`!$O7MXh_mT5{&T zFRmLnxAA7CBtUT7gXzq_#?jryAxf6YQ7tABrJc*67v4%%$QQX{8dCvQ3@}>B3 z;Z@eaXdUa*#3#CM)AeZHB?F+7uV#!rH%~cXFRKjhhNDdVDvqM_;y!>DlG;{oHi=)Nen2 z-QQF?&l->Dxvu-H>H6VorS1E9-uJa=yzKpL&>T+hHqv<7IK#B@TrDo&U$yTy@lI*n zL|iu=hiI#X&rPS-jIW766M-fIO$6=+0>1pe?)}}!!R=9T86J!s+5T9!K9)7I*kt2* zVr6k!>k6uczddRjA9FZ=>{&>r`l6ftu_MOqazoL|no6y$47;pBXYCW=z%CqT<8yU$ zDf)R~445+`!)v_5c+~sMI(qFrQaU$BdE;Ud?QV_N@z_Loy>h*HT;*@0zt7p!Pq!m`xvESu`6ZHWqH5uH~8wVkE?*XFyd?;_5fTr zpEu!udv2KhXKrsJa}(HC5M8&!8P|(dw6MmVcIhVa9FBuFv7UC3dam_{%O)2^+x2pE z^S(vLnAsA!Em_UJTH@#8K8#`bS@H^;wAULtZ$9_+$0(dwTN#=(qX=?o;cwt z{KwZ)r_XC&f)ErwxU4tj{II8yOYq0~$=C||=4BX2x75B(`DI@)dYPVa#ZU2EJV*T6 z2PE1X<@y-W-|(NqH2d^dyU+CJU3m2DYTxxvvWESBP)@lfOn| zME?sO5>3I}Q!uA_9XTbOz(JT)bL9^iCH_#}<Mseh6s#2LniI)+}vnuG9K^10Q66noX#tIvJ~XrSLHy0llBJ|uBauA(3JHu*~F zsNBdGboqJ;eyYhD!oYuFET}`$dEl9JY;S8}eX=vmGw6^Dxr5`K+1L(qzhS!v?2jOA z>LqE2|3tIz-X=!GOIV(maGbvTVp zpRjG7FitwNk@_W`l5JMSciZ>~Bhr&>gckT&?GOAddZyPWbDS9*#)Km{jCMwLFDNrGL%z!2 z_*B;g`*hH&Z*t)k*83n^u!C`38&F^bkAW?5Vp{`zxrcAX^SI~^N>}b};N};4SW1(^Cy6WbEEX@rb-U3r^Un39k`i52Ne^rp+!8 zbf6m`6B6AA&fYZd8i9|}AU*z&-RL!x9pxrn2!2}5=kj5GQaHkJJ}WXs*JbS)vP-gB z_)^Erwoe~23D=iz+)Jj@p3*N;+R8&CT%{>lE?rtW3-W1kWA=hwm|A0KiVHpy24I4n zC-`D{dbJZ?Va_FNe@y1mq zw+IgK6BzmYAo=X4!+pK=mH5<8L7t<#DlX-r5w6k%BlS_R^Q7^ycr2O@*E{qH!l46H zD}Vo;cyDKXVrgY%(bbz2uID;}aA1U3c&+8Ni@cohESZ`W{A zoa~#{4xz4B~!Ha2~Xf_u{2a_tE`r?%FYp?-R| zeJ@&RTa@RX|$$EbIdJ3N&$YpZILy`bTG+*~v1YTw zws&sR3|m=S4$sOMl=bf_bXr*cZW|-wR~{uVM-LXW=-&ftiMA)pIN1AZ_CBKERmq<# z_b2z3A&ZnJc*4iY>_D%RHasKSoQ@V(&-eB#X_swJQBNg1X+somqj4fV(q=y;_#Mtq zZ4KqJ9Tj?Ivq1a7;W@o?F1G2+9uXLVTZrc<2l$P-O6r{Cn!^UJF#m!5mXJNSvfUBn z9peP(ZPY#0X=rW4uR^EMN_jIzpna^2^@g!fJ*dkjjpb4M(EN15_iHvTShY;R{}MZt z#M20jNFz)$&$QdarV1SumIN$1HjDcAAkgUUXApH{*& z`ls~KnbEDq)96#wzW{@C`)lY4m*R4vKHA>KGQQL`#jP}P;bZa~n~9G2@k)>CPcGi~ z=MNfixmWv6nn}TX|Q($;r}nH%C-mU%1Q$2Kzs!-JGS`RK`l^FOv>B zJ86Lv?U+0JtE>w^6Jr(g>1+;rhmwuY3oFv)PxEc++oP8s59M<7yZ8=Y)Wbi%AKE{{ zGBzw7o%l765~LiowYtZpZS?2HhdL%E&H7(&)qGN(zn=Yf&ZtVOrp`+QRGz1iDz^QGb?o&)_fmg+NG}oi1>ZSFXnD-1d&*I^VZ`F|MJmlicR=N_wC?j>))$ z`0uXbBf69~(wi&JL9ZxY*UvtxnH4PSo{J$Ka= zPUJP5x0`%kTAA#WeLBX_l`igG#m1)#I?>HH`fK-zZwfEkfB4FuU-4F^5mFKXrasot0Sf-f3Q!i+wc#$2ca=%0Qc`Kd4o z$#deM-BX%(wXQ*zXmsmX-FTck>%sL|=!-Ew;^Rd>8N4nV*Sju;(z)&mPQpa)1)Qvp zU&&v2Oi}*m_cLb17`TsFVK|ZJg4Y-)+1$+SEcZv}7zelxj+#Rty}N*w@-6oqCp&k; z*K@qFGS)B4zg%P(^9b-7*lCZVcSk{@UCwbKc=F;b;0Dw3Tjctc{T}9ssY^o6ozXXNL0@JWt#CHQqSBWNn$J zsB^4aQds3%&sVv~IK~2)b7q`-wKq1-#riMJGlb{%l*aRP!}&7%x>fD0YJ3F$%w5)_ z4~FBu&NJgutSM8N=ZO(%i;loWE`{bhOinr7&znDCEhShf?6c%SafDsQpIHN?`WL44 zS<<{t*f3p{XYgPw#9el8{8R0Zvi8>r$j^0XsO492k%rb~>YeY_3V&1Y{j{!guk;lr zyqAaf^7E{&(x_Gz`u418)DvE5$*m`h{3uK{SAK57troxD-9-G2h(q-H?oFrb$L-(W zbUL>kpHDmYw~<~W(zp$}n{hS~Xd=)=pou^efj?^qgxl<=dH#0A>@qAEb7Cz%<086v z4)61?6~~K=S*<)-KYnlFXtI;DbZvd_C}(PGooOxiU@O0fUt53H%K8q*@xV5m#*2nm zn0}sFhe|%{!KD^n;rFZwwe_hBm9-kTq}$&H{ys+V4rkA3UqCpYH}y>X{gxJK-$tHp zI!<9UKJovv_pZT_X6Joh&kilJmhwd+%Th^B77d`$XxtiipwVb_<97va_;Mj+~M|h>~5ER3$aDq#dW^ zB$nh#WfM`8=Xc)zHxAxuU~roTh8oQFp7WmfT%PBDp7WgNT;D-=4(K{%=V_SIj#a+z zUN?_d%}=zkhJrqM8eh-iz0IFj&$WskxmV@yy3#`rdg58NvF)zavDMDtzM|7GM%O!B z>{}?pN9~d4>*DpY`G_W+5j>5LtAyuTOYR;mokKn?FZxn<2UX>p!mO*>`b>2_?6N#w zM>^s3G#+a4h75EMG)CzQYrR*P?gFzrB~G04*L%6hoaoWnGW5Vr@39k2xGB3Lj=jDY z(cj_=yFt9xa>tZV3OH|yrQa}B*9+Mnhs zJ+eSt?m)o5w#;U^`g7!)p5Ma1Uo@`DKn{dOE*0E!p?7|}lg!g5 z)W#GKK37MR%ivHbwT^^wc-r%3rrq6l3Y_lv|AkKsNV z*-{%CI~X1khR~`sxU?JO~+qC>3o&X^F{o$KV%TRMGr1>Ezm$ep!;q8_rCu;JYOb`Uxxh1 zw~v+dRNu}}!oQb}_JFP>ozCiA1eb8!Y-^j-fuaMqXDYaFTs8u2E-X)%;rlXae7f*s z?}CBamu$J=wvMEa6YurzymvQ+vGJd2Yw8=3p{4frG4e(C&>ted=%Vmk-eq{cY8r6z z`(w4OwyBAZT)SP*9J=RFw!`q?#E|+j`ZIoW3+bM#>MC#qFX+Oqk{#vO?NxccOnQ}1 zUxK`-PwU@pU*!zt#>!^(eo@|Q+@W+~mwwBa8TvouhP_Oq@tJwPd8_;R{CK{fHZ7gS z9GJ?u41d>^Ml_(K7$Zn;+IidwaN5a_=G7i?W!LbHQTPQH{c7?@ zxY!?Ro7ctjW%ChMa+9&P!LfAr!th?-Zg~8UUL_tl`Fx$`$KE9VN_=9Wm`EoErxM#d zAFS*SoR)@gFn8tHoSonHF3aO}q=O#*sqWh+_Z%;TF<0Wt6Z#&T0X=)3K9Bn%$%pfY z>dR<EzSKMcm`P_a@50zweUi^x*iS#l zIG6j5c!v%;NKVazDbL)25!?Y4tf%_xE?432I?{?4<_U$5?@Fc|AEsl%wlQNc(Q#Pr z-pm*BZro2>LLYO_FZL7Zvvcc3oz0M*R(#v9-o_q(yGz1-8-a3txm6iA^b8xb+S!)qaveU?eyxiQNou$#aSL7FY7M?eS zkIEI_)SZu!KgYw_7M*XQZE#M=?zyPmmx^wqeR8%89QYyY=6r8*K3o{#!V7%(IviV4yalw|8MDefF!=cA7lV29+PYUb$puTv(-Sy3 znQAGKH)WCrT(!o)vrl(D{h}Y8%z6_2Ju;=a$`f~2xI23+h1Gi%C!IOt?9l9_okz2~ zKnzd#4Cal4JAPCSZ4EgCFJJGoet0vRpLU9TaL<#{YQ2X!cyxls3Z$*4EKydNUY<4Ii#`?2&NX@A{blaS z3i`2NT|)f=c`+w|ZABP;rS*n+m8pBOSjR!eRewIs^}@?9^Q1pzI;iPjx??!IS!%X* zq0ODeLM}!e`fc%Y5m!1#dXIh%+g!F2b`<3(Pp$WW4|+=do=<1JaPrIX%csqaAMB=i zPoIxnN!xHZ&7{rFIjxH?W{x{R}u7MHnGt+Vr7FD#x`j!*a2 zSpT5rfc?JdqIVri_M~r)zdwR4ak4-3%V!OPxk8PbZWB)6C|c>mncw7@vAyPzF0G%Y z?RGiKtBSeo3v5<*hu!hLx6Bjv4lbNnD|}iV-^6=iC71CTb0R!nuD|PuVt0{V`uK#s zYHfF5x2ZZ0u5#tx1P13VQ#9hzck2#BH*PtnPEwo0l|7_xIrPPdP)jv+d%t%nA`bVGM&GUl&*Uxc{qcVnLg z{_CVybf^yW?7P=l-bM5B>A)Y1=NYRqc4bX2*=+NVuHWN5Yb82s!ShASJ1u^gj#|&B zrL9+ZEt<{>ldThub5(l7`T5UR&HFmi`}EZE`(@O6uP{H}Rs70N?p5--&a|Qj_i6e1 zal`(nrM<{|<$aMf^@w{Oj6{cckgM<)?h6E7An*c#7YMvS;ExLe>H~fEj|=ao@#$l6 zUjJ!%eJ_Qdg$46=?5DJ?D4p#0Txefhva=vlHV4Pks4xx}d0xxp+Ooq3)%z`!|MMbWqE~La z?K1@%ch7=-YxE*moF^`LkL@m0=P)Vvwqqr1ID3a)q0ZUEeI9w1;+J!pUwD8kwg~a27LM=fQdzjf_49d_So!7Phc@gO^a%3p z)5Y^?b|v!UpZ%(pZ+doca&j-*ywH{(TC{J&t&X-Y^W$u6YP*;rjpT`Pbzc{@yHAJw zyCzd%oBmm01#OhYch;)BRrW|C6JeT=3+Pk0o%xKZ%_u$Rd?r(ECH9=_%>HS2I_U0$ z?d2s~8?-(6HU^T8M^6$)etwzi9W}XMquUsto!bbbx!d?{nMf z3TLOFUnDoutGXXUY18qx+(w68QD}P&e7?`)2OGZ2xS5F`^h^&nk*D^mP;X#`?8xS# zexL`sRKDD2g^`aF^6Sn6hwQlY{NlE7l01p7*@gBl^vY%M5r*OKe1Z{YL(pTCBdpL_ zJR`H{s(RW_;@7|1f%*e8jT_PnOZ|Ma6|AUN(x5BQJ6FL+IHAMQ-($NidGgf#J%^>? zOeVhI_IJ>}p{rI~tA`8;C+bH!QvDfYU*026%b9|cDf(&J9Q`5ps31%5M*X9!d0t=2 z+Zo^Hx$F4(STVOn`QiDOdg25g$P{$2w+$Q^BM?3~bTBY`*ijwl>5iVA%x?7_XW=au zeG|qBT+u=FfyfW(!*Oaovk#5?TF6`dn`{M@S5K_yQ>1^uina$Gc2~}1q*fU!AKj!eo#sjO4%%fu&`%Rin>q~}WJERtvWHGW-z&eTx#$6OfNXKiLy@i) z5A_HW&Hh-ObpwSg2 zXYo*vccMpgWauI0G+5(Sm_PPJUa&=FC(s9ShfJ|MSC9+c#F6fy|H9S`a9hvl4k+1; z!5Q{=(e98KbNjH}UiFiA{L}-Bv&s-or_GCdbJdG}Ju4kpfG2GgocO6cY>D*jgd3~% zOl>*4067#+nm4gKXEyker`^NS(_T4;ZFh~ds~qKdQ?BTMCuGV05vDezdsW~=Y0h$K zFJK~>QC!-ZaH8$G@XFjEy6NP(|9DaJJU4}p%7sp7_wkWmdg_G!sNTQUm~%W?TM2Zq z-B)MxSHYR_)9+zpY*fW5H0Or=NS5SE&Y)8?*V|PcYrGi-ePGrQlwM;O+wdEKra><*+!3(UbQafVIl2<$@XQoH;K)FaJJD(Oqv> z^rBCXZMwvyY)Xy$+#P+UTbYwm8s^uSE77y!_&lEQbN3bP(j+lFf2{EeYg_c2$=%Hu z@~HEEq^UPHDo^~?a%B&Manc-~KfYsJOCGe36S!3REI&;Bm+FK*LgQlHgS%hK%`sN- z<>)ry1b)Iy`bu+%YIm{`u$i=epgAJ+t&d49zxqneJAe~1>CX>HwxH#<*y55c--SNv z79FMefx!Ojh^~%xFKIs)V`0e!X=FFl!bf4ki7|=lq?XGZVY;ogZO7&aeY@YM^QQfx zn>Hprt~NDx&_9G7>Gx9sMo;$V!p3*i?!ZaoM%R~OYgBX>W1_{((k|;5=tE>%G~wPf zJ}Td*>DYgK26nzs9s{f6v6**|Z4I4t0;kHj4V5}(BdV1)ocvkKuq0HNg$7ysyGjm2W9mDC) zx!g6}4SBZi*E+&!^xVd9$rAHw(05So*vBS+s$5(|hC*@8UZ~nmw-J+CGzlkM<`5JI z*?Lx3u}?yEgRbUs$b?+%c)m-(H!X5`~Mbq4i`1Ir8SNLslMIW}N{NXW%!mq<+FAIA-G^c!8 zp0@=b(IGnBI#cETet6KH0lh!3t9)y@$^)#}JLJ#(>YdzL>FXT^Eh#Ji4i{X9;TZTah; zALlmsMVDOWB5Tb@>V4R~4j!IGp4UNFIFB%${xfm?=deGV*Z1;sn0KCiervr~m>=(t zgI|1yF%s|od-?V5kDGfMMt|IJc){-r1YRKU0)g*k1k~4^$NgT$p%!oF!Q?z~YUTaB zht=Y{tAAjd@0QGr%-U9*zG?Oc@LL*f-{L1f@7Uv*n(eC2&-nR0@7O@U&kug)JEr&3 zskP2rVz)H9puMl>b=d>T9v zQmr!!Ps8E7@4;()e(1y*?c0u*kCDxPkI_EP%kNd=q2pBkZN^D7CO5Z=tZiOK_nd|m zd2uH6wD$_Py{pwVVbSBeH;tcYVV&cmGK9|JOoMo>8@f9!G4`X@Bk3oGFhcKOzwuXEwWeZTFLHmUF0)3(3^ zoZ$%`>F=xG>o(r_M;LNaIfIlB%b3ozvG>Zyki4l!Kfh;ugK-9d{L|EXoUXUTP896HZ{?JZa(hlRXpG28{gU1Hh1ofbzRO-ALje3_d*;LcL%xiLBEOC z?S0bw?F+1AA5cfGuB=Y{a^!!O7?C&SP{*oA^+zfnSMsAi&40)DrQnfsW?%u|J|3st z0}&3ldqbMY7di3uqHIp&)t71FK5J~0zxYKzK!bkNoo}lMC*G@mx$gs9xc4H=^JSlP zXARhh7TE{tgC*1T!buq6(oey^WC~s2>qs9bjqQ<}%i`guE99F~8?JX2JX$s&IR`w zsh#;UOxb?@Ju7^auTPu&j3=Opz6*UtxcaZue73NY4ek^}fAbEVq&s-n(}f@1d>-t; ziF^8x5q|8W;!G!UB|XL5mioAGy-~h+sh2C9um5>+U`D^@GyN zMHbG3)6?S6Pm-s`fV4rzLn^0U*!bnBY%q~Mt#+n1Hr&>cwC^BS^}P0N;UWvEnPLWc zV9!_>1N6^|^@Zr@^R`vuK^HnxdR%3SUZ010_*Jf4Y-Gthco9CjFgLK$S>BY6Vy>5P z+FKYG|Cu(VHmv-?&5u*dPrJnaA`N|r()w;au<^_A%LXH1fy*=RGYjQOA1BrE)7sfm zd(zpWOvGb^6B*Hucu!$(9V3EG%g=o>|dD8v>xak`T{w@ z#yrb@vU?)kxPGudvCWTio+eMolG2fXb>6_z))SLjWeKOb#pJZGz?Hs2o+i?Ts_n-+ z#(kutZJj0)@GQ9??&My&xmH|c3~c5W(!Kp#+tqf)7)pIE>1)wm&oJTS+bm$AZ{BuJ z1$Uy--h?BVlJ03b3ar2q9QKN%N#{2`&6p1iPupAF)6%tqUKDM&2`6kL;UGKMrxW>- zoh%(iUxyyTezJaT20wB`-;UjQ`rN>A&eHYNi~3mV2CR-_-5zjQm7Z-O{IGD|aF=S4khjSduvkwQ=$Z z(_YVK%IBZjlw=C~{8(=0H@G`Y`^ITc(z#$#?C!TawaaDB^=Pb&{y`6sH~N^fj_T*N z=H*JZIYF2A?2yfgr<^UW`6g(Aj)20O#|d7cN#hq`rSUoQcK$tA@bB9>w8fp`>L_^e z(|n)!L*~Fq@&iuNONp7G>iuE(NfVyyk&VK;ddiSr7G3rJj<@f28-?yX0 zSKCayiTB_sIbf_W-4&cwuzURM9Ha8_UHAsS@SL{dxcdMr=Y$i}V{T1~c>>8bW2u|e z=c3bheVo*O?3~mJGR1rW{S@uTUmN0G^?a+vP0Vbh-5fhII5pwMYJM5=(-z5Zs-q*L z^t!`9^YZ9O^qOp2rLC7NsT|71ukz`ORgbcN!~=6Iydyq3TlVsqcVvN^m4WO@7X7lw zi}?tZk(eo2?BjWP-)>Mkxum^`Kb4Q%fCv3IVSc-SAMl!NPgbx!z8gxso^YMc3GVC` zPT1wD1N6R+liE0a12ky-B--TO1U@QLG)U&Pc6p**RrPJ4i_VlK7dMb6FhZwM26Iv) zv%!6u*qRO}@O1rMaITiN$ULg#Ni^OTS6E>as2``VtKLNfKhim-b5F=lMHl;F31=4t z>tDXDO*yi?f_`Bhi>KBbKw+r-MvPfQLNYp!97PO?{V_+ zk^gBpsV!0-dHUrhV}nEfIPbQ|lIZYht>x!lu&R93kRf3dxJ}i&#HEvhd)p*GHa0SR zIHNr^I8^hDt51Vyylt*eBjbw8+ykZi?35R}I=KIrJAeY2T#3!hZ*Hzs=bwlR7D^-c zw&CN`BN~IYcJX^coIP)R>!00YzVFMNozLFo-nH%KZ8shyo?rg+&#ye4)V~*zlZ(Vf&#P{pC#*zs(4RlscIWVPcWwlwK94vt56(SS zi%aEHvUREXA~JH`xNclm+4lre&m&IEqcEQW?fc2yUDiL(%YUtSJ*|ai^5Bj!#=^>* zIb@Azo+q53Rc(*86V_I?R)&X|6G6VGLK}K2E|5mpW&x50B#aye=3cH|vItzfR!i|2*O({>2A-;xzY* z%RV4@hIiJu_^}qivwo~MA&ab8D6R67%UTY5>-4O0pEpJ+uJ`Ou2+Ne-)k=3;!$dQC z4Yha2-807ArGB>NqIehKLutUDbwWM+?nUyu$+)7~?M=yPx>BHQ!HW&TgwKH?rQj z+O;&A+?tp_`7K`MeLFcnA64Q(F4)X34$b&y7?|(A=nqVnJJNgFFRT2|N7e0#CA#JE zO?STEa#1|a6CccNJ;$9_Q+c-siPI?&t+<^3p}m}k->b$6_8=aYemaFW|3*|YXTrHW z^vhNGzesw%10x!I_vVo~NddI6NAM#0hx0nMba)sa;-JsN;o;}>?DmQCcef2M(Gxx| z9OlD+=KL43hko(HYx#-8H%-o}gXx9fd>XW{u8L078Aj1}vS#b|r1IsmZ=1eId+uxT ztT5f>qjOgZujOh@(?2`r#|!Hx|2(dLt{OV)hfYwEu)z&~x7_4p<2*WCd&8gB_H-`- z=T>}tD<2=gIQl}|a+PvprnKgv}3;k@dJlk`RPtgC$|DZ$ThQXA3t zq8Hj1m%tABI_;beaamKJoX^JCGqAF_F}vE)zQp}0+_A-vXYOX949P5*AVY+O`vuCa zH%5MWqpgi=IzNefavYIbT#W)@^q^cF!o@z`%9~nAjeGwnC|O zB+UCop2>rJGsEe`W~tfTLkBK8tAz{+CtUhe;@1nOT3D%lL62}67;akJF7@Y;Gw4G{ zT;{I6)35_)^6ehjHl;SVD@>%f*>{hgLf_NRXdiw(aq_X6oZmSyexn^ge>zca11HH7 z_gtLD^JT*Wou68qJ?z*QPPoiVKtrv6H-!`O4Hnop)S1pLXGRJW-~`>!i;lW19<|b; z$FzrPEZu$L`vJA|HZ;^5BVV4VJDmrYzHXmN?B$j^%EC$gGVKojaOJOsL9MWz&dnJ2 zi=p3ev127K>5;jC?R@`+WQw*fTkfXt@#{o%;$r_W--sU_?&G90sA1a(8y`INz6yJBbvnPy6 zt!LyATR=9HyZ@`da;!c1YZ4Uk{@Jmy{0#(jB$PSJc5u5hA{V|=A&-2R=$Y9Az< zhH&nFLcf5K_?4S$4ekr|^Eu0w;OJ{o*=%ncIn5JU%EWkzUypF#!}>sTuEQ@TyJdr z@+hBw)EzooV`AC9v_;udvKeSA$O!3ZgW^{%dYXQacVT%`9JyfV+fZtA*ecL-)A#iV zE8&E!OK0OEU%V4uv`gj)2tzON!_OF4JmVr~np+@kW@md5eGaaSQ_$PUBf6e8>f1=z zwYsxFb5Fj`6wNo`3Mc6CapL)yhrPmKxqB-=I_u65A}bnK&}Nt)L9fd`0;l7&D&Z`5 z-mS4DV`J{VSK7U3L8c_fH-QgjigIiL>JR#u?}kRkF&dxSKKkt8>S&?3I(InRmUjJ< z($;bZ28!LmU2BV@$f4q3^Go*;W_KH8?EJaiSC)3NOBga3UXzi&;{8ovCHm>-WN%BZ zq|<}@FFK+t%cFKbZ}5j~X`KxjQ`Zji5?*XL|@<^CgVfLd!8 zqNUzA2_Lz^{C#j&j^thTX8UYl^1qt8(<|ptUFMAyxOK$++9v?y`jQiI3KV< zez3uOdy06-YBhhmgND4@Y^8^Hn!{APR=yg`=o$A}V^k}Dl`s2Ax)a^uW5nG$LEOE9 z-Ho!%JLj6N5AdsfpP%yII9%t>Rvkp`F=uG5Ea(?2@ zFvCLe?Czfa6Zlozr`^F*#WGkMR2p35LT6=r_xcmnJWOBlp0=jBa(^5J|H|iCV{umg zqM?=@Tsh~Huile2(^9JPSHYjW6|= zn6tYrW0o*(!isuCp3u)v=xAHlQ+pGSwOn*G`AIi1e$m_j*irU$N5@DtZB+*6^UMJ= zci`JvVOnqUSvbkXp26BawNWy!3s`pZkI8fbT>L4KAGPN$0rSQz+fdhZW5ET z$`*aN%mHa^YImO;h_9!)>Jy)kN6QmkzP>V-5AtX_0Dr$s=Dj+n8+#RY7Ogk=PV~uD zpKRx)E4-c5MYS+fKd*Kd+{5Gbg>G%0wi(#BU45z9<*C8yIdheLlQ=xBY-m&*(Thu4 zs)b3-uu9*kxdU)QuLbxWt6efgzj0Z1J%Ksk6Z0Y$lr!c<8OO~QHYXUv?3FfmkQe4$G~fQb$rAKSp4b~feG|qX{2^n= z0>7}VIXrB<%iI9*f_<@@cFow_VUWY||H0^ZuYFMB@!RLeC#)E=Eu_=4K3-uiz=5@_ zaJc_`kSy=9rx#tsI?VAH=lRk}K2P|ClkYP3f(&TgfU^bsm=|R}j_~l0xm~Tr`+4El zUIYB$@}H+?@x>ab_5~>HI$ZWkDWB&Fms+&K2lGlkPvR{Y&)FJ^%}@G2tveC#v^;sI zwfEEF)k=F?!-R>})%A>f+V>MQA9Wi4%7b?2f3y0wVsIY1#FOumuKH~2y}^3S@f<<0 zPH=J_K=DytFvRh zc>4l@7YMvS;MpP|T_pF}mUcUH7w?yKZzosRL)Aqw85nHoWiKi}&hXV5yD87>q3~vN z5ifGt!(wNs2AGRv-_LsIQYZVD+5heTcC#n%kJ>49&#;$we7>(m`=OMl+?(a}a;1xQ zx$K_=n=t>{Pkj-WJisIp^w|;sJ)p~!Ui`tA8$ftE`q~F$2e6=Ue7=-iipXo!P!R>>c8g%E)kS{+De)>$`#;9+L3+6ni ztMj%u`YQOsJ__^VKkIA(xGJ1>h-~=s;-7Q1JE$B^wq?J1{|j5+>4VVIKJDlAgGV@TKP~6b{I)4wN1S@#Lm8rnGndu#gi{G8 z_t-2x{nRshR%bnx)^|D6$+>FQb@~1qcdzI^mG#2L_ELNM*z&>b6#nVdtnKZ!a~f^U z?K{cgYMp=y;jB4J4#WDdf2-)uE7Sug@khTwTS3?KOb<3GJhhkI7yZbN!f{!*<@^&^ zaK>k^IGQY$=EnUq`cLz(v@cGR7dYuGnd(LTKJ5&=h(}xIJ$h3%)U(FP=NTE1T+;{X zd>}YMKkp<%@W!1NPs89m?|qy$x`I26gp=0fc~&0?Hpn!xCHkKwPAbE9b>0-Z@beCw zpkK0-o*g;YJ%(ptR4Q#&^YC%vP9tH2t9qf{c$SUs)BG$kB5%Je{K&XJ#-;BfJUz11 z5B)mZ$yvj*FgWWSY1Mwnn{N!Fr(8MK?iQA(s`vPvz^QUxnJ~#YY54c7aSCI_To82d zqm8NUa|RBa^vt~<+lQ;o=wM_4oy_xD_~>0`F1TApJfiP?c?#pCGm8Fr2pdi5>w%HV zP?>(4lP=IZ-8~GS=xl|{HahA*dD)f6`jNa!yE#*i1o?Sk9-ywBJ8R#R`p)XJ3 zp&qVy6;8gs=B^zuP#k0jdE(9s?vEKCUf-qfKkaTh;vTH*4*2>gjH8d!Oh>`pktIxI ztNUX+=}l;=2RW_h!RJ)cDb<5D-)U);%~C-C!*@s0F(E&1@nkVo_!eZRsP*U;9GIc!#yC!D0G zPn)Merj(|hxYQ~OIggXN->^v>6_4J;w2mdeT-cc zo`2z9ZJkRD&kG12xi@8NhU-AQ*%{rF_w*Q6!io78&Bb9$&`#AiDSg;Qw-mc`g+*)2 z?w!dF_qqA;PHS(%2p7GjG-2B7`79b}V_icBd)m{Ci;U?#YiZkKx$0eP`^kPcM}kao zt_A$4dyRRD-ThnAbI4Bho-)JA_TalY8^*pqCa3u|rh%4vV&j)39B`rE$LaXKqTmh- z;(!PJ5kH>6Pxpx7nmy$1rqehC{DU@qyazwHcP+U4!5`0^h7+<$8y2lT{q^#z?7)Sm zjRE*@cvbGy;Xah04F-1?5m!2zc~KuH-A#8gU!GEKU%Bc*d&@P3s)Z4AEVOstY5j(r z>V=J8j`%q_-?LY6d*yZCTIJpz+NHy*a)%LVndA3y(l}cAI=9lVC2W2Q7n2sfE*R8{fejdQ#&BXa+aJ?QBolmw^+0WU8`OBYfnNANDjjVZWY8 zSFz7zC$L|^$B8*Sej3-1C;8mOpZM`z&1X2ADr2i!c9qX_+jL`&Jp8pt&0{eK0B_h) zej52XyGL4VEFUMv$c+D(qf)QYU4 z@@!7OT*^n5vWuHLV8s|m^o8lJ_p|8m<^S9`RqjwjhNPpIyV5=P*rSXYeT=pKtaAPN zdT^5d?wJ|cpxrB8y>Y2k9<+uk+2Z007YrDmRPKfvP&?(_RCBNn zt#PK=BuBElXNk>R&g@>%9jJ>Etfex?h)fovGinc@0!1U zp!pWXzX?3fDpPd%E_SouW}fiRPP*{~{hR&VystZV?)tRgu2%Yg<~rv#+oHlp_pT8} zdB_m`2sXHMH{oZ|d(-bu;8d~2pTMWuw{L6_AKfIJ!gDm}V&M{Y*PAD*^8w_eyB2Rd zMyexW^~Bg%_*7iRGKwn~`SEcDC;$GwjqQo$rGc3|Kf9kUuK7Bpmn&LsvnyKdJaoIy z^OOE~5!(QL;!qm$#4AWgg&%-i_$27!&Qc^1k96S=n;AJKM<(@EKQ5~nA}GZ&6i z87n?d_}mCi)`oq1K{PxM?y)>Qt=(ONJfZ8V_ebCEJ}z8$$2f)NI752;!fot~^uhW< zP;!`_+xmQr)6?&0zY12__Tgd1HH?*S(|X-`>qR)_T1(N>=8rClPv=~&iM^TJQOEv9 z#>ddZngbWa>)vz9_URNYe%NjDLmy*fXxdNi?o#iIox?N8KwoP3_*(~|w&dfne7HN$ z-dN-%%o}4##z+2~%xM^f!^3&q)U)c4@g8F@>O4#f@&E?N1{gAqt%Zlu@s71E=7=@# zqH=s!@%=FT3cqcxPbcFy_Hi;sWj>ZUUF3mz6Xuxsfh9k}z(Z@JjH`q7g;aHIiM(0+ zV~w4C7_KaDeF7}}^6}p`e0+Msv|jZYI|&<~e88SP32Jxt?HI%Hc3*Gw(=W&69QYsvUJw?o`fg#Kxydbe{JPN5w}rSR=)T^f5Zd z<9MCMjSp>X7|bI-iIY#yZS)`WeA4$cT2IE-6YHne?%aK2!5#y>Igk6aGH>$zY4o3$ zrqj}&6|TI)aTId~Y)Cv*ab5_f7J7U1j?`U3Z?>mEVheULf!S zffoq8K;Q)eH-UiPN6LQ_bkw^{@p|2Ez4>@ncdd@0i=U>m`8E=LUO0XDnYC1C(6^fB5Bl8QA$~l6 z-~VNJylNU@gxo)kZ_!QvPC9>2rQXR!uMy`wXUD4YWbyf@dwP@?F0}b)Laxg9MbihA z)uzp-Q-1O9_UIbz3J<%;9C>rbG5jw4to}~>U~9=BI*e~viC(!E<@Yl2RTge7+QR(s zjLk%RbZxEo3R67Vl)_GP)u!n4kZX6=-Ej8f`+DA|8~X!DzxiRF5HF0zYKfd3_`tDivA3moc?7;#%AG(HS*4^D9VcdClS$;2@F2IR1t-%>o z>?YBLyPD~4VJ|oBK$u?CCGEggvCBV~PCN6<(b+7qb1wZbu;m6%YweB_0y$__NTsw4rLRPdtOnoD5 z&c!o%6`s;}H;L0^qNNB9(7oydn?0TXYno!&f{_)6lDzTwlD1DN2_Pa&|id8 zPv8P>vcZvYbRG3Z9R6Ll{ahxU%EU!B>|Q6ghlFQgG`8E4KM()sjdL1KU_-g=Uy=OK z<`{$fbjp7jelMFwW#S@B>_hUy@N;L%MelwDGuj|BI=z=~#Z~*2j12EJZETnNtM~qb zjdY-J!bPs=AEmFL>9YJ@Hk~jL4|?|RR6q}5`=Nv3m%EP6bAJ|XRr&dD&(xN?&oq@t z7sB^K3Jd8+;f4N2&Xmt(`Mqp9m1`gN9bN6%I9yCGE^HjG+Wo%WQ@jHkcfZ(naKD)1 zgWGxZ)xpZGdce*W_tb_S;zy0wQ_ z_f(*B&!eA-C%r?SXX*a*P;dv7-9Ks8d~hGD=8mynNguYYz)HHHUf6`oaah^i=>9%% zox?m$Zo=59E%k5A=R3_#C(l~#lCYrtr1G4PMvtS5&^?-4CN1qRJa54`!O?2(!#vdE zS!Gx6(y{%KvdzzGKR#CIcJj#&jLm};{#rPpuXxAVXmG-Ql6^_IudA6CP@BWmd;;<6 zflIgy%H^NiLs{7?&wVk3)#BC1M}Bm*^1(&_>z(hS-*`V1pBx=8442?vV-X)C<>l*h zjj4GT=AmBC0bO=KQ|0ax-FbpNg>LqFJ7zrZ`ju<#F`*q!hU7PKS!d;f<{LvDyi zdqlRBzg%pB#m+f*2eRfdYw2zuC;a~XIAI>@@htk$OOh${RWR3bd_UH4yo>qV_sjOv zgX$CM>%fV2#rT@s{5x>M_~`kjbrf|W&ckQ$b-sC}qi+ivl=&yd^7KEdU&exro%zWg zB+k~#@DOJ?$e*+tmoNs#2GKVM&O46^uF8WvZ{kll;a1z9>2;k&MbCnje-=n{)#w!6 zlO^7X3m@Qw?(y^Y{n!KHaf;-pmaBG39yg7X!)m&1ihC|(bBZ_G33J%URd#q{hj8XJ zg%g;$Fnh;1Nb=?KbmtN_wx|beTlE*rU)I8;Rv2~_^QWRmZap!hOxlpfqoM(~jdSsRa>IVnaT_oaUp|dm`>2W2T-@#w z57r-8Z=wC^9x?Jle^Jl#9p%ZB_~;xzI0flzt^fLT+|=B7SWZ<>^e4<~Fy{lEvX}jF zjnA`mvC@ZK>;ulaCR>*(?N%6ZUqNus4{7Kdd|dD|{=;s^*7C=JVcP5U9OjK@&F4!m z9P1~KPuk8bcl87^A-zN&hb^wTOKbzqUiNa4iV72`Y2$uVCF&nIv)S<>DVl^>p;qwM~np*H4-!HV&-;)Z#s z=QA`=9xl2DoHSOj`{eph@L8E#AWUsfI5BU>*q3oJc`=V1;M8}!%=ZF6^+Upq(9a`JhnB(-mov}@D2d2if?z}kmk_-2-3GCH&yQ`Zq-bPDtnY+cd zo41D;w}G?9F!UpmPk8rnswWm_l_i?!>vX3v`ucQv3eJrm+f93g&bg*T;wR$=yG|C7 zN6Ulo*@5C=`0lk#-=3Q{piJaR^>bTfrxsqq30G~YI^W{yCE=#MF30j@>1wpol!a}@ z8dG76c%GXI?();vL^RZ*?>2>r&cJ0}Dr66M&*+(x@l$z!94EP|g^$8E`X}6XUNvt* zezysar_tj0x4S&f!in~Tz3yx*(>=A?DD4fMEnIvT{lvS@sg+yRpFIs5|2;U>ynEb} zr!z4O#Y11w{`6z6T*DyN=qE&5pN2-ZCo7uGxbW2|Aq zw|=x8!g$9z9_v$#{h1G7og$oPu61OC{nDw*zP(_~ZR-uJN!$Hw!93N;@pL#3|GA#{ z_+^O(^oBqGt?&!GZZ4s1O7m8HSC2gkfnJ*5&=~rpE(AB5+jF+)lXs1Y2A}Sm@QV)i zS!kcR!Y=08`U+zk>pQ_i>+;Njk`Hq+C-FHRS33N>@2A}a4o@pnSTOJH&kH>*o&R2W zI6Szk+^qqcTvhrC=T;?_l5XaDTV`4fjkqx4Un8 znCGh7-Q6?TKRDe#<$?!$$7h1~mc+&D?jESPVJD@4AN%w>JzZ~p{xgxt_kASt$yXZg z{_~Gi+&|d(M}OzxE0G70hv|R*@9svv*zVyvcL?WMj_@{FpzVwmE z(FYd(iAXN>@Z*(di}Oi){>hg<`Pug(k)}TuA3ip|AOC3N!4FvcN5-$EX^Xu3 z?{7pRcRn8Z@mDrJxEpDE_@nn9Jo;$vLo4TJBUXMc68U)K{m2@aJ^az!gUClBKk(4< z2*zeKs<`1l(U$M1K)`VarkcMXGw#v6QEoYdoF50kE(wTBiLKY9PIg-0ThzaNRT9{t2eB0ulP`55VwMz@s#-H$A9lgkuk z{N~+i+#evnzr^$33*Nob8u`+%{eO=)b9e5q|6>>LI1gy0?!NogUk~cFg5jgP#*5)& zI5wg=3BxdJv}c35`5zr^RyX%skAB*4j9A=1X>lU=jmCCsYh`l{`$**L z>ks=P4;<}7mj0Jb?yW6Z-rpjx|B!s!a}OR_oqy1md+_a{+=K7jz1#NfyDznUV6tl1 zw>cUfwjTYVmGgKf^5Cx;Pmkl)o_0)TkdJcq$ar}W{aVDt%AUU%JU8%cvR=*Oz3fqg z$;!hfON+euajlKr`P!Y0heiYWd|)*BdFSjs?Zwi6-0HXOQ9O{lhepTagUEw>M$=1% z0paj9Wqds@MIJ1He^Vd>k)MvNLC>8(7x{z>vwENoT=>^M@`;FrTmEgh_WQwy-!Pda ztsn1mf9^Q_$Ncm!J(>PzD(U@rum8w#`tSGBTX|2E|Ff0!f5v3TFnefqgS_0gx;NS! z=B^!n!`j~HpV@f$Gsa8dhry`r(a)Mca;MGdkar?SU$^?UdiW;T{13Ec!zn_(hTp@I zVU3P4ydL5A>NIQZ=I;Ofc=M6fiysb-R?cF$E*>6K^0GR4gx{-U^7{7gKi<6m{rA_u z`bUp{;UV%vxh7LpS-Ky{j*I(m9&f(>`0)>Y_p3pBpgvuG?$aPwxhrCQsn2+2LTUl zM}N(po&Wu|qZs^{{JQ6c_M>;9Rs7}Jk7g^heoFk^Z+HA{dbG}wMtNA8kxH5{f9qbF zwD~W@ALSZ2Uo1ut)p%lg8usj|@X(Ak6Qd_0pJ~fWG_im4?Xg{cY>tzD?cxW!$~{%|H0=lXce~ z;w>)Tavev_@*6Mz9yE!M`yEIBQ-!9gT)rRh@vj^mfn5I2=C7uSbRN0>^MovSI^JDg z6fM#`u=D6AjK`{s!-L7d57&@^ zM|V!j`2S+h)jDeEI{K@p(Drvd+Wy)_Xe)OeZTqz43@fAU_iEJPKM2wGU)!_e@4c?0 zY0INZXC!&_*;DBJhDYb;oF5zO&hPycHWWI*bgJ1AX6OC%dilM7@HTqP*8#s6qT#QK zhH~=gFU$X4@+fNbkY8g(Z(AE#e_drGzaKIAr5~6y8{*-eFXhbt?@U)Z*{-|`3h#eUkIh&wda7g?xQX92R7e7 zaW>y~zxv-f+sD0szx!yJxL^6H_5bS+AOC_2%k>=1Rnz=hCCz_voaTPd(YNgV!`C85 z8Iyqz%q88O_j;UMd^Ri>@An+_Tl{}vdigl+h>KgU#Jyv6`xmK?SMEG`^vZb92faUX z^xs;#-|*8#(k|V4CEc$Xh9*-^-$hKO{)*-CtA6~3ApVTvTRA^ZIZbySJZu_wef>|l zda(Y|;{07p`^drr9MVUB-OB$JKfn7ye!Z3aUah448O!tAh66T0fCcgHe)EB0N*@J( z;AK72(YGw@Vcg1(k3S&Y&sqMY{gia%`$5`oR?!fYJ^B`)r{loV02mg_! zzwgr*8Fl!)EPewS`?)*+)@0DqylwH{_2cJ)_Yuw7pO$`6@he@L^X*hiCrB9em z6WFKa(IW%<=U?~JzZazcKP%~9y&KuQ`;nhpw>GtYC-QZ};_KhKXJtP8C9_9=2^-OD z*Y`({CM=(aJiqs+O?GmrY8jEtQQF=Sx53gjRK{!m`#yU=>C@1VaXkOC3JpK?1P%AU zH3bcS%V_vp$21tO7FL^vAE~^HIzG%sbm>mg`2!XwYIK~a_Z+m`{bpLU1oB}xyz(#p ztWR?}p!q%FX7S?YXPoqb+SC0Y&M$az{+iWm#lHEu$a|TiVnl8GcPj1lAGvn=UqSyX zX7jyb_Fp7oA~tsPFD>q$di?ko9y@z4h=)uXkKg()iT_$I_3$T+*Pk?f*B|*(*=WLV zb0DA0ne2S`tHE5rcfb0pu8fC2WO&9S4;bS={2{a7UWt4dxyyJ7d&BHD8*iCz{@wR% z{AXjr5C0szS@||L_(9^|VJvGd_0O0!V)3faR{nkDzViOh812r_7|+Tz+xo$sk3`le zpY}CwV{~Y=IRh8Z!csO~{P4S9{qHNdRL1Ov3FAmN_V{Is^UFcmzh=CS2W|J~BKOCR zzG8T|apf-u_`Kur%stS!`MY1O;AgzMc?#pz=s9|1&+zjdF>;KI1=rk-14;SwALnRJl zR^mUrYvTsv^}RoFfBn}iK61d^Lc_=2{}CIHnC=PEMhxS}RtE1surT7}Y;0)l&ZTDz z`Q9)7;`;qxeDHR|*WR=FqVjJ?zIJy5`WVwf*L}*gIh3m3^0B#+0EIkhQWZ`P;i6jQl6}_nE7S7@iN)kq50{k+w2T z9^6>icxh-hJ{gNw#&hq(r{&}Hrp1Ln#f>(+|09hqFXO!u?$R55jOD6)Rq$>=E`Rj? zgUG-AiQj(o4U>;I%Ky*9q5I_N=9cckcZDA4!%rUn=KnpOS38!=|0ZZlCO40gkqR5SxC-S9#`bWWh zij(i(vH30KV|3Om>+j!j@>}zr*;e-rQ*5l?{8Q%s=AAE^q%STSANdo zeP3kr^TyvJ!}Q@NoPPPze{N;p>9BhEw?FZhADR51LmL|+Kk$L!@qxuF8TNlS6bD{E zFx}GdwcKB^I;Y+qd@yM`#oFAi)!)H0EF)@VWUY*eXH~{*z{kI~u|uL(8KdXG%8OG2 zE7QLfy=QYAPVd<>vhbf;nWkG#=sh=oQjwj%Y459YX7T?9@oUMP)!C!}J(%zP?pOb* z)8Qunzx6TG(RU(|-!c96O*bF;QJd474CZAuCup|9hpm3Rip*>7&yP2E&UkN}70>AU zi~jqMS{w7}viH{R9{frrjw?SK!RGn!H~e&AIxFe^btMiqe3jSAJM#FL*^OXQ^Zmz7 zKh}Ex>y9QjXK(%YgKt~Bxk@~TExN_p$KziQVf)d@gE#zmVVb`Y@cI|eibL6^TOZk4 zzz2raulRAp<%Z(^##wPG+wyy4H2!NpUYN$acYe#+E~YE6U5xh+zhmh>_L3)CX0KR3 z`r+fdcif!6WTw@R6VA87J9Y8_c%Bt^(r7T;U0kE%+s5~IOppIdEB9YDna+<#K76BA zdeir;xqPg_T9y4JU%&Tb$xpxi>gVr$>dT-0^u4!Tp#ATyFW&n?gBRZL=~v(U+`ZQ$ zUwQNOci$Lkh`rv?@W#D2Kl8@Bf&YtdzWZ7w_|13T{>-NceVM#oo_O`0H(zV$dHLPX zfAQ0n!$;Sq-&Qs*AL5gr zpJx!QnqB1cZ+-a-Myo659gF|@FT8vF(w-}H_K_EVUCGbA_10&<{KcN&F;aP|rs-0I z-XKEozPI{5SxMLB2s_TJ;;Ygh%BE6IZ}okJuKt(b{KA{>S~Y$8o#0in`kXvo)Uz^Q z9)JDEUj4#r_ZljMzw_?vZ+@Yn^^0#Cm<{nCk0&ZQTliaF29V01J>Pr#7}m(kn^qAG z(_eVK^8V$$x4zu)+N)oPzuWNHH$V5ehR=NY?N_7x>3#l)$uy+k_eY)YbFTefvJu9O^NY~4se(UYe)<`sC!40oA zy!OVMpL<=Ajj&fO<>y}g3-2_%`jva{y!H8e4L|ng>-XO3df6d!U}YSh$ZHY6Dn&JX z>MuY<*URs``I#@g`ngg#NsYJ-UwQN0HyVQYt(EG1J<;{@+xI^6<~#4+vr0Shx9)-~ z@f+TF^$V|m?%vyey4UZ0-U36Z8XBftaKjg0{mh$R_)OQ!pa1-;Uo3_5ZfGFb33)?L zCC*o#$muvvZ`aFKFHb};dM(&xL#4iHa`?pG+Lzyaw<{7ctehaNTE)F-IaSn31X17x z6^A<+R1sD0qL3@$;EU_Q&0|F1xd;2-Yj50pjf^G($*2|-zz~VN`ughzM(oF(QnPrX z!@d7XB=YCK{COwm0l1Nf@#nH$dFx#hpdT~k`Fg`^Z&~awyzZLJYS084-g)=cx8Ln> za_O@ddD)Cm{J@h?a`K`cC1u*@b4&%_eaBRr&IHyUjcpZO{$wj{XWyC&F$y{Z$zfo$xS` z8gjqqs2)!6QK3858~m%vm3Vv(+^RfL7Ztfuow#?;0S^v$qu;d;^j3wB>NC7OCwxFN zq&geT`yXMvs~aD^iLuyvsyo)0O2pO&2I9S)V=e2kL8HNr&7=ledV6|eYg?m@r z=v<3N8+)Sh_P*3`W;a$EA6}1*4zf4}48$g)rkfL~m>uJ?U+UWUoJjP>do$^l#?Dl{aXi%=U28|K;}i3l*hJ@W zG&*g>C!&qxv1lefUCehh&g>lKqvd2%uH3aaS{mC(l}kgpaw*wUUMY2zOHKXdu8pZu zsXbmUP3G1|M>ccAjmgIGXscxuZRwr2{w0%%_1bk36N%h)@eyzA>1~Ow4aX;Xvdz)0 zM9ajo)rHXy?)K~1OieAfw;b#h|n9f-dis9jg^a~A#;0-hfI0pV6a?j$3I|v z*!%V=pV9R=EpXnL1 zaRx@B>nz zhRvTTC)-n{Z2N%KNv>R6G@jD!ryxcs zdVA8;!_f5JR-rhXE068;mGf!CISH*slgUumhWYyp^R&6`{6>s7_%!U}$d}36Mt3>i zo-*2dEPUL;EKXCm@jh6}4vqIT4~*D}wbrKI&W`KiBep)>-Q3&R-MsF2XtPTM2MS}8 z!{xDqPAh-7oE(}c<>S4jl~SynPg+=dYHv9`kY8-HJKLK^tWFX}UthVnGh#GbeYIyx zD;xbwBQ1-I3tfvQe>3H-{6IM$?=OuV3>UL~1Jj9-erqqWc;i6ky7-9q_9UApVneas z@$tr<&S*Y8xM}UxuuEE9G#SQC$kLe6XKf%oyuT7pbv8xYriP0fqw%)3-La;|V%FM1 zzRxh995lWI`e#p|tXG$iU8>0*M!A;tHV&uB`XpL_5 z#T!#oP3y7Vj>)w+_#5pe=S>-tacc)A|HU0}9y7Tgp4#2+m`%(!74xgBOYP~Q_Qu4( z^1{MSVXWPBRlLLW*l;PCo{o+8G_EfXtuMCEj-+M=HrEaYSIfn`;n9>hSQ#3y`e&~{?oWFuQF^@07M(LZhFnqEzt%xv`TWM(^hrc!%{#igNg zd33&<>loiH4tJym7uwsW5*>4UD?>Y(!P4R3!APuUKDxF%+Ey-4jqY|%we>d7v@h%z z_e=(pCZoxb?RC>#wD+E&mi5%t`^(;*k$CU;fbr2hu+_OxF6Adn$##>gCZoM%{8$@U zIWT?NH-XtzR?!G-IvL8Y;2QzMj#;u0AK<*3ONtp^@y)e$!@0@0Rg0GBrHdZKt0%3dyCx zCXq&6c|I6Vr3sJsp$FnWeTB>&Ke< z$6AW*>&wZ5;%f8c;PiHEanbA&tAkQ@bHw;DdRLc9$=!ugcGY<5Hh%0|8s%o=ZFp`f zmG7LIUnp7prGu5-f!@u`TyfqJ)^N`XVmJt-T1J6xGA~2 z+`B)rJz?L5nQfj;6-{TQM+Ta=mNz?R_sXlybGg>8#nnRJS~U&xiZ`{%7LW=!4;gSm-($I$XpdU4dAm&>KyrRl`Xem=dhX?32OTNuon4sO0G zA2hYx(7x+0Oplmu+Q}AHnp!*i#&b&t`T5-LO44kLq0DSsVyiR1YxL%}GjnZ)Y`@*} z-)e1QbG}q6+dT&zb1S3S<%!*iLS|=SshsS#`r0%M%JatGbSYn6DCc)g@0Qn=7PA9p zJ9d>iw-%4j}G|i1Pj+(x;kMs-;mAeki{%fC~Oig5(*9PK4Gt(=k zb8~Zv{kipy4bx|3a4nR&TMhr#*>bi#S;{Rf?_>(?(6cZ%xZmHjJiEKR)L1AlEtFQR z&6GBc-`%OwYP0FL?vaIs$>CA6@v&F(2Qy2wH_>xhmpn#iicO_bddB)$q6gtW~0q;vVLP|-0EREJJ*)XFOIG5cFwkTZA{PZj;(fY9qu+BCR>q}6^Hd|$LwKg zX{5B;Jypmyn=P<3YprUkn9XGlyUN2`owKX+>851&)LOZDZMkV?et&#(^q^%vu`m@K zH#@#J)_U1`P`cQ}G<|8tbVdhqF}&TgwXnavm>TSvA8pwxjl>g&{Zm^@_8o(cj*anD zcmIlE7wfdP8As1`G)-^x_wP6NOm`M~20C|o``326He>6JYXb@Nx&5pOM%(DSd-^kG zU(RgKB^D+dtt|Rp-nTYxUAg~gS=(z(G>+TcQ`GoL43azJzo_XjD<^8>(x}lKP4vzu zy81h_bNi)S*?Nt`T)tRY8Ha0ks8DE`h=}k{e&u0^D`-QIE@x$zH-k9pM zY+9_Jw=rQX(X>cX z({!RV;P|vR#%tL|00*hr#;L~fsL9WCkJUkM(s<*f;yNY;v_1)Jg83++8Rh=E{2m zvAyzaQ)17)Txs8z-8Efob+x){@plUg?M*q_fgAtz#fD>znI7gD5~gF!PPBQM#Fg!L zXKylB(woZJxZm6XXGb^p?6tM@W(KfH2X`9Bz}6VpuJEx{Ebp!(R%NS~Vm_CTu60IN zH%EFVn>x2wI+A&qrLM}|bLFj-?!oBVcvEaWHV}`lrCJ-K8Dy!s(Js_%O!dYXQ(v(k zWDd}95A6TS{GXL!brY^8Rz ztu*b&r$;6e*2io+RxDj1U&xz&Z8Ezym|vt!YcZ6qa<1$uZ=)Of9Z!VWkG2ROJ1a}p zuQ{5Fjvx1+{}sxGVY-#qX+h zQK8-8w4OP(oz3rfSnF&~&9<5S8v3JNtUgM)Ipp7Dr(E9d8trdcJM6MsYVB@vQv>Dx zLLiH@_qqM){bWCwkT3Mdd#6YIdUqIt<7I!fWXdqJ&-x`PcilP)MQxrkt$J`gRp{p3mHtd_pGZ%b)rB8U)w|~>;@h05 zF>L)qlg+PLoJ4cX{OE^hH0AzZ{a+)Q{t<+;)3LSoVJSlsH*Wn_Nw66CYy@Cf`@|9{Nt+c5HJr&#FjF@B6*ha1m^rI~xq zUBia0&_&zeN1DoCV^4~@LdOvp{H(rRqVY;P>iPQqVy0sQomwrD%pFZ&-Dbbm#-4=9 zk&~aO(TG48Pl;q>Pb|=}#z#{$WAUA=pc|;X4oi!ywm7-<^;rE_ zK8?|NbBveqPPb-wEvz8p4lkFd@epgadNBN>)?mjSW4YbIzRgVIfvpGFnn<6`BgAc9 z%GRJ(c5H5|#GH|>N3o7mVqGBXT>Lh7UoLI*9ojnKOrm#+xtYd5A6mVr-CYY8h6!VR zBX_)$$`0Cz@z&Oq=$c40PVIMQn~gT+t=(Fa4K@t-cB7j)yZETBof&Ve(ew@5`c%Kw z18WY$=GxkhtpycljW>H|7_2O==R5o6Swl55J(zpACN9XvsvH~1+HHVU%ScP-Txl$6 zYqRlWIh$r)E^FAcKFj)4wp3iSb-{efcH`|H_?E$(M*O?hn5@Xmt!sI9xQ)`{Qb ze`t97Fx|7h)YobAXts7WYwOO7ww`HeiU<8A)^(HVvE{`s``FpaRw+Aa{Kr}A1&@Jp zS7~%A)o3<+XS8uVnxxEY`fH^vxOQjlVr^-#R4VQmmVK-r4;$V#2c5NbR-?h@V-LFG zU0war{_f4?jZ8dtu)Ew+4A!BUe@|vyTUpsz?CP8DZ*GhY%#O57mGa4PTjT6@vQ}!J z+*n#TwEC~~Ie4z&&t$2o2OAxAAB!GzHQD-W6Y_2{WNq5k(@Mn+s|Rc2rPQcW#F(l*>C#++N_OqTQx2X45ViBh4!h5*2dM&rc~G5LgT{W zn5|LU8hc@7GSl2+Hoem^*T92i(KtR}TQSTto@oaot9vW!px@O+mi2L4D=!|H%%ejm z3SArHw)`?RQeN#ymAkw12c_1*rN!APTRK>p-WwZRFLW*M9QH-WhHUt1Yi;G^=={dv zRO6WOGrB#}WO!Ul09M3O&`-*PmIi_8hbe+N<>mrP3sNYKS_q z{V+{S={{SB8r>}Cr}}N}W7gJf?YU#4u(Fw6>xk#G@#3O&)Q$8Pd!06yT^`Msa^0f` z$>E{i&Ar{_gGSpQv6$NH>?&LRJEP$`7;&~7`f5BHT^^ZOWi8P3Xn$$N>Dlq(nDq_W zrk>s9_MSvzPkcY$F|wN}wAy?~-qxRt$AW!Bw0R*|&ta{j+vXXYZC$F6DRt+p-dg7u z)A7!&<;j(e!|Y*eVLc2QenB56ymbCY|$^bK8;!^O_Ej_iib=S)oRZ8U9Unr)7%d-|~4Z|l#6 zNm~ar8)SFBl*w9}9qD1)msJ?e?T&4&c64o6c?h}SGKbn$8F7HYd>Dj+I}O}{>^SGCfkR4nlrOA`?H4EVZr*3)Z)m(#LP%jm(e^_ zC^b**kFEAvo0ztBW^3mrN9B&imBXQ(xx_(NcCNTrNZR^yX>-7H)wx*XUT=D8As&kkG;ek$4{ZH&!rIP+ zwR_fa&Fx>dx|&#O%l9v}%~<{QO>B0omm0^f%7vx3b*Qo3-bULRX8l~;c(FZV)^C?e z@!_Sm-r4?v=;$$#_TKcw%Q|*k(bS=Zd8zTi>*` zbGPo_zht~wy_6RYlC7hKuF+H}pPSmw6k;38?JMgY$>oW;uKl+4`Kiq8d|`8RqFfkD zrdHY})|zd6X080n?IW;9uuTSqgI5FsAQ`+InGWXm)ToH8@_FPfg?& z6JxV`o$R;Yi>24p-Bv%gFtzTqr*A{$MHWxekdd6&B z$O=i=c+l)B!>cKZj-p(;5XMx`_|Mp}@nKW@7 z@x;WiHD{xr`D*(WZRup$_7d3~OJyFpI)7($`~GLl2GzoEt}SmiM!hOW- zRsE{^1~a?=TGv-H$)Et-+|898J7$f|;t&+*=5Agm^&8*BZ;+z;|Jo0~zWzuGb{h_@_2Cui?zI{q;x3NpRR($2mgk|(fe-Ixzy~R8&AYzr`Yte?v16DD z|KYySJ&&0e`&8BEVa9`MXyz-uc$Y5z0UP>-`WoC*I;GFL8y}nI<#;x4e(Ta(j`#C# z?~Oll1MI8If9c#Gx#e%U$v<-ZmS+9i7yYL{{&v&-mLLApAHStp|Mo>c(;wzcsq+kv zZC-wz!qDPDCofJ2@3&0_IR|FIne|1EgPf3IzHO%GY2Vm+5E)l5f7CIN|kqibh*a8B9 zLaE*zPe=B8UYKK_bq$_j_*2EYn>}a6fx-rYtpYo@!EEla^Rt>+%y!H4K9LJXv>)8ZYUa3U?#|cc*}})V?E*Ssn*|>cM{O;P z5c^{l8%oDE7!JG)Q1ZS3=QS}0Yd1k!Eq(VZf8 zD~o5^oj&0`IJe`>bvcgj7Z$$qA?%YeamK3R= z_-+RljUDzu@zbQ|V619e*X#3Ie7vmMw^xhit)i2ekvQ&_5w~{!#fJn>^il?6o;BPN z<1R3p1$zt;t_5$;YmQyZN-k6OT4Rs?&^+=HIi#R||1u{rKOPqSXYa==|o^pHn+gtg)^}RcU^~sajJd6_ObgKZfCz; zJ04%#bbp1tS)7*sW!3k_({(J_dp4X)FtoSQw4H_!R|@$ra1*6HGGX4MjfVXa>e z)(j4B-#geCZ<^dGQLnQd`Y-?f|6B`SjJD34@xe97xJ|Xe0`XG_F&5zG_#D+1ayaW$ zVN@ONg6{e;5I!S*6nMrJOknfu3sR|cO7`MXFKc)rh7$0;0~ z+-|WyT(b)ct30;!^c>t){4@s)fw2VM@hY94*^O`~Y$mw|Sk7v88)x7_g3Yf_`9Ya^ zp~$?v&lZn)VNsEnhg1BIi}7KDZ(cuu^$YvxfrEoPJ0`J?$B3`w~51Lqt5`OJMrjZ(ZnADV?{e=JL`EC z9#5yXzOU{FOzRW&kAg-uhnH&yx6P zAP1I@(c#&2(JNttJI^}^=NS8a11|E4>+gkY0seTeCh4n_qg%@Iyg`5W*x#F#alElks0 z=h}BKjlH)7E*NKh5a%&>?M*|W$}tNbH+)^%hX`0F^DG=&@j>9P!qH>={>;9(eqUfKLLTl2`4VL@rumN@w2oMTkK)sjfm}Jo$4R)Jz#PeJ>i*0-Xg>%-s zlVJGi+FB2PR`4H!sFu60#&Afh^6!bV|A6Og4Yu>b){Y*Jv*~F~T!pz+Oti17B3Ng5 z`&z%?n7(X$Ojzq*$hH`-9;vk&cGh5D_R7uS*rHc3s=DDWcGB+29>n2?Uga0JUlgPG z{Y9cZ2h1^W`H@$s0cibSO&u>KYXG1pE)zF;zRAoNhf988)m$v0Prx8>iKF5nbNh zae;RU(Wgkj^PHJ}{i8zNgARVTW)EHGnf;sIqh6|$&T!Iqv#;9*l8cl#7T)ye zJhl((GP>mkn_;~luI;YlL%32e@20(FbI$xFGS1}j=p5kvXRxnxU9K5+rfJ__n7^I2 zU`YJEhL<17V18_{>(F1Y35h@qA3jzeDLxN+x7_uo&B~_bfvHhT0}GhC8kyjNb+g-L zdsJ)2;M&R7&agRPuD-kqk)+z4W|4pPkk{I;(^!6qBFEwV$KQXZUHm=>1s(LucXwsK zrG9Dq_hg+M)K}E$K^yaL^Mda@z`o9FVP~(+d35jB15PB+y$1Qr;01T^1Mv;r!F3Kz zjoawq1a$VqW?|ZhH`up#+CSf4QQuHtDBokFHCYkXuL%vEaV$B8Fl z2|VF`0!)w#FVFLRB^4&l187y(#}D}IHF+-P>wS><1RreUb0>M|f7(g972*88JW8OS zlpyh-s5^F?H;+Mkc=d%D8|Xp?pUy-)((R;BYOER*0O`^*LX)Sg<6C9VD5<3 zhYofwS<4^mmxJAEhsyI&eI1hSyrQ!i3qNv`joaP8$@9e*e$_g=W(*j4{({qH*zazCtXKaV zxleYDv&2{Z-&pN0vH%|5FRMqpUA3n-?d7F+IkvQB-jWl<;yz0ihkv=3Fld9L=h3U} z2ll&vx%z+kL%hUC=dv<#ys>8U$Cq5H^Jeh?3p8`A280A$b^fkDS2bKfJ)23B7qq9p7eEZNzUl9&*>7k+_%7e$oce#i=Grf> zO-!Kow|@WgyZ(QXV%aF96X+wSM~RoU(C16fBCU~m*BkMT+MX+@1K48 zZ`Jj!N4mED)>GHvR7`Ir+n!jXO%W1IQv`x@UeeO<$~o(I-h|2seWpK6%8 zX)QDle{DBg=@;=56gD*&Vs9(h2x0t;pul+Uc>$7)d^rvLhy2n%A^q1shpDeze z#sqV&Hx+j7w~K!9cgw$;OzmtY!|!G^pQ)|<2m4~0)5sbRI_xh^AMmlyrHTZ%i5Q(n zUA10QH}UkScTn6kBlFiYsLuf?dPe0&1Vl~gxV|P+XwF#lq7)_6|OZDTs@-$gkw$Gzzs&M6Z^nt34 ze#y5o=txJ^6uLG6%04B>77m6ZJmuZY(j&9K29s2Qe=0qoKCN*!x|zGjbGwJHbhTmP zRf^-a2IG(|TO2C!)f5AAU2GDEs=33Bx)--A(jki9J{m*f$|kv7cncG%(Lg%v#SFiBMHfVgIy#9UJ&CE@;Q0#UGMj>Bc+8a zZWo~hv2{{Go$F1b(QdTg$K>$Oul}X|HVUZ&%ERq`vzTYGFA851-bDT6`)+L4P4m9m z-6CeExRGo4XcqRKj)g4`{+-^ZuZ&z?2%Biix@7vvW@Tyo*_r$B<^9~eOMj#8!iAVW zm?jkQZ z93JrQ9BctxS}`JBk62Xq8gZ98{@fMdY(CYV-3%C>|8_xlG;Do2ctL#8&Li8Y8*H*8 z+|MHJ9(bDS;H8SLy)Imr`~3QD5sxzlcMt@D*q5(WAGX8dq1Wm z{URMxoJ_c%gKLA>dJzpu;_4YWREHmy_uRoV<6<*E-LO|@!6$OGH)CKAXGqv_pD|#y z?yF`l8yc2+m)ors-QKUy-tCJgNm~IZ{JG=o z7M!WLmll|hjSnUb#)H<|V7fnqvj}(A>(I7iFtD+(TKeYR0~3!6A0NhV_5L&zgo9@6 zwDH|Czqm(_x91!^BPJX1zdxYmHZjW=z_GJJH46gap zmmELr3;kSNHJ{U7Jw?%1a5cLKUXHJVCv2_5n6TPj_H3Op{Xi*viahKGw)UEhoq8g^ zP`$Fs%GNl(p5PPoQ;)3uj52@hpShrH?(o}6#bM++Puke4!5*!S)u^=ZwP-p1QN7Ch z^K7}Cz*b%4L0o2ogW!kYg^G*;`2qBZZ<*evt2ZzYaDsRXSw@Uxhv(sb(LdU;##r&j z62WCOp1<}U>u?EtYR=~y{9$9Meu8+_7Ittix|`c;?DN>er^2FsJkHf4hO>*l()SbQ zO7Y0eng(B(IaRTDn+;*bm2&*LP~^;dIbi|z5%Cesep&?g%s(xSi(M<#lYL!suOH1PGJvIlZ*FqES1xXgS0`Lb*bUE)ACK@gwJ)pr zOuReZ2V;xPlPi2y&IRy6aKhn(3gCzE(=s&k)ciJr8-&k-yKho&7z0Tw6KXs2TaW&T z5%}!r9+n-(ZF_NU}vJx@C^7n~U`s^lQ%g4RJRG`-AIbK8lZ%J>CjTIXPRw=AAK zZ?U~*bD^gf#t-GS_BM*Sc`(@DdJ&oo;$T?kk@M(m@bMvb?JJ(=A#82vbxT!vk;nPW z8!@?I!0R`^ z*s{{L2d!W8mS=5R$T7TtNhvP-G@iW{L(j!=)nX1uK5v3eTO7Q2g*B&vEWP<`-)f&u zQT%_(_pGx*uYN2CqbpRe9Iwwc*q~x~xNF)uR3f%>2F(0n^_S&mHdNcpgUeB3o_uY( z=#XO6mbxB(49G-a-S~uwY}ilqJnfz9(GmVNjCC{K<8yogzz+yc$oOF1-sJnw#bnyx zI@RXg9xgvKJ~Ev3+8j8pVP||xK5S%>k58w`cu&>4XE(i>_s-YnJe~_jR;N`ia9xG1 zn-|8WPAt2Qu-FTa1CPi2xz4fwn1HRn*n$llIBnVevwE8}I_bh-7Ku6ACXpKN!T zPFKWWJ(@krPiHHw=M?#gCPUa?s;A6y-V9D^<>#_Z0CvSt$(Oe6Q@fc>?}v7-badmp z3>-n`7{*q%U!UZTiCey$zvU0lqhgFE2Z^z;LhU`Ud$B%&v25E3!VAw9DYrkmMZ4J9 zV}BvqF0}U3Mp{Bh)T*ZLkGl*Tr?1mE4L2VeobSHs=p~eQsco z{P_n8_7FuP?9@iLqa81RsR_fuBn{7tC$}?M6o;o+wIA81ipTZCMz_EWgb`w%-Wc24 z8!LF*@KkNy``mu_f7cGnMG9Q)7aT|Ufx!-Z?#*I;o=QiD^?OpWA%%s00dKDw0orw! zx1IFY*MC$F+U=Yj)W73dzWYOhy*5|s`y$?J+UYysPS?OQH{m_SQN4hHzFyOLs{h?u zZyW1Zzx+u#l&D4ZdE-!j!KU!3a=WFQZ0n~I=_>kxtn?89db}ggn%^yS<8T^b) z#uh6(^@r?N-wpNu{9?hr;$M70G+sqxLwq%G=Uw}f%LXI$V`)@ehslwXIHOf8pWTCr zOKQf*o0Ix)xA|jo&~9gYVmPU${`~iAe=wGryK1NEv6AS8w%2679^AXk1zmmH*DJj$ zkCH{^U}EWEL;dOtz5Y{jG^-=xFHkh5zsL43e``$B_6N5GKj9kOq(j6!IK1wgg^zRc zJN4VRF>ZY8)4Nappd3^|&F?=X&$~z_Q-sM5#1nknUva=ew({Tav($W*Iptk_^ZYg5 z|5Shc<=%hi4`V-Oo%8M6dZw6d;d_k#ovZ%&-~1!TpKtU3bjN@C<3F{|pa1Ni{`m84 z{-5sn$NEE{8pNh4kXy#;|=>*nLJ}d{~RB}ZX_O5m6&+soHE!>DB~{AHGFsj zt;#J(y@_cj+*!UfehkQ0XZZoYMAe(N(tqlMZJB!Od}$u~kBTScFA~6SJbPHI!!Fp_ z6Nh~;g&a0CFc{g1$kpU?)UX#3qto!Jgmv(lE56|weqKL0sAs!=Tj_?8sBA