From d5bdc55b17982387b500fe2d670fc83bdcf417aa Mon Sep 17 00:00:00 2001 From: tmk Date: Tue, 22 Jun 2021 20:46:40 +0900 Subject: [PATCH 01/28] lufa: Integrate NKRO into infterface 0 Build options for Keyboard: NKRO_ENABLE - NKRO shares interface 0 with Boot/6KRO this can save Endpoint resources of MCU NKRO_6KRO_ENABLE - NKRO has its own interface this is equivalent to old NKRO impl. Otherwise - Boot/6KRO interface 0 only --- tmk_core/protocol/lufa/descriptor.c | 49 ++++++++++++++++++++++++++--- tmk_core/protocol/lufa/descriptor.h | 6 ++-- tmk_core/protocol/lufa/lufa.c | 17 +++++++--- 3 files changed, 61 insertions(+), 11 deletions(-) diff --git a/tmk_core/protocol/lufa/descriptor.c b/tmk_core/protocol/lufa/descriptor.c index 77d86e55..0f188e29 100644 --- a/tmk_core/protocol/lufa/descriptor.c +++ b/tmk_core/protocol/lufa/descriptor.c @@ -46,6 +46,8 @@ ******************************************************************************/ const USB_Descriptor_HIDReport_Datatype_t PROGMEM KeyboardReport[] = { +#ifndef NKRO_ENABLE + /* 6KRO - Boot protocol */ HID_RI_USAGE_PAGE(8, 0x01), /* Generic Desktop */ HID_RI_USAGE(8, 0x06), /* Keyboard */ HID_RI_COLLECTION(8, 0x01), /* Application */ @@ -81,6 +83,40 @@ const USB_Descriptor_HIDReport_Datatype_t PROGMEM KeyboardReport[] = HID_RI_REPORT_SIZE(8, 0x08), HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_ARRAY | HID_IOF_ABSOLUTE), HID_RI_END_COLLECTION(0), +#else + /* NKRO - Report protocol */ + HID_RI_USAGE_PAGE(8, 0x01), /* Generic Desktop */ + HID_RI_USAGE(8, 0x06), /* Keyboard */ + HID_RI_COLLECTION(8, 0x01), /* Application */ + HID_RI_USAGE_PAGE(8, 0x07), /* Key Codes */ + HID_RI_USAGE_MINIMUM(8, 0xE0), /* Keyboard Left Control */ + HID_RI_USAGE_MAXIMUM(8, 0xE7), /* Keyboard Right GUI */ + HID_RI_LOGICAL_MINIMUM(8, 0x00), + HID_RI_LOGICAL_MAXIMUM(8, 0x01), + HID_RI_REPORT_COUNT(8, 0x08), + HID_RI_REPORT_SIZE(8, 0x01), + HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE), + + HID_RI_USAGE_PAGE(8, 0x08), /* LEDs */ + HID_RI_USAGE_MINIMUM(8, 0x01), /* Num Lock */ + HID_RI_USAGE_MAXIMUM(8, 0x05), /* Kana */ + HID_RI_REPORT_COUNT(8, 0x05), + HID_RI_REPORT_SIZE(8, 0x01), + HID_RI_OUTPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE), + HID_RI_REPORT_COUNT(8, 0x01), + HID_RI_REPORT_SIZE(8, 0x03), + HID_RI_OUTPUT(8, HID_IOF_CONSTANT), + + HID_RI_USAGE_PAGE(8, 0x07), /* Key Codes */ + HID_RI_USAGE_MINIMUM(8, 0x00), /* Keyboard 0 */ + HID_RI_USAGE_MAXIMUM(8, (NKRO_EPSIZE-1)*8-1), /* Keyboard Right GUI */ + HID_RI_LOGICAL_MINIMUM(8, 0x00), + HID_RI_LOGICAL_MAXIMUM(8, 0x01), + HID_RI_REPORT_COUNT(8, (NKRO_EPSIZE-1)*8), + HID_RI_REPORT_SIZE(8, 0x01), + HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE), + HID_RI_END_COLLECTION(0), +#endif }; #ifdef MOUSE_ENABLE @@ -203,7 +239,7 @@ const USB_Descriptor_HIDReport_Datatype_t PROGMEM ConsoleReport[] = }; #endif -#ifdef NKRO_ENABLE +#ifdef NKRO_6KRO_ENABLE const USB_Descriptor_HIDReport_Datatype_t PROGMEM NKROReport[] = { HID_RI_USAGE_PAGE(8, 0x01), /* Generic Desktop */ @@ -322,8 +358,13 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor = .EndpointAddress = (ENDPOINT_DIR_IN | KEYBOARD_IN_EPNUM), .Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), +#ifdef NKRO_ENABLE + .EndpointSize = NKRO_EPSIZE, + .PollingIntervalMS = 0x01 +#else .EndpointSize = KEYBOARD_EPSIZE, .PollingIntervalMS = 0x0A +#endif }, /* @@ -465,7 +506,7 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor = /* * NKRO */ -#ifdef NKRO_ENABLE +#ifdef NKRO_6KRO_ENABLE .NKRO_Interface = { .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, @@ -600,7 +641,7 @@ uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, Size = sizeof(USB_HID_Descriptor_HID_t); break; #endif -#ifdef NKRO_ENABLE +#ifdef NKRO_6KRO_ENABLE case NKRO_INTERFACE: Address = &ConfigurationDescriptor.NKRO_HID; Size = sizeof(USB_HID_Descriptor_HID_t); @@ -632,7 +673,7 @@ uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, Size = sizeof(ConsoleReport); break; #endif -#ifdef NKRO_ENABLE +#ifdef NKRO_6KRO_ENABLE case NKRO_INTERFACE: Address = &NKROReport; Size = sizeof(NKROReport); diff --git a/tmk_core/protocol/lufa/descriptor.h b/tmk_core/protocol/lufa/descriptor.h index ed58f21e..c7fa4ec1 100644 --- a/tmk_core/protocol/lufa/descriptor.h +++ b/tmk_core/protocol/lufa/descriptor.h @@ -79,7 +79,7 @@ typedef struct USB_Descriptor_Endpoint_t Console_OUTEndpoint; #endif -#ifdef NKRO_ENABLE +#ifdef NKRO_6KRO_ENABLE // NKRO HID Interface USB_Descriptor_Interface_t NKRO_Interface; USB_HID_Descriptor_HID_t NKRO_HID; @@ -109,7 +109,7 @@ typedef struct # define CONSOLE_INTERFACE EXTRAKEY_INTERFACE #endif -#ifdef NKRO_ENABLE +#ifdef NKRO_6KRO_ENABLE # define NKRO_INTERFACE (CONSOLE_INTERFACE + 1) #else # define NKRO_INTERFACE CONSOLE_INTERFACE @@ -142,7 +142,7 @@ typedef struct # define CONSOLE_OUT_EPNUM EXTRAKEY_IN_EPNUM #endif -#ifdef NKRO_ENABLE +#ifdef NKRO_6KRO_ENABLE # define NKRO_IN_EPNUM (CONSOLE_OUT_EPNUM + 1) #else # define NKRO_IN_EPNUM CONSOLE_OUT_EPNUM diff --git a/tmk_core/protocol/lufa/lufa.c b/tmk_core/protocol/lufa/lufa.c index 54221591..2db0d6f1 100644 --- a/tmk_core/protocol/lufa/lufa.c +++ b/tmk_core/protocol/lufa/lufa.c @@ -329,7 +329,12 @@ void EVENT_USB_Device_ConfigurationChanged(void) /* Setup Keyboard HID Report Endpoints */ ConfigSuccess &= ENDPOINT_CONFIG(KEYBOARD_IN_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN, - KEYBOARD_EPSIZE, ENDPOINT_BANK_SINGLE); +#ifdef NKRO_ENABLE + NKRO_EPSIZE, +#else + KEYBOARD_EPSIZE, +#endif + ENDPOINT_BANK_SINGLE); #ifdef MOUSE_ENABLE /* Setup Mouse HID Report Endpoint */ @@ -353,7 +358,7 @@ void EVENT_USB_Device_ConfigurationChanged(void) #endif #endif -#ifdef NKRO_ENABLE +#ifdef NKRO_6KRO_ENABLE /* Setup NKRO HID Report Endpoints */ ConfigSuccess &= ENDPOINT_CONFIG(NKRO_IN_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN, NKRO_EPSIZE, ENDPOINT_BANK_SINGLE); @@ -414,7 +419,7 @@ void EVENT_USB_Device_ControlRequest(void) // Interface switch (USB_ControlRequest.wIndex) { case KEYBOARD_INTERFACE: -#ifdef NKRO_ENABLE +#ifdef NKRO_6KRO_ENABLE case NKRO_INTERFACE: #endif Endpoint_ClearSETUP(); @@ -515,10 +520,14 @@ static void send_keyboard(report_keyboard_t *report) return; /* Select the Keyboard Report Endpoint */ -#ifdef NKRO_ENABLE +#if defined(NKRO_ENABLE) || defined(NKRO_6KRO_ENABLE) if (keyboard_protocol && keyboard_nkro) { /* Report protocol - NKRO */ + #if defined(NKRO_6KRO_ENABLE) Endpoint_SelectEndpoint(NKRO_IN_EPNUM); + #else + Endpoint_SelectEndpoint(KEYBOARD_IN_EPNUM); + #endif /* Check if write ready for a polling interval around 1ms */ while (timeout-- && !Endpoint_IsReadWriteAllowed()) _delay_us(8); From 2b07c0bd00f24858aa3c4d40fbf8baa1f1fd8007 Mon Sep 17 00:00:00 2001 From: tmk Date: Tue, 22 Jun 2021 20:54:34 +0900 Subject: [PATCH 02/28] core: Build option: NKRO_6KRO_ENABLE --- tmk_core/common.mk | 4 ++++ tmk_core/common/action_util.c | 10 +++++----- tmk_core/common/bootmagic.c | 2 +- tmk_core/common/command.c | 8 ++++---- tmk_core/common/host.c | 2 +- tmk_core/common/host.h | 2 +- tmk_core/common/report.h | 4 ++-- 7 files changed, 18 insertions(+), 14 deletions(-) diff --git a/tmk_core/common.mk b/tmk_core/common.mk index 9c3425b4..f8e6f4cf 100644 --- a/tmk_core/common.mk +++ b/tmk_core/common.mk @@ -75,6 +75,10 @@ ifeq (yes,$(strip $(NKRO_ENABLE))) OPT_DEFS += -DNKRO_ENABLE endif +ifeq (yes,$(strip $(NKRO_6KRO_ENABLE))) + OPT_DEFS += -DNKRO_6KRO_ENABLE +endif + ifeq (yes,$(strip $(USB_6KRO_ENABLE))) OPT_DEFS += -DUSB_6KRO_ENABLE endif diff --git a/tmk_core/common/action_util.c b/tmk_core/common/action_util.c index f81877dd..7324bb27 100644 --- a/tmk_core/common/action_util.c +++ b/tmk_core/common/action_util.c @@ -22,7 +22,7 @@ along with this program. If not, see . static inline void add_key_byte(uint8_t code); static inline void del_key_byte(uint8_t code); -#ifdef NKRO_ENABLE +#if defined(NKRO_ENABLE) || defined(NKRO_6KRO_ENABLE) static inline void add_key_bit(uint8_t code); static inline void del_key_bit(uint8_t code); #endif @@ -75,7 +75,7 @@ void send_keyboard_report(void) { /* key */ void add_key(uint8_t key) { -#ifdef NKRO_ENABLE +#if defined(NKRO_ENABLE) || defined(NKRO_6KRO_ENABLE) if (keyboard_protocol && keyboard_nkro) { add_key_bit(key); return; @@ -86,7 +86,7 @@ void add_key(uint8_t key) void del_key(uint8_t key) { -#ifdef NKRO_ENABLE +#if defined(NKRO_ENABLE) || defined(NKRO_6KRO_ENABLE) if (keyboard_protocol && keyboard_nkro) { del_key_bit(key); return; @@ -159,7 +159,7 @@ uint8_t has_anymod(void) uint8_t get_first_key(void) { -#ifdef NKRO_ENABLE +#if defined(NKRO_ENABLE) || defined(NKRO_6KRO_ENABLE) if (keyboard_protocol && keyboard_nkro) { uint8_t i = 0; for (; i < KEYBOARD_REPORT_BITS && !keyboard_report->nkro.bits[i]; i++) @@ -286,7 +286,7 @@ static inline void del_key_byte(uint8_t code) #endif } -#ifdef NKRO_ENABLE +#if defined(NKRO_ENABLE) || defined(NKRO_6KRO_ENABLE) static inline void add_key_bit(uint8_t code) { if ((code>>3) < KEYBOARD_REPORT_BITS) { diff --git a/tmk_core/common/bootmagic.c b/tmk_core/common/bootmagic.c index eb06d787..220eb14f 100644 --- a/tmk_core/common/bootmagic.c +++ b/tmk_core/common/bootmagic.c @@ -88,7 +88,7 @@ void bootmagic(void) } eeconfig_write_keymap(keymap_config.raw); -#ifdef NKRO_ENABLE +#if defined(NKRO_ENABLE) || defined(NKRO_6KRO_ENABLE) keyboard_nkro = keymap_config.nkro; #endif diff --git a/tmk_core/common/command.c b/tmk_core/common/command.c index 54050bd9..74255736 100644 --- a/tmk_core/common/command.c +++ b/tmk_core/common/command.c @@ -134,7 +134,7 @@ static void command_common_help(void) "e: eeprom\n" #endif -#ifdef NKRO_ENABLE +#if defined(NKRO_ENABLE) || defined(NKRO_6KRO_ENABLE) "n: NKRO\n" #endif @@ -314,7 +314,7 @@ static bool command_common(uint8_t code) #ifdef COMMAND_ENABLE " COMMAND" #endif -#ifdef NKRO_ENABLE +#if defined(NKRO_ENABLE) || defined(NKRO_6KRO_ENABLE) " NKRO" #endif #ifdef KEYMAP_SECTION_ENABLE @@ -336,7 +336,7 @@ static bool command_common(uint8_t code) print_val_hex8(host_keyboard_leds()); print_val_hex8(keyboard_protocol); print_val_hex8(keyboard_idle); -#ifdef NKRO_ENABLE +#if defined(NKRO_ENABLE) || defined(NKRO_6KRO_ENABLE) print_val_hex8(keyboard_nkro); #endif print_val_hex32(timer_read32()); @@ -355,7 +355,7 @@ static bool command_common(uint8_t code) # endif #endif break; -#ifdef NKRO_ENABLE +#if defined(NKRO_ENABLE) || defined(NKRO_6KRO_ENABLE) case KC_N: clear_keyboard(); //Prevents stuck keys. keyboard_nkro = !keyboard_nkro; diff --git a/tmk_core/common/host.c b/tmk_core/common/host.c index 27aa44a2..1f40aa49 100644 --- a/tmk_core/common/host.c +++ b/tmk_core/common/host.c @@ -23,7 +23,7 @@ along with this program. If not, see . #include "debug.h" -#ifdef NKRO_ENABLE +#if defined(NKRO_ENABLE) || defined(NKRO_6KRO_ENABLE) bool keyboard_nkro = true; #endif diff --git a/tmk_core/common/host.h b/tmk_core/common/host.h index fefb8141..e1359782 100644 --- a/tmk_core/common/host.h +++ b/tmk_core/common/host.h @@ -28,7 +28,7 @@ along with this program. If not, see . extern "C" { #endif -#ifdef NKRO_ENABLE +#if defined(NKRO_ENABLE) || defined(NKRO_6KRO_ENABLE) extern bool keyboard_nkro; #endif diff --git a/tmk_core/common/report.h b/tmk_core/common/report.h index 5f91550a..fcafbd5f 100644 --- a/tmk_core/common/report.h +++ b/tmk_core/common/report.h @@ -94,7 +94,7 @@ along with this program. If not, see . # define KEYBOARD_REPORT_KEYS (KBD2_SIZE - 2) # define KEYBOARD_REPORT_BITS (KBD2_SIZE - 1) -#elif defined(PROTOCOL_LUFA) && defined(NKRO_ENABLE) +#elif defined(PROTOCOL_LUFA) && (defined(NKRO_ENABLE) || defined(NKRO_6KRO_ENABLE)) # include "protocol/lufa/descriptor.h" # define KEYBOARD_REPORT_SIZE NKRO_EPSIZE # define KEYBOARD_REPORT_KEYS (NKRO_EPSIZE - 2) @@ -142,7 +142,7 @@ typedef union { uint8_t reserved; uint8_t keys[KEYBOARD_REPORT_KEYS]; }; -#ifdef NKRO_ENABLE +#if defined(NKRO_ENABLE) || defined(NKRO_6KRO_ENABLE) struct { uint8_t mods; uint8_t bits[KEYBOARD_REPORT_BITS]; From 5948ea0ac675ca25aed84475f70366f1a8acefce Mon Sep 17 00:00:00 2001 From: tmk Date: Tue, 22 Jun 2021 23:26:56 +0900 Subject: [PATCH 03/28] lufa: Integrate EXTRAKEY into MOUSE interface --- tmk_core/protocol/lufa/descriptor.c | 76 ++++++----------------------- tmk_core/protocol/lufa/descriptor.h | 44 ++++++----------- tmk_core/protocol/lufa/lufa.c | 13 ++--- 3 files changed, 33 insertions(+), 100 deletions(-) diff --git a/tmk_core/protocol/lufa/descriptor.c b/tmk_core/protocol/lufa/descriptor.c index 0f188e29..1dbaac03 100644 --- a/tmk_core/protocol/lufa/descriptor.c +++ b/tmk_core/protocol/lufa/descriptor.c @@ -119,15 +119,18 @@ const USB_Descriptor_HIDReport_Datatype_t PROGMEM KeyboardReport[] = #endif }; -#ifdef MOUSE_ENABLE +#if defined(MOUSE_ENABLE) || defined(EXTRAKEY_ENABLE) const USB_Descriptor_HIDReport_Datatype_t PROGMEM MouseReport[] = { +#ifdef MOUSE_ENABLE HID_RI_USAGE_PAGE(8, 0x01), /* Generic Desktop */ HID_RI_USAGE(8, 0x02), /* Mouse */ HID_RI_COLLECTION(8, 0x01), /* Application */ HID_RI_USAGE(8, 0x01), /* Pointer */ HID_RI_COLLECTION(8, 0x00), /* Physical */ + HID_RI_REPORT_ID(8, REPORT_ID_MOUSE), + HID_RI_USAGE_PAGE(8, 0x09), /* Button */ HID_RI_USAGE_MINIMUM(8, 0x01), /* Button 1 */ HID_RI_USAGE_MAXIMUM(8, 0x08), /* Button 8 */ @@ -183,12 +186,9 @@ const USB_Descriptor_HIDReport_Datatype_t PROGMEM MouseReport[] = HID_RI_END_COLLECTION(0), HID_RI_END_COLLECTION(0), -}; #endif #ifdef EXTRAKEY_ENABLE -const USB_Descriptor_HIDReport_Datatype_t PROGMEM ExtrakeyReport[] = -{ HID_RI_USAGE_PAGE(8, 0x01), /* Generic Desktop */ HID_RI_USAGE(8, 0x80), /* System Control */ HID_RI_COLLECTION(8, 0x01), /* Application */ @@ -214,6 +214,7 @@ const USB_Descriptor_HIDReport_Datatype_t PROGMEM ExtrakeyReport[] = HID_RI_REPORT_COUNT(8, 1), HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_ARRAY | HID_IOF_ABSOLUTE), HID_RI_END_COLLECTION(0), +#endif }; #endif @@ -370,7 +371,7 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor = /* * Mouse */ -#ifdef MOUSE_ENABLE +#if defined(MOUSE_ENABLE) || defined(EXTRAKEY_ENABLE) .Mouse_Interface = { .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, @@ -381,8 +382,13 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor = .TotalEndpoints = 1, .Class = HID_CSCP_HIDClass, +#if defined(MOUSE_ENABLE) .SubClass = HID_CSCP_BootSubclass, .Protocol = HID_CSCP_MouseBootProtocol, +#else + .SubClass = HID_CSCP_NonBootSubclass, + .Protocol = HID_CSCP_NonBootProtocol, +#endif .InterfaceStrIndex = NO_DESCRIPTOR }, @@ -405,49 +411,7 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor = .EndpointAddress = (ENDPOINT_DIR_IN | MOUSE_IN_EPNUM), .Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), .EndpointSize = MOUSE_EPSIZE, - .PollingIntervalMS = 0x0A - }, -#endif - - /* - * Extra - */ -#ifdef EXTRAKEY_ENABLE - .Extrakey_Interface = - { - .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, - - .InterfaceNumber = EXTRAKEY_INTERFACE, - .AlternateSetting = 0x00, - - .TotalEndpoints = 1, - - .Class = HID_CSCP_HIDClass, - .SubClass = HID_CSCP_NonBootSubclass, - .Protocol = HID_CSCP_NonBootProtocol, - - .InterfaceStrIndex = NO_DESCRIPTOR - }, - - .Extrakey_HID = - { - .Header = {.Size = sizeof(USB_HID_Descriptor_HID_t), .Type = HID_DTYPE_HID}, - - .HIDSpec = VERSION_BCD(1,1,1), - .CountryCode = 0x00, - .TotalReportDescriptors = 1, - .HIDReportType = HID_DTYPE_Report, - .HIDReportLength = sizeof(ExtrakeyReport) - }, - - .Extrakey_INEndpoint = - { - .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, - - .EndpointAddress = (ENDPOINT_DIR_IN | EXTRAKEY_IN_EPNUM), - .Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), - .EndpointSize = EXTRAKEY_EPSIZE, - .PollingIntervalMS = 0x0A + .PollingIntervalMS = 0x01 }, #endif @@ -623,18 +587,12 @@ uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, Address = &ConfigurationDescriptor.Keyboard_HID; Size = sizeof(USB_HID_Descriptor_HID_t); break; -#ifdef MOUSE_ENABLE +#if defined(MOUSE_ENABLE) || defined(EXTRAKEY_ENABLE) case MOUSE_INTERFACE: Address = &ConfigurationDescriptor.Mouse_HID; Size = sizeof(USB_HID_Descriptor_HID_t); break; #endif -#ifdef EXTRAKEY_ENABLE - case EXTRAKEY_INTERFACE: - Address = &ConfigurationDescriptor.Extrakey_HID; - Size = sizeof(USB_HID_Descriptor_HID_t); - break; -#endif #ifdef CONSOLE_ENABLE case CONSOLE_INTERFACE: Address = &ConfigurationDescriptor.Console_HID; @@ -655,18 +613,12 @@ uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, Address = &KeyboardReport; Size = sizeof(KeyboardReport); break; -#ifdef MOUSE_ENABLE +#if defined(MOUSE_ENABLE) || defined(EXTRAKEY_ENABLE) case MOUSE_INTERFACE: Address = &MouseReport; Size = sizeof(MouseReport); break; #endif -#ifdef EXTRAKEY_ENABLE - case EXTRAKEY_INTERFACE: - Address = &ExtrakeyReport; - Size = sizeof(ExtrakeyReport); - break; -#endif #ifdef CONSOLE_ENABLE case CONSOLE_INTERFACE: Address = &ConsoleReport; diff --git a/tmk_core/protocol/lufa/descriptor.h b/tmk_core/protocol/lufa/descriptor.h index c7fa4ec1..5c09be30 100644 --- a/tmk_core/protocol/lufa/descriptor.h +++ b/tmk_core/protocol/lufa/descriptor.h @@ -57,20 +57,13 @@ typedef struct USB_HID_Descriptor_HID_t Keyboard_HID; USB_Descriptor_Endpoint_t Keyboard_INEndpoint; -#ifdef MOUSE_ENABLE +#if defined(MOUSE_ENABLE) || defined(EXTRAKEY_ENABLE) // Mouse HID Interface USB_Descriptor_Interface_t Mouse_Interface; USB_HID_Descriptor_HID_t Mouse_HID; USB_Descriptor_Endpoint_t Mouse_INEndpoint; #endif -#ifdef EXTRAKEY_ENABLE - // Extrakey HID Interface - USB_Descriptor_Interface_t Extrakey_Interface; - USB_HID_Descriptor_HID_t Extrakey_HID; - USB_Descriptor_Endpoint_t Extrakey_INEndpoint; -#endif - #ifdef CONSOLE_ENABLE // Console HID Interface USB_Descriptor_Interface_t Console_Interface; @@ -91,22 +84,16 @@ typedef struct /* index of interface */ #define KEYBOARD_INTERFACE 0 -#ifdef MOUSE_ENABLE +#if defined(MOUSE_ENABLE) || defined(EXTRAKEY_ENABLE) # define MOUSE_INTERFACE (KEYBOARD_INTERFACE + 1) #else # define MOUSE_INTERFACE KEYBOARD_INTERFACE #endif -#ifdef EXTRAKEY_ENABLE -# define EXTRAKEY_INTERFACE (MOUSE_INTERFACE + 1) -#else -# define EXTRAKEY_INTERFACE MOUSE_INTERFACE -#endif - #ifdef CONSOLE_ENABLE -# define CONSOLE_INTERFACE (EXTRAKEY_INTERFACE + 1) +# define CONSOLE_INTERFACE (MOUSE_INTERFACE + 1) #else -# define CONSOLE_INTERFACE EXTRAKEY_INTERFACE +# define CONSOLE_INTERFACE MOUSE_INTERFACE #endif #ifdef NKRO_6KRO_ENABLE @@ -123,23 +110,17 @@ typedef struct // Endopoint number and size #define KEYBOARD_IN_EPNUM 1 -#ifdef MOUSE_ENABLE +#if defined(MOUSE_ENABLE) || defined(EXTRAKEY_ENABLE) # define MOUSE_IN_EPNUM (KEYBOARD_IN_EPNUM + 1) #else # define MOUSE_IN_EPNUM KEYBOARD_IN_EPNUM #endif -#ifdef EXTRAKEY_ENABLE -# define EXTRAKEY_IN_EPNUM (MOUSE_IN_EPNUM + 1) -#else -# define EXTRAKEY_IN_EPNUM MOUSE_IN_EPNUM -#endif - #ifdef CONSOLE_ENABLE -# define CONSOLE_IN_EPNUM (EXTRAKEY_IN_EPNUM + 1) -# define CONSOLE_OUT_EPNUM (EXTRAKEY_IN_EPNUM + 1) +# define CONSOLE_IN_EPNUM (MOUSE_IN_EPNUM + 1) +# define CONSOLE_OUT_EPNUM (MOUSE_IN_EPNUM + 1) #else -# define CONSOLE_OUT_EPNUM EXTRAKEY_IN_EPNUM +# define CONSOLE_OUT_EPNUM MOUSE_IN_EPNUM #endif #ifdef NKRO_6KRO_ENABLE @@ -150,13 +131,18 @@ typedef struct /* Check number of endpoints. ATmega32u2 has only four except for control endpoint. */ #if defined(__AVR_ATmega32U2__) && NKRO_IN_EPNUM > 4 -# error "Endpoints are not available enough to support all functions. Disable some of build options in Makefile.(MOUSEKEY, EXTRAKEY, CONSOLE, NKRO)" +# error "Endpoints are not available enough to support all functions. Disable some of build options in Makefile.(MOUSEKEY, CONSOLE, NKRO)" #endif #define KEYBOARD_EPSIZE 8 + +#if defined(MOUSE_EXT_REPORT) +#define MOUSE_EPSIZE 10 +#else #define MOUSE_EPSIZE 8 -#define EXTRAKEY_EPSIZE 8 +#endif + #define CONSOLE_EPSIZE 32 #define NKRO_EPSIZE 32 diff --git a/tmk_core/protocol/lufa/lufa.c b/tmk_core/protocol/lufa/lufa.c index 2db0d6f1..3f49af22 100644 --- a/tmk_core/protocol/lufa/lufa.c +++ b/tmk_core/protocol/lufa/lufa.c @@ -336,18 +336,12 @@ void EVENT_USB_Device_ConfigurationChanged(void) #endif ENDPOINT_BANK_SINGLE); -#ifdef MOUSE_ENABLE +#if defined(MOUSE_ENABLE) || defined(EXTRAKEY_ENABLE) /* Setup Mouse HID Report Endpoint */ ConfigSuccess &= ENDPOINT_CONFIG(MOUSE_IN_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN, MOUSE_EPSIZE, ENDPOINT_BANK_SINGLE); #endif -#ifdef EXTRAKEY_ENABLE - /* Setup Extra HID Report Endpoint */ - ConfigSuccess &= ENDPOINT_CONFIG(EXTRAKEY_IN_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN, - EXTRAKEY_EPSIZE, ENDPOINT_BANK_SINGLE); -#endif - #ifdef CONSOLE_ENABLE /* Setup Console HID Report Endpoints */ ConfigSuccess &= ENDPOINT_CONFIG(CONSOLE_IN_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN, @@ -572,6 +566,7 @@ static void send_mouse(report_mouse_t *report) if (!Endpoint_IsReadWriteAllowed()) return; /* Write Mouse Report Data */ + Endpoint_Write_8(REPORT_ID_MOUSE); Endpoint_Write_Stream_LE(report, sizeof(report_mouse_t), NULL); /* Finalize the stream transfer to send the last packet */ @@ -591,7 +586,7 @@ static void send_system(uint16_t data) .report_id = REPORT_ID_SYSTEM, .usage = data - SYSTEM_POWER_DOWN + 1 }; - Endpoint_SelectEndpoint(EXTRAKEY_IN_EPNUM); + Endpoint_SelectEndpoint(MOUSE_IN_EPNUM); /* Check if write ready for a polling interval around 10ms */ while (timeout-- && !Endpoint_IsReadWriteAllowed()) _delay_us(40); @@ -614,7 +609,7 @@ static void send_consumer(uint16_t data) .report_id = REPORT_ID_CONSUMER, .usage = data }; - Endpoint_SelectEndpoint(EXTRAKEY_IN_EPNUM); + Endpoint_SelectEndpoint(MOUSE_IN_EPNUM); /* Check if write ready for a polling interval around 10ms */ while (timeout-- && !Endpoint_IsReadWriteAllowed()) _delay_us(40); From 106a18caf6af600de599740f53978ba0fac95c9c Mon Sep 17 00:00:00 2001 From: tmk Date: Mon, 28 Jun 2021 20:43:53 +0900 Subject: [PATCH 04/28] lufa: Add Boot protocol support for mouse --- tmk_core/protocol/lufa/lufa.c | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/tmk_core/protocol/lufa/lufa.c b/tmk_core/protocol/lufa/lufa.c index 3f49af22..e5077dfb 100644 --- a/tmk_core/protocol/lufa/lufa.c +++ b/tmk_core/protocol/lufa/lufa.c @@ -71,6 +71,7 @@ uint8_t keyboard_idle = 0; /* 0: Boot Protocol, 1: Report Protocol(default) */ uint8_t keyboard_protocol = 1; +uint8_t mouse_protocol = 1; static uint8_t keyboard_led_stats = 0; static report_keyboard_t keyboard_report_sent; @@ -449,6 +450,13 @@ void EVENT_USB_Device_ControlRequest(void) print("[p]"); #endif } + if (USB_ControlRequest.wIndex == MOUSE_INTERFACE) { + Endpoint_ClearSETUP(); + while (!(Endpoint_IsINReady())); + Endpoint_Write_8(mouse_protocol); + Endpoint_ClearIN(); + Endpoint_ClearStatusStage(); + } } break; @@ -465,6 +473,13 @@ void EVENT_USB_Device_ControlRequest(void) print("[P]"); #endif } + if (USB_ControlRequest.wIndex == MOUSE_INTERFACE) { + Endpoint_ClearSETUP(); + Endpoint_ClearStatusStage(); + + mouse_protocol = (USB_ControlRequest.wValue & 0xFF); + clear_keyboard(); + } } break; @@ -566,8 +581,14 @@ static void send_mouse(report_mouse_t *report) if (!Endpoint_IsReadWriteAllowed()) return; /* Write Mouse Report Data */ - Endpoint_Write_8(REPORT_ID_MOUSE); - Endpoint_Write_Stream_LE(report, sizeof(report_mouse_t), NULL); + if (mouse_protocol) { + // Report + Endpoint_Write_8(REPORT_ID_MOUSE); + Endpoint_Write_Stream_LE(report, sizeof(report_mouse_t), NULL); + } else { + // Boot + Endpoint_Write_Stream_LE(report, 3, NULL); + } /* Finalize the stream transfer to send the last packet */ Endpoint_ClearIN(); From 0b19a95ff4d3074e609b459950165df4ecd7761b Mon Sep 17 00:00:00 2001 From: tmk Date: Thu, 24 Jun 2021 20:46:40 +0900 Subject: [PATCH 05/28] ibmpc_usb: Remove clear_keyboard() from INIT state to avoid unnecessary empty keyboard report at startup. --- converter/ibmpc_usb/ibmpc_usb.c | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/converter/ibmpc_usb/ibmpc_usb.c b/converter/ibmpc_usb/ibmpc_usb.c index fb2d65c2..0034dc9f 100644 --- a/converter/ibmpc_usb/ibmpc_usb.c +++ b/converter/ibmpc_usb/ibmpc_usb.c @@ -131,6 +131,7 @@ uint8_t matrix_scan(void) READ_ID, SETUP, LOOP, + ERROR, } state = INIT; static uint16_t init_time; @@ -152,7 +153,7 @@ uint8_t matrix_scan(void) // keyboard init again if (state == LOOP) { xprintf("[RST] "); - state = INIT; + state = ERROR; } } @@ -172,7 +173,7 @@ uint8_t matrix_scan(void) ((current_protocol&IBMPC_PROTOCOL_AT) && (ibmpc_protocol&IBMPC_PROTOCOL_XT))) { if (state == LOOP) { xprintf("[CHG] "); - state = INIT; + state = ERROR; } } @@ -188,7 +189,6 @@ uint8_t matrix_scan(void) current_protocol = 0; matrix_clear(); - clear_keyboard(); init_time = timer_read(); state = WAIT_SETTLE; @@ -473,13 +473,13 @@ MOUSE_DONE: switch (keyboard_kind) { case PC_XT: - if (process_cs1(code) == -1) state = INIT; + if (process_cs1(code) == -1) state = ERROR; break; case PC_AT: - if (process_cs2(code) == -1) state = INIT; + if (process_cs2(code) == -1) state = ERROR; break; case PC_TERMINAL: - if (process_cs3(code) == -1) state = INIT; + if (process_cs3(code) == -1) state = ERROR; break; #ifdef IBMPC_MOUSE_ENABLE case PC_MOUSE: { @@ -593,6 +593,11 @@ MOUSE_DONE: } } break; + case ERROR: + // something goes wrong + clear_keyboard(); + state = INIT; + break; default: break; } From d14a00c44e6048e2126d6e14b4e849984674b168 Mon Sep 17 00:00:00 2001 From: tmk Date: Wed, 30 Jun 2021 17:04:08 +0900 Subject: [PATCH 06/28] core: Fix keymap.h header for C++ --- tmk_core/common/keymap.c | 8 -------- tmk_core/common/keymap.h | 20 ++++++++++++++++++++ 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/tmk_core/common/keymap.c b/tmk_core/common/keymap.c index 617a1f70..f9b8ca12 100644 --- a/tmk_core/common/keymap.c +++ b/tmk_core/common/keymap.c @@ -171,10 +171,6 @@ static action_t keycode_to_action(uint8_t keycode) * Legacy keymap support * Consider using new keymap API instead. */ -extern const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS]; -extern const uint8_t fn_layer[]; -extern const uint8_t fn_keycode[]; - __attribute__ ((weak)) uint8_t keymap_get_keycode(uint8_t layer, uint8_t row, uint8_t col) { @@ -223,10 +219,6 @@ action_t keymap_fn_to_action(uint8_t keycode) #else -/* user keymaps should be defined somewhere */ -extern const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS]; -extern const action_t fn_actions[]; - __attribute__ ((weak)) uint8_t keymap_key_to_keycode(uint8_t layer, keypos_t key) { diff --git a/tmk_core/common/keymap.h b/tmk_core/common/keymap.h index 659ea357..0a9c5d48 100644 --- a/tmk_core/common/keymap.h +++ b/tmk_core/common/keymap.h @@ -23,6 +23,10 @@ along with this program. If not, see . #include "action.h" +#ifdef __cplusplus +extern "C" { +#endif + #ifdef BOOTMAGIC_ENABLE /* NOTE: Not portable. Bit field order depends on implementation */ typedef union { @@ -40,6 +44,8 @@ typedef union { } keymap_config_t; #endif +extern const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS]; +extern const action_t fn_actions[]; /* translates key to keycode */ uint8_t keymap_key_to_keycode(uint8_t layer, keypos_t key); @@ -54,6 +60,10 @@ action_t keymap_fn_to_action(uint8_t keycode); * Legacy keymap * Consider using new keymap API above instead. */ +extern const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS]; +extern const uint8_t fn_layer[]; +extern const uint8_t fn_keycode[]; + /* keycode of key */ __attribute__ ((deprecated)) uint8_t keymap_get_keycode(uint8_t layer, uint8_t row, uint8_t col); @@ -65,6 +75,16 @@ uint8_t keymap_fn_layer(uint8_t fn_bits); /* keycode to send when release Fn key without using */ __attribute__ ((deprecated)) uint8_t keymap_fn_keycode(uint8_t fn_bits); + +#else + +/* user keymaps should be defined somewhere */ +extern const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS]; +extern const action_t fn_actions[]; +#endif + +#ifdef __cplusplus +} #endif #endif From ec2652ee9aab02cbc77cfcfddf57d9a753733662 Mon Sep 17 00:00:00 2001 From: tmk Date: Wed, 30 Jun 2021 19:48:00 +0900 Subject: [PATCH 07/28] Add usb_desc_dump project --- converter/usb_desc_dump/Makefile | 47 + converter/usb_desc_dump/README.md | 91 ++ .../usb_desc_dump/binary/usb_desc_dump.hex | 1072 +++++++++++++++++ converter/usb_desc_dump/config.h | 52 + converter/usb_desc_dump/desc_dump.cpp | 230 ++++ 5 files changed, 1492 insertions(+) create mode 100644 converter/usb_desc_dump/Makefile create mode 100644 converter/usb_desc_dump/README.md create mode 100644 converter/usb_desc_dump/binary/usb_desc_dump.hex create mode 100644 converter/usb_desc_dump/config.h create mode 100644 converter/usb_desc_dump/desc_dump.cpp diff --git a/converter/usb_desc_dump/Makefile b/converter/usb_desc_dump/Makefile new file mode 100644 index 00000000..a4e4eb2e --- /dev/null +++ b/converter/usb_desc_dump/Makefile @@ -0,0 +1,47 @@ +TARGET ?= usb_desc_dump +TMK_DIR ?= ../../tmk_core +TARGET_DIR ?= . +SRC ?= desc_dump.cpp +CONFIG_H ?= config.h + +# MCU name +MCU ?= atmega32u4 +# Processor frequency. +F_CPU ?= 16000000 + +# +# LUFA specific +# +ARCH ?= AVR8 +F_USB ?= $(F_CPU) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + +# +# Build Options +# +MOUSEKEY_ENABLE ?= no # Mouse keys +EXTRAKEY_ENABLE ?= no # Media control and System control +CONSOLE_ENABLE ?= yes # Console for debug +COMMAND_ENABLE ?= no # Commands for debug and configuration +NKRO_ENABLE ?= no # USB Nkey Rollover + +# Boot Section Size in bytes +OPT_DEFS += -DBOOTLOADER_SIZE=4096 +OPT_DEFS += -DNO_ACTION_TAPPING +OPT_DEFS += -DNO_ACTION_LAYER +OPT_DEFS += -DNO_ACTION_MACRO +OPT_DEFS += -DNO_DEBUG + +#LDFLAGS += -Wl,--relax + +# program Leonardo +PROGRAM_CMD = avrdude -p$(MCU) -cavr109 -b57600 -Uflash:w:$(TARGET).hex -P$(DEV) + +# Search Path +VPATH += $(TARGET_DIR) +VPATH += $(TMK_DIR) + +include $(TMK_DIR)/protocol/usb_hid.mk +include $(TMK_DIR)/protocol/lufa.mk +include $(TMK_DIR)/common.mk +include $(TMK_DIR)/rules.mk diff --git a/converter/usb_desc_dump/README.md b/converter/usb_desc_dump/README.md new file mode 100644 index 00000000..973cff3b --- /dev/null +++ b/converter/usb_desc_dump/README.md @@ -0,0 +1,91 @@ +USB Descriptor Dumper +===================== +2021-06-30 + +`usb_desc_dump` read USB descriptors and shows in HEX dump. +This works on TMK USB-USB converter and USB Host Shield with Arduino Leonardo. +USB hub is not supported. Device should be plugged directly. + +Following descriptors are supported. + +- Device Descriptor +- Configuration Descriptor + - Interface Descriptor + - Endpoint Descriptor + - HID Descriptor +- HID Report descriptor + + + +Example optput: + + usb_state: 90 + + Address:01 + lowspeed:01 + idVendor:046A + idProduct:0011 + + Device Descriptor: + 12 01 00 02 00 00 00 08 6A 04 11 00 00 01 00 00 + 00 01 + + Config0: len:0022 + 09 02 22 00 01 01 00 A0 32 09 04 00 00 01 03 01 + 01 00 09 21 11 01 00 01 22 40 00 07 05 81 03 08 + 00 0A + + Report0: len:0040 + 05 01 09 06 A1 01 05 07 19 E0 29 E7 15 00 25 01 + 75 01 95 08 81 02 95 01 75 08 81 01 95 03 75 01 + 05 08 19 01 29 03 91 02 95 05 75 01 91 01 95 06 + 75 08 15 00 26 DD 00 05 07 19 00 29 DD 81 00 C0 + + + +To check descriptor content use 'USB Descriptor and Request Parser' on line. + +- https://eleccelerator.com/usbdescreqparser/ + + +Or you can use command line tool like hidrd. + +- https://github.com/DIGImend/hidrd + + $ cat | hidrd-convert -i hex -o spec + 05 01 09 06 A1 01 05 07 19 E0 29 E7 15 00 25 01 + 75 01 95 08 81 02 95 01 75 08 81 01 95 03 75 01 + 05 08 19 01 29 03 91 02 95 05 75 01 91 01 95 06 + 75 08 15 00 26 DD 00 05 07 19 00 29 DD 81 00 C0 + Usage Page (Desktop), ; Generic desktop controls (01h) + Usage (Keyboard), ; Keyboard (06h, application collection) + Collection (Application), + Usage Page (Keyboard), ; Keyboard/keypad (07h) + Usage Minimum (KB Leftcontrol), ; Keyboard left control (E0h, dynamic value) + Usage Maximum (KB Right GUI), ; Keyboard right GUI (E7h, dynamic value) + Logical Minimum (0), + Logical Maximum (1), + Report Size (1), + Report Count (8), + Input (Variable), + Report Count (1), + Report Size (8), + Input (Constant), + Report Count (3), + Report Size (1), + Usage Page (LED), ; LEDs (08h) + Usage Minimum (01h), + Usage Maximum (03h), + Output (Variable), + Report Count (5), + Report Size (1), + Output (Constant), + Report Count (6), + Report Size (8), + Logical Minimum (0), + Logical Maximum (221), + Usage Page (Keyboard), ; Keyboard/keypad (07h) + Usage Minimum (None), ; No event (00h, selector) + Usage Maximum (KP Hexadecimal), ; Keypad Hexadecimal (DDh, selector) + Input, + End Collection diff --git a/converter/usb_desc_dump/binary/usb_desc_dump.hex b/converter/usb_desc_dump/binary/usb_desc_dump.hex new file mode 100644 index 00000000..bf099498 --- /dev/null +++ b/converter/usb_desc_dump/binary/usb_desc_dump.hex @@ -0,0 +1,1072 @@ +:100000000C9448010C949B010C949B010C949B0153 +:100010000C949B010C949B010C949B010C949B01F0 +:100020000C949B010C949B010C94BD190C948F1A99 +:100030000C94AE1E0C949B010C949B010C949B01A0 +:100040000C949B010C949B010C949B010C949B01C0 +:100050000C949B010C94C8050C949B010C949B017F +:100060000C949B010C949B010C949B010C949B01A0 +:100070000C949B010C949B010C949B010C949B0190 +:100080000C949B010C949B010C949B010C949B0180 +:100090000C949B010C949B010C949B010C949B0170 +:1000A0000C949B010C949B010C949B010B1832182F +:1000B0002A1932182A197E18A1182A19F8180719AE +:1000C0007573625F73746174653A20253032580A23 +:1000D000000D0A446576696365204465736372693F +:1000E00070746F723A0D0A006C6F77737065656497 +:1000F0003A253032580D0A000D0A41646472657366 +:10010000733A253032580D0A000D0A436F6E666946 +:100110006725643A000D0A5265706F727425643A5F +:10012000206C656E3A253034580D0A000D0A002502 +:1001300030325820000D0A0020000D0A4552524F5F +:10014000523A253032580D0A0025733A253034587A +:100150000D0A0025733A253032580D0A0000000AB6 +:100160004B6579626F6172642073746172742E0AD8 +:10017000000A55534220636F6E6669677572656445 +:100180002E0A000A0A544D4B3A3433646438313035 +:10019000362B2F4C5546410A0A002C0355005300BC +:1001A0004200200044006500730063007200690093 +:1001B000700074006F0072002000440075006D0034 +:1001C0007000650072000000080354004D004B00F1 +:1001D00000000403090409024200020100A03209E0 +:1001E0000400000103010100092111010001224066 +:1001F000000705810308000A09040100020300004A +:1002000000092111010001222200070582032000BC +:10021000010705020320000112011001000000087F +:10022000EDFE5B001408010200010631FF0974A114 +:10023000010975150026FF009520750881020976D1 +:10024000150026FF00952075089102C005010906DA +:10025000A101050719E029E7150025019508750199 +:100260008102950175088101050819012905950587 +:10027000750191029501750391010507190029FF88 +:10028000150026FF00950675088100C0120533058C +:1002900011241FBECFEFDAE0DEBFCDBF04B603FEF0 +:1002A00028C08091A4059091A505A091A605B091C4 +:1002B000A7058730904BA740B04BD9F41092A40506 +:1002C0001092A5051092A6051092A70514BE0FB6B0 +:1002D000F894A895809160008861809360001092E6 +:1002E00060000FBE1092010810920008E0E0F8E3F1 +:1002F000099511E0A0E0B1E0E0E6F2E402C005906B +:100300000D92AA38B107D9F725E0AAE8B1E001C0FB +:100310001D92A43AB207E1F711E0C8E4D1E004C0AD +:100320002197FE010E942821C634D107C9F70E94F7 +:1003300026150C942E210C940000FF93EF93E0916E +:100340008A01F0918B01309709F00995EF91FF91A7 +:100350000895FC018591803011F0EFDFFBCF089507 +:10036000FF27E0E230E247FF0CC0419597FF09C04C +:10037000EDE26095709580959095611D711D811DD0 +:10038000911D27FF02C0219530E350E2AA27660F96 +:10039000771F881F991FAA1FA41710F0A41B63952D +:1003A0005A95A9F7AA3008F0A95FA05DAF93F3951D +:1003B000611571058105910541F7ED3211F4EF9357 +:1003C000F395F21718F43F93F395FBCF8F91B5DFB8 +:1003D000FA95E1F70895E991F9918591803021F03E +:1003E000853219F0AADFF9CF089520E0E8945591FD +:1003F0005532C1F3503311F4689455915A3348F48F +:10040000505390F3220F022E220F220F200D250FA2 +:10041000F4CF0EF4219589919991533619F35337FE +:1004200029F1533559F1BC0188279927E8945C36A6 +:1004300021F48991999168945591543639F446EF95 +:100440007EF077FF0DC08FEF9FEF0AC055374AE06F +:1004500039F0583540E121F0523642E009F0089574 +:10046000FF93EF937DDFEF91FF91B7CFFF93EF9372 +:10047000FC0181918030B9F360DFFBCFFF93EF93F4 +:1004800068DFF1CFDF93CF93CDB7DEB72596A3DF3B +:10049000CF91DF9108951F926F939F938F9383E580 +:1004A00091E09F938F930E9442020F900F900F90C4 +:1004B0000F900F900F9008957F936F939F938F935A +:1004C00089E491E09F938F930E9442020F900F90D6 +:1004D0000F900F900F900F9008951F928F938AE3C3 +:1004E00091E09F938F930E9442020F900F900F9084 +:1004F0000F900895CF92DF92EF92FF920F931F9388 +:10050000CF93DF936C017B01C0E0D0E00FE211E0FC +:10051000CC15DD05ECF4CE018F709927892B19F0ED +:1005200088E391E004C0209721F085E391E00E94E8 +:10053000A901F70181917F011F928F931F930F9360 +:100540000E94420221960F900F900F900F90E0CFE3 +:100550008CE291E0DF91CF911F910F91FF90EF908E +:10056000DF90CF900C94A9018F929F92AF92BF928F +:10057000CF92EF920F93CF93DF93EA011F921F92D6 +:1005800020E931E03F932F9321E02F931F924A01FE +:100590005B0122E2C22EE12C06E021E840E0FC01F2 +:1005A000628181EA93E00E94090B60E971E0CE016B +:1005B0000E947A020F900F900F900F900F900F9063 +:1005C00080E0DF91CF910F91EF90CF90BF90AF90EF +:1005D0009F908F9008958F929F92AF92BF92CF92EB +:1005E000DF92EF92FF921F93CF93DF935C01EA01BA +:1005F00010E0CB0180579D4F7C0185E1C82E81E042 +:10060000D82ECE15DF0508F042C06981643049F06C +:1006100018F4613048F137C06530A9F1613219F042 +:1006200023C01A8130C088858F938F818F93812E4C +:10063000912C1F921F93DF92CF920E9442026E81F3 +:100640000F900F900F900F900F900F90623239F42F +:100650004F815885B401C5010E94B40214C085E1E0 +:1006600091E00E944B020FC08CE291E0DF91CF91AC +:100670001F91FF90EF90DF90CF90BF90AF909F9031 +:100680008F900C944B028881C80FD11DBACFDF9197 +:10069000CF911F91FF90EF90DF90CF90BF90AF90E0 +:1006A0009F908F9008956F927F928F929F92AF92BA +:1006B000BF92CF92DF92EF92FF920F931F93CF934F +:1006C000DF935C01862E912CC0E0D0E029E0622E01 +:1006D00021E0722E1C2F8C169D0609F443C0DF9377 +:1006E000CF937F926F920E94420290E9E92E92E0AE +:1006F000F92E0C2F29E030E040E0F501628181EA1B +:1007000093E00E94100C0F900F900F900F908111AA +:100710002AC0C0909202D0909302B6018FE391E07C +:100720000E945C029601F1E0CF16DF0610F020E097 +:1007300031E080E9E82E82E0F82E012F40E0F5015B +:10074000628181EA93E00E94100C219681110BC016 +:10075000B701C6010E947A02A701B601C5010E9435 +:10076000EB02B8CF80E0DF91CF911F910F91FF9006 +:10077000EF90DF90CF90BF90AF909F908F907F9041 +:100780006F9008950F931F93CF93DF93EC018A81AD +:100790001F928F9388EF90E09F938F930E94420265 +:1007A0008C811F928F9388EE90E09F938F930E948D +:1007B000420200E912E022E130E040E06A8181EA91 +:1007C00093E00E94E90B2DB73EB7285F3F4F0FB66D +:1007D000F8943EBF0FBE2DBF81110E946D02609143 +:1007E00098027091990284E491E00E945C02609109 +:1007F0009A0270919B028DE491E00E945C0281ED6F +:1008000090E00E94A90160E972E082E190E00E941C +:100810007A026091A102CE010E94530381110E94CD +:100820006D02E091A103F091A2030480F581E02D17 +:100830006A8181EA93E0DF91CF911F910F91099432 +:1008400008950E94A10590938F0180938E010895D1 +:1008500081E00895CF93DF9381EA93E00E94030E35 +:1008600081EA93E00E94F90690918C018917C9F002 +:1008700081EA93E00E94F90680938C011F928F9386 +:1008800080EC90E09F938F930E9442020F900F9014 +:100890000F900F9080910001811103C081E080933F +:1008A000000180918E0190918F010E94B905883BD3 +:1008B0009B40C8F081EA93E00E94F906803999F4E0 +:1008C00080910001882379F0CCEAD3E08A818823E3 +:1008D00019F0CE010E94C203259683E0C73FD807D6 +:1008E000A9F710920001DF91CF9108952E9A0895F3 +:1008F0002E988EBD0DB407FEFDCF1EBC0DB407FEB5 +:10090000FDCF0E9476048EB508952E9882608EBD2C +:100910000DB407FEFDCF6EBD0DB407FEFDCF0C94E8 +:10092000760488EF0E947804807C8034A1F018F46B +:10093000882301F10895803819F0803CB9F00895BA +:1009400088ED0E94780481FD0BC069EC88ED0E945F +:10095000850482E00CC088ED0E94780481FDF5CF0B +:100960006BEC88ED0E94850483E001C081E08093F8 +:100970008D01089561ED88ED0E94850410928D012E +:1009800008950F931F93CF93DF938C01269A0E94B3 +:100990007604219A229A2398209A80E58CBD81E0E2 +:1009A0008DBD259868E188E80E94850460E288E7AB +:1009B0000E94850460E088E70E948504C0E0D0E0E2 +:1009C00088E60E947804219680FD06C0CF3F8FEF15 +:1009D000D807B1F78FEF1DC061EC88ED0E94850448 +:1009E00060E680ED0E94850464E088EE0E94850444 +:1009F00088EE0E94780482FFFBCFC8010E94910418 +:100A000060E288EC0E94850461E080E80E94850431 +:100A100080E0DF91CF911F910F91089581EA93E0DB +:100A20000C94C10481EA93E00E94C90661EA73E074 +:100A300080E993E00C94601180E090E008958FEFDE +:100A40009FEF089581E090E008950895862F0E9419 +:100A50001A1381E090E00895FB0180810E941A132F +:100A600081E090E00895E8E1F4E01382128288EEDC +:100A700093E0A0E0B0E084839583A683B7838BE501 +:100A800091E0918380838FEF9FEF9587848708950E +:100A90000C94AD058F929F92AF92BF92CF92DF924E +:100AA000EF92FF920E9404204B015C0120E030E0B5 +:100AB0004AE755E40E94BB206B017C0120E030E056 +:100AC00040E85FE30E94D01F87FD24C020E03FEF95 +:100AD0004FE757E4C701B6010E94B6201816ACF4E0 +:100AE00020E030E040E251E4C501B4010E94BB20A7 +:100AF0000E94D51F20E931E06115710581F0C9011F +:100B00000197F1F761507109F7CFC701B6010E9453 +:100B1000D51F02C061E070E0CB010197F1F7FF90B3 +:100B2000EF90DF90CF90BF90AF909F908F900895FF +:100B300082E084BD93E095BD9AEF97BD80936E00EF +:100B400008952FB7F8948091680490916904A0915A +:100B50006A04B0916B042FBF08952FB7F894609189 +:100B600068047091690480916A0490916B042FBFAE +:100B700008959C014FB7F89480916804909169049E +:100B8000A0916A04B0916B044FBF821B930B089530 +:100B900078941F920F920FB60F9211248F939F9308 +:100BA000AF93BF938091680490916904A0916A0407 +:100BB000B0916B040196A11DB11D809368049093C0 +:100BC0006904A0936A04B0936B04BF91AF919F91A5 +:100BD0008F910F900FBE0F901F901895CF93DF93BA +:100BE000FC01862F8078A9F4283008F04DC04423FA +:100BF00021F09581973009F447C0EF01A1E0B0E002 +:100C00009D85992341F011962596A031B105C1F734 +:100C10003BC080E039C061111CC085E08A9FE001C3 +:100C20008B9FD00D1124CE0FDF1F442331F081E4C0 +:100C3000888785818F5F858302C081E0888725E072 +:100C40002A9FC0012B9F900D1124E80FF91F80856A +:100C50001BC06770660F660F660F442341F0606427 +:100C600085818F5F85838770687F682B03C02770BD +:100C7000687B622B25E02A9FC0012B9F900D1124D9 +:100C8000E80FF91F6087862FDF91CF9108956111DA +:100C900002C006960895FC0121E03585631739F0FE +:100CA0002F5F35962031C9F780E090E008950696D1 +:100CB00035E0239F800D911D11240895DF92EF925E +:100CC000FF920F931F93CF93DF93EC01E62EF12C4D +:100CD00085E0689FB0011124FE01E60FF71F8085B3 +:100CE000182F177086FF17C001E085E0D82EFE018F +:100CF000D09EE00DF11D1124808586958695869500 +:100D000087701817F9F00F5F003189F78D81811313 +:100D100002C011501D8385E08E9DF0018F9DF00D66 +:100D20001124EC0FFD1F108681E081871286229628 +:100D3000D783C683DF91CF911F910F91FF90EF90E2 +:100D4000DF900895602FCE010E945E06D0CFFC0197 +:100D5000613499F49C01255B3F4F61E0AC014E5F2B +:100D60005F4F158666871786548743873596E21747 +:100D7000F307B9F7FC011582089521E03585631763 +:100D800029F02F5F35962031C9F70895622F0C9412 +:100D90005E06FC018DE691E09183808315821086CA +:100DA00081E081871286CF01029697838683128223 +:100DB00028E023832CE32483DF019F01255B3F4F41 +:100DC00041E01D961C921D971E964C931E971F96F0 +:100DD0001C921F971C969C938E931B971596A21797 +:100DE000B30779F7EA58FF4F108281E180937004CE +:100DF0000895809170040895CF93C42F0E944706F0 +:100E0000009789F0DC01ED91FC911197309759F032 +:100E100013969C9180E0891731F020812C1731F0D6 +:100E200033968F5FF8CF80E090E001C0CF01CF9183 +:100E300008950F931F93CF93DF932115310571F020 +:100E4000E901042F162F0E944706FC01892B41F06F +:100E50001283D183C083038380E003C088ED01C087 +:100E600086EDDF91CF911F910F910895CF92DF9280 +:100E7000FF920F931F93CF93DF93662381F1F62E9A +:100E80008C016C0186E5C80ED11CC0E0D0E0D60113 +:100E90008D919D916D010097F1F0DC01ED91FC9138 +:100EA0000084F185E02D0995F81215C0AB96CC0FA2 +:100EB000DD1FC00FD11F88819981DC01ED91FC916C +:100EC0000480F581E02DDF91CF911F910F91FF906C +:100ED000DF90CF9009942196C031D105C1F680E012 +:100EE000DF91CF911F910F91FF90DF90CF900895E8 +:100EF0002E980895CF93C82F0E947807CEBD0DB4C9 +:100F000007FEFDCF1EBC0DB407FEFDCF0E94760488 +:100F10008EB5CF910895CF93DF93C82FD62F0E941F +:100F20007807C260CEBD0DB407FEFDCFDEBD0DB4A7 +:100F300007FEFDCFDF91CF910C9476048F929F92A4 +:100F4000AF92BF92CF92DF92EF92FF920F931F93D7 +:100F5000CF93DF93EC01D62EC42E59010E94470691 +:100F60007C01009709F445C0FC0180819181892BA7 +:100F700009F441C04C2D6D2DCE010E94FC06F501F7 +:100F8000918380830097C9F1FC01828186958695C3 +:100F900090E08031910514F08FE090E041E050E066 +:100FA00060E070E04A015B0104C0880C991CAA1C37 +:100FB000BB1C8A95D2F7D501C4010197F801918332 +:100FC00080836D2D80EE0E948B0788ED0E947A074A +:100FD000F7019481992331F0CA58DF4F688162602C +:100FE000682B02C0682F697F88ED0E948B0780E024 +:100FF00005C086ED03C087ED01C08BEDDF91CF9179 +:101000001F910F91FF90EF90DF90CF90BF90AF9026 +:101010009F908F9008958F929F92AF92BF92CF92A0 +:10102000DF92EF92FF920F931F93CF93DF93862E61 +:10103000942E59010E9448056B017C0128E8C20EDC +:1010400023E1D21EE11CF11C00E010E0D0E0C0E082 +:1010500098280E944805DC01CB018C199D09AE0936 +:10106000BF09B7FF2DC0692D80EF0E948B070E943A +:101070004805DC01CB018C199D09AE09BF09B7FFFA +:1010800009C088EC0E947A0787FFF1CF60E888ECFE +:101090000E948B0788EF0E947A07C82FCF70C43058 +:1010A00019F0CE3051F00CC00F5F1F4FA114B104E6 +:1010B00081F20A151B0569F603C0DF5FD33049F6DC +:1010C0008C2FDF91CF911F910F91FF90EF90DF90C8 +:1010D000CF90BF90AF909F908F9008959F92AF92C6 +:1010E000BF92CF92DF92EF92FF920F931F93CF9315 +:1010F000DF937C01D42F122F902E00E06C01C60EDE +:10110000D11CC60ED11C86E5C80ED11CA42EB12C54 +:10111000ABE2AA0EB11CAA0CBB1CAE0CBF1CF601A4 +:1011200080819181DC01ED91FC910280F381E02DC1 +:10113000292D412F6D2F0995803EC9F4D1110BC087 +:1011400061E088EE0E948B0766E670E080E090E048 +:101150000E944A0514C0F50180819181DC01ED9166 +:10116000FC910284F385E02D612F099508C08D3034 +:1011700021F4033008F03FC014C081113FC0F601D4 +:1011800080819181DC01ED91FC910190F081E02D55 +:10119000292D412F6D2F0995C82F8D3051F4033023 +:1011A00050F464E670E080E090E00E944A050F5F32 +:1011B000B6CF882311F1D1110BC061E088EE0E94F7 +:1011C0008B0766E670E080E090E00E944A0511C05F +:1011D000ED2FF0E0BB96EE0FFF1FEE0DFF1D80819F +:1011E0009181DC01ED91FC910284F385E02D612F6A +:1011F00009958C2F03C08DE001C080E0DF91CF9175 +:101200001F910F91FF90EF90DF90CF90BF90AF9024 +:101210009F9008950F931F93CF93DF93182F062F5E +:10122000EA010E94780712601EBDFE01802F88230C +:1012300039F00DB407FEFDCF91919EBD8150F7CFDF +:10124000C00FD11D0DB407FEFDCF0E947604CE0164 +:10125000DF91CF911F910F9108952F923F924F925E +:101260005F926F927F928F929F92AF92BF92CF9236 +:10127000DF92EF92FF920F931F93CF93DF9300D0F3 +:1012800000D01F92CDB7DEB77D836C834A01690120 +:10129000FB01F1808FEF8F0D803408F067C00E9452 +:1012A00048052B013C01F8E84F0EF3E15F1E611C7D +:1012B000711CEC81FD81828180FD02C060E401C06F +:1012C00060E888EE0E948B07312C8F2D90E09A8386 +:1012D0008983C114D104B1F1E980FA80CE14DF040E +:1012E00008F47601EB82A8016E2D80E10E940A09C4 +:1012F0006E2D88E30E948B07EC81FD816081606226 +:1013000080EF0E948B0788EC0E947A0787FFFBCF53 +:1013100060E888EC0E948B0788EF0E947A078F7044 +:10132000382EA12CB12C212C332009F472C00E943C +:101330004805DC01CB0184199509A609B709B7FF57 +:1013400068C016C0332021F060E088E30E948B075C +:1013500088EF0E947A0785FB882780F9EC81FD8160 +:10136000928180FB90F99283832D58C08AED56C0FC +:10137000F6E03F1239C088EF0E947A0785FB882784 +:1013800080F991E08927EC81FD81928180FB90F9C1 +:10139000928390FD02C060E401C060E888EE0E9484 +:1013A0008B0760E088E30E948B07F801608180E191 +:1013B0000E948B076B8188E30E948B07EC81FD8183 +:1013C0006081606280EF0E948B0788EC0E947A0740 +:1013D00087FFFBCF60E888EC0E948B0788EF0E94B4 +:1013E0007A078F70382EA0CF2EE0321205C02394DA +:1013F00023E02212D6CFA8CF84E03812A5CFFFEF8A +:10140000AF1ABF0A8114910461F2A814B90449F615 +:101410009BCFCE18DF080E0D1F1D5BCF0F900F90D6 +:101420000F900F900F90DF91CF911F910F91FF9030 +:10143000EF90DF90CF90BF90AF909F908F907F9074 +:101440006F905F904F903F902F9008952F923F9212 +:101450004F925F926F927F928F929F92AF92BF92C4 +:10146000CF92DF92EF92FF920F931F93CF93DF9370 +:10147000CDB7DEB72A970FB6F894DEBF0FBECDBF4B +:101480001C016B015B834A835901D9016D907C90EB +:101490001197FB01F181F9831D921C92DB011296D9 +:1014A0008C9181FD02C060E101C060E288EE0E9483 +:1014B0008B078E2D90E0A0E0B0E08C839D83AE83FF +:1014C000BF8368862A813B81D6014C9160E0C101CF +:1014D0000E940B08F82EB6E08B1318C088EF0E940C +:1014E0007A0782958170E1E08E27D60112969C9151 +:1014F000129780FB91F912969C9391FD02C060E1D6 +:1015000001C060E288EE0E948B07DCCF811167C0CA +:1015100088EC0E947A0782FF60C080E30E947A070D +:10152000582E90E06816790608F45884F5018081F9 +:1015300091819301281B390B3A87298737FF02C015 +:101540001A861986852C912C89859A858816990684 +:1015500014F49A86898649840E94780798E09EBD93 +:101560000DB407FEFDCFF801442041F01EBC4A94A3 +:101570000DB407FEFDCF8EB58193F6CFA985BA8550 +:101580000A0F1B1F0E94760464E088EC0E948B0700 +:10159000F50180819181880E991E91828082F98166 +:1015A0005F1618F08614970470F088EF0E947A078F +:1015B00082958170D60112969C91129780FB91F9C9 +:1015C00012969C930CC0EE2009F47CCF6C817D8137 +:1015D0008E819F810E944A0575CF80EFF82E8F2D56 +:1015E0002A960FB6F894DEBF0FBECDBFDF91CF9124 +:1015F0001F910F91FF90EF90DF90CF90BF90AF9031 +:101600009F908F907F906F905F904F903F902F9022 +:1016100008952F923F924F925F926F927F928F9296 +:101620009F92AF92BF92CF92DF92EF92FF920F9371 +:101630001F93CF93DF93CDB7DEB761970FB6F894C2 +:10164000DEBF0FBECDBF3C01F42E322E202EC98A44 +:101650004EA05FA0C8A4D9A4188A1F861E861D8626 +:101660008E01035F1F4F9E01215F3F4F0E949E0727 +:10167000811196C039822A82EB8289898C83BE824D +:10168000AD8298868F82AE014F5F5F4F68E080E247 +:101690000E940A092D853E854F2D60E1C3010E94FD +:1016A0000B08E82E811178C0932D9078392EC11443 +:1016B000D10409F462C0EF85F8898281992309F485 +:1016C0004DC082608283540122242394A114B1046A +:1016D00009F458C05C864B864D855E856F85788998 +:1016E000E12C86019E01255F3F4FC3010E94260A1F +:1016F000E82EA6E08A130FC00F85188988EF0E9494 +:101700007A0785FB882780F98225F801928180FB82 +:1017100091F99283DBCF81113FC08AA59BA50097E9 +:10172000A1F0DC01ED91FC9111970190F081E02D89 +:10173000C4018A199B099A8789876B857C859E01DC +:10174000275F3F4FA601CD0109958B859C85A81A7F +:10175000B90A8415950508F0B9CF0FC0816082835E +:101760004D855E8586019201BF01C3010E942D094E +:10177000811116C02D853E8511C02D853E85311005 +:1017800005C00CC0E11008C02D853E8560EA4F2DD4 +:10179000C3010E940B0804C08E2D02C060E8F7CF81 +:1017A00061960FB6F894DEBF0FBECDBFDF91CF912B +:1017B0001F910F91FF90EF90DF90CF90BF90AF906F +:1017C0009F908F907F906F905F904F903F902F9061 +:1017D00008958F929F92AF92BF92CF92EF920F9304 +:1017E0001F931F921F921F930F933F932F934901B3 +:1017F000A12CB12CCC24C394E12C06E020E80E945B +:10180000090B0F900F900F900F900F900F901F915A +:101810000F91EF90CF90BF90AF909F908F900895D1 +:101820008F929F92AF92BF92CF92EF92FF920F93BF +:101830001F921F92FF92EF923F932F934901A12C89 +:10184000B12C22E0C22EE02E06E020E80E94090B17 +:101850000F900F900F900F900F900F900F91FF909F +:10186000EF90CF90BF90AF909F908F9008958F9200 +:101870009F92AF92BF92CF92EF920F93CF931F920E +:101880001F921F921F921F921F92812C912CA12CAC +:10189000B12CC12CE22E05E020E00E94090BC82FDC +:1018A0006CE271E080E090E00E944A050F900F909A +:1018B0000F900F900F900F908C2FCF910F91EF9072 +:1018C000CF90BF90AF909F908F9008950F931F93EC +:1018D000CF93DF938A3F3FEF930711F486ED2DC03E +:1018E000DC011696ED91FC911797EF2B09F1122F61 +:1018F000242FEC011A8740E00E94EE05082F882370 +:10190000C9F0682FCE010E944706009739F3FC0109 +:101910001483202F40E060E0CE010E94370C182F86 +:10192000882351F0602FCE010E94A706812F05C0A9 +:1019300087ED03C084ED01C080E0DF91CF911F915E +:101940000F9108952F923F924F925F926F927F92E4 +:101950008F929F92AF92BF92CF92DF92EF92FF92BF +:101960000F931F93CF93DF93CDB7DEB766970FB674 +:10197000F894DEBF0FBECDBF1B8A38E03C8B3CE342 +:101980003D8B8A3F3FEF930709F464C0522E342EFB +:10199000462E7C01DC011696CD90DC901797CE0187 +:1019A000439617969C938E9316971A962C938E01B6 +:1019B0000F5F1F4F22E130E040E060E0C7010E946E +:1019C000E90BF701D782C6828111A6C089849A8467 +:1019D0006B847C84FD81FE8B2E80670136E5C30E0F +:1019E000D11C560110E0D5018D919C910097F1F129 +:1019F000DC01ED91FC910084F185E02D09958111C8 +:101A000035C0F50180819181DC01ED91FC91008868 +:101A1000F189E02D622D0995882341F1F50180813E +:101A20009181DC01ED91FC910484F585E02DA30109 +:101A3000B4010995811110C0F50180819181DC010B +:101A4000ED91FC910684F785E02D6E890995811151 +:101A500003C00CC086ED60C0052D232D442D612FE1 +:101A6000C7010E946E08813D09F056C01F5FB2E0B9 +:101A7000AB0EB11C103109F0B6CF10E0F601808139 +:101A800091810097E1F1DC01ED91FC910084F185F9 +:101A9000E02D0995811133C0F60180819181DC012F +:101AA000ED91FC910088F189E02D622D0995882344 +:101AB000D9F0F60180819181DC01ED91FC910484E3 +:101AC000F585E02DA301B4010995811118C0F60137 +:101AD00080819181DC01ED91FC910684F785E02DF8 +:101AE0006E89099581110BC0052D232D442D612F81 +:101AF000C7010E946E08982F977F913D69F41F5F80 +:101B0000E2E0CE0ED11C103109F0B8CF252D432DC7 +:101B1000642DC7010E94660C66960FB6F894DEBF6E +:101B20000FBECDBFDF91CF911F910F91FF90EF902E +:101B3000DF90CF90BF90AF909F908F907F906F90ED +:101B40005F904F903F902F9008958F929F92AF9209 +:101B5000BF92CF92EF920F931F921F921F921F92EC +:101B60001F921F92812C912CA12CB12CC12CE22E02 +:101B700009E020E00E94090B0F900F900F900F904A +:101B80000F900F900F91EF90CF90BF90AF909F90DC +:101B90008F9008958F929F92AF92BF92CF92DF92D3 +:101BA000EF920F931F93CF93DF9300D000D0CDB768 +:101BB000DEB76C01590148011C821B821A8219820E +:101BC0008E010F5F1F4F9E012D5F3F4F0E949E07AA +:101BD000811109C049815A816B817C818401950101 +:101BE000C6010E94260A0F900F900F900F90DF9170 +:101BF000CF911F910F91EF90DF90CF90BF90AF905A +:101C00009F908F900895AF92BF92CF92DF92EF9204 +:101C1000FF920F931F93CF938C011D990EC088ECF8 +:101C20000E947A0785FF05C0C8010E94910460E206 +:101C300001C060E088EC0E948B0780918D018130AB +:101C400039F040F0823079F0833039F5C1E00CC0D2 +:101C500083E106C080917004807F8031F1F081E1E2 +:101C6000809370041AC0C0E080917004807F80313E +:101C7000A9F40E944805DC01CB0188539F4FAF4F68 +:101C8000BF4F80936C0490936D04A0936E04B09347 +:101C90006F0480E28093700401C0C0E0780186E5A3 +:101CA000E80EF11C6801A6E7CA0ED11C5701F50128 +:101CB000819191915F01009739F0DC01ED91FC91E8 +:101CC0000680F781E02D0995AC14BD0481F7809161 +:101CD0007004803409F43FC050F4803221F1803325 +:101CE000A1F1813109F082C0F60110820AC081356C +:101CF00009F458C0803809F46AC0803509F076C00C +:101D000039C0D7018D919D917D01009739F0DC019B +:101D1000ED91FC910480F581E02D0995EC14FD0412 +:101D200081F782E161C00E94480500916C04109126 +:101D30006D0420916E0430916F04DC01CB01801B97 +:101D4000910BA20BB30BB7FD51C061E088EE0E946E +:101D50008B0780E449C088EE0E947A0780FD46C068 +:101D600088ED0E947A07682F686088ED0E948B07D3 +:101D700080E53AC088EC0E947A0786FF37C081E58B +:101D8000809370040E944805DC01CB014496A11D9C +:101D9000B11D80936C0490936D04A0936E04B09376 +:101DA0006F0424C00E944805C0906C04D0906D045C +:101DB000E0906E04F0906F04DC01CB018C199D095A +:101DC000AE09BF09B7FD12C080E8809370042C2FC4 +:101DD00040E060E0C8010E94A20C882321F0823D0F +:101DE00029F080EA01C080E980937004CF911F91AF +:101DF0000F91FF90EF90DF90CF90BF90AF9008953C +:101E000080E0089580E0089581E00895FC018285D6 +:101E1000089581E0693009F080E00895CF93DF9361 +:101E2000EC018A819B81DC01ED91FC910480F581BC +:101E3000E02D6A8509958A85813439F4EA81FB8130 +:101E4000EA58FF4F8081846080831A861B861C8637 +:101E50001D861E861F86188A80E0DF91CF91089527 +:101E60008F929F92AF92BF92CF92EF920F93A42E38 +:101E7000B12CB22A1F921F921F921F921F921F9283 +:101E8000812C912CC12CE62E01E023E240E0FC01E4 +:101E90006285828193810E94090B0F900F900F90B1 +:101EA0000F900F900F900F91EF90CF90BF90AF9049 +:101EB0009F908F9008958F929F92AF92BF92CF92F2 +:101EC000EF920F93A62EB12C1F921F923F932F9348 +:101ED0005F934F934A01C12CE12C00E023EA40E0DC +:101EE000FC016285828193810E94090B0F900F9003 +:101EF0000F900F900F900F900F91EF90CF90BF9099 +:101F0000AF909F908F9008958F929F92AF92BF92C3 +:101F1000CF92EF920F93A42EB12CB22A1F921F9250 +:101F20001F921F921F921F92812C912CC12CE62E82 +:101F300003E023E240E0FC016285828193810E94FC +:101F4000090B0F900F900F900F900F900F900F9123 +:101F5000EF90CF90BF90AF909F908F9008952F9269 +:101F60003F924F925F926F927F928F929F92AF9229 +:101F7000BF92CF92DF92EF92FF920F931F93CF9376 +:101F8000DF93CDB7DEB7E8970FB6F894DEBF0FBE8C +:101F9000CDBFDC011A963C91311107C1122F242EBE +:101FA000362E3C01FC01C280D380D601ED91FC911C +:101FB0000190F081E02D60E0C60109957C01009759 +:101FC00009F4F5C0FC01A080B180A114B10409F4AA +:101FD000F0C04301F4E08F0E911CDC0111969C923D +:101FE0008E9214961C93FE0131962F018F0128E0EA +:101FF00030E040E060E0D30112968D919C91139700 +:102000000E94E90BF70114828111D9C08D818930BA +:1020100009F0D1C00981D601ED91FC910280F381D4 +:10202000E02D222D41E0632DC6010995F301828741 +:10203000882309F4C2C098859583282F40E060E08A +:10204000828193810E94370C182F882389F0D70151 +:10205000AD92BC92D601ED91FC910480F581E02D0A +:10206000D3011A966C91C6010995F3011286ABC093 +:10207000202F013208F020E2D701AD92BC9221114D +:102080000BC0940142E0F3016285828193810E943A +:102090001907811197C010C030E0820140E0D301E0 +:1020A0001A966C911A9712968D919C9113970E9493 +:1020B000E90B811187C0E5CF1F921F925F924F926B +:1020C0001F9288E08F9388E0882E912CA12CB12C50 +:1020D00099E2C92EE12C06E020EA40E0F301628596 +:1020E000828193810E94090B182F0F900F900F90FF +:1020F0000F900F900F90811166C08B81D3011B96BA +:102100008C931B97720100E028E030E040E01A96C3 +:102110006C911A9712968D919C9113970E94100CB6 +:10212000811150C02B813C8140E0F30162858281A6 +:1021300093810E94100C811145C0298130E0CE01AD +:1021400081967C0140E0D3011A966C911A97129601 +:102150008D919C9113970E94100C811133C02E8198 +:1021600040E0F3016285828193810E94A50D811177 +:1021700029C001E0D3011B968C91801740F020E02C +:10218000402F68E0C3010E94840F0F5FF3CFD3019B +:102190001296ED91FC911397EA58FF4F808184606D +:1021A000808381E050968C930EC019ED0CC016ED23 +:1021B0000AC017ED08C011ED06C014ED04C0F70108 +:1021C000B182A082182F812FE8960FB6F894DEBF57 +:1021D0000FBECDBFDF91CF911F910F91FF90EF9078 +:1021E000DF90CF90BF90AF909F908F907F906F9037 +:1021F0005F904F903F902F900895CF92DF92FF9283 +:102200000F931F93CF93DF9300D000D0CDB7DEB7ED +:102210008C01F62E19821A821B821C8220E0462F26 +:1022200061E10E94300F20E04F2D60E1C8010E9463 +:10223000300F20E04F2D64E0C8010E94840F83E03E +:10224000C82ED12C9E012F5F3F4F44E050E06F2DF0 +:10225000C8010E945B0F8823F1F020E04F2D64E15C +:10226000C8010E94300F20E04F2D60E1C8010E949C +:10227000300F64E170E080E090E00E944A050F902A +:102280000F900F900F90DF91CF911F910F91FF90C2 +:10229000DF90CF90089589819A81AB81BC819D7F29 +:1022A00083309140A041B105C1F264E670E080E066 +:1022B00090E00E944A0581E0C81AD10819F6CDCFF6 +:1022C000FC0187E791E091838083738362831286A8 +:1022D00013861486158616861786108A148288E05F +:1022E00085839CE3968391E09783808784E0818750 +:1022F00061157105B1F0DB01AA5ABF4F80E090E093 +:102300002D913D91232B49F48B96880F991FDB016A +:10231000A80FB91FED93FC930895019680319105A4 +:1023200079F70895EF92FF920F931F93CF938C014B +:10233000C62F7A01FA0180819181A281B381813017 +:10234000F3E09F07F1E0AF07B105D1F060F481152C +:10235000E1E09E07AE07B10571F181309140A140E7 +:10236000B10571F064C0833021E0920720E1A2073B +:10237000B105E1F183309340A041B105B9F157C0F7 +:1023800080917104811153C020E04C2F61E1C8019C +:102390000E94300F20E04C2F60E1C8010E94300FF6 +:1023A00020E04C2F64E0C8010E94840F81E08093FC +:1023B000710481EB3DC020E0462F61E1C8010E941D +:1023C000300F20E04C2F60E1C8010E94300F1092C6 +:1023D0007104F80162856770C770660F660F660F3B +:1023E0006C2B828193810E94360721C020E04C2F04 +:1023F00064E1C8010E94300F20E04C2F60E1C80169 +:102400000E94300F64E170E080E090E00E944A0595 +:10241000F8016285F70121812695217067704C2FA4 +:10242000F801828193810E94A20C1092710480E0D5 +:10243000CF911F910F91FF90EF900895CF92DF926F +:10244000EF920F931F93CF93DF93CDB7DEB72E9705 +:102450000FB6F894DEBF0FBECDBF6C0181E090E0F7 +:102460009E878D87E12C8E010F5F1F4F9E01235F9A +:102470003F4F41E0F6016285828193810E94CA0D3F +:10248000811151C002E011E089818023D1F01986C9 +:102490001A861B861C869E01275F3F4F44E050E052 +:1024A000612FC6010E945B0F81110BC0AE01475F17 +:1024B0005F4F612FC6010E949211813B99F18111FA +:1024C00032C0000F1F5F1830F9F611E0F601838566 +:1024D000811740F119861A861B861C869E01275F8C +:1024E0003F4F44E050E0612FC6010E945B0F811115 +:1024F00017C089859A85877091708130914081F4E9 +:102500008B859C8581609C878B87AE01475F5F4F81 +:10251000612FC6010E949211813B21F0811103C0FD +:102520001F5FD4CF80E02E960FB6F894DEBF0FBEAB +:10253000CDBFDF91CF911F910F91EF90DF90CF90A2 +:1025400008950F931F93CF93DF93FC0120892111EE +:1025500002C080E020C0EC010E9448050C851D856A +:102560002E853F85DC01CB01801B910BA20BB30BA9 +:10257000B7FDEFCFCE010E941E12182F0E94480512 +:10258000DC01CB018C599F4FAF4FBF4F8C879D878C +:10259000AE87BF87812FDF91CF911F910F91089553 +:1025A00080917E05089508950895CF93DF9320913B +:1025B0009B05243049F521E02093E90021E82150D2 +:1025C00059F03091E80035FD07C0EFE3F1E03197B5 +:1025D000F1F700C00000F3CF2091E80025FF14C000 +:1025E000EC0140E050E068E070E00E94D816809175 +:1025F000E8008E778093E80088E0FE01A6E7B5E06A +:1026000001900D928A95E1F7DF91CF910895CF93D4 +:10261000C0917404C1110BC00E94AD05643C7940A7 +:102620008105910520F081E080937404C1E08C2F36 +:10263000CF910895FF920F931F93CF93DF93D82FDD +:102640000FB607FE83C080919B05843081F0809196 +:10265000040190E001962091060130E0822393234B +:102660002091050130E08217930709F0CDC00E9448 +:102670000713811110C08091040190E00196209110 +:10268000060130E0822393232091050130E0821778 +:10269000930709F0B9C00E94A1058C01C091E9001F +:1026A000CF709091EC00892F817090FD80E8C82B4D +:1026B00082E08093E90085E0F82E8091EB0085FDB3 +:1026C00042C08091EB0080FF3EC08091EE0087FF0A +:1026D0003AC08091050190910401981709F457C000 +:1026E0009091E80095FF8EC0E0910201F091030106 +:1026F000E80FF11D20818F5F90910601892380935F +:1027000005012093F1008091E80085FDE2CF8091E2 +:10271000E80080FFDECF8091E8008E778093E800AC +:10272000F0920101D6CF8091040190E001962091B2 +:10273000060130E0822393232091050130E08217C7 +:10274000930709F44CC0CF70C093E9004091040195 +:10275000842F90E001962091060130E0822393239C +:102760002091050130E08217930709F450C0E091F1 +:102770000201F0910301E40FF11DD0838091040167 +:102780008F5F9091060189238093040140C080915E +:10279000E80085FF37C0D093F10021E03091F300CD +:1027A0008091F20090E0932B892B91F08091E800CA +:1027B00080FF0EC08091E80085FF03C01092F100F9 +:1027C000F9CF8091E8008E778093E800F0920101C4 +:1027D000222309F4A8CFCF70C093E90018C08091DC +:1027E0000101882309F4AFCF0E94A1059C01801745 +:1027F000910711F4890161CF90910101915090935B +:102800000101F8CF20E0CACF40910401B0CF80E0B1 +:10281000DF91CF911F910F91FF90089508958091BE +:102820009A05811104C00E9442190C949F190895C1 +:1028300010929A050895089542E061EC81E00E94AB +:10284000511642E261EC82E00C94511680919D0594 +:10285000833009F453C030F4813071F0823009F4D0 +:10286000BAC008958A3009F4A6C08B3009F478C044 +:10287000893009F0C8C020C080919C05813A09F0D8 +:10288000C2C08091E800877F8093E8008091A00516 +:102890009091A105892B21F468E086E795E003C0BB +:1028A00060E080E090E070E00E9423178091E800F3 +:1028B0008B778093E800089580919C05813209F020 +:1028C000A2C08091A0059091A105892B09F09BC021 +:1028D0008091E800877F8093E8008091E80082FD86 +:1028E00005C080919B058111F8CF8DC08091F100CA +:1028F00080937E058091E8008B7781C080919C0554 +:10290000813A09F080C08091A0059091A105892BA2 +:10291000A1F48091E800877F8093E8008091E8002F +:1029200080FFFCCF809112018093F1008091E8003C +:102930008E778093E8000E9486168091A005909182 +:10294000A105892B09F05FC08091E800877F809303 +:10295000E8008091E80080FFFCCF809111014AC01F +:1029600080919C05813209F04EC08091A005909124 +:10297000A105892B69F48091E800877F8093E800A6 +:102980000E94861680919E05809312010E944C1C25 +:102990008091A0059091A105892BA9F58091E8006F +:1029A000877F8093E8000E94861680919E05809321 +:1029B00011010C944C1C80919C05813221F5809171 +:1029C000E800877F8093E8000E94861680919F052B +:1029D00080937F05089580919C05813AA1F48091B0 +:1029E000E800877F8093E8008091E80080FFFCCFBB +:1029F00080917F058093F1008091E8008E7780932D +:102A0000E8000C948616089580917E0580937504E5 +:102A100010927E050E945B1B0C944C1C0C940415B8 +:102A20000E94791E80919905882329F00E94A21E98 +:102A300081110C943B1608950E94AA1E8091750482 +:102A400080937E0508950C941C150895CF9384B748 +:102A5000877F84BF0FB6F894A89580916000886145 +:102A600080936000109260000FBE90E080E80FB687 +:102A7000F89480936100909361000FBE8AE193E126 +:102A80000E94111E87E091E00E94D41A83E891E031 +:102A90000E94A9010E940E050E941C1B0E9442195F +:102AA0000E949F1978940E941E1B80919B05843080 +:102AB00019F00E942515F9CF81E791E00E94A90144 +:102AC0000E9421048FE591E00E94A901C2E080915B +:102AD0009B05853019F40E941015F9CF0E94221B26 +:102AE0002091E4003091E50080917204909173048C +:102AF0002817390761F38091E4009091E5009093E5 +:102B00007304809372040E940713882301F3809159 +:102B10009B058430E1F68091E9008F702091EC00F4 +:102B2000922F917020FD90E8892BC093E90090913D +:102B3000EB0090FF43C09091EE0097FF3FC0909153 +:102B4000050120910401291709F12091E80025FFD2 +:102B50001DC0E0910201F0910301E90FF11D3081E8 +:102B60009F5F209106019223909305013093F1001D +:102B70009091E80095FDE3CF9091E80090FFDFCFC2 +:102B80009091E8009E779093E800D9CF9091F30060 +:102B90002091F20030E0392B232B81F09091E80056 +:102BA00090FF0CC09091E80095FF03C01092F100D7 +:102BB000F9CF9091E8009E779093E8008F70809312 +:102BC000E90085CF292F332723303105C9F060F480 +:102BD0002130310581F02230310509F044C082E412 +:102BE00090E026ED31E043C021323105E1F02232A0 +:102BF000310549F138C082E190E028E132E037C088 +:102C000099278130910549F028F0029761F5EAE9AA +:102C1000F1E005C0E2EDF1E002C0E8ECF1E0849102 +:102C200090E09F0124C06115710541F0613071058C +:102C3000D1F489E090E021E032E019C089E090E031 +:102C400028EE31E014C06115710541F06130710565 +:102C500051F482E290E02AE232E009C080E490E0A0 +:102C60002CE432E004C080E090E020E030E0FA01A3 +:102C700031832083089580E189BD82E189BD09B453 +:102C800000FEFDCF8091D8008F7D8093D800809189 +:102C9000E00082608093E0008091E00081FDFCCF45 +:102CA0000895982F973068F59093E900981739F0B8 +:102CB0007091EC002091ED005091F00003C0242FA2 +:102CC000762F50E021FD02C09F5FECCF3091EB00EA +:102CD0003E7F3093EB003091ED003D7F3093ED006F +:102CE0003091EB0031603093EB007093EC00209357 +:102CF000ED005093F0002091EE0027FDE5CF80E03D +:102D000008958F708093E90081E0089580919C057B +:102D100087FF11C08091E80082FD05C080919B056E +:102D20008111F8CF11C08091E8008B770BC08091A2 +:102D30009B05882349F08091E80080FFF8CF8091BF +:102D4000E8008E778093E80008952091E4003091A8 +:102D5000E50095E64091EC00842F817040FF23C090 +:102D60008091E80080FD1DC080919B05882399F02B +:102D7000853099F08091EB0085FD11C04091E40011 +:102D80005091E5002417350729F3915011F09A016D +:102D9000E1CF84E0089582E0089583E0089581E022 +:102DA000089580E008954091E80042FFDDCF089546 +:102DB000CF92DF92EF92FF920F931F93CF93DF9307 +:102DC000EC018B017A010E94A516811133C0E11438 +:102DD000F10439F0F70180819181081B190BC80FAC +:102DE000D91FC12CD12C0115110519F18091E800D2 +:102DF00085FD16C08091E8008E778093E800E1148D +:102E0000F10449F0F70180819181C80ED91ED18269 +:102E1000C08285E00FC00E94A516882321F30AC056 +:102E200089918093F10001501109FFEFCF1ADF0A59 +:102E3000DACF80E0DF91CF911F910F91FF90EF905B +:102E4000DF90CF9008952091A2053091A305261719 +:102E5000370748F06115710539F42091E8002E77A5 +:102E60002093E80001C0B901FC0120E06115710563 +:102E700079F180919B058823F1F18530F1F1809102 +:102E8000E80083FD3CC08091E80082FD2EC0809167 +:102E9000E80080FFEBCF2091F3008091F20090E0FA +:102EA000922B6115710551F08830910538F421910C +:102EB0002093F100615071090196F3CF21E008974A +:102EC00009F020E08091E8008E778093E800CECF73 +:102ED0002111CFCF0AC080919B05882361F08530F6 +:102EE00061F08091E80083FD0AC08091E80082FFD4 +:102EF000F2CF80E0089582E0089583E0089581E0B4 +:102F000008952091A2053091A3052617370748F0B0 +:102F10006115710539F42091E8002E772093E800BF +:102F200001C0B901FC0120E06115710591F18091AA +:102F30009B05882309F440C0853009F43FC0809187 +:102F4000E80083FD3DC08091E80082FD2FC08091A4 +:102F5000E80080FFE9CF2091F3008091F20090E03B +:102F6000922B6115710559F08830910540F4249138 +:102F70002093F1003196615071090196F2CF21E062 +:102F8000089709F020E08091E8008E778093E800B0 +:102F9000CBCF2111CCCF0AC080919B05882361F053 +:102FA000853061F08091E80083FD0AC08091E800DF +:102FB00082FFF2CF80E0089582E0089583E00895D3 +:102FC00081E008951F93CF93DF93CDB7DEB7AA9723 +:102FD0000FB6F894DEBF0FBECDBFECE9F5E08091EF +:102FE000F100819325E0E43AF207C9F70E94261424 +:102FF0008091E80083FF2EC180919C0590919D05F2 +:10300000492F50E04A30510508F024C1FA01EA5A2C +:10301000FF4F0C942821803821F0823809F01AC122 +:1030200008C08091980590919905992389F0826054 +:103030000FC08091A0058F70873008F00BC180937E +:10304000E9008091EB0085FB882780F91092E90068 +:103050009091E800977F9093E8008093F1001092A0 +:10306000F100D1C0282F2D7F09F0F4C0882319F07A +:10307000823061F0EFC080919E05813009F0EAC096 +:10308000933009F080E0809399052EC080919E05D1 +:1030900081112AC08091A0058F702FEF280F263054 +:1030A00008F0D8C08093E9002091EB0020FF1CC0FD +:1030B000933021F48091EB00806214C09091EB007A +:1030C00090619093EB0021E030E0A90102C0440F31 +:1030D000551F8A95E2F74093EA001092EA0080912A +:1030E000EB0088608093EB001092E9008091E8008B +:1030F000877F8093E8000E948616ACC08111AAC029 +:1031000010919E051F778091E3008078812B80933A +:10311000E3008091E800877F8093E8000E94861694 +:103120008091E80080FFFCCF8091E300806880936D +:10313000E300111102C082E001C083E080939B058F +:1031400089C08058823008F085C080919E0590919A +:103150009F058C3D53E0950779F583E08A838AE2E9 +:1031600089834FB7F894DE01139620E03EE051E2E8 +:10317000E32FF0E050935700E49120FF03C0E29565 +:10318000EF703F5FEF708E2F90E0EA3010F0C7963F +:1031900001C0C0968D939D932F5F243149F74FBF97 +:1031A0008091E800877F8093E8006AE270E0CE01BA +:1031B00001960E94231716C06091A0057091A10589 +:1031C000AE014F5F5F4F0E94E215BC01892B09F4ED +:1031D00041C09091E800977F9093E80089819A819F +:1031E0000E9481178091E8008B778093E80032C0BD +:1031F000803881F58091E800877F8093E800809196 +:1032000097058093F1008091E8008E7772CF81114D +:1032100021C080919E0590919F0599270297D4F433 +:103220008091E800877F8093E80080919E058093DD +:1032300097050E94861680919705811106C080919E +:10324000E30087FD02C081E001C084E080939B051C +:103250000E941C148091E80083FF0AC08091E8005E +:10326000877F8093E8008091EB0080628093EB0081 +:10327000AA960FB6F894DEBF0FBECDBFDF91CF91F7 +:103280001F9108950E94B0190E94B819E0EEF0E075 +:10329000808181608083E8EDF0E080818F7780839A +:1032A00019BCA7EDB0E08C918E7F8C9380818F7ECE +:1032B000808310929A0508950F931F93CF93DF9305 +:1032C0000E94B0190E94B819C8EDD0E088818F77AC +:1032D000888388818068888388818F7D888319BCF2 +:1032E00010929B05109297051092990510929805DF +:1032F00000EE10E0F80180818B7F808388818160FF +:10330000888342E060E080E00E945116E1EEF0E048 +:1033100080818E7F8083E2EEF0E080818160808317 +:10332000808188608083F80180818E7F808388819E +:1033300080618883DF91CF911F910F910895E8ED0F +:10334000F0E080818F7E8083E7EDF0E08081816016 +:10335000808384E082BF81E080939A050C945C199D +:10336000E8EDF0E080818E7F80831092E200089586 +:103370001092DA001092E10008951F920F920FB69A +:103380000F9211242F933F934F935F936F937F93EB +:103390008F939F93AF93BF93EF93FF938091E1003F +:1033A00082FF0BC08091E20082FF07C08091E100A4 +:1033B0008B7F8093E1000E94D31A8091DA0080FF16 +:1033C0001FC08091D80080FF1BC08091DA008E7FE3 +:1033D0008093DA008091D90080FF0DC080E189BD23 +:1033E00082E189BD09B400FEFDCF81E080939B0599 +:1033F0000E940F1405C019BC10929B050E9418145E +:103400008091E10080FF19C08091E20080FF15C02B +:103410008091E2008E7F8093E2008091E2008061E3 +:103420008093E2008091D80080628093D80019BC1C +:1034300085E080939B050E940E158091E10084FF3A +:1034400030C08091E20084FF2CC080E189BD82E120 +:1034500089BD09B400FEFDCF8091D8008F7D809397 +:10346000D8008091E1008F7E8093E1008091E2009E +:103470008F7E8093E2008091E20081608093E20081 +:1034800080919705882311F084E007C08091E300C4 +:1034900087FD02C081E001C083E080939B050E940C +:1034A00023158091E10083FF29C08091E20083FF12 +:1034B00025C08091E100877F8093E10082E08093C6 +:1034C0009B05109297058091E1008E7F8093E1002B +:1034D0008091E2008E7F8093E2008091E200806123 +:1034E0008093E20042E060E080E00E94511680910B +:1034F000F00088608093F0000E941B14FF91EF9110 +:10350000BF91AF919F918F917F916F915F914F91FB +:103510003F912F910F900FBE0F901F9018951F9203 +:103520000F920FB60F9211242F933F934F935F93F7 +:103530006F937F938F939F93AF93BF93CF93DF93BB +:10354000EF93FF93C091E900CF708091EC00D82FEA +:10355000D17080FDD0E81092E9008091F000877F63 +:103560008093F00078940E94E2171092E900809115 +:10357000F00088608093F000CD2BCF70C093E900FD +:10358000FF91EF91DF91CF91BF91AF919F918F917B +:103590007F916F915F914F913F912F910F900FBE4F +:1035A0000F901F901895089590938505809384053A +:1035B0000895E0918405F0918505309721F0019000 +:1035C000F081E02D099480E00895E0918405F09168 +:1035D0008505309721F00280F381E02D099408954C +:1035E00020918205309183052817390771F0909357 +:1035F000830580938205E0918405F09185053097DD +:1036000021F00680F781E02D09940895209180052E +:10361000309181052817390771F0909381058093C7 +:103620008005E0918405F0918505309721F00084B4 +:10363000F185E02D099408950C945C1B0E94980577 +:103640000C942004CF93DF9300D000D01F92CDB70D +:10365000DEB70E9428048FEF89838A831B820E9431 +:10366000A1058160782F9D838C8349815A816B816C +:103670008D810E94FC1C0E942A040E94D91A9091FC +:103680008605891769F00E94D91A809386050F90E4 +:103690000F900F900F900F90DF91CF910C94751EAB +:1036A0000F900F900F900F900F90DF91CF91089592 +:1036B00008950C94581B089508950895089588233B +:1036C00009F4BBC09CEF980F913A18F40E947F1D3B +:1036D0000DC090E2980F983058F4877091E001C0C7 +:1036E000990F8A95EAF7892F0E94BA1D0C94EB1D59 +:1036F0009BE5980F933070F4853A29F0863A31F0C3 +:1037000083E890E005C081E890E002C082E890E0A4 +:103710000C94F01A98E5980F973108F08EC0883A0B +:1037200009F445C0893A09F445C08A3A09F445C00C +:103730008B3A09F445C08C3A09F445C08D3A09F436 +:1037400045C08E3A09F445C08F3A09F445C0813B23 +:1037500009F445C0803B09F445C0823B09F445C0EB +:10376000833B09F445C0843B09F445C0853B09F41B +:1037700045C0863B09F445C0873B09F445C0883BFA +:1037800009F445C0893B09F445C08A3B09F445C0AA +:103790008B3B09F445C08C3B09F445C08D3B09F4D3 +:1037A00045C08E3B09F445C080E090E044C082EE05 +:1037B00090E041C089EE90E03EC08AEE90E03BC0D0 +:1037C00085EB90E038C086EB90E035C083EB90E06D +:1037D00032C084EB90E02FC087EB90E02CC08CECE3 +:1037E00090E029C08DEC90E026C083E891E023C0F2 +:1037F0008AE891E020C082E991E01DC084E991E06F +:103800001AC081E292E017C083E292E014C084E221 +:1038100092E011C085E292E00EC086E292E00BC019 +:1038200087E292E008C08AE292E005C08FE690E06D +:1038300002C080E790E00C94061B0895882329F1CC +:103840009CEF980F913A18F40E949C1D0DC090E2D5 +:10385000980F983058F4877091E001C0990F8A95BD +:10386000EAF7892F0E94C01D0C94EB1D9BE5980F71 +:10387000933020F480E090E00C94F01A885A87315D +:1038800020F480E090E00C94061B08950E94D71D60 +:103890000E94AC1D0C94EB1D0E94C71D0C94461C8D +:1038A000EF92FF920F931F93CF93DF9300D000D03E +:1038B0001F92CDB7DEB78C010E94771E811190C098 +:1038C00085E0F801DE01119601900D928A95E1F7ED +:1038D000F80140815181238134812115310531F076 +:1038E0005F3F31F481E04F3F19F403C081E001C034 +:1038F00080E080FD75C0F801E28049835A83EB8245 +:10390000722F3D832C836E2D8D810E94391DF82EE0 +:10391000492F4F70892F82958F708E30B1F108F04A +:1039200050C0823008F05CC0907F142F11F01295C7 +:10393000107FEE20A9F0112329F0812F0E94CA1DCB +:103940000E94EB1D8F2D0F900F900F900F900F90F6 +:10395000DF91CF911F910F91FF90EF900C945F1B1F +:103960008F2D0E941E1C1123D9F1812F0E94D01D82 +:103970000F900F900F900F900F90DF91CF911F91AC +:103980000F91FF90EF900C94EB1DF11029C0EE20E9 +:1039900039F10E944C1CFFEF20E782E0F1502040FB +:1039A0008040E1F700C000000F900F900F900F9043 +:1039B0000F90DF91CF911F910F91FF90EF900C949A +:1039C000D71E6F2DC8010F900F900F900F900F9082 +:1039D000DF91CF911F910F91FF90EF900C94F61E05 +:1039E0000F900F900F900F900F90DF91CF911F913C +:1039F0000F91FF90EF900895CF93DF93CDB7DEB78F +:103A00002A970FB6F894DEBF0FBECDBF942F4E831A +:103A1000252F5F83688779878A8749855A85452B53 +:103A200031F02F3F31F481E09F3F19F403C081E072 +:103A300001C080E080FD07C04E815F816885798587 +:103A40008A850E94661E85E0FE013696DE0111968B +:103A500001900D928A95E1F7CE0101960E94501CCB +:103A60002A960FB6F894DEBF0FBECDBFDF91CF917F +:103A700008950F931F93CF93DF9300D000D01F9230 +:103A8000CDB7DEB7042F49835A836B837C838D8344 +:103A90002C813D81232B31F05F3F31F481E04F3F9A +:103AA00019F403C081E001C080E080FF03C080E022 +:103AB00090E01BC08B8110E0882379F0609187052E +:103AC000709188058091890590918A050E94161E43 +:103AD000F801E957FA4F808304C0F801E957FA4F1B +:103AE000808169817A810E94061F0F900F900F904C +:103AF0000F900F90DF91CF911F910F91089520911A +:103B0000130130911401F90132969FEF40E0519179 +:103B1000851789F09F3F19F4511101C0942F4F5F11 +:103B20004630A9F79F3F39F0F901E90FF11D97FDE4 +:103B3000FA95828308950895E0911301F09114019C +:103B40009F012A5F3F4F9281891301C012823196F3 +:103B5000E217F307C1F7089581E090E0E0911301C7 +:103B6000F0911401E80FF91F108201968830910539 +:103B7000A9F7089590919505892B8093950508954F +:103B800080959091950589238093950508951092CD +:103B90009505089590919405892B80939405089537 +:103BA00080959091940589238093940508951092AF +:103BB000940508958091130190911401FC013196B0 +:103BC0009C01285F3F4F80E0919191118F5FE21738 +:103BD000F307D1F70895E0911301F091140180915A +:103BE00095058083E0911301F091140190818091FB +:103BF0009405892B808380918B05882361F0E09167 +:103C00001301F09114019081892B80830E94DA1DA9 +:103C1000811110928B0580911301909114010C94E5 +:103C2000E51A90938B0180938A010895CF92DF92D9 +:103C3000EF92FF926C01EE24FF24C114D104E10441 +:103C4000F10421F0C701B60120E101C020E0C72E38 +:103C5000D82EE92EFF24C114D104E104F10419F097 +:103C6000285FC701B6016B017C0154E0F694E7942C +:103C7000D794C7945A95D1F7C114D104E104F10443 +:103C800019F02C5FC701B6016B017C0142E0F6948C +:103C9000E794D794C7944A95D1F7C114D104E104AD +:103CA000F10419F02E5FC701B601DC01CB01B69516 +:103CB000A79597958795892B8A2B8B2B09F02F5FDA +:103CC000822FFF90EF90DF90CF900895CF93DF93F6 +:103CD00000D000D01F92CDB7DEB70F900F900F909D +:103CE0000F900F90DF91CF9108950C94591B80E0B5 +:103CF000089580919B05843021F11092960520E46F +:103D000088E190E00FB6F894A895809360000FBE0C +:103D10002093600083B7817F846083BF83B7816015 +:103D200083BF7894889583B78E7F83BF0FB6F8944E +:103D3000A895809160008861809360001092600077 +:103D40000FBE08950E945D1B0E9428040E945E1B06 +:103D500080E008950E945B1B0C944C1C1F920F92F4 +:103D60000FB60F9211248F939F93AF93BF938091BF +:103D70009605811113C08091680490916904A09107 +:103D80006A04B0916B044196A11DB11D8093680433 +:103D900090936904A0936A04B0936B04BF91AF91B0 +:103DA0009F918F910F900FBE0F901F9018950E94BA +:103DB0004219F89487E797E79093010880930008E9 +:103DC00087E090EBDC018093A4059093A505A09378 +:103DD000A605B093A7059CE088E10FB6F894A895D6 +:103DE000809360000FBE90936000FFCF0895E62F90 +:103DF000F0E0E15AFE4F84910895E82FF0E0EE0FD5 +:103E0000FF1FE352F0408591949108950E94F71EA0 +:103E100090E4980F903218F40E94FD1E08958F3B95 +:103E200050F4883A48F5853AD0F48430A8F48130CB +:103E300009F4B2C0AEC0883E40F4803E68F48F3BC7 +:103E400009F0A7C020E030EEA9C0803F08F4A1C06F +:103E5000282F30E03065A2C0282F30E09FC0853A7F +:103E600029F0863A31F023E830E498C021E830E4C4 +:103E700095C022E830E492C0883A09F445C0893AF6 +:103E800009F445C08A3A09F445C08B3A09F445C0A3 +:103E90008C3A09F445C08D3A09F445C08E3A09F4CC +:103EA00045C08F3A09F445C0813B09F445C0803BC9 +:103EB00009F445C0823B09F445C0833B09F445C081 +:103EC000843B09F445C0853B09F445C0863B09F4B1 +:103ED00045C0873B09F445C0883B09F445C0893B90 +:103EE00009F445C08A3B09F445C08B3B09F445C041 +:103EF0008C3B09F445C08D3B09F445C08E3B09F469 +:103F000045C020E034E44AC022EE34E447C029EE44 +:103F100034E444C02AEE34E441C025EB34E43EC02E +:103F200026EB34E43BC023EB34E438C024EB34E428 +:103F300035C027EB34E432C02CEC34E42FC02DEC38 +:103F400034E42CC023E835E429C02AE835E426C04F +:103F500022E935E423C024E935E420C021E236E437 +:103F60001DC023E236E41AC024E236E417C025E27D +:103F700036E414C026E236E411C027E236E40EC06F +:103F80002AE236E40BC02FE634E408C020E734E42C +:103F900005C020E030E002C021E030E0C901089512 +:103FA0000E94412008F481E008950E94952088F045 +:103FB0009F5798F0B92F9927B751B0F0E1F0660FED +:103FC000771F881F991F1AF0BA95C9F714C0B1302E +:103FD00091F00E94AF20B1E008950C94AF20672FBC +:103FE000782F8827B85F39F0B93FCCF3869577955D +:103FF0006795B395D9F73EF4909580957095619546 +:104000007F4F8F4F9F4F0895E89409C097FB3EF470 +:1040100090958095709561957F4F8F4F9F4F992315 +:10402000A9F0F92F96E9BB279395F6958795779593 +:104030006795B795F111F8CFFAF4BB0F11F460FF53 +:104040001BC06F5F7F4F8F4F9F4F16C0882311F0AB +:1040500096E911C0772321F09EE8872F762F05C0BF +:10406000662371F096E8862F70E060E02AF09A955A +:10407000660F771F881FDAF7880F9695879597F94F +:104080000895990F0008550FAA0BE0E8FEEF1616E9 +:104090001706E807F907C0F012161306E407F5073C +:1040A00098F0621B730B840B950B39F40A2661F0B0 +:1040B000232B242B252B21F408950A2609F4A14053 +:1040C000A6958FEF811D811D089597F99F6780E860 +:1040D00070E060E008959FEF80EC089500240A945A +:1040E0001616170618060906089500240A941216D3 +:1040F0001306140605060895092E0394000C11F406 +:10410000882352F0BB0F40F4BF2B11F460FF04C0B2 +:104110006F5F7F4F8F4F9F4F089557FD9058440F0B +:10412000551F59F05F3F71F04795880F97FB991F16 +:1041300061F09F3F79F087950895121613061406D3 +:10414000551FF2CF4695F1DF08C016161706180660 +:10415000991FF1CF86957105610508940895E8943B +:10416000BB2766277727CB0197F908950E94412046 +:1041700008F48FEF08950E94CE200C947C200E94BA +:104180006E2038F00E94752020F0952311F00C94D9 +:1041900065200C946B2011240C94B0200E948D207B +:1041A00070F3959FC1F3950F50E0551F629FF0018A +:1041B000729FBB27F00DB11D639FAA27F00DB11DA3 +:1041C000AA1F649F6627B00DA11D661F829F22272C +:1041D000B00DA11D621F739FB00DA11D621F839FB3 +:1041E000A00D611D221F749F3327A00D611D231F89 +:1041F000849F600D211D822F762F6A2F11249F57D7 +:1042000050409AF0F1F088234AF0EE0FFF1FBB1FD9 +:10421000661F771F881F91505040A9F79E3F510598 +:1042200080F00C9465200C94B0205F3FE4F3983E3E +:10423000D4F3869577956795B795F795E7959F5F42 +:10424000C1F7FE2B880F911D9695879597F90895D4 +:10425000EE0FFF1F0590F491E02D0994F894FFCF25 +:10426000010576040000FFD012D512D3120E14D42B +:104270001201018C05556E6B6E6F776E20484944B4 +:10428000204465736320547970653A00556E6B6EF7 +:104290006F776E204465736320547970653A00200F +:1042A0006C656E00696456656E646F720069645077 +:1042B000726F64756374000000000026052C0522EF +:1042C0000525051C051F051F05000000004706EE1B +:1042D00005A70600000000AF0F000F0E0FA1120689 +:0A42E0000FFD10020F090F040F007C +:00000001FF diff --git a/converter/usb_desc_dump/config.h b/converter/usb_desc_dump/config.h new file mode 100644 index 00000000..80de3a28 --- /dev/null +++ b/converter/usb_desc_dump/config.h @@ -0,0 +1,52 @@ +/* +Copyright 2012 Jun Wako + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#ifndef CONFIG_H +#define CONFIG_H + + +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x005B +#define DEVICE_VER 0x0814 +#define MANUFACTURER TMK +#define PRODUCT USB Descriptor Dumper + + +#define DESCRIPTION Product from TMK keyboard firmware project + + +/* matrix size */ +#define MATRIX_ROWS 0 +#define MATRIX_COLS 0 + +/* key combination for command */ +#define IS_COMMAND() (keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT))) + + +// Disable power saving in USB suspend loop but remote wakeup is still valid. +// This allows keep USB::Task() going during suspend without power down time delay. +//#define NO_SUSPEND_POWER_DOWN + + +// Disable USB startup wait, which can delays starting UHS2 Task() for 350-600ms. +//#define NO_USB_STARTUP_WAIT_LOOP + +// Disable USB suspend loop, which blocks UHS2 Task() while power saving. +// Note that this also disables power saving and remote wakeup from keyboard completely. +//#define NO_USB_SUSPEND_LOOP + +#endif diff --git a/converter/usb_desc_dump/desc_dump.cpp b/converter/usb_desc_dump/desc_dump.cpp new file mode 100644 index 00000000..89e0ddfa --- /dev/null +++ b/converter/usb_desc_dump/desc_dump.cpp @@ -0,0 +1,230 @@ +/* +Copyright 2021 Jun Wako + +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. +*/ +/* + * USB Host Shield HID keyboards + */ +#include "Usb.h" +#include "usbhub.h" +#include "usbhid.h" + +#include "timer.h" +#include "matrix.h" +#include "keymap.h" +#include "hook.h" +// This should be placed after Host Shield lib headers to override +#include "print.h" + + +USB Usb; +USBHub hub1(&Usb); + + +#define BUF_SIZE 256 +uint8_t buf[BUF_SIZE]; + +#define RBUF_SIZE 256 +uint8_t rbuf[RBUF_SIZE]; + + +void printHEX(uint8_t hex) +{ + xprintf("%02X", hex); +} + +void printHEX(uint16_t hex) +{ + xprintf("%02X", hex>>8); + xprintf("%02X", hex); +} + +void printVal(const char* name, uint8_t hex) +{ + xprintf("%s:%02X\r\n", name, hex); +} + +void printVal(const char* name, uint16_t hex) +{ + xprintf("%s:%04X\r\n", name, hex); +} + +void printError(uint8_t rcode) +{ + xprintf("\r\nERROR:%02X\r\n", rcode); +} + +void dumpBuf(int len, uint8_t* buf) +{ + for (int i = 0; i < len; i++) { + if (i % 16) + print(" "); + else if (i != 0) + print("\r\n"); + xprintf("%02X ", buf[i]); + } + print("\r\n"); +} + +uint8_t dumpReportDesc(UsbDevice *pdev, uint16_t iface, uint16_t len) +{ + uint8_t rcode = 0; + Usb.ctrlReq(pdev->address.devAddress, 0x00, bmREQ_HID_REPORT, USB_REQUEST_GET_DESCRIPTOR, 0x00, + HID_DESCRIPTOR_REPORT, iface, len, RBUF_SIZE, rbuf, NULL); + if (rcode) return rcode; + dumpBuf(len, rbuf); + return rcode; +} + +void scanConfigDesc(UsbDevice *pdev, uint16_t tl, uint8_t* pB) +{ + uint8_t iface = 0; + while (pB < buf + tl) { + switch (*(pB+1)) { + case USB_DESCRIPTOR_DEVICE: + break; + case USB_DESCRIPTOR_CONFIGURATION: + break; + case USB_DESCRIPTOR_STRING: + break; + case USB_DESCRIPTOR_ENDPOINT: + break; + case USB_DESCRIPTOR_INTERFACE: { + USB_INTERFACE_DESCRIPTOR *pI = (USB_INTERFACE_DESCRIPTOR *)pB; + iface = pI->bInterfaceNumber; + break; + } + case HID_DESCRIPTOR_HID: { + USB_HID_DESCRIPTOR *pH = (USB_HID_DESCRIPTOR *)pB; + xprintf("\r\nReport%d: len:%04X\r\n", iface, pH->wDescriptorLength); + if (pH->bDescrType == HID_DESCRIPTOR_REPORT) { + dumpReportDesc(pdev, iface, pH->wDescriptorLength); + } else { + printVal("Unknown HID Desc Type:", pH->bDescrType); + } + break; + } + default: + printVal("Unknown Desc Type:", *(pB+1)); + return; + } + pB += *pB; + } +} + +uint8_t dumpConfigDesc(UsbDevice *pdev, uint8_t numConf) +{ + uint8_t rcode = 0; + for (uint8_t i = 0; i < numConf; i++) { + xprintf("\r\nConfig%d:", i); + + rcode = Usb.getConfDescr(pdev->address.devAddress, 0, sizeof(USB_CONFIGURATION_DESCRIPTOR), i, buf); + if (rcode) return rcode; + USB_CONFIGURATION_DESCRIPTOR *pC = (USB_CONFIGURATION_DESCRIPTOR *)&buf; + uint16_t tl = pC->wTotalLength; + printVal(" len", tl); + + rcode = Usb.getConfDescr(pdev->address.devAddress, 0, (tl < BUF_SIZE ? tl : BUF_SIZE), i, buf); + if (rcode) return rcode; + dumpBuf(tl, buf); + + scanConfigDesc(pdev, tl, buf); + } + return rcode; +} + +void dumpDescriptors(UsbDevice *pdev) +{ + uint8_t rcode = 0; + + xprintf("\r\nAddress:%02X\r\n", pdev->address.devAddress); + xprintf("lowspeed:%02X\r\n", pdev->lowspeed); + + // + // Device Descriptor + // + rcode = Usb.getDevDescr(pdev->address.devAddress, 0, sizeof(USB_DEVICE_DESCRIPTOR), buf); + if (rcode) { printError(rcode); } + USB_DEVICE_DESCRIPTOR *pD = (USB_DEVICE_DESCRIPTOR *)&buf; + printVal("idVendor", pD->idVendor); + printVal("idProduct", pD->idProduct); + print("\r\nDevice Descriptor:\r\n"); + dumpBuf(sizeof(USB_DEVICE_DESCRIPTOR), buf); + + + // + // Configuration Descriptor + // + uint8_t numConf = pD->bNumConfigurations; + rcode = dumpConfigDesc(pdev, numConf); + if (rcode) { printError(rcode); } + + Usb.GetAddressPool().FreeAddress(pdev->address.devAddress); + return; +} + + + + + +uint16_t timer; +void matrix_init(void) { +} + +void hook_early_init(void) { + Usb.Init(); +} + +void hook_late_init(void) { + timer = timer_read(); +} + +uint8_t matrix_scan(void) { + return 1; +} + +void hook_keyboard_loop(void) { + static bool waiting = true; + static uint8_t usb_state = 0; + + + Usb.Task(); + + if (usb_state != Usb.getUsbTaskState()) { + usb_state = Usb.getUsbTaskState(); + xprintf("usb_state: %02X\n", usb_state); + if (!waiting) waiting = true; + } + + // Wait for console startutp + if (timer_elapsed(timer) < 3000) { + return; + } + + if (Usb.getUsbTaskState() == USB_STATE_RUNNING && waiting) { + Usb.ForEachUsbDevice(&dumpDescriptors); + waiting = false; + } +} + + +// Keymap unused +const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS] PROGMEM = {}; +const action_t fn_actions[] PROGMEM = {0}; From 08c7d725f5c202bf115040b450bcc36b503ab4ee Mon Sep 17 00:00:00 2001 From: tmk Date: Thu, 1 Jul 2021 00:08:27 +0900 Subject: [PATCH 08/28] usb_desc_dump: Fix README --- converter/usb_desc_dump/README.md | 120 +++++++++++++++--------------- 1 file changed, 62 insertions(+), 58 deletions(-) diff --git a/converter/usb_desc_dump/README.md b/converter/usb_desc_dump/README.md index 973cff3b..cca4a061 100644 --- a/converter/usb_desc_dump/README.md +++ b/converter/usb_desc_dump/README.md @@ -19,27 +19,29 @@ Following descriptors are supported. Example optput: - usb_state: 90 - - Address:01 - lowspeed:01 - idVendor:046A - idProduct:0011 - - Device Descriptor: - 12 01 00 02 00 00 00 08 6A 04 11 00 00 01 00 00 - 00 01 - - Config0: len:0022 - 09 02 22 00 01 01 00 A0 32 09 04 00 00 01 03 01 - 01 00 09 21 11 01 00 01 22 40 00 07 05 81 03 08 - 00 0A - - Report0: len:0040 - 05 01 09 06 A1 01 05 07 19 E0 29 E7 15 00 25 01 - 75 01 95 08 81 02 95 01 75 08 81 01 95 03 75 01 - 05 08 19 01 29 03 91 02 95 05 75 01 91 01 95 06 - 75 08 15 00 26 DD 00 05 07 19 00 29 DD 81 00 C0 +``` +usb_state: 90 + +Address:01 +lowspeed:01 +idVendor:046A +idProduct:0011 + +Device Descriptor: +12 01 00 02 00 00 00 08 6A 04 11 00 00 01 00 00 +00 01 + +Config0: len:0022 +09 02 22 00 01 01 00 A0 32 09 04 00 00 01 03 01 +01 00 09 21 11 01 00 01 22 40 00 07 05 81 03 08 +00 0A + +Report0: len:0040 +05 01 09 06 A1 01 05 07 19 E0 29 E7 15 00 25 01 +75 01 95 08 81 02 95 01 75 08 81 01 95 03 75 01 +05 08 19 01 29 03 91 02 95 05 75 01 91 01 95 06 +75 08 15 00 26 DD 00 05 07 19 00 29 DD 81 00 C0 +``` @@ -52,40 +54,42 @@ Or you can use command line tool like hidrd. - https://github.com/DIGImend/hidrd - $ cat | hidrd-convert -i hex -o spec - 05 01 09 06 A1 01 05 07 19 E0 29 E7 15 00 25 01 - 75 01 95 08 81 02 95 01 75 08 81 01 95 03 75 01 - 05 08 19 01 29 03 91 02 95 05 75 01 91 01 95 06 - 75 08 15 00 26 DD 00 05 07 19 00 29 DD 81 00 C0 - Usage Page (Desktop), ; Generic desktop controls (01h) - Usage (Keyboard), ; Keyboard (06h, application collection) - Collection (Application), - Usage Page (Keyboard), ; Keyboard/keypad (07h) - Usage Minimum (KB Leftcontrol), ; Keyboard left control (E0h, dynamic value) - Usage Maximum (KB Right GUI), ; Keyboard right GUI (E7h, dynamic value) - Logical Minimum (0), - Logical Maximum (1), - Report Size (1), - Report Count (8), - Input (Variable), - Report Count (1), - Report Size (8), - Input (Constant), - Report Count (3), - Report Size (1), - Usage Page (LED), ; LEDs (08h) - Usage Minimum (01h), - Usage Maximum (03h), - Output (Variable), - Report Count (5), - Report Size (1), - Output (Constant), - Report Count (6), - Report Size (8), - Logical Minimum (0), - Logical Maximum (221), - Usage Page (Keyboard), ; Keyboard/keypad (07h) - Usage Minimum (None), ; No event (00h, selector) - Usage Maximum (KP Hexadecimal), ; Keypad Hexadecimal (DDh, selector) - Input, - End Collection +``` +$ cat | hidrd-convert -i hex -o spec +05 01 09 06 A1 01 05 07 19 E0 29 E7 15 00 25 01 +75 01 95 08 81 02 95 01 75 08 81 01 95 03 75 01 +05 08 19 01 29 03 91 02 95 05 75 01 91 01 95 06 +75 08 15 00 26 DD 00 05 07 19 00 29 DD 81 00 C0 +Usage Page (Desktop), ; Generic desktop controls (01h) +Usage (Keyboard), ; Keyboard (06h, application collection) +Collection (Application), + Usage Page (Keyboard), ; Keyboard/keypad (07h) + Usage Minimum (KB Leftcontrol), ; Keyboard left control (E0h, dynamic value) + Usage Maximum (KB Right GUI), ; Keyboard right GUI (E7h, dynamic value) + Logical Minimum (0), + Logical Maximum (1), + Report Size (1), + Report Count (8), + Input (Variable), + Report Count (1), + Report Size (8), + Input (Constant), + Report Count (3), + Report Size (1), + Usage Page (LED), ; LEDs (08h) + Usage Minimum (01h), + Usage Maximum (03h), + Output (Variable), + Report Count (5), + Report Size (1), + Output (Constant), + Report Count (6), + Report Size (8), + Logical Minimum (0), + Logical Maximum (221), + Usage Page (Keyboard), ; Keyboard/keypad (07h) + Usage Minimum (None), ; No event (00h, selector) + Usage Maximum (KP Hexadecimal), ; Keypad Hexadecimal (DDh, selector) + Input, +End Collection +``` From dc470b28e59ae272449e0c81355847dd3b92ca2e Mon Sep 17 00:00:00 2001 From: tmk Date: Sun, 4 Jul 2021 23:55:01 +0900 Subject: [PATCH 09/28] usb_desc_dump: Add comment mark to info --- .../usb_desc_dump/binary/usb_desc_dump.hex | 1886 ++++++++--------- converter/usb_desc_dump/desc_dump.cpp | 14 +- 2 files changed, 948 insertions(+), 952 deletions(-) diff --git a/converter/usb_desc_dump/binary/usb_desc_dump.hex b/converter/usb_desc_dump/binary/usb_desc_dump.hex index bf099498..e0fe26bd 100644 --- a/converter/usb_desc_dump/binary/usb_desc_dump.hex +++ b/converter/usb_desc_dump/binary/usb_desc_dump.hex @@ -1,15 +1,15 @@ :100000000C9448010C949B010C949B010C949B0153 :100010000C949B010C949B010C949B010C949B01F0 -:100020000C949B010C949B010C94BD190C948F1A99 -:100030000C94AE1E0C949B010C949B010C949B01A0 +:100020000C949B010C949B010C949A190C946C1ADF +:100030000C948B1E0C949B010C949B010C949B01C3 :100040000C949B010C949B010C949B010C949B01C0 -:100050000C949B010C94C8050C949B010C949B017F +:100050000C949B010C94D6050C949B010C949B0171 :100060000C949B010C949B010C949B010C949B01A0 :100070000C949B010C949B010C949B010C949B0190 :100080000C949B010C949B010C949B010C949B0180 :100090000C949B010C949B010C949B010C949B0170 -:1000A0000C949B010C949B010C949B010B1832182F -:1000B0002A1932182A197E18A1182A19F8180719AE +:1000A0000C949B010C949B010C949B01E8170F1876 +:1000B00007190F1807195B187E180719D518E418C7 :1000C0007573625F73746174653A20253032580A23 :1000D000000D0A446576696365204465736372693F :1000E00070746F723A0D0A006C6F77737065656497 @@ -22,8 +22,8 @@ :100150000D0A0025733A253032580D0A0000000AB6 :100160004B6579626F6172642073746172742E0AD8 :10017000000A55534220636F6E6669677572656445 -:100180002E0A000A0A544D4B3A3433646438313035 -:10019000362B2F4C5546410A0A002C0355005300BC +:100180002E0A000A0A544D4B3A336632323962372E +:10019000342B2F4C5546410A0A002C0355005300BE :1001A0004200200044006500730063007200690093 :1001B000700074006F0072002000440075006D0034 :1001C0007000650072000000080354004D004B00F1 @@ -38,18 +38,18 @@ :10025000A101050719E029E7150025019508750199 :100260008102950175088101050819012905950587 :10027000750191029501750391010507190029FF88 -:10028000150026FF00950675088100C0120533058C +:10028000150026FF00950675088100C02005410570 :1002900011241FBECFEFDAE0DEBFCDBF04B603FEF0 :1002A00028C08091A4059091A505A091A605B091C4 :1002B000A7058730904BA740B04BD9F41092A40506 :1002C0001092A5051092A6051092A70514BE0FB6B0 :1002D000F894A895809160008861809360001092E6 :1002E00060000FBE1092010810920008E0E0F8E3F1 -:1002F000099511E0A0E0B1E0E0E6F2E402C005906B +:1002F000099511E0A0E0B1E0EAE1F2E402C0059066 :100300000D92AA38B107D9F725E0AAE8B1E001C0FB :100310001D92A43AB207E1F711E0C8E4D1E004C0AD -:100320002197FE010E942821C634D107C9F70E94F7 -:1003300026150C942E210C940000FF93EF93E0916E +:100320002197FE010E940521C634D107C9F70E941A +:1003300003150C940B210C940000FF93EF93E091B4 :100340008A01F0918B01309709F00995EF91FF91A7 :100350000895FC018591803011F0EFDFFBCF089507 :10036000FF27E0E230E247FF0CC0419597FF09C04C @@ -88,7 +88,7 @@ :10057000CF92EF920F93CF93DF93EA011F921F92D6 :1005800020E931E03F932F9321E02F931F924A01FE :100590005B0122E2C22EE12C06E021E840E0FC01F2 -:1005A000628181EA93E00E94090B60E971E0CE016B +:1005A000628181EA93E00E94DE0A60E971E0CE0197 :1005B0000E947A020F900F900F900F900F900F9063 :1005C00080E0DF91CF910F91EF90CF90BF90AF90EF :1005D0009F908F9008958F929F92AF92BF92CF92EB @@ -110,11 +110,11 @@ :1006D00021E0722E1C2F8C169D0609F443C0DF9377 :1006E000CF937F926F920E94420290E9E92E92E0AE :1006F000F92E0C2F29E030E040E0F501628181EA1B -:1007000093E00E94100C0F900F900F900F908111AA +:1007000093E00E94D90B0F900F900F900F908111E2 :100710002AC0C0909202D0909302B6018FE391E07C :100720000E945C029601F1E0CF16DF0610F020E097 :1007300031E080E9E82E82E0F82E012F40E0F5015B -:10074000628181EA93E00E94100C219681110BC016 +:10074000628181EA93E00E94D90B219681110BC04E :10075000B701C6010E947A02A701B601C5010E9435 :10076000EB02B8CF80E0DF91CF911F910F91FF9006 :10077000EF90DF90CF90BF90AF909F908F907F9041 @@ -122,7 +122,7 @@ :100790001F928F9388EF90E09F938F930E94420265 :1007A0008C811F928F9388EE90E09F938F930E948D :1007B000420200E912E022E130E040E06A8181EA91 -:1007C00093E00E94E90B2DB73EB7285F3F4F0FB66D +:1007C00093E00E94B20B2DB73EB7285F3F4F0FB6A4 :1007D000F8943EBF0FBE2DBF81110E946D02609143 :1007E00098027091990284E491E00E945C02609109 :1007F0009A0270919B028DE491E00E945C0281ED6F @@ -130,943 +130,939 @@ :100810007A026091A102CE010E94530381110E94CD :100820006D02E091A103F091A2030480F581E02D17 :100830006A8181EA93E0DF91CF911F910F91099432 -:1008400008950E94A10590938F0180938E010895D1 -:1008500081E00895CF93DF9381EA93E00E94030E35 -:1008600081EA93E00E94F90690918C018917C9F002 -:1008700081EA93E00E94F90680938C011F928F9386 +:1008400008950E94AF0590938F0180938E010895C3 +:1008500081E00895CF93DF9381EA93E00E94CC0D6D +:1008600081EA93E00E94070790918C018917C9F0F3 +:1008700081EA93E00E94070780938C011F928F9377 :1008800080EC90E09F938F930E9442020F900F9014 :100890000F900F9080910001811103C081E080933F -:1008A000000180918E0190918F010E94B905883BD3 -:1008B0009B40C8F081EA93E00E94F906803999F4E0 +:1008A000000180918E0190918F010E94C705883BC5 +:1008B0009B40C8F081EA93E00E940707803999F4D1 :1008C00080910001882379F0CCEAD3E08A818823E3 :1008D00019F0CE010E94C203259683E0C73FD807D6 :1008E000A9F710920001DF91CF9108952E9A0895F3 :1008F0002E988EBD0DB407FEFDCF1EBC0DB407FEB5 :10090000FDCF0E9476048EB508952E9882608EBD2C :100910000DB407FEFDCF6EBD0DB407FEFDCF0C94E8 -:10092000760488EF0E947804807C8034A1F018F46B -:10093000882301F10895803819F0803CB9F00895BA -:1009400088ED0E94780481FD0BC069EC88ED0E945F -:10095000850482E00CC088ED0E94780481FDF5CF0B -:100960006BEC88ED0E94850483E001C081E08093F8 -:100970008D01089561ED88ED0E94850410928D012E -:1009800008950F931F93CF93DF938C01269A0E94B3 -:100990007604219A229A2398209A80E58CBD81E0E2 -:1009A0008DBD259868E188E80E94850460E288E7AB -:1009B0000E94850460E088E70E948504C0E0D0E0E2 -:1009C00088E60E947804219680FD06C0CF3F8FEF15 -:1009D000D807B1F78FEF1DC061EC88ED0E94850448 -:1009E00060E680ED0E94850464E088EE0E94850444 -:1009F00088EE0E94780482FFFBCFC8010E94910418 -:100A000060E288EC0E94850461E080E80E94850431 -:100A100080E0DF91CF911F910F91089581EA93E0DB -:100A20000C94C10481EA93E00E94C90661EA73E074 -:100A300080E993E00C94601180E090E008958FEFDE -:100A40009FEF089581E090E008950895862F0E9419 -:100A50001A1381E090E00895FB0180810E941A132F -:100A600081E090E00895E8E1F4E01382128288EEDC -:100A700093E0A0E0B0E084839583A683B7838BE501 -:100A800091E0918380838FEF9FEF9587848708950E -:100A90000C94AD058F929F92AF92BF92CF92DF924E -:100AA000EF92FF920E9404204B015C0120E030E0B5 -:100AB0004AE755E40E94BB206B017C0120E030E056 -:100AC00040E85FE30E94D01F87FD24C020E03FEF95 -:100AD0004FE757E4C701B6010E94B6201816ACF4E0 -:100AE00020E030E040E251E4C501B4010E94BB20A7 -:100AF0000E94D51F20E931E06115710581F0C9011F -:100B00000197F1F761507109F7CFC701B6010E9453 -:100B1000D51F02C061E070E0CB010197F1F7FF90B3 -:100B2000EF90DF90CF90BF90AF909F908F900895FF -:100B300082E084BD93E095BD9AEF97BD80936E00EF -:100B400008952FB7F8948091680490916904A0915A -:100B50006A04B0916B042FBF08952FB7F894609189 -:100B600068047091690480916A0490916B042FBFAE -:100B700008959C014FB7F89480916804909169049E -:100B8000A0916A04B0916B044FBF821B930B089530 -:100B900078941F920F920FB60F9211248F939F9308 -:100BA000AF93BF938091680490916904A0916A0407 -:100BB000B0916B040196A11DB11D809368049093C0 -:100BC0006904A0936A04B0936B04BF91AF919F91A5 -:100BD0008F910F900FBE0F901F901895CF93DF93BA -:100BE000FC01862F8078A9F4283008F04DC04423FA -:100BF00021F09581973009F447C0EF01A1E0B0E002 -:100C00009D85992341F011962596A031B105C1F734 -:100C10003BC080E039C061111CC085E08A9FE001C3 -:100C20008B9FD00D1124CE0FDF1F442331F081E4C0 -:100C3000888785818F5F858302C081E0888725E072 -:100C40002A9FC0012B9F900D1124E80FF91F80856A -:100C50001BC06770660F660F660F442341F0606427 -:100C600085818F5F85838770687F682B03C02770BD -:100C7000687B622B25E02A9FC0012B9F900D1124D9 -:100C8000E80FF91F6087862FDF91CF9108956111DA -:100C900002C006960895FC0121E03585631739F0FE -:100CA0002F5F35962031C9F780E090E008950696D1 -:100CB00035E0239F800D911D11240895DF92EF925E -:100CC000FF920F931F93CF93DF93EC01E62EF12C4D -:100CD00085E0689FB0011124FE01E60FF71F8085B3 -:100CE000182F177086FF17C001E085E0D82EFE018F -:100CF000D09EE00DF11D1124808586958695869500 -:100D000087701817F9F00F5F003189F78D81811313 -:100D100002C011501D8385E08E9DF0018F9DF00D66 -:100D20001124EC0FFD1F108681E081871286229628 -:100D3000D783C683DF91CF911F910F91FF90EF90E2 -:100D4000DF900895602FCE010E945E06D0CFFC0197 -:100D5000613499F49C01255B3F4F61E0AC014E5F2B -:100D60005F4F158666871786548743873596E21747 -:100D7000F307B9F7FC011582089521E03585631763 -:100D800029F02F5F35962031C9F70895622F0C9412 -:100D90005E06FC018DE691E09183808315821086CA -:100DA00081E081871286CF01029697838683128223 -:100DB00028E023832CE32483DF019F01255B3F4F41 -:100DC00041E01D961C921D971E964C931E971F96F0 -:100DD0001C921F971C969C938E931B971596A21797 -:100DE000B30779F7EA58FF4F108281E180937004CE -:100DF0000895809170040895CF93C42F0E944706F0 -:100E0000009789F0DC01ED91FC911197309759F032 -:100E100013969C9180E0891731F020812C1731F0D6 -:100E200033968F5FF8CF80E090E001C0CF01CF9183 -:100E300008950F931F93CF93DF932115310571F020 -:100E4000E901042F162F0E944706FC01892B41F06F -:100E50001283D183C083038380E003C088ED01C087 -:100E600086EDDF91CF911F910F910895CF92DF9280 -:100E7000FF920F931F93CF93DF93662381F1F62E9A -:100E80008C016C0186E5C80ED11CC0E0D0E0D60113 -:100E90008D919D916D010097F1F0DC01ED91FC9138 -:100EA0000084F185E02D0995F81215C0AB96CC0FA2 -:100EB000DD1FC00FD11F88819981DC01ED91FC916C -:100EC0000480F581E02DDF91CF911F910F91FF906C -:100ED000DF90CF9009942196C031D105C1F680E012 -:100EE000DF91CF911F910F91FF90DF90CF900895E8 -:100EF0002E980895CF93C82F0E947807CEBD0DB4C9 -:100F000007FEFDCF1EBC0DB407FEFDCF0E94760488 -:100F10008EB5CF910895CF93DF93C82FD62F0E941F -:100F20007807C260CEBD0DB407FEFDCFDEBD0DB4A7 -:100F300007FEFDCFDF91CF910C9476048F929F92A4 -:100F4000AF92BF92CF92DF92EF92FF920F931F93D7 -:100F5000CF93DF93EC01D62EC42E59010E94470691 -:100F60007C01009709F445C0FC0180819181892BA7 -:100F700009F441C04C2D6D2DCE010E94FC06F501F7 -:100F8000918380830097C9F1FC01828186958695C3 -:100F900090E08031910514F08FE090E041E050E066 -:100FA00060E070E04A015B0104C0880C991CAA1C37 -:100FB000BB1C8A95D2F7D501C4010197F801918332 -:100FC00080836D2D80EE0E948B0788ED0E947A074A -:100FD000F7019481992331F0CA58DF4F688162602C -:100FE000682B02C0682F697F88ED0E948B0780E024 -:100FF00005C086ED03C087ED01C08BEDDF91CF9179 -:101000001F910F91FF90EF90DF90CF90BF90AF9026 -:101010009F908F9008958F929F92AF92BF92CF92A0 -:10102000DF92EF92FF920F931F93CF93DF93862E61 -:10103000942E59010E9448056B017C0128E8C20EDC -:1010400023E1D21EE11CF11C00E010E0D0E0C0E082 -:1010500098280E944805DC01CB018C199D09AE0936 -:10106000BF09B7FF2DC0692D80EF0E948B070E943A -:101070004805DC01CB018C199D09AE09BF09B7FFFA -:1010800009C088EC0E947A0787FFF1CF60E888ECFE -:101090000E948B0788EF0E947A07C82FCF70C43058 -:1010A00019F0CE3051F00CC00F5F1F4FA114B104E6 -:1010B00081F20A151B0569F603C0DF5FD33049F6DC -:1010C0008C2FDF91CF911F910F91FF90EF90DF90C8 -:1010D000CF90BF90AF909F908F9008959F92AF92C6 -:1010E000BF92CF92DF92EF92FF920F931F93CF9315 -:1010F000DF937C01D42F122F902E00E06C01C60EDE -:10110000D11CC60ED11C86E5C80ED11CA42EB12C54 -:10111000ABE2AA0EB11CAA0CBB1CAE0CBF1CF601A4 -:1011200080819181DC01ED91FC910280F381E02DC1 -:10113000292D412F6D2F0995803EC9F4D1110BC087 -:1011400061E088EE0E948B0766E670E080E090E048 -:101150000E944A0514C0F50180819181DC01ED9166 -:10116000FC910284F385E02D612F099508C08D3034 -:1011700021F4033008F03FC014C081113FC0F601D4 -:1011800080819181DC01ED91FC910190F081E02D55 -:10119000292D412F6D2F0995C82F8D3051F4033023 -:1011A00050F464E670E080E090E00E944A050F5F32 -:1011B000B6CF882311F1D1110BC061E088EE0E94F7 -:1011C0008B0766E670E080E090E00E944A0511C05F -:1011D000ED2FF0E0BB96EE0FFF1FEE0DFF1D80819F -:1011E0009181DC01ED91FC910284F385E02D612F6A -:1011F00009958C2F03C08DE001C080E0DF91CF9175 -:101200001F910F91FF90EF90DF90CF90BF90AF9024 -:101210009F9008950F931F93CF93DF93182F062F5E -:10122000EA010E94780712601EBDFE01802F88230C -:1012300039F00DB407FEFDCF91919EBD8150F7CFDF -:10124000C00FD11D0DB407FEFDCF0E947604CE0164 -:10125000DF91CF911F910F9108952F923F924F925E -:101260005F926F927F928F929F92AF92BF92CF9236 -:10127000DF92EF92FF920F931F93CF93DF9300D0F3 -:1012800000D01F92CDB7DEB77D836C834A01690120 -:10129000FB01F1808FEF8F0D803408F067C00E9452 -:1012A00048052B013C01F8E84F0EF3E15F1E611C7D -:1012B000711CEC81FD81828180FD02C060E401C06F -:1012C00060E888EE0E948B07312C8F2D90E09A8386 -:1012D0008983C114D104B1F1E980FA80CE14DF040E -:1012E00008F47601EB82A8016E2D80E10E940A09C4 -:1012F0006E2D88E30E948B07EC81FD816081606226 -:1013000080EF0E948B0788EC0E947A0787FFFBCF53 -:1013100060E888EC0E948B0788EF0E947A078F7044 -:10132000382EA12CB12C212C332009F472C00E943C -:101330004805DC01CB0184199509A609B709B7FF57 -:1013400068C016C0332021F060E088E30E948B075C -:1013500088EF0E947A0785FB882780F9EC81FD8160 -:10136000928180FB90F99283832D58C08AED56C0FC -:10137000F6E03F1239C088EF0E947A0785FB882784 -:1013800080F991E08927EC81FD81928180FB90F9C1 -:10139000928390FD02C060E401C060E888EE0E9484 -:1013A0008B0760E088E30E948B07F801608180E191 -:1013B0000E948B076B8188E30E948B07EC81FD8183 -:1013C0006081606280EF0E948B0788EC0E947A0740 -:1013D00087FFFBCF60E888EC0E948B0788EF0E94B4 -:1013E0007A078F70382EA0CF2EE0321205C02394DA -:1013F00023E02212D6CFA8CF84E03812A5CFFFEF8A -:10140000AF1ABF0A8114910461F2A814B90449F615 -:101410009BCFCE18DF080E0D1F1D5BCF0F900F90D6 -:101420000F900F900F90DF91CF911F910F91FF9030 -:10143000EF90DF90CF90BF90AF909F908F907F9074 -:101440006F905F904F903F902F9008952F923F9212 -:101450004F925F926F927F928F929F92AF92BF92C4 -:10146000CF92DF92EF92FF920F931F93CF93DF9370 -:10147000CDB7DEB72A970FB6F894DEBF0FBECDBF4B -:101480001C016B015B834A835901D9016D907C90EB -:101490001197FB01F181F9831D921C92DB011296D9 -:1014A0008C9181FD02C060E101C060E288EE0E9483 -:1014B0008B078E2D90E0A0E0B0E08C839D83AE83FF -:1014C000BF8368862A813B81D6014C9160E0C101CF -:1014D0000E940B08F82EB6E08B1318C088EF0E940C -:1014E0007A0782958170E1E08E27D60112969C9151 -:1014F000129780FB91F912969C9391FD02C060E1D6 -:1015000001C060E288EE0E948B07DCCF811167C0CA -:1015100088EC0E947A0782FF60C080E30E947A070D -:10152000582E90E06816790608F45884F5018081F9 -:1015300091819301281B390B3A87298737FF02C015 -:101540001A861986852C912C89859A858816990684 -:1015500014F49A86898649840E94780798E09EBD93 -:101560000DB407FEFDCFF801442041F01EBC4A94A3 -:101570000DB407FEFDCF8EB58193F6CFA985BA8550 -:101580000A0F1B1F0E94760464E088EC0E948B0700 -:10159000F50180819181880E991E91828082F98166 -:1015A0005F1618F08614970470F088EF0E947A078F -:1015B00082958170D60112969C91129780FB91F9C9 -:1015C00012969C930CC0EE2009F47CCF6C817D8137 -:1015D0008E819F810E944A0575CF80EFF82E8F2D56 -:1015E0002A960FB6F894DEBF0FBECDBFDF91CF9124 -:1015F0001F910F91FF90EF90DF90CF90BF90AF9031 -:101600009F908F907F906F905F904F903F902F9022 -:1016100008952F923F924F925F926F927F928F9296 -:101620009F92AF92BF92CF92DF92EF92FF920F9371 -:101630001F93CF93DF93CDB7DEB761970FB6F894C2 -:10164000DEBF0FBECDBF3C01F42E322E202EC98A44 -:101650004EA05FA0C8A4D9A4188A1F861E861D8626 -:101660008E01035F1F4F9E01215F3F4F0E949E0727 -:10167000811196C039822A82EB8289898C83BE824D -:10168000AD8298868F82AE014F5F5F4F68E080E247 -:101690000E940A092D853E854F2D60E1C3010E94FD -:1016A0000B08E82E811178C0932D9078392EC11443 -:1016B000D10409F462C0EF85F8898281992309F485 -:1016C0004DC082608283540122242394A114B1046A -:1016D00009F458C05C864B864D855E856F85788998 -:1016E000E12C86019E01255F3F4FC3010E94260A1F -:1016F000E82EA6E08A130FC00F85188988EF0E9494 -:101700007A0785FB882780F98225F801928180FB82 -:1017100091F99283DBCF81113FC08AA59BA50097E9 -:10172000A1F0DC01ED91FC9111970190F081E02D89 -:10173000C4018A199B099A8789876B857C859E01DC -:10174000275F3F4FA601CD0109958B859C85A81A7F -:10175000B90A8415950508F0B9CF0FC0816082835E -:101760004D855E8586019201BF01C3010E942D094E -:10177000811116C02D853E8511C02D853E85311005 -:1017800005C00CC0E11008C02D853E8560EA4F2DD4 -:10179000C3010E940B0804C08E2D02C060E8F7CF81 -:1017A00061960FB6F894DEBF0FBECDBFDF91CF912B -:1017B0001F910F91FF90EF90DF90CF90BF90AF906F -:1017C0009F908F907F906F905F904F903F902F9061 -:1017D00008958F929F92AF92BF92CF92EF920F9304 -:1017E0001F931F921F921F930F933F932F934901B3 -:1017F000A12CB12CCC24C394E12C06E020E80E945B -:10180000090B0F900F900F900F900F900F901F915A -:101810000F91EF90CF90BF90AF909F908F900895D1 -:101820008F929F92AF92BF92CF92EF92FF920F93BF -:101830001F921F92FF92EF923F932F934901A12C89 -:10184000B12C22E0C22EE02E06E020E80E94090B17 -:101850000F900F900F900F900F900F900F91FF909F -:10186000EF90CF90BF90AF909F908F9008958F9200 -:101870009F92AF92BF92CF92EF920F93CF931F920E -:101880001F921F921F921F921F92812C912CA12CAC -:10189000B12CC12CE22E05E020E00E94090BC82FDC -:1018A0006CE271E080E090E00E944A050F900F909A -:1018B0000F900F900F900F908C2FCF910F91EF9072 -:1018C000CF90BF90AF909F908F9008950F931F93EC -:1018D000CF93DF938A3F3FEF930711F486ED2DC03E -:1018E000DC011696ED91FC911797EF2B09F1122F61 -:1018F000242FEC011A8740E00E94EE05082F882370 -:10190000C9F0682FCE010E944706009739F3FC0109 -:101910001483202F40E060E0CE010E94370C182F86 -:10192000882351F0602FCE010E94A706812F05C0A9 -:1019300087ED03C084ED01C080E0DF91CF911F915E -:101940000F9108952F923F924F925F926F927F92E4 -:101950008F929F92AF92BF92CF92DF92EF92FF92BF -:101960000F931F93CF93DF93CDB7DEB766970FB674 -:10197000F894DEBF0FBECDBF1B8A38E03C8B3CE342 -:101980003D8B8A3F3FEF930709F464C0522E342EFB -:10199000462E7C01DC011696CD90DC901797CE0187 -:1019A000439617969C938E9316971A962C938E01B6 -:1019B0000F5F1F4F22E130E040E060E0C7010E946E -:1019C000E90BF701D782C6828111A6C089849A8467 -:1019D0006B847C84FD81FE8B2E80670136E5C30E0F -:1019E000D11C560110E0D5018D919C910097F1F129 -:1019F000DC01ED91FC910084F185E02D09958111C8 -:101A000035C0F50180819181DC01ED91FC91008868 -:101A1000F189E02D622D0995882341F1F50180813E -:101A20009181DC01ED91FC910484F585E02DA30109 -:101A3000B4010995811110C0F50180819181DC010B -:101A4000ED91FC910684F785E02D6E890995811151 -:101A500003C00CC086ED60C0052D232D442D612FE1 -:101A6000C7010E946E08813D09F056C01F5FB2E0B9 -:101A7000AB0EB11C103109F0B6CF10E0F601808139 -:101A800091810097E1F1DC01ED91FC910084F185F9 -:101A9000E02D0995811133C0F60180819181DC012F -:101AA000ED91FC910088F189E02D622D0995882344 -:101AB000D9F0F60180819181DC01ED91FC910484E3 -:101AC000F585E02DA301B4010995811118C0F60137 -:101AD00080819181DC01ED91FC910684F785E02DF8 -:101AE0006E89099581110BC0052D232D442D612F81 -:101AF000C7010E946E08982F977F913D69F41F5F80 -:101B0000E2E0CE0ED11C103109F0B8CF252D432DC7 -:101B1000642DC7010E94660C66960FB6F894DEBF6E -:101B20000FBECDBFDF91CF911F910F91FF90EF902E -:101B3000DF90CF90BF90AF909F908F907F906F90ED -:101B40005F904F903F902F9008958F929F92AF9209 -:101B5000BF92CF92EF920F931F921F921F921F92EC -:101B60001F921F92812C912CA12CB12CC12CE22E02 -:101B700009E020E00E94090B0F900F900F900F904A -:101B80000F900F900F91EF90CF90BF90AF909F90DC -:101B90008F9008958F929F92AF92BF92CF92DF92D3 -:101BA000EF920F931F93CF93DF9300D000D0CDB768 -:101BB000DEB76C01590148011C821B821A8219820E -:101BC0008E010F5F1F4F9E012D5F3F4F0E949E07AA -:101BD000811109C049815A816B817C818401950101 -:101BE000C6010E94260A0F900F900F900F90DF9170 -:101BF000CF911F910F91EF90DF90CF90BF90AF905A -:101C00009F908F900895AF92BF92CF92DF92EF9204 -:101C1000FF920F931F93CF938C011D990EC088ECF8 -:101C20000E947A0785FF05C0C8010E94910460E206 -:101C300001C060E088EC0E948B0780918D018130AB -:101C400039F040F0823079F0833039F5C1E00CC0D2 -:101C500083E106C080917004807F8031F1F081E1E2 -:101C6000809370041AC0C0E080917004807F80313E -:101C7000A9F40E944805DC01CB0188539F4FAF4F68 -:101C8000BF4F80936C0490936D04A0936E04B09347 -:101C90006F0480E28093700401C0C0E0780186E5A3 -:101CA000E80EF11C6801A6E7CA0ED11C5701F50128 -:101CB000819191915F01009739F0DC01ED91FC91E8 -:101CC0000680F781E02D0995AC14BD0481F7809161 -:101CD0007004803409F43FC050F4803221F1803325 -:101CE000A1F1813109F082C0F60110820AC081356C -:101CF00009F458C0803809F46AC0803509F076C00C -:101D000039C0D7018D919D917D01009739F0DC019B -:101D1000ED91FC910480F581E02D0995EC14FD0412 -:101D200081F782E161C00E94480500916C04109126 -:101D30006D0420916E0430916F04DC01CB01801B97 -:101D4000910BA20BB30BB7FD51C061E088EE0E946E -:101D50008B0780E449C088EE0E947A0780FD46C068 -:101D600088ED0E947A07682F686088ED0E948B07D3 -:101D700080E53AC088EC0E947A0786FF37C081E58B -:101D8000809370040E944805DC01CB014496A11D9C -:101D9000B11D80936C0490936D04A0936E04B09376 -:101DA0006F0424C00E944805C0906C04D0906D045C -:101DB000E0906E04F0906F04DC01CB018C199D095A -:101DC000AE09BF09B7FD12C080E8809370042C2FC4 -:101DD00040E060E0C8010E94A20C882321F0823D0F -:101DE00029F080EA01C080E980937004CF911F91AF -:101DF0000F91FF90EF90DF90CF90BF90AF9008953C -:101E000080E0089580E0089581E00895FC018285D6 -:101E1000089581E0693009F080E00895CF93DF9361 -:101E2000EC018A819B81DC01ED91FC910480F581BC -:101E3000E02D6A8509958A85813439F4EA81FB8130 -:101E4000EA58FF4F8081846080831A861B861C8637 -:101E50001D861E861F86188A80E0DF91CF91089527 -:101E60008F929F92AF92BF92CF92EF920F93A42E38 -:101E7000B12CB22A1F921F921F921F921F921F9283 -:101E8000812C912CC12CE62E01E023E240E0FC01E4 -:101E90006285828193810E94090B0F900F900F90B1 -:101EA0000F900F900F900F91EF90CF90BF90AF9049 -:101EB0009F908F9008958F929F92AF92BF92CF92F2 -:101EC000EF920F93A62EB12C1F921F923F932F9348 -:101ED0005F934F934A01C12CE12C00E023EA40E0DC -:101EE000FC016285828193810E94090B0F900F9003 -:101EF0000F900F900F900F900F91EF90CF90BF9099 -:101F0000AF909F908F9008958F929F92AF92BF92C3 -:101F1000CF92EF920F93A42EB12CB22A1F921F9250 -:101F20001F921F921F921F92812C912CC12CE62E82 -:101F300003E023E240E0FC016285828193810E94FC -:101F4000090B0F900F900F900F900F900F900F9123 -:101F5000EF90CF90BF90AF909F908F9008952F9269 -:101F60003F924F925F926F927F928F929F92AF9229 -:101F7000BF92CF92DF92EF92FF920F931F93CF9376 -:101F8000DF93CDB7DEB7E8970FB6F894DEBF0FBE8C -:101F9000CDBFDC011A963C91311107C1122F242EBE -:101FA000362E3C01FC01C280D380D601ED91FC911C -:101FB0000190F081E02D60E0C60109957C01009759 -:101FC00009F4F5C0FC01A080B180A114B10409F4AA -:101FD000F0C04301F4E08F0E911CDC0111969C923D -:101FE0008E9214961C93FE0131962F018F0128E0EA -:101FF00030E040E060E0D30112968D919C91139700 -:102000000E94E90BF70114828111D9C08D818930BA -:1020100009F0D1C00981D601ED91FC910280F381D4 -:10202000E02D222D41E0632DC6010995F301828741 -:10203000882309F4C2C098859583282F40E060E08A -:10204000828193810E94370C182F882389F0D70151 -:10205000AD92BC92D601ED91FC910480F581E02D0A -:10206000D3011A966C91C6010995F3011286ABC093 -:10207000202F013208F020E2D701AD92BC9221114D -:102080000BC0940142E0F3016285828193810E943A -:102090001907811197C010C030E0820140E0D301E0 -:1020A0001A966C911A9712968D919C9113970E9493 -:1020B000E90B811187C0E5CF1F921F925F924F926B -:1020C0001F9288E08F9388E0882E912CA12CB12C50 -:1020D00099E2C92EE12C06E020EA40E0F301628596 -:1020E000828193810E94090B182F0F900F900F90FF -:1020F0000F900F900F90811166C08B81D3011B96BA -:102100008C931B97720100E028E030E040E01A96C3 -:102110006C911A9712968D919C9113970E94100CB6 -:10212000811150C02B813C8140E0F30162858281A6 -:1021300093810E94100C811145C0298130E0CE01AD -:1021400081967C0140E0D3011A966C911A97129601 -:102150008D919C9113970E94100C811133C02E8198 -:1021600040E0F3016285828193810E94A50D811177 -:1021700029C001E0D3011B968C91801740F020E02C -:10218000402F68E0C3010E94840F0F5FF3CFD3019B -:102190001296ED91FC911397EA58FF4F808184606D -:1021A000808381E050968C930EC019ED0CC016ED23 -:1021B0000AC017ED08C011ED06C014ED04C0F70108 -:1021C000B182A082182F812FE8960FB6F894DEBF57 -:1021D0000FBECDBFDF91CF911F910F91FF90EF9078 -:1021E000DF90CF90BF90AF909F908F907F906F9037 -:1021F0005F904F903F902F900895CF92DF92FF9283 -:102200000F931F93CF93DF9300D000D0CDB7DEB7ED -:102210008C01F62E19821A821B821C8220E0462F26 -:1022200061E10E94300F20E04F2D60E1C8010E9463 -:10223000300F20E04F2D64E0C8010E94840F83E03E -:10224000C82ED12C9E012F5F3F4F44E050E06F2DF0 -:10225000C8010E945B0F8823F1F020E04F2D64E15C -:10226000C8010E94300F20E04F2D60E1C8010E949C -:10227000300F64E170E080E090E00E944A050F902A -:102280000F900F900F90DF91CF911F910F91FF90C2 -:10229000DF90CF90089589819A81AB81BC819D7F29 -:1022A00083309140A041B105C1F264E670E080E066 -:1022B00090E00E944A0581E0C81AD10819F6CDCFF6 -:1022C000FC0187E791E091838083738362831286A8 -:1022D00013861486158616861786108A148288E05F -:1022E00085839CE3968391E09783808784E0818750 -:1022F00061157105B1F0DB01AA5ABF4F80E090E093 -:102300002D913D91232B49F48B96880F991FDB016A -:10231000A80FB91FED93FC930895019680319105A4 -:1023200079F70895EF92FF920F931F93CF938C014B -:10233000C62F7A01FA0180819181A281B381813017 -:10234000F3E09F07F1E0AF07B105D1F060F481152C -:10235000E1E09E07AE07B10571F181309140A140E7 -:10236000B10571F064C0833021E0920720E1A2073B -:10237000B105E1F183309340A041B105B9F157C0F7 -:1023800080917104811153C020E04C2F61E1C8019C -:102390000E94300F20E04C2F60E1C8010E94300FF6 -:1023A00020E04C2F64E0C8010E94840F81E08093FC -:1023B000710481EB3DC020E0462F61E1C8010E941D -:1023C000300F20E04C2F60E1C8010E94300F1092C6 -:1023D0007104F80162856770C770660F660F660F3B -:1023E0006C2B828193810E94360721C020E04C2F04 -:1023F00064E1C8010E94300F20E04C2F60E1C80169 -:102400000E94300F64E170E080E090E00E944A0595 -:10241000F8016285F70121812695217067704C2FA4 -:10242000F801828193810E94A20C1092710480E0D5 -:10243000CF911F910F91FF90EF900895CF92DF926F -:10244000EF920F931F93CF93DF93CDB7DEB72E9705 -:102450000FB6F894DEBF0FBECDBF6C0181E090E0F7 -:102460009E878D87E12C8E010F5F1F4F9E01235F9A -:102470003F4F41E0F6016285828193810E94CA0D3F -:10248000811151C002E011E089818023D1F01986C9 +:10092000760488EF0E947804807C803411F118F4FA +:10093000882371F10895803819F0803C39F10895C9 +:1009400088ED0E94780490918D0181FD08C092305D +:1009500029F161EC88ED0E94850482E007C09330A4 +:10096000E9F063EC88ED0E94850483E080938D01BB +:10097000089588ED0E94780490918D0181FD03C057 +:10098000933079F70895923021F7089581E0EECF02 +:1009900061ED88ED0E94850410928D0108950F93FA +:1009A0001F93CF93DF938C01269A0E947604219A9D +:1009B000229A2398209A80E58CBD81E08DBD2598F0 +:1009C00068E188E80E94850460E288E70E94850467 +:1009D00060E088E70E948504C0E0D0E088E60E94DD +:1009E0007804219680FD06C0CF3F8FEFD807B1F77E +:1009F0008FEF1DC061EC88ED0E94850460E280ED00 +:100A00000E94850464E088EE0E94850488EE0E94BE +:100A1000780482FFFBCFC8010E94910460E288EC59 +:100A20000E94850461E080E80E94850480E0DF91F7 +:100A3000CF911F910F91089581EA93E00C94CF0418 +:100A400081EA93E00E94D70661EA73E080E993E0CF +:100A50000C943D1180E090E008958FEF9FEF089592 +:100A600081E090E008950895862F0E94F71281E0BA +:100A700090E00895FB0180810E94F71281E090E0F0 +:100A80000895E8E1F4E01382128288EE93E0A0E09A +:100A9000B0E084839583A683B7838BE591E091834F +:100AA00080838FEF9FEF9587848708950C94BB0513 +:100AB0008F929F92AF92BF92CF92DF92EF92FF926E +:100AC0000E94E11F4B015C0120E030E04AE755E461 +:100AD0000E9498206B017C0120E030E040E85FE359 +:100AE0000E94AD1F87FD24C020E03FEF4FE757E491 +:100AF000C701B6010E9493201816ACF420E030E044 +:100B000040E251E4C501B4010E9498200E94B21F46 +:100B100020E931E06115710581F0C9010197F1F714 +:100B200061507109F7CFC701B6010E94B21F02C020 +:100B300061E070E0CB010197F1F7FF90EF90DF905B +:100B4000CF90BF90AF909F908F90089582E084BD2A +:100B500093E095BD9AEF97BD80936E0008952FB7EF +:100B6000F8948091680490916904A0916A04B0910E +:100B70006B042FBF08952FB7F894609168047091AB +:100B8000690480916A0490916B042FBF08959C01C1 +:100B90004FB7F8948091680490916904A0916A0419 +:100BA000B0916B044FBF821B930B089578941F92F2 +:100BB0000F920FB60F9211248F939F93AF93BF9311 +:100BC0008091680490916904A0916A04B0916B04CB +:100BD0000196A11DB11D8093680490936904A093B0 +:100BE0006A04B0936B04BF91AF919F918F910F9066 +:100BF0000FBE0F901F901895CF93DF93FC01862FA7 +:100C00008078A9F4283008F04DC0442321F0958164 +:100C1000973009F447C0EF01A1E0B0E09D8599232A +:100C200041F011962596A031B105C1F73BC080E097 +:100C300039C061111CC085E08A9FE0018B9FD00DF7 +:100C40001124CE0FDF1F442331F081E48887858192 +:100C50008F5F858302C081E0888725E02A9FC001DD +:100C60002B9F900D1124E80FF91F80851BC0677022 +:100C7000660F660F660F442341F0606485818F5FC5 +:100C800085838770687F682B03C02770687B622B21 +:100C900025E02A9FC0012B9F900D1124E80FF91F1A +:100CA0006087862FDF91CF910895611102C006966B +:100CB0000895FC0121E03585631739F02F5F3596E3 +:100CC0002031C9F780E090E00895069635E0239F33 +:100CD000800D911D11240895DF92EF92FF920F93E2 +:100CE0001F93CF93DF93EC01E62EF12C85E0689FF4 +:100CF000B0011124FE01E60FF71F8085182F177031 +:100D000086FF17C001E085E0D82EFE01D09EE00DE1 +:100D1000F11D112480858695869586958770181714 +:100D2000F9F00F5F003189F78D81811302C01150F6 +:100D30001D8385E08E9DF0018F9DF00D1124EC0F39 +:100D4000FD1F108681E0818712862296D783C68395 +:100D5000DF91CF911F910F91FF90EF90DF90089559 +:100D6000602FCE010E946C06D0CFFC01613499F453 +:100D70009C01255B3F4F61E0AC014E5F5F4F1586E4 +:100D800066871786548743873596E217F307B9F7C6 +:100D9000FC011582089521E03585631729F02F5F46 +:100DA00035962031C9F70895622F0C946C06FC012A +:100DB0008DE691E0918380831582108681E08187A2 +:100DC0001286CF01029697838683128228E02383BE +:100DD0002CE32483DF019F01255B3F4F41E01D96FB +:100DE0001C921D971E964C931E971F961C921F9740 +:100DF0001C969C938E931B971596A217B30779F7B1 +:100E0000EA58FF4F108281E1809370040895809129 +:100E100070040895CF93C42F0E945506009789F05F +:100E2000DC01ED91FC911197309759F013969C914C +:100E300080E0891731F020812C1731F033968F5FD5 +:100E4000F8CF80E090E001C0CF01CF9108950F93DB +:100E50001F93CF93DF932115310571F0E901042F22 +:100E6000162F0E945506FC01892B41F01283D18375 +:100E7000C083038380E003C088ED01C086EDDF916D +:100E8000CF911F910F910895CF92DF92FF920F9310 +:100E90001F93CF93DF93662381F1F62E8C016C01B3 +:100EA00086E5C80ED11CC0E0D0E0D6018D919D91A1 +:100EB0006D010097F1F0DC01ED91FC910084F1856A +:100EC000E02D0995F81215C0AB96CC0FDD1FC00FB1 +:100ED000D11F88819981DC01ED91FC910480F5811D +:100EE000E02DDF91CF911F910F91FF90DF90CF9078 +:100EF00009942196C031D105C1F680E0DF91CF91F0 +:100F00001F910F91FF90DF90CF9008952E98089534 +:100F1000CF93C82F0E948607CEBD0DB407FEFDCF2C +:100F20001EBC0DB407FEFDCF0E9476048EB5CF9196 +:100F30000895CF93DF93C82FD62F0E948607C260F3 +:100F4000CEBD0DB407FEFDCFDEBD0DB407FEFDCF57 +:100F5000DF91CF910C9476048F929F92AF92BF92C3 +:100F6000CF92DF92EF92FF920F931F93CF93DF9375 +:100F7000EC01D62EC42E59010E9455067C01009723 +:100F800009F445C0FC0180819181892B09F441C09D +:100F90004C2D6D2DCE010E940A07F50191838083AF +:100FA0000097C9F1FC0182818695869590E0803199 +:100FB000910514F08FE090E041E050E060E070E0D7 +:100FC0004A015B0104C0880C991CAA1CBB1C8A95B1 +:100FD000D2F7D501C4010197F801918380836D2D6B +:100FE00080EE0E94990788ED0E948807F70194819E +:100FF000992331F0CA58DF4F68816260682B02C0C4 +:10100000682F697F88ED0E94990780E005C086ED12 +:1010100003C087ED01C08BEDDF91CF911F910F9140 +:10102000FF90EF90DF90CF90BF90AF909F908F9008 +:1010300008958F929F92AF92BF92CF92DF92EF92DC +:10104000FF920F931F93CF93DF93862E942E590117 +:101050000E9456056B017C0128E8C20E23E1D21ED6 +:10106000E11CF11C00E010E0D0E0C0E098280E94F4 +:101070005605DC01CB018C199D09AE09BF09B7FFEC +:101080002DC0692D80EF0E9499070E945605DC0152 +:10109000CB018C199D09AE09BF09B7FF09C088ECC7 +:1010A0000E94880787FFF1CF60E888EC0E949907CB +:1010B00088EF0E948807C82FCF70C43019F0CE3057 +:1010C00051F00CC00F5F1F4FA114B10481F20A153B +:1010D0001B0569F603C0DF5FD33049F68C2FDF9123 +:1010E000CF911F910F91FF90EF90DF90CF90BF9025 +:1010F000AF909F908F9008959F92AF92BF92CF92A2 +:10110000DF92EF92FF920F931F93CF93DF937C01B7 +:10111000D42F122F902E00E06C01C60ED11CC60EEB +:10112000D11C86E5C80ED11CA42EB12CABE2AA0EB0 +:10113000B11CAA0CBB1CAE0CBF1CF60180819181B6 +:10114000DC01ED91FC910280F381E02D292D412FEE +:101150006D2F0995803EC9F4D1110BC061E088EE76 +:101160000E94990766E670E080E090E00E945805D2 +:1011700014C0F50180819181DC01ED91FC91028424 +:10118000F385E02D612F099508C08D3021F40330DF +:1011900008F03FC014C081113FC0F60180819181E9 +:1011A000DC01ED91FC910190F081E02D292D412F82 +:1011B0006D2F0995C82F8D3051F4033050F464E63B +:1011C00070E080E090E00E9458050F5FB6CF882362 +:1011D00011F1D1110BC061E088EE0E94990766E61B +:1011E00070E080E090E00E94580511C0ED2FF0E023 +:1011F000BB96EE0FFF1FEE0DFF1D80819181DC017C +:10120000ED91FC910284F385E02D612F09958C2FDF +:1012100003C08DE001C080E0DF91CF911F910F915D +:10122000FF90EF90DF90CF90BF90AF909F90089588 +:101230000F931F93CF93DF93182F062FEA010E947D +:10124000860712601EBDFE01802F882339F00DB481 +:1012500007FEFDCF91919EBD8150F7CFC00FD11DEC +:101260000DB407FEFDCF0E947604CE01DF91CF9131 +:101270001F910F9108952F923F924F925F926F921C +:101280007F928F929F92AF92BF92CF92DF92EF9216 +:10129000FF920F931F93CF93DF9300D000D01F9244 +:1012A000CDB7DEB77B014A016901FB01F181F9830A +:1012B0008F2F8150803408F075C00E9456052B0195 +:1012C0003C0128E8420E23E1521E611C711CF7010B +:1012D000828180FD02C060E401C060E888EE0E9467 +:1012E0009907312C9981892F90E09A838983C114C1 +:1012F000D10409F44AC0E981FA81FD83EC83CE165A +:10130000DF0610F4DD82CC82FC81FB83A8016F2F05 +:1013100080E10E9418096C8188E30E949907F70117 +:101320006081606280EF0E94990788EC0E948807C4 +:1013300087FFFBCF60E888EC0E94990788EF0E9446 +:1013400088078F70382EA12CB12C212C332009F462 +:1013500051C00E945605DC01CB0184199509A609EC +:10136000B709B7FF47C0F6E03F1611F12EE032167D +:10137000D9F084E0381209C0FFEFAF1ABF0A811418 +:101380009104B1F0A814B90499F488EF0E94880779 +:1013900085FB882780F9F701928180FB90F9928381 +:1013A000832D2FC08AED2DC0239423E0221669F3EC +:1013B00060E088E30E949907F801608180E10E9463 +:1013C00099076B8188E30E949907F7016081606249 +:1013D00080EF0E94990788EC0E94880787FFFBCF67 +:1013E00060E888EC0E94990788EF0E9488078F7058 +:1013F000382EACCFEC81FD81CE1ADF0A0E0F1F1FF5 +:1014000076CF0F900F900F900F900F90DF91CF91AC +:101410001F910F91FF90EF90DF90CF90BF90AF9012 +:101420009F908F907F906F905F904F903F902F9004 +:1014300008952F923F924F925F926F927F928F9278 +:101440009F92AF92BF92CF92DF92EF92FF920F9353 +:101450001F93CF93DF93CDB7DEB72A970FB6F894DB +:10146000DEBF0FBECDBF9D838C836B015F834E8338 +:101470005901EA82F90180809180FB01F181FB83AF +:10148000F90111821082FB01828181FD02C060E1BD +:1014900001C060E288EE0E9499078886FA814F2E8B +:1014A000512C612C712C2E813F81F601408160E02E +:1014B0008C819D810E94190889838630A1F3811156 +:1014C00063C088EC0E94880782FF5CC080E30E94B2 +:1014D0008807382E90E08816990608F43884F501BC +:1014E000808191819401281B390B3A87298737FF26 +:1014F00002C01A861986E32CF12C89859A85E81694 +:10150000F90614F4FA86E98629840E94860798E091 +:101510009EBD0DB407FEFDCFF801222041F01EBC98 +:101520002A940DB407FEFDCF8EB58193F6CFE985E1 +:10153000FA850E0F1F1F0E94760464E088EC0E945B +:101540009907F50180819181E80EF91EF182E08210 +:10155000FB813F1618F0E814F90458F088EF0E9458 +:10156000880782958170F601928180FB91F99283C0 +:101570000BC0FA81FF2309F496CFC301B2010E9488 +:10158000580591CF20EF298389812A960FB6F894C8 +:10159000DEBF0FBECDBFDF91CF911F910F91FF90A6 +:1015A000EF90DF90CF90BF90AF909F908F907F9003 +:1015B0006F905F904F903F902F9008952F923F92A1 +:1015C0004F925F926F927F928F929F92AF92BF9253 +:1015D000CF92DF92EF92FF920F931F93CF93DF93FF +:1015E000CDB7DEB761970FB6F894DEBF0FBECDBFA3 +:1015F0003C01F42E322E202EC98A65014EA05FA038 +:10160000A8A4B9A4188A1F861E861D868E01035FB2 +:101610001F4F9E01215F3F4F0E94AC07811189C07F +:1016200039822A82EB8289898C83DE82CD829886F8 +:101630008F82AE014F5F5F4F68E080E20E94180921 +:101640002D853E854F2D60E1C3010E941908182F9A +:1016500081116BC0932D9078392EA114B10409F437 +:1016600055C0EF85F8898281992309F440C08260D2 +:1016700082836401C114D10409F44DC09C2D8D2DC9 +:101680004C145D0410F4942D852D9B878C874D851B +:101690005E856F857889E12C85019E01255F3F4F2E +:1016A000C3010E94190A182F863021F381113DC011 +:1016B000AAA5BBA5109799F0ED91FC911197019007 +:1016C000F081E02DC4018C199D099A8789876B856B +:1016D0007C859E01275F3F4FA501CD0109958B8534 +:1016E0009C85C81AD90A8415950520F60FC081601B +:1016F00082834D855E8585019201BF01C3010E94F1 +:101700003B09811116C02D853E8511C02D853E8572 +:10171000311005C00CC0111108C02D853E8560EA4E +:101720004F2DC3010E94190804C0812F02C060E838 +:10173000F7CF61960FB6F894DEBF0FBECDBFDF9135 +:10174000CF911F910F91FF90EF90DF90CF90BF90BE +:10175000AF909F908F907F906F905F904F903F9051 +:101760002F9008958F929F92AF92BF92CF92EF9257 +:101770000F931F931F921F921F930F933F932F93CB +:101780004901A12CB12CCC24C394E12C06E020E823 +:101790000E94DE0A0F900F900F900F900F900F9005 +:1017A0001F910F91EF90CF90BF90AF909F908F902F +:1017B00008958F929F92AF92BF92CF92EF92FF9235 +:1017C0000F931F921F92FF92EF923F932F93490125 +:1017D000A12CB12C22E0C22EE02E06E020E80E94CF +:1017E000DE0A0F900F900F900F900F900F900F91B7 +:1017F000FF90EF90CF90BF90AF909F908F90089503 +:101800008F929F92AF92BF92CF92EF920F93CF930E +:101810001F921F921F921F921F921F92812C912C38 +:10182000A12CB12CC12CE22E05E020E00E94DE0AA2 +:10183000C82F6CE271E080E090E00E9458050F90A4 +:101840000F900F900F900F900F908C2FCF910F91C2 +:10185000EF90CF90BF90AF909F908F9008950F938F +:101860001F93CF93DF938A3F3FEF930711F486EDE9 +:101870002DC0DC011696ED91FC911797EF2B09F125 +:10188000122F242FEC011A8740E00E94FC05082F3C +:101890008823C9F0682FCE010E945506009739F3BE +:1018A000FC011483202F40E060E0CE010E94000C78 +:1018B000182F882351F0602FCE010E94B506812F8A +:1018C00005C087ED03C084ED01C080E0DF91CF91BA +:1018D0001F910F9108952F923F924F925F926F92B6 +:1018E0007F928F929F92AF92BF92CF92DF92EF92B0 +:1018F000FF920F931F93CF93DF93CDB7DEB7669719 +:101900000FB6F894DEBF0FBECDBF1B8A38E03C8B0C +:101910003CE33D8B8A3F3FEF930709F464C0522EAE +:10192000342E462E7C01DC011696CD90DC90179764 +:10193000CE01439617969C938E9316971A962C93E6 +:101940008E010F5F1F4F22E130E040E060E0C701F1 +:101950000E94B20BF701D782C6828111A6C089848A +:101960009A846B847C84FD81FE8B2E80670136E532 +:10197000C30ED11C560110E0D5018D919C910097AA +:10198000F1F1DC01ED91FC910084F185E02D0995E8 +:10199000811135C0F50180819181DC01ED91FC91CF +:1019A0000088F189E02D622D0995882341F1F50128 +:1019B00080819181DC01ED91FC910484F585E02D1D +:1019C000A301B4010995811110C0F50180819181B5 +:1019D000DC01ED91FC910684F785E02D6E89099577 +:1019E000811103C00CC086ED60C0052D232D442D50 +:1019F000612FC7010E947C08813D09F056C01F5F1E +:101A0000B2E0AB0EB11C103109F0B6CF10E0F60118 +:101A1000808191810097E1F1DC01ED91FC910084DE +:101A2000F185E02D0995811133C0F6018081918106 +:101A3000DC01ED91FC910088F189E02D622D099582 +:101A40008823D9F0F60180819181DC01ED91FC9130 +:101A50000484F585E02DA301B4010995811118C016 +:101A6000F60180819181DC01ED91FC910684F7857E +:101A7000E02D6E89099581110BC0052D232D442D74 +:101A8000612FC7010E947C08982F977F913D69F4D0 +:101A90001F5FE2E0CE0ED11C103109F0B8CF252D2A +:101AA000432D642DC7010E942F0C66960FB6F89443 +:101AB000DEBF0FBECDBFDF91CF911F910F91FF9081 +:101AC000EF90DF90CF90BF90AF909F908F907F90DE +:101AD0006F905F904F903F902F9008958F929F92BC +:101AE000AF92BF92CF92EF920F931F921F921F92CD +:101AF0001F921F921F92812C912CA12CB12CC12CD2 +:101B0000E22E09E020E00E94DE0A0F900F900F9075 +:101B10000F900F900F900F91EF90CF90BF90AF90DC +:101B20009F908F9008958F929F92AF92BF92CF9285 +:101B3000DF92EF920F931F93CF93DF9300D000D0EB +:101B4000CDB7DEB76C01590148011C821B821A8295 +:101B500019828E010F5F1F4F9E012D5F3F4F0E9424 +:101B6000AC07811109C049815A816B817C81840154 +:101B70009501C6010E94190A0F900F900F900F90C7 +:101B8000DF91CF911F910F91EF90DF90CF90BF9099 +:101B9000AF909F908F900895AF92BF92CF92DF92B7 +:101BA000EF92FF920F931F93CF938C011D990EC05C +:101BB00088EC0E94880785FF05C0C8010E94910437 +:101BC00060E201C060E088EC0E94990780918D017D +:101BD000813039F040F0823079F0833079F5C1E01E +:101BE0000CC083E106C080917004807F803131F1A8 +:101BF00081E18093700422C0C0E080917004807FF6 +:101C00008031E9F40E945605DC01CB0188539F4FD7 +:101C1000AF4FBF4F80936C0490936D04A0936E04FC +:101C2000B0936F0480E28093700480ED0E94880777 +:101C3000682F6F7D80ED0E94990701C0C0E0780198 +:101C400086E5E80EF11C6801A6E7CA0ED11C570113 +:101C5000F501819191915F01009739F0DC01ED91DF +:101C6000FC910680F781E02D0995AC14BD0481F745 +:101C700080917004803409F447C050F4803221F11F +:101C80008033A1F1813109F08EC0F60110820AC0C3 +:101C9000813509F464C0803809F476C0803509F0D4 +:101CA00082C045C0D7018D919D917D01009739F08B +:101CB000DC01ED91FC910480F581E02D0995EC1497 +:101CC000FD0481F782E16DC00E94560500916C040D +:101CD00010916D0420916E0430916F04DC01CB01F2 +:101CE000801B910BA20BB30BB7FD5DC080ED0E9472 +:101CF0008807682F606280ED0E94990761E088EE96 +:101D00000E94990780E44DC088EE0E94880780FDFC +:101D10004AC060E488EC0E94990788ED0E94880719 +:101D2000682F686088ED0E94990780E53AC088ECCA +:101D30000E94880786FF37C081E5809370040E9467 +:101D40005605DC01CB014496A11DB11D80936C04A6 +:101D500090936D04A0936E04B0936F0424C00E940E +:101D60005605C0906C04D0906D04E0906E04F09025 +:101D70006F04DC01CB018C199D09AE09BF09B7FDC9 +:101D800012C080E8809370042C2F40E060E0C8010E +:101D90000E946B0C882321F0823D29F080EA01C06B +:101DA00080E980937004CF911F910F91FF90EF9085 +:101DB000DF90CF90BF90AF90089580E0089580E0CD +:101DC000089581E00895FC018285089581E06930DD +:101DD00009F080E00895CF93DF93EC018A819B8125 +:101DE000DC01ED91FC910480F581E02D6A85099577 +:101DF0008A85813439F4EA81FB81EA58FF4F80817A +:101E00008B7F80831A861B861C861D861E861F86F6 +:101E1000188A80E0DF91CF9108958F929F92AF92C0 +:101E2000BF92CF92EF920F93A42EB12CB22A1F92A1 +:101E30001F921F921F921F921F92812C912CC12CD6 +:101E4000E62E01E023E240E0FC016285828193817D +:101E50000E94DE0A0F900F900F900F900F900F903E +:101E60000F91EF90CF90BF90AF909F908F9008957B +:101E70008F929F92AF92BF92CF92EF920F93A62E26 +:101E8000B12C1F921F923F932F935F934F934A0160 +:101E9000C12CE12C00E023EA40E0FC016285828154 +:101EA00093810E94DE0A0F900F900F900F900F9079 +:101EB0000F900F91EF90CF90BF90AF909F908F9029 +:101EC00008958F929F92AF92BF92CF92EF920F930D +:101ED000A42EB12CB22A1F921F921F921F921F9202 +:101EE0001F92812C912CC12CE62E03E023E240E0CE +:101EF000FC016285828193810E94DE0A0F900F901F +:101F00000F900F900F900F900F91EF90CF90BF9088 +:101F1000AF909F908F9008952F923F924F925F9233 +:101F20006F927F928F929F92AF92BF92CF92DF92E9 +:101F3000EF92FF920F931F93CF93DF93CDB7DEB74E +:101F4000E8970FB6F894DEBF0FBECDBFDC011A963E +:101F50003C91311107C1122F242E362E3C01FC0179 +:101F6000C280D380D601ED91FC910190F081E02DEB +:101F700060E0C60109957C01009709F4F5C0FC01F9 +:101F8000A080B180A114B10409F4F0C04301F4E0D1 +:101F90008F0E911CDC0111969C928E9214961C93CC +:101FA000FE0131962F018F0128E030E040E060E033 +:101FB000D30112968D919C9113970E94B20BF70159 +:101FC00014828111D9C08D81893009F0D1C0098175 +:101FD000D601ED91FC910280F381E02D222D41E0AC +:101FE000632DC6010995F3018287882309F4C2C0D5 +:101FF00098859583282F40E060E0828193810E943C +:10200000000C182F882389F0D701AD92BC92D6011D +:10201000ED91FC910480F581E02DD3011A966C912D +:10202000C6010995F3011286ABC0202F013208F0DA +:1020300020E2D701AD92BC9221110BC0940142E085 +:10204000F3016285828193810E942707811197C0E5 +:1020500010C030E0820140E0D3011A966C911A97CB +:1020600012968D919C9113970E94B20B811187C09B +:10207000E5CF1F921F925F924F921F9288E08F933D +:1020800088E0882E912CA12CB12C99E2C92EE12C4C +:1020900006E020EA40E0F3016285828193810E949C +:1020A000DE0A182F0F900F900F900F900F900F9047 +:1020B000811166C08B81D3011B968C931B97720193 +:1020C00000E028E030E040E01A966C911A971296F2 +:1020D0008D919C9113970E94D90B811150C02B8137 +:1020E0003C8140E0F3016285828193810E94D90B9B +:1020F000811145C0298130E0CE0181967C0140E00C +:10210000D3011A966C911A9712968D919C91139700 +:102110000E94D90B811133C02E8140E0F30162850A +:10212000828193810E946E0D811129C001E0D3014B +:102130001B968C91801740F020E0402F68E0C3018F +:102140000E94610F0F5FF3CFD3011296ED91FC91C6 +:102150001397EA58FF4F80818460808381E0509616 +:102160008C930EC019ED0CC016ED0AC017ED08C017 +:1021700011ED06C014ED04C0F701B182A082182F42 +:10218000812FE8960FB6F894DEBF0FBECDBFDF916A +:10219000CF911F910F91FF90EF90DF90CF90BF9064 +:1021A000AF909F908F907F906F905F904F903F90F7 +:1021B0002F900895CF92DF92FF920F931F93CF93AA +:1021C000DF9300D000D0CDB7DEB78C01F62E198298 +:1021D0001A821B821C8220E0462F61E10E940D0FB3 +:1021E00020E04F2D60E1C8010E940D0F20E04F2D2F +:1021F00064E0C8010E94610F83E0C82ED12C9E01CB +:102200002F5F3F4F44E050E06F2DC8010E94380F10 +:102210008823F1F020E04F2D64E1C8010E940D0FEA +:1022200020E04F2D60E1C8010E940D0F64E170E0D5 +:1022300080E090E00E9458050F900F900F900F9053 +:10224000DF91CF911F910F91FF90DF90CF90089574 +:1022500089819A81AB81BC819D7F83309140A0416F +:10226000B105C1F264E670E080E090E00E9458059C +:1022700081E0C81AD10819F6CDCFFC0187E791E0BB +:1022800091838083738362831286138614861586F6 +:1022900016861786108A148288E085839CE39683CD +:1022A00091E09783808784E0818761157105B1F0A3 +:1022B000DB01AA5ABF4F80E090E02D913D91232B86 +:1022C00049F48B96880F991FDB01A80FB91FED9376 +:1022D000FC93089501968031910579F70895EF9266 +:1022E000FF920F931F93CF938C01C62F7A01FA01AF +:1022F00080819181A281B3818130F3E09F07F1E079 +:10230000AF07B105D1F060F48115E1E09E07AE079B +:10231000B10571F181309140A140B10571F064C007 +:10232000833021E0920720E1A207B105E1F183307B +:102330009340A041B105B9F157C08091710481115A +:1023400053C020E04C2F61E1C8010E940D0F20E036 +:102350004C2F60E1C8010E940D0F20E04C2F64E07B +:10236000C8010E94610F81E08093710481EB3DC040 +:1023700020E0462F61E1C8010E940D0F20E04C2FA4 +:1023800060E1C8010E940D0F10927104F80162858E +:102390006770C770660F660F660F6C2B8281938122 +:1023A0000E94440721C020E04C2F64E1C8010E9434 +:1023B0000D0F20E04C2F60E1C8010E940D0F64E179 +:1023C00070E080E090E00E945805F8016285F70116 +:1023D00021812695217067704C2FF80182819381AD +:1023E0000E946B0C1092710480E0CF911F910F91AD +:1023F000FF90EF900895CF92DF92EF920F931F938B +:10240000CF93DF93CDB7DEB72E970FB6F894DEBF2C +:102410000FBECDBF6C0181E090E09E878D87E12CDF +:102420008E010F5F1F4F9E01235F3F4F41E0F6017A +:102430006285828193810E94930D811151C002E0D7 +:1024400011E089818023D1F019861A861B861C86AB +:102450009E01275F3F4F44E050E0612FC6010E947C +:10246000380F81110BC0AE01475F5F4F612FC6016E +:102470000E946F11813B99F1811132C0000F1F5FE3 +:102480001830F9F611E0F6018385811740F11986BD :102490001A861B861C869E01275F3F4F44E050E052 -:1024A000612FC6010E945B0F81110BC0AE01475F17 -:1024B0005F4F612FC6010E949211813B99F18111FA -:1024C00032C0000F1F5F1830F9F611E0F601838566 -:1024D000811740F119861A861B861C869E01275F8C -:1024E0003F4F44E050E0612FC6010E945B0F811115 -:1024F00017C089859A85877091708130914081F4E9 -:102500008B859C8581609C878B87AE01475F5F4F81 -:10251000612FC6010E949211813B21F0811103C0FD -:102520001F5FD4CF80E02E960FB6F894DEBF0FBEAB -:10253000CDBFDF91CF911F910F91EF90DF90CF90A2 -:1025400008950F931F93CF93DF93FC0120892111EE -:1025500002C080E020C0EC010E9448050C851D856A -:102560002E853F85DC01CB01801B910BA20BB30BA9 -:10257000B7FDEFCFCE010E941E12182F0E94480512 -:10258000DC01CB018C599F4FAF4FBF4F8C879D878C -:10259000AE87BF87812FDF91CF911F910F91089553 -:1025A00080917E05089508950895CF93DF9320913B -:1025B0009B05243049F521E02093E90021E82150D2 -:1025C00059F03091E80035FD07C0EFE3F1E03197B5 -:1025D000F1F700C00000F3CF2091E80025FF14C000 -:1025E000EC0140E050E068E070E00E94D816809175 -:1025F000E8008E778093E80088E0FE01A6E7B5E06A -:1026000001900D928A95E1F7DF91CF910895CF93D4 -:10261000C0917404C1110BC00E94AD05643C7940A7 -:102620008105910520F081E080937404C1E08C2F36 -:10263000CF910895FF920F931F93CF93DF93D82FDD -:102640000FB607FE83C080919B05843081F0809196 -:10265000040190E001962091060130E0822393234B -:102660002091050130E08217930709F0CDC00E9448 -:102670000713811110C08091040190E00196209110 -:10268000060130E0822393232091050130E0821778 -:10269000930709F0B9C00E94A1058C01C091E9001F -:1026A000CF709091EC00892F817090FD80E8C82B4D -:1026B00082E08093E90085E0F82E8091EB0085FDB3 -:1026C00042C08091EB0080FF3EC08091EE0087FF0A -:1026D0003AC08091050190910401981709F457C000 -:1026E0009091E80095FF8EC0E0910201F091030106 -:1026F000E80FF11D20818F5F90910601892380935F -:1027000005012093F1008091E80085FDE2CF8091E2 -:10271000E80080FFDECF8091E8008E778093E800AC -:10272000F0920101D6CF8091040190E001962091B2 -:10273000060130E0822393232091050130E08217C7 -:10274000930709F44CC0CF70C093E9004091040195 -:10275000842F90E001962091060130E0822393239C -:102760002091050130E08217930709F450C0E091F1 -:102770000201F0910301E40FF11DD0838091040167 -:102780008F5F9091060189238093040140C080915E -:10279000E80085FF37C0D093F10021E03091F300CD -:1027A0008091F20090E0932B892B91F08091E800CA -:1027B00080FF0EC08091E80085FF03C01092F100F9 -:1027C000F9CF8091E8008E778093E800F0920101C4 -:1027D000222309F4A8CFCF70C093E90018C08091DC -:1027E0000101882309F4AFCF0E94A1059C01801745 -:1027F000910711F4890161CF90910101915090935B -:102800000101F8CF20E0CACF40910401B0CF80E0B1 -:10281000DF91CF911F910F91FF90089508958091BE -:102820009A05811104C00E9442190C949F190895C1 -:1028300010929A050895089542E061EC81E00E94AB -:10284000511642E261EC82E00C94511680919D0594 -:10285000833009F453C030F4813071F0823009F4D0 -:10286000BAC008958A3009F4A6C08B3009F478C044 -:10287000893009F0C8C020C080919C05813A09F0D8 -:10288000C2C08091E800877F8093E8008091A00516 -:102890009091A105892B21F468E086E795E003C0BB -:1028A00060E080E090E070E00E9423178091E800F3 -:1028B0008B778093E800089580919C05813209F020 -:1028C000A2C08091A0059091A105892B09F09BC021 -:1028D0008091E800877F8093E8008091E80082FD86 -:1028E00005C080919B058111F8CF8DC08091F100CA -:1028F00080937E058091E8008B7781C080919C0554 -:10290000813A09F080C08091A0059091A105892BA2 -:10291000A1F48091E800877F8093E8008091E8002F -:1029200080FFFCCF809112018093F1008091E8003C -:102930008E778093E8000E9486168091A005909182 -:10294000A105892B09F05FC08091E800877F809303 -:10295000E8008091E80080FFFCCF809111014AC01F -:1029600080919C05813209F04EC08091A005909124 -:10297000A105892B69F48091E800877F8093E800A6 -:102980000E94861680919E05809312010E944C1C25 -:102990008091A0059091A105892BA9F58091E8006F -:1029A000877F8093E8000E94861680919E05809321 -:1029B00011010C944C1C80919C05813221F5809171 -:1029C000E800877F8093E8000E94861680919F052B -:1029D00080937F05089580919C05813AA1F48091B0 -:1029E000E800877F8093E8008091E80080FFFCCFBB -:1029F00080917F058093F1008091E8008E7780932D -:102A0000E8000C948616089580917E0580937504E5 -:102A100010927E050E945B1B0C944C1C0C940415B8 -:102A20000E94791E80919905882329F00E94A21E98 -:102A300081110C943B1608950E94AA1E8091750482 -:102A400080937E0508950C941C150895CF9384B748 -:102A5000877F84BF0FB6F894A89580916000886145 -:102A600080936000109260000FBE90E080E80FB687 -:102A7000F89480936100909361000FBE8AE193E126 -:102A80000E94111E87E091E00E94D41A83E891E031 -:102A90000E94A9010E940E050E941C1B0E9442195F -:102AA0000E949F1978940E941E1B80919B05843080 -:102AB00019F00E942515F9CF81E791E00E94A90144 -:102AC0000E9421048FE591E00E94A901C2E080915B -:102AD0009B05853019F40E941015F9CF0E94221B26 -:102AE0002091E4003091E50080917204909173048C -:102AF0002817390761F38091E4009091E5009093E5 -:102B00007304809372040E940713882301F3809159 -:102B10009B058430E1F68091E9008F702091EC00F4 -:102B2000922F917020FD90E8892BC093E90090913D -:102B3000EB0090FF43C09091EE0097FF3FC0909153 -:102B4000050120910401291709F12091E80025FFD2 -:102B50001DC0E0910201F0910301E90FF11D3081E8 -:102B60009F5F209106019223909305013093F1001D -:102B70009091E80095FDE3CF9091E80090FFDFCFC2 -:102B80009091E8009E779093E800D9CF9091F30060 -:102B90002091F20030E0392B232B81F09091E80056 -:102BA00090FF0CC09091E80095FF03C01092F100D7 -:102BB000F9CF9091E8009E779093E8008F70809312 -:102BC000E90085CF292F332723303105C9F060F480 -:102BD0002130310581F02230310509F044C082E412 -:102BE00090E026ED31E043C021323105E1F02232A0 -:102BF000310549F138C082E190E028E132E037C088 -:102C000099278130910549F028F0029761F5EAE9AA -:102C1000F1E005C0E2EDF1E002C0E8ECF1E0849102 -:102C200090E09F0124C06115710541F0613071058C -:102C3000D1F489E090E021E032E019C089E090E031 -:102C400028EE31E014C06115710541F06130710565 -:102C500051F482E290E02AE232E009C080E490E0A0 -:102C60002CE432E004C080E090E020E030E0FA01A3 -:102C700031832083089580E189BD82E189BD09B453 -:102C800000FEFDCF8091D8008F7D8093D800809189 -:102C9000E00082608093E0008091E00081FDFCCF45 -:102CA0000895982F973068F59093E900981739F0B8 -:102CB0007091EC002091ED005091F00003C0242FA2 -:102CC000762F50E021FD02C09F5FECCF3091EB00EA -:102CD0003E7F3093EB003091ED003D7F3093ED006F -:102CE0003091EB0031603093EB007093EC00209357 -:102CF000ED005093F0002091EE0027FDE5CF80E03D -:102D000008958F708093E90081E0089580919C057B -:102D100087FF11C08091E80082FD05C080919B056E -:102D20008111F8CF11C08091E8008B770BC08091A2 -:102D30009B05882349F08091E80080FFF8CF8091BF -:102D4000E8008E778093E80008952091E4003091A8 -:102D5000E50095E64091EC00842F817040FF23C090 -:102D60008091E80080FD1DC080919B05882399F02B -:102D7000853099F08091EB0085FD11C04091E40011 -:102D80005091E5002417350729F3915011F09A016D -:102D9000E1CF84E0089582E0089583E0089581E022 -:102DA000089580E008954091E80042FFDDCF089546 -:102DB000CF92DF92EF92FF920F931F93CF93DF9307 -:102DC000EC018B017A010E94A516811133C0E11438 -:102DD000F10439F0F70180819181081B190BC80FAC -:102DE000D91FC12CD12C0115110519F18091E800D2 -:102DF00085FD16C08091E8008E778093E800E1148D -:102E0000F10449F0F70180819181C80ED91ED18269 -:102E1000C08285E00FC00E94A516882321F30AC056 -:102E200089918093F10001501109FFEFCF1ADF0A59 -:102E3000DACF80E0DF91CF911F910F91FF90EF905B -:102E4000DF90CF9008952091A2053091A305261719 -:102E5000370748F06115710539F42091E8002E77A5 -:102E60002093E80001C0B901FC0120E06115710563 -:102E700079F180919B058823F1F18530F1F1809102 -:102E8000E80083FD3CC08091E80082FD2EC0809167 -:102E9000E80080FFEBCF2091F3008091F20090E0FA -:102EA000922B6115710551F08830910538F421910C -:102EB0002093F100615071090196F3CF21E008974A -:102EC00009F020E08091E8008E778093E800CECF73 -:102ED0002111CFCF0AC080919B05882361F08530F6 -:102EE00061F08091E80083FD0AC08091E80082FFD4 -:102EF000F2CF80E0089582E0089583E0089581E0B4 -:102F000008952091A2053091A3052617370748F0B0 -:102F10006115710539F42091E8002E772093E800BF -:102F200001C0B901FC0120E06115710591F18091AA -:102F30009B05882309F440C0853009F43FC0809187 -:102F4000E80083FD3DC08091E80082FD2FC08091A4 -:102F5000E80080FFE9CF2091F3008091F20090E03B -:102F6000922B6115710559F08830910540F4249138 -:102F70002093F1003196615071090196F2CF21E062 -:102F8000089709F020E08091E8008E778093E800B0 -:102F9000CBCF2111CCCF0AC080919B05882361F053 -:102FA000853061F08091E80083FD0AC08091E800DF -:102FB00082FFF2CF80E0089582E0089583E00895D3 -:102FC00081E008951F93CF93DF93CDB7DEB7AA9723 -:102FD0000FB6F894DEBF0FBECDBFECE9F5E08091EF -:102FE000F100819325E0E43AF207C9F70E94261424 -:102FF0008091E80083FF2EC180919C0590919D05F2 -:10300000492F50E04A30510508F024C1FA01EA5A2C -:10301000FF4F0C942821803821F0823809F01AC122 -:1030200008C08091980590919905992389F0826054 -:103030000FC08091A0058F70873008F00BC180937E -:10304000E9008091EB0085FB882780F91092E90068 -:103050009091E800977F9093E8008093F1001092A0 -:10306000F100D1C0282F2D7F09F0F4C0882319F07A -:10307000823061F0EFC080919E05813009F0EAC096 -:10308000933009F080E0809399052EC080919E05D1 -:1030900081112AC08091A0058F702FEF280F263054 -:1030A00008F0D8C08093E9002091EB0020FF1CC0FD -:1030B000933021F48091EB00806214C09091EB007A -:1030C00090619093EB0021E030E0A90102C0440F31 -:1030D000551F8A95E2F74093EA001092EA0080912A -:1030E000EB0088608093EB001092E9008091E8008B -:1030F000877F8093E8000E948616ACC08111AAC029 -:1031000010919E051F778091E3008078812B80933A -:10311000E3008091E800877F8093E8000E94861694 -:103120008091E80080FFFCCF8091E300806880936D -:10313000E300111102C082E001C083E080939B058F -:1031400089C08058823008F085C080919E0590919A -:103150009F058C3D53E0950779F583E08A838AE2E9 -:1031600089834FB7F894DE01139620E03EE051E2E8 -:10317000E32FF0E050935700E49120FF03C0E29565 -:10318000EF703F5FEF708E2F90E0EA3010F0C7963F -:1031900001C0C0968D939D932F5F243149F74FBF97 -:1031A0008091E800877F8093E8006AE270E0CE01BA -:1031B00001960E94231716C06091A0057091A10589 -:1031C000AE014F5F5F4F0E94E215BC01892B09F4ED -:1031D00041C09091E800977F9093E80089819A819F -:1031E0000E9481178091E8008B778093E80032C0BD -:1031F000803881F58091E800877F8093E800809196 -:1032000097058093F1008091E8008E7772CF81114D -:1032100021C080919E0590919F0599270297D4F433 -:103220008091E800877F8093E80080919E058093DD -:1032300097050E94861680919705811106C080919E -:10324000E30087FD02C081E001C084E080939B051C -:103250000E941C148091E80083FF0AC08091E8005E -:10326000877F8093E8008091EB0080628093EB0081 -:10327000AA960FB6F894DEBF0FBECDBFDF91CF91F7 -:103280001F9108950E94B0190E94B819E0EEF0E075 -:10329000808181608083E8EDF0E080818F7780839A -:1032A00019BCA7EDB0E08C918E7F8C9380818F7ECE -:1032B000808310929A0508950F931F93CF93DF9305 -:1032C0000E94B0190E94B819C8EDD0E088818F77AC -:1032D000888388818068888388818F7D888319BCF2 -:1032E00010929B05109297051092990510929805DF -:1032F00000EE10E0F80180818B7F808388818160FF -:10330000888342E060E080E00E945116E1EEF0E048 -:1033100080818E7F8083E2EEF0E080818160808317 -:10332000808188608083F80180818E7F808388819E -:1033300080618883DF91CF911F910F910895E8ED0F -:10334000F0E080818F7E8083E7EDF0E08081816016 -:10335000808384E082BF81E080939A050C945C199D -:10336000E8EDF0E080818E7F80831092E200089586 -:103370001092DA001092E10008951F920F920FB69A -:103380000F9211242F933F934F935F936F937F93EB -:103390008F939F93AF93BF93EF93FF938091E1003F -:1033A00082FF0BC08091E20082FF07C08091E100A4 -:1033B0008B7F8093E1000E94D31A8091DA0080FF16 -:1033C0001FC08091D80080FF1BC08091DA008E7FE3 -:1033D0008093DA008091D90080FF0DC080E189BD23 -:1033E00082E189BD09B400FEFDCF81E080939B0599 -:1033F0000E940F1405C019BC10929B050E9418145E -:103400008091E10080FF19C08091E20080FF15C02B -:103410008091E2008E7F8093E2008091E2008061E3 -:103420008093E2008091D80080628093D80019BC1C -:1034300085E080939B050E940E158091E10084FF3A -:1034400030C08091E20084FF2CC080E189BD82E120 -:1034500089BD09B400FEFDCF8091D8008F7D809397 -:10346000D8008091E1008F7E8093E1008091E2009E -:103470008F7E8093E2008091E20081608093E20081 -:1034800080919705882311F084E007C08091E300C4 -:1034900087FD02C081E001C083E080939B050E940C -:1034A00023158091E10083FF29C08091E20083FF12 -:1034B00025C08091E100877F8093E10082E08093C6 -:1034C0009B05109297058091E1008E7F8093E1002B -:1034D0008091E2008E7F8093E2008091E200806123 -:1034E0008093E20042E060E080E00E94511680910B -:1034F000F00088608093F0000E941B14FF91EF9110 -:10350000BF91AF919F918F917F916F915F914F91FB -:103510003F912F910F900FBE0F901F9018951F9203 -:103520000F920FB60F9211242F933F934F935F93F7 -:103530006F937F938F939F93AF93BF93CF93DF93BB -:10354000EF93FF93C091E900CF708091EC00D82FEA -:10355000D17080FDD0E81092E9008091F000877F63 -:103560008093F00078940E94E2171092E900809115 -:10357000F00088608093F000CD2BCF70C093E900FD -:10358000FF91EF91DF91CF91BF91AF919F918F917B -:103590007F916F915F914F913F912F910F900FBE4F -:1035A0000F901F901895089590938505809384053A -:1035B0000895E0918405F0918505309721F0019000 -:1035C000F081E02D099480E00895E0918405F09168 -:1035D0008505309721F00280F381E02D099408954C -:1035E00020918205309183052817390771F0909357 -:1035F000830580938205E0918405F09185053097DD -:1036000021F00680F781E02D09940895209180052E -:10361000309181052817390771F0909381058093C7 -:103620008005E0918405F0918505309721F00084B4 -:10363000F185E02D099408950C945C1B0E94980577 -:103640000C942004CF93DF9300D000D01F92CDB70D -:10365000DEB70E9428048FEF89838A831B820E9431 -:10366000A1058160782F9D838C8349815A816B816C -:103670008D810E94FC1C0E942A040E94D91A9091FC -:103680008605891769F00E94D91A809386050F90E4 -:103690000F900F900F900F90DF91CF910C94751EAB -:1036A0000F900F900F900F900F90DF91CF91089592 -:1036B00008950C94581B089508950895089588233B -:1036C00009F4BBC09CEF980F913A18F40E947F1D3B -:1036D0000DC090E2980F983058F4877091E001C0C7 -:1036E000990F8A95EAF7892F0E94BA1D0C94EB1D59 -:1036F0009BE5980F933070F4853A29F0863A31F0C3 -:1037000083E890E005C081E890E002C082E890E0A4 -:103710000C94F01A98E5980F973108F08EC0883A0B -:1037200009F445C0893A09F445C08A3A09F445C00C -:103730008B3A09F445C08C3A09F445C08D3A09F436 -:1037400045C08E3A09F445C08F3A09F445C0813B23 -:1037500009F445C0803B09F445C0823B09F445C0EB -:10376000833B09F445C0843B09F445C0853B09F41B -:1037700045C0863B09F445C0873B09F445C0883BFA -:1037800009F445C0893B09F445C08A3B09F445C0AA -:103790008B3B09F445C08C3B09F445C08D3B09F4D3 -:1037A00045C08E3B09F445C080E090E044C082EE05 -:1037B00090E041C089EE90E03EC08AEE90E03BC0D0 -:1037C00085EB90E038C086EB90E035C083EB90E06D -:1037D00032C084EB90E02FC087EB90E02CC08CECE3 -:1037E00090E029C08DEC90E026C083E891E023C0F2 -:1037F0008AE891E020C082E991E01DC084E991E06F -:103800001AC081E292E017C083E292E014C084E221 -:1038100092E011C085E292E00EC086E292E00BC019 -:1038200087E292E008C08AE292E005C08FE690E06D -:1038300002C080E790E00C94061B0895882329F1CC -:103840009CEF980F913A18F40E949C1D0DC090E2D5 -:10385000980F983058F4877091E001C0990F8A95BD -:10386000EAF7892F0E94C01D0C94EB1D9BE5980F71 -:10387000933020F480E090E00C94F01A885A87315D -:1038800020F480E090E00C94061B08950E94D71D60 -:103890000E94AC1D0C94EB1D0E94C71D0C94461C8D -:1038A000EF92FF920F931F93CF93DF9300D000D03E -:1038B0001F92CDB7DEB78C010E94771E811190C098 -:1038C00085E0F801DE01119601900D928A95E1F7ED -:1038D000F80140815181238134812115310531F076 -:1038E0005F3F31F481E04F3F19F403C081E001C034 -:1038F00080E080FD75C0F801E28049835A83EB8245 -:10390000722F3D832C836E2D8D810E94391DF82EE0 -:10391000492F4F70892F82958F708E30B1F108F04A -:1039200050C0823008F05CC0907F142F11F01295C7 -:10393000107FEE20A9F0112329F0812F0E94CA1DCB -:103940000E94EB1D8F2D0F900F900F900F900F90F6 -:10395000DF91CF911F910F91FF90EF900C945F1B1F -:103960008F2D0E941E1C1123D9F1812F0E94D01D82 -:103970000F900F900F900F900F90DF91CF911F91AC -:103980000F91FF90EF900C94EB1DF11029C0EE20E9 -:1039900039F10E944C1CFFEF20E782E0F1502040FB -:1039A0008040E1F700C000000F900F900F900F9043 -:1039B0000F90DF91CF911F910F91FF90EF900C949A -:1039C000D71E6F2DC8010F900F900F900F900F9082 -:1039D000DF91CF911F910F91FF90EF900C94F61E05 -:1039E0000F900F900F900F900F90DF91CF911F913C -:1039F0000F91FF90EF900895CF93DF93CDB7DEB78F -:103A00002A970FB6F894DEBF0FBECDBF942F4E831A -:103A1000252F5F83688779878A8749855A85452B53 -:103A200031F02F3F31F481E09F3F19F403C081E072 -:103A300001C080E080FD07C04E815F816885798587 -:103A40008A850E94661E85E0FE013696DE0111968B -:103A500001900D928A95E1F7CE0101960E94501CCB -:103A60002A960FB6F894DEBF0FBECDBFDF91CF917F -:103A700008950F931F93CF93DF9300D000D01F9230 -:103A8000CDB7DEB7042F49835A836B837C838D8344 -:103A90002C813D81232B31F05F3F31F481E04F3F9A -:103AA00019F403C081E001C080E080FF03C080E022 -:103AB00090E01BC08B8110E0882379F0609187052E -:103AC000709188058091890590918A050E94161E43 -:103AD000F801E957FA4F808304C0F801E957FA4F1B -:103AE000808169817A810E94061F0F900F900F904C -:103AF0000F900F90DF91CF911F910F91089520911A -:103B0000130130911401F90132969FEF40E0519179 -:103B1000851789F09F3F19F4511101C0942F4F5F11 -:103B20004630A9F79F3F39F0F901E90FF11D97FDE4 -:103B3000FA95828308950895E0911301F09114019C -:103B40009F012A5F3F4F9281891301C012823196F3 -:103B5000E217F307C1F7089581E090E0E0911301C7 -:103B6000F0911401E80FF91F108201968830910539 -:103B7000A9F7089590919505892B8093950508954F -:103B800080959091950589238093950508951092CD -:103B90009505089590919405892B80939405089537 -:103BA00080959091940589238093940508951092AF -:103BB000940508958091130190911401FC013196B0 -:103BC0009C01285F3F4F80E0919191118F5FE21738 -:103BD000F307D1F70895E0911301F091140180915A -:103BE00095058083E0911301F091140190818091FB -:103BF0009405892B808380918B05882361F0E09167 -:103C00001301F09114019081892B80830E94DA1DA9 -:103C1000811110928B0580911301909114010C94E5 -:103C2000E51A90938B0180938A010895CF92DF92D9 -:103C3000EF92FF926C01EE24FF24C114D104E10441 -:103C4000F10421F0C701B60120E101C020E0C72E38 -:103C5000D82EE92EFF24C114D104E104F10419F097 -:103C6000285FC701B6016B017C0154E0F694E7942C -:103C7000D794C7945A95D1F7C114D104E104F10443 -:103C800019F02C5FC701B6016B017C0142E0F6948C -:103C9000E794D794C7944A95D1F7C114D104E104AD -:103CA000F10419F02E5FC701B601DC01CB01B69516 -:103CB000A79597958795892B8A2B8B2B09F02F5FDA -:103CC000822FFF90EF90DF90CF900895CF93DF93F6 -:103CD00000D000D01F92CDB7DEB70F900F900F909D -:103CE0000F900F90DF91CF9108950C94591B80E0B5 -:103CF000089580919B05843021F11092960520E46F -:103D000088E190E00FB6F894A895809360000FBE0C -:103D10002093600083B7817F846083BF83B7816015 -:103D200083BF7894889583B78E7F83BF0FB6F8944E -:103D3000A895809160008861809360001092600077 -:103D40000FBE08950E945D1B0E9428040E945E1B06 -:103D500080E008950E945B1B0C944C1C1F920F92F4 -:103D60000FB60F9211248F939F93AF93BF938091BF -:103D70009605811113C08091680490916904A09107 -:103D80006A04B0916B044196A11DB11D8093680433 -:103D900090936904A0936A04B0936B04BF91AF91B0 -:103DA0009F918F910F900FBE0F901F9018950E94BA -:103DB0004219F89487E797E79093010880930008E9 -:103DC00087E090EBDC018093A4059093A505A09378 -:103DD000A605B093A7059CE088E10FB6F894A895D6 -:103DE000809360000FBE90936000FFCF0895E62F90 -:103DF000F0E0E15AFE4F84910895E82FF0E0EE0FD5 -:103E0000FF1FE352F0408591949108950E94F71EA0 -:103E100090E4980F903218F40E94FD1E08958F3B95 -:103E200050F4883A48F5853AD0F48430A8F48130CB -:103E300009F4B2C0AEC0883E40F4803E68F48F3BC7 -:103E400009F0A7C020E030EEA9C0803F08F4A1C06F -:103E5000282F30E03065A2C0282F30E09FC0853A7F -:103E600029F0863A31F023E830E498C021E830E4C4 -:103E700095C022E830E492C0883A09F445C0893AF6 -:103E800009F445C08A3A09F445C08B3A09F445C0A3 -:103E90008C3A09F445C08D3A09F445C08E3A09F4CC -:103EA00045C08F3A09F445C0813B09F445C0803BC9 -:103EB00009F445C0823B09F445C0833B09F445C081 -:103EC000843B09F445C0853B09F445C0863B09F4B1 -:103ED00045C0873B09F445C0883B09F445C0893B90 -:103EE00009F445C08A3B09F445C08B3B09F445C041 -:103EF0008C3B09F445C08D3B09F445C08E3B09F469 -:103F000045C020E034E44AC022EE34E447C029EE44 -:103F100034E444C02AEE34E441C025EB34E43EC02E -:103F200026EB34E43BC023EB34E438C024EB34E428 -:103F300035C027EB34E432C02CEC34E42FC02DEC38 -:103F400034E42CC023E835E429C02AE835E426C04F -:103F500022E935E423C024E935E420C021E236E437 -:103F60001DC023E236E41AC024E236E417C025E27D -:103F700036E414C026E236E411C027E236E40EC06F -:103F80002AE236E40BC02FE634E408C020E734E42C -:103F900005C020E030E002C021E030E0C901089512 -:103FA0000E94412008F481E008950E94952088F045 -:103FB0009F5798F0B92F9927B751B0F0E1F0660FED -:103FC000771F881F991F1AF0BA95C9F714C0B1302E -:103FD00091F00E94AF20B1E008950C94AF20672FBC -:103FE000782F8827B85F39F0B93FCCF3869577955D -:103FF0006795B395D9F73EF4909580957095619546 -:104000007F4F8F4F9F4F0895E89409C097FB3EF470 -:1040100090958095709561957F4F8F4F9F4F992315 -:10402000A9F0F92F96E9BB279395F6958795779593 -:104030006795B795F111F8CFFAF4BB0F11F460FF53 -:104040001BC06F5F7F4F8F4F9F4F16C0882311F0AB -:1040500096E911C0772321F09EE8872F762F05C0BF -:10406000662371F096E8862F70E060E02AF09A955A -:10407000660F771F881FDAF7880F9695879597F94F -:104080000895990F0008550FAA0BE0E8FEEF1616E9 -:104090001706E807F907C0F012161306E407F5073C -:1040A00098F0621B730B840B950B39F40A2661F0B0 -:1040B000232B242B252B21F408950A2609F4A14053 -:1040C000A6958FEF811D811D089597F99F6780E860 -:1040D00070E060E008959FEF80EC089500240A945A -:1040E0001616170618060906089500240A941216D3 -:1040F0001306140605060895092E0394000C11F406 -:10410000882352F0BB0F40F4BF2B11F460FF04C0B2 -:104110006F5F7F4F8F4F9F4F089557FD9058440F0B -:10412000551F59F05F3F71F04795880F97FB991F16 -:1041300061F09F3F79F087950895121613061406D3 -:10414000551FF2CF4695F1DF08C016161706180660 -:10415000991FF1CF86957105610508940895E8943B -:10416000BB2766277727CB0197F908950E94412046 -:1041700008F48FEF08950E94CE200C947C200E94BA -:104180006E2038F00E94752020F0952311F00C94D9 -:1041900065200C946B2011240C94B0200E948D207B -:1041A00070F3959FC1F3950F50E0551F629FF0018A -:1041B000729FBB27F00DB11D639FAA27F00DB11DA3 -:1041C000AA1F649F6627B00DA11D661F829F22272C -:1041D000B00DA11D621F739FB00DA11D621F839FB3 -:1041E000A00D611D221F749F3327A00D611D231F89 -:1041F000849F600D211D822F762F6A2F11249F57D7 -:1042000050409AF0F1F088234AF0EE0FFF1FBB1FD9 -:10421000661F771F881F91505040A9F79E3F510598 -:1042200080F00C9465200C94B0205F3FE4F3983E3E -:10423000D4F3869577956795B795F795E7959F5F42 -:10424000C1F7FE2B880F911D9695879597F90895D4 -:10425000EE0FFF1F0590F491E02D0994F894FFCF25 -:10426000010576040000FFD012D512D3120E14D42B -:104270001201018C05556E6B6E6F776E20484944B4 -:10428000204465736320547970653A00556E6B6EF7 -:104290006F776E204465736320547970653A00200F -:1042A0006C656E00696456656E646F720069645077 -:1042B000726F64756374000000000026052C0522EF -:1042C0000525051C051F051F05000000004706EE1B -:1042D00005A70600000000AF0F000F0E0FA1120689 -:0A42E0000FFD10020F090F040F007C +:1024A000612FC6010E94380F811117C089859A8556 +:1024B000877091708130914081F48B859C8581601B +:1024C0009C878B87AE01475F5F4F612FC6010E94DB +:1024D0006F11813B21F0811103C01F5FD4CF80E0D9 +:1024E0002E960FB6F894DEBF0FBECDBFDF91CF9111 +:1024F0001F910F91EF90DF90CF9008950F931F934E +:10250000CF93DF93FC012089211102C080E020C01D +:10251000EC010E9456050C851D852E853F85DC014A +:10252000CB01801B910BA20BB30BB7FDEFCFCE01FC +:102530000E94FB11182F0E945605DC01CB018C591B +:102540009F4FAF4FBF4F8C879D87AE87BF87812F2F +:10255000DF91CF911F910F91089580917E0508958D +:1025600008950895CF93DF9320919B05243049F57A +:1025700021E02093E90021E8215059F03091E80052 +:1025800035FD07C0EFE3F1E03197F1F700C000003F +:10259000F3CF2091E80025FF14C0EC0140E050E0AB +:1025A00068E070E00E94B5168091E8008E77809315 +:1025B000E80088E0FE01A6E7B5E001900D928A955B +:1025C000E1F7DF91CF910895CF93C0917404C111C9 +:1025D0000BC00E94BB05643C79408105910520F049 +:1025E00081E080937404C1E08C2FCF910895FF9215 +:1025F0000F931F93CF93DF93D82F0FB607FE83C09F +:1026000080919B05843081F08091040190E00196D7 +:102610002091060130E0822393232091050130E0D0 +:102620008217930709F0CDC00E94E412811110C0F7 +:102630008091040190E001962091060130E0822310 +:1026400093232091050130E08217930709F0B9C068 +:102650000E94AF058C01C091E900CF709091EC0011 +:10266000892F817090FD80E8C82B82E08093E9007B +:1026700085E0F82E8091EB0085FD42C08091EB0053 +:1026800080FF3EC08091EE0087FF3AC08091050137 +:1026900090910401981709F457C09091E80095FFB4 +:1026A0008EC0E0910201F0910301E80FF11D20813D +:1026B0008F5F909106018923809305012093F1009B +:1026C0008091E80085FDE2CF8091E80080FFDECFB9 +:1026D0008091E8008E778093E800F0920101D6CFD8 +:1026E0008091040190E001962091060130E0822360 +:1026F00093232091050130E08217930709F44CC021 +:10270000CF70C093E90040910401842F90E00196BE +:102710002091060130E0822393232091050130E0CF +:102720008217930709F450C0E0910201F091030170 +:10273000E40FF11DD083809104018F5F9091060119 +:1027400089238093040140C08091E80085FF37C051 +:10275000D093F10021E03091F3008091F20090E0FD +:10276000932B892B91F08091E80080FF0EC080911F +:10277000E80085FF03C01092F100F9CF8091E800D6 +:102780008E778093E800F0920101222309F4A8CF0C +:10279000CF70C093E90018C080910101882309F42B +:1027A000AFCF0E94AF059C018017910711F48901FA +:1027B00061CF90910101915090930101F8CF20E0F9 +:1027C000CACF40910401B0CF80E0DF91CF911F913B +:1027D0000F91FF900895089580919A05811104C08A +:1027E0000E941F190C947C19089510929A0508955F +:1027F000089542E061EC81E00E942E1642E261EC15 +:1028000082E00C942E1680919D05833009F453C00C +:1028100030F4813071F0823009F4BAC008958A3002 +:1028200009F4A6C08B3009F478C0893009F0C8C01B +:1028300020C080919C05813A09F0C2C08091E800D7 +:10284000877F8093E8008091A0059091A105892B56 +:1028500021F468E086E795E003C060E080E090E066 +:1028600070E00E9400178091E8008B778093E80069 +:10287000089580919C05813209F0A2C08091A00545 +:102880009091A105892B09F09BC08091E800877F7A +:102890008093E8008091E80082FD05C080919B054F +:1028A0008111F8CF8DC08091F10080937E058091D9 +:1028B000E8008B7781C080919C05813A09F080C047 +:1028C0008091A0059091A105892BA1F48091E80049 +:1028D000877F8093E8008091E80080FFFCCF8091A3 +:1028E00012018093F1008091E8008E778093E800D8 +:1028F0000E9463168091A0059091A105892B09F093 +:102900005FC08091E800877F8093E8008091E800B5 +:1029100080FFFCCF809111014AC080919C058132DB +:1029200009F04EC08091A0059091A105892B69F412 +:102930008091E800877F8093E8000E946316809171 +:102940009E05809312010E94291C8091A005909100 +:10295000A105892BA9F58091E800877F8093E80085 +:102960000E94631680919E05809311010C94291C8E +:1029700080919C05813221F58091E800877F8093CA +:10298000E8000E94631680919F0580937F0508955B +:1029900080919C05813AA1F48091E800877F809323 +:1029A000E8008091E80080FFFCCF80917F05809354 +:1029B000F1008091E8008E778093E8000C94631614 +:1029C000089580917E058093750410927E050E9483 +:1029D000381B0C94291C0C94E1140E94561E809103 +:1029E0009905882329F00E947F1E81110C941816E6 +:1029F00008950E94871E8091750480937E05089536 +:102A00000C94F9140895CF9384B7877F84BF0FB6D1 +:102A1000F894A8958091600088618093600010927E +:102A200060000FBE90E080E80FB6F89480936100DC +:102A3000909361000FBE87EF92E10E94EE1D87E048 +:102A400091E00E94B11A83E891E00E94A9010E94DE +:102A50001C050E94F91A0E941F190E947C19789483 +:102A60000E94FB1A80919B05843019F00E94021588 +:102A7000F9CF81E791E00E94A9010E9421048FE52E +:102A800091E00E94A901C2E080919B05853019F474 +:102A90000E94ED14F9CF0E94FF1A2091E4003091BA +:102AA000E50080917204909173042817390761F34F +:102AB0008091E4009091E5009093730480937204F8 +:102AC0000E94E412882301F380919B058430E1F693 +:102AD0008091E9008F702091EC00922F917020FD81 +:102AE00090E8892BC093E9009091EB0090FF43C0E0 +:102AF0009091EE0097FF3FC0909105012091040155 +:102B0000291709F12091E80025FF1DC0E09102017D +:102B1000F0910301E90FF11D30819F5F20910601C3 +:102B20009223909305013093F1009091E80095FD78 +:102B3000E3CF9091E80090FFDFCF9091E8009E777F +:102B40009093E800D9CF9091F3002091F20030E00B +:102B5000392B232B81F09091E80090FF0CC09091CD +:102B6000E80095FF03C01092F100F9CF9091E800C2 +:102B70009E779093E8008F708093E90085CF292F8E +:102B8000332723303105C9F060F42130310581F05D +:102B90002230310509F044C082E490E026ED31E0B6 +:102BA00043C021323105E1F02232310549F138C00C +:102BB00082E190E028E132E037C099278130910529 +:102BC00049F028F0029761F5EAE9F1E005C0E2ED8D +:102BD000F1E002C0E8ECF1E0849190E09F0124C0B4 +:102BE0006115710541F061307105D1F489E090E023 +:102BF00021E032E019C089E090E028EE31E014C015 +:102C00006115710541F06130710551F482E290E087 +:102C10002AE232E009C080E490E02CE432E004C013 +:102C200080E090E020E030E0FA01318320830895D5 +:102C300080E189BD82E189BD09B400FEFDCF8091AC +:102C4000D8008F7D8093D8008091E00082608093CF +:102C5000E0008091E00081FDFCCF0895982F97302F +:102C600068F59093E900981739F07091EC00209185 +:102C7000ED005091F00003C0242F762F50E021FD8D +:102C800002C09F5FECCF3091EB003E7F3093EB00B2 +:102C90003091ED003D7F3093ED003091EB003160DD +:102CA0003093EB007093EC002093ED005093F00014 +:102CB0002091EE0027FDE5CF80E008958F7080938E +:102CC000E90081E0089580919C0587FF11C0809103 +:102CD000E80082FD05C080919B058111F8CF11C0ED +:102CE0008091E8008B770BC080919B05882349F089 +:102CF0008091E80080FFF8CF8091E8008E77809384 +:102D0000E80008952091E4003091E50095E64091B7 +:102D1000EC00842F817040FF23C08091E80080FD8B +:102D20001DC080919B05882399F0853099F0809192 +:102D3000EB0085FD11C04091E4005091E50024179F +:102D4000350729F3915011F09A01E1CF84E00895FD +:102D500082E0089583E0089581E0089580E0089579 +:102D60004091E80042FFDDCF0895CF92DF92EF92CD +:102D7000FF920F931F93CF93DF93EC018B017A01A6 +:102D80000E948216811133C0E114F10439F0F70179 +:102D900080819181081B190BC80FD91FC12CD12C20 +:102DA0000115110519F18091E80085FD16C080918B +:102DB000E8008E778093E800E114F10449F0F70110 +:102DC00080819181C80ED91ED182C08285E00FC05A +:102DD0000E948216882321F30AC089918093F10012 +:102DE00001501109FFEFCF1ADF0ADACF80E0DF913F +:102DF000CF911F910F91FF90EF90DF90CF900895AA +:102E00002091A2053091A3052617370748F06115D8 +:102E1000710539F42091E8002E772093E80001C075 +:102E2000B901FC0120E06115710579F180919B05E4 +:102E30008823F1F18530F1F18091E80083FD3CC0F9 +:102E40008091E80082FD2EC08091E80080FFEBCFEA +:102E50002091F3008091F20090E0922B61157105B2 +:102E600051F08830910538F421912093F1006150A0 +:102E700071090196F3CF21E0089709F020E08091D5 +:102E8000E8008E778093E800CECF2111CFCF0AC023 +:102E900080919B05882361F0853061F08091E80086 +:102EA00083FD0AC08091E80082FFF2CF80E00895A0 +:102EB00082E0089583E0089581E008952091A205BD +:102EC0003091A3052617370748F06115710539F4CD +:102ED0002091E8002E772093E80001C0B901FC01A1 +:102EE00020E06115710591F180919B05882309F41B +:102EF00040C0853009F43FC08091E80083FD3DC0AB +:102F00008091E80082FD2FC08091E80080FFE9CF2A +:102F10002091F3008091F20090E0922B61157105F1 +:102F200059F08830910540F424912093F1003196B6 +:102F3000615071090196F2CF21E0089709F020E075 +:102F40008091E8008E778093E800CBCF2111CCCF21 +:102F50000AC080919B05882361F0853061F08091E3 +:102F6000E80083FD0AC08091E80082FFF2CF80E094 +:102F7000089582E0089583E0089581E008951F9305 +:102F8000CF93DF93CDB7DEB7AA970FB6F894DEBF25 +:102F90000FBECDBFECE9F5E08091F100819325E013 +:102FA000E43AF207C9F70E9403148091E80083FF16 +:102FB0002EC180919C0590919D05492F50E04A308B +:102FC000510508F024C1FA01EA5AFF4F0C9405217B +:102FD000803821F0823809F01AC108C08091980524 +:102FE00090919905992389F082600FC08091A00586 +:102FF0008F70873008F00BC18093E9008091EB005F +:1030000085FB882780F91092E9009091E800977F6E +:103010009093E8008093F1001092F100D1C0282F26 +:103020002D7F09F0F4C0882319F0823061F0EFC0E1 +:1030300080919E05813009F0EAC0933009F080E06C +:10304000809399052EC080919E0581112AC08091A0 +:10305000A0058F702FEF280F263008F0D8C080937E +:10306000E9002091EB0020FF1CC0933021F48091F7 +:10307000EB00806214C09091EB0090619093EB00A4 +:1030800021E030E0A90102C0440F551F8A95E2F704 +:103090004093EA001092EA008091EB0088608093F0 +:1030A000EB001092E9008091E800877F8093E800B0 +:1030B0000E946316ACC08111AAC010919E051F77B3 +:1030C0008091E3008078812B8093E3008091E80079 +:1030D000877F8093E8000E9463168091E80080FF5C +:1030E000FCCF8091E30080688093E300111102C05F +:1030F00082E001C083E080939B0589C080588230C4 +:1031000008F085C080919E0590919F058C3D53E00D +:10311000950779F583E08A838AE289834FB7F8942B +:10312000DE01139620E03EE051E2E32FF0E0509301 +:103130005700E49120FF03C0E295EF703F5FEF700E +:103140008E2F90E0EA3010F0C79601C0C0968D93A4 +:103150009D932F5F243149F74FBF8091E800877F0F +:103160008093E8006AE270E0CE0101960E940017A9 +:1031700016C06091A0057091A105AE014F5F5F4F31 +:103180000E94BF15BC01892B09F441C09091E80051 +:10319000977F9093E80089819A810E945E178091C1 +:1031A000E8008B778093E80032C0803881F5809109 +:1031B000E800877F8093E800809197058093F10075 +:1031C0008091E8008E7772CF811121C080919E0599 +:1031D00090919F0599270297D4F48091E800877F0A +:1031E0008093E80080919E05809397050E94631666 +:1031F00080919705811106C08091E30087FD02C090 +:1032000081E001C084E080939B050E94F9138091C6 +:10321000E80083FF0AC08091E800877F8093E80080 +:103220008091EB0080628093EB00AA960FB6F89431 +:10323000DEBF0FBECDBFDF91CF911F9108950E94D9 +:103240008D190E949519E0EEF0E080818160808305 +:10325000E8EDF0E080818F77808319BCA7EDB0E0C6 +:103260008C918E7F8C9380818F7E808310929A05C3 +:1032700008950F931F93CF93DF930E948D190E949F +:103280009519C8EDD0E088818F7788838881806820 +:10329000888388818F7D888319BC10929B0510924A +:1032A0009705109299051092980500EE10E0F8012C +:1032B00080818B7F808388818160888342E060E0A9 +:1032C00080E00E942E16E1EEF0E080818E7F808308 +:1032D000E2EEF0E08081816080838081886080837D +:1032E000F80180818E7F8083888180618883DF916F +:1032F000CF911F910F910895E8EDF0E080818F7ECE +:103300008083E7EDF0E080818160808384E082BF8C +:1033100081E080939A050C943919E8EDF0E0808102 +:103320008E7F80831092E20008951092DA0010924E +:10333000E10008951F920F920FB60F9211242F9360 +:103340003F934F935F936F937F938F939F93AF932D +:10335000BF93EF93FF938091E10082FF0BC08091B8 +:10336000E20082FF07C08091E1008B7F8093E10043 +:103370000E94B01A8091DA0080FF1FC08091D800AF +:1033800080FF1BC08091DA008E7F8093DA008091ED +:10339000D90080FF0DC080E189BD82E189BD09B4FB +:1033A00000FEFDCF81E080939B050E94EC1305C0D9 +:1033B00019BC10929B050E94F5138091E10080FFDB +:1033C00019C08091E20080FF15C08091E2008E7FDD +:1033D0008093E2008091E20080618093E20080911E +:1033E000D80080628093D80019BC85E080939B054B +:1033F0000E94EB148091E10084FF30C08091E200D4 +:1034000084FF2CC080E189BD82E189BD09B400FE42 +:10341000FDCF8091D8008F7D8093D8008091E1000E +:103420008F7E8093E1008091E2008F7E8093E200A6 +:103430008091E20081608093E2008091970588236B +:1034400011F084E007C08091E30087FD02C081E0B5 +:1034500001C083E080939B050E9400158091E100EC +:1034600083FF29C08091E20083FF25C08091E100A5 +:10347000877F8093E10082E080939B0510929705FF +:103480008091E1008E7F8093E1008091E2008E7F49 +:103490008093E2008091E20080618093E20042E04C +:1034A00060E080E00E942E168091F000886080939A +:1034B000F0000E94F813FF91EF91BF91AF919F919F +:1034C0008F917F916F915F914F913F912F910F90CD +:1034D0000FBE0F901F9018951F920F920FB60F926C +:1034E00011242F933F934F935F936F937F938F9309 +:1034F0009F93AF93BF93CF93DF93EF93FF93C091CD +:10350000E900CF708091EC00D82FD17080FDD0E819 +:103510001092E9008091F000877F8093F00078940A +:103520000E94BF171092E9008091F000886080939C +:10353000F000CD2BCF70C093E900FF91EF91DF91A8 +:10354000CF91BF91AF919F918F917F916F915F913B +:103550004F913F912F910F900FBE0F901F90189594 +:10356000089590938505809384050895E0918405DE +:10357000F0918505309721F00190F081E02D0994BC +:1035800080E00895E0918405F0918505309721F061 +:103590000280F381E02D09940895209182053091F5 +:1035A00083052817390771F090938305809382056E +:1035B000E0918405F0918505309721F00680F78130 +:1035C000E02D0994089520918005309181052817F8 +:1035D000390771F09093810580938005E09184050F +:1035E000F0918505309721F00084F185E02D099454 +:1035F00008950C94391B0E94A6050C942004CF93C7 +:10360000DF9300D000D01F92CDB7DEB70E94280410 +:103610008FEF89838A831B820E94AF058160782F98 +:103620009D838C8349815A816B818D810E94D91C35 +:103630000E942A040E94B61A90918605891769F0A3 +:103640000E94B61A809386050F900F900F900F90EE +:103650000F90DF91CF910C94521E0F900F900F900E +:103660000F900F90DF91CF91089508950C94351B22 +:103670000895089508950895882309F4BBC09CEF28 +:10368000980F913A18F40E945C1D0DC090E2980FBB +:10369000983058F4877091E001C0990F8A95EAF745 +:1036A000892F0E94971D0C94C81D9BE5980F93309D +:1036B00070F4853A29F0863A31F083E890E005C04D +:1036C00081E890E002C082E890E00C94CD1A98E581 +:1036D000980F973108F08EC0883A09F445C0893AAE +:1036E00009F445C08A3A09F445C08B3A09F445C04B +:1036F0008C3A09F445C08D3A09F445C08E3A09F474 +:1037000045C08F3A09F445C0813B09F445C0803B70 +:1037100009F445C0823B09F445C0833B09F445C028 +:10372000843B09F445C0853B09F445C0863B09F458 +:1037300045C0873B09F445C0883B09F445C0893B37 +:1037400009F445C08A3B09F445C08B3B09F445C0E8 +:103750008C3B09F445C08D3B09F445C08E3B09F410 +:1037600045C080E090E044C082EE90E041C089EE28 +:1037700090E03EC08AEE90E03BC085EB90E038C020 +:1037800086EB90E035C083EB90E032C084EB90E0B4 +:103790002FC087EB90E02CC08CEC90E029C08DEC22 +:1037A00090E026C083E891E023C08AE891E020C041 +:1037B00082E991E01DC084E991E01AC081E292E0C3 +:1037C00017C083E292E014C084E292E011C085E267 +:1037D00092E00EC086E292E00BC087E292E008C061 +:1037E0008AE292E005C08FE690E002C080E790E0B8 +:1037F0000C94E31A0895882329F19CEF980F913ACD +:1038000018F40E94791D0DC090E2980F983058F47A +:10381000877091E001C0990F8A95EAF7892F0E947D +:103820009D1D0C94C81D9BE5980F933020F480E0FB +:1038300090E00C94CD1A885A873120F480E090E013 +:103840000C94E31A08950E94B41D0E94891D0C94E3 +:10385000C81D0E94A41D0C94231CEF92FF920F938D +:103860001F93CF93DF9300D000D01F92CDB7DEB768 +:103870008C010E94541E811190C085E0F801DE0188 +:10388000119601900D928A95E1F7F80140815181DE +:10389000238134812115310531F05F3F31F481E01E +:1038A0004F3F19F403C081E001C080E080FD75C086 +:1038B000F801E28049835A83EB82722F3D832C8387 +:1038C0006E2D8D810E94161DF82E492F4F70892F65 +:1038D00082958F708E30B1F108F050C0823008F0C0 +:1038E0005CC0907F142F11F01295107FEE20A9F08C +:1038F000112329F0812F0E94A71D0E94C81D8F2D22 +:103900000F900F900F900F900F90DF91CF911F911C +:103910000F91FF90EF900C943C1B8F2D0E94FB1B8E +:103920001123D9F1812F0E94AD1D0F900F900F90A0 +:103930000F900F90DF91CF911F910F91FF90EF901B +:103940000C94C81DF11029C0EE2039F10E94291CE9 +:10395000FFEF20E782E0F15020408040E1F700C017 +:1039600000000F900F900F900F900F90DF91CF916C +:103970001F910F91FF90EF900C94B41E6F2DC80112 +:103980000F900F900F900F900F90DF91CF911F919C +:103990000F91FF90EF900C94D31E0F900F900F900B +:1039A0000F900F90DF91CF911F910F91FF90EF90AB +:1039B0000895CF93DF93CDB7DEB72A970FB6F8946B +:1039C000DEBF0FBECDBF942F4E83252F5F83688748 +:1039D00079878A8749855A85452B31F02F3F31F405 +:1039E00081E09F3F19F403C081E001C080E080FDC9 +:1039F00007C04E815F81688579858A850E94431E54 +:103A000085E0FE013696DE01119601900D928A95B1 +:103A1000E1F7CE0101960E942D1C2A960FB6F8946C +:103A2000DEBF0FBECDBFDF91CF9108950F931F93DF +:103A3000CF93DF9300D000D01F92CDB7DEB7042F15 +:103A400049835A836B837C838D832C813D81232B17 +:103A500031F05F3F31F481E04F3F19F403C081E062 +:103A600001C080E080FF03C080E090E01BC08B813C +:103A700010E0882379F06091870570918805809126 +:103A8000890590918A050E94F31DF801E957FA4FC4 +:103A9000808304C0F801E957FA4F808169817A81F7 +:103AA0000E94E31E0F900F900F900F900F90DF91E8 +:103AB000CF911F910F91089520911301309114011E +:103AC000F90132969FEF40E05191851789F09F3FB1 +:103AD00019F4511101C0942F4F5F4630A9F79F3F51 +:103AE00039F0F901E90FF11D97FDFA9582830895E8 +:103AF0000895E0911301F09114019F012A5F3F4F57 +:103B00009281891301C012823196E217F307C1F73F +:103B1000089581E090E0E0911301F0911401E80F25 +:103B2000F91F1082019688309105A9F708959091A8 +:103B30009505892B8093950508958095909195051D +:103B40008923809395050895109295050895909185 +:103B50009405892B80939405089580959091940500 +:103B60008923809394050895109294050895809177 +:103B7000130190911401FC0131969C01285F3F4F85 +:103B800080E0919191118F5FE217F307D1F70895CB +:103B9000E0911301F0911401809195058083E091EB +:103BA0001301F0911401908180919405892B8083F9 +:103BB00080918B05882361F0E0911301F09114014D +:103BC0009081892B80830E94B71D811110928B05F3 +:103BD00080911301909114010C94C21A90938B015F +:103BE00080938A010895CF92DF92EF92FF926C0149 +:103BF000EE24FF24C114D104E104F10421F0C70133 +:103C0000B60120E101C020E0C72ED82EE92EFF2406 +:103C1000C114D104E104F10419F0285FC701B60111 +:103C20006B017C0154E0F694E794D794C7945A95BD +:103C3000D1F7C114D104E104F10419F02C5FC701DC +:103C4000B6016B017C0142E0F694E794D794C794E7 +:103C50004A95D1F7C114D104E104F10419F02E5FA3 +:103C6000C701B601DC01CB01B695A795979587955D +:103C7000892B8A2B8B2B09F02F5F822FFF90EF90DF +:103C8000DF90CF900895CF93DF9300D000D01F92A4 +:103C9000CDB7DEB70F900F900F900F900F90DF9180 +:103CA000CF9108950C94361B80E0089580919B0578 +:103CB000843021F11092960520E488E190E00FB65F +:103CC000F894A895809360000FBE2093600083B79E +:103CD000817F846083BF83B7816083BF7894889538 +:103CE00083B78E7F83BF0FB6F894A895809160004C +:103CF000886180936000109260000FBE08950E945A +:103D00003A1B0E9428040E943B1B80E008950E94F9 +:103D1000381B0C94291C1F920F920FB60F9211247E +:103D20008F939F93AF93BF9380919605811113C09A +:103D30008091680490916904A0916A04B0916B0429 +:103D40004196A11DB11D8093680490936904A093CE +:103D50006A04B0936B04BF91AF919F918F910F90C4 +:103D60000FBE0F901F9018950E941F19F89487E7B7 +:103D700097E7909301088093000887E090EBDC01BF +:103D80008093A4059093A505A093A605B093A705DD +:103D90009CE088E10FB6F894A895809360000FBE70 +:103DA00090936000FFCF0895E62FF0E0E15AFE4FB8 +:103DB00084910895E82FF0E0EE0FFF1FE352F040EA +:103DC0008591949108950E94D41E90E4980F9032AA +:103DD00018F40E94DA1E08958F3B50F4883A48F593 +:103DE000853AD0F48430A8F4813009F4B2C0AEC072 +:103DF000883E40F4803E68F48F3B09F0A7C020E085 +:103E000030EEA9C0803F08F4A1C0282F30E0306513 +:103E1000A2C0282F30E09FC0853A29F0863A31F0C1 +:103E200023E830E498C021E830E495C022E830E48B +:103E300092C0883A09F445C0893A09F445C08A3AE3 +:103E400009F445C08B3A09F445C08C3A09F445C0E1 +:103E50008D3A09F445C08E3A09F445C08F3A09F409 +:103E600045C0813B09F445C0803B09F445C0823B15 +:103E700009F445C0833B09F445C0843B09F445C0BF +:103E8000853B09F445C0863B09F445C0873B09F4EE +:103E900045C0883B09F445C0893B09F445C08A3BCD +:103EA00009F445C08B3B09F445C08C3B09F445C07F +:103EB0008D3B09F445C08E3B09F445C020E034E455 +:103EC0004AC022EE34E447C029EE34E444C02AEE6E +:103ED00034E441C025EB34E43EC026EB34E43BC07F +:103EE00023EB34E438C024EB34E435C027EB34E46E +:103EF00032C02CEC34E42FC02DEC34E42CC023E889 +:103F000035E429C02AE835E426C022E935E423C097 +:103F100024E935E420C021E236E41DC023E236E482 +:103F20001AC024E236E417C025E236E414C026E2C3 +:103F300036E411C027E236E40EC02AE236E40BC0B4 +:103F40002FE634E408C020E734E405C020E030E088 +:103F500002C021E030E0C90108950E941E2008F44B +:103F600081E008950E94722088F09F5798F0B92F41 +:103F70009927B751B0F0E1F0660F771F881F991F9E +:103F80001AF0BA95C9F714C0B13091F00E948C2094 +:103F9000B1E008950C948C20672F782F8827B85FA4 +:103FA00039F0B93FCCF3869577956795B395D9F7F6 +:103FB0003EF490958095709561957F4F8F4F9F4F00 +:103FC0000895E89409C097FB3EF49095809570950C +:103FD00061957F4F8F4F9F4F9923A9F0F92F96E955 +:103FE000BB279395F695879577956795B795F111CA +:103FF000F8CFFAF4BB0F11F460FF1BC06F5F7F4F67 +:104000008F4F9F4F16C0882311F096E911C0772378 +:1040100021F09EE8872F762F05C0662371F096E881 +:10402000862F70E060E02AF09A95660F771F881F50 +:10403000DAF7880F9695879597F90895990F0008F4 +:10404000550FAA0BE0E8FEEF16161706E807F9076A +:10405000C0F012161306E407F50798F0621B730B05 +:10406000840B950B39F40A2661F0232B242B252B86 +:1040700021F408950A2609F4A140A6958FEF811D29 +:10408000811D089597F99F6780E870E060E00895CA +:104090009FEF80EC089500240A9416161706180660 +:1040A0000906089500240A9412161306140605063C +:1040B0000895092E0394000C11F4882352F0BB0FCD +:1040C00040F4BF2B11F460FF04C06F5F7F4F8F4F30 +:1040D0009F4F089557FD9058440F551F59F05F3F6B +:1040E00071F04795880F97FB991F61F09F3F79F01A +:1040F00087950895121613061406551FF2CF46959C +:10410000F1DF08C0161617061806991FF1CF86951D +:104110007105610508940895E894BB276627772701 +:10412000CB0197F908950E941E2008F48FEF08959F +:104130000E94AB200C9459200E944B2038F00E9422 +:10414000522020F0952311F00C9442200C9448202A +:1041500011240C948D200E946A2070F3959FC1F366 +:10416000950F50E0551F629FF001729FBB27F00D25 +:10417000B11D639FAA27F00DB11DAA1F649F66277A +:10418000B00DA11D661F829F2227B00DA11D621FC9 +:10419000739FB00DA11D621F839FA00D611D221F83 +:1041A000749F3327A00D611D231F849F600D211D67 +:1041B000822F762F6A2F11249F5750409AF0F1F0EA +:1041C00088234AF0EE0FFF1FBB1F661F771F881F53 +:1041D00091505040A9F79E3F510580F00C94422029 +:1041E0000C948D205F3FE4F3983ED4F38695779549 +:1041F0006795B795F795E7959F5FC1F7FE2B880FF9 +:10420000911D9695879597F90895EE0FFF1F0590DC +:0A421000F491E02D0994F894FFCF1B +:10421A00010576040000FFAD12B212B012EB13B121 +:10422A001201018C05556E6B6E6F776E20484944FA +:10423A00204465736320547970653A00556E6B6E3D +:10424A006F776E204465736320547970653A002055 +:10425A006C656E00696456656E646F7200696450BD +:10426A00726F64756374000000000034053A05300B +:10427A000533052A052D052D05000000005506FC0D +:10428A0005B506000000008C0FDD0EEB0E7E12E372 +:0A429A000EDA10DF0EE60EE10E0052 :00000001FF diff --git a/converter/usb_desc_dump/desc_dump.cpp b/converter/usb_desc_dump/desc_dump.cpp index 89e0ddfa..5ce3aa85 100644 --- a/converter/usb_desc_dump/desc_dump.cpp +++ b/converter/usb_desc_dump/desc_dump.cpp @@ -113,7 +113,7 @@ void scanConfigDesc(UsbDevice *pdev, uint16_t tl, uint8_t* pB) } case HID_DESCRIPTOR_HID: { USB_HID_DESCRIPTOR *pH = (USB_HID_DESCRIPTOR *)pB; - xprintf("\r\nReport%d: len:%04X\r\n", iface, pH->wDescriptorLength); + xprintf("\r\n// Report%d: len:%04X\r\n", iface, pH->wDescriptorLength); if (pH->bDescrType == HID_DESCRIPTOR_REPORT) { dumpReportDesc(pdev, iface, pH->wDescriptorLength); } else { @@ -133,7 +133,7 @@ uint8_t dumpConfigDesc(UsbDevice *pdev, uint8_t numConf) { uint8_t rcode = 0; for (uint8_t i = 0; i < numConf; i++) { - xprintf("\r\nConfig%d:", i); + xprintf("\r\n// Config%d:", i); rcode = Usb.getConfDescr(pdev->address.devAddress, 0, sizeof(USB_CONFIGURATION_DESCRIPTOR), i, buf); if (rcode) return rcode; @@ -154,8 +154,8 @@ void dumpDescriptors(UsbDevice *pdev) { uint8_t rcode = 0; - xprintf("\r\nAddress:%02X\r\n", pdev->address.devAddress); - xprintf("lowspeed:%02X\r\n", pdev->lowspeed); + xprintf("\r\n// Address:%02X\r\n", pdev->address.devAddress); + xprintf("// lowspeed:%02X\r\n", pdev->lowspeed); // // Device Descriptor @@ -163,9 +163,9 @@ void dumpDescriptors(UsbDevice *pdev) rcode = Usb.getDevDescr(pdev->address.devAddress, 0, sizeof(USB_DEVICE_DESCRIPTOR), buf); if (rcode) { printError(rcode); } USB_DEVICE_DESCRIPTOR *pD = (USB_DEVICE_DESCRIPTOR *)&buf; - printVal("idVendor", pD->idVendor); - printVal("idProduct", pD->idProduct); - print("\r\nDevice Descriptor:\r\n"); + printVal("// idVendor", pD->idVendor); + printVal("// idProduct", pD->idProduct); + print("\r\n// Device Descriptor:\r\n"); dumpBuf(sizeof(USB_DEVICE_DESCRIPTOR), buf); From e15f35fd9b9746c4f001710b53c073cd2672008e Mon Sep 17 00:00:00 2001 From: tmk Date: Fri, 2 Jul 2021 16:45:23 +0900 Subject: [PATCH 10/28] rules.mk: Allow same name between .c and .cpp --- tmk_core/rules.mk | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tmk_core/rules.mk b/tmk_core/rules.mk index 3c386b1f..1c33cc84 100644 --- a/tmk_core/rules.mk +++ b/tmk_core/rules.mk @@ -334,10 +334,10 @@ MSG_CREATING_LIBRARY = Creating library: # Define all object files. -OBJ = $(patsubst %.c,$(OBJDIR)/%.o,$(patsubst %.cpp,$(OBJDIR)/%.o,$(patsubst %.S,$(OBJDIR)/%.o,$(SRC)))) +OBJ = $(patsubst %.c,$(OBJDIR)/%.o,$(patsubst %.cpp,$(OBJDIR)/%.cpp.o,$(patsubst %.S,$(OBJDIR)/%.o,$(SRC)))) # Define all listing files. -LST = $(patsubst %.c,$(OBJDIR)/%.lst,$(patsubst %.cpp,$(OBJDIR)/%.lst,$(patsubst %.S,$(OBJDIR)/%.lst,$(SRC)))) +LST = $(patsubst %.c,$(OBJDIR)/%.lst,$(patsubst %.cpp,$(OBJDIR)/%.cpp.lst,$(patsubst %.S,$(OBJDIR)/%.lst,$(SRC)))) # Compiler flags to generate dependency files. @@ -561,7 +561,7 @@ $(OBJDIR)/%.o : %.c # Compile: create object files from C++ source files. -$(OBJDIR)/%.o : %.cpp +$(OBJDIR)/%.cpp.o : %.cpp @echo mkdir -p $(@D) @echo $(MSG_COMPILING_CPP) $< From 0e3b7084b7a47a08d59e7e6c9c10b64f19d62579 Mon Sep 17 00:00:00 2001 From: tmk Date: Sun, 4 Jul 2021 16:47:54 +0900 Subject: [PATCH 11/28] ibmpc_usb: matrix stores unimap translated states scan code is translated to unimap before storing in matrix now --- converter/ibmpc_usb/config.h | 4 +- converter/ibmpc_usb/ibmpc_usb.c | 43 ++++++++-- converter/ibmpc_usb/ibmpc_usb.h | 4 - converter/ibmpc_usb/unimap_plain.c | 2 +- converter/ibmpc_usb/unimap_trans.h | 123 +++++++++++------------------ 5 files changed, 86 insertions(+), 90 deletions(-) diff --git a/converter/ibmpc_usb/config.h b/converter/ibmpc_usb/config.h index cf734bd9..431ef4fd 100644 --- a/converter/ibmpc_usb/config.h +++ b/converter/ibmpc_usb/config.h @@ -29,8 +29,8 @@ along with this program. If not, see . /* matrix size */ -#define MATRIX_ROWS 16 // keycode bit: 6-3 -#define MATRIX_COLS 8 // keycode bit: 2-0 +#define MATRIX_ROWS 8 +#define MATRIX_COLS 16 /* key combination for command */ diff --git a/converter/ibmpc_usb/ibmpc_usb.c b/converter/ibmpc_usb/ibmpc_usb.c index 0034dc9f..c2b7ea77 100644 --- a/converter/ibmpc_usb/ibmpc_usb.c +++ b/converter/ibmpc_usb/ibmpc_usb.c @@ -17,6 +17,7 @@ along with this program. If not, see . #include #include +#include #include "print.h" #include "util.h" #include "debug.h" @@ -26,6 +27,8 @@ along with this program. If not, see . #include "matrix.h" #include "timer.h" #include "action.h" +#include "unimap.h" +#include "unimap_trans.h" #include "ibmpc_usb.h" #include "ibmpc.h" @@ -38,9 +41,9 @@ static int8_t process_cs2(uint8_t code); static int8_t process_cs3(uint8_t code); -static uint8_t matrix[MATRIX_ROWS]; -#define ROW(code) ((code>>3)&0x0F) -#define COL(code) (code&0x07) +static matrix_row_t matrix[MATRIX_ROWS]; +#define ROW(code) ((code>>4)&0x07) +#define COL(code) (code&0x0F) static int16_t read_wait(uint16_t wait_ms) { @@ -611,7 +614,7 @@ bool matrix_is_on(uint8_t row, uint8_t col) } inline -uint8_t matrix_get_row(uint8_t row) +matrix_row_t matrix_get_row(uint8_t row) { return matrix[row]; } @@ -625,20 +628,44 @@ uint8_t matrix_key_count(void) return count; } +extern const action_t actionmaps[][UNIMAP_ROWS][UNIMAP_COLS]; +action_t action_for_key(uint8_t layer, keypos_t key) +{ + return (action_t){ .code = pgm_read_word(&actionmaps[(layer)][key.row & 0x07][key.col & 0x0F]) }; +} + +static uint8_t to_unimap(uint8_t code) { + uint8_t row = ROW(code); + uint8_t col = COL(code); + switch (keyboard_kind) { + case PC_XT: + return pgm_read_byte(&unimap_cs1[row][col]); + case PC_AT: + return pgm_read_byte(&unimap_cs2[row][col]); + case PC_TERMINAL: + return pgm_read_byte(&unimap_cs3[row][col]); + default: + return UNIMAP_NO; + } +} inline static void matrix_make(uint8_t code) { - if (!matrix_is_on(ROW(code), COL(code))) { - matrix[ROW(code)] |= 1< 0x7F) return; + if (!matrix_is_on(ROW(u), COL(u))) { + matrix[ROW(u)] |= 1< 0x7F) return; + if (matrix_is_on(ROW(u), COL(u))) { + matrix[ROW(u)] &= ~(1<. */ -#include "unimap_trans.h" +#include "unimap.h" #define AC_FN0 ACTION_LAYER_TAP_KEY(1, KC_APPLICATION) diff --git a/converter/ibmpc_usb/unimap_trans.h b/converter/ibmpc_usb/unimap_trans.h index 97472b7b..4b3520d2 100644 --- a/converter/ibmpc_usb/unimap_trans.h +++ b/converter/ibmpc_usb/unimap_trans.h @@ -17,12 +17,8 @@ along with this program. If not, see . #ifndef UNIMAP_TRANS_H #define UNIMAP_TRANS_H -#include #include #include "unimap.h" -#include "action.h" -#include "ibmpc_usb.h" - /* @@ -91,22 +87,22 @@ along with this program. If not, see . * Unsupported codes or error -> 00. UNIMAP_NUBS is unused. */ const uint8_t PROGMEM unimap_cs1[MATRIX_ROWS][MATRIX_COLS] = { - { UNIMAP_NO, UNIMAP_ESC, UNIMAP_1, UNIMAP_2, UNIMAP_3, UNIMAP_4, UNIMAP_5, UNIMAP_6 }, /* 00-07 */ - { UNIMAP_7, UNIMAP_8, UNIMAP_9, UNIMAP_0, UNIMAP_MINUS, UNIMAP_EQUAL, UNIMAP_BSPACE,UNIMAP_TAB }, /* 08-0F */ - { UNIMAP_Q, UNIMAP_W, UNIMAP_E, UNIMAP_R, UNIMAP_T, UNIMAP_Y, UNIMAP_U, UNIMAP_I }, /* 10-17 */ - { UNIMAP_O, UNIMAP_P, UNIMAP_LBRC, UNIMAP_RBRC, UNIMAP_ENTER, UNIMAP_LCTL, UNIMAP_A, UNIMAP_S, }, /* 18-1F */ - { UNIMAP_D, UNIMAP_F, UNIMAP_G, UNIMAP_H, UNIMAP_J, UNIMAP_K, UNIMAP_L, UNIMAP_SCLN }, /* 20-27 */ - { UNIMAP_QUOTE, UNIMAP_GRAVE, UNIMAP_LSHIFT,UNIMAP_BSLASH,UNIMAP_Z, UNIMAP_X, UNIMAP_C, UNIMAP_V, }, /* 28-2F */ - { UNIMAP_B, UNIMAP_N, UNIMAP_M, UNIMAP_COMMA, UNIMAP_DOT, UNIMAP_SLASH, UNIMAP_RSHIFT,UNIMAP_PAST }, /* 30-37 */ - { UNIMAP_LALT, UNIMAP_SPACE, UNIMAP_CAPS, UNIMAP_F1, UNIMAP_F2, UNIMAP_F3, UNIMAP_F4, UNIMAP_F5 }, /* 38-3F */ - { UNIMAP_F6, UNIMAP_F7, UNIMAP_F8, UNIMAP_F9, UNIMAP_F10, UNIMAP_NLCK, UNIMAP_SLCK, UNIMAP_P7 }, /* 40-47 */ - { UNIMAP_P8, UNIMAP_P9, UNIMAP_PMNS, UNIMAP_P4, UNIMAP_P5, UNIMAP_P6, UNIMAP_PPLS, UNIMAP_P1 }, /* 48-4F */ - { UNIMAP_P2, UNIMAP_P3, UNIMAP_P0, UNIMAP_PDOT, UNIMAP_PSCR, UNIMAP_PAUSE, UNIMAP_NUHS, UNIMAP_F11 }, /* 50-57 */ - { UNIMAP_F12, UNIMAP_PEQL, UNIMAP_LGUI, UNIMAP_RGUI, UNIMAP_APP, UNIMAP_MUTE, UNIMAP_VOLD, UNIMAP_VOLU }, /* 58-5F */ - { UNIMAP_UP, UNIMAP_LEFT, UNIMAP_DOWN, UNIMAP_RIGHT, UNIMAP_F13, UNIMAP_F14, UNIMAP_F15, UNIMAP_F16 }, /* 60-67 */ - { UNIMAP_F17, UNIMAP_F18, UNIMAP_F19, UNIMAP_F20, UNIMAP_F21, UNIMAP_F22, UNIMAP_F23, UNIMAP_PENT }, /* 68-6F */ - { UNIMAP_KANA, UNIMAP_INSERT,UNIMAP_DELETE,UNIMAP_RO, UNIMAP_HOME, UNIMAP_END, UNIMAP_F24, UNIMAP_PGUP }, /* 70-77 */ - { UNIMAP_PGDN, UNIMAP_HENK, UNIMAP_RCTL, UNIMAP_MHEN, UNIMAP_RALT, UNIMAP_JYEN, UNIMAP_PCMM, UNIMAP_PSLS }, /* 78-7F */ + { UNIMAP_NO, UNIMAP_ESC, UNIMAP_1, UNIMAP_2, UNIMAP_3, UNIMAP_4, UNIMAP_5, UNIMAP_6, /* 00-07 */ + UNIMAP_7, UNIMAP_8, UNIMAP_9, UNIMAP_0, UNIMAP_MINUS, UNIMAP_EQUAL, UNIMAP_BSPACE,UNIMAP_TAB }, /* 08-0F */ + { UNIMAP_Q, UNIMAP_W, UNIMAP_E, UNIMAP_R, UNIMAP_T, UNIMAP_Y, UNIMAP_U, UNIMAP_I, /* 10-17 */ + UNIMAP_O, UNIMAP_P, UNIMAP_LBRC, UNIMAP_RBRC, UNIMAP_ENTER, UNIMAP_LCTL, UNIMAP_A, UNIMAP_S, }, /* 18-1F */ + { UNIMAP_D, UNIMAP_F, UNIMAP_G, UNIMAP_H, UNIMAP_J, UNIMAP_K, UNIMAP_L, UNIMAP_SCLN, /* 20-27 */ + UNIMAP_QUOTE, UNIMAP_GRAVE, UNIMAP_LSHIFT,UNIMAP_BSLASH,UNIMAP_Z, UNIMAP_X, UNIMAP_C, UNIMAP_V, }, /* 28-2F */ + { UNIMAP_B, UNIMAP_N, UNIMAP_M, UNIMAP_COMMA, UNIMAP_DOT, UNIMAP_SLASH, UNIMAP_RSHIFT,UNIMAP_PAST, /* 30-37 */ + UNIMAP_LALT, UNIMAP_SPACE, UNIMAP_CAPS, UNIMAP_F1, UNIMAP_F2, UNIMAP_F3, UNIMAP_F4, UNIMAP_F5 }, /* 38-3F */ + { UNIMAP_F6, UNIMAP_F7, UNIMAP_F8, UNIMAP_F9, UNIMAP_F10, UNIMAP_NLCK, UNIMAP_SLCK, UNIMAP_P7, /* 40-47 */ + UNIMAP_P8, UNIMAP_P9, UNIMAP_PMNS, UNIMAP_P4, UNIMAP_P5, UNIMAP_P6, UNIMAP_PPLS, UNIMAP_P1 }, /* 48-4F */ + { UNIMAP_P2, UNIMAP_P3, UNIMAP_P0, UNIMAP_PDOT, UNIMAP_PSCR, UNIMAP_PAUSE, UNIMAP_NUHS, UNIMAP_F11, /* 50-57 */ + UNIMAP_F12, UNIMAP_PEQL, UNIMAP_LGUI, UNIMAP_RGUI, UNIMAP_APP, UNIMAP_MUTE, UNIMAP_VOLD, UNIMAP_VOLU }, /* 58-5F */ + { UNIMAP_UP, UNIMAP_LEFT, UNIMAP_DOWN, UNIMAP_RIGHT, UNIMAP_F13, UNIMAP_F14, UNIMAP_F15, UNIMAP_F16, /* 60-67 */ + UNIMAP_F17, UNIMAP_F18, UNIMAP_F19, UNIMAP_F20, UNIMAP_F21, UNIMAP_F22, UNIMAP_F23, UNIMAP_PENT }, /* 68-6F */ + { UNIMAP_KANA, UNIMAP_INSERT,UNIMAP_DELETE,UNIMAP_RO, UNIMAP_HOME, UNIMAP_END, UNIMAP_F24, UNIMAP_PGUP, /* 70-77 */ + UNIMAP_PGDN, UNIMAP_HENK, UNIMAP_RCTL, UNIMAP_MHEN, UNIMAP_RALT, UNIMAP_JYEN, UNIMAP_PCMM, UNIMAP_PSLS }, /* 78-7F */ }; @@ -151,22 +147,22 @@ const uint8_t PROGMEM unimap_cs1[MATRIX_ROWS][MATRIX_COLS] = { * 51, 63, 68, 6A, 6D: Hidden keys in IBM model M [6] */ const uint8_t PROGMEM unimap_cs2[MATRIX_ROWS][MATRIX_COLS] = { - { UNIMAP_PAUS, UNIMAP_F9, UNIMAP_F7, UNIMAP_F5, UNIMAP_F3, UNIMAP_F1, UNIMAP_F2, UNIMAP_F12 }, /* 00-07 */ - { UNIMAP_F13, UNIMAP_F10, UNIMAP_F8, UNIMAP_F6, UNIMAP_F4, UNIMAP_TAB, UNIMAP_GRV, UNIMAP_RALT }, /* 08-0F */ - { UNIMAP_F14, UNIMAP_LALT, UNIMAP_LSHIFT,UNIMAP_KANA, UNIMAP_LCTL, UNIMAP_Q, UNIMAP_1, UNIMAP_RCTL }, /* 10-17 */ - { UNIMAP_F15, UNIMAP_LGUI, UNIMAP_Z, UNIMAP_S, UNIMAP_A, UNIMAP_W, UNIMAP_2, UNIMAP_RGUI }, /* 18-1F */ - { UNIMAP_F16, UNIMAP_C, UNIMAP_X, UNIMAP_D, UNIMAP_E, UNIMAP_4, UNIMAP_3, UNIMAP_END }, /* 20-27 */ - { UNIMAP_F17, UNIMAP_SPACE, UNIMAP_V, UNIMAP_F, UNIMAP_T, UNIMAP_R, UNIMAP_5, UNIMAP_HOME }, /* 28-2F */ - { UNIMAP_F18, UNIMAP_N, UNIMAP_B, UNIMAP_H, UNIMAP_G, UNIMAP_Y, UNIMAP_6, UNIMAP_DEL }, /* 30-37 */ - { UNIMAP_F19, UNIMAP_INS, UNIMAP_M, UNIMAP_J, UNIMAP_U, UNIMAP_7, UNIMAP_8, UNIMAP_DOWN }, /* 38-3F */ - { UNIMAP_F20, UNIMAP_COMMA, UNIMAP_K, UNIMAP_I, UNIMAP_O, UNIMAP_0, UNIMAP_9, UNIMAP_RIGHT }, /* 40-47 */ - { UNIMAP_F21, UNIMAP_DOT, UNIMAP_SLASH, UNIMAP_L, UNIMAP_SCOLON,UNIMAP_P, UNIMAP_MINUS, UNIMAP_UP }, /* 48-4F */ - { UNIMAP_F22, UNIMAP_RO, UNIMAP_QUOTE, UNIMAP_LEFT, UNIMAP_LBRC, UNIMAP_EQUAL, UNIMAP_PGDN, UNIMAP_F23 }, /* 50-57 */ - { UNIMAP_CAPS, UNIMAP_RSHIFT,UNIMAP_ENTER, UNIMAP_RBRC, UNIMAP_APP, UNIMAP_BSLASH,UNIMAP_PGUP, UNIMAP_F24 }, /* 58-5F */ - { UNIMAP_PSLS, UNIMAP_NUBS, UNIMAP_PENT, UNIMAP_PEQL, UNIMAP_HENK, UNIMAP_VOLD, UNIMAP_BSPACE,UNIMAP_MHEN }, /* 60-67 */ - { UNIMAP_NUHS, UNIMAP_P1, UNIMAP_JYEN, UNIMAP_P4, UNIMAP_P7, UNIMAP_PCMM, UNIMAP_VOLU, UNIMAP_MUTE }, /* 68-6F */ - { UNIMAP_P0, UNIMAP_PDOT, UNIMAP_P2, UNIMAP_P5, UNIMAP_P6, UNIMAP_P8, UNIMAP_ESC, UNIMAP_NLCK }, /* 70-77 */ - { UNIMAP_F11, UNIMAP_PPLS, UNIMAP_P3, UNIMAP_PMNS, UNIMAP_PAST, UNIMAP_P9, UNIMAP_SLCK, UNIMAP_PSCR }, /* 78-7F */ + { UNIMAP_PAUS, UNIMAP_F9, UNIMAP_F7, UNIMAP_F5, UNIMAP_F3, UNIMAP_F1, UNIMAP_F2, UNIMAP_F12, /* 00-07 */ + UNIMAP_F13, UNIMAP_F10, UNIMAP_F8, UNIMAP_F6, UNIMAP_F4, UNIMAP_TAB, UNIMAP_GRV, UNIMAP_RALT }, /* 08-0F */ + { UNIMAP_F14, UNIMAP_LALT, UNIMAP_LSHIFT,UNIMAP_KANA, UNIMAP_LCTL, UNIMAP_Q, UNIMAP_1, UNIMAP_RCTL, /* 10-17 */ + UNIMAP_F15, UNIMAP_LGUI, UNIMAP_Z, UNIMAP_S, UNIMAP_A, UNIMAP_W, UNIMAP_2, UNIMAP_RGUI }, /* 18-1F */ + { UNIMAP_F16, UNIMAP_C, UNIMAP_X, UNIMAP_D, UNIMAP_E, UNIMAP_4, UNIMAP_3, UNIMAP_END, /* 20-27 */ + UNIMAP_F17, UNIMAP_SPACE, UNIMAP_V, UNIMAP_F, UNIMAP_T, UNIMAP_R, UNIMAP_5, UNIMAP_HOME }, /* 28-2F */ + { UNIMAP_F18, UNIMAP_N, UNIMAP_B, UNIMAP_H, UNIMAP_G, UNIMAP_Y, UNIMAP_6, UNIMAP_DEL, /* 30-37 */ + UNIMAP_F19, UNIMAP_INS, UNIMAP_M, UNIMAP_J, UNIMAP_U, UNIMAP_7, UNIMAP_8, UNIMAP_DOWN }, /* 38-3F */ + { UNIMAP_F20, UNIMAP_COMMA, UNIMAP_K, UNIMAP_I, UNIMAP_O, UNIMAP_0, UNIMAP_9, UNIMAP_RIGHT, /* 40-47 */ + UNIMAP_F21, UNIMAP_DOT, UNIMAP_SLASH, UNIMAP_L, UNIMAP_SCOLON,UNIMAP_P, UNIMAP_MINUS, UNIMAP_UP }, /* 48-4F */ + { UNIMAP_F22, UNIMAP_RO, UNIMAP_QUOTE, UNIMAP_LEFT, UNIMAP_LBRC, UNIMAP_EQUAL, UNIMAP_PGDN, UNIMAP_F23, /* 50-57 */ + UNIMAP_CAPS, UNIMAP_RSHIFT,UNIMAP_ENTER, UNIMAP_RBRC, UNIMAP_APP, UNIMAP_BSLASH,UNIMAP_PGUP, UNIMAP_F24 }, /* 58-5F */ + { UNIMAP_PSLS, UNIMAP_NUBS, UNIMAP_PENT, UNIMAP_PEQL, UNIMAP_HENK, UNIMAP_VOLD, UNIMAP_BSPACE,UNIMAP_MHEN, /* 60-67 */ + UNIMAP_NUHS, UNIMAP_P1, UNIMAP_JYEN, UNIMAP_P4, UNIMAP_P7, UNIMAP_PCMM, UNIMAP_VOLU, UNIMAP_MUTE }, /* 68-6F */ + { UNIMAP_P0, UNIMAP_PDOT, UNIMAP_P2, UNIMAP_P5, UNIMAP_P6, UNIMAP_P8, UNIMAP_ESC, UNIMAP_NLCK, /* 70-77 */ + UNIMAP_F11, UNIMAP_PPLS, UNIMAP_P3, UNIMAP_PMNS, UNIMAP_PAST, UNIMAP_P9, UNIMAP_SLCK, UNIMAP_PSCR }, /* 78-7F */ }; @@ -210,45 +206,22 @@ const uint8_t PROGMEM unimap_cs2[MATRIX_ROWS][MATRIX_COLS] = { * 51, 5C, 5D, 68, 78: Hidden keys in IBM 122-key terminal keyboard [7] */ const uint8_t PROGMEM unimap_cs3[MATRIX_ROWS][MATRIX_COLS] = { - { UNIMAP_KANA, UNIMAP_LGUI, UNIMAP_PSCR, UNIMAP_VOLD, UNIMAP_VOLU, UNIMAP_MUTE, UNIMAP_HENK, UNIMAP_F1 }, /* 00-07 */ - { UNIMAP_F13, UNIMAP_RGUI, UNIMAP_APP, UNIMAP_MHEN, UNIMAP_PAUS, UNIMAP_TAB, UNIMAP_GRV, UNIMAP_F2 }, /* 08-0F */ - { UNIMAP_F14, UNIMAP_LCTL, UNIMAP_LSHIFT,UNIMAP_NUBS, UNIMAP_CAPS, UNIMAP_Q, UNIMAP_1, UNIMAP_F3 }, /* 10-17 */ - { UNIMAP_F15, UNIMAP_LALT, UNIMAP_Z, UNIMAP_S, UNIMAP_A, UNIMAP_W, UNIMAP_2, UNIMAP_F4 }, /* 18-1F */ - { UNIMAP_F16, UNIMAP_C, UNIMAP_X, UNIMAP_D, UNIMAP_E, UNIMAP_4, UNIMAP_3, UNIMAP_F5 }, /* 20-27 */ - { UNIMAP_F17, UNIMAP_SPACE, UNIMAP_V, UNIMAP_F, UNIMAP_T, UNIMAP_R, UNIMAP_5, UNIMAP_F6 }, /* 28-2F */ - { UNIMAP_F18, UNIMAP_N, UNIMAP_B, UNIMAP_H, UNIMAP_G, UNIMAP_Y, UNIMAP_6, UNIMAP_F7 }, /* 30-37 */ - { UNIMAP_F19, UNIMAP_RALT, UNIMAP_M, UNIMAP_J, UNIMAP_U, UNIMAP_7, UNIMAP_8, UNIMAP_F8 }, /* 38-3F */ - { UNIMAP_F20, UNIMAP_COMMA, UNIMAP_K, UNIMAP_I, UNIMAP_O, UNIMAP_0, UNIMAP_9, UNIMAP_F9 }, /* 40-47 */ - { UNIMAP_F21, UNIMAP_DOT, UNIMAP_SLASH, UNIMAP_L, UNIMAP_SCOLON,UNIMAP_P, UNIMAP_MINUS, UNIMAP_F10 }, /* 48-4F */ - { UNIMAP_F22, UNIMAP_RO, UNIMAP_QUOTE, UNIMAP_NUHS, UNIMAP_LBRC, UNIMAP_EQUAL, UNIMAP_F11, UNIMAP_F23 }, /* 50-57 */ - { UNIMAP_RCTL, UNIMAP_RSHIFT,UNIMAP_ENTER, UNIMAP_RBRC, UNIMAP_BSLASH,UNIMAP_JYEN, UNIMAP_F12, UNIMAP_F24 }, /* 58-5F */ - { UNIMAP_DOWN, UNIMAP_LEFT, UNIMAP_HOME, UNIMAP_UP, UNIMAP_END, UNIMAP_INS, UNIMAP_BSPACE,UNIMAP_PSLS }, /* 60-67 */ - { UNIMAP_PCMM, UNIMAP_P1, UNIMAP_RIGHT, UNIMAP_P4, UNIMAP_P7, UNIMAP_DEL, UNIMAP_PGUP, UNIMAP_PGDN }, /* 68-6F */ - { UNIMAP_P0, UNIMAP_PDOT, UNIMAP_P2, UNIMAP_P5, UNIMAP_P6, UNIMAP_P8, UNIMAP_ESC, UNIMAP_NLCK }, /* 70-77 */ - { UNIMAP_PEQL, UNIMAP_PENT, UNIMAP_P3, UNIMAP_PMNS, UNIMAP_PPLS, UNIMAP_P9, UNIMAP_SLCK, UNIMAP_PAST }, /* 78-7F */ + { UNIMAP_KANA, UNIMAP_LGUI, UNIMAP_PSCR, UNIMAP_VOLD, UNIMAP_VOLU, UNIMAP_MUTE, UNIMAP_HENK, UNIMAP_F1, /* 00-07 */ + UNIMAP_F13, UNIMAP_RGUI, UNIMAP_APP, UNIMAP_MHEN, UNIMAP_PAUS, UNIMAP_TAB, UNIMAP_GRV, UNIMAP_F2 }, /* 08-0F */ + { UNIMAP_F14, UNIMAP_LCTL, UNIMAP_LSHIFT,UNIMAP_NUBS, UNIMAP_CAPS, UNIMAP_Q, UNIMAP_1, UNIMAP_F3, /* 10-17 */ + UNIMAP_F15, UNIMAP_LALT, UNIMAP_Z, UNIMAP_S, UNIMAP_A, UNIMAP_W, UNIMAP_2, UNIMAP_F4 }, /* 18-1F */ + { UNIMAP_F16, UNIMAP_C, UNIMAP_X, UNIMAP_D, UNIMAP_E, UNIMAP_4, UNIMAP_3, UNIMAP_F5, /* 20-27 */ + UNIMAP_F17, UNIMAP_SPACE, UNIMAP_V, UNIMAP_F, UNIMAP_T, UNIMAP_R, UNIMAP_5, UNIMAP_F6 }, /* 28-2F */ + { UNIMAP_F18, UNIMAP_N, UNIMAP_B, UNIMAP_H, UNIMAP_G, UNIMAP_Y, UNIMAP_6, UNIMAP_F7, /* 30-37 */ + UNIMAP_F19, UNIMAP_RALT, UNIMAP_M, UNIMAP_J, UNIMAP_U, UNIMAP_7, UNIMAP_8, UNIMAP_F8 }, /* 38-3F */ + { UNIMAP_F20, UNIMAP_COMMA, UNIMAP_K, UNIMAP_I, UNIMAP_O, UNIMAP_0, UNIMAP_9, UNIMAP_F9, /* 40-47 */ + UNIMAP_F21, UNIMAP_DOT, UNIMAP_SLASH, UNIMAP_L, UNIMAP_SCOLON,UNIMAP_P, UNIMAP_MINUS, UNIMAP_F10 }, /* 48-4F */ + { UNIMAP_F22, UNIMAP_RO, UNIMAP_QUOTE, UNIMAP_NUHS, UNIMAP_LBRC, UNIMAP_EQUAL, UNIMAP_F11, UNIMAP_F23, /* 50-57 */ + UNIMAP_RCTL, UNIMAP_RSHIFT,UNIMAP_ENTER, UNIMAP_RBRC, UNIMAP_BSLASH,UNIMAP_JYEN, UNIMAP_F12, UNIMAP_F24 }, /* 58-5F */ + { UNIMAP_DOWN, UNIMAP_LEFT, UNIMAP_HOME, UNIMAP_UP, UNIMAP_END, UNIMAP_INS, UNIMAP_BSPACE,UNIMAP_PSLS, /* 60-67 */ + UNIMAP_PCMM, UNIMAP_P1, UNIMAP_RIGHT, UNIMAP_P4, UNIMAP_P7, UNIMAP_DEL, UNIMAP_PGUP, UNIMAP_PGDN }, /* 68-6F */ + { UNIMAP_P0, UNIMAP_PDOT, UNIMAP_P2, UNIMAP_P5, UNIMAP_P6, UNIMAP_P8, UNIMAP_ESC, UNIMAP_NLCK, /* 70-77 */ + UNIMAP_PEQL, UNIMAP_PENT, UNIMAP_P3, UNIMAP_PMNS, UNIMAP_PPLS, UNIMAP_P9, UNIMAP_SLCK, UNIMAP_PAST }, /* 78-7F */ }; - -extern const action_t actionmaps[][UNIMAP_ROWS][UNIMAP_COLS]; -action_t action_for_key(uint8_t layer, keypos_t key) -{ - uint8_t unimap_pos; - switch (keyboard_kind) { - case PC_XT: - unimap_pos = pgm_read_byte(&unimap_cs1[key.row][key.col]); - break; - case PC_AT: - unimap_pos = pgm_read_byte(&unimap_cs2[key.row][key.col]); - break; - case PC_TERMINAL: - unimap_pos = pgm_read_byte(&unimap_cs3[key.row][key.col]); - break; - default: - return (action_t)ACTION_NO; - } - - if (unimap_pos == UNIMAP_NO) return (action_t)ACTION_NO; - - return (action_t)pgm_read_word(&actionmaps[(layer)][(unimap_pos & 0x70) >> 4][(unimap_pos & 0x0f)]); -} #endif From f4f47aaee7a224db4543b301b529ae571a530ba6 Mon Sep 17 00:00:00 2001 From: tmk Date: Sun, 4 Jul 2021 22:02:08 +0900 Subject: [PATCH 12/28] ibmpc: C++ class for two-interface support --- tmk_core/protocol/ibmpc.cpp | 396 ++++++++++++++++++++++++++++++++++++ tmk_core/protocol/ibmpc.hpp | 245 ++++++++++++++++++++++ 2 files changed, 641 insertions(+) create mode 100644 tmk_core/protocol/ibmpc.cpp create mode 100644 tmk_core/protocol/ibmpc.hpp diff --git a/tmk_core/protocol/ibmpc.cpp b/tmk_core/protocol/ibmpc.cpp new file mode 100644 index 00000000..caa78e42 --- /dev/null +++ b/tmk_core/protocol/ibmpc.cpp @@ -0,0 +1,396 @@ +/* +Copyright 2010,2011,2012,2013,2019 Jun WAKO + +This software is licensed with a Modified BSD License. +All of this is supposed to be Free Software, Open Source, DFSG-free, +GPL-compatible, and OK to use in both free and proprietary applications. +Additions and corrections to this file are welcome. + + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +* 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. + +* Neither the name of the copyright holders nor the names of + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. +*/ + +/* + * IBM PC keyboard protocol + */ + +#include +#include +#include +#include "debug.h" +#include "timer.h" +#include "wait.h" +#include "ibmpc.hpp" + + +#define WAIT(stat, us, err) do { \ + if (!wait_##stat(us)) { \ + error = err; \ + goto ERROR; \ + } \ +} while (0) + + +IBMPC IBMPC::interface0 = IBMPC(IBMPC_CLOCK_BIT, IBMPC_DATA_BIT); +#if defined(IBMPC_CLOCK_BIT1) && defined(IBMPC_DATA_BIT1) +IBMPC IBMPC::interface1 = IBMPC(IBMPC_CLOCK_BIT1, IBMPC_DATA_BIT1); +#endif + + +void IBMPC::host_init(void) +{ + // initialize reset pin to HiZ + IBMPC_RST_HIZ(); + inhibit(); + int_init(); + int_off(); + ringbuf_init(&rb, rbuf, RINGBUF_SIZE); + host_isr_clear(); +} + +void IBMPC::host_enable(void) +{ + int_on(); + idle(); +} + +void IBMPC::host_disable(void) +{ + int_off(); + inhibit(); +} + +int16_t IBMPC::host_send(uint8_t data) +{ + bool parity = true; + error = IBMPC_ERR_NONE; + uint8_t retry = 0; + + dprintf("w%02X ", data); + + // Not receiving data + if (isr_state != 0x8000) dprintf("isr:%04X ", isr_state); + while (isr_state != 0x8000) ; + + // Not clock Lo + if (!clock_in()) dprintf("c:%u ", wait_clock_hi(1000)); + + // Not data Lo + if (!data_in()) dprintf("d:%u ", wait_data_hi(1000)); + + int_off(); + +RETRY: + /* terminate a transmission if we have */ + inhibit(); + wait_us(200); // [5]p.54 + + /* 'Request to Send' and Start bit */ + data_lo(); + wait_us(200); + clock_hi(); // [5]p.54 [clock low]>100us [5]p.50 + WAIT(clock_lo, 10000, 1); // [5]p.53, -10ms [5]p.50 + + /* Data bit[2-9] */ + for (uint8_t i = 0; i < 8; i++) { + wait_us(15); + if (data&(1<= 3) { + isr_debug = isr_state; + error = IBMPC_ERR_TIMEOUT; + goto ERROR; + + // timeout error recovery - start receiving new data + // it seems to work somehow but may not under unstable situation + //timer_start = t; + //isr_state = 0x8000; + } + } + + isr_state = isr_state>>1; + if (dbit) isr_state |= 0x8000; + + // isr_state: state of receiving data from keyboard + // + // This should be initialized with 0x8000 before receiving data and + // the MSB '*1' works as marker to discrimitate between protocols. + // It stores sampled bit at MSB after right shift on each clock falling edge. + // + // XT protocol has two variants of signaling; XT_IBM and XT_Clone. + // XT_IBM uses two start bits 0 and 1 while XT_Clone uses just start bit 1. + // https://github.com/tmk/tmk_keyboard/wiki/IBM-PC-XT-Keyboard-Protocol + // + // 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 + // ----------------------------------------------------- + // *1 0 0 0 0 0 0 0 | 0 0 0 0 0 0 0 0 Initial state(0x8000) + // + // x x x x x x x x | 0 0 0 0 0 0 0 0 midway(0-7 bits received) + // x x x x x x x x | *1 0 0 0 0 0 0 0 midway(8 bits received) + // b6 b5 b4 b3 b2 b1 b0 1 | 0 *1 0 0 0 0 0 0 XT_IBM-midway ^1 + // b7 b6 b5 b4 b3 b2 b1 b0 | 0 *1 0 0 0 0 0 0 AT-midway ^1 + // b7 b6 b5 b4 b3 b2 b1 b0 | 1 *1 0 0 0 0 0 0 XT_Clone-done ^3 + // b6 b5 b4 b3 b2 b1 b0 1 | 1 *1 0 0 0 0 0 0 XT_IBM-error ^3 + // pr b7 b6 b5 b4 b3 b2 b1 | 0 0 *1 0 0 0 0 0 AT-midway[b0=0] + // b7 b6 b5 b4 b3 b2 b1 b0 | 1 0 *1 0 0 0 0 0 XT_IBM-done ^2 + // pr b7 b6 b5 b4 b3 b2 b1 | 1 0 *1 0 0 0 0 0 AT-midway[b0=1] ^2 + // b7 b6 b5 b4 b3 b2 b1 b0 | 1 1 *1 0 0 0 0 0 XT_IBM-error-done + // x x x x x x x x | x 1 1 0 0 0 0 0 illegal + // st pr b7 b6 b5 b4 b3 b2 | b1 b0 0 *1 0 0 0 0 AT-done + // x x x x x x x x | x x 1 *1 0 0 0 0 illegal + // all other states than above illegal + // + // ^1: AT and XT_IBM takes same state. + // ^2: AT and XT_IBM takes same state in case that AT b0 is 1, + // we have to check AT stop bit to discriminate between the two protocol. + switch (isr_state & 0xFF) { + case 0b00000000: + case 0b10000000: + case 0b01000000: // ^1 + case 0b00100000: + // midway + goto NEXT; + break; + case 0b11000000: // ^3 + { + uint8_t us = 100; + // wait for rising and falling edge of b7 of XT_IBM + while (!(IBMPC_CLOCK_PIN&(1<>8; + protocol = IBMPC_PROTOCOL_XT_CLONE; + goto DONE; + } + } + break; + case 0b11100000: + // XT_IBM-error-done + isr_debug = isr_state; + isr_state = isr_state>>8; + protocol = IBMPC_PROTOCOL_XT_ERROR; + goto DONE; + break; + case 0b10100000: // ^2 + { + uint8_t us = 100; + // wait for rising and falling edge of AT stop bit to discriminate between XT and AT + while (!(IBMPC_CLOCK_PIN&(1<>8; + protocol = IBMPC_PROTOCOL_XT_IBM; + goto DONE; + } + } + break; + case 0b00010000: + case 0b10010000: + case 0b01010000: + case 0b11010000: + // AT-done + // TODO: parity check? + isr_debug = isr_state; + // stop bit check + if (isr_state & 0x8000) { + protocol = IBMPC_PROTOCOL_AT; + } else { + // Zenith Z-150 AT(beige/white lable) asserts stop bit as low + // https://github.com/tmk/tmk_keyboard/wiki/IBM-PC-AT-Keyboard-Protocol#zenith-z-150-beige + protocol = IBMPC_PROTOCOL_AT_Z150; + } + isr_state = isr_state>>6; + goto DONE; + break; + case 0b01100000: + case 0b00110000: + case 0b10110000: + case 0b01110000: + case 0b11110000: + default: // xxxx_oooo(any 1 in low nibble) + // Illegal + isr_debug = isr_state; + error = IBMPC_ERR_ILLEGAL; + goto ERROR; + break; + } + +DONE: + // store data + if (!ringbuf_put(&rb, isr_state & 0xFF)) { + // buffer overflow + error = IBMPC_ERR_FULL; + + // Disable ISR if buffer is full + int_off(); + // inhibit: clock_lo + IBMPC_CLOCK_PORT &= ~(1< + +This software is licensed with a Modified BSD License. +All of this is supposed to be Free Software, Open Source, DFSG-free, +GPL-compatible, and OK to use in both free and proprietary applications. +Additions and corrections to this file are welcome. + + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +* 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. + +* Neither the name of the copyright holders nor the names of + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. +*/ + +#ifndef IBMPC_HPP +#define IBMPC_HPP + +#include +#include "wait.h" +#include "ringbuf.h" + +/* + * IBM PC keyboard protocol + * + * PS/2 Resources + * -------------- + * [1] The PS/2 Mouse/Keyboard Protocol + * http://www.computer-engineering.org/ps2protocol/ + * Concise and thorough primer of PS/2 protocol. + * + * [2] Keyboard and Auxiliary Device Controller + * http://www.mcamafia.de/pdf/ibm_hitrc07.pdf + * Signal Timing and Format + * + * [3] Keyboards(101- and 102-key) + * http://www.mcamafia.de/pdf/ibm_hitrc11.pdf + * Keyboard Layout, Scan Code Set, POR, and Commands. + * + * [4] PS/2 Reference Manuals + * http://www.mcamafia.de/pdf/ibm_hitrc07.pdf + * Collection of IBM Personal System/2 documents. + * + * [5] TrackPoint Engineering Specifications for version 3E + * https://web.archive.org/web/20100526161812/http://wwwcssrv.almaden.ibm.com/trackpoint/download.html + */ +#define IBMPC_ACK 0xFA +#define IBMPC_RESEND 0xFE +#define IBMPC_SET_LED 0xED + +#define IBMPC_PROTOCOL_NO 0 +#define IBMPC_PROTOCOL_AT 0x10 +#define IBMPC_PROTOCOL_AT_Z150 0x11 +#define IBMPC_PROTOCOL_XT 0x20 +#define IBMPC_PROTOCOL_XT_IBM 0x21 +#define IBMPC_PROTOCOL_XT_CLONE 0x22 +#define IBMPC_PROTOCOL_XT_ERROR 0x23 + +// Error numbers +#define IBMPC_ERR_NONE 0 +#define IBMPC_ERR_RECV 0x00 +#define IBMPC_ERR_SEND 0x10 +#define IBMPC_ERR_TIMEOUT 0x20 +#define IBMPC_ERR_FULL 0x40 +#define IBMPC_ERR_ILLEGAL 0x80 +#define IBMPC_ERR_FF 0xF0 + +#define IBMPC_LED_SCROLL_LOCK 0 +#define IBMPC_LED_NUM_LOCK 1 +#define IBMPC_LED_CAPS_LOCK 2 + +#define RINGBUF_SIZE 16 + + +class IBMPC +{ + public: + static IBMPC interface0; +#if defined(IBMPC_CLOCK_BIT1) && defined(IBMPC_DATA_BIT1) + static IBMPC interface1; +#endif + + volatile uint16_t isr_debug; + volatile uint8_t protocol; + volatile uint8_t error; + + void host_init(void); + void host_enable(void); + void host_disable(void); + int16_t host_send(uint8_t data); + int16_t host_recv_response(void); + int16_t host_recv(void); + void host_isr_clear(void); + void host_set_led(uint8_t led); + + IBMPC() : isr_debug(IBMPC_ERR_NONE), protocol(IBMPC_PROTOCOL_NO), error(IBMPC_ERR_NONE), + isr_state(0x8000), timer_start(0), + clock_bit(IBMPC_CLOCK_BIT), data_bit(IBMPC_DATA_BIT) { + }; + IBMPC(uint8_t clock, uint8_t data) : IBMPC() { + clock_bit = clock; + data_bit = data; + } + + inline void isr(void) __attribute__((__always_inline__)); + + + private: + volatile uint16_t isr_state; + uint8_t timer_start; + ringbuf_t rb; + uint8_t rbuf[RINGBUF_SIZE]; + + uint8_t clock_bit, data_bit; + + + inline void clock_lo(void) + { + IBMPC_CLOCK_PORT &= ~(1< Date: Sun, 4 Jul 2021 22:01:38 +0900 Subject: [PATCH 13/28] ibmpc_usb: C++ class for two-interface support --- converter/ibmpc_usb/Makefile | 16 +- converter/ibmpc_usb/Makefile.x2 | 12 + converter/ibmpc_usb/config.h | 79 +- converter/ibmpc_usb/ibmpc_usb.cpp | 1297 +++++++++++++++++++++++++++++ converter/ibmpc_usb/ibmpc_usb.hpp | 164 ++++ 5 files changed, 1538 insertions(+), 30 deletions(-) create mode 100644 converter/ibmpc_usb/Makefile.x2 create mode 100644 converter/ibmpc_usb/ibmpc_usb.cpp create mode 100644 converter/ibmpc_usb/ibmpc_usb.hpp diff --git a/converter/ibmpc_usb/Makefile b/converter/ibmpc_usb/Makefile index 30ce9248..242e7ce1 100644 --- a/converter/ibmpc_usb/Makefile +++ b/converter/ibmpc_usb/Makefile @@ -69,7 +69,7 @@ OPT_DEFS += -DSUSPEND_MODE_STANDBY # comment out to disable the options. # BOOTMAGIC_ENABLE ?= no # Virtual DIP switch configuration(+1000) -MOUSEKEY_ENABLE ?= no # Mouse keys(+4700) +MOUSEKEY_ENABLE ?= yes # Mouse keys(+4700) EXTRAKEY_ENABLE ?= yes # Audio control and System control(+450) CONSOLE_ENABLE ?= yes # Console for debug(+400) COMMAND_ENABLE ?= yes # Commands for debug and configuration @@ -78,6 +78,10 @@ NKRO_ENABLE ?= yes # USB Nkey Rollover KEYMAP_SECTION_ENABLE ?= yes UNIMAP_ENABLE ?= yes +# IBMPC Options +IBMPC_SECONDARY ?= no # enable secondary interface +IBMPC_MOUSE_ENABLE ?= no # enable mouse support + # Optimize size but this may cause error "relocation truncated to fit" #EXTRALDFLAGS = -Wl,--relax @@ -102,6 +106,16 @@ else endif +ifeq (yes,$(strip $(IBMPC_SECONDARY))) + OPT_DEFS += -DIBMPC_SECONDARY +endif + +ifeq (yes,$(strip $(IBMPC_MOUSE_ENABLE))) + OPT_DEFS += -DIBMPC_MOUSE_ENABLE + OPT_DEFS += -DMOUSE_ENABLE +endif + + # Search Path VPATH += $(TARGET_DIR) VPATH += $(TMK_DIR) diff --git a/converter/ibmpc_usb/Makefile.x2 b/converter/ibmpc_usb/Makefile.x2 new file mode 100644 index 00000000..5c9bc325 --- /dev/null +++ b/converter/ibmpc_usb/Makefile.x2 @@ -0,0 +1,12 @@ +# With two interfaces on PS/2 connector +TARGET ?= ibmpc_usb_x2 +MCU = atmega32u2 +SRC ?= protocol/ibmpc.cpp \ + ibmpc_usb.cpp + +COMMAND_ENABLE ?= no # Commands for debug and configuration + +IBMPC_SECONDARY ?= yes # enable secondary interface +IBMPC_MOUSE_ENABLE ?= yes # enable mouse support + +include Makefile diff --git a/converter/ibmpc_usb/config.h b/converter/ibmpc_usb/config.h index 431ef4fd..1b36c58a 100644 --- a/converter/ibmpc_usb/config.h +++ b/converter/ibmpc_usb/config.h @@ -53,56 +53,77 @@ along with this program. If not, see . * Pin and interrupt configuration */ #if defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega32U2__) || defined(__AVR_AT90USB1286__) -/* clock line */ +// clock requires External Interrupt pin(INT*) #define IBMPC_CLOCK_PORT PORTD #define IBMPC_CLOCK_PIN PIND #define IBMPC_CLOCK_DDR DDRD -#define IBMPC_CLOCK_BIT 1 -/* data line */ #define IBMPC_DATA_PORT PORTD #define IBMPC_DATA_PIN PIND #define IBMPC_DATA_DDR DDRD + +// primary interface +#define IBMPC_CLOCK_BIT 1 #define IBMPC_DATA_BIT 0 -/* reset line */ -#define IBMPC_RST_PORT PORTB -#define IBMPC_RST_PIN PINB -#define IBMPC_RST_DDR DDRB -#define IBMPC_RST_BIT1 6 -#define IBMPC_RST_BIT2 7 -/* reset for XT Type-1 keyboard: low pulse for 500ms */ -#define IBMPC_RST_HIZ() do { \ - IBMPC_RST_PORT &= ~(1< + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#include +#include +#include +#include "print.h" +#include "util.h" +#include "debug.h" +#include "host.h" +#include "led.h" +#include "matrix.h" +#include "timer.h" +#include "action.h" +#include "hook.h" +#include "ibmpc.hpp" +#include "ibmpc_usb.hpp" + + +// Converter +IBMPCConverter converter0 = IBMPCConverter(IBMPC::interface0); +#if defined(IBMPC_CLOCK_BIT1) && defined(IBMPC_DATA_BIT1) +IBMPCConverter converter1 = IBMPCConverter(IBMPC::interface1); +#endif + + +void hook_early_init(void) +{ + converter0.init(); +#if defined(IBMPC_CLOCK_BIT1) && defined(IBMPC_DATA_BIT1) + converter1.init(); +#endif +} + +void matrix_init(void) +{ + debug_enable = true; + + matrix_clear(); +} + +matrix_row_t matrix_get_row(uint8_t row) +{ + return IBMPCConverter::matrix_get_row(row); +} + +void matrix_clear(void) +{ + IBMPCConverter::matrix_clear(); +} + +uint8_t matrix_scan(void) +{ + converter0.process_interface(); +#if defined(IBMPC_CLOCK_BIT1) && defined(IBMPC_DATA_BIT1) + converter1.process_interface(); +#endif +} + +void led_set(uint8_t usb_led) +{ + converter0.set_led(usb_led); +#if defined(IBMPC_CLOCK_BIT1) && defined(IBMPC_DATA_BIT1) + converter1.set_led(usb_led); +#endif +} + +extern const action_t actionmaps[][UNIMAP_ROWS][UNIMAP_COLS]; +action_t action_for_key(uint8_t layer, keypos_t key) +{ + return (action_t){ .code = pgm_read_word(&actionmaps[(layer)][key.row & 0x07][key.col & 0x0F]) }; +} + + +void IBMPCConverter::set_led(uint8_t usb_led) +{ + // Sending before keyboard recognition may be harmful for XT keyboard + if (keyboard_kind == NONE) return; + + // XT keyobard doesn't support any command and it is harmful perhaps + // https://github.com/tmk/tmk_keyboard/issues/635#issuecomment-626993437 + if (keyboard_kind == PC_XT) return; + if (keyboard_kind == PC_MOUSE) return; + + // It should be safe to send the command to keyboards with AT protocol + // - IBM Terminal doesn't support the command and response with 0xFE but it is not harmful. + // - Some other Terminals like G80-2551 supports the command. + // https://geekhack.org/index.php?topic=103648.msg2894921#msg2894921 + + // TODO: PC_TERMINAL_IBM_RT support + uint8_t ibmpc_led = 0; + if (usb_led & (1< 3000) { + state = AT_RESET; + } + break; + case AT_RESET: + xprintf("A%u ", timer_read()); + + // SKIDATA-2-DE(and some other keyboards?) stores 'Code Set' setting in nonvolatile memory + // and keeps it until receiving reset. Sending reset here may be useful to clear it, perhaps. + // https://github.com/tmk/tmk_keyboard/wiki/IBM-PC-AT-Keyboard-Protocol#select-alternate-scan-codesf0 + + // reset command + if (0xFA == ibmpc.host_send(0xFF)) { + state = WAIT_AA; + } else { + state = XT_RESET; + } + break; + case XT_RESET: + // Reset XT-initialize keyboard + // XT: hard reset 500ms for IBM XT Type-1 keyboard and clones + // XT: soft reset 20ms min + // https://github.com/tmk/tmk_keyboard/wiki/IBM-PC-XT-Keyboard-Protocol#keyboard-soft-reset + ibmpc.host_disable(); // soft reset: Clock Lo/Data Hi + IBMPC_RST_LO(); // hard reset: Reset pin Lo + + init_time = timer_read(); + state = XT_RESET_WAIT; + break; + case XT_RESET_WAIT: + if (timer_elapsed(init_time) > 500) { + state = XT_RESET_DONE; + } + break; + case XT_RESET_DONE: + IBMPC_RST_HIZ(); // hard reset: Reset pin HiZ + ibmpc.host_isr_clear(); + ibmpc.host_enable(); // soft reset: idle(Clock Hi/Data Hi) + + xprintf("X%u ", timer_read()); + init_time = timer_read(); + state = WAIT_AA; + break; + case WAIT_AA: + // 1) Read BAT code and ID on keybaord power-up + // For example, XT/AT sends 'AA' and Terminal sends 'AA BF BF' after BAT + // AT 84-key: POR and BAT can take 900-9900ms according to AT TechRef [8] 4-7 + // AT 101/102-key: POR and BAT can take 450-2500ms according to AT TechRef [8] 4-39 + // 2) Read key typed by user or anything after error on protocol or scan code + // This can happen in case of keyboard hotswap, unstable hardware, signal integrity problem or bug + + /* wait until keyboard sends any code without 10000ms timeout + if (timer_elapsed(init_time) > 10000) { + state = READ_ID; + } + */ + if (ibmpc.host_recv() != -1) { // wait for AA + xprintf("W%u ", timer_read()); + init_time = timer_read(); + state = WAIT_AABF; + } + break; + case WAIT_AABF: + // NOTE: we can omit to wait BF BF + // ID takes 500ms max? TechRef [8] 4-41, though 1ms is enough for 122-key Terminal 6110345 + if (timer_elapsed(init_time) > 500) { + state = READ_ID; + } + if (ibmpc.host_recv() != -1) { // wait for BF + xprintf("W%u ", timer_read()); + init_time = timer_read(); + state = WAIT_AABFBF; + } + break; + case WAIT_AABFBF: + if (timer_elapsed(init_time) > 500) { + state = READ_ID; + } + if (ibmpc.host_recv() != -1) { // wait for BF + xprintf("W%u ", timer_read()); + state = READ_ID; + } + break; + case READ_ID: + keyboard_id = read_keyboard_id(); + xprintf("R%u ", timer_read()); + + if (0x0000 == keyboard_id) { // CodeSet2 AT(IBM PC AT 84-key) + keyboard_kind = PC_AT; + } else if (0xFFFF == keyboard_id) { // CodeSet1 XT + keyboard_kind = PC_XT; + } else if (0xFFFE == keyboard_id) { // CodeSet2 PS/2 fails to response? + keyboard_kind = PC_AT; + } else if (0xFFFD == keyboard_id) { // Zenith Z-150 AT + keyboard_kind = PC_AT; + } else if (0x00FF == keyboard_id) { // Mouse is not supported + keyboard_kind = PC_MOUSE; + } else if (0xAB85 == keyboard_id || // IBM 122-key Model M, NCD N-97 + 0xAB86 == keyboard_id || // Cherry G80-2551, IBM 1397000 + 0xAB92 == keyboard_id) { // IBM 5576-001 + // https://github.com/tmk/tmk_keyboard/wiki/IBM-PC-AT-Keyboard-Protocol#ab85 + // https://github.com/tmk/tmk_keyboard/wiki/IBM-PC-AT-Keyboard-Protocol#ab86 + // https://github.com/tmk/tmk_keyboard/wiki/IBM-PC-AT-Keyboard-Protocol#ab92 + + if ((0xFA == ibmpc.host_send(0xF0)) && + (0xFA == ibmpc.host_send(0x03))) { + // switch to code set 3 + keyboard_kind = PC_TERMINAL; + } else { + keyboard_kind = PC_AT; + } + } else if (0xAB90 == keyboard_id || // IBM 5576-002 + 0xAB91 == keyboard_id) { // IBM 5576-003 + // https://github.com/tmk/tmk_keyboard/wiki/IBM-PC-AT-Keyboard-Protocol#ab90 + // https://github.com/tmk/tmk_keyboard/wiki/IBM-PC-AT-Keyboard-Protocol#ab91 + + xprintf("\n5576_CS82h:"); + if ((0xFA == ibmpc.host_send(0xF0)) && + (0xFA == ibmpc.host_send(0x82))) { + // switch to code set 82h + // https://github.com/tmk/tmk_keyboard/wiki/IBM-PC-AT-Keyboard-Protocol#ibm-5576-scan-codes-set + xprintf("OK "); + } else { + xprintf("NG "); + } + keyboard_kind = PC_AT; + } else if (0xBFB0 == keyboard_id) { // IBM RT Keyboard + // https://github.com/tmk/tmk_keyboard/wiki/IBM-PC-AT-Keyboard-Protocol#bfb0 + // TODO: LED indicator fix + //keyboard_kind = PC_TERMINAL_IBM_RT; + keyboard_kind = PC_TERMINAL; + } else if (0xAB00 == (keyboard_id & 0xFF00)) { // CodeSet2 PS/2 + keyboard_kind = PC_AT; + } else if (0xBF00 == (keyboard_id & 0xFF00)) { // CodeSet3 Terminal + keyboard_kind = PC_TERMINAL; + } else if (0x7F00 == (keyboard_id & 0xFF00)) { // CodeSet3 Terminal 1394204 + keyboard_kind = PC_TERMINAL; + } else { + xprintf("\nUnknown ID: Report to TMK "); + if ((0xFA == ibmpc.host_send(0xF0)) && + (0xFA == ibmpc.host_send(0x02))) { + // switch to code set 2 + keyboard_kind = PC_AT; + } else if ((0xFA == ibmpc.host_send(0xF0)) && + (0xFA == ibmpc.host_send(0x03))) { + // switch to code set 3 + keyboard_kind = PC_TERMINAL; + } else { + keyboard_kind = PC_AT; + } + } + + xprintf("\nID:%04X(%s%s) ", keyboard_id, KEYBOARD_KIND_STR(keyboard_kind), ID_STR(keyboard_id)); + + state = SETUP; + break; + case SETUP: + xprintf("S%u ", timer_read()); + switch (keyboard_kind) { + case PC_XT: + break; + case PC_AT: + led_set(host_keyboard_leds()); + break; + case PC_TERMINAL: + // Set all keys to make/break type + ibmpc.host_send(0xF8); + // This should not be harmful + led_set(host_keyboard_leds()); + break; +#ifdef IBMPC_MOUSE_ENABLE + case PC_MOUSE: { + uint8_t s[3]; + ibmpc.host_send(0xF5); // Disable + ibmpc.host_send(0xEA); // Set Stream Mode + mouse_read_status(s); + + // Logitech Magic Status + // https://github.com/torvalds/linux/blob/master/drivers/input/mouse/logips2pp.c#L352 + xprintf("\nLMS: "); + ibmpc.host_send(0xE8); ibmpc.host_send(0x00); + ibmpc.host_send(0xE6); ibmpc.host_send(0xE6); ibmpc.host_send(0xE6); + mouse_read_status(s); + if (s[0] == 0 || s[1] == 0) { + // Not Logitech + goto MOUSE_INTELLI; + } + + // Logitech Magic Knock + // https://www.win.tue.nl/~aeb/linux/kbd/scancodes-13.html + // https://web.archive.org/web/20030714000535/www.dqcs.com/logitech/ps2ppspec.htm + // https://github.com/torvalds/linux/blob/5bfc75d92efd494db37f5c4c173d3639d4772966/drivers/input/serio/libps2.c#L347 + xprintf("\nLOG: "); + // sliced magic byte: 0x39 + ibmpc.host_send(0xE6); + ibmpc.host_send(0xE8); ibmpc.host_send(0x00); + ibmpc.host_send(0xE8); ibmpc.host_send(0x03); + ibmpc.host_send(0xE8); ibmpc.host_send(0x02); + ibmpc.host_send(0xE8); ibmpc.host_send(0x01); + // sliced magic byte: 0xDB + ibmpc.host_send(0xE6); + ibmpc.host_send(0xE8); ibmpc.host_send(0x03); + ibmpc.host_send(0xE8); ibmpc.host_send(0x01); + ibmpc.host_send(0xE8); ibmpc.host_send(0x02); + ibmpc.host_send(0xE8); ibmpc.host_send(0x03); + mouse_id = MOUSE_LOGITECH; // 9 + goto MOUSE_DONE; + +MOUSE_INTELLI: + // Intellimouse protocol: 3 + xprintf("\nINT: "); + ibmpc.host_send(0xF3); ibmpc.host_send(0xC8); + ibmpc.host_send(0xF3); ibmpc.host_send(0x64); + ibmpc.host_send(0xF3); ibmpc.host_send(0x50); + mouse_id = ((read_keyboard_id() >> 8) == MOUSE_INTELLI ? MOUSE_INTELLI : MOUSE_DEFAULT); + + // Intellimouse Explorer protocol: 4 + xprintf("\nEXP: "); + ibmpc.host_send(0xF3); ibmpc.host_send(0xC8); + ibmpc.host_send(0xF3); ibmpc.host_send(0xC8); + ibmpc.host_send(0xF3); ibmpc.host_send(0x50); + mouse_id = ((read_keyboard_id() >> 8) == MOUSE_EXPLORER ? MOUSE_EXPLORER : MOUSE_DEFAULT); + + // Not Intellimouse + if (mouse_id == 0) { + xprintf("\nDEF: "); + ibmpc.host_send(0xF6); // Set Default + } + +MOUSE_DONE: + //ibmpc.host_send(0xEA); // Set Stream Mode + ibmpc.host_send(0xF4); // Enable + mouse_read_status(s); + xprintf("\nMouse: %s\n", ((mouse_id == MOUSE_LOGITECH) ? "LOGITECH" : + ((mouse_id == MOUSE_INTELLI) ? "INTELLI" : + ((mouse_id == MOUSE_EXPLORER) ? "EXPLORER" : + ((mouse_id == MOUSE_DEFAULT) ? "DEFAULT" : "???"))))); + break; } +#endif + default: + break; + } + state = LOOP; + xprintf("L%u ", timer_read()); + case LOOP: + { + uint16_t code = ibmpc.host_recv(); + if (code == -1) { + // no code + break; + } + + // Keyboard Error/Overrun([3]p.26) or Buffer full + // Scan Code Set 1: 0xFF + // Scan Code Set 2 and 3: 0x00 + // Buffer full(IBMPC_ERR_FULL): 0xFF + if (keyboard_kind != PC_MOUSE && (code == 0x00 || code == 0xFF)) { + // clear stuck keys + matrix_clear(); + clear_keyboard(); + + xprintf("\n[CLR] "); + break; + } + + switch (keyboard_kind) { + case PC_XT: + if (process_cs1(code) == -1) state = ERROR; + break; + case PC_AT: + if (process_cs2(code) == -1) state = ERROR; + break; + case PC_TERMINAL: + if (process_cs3(code) == -1) state = ERROR; + break; +#ifdef IBMPC_MOUSE_ENABLE + case PC_MOUSE: { + // Logitec Mouse Data: + // https://github.com/torvalds/linux/blob/d2912cb15bdda8ba4a5dd73396ad62641af2f520/drivers/input/mouse/logips2pp.c#L41 + // Intellimouse Data: + // https://www.win.tue.nl/~aeb/linux/kbd/scancodes-13.html + int16_t b0, b1, b2, b3; + int16_t x = 0, y = 0; + int8_t v = 0, h = 0; + + b0 = code; + b1 = ibmpc.host_recv_response(); + if (b1 == -1) break; + b2 = ibmpc.host_recv_response(); + if (b2 == -1) break; + + switch (mouse_id) { + case MOUSE_DEFAULT: + case MOUSE_INTELLI: + case MOUSE_EXPLORER: + mouse_btn = (mouse_btn & 0xF8) | (b0 & 0x07); + x = (b0 & 0x10) ? (b1 | 0xFF00) : b1; + y = (b0 & 0x20) ? (b2 | 0xFF00) : b2; + break; + case MOUSE_LOGITECH: + if ((b0 & 0x48) == 0x48 && (b1 & 0x02) == 0x02) { + switch (((b0 & 0x30) >> 2) | ((b1 & 0x30) >> 4)) { + case 1: // C8 Dx xx + // Ignored while Scroll-Up/Down is pressed + if (!(b2 & 0x40)) { + if (b2 & 0x80) + h = ((b2 & 0x08) ? 0xF0 : 0x00) | (b2 & 0x0F); + else + v = ((b2 & 0x08) ? 0xF0 : 0x00) | (b2 & 0x0F); + } + // Back + if (b2 & 0x10) mouse_btn |= (1 << 3); else mouse_btn &= ~(1 << 3); + // Forward + if (b2 & 0x20) mouse_btn |= (1 << 4); else mouse_btn &= ~(1 << 4); + break; + case 2: // C8 Ex xx + if (b2 & 0x01) mouse_btn |= (1 << 6); else mouse_btn &= ~(1 << 6); + if (b2 & 0x02) mouse_btn |= (1 << 7); else mouse_btn &= ~(1 << 7); + // Task + if (b2 & 0x04) mouse_btn |= (1 << 5); else mouse_btn &= ~(1 << 5); + // Scroll-Up + if (b2 & 0x08) mouse_btn |= (1 << 6); else mouse_btn &= ~(1 << 6); + // Scroll-Down + if (b2 & 0x10) mouse_btn |= (1 << 7); else mouse_btn &= ~(1 << 7); + break; + case 3: // TouchPad? + if (b2 & 0x80) + h = ((b2 & 0x80) ? 0xF0 : 0x00) | ((b2 >> 4) & 0x0F); + else + v = ((b2 & 0x80) ? 0xF0 : 0x00) | ((b2 >> 4) & 0x0F); + + mouse_btn = (mouse_btn & 0xF8) | (b2 & 0x07); + break; + } + } else { + mouse_btn = (mouse_btn & 0xF8) | (b0 & 0x07); + x = (b0 & 0x10) ? (b1 | 0xFF00) : b1; + y = (b0 & 0x20) ? (b2 | 0xFF00) : b2; + } + break; + } + + // Extra byte + switch (mouse_id) { + case MOUSE_INTELLI: + b3 = ibmpc.host_recv_response(); + if (b3 == -1) break; + v = b3 & 0xFF; + break; + case MOUSE_EXPLORER: + b3 = ibmpc.host_recv_response(); + if (b3 == -1) break; + // sign extension + v = ((b3 & 0x08) ? 0xF0 : 0x00) | (b3 & 0x0F); + + // Back/Forward + if (b3 & 0x10) mouse_btn |= (1 << 3); else mouse_btn &= ~(1 << 3); + if (b3 & 0x20) mouse_btn |= (1 << 4); else mouse_btn &= ~(1 << 4); + break; + default: + break; + } + + + // chop to 8-bit + #define CHOP8(a) (((a) > 127) ? 127 : (((a) < -127) ? -127 : (a))) + report_mouse_t mouse_report = {}; + mouse_report.buttons = mouse_btn; + #ifdef MOUSE_EXT_REPORT + mouse_report.x = x; + mouse_report.y = -y; + #else + mouse_report.x = CHOP8(x); + mouse_report.y = -CHOP8(y); + #endif + mouse_report.v = -CHOP8(v); + mouse_report.h = CHOP8(h); + host_mouse_send(&mouse_report); + xprintf("M[x:%d y:%d v:%d h:%d b:%02X]\n", mouse_report.x, mouse_report.y, + mouse_report.v, mouse_report.h, mouse_report.buttons); + break; } +#endif + default: + break; + } + } + break; + case ERROR: + // something goes wrong + clear_keyboard(); + state = INIT; + break; + default: + break; + } + return 1; +} + + +/******************************************************************************* + * XT: Scan Code Set 1 + * + * See [3], [a] + * + * E0-escaped scan codes are translated into unused range of the matrix.(54-7F) + * + * 01-53: Normal codes used in original XT keyboard + * 54-7F: Not used in original XT keyboard + * + * 0 1 2 3 4 5 6 7 8 9 A B C D E F + * 50 - - - - * * x x x x * * * * * * + * 60 * * * * x x x x x x x x x x x * + * 70 x * * x * * x * * x * x * x x * + * + * -: codes existed in original XT keyboard + * *: E0-escaped codes translated + * x: Non-espcaped codes(Some are not used in real keyboards probably) + * + * Codes assigned in range 54-7F: + * + * 50 - 60 Up* 70 KANAx + * 51 - 61 Left* 71 Insert* + * 52 - 62 Down* 72 Delete* + * 53 - 63 Right* 73 ROx + * 54 PrintScr* 64 F13x 74 Home* + * 55 Pause* 65 F14x 75 End* + * 56 Euro2x 66 F15x 76 F24x + * 57 F11x 67 F16x 77 PageUp* + * 58 F12x 68 F17x 78 PageDown* + * 59 Keypad=x 69 F18x 79 HENKANx + * 5A LGUI* 6A F19x 7A RCTL* + * 5B RGUI* 6B F20x 7B MUHENKANx + * 5C APP* 6C F21x 7C RALT* + * 5D Mute* 6D F22x 7D JPYx + * 5E Volume Down* 6E F23x 7E Keypad,x + * 5F Volume Up* 6F Keypad Enter* 7F Keypad/ * + */ +uint8_t IBMPCConverter::cs1_e0code(uint8_t code) { + switch(code) { + // Original IBM XT keyboard doesn't use E0-codes probably + // Some XT compatilble keyobards need these keys? + case 0x37: return 0x54; // Print Screen + case 0x46: return 0x55; // Ctrl + Pause + case 0x5B: return 0x5A; // Left GUI + case 0x5C: return 0x5B; // Right GUI + case 0x5D: return 0x5C; // Application + case 0x20: return 0x5D; // Mute + case 0x2E: return 0x5E; // Volume Down + case 0x30: return 0x5F; // Volume Up + case 0x48: return 0x60; // Up + case 0x4B: return 0x61; // Left + case 0x50: return 0x62; // Down + case 0x4D: return 0x63; // Right + case 0x1C: return 0x6F; // Keypad Enter + case 0x52: return 0x71; // Insert + case 0x53: return 0x72; // Delete + case 0x47: return 0x74; // Home + case 0x4F: return 0x75; // End + case 0x49: return 0x77; // Page Up + case 0x51: return 0x78; // Page Down + case 0x1D: return 0x7A; // Right Ctrl + case 0x38: return 0x7C; // Right Alt + case 0x35: return 0x7F; // Keypad / + + // Shared matrix cell with other keys + case 0x5E: return 0x70; // Power (KANA) + case 0x5F: return 0x79; // Sleep (HENKAN) + case 0x63: return 0x7B; // Wake (MUHENKAN) + + default: + xprintf("!CS1_E0_%02X!\n", code); + return code; + } + return 0x00; +} + +int8_t IBMPCConverter::process_cs1(uint8_t code) +{ + switch (state_cs1) { + case CS1_INIT: + switch (code) { + case 0xE0: + state_cs1 = CS1_E0; + break; + case 0xE1: + state_cs1 = CS1_E1; + break; + default: + if (code < 0x80) + matrix_make(code); + else + matrix_break(code & 0x7F); + break; + } + break; + case CS1_E0: + switch (code) { + case 0x2A: + case 0xAA: + case 0x36: + case 0xB6: + //ignore fake shift + state_cs1 = CS1_INIT; + break; + default: + if (code < 0x80) + matrix_make(cs1_e0code(code)); + else + matrix_break(cs1_e0code(code & 0x7F)); + state_cs1 = CS1_INIT; + break; + } + break; + case CS1_E1: + switch (code) { + case 0x1D: + state_cs1 = CS1_E1_1D; + break; + case 0x9D: + state_cs1 = CS1_E1_9D; + break; + default: + state_cs1 = CS1_INIT; + break; + } + break; + case CS1_E1_1D: + switch (code) { + case 0x45: + matrix_make(0x55); // Pause + state_cs1 = CS1_INIT; + break; + default: + state_cs1 = CS1_INIT; + break; + } + break; + case CS1_E1_9D: + switch (code) { + case 0xC5: + matrix_break(0x55); // Pause + state_cs1 = CS1_INIT; + break; + default: + state_cs1 = CS1_INIT; + break; + } + break; + default: + state_cs1 = CS1_INIT; + } + return 0; +} + + +/******************************************************************************* + * AT, PS/2: Scan Code Set 2 + * + * Exceptional Handling + * -------------------- + * Some keys should be handled exceptionally. See [b]. + * + * Scan codes are varied or prefix/postfix'd depending on modifier key state. + * + * 1) Insert, Delete, Home, End, PageUp, PageDown, Up, Down, Right, Left + * a) when Num Lock is off + * modifiers | make | break + * ----------+---------------------------+---------------------- + * Ohter | | + * LShift | E0 F0 12 | E0 12 + * RShift | E0 F0 59 | E0 59 + * L+RShift | E0 F0 12 E0 F0 59 | E0 59 E0 12 + * + * b) when Num Lock is on + * modifiers | make | break + * ----------+---------------------------+---------------------- + * Other | E0 12 | E0 F0 12 + * Shift'd | | + * + * Handling: These prefix/postfix codes are ignored. + * + * + * 2) Keypad / + * modifiers | make | break + * ----------+---------------------------+---------------------- + * Ohter | | + * LShift | E0 F0 12 | E0 12 + * RShift | E0 F0 59 | E0 59 + * L+RShift | E0 F0 12 E0 F0 59 | E0 59 E0 12 + * + * Handling: These prefix/postfix codes are ignored. + * + * + * 3) PrintScreen + * modifiers | make | break + * ----------+--------------+----------------------------------- + * Other | E0 12 E0 7C | E0 F0 7C E0 F0 12 + * Shift'd | E0 7C | E0 F0 7C + * Control'd | E0 7C | E0 F0 7C + * Alt'd | 84 | F0 84 + * + * Handling: These prefix/postfix codes are ignored, and both scan codes + * 'E0 7C' and 84 are seen as PrintScreen. + * + * 4) Pause + * modifiers | make(no break code) + * ----------+-------------------------------------------------- + * Other | E1 14 77 E1 F0 14 F0 77 + * Control'd | E0 7E E0 F0 7E + * + * Handling: Both code sequences are treated as a whole. + * And we need a ad hoc 'pseudo break code' hack to get the key off + * because it has no break code. + * + * Notes: + * 'Hanguel/English'(F1) and 'Hanja'(F2) have no break code. See [a]. + * These two Korean keys need exceptional handling and are not supported for now. + * + */ +uint8_t IBMPCConverter::cs2_e0code(uint8_t code) { + switch(code) { + // E0 prefixed codes translation See [a]. + case 0x11: return 0x0F; // right alt + case 0x14: return 0x17; // right control + case 0x1F: return 0x19; // left GUI + case 0x27: return 0x1F; // right GUI + case 0x2F: return 0x5C; // apps + case 0x4A: return 0x60; // keypad / + case 0x5A: return 0x62; // keypad enter + case 0x69: return 0x27; // end + case 0x6B: return 0x53; // cursor left + case 0x6C: return 0x2F; // home + case 0x70: return 0x39; // insert + case 0x71: return 0x37; // delete + case 0x72: return 0x3F; // cursor down + case 0x74: return 0x47; // cursor right + case 0x75: return 0x4F; // cursor up + case 0x7A: return 0x56; // page down + case 0x7D: return 0x5E; // page up + case 0x7C: return 0x7F; // Print Screen + case 0x7E: return 0x00; // Control'd Pause + + case 0x21: return 0x65; // volume down + case 0x32: return 0x6E; // volume up + case 0x23: return 0x6F; // mute + case 0x10: return 0x08; // (WWW search) -> F13 + case 0x18: return 0x10; // (WWW favourites) -> F14 + case 0x20: return 0x18; // (WWW refresh) -> F15 + case 0x28: return 0x20; // (WWW stop) -> F16 + case 0x30: return 0x28; // (WWW forward) -> F17 + case 0x38: return 0x30; // (WWW back) -> F18 + case 0x3A: return 0x38; // (WWW home) -> F19 + case 0x40: return 0x40; // (my computer) -> F20 + case 0x48: return 0x48; // (email) -> F21 + case 0x2B: return 0x50; // (calculator) -> F22 + case 0x34: return 0x08; // (play/pause) -> F13 + case 0x3B: return 0x10; // (stop) -> F14 + case 0x15: return 0x18; // (previous track) -> F15 + case 0x4D: return 0x20; // (next track) -> F16 + case 0x50: return 0x28; // (media select) -> F17 + case 0x5E: return 0x50; // (ACPI wake) -> F22 + case 0x3F: return 0x57; // (ACPI sleep) -> F23 + case 0x37: return 0x5F; // (ACPI power) -> F24 + + // https://github.com/tmk/tmk_keyboard/pull/636 + case 0x03: return 0x18; // Help DEC LK411 -> F15 + case 0x04: return 0x08; // F13 DEC LK411 + case 0x0B: return 0x20; // Do DEC LK411 -> F16 + case 0x0C: return 0x10; // F14 DEC LK411 + case 0x0D: return 0x19; // LCompose DEC LK411 -> LGUI + case 0x79: return 0x6D; // KP- DEC LK411 -> PCMM + case 0x83: return 0x28; // F17 DEC LK411 + default: return (code & 0x7F); + } +} + +// IBM 5576-002/003 Scan code translation +// https://github.com/tmk/tmk_keyboard/wiki/IBM-PC-AT-Keyboard-Protocol#ibm-5576-code-set-82h +uint8_t IBMPCConverter::translate_5576_cs2(uint8_t code) { + switch (code) { + case 0x11: return 0x0F; // Zenmen -> RALT + case 0x13: return 0x11; // Kanji -> LALT + case 0x0E: return 0x54; // @ + case 0x54: return 0x5B; // [ + case 0x5B: return 0x5D; // ] + case 0x5C: return 0x6A; // JYEN + case 0x5D: return 0x6A; // JYEN + case 0x62: return 0x0E; // Han/Zen -> `~ + case 0x7C: return 0x77; // Keypad * + } + return code; +} +uint8_t IBMPCConverter::translate_5576_cs2_e0(uint8_t code) { + switch (code) { + case 0x11: return 0x13; // Hiragana -> KANA + case 0x41: return 0x7C; // Keypad ' + } + return code; +} + +int8_t IBMPCConverter::process_cs2(uint8_t code) +{ + switch (state_cs2) { + case CS2_INIT: + if (0xAB90 == keyboard_id || 0xAB91 == keyboard_id) { + code = translate_5576_cs2(code); + } + switch (code) { + case 0xE0: + state_cs2 = CS2_E0; + break; + case 0xF0: + state_cs2 = CS2_F0; + break; + case 0xE1: + state_cs2 = CS2_E1; + break; + case 0x83: // F7 + matrix_make(0x02); + state_cs2 = CS2_INIT; + break; + case 0x84: // Alt'd PrintScreen + matrix_make(0x7F); + state_cs2 = CS2_INIT; + break; + case 0xAA: // Self-test passed + case 0xFC: // Self-test failed + // replug or unstable connection probably + default: // normal key make + state_cs2 = CS2_INIT; + if (code < 0x80) { + matrix_make(code); + } else { + matrix_clear(); + xprintf("!CS2_INIT!\n"); + return -1; + } + } + break; + case CS2_E0: // E0-Prefixed + if (0xAB90 == keyboard_id || 0xAB91 == keyboard_id) { + code = translate_5576_cs2_e0(code); + } + switch (code) { + case 0x12: // to be ignored + case 0x59: // to be ignored + state_cs2 = CS2_INIT; + break; + case 0xF0: + state_cs2 = CS2_E0_F0; + break; + default: + state_cs2 = CS2_INIT; + if (code < 0x80) { + matrix_make(cs2_e0code(code)); + } else { + matrix_clear(); + xprintf("!CS2_E0!\n"); + return -1; + } + } + break; + case CS2_F0: // Break code + if (0xAB90 == keyboard_id || 0xAB91 == keyboard_id) { + code = translate_5576_cs2(code); + } + switch (code) { + case 0x83: // F7 + matrix_break(0x02); + state_cs2 = CS2_INIT; + break; + case 0x84: // Alt'd PrintScreen + matrix_break(0x7F); + state_cs2 = CS2_INIT; + break; + default: + state_cs2 = CS2_INIT; + if (code < 0x80) { + matrix_break(code); + } else { + matrix_clear(); + xprintf("!CS2_F0! %02X\n", code); + return -1; + } + } + break; + case CS2_E0_F0: // Break code of E0-prefixed + if (0xAB90 == keyboard_id || 0xAB91 == keyboard_id) { + code = translate_5576_cs2_e0(code); + } + switch (code) { + case 0x12: // to be ignored + case 0x59: // to be ignored + state_cs2 = CS2_INIT; + break; + default: + state_cs2 = CS2_INIT; + if (code < 0x80) { + matrix_break(cs2_e0code(code)); + } else { + matrix_clear(); + xprintf("!CS2_E0_F0!\n"); + return -1; + } + } + break; + // Pause make: E1 14 77 + case CS2_E1: + switch (code) { + case 0x14: + state_cs2 = CS2_E1_14; + break; + case 0xF0: + state_cs2 = CS2_E1_F0; + break; + default: + state_cs2 = CS2_INIT; + } + break; + case CS2_E1_14: + switch (code) { + case 0x77: + matrix_make(0x00); + state_cs2 = CS2_INIT; + break; + default: + state_cs2 = CS2_INIT; + } + break; + // Pause break: E1 F0 14 F0 77 + case CS2_E1_F0: + switch (code) { + case 0x14: + state_cs2 = CS2_E1_F0_14; + break; + default: + state_cs2 = CS2_INIT; + } + break; + case CS2_E1_F0_14: + switch (code) { + case 0xF0: + state_cs2 = CS2_E1_F0_14_F0; + break; + default: + state_cs2 = CS2_INIT; + } + break; + case CS2_E1_F0_14_F0: + switch (code) { + case 0x77: + matrix_break(0x00); + state_cs2 = CS2_INIT; + break; + default: + state_cs2 = CS2_INIT; + } + break; + default: + state_cs2 = CS2_INIT; + } + return 0; +} + + +/* + * Terminal: Scan Code Set 3 + * + * See [3], [7] and + * https://github.com/tmk/tmk_keyboard/wiki/IBM-PC-AT-Keyboard-Protocol#scan-code-set-3 + */ +// IBM 5576-001 Scan code translation +// https://github.com/tmk/tmk_keyboard/wiki/IBM-PC-AT-Keyboard-Protocol#ibm-5576-code-set-3 +uint8_t IBMPCConverter::translate_5576_cs3(uint8_t code) { + switch (code) { + // Fix positon of keys to fit 122-key layout + case 0x13: return 0x5D; // JYEN + case 0x5C: return 0x51; // RO + case 0x76: return 0x7E; // Keypad ' + case 0x7E: return 0x76; // Keypad Dup + } + return code; +} + +int8_t IBMPCConverter::process_cs3(uint8_t code) +{ + switch (code) { + case 0xAA: // BAT code + case 0xFC: // BAT code + case 0xBF: // Part of keyboard ID + case 0xAB: // Part keyboard ID + state_cs3 = CS3_READY; + xprintf("!CS3_RESET!\n"); + return -1; + } + + switch (state_cs3) { + case CS3_READY: + if (0xAB92 == keyboard_id) { + code = translate_5576_cs3(code); + } + switch (code) { + case 0xF0: + state_cs3 = CS3_F0; + break; + case 0x83: // PrintScreen + matrix_make(0x02); + break; + case 0x84: // Keypad * + matrix_make(0x7F); + break; + case 0x85: // Muhenkan + matrix_make(0x68); + break; + case 0x86: // Henkan + matrix_make(0x78); + break; + case 0x87: // Hiragana + matrix_make(0x00); + break; + case 0x8B: // Left GUI + matrix_make(0x01); + break; + case 0x8C: // Right GUI + matrix_make(0x09); + break; + case 0x8D: // Application + matrix_make(0x0A); + break; +#ifdef G80_2551_SUPPORT + case 0x80: // G80-2551 four extra keys around cursor keys + state_cs3 = CS3_G80; + break; +#endif + default: // normal key make + if (code < 0x80) { + matrix_make(code); + } else { + xprintf("!CS3_READY!\n"); + } + } + break; + case CS3_F0: // Break code + state_cs3 = CS3_READY; + if (0xAB92 == keyboard_id) { + code = translate_5576_cs3(code); + } + switch (code) { + case 0x83: // PrintScreen + matrix_break(0x02); + break; + case 0x84: // Keypad * + matrix_break(0x7F); + break; + case 0x85: // Muhenkan + matrix_break(0x68); + break; + case 0x86: // Henkan + matrix_break(0x78); + break; + case 0x87: // Hiragana + matrix_break(0x00); + break; + case 0x8B: // Left GUI + matrix_break(0x01); + break; + case 0x8C: // Right GUI + matrix_break(0x09); + break; + case 0x8D: // Application + matrix_break(0x0A); + break; + default: + if (code < 0x80) { + matrix_break(code); + } else { + xprintf("!CS3_F0!\n"); + } + } + break; +#ifdef G80_2551_SUPPORT + /* + * G80-2551 terminal keyboard support + * https://deskthority.net/wiki/Cherry_G80-2551 + * https://github.com/tmk/tmk_keyboard/wiki/IBM-PC-AT-Keyboard-Protocol#g80-2551-in-code-set-3 + */ + case CS3_G80: // G80-2551 four extra keys around cursor keys + switch (code) { + case (0x26): // TD= -> JYEN + matrix_make(0x5D); + break; + case (0x25): // page with edge -> NUHS + matrix_make(0x53); + break; + case (0x16): // two pages -> RO + matrix_make(0x51); + break; + case (0x1E): // calc -> KANA + matrix_make(0x00); + break; + case (0xF0): + state_cs3 = CS3_G80_F0; + return 0; + default: + // Not supported + matrix_clear(); + break; + } + state_cs3 = CS3_READY; + break; + case CS3_G80_F0: + switch (code) { + case (0x26): // TD= -> JYEN + matrix_break(0x5D); + break; + case (0x25): // page with edge -> NUHS + matrix_break(0x53); + break; + case (0x16): // two pages -> RO + matrix_break(0x51); + break; + case (0x1E): // calc -> KANA + matrix_break(0x00); + break; + default: + // Not supported + matrix_clear(); + break; + } + state_cs3 = CS3_READY; + break; +#endif + } + return 0; +} + +/* + * IBM PC Keyboard Protocol Resources: + * + * [a] Microsoft USB HID to PS/2 Translation Table - Scan Code Set 1 and 2 + * http://download.microsoft.com/download/1/6/1/161ba512-40e2-4cc9-843a-923143f3456c/translate.pdf + * + * [b] Microsoft Keyboard Scan Code Specification - Special rules of Scan Code Set 1 and 2 + * http://download.microsoft.com/download/1/6/1/161ba512-40e2-4cc9-843a-923143f3456c/scancode.doc + * + * [1] PS/2 Reference Manuals - Collection of IBM Personal System/2 documents. + * http://www.mcamafia.de/pdf/pdfref.htm + * + * [2] Keyboard and Auxiliary Device Controller - Signal Timing and Format + * http://www.mcamafia.de/pdf/ibm_hitrc07.pdf + * + * [3] Keyboards(101- and 102-key) - Keyboard Layout, Scan Code Set, POR, and Commands. + * http://www.mcamafia.de/pdf/ibm_hitrc11.pdf + * + * [4] IBM PC XT Keyboard Protocol + * https://github.com/tmk/tmk_keyboard/wiki/IBM-PC-XT-Keyboard-Protocol + * + * [5] IBM Keyboard Scan Code by John Elliott - 83-key, 84-key, 102-key and 122-key + * https://www.seasip.info/VintagePC/index.html + * + * [6] IBM 1391406 Keyboard - Scan Code Set 2 of 102-key PS/2 keyboard + * https://www.seasip.info/VintagePC/ibm_1391406.html + * + * [7] The IBM 6110344 Keyboard - Scan Code Set 3 of 122-key terminal keyboard + * https://www.seasip.info/VintagePC/ibm_6110344.html + * + * [8] IBM PC AT Technical Reference 1986 + * http://bitsavers.org/pdf/ibm/pc/at/6183355_PC_AT_Technical_Reference_Mar86.pdf + * + * [y] TrackPoint Engineering Specifications for version 3E + * https://web.archive.org/web/20100526161812/http://wwwcssrv.almaden.ibm.com/trackpoint/download.html + * + * [z] [Soarer's XT/AT/PS2/Terminal to USB converter] + * https://geekhack.org/index.php?topic=17458.0 + * + */ diff --git a/converter/ibmpc_usb/ibmpc_usb.hpp b/converter/ibmpc_usb/ibmpc_usb.hpp new file mode 100644 index 00000000..26ad2984 --- /dev/null +++ b/converter/ibmpc_usb/ibmpc_usb.hpp @@ -0,0 +1,164 @@ +#ifndef IBMPC_USB_HPP +#define IBMPC_USB_HPP + +#include +#include "matrix.h" +#include "unimap_trans.h" +#include "ibmpc_usb.h" + + + +#define ID_STR(id) (id == 0xFFFE ? "_????" : \ + (id == 0xFFFD ? "_Z150" : \ + (id == 0x0000 ? "_AT84" : \ + ""))) + +#define ROW(code) ((code>>4)&0x07) +#define COL(code) (code&0x0F) + + +class IBMPCConverter { + public: + static matrix_row_t matrix[MATRIX_ROWS]; + + IBMPC &ibmpc; + + IBMPCConverter(IBMPC &_ibmpc) : ibmpc(_ibmpc), keyboard_id(0), keyboard_kind(NONE), current_protocol(0) { + matrix_clear(); + } + + void init(void) { + ibmpc.host_init(); + } + + uint8_t process_interface(void); + + void set_led(uint8_t usb_led); + + static inline void matrix_clear(void) { + for (uint8_t i=0; i < MATRIX_ROWS; i++) matrix[i] = 0x00; + } + + static inline matrix_row_t matrix_get_row(uint8_t row) { + return matrix[row]; + } + + + private: + uint16_t keyboard_id = 0x0000; + keyboard_kind_t keyboard_kind = NONE; + uint8_t current_protocol = 0; + uint16_t init_time; + + enum Converter_state { + INIT, + WAIT_SETTLE, + AT_RESET, + XT_RESET, + XT_RESET_WAIT, + XT_RESET_DONE, + WAIT_AA, + WAIT_AABF, + WAIT_AABFBF, + READ_ID, + SETUP, + LOOP, + ERROR, + } state = INIT; + + enum CS1_state { + CS1_INIT, + CS1_E0, + // Pause: E1 1D 45, E1 9D C5 [a] + CS1_E1, + CS1_E1_1D, + CS1_E1_9D, + } state_cs1 = CS1_INIT; + + enum CS2_state { + CS2_INIT, + CS2_F0, + CS2_E0, + CS2_E0_F0, + // Pause + CS2_E1, + CS2_E1_14, + CS2_E1_F0, + CS2_E1_F0_14, + CS2_E1_F0_14_F0, + } state_cs2 = CS2_INIT; + + enum CS3_state { + CS3_READY, + CS3_F0, +#ifdef G80_2551_SUPPORT + // G80-2551 four extra keys around cursor keys + CS3_G80, + CS3_G80_F0, +#endif + } state_cs3 = CS3_READY; + + int8_t process_cs1(uint8_t code); + int8_t process_cs2(uint8_t code); + int8_t process_cs3(uint8_t code); + uint8_t cs1_e0code(uint8_t code); + uint8_t cs2_e0code(uint8_t code); + uint8_t translate_5576_cs2(uint8_t code); + uint8_t translate_5576_cs2_e0(uint8_t code); + uint8_t translate_5576_cs3(uint8_t code); + + int16_t read_wait(uint16_t wait_ms); + uint16_t read_keyboard_id(void); + + // translate to Unimap before storing in matrix + inline void matrix_make(uint8_t code) { + uint8_t u = to_unimap(code); + if (u > 0x7F) return; + if (!matrix_is_on(ROW(u), COL(u))) { + matrix[ROW(u)] |= 1< 0x7F) return; + if (matrix_is_on(ROW(u), COL(u))) { + matrix[ROW(u)] &= ~(1< Date: Mon, 5 Jul 2021 12:11:38 +0900 Subject: [PATCH 14/28] ibmpc: busy wait only first time This is not tested well yet --- tmk_core/protocol/ibmpc.cpp | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/tmk_core/protocol/ibmpc.cpp b/tmk_core/protocol/ibmpc.cpp index caa78e42..b8dff1f1 100644 --- a/tmk_core/protocol/ibmpc.cpp +++ b/tmk_core/protocol/ibmpc.cpp @@ -260,7 +260,7 @@ inline void IBMPC::isr(void) // b7 b6 b5 b4 b3 b2 b1 b0 | 1 0 *1 0 0 0 0 0 XT_IBM-done ^2 // pr b7 b6 b5 b4 b3 b2 b1 | 1 0 *1 0 0 0 0 0 AT-midway[b0=1] ^2 // b7 b6 b5 b4 b3 b2 b1 b0 | 1 1 *1 0 0 0 0 0 XT_IBM-error-done - // x x x x x x x x | x 1 1 0 0 0 0 0 illegal + // x x x x x x x x | 0 1 *1 0 0 0 0 0 illegal // st pr b7 b6 b5 b4 b3 b2 | b1 b0 0 *1 0 0 0 0 AT-done // x x x x x x x x | x x 1 *1 0 0 0 0 illegal // all other states than above illegal @@ -280,8 +280,12 @@ inline void IBMPC::isr(void) { uint8_t us = 100; // wait for rising and falling edge of b7 of XT_IBM - while (!(IBMPC_CLOCK_PIN&(1< Date: Tue, 6 Jul 2021 15:29:41 +0900 Subject: [PATCH 15/28] ibmpc: ISR optimization --- tmk_core/protocol/ibmpc.cpp | 5 ++-- tmk_core/protocol/ibmpc.hpp | 53 +++++++++++++++++-------------------- 2 files changed, 27 insertions(+), 31 deletions(-) diff --git a/tmk_core/protocol/ibmpc.cpp b/tmk_core/protocol/ibmpc.cpp index b8dff1f1..7d6dfcbd 100644 --- a/tmk_core/protocol/ibmpc.cpp +++ b/tmk_core/protocol/ibmpc.cpp @@ -369,9 +369,8 @@ DONE: // Disable ISR if buffer is full int_off(); - // inhibit: clock_lo - IBMPC_CLOCK_PORT &= ~(1< Date: Tue, 6 Jul 2021 22:29:26 +0900 Subject: [PATCH 16/28] ibmpc: ringbuf optimization for cpp --- tmk_core/protocol/ibmpc.cpp | 31 +++++++++++++------------- tmk_core/protocol/ibmpc.hpp | 44 ++++++++++++++++++++++++++++++++----- 2 files changed, 55 insertions(+), 20 deletions(-) diff --git a/tmk_core/protocol/ibmpc.cpp b/tmk_core/protocol/ibmpc.cpp index 7d6dfcbd..34b8458d 100644 --- a/tmk_core/protocol/ibmpc.cpp +++ b/tmk_core/protocol/ibmpc.cpp @@ -69,7 +69,6 @@ void IBMPC::host_init(void) inhibit(); int_init(); int_off(); - ringbuf_init(&rb, rbuf, RINGBUF_SIZE); host_isr_clear(); } @@ -174,14 +173,14 @@ int16_t IBMPC::host_recv(void) int16_t ret = -1; // Enable ISR if buffer was full - if (ringbuf_is_full(&rb)) { + if (ringbuf_is_full()) { host_isr_clear(); int_on(); idle(); } ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { - ret = ringbuf_get(&rb); + ret = ringbuf_get(); } if (ret != -1) dprintf("r%02X ", ret&0xFF); return ret; @@ -204,7 +203,7 @@ void IBMPC::host_isr_clear(void) protocol = 0; error = 0; isr_state = 0x8000; - ringbuf_reset(&rb); + ringbuf_reset(); } inline void IBMPC::isr(void) @@ -281,8 +280,8 @@ inline void IBMPC::isr(void) uint8_t us = 100; // wait for rising and falling edge of b7 of XT_IBM if (!protocol) { - while (!(IBMPC_CLOCK_PIN&(1< #include "wait.h" -#include "ringbuf.h" /* * IBM PC keyboard protocol @@ -91,8 +90,6 @@ POSSIBILITY OF SUCH DAMAGE. #define IBMPC_LED_NUM_LOCK 1 #define IBMPC_LED_CAPS_LOCK 2 -#define RINGBUF_SIZE 16 - class IBMPC { @@ -127,8 +124,14 @@ class IBMPC private: volatile uint16_t isr_state; uint8_t timer_start; - ringbuf_t rb; - uint8_t rbuf[RINGBUF_SIZE]; + + /* ring buffer */ + // Size should be power of 2 + #define RINGBUF_SIZE 16 + uint8_t rb_head; + uint8_t rb_tail; + uint8_t rb_buffer[RINGBUF_SIZE]; + const uint8_t clock_bit, data_bit; const uint8_t clock_mask, data_mask; @@ -237,6 +240,37 @@ class IBMPC { EIMSK &= ~clock_mask; } + + /* + * ring buffer + */ + inline int16_t ringbuf_get(void) __attribute__((__always_inline__)) + { + if (ringbuf_is_empty()) return -1; + uint8_t data = rb_buffer[rb_tail]; + rb_tail++; + rb_tail &= (RINGBUF_SIZE - 1); + return data; + } + inline void ringbuf_put(uint8_t data) __attribute__((__always_inline__)) + { + rb_buffer[rb_head] = data; + rb_head++; + rb_head &= (RINGBUF_SIZE - 1); + } + inline bool ringbuf_is_empty(void) __attribute__((__always_inline__)) + { + return (rb_head == rb_tail); + } + inline bool ringbuf_is_full(void) __attribute__((__always_inline__)) + { + return (((rb_head + 1) & (RINGBUF_SIZE - 1)) == rb_tail); + } + inline void ringbuf_reset(void) __attribute__((__always_inline__)) + { + rb_head = 0; + rb_tail = 0; + } }; #endif From 7438f7baabd18502bc6e5c17131e4ddb0875aa50 Mon Sep 17 00:00:00 2001 From: tmk Date: Wed, 7 Jul 2021 23:00:35 +0900 Subject: [PATCH 17/28] ibmpc: ringbuf optimization for c --- tmk_core/common/ringbuf.h | 7 +++++++ tmk_core/protocol/ibmpc.c | 20 +++++++++++--------- 2 files changed, 18 insertions(+), 9 deletions(-) diff --git a/tmk_core/common/ringbuf.h b/tmk_core/common/ringbuf.h index 23bb41e0..d9eec238 100644 --- a/tmk_core/common/ringbuf.h +++ b/tmk_core/common/ringbuf.h @@ -19,6 +19,7 @@ static inline void ringbuf_write(ringbuf_t *buf, uint8_t data); static inline bool ringbuf_is_empty(ringbuf_t *buf); static inline bool ringbuf_is_full(ringbuf_t *buf); static inline void ringbuf_reset(ringbuf_t *buf); +static inline void ringbuf_push(ringbuf_t *buf, uint8_t data); static inline void ringbuf_init(ringbuf_t *buf, uint8_t *array, uint8_t size) { @@ -70,4 +71,10 @@ static inline void ringbuf_reset(ringbuf_t *buf) buf->head = 0; buf->tail = 0; } +static inline void ringbuf_push(ringbuf_t *buf, uint8_t data) +{ + buf->buffer[buf->head] = data; + buf->head++; + buf->head &= buf->size_mask; +} #endif diff --git a/tmk_core/protocol/ibmpc.c b/tmk_core/protocol/ibmpc.c index ff4f54ca..4fd0f508 100644 --- a/tmk_core/protocol/ibmpc.c +++ b/tmk_core/protocol/ibmpc.c @@ -214,11 +214,10 @@ void ibmpc_host_isr_clear(void) ringbuf_reset(&rb); } -#define LO8(w) (*((uint8_t *)&(w))) -#define HI8(w) (*(((uint8_t *)&(w))+1)) -// NOTE: With this ISR data line can be read within 2us after clock falling edge. -// To read data line early as possible: -// write naked ISR with asembly code to read the line and call C func to do other job? + +// NOTE: With this ISR data line should be read within 5us after clock falling edge. +// Confirmed that ATmega32u4 can read data line in 2.5us from interrupt after +// ISR prologue pushs r18, r19, r20, r21, r24, r25 r30 and r31 with GCC 5.4.0 ISR(IBMPC_INT_VECT) { uint8_t dbit; @@ -366,16 +365,19 @@ ISR(IBMPC_INT_VECT) DONE: // store data - if (!ringbuf_put(&rb, isr_state & 0xFF)) { - // buffer overflow - ibmpc_error = IBMPC_ERR_FULL; - + ringbuf_push(&rb, isr_state & 0xFF); + if (ringbuf_is_full(&rb)) { + // just became full // Disable ISR if buffer is full IBMPC_INT_OFF(); // inhibit: clock_lo IBMPC_CLOCK_PORT &= ~(1< Date: Wed, 7 Jul 2021 14:19:43 +0900 Subject: [PATCH 18/28] ibmpc_usb: Detect data out of sync for mouse in case of replug or change devices --- converter/ibmpc_usb/ibmpc_usb.c | 4 ++-- converter/ibmpc_usb/ibmpc_usb.cpp | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/converter/ibmpc_usb/ibmpc_usb.c b/converter/ibmpc_usb/ibmpc_usb.c index c2b7ea77..b2dc8e85 100644 --- a/converter/ibmpc_usb/ibmpc_usb.c +++ b/converter/ibmpc_usb/ibmpc_usb.c @@ -496,9 +496,9 @@ MOUSE_DONE: b0 = code; b1 = ibmpc_host_recv_response(); - if (b1 == -1) break; + if (b1 == -1) { state = ERROR; break; } b2 = ibmpc_host_recv_response(); - if (b2 == -1) break; + if (b2 == -1) { state = ERROR; break; } switch (mouse_id) { case MOUSE_DEFAULT: diff --git a/converter/ibmpc_usb/ibmpc_usb.cpp b/converter/ibmpc_usb/ibmpc_usb.cpp index cf698763..a17ed342 100644 --- a/converter/ibmpc_usb/ibmpc_usb.cpp +++ b/converter/ibmpc_usb/ibmpc_usb.cpp @@ -506,9 +506,9 @@ MOUSE_DONE: b0 = code; b1 = ibmpc.host_recv_response(); - if (b1 == -1) break; + if (b1 == -1) { state = ERROR; break; } b2 = ibmpc.host_recv_response(); - if (b2 == -1) break; + if (b2 == -1) { state = ERROR; break; } switch (mouse_id) { case MOUSE_DEFAULT: From 8391b2c01888ae76c0c4b5771ed51b6747b475ca Mon Sep 17 00:00:00 2001 From: tmk Date: Wed, 7 Jul 2021 21:44:27 +0900 Subject: [PATCH 19/28] ibmpc_usb: Update README --- converter/ibmpc_usb/README.md | 240 +++++++++++++++------------------- 1 file changed, 106 insertions(+), 134 deletions(-) diff --git a/converter/ibmpc_usb/README.md b/converter/ibmpc_usb/README.md index c4e1141d..21f8c73f 100644 --- a/converter/ibmpc_usb/README.md +++ b/converter/ibmpc_usb/README.md @@ -1,22 +1,23 @@ IBM PC Keyboard Converter ========================= -The converter translates IBM PC keyboard protocols to use classic keyboards with modern computer with USB ports. -It supports both IBM XT and AT protocols, and all of scan code set 1, 2 and 3 with one firmware. - -This is not finished project and still work in progress as of 2020-03-02. Test in the field and feedback from users are needed to improve firmware code. - -You can discuss about this project here. - -https://geekhack.org/index.php?topic=103648.0 +The converter translates IBM PC keyboard protocols into USB HID to use classic keyboards on modern computer with USB ports. +This can supports IBM XT and AT protocols and recognize scan code set 1, 2 and 3 with just one firmware. -This project is intended to integrated existent TMK XT, PS/2 and Terminal converters. +This project is intended to integrated existent TMK XT, PS/2 and Terminal keyboard converters. - IBM XT converter: https://geekhack.org/index.php?topic=94649.0 - PS/2 converter: https://geekhack.org/index.php?topic=14618.0 - IBM Terminal converter: http://geekhack.org/index.php?topic=27272.0 +Test in the field and feedback from users are needed to improve firmware code. + +Discuss in this thread or on github. https://geekhack.org/index.php?topic=103648.0 + +You can buy prebuilt TMK converter to support this project here. https://geekhack.org/index.php?topic=72052.0 + + Keyboard supported ------------------ @@ -27,87 +28,46 @@ Keyboard supported - PC Terminal keyboard of IBM 5271(3270 PC) - 122-key: 6110344 6110345 1397000 - 102-key: 1390680 1395764 1392595 -- PS/2 keyboards(AT+CodeSet2) -- Clones of above models + - IBM 5576-001 +- PS/2 keyboards +- Other IBM PC compatible keyboards + +Optionally PS/2 mouses can be supported. +- PS/2 mouse + - Default + - Microsoft IntelliMouse + - Microsoft ExplorerMouse + - Logitech PS/2++ -Hardware +Firmware -------- -Firmware supports ATMega32u4 and ATMega32u2 by default, Teensy2 or ProMicro can be used. -Wire controller pins below to keyboard signals, besides VCC and GND. This is compatible for Soarer's converter. - -- Data PD0 -- Clock PD1 -- Reset PB6 or PB7 (For some of XT keyboards. Not needed for AT, PS/2 and Terminal) - -Pull up resistors of 1-4.7K Ohm on both Data and Clock line are recommended, without them it won't work in some cases. - -### Reset -Old Type-1 IBM XT keyboard and some of XT clones need this to reset its controller on startup. Many of IBM XT keyboards available are Type-2 and don't need the reset pin. - -See this for Type-1 vs Type-2: -https://vintagecomputer.ca/ibm-pc-model-f-keyboard-type-1-vs-type-2/ - -As for clones Zenith Z-150 XT and Leading Edge DC-2014 are known to need this. - -### Connector pinouts -#### XT -- http://www.kbdbabel.org/conn/kbd_connector_ibmpc.png -- https://allpinouts.org/pinouts/connectors/input_device/keyboard-xt-5-pin/ - -#### AT -- http://www.kbdbabel.org/conn/kbd_connector_ps2.png -- https://old.pinouts.ru/InputCables/KeyboardPC5_pinout.shtml - -#### PS/2 -- https://pinouts.ru/InputCables/KeyboardPC6_pinout.shtml - -#### Terminal -- http://www.kbdbabel.org/conn/kbd_connector_ibmterm.png -- http://www.kbdbabel.org/conn/kbd_connector_ibm3179_318x_319x.png - - - -Source Code ------------ -https://github.com/tmk/tmk_keyboard/tree/master/converter/ibmpc_usb - - - -Build Firmware --------------- +### Build Firmware $ cd converter/ibmpc_usb - $ make clean - $ make + $ make -f Makefile. clean + $ make -f Makefile. + + +### Build Options +In Makefiile: + + # IBMPC Options + IBMPC_SECONDARY ?= no + IBMPC_MOUSE_ENABLE ?= no + +These options bloat firmware size and you may need to disable other options. + +- `IBMPC_SECONDARY` - enables secondary interface for converter with PS/2 Mini-DIN-6 connector +- `IBMPC_MOUSE_ENABLE` - enables PS/2 mouse support -Keyboard discrimination ------------------------ -This section explains how the converter determines proper protocol and scan code set for keyboard. The converter need to do that before starting to receive and translate scan codes from keyboard. +### Keymap Editor +You can edit keymap on web browser and download prebuilt firmware here. -### Keyboard ID -After startup the converter sends 0xF2 command to get keyboard ID and sees how the keyboard responds to the command. - -Response from keyboard: - -- XT keyboard doesn't support any command and returns no response. -- AT keyboard should respond with 0xFA to the command but returns no keyboard ID. -- PS/2 keyboard should respond with 0xFA to the command, followd by keyboard ID, such as 0xAB86. -- Terminal keyboard should respond with 0xFA to the command, followed by keyboard ID, such as 0xBFBF. - -Now we can dscriminate the keyboard and determine suitable protocol and scan code set as described below. - -### Protocol -- Signals from XT keyboard are recognized by XT protocol. -- Signals from AT, PS/2 and Terminal keyboard are recognized by AT protocol. - -### Scan code Set -- Scan codes from XT keyboard are handled as CodeSet1. -- Scan codes from AT and PS/2 keyboard are handled as CodeSet2. -- Scan codes from Terminal keyhboard are handled as CodeSet3. +http://www.tmk-kbd.com/tmk_keyboard/editor/#ibmpc_usb @@ -115,62 +75,74 @@ Debug ----- Use hid_listen to see debug outputs from the converter. -https://www.pjrc.com/teensy/hid_listen.html +https://github.com/tmk/tmk_keyboard/wiki#debug + + + +Converter Hardware +------------------ +This firmware supports ATMega32u4, ATMega32u2 and AT90USB1286 by default, Teensy2/2++ or ProMicro can be used. +Wire microcontroller pins below to keyboard signals, besides VCC and GND. This pin configuration is compatible for Soarer's converter. + +Pull up resistors of 1-4.7K Ohm on both Data and Clock line are recommended, without them it won't work in some cases. + +- Data PD0 +- Clock PD1 +- Reset PB6 or PB7 (For some of XT keyboards. Not needed for AT, PS/2 and Terminal) + +For optional secondary interface use these pins. +- Data PD2 +- Clock PD3 + + +### Reset +Old Type-1 IBM XT keyboard and some of XT clones need Reset pin to starup its controller. +Connect Reset pin to pin3 of DIN-5(180-degree) connector. This should not harm keyboards which don't require reset, +it is safe and recommended to have Reset pin on AT/XT converter. + +Zenith Z-150 XT and Leading Edge DC-2014 are also known to need this. + +See this for IBM XT Type-1 vs Type-2: https://github.com/tmk/tmk_keyboard/wiki/IBM-PC-XT-Keyboard-Protocol#type-1-vs-type-2 + + +### Connector pinouts +- DIN: https://en.wikipedia.org/wiki/DIN_connector#Circular_connectors +- Mini-DIN: https://en.wikipedia.org/wiki/Mini-DIN_connector + +#### XT - DIN-5(180-degree) +- http://www.kbdbabel.org/conn/kbd_connector_ibmpc.png +- https://allpinouts.org/pinouts/connectors/input_device/keyboard-xt-5-pin/ + +#### AT - DIN-5(180-degree) +- http://www.kbdbabel.org/conn/kbd_connector_ps2.png +- https://old.pinouts.ru/InputCables/KeyboardPC5_pinout.shtml + +#### Terminal - DIN-5(240-degree) or DIN-6 +- http://www.kbdbabel.org/conn/kbd_connector_ibmterm.png +- http://www.kbdbabel.org/conn/kbd_connector_ibm3179_318x_319x.png + +#### PS/2 - Mini-DIN-6 +- https://pinouts.ru/InputCables/KeyboardPC6_pinout.shtml + +For secondary interface use pin2 and pin6 for data and clock respectively. +You can use PS/2 Y-splitter cable to access secondary interface. + + + +Scan Code Mapping +----------------- +This is how the converter map keyboard scan code to USB key. + +https://github.com/tmk/tmk_keyboard/wiki/IBM-PC-Keyboard-Converter#default-mapping Resources --------- -IBM PC Keyboard Protocol Resources: - -[a] [Microsoft USB HID to PS/2 Translation Table - Scan Code Set 1 and 2]( -http://download.microsoft.com/download/1/6/1/161ba512-40e2-4cc9-843a-923143f3456c/translate.pdf) - -[b] [Microsoft Keyboard Scan Code Specification - Special rules of Scan Code Set 1 and 2]( -http://download.microsoft.com/download/1/6/1/161ba512-40e2-4cc9-843a-923143f3456c/scancode.doc) - -[1] [PS/2 Reference Manuals - Collection of IBM Personal System/2 documents]( -http://www.mcamafia.de/pdf/pdfref.htm) - -[2] [Keyboard and Auxiliary Device Controller - Signal Timing and Format]( -http://www.mcamafia.de/pdf/ibm_hitrc07.pdf) - -[3] [Keyboards(101- and 102-key) - Keyboard Layout, Scan Code Set, POR, and Commands]( -http://www.mcamafia.de/pdf/ibm_hitrc11.pdf) - -[4] [IBM PC XT Keyboard Protocol]( -https://github.com/tmk/tmk_keyboard/wiki/IBM-PC-XT-Keyboard-Protocol) - -[5] [IBM Keyboard Scan Code by John Elliott - 83-key, 84-key, 102-key and 122-key]( -https://www.seasip.info/VintagePC/index.html) - -[6] [IBM 1391406 Keyboard - Scan Code Set 2 of 102-key PS/2 keyboard]( -https://www.seasip.info/VintagePC/ibm_1391406.html) - -[7] [The IBM 6110344 Keyboard - Scan Code Set 3 of 122-key terminal keyboard]( -https://www.seasip.info/VintagePC/ibm_6110344.html) - -[8] [IBM PC AT Technical Reference 1986]( -(http://bitsavers.org/pdf/ibm/pc/at/6183355_PC_AT_Technical_Reference_Mar86.pdf) - -[y] [TrackPoint Engineering Specifications for version 3E]( -https://web.archive.org/web/20100526161812/http://wwwcssrv.almaden.ibm.com/trackpoint/download.html) - -[z] [Soarer's XT/AT/PS2/Terminal to USB converter]( -https://geekhack.org/index.php?topic=17458.0) - - - -TODO ----- -### Reset method for rescue -For converter without accesible reset button when magickey combo doesn't work. - -Check pin status at powerup: - -- if Data and/or Clock are pull down to GND - -### Force protocol and scan code set -Keyboard discrimination may fail and you have to configure them by hand. - -### Add AT90usb1286 support for Teensy2++ +- Source Code: https://github.com/tmk/tmk_keyboard/tree/master/converter/ibmpc_usb +- Discussion: https://geekhack.org/index.php?topic=103648.0 +- Conveter impl: https://github.com/tmk/tmk_keyboard/wiki/IBM-PC-Keyboard-Converter +- XT Protocol: https://github.com/tmk/tmk_keyboard/wiki/IBM-PC-XT-Keyboard-Protocol +- AT Protocol: https://github.com/tmk/tmk_keyboard/wiki/IBM-PC-AT-Keyboard-Protocol +- Scan Code: https://github.com/tmk/tmk_keyboard/wiki/IBM-PC-AT-Keyboard-Protocol#scan-codes +- PS/2 Mouse: https://github.com/tmk/tmk_keyboard/wiki/IBM-PC-Mouse From cb246fece28d177465af9a33a1c1afd2c54f3e51 Mon Sep 17 00:00:00 2001 From: tmk Date: Thu, 8 Jul 2021 14:48:48 +0900 Subject: [PATCH 20/28] usb_desc_dump: Add string descriptor --- converter/usb_desc_dump/README.md | 3 +- .../usb_desc_dump/binary/usb_desc_dump.hex | 2195 +++++++++-------- converter/usb_desc_dump/desc_dump.cpp | 81 +- 3 files changed, 1207 insertions(+), 1072 deletions(-) diff --git a/converter/usb_desc_dump/README.md b/converter/usb_desc_dump/README.md index cca4a061..3df9bf59 100644 --- a/converter/usb_desc_dump/README.md +++ b/converter/usb_desc_dump/README.md @@ -1,6 +1,6 @@ USB Descriptor Dumper ===================== -2021-06-30 +2021-07-08 `usb_desc_dump` read USB descriptors and shows in HEX dump. This works on TMK USB-USB converter and USB Host Shield with Arduino Leonardo. @@ -14,6 +14,7 @@ Following descriptors are supported. - Endpoint Descriptor - HID Descriptor - HID Report descriptor +- String Descriptor diff --git a/converter/usb_desc_dump/binary/usb_desc_dump.hex b/converter/usb_desc_dump/binary/usb_desc_dump.hex index e0fe26bd..d90faccb 100644 --- a/converter/usb_desc_dump/binary/usb_desc_dump.hex +++ b/converter/usb_desc_dump/binary/usb_desc_dump.hex @@ -1,1068 +1,1131 @@ -:100000000C9448010C949B010C949B010C949B0153 -:100010000C949B010C949B010C949B010C949B01F0 -:100020000C949B010C949B010C949A190C946C1ADF -:100030000C948B1E0C949B010C949B010C949B01C3 -:100040000C949B010C949B010C949B010C949B01C0 -:100050000C949B010C94D6050C949B010C949B0171 -:100060000C949B010C949B010C949B010C949B01A0 -:100070000C949B010C949B010C949B010C949B0190 -:100080000C949B010C949B010C949B010C949B0180 -:100090000C949B010C949B010C949B010C949B0170 -:1000A0000C949B010C949B010C949B01E8170F1876 -:1000B00007190F1807195B187E180719D518E418C7 +:100000000C94B3010C9406020C9406020C940602A4 +:100010000C9406020C9406020C9406020C94060240 +:100020000C9406020C9406020C94851B0C94571C2D +:100030000C9476200C9406020C9406020C94060292 +:100040000C9406020C9406020C9406020C94060210 +:100050000C9406020C9468070C9406020C94060299 +:100060000C9406020C9406020C9406020C940602F0 +:100070000C9406020C9406020C9406020C940602E0 +:100080000C9406020C9406020C9406020C940602D0 +:100090000C9406020C9406020C9406020C940602C0 +:1000A0000C9406020C9406020C940602D319FA1959 +:1000B000F21AFA19F21A461A691AF21AC01ACF1A63 :1000C0007573625F73746174653A20253032580A23 -:1000D000000D0A446576696365204465736372693F -:1000E00070746F723A0D0A006C6F77737065656497 -:1000F0003A253032580D0A000D0A41646472657366 -:10010000733A253032580D0A000D0A436F6E666946 -:100110006725643A000D0A5265706F727425643A5F -:10012000206C656E3A253034580D0A000D0A002502 -:1001300030325820000D0A0020000D0A4552524F5F -:10014000523A253032580D0A0025733A253034587A -:100150000D0A0025733A253032580D0A0000000AB6 -:100160004B6579626F6172642073746172742E0AD8 -:10017000000A55534220636F6E6669677572656445 -:100180002E0A000A0A544D4B3A336632323962372E -:10019000342B2F4C5546410A0A002C0355005300BE -:1001A0004200200044006500730063007200690093 -:1001B000700074006F0072002000440075006D0034 -:1001C0007000650072000000080354004D004B00F1 -:1001D00000000403090409024200020100A03209E0 -:1001E0000400000103010100092111010001224066 -:1001F000000705810308000A09040100020300004A -:1002000000092111010001222200070582032000BC -:10021000010705020320000112011001000000087F -:10022000EDFE5B001408010200010631FF0974A114 -:10023000010975150026FF009520750881020976D1 -:10024000150026FF00952075089102C005010906DA -:10025000A101050719E029E7150025019508750199 -:100260008102950175088101050819012905950587 -:10027000750191029501750391010507190029FF88 -:10028000150026FF00950675088100C02005410570 -:1002900011241FBECFEFDAE0DEBFCDBF04B603FEF0 -:1002A00028C08091A4059091A505A091A605B091C4 -:1002B000A7058730904BA740B04BD9F41092A40506 -:1002C0001092A5051092A6051092A70514BE0FB6B0 -:1002D000F894A895809160008861809360001092E6 -:1002E00060000FBE1092010810920008E0E0F8E3F1 -:1002F000099511E0A0E0B1E0EAE1F2E402C0059066 -:100300000D92AA38B107D9F725E0AAE8B1E001C0FB -:100310001D92A43AB207E1F711E0C8E4D1E004C0AD -:100320002197FE010E940521C634D107C9F70E941A -:1003300003150C940B210C940000FF93EF93E091B4 -:100340008A01F0918B01309709F00995EF91FF91A7 -:100350000895FC018591803011F0EFDFFBCF089507 -:10036000FF27E0E230E247FF0CC0419597FF09C04C -:10037000EDE26095709580959095611D711D811DD0 -:10038000911D27FF02C0219530E350E2AA27660F96 -:10039000771F881F991FAA1FA41710F0A41B63952D -:1003A0005A95A9F7AA3008F0A95FA05DAF93F3951D -:1003B000611571058105910541F7ED3211F4EF9357 -:1003C000F395F21718F43F93F395FBCF8F91B5DFB8 -:1003D000FA95E1F70895E991F9918591803021F03E -:1003E000853219F0AADFF9CF089520E0E8945591FD -:1003F0005532C1F3503311F4689455915A3348F48F -:10040000505390F3220F022E220F220F200D250FA2 -:10041000F4CF0EF4219589919991533619F35337FE -:1004200029F1533559F1BC0188279927E8945C36A6 -:1004300021F48991999168945591543639F446EF95 -:100440007EF077FF0DC08FEF9FEF0AC055374AE06F -:1004500039F0583540E121F0523642E009F0089574 -:10046000FF93EF937DDFEF91FF91B7CFFF93EF9372 -:10047000FC0181918030B9F360DFFBCFFF93EF93F4 -:1004800068DFF1CFDF93CF93CDB7DEB72596A3DF3B -:10049000CF91DF9108951F926F939F938F9383E580 -:1004A00091E09F938F930E9442020F900F900F90C4 -:1004B0000F900F900F9008957F936F939F938F935A -:1004C00089E491E09F938F930E9442020F900F90D6 -:1004D0000F900F900F900F9008951F928F938AE3C3 -:1004E00091E09F938F930E9442020F900F900F9084 -:1004F0000F900895CF92DF92EF92FF920F931F9388 -:10050000CF93DF936C017B01C0E0D0E00FE211E0FC -:10051000CC15DD05ECF4CE018F709927892B19F0ED -:1005200088E391E004C0209721F085E391E00E94E8 -:10053000A901F70181917F011F928F931F930F9360 -:100540000E94420221960F900F900F900F90E0CFE3 -:100550008CE291E0DF91CF911F910F91FF90EF908E -:10056000DF90CF900C94A9018F929F92AF92BF928F -:10057000CF92EF920F93CF93DF93EA011F921F92D6 -:1005800020E931E03F932F9321E02F931F924A01FE -:100590005B0122E2C22EE12C06E021E840E0FC01F2 -:1005A000628181EA93E00E94DE0A60E971E0CE0197 -:1005B0000E947A020F900F900F900F900F900F9063 -:1005C00080E0DF91CF910F91EF90CF90BF90AF90EF -:1005D0009F908F9008958F929F92AF92BF92CF92EB -:1005E000DF92EF92FF921F93CF93DF935C01EA01BA -:1005F00010E0CB0180579D4F7C0185E1C82E81E042 -:10060000D82ECE15DF0508F042C06981643049F06C -:1006100018F4613048F137C06530A9F1613219F042 -:1006200023C01A8130C088858F938F818F93812E4C -:10063000912C1F921F93DF92CF920E9442026E81F3 -:100640000F900F900F900F900F900F90623239F42F -:100650004F815885B401C5010E94B40214C085E1E0 -:1006600091E00E944B020FC08CE291E0DF91CF91AC -:100670001F91FF90EF90DF90CF90BF90AF909F9031 -:100680008F900C944B028881C80FD11DBACFDF9197 -:10069000CF911F91FF90EF90DF90CF90BF90AF90E0 -:1006A0009F908F9008956F927F928F929F92AF92BA -:1006B000BF92CF92DF92EF92FF920F931F93CF934F -:1006C000DF935C01862E912CC0E0D0E029E0622E01 -:1006D00021E0722E1C2F8C169D0609F443C0DF9377 -:1006E000CF937F926F920E94420290E9E92E92E0AE -:1006F000F92E0C2F29E030E040E0F501628181EA1B -:1007000093E00E94D90B0F900F900F900F908111E2 -:100710002AC0C0909202D0909302B6018FE391E07C -:100720000E945C029601F1E0CF16DF0610F020E097 -:1007300031E080E9E82E82E0F82E012F40E0F5015B -:10074000628181EA93E00E94D90B219681110BC04E -:10075000B701C6010E947A02A701B601C5010E9435 -:10076000EB02B8CF80E0DF91CF911F910F91FF9006 -:10077000EF90DF90CF90BF90AF909F908F907F9041 -:100780006F9008950F931F93CF93DF93EC018A81AD -:100790001F928F9388EF90E09F938F930E94420265 -:1007A0008C811F928F9388EE90E09F938F930E948D -:1007B000420200E912E022E130E040E06A8181EA91 -:1007C00093E00E94B20B2DB73EB7285F3F4F0FB6A4 -:1007D000F8943EBF0FBE2DBF81110E946D02609143 -:1007E00098027091990284E491E00E945C02609109 -:1007F0009A0270919B028DE491E00E945C0281ED6F -:1008000090E00E94A90160E972E082E190E00E941C -:100810007A026091A102CE010E94530381110E94CD -:100820006D02E091A103F091A2030480F581E02D17 -:100830006A8181EA93E0DF91CF911F910F91099432 -:1008400008950E94AF0590938F0180938E010895C3 -:1008500081E00895CF93DF9381EA93E00E94CC0D6D -:1008600081EA93E00E94070790918C018917C9F0F3 -:1008700081EA93E00E94070780938C011F928F9377 -:1008800080EC90E09F938F930E9442020F900F9014 -:100890000F900F9080910001811103C081E080933F -:1008A000000180918E0190918F010E94C705883BC5 -:1008B0009B40C8F081EA93E00E940707803999F4D1 -:1008C00080910001882379F0CCEAD3E08A818823E3 -:1008D00019F0CE010E94C203259683E0C73FD807D6 -:1008E000A9F710920001DF91CF9108952E9A0895F3 -:1008F0002E988EBD0DB407FEFDCF1EBC0DB407FEB5 -:10090000FDCF0E9476048EB508952E9882608EBD2C -:100910000DB407FEFDCF6EBD0DB407FEFDCF0C94E8 -:10092000760488EF0E947804807C803411F118F4FA -:10093000882371F10895803819F0803C39F10895C9 -:1009400088ED0E94780490918D0181FD08C092305D -:1009500029F161EC88ED0E94850482E007C09330A4 -:10096000E9F063EC88ED0E94850483E080938D01BB -:10097000089588ED0E94780490918D0181FD03C057 -:10098000933079F70895923021F7089581E0EECF02 -:1009900061ED88ED0E94850410928D0108950F93FA -:1009A0001F93CF93DF938C01269A0E947604219A9D -:1009B000229A2398209A80E58CBD81E08DBD2598F0 -:1009C00068E188E80E94850460E288E70E94850467 -:1009D00060E088E70E948504C0E0D0E088E60E94DD -:1009E0007804219680FD06C0CF3F8FEFD807B1F77E -:1009F0008FEF1DC061EC88ED0E94850460E280ED00 -:100A00000E94850464E088EE0E94850488EE0E94BE -:100A1000780482FFFBCFC8010E94910460E288EC59 -:100A20000E94850461E080E80E94850480E0DF91F7 -:100A3000CF911F910F91089581EA93E00C94CF0418 -:100A400081EA93E00E94D70661EA73E080E993E0CF -:100A50000C943D1180E090E008958FEF9FEF089592 -:100A600081E090E008950895862F0E94F71281E0BA -:100A700090E00895FB0180810E94F71281E090E0F0 -:100A80000895E8E1F4E01382128288EE93E0A0E09A -:100A9000B0E084839583A683B7838BE591E091834F -:100AA00080838FEF9FEF9587848708950C94BB0513 -:100AB0008F929F92AF92BF92CF92DF92EF92FF926E -:100AC0000E94E11F4B015C0120E030E04AE755E461 -:100AD0000E9498206B017C0120E030E040E85FE359 -:100AE0000E94AD1F87FD24C020E03FEF4FE757E491 -:100AF000C701B6010E9493201816ACF420E030E044 -:100B000040E251E4C501B4010E9498200E94B21F46 -:100B100020E931E06115710581F0C9010197F1F714 -:100B200061507109F7CFC701B6010E94B21F02C020 -:100B300061E070E0CB010197F1F7FF90EF90DF905B -:100B4000CF90BF90AF909F908F90089582E084BD2A -:100B500093E095BD9AEF97BD80936E0008952FB7EF -:100B6000F8948091680490916904A0916A04B0910E -:100B70006B042FBF08952FB7F894609168047091AB -:100B8000690480916A0490916B042FBF08959C01C1 -:100B90004FB7F8948091680490916904A0916A0419 -:100BA000B0916B044FBF821B930B089578941F92F2 -:100BB0000F920FB60F9211248F939F93AF93BF9311 -:100BC0008091680490916904A0916A04B0916B04CB -:100BD0000196A11DB11D8093680490936904A093B0 -:100BE0006A04B0936B04BF91AF919F918F910F9066 -:100BF0000FBE0F901F901895CF93DF93FC01862FA7 -:100C00008078A9F4283008F04DC0442321F0958164 -:100C1000973009F447C0EF01A1E0B0E09D8599232A -:100C200041F011962596A031B105C1F73BC080E097 -:100C300039C061111CC085E08A9FE0018B9FD00DF7 -:100C40001124CE0FDF1F442331F081E48887858192 -:100C50008F5F858302C081E0888725E02A9FC001DD -:100C60002B9F900D1124E80FF91F80851BC0677022 -:100C7000660F660F660F442341F0606485818F5FC5 -:100C800085838770687F682B03C02770687B622B21 -:100C900025E02A9FC0012B9F900D1124E80FF91F1A -:100CA0006087862FDF91CF910895611102C006966B -:100CB0000895FC0121E03585631739F02F5F3596E3 -:100CC0002031C9F780E090E00895069635E0239F33 -:100CD000800D911D11240895DF92EF92FF920F93E2 -:100CE0001F93CF93DF93EC01E62EF12C85E0689FF4 -:100CF000B0011124FE01E60FF71F8085182F177031 -:100D000086FF17C001E085E0D82EFE01D09EE00DE1 -:100D1000F11D112480858695869586958770181714 -:100D2000F9F00F5F003189F78D81811302C01150F6 -:100D30001D8385E08E9DF0018F9DF00D1124EC0F39 -:100D4000FD1F108681E0818712862296D783C68395 -:100D5000DF91CF911F910F91FF90EF90DF90089559 -:100D6000602FCE010E946C06D0CFFC01613499F453 -:100D70009C01255B3F4F61E0AC014E5F5F4F1586E4 -:100D800066871786548743873596E217F307B9F7C6 -:100D9000FC011582089521E03585631729F02F5F46 -:100DA00035962031C9F70895622F0C946C06FC012A -:100DB0008DE691E0918380831582108681E08187A2 -:100DC0001286CF01029697838683128228E02383BE -:100DD0002CE32483DF019F01255B3F4F41E01D96FB -:100DE0001C921D971E964C931E971F961C921F9740 -:100DF0001C969C938E931B971596A217B30779F7B1 -:100E0000EA58FF4F108281E1809370040895809129 -:100E100070040895CF93C42F0E945506009789F05F -:100E2000DC01ED91FC911197309759F013969C914C -:100E300080E0891731F020812C1731F033968F5FD5 -:100E4000F8CF80E090E001C0CF01CF9108950F93DB -:100E50001F93CF93DF932115310571F0E901042F22 -:100E6000162F0E945506FC01892B41F01283D18375 -:100E7000C083038380E003C088ED01C086EDDF916D -:100E8000CF911F910F910895CF92DF92FF920F9310 -:100E90001F93CF93DF93662381F1F62E8C016C01B3 -:100EA00086E5C80ED11CC0E0D0E0D6018D919D91A1 -:100EB0006D010097F1F0DC01ED91FC910084F1856A -:100EC000E02D0995F81215C0AB96CC0FDD1FC00FB1 -:100ED000D11F88819981DC01ED91FC910480F5811D -:100EE000E02DDF91CF911F910F91FF90DF90CF9078 -:100EF00009942196C031D105C1F680E0DF91CF91F0 -:100F00001F910F91FF90DF90CF9008952E98089534 -:100F1000CF93C82F0E948607CEBD0DB407FEFDCF2C -:100F20001EBC0DB407FEFDCF0E9476048EB5CF9196 -:100F30000895CF93DF93C82FD62F0E948607C260F3 -:100F4000CEBD0DB407FEFDCFDEBD0DB407FEFDCF57 -:100F5000DF91CF910C9476048F929F92AF92BF92C3 -:100F6000CF92DF92EF92FF920F931F93CF93DF9375 -:100F7000EC01D62EC42E59010E9455067C01009723 -:100F800009F445C0FC0180819181892B09F441C09D -:100F90004C2D6D2DCE010E940A07F50191838083AF -:100FA0000097C9F1FC0182818695869590E0803199 -:100FB000910514F08FE090E041E050E060E070E0D7 -:100FC0004A015B0104C0880C991CAA1CBB1C8A95B1 -:100FD000D2F7D501C4010197F801918380836D2D6B -:100FE00080EE0E94990788ED0E948807F70194819E -:100FF000992331F0CA58DF4F68816260682B02C0C4 -:10100000682F697F88ED0E94990780E005C086ED12 -:1010100003C087ED01C08BEDDF91CF911F910F9140 -:10102000FF90EF90DF90CF90BF90AF909F908F9008 -:1010300008958F929F92AF92BF92CF92DF92EF92DC -:10104000FF920F931F93CF93DF93862E942E590117 -:101050000E9456056B017C0128E8C20E23E1D21ED6 -:10106000E11CF11C00E010E0D0E0C0E098280E94F4 -:101070005605DC01CB018C199D09AE09BF09B7FFEC -:101080002DC0692D80EF0E9499070E945605DC0152 -:10109000CB018C199D09AE09BF09B7FF09C088ECC7 -:1010A0000E94880787FFF1CF60E888EC0E949907CB -:1010B00088EF0E948807C82FCF70C43019F0CE3057 -:1010C00051F00CC00F5F1F4FA114B10481F20A153B -:1010D0001B0569F603C0DF5FD33049F68C2FDF9123 -:1010E000CF911F910F91FF90EF90DF90CF90BF9025 -:1010F000AF909F908F9008959F92AF92BF92CF92A2 -:10110000DF92EF92FF920F931F93CF93DF937C01B7 -:10111000D42F122F902E00E06C01C60ED11CC60EEB -:10112000D11C86E5C80ED11CA42EB12CABE2AA0EB0 -:10113000B11CAA0CBB1CAE0CBF1CF60180819181B6 -:10114000DC01ED91FC910280F381E02D292D412FEE -:101150006D2F0995803EC9F4D1110BC061E088EE76 -:101160000E94990766E670E080E090E00E945805D2 -:1011700014C0F50180819181DC01ED91FC91028424 -:10118000F385E02D612F099508C08D3021F40330DF -:1011900008F03FC014C081113FC0F60180819181E9 -:1011A000DC01ED91FC910190F081E02D292D412F82 -:1011B0006D2F0995C82F8D3051F4033050F464E63B -:1011C00070E080E090E00E9458050F5FB6CF882362 -:1011D00011F1D1110BC061E088EE0E94990766E61B -:1011E00070E080E090E00E94580511C0ED2FF0E023 -:1011F000BB96EE0FFF1FEE0DFF1D80819181DC017C -:10120000ED91FC910284F385E02D612F09958C2FDF -:1012100003C08DE001C080E0DF91CF911F910F915D -:10122000FF90EF90DF90CF90BF90AF909F90089588 -:101230000F931F93CF93DF93182F062FEA010E947D -:10124000860712601EBDFE01802F882339F00DB481 -:1012500007FEFDCF91919EBD8150F7CFC00FD11DEC -:101260000DB407FEFDCF0E947604CE01DF91CF9131 -:101270001F910F9108952F923F924F925F926F921C -:101280007F928F929F92AF92BF92CF92DF92EF9216 -:10129000FF920F931F93CF93DF9300D000D01F9244 -:1012A000CDB7DEB77B014A016901FB01F181F9830A -:1012B0008F2F8150803408F075C00E9456052B0195 -:1012C0003C0128E8420E23E1521E611C711CF7010B -:1012D000828180FD02C060E401C060E888EE0E9467 -:1012E0009907312C9981892F90E09A838983C114C1 -:1012F000D10409F44AC0E981FA81FD83EC83CE165A -:10130000DF0610F4DD82CC82FC81FB83A8016F2F05 -:1013100080E10E9418096C8188E30E949907F70117 -:101320006081606280EF0E94990788EC0E948807C4 -:1013300087FFFBCF60E888EC0E94990788EF0E9446 -:1013400088078F70382EA12CB12C212C332009F462 -:1013500051C00E945605DC01CB0184199509A609EC -:10136000B709B7FF47C0F6E03F1611F12EE032167D -:10137000D9F084E0381209C0FFEFAF1ABF0A811418 -:101380009104B1F0A814B90499F488EF0E94880779 -:1013900085FB882780F9F701928180FB90F9928381 -:1013A000832D2FC08AED2DC0239423E0221669F3EC -:1013B00060E088E30E949907F801608180E10E9463 -:1013C00099076B8188E30E949907F7016081606249 -:1013D00080EF0E94990788EC0E94880787FFFBCF67 -:1013E00060E888EC0E94990788EF0E9488078F7058 -:1013F000382EACCFEC81FD81CE1ADF0A0E0F1F1FF5 -:1014000076CF0F900F900F900F900F90DF91CF91AC -:101410001F910F91FF90EF90DF90CF90BF90AF9012 -:101420009F908F907F906F905F904F903F902F9004 -:1014300008952F923F924F925F926F927F928F9278 -:101440009F92AF92BF92CF92DF92EF92FF920F9353 -:101450001F93CF93DF93CDB7DEB72A970FB6F894DB -:10146000DEBF0FBECDBF9D838C836B015F834E8338 -:101470005901EA82F90180809180FB01F181FB83AF -:10148000F90111821082FB01828181FD02C060E1BD -:1014900001C060E288EE0E9499078886FA814F2E8B -:1014A000512C612C712C2E813F81F601408160E02E -:1014B0008C819D810E94190889838630A1F3811156 -:1014C00063C088EC0E94880782FF5CC080E30E94B2 -:1014D0008807382E90E08816990608F43884F501BC -:1014E000808191819401281B390B3A87298737FF26 -:1014F00002C01A861986E32CF12C89859A85E81694 -:10150000F90614F4FA86E98629840E94860798E091 -:101510009EBD0DB407FEFDCFF801222041F01EBC98 -:101520002A940DB407FEFDCF8EB58193F6CFE985E1 -:10153000FA850E0F1F1F0E94760464E088EC0E945B -:101540009907F50180819181E80EF91EF182E08210 -:10155000FB813F1618F0E814F90458F088EF0E9458 -:10156000880782958170F601928180FB91F99283C0 -:101570000BC0FA81FF2309F496CFC301B2010E9488 -:10158000580591CF20EF298389812A960FB6F894C8 -:10159000DEBF0FBECDBFDF91CF911F910F91FF90A6 -:1015A000EF90DF90CF90BF90AF909F908F907F9003 -:1015B0006F905F904F903F902F9008952F923F92A1 -:1015C0004F925F926F927F928F929F92AF92BF9253 -:1015D000CF92DF92EF92FF920F931F93CF93DF93FF -:1015E000CDB7DEB761970FB6F894DEBF0FBECDBFA3 -:1015F0003C01F42E322E202EC98A65014EA05FA038 -:10160000A8A4B9A4188A1F861E861D868E01035FB2 -:101610001F4F9E01215F3F4F0E94AC07811189C07F -:1016200039822A82EB8289898C83DE82CD829886F8 -:101630008F82AE014F5F5F4F68E080E20E94180921 -:101640002D853E854F2D60E1C3010E941908182F9A -:1016500081116BC0932D9078392EA114B10409F437 -:1016600055C0EF85F8898281992309F440C08260D2 -:1016700082836401C114D10409F44DC09C2D8D2DC9 -:101680004C145D0410F4942D852D9B878C874D851B -:101690005E856F857889E12C85019E01255F3F4F2E -:1016A000C3010E94190A182F863021F381113DC011 -:1016B000AAA5BBA5109799F0ED91FC911197019007 -:1016C000F081E02DC4018C199D099A8789876B856B -:1016D0007C859E01275F3F4FA501CD0109958B8534 -:1016E0009C85C81AD90A8415950520F60FC081601B -:1016F00082834D855E8585019201BF01C3010E94F1 -:101700003B09811116C02D853E8511C02D853E8572 -:10171000311005C00CC0111108C02D853E8560EA4E -:101720004F2DC3010E94190804C0812F02C060E838 -:10173000F7CF61960FB6F894DEBF0FBECDBFDF9135 -:10174000CF911F910F91FF90EF90DF90CF90BF90BE -:10175000AF909F908F907F906F905F904F903F9051 -:101760002F9008958F929F92AF92BF92CF92EF9257 -:101770000F931F931F921F921F930F933F932F93CB -:101780004901A12CB12CCC24C394E12C06E020E823 -:101790000E94DE0A0F900F900F900F900F900F9005 -:1017A0001F910F91EF90CF90BF90AF909F908F902F -:1017B00008958F929F92AF92BF92CF92EF92FF9235 -:1017C0000F931F921F92FF92EF923F932F93490125 -:1017D000A12CB12C22E0C22EE02E06E020E80E94CF -:1017E000DE0A0F900F900F900F900F900F900F91B7 -:1017F000FF90EF90CF90BF90AF909F908F90089503 -:101800008F929F92AF92BF92CF92EF920F93CF930E -:101810001F921F921F921F921F921F92812C912C38 -:10182000A12CB12CC12CE22E05E020E00E94DE0AA2 -:10183000C82F6CE271E080E090E00E9458050F90A4 -:101840000F900F900F900F900F908C2FCF910F91C2 -:10185000EF90CF90BF90AF909F908F9008950F938F -:101860001F93CF93DF938A3F3FEF930711F486EDE9 -:101870002DC0DC011696ED91FC911797EF2B09F125 -:10188000122F242FEC011A8740E00E94FC05082F3C -:101890008823C9F0682FCE010E945506009739F3BE -:1018A000FC011483202F40E060E0CE010E94000C78 -:1018B000182F882351F0602FCE010E94B506812F8A -:1018C00005C087ED03C084ED01C080E0DF91CF91BA -:1018D0001F910F9108952F923F924F925F926F92B6 -:1018E0007F928F929F92AF92BF92CF92DF92EF92B0 -:1018F000FF920F931F93CF93DF93CDB7DEB7669719 -:101900000FB6F894DEBF0FBECDBF1B8A38E03C8B0C -:101910003CE33D8B8A3F3FEF930709F464C0522EAE -:10192000342E462E7C01DC011696CD90DC90179764 -:10193000CE01439617969C938E9316971A962C93E6 -:101940008E010F5F1F4F22E130E040E060E0C701F1 -:101950000E94B20BF701D782C6828111A6C089848A -:101960009A846B847C84FD81FE8B2E80670136E532 -:10197000C30ED11C560110E0D5018D919C910097AA -:10198000F1F1DC01ED91FC910084F185E02D0995E8 -:10199000811135C0F50180819181DC01ED91FC91CF -:1019A0000088F189E02D622D0995882341F1F50128 -:1019B00080819181DC01ED91FC910484F585E02D1D -:1019C000A301B4010995811110C0F50180819181B5 -:1019D000DC01ED91FC910684F785E02D6E89099577 -:1019E000811103C00CC086ED60C0052D232D442D50 -:1019F000612FC7010E947C08813D09F056C01F5F1E -:101A0000B2E0AB0EB11C103109F0B6CF10E0F60118 -:101A1000808191810097E1F1DC01ED91FC910084DE -:101A2000F185E02D0995811133C0F6018081918106 -:101A3000DC01ED91FC910088F189E02D622D099582 -:101A40008823D9F0F60180819181DC01ED91FC9130 -:101A50000484F585E02DA301B4010995811118C016 -:101A6000F60180819181DC01ED91FC910684F7857E -:101A7000E02D6E89099581110BC0052D232D442D74 -:101A8000612FC7010E947C08982F977F913D69F4D0 -:101A90001F5FE2E0CE0ED11C103109F0B8CF252D2A -:101AA000432D642DC7010E942F0C66960FB6F89443 -:101AB000DEBF0FBECDBFDF91CF911F910F91FF9081 -:101AC000EF90DF90CF90BF90AF909F908F907F90DE -:101AD0006F905F904F903F902F9008958F929F92BC -:101AE000AF92BF92CF92EF920F931F921F921F92CD -:101AF0001F921F921F92812C912CA12CB12CC12CD2 -:101B0000E22E09E020E00E94DE0A0F900F900F9075 -:101B10000F900F900F900F91EF90CF90BF90AF90DC -:101B20009F908F9008958F929F92AF92BF92CF9285 -:101B3000DF92EF920F931F93CF93DF9300D000D0EB -:101B4000CDB7DEB76C01590148011C821B821A8295 -:101B500019828E010F5F1F4F9E012D5F3F4F0E9424 -:101B6000AC07811109C049815A816B817C81840154 -:101B70009501C6010E94190A0F900F900F900F90C7 -:101B8000DF91CF911F910F91EF90DF90CF90BF9099 -:101B9000AF909F908F900895AF92BF92CF92DF92B7 -:101BA000EF92FF920F931F93CF938C011D990EC05C -:101BB00088EC0E94880785FF05C0C8010E94910437 -:101BC00060E201C060E088EC0E94990780918D017D -:101BD000813039F040F0823079F0833079F5C1E01E -:101BE0000CC083E106C080917004807F803131F1A8 -:101BF00081E18093700422C0C0E080917004807FF6 -:101C00008031E9F40E945605DC01CB0188539F4FD7 -:101C1000AF4FBF4F80936C0490936D04A0936E04FC -:101C2000B0936F0480E28093700480ED0E94880777 -:101C3000682F6F7D80ED0E94990701C0C0E0780198 -:101C400086E5E80EF11C6801A6E7CA0ED11C570113 -:101C5000F501819191915F01009739F0DC01ED91DF -:101C6000FC910680F781E02D0995AC14BD0481F745 -:101C700080917004803409F447C050F4803221F11F -:101C80008033A1F1813109F08EC0F60110820AC0C3 -:101C9000813509F464C0803809F476C0803509F0D4 -:101CA00082C045C0D7018D919D917D01009739F08B -:101CB000DC01ED91FC910480F581E02D0995EC1497 -:101CC000FD0481F782E16DC00E94560500916C040D -:101CD00010916D0420916E0430916F04DC01CB01F2 -:101CE000801B910BA20BB30BB7FD5DC080ED0E9472 -:101CF0008807682F606280ED0E94990761E088EE96 -:101D00000E94990780E44DC088EE0E94880780FDFC -:101D10004AC060E488EC0E94990788ED0E94880719 -:101D2000682F686088ED0E94990780E53AC088ECCA -:101D30000E94880786FF37C081E5809370040E9467 -:101D40005605DC01CB014496A11DB11D80936C04A6 -:101D500090936D04A0936E04B0936F0424C00E940E -:101D60005605C0906C04D0906D04E0906E04F09025 -:101D70006F04DC01CB018C199D09AE09BF09B7FDC9 -:101D800012C080E8809370042C2F40E060E0C8010E -:101D90000E946B0C882321F0823D29F080EA01C06B -:101DA00080E980937004CF911F910F91FF90EF9085 -:101DB000DF90CF90BF90AF90089580E0089580E0CD -:101DC000089581E00895FC018285089581E06930DD -:101DD00009F080E00895CF93DF93EC018A819B8125 -:101DE000DC01ED91FC910480F581E02D6A85099577 -:101DF0008A85813439F4EA81FB81EA58FF4F80817A -:101E00008B7F80831A861B861C861D861E861F86F6 -:101E1000188A80E0DF91CF9108958F929F92AF92C0 -:101E2000BF92CF92EF920F93A42EB12CB22A1F92A1 -:101E30001F921F921F921F921F92812C912CC12CD6 -:101E4000E62E01E023E240E0FC016285828193817D -:101E50000E94DE0A0F900F900F900F900F900F903E -:101E60000F91EF90CF90BF90AF909F908F9008957B -:101E70008F929F92AF92BF92CF92EF920F93A62E26 -:101E8000B12C1F921F923F932F935F934F934A0160 -:101E9000C12CE12C00E023EA40E0FC016285828154 -:101EA00093810E94DE0A0F900F900F900F900F9079 -:101EB0000F900F91EF90CF90BF90AF909F908F9029 -:101EC00008958F929F92AF92BF92CF92EF920F930D -:101ED000A42EB12CB22A1F921F921F921F921F9202 -:101EE0001F92812C912CC12CE62E03E023E240E0CE -:101EF000FC016285828193810E94DE0A0F900F901F -:101F00000F900F900F900F900F91EF90CF90BF9088 -:101F1000AF909F908F9008952F923F924F925F9233 -:101F20006F927F928F929F92AF92BF92CF92DF92E9 -:101F3000EF92FF920F931F93CF93DF93CDB7DEB74E -:101F4000E8970FB6F894DEBF0FBECDBFDC011A963E -:101F50003C91311107C1122F242E362E3C01FC0179 -:101F6000C280D380D601ED91FC910190F081E02DEB -:101F700060E0C60109957C01009709F4F5C0FC01F9 -:101F8000A080B180A114B10409F4F0C04301F4E0D1 -:101F90008F0E911CDC0111969C928E9214961C93CC -:101FA000FE0131962F018F0128E030E040E060E033 -:101FB000D30112968D919C9113970E94B20BF70159 -:101FC00014828111D9C08D81893009F0D1C0098175 -:101FD000D601ED91FC910280F381E02D222D41E0AC -:101FE000632DC6010995F3018287882309F4C2C0D5 -:101FF00098859583282F40E060E0828193810E943C -:10200000000C182F882389F0D701AD92BC92D6011D -:10201000ED91FC910480F581E02DD3011A966C912D -:10202000C6010995F3011286ABC0202F013208F0DA -:1020300020E2D701AD92BC9221110BC0940142E085 -:10204000F3016285828193810E942707811197C0E5 -:1020500010C030E0820140E0D3011A966C911A97CB -:1020600012968D919C9113970E94B20B811187C09B -:10207000E5CF1F921F925F924F921F9288E08F933D -:1020800088E0882E912CA12CB12C99E2C92EE12C4C -:1020900006E020EA40E0F3016285828193810E949C -:1020A000DE0A182F0F900F900F900F900F900F9047 -:1020B000811166C08B81D3011B968C931B97720193 -:1020C00000E028E030E040E01A966C911A971296F2 -:1020D0008D919C9113970E94D90B811150C02B8137 -:1020E0003C8140E0F3016285828193810E94D90B9B -:1020F000811145C0298130E0CE0181967C0140E00C -:10210000D3011A966C911A9712968D919C91139700 -:102110000E94D90B811133C02E8140E0F30162850A -:10212000828193810E946E0D811129C001E0D3014B -:102130001B968C91801740F020E0402F68E0C3018F -:102140000E94610F0F5FF3CFD3011296ED91FC91C6 -:102150001397EA58FF4F80818460808381E0509616 -:102160008C930EC019ED0CC016ED0AC017ED08C017 -:1021700011ED06C014ED04C0F701B182A082182F42 -:10218000812FE8960FB6F894DEBF0FBECDBFDF916A -:10219000CF911F910F91FF90EF90DF90CF90BF9064 -:1021A000AF909F908F907F906F905F904F903F90F7 -:1021B0002F900895CF92DF92FF920F931F93CF93AA -:1021C000DF9300D000D0CDB7DEB78C01F62E198298 -:1021D0001A821B821C8220E0462F61E10E940D0FB3 -:1021E00020E04F2D60E1C8010E940D0F20E04F2D2F -:1021F00064E0C8010E94610F83E0C82ED12C9E01CB -:102200002F5F3F4F44E050E06F2DC8010E94380F10 -:102210008823F1F020E04F2D64E1C8010E940D0FEA -:1022200020E04F2D60E1C8010E940D0F64E170E0D5 -:1022300080E090E00E9458050F900F900F900F9053 -:10224000DF91CF911F910F91FF90DF90CF90089574 -:1022500089819A81AB81BC819D7F83309140A0416F -:10226000B105C1F264E670E080E090E00E9458059C -:1022700081E0C81AD10819F6CDCFFC0187E791E0BB -:1022800091838083738362831286138614861586F6 -:1022900016861786108A148288E085839CE39683CD -:1022A00091E09783808784E0818761157105B1F0A3 -:1022B000DB01AA5ABF4F80E090E02D913D91232B86 -:1022C00049F48B96880F991FDB01A80FB91FED9376 -:1022D000FC93089501968031910579F70895EF9266 -:1022E000FF920F931F93CF938C01C62F7A01FA01AF -:1022F00080819181A281B3818130F3E09F07F1E079 -:10230000AF07B105D1F060F48115E1E09E07AE079B -:10231000B10571F181309140A140B10571F064C007 -:10232000833021E0920720E1A207B105E1F183307B -:102330009340A041B105B9F157C08091710481115A -:1023400053C020E04C2F61E1C8010E940D0F20E036 -:102350004C2F60E1C8010E940D0F20E04C2F64E07B -:10236000C8010E94610F81E08093710481EB3DC040 -:1023700020E0462F61E1C8010E940D0F20E04C2FA4 -:1023800060E1C8010E940D0F10927104F80162858E -:102390006770C770660F660F660F6C2B8281938122 -:1023A0000E94440721C020E04C2F64E1C8010E9434 -:1023B0000D0F20E04C2F60E1C8010E940D0F64E179 -:1023C00070E080E090E00E945805F8016285F70116 -:1023D00021812695217067704C2FF80182819381AD -:1023E0000E946B0C1092710480E0CF911F910F91AD -:1023F000FF90EF900895CF92DF92EF920F931F938B -:10240000CF93DF93CDB7DEB72E970FB6F894DEBF2C -:102410000FBECDBF6C0181E090E09E878D87E12CDF -:102420008E010F5F1F4F9E01235F3F4F41E0F6017A -:102430006285828193810E94930D811151C002E0D7 -:1024400011E089818023D1F019861A861B861C86AB -:102450009E01275F3F4F44E050E0612FC6010E947C -:10246000380F81110BC0AE01475F5F4F612FC6016E -:102470000E946F11813B99F1811132C0000F1F5FE3 -:102480001830F9F611E0F6018385811740F11986BD -:102490001A861B861C869E01275F3F4F44E050E052 -:1024A000612FC6010E94380F811117C089859A8556 -:1024B000877091708130914081F48B859C8581601B -:1024C0009C878B87AE01475F5F4F612FC6010E94DB -:1024D0006F11813B21F0811103C01F5FD4CF80E0D9 -:1024E0002E960FB6F894DEBF0FBECDBFDF91CF9111 -:1024F0001F910F91EF90DF90CF9008950F931F934E -:10250000CF93DF93FC012089211102C080E020C01D -:10251000EC010E9456050C851D852E853F85DC014A -:10252000CB01801B910BA20BB30BB7FDEFCFCE01FC -:102530000E94FB11182F0E945605DC01CB018C591B -:102540009F4FAF4FBF4F8C879D87AE87BF87812F2F -:10255000DF91CF911F910F91089580917E0508958D -:1025600008950895CF93DF9320919B05243049F57A -:1025700021E02093E90021E8215059F03091E80052 -:1025800035FD07C0EFE3F1E03197F1F700C000003F -:10259000F3CF2091E80025FF14C0EC0140E050E0AB -:1025A00068E070E00E94B5168091E8008E77809315 -:1025B000E80088E0FE01A6E7B5E001900D928A955B -:1025C000E1F7DF91CF910895CF93C0917404C111C9 -:1025D0000BC00E94BB05643C79408105910520F049 -:1025E00081E080937404C1E08C2FCF910895FF9215 -:1025F0000F931F93CF93DF93D82F0FB607FE83C09F -:1026000080919B05843081F08091040190E00196D7 -:102610002091060130E0822393232091050130E0D0 -:102620008217930709F0CDC00E94E412811110C0F7 -:102630008091040190E001962091060130E0822310 -:1026400093232091050130E08217930709F0B9C068 -:102650000E94AF058C01C091E900CF709091EC0011 -:10266000892F817090FD80E8C82B82E08093E9007B -:1026700085E0F82E8091EB0085FD42C08091EB0053 -:1026800080FF3EC08091EE0087FF3AC08091050137 -:1026900090910401981709F457C09091E80095FFB4 -:1026A0008EC0E0910201F0910301E80FF11D20813D -:1026B0008F5F909106018923809305012093F1009B -:1026C0008091E80085FDE2CF8091E80080FFDECFB9 -:1026D0008091E8008E778093E800F0920101D6CFD8 -:1026E0008091040190E001962091060130E0822360 -:1026F00093232091050130E08217930709F44CC021 -:10270000CF70C093E90040910401842F90E00196BE -:102710002091060130E0822393232091050130E0CF -:102720008217930709F450C0E0910201F091030170 -:10273000E40FF11DD083809104018F5F9091060119 -:1027400089238093040140C08091E80085FF37C051 -:10275000D093F10021E03091F3008091F20090E0FD -:10276000932B892B91F08091E80080FF0EC080911F -:10277000E80085FF03C01092F100F9CF8091E800D6 -:102780008E778093E800F0920101222309F4A8CF0C -:10279000CF70C093E90018C080910101882309F42B -:1027A000AFCF0E94AF059C018017910711F48901FA -:1027B00061CF90910101915090930101F8CF20E0F9 -:1027C000CACF40910401B0CF80E0DF91CF911F913B -:1027D0000F91FF900895089580919A05811104C08A -:1027E0000E941F190C947C19089510929A0508955F -:1027F000089542E061EC81E00E942E1642E261EC15 -:1028000082E00C942E1680919D05833009F453C00C -:1028100030F4813071F0823009F4BAC008958A3002 -:1028200009F4A6C08B3009F478C0893009F0C8C01B -:1028300020C080919C05813A09F0C2C08091E800D7 -:10284000877F8093E8008091A0059091A105892B56 -:1028500021F468E086E795E003C060E080E090E066 -:1028600070E00E9400178091E8008B778093E80069 -:10287000089580919C05813209F0A2C08091A00545 -:102880009091A105892B09F09BC08091E800877F7A -:102890008093E8008091E80082FD05C080919B054F -:1028A0008111F8CF8DC08091F10080937E058091D9 -:1028B000E8008B7781C080919C05813A09F080C047 -:1028C0008091A0059091A105892BA1F48091E80049 -:1028D000877F8093E8008091E80080FFFCCF8091A3 -:1028E00012018093F1008091E8008E778093E800D8 -:1028F0000E9463168091A0059091A105892B09F093 -:102900005FC08091E800877F8093E8008091E800B5 -:1029100080FFFCCF809111014AC080919C058132DB -:1029200009F04EC08091A0059091A105892B69F412 -:102930008091E800877F8093E8000E946316809171 -:102940009E05809312010E94291C8091A005909100 -:10295000A105892BA9F58091E800877F8093E80085 -:102960000E94631680919E05809311010C94291C8E -:1029700080919C05813221F58091E800877F8093CA -:10298000E8000E94631680919F0580937F0508955B -:1029900080919C05813AA1F48091E800877F809323 -:1029A000E8008091E80080FFFCCF80917F05809354 -:1029B000F1008091E8008E778093E8000C94631614 -:1029C000089580917E058093750410927E050E9483 -:1029D000381B0C94291C0C94E1140E94561E809103 -:1029E0009905882329F00E947F1E81110C941816E6 -:1029F00008950E94871E8091750480937E05089536 -:102A00000C94F9140895CF9384B7877F84BF0FB6D1 -:102A1000F894A8958091600088618093600010927E -:102A200060000FBE90E080E80FB6F89480936100DC -:102A3000909361000FBE87EF92E10E94EE1D87E048 -:102A400091E00E94B11A83E891E00E94A9010E94DE -:102A50001C050E94F91A0E941F190E947C19789483 -:102A60000E94FB1A80919B05843019F00E94021588 -:102A7000F9CF81E791E00E94A9010E9421048FE52E -:102A800091E00E94A901C2E080919B05853019F474 -:102A90000E94ED14F9CF0E94FF1A2091E4003091BA -:102AA000E50080917204909173042817390761F34F -:102AB0008091E4009091E5009093730480937204F8 -:102AC0000E94E412882301F380919B058430E1F693 -:102AD0008091E9008F702091EC00922F917020FD81 -:102AE00090E8892BC093E9009091EB0090FF43C0E0 -:102AF0009091EE0097FF3FC0909105012091040155 -:102B0000291709F12091E80025FF1DC0E09102017D -:102B1000F0910301E90FF11D30819F5F20910601C3 -:102B20009223909305013093F1009091E80095FD78 -:102B3000E3CF9091E80090FFDFCF9091E8009E777F -:102B40009093E800D9CF9091F3002091F20030E00B -:102B5000392B232B81F09091E80090FF0CC09091CD -:102B6000E80095FF03C01092F100F9CF9091E800C2 -:102B70009E779093E8008F708093E90085CF292F8E -:102B8000332723303105C9F060F42130310581F05D -:102B90002230310509F044C082E490E026ED31E0B6 -:102BA00043C021323105E1F02232310549F138C00C -:102BB00082E190E028E132E037C099278130910529 -:102BC00049F028F0029761F5EAE9F1E005C0E2ED8D -:102BD000F1E002C0E8ECF1E0849190E09F0124C0B4 -:102BE0006115710541F061307105D1F489E090E023 -:102BF00021E032E019C089E090E028EE31E014C015 -:102C00006115710541F06130710551F482E290E087 -:102C10002AE232E009C080E490E02CE432E004C013 -:102C200080E090E020E030E0FA01318320830895D5 -:102C300080E189BD82E189BD09B400FEFDCF8091AC -:102C4000D8008F7D8093D8008091E00082608093CF -:102C5000E0008091E00081FDFCCF0895982F97302F -:102C600068F59093E900981739F07091EC00209185 -:102C7000ED005091F00003C0242F762F50E021FD8D -:102C800002C09F5FECCF3091EB003E7F3093EB00B2 -:102C90003091ED003D7F3093ED003091EB003160DD -:102CA0003093EB007093EC002093ED005093F00014 -:102CB0002091EE0027FDE5CF80E008958F7080938E -:102CC000E90081E0089580919C0587FF11C0809103 -:102CD000E80082FD05C080919B058111F8CF11C0ED -:102CE0008091E8008B770BC080919B05882349F089 -:102CF0008091E80080FFF8CF8091E8008E77809384 -:102D0000E80008952091E4003091E50095E64091B7 -:102D1000EC00842F817040FF23C08091E80080FD8B -:102D20001DC080919B05882399F0853099F0809192 -:102D3000EB0085FD11C04091E4005091E50024179F -:102D4000350729F3915011F09A01E1CF84E00895FD -:102D500082E0089583E0089581E0089580E0089579 -:102D60004091E80042FFDDCF0895CF92DF92EF92CD -:102D7000FF920F931F93CF93DF93EC018B017A01A6 -:102D80000E948216811133C0E114F10439F0F70179 -:102D900080819181081B190BC80FD91FC12CD12C20 -:102DA0000115110519F18091E80085FD16C080918B -:102DB000E8008E778093E800E114F10449F0F70110 -:102DC00080819181C80ED91ED182C08285E00FC05A -:102DD0000E948216882321F30AC089918093F10012 -:102DE00001501109FFEFCF1ADF0ADACF80E0DF913F -:102DF000CF911F910F91FF90EF90DF90CF900895AA -:102E00002091A2053091A3052617370748F06115D8 -:102E1000710539F42091E8002E772093E80001C075 -:102E2000B901FC0120E06115710579F180919B05E4 -:102E30008823F1F18530F1F18091E80083FD3CC0F9 -:102E40008091E80082FD2EC08091E80080FFEBCFEA -:102E50002091F3008091F20090E0922B61157105B2 -:102E600051F08830910538F421912093F1006150A0 -:102E700071090196F3CF21E0089709F020E08091D5 -:102E8000E8008E778093E800CECF2111CFCF0AC023 -:102E900080919B05882361F0853061F08091E80086 -:102EA00083FD0AC08091E80082FFF2CF80E00895A0 -:102EB00082E0089583E0089581E008952091A205BD -:102EC0003091A3052617370748F06115710539F4CD -:102ED0002091E8002E772093E80001C0B901FC01A1 -:102EE00020E06115710591F180919B05882309F41B -:102EF00040C0853009F43FC08091E80083FD3DC0AB -:102F00008091E80082FD2FC08091E80080FFE9CF2A -:102F10002091F3008091F20090E0922B61157105F1 -:102F200059F08830910540F424912093F1003196B6 -:102F3000615071090196F2CF21E0089709F020E075 -:102F40008091E8008E778093E800CBCF2111CCCF21 -:102F50000AC080919B05882361F0853061F08091E3 -:102F6000E80083FD0AC08091E80082FFF2CF80E094 -:102F7000089582E0089583E0089581E008951F9305 -:102F8000CF93DF93CDB7DEB7AA970FB6F894DEBF25 -:102F90000FBECDBFECE9F5E08091F100819325E013 -:102FA000E43AF207C9F70E9403148091E80083FF16 -:102FB0002EC180919C0590919D05492F50E04A308B -:102FC000510508F024C1FA01EA5AFF4F0C9405217B -:102FD000803821F0823809F01AC108C08091980524 -:102FE00090919905992389F082600FC08091A00586 -:102FF0008F70873008F00BC18093E9008091EB005F -:1030000085FB882780F91092E9009091E800977F6E -:103010009093E8008093F1001092F100D1C0282F26 -:103020002D7F09F0F4C0882319F0823061F0EFC0E1 -:1030300080919E05813009F0EAC0933009F080E06C -:10304000809399052EC080919E0581112AC08091A0 -:10305000A0058F702FEF280F263008F0D8C080937E -:10306000E9002091EB0020FF1CC0933021F48091F7 -:10307000EB00806214C09091EB0090619093EB00A4 -:1030800021E030E0A90102C0440F551F8A95E2F704 -:103090004093EA001092EA008091EB0088608093F0 -:1030A000EB001092E9008091E800877F8093E800B0 -:1030B0000E946316ACC08111AAC010919E051F77B3 -:1030C0008091E3008078812B8093E3008091E80079 -:1030D000877F8093E8000E9463168091E80080FF5C -:1030E000FCCF8091E30080688093E300111102C05F -:1030F00082E001C083E080939B0589C080588230C4 -:1031000008F085C080919E0590919F058C3D53E00D -:10311000950779F583E08A838AE289834FB7F8942B -:10312000DE01139620E03EE051E2E32FF0E0509301 -:103130005700E49120FF03C0E295EF703F5FEF700E -:103140008E2F90E0EA3010F0C79601C0C0968D93A4 -:103150009D932F5F243149F74FBF8091E800877F0F -:103160008093E8006AE270E0CE0101960E940017A9 -:1031700016C06091A0057091A105AE014F5F5F4F31 -:103180000E94BF15BC01892B09F441C09091E80051 -:10319000977F9093E80089819A810E945E178091C1 -:1031A000E8008B778093E80032C0803881F5809109 -:1031B000E800877F8093E800809197058093F10075 -:1031C0008091E8008E7772CF811121C080919E0599 -:1031D00090919F0599270297D4F48091E800877F0A -:1031E0008093E80080919E05809397050E94631666 -:1031F00080919705811106C08091E30087FD02C090 -:1032000081E001C084E080939B050E94F9138091C6 -:10321000E80083FF0AC08091E800877F8093E80080 -:103220008091EB0080628093EB00AA960FB6F89431 -:10323000DEBF0FBECDBFDF91CF911F9108950E94D9 -:103240008D190E949519E0EEF0E080818160808305 -:10325000E8EDF0E080818F77808319BCA7EDB0E0C6 -:103260008C918E7F8C9380818F7E808310929A05C3 -:1032700008950F931F93CF93DF930E948D190E949F -:103280009519C8EDD0E088818F7788838881806820 -:10329000888388818F7D888319BC10929B0510924A -:1032A0009705109299051092980500EE10E0F8012C -:1032B00080818B7F808388818160888342E060E0A9 -:1032C00080E00E942E16E1EEF0E080818E7F808308 -:1032D000E2EEF0E08081816080838081886080837D -:1032E000F80180818E7F8083888180618883DF916F -:1032F000CF911F910F910895E8EDF0E080818F7ECE -:103300008083E7EDF0E080818160808384E082BF8C -:1033100081E080939A050C943919E8EDF0E0808102 -:103320008E7F80831092E20008951092DA0010924E -:10333000E10008951F920F920FB60F9211242F9360 -:103340003F934F935F936F937F938F939F93AF932D -:10335000BF93EF93FF938091E10082FF0BC08091B8 -:10336000E20082FF07C08091E1008B7F8093E10043 -:103370000E94B01A8091DA0080FF1FC08091D800AF -:1033800080FF1BC08091DA008E7F8093DA008091ED -:10339000D90080FF0DC080E189BD82E189BD09B4FB -:1033A00000FEFDCF81E080939B050E94EC1305C0D9 -:1033B00019BC10929B050E94F5138091E10080FFDB -:1033C00019C08091E20080FF15C08091E2008E7FDD -:1033D0008093E2008091E20080618093E20080911E -:1033E000D80080628093D80019BC85E080939B054B -:1033F0000E94EB148091E10084FF30C08091E200D4 -:1034000084FF2CC080E189BD82E189BD09B400FE42 -:10341000FDCF8091D8008F7D8093D8008091E1000E -:103420008F7E8093E1008091E2008F7E8093E200A6 -:103430008091E20081608093E2008091970588236B -:1034400011F084E007C08091E30087FD02C081E0B5 -:1034500001C083E080939B050E9400158091E100EC -:1034600083FF29C08091E20083FF25C08091E100A5 -:10347000877F8093E10082E080939B0510929705FF -:103480008091E1008E7F8093E1008091E2008E7F49 -:103490008093E2008091E20080618093E20042E04C -:1034A00060E080E00E942E168091F000886080939A -:1034B000F0000E94F813FF91EF91BF91AF919F919F -:1034C0008F917F916F915F914F913F912F910F90CD -:1034D0000FBE0F901F9018951F920F920FB60F926C -:1034E00011242F933F934F935F936F937F938F9309 -:1034F0009F93AF93BF93CF93DF93EF93FF93C091CD -:10350000E900CF708091EC00D82FD17080FDD0E819 -:103510001092E9008091F000877F8093F00078940A -:103520000E94BF171092E9008091F000886080939C -:10353000F000CD2BCF70C093E900FF91EF91DF91A8 -:10354000CF91BF91AF919F918F917F916F915F913B -:103550004F913F912F910F900FBE0F901F90189594 -:10356000089590938505809384050895E0918405DE -:10357000F0918505309721F00190F081E02D0994BC -:1035800080E00895E0918405F0918505309721F061 -:103590000280F381E02D09940895209182053091F5 -:1035A00083052817390771F090938305809382056E -:1035B000E0918405F0918505309721F00680F78130 -:1035C000E02D0994089520918005309181052817F8 -:1035D000390771F09093810580938005E09184050F -:1035E000F0918505309721F00084F185E02D099454 -:1035F00008950C94391B0E94A6050C942004CF93C7 -:10360000DF9300D000D01F92CDB7DEB70E94280410 -:103610008FEF89838A831B820E94AF058160782F98 -:103620009D838C8349815A816B818D810E94D91C35 -:103630000E942A040E94B61A90918605891769F0A3 -:103640000E94B61A809386050F900F900F900F90EE -:103650000F90DF91CF910C94521E0F900F900F900E -:103660000F900F90DF91CF91089508950C94351B22 -:103670000895089508950895882309F4BBC09CEF28 -:10368000980F913A18F40E945C1D0DC090E2980FBB -:10369000983058F4877091E001C0990F8A95EAF745 -:1036A000892F0E94971D0C94C81D9BE5980F93309D -:1036B00070F4853A29F0863A31F083E890E005C04D -:1036C00081E890E002C082E890E00C94CD1A98E581 -:1036D000980F973108F08EC0883A09F445C0893AAE -:1036E00009F445C08A3A09F445C08B3A09F445C04B -:1036F0008C3A09F445C08D3A09F445C08E3A09F474 -:1037000045C08F3A09F445C0813B09F445C0803B70 -:1037100009F445C0823B09F445C0833B09F445C028 -:10372000843B09F445C0853B09F445C0863B09F458 -:1037300045C0873B09F445C0883B09F445C0893B37 -:1037400009F445C08A3B09F445C08B3B09F445C0E8 -:103750008C3B09F445C08D3B09F445C08E3B09F410 -:1037600045C080E090E044C082EE90E041C089EE28 -:1037700090E03EC08AEE90E03BC085EB90E038C020 -:1037800086EB90E035C083EB90E032C084EB90E0B4 -:103790002FC087EB90E02CC08CEC90E029C08DEC22 -:1037A00090E026C083E891E023C08AE891E020C041 -:1037B00082E991E01DC084E991E01AC081E292E0C3 -:1037C00017C083E292E014C084E292E011C085E267 -:1037D00092E00EC086E292E00BC087E292E008C061 -:1037E0008AE292E005C08FE690E002C080E790E0B8 -:1037F0000C94E31A0895882329F19CEF980F913ACD -:1038000018F40E94791D0DC090E2980F983058F47A -:10381000877091E001C0990F8A95EAF7892F0E947D -:103820009D1D0C94C81D9BE5980F933020F480E0FB -:1038300090E00C94CD1A885A873120F480E090E013 -:103840000C94E31A08950E94B41D0E94891D0C94E3 -:10385000C81D0E94A41D0C94231CEF92FF920F938D -:103860001F93CF93DF9300D000D01F92CDB7DEB768 -:103870008C010E94541E811190C085E0F801DE0188 -:10388000119601900D928A95E1F7F80140815181DE -:10389000238134812115310531F05F3F31F481E01E -:1038A0004F3F19F403C081E001C080E080FD75C086 -:1038B000F801E28049835A83EB82722F3D832C8387 -:1038C0006E2D8D810E94161DF82E492F4F70892F65 -:1038D00082958F708E30B1F108F050C0823008F0C0 -:1038E0005CC0907F142F11F01295107FEE20A9F08C -:1038F000112329F0812F0E94A71D0E94C81D8F2D22 -:103900000F900F900F900F900F90DF91CF911F911C -:103910000F91FF90EF900C943C1B8F2D0E94FB1B8E -:103920001123D9F1812F0E94AD1D0F900F900F90A0 -:103930000F900F90DF91CF911F910F91FF90EF901B -:103940000C94C81DF11029C0EE2039F10E94291CE9 -:10395000FFEF20E782E0F15020408040E1F700C017 -:1039600000000F900F900F900F900F90DF91CF916C -:103970001F910F91FF90EF900C94B41E6F2DC80112 -:103980000F900F900F900F900F90DF91CF911F919C -:103990000F91FF90EF900C94D31E0F900F900F900B -:1039A0000F900F90DF91CF911F910F91FF90EF90AB -:1039B0000895CF93DF93CDB7DEB72A970FB6F8946B -:1039C000DEBF0FBECDBF942F4E83252F5F83688748 -:1039D00079878A8749855A85452B31F02F3F31F405 -:1039E00081E09F3F19F403C081E001C080E080FDC9 -:1039F00007C04E815F81688579858A850E94431E54 -:103A000085E0FE013696DE01119601900D928A95B1 -:103A1000E1F7CE0101960E942D1C2A960FB6F8946C -:103A2000DEBF0FBECDBFDF91CF9108950F931F93DF -:103A3000CF93DF9300D000D01F92CDB7DEB7042F15 -:103A400049835A836B837C838D832C813D81232B17 -:103A500031F05F3F31F481E04F3F19F403C081E062 -:103A600001C080E080FF03C080E090E01BC08B813C -:103A700010E0882379F06091870570918805809126 -:103A8000890590918A050E94F31DF801E957FA4FC4 -:103A9000808304C0F801E957FA4F808169817A81F7 -:103AA0000E94E31E0F900F900F900F900F90DF91E8 -:103AB000CF911F910F91089520911301309114011E -:103AC000F90132969FEF40E05191851789F09F3FB1 -:103AD00019F4511101C0942F4F5F4630A9F79F3F51 -:103AE00039F0F901E90FF11D97FDFA9582830895E8 -:103AF0000895E0911301F09114019F012A5F3F4F57 -:103B00009281891301C012823196E217F307C1F73F -:103B1000089581E090E0E0911301F0911401E80F25 -:103B2000F91F1082019688309105A9F708959091A8 -:103B30009505892B8093950508958095909195051D -:103B40008923809395050895109295050895909185 -:103B50009405892B80939405089580959091940500 -:103B60008923809394050895109294050895809177 -:103B7000130190911401FC0131969C01285F3F4F85 -:103B800080E0919191118F5FE217F307D1F70895CB -:103B9000E0911301F0911401809195058083E091EB -:103BA0001301F0911401908180919405892B8083F9 -:103BB00080918B05882361F0E0911301F09114014D -:103BC0009081892B80830E94B71D811110928B05F3 -:103BD00080911301909114010C94C21A90938B015F -:103BE00080938A010895CF92DF92EF92FF926C0149 -:103BF000EE24FF24C114D104E104F10421F0C70133 -:103C0000B60120E101C020E0C72ED82EE92EFF2406 -:103C1000C114D104E104F10419F0285FC701B60111 -:103C20006B017C0154E0F694E794D794C7945A95BD -:103C3000D1F7C114D104E104F10419F02C5FC701DC -:103C4000B6016B017C0142E0F694E794D794C794E7 -:103C50004A95D1F7C114D104E104F10419F02E5FA3 -:103C6000C701B601DC01CB01B695A795979587955D -:103C7000892B8A2B8B2B09F02F5F822FFF90EF90DF -:103C8000DF90CF900895CF93DF9300D000D01F92A4 -:103C9000CDB7DEB70F900F900F900F900F90DF9180 -:103CA000CF9108950C94361B80E0089580919B0578 -:103CB000843021F11092960520E488E190E00FB65F -:103CC000F894A895809360000FBE2093600083B79E -:103CD000817F846083BF83B7816083BF7894889538 -:103CE00083B78E7F83BF0FB6F894A895809160004C -:103CF000886180936000109260000FBE08950E945A -:103D00003A1B0E9428040E943B1B80E008950E94F9 -:103D1000381B0C94291C1F920F920FB60F9211247E -:103D20008F939F93AF93BF9380919605811113C09A -:103D30008091680490916904A0916A04B0916B0429 -:103D40004196A11DB11D8093680490936904A093CE -:103D50006A04B0936B04BF91AF919F918F910F90C4 -:103D60000FBE0F901F9018950E941F19F89487E7B7 -:103D700097E7909301088093000887E090EBDC01BF -:103D80008093A4059093A505A093A605B093A705DD -:103D90009CE088E10FB6F894A895809360000FBE70 -:103DA00090936000FFCF0895E62FF0E0E15AFE4FB8 -:103DB00084910895E82FF0E0EE0FFF1FE352F040EA -:103DC0008591949108950E94D41E90E4980F9032AA -:103DD00018F40E94DA1E08958F3B50F4883A48F593 -:103DE000853AD0F48430A8F4813009F4B2C0AEC072 -:103DF000883E40F4803E68F48F3B09F0A7C020E085 -:103E000030EEA9C0803F08F4A1C0282F30E0306513 -:103E1000A2C0282F30E09FC0853A29F0863A31F0C1 -:103E200023E830E498C021E830E495C022E830E48B -:103E300092C0883A09F445C0893A09F445C08A3AE3 -:103E400009F445C08B3A09F445C08C3A09F445C0E1 -:103E50008D3A09F445C08E3A09F445C08F3A09F409 -:103E600045C0813B09F445C0803B09F445C0823B15 -:103E700009F445C0833B09F445C0843B09F445C0BF -:103E8000853B09F445C0863B09F445C0873B09F4EE -:103E900045C0883B09F445C0893B09F445C08A3BCD -:103EA00009F445C08B3B09F445C08C3B09F445C07F -:103EB0008D3B09F445C08E3B09F445C020E034E455 -:103EC0004AC022EE34E447C029EE34E444C02AEE6E -:103ED00034E441C025EB34E43EC026EB34E43BC07F -:103EE00023EB34E438C024EB34E435C027EB34E46E -:103EF00032C02CEC34E42FC02DEC34E42CC023E889 -:103F000035E429C02AE835E426C022E935E423C097 -:103F100024E935E420C021E236E41DC023E236E482 -:103F20001AC024E236E417C025E236E414C026E2C3 -:103F300036E411C027E236E40EC02AE236E40BC0B4 -:103F40002FE634E408C020E734E405C020E030E088 -:103F500002C021E030E0C90108950E941E2008F44B -:103F600081E008950E94722088F09F5798F0B92F41 -:103F70009927B751B0F0E1F0660F771F881F991F9E -:103F80001AF0BA95C9F714C0B13091F00E948C2094 -:103F9000B1E008950C948C20672F782F8827B85FA4 -:103FA00039F0B93FCCF3869577956795B395D9F7F6 -:103FB0003EF490958095709561957F4F8F4F9F4F00 -:103FC0000895E89409C097FB3EF49095809570950C -:103FD00061957F4F8F4F9F4F9923A9F0F92F96E955 -:103FE000BB279395F695879577956795B795F111CA -:103FF000F8CFFAF4BB0F11F460FF1BC06F5F7F4F67 -:104000008F4F9F4F16C0882311F096E911C0772378 -:1040100021F09EE8872F762F05C0662371F096E881 -:10402000862F70E060E02AF09A95660F771F881F50 -:10403000DAF7880F9695879597F90895990F0008F4 -:10404000550FAA0BE0E8FEEF16161706E807F9076A -:10405000C0F012161306E407F50798F0621B730B05 -:10406000840B950B39F40A2661F0232B242B252B86 -:1040700021F408950A2609F4A140A6958FEF811D29 -:10408000811D089597F99F6780E870E060E00895CA -:104090009FEF80EC089500240A9416161706180660 -:1040A0000906089500240A9412161306140605063C -:1040B0000895092E0394000C11F4882352F0BB0FCD -:1040C00040F4BF2B11F460FF04C06F5F7F4F8F4F30 -:1040D0009F4F089557FD9058440F551F59F05F3F6B -:1040E00071F04795880F97FB991F61F09F3F79F01A -:1040F00087950895121613061406551FF2CF46959C -:10410000F1DF08C0161617061806991FF1CF86951D -:104110007105610508940895E894BB276627772701 -:10412000CB0197F908950E941E2008F48FEF08959F -:104130000E94AB200C9459200E944B2038F00E9422 -:10414000522020F0952311F00C9442200C9448202A -:1041500011240C948D200E946A2070F3959FC1F366 -:10416000950F50E0551F629FF001729FBB27F00D25 -:10417000B11D639FAA27F00DB11DAA1F649F66277A -:10418000B00DA11D661F829F2227B00DA11D621FC9 -:10419000739FB00DA11D621F839FA00D611D221F83 -:1041A000749F3327A00D611D231F849F600D211D67 -:1041B000822F762F6A2F11249F5750409AF0F1F0EA -:1041C00088234AF0EE0FFF1FBB1F661F771F881F53 -:1041D00091505040A9F79E3F510580F00C94422029 -:1041E0000C948D205F3FE4F3983ED4F38695779549 -:1041F0006795B795F795E7959F5FC1F7FE2B880FF9 -:10420000911D9695879597F90895EE0FFF1F0590DC -:0A421000F491E02D0994F894FFCF1B -:10421A00010576040000FFAD12B212B012EB13B121 -:10422A001201018C05556E6B6E6F776E20484944FA -:10423A00204465736320547970653A00556E6B6E3D -:10424A006F776E204465736320547970653A002055 -:10425A006C656E00696456656E646F7200696450BD -:10426A00726F64756374000000000034053A05300B -:10427A000533052A052D052D05000000005506FC0D -:10428A0005B506000000008C0FDD0EEB0E7E12E372 -:0A429A000EDA10DF0EE60EE10E0052 +:1000D000000D0A2F2F2050617273652064617461D6 +:1000E00020686572653A20687474703A2F2F656CC9 +:1000F000656363656C657261746F722E636F6D2FDB +:100100007573626465736372657170617273657231 +:100110002F0D0A000D0A2F2F204465766963652094 +:1001200044657363726970746F723A0D0A000D0A48 +:100130002F2F206953657269616C4E756D6265720F +:100140003A20000D0A2F2F206950726F6475637476 +:100150003A20000D0A2F2F20694D616E756661638C +:1001600074757265723A20000D0A2F2F2053747235 +:10017000696E67303A0D0A002F2F206C6F7773700D +:100180006565643A253032580D0A000D0A2F2F207C +:10019000416464726573733A253032580D0A000D5C +:1001A0000A2F2F2069436F6E6669677572617469E3 +:1001B0006F6E3A20000D0A2F2F20436F6E6669671D +:1001C00025643A000D0A2F2F205265706F72742536 +:1001D000643A206C656E3A253034580D0A000D0AD9 +:1001E0002F2F2069496E746572666163653A20003D +:1001F0000D0A00537472696E6725643A20000D0A77 +:10020000002530325820002F2F20000D0A0020003A +:100210000D0A4552524F523A253032580D0A0025E8 +:10022000733A253034580D0A0025733A2530325878 +:100230000D0A0000000A4B6579626F6172642073D9 +:10024000746172742E0A000A55534220636F6E6601 +:100250006967757265642E0A000A0A544D4B3A3676 +:10026000396236346462642B2F4C5546410A0A00C9 +:100270002C03550053004200200044006500730029 +:10028000630072006900700074006F00720020004B +:10029000440075006D0070006500720000000803E6 +:1002A00054004D004B000000040309040902420001 +:1002B000020100A03209040000010301010009212C +:1002C000110100012240000705810308000A09040A +:1002D0000100020300000009211101000122220097 +:1002E0000705820320000107050203200001120117 +:1002F000100100000008EDFE5B001408010200017F +:100300000631FF0974A1010975150026FF0095202B +:10031000750881020976150026FF00952075089161 +:1003200002C005010906A101050719E029E715002A +:10033000250195087501810295017508810105085F +:100340001901290595057501910295017503910122 +:100350000507190029FF150026FF0095067508817D +:1003600000C0B206D30611241FBECFEFDAE0DEBF15 +:10037000CDBF04B603FE28C080910206909103060B +:10038000A0910406B09105068730904BA740B04B72 +:10039000D9F41092020610920306109204061092ED +:1003A000050614BE0FB6F894A89580916000886188 +:1003B00080936000109260000FBE109201081092AE +:1003C0000008E0E0F8E3099511E0A0E0B1E0E0EF1B +:1003D000F5E402C005900D92A63AB107D9F726E0E0 +:1003E000A6EAB1E001C01D92A230B207E1F711E028 +:1003F000C3EBD1E004C02197FE010E94F022C13B73 +:10040000D107C9F70E94EE160C94F6220C94000056 +:10041000FF93EF93E091A601F091A701309709F0C7 +:100420000995EF91FF910895FC018591803011F0BD +:10043000EFDFFBCF0895FF27E0E230E247FF0CC07B +:10044000419597FF09C0EDE2609570958095909574 +:10045000611D711D811D911D27FF02C0219530E393 +:1004600050E2AA27660F771F881F991FAA1FA4179B +:1004700010F0A41B63955A95A9F7AA3008F0A95F5C +:10048000A05DAF93F395611571058105910541F765 +:10049000ED3211F4EF93F395F21718F43F93F395BF +:1004A000FBCF8F91B5DFFA95E1F70895E991F991C6 +:1004B0008591803021F0853219F0AADFF9CF0895B7 +:1004C00020E0E89455915532C1F3503311F468940B +:1004D00055915A3348F4505390F3220F022E220FB5 +:1004E000220F200D250FF4CF0EF4219589919991BB +:1004F000533619F3533729F1533559F1BC01882785 +:100500009927E8945C3621F48991999168945591E2 +:10051000543639F446EF7EF077FF0DC08FEF9FEF32 +:100520000AC055374AE039F0583540E121F05236DB +:1005300042E009F00895FF93EF937DDFEF91FF9183 +:10054000B7CFFF93EF93FC0181918030B9F360DF67 +:10055000FBCFFF93EF9368DFF1CFDF93CF93CDB75E +:10056000DEB72596A3DFCF91DF9108951F926F9399 +:100570009F938F9389E292E09F938F930E94AD02A5 +:100580000F900F900F900F900F900F9008957F9302 +:100590006F939F938F938FE192E09F938F930E942D +:1005A000AD020F900F900F900F900F900F90089545 +:1005B0001F928F9380E192E09F938F930E94AD02F0 +:1005C0000F900F900F900F900895BF92CF92DF92EF +:1005D000EF92FF920F931F93CF93DF936C01B42E92 +:1005E0008B01C0E0D0E081E0E82E82E0F82ECC154F +:1005F000DD051CF5CE018F709927892B19F08EE04F +:1006000092E00AC0209721F08BE092E00E94140251 +:10061000BB2021F087E092E00E941402F801819152 +:100620008F011F928F93FF92EF920E94AD0221964D +:100630000F900F900F900F90DACF8EEF91E0DF9137 +:10064000CF911F910F91FF90EF90DF90CF90BF90CF +:100650000C9414028F929F92AF92BF92CF92DF922E +:10066000EF92FF920F931F93CF93DF93662309F4CA +:1006700076C04A01162F5C019EEAC92E91E0D92E60 +:100680007A01062F21E030E040E0F50162818FEF32 +:1006900093E00E94D70D811116C0C091AE01C13404 +:1006A00008F0C0E4D0E08EEAC82E81E0D82E7401B4 +:1006B000012F9E0140E0F50162818FEF93E00E94DF +:1006C000D70D882389F0682F85E191E0DF91CF91E4 +:1006D0001F910F91FF90EF90DF90CF90BF90AF9060 +:1006E0009F908F900C94B6021F921F9383EF91E01E +:1006F0009F938F930E94AD020F900F900F900F90D9 +:1007000012E0812F90E09C012F5F3F4F2C173D0797 +:1007100074F4F901E255FE4F2081211106C0FC015D +:10072000E255FE4F80810E9408021E5FEACF80EFF3 +:1007300091E00E9414028091AE0141E06EEA71E006 +:1007400090E0DF91CF911F910F91FF90EF90DF909C +:10075000CF90BF90AF909F908F900C94E502DF9167 +:10076000CF911F910F91FF90EF90DF90CF90BF90AE +:10077000AF909F908F9008958F929F92AF92BF926B +:10078000CF92EF920F93CF93DF93EA011F921F92C4 +:100790002EEE31E03F932F9321E02F931F924A01D9 +:1007A0005B0122E2C22EE12C06E021E840E0FC01E0 +:1007B00062818FEF93E00E94A90C40E06EEE71E041 +:1007C000CE010E94E5020F900F900F900F900F90B6 +:1007D0000F9080E0DF91CF910F91EF90CF90BF907D +:1007E000AF909F908F9008958F929F92AF92BF92FB +:1007F000CF92DF92EF92FF921F93CF93DF936C0122 +:10080000EA0110E0CB0182519D4F7C0184ECA82EBF +:1008100081E0B82ECE15DF0508F052C06981643042 +:1008200051F018F46130C8F147C0653009F444C094 +:10083000613291F032C01A8188858823E9F18EED0A +:1008400091E00E9414024091AC015091AD01688585 +:10085000C6010E942A0330C088858F938F818F93B1 +:10086000812E912C1F921F93BF92AF920E94AD02D6 +:100870006E810F900F900F900F900F900F9062323B +:1008800039F44F815885B401C6010E94BC0314C0DD +:100890008BE191E00E94B6020FC085E391E0DF9109 +:1008A000CF911F91FF90EF90DF90CF90BF90AF90CE +:1008B0009F908F900C94B6028881C80FD11DAACF4B +:1008C000DF91CF911F91FF90EF90DF90CF90BF907D +:1008D000AF909F908F9008956F927F928F929F928A +:1008E000AF92BF92CF92DF92EF92FF920F931F933E +:1008F000CF93DF935C01862E912CC0E0D0E025EBF6 +:10090000622E21E0722E1C2F8C169D0609F456C013 +:10091000DF93CF937F926F920E94AD029EEEE92EFD +:1009200092E0F92E0C2F29E030E040E0F5016281E1 +:100930008FEF93E00E94B00D0F900F900F900F90EB +:1009400081113DC0C090F002D090F102B6018BE45D +:1009500091E00E94C7029601F1E0CF16DF0610F089 +:1009600020E031E08EEEE82E82E0F82E012F40E00C +:10097000F50162818FEF93E00E94B00D81111FC0DD +:1009800040E0B701C6010E94E5028091F40288238D +:1009900069F08FE991E00E9414024091AC015091FE +:1009A000AD016091F402C5010E942A034EEE52E0AF +:1009B000B601C5010E94F4032196A5CF80E0DF9126 +:1009C000CF911F910F91FF90EF90DF90CF90BF904C +:1009D000AF909F908F907F906F900895CF92DF920D +:1009E000EF92FF920F931F93CF93DF93EC018A81D5 +:1009F0001F928F938BE891E09F938F930E94AD029B +:100A00008C811F928F9388E791E09F938F930E9430 +:100A1000AD020EEE12E022E130E040E06A818FEF9D +:100A200093E00E94890D2DB73EB7285F3F4F0FB668 +:100A3000F8943EBF0FBE2DBF81110E94D802609175 +:100A4000F6027091F70280E591E00E94C702609182 +:100A5000F8027091F9028CE591E00E94C702809142 +:100A6000FC02811108C08091FD02811104C08091B7 +:100A7000FE028823C9F18EEAC82E81E0D82EE12C2F +:100A8000F12C00E024E030E040E06A818FEF93E059 +:100A90000E94D70D811117C06091B0017091B10112 +:100AA0007093AD016093AC0189E691E00E94C702AA +:100AB00088E691E00E9414028091AE0141E0B60107 +:100AC00090E00E94E5028091FC02882369F083E5B2 +:100AD00091E00E9414024091AC015091AD016091EF +:100AE000FC02CE010E942A038091FD02882369F056 +:100AF00083E491E00E9414024091AC015091AD0159 +:100B00006091FD02CE010E942A038091FE0288239B +:100B100069F08EE291E00E9414024091AC01509184 +:100B2000AD016091FE02CE010E942A0384E191E0B2 +:100B30000E94140240E06EEE72E082E190E00E94BA +:100B4000E5026091FF02CE010E946C0481110E94B7 +:100B5000D802E091FF03F09100040480F581E02DBC +:100B60006A818FEF93E0099581ED90E0DF91CF915D +:100B70001F910F91FF90EF90DF90CF900C94140293 +:100B800008950E9441079093AB018093AA010895B4 +:100B900081E00895CF93DF938FEF93E00E94CB0F16 +:100BA0008FEF93E00E9499089091A8018917C9F0EE +:100BB0008FEF93E00E9499088093A8011F928F9372 +:100BC00080EC90E09F938F930E94AD020F900F9066 +:100BD0000F900F9080910001811103C081E08093FC +:100BE00000018091AA019091AB010E945907883BB6 +:100BF0009B40C8F08FEF93E00E949908803999F4E8 +:100C000080910001882379F0CAE0D4E08A818823AA +:100C100019F0CE010E94EE04259684E0C535D80770 +:100C2000A9F710920001DF91CF9108952E9A0895AF +:100C30002E988EBD0DB407FEFDCF1EBC0DB407FE71 +:100C4000FDCF0E9416068EB508952E9882608EBD47 +:100C50000DB407FEFDCF6EBD0DB407FEFDCF0C94A5 +:100C6000160688EF0E941806807C8034A1F018F4E4 +:100C7000882301F10895803819F0803CB9F0089577 +:100C800088ED0E94180681FD0BC069EC88ED0E947A +:100C9000250682E00CC088ED0E94180681FDF5CF84 +:100CA0006BEC88ED0E94250683E001C081E0809313 +:100CB000A901089561ED88ED0E9425061092A90111 +:100CC00008950F931F93CF93DF938C01269A0E9470 +:100CD0001606219A229A2398209A80E58CBD81E0FD +:100CE0008DBD259868E188E80E94250660E288E7C6 +:100CF0000E94250660E088E70E942506C0E0D0E05B +:100D000088E60E941806219680FD06C0CF3F8FEF2F +:100D1000D807B1F78FEF1DC061EC88ED0E94250662 +:100D200060E680ED0E94250664E088EE0E942506BC +:100D300088EE0E94180682FFFBCFC8010E94310690 +:100D400060E288EC0E94250661E080E80E942506AA +:100D500080E0DF91CF911F910F9108958FEF93E085 +:100D60000C9461068FEF93E00E9469086FEF73E0C7 +:100D70008EEE93E00C94281380E090E008958FEFBE +:100D80009FEF089581E090E008950895862F0E94D6 +:100D9000E21481E090E00895FB0180810E94E2145A +:100DA00081E090E00895E6E7F4E01382128288EE95 +:100DB00093E0A0E0B0E084839583A683B78387E7C0 +:100DC00091E0918380838FEF9FEF958784870895CB +:100DD0000C944D078F929F92AF92BF92CF92DF9269 +:100DE000EF92FF920E94CC214B015C0120E030E0A9 +:100DF0004AE755E40E9483226B017C0120E030E049 +:100E000040E85FE30E94982187FD24C020E03FEF87 +:100E10004FE757E4C701B6010E947E221816ACF4D2 +:100E200020E030E040E251E4C501B4010E94832299 +:100E30000E949D2120E931E06115710581F0C90111 +:100E40000197F1F761507109F7CFC701B6010E9410 +:100E50009D2102C061E070E0CB010197F1F7FF90A6 +:100E6000EF90DF90CF90BF90AF909F908F900895BC +:100E700082E084BD93E095BD9AEF97BD80936E00AC +:100E800008952FB7F8948091C6049091C704A0915B +:100E9000C804B091C9042FBF08952FB7F89460918A +:100EA000C6047091C7048091C8049091C9042FBFF3 +:100EB00008959C014FB7F8948091C6049091C7049F +:100EC000A091C804B091C9044FBF821B930B089531 +:100ED00078941F920F920FB60F9211248F939F93C5 +:100EE000AF93BF938091C6049091C704A091C804AA +:100EF000B091C9040196A11DB11D8093C6049093C1 +:100F0000C704A093C804B093C904BF91AF919F9147 +:100F10008F910F900FBE0F901F901895CF93DF9376 +:100F2000FC01862F8078A9F4283008F04DC04423B6 +:100F300021F09581973009F447C0EF01A1E0B0E0BE +:100F40009D85992341F011962596A031B105C1F7F1 +:100F50003BC080E039C061111CC085E08A9FE00180 +:100F60008B9FD00D1124CE0FDF1F442331F081E47D +:100F7000888785818F5F858302C081E0888725E02F +:100F80002A9FC0012B9F900D1124E80FF91F808527 +:100F90001BC06770660F660F660F442341F06064E4 +:100FA00085818F5F85838770687F682B03C027707A +:100FB000687B622B25E02A9FC0012B9F900D112496 +:100FC000E80FF91F6087862FDF91CF910895611197 +:100FD00002C006960895FC0121E03585631739F0BB +:100FE0002F5F35962031C9F780E090E0089506968E +:100FF00035E0239F800D911D11240895DF92EF921B +:10100000FF920F931F93CF93DF93EC01E62EF12C09 +:1010100085E0689FB0011124FE01E60FF71F80856F +:10102000182F177086FF17C001E085E0D82EFE014B +:10103000D09EE00DF11D11248085869586958695BC +:1010400087701817F9F00F5F003189F78D818113D0 +:1010500002C011501D8385E08E9DF0018F9DF00D23 +:101060001124EC0FFD1F108681E0818712862296E5 +:10107000D783C683DF91CF911F910F91FF90EF909F +:10108000DF900895602FCE010E94FE07D0CFFC01B3 +:10109000613499F49C01255B3F4F61E0AC014E5FE8 +:1010A0005F4F158666871786548743873596E21704 +:1010B000F307B9F7FC011582089521E03585631720 +:1010C00029F02F5F35962031C9F70895622F0C94CF +:1010D000FE07FC0189E891E09183808315821086E8 +:1010E00081E081871286CF010296978386831282E0 +:1010F00028E023832CE32483DF019F01255B3F4FFE +:1011000041E01D961C921D971E964C931E971F96AC +:101110001C921F971C969C938E931B971596A21753 +:10112000B30779F7EA58FF4F108281E18093CE042C +:1011300008958091CE040895CF93C42F0E94E707AD +:10114000009789F0DC01ED91FC911197309759F0EF +:1011500013969C9180E0891731F020812C1731F093 +:1011600033968F5FF8CF80E090E001C0CF01CF9140 +:1011700008950F931F93CF93DF932115310571F0DD +:10118000E901042F162F0E94E707FC01892B41F08B +:101190001283D183C083038380E003C088ED01C044 +:1011A00086EDDF91CF911F910F910895CF92DF923D +:1011B000FF920F931F93CF93DF93662381F1F62E57 +:1011C0008C016C0186E5C80ED11CC0E0D0E0D601D0 +:1011D0008D919D916D010097F1F0DC01ED91FC91F5 +:1011E0000084F185E02D0995F81215C0AB96CC0F5F +:1011F000DD1FC00FD11F88819981DC01ED91FC9129 +:101200000480F581E02DDF91CF911F910F91FF9028 +:10121000DF90CF9009942196C031D105C1F680E0CE +:10122000DF91CF911F910F91FF90DF90CF900895A4 +:101230002E980895CF93C82F0E941809CEBD0DB4E3 +:1012400007FEFDCF1EBC0DB407FEFDCF0E941606A3 +:101250008EB5CF910895CF93DF93C82FD62F0E94DC +:101260001809C260CEBD0DB407FEFDCFDEBD0DB4C2 +:1012700007FEFDCFDF91CF910C9416068F929F92BF +:10128000AF92BF92CF92DF92EF92FF920F931F9394 +:10129000CF93DF93EC01D62EC42E59010E94E707AD +:1012A0007C01009709F445C0FC0180819181892B64 +:1012B00009F441C04C2D6D2DCE010E949C08F50112 +:1012C000918380830097C9F1FC0182818695869580 +:1012D00090E08031910514F08FE090E041E050E023 +:1012E00060E070E04A015B0104C0880C991CAA1CF4 +:1012F000BB1C8A95D2F7D501C4010197F8019183EF +:1013000080836D2D80EE0E942B0988ED0E941A09C2 +:10131000F7019481992331F0CA58DF4F68816260E8 +:10132000682B02C0682F697F88ED0E942B0980E03E +:1013300005C086ED03C087ED01C08BEDDF91CF9135 +:101340001F910F91FF90EF90DF90CF90BF90AF90E3 +:101350009F908F9008958F929F92AF92BF92CF925D +:10136000DF92EF92FF920F931F93CF93DF93862E1E +:10137000942E59010E94E8066B017C0128E8C20EF8 +:1013800023E1D21EE11CF11C00E010E0D0E0C0E03F +:1013900098280E94E806DC01CB018C199D09AE0952 +:1013A000BF09B7FF2DC0692D80EF0E942B090E9455 +:1013B000E806DC01CB018C199D09AE09BF09B7FF16 +:1013C00009C088EC0E941A0987FFF1CF60E888EC19 +:1013D0000E942B0988EF0E941A09C82FCF70C430D1 +:1013E00019F0CE3051F00CC00F5F1F4FA114B104A3 +:1013F00081F20A151B0569F603C0DF5FD33049F699 +:101400008C2FDF91CF911F910F91FF90EF90DF9084 +:10141000CF90BF90AF909F908F9008959F92AF9282 +:10142000BF92CF92DF92EF92FF920F931F93CF93D1 +:10143000DF937C01D42F122F902E00E06C01C60E9A +:10144000D11CC60ED11C86E5C80ED11CA42EB12C11 +:10145000ABE2AA0EB11CAA0CBB1CAE0CBF1CF60161 +:1014600080819181DC01ED91FC910280F381E02D7E +:10147000292D412F6D2F0995803EC9F4D1110BC044 +:1014800061E088EE0E942B0966E670E080E090E063 +:101490000E94EA0614C0F50180819181DC01ED9182 +:1014A000FC910284F385E02D612F099508C08D30F1 +:1014B00021F4033008F03FC014C081113FC0F60191 +:1014C00080819181DC01ED91FC910190F081E02D12 +:1014D000292D412F6D2F0995C82F8D3051F40330E0 +:1014E00050F464E670E080E090E00E94EA060F5F4E +:1014F000B6CF882311F1D1110BC061E088EE0E94B4 +:101500002B0966E670E080E090E00E94EA0611C0D8 +:10151000ED2FF0E0BB96EE0FFF1FEE0DFF1D80815B +:101520009181DC01ED91FC910284F385E02D612F26 +:1015300009958C2F03C08DE001C080E0DF91CF9131 +:101540001F910F91FF90EF90DF90CF90BF90AF90E1 +:101550009F9008950F931F93CF93DF93182F062F1B +:10156000EA010E94180912601EBDFE01802F882327 +:1015700039F00DB407FEFDCF91919EBD8150F7CF9C +:10158000C00FD11D0DB407FEFDCF0E941606CE017F +:10159000DF91CF911F910F9108952F923F924F921B +:1015A0005F926F927F928F929F92AF92BF92CF92F3 +:1015B000DF92EF92FF920F931F93CF93DF9300D0B0 +:1015C00000D01F92CDB7DEB77D836C834A016901DD +:1015D000FB01F1808FEF8F0D803408F067C00E940F +:1015E000E8062B013C01F8E84F0EF3E15F1E611C99 +:1015F000711CEC81FD81828180FD02C060E401C02C +:1016000060E888EE0E942B09312C8F2D90E09A83A0 +:101610008983C114D104B1F1E980FA80CE14DF04CA +:1016200008F47601EB82A8016E2D80E10E94AA0ADF +:101630006E2D88E30E942B09EC81FD816081606240 +:1016400080EF0E942B0988EC0E941A0987FFFBCFCC +:1016500060E888EC0E942B0988EF0E941A098F70BD +:10166000382EA12CB12C212C332009F472C00E94F9 +:10167000E806DC01CB0184199509A609B709B7FF73 +:1016800068C016C0332021F060E088E30E942B0977 +:1016900088EF0E941A0985FB882780F9EC81FD817B +:1016A000928180FB90F99283832D58C08AED56C0B9 +:1016B000F6E03F1239C088EF0E941A0985FB88279F +:1016C00080F991E08927EC81FD81928180FB90F97E +:1016D000928390FD02C060E401C060E888EE0E9441 +:1016E0002B0960E088E30E942B09F801608180E10A +:1016F0000E942B096B8188E30E942B09EC81FD81FC +:101700006081606280EF0E942B0988EC0E941A09B8 +:1017100087FFFBCF60E888EC0E942B0988EF0E94CE +:101720001A098F70382EA0CF2EE0321205C02394F4 +:1017300023E02212D6CFA8CF84E03812A5CFFFEF46 +:10174000AF1ABF0A8114910461F2A814B90449F6D2 +:101750009BCFCE18DF080E0D1F1D5BCF0F900F9093 +:101760000F900F900F90DF91CF911F910F91FF90ED +:10177000EF90DF90CF90BF90AF909F908F907F9031 +:101780006F905F904F903F902F9008952F923F92CF +:101790004F925F926F927F928F929F92AF92BF9281 +:1017A000CF92DF92EF92FF920F931F93CF93DF932D +:1017B000CDB7DEB72A970FB6F894DEBF0FBECDBF08 +:1017C0001C016B015B834A835901D9016D907C90A8 +:1017D0001197FB01F181F9831D921C92DB01129696 +:1017E0008C9181FD02C060E101C060E288EE0E9440 +:1017F0002B098E2D90E0A0E0B0E08C839D83AE831A +:10180000BF8368862A813B81D6014C9160E0C1018B +:101810000E94AB09F82EB6E08B1318C088EF0E9427 +:101820001A0982958170E1E08E27D60112969C916B +:10183000129780FB91F912969C9391FD02C060E192 +:1018400001C060E288EE0E942B09DCCF811167C0E5 +:1018500088EC0E941A0982FF60C080E30E941A0986 +:10186000582E90E06816790608F45884F5018081B6 +:1018700091819301281B390B3A87298737FF02C0D2 +:101880001A861986852C912C89859A858816990641 +:1018900014F49A86898649840E94180998E09EBDAE +:1018A0000DB407FEFDCFF801442041F01EBC4A9460 +:1018B0000DB407FEFDCF8EB58193F6CFA985BA850D +:1018C0000A0F1B1F0E94160664E088EC0E942B0979 +:1018D000F50180819181880E991E91828082F98123 +:1018E0005F1618F08614970470F088EF0E941A09AA +:1018F00082958170D60112969C91129780FB91F986 +:1019000012969C930CC0EE2009F47CCF6C817D81F3 +:101910008E819F810E94EA0675CF80EFF82E8F2D71 +:101920002A960FB6F894DEBF0FBECDBFDF91CF91E0 +:101930001F910F91FF90EF90DF90CF90BF90AF90ED +:101940009F908F907F906F905F904F903F902F90DF +:1019500008952F923F924F925F926F927F928F9253 +:101960009F92AF92BF92CF92DF92EF92FF920F932E +:101970001F93CF93DF93CDB7DEB761970FB6F8947F +:10198000DEBF0FBECDBF3C01F42E322E202EC98A01 +:101990004EA05FA0C8A4D9A4188A1F861E861D86E3 +:1019A0008E01035F1F4F9E01215F3F4F0E943E0942 +:1019B000811196C039822A82EB8289898C83BE820A +:1019C000AD8298868F82AE014F5F5F4F68E080E204 +:1019D0000E94AA0A2D853E854F2D60E1C3010E9419 +:1019E000AB09E82E811178C0932D9078392EC1145F +:1019F000D10409F462C0EF85F8898281992309F442 +:101A00004DC082608283540122242394A114B10426 +:101A100009F458C05C864B864D855E856F85788954 +:101A2000E12C86019E01255F3F4FC3010E94C60B3A +:101A3000E82EA6E08A130FC00F85188988EF0E9450 +:101A40001A0985FB882780F98225F801928180FB9D +:101A500091F99283DBCF81113FC08AA59BA50097A6 +:101A6000A1F0DC01ED91FC9111970190F081E02D46 +:101A7000C4018A199B099A8789876B857C859E0199 +:101A8000275F3F4FA601CD0109958B859C85A81A3C +:101A9000B90A8415950508F0B9CF0FC0816082831B +:101AA0004D855E8586019201BF01C3010E94CD0A6A +:101AB000811116C02D853E8511C02D853E853110C2 +:101AC00005C00CC0E11008C02D853E8560EA4F2D91 +:101AD000C3010E94AB0904C08E2D02C060E8F7CF9D +:101AE00061960FB6F894DEBF0FBECDBFDF91CF91E8 +:101AF0001F910F91FF90EF90DF90CF90BF90AF902C +:101B00009F908F907F906F905F904F903F902F901D +:101B100008958F929F92AF92BF92CF92EF920F93C0 +:101B20001F931F921F921F930F933F932F9349016F +:101B3000A12CB12CCC24C394E12C06E020E80E9417 +:101B4000A90C0F900F900F900F900F900F901F9176 +:101B50000F91EF90CF90BF90AF909F908F9008958E +:101B60008F929F92AF92BF92CF92EF92FF920F937C +:101B70001F921F92FF92EF923F932F934901A12C46 +:101B8000B12C22E0C22EE02E06E020E80E94A90C33 +:101B90000F900F900F900F900F900F900F91FF905C +:101BA000EF90CF90BF90AF909F908F9008958F92BD +:101BB0009F92AF92BF92CF92DF92EF92FF920F93DC +:101BC0001F921F92DF92CF923F932F9349015701AB +:101BD00023E0C22EE02E06E020E80E94A90C0F9020 +:101BE0000F900F900F900F900F900F91FF90EF902C +:101BF000DF90CF90BF90AF909F908F9008958F927D +:101C00009F92AF92BF92CF92EF920F93CF931F927A +:101C10001F921F921F921F921F92812C912CA12C18 +:101C2000B12CC12CE22E05E020E00E94A90CC82FA7 +:101C30006CE271E080E090E00E94EA060F900F9065 +:101C40000F900F900F900F908C2FCF910F91EF90DE +:101C5000CF90BF90AF909F908F9008950F931F9358 +:101C6000CF93DF938A3F3FEF930711F486ED2DC0AA +:101C7000DC011696ED91FC911797EF2B09F1122FCD +:101C8000242FEC011A8740E00E948E07082F88233A +:101C9000C9F0682FCE010E94E707009739F3FC01D5 +:101CA0001483202F40E060E0CE010E94FF0D182F2A +:101CB000882351F0602FCE010E944708812F05C074 +:101CC00087ED03C084ED01C080E0DF91CF911F91CB +:101CD0000F9108952F923F924F925F926F927F9251 +:101CE0008F929F92AF92BF92CF92DF92EF92FF922C +:101CF0000F931F93CF93DF93CDB7DEB766970FB6E1 +:101D0000F894DEBF0FBECDBF1B8A38E03C8B3CE3AE +:101D10003D8B8A3F3FEF930709F464C0522E342E67 +:101D2000462E7C01DC011696CD90DC901797CE01F3 +:101D3000439617969C938E9316971A962C938E0122 +:101D40000F5F1F4F22E130E040E060E0C7010E94DA +:101D5000890DF701D782C6828111A6C089849A8431 +:101D60006B847C84FD81FE8B2E80670136E5C30E7B +:101D7000D11C560110E0D5018D919C910097F1F195 +:101D8000DC01ED91FC910084F185E02D0995811134 +:101D900035C0F50180819181DC01ED91FC910088D5 +:101DA000F189E02D622D0995882341F1F5018081AB +:101DB0009181DC01ED91FC910484F585E02DA30176 +:101DC000B4010995811110C0F50180819181DC0178 +:101DD000ED91FC910684F785E02D6E8909958111BE +:101DE00003C00CC086ED60C0052D232D442D612F4E +:101DF000C7010E940E0A813D09F056C01F5FB2E084 +:101E0000AB0EB11C103109F0B6CF10E0F6018081A5 +:101E100091810097E1F1DC01ED91FC910084F18565 +:101E2000E02D0995811133C0F60180819181DC019B +:101E3000ED91FC910088F189E02D622D09958823B0 +:101E4000D9F0F60180819181DC01ED91FC9104844F +:101E5000F585E02DA301B4010995811118C0F601A3 +:101E600080819181DC01ED91FC910684F785E02D64 +:101E70006E89099581110BC0052D232D442D612FED +:101E8000C7010E940E0A982F977F913D69F41F5F4A +:101E9000E2E0CE0ED11C103109F0B8CF252D432D34 +:101EA000642DC7010E942E0E66960FB6F894DEBF11 +:101EB0000FBECDBFDF91CF911F910F91FF90EF909B +:101EC000DF90CF90BF90AF909F908F907F906F905A +:101ED0005F904F903F902F9008958F929F92AF9276 +:101EE000BF92CF92EF920F931F921F921F921F9259 +:101EF0001F921F92812C912CA12CB12CC12CE22E6F +:101F000009E020E00E94A90C0F900F900F900F9015 +:101F10000F900F900F91EF90CF90BF90AF909F9048 +:101F20008F9008958F929F92AF92BF92CF92DF923F +:101F3000EF920F931F93CF93DF9300D000D0CDB7D4 +:101F4000DEB76C01590148011C821B821A8219827A +:101F50008E010F5F1F4F9E012D5F3F4F0E943E0974 +:101F6000811109C049815A816B817C81840195016D +:101F7000C6010E94C60B0F900F900F900F90DF913B +:101F8000CF911F910F91EF90DF90CF90BF90AF90C6 +:101F90009F908F900895AF92BF92CF92DF92EF9271 +:101FA000FF920F931F93CF938C011D990EC088EC65 +:101FB0000E941A0985FF05C0C8010E94310660E22F +:101FC00001C060E088EC0E942B098091A90181305A +:101FD00039F040F0823079F0833039F5C1E00CC03F +:101FE00083E106C08091CE04807F8031F1F081E1F1 +:101FF0008093CE041AC0C0E08091CE04807F8031EF +:10200000A9F40E94E806DC01CB0188539F4FAF4F33 +:10201000BF4F8093CA049093CB04A093CC04B09399 +:10202000CD0480E28093CE0401C0C0E0780186E553 +:10203000E80EF11C6801A6E7CA0ED11C5701F50194 +:10204000819191915F01009739F0DC01ED91FC9154 +:102050000680F781E02D0995AC14BD0481F78091CD +:10206000CE04803409F43FC050F4803221F1803333 +:10207000A1F1813109F082C0F60110820AC08135D8 +:1020800009F458C0803809F46AC0803509F076C078 +:1020900039C0D7018D919D917D01009739F0DC0108 +:1020A000ED91FC910480F581E02D0995EC14FD047F +:1020B00081F782E161C00E94E8060091CA04109194 +:1020C000CB042091CC043091CD04DC01CB01801BEA +:1020D000910BA20BB30BB7FD51C061E088EE0E94DB +:1020E0002B0980E449C088EE0E941A0980FD46C091 +:1020F00088ED0E941A09682F686088ED0E942B09FC +:1021000080E53AC088EC0E941A0986FF37C081E555 +:102110008093CE040E94E806DC01CB014496A11D09 +:10212000B11D8093CA049093CB04A093CC04B093C8 +:10213000CD0424C00E94E806C090CA04D090CB040D +:10214000E090CC04F090CD04DC01CB018C199D090A +:10215000AE09BF09B7FD12C080E88093CE042C2FD2 +:1021600040E060E0C8010E946A0E882321F0823DB1 +:1021700029F080EA01C080E98093CE04CF911F91BD +:102180000F91FF90EF90DF90CF90BF90AF900895A8 +:1021900080E0089580E0089581E00895FC01828543 +:1021A000089581E0693009F080E00895CF93DF93CE +:1021B000EC018A819B81DC01ED91FC910480F58129 +:1021C000E02D6A8509958A85813439F4EA81FB819D +:1021D000EA58FF4F8081846080831A861B861C86A4 +:1021E0001D861E861F86188A80E0DF91CF91089594 +:1021F0008F929F92AF92BF92CF92EF920F93A42EA5 +:10220000B12CB22A1F921F921F921F921F921F92EF +:10221000812C912CC12CE62E01E023E240E0FC0150 +:102220006285828193810E94A90C0F900F900F907C +:102230000F900F900F900F91EF90CF90BF90AF90B5 +:102240009F908F9008958F929F92AF92BF92CF925E +:10225000EF920F93A62EB12C1F921F923F932F93B4 +:102260005F934F934A01C12CE12C00E023EA40E048 +:10227000FC016285828193810E94A90C0F900F90CE +:102280000F900F900F900F900F91EF90CF90BF9005 +:10229000AF909F908F9008958F929F92AF92BF9230 +:1022A000CF92EF920F93A42EB12CB22A1F921F92BD +:1022B0001F921F921F921F92812C912CC12CE62EEF +:1022C00003E023E240E0FC016285828193810E9469 +:1022D000A90C0F900F900F900F900F900F900F91EF +:1022E000EF90CF90BF90AF909F908F9008952F92D6 +:1022F0003F924F925F926F927F928F929F92AF9296 +:10230000BF92CF92DF92EF92FF920F931F93CF93E2 +:10231000DF93CDB7DEB7E8970FB6F894DEBF0FBEF8 +:10232000CDBFDC011A963C91311107C1122F242E2A +:10233000362E3C01FC01C280D380D601ED91FC9188 +:102340000190F081E02D60E0C60109957C010097C5 +:1023500009F4F5C0FC01A080B180A114B10409F416 +:10236000F0C04301F4E08F0E911CDC0111969C92A9 +:102370008E9214961C93FE0131962F018F0128E056 +:1023800030E040E060E0D30112968D919C9113976C +:102390000E94890DF70114828111D9C08D81893085 +:1023A00009F0D1C00981D601ED91FC910280F38141 +:1023B000E02D222D41E0632DC6010995F3018287AE +:1023C000882309F4C2C098859583282F40E060E0F7 +:1023D000828193810E94FF0D182F882389F0D701F5 +:1023E000AD92BC92D601ED91FC910480F581E02D77 +:1023F000D3011A966C91C6010995F3011286ABC000 +:10240000202F013208F020E2D701AD92BC922111B9 +:102410000BC0940142E0F3016285828193810E94A6 +:10242000B908811197C010C030E0820140E0D301AB +:102430001A966C911A9712968D919C9113970E94FF +:10244000890D811187C0E5CF1F921F925F924F9235 +:102450001F9288E08F9388E0882E912CA12CB12CBC +:1024600099E2C92EE12C06E020EA40E0F301628502 +:10247000828193810E94A90C182F0F900F900F90CA +:102480000F900F900F90811166C08B81D3011B9626 +:102490008C931B97720100E028E030E040E01A9630 +:1024A0006C911A9712968D919C9113970E94B00D82 +:1024B000811150C02B813C8140E0F3016285828113 +:1024C00093810E94B00D811145C0298130E0CE0179 +:1024D00081967C0140E0D3011A966C911A9712966E +:1024E0008D919C9113970E94B00D811133C02E8164 +:1024F00040E0F3016285828193810E946D0F81111A +:1025000029C001E0D3011B968C91801740F020E098 +:10251000402F68E0C3010E944C110F5FF3CFD3013D +:102520001296ED91FC911397EA58FF4F80818460D9 +:10253000808381E050968C930EC019ED0CC016ED8F +:102540000AC017ED08C011ED06C014ED04C0F70174 +:10255000B182A082182F812FE8960FB6F894DEBFC3 +:102560000FBECDBFDF91CF911F910F91FF90EF90E4 +:10257000DF90CF90BF90AF909F908F907F906F90A3 +:102580005F904F903F902F900895CF92DF92FF92EF +:102590000F931F93CF93DF9300D000D0CDB7DEB75A +:1025A0008C01F62E19821A821B821C8220E0462F93 +:1025B00061E10E94F81020E04F2D60E1C8010E9407 +:1025C000F81020E04F2D64E0C8010E944C1183E018 +:1025D000C82ED12C9E012F5F3F4F44E050E06F2D5D +:1025E000C8010E9423118823F1F020E04F2D64E1FF +:1025F000C8010E94F81020E04F2D60E1C8010E9440 +:10260000F81064E170E080E090E00E94EA060F902C +:102610000F900F900F90DF91CF911F910F91FF902E +:10262000DF90CF90089589819A81AB81BC819D7F95 +:1026300083309140A041B105C1F264E670E080E0D2 +:1026400090E00E94EA0681E0C81AD10819F6CDCFC1 +:10265000FC0183E991E09183808373836283128616 +:1026600013861486158616861786108A148288E0CB +:1026700085839CE3968391E09783808784E08187BC +:1026800061157105B1F0DB01AA5ABF4F80E090E0FF +:102690002D913D91232B49F48B96880F991FDB01D7 +:1026A000A80FB91FED93FC93089501968031910511 +:1026B00079F70895EF92FF920F931F93CF938C01B8 +:1026C000C62F7A01FA0180819181A281B381813084 +:1026D000F3E09F07F1E0AF07B105D1F060F4811599 +:1026E000E1E09E07AE07B10571F181309140A14054 +:1026F000B10571F064C0833021E0920720E1A207A8 +:10270000B105E1F183309340A041B105B9F157C063 +:102710008091CF04811153C020E04C2F61E1C801AA +:102720000E94F81020E04C2F60E1C8010E94F810D0 +:1027300020E04C2F64E0C8010E944C1181E080939E +:10274000CF0481EB3DC020E0462F61E1C8010E942B +:10275000F81020E04C2F60E1C8010E94F8101092A0 +:10276000CF04F80162856770C770660F660F660F49 +:102770006C2B828193810E94D60821C020E04C2FCF +:1027800064E1C8010E94F81020E04C2F60E1C8010C +:102790000E94F81064E170E080E090E00E94EA0698 +:1027A000F8016285F70121812695217067704C2F11 +:1027B000F801828193810E946A0E1092CF0480E01A +:1027C000CF911F910F91FF90EF900895CF92DF92DC +:1027D000EF920F931F93CF93DF93CDB7DEB72E9772 +:1027E0000FB6F894DEBF0FBECDBF6C0181E090E064 +:1027F0009E878D87E12C8E010F5F1F4F9E01235F07 +:102800003F4F41E0F6016285828193810E94920FE1 +:10281000811151C002E011E089818023D1F0198635 +:102820001A861B861C869E01275F3F4F44E050E0BE +:10283000612FC6010E94231181110BC0AE01475FB9 +:102840005F4F612FC6010E945A13813B99F181119C +:1028500032C0000F1F5F1830F9F611E0F6018385D2 +:10286000811740F119861A861B861C869E01275FF8 +:102870003F4F44E050E0612FC6010E9423118111B7 +:1028800017C089859A85877091708130914081F455 +:102890008B859C8581609C878B87AE01475F5F4FEE +:1028A000612FC6010E945A13813B21F0811103C0A0 +:1028B0001F5FD4CF80E02E960FB6F894DEBF0FBE18 +:1028C000CDBFDF91CF911F910F91EF90DF90CF900F +:1028D00008950F931F93CF93DF93FC01208921115B +:1028E00002C080E020C0EC010E94E8060C851D8536 +:1028F0002E853F85DC01CB01801B910BA20BB30B16 +:10290000B7FDEFCFCE010E94E613182F0E94E80614 +:10291000DC01CB018C599F4FAF4FBF4F8C879D87F8 +:10292000AE87BF87812FDF91CF911F910F910895BF +:102930008091DC05089508950895CF93DF93209149 +:10294000F905243049F521E02093E90021E82150E0 +:1029500059F03091E80035FD07C0EFE3F1E0319721 +:10296000F1F700C00000F3CF2091E80025FF14C06C +:10297000EC0140E050E068E070E00E94A018809117 +:10298000E8008E778093E80088E0FE01A4EDB5E0D2 +:1029900001900D928A95E1F7DF91CF910895CF9341 +:1029A000C091D204C1110BC00E944D07643C794014 +:1029B0008105910520F081E08093D204C1E08C2F45 +:1029C000CF910895FF920F931F93CF93DF93D82F4A +:1029D0000FB607FE83C08091F905843081F08091A5 +:1029E000040190E001962091060130E082239323B8 +:1029F0002091050130E08217930709F0CDC00E94B5 +:102A0000CF14811110C08091040190E001962091B3 +:102A1000060130E0822393232091050130E08217E4 +:102A2000930709F0B9C00E9441078C01C091E900E9 +:102A3000CF709091EC00892F817090FD80E8C82BB9 +:102A400082E08093E90085E0F82E8091EB0085FD1F +:102A500042C08091EB0080FF3EC08091EE0087FF76 +:102A60003AC08091050190910401981709F457C06C +:102A70009091E80095FF8EC0E0910201F091030172 +:102A8000E80FF11D20818F5F9091060189238093CB +:102A900005012093F1008091E80085FDE2CF80914F +:102AA000E80080FFDECF8091E8008E778093E80019 +:102AB000F0920101D6CF8091040190E0019620911F +:102AC000060130E0822393232091050130E0821734 +:102AD000930709F44CC0CF70C093E9004091040102 +:102AE000842F90E001962091060130E08223932309 +:102AF0002091050130E08217930709F450C0E0915E +:102B00000201F0910301E40FF11DD08380910401D3 +:102B10008F5F9091060189238093040140C08091CA +:102B2000E80085FF37C0D093F10021E03091F30039 +:102B30008091F20090E0932B892B91F08091E80036 +:102B400080FF0EC08091E80085FF03C01092F10065 +:102B5000F9CF8091E8008E778093E800F092010130 +:102B6000222309F4A8CFCF70C093E90018C0809148 +:102B70000101882309F4AFCF0E9441079C0180170F +:102B8000910711F4890161CF9091010191509093C7 +:102B90000101F8CF20E0CACF40910401B0CF80E01E +:102BA000DF91CF911F910F91FF900895089580912B +:102BB000F805811104C00E940A1B0C94671B08953C +:102BC0001092F8050895089542E061EC81E00E94BA +:102BD000191842E261EC82E00C9419188091FB050F +:102BE000833009F453C030F4813071F0823009F43D +:102BF000BAC008958A3009F4A6C08B3009F478C0B1 +:102C0000893009F0C8C020C08091FA05813A09F0E6 +:102C1000C2C08091E800877F8093E8008091FE0524 +:102C20009091FF05892B21F468E084ED95E003C0C5 +:102C300060E080E090E070E00E94EB188091E80096 +:102C40008B778093E80008958091FA05813209F02E +:102C5000A2C08091FE059091FF05892B09F09BC0D1 +:102C60008091E800877F8093E8008091E80082FDF2 +:102C700005C08091F9058111F8CF8DC08091F100D8 +:102C80008093DC058091E8008B7781C08091FA0504 +:102C9000813A09F080C08091FE059091FF05892B53 +:102CA000A1F48091E800877F8093E8008091E8009C +:102CB00080FFFCCF809112018093F1008091E800A9 +:102CC0008E778093E8000E944E188091FE059091C7 +:102CD000FF05892B09F05FC08091E800877F809312 +:102CE000E8008091E80080FFFCCF809111014AC08C +:102CF0008091FA05813209F04EC08091FE059091D5 +:102D0000FF05892B69F48091E800877F8093E800B4 +:102D10000E944E188091FC05809312010E94141E9F +:102D20008091FE059091FF05892BA9F58091E8001F +:102D3000877F8093E8000E944E188091FC05809365 +:102D400011010C94141E8091FA05813221F58091B5 +:102D5000E800877F8093E8000E944E188091FD056F +:102D60008093DD0508958091FA05813AA1F4809160 +:102D7000E800877F8093E8008091E80080FFFCCF27 +:102D80008091DD058093F1008091E8008E7780933B +:102D9000E8000C944E1808958091DC058093D304CC +:102DA0001092DC050E94231D0C94141E0C94CC166A +:102DB0000E9441208091F705882329F00E946A2013 +:102DC00081110C94031808950E9472208091D304FD +:102DD0008093DC0508950C94E4160895CF9384B78E +:102DE000877F84BF0FB6F894A895809160008861B2 +:102DF00080936000109260000FBE90E080E80FB6F4 +:102E0000F89480936100909361000FBE82EE94E18C +:102E10000E94D91F87E091E00E949C1C89E592E006 +:102E20000E9414020E94AE060E94E41C0E940A1B2B +:102E30000E94671B78940E94E61C8091F9058430FB +:102E400019F00E94ED16F9CF87E492E00E94140277 +:102E50000E94C10585E392E00E941402C2E08091C5 +:102E6000F905853019F40E94D816F9CF0E94EA1CA2 +:102E70002091E4003091E5008091D0049091D1043C +:102E80002817390761F38091E4009091E500909351 +:102E9000D1048093D0040E94CF14882301F3809141 +:102EA000F9058430E1F68091E9008F702091EC0003 +:102EB000922F917020FD90E8892BC093E9009091AA +:102EC000EB0090FF43C09091EE0097FF3FC09091C0 +:102ED000050120910401291709F12091E80025FF3F +:102EE0001DC0E0910201F0910301E90FF11D308155 +:102EF0009F5F209106019223909305013093F1008A +:102F00009091E80095FDE3CF9091E80090FFDFCF2E +:102F10009091E8009E779093E800D9CF9091F300CC +:102F20002091F20030E0392B232B81F09091E800C2 +:102F300090FF0CC09091E80095FF03C01092F10043 +:102F4000F9CF9091E8009E779093E8008F7080937E +:102F5000E90085CF292F332723303105C9F060F4EC +:102F60002130310581F02230310509F044C082E47E +:102F700090E02CEA32E043C021323105E1F0223208 +:102F8000310549F138C082E190E02EEE32E037C0E1 +:102F900099278130910549F028F0029761F5E0E723 +:102FA000F2E005C0E8EAF2E002C0EEE9F2E0849166 +:102FB00090E09F0124C06115710541F061307105F9 +:102FC000D1F489E090E027ED32E019C089E090E08B +:102FD0002EEB32E014C06115710541F061307105CE +:102FE00051F482E290E020E033E009C080E490E018 +:102FF00022E233E004C080E090E020E030E0FA011B +:1030000031832083089580E189BD82E189BD09B4BF +:1030100000FEFDCF8091D8008F7D8093D8008091F5 +:10302000E00082608093E0008091E00081FDFCCFB1 +:103030000895982F973068F59093E900981739F024 +:103040007091EC002091ED005091F00003C0242F0E +:10305000762F50E021FD02C09F5FECCF3091EB0056 +:103060003E7F3093EB003091ED003D7F3093ED00DB +:103070003091EB0031603093EB007093EC002093C3 +:10308000ED005093F0002091EE0027FDE5CF80E0A9 +:1030900008958F708093E90081E008958091FA058A +:1030A00087FF11C08091E80082FD05C08091F9057D +:1030B0008111F8CF11C08091E8008B770BC080910F +:1030C000F905882349F08091E80080FFF8CF8091CE +:1030D000E8008E778093E80008952091E400309115 +:1030E000E50095E64091EC00842F817040FF23C0FD +:1030F0008091E80080FD1DC08091F905882399F03A +:10310000853099F08091EB0085FD11C04091E4007D +:103110005091E5002417350729F3915011F09A01D9 +:10312000E1CF84E0089582E0089583E0089581E08E +:10313000089580E008954091E80042FFDDCF0895B2 +:10314000CF92DF92EF92FF920F931F93CF93DF9373 +:10315000EC018B017A010E946D18811133C0E114DA +:10316000F10439F0F70180819181081B190BC80F18 +:10317000D91FC12CD12C0115110519F18091E8003E +:1031800085FD16C08091E8008E778093E800E114F9 +:10319000F10449F0F70180819181C80ED91ED182D6 +:1031A000C08285E00FC00E946D18882321F30AC0F9 +:1031B00089918093F10001501109FFEFCF1ADF0AC6 +:1031C000DACF80E0DF91CF911F910F91FF90EF90C8 +:1031D000DF90CF90089520910006309101062617C8 +:1031E000370748F06115710539F42091E8002E7712 +:1031F0002093E80001C0B901FC0120E061157105D0 +:1032000079F18091F9058823F1F18530F1F1809110 +:10321000E80083FD3CC08091E80082FD2EC08091D3 +:10322000E80080FFEBCF2091F3008091F20090E066 +:10323000922B6115710551F08830910538F4219178 +:103240002093F100615071090196F3CF21E00897B6 +:1032500009F020E08091E8008E778093E800CECFDF +:103260002111CFCF0AC08091F905882361F0853004 +:1032700061F08091E80083FD0AC08091E80082FF40 +:10328000F2CF80E0089582E0089583E0089581E020 +:10329000089520910006309101062617370748F05F +:1032A0006115710539F42091E8002E772093E8002C +:1032B00001C0B901FC0120E06115710591F1809117 +:1032C000F905882309F440C0853009F43FC0809196 +:1032D000E80083FD3DC08091E80082FD2FC0809111 +:1032E000E80080FFE9CF2091F3008091F20090E0A8 +:1032F000922B6115710559F08830910540F42491A5 +:103300002093F1003196615071090196F2CF21E0CE +:10331000089709F020E08091E8008E778093E8001C +:10332000CBCF2111CCCF0AC08091F905882361F061 +:10333000853061F08091E80083FD0AC08091E8004B +:1033400082FFF2CF80E0089582E0089583E008953F +:1033500081E008951F93CF93DF93CDB7DEB7AA978F +:103360000FB6F894DEBF0FBECDBFEAEFF5E0809157 +:10337000F100819326E0E230F207C9F70E94EE15D2 +:103380008091E80083FF2EC18091FA059091FB05A2 +:10339000492F50E04A30510508F024C1FA01EA5A99 +:1033A000FF4F0C94F022803821F0823809F01AC1C6 +:1033B00008C08091F6059091F705992389F0826005 +:1033C0000FC08091FE058F70873008F00BC180938D +:1033D000E9008091EB0085FB882780F91092E900D5 +:1033E0009091E800977F9093E8008093F10010920D +:1033F000F100D1C0282F2D7F09F0F4C0882319F0E7 +:10340000823061F0EFC08091FC05813009F0EAC0A4 +:10341000933009F080E08093F7052EC08091FC0581 +:1034200081112AC08091FE058F702FEF280F263062 +:1034300008F0D8C08093E9002091EB0020FF1CC069 +:10344000933021F48091EB00806214C09091EB00E6 +:1034500090619093EB0021E030E0A90102C0440F9D +:10346000551F8A95E2F74093EA001092EA00809196 +:10347000EB0088608093EB001092E9008091E800F7 +:10348000877F8093E8000E944E18ACC08111AAC0CB +:103490001091FC051F778091E3008078812B809349 +:1034A000E3008091E800877F8093E8000E944E1837 +:1034B0008091E80080FFFCCF8091E30080688093DA +:1034C000E300111102C082E001C083E08093F9059E +:1034D00089C08058823008F085C08091FC059091A9 +:1034E000FD058C3D53E0950779F583E08A838AE2F8 +:1034F00089834FB7F894DE01139620E03EE051E255 +:10350000E32FF0E050935700E49120FF03C0E295D1 +:10351000EF703F5FEF708E2F90E0EA3010F0C796AB +:1035200001C0C0968D939D932F5F243149F74FBF03 +:103530008091E800877F8093E8006AE270E0CE0126 +:1035400001960E94EB1816C06091FE057091FF0570 +:10355000AE014F5F5F4F0E94AA17BC01892B09F48F +:1035600041C09091E800977F9093E80089819A810B +:103570000E9449198091E8008B778093E80032C05F +:10358000803881F58091E800877F8093E800809102 +:10359000F5058093F1008091E8008E7772CF81115C +:1035A00021C08091FC059091FD0599270297D4F4E4 +:1035B0008091E800877F8093E8008091FC058093EC +:1035C000F5050E944E188091F505811106C0809185 +:1035D000E30087FD02C081E001C084E08093F9052B +:1035E0000E94E4158091E80083FF0AC08091E80002 +:1035F000877F8093E8008091EB0080628093EB00EE +:10360000AA960FB6F894DEBF0FBECDBFDF91CF9163 +:103610001F9108950E94781B0E94801BE0EEF0E04D +:10362000808181608083E8EDF0E080818F77808306 +:1036300019BCA7EDB0E08C918E7F8C9380818F7E3A +:1036400080831092F80508950F931F93CF93DF9313 +:103650000E94781B0E94801BC8EDD0E088818F7784 +:10366000888388818068888388818F7D888319BC5E +:103670001092F9051092F5051092F7051092F605D3 +:1036800000EE10E0F80180818B7F8083888181606B +:10369000888342E060E080E00E941918E1EEF0E0EB +:1036A00080818E7F8083E2EEF0E080818160808384 +:1036B000808188608083F80180818E7F808388810B +:1036C00080618883DF91CF911F910F910895E8ED7C +:1036D000F0E080818F7E8083E7EDF0E08081816083 +:1036E000808384E082BF81E08093F8050C94241BE2 +:1036F000E8EDF0E080818E7F80831092E2000895F3 +:103700001092DA001092E10008951F920F920FB606 +:103710000F9211242F933F934F935F936F937F9357 +:103720008F939F93AF93BF93EF93FF938091E100AB +:1037300082FF0BC08091E20082FF07C08091E10010 +:103740008B7F8093E1000E949B1C8091DA0080FFB8 +:103750001FC08091D80080FF1BC08091DA008E7F4F +:103760008093DA008091D90080FF0DC080E189BD8F +:1037700082E189BD09B400FEFDCF81E08093F905A7 +:103780000E94D71505C019BC1092F9050E94E015DA +:103790008091E10080FF19C08091E20080FF15C098 +:1037A0008091E2008E7F8093E2008091E200806150 +:1037B0008093E2008091D80080628093D80019BC89 +:1037C00085E08093F9050E94D6168091E10084FF80 +:1037D00030C08091E20084FF2CC080E189BD82E18D +:1037E00089BD09B400FEFDCF8091D8008F7D809304 +:1037F000D8008091E1008F7E8093E1008091E2000B +:103800008F7E8093E2008091E20081608093E200ED +:103810008091F505882311F084E007C08091E300D2 +:1038200087FD02C081E001C083E08093F9050E941A +:10383000EB168091E10083FF29C08091E20083FFB5 +:1038400025C08091E100877F8093E10082E0809332 +:10385000F9051092F5058091E1008E7F8093E100DB +:103860008091E2008E7F8093E2008091E20080618F +:103870008093E20042E060E080E00E9419188091AD +:10388000F00088608093F0000E94E315FF91EF91B3 +:10389000BF91AF919F918F917F916F915F914F9168 +:1038A0003F912F910F900FBE0F901F9018951F9270 +:1038B0000F920FB60F9211242F933F934F935F9364 +:1038C0006F937F938F939F93AF93BF93CF93DF9328 +:1038D000EF93FF93C091E900CF708091EC00D82F57 +:1038E000D17080FDD0E81092E9008091F000877FD0 +:1038F0008093F00078940E94AA191092E9008091B8 +:10390000F00088608093F000CD2BCF70C093E90069 +:10391000FF91EF91DF91CF91BF91AF919F918F91E7 +:103920007F916F915F914F913F912F910F900FBEBB +:103930000F901F90189508959093E3058093E205EA +:103940000895E091E205F091E305309721F00190B0 +:10395000F081E02D099480E00895E091E205F09176 +:10396000E305309721F00280F381E02D099408955A +:103970002091E0053091E1052817390771F0909307 +:10398000E1058093E005E091E205F091E3053097D1 +:1039900021F00680F781E02D099408952091DE053D +:1039A0003091DF052817390771F09093DF05809378 +:1039B000DE05E091E205F091E305309721F0008407 +:1039C000F185E02D099408950C94241D0E94380778 +:1039D0000C94C005CF93DF9300D000D01F92CDB7D9 +:1039E000DEB70E94C8058FEF89838A831B820E94FD +:1039F00041078160782F9D838C8349815A816B8137 +:103A00008D810E94C41E0E94CA050E94A11C909133 +:103A1000E405891769F00E94A11C8093E4050F90CA +:103A20000F900F900F900F90DF91CF910C943D204D +:103A30000F900F900F900F900F90DF91CF910895FE +:103A400008950C94201D08950895089508958823DD +:103A500009F4BBC09CEF980F913A18F40E94471FDD +:103A60000DC090E2980F983058F4877091E001C033 +:103A7000990F8A95EAF7892F0E94821F0C94B31F31 +:103A80009BE5980F933070F4853A29F0863A31F02F +:103A900083E890E005C081E890E002C082E890E011 +:103AA0000C94B81C98E5980F973108F08EC0883AAE +:103AB00009F445C0893A09F445C08A3A09F445C079 +:103AC0008B3A09F445C08C3A09F445C08D3A09F4A3 +:103AD00045C08E3A09F445C08F3A09F445C0813B90 +:103AE00009F445C0803B09F445C0823B09F445C058 +:103AF000833B09F445C0843B09F445C0853B09F488 +:103B000045C0863B09F445C0873B09F445C0883B66 +:103B100009F445C0893B09F445C08A3B09F445C016 +:103B20008B3B09F445C08C3B09F445C08D3B09F43F +:103B300045C08E3B09F445C080E090E044C082EE71 +:103B400090E041C089EE90E03EC08AEE90E03BC03C +:103B500085EB90E038C086EB90E035C083EB90E0D9 +:103B600032C084EB90E02FC087EB90E02CC08CEC4F +:103B700090E029C08DEC90E026C083E891E023C05E +:103B80008AE891E020C082E991E01DC084E991E0DB +:103B90001AC081E292E017C083E292E014C084E28E +:103BA00092E011C085E292E00EC086E292E00BC086 +:103BB00087E292E008C08AE292E005C08FE690E0DA +:103BC00002C080E790E00C94CE1C0895882329F170 +:103BD0009CEF980F913A18F40E94641F0DC090E278 +:103BE000980F983058F4877091E001C0990F8A952A +:103BF000EAF7892F0E94881F0C94B31F9BE5980F4A +:103C0000933020F480E090E00C94B81C885A8731FF +:103C100020F480E090E00C94CE1C08950E949F1F39 +:103C20000E94741F0C94B31F0E948F1F0C940E1ED1 +:103C3000EF92FF920F931F93CF93DF9300D000D0AA +:103C40001F92CDB7DEB78C010E943F20811190C03A +:103C500085E0F801DE01119601900D928A95E1F759 +:103C6000F80140815181238134812115310531F0E2 +:103C70005F3F31F481E04F3F19F403C081E001C0A0 +:103C800080E080FD75C0F801E28049835A83EB82B1 +:103C9000722F3D832C836E2D8D810E94011FF82E83 +:103CA000492F4F70892F82958F708E30B1F108F0B7 +:103CB00050C0823008F05CC0907F142F11F0129534 +:103CC000107FEE20A9F0112329F0812F0E94921F6E +:103CD0000E94B31F8F2D0F900F900F900F900F9099 +:103CE000DF91CF911F910F91FF90EF900C94271DC2 +:103CF0008F2D0E94E61D1123D9F1812F0E94981F5C +:103D00000F900F900F900F900F90DF91CF911F9118 +:103D10000F91FF90EF900C94B31FF11029C0EE208B +:103D200039F10E94141EFFEF20E782E0F15020409D +:103D30008040E1F700C000000F900F900F900F90AF +:103D40000F90DF91CF911F910F91FF90EF900C9406 +:103D50009F206F2DC8010F900F900F900F900F9024 +:103D6000DF91CF911F910F91FF90EF900C94BE20A7 +:103D70000F900F900F900F900F90DF91CF911F91A8 +:103D80000F91FF90EF900895CF93DF93CDB7DEB7FB +:103D90002A970FB6F894DEBF0FBECDBF942F4E8387 +:103DA000252F5F83688779878A8749855A85452BC0 +:103DB00031F02F3F31F481E09F3F19F403C081E0DF +:103DC00001C080E080FD07C04E815F8168857985F4 +:103DD0008A850E942E2085E0FE013696DE0111962E +:103DE00001900D928A95E1F7CE0101960E94181E6E +:103DF0002A960FB6F894DEBF0FBECDBFDF91CF91EC +:103E000008950F931F93CF93DF9300D000D01F929C +:103E1000CDB7DEB7042F49835A836B837C838D83B0 +:103E20002C813D81232B31F05F3F31F481E04F3F06 +:103E300019F403C081E001C080E080FF03C080E08E +:103E400090E01BC08B8110E0882379F06091E5053C +:103E50007091E6058091E7059091E8050E94DE1FCC +:103E6000F801EB51FA4F808304C0F801EB51FA4F8F +:103E7000808169817A810E94CE200F900F900F90EF +:103E80000F900F90DF91CF911F910F910895209186 +:103E9000130130911401F90132969FEF40E05191E6 +:103EA000851789F09F3F19F4511101C0942F4F5F7E +:103EB0004630A9F79F3F39F0F901E90FF11D97FD51 +:103EC000FA95828308950895E0911301F091140109 +:103ED0009F012A5F3F4F9281891301C01282319660 +:103EE000E217F307C1F7089581E090E0E091130134 +:103EF000F0911401E80FF91F1082019688309105A6 +:103F0000A9F708959091F305892B8093F3050895FF +:103F100080959091F30589238093F305089510927D +:103F2000F30508959091F205892B8093F205089589 +:103F300080959091F20589238093F205089510925F +:103F4000F20508958091130190911401FC013196BE +:103F50009C01285F3F4F80E0919191118F5FE217A4 +:103F6000F307D1F70895E0911301F09114018091C6 +:103F7000F3058083E0911301F09114019081809109 +:103F8000F205892B80838091E905882361F0E09117 +:103F90001301F09114019081892B80830E94A21F4C +:103FA00081111092E90580911301909114010C94F4 +:103FB000AD1C9093A7018093A6010895CF92DF9244 +:103FC000EF92FF926C01EE24FF24C114D104E104AE +:103FD000F10421F0C701B60120E101C020E0C72EA5 +:103FE000D82EE92EFF24C114D104E104F10419F004 +:103FF000285FC701B6016B017C0154E0F694E79499 +:10400000D794C7945A95D1F7C114D104E104F104AF +:1040100019F02C5FC701B6016B017C0142E0F694F8 +:10402000E794D794C7944A95D1F7C114D104E10419 +:10403000F10419F02E5FC701B601DC01CB01B69582 +:10404000A79597958795892B8A2B8B2B09F02F5F46 +:10405000822FFF90EF90DF90CF900895CF93DF9362 +:1040600000D000D01F92CDB7DEB70F900F900F9009 +:104070000F900F90DF91CF9108950C94211D80E057 +:1040800008958091F905843021F11092F40520E41F +:1040900088E190E00FB6F894A895809360000FBE79 +:1040A0002093600083B7817F846083BF83B7816082 +:1040B00083BF7894889583B78E7F83BF0FB6F894BB +:1040C000A8958091600088618093600010926000E4 +:1040D0000FBE08950E94251D0E94C8050E94261D3E +:1040E00080E008950E94231D0C94141E1F920F92CD +:1040F0000FB60F9211248F939F93AF93BF9380912C +:10410000F405811113C08091C6049091C704A09159 +:10411000C804B091C9044196A11DB11D8093C60485 +:104120009093C704A093C804B093C904BF91AF9102 +:104130009F918F910F900FBE0F901F9018950E9426 +:104140000A1BF89487E797E790930108809300088B +:1041500087E090EBDC018093020690930306A09326 +:104160000406B09305069CE088E10FB6F894A89584 +:10417000809360000FBE90936000FFCF0895E62FFC +:10418000F0E0EB5CFD4F84910895E82FF0E0EE0F36 +:10419000FF1FED54FF4F8591949108950E94BF2019 +:1041A00090E4980F903218F40E94C52008958F3B38 +:1041B00050F4883A48F5853AD0F48430A8F4813038 +:1041C00009F4B2C0AEC0883E40F4803E68F48F3B34 +:1041D00009F0A7C020E030EEA9C0803F08F4A1C0DC +:1041E000282F30E03065A2C0282F30E09FC0853AEC +:1041F00029F0863A31F023E830E498C021E830E431 +:1042000095C022E830E492C0883A09F445C0893A62 +:1042100009F445C08A3A09F445C08B3A09F445C00F +:104220008C3A09F445C08D3A09F445C08E3A09F438 +:1042300045C08F3A09F445C0813B09F445C0803B35 +:1042400009F445C0823B09F445C0833B09F445C0ED +:10425000843B09F445C0853B09F445C0863B09F41D +:1042600045C0873B09F445C0883B09F445C0893BFC +:1042700009F445C08A3B09F445C08B3B09F445C0AD +:104280008C3B09F445C08D3B09F445C08E3B09F4D5 +:1042900045C020E034E44AC022EE34E447C029EEB1 +:1042A00034E444C02AEE34E441C025EB34E43EC09B +:1042B00026EB34E43BC023EB34E438C024EB34E495 +:1042C00035C027EB34E432C02CEC34E42FC02DECA5 +:1042D00034E42CC023E835E429C02AE835E426C0BC +:1042E00022E935E423C024E935E420C021E236E4A4 +:1042F0001DC023E236E41AC024E236E417C025E2EA +:1043000036E414C026E236E411C027E236E40EC0DB +:104310002AE236E40BC02FE634E408C020E734E498 +:1043200005C020E030E002C021E030E0C90108957E +:104330000E94092208F481E008950E945D2288F01D +:104340009F5798F0B92F9927B751B0F0E1F0660F59 +:10435000771F881F991F1AF0BA95C9F714C0B1309A +:1043600091F00E947722B1E008950C947722672F94 +:10437000782F8827B85F39F0B93FCCF386957795C9 +:104380006795B395D9F73EF49095809570956195B2 +:104390007F4F8F4F9F4F0895E89409C097FB3EF4DD +:1043A00090958095709561957F4F8F4F9F4F992382 +:1043B000A9F0F92F96E9BB279395F6958795779500 +:1043C0006795B795F111F8CFFAF4BB0F11F460FFC0 +:1043D0001BC06F5F7F4F8F4F9F4F16C0882311F018 +:1043E00096E911C0772321F09EE8872F762F05C02C +:1043F000662371F096E8862F70E060E02AF09A95C7 +:10440000660F771F881FDAF7880F9695879597F9BB +:104410000895990F0008550FAA0BE0E8FEEF161655 +:104420001706E807F907C0F012161306E407F507A8 +:1044300098F0621B730B840B950B39F40A2661F01C +:10444000232B242B252B21F408950A2609F4A140BF +:10445000A6958FEF811D811D089597F99F6780E8CC +:1044600070E060E008959FEF80EC089500240A94C6 +:104470001616170618060906089500240A9412163F +:104480001306140605060895092E0394000C11F472 +:10449000882352F0BB0F40F4BF2B11F460FF04C01F +:1044A0006F5F7F4F8F4F9F4F089557FD9058440F78 +:1044B000551F59F05F3F71F04795880F97FB991F83 +:1044C00061F09F3F79F08795089512161306140640 +:1044D000551FF2CF4695F1DF08C0161617061806CD +:1044E000991FF1CF86957105610508940895E894A8 +:1044F000BB2766277727CB0197F908950E940922E9 +:1045000008F48FEF08950E9496220C9444220E9492 +:10451000362238F00E943D2220F0952311F00C94B1 +:104520002D220C94332211240C9478220E945522BF +:1045300070F3959FC1F3950F50E0551F629FF001F6 +:10454000729FBB27F00DB11D639FAA27F00DB11D0F +:10455000AA1F649F6627B00DA11D661F829F222798 +:10456000B00DA11D621F739FB00DA11D621F839F1F +:10457000A00D611D221F749F3327A00D611D231FF5 +:10458000849F600D211D822F762F6A2F11249F5743 +:1045900050409AF0F1F088234AF0EE0FFF1FBB1F46 +:1045A000661F771F881F91505040A9F79E3F510505 +:1045B00080F00C942D220C9478225F3FE4F3983E17 +:1045C000D4F3869577956795B795F795E7959F5FAF +:1045D000C1F7FE2B880F911D9695879597F9089541 +:1045E000EE0FFF1F0590F491E02D0994F894FFCF92 +:1045F0000105D4040000FF98149D149B14D6159C4B +:10460000140101EA0572636F6465002F2F20556E57 +:104610006B6E6F776E204849442044657363205465 +:104620007970653A002F2F20556E6B6E6F776E2074 +:104630004465736320547970653A00206C656E00A0 +:104640002F2F20696456656E646F72002F2F2069CA +:104650006450726F64756374002F2F206C616E67F5 +:1046600069640000000000C606CC06C206C506BC90 +:1046700006BF06BF0600000000E7078E07470800D8 +:104680000000007711C810D6106914CE10C512CAE8 +:0646900010D110CC100057 :00000001FF diff --git a/converter/usb_desc_dump/desc_dump.cpp b/converter/usb_desc_dump/desc_dump.cpp index 5ce3aa85..5f66a042 100644 --- a/converter/usb_desc_dump/desc_dump.cpp +++ b/converter/usb_desc_dump/desc_dump.cpp @@ -44,6 +44,11 @@ uint8_t buf[BUF_SIZE]; #define RBUF_SIZE 256 uint8_t rbuf[RBUF_SIZE]; +#define SBUF_SIZE 64 +uint8_t sbuf[SBUF_SIZE]; + +uint16_t langid = 0; + void printHEX(uint8_t hex) { @@ -71,18 +76,45 @@ void printError(uint8_t rcode) xprintf("\r\nERROR:%02X\r\n", rcode); } -void dumpBuf(int len, uint8_t* buf) +void dumpBuf(int len, uint8_t* buf, bool commented = false) { for (int i = 0; i < len; i++) { if (i % 16) print(" "); - else if (i != 0) - print("\r\n"); + else { + if (i != 0) print("\r\n"); + if (commented) print("// "); + } + xprintf("%02X ", buf[i]); } print("\r\n"); } +void printStringDescriptor(UsbDevice *pdev, uint8_t index, uint16_t langid) +{ + uint8_t rcode, len; + if (index == 0) return; + + rcode = Usb.getStrDescr(pdev->address.devAddress, 0, 1, index, langid, sbuf); + if (rcode) { printVal("rcode", rcode); return; } + len = (sbuf[0] > sizeof(sbuf) ? sizeof(sbuf) : sbuf[0]); + + rcode = Usb.getStrDescr(pdev->address.devAddress, 0, len, index, langid, sbuf); + if (rcode) { printVal("rcode", rcode); return; } + + xprintf("String%d: ", index); + + for (uint8_t i = 2; (i + 1) < len; i += 2) { + if (sbuf[i + 1] != 0) continue; + //xputc(sbuf[i + 1]); + xputc(sbuf[i]); + } + print("\r\n"); + + dumpBuf(sbuf[0], sbuf, true); +} + uint8_t dumpReportDesc(UsbDevice *pdev, uint16_t iface, uint16_t len) { uint8_t rcode = 0; @@ -109,6 +141,12 @@ void scanConfigDesc(UsbDevice *pdev, uint16_t tl, uint8_t* pB) case USB_DESCRIPTOR_INTERFACE: { USB_INTERFACE_DESCRIPTOR *pI = (USB_INTERFACE_DESCRIPTOR *)pB; iface = pI->bInterfaceNumber; + + // String Descriptor + if (pI->iInterface) { + print("\r\n// iInterface: "); + printStringDescriptor(pdev, pI->iInterface, langid); + } break; } case HID_DESCRIPTOR_HID: { @@ -117,12 +155,12 @@ void scanConfigDesc(UsbDevice *pdev, uint16_t tl, uint8_t* pB) if (pH->bDescrType == HID_DESCRIPTOR_REPORT) { dumpReportDesc(pdev, iface, pH->wDescriptorLength); } else { - printVal("Unknown HID Desc Type:", pH->bDescrType); + printVal("// Unknown HID Desc Type:", pH->bDescrType); } break; } default: - printVal("Unknown Desc Type:", *(pB+1)); + printVal("// Unknown Desc Type:", *(pB+1)); return; } pB += *pB; @@ -145,6 +183,12 @@ uint8_t dumpConfigDesc(UsbDevice *pdev, uint8_t numConf) if (rcode) return rcode; dumpBuf(tl, buf); + // String Descriptor + if (pC->iConfiguration) { + print("\r\n// iConfiguration: "); + printStringDescriptor(pdev, pC->iConfiguration, langid); + } + scanConfigDesc(pdev, tl, buf); } return rcode; @@ -165,6 +209,31 @@ void dumpDescriptors(UsbDevice *pdev) USB_DEVICE_DESCRIPTOR *pD = (USB_DEVICE_DESCRIPTOR *)&buf; printVal("// idVendor", pD->idVendor); printVal("// idProduct", pD->idProduct); + + // String Descriptor + if (pD->iManufacturer || pD->iProduct || pD->iSerialNumber) { + rcode = Usb.getStrDescr(pdev->address.devAddress, 0, 4, 0, 0, sbuf); + if (rcode == 0) { + langid = (sbuf[3] << 8) | sbuf[2]; + printVal("// langid", langid); + + println("\r\n// String0:"); + dumpBuf(sbuf[0], sbuf, true); + } + } + if (pD->iManufacturer) { + print("\r\n// iManufacturer: "); + printStringDescriptor(pdev, pD->iManufacturer, langid); + } + if (pD->iProduct) { + print("\r\n// iProduct: "); + printStringDescriptor(pdev, pD->iProduct, langid); + } + if (pD->iSerialNumber) { + print("\r\n// iSerialNumber: "); + printStringDescriptor(pdev, pD->iSerialNumber, langid); + } + print("\r\n// Device Descriptor:\r\n"); dumpBuf(sizeof(USB_DEVICE_DESCRIPTOR), buf); @@ -177,6 +246,8 @@ void dumpDescriptors(UsbDevice *pdev) if (rcode) { printError(rcode); } Usb.GetAddressPool().FreeAddress(pdev->address.devAddress); + + println("\r\n// Parse data here: http://eleccelerator.com/usbdescreqparser/"); return; } From ca852c0721b3f76d8a8e85b932e403823f117821 Mon Sep 17 00:00:00 2001 From: tmk Date: Sun, 11 Jul 2021 16:36:24 +0900 Subject: [PATCH 21/28] usb_desc_dump: Fix report descriptor dump --- .../usb_desc_dump/binary/usb_desc_dump.hex | 2253 +++++++++-------- converter/usb_desc_dump/desc_dump.cpp | 83 +- 2 files changed, 1199 insertions(+), 1137 deletions(-) diff --git a/converter/usb_desc_dump/binary/usb_desc_dump.hex b/converter/usb_desc_dump/binary/usb_desc_dump.hex index d90faccb..d563ed70 100644 --- a/converter/usb_desc_dump/binary/usb_desc_dump.hex +++ b/converter/usb_desc_dump/binary/usb_desc_dump.hex @@ -1,15 +1,15 @@ -:100000000C94B3010C9406020C9406020C940602A4 -:100010000C9406020C9406020C9406020C94060240 -:100020000C9406020C9406020C94851B0C94571C2D -:100030000C9476200C9406020C9406020C94060292 -:100040000C9406020C9406020C9406020C94060210 -:100050000C9406020C9468070C9406020C94060299 -:100060000C9406020C9406020C9406020C940602F0 -:100070000C9406020C9406020C9406020C940602E0 -:100080000C9406020C9406020C9406020C940602D0 -:100090000C9406020C9406020C9406020C940602C0 -:1000A0000C9406020C9406020C940602D319FA1959 -:1000B000F21AFA19F21A461A691AF21AC01ACF1A63 +:100000000C94C6010C9419020C9419020C94190258 +:100010000C9419020C9419020C9419020C941902F4 +:100020000C9419020C9419020C94391C0C940B1D9D +:100030000C942A210C9419020C9419020C941902A4 +:100040000C9419020C9419020C9419020C941902C4 +:100050000C9419020C941C080C9419020C941902AB +:100060000C9419020C9419020C9419020C941902A4 +:100070000C9419020C9419020C9419020C94190294 +:100080000C9419020C9419020C9419020C94190284 +:100090000C9419020C9419020C9419020C94190274 +:1000A0000C9419020C9419020C941902871AAE1AB6 +:1000B000A61BAE1AA61BFA1A1D1BA61B741B831BBC :1000C0007573625F73746174653A20253032580A23 :1000D000000D0A2F2F2050617273652064617461D6 :1000E00020686572653A20687474703A2F2F656CC9 @@ -25,1107 +25,1130 @@ :100180006565643A253032580D0A000D0A2F2F207C :10019000416464726573733A253032580D0A000D5C :1001A0000A2F2F2069436F6E6669677572617469E3 -:1001B0006F6E3A20000D0A2F2F20436F6E6669671D -:1001C00025643A000D0A2F2F205265706F72742536 -:1001D000643A206C656E3A253034580D0A000D0AD9 -:1001E0002F2F2069496E746572666163653A20003D -:1001F0000D0A00537472696E6725643A20000D0A77 -:10020000002530325820002F2F20000D0A0020003A -:100210000D0A4552524F523A253032580D0A0025E8 -:10022000733A253034580D0A0025733A2530325878 -:100230000D0A0000000A4B6579626F6172642073D9 -:10024000746172742E0A000A55534220636F6E6601 -:100250006967757265642E0A000A0A544D4B3A3676 -:10026000396236346462642B2F4C5546410A0A00C9 -:100270002C03550053004200200044006500730029 -:10028000630072006900700074006F00720020004B -:10029000440075006D0070006500720000000803E6 -:1002A00054004D004B000000040309040902420001 -:1002B000020100A03209040000010301010009212C -:1002C000110100012240000705810308000A09040A -:1002D0000100020300000009211101000122220097 -:1002E0000705820320000107050203200001120117 -:1002F000100100000008EDFE5B001408010200017F -:100300000631FF0974A1010975150026FF0095202B -:10031000750881020976150026FF00952075089161 -:1003200002C005010906A101050719E029E715002A -:10033000250195087501810295017508810105085F -:100340001901290595057501910295017503910122 -:100350000507190029FF150026FF0095067508817D -:1003600000C0B206D30611241FBECFEFDAE0DEBF15 -:10037000CDBF04B603FE28C080910206909103060B -:10038000A0910406B09105068730904BA740B04B72 -:10039000D9F41092020610920306109204061092ED -:1003A000050614BE0FB6F894A89580916000886188 -:1003B00080936000109260000FBE109201081092AE -:1003C0000008E0E0F8E3099511E0A0E0B1E0E0EF1B -:1003D000F5E402C005900D92A63AB107D9F726E0E0 -:1003E000A6EAB1E001C01D92A230B207E1F711E028 -:1003F000C3EBD1E004C02197FE010E94F022C13B73 -:10040000D107C9F70E94EE160C94F6220C94000056 -:10041000FF93EF93E091A601F091A701309709F0C7 -:100420000995EF91FF910895FC018591803011F0BD -:10043000EFDFFBCF0895FF27E0E230E247FF0CC07B -:10044000419597FF09C0EDE2609570958095909574 -:10045000611D711D811D911D27FF02C0219530E393 -:1004600050E2AA27660F771F881F991FAA1FA4179B -:1004700010F0A41B63955A95A9F7AA3008F0A95F5C -:10048000A05DAF93F395611571058105910541F765 -:10049000ED3211F4EF93F395F21718F43F93F395BF -:1004A000FBCF8F91B5DFFA95E1F70895E991F991C6 -:1004B0008591803021F0853219F0AADFF9CF0895B7 -:1004C00020E0E89455915532C1F3503311F468940B -:1004D00055915A3348F4505390F3220F022E220FB5 -:1004E000220F200D250FF4CF0EF4219589919991BB -:1004F000533619F3533729F1533559F1BC01882785 -:100500009927E8945C3621F48991999168945591E2 -:10051000543639F446EF7EF077FF0DC08FEF9FEF32 -:100520000AC055374AE039F0583540E121F05236DB -:1005300042E009F00895FF93EF937DDFEF91FF9183 -:10054000B7CFFF93EF93FC0181918030B9F360DF67 -:10055000FBCFFF93EF9368DFF1CFDF93CF93CDB75E -:10056000DEB72596A3DFCF91DF9108951F926F9399 -:100570009F938F9389E292E09F938F930E94AD02A5 -:100580000F900F900F900F900F900F9008957F9302 -:100590006F939F938F938FE192E09F938F930E942D -:1005A000AD020F900F900F900F900F900F90089545 -:1005B0001F928F9380E192E09F938F930E94AD02F0 -:1005C0000F900F900F900F900895BF92CF92DF92EF -:1005D000EF92FF920F931F93CF93DF936C01B42E92 -:1005E0008B01C0E0D0E081E0E82E82E0F82ECC154F -:1005F000DD051CF5CE018F709927892B19F08EE04F -:1006000092E00AC0209721F08BE092E00E94140251 -:10061000BB2021F087E092E00E941402F801819152 -:100620008F011F928F93FF92EF920E94AD0221964D -:100630000F900F900F900F90DACF8EEF91E0DF9137 -:10064000CF911F910F91FF90EF90DF90CF90BF90CF -:100650000C9414028F929F92AF92BF92CF92DF922E -:10066000EF92FF920F931F93CF93DF93662309F4CA -:1006700076C04A01162F5C019EEAC92E91E0D92E60 -:100680007A01062F21E030E040E0F50162818FEF32 -:1006900093E00E94D70D811116C0C091AE01C13404 -:1006A00008F0C0E4D0E08EEAC82E81E0D82E7401B4 -:1006B000012F9E0140E0F50162818FEF93E00E94DF -:1006C000D70D882389F0682F85E191E0DF91CF91E4 -:1006D0001F910F91FF90EF90DF90CF90BF90AF9060 -:1006E0009F908F900C94B6021F921F9383EF91E01E -:1006F0009F938F930E94AD020F900F900F900F90D9 -:1007000012E0812F90E09C012F5F3F4F2C173D0797 -:1007100074F4F901E255FE4F2081211106C0FC015D -:10072000E255FE4F80810E9408021E5FEACF80EFF3 -:1007300091E00E9414028091AE0141E06EEA71E006 -:1007400090E0DF91CF911F910F91FF90EF90DF909C -:10075000CF90BF90AF909F908F900C94E502DF9167 -:10076000CF911F910F91FF90EF90DF90CF90BF90AE -:10077000AF909F908F9008958F929F92AF92BF926B -:10078000CF92EF920F93CF93DF93EA011F921F92C4 -:100790002EEE31E03F932F9321E02F931F924A01D9 -:1007A0005B0122E2C22EE12C06E021E840E0FC01E0 -:1007B00062818FEF93E00E94A90C40E06EEE71E041 -:1007C000CE010E94E5020F900F900F900F900F90B6 -:1007D0000F9080E0DF91CF910F91EF90CF90BF907D -:1007E000AF909F908F9008958F929F92AF92BF92FB -:1007F000CF92DF92EF92FF921F93CF93DF936C0122 -:10080000EA0110E0CB0182519D4F7C0184ECA82EBF -:1008100081E0B82ECE15DF0508F052C06981643042 -:1008200051F018F46130C8F147C0653009F444C094 -:10083000613291F032C01A8188858823E9F18EED0A -:1008400091E00E9414024091AC015091AD01688585 -:10085000C6010E942A0330C088858F938F818F93B1 -:10086000812E912C1F921F93BF92AF920E94AD02D6 -:100870006E810F900F900F900F900F900F9062323B -:1008800039F44F815885B401C6010E94BC0314C0DD -:100890008BE191E00E94B6020FC085E391E0DF9109 -:1008A000CF911F91FF90EF90DF90CF90BF90AF90CE -:1008B0009F908F900C94B6028881C80FD11DAACF4B -:1008C000DF91CF911F91FF90EF90DF90CF90BF907D -:1008D000AF909F908F9008956F927F928F929F928A -:1008E000AF92BF92CF92DF92EF92FF920F931F933E -:1008F000CF93DF935C01862E912CC0E0D0E025EBF6 -:10090000622E21E0722E1C2F8C169D0609F456C013 -:10091000DF93CF937F926F920E94AD029EEEE92EFD -:1009200092E0F92E0C2F29E030E040E0F5016281E1 -:100930008FEF93E00E94B00D0F900F900F900F90EB -:1009400081113DC0C090F002D090F102B6018BE45D -:1009500091E00E94C7029601F1E0CF16DF0610F089 -:1009600020E031E08EEEE82E82E0F82E012F40E00C -:10097000F50162818FEF93E00E94B00D81111FC0DD -:1009800040E0B701C6010E94E5028091F40288238D -:1009900069F08FE991E00E9414024091AC015091FE -:1009A000AD016091F402C5010E942A034EEE52E0AF -:1009B000B601C5010E94F4032196A5CF80E0DF9126 -:1009C000CF911F910F91FF90EF90DF90CF90BF904C -:1009D000AF909F908F907F906F900895CF92DF920D -:1009E000EF92FF920F931F93CF93DF93EC018A81D5 -:1009F0001F928F938BE891E09F938F930E94AD029B -:100A00008C811F928F9388E791E09F938F930E9430 -:100A1000AD020EEE12E022E130E040E06A818FEF9D -:100A200093E00E94890D2DB73EB7285F3F4F0FB668 -:100A3000F8943EBF0FBE2DBF81110E94D802609175 -:100A4000F6027091F70280E591E00E94C702609182 -:100A5000F8027091F9028CE591E00E94C702809142 -:100A6000FC02811108C08091FD02811104C08091B7 -:100A7000FE028823C9F18EEAC82E81E0D82EE12C2F -:100A8000F12C00E024E030E040E06A818FEF93E059 -:100A90000E94D70D811117C06091B0017091B10112 -:100AA0007093AD016093AC0189E691E00E94C702AA -:100AB00088E691E00E9414028091AE0141E0B60107 -:100AC00090E00E94E5028091FC02882369F083E5B2 -:100AD00091E00E9414024091AC015091AD016091EF -:100AE000FC02CE010E942A038091FD02882369F056 -:100AF00083E491E00E9414024091AC015091AD0159 -:100B00006091FD02CE010E942A038091FE0288239B -:100B100069F08EE291E00E9414024091AC01509184 -:100B2000AD016091FE02CE010E942A0384E191E0B2 -:100B30000E94140240E06EEE72E082E190E00E94BA -:100B4000E5026091FF02CE010E946C0481110E94B7 -:100B5000D802E091FF03F09100040480F581E02DBC -:100B60006A818FEF93E0099581ED90E0DF91CF915D -:100B70001F910F91FF90EF90DF90CF900C94140293 -:100B800008950E9441079093AB018093AA010895B4 -:100B900081E00895CF93DF938FEF93E00E94CB0F16 -:100BA0008FEF93E00E9499089091A8018917C9F0EE -:100BB0008FEF93E00E9499088093A8011F928F9372 -:100BC00080EC90E09F938F930E94AD020F900F9066 -:100BD0000F900F9080910001811103C081E08093FC -:100BE00000018091AA019091AB010E945907883BB6 -:100BF0009B40C8F08FEF93E00E949908803999F4E8 -:100C000080910001882379F0CAE0D4E08A818823AA -:100C100019F0CE010E94EE04259684E0C535D80770 -:100C2000A9F710920001DF91CF9108952E9A0895AF -:100C30002E988EBD0DB407FEFDCF1EBC0DB407FE71 -:100C4000FDCF0E9416068EB508952E9882608EBD47 -:100C50000DB407FEFDCF6EBD0DB407FEFDCF0C94A5 -:100C6000160688EF0E941806807C8034A1F018F4E4 -:100C7000882301F10895803819F0803CB9F0089577 -:100C800088ED0E94180681FD0BC069EC88ED0E947A -:100C9000250682E00CC088ED0E94180681FDF5CF84 -:100CA0006BEC88ED0E94250683E001C081E0809313 -:100CB000A901089561ED88ED0E9425061092A90111 -:100CC00008950F931F93CF93DF938C01269A0E9470 -:100CD0001606219A229A2398209A80E58CBD81E0FD -:100CE0008DBD259868E188E80E94250660E288E7C6 -:100CF0000E94250660E088E70E942506C0E0D0E05B -:100D000088E60E941806219680FD06C0CF3F8FEF2F -:100D1000D807B1F78FEF1DC061EC88ED0E94250662 -:100D200060E680ED0E94250664E088EE0E942506BC -:100D300088EE0E94180682FFFBCFC8010E94310690 -:100D400060E288EC0E94250661E080E80E942506AA -:100D500080E0DF91CF911F910F9108958FEF93E085 -:100D60000C9461068FEF93E00E9469086FEF73E0C7 -:100D70008EEE93E00C94281380E090E008958FEFBE -:100D80009FEF089581E090E008950895862F0E94D6 -:100D9000E21481E090E00895FB0180810E94E2145A -:100DA00081E090E00895E6E7F4E01382128288EE95 -:100DB00093E0A0E0B0E084839583A683B78387E7C0 -:100DC00091E0918380838FEF9FEF958784870895CB -:100DD0000C944D078F929F92AF92BF92CF92DF9269 -:100DE000EF92FF920E94CC214B015C0120E030E0A9 -:100DF0004AE755E40E9483226B017C0120E030E049 -:100E000040E85FE30E94982187FD24C020E03FEF87 -:100E10004FE757E4C701B6010E947E221816ACF4D2 -:100E200020E030E040E251E4C501B4010E94832299 -:100E30000E949D2120E931E06115710581F0C90111 -:100E40000197F1F761507109F7CFC701B6010E9410 -:100E50009D2102C061E070E0CB010197F1F7FF90A6 -:100E6000EF90DF90CF90BF90AF909F908F900895BC -:100E700082E084BD93E095BD9AEF97BD80936E00AC -:100E800008952FB7F8948091C6049091C704A0915B -:100E9000C804B091C9042FBF08952FB7F89460918A -:100EA000C6047091C7048091C8049091C9042FBFF3 -:100EB00008959C014FB7F8948091C6049091C7049F -:100EC000A091C804B091C9044FBF821B930B089531 -:100ED00078941F920F920FB60F9211248F939F93C5 -:100EE000AF93BF938091C6049091C704A091C804AA -:100EF000B091C9040196A11DB11D8093C6049093C1 -:100F0000C704A093C804B093C904BF91AF919F9147 -:100F10008F910F900FBE0F901F901895CF93DF9376 -:100F2000FC01862F8078A9F4283008F04DC04423B6 -:100F300021F09581973009F447C0EF01A1E0B0E0BE -:100F40009D85992341F011962596A031B105C1F7F1 -:100F50003BC080E039C061111CC085E08A9FE00180 -:100F60008B9FD00D1124CE0FDF1F442331F081E47D -:100F7000888785818F5F858302C081E0888725E02F -:100F80002A9FC0012B9F900D1124E80FF91F808527 -:100F90001BC06770660F660F660F442341F06064E4 -:100FA00085818F5F85838770687F682B03C027707A -:100FB000687B622B25E02A9FC0012B9F900D112496 -:100FC000E80FF91F6087862FDF91CF910895611197 -:100FD00002C006960895FC0121E03585631739F0BB -:100FE0002F5F35962031C9F780E090E0089506968E -:100FF00035E0239F800D911D11240895DF92EF921B -:10100000FF920F931F93CF93DF93EC01E62EF12C09 -:1010100085E0689FB0011124FE01E60FF71F80856F -:10102000182F177086FF17C001E085E0D82EFE014B -:10103000D09EE00DF11D11248085869586958695BC -:1010400087701817F9F00F5F003189F78D818113D0 -:1010500002C011501D8385E08E9DF0018F9DF00D23 -:101060001124EC0FFD1F108681E0818712862296E5 -:10107000D783C683DF91CF911F910F91FF90EF909F -:10108000DF900895602FCE010E94FE07D0CFFC01B3 -:10109000613499F49C01255B3F4F61E0AC014E5FE8 -:1010A0005F4F158666871786548743873596E21704 -:1010B000F307B9F7FC011582089521E03585631720 -:1010C00029F02F5F35962031C9F70895622F0C94CF -:1010D000FE07FC0189E891E09183808315821086E8 -:1010E00081E081871286CF010296978386831282E0 -:1010F00028E023832CE32483DF019F01255B3F4FFE -:1011000041E01D961C921D971E964C931E971F96AC -:101110001C921F971C969C938E931B971596A21753 -:10112000B30779F7EA58FF4F108281E18093CE042C -:1011300008958091CE040895CF93C42F0E94E707AD -:10114000009789F0DC01ED91FC911197309759F0EF -:1011500013969C9180E0891731F020812C1731F093 -:1011600033968F5FF8CF80E090E001C0CF01CF9140 -:1011700008950F931F93CF93DF932115310571F0DD -:10118000E901042F162F0E94E707FC01892B41F08B -:101190001283D183C083038380E003C088ED01C044 -:1011A00086EDDF91CF911F910F910895CF92DF923D -:1011B000FF920F931F93CF93DF93662381F1F62E57 -:1011C0008C016C0186E5C80ED11CC0E0D0E0D601D0 -:1011D0008D919D916D010097F1F0DC01ED91FC91F5 -:1011E0000084F185E02D0995F81215C0AB96CC0F5F -:1011F000DD1FC00FD11F88819981DC01ED91FC9129 -:101200000480F581E02DDF91CF911F910F91FF9028 -:10121000DF90CF9009942196C031D105C1F680E0CE -:10122000DF91CF911F910F91FF90DF90CF900895A4 -:101230002E980895CF93C82F0E941809CEBD0DB4E3 -:1012400007FEFDCF1EBC0DB407FEFDCF0E941606A3 -:101250008EB5CF910895CF93DF93C82FD62F0E94DC -:101260001809C260CEBD0DB407FEFDCFDEBD0DB4C2 -:1012700007FEFDCFDF91CF910C9416068F929F92BF -:10128000AF92BF92CF92DF92EF92FF920F931F9394 -:10129000CF93DF93EC01D62EC42E59010E94E707AD -:1012A0007C01009709F445C0FC0180819181892B64 -:1012B00009F441C04C2D6D2DCE010E949C08F50112 -:1012C000918380830097C9F1FC0182818695869580 -:1012D00090E08031910514F08FE090E041E050E023 -:1012E00060E070E04A015B0104C0880C991CAA1CF4 -:1012F000BB1C8A95D2F7D501C4010197F8019183EF -:1013000080836D2D80EE0E942B0988ED0E941A09C2 -:10131000F7019481992331F0CA58DF4F68816260E8 -:10132000682B02C0682F697F88ED0E942B0980E03E -:1013300005C086ED03C087ED01C08BEDDF91CF9135 -:101340001F910F91FF90EF90DF90CF90BF90AF90E3 -:101350009F908F9008958F929F92AF92BF92CF925D -:10136000DF92EF92FF920F931F93CF93DF93862E1E -:10137000942E59010E94E8066B017C0128E8C20EF8 -:1013800023E1D21EE11CF11C00E010E0D0E0C0E03F -:1013900098280E94E806DC01CB018C199D09AE0952 -:1013A000BF09B7FF2DC0692D80EF0E942B090E9455 -:1013B000E806DC01CB018C199D09AE09BF09B7FF16 -:1013C00009C088EC0E941A0987FFF1CF60E888EC19 -:1013D0000E942B0988EF0E941A09C82FCF70C430D1 -:1013E00019F0CE3051F00CC00F5F1F4FA114B104A3 -:1013F00081F20A151B0569F603C0DF5FD33049F699 -:101400008C2FDF91CF911F910F91FF90EF90DF9084 -:10141000CF90BF90AF909F908F9008959F92AF9282 -:10142000BF92CF92DF92EF92FF920F931F93CF93D1 -:10143000DF937C01D42F122F902E00E06C01C60E9A -:10144000D11CC60ED11C86E5C80ED11CA42EB12C11 -:10145000ABE2AA0EB11CAA0CBB1CAE0CBF1CF60161 -:1014600080819181DC01ED91FC910280F381E02D7E -:10147000292D412F6D2F0995803EC9F4D1110BC044 -:1014800061E088EE0E942B0966E670E080E090E063 -:101490000E94EA0614C0F50180819181DC01ED9182 -:1014A000FC910284F385E02D612F099508C08D30F1 -:1014B00021F4033008F03FC014C081113FC0F60191 -:1014C00080819181DC01ED91FC910190F081E02D12 -:1014D000292D412F6D2F0995C82F8D3051F40330E0 -:1014E00050F464E670E080E090E00E94EA060F5F4E -:1014F000B6CF882311F1D1110BC061E088EE0E94B4 -:101500002B0966E670E080E090E00E94EA0611C0D8 -:10151000ED2FF0E0BB96EE0FFF1FEE0DFF1D80815B -:101520009181DC01ED91FC910284F385E02D612F26 -:1015300009958C2F03C08DE001C080E0DF91CF9131 -:101540001F910F91FF90EF90DF90CF90BF90AF90E1 -:101550009F9008950F931F93CF93DF93182F062F1B -:10156000EA010E94180912601EBDFE01802F882327 -:1015700039F00DB407FEFDCF91919EBD8150F7CF9C -:10158000C00FD11D0DB407FEFDCF0E941606CE017F -:10159000DF91CF911F910F9108952F923F924F921B -:1015A0005F926F927F928F929F92AF92BF92CF92F3 -:1015B000DF92EF92FF920F931F93CF93DF9300D0B0 -:1015C00000D01F92CDB7DEB77D836C834A016901DD -:1015D000FB01F1808FEF8F0D803408F067C00E940F -:1015E000E8062B013C01F8E84F0EF3E15F1E611C99 -:1015F000711CEC81FD81828180FD02C060E401C02C -:1016000060E888EE0E942B09312C8F2D90E09A83A0 -:101610008983C114D104B1F1E980FA80CE14DF04CA -:1016200008F47601EB82A8016E2D80E10E94AA0ADF -:101630006E2D88E30E942B09EC81FD816081606240 -:1016400080EF0E942B0988EC0E941A0987FFFBCFCC -:1016500060E888EC0E942B0988EF0E941A098F70BD -:10166000382EA12CB12C212C332009F472C00E94F9 -:10167000E806DC01CB0184199509A609B709B7FF73 -:1016800068C016C0332021F060E088E30E942B0977 -:1016900088EF0E941A0985FB882780F9EC81FD817B -:1016A000928180FB90F99283832D58C08AED56C0B9 -:1016B000F6E03F1239C088EF0E941A0985FB88279F -:1016C00080F991E08927EC81FD81928180FB90F97E -:1016D000928390FD02C060E401C060E888EE0E9441 -:1016E0002B0960E088E30E942B09F801608180E10A -:1016F0000E942B096B8188E30E942B09EC81FD81FC -:101700006081606280EF0E942B0988EC0E941A09B8 -:1017100087FFFBCF60E888EC0E942B0988EF0E94CE -:101720001A098F70382EA0CF2EE0321205C02394F4 -:1017300023E02212D6CFA8CF84E03812A5CFFFEF46 -:10174000AF1ABF0A8114910461F2A814B90449F6D2 -:101750009BCFCE18DF080E0D1F1D5BCF0F900F9093 -:101760000F900F900F90DF91CF911F910F91FF90ED -:10177000EF90DF90CF90BF90AF909F908F907F9031 -:101780006F905F904F903F902F9008952F923F92CF -:101790004F925F926F927F928F929F92AF92BF9281 -:1017A000CF92DF92EF92FF920F931F93CF93DF932D -:1017B000CDB7DEB72A970FB6F894DEBF0FBECDBF08 -:1017C0001C016B015B834A835901D9016D907C90A8 -:1017D0001197FB01F181F9831D921C92DB01129696 -:1017E0008C9181FD02C060E101C060E288EE0E9440 -:1017F0002B098E2D90E0A0E0B0E08C839D83AE831A -:10180000BF8368862A813B81D6014C9160E0C1018B -:101810000E94AB09F82EB6E08B1318C088EF0E9427 -:101820001A0982958170E1E08E27D60112969C916B -:10183000129780FB91F912969C9391FD02C060E192 -:1018400001C060E288EE0E942B09DCCF811167C0E5 -:1018500088EC0E941A0982FF60C080E30E941A0986 -:10186000582E90E06816790608F45884F5018081B6 -:1018700091819301281B390B3A87298737FF02C0D2 -:101880001A861986852C912C89859A858816990641 -:1018900014F49A86898649840E94180998E09EBDAE -:1018A0000DB407FEFDCFF801442041F01EBC4A9460 -:1018B0000DB407FEFDCF8EB58193F6CFA985BA850D -:1018C0000A0F1B1F0E94160664E088EC0E942B0979 -:1018D000F50180819181880E991E91828082F98123 -:1018E0005F1618F08614970470F088EF0E941A09AA -:1018F00082958170D60112969C91129780FB91F986 -:1019000012969C930CC0EE2009F47CCF6C817D81F3 -:101910008E819F810E94EA0675CF80EFF82E8F2D71 -:101920002A960FB6F894DEBF0FBECDBFDF91CF91E0 -:101930001F910F91FF90EF90DF90CF90BF90AF90ED -:101940009F908F907F906F905F904F903F902F90DF -:1019500008952F923F924F925F926F927F928F9253 -:101960009F92AF92BF92CF92DF92EF92FF920F932E -:101970001F93CF93DF93CDB7DEB761970FB6F8947F -:10198000DEBF0FBECDBF3C01F42E322E202EC98A01 -:101990004EA05FA0C8A4D9A4188A1F861E861D86E3 -:1019A0008E01035F1F4F9E01215F3F4F0E943E0942 -:1019B000811196C039822A82EB8289898C83BE820A -:1019C000AD8298868F82AE014F5F5F4F68E080E204 -:1019D0000E94AA0A2D853E854F2D60E1C3010E9419 -:1019E000AB09E82E811178C0932D9078392EC1145F -:1019F000D10409F462C0EF85F8898281992309F442 -:101A00004DC082608283540122242394A114B10426 -:101A100009F458C05C864B864D855E856F85788954 -:101A2000E12C86019E01255F3F4FC3010E94C60B3A -:101A3000E82EA6E08A130FC00F85188988EF0E9450 -:101A40001A0985FB882780F98225F801928180FB9D -:101A500091F99283DBCF81113FC08AA59BA50097A6 -:101A6000A1F0DC01ED91FC9111970190F081E02D46 -:101A7000C4018A199B099A8789876B857C859E0199 -:101A8000275F3F4FA601CD0109958B859C85A81A3C -:101A9000B90A8415950508F0B9CF0FC0816082831B -:101AA0004D855E8586019201BF01C3010E94CD0A6A -:101AB000811116C02D853E8511C02D853E853110C2 -:101AC00005C00CC0E11008C02D853E8560EA4F2D91 -:101AD000C3010E94AB0904C08E2D02C060E8F7CF9D -:101AE00061960FB6F894DEBF0FBECDBFDF91CF91E8 -:101AF0001F910F91FF90EF90DF90CF90BF90AF902C -:101B00009F908F907F906F905F904F903F902F901D -:101B100008958F929F92AF92BF92CF92EF920F93C0 -:101B20001F931F921F921F930F933F932F9349016F -:101B3000A12CB12CCC24C394E12C06E020E80E9417 -:101B4000A90C0F900F900F900F900F900F901F9176 -:101B50000F91EF90CF90BF90AF909F908F9008958E -:101B60008F929F92AF92BF92CF92EF92FF920F937C -:101B70001F921F92FF92EF923F932F934901A12C46 -:101B8000B12C22E0C22EE02E06E020E80E94A90C33 -:101B90000F900F900F900F900F900F900F91FF905C -:101BA000EF90CF90BF90AF909F908F9008958F92BD -:101BB0009F92AF92BF92CF92DF92EF92FF920F93DC -:101BC0001F921F92DF92CF923F932F9349015701AB -:101BD00023E0C22EE02E06E020E80E94A90C0F9020 -:101BE0000F900F900F900F900F900F91FF90EF902C -:101BF000DF90CF90BF90AF909F908F9008958F927D -:101C00009F92AF92BF92CF92EF920F93CF931F927A -:101C10001F921F921F921F921F92812C912CA12C18 -:101C2000B12CC12CE22E05E020E00E94A90CC82FA7 -:101C30006CE271E080E090E00E94EA060F900F9065 -:101C40000F900F900F900F908C2FCF910F91EF90DE -:101C5000CF90BF90AF909F908F9008950F931F9358 -:101C6000CF93DF938A3F3FEF930711F486ED2DC0AA -:101C7000DC011696ED91FC911797EF2B09F1122FCD -:101C8000242FEC011A8740E00E948E07082F88233A -:101C9000C9F0682FCE010E94E707009739F3FC01D5 -:101CA0001483202F40E060E0CE010E94FF0D182F2A -:101CB000882351F0602FCE010E944708812F05C074 -:101CC00087ED03C084ED01C080E0DF91CF911F91CB -:101CD0000F9108952F923F924F925F926F927F9251 -:101CE0008F929F92AF92BF92CF92DF92EF92FF922C -:101CF0000F931F93CF93DF93CDB7DEB766970FB6E1 -:101D0000F894DEBF0FBECDBF1B8A38E03C8B3CE3AE -:101D10003D8B8A3F3FEF930709F464C0522E342E67 -:101D2000462E7C01DC011696CD90DC901797CE01F3 -:101D3000439617969C938E9316971A962C938E0122 -:101D40000F5F1F4F22E130E040E060E0C7010E94DA -:101D5000890DF701D782C6828111A6C089849A8431 -:101D60006B847C84FD81FE8B2E80670136E5C30E7B -:101D7000D11C560110E0D5018D919C910097F1F195 -:101D8000DC01ED91FC910084F185E02D0995811134 -:101D900035C0F50180819181DC01ED91FC910088D5 -:101DA000F189E02D622D0995882341F1F5018081AB -:101DB0009181DC01ED91FC910484F585E02DA30176 -:101DC000B4010995811110C0F50180819181DC0178 -:101DD000ED91FC910684F785E02D6E8909958111BE -:101DE00003C00CC086ED60C0052D232D442D612F4E -:101DF000C7010E940E0A813D09F056C01F5FB2E084 -:101E0000AB0EB11C103109F0B6CF10E0F6018081A5 -:101E100091810097E1F1DC01ED91FC910084F18565 -:101E2000E02D0995811133C0F60180819181DC019B -:101E3000ED91FC910088F189E02D622D09958823B0 -:101E4000D9F0F60180819181DC01ED91FC9104844F -:101E5000F585E02DA301B4010995811118C0F601A3 -:101E600080819181DC01ED91FC910684F785E02D64 -:101E70006E89099581110BC0052D232D442D612FED -:101E8000C7010E940E0A982F977F913D69F41F5F4A -:101E9000E2E0CE0ED11C103109F0B8CF252D432D34 -:101EA000642DC7010E942E0E66960FB6F894DEBF11 -:101EB0000FBECDBFDF91CF911F910F91FF90EF909B -:101EC000DF90CF90BF90AF909F908F907F906F905A -:101ED0005F904F903F902F9008958F929F92AF9276 -:101EE000BF92CF92EF920F931F921F921F921F9259 -:101EF0001F921F92812C912CA12CB12CC12CE22E6F -:101F000009E020E00E94A90C0F900F900F900F9015 -:101F10000F900F900F91EF90CF90BF90AF909F9048 -:101F20008F9008958F929F92AF92BF92CF92DF923F -:101F3000EF920F931F93CF93DF9300D000D0CDB7D4 -:101F4000DEB76C01590148011C821B821A8219827A -:101F50008E010F5F1F4F9E012D5F3F4F0E943E0974 -:101F6000811109C049815A816B817C81840195016D -:101F7000C6010E94C60B0F900F900F900F90DF913B -:101F8000CF911F910F91EF90DF90CF90BF90AF90C6 -:101F90009F908F900895AF92BF92CF92DF92EF9271 -:101FA000FF920F931F93CF938C011D990EC088EC65 -:101FB0000E941A0985FF05C0C8010E94310660E22F -:101FC00001C060E088EC0E942B098091A90181305A -:101FD00039F040F0823079F0833039F5C1E00CC03F -:101FE00083E106C08091CE04807F8031F1F081E1F1 -:101FF0008093CE041AC0C0E08091CE04807F8031EF -:10200000A9F40E94E806DC01CB0188539F4FAF4F33 -:10201000BF4F8093CA049093CB04A093CC04B09399 -:10202000CD0480E28093CE0401C0C0E0780186E553 -:10203000E80EF11C6801A6E7CA0ED11C5701F50194 -:10204000819191915F01009739F0DC01ED91FC9154 -:102050000680F781E02D0995AC14BD0481F78091CD -:10206000CE04803409F43FC050F4803221F1803333 -:10207000A1F1813109F082C0F60110820AC08135D8 -:1020800009F458C0803809F46AC0803509F076C078 -:1020900039C0D7018D919D917D01009739F0DC0108 -:1020A000ED91FC910480F581E02D0995EC14FD047F -:1020B00081F782E161C00E94E8060091CA04109194 -:1020C000CB042091CC043091CD04DC01CB01801BEA -:1020D000910BA20BB30BB7FD51C061E088EE0E94DB -:1020E0002B0980E449C088EE0E941A0980FD46C091 -:1020F00088ED0E941A09682F686088ED0E942B09FC -:1021000080E53AC088EC0E941A0986FF37C081E555 -:102110008093CE040E94E806DC01CB014496A11D09 -:10212000B11D8093CA049093CB04A093CC04B093C8 -:10213000CD0424C00E94E806C090CA04D090CB040D -:10214000E090CC04F090CD04DC01CB018C199D090A -:10215000AE09BF09B7FD12C080E88093CE042C2FD2 -:1021600040E060E0C8010E946A0E882321F0823DB1 -:1021700029F080EA01C080E98093CE04CF911F91BD -:102180000F91FF90EF90DF90CF90BF90AF900895A8 -:1021900080E0089580E0089581E00895FC01828543 -:1021A000089581E0693009F080E00895CF93DF93CE -:1021B000EC018A819B81DC01ED91FC910480F58129 -:1021C000E02D6A8509958A85813439F4EA81FB819D -:1021D000EA58FF4F8081846080831A861B861C86A4 -:1021E0001D861E861F86188A80E0DF91CF91089594 -:1021F0008F929F92AF92BF92CF92EF920F93A42EA5 -:10220000B12CB22A1F921F921F921F921F921F92EF -:10221000812C912CC12CE62E01E023E240E0FC0150 -:102220006285828193810E94A90C0F900F900F907C -:102230000F900F900F900F91EF90CF90BF90AF90B5 -:102240009F908F9008958F929F92AF92BF92CF925E -:10225000EF920F93A62EB12C1F921F923F932F93B4 -:102260005F934F934A01C12CE12C00E023EA40E048 -:10227000FC016285828193810E94A90C0F900F90CE -:102280000F900F900F900F900F91EF90CF90BF9005 -:10229000AF909F908F9008958F929F92AF92BF9230 -:1022A000CF92EF920F93A42EB12CB22A1F921F92BD -:1022B0001F921F921F921F92812C912CC12CE62EEF -:1022C00003E023E240E0FC016285828193810E9469 -:1022D000A90C0F900F900F900F900F900F900F91EF -:1022E000EF90CF90BF90AF909F908F9008952F92D6 -:1022F0003F924F925F926F927F928F929F92AF9296 -:10230000BF92CF92DF92EF92FF920F931F93CF93E2 -:10231000DF93CDB7DEB7E8970FB6F894DEBF0FBEF8 -:10232000CDBFDC011A963C91311107C1122F242E2A -:10233000362E3C01FC01C280D380D601ED91FC9188 -:102340000190F081E02D60E0C60109957C010097C5 -:1023500009F4F5C0FC01A080B180A114B10409F416 -:10236000F0C04301F4E08F0E911CDC0111969C92A9 -:102370008E9214961C93FE0131962F018F0128E056 -:1023800030E040E060E0D30112968D919C9113976C -:102390000E94890DF70114828111D9C08D81893085 -:1023A00009F0D1C00981D601ED91FC910280F38141 -:1023B000E02D222D41E0632DC6010995F3018287AE -:1023C000882309F4C2C098859583282F40E060E0F7 -:1023D000828193810E94FF0D182F882389F0D701F5 -:1023E000AD92BC92D601ED91FC910480F581E02D77 -:1023F000D3011A966C91C6010995F3011286ABC000 -:10240000202F013208F020E2D701AD92BC922111B9 -:102410000BC0940142E0F3016285828193810E94A6 -:10242000B908811197C010C030E0820140E0D301AB -:102430001A966C911A9712968D919C9113970E94FF -:10244000890D811187C0E5CF1F921F925F924F9235 -:102450001F9288E08F9388E0882E912CA12CB12CBC -:1024600099E2C92EE12C06E020EA40E0F301628502 -:10247000828193810E94A90C182F0F900F900F90CA -:102480000F900F900F90811166C08B81D3011B9626 -:102490008C931B97720100E028E030E040E01A9630 -:1024A0006C911A9712968D919C9113970E94B00D82 -:1024B000811150C02B813C8140E0F3016285828113 -:1024C00093810E94B00D811145C0298130E0CE0179 -:1024D00081967C0140E0D3011A966C911A9712966E -:1024E0008D919C9113970E94B00D811133C02E8164 -:1024F00040E0F3016285828193810E946D0F81111A -:1025000029C001E0D3011B968C91801740F020E098 -:10251000402F68E0C3010E944C110F5FF3CFD3013D -:102520001296ED91FC911397EA58FF4F80818460D9 -:10253000808381E050968C930EC019ED0CC016ED8F -:102540000AC017ED08C011ED06C014ED04C0F70174 -:10255000B182A082182F812FE8960FB6F894DEBFC3 -:102560000FBECDBFDF91CF911F910F91FF90EF90E4 -:10257000DF90CF90BF90AF909F908F907F906F90A3 -:102580005F904F903F902F900895CF92DF92FF92EF -:102590000F931F93CF93DF9300D000D0CDB7DEB75A -:1025A0008C01F62E19821A821B821C8220E0462F93 -:1025B00061E10E94F81020E04F2D60E1C8010E9407 -:1025C000F81020E04F2D64E0C8010E944C1183E018 -:1025D000C82ED12C9E012F5F3F4F44E050E06F2D5D -:1025E000C8010E9423118823F1F020E04F2D64E1FF -:1025F000C8010E94F81020E04F2D60E1C8010E9440 -:10260000F81064E170E080E090E00E94EA060F902C -:102610000F900F900F90DF91CF911F910F91FF902E -:10262000DF90CF90089589819A81AB81BC819D7F95 -:1026300083309140A041B105C1F264E670E080E0D2 -:1026400090E00E94EA0681E0C81AD10819F6CDCFC1 -:10265000FC0183E991E09183808373836283128616 -:1026600013861486158616861786108A148288E0CB -:1026700085839CE3968391E09783808784E08187BC -:1026800061157105B1F0DB01AA5ABF4F80E090E0FF -:102690002D913D91232B49F48B96880F991FDB01D7 -:1026A000A80FB91FED93FC93089501968031910511 -:1026B00079F70895EF92FF920F931F93CF938C01B8 -:1026C000C62F7A01FA0180819181A281B381813084 -:1026D000F3E09F07F1E0AF07B105D1F060F4811599 -:1026E000E1E09E07AE07B10571F181309140A14054 -:1026F000B10571F064C0833021E0920720E1A207A8 -:10270000B105E1F183309340A041B105B9F157C063 -:102710008091CF04811153C020E04C2F61E1C801AA -:102720000E94F81020E04C2F60E1C8010E94F810D0 -:1027300020E04C2F64E0C8010E944C1181E080939E -:10274000CF0481EB3DC020E0462F61E1C8010E942B -:10275000F81020E04C2F60E1C8010E94F8101092A0 -:10276000CF04F80162856770C770660F660F660F49 -:102770006C2B828193810E94D60821C020E04C2FCF -:1027800064E1C8010E94F81020E04C2F60E1C8010C -:102790000E94F81064E170E080E090E00E94EA0698 -:1027A000F8016285F70121812695217067704C2F11 -:1027B000F801828193810E946A0E1092CF0480E01A -:1027C000CF911F910F91FF90EF900895CF92DF92DC -:1027D000EF920F931F93CF93DF93CDB7DEB72E9772 -:1027E0000FB6F894DEBF0FBECDBF6C0181E090E064 -:1027F0009E878D87E12C8E010F5F1F4F9E01235F07 -:102800003F4F41E0F6016285828193810E94920FE1 -:10281000811151C002E011E089818023D1F0198635 -:102820001A861B861C869E01275F3F4F44E050E0BE -:10283000612FC6010E94231181110BC0AE01475FB9 -:102840005F4F612FC6010E945A13813B99F181119C -:1028500032C0000F1F5F1830F9F611E0F6018385D2 -:10286000811740F119861A861B861C869E01275FF8 -:102870003F4F44E050E0612FC6010E9423118111B7 -:1028800017C089859A85877091708130914081F455 -:102890008B859C8581609C878B87AE01475F5F4FEE -:1028A000612FC6010E945A13813B21F0811103C0A0 -:1028B0001F5FD4CF80E02E960FB6F894DEBF0FBE18 -:1028C000CDBFDF91CF911F910F91EF90DF90CF900F -:1028D00008950F931F93CF93DF93FC01208921115B -:1028E00002C080E020C0EC010E94E8060C851D8536 -:1028F0002E853F85DC01CB01801B910BA20BB30B16 -:10290000B7FDEFCFCE010E94E613182F0E94E80614 -:10291000DC01CB018C599F4FAF4FBF4F8C879D87F8 -:10292000AE87BF87812FDF91CF911F910F910895BF -:102930008091DC05089508950895CF93DF93209149 -:10294000F905243049F521E02093E90021E82150E0 -:1029500059F03091E80035FD07C0EFE3F1E0319721 -:10296000F1F700C00000F3CF2091E80025FF14C06C -:10297000EC0140E050E068E070E00E94A018809117 -:10298000E8008E778093E80088E0FE01A4EDB5E0D2 -:1029900001900D928A95E1F7DF91CF910895CF9341 -:1029A000C091D204C1110BC00E944D07643C794014 -:1029B0008105910520F081E08093D204C1E08C2F45 -:1029C000CF910895FF920F931F93CF93DF93D82F4A -:1029D0000FB607FE83C08091F905843081F08091A5 -:1029E000040190E001962091060130E082239323B8 -:1029F0002091050130E08217930709F0CDC00E94B5 -:102A0000CF14811110C08091040190E001962091B3 -:102A1000060130E0822393232091050130E08217E4 -:102A2000930709F0B9C00E9441078C01C091E900E9 -:102A3000CF709091EC00892F817090FD80E8C82BB9 -:102A400082E08093E90085E0F82E8091EB0085FD1F -:102A500042C08091EB0080FF3EC08091EE0087FF76 -:102A60003AC08091050190910401981709F457C06C -:102A70009091E80095FF8EC0E0910201F091030172 -:102A8000E80FF11D20818F5F9091060189238093CB -:102A900005012093F1008091E80085FDE2CF80914F -:102AA000E80080FFDECF8091E8008E778093E80019 -:102AB000F0920101D6CF8091040190E0019620911F -:102AC000060130E0822393232091050130E0821734 -:102AD000930709F44CC0CF70C093E9004091040102 -:102AE000842F90E001962091060130E08223932309 -:102AF0002091050130E08217930709F450C0E0915E -:102B00000201F0910301E40FF11DD08380910401D3 -:102B10008F5F9091060189238093040140C08091CA -:102B2000E80085FF37C0D093F10021E03091F30039 -:102B30008091F20090E0932B892B91F08091E80036 -:102B400080FF0EC08091E80085FF03C01092F10065 -:102B5000F9CF8091E8008E778093E800F092010130 -:102B6000222309F4A8CFCF70C093E90018C0809148 -:102B70000101882309F4AFCF0E9441079C0180170F -:102B8000910711F4890161CF9091010191509093C7 -:102B90000101F8CF20E0CACF40910401B0CF80E01E -:102BA000DF91CF911F910F91FF900895089580912B -:102BB000F805811104C00E940A1B0C94671B08953C -:102BC0001092F8050895089542E061EC81E00E94BA -:102BD000191842E261EC82E00C9419188091FB050F -:102BE000833009F453C030F4813071F0823009F43D -:102BF000BAC008958A3009F4A6C08B3009F478C0B1 -:102C0000893009F0C8C020C08091FA05813A09F0E6 -:102C1000C2C08091E800877F8093E8008091FE0524 -:102C20009091FF05892B21F468E084ED95E003C0C5 -:102C300060E080E090E070E00E94EB188091E80096 -:102C40008B778093E80008958091FA05813209F02E -:102C5000A2C08091FE059091FF05892B09F09BC0D1 -:102C60008091E800877F8093E8008091E80082FDF2 -:102C700005C08091F9058111F8CF8DC08091F100D8 -:102C80008093DC058091E8008B7781C08091FA0504 -:102C9000813A09F080C08091FE059091FF05892B53 -:102CA000A1F48091E800877F8093E8008091E8009C -:102CB00080FFFCCF809112018093F1008091E800A9 -:102CC0008E778093E8000E944E188091FE059091C7 -:102CD000FF05892B09F05FC08091E800877F809312 -:102CE000E8008091E80080FFFCCF809111014AC08C -:102CF0008091FA05813209F04EC08091FE059091D5 -:102D0000FF05892B69F48091E800877F8093E800B4 -:102D10000E944E188091FC05809312010E94141E9F -:102D20008091FE059091FF05892BA9F58091E8001F -:102D3000877F8093E8000E944E188091FC05809365 -:102D400011010C94141E8091FA05813221F58091B5 -:102D5000E800877F8093E8000E944E188091FD056F -:102D60008093DD0508958091FA05813AA1F4809160 -:102D7000E800877F8093E8008091E80080FFFCCF27 -:102D80008091DD058093F1008091E8008E7780933B -:102D9000E8000C944E1808958091DC058093D304CC -:102DA0001092DC050E94231D0C94141E0C94CC166A -:102DB0000E9441208091F705882329F00E946A2013 -:102DC00081110C94031808950E9472208091D304FD -:102DD0008093DC0508950C94E4160895CF9384B78E -:102DE000877F84BF0FB6F894A895809160008861B2 -:102DF00080936000109260000FBE90E080E80FB6F4 -:102E0000F89480936100909361000FBE82EE94E18C -:102E10000E94D91F87E091E00E949C1C89E592E006 -:102E20000E9414020E94AE060E94E41C0E940A1B2B -:102E30000E94671B78940E94E61C8091F9058430FB -:102E400019F00E94ED16F9CF87E492E00E94140277 -:102E50000E94C10585E392E00E941402C2E08091C5 -:102E6000F905853019F40E94D816F9CF0E94EA1CA2 -:102E70002091E4003091E5008091D0049091D1043C -:102E80002817390761F38091E4009091E500909351 -:102E9000D1048093D0040E94CF14882301F3809141 -:102EA000F9058430E1F68091E9008F702091EC0003 -:102EB000922F917020FD90E8892BC093E9009091AA -:102EC000EB0090FF43C09091EE0097FF3FC09091C0 -:102ED000050120910401291709F12091E80025FF3F -:102EE0001DC0E0910201F0910301E90FF11D308155 -:102EF0009F5F209106019223909305013093F1008A -:102F00009091E80095FDE3CF9091E80090FFDFCF2E -:102F10009091E8009E779093E800D9CF9091F300CC -:102F20002091F20030E0392B232B81F09091E800C2 -:102F300090FF0CC09091E80095FF03C01092F10043 -:102F4000F9CF9091E8009E779093E8008F7080937E -:102F5000E90085CF292F332723303105C9F060F4EC -:102F60002130310581F02230310509F044C082E47E -:102F700090E02CEA32E043C021323105E1F0223208 -:102F8000310549F138C082E190E02EEE32E037C0E1 -:102F900099278130910549F028F0029761F5E0E723 -:102FA000F2E005C0E8EAF2E002C0EEE9F2E0849166 -:102FB00090E09F0124C06115710541F061307105F9 -:102FC000D1F489E090E027ED32E019C089E090E08B -:102FD0002EEB32E014C06115710541F061307105CE -:102FE00051F482E290E020E033E009C080E490E018 -:102FF00022E233E004C080E090E020E030E0FA011B -:1030000031832083089580E189BD82E189BD09B4BF -:1030100000FEFDCF8091D8008F7D8093D8008091F5 -:10302000E00082608093E0008091E00081FDFCCFB1 -:103030000895982F973068F59093E900981739F024 -:103040007091EC002091ED005091F00003C0242F0E -:10305000762F50E021FD02C09F5FECCF3091EB0056 -:103060003E7F3093EB003091ED003D7F3093ED00DB -:103070003091EB0031603093EB007093EC002093C3 -:10308000ED005093F0002091EE0027FDE5CF80E0A9 -:1030900008958F708093E90081E008958091FA058A -:1030A00087FF11C08091E80082FD05C08091F9057D -:1030B0008111F8CF11C08091E8008B770BC080910F -:1030C000F905882349F08091E80080FFF8CF8091CE -:1030D000E8008E778093E80008952091E400309115 -:1030E000E50095E64091EC00842F817040FF23C0FD -:1030F0008091E80080FD1DC08091F905882399F03A -:10310000853099F08091EB0085FD11C04091E4007D -:103110005091E5002417350729F3915011F09A01D9 -:10312000E1CF84E0089582E0089583E0089581E08E -:10313000089580E008954091E80042FFDDCF0895B2 -:10314000CF92DF92EF92FF920F931F93CF93DF9373 -:10315000EC018B017A010E946D18811133C0E114DA -:10316000F10439F0F70180819181081B190BC80F18 -:10317000D91FC12CD12C0115110519F18091E8003E -:1031800085FD16C08091E8008E778093E800E114F9 -:10319000F10449F0F70180819181C80ED91ED182D6 -:1031A000C08285E00FC00E946D18882321F30AC0F9 -:1031B00089918093F10001501109FFEFCF1ADF0AC6 -:1031C000DACF80E0DF91CF911F910F91FF90EF90C8 -:1031D000DF90CF90089520910006309101062617C8 -:1031E000370748F06115710539F42091E8002E7712 -:1031F0002093E80001C0B901FC0120E061157105D0 -:1032000079F18091F9058823F1F18530F1F1809110 -:10321000E80083FD3CC08091E80082FD2EC08091D3 -:10322000E80080FFEBCF2091F3008091F20090E066 -:10323000922B6115710551F08830910538F4219178 -:103240002093F100615071090196F3CF21E00897B6 -:1032500009F020E08091E8008E778093E800CECFDF -:103260002111CFCF0AC08091F905882361F0853004 -:1032700061F08091E80083FD0AC08091E80082FF40 -:10328000F2CF80E0089582E0089583E0089581E020 -:10329000089520910006309101062617370748F05F -:1032A0006115710539F42091E8002E772093E8002C -:1032B00001C0B901FC0120E06115710591F1809117 -:1032C000F905882309F440C0853009F43FC0809196 -:1032D000E80083FD3DC08091E80082FD2FC0809111 -:1032E000E80080FFE9CF2091F3008091F20090E0A8 -:1032F000922B6115710559F08830910540F42491A5 -:103300002093F1003196615071090196F2CF21E0CE -:10331000089709F020E08091E8008E778093E8001C -:10332000CBCF2111CCCF0AC08091F905882361F061 -:10333000853061F08091E80083FD0AC08091E8004B -:1033400082FFF2CF80E0089582E0089583E008953F -:1033500081E008951F93CF93DF93CDB7DEB7AA978F -:103360000FB6F894DEBF0FBECDBFEAEFF5E0809157 -:10337000F100819326E0E230F207C9F70E94EE15D2 -:103380008091E80083FF2EC18091FA059091FB05A2 -:10339000492F50E04A30510508F024C1FA01EA5A99 -:1033A000FF4F0C94F022803821F0823809F01AC1C6 -:1033B00008C08091F6059091F705992389F0826005 -:1033C0000FC08091FE058F70873008F00BC180938D -:1033D000E9008091EB0085FB882780F91092E900D5 -:1033E0009091E800977F9093E8008093F10010920D -:1033F000F100D1C0282F2D7F09F0F4C0882319F0E7 -:10340000823061F0EFC08091FC05813009F0EAC0A4 -:10341000933009F080E08093F7052EC08091FC0581 -:1034200081112AC08091FE058F702FEF280F263062 -:1034300008F0D8C08093E9002091EB0020FF1CC069 -:10344000933021F48091EB00806214C09091EB00E6 -:1034500090619093EB0021E030E0A90102C0440F9D -:10346000551F8A95E2F74093EA001092EA00809196 -:10347000EB0088608093EB001092E9008091E800F7 -:10348000877F8093E8000E944E18ACC08111AAC0CB -:103490001091FC051F778091E3008078812B809349 -:1034A000E3008091E800877F8093E8000E944E1837 -:1034B0008091E80080FFFCCF8091E30080688093DA -:1034C000E300111102C082E001C083E08093F9059E -:1034D00089C08058823008F085C08091FC059091A9 -:1034E000FD058C3D53E0950779F583E08A838AE2F8 -:1034F00089834FB7F894DE01139620E03EE051E255 -:10350000E32FF0E050935700E49120FF03C0E295D1 -:10351000EF703F5FEF708E2F90E0EA3010F0C796AB -:1035200001C0C0968D939D932F5F243149F74FBF03 -:103530008091E800877F8093E8006AE270E0CE0126 -:1035400001960E94EB1816C06091FE057091FF0570 -:10355000AE014F5F5F4F0E94AA17BC01892B09F48F -:1035600041C09091E800977F9093E80089819A810B -:103570000E9449198091E8008B778093E80032C05F -:10358000803881F58091E800877F8093E800809102 -:10359000F5058093F1008091E8008E7772CF81115C -:1035A00021C08091FC059091FD0599270297D4F4E4 -:1035B0008091E800877F8093E8008091FC058093EC -:1035C000F5050E944E188091F505811106C0809185 -:1035D000E30087FD02C081E001C084E08093F9052B -:1035E0000E94E4158091E80083FF0AC08091E80002 -:1035F000877F8093E8008091EB0080628093EB00EE -:10360000AA960FB6F894DEBF0FBECDBFDF91CF9163 -:103610001F9108950E94781B0E94801BE0EEF0E04D -:10362000808181608083E8EDF0E080818F77808306 -:1036300019BCA7EDB0E08C918E7F8C9380818F7E3A -:1036400080831092F80508950F931F93CF93DF9313 -:103650000E94781B0E94801BC8EDD0E088818F7784 -:10366000888388818068888388818F7D888319BC5E -:103670001092F9051092F5051092F7051092F605D3 -:1036800000EE10E0F80180818B7F8083888181606B -:10369000888342E060E080E00E941918E1EEF0E0EB -:1036A00080818E7F8083E2EEF0E080818160808384 -:1036B000808188608083F80180818E7F808388810B -:1036C00080618883DF91CF911F910F910895E8ED7C -:1036D000F0E080818F7E8083E7EDF0E08081816083 -:1036E000808384E082BF81E08093F8050C94241BE2 -:1036F000E8EDF0E080818E7F80831092E2000895F3 -:103700001092DA001092E10008951F920F920FB606 -:103710000F9211242F933F934F935F936F937F9357 -:103720008F939F93AF93BF93EF93FF938091E100AB -:1037300082FF0BC08091E20082FF07C08091E10010 -:103740008B7F8093E1000E949B1C8091DA0080FFB8 -:103750001FC08091D80080FF1BC08091DA008E7F4F -:103760008093DA008091D90080FF0DC080E189BD8F -:1037700082E189BD09B400FEFDCF81E08093F905A7 -:103780000E94D71505C019BC1092F9050E94E015DA -:103790008091E10080FF19C08091E20080FF15C098 -:1037A0008091E2008E7F8093E2008091E200806150 -:1037B0008093E2008091D80080628093D80019BC89 -:1037C00085E08093F9050E94D6168091E10084FF80 -:1037D00030C08091E20084FF2CC080E189BD82E18D -:1037E00089BD09B400FEFDCF8091D8008F7D809304 -:1037F000D8008091E1008F7E8093E1008091E2000B -:103800008F7E8093E2008091E20081608093E200ED -:103810008091F505882311F084E007C08091E300D2 -:1038200087FD02C081E001C083E08093F9050E941A -:10383000EB168091E10083FF29C08091E20083FFB5 -:1038400025C08091E100877F8093E10082E0809332 -:10385000F9051092F5058091E1008E7F8093E100DB -:103860008091E2008E7F8093E2008091E20080618F -:103870008093E20042E060E080E00E9419188091AD -:10388000F00088608093F0000E94E315FF91EF91B3 -:10389000BF91AF919F918F917F916F915F914F9168 -:1038A0003F912F910F900FBE0F901F9018951F9270 -:1038B0000F920FB60F9211242F933F934F935F9364 -:1038C0006F937F938F939F93AF93BF93CF93DF9328 -:1038D000EF93FF93C091E900CF708091EC00D82F57 -:1038E000D17080FDD0E81092E9008091F000877FD0 -:1038F0008093F00078940E94AA191092E9008091B8 -:10390000F00088608093F000CD2BCF70C093E90069 -:10391000FF91EF91DF91CF91BF91AF919F918F91E7 -:103920007F916F915F914F913F912F910F900FBEBB -:103930000F901F90189508959093E3058093E205EA -:103940000895E091E205F091E305309721F00190B0 -:10395000F081E02D099480E00895E091E205F09176 -:10396000E305309721F00280F381E02D099408955A -:103970002091E0053091E1052817390771F0909307 -:10398000E1058093E005E091E205F091E3053097D1 -:1039900021F00680F781E02D099408952091DE053D -:1039A0003091DF052817390771F09093DF05809378 -:1039B000DE05E091E205F091E305309721F0008407 -:1039C000F185E02D099408950C94241D0E94380778 -:1039D0000C94C005CF93DF9300D000D01F92CDB7D9 -:1039E000DEB70E94C8058FEF89838A831B820E94FD -:1039F00041078160782F9D838C8349815A816B8137 -:103A00008D810E94C41E0E94CA050E94A11C909133 -:103A1000E405891769F00E94A11C8093E4050F90CA -:103A20000F900F900F900F90DF91CF910C943D204D -:103A30000F900F900F900F900F90DF91CF910895FE -:103A400008950C94201D08950895089508958823DD -:103A500009F4BBC09CEF980F913A18F40E94471FDD -:103A60000DC090E2980F983058F4877091E001C033 -:103A7000990F8A95EAF7892F0E94821F0C94B31F31 -:103A80009BE5980F933070F4853A29F0863A31F02F -:103A900083E890E005C081E890E002C082E890E011 -:103AA0000C94B81C98E5980F973108F08EC0883AAE -:103AB00009F445C0893A09F445C08A3A09F445C079 -:103AC0008B3A09F445C08C3A09F445C08D3A09F4A3 -:103AD00045C08E3A09F445C08F3A09F445C0813B90 -:103AE00009F445C0803B09F445C0823B09F445C058 -:103AF000833B09F445C0843B09F445C0853B09F488 -:103B000045C0863B09F445C0873B09F445C0883B66 -:103B100009F445C0893B09F445C08A3B09F445C016 -:103B20008B3B09F445C08C3B09F445C08D3B09F43F -:103B300045C08E3B09F445C080E090E044C082EE71 -:103B400090E041C089EE90E03EC08AEE90E03BC03C -:103B500085EB90E038C086EB90E035C083EB90E0D9 -:103B600032C084EB90E02FC087EB90E02CC08CEC4F -:103B700090E029C08DEC90E026C083E891E023C05E -:103B80008AE891E020C082E991E01DC084E991E0DB -:103B90001AC081E292E017C083E292E014C084E28E -:103BA00092E011C085E292E00EC086E292E00BC086 -:103BB00087E292E008C08AE292E005C08FE690E0DA -:103BC00002C080E790E00C94CE1C0895882329F170 -:103BD0009CEF980F913A18F40E94641F0DC090E278 -:103BE000980F983058F4877091E001C0990F8A952A -:103BF000EAF7892F0E94881F0C94B31F9BE5980F4A -:103C0000933020F480E090E00C94B81C885A8731FF -:103C100020F480E090E00C94CE1C08950E949F1F39 -:103C20000E94741F0C94B31F0E948F1F0C940E1ED1 -:103C3000EF92FF920F931F93CF93DF9300D000D0AA -:103C40001F92CDB7DEB78C010E943F20811190C03A -:103C500085E0F801DE01119601900D928A95E1F759 -:103C6000F80140815181238134812115310531F0E2 -:103C70005F3F31F481E04F3F19F403C081E001C0A0 -:103C800080E080FD75C0F801E28049835A83EB82B1 -:103C9000722F3D832C836E2D8D810E94011FF82E83 -:103CA000492F4F70892F82958F708E30B1F108F0B7 -:103CB00050C0823008F05CC0907F142F11F0129534 -:103CC000107FEE20A9F0112329F0812F0E94921F6E -:103CD0000E94B31F8F2D0F900F900F900F900F9099 -:103CE000DF91CF911F910F91FF90EF900C94271DC2 -:103CF0008F2D0E94E61D1123D9F1812F0E94981F5C -:103D00000F900F900F900F900F90DF91CF911F9118 -:103D10000F91FF90EF900C94B31FF11029C0EE208B -:103D200039F10E94141EFFEF20E782E0F15020409D -:103D30008040E1F700C000000F900F900F900F90AF -:103D40000F90DF91CF911F910F91FF90EF900C9406 -:103D50009F206F2DC8010F900F900F900F900F9024 -:103D6000DF91CF911F910F91FF90EF900C94BE20A7 -:103D70000F900F900F900F900F90DF91CF911F91A8 -:103D80000F91FF90EF900895CF93DF93CDB7DEB7FB -:103D90002A970FB6F894DEBF0FBECDBF942F4E8387 -:103DA000252F5F83688779878A8749855A85452BC0 -:103DB00031F02F3F31F481E09F3F19F403C081E0DF -:103DC00001C080E080FD07C04E815F8168857985F4 -:103DD0008A850E942E2085E0FE013696DE0111962E -:103DE00001900D928A95E1F7CE0101960E94181E6E -:103DF0002A960FB6F894DEBF0FBECDBFDF91CF91EC -:103E000008950F931F93CF93DF9300D000D01F929C -:103E1000CDB7DEB7042F49835A836B837C838D83B0 -:103E20002C813D81232B31F05F3F31F481E04F3F06 -:103E300019F403C081E001C080E080FF03C080E08E -:103E400090E01BC08B8110E0882379F06091E5053C -:103E50007091E6058091E7059091E8050E94DE1FCC -:103E6000F801EB51FA4F808304C0F801EB51FA4F8F -:103E7000808169817A810E94CE200F900F900F90EF -:103E80000F900F90DF91CF911F910F910895209186 -:103E9000130130911401F90132969FEF40E05191E6 -:103EA000851789F09F3F19F4511101C0942F4F5F7E -:103EB0004630A9F79F3F39F0F901E90FF11D97FD51 -:103EC000FA95828308950895E0911301F091140109 -:103ED0009F012A5F3F4F9281891301C01282319660 -:103EE000E217F307C1F7089581E090E0E091130134 -:103EF000F0911401E80FF91F1082019688309105A6 -:103F0000A9F708959091F305892B8093F3050895FF -:103F100080959091F30589238093F305089510927D -:103F2000F30508959091F205892B8093F205089589 -:103F300080959091F20589238093F205089510925F -:103F4000F20508958091130190911401FC013196BE -:103F50009C01285F3F4F80E0919191118F5FE217A4 -:103F6000F307D1F70895E0911301F09114018091C6 -:103F7000F3058083E0911301F09114019081809109 -:103F8000F205892B80838091E905882361F0E09117 -:103F90001301F09114019081892B80830E94A21F4C -:103FA00081111092E90580911301909114010C94F4 -:103FB000AD1C9093A7018093A6010895CF92DF9244 -:103FC000EF92FF926C01EE24FF24C114D104E104AE -:103FD000F10421F0C701B60120E101C020E0C72EA5 -:103FE000D82EE92EFF24C114D104E104F10419F004 -:103FF000285FC701B6016B017C0154E0F694E79499 -:10400000D794C7945A95D1F7C114D104E104F104AF -:1040100019F02C5FC701B6016B017C0142E0F694F8 -:10402000E794D794C7944A95D1F7C114D104E10419 -:10403000F10419F02E5FC701B601DC01CB01B69582 -:10404000A79597958795892B8A2B8B2B09F02F5F46 -:10405000822FFF90EF90DF90CF900895CF93DF9362 -:1040600000D000D01F92CDB7DEB70F900F900F9009 -:104070000F900F90DF91CF9108950C94211D80E057 -:1040800008958091F905843021F11092F40520E41F -:1040900088E190E00FB6F894A895809360000FBE79 -:1040A0002093600083B7817F846083BF83B7816082 -:1040B00083BF7894889583B78E7F83BF0FB6F894BB -:1040C000A8958091600088618093600010926000E4 -:1040D0000FBE08950E94251D0E94C8050E94261D3E -:1040E00080E008950E94231D0C94141E1F920F92CD -:1040F0000FB60F9211248F939F93AF93BF9380912C -:10410000F405811113C08091C6049091C704A09159 -:10411000C804B091C9044196A11DB11D8093C60485 -:104120009093C704A093C804B093C904BF91AF9102 -:104130009F918F910F900FBE0F901F9018950E9426 -:104140000A1BF89487E797E790930108809300088B -:1041500087E090EBDC018093020690930306A09326 -:104160000406B09305069CE088E10FB6F894A89584 -:10417000809360000FBE90936000FFCF0895E62FFC -:10418000F0E0EB5CFD4F84910895E82FF0E0EE0F36 -:10419000FF1FED54FF4F8591949108950E94BF2019 -:1041A00090E4980F903218F40E94C52008958F3B38 -:1041B00050F4883A48F5853AD0F48430A8F4813038 -:1041C00009F4B2C0AEC0883E40F4803E68F48F3B34 -:1041D00009F0A7C020E030EEA9C0803F08F4A1C0DC -:1041E000282F30E03065A2C0282F30E09FC0853AEC -:1041F00029F0863A31F023E830E498C021E830E431 -:1042000095C022E830E492C0883A09F445C0893A62 -:1042100009F445C08A3A09F445C08B3A09F445C00F -:104220008C3A09F445C08D3A09F445C08E3A09F438 -:1042300045C08F3A09F445C0813B09F445C0803B35 -:1042400009F445C0823B09F445C0833B09F445C0ED -:10425000843B09F445C0853B09F445C0863B09F41D -:1042600045C0873B09F445C0883B09F445C0893BFC -:1042700009F445C08A3B09F445C08B3B09F445C0AD -:104280008C3B09F445C08D3B09F445C08E3B09F4D5 -:1042900045C020E034E44AC022EE34E447C029EEB1 -:1042A00034E444C02AEE34E441C025EB34E43EC09B -:1042B00026EB34E43BC023EB34E438C024EB34E495 -:1042C00035C027EB34E432C02CEC34E42FC02DECA5 -:1042D00034E42CC023E835E429C02AE835E426C0BC -:1042E00022E935E423C024E935E420C021E236E4A4 -:1042F0001DC023E236E41AC024E236E417C025E2EA -:1043000036E414C026E236E411C027E236E40EC0DB -:104310002AE236E40BC02FE634E408C020E734E498 -:1043200005C020E030E002C021E030E0C90108957E -:104330000E94092208F481E008950E945D2288F01D -:104340009F5798F0B92F9927B751B0F0E1F0660F59 -:10435000771F881F991F1AF0BA95C9F714C0B1309A -:1043600091F00E947722B1E008950C947722672F94 -:10437000782F8827B85F39F0B93FCCF386957795C9 -:104380006795B395D9F73EF49095809570956195B2 -:104390007F4F8F4F9F4F0895E89409C097FB3EF4DD -:1043A00090958095709561957F4F8F4F9F4F992382 -:1043B000A9F0F92F96E9BB279395F6958795779500 -:1043C0006795B795F111F8CFFAF4BB0F11F460FFC0 -:1043D0001BC06F5F7F4F8F4F9F4F16C0882311F018 -:1043E00096E911C0772321F09EE8872F762F05C02C -:1043F000662371F096E8862F70E060E02AF09A95C7 -:10440000660F771F881FDAF7880F9695879597F9BB -:104410000895990F0008550FAA0BE0E8FEEF161655 -:104420001706E807F907C0F012161306E407F507A8 -:1044300098F0621B730B840B950B39F40A2661F01C -:10444000232B242B252B21F408950A2609F4A140BF -:10445000A6958FEF811D811D089597F99F6780E8CC -:1044600070E060E008959FEF80EC089500240A94C6 -:104470001616170618060906089500240A9412163F -:104480001306140605060895092E0394000C11F472 -:10449000882352F0BB0F40F4BF2B11F460FF04C01F -:1044A0006F5F7F4F8F4F9F4F089557FD9058440F78 -:1044B000551F59F05F3F71F04795880F97FB991F83 -:1044C00061F09F3F79F08795089512161306140640 -:1044D000551FF2CF4695F1DF08C0161617061806CD -:1044E000991FF1CF86957105610508940895E894A8 -:1044F000BB2766277727CB0197F908950E940922E9 -:1045000008F48FEF08950E9496220C9444220E9492 -:10451000362238F00E943D2220F0952311F00C94B1 -:104520002D220C94332211240C9478220E945522BF -:1045300070F3959FC1F3950F50E0551F629FF001F6 -:10454000729FBB27F00DB11D639FAA27F00DB11D0F -:10455000AA1F649F6627B00DA11D661F829F222798 -:10456000B00DA11D621F739FB00DA11D621F839F1F -:10457000A00D611D221F749F3327A00D611D231FF5 -:10458000849F600D211D822F762F6A2F11249F5743 -:1045900050409AF0F1F088234AF0EE0FFF1FBB1F46 -:1045A000661F771F881F91505040A9F79E3F510505 -:1045B00080F00C942D220C9478225F3FE4F3983E17 -:1045C000D4F3869577956795B795F795E7959F5FAF -:1045D000C1F7FE2B880F911D9695879597F9089541 -:1045E000EE0FFF1F0590F491E02D0994F894FFCF92 -:1045F0000105D4040000FF98149D149B14D6159C4B -:10460000140101EA0572636F6465002F2F20556E57 -:104610006B6E6F776E204849442044657363205465 -:104620007970653A002F2F20556E6B6E6F776E2074 -:104630004465736320547970653A00206C656E00A0 -:104640002F2F20696456656E646F72002F2F2069CA -:104650006450726F64756374002F2F206C616E67F5 -:1046600069640000000000C606CC06C206C506BC90 -:1046700006BF06BF0600000000E7078E07470800D8 -:104680000000007711C810D6106914CE10C512CAE8 -:0646900010D110CC100057 +:1001B0006F6E3A2000427566666572206973206E24 +:1001C0006F7420656E6F756768210D0A000D0A2F28 +:1001D0002F20436F6E66696725643A000D0A2F2F42 +:1001E000205265706F727425643A206C656E3A25F2 +:1001F0003034580D0A000D0A2F2F2069496E74659E +:1002000072666163653A20000D0A000D0A0053749E +:1002100072696E6725643A20000D0A002530325855 +:1002200020002F2F20000D0A0020000D0A455252F9 +:100230004F523A253032580D0A0025733A25303492 +:10024000580D0A0025733A253032580D0A00253022 +:1002500032580000000D0A0020000A4B6579626FD9 +:100260006172642073746172742E0A000A555342DD +:1002700020636F6E666967757265642E0A000A0AEC +:10028000544D4B3A66623665653130662B2F4C55BE +:1002900046410A0A002C0355005300420020004446 +:1002A0000065007300630072006900700074006FE5 +:1002B0000072002000440075006D0070006500723F +:1002C000000000080354004D004B00000004030927 +:1002D0000409024200020100A032090400000103E7 +:1002E00001010009211101000122400007058103DD +:1002F00008000A090401000203000000092111019D +:1003000000012222000705820320000107050203E5 +:100310002000011201100100000008EDFE5B001436 +:1003200008010200010631FF0974A10109751500D9 +:1003300026FF009520750881020976150026FF002A +:10034000952075089102C005010906A1010507194C +:10035000E029E715002501950875018102950175D1 +:100360000881010508190129059505750191029576 +:1003700001750391010507190029FF150026FF00EB +:10038000950675088100C0005F07870711241FBE0E +:10039000CFEFDAE0DEBFCDBF04B603FE28C0809108 +:1003A000C7059091C805A091C905B091CA058730CD +:1003B000904BA740B04BD9F41092C7051092C805D6 +:1003C0001092C9051092CA0514BE0FB6F894A895EC +:1003D00080916000886180936000109260000FBE81 +:1003E0001092010810920008E0E0F8E3099511E08E +:1003F000A0E0B1E0E8E5F7E402C005900D92A63A6E +:10040000B107D9F725E0A6EAB1E001C01D92A73CEB +:10041000B207E1F711E0C6ECD1E004C02197FE017C +:100420000E94A423C43CD107C9F70E94A2170C94D0 +:10043000AA230C940000FF93EF93E091A601F091A2 +:10044000A701309709F00995EF91FF910895FC01FC +:100450008591803011F0EFDFFBCF0895FF27E0E2B8 +:1004600030E247FF0CC0419597FF09C0EDE260956F +:10047000709580959095611D711D811D911D27FFBF +:1004800002C0219530E350E2AA27660F771F881F2C +:10049000991FAA1FA41710F0A41B63955A95A9F7DA +:1004A000AA3008F0A95FA05DAF93F39561157105BF +:1004B0008105910541F7ED3211F4EF93F395F217B1 +:1004C00018F43F93F395FBCF8F91B5DFFA95E1F7E1 +:1004D0000895E991F9918591803021F0853219F0E4 +:1004E000AADFF9CF089520E0E89455915532C1F381 +:1004F000503311F4689455915A3348F4505390F3A3 +:10050000220F022E220F220F200D250FF4CF0EF402 +:10051000219589919991533619F3533729F1533520 +:1005200059F1BC0188279927E8945C3621F4899118 +:10053000999168945591543639F446EF7EF077FFDF +:100540000DC08FEF9FEF0AC055374AE039F058359C +:1005500040E121F0523642E009F00895FF93EF9315 +:100560007DDFEF91FF91B7CFFF93EF93FC01819176 +:100570008030B9F360DFFBCFFF93EF9368DFF1CFFB +:10058000DF93CF93CDB7DEB72596A3DFCF91DF9171 +:1005900008951F928F938EE492E09F938F930E9411 +:1005A000C0020F900F900F900F900895CF92DF929E +:1005B000EF92FF920F931F93CF93DF936B0179011B +:1005C0008A01C0E0D0E0CC15DD05D1F0F7018081D3 +:1005D00091818C0F9D1F9C012F703327232B19F0C5 +:1005E00088E592E004C0892B21F085E592E00E9425 +:1005F0002702F80181918F010E94C9022196E3CF61 +:10060000DF91CF911F910F91FF90EF90DF90CF90EE +:1006100008951F926F939F938F9384E492E09F932A +:100620008F930E94C0020F900F900F900F900F9029 +:100630000F9008957F936F939F938F938AE392E037 +:100640009F938F930E94C0020F900F900F900F9076 +:100650000F900F9008951F928F938BE292E09F93DB +:100660008F930E94C0020F900F900F900F900895EB +:10067000BF92CF92DF92EF92FF920F931F93CF938F +:10068000DF936C01B42E8B01C0E0D0E08CE1E82E4A +:1006900082E0F82ECC15DD051CF5CE018F70992770 +:1006A000892B19F089E292E00AC0209721F086E2B6 +:1006B00092E00E942702BB2021F082E292E00E9499 +:1006C0002702F80181918F011F928F93FF92EF9281 +:1006D0000E94C00221960F900F900F900F90DACFDA +:1006E00089E192E0DF91CF911F910F91FF90EF9000 +:1006F000DF90CF90BF900C9427026F927F928F92E1 +:100700009F92AF92BF92CF92DF92EF92FF920F93A0 +:100710001F93CF93DF93CDB7DEB7DA950FB6F8947A +:10072000DEBF0FBECDBF662309F45CC03A01162FB1 +:100730004C01CE0101966C017A01062F21E030E0D8 +:1007400040E0F401628184EC93E00E948B0E811101 +:1007500011C0A980B12CCE0101966C017301012F4B +:10076000950140E0F401628184EC93E00E948B0EDD +:10077000882319F00E942B0335C01F921F938EE02F +:1007800092E09F938F930E94C0020F900F900F9062 +:100790000F9012E0812F90E09C012F5F3F4F2A15B0 +:1007A0003B05A4F4E1E0F0E0EC0FFD1FE20FF31FC6 +:1007B0002081211109C0E1E0F0E0EC0FFD1FE80FFE +:1007C000F91F80810E941B021E5FE4CF8BE092E044 +:1007D0000E942702898141E0BE016F5F7F4F90E058 +:1007E0000E943803D3950FB6F894DEBF0FBECDBF7D +:1007F000DF91CF911F910F91FF90EF90DF90CF90FD +:10080000BF90AF909F908F907F906F9008958F9240 +:100810009F92AF92BF92CF92EF920F931F93CF937D +:10082000DF93CDB7DEB7C054D1090FB6F894DEBF61 +:100830000FBECDBF2CEA31E03F932F939E012F5F77 +:100840003F4F3F932F931F9220E42F934A015B0168 +:1008500022E2C22EE12C06E021E840E0FC016281A8 +:1008600084EC93E00E945D0D182F88E092E00E94D6 +:1008700027020F900F900F900F900F900F90112361 +:1008800019F0812F0E942B03812FC05CDF4F0FB620 +:10089000F894DEBF0FBECDBFDF91CF911F910F91B6 +:1008A000EF90CF90BF90AF909F908F9008958F92D0 +:1008B0009F92AF92BF92CF92DF92EF92FF921F93DF +:1008C000CF93DF936C01EA0110E0CB018D549E4F72 +:1008D0007C018CEDA82E81E0B82ECE15DF0508F046 +:1008E00056C06981613178F46F3008F04CC06430D3 +:1008F000B1F020F4613008F442C045C0653009F41D +:1009000042C086EF08C0663228F46432E0F56132F6 +:10091000B9F035C080ED860F823088F534C01A8179 +:100920008885882381F186EF91E00E94270240911B +:10093000B1015091B2016885C6010E947D0323C0B8 +:1009400088858F938F818F93812E912C1F921F9377 +:10095000BF92AF920E94C0026E810F900F900F90D5 +:100960000F900F900F90623239F44F815885B40187 +:10097000C6010E94070407C085E191E002C08FE232 +:1009800091E00E9409038881C80FD11DA6CFDF9195 +:10099000CF911F91FF90EF90DF90CF90BF90AF90DD +:1009A0009F908F9008956F927F928F929F92AF92B7 +:1009B000BF92CF92DF92EF92FF920F931F93CF934C +:1009C000DF936C01862E912CC0E0D0E03DEC632ECD +:1009D00031E0732E1C2F8C169D0609F46FC0DF9337 +:1009E000CF937F926F920E94C00223EBE22E21E010 +:1009F000F22E0C2F29E030E040E0F601628184EC19 +:100A000093E00E94640E0F900F900F900F90811151 +:100A100056C06091B5017091B60185E491E00E94E5 +:100A20001A03A090B501B090B601F1E0AF16F2E064 +:100A3000BF0618F0A12C92E0B92E83EBE82E81E0DE +:100A4000F82E012F950140E0F601628184EC93E0DD +:100A50000E94640E811133C040E0B701C5010E94BD +:100A600038038091B5019091B6018130924020F019 +:100A700085EB91E00E9427028091B901882369F0FB +:100A80008FE991E00E9427024091B1015091B2019B +:100A90006091B901C6010E947D032091B80140E038 +:100AA000F601628184EC93E00E94211043EB51E057 +:100AB000B501C6010E94570421968CCF80E0DF91DA +:100AC000CF911F910F91FF90EF90DF90CF90BF904B +:100AD000AF909F908F907F906F900895AF92BF924C +:100AE000CF92DF92EF92FF920F931F93CF93DF93FA +:100AF00000D000D0CDB7DEB75C01DC0112968C913E +:100B00001F928F938BE891E09F938F930E94C00276 +:100B1000F50184811F928F9388E791E09F938F93D3 +:100B20000E94C00203EB11E022E130E040E0D50179 +:100B300012966C9184EC93E00E943D0E0FB6F894EF +:100B4000DEBF0FBECDBF81110E942B036091BB01A0 +:100B50007091BC018AE491E00E941A036091BD018A +:100B60007091BE0186E591E00E941A031092AE01D9 +:100B70008091BA018093AF018091B00183708C6342 +:100B80008093B001E091C403F091C5030190F0811E +:100B9000E02DD50112966C9184EC93E009952EEA34 +:100BA00031E0FC01318320838091C101811108C0B3 +:100BB0008091C201811104C08091C301882339F161 +:100BC0009E012F5F3F4F6901E12CF12C00E024E0F2 +:100BD00030E040E0D50112966C9184EC93E00E94E5 +:100BE0008B0E811114C06B817C817093B201609374 +:100BF000B10183E691E00E941A0388E691E00E9429 +:100C00002702898141E0B60190E00E94380380917B +:100C1000C101882369F083E591E00E942702409199 +:100C2000B1015091B2016091C101C5010E947D03E3 +:100C30008091C201882369F083E491E00E94270239 +:100C40004091B1015091B2016091C201C5010E9471 +:100C50007D038091C301882369F08EE291E00E94B8 +:100C600027024091B1015091B2016091C301C501C9 +:100C70000E947D0384E191E00E94270240E063EB43 +:100C800071E082E190E00E9438036091C401C501E7 +:100C90000E94D30481110E942B03E091C403F091C0 +:100CA000C5030480F581E02DD50112966C9184EC8A +:100CB00093E0099581ED90E00E9427020F900F903C +:100CC0000F900F90DF91CF911F910F91FF90EF90B8 +:100CD000DF90CF90BF90AF90089508950E94F507E0 +:100CE0009093AB018093AA01089581E00895CF937A +:100CF000DF9384EC93E00E947F1084EC93E00E94E9 +:100D00004D099091A8018917C9F084EC93E00E94E5 +:100D10004D098093A8011F928F9380EC90E09F93E0 +:100D20008F930E94C0020F900F900F900F908091B0 +:100D30000001811103C081E0809300018091AA012C +:100D40009091AB010E940D08883B9B40C8F084EC59 +:100D500093E00E944D09803999F480910001882325 +:100D600079F0CFECD3E08A81882319F0CE010E947C +:100D70006E05259684E0CA31D807A9F710920001C4 +:100D8000DF91CF9108952E9A08952E988EBD0DB4BF +:100D900007FEFDCF1EBC0DB407FEFDCF0E94C306AB +:100DA0008EB508952E9882608EBD0DB407FEFDCFDE +:100DB0006EBD0DB407FEFDCF0C94C30688EF0E94F4 +:100DC000C506807C8034A1F018F4882301F10895D1 +:100DD000803819F0803CB9F0089588ED0E94C5066E +:100DE00081FD0BC069EC88ED0E94D20682E00CC048 +:100DF00088ED0E94C50681FDF5CF6BEC88ED0E9461 +:100E0000D20683E001C081E08093A901089561EDDD +:100E100088ED0E94D2061092A90108950F931F93A6 +:100E2000CF93DF938C01269A0E94C306219A229ABF +:100E30002398209A80E58CBD81E08DBD259868E1DE +:100E400088E80E94D20660E288E70E94D20660E04D +:100E500088E70E94D206C0E0D0E088E60E94C5067E +:100E6000219680FD06C0CF3F8FEFD807B1F78FEFF7 +:100E70001DC061EC88ED0E94D20660E680ED0E9404 +:100E8000D20664E088EE0E94D20688EE0E94C50673 +:100E900082FFFBCFC8010E94DE0660E288EC0E9460 +:100EA000D20661E080E80E94D20680E0DF91CF9117 +:100EB0001F910F91089584EC93E00C940E0784EC3D +:100EC00093E00E941D0964EC73E083EB93E00E94C1 +:100ED000DC1381E791E09093AD018093AC0108951C +:100EE00080E090E008958FEF9FEF089581E090E01B +:100EF00008950895862F0E94961581E090E0089548 +:100F0000FB0180810E94961581E090E00895EBE35B +:100F1000F4E01382128288EE93E0A0E0B0E08483D4 +:100F20009583A683B78387E791E0918380838FEFD2 +:100F30009FEF9587848708950C9401088F929F9264 +:100F4000AF92BF92CF92DF92EF92FF920E948022E7 +:100F50004B015C0120E030E04AE755E40E94372372 +:100F60006B017C0120E030E040E85FE30E944C220E +:100F700087FD24C020E03FEF4FE757E4C701B601EB +:100F80000E9432231816ACF420E030E040E251E435 +:100F9000C501B4010E9437230E94512220E931E0AB +:100FA0006115710581F0C9010197F1F7615071096F +:100FB000F7CFC701B6010E94512202C061E070E084 +:100FC000CB010197F1F7FF90EF90DF90CF90BF90AA +:100FD000AF909F908F90089582E084BD93E095BD7F +:100FE0009AEF97BD80936E0008952FB7F894809183 +:100FF0008B0490918C04A0918D04B0918E042FBF2E +:1010000008952FB7F89460918B0470918C048091AF +:101010008D0490918E042FBF08959C014FB7F894D2 +:1010200080918B0490918C04A0918D04B0918E04DA +:101030004FBF821B930B089578941F920F920FB6A7 +:101040000F9211248F939F93AF93BF9380918B0442 +:1010500090918C04A0918D04B0918E040196A11DF5 +:10106000B11D80938B0490938C04A0938D04B09356 +:101070008E04BF91AF919F918F910F900FBE0F90F3 +:101080001F901895CF93DF93FC01862F8078A9F4E9 +:10109000283008F04DC0442321F09581973009F4A1 +:1010A00047C0EF01A1E0B0E09D85992341F0119682 +:1010B0002596A031B105C1F73BC080E039C0611170 +:1010C0001CC085E08A9FE0018B9FD00D1124CE0FBC +:1010D000DF1F442331F081E4888785818F5F85831A +:1010E00002C081E0888725E02A9FC0012B9F900DD8 +:1010F0001124E80FF91F80851BC06770660F660F0B +:10110000660F442341F0606485818F5F858387701B +:10111000687F682B03C02770687B622B25E02A9FBD +:10112000C0012B9F900D1124E80FF91F6087862FB7 +:10113000DF91CF910895611102C006960895FC01D8 +:1011400021E03585631739F02F5F35962031C9F7D7 +:1011500080E090E00895069635E0239F800D911D74 +:1011600011240895DF92EF92FF920F931F93CF9374 +:10117000DF93EC01E62EF12C85E0689FB00111248D +:10118000FE01E60FF71F8085182F177086FF17C026 +:1011900001E085E0D82EFE01D09EE00DF11D112466 +:1011A000808586958695869587701817F9F00F5F6C +:1011B000003189F78D81811302C011501D8385E0B4 +:1011C0008E9DF0018F9DF00D1124EC0FFD1F1086F8 +:1011D00081E0818712862296D783C683DF91CF91E3 +:1011E0001F910F91FF90EF90DF900895602FCE0137 +:1011F0000E94B208D0CFFC01613499F49C01255BB8 +:101200003F4F61E0AC014E5F5F4F158666871786E2 +:10121000548743873596E217F307B9F7FC01158227 +:10122000089521E03585631729F02F5F3596203129 +:10123000C9F70895622F0C94B208FC0189E891E087 +:10124000918380831582108681E081871286CF0189 +:10125000029697838683128228E023832CE32483DB +:10126000DF019F01255B3F4F41E01D961C921D97BA +:101270001E964C931E971F961C921F971C969C932C +:101280008E931B971596A217B30779F7EA58FF4F6D +:10129000108281E1809393040895809193040895CE +:1012A000CF93C42F0E949B08009789F0DC01ED9139 +:1012B000FC911197309759F013969C9180E0891713 +:1012C00031F020812C1731F033968F5FF8CF80E01A +:1012D00090E001C0CF01CF9108950F931F93CF935A +:1012E000DF932115310571F0E901042F162F0E94BB +:1012F0009B08FC01892B41F01283D183C0830383B7 +:1013000080E003C088ED01C086EDDF91CF911F9191 +:101310000F910895CF92DF92FF920F931F93CF9377 +:10132000DF93662381F1F62E8C016C0186E5C80EF1 +:10133000D11CC0E0D0E0D6018D919D916D01009748 +:10134000F1F0DC01ED91FC910084F185E02D09952F +:10135000F81215C0AB96CC0FDD1FC00FD11F8881CE +:101360009981DC01ED91FC910480F581E02DDF9104 +:10137000CF911F910F91FF90DF90CF90099421960C +:10138000C031D105C1F680E0DF91CF911F910F915F +:10139000FF90DF90CF9008952E980895CF93C82F97 +:1013A0000E94CC09CEBD0DB407FEFDCF1EBC0DB40E +:1013B00007FEFDCF0E94C3068EB5CF910895CF934F +:1013C000DF93C82FD62F0E94CC09C260CEBD0DB4CA +:1013D00007FEFDCFDEBD0DB407FEFDCFDF91CF913F +:1013E0000C94C3068F929F92AF92BF92CF92DF92DE +:1013F000EF92FF920F931F93CF93DF93EC01D62EC2 +:10140000C42E59010E949B087C01009709F445C035 +:10141000FC0180819181892B09F441C04C2D6D2DF7 +:10142000CE010E945009F501918380830097C9F194 +:10143000FC0182818695869590E08031910514F0BB +:101440008FE090E041E050E060E070E04A015B0135 +:1014500004C0880C991CAA1CBB1C8A95D2F7D50124 +:10146000C4010197F801918380836D2D80EE0E9465 +:10147000DF0988ED0E94CE09F7019481992331F0AC +:10148000CA58DF4F68816260682B02C0682F697F8D +:1014900088ED0E94DF0980E005C086ED03C087ED7E +:1014A00001C08BEDDF91CF911F910F91FF90EF90D5 +:1014B000DF90CF90BF90AF909F908F9008958F92C4 +:1014C0009F92AF92BF92CF92DF92EF92FF920F93D3 +:1014D0001F93CF93DF93862E942E59010E949C0771 +:1014E0006B017C0128E8C20E23E1D21EE11CF11C35 +:1014F00000E010E0D0E0C0E098280E949C07DC01EA +:10150000CB018C199D09AE09BF09B7FF2DC0692D0C +:1015100080EF0E94DF090E949C07DC01CB018C193F +:101520009D09AE09BF09B7FF09C088EC0E94CE092A +:1015300087FFF1CF60E888EC0E94DF0988EF0E9406 +:10154000CE09C82FCF70C43019F0CE3051F00CC086 +:101550000F5F1F4FA114B10481F20A151B0569F634 +:1015600003C0DF5FD33049F68C2FDF91CF911F91FD +:101570000F91FF90EF90DF90CF90BF90AF909F9032 +:101580008F9008959F92AF92BF92CF92DF92EF9289 +:10159000FF920F931F93CF93DF937C01D42F122FD1 +:1015A000902E00E06C01C60ED11CC60ED11C86E543 +:1015B000C80ED11CA42EB12CABE2AA0EB11CAA0CF1 +:1015C000BB1CAE0CBF1CF60180819181DC01ED914A +:1015D000FC910280F381E02D292D412F6D2F09957B +:1015E000803EC9F4D1110BC061E088EE0E94DF0992 +:1015F00066E670E080E090E00E949E0714C0F5016E +:1016000080819181DC01ED91FC910284F385E02DD4 +:10161000612F099508C08D3021F4033008F03FC0D8 +:1016200014C081113FC0F60180819181DC01ED91F0 +:10163000FC910190F081E02D292D412F6D2F09950E +:10164000C82F8D3051F4033050F464E670E080E030 +:1016500090E00E949E070F5FB6CF882311F1D11151 +:101660000BC061E088EE0E94DF0966E670E080E072 +:1016700090E00E949E0711C0ED2FF0E0BB96EE0FA8 +:10168000FF1FEE0DFF1D80819181DC01ED91FC912A +:101690000284F385E02D612F09958C2F03C08DE026 +:1016A00001C080E0DF91CF911F910F91FF90EF90EB +:1016B000DF90CF90BF90AF909F9008950F931F93AE +:1016C000CF93DF93182F062FEA010E94CC091260F6 +:1016D0001EBDFE01802F882339F00DB407FEFDCF1B +:1016E00091919EBD8150F7CFC00FD11D0DB407FE63 +:1016F000FDCF0E94C306CE01DF91CF911F910F91C4 +:1017000008952F923F924F925F926F927F928F92A5 +:101710009F92AF92BF92CF92DF92EF92FF920F9380 +:101720001F93CF93DF9300D000D01F92CDB7DEB7C9 +:101730007D836C834A016901FB01F1808FEF8F0D7E +:10174000803408F067C00E949C072B013C01F8E838 +:101750004F0EF3E15F1E611C711CEC81FD818281E3 +:1017600080FD02C060E401C060E888EE0E94DF09ED +:10177000312C8F2D90E09A838983C114D104B1F16B +:10178000E980FA80CE14DF0408F47601EB82A80128 +:101790006E2D80E10E945E0B6E2D88E30E94DF09B2 +:1017A000EC81FD816081606280EF0E94DF0988EC3E +:1017B0000E94CE0987FFFBCF60E888EC0E94DF091A +:1017C00088EF0E94CE098F70382EA12CB12C212CCD +:1017D000332009F472C00E949C07DC01CB018419FC +:1017E0009509A609B709B7FF68C016C0332021F0D4 +:1017F00060E088E30E94DF0988EF0E94CE0985FB44 +:10180000882780F9EC81FD81928180FB90F9928399 +:10181000832D58C08AED56C0F6E03F1239C088EFDC +:101820000E94CE0985FB882780F991E08927EC8109 +:10183000FD81928180FB90F9928390FD02C060E46B +:1018400001C060E888EE0E94DF0960E088E30E9442 +:10185000DF09F801608180E10E94DF096B8188E384 +:101860000E94DF09EC81FD816081606280EF0E944F +:10187000DF0988EC0E94CE0987FFFBCF60E888EC87 +:101880000E94DF0988EF0E94CE098F70382EA0CF0A +:101890002EE0321205C0239423E02212D6CFA8CF27 +:1018A00084E03812A5CFFFEFAF1ABF0A811491046C +:1018B00061F2A814B90449F69BCFCE18DF080E0DCB +:1018C0001F1D5BCF0F900F900F900F900F90DF9127 +:1018D000CF911F910F91FF90EF90DF90CF90BF902D +:1018E000AF909F908F907F906F905F904F903F90C0 +:1018F0002F9008952F923F924F925F926F927F9216 +:101900008F929F92AF92BF92CF92DF92EF92FF920F +:101910000F931F93CF93DF93CDB7DEB72A970FB600 +:10192000F894DEBF0FBECDBF1C016B015B834A8301 +:101930005901D9016D907C901197FB01F181F983D8 +:101940001D921C92DB0112968C9181FD02C060E118 +:1019500001C060E288EE0E94DF098E2D90E0A0E0D9 +:10196000B0E08C839D83AE83BF8368862A813B81F0 +:10197000D6014C9160E0C1010E945F0AF82EB6E0EA +:101980008B1318C088EF0E94CE0982958170E1E028 +:101990008E27D60112969C91129780FB91F9129690 +:1019A0009C9391FD02C060E101C060E288EE0E945C +:1019B000DF09DCCF811167C088EC0E94CE0982FF6D +:1019C00060C080E30E94CE09582E90E06816790628 +:1019D00008F45884F501808191819301281B390B0B +:1019E0003A87298737FF02C01A861986852C912CE1 +:1019F00089859A858816990614F49A868986498479 +:101A00000E94CC0998E09EBD0DB407FEFDCFF80101 +:101A1000442041F01EBC4A940DB407FEFDCF8EB5A4 +:101A20008193F6CFA985BA850A0F1B1F0E94C306B2 +:101A300064E088EC0E94DF09F50180819181880EC5 +:101A4000991E91828082F9815F1618F0861497049E +:101A500070F088EF0E94CE0982958170D6011296AF +:101A60009C91129780FB91F912969C930CC0EE20EA +:101A700009F47CCF6C817D818E819F810E949E07BD +:101A800075CF80EFF82E8F2D2A960FB6F894DEBF13 +:101A90000FBECDBFDF91CF911F910F91FF90EF90BF +:101AA000DF90CF90BF90AF909F908F907F906F907E +:101AB0005F904F903F902F9008952F923F924F92BA +:101AC0005F926F927F928F929F92AF92BF92CF92CE +:101AD000DF92EF92FF920F931F93CF93DF93CDB7D7 +:101AE000DEB761970FB6F894DEBF0FBECDBF3C01E5 +:101AF000F42E322E202EC98A4EA05FA0C8A4D9A4ED +:101B0000188A1F861E861D868E01035F1F4F9E0149 +:101B1000215F3F4F0E94F209811196C039822A82CB +:101B2000EB8289898C83BE82AD8298868F82AE01DA +:101B30004F5F5F4F68E080E20E945E0B2D853E851F +:101B40004F2D60E1C3010E945F0AE82E811178C029 +:101B5000932D9078392EC114D10409F462C0EF8519 +:101B6000F8898281992309F44DC0826082835401EF +:101B700022242394A114B10409F458C05C864B8636 +:101B80004D855E856F857889E12C86019E01255FF4 +:101B90003F4FC3010E947A0CE82EA6E08A130FC0C3 +:101BA0000F85188988EF0E94CE0985FB882780F968 +:101BB0008225F801928180FB91F99283DBCF81111C +:101BC0003FC08AA59BA50097A1F0DC01ED91FC9197 +:101BD00011970190F081E02DC4018A199B099A8721 +:101BE00089876B857C859E01275F3F4FA601CD01CC +:101BF00009958B859C85A81AB90A8415950508F066 +:101C0000B9CF0FC0816082834D855E8586019201C8 +:101C1000BF01C3010E94810B811116C02D853E8535 +:101C200011C02D853E85311005C00CC0E11008C0E3 +:101C30002D853E8560EA4F2DC3010E945F0A04C0D6 +:101C40008E2D02C060E8F7CF61960FB6F894DEBF24 +:101C50000FBECDBFDF91CF911F910F91FF90EF90FD +:101C6000DF90CF90BF90AF909F908F907F906F90BC +:101C70005F904F903F902F9008958F929F92AF92D8 +:101C8000BF92CF92EF920F931F931F921F921F93B9 +:101C90000F933F932F934901A12CB12CCC24C394D3 +:101CA000E12C06E020E80E945D0D0F900F900F9050 +:101CB0000F900F900F901F910F91EF90CF90BF90CA +:101CC000AF909F908F9008958F929F92AF92BF9206 +:101CD000CF92EF92FF920F931F921F92FF92EF927B +:101CE0003F932F934901A12CB12C22E0C22EE02E6C +:101CF00006E020E80E945D0D0F900F900F900F906E +:101D00000F900F900F91FF90EF90CF90BF90AF90FA +:101D10009F908F9008958F929F92AF92BF92CF9293 +:101D2000DF92EF92FF920F931F921F92DF92CF925A +:101D30003F932F934901570123E0C22EE02E06E086 +:101D400020E80E945D0D0F900F900F900F900F9064 +:101D50000F900F91FF90EF90DF90CF90BF90AF90DA +:101D60009F908F9008958F929F92AF92BF92CF9243 +:101D7000EF920F93CF931F921F921F921F921F9269 +:101D80001F92812C912CA12CB12CC12CE22E05E0AC +:101D900020E00E945D0DC82F6CE271E080E090E0D1 +:101DA0000E949E070F900F900F900F900F900F9032 +:101DB0008C2FCF910F91EF90CF90BF90AF909F90CD +:101DC0008F9008950F931F93CF93DF938A3F3FEF38 +:101DD000930711F486ED2DC0DC011696ED91FC9170 +:101DE0001797EF2B09F1122F242FEC011A8740E0EF +:101DF0000E944208082F8823C9F0682FCE010E9454 +:101E00009B08009739F3FC011483202F40E060E029 +:101E1000CE010E94B30E182F882351F0602FCE01FF +:101E20000E94FB08812F05C087ED03C084ED01C02F +:101E300080E0DF91CF911F910F9108952F923F92F3 +:101E40004F925F926F927F928F929F92AF92BF92CA +:101E5000CF92DF92EF92FF920F931F93CF93DF9376 +:101E6000CDB7DEB766970FB6F894DEBF0FBECDBF15 +:101E70001B8A38E03C8B3CE33D8B8A3F3FEF930766 +:101E800009F464C0522E342E462E7C01DC011696D5 +:101E9000CD90DC901797CE01439617969C938E9326 +:101EA00016971A962C938E010F5F1F4F22E130E098 +:101EB00040E060E0C7010E943D0EF701D782C68274 +:101EC0008111A6C089849A846B847C84FD81FE8BF9 +:101ED0002E80670136E5C30ED11C560110E0D501F6 +:101EE0008D919C910097F1F1DC01ED91FC910084C2 +:101EF000F185E02D0995811135C0F5018081918131 +:101F0000DC01ED91FC910088F189E02D622D0995AD +:101F1000882341F1F50180819181DC01ED91FC91F3 +:101F20000484F585E02DA301B4010995811110C049 +:101F3000F50180819181DC01ED91FC910684F785AA +:101F4000E02D6E890995811103C00CC086ED60C03B +:101F5000052D232D442D612FC7010E94C20A813D0A +:101F600009F056C01F5FB2E0AB0EB11C103109F092 +:101F7000B6CF10E0F601808191810097E1F1DC019C +:101F8000ED91FC910084F185E02D0995811133C01C +:101F9000F60180819181DC01ED91FC910088F1894D +:101FA000E02D622D09958823D9F0F6018081918179 +:101FB000DC01ED91FC910484F585E02DA301B401D1 +:101FC0000995811118C0F60180819181DC01ED91A4 +:101FD000FC910684F785E02D6E89099581110BC06F +:101FE000052D232D442D612FC7010E94C20A982F71 +:101FF000977F913D69F41F5FE2E0CE0ED11C103156 +:1020000009F0B8CF252D432D642DC7010E94E20EA3 +:1020100066960FB6F894DEBF0FBECDBFDF91CF91AD +:102020001F910F91FF90EF90DF90CF90BF90AF90F6 +:102030009F908F907F906F905F904F903F902F90E8 +:1020400008958F929F92AF92BF92CF92EF920F938B +:102050001F921F921F921F921F921F92812C912CF0 +:10206000A12CB12CC12CE22E09E020E00E945D0DD4 +:102070000F900F900F900F900F900F900F91EF9087 +:10208000CF90BF90AF909F908F9008958F929F9226 +:10209000AF92BF92CF92DF92EF920F931F93CF93A5 +:1020A000DF9300D000D0CDB7DEB76C0159014801F5 +:1020B0001C821B821A8219828E010F5F1F4F9E01A4 +:1020C0002D5F3F4F0E94F209811109C049815A8159 +:1020D0006B817C8184019501C6010E947A0C0F906E +:1020E0000F900F900F90DF91CF911F910F91EF9074 +:1020F000DF90CF90BF90AF909F908F900895AF9258 +:10210000BF92CF92DF92EF92FF920F931F93CF93E4 +:102110008C011D990EC088EC0E94CE0985FF05C078 +:10212000C8010E94DE0660E201C060E088EC0E9407 +:10213000DF098091A901813039F040F0823079F0D7 +:10214000833039F5C1E00CC083E106C0809193046F +:10215000807F8031F1F081E1809393041AC0C0E068 +:1021600080919304807F8031A9F40E949C07DC0158 +:10217000CB0188539F4FAF4FBF4F80938F049093F5 +:102180009004A0939104B093920480E2809393040E +:1021900001C0C0E0780186E5E80EF11C6801A6E701 +:1021A000CA0ED11C5701F501819191915F010097F1 +:1021B00039F0DC01ED91FC910680F781E02D099565 +:1021C000AC14BD0481F780919304803409F43FC0BE +:1021D00050F4803221F18033A1F1813109F082C0C5 +:1021E000F60110820AC0813509F458C0803809F41C +:1021F0006AC0803509F076C039C0D7018D919D91B4 +:102200007D01009739F0DC01ED91FC910480F581AE +:10221000E02D0995EC14FD0481F782E161C00E9474 +:102220009C0700918F0410919004209191043091AB +:102230009204DC01CB01801B910BA20BB30BB7FD09 +:1022400051C061E088EE0E94DF0980E449C088EE59 +:102250000E94CE0980FD46C088ED0E94CE09682FFD +:10226000686088ED0E94DF0980E53AC088EC0E9432 +:10227000CE0986FF37C081E5809393040E949C07B6 +:10228000DC01CB014496A11DB11D80938F04909376 +:102290009004A0939104B093920424C00E949C07E0 +:1022A000C0908F04D0909004E0909104F09092043C +:1022B000DC01CB018C199D09AE09BF09B7FD12C025 +:1022C00080E8809393042C2F40E060E0C8010E94D6 +:1022D0001E0F882321F0823D29F080EA01C080E9A9 +:1022E00080939304CF911F910F91FF90EF90DF9017 +:1022F000CF90BF90AF90089580E0089580E008955A +:1023000081E00895FC018285089581E0693009F03B +:1023100080E00895CF93DF93EC018A819B81DC01FB +:10232000ED91FC910480F581E02D6A8509958A85FF +:10233000813439F4EA81FB81EA58FF4F808184605F +:1023400080831A861B861C861D861E861F86188A19 +:1023500080E0DF91CF9108958F929F92AF92BF92CC +:10236000CF92EF920F93A42EB12CB22A1F921F92FC +:102370001F921F921F921F92812C912CC12CE62E2E +:1023800001E023E240E0FC016285828193810E94AA +:102390005D0D0F900F900F900F900F900F900F9179 +:1023A000EF90CF90BF90AF909F908F9008958F92B5 +:1023B0009F92AF92BF92CF92EF920F93A62EB12C25 +:1023C0001F921F923F932F935F934F934A01C12C0B +:1023D000E12C00E023EA40E0FC01628582819381E8 +:1023E0000E945D0D0F900F900F900F900F900F9027 +:1023F0000F91EF90CF90BF90AF909F908F900895E6 +:102400008F929F92AF92BF92CF92EF920F93A42E92 +:10241000B12CB22A1F921F921F921F921F921F92DD +:10242000812C912CC12CE62E03E023E240E0FC013C +:102430006285828193810E945D0D0F900F900F90B5 +:102440000F900F900F900F91EF90CF90BF90AF90A3 +:102450009F908F9008952F923F924F925F926F922C +:102460007F928F929F92AF92BF92CF92DF92EF9224 +:10247000FF920F931F93CF93DF93CDB7DEB7E8970B +:102480000FB6F894DEBF0FBECDBFDC011A963C91AB +:10249000311107C1122F242E362E3C01FC01C280BF +:1024A000D380D601ED91FC910190F081E02D60E0A8 +:1024B000C60109957C01009709F4F5C0FC01A080D4 +:1024C000B180A114B10409F4F0C04301F4E08F0E0F +:1024D000911CDC0111969C928E9214961C93FE0125 +:1024E00031962F018F0128E030E040E060E0D30119 +:1024F00012968D919C9113970E943D0EF7011482C4 +:102500008111D9C08D81893009F0D1C00981D601EE +:10251000ED91FC910280F381E02D222D41E0632DAD +:10252000C6010995F3018287882309F4C2C0988502 +:102530009583282F40E060E0828193810E94B30E52 +:10254000182F882389F0D701AD92BC92D601ED9166 +:10255000FC910480F581E02DD3011A966C91C6019F +:102560000995F3011286ABC0202F013208F020E25A +:10257000D701AD92BC9221110BC0940142E0F3014E +:102580006285828193810E946D09811197C010C07C +:1025900030E0820140E0D3011A966C911A971296AE +:1025A0008D919C9113970E943D0E811187C0E5CFBC +:1025B0001F921F925F924F921F9288E08F9388E044 +:1025C000882E912CA12CB12C99E2C92EE12C06E089 +:1025D00020EA40E0F3016285828193810E945D0DD3 +:1025E000182F0F900F900F900F900F900F90811158 +:1025F00066C08B81D3011B968C931B97720100E000 +:1026000028E030E040E01A966C911A9712968D916E +:102610009C9113970E94640E811150C02B813C81C4 +:1026200040E0F3016285828193810E94640E8111F2 +:1026300045C0298130E0CE0181967C0140E0D30184 +:102640001A966C911A9712968D919C9113970E94ED +:10265000640E811133C02E8140E0F30162858281D6 +:1026600093810E942110811129C001E0D3011B96A2 +:102670008C91801740F020E0402F68E0C3010E9459 +:1026800000120F5FF3CFD3011296ED91FC911397D7 +:10269000EA58FF4F80818460808381E050968C935C +:1026A0000EC019ED0CC016ED0AC017ED08C011EDF3 +:1026B00006C014ED04C0F701B182A082182F812F4B +:1026C000E8960FB6F894DEBF0FBECDBFDF91CF9175 +:1026D0001F910F91FF90EF90DF90CF90BF90AF9040 +:1026E0009F908F907F906F905F904F903F902F9032 +:1026F0000895CF92DF92FF920F931F93CF93DF93B2 +:1027000000D000D0CDB7DEB78C01F62E19821A8228 +:102710001B821C8220E0462F61E10E94AC1120E068 +:102720004F2D60E1C8010E94AC1120E04F2D64E004 +:10273000C8010E94001283E0C82ED12C9E012F5F99 +:102740003F4F44E050E06F2DC8010E94D71188230D +:10275000F1F020E04F2D64E1C8010E94AC1120E0AF +:102760004F2D60E1C8010E94AC1164E170E080E08F +:1027700090E00E949E070F900F900F900F90DF91B6 +:10278000CF911F910F91FF90DF90CF900895898195 +:102790009A81AB81BC819D7F83309140A041B1057E +:1027A000C1F264E670E080E090E00E949E0781E064 +:1027B000C81AD10819F6CDCFFC0183E991E09183C5 +:1027C0008083738362831286138614861586168629 +:1027D0001786108A148288E085839CE3968391E0B3 +:1027E0009783808784E0818761157105B1F0DB01F3 +:1027F000AA5ABF4F80E090E02D913D91232B49F4E0 +:102800008B96880F991FDB01A80FB91FED93FC93DE +:10281000089501968031910579F70895EF92FF921E +:102820000F931F93CF938C01C62F7A01FA018081F9 +:102830009181A281B3818130F3E09F07F1E0AF077E +:10284000B105D1F060F48115E1E09E07AE07B10556 +:1028500071F181309140A140B10571F064C08330C5 +:1028600021E0920720E1A207B105E1F18330934016 +:10287000A041B105B9F157C080919404811153C0B2 +:1028800020E04C2F61E1C8010E94AC1120E04C2FE8 +:1028900060E1C8010E94AC1120E04C2F64E0C80147 +:1028A0000E94001281E08093940481EB3DC020E0FF +:1028B000462F61E1C8010E94AC1120E04C2F60E17D +:1028C000C8010E94AC1110929404F80162856770EF +:1028D000C770660F660F660F6C2B828193810E9412 +:1028E0008A0921C020E04C2F64E1C8010E94AC118C +:1028F00020E04C2F60E1C8010E94AC1164E170E05F +:1029000080E090E00E949E07F8016285F701218136 +:102910002695217067704C2FF801828193810E9467 +:102920001E0F1092940480E0CF911F910F91FF90A1 +:10293000EF900895CF92DF92EF920F931F93CF9372 +:10294000DF93CDB7DEB72E970FB6F894DEBF0FBE7C +:10295000CDBF6C0181E090E09E878D87E12C8E01D8 +:102960000F5F1F4F9E01235F3F4F41E0F6016285DD +:10297000828193810E944610811151C002E011E0D2 +:1029800089818023D1F019861A861B861C869E01B8 +:10299000275F3F4F44E050E0612FC6010E94D711EE +:1029A00081110BC0AE01475F5F4F612FC6010E94CE +:1029B0000E14813B99F1811132C0000F1F5F183056 +:1029C000F9F611E0F6018385811740F119861A8620 +:1029D0001B861C869E01275F3F4F44E050E0612F1D +:1029E000C6010E94D711811117C089859A85877009 +:1029F00091708130914081F48B859C8581609C87AA +:102A00008B87AE01475F5F4F612FC6010E940E1496 +:102A1000813B21F0811103C01F5FD4CF80E02E964F +:102A20000FB6F894DEBF0FBECDBFDF91CF911F91DF +:102A30000F91EF90DF90CF9008950F931F93CF9356 +:102A4000DF93FC012089211102C080E020C0EC014D +:102A50000E949C070C851D852E853F85DC01CB01DE +:102A6000801B910BA20BB30BB7FDEFCFCE010E94E1 +:102A70009A14182F0E949C07DC01CB018C599F4FA0 +:102A8000AF4FBF4F8C879D87AE87BF87812FDF9168 +:102A9000CF911F910F9108958091A10508950895F8 +:102AA0000895CF93DF932091BE05243049F521E0AE +:102AB0002093E90021E8215059F03091E80035FDDC +:102AC00007C0EFE3F1E03197F1F700C00000F3CF6A +:102AD0002091E80025FF14C0EC0140E050E068E0E0 +:102AE00070E00E9454198091E8008E778093E8008E +:102AF00088E0FE01A9E9B5E001900D928A95E1F721 +:102B0000DF91CF910895CF93C0919704C1110BC06D +:102B10000E940108643C79408105910520F081E024 +:102B200080939704C1E08C2FCF910895FF920F936B +:102B30001F93CF93DF93D82F0FB607FE83C08091EA +:102B4000BE05843081F08091040190E001962091CF +:102B5000060130E0822393232091050130E08217A3 +:102B6000930709F0CDC00E948315811110C0809198 +:102B7000040190E001962091060130E08223932326 +:102B80002091050130E08217930709F0B9C00E9437 +:102B9000F5078C01C091E900CF709091EC00892F6E +:102BA000817090FD80E8C82B82E08093E90085E089 +:102BB000F82E8091EB0085FD42C08091EB0080FFF4 +:102BC0003EC08091EE0087FF3AC080910501909150 +:102BD0000401981709F457C09091E80095FF8EC042 +:102BE000E0910201F0910301E80FF11D20818F5F58 +:102BF000909106018923809305012093F100809133 +:102C0000E80085FDE2CF8091E80080FFDECF809173 +:102C1000E8008E778093E800F0920101D6CF809192 +:102C2000040190E001962091060130E08223932375 +:102C30002091050130E08217930709F44CC0CF7052 +:102C4000C093E90040910401842F90E00196209107 +:102C5000060130E0822393232091050130E08217A2 +:102C6000930709F450C0E0910201F0910301E40FD1 +:102C7000F11DD083809104018F5F9091060189231B +:102C80008093040140C08091E80085FF37C0D09355 +:102C9000F10021E03091F3008091F20090E0932B5D +:102CA000892B91F08091E80080FF0EC08091E800B0 +:102CB00085FF03C01092F100F9CF8091E8008E7774 +:102CC0008093E800F0920101222309F4A8CFCF708D +:102CD000C093E90018C080910101882309F4AFCFA7 +:102CE0000E94F5079C018017910711F4890161CFBB +:102CF00090910101915090930101F8CF20E0CACF4B +:102D000040910401B0CF80E0DF91CF911F910F91EE +:102D1000FF90089508958091BD05811104C00E941F +:102D2000BE1B0C941B1C08951092BD0508950895B8 +:102D300042E061EC81E00E94CD1842E261EC82E069 +:102D40000C94CD188091C005833009F453C030F441 +:102D5000813071F0823009F4BAC008958A3009F4E4 +:102D6000A6C08B3009F478C0893009F0C8C020C0F3 +:102D70008091BF05813A09F0C2C08091E800877F49 +:102D80008093E8008091C3059091C405892B21F4BC +:102D900068E089E995E003C060E080E090E070E0E1 +:102DA0000E949F198091E8008B778093E800089536 +:102DB0008091BF05813209F0A2C08091C305909136 +:102DC000C405892B09F09BC08091E800877F809320 +:102DD000E8008091E80082FD05C08091BE05811168 +:102DE000F8CF8DC08091F1008093A1058091E8001B +:102DF0008B7781C08091BF05813A09F080C08091B6 +:102E0000C3059091C405892BA1F48091E800877FC8 +:102E10008093E8008091E80080FFFCCF8091120150 +:102E20008093F1008091E8008E778093E8000E9403 +:102E300002198091C3059091C405892B09F05FC0E8 +:102E40008091E800877F8093E8008091E80080FF10 +:102E5000FCCF809111014AC08091BF05813209F0F9 +:102E60004EC08091C3059091C405892B69F480916F +:102E7000E800877F8093E8000E9402198091C105D5 +:102E8000809312010E94C81E8091C3059091C405D1 +:102E9000892BA9F58091E800877F8093E8000E9444 +:102EA00002198091C105809311010C94C81E809174 +:102EB000BF05813221F58091E800877F8093E8008B +:102EC0000E9402198091C2058093A2050895809105 +:102ED000BF05813AA1F48091E800877F8093E800E4 +:102EE0008091E80080FFFCCF8091A2058093F100E3 +:102EF0008091E8008E778093E8000C940219089581 +:102F00008091A105809398041092A1050E94D71D7D +:102F10000C94C81E0C9480170E94F5208091BC056B +:102F2000882329F00E941E2181110C94B71808955E +:102F30000E942621809198048093A10508950C9405 +:102F400098170895CF9384B7877F84BF0FB6F894FE +:102F5000A895809160008861809360001092600065 +:102F60000FBE90E080E80FB6F894809361009093D4 +:102F700061000FBE86E995E10E948D2087E091E017 +:102F80000E94501D8EE792E00E9427020E945B077C +:102F90000E94981D0E94BE1B0E941B1C78940E94D8 +:102FA0009A1D8091BE05843019F00E94A117F9CFB7 +:102FB0008CE692E00E9427020E946E068AE592E06B +:102FC0000E942702C2E08091BE05853019F40E945C +:102FD0008C17F9CF0E949E1D2091E4003091E500EE +:102FE00080919504909196042817390761F3809198 +:102FF000E4009091E50090939604809395040E94DC +:103000008315882301F38091BE058430E1F6809119 +:10301000E9008F702091EC00922F917020FD90E8D4 +:10302000892BC093E9009091EB0090FF43C09091F1 +:10303000EE0097FF3FC090910501209104012917F0 +:1030400009F12091E80025FF1DC0E0910201F091F7 +:103050000301E90FF11D30819F5F2091060192234A +:10306000909305013093F1009091E80095FDE3CF36 +:103070009091E80090FFDFCF9091E8009E779093C9 +:10308000E800D9CF9091F3002091F20030E0392B85 +:10309000232B81F09091E80090FF0CC09091E80004 +:1030A00095FF03C01092F100F9CF9091E8009E7750 +:1030B0009093E8008F708093E90085CF292F332704 +:1030C00023303105C9F060F42130310581F0223020 +:1030D000310509F044C082E490E021ED32E043C0C4 +:1030E00021323105E1F02232310549F138C082E167 +:1030F00090E023E133E037C099278130910549F012 +:1031000028F0029761F5E5E9F2E005C0EDECF2E0A8 +:1031100002C0E3ECF2E0849190E09F0124C06115CD +:10312000710541F061307105D1F489E090E02CEF38 +:1031300032E019C089E090E023EE32E014C061155E +:10314000710541F06130710551F482E290E025E2B1 +:1031500033E009C080E490E027E433E004C080E07D +:1031600090E020E030E0FA0131832083089580E18F +:1031700089BD82E189BD09B400FEFDCF8091D800F0 +:103180008F7D8093D8008091E00082608093E00082 +:103190008091E00081FDFCCF0895982F973068F56D +:1031A0009093E900981739F07091EC002091ED00B0 +:1031B0005091F00003C0242F762F50E021FD02C073 +:1031C0009F5FECCF3091EB003E7F3093EB0030916E +:1031D000ED003D7F3093ED003091EB003160309396 +:1031E000EB007093EC002093ED005093F0002091E1 +:1031F000EE0027FDE5CF80E008958F708093E90011 +:1032000081E008958091BF0587FF11C08091E8009B +:1032100082FD05C08091BE058111F8CF11C080915B +:10322000E8008B770BC08091BE05882349F0809120 +:10323000E80080FFF8CF8091E8008E778093E80067 +:1032400008952091E4003091E50095E64091EC006E +:10325000842F817040FF23C08091E80080FD1DC055 +:103260008091BE05882399F0853099F08091EB001C +:1032700085FD11C04091E4005091E5002417350709 +:1032800029F3915011F09A01E1CF84E0089582E092 +:10329000089583E0089581E0089580E008954091C5 +:1032A000E80042FFDDCF0895CF92DF92EF92FF92C8 +:1032B0000F931F93CF93DF93EC018B017A010E9450 +:1032C0002119811133C0E114F10439F0F701808133 +:1032D0009181081B190BC80FD91FC12CD12C0115C6 +:1032E000110519F18091E80085FD16C08091E80074 +:1032F0008E778093E800E114F10449F0F7018081B2 +:103300009181C80ED91ED182C08285E00FC00E9473 +:103310002119882321F30AC089918093F10001507B +:103320001109FFEFCF1ADF0ADACF80E0DF91CF91EA +:103330001F910F91FF90EF90DF90CF900895209113 +:10334000C5053091C6052617370748F06115710588 +:1033500039F42091E8002E772093E80001C0B901EC +:10336000FC0120E06115710579F18091BE0588238B +:10337000F1F18530F1F18091E80083FD3CC080914E +:10338000E80082FD2EC08091E80080FFEBCF209105 +:10339000F3008091F20090E0922B6115710551F0DD +:1033A0008830910538F421912093F1006150710922 +:1033B0000196F3CF21E0089709F020E08091E80022 +:1033C0008E778093E800CECF2111CFCF0AC08091B5 +:1033D000BE05882361F0853061F08091E80083FDAF +:1033E0000AC08091E80082FFF2CF80E0089582E079 +:1033F000089583E0089581E008952091C5053091F6 +:10340000C6052617370748F06115710539F4209174 +:10341000E8002E772093E80001C0B901FC0120E00C +:103420006115710591F18091BE05882309F440C0B2 +:10343000853009F43FC08091E80083FD3DC0809154 +:10344000E80082FD2FC08091E80080FFE9CF209145 +:10345000F3008091F20090E0922B6115710559F014 +:103460008830910540F424912093F1003196615009 +:1034700071090196F2CF21E0089709F020E08091D0 +:10348000E8008E778093E800CBCF2111CCCF0AC023 +:103490008091BE05882361F0853061F08091E8005D +:1034A00083FD0AC08091E80082FFF2CF80E008959A +:1034B00082E0089583E0089581E008951F93CF93FB +:1034C000DF93CDB7DEB7AA970FB6F894DEBF0FBE75 +:1034D000CDBFEFEBF5E08091F100819325E0E73C73 +:1034E000F207C9F70E94A2168091E80083FF2EC15F +:1034F0008091BF059091C005492F50E04A30510599 +:1035000008F024C1FA01EA5AFF4F0C94A423803832 +:1035100021F0823809F01AC108C08091BB05909152 +:10352000BC05992389F082600FC08091C3058F701C +:10353000873008F00BC18093E9008091EB0085FB98 +:10354000882780F91092E9009091E800977F909386 +:10355000E8008093F1001092F100D1C0282F2D7F58 +:1035600009F0F4C0882319F0823061F0EFC0809137 +:10357000C105813009F0EAC0933009F080E0809302 +:10358000BC052EC08091C10581112AC08091C30560 +:103590008F702FEF280F263008F0D8C08093E900F5 +:1035A0002091EB0020FF1CC0933021F48091EB00B0 +:1035B000806214C09091EB0090619093EB0021E049 +:1035C00030E0A90102C0440F551F8A95E2F74093ED +:1035D000EA001092EA008091EB0088608093EB0093 +:1035E0001092E9008091E800877F8093E8000E94B4 +:1035F0000219ACC08111AAC01091C1051F7780913A +:10360000E3008078812B8093E3008091E800877F3E +:103610008093E8000E9402198091E80080FFFCCFAF +:103620008091E30080688093E300111102C082E082 +:1036300001C083E08093BE0589C08058823008F0C5 +:1036400085C08091C1059091C2058C3D53E09507DE +:1036500079F583E08A838AE289834FB7F894DE01A3 +:10366000139620E03EE051E2E32FF0E05093570044 +:10367000E49120FF03C0E295EF703F5FEF708E2F63 +:1036800090E0EA3010F0C79601C0C0968D939D93EC +:103690002F5F243149F74FBF8091E800877F8093E7 +:1036A000E8006AE270E0CE0101960E949F1916C000 +:1036B0006091C3057091C405AE014F5F5F4F0E94DA +:1036C0005E18BC01892B09F441C09091E800977FF6 +:1036D0009093E80089819A810E94FD198091E80009 +:1036E0008B778093E80032C0803881F58091E800C4 +:1036F000877F8093E8008091BA058093F1008091E4 +:10370000E8008E7772CF811121C08091C105909120 +:10371000C20599270297D4F48091E800877F8093AF +:10372000E8008091C1058093BA050E94021980913A +:10373000BA05811106C08091E30087FD02C081E0D7 +:1037400001C084E08093BE050E9498168091E80035 +:1037500083FF0AC08091E800877F8093E800809112 +:10376000EB0080628093EB00AA960FB6F894DEBF60 +:103770000FBECDBFDF91CF911F9108950E942C1CE9 +:103780000E94341CE0EEF0E0808181608083E8EDEF +:10379000F0E080818F77808319BCA7EDB0E08C9139 +:1037A0008E7F8C9380818F7E80831092BD050895DB +:1037B0000F931F93CF93DF930E942C1C0E94341C05 +:1037C000C8EDD0E088818F7788838881806888837E +:1037D00088818F7D888319BC1092BE051092BA052E +:1037E0001092BC051092BB0500EE10E0F80180813C +:1037F0008B7F808388818160888342E060E080E005 +:103800000E94CD18E1EEF0E080818E7F8083E2EEB1 +:10381000F0E0808181608083808188608083F8010E +:1038200080818E7F8083888180618883DF91CF91C2 +:103830001F910F910895E8EDF0E080818F7E8083E5 +:10384000E7EDF0E080818160808384E082BF81E0E9 +:103850008093BD050C94D81BE8EDF0E080818E7F4D +:1038600080831092E20008951092DA001092E10035 +:1038700008951F920F920FB60F9211242F933F932A +:103880004F935F936F937F938F939F93AF93BF9368 +:10389000EF93FF938091E10082FF0BC08091E200E3 +:1038A00082FF07C08091E1008B7F8093E1000E943E +:1038B0004F1D8091DA0080FF1FC08091D80080FFEB +:1038C0001BC08091DA008E7F8093DA008091D9004E +:1038D00080FF0DC080E189BD82E189BD09B400FE91 +:1038E000FDCF81E08093BE050E948B1605C019BCF8 +:1038F0001092BE050E9494168091E10080FF19C0CD +:103900008091E20080FF15C08091E2008E7F80935D +:10391000E2008091E20080618093E2008091D80013 +:1039200080628093D80019BC85E08093BE050E9418 +:103930008A178091E10084FF30C08091E20084FF0B +:103940002CC080E189BD82E189BD09B400FEFDCFB4 +:103950008091D8008F7D8093D8008091E1008F7E88 +:103960008093E1008091E2008F7E8093E20080915D +:10397000E20081608093E2008091BA05882311F013 +:1039800084E007C08091E30087FD02C081E001C0B0 +:1039900083E08093BE050E949F178091E10083FF22 +:1039A00029C08091E20083FF25C08091E100877FDC +:1039B0008093E10082E08093BE051092BA05809169 +:1039C000E1008E7F8093E1008091E2008E7F809302 +:1039D000E2008091E20080618093E20042E060E0DA +:1039E00080E00E94CD188091F00088608093F00004 +:1039F0000E949716FF91EF91BF91AF919F918F9188 +:103A00007F916F915F914F913F912F910F900FBEDA +:103A10000F901F9018951F920F920FB60F921124BE +:103A20002F933F934F935F936F937F938F939F93C6 +:103A3000AF93BF93CF93DF93EF93FF93C091E900D0 +:103A4000CF708091EC00D82FD17080FDD0E810921B +:103A5000E9008091F000877F8093F00078940E94C5 +:103A60005E1A1092E9008091F00088608093F00067 +:103A7000CD2BCF70C093E900FF91EF91DF91CF91F3 +:103A8000BF91AF919F918F917F916F915F914F9176 +:103A90003F912F910F900FBE0F901F901895089592 +:103AA0009093A8058093A7050895E091A705F0914C +:103AB000A805309721F00190F081E02D099480E075 +:103AC0000895E091A705F091A805309721F00280B4 +:103AD000F381E02D099408952091A5053091A60564 +:103AE0002817390771F09093A6058093A505E091FA +:103AF000A705F091A805309721F00680F781E02D09 +:103B0000099408952091A3053091A4052817390739 +:103B100071F09093A4058093A305E091A705F0911F +:103B2000A805309721F00084F185E02D09940895CF +:103B30000C94D81D0E94EC070C946D06CF93DF9374 +:103B400000D000D01F92CDB7DEB70E9475068FEF70 +:103B500089838A831B820E94F5078160782F9D8369 +:103B60008C8349815A816B818D810E94781F0E94CC +:103B700077060E94551D9091A905891769F00E944A +:103B8000551D8093A9050F900F900F900F900F90E7 +:103B9000DF91CF910C94F1200F900F900F900F9028 +:103BA0000F90DF91CF91089508950C94D41D08953E +:103BB000089508950895882309F4BBC09CEF980FD9 +:103BC000913A18F40E94FB1F0DC090E2980F9830B4 +:103BD00058F4877091E001C0990F8A95EAF7892F10 +:103BE0000E9436200C9467209BE5980F933070F468 +:103BF000853A29F0863A31F083E890E005C081E803 +:103C000090E002C082E890E00C946C1D98E5980F5B +:103C1000973108F08EC0883A09F445C0893A09F412 +:103C200045C08A3A09F445C08B3A09F445C08C3A3C +:103C300009F445C08D3A09F445C08E3A09F445C0EF +:103C40008F3A09F445C0813B09F445C0803B09F433 +:103C500045C0823B09F445C0833B09F445C0843B21 +:103C600009F445C0853B09F445C0863B09F445C0CD +:103C7000873B09F445C0883B09F445C0893B09F4FA +:103C800045C08A3B09F445C08B3B09F445C08C3BD9 +:103C900009F445C08D3B09F445C08E3B09F445C08D +:103CA00080E090E044C082EE90E041C089EE90E078 +:103CB0003EC08AEE90E03BC085EB90E038C086EBDA +:103CC00090E035C083EB90E032C084EB90E02FC0F1 +:103CD00087EB90E02CC08CEC90E029C08DEC90E05C +:103CE00026C083E891E023C08AE891E020C082E901 +:103CF00091E01DC084E991E01AC081E292E017C012 +:103D000083E292E014C084E292E011C085E292E086 +:103D10000EC086E292E00BC087E292E008C08AE221 +:103D200092E005C08FE690E002C080E790E00C943E +:103D3000821D0895882329F19CEF980F913A18F479 +:103D40000E9418200DC090E2980F983058F48770A8 +:103D500091E001C0990F8A95EAF7892F0E943C20D3 +:103D60000C9467209BE5980F933020F480E090E05E +:103D70000C946C1D885A873120F480E090E00C94FC +:103D8000821D08950E9453200E9428200C946720D1 +:103D90000E9443200C94C21EEF92FF920F931F9338 +:103DA000CF93DF9300D000D01F92CDB7DEB78C0148 +:103DB0000E94F320811190C085E0F801DE01119688 +:103DC00001900D928A95E1F7F8014081518123819C +:103DD00034812115310531F05F3F31F481E04F3FEF +:103DE00019F403C081E001C080E080FD75C0F801D6 +:103DF000E28049835A83EB82722F3D832C836E2DA0 +:103E00008D810E94B51FF82E492F4F70892F829502 +:103E10008F708E30B1F108F050C0823008F05CC075 +:103E2000907F142F11F01295107FEE20A9F011232E +:103E300029F0812F0E9446200E9467208F2D0F902D +:103E40000F900F900F900F90DF91CF911F910F91D6 +:103E5000FF90EF900C94DB1D8F2D0E949A1E112372 +:103E6000D9F1812F0E944C200F900F900F900F904E +:103E70000F90DF91CF911F910F91FF90EF900C94D5 +:103E80006720F11029C0EE2039F10E94C81EFFEF13 +:103E900020E782E0F15020408040E1F700C00000C0 +:103EA0000F900F900F900F900F90DF91CF911F9177 +:103EB0000F91FF90EF900C9453216F2DC8010F903C +:103EC0000F900F900F900F90DF91CF911F910F9156 +:103ED000FF90EF900C9472210F900F900F900F9025 +:103EE0000F90DF91CF911F910F91FF90EF90089568 +:103EF000CF93DF93CDB7DEB72A970FB6F894DEBF26 +:103F00000FBECDBF942F4E83252F5F83688779879F +:103F10008A8749855A85452B31F02F3F31F481E05E +:103F20009F3F19F403C081E001C080E080FD07C01D +:103F30004E815F81688579858A850E94E22085E0CF +:103F4000FE013696DE01119601900D928A95E1F7F9 +:103F5000CE0101960E94CC1E2A960FB6F894DEBFC1 +:103F60000FBECDBFDF91CF9108950F931F93CF93D5 +:103F7000DF9300D000D01F92CDB7DEB7042F498366 +:103F80005A836B837C838D832C813D81232B31F07D +:103F90005F3F31F481E04F3F19F403C081E001C07D +:103FA00080E080FF03C080E090E01BC08B8110E0C8 +:103FB000882379F06091AA057091AB058091AC05DA +:103FC0009091AD050E949220F801E655FA4F80834A +:103FD00004C0F801E655FA4F808169817A810E9418 +:103FE00082210F900F900F900F900F90DF91CF9143 +:103FF0001F910F9108952091130130911401F9013F +:1040000032969FEF40E05191851789F09F3F19F458 +:10401000511101C0942F4F5F4630A9F79F3F39F0EF +:10402000F901E90FF11D97FDFA958283089508952E +:10403000E0911301F09114019F012A5F3F4F92819B +:10404000891301C012823196E217F307C1F7089570 +:1040500081E090E0E0911301F0911401E80FF91F65 +:104060001082019688309105A9F708959091B805BE +:10407000892B8093B805089580959091B805892380 +:104080008093B80508951092B80508959091B705EA +:10409000892B8093B705089580959091B705892362 +:1040A0008093B70508951092B70508958091130184 +:1040B00090911401FC0131969C01285F3F4F80E0F4 +:1040C000919191118F5FE217F307D1F70895E09175 +:1040D0001301F09114018091B8058083E0911301E0 +:1040E000F091140190818091B705892B8083809194 +:1040F000AE05882361F0E0911301F09114019081E5 +:10410000892B80830E94562081111092AE058091E8 +:104110001301909114010C94611D9093A701809359 +:10412000A6010895CF92DF92EF92FF926C01EE24E8 +:10413000FF24C114D104E104F10421F0C701B60148 +:1041400020E101C020E0C72ED82EE92EFF24C114A3 +:10415000D104E104F10419F0285FC701B6016B0135 +:104160007C0154E0F694E794D794C7945A95D1F71C +:10417000C114D104E104F10419F02C5FC701B601A8 +:104180006B017C0142E0F694E794D794C7944A957A +:10419000D1F7C114D104E104F10419F02E5FC70175 +:1041A000B601DC01CB01B695A79597958795892B2C +:1041B0008A2B8B2B09F02F5F822FFF90EF90DF90DF +:1041C000CF900895CF93DF9300D000D01F92CDB74A +:1041D000DEB70F900F900F900F900F90DF91CF915F +:1041E00008950C94D51D80E008958091BE0584301B +:1041F00021F11092B90520E488E190E00FB6F8941F +:10420000A895809360000FBE2093600083B7817FE4 +:10421000846083BF83B7816083BF7894889583B7B8 +:104220008E7F83BF0FB6F894A89580916000886157 +:1042300080936000109260000FBE08950E94D91D07 +:104240000E9475060E94DA1D80E008950E94D71D25 +:104250000C94C81E1F920F920FB60F9211248F93C9 +:104260009F93AF93BF938091B905811113C0809143 +:104270008B0490918C04A0918D04B0918E04419692 +:10428000A11DB11D80938B0490938C04A0938D0489 +:10429000B0938E04BF91AF919F918F910F900FBEFD +:1042A0000F901F9018950E94BE1BF89487E797E720 +:1042B000909301088093000887E090EBDC018093E5 +:1042C000C7059093C805A093C905B093CA059CE0A3 +:1042D00088E10FB6F894A895809360000FBE909384 +:1042E0006000FFCF0895E62FF0E0EB5AFD4F849178 +:1042F0000895E82FF0E0EE0FFF1FED52FF4F85917C +:10430000949108950E94732190E4980F903218F4CC +:104310000E94792108958F3B50F4883A48F5853AF8 +:10432000D0F48430A8F4813009F4B2C0AEC0883E25 +:1043300040F4803E68F48F3B09F0A7C020E030EEE7 +:10434000A9C0803F08F4A1C0282F30E03065A2C08A +:10435000282F30E09FC0853A29F0863A31F023E8D3 +:1043600030E498C021E830E495C022E830E492C0FF +:10437000883A09F445C0893A09F445C08A3A09F4F3 +:1043800045C08B3A09F445C08C3A09F445C08D3AD2 +:1043900009F445C08E3A09F445C08F3A09F445C086 +:1043A000813B09F445C0803B09F445C0823B09F4D8 +:1043B00045C0833B09F445C0843B09F445C0853BB7 +:1043C00009F445C0863B09F445C0873B09F445C064 +:1043D000883B09F445C0893B09F445C08A3B09F490 +:1043E00045C08B3B09F445C08C3B09F445C08D3B6F +:1043F00009F445C08E3B09F445C020E034E44AC0CE +:1044000022EE34E447C029EE34E444C02AEE34E41A +:1044100041C025EB34E43EC026EB34E43BC023EB43 +:1044200034E438C024EB34E435C027EB34E432C044 +:104430002CEC34E42FC02DEC34E42CC023E835E41C +:1044400029C02AE835E426C022E935E423C024E95E +:1044500035E420C021E236E41DC023E236E41AC070 +:1044600024E236E417C025E236E414C026E236E43E +:1044700011C027E236E40EC02AE236E40BC02FE674 +:1044800034E408C020E734E405C020E030E002C096 +:1044900021E030E0C90108950E94BD2208F481E0C6 +:1044A00008950E94112388F09F5798F0B92F9927FB +:1044B000B751B0F0E1F0660F771F881F991F1AF00F +:1044C000BA95C9F714C0B13091F00E942B23B1E026 +:1044D00008950C942B23672F782F8827B85F39F025 +:1044E000B93FCCF3869577956795B395D9F73EF4A8 +:1044F00090958095709561957F4F8F4F9F4F089550 +:10450000E89409C097FB3EF490958095709561956D +:104510007F4F8F4F9F4F9923A9F0F92F96E9BB2723 +:104520009395F695879577956795B795F111F8CF9F +:10453000FAF4BB0F11F460FF1BC06F5F7F4F8F4F0A +:104540009F4F16C0882311F096E911C0772321F000 +:104550009EE8872F762F05C0662371F096E8862F98 +:1045600070E060E02AF09A95660F771F881FDAF7EF +:10457000880F9695879597F90895990F0008550F1C +:10458000AA0BE0E8FEEF16161706E807F907C0F0D9 +:1045900012161306E407F50798F0621B730B840BE1 +:1045A000950B39F40A2661F0232B242B252B21F4BB +:1045B00008950A2609F4A140A6958FEF811D811D5B +:1045C000089597F99F6780E870E060E008959FEF95 +:1045D00080EC089500240A9416161706180609069A +:1045E000089500240A941216130614060506089569 +:1045F000092E0394000C11F4882352F0BB0F40F4F1 +:10460000BF2B11F460FF04C06F5F7F4F8F4F9F4F30 +:10461000089557FD9058440F551F59F05F3F71F0B2 +:104620004795880F97FB991F61F09F3F79F0879519 +:104630000895121613061406551FF2CF4695F1DFA2 +:1046400008C0161617061806991FF1CF8695710532 +:10465000610508940895E894BB2766277727CB0166 +:1046600097F908950E94BD2208F48FEF08950E94E3 +:104670004A230C94F8220E94EA2238F00E94F12288 +:1046800020F0952311F00C94E1220C94E7221124E0 +:104690000C942C230E94092370F3959FC1F3950F6E +:1046A00050E0551F629FF001729FBB27F00DB11DB6 +:1046B000639FAA27F00DB11DAA1F649F6627B00D46 +:1046C000A11D661F829F2227B00DA11D621F739F2F +:1046D000B00DA11D621F839FA00D611D221F749F3D +:1046E0003327A00D611D231F849F600D211D822F84 +:1046F000762F6A2F11249F5750409AF0F1F08823AB +:104700004AF0EE0FFF1FBB1F661F771F881F9150D7 +:104710005040A9F79E3F510580F00C94E1220C9483 +:104720002C235F3FE4F3983ED4F386957795679505 +:10473000B795F795E7959F5FC1F7FE2B880F911D01 +:104740009695879597F90895EE0FFF1F0590F491C0 +:08475000E02D0994F894FFCF5D +:10475800010599040000FF4C1551154F158A165094 +:10476800150101AF052F2F20556E6B6E6F776E20E8 +:10477800484944204465736320547970653A002F92 +:104788002F20556E6B6E6F776E20446573632054CF +:104798007970653A00206C656E002F2F2069645689 +:1047A800656E646F72002F2F20696450726F647594 +:1047B8006374002F2F206C616E676964000000002D +:1047C80000D602000000007A078007760779077094 +:1047D8000773077307000000009B084208FB0800E6 +:1047E8000000002B127C118A111D15821179137E8D +:0647F80011851180110083 :00000001FF diff --git a/converter/usb_desc_dump/desc_dump.cpp b/converter/usb_desc_dump/desc_dump.cpp index 5f66a042..0991a65a 100644 --- a/converter/usb_desc_dump/desc_dump.cpp +++ b/converter/usb_desc_dump/desc_dump.cpp @@ -34,20 +34,17 @@ SOFTWARE. #include "print.h" +#define AUDIO_CLASS_INTERFACE 0x24 +#define AUDIO_CLASS_ENDPOINT 0x25 + + USB Usb; USBHub hub1(&Usb); - -#define BUF_SIZE 256 +#define BUF_SIZE 512 uint8_t buf[BUF_SIZE]; - -#define RBUF_SIZE 256 -uint8_t rbuf[RBUF_SIZE]; - -#define SBUF_SIZE 64 -uint8_t sbuf[SBUF_SIZE]; - uint16_t langid = 0; +EpInfo epInfo[1]; void printHEX(uint8_t hex) @@ -91,17 +88,34 @@ void dumpBuf(int len, uint8_t* buf, bool commented = false) print("\r\n"); } +class dumpCallback : public USBReadParser { +public: + void Parse(const uint16_t len, const uint8_t *pbuf, const uint16_t &offset) { + for (int i = 0; i < len; i++) { + if ((offset + i) % 16) + print(" "); + else { + if ((offset + i) != 0) print("\r\n"); + } + + printHEX(pbuf[i]); + } + } +} dumper; + void printStringDescriptor(UsbDevice *pdev, uint8_t index, uint16_t langid) { + uint8_t sbuf[256]; uint8_t rcode, len; + if (index == 0) return; rcode = Usb.getStrDescr(pdev->address.devAddress, 0, 1, index, langid, sbuf); - if (rcode) { printVal("rcode", rcode); return; } + if (rcode) { printError(rcode); return; } len = (sbuf[0] > sizeof(sbuf) ? sizeof(sbuf) : sbuf[0]); rcode = Usb.getStrDescr(pdev->address.devAddress, 0, len, index, langid, sbuf); - if (rcode) { printVal("rcode", rcode); return; } + if (rcode) { printError(rcode); return; } xprintf("String%d: ", index); @@ -117,11 +131,12 @@ void printStringDescriptor(UsbDevice *pdev, uint8_t index, uint16_t langid) uint8_t dumpReportDesc(UsbDevice *pdev, uint16_t iface, uint16_t len) { + uint8_t rbuf[64]; uint8_t rcode = 0; - Usb.ctrlReq(pdev->address.devAddress, 0x00, bmREQ_HID_REPORT, USB_REQUEST_GET_DESCRIPTOR, 0x00, - HID_DESCRIPTOR_REPORT, iface, len, RBUF_SIZE, rbuf, NULL); - if (rcode) return rcode; - dumpBuf(len, rbuf); + rcode = Usb.ctrlReq(pdev->address.devAddress, 0x00, bmREQ_HID_REPORT, USB_REQUEST_GET_DESCRIPTOR, 0x00, + HID_DESCRIPTOR_REPORT, iface, len, sizeof(rbuf), rbuf, &dumper); + print("\r\n"); + if (rcode) { printError(rcode); } return rcode; } @@ -148,7 +163,8 @@ void scanConfigDesc(UsbDevice *pdev, uint16_t tl, uint8_t* pB) printStringDescriptor(pdev, pI->iInterface, langid); } break; - } + } + case HID_DESCRIPTOR_HID: { USB_HID_DESCRIPTOR *pH = (USB_HID_DESCRIPTOR *)pB; xprintf("\r\n// Report%d: len:%04X\r\n", iface, pH->wDescriptorLength); @@ -159,9 +175,20 @@ void scanConfigDesc(UsbDevice *pdev, uint16_t tl, uint8_t* pB) } break; } + + case USB_DESCRIPTOR_DEBUG: + case USB_DESCRIPTOR_INTERFACE_ASSOCIATION: + case USB_DESCRIPTOR_BOS: + case USB_DESCRIPTOR_DEVICE_CAPABILITY: + case USB_DESCRIPTOR_SS_USB_EP_COMPANION: + case USB_DESCRIPTOR_SSP_ISO_EP_COMPANION: + // Class specific + case AUDIO_CLASS_INTERFACE: + case AUDIO_CLASS_ENDPOINT: + break; default: printVal("// Unknown Desc Type:", *(pB+1)); - return; + break; } pB += *pB; } @@ -176,12 +203,13 @@ uint8_t dumpConfigDesc(UsbDevice *pdev, uint8_t numConf) rcode = Usb.getConfDescr(pdev->address.devAddress, 0, sizeof(USB_CONFIGURATION_DESCRIPTOR), i, buf); if (rcode) return rcode; USB_CONFIGURATION_DESCRIPTOR *pC = (USB_CONFIGURATION_DESCRIPTOR *)&buf; - uint16_t tl = pC->wTotalLength; - printVal(" len", tl); + printVal(" len", pC->wTotalLength); + uint16_t conf_len = (pC->wTotalLength < BUF_SIZE ? pC->wTotalLength : BUF_SIZE); - rcode = Usb.getConfDescr(pdev->address.devAddress, 0, (tl < BUF_SIZE ? tl : BUF_SIZE), i, buf); + rcode = Usb.getConfDescr(pdev->address.devAddress, 0, conf_len, i, buf); if (rcode) return rcode; - dumpBuf(tl, buf); + dumpBuf(conf_len, buf); + if (pC->wTotalLength > BUF_SIZE) println("Buffer is not enough!"); // String Descriptor if (pC->iConfiguration) { @@ -189,7 +217,10 @@ uint8_t dumpConfigDesc(UsbDevice *pdev, uint8_t numConf) printStringDescriptor(pdev, pC->iConfiguration, langid); } - scanConfigDesc(pdev, tl, buf); + // Set Configuration + Usb.setConf(pdev->address.devAddress, 0, pC->bConfigurationValue); + + scanConfigDesc(pdev, conf_len, buf); } return rcode; } @@ -210,8 +241,16 @@ void dumpDescriptors(UsbDevice *pdev) printVal("// idVendor", pD->idVendor); printVal("// idProduct", pD->idProduct); + // set maxpacketsize0 + epInfo[0].epAddr = 0; + epInfo[0].maxPktSize = pD->bMaxPacketSize0; + epInfo[0].bmNakPower = USB_NAK_MAX_POWER; + UsbDevice *p = Usb.GetAddressPool().GetUsbDevicePtr(pdev->address.devAddress); + p->epinfo = epInfo; + // String Descriptor if (pD->iManufacturer || pD->iProduct || pD->iSerialNumber) { + uint8_t sbuf[4]; rcode = Usb.getStrDescr(pdev->address.devAddress, 0, 4, 0, 0, sbuf); if (rcode == 0) { langid = (sbuf[3] << 8) | sbuf[2]; From 15ca74c8ad027df7664fddf79fce89b2c97dc0f3 Mon Sep 17 00:00:00 2001 From: tmk Date: Wed, 14 Jul 2021 23:39:10 +0900 Subject: [PATCH 22/28] lufa: Fix system control --- tmk_core/protocol/lufa/lufa.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/tmk_core/protocol/lufa/lufa.c b/tmk_core/protocol/lufa/lufa.c index e5077dfb..7a5bd746 100644 --- a/tmk_core/protocol/lufa/lufa.c +++ b/tmk_core/protocol/lufa/lufa.c @@ -603,10 +603,12 @@ static void send_system(uint16_t data) if (USB_DeviceState != DEVICE_STATE_Configured) return; - report_extra_t r = { - .report_id = REPORT_ID_SYSTEM, - .usage = data - SYSTEM_POWER_DOWN + 1 - }; + report_extra_t r = { .report_id = REPORT_ID_SYSTEM }; + if (data < SYSTEM_POWER_DOWN) { + r.usage = 0; + } else { + r.usage = data - SYSTEM_POWER_DOWN + 1; + } Endpoint_SelectEndpoint(MOUSE_IN_EPNUM); /* Check if write ready for a polling interval around 10ms */ From eb3d3b4c291d87dbc9935a1c9a6599ed57680724 Mon Sep 17 00:00:00 2001 From: tmk Date: Tue, 13 Jul 2021 12:46:42 +0900 Subject: [PATCH 23/28] lufa: Fix mouse Get/SetProtocol --- tmk_core/protocol/lufa/lufa.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tmk_core/protocol/lufa/lufa.c b/tmk_core/protocol/lufa/lufa.c index 7a5bd746..eaa32259 100644 --- a/tmk_core/protocol/lufa/lufa.c +++ b/tmk_core/protocol/lufa/lufa.c @@ -450,6 +450,7 @@ void EVENT_USB_Device_ControlRequest(void) print("[p]"); #endif } +#if defined(MOUSE_ENABLE) if (USB_ControlRequest.wIndex == MOUSE_INTERFACE) { Endpoint_ClearSETUP(); while (!(Endpoint_IsINReady())); @@ -457,6 +458,7 @@ void EVENT_USB_Device_ControlRequest(void) Endpoint_ClearIN(); Endpoint_ClearStatusStage(); } +#endif } break; @@ -473,6 +475,7 @@ void EVENT_USB_Device_ControlRequest(void) print("[P]"); #endif } +#if defined(MOUSE_ENABLE) if (USB_ControlRequest.wIndex == MOUSE_INTERFACE) { Endpoint_ClearSETUP(); Endpoint_ClearStatusStage(); @@ -480,6 +483,7 @@ void EVENT_USB_Device_ControlRequest(void) mouse_protocol = (USB_ControlRequest.wValue & 0xFF); clear_keyboard(); } +#endif } break; From 86b4d082d97e9e162619b029cf5592956a593c2b Mon Sep 17 00:00:00 2001 From: tmk Date: Fri, 16 Jul 2021 11:34:00 +0900 Subject: [PATCH 24/28] core: Add version string --- tmk_core/common.mk | 2 +- tmk_core/protocol/lufa.mk | 4 ++++ tmk_core/protocol/lufa/lufa.c | 6 +++++- tmk_core/protocol/usb_hid.mk | 4 ++++ 4 files changed, 14 insertions(+), 2 deletions(-) diff --git a/tmk_core/common.mk b/tmk_core/common.mk index f8e6f4cf..8033016a 100644 --- a/tmk_core/common.mk +++ b/tmk_core/common.mk @@ -113,7 +113,7 @@ ifeq (yes,$(strip $(KEYMAP_SECTION_ENABLE))) endif # Version string -TMK_VERSION := $(shell (git describe --always --dirty=+ || echo 'unknown') 2> /dev/null) +TMK_VERSION := $(shell (git rev-parse --short=6 HEAD || echo 'unknown') 2> /dev/null) OPT_DEFS += -DTMK_VERSION=$(TMK_VERSION) diff --git a/tmk_core/protocol/lufa.mk b/tmk_core/protocol/lufa.mk index 7afedd73..82ccc23b 100644 --- a/tmk_core/protocol/lufa.mk +++ b/tmk_core/protocol/lufa.mk @@ -4,6 +4,10 @@ TMK_LUFA_DIR = protocol/lufa TMK_LUFA_PATH ?= $(TMK_LUFA_DIR)/lufa-abcminiuser +# Version string +TMK_LUFA_VERSION := $(shell (cd $(TMK_DIR)/$(TMK_LUFA_PATH); git rev-parse --short=6 HEAD || echo 'unknown') 2> /dev/null) +OPT_DEFS += -DTMK_LUFA_VERSION=$(TMK_LUFA_VERSION) + # Create the LUFA source path variables by including the LUFA makefile ifneq (, $(wildcard $(TMK_DIR)/$(TMK_LUFA_PATH)/LUFA/Build/LUFA/lufa-sources.mk)) LUFA_PATH = $(TMK_LUFA_PATH)/LUFA diff --git a/tmk_core/protocol/lufa/lufa.c b/tmk_core/protocol/lufa/lufa.c index eaa32259..dadd4adc 100644 --- a/tmk_core/protocol/lufa/lufa.c +++ b/tmk_core/protocol/lufa/lufa.c @@ -708,7 +708,11 @@ int main(void) print_set_sendchar(sendchar); host_set_driver(&lufa_driver); - print("\n\nTMK:" STR(TMK_VERSION) "/LUFA\n\n"); + print("\nTMK:" STR(TMK_VERSION) "/LUFA:" STR(TMK_LUFA_VERSION) +#ifdef TMK_USB_HOST_SHIELD_VERSION + "/UHS2:" STR(TMK_USB_HOST_SHIELD_VERSION) +#endif + "\n"); hook_early_init(); keyboard_setup(); setup_usb(); diff --git a/tmk_core/protocol/usb_hid.mk b/tmk_core/protocol/usb_hid.mk index 6881ebc5..e6f957e8 100644 --- a/tmk_core/protocol/usb_hid.mk +++ b/tmk_core/protocol/usb_hid.mk @@ -12,6 +12,10 @@ USB_HOST_SHIELD_SRC = \ $(USB_HOST_SHIELD_DIR)/parsetools.cpp \ $(USB_HOST_SHIELD_DIR)/message.cpp +# Version string +TMK_USB_HOST_SHIELD_VERSION := $(shell (cd $(TMK_DIR)/$(USB_HOST_SHIELD_DIR); git rev-parse --short=6 HEAD || echo 'unknown') 2> /dev/null) +OPT_DEFS += -DTMK_USB_HOST_SHIELD_VERSION=$(TMK_USB_HOST_SHIELD_VERSION) + # From 4964617a31a93de421aff9ed780fd6cd8c08cc41 Mon Sep 17 00:00:00 2001 From: tmk Date: Fri, 16 Jul 2021 23:56:02 +0900 Subject: [PATCH 25/28] core: NO_KEYBOARD build option disables USB keyboard interface --- tmk_core/common.mk | 5 ++- tmk_core/common/avr/suspend.c | 4 ++ tmk_core/common/hook.c | 3 ++ tmk_core/common/hook.h | 4 ++ tmk_core/common/print.h | 6 +++ tmk_core/protocol/lufa/descriptor.c | 16 +++++-- tmk_core/protocol/lufa/descriptor.h | 20 ++++++--- tmk_core/protocol/lufa/lufa.c | 67 ++++++++++++++++++++++++----- 8 files changed, 104 insertions(+), 21 deletions(-) diff --git a/tmk_core/common.mk b/tmk_core/common.mk index 8033016a..6805fa62 100644 --- a/tmk_core/common.mk +++ b/tmk_core/common.mk @@ -17,7 +17,10 @@ SRC += $(COMMON_DIR)/host.c \ $(COMMON_DIR)/avr/bootloader.c -# Option modules +ifeq (yes,$(strip $(NO_KEYBOARD))) + OPT_DEFS += -DNO_KEYBOARD +endif + ifeq (yes,$(strip $(UNIMAP_ENABLE))) SRC += $(COMMON_DIR)/unimap.c OPT_DEFS += -DUNIMAP_ENABLE diff --git a/tmk_core/common/avr/suspend.c b/tmk_core/common/avr/suspend.c index ea8099d0..7a17edbf 100644 --- a/tmk_core/common/avr/suspend.c +++ b/tmk_core/common/avr/suspend.c @@ -115,21 +115,25 @@ void suspend_power_down(void) bool suspend_wakeup_condition(void) { +#ifndef NO_KEYBOARD matrix_power_up(); matrix_scan(); matrix_power_down(); for (uint8_t r = 0; r < MATRIX_ROWS; r++) { if (matrix_get_row(r)) return true; } +#endif return false; } // run immediately after wakeup void suspend_wakeup_init(void) { +#ifndef NO_KEYBOARD // clear keyboard state matrix_clear(); clear_keyboard(); +#endif #ifdef BACKLIGHT_ENABLE backlight_init(); #endif diff --git a/tmk_core/common/hook.c b/tmk_core/common/hook.c index 22be9a30..6cf9977d 100644 --- a/tmk_core/common/hook.c +++ b/tmk_core/common/hook.c @@ -22,6 +22,9 @@ along with this program. If not, see . * Definitions of default hooks * ------------------------------------------------- */ +__attribute__((weak)) +void hook_main_loop(void) {} + __attribute__((weak)) void hook_keyboard_loop(void) {} diff --git a/tmk_core/common/hook.h b/tmk_core/common/hook.h index ddd05c6f..77f10845 100644 --- a/tmk_core/common/hook.h +++ b/tmk_core/common/hook.h @@ -56,6 +56,10 @@ void hook_usb_wakeup(void); /* Default behaviour: do nothing. */ void hook_usb_startup_wait_loop(void); +/* Called periodically from main loop */ +/* Default behaviour: do nothing. */ +void hook_main_loop(void); + /* ------------------------------------- * Keyboard hooks diff --git a/tmk_core/common/print.h b/tmk_core/common/print.h index 9eec9191..4f72f865 100644 --- a/tmk_core/common/print.h +++ b/tmk_core/common/print.h @@ -100,6 +100,12 @@ void print_set_sendchar(int8_t (*print_sendchar_func)(uint8_t)); #else /* NO_PRINT */ #define xprintf(s,...) ((void)0) +#define xsprintf(s,...) ((void)0) +#define xfprintf(s,...) ((void)0) +#define xputs(s) ((void)0) +#define xputc(c) ((void)0) +#define xitoa(v, r, w) ((void)0) +#define xatoi(s, r) ((void)0) #define print(s) ((void)0) #define println(s) ((void)0) #define print_set_sendchar(func) ((void)0) diff --git a/tmk_core/protocol/lufa/descriptor.c b/tmk_core/protocol/lufa/descriptor.c index 1dbaac03..f365222d 100644 --- a/tmk_core/protocol/lufa/descriptor.c +++ b/tmk_core/protocol/lufa/descriptor.c @@ -44,6 +44,7 @@ /******************************************************************************* * HID Report Descriptors ******************************************************************************/ +#ifndef NO_KEYBOARD const USB_Descriptor_HIDReport_Datatype_t PROGMEM KeyboardReport[] = { #ifndef NKRO_ENABLE @@ -118,6 +119,7 @@ const USB_Descriptor_HIDReport_Datatype_t PROGMEM KeyboardReport[] = HID_RI_END_COLLECTION(0), #endif }; +#endif #if defined(MOUSE_ENABLE) || defined(EXTRAKEY_ENABLE) const USB_Descriptor_HIDReport_Datatype_t PROGMEM MouseReport[] = @@ -240,7 +242,7 @@ const USB_Descriptor_HIDReport_Datatype_t PROGMEM ConsoleReport[] = }; #endif -#ifdef NKRO_6KRO_ENABLE +#if !defined(NO_KEYBOARD) && defined(NKRO_6KRO_ENABLE) const USB_Descriptor_HIDReport_Datatype_t PROGMEM NKROReport[] = { HID_RI_USAGE_PAGE(8, 0x01), /* Generic Desktop */ @@ -326,6 +328,7 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor = /* * Keyboard */ +#ifndef NO_KEYBOARD .Keyboard_Interface = { .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, @@ -367,6 +370,7 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor = .PollingIntervalMS = 0x0A #endif }, +#endif /* * Mouse @@ -470,7 +474,7 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor = /* * NKRO */ -#ifdef NKRO_6KRO_ENABLE +#if !defined(NO_KEYBOARD) && defined(NKRO_6KRO_ENABLE) .NKRO_Interface = { .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, @@ -583,10 +587,12 @@ uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, break; case HID_DTYPE_HID: switch (wIndex) { +#ifndef NO_KEYBOARD case KEYBOARD_INTERFACE: Address = &ConfigurationDescriptor.Keyboard_HID; Size = sizeof(USB_HID_Descriptor_HID_t); break; +#endif #if defined(MOUSE_ENABLE) || defined(EXTRAKEY_ENABLE) case MOUSE_INTERFACE: Address = &ConfigurationDescriptor.Mouse_HID; @@ -599,7 +605,7 @@ uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, Size = sizeof(USB_HID_Descriptor_HID_t); break; #endif -#ifdef NKRO_6KRO_ENABLE +#if !defined(NO_KEYBOARD) && defined(NKRO_6KRO_ENABLE) case NKRO_INTERFACE: Address = &ConfigurationDescriptor.NKRO_HID; Size = sizeof(USB_HID_Descriptor_HID_t); @@ -609,10 +615,12 @@ uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, break; case HID_DTYPE_Report: switch (wIndex) { +#ifndef NO_KEYBOARD case KEYBOARD_INTERFACE: Address = &KeyboardReport; Size = sizeof(KeyboardReport); break; +#endif #if defined(MOUSE_ENABLE) || defined(EXTRAKEY_ENABLE) case MOUSE_INTERFACE: Address = &MouseReport; @@ -625,7 +633,7 @@ uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, Size = sizeof(ConsoleReport); break; #endif -#ifdef NKRO_6KRO_ENABLE +#if !defined(NO_KEYBOARD) && defined(NKRO_6KRO_ENABLE) case NKRO_INTERFACE: Address = &NKROReport; Size = sizeof(NKROReport); diff --git a/tmk_core/protocol/lufa/descriptor.h b/tmk_core/protocol/lufa/descriptor.h index 5c09be30..4bba0cc0 100644 --- a/tmk_core/protocol/lufa/descriptor.h +++ b/tmk_core/protocol/lufa/descriptor.h @@ -52,10 +52,12 @@ typedef struct { USB_Descriptor_Configuration_Header_t Config; +#ifndef NO_KEYBOARD // Keyboard HID Interface USB_Descriptor_Interface_t Keyboard_Interface; USB_HID_Descriptor_HID_t Keyboard_HID; USB_Descriptor_Endpoint_t Keyboard_INEndpoint; +#endif #if defined(MOUSE_ENABLE) || defined(EXTRAKEY_ENABLE) // Mouse HID Interface @@ -72,7 +74,7 @@ typedef struct USB_Descriptor_Endpoint_t Console_OUTEndpoint; #endif -#ifdef NKRO_6KRO_ENABLE +#if !defined(NO_KEYBOARD) && defined(NKRO_6KRO_ENABLE) // NKRO HID Interface USB_Descriptor_Interface_t NKRO_Interface; USB_HID_Descriptor_HID_t NKRO_HID; @@ -82,7 +84,11 @@ typedef struct /* index of interface */ -#define KEYBOARD_INTERFACE 0 +#ifndef NO_KEYBOARD +# define KEYBOARD_INTERFACE 0 +#else +# define KEYBOARD_INTERFACE -1 +#endif #if defined(MOUSE_ENABLE) || defined(EXTRAKEY_ENABLE) # define MOUSE_INTERFACE (KEYBOARD_INTERFACE + 1) @@ -96,7 +102,7 @@ typedef struct # define CONSOLE_INTERFACE MOUSE_INTERFACE #endif -#ifdef NKRO_6KRO_ENABLE +#if !defined(NO_KEYBOARD) && defined(NKRO_6KRO_ENABLE) # define NKRO_INTERFACE (CONSOLE_INTERFACE + 1) #else # define NKRO_INTERFACE CONSOLE_INTERFACE @@ -108,7 +114,11 @@ typedef struct // Endopoint number and size -#define KEYBOARD_IN_EPNUM 1 +#ifndef NO_KEYBOARD +# define KEYBOARD_IN_EPNUM 1 +#else +# define KEYBOARD_IN_EPNUM 0 +#endif #if defined(MOUSE_ENABLE) || defined(EXTRAKEY_ENABLE) # define MOUSE_IN_EPNUM (KEYBOARD_IN_EPNUM + 1) @@ -123,7 +133,7 @@ typedef struct # define CONSOLE_OUT_EPNUM MOUSE_IN_EPNUM #endif -#ifdef NKRO_6KRO_ENABLE +#if !defined(NO_KEYBOARD) && defined(NKRO_6KRO_ENABLE) # define NKRO_IN_EPNUM (CONSOLE_OUT_EPNUM + 1) #else # define NKRO_IN_EPNUM CONSOLE_OUT_EPNUM diff --git a/tmk_core/protocol/lufa/lufa.c b/tmk_core/protocol/lufa/lufa.c index dadd4adc..8653c46e 100644 --- a/tmk_core/protocol/lufa/lufa.c +++ b/tmk_core/protocol/lufa/lufa.c @@ -68,27 +68,35 @@ //#define TMK_LUFA_DEBUG +#ifndef NO_KEYBOARD uint8_t keyboard_idle = 0; /* 0: Boot Protocol, 1: Report Protocol(default) */ uint8_t keyboard_protocol = 1; -uint8_t mouse_protocol = 1; static uint8_t keyboard_led_stats = 0; - static report_keyboard_t keyboard_report_sent; +#endif + +#ifdef MOUSE_ENABLE +uint8_t mouse_protocol = 1; +#endif /* Host driver */ +#ifndef NO_KEYBOARD static uint8_t keyboard_leds(void); static void send_keyboard(report_keyboard_t *report); +#endif static void send_mouse(report_mouse_t *report); static void send_system(uint16_t data); static void send_consumer(uint16_t data); host_driver_t lufa_driver = { - keyboard_leds, - send_keyboard, - send_mouse, - send_system, - send_consumer +#ifndef NO_KEYBOARD + .keyboard_leds = keyboard_leds, + .send_keyboard = send_keyboard, +#endif + .send_mouse = send_mouse, + .send_system = send_system, + .send_consumer = send_consumer }; @@ -328,6 +336,7 @@ void EVENT_USB_Device_ConfigurationChanged(void) #endif bool ConfigSuccess = true; +#ifndef NO_KEYBOARD /* Setup Keyboard HID Report Endpoints */ ConfigSuccess &= ENDPOINT_CONFIG(KEYBOARD_IN_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN, #ifdef NKRO_ENABLE @@ -336,6 +345,7 @@ void EVENT_USB_Device_ConfigurationChanged(void) KEYBOARD_EPSIZE, #endif ENDPOINT_BANK_SINGLE); +#endif #if defined(MOUSE_ENABLE) || defined(EXTRAKEY_ENABLE) /* Setup Mouse HID Report Endpoint */ @@ -378,15 +388,16 @@ Other Device Required Optional Optional Optional Optional Opti */ void EVENT_USB_Device_ControlRequest(void) { - uint8_t* ReportData = NULL; - uint8_t ReportSize = 0; - /* Handle HID Class specific requests */ switch (USB_ControlRequest.bRequest) { case HID_REQ_GetReport: +#ifndef NO_KEYBOARD if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE)) { + uint8_t* ReportData = NULL; + uint8_t ReportSize = 0; + Endpoint_ClearSETUP(); // Interface @@ -405,6 +416,7 @@ void EVENT_USB_Device_ControlRequest(void) xprintf("[r%d]", USB_ControlRequest.wIndex); #endif } +#endif break; case HID_REQ_SetReport: @@ -413,6 +425,7 @@ void EVENT_USB_Device_ControlRequest(void) // Interface switch (USB_ControlRequest.wIndex) { +#ifndef NO_KEYBOARD case KEYBOARD_INTERFACE: #ifdef NKRO_6KRO_ENABLE case NKRO_INTERFACE: @@ -431,6 +444,7 @@ void EVENT_USB_Device_ControlRequest(void) xprintf("[L%d]", USB_ControlRequest.wIndex); #endif break; +#endif } } @@ -440,6 +454,7 @@ void EVENT_USB_Device_ControlRequest(void) case HID_REQ_GetProtocol: if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE)) { +#ifndef NO_KEYBOARD if (USB_ControlRequest.wIndex == KEYBOARD_INTERFACE) { Endpoint_ClearSETUP(); while (!(Endpoint_IsINReady())); @@ -450,6 +465,7 @@ void EVENT_USB_Device_ControlRequest(void) print("[p]"); #endif } +#endif #if defined(MOUSE_ENABLE) if (USB_ControlRequest.wIndex == MOUSE_INTERFACE) { Endpoint_ClearSETUP(); @@ -465,6 +481,7 @@ void EVENT_USB_Device_ControlRequest(void) case HID_REQ_SetProtocol: if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) { +#ifndef NO_KEYBOARD if (USB_ControlRequest.wIndex == KEYBOARD_INTERFACE) { Endpoint_ClearSETUP(); Endpoint_ClearStatusStage(); @@ -475,6 +492,7 @@ void EVENT_USB_Device_ControlRequest(void) print("[P]"); #endif } +#endif #if defined(MOUSE_ENABLE) if (USB_ControlRequest.wIndex == MOUSE_INTERFACE) { Endpoint_ClearSETUP(); @@ -490,12 +508,14 @@ void EVENT_USB_Device_ControlRequest(void) case HID_REQ_SetIdle: if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) { +#ifndef NO_KEYBOARD Endpoint_ClearSETUP(); Endpoint_ClearStatusStage(); keyboard_idle = ((USB_ControlRequest.wValue & 0xFF00) >> 8); #ifdef TMK_LUFA_DEBUG xprintf("[I%d]%d", USB_ControlRequest.wIndex, (USB_ControlRequest.wValue & 0xFF00) >> 8); +#endif #endif } @@ -503,6 +523,7 @@ void EVENT_USB_Device_ControlRequest(void) case HID_REQ_GetIdle: if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE)) { +#ifndef NO_KEYBOARD Endpoint_ClearSETUP(); while (!(Endpoint_IsINReady())); Endpoint_Write_8(keyboard_idle); @@ -510,6 +531,7 @@ void EVENT_USB_Device_ControlRequest(void) Endpoint_ClearStatusStage(); #ifdef TMK_LUFA_DEBUG print("[i]"); +#endif #endif } @@ -520,6 +542,7 @@ void EVENT_USB_Device_ControlRequest(void) /******************************************************************************* * Host driver ******************************************************************************/ +#ifndef NO_KEYBOARD static uint8_t keyboard_leds(void) { return keyboard_led_stats; @@ -568,6 +591,7 @@ static void send_keyboard(report_keyboard_t *report) keyboard_report_sent = *report; } +#endif static void send_mouse(report_mouse_t *report) { @@ -713,16 +737,27 @@ int main(void) "/UHS2:" STR(TMK_USB_HOST_SHIELD_VERSION) #endif "\n"); + hook_early_init(); + +#ifndef NO_KEYBOARD keyboard_setup(); +#endif + setup_usb(); + #ifdef SLEEP_LED_ENABLE sleep_led_init(); #endif sei(); +#ifndef NO_KEYBOARD keyboard_init(); +#else + // TODO: keyboard_init() should be used only for things related to keyboard + timer_init(); +#endif #ifndef NO_USB_STARTUP_WAIT_LOOP /* wait for USB startup */ @@ -739,7 +774,7 @@ int main(void) hook_late_init(); - print("\nKeyboard start.\n"); + print("\nLoop start.\n"); while (1) { #ifndef NO_USB_SUSPEND_LOOP while (USB_DeviceState == DEVICE_STATE_Suspended) { @@ -747,7 +782,11 @@ int main(void) } #endif + hook_main_loop(); + +#ifndef NO_KEYBOARD keyboard_task(); +#endif #ifdef CONSOLE_ENABLE console_task(); @@ -767,10 +806,13 @@ void hook_early_init(void) {} __attribute__((weak)) void hook_late_init(void) {} +#ifndef NO_KEYBOARD static uint8_t _led_stats = 0; +#endif __attribute__((weak)) void hook_usb_suspend_entry(void) { +#ifndef NO_KEYBOARD // Turn off LED to save power and keep its status to resotre it later. // LED status will be updated by keyboard_task() in main loop hopefully. _led_stats = keyboard_led_stats; @@ -780,6 +822,7 @@ void hook_usb_suspend_entry(void) matrix_clear(); clear_keyboard(); +#endif #ifdef SLEEP_LED_ENABLE sleep_led_enable(); #endif @@ -805,8 +848,10 @@ void hook_usb_wakeup(void) sleep_led_disable(); #endif +#ifndef NO_KEYBOARD // Restore LED status and update at keyboard_task() in main loop keyboard_led_stats = _led_stats; +#endif // Calling long task here can prevent USB state transition } From ece5941e22302cfd52248417876bdb10e54efb33 Mon Sep 17 00:00:00 2001 From: tmk Date: Tue, 20 Jul 2021 18:21:54 +0900 Subject: [PATCH 26/28] usb_hid: Fix for override of Serial.write --- tmk_core/protocol/usb_hid/override_Serial.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tmk_core/protocol/usb_hid/override_Serial.cpp b/tmk_core/protocol/usb_hid/override_Serial.cpp index 00bc018c..7cea44a9 100644 --- a/tmk_core/protocol/usb_hid/override_Serial.cpp +++ b/tmk_core/protocol/usb_hid/override_Serial.cpp @@ -51,8 +51,10 @@ size_t Serial_::write(uint8_t c) size_t Serial_::write(const uint8_t *buffer, size_t size) { - sendchar(*buffer); - return 1; + for (int i = 0; i < size; i++) { + sendchar(buffer[i]); + } + return size; } Serial_::operator bool() { From cf8712fda7bd0262643ece0f7be96d84a069c1e4 Mon Sep 17 00:00:00 2001 From: tmk Date: Tue, 20 Jul 2021 22:45:21 +0900 Subject: [PATCH 27/28] core: Add EXTRA{C|CPP|AS}FLAGS in rule.mk --- tmk_core/rules.mk | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tmk_core/rules.mk b/tmk_core/rules.mk index 1c33cc84..b559e57b 100644 --- a/tmk_core/rules.mk +++ b/tmk_core/rules.mk @@ -348,9 +348,9 @@ GENDEPFLAGS = -MMD -MP -MF .dep/$(subst /,_,$@).d # Combine all necessary flags and optional flags. # Add target processor to flags. # You can give extra flags at 'make' command line like: make EXTRAFLAGS=-DFOO=bar -ALL_CFLAGS = -mmcu=$(MCU) $(CFLAGS) $(GENDEPFLAGS) $(EXTRAFLAGS) -ALL_CPPFLAGS = -mmcu=$(MCU) -x c++ $(CPPFLAGS) $(GENDEPFLAGS) $(EXTRAFLAGS) -ALL_ASFLAGS = -mmcu=$(MCU) -x assembler-with-cpp $(ASFLAGS) $(EXTRAFLAGS) +ALL_CFLAGS = -mmcu=$(MCU) $(CFLAGS) $(GENDEPFLAGS) $(EXTRAFLAGS) $(EXTRACFLAGS) +ALL_CPPFLAGS = -mmcu=$(MCU) -x c++ $(CPPFLAGS) $(GENDEPFLAGS) $(EXTRAFLAGS) $(EXTRACPPFLAGS) +ALL_ASFLAGS = -mmcu=$(MCU) -x assembler-with-cpp $(ASFLAGS) $(EXTRAFLAGS) $(EXTRAASFLAGS) From 44ee4f3fcd26f4d849a527c6f3418c6510ce7057 Mon Sep 17 00:00:00 2001 From: tmk Date: Tue, 20 Jul 2021 22:48:48 +0900 Subject: [PATCH 28/28] usb_desc_dump: build form arduino ino file --- converter/usb_desc_dump/Makefile | 51 +- converter/usb_desc_dump/README.md | 109 +- .../usb_desc_dump/binary/usb_desc_dump.hex | 2335 +++++++++-------- converter/usb_desc_dump/desc_dump.cpp | 340 --- converter/usb_desc_dump/ino.cpp | 37 + .../protocol/usb_hid/USB_Host_Shield_2.0-tmk | 2 +- 6 files changed, 1358 insertions(+), 1516 deletions(-) delete mode 100644 converter/usb_desc_dump/desc_dump.cpp create mode 100644 converter/usb_desc_dump/ino.cpp diff --git a/converter/usb_desc_dump/Makefile b/converter/usb_desc_dump/Makefile index a4e4eb2e..1db71359 100644 --- a/converter/usb_desc_dump/Makefile +++ b/converter/usb_desc_dump/Makefile @@ -1,7 +1,8 @@ TARGET ?= usb_desc_dump TMK_DIR ?= ../../tmk_core TARGET_DIR ?= . -SRC ?= desc_dump.cpp + +SRC ?= ino.cpp CONFIG_H ?= config.h # MCU name @@ -24,15 +25,13 @@ EXTRAKEY_ENABLE ?= no # Media control and System control CONSOLE_ENABLE ?= yes # Console for debug COMMAND_ENABLE ?= no # Commands for debug and configuration NKRO_ENABLE ?= no # USB Nkey Rollover +NO_KEYBOARD ?= yes # No keyboard interface # Boot Section Size in bytes OPT_DEFS += -DBOOTLOADER_SIZE=4096 -OPT_DEFS += -DNO_ACTION_TAPPING -OPT_DEFS += -DNO_ACTION_LAYER -OPT_DEFS += -DNO_ACTION_MACRO OPT_DEFS += -DNO_DEBUG -#LDFLAGS += -Wl,--relax +EXTRACPPFLAGS = -fpermissive # program Leonardo PROGRAM_CMD = avrdude -p$(MCU) -cavr109 -b57600 -Uflash:w:$(TARGET).hex -P$(DEV) @@ -41,7 +40,49 @@ PROGRAM_CMD = avrdude -p$(MCU) -cavr109 -b57600 -Uflash:w:$(TARGET).hex -P$(DEV) VPATH += $(TARGET_DIR) VPATH += $(TMK_DIR) + + +# +# USB_desc_dump build setting +# include $(TMK_DIR)/protocol/usb_hid.mk + +USB_DESC_DUMP_DIR = $(USB_HOST_SHIELD_DIR)/examples/USB_desc_dump +SRC += $(USB_DESC_DUMP_DIR)/USB_desc_dump.cpp +SRC += $(USB_HOST_SHIELD_DIR)/hidescriptorparser.cpp + +# Print Standard descriptor +OPT_DEFS += -DPRINT_DESC +#OPT_DEFS += -DNO_PRINT_DESC + +# Print High-speed Hub descriptor +#OPT_DEFS += -DPRINT_DESC_HSHUB +OPT_DEFS += -DNO_PRINT_DESC_HSHUB + +# Print HID Report descriptor +#OPT_DEFS += -DPRINT_DESC_REPORT +OPT_DEFS += -DNO_PRINT_DESC_REPORT + + + include $(TMK_DIR)/protocol/lufa.mk include $(TMK_DIR)/common.mk include $(TMK_DIR)/rules.mk + + + +$(OBJDIR)/$(USB_DESC_DUMP_DIR)/USB_desc_dump.cpp.o : $(OBJDIR)/$(USB_DESC_DUMP_DIR)/USB_desc_dump.cpp $(OBJDIR)/$(USB_DESC_DUMP_DIR)/desc.h + @echo + mkdir -p $(@D) + @echo $(MSG_COMPILING_CPP) $< + $(CC) -c $(ALL_CPPFLAGS) $< -o $@ + +$(OBJDIR)/$(USB_DESC_DUMP_DIR)/USB_desc_dump.cpp : $(TMK_DIR)/$(USB_DESC_DUMP_DIR)/USB_desc_dump.ino + @echo + mkdir -p $(@D) + $(COPY) $< $@ + +$(OBJDIR)/$(USB_DESC_DUMP_DIR)/desc.h : $(TMK_DIR)/$(USB_DESC_DUMP_DIR)/desc.h + @echo + mkdir -p $(@D) + $(COPY) $< $@ diff --git a/converter/usb_desc_dump/README.md b/converter/usb_desc_dump/README.md index 3df9bf59..6cd3b284 100644 --- a/converter/usb_desc_dump/README.md +++ b/converter/usb_desc_dump/README.md @@ -1,10 +1,10 @@ USB Descriptor Dumper ===================== -2021-07-08 +2021-07-20 -`usb_desc_dump` read USB descriptors and shows in HEX dump. +`Usb_desc_dump` gets USB descriptors and shows in HEX dump and human readable form. This works on TMK USB-USB converter and USB Host Shield with Arduino Leonardo. -USB hub is not supported. Device should be plugged directly. + Following descriptors are supported. @@ -15,6 +15,15 @@ Following descriptors are supported. - HID Descriptor - HID Report descriptor - String Descriptor +- Device Qualifier* +- Other Speed* +- Audio/MIDI Class* +*: partly supported + + +See source code for the detail. + +- https://github.com/tmk/USB_Host_Shield_2.0/tree/master/examples/USB_desc_dump @@ -23,35 +32,91 @@ Example optput: ``` usb_state: 90 -Address:01 -lowspeed:01 -idVendor:046A -idProduct:0011 +////////////////////////////////////////////////////////////////////// +// USB_desc_dump +// Address: 01 +// Lowspeed: 00 -Device Descriptor: -12 01 00 02 00 00 00 08 6A 04 11 00 00 01 00 00 -00 01 +// Devicer dump: +12 01 00 02 00 00 00 08 6A 04 11 00 00 01 00 00 +00 01 -Config0: len:0022 -09 02 22 00 01 01 00 A0 32 09 04 00 00 01 03 01 -01 00 09 21 11 01 00 01 22 40 00 07 05 81 03 08 -00 0A +// Device: +bLength: 12 +bDescriptorType: 01 +bcdUSB: 0200 +bDeviceClass: 00 +bDeviceSubClass: 00 +bDeviceProtocol: 00 +bMaxPacketSize0: 08 +idVendor: 046A +idProduct: 0011 +bcdDevice: 0100 +iManufacturer: 00 +iProduct: 00 +iSerialNumber: 00 +bNumConfigurations: 01 -Report0: len:0040 -05 01 09 06 A1 01 05 07 19 E0 29 E7 15 00 25 01 -75 01 95 08 81 02 95 01 75 08 81 01 95 03 75 01 -05 08 19 01 29 03 91 02 95 05 75 01 91 01 95 06 -75 08 15 00 26 DD 00 05 07 19 00 29 DD 81 00 C0 +// Config0 dump: len: 0022 +09 02 22 00 01 01 00 A0 32 09 04 00 00 01 03 01 +01 00 09 21 11 01 00 01 22 40 00 07 05 81 03 08 +00 0A + +// Config: +bLength: 09 +bDescriptorType: 02 +wTotalLength: 0022 +bNumInterfaces: 01 +bConfigurationValue: 01 +iConfiguration: 00 +bmAttributes: A0 +bMaxPower: 32 + +// Interface0.0: +bLength: 09 +bDescriptorType: 04 +bInterfaceNumber: 00 +bAlternateSetting: 00 +bNumEndpoints: 01 +bInterfaceClass: 03 +bInterfaceSubClass: 01 +bInterfaceProtocol: 01 +iInterface: 00 + +// HID: +bLength: 09 +bDescriptorType: 21 +bcdHID: 0111 +bCountryCode: 00 +bNumDescriptors: 01 +bDescrType: 22 +wDescriptorLength: 0040 + +// Report0 dump: len: 0040 +05 01 09 06 A1 01 05 07 19 E0 29 E7 15 00 25 01 +75 01 95 08 81 02 95 01 75 08 81 01 95 03 75 01 +05 08 19 01 29 03 91 02 95 05 75 01 91 01 95 06 +75 08 15 00 26 DD 00 05 07 19 00 29 DD 81 00 C0 + +// Endpoint: +bLength: 07 +bDescriptorType: 05 +bEndpointAddress: 81 +bmAttributes: 03 +wMaxPacketSize: 0008 +bInterval: 0A + +// Parse data here: http://eleccelerator.com/usbdescreqparser/ ``` -To check descriptor content use 'USB Descriptor and Request Parser' on line. +To inspect descriptor content closely use 'USB Descriptor and Request Parser' on line. - https://eleccelerator.com/usbdescreqparser/ -Or you can use command line tool like hidrd. +Also you can use command line tool `hidrd-convert` like below. - https://github.com/DIGImend/hidrd @@ -61,6 +126,8 @@ $ cat | hidrd-convert -i hex -o spec 75 01 95 08 81 02 95 01 75 08 81 01 95 03 75 01 05 08 19 01 29 03 91 02 95 05 75 01 91 01 95 06 75 08 15 00 26 DD 00 05 07 19 00 29 DD 81 00 C0 +^D + Usage Page (Desktop), ; Generic desktop controls (01h) Usage (Keyboard), ; Keyboard (06h, application collection) Collection (Application), diff --git a/converter/usb_desc_dump/binary/usb_desc_dump.hex b/converter/usb_desc_dump/binary/usb_desc_dump.hex index d563ed70..8e3e9994 100644 --- a/converter/usb_desc_dump/binary/usb_desc_dump.hex +++ b/converter/usb_desc_dump/binary/usb_desc_dump.hex @@ -1,1154 +1,1191 @@ -:100000000C94C6010C9419020C9419020C94190258 -:100010000C9419020C9419020C9419020C941902F4 -:100020000C9419020C9419020C94391C0C940B1D9D -:100030000C942A210C9419020C9419020C941902A4 -:100040000C9419020C9419020C9419020C941902C4 -:100050000C9419020C941C080C9419020C941902AB -:100060000C9419020C9419020C9419020C941902A4 -:100070000C9419020C9419020C9419020C94190294 -:100080000C9419020C9419020C9419020C94190284 -:100090000C9419020C9419020C9419020C94190274 -:1000A0000C9419020C9419020C941902871AAE1AB6 -:1000B000A61BAE1AA61BFA1A1D1BA61B741B831BBC -:1000C0007573625F73746174653A20253032580A23 +:100000000C9489040C94DC040C94DC040C94DC0443 +:100010000C94DC040C94DC040C94DC040C94DC04E0 +:100020000C94DC040C94DC040C9410220C94E32259 +:100030000C9456230C94DC040C94DC040C94DC0427 +:100040000C94DC040C94DC040C94DC040C94DC04B0 +:100050000C94DC040C9445060C94DC040C94DC0435 +:100060000C94DC040C94DC040C94DC040C94DC0490 +:100070000C94DC040C94DC040C94DC040C94DC0480 +:100080000C94DC040C94DC040C94DC040C94DC0470 +:100090000C94DC040C94DC040C94DC040C94DC0460 +:1000A0000C94DC040C94DC040C94DC047573625F27 +:1000B00073746174653A20004F534320646964206F +:1000C0006E6F742073746172742E00537461727455 :1000D000000D0A2F2F2050617273652064617461D6 :1000E00020686572653A20687474703A2F2F656CC9 :1000F000656363656C657261746F722E636F6D2FDB :100100007573626465736372657170617273657231 -:100110002F0D0A000D0A2F2F204465766963652094 -:1001200044657363726970746F723A0D0A000D0A48 -:100130002F2F206953657269616C4E756D6265720F -:100140003A20000D0A2F2F206950726F6475637476 -:100150003A20000D0A2F2F20694D616E756661638C -:1001600074757265723A20000D0A2F2F2053747235 -:10017000696E67303A0D0A002F2F206C6F7773700D -:100180006565643A253032580D0A000D0A2F2F207C -:10019000416464726573733A253032580D0A000D5C -:1001A0000A2F2F2069436F6E6669677572617469E3 -:1001B0006F6E3A2000427566666572206973206E24 -:1001C0006F7420656E6F756768210D0A000D0A2F28 -:1001D0002F20436F6E66696725643A000D0A2F2F42 -:1001E000205265706F727425643A206C656E3A25F2 -:1001F0003034580D0A000D0A2F2F2069496E74659E -:1002000072666163653A20000D0A000D0A0053749E -:1002100072696E6725643A20000D0A002530325855 -:1002200020002F2F20000D0A0020000D0A455252F9 -:100230004F523A253032580D0A0025733A25303492 -:10024000580D0A0025733A253032580D0A00253022 -:1002500032580000000D0A0020000A4B6579626FD9 -:100260006172642073746172742E0A000A555342DD -:1002700020636F6E666967757265642E0A000A0AEC -:10028000544D4B3A66623665653130662B2F4C55BE -:1002900046410A0A002C0355005300420020004446 -:1002A0000065007300630072006900700074006FE5 -:1002B0000072002000440075006D0070006500723F -:1002C000000000080354004D004B00000004030927 -:1002D0000409024200020100A032090400000103E7 -:1002E00001010009211101000122400007058103DD -:1002F00008000A090401000203000000092111019D -:1003000000012222000705820320000107050203E5 -:100310002000011201100100000008EDFE5B001436 -:1003200008010200010631FF0974A10109751500D9 -:1003300026FF009520750881020976150026FF002A -:10034000952075089102C005010906A1010507194C -:10035000E029E715002501950875018102950175D1 -:100360000881010508190129059505750191029576 -:1003700001750391010507190029FF150026FF00EB -:10038000950675088100C0005F07870711241FBE0E -:10039000CFEFDAE0DEBFCDBF04B603FE28C0809108 -:1003A000C7059091C805A091C905B091CA058730CD -:1003B000904BA740B04BD9F41092C7051092C805D6 -:1003C0001092C9051092CA0514BE0FB6F894A895EC -:1003D00080916000886180936000109260000FBE81 -:1003E0001092010810920008E0E0F8E3099511E08E -:1003F000A0E0B1E0E8E5F7E402C005900D92A63A6E -:10040000B107D9F725E0A6EAB1E001C01D92A73CEB -:10041000B207E1F711E0C6ECD1E004C02197FE017C -:100420000E94A423C43CD107C9F70E94A2170C94D0 -:10043000AA230C940000FF93EF93E091A601F091A2 -:10044000A701309709F00995EF91FF910895FC01FC -:100450008591803011F0EFDFFBCF0895FF27E0E2B8 -:1004600030E247FF0CC0419597FF09C0EDE260956F -:10047000709580959095611D711D811D911D27FFBF -:1004800002C0219530E350E2AA27660F771F881F2C -:10049000991FAA1FA41710F0A41B63955A95A9F7DA -:1004A000AA3008F0A95FA05DAF93F39561157105BF -:1004B0008105910541F7ED3211F4EF93F395F217B1 -:1004C00018F43F93F395FBCF8F91B5DFFA95E1F7E1 -:1004D0000895E991F9918591803021F0853219F0E4 -:1004E000AADFF9CF089520E0E89455915532C1F381 -:1004F000503311F4689455915A3348F4505390F3A3 -:10050000220F022E220F220F200D250FF4CF0EF402 -:10051000219589919991533619F3533729F1533520 -:1005200059F1BC0188279927E8945C3621F4899118 -:10053000999168945591543639F446EF7EF077FFDF -:100540000DC08FEF9FEF0AC055374AE039F058359C -:1005500040E121F0523642E009F00895FF93EF9315 -:100560007DDFEF91FF91B7CFFF93EF93FC01819176 -:100570008030B9F360DFFBCFFF93EF9368DFF1CFFB -:10058000DF93CF93CDB7DEB72596A3DFCF91DF9171 -:1005900008951F928F938EE492E09F938F930E9411 -:1005A000C0020F900F900F900F900895CF92DF929E -:1005B000EF92FF920F931F93CF93DF936B0179011B -:1005C0008A01C0E0D0E0CC15DD05D1F0F7018081D3 -:1005D00091818C0F9D1F9C012F703327232B19F0C5 -:1005E00088E592E004C0892B21F085E592E00E9425 -:1005F0002702F80181918F010E94C9022196E3CF61 -:10060000DF91CF911F910F91FF90EF90DF90CF90EE -:1006100008951F926F939F938F9384E492E09F932A -:100620008F930E94C0020F900F900F900F900F9029 -:100630000F9008957F936F939F938F938AE392E037 -:100640009F938F930E94C0020F900F900F900F9076 -:100650000F900F9008951F928F938BE292E09F93DB -:100660008F930E94C0020F900F900F900F900895EB -:10067000BF92CF92DF92EF92FF920F931F93CF938F -:10068000DF936C01B42E8B01C0E0D0E08CE1E82E4A -:1006900082E0F82ECC15DD051CF5CE018F70992770 -:1006A000892B19F089E292E00AC0209721F086E2B6 -:1006B00092E00E942702BB2021F082E292E00E9499 -:1006C0002702F80181918F011F928F93FF92EF9281 -:1006D0000E94C00221960F900F900F900F90DACFDA -:1006E00089E192E0DF91CF911F910F91FF90EF9000 -:1006F000DF90CF90BF900C9427026F927F928F92E1 -:100700009F92AF92BF92CF92DF92EF92FF920F93A0 -:100710001F93CF93DF93CDB7DEB7DA950FB6F8947A -:10072000DEBF0FBECDBF662309F45CC03A01162FB1 -:100730004C01CE0101966C017A01062F21E030E0D8 -:1007400040E0F401628184EC93E00E948B0E811101 -:1007500011C0A980B12CCE0101966C017301012F4B -:10076000950140E0F401628184EC93E00E948B0EDD -:10077000882319F00E942B0335C01F921F938EE02F -:1007800092E09F938F930E94C0020F900F900F9062 -:100790000F9012E0812F90E09C012F5F3F4F2A15B0 -:1007A0003B05A4F4E1E0F0E0EC0FFD1FE20FF31FC6 -:1007B0002081211109C0E1E0F0E0EC0FFD1FE80FFE -:1007C000F91F80810E941B021E5FE4CF8BE092E044 -:1007D0000E942702898141E0BE016F5F7F4F90E058 -:1007E0000E943803D3950FB6F894DEBF0FBECDBF7D -:1007F000DF91CF911F910F91FF90EF90DF90CF90FD -:10080000BF90AF909F908F907F906F9008958F9240 -:100810009F92AF92BF92CF92EF920F931F93CF937D -:10082000DF93CDB7DEB7C054D1090FB6F894DEBF61 -:100830000FBECDBF2CEA31E03F932F939E012F5F77 -:100840003F4F3F932F931F9220E42F934A015B0168 -:1008500022E2C22EE12C06E021E840E0FC016281A8 -:1008600084EC93E00E945D0D182F88E092E00E94D6 -:1008700027020F900F900F900F900F900F90112361 -:1008800019F0812F0E942B03812FC05CDF4F0FB620 -:10089000F894DEBF0FBECDBFDF91CF911F910F91B6 -:1008A000EF90CF90BF90AF909F908F9008958F92D0 -:1008B0009F92AF92BF92CF92DF92EF92FF921F93DF -:1008C000CF93DF936C01EA0110E0CB018D549E4F72 -:1008D0007C018CEDA82E81E0B82ECE15DF0508F046 -:1008E00056C06981613178F46F3008F04CC06430D3 -:1008F000B1F020F4613008F442C045C0653009F41D -:1009000042C086EF08C0663228F46432E0F56132F6 -:10091000B9F035C080ED860F823088F534C01A8179 -:100920008885882381F186EF91E00E94270240911B -:10093000B1015091B2016885C6010E947D0323C0B8 -:1009400088858F938F818F93812E912C1F921F9377 -:10095000BF92AF920E94C0026E810F900F900F90D5 -:100960000F900F900F90623239F44F815885B40187 -:10097000C6010E94070407C085E191E002C08FE232 -:1009800091E00E9409038881C80FD11DA6CFDF9195 -:10099000CF911F91FF90EF90DF90CF90BF90AF90DD -:1009A0009F908F9008956F927F928F929F92AF92B7 -:1009B000BF92CF92DF92EF92FF920F931F93CF934C -:1009C000DF936C01862E912CC0E0D0E03DEC632ECD -:1009D00031E0732E1C2F8C169D0609F46FC0DF9337 -:1009E000CF937F926F920E94C00223EBE22E21E010 -:1009F000F22E0C2F29E030E040E0F601628184EC19 -:100A000093E00E94640E0F900F900F900F90811151 -:100A100056C06091B5017091B60185E491E00E94E5 -:100A20001A03A090B501B090B601F1E0AF16F2E064 -:100A3000BF0618F0A12C92E0B92E83EBE82E81E0DE -:100A4000F82E012F950140E0F601628184EC93E0DD -:100A50000E94640E811133C040E0B701C5010E94BD -:100A600038038091B5019091B6018130924020F019 -:100A700085EB91E00E9427028091B901882369F0FB -:100A80008FE991E00E9427024091B1015091B2019B -:100A90006091B901C6010E947D032091B80140E038 -:100AA000F601628184EC93E00E94211043EB51E057 -:100AB000B501C6010E94570421968CCF80E0DF91DA -:100AC000CF911F910F91FF90EF90DF90CF90BF904B -:100AD000AF909F908F907F906F900895AF92BF924C -:100AE000CF92DF92EF92FF920F931F93CF93DF93FA -:100AF00000D000D0CDB7DEB75C01DC0112968C913E -:100B00001F928F938BE891E09F938F930E94C00276 -:100B1000F50184811F928F9388E791E09F938F93D3 -:100B20000E94C00203EB11E022E130E040E0D50179 -:100B300012966C9184EC93E00E943D0E0FB6F894EF -:100B4000DEBF0FBECDBF81110E942B036091BB01A0 -:100B50007091BC018AE491E00E941A036091BD018A -:100B60007091BE0186E591E00E941A031092AE01D9 -:100B70008091BA018093AF018091B00183708C6342 -:100B80008093B001E091C403F091C5030190F0811E -:100B9000E02DD50112966C9184EC93E009952EEA34 -:100BA00031E0FC01318320838091C101811108C0B3 -:100BB0008091C201811104C08091C301882339F161 -:100BC0009E012F5F3F4F6901E12CF12C00E024E0F2 -:100BD00030E040E0D50112966C9184EC93E00E94E5 -:100BE0008B0E811114C06B817C817093B201609374 -:100BF000B10183E691E00E941A0388E691E00E9429 -:100C00002702898141E0B60190E00E94380380917B -:100C1000C101882369F083E591E00E942702409199 -:100C2000B1015091B2016091C101C5010E947D03E3 -:100C30008091C201882369F083E491E00E94270239 -:100C40004091B1015091B2016091C201C5010E9471 -:100C50007D038091C301882369F08EE291E00E94B8 -:100C600027024091B1015091B2016091C301C501C9 -:100C70000E947D0384E191E00E94270240E063EB43 -:100C800071E082E190E00E9438036091C401C501E7 -:100C90000E94D30481110E942B03E091C403F091C0 -:100CA000C5030480F581E02DD50112966C9184EC8A -:100CB00093E0099581ED90E00E9427020F900F903C -:100CC0000F900F90DF91CF911F910F91FF90EF90B8 -:100CD000DF90CF90BF90AF90089508950E94F507E0 -:100CE0009093AB018093AA01089581E00895CF937A -:100CF000DF9384EC93E00E947F1084EC93E00E94E9 -:100D00004D099091A8018917C9F084EC93E00E94E5 -:100D10004D098093A8011F928F9380EC90E09F93E0 -:100D20008F930E94C0020F900F900F900F908091B0 -:100D30000001811103C081E0809300018091AA012C -:100D40009091AB010E940D08883B9B40C8F084EC59 -:100D500093E00E944D09803999F480910001882325 -:100D600079F0CFECD3E08A81882319F0CE010E947C -:100D70006E05259684E0CA31D807A9F710920001C4 -:100D8000DF91CF9108952E9A08952E988EBD0DB4BF -:100D900007FEFDCF1EBC0DB407FEFDCF0E94C306AB -:100DA0008EB508952E9882608EBD0DB407FEFDCFDE -:100DB0006EBD0DB407FEFDCF0C94C30688EF0E94F4 -:100DC000C506807C8034A1F018F4882301F10895D1 -:100DD000803819F0803CB9F0089588ED0E94C5066E -:100DE00081FD0BC069EC88ED0E94D20682E00CC048 -:100DF00088ED0E94C50681FDF5CF6BEC88ED0E9461 -:100E0000D20683E001C081E08093A901089561EDDD -:100E100088ED0E94D2061092A90108950F931F93A6 -:100E2000CF93DF938C01269A0E94C306219A229ABF -:100E30002398209A80E58CBD81E08DBD259868E1DE -:100E400088E80E94D20660E288E70E94D20660E04D -:100E500088E70E94D206C0E0D0E088E60E94C5067E -:100E6000219680FD06C0CF3F8FEFD807B1F78FEFF7 -:100E70001DC061EC88ED0E94D20660E680ED0E9404 -:100E8000D20664E088EE0E94D20688EE0E94C50673 -:100E900082FFFBCFC8010E94DE0660E288EC0E9460 -:100EA000D20661E080E80E94D20680E0DF91CF9117 -:100EB0001F910F91089584EC93E00C940E0784EC3D -:100EC00093E00E941D0964EC73E083EB93E00E94C1 -:100ED000DC1381E791E09093AD018093AC0108951C -:100EE00080E090E008958FEF9FEF089581E090E01B -:100EF00008950895862F0E94961581E090E0089548 -:100F0000FB0180810E94961581E090E00895EBE35B -:100F1000F4E01382128288EE93E0A0E0B0E08483D4 -:100F20009583A683B78387E791E0918380838FEFD2 -:100F30009FEF9587848708950C9401088F929F9264 -:100F4000AF92BF92CF92DF92EF92FF920E948022E7 -:100F50004B015C0120E030E04AE755E40E94372372 -:100F60006B017C0120E030E040E85FE30E944C220E -:100F700087FD24C020E03FEF4FE757E4C701B601EB -:100F80000E9432231816ACF420E030E040E251E435 -:100F9000C501B4010E9437230E94512220E931E0AB -:100FA0006115710581F0C9010197F1F7615071096F -:100FB000F7CFC701B6010E94512202C061E070E084 -:100FC000CB010197F1F7FF90EF90DF90CF90BF90AA -:100FD000AF909F908F90089582E084BD93E095BD7F -:100FE0009AEF97BD80936E0008952FB7F894809183 -:100FF0008B0490918C04A0918D04B0918E042FBF2E -:1010000008952FB7F89460918B0470918C048091AF -:101010008D0490918E042FBF08959C014FB7F894D2 -:1010200080918B0490918C04A0918D04B0918E04DA -:101030004FBF821B930B089578941F920F920FB6A7 -:101040000F9211248F939F93AF93BF9380918B0442 -:1010500090918C04A0918D04B0918E040196A11DF5 -:10106000B11D80938B0490938C04A0938D04B09356 -:101070008E04BF91AF919F918F910F900FBE0F90F3 -:101080001F901895CF93DF93FC01862F8078A9F4E9 -:10109000283008F04DC0442321F09581973009F4A1 -:1010A00047C0EF01A1E0B0E09D85992341F0119682 -:1010B0002596A031B105C1F73BC080E039C0611170 -:1010C0001CC085E08A9FE0018B9FD00D1124CE0FBC -:1010D000DF1F442331F081E4888785818F5F85831A -:1010E00002C081E0888725E02A9FC0012B9F900DD8 -:1010F0001124E80FF91F80851BC06770660F660F0B -:10110000660F442341F0606485818F5F858387701B -:10111000687F682B03C02770687B622B25E02A9FBD -:10112000C0012B9F900D1124E80FF91F6087862FB7 -:10113000DF91CF910895611102C006960895FC01D8 -:1011400021E03585631739F02F5F35962031C9F7D7 -:1011500080E090E00895069635E0239F800D911D74 -:1011600011240895DF92EF92FF920F931F93CF9374 -:10117000DF93EC01E62EF12C85E0689FB00111248D -:10118000FE01E60FF71F8085182F177086FF17C026 -:1011900001E085E0D82EFE01D09EE00DF11D112466 -:1011A000808586958695869587701817F9F00F5F6C -:1011B000003189F78D81811302C011501D8385E0B4 -:1011C0008E9DF0018F9DF00D1124EC0FFD1F1086F8 -:1011D00081E0818712862296D783C683DF91CF91E3 -:1011E0001F910F91FF90EF90DF900895602FCE0137 -:1011F0000E94B208D0CFFC01613499F49C01255BB8 -:101200003F4F61E0AC014E5F5F4F158666871786E2 -:10121000548743873596E217F307B9F7FC01158227 -:10122000089521E03585631729F02F5F3596203129 -:10123000C9F70895622F0C94B208FC0189E891E087 -:10124000918380831582108681E081871286CF0189 -:10125000029697838683128228E023832CE32483DB -:10126000DF019F01255B3F4F41E01D961C921D97BA -:101270001E964C931E971F961C921F971C969C932C -:101280008E931B971596A217B30779F7EA58FF4F6D -:10129000108281E1809393040895809193040895CE -:1012A000CF93C42F0E949B08009789F0DC01ED9139 -:1012B000FC911197309759F013969C9180E0891713 -:1012C00031F020812C1731F033968F5FF8CF80E01A -:1012D00090E001C0CF01CF9108950F931F93CF935A -:1012E000DF932115310571F0E901042F162F0E94BB -:1012F0009B08FC01892B41F01283D183C0830383B7 -:1013000080E003C088ED01C086EDDF91CF911F9191 -:101310000F910895CF92DF92FF920F931F93CF9377 -:10132000DF93662381F1F62E8C016C0186E5C80EF1 -:10133000D11CC0E0D0E0D6018D919D916D01009748 -:10134000F1F0DC01ED91FC910084F185E02D09952F -:10135000F81215C0AB96CC0FDD1FC00FD11F8881CE -:101360009981DC01ED91FC910480F581E02DDF9104 -:10137000CF911F910F91FF90DF90CF90099421960C -:10138000C031D105C1F680E0DF91CF911F910F915F -:10139000FF90DF90CF9008952E980895CF93C82F97 -:1013A0000E94CC09CEBD0DB407FEFDCF1EBC0DB40E -:1013B00007FEFDCF0E94C3068EB5CF910895CF934F -:1013C000DF93C82FD62F0E94CC09C260CEBD0DB4CA -:1013D00007FEFDCFDEBD0DB407FEFDCFDF91CF913F -:1013E0000C94C3068F929F92AF92BF92CF92DF92DE -:1013F000EF92FF920F931F93CF93DF93EC01D62EC2 -:10140000C42E59010E949B087C01009709F445C035 -:10141000FC0180819181892B09F441C04C2D6D2DF7 -:10142000CE010E945009F501918380830097C9F194 -:10143000FC0182818695869590E08031910514F0BB -:101440008FE090E041E050E060E070E04A015B0135 -:1014500004C0880C991CAA1CBB1C8A95D2F7D50124 -:10146000C4010197F801918380836D2D80EE0E9465 -:10147000DF0988ED0E94CE09F7019481992331F0AC -:10148000CA58DF4F68816260682B02C0682F697F8D -:1014900088ED0E94DF0980E005C086ED03C087ED7E -:1014A00001C08BEDDF91CF911F910F91FF90EF90D5 -:1014B000DF90CF90BF90AF909F908F9008958F92C4 -:1014C0009F92AF92BF92CF92DF92EF92FF920F93D3 -:1014D0001F93CF93DF93862E942E59010E949C0771 -:1014E0006B017C0128E8C20E23E1D21EE11CF11C35 -:1014F00000E010E0D0E0C0E098280E949C07DC01EA -:10150000CB018C199D09AE09BF09B7FF2DC0692D0C -:1015100080EF0E94DF090E949C07DC01CB018C193F -:101520009D09AE09BF09B7FF09C088EC0E94CE092A -:1015300087FFF1CF60E888EC0E94DF0988EF0E9406 -:10154000CE09C82FCF70C43019F0CE3051F00CC086 -:101550000F5F1F4FA114B10481F20A151B0569F634 -:1015600003C0DF5FD33049F68C2FDF91CF911F91FD -:101570000F91FF90EF90DF90CF90BF90AF909F9032 -:101580008F9008959F92AF92BF92CF92DF92EF9289 -:10159000FF920F931F93CF93DF937C01D42F122FD1 -:1015A000902E00E06C01C60ED11CC60ED11C86E543 -:1015B000C80ED11CA42EB12CABE2AA0EB11CAA0CF1 -:1015C000BB1CAE0CBF1CF60180819181DC01ED914A -:1015D000FC910280F381E02D292D412F6D2F09957B -:1015E000803EC9F4D1110BC061E088EE0E94DF0992 -:1015F00066E670E080E090E00E949E0714C0F5016E -:1016000080819181DC01ED91FC910284F385E02DD4 -:10161000612F099508C08D3021F4033008F03FC0D8 -:1016200014C081113FC0F60180819181DC01ED91F0 -:10163000FC910190F081E02D292D412F6D2F09950E -:10164000C82F8D3051F4033050F464E670E080E030 -:1016500090E00E949E070F5FB6CF882311F1D11151 -:101660000BC061E088EE0E94DF0966E670E080E072 -:1016700090E00E949E0711C0ED2FF0E0BB96EE0FA8 -:10168000FF1FEE0DFF1D80819181DC01ED91FC912A -:101690000284F385E02D612F09958C2F03C08DE026 -:1016A00001C080E0DF91CF911F910F91FF90EF90EB -:1016B000DF90CF90BF90AF909F9008950F931F93AE -:1016C000CF93DF93182F062FEA010E94CC091260F6 -:1016D0001EBDFE01802F882339F00DB407FEFDCF1B -:1016E00091919EBD8150F7CFC00FD11D0DB407FE63 -:1016F000FDCF0E94C306CE01DF91CF911F910F91C4 -:1017000008952F923F924F925F926F927F928F92A5 -:101710009F92AF92BF92CF92DF92EF92FF920F9380 -:101720001F93CF93DF9300D000D01F92CDB7DEB7C9 -:101730007D836C834A016901FB01F1808FEF8F0D7E -:10174000803408F067C00E949C072B013C01F8E838 -:101750004F0EF3E15F1E611C711CEC81FD818281E3 -:1017600080FD02C060E401C060E888EE0E94DF09ED -:10177000312C8F2D90E09A838983C114D104B1F16B -:10178000E980FA80CE14DF0408F47601EB82A80128 -:101790006E2D80E10E945E0B6E2D88E30E94DF09B2 -:1017A000EC81FD816081606280EF0E94DF0988EC3E -:1017B0000E94CE0987FFFBCF60E888EC0E94DF091A -:1017C00088EF0E94CE098F70382EA12CB12C212CCD -:1017D000332009F472C00E949C07DC01CB018419FC -:1017E0009509A609B709B7FF68C016C0332021F0D4 -:1017F00060E088E30E94DF0988EF0E94CE0985FB44 -:10180000882780F9EC81FD81928180FB90F9928399 -:10181000832D58C08AED56C0F6E03F1239C088EFDC -:101820000E94CE0985FB882780F991E08927EC8109 -:10183000FD81928180FB90F9928390FD02C060E46B -:1018400001C060E888EE0E94DF0960E088E30E9442 -:10185000DF09F801608180E10E94DF096B8188E384 -:101860000E94DF09EC81FD816081606280EF0E944F -:10187000DF0988EC0E94CE0987FFFBCF60E888EC87 -:101880000E94DF0988EF0E94CE098F70382EA0CF0A -:101890002EE0321205C0239423E02212D6CFA8CF27 -:1018A00084E03812A5CFFFEFAF1ABF0A811491046C -:1018B00061F2A814B90449F69BCFCE18DF080E0DCB -:1018C0001F1D5BCF0F900F900F900F900F90DF9127 -:1018D000CF911F910F91FF90EF90DF90CF90BF902D -:1018E000AF909F908F907F906F905F904F903F90C0 -:1018F0002F9008952F923F924F925F926F927F9216 -:101900008F929F92AF92BF92CF92DF92EF92FF920F -:101910000F931F93CF93DF93CDB7DEB72A970FB600 -:10192000F894DEBF0FBECDBF1C016B015B834A8301 -:101930005901D9016D907C901197FB01F181F983D8 -:101940001D921C92DB0112968C9181FD02C060E118 -:1019500001C060E288EE0E94DF098E2D90E0A0E0D9 -:10196000B0E08C839D83AE83BF8368862A813B81F0 -:10197000D6014C9160E0C1010E945F0AF82EB6E0EA -:101980008B1318C088EF0E94CE0982958170E1E028 -:101990008E27D60112969C91129780FB91F9129690 -:1019A0009C9391FD02C060E101C060E288EE0E945C -:1019B000DF09DCCF811167C088EC0E94CE0982FF6D -:1019C00060C080E30E94CE09582E90E06816790628 -:1019D00008F45884F501808191819301281B390B0B -:1019E0003A87298737FF02C01A861986852C912CE1 -:1019F00089859A858816990614F49A868986498479 -:101A00000E94CC0998E09EBD0DB407FEFDCFF80101 -:101A1000442041F01EBC4A940DB407FEFDCF8EB5A4 -:101A20008193F6CFA985BA850A0F1B1F0E94C306B2 -:101A300064E088EC0E94DF09F50180819181880EC5 -:101A4000991E91828082F9815F1618F0861497049E -:101A500070F088EF0E94CE0982958170D6011296AF -:101A60009C91129780FB91F912969C930CC0EE20EA -:101A700009F47CCF6C817D818E819F810E949E07BD -:101A800075CF80EFF82E8F2D2A960FB6F894DEBF13 -:101A90000FBECDBFDF91CF911F910F91FF90EF90BF -:101AA000DF90CF90BF90AF909F908F907F906F907E -:101AB0005F904F903F902F9008952F923F924F92BA -:101AC0005F926F927F928F929F92AF92BF92CF92CE -:101AD000DF92EF92FF920F931F93CF93DF93CDB7D7 -:101AE000DEB761970FB6F894DEBF0FBECDBF3C01E5 -:101AF000F42E322E202EC98A4EA05FA0C8A4D9A4ED -:101B0000188A1F861E861D868E01035F1F4F9E0149 -:101B1000215F3F4F0E94F209811196C039822A82CB -:101B2000EB8289898C83BE82AD8298868F82AE01DA -:101B30004F5F5F4F68E080E20E945E0B2D853E851F -:101B40004F2D60E1C3010E945F0AE82E811178C029 -:101B5000932D9078392EC114D10409F462C0EF8519 -:101B6000F8898281992309F44DC0826082835401EF -:101B700022242394A114B10409F458C05C864B8636 -:101B80004D855E856F857889E12C86019E01255FF4 -:101B90003F4FC3010E947A0CE82EA6E08A130FC0C3 -:101BA0000F85188988EF0E94CE0985FB882780F968 -:101BB0008225F801928180FB91F99283DBCF81111C -:101BC0003FC08AA59BA50097A1F0DC01ED91FC9197 -:101BD00011970190F081E02DC4018A199B099A8721 -:101BE00089876B857C859E01275F3F4FA601CD01CC -:101BF00009958B859C85A81AB90A8415950508F066 -:101C0000B9CF0FC0816082834D855E8586019201C8 -:101C1000BF01C3010E94810B811116C02D853E8535 -:101C200011C02D853E85311005C00CC0E11008C0E3 -:101C30002D853E8560EA4F2DC3010E945F0A04C0D6 -:101C40008E2D02C060E8F7CF61960FB6F894DEBF24 -:101C50000FBECDBFDF91CF911F910F91FF90EF90FD -:101C6000DF90CF90BF90AF909F908F907F906F90BC -:101C70005F904F903F902F9008958F929F92AF92D8 -:101C8000BF92CF92EF920F931F931F921F921F93B9 -:101C90000F933F932F934901A12CB12CCC24C394D3 -:101CA000E12C06E020E80E945D0D0F900F900F9050 -:101CB0000F900F900F901F910F91EF90CF90BF90CA -:101CC000AF909F908F9008958F929F92AF92BF9206 -:101CD000CF92EF92FF920F931F921F92FF92EF927B -:101CE0003F932F934901A12CB12C22E0C22EE02E6C -:101CF00006E020E80E945D0D0F900F900F900F906E -:101D00000F900F900F91FF90EF90CF90BF90AF90FA -:101D10009F908F9008958F929F92AF92BF92CF9293 -:101D2000DF92EF92FF920F931F921F92DF92CF925A -:101D30003F932F934901570123E0C22EE02E06E086 -:101D400020E80E945D0D0F900F900F900F900F9064 -:101D50000F900F91FF90EF90DF90CF90BF90AF90DA -:101D60009F908F9008958F929F92AF92BF92CF9243 -:101D7000EF920F93CF931F921F921F921F921F9269 -:101D80001F92812C912CA12CB12CC12CE22E05E0AC -:101D900020E00E945D0DC82F6CE271E080E090E0D1 -:101DA0000E949E070F900F900F900F900F900F9032 -:101DB0008C2FCF910F91EF90CF90BF90AF909F90CD -:101DC0008F9008950F931F93CF93DF938A3F3FEF38 -:101DD000930711F486ED2DC0DC011696ED91FC9170 -:101DE0001797EF2B09F1122F242FEC011A8740E0EF -:101DF0000E944208082F8823C9F0682FCE010E9454 -:101E00009B08009739F3FC011483202F40E060E029 -:101E1000CE010E94B30E182F882351F0602FCE01FF -:101E20000E94FB08812F05C087ED03C084ED01C02F -:101E300080E0DF91CF911F910F9108952F923F92F3 -:101E40004F925F926F927F928F929F92AF92BF92CA -:101E5000CF92DF92EF92FF920F931F93CF93DF9376 -:101E6000CDB7DEB766970FB6F894DEBF0FBECDBF15 -:101E70001B8A38E03C8B3CE33D8B8A3F3FEF930766 -:101E800009F464C0522E342E462E7C01DC011696D5 -:101E9000CD90DC901797CE01439617969C938E9326 -:101EA00016971A962C938E010F5F1F4F22E130E098 -:101EB00040E060E0C7010E943D0EF701D782C68274 -:101EC0008111A6C089849A846B847C84FD81FE8BF9 -:101ED0002E80670136E5C30ED11C560110E0D501F6 -:101EE0008D919C910097F1F1DC01ED91FC910084C2 -:101EF000F185E02D0995811135C0F5018081918131 -:101F0000DC01ED91FC910088F189E02D622D0995AD -:101F1000882341F1F50180819181DC01ED91FC91F3 -:101F20000484F585E02DA301B4010995811110C049 -:101F3000F50180819181DC01ED91FC910684F785AA -:101F4000E02D6E890995811103C00CC086ED60C03B -:101F5000052D232D442D612FC7010E94C20A813D0A -:101F600009F056C01F5FB2E0AB0EB11C103109F092 -:101F7000B6CF10E0F601808191810097E1F1DC019C -:101F8000ED91FC910084F185E02D0995811133C01C -:101F9000F60180819181DC01ED91FC910088F1894D -:101FA000E02D622D09958823D9F0F6018081918179 -:101FB000DC01ED91FC910484F585E02DA301B401D1 -:101FC0000995811118C0F60180819181DC01ED91A4 -:101FD000FC910684F785E02D6E89099581110BC06F -:101FE000052D232D442D612FC7010E94C20A982F71 -:101FF000977F913D69F41F5FE2E0CE0ED11C103156 -:1020000009F0B8CF252D432D642DC7010E94E20EA3 -:1020100066960FB6F894DEBF0FBECDBFDF91CF91AD -:102020001F910F91FF90EF90DF90CF90BF90AF90F6 -:102030009F908F907F906F905F904F903F902F90E8 -:1020400008958F929F92AF92BF92CF92EF920F938B -:102050001F921F921F921F921F921F92812C912CF0 -:10206000A12CB12CC12CE22E09E020E00E945D0DD4 -:102070000F900F900F900F900F900F900F91EF9087 -:10208000CF90BF90AF909F908F9008958F929F9226 -:10209000AF92BF92CF92DF92EF920F931F93CF93A5 -:1020A000DF9300D000D0CDB7DEB76C0159014801F5 -:1020B0001C821B821A8219828E010F5F1F4F9E01A4 -:1020C0002D5F3F4F0E94F209811109C049815A8159 -:1020D0006B817C8184019501C6010E947A0C0F906E -:1020E0000F900F900F90DF91CF911F910F91EF9074 -:1020F000DF90CF90BF90AF909F908F900895AF9258 -:10210000BF92CF92DF92EF92FF920F931F93CF93E4 -:102110008C011D990EC088EC0E94CE0985FF05C078 -:10212000C8010E94DE0660E201C060E088EC0E9407 -:10213000DF098091A901813039F040F0823079F0D7 -:10214000833039F5C1E00CC083E106C0809193046F -:10215000807F8031F1F081E1809393041AC0C0E068 -:1021600080919304807F8031A9F40E949C07DC0158 -:10217000CB0188539F4FAF4FBF4F80938F049093F5 -:102180009004A0939104B093920480E2809393040E -:1021900001C0C0E0780186E5E80EF11C6801A6E701 -:1021A000CA0ED11C5701F501819191915F010097F1 -:1021B00039F0DC01ED91FC910680F781E02D099565 -:1021C000AC14BD0481F780919304803409F43FC0BE -:1021D00050F4803221F18033A1F1813109F082C0C5 -:1021E000F60110820AC0813509F458C0803809F41C -:1021F0006AC0803509F076C039C0D7018D919D91B4 -:102200007D01009739F0DC01ED91FC910480F581AE -:10221000E02D0995EC14FD0481F782E161C00E9474 -:102220009C0700918F0410919004209191043091AB -:102230009204DC01CB01801B910BA20BB30BB7FD09 -:1022400051C061E088EE0E94DF0980E449C088EE59 -:102250000E94CE0980FD46C088ED0E94CE09682FFD -:10226000686088ED0E94DF0980E53AC088EC0E9432 -:10227000CE0986FF37C081E5809393040E949C07B6 -:10228000DC01CB014496A11DB11D80938F04909376 -:102290009004A0939104B093920424C00E949C07E0 -:1022A000C0908F04D0909004E0909104F09092043C -:1022B000DC01CB018C199D09AE09BF09B7FD12C025 -:1022C00080E8809393042C2F40E060E0C8010E94D6 -:1022D0001E0F882321F0823D29F080EA01C080E9A9 -:1022E00080939304CF911F910F91FF90EF90DF9017 -:1022F000CF90BF90AF90089580E0089580E008955A -:1023000081E00895FC018285089581E0693009F03B -:1023100080E00895CF93DF93EC018A819B81DC01FB -:10232000ED91FC910480F581E02D6A8509958A85FF -:10233000813439F4EA81FB81EA58FF4F808184605F -:1023400080831A861B861C861D861E861F86188A19 -:1023500080E0DF91CF9108958F929F92AF92BF92CC -:10236000CF92EF920F93A42EB12CB22A1F921F92FC -:102370001F921F921F921F92812C912CC12CE62E2E -:1023800001E023E240E0FC016285828193810E94AA -:102390005D0D0F900F900F900F900F900F900F9179 -:1023A000EF90CF90BF90AF909F908F9008958F92B5 -:1023B0009F92AF92BF92CF92EF920F93A62EB12C25 -:1023C0001F921F923F932F935F934F934A01C12C0B -:1023D000E12C00E023EA40E0FC01628582819381E8 -:1023E0000E945D0D0F900F900F900F900F900F9027 -:1023F0000F91EF90CF90BF90AF909F908F900895E6 -:102400008F929F92AF92BF92CF92EF920F93A42E92 -:10241000B12CB22A1F921F921F921F921F921F92DD -:10242000812C912CC12CE62E03E023E240E0FC013C -:102430006285828193810E945D0D0F900F900F90B5 -:102440000F900F900F900F91EF90CF90BF90AF90A3 -:102450009F908F9008952F923F924F925F926F922C -:102460007F928F929F92AF92BF92CF92DF92EF9224 -:10247000FF920F931F93CF93DF93CDB7DEB7E8970B -:102480000FB6F894DEBF0FBECDBFDC011A963C91AB -:10249000311107C1122F242E362E3C01FC01C280BF -:1024A000D380D601ED91FC910190F081E02D60E0A8 -:1024B000C60109957C01009709F4F5C0FC01A080D4 -:1024C000B180A114B10409F4F0C04301F4E08F0E0F -:1024D000911CDC0111969C928E9214961C93FE0125 -:1024E00031962F018F0128E030E040E060E0D30119 -:1024F00012968D919C9113970E943D0EF7011482C4 -:102500008111D9C08D81893009F0D1C00981D601EE -:10251000ED91FC910280F381E02D222D41E0632DAD -:10252000C6010995F3018287882309F4C2C0988502 -:102530009583282F40E060E0828193810E94B30E52 -:10254000182F882389F0D701AD92BC92D601ED9166 -:10255000FC910480F581E02DD3011A966C91C6019F -:102560000995F3011286ABC0202F013208F020E25A -:10257000D701AD92BC9221110BC0940142E0F3014E -:102580006285828193810E946D09811197C010C07C -:1025900030E0820140E0D3011A966C911A971296AE -:1025A0008D919C9113970E943D0E811187C0E5CFBC -:1025B0001F921F925F924F921F9288E08F9388E044 -:1025C000882E912CA12CB12C99E2C92EE12C06E089 -:1025D00020EA40E0F3016285828193810E945D0DD3 -:1025E000182F0F900F900F900F900F900F90811158 -:1025F00066C08B81D3011B968C931B97720100E000 -:1026000028E030E040E01A966C911A9712968D916E -:102610009C9113970E94640E811150C02B813C81C4 -:1026200040E0F3016285828193810E94640E8111F2 -:1026300045C0298130E0CE0181967C0140E0D30184 -:102640001A966C911A9712968D919C9113970E94ED -:10265000640E811133C02E8140E0F30162858281D6 -:1026600093810E942110811129C001E0D3011B96A2 -:102670008C91801740F020E0402F68E0C3010E9459 -:1026800000120F5FF3CFD3011296ED91FC911397D7 -:10269000EA58FF4F80818460808381E050968C935C -:1026A0000EC019ED0CC016ED0AC017ED08C011EDF3 -:1026B00006C014ED04C0F701B182A082182F812F4B -:1026C000E8960FB6F894DEBF0FBECDBFDF91CF9175 -:1026D0001F910F91FF90EF90DF90CF90BF90AF9040 -:1026E0009F908F907F906F905F904F903F902F9032 -:1026F0000895CF92DF92FF920F931F93CF93DF93B2 -:1027000000D000D0CDB7DEB78C01F62E19821A8228 -:102710001B821C8220E0462F61E10E94AC1120E068 -:102720004F2D60E1C8010E94AC1120E04F2D64E004 -:10273000C8010E94001283E0C82ED12C9E012F5F99 -:102740003F4F44E050E06F2DC8010E94D71188230D -:10275000F1F020E04F2D64E1C8010E94AC1120E0AF -:102760004F2D60E1C8010E94AC1164E170E080E08F -:1027700090E00E949E070F900F900F900F90DF91B6 -:10278000CF911F910F91FF90DF90CF900895898195 -:102790009A81AB81BC819D7F83309140A041B1057E -:1027A000C1F264E670E080E090E00E949E0781E064 -:1027B000C81AD10819F6CDCFFC0183E991E09183C5 -:1027C0008083738362831286138614861586168629 -:1027D0001786108A148288E085839CE3968391E0B3 -:1027E0009783808784E0818761157105B1F0DB01F3 -:1027F000AA5ABF4F80E090E02D913D91232B49F4E0 -:102800008B96880F991FDB01A80FB91FED93FC93DE -:10281000089501968031910579F70895EF92FF921E -:102820000F931F93CF938C01C62F7A01FA018081F9 -:102830009181A281B3818130F3E09F07F1E0AF077E -:10284000B105D1F060F48115E1E09E07AE07B10556 -:1028500071F181309140A140B10571F064C08330C5 -:1028600021E0920720E1A207B105E1F18330934016 -:10287000A041B105B9F157C080919404811153C0B2 -:1028800020E04C2F61E1C8010E94AC1120E04C2FE8 -:1028900060E1C8010E94AC1120E04C2F64E0C80147 -:1028A0000E94001281E08093940481EB3DC020E0FF -:1028B000462F61E1C8010E94AC1120E04C2F60E17D -:1028C000C8010E94AC1110929404F80162856770EF -:1028D000C770660F660F660F6C2B828193810E9412 -:1028E0008A0921C020E04C2F64E1C8010E94AC118C -:1028F00020E04C2F60E1C8010E94AC1164E170E05F -:1029000080E090E00E949E07F8016285F701218136 -:102910002695217067704C2FF801828193810E9467 -:102920001E0F1092940480E0CF911F910F91FF90A1 -:10293000EF900895CF92DF92EF920F931F93CF9372 -:10294000DF93CDB7DEB72E970FB6F894DEBF0FBE7C -:10295000CDBF6C0181E090E09E878D87E12C8E01D8 -:102960000F5F1F4F9E01235F3F4F41E0F6016285DD -:10297000828193810E944610811151C002E011E0D2 -:1029800089818023D1F019861A861B861C869E01B8 -:10299000275F3F4F44E050E0612FC6010E94D711EE -:1029A00081110BC0AE01475F5F4F612FC6010E94CE -:1029B0000E14813B99F1811132C0000F1F5F183056 -:1029C000F9F611E0F6018385811740F119861A8620 -:1029D0001B861C869E01275F3F4F44E050E0612F1D -:1029E000C6010E94D711811117C089859A85877009 -:1029F00091708130914081F48B859C8581609C87AA -:102A00008B87AE01475F5F4F612FC6010E940E1496 -:102A1000813B21F0811103C01F5FD4CF80E02E964F -:102A20000FB6F894DEBF0FBECDBFDF91CF911F91DF -:102A30000F91EF90DF90CF9008950F931F93CF9356 -:102A4000DF93FC012089211102C080E020C0EC014D -:102A50000E949C070C851D852E853F85DC01CB01DE -:102A6000801B910BA20BB30BB7FDEFCFCE010E94E1 -:102A70009A14182F0E949C07DC01CB018C599F4FA0 -:102A8000AF4FBF4F8C879D87AE87BF87812FDF9168 -:102A9000CF911F910F9108958091A10508950895F8 -:102AA0000895CF93DF932091BE05243049F521E0AE -:102AB0002093E90021E8215059F03091E80035FDDC -:102AC00007C0EFE3F1E03197F1F700C00000F3CF6A -:102AD0002091E80025FF14C0EC0140E050E068E0E0 -:102AE00070E00E9454198091E8008E778093E8008E -:102AF00088E0FE01A9E9B5E001900D928A95E1F721 -:102B0000DF91CF910895CF93C0919704C1110BC06D -:102B10000E940108643C79408105910520F081E024 -:102B200080939704C1E08C2FCF910895FF920F936B -:102B30001F93CF93DF93D82F0FB607FE83C08091EA -:102B4000BE05843081F08091040190E001962091CF -:102B5000060130E0822393232091050130E08217A3 -:102B6000930709F0CDC00E948315811110C0809198 -:102B7000040190E001962091060130E08223932326 -:102B80002091050130E08217930709F0B9C00E9437 -:102B9000F5078C01C091E900CF709091EC00892F6E -:102BA000817090FD80E8C82B82E08093E90085E089 -:102BB000F82E8091EB0085FD42C08091EB0080FFF4 -:102BC0003EC08091EE0087FF3AC080910501909150 -:102BD0000401981709F457C09091E80095FF8EC042 -:102BE000E0910201F0910301E80FF11D20818F5F58 -:102BF000909106018923809305012093F100809133 -:102C0000E80085FDE2CF8091E80080FFDECF809173 -:102C1000E8008E778093E800F0920101D6CF809192 -:102C2000040190E001962091060130E08223932375 -:102C30002091050130E08217930709F44CC0CF7052 -:102C4000C093E90040910401842F90E00196209107 -:102C5000060130E0822393232091050130E08217A2 -:102C6000930709F450C0E0910201F0910301E40FD1 -:102C7000F11DD083809104018F5F9091060189231B -:102C80008093040140C08091E80085FF37C0D09355 -:102C9000F10021E03091F3008091F20090E0932B5D -:102CA000892B91F08091E80080FF0EC08091E800B0 -:102CB00085FF03C01092F100F9CF8091E8008E7774 -:102CC0008093E800F0920101222309F4A8CFCF708D -:102CD000C093E90018C080910101882309F4AFCFA7 -:102CE0000E94F5079C018017910711F4890161CFBB -:102CF00090910101915090930101F8CF20E0CACF4B -:102D000040910401B0CF80E0DF91CF911F910F91EE -:102D1000FF90089508958091BD05811104C00E941F -:102D2000BE1B0C941B1C08951092BD0508950895B8 -:102D300042E061EC81E00E94CD1842E261EC82E069 -:102D40000C94CD188091C005833009F453C030F441 -:102D5000813071F0823009F4BAC008958A3009F4E4 -:102D6000A6C08B3009F478C0893009F0C8C020C0F3 -:102D70008091BF05813A09F0C2C08091E800877F49 -:102D80008093E8008091C3059091C405892B21F4BC -:102D900068E089E995E003C060E080E090E070E0E1 -:102DA0000E949F198091E8008B778093E800089536 -:102DB0008091BF05813209F0A2C08091C305909136 -:102DC000C405892B09F09BC08091E800877F809320 -:102DD000E8008091E80082FD05C08091BE05811168 -:102DE000F8CF8DC08091F1008093A1058091E8001B -:102DF0008B7781C08091BF05813A09F080C08091B6 -:102E0000C3059091C405892BA1F48091E800877FC8 -:102E10008093E8008091E80080FFFCCF8091120150 -:102E20008093F1008091E8008E778093E8000E9403 -:102E300002198091C3059091C405892B09F05FC0E8 -:102E40008091E800877F8093E8008091E80080FF10 -:102E5000FCCF809111014AC08091BF05813209F0F9 -:102E60004EC08091C3059091C405892B69F480916F -:102E7000E800877F8093E8000E9402198091C105D5 -:102E8000809312010E94C81E8091C3059091C405D1 -:102E9000892BA9F58091E800877F8093E8000E9444 -:102EA00002198091C105809311010C94C81E809174 -:102EB000BF05813221F58091E800877F8093E8008B -:102EC0000E9402198091C2058093A2050895809105 -:102ED000BF05813AA1F48091E800877F8093E800E4 -:102EE0008091E80080FFFCCF8091A2058093F100E3 -:102EF0008091E8008E778093E8000C940219089581 -:102F00008091A105809398041092A1050E94D71D7D -:102F10000C94C81E0C9480170E94F5208091BC056B -:102F2000882329F00E941E2181110C94B71808955E -:102F30000E942621809198048093A10508950C9405 -:102F400098170895CF9384B7877F84BF0FB6F894FE -:102F5000A895809160008861809360001092600065 -:102F60000FBE90E080E80FB6F894809361009093D4 -:102F700061000FBE86E995E10E948D2087E091E017 -:102F80000E94501D8EE792E00E9427020E945B077C -:102F90000E94981D0E94BE1B0E941B1C78940E94D8 -:102FA0009A1D8091BE05843019F00E94A117F9CFB7 -:102FB0008CE692E00E9427020E946E068AE592E06B -:102FC0000E942702C2E08091BE05853019F40E945C -:102FD0008C17F9CF0E949E1D2091E4003091E500EE -:102FE00080919504909196042817390761F3809198 -:102FF000E4009091E50090939604809395040E94DC -:103000008315882301F38091BE058430E1F6809119 -:10301000E9008F702091EC00922F917020FD90E8D4 -:10302000892BC093E9009091EB0090FF43C09091F1 -:10303000EE0097FF3FC090910501209104012917F0 -:1030400009F12091E80025FF1DC0E0910201F091F7 -:103050000301E90FF11D30819F5F2091060192234A -:10306000909305013093F1009091E80095FDE3CF36 -:103070009091E80090FFDFCF9091E8009E779093C9 -:10308000E800D9CF9091F3002091F20030E0392B85 -:10309000232B81F09091E80090FF0CC09091E80004 -:1030A00095FF03C01092F100F9CF9091E8009E7750 -:1030B0009093E8008F708093E90085CF292F332704 -:1030C00023303105C9F060F42130310581F0223020 -:1030D000310509F044C082E490E021ED32E043C0C4 -:1030E00021323105E1F02232310549F138C082E167 -:1030F00090E023E133E037C099278130910549F012 -:1031000028F0029761F5E5E9F2E005C0EDECF2E0A8 -:1031100002C0E3ECF2E0849190E09F0124C06115CD -:10312000710541F061307105D1F489E090E02CEF38 -:1031300032E019C089E090E023EE32E014C061155E -:10314000710541F06130710551F482E290E025E2B1 -:1031500033E009C080E490E027E433E004C080E07D -:1031600090E020E030E0FA0131832083089580E18F -:1031700089BD82E189BD09B400FEFDCF8091D800F0 -:103180008F7D8093D8008091E00082608093E00082 -:103190008091E00081FDFCCF0895982F973068F56D -:1031A0009093E900981739F07091EC002091ED00B0 -:1031B0005091F00003C0242F762F50E021FD02C073 -:1031C0009F5FECCF3091EB003E7F3093EB0030916E -:1031D000ED003D7F3093ED003091EB003160309396 -:1031E000EB007093EC002093ED005093F0002091E1 -:1031F000EE0027FDE5CF80E008958F708093E90011 -:1032000081E008958091BF0587FF11C08091E8009B -:1032100082FD05C08091BE058111F8CF11C080915B -:10322000E8008B770BC08091BE05882349F0809120 -:10323000E80080FFF8CF8091E8008E778093E80067 -:1032400008952091E4003091E50095E64091EC006E -:10325000842F817040FF23C08091E80080FD1DC055 -:103260008091BE05882399F0853099F08091EB001C -:1032700085FD11C04091E4005091E5002417350709 -:1032800029F3915011F09A01E1CF84E0089582E092 -:10329000089583E0089581E0089580E008954091C5 -:1032A000E80042FFDDCF0895CF92DF92EF92FF92C8 -:1032B0000F931F93CF93DF93EC018B017A010E9450 -:1032C0002119811133C0E114F10439F0F701808133 -:1032D0009181081B190BC80FD91FC12CD12C0115C6 -:1032E000110519F18091E80085FD16C08091E80074 -:1032F0008E778093E800E114F10449F0F7018081B2 -:103300009181C80ED91ED182C08285E00FC00E9473 -:103310002119882321F30AC089918093F10001507B -:103320001109FFEFCF1ADF0ADACF80E0DF91CF91EA -:103330001F910F91FF90EF90DF90CF900895209113 -:10334000C5053091C6052617370748F06115710588 -:1033500039F42091E8002E772093E80001C0B901EC -:10336000FC0120E06115710579F18091BE0588238B -:10337000F1F18530F1F18091E80083FD3CC080914E -:10338000E80082FD2EC08091E80080FFEBCF209105 -:10339000F3008091F20090E0922B6115710551F0DD -:1033A0008830910538F421912093F1006150710922 -:1033B0000196F3CF21E0089709F020E08091E80022 -:1033C0008E778093E800CECF2111CFCF0AC08091B5 -:1033D000BE05882361F0853061F08091E80083FDAF -:1033E0000AC08091E80082FFF2CF80E0089582E079 -:1033F000089583E0089581E008952091C5053091F6 -:10340000C6052617370748F06115710539F4209174 -:10341000E8002E772093E80001C0B901FC0120E00C -:103420006115710591F18091BE05882309F440C0B2 -:10343000853009F43FC08091E80083FD3DC0809154 -:10344000E80082FD2FC08091E80080FFE9CF209145 -:10345000F3008091F20090E0922B6115710559F014 -:103460008830910540F424912093F1003196615009 -:1034700071090196F2CF21E0089709F020E08091D0 -:10348000E8008E778093E800CBCF2111CCCF0AC023 -:103490008091BE05882361F0853061F08091E8005D -:1034A00083FD0AC08091E80082FFF2CF80E008959A -:1034B00082E0089583E0089581E008951F93CF93FB -:1034C000DF93CDB7DEB7AA970FB6F894DEBF0FBE75 -:1034D000CDBFEFEBF5E08091F100819325E0E73C73 -:1034E000F207C9F70E94A2168091E80083FF2EC15F -:1034F0008091BF059091C005492F50E04A30510599 -:1035000008F024C1FA01EA5AFF4F0C94A423803832 -:1035100021F0823809F01AC108C08091BB05909152 -:10352000BC05992389F082600FC08091C3058F701C -:10353000873008F00BC18093E9008091EB0085FB98 -:10354000882780F91092E9009091E800977F909386 -:10355000E8008093F1001092F100D1C0282F2D7F58 -:1035600009F0F4C0882319F0823061F0EFC0809137 -:10357000C105813009F0EAC0933009F080E0809302 -:10358000BC052EC08091C10581112AC08091C30560 -:103590008F702FEF280F263008F0D8C08093E900F5 -:1035A0002091EB0020FF1CC0933021F48091EB00B0 -:1035B000806214C09091EB0090619093EB0021E049 -:1035C00030E0A90102C0440F551F8A95E2F74093ED -:1035D000EA001092EA008091EB0088608093EB0093 -:1035E0001092E9008091E800877F8093E8000E94B4 -:1035F0000219ACC08111AAC01091C1051F7780913A -:10360000E3008078812B8093E3008091E800877F3E -:103610008093E8000E9402198091E80080FFFCCFAF -:103620008091E30080688093E300111102C082E082 -:1036300001C083E08093BE0589C08058823008F0C5 -:1036400085C08091C1059091C2058C3D53E09507DE -:1036500079F583E08A838AE289834FB7F894DE01A3 -:10366000139620E03EE051E2E32FF0E05093570044 -:10367000E49120FF03C0E295EF703F5FEF708E2F63 -:1036800090E0EA3010F0C79601C0C0968D939D93EC -:103690002F5F243149F74FBF8091E800877F8093E7 -:1036A000E8006AE270E0CE0101960E949F1916C000 -:1036B0006091C3057091C405AE014F5F5F4F0E94DA -:1036C0005E18BC01892B09F441C09091E800977FF6 -:1036D0009093E80089819A810E94FD198091E80009 -:1036E0008B778093E80032C0803881F58091E800C4 -:1036F000877F8093E8008091BA058093F1008091E4 -:10370000E8008E7772CF811121C08091C105909120 -:10371000C20599270297D4F48091E800877F8093AF -:10372000E8008091C1058093BA050E94021980913A -:10373000BA05811106C08091E30087FD02C081E0D7 -:1037400001C084E08093BE050E9498168091E80035 -:1037500083FF0AC08091E800877F8093E800809112 -:10376000EB0080628093EB00AA960FB6F894DEBF60 -:103770000FBECDBFDF91CF911F9108950E942C1CE9 -:103780000E94341CE0EEF0E0808181608083E8EDEF -:10379000F0E080818F77808319BCA7EDB0E08C9139 -:1037A0008E7F8C9380818F7E80831092BD050895DB -:1037B0000F931F93CF93DF930E942C1C0E94341C05 -:1037C000C8EDD0E088818F7788838881806888837E -:1037D00088818F7D888319BC1092BE051092BA052E -:1037E0001092BC051092BB0500EE10E0F80180813C -:1037F0008B7F808388818160888342E060E080E005 -:103800000E94CD18E1EEF0E080818E7F8083E2EEB1 -:10381000F0E0808181608083808188608083F8010E -:1038200080818E7F8083888180618883DF91CF91C2 -:103830001F910F910895E8EDF0E080818F7E8083E5 -:10384000E7EDF0E080818160808384E082BF81E0E9 -:103850008093BD050C94D81BE8EDF0E080818E7F4D -:1038600080831092E20008951092DA001092E10035 -:1038700008951F920F920FB60F9211242F933F932A -:103880004F935F936F937F938F939F93AF93BF9368 -:10389000EF93FF938091E10082FF0BC08091E200E3 -:1038A00082FF07C08091E1008B7F8093E1000E943E -:1038B0004F1D8091DA0080FF1FC08091D80080FFEB -:1038C0001BC08091DA008E7F8093DA008091D9004E -:1038D00080FF0DC080E189BD82E189BD09B400FE91 -:1038E000FDCF81E08093BE050E948B1605C019BCF8 -:1038F0001092BE050E9494168091E10080FF19C0CD -:103900008091E20080FF15C08091E2008E7F80935D -:10391000E2008091E20080618093E2008091D80013 -:1039200080628093D80019BC85E08093BE050E9418 -:103930008A178091E10084FF30C08091E20084FF0B -:103940002CC080E189BD82E189BD09B400FEFDCFB4 -:103950008091D8008F7D8093D8008091E1008F7E88 -:103960008093E1008091E2008F7E8093E20080915D -:10397000E20081608093E2008091BA05882311F013 -:1039800084E007C08091E30087FD02C081E001C0B0 -:1039900083E08093BE050E949F178091E10083FF22 -:1039A00029C08091E20083FF25C08091E100877FDC -:1039B0008093E10082E08093BE051092BA05809169 -:1039C000E1008E7F8093E1008091E2008E7F809302 -:1039D000E2008091E20080618093E20042E060E0DA -:1039E00080E00E94CD188091F00088608093F00004 -:1039F0000E949716FF91EF91BF91AF919F918F9188 -:103A00007F916F915F914F913F912F910F900FBEDA -:103A10000F901F9018951F920F920FB60F921124BE -:103A20002F933F934F935F936F937F938F939F93C6 -:103A3000AF93BF93CF93DF93EF93FF93C091E900D0 -:103A4000CF708091EC00D82FD17080FDD0E810921B -:103A5000E9008091F000877F8093F00078940E94C5 -:103A60005E1A1092E9008091F00088608093F00067 -:103A7000CD2BCF70C093E900FF91EF91DF91CF91F3 -:103A8000BF91AF919F918F917F916F915F914F9176 -:103A90003F912F910F900FBE0F901F901895089592 -:103AA0009093A8058093A7050895E091A705F0914C -:103AB000A805309721F00190F081E02D099480E075 -:103AC0000895E091A705F091A805309721F00280B4 -:103AD000F381E02D099408952091A5053091A60564 -:103AE0002817390771F09093A6058093A505E091FA -:103AF000A705F091A805309721F00680F781E02D09 -:103B0000099408952091A3053091A4052817390739 -:103B100071F09093A4058093A305E091A705F0911F -:103B2000A805309721F00084F185E02D09940895CF -:103B30000C94D81D0E94EC070C946D06CF93DF9374 -:103B400000D000D01F92CDB7DEB70E9475068FEF70 -:103B500089838A831B820E94F5078160782F9D8369 -:103B60008C8349815A816B818D810E94781F0E94CC -:103B700077060E94551D9091A905891769F00E944A -:103B8000551D8093A9050F900F900F900F900F90E7 -:103B9000DF91CF910C94F1200F900F900F900F9028 -:103BA0000F90DF91CF91089508950C94D41D08953E -:103BB000089508950895882309F4BBC09CEF980FD9 -:103BC000913A18F40E94FB1F0DC090E2980F9830B4 -:103BD00058F4877091E001C0990F8A95EAF7892F10 -:103BE0000E9436200C9467209BE5980F933070F468 -:103BF000853A29F0863A31F083E890E005C081E803 -:103C000090E002C082E890E00C946C1D98E5980F5B -:103C1000973108F08EC0883A09F445C0893A09F412 -:103C200045C08A3A09F445C08B3A09F445C08C3A3C -:103C300009F445C08D3A09F445C08E3A09F445C0EF -:103C40008F3A09F445C0813B09F445C0803B09F433 -:103C500045C0823B09F445C0833B09F445C0843B21 -:103C600009F445C0853B09F445C0863B09F445C0CD -:103C7000873B09F445C0883B09F445C0893B09F4FA -:103C800045C08A3B09F445C08B3B09F445C08C3BD9 -:103C900009F445C08D3B09F445C08E3B09F445C08D -:103CA00080E090E044C082EE90E041C089EE90E078 -:103CB0003EC08AEE90E03BC085EB90E038C086EBDA -:103CC00090E035C083EB90E032C084EB90E02FC0F1 -:103CD00087EB90E02CC08CEC90E029C08DEC90E05C -:103CE00026C083E891E023C08AE891E020C082E901 -:103CF00091E01DC084E991E01AC081E292E017C012 -:103D000083E292E014C084E292E011C085E292E086 -:103D10000EC086E292E00BC087E292E008C08AE221 -:103D200092E005C08FE690E002C080E790E00C943E -:103D3000821D0895882329F19CEF980F913A18F479 -:103D40000E9418200DC090E2980F983058F48770A8 -:103D500091E001C0990F8A95EAF7892F0E943C20D3 -:103D60000C9467209BE5980F933020F480E090E05E -:103D70000C946C1D885A873120F480E090E00C94FC -:103D8000821D08950E9453200E9428200C946720D1 -:103D90000E9443200C94C21EEF92FF920F931F9338 -:103DA000CF93DF9300D000D01F92CDB7DEB78C0148 -:103DB0000E94F320811190C085E0F801DE01119688 -:103DC00001900D928A95E1F7F8014081518123819C -:103DD00034812115310531F05F3F31F481E04F3FEF -:103DE00019F403C081E001C080E080FD75C0F801D6 -:103DF000E28049835A83EB82722F3D832C836E2DA0 -:103E00008D810E94B51FF82E492F4F70892F829502 -:103E10008F708E30B1F108F050C0823008F05CC075 -:103E2000907F142F11F01295107FEE20A9F011232E -:103E300029F0812F0E9446200E9467208F2D0F902D -:103E40000F900F900F900F90DF91CF911F910F91D6 -:103E5000FF90EF900C94DB1D8F2D0E949A1E112372 -:103E6000D9F1812F0E944C200F900F900F900F904E -:103E70000F90DF91CF911F910F91FF90EF900C94D5 -:103E80006720F11029C0EE2039F10E94C81EFFEF13 -:103E900020E782E0F15020408040E1F700C00000C0 -:103EA0000F900F900F900F900F90DF91CF911F9177 -:103EB0000F91FF90EF900C9453216F2DC8010F903C -:103EC0000F900F900F900F90DF91CF911F910F9156 -:103ED000FF90EF900C9472210F900F900F900F9025 -:103EE0000F90DF91CF911F910F91FF90EF90089568 -:103EF000CF93DF93CDB7DEB72A970FB6F894DEBF26 -:103F00000FBECDBF942F4E83252F5F83688779879F -:103F10008A8749855A85452B31F02F3F31F481E05E -:103F20009F3F19F403C081E001C080E080FD07C01D -:103F30004E815F81688579858A850E94E22085E0CF -:103F4000FE013696DE01119601900D928A95E1F7F9 -:103F5000CE0101960E94CC1E2A960FB6F894DEBFC1 -:103F60000FBECDBFDF91CF9108950F931F93CF93D5 -:103F7000DF9300D000D01F92CDB7DEB7042F498366 -:103F80005A836B837C838D832C813D81232B31F07D -:103F90005F3F31F481E04F3F19F403C081E001C07D -:103FA00080E080FF03C080E090E01BC08B8110E0C8 -:103FB000882379F06091AA057091AB058091AC05DA -:103FC0009091AD050E949220F801E655FA4F80834A -:103FD00004C0F801E655FA4F808169817A810E9418 -:103FE00082210F900F900F900F900F90DF91CF9143 -:103FF0001F910F9108952091130130911401F9013F -:1040000032969FEF40E05191851789F09F3F19F458 -:10401000511101C0942F4F5F4630A9F79F3F39F0EF -:10402000F901E90FF11D97FDFA958283089508952E -:10403000E0911301F09114019F012A5F3F4F92819B -:10404000891301C012823196E217F307C1F7089570 -:1040500081E090E0E0911301F0911401E80FF91F65 -:104060001082019688309105A9F708959091B805BE -:10407000892B8093B805089580959091B805892380 -:104080008093B80508951092B80508959091B705EA -:10409000892B8093B705089580959091B705892362 -:1040A0008093B70508951092B70508958091130184 -:1040B00090911401FC0131969C01285F3F4F80E0F4 -:1040C000919191118F5FE217F307D1F70895E09175 -:1040D0001301F09114018091B8058083E0911301E0 -:1040E000F091140190818091B705892B8083809194 -:1040F000AE05882361F0E0911301F09114019081E5 -:10410000892B80830E94562081111092AE058091E8 -:104110001301909114010C94611D9093A701809359 -:10412000A6010895CF92DF92EF92FF926C01EE24E8 -:10413000FF24C114D104E104F10421F0C701B60148 -:1041400020E101C020E0C72ED82EE92EFF24C114A3 -:10415000D104E104F10419F0285FC701B6016B0135 -:104160007C0154E0F694E794D794C7945A95D1F71C -:10417000C114D104E104F10419F02C5FC701B601A8 -:104180006B017C0142E0F694E794D794C7944A957A -:10419000D1F7C114D104E104F10419F02E5FC70175 -:1041A000B601DC01CB01B695A79597958795892B2C -:1041B0008A2B8B2B09F02F5F822FFF90EF90DF90DF -:1041C000CF900895CF93DF9300D000D01F92CDB74A -:1041D000DEB70F900F900F900F900F90DF91CF915F -:1041E00008950C94D51D80E008958091BE0584301B -:1041F00021F11092B90520E488E190E00FB6F8941F -:10420000A895809360000FBE2093600083B7817FE4 -:10421000846083BF83B7816083BF7894889583B7B8 -:104220008E7F83BF0FB6F894A89580916000886157 -:1042300080936000109260000FBE08950E94D91D07 -:104240000E9475060E94DA1D80E008950E94D71D25 -:104250000C94C81E1F920F920FB60F9211248F93C9 -:104260009F93AF93BF938091B905811113C0809143 -:104270008B0490918C04A0918D04B0918E04419692 -:10428000A11DB11D80938B0490938C04A0938D0489 -:10429000B0938E04BF91AF919F918F910F900FBEFD -:1042A0000F901F9018950E94BE1BF89487E797E720 -:1042B000909301088093000887E090EBDC018093E5 -:1042C000C7059093C805A093C905B093CA059CE0A3 -:1042D00088E10FB6F894A895809360000FBE909384 -:1042E0006000FFCF0895E62FF0E0EB5AFD4F849178 -:1042F0000895E82FF0E0EE0FFF1FED52FF4F85917C -:10430000949108950E94732190E4980F903218F4CC -:104310000E94792108958F3B50F4883A48F5853AF8 -:10432000D0F48430A8F4813009F4B2C0AEC0883E25 -:1043300040F4803E68F48F3B09F0A7C020E030EEE7 -:10434000A9C0803F08F4A1C0282F30E03065A2C08A -:10435000282F30E09FC0853A29F0863A31F023E8D3 -:1043600030E498C021E830E495C022E830E492C0FF -:10437000883A09F445C0893A09F445C08A3A09F4F3 -:1043800045C08B3A09F445C08C3A09F445C08D3AD2 -:1043900009F445C08E3A09F445C08F3A09F445C086 -:1043A000813B09F445C0803B09F445C0823B09F4D8 -:1043B00045C0833B09F445C0843B09F445C0853BB7 -:1043C00009F445C0863B09F445C0873B09F445C064 -:1043D000883B09F445C0893B09F445C08A3B09F490 -:1043E00045C08B3B09F445C08C3B09F445C08D3B6F -:1043F00009F445C08E3B09F445C020E034E44AC0CE -:1044000022EE34E447C029EE34E444C02AEE34E41A -:1044100041C025EB34E43EC026EB34E43BC023EB43 -:1044200034E438C024EB34E435C027EB34E432C044 -:104430002CEC34E42FC02DEC34E42CC023E835E41C -:1044400029C02AE835E426C022E935E423C024E95E -:1044500035E420C021E236E41DC023E236E41AC070 -:1044600024E236E417C025E236E414C026E236E43E -:1044700011C027E236E40EC02AE236E40BC02FE674 -:1044800034E408C020E734E405C020E030E002C096 -:1044900021E030E0C90108950E94BD2208F481E0C6 -:1044A00008950E94112388F09F5798F0B92F9927FB -:1044B000B751B0F0E1F0660F771F881F991F1AF00F -:1044C000BA95C9F714C0B13091F00E942B23B1E026 -:1044D00008950C942B23672F782F8827B85F39F025 -:1044E000B93FCCF3869577956795B395D9F73EF4A8 -:1044F00090958095709561957F4F8F4F9F4F089550 -:10450000E89409C097FB3EF490958095709561956D -:104510007F4F8F4F9F4F9923A9F0F92F96E9BB2723 -:104520009395F695879577956795B795F111F8CF9F -:10453000FAF4BB0F11F460FF1BC06F5F7F4F8F4F0A -:104540009F4F16C0882311F096E911C0772321F000 -:104550009EE8872F762F05C0662371F096E8862F98 -:1045600070E060E02AF09A95660F771F881FDAF7EF -:10457000880F9695879597F90895990F0008550F1C -:10458000AA0BE0E8FEEF16161706E807F907C0F0D9 -:1045900012161306E407F50798F0621B730B840BE1 -:1045A000950B39F40A2661F0232B242B252B21F4BB -:1045B00008950A2609F4A140A6958FEF811D811D5B -:1045C000089597F99F6780E870E060E008959FEF95 -:1045D00080EC089500240A9416161706180609069A -:1045E000089500240A941216130614060506089569 -:1045F000092E0394000C11F4882352F0BB0F40F4F1 -:10460000BF2B11F460FF04C06F5F7F4F8F4F9F4F30 -:10461000089557FD9058440F551F59F05F3F71F0B2 -:104620004795880F97FB991F61F09F3F79F0879519 -:104630000895121613061406551FF2CF4695F1DFA2 -:1046400008C0161617061806991FF1CF8695710532 -:10465000610508940895E894BB2766277727CB0166 -:1046600097F908950E94BD2208F48FEF08950E94E3 -:104670004A230C94F8220E94EA2238F00E94F12288 -:1046800020F0952311F00C94E1220C94E7221124E0 -:104690000C942C230E94092370F3959FC1F3950F6E -:1046A00050E0551F629FF001729FBB27F00DB11DB6 -:1046B000639FAA27F00DB11DAA1F649F6627B00D46 -:1046C000A11D661F829F2227B00DA11D621F739F2F -:1046D000B00DA11D621F839FA00D611D221F749F3D -:1046E0003327A00D611D231F849F600D211D822F84 -:1046F000762F6A2F11249F5750409AF0F1F08823AB -:104700004AF0EE0FFF1FBB1F661F771F881F9150D7 -:104710005040A9F79E3F510580F00C94E1220C9483 -:104720002C235F3FE4F3983ED4F386957795679505 -:10473000B795F795E7959F5FC1F7FE2B880F911D01 -:104740009695879597F90895EE0FFF1F0590F491C0 -:08475000E02D0994F894FFCF5D -:10475800010599040000FF4C1551154F158A165094 -:10476800150101AF052F2F20556E6B6E6F776E20E8 -:10477800484944204465736320547970653A002F92 -:104788002F20556E6B6E6F776E20446573632054CF -:104798007970653A00206C656E002F2F2069645689 -:1047A800656E646F72002F2F20696450726F647594 -:1047B8006374002F2F206C616E676964000000002D -:1047C80000D602000000007A078007760779077094 -:1047D8000773077307000000009B084208FB0800E6 -:1047E8000000002B127C118A111D15821179137E8D -:0647F80011851180110083 +:100110002F000D0A2F2F206953657269616C4E758F +:100120006D6265723A20000D0A2F2F206950726FA0 +:10013000647563743A20000D0A2F2F20694D616E9B +:100140007566616374757265723A20002C20002F09 +:100150002F204C616E6749643A20006C656E3A202E +:10016000000D0A2F2F20537472696E67205A657232 +:100170006F3A20000D0A2F2F204465766963653A97 +:10018000000D0A2F2F20446576696365722064751F +:100190006D703A002F2F204C6F7773706565643A4D +:1001A00020002F2F20416464726573733A20000D84 +:1001B0000A2F2F205553425F646573635F64756D2A +:1001C00070000D0A2F2F204875623A20546F20646A +:1001D000756D702064657363726970746F72206FDF +:1001E000662068756220736565204E4F544520690E +:1001F0006E20636F6465000D0A2F2F2069436F6EB8 +:1002000066696775726174696F6E3A20004275663F +:10021000666572206973206E6F7420656E6F7567F6 +:100220006821006C656E3A20002064756D703A0993 +:10023000000D0A2F2F20436F6E666967000D0A2F8D +:100240002F20556E6B6E6F776E20484944204465B1 +:1002500073633A20747970653A3A20002064756DB2 +:10026000703A096C656E3A20000D0A2F2F205265F6 +:10027000706F7274000D0A2F2F204849443A2000F5 +:100280000D0A2F2F2069496E746572666163653AA5 +:1002900020003A002E000D0A2F2F20496E7465723F +:1002A00066616365000D0A2F2F20456E64706F69CB +:1002B0006E743A000D0A2F2F20436F6E6669673AFD +:1002C000002F2F20006C656E3A2000293A2000286C +:1002D00000537472696E670042614173736F634AC1 +:1002E00061636B49443A090900624E756D456D6260 +:1002F0004D4944494A61636B3A090062446573633E +:10030000726970746F72537562547970653A09003E +:100310006244657363726970746F72547970653A80 +:100320000900624C656E6774683A09090020474508 +:100330004E4552414C000D0A2F2F204D4944492073 +:1003400053747265616D696E6720456E64706F6984 +:100350006E743A00694A61636B3A090909004261A7 +:10036000536F7572636550696E3A090900426153B3 +:100370006F7572636549443A090900624E72496EAD +:1003800070757450696E733A0909004A61636B496C +:10039000443A09090900624A61636B547970653A0D +:1003A0000909006244657363726970746F725375F2 +:1003B00062547970653A09006244657363726970CA +:1003C000746F72547970653A0900624C656E677497 +:1003D000683A090900204F55545F4A41434B006970 +:1003E0004A61636B3A090909004A61636B49443AFF +:1003F00009090900624A61636B547970653A090919 +:10040000006244657363726970746F7253756254ED +:100410007970653A09006244657363726970746F3C +:1004200072547970653A0900624C656E6774683A77 +:1004300009090020494E5F4A41434B0077546F74CD +:10044000616C4C656E6774683A0909006263644DBB +:1004500053433A0909090062446573637269707411 +:100460006F72537562547970653A0900624465731E +:1004700063726970746F72547970653A0900624CE6 +:10048000656E6774683A0909002048454144455241 +:10049000000D0A2F2F204D49444920537472656185 +:1004A0006D696E6720496E7465666163653A0062C6 +:1004B0006D436F6E74726F6C733A09090077546FF5 +:1004C00074616C4C656E6774683A09090062436137 +:1004D0007465676F72793A09090062636441444345 +:1004E0003A090909006244657363726970746F7236 +:1004F000537562547970653A09006244657363729A +:100500006970746F72547970653A0900624C656E57 +:100510006774683A09090020484541444552000D76 +:100520000A2F2F20417564696F20436F6E74726FBC +:100530006C20496E7465666163653A007744657343 +:1005400063726970746F724C656E6774683A090003 +:10055000624465736372547970653A090900624EAA +:10056000756D44657363726970746F72733A0900D4 +:1005700062436F756E747279436F64653A0909005E +:100580006263644849443A09090900624465736337 +:10059000726970746F72547970653A0900624C65C3 +:1005A0006E6774683A09090069496E74657266611C +:1005B00063653A09090062496E7465726661636534 +:1005C00050726F746F636F6C3A090062496E7465A4 +:1005D0007266616365537562436C6173733A0900B7 +:1005E00062496E74657266616365436C6173733AE8 +:1005F0000900624E756D456E64706F696E74733A72 +:1006000009090062416C7465726E617465536574AA +:1006100074696E673A090062496E74657266616357 +:10062000654E756D6265723A090062446573637266 +:100630006970746F72547970653A0900624C656E26 +:100640006774683A09090062496E74657276616C74 +:100650003A090900774D61785061636B657453699D +:100660007A653A090900626D417474726962757441 +:1006700065733A09090062456E64706F696E744172 +:100680006464726573733A090062446573637269E6 +:1006900070746F72547970653A0900624C656E67C8 +:1006A00074683A090900624D6178506F7765723A53 +:1006B000090900626D417474726962757465733AF8 +:1006C00009090069436F6E66696775726174696FC5 +:1006D0006E3A09090062436F6E66696775726174EC +:1006E000696F6E56616C75653A0900624E756D49A9 +:1006F0006E74657266616365733A09090077546FB9 +:1007000074616C4C656E6774683A090900624465EF +:100710007363726970746F72547970653A0900621C +:100720004C656E6774683A090900624E756D436FD7 +:100730006E66696775726174696F6E733A090069F4 +:1007400053657269616C4E756D6265723A09090094 +:100750006950726F647563743A090900694D616E7E +:100760007566616374757265723A09090062636443 +:100770004465766963653A090900696450726F647B +:100780007563743A090900696456656E646F723A5C +:10079000090900624D61785061636B657453697A31 +:1007A00065303A09006244657669636550726F741A +:1007B0006F636F6C3A0900624465766963655375CF +:1007C00062436C6173733A090062446576696365DC +:1007D000436C6173733A0909006263645553423A8A +:1007E000090909006244657363726970746F725419 +:1007F0007970653A0900624C656E6774683A090958 +:1008000000206C656E3A20000D0A2F2F20556E6B6C +:100810006E6F776E20446573633A20747970653A21 +:1008200020002F2F20004552524F523A2000300016 +:100830000A4C6F6F702073746172742E0A000A552F +:10084000534220636F6E666967757265642E0A0095 +:100850000A544D4B3A3762323832372F4C554641A5 +:100860003A6436613764662F554853323A39363127 +:100870003132640A002C035500530042002000442A +:100880000065007300630072006900700074006FFF +:100890000072002000440075006D00700065007259 +:1008A000000000080354004D004B00000004030941 +:1008B0000409022900010100A0320904000002031A +:1008C0000000000921110100012222000705810317 +:1008D00020000107050103200001120110010000A2 +:1008E0000008EDFE5B001408010200010631FF095B +:1008F00074A1010975150026FF0095207508810275 +:100900000976150026FF00952075089102C0BE05E6 +:10091000441811241FBECFEFDAE0DEBFCDBF04B60E +:1009200003FE28C08091650590916605A09167053A +:10093000B09168058730904BA740B04BD9F4109226 +:10094000650510926605109267051092680514BE41 +:100950000FB6F894A895809160008861809360003C +:10096000109260000FBE1092010810920008E0E0A3 +:10097000F8E3099511E0A0E0B1E0E2E0FAE402C09A +:1009800005900D92A035B107D9F725E0A0E5B1E0BB +:1009900001C01D92A536B207E1F714E0C9E8D4E022 +:1009A00004C02197FE010E94F924C738D107C9F776 +:1009B0000E94091E0C94FF240C940000FF93EF93F7 +:1009C000E0915001F0915101309709F00995EF91B4 +:1009D000FF910895FC018591803011F0EFDFFBCF8E +:1009E0000895FF27E0E230E247FF0CC0419597FFF2 +:1009F00009C0EDE26095709580959095611D711D1F +:100A0000811D911D27FF02C0219530E350E2AA27E6 +:100A1000660F771F881F991FAA1FA41710F0A41B29 +:100A200063955A95A9F7AA3008F0A95FA05DAF9326 +:100A3000F395611571058105910541F7ED3211F4CA +:100A4000EF93F395F21718F43F93F395FBCF8F9143 +:100A5000B5DFFA95E1F70895E991F9918591803034 +:100A600021F0853219F0AADFF9CF089520E0E8944B +:100A700055915532C1F3503311F4689455915A335E +:100A800048F4505390F3220F022E220F220F200D14 +:100A9000250FF4CF0EF4219589919991533619F3CE +:100AA000533729F1533559F1BC0188279927E89428 +:100AB0005C3621F48991999168945591543639F4B2 +:100AC00046EF7EF077FF0DC08FEF9FEF0AC05537DE +:100AD0004AE039F0583540E121F0523642E009F061 +:100AE0000895FF93EF937DDFEF91FF91B7CFFF93D1 +:100AF000EF93FC0181918030B9F360DFFBCFFF936E +:100B0000EF9368DFF1CFDF93CF93CDB7DEB72596B4 +:100B1000A3DFCF91DF9108950C941E1808950C94D3 +:100B20005A1C089590E080E008958FEF9FEF08959C +:100B300081E090E00895862F0E94F21C81E090E011 +:100B40000895EF92FF920F931F93CF93DF938A0143 +:100B5000EB017B01E40EF51ECE15DF0521F0899136 +:100B60000E94F21CF9CFC801DF91CF911F910F9124 +:100B7000FF90EF900895089581E00895E2E5F1E097 +:100B80001382128288EE93E0A0E0B0E08483958324 +:100B9000A683B78386E191E0918380838FEF9FEFF7 +:100BA0009587848708950C9439068F929F92AF920F +:100BB000BF92CF92DF92EF92FF920E94B3234B013C +:100BC0005C0120E030E04AE755E40E946A246B01B2 +:100BD0007C0120E030E040E85FE30E947F2387FD56 +:100BE00030C020E03FEF4FE757E4C701B6010E9455 +:100BF00065241816F4F420E030E040E251E4C50129 +:100C0000B4010E946A240E94842320E931E0611526 +:100C1000710549F4FF90EF90DF90CF90BF90AF90B7 +:100C20009F908F900895C9010197F1F76150710964 +:100C3000EECFC701B6010E948423CB010197F1F7E3 +:100C4000E9CF61E070E0F9CF82E084BD93E095BD2B +:100C50009AEF97BD80936E0008952FB7F894809116 +:100C6000A2019091A301A091A401B091A5012FBF71 +:100C700008952FB7F8946091A2017091A30180911B +:100C8000A4019091A5012FBF089578941F920F920F +:100C90000FB60F9211248F939F93AF93BF938091C0 +:100CA000A2019091A301A091A401B091A501019688 +:100CB000A11DB11D8093A2019093A301A093A40153 +:100CC000B093A501BF91AF919F918F910F900FBEEF +:100CD0000F901F901895CF93DF93FC0167FD12C012 +:100CE000283080F4442319F08581873059F0EF01D2 +:100CF000A1E0B0E08D85882349F111962596A031B9 +:100D0000B105C1F780E018C085E08A9FE0018B9FA4 +:100D1000D00D1124CE0FDF1F442389F081E4888792 +:100D200085818F5F858325E02A9FC0012B9F900DD1 +:100D30001124E80FF91F8085DF91CF91089581E09C +:100D40008887F1CF2770687B622B0FC06623E1F2A2 +:100D50006770660F660F660F4423A1F36064858198 +:100D60008F5F85838770687F682B25E02A9FC0018D +:100D70002B9F900D1124E80FF91F6087862FDCCF81 +:100D8000DF92EF92FF920F931F93CF93DF93EC01CB +:100D900085E0E62EF12CFE01869FE00DF11D112469 +:100DA000908596FF24C0192F177001E085E0D82E9A +:100DB0008FEF800F8F3008F001E0602F70E0062F7A +:100DC000D69EF001D79EF00D1124EC0FFD1F8085FB +:100DD0008695869586958770181701F16F5F7F4F0E +:100DE000603168F38D81811302C011501D8385E04D +:100DF0008E9DF0018F9DF00D1124EC0FFD1F1086CC +:100E000081E0818712862296D783C683DF91CF91B6 +:100E10001F910F91FF90EF90DF900895CE010E94F7 +:100E2000C006C6CFFC0121E0611102C006960895FC +:100E30003585631739F02F5F35962031C9F790E07B +:100E400080E00895069635E0239F800D911D1124C2 +:100E50000895FC0121E0613499F49C01255B3F4F2A +:100E600061E0AC014E5F5F4F158666871786548739 +:100E7000438735962E173F07B9F7FC011582089571 +:100E80003585631729F02F5F35962031C9F708950E +:100E9000622F0C94C006FC0188E291E0918380836C +:100EA000108681E081871286CF0102969783868320 +:100EB000128228E023832CE324831582DF019F0123 +:100EC000255B3F4F41E01D961C921D971E964C934B +:100ED0001E971F961C921F971C969C938E931B9790 +:100EE0001596A217B30779F7EA58FF4F108281E1F0 +:100EF0008093AB0108958091AB010895CF93C42FE7 +:100F00000E941207009789F0DC01ED91FC91119786 +:100F1000309769F013969C9180E0981731F020810A +:100F20002C1729F033968F5FF8CFF0E0E0E0CF0187 +:100F3000CF9108950F931F93CF93DF932115310520 +:100F400099F0E901042F162F0E941207FC0186ED8B +:100F5000309729F01283D183C083038380E0DF912F +:100F6000CF911F910F91089588EDF9CFCF92DF9225 +:100F7000FF920F931F93CF93DF93662381F1F62E99 +:100F80008C016C0186E5C80ED11CD0E0C0E0D60112 +:100F90008D919D916D010097F1F0DC01ED91FC9137 +:100FA0000084F185E02D09958F1115C0AB96CC0F0B +:100FB000DD1FC00FD11F88819981DC01ED91FC916B +:100FC0000480F581E02DDF91CF911F910F91FF906B +:100FD000DF90CF9009942196C031D105C1F680E011 +:100FE000DF91CF911F910F91FF90DF90CF900895E7 +:100FF0002E9808952E9A0895CF93C82F0E94F8072F +:10100000CEBD0DB407FEFDCF1EBC0DB407FEFDCF57 +:101010000E94FA078EB5CF910895CF93DF93C82F22 +:10102000D62F0E94F807C260CEBD0DB407FEFDCFDB +:10103000DEBD0DB407FEFDCFDF91CF910C94FA0712 +:10104000AF92BF92CF92DF92EF92FF920F931F93D6 +:10105000CF93DF93EC01D62EC42E59010E941207C4 +:101060007C0186EDE114F104E1F1F70180819181C9 +:10107000892B09F441C04C2D6D2DCE010E947E07B5 +:10108000F501918380830097C9F1FC0122812695A7 +:101090002695203108F02FE081E090E0A0E0B0E05C +:1010A00004C0880F991FAA1FBB1F2A95D2F701976A +:1010B000F801918380836D2D80EE0E940D0888EDEC +:1010C0000E94FC07F7019481682F697F992329F01A +:1010D000CA58DF4F68816260682B88ED0E940D0856 +:1010E00080E0DF91CF911F910F91FF90EF90DF9003 +:1010F000CF90BF90AF90089587EDF3CF8BEDF1CFF8 +:101100008F929F92AF92BF92CF92DF92EF92FF9217 +:101110000F931F93CF93DF93862E942E59010E9435 +:10112000D3056B017C0128E8C20E23E1D21EE11C2D +:10113000F11CC0E010E000E0D0E098280E94D30548 +:101140006C197D098E099F0997FF1EC0692D80EFDC +:101150000E940D080E94D3056C197D098E099F0914 +:1011600097FF09C088EC0E94FC0787FFF3CF60E877 +:1011700088EC0E940D0888EF0E94FC07C82FCF70F2 +:10118000C43081F0CE30B9F08C2FDF91CF911F9118 +:101190000F91FF90EF90DF90CF90BF90AF909F9016 +:1011A0008F9008950F5F1F4FA114B10439F20A15F3 +:1011B0001B0521F6E9CFDF5FD33009F0BFCFE4CFC5 +:1011C0009F92AF92BF92CF92DF92EF92FF920F93D6 +:1011D0001F93CF93DF936C01C42FD22F9924939444 +:1011E000E62EF12CEE0CFF1CE80EF91E86E5E80E4B +:1011F000F11CA42EB12CABE2AA0EB11CAA0CBB1C94 +:10120000AC0CBD1CF70180819181DC01ED91FC915A +:101210000280F381E02D202F4D2F6C2F0995182F80 +:10122000803EC9F5C1112BC061E088EE0E940D0817 +:1012300066E670E080E090E00E94D505F7018081CD +:101240009181DC01ED91FC910190F081E02D202F46 +:101250004D2F6C2F0995182F8D30D1F58FEF890DFB +:101260008330F8F0C11137C061E088EE0E940D08AC +:1012700066E670E080E090E00E94D5051CC0F501B4 +:1012800080819181DC01ED91FC910284F385E02D58 +:101290006D2F0995D3CF8D3061F48FEF890D833099 +:1012A00050F464E670E080E090E00E94D5059394ED +:1012B000A9CF882319F2812FDF91CF911F910F9130 +:1012C000FF90EF90DF90CF90BF90AF909F900895E8 +:1012D000882389F3C7CF8C2F90E08B96880F991FB6 +:1012E0008C0D9D1DFC0180819181DC01ED91FC91B3 +:1012F0000284F385E02D6D2F0995DDCF0F931F93A9 +:10130000CF93DF93D82FC62F8A010E94F807D260AF +:10131000DEBDF8018C2F882339F00DB407FEFDCF18 +:1013200091919EBD8150F7CFC00FD12FD11D0DB42B +:1013300007FEFDCF0E94FA07CE01DF91CF911F91EA +:101340000F9108952F923F924F925F926F927F92EA +:101350008F929F92AF92BF92CF92DF92EF92FF92C5 +:101360000F931F93CF93DF9300D000D01F92CDB780 +:10137000DEB77D836C835A016901FB01F1808FEF39 +:101380008F0D803408F0B5C00E94D3052B013C01BD +:10139000F8E84F0EF3E15F1E611C711CEC81FD81CA +:1013A000828160E480FD60E888EE0E940D08312CA7 +:1013B0008F2D90E09A838983C114D10409F475C0FC +:1013C000E980FA80CE14DF0408F47601EB82A801EC +:1013D0006E2D80E10E947E096E2D88E30E940D082B +:1013E000EC81FD816081606280EF0E940D0888ECD5 +:1013F0000E94FC0787FFFBCF60E888EC0E940D0885 +:1014000088EF0E94FC078F70382E912C812C212CA4 +:101410003320F9F00E94D3056419750986099709EC +:1014200097FF17C0F6E03F16E9F02EE03216B1F054 +:1014300084E0381209C09FEF891A990AA114B104F7 +:1014400089F08A149B0471F460E088E30E940D081F +:101450002EC0CE18DF080E0D1F1DAECF2394E3E083 +:101460002E1691F360E088E30E940D08F801608178 +:1014700080E10E940D086B8188E30E940D08EC81D9 +:10148000FD816081606280EF0E940D0888EC0E94FF +:10149000FC0787FFFBCF60E888EC0E940D0888EF0F +:1014A0000E94FC078F70382EB3CF3110CDCF88EF5C +:1014B0000E94FC07EC81FD81928185FB90F992836B +:1014C000832D0F900F900F900F900F90DF91CF9181 +:1014D0001F910F91FF90EF90DF90CF90BF90AF9052 +:1014E0009F908F907F906F905F904F903F902F9044 +:1014F00008958AED382EE4CF2F923F924F925F925B +:101500006F927F928F929F92AF92BF92CF92DF9213 +:10151000EF92FF920F931F93CF93DF93CDB7DEB778 +:1015200029970FB6F894DEBF0FBECDBF9C838B8387 +:101530006B015E834D835901E982F90180809180BE +:10154000FB01F181FA83F90111821082FB01828192 +:1015500060E181FD60E288EE0E940D088F82F981D2 +:101560004F2E512C712C612C2D813E81F601408132 +:1015700060E08B819C810E948008382EF6E08F17F6 +:1015800099F3811155C088EC0E94FC0782FF73C05B +:1015900080E30E94FC07282E8815190411F008F03A +:1015A0002F80F501808191819401281B390B3987A7 +:1015B000288737FF02C019861886E22CF12C88850F +:1015C0009985E816F90614F4F986E88638840E94AD +:1015D000F80798E09EBD0DB407FEFDCFF80133205B +:1015E00041F01EBC3A940DB407FEFDCF8EB5819339 +:1015F000F6CFE885F9850E0F1F1F0E94FA0764E0F9 +:1016000088EC0E940D08F50180819181E80EF91E99 +:10161000F182E082FA812F1618F0E814F90410F133 +:1016200088EF0E94FC07F601928184FB91F9928376 +:10163000832D29960FB6F894DEBF0FBECDBFDF9184 +:10164000CF911F910F91FF90EF90DF90CF90BF90BF +:10165000AF909F908F907F906F905F904F903F9052 +:101660002F900895F981FF2309F47ECFC301B201C1 +:101670000E94D50579CF80EF382EDACF2F923F9296 +:101680004F925F926F927F928F929F92AF92BF9292 +:10169000CF92DF92EF92FF920F931F93CF93DF933E +:1016A000CDB7DEB761970FB6F894DEBF0FBECDBFE2 +:1016B0003C01F42E322E202EC98A65014EA05FA077 +:1016C000A8A4B9A4188A1F861E861D868E01035FF2 +:1016D0001F4F9E01215F3F4F0E942008182F81114C +:1016E00077C039822A82EB8289898C83DE82CD821F +:1016F00098868F82AE014F5F5F4F68E080E20E9464 +:101700007E092D853E854F2D60E1C3010E94800832 +:10171000182F81115DC0A114B10409F444C0EF85F4 +:10172000F889828137FE45C0826082836401C114DA +:10173000D10409F46EC09C2D8D2D4C145D0410F461 +:10174000942D852D9B878C874D855E856F85788947 +:10175000E12C85019E01255F3F4FC3010E947C0A59 +:10176000182F863021F3811133C0AAA5BBA510978D +:1017700099F06B857C85ED91FC9111970190F0813A +:10178000E02DC4018C199D099A8789879E01275FE6 +:101790003F4FA501CD0109958B859C85C81AD90AB3 +:1017A0008415950520F62D853E8537FE2BC060EA11 +:1017B0002AC0816082834D855E8585019201BF01CB +:1017C000C3010E94A209182F2D853E858823D1F0E0 +:1017D000812F61960FB6F894DEBF0FBECDBFDF91AB +:1017E000CF911F910F91FF90EF90DF90CF90BF901E +:1017F000AF909F908F907F906F905F904F903F90B1 +:101800002F90089560E84F2DC3010E948008182F83 +:10181000DFCF1111DDCF2D853E85C9CF8F929F92ED +:10182000AF92BF92CF92EF920F931F931F921F928E +:101830001F930F933F932F934901B12CA12CCC24DC +:10184000C394E12C06E020E80E943E0B0F900F901D +:101850000F900F900F900F901F910F91EF90CF90DE +:10186000BF90AF909F908F9008958F929F92AF926C +:10187000BF92CF92EF92FF920F931F921F92FF920F +:10188000EF923F932F934901B12CA12C22E0C22E5D +:10189000E02E06E020E80E943E0B0F900F900F9084 +:1018A0000F900F900F900F91FF90EF90CF90BF90FF +:1018B000AF909F908F9008958F929F92AF92BF921A +:1018C000CF92DF92EF92FF920F931F921F92DF92BF +:1018D000CF923F932F934901570123E0C22EE02E70 +:1018E00006E020E80E943E0B0F900F900F900F90A3 +:1018F0000F900F900F91FF90EF90DF90CF90BF90DF +:10190000AF909F908F9008958F929F92AF92BF92C9 +:10191000CF92EF920F93CF931F921F921F921F921D +:101920001F921F92912C812CB12CA12CC12CE22E44 +:1019300005E020E00E943E0BC82F6CE271E080E0E1 +:1019400090E00E94D5050F900F900F900F900F9090 +:101950000F908C2FCF910F91EF90CF90BF90AF90C1 +:101960009F908F9008950F931F93CF93DF938A3F9B +:101970003FEF930739F416ED812FDF91CF911F913F +:101980000F910895DC011696ED91FC9117EDEF2B68 +:1019900099F3122F242FEC011A8740E00E946B0666 +:1019A000082F8823B1F0682FCE010E9412070097FC +:1019B00011F3FC011483202F40E060E0CE010E946F +:1019C000840C182F8823C1F2602FCE010E942907B2 +:1019D000D3CF14EDD1CF2F923F924F925F926F925F +:1019E0007F928F929F92AF92BF92CF92DF92EF92AF +:1019F000FF920F931F93CF93DF93CDB7DEB7689716 +:101A00000FB6F894DEBF0FBECDBF1B8A38E03C8B0B +:101A10003CE33D8B8A3F3FEF930709F4E2C0622E1F +:101A2000342E262E7C01DC011696CD90DC90179783 +:101A3000CE01439617969C938E9316971A962C93E5 +:101A40008E010F5F1F4F22E130E040E060E0C701F0 +:101A50000E940E0C782EF701D782C68281115AC0DF +:101A600049845A848B849C84FD81FF8B3E81388F0E +:101A7000670186E5C80ED11C56011E8AD5018D91DD +:101A80009D915D010097B9F4BE89BF5FBE8BB031F7 +:101A9000A9F7F601819191916F01009709F061C05A +:101AA0007394F0E17F12F5CF262D432D622DC701EF +:101AB0000E94B30C2FC0DC01ED91FC910084F185F4 +:101AC000E02D09958111E0CFF501929182918F016E +:101AD000DC01ED91FC910088F189E02D688D09957C +:101AE000882391F2F80180819181DC01ED91FC91D4 +:101AF0000484F585E02DA401B2010995882319F12C +:101B0000062D232D422D6E89C7010E94E008813DDC +:101B100009F4BACF68960FB6F894DEBF0FBECDBFFA +:101B2000DF91CF911F910F91FF90EF90DF90CF90B9 +:101B3000BF90AF909F908F907F906F905F904F90ED +:101B40003F902F900895F80180819181DC01ED9103 +:101B5000FC910684F785E02D6F8909958111D0CF1E +:101B600093CFDC01ED91FC910084F185E02D099586 +:101B7000811196CFF601929182918F01DC01ED9156 +:101B8000FC910088F189E02D688D099581110DC0C7 +:101B9000062D232D422D672DC7010E94E008982FA6 +:101BA000977F913D09F0B6CF7BCFF801808191817D +:101BB000DC01ED91FC910484F585E02DA401B201D6 +:101BC000099581116DCFF80180819181DC01ED9142 +:101BD000FC910684F785E02D6F8909958823C1F271 +:101BE0005FCF86ED97CF8F929F92AF92BF92CF92A9 +:101BF000EF920F931F921F921F921F921F921F929C +:101C0000912C812CB12CA12CC12CE22E09E020E0DA +:101C10000E943E0B0F900F900F900F900F900F901F +:101C20000F91EF90CF90BF90AF909F908F900895BD +:101C30008F929F92AF92BF92CF92DF92EF920F93CB +:101C40001F93CF93DF9300D000D0CDB7DEB76C01E8 +:101C5000590148011C821B821A8219828E010F5F72 +:101C60001F4F9E012D5F3F4F0E942008811109C028 +:101C700049815A816B817C8184019501C6010E9452 +:101C80007C0A0F900F900F900F90DF91CF911F91D2 +:101C90000F91EF90DF90CF90BF90AF909F908F907B +:101CA000089588EF0E94FC07807C8034D1F018F4FE +:101CB000882341F10895803819F0803C09F1089596 +:101CC00088ED0E94FC079091A60181FD11C0923021 +:101CD000F9F061EC88ED0E940D0882E08093A60186 +:101CE000089588ED0E94FC079091A60181FDEFCF39 +:101CF000933071F063EC88ED0E940D0883E0EECF25 +:101D000081E0ECCF61ED88ED0E940D081092A601F4 +:101D10000895AF92BF92CF92DF92EF92FF920F930E +:101D20001F93CF937C0183B1C82FC07285FD0DC076 +:101D300088EC0E94FC0785FF04C0C7010E94510E79 +:101D4000C0E26C2F88EC0E940D088091A6018130C2 +:101D500041F058F0823009F46BC0833069F0C0E084 +:101D60002AC083E18093AB01FACF8091AB01807FE1 +:101D70008031A9F381E1F6CFC1E08091AB01807F92 +:101D80008031C9F40E94D30568537F4F8F4F9F4F16 +:101D90006093A7017093A8018093A9019093AA0171 +:101DA00080E28093AB0180ED0E94FC07682F6F7D7D +:101DB00080ED0E940D08670186E5C80ED11C570111 +:101DC000A6E7AA0EB11C8601F801819191918F01BD +:101DD000009739F0DC01ED91FC910680F781E02D50 +:101DE00009950A151B0581F78091AB01803409F430 +:101DF00067C000F5803209F445C0803309F452C051 +:101E00008131B1F5F8011082D6018D919D916D015E +:101E1000009739F0DC01ED91FC910480F581E02D13 +:101E200009950C151D0581F782E18093AB0120C057 +:101E3000C0E0A3CF813509F456C0803809F466C0EC +:101E40008035B1F488EC0E94FC0786FF11C081E563 +:101E50008093AB010E94D3056C5E7F4F8F4F9F4FE5 +:101E60006093A7017093A8018093A9019093AA01A0 +:101E7000CF911F910F91FF90EF90DF90CF90BF9087 +:101E8000AF9008950E94D3050091A7011091A80179 +:101E90002091A9013091AA01601B710B820B930B59 +:101EA00097FDE6CF80ED0E94FC07682F606280ED11 +:101EB0000E940D0861E088EE0E940D0880E4B5CF15 +:101EC00088EE0E94FC0780FDD3CF60E488EC0E947E +:101ED0000D0888ED0E94FC07682F686088ED0E945D +:101EE0000D0880E5A2CF0E94D3050091A7011091B3 +:101EF000A8012091A9013091AA01601B710B820BEE +:101F0000930B97FDB5CF80E88093AB012C2F40E079 +:101F100060E0C7010E94EB0C882329F0823D09F4A0 +:101F2000A7CF80EA82CF80E980CF80E0089580E06B +:101F3000089581E00895FC018285089581E069306B +:101F400009F080E00895CF93DF93EC018A819B81B3 +:101F5000DC01ED91FC910480F581E02D6A85099505 +:101F60008A85813439F4EA81FB81EA58FF4F808108 +:101F70008B7F80831A861B861C861D861E861F8685 +:101F8000188A80E0DF91CF9108958F929F92AF924F +:101F9000BF92CF92EF920F93B22EA42E1F921F9258 +:101FA0001F921F921F921F92912C812CC12CE62E02 +:101FB00001E023E240E0FC016285828193810E947E +:101FC0003E0B0F900F900F900F900F900F900F916E +:101FD000EF90CF90BF90AF909F908F9008958F9289 +:101FE0009F92AF92BF92CF92EF920F93A62EB12CF9 +:101FF0001F921F923F932F935F934F934A01C12CDF +:10200000E12C00E023EA40E0FC01628582819381BB +:102010000E943E0B0F900F900F900F900F900F901B +:102020000F91EF90CF90BF90AF909F908F900895B9 +:102030008F929F92AF92BF92CF92EF920F93B22E58 +:10204000A42E1F921F921F921F921F921F92912CDB +:10205000812CC12CE62E03E023E240E0FC016285E6 +:10206000828193810E943E0B0F900F900F900F90F2 +:102070000F900F900F91EF90CF90BF90AF909F90E7 +:102080008F9008952F923F924F925F926F927F921E +:102090008F929F92AF92BF92CF92DF92EF92FF9278 +:1020A0000F931F93CF93DF93CDB7DEB7E8970FB6AB +:1020B000F894DEBF0FBECDBFDC011A963C9119ED3E +:1020C000311169C0122F242E362E3C01FC01C28032 +:1020D000D380D601ED91FC910190F081E02D60E07C +:1020E000C60109957C01009709F40BC1FC01A08091 +:1020F000B180A114B10409F406C14301F4E08F0ECC +:10210000911CDC0111969C928E9214961C93FE01F8 +:1021100031962F018F0128E030E040E060E0D301EC +:1021200012968D919C910E940E0C182FF70114822B +:102130008111EBC08D8111ED893069F50981D601DE +:10214000ED91FC910280F381E02D222D41E0632D81 +:10215000C6010995F301828714ED8823E1F0988583 +:102160009583282F40E060E0828193810E94840C57 +:10217000182FD701AD92BC92882339F1D601ED9189 +:10218000FC910480F581E02DD3011A966C91C60173 +:102190000995F3011286812FE8960FB6F894DEBFF9 +:1021A0000FBECDBFDF91CF911F910F91FF90EF90A8 +:1021B000DF90CF90BF90AF909F908F907F906F9067 +:1021C0005F904F903F902F900895011179C0940136 +:1021D00042E0F3016285828193810E949A07182F61 +:1021E0008111D9CF1F921F925F924F921F9288E068 +:1021F0008F9388E0882E912CB12CA12C99E2C92EC6 +:10220000E12C06E020EA40E0F301628582819381BF +:102210000E943E0B182F0F900F900F900F900F9071 +:102220000F908111B8CF8B81D3011B968C931B9794 +:10223000720100E028E030E040E01A966C911A97B5 +:1022400012968D919C910E94350C182F8111A3CF6D +:102250002B813C8140E0F3016285828193810E9461 +:10226000350C182F811197CF298130E0CE0181964E +:102270007C0140E0D3011A966C911A9712968D91C9 +:102280009C910E94350C182F811185CF2E8140E042 +:10229000F3016285828193810E94F30D182F8111D1 +:1022A0007ACF01E0D3011B968C911B978017E0F049 +:1022B00020E0402F68E0C3010E9418100F5FF2CFAA +:1022C000013208F000E2202F30E0820140E0D3012B +:1022D0001A966C911A9712968D919C910E940E0CF1 +:1022E000182F811158CF73CF1296ED91FC9113974F +:1022F000EA58FF4F80818460808381E050968C9300 +:102300004ACF16ED48CF17ED46CFB182A08243CF1A +:10231000CF92DF92FF920F931F93CF93DF9300D062 +:1023200000D0CDB7DEB78C01F62E19821A821B823F +:102330001C8220E0462F61E10E94C50F20E04F2D56 +:1023400060E1C8010E94C50F20E04F2D64E0C80184 +:102350000E94181083E0C82ED12C9E012F5F3F4FA2 +:1023600044E050E06F2DC8010E94EF0F811114C0AE +:1023700089819A81AB81BC819D7F83309140A0414E +:10238000B10551F064E670E080E090E00E94D50570 +:1023900081E0C81AD10809F720E04F2D64E1C80197 +:1023A0000E94C50F20E04F2D60E1C8010E94C50FBB +:1023B00064E170E080E090E00E94D5050F900F90FE +:1023C0000F900F90DF91CF911F910F91FF90DF90B1 +:1023D000CF900895FC0182E391E091838083738321 +:1023E0006283108A148288E085839CE3968391E05F +:1023F0009783808784E081871286138614861586EA +:102400001686178661157105B1F0DB01AA5ABF4F18 +:1024100090E080E02D913D91232B49F4DC019B96C7 +:10242000AA0FBB1FA60FB71FED93FC93089501964B +:102430008031910579F70895EF92FF921F93CF9322 +:10244000DF93EC01162F7A01FA0180819181A2813C +:10245000B3818130F3E09F07F1E0AF07B105D9F117 +:1024600070F48115E1E09E07AE07B10509F453C091 +:1024700081309140A140B10571F180E046C08330C8 +:1024800021E0920720E1A207B10529F083309340B3 +:10249000A041B10591F720E0412F64E1CE010E94F7 +:1024A000C50F20E0412F60E1CE010E94C50F64E11D +:1024B00070E080E090E00E94D5056A85F7012181F7 +:1024C000269521706770412F8A819B810E94EB0CB9 +:1024D0001092AC01D2CF8091AC018111CECF20E01F +:1024E000412F61E1CE010E94C50F20E0412F60E144 +:1024F000CE010E94C50F20E0412F64E0CE010E9472 +:10250000181081E08093AC0181EBDF91CF911F9196 +:10251000FF90EF90089520E0462F61E1CE010E94E8 +:10252000C50F20E0412F60E1CE010E94C50F10923F +:10253000AC016A8567701770660F660F660F612BB6 +:102540008A819B810E94B60798CFCF92DF92EF924B +:10255000FF920F931F93CF93DF93CDB7DEB72E97E4 +:102560000FB6F894DEBF0FBECDBF6C0181E090E0E6 +:102570009E878D87E12C8E010F5F1F4F9E01235F89 +:102580003F4F41E0F6016285828193810E94180EDF +:10259000082F811123C082E0F82E11E089818F215C +:1025A00069F119861A861B861C869E01275F3F4F9C +:1025B00044E050E0612FC6010E94EF0FE82E811128 +:1025C0001DC0AE01475F5F4F612FC6010E941C1204 +:1025D000813B19F0882391F0E82E0E2D802F2E9646 +:1025E0000FB6F894DEBF0FBECDBFDF91CF911F9124 +:1025F0000F91FF90EF90DF90CF900895FF0C1F5F39 +:10260000183061F611E0F6018385811738F31986D9 +:102610001A861B861C869E01275F3F4F44E050E0D0 +:10262000612FC6010E94EF0FF82E811117C0898516 +:102630009A85877091708130914081F48B859C855B +:1026400081609C878B87AE01475F5F4F612FC6011A +:102650000E941C12813B29F0811102C01F5FD3CF61 +:10266000F82E0F2DBBCF0F931F93CF93DF93FC0159 +:102670002089211107C010E0812FDF91CF911F9198 +:102680000F910895EC010E94D3050C851D852E85C0 +:102690003F85601B710B820B930B97FDECCFCE0136 +:1026A0000E94A512182F0E94D3056C597F4F8F4F9F +:1026B0009F4F6C877D878E879F87DECFFB010190C0 +:1026C0000020E9F73197AF01461B570BDC01ED9174 +:1026D000FC910280F381E02D0994EF92FF920F9319 +:1026E0001F93CF93DF938C017B01D0E0C0E0F70113 +:1026F000EC0FFD1F6491662361F0D801ED91FC9110 +:102700000190F081E02DC8010995892B11F02196E7 +:10271000EECFCE01DF91CF911F910F91FF90EF90FF +:1027200008956115710511F00C945E1390E080E03E +:102730000895DC01ED91FC910190F081E02D099468 +:1027400064E471E00C945E130F931F93CF93DF93B7 +:10275000EC010E946D138C01CE010E94A013800F2A +:10276000911FDF91CF911F910F9108958F929F92AA +:10277000AF92BF92EF92FF920F931F93CF93DF938D +:10278000CDB7DEB7A1970FB6F894DEBF0FBECDBFB1 +:102790007C01FA01CB0119A2223008F42AE08E0153 +:1027A0000F5D1F4F822E912CB12CA12CBF01A501D2 +:1027B00094010E94D724F901CA016A3008F5605DCE +:1027C000D8016E938D01232B242B252B79F790E0D4 +:1027D00080E0109721F0BD01C7010E945E13A19611 +:1027E0000FB6F894DEBF0FBECDBFDF91CF911F9122 +:1027F0000F91FF90EF90BF90AF909F908F900895B2 +:10280000695CDECFCF92DF92EF92FF920F931F931E +:10281000CF93DF932115310581F4DC01ED91FC911B +:102820000190F081E02D642FDF91CF911F910F91E6 +:10283000FF90EF90DF90CF9009942A30310501F599 +:102840002AE077FF1DC06A017B01EC016DE20E9466 +:1028500099138C0144275527BA014C195D096E095B +:102860007F092AE0CE010E94B613800F911FDF91ED +:10287000CF911F910F91FF90EF90DF90CF9008952F +:10288000DF91CF911F910F91FF90EF90DF90CF904C +:102890000C94B6139A01AB01770F660B770B0C946F +:1028A00002142115310541F4DC01ED91FC910190F8 +:1028B000F081E02D642F09940C94B6139A01462FF1 +:1028C00050E070E060E00C945114CF93C82F803139 +:1028D00030F46EE278E082E591E00E946D1340E111 +:1028E00050E06C2F82E591E0CF910C945E14CF9272 +:1028F000DF92EF92FF920F931F93CF93DF936B01C1 +:1029000079018A01D0E0C0E0CC15DD05F1F0F701D6 +:10291000808191818C0F9D1F9C012F703327232B69 +:1029200069F067E471E082E591E00E949113F8019B +:1029300081918F010E9465142196E6CF892BB9F30E +:1029400082E591E00E94A013F2CFDF91CF911F9119 +:102950000F91FF90EF90DF90CF900895CF93C82F05 +:10296000892F0E9465148C2FCF910C946514CF93FE +:10297000C62FBC0182E591E00E946D138C2F0E944E +:10298000651482E591E0CF910C94A013CF93DF936F +:10299000EB01BC0182E591E00E946D13CE010E9423 +:1029A000AE1482E591E0DF91CF910C94A013682FD3 +:1029B00086E298E00C94B714DF92EF92FF920F93A7 +:1029C0001F93CF93DF937C01D42E8B01D0E0C0E026 +:1029D000CE15DF050CF5CE018F709927892B69F094 +:1029E00067E471E082E591E00E949113F801819122 +:1029F0008F010E9465142196EBCF209721F082E58C +:102A000091E00E94A013DD2089F362E278E082E584 +:102A100091E00E946D13EACF82E591E0DF91CF91C2 +:102A20001F910F91FF90EF90DF900C94A013CF9324 +:102A3000DF93EC0168E078E082E591E00E946D139D +:102A400089810E946514688181E098E00E94B71432 +:102A5000888140E0BE0190E0DF91CF910C94DC14BE +:102A6000CF93DF93EC01688186EF97E00E94B71463 +:102A7000698184EE97E00E94B7146A817B8189EDB9 +:102A800097E00E94C6146C8189EC97E00E94B7140D +:102A90006D8187EB97E00E94B7146E8185EA97E01D +:102AA0000E94B7146F8183E997E00E94B71468858C +:102AB000798587E897E00E94C6146A857B858AE756 +:102AC00097E00E94C6146C857D858DE697E00E9494 +:102AD000C6146E858CE597E00E94B7146F8580E57B +:102AE00097E00E94B71468898FE397E00E94B714BB +:102AF00069898AE297E0DF91CF910C94B714CF9364 +:102B0000DF93EC0168818FE197E00E94B71469813F +:102B10008DE097E00E94B7146A817B818DEF96E08B +:102B20000E94C6146C818BEE96E00E94B7146D81F2 +:102B300085ED96E00E94B7146E8183EC96E00E94CA +:102B4000B7146F8183EB96E00E94B714688586EA1C +:102B500096E0DF91CF910C94B714CF93DF93EC0103 +:102B600068818BE996E00E94B714698189E896E054 +:102B70000E94B7146A8186E796E00E94B7146B81C1 +:102B800086E696E00E94B7146C817D8184E596E02C +:102B90000E94C6146E8187E496E0DF91CF910C9479 +:102BA000B714CF93DF93EC0168818CE396E00E9429 +:102BB000B71469818AE296E00E94B7146A8187E1BE +:102BC00096E00E94B7146B8183E096E00E94B714F0 +:102BD0006C8182EF95E00E94B7146D8180EE95E0E4 +:102BE0000E94B7146E818BEC95E00E94B7146F8140 +:102BF00086EB95E00E94B714688588EA95E0DF913E +:102C0000CF910C94B7140F931F93CF93DF93EC01E4 +:102C100068818DE995E00E94B71469818BE895E0A1 +:102C20000E94B7146A817B8180E895E00E94C614F7 +:102C30006C8180E795E00E94B7146D818EE595E088 +:102C40000E94B7148E010A5F1F4F2881C8018C1B98 +:102C50009D0B2817190689F084F0F801608180E542 +:102C600095E00E94B714F801618170E08CE395E073 +:102C70000E94C6140D5F1F4FE8CFDF91CF911F91C7 +:102C80000F910895FF920F931F93CF93DF93EC0161 +:102C900008811981FA806FE175E082E591E00E9478 +:102CA0006D1381E0F81230C067E175E082E591E0D4 +:102CB0000E94A413602F8CE095E00E94B714612F4E +:102CC0008AEF94E00E94B71461E085EE94E00E94E0 +:102CD000B7146B817C818AED94E00E94C6146D81EB +:102CE0008DEC94E00E94B7146E817F818DEB94E0AF +:102CF0000E94C61468858FEA94E0DF91CF911F91FE +:102D00000F91FF900C94B714CE01DF91CF911F91DA +:102D10000F91FF900C941715FF920F931F93CF9371 +:102D2000DF93EC0108811981FA8061E974E082E5A2 +:102D300091E00E946D1382E0F81669F183E0F816C5 +:102D400009F452C081E0F81281C069E874E082E5BC +:102D500091E00E94A413602F8EE794E00E94B714C4 +:102D6000612F8CE694E00E94B71461E087E594E05F +:102D70000E94B7146B817C818CE494E00E94C6149D +:102D80006D817E818CE394E0DF91CF911F910F9153 +:102D9000FF900C94C61463E374E082E591E00E9416 +:102DA000A413602F88E294E00E94B714612F86E19B +:102DB00094E00E94B71462E081E094E00E94B714AE +:102DC0006B8184EF93E00E94B7146C8189EE93E0ED +:102DD0000E94B7146D818FED93E0DF91CF911F9129 +:102DE0000F91FF900C94B71465ED73E082E591E0CC +:102DF0000E94A413602F8AEC93E00E94B714612F05 +:102E000088EB93E00E94B71463E083EA93E00E94AA +:102E1000B7146B8186E993E00E94B7146C818BE84C +:102E200093E00E94B7146D818BE793E00E94B71482 +:102E30006E818DE693E00E94B7146F818EE593E07A +:102E40000E94B714688584E593E0C7CFCE01DF9177 +:102E5000CF911F910F91FF900C941715FF920F9334 +:102E60001F93CF93DF93EC0108811981FA8066E309 +:102E700073E082E591E00E946D1381E0F81224C0B6 +:102E80006DE273E082E591E00E94A413602F82E27C +:102E900093E00E94B714612F80E193E00E94B71481 +:102EA00061E08BEF92E00E94B7146B8189EE92E0B3 +:102EB0000E94B7146C8188ED92E0DF91CF911F9151 +:102EC0000F91FF900C94B714CE01DF91CF911F9119 +:102ED0000F91FF900C9417158F929F92AF92BF9213 +:102EE000CF92EF920F931F93CF93DF93CDB7DEB7BF +:102EF000C054D1090FB6F894DEBF0FBECDBF1F93EB +:102F00000F93FE013196FF93EF931F9250E45F936E +:102F100049015B0122E2C22EE42E06E021E840E0F6 +:102F2000FC0162818BED93E00E943E0B182F82E53D +:102F300091E00E94A0130F900F900F900F900F90B0 +:102F40000F90112319F0812F0E94D714812FC05C9C +:102F5000DF4F0FB6F894DEBF0FBECDBFDF91CF912C +:102F60001F910F91EF90CF90BF90AF909F908F9057 +:102F700008952E988EBD0DB407FEFDCF1EBC0DB476 +:102F800007FEFDCF0E94FA078EB508952E98826045 +:102F90008EBD0DB407FEFDCF6EBD0DB407FEFDCF97 +:102FA0000C94FA070F931F93CF93DF938C01269A0B +:102FB0000E94FA07219A229A2398209A80E58CBDD4 +:102FC00081E08DBD259868E188E80E94C61760E21F +:102FD00088E70E94C61760E088E70E94C617D0E025 +:102FE000C0E088E60E94B917219680FF22C061ECFC +:102FF00088ED0E94C61760E280ED0E94C61764E06B +:1030000088EE0E94C61788EE0E94B91782FFFBCF98 +:10301000C8010E94510E60E288EC0E94C61761E070 +:1030200080E80E94C61780E0DF91CF911F910F9139 +:103030000895CF3FDC07A9F68FEFF6CF40E052ECC2 +:1030400061E070E082E591E00E94BB0582E591E0DD +:103050000E94BC058823D1F36BEC70E082E591E01F +:103060000E94A4138BED93E00E94D2178F3F31F49E +:1030700068EB70E082E591E00E94A41368EC70E0D8 +:1030800080E090E00C94D5058BED93E00E944B0717 +:103090006BED73E08AEC93E00E94EA116BED73E054 +:1030A00089EB93E00C94EA113F924F925F926F92FA +:1030B0007F928F929F92AF92BF92CF92DF92EF92C8 +:1030C000FF920F931F93CF93DF93CDB7DEB7DA95BF +:1030D0000FB6F894DEBF0FBECDBF662311F1162FD9 +:1030E0004C0180EBA82E81E0B82E96EB492E91E0A2 +:1030F000592EF501E080F180E114F10491F09E0178 +:103100002F5F3F4F6901012F21E030E040E0F401E3 +:1031100062818BED93E00E945C0C8823D1F00E94C9 +:10312000D714D3950FB6F894DEBF0FBECDBFDF9195 +:10313000CF911F910F91FF90EF90DF90CF90BF90B4 +:10314000AF909F908F907F906F905F904F903F9047 +:1031500008953980F501E080F180632C712C9E0187 +:103160002F5F3F4F6901930140E0F40162818BEDD5 +:1031700093E00E945C0C8111D2CF61ED72E082E598 +:1031800091E00E946D134AE050E0612F82E591E0EA +:103190000E945E146FEC72E082E591E00E946D1374 +:1031A000F501808191810E94AE146BEC72E082E5A2 +:1031B00091E00E946D13632D85EC92E00E94B7149C +:1031C000898141E0BE016F5F7F4F90E00E94DC1477 +:1031D00061EC72E082E591E00E946D1302E0802FC5 +:1031E00090E09C012F5F3F4F261537057CF541E0AD +:1031F00050E04C0F5D1F240F351FF9012081222361 +:1032000059F06EE282E591E00E949B056EE282E554 +:1032100091E00E949B0516C021E030E02C0F3D1F7D +:10322000820F931FFC01608180EE860F8F3560F462 +:1032300082E591E00E949B05F501808191818930B2 +:10324000944021F70E5FCBCF6EE2F2CF82E591E0A2 +:103250000E94A01322E0A20EB11C4A145B0409F0E4 +:1032600048CF5FCF2F923F924F925F926F927F92A3 +:103270008F929F92AF92BF92CF92DF92EF92FF9286 +:103280000F931F93CF93DF9300D000D0CDB7DEB75D +:103290004C015C834B83312C512C412C212C9B0104 +:1032A00027543E4F3A8329838B819C81E981FA819F +:1032B0008E179F0708F0E0C0FC018181853009F47A +:1032C00065C058F4823009F44FC0843009F469C0F5 +:1032D0008B819C810E94171551C0843209F4A8C0CB +:1032E000853209F4BCC0813299F765E772E082E566 +:1032F00091E00E94A4138B819C810E940316CB80D5 +:10330000DC80F12CE12C622C712CEB81FC8185811D +:103310008E151F0499F194F1F6018681823209F02D +:103320007FC0A780B12C69E672E082E591E00E943F +:103330006D134AE050E0B70182E591E00E944A1423 +:10334000B5018CE592E00E94C61400E011E0950101 +:103350004E2DB301C4010E946C17FFEFEF1AFF0A54 +:1033600023E0C20ED11CD1CF64EB72E082E591E084 +:103370000E94A4138B819C810E947F15EB81FC81AC +:103380008081E80FF11DFC83EB838ECF65EA72E04C +:1033900082E591E00E94A4138B819C810E94AD156F +:1033A000EDCFEB81FC81228045805680378066E935 +:1033B00072E082E591E00E946D134AE050E0622DD8 +:1033C00082E591E00E945E1464E972E082E591E09A +:1033D0000E946D134AE050E0EB81FC81638182E53D +:1033E00091E00E945E1462E972E082E591E00E9441 +:1033F000A4138B819C810E94D115EB81FC81808577 +:10340000882309F4BBCF60E872E082E591E00E9476 +:103410006D13EB81FC816085C4010E945418AECF0E +:10342000EB81FC8166818DE392E00E94B71495CF19 +:1034300031E043124DCF531208C0311049CF8B8178 +:103440009C810E944216452C99CF83E0581240CFB0 +:1034500031103ECF8B819C810E948C168FCF91E0E2 +:10346000491236CFE3E05E1233CF311031CF8B817A +:103470009C810E942E1782CF0F900F900F900F907B +:10348000DF91CF911F910F91FF90EF90DF90CF9040 +:10349000BF90AF909F908F907F906F905F904F9074 +:1034A0003F902F900895AF92BF92CF92DF92EF920C +:1034B000FF920F93CF93DF936C01D62FC0E0CD170F +:1034C00009F478C061E372E082E591E00E946D1337 +:1034D0004AE050E06C2F82E591E00E945E1469E2C0 +:1034E00072E082E591E00E946D1329EBE22E21E06B +:1034F000F22E0C2F29E030E040E0F60162818BEDE6 +:1035000093E00E94350C811156C06091BB0170910F +:10351000BC0183E292E00E94C614A090BB01B0906F +:10352000BC01F1E0AF16F2E0BF0618F0A12C92E06A +:10353000B92E89EBE82E81E0F82E0C2F950140E0A2 +:10354000F60162818BED93E00E94350C811133C04E +:1035500040E0B701C5010E94DC148091BB0190914D +:10356000BC018130924030F06DE072E082E591E084 +:103570000E94A4138091BF01882359F067EF71E086 +:1035800082E591E00E946D136091BF01C6010E9427 +:1035900054182091BE0140E0F60162818BED93E06A +:1035A0000E94F30D49EB51E0B501C6010E943219AA +:1035B000CF5F85CF80E0DF91CF910F91FF90EF90AB +:1035C000DF90CF90BF90AF9008957F928F929F929F +:1035D000AF92BF92CF92DF92EF92FF920F931F9321 +:1035E000CF93DF93CDB7DEB728970FB6F894DEBF41 +:1035F0000FBECDBF5C011092B1011092B0011092CC +:10360000B3011092B2011092B5011092B401DC0125 +:1036100012968C9162EC71E086FD9BC082E591E090 +:103620000E94A01306E410E06FE282E591E00E94A0 +:103630009B0501501109C1F76FEA71E082E591E045 +:103640000E94A413F501628182EA91E00E94B714FE +:10365000D50114966C9184E991E00E94B71409EBAE +:1036600011E022E130E040E0F50162818BED93E072 +:103670000E940E0C882319F00E94D7145BC0709032 +:10368000CA011092B6018091C0018093B7018CE30A +:103690008093B801E091DB03F091DC030190F081AD +:1036A000E02DD50112966C918BED93E0099526EBF8 +:1036B00031E0FC013183208361E871E082E591E033 +:1036C0000E94A41340E069EB71E082E190E00E9467 +:1036D000DC1464E771E082E591E00E94A41389EBB9 +:1036E00091E00E9430158091C701811109C080913D +:1036F000C801811105C08091C901882309F4ABC0BC +:10370000CE0101966C01F12CE12C00E024E030E0C8 +:1037100040E0D50112966C918BED93E00E945C0C19 +:10372000882379F10E94D714672DC5010E94531A8E +:103730008111A2CFE091DB03F091DC030480F581DD +:10374000E02DD50112966C918BED93E0099561ED1A +:1037500070E082E591E00E94A41328960FB6F894D9 +:10376000DEBF0FBECDBFDF91CF911F910F91FF90B4 +:10377000EF90DF90CF90BF90AF909F908F907F9011 +:1037800008951981193008F018E0812E912CFE015E +:1037900031966F01F12CE12C00E0940140E0D5015D +:1037A00012966C918BED93E00E945C0C8111BACF64 +:1037B00061E671E082E591E00E946D13612F8BE577 +:1037C00091E00E94B714898141E0BE016F5F7F4F95 +:1037D00090E00E94DC146FE471E082E591E00E94C9 +:1037E0006D137401B2E0EB1AF108F7FE04C0740126 +:1037F000E1E0EE1AF108F594E7948E010F5F1F4F98 +:1038000090EB892E91E0992ED12CC12CCE14DF049F +:10381000F4F4C114D10431F06CE471E082E591E07C +:103820000E946D13FFEFCF1ADF0AD80113968C9117 +:10383000139712969C91892798278927F4018193E1 +:1038400091934F010E94AE140E5F1F4FDFCF82E5B0 +:1038500091E00E94A0138091C701882359F067E38B +:1038600071E082E591E00E946D136091C701C5018E +:103870000E9454188091C801882359F067E271E0D2 +:1038800082E591E00E946D136091C801C5010E941C +:1038900054188091C901882309F446CF62E171E090 +:1038A00082E591E00E946D136091C901C5010E94FB +:1038B00054183ACFAF92BF92CF92DF92EF92FF921D +:1038C0000F931F93CF93DF938BED93E00E94890EAC +:1038D0008BED93E00E947B079091AF01891779F0FF +:1038E0008BED93E00E947B078093AF018BED93E01B +:1038F0000E947B07682F8CEA90E00E94B7148BED42 +:1039000093E00E947B07803909F04CC0E091DB0313 +:10391000F091DC030190F081E02D60E08BED93E00D +:1039200009956C0110E000E0EE24E394F12CC1E075 +:10393000D0E0F6018281811102C0D0E0C0E05E01DA +:10394000002E02C0AA0CBB1C0A94E2F7E701002E6D +:1039500002C0CC0FDD1F0A94E2F78091AD01909177 +:10396000AE018C239D238A159B05A1F0A114B104FF +:1039700019F0C6010E94E51AC095D0958091AD015D +:103980009091AE01C823D923CA29DB29D093AE0177 +:10399000C093AD010F5F1F4FF5E0CF0ED11C00317A +:1039A000110529F6DF91CF911F910F91FF90EF90B4 +:1039B000DF90CF90BF90AF90089508950895CF9372 +:1039C000C0915404C1110BC00E943906643C794077 +:1039D0008105910520F081E080935404C1E08C2F93 +:1039E000CF910895FF920F931F93CF93DF93D82F1A +:1039F0000FB607FE46C080915C05843079F0809157 +:103A0000050190E001962091070130E08223932385 +:103A1000209106012817190609F0D0C00E94DF1C6A +:103A200081110FC08091050190E00196209107015E +:103A300030E082239323209106012817190609F00C +:103A4000BDC00E942D068C01C091E900CF7080910D +:103A5000EC0080FD37C080E0C82B81E08093E90056 +:103A600085E0F82E8091EB0085FD08C08091EB0089 +:103A700080FF04C08091EE0087FD44C0CF70C093EA +:103A8000E900E09105018E2F90E001962091070159 +:103A900030E082239323209106012817190609F4A8 +:103AA00086C08091030190910401E80FF92FF11D68 +:103AB000D083809105018F5F9091070189238093C6 +:103AC000050175C080E8C8CFE0910301F0910401C1 +:103AD000E80FF11D90818F5F209107018223809371 +:103AE00006019093F1008091E80085FD0BC0809164 +:103AF000E80080FF07C08091E8008E778093E8009F +:103B0000F09202018091060190910501981759F1F8 +:103B10009091E80095FDD8CF80E02CC01092F10084 +:103B200035C08091050190E001962091070130E0B9 +:103B300082239323209106012817190609F09ECFAE +:103B400080910201882309F499CF0E942D069C01DF +:103B50008017910709F486CF9091020191509093BC +:103B6000020189017FCF8091E80085FFD5CFD093F6 +:103B7000F10081E02091F3009091F200322F292F83 +:103B8000232B79F09091E80090FF0BC09091E80012 +:103B900095FDC4CF9091E8009E779093E800F09255 +:103BA0000201882309F4BDCFCF70C093E90080E003 +:103BB000DF91CF911F910F91FF900895E091050142 +:103BC00070CF089580915B05811104C00E949521FA +:103BD0000C94F221089510925B050895089542E235 +:103BE00061EC81E00C94281F089508950C94F51D54 +:103BF0000E942A2380915A05882329F00E9453238A +:103C000081110C94121F08950C9455230C94041EDA +:103C10000895CF9384B7877F84BF0FB6F894A89593 +:103C200080916000886180936000109260000FBEF8 +:103C300080E890E00FB6F894809361009093610063 +:103C40000FBE82EF9CE10E94252388E091E00E9454 +:103C5000202380E598E00E94EA040E948C050E94DF +:103C600095210E94F22178940E94240680915C059F +:103C7000843009F043C08EE398E00E94EA040E9479 +:103C80008E0580E398E00E94EA04C1E080915C0523 +:103C90008530B9F10E948F052091E4003091E50054 +:103CA00080915204909153042817390779F3809139 +:103CB000E4009091E50090935304809352040E9495 +:103CC000DF1C882319F380915C058430F9F690910C +:103CD000E9009F708091EC0080FD16C080E0892B88 +:103CE000C093E9009091EB0090FF04C09091EE002A +:103CF00097FD28C08F708093E900C8CF0E94081EEE +:103D0000B5CF0E94F81DC2CF80E8E9CFE091030152 +:103D1000F0910401E90FF11D20819F5F30910701AF +:103D20009323909306012093F1009091E80095FD74 +:103D300009C09091E80090FF05C09091E8009E773F +:103D40009093E8009091060120910501291721F038 +:103D50002091E80025FDDACF2091F3009091F20048 +:103D6000322F292F232B31F29091E80090FFC2CF00 +:103D70009091E80095FD06C09091E8009E779093A1 +:103D8000E800B8CF1092F100F3CFE92FFF27E3301E +:103D9000F10521F150F4E130F10591F03297C9F0CD +:103DA000F0E0E0E090E080E00FC0E132F10591F159 +:103DB000E232F105A9F78CEE98E0672B89F704C091 +:103DC000E2E1F0E08AED98E0DA018D939C93CF0177 +:103DD0000895E9E2F0E081EB98E0F6CF9927813091 +:103DE000910589F048F00297D9F6E5E7F8E0E4910B +:103DF000F0E085E798E0E8CFEDEAF8E0E491F0E064 +:103E00008DEA98E0E1CFE3EAF8E0E491F0E083EABC +:103E100098E0DACFE9E0F0E083EC98E0672B09F076 +:103E2000BFCFD2CF80E189BD82E189BD09B400FE58 +:103E3000FDCF8091D8008F7D8093D8008091E000E5 +:103E400082608093E0008091E00081FDFCCF0895C6 +:103E5000982F973028F08F708093E90081E00895C3 +:103E60009093E900242F762F50E0981731F070914D +:103E7000EC002091ED005091F00021FD02C09F5F09 +:103E8000E8CF3091EB003E7F3093EB003091ED00B6 +:103E90003D7F3093ED003091EB0031603093EB00CB +:103EA0007093EC002093ED005093F0002091EE0011 +:103EB00027FDE5CF80E0089580915D0587FF13C061 +:103EC0008091E80082FF06C08091E8008B778093A4 +:103ED000E80004C080915C058111F2CF08958091C3 +:103EE0005C058823D9F38091E80080FFF8CF8091AA +:103EF000E8008E77ECCFFC0180916305909164051A +:103F000086179707A0F06115710529F49091E800D4 +:103F10009E779093E80090E06115710551F491113E +:103F200008C08091E80082FF35C080E00895BC01A0 +:103F3000F2CF80915C058823C9F18530C9F1809169 +:103F4000E80083FD31C08091E80082FDEACF8091D6 +:103F5000E80080FFE1CF2091F3008091F200322F42 +:103F6000282F6115710519F02830310558F091E0BE +:103F70002830310509F090E02091E8002E77209359 +:103F8000E800CACF81918093F100615071092F5FE1 +:103F90003F4FE7CF80915C05882341F0853041F0A9 +:103FA0008091E80083FFBDCF81E0089582E008950D +:103FB00083E00895FC018091630590916405861764 +:103FC0009707A0F06115710529F48091E8008E77BC +:103FD0008093E80090E06115710551F4911108C0DB +:103FE0008091E80082FF36C080E00895BC01F2CFE6 +:103FF00080915C058823D1F18530D1F18091E80072 +:1040000083FD32C08091E80082FDEACF8091E80014 +:1040100080FFE1CF2091F3008091F200322F282F12 +:104020006115710519F02830310558F091E02830FC +:10403000310509F090E08091E8008E778093E800E8 +:10404000CACF84918093F1003196615071092F5F3E +:104050003F4FE6CF80915C05882341F0853041F0E9 +:104060008091E80083FFBCCF81E0089582E008954D +:1040700083E008951F93CF93DF93CDB7DEB7AA9760 +:104080000FB6F894DEBF0FBECDBFEDE5F5E0809131 +:10409000F100819325E0E536F207C9F70E94F41D8F +:1040A0008091E80083FF44C080915D0590915E059A +:1040B0009A3008F03DC0E92FF0E0EF59FF4D0C9425 +:1040C000F9246B209120982091209820EF20112135 +:1040D000982068217521803889F0823849F58091CF +:1040E00061058F70873020F58093E9008091EB00A7 +:1040F00085FB882780F91092E90006C08091590558 +:1041000090915A05911182609091E800977F909369 +:10411000E8008093F1001092F1008091E8008E7722 +:104120002DC0282F2D7F21F48823D1F0823059F122 +:104130008091E80083FF0AC08091E800877F809328 +:10414000E8008091EB0080628093EB00AA960FB6A6 +:10415000F894DEBF0FBECDBFDF91CF911F910895C0 +:1041600080915F05813021F7933009F080E08093E2 +:104170005A051092E9008091E800877F8093E8005B +:104180000E945C1FD5CF80915F058111F2CF809195 +:1041900061058F702FEF280F263050F68093E900CD +:1041A0002091EB0020FFE5CF933031F48091EB00BC +:1041B00080628093EB00DDCF9091EB009061909353 +:1041C000EB0021E030E001C0220F8A95EAF720934E +:1041D000EA001092EA008091EB008860EACF81113A +:1041E000A7CF10915F051F778091E3008078812B26 +:1041F0008093E3008091E800877F8093E8000E942D +:104200005C1F8091E80080FFFCCF8091E300806814 +:104210008093E30083E0111101C082E080935C058C +:1042200087CF8058823008F083CF80915F059091CE +:1042300060058C3D23E09207A1F583E08A838AE242 +:1042400089834FB7F894DE01139620E03EE051E2F7 +:10425000E32FF0E050935700E49120FF03C0E29574 +:10426000EF703F5FEF708E2F90E0EA30C0F0C7969E +:104270008D939D932F5F243159F74FBF8091E800B4 +:10428000877F8093E8006AE270E0CE0101960E9489 +:104290007B1F8091E8008B778093E80049CFC09620 +:1042A000E7CF6091610570916205AE014F5F5F4F8E +:1042B0000E94C51EBC01892B09F43ACF9091E800F9 +:1042C000977F9093E80089819A810E94DA1FE1CF5D +:1042D000803809F02DCF8091E800877F8093E80037 +:1042E000809158058093F10018CF811121CF9091D2 +:1042F0005F05923008F01CCF8091E800877F8093A3 +:10430000E800909358050E945C1F8091580588230F +:1043100031F084E080935C050E94EF1D09CF80910D +:10432000E30087FDF6CF81E0F5CF0E9403220E94D3 +:104330000B22E0EEF0E0808181608083E8EDF0E028 +:1043400080818F77808319BCA7EDB0E08C918E7F40 +:104350008C9380818F7E808310925B0508950F93EC +:104360001F93CF93DF930E9403220E940B22C8ED7C +:10437000D0E088818F77888388818068888388816E +:104380008F7D888319BC10925C051092580510929D +:104390005A051092590500EE10E0F80180818B7FDC +:1043A000808388818160888342E060E080E00E94B1 +:1043B000281FE1EEF0E080818E7F8083E2EEF0E066 +:1043C000808181608083808188608083F801808122 +:1043D0008E7F8083888180618883DF91CF911F9158 +:1043E0000F910895E8EDF0E080818F7E8083E7ED06 +:1043F000F0E080818160808384E082BF81E08093EF +:104400005B050C94AF21E8EDF0E080818E7F808326 +:104410001092E20008951092DA001092E1000895DF +:104420001F920F920FB60F9211242F933F934F9329 +:104430005F936F937F938F939F93AF93BF93EF930C +:10444000FF938091E10082FF0BC08091E20082FF28 +:1044500007C08091E1008B7F8093E1000E941F23C1 +:104460008091DA0080FF19C08091D80080FF15C0CC +:104470008091DA008E7F8093DA008091D90080FFEE +:1044800094C080E189BD82E189BD09B400FEFDCF01 +:1044900081E080935C050E94E21D8091E10080FF35 +:1044A00019C08091E20080FF15C08091E2008E7FEC +:1044B0008093E2008091E20080618093E20080912D +:1044C000D80080628093D80019BC85E080935C0599 +:1044D0000E94F61D8091E10084FF29C08091E200D6 +:1044E00084FF25C080E189BD82E189BD09B400FE59 +:1044F000FDCF8091D8008F7D8093D8008091E1001E +:104500008F7E8093E1008091E2008F7E8093E200B5 +:104510008091E20081608093E200809158058823B9 +:1045200009F449C084E080935C050E94061E8091D6 +:10453000E10083FF29C08091E20083FF25C08091C4 +:10454000E100877F8093E10082E080935C05109218 +:1045500058058091E1008E7F8093E1008091E20018 +:104560008E7F8093E2008091E20080618093E20080 +:1045700042E060E080E00E94281F8091F0008860A7 +:104580008093F0000E94EE1DFF91EF91BF91AF91DB +:104590009F918F917F916F915F914F913F912F915B +:1045A0000F900FBE0F901F90189519BC10925C05CC +:1045B0000E94EB1D72CF8091E30087FD02C081E075 +:1045C000B2CF83E0B0CF1F920F920FB60F9211249B +:1045D0002F933F934F935F936F937F938F939F930B +:1045E000AF93BF93CF93EF93FF93C091E900CF7048 +:1045F0008091EC001092E9008091F000877F809319 +:10460000F00078940E943A201092E9008091F00026 +:1046100088608093F000C093E900FF91EF91CF9103 +:10462000BF91AF919F918F917F916F915F914F91CA +:104630003F912F910F900FBE0F901F9018950895E6 +:10464000909356058093550508959093510180935A +:104650005001089580915C05843021F11092570536 +:1046600088E190E020E40FB6F894A895809360006C +:104670000FBE2093600083B7817F846083BF83B7C0 +:10468000816083BF7894889583B78E7F83BF0FB690 +:10469000F894A895809160008861809360001092E2 +:1046A00060000FBE089580E0089508951F920F9254 +:1046B0000FB60F9211248F939F93AF93BF93809166 +:1046C0005705811113C08091A2019091A301A0917F +:1046D000A401B091A5014196A11DB11D8093A20135 +:1046E0009093A301A093A401B093A501BF91AF91B2 +:1046F0009F918F910F900FBE0F901F9018950E9461 +:10470000F02308F481E008950E94442488F09F5724 +:1047100098F0B92F9927B751B0F0E1F0660F771FE5 +:10472000881F991F1AF0BA95C9F714C0B13091F0DB +:104730000E945E24B1E008950C945E24672F782FC8 +:104740008827B85F39F0B93FCCF3869577956795A0 +:10475000B395D9F73EF490958095709561957F4F0C +:104760008F4F9F4F0895E89409C097FB3EF49095B2 +:104770008095709561957F4F8F4F9F4F9923A9F03A +:10478000F92F96E9BB279395F695879577956795C9 +:10479000B795F111F8CFFAF4BB0F11F460FF1BC00D +:1047A0006F5F7F4F8F4F9F4F16C0882311F096E9A0 +:1047B00011C0772321F09EE8872F762F05C066234E +:1047C00071F096E8862F70E060E02AF09A95660F07 +:1047D000771F881FDAF7880F9695879597F90895C0 +:1047E000990F0008550FAA0BE0E8FEEF1616170602 +:1047F000E807F907C0F012161306E407F50798F06A +:10480000621B730B840B950B39F40A2661F0232B82 +:10481000242B252B21F408950A2609F4A140A695FE +:104820008FEF811D811D089597F99F6780E870E0E3 +:1048300060E008959FEF80EC089500240A94161616 +:10484000170618060906089500240A94121613067E +:10485000140605060895092E0394000C11F488230C +:1048600052F0BB0F40F4BF2B11F460FF04C06F5F28 +:104870007F4F8F4F9F4F089557FD9058440F551FFE +:1048800059F05F3F71F04795880F97FB991F61F0D2 +:104890009F3F79F087950895121613061406551F49 +:1048A000F2CF4695F1DF08C0161617061806991FB5 +:1048B000F1CF86957105610508940895E894BB27AA +:1048C00066277727CB0197F908950E94F02308F413 +:1048D0008FEF08950E947D240C942B240E941D24A8 +:1048E00038F00E94242420F0952311F00C94142415 +:1048F0000C941A2411240C945F240E943C2470F31D +:10490000959FC1F3950F50E0551F629FF001729F74 +:10491000BB27F00DB11D639FAA27F00DB11DAA1F83 +:10492000649F6627B00DA11D661F829F2227B00DD0 +:10493000A11D621F739FB00DA11D621F839FA00D5B +:10494000611D221F749F3327A00D611D231F849FAB +:10495000600D211D822F762F6A2F11249F57504002 +:104960009AF0F1F088234AF0EE0FFF1FBB1F661F7D +:10497000771F881F91505040A9F79E3F510580F046 +:104980000C9414240C945F245F3FE4F3983ED4F31A +:10499000869577956795B795F795E7959F5FC1F7EA +:1049A000FE2B880F911D9695879597F90895A1E2A2 +:1049B0001A2EAA1BBB1BFD010DC0AA1FBB1FEE1F99 +:1049C000FF1FA217B307E407F50720F0A21BB30BE4 +:1049D000E40BF50B661F771F881F991F1A9469F760 +:1049E00060957095809590959B01AC01BD01CF01BC +:1049F0000895EE0FFF1F0590F491E02D0994F894AF +:024A0000FFCFE6 +:104A02004D010555040000FF00000000DD1CDE1C06 +:104A1200E11D000000009B05A10598059105920586 +:104A2200950595050000000012076B062907000096 +:104A320000004210950FA30F33139B0F8811970F9D +:104A42009E0F990F0D0A002000000000007714004D :00000001FF diff --git a/converter/usb_desc_dump/desc_dump.cpp b/converter/usb_desc_dump/desc_dump.cpp deleted file mode 100644 index 0991a65a..00000000 --- a/converter/usb_desc_dump/desc_dump.cpp +++ /dev/null @@ -1,340 +0,0 @@ -/* -Copyright 2021 Jun Wako - -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. -*/ -/* - * USB Host Shield HID keyboards - */ -#include "Usb.h" -#include "usbhub.h" -#include "usbhid.h" - -#include "timer.h" -#include "matrix.h" -#include "keymap.h" -#include "hook.h" -// This should be placed after Host Shield lib headers to override -#include "print.h" - - -#define AUDIO_CLASS_INTERFACE 0x24 -#define AUDIO_CLASS_ENDPOINT 0x25 - - -USB Usb; -USBHub hub1(&Usb); - -#define BUF_SIZE 512 -uint8_t buf[BUF_SIZE]; -uint16_t langid = 0; -EpInfo epInfo[1]; - - -void printHEX(uint8_t hex) -{ - xprintf("%02X", hex); -} - -void printHEX(uint16_t hex) -{ - xprintf("%02X", hex>>8); - xprintf("%02X", hex); -} - -void printVal(const char* name, uint8_t hex) -{ - xprintf("%s:%02X\r\n", name, hex); -} - -void printVal(const char* name, uint16_t hex) -{ - xprintf("%s:%04X\r\n", name, hex); -} - -void printError(uint8_t rcode) -{ - xprintf("\r\nERROR:%02X\r\n", rcode); -} - -void dumpBuf(int len, uint8_t* buf, bool commented = false) -{ - for (int i = 0; i < len; i++) { - if (i % 16) - print(" "); - else { - if (i != 0) print("\r\n"); - if (commented) print("// "); - } - - xprintf("%02X ", buf[i]); - } - print("\r\n"); -} - -class dumpCallback : public USBReadParser { -public: - void Parse(const uint16_t len, const uint8_t *pbuf, const uint16_t &offset) { - for (int i = 0; i < len; i++) { - if ((offset + i) % 16) - print(" "); - else { - if ((offset + i) != 0) print("\r\n"); - } - - printHEX(pbuf[i]); - } - } -} dumper; - -void printStringDescriptor(UsbDevice *pdev, uint8_t index, uint16_t langid) -{ - uint8_t sbuf[256]; - uint8_t rcode, len; - - if (index == 0) return; - - rcode = Usb.getStrDescr(pdev->address.devAddress, 0, 1, index, langid, sbuf); - if (rcode) { printError(rcode); return; } - len = (sbuf[0] > sizeof(sbuf) ? sizeof(sbuf) : sbuf[0]); - - rcode = Usb.getStrDescr(pdev->address.devAddress, 0, len, index, langid, sbuf); - if (rcode) { printError(rcode); return; } - - xprintf("String%d: ", index); - - for (uint8_t i = 2; (i + 1) < len; i += 2) { - if (sbuf[i + 1] != 0) continue; - //xputc(sbuf[i + 1]); - xputc(sbuf[i]); - } - print("\r\n"); - - dumpBuf(sbuf[0], sbuf, true); -} - -uint8_t dumpReportDesc(UsbDevice *pdev, uint16_t iface, uint16_t len) -{ - uint8_t rbuf[64]; - uint8_t rcode = 0; - rcode = Usb.ctrlReq(pdev->address.devAddress, 0x00, bmREQ_HID_REPORT, USB_REQUEST_GET_DESCRIPTOR, 0x00, - HID_DESCRIPTOR_REPORT, iface, len, sizeof(rbuf), rbuf, &dumper); - print("\r\n"); - if (rcode) { printError(rcode); } - return rcode; -} - -void scanConfigDesc(UsbDevice *pdev, uint16_t tl, uint8_t* pB) -{ - uint8_t iface = 0; - while (pB < buf + tl) { - switch (*(pB+1)) { - case USB_DESCRIPTOR_DEVICE: - break; - case USB_DESCRIPTOR_CONFIGURATION: - break; - case USB_DESCRIPTOR_STRING: - break; - case USB_DESCRIPTOR_ENDPOINT: - break; - case USB_DESCRIPTOR_INTERFACE: { - USB_INTERFACE_DESCRIPTOR *pI = (USB_INTERFACE_DESCRIPTOR *)pB; - iface = pI->bInterfaceNumber; - - // String Descriptor - if (pI->iInterface) { - print("\r\n// iInterface: "); - printStringDescriptor(pdev, pI->iInterface, langid); - } - break; - } - - case HID_DESCRIPTOR_HID: { - USB_HID_DESCRIPTOR *pH = (USB_HID_DESCRIPTOR *)pB; - xprintf("\r\n// Report%d: len:%04X\r\n", iface, pH->wDescriptorLength); - if (pH->bDescrType == HID_DESCRIPTOR_REPORT) { - dumpReportDesc(pdev, iface, pH->wDescriptorLength); - } else { - printVal("// Unknown HID Desc Type:", pH->bDescrType); - } - break; - } - - case USB_DESCRIPTOR_DEBUG: - case USB_DESCRIPTOR_INTERFACE_ASSOCIATION: - case USB_DESCRIPTOR_BOS: - case USB_DESCRIPTOR_DEVICE_CAPABILITY: - case USB_DESCRIPTOR_SS_USB_EP_COMPANION: - case USB_DESCRIPTOR_SSP_ISO_EP_COMPANION: - // Class specific - case AUDIO_CLASS_INTERFACE: - case AUDIO_CLASS_ENDPOINT: - break; - default: - printVal("// Unknown Desc Type:", *(pB+1)); - break; - } - pB += *pB; - } -} - -uint8_t dumpConfigDesc(UsbDevice *pdev, uint8_t numConf) -{ - uint8_t rcode = 0; - for (uint8_t i = 0; i < numConf; i++) { - xprintf("\r\n// Config%d:", i); - - rcode = Usb.getConfDescr(pdev->address.devAddress, 0, sizeof(USB_CONFIGURATION_DESCRIPTOR), i, buf); - if (rcode) return rcode; - USB_CONFIGURATION_DESCRIPTOR *pC = (USB_CONFIGURATION_DESCRIPTOR *)&buf; - printVal(" len", pC->wTotalLength); - uint16_t conf_len = (pC->wTotalLength < BUF_SIZE ? pC->wTotalLength : BUF_SIZE); - - rcode = Usb.getConfDescr(pdev->address.devAddress, 0, conf_len, i, buf); - if (rcode) return rcode; - dumpBuf(conf_len, buf); - if (pC->wTotalLength > BUF_SIZE) println("Buffer is not enough!"); - - // String Descriptor - if (pC->iConfiguration) { - print("\r\n// iConfiguration: "); - printStringDescriptor(pdev, pC->iConfiguration, langid); - } - - // Set Configuration - Usb.setConf(pdev->address.devAddress, 0, pC->bConfigurationValue); - - scanConfigDesc(pdev, conf_len, buf); - } - return rcode; -} - -void dumpDescriptors(UsbDevice *pdev) -{ - uint8_t rcode = 0; - - xprintf("\r\n// Address:%02X\r\n", pdev->address.devAddress); - xprintf("// lowspeed:%02X\r\n", pdev->lowspeed); - - // - // Device Descriptor - // - rcode = Usb.getDevDescr(pdev->address.devAddress, 0, sizeof(USB_DEVICE_DESCRIPTOR), buf); - if (rcode) { printError(rcode); } - USB_DEVICE_DESCRIPTOR *pD = (USB_DEVICE_DESCRIPTOR *)&buf; - printVal("// idVendor", pD->idVendor); - printVal("// idProduct", pD->idProduct); - - // set maxpacketsize0 - epInfo[0].epAddr = 0; - epInfo[0].maxPktSize = pD->bMaxPacketSize0; - epInfo[0].bmNakPower = USB_NAK_MAX_POWER; - UsbDevice *p = Usb.GetAddressPool().GetUsbDevicePtr(pdev->address.devAddress); - p->epinfo = epInfo; - - // String Descriptor - if (pD->iManufacturer || pD->iProduct || pD->iSerialNumber) { - uint8_t sbuf[4]; - rcode = Usb.getStrDescr(pdev->address.devAddress, 0, 4, 0, 0, sbuf); - if (rcode == 0) { - langid = (sbuf[3] << 8) | sbuf[2]; - printVal("// langid", langid); - - println("\r\n// String0:"); - dumpBuf(sbuf[0], sbuf, true); - } - } - if (pD->iManufacturer) { - print("\r\n// iManufacturer: "); - printStringDescriptor(pdev, pD->iManufacturer, langid); - } - if (pD->iProduct) { - print("\r\n// iProduct: "); - printStringDescriptor(pdev, pD->iProduct, langid); - } - if (pD->iSerialNumber) { - print("\r\n// iSerialNumber: "); - printStringDescriptor(pdev, pD->iSerialNumber, langid); - } - - print("\r\n// Device Descriptor:\r\n"); - dumpBuf(sizeof(USB_DEVICE_DESCRIPTOR), buf); - - - // - // Configuration Descriptor - // - uint8_t numConf = pD->bNumConfigurations; - rcode = dumpConfigDesc(pdev, numConf); - if (rcode) { printError(rcode); } - - Usb.GetAddressPool().FreeAddress(pdev->address.devAddress); - - println("\r\n// Parse data here: http://eleccelerator.com/usbdescreqparser/"); - return; -} - - - - - -uint16_t timer; -void matrix_init(void) { -} - -void hook_early_init(void) { - Usb.Init(); -} - -void hook_late_init(void) { - timer = timer_read(); -} - -uint8_t matrix_scan(void) { - return 1; -} - -void hook_keyboard_loop(void) { - static bool waiting = true; - static uint8_t usb_state = 0; - - - Usb.Task(); - - if (usb_state != Usb.getUsbTaskState()) { - usb_state = Usb.getUsbTaskState(); - xprintf("usb_state: %02X\n", usb_state); - if (!waiting) waiting = true; - } - - // Wait for console startutp - if (timer_elapsed(timer) < 3000) { - return; - } - - if (Usb.getUsbTaskState() == USB_STATE_RUNNING && waiting) { - Usb.ForEachUsbDevice(&dumpDescriptors); - waiting = false; - } -} - - -// Keymap unused -const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS] PROGMEM = {}; -const action_t fn_actions[] PROGMEM = {0}; diff --git a/converter/usb_desc_dump/ino.cpp b/converter/usb_desc_dump/ino.cpp new file mode 100644 index 00000000..b290c068 --- /dev/null +++ b/converter/usb_desc_dump/ino.cpp @@ -0,0 +1,37 @@ +/* +Copyright 2021 Jun Wako + +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. +*/ +#include "Arduino.h" +#include "hook.h" + + +void hook_early_init(void) { + // arduino + setup(); +} + +void hook_late_init(void) { +} + +void hook_main_loop(void) { + // arduino + loop(); +} diff --git a/tmk_core/protocol/usb_hid/USB_Host_Shield_2.0-tmk b/tmk_core/protocol/usb_hid/USB_Host_Shield_2.0-tmk index b6128f25..96112d43 160000 --- a/tmk_core/protocol/usb_hid/USB_Host_Shield_2.0-tmk +++ b/tmk_core/protocol/usb_hid/USB_Host_Shield_2.0-tmk @@ -1 +1 @@ -Subproject commit b6128f252700a8dd2d12400c55680ef67cdcac86 +Subproject commit 96112d43858b5c5327565c36bd8ea2192ec77d1b