From 07f7f7803bc5b7c2a62073dbff79ba48fc380cfe Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Thu, 14 Oct 2021 14:03:10 -0300 Subject: [PATCH] MOAC with build system overhaul (now makefiles), UEFI for pcireg, ACPI tool and other stuff --- .gitignore | 18 +- acpi/ACPI.EXE | Bin 0 -> 22960 bytes acpi/Makefile | 22 + acpi/README.md | 12 + acpi/acpi.c | 139 +++ clib/README.md | 3 + clib/clib.c | 405 +++++++++ clib/clib.h | 125 +++ clib/uefi.mk | 25 + clib/watcom.mk | 88 ++ cp437/Makefile | 22 + cp437/README.md | 4 +- cp437/build.bat | 2 - cp437/build.sh | 2 - cp437/cp437.c | 2 +- lib/build_watcom_dos.bat | 61 -- lib/build_watcom_dos.sh | 56 -- lib/build_watcom_host.bat | 40 - lib/build_watcom_host.sh | 36 - lib/wlib.c | 116 --- lib/wlib.h | 83 -- pcireg/Makefile | 22 + pcireg/Makefile.uefi | 21 + pcireg/PCIIDS.BIN | Bin 913945 -> 944037 bytes pcireg/PCIREG.EFI | Bin 0 -> 46088 bytes pcireg/PCIREG.EXE | Bin 37206 -> 50692 bytes pcireg/README.md | 12 +- pcireg/build.bat | 2 - pcireg/build.sh | 2 - pcireg/pciids.py | 6 +- pcireg/pcireg.c | 521 ++++-------- pcireg/pciutil.py | 53 +- pcireg/uefi/Makefile | 112 +++ pcireg/uefi/crt_aarch64.c | 232 +++++ pcireg/uefi/crt_x86_64.c | 235 +++++ pcireg/uefi/dirent.c | 76 ++ pcireg/uefi/elf_aarch64_efi.lds | 63 ++ pcireg/uefi/elf_x86_64_efi.lds | 76 ++ pcireg/uefi/qsort.c | 154 ++++ pcireg/uefi/stat.c | 68 ++ pcireg/uefi/stdio.c | 762 +++++++++++++++++ pcireg/uefi/stdlib.c | 330 +++++++ pcireg/uefi/string.c | 258 ++++++ pcireg/uefi/time.c | 145 ++++ pcireg/uefi/uefi.h | 1420 +++++++++++++++++++++++++++++++ pcireg/uefi/unistd.c | 55 ++ 46 files changed, 5113 insertions(+), 773 deletions(-) create mode 100644 acpi/ACPI.EXE create mode 100644 acpi/Makefile create mode 100644 acpi/README.md create mode 100644 acpi/acpi.c create mode 100644 clib/README.md create mode 100644 clib/clib.c create mode 100644 clib/clib.h create mode 100644 clib/uefi.mk create mode 100644 clib/watcom.mk create mode 100644 cp437/Makefile delete mode 100644 cp437/build.bat delete mode 100644 cp437/build.sh delete mode 100644 lib/build_watcom_dos.bat delete mode 100644 lib/build_watcom_dos.sh delete mode 100644 lib/build_watcom_host.bat delete mode 100644 lib/build_watcom_host.sh delete mode 100644 lib/wlib.c delete mode 100644 lib/wlib.h create mode 100644 pcireg/Makefile create mode 100644 pcireg/Makefile.uefi create mode 100644 pcireg/PCIREG.EFI delete mode 100644 pcireg/build.bat delete mode 100644 pcireg/build.sh create mode 100644 pcireg/uefi/Makefile create mode 100644 pcireg/uefi/crt_aarch64.c create mode 100644 pcireg/uefi/crt_x86_64.c create mode 100644 pcireg/uefi/dirent.c create mode 100644 pcireg/uefi/elf_aarch64_efi.lds create mode 100644 pcireg/uefi/elf_x86_64_efi.lds create mode 100644 pcireg/uefi/qsort.c create mode 100644 pcireg/uefi/stat.c create mode 100644 pcireg/uefi/stdio.c create mode 100644 pcireg/uefi/stdlib.c create mode 100644 pcireg/uefi/string.c create mode 100644 pcireg/uefi/time.c create mode 100644 pcireg/uefi/uefi.h create mode 100644 pcireg/uefi/unistd.c diff --git a/.gitignore b/.gitignore index 9003691..c384f87 100644 --- a/.gitignore +++ b/.gitignore @@ -1,8 +1,6 @@ -# cp437 tool -cp437/cp437 -cp437/cp437.exe -cp437.tmp -*_cp437 +# GNU C +*.a +*.o # Watcom C *.err @@ -11,3 +9,13 @@ cp437.tmp # Python __pycache__ *.pyc + + +# cp437 tool +cp437/cp437 +cp437/cp437.exe +*_cp437 + +# UEFI +NvVars +pci?????.bin diff --git a/acpi/ACPI.EXE b/acpi/ACPI.EXE new file mode 100644 index 0000000000000000000000000000000000000000..f7afbce7e92f6349e151d28e10f54a1597933fe2 GIT binary patch literal 22960 zcmdtKdwdk-)dxPiJG(P`$!4>g-CPJ^QH&yDH-bRShKq!a7Yq?3P{dHnMd+(QlbOW! zjbV9LY9>SQ(wp`*Z7H@dwYFkw+W@VEJT?Jwlz`O$7N}62Wg>)&Nl3!Z@B7RqT-5gM z`_J$9`TRDY?94ou^PF>@^PF>@bDr7z7Hu<)XKW11yv*qOZY#qxOh3mkK_>aR9nZV* z{|h_ANDhXHPiGjXZLD>unt5Bh^b9`3k4#y!mr-A_Eu43M`F!agu`YA{?)rlvUFxjg zCmr5CosmeWQ*~G+Qr3JOQ>MOdi@nK4Pei4o(S6gU!=IML-eIM4pO!Tjq4I~Qv^AIG zt`T?U#z>;9S-=y=p_5*nX#O@HDk+5K<2KdBz2=Z3iG#Qi z7&J(DdboZpNEoUeB0-=~4H7^>CZpbFrJP@2u-=w`p!rr-oo>r-+0I0F^tqm0vHQ43 z-o4@s?pJ&&?^&^1^*kH9sEf`bT^DW5Aya&osV$OVG7Rm&P8iTcQ3sHHw~ zX}g=rKO&b8hEA%wd23WSlD~JSg+W1ni#o+3wMp&U&CKPJJd4!2KJlHXIHt(=O>tDS zg(;)-t_HokSTJP=x<&@ocP?r3<8L$T_4yug^!om#-xEjBrVXWu(5Lq||2JAcJJed* zqjjv;ZE51o>-(pN#4%Sj+lOY~pv`ug7{HbGs9#Csx5WPoV9`EzeScX<%)F}o0NUR{ z+vgwA-Zd!frxXr=AQlAmgThD5QX3`5cm{zB%6|DICGhL z#$tflfwqx;E!O-X%8sDS+-zbnH%sD8m&%$QjQV}c!gEa*T{}WV3fpZhsv7M8MO@cmuI+4dS7*OQe?25WtjG2GlLl_tQdS^sa)4* zI@VwfhbsASK@EFLNV{pcXa^3R@RI$ z<_(Y0X8Sv5X|tW+m>tKtW)Gu|vizEgVu;Z`SXxKUTl*57GLMUb7rHULVox`^Ip5M30^rtglEwhX7Sf z70;-DF)bWca#$sM##llprMC6&47x&}hV)Pm1WVnlOQc`wlsc|ne$u(F`qqJZI_VWj zNdNgcNaim>TJYtNK9yPrr2X3K1{D*BsYoJ#nXF%}17kJ&%R28EyrKmRDAHT;>vV%M zjrm_GYfpR$WepLVbnf&3C9Ks9TL32g^mCxTgtXc(10_>XX9l$28I&zzhUVwmYDd$YH*(DuBw#

Pp)Hpc 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 Pbw2%ejie=)Q1br(4P`|m literal 0 HcmV?d00001 diff --git a/acpi/Makefile b/acpi/Makefile new file mode 100644 index 0000000..8364e87 --- /dev/null +++ b/acpi/Makefile @@ -0,0 +1,22 @@ +# +# 86Box A hypervisor and IBM PC system emulator that specializes in +# running old operating systems and software designed for IBM +# PC systems and compatibles from 1981 through fairly recent +# system designs based on the PCI bus. +# +# This file is part of the 86Box Probing Tools distribution. +# +# Makefile for compiling C-based tools with Watcom. +# +# +# +# Authors: RichardG, +# +# Copyright 2021 RichardG. +# + +SYSTEM = DOS +OBJS = acpi.obj clib.obj +DEST = ACPI.EXE + +!include ../clib/watcom.mk diff --git a/acpi/README.md b/acpi/README.md new file mode 100644 index 0000000..be05404 --- /dev/null +++ b/acpi/README.md @@ -0,0 +1,12 @@ +acpi +==== +DOS tool for probing ACPI behavior in some chipsets. + +Usage +----- +Run `ACPI` on a system with Intel PIIX4 or VIA ACPI. Follow any on-screen prompts. + +Building +-------- +* **Windows:** Run `wmake` from an OpenWatcom "Build Environment" command prompt. +* **Linux:** Run `wmake` with OpenWatcom tools present in `$PATH`. diff --git a/acpi/acpi.c b/acpi/acpi.c new file mode 100644 index 0000000..8169b18 --- /dev/null +++ b/acpi/acpi.c @@ -0,0 +1,139 @@ +/* + * 86Box A hypervisor and IBM PC system emulator that specializes in + * running old operating systems and software designed for IBM + * PC systems and compatibles from 1981 through fairly recent + * system designs based on the PCI bus. + * + * This file is part of the 86Box Probing Tools distribution. + * + * ACPI probing tool. + * + * + * + * Authors: RichardG, + * + * Copyright 2021 RichardG. + * + * ┌──────────────────────────────────────────────────────────────┐ + * │ This file is UTF-8 encoded. If this text is surrounded by │ + * │ garbage, please tell your editor to open this file as UTF-8. │ + * └──────────────────────────────────────────────────────────────┘ + */ +#include +#include +#include "clib.h" + + +char dummy_buf[256]; + + +void +probe_intel(uint8_t dev, uint8_t func) +{ + uint16_t acpi_base; + int type; + + acpi_base = pci_readw(0, dev, func, 0x40); + printf("ACPI base register = %04X\n", acpi_base); + acpi_base &= 0xff80; + + printf("PMCNTRL 04=%04X 40=%04X\n", inw(acpi_base | 0x04), inw(acpi_base | 0x40)); + + printf("Enter hex sleep type to try: "); + scanf("%x%*c", &type); + + printf("Press ENTER to try sleep %02X through 40...", type); + gets(dummy_buf); + outw(acpi_base | 0x40, 0x2000 | (type << 10)); + + printf("Nothing?\nPress ENTER to try sleep %02X through 04...", type); + gets(dummy_buf); + outw(acpi_base | 0x04, 0x2000 | (type << 10)); + printf("Nothing still?\n"); +} + + +void +probe_via(uint8_t dev, uint8_t func, uint8_t is586) +{ + uint16_t acpi_base; + int type; + + acpi_base = pci_readw(0, dev, func, is586 ? 0x20 : 0x48); + printf("ACPI base register = %04X\n", acpi_base); + acpi_base &= 0xff00; + + printf("PMCNTRL 04=%04X F0=%04X\n", inw(acpi_base | 0x04), inw(acpi_base | 0xf0)); + + printf("Enter hex sleep type to try: "); + scanf("%x%*c", &type); + + printf("Press ENTER to try sleep %02X through F0...", type); + gets(dummy_buf); + outw(acpi_base | 0xf0, 0x2000 | (type << 10)); + + printf("Nothing?\nPress ENTER to try sleep %02X through 04...", type); + gets(dummy_buf); + outw(acpi_base | 0x04, 0x2000 | (type << 10)); + printf("Nothing still?\n"); +} + + +int +main(int argc, char **argv) +{ + uint8_t dev, func; + uint16_t ven_id, dev_id; + uint32_t cf8; + +#ifdef __WATCOMC__ + /* Disable stdout buffering. */ + setbuf(stdout, NULL); +#endif + +#ifndef DEBUG + /* Test for PCI presence. */ + outl(0xcf8, 0x80000000); + cf8 = inl(0xcf8); + if (cf8 == 0xffffffff) { + printf("Port CF8h is not responding. Does this system even have PCI?\n"); + return 1; + } +#endif + + for (dev = 0; dev < 32; dev++) { + if (!(pci_readb(0, dev, 0, 0x0e) & 0x80)) + continue; + + ven_id = pci_readw(0, dev, 3, 0); + dev_id = pci_readw(0, dev, 3, 2); + if ((ven_id == 0x8086) && (dev_id == 0x7113)) { + printf("Found PIIX4 ACPI at device %02X function %d\n", dev, 3); + probe_intel(dev, 3); + return 0; + } else if ((ven_id == 0x1055) && (dev_id == 0x9463)) { + printf("Found SLC90E66 ACPI at device %02X function %d\n", dev, 3); + probe_intel(dev, 3); + return 0; + } else if ((ven_id == 0x1106) && (dev_id == 0x3040)) { + printf("Found VT82C586 ACPI at device %02X function %d\n", dev, 3); + probe_via(dev, 3, 1); + return 0; + } else if ((ven_id == 0x1106) && (dev_id == 0x3050)) { + printf("Found VT82C596 ACPI at device %02X function %d\n", dev, 3); + probe_via(dev, 3, 0); + return 0; + } else { + ven_id = pci_readw(0, dev, 4, 0); + dev_id = pci_readw(0, dev, 4, 2); + if ((ven_id == 0x1106) && (dev_id == 0x3057)) { + printf("Found VT82C686 ACPI at device %02X function %d\n", dev, 4); + probe_via(dev, 4, 0); + return 0; + } + } + } + + printf("No interesting ACPI device found\n"); + return 1; +} diff --git a/clib/README.md b/clib/README.md new file mode 100644 index 0000000..e77b5e7 --- /dev/null +++ b/clib/README.md @@ -0,0 +1,3 @@ +clib +==== +Not a probing tool. Common library for C-based tools. diff --git a/clib/clib.c b/clib/clib.c new file mode 100644 index 0000000..8bcacb3 --- /dev/null +++ b/clib/clib.c @@ -0,0 +1,405 @@ +/* + * 86Box A hypervisor and IBM PC system emulator that specializes in + * running old operating systems and software designed for IBM + * PC systems and compatibles from 1981 through fairly recent + * system designs based on the PCI bus. + * + * This file is part of the 86Box Probing Tools distribution. + * + * Common library for C-based tools. + * + * + * + * Authors: RichardG, + * + * Copyright 2021 RichardG. + * + */ +#ifdef __POSIX_UEFI__ +# include +#else +# include +# include +# include +# include +# ifdef __WATCOMC__ +# include +# include +# endif +#endif +#include "clib.h" + + +#ifdef __WATCOMC__ +static union REGPACK rp; /* things break if this is not a global variable... */ +#endif + + +/* String functions. */ +int +parse_hex_u8(char *val, uint8_t *dest) +{ + uint32_t dest32; + int ret = parse_hex_u32(val, &dest32); + *dest = dest32; + return ret; +} + + +int +parse_hex_u16(char *val, uint16_t *dest) +{ + uint32_t dest32; + int ret = parse_hex_u32(val, &dest32); + *dest = dest32; + return ret; +} + + +int +parse_hex_u32(char *val, uint32_t *dest) +{ + int i, len = strlen(val); + uint8_t digit; + + *dest = 0; + for (i = 0; i < len; i++) { + if ((val[i] >= 0x30) && (val[i] <= 0x39)) + digit = val[i] - 0x30; + else if ((val[i] >= 0x41) && (val[i] <= 0x46)) + digit = val[i] - 0x37; + else if ((val[i] >= 0x61) && (val[i] <= 0x66)) + digit = val[i] - 0x57; + else + return 0; + *dest = (*dest << 4) | digit; + } + + return 1; +} + + +/* Comparator functions. */ +int +comp_ui8(const void *elem1, const void *elem2) +{ + uint8_t a = *((uint8_t *) elem1); + uint8_t b = *((uint8_t *) elem2); + return ((a < b) ? -1 : ((a > b) ? 1 : 0)); +} + + +/* System functions. */ +#ifdef __WATCOMC__ +/* Defined in header. */ +#elif defined(__GNUC__) +void +cli() +{ + __asm__("cli"); +} + + +void +sti() +{ + __asm__("sti"); +} +#else +void +cli() +{ +} + + +void +sti() +{ +} +#endif + + +/* Terminal functions. */ +#ifdef __WATCOMC__ +int +term_get_size_x() +{ + struct videoconfig vc; + _getvideoconfig(&vc); + return vc.numtextcols; +} + + +int +term_get_size_y() +{ + struct videoconfig vc; + _getvideoconfig(&vc); + return vc.numtextrows; +} + + +int +term_get_cursor_pos(uint8_t *x, uint8_t *y) +{ + rp.h.ah = 0x03; + rp.h.bh = 0x00; + intr(0x10, &rp); + *x = rp.h.dl; + *y = rp.h.dh; + return 1; +} + + +int +term_set_cursor_pos(uint8_t x, uint8_t y) +{ + rp.h.ah = 0x02; + rp.h.dl = x; + rp.h.dh = y; + intr(0x10, &rp); + return 1; +} + + +void +term_finallinebreak() +{ + /* DOS already outputs a final line break. */ +} +#else +int +term_get_size_x() +{ + return 80; +} + + +int +term_get_size_y() +{ + return 25; +} + + +int +term_get_cursor_pos(uint8_t *x, uint8_t *y) +{ + return 0; +} + + +int +term_set_cursor_pos(uint8_t x, uint8_t y) +{ + return 0; +} + + +void +term_finallinebreak() +{ + printf("\n"); +} +#endif + + +/* Port I/O functions. */ +#ifdef __WATCOMC__ +/* Defined in header. */ +#elif defined(__GNUC__) +uint8_t +inb(uint16_t port) +{ + uint8_t ret; + __asm__ __volatile__("inb %1, %0" : "=a" (ret) : "Nd" (port)); + return ret; +} + + +void +outb(uint16_t port, uint8_t val) +{ + __asm__ __volatile__("outb %0, %1" : : "a" (val), "Nd" (port)); +} + + +uint16_t +inw(uint16_t port) +{ + uint16_t ret; + __asm__ __volatile__("inw %1, %0" : "=a" (ret) : "Nd" (port)); + return ret; +} + + +void +outw(uint16_t port, uint16_t val) +{ + __asm__ __volatile__("outw %0, %1" : : "a" (val), "Nd" (port)); +} + + +uint32_t +inl(uint16_t port) +{ + uint32_t ret; + __asm__ __volatile__("inl %1, %0" : "=a" (ret) : "Nd" (port)); + return ret; +} + + +void +outl(uint16_t port, uint32_t val) +{ + __asm__ __volatile__("outl %0, %1" : : "a" (val), "Nd" (port)); +} +#else +uint8_t +inb(uint16_t port) +{ + return 0xff; +} + + +void +outb(uint16_t port, uint8_t val) +{ +} + + +uint16_t +inw(uint16_t port) +{ + return 0xffff; +} + + +void +outw(uint16_t port, uint16_t val) +{ +} + + +uint32_t +inl(uint16_t port) +{ + return 0xffffffff; +} + + +void +outl(uint16_t port, uint32_t val) +{ +} +#endif + + +/* PCI I/O functions. */ +uint32_t +pci_cf8(uint8_t bus, uint8_t dev, uint8_t func, uint8_t reg) +{ + /* Generate a PCI port CF8h dword. */ + multi_t ret; + ret.u8[3] = 0x80; + ret.u8[2] = bus; + ret.u8[1] = dev << 3; + ret.u8[1] |= func & 7; + ret.u8[0] = reg & 0xfc; + return ret.u32; +} + + +uint8_t +pci_readb(uint8_t bus, uint8_t dev, uint8_t func, uint8_t reg) +{ + uint8_t ret; + uint16_t data_port = 0xcfc | (reg & 0x03); + uint32_t cf8 = pci_cf8(bus, dev, func, reg); + cli(); + outl(0xcf8, cf8); + ret = inb(data_port); + sti(); + return ret; +} + + +uint16_t +pci_readw(uint8_t bus, uint8_t dev, uint8_t func, uint8_t reg) +{ + uint16_t ret, data_port = 0xcfc | (reg & 0x02); + uint32_t cf8 = pci_cf8(bus, dev, func, reg); + cli(); + outl(0xcf8, cf8); + ret = inw(data_port); + sti(); + return ret; +} + + +uint32_t +pci_readl(uint8_t bus, uint8_t dev, uint8_t func, uint8_t reg) +{ + uint32_t ret, cf8 = pci_cf8(bus, dev, func, reg); + cli(); + outl(0xcf8, cf8); + ret = inl(0xcfc); + sti(); + return ret; +} + + +void +pci_writeb(uint8_t bus, uint8_t dev, uint8_t func, uint8_t reg, uint8_t val) +{ + uint16_t data_port = 0xcfc | (reg & 0x03); + uint32_t cf8 = pci_cf8(bus, dev, func, reg); + cli(); + outl(0xcf8, cf8); + outb(data_port, val); + sti(); +} + + +void +pci_writew(uint8_t bus, uint8_t dev, uint8_t func, uint8_t reg, uint16_t val) +{ + uint16_t data_port = 0xcfc | (reg & 0x02); + uint32_t cf8 = pci_cf8(bus, dev, func, reg); + cli(); + outl(0xcf8, cf8); + outw(data_port, val); + sti(); +} + + +void +pci_writel(uint8_t bus, uint8_t dev, uint8_t func, uint8_t reg, uint32_t val) +{ + uint32_t cf8 = pci_cf8(bus, dev, func, reg); + cli(); + outl(0xcf8, cf8); + outl(0xcfc, val); + sti(); +} + + +/* File I/O functions. */ +void +fseek_to(FILE *f, long offset) +{ + fseek(f, offset, SEEK_SET); + +#ifdef __POSIX_UEFI__ + /* Work around broken fseek implementation. */ + long pos = ftell(f); + if (pos == offset) + return; + + uint8_t dummy[512]; + while (pos < offset) { + fread(&dummy, MIN(sizeof(dummy), offset - pos), 1, f); + pos = ftell(f); + } +#endif +} diff --git a/clib/clib.h b/clib/clib.h new file mode 100644 index 0000000..2d39a7f --- /dev/null +++ b/clib/clib.h @@ -0,0 +1,125 @@ +/* + * 86Box A hypervisor and IBM PC system emulator that specializes in + * running old operating systems and software designed for IBM + * PC systems and compatibles from 1981 through fairly recent + * system designs based on the PCI bus. + * + * This file is part of the 86Box Probing Tools distribution. + * + * Definitions for the common library for C-based tools. + * + * + * + * Authors: RichardG, + * + * Copyright 2021 RichardG. + * + */ +#ifndef WLIB_H +# define WLIB_H + +/* Common macros. */ +#define MIN(a, b) ((a) < (b) ? (a) : (b)) +#define MAX(a, b) ((a) > (b) ? (a) : (b)) +#define ABS(x) ((x) > 0 ? (x) : -(x)) + +/* Compiler compatibility macros. */ +#ifdef __GNUC__ +# define PACKED __attribute__((packed)) +#else +# define PACKED +#endif + + +#pragma pack(push, 0) +/* Convenience type for breaking a dword value down into words and bytes. */ +typedef union { + uint8_t u8[4]; + uint16_t u16[2]; + uint32_t u32; +} multi_t; +#pragma pack(pop) + + +/* String functions. */ +extern int parse_hex_u8(char *val, uint8_t *dest); +extern int parse_hex_u16(char *val, uint16_t *dest); +extern int parse_hex_u32(char *val, uint32_t *dest); + +/* Comparator functions. */ +extern int comp_ui8(const void *elem1, const void *elem2); + +/* System functions. */ +#ifdef __WATCOMC__ +void cli(); +# pragma aux cli = "cli"; +void sti(); +# pragma aux sti = "sti"; +#else +extern void cli(); +extern void sti(); +#endif + +/* Terminal functions. */ +extern int term_get_size_x(); +extern int term_get_size_y(); +extern int term_get_cursor_pos(uint8_t *x, uint8_t *y); +extern int term_set_cursor_pos(uint8_t x, uint8_t y); +extern void term_finallinebreak(); + +/* Port I/O functions. */ +#ifdef __WATCOMC__ +uint8_t inb(uint16_t port); +# pragma aux inb = "in al, dx" parm [dx] value [al]; +void outb(uint16_t port, uint8_t data); +# pragma aux outb = "out dx, al" parm [dx] [al]; +uint16_t inw(uint16_t port); +# pragma aux inw = "in ax, dx" parm [dx] value [ax]; +void outw(uint16_t port, uint16_t data); +# pragma aux outw = "out dx, ax" parm [dx] [ax]; +# ifdef M_I386 +uint32_t inl(uint16_t port); +# pragma aux inl = "in eax, dx" parm [dx] value [eax]; +void outl(uint16_t port, uint32_t data); +# pragma aux outl = "out dx, eax" parm [dx] [eax]; +# else +/* Some manual prefixing trickery to perform 32-bit I/O and access + the extended part of EAX in real mode. Exchanging is necessary + due to Watcom ignoring the order registers are specified in... */ +uint32_t inl(uint16_t port); +# pragma aux inl = "db 0x66" "in ax, dx" /* in eax, dx */ \ + "mov cx, ax" \ + "db 0x66, 0xc1, 0xe8, 0x10" /* shr eax, 16 */ \ + "xchg ax, cx" \ + parm [dx] \ + value [ax cx]; +void outl(uint16_t port, uint32_t data); +# pragma aux outl = "xchg ax, cx" \ + "db 0x66, 0xc1, 0xe0, 0x10" /* shl eax, 16 */ \ + "mov ax, cx" \ + "db 0x66" "out dx, ax" /* out dx, eax */ \ + parm [dx] [ax cx] \ + modify [ax cx]; +# endif +#else +extern uint8_t inb(uint16_t port); +extern void outb(uint16_t port, uint8_t data); +extern uint16_t inw(uint16_t port); +extern void outw(uint16_t port, uint16_t data); +extern uint32_t inl(uint16_t port); +extern void outl(uint16_t port, uint32_t data); +#endif + +/* PCI I/O functions. */ +extern uint32_t pci_cf8(uint8_t bus, uint8_t dev, uint8_t func, uint8_t reg); +extern uint8_t pci_readb(uint8_t bus, uint8_t dev, uint8_t func, uint8_t reg); +extern uint16_t pci_readw(uint8_t bus, uint8_t dev, uint8_t func, uint8_t reg); +extern uint32_t pci_readl(uint8_t bus, uint8_t dev, uint8_t func, uint8_t reg); +extern void pci_writeb(uint8_t bus, uint8_t dev, uint8_t func, uint8_t reg, uint8_t val); +extern void pci_writew(uint8_t bus, uint8_t dev, uint8_t func, uint8_t reg, uint16_t val); +extern void pci_writel(uint8_t bus, uint8_t dev, uint8_t func, uint8_t reg, uint32_t val); + +/* File I/O functions. */ +extern void fseek_to(FILE *f, long offset); + +#endif diff --git a/clib/uefi.mk b/clib/uefi.mk new file mode 100644 index 0000000..1ccb012 --- /dev/null +++ b/clib/uefi.mk @@ -0,0 +1,25 @@ +# +# 86Box A hypervisor and IBM PC system emulator that specializes in +# running old operating systems and software designed for IBM +# PC systems and compatibles from 1981 through fairly recent +# system designs based on the PCI bus. +# +# This file is part of the 86Box Probing Tools distribution. +# +# Base makefile for compiling C-based tools with POSIX-UEFI. +# +# +# +# Authors: RichardG, +# +# Copyright 2021 RichardG. +# + +VPATH = . ../clib + +export TARGET = $(DEST) +export SRCS = $(OBJS:.o=.c) +export CFLAGS = -mno-sse -D__POSIX_UEFI__ -I../clib +export USE_GCC = 1 + +include uefi/Makefile diff --git a/clib/watcom.mk b/clib/watcom.mk new file mode 100644 index 0000000..03774ed --- /dev/null +++ b/clib/watcom.mk @@ -0,0 +1,88 @@ +# +# 86Box A hypervisor and IBM PC system emulator that specializes in +# running old operating systems and software designed for IBM +# PC systems and compatibles from 1981 through fairly recent +# system designs based on the PCI bus. +# +# This file is part of the 86Box Probing Tools distribution. +# +# Base makefile for compiling C-based tools with Watcom. +# +# +# +# Authors: RichardG, +# +# Copyright 2021 RichardG. +# + +# Establish host-specific stuff. +!ifdef __UNIX__ +DEL = rm -f +CP437 = cp437 +SLASH = / +!else +DEL = del +CP437 = cp437.exe +SLASH = \ +!if "$(SYSTEM)" == "HOST" +# Build a Windows NT character-mode executable on Windows, +# as that is not the default target (Win16 is). +SYSTEM = NT +DEST = $(DEST).exe +!endif +!endif + +# Establish target information. +!if "$(SYSTEM)" == "DOS" +CC = wcc +CP437_CONV = y +!else +CC = wcc386 +CP437_CONV = n +!endif +LINK = wlink + +# Establish target C flags. +CFLAGS = -i=..$(SLASH)clib $(CFLAGS) +!if "$(SYSTEM)" != "HOST" +CFLAGS = -bt=$(SYSTEM) $(CFLAGS) +!endif + + +# Include clib. +.c: ../clib + +# Compile source file into object file. +.c.obj +!if "$(CP437_CONV)" == "y" + @..$(SLASH)cp437$(SLASH)$(CP437) $< + $(CC) -bt=$(SYSTEM) $(CFLAGS) $<_cp437 + @$(DEL) $<_cp437 +!else + $(CC) $(CFLAGS) $< +!endif + +# Default target, which must be the first! +all: ..$(SLASH)cp437$(SLASH)$(CP437) $(DEST) + +# cp437 host tool compilation target. +# Only valid if cp437 conversion is needed. +..$(SLASH)cp437$(SLASH)$(CP437): +!if "$(CP437_CONV)" == "y" + cd ..$(SLASH)cp437 & wmake $(CP437) +!endif + +# Main target. +$(DEST): $(OBJS) + %write $@.lnk NAME $@ +!if "$(SYSTEM)" != "HOST" + %write $@.lnk SYSTEM $(SYSTEM) +!endif + %write $@.lnk FILE {$(OBJS)} + $(LINK) $(LDFLAGS) @$@.lnk + $(DEL) $@.lnk + +clean: .symbolic + $(DEL) $(OBJS) + $(DEL) $(DEST) + $(DEL) *.err diff --git a/cp437/Makefile b/cp437/Makefile new file mode 100644 index 0000000..af51541 --- /dev/null +++ b/cp437/Makefile @@ -0,0 +1,22 @@ +# +# 86Box A hypervisor and IBM PC system emulator that specializes in +# running old operating systems and software designed for IBM +# PC systems and compatibles from 1981 through fairly recent +# system designs based on the PCI bus. +# +# This file is part of the 86Box Probing Tools distribution. +# +# Makefile for compiling C-based tools with Watcom. +# +# +# +# Authors: RichardG, +# +# Copyright 2021 RichardG. +# + +SYSTEM = HOST +OBJS = cp437.obj +DEST = cp437 + +!include ../clib/watcom.mk diff --git a/cp437/README.md b/cp437/README.md index f60da94..b2534f8 100644 --- a/cp437/README.md +++ b/cp437/README.md @@ -14,5 +14,5 @@ Building -------- This tool is automatically built as needed by the build scripts for other tools. Alternatively: -* **Windows:** Run `build.bat` from an OpenWatcom "Build Environment" command prompt. -* **Linux:** Run `./build.sh` with OpenWatcom tools present in `$PATH`. +* **Windows:** Run `wmake` from an OpenWatcom "Build Environment" command prompt. +* **Linux:** Run `wmake` with OpenWatcom tools present in `$PATH`. diff --git a/cp437/build.bat b/cp437/build.bat deleted file mode 100644 index 1f25ab4..0000000 --- a/cp437/build.bat +++ /dev/null @@ -1,2 +0,0 @@ -@echo off -..\lib\build_watcom_host.bat cp437.c diff --git a/cp437/build.sh b/cp437/build.sh deleted file mode 100644 index 58850a2..0000000 --- a/cp437/build.sh +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/sh -exec ../lib/build_watcom_host.sh cp437.c diff --git a/cp437/cp437.c b/cp437/cp437.c index 31e7823..c1cf91b 100644 --- a/cp437/cp437.c +++ b/cp437/cp437.c @@ -56,7 +56,7 @@ main(int argc, char **argv) if (argc < 2) { printf("Usage:\n"); printf("\n"); - printf("cp437 infile [infile...]\n"); + printf("%s infile [infile...]\n", argv[0]); printf("- Converts UTF-8 input file(s) to CP437 output file(s) with .cp437 appended.\n"); printf(" The new file names are also printed to stdout.\n"); return 1; diff --git a/lib/build_watcom_dos.bat b/lib/build_watcom_dos.bat deleted file mode 100644 index 0b6e5dd..0000000 --- a/lib/build_watcom_dos.bat +++ /dev/null @@ -1,61 +0,0 @@ -@echo off -:: -:: 86Box A hypervisor and IBM PC system emulator that specializes in -:: running old operating systems and software designed for IBM -:: PC systems and compatibles from 1981 through fairly recent -:: system designs based on the PCI bus. -:: -:: This file is part of the 86Box Probing Tools distribution. -:: -:: Universal Windows build script for Watcom C-based DOS tools. -:: -:: -:: -:: Authors: RichardG, -:: -:: Copyright 2021 RichardG. -:: - -:: Check for Watcom environment. -if "x%WATCOM%" == "x" ( - echo *** WATCOM environment variable not set. Make sure you're on an OpenWatcom - echo "Build Environment" command prompt. - exit /b 1 -) - -:: Check for cp437 tool and build it if necessary. -if not exist ..\cp437\cp437.exe ( - echo *** Building cp437 conversion tool for your host system... - pushd ..\cp437 - call build.bat - popd - if errorlevel 1 exit /b %errorlevel% -) - -:: Convert source file to CP437. -echo *** Converting source to CP437... -..\cp437\cp437.exe %* > cp437.tmp -if errorlevel 1 ( - echo *** Conversion failed. - exit /b 2 -) - -:: Generate output file name. -set srcfile=%1 -set destfile=%srcfile:~0,-2%.exe -setlocal enabledelayedexpansion -for %%i in (A B C D E F G H I J K L M N O P Q R S T U V W X Y Z) do set "destfile=!destfile:%%i=%%i!" - -:: Call compiler. -echo *** Building... -set srcfiles= -for /f "delims=" %%i in (cp437.tmp) do set srcfiles=!srcfiles! %%i -wcl -bcl=dos -i=..\lib -fe="!destfile!" %srcfiles% - -:: Check for success. -if errorlevel 1 ( - echo *** Build failed. - exit /b 3 -) else ( - echo *** Build successful. -) diff --git a/lib/build_watcom_dos.sh b/lib/build_watcom_dos.sh deleted file mode 100644 index b2391d4..0000000 --- a/lib/build_watcom_dos.sh +++ /dev/null @@ -1,56 +0,0 @@ -#!/bin/sh -# -# 86Box A hypervisor and IBM PC system emulator that specializes in -# running old operating systems and software designed for IBM -# PC systems and compatibles from 1981 through fairly recent -# system designs based on the PCI bus. -# -# This file is part of the 86Box Probing Tools distribution. -# -# Universal *nix build script for Watcom C-based DOS tools. -# -# -# -# Authors: RichardG, -# -# Copyright 2021 RichardG. -# - -# Check for Watcom environment. -if ! wcl -v >/dev/null 2>&1 -then - echo '***' Watcom compiler not found. Make sure OpenWatcom is installed and in \$PATH. - exit 1 -fi - -# Check for cp437 tool and build it if necessary. -if [ ! -x ../cp437/cp437 ] -then - echo '***' Building cp437 conversion tool for your host system... - pushd ../cp437 - if ! ./build.sh - then - exit $? - fi - popd -fi - -# Convert source files to CP437. -echo '***' Converting source to CP437... -if ! ../cp437/cp437 "$@" > cp437.tmp -then - echo '***' Conversion failed. - exit 2 -fi - -# Generate output file name. -destfile=$(basename "$1" .c | tr [:lower:] [:upper:]).EXE - -# Call compiler and check for success. -if wcl -bcl=dos -fo="$destfile" $(cat cp437.tmp) -then - echo '***' Build successful. -else - echo '***' Build failed. - exit 3 -fi diff --git a/lib/build_watcom_host.bat b/lib/build_watcom_host.bat deleted file mode 100644 index 05f67c7..0000000 --- a/lib/build_watcom_host.bat +++ /dev/null @@ -1,40 +0,0 @@ -@echo off -:: -:: 86Box A hypervisor and IBM PC system emulator that specializes in -:: running old operating systems and software designed for IBM -:: PC systems and compatibles from 1981 through fairly recent -:: system designs based on the PCI bus. -:: -:: This file is part of the 86Box Probing Tools distribution. -:: -:: Universal Windows build script for Watcom C-based host tools. -:: -:: -:: -:: Authors: RichardG, -:: -:: Copyright 2021 RichardG. -:: - -:: Check for Watcom environment. -if "x%WATCOM%" == "x" ( - echo *** WATCOM environment variable not set. Make sure you're on an OpenWatcom - echo "Build Environment" command prompt. - exit /b 1 -) - -:: Generate output file name. -set srcfile=%1 -set destfile=%srcfile:~0,-2%.exe - -:: Call compiler. -echo *** Building... -wcl386 -bcl=nt -fo="%destfile%" %* - -:: Check for success. -if errorlevel 1 ( - echo *** Build failed. - exit /b 4 -) else ( - echo *** Build successful. -) diff --git a/lib/build_watcom_host.sh b/lib/build_watcom_host.sh deleted file mode 100644 index f47a586..0000000 --- a/lib/build_watcom_host.sh +++ /dev/null @@ -1,36 +0,0 @@ -#!/bin/sh -# -# 86Box A hypervisor and IBM PC system emulator that specializes in -# running old operating systems and software designed for IBM -# PC systems and compatibles from 1981 through fairly recent -# system designs based on the PCI bus. -# -# This file is part of the 86Box Probing Tools distribution. -# -# Universal *nix build script for Watcom C-based host tools. -# -# -# -# Authors: RichardG, -# -# Copyright 2021 RichardG. -# - -if ! wcl386 -v >/dev/null 2>&1 -then - echo '***' Watcom compiler not found. Make sure OpenWatcom is installed and in \$PATH. - exit 1 -fi - -# Generate output file name. -destfile=$(basename "$1" .c) - -# Call compiler and check for success. -if wcl386 -bcl=linux -fo="$destfile" "$@" -then - echo '***' Build successful. - chmod +x "$destfile" -else - echo '***' Build failed. - exit 4 -fi diff --git a/lib/wlib.c b/lib/wlib.c deleted file mode 100644 index a890586..0000000 --- a/lib/wlib.c +++ /dev/null @@ -1,116 +0,0 @@ -/* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. - * - * This file is part of the 86Box Probing Tools distribution. - * - * Common functions for Watcom C-based tools. - * - * - * - * Authors: RichardG, - * - * Copyright 2021 RichardG. - * - */ -#include -#include "wlib.h" - - -int -comp_ui8(const void *elem1, const void *elem2) -{ - uint8_t a = *((uint8_t *) elem1); - uint8_t b = *((uint8_t *) elem2); - return ((a < b) ? -1 : ((a > b) ? 1 : 0)); -} - - -uint32_t -pci_cf8(uint8_t bus, uint8_t dev, uint8_t func, uint8_t reg) -{ - /* Generate a PCI port CF8h dword. */ - multi_t ret; - ret.u8[3] = 0x80; - ret.u8[2] = bus; - ret.u8[1] = dev << 3; - ret.u8[1] |= func & 7; - ret.u8[0] = reg & 0xfc; - return ret.u32; -} - - -uint8_t -pci_readb(uint8_t bus, uint8_t dev, uint8_t func, uint8_t reg) -{ - uint8_t ret; - uint16_t data_port = 0xcfc | (reg & 0x03); - uint32_t cf8 = pci_cf8(bus, dev, func, reg); - cli(); - outl(0xcf8, cf8); - ret = inb(data_port); - sti(); - return ret; -} - - -uint16_t -pci_readw(uint8_t bus, uint8_t dev, uint8_t func, uint8_t reg) -{ - uint16_t ret, data_port = 0xcfc | (reg & 0x02); - uint32_t cf8 = pci_cf8(bus, dev, func, reg); - cli(); - outl(0xcf8, cf8); - ret = inw(data_port); - sti(); - return ret; -} - - -uint32_t -pci_readl(uint8_t bus, uint8_t dev, uint8_t func, uint8_t reg) -{ - uint32_t ret, cf8 = pci_cf8(bus, dev, func, reg); - cli(); - outl(0xcf8, cf8); - ret = inl(0xcfc); - sti(); - return ret; -} - - -void -pci_writeb(uint8_t bus, uint8_t dev, uint8_t func, uint8_t reg, uint8_t val) -{ - uint16_t data_port = 0xcfc | (reg & 0x03); - uint32_t cf8 = pci_cf8(bus, dev, func, reg); - cli(); - outl(0xcf8, cf8); - outb(data_port, val); - sti(); -} - - -void -pci_writew(uint8_t bus, uint8_t dev, uint8_t func, uint8_t reg, uint16_t val) -{ - uint16_t data_port = 0xcfc | (reg & 0x02); - uint32_t cf8 = pci_cf8(bus, dev, func, reg); - cli(); - outl(0xcf8, cf8); - outw(data_port, val); - sti(); -} - - -void -pci_writel(uint8_t bus, uint8_t dev, uint8_t func, uint8_t reg, uint32_t val) -{ - uint32_t cf8 = pci_cf8(bus, dev, func, reg); - cli(); - outl(0xcf8, cf8); - outl(0xcfc, val); - sti(); -} diff --git a/lib/wlib.h b/lib/wlib.h deleted file mode 100644 index 02664eb..0000000 --- a/lib/wlib.h +++ /dev/null @@ -1,83 +0,0 @@ -/* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. - * - * This file is part of the 86Box Probing Tools distribution. - * - * Definitions for common functions for Watcom C-based tools. - * - * - * - * Authors: RichardG, - * - * Copyright 2021 RichardG. - * - */ -#ifndef WLIB_H -# define WLIB_H -#include - -#pragma pack(push, 0) -/* Convenience type for breaking a dword value down into words and bytes. */ -typedef union { - uint8_t u8[4]; - uint16_t u16[2]; - uint32_t u32; -} multi_t; -#pragma pack(pop) - - -/* Inline assembly functions. */ -void cli(); -#pragma aux cli = "cli"; -void sti(); -#pragma aux sti = "sti"; - -uint8_t inb(uint16_t port); -#pragma aux inb = "in al, dx" parm [dx] value [al]; -void outb(uint16_t port, uint8_t data); -#pragma aux outb = "out dx, al" parm [dx] [al]; -uint16_t inw(uint16_t port); -#pragma aux inw = "in ax, dx" parm [dx] value [ax]; -void outw(uint16_t port, uint16_t data); -#pragma aux outw = "out dx, ax" parm [dx] [ax]; -#ifdef M_I386 -uint32_t inl(uint16_t port); -# pragma aux inl = "in eax, dx" parm [dx] value [eax]; -void outl(uint16_t port, uint32_t data); -# pragma aux outl = "out dx, eax" parm [dx] [eax]; -#else -/* Some manual prefixing trickery to perform 32-bit I/O and access - the extended part of EAX in real mode. Exchanging is necessary - due to Watcom ignoring the order registers are specified in... */ -uint32_t inl(uint16_t port); -# pragma aux inl = "db 0x66" "in ax, dx" /* in eax, dx */ \ - "mov cx, ax" \ - "db 0x66, 0xc1, 0xe8, 0x10" /* shr eax, 16 */ \ - "xchg ax, cx" \ - parm [dx] \ - value [ax cx]; -void outl(uint16_t port, uint32_t data); -# pragma aux outl = "xchg ax, cx" \ - "db 0x66, 0xc1, 0xe0, 0x10" /* shl eax, 16 */ \ - "mov ax, cx" \ - "db 0x66" "out dx, ax" /* out dx, eax */ \ - parm [dx] [ax cx] \ - modify [ax cx]; -#endif - -/* Comparator functions. */ -extern int comp_ui8(const void *elem1, const void *elem2); - -/* PCI I/O functions. */ -extern uint32_t pci_cf8(uint8_t bus, uint8_t dev, uint8_t func, uint8_t reg); -extern uint8_t pci_readb(uint8_t bus, uint8_t dev, uint8_t func, uint8_t reg); -extern uint16_t pci_readw(uint8_t bus, uint8_t dev, uint8_t func, uint8_t reg); -extern uint32_t pci_readl(uint8_t bus, uint8_t dev, uint8_t func, uint8_t reg); -extern void pci_writeb(uint8_t bus, uint8_t dev, uint8_t func, uint8_t reg, uint8_t val); -extern void pci_writew(uint8_t bus, uint8_t dev, uint8_t func, uint8_t reg, uint16_t val); -extern void pci_writel(uint8_t bus, uint8_t dev, uint8_t func, uint8_t reg, uint32_t val); - -#endif diff --git a/pcireg/Makefile b/pcireg/Makefile new file mode 100644 index 0000000..eb8a549 --- /dev/null +++ b/pcireg/Makefile @@ -0,0 +1,22 @@ +# +# 86Box A hypervisor and IBM PC system emulator that specializes in +# running old operating systems and software designed for IBM +# PC systems and compatibles from 1981 through fairly recent +# system designs based on the PCI bus. +# +# This file is part of the 86Box Probing Tools distribution. +# +# Makefile for compiling C-based tools with Watcom. +# +# +# +# Authors: RichardG, +# +# Copyright 2021 RichardG. +# + +SYSTEM = DOS +OBJS = pcireg.obj clib.obj +DEST = PCIREG.EXE + +!include ../clib/watcom.mk diff --git a/pcireg/Makefile.uefi b/pcireg/Makefile.uefi new file mode 100644 index 0000000..21f3afa --- /dev/null +++ b/pcireg/Makefile.uefi @@ -0,0 +1,21 @@ +# +# 86Box A hypervisor and IBM PC system emulator that specializes in +# running old operating systems and software designed for IBM +# PC systems and compatibles from 1981 through fairly recent +# system designs based on the PCI bus. +# +# This file is part of the 86Box Probing Tools distribution. +# +# Makefile for compiling C-based tools with POSIX-UEFI. +# +# +# +# Authors: RichardG, +# +# Copyright 2021 RichardG. +# + +export OBJS = pcireg.o clib.o +export DEST = PCIREG.EFI + +include ../clib/uefi.mk diff --git a/pcireg/PCIIDS.BIN b/pcireg/PCIIDS.BIN index d7dd2738192bad98f3d3a31b96d3ce133339eb01..efbfbc995cfe87621d551425cbd27e67062a9a70 100644 GIT binary patch delta 355632 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

CHOtu>jnZ#)OHgTyMrURRjn^a(5neT;^od}#@~ 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

u?1fA6iO{HQ{B5LSNai+Dq#O}+24`#*({@; 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 delta 325210 zcmZVH30zd=|M&lE*j>^y!wfr$`;r>shH1v)f{2QU3a+@pxCW+$r5@bT)NlcD$#5$( zEmAWyGcthl=^xOTEGW54h*0p1kj+45eQaKJZg^{!gi=QJ6Z9=AdkK1HFq1)t~5N zwA@n9qSSXN)T1%FgZ6lIM*pB;o{6Z-2|pF(H5v^-vwUWlFa@^v-GN4+Lf|&0C^fdot63sc^M(70(lz` z(C4U*(YuRMSCLuQ7#+=A!+ORJbQf8Ti^%gsKjm*+>Z+74vKvM>rE34`sRE64J(RMO zg&4a~TNG;4eNw5;D9ngJJx~Lq7!5#;4WAgLrlBUr<0(qzpk{_oDl=m;xt2!bp-NS; zkXjoL(QL|(8jlZCY9VT4G)-4(IcjUXf>xo&jKgRxYHv&!uGDta!6-rvu6e1>M$eH- z?IP=Hq@jbTyD=j}DH~IZGs?#)b($>R_NZL;%Fu79zj0uaQq^dHF?9-S8zme2kmaPGN;O(fRVn}tF)pA6XqaJ4 zW4WQ>rjb0I#RW$he%VTmL>b28Xcii4MC7nM&;+9gGEt_Hf|jBzV;fqHCK(sdPBg`c zo}tw1XsQu8OR2X|j`0k72R&^pN5{}iqxCZ^g_EYAde-Ox&k^Ptxw%SRM01Tl(XVKp zQE#?VUZ>bpj51UosdyY~u zXthy$t}<0RTw~jqAlqeU0`SbvLkWq5Vb*`U4#>vXRGWKlQd@E`mPrpt0p8wr})~5wS(7 zU{q$DE@6$KLq@%=N;O7@jiEbS3;jJKA2laCZEQxJ(Z@!Eok~54J~6tZq3E2k0A->t zje4&r^$faXq@w3f`J)f+K4V2$I)JN#aM8I_lc^E>YH>q=&I4<2UZjM z*2qM6(RJf2`W@XgE+fA)e(IJH^`lY^(T_$EYJ+YY2hbDfCnMqxTU0N2$LI+Ap`VSU zpXrd$FGdDRN52{K&}j6hu?EdYe;Kc!73go{Fgk=R)=G34d03kafP^0xN8 z$G(AltS8Yjc12(798+0TowI(*&su=OQ7!8&)C|?OK1A(N9czGxMRi4nwIfPGHfsu+ ziu|pM(9_6ny@{Sf0oK1!J_@wX^t7lADA>9NZ9^f}aXuFH9x}tM`(OnOx1L0msG;?? zpGDn55!TwZEXwmEKh@M4h3cXf*4`)-J!V~jB2atlQPdoDu+FJ%QSDGiYk6IZ>Vi61 z@1ZAAXRFU67Bv!ev4)_@CXBYe0<%$9>tU3Ox?4X*%g~cnJI9sPD9$`WAH*C0Yy688p!PF}jG-te348^)pJh`q(V$FEq;9)W-40<6}QH-kMKX z3r)1Xg8WgY^)L!Ulda7itP(WCnueZ4xz;??8_l+^L;cVk>#6{Y8jSL+ae)?mqc9>^18i^fP+hT8@54d#zgfC-i@1 z)_@3$YCw3%+8Q-ON31sSd;2*5ia9qPx~A^fCI?8rhW15#6`;L_eYj z)-?1hs$*-}v}GK#SIJZe$rdn?t*7J{B4YhoLUop|0s%;lh7)rI>LM_k`n_oM2J2ceR6Lmr9wy8*;!i}))LP=yJZ70znG|F}z znQ3s0?YYNz?q1-e4)la%i*375H?-7t z1ocEKZI@6#w90k|4MS^etvg!OTvTZ5ffl2UwvlKb+HTv14x!g=2T?hC!{*b;qP{}r zAzM56D?Dl&iXQpQPkmsUi9*l`+ZxmeeP}ztscbuR%63B20eu? z*mj`V=yO{cnvW`N7tu2GrEOOYQ95eqe;-Xi?fswYVNoxk zDF1^!=>K-Yp8l5!^+{o(f5ww6II{l!^Uy&w*#9;1c}oI8^t4oQC;7gF?|v|K%tGJ!kqy_vD?x1^!8>J6i020*ye+ z{8cZD8jqIy+tG7qt$$0j0-~42eQ2ZqEp!TP_qX-2sQYM_e+BvjmHS5| zaJ;=hXXc-c92e;Sj{BFxP{Nb`mr*Bl%0Hy9MJ1pL|Dk9e`pkbGT7s_lm!d7`w*LwA zHoEIyiH@TC{?DhItR1@T3Z`_amuO;-gHyuFVglgIC z16hm6W{*PpG{J69M#IS*_Pb~Tim+D=VJV6?u$iB93M%~bLdxK|P=LWaz z)eAX3lHImPEMm6MFZPaT9=d1mna`md{c6uc1*qD-4{bt!+fSPCZKxb~(09n!;jxUx zg#sLz$oP^&l4BKWfWjOHQ47@2aREJ!8ar;H7}V6^v)rQkqA14+l!~Gqm1rdD=D3X} zpeG&n7c6QTGUFUA;Sw0{C_$UhP{&bp66HABtgtBCC3dn1d40O-BJ5jDB#u zfhMBcj^jo2e=A{7Ko#Lh6dW*aJ(EL?0;@fO4d-jk*V1 zK>AW_Sin8hhwAWvxD6IH1dR-siH4&w0g;<6Dg!wKdZHXO%?wC``Xuw&faU0U!rXv; zXcd|ra1s@x=L0UGH_+UGYIFcC2&nrKC$01l`2nrb7i7x=dZ4RlMZh9-8*L7#{W3HC z4M)I$2Bo+8*m==LZ1ZOK)UDpJYaMQn-tllfT$g= z?Aw6eXe`-x0mIR==ypIZ%0oW|97U_py@2y*Bf1}O1HFvu1pc{${%;=)4y?D6o(nY# zY>f1cl-7Zr(FbH*0u#~is9WF?RD5j+St2Nt6bP)XoD^cmV67`@k`uAu#aL(!k;K;UHL zafPFQ;43H?eH_^G4U1}w{ukICMWW9GgWhx^^nW)3 zQ{Vu?Ujw(Hndo8Q=6&pxNCh26g~%)DQ?vv52VFxakUdE4cV&%(8Xw@inXGM4XLJFz z3ra;d&|^VPq_?ujpgHJAvTi|dAoD&<461@g758m|?xRL%M3CRxbSh{q-dEWO zgM8kxC_6eE6oNXS^Fc#V7xYcgWHcDv2%3kULbrp~pcm2opa^dKnckVWl5zXy#* z`;k}h^23}FAY1S*bP+WPuKO;BXk<1G?g4MW*1*#5_A%^3ORtzp+`f$MwKWsr15DMI_egZh;E}; zGh{S;024ztqJPkkkmhGN9AD>>BBTN(quh||Xf#?B5^WsQ;nwL!!|o zbTcFg{fK@D$^Dok1G*J*6#a#M3b}!NzhiR@N&Lj3>Lbrk+ov3oP)KMbYKt0$_C!5V z^U#V<>Hm^o=g=PKTur)!UPhT@T|@ILICVgehi*nIP>;}3v z^?zJ&+~9UW=yDW>-U{7?TA=-*mrxJ%erS&ioOYn{(2-~mIu}}w^zG=1&doSQXeruExmMVxXg>-IOTNfEK@GzupmNkQ>;U>0wFx_o zzC)eE!Ya9bMBTz3M_%7^Q4^Mi9zkhgQ;`FW3|o#u(3r40$ZP_~hxPc=sY?X7IKLl z8l4YohrUB!gv~SIPw;x!r|2Q7A3ppmy5O7aSm8ye4GIds^9?hI!oxi-vzMdB;Snef zH4jff38+i>A~X>73_pm5qlw{X(Nkzr_+_*NO%DGXZARwQ@Qf>51H#Ni zyy!dja`b!nU9=PZ9UgRp{Q%W(&;}hrO&cVl4^Za@8_`!Ny1~O6^nbTuw+6QFxeI{$ zHfWA4x7e{7JdT>7qy~BDQ8cWzs%Jz?5&d6TEE?=`d$*%M2DrB6hIlTIN05zL_e*U)~lq5U7A!|3b&!|!vm1NBNaoxia# zVejNQ=nfj3T!4PleAgmyARUkjj4!?PU>0AeRb*ZTXOaHo(7WK`MwiTj zmRmg38mhK+-I2bN=D#i(Z6XUQnvQm&4Mht~_$D;g7oo$*V?&#lJ=Ad&^-?N2i(0(8 z5$TVlcJD4jKahR&#zk}&J$&;P`UAc9URa5Tvi;0`@bXn#JycWl>DfJ~1A2J&0*Xf8 zeB!gsL-j`H*w326ez4a01=~GT3c7G%HyVL1T{?=g(c!O0@9#5=&{p*3%P9S7Pjrs#{p;hJ-|iqET2!rH)FqJ9=L< z1(l16&@s1;yY+!vCsYDsxx;WDO6K2*Pbu9xrD{xOMu(@};Th$mNl&s*RW2$*=Trgu z2vw*O+kjJk&*0jCzXRM7?9B|2q!*Ncbg65dDObV~d%sOZ}Lw*t@8C60;TS7r^5#XmD%- zx`k4u#X~eif?okQ_)`hEV2I>#Gi19djrxmLp~0e;QL5;5lqNcc#)_)YIMF>cUgVp?Qa~n$ADAVfmeZ|C zqNZe1MeWcuQ9PP1N=4c63B1pbQBHh5x`SrKmmuH4EUowo6o_WVSEE*FR(w#9OV60` zG4OH1XXCR`8p@3?MmcD9d>LAbo{K+?&Z6hz@1ieJUc3>k)QhQX)iN_X(E`y?v@kw_ z>Y*V@Et2d!S{z?ariLoDBt9~P&S)t8-_rOr7*3cUpNAep%i?#TShPI80u4ql#8;z< zXhnQPC^L*!#wVlsXq8N)2o=QVk{v^<<4ciam{M!vt5GysE5l`=by{YPE*DC;2o=Tq zg(h&IQ!4Ceu#G>!@J8K@H~k+BRwTSarxHqjomU33n0 z>8UrzdnmOR>z^$kougK7t(K_0s3%GljYDyLb}^9?sAr#+4d`Hpvtjm$K~JLoebUf) zG@wrbT7?GoDM1@ia-TBv7E0-J6a6`Y<=H2{A)Wn5`oGjZdcuJt*?UEu(9k}`lt-dr zeRiSOQJPdwpmfofXn3D0s`W;(J0<9`G(f#YT~Qy=V3Z)5hWd(@qePMUDohq0LxV(L zp%l@5G+6Y=XqJbl6&fPyg@%g8pkbn1lqOn@(nWhwhUg3$EBY3VOOXEWZ#Z5;#~6Ak zQF}B|)E{MvvQU;N4>?5}&?M2@XtL-tG)43inkuT5!Okmcil&R6MCMb%5incyEXonB zMl(da(bJ+&&`i-?G)v?d%Y$vA$I!E)1e7b9hMpHKMRP@4QJ&~M6V4ZYffk54($*wbj zjUiEosi>c5I_fW4fd+_npn;+fQL^Z3l$w~vs2fdWMM%~SO%{zqQ$+Jow&+zfQ*;^i zHT&rat4t;=3PDMtPH2)S15FVvK~qJ0QCyOf3HQ%pn@=i58&RJmJ-+u*-=qq%YScfe z8m)9P(@8OnlzI)NBqgISoV@>3Y4Qu?QI3S27 zvrs?DUPQ?QT9S2}#*QkPJ~v1i;MBvBrAoF14HcE62_k)@pEw|w;q=izQ!;%}&l+Ir zxe1%j?j&J%G)XiDO&(A{lcOj{va4vuK;1%bNKcFEJ;nP>-o;8%;QY z&t?Xbbqk&K927w|oh)Hc0s1DJ{x4}z8GJj3^)yHiSb>HOx=Z%h(=7f$$xW4dbQVux z4hm|fRMfL9%#;$;74=RzjrO8`DZ1@Rl$4^H^V}usKR5{0%Vo(7jzk?$@6;GH4yB~# zBXcFpNG*Z-TyJcu9*x#G(Z^ILh<-tRhv;g+Y*vn_E$TO_ZEo{O5IR8c21 zQ#206q#Mk_>nJuo0@a$!7Lcx|)(R!3Cy@0t;UEdep%l?`C^bEg@*8MKdI9BS6q8_kxi!F*1>M2YBmQ4X3T+JfeaK1B1UP;?ViBuWrfy{}zmu@H~nW-9}?YeoI-4q82D)gkLKjZr9lez1;4i@uIr?}JC2?nVd~M`hchK?zKm_b)fkN(sjJh__>oQ;YxNwJhw_)x z4UN*(*HMD#JnAd@4JC?#Utlv8bwvY28EByBnHPBf$-JQN{$-Y9mFjSj;FmaC9})nj+;P zXxeDM)||_uVPo{D^~|WuAhP$#ESW9QpU5jS8qHb7{gF&3dIR}n=AugEo2lFWiu^M3 z$r`;#KOouT$jB@<2@gVRW;NPYz&4+m_9zor&1NP8HbgO**<}4ttYi~WZ_xtOCo_-g zd#G<_0cx~{cPG`ZC|NWf4RR|jvy9=kkeMShZ^Bt?l^P}GQZyzrxeeE~C?hi$rL1EM z$gD(1&;%LoYcw(QE?HAoRnm?VMHH8n)}HDHuI^=o4^ZE%(kOa|jci<5m1NQ_` zT2?ZuLFri~D1Q^*@RG3{M59C(&=@nz*^#|@GmAQ_4E=`2N;&K$7P_b_njlI>6Wz)b z<&b5$<#a1MtE#I~yQtJ?7eM4_l$)C?UL z^+PAJN@%+Poys!xX0{ccm2x@y*sXJJRk#~}A-c$LSF*|&&Ggq;5?MhpoWh~2QvD2l zE4q$uW<^r%v72S=uKp+*vzzz-b5<_pp0BgHWZgtxAujG>Ilk?oA8Q7vaVx`zyB73#5<1@H8W<4y?*kQP2~aHMoA$eBUaY)=^M%!RL`2KxQcvW=*IBOL(Mw3PHXo_ec znkt%sris?0>7t#;bUK*@^)`E$vjD}JFki}}(K2TV;Tp8uS%%(2E2LV9R*I@ovGX+5 zl?S;a<%50#v9OK(Ff?LGl=RP^uANySgv!3oy{4I7NTQLeGj?bVRkWRd4HA< zIxTJ2p)=0AWJge?=~M&Qj^AZFb;h8{=#sM%eT6Pd6XOWGm@|4HH_y;jXE}1d$A>IV zeVg?!^qn&~g%0*8OF~*ai+&KzMZbu)qkE!vQMKrQM|uB$I4fy<{(br}=gm|OB<0-s zmvS6ZlS+p0u^X~X${WfV-!TqJlk~1Q07ZzhP$SVg)Jk+1Jvym?7FFmm$^JpnlS;_O z9_K(b>E=-O|7)E!8Ve=@xvPsp@BIHA9A|Gg3J^>yIp= z3CKf~kGygsnecv8D<=k7PxAh2=cK{MPqGQgfLir(oMaQ9cr4BPj(iy z$|*)VYnM}s2AyJ2=ai%6C`MZBMR7S5WPYdV4J2!adga_CGo7$^PBq+y`bhab)K~N+ zN^~nl^cUG+k^dQv;G##-xEv#mJ7H+NWV=viP6XL~lqFf?vmAs)iRkGZ>Hns~`4X-{ z3q=Re646Dp)Scz$L^HyNWXmOM{1G>%a}vlVqZN{^Kr3A>&|1+qs7Uk&+LV(H?e6SVx8BXkrf~(;@|=9+^$GiXP6_IQj>~Y#=mWP-Fjdn=pk}~ z&?IzCsye$NT7|yP(Koqu^z?Psf*Hk(rXyM_SrRG{O+dRu z%g|e*y=cGaGo+s0MccOjV}_pAZ)6a%iKZdDC?7R^x{~33KrxbqU*P@63KK4{^^3-% zfg%%Sh&G{dqW4g~=nJ$$bOWt&XWK=!Kc|ZkHA8QT+N1ZM_8ZO;Kp*JLta%-tkn(D0BpQvPb4^{&gU0M2 z=4&;w&W=Rek!`lFzKi@t-yw&{`UNLdqK+tVb_^}1qTt!d=tb0Ewi6ve4QJ<}&rqba z_#H)wYE{zzbr80#WWGe{sIzDe>LSvk?k0Mf>`BpwC|2}4iWAwsWHXyxz~p)%wXOuc zhAiv!8##$QMOTow$ovD=URTb5VVCHFCG3FeixN?cXe^2q<)XNC6~lQT1;tBt4fPcL zg?fwZU(t7p+M<4<6qF>IjRvf{X)>B^Fj>MQC`I%I8Y;SnhKuTa&E_bILgPez(PU8u z%3D{>__m;Y$xfkVqC2Qyo!2Szb+dMMJJ@1W5N%GYtbpuUUXV?0-ae` zK$AbvN0K$H;u1yF5vfAGW``n6VF|;T$V;*!iG@|@92#6`jASmq0%dD9PKap@fIwyJ))h{Zg@hM~!l_UEP ztdb(VwjV_{Q4I1IjYW3RLgWx_LIFh;wB3(lBs+~_MORQ<5$nIE<^hbC&~}UcSkw;n za;uLhkt{(p7WEb7qD0X;)KBy}N^)y}TLayyzrKpuD!oPjXRKGFIs2!HZG8~Bi~QH? z*$ViP_ay3q9P3+B9e_NFqtQg2+7?NEEkQczTJ8rf{rL9*4Tqi8qkBsz{di@ri#L^UW{6!a5k`=ajX2~jGFDR!ES zdIn6Ea48y8oJaOPN|Ede8thi8=x?$iqL4duC!#KBm?#~kiSkjpTf^NN;g&hl%~5WR zc594VGm8tDtuu_UK(ZfDx#$kMF1nA@hH8e3{+SMGgI+l)$YX=w815t?&kYf1J@S(3 zTPE}teuR8P-yvU74e}EO-(`)7I-uHa)e-e4t1EJ%M??!zJ<%3aUvvl=B0Yot$gHW+ za}y|`o?MVfPcB%bC)Yr90Y!*zqei0Izi@v<)EG4pwMI=vy-_pK0MuMG2Nj4Gq1C3a z1g;SsL2E^oXr1UjDij&_=xjufqV=NQs8}=>Z4k{t8%68UCec2$S@a2dNp$lb{a=Yt z&&@WGo`oGEJz=$5uSL&aS)ZbI$WJsJ8M~udpDR(2WFMgj_i!ym|ByxQPG-1_`)nDz zGte58tgB|t`!G!gwEV^(yR#{`LC)RzXc)?q>T;AX`VbZDE~ff7D&D;dB|hMdNVOQ1 ziq4`kQN7>USa+8(TtjqPvH_@aw|ScIC0HfladcDk7rHBITg~kP(FCMk*ULi>=O=oB z%n)rwL87-%gy;lnDY}lLMInDMmOXkbZU3PEv;0TpAsS5CQ#1*AiJn8=Zuy9olli*k zC)!R{%dOg?O0qg`)fL?$dqmVnv!3uTRNpO|$nhr&^Q@lN9%!E^8SNL1)7eM5n!L9C zDt~h(|JMI zwcbabqA!t7T(1cc`tLQemW{N2MvqyVXjVfHk@|;wi6TF(rvD9SX{KeY&3Vz^jG*En zBW{W6iK0<`QD5YGxHkp49`0S_!`7wJnBiMwjbu3Ahx9`#kE|nVDcK;@T9kzz6+MsI zidLd_uIJB-;bRi+M3JIW)Jb#{DQ`W)*O5hZ4|#Z(FgZ&N%g4JEMIbM!c0%5wIAnO2 zQ=N>g-W6yya(Gvv!^pH$=uw}9`mgKd5vBiDka>%)As^9w1GUtfujWZufLtr}71UU= zJ*bIWO-1|2nu*F#bJ0=MQTdJMBoy_M>>}!|g2+1h@a2Ca5A{d-?YmxPwESZXVT>pX zC5aZJ647q7O>`9P5S>H2MAy(B(Ql|!m#pr4uEuMum zYicGyOU7v?w*q-)RH8|>Xp*4^+=jd}A|`OaKss@~T-(eqx+za8@aZCcadwytwilqE;CcB4nLft3Q#QSEG-72E}~iJ zagm;IcTo{p52b(6uy5V}wvVxOng8BWp13w}UAQ@u(g6AQd^Av0fRaToqrsv#P^#z< z8YViA(nQzLXwgG7M^yh2ehNd>0KFi346PEyqXJcBGIwL(Y6-{ExKK2StVrFZdJ?@X z*(J17RE=H{`PSo0v&xvri90HjOw08(o}TDy$wr{RMe`7c4_-TwSzq`ujI%^An%_}R zOC)MlpYLi)wGSFC8i_JQQ_*x$KFYSl(BgeGSF+Dgp2bPl$l%xMB|h0 z_dHsX{ewK@nCI_LH-}8VdIGHy_Cj{iT-4SxfhLDgSI;!`gq^Q}dgh@}2fsDqS&9w> zvVf(>WeIXu-0Xy z|GHkTo$n_yUzNZJBZ74|t!q)pwHrQx>PVJ=Tqhb%WJs2ej)gmE`&uwxi`~^QAAU;s z?-clx;+p^eCtE8k!XtzYQ&bzR7uj?si#i0YZLi1ESXV_YbXAUBx>^*ct8I{>FLuqE z4$vmoy|F0qxGoPw`mgKddUu1#GJ=blRsCfwLk?~CLir62QSC5#2e+a`^~pMjLQ#w; z0%eFEMdJ&+4JQv9u5DlJZ)Or$q)Xj_JVYmvr|2qjb+eCzGn{m;Pa;=`n}Iwfdk(p} z-knJK>$h+USww#z4^c=1T8KI#zIS9Y;27xo;?aEM`r^@Q#R^%s5-a>ZKQB)=R z7F`uRK-WYb4f%Sps3E%U&b||MBD*0PiOlbX3*k-Ci^%oupb~UTvi;~s(Q$NJ^bPt+ z^bfitY8$~WEEPBWheAbFC`_b(C^1~r9W@Y5Mh!*9sIe(L37d%iKutyZ=MkHUGEj4O)=spX>@m@s zC{k2`+KYZiQKAOT*c(LgsH12)>MSa3W^yPM9wdwweTBM;RC5lmq9&-DXb_4KEl07U zEhtX355MinU!O!DpnKc10LBiIkujmPsC`v~CMB`DC=o!>svu}=vuE%=>$Kqq6eMef7KmcdLXi_K5}AwOV&NgQMDzt(YR_ggwc2tV zm#hg|=GJmiSF#sGBhU)bLbOt}4y_U$M=y%>SPDe<&}zH%f4=Sb-2n;1&{|P@v`*9; z6^cfnB2hM4FItR>MH|ru(OYPv=oH!{(i7fn&*LrKAbUx&2go!W1%#fD(J?smw$Kdu zyJdIF;Z}fKk)ocoXfGOzqD1ph2hk?fQB;OHi9Sc29VJZno(a21XpdwE6zLIm6~&Xq zh$f*}(W@vV4{RosGlgj1G|`L z6dEWhLdl}NXt3xq8X@xT$Q~gIMx#W{(P&XT$`DOPnW9A~%M`u?r-(j8*`l9NjwrMf zKNTYCi=Gxei)M;;qFJKjJX$R>(HbqYW<6Xh;oE4P=xbCc zszybkkgja=q9{}>iboqnlhI3}6{u9S6}=@og!YL(LHkADqXQ1se@#v8$N7OL2^*s$ zq8M~kG#*tr%Gg?;L!UV+(K>Wqs;{E|IjYG%LKh^vgFbibl6$zX9Db7&pYn3{>~Cpe=KJ%;Xz63{QAG3cJ?8T6}YCAu%# zfqoOciyny1qu)h8plXNof2s#Rjv`?Y`cu>j{Uz#${&r{oh$fLe6cr-Z_ot5`6`)t= zZDbMEdXh6FQFG)eibq}|{Y$W>w{R}>5p6_%qW!3r=p?Ew`V!R<>7R_PE2=?{h-@(y zRZr9m)fYvh2vI-ONHiWb7CmdiCc@RIsptS|Ci)mP7u`ZFME{_cqFS;1NSdfQYAx!H z9uazif4U_njsHSZ{#V;LSCYLzHpIf#5mC2fQhjrYl>((P~1&I85a)(FM3I&T2k&38hw=3(#tVWbh=8gjL zjL@^+xwl0{M4To|LNSt!M0r|f&3HIp!hEzqv>v@E+K&oEpQF{HduXl5+J_!f6p0E& z{ZWx~Rvk45~1 z@xRYNc0+2W9$^}?h^8V>Q6BOV6(ZN;O0S_>lD&uOh(1GgMK_Q!Q~JL@p;ba#5+`4x z*2pf3M=>+~rtp{TlIElKB7$w z=bKwWbrRZ}^(qFT9;Q%zS`TLwH%SSL4u@&i;?GBuE`A~%;T5Y@{qMU7E?skTQp zQ4I1I>B-r1s~ApaYPNg!XY2ngjLg1dGW({RULsxg5$VzRiS)eInH^1IJzMo=JCV$S zRP`*_MKZafVyffFEJdYgDe@@Nv#H z3s5c5>!`Nq0;(f=fb=9>uXS>FENl?(UAmkm$P!V_nEU9gksfN0R%1Z_r@6>)I{$+r z76qX-I$Nv<+^Vz1Ey<2)Er~&r-2C3QKYCG#fZ+L4ABLYExL>%3U!N{sF~VMah0jQB9kI9FjCXNF11ZpqCrJxRu5?Irx z`-mo>zM{!!kSH7ZcF>KVLA6B7P$SVh$d;n3Um}O-3JMh6M!}+AQ8UpWsFkS3gq?)m z!#Eie)j=^Ledjk;6h;;&YK`JW8@S5oDSDi&kEk~qBpQKQr0Utq(wXQPG+49>S#rv! z(=)yTU7g2=NH=i3xE^Aa{G+R?3Jpr5YvF5weAJ8hkE@}5$n{KsuDU*Dy@Xt!vTC_* zaNkC?RRk^caITy7gVO19U7wicz!b5y$o0|rCFHM?87^ix zJ)^W8i5x1A><|i2CFlxzTB;Axe{W6yY@D|D2zo}>MCy#-j-@K4NdxquszBq=IaP%U z(f`-j)#4R0J~iic7zN44#G@45X@A4cTKts*E^)CsOk7a#&$2`q5Q{%Wc@OJ*INEu<@@tpH}=g#E$ z$_eaZ-c@J|>gatJy^lJ}aHmkTx0=Q83ZNKo(|~6u(s_92qS~1(k4N--s)v+OLY9Io zMj1MVd?R%ADr(WJnygk9n{BhmXPB^)Q8%kXvnFvh(JbLv9^#zLxk9XNu@Sk>8xJ6( zm(D6C(=&D!UL{=8TZi}12zdw~U<$Wb`jj%7LugE&DilAJ6V^T|m&dTtHW}_VI@TwG ztj=_cI_}Q;_RSzW^%NK4NqWrJQL6mZ!{6vbkr|TB+{kx@qtVk7^?(UT|8>1wA3RPX zD_3QVFdJ1!Jr7m7<@zvkDOr_dtI%~(A>!BhXnPLbmFzOQ?|N$EJNTP~4^U)XV>Y`T z`fmnmYQ9d^_R9IcGuMt)pUm~Sm;*(qXxg?$kod}Q$n=pd_%!qt z-9UaK-x>OIPCen~XuhZiS|A#X4v3uSZP5~RP_z!|madm&sQ$Zy%vbaVYA^b%HXN3r z%a_(3+vjio%)ebt1D@6$kFK;wo}yUfdZ?opa(!B;hjVp7Ly@Zsnuc6mkj`97Y5{UR z!0|G2J)yA|HIgyEgIc*($7$GF!p~6~Q5AB1X#W%Hq!L)n7xYaYsp_nUtHsR!K7qf1 zhD-Jr8ZW9li+h2pl(rkt49WJPnW~!XZ)9$A4fxD|pN89!>(lTs^oi0xwh@IsmEoqK zE215!N(E8<5PdJ%1$0mJ$g|wI5%orOWfjdt%|y?m$3-uhaGfQY(fo|QmrzC{(xcHU z#PxD@p_bhLJ9F8e%(d#YT&qsYOBFEYc;s4PDaf^&Mj^eLOs?c$ZB_E`fUY&RnJh>q ztp^-0GqV@DHqUb8+C0BO3oNCy{ShsZ;r>7cBJbH;TU*Mhwm{0G0wo|X5B-KlAa7GR zPM1BaD9=ZRr!K#Q9HN7$ndnm#Df$8V$mhznp5ww?WJ9jbxdV!k?zcNi7WG2wMFWt< zM^7X5ISxk=!V!d#q6w&jXd3DydIt3pnaK4knHy1pWbdH9qW4g;=nNVp`T`9RRiO;g z4`{5GS#uALld#V7oJNW4DAHHYVF>CVYJxh6+MpOwClu>@m*tj*dPz1F^%l)SLqzjX zhG;1o>#LsU;Z&q*nFeezhp?8OTqiV6GyshkO+gbx`DmhOC(0BZMNZKdD9@_Lau+SI z#xQ34T+W=W$w+65q}q&Zv8eN04o4oHb(7wNzJs*-BQ;nn1vx|$kws3U<|6A5U0sR% zhh#A7DikQ$4=6`;2hA7#iWZ3c=CL`79zjJSGYqa5wns`j$r$7{PERBed5b2Y&Z230 zxbekIcq#H3uZP=?nvE|btIZbGe0&9RqR8>a9KK_Vl4ZESJhlo^B(h{jo0O+Qk8CG; z0r_SZApP{BExQB_oX`7|yC&mNK=xg-r6?$y2ZB@)3YO~Y$Ya)NvT~$n%JuR#^xsd& z{6tq#OVJ%F z?L_O)^P(MSj_4p-DLRG}~WLeCed{HBGThsyF5%oZ>2QN~P>%og@ z=t1KGmcr}EXr*WW2x=y}fLxDZdMvT1h^P{VYmXw$s8YS)V02U!+J(ACRim(_93-L& zn86FETT}(AozH#YD3!;TIgsj*fbx;0LoV8nJUW!1%g9@BRM#AYFADStH#Un>AD5ET2dwvJiO`CI9~>XOoF+psIH0k?hghsdWrlc4p9` zXchg!&b$RKWtQveFf#qu^{Ot>e=Er>$F%OC++(KZZ*b^`T7RQqqB<{f!%h^2vP7Mb zQHtCw1F-NS)GJgDj#Q$bMR9@1n+{&rnlQ<%{%x&4gD7qeQ=lGvCEYk>GeccKaIbYY_ME?%NAJ-Gz?~(b*gwG(?V!eryWMlme zc|D=q_^o5Nd*UXu`WjMsd8ErzX@|@^1^k`l_3g19K znOCxyP9+Jp&nqRofTHqlqCZiGyr3m~^tX{~+Pq{Gg*xTsp#;=fW_l8e7R^Ro^Gc|e zqQ~=2qf@9`-d*$u>Yf+0l&>dj;sdR`NECxCrYztL%>{ZXEJj`n(kSmk?H6RD+bBw^ zft#5vQD@X?K_1m%sE1_FqbC;>kR3%alKqNe7nG1Seu>4us1)r-mPLAM`(L8}%g@*R zT$c;9en%5UVOu!MDX65$h7y{T=<2&jZPoe!d5AtjK3lW%`KsDhwsiUW$0%eKO+>D* zgiJ&JlFdR6Ewg4W4A@gZ<25Ky${SITXd4O^?M5M@eJFHK2`xTHVSCEZFDP89f1m~; zk8RxZ5Yuk-a;RU&ZAF7KcgDaL!@L&uk$Lm^hC|jNZEk(aHgm~*^8o4 zXp3kPGG7+1fhD5tXshS|+9tY!wu^3|9U{+NJklZ3qdqMPBs(K&g3gLMppQg7(Z`}8 z=o3+%2|pFSfX<0_pf5yas8VzSeJQ$tE{VQFUx^-|uSJbsv#4)GZO~;=FZAzvIeQ0Wp^G|MH&D7 zf6h5^!>T6S;>NA2G$T=&rHA+@C5dAY-e&!&?coIb4&&;6#8WUn0-Upo*9PN=Od=U>x+fR7=G2B!K zq8-v$)Klv|1%)&>mt)+IJaMMo737s}BA?{RVgaQ9R9drsFnLallf zq2Va0NBA3jc7TTUh(?>yxSp+0_-EW(z06cvqNG8IWId2QY)~?sY|46F{tk+K#x&fF zqNKB^j#P0YhgVVzY9Kv~#*H>T5|KC6=v5Ry+30nnX{pR((I!A zmdnvJX%(7{?Be2ereTOFZ$_=3HOfH`NMEB6E%jkEJl#}}qBN-hO_R(7XS&tdl9_Vl z4AY|!g-b=Ko>Yv|>;h8`*urF_yUJZT$9XM&$|DqI%irm{ZHl$)d^%y z-^bm)uWVuba|V@<2%SOYYvjDsebzM8*%$v= zEKMbW%$dpa$XU5pk+X8IBj+vq#i+Dpn@N8FosS4VMb77fUmz`E@ps61()<-U?+O>9 zDw>^lJBOQ6IaEuki=0(ziXxS@MN!gYsE(Ah-Ms!4rxVtb-bMALPf@h=72?AJZoeSs zbAcjskFruZoU|ZSMa~B?%~2C8ll$li)Kt}x$a#vMfto9`m%tX{YUG>=xCJ>MH0(#t z2My;?TPuqR2JGOuTs^9zc2XnMUTTXvNZruGQeV``RcBXm&gUPd+{F#MO3#vYlTuK3 z$wtmOg|kt-vP_g9twuei&rvVwJJj1%A6I>)->BNo$%m(5KZTc3f62R(&jqFO=ozUF zdRDq0CAk_VJwi5IN<_~|W6)UXb@Xs0^B}&3JmE&!HuQ=+kx%-~lp{>}Pg9jHo2pcd z{H35T|Go7)zfKlP=1Dhw8zQgN9r>grLD6!scL^rLzL{j+$*#VNX~{*C`+l{D~pcQX|!21QAoQL6MbsuY^U^wLqR zjs`X$J5}5bn^#Ju+;R`E<|?g3BT(;3+2{=FTPYu>!sf<5!A7S!hV5 ze(3M7Sp+>qwZCCEjL0Ngg+@i>q5HpO+>a zhmyaiOH>|u?+3a>h0o=+dLHfcEV&(p){Z6f?PHCV)itWqkL+30v`#V#*^laGp!x?` z7`-w3Fp7%N^I#9y6!KOK3W+sJH)UyssY*FU`Y_@c3LR|P-8Su{8b7k`IvQw$qQ;nN zZ)Bw!jYOW*d=_E1X_s1nk`FRQ+NrVgxS#@zO6`X{hZxCHlhM1Vi8^mXO{J44IW?VX zsUtkHsoC>+JkgZYm<43N^4@l84!Ve9rkEL5`HiVav8bsu9GRNA+5f!bHD;_Q=5OMEGAqDj!^mduF-k^rrL=#yvx__HJ=*kt zhsDmsGyj+D12X67c`I_Bj`EQ6uI{h@OOMNB&OI1*%-n-37xG~ba_&KU91PI9EJ1-* zHs#+@kd=#~k8>xf+66f;suEC`vi_)o^bD$E<+Ikw#d%Z1^atJ=XJpI$fG^l$m`1ID#TTJSI%f)dW5-Igsa-FVq7(G zWYeXo8#Z$l>#Bn*=c7b3lU{BXrGs^oy&%m;gOknLy^EZ|XCv~Yn(RB|m5!rAWEU6T zfJF+8oO7asPkDI0GF^RBVvzak+(PV522T-2NYDJI>^v)uBy%>Y@yOZcXP|bPkWr$v9G#RlqliE=}Hz{`b;E^UY4)7e7NoP3AGQQc6P3*9pd*x^QDu~+^51Bks~lH5T;;ji=c>@vMOV(n ztpW=Ey_$&{z8jMb^4Mm%TES!GjN(wdKBG@S$5g|Dd-O-UBUD%kB&-J zQK3{DIcL~4Le2?nEm4R*ABsgelHCR7i9J!W4n&_osnQUXC5=GN`$8|Gh$?2rX(&dT zX{ypZlv&kOm!drB19VjS1jW=e)oc`7Q{&$b7_aaf6jH~O51>E^{8*MP^wu{HDsqoo3IYdkeZ-O=>gMF>WFfr9w<-hi;hYI zP@xX0l8|+`ncgUrC`~}g(iD^`%|cnyA{&NigkFv!q}8UOWPUjnywhKWQo|EzLsCnKTPgRb`o|nzS0# zmOexEr7ut;X+LT#9YOaK^>*rsI!q>T>dYHQH52}qf%`YFEv7aq!y^J)D}H1bwN)^ z1JIMwc=VJs2R$u)f)b_8Xo$2E4NbPqBX%4CM5n)C;nE?q+D(%W;FcK4_ivG+Hk`i$0Z-(FW-y z^qDjXZIoU^o1}RtTUv@XCu{us0B%wE3EC=UqtB%sXq)s6`a(K@wo6A)j&urrDV;~V zr0Zz6WEFB6oKy;ZC50k8SF8rVmg=Byq{iqwsU_MgwME}cap(sr0p&?gpncL1v|k#5 z4oKtCkCKfJO6i7&#MvlcdK(><-a|i2AERHS&(IO+0QyzBh<=mGUF3_ZQe$*f>V}R< z!_aYQG&+IU{xjf7g=^6%={s~<`V*azN?qa{Xek=~Aw7!zl*Xg8(o%Fz+J*j-&Z6^D z=w(iUmhMM|&iI!IFDe{{E=i-&WoaV1CQU)trCF#*T7-(F<;WUkcIef}PuhU|r7uvh zl#9wr`z|y7-6fhwv7GcXMX5A zaie(ri;Fiw=f@jzP#nIX~!d67^Mf9z7-9b(OJGs*IAP2=tuP06i}? zMI)pKt}_0O6gv_oOFhsisV^EU4L~nSN$3@66tbm>Xu32Ny(Y~<&QCimM6;D;qPfy4 zG*7ZWh4aO2Xrc5KS|sHm=jR>{Bj@KHPN4Tx{R^#-uA%p(V)UUDbd4ccDvv&rs-o3W zZS=A8V-}6z8ig&;TB$ACBy~aAl6l73ESWoft2B)2=hA4jU7CV+OS8}(X(9Sb%0x$` zkC1&-{1hIOK1a@PKM7mg;q=FQMPm)KAXHJqbx8Ja7tM)RbNXrZ(NEt0-NZ%K#H+tP8gSo#YslZw!C$$OI#LMnqk zlq%n3{97sBN4Uz>M^b09)vi949wS@h%K43uXUWzn8;jOUQ_-icHb@J|K6ABEvR4sq z5{VUqLdZ6#5$IwsGKy*-g4jq!lp<|Mb&Pg-SU(#GuC@n?yMezf8MfwC?ld{ou zX(uX@zC$;pgXpGo6#XsziJZ$8TtWV0&9-$L1xP`+*eRt@R8DGYL#|uEEde=~Ef|HI zixp&`>Z&eAHKY~jL1_(gE=;fyIaeOoj+`qGY|a#?nR@e`_X)P9F3ILp!cL~v_kq4y)S)_9!fDQcNj%v7#&A3(peNM*;in^cpD{30UocF zER{p4QaH+xB2lJvH}YhfNjEdfGHQd$OPx@p^eBpw`k^M$K-4ZvP$RB_JOyM$RdU+fZ^q z5!s$Hk9w^!>he8dYCzCCd{e)y*9vVCff7-LCb8%%RHsQI`U5p>Viw`HY1bl|?7q9W zk6NT7d+v_&VfHfq?=1W(WZF8n5TE(Gj_e+3H;Q+&1nDr@FyA7kWvb8nvQYJM?Eb!- zl5C_eI+NeK2xBFD;mepON(pL(Mpp1zF9n6$%lUz1m>Ohew-r^4H2MM6l}@4|(hW3J z@>XQ4n`GLRMx&<~wLoK~2a!pfThAEtw*y(1-bVfZQ{}szCVcKcq4NRE1TtqrZzAWL zC5w>r!S*ubd@Q>PIiJdYikvTQZAQ+A-P;it)n_$xk@Ioz0pxsAd(4K;N42L>khYvF z$oYus4syP#R=N_45MmZJ4Eag5kiXOr1xWXyK&b-?k{(6DQeWg((M)9k@h7@(Z$r2$STZ_Wg|V|I^O7f6ceCea@vW z3Me~wruksr`J%!_lX*<%n`o#`8iOHISQ)_7?!dQqB;Ql$5gue_PLZ@sWOd93J9hC{IKG+bJi|1MjV)>DiH$FjH#YH~&I3(5|ElbYQUlae z>VbMoql^ZbcJt9QLyR_~h@nQmqS&FyOfRMygWFI$9X<)$56whNQTa5}@F)tExa7K3 zL8_0+Pd3$fmfl0*(s5KpsuIcLIW3!e@L5z>*=p3(X@^=m?V?x_DIUd5(=o*~*hS$sG(@_B zQl*Bqz19M01gbpUtnnu(Tsn{HNOkHkV`&&_Ds4c`r9V+;sa9QPEcHQl7jZGnlun~% z(p~j&I*3clJVb!rkQhdhKSEv zGS*p1G~A1PRw@d+k4dX#TNGerl0AU}tt^y;N?AE*3<|dL&>U3SI*PWSGFA~ff~*iT zudB#oi{)DVcM*bCv44_Y%Nh3Lx*GmtaR&qaYD(Ny;!=j!xFkaKlh4N!Y3F&B>QO`x_6teoO%L5E0QWX?0 zwL%F}0_rIZN6FGu^w<+CnaXlxC7P-1Lmnf$_%`gLu+D=##);W99Dovs=Aw7ez@hnQ z3mP=E0F`RvwFVC@Laot|p=N@EP$#{bn2VBMG}%We_9dgeC{;R&GNjAsY^rU_0S_^* zr5lAKOPgM8XN05eC_vQ{C|L4uYqohamD(slYKwYjMAPF5)F-1A zT8#Rty0IM|O^x^dJ->O+nUNlPxn^6i>Tj z$bV5Hn$(``EmQpfd8N(BCmlk5Z>7`DZrFh?Z)L)B$oVz8yE?Kht6@{*{2JY3$oVxo zBQs&==5OWFH-{|13i_Ch3pv~O4dfig_&v=1n`zpYL(Y?RI3lo3%FX%0Vx(#4iDNRY zP->v5^hc9iwWwgS|M%;&4Kh>KkyZC!RDbW}uPCxfa_vG`M0W*%CBH)B6IAllCCz`fP`hbA7hok#jBDV7oIDtYp@y zF6t;fiaJTj$ocNvOq8H(BXTa}b`?1na*K}Rb*HM`(R67FnjvjK^QEI`p>zqgYoh!A zzt?_yn6S9`|Mt>vL0#BVG`!q}YD*PRXiqbh|GD(rJ!JpurQd8dG}nHMmRiuTLCri^nSQcv^nxX6{iq{K{^C+QrJk|eRX|7N2 zlr>hIb#FI@$KDx~hob)K@*;X%T8IWpo6smJ2aS;qAkU~Q`WDVjyA@{te@}NgO6C9W zbeHCLnTM!q_kZuq&XZpRnUl6c&I_LeP%CccV4-P{# zK18C)(u2r9HHYfPN9dAjW_%D;lCB|>IJd+A^S3gubq7j~QAvqEmX4^~lUboA?P?Sj z{RyKgvYqdm?=@jvQ$A!=-{?3pf1TR}kNJC^tU?8&vhf`7N%c{b)EYIG;!%t=9M#tT zWBQucPn>*8Rz`Zuh9TkxR7Ls$)s&8-hSD`;x;nQee&%mz0(*_WQB~B$KbCcR06E8! z9Z)?T1a?Et+3+KgY46<3bq?&};ui^>=lfazDLaqs0y3x5S`?}7yHS*M2ptJAlRJr= z$(nyHPdp1#s^`Bm=f!O}nR6az3<`H%%(a8gc}MXm!b+s`Arx&zWO1#6-t6G~%sZP8 zaxN*BiyCT%MvbgQs!#Xf?zghglD-_os=5m~=KdVgDs)XK>9|yZa z**Q%p;4$7VRn@4C6oQ;nhsl=mN!H7X`IKE4^|q2x?fx7qSlK0VP6WD# z>@ll|%*Z(ps4MDk#ctpg9D3Zcli>{bgq2;QC$$K3$)1u{pr^S8Fwd}$^DeG3qeQD8 z*=uNsm4e^rbWf?Uoj!J+8iTl`CaZ{aVUK-$@72UTY<@v!3>rT;VPf{owY^lkO+8 z_le!%eklCn*gbl-@vxq<2uhv<4lPwxFL~{VL^>{cdHmSl$7=L2Tut zNE;rrf;Mqrj*hEgZ*;k@}&bQZjl*nueZrt4VG)OnQgvaA`dnA$^Tr z@Yv>VH5}=N$(}-%@F3YJKE>lJXTvyV_Qaw^XpGu@g2p;M&^YNB8t>^xyRyT1!%tZQ zlp?i5FL_d^K943SOCQeoH_EG?mIOB+#|C!H?CpW_9M(*;eIR-!4=9yC=tjGU`A zUPRNCm3p3$P>Mt|q}FJrWIqjG6JJ8FOLNd0l9`Ni(Z@Apvz7gT=18Z}Tu&|wXf#h* z#Sx5&(miOY)DFEP^+TD`NVLNFh2q(8wZiw%$I@1`##NSNo+H*t`>3v$PNEIcHMB_z zd%WX$sPa*qDF$v~LDQKT3pLN=Y_A5Js4tR>l%8g_sRCX^qC^bWe zq^>C66Y@Fd@T0@Z=AfUYRp=Kf2OW_P+3;8K0{YDpLFY=zUh8*djnGj~3|V_rpzKlf zrze)|33S#IkDf>8Jc;NP^p__Y%|horsb~wj;8}#eMTMS~=m@gB*`G81l^@06qfZec zk=L6?xjXVH8;r_JFQQQCHB?brj>4tQDAHR%-*YHRnP)WbG)iUP!^(a^o!n|?ZyeR?V;H2|tc$CzuDZGE?y85YM@q!__oy4j zOHG+{g0~+t8IO7@n}vFLQ^?Mse#(kbe<^${$4^odl<3W%-K%JzH>X5{R5jUPS3|sc z+c^GvlaK-V3to?)XS^}!ee|riUx|{`C5vpBH-*e-xU%i&Id3M}*XVg~7V;m*2Br=OO?hml1TTU+1~IRraYeUZ;ry33Fk_4&^&1sn(vLK;ooSXvhpu- zpd~dzZ%Lid+tNU^Sek&ANORFrZyZzk61}7BXY{UQUxb-r=@hmNcGWCZ$CQs zN5{NLXem0b>LzqT+J{bhQ>j`naiF5CDk}75kTpjaz1bzYq^ij-I~U3`yyAveU0ri^ z-Bpn{m&tUb#|>{0Njrm7c(BVqZQJY>X-?>x9Ck?x?EN3ssXwpz6|e z8%BuBP^6TNqI?BR&}6lh^_$30;)~wND+T0SHuwWn&lg8_7S&ff@5{Vul&YWxzC@~V z=x$|$P($fe)ClqXzZ5oBn1h^;u75`NDl>}^<4a~TSIC<9Qc;yxcr#Ab7}QMaf|~m> zsJ@0;DO-WsN}r>4zD%lTQF~=UuQKS_VlCKFYK1!cvS^rq;*=S6m!3mCq{-+JDIFzB znP{LdhrULGe0e1r>{f^Pj+SIYOESj4XWa6$u9AF(G^|c_m@ni@P83GNRW*7}YJr~j zMNl1uM)+b&^nx!DO(aWJyQyfDFPUrs8tu#jjq#;^$@Z5C$13~;jdL~L)r+oDTuqS7 z!n`W&K(;S~nHasM>@>=7HQTq6YRyy*UVJ&I6PoL@^WX?LPYoxd`I5;NNN=Hq(o(d@ zS3r+l=q+Wxptq%~Xt7i#jlsuPM7tJfsWLN_ccdO<@BWjq{^DT5Wv-UHde7AgSMR&} zz}1JYR!U=--YQogxmxY&W63rR*SO(YSD(1ba<$IYdRL#i+TiLlR~ubzl3rzQ*{(MG z^k%*Zx3~?ry5-N^EYBCTi|0q$?NhcD?UxRtpQP*Ppj2@ZgSIc69$nBeUrdRP`(n{p zvJ+}&s`g278ayRspwq6-Nbiyr_~PmO5&FZIRH8q9spxaEv%W>>Yjn<+jgFx6?o=-L zj*^)v7y5#B^C20!=!-_DZFtES2QQ<`z9e)9T~X(9lX)5HOC>Wix#r76W?`G9%||3?q@BUjf;CNkxcqOte_;XTqc zbg#4&#Y*c@J6G-f`Y~yfb#Sweeo16sl0B@u$7SMh$i^zB8v1Z76fPqQ2KaMYHAbd;>jr#c&QJ#hR`vraF=yAXB5^MChbM7r3=$J{(Hbbj?U0}NMUq3ceT_7wfFBwwJ++RY!K?~pG0P=asH`jI_mD9 zfj&b$)XwM;SC6`i_g_i7T~vGfXCvFNkAE)w0X^xTkA6l^sf*Fm{sm+w(E$GRjCE2KbX;nJPWTrwl|JaSvKP=9|Ddn=5*@Pt zbQ_+Pb`$<3{faJ1W`dX8c16l|cCjnN&c6DpPlAWI+1q#%!E#sIH0*CzCd ztB{|x6ZyLh1Ej-bfzkyOB>BI=AQjMxHMs``E9;C(O9N0D=|xmlGE*rhWsrpg#C>h^ z!8|M<(2vQ?r5vhq#4O%klRBUZ0V!0?QdbN}NB(c}(WI(o5yGWvWL2bQsH)ThRg;FG z>e2*MLz;_f+TzEsmb4p1NWY;-=?aPp$YRF#W-ulydl=P`o~Qdi{sw8kLh{Itf4=svec zD`^&4Yw3N|*2pgY0>&!*5w#1*XU0XSy|Qw1*z=|8sAE6@)!xYY)sErF`EqO;>a2DP zk@Nc_~Zl^a9F}CZS!@+vpoL zhY|v#kr}mn2F9cDWW54Y&_>idFteoEKQI?vA$vTq0L8q;V;mUtoiolq85o1ckUbR` zU!ugoL{lXjsPCt2u;CzwXt1lXf$22-jVvWF%XDF3CIsdqGn0vde86Kxz3sJL4va=a z(JO)RCE2TiDJ5A>U?!SMbw^-UiFRrpCi^llXD{QQ;chp~4a}qALb7iI3(*R+H!$RT zN8bm=l<0@R_!8v>CYNYmU`C1d2WFM%Kww^p4h9yM=ulwD4;<1m<$OCZ2JVH21LKjI z@y~(D=rB4Gn2OG!U$uZnzq$I|)zQEV+Wk%SSYRfqzL*VD)i&rvU>4ca=#(-W6$a*z zWiDp?yAqfOHxd>F7N8%|t-vC565R<5&tvOHvHHF_?2B0Xibb7+TG68y zic|Is>Jk)3wiI<$mW8?**~KR8u5c&n5tK;7KhdMgcBTw0kxv1DU=_s(y@y1!?@-35P2*<>#eCXoOURUXV(^!{;PYBubXd zj7PccMh9gwlRi|(1m%`!tg6Gv#!F++1c|xX)+<2;G&JQ`6)r-yt4!&AvgNMcbG5?N z`>rB_i_6q)Di$v;Z}i)}R*B9@HvWuYZ4s4=TKZ5~aH`d5opnXs~o28X|Q=LxY3%@%>2j zj9YzH+DMipeS?O%8ZI3tdp@Z8s%0;yV)2w8yg(UWS*nl zIJY`pnnac&%|;V~<7u}aO;lEZUY2gzFjcIyoHv(UO>#Ba)f87#T}^W}-Br32&Gcrt zS`?hQpSQ8dGJ~^FN3=XRXFua#U-({dKH(s=BDk=m;rqdS5N?el`yemhHY$5ts*-Eq~IGN07ZE$LdKC#_$R&WO4X3Fc78LfBqsjCga zD`}TY^)qEg8(nR3l`S2hx;Z$T9!6W-Y-@>ZJ|Gi+qrA=47p}Iu$_dV8GJnu+hccs` zuD*1&D>$Ea<__Mi%xF(=K}q&ia8ZeJP1PNKvSty+q9kb=8s=)eG?(lp>3uXoT8AdO?Ou^~k)=up&{XLpN|!F68Io=Ih8XYx z?}AD-&=RRWS}NU-a-=S3mz0QhODSlNtG&`ZvhQ8(E4z{hVh!1TWnZBKWi|dCg$EVh zK>1~}X;|w+jsujnKu4t>=vdiYszcCmWfRc}X%0FmtwyJ$o#>2o7!^o`=#R4bOy$9q z=Jjvc=$|-BgJ)HqfzC8s}zAgm+nS6 zQb)8y8i006<3DEn+bzx}+*2-#wOfU9mF+-ZOZjN8bOC)Y1+C%5R=FH{v_|{O6{5lD zfLr}hdYSAeX#qMYZAJM;cJWSlSm7D;i(CF(vevToOI46_700&dxUzoeM7i*TT&WYC zRF;NLNpGXm(x>Q5xft60gbI|IMfjr}k3ZjPCHzxi*e7iLQY-YA^awgH4M7*A3Fx9U z3tf`lMVF;@=&JM;x>hch8J|Gc%f+L>EH-piBeNL)Zix32-jov1-_o<_mXwNaOK+h& z(kfIeAGS~5LQb;O#e7!jV#;ovI(`kaJSt7*tQybW~qjilU_rsDX2V+^^x?3V%n9 zrK{*3sniDEj+Sbn*3yIML8%vND-B1nA$csqG~}F(xD-9C>N*rBZ9-k7Z;{)H_0B8mZN?lh0LuO^;cGG!^cD7 z4>{ozAxWs>Mh*{EZirry9zdy5H(gbwTIhkt;ysmH-Dv}nV8zDjYmX(cS%ZH-`VhTQK7@8( zqgl!hGU+#^<7Bg?YiO?Y5Sk}d{G88JrD(KB>WtnpvWo}8w-ruAOQref9ce3iS2~6= zrN7ZKsp2*c*Q6NqUikQqdQTe>=;^u{57=XY(na zimsqtDu?B;AxZb5JyIw1l{66LN-v{t-F8Q%MP$dM_2{^(6Xi3Q$FF2(l-bweP4N!8 zB~{$PbF@yDxCc3B3U)!xnSuk6Pt{c9FTH~Tq|GQ$+J}Oqb0|a#+{t_GQX~ouHTz%j z129ZsAJk47i8@F#QAcSRdRY1#b&`HTokKHOC%-Ql;X;p=sEevmWZk58s7GkbNvB2)v zMAxXHkYU0nH9eWrEAl9A#V4 zT*H1GX5)H#pu z5?+)xqU+KZs7U%1-H>jf$~v9O+#lhRxj(8%=KiQEnfv2eH>;~FfLGhgF_o)(CEJ8O z#7Ojr)C$dz9z{zkC$lCK&`xC;C|CLz6;@8AnujhbJA-aZzVCTsLze}wjP^d8Agz_KN+XpEMi=NXaNrdL6|`OHnIn1G-{!M`!6~2cyRV!e2KcQ@8SJ38aMP#k_vqx78I>VO+&{wLygN{}UC)Kv7cJA9?9fJ(lW2 zsIjtVP>eJJHIb&E7SdwWQp*03@h`D@Je`jb4pbQU6K_3BjZm`m2uhRsqDj>g=`jmU zR`wBkUHS^WA)Q6Dq%sFNPL#q>hSU!p?GQ|Sw|QTh>Wsh+|@w>rdwSUm$-`3%d|ZSy$Qg4@)v4f;;%jrK|}p_|fT^tWVY z=c!@(t|tqrk!h#IdZ_??Dh2+`RxQ;-pGgm+jnWXbNt%qZYvi+7o6(jU1;{=J3sv_0!jptl16`HO z?5;`ok$G#HHGT~FNyAWJ%_1iAE-IyLCu%GmK=(-ABW#W}g9>=B9ko<84&7HX!Y14X zTPZw&9(2{l)kCgQYQ~mKCQaE{dQ6gne`O?*YNP2=do)8DgfgUwXtuNj*>lBj;cDq7 zTI(uH^8Ci#FI7XINiEPuX#mQWW}wZ|67+?uoswCsuUzFxD{LC>6ZfD4(lvBds`op0 zdaZt}@c`sk%iR4bC_s7@1xia%khBezl72xENi{*LaEwpOrIx6Vn~j(Hk)_$ALspcTUM}*JzDNGj859te#HQ?jij7rS>r;$>WyQXPm854;L+MR)ue24# zNS9F)DeyGUXHqrPQfh$ilkP)prB3KI=@GO*>W93w&7#^b!${F+QXLacLX)L;(3Cpq zEcFUBP1!FfUAm5DNVU%J%1`QwmPk*arP3SdU1=lwSlWix)G_;C@gMLLg%u0fK%{nP zqtpj&l18Cy=?%19GCht+W_G_iRphB_R%8`bpDRCUCz-$WC$b~NLRed>@&|Xi^e{?v ztApL@WN8%DOlc-sF0Dl?q#w}xZuW`v6WM2y=TBBds%pcdVoP*fdIFttW!A&FMFeK@ zKzx6eBOiT_;|!`Tl{v?ou2O3hEj^9ymL{Nv(sI;DI)F}bWNdS-IA|R+vk3Z&jZ12P zQr*ltUc`*MpJ%&0ZrY7P5yxZx;0rn^R@pU_C{?|{2Y6B&WSxkk-P4yCZVOG{DX5~W zskZnI;e2T|S|nwoWzuf+zN^oqBV_xeE9fUz$E32CSvyx(rFvx6#h^cV_DAI}nuW=` z%=i~tLe^M1YZ_jOp<&Whbk#JRWpv$W1M)~aO;%*GLX$~%Om@R$jjoYNtx>9!gwmw( zXp)g#Y-rsyU1l5oZDiKYy0wT!Fj>eglkGwg((fo%x{2Z?^UzthSJK0@D}Vc+9-*$B z>vNjE{&!5Z!*$x-u?5;#hX9lsn(aKplIoJ)Fs_i=b>KG5>uUR zvK7eub#AkL*(_ilS(#xb`T4px$ZBxJ@c6>n?L1-jAJl?8Cb*5_Jh`-gsE92~UvKGw zoG<=7jhu__jWN|prpHV)P+Eh6mYHlnGJl<0gH-eP+JCaqAtnpF!So_D8r6gGolO{r zoa=TyfjX%3Kr~32fnJdoqjYI4nj!s!mPohIW+~_1dC%8hs_@p>L$CHvB~lzr|=I zHAewc%p&wdfl?Yu&_lfq`5iUYYPkq&sM`6nL9WEW%VnkaO*qnkHj& ziYzW}4CA$BJ%GGDO~Wpzr}Wsu9Ua(Ah7dRpe-biHoZI~#^Y;}pE5>LE3R1@`R7%=~ z>i5iN!@7zZ^ejXXcNi;shM(mcZ>USpR;WMfsvaXyyp)C>?-^%PJ_i#OayFqgO{##V z_e`N0jnb91K{I-$lRbq7J!Teb6l##Vh-?9>t4DCN$wI&!cjf+f@aqejgoqx(bCgsj5N}QV;!RLY0-3EfnHR$9i>RW zpqJ8Osg^Fq1p(9IQ6ieE>Nxb8G!JD+S!lM~caF4=Y_9YNT7c~0;v%?EVdY?-^;TLE zla5EVr<*%?01DOiIT3|PnJ7})ZQ5;0p~r0$m7Rfxm8P0&`p!U6(pq${tJ;T5^#GZM z3G*K|;W6gl^Com}&UJ&XkU5)XnKHhTOWf8${$A6t4GNKZAj@a6r%(lHqG{)6vL&XS zw9&NFcXjj1*gh+#tttOSxI-#JJ0<_JKI==V651uzN4uqVXphtz`D;ge9<@r&;$Fx= zRZ@$&y^B&O8-0M%q_0u$eMEN`pMr&FO*!B$pLJ1+Mwg_H=(03)VOnSQ*E9mt*trdj zHh<@kS-p%_{io_&ar}$_WM$O*;D54_;im7g|76Zw{vdNMjeFIp+NLEp=kW+G=d%(+ z%>QekC=E&tkfmp=hm7W#Y7gX*hL~)=$tEJNl#Wc|+;}&eyYFzQkG-?tBKv=sk86Jg zU1FE3$o}eYMPKIYb(MTv{3{OaM}bxndbhHVs~%?|tBQ{cL&aRNtZt~Z6^C}AP%9Dn zS7l*hlTi!gO-@AvkS{p{jYfXSW>GScfAUH)Z#Cwotcnd=&B!6#UH#un?f3whpA~zR z1+4MU9cQBetzTc{T%h@N||;aj{=bpVeOF zI;f*G6glTHypEjn7&f4Y%4SV&pjfF|E&56gQAku0i`o%6mo9tKWVKC?i6}yP8%0U$ zQLHU~V_45L{L_@{8~Gy0q%hP`s*NT|%}_)W)2@S2Q=?u+&5Q=4kPb#;kpDQN$;kY5 zZvN%X-?b4o%R1Tc5M@ixptq1mY82_SlBM2gl=LzhHzkGj{0xnsl8*jBQ&lY=<+G+q z_oK)?X37Iml$3@{;@rF*{@TUc2xAP351>WTG32K)=n8VKqa9eAEk#)sW5pu5c z@DLiN>XT@acM*&A5^}C<@FsFDVXz!6P`eGt-)FC+VT(G<#Fvi-BWIvXLv?&+u|7b~ z8SG!6mdf^_Sm`uMkcv<*scc=JHN;oQ^g5&2%AP^aX`ADaGjJ}h%N4UL`f(8>YbT+{ z-^}hOl6AI5JBk;o~SkTdPr&G!*%Tnwe<(khFbB+CC(0 zACk5YN!y2Hwhuc))CMAH1Ch)I5)@`;GMU*`khE1u^U3N<+A1V%6_U0JDVuh^q;Js> z$!ry+^fB8Rn=nN5HRLg_Xl56I=1a{`Qw=YVqJT(Koq(KoaJ24GCeyl0T6an7E-j?T zFiGn!Y2QG0ak182q1Ii}y4N<7*1AhtcWE;dtS@QZC9S)pb(gg6(g}JDk+kl0%#^vv zgB4PqAJqwC`u|qwWV4ueO9#85;c>$qV`Q} zbB8UTl(#a#4!f z{fyF^WRq2H<+Elq$wNI+ma2>pwzcjbTI;13DSs-Zp$*bP^qKTN+9a9bC0klg=GWA$ zh}k3jn-(#XU&(@$nSCQnGWT1!pGe#?PSDL`cm*i9G*yZP^=V-5~Tj9mox?qkuo1*{2MLq zAuQF~O!^QCk^I{7Bs|b$P0{p0Mx9ZHWbTFfgH4t|)=L_QhDbIlHN;dGqmUsPtovpZ zHOgf9$Zs^Toqcw6CgrNJtepv+=QBxYQ2YJ>R^+aB22=YneQK*!T!ld_*T~XW)lcbXdF+1;J! zvffPEbm{e}Q7^KP4Mt$%G`EZvz& zOVyFzK9jXZLHmu&q{AfheAY@bGl@N5s%Fw5KN@v2J&qe`VI;LXVKOZOvWts{nc1B* z;T+TDl99Sd>T=m+>LTTu9#>3u5t+Zv&3R!G68G=S(hIr=$UIUU@|XIcAm?(LhOOMt zd8^c954u?!SO3h61IP--18Da@ne#r%C^F}5mQ>`tTd)CDRLfjcLpl{_^DO3cCwy6| z*M-APsTcA@nu))NywYOiCml!anwV;ES92(3R2OxSVo_wQ$$Fy(u|;fAlTiz0>rhK0 zyEqrNQg{Rniw(KMUXET?7T%48ks6^_r4DGa^cb2Vy@1+xF|(V5A_f{QLFTV>bKd(~ zLFWAI$re@Zf6DhI8to(;-F;T&P*Yik{1c4UclUL)%Fjune2IqTHAHNq?9sOT3-X>b4ey}Z=Z(tr z`1d*m_?xWJ!X{7fPF`P1wY9=ep*qqK zGu6y$88UyJoAbuoN;1!Ujbt1CTUOKWOj-IJIos!X`gH&LjvGLJGCNtJC_L5xBbrRFGH>V&FD15i~d1yz$~q6ldTij=ZY zl(Y-gmhw;?=?JPT6{42N=AFEF4u%z0Le78^jhq3c9cr!W;lQV|;FjAZ2#_&`J9-RL>#LG--z2y!lQoQPgfHX1osIG%zI zDqDb@>((wq*OYyXu1lNHEompZE$vNUB)cQ#6BbJ+kn>jldE{Iw*6PXj?KO{fC>ki$ zLB&!_Z!KjGca1=MCAOc-7M5d z*>coa`ahiAcX(7)ANKn_$s~k6DGWhWCZR=&gen#^BmsgVh7JN6nqUt_2(~@+pr}+6 z5H+9(DkxY{A2oKwh8-)xiXA)p_?Ywk-HQy&Ip_W7-Pa}a@m_1~GP8D_Jv)z}6Q$j# zi}We#CjEkXNcBdr#g?*BFR2$gNjeLiER~GlNbVHTCVZMSlj1(oVpJrpMFV3xQ`$y$ zmh=)DB<)9M$23^_gX|nBbtI>oQYSP<@{Q+;ebHEH92zIhLE~dOPg+KHzO)&YNYA1P z(kEz|bO>D(-OI-r8AVrCb}G6|8jCKE)=uN?pAF|IT#m}42dpoQPV}x*)(0(<#-JOe zE6`2S4QRRaBU&kS8O{Ca|@yA}APYpZW91Ufqzay;2RCyU*qub)ez7b!$yFDpqFuHn(1MveLv_`@yWjU`{O$tgLv(=4ljVt~*ae zuESoBQZ(Jo=*aXZH0w>n56C7qD?)!FuZPM_!$*^~9m`rad>Xn3B@N$&o4y^dgV7i8WyW-CvKIB9o*4{yZ7<>jpI(~8 zpO{7yrKq%{ohUHZ^Z-hTDOIW_ zON%K>dY!DV^fAhhsUW7pnEFZIQm;rlgin!VmvK})HK-n?1 zjww)Mr6VX!kS;)p(i{|&7NaC-4N8_aBfp;bC`^%FK=q{$Q3L4*)KKEtt6n219W|C( zqb5=h6soD>&7F!;m0gR{q)L=tvz^ktC_~vNK5Qobj>1yXWgJ@7?4n{m%BnuAoddF@t{lHz8ehe{7pYHzt4+!_*`QMU(4M-5fp5xFCl{-~}# ze@;vuVwoRH-R@^hT*cO^IFT&Ri!cjIX3{H^-G=h{W3>S`0=IWSNT0h{e zD`O4u_M&&@vW9qh4fsp-Xt3J;g{DjCSF)GAl5g|*L(W&SY2raD90y;;@q)GzLs4x0 zYLk|lC&XoLNoL1oZjZWx%$44SQuQUsYbZ_n4W*m>+Ll+-85FigM<$n&V(w2C(*AZZ zs*YMV3Oz4PM7yL*k^93#SD@uOiN6|IeK&-<+3Nzb?8&CR9Jfg8zctEACw zLhcCXA>_^jo<;7M{~gpo^}axjq~DQSZJI8j>nJ+`rAhrzx@6(00$sEs$8Y!qte#)8~=*0m@{*>ZG(bUX5U zi1)#sQZ>r+N*PV>rMAA>Th$*GNW)Q~G!gZaN|9SjeN?LKM&#DlZD@wFm(Wb<2ee&k z;$N4@pRTfrv_QM0Ht1!kJK8PvN3TdD(W}x$=rw6BdRC&A&(aI%H|awZ zDA6g)uh3?|4XL^I`VU$0a#Qo`IW3LJ5;wTjs{^HOE7%Rym2u~QSH(N{d18Qmbm*|^ zd66bA(=#t<;?be}>%c3jagh0@W;g&l~Bs zI^!CH`o@$WQ(;W*7;`4|0tx;e8ZUy02{mXNa`#|8joj(l7bq>^AfY5Rn7!Y+il36+S@ z>yfYp%|<;{@p|NLyx5HLlvSg?(k_%Q?L}uMRMR%Nf)kpAJ*WsJ2d!&fhTH?J=c5L} z8cO|#p}Q606_l!q-=Z`rWhKigWumZ@gCf$IC`+1*vSZni^}w58o<*r=CnvQFO*#%% zR;KNrg;wZ>&GJgJTwPjPk1m;PWt-#bZMfeuy9#EnZg5vqo}ixVJ-bj7eeUm}rqY)v z6gbGT|GbLrUwWW-DBxwUuDf2+1-WY@r=g&hX&`cM;RxiO27Vz5Bp1>4CX|qDGjJP9 zl(wOu^d4%EJeqnxqNd5yP|_Ouj7l5(FjG7k1#}C>aFnP+iODD^%|uDk606s^%qENu zFE}rqGf`jZ8Z<##g}m-j zTD*rs`ieKPiUmH!wOo2^(l3WuOG9 z14@+oAa77LZO`H!M)#fCI5KOg!LN0PLvsk5r&?5Xbn)Tyj*rRQuI4x7S~TBi$2->I z6yy#{#v^xCRQ0sJtDdBKlIm%TIYbpjRg_dwQbk>YQ$0!bB-N9w-r(&vGtr76GdQfg zlfeGh4bHpB+yUnM$nAmmA-4lQfZPuFPvmyM|01^oZgfZ8L1#L0=W53ychK1uHPQ4; z3DMf~m~LknirNh1p@?)2%9X~WJn3RoEX_qF(oz(aZbtK@JJEI0gB4tNN%vnNa0fqo zkXusww~^lCcjGd*U;igA%hGodP3}Cpt=pQ1$z0ktu5_OIe|NG#s;>VO!Yp;0b1U}S zJe9`PcURnRBy&d&52F5>yJ|E{&&PTn-K$ajgl^K>RBuzFcUP-DblWr0=2o^;=c9XC z)sX#;QnM{^f~oUys|9=y;&nn7E9-+Ukp`nnC7Vd8bUs;BDn;`OLbP3jQvLq+ zwmtjPOv6#qJGlXC@TFAt&}n!Vk{G_UT@PR(=e1b z*>oi;mR6t=={6LdT+}k)d!NEZ3jacpY1X9U!<>9dMJT^?G&3^`h03gS1&T;JQEO=* z>MvQ_rtet2|Dwc$ru0XS-emB5LdKU**6f+2DtJr9&vV!mJWZ0PZ!BN@f7Q2f)R4J9 zu66*G=xR>zQP$UTD{X{IUN&VTdv$}`Je?4i{ZMUX6Sy*QxDqee=jG(MiYKZ<9$6lb z&j@&{P+xBk`Vr-O2T=c=b>D)HLZ3cmqnwQF)eU(;@7REM{A08YRvuP+WEzqw+??r*M`+}~U=4Udg_L`)-Na({Bg>Wz+NV`4ftCijO{ ztlk7=HVYGx&$m)As<0F-ldeZMNw*^R>xBD}*UsL!-6mby{~L`QX<5Dhuqur1!A(q4Wo7DFpSbE?^$vYnkvnEicP`cTD-V(_ezT0x%)%tNU0ae zVRC!P+)?0uQ`E{2#MN`(ef~i9SHMbti!1G^L(Tt^C1p~`k=@frPsDv4-I}bq8lMnX z+PuU@*oACVNggw^0!1cFL%+n;b1T{3WF)lpYQE6M(huqLxBua9(Q8R> zBJ^y&YS*jSWJA|{``4~fc9S+y+Fg1a^^jgfJ*Br%FX?mCb%3?~1=*_`-240AYR>HI zA}(m2U`~GK=!%EGy(c^T?LBf2l4_4qBjqf6o@LpUXabs7X=7P{?9~ks?F?=tbN9mC zhpw1uW&S?6Q2ZOY&$IKh98gBBcp!4$-Ht`wqFb2AKWLarn?A?tDfLDpqzP!GbRBZX zi4USl%05D+lJ`8<{@j<5o!|_GW6(@#KI*#2W??JpChbAprQc8wDf0#1bm=tIODaMA zrG;psw7p{gHEiv_C2$9$p%+>EJexpI6qLpycffruatGWSkUQXh8My=QpOHJ@Zue5% z0rxoM4!9R0cfEHja{cOA#G$v(%3k6-yVRA<}X*RC*YdNMEA~ zQj=GBo2A}pk~9HLmaa!rq_2INTp&I`I92)xO_LhE%JmA-}y!|R|gBnR^qsG!?)CBq5tqYqfyc>n27m+)w{|lul>-0LSoHPh!NK;Xw zjsfPQW>K51?I@|-^df2~eT&>rN7LUpdNoX}xI7w2>XRQAdIft}sqDnpM&gDkE$nqk zT)kmMmfcygBT7HsN|8HR+Kt==tpmti(5knG9<9x1JLGN;>WADV&B-W`U?W>-S)xX3 znN*GV+MMAdlq&s*A`*W)(93dPsyBn4c9ADk44KC~bs?~JZurwX#9|E~a}Q-5XG#r4 z0^UrMPM|D1VXD<%h)$8NN8P4bwi5M{?m{!9$5Go0t@LHo{lW<2`_@V?%=O_hZ!z=J zi_svIHr*P5e?~o}MsG6wV8S1KR zq1DsIY_-)}Z1qg`%HZ>#+wW~8bQ`(55kInJH2Lq=ZR94SB(E$h;5C2GHe;FDd`xJR zMl=@L*xcZ{$;`Mcl4fPM#bq;AX!_3+ZiIZjhMtp7e4j1H4$Bsx#Ai$^kiELWc^8@6 z3hzN~EBqdETilP4+v0wX-1ln#Ah*SBx|dbn?Mbtt+vN5{Y;qZj(BWzE;x_B&khNAi z9=UC5DRNuQ8{=DOiSH+KH?npf67W7Q&gFdzP7in=M)Rae?#*`-%GQk+kI6dOknT_m-sn6QY|eFTA* zVnyRk4ffLT3X|P&Q@aR7n;an9ZCR>ipPTeverIZL*{>!Y_auFE^bF^DhiIDCbFybt~?l58q%!3Ko-)h?lEQAtbU9l(pRWU zuJ|joLN^3-(DyG{pwN<(kI_(5TE&LNylE{h$gv<7HQ!+BhmMaaA|12p=-$Ncr**)a zLOpLqCR&ZGr5oIS;9fHKi|L=bxxU~^-J7ES`;yw7N2l!qeThYfXZ5w zqXwVSFXQBL^0imizaLx4TcF zKjN}fb(7RDxe_GhAZzJ{fL7~#vJmq5d4{o`6;4NK(zPg4T81LhI+QDILB-Ne*SMtuh{u3Qe zXHCDN=;+byIZpYRcQ9&Wn1&LhE0HB`aNkZ{Pv#bL19I#C&Yyi6Ya-9ZH934dNj52M84*YvTUgfK_Z8Dkrmg?i-b#sn;!Jld%@vW9ku8Ps!@_ie-zW z&>!s7BG$G8N{aY94^J*VatO^P%!q_K1iVL3vq&zois48xYWydkaX}QFiy{S;Xco#U z*n&2o?1DY$3DjeL4SE&X#M}^)KRY_}YZqw~{wrbqccZlVndp0zK0gO#{bh$R*3w$cC^z|?2;JRGm!hQ# zZ$&H1d(-44v`X1NwD>?>V|#UjyHx)trF99vuab}bJJD+;bwNi;v*di2O*@>sgNlKK z?x12Mat9TYkvpiEh1_Y}0(4}A33^u6s<_PU2RD(qpTcjgSh0+){X-V0zrTUpZ{t5i z^_2aNQl!-XG9ywabYxOVdYg;lGPgaSNanWk3z2K{0PpiAit?i$~r2{Pd2mNZO zZTU~#L`;15&s)E%84pVGO3-SuzcmwEV)d+5a;S{b@&7XWp;8|SOZ+|sQ_Ze|}suI8(}CaKN0$Q{n5 z1%ijq(sPmfcnAB?eZHm0eZDs$_xav~+~@lua>tBcA=kzJM(*f0n83_vW0Z;9=~5@; zPL~R-RGX!9kvnmkj_kzA=b3LXO~v;jcMi1+aSp}sKFXH9Lb=lKsH@Z{G3a%ZS|j)V z*uU4xr;xcrUei2f zcV)T_Ix;@@R`(!t?{sgJ>E-gVpP1way%wt4D~V;7@=%Uch)$3OqE6B|s7e}vj!eXz zw~md=T(3Bf%&l^h<4QLNXzkZtM3|_za5+lRvR9#CYa98CrZ%R(t+d@Po9kqHN}grs zp(fH*sHwCZxwF7c==14TZx_nbiuylPB!%k*z2bSk6|d#Q-fb>VCLFHfsi=j{-`1ee z{=H223zWLwTKtQ0rM4+YzYA`SxT8A{OVfKZkW#lEj6`Lj1B_+i(JlO1_r|R|Iy`)l zcPp9uNKCmJp~+^z4P2b>%=PH{wknQB(-A-9M^~E4Q%($cRj96h-7&@Ev8-aWIcJ;xi`*%6LW7_;@k7fRnLaXgFzLyE zC!0R8>@4*052o`_;BRdNFN7Ak!7c2}xXf*L){(i5!`;Yj93Db$0wUhQDw}Kx)Zp}P|+?tutsBX<{gxt+R zVbnuyTce)RiOAiYcRD&r*>THU_0h7o&)D4a$;Mqg?4;)Kz*Bbqo16fBT_3Uj7HU2Xvd?Lrfz z_s}Hi3lx=pLGGS|U|P^yt}KjJNI7VwbPB4QKC=4pgn?Df;Q%#DgHjJv z8n98HhoaInv|O5js-&yYcIi4)Emb1-oVB|uQrFsv2SH%EjqDfG3{#^F-gl`J3e2*s z&@$tgRq*hapKVb;Wf!9U(%oo)^e#G6 zY7>baWJJ#4Qw;Kc*RCaWH=&zKls$&rJs_6ZJs_@Lsq`V)e5r9(&|4rCR?J%;NDo}4 z7r%l$C1S0%p(1G)Dwp=7UDDrHFVE^V$!6OvWuqeL6jUw^vn=20U4q&anxe>F-Egsd zGnv;{>(&k!=x>Fuq6QO9zndnRYLQ;`kK5?hZ+&#;K8x;gnX7juncKIIMsD9e6J={x zybk%T#cJrTnZ1nMUC4i-Je786!>&_04dqJ{kh?Q^2`W@}59%kqiK5cKC@B(sG!OZ;wYNg|MCw(Mdj?diA+%|SbI52Aye7@z;BjU=HnJ>a0J6|z@1xKFVgncKw;MsCM; zQCvNjEhKY0yYfu$P%TZ5nJ6eTK@~Y9JNQ>y}-=W&PzD77) z`U;Jf{z5~wPiUM=sniC!{o|=dU*y0--(3|Ch)eTqkwq!%=BV6qI_RBxx{mhu#;Xy0NhhkuRIZ z4MQzdaYp+Q3} zI}R0&GWl(x!3~M7r;`Px^N^QqWozT=CFriTSI812JEKXK0^Qk8#dmriQ!)t! zrRB(NUN)oJ@B!+zIGHgwx3-f|x>Sj}OV9eShxh{;Dz!L;o-Xx6Bc)Oltg_KGWz-4J znJUTb)eY`lct0-7)xpm`vOJx?euavq?~&dA>T^s9UH?9W+#h~6HB`qmx$nunQz^}` ziKU>1QYvaB9fKN6tx*%H6Z%%_iN2H0KIF>3q~wx)|Lg%|RjU9~Yrw z=>}9Htw9r{ThYW=HYt{sN_SB@UAhm=kRCmi?cYqXnlLKuM)Rb%(0u75v_Sd-1xxH* z_z|T@hfq@~;WRd~Qe%`UWujJ6Yt%#Pf_j^Lp1R19lftu5p>!@PlBS_^q}gb=vu=?@lUld*_xbfikilv zfOH{Bkgi3EQl-@^w|WmCdv(LK=_%d$kwzZZ#AXzuM^RlFw=XoGMs`L%?{u5yp&r~Z zRB&{$JM5T4=FaRZ&@wfD6uF04zJlBh()+C5XdC&j$lV~FQb>nWb}UMgI-+Fh6jVmOh2tL%}{qfi+PU>9KxHSeM(rL=B{b z{!Bw^jY4a7_27EmP?)-AFHK%YX)68~rAu7~@YzX|QEO=)@~UmZn@}*OWa&vOea1>( zMFHsxs~5|XVp*~;{!4L6thj!xxKS)?9Lt(W)*=)u&4?*8rj}CUA}&D3vg0Ld+v;$s zPuCM|4%@`kE>qeyxT5Vqt&D=CDYz z(t)wkL9y)YST`{C zNJS|XHHu}8V_EJCHkMpUyGkQbk66|-mi3aZrnGlmsqdW}D?U}ap5oK$ioHIu($ght zd`7HZp0tUquk<1+jAi{|S%1me7R5>jO1?EYOSB0OiWQ$NS?OTuYjjSmUWxQyvI$bw znOvohWm96=1(Hp8TCDWKSn0(tX!~aqz9d$BX{`7%$r@iSS-n!}R3vMXZQ zY{}Y|#Y*SKO0SY^eE!w3;%j2X*Gksdk5#Oad?vR+vL)UqtwndnN;kzy?~y@Dv5NOeHk$im^|ng~$#zKgE<7OF%sdn;eK=P7h-72g87qAZ z`5c!LKCaLjKOx!7{3llNNy+LxCD~}6j@7G{8l4sNo|SAY&&RSCC2O%OmhFz!d*#R* z{A#TD^;nZPB%2vq!Q9~XfH_Rg?E%N3x-y>OD&IiXNZN?9rAJY&7wQ@C_91tDBG799`q_0K^(mIqV?LBS^=e7IT2il;)T<@+YDv9XQm>Y@8cXWbk~+1dPA#cZ`=WZaq+Ttl zS4-;El6tkIUM;CtOX}5eNNnsiQ;L{w0Wa@Gc}uFQTCI4N8(452II0 zT~R%0I7*S`p!(7})IfR?HI!;lBPnq>omy&#nwb3B{;;XSOHfp*MDwI)(R}F_v_NV; zf?h54L5rk`XtA^mEs>r;<D2}l0Z#wWxt~+$fe(5+G)x=kuUw@XpvSBX_{gH(++N;T*X$s5lRo)kfwq&#$& zRDw23QM5&>LU&8m=pLyC-79(Lai}Lne7H@_L-$D~=zb}Rwo6qgFx)z;da$G(EU5!a z>cEmZu%r$wsRK*uz{qEe)`JzQ2TSU~l6tVD9xSN`OZ4Ewf3rdzSeZJoqz){p154__ zk~*+2ss~Hz!IFBgq#i7(2TSU~QVAV%o)ks%r7E;QszwW?8nj6A=z5E#$hmC)mWX+T zrARlR`qDk9f%Fn;D1Ct%Nr4hJ!P4=liF7JzD*0n!NSudKr41-edIqIS zpP~%uAJj}bb^@DV>15PgIu~V1SD_YCB|1jhiCRi~QFMgXze8}I!sZj{!BQ`@KpKG- zO0&=+X%$*5J%HTfF5g7u$_}EXQqxIvVCh7(LOL6*lrBO3D)D-_TDk|VkzPhOO9xPe zRBv+Kjo$6hT4nvvI%zVxMOuK?OB>Ox(lh8bsRrFH)%vhXJbns2Sn7i|O5@NS(pBhA zX&u@mJ%;X*_M*+wpJT@w)PW^+U`ZWVQU{jQfk*QB^L;*@aGgT+U`ah#QV*8Y zgC+G~sn$BMqz){p154__k~*-Y4lL1ueeW(&Jy=o?mehkK^li}vbr2!yAVShXgrtKANe2;<4k9ESL`XV@kaP?o=@>%NF@&UJ2ua5f zqqP0gL4-mbL`XV_kaQ3sS>p^z2N9ATL`0<$_V4qgD4H)-p#@SkS}1j9HC`ln?7;oS zVgxRc@=&={f|g2Av|Oq}E2L_)QmR3#B##~VYAJ%&NO|aHsRUI>QRKcmIooG$+?OY% z$bEUT3b`*&9zpKQlMj*m^5kFSzC6jA#=cPBjufK$(p2QWPq_}c?^Cv+Mk?Kd+&3$~ zq9$ZMUz%OW&QQgtp^!8Uxi4OBL}|(%Lg~``C`0-$Y9?h}#Fj)VM9rm(QKqyKwU8c0 z$4DQcmcAIcm`_n^kLF2((0pk+S|Htw7D`W`MN$n~EG1pShbVPG<c z(o>hP{aY!1PPj@+xs*>)>WtP%L($FB98@8#N0rhuXsz@WS|>HUjD4Y$i`Gjc(5=#y z=r)sIdpo>c;q$0U`UY)~nq1DlQ0k8EkVd0BrEAb8X(PHzdI@cozDHZ6)Kd0^QZICm zG#1@En$Mrh0C20qO=z368{H@UgzlFzrn4`UPDX(eYkM9_kgh?A((NcHJ%y5_8k8(0 z&Y%NJ?Psw4b6=sKNmyUurKqvA45dn2QHJz7Y9{@HqEhNi`i#^K&6kFw1=1C0p;Unu zNspn$lK&xGBK{YZOUKTl(@3YI>!cFoexW5OKsi?lR6g8GM`!H2}5oJhUqh?Zr*?h)Q4w@$w zq50BU4c@hTTy-K1=Lvj2Bk_(=JF9s zJyA20Uwa;mDx8nzNn6l-=?%0%`W-Elj=hr4SSmn^r3=v#=_XVzJ&cx0AEWD}#H;vn zzRDK31JdVj|HB`D&a;2}6P{FHx#OuwR=rGHSjS(YVT%~w}a z6VyX$j{0hR5i6Z%^-e&OrEX~WBFp?!VXBs{5T#3JqYP;z3RGFe^O3!}!3*2#G_t}? zra8#lVp@X|w&ZfD^+^=ml83%SDO-wB+iN&H*;0Z|yOsssvV9tyODD|QatNIt<=eU~ zxxE7X%|32N*iwTYxQ-i=HR@+kJLzroz5YVo=g21O2KN_j1J@s&1yp`qMb>V9Nzs9# zH}0^?rd}G^Vq&8K-7k^PB=g57 zT5%~{ByB;jW?8ley(Trdfo`HDDL}iVOHHL#Zw;EGzVQ^Y#0~Ck_HH~n`#IannvrD| zm^xJKc!dw)-pL6^HFQffHm;$&scI6L`+@d_rl5_Y)Rb(x(v)JFZ_-_jlJ0+%8rGHC zs~eb2dra~&n$$&gzhqiRmZx{cR4i?qA{tuKSHM@zeqSUKm!>cUg z5P~BUNZ4Z@N7gi^Bc%b|T6$Srixe-Xcffm!tRPy1;vd?SHrrYUm$Pw^I-rTtK-6rm zI@%@hsENook-0a2Gjbj0iTHX^Yx9oPlm0{@>6jJtYw1)JkxEgPbTi74UO|4I_&qF; z8n5Ku6X_Hbm4=~mX%=!@wjff^gl zLntJDfFjaA$jaQ{-j7zR>)ww+$d%7Ub+zav6U=v!1+-D#6<6wRIsb{wTV7ksij=+P z=*AJPT0_a^OJgeDe4TFM6Sy^JF>-Tq19G3tYUD<83rfUO?`)h*!~(<(cj7K75^jp+&7>Zc{8lMk z&ZwKN<+n=VYV;~PHGB}Aw2oV-RIeEI35QM&cvqp*m2E<2NU!;@ub6ZTKS`0YP=VA3 z6^0`;p1YoV)WX}*e{bbiOX2cUxNYz@ezg?df^J7e;e)7K6?dztZ4o*%Jnd8-!m@$e zs=~|BwvGIzNu@8M!Qq-yx%;rw9o$!?a2zTQAEM%XG%OrCE#UnJ4G-s_=643Y5vtb( zjg-zrqryd$euKt@%h1M6LGRq~PPE{zpf@&r5Iuv&sl~@=e3(DD={4BQZ?gSxChQ8& z59gtW&_q>y15J{?LsKN1@U(Cx^}1~ddKW4yLKlU%kllzbR(2=4OnL%cF1>|jNdKUj zQs&+4_-Bbd?q;tN-pObVpt5l0>HK+)d-$PtI0v1Ft_&BU?dYm-8F~d>6D~(5+#B?+ z)mZu=cSCsza(Cj-Me|g;2F(xeq(wDaV3}Y0FnorTK7yJ$Qe zT^HVq_MjV7`XjnA%-<~a*5Aif24y?Zif|d(J7{IN9Q}w^g)32$`?<&v_H8xEfj5VD z5)Ma|YJ3q|D=kFpq)K#)v;(aV@1e!(=vHN4pepHqXhZlArG?wMcn}WdF$?Gpl?HZj z@gUrr?3NuIeQpYuz^)H)^&ni1R-nz{?dX^Xxq1*ji0(jlhco-~RzJkmgK!?2jqcS5 zm!qxW(PU4cZQ)9E@L?_lA) z*~3z3XV7~@>VO`V3ekV067-bhqo<`x^o;ZvdNCYja=)OL!d1vt*zO zLA#}L^osO2dR6)ay)Gp^&OxNq8SRnIMQ=*iptqz==xymW^p128y(?utL1%q0Tx0VE z-w%fh_$AqsL2qw(GfPen|GY zvU=4)?@Or*`dS+7!vo@M^o?{I`c8TVeJ_29evleJ6ZC$Rx}u+?G3aOM8uY7lKl)SJ zjs6$j!pwY${#6!umMfCYs|$R(0Bqbmvyg|8qbAL5jWDH28&P`m97^9r#m$S+C(rSt z_vU5j&gbiXGV>YoGOcaK3+!s7(@;WYmDNLu%3ei5=^#q-Gq+P*{35%b%xbg~)yv$2 z+PuUrHM8b$RzLIL;ViYiO=J+IL%W+wP>D1Rh4L*cMXAyt&TrLtP6Fk}XEvm90mG1-`vqZ^2@P!FTv% zrDM>rg4}@t&kj#U6-+}9lZ{sCZZxK#jI8~;y#2~fM^g%xlU;?XV%dh6HpX;EK^65X z-(~xEx57tga*y;1x=*S>JEU6lxOCim+#nm%e`0!D>P_hf(kS$?G#l-cmZNW^d(iii z|2zy7Zf9~GRl&ELb+1SrJ(esT7q;m1w%O4b70AMOR4gquJ8; zXpR)v$03{)Mx_tgn0uh<(!hOe|7M8i5qdkVcqYo1R-$6*eiW5nLnV({z0c5c$*bX< z;bqI3p@h8$`HU~yPj}pF*-B)uZg9U*eUz-8{YKTVeI2@=t9~6<(Os4JH!gEO__fDI zx+^cHV8}*nN{T5trtFwn$J8dKwjsZ+al2U9EvD|F$eHeGmhM?Q_B6|$q3vY$G|OJ0 zYE<<(ADvn}i-yHCT>6r1gw*5<&KW}9S^T|7G)fury)m(hlO(&EG+DCAO_6MJ7lcAI zw#hA0wvN#}B0Z0~XV`*R+a8i;Rnn}+N{3}c7>m^#uFSWJBVrXtW)vNsNGNP09PlOE z1?fT*k(Qz?={}S#y@?VtOK58!L~5qBP5p}1IJ4|li$)44j9$8Lf_e@V~;-2Yga?kWMS-k?an8TdJnCN9H4Q71DuBHQb8svl+Hx`r1_}7^dg!hC4R%Gr4!K<>3np7v>p|- zwwZnl6-xE|ZyBMOkNQhX(In|*G+Fu+O_4f&#|Wj1Q9+wS%<7$}u#JuSP1H{ce$V)% z0yIgw3Qd+apee|&t$ht%pfKqN*53A+gE+NDUY8uS%Cast>bp>?WLcz35vBIw4;z1^ZMmEgY9{;Or*RRJ^LG*jq-!& z5K1l2Jjay|EiXgE{|I`~@&hRG&!aagk${c5FIkp!4$77$qt?XoEhJ=^HnYi-5A z{eg!5rmbA1Q1B3Pm!4igp5`~ajq}5x)jk0QicG)VPYda9E;K~4XY_}Xt=?DGqMqqb zYaywH)UcKoQU~N7D?J#s)z#kdD3npebjy7!&X@)(P@1-e_n?UM1j>?jqipFDWRrD6 zME)@@bI(a?boiQ~tLGlBGN=catx_%dBA?@F)RB!N_bmPixOa_Ms9t+MgWLLpz=2#cj^WQA@RnrpAGk!24ueHK^h z9>@DDSyL@jlLSU6orF@QVJJTH!B6sxZ*(6vb3b5o45N!r#8Cvy)xABWspJ^|%va???%v<%IX zZboI&Ml@I2ftE{8qbjNMnF-!@X*XGQJ#GI!f;9?n^4RXCl(9AN>M>z$C>x_WdM5v) zXSui6E$0etppU2Y52*khk}gB;nPs;k_fWN6s9}P&{1r8pvQm;fzo|F~x<}v4MeeaE z+fbTHKSt?N{raprQXkYzx)g<_D%4zh4P{D!21#BEsUtc@8i(B9&A!Qp$0~dQ9Vh*c z21_{&le}}Jp{Q6|fQCqSAoqBn-DsGy_mO*0(D!JBvPO-Pypd8%G)l@r_81|b9{|CL z3P+(yl8+`!52Ja~>u6M>y@g+*(Ng`!^m*;3jzfu|az45~Ay!3YV~{&DSclx1!QH4{ zC^9tQjY;Ff@l|mybkANXM-7!#phnVNsIl}gY9c+4no4gY_mrW}P^z+@QJR#T&PNwo z&g8l@TmDw5iopd@GBYnR)=t&SpKB%9FAsb0Gz?_KFc^qw>ly)P|6dpBzPw*!8l@MH9$)VO_;_mR{CeJqVbZ#`?Xa20Lyk+Hq50NEqa66s9$lPYT{t0z^#TLjN#C7puJvBN5x!vqo`rFyB{@Gi`~e5^ZX@BRTk*LnlBxP(xsD;d-&T3)J)k0$Y#?&Jg*UZy_hgiY+8Wa zFD2KYL}gE+ptKLUA4-~%mHmwB7x$(UW^`l|R$PQmM(ziYXCe0s$BU3n!3}}K+do2g zS)~HGjpy^oZ9G3iZsXaYQ{8s58w%vwNCu&%(q)#FT6QZ+kRC#oxWS#&JWrOWJ>{pJ z*#0F2Ml-KHJJZust=eTM`vlVhlp{TiPLMuER^|qGb42oqM`r`IXJ{Xnxf7Fqahdu@ zQSHdM(9>x~SzMN@d0kA_RazBS+E-UM?yd;@#4QC+QQ{{FH3xu`=H_O~#*VuQ`o z|J@YQG_66o|Ho;?Pl|e3BW{4r>SZgA&JUs)5S2T`{4H)<^fyRyfS z8l$#SCd!f8qq?#2z`=#)`1=E0Z|+V#-*w$VuwKY2UWyVTrW=vh)pWP1o9R_6%`^Rk z+}fDb4V74yj_lP9uD^DT%iJl`rDOw#Tdf<4@jZXMf1A^!S1f zx%VTZhrJ(r$V!oWKYY|*9igIP-p_oh+Xy^u^}aQ|ZPRMqlllD4G!EIT8zv01*Bi(t zO6$>N>0Z=R^Z7WMpwI0^v|oB1rH-+-@1r#707@UDPxUXDp|C+O=3Q!uvZYR_wbTc- zkp`o#()p;HREoMw^H2|ICF(2Pf%2t?P=WLU@(acHU_eI+U!zp%7nCLai@Hh;PGW>o z7!4U~%an~KNS)DisW%FYv(f^TAPq%{(gYNgN`06rn$o13P`Y$G%8>3yL!_tCQ0Wac zOxlNrOFy9rQZ1S&HSNveu+$1omb#$n$Yb(J1KeWm{(cQEv#NvCYDp@6T$lXqdNRD;}M%y+1-vOmx~DdFTKZ-vwZ zZIF&ZJEV4|8MO>2nr51MA$xU$JA6I;sEk83w=)@bR9JU2;UqG*on49C?)W9-cEZ2M zwHT~zLZ?$WE=seB4MN)@rb{b+{*4vw76SWUH+Z@Bx+^YA$U4Zn+Uise<+H4`6S7w~ zcvbe=CoT)bs#Hzuygb7xm#|Q+g9h^K!|qJ>3phrlAk}bFSf)j^gxWAS+r+ewD<9vO%0| z@cR?)-xN+xsM{e&#y~ZRRe&qIO)LFB&0G;UNj^&OjALe>_@Tzm^fnF(!jAfJIRiWXihqoQ= zLB05wN8F>6yqd%HPSXh6k4xfN*$2t4LV3#8qQ269P`;Nkj+3P26$C_hjxc^>5TSHIK<1cRtdg34iJG&p>*glL=n8@7-#P(Hqhj z^r8O3%OqrFZdkL}UN0fbFE=f%NIhixoVZE>9Sl85mLTmz?yxSggzcoVHpo4>egJY$ zuD=k~Q|SVfBHf1SOFK~m=`GYy`V}!3zRe0lP{(L#6X<=?=_pH@VwqOx<;Z=3_7n<6 ztljrkDz%tMsWbpZv`$}PnREv#$hQ`6BKJJ;CX-kd&Qf?59419kT7gyk4|2DGG@i^3 zP}x+}TH1-+O%`cWXshgWG)lV4RA^(_il$2+pqWzr3zEFEbvQT3hs8x!aXQLB(^O%Z z^gJ3V{fq{jWu+NY>Fm04I|!9X3((oR0{J)^EG0}M8)_|1L_KwAa4s6DLxUA4zyX2J z_i!*l#|A&5M5+CSyus4>$bFAriISD=L2h%`=px!`!#4m0M%&~TStdP+5~V*-P&)Bq zdWtj^rMRCfZiE5t{A)~;Y&40NFdAt%N|ZLCp!7TPO08bMOKBn9jNBQ@*CNuTEh*XS@ zk=CG=(u?R=lVAHMJWk;$GwAcuH7Hwp47Ha2L~W$gXR;NRu0khBTTut;Z`4uBoyAsI zx&U>R)}wCH>!^FFeu(c~LDy5*4HZZws8FgzL!@WXP^rOe`n)t84VN~fnbN_E>Hn~4 z={M)-?N8I=?b8|-mw6?YO(FC2sji7D{lT-+7s$feWV~VZx>)uLTGY$bu8eiPz%&54 zyAjF|fi5cX8VFhO%`P-Da3aq3^zryCY9-IdXPWRU@tMZ=WyOU5v5fWS9=(ja(rpwc z#APRFDGJHDg-V#{GBi0|I}5@A$uDlOY#{4w;M%s*gbo?=GDC&|Ns+g7Q@HP1INV5#>t_uVwzFKB!Q-9QBjdAotzh z6Ucq_T7&XZY{JQGKKe@Mp?qnB4-3S}3I~%VN@J0`c6BLoH5VcGvxNJQ zyCn4>a>sbDA$JV?8FDAzzoT5n=X2lAyt)ITp2!Y)cp5V*m6oBXv=uFvUPUXUpU_Gv zZGMusO6rMLOQX>m=^Aviv;px|E5i#Y!LO*KS6;l3rBk>JrBxgtyLJ)VQ)QcxS7}Y& zMS&{Q?*<(MKjdw&S)FRyXj)*p!*q-3e$!U8Q2G#A;s&>AthbClqqHS*Ym?s^ zy45N98E!>VaaS_8I-P>t)!_liT^$~Q+|}W7pt~3aBm3(B=KRisZeiWK!)&4^6*Tkl@Se71>`-QQU>KDdp z5ssBMk7=@$>faRiIhEK%P9Td&#i&GzqNX}tSc6(gyO7m)gZqsCiOWXmq@d~YB<}*L z9U7|hse!0#G0!37ZZw!S#743bWl396s*Z=BM{{)``*B6rq=a<;CxQi0tDd}q-X>+D zVr{E(&b^QR(>zHRcC$7}(;^)L=bQ6Y~$k>Ye@P6pJ#2d(U ziJy?`5~(YXo*aLXm<`GrGX5elYPqWJge)Jqldo~eoqSz^JRKg~gaXnIlpwu>e0SCQ zPb&`Ee6?Fm6CLG@K<>o#GGt|Lh-TaC^-=c;xy;=rvW9vQeI7eeuJjQqk!q2<6w-PP zW7gG~0X|F=XQGgF8_Gy4W9dq7W`xRCqipF(lq>y!N~Go$?A6k$XmJtpbR>2gib(IE zT&Y1N^}^e!_a9T{p7H!>V&OVI_e@)kN6>ZB7sxG{{o8ev{d>$UZ2Y8CQP<`Ixe45X$a3ZQFtwi;06VyP8*uZC(u0m!~?8|Nm3(4&M z=$TbZBZ3-r+e=_K_A@9+4N{*ufA^ygN>?@mIbF=4HX^@taMe);;hrY2k0AVo>>~(u zN?H4~g*HTmQijR2if5rL&9MH+pJ)bq1B#Xwp;&1%iYhRrAD~836|z0`X_Qo;-YH}w z2OuhLj8dfxlqPjWS<(R1P8x$cNw=ZSl8bVrVq|v$kD+nOo?<+pESu4XWNu<| z_;o(#;%6@`wwKi|56B9#Ow(ZjnUj-9+Xu*;9$9E>K&j7{L)K&yr8?N}hWUHPd zQwQ1I-AovKmT>g*rq|3b-~janvXEj_VHCOrWp3fhcxX8qjeKF1XsyY@PM|VWkaZTB z2^_CUt+$n<@2v1~KBqrgs_YiDOnTUqwvQX<@-0WWx_t%}qh6%Allh#<=qV`|6%5X% z^l4=82JJ@0gY(FOUZTZd(;^i;E_Fvw4KAQ`jw#hOfR|DG?@hfAka@SSPOEOOA5_Qv zHXyuFQy999k*qS+;!tgU-s~||*MQ6(NnI6?IYp+;tzIN~_Qosnj+x6?xe;<;8$3*D)n;1!Rk2O!h@U=1(%&FJ!KPec6Xv{vosv zwZv@a1b3t<>x%w;Sj9e~l22CKkhf^v?VCy#BP~M7(i)T^?Lev0VboFjIS=+0>%V;A z0DU@w&L9htx}adGZ$Q1^j%FhA$Rec)t9nGzwcJNw|DNY^WFODlh!Vq0^>Sq1?JKCK zdH;?qL<)X|UQ}vx=2V(E zd7^(iw=`=LDPT9jXwJ)Q^KOud~2Xq?fmQgj<~_Lvs;AoFftu00o6KsZqGQZ!C_ z3QdqUqbbsBXu7ly&5}MsOQrA88p-#19cR51jkZe3=pCsG`dI4k!sFr?bVizj>`j9w zk^Lj#+fb^{OtZ;4NhY%wjt-!q%8sFl(%)!?6!QjG0HxOGX(=1MgIq2O!;cjXLdT`C z$j%`1uRXrKnao}vT#oYmrsQ=rP&$U3M3Y6lNj<3pGKqcpl!CU9gF0+t5lN^lfndGe~N<&$I>`CJqWX}-FkUc{|Y^Hk9hrs>`8Ros-}&C z`nXT;WXWi$?lIDy`cosFzf>dB%)Wxds@Yf$>@po({`K6Z+|4oyuS9R}Ww7Dp6Zk6Z zKC%e^L{6>t^T{F#(Pt>QZZYcfE~ zjV>~iGT7*byh;2SG3486vKNtgw=cWrd^aGgukw!qGL8vMgP#Zs^x6MJ*Gr-AvxQ61 z=mseP6-up8i1s6$Q5~rp>YA9;~0X1q|wMEyjFc46BOZ2AV@lH{(t7b zMf_i{ekNNIklAkztR;)qiQx0deskb8WWPDE57{pce25&K)qRERY2wc)$jdlibQy^W z&B*M_t}Kl{IKQ&QBfIgWAiMFjLH6oOCuFyi?#ON@{g7SjuSH23c0RIeeF3s-{f)@A z7hk5pcB*(cYA?-39i#`4-JL8)J(N9x@}%`>ptKnclD4D4(p#uN+Ka|X@1sKLzb>32 zeu-vE-=Mpslc-2Kjb=%IqS;bV1y?*IKbq_8V5Mw_<~ikPFq*H@0<=K75p9#EpqHJ> zNvwpAz+DQTLc66>v`5;4-jQBKd!?OdpL77(P547(Pmw=GLE5apLiWb$h#1^hB6h-+?@JV7&oU&%9sg#5=q;zC^j5f$#`{;L)Eh_Rq?$L+x~6`U=XH-ba^8$B_Lg*>lKWXjbH)51D+a z8M3z%JD||AvwWl>DClphxizC>c? zr6VXz`U~0b*VO%p`Jt>es$1fkk>o&oF@89*7vpb44ODR!GPUf>K9T+`S?zZ(kbV06 z9aPjb{05)%T|kR8e+F6TVQv@sv(Z&(ymrl_4s)IPdVenAGlY{AzKCv+cB5(1VKhhj z1{M1YXi@KDj&A&gC>E8dG!d(SCGQ|eBIYs5KdtF!`{ zLi@67_0wc_tv-zEXw?h;8?I`u&|~p01a^XG&X|(l5}smL-h%do;e~7IY3>-?9uv|CjxU>LnxlUDdY8 zepj_Sawn_U4Ejdt8p0xJB$_4NfM!c~pgB?znk&sm^Syctym|}0dW*bzOTBu_Y(1C8 z%e{&#yo%K(VvYWTBN8Hi?*RvIMfai;P+Yl-dV@I+G>MGo`r!rHNW+29end6}KUut7W_x z+V2*vNA|l#dr*=}zeUMX=%+Let76ISK|wmf`w4}F`6qM9^fPmGl!4|RVJIqn62*iS zk?leD*5~)gOrCkU=O4}c=Yo*m{nTpK=nE!6N<*rzf3mcgvH~*u*hn`r`{UdF(V#C( z^`QavTKZNqF>}5&bD?Uo&vmL`P>^$@&&m0Uek~{wtwD8ya*!zv4a!4tReZXjLUbjH z3M#5qbWjO8WJ;Tu(S2`9r9V+}+>Y9MF%!byXh;{gny|&!b)2yZyPzjM zC9W|8988uZ-GP#&hf#{O8Kp{xP@42LN|*kJT1kz*;h?zAp0$bZHR9%BvV`t zZA0^Ko(?TPBXbfbGn4*YHKhfY1ERh=f5)#ivd7p1k?mopp??SA$PWc%S7=ZDNI(`; zWZG;E$eQSQ|J{HryO;Xu?+H6!W157V;9jWI44K5f?1;0-Oy9!ABorj|Mz-d)$eupt zBYPuqBB~t(Z$&zypGM|r8(xH5dtIkAprSnrH_vJQ+t`kHANA~rE6renO!*JUC;e@* zM3cpTe_>mDI^BWHucg%oB}$WAm?bVows9%)X)v!Mzw{A`lDV%vu zGYLJBPr4eJ#J>D;KAG8dx*Q(CM1?a@lH{UfX$i`boljh8}B zvcr@j(FCa(nkc2ALVG!&3oKUH6P=&Z^Ihmw0a-g|CTs6uGCMI}qaJEw)YFrlz@G!! z`c(S&1z7}_L-a&ot5r*r*&K3CT{!;YL^CZz12Vf|OeC{wo6!YRJl^=WfXvA;nfVrP z9cdb+q0)l^^&Sh?V_8oHgieuZ{5+Yn)aYP9sV~-Kzma8Ul`vb{{CMHS*qLz!*+D%& zb;GJzE%}Ta11i~H4cJdMNL$5cXs~n=4UuZlP|5!jU6_=DhD+HfUmAc$NMle=T{CgF zqaM;c)U&QO`Nv^zgeg7^}gDD6X&q|Z@LU3fi>dP`xecBU}Xnpd*~w3TNgyS-m&6l}&i5!rjj zMt(0dW%gx%>3t5RNs~h|nG-tU$Iid=}Zxa5u7dv%W<3>fBjmpAf45 zI}1@mX^I@*4m09ahcei_E+Yt5QBP#2xj(Y|@jPTN0}n^`s?}IzuUbt+_WJED$X>sl zitJU}yOF(WI}0Uh9P?01=>e4H)R;?^#V{t(%&3*9sr0y=x-|rL4w`=#%`pGI5|EX) zDCfg`7m(STN57K=X`KuCbV>G2blB*cXc9f{j{zKGqX}Eif&-n+Y zDr|a|OEgj^l(jUD(jjQ7vRP=Rv=ZGdJ&$Hf@1i-MMn`7UOf+7ZMRm|z@QxWK3o znRokgzA^8!0<&b3Z6@=1a&+#upUg=yrN>RFryx%uo}5(e71SinH1Yk96<8-(NvNYI zQ)XYjGV|Vn(jciXsx9IzNFG6EH_|BqrDL2jX5Tq7elg@$A9o>HG3>>GQ_x-#_y_$v zz>r?Xk#r&vQa5COS@aeZq67UWOsVv)DV6>-rMem4$`|T{OB0Y^dJ@%+!{y!f8lMt| zDE{)_VoL4)?Q1f-fBPBPr>)MRBz4%qL7`5v6p6-bku*W!gUo1JqQ+7i)LH6+Oqpx` z;b>p~)2lYLnH}*^GCSgF$nH-6gY4e)b!5M+`z^A&_LyKstld#JWPhV$46+ZJ-GhRn z%ox_AVEbLE3TST#)R>CVrZ_2tic$`;50DiiQ)XXL9QtyzV%4EGtjC)Ji&X86fXwbX zJ|MGKUq1^d9n#Yb>?qk#=`{$lN_ zs7sh>yC|}Ir30u$)jmRNq%&x(6cZZitdlyT_0k~pv@{)UkXE9N(sO9DbP&BDRii5D zf9R;a#CcIzsPnbLY;;^2g6sj_?Z~c&^G#M_KF0==N&8W-^dkzBBEwnxq_)Uj&^D!Y zm0d#?Dcy$LhT?yH~BrVj;{8s1)p!(ls3=Yw47uW_2$d!5nQ6UCHK3W6(UQ2&JnFSc5K=-a;Wd zzuIF;rD}9pN+m;XRF8TYCtR3b|H6^jL!AL+-SjC&qwY@jZ9XTYL8z0X%YISF{?c1A z8mg>4vd{1KME}ked$2VqAhYvg7Mc5RMQ5P#(twI~maY!SCe1EjV*Vy`DvD50!wW}e zXMJ=)=9_JX+$S}Zh1xvr85Gg2@(qdB@g@UCN z)JN)s`btC49O)J`S6Ym8QOK=%0{WJk!E8o7q&HAcX&>q>RiGm2Qxvq!wD=hXOW}=~ zEGY@im$H%l`NTe`Vx?&@9Ql7Ux(#uG%+S2-w!K85O=@adv@m*%EKH}un*&OV)Ya}H zo2zFlDv(*$vI%8byk@!mVaZi zC^Nd~I23J^W3<4?)C)UQNylvDh95GaX=2{(%kI27a)6-xfI!>%qNgN z%6tadqs(o{9%UXt_8jRHvd5c|P3esMW?Ts_v_A@$jvDw+FkQn@r2j0MjqH!YZASLu z_SeWhk=?Wz9f}6i3pJ8%NA^eI9!Igt_96S5aA!~xWi2nFKS6Fy%}Cf(;c{eu6z*MQ ze-th#KD72n;Vwn?N8!dJM~96MAUn^@ztOSbxASue%`eRC0{byA)4KHsS&)5>qHY2V zGJ|N1%)5Qr-gzWhxXx$`(WFkMtT>=vk=nixkmbdgdT){qln$Ul(s49c`a6NH#r}A8 z{T3W3C~Sj30+_YyS5(@UOMrTln|17GLYPy{KDLie2Y6r%fo$cuX*-{6_o_pev-|jrAhgN^)hJ8~O=EkN z;!%Xu9@Uj{Q9WrasxM7P&QUXz#mFbEM?umXC|Ej-LZnlu&Qa|?LeiN8h4Cm%>WIRn z0mv^+KvB~DC|Y_1HIkl3G16WXD}9L?OTVKgQe*}lr<8_VGtKtp3);a_7)}@zREdgF za8NZmg+hW7r}ASqnM`$1HX4pXgYwV<6c#iY?Lgr{Md$}~ez@m1%|@-xZ<mu&%fUK)}0?5(jB3+yd>zyS+xk%+w!2|9%R4S>YEldrvRC^M$4Mw7vpE>tjl@b}++?VzMexP8U`Hf4j4AG>mB%K7*&Hk-tM03d$zykaIrEF_Y7hEHP&? zSsqHxnTg&+DJrc*sW~NN7hlRACZ`;YMd>+}=#Wt#GnC(udFSQwU*q458h7Q>{bdx7 z%)5R0rVD)Q&VeLK&hh@=!U>-p{X}NAS+=#aOuDULVu#ExGgZ#BGJcPK`}~G>5Ir7w!VYxj};$A_PF#ovd5*rB70nF6jfBf@Y-~9O|MZX(w!F-q3PY& zl-8JOnuYAdnSbZ#vdTKLWX<#)0j1eGYj}?=M>>vrNIxTcHTds<7Fw`wO`Yzh`zvO| z%}}sYg0hgkaB(@Z7cPuAC#EzH*$WpVP`Fc0HUULAmFOg@>tx@_eJNDm$wjGGuyFKI zE<^Ul-IXZH?uAA``waSIWEaGp$j<)x$o9ZSw%>gMwblT)qAY1YvX7B}f$Z_OnV2;? z$2v{6HY}fsNyy=vtFo>+9K_jkBJ=4&x|!K*WZr9PuB4*f@`s>s9fC|m5z?J#g5T7e zWt3>N7-b|Gtw6q(MjKI(^dbtDUPtyJQTGEwoh^Qfe5t0%G34Y-W?Fwm_D@qq^f*6R zrbdCzjR!ns_f{q```Veb=s>+7XCYdSZ22K%7iVx!vp82%T7a0B=G^2Vn5xfgD>!QAeY@ zjI<4}Fe=nDFR#F9g{HX5Xo^upp9@FV*r{fUA0NQS4c~GXfAkTVTK2Vbvw3fLH8b~1 zqjVG`4Ox}ckIy)Vz!cb5xURSslf_BTAp2heKI6* z2s2Zq{ZYPjI~pO)L-uKr$I&QdFQU=Nt*O}$$0$6D#!5*;nblH1bfYu|-6TyzH%p7r zEz%maP&$B$r7E;k`W-Eol7@vktEFD(QG11QBz#=qJX9(@gEmUFz>kY8#( zf-YRjMRC$J)Kq#B464dqMMpsKbe zTZqaoG1`ZAN+(f;el)G=7$*7_Q<{WUOTAHvbOS1t7Nd>Q<}vJnwurA1Zk4`7)eo7$ zoHR|IGdgFQNQq;~PMPdl^sKZTosd33-%E9`yRchx@=nk*4i3zmvt;glgghj1H-CsS zusFz!WPMb$E{>`@4FP`XrH^$WV!~i(?}ikr^qjzMm}9ejTldtBXvSi(l`_?J&0yWuOfH0 zcpNU3qOK2hmPy@^Pks80C`ek2f~8F;M0(HEQ;+|nsV7BFpq_LI3X$@VPu=nq1vw zs6twU4oN%Fhtg5>krX_c4OL1-r={NL7wLNRt27%qixSzwwjtl5EOZ(LEn)_`HL*9c zsu8ar&*NoUS@hvW3#IGX% z;)SRhHCntHh1|rpy|@(hK}m~upqo+h;&L<#wOnk5VwAdg$2~l{cMGRS$~quti7D-c zd`rqH9e{$A4ZVf_FIc>e&@bJLqNKSfdPyZs4xmO$s?padS*7Ptid6qrMkghpR#H23 zv6PEiOV^<`(hSsgiE}Ug-vjUxg(b-MpqbX~C`kGc1xvo$SU6Gwa@0Y0M`_ZPC`THC zav$L+bCrMpaa0GW6D8q`=%&{Y$LXdhg6)z(2ljeO~=1`g)vg zE87wEC9~J;u15CUW(cyE2uC4%=5edZv>&@0MfuGL7oa3*8A_HmqEx92IXR}@r--*z z!v_a7aF3Z-w=4cK(p9#osYo|>GLdOwUrwTVzrvJe8TB*LjnHcY>iKmuV^lz9FD2g? zkgK!Pbwk1Q8F!NJI;N4!E8ExxRZru zqPfn@TFrAxYD*V5J5V!sMyRvMsWL>1owH~*dcaA%->TTjM!q}Pi#z$Xa(t`N1Tvp* z2P#KFzDksQCu@zby0)~AFM}^-o6=C9SzxBresy{PGGCo${+nX^W8AkB+OJM8L-o~U zKWZSEdXbVTjh4&+8~d^uiIII$%qY#5SDWSe3emWkoZ0wRqgT)%Um5xl4R(DMu;pEx zqxq`P0yNZ@SY#^>^JSrRWcj`vbO?>mh|OR|N~g(2OJ*cveEGF)$0{=;8Sk4+W;DrH zR6D$zd?m`*Nlx`D-XWRM*-b0xPLLiU>nN3>PSRo2SvrBT zrQcCksp%~4FiJg<{b_*PQBP%$pkC4rG}}IF@fn<>@C=$O#m(kn6e$<2lcu5yX+5$h z2|JKaCkcm9kaQFUOMfDJ3eji|eXO#fC|bG~xsAkiFh)9nVx`llvE-l2l9kd>JLxLa zUMfT#q?M?n^cw0UeT6zpA@f3=E>b3PLUWksx4C?ctA)NPa2Mf&(t~K7^aNTjZAGQh z9<)(9fu5D>&kuDrNv+Xy(g3tYG8^Ta(oJM#(ri?YSpQ4lhYGc^N!!T2miC|%(l6+H zDS82$ozxzklm?+6rK#v=X$h(hoy_OlkIpGOhW?VyA;;A0TvgfShk_mWDkdj&$cQKk3$>CmWF57YFT(L`kZWectNdJgcqWQ4~04_!;5S6NO%bv zOSUS!9Jz+iXu9q|&xcnL?nf_#htILv8lH&K9_G9=ylk%3OW`^5e9l{B+rq1A^?`=+ z9$C8xGgrSw9i`A>dIPB?>MV6ZT_SY+cP+eB;WX4$dISxQNSx1~R9VX2U)kMgWW;2$ z&(WxenG3AOs`PuZ0x4`6`+TV_n&4%@bUkJDmE-Ltg)^Dz!%>Xt6@Ilny4epDApqMu;xkuF08^(ra7)_syb zUEwrTCCx=g>*X)zw-?YcFZ|n zs+QK%;MJ=V9L`H=C|4SQ`b$&MHPY%5my4p}tAzGOhLOFIVZ@CL zUPeQt-_cMhW(_wHq)X5U=}I(Gx*3gPRn=MM(Qled)+r`oG5FFNA5HI(r%*g{%v8u9gzfHPU71T4^{M zEKNm2rH4>{gK8#lBYH|%HDd4d06)#To=J@~6YUOwL6M1s^HH$Emr;oHEvh3mewsa{ z)E9+GccAddEZS~B5z0P6b*0b^>?x(r$S+MojXX7pRR3qfI4_L%)Lbf|G(ma?weXY} znZt;GAxnzPN3EZsyNWDClTgdZg{TCjM3$h>P-^536jREaj;uh}AU8eo1Y8I+BAq3C z&lhECB)_3nk#S^68`+;lW}$wltx9h}mw3vG%%QZHti7_=Q3vT8)G;!TQu9GNM;4$4 z&(im+w1Eq=#XQtix(9W)#pnu8IbLZGX+5RAq>qvP=DJZIWx<>113cL~duAMym0e2d zO~~aJMc~Z}jc)ODtEVZ_ca%<-%qN-Q=}yT^%w1CYbD_?Cl38G`S6U>QIWsG=khx%5 z%(2Bc&}6QPjpj*a`WHwm$%-X2Gnac>A?>7erDR%^L>AR9h*D)gQ~Ipbb2G=to}Q}} z{oiIUd|vtw6<_eQMS7QPt8~%x90y1@qnD)D(Ke~x3w&2V8iih#HlbIfzt9_!8OK{j zZjIsFURWkwwS~*r(*06oXlJ$>WpxTkMDedp1p(`n2w?evbyjOt2#QT>MM|L%s73ZF;O(h(FR)p?n70Z)xR#Yt@`jhAjl ziPBn>Y{8f%9egXIa1ONE>1|-qMlL_ z>LqPOy`^KQkJRW@4o{@ssGl^$g}LGebfxqW8X!5ZvA2`jpgd_La{MJs;Md6KuRvk1 zvlH{5MHitEf82vyNkifOT=XZ3@GnGd-(dFZYH&|f-(UJ5m)yp|2L3XNm!U}i31o^J z`tu(0Ij!Dg-{mht-=iph70P^z#pHJ$=4ZlCBYzyaAI12y(Rvi?&qMoBV}Akq95wM5 zp}KFgv-1}t)1s;CFM-8`&HPnpJ8JH)M&FT27f%cQ;Na_I!>=8vP^CA-<3DI17#{Mlp=pkDsmrTk{upD@=ylQ3fsN2vZ{ zbOpLnO-7=tq#0;{RE(~conSI8j42|`lU?d0ka`@`cUB-#)J`P{~Gix=$UyLS^P1I19 zqe;?h=mzQdK92t;`%9=;xBUFGDBY2L7UgzipG8@QX85;IuL9lSuRy2Jo&LDxRx|zC z$gFyI`E${N{h`j?{?c0A<1eq(z5Xin0j2l(&m#9Hc)vexh0kexfbKxk)e03!ozX05 zG@32liRMU4(Ol^{G*5aD&6j>d3#7<*xyUbFf)@L;8Jn5F2mE<1EFxT@;uYv2sT4gd z?L$i?vv8LA3us{$j(z6FWGhr^vX!15@fT9>2imSu7X04%XLDMjNBzZ=nuX{-<}ZQU z3GGulW#~zNC7D?rOVs!evNclEgItjFS5s=1_S63GmHc&UvJEPogP!pxl5IyDl~tfE z(vRpxDe`@e9HdKJxXmlx?$4sJnXZ?WO{4Txe;%1xOs^?3pXqhUe3Cc(g_K_R0ay6^ zC1??PTcsONnSTq}`)HT4Q)stTw}N8`#QL8J-%;2X?e&+@WER@zuS7>sxj+07ej4O6eea#FKq?>szuXmHm!Nq{c_shNMii zR=V;C{om8#^@O{nd(j^0Kgfx$WC9POi0Bi@{{_c3dhn|yN|w5zmQsI|Dh)(w(gc() z%|IE_Qj{4T_Za=(C*N^}QsEiYR*E^nY?ZQ5J81ywC=ExQqz6%#=!~a)&Zp>7Wxu1# zq^R%N7fM;En=}-4m!_dB>~D6jhdB!Op{u0t&;Tj)2ljSSD|C&Ni>{Rlk$oiY0c4*Z z-h{?A%4V|4O{SaMM@<%!N7ncx3tL$mkWfqCsSO2f@6!(LKLQN+^j|6(k>Js zRiV1lIaDup3oT+!aZshKJ!%kJK{gRZ##SNIqM=G(Ci6=lyD&y&Wl zfMS&mMvY_rWM(i;Vl&VtvN)BNqh`_%=prfRCytC`v#ED2YOd^7lqfAhNwK*lE}PD2 zR;1YSHC)B`g%v3_ZY@80|0@>`RB=4A-$0s*(qi)|HT_?DY#}nABqMeqYWo|jlv><# zhU*5>GpMcfF}g(h9%V^?qjs*?@OO^LVsqB<=}>27XHl2fg=Aa)V4GEDN-vcTkadkM zr}P-QOxZcqPilCUV=AdD>Mu=1SH@P;;yE-x+3vISe^J}EdT%(-9chKi)S(X7}i zS_}yebLPZmJ;Or{Az{wk*pgb!Q@v$m^J6Q>wuFSa&Vtwz@Fd~FSf|u#QEUd<)At z*=E(dA3ZOvM_Z&f(6(5e|9%FyEBq0?EY*t)b6$}$(T>=12G|?Ds%$KJUAhasA+11f zO3$OWr2Xh^>1$LbB{mFmc1i`v-6fX5-JbSHZ;`ztnF-u0eL=R*Q@Qjz+53`dQ4w3o zqz?CoIfr7ak=YJDROvdhk8E3XSZd}*g*hL`#%*GyL7ym`hW;x(h$>?wD%*uV zlm14ZOP5B6IbTV4peku8Ix1~K$E3aJYpDu-gINE~XF9IX=sW2zicd&w8-+RFOJmUw z(nIK^v=g0@PNSctq?j%mC|osxN&(*1*dmJvEemrqnM5$Avl3QWA3UiuOVd%B^Z;rlJ%KKkwxKqX8D3jY?HjBAGht^h?CR+Fvf$&l3AbLzXgGwZSGx{qj z3H>DHpr56I$o?tFLS+9Gk`(DHv(6pG)RJ4Bq z(iGc206Ck|`b|q}o7g|>XiEJ}chqK4O)Jn_)U$usv2i?$v#GP0`^3opy++fbY10g{ z-eeaw%|WJK^QP+m=D>ue`GhM_3w;OBG)a=ylch=9P`b1iT`X0iHqsBMz4Q<2Dm7{z z=3M4w-Mp-zX(40#C4v5LeADdb`C4gN^e_8U@97j6;@(R0$1Xp3|RZT0k`rZ$ zJ(VHW|KAwNPK8FhJni3vThc&d<^B(pz|x}guH8R#Qd+zby(AEA$> zbLbQ4qL%Chq#o#qGy#1fEkR#O<>)Kv462fvq|oRTxM>~ zma6a?bh$JYb(2=29BDi1A$@{+dRZ^&ce376bek}zk5}3^exVr$SwCexQLf~g0rrny zP4OtgE8|PibaYjG8Crq{sN&P;YUxdMjr0k+HolU2KcPHjVQs^lfsz^Wp!jM^TaXR* zvLR9y+0c0Pf2QKFc;`i*(}QrhS2152L^eX2hDJ&&(I~Ip=y*SEUnU#lWn(>E=gDbq zR=xMB7t}nF7O|Jm|Ai>*4nw5^6fP}B{^nU!d=W({Gm4fzM~ytiNFiBaPOPWKQX8@+ zp5mJ4FuY-8O_dFEVKdR_B2V#BDOqz*3C;6pe2A=tGNVN4Pn6uefYQe8SVfx`qAn;^ zrQ=ar^CGfEs7>?LXcy{0smm|uz)q@Iw>>+K<~t}(N0&9PKz-5WDxHYBNpn#5<|in9 z5?!I}Aj*+~JFtp2KTD}mp0XBbh%^ihl~$vCSNs@`km`428B6`qC}{y2Et$q+B-41T zSMNG$JM{`AGr9?qX)#eUEhbB5Y&S~vJJSE%B%0CP+}!^XSEkV|%1q;1CDZseuiovF z8C{_i+$qeNBDF+QrCc;!8iVeT9z;%pSqWc7zJ$b=xc>Je3`)pi#Ic>}{}OW1l_*3N zr=dF18WiefVO|z4?WQy$VJ2<=K#^WOf5Jkt7F}3v6UtFv6q9fQO-GFr+_P{kj7vz| z#vLovEFl~Hf#Nlo)NK01gj}-0C^4Y`J&lqRwxG9BNU(P7DbiCzE0^i=iycvvG!jKiMW~Uq z0mVq~p;+lSYAl6xV+EEHP*YEdQWvr$Ps!34vX;oLsWD7Zcppmjl;$bjQ|lHpnZdiM z*VfA}@suTo7J$3bTnWxL88>rV!nvc3m zW+Yd5%4xBX$=^WML)m-X>Hm6)RfN5zbEuD$cm*>(v4&S)6zi$6r#PvA(q_^3;Y z2IWYJJ@~|)dV1=W=$cPwihFxuAE_HzUuh`nC*6i}rG==!v=&_{y@sxmK0*VeAJNsG zuJJTP3hzn(H}pK6VV;J2%9oOQ(i=$a(Im-C^knHOvKu|!B$>~Co0r}0X{I!Z7I#ao zVUZWk@-*Ai98YsS&GR(h(?ZEi%!3l2&UwgFk7P5aU9voBAsU^m{%<23qwoVXR;ot! zH-YN*Vgi+=pt;gaG+%lJEtdX9OQe3ix%?n4Lo1~B&`POZpD^bU=_=%|78k)Mq%Y7q zDZVdfxYB4;Dy>0Vq+iiiPur!|{kT*q6{0d}2iht9gLX-Ma=F?lJ?O$c;>YM6sd;}c zH%b%HK4~*5m(HLAQnxF^ocE-8=zZxRIwHkhMbFyO%=B@nrF0w0k`|(N$mM&Gu)V^~ zsH0SlI(h0T9VhGMskh_|ps(=MSGtI-pQl`@Gg*I61=2vW39fh}w0}`?CMs680IiW8 zN9&|rXoHt+k$xcCDmhn&IWJ1h(KaauZTGZGnn1R@RxYz&oKN_Ur@c}s**@uAR4)C9 z_Is+58eYT2RH-dGF7-kF6f^rrqbO+xik4=fMn;_f!q}8jy2sFK*`KMn8H$tIqC}|& zN|HvRWN8v=DNRMGDb)<62&E}ofik30l#>$viqClm^-PIFb@N!9DQ+=Lg}qb4cW}Ih z`lL)oD^cH+O0*f}rc|T9Q2&%IuQHN>^m-{P_M~LI?Q>FwvCgENK+(h5WK+t@sE78Y{(k-^J}4^lnNqYLU+- zn^KM1qk}2o?ru&vV1-7v2^~st_VAe12rd()6rs8!xlELj^A3M$6&+5gLeHR&Q%d*p znMQGyC?#tjU*SdnP02y?(dQ}ED0wu!fri{2eUY-GobzP#Wy<9J{522cewA_p{tc^B z&Z3N#;2B(g-qi7(M>%IFNRZ8JQ7V!O?;1|G&D`w zi|7vNAexyvnbNcy!koL5bwT$?1JM1_3{;f5ka}y-EM;$^*{P*uXVKi$D%4;y{ogzl zUo@E;kWxpqNa~FiOV^>|)M}c%fR?7_9po=Apk=8ADEUUZYSp_6txYW%Ez-BPPfsVC4?WY48$ec*G(qs^&>Xft|V zquYzNq;4TQhRT%vhAO1co7rAcD=3Xam8n&z6*{KU%hA`VEdQFC>)~huS_uc2;^Fos+6=q5u0+ ztaB?HQCc}odLmz%nXCd7B;A98rBx_IdI{B$K0u+;Nfai9-Nt1ssU?b#x}&<%2vlEk zr$fK^5Q>sYQMB|vY9yUNF`inb?XSiRI>8GQ(<+$@ zxePif?F3qglGDzjFHp<0@I(B)vO-QD(&ErEl$w@NtF*N2TBWDu)+#40A8n^zkFXR*h~%gVVx4I3vutJ1K;~4NXnYBl{UmSN1gK1pAVmY~Y?N>q0?k0Yd4 zA7g%?Bk8NZ_BkWa7n+3I(3k03$lgU?rB|R+s46}G8-6H!4*lP;^vSU89J-;5nP@nQ z%2s3XyBB{HJ>rGcrmEyUz=AGBYaBO{i5y_O~3@p{$HNv>mm}s6?Nj_8A4=akUh6 z$f!bb^EoKVsIFC~jKULK&L!)daRS|px@Hu9&)@h&-T7NWa3{PXqu>WNJJcg%HTnnj z$|y$(3pi%Us763JGPA3>xrVYcD^Ml6G&BD+2i>S^<_`43LtIhL%=?9n z_hDvwW+iHiax!y%rT-fMduGo3)#u!bdS@;~523!9CFli|o4Ey5per*g&}lRvvl>Mg z(@AAIzp)oUQ}mg7psAUDvax8IGNb9zZD@w4J6!R8!aJpH1i(VGyyp*|+&}ducYLtq$ ztFh6`nWbc1&?}ic(AB6cvmEV4J2U-f7&O|InStspr+3WEsnwp$e3VS~j)rHnSIR;A zGF`JtjE5g6oR2D`<>-*K0evX#Mjv@PEPX=uv8PX@6J-CD{)eih#w&OnOKO9@k@8p2 z{~bS1=UeGEiocT}yZ&IU`JV@o~cPW$X52+VACtZh}R+E_@E0C|1 z`RMLe7}V+nVXH?t$ZVDKJ6i+_X;q90Q5{t@3T;(Fwg82-+Je?1f2%UI14XIcAr#%J zg6s@x)T*jhF)D4iitgJJzaj534H<+@6!t+mt*U7<2K8ta{s(&j)U#C_dIj}rm0hde zt@6-evOa2S)K{uT{UrZtdP3=PG|7^H;hV^+e4764+be$EdGV_epv^=?XMJnu7AAb!d?E zBN`%QKgInlX*SB24x*7#lM;@RrSWL2^c*U1#XsP9smB@)m!${LBDZ6R&V0F&AlBQw0@ zwxzYhYuR>3tx~+9q}Gc5FU=cZx;MZ~$qXi|ZF%jW+j&|0ww1L5?4Zm{YDdXTY9~*f zB{QjABr~Zwl9|*VMsAH6Nl%4lFugqWmdpVAc(3W%9s9&MoPb- zQBu>F*%3*XqcLq+{yYHy$0~dPT_?Sc3ZzOjPWl^-mzuv4=3FoJMH8f((M0JD=120Ytl!c=6znNPDk7`nDb!P#r*P>7>P2{}>#3fn z2A8P+`;v;03L{_RW`WcL`K3Ehl&5GeQ8cuJHSzRqSRU51jS8&FGWIZBbLBe#9VPQYI!mX>x*)fv#xPr9`dgel{~vF60v$!QwvWEL zGZThN(n%+borFLGB27pj6A%(cBM|1`2w@hH1O!3RO2QD(pdri%8o&V&1r!w(G=Lx~ z3Zh4GJPZyv0eaMfqUJvDQ@eK(&-dN)zjv*BSxcYae)q0j)z#J2-PN6h8V+Sp_d&g= zJy370Y~9;O*K&2OAN3uU=&vUL5s?Q3|cO%*|VseRCkS}$q6 zthJB&;WeE9_WNnPqV=j)4JCW#fYw2+Lt3wC9o9NQwLXlOX4EavN$Pp%J<4((!Rs}0 z2=otX1M~s)74#vM{5oEmQTIS+w9aas)A~Z|ORcZ8zScT#pZ{dSZ*=int?#tH*ZM*0 zg4RW?OIkl_{iO9Tt)I25Uo?N!`nT3)>S=7?Z(6@=UD5i3I*oCEYW<~^-BpgVPDk?ZJ{26wsrNO_bjx7wI*-jqC8~P)(ZEr*c*C9t48Y}H4DA3X&uozMm>Vw_bJ)H z52&-KeW-Ox>m#j?EzM7~KJDtmw)&3Y)jn(2KX^1a^nMgA0$87dk`@f!?A@ zAR|Rq@(kqAa%u&n)L_10$8jA+*MhWyQ!ZV`^}jpO9ioe&DaLR3Tn4o;)?R=brI@IF z4u!K8bOIM)sP<43Y7o>k#e;Fvp=PXAK_>Mg6hVCn#Zr;);*ETYCEK3~dRQC>#cL&` z_%LAwYKbY?&=Dw!z0Q+(2B&&K?WwyVFZCSMf%*aJsMSg9D!(kFGa36Hp4C(Gv6B8! z7uN2EeExw(SFL2NZdz&73s|Cz`V!ho{Q^Bgg}jf)0p*6CpsZAIJ2?V+k}86BQOlth zs3)O))SJ*@>O6FW3i<~=YN8UL_ozJRG&L1EPc4DIp|(QbrttM&4fq|4pFuxRze5+P z=nrtDr;Nj%=?7hA?Pll?>NW_URiSq^ke6F z>Mj&VfDtU-1-YmPp=jz56q|Y!2M6q`dE zIPfay!PN7p^@biwy$sEQcCmK>w3}K7JxA?>o~J&5UZ5^QN2#z+a5r_AJEtcUNDYC4 zEOH7MOqD<()OskCdIk!k-hvuYUqIp1pHSoO=AZZm)Tg*-S(^worItd?s23oU`UEn1 z$i~!uiu0dC5$}1l0<;3Pg0zCQLbO7)!n7J`g=;m|Y9g|*4cJy)Y^G&WuFr5_YDH>A zX}PqbwPLi~TCrMjTFrZ4{rK~*SV;>O2SBZ~JXA4i@zhEvfqD)~q&|e&Qolh-REy7X zcGPN5rJ?4f#y}nXvW$*?8lAMRqGn)VZ>k(R+QWnU_#pHKYhOXfsMvqvt8|q7#)o%$ zq+#6cs2yi*BXpui0cu}E@Ag;+y?7e01bdu@tP9|KJ$!%J-S6u~KB5+$!J(2N`{*Ia zNgaiPsPCa*$~=p+29*KDWE5b&)le*J&q2+p_aRTlQuHRC!@kU@w!pz)QbrB59cq_x z8ae{`GA=`xpkyxGylXj$<)5gdC+H2a^@+>_yLccO#JC{{6-->UO3B*P>)Ot z+fXY^)5UbH46RJ9tjv5hO)p*Rt(C3Shq@0l=VVr6iG5Jt%+t`fQ2)%(K&KIV0q=hY zX8OSX7w~Y(%!h7=uI0j8pdr)=D4+TZ8bMuk5g)i^PQ?;apfRk8CT8wMZ7DQ~HPK{h zJ2WNpGmukN125tDrrJRP)U{9`H46%&)Sri{iu?%&4dsK{QbV95>Q<;7buZMO+6H;4 zBTz@G7P^Y^{R`*6tI0uN7p-jSM$~etRZw5*Ak>cv`x*Bll@AqD6;KJa4_Zil2rbg8 zr2dWCN-EO&1+Uj^Le*3K-)@otuy3GJe`L%XSOp=YR$ z|Heff>LzFpg#BLyKF8uo=y@vgGG4<`{h__oolp%`2_2xGgAP(3Lno+O=rq;#H@tP|rgbsgIzasXw4!s2*4F zRa|NoWcI@0R=XaGrOsZ#`L9i{OL#~O{R5{B7OSCd)Gts9mHsE5aH$bcDRn2bnA!*} zqxM6U)aTF&%J~;wruQ;}oJKonrS4rLvT6sRxK0mzkh%@E>Ru)msfHe9?J#t(mj|`K zpx0Ov9npGI>x7p57tegPc#vnyZ5IV-#b;Ym?1N$gi`PMk)NH6NRRJYYk3#LJSD^OP zhme=L1a+Xo@Mp?8Qwh-3T3x8#sQIYzMyO?UB^RKWOs$7fsi&dtT74+_rl`?JHu??p zhEiWcVOou}!nGP}HPLEHS+a05U35|SD>6nj)gFqWhCps=4wT&|4R?fWj3=iEniLRf zB;@RZRzit6m!LZWLyfjMvZIi6s6vJ=*`s1%Grh9&r$1{b6&~1 zFITqkUnp*+!a_ogN2r$2E~+!MkGd8*N==7OQ>D;(YCH4;briZteGgsAHA9{FlRKft zkiN3E)==yIqD~grhP(#qLfrxNq8@>IQ%9f~)W4wHsOYdz{QWwaM!wxxLgk=VO$~=? zs6r@ckc^uJ1yjqRkU?po7G4;Ep)9@w^}NqCSAeYZYsi43#A=p|@14Ov{lk zy+5PZN&NwZQBA@_jV4qg)RamOw{Y~6{ZTZj@lYf+1M*O-p?GRDlt>+g+EV|3lBn+? zFBQ-@)aXD(LmeqE)Jf|qkyYCp#m+2_gRZ8kpe|ZIt*+Eo^d?i!LfxnXP%3o->Op-5 zrBfkI@Q9$gK$+ASC@bHR-E}wElf{RjUewD_Z%Q^MoB9m3K9sX*sF9<4bG7>FasBkT z{{2z()U^nzmx*I$ zY&CipK(4X7)VP?jHBbd=?y;w#jZmy!w#8V!{*y&oviKC#ih2cVO&y2Y=tUB#f1=io zx(KzWf+IqWMc2vgYy~Z*@}Z^FIA|U9Ahdz{5VE$Ats_H?ZB!w&gIW(gO}zu{q5`5q zjc2GdXb&|5dY;+>?WI11UZNViaPFk~K(A2qp&Dwp1s){7fnK9pM~50ms1eXnYAN(4 z^$K*1x(uD5I>m$9v8-J)Np%h0b>tLCA`zo{JPGBpnRjk*W=o!SW1QZGZs%vj9)9^{xQ8;w7d zW;m(z7C8R}DB^KI%|dsOR-f5FVuGC zRA?!bG;=26F>`IM~gZc6U=d-S*xO7^)`O3Dsi zsEdoKkfcy!iB`GRQYst0_i9yAa@VcYT20-Baci{JQL^lMTNb!M7dL8EQ#e43ZIs;3 z?bIGD@ub!ct*5k}rh?mr8apZ3Z@Z{#P}@zdg`R<|+S)I`XIX6D9_MuG7U((Z1?YJy z&>L#JKn;NQQujhHYQ3cOverK89gN$r^@`T3mSznlyXJt_L9IhtuW23DI->Qu)={lD zwBFQuOUc5Mi7vja^^VqYtrJvahfw2P>SpL9wF7#Ox(K~bC3g%p{y|yL2h=g>L#kOP zyhavTwZp+PEQ-!*ozwb4>r1V#w7%9lul0@Aw_4w6eXsSyOx*vq+=L6dcv0(;){k13 zwSLq3UF(Y0A6kEE{iS6ToyVDQX(ycj%%aQSQ@HJ(qR>W8<0RxOlFj-zlux;@!pVo~ z0vW~9dp%?p$6|@Qpon5Gv=WLePJ^C=qKfmOLy)Ix|PpXR$nBBH0IO zTU?Fqu~1U+F6b_(9eY}hquz$rQ>UQ~)DO^uRIm^4@`_8aY#V4ZYnjlN;&rHv zhQ`g7eN+k=b442=2lX`Mq-r25fIKM!=WWBny}F{iL>9Rj3eYl2rM3h$2ektVrA|U& z)Gv@p#U|s9pss;j)B-4)dK!wMPFtXxjO>P&##A3Dj+zBEr?x^ZsJEe()E`hQ>gp6c zzfO+rJjMxD7o0NkUELlBFL(({S92qVq7ZD_*6Rd+9J8d1<+xt6nc|-40?+? z1f8ZXLT4yfcRY-#?$9~vX6OrQ5%d-H81$`0ehwOo&tv!Z=z*QSL{>Zlswo#e1Q|<3 zJ0S;k2y#-VpaAMCD3A(B!%H|S4hp8aKp|8=D3rP(4d=fwvKYli)IunnS`9U(o`9NA zuR=|!e?ZNs?;w+MrsJVVMM05NTPTW3goC>+ADkzq!hT^FGP?LLQ zFPwoQsahzC@?~IIDi4aIra`T!5~vOJ1Qbu5gc9$yWWp=pFc#Zp;DjY6b>|X*Jco&9uyl zftdOkjEi7R6j@P(+8HQ{HIa)ldtz5>#ZbLbb5oWumb?v$(`sI^6ccVjtp#hMmeet* zl~!x&3Tkb%JQeG(Y{y>M)vSpUDvqL-2PLw08`QQ!9)GpV!FCl!6Q@xFb*>l)eFJr^ zD1jn-G5%(u+aykB=epjAnwV!|qF477@x z53Qjdgw|2}p$*hOp^cOyH`I8DN`$JZe$W=`=3EO`Ey=kkK1MwNJw@$+c2jRa&r;{0 zm#E9o%T!!nT;rfJp#9V^=m0edI;eGsx)Zh6L{{y6;9(XYgpN=N_Zq zYS9np^yLLOd_RHsHv|P(AS;=Q8Mzbi2p+frO6rmMMbww>s zt2uQ&YAv){Qj1Y*rPZ3+iCP;i5A{)hy#9;#(@0o86}Rbk3~b9<>;Rk>md`^i2kN|h zDKrD>x_lk94(i5n`=Au+6qK=i8+w0%GMDd#Tmx}lU~f05Cp8SprmS1RKBOo|D_5)U z@}rnWdi&{Gf2{#p1GNTeU89w!b*Z7$; z%dtVmoyNET%D4tkXH+s2PRYj=O{k$3ip|J5Pz1FailTNxF6ubsrkr^=;HY@071bAN zLrsC=sbx?i^(2%;eFU|mWWM&0Ra+Z!Ew0wEmed3w5L1gK>$5 zk_iV-(VWqm9rAi#!gF)Wz}CCDbP9+C;6_DAy32H7NN| z^{CdHR5$b*8)YSVkVDH!O-3zX<7I5jPaY@+6VQ~%F)W*I2E%jAAwY6W_$ zs6EiCjky17Yd-|nu=qQ)j%qa=&*fA$R838Qwovn+N2mv&$Eata-PGIAbJW++^Hie| zc-p3tp_i#^AZs642=1rmLkFnk&_S(3T8FicXuYoWhSq6n3uZY(9e~bK=b&>`kTnu- z3`sBaC6xz#McoDkY?_CAb_HZ^l7sbGD1!O`illynqNtXmaK_xU7fbYpqBk9d3ZWSG zE{5FHHYj$}sb+Zn_ZAq(;svNV6*(Hm{H9A-xI2`%X`qSM?ofO77D8TXG1P(D26d#~ zggR5-LtQpiW7%e7@Hp6X3F-(XZyFfkGzLSd)~0dbXfR{bJm_wy=cW_TgHZ0K^U!gq z|E9~(7tp{>W~5ykvMCMv0kwRtu2})zvQe@`!KQ&~+_+6sp^4}nziAt^1S;HA18pn7 z`EP=~)hJH1w;Gy6H64p1o$^6Nn@(Yo5m51_*eF|zHl;x`P}|CJrO+ePT4)>fB($A+ z8`?#E2kjPFwN0+Wl~@*i(4I{LG2w9NdDiAYdv)(VY8`5?P%lBRQlCPHsVmUYO$C^x z<@LBM$(j#3O$~$2QB$Gwo2;oA_#pVrrg_jl=m&Ox23@3ngDz3gH{c^FDh>LL8V3DA zO@oZ;rI_Ub$Wgrw+7CIa<**e6P+vl3^-+7AWkgh;Rs$oeFDpgqfn`+8jo87I7kY%s zf*zxWK-;Lv&=b@W=t=4^Xcu)D+E0B6y-Hc3H(|$-Ug!ul06I!dhE7u}pmWsA(0S^6 z=o>2hW?ajmIzr!3gPfkLPSP&3_YQkzkWpiV-ORKR$g7pN4-MNNXDsWp%lL%t5Wsmo9-)u9mQ1?oDe zIaL9*pk9GmQkS4sRKf&2k5VI{Hq;WxL+yp)H+ym8K7|rkYiv!#>1A^^it$ie7W+d< z)HJ9aRROi9o`by9S5ODaJqaftY9Q2Qa{=a?5BXTz0(IS7gxUvCH`YQXM-@T+sU^?=i`)nf zq@IBWQAeR`sL!E1N>+ER)?n&q)P`)X#^#4l#bpKEn@=U6HcZ!sQ|YLUpz^0$c;QJ- zL2;BGI9h9rR)N-7t?RU|*SbOLMy;E)Zq^#Nd9TZ98TVkt<2Rqc_CF03vioyr0@ZXH zPQg?!XbLqGno4bkrcv)fw@^X1;8eZ&H0J986|;6TR7TwfEumIIm78(@;|Hd|6)b)Z zRZ)S{@mU_#5n4s%L#wH|&>CtZw3a#ut)tFE>#3%<;$;k#3Oz{O0Bxie-ip_Mo5<}b zK196>JxpDOs;M?JaFu`aW!$DTXbWpMLR&Y7M&q?3^vLE|s1kaNz1yIjo4u$Vfp%|B zgT8=X+B^_ybQ@j+Z7zVUByb-W$%gh*6QNf&Pepe*bbz%j(80~~PIM)sE{I@P^qh-@2OGH4^$C!nYs`9 zjoJ+TPQ3tKq27Z2pgx71Tjb9E2@0l~6yyAtNP5AxR2q~+^@nn`hEq47Hkz6Tm2Fvy z{jmyK!rC6Fl6oInLHz<%Q8BY{L{UAURa@3!*#Zk(&EkA$&6aH_Zh+RZ_A<0?%U;wz zh1Rq7C$xcTGaH8#)d$*0O@KC0i=l_8$DxO*H=t_jJ81KkqtST%7kWDmq%EhglCIDr z>>dg|N==6zqspPjsVAUq)O*kq)Su9Hs@)tMdRxw8zM;_WEtjEU=%p>8F;1fjdYR*% zhF-I_#G?2nc$md6pd-{@(Cbv}Ts$39$LuaXXpmWp( z=qsw}9XS7eO?J5h2O%{K`i7bfeM_x|zN21%zNbEdexR;E7pPYA@ch2Ti<{IN3f!6v zje&x;%Aq#{3Z@o9VIr$mUOYBtaXpGns9jJ~>UAh_Yd)s=5Nf-19P|U^Wv^pCE?7{B z&{b3h)S0>wx|%A1x=>poA9V!ky48~HIu9nZ7=9<7AgQaN6lxfhO5F~1r`AF}sF$EL z>N6;vs)aJB_`C3oO65XX)Fh}URel%Ff4#^jQ0z^;1!Yq|Kz%540Unf8Hz=1H4Gr8{ zg#9re8ospzx*r5q7w0JSDh&zg)8Ys*m^B#v9QJ+EKjuP~~umrD`QL}1m4}($c{t}9&g39rF zm}&>bQ3Ign)C8ynbq{2ivXTvu!`z0cf0dd?YSBwk^Xx^f7?O(p@8TcrWb*e#cD5t)%_RK|Rloh?K{=D|zElqAvGkmgwp$%&DxGkemo5vMQfW}40 zxLc(bFDjKTkg;3 zc}ub4X3O!&Wli?SD5^bb<0!dJMU)SlPRRmRO zt<+kjwR&DPHtRgbtnM{MN*d`*Aj!w^)jY zq{y#Ld@3q8nmdgq4?s&zsE6o288=w;y=XKfY5y|~55_%*S_G@FK~Y9NYJWj(jHysy zCC=FFl^fheWYr3Ny4YJQ-zdQ%ov_F-qY~-`jWDXAV(4a$v!D`V8)}VL;G>On$%OM$zoBc1^Bl$>!+9aMacQ&Y*<7C_()XedskJldf70++A4F>&B3+7kJ@Fq{< z%)U<44vJn^f~^}1d04v@N?lip+G?oZx@}O{4xA6y9fhueCUM-2kg;B7DS{m9<@{P( z1_rXY28yJffD)+vP$l&~B#YYr9P~xhoK(b9cqK!1f&8QJU3_{BY7RaX-zJKb{w0v* zB-euh)D9?+dKIdhCW<~O=xVAf)P?E?*_Q>chm!TU?$j*Q zdQkU5Y4+8*O<+2UPeGZ~D^O4B1E?4E71W#h6S6N5HregJK-dzpFA%0e_65R0kbQx0 z0%TtSTmacu`ySXGC71SOuRe@oE%ox+Gr!@1aRh}%e7*Fcbm@QgU40%k`?$LdC9*&C znfl}GV=)r7VD@%{La6H@d*p%!OE?^|l1-=?PChW+Y0&LqcP(l`JYd>Bi-$5b0`gF0 zP!P|;FGw%-mGn~4doXpVtRxQ#;!%DJIo=_dJ_t!&O;%T%X$GjiR=V5qVl0|>Mp1;^)S?g zdI@SuorCP>leoS9=aUr3e(JbUYI|f;7ekWvKOC`Ov6S;gT#lu}p-EIEG=++Trcxd#o$ndiL-|xH zG>poHMnv#1$p=TWcq1g+X8-F?PepA2WkCa}a%c#(2^va04-Kb|LzAf=ApdN&wE@Oy zoXl%cvybSCmvETiXWH93jfcSq`~g6`DTEx(0_ZqYw{U)?_zTpAQNKgODf8v};~d#C zt^;cERCtkZK2kb4>D3^Tu-Pal@Hm!-RdUD{_R%Nq5HebxH};Gmr*T}aXqBA zWZlAXmD&d~j`|XE>RQt>=?$pCS&NE< zj73uGBw8%$FRBuahniBeYH)Qgd$knHP#j8CLiTg~!;t;tybH3QEe}BU6W%|dcfOTn zzkwv}f5!Kczc#3?sFvDasI8~W1Gof7SqY&1fp7;%hS~q@mtDRFwZCel?>ebbQ=q?i zd1f|r;kfkPCAE)5RWgox5HdcI+9QyIdKz+m!sGu1Fo4BZp+M>lD2Vz13Z_m&A=H;p zDD@*0MmZ1S6h<|Mc77_Wi-a!xQ`8&^`A(DsHKIB~Ryf%WY)oZ9O{jiQQ)(y_^IbJg zQq!PV*5*LXsZyvVbwAXKdJt+&Jp#3%o`4dmT~J%<1q)0f4?yjxcU|-+6o^kY4j#n{mu9+Dt(XYUOa=&J1vFKrSgUd^Jpu?*vjNl7EJ2`ZBu7JU(B4 zZ#k~Wcez2m#MiC6EN@kEfPY0^Gu-oUba>6io{%1r zO+2lbO+B5F^~X(Ty|HJu8ds{uEkh1!735sS40gVa^e>0suaMm`O;$WEJ6X~)i?Ro> zP?CKkQa0fKZep)FCw>;j{e1<4T7@|8WIfdR1T)O}5pqdMes*ZOWKniYq<=$XJ)_aK z>HE0SmIcPD`i}qG# zH|CNOU(i9cmy{$2eV&2KH~uX$aHS<6Qzmd4t&mCPVEl3}nE-!(j_EX}Gb4>f%xGgB zGoX!RihGjz6mm(4(|Cn7qu3-k4PcQ?`SD2yZd(6h>*UTp7pLV||s;4X$(H^JB*2`;G*ag?9V!EvbsH9BZbW}w+hd+;&^FDcz3Td7qcC^9 zw%0t}`~=!w^GtK=3*v0^znJHm$MvpTPzH`gTLw;Go^3vxd9L{)$uZgAXzr z2mg!NBseKs`kMxiV>Sz}Le_1tk$oC%oHwlOp9oKOKp!dW%8o()w-tNM;&?B|&5iGY z{C~P3gIbxveX!h;5asFGFW!@K)Jg9ykMXGK| zr%e0~3QlwOfb+;)GoYr?P{|fGt&uXZ^q0E>vQyEno3M%F?s{#fx!t*^LA!fyd_I27 zpxM?KiEI>>L$U@heIU7dd@&A+C$p7C~{51wfbm2 zf38@q*HQ5+0DGAM6zzVAp`Dj(8lGF4P0R80Li+6*~S*u`>HHaxkzRH0O|LS zk7(N3IKc7vUM6$+0M#y$w#&?Ron2`g{DijCEa!4g^E%Gs@Bb061-~qm zmuTr8=LEwDi^iWdM3%;68`mQ9Ece{vDFSy@@g2yW?jX;4X0YcKq<^A3x2Ik6iFIwK znb0?6Qe8Wu>DRlym~0pkP4PDtr${#49fOpEJA>I*WzMyB+fgEk_y3CxS-`&{r#Z@T zE7~sPJxH&)+o)*JA834!woGhiUzLNdm9~GLh^7&{!>7uIjN9!-I?Y8!BGP4!bo4@c z&F#jpsd)bPnlBqSp)em`JDHB$9~EaVM*1gmn)wYT?q)`o9Om{Z9MGm?oBLO+s{JJEW znO!;o85Zq}n~n5O;4%jXZL8OInl}xbHC=A$q_L9zaq@m(Big0-{^I@y^=pRQY~5Nn zFv+~mcoOX-bE5GQGRv$8y~3;v4VxjipmB{GS?G!gXp2m7k20@D`d8%d_qXL`y}jZ9 z<4nDAPV<%__uM8MT0F$62I>~@8mTj-qXV<99%vM>j?bN#F4c}zZ7+Uxm@L;(DmxexSWi>!bd~q2e92#T*vsGR zv~#=DUM?d@+I1Vy$gz&|S;HMq5QUDHnX??n8Vt-Z{>6HRBdS;)$L&0AkfkxEaUC+x zJ*fB|WVt)E*>Ysv3Njq$&~}=gnq6dOn1Qq8#ix-Si>z?9^<+v~t|ZTR7P@;jAoJY) ziw`mf6o1MbU;G_%r`zdlJiGo18mT=NZseivG}BZ&L*+~Uw!_}DpJYyQ)58}lp2Jsl}@waqrhoS{f|e(AWR?!?F6RRn9b~KEMiVo?SX+?(XK!L2kc*JeCw}U z=#`1=j#wjLUi}3|j*f58{`c^KO5PU_)2&=}ERo|eV}w6o0lk(R)} zg>&3S#EyDxoVfx<&admolTN?_v~lSqzN%gw7a|(8<;|x3rZhXO$6fW8A33_9UVEoI z-tsJ4P&c5!6_vNjcsIkXUsJmcbFX-PRgJQ>w?RHPy0z2Iv&mHyJxW?0E2ikF_@7g2CCnLv?{SaB; zid8oxO5KpgbvFe4`(lR~VL0~oS+OIG=mrPj#IgO+&NYK;W+P>y`c-Pc?X&2j#}^`vfMp!>{rO0?nsZLL{?DbXwIDN=!^8VTWdd18s5i7a#(fs2{Wz{ikzZX@Vbnc>%Ut zLWEi2%AdUr?VOm>EUD+jtWX)&Tk8G|!bdsg&uDw`iAq$ZWQ65TCc@*dVaCVbfIMz4 ziaeyUfWZss|XR@9Bl zHG3vJ%(i7O>NFdNpF<%F`J1gMg?*-nCtZ;>dRU*q` z{5fv6wClzX4}2BvLYJ?@XUyad7nvy?{*ts@X&ua!brV&%##KoNa;4PkCN{ezpq=L) zakekA+}$DZMx=j5UNbOU#uuvj3SGs?_VNuk$ZLKZ^lyywny&_jtitR6EVC$13R&hW zB{3*uncYk6?65Ei?d|Sv-BXx>X;RRJiA7=s50;;<|BcwwbFh`)q4j?d%9_aCm;)=ox|)5945;ZL_20l z=DC-ik-C3F%3=b#%E4IfZtfY0dbzs=)8C(K?g_YWEgt{=LWRq7$E)=wh%+k^zehXH zykF%Cl~svbicKg=uvLbxY(8|t8=3sMCrL+f|i|usXzKd? zvh2cA7Ph;~(xvU+BXY~9V8wCf158|&50G|}d6&w2RF)QmXwNgu zQdp+)K9v93%s?Om~b-m}T~l zDQ6B)?L3u3R4!Hh%T(U0a$M|MF1NUwJ>R%gnFo*miI?_vcTu|Cp358=8^V77!Rs`OCPl87gLh?O2V|~U z)+!x2KO*7EXl5c3kN^1*?NyeaC!?IxkU-96to zhk2)OF|%B?W3BFXAyH*}rhi3Vb6}7xh-b5Q&oXDJENN%gOPSl<_JnoIH4Q(5@mXfs zRLMeDqohkn?2);W{i5wGi?NJuQoycYN1nU%j4V*@4oj5uPl$7S*VYfpK@<=ui5IC! zc7`Q&MjI2)k<5vik|Fi7n37~^m&N!}v+Nw6$IPEN4k^1{`f>d)fAL(qpfcx-OduN~ zS?>02kp;`$`H#qgjaocVDfLDzDpjsfS*7wJmCsem3L3R|p6S0K6)tnqMbs-?zDa)} zEfnT7*~ndDZ;{&`kmt7R$i*$uUye5xotUn~zDWOsPP47!KD3=?3Ny~UFHzd^++k;> z%EjxYEoVME4@t`Pzc*FkEtSUtALPJyRr@`aAF6Z)*%Jh)3|1MU(xtLx(Bqt^6*J3h z9wWxjj9h;IZWl~m=`#%K;>AK*Q>lyjk{Upc$E`W zPEt7~=01xPO;d&GDsNSJo5~`UvsB)x@-CHks})-+D^&dfm8(>)QMpd#h8WA=ROd%j63r>LB!vQ&**q}mmhDm~Y_yj9zSybE~|LDbJEJZm?yR+Q4fy7Vuh4 za(;xvkb`l4M1aabl?hj5!ub)2Dz8%6Rb{fuZYtAMrmM_Qna#B3NAyvJ9F+r94pccz z<#3fFRFjtH#9ls0W%na;-xs=em@>X|bWE7!cK4U@b{gr@zuoOb;_<)TJuTht zC{i7BRr@ZLcdK*^lNDjXVfF+8DubCLW7metJR@Tbu5e^*sLE&_JN`4~cK34MyiGDs zV)vyM(Z2gqW(Sp7Dhs-=L*2h%9KJ@==pi|^wm0ICUVKAB+J&wad!$|Hs#3XfkC*NB zdoqzZF_W^SKPP4mGtb?xRNBaQEg6vKPJM5%T{t5XZg;QhelxOe#WBXiXvdjum9b3O z0I6r0UX>R*$}Ouh^CwEZ5Z49m?4S5F+m&tY_9~TYthUmD3kbKXT(lo;JU`zq8-gv* zkOgvLCTB=LZh>mgWxFiKNS1n@+g?7;-TsV>$Gc>e6VIGryF|4eXQh9qJD=-m)WTX* zDTPKY)~eiADR)Jq7Q0pZ*-E)Zjat0S^zRW|F9?|RusrLT0VPaN;Qh>mz)f~NWCycp z_)E-=;qM~xZCftqHO&xN&j0-bTm!~$Dd0eduYI*lY-HymbIq24qnVz-TbO-S4pezf zU>WPz20p}e_zp3Hedn0#*EicN@1EN`+)OXCO0CZ-aE(uBi;e=9!#5OJ=(@fAZOF11 zdqc`%B9d3L9hJO?=}LYRS?+G>`Go0C{ElhgfVw^82={K`4e@0n@rubO?L2ot^-V}M zPCozlhHv1&j^Q#5nEFQFsLoIL3RWUhHj;Fru>1Ak-Q9%w!y^|^sw z=7)jyxKC96Q{^|z0@s3st{7L~DpgsLFo^Bts$H2d$YNn%f=pE4I*@P^+J&xYkF@df z*>@+~#VTj{D%dXZZDyAFb|EWV0}>B1$0W)PD2u7A`V8%|nAIz#o##$zD)Z&J%g$a# zJT=Ksl~z_h#A?_;*#V`B`8Y>J_en#0S&@n~?r~r`bJV_G7ZkyGKdZ z)q8}8JT7-Zf;*a-=x&S5GMg^yhRij$1xkOexyuUdM_f^bKLbaweM`_JYwU zQO2C$Sb;2XT}r5C{yX7mBrZgz$UKFvsFWkjm=x(Rbj7BeVYW!Q!fc%qy-n&5m2_cR zRrmG*DqOP?hcag;%0v~eI}&eUdtRd5KRJRMx!?FSBKP=1Vxd)s(&m444mcu)&N0^qo&uUR!Z5b98gVY2 zIr-c$W;xsbU5v|iWm{0sGG{UUb+36N{$8-``duMW%-tcKm^Zpr-L2|wspI|soHFUi zGVfseCrUD>MBT{+1Kf+*AD^-wnQM*@dK@|39Orn6Ioa_BbBf~>bH3wi=ADjTnGZOE zo|N&Gj%Z{~OnY|{vMgrCYGmE_|DCvkxd^%y>H^ko6w_G9VQL@JU5P zKQ&O=^6po%ZXz>a5!z1E6Ig}BHRFKI$YW7SJ)cA#iniPS@yDVPd%n;9wmm;*e{lGD zB>OG=f4bSx5%HAlqE5^TS7=ykv~iHl_96Wf$q8yM+PP+oN3y_WXQ9q~-&)l1!2|ot zVxm3U(9Uy5dk!=0db!(9nb(s4InAK(W>3q&!21%AQj>pp`5bs1+GR1*W=&(xtCGxf zhgRDefA*ewXwwdsJ7ntL(#1}&DvFOdB?_(ooE-jB7OBY zAj`DuE%vVn-*RiebhiwwDv`w7hg(+B(9!KmCQBAl}q9i zlJ@T)u}2q5+rM0)tFnEgXQY1xGslWqn<)kVfF!eN(Brtem1H(k8Ku&ta)!zcDj!t& zkV+%iUOrgmn&5$$KgnFHa-GWcOe@J86Cw+E&09Eu*St;TI+dGLZdLiB%9oj0<}!By zR*+@>=$_2{*)1!?_kLsNGP}ge{J4UmGF4@Uq=k+wRp_NMTV;;QzA6W*yhi1u}9l%s<%m zPL1>rc74p0E2q-l?!GJCvf&tJr&DDB(|=HUan6_f6yFt5X$9H$^?%;yc0D83J_fQ> z_EMRxGDl@!i;(+97LfbK&QDdQ#7kS=4a>yy@pFN8=3d#s_6n6%Dp#u9qH-&9uWu@QZqPQu7Qr1dCXW_ubpJ(1b&Y;9{rf&RgO_vpmMCr z>jEr$#n-FC4JvO`d6UXCQ@ar$~cuCmGLT*RCZK( zwaP9klT~(8nPaDAUaJa2R1Q-)QspR>b5zb%S*~)K%5^H;K___(G*{U|WlNQGD~GomAzEny06Jf_9#}a`d-M-}f~1^UFFq*g z@Lh{`zv%o?G7gvN)TdsH(`8&v%o--Xvc>WE?1&#WAt%dndG4GuGEO#3=G*BuECthd zJv#hbhR^#-s?nAe?`JxE$B_ON$_k{8XUkDCVV>JJT9(J2m?-091=7X}I8OFJ{rT~2 znZVe6a`0L%g%oC%+07*#S!RmLX)33yT;lSvKOx2*m#Ff>1!)g9=T=IV#SHPyU>f5j zx4VZww3s=9>A#`5mf0q7A3AbzJx&J7Ew2iXs0Lh7D7s>*%3+=QwXs6r7 z4cY0A_Q{6eQtHBMv7G-F#hFVI%h8TA%T+EvOuH-+$%udr?P@6 z9~4SmJ|DF6n98?Re#pen{kWt*%ZyjqPNi36N0psaW~j_U;_;tl_EUwcV(f`JtGrre z7nSKMGgM}(%u?A?WiOSzRrXPtt8!kdy`DQ$*IL~2+1>5J9A>Ur)l%BI=H^9qKE)i2 z&x)ii_x0n*f@rg!vWIbqp~>NZqG{p2kUpHf62t_e;XD% z{P*Gfh^#+by&`AEe3iphPEa{X{(`z<$G(+8Mwu_hkES)<#%D61^X_Y0Z z(#|!P1lVaE42Z=7_Z32Hf&tJ}&3$eFS`)9Jg0 z8Q>es4D{Lk`Lm}=+rlls1CU!Tg`Aj$=`vwX%%XG|m=ja3a;>TdW!U{)Gnb$r*NBp3 zIeC1`3i90cczK+!VY_nVqfFnZJ$4q_|M0e9l;6l z4Q5V+uivV+i@U7un20lE1LMqil?f`_8L}s{%zt*QWu9l|n)VIBFEWUi@(T@ue)sWM@nJ3h5pjbwsK{~j7qYWKH4V~-!9vV_noOJIwG^6>jNb2@(h-_a3;0@u+5>A-m)QL-#% z@k&WtXgt>+xzio&k+y$D@(IZ*v@2Zy7jNes7)90n{X4TIg(TeBoy{gRcM}2&p`;Or z1YEL|1c)XfK&V3KMM)rqBF-jM3mQ5+qSAbnfC5Sp6b)8T6ckZV2@0sFpdtuZ^PYR= z4l^6U^8SABn?LfI?>Xn5Tc+&H?#vzk(k(o0FVb=514A7AK$-tG;qWPFc=93q#{j#nf#(f9?vOpKOJ0DE=rS!pH|Vm%phX&Mx&Rs; z$qJ`$8uBRi@GhN=27ALUB?iqJbPTkQW(YqS?A0(LIS2GaT3ipuis<_T?6Ica2aR#6 z?%`M&eFW@^HWcY}f5Nr5^uS^oQrZ1&T_3XBx->n+F2m(6ErD9OLw0+Yjc9jt*=w+i zbj0VEK=*N~)Z*d!px_qoTrUsP+d6|>6LbSSiv4)P8qn!`}xdA zA2Wv^Wn61+0)z=d&M>VdUu}84mozU}% zG%s!tX!wy^NtlES8Hx8A0uI?DyVyQ977#6qLBk>W+%|(9)^XC(PxLsr5g~QPr@DrX z?VSCjuGynqC7_o89|RW2iicFgLS>{%nCXPPpo-}kQf1v}D4#7WH7rlI zT>Ls?p=_l<1wKq#xtXEbIfU~Cq}FnFe*Y@?H9d*WA*;@^r(c7lbwJHtAWwF;`a;)i z1n)QKL-wdHKO3}27cWo#Qqc?eV54~cOI?d})$$)f`{;*4=vRzFLNpK_I7;v!{XIGY z*@+9I))0}_ET0bALw!kA0ruCHe{9emnqg|JoYM@&?#vNS>cJ zUeL?I1IJNS-?9DP)ocUML-#4xU9gZ&yT_|^SF!-O1(UN=B@0Za{pK*T5n-%$+H+Za zwKI}4DwmaGone3JbY67y_eOnt^kmR~wkw(=4+GTVF#WQVR;&B5O5L7N-R`n6u_twb zLB~<;D_ZrdSgo9gj<04HD7sdk9l5^$_i?VOPP(E8_-IWvd(cQL(8qba+J9BoW@1ohPTU)U0Qw)g7`86QG6x94T zLLgC4H>5Ra7*MN#&FM7tcX+JU7Dko;=h>x8+mW_QM}b=0e2HW=`-Ax#6}CjSE^G_r zexxi|3#WyZvaCi z()>KoCXv|Rh{6_Ju|Wc(H`WHUOF_1#KxnxXkF-ghkY1?=G6Q)iGz2b(z=^>3?84@Gz*TZ6*@SFBjv~Xz zHQ?Ja5pJ=-^wN>U)d|RkJ{u{L0YI2pk&FOptD?kiBCi>=6tQyXSW_eAQ?Q+|g_5s; z{rcw6vIqjqrI$flsz#ecE8`f>(RQ1vkuRSm)B{?pV*+)NTMhbhBbWmtNcY?6i=>%B zziUra{6%0mY)?dLiDXLYV)<+am_jN_mW)2FCPWfNbh=G@G=h4X379Z2?TEGt+ehat7ZGHpk`4`mH( zC;kT1?TO@;21ebLYy~aTcgS8w1?Gi0iiX4F3*=eyJMs(CB#Z^#C8PuOgb$Ja;YPiZ z%mppeRpdX&)nuE&zl1(d+!4ljpK#Wo6`A%B*`B5Xm<6?Pip zWZF$U4O*t7#cKifeZn}{du95PP>Ot6s6+;f4&^-UnCwz`%B^#WQ_<1H;4~6^#SU6_KT0$;2f4K*Q91rVGfSCP8L;gvkxm!wpsl9_G>Tl|Y9B7(@9A;XN9Bz6a`Kw8cWO09(QjvA0LS%_~A+prG z6S>;_De^z&5GRX&)0}`jU>=G*XkG|p4Pf;{1AaBTqgdc?<^mwIvA;$%n*0X35p6<( zqZw}@GEnuZ{*~PRDDvHi4FUdF$$o=wMvKiQjRew+mYP=}%N6rpTv%%U2)WFB8ELXe zjai^%Nk+z4`T}9{Q}bwKsd+kbsrf;qWLXPLr(caYh&(sq1EAK>W^`Oo&nCLoPlgmV zB!;HgQe*Uh`nvwin}u@6doIW8@u1h#(*gdQomOTkQK=5&`DFbmLF-ricmDeEf2S2~ zl2U!{(fV_Ys&kM2Z^hNCN52VD@7bI4jgz5j>#%-LV(3{%WV!&euLd?)ro=U=yFg-q z3NW4arAv{cImd8L2EzWIPVeT1Z;*D$WqTG146@}ke-)YE{1}q7ynqy13O$%#Y}p8D zYIz&d+%gN;uP>qb_$f;1-KbsEk4&HsA-!}Bas;hbU_tBQ5;{HfFzE4-tHm=0d;O2m ztf)79PiE@nvZ4;u(?8r;ZHE#d6L^>17vh{$!(=pT^e*)tFF0Q_x%~w14 zb~fVbr3YL*DR_0IP0b6p0#6Uz8~*xYM!Wjb%LmmfuU+G)dHx))1mCcLmQY(YT8p&< z$Db25xM3bWzWdzZI|R6pE}O?LC$;>r|1Vh>*yF!zam3$Lq+YLHuOLdU7azDgE83B) z{%)l2j_M@FT3o&T_xi?bjAy&=-^Kgrca_<92y7CRi#WHaHq_dsy>_Y2F7Zon=mM|Q zHNRG_zHVzHa@$;eqmHFy?o@-8A_i}tnhX2CmOzTQd;3-hh^4N1jGA4BtF*(QWg166 z3$W*`%<9MDRci6E)W2#O*fqU}x*bjOjXKuRMbipI?V-tzQq6$6o8wr37K;BnP*1?7 zh5s%1Lu;6mQbIfb(bsmBYq%*8nImL*8jEo*_`S1`syo8NLwHK4XsHH66#*@cHy zQ0ZUCh)($Dp|6vy0Bse@LBkF7!hC~0o)Y0I=y=-5(qJefkz!Ta7>T6BQ??K)MUjp` zt%7*k*pjUVN}M)MH=`a$+^YlhE1!ITn0GCLqg^zMrs-COmiA5^)G^F_`PZ;isZ$#2a>zW9k6_sS;^p?>vx!&Ln~YUuw_ z?)ZT780T@$6P%|%c?J`m;rblcKXQGE^D^g8oYy#i=CodW7xR$1FNeYY9}n*dQ+sTx zyMzvNUGQ+WN|Fc!Tp#Lm`b%OQ*tMaTBBpE~4mzHCOp}nEIH#NDqwZ!|hs?0Nfb?08 zt9I*E)oyKaC+z?6)MxE}Cu2>}-N^kx4l(eLuHA)KMY$3wI94MiPPbzn>O{vjWH*PJC)c6oAL&r@E5(kNF<`OdedIdF z*GS2A8R>SJMzNlZbTvR$xa>%&c@w0&c^tA^^LEJG<{goXn|p!U$a!F*&3w=vnktqd zJBq6q6}mv&i-rfqPmznnKagug*JxH?qnH6a;jmaoBb!?%A}3kzMXEDwYZax_isaQ` z*R%(IZ{B3kRgSad8-s@Z-|wme18n^+X$<3jmlH|cZlu?pfb_d>L)N$lsQ#GAsz0Uz z*)3)%(jW5#vL@zvpwAU$B~j}6VmN@7un789WvK*1zGGdjc4^rZNe2? zaJO+I6Wg>$c58DhQb_2IloE1Od%{p;Zo(Mk$b`F*6$vwedV_lfKZ5o*gEu0BLS9Dp z3ORvX5b~9(sd8C0P}>C7A|a|hvQwNI7?jWp^@4<<$Tt%v0QHKz%lfPX>hX8>dLQj~W?xi!dm}h!(fyzGnE*PTDxddRgbSzpYz+t?f86I`u4Lxy#h+Q+|9~KWDL?p9zrIN9Y`u3zU=MS*H0(Q z`i}|i={3@NrE-tSsR$+Pnr)da49E)3wZd~}QU?+R`a2sbx)u0}Y!Q6G)$m!ubYgTU z$wxLIvw^ey9ms!y^ZnhkYk*pVD12v}Rw}^zaQvhnav`}3S;aLxsH7U!^1!Fa91L&? zte}=Cnach%2K}8)^0z9}{qPO`MYX{~5wk;sMYX{qHh8w*M>m7Legok~S#7ejXZh?b zADefUvuio~-2K38Ilz5i=qXFUsSh+0mI&!(sSGw#(Z zN~3Y3UIv{QX{NQhU8zf>Ek?z|p&Dja2=PVnyuJz&M$G^_ ztg?!=K=xzm+dwu_#-TTiR8bZT0z8JE-`@{`TF>hDhy_f;K(*%~4iO91U#Ep~)1oSf z(;5^_Ee%(JPNTM>r+_fIV#No*D|TY~5?Cnb6f~^h^(ru=`y2v|14D}QaU9aDC|gly z&|1PY8d)^Opk=yCSOHq5yOGf}s)%WL$dagxLZ)%MkM@(9-A5bv8MRfD4}OIiX48az zDszxUQb-chFu#_J<6dr=yivL4Q$x5 zcpbB^T^oZ9(>exs0xJQ#!@aa2`5gkyRdflhWR#FvfqS8cNoc2wxgV+d)2WwE2Y)*4 zMpqy+=uV*S&!XXTn7=n|j8yv2cwC6JbwswXWg%PI1|TbKqmY7q3Q$k9*miQRuGy*A z;(5A;$<~wH^Nl(-DFZazfS=S4*&%5tqe43-jYUJ3q$xnX0x4-8+HFZI1MK_UHE4gy z{U-8d_dCcM_Xo)R?oW`fxKATrb$^9?%{>G8y8Arx4fjPLJShLB`x+V!xPM0;oGOa2*|pZo{1f3kU@u|ijLOVDtGd~{o6Oms3bHo6nCd2|A@PjaWv5@BNPKBC7_Y0&uyvOTXB)lE#0jAA0 zt&o%Qan*j+*hv$eN|dW=hQ_T)3s? z0Mb?S1=3w3E@A~eHMbyJ)pSL+t{H+%uNjN%Qd5cSTC)b(v*rn8ubTbH%$iS-IW=dI zxi#b=mN&1a5mFgk6N?K&YC0oF*9=6CsVPQ|tyu)rM<}UgJ=#0e>@(OiX@`)VReD@+ z8s)tPn$4c?T+HYpX-Hbr2RWgJ>FZwz^@e*t4ldCXNR(zbUM3JP9RA!$37JU~L)(GQ zq)DN-B2zd!aHewlIJ+Zf)8rOe5WfWGlo^a{iBy)*RBq_T*^@JqGmA5iGoQ0R=K#)u z$dy#+G6^aWrG|7muuB&rECy;LI2`U-c?q;nM#2}uvc>;48m!2d&r*6E^vh>m^eoa# ze*kI;vT2e(ZaGUp{TV>bzE27zGeGZ?BFF;rIOEJY z1H?QE{D%{~vGFTeKy$wj2&XGF52#h-qv;iM&>!bt#r;nJdphF$F9CmZ#`zBbwfH#N zfqV}-j;518fZA(5(&TZx=2G*cSn*!U0W}^zw6z`t#Hn6(eAaI5UYGE|e^^g9BrE}D)3#M> zf!E^{2&}#@#0(DNmsa}f}3e2Q80D16v&juhrCHv|To%qgD71QKkr zrt}8(rDLlmBga)efm~7bEO5SL?p%wsbp8n$+&S`bytAsW5BQ#a?dB1{Z{(oO4+GCf zh6~lm2;m)IM`tqm?r{a~4ss?Dc`aiyNd?{;)gWaUGAv~lP#c+{@byQiL zfSO;XOUOKfmLlx3|c!7=_6)SELGr;sR!SVSq)RK zK4vHgL!G+|G;ri=DhuCNx$raKlqezLJESEceWHD)loJvxFT0d*f*N-1TR{ce}n)80L7X3;Esm6sW zvIDu6ynx(BUPlt)Fi@*#AiT%4$u@xugy};%Aw^R*k_;FDd>^ieng4yeU{bZ}PnA`B zs;t^mWz~L%B8O3yU>Ofs#sdy;eSinTjgy#oe56`XYY^PU@3(J<-#2M;b}CS_52k6^ zqXTqw@)FSV{pyR?v^cn<<|qF(a1_engPJ_c*sdrQs0F~YF8&7%TC0dv5WE9V2Lj&U z#{4N@*UAs33EAC2Gy6bfTK1i~U#S~R$7e6p4XB?sXdk`T|1uUV6_2X4odd!=h}*(; z8Y>!~-6cRzD4Y_YNzcQ(SVM%KpCf6{A9uk4bTB3JExXY%KME<%Z;dp~?~F9h?~A1K zhat&-r>NXjffRNvMT)zg0BSuS2493_Jr6hOQh`(CG;x|qmVyBmZm@C&aR!rd=nvrx zCG$}?ARB=j;gs<;;2}HVG;>-wt(?J}A)H#dFru&oT8ml2uP|`~wFTQ9VTrJ~5K8bu$50Ghw*cY@+ z$BKo>>7s%>%Jm1RCr~1;1N#IjipP;=(YB9itC$beD@-77q1{W)1lX0Sq|r-y;3O&) zWY_3g`<7HoG>w|c=~s3CG-@HjYepShPn%IsgZHGdxcUD6*=|GpOofKkD-d2!TX_Pw zIlxeG8nuxX0h+kZ7&P3xICskH?4HD>NUa0q^y1kM!Cp>(Jo_C`DW{jtTHj!X%V(Pb z^}uUq^8<7ec@T7!BUXF{xj=j;z@JPkZ?Zg3iY<{>&UQjxJ(~lpa`X_#1NHnVPQQ2|{J zuZnvF`G~k1xkfySd{X=#`IKmXhsA9cJ0iD;Ly*slih>J!#O1&$$IoOl@)zfixnZK>r3)m$(oDK!*BXC-L2y{6;D{e!6C%%vTLA;FoQH(sy{FlUJV3p&jn1lR4 z5of}Jp6F|_1_QqpFC)JfJx5rVnMjm5%O=1$GLW9J+(9l493K=FILpBtJ4_P1; z+aZ(1JAitRGBIH}Jm**uVDH84Ht_?4y`1{QRv)o^J;l*LEf4Jf0tq|L93qKDn#rw5 z3&}-V$rNM|S%eHB+mQ{(F=Rt>9to#LCs-bdG(y@)2V^wKMy8QcWIwVInNMChf%|`d zasmwl$W`P(67exhG={_>#}XfMJQ<0cK<-5rk@d)8vL88>oIy?__y1eOq61@!6hU|YnVqqlVQ`W$6a=U^H z5o8il9m@JGzInwavJ1=Ie3hvc)n8?L1C)1o1HLshp#ISRRfE)RK-+fyzCrc2A%$;5 zdW$-pWJ41{Mk4>baXo-`8`+A~H>RVg|Jk;rcSzAT3brw@jYZoQ)NMc;`bF@$AN#q! z4J@KTWM6;|Cc&qT{z!5+=tVFQdzHcd5ZuydKcmMzq)kD1Obm6_zztZ(mx~0^2RUk|0)1}$SoU(z)5pzZYm8G<3&LlLH&M5_IJzh%h zpZbCzLcs^7zK&cp^)Pb%)Dy^$r=CGxoq7RzZR%Cz&r=1Fm1{Ar0dn#*2l9bww;*4e z)(ZLNv}93KAn=1}UCw8G6vbYWC}9AWCpTL$sAmNl~RjP23Px z{yi3y%6~@M%1u_*)5!90WYcmdvRQe1WQX!JWY=;ZvQPQ#$n5e0WdHI)1WJEGB|50XUml$Cd#1Nj5SU*+d~v!oo}&d<%;d$%jZ2`5u``Lg2*o4wx+C z7T`!(gqu(pP4E>QqZxkHVH_EBKe9MzCGeuG=DP^-EZ;?lXZbG5YQC5#fjkRwxlu|^ z)P7vZjXDO*i^_}o9JnQl9J9c~)eT#c-M`;oKx_3_c{?zudYt?wFt~cWd=eN^Jwd(%46U9hhuB2YK&hT2-vSF^)sy88 z!0_t3bvEUz=qXRM%Kzlqz; zoRS(JV`Fg&B(QUb<0rL1B!%yN!0u!TF3M^}7iF~~&{z>@tOzt#1R5&>Vnsl#2#6H{ zu^u4S17!6mP=Q)eZq$ueh1O%{_d>&RqjIDA0@1=Re1xAE2Ah}lNC)DHXqKB>v| zjqr8sxkyx+I5UxKYyTSjY-1#_VX=*|5z<7`knnvTa%4~;Qr{R^KDIHcRP(Zp@pT0p z+SXWqqhsrQDfqP>vUNTOlCX8IvO8yt$Teq-iN~2aB~BZsoztQ4g-A{(BU|Sx)r#0U z=Nczr$>2v#9h1jLGfSP>8_0y=m+)&m;rfsQHIxlL5`A8_bB-9hh-ZR*tZPMT1a zS5NP*r#nXn#;>WTkJi)YQLFXWu@|a`G#25u($8pfAhrtr{agD6dyl9=ZoT|cIq zg|2tfa>px~29YQR&Sfh+B)i5bX_i8;V1 z2N6dAFE~Ux5ox0Hfv>~W&jzH0Y(`qib3kq6cG7WlKj@wGcIgOmg7htNs^n_T?5VEg z*0BHYr0$rmXqXmLgiLIHAJWolFLFiV1!PWDXguq&K-vSL;rIDeK76~%W%(+X4*{-{ z3r!<|F%E&uM2h4Iq=_6sn#r&6u>Z$6C~47#(M9?LFE|LDixlWOq)1;zn&=n6`~j)1 zu(pgziLuC(0iA(~$HbaDfZ4~b-n)^(-Wf>Q`yevPyAm1atwy%=zNX-U$6Jd`^4QVGdf!Sr^MLI|UGLno3 z>J`suwGQ-7IzH(jG9~$IWL|PeBD42XlGAY^KlyHC|KxQ@N6Jy;(v+Yi7C5HEtw31k zHA7UsG8(u;4t?(~r02caNG~#?(G>C^XssbbZC>m52Axj7rJ>0pd@ZM(hi~Rs1+mg- zq`#^X$VOrV@RTj4`&J-Syy7fUTz5g$>#wNX@Vm;5))W>eZVW>Tn`D*Mje$-_0}>0= z8su~|Bt@X-DN!V7AzO$Ng0>q1vYNu~l?Fc`H5JLLK&@a_Q!^27)ipaZ)^yMlGkqyQ zUvV~0WgWcg%s^gqPCzD9RRI+(@h&QocfhcVTFKWy%`Qd!zU>OyO~l@j`GZJ%pysb1 z&-~*9{2^pofDR=~bgk6wqQPV@7u;0B?C{kH(nSh^v*aLoW*Y4OTHtPYvGS|n(DlHE2fd$M}L%SLiTB;ro(D_wEZqxl9xGQKDXb-L6tmK@- zIhQDEz&vi4&$)neA?JOZRh)}CmvAoST*kSaa|P#0&Q+YNk-KSsrHVB`8*&d_PSU-s z#Va{?kQ~(NO>Z9h2e}h1GgkS2WYbdws zWz>oqvYQIF@C=qvw6#N8R^0)-NDG@61GPk~!Yk+}t_YveE=YYrLwTtPDY%!b+FfIa z>rcsN#oa~HpNgM71bkkh(%Q{zfy$f?&PYxtQfmMt`247vfRmiz8u>i6tz~+>UG%H8 zBDL~+s3dgip*LLl%jdnJ6x>9E_qMRdzONYy?xEcr***0{d*~>~EYMj|Dzyq_ct28R zmIy!PcELPsI`UO@HI?Q}mBE~p)5huGbY;$id`oDI zsugO^QVYtQag|K(pj}$BE1(^;E2kG(3lE^Jfdr!Dpidwp={}&=L)L*WLBkxF;uWMt zwDw~f?!^XXQg>KWq$kV+R5EERT*#!YIpaAK!;&#Di8Glq1v#6hxHG`Ngqkz^;z*F* zD#hNz(M|?WL3#&QBE^ZSU7X2S3wKT|=?CZkwQ!60S}=%`i|$6Ypof4k@94s>fm>n9 zEpvWg4--MN9%djdVgWFdwhJ4NY|oj16eTyE0d`Sp#n~RYRdy9D%ZL5nmzi?MCI~PN z;c?Kcg6}b*D~$A4hfZZ&SOd^YsB3&zoFkIt_61mnDk zXAJhr$Pl-+KriQ`gDWNGx4Q&1gnafl4T&>0#7A3W9!2X(p**iNaNS6i#sX{v z?uH8gJd|cWl>dAr4SC@Ezw0CL?-T9f4PvXLmJTO}3?p)pF82Hc8XiZu-oWs|>P8p~ zR5wD{|6wZ(Sl2%Kw7&-ih)wzf*RI`bDgkO6=`2~ZzYt)rrBc|l82@a5-AAAF9|Ak` z|AhYMbiV>wec)gfu3fuBcl@P&xxe)g7HdyWXxYEClt{; z^|-94&&ZPl^s8Vk{?Bor-!Kj;=JhIS#aU5j{xa~-iO>Ga_%AR%>zYcno6u2(_f%`q zpDX(6UsiOkUi_mtl6ro+%{Y?E^_I~8Rz!_p`}Z5j0y!tK4d{HwVkr$+85!-)2Ws*8 zj%AX9_9pKC80?ji_qrR6)Z=RD&*Xdf%&3fXxu+ZK>_jE65I+Ce$6{e2t2o#T24IMn z=}g)!Y%0HQSh!21I*lV)I^*)+yu z9>vPHqfx-EvOA~6DA@nC1ew$umIIDV+C6L-vIl4HuyLsSgiQy+m(^7d0kv{I>hL}Z z8eUK8-HA-}9sp+25ndZ%|HI;{PtB1g|zr3Ros zlMV=b&Y)p0ng8y1y=U9t%c~2ZYvDRUn7}F;IlnP7VL?lzZ$UaTZ((=fESWq!5UAA; zFGzsb2V=n81y$(4df`DR^-&P*3x$4ttLV=Le=VIM44$Yr#79T@UjXf+Q~d7(;k85y zYmwwW>m;UgmNo~@lEWYN0rM4yB;~_`S{-|sZlCM-$wvLl@Q3bZL;CCRCxC@=57Uc4 zEgqiisQeu?ygaAUIz_j8=tn}aLD$kx1xu0c*ADrLmT2wTJpmsQ|5n%1?}W#pg1;}f z(^!uJ$NKi(t57hL7KK@g^%lZ&hu%)0dpO#YZUOesD~^E9=+te)X94ziDjH2?BNQ|> z4ybi(2z@$ixIw4Woe4`pr_hnlUrW1-I}HIoT4^WK^aL<_qQ5ujTA0FjBoJm- zSiq=NFq^LMtOE^0`tVx@J3M69x_60I5nDwsRtyFW4=&_P0b)ZHL&bk?>5UU;arJw8 zvkJAiAwSd~iImpLjasM`(0ZsP)_QO=zdEF>r`@op_2aaL8}cfAh>Yum4fWi&Kh}oG zFhW{G^orCW)e_gQ@bBZ5z>P&qY-r&P*P&Knz`6`*Xkdrx=hMpb;~#tCvi`b$hi@!I z-&g`F_;>NOG~V2!Oy6kXCY8z>(8_E&zV#7UD3nK8zc2)N=p#aPxnAHiF)Jo{x~?lD z<71|Qu8iyzvoOG39P_O~->hSNRq3-Ou=8}bTht#aZI$@w|L%yW4TJsvpI5*R7{&(H z*Z*#nU;`BB@jq>VkM^#JnW;CxM}HNMf%Z{<#pl4;bX=>8KsZ1xw#;HIUfcvZVrdev zGBVem3Dic|Lstk2doY?kSzQbc_JFkU$;<*dJh27~rno*b6s(1xQaazGC-Tvb6{iAp zj|yqF?k|+5EiDev{-sA%tzcucN4xcwxy9}G>Ir7a&6~Vu&@gjmfZs#I#4o|m>;kOP z`tkKOi@y!xV74T;Sa5>^dcckS^%MS`W(_-ZgL(=Sxn;_4;3$;y%wc}L$Axl?HN~K7 z;hk1PK^Mv@wULUWlgW;NxHYC06?z_c;iCA^4K!RqnNlkazyJB@#yNw*pe3%awM1D_ z=dhp_r`x~2iT#@!+IfBjzW4t&ARvw|F&%@3Xok4gFbBmu_g+^9FVl>s4Ug=mA#(62Ql3W%L}a zrFC@$a{rVZ(6E1p3^Ul_~a)t7UkjQzuj)Qq;CxiA;*`drZIMV5% zgl9mf)58fb8SK^0<1XubJwbi{KhdAwxIBzM{ISn_X~F-j0%L<~;nB;74Eb)Z)%u|U zfd%UK2rf?N*ca*zyqV65>SZbYM{#{Et5_VbAI^gRSp{sg*q@J9RsNF(snHPsLty@_ zs6uS0q6MVW$66=f$2N*{l|CSRnOxcjm=!hNG64AZaT6?y4RO(QW~&cD&yu?~Iel}x zLVjtKQ|!23uRtqUOQ*fv=7x4c?zoA4l)+vZS=Bu20X=UmU2a(bx|Tj{Rk_mo$OCZb zt)+6%Bk1rUwVqC*Pm*Sf^aSv(%h;z3dN$qG`a{q#tD1BH_;IwCN)PGrv*~lKhZuB5 zryOYp=!{Oe(i&uc>172M21ut3fwSrU)*)5wLZKqX4b&TCu|_P`HGKW<{nnu2RdOqm zmgs&TZR9j%W*9Hx*sEoF))Z=TZA_XO^(hWD?3vz@0*ld_y#VNci zH?KH9pyEI8o`Zr;{6&RXQG?S>}}dJ?TB!yeWBljwG`T-Qq7B>FVjpc~-KW=C||W9&m|eIu1(6O|cF zdVyVQfF5V#{=5MH$I-Ft76rshbM^-4lsN;}!v0?%Z%Q4#mVJ&d^H%`13Ouxd`6tlT z&J4GCoo)|pd~4NkgU+V+R&4|XmotYm zk8>nvG3OG_6`V&n-{<@TnJurcVR^IVXE`fgSM`F|6?I`DH>~8ezQOE;a&Gk=WC3UK z7FAblQT>%%CqKjN8Ik@p#%gCy+Uv;K$k4`%T`WGd@s29y|Glw^sI)46bs@;l0<@ur zuhri+ZWBy*SRd$Ty8b%W;_BP$Ydua0+(>lC|BhYj(9Iff{qz5372mWV&#aZxD*CtD z@cDlv^si4OJ_v2LL0<*%qjkXUr0p%W^e*cnh^xOh6*v~m-vaiGPI>andLE@Nqf>%> zLN~xqF)^_}8njkW?;$)n^`zdA`sLyK18c}r?4Gi?AeA1@c+Pg5{eZCl$I*N=R6EPl zqM=}DV;a*2s8v|)9Gp51G`#nib2#S+&dEqEzO5rKq|YW1<`V9Q)a>xK@HtG z`x6lD3j9x}v!b7@W=A~F+-*RuK>d-Z@AuJ_j^_t+g3e3qto1=hTGXX zpX*FRE_6-+YVkgrtIT~K47IcaeFFokTB=;!@;K_HEiWLKwG4ZfC0gFH9Z*Y9OYaTw zJ*R7Jh&6w}P=hg@UTFQ|PWA=IMWl}^Tj&8Wz%Lt|d67(4J7=aIM^>hOfn313B=tws z%ei*0V{uxAuvfU%d^V(JPp7}OR?9t_pmKWx=2e`RxM3Y8)Cxe)f=BJr6W7v*g74hT zMrtug>`zyGZ{P(2zY27 zXFtyVoWnT_ITvw0&G`)HR?cmlHJtmA>Gb<3HWKOdXO#;5l^cHNtmC}j%^H+WU*LR^ zGa^Q{Q%)PF%o)WwgmW0@U7S-m-$yFx^aM9_h*cAJu8{lo}?|17dU^H z*vR>4woT<-oK5Yj{+;tpS=B)fw$9=1ItQ!AM=vn4`+veCRYMofyExzBJjogERO9aA zT*Ub(=Sj{aw^~uETW#=Ox7vVTI74Gp-3SQ#zmMJ;lYl+z%{dcC#7FPvY>guVah!uW zCvx7;xqP0Q_#4h|=cx@o&-opErCnna4STb0l&I-4f0! zh98wVFGVmtm9}*-9;QDz8R2Cpzp&%X3`yiP{i3J_3pYrdcFriyXihh0EN5%ZB+g{c zRL)ME8Js@O9-O@tzL3RPz&VI>A?JO_YN6y%9cN>QT6E>wyv|~Gn{8R z!}qh1&6e}t@S;EDP1fOTS>jYu`9ep|9&f4za*&1c^OS8Hh4R;w4Pl`iDKUScoLoH- z?dz*m`-W=O{_GZ2@8=x(j2buQ8Pz`V88xmLb&Vp=AS-q^S)JN>l5jX%iK6*wWZW0_%o59GvC6 zz??MoWK_seY06O(S#s2&56@9og`A^S?BtB*Y{YpBFBivk%N*SQtDUX6A)W`c<+>f$ z?Ku;8g^8R=IciUmIlJ<5w{h)7=0}watYP_4e$Fa^bs#@#iNY6}i!4!S;~GKbNf+x; zXya3y5%}pB+E~P`Hnj0aRXh%v(>S3&(~}z~_GgJVH@0FPOH(^#Co=j;?!`IX_p(kMctsis{5ZP8#+adW8kjnpEp#eKT>;cu3O}*XlLlSwoRfN}M)&(@p7Zi6 z?87U^r81YZwVPeM`e;078)REYLWuFAR?|w2^DD{{)Hu&^euK=9stRWI{HVp8%dx`z zs1=-+1m@Qo?4gUzOnYdNMP)IvP+o-j3gtu8*Z?2BI(QX$ zr6lo;aKd0OLB503Dr6U@yTD%UyoYlxQuC+N@OXCOl1>|PN}R6vQ<&ckR9HX^8rU`8 zd7h9J)Dl%YUr6ZsI;-du=aZ?b-kRD6>{?tpjgNoPpsSrLQ%_;J)tqaPT70!LGiJK- zhMoWpr8zqS^vcw#H(AAT>lpQdZBm5;%-){!Hcl^RFU~zkt(=FRwYGtB@Q(5LPC#Z? z*uPpDDm`$JZM`F;WytrX$AHYo{(RIt?O^-Ix)dZjK(kp0CH4Cu6A6Q_JL3`lst6M=A$U{0XYKg0zd(xghs%u$x zk#-;GI-OR{dBdRL{(t-YDaTl%Q5_YamMERJnfuL$Y+bdVD}7|Nx0*W;H1k&?+t1yE z%$<*-}4c z>wK@RCs2#4rM>JAqdn997_!Lzbb$Z3T`hOQZY;-EUCt@k|Mf)UWXl(~I@h^z3igh;)cvjr_p98yOl?i@eP*e9QdZE1ChTodalB zB-g>?zeV<_hFl^9#UJ)PMR%WX0)-@0hMU-5RKs zt9ItoWuU8_{plWqU8b^i^7kyC!}Nn1AsVT(FB@ zAZ0Q5M;6ddj0bj!9znB#TF+#9zsY-v4P|B0FyJZby;zRyc5xL@i#tVy%a+T`FJ5*b zO_w_(&6fuvEtjVut;*$xaDiUlh?FkxM@C()MMhsHKd}ZK6JwAciamgOMdY{YD@HB; z9(h&QpVP&reFn{@^NGEt`>UNwM9lHu*}9Trz5;5Aed3ZPvIwrv2ylg_4U;2;}mz8zS9B6EnZH~@C#yws}VeOS;c zOsDgr1!97pKiIkra(inZQoT29hBUe^4|I*Q9~}qO%AKd3DxNp!fu>LbQ_8}ZS%b;u z$&9Z1J_A48e1_z=d@4|ptF=Fm08b>Gg8(1xL9ZY~D&S=Z*KbPQM_ncl==1Qx$t2)a z+G$QU&@Kt*M+4!7D$*Pzu|I}%*`GqDRcr-bkN%(FMWbRG=L z?Zo{Pu$4@Y{0>Z#6BdVvCXyqa#&3xAl#_@Sv;^%P842%h8N2BxKAS=oSp^t z$#R-J0(hS+jF^ZNN0b8B$p3-q#u(Eo9ss^A6LAGIjB$|IeZa&>Q_;u3<&i>FkO_Jk zSw~`ltKrQp?T|F5AMoBNQ*sf|9GzBC2GrJV&lUoy1l{f-QuKhz;$^_KYlFz+Kz&t> zuXu`Ug&BuX8u29N|9f|i`&v^juL$c4O3cwid1)_bn2L2*^9leD#ReR^#<*a0T$bD_q7Givo}iYgd}-gfvh8afrWCIX%up( z^Y^&TkWGe=iVD^BApwhN%MhP z-gG)U`l_y#x_NfeD<;GQFEolK=|C+Ien1@GCREq3-!J$EbhR^eHydItE*;)`8Qp-{ z)uD!=-^PYq^TS!Pw>(_W6ADwbtZQh3=Kx*gorbXg!vq23D>SqxSCFC94l`YflHl!# zjPZMsvHt$Z=KdmNoFArdg}4^}waAwKok)-WEo3YIDP(K^Wn{d+p~T`7{jHHn{@WB> zNcQI=JNTy{y}W`P|GlVl{i~59{m&o^{cj>i`9DUE_Wy(&<8NqV6^!+_M~?INMvnIn zLr(BdMo#q4Lr(H5t8ihme>1Y!{}NCeI#Hr9-5N`nK*Hc1AkcEs2&ntLBn9o=NER}K z3_|+IIAks4g+&f24^{MVjdm|jDM&|nA4qlD5XxFERNAVpVSq{($B z((Iaww7BLWt*%wbAlDY8;H^Q5-eX9U_Y_bcAvcMOWEHg`$w(8;1zz_nl0fHk$Kyyd z-D?bxf=GyyB@n0+DN+y8O4E>`^bVwrjzQXK39wKOp-X|+E0TiA+vpeIwH7R&oBjb* zL@9>KQOpoa|Kp^i+4XV$onBu$oLkhH-M71(X5^* zavPA_l{!)CMqoZ|a1@e9bqClfxmZtkXmq_G_+2DBKzqql(4sVg%nz^&^cA#=^t8dA zOuz8=X$<>+G0iEy6YfX}l{yWY2;656qYIJYbUiYHK99V3YX|vS% z7F}DQ;6}HuXWIxlY0y5p!GCwG?vJJmLf!=Jqsjh{kX`*>AT#{RPp~jc7B)6)t{3pp z)fIPu&WZ{)1-{Ag-HN0*W8A}YjQ(gkFXRvKN7IT>+JaS>=TAXC=r2I7^G`!w@Gk~h zrDDah6BgKO+AjfD+PYn-0~W|)4sFS{Vu8Pu$`$bGRVcfPW6)nwoB~wma$~o07F&9P z)<(`MRal-2(1b*IjDCfX31BFYS6CReg6TBh_7!L!ZQ~DXrQ5Y0rqcld{yz_`*WVk; zvDb645w=Qj@&Vc^&9^dY9iFAg;*+H}s6Y!SkQZD3Yw*W~q}Zz3upzEL)PDa)u>0tP z{@uuR{zFK0sI`14wz!bbz+NDmafIRipMN*RZKImHzJ>%@QJoUlP=6dfV;yO$pM+{7 zxDTGF=ni)1xxfe)ByuiL^TX?m$n3Tz_WQqjfuLUpbZ)%{0^#R3|8vMcD%eH_XEyW` z(1r4B*A|SzEr1G+jyC=@r3sfjr2d^^sc;vY;L8|9`jcw4u{lE=8;)yC9(y zv26QsU|>RacALw$4XdQCd#T4S5NDN4)wcE~@`04uuLTe~RF*o16d z@ivg11uG8_0xcVq@G}^!(#URMiHt?vnj!OgbOWxmjo3d4XqRWnOM$R^uH6ZQvtpv2 zRFY1gqSm&hz}<3rWLUxv;LnQ633ewjrmY-^9I32i8j$lt2v^L~EI@*5{>~I5-{|8L8I)ROxR*vnagHw!0!Uyp!daNUp!4AKE zt4BaZGABOZ7Ys)}b-(<--!09F#@$kDkX5n>PeaA?C6l}#X^}qxD)S|)d>#!!GP`Wn z3TTI7O|t_FJHY7rf`4r)+ZIgQ4g-x1{sy&rp;0JnL(it$WH%lM%cLV4`m98AN7(<@ zu6;V-!ox=|`-ek7q3kJ|3DhctOQ^)v23>zIU=3t1Dr7^sADJGUwMN23<=m{c_ilz@ayHYPq&syk!h@) zkmCbt`Lm*0CJh3O@lb!ARmw`*r5Ql8Lu#K}jR{NUB*W#hkItR5zg&Msi+1S6M7$h3 z6yHokLyug(P2Ve6oWlOyD3P%N+7XV$vOldSs;a9Cm0Ee{^k!#Jt!n-Q)a?_zKcIa= zjk%9*hiUz6KZ3SPl7b6b0lO4w3+>Ast{4|GBPJQx2_lK9tg2Z^!L?*4 z?Ei_9#kC0x1+um3FmR+CW;u(jqo!d@2fL$@4tG0XXGfmY8#pA2>@P$L2WJDv=XMgR zfbR~bIsZlG=y9U^40_Y2U36zBYboCSo>e|T{~9vyBXMMM}E3yh{a`z8T>@anZY zk-p5C$R3&VkcF95$g<2wfUHN)A_dn$WR&X%=183*xk(Pf@Z2Ecc7~@Yf5|=uhy(C?W2~L z4psA|<50P}Yz{6|2bQ7*lh&gBG^;0V!+4cub;Uk4o_Y*jgBlOA_WnO053d;huu=G6 z^EU&d=rg_V0NG<|1nSS5$dqXgE*K9YvoswFl7&TmYS6;5TS4Q&)0XUpxKt!97ct5zYDq+mff>4Qd)d({T?0kr{r0kzOC(8e@s z9BbcHlhQnl1+Cmhi!ip+5vY?+MI-5AG>X>9xWEf+Mp=#l!b1>eIR*-Q&_O~iI!(9; zJ{T#HFVPmH9_>%W@y0V;u^3j}7UEKIfY>`I|AN4AQ-k6FAxqXk93XUwtSZwIm7A3Msr1jXTk>?VEhF)E}A#J(5eRKZ?% zx(RKf75OXoVVmm&D-UsdB^WT_OY(X%`1`UllgoefZ3k{F?1#J}L3b6K#V>*KRnx+a|^O2ZuUN^I0UU~@gQr$sN zHX4xle_=s<-Pa8okc7sQ*Z>K2Ex@4qo@~r}>WUlWxjP@l{GD~rG|Z>Gg87uX4~)EA zpCR-mb1LBTe_1qWRo?pgzG2p*uN* z`94BU4Q7V^1tOt|c zte-cC8$C;WXlt$*ZNuG%-pMUPGq~+&K6hHih2dNs>frxCoqY5()}f1Uk4EzS&?tT) z+KgX}_T(Q!d+{%T!4tlL`8?8iI_sw|NkL42sC<^}$A#A1IkXM;8G0vY zn#~$!aB-kM5g{ULZ}D9A*^h7UEVR?!N6^lDkDzz$y#(e7?g77{@dI4*Se!keBbqy4 z5ZYzHRHiJri`QWyzW5NDU3?kME&c=TQp`T2)+YcRukQ(Qo)Eu&0-C*kEt<3bFq*sm z8ro&ORbll?*QcOm>xZM0*4LmF>z@JT!L~rFI#?KNo7C!Sw4&8bbaJckN|v9}DiWRA zDiNL5Dg&L~ss|V}F>WZtFhPEzs%fsOd8Mj#lWNFb)zA}_@cIu8!roL9!c|qi%}ZCegSSO zDgKyRQ2DCre6o;Lr1Sl#G`|ETt0t<}JO&Q7O>XruI;GW*=!{mDMGXhchd56-?;eJd z_<(AqtU7l51!Y`4Kegc}cq^tX?w70gZeP zc^~t+gTa(KmoB7S4if}t!DR;TiaEy?`MXx(&Ge-;veGeyEU?L_zkCc^4B1NAw0sD*r>iu$uX2Tu1b; zxKfaP62265lPzG6*pB`~Xr}Cc3l{W&S;fC@iz^>&Sblr_^KIo1tTF1(5$sAW#B&5u zIgchOb!a=~TdXImL(dU%$en9h#az-E?LzvXUC9Wv8@U(lOXi`2$V#-BJc-Z#Tfu156=!>KmXbcn}m6)GIYEXr2HOl4sIYI@why|0$HFQ4t$*54D zFIsDz4;dYbbP?AXVv!E8^hYOJNl;zx8$HZUAc>J& z=!;S-^d%`1)VF|07jh#T#OE-^3CJ*jUXiWoiUt)03tQ9M*9u*V9n{_KEFs zHOC3*{p#0k)35F8p+9iHK|2p^$IBs)uubK5IM9Yy9}T{)n+MAOeiO1SmtNfm%Jap@ z+L7Qc*Q?SPP@jNE2U;G6SfuMM&x6Ktan8#wk*BZu0wFha z5!Ammz^(p`eXea$yqYomj#KZb;Whl!!^1=rp)hn8beLd2M~{NLT(3#BK?8VbxH`|NWn<{%6 zs1F3?sXH*wrJiVzHwnu&%MB{#Zr{v0puL_2gF5KlcS~>_niadu^B<9Q#*u&}`ut%N>dbQncDG`)WZ`|yubn7P#F+Kx7> zWDccKjcdWfwD6e^!QFxz-$H}<))}NfVP49$?!@wf&Z=uhf$)7!-7;{tXcgt1u<(|n zJ9!aY<4mls1HX5fV*UV|CYe0Vb{P{Z>V2MW4vN{!^&yC1!1TAk{*g_{CuoFbQ%ynB zrs>pl$=X7sW|U@(W^+vm)pyBkxYmEfZuP184vp{b^z33sf-3QkRzW~646W{hTYO$pT}norwSZ+^&lqsg9f+2NNj zj<3yr5|qV?+I(2h8^FbY>SN%f^hqnxPUsqEtLj}4fA0!ya~iC7EwWq#dqfr~ z++Mbi83zm+G#f`6 zq^CjlV7m;S5d3D=u&s^D{s!f<>%ls^pRhcL<#qOK%>qsGom$SJ`6A~Qj=+OkRO{dR z9ak#NSMGp+b<$Wta&|^cAzs3fe=niLe3Ua>(yuI{juA>zkf!k<$>L5OUBuyG>J#Z`vm% zu=0G-?EV4lE1Crsvo&Y3{+P1fVU=QvZ+w(JL73yafO=k}$s8Lvm5#w(RcH5-n^U=4 zo4(vh5=I5p7b5caJp{2xm*YMC>g-6CKHqWz1cLeDJRw=y;i$P0uDwzQ8`H+O(59$M*5Xj&I5a)`y)^lJt zN3Qkbpz?QZjY*>yg6rFM_k;L^VBb9jb?jb;I(HwHgDSou+N9>kjE1iXgg*!IYeMMW zH-qxY^sjlHkHa@yl-$e%f3@+;W`M8SlXI4W`b0f;?%Vwkvv0Is13!wb-*h#o{AWRs z(rI~R>Jgf`<9q2RKJx6sBG@ z2Dp6%ZjWoIiR^#N1o!?UepOyord-|$EHG($6}3XT!t(6iK5v1%;G%VCBqeXd87go$ zb0-QvJVMPR2Ykd1x6XW;16?TG^M~|w8hTnJrmMq-nM%E3ra`7I)Ch z)a*hwVRbQ*6RVH;f}54T^i&l z!Cxps!TUxBWHX@wh(T$NYRL{bH2~tkGKdR4r!mKaeyQT2i^z4zr_z4PpP)Vwk&fY7 ze*ho1+LkOCimqQ$4rV!`g$F=ZPiFrK5w?A=Kq8g;ly}i$ls#I1hM2tyvOKHH{s|H5 z343aV^6Z!o*#ODrJJBUk+35NxHQo?41Y)&Sef@CT(kLY;_RxJYSw5D1_W22X2*rV) zl4U^^hT9U%=~vhQiRRvDOY-08{;` zfdOEZLKA1B_QZ!leV}u$4Dwx2e3s$aJ#a|P ze|-)O{rYwB=ibGL;~sZDf`CiiG35mRQjaC%%S}w7l5;Ae`P5+#Wu-ajdIFm z5Uy%I>N;97I_5JLd&d-@$z!U}lrb-$sbhZl432*|C%?S)byhLHd<5z(UyUl|FQa7K zA1EEy?gn-^ZUkCAZUwq(+$nIII9>W3wYZZ$XK{$TKU(3g1j8KshNn=|hWAkO2J06x zE3j-x`2yb4Ik+VwP=3jB)U@OXYF_dgYFXm^lKoZ8NnKGAKS|ZQQ8oDt$|wJfmIUIz zVvmg;IepRIIrGpVIeXCT-1lW%$juG^npMp1nu+%4)(7p`trG2A6#crZE!8*H(3;%)Hor^%%Y4OXP7voolac?}o(D{o;%AAJuUKtDzYqHS&P19php+N}P1G}Q0< zk;P&DRw(tSqk`X$+Wq;c!#^B#`p2PB{wd%UyM-!XoorvMt=SWrhqwn=f&E|Hey}~f z%T?FVA}}*Vi|{7o^)-Yww@3bD#BFVozZ1l5Z7uu*K-hwO3A&DF?d$9>^YbBwb~YBv ztOK^7cX*DDr(3WCw|_qx?|%(V@V|p5`mcd{{e0R5w_rZ)syRR@{u%!8fZL|ugATzh zn@>k-PC>Qyay@%-VVi!YK;xuqzgKWOhVzbdsHE3(Moa?T}8Zq83P@$Z6#wMK4N>3tZ0ybjJ%EcUF1)6 zw@i}iS;Z$wKXeb7jb0>M(W6Jtf%+O8v*mbGiTPHXM``2EW;47Pd6j$+Zm(`Sg*O$i zq0DD!bTrF9Lt{0YM~}c*ik^+iZml3bdJQI8L?1$vqTfN6M1O_0j{gny#;YBsXr^P{ z(RyqD2#YZ>c#HOW@LM$Yd+%35jPiGFO~}|#GkI6GMUbhmpsyjk%QGE^IG?sxE`abB zOZr9Ctx7dXJd5F}n1+U#$rrG%S^c7d0jYL~_ZJ94G^qERPkShBAkL?=QRvq@0Ajg@ za=1`Kc}6V~tx+Y&Tir0Fa!Dj1kL1`Hlx7R32h{93(CV= zt(MLRGjZ9u`B|XeUz9z{zA-{>m^c+wAA zcw3)0++!vW-Zt@d_GdyTLw=pT*}+F-T#yd#NBsv+q6G)vM+YAK108%YsugQca_}y6 z%)x=^*n{_=5E&9CsxsA4LOU>*liG zDy1toW;3TNe?oaK{aA6NnW4VGB`{@s>AEaf$Z~WMdZPhh5LoFXo6Er6F0*wyYO&sr zPM^+%Z+wJ}XxWd4!2IImj5BC<#`|c$jL*^1j9<`68DZ&Wvan*|0yn6y;5u8nS(L{> zCYMf~KMy@Le=RC5cp6PwpyvB7cpc+m3$CHV7g*Y}b|V(VqAM5Ng?bhaM8__igt`|k zMB^8&M}J)O82Gb&{^FNVco6&x7EX!O^(iX2en#ysYlfK=H=|+Az#-Ym{ab;_{bz9< z!2IIMjGo}aiqdtX(8_h=(FN%@~hW`(Apg+lv`GPDoqo4~qreHWauw)XbPb5q^fQ`#DJ+}CDVL(r)Jtv9v`d}P^h-n0j7#^T9WGU(S(jF$ zzDqkmC-i#=%yKw{_s~S)Dtd?T6DVgn+6aGQ!Yf4Nu!Ace|`nG#6f5nkHrc?8#*h z>#jd1gWlx+*_og|;EOhnZ`{>PUbOMNgqrv?l=69CoV`FAgZ7hVfL}R?v>fH6$3UYW z!guZ#91HyXZt&W|8f=DwuN<88Y*2;c*UYC&^Vm~kzqeO{dPhDwBJff#BkmN%QR_e> zhA%L7Y@5?CelsZU5u4?=&eh6g=+(mwar+_R;fA`0qQl(N(c$jZ=ot6Y=vem~Xu11K zbeubE9vls#eMd`BpP+}Xi7SQ}?g1J%2VEDp8Qm6l8ht$O26{A3ZUS4tL!XOFMxT!x z02&<~id&5N!*RROBXQ@@6LCMFC*xcSYyVPb=m&9+q94W`L$Abri2e}w7y4sd^ZBfwpW-^B zKgW$ge~FXPU*k5Rzr`I#e~-HY-a7t0)Gs*}unw}N0yIauAI+6sLc2)(LRQ{Y>V$Ta zW}pG-06Izf2Cb0pSj6g0md2t}q;2R_sScec#Zr1(AAP-F{|*P zGyq*AJ&3NAE~4us+Y(m3UMfU4NHu7r`%N^;{Ua*5g{7>X+ns{OyZfRo+>_7*jAai^ zbg#rjOZSs#lKUL$aesxja?@q3Bd_~TG}+w`O>y6crn*;y`o2FQhLWWZn8^t-jI2S! z$$n5T_ffy?T_cv^7M&-!gKOCUC%ID~Tp!AN0h~?q3T}XdZI+~8K)nMGP3Mc(v-<7% z$!G?@67k%BhBN^Dz$R)`5rMUH1W$ zqsL`j;OXnAiN1@P>6fU5a*wbEp)?k}1}{QsD4cPMnn_R8LyOTa&U-+8fIo6&$rbbh3ERZF*H8Nm zaH$Z(?MX3A1DT2?l}0_8QM+4r~D3@G|T9ZEts^_8Ka?xAZge-g>+K8Wuy7|Y@7W_F>w#D6q1s}}_-1!)@ zL!dv}HK2g{8vAIB>qE>J2P|9vb6$wJN_IlMG}mOh2~K?0`_c10N|N7%a-U3Fru-Dt zp-3h3=xuBw8=XtgWAR(j1*y-2*F`MBmFeTn+gbZYt~=4> zKt7rh7!9VmO6gosZ!e2&gT?`QN5J@gmz&Qa|9l0QRxKEWnX zA36#pVe?Q|SPkf-Rj$X;PEmW%RJZE&c-1dZyg7_jdMo_Km-*sWM*_dK4)_1nn? zoX(9#XL3`}`P>3@F}Dic%56e-aJ$hx+!4@6t=?BaIN6717imay4X5uzY)qhYz_cqk z4smsW*hd??ddaxpYf!;M-{Yo2-a|j+=A&1*dvV{2d^N_+`OTm)K)5G7==>^pVzqn< z<#2XDn9_rNgX|Cc9pf%xPr|0(<*JmTcdPAT{p;bjb3c>4T7t!cZJ|kHo-_vV&|z`w zAclRcIX3PYjLT8hhW!(1jk(DlHt>3vAKmUMLoY_oM!ivM(B!DYXo?*55iX=g)uWkF z(ND1s=BH+%8&ijYouW*1CTgV$+LSH^)nVB#++}Wh+&Ihx3q7e4yDEe8s&iA_j^`+(I+`5c3;jL50@OQX zyW%B?*{)C>8+Q}qa#XJ;L_9}^?q~H{a*M!gaM1?UFomhtlZA*^$qq;e5wDRqL6P2v zPblybK{nxQK{&aI9W>Hoh2`}Q;7Z^28&mgL?gybWGkKx5Y<~8|6MKZ}L6@Kb-K_PYj*BaH&rGJOJ3u67%%|{>e_JJ4Irq1vYSrW~pYGWerI#$*8KqjT&P=v;e+j0+)-rQlF%s(S*Bt~(7H9axChUmDg-WqBO@i7<$S|6mC&M*{{D_tl=}lurWH`xY_83Tjb60>Fu3~aHsDg(!Az>HU zCSIX+yb{&dXoE|*m<;85Jb_-)>Rr?PM)OC_pEM&lI9g=rxG7t>)q#gbkgT`Z76@|; z2Pe?gT7wIkH_&V1JLcI?t`9tvy6aX1#U3h#52a+!d&U6QM7PqqjvZz#lzC`^ zvLE#*mXFM2Z?u~fgV-L%uTO<$D>|I zKZx;WE#9kH%b&*ld5rst#PJryeMQc36%BWMk2Z41+*MXU9WkK3M(5~ynh_M|)3HiB zJWryPKM(S4ZOQ)rV4XdTFG0ikd(jep4jSN>gL;2$ZR!5JYr%1lZSjJ+ zv_+l|oJ)lR6p@^4`OflFGrelU}}1H_vus|y3Vfw%7)eE`Kj{>D#IZTkPhF@0O!*9`xb+{ZStbG*Tcd|yWRU1 zSSog`{T$44%o9R>W?Nv!fPC-~lv@onQIzKEIRo3L8jo0@9jR6P8&ww~UBF8UA zLr**i!llZR_ksNfE^Tp^DG#h}aRV0ghLZgSy7E^ej&~3~<_9^hd;2MdnhPF$MIEaqQy?tgtt@^e^G52e-j%dbyf8S zRFl`Kro5z@`ju*0%%504Jy+FNq1tH!sIO?egY&=gCmjFr4&MJIRxtbNU#wxMKMf_> z#h~6myGhEeIFb6u#CrCWtzR?wZSP!&|Ec~S2MPVmYPnS|(u3yiO=Jtau1|LbnlR6} z9!Jkcog{~A(v=?1%6p^^0rk8{o#tZ@i!v=WUxtMPj!5z|S~0qL3!|cs+Ecd$#fKbW1>zk> zxhOU&xFaZ@BgB*6+OWq+B5Bf=*^;V)A~^>OdIc6Irdr4# zr-SqY^}LT}yH-N%qq(lfv0Nm_g31Ruh0%6TGOs%THvJpkhH%* zEf3c`bA^!id~mh@Xu^GkQcmn-fiuCm#2%pD0bH#)^B~I$=FAUKOJ;ay3z=w3R#HIt z1Ex!75c=6Q64cv;!s!p&Ar3WJ(q2MC)2@R;#3v;5E;#-VQNAShE(^PP(#0&a#n+AV zP4MS)mT5S|{e?cJ3XuIw;bGL2asmy>y!hL{au_)X)1D1;>^F=h&EPnwDheR44n#(K+k4L?`x}*MGCEyX!{n|{h z+}V=WfXkhBas*AJAEQb1FEod?=)%hT(LQKPX$G1k?Lf1oOK6Vt7urvjJY6mD;ZV3U z58UnKCyxU&TrRQ-ZAmtu>Ev;=Jvj}+pX=T_lzKzDS>Tr;IiwvpGSWszsY)`K^aNM_ z7^puM3h8p^uMopEmA`J%ohc`L-2oP=1V?58>dc&r#$-N;#%3NvTV$R?6EeR;L$h3Y zY)zYyE@&YwRF$TJUpnKtePD*Gh@1g8xEcq(L1P27hlTv+g6nHCWmhB_01NsIr-y_H z+aaDF!h27l7Vk%Bn71Be55}0DY{F5Q-O%{VX(0T}xnL^@*TubY0$lElCLg0^^m|n) zvKPzWE%gC^b2TEfK>0UUW3mwwO~`R@WF&E31@oegW@h$go6uZ70yHLQ^&W-TM`zhT z04LBY{ByjoXq^<2Z-GDAJd<+3a`>6jT(q@$H8@*Lr8~jp&KPnCE%jc^x4>_uoMqnM zFmbmxp%1Gt+S>;m>zxc{HET&92K5PSa5bv<0%EwrL`CDiMn2ROk~RS1Dq(Eq6tp~Z zBRDTIBJCtNEy^T)0P6jOni{1wFObbVLAhSTv%P^hkA@luD=n0H1 z{+}SO5@uyKEn?2i>N(^?lkej01HWJW-_%$t)?F-vt`JSETL{9n&aXcUj*NU-_TGerpr*#Zfcn5gXu9lXQB zh8qpwc9WLspcoFLuRDw|$~m}&Na#o-{@zK+&KX9W;c}3HGueYTflLDRiOCr*Cs`Ae z$Z~Py?VxzB%S3L>w~)Cmv!;c(7O>b#x}qUuG8#&@pkd@KG@OJiWc3=6j-Wmu>+f;Q zo0;(Uzso}2$Ap#G7O@5)Bo8zi@LS@mg5%IFc@5&2Elrmg~+Dh&34y%RxjQ* z8daRjL8HFib`|puTf_!d&uQz3wy=#x6K&NpF0`~ghbobuq4Oi7A7Tv_MD_*s4t?}( z+uaXa;Hy?ik7Uf7@TC6o0I9d5JzfIi97`siw}dU*_(;YuML zzzweOKpxsGa33f}mL#qN+eS{V-V2V5+#LTp_(i0x=u~$S(=?RLF zrHOf}jK6hO3bDf%rF48JZWGlOC=vO1}DFC72I49&i)K^0!G52CI1 z86EoQmy!GbO%WYI zn;;y4_i&MfpNMk2qQ<5*C~w-W#yKZd>#w0){STl%@RyO?dCO7O4}YGbrt{IL`Md|j zdNBU~zXRSjp8UUC!~gY`V(VXD4?iL2EGI4S6LJ&R66N^rU_unfjYWB`0yS}S)jYpM z)wEhIH$AGBn|7jR(=#Zs90zd_9Ow4_<$vm!|F<0`MDhJ@r~~%6l z@?~RCbJ;x9QnnVgmOX`rl)>Fxp&c#z5EaTCr&;VO>y0LrEdb?&sEo3QF~N;~6BR~Z zN8O|ULd!;rFR_M}@$FFS`0lC|BhiqG>1sUd0X3fW1gNhuOuY0B%=4w6qo&f3msx-2 z(u9}c_=in7E?Z5E8=*RBw(89Fpx%*4UpJq}Jg@wMnv|xmu#T*X4-HZJqhZQyG+fz^ zHdfA{O_U!{s<_Uub`GWO8F>G%50DVmNEwI)5y}Fzsj?R|$_3>M%-a;}tE>aN;zmW~ zF4UrFZ@C=a)_T0wtokeDu}?J@2Eo=eLY4tU$>D3@|1<&qJ@`+*8}cW7fGB@2UZ zOO;EnRa*YVUdG8@cH_Ptk$1OX_deF^!}-76U7mN@ao@w$9qs8Ff%bCELB-U^LA?Ro zM*h=?_bhNbdGDupfO;P8(`{N0u}CkN4x?e_kI-;)>SflyBXuF_Pu+`Vr@jutwKBV= z{)&m&sR{41j#ED?1oe)MhHAN<|0F8jJL&@q`6Q}^cQKma-Hj%C&!H{7KcJ~z*N3cL znl}q=?;Qzh{mAv7M0LFIFcx&WupjMy;fzrM%6nY+74!T>dWCglzUTpsiR4`vjCtyI$byf;+tPO1lPey9=cde-f2(VLF;~VMT*- z)5Wcrw_ZHjAm8eO|0C9}{e^*OHn#gDs@sK$5aSBS@c$=KwxaoZ0^|77%h;erX+4@y z+Tvr@QFdu}G^cbtYAaib+ROH%V%a6sQT98C17Lss&7H5Y_OF|}pgk}2M0;J32f~70 z@m)ts=y#tQ@r-6^Wc(KvGNV}rS%`KZo6wHr2&lI^X?J=fzJgCsatbYppq>}$Dbokv zvIpONu5ZzRtMPX%zTedfT`s%)xUj-C2wmx_0QC;^ySeLek4T#}_$I5la1D$BKUm-! z&Ls=Sf;}R0XmELtNTosSj($Km3H6Nr)?z9>3UQBEVtO3qOmBg5k67Lm@;fUqX_`&FFt(Uxf%?G3Vo1UL1B_=b zxHxBE0^CksFCP|5Xu?gS{$XeGy#s^debLtU ziJO2GJlrfaS&LJ&IGbC6`5bN|+K=0Z7IM#{Te#OieM^Y+C-Z}0R(LA@*}NMpj)BY7 zfqHpyOp7I4xE9Nh9Tr14dn2QQhvvGIA@&R=Iea3-BV)3|YtZDLht;^J{9#bVy)kZSTN5h*-6vGreF*9u?Tw+5 z5W&g?sTFFI?m}t1L2ABTK+U&XtmZdwR^!cw)%fZ2YW(yK5c-v|?_8R__})lkpoy`Z zIkGh(gMB{Wp}8a2DEv6y$qqM`0I)a31jTD+st5U-5NrsNH3LGpgJ zAo(>=U*mUTxq?0|f@9*}1Tp0OCsE%22^!+JB(Qv_UqZwES!iSby=W8vqiBQ{i&%c^ z_^gZr_!QU{6wjl9uMA1yDl z!XILdf_eYY;HiJe*9GN0bcU4KnmuvNl=`Bxq|xYXX*N1XT7}M&cA&B>y@(5nREJhd zH_?Ss)E%s&MN%4CCG|za-Q&?l?)%Zk?kCYE?l;f~_t$7scSIZ3p1SV@n>Oc2A5h;C zES`oju77=f79^f;Yb9CDdGav|*C@D?#TL>I4I=~5a54vNOtzv;$Qe{5-=YrUY{%NU z;c6Sqcyc#dNS2{RWG_0HTw==2OUa*@C?g48)?gIrjgBUh(TU_?^d52&y^nm328fW% z>dzq^(Yd4qmB|uRAy1>r$iLA0$zSLyl9*y_3AuN3iF-9D0T=7xE(gVx&D~pyQ{h+V z&EvPsL|bfm7){vn0-Ctx3MxFtr?Gmr$6BEF$GW28V`D*m(-XpbhqSlCFlO(p_Exy( zJPGwa3<;xx$@?5uuy{X1MX#6g)9c?+mC%h|Rkb{cqaA@lVLVZ`e4}FQs=d zCXh?R7LSJ*K19x645o;t%5C78IEVL{pn5~7sp5OJUMq7)R*$cgzy|e-VYLf;6PgbN z`WEO9H$a?;4b0e}nhaq*HKgQ#v<@?aGLt7&aUcIve#_+_GUTVO`?bN9YXT8gqd8ba@DepI8i=X&^2#S5Qd%%%xl>2C2U}}Rn!qqV+ zxIEgm7Gn78-tT&WEzo``@1sKkH_@SicDYvg!PJDMy+OY}fx8E7$t?!;i3SMVq@t@8 zP9qE>DJU1J8luVhwQ@}^PmN6|oZV|uw1!JGU(q_a?#B*Y*9W6D^%YEB9Uz}};uMH) z(hlcq(2nPKg1c=$)Yqc*D4c{_`!d9(Vx!u6v~g`_Hx|>{Io;sshO=^OpTaBebO|G@(vGSDKbTqYg6q;7M7EQ0MMenNp3T=O)X%ALE{A3au zd2$RIb#ikLIJ#k=lOJFr`eaN`7JE;QK$B0dLQ_t@jHaIa6HPnWz89;PesV0Daq3~T zE0*N~a$YO)N(T`0r2^(UO?|$c3v%Cb%QAv<*u?$G`4^V{(a^#J}zX} ziR>LzE>f9$2x6As9h7Hr@U_83dXu}d)wphSYLS;4aj!8>4NV#RI>c}#yfj>>p@o|L zHPeT%3N)k8|E;}5PA;e5zN zli3?Dyn~JmCse361<^lwJ$~&(!5XNbH`Mcbtlu%mX!kCDVtac#I6KgO68fo9toAEt zi2Ww&*77YOFB=0@DHhvZQ?P+;7@DZXEw$KU*UIf$xfZv?Sf5~(;?UYTwRR4zp7XYP zf_;;W137VqMhBez6?G!^?@+fEx5U_}Cun)+ZFx&kkEv`$LW;(qiCUb5vC-a9B&!u& zw-pG5yRf07@MY9lcnvffa$31XE4N}f3|QD|8XMTHl_zTDEgQ7ge~h0?^W}wIu|dOY zd3xx6^TUt8wVLVsWF?g6i-j-k1N8|Q9q?S(^x(XDMSZq8rhVe1u zKjq`1Mta~ct$kZBqJ4#$mj(c6QOi1=1IXmlrMM<4cB5?pqATYZ9&os zT5DEodD2g<$oJDa&|<1-)2!Ac{nh$Z)21o)S0_@fmk&_u$<^8dsa6x=npD%K$E(zG znukT(lKG9le9!y#|i|451Bw1ru#~ z`&w2pneUFK@UziW{%N$BzlsjwUF%rAp?oiN7%!v4`2*+({xh)JF`Nwmj==t_9V4;- zYDXDPsM;|KCIZKQwPQ3Ny`DLd?+e2Bo!#f5=I)zNTlZR2?EaBjp2u%s^=x@=uu2Kd z^`m_EA*i|g{iv<`Ayn*sT`kWOA7b^*d0kOU-Xs|pY?_;<>OkDiKY*T+4 z*BkvTZVGxm?osqc+$*3_zeFm1gw-#VWVB4$h>nt;Lq|*Rp<|@q&_^XXawBW7NlHP9 zyEn?a$Dk&6C2Dp*0>YXqhg4TwM`Kq+J!(u~D4o;fNqG0GPw4jeZ{C8*@E+`cz6FCT zJ48LPi-)&n4d03x@7>h=?Qh+x6hgW_#wN<4`b1cM=Tb@K5#r(-!&<<;K~)iL`x~e8|{0Ld2E5 z@=+`N3a@VOgJ_F=J3)~~amPT|r}P}C4=FN1fs>IaWiF6$Q2*e&5&3(0!-TF6%JA(B>go~W$uY=#Xc{NMA50$Fk9z~+*;HEkKB%9uQl-GD?krKI+^IRu z{w>DSM5Zy2x+O%q5(n7hC2ZG@H?9FiuE&8`K97slI7>`WKd)sBp|E7b4y# zogilY6a?krAwbj#+i~LXX4o#UEueQ?rHEu1HWaafk$2F&K^=*-jfKVRQ#fXo;%rb3 z4>9^}Q2i<;vO#&V7)71O;l+@hhM0Anbr3}h&^Rxa!{;a}zCfa%Z7&m+@zz??rZ$sWk z`viUj^$$p%(7oq#M>Np-epww+vQ-@Av~>hBdrEgNKgh?t({ol`@q)`wAOqDrM>& zuyS_%dgwix59zV?L^Mr1zNhIi9^O^TG~4?@{pd#p9RJg`<9B+4!=p->L4OTu;G>V* z#4~IYpR;+usjl-h8-?#xv)D6Q5*Z0`QSWN{+c+NFOJ_n{rOYJi6WC1ciEO5zKEcgm z8ZU-Ey2G{_8_dFItSV)et)RgZ$ZYa7md~b4eT%@F{q0kBl`@}R#`+62Yfz)zLTY+d zW;0v_3(N;mqrx(p^BT)96PS9wOq}Q%8Wiid64lG!b*#nnE8le}Ro_lyyK-7up-0;DBPMc)c4Vzfd{dC z0o{eJMp<9%AG|o3jzQi>dj+n8E9vt>$T`;E^E5(LxC4Z$GOG`lI~4diYC?;f@F#*| zINUauoo5}4+``04@E?3NWO@=}kt(Ja)$+|OX7yC>L-qPqO5-i$0xOTvl-uBfUcpDd zN$v<0;77YD%$?Mui~zUVGsraXU5BvacR1k_I@r7m;wr_b*&8+bS>zi2ChMmlWj2^g z$1PwVhOeeKrac7lPTES@1HLOeEY?x*F8p0bxb*}}IGR{L1lim9@6j3Qri(0|mCimS zXZySv#QIl1$FH3%XbrJGaFue2&iwz1`x5x5s_Xyv-mKXkZ<0wSVVy)0!X6;9XwXb1 z0U}w3ObFmonIr=lNM>Rt!33;tSOiy$>vOAsyD7F{YtdSZTDMj$O4W)>-Iv;G-L1Ir zKj*x6c{48w0kyw>KA*hroO{nb_uO;$_wGXcr#e+!OUV4;z*pB}as05<-R1f=&H+vL zhv(u2zDWX^094>R@ZTJpO32(xq(jp(o{tYVar<1LH^(LsGCuY#3pNXzzt|2(9kP@# z28`eW3OHs5B6Eii8^Vb9xx*G>?we!7Zu(l~C)C{|l3FGr+Yy<2pX(#{gTG)iHu=z@ zty22B884uwXV7sG=n+phq%~}sw?7Gtt0PJ&} zCH-$o`UhYaWhMsP91A!;juSM&#c_XpMHignl&tRo z&BpouDxb7Q3|Qw?oGl<4WgX2KKb zf^7&VT@SSElq`8W$>a2*->X>qyo$b$R9voMyYxCnbb1W2P`aMOhzg~@63&pg*a_f1 zL&}QHCmf?;frd@7I&yC&gj2_*!0XWe!#T_N1Mn{zKB?hb8osR|myUc}rF~K-;Gf_? z=ZgXNNtuovgkHjA$3@&;pmEgu79fsv(7(qaaNiM{xSThj8mBMMFMLDBAA$U0a99C1 z>s0}=l~!;CPyS+{tDQprD!`U3&aoa)A6%*(bZ}a0Dte;r9SPRh;<9ES4wmS7a=U-ZX}$>!BLkOpp<)#(4%3QCdjAJNz!NJpDIajBY(OyhcH7r zjWARCIiX9siLgj|jIdNPy@UK74a=llqJ0{@NY)(cH2heaOAO=FPbExppG}zNzKT$E z-%SVyJrYXpZwWKp?sqYwEREmgt{^&FFH31yS^!>pl2L#xJU%YBj< z?HY1i_&;6q7+&-)O*|aMe~O!CW9feOeZ6Ug zrZ?k>4=}}C3{h=A4;_NhZt?d(eBjHVi%ztw%g`4^z)PLP!cY5SQ zjNooU=03}@irWJ2jNU3`teg9hPQx_XdI!*j(iIxMso@ga{p5bChRer1Np$0w*9h+z z^QBBb?i`c(9~96xW-8%zhvos6NYA>?AT+tV2@CQrBa~r!G{Ctz7U^_Co76-YlUAYsh*8`*gvV>Rg1a1OY!R;~ z6u93I!nNQ}(vKaQ$4#2Y&6<0khP+P;=+grFK8A35mblg>e~Ky2SvL(3n_P{L`x((@ zZVjP@+e*mdk#E)*ZXpIHuuxjgJpzo-%Z+&+uteJA`X}MD*(zR;WBv@?x6K#@2sd<( znF+|kZ;qY5eJi=Q66)?ecPqIIglzl)GoZkj2f(95nw;|rq1k(&9za_r@H1GYQrIP^b|S!{a-un+Fod4;}L)rAe_a!pX7A z0sC;x3LwV!1fhVa*Z*ab#Akh_4zDK?y7^MVB7QMpDZh%)$IFE6yaK2zqJBUb`h&@E ze(Qfxkr9AU|Di!42POzcx9i>k21fU}?4|av(PSgJe8M8`WI#;GVnD_Rmg6rX_Ys85 z-T0jn!~LCwlYt8z(hj0Pftw7-0v1ZpK*Y5VvmAE|r-A=0$8QMRVPq2q`avh39=;SW ze0Y|-0O;P#{oKuf_hz{|9s+zW+n)Lw;M^R$l==-~l9WN{kmTX;0~MG`I9$UKTn*8q zxG-TJx$BC(V(p`qS3S_^<2S4MdEJlc%ZK0qD6Zu@tUcF`kqK`Yb0c60xIaMnZQkDq zzmxMmhaa;XFogad@kG9eFj?>c_CiC{PM9xTLO4~p9S{l=+%JvDmmVS%N+%w|l)0rP zgt<~H;d*I3;5#`ZpS=R`xe;aB45)#-muNZ2{R4hLZ^pe($a7}SMp>bvS)(mn9=U^( zgf^~<(5_(;DGJL3G)&=Ek$;*-i`+#-57SUm9z$apU`X2~xE8)V5fV}3_?@Z zBYaDEf{<@R{u6~7KvY2Pp&x$XQb0@zMt~+pcgz|UP26sx%^F&`$BDLTXye`>+OA;| z_YKj>T)Lg)m7*M$a_F>#)!;ri$0tjdstnwHgfLYiG;3(#-Xj`TS0|yMB#kebn@DsD zcM4%D*GQPgol7WkI{@_v|0L`ucY*tg(88r9qdeKF{jh0h=km!TiJME9%moNjxwV98 z+>L}HcR!#W!5@WjDK=XQ_HbSY0Ql>D5)|Th7k|cSalc?4u$h;j$OZ(z$?)5Bh(BYbK8o+(yD&jlPMH zF`|HahaQl%`F*b1yl1HoI3w>bFY0{&@^5mg5hChxVC{oW!%??T%`SqYif1_<5^g1Y zSa_81fbb6COM)p23(E#67Z3~S3_{o(MJQ-!;(kW7SwjogNwk%_l+ecY5!$&w6DD!* zXF>hPHv4^YNa2#r{XX|ra8Pi&6}RBrvy$FuwDfzFO<~Y5SA5LCq04myVm=t zcRX#wldRFwH1mW}Hg2>u+gw7p!n}-drMa81*L)peqwQY8 z?MeFq3#FCjPY4|jq~V4s)4>z)=BmdeX*AN0OA`p6l1?FfT3QKsDm39yLb)aP=k%jx z(M5m`_`9AkT@~n11@3)YlAZwfy>Gjv{e-2`KM1*L{{&h1xN1`#?=M-RJ9J2$F1;DrC1ASW6w+FDb>+1FbSW?~*zlNPn z$JurPSPZ8w`)AAgF@P{mkFZ3_p0+%WW)ZP)Y*BoC_!WhEc*Y;^A15ELx>6M|Mr;ho zEWr5V1>%6kch>CftFc zD`0n*f=8R@~c_pt3k`=oy+$f?YhjzR$#|FM)Y z0gN_A$P}u~&d!RzS&}IL?gTN_nM< zO5uE|bRXfQeIex-fVyN4|$;~ulh>^xl~P{_FBYH-Dv!1oUeROJ;I z1#J-nQ_SB#b3 zebNVp6rErYz_xys_jAWRZF(6>l)q1Uo#ZnAYT2;Ok7>pjI04o~&DEA(q<58ykT#FRP2 z6t2z(gHiE(ZWUnvl&Yp>CS_mE8=dVlqQK7vn=E0QW9rxQ&9R1gGWau#q9tW~uoN*t z=!SoWwHi?UiWBb4)-QHVyfBun^MiIo`VB2`oZP$pIvx&`R~O5(6;svDRQbW%F5sXg zQ#V9cJ3Ah%-bs5&eUE~s#jeHDGk|@r47!}V&-E)>ILJ0gKj_+6x=h4Rtqbd40lvL& z&wuI@KvjMGte?(hEJ90OMk^_u(qDO8N$Hec(NO-E_T%3g3WCaD(a@z~v4(RsEZ49? z!=Nw`BEp5pDy|~jCY>=2SmX#^_XzQ!7P#vMR3{qXy z#i(#~CN1s4C0~};IK1jwUDv~|x-XGVobUl?45fR*D>V81ep>#|c%V~e90YgRN4#PF zZ%lw}8*%Y@8Fe;XN9@A^N29YMnhSKJGrO}AHd?S1RiN<4>QZd@s$EeF{LIutg=2gP@v!y3 z14YCFWJt@F75cGocb2q#JqHosB9nBWtDTkyKZNcU zTC@j;3;3!Rd;dZHCNZ zrR#XU6Z?!mq?i2~ugF$U?eI#s#a<-SKRXt7K0%8b>&TX2FxcqytvT0b;)0o6-KW3+ zysW^c7kg&gEt$YQ9$Gsx~ z!ggN%IsMqkUrWd|U&R$d3pP*+?f|}}&i!Nm3`i+}1OzkrY4M5|yGBayf&Wn?K&C{n z{XhLv(7;bQ6*b1aTDpl*u@Z2PH!V}_uxS%4+h4(Q2oK-?{`V$6qJ`xF3dymiWId(i z=n|4Ft#dvJ{LJDo{x_Od&wDhnSNe=ftydbh-pS+COxUjFJ@+Q~vogR6F?^oeu5RDs zURRNST`j!A>!#E6re3?bR$u?aG{Vx`28>3<3Z?#~H{P`DDqL1*vAPXyNvQvSWL-;=T3E@a#%Fm$e$(hAT9rz>j z`lLRbQi?EjgdrOxjB|AId>!L&;j8#3og-NZ|svHU6+SHOjD?Q3V5K;hG* zSMJm=1BVl-CAkwEN+fI16M$Z6Lq6_KUFzIG0a<{`><#&E#|bW!&gO%0f}B#9<=sA< zPH*5>wP3egoTOZfg_6o3H6 zJsoWKD%;D!BGv<{C$Q0}!YAUYcXhX`zv>z3N{}~rxM!qC;^UL?SmL7)Fqne<6?;Z< zt~yeJ5*3vD3;2mrrX@@tO%G@xz5mxuYcSDKS|~pJ)}yw7tgl#NCLSygp?cANUS=_% z>4lOs-Q}MGEM2kmy2LYf7Olrice`I&Y(c1C~0M8rt-uwSX3( zAwJmuYcvUKt67B03KBb!9~Yq^KHUFjjPTT-IKm^zhr=*g9uHlJR;YPqFrgtu10=}m z8_0sNN2K6Pxnt-;g%KQt?$y|x4yCX$+(7(td^bA~!?E}~r9GAab<0T;PLE=D9Cd^U zYu00JVzq+x2~Znksu50U^?;_ualASpS@na;M833&dmj|gvna8;!}$U0E%lxFrgIe+ z17!7=RYx4rJV5SS`2B?E^P4DzdaZd6+*u)JBPpCEW1dgWtgw9n{>83S4MQ(=1O?}R z=zK#NrpF$U zsu=6s2I{7THS)2iAWmWG|EUDSgSi`Nroa*U|A8&Q1i>qnIi=k=58&r424wEA1;f1& z=t7Bi?;#Z2{~}Cw5AQ*K^PEaT%bYcUEL_9z`mD#veG@1DGtL8!+2QPKG2mDYd%00W z@8YHtN+#7`vS^sBqT8)usfNo{9IK)Gb&V!uiWEwB$^3mZ0a3sCdZo4NTOgu!(gNQ) zK=uu{GP`};dQzaK{xU!&fPE|0`8pE#V2kw&FUIl11#o=03(o_4mp>PfwLh@pse66f zI$bcE39%Uvi*TTc2Ugpoop|I+t=zj14;%}~pA~_#t7VBTo!C)y5iF4?k!~)!oKQU% z$SciCf9PorKBXjWD1VZJl@OWQ88I&R$8ie7M#Q2UfRBY|{7mr@iOE;x_PK^rcv-l1 zQ|88V^pqPJ@pJhf!Jh?S0@-KuczWK?(NK!15E~1ZmcjuNC>>XRE*9>Y9d$DOP**DGDOOjr^iR23dReJgQ!r2h zEW2>^j4qEQq-^Px5Fb+<{bhA2L}DJX6tYsvObKUGQsH9)jD@a5JIt!jm6l*?T^_TP znuTC7IiWtXlrhuk5e%Hitae}->Vc-*Xc4A3D_eRNn<D%S$Uj+1epo{AG7Prni{;5sDH*J=_A6YJ6-O>paQ+`_GXM8kFo5DR zbp``#t~ZrzMHDrepfGFee_X9V%ggF=JF8Y5jHXXHs@k9{q&C5<+UZ%Vwy3O|W(`xH z%OTUcK4TL*l)wQ54JgN`NdIuMW59r{Objhx;P85_Vx83>StuXwmlJz0Sj*+We%~uS zl5uAYTQ+(9U4)ezUL@?@@E+j@8}O2ED7zz6NNR!R)vkkeO_9rr*{Fbg}C$>9>G=E{V!UpG%m%4`^7Z=)j@b z=GcqlRLp(>d(TZ9V{1MIf7WN{mZ3tA-~SJH21jf<**HN@p*kXBDbo|c`^Ie071s;f zumK7)bQ-K}-yBQq9$CY&Id(}={GgNd_l?e#9hX8x7{M)oEQS5Y0fXc{X1#obF&|5@ zF%Mam=qXFpQkK}jFn^|)k@iaeUN0BL9bV1W?e@8TN6T!D%W3naT)y=@+~N2c|23@h zDU_xPwj1y@{DVc;(yaKYqF;f3iFBaoeGbgHrp$NSHGn(XwT4X3oFiWzs zM3#}MIvqKWj0&-8#RUGCtdZ6F{L?CcmYB2IhV`4Ox3SR1l?j>Z`(UNhm~vyoGPDJL zIYi-4DCMi)vALh||eCQ~TPA{@A3@=9|u^1&ZgM!9fz%ivj))jJLNm}Nh4F7jco*yq}* zS@`_YWisqu*|afhO$9IxUQGt;Zjanz8ry|F*KG+|i}A_v+hw#p8F3>Sb+1Nzw~JdZ zu-p9_6o!pNzPDgm9xEe#t}p0l)xB?5KQ-}!_z}@ep$h0m=kjPbV88eOtbZ?*h6(oo z16)xpJWEKMM1U?4J_I_x-%q+QK7!+gl|UCtGXHE6EKvb#t4iGlt_g$w|tJT@&2n?N;a6Pzv&XT%Ru2|yJA#9@e!)K zUQ`qJxxS_dn5kJ-8RbL&uL>F{g~5x}tXNOTvf_B*7evn#?jf8dJWW_4yhFG};4i^& zHwdE$9d6j?b69bM!t&uf>T`X3R2s);!H-uE>OV87L9_pXVgp!8jx*IyugFkYwndPS zA+L^Lky+z0k6{Ki{u)ToV1-T3y2FaegA}I3LUinwnXM_LHc-Y=uPY);f?B%OygBxW zhKgXAFnp_8i)IoYPPtHrvLPe5_^r)R5AXw1`Rx2hZ!oc+~0+^`A{5 z;S^jFU~CDEG*i^*ZlsOv$$Q;6~?~ zj^Jf_=VheP@^a#_`^IDVe`?w|o>(Jq2wsl;`Yw8#g;{Yq(5%}u_FgQ7tp0kXH59(T zyDD!ecUb?QID%n=M}4q3*!=y`qAgcpwLIE49=qMv&3G2nZ?qxU26bj68+I(~5wlUM zQ2{nDc+(lbwYtxBkNW^9^q^})={JDJv7|0HQ6BXFKTIH-4=@uCMH>~;Xnp;kk)hA^ zI@NPyeKyi?PLObmf-fY~bMah%qyOOU?}B`o|FabIxfT@7xJR!ph0;dheAs~OmHxJ& z0^D(f@#%5?@$MVq+=1_zq_1_kMw)%xqIhL^CO7~MOR!5DpTKTZDnlej)xGSZIJ(c3 zGCS)px_@Q%9n;>7qZ@|TWq$W0%299WWpZGl&(? z(s;`gPwV>tLD2zs#TvI*VOacQd&N`=m-)>Up8YHKhFgSB2rrfe$3AqpM3@H1_IR@Z zNUsFSv^T`^gzJ+>J z!j5Pr$SGye7HyqAUE8YJ%$)-Z5DKNiHk}$a9BTUwahF`ni*){nx+59y^HEnO8y6(2 zr`Zp-`;G0I(-mtZ#g0-TnYK{>0W?7c9wj_B1)S0uKf)65{g0V~rDP~e=qdf#kBC@{ zSB4ZHd&KI7Bis=+>;TrDHa?F~-M&}sI!QVnXybxrU2zs3wtgjUt5bI>vK7!Q09#r; z7(G}-%$1`K*rabnJG+q z4f~4YO6L*E`K6ukgE92E+@%kaN3Mo>rSAca0+U}?1*&M`MiXr&WZ|E7O5AjC@6F5- zS_oajdcyg_c0iPWA7QSFvMWz>7)!_m;c?n80Assj|E!MypLP~;(i>i z$p4wfpYoP&$^PLiyW)FK3>SV2&i}=>e**-BlZ}L{;{*&QI9?H>z?pBWiq`=4SHRp) z@tJSS#~R?L<*$?B#FBW^8&ja3c*0C?rV~zn4FBwR)CBkd(LyqIkGe^%{Y+#GVB}9c zXB4cVAQ|I`#Pze@_p+LEc>N%Vf~*`0hS^rmHieD3pv zGjl}&=~=n+31{b?LpUdQHz12Z-%#*n`n%u`~(Jd_ZScfe|IaL*;w`T2}f$laQ;n$VVU zvC5~p7m&NoFF771e~04$pyn>aY?n{}kUY#9TGBZyMrcjXAk5X=$7-0b`4?#Ze1;ZY zLraDhK0^zyxsTN_U-K^jfBCQ`pol|@z^P%T7EzWKkwX*U)G$*MltmHgDRmeu<Fh;n^kXw8|GHjQ=fvwrP`%|$eS~xg<_gZNa@DFxEYNA5QGood*{BDt*o6Dte zh?h$o|0UpWrQvStG{mWdu+4|d1R9Xf2W0VHk@I1iZI+$8BIlzt7vX=>#sM;aSU_pH zf(}Z&CTCd;&n3U6s0|J{>~n1^S_L%l$;1oS`sUo;hcBVUycfUIH$Jl)le|*#c{i6} zwO0L^AQlnhWB$zD$fqmBZe)^~W=!y5%}7T707m|PDLTqu=cyD+9(n>~l?%$}4mW9c%lP$S>plfXCLr8TkvP z2a+Pyx&f>p#>>FyKpz z_3ngAGtS79@n#g`H6BCLtanYk4n&Wb-KN3r9~n%6`Eo*U$}S`^D)0jYAEjKGnd+!D z)Jr~GI|Wy3&aFbfQRvkFr@@uHKXwHSP5GhXqMcx#R^g+_k8ekYcN!4+m@f(j$9 zvQ1P#7npcC4NK8rLp$bgjCi0@kA;47Z22#8m&T2`52eIdiY$ zY(F5AWA0tv^-%&H=pJ`boWI;_=N5v4xi?8ei93_%Y;Fxdi` z1pZ2#0c{qt2)78ufR^6#1RvpM;Y`9ULObF4!Un<%gv$vp6mBBCNca`uR^f5NONCbm zdxiH1FBej-Lb+E6QwilOg$DX@wXlv*5zZsLM!1adTH!jv>xA0~ZxMb)c&qRS!h3|j z5dKcsPq;^TiSS%B`fx8+N_=8|UlzSf#lF8wZf<(Ai$Rd1D7)$t& zFrDyWp_K4XLJi>~LOtQ5!l{Ih2`z+=3u_3U5Y`d?RXC4upKuZ3Gs0zr&k72lZ0UVY zxPcs=7j7kdLHHHn--SJdFA5J59uOWQd`WnU@MU2?;VZ(6gs%#(5&lDXm+&>=L&DdE zuL$1|cm-4brjP=t)fyR=a#fo$!NDn&UX@K4yJ{jaUM!qMc!>}syk3Y9-XN?c{Dp8H z;f+Es;Wpt$!tKIN!X3iz32zdfAiP<4nlL^Kss7(4yi6Xqt9jCUhwu*3cM2a6_6h$b z+$mVE!4&*PNFn^KAQ5u*(STZtpf+*B9CC+VRrNRhTBS{|5(=i2Yf+A5S|HO8hv@=B z&in`=Z~mOnWFC86f?!J<(3W1_ax6s%tpnygtjqPx#JgK&}6M_6ZV zBdoVxNVwQ~J0WL#gpjwrq0)};Ra$n8*k*@=P8{j82y-*a0l&{k-?#{Ha%SFzs|b&~ zu#0f)h3g4tUU&)NtP8IN?9IGVxRvk~;U2)bIcCSBgciq3gjUCY2yG7YcJyDqDTh!F zY|2+19+^fMc;qCN{(PZIf4&s(ot$y|gM@|qe@-}l|K)@e_TNl6asM8|N&EK!J~yI* zdz)|`_Z8uM&awmD7jPMbr*H*`@`#1pbaJTT$_Q(@IzUUW-FgNgXYU~7?VAV%`_+Ud z`yGU4`|k-Y_NNG~_J0uC>>m=^?S}}H?CCe5TrMe}kWZQk2=!k`noka&nD2*&FQ!4 z{!Zy3;retQ8aB8#IKh3d@IKH^=}$tYd^`SlUYG&MG;@eMxjvvRy&gj5Zs{%OGVeh5 z3T_f0b9YKl35(G-?jEDlG_;nwA5`IwY`83^qG10=%7rRhDPK54_?% z3drp?aW?@T0Q@5$i*TP*DJ^?gr@3=JhGg`@L%0JTru*Sx{wq8zZ^Og-B|L23!NZ>Q ziJeO-f=BWKc%&?aM`|NH(z@XxUi=A^zhO7SPw8=ZI9`QE`ayVPqm0J`5iumNAPKS8K35l@M#e~gQwMjPg^cN?H+u_P-Tu=j=%X%c*>k` zITEHme3~D^r{!6ETHnE^?Mr;xQ$L4i43o-nqwzOC8=pcQxnt@wpXR+*3n(Fe0l%#y@o5_et7bU+c>J9-8=uLi z;WLJI=C~gG&0mC1VH-Y8&wU2`=KJxtU2!C_m$Oydj6+DGNDi5MZ;BWH;d|KqMz{NTnf7`tHwAbM?sR^IlDtz*5 z@hM$~PscWVrr(KA_iyl-`zStRSlGbe_?v$jpTcMOG>!Z(lt0c~@n3jyZTOU~!eb?j4igM}gdjHjAo`uRjNrn{ z2rfM&BU;>T-yjriK(KN*5b!$*gnJNdJb|5m0x7$&4*>G`Wdi;K0IQihNWj~_1w5y;^c_+{%6HKJLEU!}=^lvyMkL@T5eUTy0ymd{ zFC!4D2uw>6)OhVC{tTq9<%0l8W>O}}EOh~u$`O^yN#`PE;x-ZxH7nKRKA*^)vG44A{yE7qX1aBX-{YTgyz*?LWn@}y*zIizwYv-JYQ5u? z!ZR(8@>7(L&a{kjcq+@?3BG&MmRkfKyrsZ^-ctjXZQGSkdF!~5BWeO`Lhk9)+^5wA znuC$ByKbp_=A5D;_tN?^_G}fb;+*61Jk4tY;ih1-+usxI47Nqx)q!weWw0$6?sOM= z{MDZE%8nDQHQBDZU|Xa!==OKD2Rqh;qLB_z*6$g==d%;7zfBrdSQ+jNc7y}1ZhuRl z1H@GWdqWe$Ou}toJ<17b<}iTb8oNWE0Ka8qfGGJt?+5Jt_7jleT;@%f9D} zSxMuc-cxKz4&@ZjC=aa+bp~1|S4CEan%vcu-nv@9&*QCdS71Dyfl!z<^n#i}(4@M; zJATivM<=)J%Xaw}%$jxlEVs{F3EG|=>TGIppXT$Qq2zv)e1_&byPxl#^FK;HvtW;q znKEp`I7dZmAleD>)>L}kg%zNxlex?bGX2qnpFQn( zcWAzEvAfVa-#dOwmo0Tqmo4q`>E3Y_zS%{`&zj@*bOZzLnqcSIk&e~C<*6C(4q*aT z1e${GGO=6e^9AFBlBq>bA1_z7vB zkDE8PcxKW3rS8e@*~RKFHILn%=H`xIH0mz&d%WXw2Vp7?bOwN<+^ei^N-M0KKE9tc zEsGCJs~$+2#-vKCE{AL?Zb~~Sj2h|lE^t@OpI%fyfK~RCtVnyRd|biI;-aFd@R$xN zYsFNPSJt&+1!labx@`QOtY4;mk+z`FQ{$ODYu2=B^A4NX)6^7fo#HO60nNY+we66p zf!1-1(K{gHo@w``eKs@ATpny~wO0k#1Y2vv%Ce8sPEqduIBl%*+Q(^A3QP@^o?&$@ zp>V`qaaLET9SftwzhEBZNLyQ17-H!RMZ${jle7uSrJtm^rdyW;L!H6ZDGed0h;Ay? zrt%7JsyEcp(G^u4()_*(kJ}$v(RnshA*JBcv`G^)JZ(WJaDgyXsFi`vj$pVsn(PZT zb#`?G>w~Q(Pj$Jiz5|4YJC!FtO&fmvu=+@}CDa&jYXQyGp^iw}yekrs1BYc!yI|5;j2@sd!uF%oW0J$YHAE4HE0}1n>1u0)oS8GMp)&|o4-C@Y1w}k+T3qe5 zR8Fa!Qg8FLf_;Lm%D6AmMo+L*_p}DPEuQxF)}UoUPdL_7U;v{_juf0^G}+Zt+$v?bSe1e#idQ~ir;lwDt@Rn4%1s8Aq0Y*AMr z+}YLUE)PaSE5p&GvW`e(HCQlc1%p8gm+Wr~bac9_LgCfQGhe0U=A`+1+S*$p;U0HY zpfQ^44RkbDbVF;`sZ{(oZE}vy4<>{NZT>)86s%&e34%GHc~XkMP8&CF*u1V)q0VR* z2yBC_ZZ=mht@JuD`GK?CmA?6tJzdbIgcZxdv?e8dFfH4ag=r39TZ!g%Ls4kz0tw2K z2h&a{G}re8!ls&q3rAN6Kq}-ZRL6?eU{fcyKb7HTkk%0jv??pVNvlzw{3dORV){0% zR_XXQtwDME+q5aev0OAoI+`6MJ{oKbP4!iKr&gBND`US)%gYn1f?d#hgxw9HC=^!n zyxO`7OL+jwfX&wuY7MnVm6Y$(PRp@*dzxA!;h+smdN|T;_q4WxeVc;H_ur?DT$~Jz z%ECxE44Ro6prN*T1K~(}S2P`)a8MNTK1{VC&}yj;wl+ml8X|#?Zg-u#z+G;w?y84U zVqFSpkF+J#LGcb@&ABQdX2?}tZJ}_m`*4l0SBBSMd*5XBw1U)t+0(irVAIOG*;8L% zYpH`2x7aZ!R(Ev-lDt?jTLT?Ewz5#?yw=FsXp?qmY%QLS&PcoMRH&5UU}tJwpfl2> z^?;f4q5E?~)|^Ut<8KNDA+6D5PbZfCHYm6$wQW!r)m+Oc>uPOvFQ|cpu84GiFDUOQ z3qWez^R>$5u4%AUhQkrCldU??0qsev;xmh`^tY85svnf~%yCy@|+_YMmY8OY$2amS)V0SWfP0m<}S!dl2_C!P7R!qfDeHjLxyvHm!Ke+o2Q=7$y$OqBsOc(psS!VSd(hh5OX zhLvd}#4&aoaIJ*gSGJ81$1C$jiUrG@-U!sfFzAS5d#xWz_Ou3?)NF@}s&-K`nzL%7 zR1yryF)s+M2%9Uq107bhcBIXM!|QgXWwba!`Q>PFRGPIif~}FI%v0yBRlXf9p6s?( zOsFtP&Cx7xORyE3jVWCWO}*5BMsQbmK{+L%){5p(TcA6&uD;w|0pp71 z=3ukQTj{sfgrd<4))mRhgJp}p`9957HDmT zs=@ltBoEkwA~03^D;+S1tb`T@d*LX}g6y7PM`Q&IOOook8hfA-XlfabEe4F2pl4@| zf*VE$IF23(J!f^T-vfPs+AAw>j}slrfV1w~rSF}ednhXugvy;Uvug$YE)Cz4)y4O=zw@lCCikkU$XgGu2P*m;J zwPlr6mG#S#VK5bFreSQdXK{IDt+%$k!msR|B4#W9nIcY>B{nK_pM3Jv1rTG#yvjO% zy&G&$QCH)sudJ={R9UK*`5}# zFiOXwWt$i12s8(JlxJp&nM&I%F)s<~8;o0Eu%-NKmN-T>mCvh8s}F?E#(6*wRHpU} zY+3=K%xU9}rs(i`D4jhpV%EA;9L9o%(9rkT7lc})P0(IiD$j;;kwUY0RWUmhF>1u^ z&}ifErqxd42N)MQYSe+7^7$NbxRQT@IMHFLhawV4hS;I_PKL^=ymg}3tprNMSyLn! zN_Ta`LTKGc)R>A9or5tsl*-5pch5#`pC#bV|4lf^3?ki-BCMcdl2)yCFYxuI07 zRX!~hC)%uakl8RNIKd<4Dy<%Is?z5X%M__h+@$O-6AP4A%b=7WEE9{}rls>M9e!-H zpnb!PZx6c58j`#)Xu$Ue0j1R|Rw;k;inHuC7~2M;fv8eYE*7UG<5Uz{#+oS&%EjfP zKRIb0OiZFMISnfRDHn^B<0`}{%F+sPuClE{93@(o!W<@I^K`9&$W|+_R)_^NGfu6o z_jsWI#Er1+<>htF9icTr>w>Pp*};&hrlQ{Jfq7*`xpm~Zj^WDiv_bAV1Tf)2MTS_R9@$|c|+|uV6b}wt&}G) zWQ9>-E3{>zmWS9SqB-wcAdZ$L$}snm5R4?KR9MRb(N^e*mV{a(O`*=76qpG@vrH{7 zOsm4>q3CKbRI__Qpwn^+Oc0h>s{<>;U2S$B&3+@{tc3+M$%gI+Mh%C@CpLIfg~cuh zva<1F##|mS% zu;Q!|x7zK{~ZVF}py*SXZ_L zLNM4_(HdwATFY7kp|!y@e@igD7XIDk9^Yc+samm4nc@?trl!K{KpHiK&gxPw^@+%`&d_Dbk*A@|zs!G@KADNwwX-F4zwN|hg~!!3Ss>}+@+*zAQe zyV}r?CwaWy3ctH@YAwv#I~zh_TUFg;Xc$&oDT5X%^Xj2WTn&$5*7B|}%uj7FxxmIu zkrs=SvMpfwrn8ck2E+bHS4UIOHa}9|5DK2H_!f(K$~lXnPTsm03U5k-I5$sivS5T~ z@_T$Xe`iMzv@oWH^_6yy+NMR7`x?Zl1&*>{Xcd+he`lZr^A#q5wZ4iPYpA{pnj#oA zgae?!AC`zCuU-m+Z1ojKc&fLfs|n`VW-q*XO!KyM^hBX)h)%Ao_rvsjZMX8$QgNo@ zS|)B#?pP)^XQonJ46KBT?eW{@1)GCl;XR8^6(`%0@%2NXxiJuK-g9n19B2K1|Fcfr diff --git a/pcireg/PCIREG.EFI b/pcireg/PCIREG.EFI new file mode 100644 index 0000000000000000000000000000000000000000..ff9f06b6debc706cbeebf941bd5830569ad3fe7c GIT binary patch literal 46088 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 delta 16645 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 diff --git a/pcireg/README.md b/pcireg/README.md index 3d6a254..e5efeda 100644 --- a/pcireg/README.md +++ b/pcireg/README.md @@ -1,6 +1,6 @@ pcireg ====== -DOS tool for reading, writing and dumping PCI configuration space registers; scanning the PCI bus; and more. +DOS and UEFI tool for reading, writing and dumping PCI configuration space registers; scanning the PCI bus; and more. Usage ----- @@ -31,5 +31,11 @@ Register dumps are saved to PCIbbddf.BIN where bb=bus, dd=device, f=function. Building -------- -* **Windows:** Run `build.bat` from an OpenWatcom "Build Environment" command prompt. -* **Linux:** Run `./build.sh` with OpenWatcom tools present in `$PATH`. +### DOS target: + +* **Windows:** Run `wmake` from an OpenWatcom "Build Environment" command prompt. +* **Linux:** Run `wmake` with OpenWatcom tools present in `$PATH`. + +### UEFI target: + +* **Linux:** Run `make -f Makefile.uefi ARCH=x86_64` with a GCC toolchain installed. diff --git a/pcireg/build.bat b/pcireg/build.bat deleted file mode 100644 index 398911f..0000000 --- a/pcireg/build.bat +++ /dev/null @@ -1,2 +0,0 @@ -@echo off -..\lib\build_watcom_dos.bat pcireg.c ..\lib\wlib.c diff --git a/pcireg/build.sh b/pcireg/build.sh deleted file mode 100644 index 3d42296..0000000 --- a/pcireg/build.sh +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/sh -exec ../lib/build_watcom_dos.sh pcireg.c ../lib/wlib.c diff --git a/pcireg/pciids.py b/pcireg/pciids.py index c6d3511..42299c1 100644 --- a/pcireg/pciids.py +++ b/pcireg/pciids.py @@ -97,7 +97,7 @@ def main(): # Enumerate vendor IDs. print('Enumerating vendors...') - for vendor_id in sorted(vendor_devices_offset): + for vendor_id in sorted(pciutil._pci_vendors): # Look up vendor ID. vendor = pciutil.clean_vendor(pciutil._pci_vendors.get(vendor_id, '')).encode('cp437', 'ignore')[:256] @@ -115,7 +115,7 @@ def main(): devices_offset = vendor_devices_offset.get(vendor_id, None) if devices_offset == None: devices_offset = 0xffffffff - if string_db_pos != 0xffffffff and devices_offset != 0xffffffff: + if string_db_pos != 0xffffffff or devices_offset != 0xffffffff: vendor_db += struct.pack('> 16) & 0xff, pci_subclass & 0xff, string_db_pos) + subclass_db += struct.pack('> 8) & 0xff, pci_subclass & 0xff, string_db_pos) subclass_has_termination = pci_subclass == 0xffff # Enumerate progif IDs. diff --git a/pcireg/pcireg.c b/pcireg/pcireg.c index cee05ad..d9d1634 100644 --- a/pcireg/pcireg.c +++ b/pcireg/pcireg.c @@ -19,15 +19,20 @@ * │ garbage, please tell your editor to open this file as UTF-8. │ * └──────────────────────────────────────────────────────────────┘ */ -#include -#include -#include -#include -#include -#include -#include -#include -#include "wlib.h" +#ifdef __POSIX_UEFI__ +# include +#else +# include +# include +# include +# include +# include +# include +# ifdef __WATCOMC__ +# include +# endif +#endif +#include "clib.h" static const char *command_flags[] = { @@ -74,44 +79,46 @@ static const char *devsel[] = { }; -static struct videoconfig vc; -static union REGPACK rp; /* things break if this is not a global variable... */ +#ifdef __WATCOMC__ +static union REGPACK rp; +#endif +static int term_width; static FILE *pciids_f = NULL; #pragma pack(push, 0) -static struct { +static struct PACKED { uint32_t device_db_offset, - subdevice_db_offset, + subdevice_db_offset, class_db_offset, subclass_db_offset, progif_db_offset, string_db_offset; } pciids_header; -static struct { +static struct PACKED { uint16_t vendor_id; uint32_t devices_offset, - string_offset; + string_offset; } pciids_vendor; -static struct { +static struct PACKED { uint16_t device_id; uint32_t subdevices_offset, string_offset; } pciids_device; -static struct { +static struct PACKED { uint16_t subvendor_id, subdevice_id; uint32_t string_offset; } pciids_subdevice; -static struct { +static struct PACKED { uint8_t class_id; uint32_t string_offset; } pciids_class; -static struct { +static struct PACKED { uint8_t class_id, subclass_id; uint32_t string_offset; } pciids_subclass; -static struct { +static struct PACKED { uint8_t class_id, subclass_id, progif_id; @@ -119,6 +126,7 @@ static struct { } pciids_progif; +# if defined(__WATCOMC__) && !defined(M_I386) typedef struct { uint8_t bus, dev; struct { @@ -134,6 +142,7 @@ typedef struct { irq_routing_entry_t entry[1]; }; } irq_routing_table_t; +# endif #pragma pack(pop) @@ -160,6 +169,8 @@ static char * pciids_read_string(uint32_t offset) { uint8_t length, *buf; + uint32_t sum; + int i; /* Return nothing if the string offset is invalid. */ if (offset == 0xffffffff) @@ -170,7 +181,7 @@ pciids_read_string(uint32_t offset) return NULL; /* Seek to string offset. */ - fseek(pciids_f, pciids_header.string_db_offset + offset, SEEK_SET); + fseek_to(pciids_f, pciids_header.string_db_offset + offset); /* Read string length, and return nothing if it's an empty string. */ fread(&length, sizeof(length), 1, pciids_f); @@ -198,7 +209,7 @@ pciids_find_vendor(uint16_t vendor_id) return 0; /* Seek to vendor database. */ - fseek(pciids_f, sizeof(pciids_header), SEEK_SET); + fseek_to(pciids_f, sizeof(pciids_header)); /* Read vendor entries until the ID is matched or overtaken. */ do { @@ -233,7 +244,7 @@ pciids_get_device(uint16_t device_id) return NULL; /* Seek to device database entries for the established vendor. */ - fseek(pciids_f, pciids_header.device_db_offset + pciids_vendor.devices_offset, SEEK_SET); + fseek_to(pciids_f, pciids_header.device_db_offset + pciids_vendor.devices_offset); /* Read device entries until the ID is matched or overtaken. */ do { @@ -260,7 +271,7 @@ pciids_get_subdevice(uint16_t subvendor_id, uint16_t subdevice_id) return NULL; /* Seek to subdevice database entries for the established subvendor. */ - fseek(pciids_f, pciids_header.subdevice_db_offset + pciids_device.subdevices_offset, SEEK_SET); + fseek_to(pciids_f, pciids_header.subdevice_db_offset + pciids_device.subdevices_offset); /* Read subdevice entries until the ID is matched or overtaken. */ do { @@ -285,7 +296,7 @@ pciids_get_class(uint8_t class_id) return NULL; /* Seek to class database. */ - fseek(pciids_f, pciids_header.class_db_offset, SEEK_SET); + fseek_to(pciids_f, pciids_header.class_db_offset); /* Read class entries until the ID is matched or overtaken. */ do { @@ -310,7 +321,7 @@ pciids_get_subclass(uint8_t class_id, uint8_t subclass_id) return NULL; /* Seek to subclass database. */ - fseek(pciids_f, pciids_header.subclass_db_offset, SEEK_SET); + fseek_to(pciids_f, pciids_header.subclass_db_offset); /* Read subclass entries until the ID is matched or overtaken. */ do { @@ -335,7 +346,7 @@ pciids_get_progif(uint8_t class_id, uint8_t subclass_id, uint8_t progif_id) return NULL; /* Seek to programming interface database. */ - fseek(pciids_f, pciids_header.progif_db_offset, SEEK_SET); + fseek_to(pciids_f, pciids_header.progif_db_offset); /* Read programming interface entries until the ID is matched or overtaken. */ do { @@ -355,7 +366,7 @@ pciids_get_progif(uint8_t class_id, uint8_t subclass_id, uint8_t progif_id) static int dump_regs(uint8_t bus, uint8_t dev, uint8_t func, uint8_t start_reg, char sz) { - int i, width, infobox, flags, bar_id; + int i, width, flags, bar_id; char buf[13]; uint8_t cur_reg, regs[256], dev_type, bar_reg; multi_t reg_val; @@ -367,6 +378,9 @@ dump_regs(uint8_t bus, uint8_t dev, uint8_t func, uint8_t start_reg, char sz) /* Generate dump file name. */ sprintf(buf, "PCI%02X%02X%d.BIN", bus, dev, func); + /* Get terminal size. */ + term_width = term_get_size_x(); + /* Size character '.' indicates a quiet dump for scan_bus. */ if (sz != '.') { /* Print banner message. */ @@ -378,7 +392,7 @@ dump_regs(uint8_t bus, uint8_t dev, uint8_t func, uint8_t start_reg, char sz) switch (sz) { case 'd': case 'l': - width = 68; /* width for register + infobox display */ + width = 40; for (i = 0x0; i <= 0xf; i += 4) { /* Add spacing at the halfway point. */ if (i == 0x8) @@ -388,7 +402,7 @@ dump_regs(uint8_t bus, uint8_t dev, uint8_t func, uint8_t start_reg, char sz) break; case 'w': - width = 72; + width = 44; for (i = 0x0; i <= 0xf; i += 2) { if (i == 0x8) putchar(' '); @@ -397,7 +411,7 @@ dump_regs(uint8_t bus, uint8_t dev, uint8_t func, uint8_t start_reg, char sz) break; default: - width = 80; + width = 52; for (i = 0x0; i <= 0xf; i++) { if (i == 0x8) putchar(' '); @@ -406,26 +420,12 @@ dump_regs(uint8_t bus, uint8_t dev, uint8_t func, uint8_t start_reg, char sz) break; } - /* Get terminal size. */ - _getvideoconfig(&vc); - - /* Print top of infobox if we're doing an infobox. */ - infobox = (start_reg < 0x3c) && (vc.numtextcols >= width); - if (infobox) { - printf(" ┌"); - for (i = 0; i < 24; i++) - putchar('─'); - putchar('┐'); - if (vc.numtextcols > width) - putchar('\n'); - } else { + /* Move on to the next line if the terminal didn't already do that for us. */ + if (width < term_width) putchar('\n'); - } } else { /* Print dump file name now. */ printf("Dumping registers to %s", buf); - - infobox = 0; } cur_reg = 0; @@ -498,229 +498,10 @@ dump_regs(uint8_t bus, uint8_t dev, uint8_t func, uint8_t start_reg, char sz) cur_reg += 4; } while (cur_reg & 0x0f); - /* Print infobox line if we're doing an infobox. */ - if (infobox) { - /* Print left line, unless this is the bottom row. */ - if (cur_reg) - printf(" │ "); - - /* Generate infobox lines, always checking if we have read the corresponding register(s). */ - switch (cur_reg) { - case 0x10: - /* Print class ID. */ - if (start_reg < 0x0c) - printf(" Class: %02X Base ", regs[0x0b]); - else - goto blank; - break; - - case 0x20: - /* Print subclass ID. */ - if (start_reg < 0x0c) - printf(" %02X Sub ", regs[0x0a]); - else - goto blank; - break; - - case 0x30: - /* Print programming interface ID. */ - if (start_reg < 0x0c) - printf(" %02X ProgIntf", regs[0x09]); - else - goto blank; - break; - - case 0x40: - flags = (start_reg < 0x02) | ((start_reg < 0x2e) << 1); - if (flags) { - printf("Vendor ID: "); - - /* Print vendor ID. */ - if (flags & 1) - printf("%04X", *((uint16_t *) ®s[0x00])); - else - printf("----"); - - /* Print subvendor ID. */ - if (flags & 2) - printf(" (%04X)", *((uint16_t *) ®s[0x2c])); - else - printf(" (----)"); - } else { - goto blank; - } - break; - - case 0x50: - flags = (start_reg < 0x04) | ((start_reg < 0x30) << 1); - if (flags) { - printf("Device ID: "); - - /* Print device ID. */ - if (flags & 1) - printf("%04X", *((uint16_t *) ®s[0x02])); - else - printf("----"); - - /* Print subdevice ID. */ - if (flags & 2) - printf(" (%04X)", *((uint16_t *) ®s[0x2e])); - else - printf(" (----)"); - } else { - goto blank; - } - break; - - case 0x60: - /* Print revision. */ - if (start_reg < 0x09) - printf(" Revision: %02X ", regs[0x08]); - else - goto blank; - break; - - case 0x70: - /* No IRQ on bridges. */ - if (regs[0x0e] & 0x7f) - goto blank; - - flags = regs[0x3c] && (regs[0x3c] != 0xff); - flags |= (regs[0x3d] && (regs[0x3d] != 0xff)) << 1; - if (flags) { - printf(" IRQ: "); - - /* Print IRQ number. */ - if (flags & 1) - printf("%2d", regs[0x3c] & 15); - else - printf("--"); - - /* Print INTx# line. */ - if (flags & 2) - printf(" (INT%c) ", '@' + (regs[0x3d] & 15)); - else - printf(" "); - } else { - goto blank; - } - break; - - case 0x80: - /* Print separator for the BAR section. */ -blank: - printf(" "); - break; - - case 0x90: - case 0xa0: - case 0xb0: - case 0xc0: - case 0xd0: - case 0xe0: - /* We must know the device type before printing BARs. */ - if (start_reg > 0x0e) - goto blank; - - /* Determine device type and current BAR register. */ - dev_type = regs[0x0e] & 0x7f; - bar_reg = (cur_reg >> 2) - 0x14; - - /* Bridges have special BAR2+ handling. */ - if ((dev_type == 0x01) && (bar_reg > 0x14)) { - /* Print bridge I/O and memory ranges. */ - switch (bar_reg) { - case 0x18: - if (start_reg < 0x1d) - printf(" Brdg I/O: %X000-%XFFF ", regs[0x1c] >> 4, regs[0x1d] >> 4); - else - goto blank; - break; - - case 0x1c: - if (start_reg < 0x21) - printf(" Brdg Mem: %03X00000- ", *((uint16_t *) ®s[0x20]) >> 4); - else - goto blank; - break; - - case 0x20: - if (start_reg < 0x21) - printf(" %03XFFFFF ", *((uint16_t *) ®s[0x22]) >> 4); - else - goto blank; - break; - - default: - goto blank; - } - break; - } else if (dev_type > 0x01) { - /* We don't parse CardBus bridges or other header types. */ - goto blank; - } - - /* Print BAR0-5 for regular devices, or BAR0-1 for bridges. */ - reg_val.u32 = *((uint32_t *) ®s[bar_reg]); - if ((start_reg <= bar_reg) && reg_val.u32 && (reg_val.u32 != 0xffffffff)) { - bar_id = (bar_reg - 0x10) >> 2; - if (reg_val.u8[0] & 0x01) - printf("I/O BAR %d: %04X ", bar_id, reg_val.u16[0] & 0xfffc); - else - printf("Mem BAR %d: %04X%04X ", bar_id, reg_val.u16[1], reg_val.u16[0] & 0xfff0); - } else { - goto blank; - } - break; - - case 0xf0: - /* Print expansion ROM BAR. */ - switch (regs[0x0e] & 0x7f) { - case 0x00: - if (start_reg < 0x31) - reg_val.u32 = *((uint32_t *) ®s[0x30]); - else - reg_val.u32 = 0; - break; - - case 0x01: - if (start_reg < 0x39) - reg_val.u32 = *((uint32_t *) ®s[0x38]); - else - reg_val.u32 = 0; - break; - - default: - reg_val.u32 = 0; - break; - } - if (reg_val.u32 && (reg_val.u32 != 0xffffffff)) - printf(" Exp ROM: %04X%04X ", reg_val.u16[1], reg_val.u16[0]); - else - goto blank; - break; - - case 0x00: - /* Print bottom of infobox. */ - printf(" └"); - for (i = 0; i < 24; i++) - printf("─"); - printf("\xd9"); - if (vc.numtextcols > 80) - printf("\n"); - break; - } - - /* Print right line, unless this is the bottom row. */ - if (cur_reg) - printf(" │"); - + if (sz != '.') { /* Move on to the next line if the terminal didn't already do that for us. */ - if (vc.numtextcols > width) - printf("\n"); - } else if (sz != '.') { - /* Move on to the next line. */ - printf("\n"); + if (width < term_width) + putchar('\n'); } } while (cur_reg); @@ -759,7 +540,7 @@ blank: static int -scan_bus(uint8_t bus, int nesting, char dump, FILE *f, char *buf) +scan_bus(uint8_t bus, int nesting, char dump, char *buf) { int i, j, count, last_count, children; char *temp; @@ -787,11 +568,11 @@ scan_bus(uint8_t bus, int nesting, char dump, FILE *f, char *buf) if (dev_id.u32 && (dev_id.u32 != 0xffffffff)) { /* Clear vendor/device name buffer while adding nested bus spacing if required. */ if (nesting) { - j = (nesting << 1) - 1; - memset(buf, ' ', j); - buf[j - 1] = '└'; - buf[j] = '─'; - buf[j + 1] = '\0'; + j = (nesting << 1) - 2; + for (i = 0; i < j; i++) + buf[i] = ' '; + buf[i] = '\0'; + sprintf(&buf[strlen(buf)], "└─"); } else { buf[0] = '\0'; } @@ -831,7 +612,7 @@ scan_bus(uint8_t bus, int nesting, char dump, FILE *f, char *buf) strcat(buf, "[Unknown] "); unknown_device: /* Look up class ID. */ - temp = pciids_get_class(dev_rev_class.u16[1]); + temp = pciids_get_subclass(dev_rev_class.u8[3], dev_rev_class.u8[2]); if (temp) { /* Add class name to buffer. */ sprintf(&buf[strlen(buf)], "[%s]", temp); @@ -843,52 +624,41 @@ unknown_device: /* Look up class ID. */ } /* Limit buffer to screen width, then print it with the revision ID. */ - i = vc.numtextcols - strlen(buf) - 24; + i = term_width - strlen(buf) - 24; if (i >= 9) { sprintf(&buf[strlen(buf)], " (rev %02X)", dev_rev_class.u8[0]); } else { if (i >= 5) strcat(buf, " "); else if (i < 4) - strcpy(&buf[vc.numtextcols - 32], "... "); + strcpy(&buf[term_width - 32], "... "); sprintf(&buf[strlen(buf)], "(%02X)", dev_rev_class.u8[0]); } printf(buf); /* Move on to the next line if the terminal didn't already do that for us. */ - if (vc.numtextcols > (strlen(buf) + 24)) + if (term_width > (strlen(buf) + 24)) putchar('\n'); - if (nesting && count) { - /* Get the current cursor position. */ - rp.h.ah = 0x03; - rp.h.bh = 0x00; - intr(0x10, &rp); - row = rp.h.dh; - column = rp.h.dl; - - /* Rectify previous nesting indicator. */ - rp.h.ah = 0x02; - rp.h.dl = 22 + (nesting << 1); - rp.h.dh -= 2; - if (children > rp.h.dh) - children = rp.h.dh; + /* Rectify previous nesting indicator when nesting buses. */ + if (nesting && count && term_get_cursor_pos(&column, &row)) { + i = 22 + (nesting << 1); + j = row - 2; + if (children > j) + children = j; while (children) { - intr(0x10, &rp); - putchar('│'); + term_set_cursor_pos(i, j); + printf("│"); children--; - rp.h.dh--; + j--; } - if (rp.h.dh != 0xff) { - intr(0x10, &rp); - putchar('├'); + if (j != 0xff) { + term_set_cursor_pos(i, j); + printf("├"); } /* Restore cursor position. */ - rp.h.ah = 0x02; - rp.h.dh = row; - rp.h.dl = column; - intr(0x10, &rp); + term_set_cursor_pos(column, row); } /* Dump registers if requested. */ @@ -922,7 +692,7 @@ unknown_device: /* Look up class ID. */ #endif /* Scan the secondary bus. */ - children = scan_bus(new_bus, nesting + 1, dump, f, buf); + children = scan_bus(new_bus, nesting + 1, dump, buf); count += children; } else { children = 0; @@ -943,27 +713,24 @@ scan_buses(char dump) { int i; char *buf; - FILE *f; /* Initialize buffers. */ buf = malloc(1024); memset(buf, 0, 1024); /* Get terminal size. */ - _getvideoconfig(&vc); + term_width = term_get_size_x(); /* Print header. */ - printf("Bus Dev Fun [Vend:Dev ] Device\n"); - for (i = 0; i < vc.numtextcols; i++) - putchar('─'); + printf("Bus Dev Fun [VeID:DeID] Device\n"); + for (i = 0; i < term_width; i++) + printf("─"); /* Scan the root bus. */ - scan_bus(0, 0, dump, f, buf); + scan_bus(0, 0, dump, buf); /* Clean up. */ free(buf); - if (f) - fclose(f); return 0; } @@ -978,9 +745,9 @@ info_flags_helper(uint16_t bitfield, const char **table) /* Check each bit. */ j = 0; for (i = 0; i < 16; i++) { - /* Ignore if there is no table entry. */ - if (!table[i]) - continue; + /* Ignore if there is no table entry. */ + if (!table[i]) + continue; /* Print flag name in [brackets] if set. */ if (bitfield & (1 << i)) @@ -988,11 +755,11 @@ info_flags_helper(uint16_t bitfield, const char **table) else printf(" %s ", table[i]); - /* Add line break and indentation after the 7th item. */ - if (++j == 7) { - printf("\n "); - j = 0; - } + /* Add line break and indentation after the 7th item. */ + if (++j == 7) { + printf("\n "); + j = 0; + } } } @@ -1117,7 +884,7 @@ dump_info(uint8_t bus, uint8_t dev, uint8_t func) printf("\n\nRevision: %02X", reg_val.u8[0]); /* Print class ID. */ - printf("\n\nClass: [%02X] ", reg_val.u8[3]); + printf("\nClass: [%02X] ", reg_val.u8[3]); /* Print class name if found. */ temp = pciids_get_class(reg_val.u8[3]); @@ -1129,7 +896,7 @@ dump_info(uint8_t bus, uint8_t dev, uint8_t func) } /* Print subclass ID. */ - printf("\n [%02X] "); + printf("\n [%02X] ", reg_val.u8[2]); /* Print subclass name if found. */ temp = pciids_get_subclass(reg_val.u8[3], reg_val.u8[2]); @@ -1141,7 +908,7 @@ dump_info(uint8_t bus, uint8_t dev, uint8_t func) } /* Print programming interface ID. */ - printf("\n [%02X] "); + printf("\n [%02X] ", reg_val.u8[1]); /* Print programming interface name if found. */ temp = pciids_get_progif(reg_val.u8[3], reg_val.u8[2], reg_val.u8[1]); @@ -1152,27 +919,61 @@ dump_info(uint8_t bus, uint8_t dev, uint8_t func) printf("[Unknown]"); } + /* Read latency, grant and interrupt line. */ + reg_val.u32 = pci_readl(bus, dev, func, 0x3c); + + /* Print interrupt if present. */ + if (reg_val.u16[0] && (reg_val.u16[0] != 0xffff)) + printf("\nInterrupt: INT%c (IRQ %d)", '@' + (reg_val.u8[1] & 15), reg_val.u8[0] & 15); + + /* Print latency and grant if available. */ + if ((header_type & 0x7f) == 0x00) { + printf("\nMin Grant: %.0f us at 33 MHz", reg_val.u8[2] * 0.25); + printf("\nMax Latency: %.0f us at 33 MHz", reg_val.u8[3] * 0.25); + } + /* Read and print BARs. */ for (i = 0; i < num_bars; i++) { - if (i == 0) - putchar('\n'); + if (i == 0) + putchar('\n'); - /* Read BAR. */ - reg_val.u32 = pci_readl(bus, dev, func, 0x10 + (i << 2)); + /* Read BAR. */ + reg_val.u32 = pci_readl(bus, dev, func, 0x10 + (i << 2)); - /* Move on to the next BAR if this one doesn't appear to be valid. */ - if (!reg_val.u32 || (reg_val.u32 == 0xffffffff)) - continue; + /* Move on to the next BAR if this one doesn't appear to be valid. */ + if (!reg_val.u32 || (reg_val.u32 == 0xffffffff)) + continue; - /* Print BAR index. */ - printf("\nBAR %d: ", i); + /* Print BAR index. */ + printf("\nBAR %d: ", i); - /* Print BAR type and address. */ - if (i & 1) - printf("I/O at %04X", reg_val.u16[0] & 0xfffc); - else - printf("Memory at %04X%04X", reg_val.u16[1], reg_val.u16[0] & 0xfff0); + /* Print BAR type, address and properties. */ + if (reg_val.u8[0] & 1) { + printf("I/O at %04X", reg_val.u16[0] & 0xfffc); + } else { + printf("Memory at %04X%04X (", reg_val.u16[1], reg_val.u16[0] & 0xfff0); + switch (reg_val.u8[0] & 0x06) { + case 0x00: + printf("32-bit"); + break; + case 0x02: + printf("below 1 MB"); + break; + + case 0x04: + printf("64-bit"); + break; + + case 0x06: + printf("invalid location"); + break; + } + printf(", "); + if (!(reg_val.u8[0] & 0x08)) + printf("not "); + printf("prefetchable)"); + } } printf("\n"); @@ -1181,6 +982,7 @@ dump_info(uint8_t bus, uint8_t dev, uint8_t func) } +#if defined(__WATCOMC__) && !defined(M_I386) static int comp_irq_routing_entry(const void *elem1, const void *elem2) { @@ -1240,7 +1042,7 @@ retry_buf: } /* Get terminal size. */ - _getvideoconfig(&vc); + term_width = term_get_size_x(); /* Start output according to the selected mode. */ if (mode == '8') { @@ -1321,7 +1123,7 @@ retry_buf: printf("┌ Location ─┐┌ INT Lines ┐┌ Steerable IRQs ───────── (INTA=1 B=2 C=4 D=8) ┐\n"); printf("│Slt Bus Dev││A1 B2 C3 D4││ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15│\n"); printf("┴───────────┴┴───────────┴┴───────────────────────────────────────────────┴"); - for (i = 75; i < vc.numtextcols; i++) + for (i = 75; i < term_width; i++) putchar('─'); } @@ -1414,6 +1216,7 @@ next_entry: return 0; } +#endif static int @@ -1454,7 +1257,7 @@ write_reg(uint8_t bus, uint8_t dev, uint8_t func, uint8_t reg, char *val) case 1: case 2: /* Byte input value. */ - sscanf(val, "%" SCNx8, ®_val.u8[0]); + parse_hex_u8(val, ®_val.u8[0]); /* Print banner message. */ printf("Writing %02X to PCI bus %02X device %02X function %d register [%02X]\n", @@ -1479,7 +1282,7 @@ write_reg(uint8_t bus, uint8_t dev, uint8_t func, uint8_t reg, char *val) case 3: case 4: /* Word input value. */ - sscanf(val, "%" SCNx16, ®_val.u16[0]); + parse_hex_u16(val, ®_val.u16[0]); /* Print banner message. */ printf("Writing %04X to PCI bus %02X device %02X function %d registers [%02X:%02X]\n", @@ -1505,7 +1308,7 @@ write_reg(uint8_t bus, uint8_t dev, uint8_t func, uint8_t reg, char *val) default: /* Dword input value. */ - sscanf(val, "%" SCNx32, ®_val.u32); + parse_hex_u32(val, ®_val.u32); /* Print banner message. */ printf("Writing %04X%04X to PCI bus %02X device %02X function %d registers [%02X:%02X]\n", @@ -1538,40 +1341,45 @@ int main(int argc, char **argv) { int hexargc, i; - char *ch, nonhex; + char *ch; uint8_t hexargv[8], bus, dev, func, reg; uint32_t cf8; +#ifdef __WATCOMC__ /* Disable stdout buffering. */ setbuf(stdout, NULL); +#endif /* Print usage if there are too few parameters or if the first one looks invalid. */ if ((argc <= 1) || (strlen(argv[1]) < 2) || ((argv[1][0] != '-') && (argv[1][0] != '/'))) { usage: printf("Usage:\n"); printf("\n"); - printf("PCIREG -s [-d]\n"); + printf("%s -s [-d]\n", argv[0]); printf("∟ Display all devices on the PCI bus. Specify -d to dump registers as well.\n"); +#ifdef __WATCOMC__ printf("\n"); - printf("PCIREG -t [-8]\n"); + printf("%s -t [-8]\n", argv[0]); printf("∟ Display BIOS IRQ steering table. Specify -8 to display as 86Box code.\n"); +#endif printf("\n"); - printf("PCIREG -i [bus] device [function]\n"); + printf("%s -i [bus] device [function]\n", argv[0]); printf("∟ Show information about the specified device.\n"); printf("\n"); - printf("PCIREG -r [bus] device [function] register\n"); + printf("%s -r [bus] device [function] register\n", argv[0]); printf("∟ Read the specified register.\n"); printf("\n"); - printf("PCIREG -w [bus] device [function] register value\n"); + printf("%s -w [bus] device [function] register value\n", argv[0]); printf("∟ Write byte, word or dword to the specified register.\n"); printf("\n"); - printf("PCIREG {-d|-dw|-dl} [bus] device [function [register]]\n"); + printf("%s {-d|-dw|-dl} [bus] device [function [register]]\n", argv[0]); printf("∟ Dump registers as bytes (-d), words (-dw) or dwords (-dl). Optionally\n"); printf(" specify the register to start from (requires bus to be specified as well).\n"); printf("\n"); printf("All numeric parameters should be specified in hexadecimal (without 0x prefix).\n"); printf("{bus device function register} can be substituted for a single port CF8h dword.\n"); printf("Register dumps are saved to PCIbbddf.BIN where bb=bus, dd=device, f=function."); + term_finallinebreak(); return 1; } @@ -1600,16 +1408,19 @@ usage: return scan_buses(argv[2][1]); else return scan_buses('\0'); - } else if (argv[1][1] == 't') { + } +#if defined(__WATCOMC__) && !defined(M_I386) + else if (argv[1][1] == 't') { /* Steering table display only requires a single optional parameter. */ if ((argc >= 3) && (strlen(argv[2]) > 1)) return dump_steering_table(argv[2][1]); else return dump_steering_table('\0'); - } else if ((argc >= 3) && (strlen(argv[1]) > 1)) { + } +#endif + else if ((argc >= 3) && (strlen(argv[1]) > 1)) { /* Read second parameter as a dword. */ - nonhex = 0; - if (sscanf(argv[2], "%" SCNx32 "%c", &cf8, &nonhex) && !nonhex) { + if (parse_hex_u32(argv[2], &cf8)) { /* Initialize default bus/device/function/register values. */ bus = dev = func = reg = 0; @@ -1625,8 +1436,7 @@ usage: /* Read parameters until the end is reached or an invalid hex value is found. */ for (i = 3; (i < argc) && (i < (sizeof(hexargv) - 1)); i++) { - nonhex = 0; - if (!sscanf(argv[i], "%" SCNx8 "%s", &hexargv[hexargc++], &nonhex) || nonhex) + if (!parse_hex_u8(argv[i], &hexargv[hexargc++])) break; } } else { @@ -1705,6 +1515,7 @@ usage: break; default: + printf("unknown hexargc %d\n", hexargc); goto usage; } diff --git a/pcireg/pciutil.py b/pcireg/pciutil.py index 5e2e2d9..bab1541 100644 --- a/pcireg/pciutil.py +++ b/pcireg/pciutil.py @@ -15,13 +15,20 @@ # # Copyright 2021 RichardG. # -import re, urllib.request +import io, re, urllib.request clean_device_abbr = [ + # Generic patterns to catch extended abbreviations: "Abbreviated Terms (AT)" + ('([A-Z])[^\s]+ ([A-Z])[^\s]+ (?:\(|\[|\{|/)\\2\\3(?:$|\)|\]|\})', '\\2\\3'), + ('([A-Z])[^\s]+ ([A-Z])[^\s]+ ([A-Z])[^\s]+ (?:\(|\[|\{|/)\\2\\3\\4(?:$|\)|\]|\})', '\\2\\3\\4'), + ('([A-Z])[^\s]+ ([A-Z])[^\s]+ ([A-Z])[^\s]+ ([A-Z])[^\s]+ (?:\(|\[|\{|/)\\2\\3\\4\\5(?:$|\)|\]|\})', '\\2\\3\\4\\5'), + + # Manual patterns ('100Base-TX?', 'FE'), ('1000Base-T', 'GbE'), ('Accelerat(?:ion|or)', 'Accel.'), ('Alert on LAN', 'AoL'), + ('\((.+) applications?\)', '\\2'), # 8086:105e ('Chipset Family', 'Chipset'), ('Chipset Graphics', 'iGPU'), ('Connection', 'Conn.'), @@ -61,9 +68,11 @@ clean_device_abbr = [ ('Virtual Machine', 'VM'), ('Wake on LAN', 'WoL'), ('Wireless LAN', 'WLAN'), + + # Generic pattern to remove duplicate abbreviations: "AT (AT)" + ('([^ \(\[\{/]+) (?: |\(|\[|\{|/)\\2(?: |\)|\]|\})', '\\2'), ] clean_device_bit_pattern = re.compile('''( |^|\(|\[|\{|/)(?:([0-9]{1,4}) )?(?:(K)(?:ilo)?|(M)(?:ega)?|(G)(?:iga)?)bit( |$|\)|\]|\})''', re.I) -clean_device_doubleabbr_pattern = re.compile('''( |^|\(|\[|\{|/)([^ \(\[\{/]+) (?: |\(|\[|\{|/)\\2(?: |\)|\]|\})( |$|\)|\]|\})''') clean_device_suffix_pattern = re.compile(''' (?:Adapter|Card|Device|(?:Host )?Controller)( (?: [0-9#]+)?|$|\)|\]|\})''', re.I) clean_vendor_abbr_pattern = re.compile(''' \[([^\]]+)\]''') clean_vendor_suffix_pattern = re.compile(''' (?:Semiconductors?|(?:Micro)?electronics?|Interactive|Technolog(?:y|ies)|(?:Micro)?systems|Computer(?: works)?|Products|Group|and subsidiaries|of(?: America)?|Co(?:rp(?:oration)?|mpany)?|Inc|LLC|Ltd|GmbH|AB|AG|SA|(?:\(|\[|\{).*)$''', re.I) @@ -106,7 +115,6 @@ def clean_device(device, vendor=None): device = clean_device_bit_pattern.sub('\\1\\2\\3\\4\\5bit\\6', device) for pattern, replace in _clean_device_abbr_cache: device = pattern.sub(replace, device) - device = clean_device_doubleabbr_pattern.sub('\\1\\2\\3', device) device = clean_device_suffix_pattern.sub('\\1', device) # Remove duplicate vendor ID. @@ -144,6 +152,43 @@ def clean_vendor(vendor): # Remove duplicate spaces. return ' '.join(vendor.split()) +def download_compressed(url, skip_exts=[]): + """Downloads a file which may be available in compressed versions.""" + + # Try all files. + for ext, module_name in (('.xz', 'lzma'), ('.bz2', 'bz2'), ('.gz', 'gzip'), (None, None)): + # Skip extension if requested. + if ext in skip_exts: + continue + + # Import decompression module if required. + if module_name: + try: + module = __import__(module_name) + except: + continue + + # Connect to URL. + try: + f = urllib.request.urlopen(url + (ext or ''), timeout=30) + except: + # Move on to the next file if the connection failed. + continue + + # If this is uncompressed, return the file handle as is. + if not module_name: + return f + + # Decompress data into a BytesIO object. + try: + return io.BytesIO(module.decompress(f.read())) + except: + # Move on to the next file if decompression failed. + continue + + # No success with any files. + raise FileNotFoundError('All attempts to download "{0}" and variants thereof have failed'.format(url)) + def get_pci_id(vendor_id, device_id): """Get the PCI device vendor and name for vendor_id and device_id.""" @@ -163,7 +208,7 @@ def load_pci_db(): f = open('/usr/share/misc/pci.ids', 'rb') except: try: - f = urllib.request.urlopen('https://pci-ids.ucw.cz/v2.2/pci.ids', timeout=30) + f = download_compressed('https://pci-ids.ucw.cz/v2.2/pci.ids', ['.xz']) except: # No sources available. return diff --git a/pcireg/uefi/Makefile b/pcireg/uefi/Makefile new file mode 100644 index 0000000..d4bc02c --- /dev/null +++ b/pcireg/uefi/Makefile @@ -0,0 +1,112 @@ +# detect architecture +MYARCH = $(shell uname -m | sed s,i[3456789]86,ia32,) +ifeq ($(ARCH),) +ARCH = $(MYARCH) +endif + +# get source files, generate object names +ifeq ($(SRCS),) +SRCS = $(wildcard *.c) $(wildcard *.S) +endif +TMP = $(SRCS:.c=.o) +OBJS2 = $(TMP:.S=.o) +CFLAGS += -fshort-wchar -fno-strict-aliasing -ffreestanding -fno-stack-protector -fno-stack-check -I. -I./uefi \ + -I/usr/include -I/usr/include/efi -I/usr/include/efi/protocol -I/usr/include/efi/$(ARCH) -D__$(ARCH)__ +ifeq ($(ARCH),x86_64) +CFLAGS += -DHAVE_USE_MS_ABI -mno-red-zone +endif + +# for libuefi.a +LIBSRCS = $(filter-out $(wildcard crt_*.c),$(wildcard *.c)) $(wildcard *.S) +TMP2 = $(LIBSRCS:.c=.o) +LIBOBJS2 = $(TMP2:.S=.o) + +# detect toolchain +ifeq ($(wildcard /usr/bin/clang),) +USE_GCC = 1 +endif +ifneq ($(USE_GCC),) +ifeq ($(ARCH),x86_64) +CFLAGS += -maccumulate-outgoing-args +endif +CFLAGS += -Wno-builtin-declaration-mismatch -fpic -fPIC +LDFLAGS += -nostdlib -shared -Bsymbolic -Luefi uefi/crt_$(ARCH).o +LIBS += -o $(TARGET).so -luefi -T uefi/elf_$(ARCH)_efi.lds +# see if we're cross-compiling +ifneq ($(ARCH),$(MYARCH)) +CC = $(ARCH)-elf-gcc +LD = $(ARCH)-elf-ld +OBJCOPY ?= $(ARCH)-elf-objcopy +else +CC = gcc +LD = ld +OBJCOPY ?= objcopy +endif +ifeq ($(ARCH),aarch64) +EFIARCH = pei-aarch64-little +else +EFIARCH = efi-app-$(ARCH) +endif +AR ?= ar +else +CFLAGS += --target=$(ARCH)-pc-win32-coff -Wno-builtin-requires-header -Wno-incompatible-library-redeclaration -Wno-long-long +LDFLAGS += -subsystem:efi_application -nodefaultlib -dll -entry:uefi_init uefi/*.o +LIBS = -out:$(TARGET) +CC = clang +LD = lld-link +OBJCOPY = true +endif + +# recipies +ifeq ($(wildcard uefi/Makefile),) +ALLTARGETS = crt_$(ARCH).o libuefi.a build +else +ALLTARGETS = uefi/crt_$(ARCH).o uefi/libuefi.a $(OBJS2) $(TARGET) +endif + +all: $(ALLTARGETS) $(EXTRA) + +uefi/libuefi.a: + @make --no-print-directory -C uefi libuefi.a USE_GCC=$(USE_GCC) ARCH=$(ARCH) + +libuefi.lib: $(LIBOBJS2) + +libuefi.a: $(LIBOBJS2) +ifneq ($(USE_GCC),) + @rm $@ 2>/dev/null || true + $(AR) -frsv $@ $(LIBOBJS2) >/dev/null +else + @true +endif + +$(TARGET): $(TARGET).so +ifneq ($(USE_GCC),) + @$(OBJCOPY) -j .text -j .sdata -j .data -j .dynamic -j .dynsym -j .rel -j .rela -j .rel.* -j .rela.* -j .reloc --target $(EFIARCH) --subsystem=10 $^ $@ || echo target: $(EFIARCH) + @rm $(TARGET).so +endif + +$(TARGET).so: $(OBJS2) + $(LD) $(LDFLAGS) $^ $(LIBS) + @rm *.lib 2>/dev/null || true + +%.o: %.c + $(CC) $(CFLAGS) -c $< -o $@ + +%.o: %.S + $(CC) $(CFLAGS) -c $< -o $@ + +build: + @mkdir ../build ../build/uefi 2>/dev/null || true + @cp crt_$(ARCH).o ../build/uefi/crt0.o + @cp elf_$(ARCH)_efi.lds ../build/uefi/link.ld + @cp libuefi.a uefi.h ../build/uefi + +clean: + @rm $(TARGET) *.o *.a *.lib *.elf $(LIBOBJS2) 2>/dev/null || true + +distclean: clean +ifeq ($(wildcard uefi/Makefile),) + @rm -rf ../build 2>/dev/null || true +else + @rm uefi/*.o uefi/libuefi.a 2>/dev/null || true +endif diff --git a/pcireg/uefi/crt_aarch64.c b/pcireg/uefi/crt_aarch64.c new file mode 100644 index 0000000..f7ed6bf --- /dev/null +++ b/pcireg/uefi/crt_aarch64.c @@ -0,0 +1,232 @@ +/* + * crt_aarch64.c + * + * Copyright (C) 2021 bzt (bztsrc@gitlab) + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * This file is part of the POSIX-UEFI package. + * @brief C runtime, bootstraps an EFI application to call standard main() + * + */ + +#include + +/* this is implemented by the application */ +extern int main(int argc, char_t **argv); + +/* definitions for elf relocations */ +typedef uint64_t Elf64_Xword; +typedef int64_t Elf64_Sxword; +typedef uint64_t Elf64_Addr; +typedef struct +{ + Elf64_Sxword d_tag; /* Dynamic entry type */ + union + { + Elf64_Xword d_val; /* Integer value */ + Elf64_Addr d_ptr; /* Address value */ + } d_un; +} Elf64_Dyn; +#define DT_NULL 0 /* Marks end of dynamic section */ +#define DT_RELA 7 /* Address of Rela relocs */ +#define DT_RELASZ 8 /* Total size of Rela relocs */ +#define DT_RELAENT 9 /* Size of one Rela reloc */ +typedef struct +{ + Elf64_Addr r_offset; /* Address */ + Elf64_Xword r_info; /* Relocation type and symbol index */ +} Elf64_Rel; +#define ELF64_R_TYPE(i) ((i) & 0xffffffff) +#define R_AARCH64_RELATIVE 1027 /* Adjust by program base */ + +/* globals to store system table pointers */ +efi_handle_t IM = NULL; +efi_system_table_t *ST = NULL; +efi_boot_services_t *BS = NULL; +efi_runtime_services_t *RT = NULL; +efi_loaded_image_protocol_t *LIP = NULL; +#if USE_UTF8 +char *__argvutf8 = NULL; +#endif + +/* we only need one .o file, so use inline Assembly here */ +void bootstrap() +{ + __asm__ __volatile__ ( + /* call init in C */ + " .align 4\n" +#ifndef __clang__ + " .globl _start\n" + "_start:\n" + " ldr x2, =ImageBase\n" + " adrp x3, _DYNAMIC\n" + " add x3, x3, #:lo12:_DYNAMIC\n" + " bl uefi_init\n" + " ret\n" + + /* fake a relocation record, so that EFI won't complain */ + " .data\n" + "dummy: .long 0\n" + " .section .reloc, \"a\"\n" + "label1:\n" + " .long dummy-label1\n" + " .long 10\n" + " .word 0\n" + ".text\n" +#else + " .globl __chkstk\n" + "__chkstk:\n" + " ret\n" +#endif + ); + + /* setjmp and longjmp */ + __asm__ __volatile__ ( + " .p2align 3\n" + " .globl setjmp\n" + "setjmp:\n" + " mov x16, sp\n" + " stp x19, x20, [x0, #0]\n" + " stp x21, x22, [x0, #16]\n" + " stp x23, x24, [x0, #32]\n" + " stp x25, x26, [x0, #48]\n" + " stp x27, x28, [x0, #64]\n" + " stp x29, x30, [x0, #80]\n" + " str x16, [x0, #96]\n" + " stp d8, d9, [x0, #112]\n" + " stp d10, d11, [x0, #128]\n" + " stp d12, d13, [x0, #144]\n" + " stp d14, d15, [x0, #160]\n" + " mov w0, #0\n" + " ret\n" + ); + __asm__ __volatile__ ( + " .globl longjmp\n" + "longjmp:\n" + " ldp x19, x20, [x0, #0]\n" + " ldp x21, x22, [x0, #16]\n" + " ldp x23, x24, [x0, #32]\n" + " ldp x25, x26, [x0, #48]\n" + " ldp x27, x28, [x0, #64]\n" + " ldp x29, x30, [x0, #80]\n" + " ldr x16, [x0, #96]\n" + " ldp d8, d9, [x0, #112]\n" + " ldp d10, d11, [x0, #128]\n" + " ldp d12, d13, [x0, #144]\n" + " ldp d14, d15, [x0, #160]\n" + " mov sp, x16\n" + " cmp w1, #0\n" + " mov w0, #1\n" + " csel w0, w1, w0, ne\n" + " br x30\n" + ); +} + +/** + * Initialize POSIX-UEFI and call the application's main() function + */ +int uefi_init ( + efi_handle_t image, efi_system_table_t *systab +#ifndef __clang__ + , uintptr_t ldbase, Elf64_Dyn *dyn +#endif +) { + efi_guid_t shpGuid = EFI_SHELL_PARAMETERS_PROTOCOL_GUID; + efi_shell_parameters_protocol_t *shp = NULL; + efi_guid_t shiGuid = SHELL_INTERFACE_PROTOCOL_GUID; + efi_shell_interface_protocol_t *shi = NULL; + efi_guid_t lipGuid = EFI_LOADED_IMAGE_PROTOCOL_GUID; + efi_status_t status; + int argc = 0, i; + wchar_t **argv = NULL; +#if USE_UTF8 + int ret, j; + char *s; +#endif +#ifndef __clang__ + long relsz = 0, relent = 0; + Elf64_Rel *rel = 0; + uintptr_t *addr; + /* handle relocations */ + for (i = 0; dyn[i].d_tag != DT_NULL; ++i) { + switch (dyn[i].d_tag) { + case DT_RELA: rel = (Elf64_Rel*)((unsigned long)dyn[i].d_un.d_ptr + ldbase); break; + case DT_RELASZ: relsz = dyn[i].d_un.d_val; break; + case DT_RELAENT: relent = dyn[i].d_un.d_val; break; + default: break; + } + } + if (rel && relent) { + while (relsz > 0) { + if(ELF64_R_TYPE (rel->r_info) == R_AARCH64_RELATIVE) + { addr = (unsigned long *)(ldbase + rel->r_offset); *addr += ldbase; break; } + rel = (Elf64_Rel*) ((char *) rel + relent); + relsz -= relent; + } + } +#else + (void)i; +#endif + /* save EFI pointers and loaded image into globals */ + IM = image; + ST = systab; + BS = systab->BootServices; + RT = systab->RuntimeServices; + BS->HandleProtocol(image, &lipGuid, (void **)&LIP); + /* get command line arguments */ + status = BS->OpenProtocol(image, &shpGuid, (void **)&shp, image, NULL, EFI_OPEN_PROTOCOL_GET_PROTOCOL); + if(!EFI_ERROR(status) && shp) { argc = shp->Argc; argv = shp->Argv; } + else { + /* if shell 2.0 failed, fallback to shell 1.0 interface */ + status = BS->OpenProtocol(image, &shiGuid, (void **)&shi, image, NULL, EFI_OPEN_PROTOCOL_GET_PROTOCOL); + if(!EFI_ERROR(status) && shi) { argc = shi->Argc; argv = shi->Argv; } + } + /* call main */ +#if USE_UTF8 + if(argc && argv) { + ret = (argc + 1) * (sizeof(uintptr_t) + 1); + for(i = 0; i < argc; i++) + for(j = 0; argv[i] && argv[i][j]; j++) + ret += argv[i][j] < 0x80 ? 1 : (argv[i][j] < 0x800 ? 2 : 3); + status = BS->AllocatePool(LIP ? LIP->ImageDataType : EfiLoaderData, ret, (void **)&__argvutf8); + if(EFI_ERROR(status) || !__argvutf8) { argc = 0; __argvutf8 = NULL; } + else { + s = __argvutf8 + argc * sizeof(uintptr_t); + *((uintptr_t*)s) = (uintptr_t)0; s += sizeof(uintptr_t); + for(i = 0; i < argc; i++) { + *((uintptr_t*)(__argvutf8 + i * sizeof(uintptr_t))) = (uintptr_t)s; + for(j = 0; argv[i] && argv[i][j]; j++) { + if(argv[i][j]<0x80) { *s++ = argv[i][j]; } else + if(argv[i][j]<0x800) { *s++ = ((argv[i][j]>>6)&0x1F)|0xC0; *s++ = (argv[i][j]&0x3F)|0x80; } else + { *s++ = ((argv[i][j]>>12)&0x0F)|0xE0; *s++ = ((argv[i][j]>>6)&0x3F)|0x80; *s++ = (argv[i][j]&0x3F)|0x80; } + } + *s++ = 0; + } + } + } + ret = main(argc, (char**)__argvutf8); + if(__argvutf8) BS->FreePool(__argvutf8); + return ret; +#else + return main(argc, argv); +#endif +} diff --git a/pcireg/uefi/crt_x86_64.c b/pcireg/uefi/crt_x86_64.c new file mode 100644 index 0000000..2597adf --- /dev/null +++ b/pcireg/uefi/crt_x86_64.c @@ -0,0 +1,235 @@ +/* + * crt_x86_64.c + * + * Copyright (C) 2021 bzt (bztsrc@gitlab) + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * This file is part of the POSIX-UEFI package. + * @brief C runtime, bootstraps an EFI application to call standard main() + * + */ + +#include + +/* this is implemented by the application */ +extern int main(int argc, char_t **argv); + +/* definitions for elf relocations */ +typedef uint64_t Elf64_Xword; +typedef int64_t Elf64_Sxword; +typedef uint64_t Elf64_Addr; +typedef struct +{ + Elf64_Sxword d_tag; /* Dynamic entry type */ + union + { + Elf64_Xword d_val; /* Integer value */ + Elf64_Addr d_ptr; /* Address value */ + } d_un; +} Elf64_Dyn; +#define DT_NULL 0 /* Marks end of dynamic section */ +#define DT_RELA 7 /* Address of Rela relocs */ +#define DT_RELASZ 8 /* Total size of Rela relocs */ +#define DT_RELAENT 9 /* Size of one Rela reloc */ +typedef struct +{ + Elf64_Addr r_offset; /* Address */ + Elf64_Xword r_info; /* Relocation type and symbol index */ +} Elf64_Rel; +#define ELF64_R_TYPE(i) ((i) & 0xffffffff) +#define R_X86_64_RELATIVE 8 /* Adjust by program base */ + +/* globals to store system table pointers */ +efi_handle_t IM = NULL; +efi_system_table_t *ST = NULL; +efi_boot_services_t *BS = NULL; +efi_runtime_services_t *RT = NULL; +efi_loaded_image_protocol_t *LIP = NULL; +#if USE_UTF8 +char *__argvutf8 = NULL; +#endif + +/* we only need one .o file, so use inline Assembly here */ +void bootstrap() +{ + __asm__ __volatile__ ( + /* call init in C */ + " .align 4\n" +#ifndef __clang__ + " .globl _start\n" + "_start:\n" + " lea ImageBase(%rip), %rdi\n" + " lea _DYNAMIC(%rip), %rsi\n" + " call uefi_init\n" + " ret\n" + + /* fake a relocation record, so that EFI won't complain */ + " .data\n" + "dummy: .long 0\n" + " .section .reloc, \"a\"\n" + "label1:\n" + " .long dummy-label1\n" + " .long 10\n" + " .word 0\n" + ".text\n" +#else + " .globl __chkstk\n" + "__chkstk:\n" + " ret\n" +#endif + ); + + /* setjmp and longjmp */ + __asm__ __volatile__ ( + " .globl setjmp\n" + "setjmp:\n" + " pop %rsi\n" + " movq %rbx,0x00(%rdi)\n" + " movq %rsp,0x08(%rdi)\n" + " push %rsi\n" + " movq %rbp,0x10(%rdi)\n" + " movq %r12,0x18(%rdi)\n" + " movq %r13,0x20(%rdi)\n" + " movq %r14,0x28(%rdi)\n" + " movq %r15,0x30(%rdi)\n" + " movq %rsi,0x38(%rdi)\n" + " xor %rax,%rax\n" + " ret\n" + ); + __asm__ __volatile__ ( + " .globl longjmp\n" + "longjmp:\n" + " movl %esi, %eax\n" + " movq 0x00(%rdi), %rbx\n" + " movq 0x08(%rdi), %rsp\n" + " movq 0x10(%rdi), %rbp\n" + " movq 0x18(%rdi), %r12\n" + " movq 0x20(%rdi), %r13\n" + " movq 0x28(%rdi), %r14\n" + " movq 0x30(%rdi), %r15\n" + " xor %rdx,%rdx\n" + " mov $1,%rcx\n" + " cmp %rax,%rdx\n" + " cmove %rcx,%rax\n" + " jmp *0x38(%rdi)\n" + ); +} + +/** + * Initialize POSIX-UEFI and call the application's main() function + */ +int uefi_init ( +#ifndef __clang__ + uintptr_t ldbase, Elf64_Dyn *dyn, efi_system_table_t *systab, efi_handle_t image +#else + efi_handle_t image, efi_system_table_t *systab +#endif +) { + efi_guid_t shpGuid = EFI_SHELL_PARAMETERS_PROTOCOL_GUID; + efi_shell_parameters_protocol_t *shp = NULL; + efi_guid_t shiGuid = SHELL_INTERFACE_PROTOCOL_GUID; + efi_shell_interface_protocol_t *shi = NULL; + efi_guid_t lipGuid = EFI_LOADED_IMAGE_PROTOCOL_GUID; + efi_status_t status; + int argc = 0, i; + wchar_t **argv = NULL; +#if USE_UTF8 + int ret, j; + char *s; +#endif +#ifndef __clang__ + long relsz = 0, relent = 0; + Elf64_Rel *rel = 0; + uintptr_t *addr; + /* handle relocations */ + for (i = 0; dyn[i].d_tag != DT_NULL; ++i) { + switch (dyn[i].d_tag) { + case DT_RELA: rel = (Elf64_Rel*)((unsigned long)dyn[i].d_un.d_ptr + ldbase); break; + case DT_RELASZ: relsz = dyn[i].d_un.d_val; break; + case DT_RELAENT: relent = dyn[i].d_un.d_val; break; + default: break; + } + } + if (rel && relent) { + while (relsz > 0) { + if(ELF64_R_TYPE (rel->r_info) == R_X86_64_RELATIVE) + { addr = (unsigned long *)(ldbase + rel->r_offset); *addr += ldbase; break; } + rel = (Elf64_Rel*) ((char *) rel + relent); + relsz -= relent; + } + } +#else + (void)i; +#endif + /* make sure SSE is enabled, because some say there are buggy firmware in the wild not doing that */ + __asm__ __volatile__ ( + " movq %cr0, %rax\n" + " andb $0xF1, %al\n" + " movq %rax, %cr0\n" + " movq %cr4, %rax\n" + " orw $3 << 9, %ax\n" + " mov %rax, %cr4\n" + ); + /* save EFI pointers and loaded image into globals */ + IM = image; + ST = systab; + BS = systab->BootServices; + RT = systab->RuntimeServices; + BS->HandleProtocol(image, &lipGuid, (void **)&LIP); + /* get command line arguments */ + status = BS->OpenProtocol(image, &shpGuid, (void **)&shp, image, NULL, EFI_OPEN_PROTOCOL_GET_PROTOCOL); + if(!EFI_ERROR(status) && shp) { argc = shp->Argc; argv = shp->Argv; } + else { + /* if shell 2.0 failed, fallback to shell 1.0 interface */ + status = BS->OpenProtocol(image, &shiGuid, (void **)&shi, image, NULL, EFI_OPEN_PROTOCOL_GET_PROTOCOL); + if(!EFI_ERROR(status) && shi) { argc = shi->Argc; argv = shi->Argv; } + } + /* call main */ +#if USE_UTF8 + if(argc && argv) { + ret = (argc + 1) * (sizeof(uintptr_t) + 1); + for(i = 0; i < argc; i++) + for(j = 0; argv[i] && argv[i][j]; j++) + ret += argv[i][j] < 0x80 ? 1 : (argv[i][j] < 0x800 ? 2 : 3); + status = BS->AllocatePool(LIP ? LIP->ImageDataType : EfiLoaderData, ret, (void **)&__argvutf8); + if(EFI_ERROR(status) || !__argvutf8) { argc = 0; __argvutf8 = NULL; } + else { + s = __argvutf8 + argc * sizeof(uintptr_t); + *((uintptr_t*)s) = (uintptr_t)0; s += sizeof(uintptr_t); + for(i = 0; i < argc; i++) { + *((uintptr_t*)(__argvutf8 + i * sizeof(uintptr_t))) = (uintptr_t)s; + for(j = 0; argv[i] && argv[i][j]; j++) { + if(argv[i][j]<0x80) { *s++ = argv[i][j]; } else + if(argv[i][j]<0x800) { *s++ = ((argv[i][j]>>6)&0x1F)|0xC0; *s++ = (argv[i][j]&0x3F)|0x80; } else + { *s++ = ((argv[i][j]>>12)&0x0F)|0xE0; *s++ = ((argv[i][j]>>6)&0x3F)|0x80; *s++ = (argv[i][j]&0x3F)|0x80; } + } + *s++ = 0; + } + } + } + ret = main(argc, (char**)__argvutf8); + if(__argvutf8) BS->FreePool(__argvutf8); + return ret; +#else + return main(argc, argv); +#endif +} diff --git a/pcireg/uefi/dirent.c b/pcireg/uefi/dirent.c new file mode 100644 index 0000000..320b190 --- /dev/null +++ b/pcireg/uefi/dirent.c @@ -0,0 +1,76 @@ +/* + * dirent.c + * + * Copyright (C) 2021 bzt (bztsrc@gitlab) + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * This file is part of the POSIX-UEFI package. + * @brief Implementing functions which are defined in dirent.h + * + */ + +#include + +extern void __stdio_seterrno(efi_status_t status); +struct dirent __dirent; + +DIR *opendir (const char_t *__name) +{ + DIR *dp = (DIR*)fopen(__name, CL("rd")); + if(dp) rewinddir(dp); + return dp; +} + +struct dirent *readdir (DIR *__dirp) +{ + efi_status_t status; + efi_file_info_t info; + uintn_t bs = sizeof(efi_file_info_t); + memset(&__dirent, 0, sizeof(struct dirent)); + status = __dirp->Read(__dirp, &bs, &info); + if(EFI_ERROR(status) || !bs) { + if(EFI_ERROR(status)) __stdio_seterrno(status); + else errno = 0; + return NULL; + } + __dirent.d_type = info.Attribute & EFI_FILE_DIRECTORY ? DT_DIR : DT_REG; +#if USE_UTF8 + __dirent.d_reclen = wcstombs(__dirent.d_name, info.FileName, FILENAME_MAX - 1); +#else + __dirent.d_reclen = strlen(info.FileName); + strncpy(__dirent.d_name, info.FileName, FILENAME_MAX - 1); +#endif + return &__dirent; +} + +void rewinddir (DIR *__dirp) +{ + if(__dirp) + __dirp->SetPosition(__dirp, 0); +} + +int closedir (DIR *__dirp) +{ + return fclose((FILE*)__dirp); +} + + diff --git a/pcireg/uefi/elf_aarch64_efi.lds b/pcireg/uefi/elf_aarch64_efi.lds new file mode 100644 index 0000000..836d982 --- /dev/null +++ b/pcireg/uefi/elf_aarch64_efi.lds @@ -0,0 +1,63 @@ +OUTPUT_FORMAT("elf64-littleaarch64", "elf64-littleaarch64", "elf64-littleaarch64") +OUTPUT_ARCH(aarch64) +ENTRY(_start) +SECTIONS +{ + .text 0x0 : { + _text = .; + *(.text.head) + *(.text) + *(.text.*) + *(.gnu.linkonce.t.*) + *(.srodata) + *(.rodata*) + . = ALIGN(16); + } + _etext = .; + _text_size = . - _text; + .dynamic : { *(.dynamic) } + .data : ALIGN(4096) + { + _data = .; + *(.sdata) + *(.data) + *(.data1) + *(.data.*) + *(.got.plt) + *(.got) + + /* the EFI loader doesn't seem to like a .bss section, so we stick + it all into .data: */ + . = ALIGN(16); + _bss = .; + *(.sbss) + *(.scommon) + *(.dynbss) + *(.bss) + *(COMMON) + . = ALIGN(16); + _bss_end = .; + } + + .rela.dyn : { *(.rela.dyn) } + .rela.plt : { *(.rela.plt) } + .rela.got : { *(.rela.got) } + .rela.data : { *(.rela.data) *(.rela.data*) } + . = ALIGN(512); + _edata = .; + _data_size = . - _data; + + . = ALIGN(4096); + .dynsym : { *(.dynsym) } + . = ALIGN(4096); + .dynstr : { *(.dynstr) } + . = ALIGN(4096); + .note.gnu.build-id : { *(.note.gnu.build-id) } + /DISCARD/ : + { + *(.rel.reloc) + *(.eh_frame) + *(.note.GNU-stack) + } + .comment 0 : { *(.comment) } +} diff --git a/pcireg/uefi/elf_x86_64_efi.lds b/pcireg/uefi/elf_x86_64_efi.lds new file mode 100644 index 0000000..7be5902 --- /dev/null +++ b/pcireg/uefi/elf_x86_64_efi.lds @@ -0,0 +1,76 @@ +/* Same as elf_x86_64_fbsd_efi.lds, except for OUTPUT_FORMAT below - KEEP IN SYNC */ +OUTPUT_FORMAT("elf64-x86-64", "elf64-x86-64", "elf64-x86-64") +OUTPUT_ARCH(i386:x86-64) +ENTRY(_start) +SECTIONS +{ + . = 0; + ImageBase = .; + /* .hash and/or .gnu.hash MUST come first! */ + .hash : { *(.hash) } + .gnu.hash : { *(.gnu.hash) } + . = ALIGN(4096); + .eh_frame : + { + *(.eh_frame) + } + . = ALIGN(4096); + .text : + { + _text = .; + *(.text) + *(.text.*) + *(.gnu.linkonce.t.*) + . = ALIGN(16); + } + _etext = .; + _text_size = . - _text; + . = ALIGN(4096); + .reloc : + { + *(.reloc) + } + . = ALIGN(4096); + .data : + { + _data = .; + *(.rodata*) + *(.got.plt) + *(.got) + *(.data*) + *(.sdata) + /* the EFI loader doesn't seem to like a .bss section, so we stick + it all into .data: */ + *(.sbss) + *(.scommon) + *(.dynbss) + *(.bss) + *(COMMON) + *(.rel.local) + } + .note.gnu.build-id : { *(.note.gnu.build-id) } + + _edata = .; + _data_size = . - _etext; + . = ALIGN(4096); + .dynamic : { *(.dynamic) } + . = ALIGN(4096); + .rela : + { + *(.rela.data*) + *(.rela.got) + *(.rela.stab) + } + . = ALIGN(4096); + .dynsym : { *(.dynsym) } + . = ALIGN(4096); + .dynstr : { *(.dynstr) } + . = ALIGN(4096); + .ignored.reloc : + { + *(.rela.reloc) + *(.eh_frame) + *(.note.GNU-stack) + } + .comment 0 : { *(.comment) } +} diff --git a/pcireg/uefi/qsort.c b/pcireg/uefi/qsort.c new file mode 100644 index 0000000..d6563c9 --- /dev/null +++ b/pcireg/uefi/qsort.c @@ -0,0 +1,154 @@ +/* + * qsort.c + * + * @brief from OpenBSD + */ + +/* $OpenBSD: qsort.c,v 1.10 2005/08/08 08:05:37 espie Exp $ */ +/*- + * Copyright (c) 1992, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ +#include + +static __inline char *med3(char *, char *, char *, __compar_fn_t cmp); +static __inline void swapfunc(char *, char *, int, int); +/* + * Qsort routine from Bentley & McIlroy's "Engineering a Sort Function". + */ +#define swapcode(TYPE, parmi, parmj, n) { \ + long i = (n) / sizeof (TYPE); \ + TYPE *pi = (TYPE *) (parmi); \ + TYPE *pj = (TYPE *) (parmj); \ + do { \ + TYPE t = *pi; \ + *pi++ = *pj; \ + *pj++ = t; \ + } while (--i > 0); \ +} +#define SWAPINIT(a, es) swaptype = ((char *)a - (char *)0) % sizeof(long) || \ + es % sizeof(long) ? 2 : es == sizeof(long)? 0 : 1; +static __inline void +swapfunc(char *a, char *b, int n, int swaptype) +{ + if (swaptype <= 1) + swapcode(long, a, b, n) + else + swapcode(char, a, b, n) +} +#define swap(a, b) \ + if (swaptype == 0) { \ + long t = *(long *)(a); \ + *(long *)(a) = *(long *)(b); \ + *(long *)(b) = t; \ + } else \ + swapfunc(a, b, es, swaptype) +#define vecswap(a, b, n) if ((n) > 0) swapfunc(a, b, n, swaptype) +static __inline char * +med3(char *a, char *b, char *c, __compar_fn_t cmp) +{ + return cmp(a, b) < 0 ? + (cmp(b, c) < 0 ? b : (cmp(a, c) < 0 ? c : a )) + :(cmp(b, c) > 0 ? b : (cmp(a, c) < 0 ? a : c )); +} + +void qsort(void *aa, size_t n, size_t es, __compar_fn_t cmp) +{ + char *pa, *pb, *pc, *pd, *pl, *pm, *pn; + int d, r, swaptype, swap_cnt; + char *a = aa; +loop: SWAPINIT(a, es); + swap_cnt = 0; + if (n < 7) { + for (pm = (char *)a + es; pm < (char *) a + n * es; pm += es) + for (pl = pm; pl > (char *) a && cmp(pl - es, pl) > 0; + pl -= es) + swap(pl, pl - es); + return; + } + pm = (char *)a + (n / 2) * es; + if (n > 7) { + pl = (char *)a; + pn = (char *)a + (n - 1) * es; + if (n > 40) { + d = (n / 8) * es; + pl = med3(pl, pl + d, pl + 2 * d, cmp); + pm = med3(pm - d, pm, pm + d, cmp); + pn = med3(pn - 2 * d, pn - d, pn, cmp); + } + pm = med3(pl, pm, pn, cmp); + } + swap(a, pm); + pa = pb = (char *)a + es; + + pc = pd = (char *)a + (n - 1) * es; + for (;;) { + while (pb <= pc && (r = cmp(pb, a)) <= 0) { + if (r == 0) { + swap_cnt = 1; + swap(pa, pb); + pa += es; + } + pb += es; + } + while (pb <= pc && (r = cmp(pc, a)) >= 0) { + if (r == 0) { + swap_cnt = 1; + swap(pc, pd); + pd -= es; + } + pc -= es; + } + if (pb > pc) + break; + swap(pb, pc); + swap_cnt = 1; + pb += es; + pc -= es; + } + if (swap_cnt == 0) { /* Switch to insertion sort */ + for (pm = (char *) a + es; pm < (char *) a + n * es; pm += es) + for (pl = pm; pl > (char *) a && cmp(pl - es, pl) > 0; + pl -= es) + swap(pl, pl - es); + return; + } + pn = (char *)a + n * es; + r = min(pa - (char *)a, pb - pa); + vecswap(a, pb - r, r); + r = min(pd - pc, pn - pd - (int)es); + vecswap(pb, pn - r, r); + if ((r = pb - pa) > (int)es) + qsort(a, r / es, es, cmp); + if ((r = pd - pc) > (int)es) { + /* Iterate rather than recurse to save stack space */ + a = pn - r; + n = r / es; + goto loop; + } +/* qsort(pn - r, r / es, es, cmp);*/ +} diff --git a/pcireg/uefi/stat.c b/pcireg/uefi/stat.c new file mode 100644 index 0000000..017a4f8 --- /dev/null +++ b/pcireg/uefi/stat.c @@ -0,0 +1,68 @@ +/* + * stat.c + * + * Copyright (C) 2021 bzt (bztsrc@gitlab) + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * This file is part of the POSIX-UEFI package. + * @brief Implementing functions which are defined in sys/stat.h + * + */ + +#include + +/* fstat is in stdio.c because we can't access static variables otherwise... */ + +int stat (const char_t *__file, struct stat *__buf) +{ + int ret; + FILE *f; + + if(!__file || !*__file || !__buf) { + errno = EINVAL; + return -1; + } + f = fopen(__file, CL("*")); + if(!f) { + memset(__buf, 0, sizeof(struct stat)); + return -1; + } + ret = fstat(f, __buf); + fclose(f); + return ret; +} + +extern int mkdir (const char_t *__path, mode_t __mode) +{ + FILE *f; + (void)__mode; + if(!__path || !*__path) { + errno = EINVAL; + return -1; + } + f = fopen(__path, CL("wd")); + if(!f) { + return -1; + } + fclose(f); + return 0; +} diff --git a/pcireg/uefi/stdio.c b/pcireg/uefi/stdio.c new file mode 100644 index 0000000..a9f80de --- /dev/null +++ b/pcireg/uefi/stdio.c @@ -0,0 +1,762 @@ +/* + * stdio.c + * + * Copyright (C) 2021 bzt (bztsrc@gitlab) + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * This file is part of the POSIX-UEFI package. + * @brief Implementing functions which are defined in stdio.h + * + */ + +#include + +static efi_file_handle_t *__root_dir = NULL; +static efi_serial_io_protocol_t *__ser = NULL; +static block_file_t *__blk_devs = NULL; +static uintn_t __blk_ndevs = 0; +extern time_t __mktime_efi(efi_time_t *t); + +void __stdio_cleanup() +{ +#if USE_UTF8 + if(__argvutf8) + BS->FreePool(__argvutf8); +#endif + if(__blk_devs) { + free(__blk_devs); + __blk_devs = NULL; + __blk_ndevs = 0; + } +} + +void __stdio_seterrno(efi_status_t status) +{ + switch((int)(status & 0xffff)) { + case EFI_WRITE_PROTECTED & 0xffff: errno = EROFS; break; + case EFI_ACCESS_DENIED & 0xffff: errno = EACCES; break; + case EFI_VOLUME_FULL & 0xffff: errno = ENOSPC; break; + case EFI_NOT_FOUND & 0xffff: errno = ENOENT; break; + case EFI_INVALID_PARAMETER & 0xffff: errno = EINVAL; break; + default: errno = EIO; break; + } +} + +int fstat (FILE *__f, struct stat *__buf) +{ + efi_guid_t infGuid = EFI_FILE_INFO_GUID; + efi_file_info_t info; + uintn_t fsiz = (uintn_t)sizeof(efi_file_info_t); + efi_status_t status; + int i; + + if(!__f || !__buf) { + errno = EINVAL; + return -1; + } + memset(__buf, 0, sizeof(struct stat)); + if(__f == stdin) { + __buf->st_mode = S_IREAD | S_IFIFO; + return 0; + } + if(__f == stdout || __f == stderr) { + __buf->st_mode = S_IWRITE | S_IFIFO; + return 0; + } + if(__ser && __f == (FILE*)__ser) { + __buf->st_mode = S_IREAD | S_IWRITE | S_IFCHR; + return 0; + } + for(i = 0; i < __blk_ndevs; i++) + if(__f == (FILE*)__blk_devs[i].bio) { + __buf->st_mode = S_IREAD | S_IWRITE | S_IFBLK; + __buf->st_size = (off_t)__blk_devs[i].bio->Media->BlockSize * (off_t)__blk_devs[i].bio->Media->LastBlock; + __buf->st_blocks = __blk_devs[i].bio->Media->LastBlock; + return 0; + } + status = __f->GetInfo(__f, &infGuid, &fsiz, &info); + if(EFI_ERROR(status)) { + __stdio_seterrno(status); + return -1; + } + __buf->st_mode = S_IREAD | + (info.Attribute & EFI_FILE_READ_ONLY ? 0 : S_IWRITE) | + (info.Attribute & EFI_FILE_DIRECTORY ? S_IFDIR : S_IFREG); + __buf->st_size = (off_t)info.FileSize; + __buf->st_blocks = (blkcnt_t)info.PhysicalSize; + __buf->st_atime = __mktime_efi(&info.LastAccessTime); + __buf->st_mtime = __mktime_efi(&info.ModificationTime); + __buf->st_ctime = __mktime_efi(&info.CreateTime); + return 0; +} + +int fclose (FILE *__stream) +{ + efi_status_t status = EFI_SUCCESS; + uintn_t i; + if(__stream == stdin || __stream == stdout || __stream == stderr || (__ser && __stream == (FILE*)__ser)) { + return 1; + } + for(i = 0; i < __blk_ndevs; i++) + if(__stream == (FILE*)__blk_devs[i].bio) + return 1; + status = __stream->Close(__stream); + free(__stream); + return !EFI_ERROR(status); +} + +int fflush (FILE *__stream) +{ + efi_status_t status = EFI_SUCCESS; + uintn_t i; + if(__stream == stdin || __stream == stdout || __stream == stderr || (__ser && __stream == (FILE*)__ser)) { + return 1; + } + for(i = 0; i < __blk_ndevs; i++) + if(__stream == (FILE*)__blk_devs[i].bio) { + return 1; + } + status = __stream->Flush(__stream); + return !EFI_ERROR(status); +} + +int __remove (const char_t *__filename, int isdir) +{ + efi_status_t status; + efi_guid_t infGuid = EFI_FILE_INFO_GUID; + efi_file_info_t info; + uintn_t fsiz = (uintn_t)sizeof(efi_file_info_t), i; + FILE *f = fopen(__filename, CL("r")); + if(f == stdin || f == stdout || f == stderr || (__ser && f == (FILE*)__ser)) { + errno = EBADF; + return 1; + } + for(i = 0; i < __blk_ndevs; i++) + if(f == (FILE*)__blk_devs[i].bio) { + errno = EBADF; + return 1; + } + if(isdir != -1) { + status = f->GetInfo(f, &infGuid, &fsiz, &info); + if(EFI_ERROR(status)) goto err; + if(isdir == 0 && (info.Attribute & EFI_FILE_DIRECTORY)) { + fclose(f); errno = EISDIR; + return -1; + } + if(isdir == 1 && !(info.Attribute & EFI_FILE_DIRECTORY)) { + fclose(f); errno = ENOTDIR; + return -1; + } + } + status = f->Delete(f); + if(EFI_ERROR(status)) { +err: __stdio_seterrno(status); + fclose(f); + return -1; + } + /* no need for fclose(f); */ + free(f); + return 0; +} + +int remove (const char_t *__filename) +{ + return __remove(__filename, -1); +} + +FILE *fopen (const char_t *__filename, const char_t *__modes) +{ + FILE *ret; + efi_status_t status; + efi_guid_t sfsGuid = EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_GUID; + efi_simple_file_system_protocol_t *sfs = NULL; + efi_guid_t infGuid = EFI_FILE_INFO_GUID; + efi_file_info_t info; + uintn_t fsiz = (uintn_t)sizeof(efi_file_info_t), par, i; +#if USE_UTF8 + wchar_t wcname[BUFSIZ]; +#endif + if(!__filename || !*__filename || !__modes || !*__modes) { + errno = EINVAL; + return NULL; + } + /* fake some device names. UEFI has no concept of device files */ + if(!strcmp(__filename, CL("/dev/stdin"))) { + if(__modes[0] == CL('w') || __modes[0] == CL('a')) { errno = EPERM; return NULL; } + return stdin; + } + if(!strcmp(__filename, CL("/dev/stdout"))) { + if(__modes[0] == CL('r')) { errno = EPERM; return NULL; } + return stdout; + } + if(!strcmp(__filename, CL("/dev/stderr"))) { + if(__modes[0] == CL('r')) { errno = EPERM; return NULL; } + return stderr; + } + if(!memcmp(__filename, CL("/dev/serial"), 11 * sizeof(char_t))) { + par = atol(__filename + 11); + if(!__ser) { + efi_guid_t serGuid = EFI_SERIAL_IO_PROTOCOL_GUID; + status = BS->LocateProtocol(&serGuid, NULL, (void**)&__ser); + if(EFI_ERROR(status) || !__ser) { errno = ENOENT; return NULL; } + } + __ser->SetAttributes(__ser, par > 9600 ? par : 115200, 0, 1000, NoParity, 8, OneStopBit); + return (FILE*)__ser; + } + if(!memcmp(__filename, CL("/dev/disk"), 9 * sizeof(char_t))) { + par = atol(__filename + 9); + if(!__blk_ndevs) { + efi_guid_t bioGuid = EFI_BLOCK_IO_PROTOCOL_GUID; + efi_handle_t handles[128]; + uintn_t handle_size = sizeof(handles); + status = BS->LocateHandle(ByProtocol, &bioGuid, NULL, handle_size, (efi_handle_t*)&handles); + if(!EFI_ERROR(status)) { + handle_size /= (uintn_t)sizeof(efi_handle_t); + __blk_devs = (block_file_t*)malloc(handle_size * sizeof(block_file_t)); + if(__blk_devs) { + memset(__blk_devs, 0, handle_size * sizeof(block_file_t)); + for(i = __blk_ndevs = 0; i < handle_size; i++) + if(!EFI_ERROR(BS->HandleProtocol(handles[i], &bioGuid, (void **) &__blk_devs[__blk_ndevs].bio)) && + __blk_devs[__blk_ndevs].bio && __blk_devs[__blk_ndevs].bio->Media && + __blk_devs[__blk_ndevs].bio->Media->BlockSize > 0) + __blk_ndevs++; + } else + __blk_ndevs = 0; + } + } + if(__blk_ndevs && par >= 0 && par < __blk_ndevs) + return (FILE*)__blk_devs[par].bio; + errno = ENOENT; + return NULL; + } + if(!__root_dir && LIP) { + status = BS->HandleProtocol(LIP->DeviceHandle, &sfsGuid, (void **)&sfs); + if(!EFI_ERROR(status)) + status = sfs->OpenVolume(sfs, &__root_dir); + } + if(!__root_dir) { + errno = ENODEV; + return NULL; + } + errno = 0; + ret = (FILE*)malloc(sizeof(FILE)); + if(!ret) return NULL; +#if USE_UTF8 + mbstowcs((wchar_t*)&wcname, __filename, BUFSIZ - 1); + status = __root_dir->Open(__root_dir, &ret, (wchar_t*)&wcname, +#else + status = __root_dir->Open(__root_dir, &ret, (wchar_t*)__filename, +#endif + __modes[0] == CL('w') ? (EFI_FILE_MODE_WRITE | EFI_FILE_MODE_READ | EFI_FILE_MODE_CREATE) : EFI_FILE_MODE_READ, + __modes[1] == CL('d') ? EFI_FILE_DIRECTORY : 0); + if(EFI_ERROR(status)) { +err: __stdio_seterrno(status); + free(ret); return NULL; + } + status = ret->GetInfo(ret, &infGuid, &fsiz, &info); + if(EFI_ERROR(status)) goto err; + if(__modes[1] == CL('d') && !(info.Attribute & EFI_FILE_DIRECTORY)) { + free(ret); errno = ENOTDIR; return NULL; + } + if(__modes[1] != CL('d') && (info.Attribute & EFI_FILE_DIRECTORY)) { + free(ret); errno = EISDIR; return NULL; + } + if(__modes[0] == CL('a')) fseek(ret, 0, SEEK_END); + return ret; +} + +size_t fread (void *__ptr, size_t __size, size_t __n, FILE *__stream) +{ + uintn_t bs = __size * __n, i, n; + efi_status_t status; + if(__stream == stdin || __stream == stdout || __stream == stderr) { + errno = ESPIPE; + return 0; + } + if(__ser && __stream == (FILE*)__ser) { + status = __ser->Read(__ser, &bs, __ptr); + } else { + for(i = 0; i < __blk_ndevs; i++) + if(__stream == (FILE*)__blk_devs[i].bio) { + n = __blk_devs[i].offset / __blk_devs[i].bio->Media->BlockSize; + bs = (bs / __blk_devs[i].bio->Media->BlockSize) * __blk_devs[i].bio->Media->BlockSize; + status = __blk_devs[i].bio->ReadBlocks(__blk_devs[i].bio, __blk_devs[i].bio->Media->MediaId, n, bs, __ptr); + if(EFI_ERROR(status)) { + __stdio_seterrno(status); + return 0; + } + __blk_devs[i].offset += bs; + return bs / __size; + } + status = __stream->Read(__stream, &bs, __ptr); + } + if(EFI_ERROR(status)) { + __stdio_seterrno(status); + return 0; + } + return bs / __size; +} + +size_t fwrite (const void *__ptr, size_t __size, size_t __n, FILE *__stream) +{ + uintn_t bs = __size * __n, n, i; + efi_status_t status; + if(__stream == stdin || __stream == stdout || __stream == stderr) { + errno = ESPIPE; + return 0; + } + if(__ser && __stream == (FILE*)__ser) { + status = __ser->Write(__ser, &bs, (void*)__ptr); + } else { + for(i = 0; i < __blk_ndevs; i++) + if(__stream == (FILE*)__blk_devs[i].bio) { + n = __blk_devs[i].offset / __blk_devs[i].bio->Media->BlockSize; + bs = (bs / __blk_devs[i].bio->Media->BlockSize) * __blk_devs[i].bio->Media->BlockSize; + status = __blk_devs[i].bio->WriteBlocks(__blk_devs[i].bio, __blk_devs[i].bio->Media->MediaId, n, bs, (void*)__ptr); + if(EFI_ERROR(status)) { + __stdio_seterrno(status); + return 0; + } + __blk_devs[i].offset += bs; + return bs / __size; + } + status = __stream->Write(__stream, &bs, (void *)__ptr); + } + if(EFI_ERROR(status)) { + __stdio_seterrno(status); + return 0; + } + return bs / __size; +} + +int fseek (FILE *__stream, long int __off, int __whence) +{ + off_t off = 0; + efi_status_t status; + efi_guid_t infoGuid = EFI_FILE_INFO_GUID; + efi_file_info_t info; + uintn_t fsiz = sizeof(efi_file_info_t), i; + if(__stream == stdin || __stream == stdout || __stream == stderr) { + errno = ESPIPE; + return -1; + } + if(__ser && __stream == (FILE*)__ser) { + errno = EBADF; + return -1; + } + for(i = 0; i < __blk_ndevs; i++) + if(__stream == (FILE*)__blk_devs[i].bio) { + off = (uint64_t)__blk_devs[i].bio->Media->BlockSize * (uint64_t)__blk_devs[i].bio->Media->LastBlock; + switch(__whence) { + case SEEK_END: + __blk_devs[i].offset = off + __off; + break; + case SEEK_CUR: + __blk_devs[i].offset += __off; + break; + case SEEK_SET: + __blk_devs[i].offset = __off; + break; + } + if(__blk_devs[i].offset < 0) __blk_devs[i].offset = 0; + if(__blk_devs[i].offset > off) __blk_devs[i].offset = off; + __blk_devs[i].offset = (__blk_devs[i].offset / __blk_devs[i].bio->Media->BlockSize) * + __blk_devs[i].bio->Media->BlockSize; + return 0; + } + switch(__whence) { + case SEEK_END: + status = __stream->GetInfo(__stream, &infoGuid, &fsiz, &info); + if(!EFI_ERROR(status)) { + off = info.FileSize + __off; + status = __stream->SetPosition(__stream, off); + } + break; + case SEEK_CUR: + status = __stream->GetPosition(__stream, &off); + if(!EFI_ERROR(status)) { + off += __off; + status = __stream->SetPosition(__stream, off); + } + break; + default: + status = __stream->SetPosition(__stream, off); + break; + } + return EFI_ERROR(status) ? -1 : 0; +} + +long int ftell (FILE *__stream) +{ + uint64_t off = 0; + uintn_t i; + efi_status_t status; + if(__stream == stdin || __stream == stdout || __stream == stderr) { + errno = ESPIPE; + return -1; + } + if(__ser && __stream == (FILE*)__ser) { + errno = EBADF; + return -1; + } + for(i = 0; i < __blk_ndevs; i++) + if(__stream == (FILE*)__blk_devs[i].bio) { + return (long int)__blk_devs[i].offset; + } + status = __stream->GetPosition(__stream, &off); + return EFI_ERROR(status) ? -1 : (long int)off; +} + +int feof (FILE *__stream) +{ + uint64_t off = 0; + efi_guid_t infGuid = EFI_FILE_INFO_GUID; + efi_file_info_t info; + uintn_t fsiz = (uintn_t)sizeof(efi_file_info_t), i; + efi_status_t status; + if(__stream == stdin || __stream == stdout || __stream == stderr) { + errno = ESPIPE; + return 0; + } + if(__ser && __stream == (FILE*)__ser) { + errno = EBADF; + return 0; + } + for(i = 0; i < __blk_ndevs; i++) + if(__stream == (FILE*)__blk_devs[i].bio) { + errno = EBADF; + return __blk_devs[i].offset == (off_t)__blk_devs[i].bio->Media->BlockSize * (off_t)__blk_devs[i].bio->Media->LastBlock; + } + status = __stream->GetPosition(__stream, &off); + if(EFI_ERROR(status)) { +err: __stdio_seterrno(status); + return 1; + } + status = __stream->GetInfo(__stream, &infGuid, &fsiz, &info); + if(EFI_ERROR(status)) goto err; + __stream->SetPosition(__stream, off); + return info.FileSize == off; +} + +int vsnprintf(char_t *dst, size_t maxlen, const char_t *fmt, __builtin_va_list args) +{ +#define needsescape(a) (a==CL('\"') || a==CL('\\') || a==CL('\a') || a==CL('\b') || a==CL('\033') || a==CL('\f') || \ + a==CL('\r') || a==CL('\n') || a==CL('\t') || a==CL('\v')) + efi_physical_address_t m; + uint8_t *mem; + int64_t arg; + int len, sign, i, j; + char_t *p, *orig=dst, *end = dst + maxlen - 1, tmpstr[19], pad, n; +#if !defined(USE_UTF8) || !USE_UTF8 + char *c; +#endif + if(dst==NULL || fmt==NULL) + return 0; + + arg = 0; + while(*fmt && dst < end) { + if(*fmt==CL('%')) { + fmt++; + if(*fmt==CL('%')) goto put; + len=0; pad=CL(' '); + if(*fmt==CL('0')) pad=CL('0'); + while(*fmt>=CL('0') && *fmt<=CL('9')) { + len *= 10; + len += *fmt-CL('0'); + fmt++; + } + if(*fmt==CL('l')) fmt++; + if(*fmt==CL('c')) { + arg = __builtin_va_arg(args, int); +#if USE_UTF8 + if(arg<0x80) { *dst++ = arg; } else + if(arg<0x800) { *dst++ = ((arg>>6)&0x1F)|0xC0; *dst++ = (arg&0x3F)|0x80; } else + { *dst++ = ((arg>>12)&0x0F)|0xE0; *dst++ = ((arg>>6)&0x3F)|0x80; *dst++ = (arg&0x3F)|0x80; } +#else + *dst++ = (wchar_t)(arg & 0xffff); +#endif + fmt++; + continue; + } else + if(*fmt==CL('d')) { + arg = __builtin_va_arg(args, int); + sign=0; + if((int)arg<0) { + arg*=-1; + sign++; + } + if(arg>99999999999999999L) { + arg=99999999999999999L; + } + i=18; + tmpstr[i]=0; + do { + tmpstr[--i]=CL('0')+(arg%10); + arg/=10; + } while(arg!=0 && i>0); + if(sign) { + tmpstr[--i]=CL('-'); + } + if(len>0 && len<18) { + while(i>18-len) { + tmpstr[--i]=pad; + } + } + p=&tmpstr[i]; + goto copystring; + } else + if(*fmt==CL('p')) { + arg = __builtin_va_arg(args, uint64_t); + len = 16; pad = CL('0'); goto hex; + } else + if(*fmt==CL('x') || *fmt==CL('X')) { + arg = __builtin_va_arg(args, long int); +hex: i=16; + tmpstr[i]=0; + do { + n=arg & 0xf; + /* 0-9 => '0'-'9', 10-15 => 'A'-'F' */ + tmpstr[--i]=n+(n>9?(*fmt==CL('X')?0x37:0x57):0x30); + arg>>=4; + } while(arg!=0 && i>0); + /* padding, only leading zeros */ + if(len>0 && len<=16) { + while(i>16-len) { + tmpstr[--i]=CL('0'); + } + } + p=&tmpstr[i]; + goto copystring; + } else + if(*fmt==CL('s') || *fmt==CL('q')) { + p = __builtin_va_arg(args, char_t*); +copystring: if(p==NULL) { + p=CL("(null)"); + } + while(*p && dst + 2 < end) { + if(*fmt==CL('q') && needsescape(*p)) { + *dst++ = CL('\\'); + switch(*p) { + case CL('\a'): *dst++ = CL('a'); break; + case CL('\b'): *dst++ = CL('b'); break; + case 27: *dst++ = CL('e'); break; /* gcc 10.2 doesn't like CL('\e') in ansi mode */ + case CL('\f'): *dst++ = CL('f'); break; + case CL('\n'): *dst++ = CL('n'); break; + case CL('\r'): *dst++ = CL('r'); break; + case CL('\t'): *dst++ = CL('t'); break; + case CL('\v'): *dst++ = CL('v'); break; + default: *dst++ = *p++; break; + } + } else { + if(*p == CL('\n') && (orig == dst || *(dst - 1) != CL('\r'))) *dst++ = CL('\r'); + *dst++ = *p++; + } + } + } else +#if !defined(USE_UTF8) || !USE_UTF8 + if(*fmt==L'S' || *fmt==L'Q') { + c = __builtin_va_arg(args, char*); + if(c==NULL) goto copystring; + while(*p && dst + 2 < end) { + arg = *c; + if((*c & 128) != 0) { + if((*c & 32) == 0 ) { + arg = ((*c & 0x1F)<<6)|(*(c+1) & 0x3F); + c += 1; + } else + if((*c & 16) == 0 ) { + arg = ((*c & 0xF)<<12)|((*(c+1) & 0x3F)<<6)|(*(c+2) & 0x3F); + c += 2; + } else + if((*c & 8) == 0 ) { + arg = ((*c & 0x7)<<18)|((*(c+1) & 0x3F)<<12)|((*(c+2) & 0x3F)<<6)|(*(c+3) & 0x3F); + c += 3; + } else + arg = L'?'; + } + if(!arg) break; + if(*fmt==L'Q' && needsescape(arg)) { + *dst++ = L'\\'; + switch(arg) { + case L'\a': *dst++ = L'a'; break; + case L'\b': *dst++ = L'b'; break; + case 27: *dst++ = L'e'; break; /* gcc 10.2 doesn't like L'\e' in ansi mode */ + case L'\f': *dst++ = L'f'; break; + case L'\n': *dst++ = L'n'; break; + case L'\r': *dst++ = L'r'; break; + case L'\t': *dst++ = L't'; break; + case L'\v': *dst++ = L'v'; break; + default: *dst++ = arg; break; + } + } else { + if(arg == L'\n') *dst++ = L'\r'; + *dst++ = (wchar_t)(arg & 0xffff); + } + } + } else +#endif + if(*fmt==CL('D')) { + m = __builtin_va_arg(args, efi_physical_address_t); + for(j = 0; j < (len < 1 ? 1 : (len > 16 ? 16 : len)); j++) { + for(i = 44; i >= 0; i -= 4) { + n = (m >> i) & 15; *dst++ = n + (n>9?0x37:0x30); + if(dst >= end) goto zro; + } + *dst++ = CL(':'); if(dst >= end) goto zro; + *dst++ = CL(' '); if(dst >= end) goto zro; + mem = (uint8_t*)m; + for(i = 0; i < 16; i++) { + n = (mem[i] >> 4) & 15; *dst++ = n + (n>9?0x37:0x30); if(dst >= end) goto zro; + n = mem[i] & 15; *dst++ = n + (n>9?0x37:0x30); if(dst >= end) goto zro; + *dst++ = CL(' ');if(dst >= end) goto zro; + } + *dst++ = CL(' '); if(dst >= end) goto zro; + for(i = 0; i < 16; i++) { + *dst++ = (mem[i] < 32 || mem[i] >= 127 ? CL('.') : mem[i]); + if(dst >= end) goto zro; + } + *dst++ = CL('\r'); if(dst >= end) goto zro; + *dst++ = CL('\n'); if(dst >= end) goto zro; + m += 16; + } + } + } else { +put: if(*fmt == CL('\n') && (orig == dst || *(dst - 1) != CL('\r'))) *dst++ = CL('\r'); + *dst++ = *fmt; + } + fmt++; + } +zro:*dst=0; + return dst-orig; +#undef needsescape +} + +int vsprintf(char_t *dst, const char_t *fmt, __builtin_va_list args) +{ + return vsnprintf(dst, BUFSIZ, fmt, args); +} + +int sprintf(char_t *dst, const char_t* fmt, ...) +{ + __builtin_va_list args; + __builtin_va_start(args, fmt); + return vsnprintf(dst, BUFSIZ, fmt, args); +} + +int snprintf(char_t *dst, size_t maxlen, const char_t* fmt, ...) +{ + __builtin_va_list args; + __builtin_va_start(args, fmt); + return vsnprintf(dst, maxlen, fmt, args); +} + +int vprintf(const char_t* fmt, __builtin_va_list args) +{ + int ret; + wchar_t dst[BUFSIZ]; +#if USE_UTF8 + char_t tmp[BUFSIZ]; + ret = vsnprintf(tmp, BUFSIZ, fmt, args); + mbstowcs(dst, tmp, BUFSIZ - 1); +#else + ret = vsnprintf(dst, BUFSIZ, fmt, args); +#endif + ST->ConOut->OutputString(ST->ConOut, (wchar_t *)&dst); + return ret; +} + +int printf(const char_t* fmt, ...) +{ + __builtin_va_list args; + __builtin_va_start(args, fmt); + return vprintf(fmt, args); +} + +int vfprintf (FILE *__stream, const char_t *__format, __builtin_va_list args) +{ + wchar_t dst[BUFSIZ]; + char_t tmp[BUFSIZ]; + uintn_t ret, i; +#if USE_UTF8 + ret = vsnprintf(tmp, BUFSIZ, __format, args); + ret = mbstowcs(dst, tmp, BUFSIZ - 1); +#else + ret = vsnprintf(dst, BUFSIZ, __format, args); +#endif + if(ret < 1 || __stream == stdin) return 0; + for(i = 0; i < __blk_ndevs; i++) + if(__stream == (FILE*)__blk_devs[i].bio) { + errno = EBADF; + return -1; + } + if(__stream == stdout) + ST->ConOut->OutputString(ST->ConOut, (wchar_t*)&dst); + else if(__stream == stderr) + ST->StdErr->OutputString(ST->StdErr, (wchar_t*)&dst); + else if(__ser && __stream == (FILE*)__ser) { +#if !defined(USE_UTF8) || !USE_UTF8 + wcstombs((char*)&tmp, dst, BUFSIZ - 1); +#endif + __ser->Write(__ser, &ret, (void*)&tmp); + } else +#if USE_UTF8 + __stream->Write(__stream, &ret, (void*)&tmp); +#else + __stream->Write(__stream, &ret, (void*)&dst); +#endif + return ret; +} + +int fprintf (FILE *__stream, const char_t *__format, ...) +{ + __builtin_va_list args; + __builtin_va_start(args, __format); + return vfprintf(__stream, __format, args); +} + +int getchar (void) +{ + efi_input_key_t key; + efi_status_t status = ST->ConIn->ReadKeyStroke(ST->ConIn, &key); + return EFI_ERROR(status) ? -1 : key.UnicodeChar; + +} + +int getchar_ifany (void) +{ + efi_input_key_t key; + efi_status_t status = BS->CheckEvent(ST->ConIn->WaitForKey); + if(!status) { + status = ST->ConIn->ReadKeyStroke(ST->ConIn, &key); + return EFI_ERROR(status) ? -1 : key.UnicodeChar; + } + return 0; +} + +int putchar (int __c) +{ + wchar_t tmp[2]; + tmp[0] = (wchar_t)__c; + tmp[1] = 0; + ST->ConOut->OutputString(ST->ConOut, (__c == L'\n' ? (wchar_t*)L"\r\n" : (wchar_t*)&tmp)); + return (int)tmp[0]; +} diff --git a/pcireg/uefi/stdlib.c b/pcireg/uefi/stdlib.c new file mode 100644 index 0000000..efd706d --- /dev/null +++ b/pcireg/uefi/stdlib.c @@ -0,0 +1,330 @@ +/* + * stdlib.c + * + * Copyright (C) 2021 bzt (bztsrc@gitlab) + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * This file is part of the POSIX-UEFI package. + * @brief Implementing functions which are defined in stdlib.h + * + */ + +#include + +int errno = 0; +static uint64_t __srand_seed = 6364136223846793005ULL; +extern void __stdio_cleanup(); +static uintptr_t *__stdlib_allocs = NULL; +static uintn_t __stdlib_numallocs = 0; + +int atoi(const char_t *s) +{ + return (int)atol(s); +} + +int64_t atol(const char_t *s) +{ + int64_t sign = 1; + if(!s || !*s) return 0; + if(*s == CL('-')) { sign = -1; s++; } + if(s[0] == CL('0')) { + if(s[1] == CL('x')) + return strtol(s + 2, NULL, 16) * sign; + if(s[1] >= CL('0') && s[1] <= CL('7')) + return strtol(s, NULL, 8) * sign; + } + return strtol(s, NULL, 10) * sign; +} + +int64_t strtol (const char_t *s, char_t **__endptr, int __base) +{ + int64_t v=0, sign = 1; + if(!s || !*s) return 0; + if(*s == CL('-')) { sign = -1; s++; } + while(!(*s < CL('0') || (__base < 10 && *s >= __base + CL('0')) || (__base >= 10 && ((*s > CL('9') && *s < CL('A')) || + (*s > CL('F') && *s < CL('a')) || *s > CL('f'))))) { + v *= __base; + if(*s >= CL('0') && *s <= (__base < 10 ? __base + CL('0') : CL('9'))) + v += (*s)-CL('0'); + else if(__base == 16 && *s >= CL('a') && *s <= CL('f')) + v += (*s)-CL('a')+10; + else if(__base == 16 && *s >= CL('A') && *s <= CL('F')) + v += (*s)-CL('A')+10; + s++; + }; + if(__endptr) *__endptr = (char_t*)s; + return v * sign; +} + +void *malloc (size_t __size) +{ + void *ret = NULL; + efi_status_t status; + uintn_t i; + /* this is so fucked up. UEFI firmware must keep track of allocated sizes internally, yet we must + * too, because realloc won't work otherwise... Why can't AllocatePool accept input addresses? */ + for(i = 0; i < __stdlib_numallocs && __stdlib_allocs[i] != 0; i += 2); + if(i == __stdlib_numallocs) { + status = BS->AllocatePool(LIP ? LIP->ImageDataType : EfiLoaderData, __stdlib_numallocs + 2, &ret); + if(EFI_ERROR(status) || !ret) { errno = ENOMEM; return NULL; } + if(__stdlib_allocs) memcpy(ret, __stdlib_allocs, __stdlib_numallocs * sizeof(uintptr_t)); + __stdlib_allocs = (uintptr_t*)ret; + __stdlib_allocs[i] = __stdlib_allocs[i + 1] = 0; + __stdlib_numallocs += 2; + ret = NULL; + } + status = BS->AllocatePool(LIP ? LIP->ImageDataType : EfiLoaderData, __size, &ret); + if(EFI_ERROR(status) || !ret) { errno = ENOMEM; ret = NULL; } + __stdlib_allocs[i] = (uintptr_t)ret; + __stdlib_allocs[i + 1] = (uintptr_t)__size; + return ret; +} + +void *calloc (size_t __nmemb, size_t __size) +{ + void *ret = malloc(__nmemb * __size); + if(ret) memset(ret, 0, __nmemb * __size); + return ret; +} + +void *realloc (void *__ptr, size_t __size) +{ + void *ret = NULL; + efi_status_t status; + uintn_t i; + if(!__ptr) return malloc(__size); + for(i = 0; i < __stdlib_numallocs && __stdlib_allocs[i] != (uintptr_t)__ptr; i += 2); + if(i == __stdlib_numallocs) { errno = ENOMEM; return NULL; } + status = BS->AllocatePool(LIP ? LIP->ImageDataType : EfiLoaderData, __size, &ret); + if(EFI_ERROR(status) || !ret) { errno = ENOMEM; ret = NULL; } + if(ret) { + memcpy(ret, (void*)__stdlib_allocs[i], __stdlib_allocs[i + 1] < __size ? __stdlib_allocs[i + 1] : __size); + if(__size > __stdlib_allocs[i + 1]) memset((uint8_t*)ret + __stdlib_allocs[i + 1], 0, __size - __stdlib_allocs[i + 1]); + } + BS->FreePool((void*)__stdlib_allocs[i]); + __stdlib_allocs[i] = (uintptr_t)ret; + __stdlib_allocs[i + 1] = (uintptr_t)__size; + return ret; +} + +void free (void *__ptr) +{ + efi_status_t status; + uintn_t i; + for(i = 0; i < __stdlib_numallocs && __stdlib_allocs[i] != (uintptr_t)__ptr; i += 2); + if(i == __stdlib_numallocs) { errno = ENOMEM; return; } + __stdlib_allocs[i] = 0; + __stdlib_allocs[i + 1] = 0; + for(i = 0; i < __stdlib_numallocs && __stdlib_allocs[i] == 0; i += 2); + if(i == __stdlib_numallocs) { BS->FreePool(__stdlib_allocs); __stdlib_allocs = NULL; __stdlib_numallocs = 0; } + status = BS->FreePool(__ptr); + if(EFI_ERROR(status)) errno = ENOMEM; +} + +void abort () +{ + if(__stdlib_allocs) + BS->FreePool(__stdlib_allocs); + __stdlib_numallocs = 0; + __stdio_cleanup(); + BS->Exit(IM, EFI_ABORTED, 0, NULL); +} + +void exit (int __status) +{ + if(__stdlib_allocs) + BS->FreePool(__stdlib_allocs); + __stdlib_numallocs = 0; + __stdio_cleanup(); + BS->Exit(IM, !__status ? 0 : (__status < 0 ? EFIERR(-__status) : EFIERR(__status)), 0, NULL); +} + +int exit_bs() +{ + efi_status_t status; + efi_memory_descriptor_t *memory_map = NULL; + uintn_t cnt = 3, memory_map_size=0, map_key=0, desc_size=0; + if(__stdlib_allocs) + BS->FreePool(__stdlib_allocs); + __stdlib_numallocs = 0; + __stdio_cleanup(); + while(cnt--) { + status = BS->GetMemoryMap(&memory_map_size, memory_map, &map_key, &desc_size, NULL); + if (status!=EFI_BUFFER_TOO_SMALL) break; + status = BS->ExitBootServices(IM, map_key); + if(!EFI_ERROR(status)) return 0; + } + return (int)(status & 0xffff); +} + +void *bsearch(const void *key, const void *base, size_t nmemb, size_t size, __compar_fn_t cmp) +{ + uint64_t s=0, e=nmemb, m; + int ret; + while (s < e) { + m = s + (e-s)/2; + ret = cmp(key, (uint8_t*)base + m*size); + if (ret < 0) e = m; else + if (ret > 0) s = m+1; else + return (void *)((uint8_t*)base + m*size); + } + return NULL; +} + +int mblen(const char *s, size_t n) +{ + const char *e = s+n; + int c = 0; + if(s) { + while(s < e && *s) { + if((*s & 128) != 0) { + if((*s & 32) == 0 ) s++; else + if((*s & 16) == 0 ) s+=2; else + if((*s & 8) == 0 ) s+=3; + } + c++; + s++; + } + } + return c; +} + +int mbtowc (wchar_t * __pwc, const char *s, size_t n) +{ + wchar_t arg; + int ret = 1; + if(!s || !*s) return 0; + arg = (wchar_t)*s; + if((*s & 128) != 0) { + if((*s & 32) == 0 && n > 0) { arg = ((*s & 0x1F)<<6)|(*(s+1) & 0x3F); ret = 2; } else + if((*s & 16) == 0 && n > 1) { arg = ((*s & 0xF)<<12)|((*(s+1) & 0x3F)<<6)|(*(s+2) & 0x3F); ret = 3; } else + if((*s & 8) == 0 && n > 2) { arg = ((*s & 0x7)<<18)|((*(s+1) & 0x3F)<<12)|((*(s+2) & 0x3F)<<6)|(*(s+3) & 0x3F); ret = 4; } + else return -1; + } + if(__pwc) *__pwc = arg; + return ret; +} + +int wctomb (char *s, wchar_t u) +{ + int ret = 0; + if(u<0x80) { + *s = u; + ret = 1; + } else if(u<0x800) { + *(s+0)=((u>>6)&0x1F)|0xC0; + *(s+1)=(u&0x3F)|0x80; + ret = 2; + } else { + *(s+0)=((u>>12)&0x0F)|0xE0; + *(s+1)=((u>>6)&0x3F)|0x80; + *(s+2)=(u&0x3F)|0x80; + ret = 3; + } + return ret; +} + +size_t mbstowcs (wchar_t *__pwcs, const char *__s, size_t __n) +{ + int r; + wchar_t *orig = __pwcs; + if(!__s || !*__s) return 0; + while(*__s) { + r = mbtowc(__pwcs, __s, __n - (__pwcs - orig)); + if(r < 0) return (size_t)-1; + __pwcs++; + __s += r; + } + *__pwcs = 0; + return __pwcs - orig; +} + +size_t wcstombs (char *__s, const wchar_t *__pwcs, size_t __n) +{ + int r; + char *orig = __s; + if(!__s || !__pwcs || !*__pwcs) return 0; + while(*__pwcs && (__s - orig + 4 < __n)) { + r = wctomb(__s, *__pwcs); + if(r < 0) return (size_t)-1; + __pwcs++; + __s += r; + } + *__s = 0; + return __s - orig; +} + +void srand(unsigned int __seed) +{ + __srand_seed = __seed - 1; +} + +int rand() +{ + efi_guid_t rngGuid = EFI_RNG_PROTOCOL_GUID; + efi_rng_protocol_t *rng = NULL; + efi_status_t status; + int ret = 0; + + __srand_seed = 6364136223846793005ULL*__srand_seed + 1; + status = BS->LocateProtocol(&rngGuid, NULL, (void**)&rng); + if(!EFI_ERROR(status) && rng) + rng->GetRNG(rng, NULL, (uintn_t)sizeof(int), (uint8_t*)&ret); + ret ^= (int)(__srand_seed>>33); + return ret; +} + +uint8_t *getenv(char_t *name, uintn_t *len) +{ + efi_guid_t globGuid = EFI_GLOBAL_VARIABLE; + uint8_t tmp[EFI_MAXIMUM_VARIABLE_SIZE], *ret; + uint32_t attr; + efi_status_t status; +#if USE_UTF8 + wchar_t wcname[256]; + mbstowcs((wchar_t*)&wcname, name, 256); + status = RT->GetVariable((wchar_t*)&wcname, &globGuid, &attr, len, &tmp); +#else + status = RT->GetVariable(name, &globGuid, &attr, len, &tmp); +#endif + if(EFI_ERROR(status) || *len < 1 || !(ret = malloc((*len) + 1))) { + *len = 0; + return NULL; + } + memcpy(ret, tmp, *len); + ret[*len] = 0; + return ret; +} + +int setenv(char_t *name, uintn_t len, uint8_t *data) +{ + efi_guid_t globGuid = EFI_GLOBAL_VARIABLE; + efi_status_t status; +#if USE_UTF8 + wchar_t wcname[256]; + mbstowcs((wchar_t*)&wcname, name, 256); + status = RT->SetVariable(wcname, &globGuid, 0, len, data); +#else + status = RT->SetVariable(name, &globGuid, 0, len, data); +#endif + return !EFI_ERROR(status); +} diff --git a/pcireg/uefi/string.c b/pcireg/uefi/string.c new file mode 100644 index 0000000..3286e7b --- /dev/null +++ b/pcireg/uefi/string.c @@ -0,0 +1,258 @@ +/* + * string.c + * + * Copyright (C) 2021 bzt (bztsrc@gitlab) + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * This file is part of the POSIX-UEFI package. + * @brief Implementing functions which are defined in string.h + * + */ + +#include + +void *memcpy(void *dst, const void *src, size_t n) +{ + uint8_t *a=(uint8_t*)dst,*b=(uint8_t*)src; + if(src && dst && n>0) { + while(n--) *a++ = *b++; + } + return dst; +} + +void *memmove(void *dst, const void *src, size_t n) +{ + uint8_t *a=(uint8_t*)dst,*b=(uint8_t*)src; + if(src && dst && n>0) { + if((ab) || (ba)) { + a+=n-1; b+=n-1; while(n-->0) *a--=*b--; + } else { + while(n--) *a++ = *b++; + } + } + return dst; +} + +void *memset(void *s, int c, size_t n) +{ + uint8_t *p=(uint8_t*)s; + if(s && n>0) { + while(n--) *p++ = c; + } + return s; +} + +int memcmp(const void *s1, const void *s2, size_t n) +{ + uint8_t *a=(uint8_t*)s1,*b=(uint8_t*)s2; + if(s1 && s2 && n>0) { + while(n--) { + if(*a != *b) return *a - *b; + a++; b++; + } + } + return 0; +} + +void *memchr(const void *s, int c, size_t n) +{ + uint8_t *e, *p=(uint8_t*)s; + if(s && n>0) { + for(e=p+n; p0) { + for(e=p+n; p hl) return NULL; + hl -= nl; + while(hl) { + if(!memcmp(c, needle, nl)) return c; + c++; hl--; + } + return NULL; +} + +void *memrmem(const void *haystack, size_t hl, const void *needle, size_t nl) +{ + uint8_t *c = (uint8_t*)haystack; + if(!haystack || !needle || !hl || !nl || nl > hl) return NULL; + hl -= nl; + c += hl; + while(hl) { + if(!memcmp(c, needle, nl)) return c; + c--; hl--; + } + return NULL; +} + +char_t *strcpy(char_t *dst, const char_t *src) +{ + if(src && dst) { + while(*src) {*dst++=*src++;} *dst=0; + } + return dst; +} + +char_t *strncpy(char_t *dst, const char_t *src, size_t n) +{ + const char_t *e = src+n; + if(src && dst && n>0) { + while(*src && src0) { + dst += strlen(dst); + while(*src && src0) { + do{if(*s1!=*s2){return *s1-*s2;}s1++;s2++;}while(*s1!=0 && s1 + +static struct tm __tm; + +/* from musl */ +uint64_t __year_to_secs(uint64_t year, int *is_leap) +{ + int y, cycles, centuries, leaps, rem; + + if (year-2ULL <= 136) { + y = year; + leaps = (y-68)>>2; + if (!((y-68)&3)) { + leaps--; + if (is_leap) *is_leap = 1; + } else if (is_leap) *is_leap = 0; + return 31536000*(y-70) + 86400*leaps; + } + + if (!is_leap) is_leap = &(int){0}; + cycles = (year-100) / 400; + rem = (year-100) % 400; + if (rem < 0) { + cycles--; + rem += 400; + } + if (!rem) { + *is_leap = 1; + centuries = 0; + leaps = 0; + } else { + if (rem >= 200) { + if (rem >= 300) centuries = 3, rem -= 300; + else centuries = 2, rem -= 200; + } else { + if (rem >= 100) centuries = 1, rem -= 100; + else centuries = 0; + } + if (!rem) { + *is_leap = 0; + leaps = 0; + } else { + leaps = rem / 4U; + rem %= 4U; + *is_leap = !rem; + } + } + + leaps += 97*cycles + 24*centuries - *is_leap; + + return (year-100) * 31536000LL + leaps * 86400LL + 946684800 + 86400; +} + +time_t __mktime_efi(efi_time_t *t) +{ + __tm.tm_year = t->Year + 98; + __tm.tm_mon = t->Month - 1; + __tm.tm_mday = t->Day; + __tm.tm_hour = t->Hour; + __tm.tm_min = t->Minute; + __tm.tm_sec = t->Second; + __tm.tm_isdst = t->Daylight; + return mktime(&__tm); +} + +/** + * This isn't POSIX, no arguments. Just returns the current time in struct tm + */ +struct tm *localtime (const time_t *__timer) +{ + efi_time_t t = {0}; + (void)__timer; + ST->RuntimeServices->GetTime(&t, NULL); + __mktime_efi(&t); + return &__tm; +} + +time_t mktime(const struct tm *tm) +{ + static const int secs_through_month[] = { + 0, 31*86400, 59*86400, 90*86400, + 120*86400, 151*86400, 181*86400, 212*86400, + 243*86400, 273*86400, 304*86400, 334*86400 }; + int is_leap; + uint64_t year = tm->tm_year, t; + int month = tm->tm_mon; + if (month >= 12 || month < 0) { + int adj = month / 12; + month %= 12; + if (month < 0) { + adj--; + month += 12; + } + year += adj; + } + t = __year_to_secs(year, &is_leap); + t += secs_through_month[month]; + if (is_leap && month >= 2) t += 86400; + t += 86400LL * (tm->tm_mday-1); + t += 3600LL * tm->tm_hour; + t += 60LL * tm->tm_min; + t += tm->tm_sec; + return (time_t)t; +} + +time_t time(time_t *__timer) +{ + time_t ret; + efi_time_t t = {0}; + ST->RuntimeServices->GetTime(&t, NULL); + ret = __mktime_efi(&t); + if(__timer) *__timer = ret; + return ret; +} + diff --git a/pcireg/uefi/uefi.h b/pcireg/uefi/uefi.h new file mode 100644 index 0000000..836281d --- /dev/null +++ b/pcireg/uefi/uefi.h @@ -0,0 +1,1420 @@ +/* + * uefi.h + * https://gitlab.com/bztsrc/posix-uefi + * + * Copyright (C) 2021 bzt (bztsrc@gitlab) + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * This file is part of the POSIX-UEFI package. + * @brief Main (and only) header file + * + */ + +#ifndef _UEFI_H_ +#define _UEFI_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +/* comment out this if you want to use wchar_t in your application */ +#define USE_UTF8 1 + +/* get these from the compiler */ +#ifndef _STDINT_H +#define _STDINT_H +typedef char int8_t; +typedef unsigned char uint8_t; +typedef short int16_t; +typedef unsigned short uint16_t; +typedef int int32_t; +typedef unsigned int uint32_t; +#ifndef __clang__ +typedef long int int64_t; +typedef unsigned long int uint64_t; +typedef unsigned long int uintptr_t; +#else +typedef long long int64_t; +typedef unsigned long long uint64_t; +typedef unsigned long long uintptr_t; +#endif +#endif +extern char c_assert1[sizeof(uint32_t) == 4 ? 1 : -1]; +extern char c_assert2[sizeof(uint64_t) == 8 ? 1 : -1]; +extern char c_assert3[sizeof(uintptr_t) == 8 ? 1 : -1]; + +#ifndef NULL +#define NULL ((void*)0) +#endif +/*** common defines and typedefs ***/ +typedef int64_t intn_t; +typedef uint8_t boolean_t; +typedef uint16_t wchar_t; +typedef uint64_t uintn_t; +typedef uint64_t size_t; +typedef uint64_t time_t; +typedef uint64_t mode_t; +typedef uint64_t off_t; +typedef uint64_t blkcnt_t; +typedef uint64_t efi_status_t; +typedef uint64_t efi_tpl_t; +typedef uint64_t efi_lba_t; +typedef uint64_t efi_physical_address_t; +typedef uint64_t efi_virtual_address_t; +typedef void *efi_handle_t; +typedef void *efi_event_t; +#if USE_UTF8 +typedef char char_t; +#define CL(a) a +extern char *__argvutf8; +#else +typedef wchar_t char_t; +#define CL(a) L ## a +#endif + +typedef struct { + uint32_t Data1; + uint16_t Data2; + uint16_t Data3; + uint8_t Data4[8]; +} efi_guid_t; + +typedef struct { + uint8_t Type; + uint8_t SubType; + uint8_t Length[2]; +} efi_device_path_t; + +typedef struct { + uint32_t Type; + uint32_t Pad; + efi_physical_address_t PhysicalStart; + efi_virtual_address_t VirtualStart; + uint64_t NumberOfPages; + uint64_t Attribute; +} efi_memory_descriptor_t; + +typedef struct { + uint64_t Signature; + uint32_t Revision; + uint32_t HeaderSize; + uint32_t CRC32; + uint32_t Reserved; +} efi_table_header_t; + +/*** definitions only needed when efi.h (either from EDK II or gnu-efi) is NOT included ***/ + +#ifndef EFI_SPECIFICATION_MAJOR_REVISION + +/* efibind.h */ +#ifndef __WCHAR_TYPE__ +# define __WCHAR_TYPE__ short +#endif +#define EFIERR(a) (0x8000000000000000 | a) +#define EFI_ERROR_MASK 0x8000000000000000 +#define EFIERR_OEM(a) (0xc000000000000000 | a) + +#define BAD_POINTER 0xFBFBFBFBFBFBFBFB +#define MAX_ADDRESS 0xFFFFFFFFFFFFFFFF + +#define EFI_SIGNATURE_16(A,B) ((A) | (B<<8)) +#define EFI_SIGNATURE_32(A,B,C,D) (EFI_SIGNATURE_16(A,B) | (EFI_SIGNATURE_16(C,D) << 16)) +#define EFI_SIGNATURE_64(A,B,C,D,E,F,G,H) (EFI_SIGNATURE_32(A,B,C,D) | ((uint64_t)(EFI_SIGNATURE_32(E,F,G,H)) << 32)) + +#ifndef EFIAPI +# ifdef _MSC_EXTENSIONS +# define EFIAPI __cdecl +# elif defined(HAVE_USE_MS_ABI) +# define EFIAPI __attribute__((ms_abi)) +# else +# define EFIAPI +# endif +#endif + +/* efistdarg.h */ +typedef __builtin_va_list va_list; +#define va_start(v,l) __builtin_va_start(v,l) +#define va_end(v) __builtin_va_end(v) +#define va_arg(v,l) __builtin_va_arg(v,l) +#define va_copy(d,s) __builtin_va_copy(d,s) + +/* efierr.h */ +#define EFIWARN(a) (a) +#define EFI_ERROR(a) (((intn_t) a) < 0) +#define EFI_SUCCESS 0 +#define EFI_LOAD_ERROR EFIERR(1) +#define EFI_INVALID_PARAMETER EFIERR(2) +#define EFI_UNSUPPORTED EFIERR(3) +#define EFI_BAD_BUFFER_SIZE EFIERR(4) +#define EFI_BUFFER_TOO_SMALL EFIERR(5) +#define EFI_NOT_READY EFIERR(6) +#define EFI_DEVICE_ERROR EFIERR(7) +#define EFI_WRITE_PROTECTED EFIERR(8) +#define EFI_OUT_OF_RESOURCES EFIERR(9) +#define EFI_VOLUME_CORRUPTED EFIERR(10) +#define EFI_VOLUME_FULL EFIERR(11) +#define EFI_NO_MEDIA EFIERR(12) +#define EFI_MEDIA_CHANGED EFIERR(13) +#define EFI_NOT_FOUND EFIERR(14) +#define EFI_ACCESS_DENIED EFIERR(15) +#define EFI_NO_RESPONSE EFIERR(16) +#define EFI_NO_MAPPING EFIERR(17) +#define EFI_TIMEOUT EFIERR(18) +#define EFI_NOT_STARTED EFIERR(19) +#define EFI_ALREADY_STARTED EFIERR(20) +#define EFI_ABORTED EFIERR(21) +#define EFI_ICMP_ERROR EFIERR(22) +#define EFI_TFTP_ERROR EFIERR(23) +#define EFI_PROTOCOL_ERROR EFIERR(24) +#define EFI_INCOMPATIBLE_VERSION EFIERR(25) +#define EFI_SECURITY_VIOLATION EFIERR(26) +#define EFI_CRC_ERROR EFIERR(27) +#define EFI_END_OF_MEDIA EFIERR(28) +#define EFI_END_OF_FILE EFIERR(31) +#define EFI_INVALID_LANGUAGE EFIERR(32) +#define EFI_COMPROMISED_DATA EFIERR(33) + +#define EFI_WARN_UNKOWN_GLYPH EFIWARN(1) +#define EFI_WARN_UNKNOWN_GLYPH EFIWARN(1) +#define EFI_WARN_DELETE_FAILURE EFIWARN(2) +#define EFI_WARN_WRITE_FAILURE EFIWARN(3) +#define EFI_WARN_BUFFER_TOO_SMALL EFIWARN(4) + +/* efisetjmp.h */ +#ifdef __x86_64__ +typedef struct { + uint64_t Rbx; + uint64_t Rsp; + uint64_t Rbp; + uint64_t Rdi; + uint64_t Rsi; + uint64_t R12; + uint64_t R13; + uint64_t R14; + uint64_t R15; + uint64_t Rip; + uint64_t MxCsr; + uint8_t XmmBuffer[160]; +} __attribute__((aligned(8))) jmp_buf[1]; +#endif +#ifdef __aarch64__ +typedef struct { + uint64_t X19; + uint64_t X20; + uint64_t X21; + uint64_t X22; + uint64_t X23; + uint64_t X24; + uint64_t X25; + uint64_t X26; + uint64_t X27; + uint64_t X28; + uint64_t FP; + uint64_t LR; + uint64_t IP0; + uint64_t reserved; + uint64_t D8; + uint64_t D9; + uint64_t D10; + uint64_t D11; + uint64_t D12; + uint64_t D13; + uint64_t D14; + uint64_t D15; +} __attribute__((aligned(8))) jmp_buf[1]; +#endif +extern uintn_t setjmp(jmp_buf env) __attribute__((returns_twice)); +extern void longjmp(jmp_buf env, uintn_t value) __attribute__((noreturn)); + +/* efidevp.h */ +#define EFI_DEVICE_PATH_PROTOCOL_GUID { 0x9576e91, 0x6d3f, 0x11d2, {0x8e, 0x39, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b} } +#define EFI_DP_TYPE_MASK 0x7F +#define EFI_DP_TYPE_UNPACKED 0x80 +#define END_DEVICE_PATH_TYPE 0x7f +#define END_ENTIRE_DEVICE_PATH_SUBTYPE 0xff +#define END_INSTANCE_DEVICE_PATH_SUBTYPE 0x01 +#define END_DEVICE_PATH_LENGTH (sizeof(efi_device_path_t)) +#define DP_IS_END_TYPE(a) +#define DP_IS_END_SUBTYPE(a) ( ((a)->SubType == END_ENTIRE_DEVICE_PATH_SUBTYPE ) +#define DevicePathType(a) ( ((a)->Type) & EFI_DP_TYPE_MASK ) +#define DevicePathSubType(a) ( (a)->SubType ) +#define DevicePathNodeLength(a) ( ((a)->Length[0]) | ((a)->Length[1] << 8) ) +#define NextDevicePathNode(a) ( (efi_device_path_t *) ( ((uint8_t *) (a)) + DevicePathNodeLength(a))) +#define IsDevicePathEndType(a) ( DevicePathType(a) == END_DEVICE_PATH_TYPE ) +#define IsDevicePathEndSubType(a) ( (a)->SubType == END_ENTIRE_DEVICE_PATH_SUBTYPE ) +#define IsDevicePathEnd(a) ( IsDevicePathEndType(a) && IsDevicePathEndSubType(a) ) +#define IsDevicePathUnpacked(a) ( (a)->Type & EFI_DP_TYPE_UNPACKED ) +#define SetDevicePathNodeLength(a,l) { \ + (a)->Length[0] = (uint8_t) (l); \ + (a)->Length[1] = (uint8_t) ((l) >> 8); \ + } +#define SetDevicePathEndNode(a) { \ + (a)->Type = END_DEVICE_PATH_TYPE; \ + (a)->SubType = END_ENTIRE_DEVICE_PATH_SUBTYPE; \ + (a)->Length[0] = sizeof(efi_device_path_t); \ + (a)->Length[1] = 0; \ + } + +/* efiapi.h */ +#define EFI_SPECIFICATION_MAJOR_REVISION 1 +#define EFI_SPECIFICATION_MINOR_REVISION 02 + +#define TPL_APPLICATION 4 +#define TPL_CALLBACK 8 +#define TPL_NOTIFY 16 +#define TPL_HIGH_LEVEL 31 +#define EFI_TPL_APPLICATION TPL_APPLICATION +#define EFI_TPL_CALLBACK TPL_CALLBACK +#define EFI_TPL_NOTIFY TPL_NOTIFY +#define EFI_TPL_HIGH_LEVEL TPL_HIGH_LEVEL + +#define NextMemoryDescriptor(Ptr,Size) ((efi_memory_descriptor_t *) (((uint8_t *) Ptr) + Size)) + +#define EFI_PAGE_SIZE 4096 +#define EFI_PAGE_MASK 0xFFF +#define EFI_PAGE_SHIFT 12 + +#define EFI_SIZE_TO_PAGES(a) ( ((a) >> EFI_PAGE_SHIFT) + ((a) & EFI_PAGE_MASK ? 1 : 0) ) + +#define EFI_MEMORY_UC 0x0000000000000001 +#define EFI_MEMORY_WC 0x0000000000000002 +#define EFI_MEMORY_WT 0x0000000000000004 +#define EFI_MEMORY_WB 0x0000000000000008 +#define EFI_MEMORY_UCE 0x0000000000000010 +#define EFI_MEMORY_WP 0x0000000000001000 +#define EFI_MEMORY_RP 0x0000000000002000 +#define EFI_MEMORY_XP 0x0000000000004000 +#define EFI_MEMORY_RUNTIME 0x8000000000000000 +#define EFI_MEMORY_DESCRIPTOR_VERSION 1 + +#define EVT_TIMER 0x80000000 +#define EVT_RUNTIME 0x40000000 +#define EVT_RUNTIME_CONTEXT 0x20000000 + +#define EVT_NOTIFY_WAIT 0x00000100 +#define EVT_NOTIFY_SIGNAL 0x00000200 + +#define EVT_SIGNAL_EXIT_BOOT_SERVICES 0x00000201 +#define EVT_SIGNAL_VIRTUAL_ADDRESS_CHANGE 0x60000202 + +#define EVT_EFI_SIGNAL_MASK 0x000000FF +#define EVT_EFI_SIGNAL_MAX 4 + +#define EFI_EVENT_TIMER EVT_TIMER +#define EFI_EVENT_RUNTIME EVT_RUNTIME +#define EFI_EVENT_RUNTIME_CONTEXT EVT_RUNTIME_CONTEXT +#define EFI_EVENT_NOTIFY_WAIT EVT_NOTIFY_WAIT +#define EFI_EVENT_NOTIFY_SIGNAL EVT_NOTIFY_SIGNAL +#define EFI_EVENT_SIGNAL_EXIT_BOOT_SERVICES EVT_SIGNAL_EXIT_BOOT_SERVICES +#define EFI_EVENT_SIGNAL_VIRTUAL_ADDRESS_CHANGE EVT_SIGNAL_VIRTUAL_ADDRESS_CHANGE +#define EFI_EVENT_EFI_SIGNAL_MASK EVT_EFI_SIGNAL_MASK +#define EFI_EVENT_EFI_SIGNAL_MAX EVT_EFI_SIGNAL_MAX + +#define EFI_OPEN_PROTOCOL_BY_HANDLE_PROTOCOL 0x00000001 +#define EFI_OPEN_PROTOCOL_GET_PROTOCOL 0x00000002 +#define EFI_OPEN_PROTOCOL_TEST_PROTOCOL 0x00000004 +#define EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER 0x00000008 +#define EFI_OPEN_PROTOCOL_BY_DRIVER 0x00000010 +#define EFI_OPEN_PROTOCOL_EXCLUSIVE 0x00000020 + +#define EFI_OPTIONAL_PTR 0x00000001 +#define EFI_INTERNAL_FNC 0x00000002 +#define EFI_INTERNAL_PTR 0x00000004 + +#define EFI_GLOBAL_VARIABLE { 0x8BE4DF61, 0x93CA, 0x11d2, {0xAA, 0x0D, 0x00, 0xE0, 0x98, 0x03, 0x2B, 0x8C} } +#define EFI_VARIABLE_NON_VOLATILE 0x00000001 +#define EFI_VARIABLE_BOOTSERVICE_ACCESS 0x00000002 +#define EFI_VARIABLE_RUNTIME_ACCESS 0x00000004 +#define EFI_VARIABLE_HARDWARE_ERROR_RECORD 0x00000008 +#define EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS 0x00000010 +#define EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS 0x00000020 +#define EFI_VARIABLE_APPEND_WRITE 0x00000040 +#define EFI_MAXIMUM_VARIABLE_SIZE 1024 + +#define CAPSULE_FLAGS_PERSIST_ACROSS_RESET 0x00010000 +#define CAPSULE_FLAGS_POPULATE_SYSTEM_TABLE 0x00020000 +#define CAPSULE_FLAGS_INITIATE_RESET 0x00040000 + +#define MPS_TABLE_GUID { 0xeb9d2d2f, 0x2d88, 0x11d3, {0x9a, 0x16, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d} } +#define ACPI_TABLE_GUID { 0xeb9d2d30, 0x2d88, 0x11d3, {0x9a, 0x16, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d} } +#define ACPI_20_TABLE_GUID { 0x8868e871, 0xe4f1, 0x11d3, {0xbc, 0x22, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81} } +#define SMBIOS_TABLE_GUID { 0xeb9d2d31, 0x2d88, 0x11d3, {0x9a, 0x16, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d} } +#define SMBIOS3_TABLE_GUID { 0xf2fd1544, 0x9794, 0x4a2c, {0x99, 0x2e,0xe5, 0xbb, 0xcf, 0x20, 0xe3, 0x94} } +#define SAL_SYSTEM_TABLE_GUID { 0xeb9d2d32, 0x2d88, 0x11d3, {0x9a, 0x16, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d} } + +#define EFI_RUNTIME_SERVICES_SIGNATURE 0x56524553544e5552 +#define EFI_RUNTIME_SERVICES_REVISION (EFI_SPECIFICATION_MAJOR_REVISION<<16) | (EFI_SPECIFICATION_MINOR_REVISION) + +#define EFI_BOOT_SERVICES_SIGNATURE 0x56524553544f4f42 +#define EFI_BOOT_SERVICES_REVISION (EFI_SPECIFICATION_MAJOR_REVISION<<16) | (EFI_SPECIFICATION_MINOR_REVISION) + +#define EFI_SYSTEM_TABLE_SIGNATURE 0x5453595320494249 +#define EFI_SYSTEM_TABLE_REVISION (EFI_SPECIFICATION_MAJOR_REVISION<<16) | (EFI_SPECIFICATION_MINOR_REVISION) + +/* eficon.h */ +#define EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL_GUID { 0x387477c2, 0x69c7, 0x11d2, {0x8e, 0x39, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b} } +#define EFI_BLACK 0x00 +#define EFI_BLUE 0x01 +#define EFI_GREEN 0x02 +#define EFI_CYAN (EFI_BLUE | EFI_GREEN) +#define EFI_RED 0x04 +#define EFI_MAGENTA (EFI_BLUE | EFI_RED) +#define EFI_BROWN (EFI_GREEN | EFI_RED) +#define EFI_LIGHTGRAY (EFI_BLUE | EFI_GREEN | EFI_RED) +#define EFI_BRIGHT 0x08 +#define EFI_DARKGRAY (EFI_BRIGHT) +#define EFI_LIGHTBLUE (EFI_BLUE | EFI_BRIGHT) +#define EFI_LIGHTGREEN (EFI_GREEN | EFI_BRIGHT) +#define EFI_LIGHTCYAN (EFI_CYAN | EFI_BRIGHT) +#define EFI_LIGHTRED (EFI_RED | EFI_BRIGHT) +#define EFI_LIGHTMAGENTA (EFI_MAGENTA | EFI_BRIGHT) +#define EFI_YELLOW (EFI_BROWN | EFI_BRIGHT) +#define EFI_WHITE (EFI_BLUE | EFI_GREEN | EFI_RED | EFI_BRIGHT) +#define EFI_TEXT_ATTR(f,b) ((f) | ((b) << 4)) +#define EFI_BACKGROUND_BLACK 0x00 +#define EFI_BACKGROUND_BLUE 0x10 +#define EFI_BACKGROUND_GREEN 0x20 +#define EFI_BACKGROUND_CYAN (EFI_BACKGROUND_BLUE | EFI_BACKGROUND_GREEN) +#define EFI_BACKGROUND_RED 0x40 +#define EFI_BACKGROUND_MAGENTA (EFI_BACKGROUND_BLUE | EFI_BACKGROUND_RED) +#define EFI_BACKGROUND_BROWN (EFI_BACKGROUND_GREEN | EFI_BACKGROUND_RED) +#define EFI_BACKGROUND_LIGHTGRAY (EFI_BACKGROUND_BLUE | EFI_BACKGROUND_GREEN | EFI_BACKGROUND_RED) +#define BOXDRAW_HORIZONTAL 0x2500 +#define BOXDRAW_VERTICAL 0x2502 +#define BOXDRAW_DOWN_RIGHT 0x250c +#define BOXDRAW_DOWN_LEFT 0x2510 +#define BOXDRAW_UP_RIGHT 0x2514 +#define BOXDRAW_UP_LEFT 0x2518 +#define BOXDRAW_VERTICAL_RIGHT 0x251c +#define BOXDRAW_VERTICAL_LEFT 0x2524 +#define BOXDRAW_DOWN_HORIZONTAL 0x252c +#define BOXDRAW_UP_HORIZONTAL 0x2534 +#define BOXDRAW_VERTICAL_HORIZONTAL 0x253c +#define BOXDRAW_DOUBLE_HORIZONTAL 0x2550 +#define BOXDRAW_DOUBLE_VERTICAL 0x2551 +#define BOXDRAW_DOWN_RIGHT_DOUBLE 0x2552 +#define BOXDRAW_DOWN_DOUBLE_RIGHT 0x2553 +#define BOXDRAW_DOUBLE_DOWN_RIGHT 0x2554 +#define BOXDRAW_DOWN_LEFT_DOUBLE 0x2555 +#define BOXDRAW_DOWN_DOUBLE_LEFT 0x2556 +#define BOXDRAW_DOUBLE_DOWN_LEFT 0x2557 +#define BOXDRAW_UP_RIGHT_DOUBLE 0x2558 +#define BOXDRAW_UP_DOUBLE_RIGHT 0x2559 +#define BOXDRAW_DOUBLE_UP_RIGHT 0x255a +#define BOXDRAW_UP_LEFT_DOUBLE 0x255b +#define BOXDRAW_UP_DOUBLE_LEFT 0x255c +#define BOXDRAW_DOUBLE_UP_LEFT 0x255d +#define BOXDRAW_VERTICAL_RIGHT_DOUBLE 0x255e +#define BOXDRAW_VERTICAL_DOUBLE_RIGHT 0x255f +#define BOXDRAW_DOUBLE_VERTICAL_RIGHT 0x2560 +#define BOXDRAW_VERTICAL_LEFT_DOUBLE 0x2561 +#define BOXDRAW_VERTICAL_DOUBLE_LEFT 0x2562 +#define BOXDRAW_DOUBLE_VERTICAL_LEFT 0x2563 +#define BOXDRAW_DOWN_HORIZONTAL_DOUBLE 0x2564 +#define BOXDRAW_DOWN_DOUBLE_HORIZONTAL 0x2565 +#define BOXDRAW_DOUBLE_DOWN_HORIZONTAL 0x2566 +#define BOXDRAW_UP_HORIZONTAL_DOUBLE 0x2567 +#define BOXDRAW_UP_DOUBLE_HORIZONTAL 0x2568 +#define BOXDRAW_DOUBLE_UP_HORIZONTAL 0x2569 +#define BOXDRAW_VERTICAL_HORIZONTAL_DOUBLE 0x256a +#define BOXDRAW_VERTICAL_DOUBLE_HORIZONTAL 0x256b +#define BOXDRAW_DOUBLE_VERTICAL_HORIZONTAL 0x256c +#define BLOCKELEMENT_FULL_BLOCK 0x2588 +#define BLOCKELEMENT_LIGHT_SHADE 0x2591 +#define GEOMETRICSHAPE_UP_TRIANGLE 0x25b2 +#define GEOMETRICSHAPE_RIGHT_TRIANGLE 0x25ba +#define GEOMETRICSHAPE_DOWN_TRIANGLE 0x25bc +#define GEOMETRICSHAPE_LEFT_TRIANGLE 0x25c4 +#define ARROW_UP 0x2191 +#define ARROW_DOWN 0x2193 + +#define EFI_SIMPLE_TEXT_INPUT_PROTOCOL_GUID { 0x387477c1, 0x69c7, 0x11d2, {0x8e, 0x39, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b} } +#define CHAR_NULL 0x0000 +#define CHAR_BACKSPACE 0x0008 +#define CHAR_TAB 0x0009 +#define CHAR_LINEFEED 0x000A +#define CHAR_CARRIAGE_RETURN 0x000D +#define SCAN_NULL 0x0000 +#define SCAN_UP 0x0001 +#define SCAN_DOWN 0x0002 +#define SCAN_RIGHT 0x0003 +#define SCAN_LEFT 0x0004 +#define SCAN_HOME 0x0005 +#define SCAN_END 0x0006 +#define SCAN_INSERT 0x0007 +#define SCAN_DELETE 0x0008 +#define SCAN_PAGE_UP 0x0009 +#define SCAN_PAGE_DOWN 0x000A +#define SCAN_F1 0x000B +#define SCAN_F2 0x000C +#define SCAN_F3 0x000D +#define SCAN_F4 0x000E +#define SCAN_F5 0x000F +#define SCAN_F6 0x0010 +#define SCAN_F7 0x0011 +#define SCAN_F8 0x0012 +#define SCAN_F9 0x0013 +#define SCAN_F10 0x0014 +#define SCAN_F11 0x0015 +#define SCAN_F12 0x0016 +#define SCAN_ESC 0x0017 + +/* efigpt.h */ +#define PRIMARY_PART_HEADER_LBA 1 +#define EFI_PTAB_HEADER_ID "EFI PART" +#define EFI_PART_USED_BY_EFI 0x0000000000000001 +#define EFI_PART_REQUIRED_TO_FUNCTION 0x0000000000000002 +#define EFI_PART_USED_BY_OS 0x0000000000000004 +#define EFI_PART_REQUIRED_BY_OS 0x0000000000000008 +#define EFI_PART_BACKUP_REQUIRED 0x0000000000000010 +#define EFI_PART_USER_DATA 0x0000000000000020 +#define EFI_PART_CRITICAL_USER_DATA 0x0000000000000040 +#define EFI_PART_REDUNDANT_PARTITION 0x0000000000000080 +#define EFI_PART_TYPE_UNUSED_GUID { 0x00000000, 0x0000, 0x0000, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } +#define EFI_PART_TYPE_EFI_SYSTEM_PART_GUID { 0xc12a7328, 0xf81f, 0x11d2, {0xba, 0x4b, 0x00, 0xa0, 0xc9, 0x3e, 0xc9, 0x3b} } +#define EFI_PART_TYPE_LEGACY_MBR_GUID { 0x024dee41, 0x33e7, 0x11d3, {0x9d, 0x69, 0x00, 0x08, 0xc7, 0x81, 0xf3, 0x9f} } + +/* Protocol GUIDs */ +#ifndef INTERNAL_SHELL_GUID +#define INTERNAL_SHELL_GUID { 0xd65a6b8c, 0x71e5, 0x4df0, {0xa9, 0x09, 0xf0, 0xd2, 0x99, 0x2b, 0x5a, 0xa9} } +#endif + +typedef enum { + AllocateAnyPages, + AllocateMaxAddress, + AllocateAddress, + MaxAllocateType +} efi_allocate_type_t; + +typedef enum { + EfiReservedMemoryType, + EfiLoaderCode, + EfiLoaderData, + EfiBootServicesCode, + EfiBootServicesData, + EfiRuntimeServicesCode, + EfiRuntimeServicesData, + EfiConventionalMemory, + EfiUnusableMemory, + EfiACPIReclaimMemory, + EfiACPIMemoryNVS, + EfiMemoryMappedIO, + EfiMemoryMappedIOPortSpace, + EfiPalCode, + EfiMaxMemoryType +} efi_memory_type_t; + +typedef enum { + TimerCancel, + TimerPeriodic, + TimerRelative, + TimerTypeMax +} efi_timer_delay_t; + +typedef enum { + AllHandles, + ByRegisterNotify, + ByProtocol +} efi_locate_search_type_t; + +typedef enum { + EfiResetCold, + EfiResetWarm, + EfiResetShutdown +} efi_reset_type_t; + +#else + +#define efi_allocate_type_t EFI_ALLOCATE_TYPE +#define efi_memory_type_t EFI_MEMORY_TYPE +#define efi_timer_delay_t EFI_TIMER_DELAY +#define efi_locate_search_type_t EFI_LOCATE_SEARCH_TYPE +#define efi_reset_type_t EFI_RESET_TYPE + +#endif + +/*** standard input, output and error streams via ConIn, ConOut and StdErr ***/ +typedef struct { + uint16_t ScanCode; + wchar_t UnicodeChar; +} efi_input_key_t; + +typedef efi_status_t (EFIAPI *efi_input_reset_t)(void *This, boolean_t ExtendedVerification); +typedef efi_status_t (EFIAPI *efi_input_read_key_t)(void *This, efi_input_key_t *Key); + +typedef struct { + efi_input_reset_t Reset; + efi_input_read_key_t ReadKeyStroke; + efi_event_t WaitForKey; +} simple_input_interface_t; + +typedef efi_status_t (EFIAPI *efi_text_reset_t)(void *This, boolean_t ExtendedVerification); +typedef efi_status_t (EFIAPI *efi_text_output_string_t)(void *This, wchar_t *String); +typedef efi_status_t (EFIAPI *efi_text_test_string_t)(void *This, wchar_t *String); +typedef efi_status_t (EFIAPI *efi_text_query_mode_t)(void *This, uintn_t ModeNumber, uintn_t *Column, uintn_t *Row); +typedef efi_status_t (EFIAPI *efi_text_set_mode_t)(void *This, uintn_t ModeNumber); +typedef efi_status_t (EFIAPI *efi_text_set_attribute_t)(void *This, uintn_t Attribute); +typedef efi_status_t (EFIAPI *efi_text_clear_screen_t)(void *This); +typedef efi_status_t (EFIAPI *efi_text_set_cursor_t)(void *This, uintn_t Column, uintn_t Row); +typedef efi_status_t (EFIAPI *efi_text_enable_cursor_t)(void *This, boolean_t Enable); + +typedef struct { + int32_t MaxMode; + int32_t Mode; + int32_t Attribute; + int32_t CursorColumn; + int32_t CursorRow; + boolean_t CursorVisible; +} simple_text_output_mode_t; + +typedef struct { + efi_text_reset_t Reset; + efi_text_output_string_t OutputString; + efi_text_test_string_t TestString; + efi_text_query_mode_t QueryMode; + efi_text_set_mode_t SetMode; + efi_text_set_attribute_t SetAttribute; + efi_text_clear_screen_t ClearScreen; + efi_text_set_cursor_t SetCursorPosition; + efi_text_enable_cursor_t EnableCursor; + simple_text_output_mode_t *Mode; +} simple_text_output_interface_t; + +/*** Runtime Services ***/ +typedef struct { + uint16_t Year; /* 1998 - 2XXX */ + uint8_t Month; /* 1 - 12 */ + uint8_t Day; /* 1 - 31 */ + uint8_t Hour; /* 0 - 23 */ + uint8_t Minute; /* 0 - 59 */ + uint8_t Second; /* 0 - 59 */ + uint8_t Pad1; + uint32_t Nanosecond; /* 0 - 999,999,999 */ + int16_t TimeZone; /* -1440 to 1440 or 2047 */ + uint8_t Daylight; + uint8_t Pad2; +} efi_time_t; + +typedef struct { + uint32_t Resolution; + uint32_t Accuracy; + boolean_t SetsToZero; +} efi_time_capabilities_t; + +typedef struct { + efi_guid_t CapsuleGuid; + uint32_t HeaderSize; + uint32_t Flags; + uint32_t CapsuleImageSize; +} efi_capsule_header_t; + +#ifndef DataBlock +#define DataBlock ContinuationPointer +#endif +typedef struct { + uint64_t Length; + efi_physical_address_t ContinuationPointer; +} efi_capsule_block_descriptor_t; + +typedef efi_status_t (EFIAPI *efi_get_time_t)(efi_time_t *Time, efi_time_capabilities_t *Capabilities); +typedef efi_status_t (EFIAPI *efi_set_time_t)(efi_time_t *Time); +typedef efi_status_t (EFIAPI *efi_get_wakeup_time_t)(boolean_t *Enable, boolean_t *Pending, efi_time_t *Time); +typedef efi_status_t (EFIAPI *efi_set_wakeup_time_t)(boolean_t Enable, efi_time_t *Time); +typedef efi_status_t (EFIAPI *efi_set_virtual_address_map_t)(uintn_t MemoryMapSize, uintn_t DescriptorSize, + uint32_t DescriptorVersion, efi_memory_descriptor_t *VirtualMap); +typedef efi_status_t (EFIAPI *efi_convert_pointer_t)(uintn_t DebugDisposition, void **Address); +typedef efi_status_t (EFIAPI *efi_get_variable_t)(wchar_t *VariableName, efi_guid_t *VendorGuid, uint32_t *Attributes, + uintn_t *DataSize, void *Data); +typedef efi_status_t (EFIAPI *efi_get_next_variable_name_t)(uintn_t *VariableNameSize, wchar_t *VariableName, + efi_guid_t *VendorGuid); +typedef efi_status_t (EFIAPI *efi_set_variable_t)(wchar_t *VariableName, efi_guid_t *VendorGuid, uint32_t Attributes, + uintn_t DataSize, void *Data); +typedef efi_status_t (EFIAPI *efi_get_next_high_mono_t)(uint64_t *Count); +typedef efi_status_t (EFIAPI *efi_reset_system_t)(efi_reset_type_t ResetType, efi_status_t ResetStatus, uintn_t DataSize, + wchar_t *ResetData); +typedef efi_status_t (EFIAPI *efi_update_capsule_t)(efi_capsule_header_t **CapsuleHeaderArray, uintn_t CapsuleCount, + efi_physical_address_t ScatterGatherList); +typedef efi_status_t (EFIAPI *efi_query_capsule_capabilities_t)(efi_capsule_header_t **CapsuleHeaderArray, uintn_t CapsuleCount, + uint64_t *MaximumCapsuleSize, efi_reset_type_t *ResetType); +typedef efi_status_t (EFIAPI *efi_query_variable_info_t)(uint32_t Attributes, uint64_t *MaximumVariableStorageSize, + uint64_t *RemainingVariableStorageSize, uint64_t *MaximumVariableSize); + +typedef struct { + efi_table_header_t Hdr; + + efi_get_time_t GetTime; + efi_set_time_t SetTime; + efi_get_wakeup_time_t GetWakeupTime; + efi_set_wakeup_time_t SetWakeupTime; + + efi_set_virtual_address_map_t SetVirtualAddressMap; + efi_convert_pointer_t ConvertPointer; + + efi_get_variable_t GetVariable; + efi_get_next_variable_name_t GetNextVariableName; + efi_set_variable_t SetVariable; + + efi_get_next_high_mono_t GetNextHighMonotonicCount; + efi_reset_system_t ResetSystem; + + efi_update_capsule_t UpdateCapsule; + efi_query_capsule_capabilities_t QueryCapsuleCapabilities; + efi_query_variable_info_t QueryVariableInfo; +} efi_runtime_services_t; +extern efi_runtime_services_t *RT; +#define gRT RT + +/** Boot Services ***/ +typedef struct { + efi_handle_t AgentHandle; + efi_handle_t ControllerHandle; + uint32_t Attributes; + uint32_t OpenCount; +} efi_open_protocol_information_entry_t; + +typedef efi_tpl_t (EFIAPI *efi_raise_tpl_t)(efi_tpl_t NewTpl); +typedef efi_tpl_t (EFIAPI *efi_restore_tpl_t)(efi_tpl_t OldTpl); +typedef efi_status_t (EFIAPI *efi_allocate_pages_t)(efi_allocate_type_t Type, efi_memory_type_t MemoryType, + uintn_t NoPages, efi_physical_address_t *Memory); +typedef efi_status_t (EFIAPI *efi_free_pages_t)(efi_physical_address_t Memory, uintn_t NoPages); +typedef efi_status_t (EFIAPI *efi_get_memory_map_t)(uintn_t *MemoryMapSize, efi_memory_descriptor_t *MemoryMap, + uintn_t *MapKey, uintn_t *DescriptorSize, uint32_t *DescriptorVersion); +typedef efi_status_t (EFIAPI *efi_allocate_pool_t)(efi_memory_type_t PoolType, uintn_t Size, void **Buffer); +typedef efi_status_t (EFIAPI *efi_free_pool_t)(void *Buffer); +typedef void (EFIAPI *efi_event_notify_t)(efi_event_t Event, void *Context); +typedef efi_status_t (EFIAPI *efi_create_event_t)(uint32_t Type, efi_tpl_t NotifyTpl, efi_event_notify_t NotifyFunction, + void *NextContext, efi_event_t *Event); +typedef efi_status_t (EFIAPI *efi_set_timer_t)(efi_event_t Event, efi_timer_delay_t Type, uint64_t TriggerTime); +typedef efi_status_t (EFIAPI *efi_wait_for_event_t)(uintn_t NumberOfEvents, efi_event_t *Event, uintn_t Index); +typedef efi_status_t (EFIAPI *efi_signal_event_t)(efi_event_t Event); +typedef efi_status_t (EFIAPI *efi_close_event_t)(efi_event_t Event); +typedef efi_status_t (EFIAPI *efi_check_event_t)(efi_event_t Event); +typedef efi_status_t (EFIAPI *efi_handle_protocol_t)(efi_handle_t Handle, efi_guid_t *Protocol, void **Interface); +typedef efi_status_t (EFIAPI *efi_register_protocol_notify_t)(efi_guid_t *Protocol, efi_event_t Event, void **Registration); +typedef efi_status_t (EFIAPI *efi_locate_handle_t)(efi_locate_search_type_t SearchType, efi_guid_t *Protocol, + void *SearchKey, uintn_t BufferSize, efi_handle_t *Buffer); +typedef efi_status_t (EFIAPI *efi_locate_device_path_t)(efi_guid_t *Protocol, efi_device_path_t **DevicePath, + efi_handle_t *Device); +typedef efi_status_t (EFIAPI *efi_install_configuration_table_t)(efi_guid_t *Guid, void *Table); +typedef efi_status_t (EFIAPI *efi_image_load_t)(boolean_t BootPolicy, efi_handle_t ParentImageHandle, efi_device_path_t *FilePath, + void *SourceBuffer, uintn_t SourceSie, efi_handle_t *ImageHandle); +typedef efi_status_t (EFIAPI *efi_image_start_t)(efi_handle_t ImageHandle, uintn_t *ExitDataSize, wchar_t **ExitData); +typedef efi_status_t (EFIAPI *efi_exit_t)(efi_handle_t ImageHandle, efi_status_t ExitStatus, uintn_t ExitDataSize, + wchar_t *ExitData); +typedef efi_status_t (EFIAPI *efi_exit_boot_services_t)(efi_handle_t ImageHandle, uintn_t MapKey); +typedef efi_status_t (EFIAPI *efi_get_next_monotonic_t)(uint64_t *Count); +typedef efi_status_t (EFIAPI *efi_stall_t)(uintn_t Microseconds); +typedef efi_status_t (EFIAPI *efi_set_watchdog_timer_t)(uintn_t Timeout, uint64_t WatchdogCode, uintn_t DataSize, + wchar_t *WatchdogData); +typedef efi_status_t (EFIAPI *efi_connect_controller_t)(efi_handle_t ControllerHandle, efi_handle_t *DriverImageHandle, + efi_device_path_t *RemainingDevicePath, boolean_t Recursive); +typedef efi_status_t (EFIAPI *efi_disconnect_controller_t)(efi_handle_t ControllerHandle, efi_handle_t DriverImageHandle, + efi_handle_t ChildHandle); +typedef efi_status_t (EFIAPI *efi_open_protocol_t)(efi_handle_t Handle, efi_guid_t *Protocol, void **Interface, + efi_handle_t AgentHandle, efi_handle_t ControllerHandle, uint32_t Attributes); +typedef efi_status_t (EFIAPI *efi_close_protocol_t)(efi_handle_t Handle, efi_guid_t *Protocol, efi_handle_t AgentHandle, + efi_handle_t ControllerHandle); +typedef efi_status_t (EFIAPI *efi_open_protocol_information_t)(efi_handle_t Handle, efi_guid_t *Protocol, + efi_open_protocol_information_entry_t**EntryBuffer, uintn_t *EntryCount); +typedef efi_status_t (EFIAPI *efi_protocols_per_handle_t)(efi_handle_t Handle, efi_guid_t ***ProtocolBuffer, + uintn_t *ProtocolBufferCount); +typedef efi_status_t (EFIAPI *efi_locate_handle_buffer_t)(efi_locate_search_type_t SearchType, efi_guid_t *Protocol, + void *SearchKey, uintn_t NoHandles, efi_handle_t **Handles); +typedef efi_status_t (EFIAPI *efi_locate_protocol_t)(efi_guid_t *Protocol, void *Registration, void **Interface); +typedef efi_status_t (EFIAPI *efi_calculate_crc32_t)(void *Data, uintn_t DataSize, uint32_t *Crc32); + +typedef struct { + efi_table_header_t Hdr; + + efi_raise_tpl_t RaiseTPL; + efi_restore_tpl_t RestoreTPL; + + efi_allocate_pages_t AllocatePages; + efi_free_pages_t FreePages; + efi_get_memory_map_t GetMemoryMap; + efi_allocate_pool_t AllocatePool; + efi_free_pool_t FreePool; + + efi_create_event_t CreateEvent; + efi_set_timer_t SetTimer; + efi_wait_for_event_t WaitForEvent; + efi_signal_event_t SignalEvent; + efi_close_event_t CloseEvent; + efi_check_event_t CheckEvent; + + void* InstallProtocolInterface; /* not defined yet */ + void* ReinstallProtocolInterface; + void* UninstallProtocolInterface; + efi_handle_protocol_t HandleProtocol; + efi_handle_protocol_t PCHandleProtocol; + efi_register_protocol_notify_t RegisterProtocolNotify; + efi_locate_handle_t LocateHandle; + efi_locate_device_path_t LocateDevicePath; + efi_install_configuration_table_t InstallConfigurationTable; + + efi_image_load_t LoadImage; + efi_image_start_t StartImage; + efi_exit_t Exit; + void* UnloadImage; /* not defined in gnu-efi either */ + efi_exit_boot_services_t ExitBootServices; + + efi_get_next_monotonic_t GetNextHighMonotonicCount; + efi_stall_t Stall; + efi_set_watchdog_timer_t SetWatchdogTimer; + + efi_connect_controller_t ConnectController; + efi_disconnect_controller_t DisconnectController; + + efi_open_protocol_t OpenProtocol; + efi_close_protocol_t CloseProtocol; + efi_open_protocol_information_t OpenProtocolInformation; + + efi_protocols_per_handle_t ProtocolsPerHandle; + efi_locate_handle_buffer_t LocateHandleBuffer; + efi_locate_protocol_t LocateProtocol; + void* InstallMultipleProtocolInterfaces; + void* UninstallMultipleProtocolInterfaces; + + efi_calculate_crc32_t CalculateCrc32; +} efi_boot_services_t; +extern efi_boot_services_t *BS; +#define gBS BS + +/*** Loaded Image Protocol ***/ +#ifndef EFI_LOADED_IMAGE_PROTOCOL_GUID +#define EFI_LOADED_IMAGE_PROTOCOL_GUID { 0x5B1B31A1, 0x9562, 0x11d2, {0x8E, 0x3F, 0x00, 0xA0, 0xC9, 0x69, 0x72, 0x3B} } +#define LOADED_IMAGE_PROTOCOL EFI_LOADED_IMAGE_PROTOCOL_GUID + +#define EFI_LOADED_IMAGE_PROTOCOL_REVISION 0x1000 +#define EFI_IMAGE_INFORMATION_REVISION EFI_LOADED_IMAGE_PROTOCOL_REVISION +#endif + +typedef struct { + uint32_t Revision; + efi_handle_t ParentHandle; + void *SystemTable; + efi_handle_t DeviceHandle; + efi_device_path_t *FilePath; + void *Reserved; + uint32_t LoadOptionsSize; + void *LoadOptions; + void *ImageBase; + uint64_t ImageSize; + efi_memory_type_t ImageCodeType; + efi_memory_type_t ImageDataType; +} efi_loaded_image_protocol_t; +extern efi_loaded_image_protocol_t *LIP; +extern efi_handle_t IM; + +/*** System Table ***/ +typedef struct { + efi_guid_t VendorGuid; + void *VendorTable; +} efi_configuration_table_t; + +typedef struct { + efi_table_header_t Hdr; + + wchar_t *FirmwareVendor; + uint32_t FirmwareRevision; + + efi_handle_t ConsoleInHandle; + simple_input_interface_t *ConIn; + + efi_handle_t ConsoleOutHandle; + simple_text_output_interface_t *ConOut; + + efi_handle_t ConsoleErrorHandle; + simple_text_output_interface_t *StdErr; + + efi_runtime_services_t *RuntimeServices; + efi_boot_services_t *BootServices; + + uintn_t NumberOfTableEntries; + efi_configuration_table_t *ConfigurationTable; +} efi_system_table_t; +extern efi_system_table_t *ST; +#define gST ST + +/*** Simple File System Protocol ***/ +#ifndef EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_GUID +#define EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_GUID { 0x964e5b22, 0x6459, 0x11d2, {0x8e, 0x39, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b} } + +#define EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_REVISION 0x00010000 +#define EFI_FILE_IO_INTERFACE_REVISION EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_REVISION + +#define EFI_FILE_MODE_READ 0x0000000000000001 +#define EFI_FILE_MODE_WRITE 0x0000000000000002 +#define EFI_FILE_MODE_CREATE 0x8000000000000000 + +#define EFI_FILE_READ_ONLY 0x0000000000000001 +#define EFI_FILE_HIDDEN 0x0000000000000002 +#define EFI_FILE_SYSTEM 0x0000000000000004 +#define EFI_FILE_RESERVED 0x0000000000000008 +#define EFI_FILE_DIRECTORY 0x0000000000000010 +#define EFI_FILE_ARCHIVE 0x0000000000000020 +#define EFI_FILE_VALID_ATTR 0x0000000000000037 + +#define EFI_FILE_PROTOCOL_REVISION 0x00010000 +#define EFI_FILE_HANDLE_REVISION EFI_FILE_PROTOCOL_REVISION +#endif + +#ifndef EFI_FILE_INFO_GUID +#define EFI_FILE_INFO_GUID { 0x9576e92, 0x6d3f, 0x11d2, {0x8e, 0x39, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b} } +#endif + +#ifndef FILENAME_MAX +#define FILENAME_MAX 262 /* from FAT spec */ +#endif + +typedef struct { + uint64_t Size; + uint64_t FileSize; + uint64_t PhysicalSize; + efi_time_t CreateTime; + efi_time_t LastAccessTime; + efi_time_t ModificationTime; + uint64_t Attribute; + wchar_t FileName[FILENAME_MAX]; +} efi_file_info_t; + +typedef struct efi_file_handle_s efi_file_handle_t; + +typedef efi_status_t (EFIAPI *efi_volume_open_t)(void *This, efi_file_handle_t **Root); +typedef struct { + uint64_t Revision; + efi_volume_open_t OpenVolume; +} efi_simple_file_system_protocol_t; + +typedef efi_status_t (EFIAPI *efi_file_open_t)(efi_file_handle_t *File, efi_file_handle_t **NewHandle, wchar_t *FileName, + uint64_t OpenMode, uint64_t Attributes); +typedef efi_status_t (EFIAPI *efi_file_close_t)(efi_file_handle_t *File); +typedef efi_status_t (EFIAPI *efi_file_delete_t)(efi_file_handle_t *File); +typedef efi_status_t (EFIAPI *efi_file_read_t)(efi_file_handle_t *File, uintn_t *BufferSize, void *Buffer); +typedef efi_status_t (EFIAPI *efi_file_write_t)(efi_file_handle_t *File, uintn_t *BufferSize, void *Buffer); +typedef efi_status_t (EFIAPI *efi_file_get_pos_t)(efi_file_handle_t *File, uint64_t *Position); +typedef efi_status_t (EFIAPI *efi_file_set_pos_t)(efi_file_handle_t *File, uint64_t Position); +typedef efi_status_t (EFIAPI *efi_file_get_info_t)(efi_file_handle_t *File, efi_guid_t *InformationType, uintn_t *BufferSize, + void *Buffer); +typedef efi_status_t (EFIAPI *efi_file_set_info_t)(efi_file_handle_t *File, efi_guid_t *InformationType, uintn_t BufferSize, + void *Buffer); +typedef efi_status_t (EFIAPI *efi_file_flush_t)(efi_file_handle_t *File); + +struct efi_file_handle_s { + uint64_t Revision; + efi_file_open_t Open; + efi_file_close_t Close; + efi_file_delete_t Delete; + efi_file_read_t Read; + efi_file_write_t Write; + efi_file_get_pos_t GetPosition; + efi_file_set_pos_t SetPosition; + efi_file_get_info_t GetInfo; + efi_file_set_info_t SetInfo; + efi_file_flush_t Flush; +}; + +/*** Shell Parameter Protocols ***/ +#ifndef EFI_SHELL_PARAMETERS_PROTOCOL_GUID +#define EFI_SHELL_PARAMETERS_PROTOCOL_GUID { 0x752f3136, 0x4e16, 0x4fdc, {0xa2, 0x2a, 0xe5, 0xf4, 0x68, 0x12, 0xf4, 0xca} } +#endif + +typedef struct { + wchar_t **Argv; + uintn_t Argc; + efi_handle_t StdIn; + efi_handle_t StdOut; + efi_handle_t StdErr; +} efi_shell_parameters_protocol_t; + +#ifndef SHELL_INTERFACE_PROTOCOL_GUID +#define SHELL_INTERFACE_PROTOCOL_GUID { 0x47c7b223, 0xc42a, 0x11d2, {0x8e, 0x57, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b} } +#endif + +typedef struct { + efi_handle_t ImageHandle; + void* *Info; + wchar_t **Argv; + uintn_t Argc; + wchar_t **RedirArgv; + uintn_t RedirArgc; + efi_handle_t StdIn; + efi_handle_t StdOut; + efi_handle_t StdErr; +} efi_shell_interface_protocol_t; + +/*** Random Number Generator ***/ +#ifndef EFI_RNG_PROTOCOL_GUID +#define EFI_RNG_PROTOCOL_GUID { 0x3152bca5, 0xeade, 0x433d, {0x86, 0x2e, 0xc0, 0x1c, 0xdc, 0x29, 0x1f, 0x44} } +#endif + +typedef efi_status_t (EFIAPI *efi_rng_get_info_t)(void *This, uintn_t *RNGAlgorithmListSize, efi_guid_t *RNGAlgorithmList); +typedef efi_status_t (EFIAPI *efi_rng_get_rng_t)(void *This, efi_guid_t *RNGAlgorithm, uintn_t RNGValueLength, uint8_t *RNGValue); + +typedef struct { + efi_rng_get_info_t GetInfo; + efi_rng_get_rng_t GetRNG; +} efi_rng_protocol_t; + +/*** Serial IO Protocol ***/ +#ifndef EFI_SERIAL_IO_PROTOCOL_GUID +#define EFI_SERIAL_IO_PROTOCOL_GUID { 0xBB25CF6F, 0xF1D4, 0x11D2, {0x9A, 0x0C, 0x00, 0x90, 0x27, 0x3F, 0xC1, 0xFD} } + +#define SERIAL_IO_INTERFACE_REVISION 0x00010000 +#define EFI_SERIAL_CLEAR_TO_SEND 0x0010 +#define EFI_SERIAL_DATA_SET_READY 0x0020 +#define EFI_SERIAL_RING_INDICATE 0x0040 +#define EFI_SERIAL_CARRIER_DETECT 0x0080 +#define EFI_SERIAL_REQUEST_TO_SEND 0x0002 +#define EFI_SERIAL_DATA_TERMINAL_READY 0x0001 +#define EFI_SERIAL_INPUT_BUFFER_EMPTY 0x0100 +#define EFI_SERIAL_OUTPUT_BUFFER_EMPTY 0x0200 +#define EFI_SERIAL_HARDWARE_LOOPBACK_ENABLE 0x1000 +#define EFI_SERIAL_SOFTWARE_LOOPBACK_ENABLE 0x2000 +#define EFI_SERIAL_HARDWARE_FLOW_CONTROL_ENABLE 0x4000 + +typedef enum { + DefaultParity, + NoParity, + EvenParity, + OddParity, + MarkParity, + SpaceParity +} efi_parity_type_t; + +typedef enum { + DefaultStopBits, + OneStopBit, + OneFiveStopBits, + TwoStopBits +} efi_stop_bits_type_t; + +#else + +#define efi_parity_type_t EFI_PARITY_TYPE +#define efi_stop_bits_type_t EFI_STOP_BITS_TYPE + +#endif + +typedef struct { + uint32_t ControlMask; + uint32_t Timeout; + uint64_t BaudRate; + uint32_t ReceiveFifoDepth; + uint32_t DataBits; + uint32_t Parity; + uint32_t StopBits; +} efi_serial_io_mode_t; + +typedef efi_status_t (EFIAPI *efi_serial_reset_t)(void *This); +typedef efi_status_t (EFIAPI *efi_serial_set_attributes_t)(void *This, uint64_t BaudRate, uint32_t ReceiveFifoDepth, + uint32_t Timeout, efi_parity_type_t Parity, uint8_t DataBits, efi_stop_bits_type_t StopBits); +typedef efi_status_t (EFIAPI *efi_serial_set_control_bits_t)(void *This, uint32_t Control); +typedef efi_status_t (EFIAPI *efi_serial_get_control_bits_t)(void *This, uint32_t *Control); +typedef efi_status_t (EFIAPI *efi_serial_write_t)(void *This, uintn_t *BufferSize, void *Buffer); +typedef efi_status_t (EFIAPI *efi_serial_read_t)(void *This, uintn_t *BufferSize, void *Buffer); + +typedef struct { + uint32_t Revision; + efi_serial_reset_t Reset; + efi_serial_set_attributes_t SetAttributes; + efi_serial_set_control_bits_t SetControl; + efi_serial_get_control_bits_t GetControl; + efi_serial_write_t Write; + efi_serial_read_t Read; + efi_serial_io_mode_t *Mode; +} efi_serial_io_protocol_t; + +/*** Block IO Protocol ***/ +#ifndef EFI_BLOCK_IO_PROTOCOL_GUID +#define EFI_BLOCK_IO_PROTOCOL_GUID { 0x964e5b21, 0x6459, 0x11d2, {0x8e, 0x39, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b} } + +#define EFI_BLOCK_IO_PROTOCOL_REVISION 0x00010000 +#define EFI_BLOCK_IO_INTERFACE_REVISION EFI_BLOCK_IO_PROTOCOL_REVISION + +#endif + +typedef struct { + uint32_t MediaId; + boolean_t RemovableMedia; + boolean_t MediaPresent; + boolean_t LogicalPartition; + boolean_t ReadOnly; + boolean_t WriteCaching; + uint32_t BlockSize; + uint32_t IoAlign; + efi_lba_t LastBlock; +} efi_block_io_media_t; + +typedef efi_status_t (EFIAPI *efi_block_reset_t)(void *This, boolean_t ExtendedVerification); +typedef efi_status_t (EFIAPI *efi_block_read_t)(void *This, uint32_t MediaId, efi_lba_t LBA, uintn_t BufferSize, void *Buffer); +typedef efi_status_t (EFIAPI *efi_block_write_t)(void *This, uint32_t MediaId, efi_lba_t LBA, uintn_t BufferSize, void *Buffer); +typedef efi_status_t (EFIAPI *efi_block_flush_t)(void *This); + +typedef struct { + uint64_t Revision; + efi_block_io_media_t *Media; + efi_block_reset_t Reset; + efi_block_read_t ReadBlocks; + efi_block_write_t WriteBlocks; + efi_block_flush_t FlushBlocks; +} efi_block_io_t; + +typedef struct { + off_t offset; + efi_block_io_t *bio; +} block_file_t; + +/*** Graphics Output Protocol (not used, but could be useful to have) ***/ +#ifndef EFI_GRAPHICS_OUTPUT_PROTOCOL_GUID +#define EFI_GRAPHICS_OUTPUT_PROTOCOL_GUID { 0x9042a9de, 0x23dc, 0x4a38, {0x96, 0xfb, 0x7a, 0xde, 0xd0, 0x80, 0x51, 0x6a } } + +typedef enum { + PixelRedGreenBlueReserved8BitPerColor, + PixelBlueGreenRedReserved8BitPerColor, + PixelBitMask, + PixelBltOnly, + PixelFormatMax +} efi_gop_pixel_format_t; + +typedef enum { + EfiBltVideoFill, + EfiBltVideoToBltBuffer, + EfiBltBufferToVideo, + EfiBltVideoToVideo, + EfiGraphicsOutputBltOperationMax +} efi_gop_blt_operation_t; + +#else + +#define efi_gop_pixel_format_t EFI_GRAPHICS_PIXEL_FORMAT +#define efi_gop_blt_operation_t EFI_GRAPHICS_OUTPUT_BLT_OPERATION + +#endif + +typedef struct { + uint32_t RedMask; + uint32_t GreenMask; + uint32_t BlueMask; + uint32_t ReservedMask; +} efi_gop_pixel_bitmask_t; + +typedef struct { + uint32_t Version; + uint32_t HorizontalResolution; + uint32_t VerticalResolution; + efi_gop_pixel_format_t PixelFormat; + efi_gop_pixel_bitmask_t PixelInformation; + uint32_t PixelsPerScanLine; +} efi_gop_mode_info_t; + +typedef struct { + uint32_t MaxMode; + uint32_t Mode; + efi_gop_mode_info_t *Information; + uintn_t SizeOfInfo; + efi_physical_address_t FrameBufferBase; + uintn_t FrameBufferSize; +} efi_gop_mode_t; + +typedef efi_status_t (EFIAPI *efi_gop_query_mode_t)(void *This, uint32_t ModeNumber, uintn_t *SizeOfInfo, + efi_gop_mode_info_t **Info); +typedef efi_status_t (EFIAPI *efi_gop_set_mode_t)(void *This, uint32_t ModeNumber); +typedef efi_status_t (EFIAPI *efi_gop_blt_t)(void *This, uint32_t *BltBuffer, efi_gop_blt_operation_t BltOperation, + uintn_t SourceX, uintn_t SourceY, uintn_t DestinationX, uintn_t DestionationY, uintn_t Width, uintn_t Height, uintn_t Delta); + +typedef struct { + efi_gop_query_mode_t QueryMode; + efi_gop_set_mode_t SetMode; + efi_gop_blt_t Blt; + efi_gop_mode_t *Mode; +} efi_gop_t; + +/*** Simple Pointer Protocol (not used, but could be useful to have) ***/ +#ifndef EFI_SIMPLE_POINTER_PROTOCOL_GUID +#define EFI_SIMPLE_POINTER_PROTOCOL_GUID { 0x31878c87, 0xb75, 0x11d5, { 0x9a, 0x4f, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d } } +#endif + +typedef struct { + int32_t RelativeMovementX; + int32_t RelativeMovementY; + int32_t RelativeMovementZ; + boolean_t LeftButton; + boolean_t RightButton; +} efi_simple_pointer_state_t; + +typedef struct { + uint64_t ResolutionX; + uint64_t ResolutionY; + uint64_t ResolutionZ; + boolean_t LeftButton; + boolean_t RightButton; +} efi_simple_pointer_mode_t; + +typedef efi_status_t (EFIAPI *efi_simple_pointer_reset_t) (void *This, boolean_t ExtendedVerification); +typedef efi_status_t (EFIAPI *efi_simple_pointer_get_state_t) (void *This, efi_simple_pointer_state_t *State); + +typedef struct { + efi_simple_pointer_reset_t Reset; + efi_simple_pointer_get_state_t GetState; + efi_event_t WaitForInput; + efi_simple_pointer_mode_t *Mode; +} efi_simple_pointer_protocol_t; + +/*** Option ROM Protocol (not used, but could be useful to have) ***/ +#ifndef EFI_PCI_OPTION_ROM_TABLE_GUID +#define EFI_PCI_OPTION_ROM_TABLE_GUID { 0x7462660f, 0x1cbd, 0x48da, {0xad, 0x11, 0x91, 0x71, 0x79, 0x13, 0x83, 0x1c} } +#endif + +typedef struct { + efi_physical_address_t RomAddress; + efi_memory_type_t MemoryType; + uint32_t RomLength; + uint32_t Seg; + uint8_t Bus; + uint8_t Dev; + uint8_t Func; + boolean_t ExecutedLegacyBiosImage; + boolean_t DontLoadEfiRom; +} efi_pci_option_rom_descriptor_t; + +typedef struct { + uint64_t PciOptionRomCount; + efi_pci_option_rom_descriptor_t *PciOptionRomDescriptors; +} efi_pci_option_rom_table_t; + +/*** GPT partitioning table (not used, but could be useful to have) ***/ +typedef struct { + efi_table_header_t Header; + efi_lba_t MyLBA; + efi_lba_t AlternateLBA; + efi_lba_t FirstUsableLBA; + efi_lba_t LastUsableLBA; + efi_guid_t DiskGUID; + efi_lba_t PartitionEntryLBA; + uint32_t NumberOfPartitionEntries; + uint32_t SizeOfPartitionEntry; + uint32_t PartitionEntryArrayCRC32; +} efi_partition_table_header_t; + +typedef struct { + efi_guid_t PartitionTypeGUID; + efi_guid_t UniquePartitionGUID; + efi_lba_t StartingLBA; + efi_lba_t EndingLBA; + uint64_t Attributes; + wchar_t PartitionName[36]; +} efi_partition_entry_t; + +/*** POSIX definitions ***/ +#define abs(x) ((x)<0?-(x):(x)) +#define min(x,y) ((x)<(y)?(x):(y)) +#define max(x,y) ((x)>(y)?(x):(y)) + +/* dirent.h */ +#define IFTODT(mode) (((mode) & 0170000) >> 12) +#define DTTOIF(dirtype) ((dirtype) << 12) +#define DT_DIR 4 +#define DT_REG 8 +struct dirent { + unsigned short int d_reclen; + unsigned char d_type; + char_t d_name[FILENAME_MAX]; +}; +typedef struct efi_file_handle_s DIR; +extern DIR *opendir (const char_t *__name); +extern struct dirent *readdir (DIR *__dirp); +extern void rewinddir (DIR *__dirp); +extern int closedir (DIR *__dirp); + +/* errno.h */ +extern int errno; +#define EPERM 1 /* Operation not permitted */ +#define ENOENT 2 /* No such file or directory */ +#define ESRCH 3 /* No such process */ +#define EINTR 4 /* Interrupted system call */ +#define EIO 5 /* I/O error */ +#define ENXIO 6 /* No such device or address */ +#define E2BIG 7 /* Argument list too long */ +#define ENOEXEC 8 /* Exec format error */ +#define EBADF 9 /* Bad file number */ +#define ECHILD 10 /* No child processes */ +#define EAGAIN 11 /* Try again */ +#define ENOMEM 12 /* Out of memory */ +#define EACCES 13 /* Permission denied */ +#define EFAULT 14 /* Bad address */ +#define ENOTBLK 15 /* Block device required */ +#define EBUSY 16 /* Device or resource busy */ +#define EEXIST 17 /* File exists */ +#define EXDEV 18 /* Cross-device link */ +#define ENODEV 19 /* No such device */ +#define ENOTDIR 20 /* Not a directory */ +#define EISDIR 21 /* Is a directory */ +#define EINVAL 22 /* Invalid argument */ +#define ENFILE 23 /* File table overflow */ +#define EMFILE 24 /* Too many open files */ +#define ENOTTY 25 /* Not a typewriter */ +#define ETXTBSY 26 /* Text file busy */ +#define EFBIG 27 /* File too large */ +#define ENOSPC 28 /* No space left on device */ +#define ESPIPE 29 /* Illegal seek */ +#define EROFS 30 /* Read-only file system */ +#define EMLINK 31 /* Too many links */ +#define EPIPE 32 /* Broken pipe */ +#define EDOM 33 /* Math argument out of domain of func */ +#define ERANGE 34 /* Math result not representable */ + +/* stdlib.h */ +#define RAND_MAX 2147483647 +typedef int (*__compar_fn_t) (const void *, const void *); +extern int atoi (const char_t *__nptr); +extern int64_t atol (const char_t *__nptr); +extern int64_t strtol (const char_t *__nptr, char_t **__endptr, int __base); +extern void *malloc (size_t __size); +extern void *calloc (size_t __nmemb, size_t __size); +extern void *realloc (void *__ptr, size_t __size); +extern void free (void *__ptr); +extern void abort (void); +extern void exit (int __status); +/* exit Boot Services function. Returns 0 on success. */ +extern int exit_bs(); +extern void *bsearch (const void *__key, const void *__base, size_t __nmemb, size_t __size, __compar_fn_t __compar); +extern void qsort (void *__base, size_t __nmemb, size_t __size, __compar_fn_t __compar); +extern int mblen (const char *__s, size_t __n); +extern int mbtowc (wchar_t * __pwc, const char * __s, size_t __n); +extern int wctomb (char *__s, wchar_t __wchar); +extern size_t mbstowcs (wchar_t *__pwcs, const char *__s, size_t __n); +extern size_t wcstombs (char *__s, const wchar_t *__pwcs, size_t __n); +extern void srand(unsigned int __seed); +extern int rand(void); +extern uint8_t *getenv(char_t *name, uintn_t *len); +extern int setenv(char_t *name, uintn_t len, uint8_t *data); + +/* stdio.h */ +#ifndef BUFSIZ +#define BUFSIZ 8192 +#endif +#define SEEK_SET 0 /* Seek from beginning of file. */ +#define SEEK_CUR 1 /* Seek from current position. */ +#define SEEK_END 2 /* Seek from end of file. */ +#define stdin (FILE*)ST->ConsoleInHandle +#define stdout (FILE*)ST->ConsoleOutHandle +#define stderr (FILE*)ST->ConsoleErrorHandle +typedef struct efi_file_handle_s FILE; +extern int fclose (FILE *__stream); +extern int fflush (FILE *__stream); +extern int remove (const char_t *__filename); +extern FILE *fopen (const char_t *__filename, const char_t *__modes); +extern size_t fread (void *__ptr, size_t __size, size_t __n, FILE *__stream); +extern size_t fwrite (const void *__ptr, size_t __size, size_t __n, FILE *__s); +extern int fseek (FILE *__stream, long int __off, int __whence); +extern long int ftell (FILE *__stream); +extern int feof (FILE *__stream); +extern int fprintf (FILE *__stream, const char_t *__format, ...); +extern int printf (const char_t *__format, ...); +extern int sprintf (char_t *__s, const char_t *__format, ...); +extern int vfprintf (FILE *__s, const char_t *__format, __builtin_va_list __arg); +extern int vprintf (const char_t *__format, __builtin_va_list __arg); +extern int vsprintf (char_t *__s, const char_t *__format, __builtin_va_list __arg); +extern int snprintf (char_t *__s, size_t __maxlen, const char_t *__format, ...); +extern int vsnprintf (char_t *__s, size_t __maxlen, const char_t *__format, __builtin_va_list __arg); +extern int getchar (void); +/* non-blocking, only returns UNICODE if there's any key pressed, 0 otherwise */ +extern int getchar_ifany (void); +extern int putchar (int __c); + +/* string.h */ +extern void *memcpy(void *__dest, const void *__src, size_t __n); +extern void *memmove(void *__dest, const void *__src, size_t __n); +extern void *memset(void *__s, int __c, size_t __n); +extern int memcmp(const void *__s1, const void *__s2, size_t __n); +extern void *memchr(const void *__s, int __c, size_t __n); +extern void *memrchr(const void *__s, int __c, size_t __n); +void *memmem(const void *haystack, size_t hl, const void *needle, size_t nl); +void *memrmem(const void *haystack, size_t hl, const void *needle, size_t nl); +extern char_t *strcpy (char_t *__dest, const char_t *__src); +extern char_t *strncpy (char_t *__dest, const char_t *__src, size_t __n); +extern char_t *strcat (char_t *__dest, const char_t *__src); +extern char_t *strncat (char_t *__dest, const char_t *__src, size_t __n); +extern int strcmp (const char_t *__s1, const char_t *__s2); +extern int strncmp (const char_t *__s1, const char_t *__s2, size_t __n); +extern char_t *strdup (const char_t *__s); +extern char_t *strchr (const char_t *__s, int __c); +extern char_t *strrchr (const char_t *__s, int __c); +extern char_t *strstr (const char_t *__haystack, const char_t *__needle); +extern char_t *strtok (char_t *__s, const char_t *__delim); +extern char_t *strtok_r (char_t *__s, const char_t *__delim, char_t **__save_ptr); +extern size_t strlen (const char_t *__s); + +/* sys/stat.h */ +#define S_IREAD 0400 /* Read by owner. */ +#define S_IWRITE 0200 /* Write by owner. */ +#define S_IFMT 0170000 /* These bits determine file type. */ +#define S_IFIFO 0010000 /* FIFO. */ +#define S_IFCHR 0020000 /* Character device. */ +#define S_IFDIR 0040000 /* Directory. */ +#define S_IFBLK 0060000 /* Block device. */ +#define S_IFREG 0100000 /* Regular file. */ +#define S_ISTYPE(mode, mask) (((mode) & S_IFMT) == (mask)) +#define S_ISCHR(mode) S_ISTYPE((mode), S_IFCHR) +#define S_ISDIR(mode) S_ISTYPE((mode), S_IFDIR) +#define S_ISBLK(mode) S_ISTYPE((mode), S_IFBLK) +#define S_ISREG(mode) S_ISTYPE((mode), S_IFREG) +#define S_ISFIFO(mode) S_ISTYPE((mode), S_IFIFO) +struct stat { + mode_t st_mode; + off_t st_size; + blkcnt_t st_blocks; + time_t st_atime; + time_t st_mtime; + time_t st_ctime; +}; +extern int stat (const char_t *__file, struct stat *__buf); +extern int fstat (FILE *__f, struct stat *__buf); +extern int mkdir (const char_t *__path, mode_t __mode); + +/* time.h */ +struct tm { + int tm_sec; /* Seconds. [0-60] (1 leap second) */ + int tm_min; /* Minutes. [0-59] */ + int tm_hour; /* Hours. [0-23] */ + int tm_mday; /* Day. [1-31] */ + int tm_mon; /* Month. [0-11] */ + int tm_year; /* Year - 1900. */ + int tm_wday; /* Day of week. [0-6] (not set) */ + int tm_yday; /* Days in year.[0-365] (not set) */ + int tm_isdst; /* DST. [-1/0/1]*/ +}; +extern struct tm *localtime (const time_t *__timer); +extern time_t mktime(const struct tm *__tm); +extern time_t time(time_t *__timer); + +/* unistd.h */ +extern unsigned int sleep (unsigned int __seconds); +extern int usleep (unsigned long int __useconds); +extern int unlink (const wchar_t *__filename); + +#ifdef __cplusplus +} +#endif + +#endif /* _UEFI_H_ */ diff --git a/pcireg/uefi/unistd.c b/pcireg/uefi/unistd.c new file mode 100644 index 0000000..0ea6246 --- /dev/null +++ b/pcireg/uefi/unistd.c @@ -0,0 +1,55 @@ +/* + * unistd.c + * + * Copyright (C) 2021 bzt (bztsrc@gitlab) + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * This file is part of the POSIX-UEFI package. + * @brief Implementing functions which are defined in unistd.h + * + */ + +#include + +int __remove(const wchar_t *__filename, int isdir); + +int usleep (unsigned long int __useconds) +{ + BS->Stall(__useconds); + return 0; +} + +unsigned int sleep (unsigned int __seconds) +{ + BS->Stall((unsigned long int)__seconds * 1000000UL); + return 0; +} + +int unlink (const wchar_t *__filename) +{ + return __remove(__filename, 0); +} + +int rmdir (const wchar_t *__filename) +{ + return __remove(__filename, 1); +}