|
From: <ge...@op...> - 2023-11-29 23:56:55
|
This is an automated email from Gerrit. "Erhan Kurubas <erh...@es...>" just uploaded a new patch set to Gerrit, which you can find at https://review.openocd.org/c/openocd/+/8024 -- gerrit commit abbc5a6529e1f58b94ccd84760d14dfca1c935e4 Author: Erhan Kurubas <erh...@es...> Date: Thu Nov 30 00:35:54 2023 +0100 loaders/espressif: add esp32 stub flasher application code Special binary program running on the target (ESP32) to perform flash operations and communicate to the OpenOCD host. Signed-off-by: Erhan Kurubas <erh...@es...> Change-Id: I3ffe20f666f3e321a9f2c9a680ad3169099d9a99 diff --git a/contrib/loaders/flash/espressif/README.md b/contrib/loaders/flash/espressif/README.md new file mode 100644 index 0000000000..580a539bc6 --- /dev/null +++ b/contrib/loaders/flash/espressif/README.md @@ -0,0 +1,37 @@ +# ESP32 Stubs + +These are small bits of code that run on the ESP32 to facilitate OpenOCD operation on the chip. The generated `.inc` files in these directories are included in the final `openocd` binary, but these `.inc` files need to be generated separately. + +## Building Stubs + +The stubs use a specific build of ESP-IDF. Look at at the `stub_flasher_image.h` file for the `ESP32*_STUB_BUILD_IDF_REV` comment to find the ESP-IDF SHA that you need to use to build the stub. The process for each chip (e.g. esp32, esp32s3, etc) is roughly the same, though the stubs may use different versions of IDF. The process is: + +1. Download the git repo for the ESP-IDF version. +```bash +git clone https://github.com/espressif/esp-idf.git +``` + +2. Checkout the right version of ESP-IDF based on the comment in `stub_flasher_image.h` for your target chip (e.g. `036bd3eb26` from `esp32s3/stub_flasher_image.h`) +```bash +cd esp-idf +git checkout 036bd3eb26 # or whatever the SHA is +git submodule update --init --recursive +``` + +3. Set up the ESP-IDF environment +```bash +./install.sh +source export.sh +``` + +4. Go back to your `openocd-esp32` directory and build the stub for your target chip +```bash +cd ../openocd-esp32/contrib/loaders/flash/espressif/esp32s3 +``` + +5. Build the stub for all makefile targets. Currently, one target with disabled logs, and the other with `-DSTUB_LOG_ENABLE=1` macro. Latter will help to transfer the stub logs to the OpenOCD screen. +```bash +make all +``` + +6. Now you can go through the normal OpenOCD build process, and the stub images will be included in the final binary. diff --git a/contrib/loaders/flash/espressif/esp32/Makefile b/contrib/loaders/flash/espressif/esp32/Makefile new file mode 100644 index 0000000000..0be92ce1d5 --- /dev/null +++ b/contrib/loaders/flash/espressif/esp32/Makefile @@ -0,0 +1,45 @@ +# SPDX-License-Identifier: GPL-2.0-or-later + +# Makefile to compile flasher stub program +# Copyright (C) 2019 Espressif Systems Ltd. + +# Prefix for ESP32 cross compilers (can include a directory path) +CROSS ?= xtensa-esp32-elf- + +# Path to the esp-idf root dir +IDF_PATH ?= ../.. + +STUB_ARCH := xtensa +STUB_CHIP_PATH := $(shell pwd) +STUB_COMMON_PATH := $(STUB_CHIP_PATH)/.. +STUB_CHIP_ARCH_PATH := $(STUB_COMMON_PATH)/$(STUB_ARCH) +STUB_OBJ_DEPS := sdkconfig.h +STUB_LD_SCRIPT := stub.ld +STUB_CHIP := ESP32 + +SRCS := $(IDF_PATH)/components/app_trace/port/$(STUB_ARCH)/port.c \ + $(IDF_PATH)/components/esp_hw_support/port/esp32/rtc_clk.c \ + $(IDF_PATH)/components/esp_hw_support/port/esp32/rtc_clk_init.c \ + $(IDF_PATH)/components/esp_hw_support/port/esp32/rtc_time.c \ + $(IDF_PATH)/components/xtensa/eri.c \ + $(STUB_CHIP_PATH)/stub_spiflash_rom_patch.c + +CFLAGS := -std=gnu99 -mlongcalls -mtext-section-literals + +INCLUDES := -I$(IDF_PATH)/components/esp32/include \ + -I$(IDF_PATH)/components/soc/esp32/include \ + -I$(IDF_PATH)/components/efuse/esp32/include \ + -I$(IDF_PATH)/components/esp_rom/include/esp32 \ + -I$(IDF_PATH)/components/xtensa/esp32/include \ + -I$(IDF_PATH)/components/hal/esp32/include \ + -I$(IDF_PATH)/components/esp_hw_support/port/esp32 \ + -I$(IDF_PATH)/components/esp_hw_support/port/esp32/private_include + +DEFINES := + +LDFLAGS := -L$(IDF_PATH)/components/esp32/ld -T$(IDF_PATH)/components/esp_rom/esp32/ld/esp32.rom.ld \ + -T$(IDF_PATH)/components/esp_rom/esp32/ld/esp32.rom.newlib-funcs.ld \ + -T$(IDF_PATH)/components/esp_rom/esp32/ld/esp32.rom.libgcc.ld -T$(IDF_PATH)/components/esp_rom/esp32/ld/esp32.rom.api.ld \ + -T$(IDF_PATH)/components/esp_rom/esp32/ld/esp32.rom.redefined.ld -T$(IDF_PATH)/components/esp_rom/esp32/ld/esp32.rom.spiflash.ld + +include ../stub_common.mk diff --git a/contrib/loaders/flash/espressif/esp32/sdkconfig.h b/contrib/loaders/flash/espressif/esp32/sdkconfig.h new file mode 100644 index 0000000000..5eb0eced3b --- /dev/null +++ b/contrib/loaders/flash/espressif/esp32/sdkconfig.h @@ -0,0 +1,36 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ + +#ifndef _STUB_SDKCONFIG_H_ +#define _STUB_SDKCONFIG_H_ + +/* Here config defines necessary to compile sources from IDF */ + +#define CONFIG_IDF_TARGET_ARCH_XTENSA 1 +#define CONFIG_IDF_TARGET_ESP32 1 +/* Use ROM flash driver patch */ + #define CONFIG_SPI_FLASH_ROM_DRIVER_PATCH 1 +/* Disable application module multi-threading lock */ +#define CONFIG_APPTRACE_LOCK_ENABLE 0 +/* Enable apptarce module for flash data transfers */ +#define CONFIG_APPTRACE_DEST_JTAG 1 +#define CONFIG_APPTRACE_MEMBUFS_APPTRACE_PROTO_ENABLE 1 +#define CONFIG_APPTRACE_ENABLE 1 +#define CONFIG_APPTRACE_BUF_SIZE 0 +#define CONFIG_APPTRACE_PENDING_DATA_SIZE_MAX 0 +/* Debug UART number */ +#define CONFIG_CONSOLE_UART_NUM 0 +/* Debug UART baudrate */ +#define CONFIG_CONSOLE_UART_BAUDRATE 115200 +/* alloc apptrace data buffers on stack */ +#define CONFIG_STUB_STACK_DATA_POOL_SIZE (2 * CONFIG_APPTRACE_BUF_SIZE) + +/* needed due to apptrace sources usage */ +#define CONFIG_LOG_MAXIMUM_LEVEL 0 +/* needed due to various checks in IDF headers */ +#define CONFIG_FREERTOS_MAX_TASK_NAME_LEN 16 +/* TODO: use current clk, get it from PLL settings */ +#define CONFIG_ESP32_DEFAULT_CPU_FREQ_MHZ 240 +/* Unused by stub, just for compilation of IDF */ +#define CONFIG_PARTITION_TABLE_OFFSET 0x8000 + +#endif /*_STUB_SDKCONFIG_H_ */ diff --git a/contrib/loaders/flash/espressif/esp32/stub.ld b/contrib/loaders/flash/espressif/esp32/stub.ld new file mode 100644 index 0000000000..ec278e4936 --- /dev/null +++ b/contrib/loaders/flash/espressif/esp32/stub.ld @@ -0,0 +1,20 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ + +/*************************************************************************** + * LD script for ESP32 flassher stub * + * Copyright (C) 2017 Espressif Systems Ltd. * + * Author: Alexey Gerenkov <al...@es...> * + ***************************************************************************/ + +MEMORY { + /* Place sections by starting from the Internal SRAM1. OpenOCD will fill the sections using data bus. + 0x3FFE0000 - code (OpenOCD workarea address) + 0x3FFE4000 - data + ESP32 has reverse address mapping. 0x3FFE0000 and 0x400BFFFC access the same word + Code will be replaced starting from 0x3FFE4000(0x400BC000) and continue by decreasing the address. + */ + iram : org = 0x400BC000, len = 0x4000 + dram : org = 0x3FFE4000, len = 0x14000 +} + +INCLUDE stub_common.ld diff --git a/contrib/loaders/flash/espressif/esp32/stub_flasher_chip.c b/contrib/loaders/flash/espressif/esp32/stub_flasher_chip.c new file mode 100644 index 0000000000..055974d5fa --- /dev/null +++ b/contrib/loaders/flash/espressif/esp32/stub_flasher_chip.c @@ -0,0 +1,580 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ + +/*************************************************************************** + * ESP32 specific flasher stub functions * + * Copyright (C) 2019 Espressif Systems Ltd. * + * Author: Alexey Gerenkov <al...@es...> * + ***************************************************************************/ + +#include <stdlib.h> +#include <string.h> +#include "soc/rtc_cntl_reg.h" +#include "soc/rtc.h" +#include "soc/efuse_periph.h" +#include "soc/dport_reg.h" +#include "soc/spi_reg.h" +#include "soc/gpio_reg.h" +#include "soc/mmu.h" +#include "esp_spi_flash.h" +#include "esp32/spiram.h" +#include "stub_rom_chip.h" +#include "stub_logger.h" +#include "stub_flasher_int.h" +#include "stub_flasher_chip.h" + +uint32_t g_stub_cpu_freq_hz = CONFIG_ESP32_DEFAULT_CPU_FREQ_MHZ * MHZ; + +#define ESP32_STUB_FLASH_STATE_SPI_USER_REG_VAL 0x80000040UL +#define ESP32_STUB_FLASH_STATE_SPI_USER1_REG_VAL 0x5c000007UL +#define ESP32_STUB_FLASH_STATE_SPI_USER2_REG_VAL 0x70000000UL +#define ESP32_STUB_FLASH_STATE_SPI_SLAVE_REG_VAL 0x00000200UL +#define ESP32_STUB_FLASH_STATE_SPI_CTRL_REG_VAL 0x208000UL +#define ESP32_STUB_FLASH_STATE_SPI_CLOCK_REG_VAL 0x3043UL + +#define ESP32_STUB_SPI_FLASH_RDID 0x9FUL + +#define PERIPHS_SPI_MOSI_DLEN_REG SPI_MOSI_DLEN_REG(1) +#define PERIPHS_SPI_MISO_DLEN_REG SPI_MISO_DLEN_REG(1) +#define SPI_USR2_DLEN_SHIFT SPI_USR_COMMAND_BITLEN_S + +/* Cache MMU related definitions */ +#define STUB_CACHE_BUS_PRO DPORT_PRO_CACHE_MASK_DROM0 +#define STUB_CACHE_BUS_APP DPORT_APP_CACHE_MASK_DROM0 +#define STUB_MMU_DROM_VADDR SOC_MMU_VADDR0_START_ADDR +#define STUB_MMU_DROM_PAGES_START SOC_MMU_DROM0_PAGES_START /* 0 */ +#define STUB_MMU_DROM_PAGES_END SOC_MMU_DROM0_PAGES_END /* 64 */ +#define STUB_PRO_MMU_TABLE ((volatile uint32_t *)0x3FF10000) +#define STUB_APP_MMU_TABLE ((volatile uint32_t *)0x3FF12000) +#define STUB_MMU_INVALID_ENTRY_VAL SOC_MMU_INVALID_ENTRY_VAL /* 0x100 */ + +/* SPI Flash map request data */ +struct spiflash_map_req { + /* Request mapping SPI Flash base address */ + uint32_t src_addr; + /* Request mapping SPI Flash size */ + uint32_t size; + /* Mapped memory pointer */ + void *ptr; + /* Mapped started MMU page index */ + uint32_t start_page; + /* Mapped MMU page count */ + uint32_t page_cnt; + /* ID of the core currently executing this code */ + int core_id; +}; + +static volatile uint32_t *mmu_table_s[2] = { STUB_PRO_MMU_TABLE, STUB_APP_MMU_TABLE }; + +extern esp_rom_spiflash_chip_t g_rom_spiflash_chip; +extern uint8_t g_rom_spiflash_dummy_len_plus[]; + +void vPortEnterCritical(void *mux) +{ +} + +void vPortExitCritical(void *mux) +{ +} + +bool ets_efuse_flash_octal_mode(void) +{ + return false; +} + +#if STUB_LOG_ENABLE == 1 +void stub_print_cache_mmu_registers(void) +{ + uint32_t ctrl_reg = DPORT_READ_PERI_REG(DPORT_PRO_CACHE_CTRL_REG); + uint32_t ctrl1_reg = DPORT_READ_PERI_REG(DPORT_PRO_CACHE_CTRL1_REG); + uint32_t dbug0_reg = DPORT_READ_PERI_REG(DPORT_PRO_DCACHE_DBUG0_REG); + + STUB_LOGD("pro ctrl_reg: 0x%x ctrl1_reg: 0x%x dbug0_reg: 0x%x\n", + ctrl_reg, + ctrl1_reg, + dbug0_reg); + + ctrl_reg = DPORT_READ_PERI_REG(DPORT_APP_CACHE_CTRL_REG); + ctrl1_reg = DPORT_READ_PERI_REG(DPORT_APP_CACHE_CTRL1_REG); + dbug0_reg = DPORT_READ_PERI_REG(DPORT_APP_DCACHE_DBUG0_REG); + + STUB_LOGD("app ctrl_reg: 0x%x ctrl1_reg: 0x%x dbug0_reg: 0x%x\n", + ctrl_reg, + ctrl1_reg, + dbug0_reg); +} +#endif + +static const uint32_t cache_mask = DPORT_APP_CACHE_MASK_OPSDRAM | DPORT_APP_CACHE_MASK_DROM0 | + DPORT_APP_CACHE_MASK_DRAM1 | DPORT_APP_CACHE_MASK_IROM0 | + DPORT_APP_CACHE_MASK_IRAM1 | DPORT_APP_CACHE_MASK_IRAM0; + +static void esp32_flash_disable_cache_for_cpu(uint32_t cpuid, uint32_t *saved_state) +{ + uint32_t ret = 0; + if (cpuid == 0) { + ret |= DPORT_GET_PERI_REG_BITS2(DPORT_PRO_CACHE_CTRL1_REG, cache_mask, 0); + while (DPORT_GET_PERI_REG_BITS2(DPORT_PRO_DCACHE_DBUG0_REG, DPORT_PRO_CACHE_STATE, + DPORT_PRO_CACHE_STATE_S) != 1) { + ; + } + DPORT_SET_PERI_REG_BITS(DPORT_PRO_CACHE_CTRL_REG, 1, 0, DPORT_PRO_CACHE_ENABLE_S); + } else { + ret |= DPORT_GET_PERI_REG_BITS2(DPORT_APP_CACHE_CTRL1_REG, cache_mask, 0); + while (DPORT_GET_PERI_REG_BITS2(DPORT_APP_DCACHE_DBUG0_REG, DPORT_APP_CACHE_STATE, + DPORT_APP_CACHE_STATE_S) != 1) { + ; + } + DPORT_SET_PERI_REG_BITS(DPORT_APP_CACHE_CTRL_REG, 1, 0, DPORT_APP_CACHE_ENABLE_S); + } + *saved_state = ret; +} + +static void esp32_flash_restore_cache_for_cpu(uint32_t cpuid, uint32_t saved_state) +{ + if (cpuid == 0) { + DPORT_SET_PERI_REG_BITS(DPORT_PRO_CACHE_CTRL_REG, 1, 1, DPORT_PRO_CACHE_ENABLE_S); + DPORT_SET_PERI_REG_BITS(DPORT_PRO_CACHE_CTRL1_REG, cache_mask, saved_state, 0); + } else { + DPORT_SET_PERI_REG_BITS(DPORT_APP_CACHE_CTRL_REG, 1, 1, DPORT_APP_CACHE_ENABLE_S); + DPORT_SET_PERI_REG_BITS(DPORT_APP_CACHE_CTRL1_REG, cache_mask, saved_state, 0); + } +} + +static void stub_cache_init(int cpuid) +{ + Cache_Read_Disable(cpuid); + Cache_Flush(cpuid); + /* we are mapping external flash to the DROM so don't need to enable other buses */ + if (cpuid == 0) + DPORT_REG_CLR_BIT(DPORT_PRO_CACHE_CTRL1_REG, STUB_CACHE_BUS_PRO); + else + DPORT_REG_CLR_BIT(DPORT_APP_CACHE_CTRL1_REG, STUB_CACHE_BUS_APP); + Cache_Read_Enable(cpuid); +} + +static bool esp32_flash_cache_bus_enabled(uint32_t cpuid) +{ + uint32_t cache_bus = 0; + uint32_t cache_mask = 0; + + if (cpuid == 0) { + cache_bus = DPORT_READ_PERI_REG(DPORT_PRO_CACHE_CTRL1_REG); + cache_mask = STUB_CACHE_BUS_PRO; + } else { + cache_bus = DPORT_READ_PERI_REG(DPORT_APP_CACHE_CTRL1_REG); + cache_mask = STUB_CACHE_BUS_APP; + } + + return !(cache_bus & cache_mask); +} + +static bool esp32_flash_cache_enabled(uint32_t cpuid) +{ + bool result = false; + + if (cpuid == 0) + result = (DPORT_REG_GET_BIT(DPORT_PRO_CACHE_CTRL_REG, DPORT_PRO_CACHE_ENABLE) != 0); + else + result = (DPORT_REG_GET_BIT(DPORT_APP_CACHE_CTRL_REG, DPORT_APP_CACHE_ENABLE) != 0); + return result; +} + +static uint32_t esp32_flash_exec_usr_cmd(uint32_t cmd) +{ + uint32_t status_value = ESP_ROM_SPIFLASH_BUSY_FLAG; + + while (ESP_ROM_SPIFLASH_BUSY_FLAG == (status_value & ESP_ROM_SPIFLASH_BUSY_FLAG)) { + WRITE_PERI_REG(PERIPHS_SPI_FLASH_STATUS, 0); /* clear register */ + WRITE_PERI_REG(PERIPHS_SPI_FLASH_CMD, SPI_USR | cmd); + while (READ_PERI_REG(PERIPHS_SPI_FLASH_CMD) != 0) ; + + status_value = READ_PERI_REG(PERIPHS_SPI_FLASH_STATUS) & + g_rom_spiflash_chip.status_mask; + } + + return status_value; +} + +static void esp32_flash_spi_wait_ready() +{ + uint32_t status_value = ESP_ROM_SPIFLASH_BUSY_FLAG; + + while (ESP_ROM_SPIFLASH_BUSY_FLAG == (status_value & ESP_ROM_SPIFLASH_BUSY_FLAG)) { + WRITE_PERI_REG(PERIPHS_SPI_FLASH_STATUS, 0); /* clear register */ + WRITE_PERI_REG(PERIPHS_SPI_FLASH_CMD, SPI_FLASH_RDSR); + while (READ_PERI_REG(PERIPHS_SPI_FLASH_CMD) != 0) ; + status_value = READ_PERI_REG(PERIPHS_SPI_FLASH_STATUS) & + (g_rom_spiflash_chip.status_mask); + } +} + +static uint32_t esp32_flash_spi_cmd_run(uint32_t cmd, + uint8_t data_bits[], + uint32_t data_bits_num, + uint32_t read_bits_num) +{ + uint32_t old_spi_usr = READ_PERI_REG(PERIPHS_SPI_FLASH_USRREG); + uint32_t old_spi_usr2 = READ_PERI_REG(PERIPHS_SPI_FLASH_USRREG2); + uint32_t flags = SPI_USR_COMMAND; + + esp32_flash_spi_wait_ready(); + + if (read_bits_num > 0) { + flags |= SPI_USR_MISO; + WRITE_PERI_REG(PERIPHS_SPI_MISO_DLEN_REG, read_bits_num - 1); + } + if (data_bits_num > 0) { + flags |= SPI_USR_MOSI; + WRITE_PERI_REG(PERIPHS_SPI_MOSI_DLEN_REG, data_bits_num - 1); + } + + WRITE_PERI_REG(PERIPHS_SPI_FLASH_USRREG, flags); + WRITE_PERI_REG(PERIPHS_SPI_FLASH_USRREG2, (7 << SPI_USR2_DLEN_SHIFT) | cmd); + if (data_bits_num == 0) { + WRITE_PERI_REG(PERIPHS_SPI_FLASH_C0, 0); + } else { + for (uint32_t i = 0; i <= data_bits_num / 32; i += 32) + WRITE_PERI_REG(PERIPHS_SPI_FLASH_C0 + i / 8, + *((uint32_t *)&data_bits[i / 8])); + } + esp32_flash_exec_usr_cmd(0); + uint32_t status = READ_PERI_REG(PERIPHS_SPI_FLASH_C0); + /* restore some SPI controller registers */ + WRITE_PERI_REG(PERIPHS_SPI_FLASH_USRREG, old_spi_usr); + WRITE_PERI_REG(PERIPHS_SPI_FLASH_USRREG2, old_spi_usr2); + + return status; +} + +uint32_t stub_flash_get_id(void) +{ + uint32_t ret; + + STUB_LOGD("flash %x, cs %x, bs %x, ss %x, ps %x, sm %x\n", + g_rom_spiflash_chip.device_id, + g_rom_spiflash_chip.chip_size, + g_rom_spiflash_chip.block_size, + g_rom_spiflash_chip.sector_size, + g_rom_spiflash_chip.page_size, + g_rom_spiflash_chip.status_mask); + ret = esp32_flash_spi_cmd_run(ESP32_STUB_SPI_FLASH_RDID, NULL, 0, 24); + STUB_LOGD("Flash ID read %x\n", ret); + return ret >> 16; +} + +void stub_spiram_writeback_cache(void) +{ + int x; + volatile int i = 0; + volatile uint8_t *psram = (volatile uint8_t *)SOC_EXTRAM_DATA_LOW; + int cache_was_disabled = 0; + + /* We need cache enabled for this to work. Re-enable it if needed; make sure we + * disable it again on exit as well. */ + if (DPORT_REG_GET_BIT(DPORT_PRO_CACHE_CTRL_REG, DPORT_PRO_CACHE_ENABLE) == 0) { + cache_was_disabled |= (1 << 0); + DPORT_SET_PERI_REG_BITS(DPORT_PRO_CACHE_CTRL_REG, 1, 1, DPORT_PRO_CACHE_ENABLE_S); + } + if (DPORT_REG_GET_BIT(DPORT_APP_CACHE_CTRL_REG, DPORT_APP_CACHE_ENABLE) == 0) { + cache_was_disabled |= (1 << 1); + DPORT_SET_PERI_REG_BITS(DPORT_APP_CACHE_CTRL_REG, 1, 1, DPORT_APP_CACHE_ENABLE_S); + } + + /* + Note: this assumes the amount of external RAM is >2M. If it is 2M or less, what this code does is undefined. If + we ever support external RAM chips of 2M or smaller, this may need adjusting. + */ + for (x = 0; x < 1024 * 64; x += 32) { + i += psram[x]; + i += psram[x + (1024 * 1024 * 2)]; + } + + if (cache_was_disabled & (1 << 0)) { + while (DPORT_GET_PERI_REG_BITS2(DPORT_PRO_DCACHE_DBUG0_REG, DPORT_PRO_CACHE_STATE, + DPORT_PRO_CACHE_STATE_S) != 1) ; + DPORT_SET_PERI_REG_BITS(DPORT_PRO_CACHE_CTRL_REG, 1, 0, DPORT_PRO_CACHE_ENABLE_S); + } + if (cache_was_disabled & (1 << 1)) { + while (DPORT_GET_PERI_REG_BITS2(DPORT_APP_DCACHE_DBUG0_REG, DPORT_APP_CACHE_STATE, + DPORT_APP_CACHE_STATE_S) != 1) ; + DPORT_SET_PERI_REG_BITS(DPORT_APP_CACHE_CTRL_REG, 1, 0, DPORT_APP_CACHE_ENABLE_S); + } +} + +void stub_flash_cache_flush(void) +{ + if (DPORT_GET_PERI_REG_MASK(DPORT_PRO_CACHE_CTRL1_REG, + DPORT_PRO_CACHE_MASK_OPSDRAM) == 0 || + DPORT_GET_PERI_REG_MASK(DPORT_APP_CACHE_CTRL1_REG, + DPORT_APP_CACHE_MASK_OPSDRAM) == 0) + stub_spiram_writeback_cache(); + Cache_Flush(0); + Cache_Flush(1); +} + +void stub_flash_state_prepare(struct stub_flash_state *state) +{ + uint32_t core_id = stub_get_coreid(); + /* TODO: generic support for multi-core (pass maximum number of cores as the first param) */ + uint32_t other_core_id = core_id == 0 ? 1 : 0; + + ets_efuse_read_op(); + + uint32_t spiconfig = ets_efuse_get_spiconfig(); + uint32_t strapping = REG_READ(GPIO_STRAP_REG); + /* If GPIO1 (U0TXD) is pulled low and flash pin configuration is not set in efuse, assume + * HSPI flash mode (same as normal boot) */ + if (spiconfig == 0 && (strapping & 0x1c) == 0x08) + spiconfig = 1; /* HSPI flash mode */ + + state->other_cache_enabled = esp32_flash_cache_enabled(other_core_id); + if (state->other_cache_enabled) { + esp32_flash_disable_cache_for_cpu(other_core_id, + &state->cache_flags[other_core_id]); + STUB_LOGI("Cache disable CPU%d: 0x%x %d\n", other_core_id, + state->cache_flags[other_core_id], + esp32_flash_cache_enabled(other_core_id)); + } + state->cache_enabled = esp32_flash_cache_enabled(core_id) && esp32_flash_cache_bus_enabled( + core_id); + if (!state->cache_enabled) { + STUB_LOGI("Cache needs to be enabled for CPU%d\n", core_id); + stub_cache_init(core_id); + } + + state->spi_regs[ESP32_STUB_FLASH_STATE_SPI_USER_REG_ID] = READ_PERI_REG(SPI_USER_REG(1)); + state->spi_regs[ESP32_STUB_FLASH_STATE_SPI_USER1_REG_ID] = READ_PERI_REG(SPI_USER1_REG(1)); + state->spi_regs[ESP32_STUB_FLASH_STATE_SPI_USER2_REG_ID] = READ_PERI_REG(SPI_USER2_REG(1)); + state->spi_regs[ESP32_STUB_FLASH_STATE_SPI_SLAVE_REG_ID] = READ_PERI_REG(SPI_SLAVE_REG(1)); + state->spi_regs[ESP32_STUB_FLASH_STATE_SPI_CLOCK_REG_ID] = READ_PERI_REG(SPI_CLOCK_REG(1)); + state->spi_regs[ESP32_STUB_FLASH_STATE_SPI_CTRL_REG_ID] = READ_PERI_REG(SPI_CTRL_REG(1)); + state->dummy_len_plus = g_rom_spiflash_dummy_len_plus[1]; + + WRITE_PERI_REG(SPI_USER_REG(1), ESP32_STUB_FLASH_STATE_SPI_USER_REG_VAL); + WRITE_PERI_REG(SPI_USER1_REG(1), ESP32_STUB_FLASH_STATE_SPI_USER1_REG_VAL); + WRITE_PERI_REG(SPI_USER2_REG(1), ESP32_STUB_FLASH_STATE_SPI_USER2_REG_VAL); + WRITE_PERI_REG(SPI_SLAVE_REG(1), ESP32_STUB_FLASH_STATE_SPI_SLAVE_REG_VAL); + + if ((READ_PERI_REG(SPI_CACHE_FCTRL_REG(0)) & SPI_CACHE_FLASH_USR_CMD) == 0) { + STUB_LOGI("Attach spi flash...\n"); + esp_rom_spiflash_attach(spiconfig, 0); + } else { + WRITE_PERI_REG(SPI_CTRL_REG(1), 0x208000); + WRITE_PERI_REG(SPI_CLOCK_REG(1), 0x3043); + g_rom_spiflash_dummy_len_plus[1] = 0; + } +} + +void stub_flash_state_restore(struct stub_flash_state *state) +{ + uint32_t core_id = stub_get_coreid(); + /* TODO: generic support for multi-core (pass maximum number of cores as the first param) */ + uint32_t other_core_id = core_id == 0 ? 1 : 0; + + WRITE_PERI_REG(SPI_USER_REG(1), state->spi_regs[ESP32_STUB_FLASH_STATE_SPI_USER_REG_ID]); + WRITE_PERI_REG(SPI_USER1_REG(1), state->spi_regs[ESP32_STUB_FLASH_STATE_SPI_USER1_REG_ID]); + WRITE_PERI_REG(SPI_USER2_REG(1), state->spi_regs[ESP32_STUB_FLASH_STATE_SPI_USER2_REG_ID]); + WRITE_PERI_REG(SPI_SLAVE_REG(1), state->spi_regs[ESP32_STUB_FLASH_STATE_SPI_SLAVE_REG_ID]); + WRITE_PERI_REG(SPI_CLOCK_REG(1), state->spi_regs[ESP32_STUB_FLASH_STATE_SPI_CLOCK_REG_ID]); + WRITE_PERI_REG(SPI_CTRL_REG(1), state->spi_regs[ESP32_STUB_FLASH_STATE_SPI_CTRL_REG_ID]); + g_rom_spiflash_dummy_len_plus[1] = state->dummy_len_plus; + + if (state->other_cache_enabled) { + esp32_flash_restore_cache_for_cpu(other_core_id, state->cache_flags[other_core_id]); + STUB_LOGI("Cache restored CPU%d: 0x%x %d\n", other_core_id, + state->cache_flags[other_core_id], + esp32_flash_cache_enabled(other_core_id)); + } + if (state->cache_enabled) { + /* we are managing the running core's cache while map unmap. So nothing to do here.. + **/ + } +} + +int stub_cpu_clock_configure(int cpu_freq_mhz) +{ + rtc_cpu_freq_config_t old_config; + rtc_clk_cpu_freq_get_config(&old_config); + + if (stub_get_log_dest() == STUB_LOG_DEST_UART) + uart_tx_wait_idle(CONFIG_CONSOLE_UART_NUM); + + /* set to maximum possible value */ + if (cpu_freq_mhz == -1) + cpu_freq_mhz = CONFIG_ESP32_DEFAULT_CPU_FREQ_MHZ; + + /* Set CPU to configured value. Keep other clocks unmodified. */ + if (cpu_freq_mhz > 0) { + /* On ESP32 rev 0, switching to 80MHz if clock was previously set to + * 240 MHz may cause the chip to lock up (see section 3.5 of the errata + * document). For rev. 0, switch to 240 instead if it was chosen in + * menuconfig. + */ + if (cpu_freq_mhz == 80 && old_config.freq_mhz == 240) { + uint32_t chip_ver_reg = REG_READ(EFUSE_BLK0_RDATA3_REG); + if ((chip_ver_reg & EFUSE_RD_CHIP_VER_REV1_M) == 0) + cpu_freq_mhz = 240; + } + + rtc_clk_config_t clk_cfg = RTC_CLK_CONFIG_DEFAULT(); + clk_cfg.xtal_freq = RTC_XTAL_FREQ_AUTO; + clk_cfg.cpu_freq_mhz = cpu_freq_mhz; + clk_cfg.slow_freq = rtc_clk_slow_freq_get(); + clk_cfg.fast_freq = rtc_clk_fast_freq_get(); + rtc_clk_init(clk_cfg); + + g_stub_cpu_freq_hz = cpu_freq_mhz * MHZ; + } + + return old_config.freq_mhz; +} + +#if STUB_LOG_ENABLE == 1 +void stub_uart_console_configure(int dest) +{ + uartAttach(); + ets_install_uart_printf(); + /* Set configured UART console baud rate */ + uart_div_modify(CONFIG_CONSOLE_UART_NUM, + (rtc_clk_apb_freq_get() << 4) / CONFIG_CONSOLE_UART_BAUDRATE); +} +#endif + +uint32_t stub_esp_clk_cpu_freq(void) +{ + return g_stub_cpu_freq_hz; +} + +static inline bool esp_flash_encryption_enabled(void) +{ + uint32_t flash_crypt_cnt = REG_GET_FIELD(EFUSE_BLK0_RDATA0_REG, + EFUSE_RD_FLASH_CRYPT_CNT); + + /* __builtin_parity is in flash, so we calculate parity inline */ + bool enabled = false; + while (flash_crypt_cnt) { + if (flash_crypt_cnt & 1) + enabled = !enabled; + flash_crypt_cnt >>= 1; + } + return enabled; +} + +esp_flash_enc_mode_t stub_get_flash_encryption_mode(void) +{ + static esp_flash_enc_mode_t mode = ESP_FLASH_ENC_MODE_DEVELOPMENT; + static bool first = true; + + if (first) { + if (esp_flash_encryption_enabled()) { + /* Check if FLASH CRYPT CNT is write protected */ + bool flash_crypt_cnt_wr_dis = REG_READ(EFUSE_BLK0_RDATA0_REG) & + EFUSE_WR_DIS_FLASH_CRYPT_CNT; + if (!flash_crypt_cnt_wr_dis) { + uint8_t flash_crypt_cnt = REG_GET_FIELD(EFUSE_BLK0_RDATA0_REG, + EFUSE_RD_FLASH_CRYPT_CNT); + /* Check if FLASH_CRYPT_CNT set for permanent encryption */ + if (flash_crypt_cnt == EFUSE_RD_FLASH_CRYPT_CNT_V) + flash_crypt_cnt_wr_dis = true; + } + + if (flash_crypt_cnt_wr_dis) { + uint8_t dis_dl_cache = REG_GET_FIELD(EFUSE_BLK0_RDATA6_REG, + EFUSE_RD_DISABLE_DL_CACHE); + uint8_t dis_dl_enc = REG_GET_FIELD(EFUSE_BLK0_RDATA6_REG, + EFUSE_RD_DISABLE_DL_ENCRYPT); + uint8_t dis_dl_dec = REG_GET_FIELD(EFUSE_BLK0_RDATA6_REG, + EFUSE_RD_DISABLE_DL_DECRYPT); + /* Check if DISABLE_DL_DECRYPT, DISABLE_DL_ENCRYPT & DISABLE_DL_CACHE are + set */ + if (dis_dl_cache && dis_dl_enc && dis_dl_dec) + mode = ESP_FLASH_ENC_MODE_RELEASE; + } + } else { + mode = ESP_FLASH_ENC_MODE_DISABLED; + } + first = false; + STUB_LOGD("flash encryption mode: %d\n", mode); + } + + return mode; +} + +static int stub_flash_mmap(struct spiflash_map_req *req) +{ + uint32_t map_src = req->src_addr & (~(SPI_FLASH_MMU_PAGE_SIZE - 1)); + uint32_t map_size = req->size + (req->src_addr - map_src); + uint32_t flash_page = map_src / SPI_FLASH_MMU_PAGE_SIZE; + uint32_t page_cnt = (map_size + SPI_FLASH_MMU_PAGE_SIZE - 1) / SPI_FLASH_MMU_PAGE_SIZE; + int start_page, ret = ESP_ROM_SPIFLASH_RESULT_ERR; + uint32_t saved_state = 0; + esp32_flash_disable_cache_for_cpu(req->core_id, &saved_state); + + for (start_page = STUB_MMU_DROM_PAGES_START; start_page < STUB_MMU_DROM_PAGES_END; + ++start_page) { + if (mmu_table_s[req->core_id][start_page] == STUB_MMU_INVALID_ENTRY_VAL) + break; + } + + if (start_page == STUB_MMU_DROM_PAGES_END) + start_page = STUB_MMU_DROM_PAGES_START; + + if (start_page + page_cnt < STUB_MMU_DROM_PAGES_END) { + for (int i = 0; i < page_cnt; i++) + mmu_table_s[req->core_id][start_page + i] = SOC_MMU_PAGE_IN_FLASH( + flash_page + i); + + req->start_page = start_page; + req->page_cnt = page_cnt; + req->ptr = (void *)(STUB_MMU_DROM_VADDR + + (start_page - STUB_MMU_DROM_PAGES_START) * SPI_FLASH_MMU_PAGE_SIZE + + (req->src_addr - map_src)); + Cache_Flush(req->core_id); + ret = ESP_ROM_SPIFLASH_RESULT_OK; + } + + STUB_LOGD( + "start_page: %d map_src: %x map_size: %x page_cnt: %d flash_page: %d map_ptr: %x\n", + start_page, + map_src, + map_size, + page_cnt, + flash_page, + req->ptr); + + esp32_flash_restore_cache_for_cpu(req->core_id, saved_state); + + return ret; +} + +static void stub_flash_ummap(const struct spiflash_map_req *req) +{ + uint32_t saved_state = 0; + + esp32_flash_disable_cache_for_cpu(req->core_id, &saved_state); + + for (int i = req->start_page; i < req->start_page + req->page_cnt; ++i) + mmu_table_s[req->core_id][i] = STUB_MMU_INVALID_ENTRY_VAL; + + esp32_flash_restore_cache_for_cpu(req->core_id, saved_state); +} + +int stub_flash_read_buff(uint32_t addr, void *buffer, uint32_t size) +{ + struct spiflash_map_req req = { + .src_addr = addr, + .size = size, + .core_id = stub_get_coreid() + }; + + int ret = stub_flash_mmap(&req); + + if (ret) + return ret; + + memcpy(buffer, req.ptr, size); + + stub_flash_ummap(&req); + + return ESP_ROM_SPIFLASH_RESULT_OK; +} diff --git a/contrib/loaders/flash/espressif/esp32/stub_flasher_chip.h b/contrib/loaders/flash/espressif/esp32/stub_flasher_chip.h new file mode 100644 index 0000000000..3e1d4db4f7 --- /dev/null +++ b/contrib/loaders/flash/espressif/esp32/stub_flasher_chip.h @@ -0,0 +1,41 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ + +/*************************************************************************** + * ESP32 flasher stub definitions * + * Copyright (C) 2019 Espressif Systems Ltd. * + * Author: Alexey Gerenkov <al...@es...> * + ***************************************************************************/ +#ifndef ESP32_FLASHER_STUB_H +#define ESP32_FLASHER_STUB_H + +#include <stdint.h> + +#define STUB_FLASH_SECTOR_SIZE 4096 +/* Flash geometry constants */ +#define STUB_FLASH_BLOCK_SIZE 65536 +#define STUB_FLASH_PAGE_SIZE 256 +#define STUB_FLASH_STATUS_MASK 0xFFFF + +#define ESP32_STUB_FLASH_STATE_SPI_USER_REG_ID 0 +#define ESP32_STUB_FLASH_STATE_SPI_USER1_REG_ID 1 +#define ESP32_STUB_FLASH_STATE_SPI_USER2_REG_ID 2 +#define ESP32_STUB_FLASH_STATE_SPI_SLAVE_REG_ID 3 +#define ESP32_STUB_FLASH_STATE_SPI_CTRL_REG_ID 4 +#define ESP32_STUB_FLASH_STATE_SPI_CLOCK_REG_ID 5 +#define ESP32_STUB_FLASH_STATE_REGS_NUM 6 + +struct stub_flash_state { + uint32_t cache_flags[2]; + bool other_cache_enabled; + bool cache_enabled; + uint32_t spi_regs[ESP32_STUB_FLASH_STATE_REGS_NUM]; + uint32_t dummy_len_plus; +}; +void stub_flash_state_prepare(struct stub_flash_state *state); +void stub_flash_state_restore(struct stub_flash_state *state); + +uint32_t stub_esp_clk_cpu_freq(void); + +#include "stub_xtensa_chips.h" + +#endif /*ESP32_FLASHER_STUB_H */ diff --git a/contrib/loaders/flash/espressif/esp32/stub_flasher_code.inc b/contrib/loaders/flash/espressif/esp32/stub_flasher_code.inc new file mode 100644 index 0000000000..40360a1222 --- /dev/null +++ b/contrib/loaders/flash/espressif/esp32/stub_flasher_code.inc @@ -0,0 +1,605 @@ +/* Autogenerated with ../../../../../src/helper/bin2char.sh */ +0x5c,0x44,0xfe,0x3f,0x44,0x44,0xfe,0x3f,0x36,0x41,0x00,0x81,0xfd,0xff,0xbd,0x02, +0x82,0x08,0x00,0xcd,0x03,0x8c,0xf8,0x91,0xfb,0xff,0x88,0x29,0x8c,0x88,0x88,0x58, +0x8c,0x48,0xa2,0x29,0x03,0xe0,0x08,0x00,0x1d,0xf0,0x00,0x00,0x70,0x40,0xfe,0x3f, +0x00,0xa0,0xf5,0x3f,0x18,0xa0,0xf5,0x3f,0x6c,0x40,0xfe,0x3f,0x36,0x41,0x00,0xb1, +0xfb,0xff,0x82,0x0b,0x00,0x16,0xe8,0x06,0x81,0xfa,0xff,0x0c,0x1a,0xc0,0x20,0x00, +0x98,0x08,0x0c,0x08,0x90,0x94,0x65,0x46,0x03,0x00,0x00,0x00,0x07,0x69,0x05,0xa0, +0x88,0x30,0x80,0x80,0x74,0x90,0x91,0x41,0x56,0x09,0xff,0xc1,0xf3,0xff,0xbc,0xe8, +0x81,0xf0,0xff,0xc0,0x20,0x00,0x98,0x08,0x27,0xe9,0x0d,0xc0,0x20,0x00,0x88,0x08, +0x92,0xa0,0x7f,0x80,0x84,0x65,0x97,0x98,0x28,0x91,0xea,0xff,0xc0,0x20,0x00,0x88, +0x09,0xc0,0x20,0x00,0xa8,0x09,0xc0,0x20,0x00,0x92,0x29,0x00,0x80,0x89,0x41,0xa0, +0xa7,0x41,0xa0,0x88,0x10,0x90,0x98,0x41,0x90,0x88,0x10,0x07,0x68,0x03,0x0c,0x28, +0x89,0x0c,0x0c,0x08,0x82,0x4b,0x00,0x81,0xe0,0xff,0x28,0x08,0x1d,0xf0,0x00,0x00, +0x1c,0x20,0xf4,0x3f,0x24,0x20,0xf4,0x3f,0x10,0x20,0xf4,0x3f,0x00,0x20,0xf4,0x3f, +0x00,0x00,0x00,0x08,0x70,0xe2,0xfa,0x3f,0x2c,0x20,0xf4,0x3f,0x00,0x00,0x00,0x90, +0x9f,0x00,0x00,0x70,0x80,0x20,0xf4,0x3f,0x00,0x00,0x04,0x00,0x36,0x41,0x00,0x21, +0xf4,0xff,0x91,0xf5,0xff,0xc0,0x20,0x00,0xe8,0x02,0x21,0xf2,0xff,0xb1,0xf3,0xff, +0xc0,0x20,0x00,0xd8,0x02,0xf1,0xf2,0xff,0xa1,0xf3,0xff,0x0c,0x0c,0xc0,0x20,0x00, +0xc9,0x09,0xc0,0x20,0x00,0xf2,0x6b,0x00,0xc0,0x20,0x00,0x28,0x0b,0x56,0x72,0xff, +0xc0,0x20,0x00,0x88,0x09,0x28,0x5a,0x20,0x88,0x10,0x80,0x80,0x04,0x56,0xc8,0xfd, +0x21,0xea,0xff,0x1c,0x79,0xc0,0x20,0x00,0x99,0x02,0x21,0xe1,0xff,0x91,0xe7,0xff, +0xb1,0xe2,0xff,0xc0,0x20,0x00,0x99,0x02,0x21,0xdf,0xff,0x91,0xe5,0xff,0xc1,0xdf, +0xff,0xc0,0x20,0x00,0x99,0x02,0x21,0xe3,0xff,0xf1,0xe3,0xff,0xc0,0x20,0x00,0x89, +0x02,0xc0,0x20,0x00,0x89,0x0b,0xc0,0x20,0x00,0xf2,0x6c,0x00,0xc0,0x20,0x00,0x28, +0x0c,0x56,0x72,0xff,0xc0,0x20,0x00,0x98,0x0b,0x28,0x5a,0x20,0x99,0x10,0x07,0xe9, +0xdf,0x81,0xcf,0xff,0x21,0xd8,0xff,0xc0,0x20,0x00,0x28,0x02,0xc0,0x20,0x00,0xe9, +0x08,0x81,0xcc,0xff,0x20,0x20,0xf5,0xc0,0x20,0x00,0xd9,0x08,0x1d,0xf0,0x00,0x00, +0x40,0x00,0xf0,0x3f,0x44,0x00,0xf0,0x3f,0x58,0x00,0xf0,0x3f,0x5c,0x00,0xf0,0x3f, +0x36,0x41,0x00,0x30,0x30,0x54,0x0c,0x89,0xec,0x82,0x81,0xf9,0xff,0xc0,0x20,0x00, +0xa8,0x08,0x90,0xaa,0x20,0xc0,0x20,0x00,0xa9,0x08,0xa1,0xf6,0xff,0x82,0xaf,0xc0, +0xc0,0x20,0x00,0x98,0x0a,0x80,0x99,0x10,0x30,0x99,0x20,0xc0,0x20,0x00,0x99,0x0a, +0x86,0x09,0x00,0x00,0x81,0xf1,0xff,0xc0,0x20,0x00,0xa8,0x08,0x90,0xaa,0x20,0xc0, +0x20,0x00,0xa9,0x08,0xa1,0xee,0xff,0x92,0xaf,0xc0,0xc0,0x20,0x00,0x88,0x0a,0x90, +0x88,0x10,0x30,0x88,0x20,0xc0,0x20,0x00,0x89,0x0a,0x1d,0xf0,0xf0,0x03,0xf0,0x3f, +0x18,0x04,0xf0,0x3f,0x36,0x41,0x00,0xdc,0xe2,0x81,0xe2,0xff,0xa1,0xfc,0xff,0xc0, +0x20,0x00,0x82,0x28,0x00,0x80,0x80,0x54,0xc0,0x20,0x00,0x98,0x0a,0x90,0x97,0xb4, +0x66,0x19,0xf4,0xa1,0xdb,0xff,0x06,0x07,0x00,0x81,0xdc,0xff,0xa1,0xf5,0xff,0xc0, +0x20,0x00,0x82,0x28,0x00,0x80,0x80,0x54,0xc0,0x20,0x00,0x98,0x0a,0x90,0x97,0xb4, +0x66,0x19,0xf4,0xa1,0xd5,0xff,0xc0,0x20,0x00,0x98,0x0a,0x7c,0x7b,0xb0,0x99,0x10, +0xc0,0x20,0x00,0x99,0x0a,0x89,0x03,0x1d,0xf0,0x00,0x00,0x00,0xb0,0x80,0xf4,0x3f, +0xfe,0xff,0x00,0x00,0x36,0x41,0x00,0x21,0xfd,0xff,0xc0,0x20,0x00,0x32,0x22,0x00, +0x22,0xa0,0x00,0x30,0xa3,0x20,0x65,0x29,0x02,0x27,0x1a,0x05,0x21,0xf9,0xff,0x20, +0x23,0x10,0x1d,0xf0,0x00,0x60,0xf6,0x3f,0x04,0x60,0xf6,0x3f,0x70,0x80,0xf4,0x3f, +0xff,0xff,0xff,0xe7,0x40,0x42,0x0f,0x00,0xb4,0x80,0xf4,0x3f,0x7c,0x80,0xf4,0x3f, +0xff,0xc7,0xff,0xff,0x00,0x10,0x00,0x00,0x00,0x20,0x00,0x00,0x36,0x41,0x00,0x91, +0xf5,0xff,0x0b,0x33,0xc0,0x20,0x00,0x88,0x09,0xa2,0xac,0x00,0xa0,0x88,0x10,0x30, +0x30,0x94,0x80,0x33,0x20,0xc0,0x20,0x00,0x39,0x09,0x31,0xef,0xff,0x0b,0x82,0xc0, +0x20,0x00,0x89,0x03,0x81,0xee,0xff,0x91,0xee,0xff,0xc0,0x20,0x00,0x38,0x08,0x90, +0x33,0x10,0xc0,0x20,0x00,0x39,0x08,0x81,0xeb,0xff,0x91,0xed,0xff,0x80,0x82,0x82, +0x80,0x8c,0x41,0x80,0x30,0xf4,0x00,0x88,0x11,0x80,0x83,0x20,0x31,0xe7,0xff,0xc0, +0x20,0x00,0x89,0x03,0x31,0xe6,0xff,0xc0,0x20,0x00,0x88,0x03,0x90,0x88,0x10,0xe6, +0x32,0x05,0x21,0xe4,0xff,0x86,0x00,0x00,0x21,0xe4,0xff,0x20,0x88,0x20,0xc0,0x20, +0x00,0x89,0x03,0x1d,0xf0,0x00,0x00,0x00,0x1c,0x00,0x10,0x00,0x36,0x41,0x00,0x21, +0xfe,0xff,0x20,0x62,0x40,0x20,0x26,0x05,0x1d,0xf0,0x00,0x00,0x70,0x00,0xf0,0x3f, +0x36,0x41,0x00,0x0c,0x18,0x0c,0x29,0x20,0x98,0x93,0x81,0xfc,0xff,0x0c,0x02,0xc0, +0x20,0x00,0x99,0x08,0x1d,0xf0,0x00,0x00,0x14,0x00,0x10,0x00,0x36,0x41,0x00,0x0c, +0x08,0x91,0xfd,0xff,0x80,0x79,0x40,0x1d,0xf0,0x00,0x00,0x00,0x00,0x80,0x3f,0x00, +0x00,0x00,0x80,0x00,0x36,0x41,0x00,0x91,0xec,0xff,0x80,0x69,0x40,0xa1,0xfb,0xff, +0x10,0x22,0x11,0xa0,0x22,0x10,0x30,0x30,0xe4,0x30,0x22,0x20,0x31,0xf9,0xff,0x30, +0x88,0x10,0x80,0x22,0x20,0x20,0x79,0x40,0x25,0xfc,0xff,0x0c,0x02,0x1d,0xf0,0x00, +0x77,0xc3,0x0b,0x40,0x36,0x41,0x00,0x81,0xfe,0xff,0x91,0xeb,0xff,0x80,0x79,0x40, +0x81,0xde,0xff,0x80,0x68,0x40,0x92,0xa0,0x00,0x77,0x78,0x14,0x80,0xaf,0x64,0x80, +0x80,0xe4,0x97,0x98,0x05,0x20,0x80,0x64,0xa7,0x18,0x05,0x25,0xf9,0xff,0x92,0xa1, +0x01,0x90,0x29,0x20,0x90,0x00,0x00,0x00,0x36,0x41,0x00,0x80,0xeb,0x03,0x80,0x8d, +0x04,0x92,0x02,0x00,0x0c,0x02,0x87,0x59,0x08,0x21,0xcf,0xff,0x20,0x62,0x40,0x20, +0x27,0x05,0x1d,0xf0,0x00,0xc0,0xff,0x3f,0x00,0x40,0x00,0x00,0x00,0x80,0xff,0x3f, +0x74,0x00,0xf0,0x3f,0x78,0x00,0xf0,0x3f,0x04,0x00,0x10,0x00,0x36,0x41,0x00,0x8d, +0x02,0x90,0xeb,0x03,0x90,0x9d,0x04,0x56,0x19,0x05,0xc0,0x20,0x00,0x99,0xb2,0xc0, +0x20,0x00,0x99,0xa2,0xc0,0x20,0x00,0x99,0xc2,0xc0,0x20,0x00,0x99,0xd2,0x99,0x92, +0x21,0xf1,0xff,0xa1,0xf2,0xff,0xc0,0x20,0x00,0x99,0x38,0x29,0x58,0x21,0xee,0xff, +0xa9,0x78,0xc0,0x20,0x00,0x99,0x48,0xa1,0xee,0xff,0x29,0x68,0x29,0x88,0xc0,0x20, +0x00,0x99,0x28,0x0c,0x12,0xc0,0x20,0x00,0x29,0x0a,0xa1,0xea,0xff,0xc0,0x20,0x00, +0x29,0x0a,0x21,0xb6,0xff,0x0c,0x2a,0xc0,0x20,0x00,0xa9,0x02,0x21,0xe7,0xff,0x0c, +0x2a,0xa0,0x72,0x40,0xa2,0xa0,0x80,0xa0,0x72,0x40,0x0c,0x02,0xa1,0xab,0xff,0x20, +0x7a,0x40,0xa1,0xb5,0xff,0x20,0x7a,0x40,0x0c,0x1a,0x00,0x19,0x40,0x00,0x9a,0xa1, +0xa2,0x08,0x00,0xa0,0x99,0x20,0x92,0x48,0x00,0x1d,0xf0,0x00,0x1c,0x80,0xf4,0x3f, +0x3f,0xc0,0xff,0xff,0x34,0x85,0x00,0x40,0x36,0x41,0x00,0x81,0x78,0xff,0xa2,0xaf, +0xbf,0xc0,0x20,0x00,0x98,0x08,0xb1,0xfa,0xff,0xa0,0x99,0x10,0xa1,0xf8,0xff,0xc0, +0x20,0x00,0x99,0x08,0xc0,0x20,0x00,0x98,0x0a,0xb0,0x99,0x10,0x4c,0x0b,0xb0,0x99, +0x20,0xc0,0x20,0x00,0x99,0x0a,0xc0,0x20,0x00,0x98,0x08,0x8c,0xa2,0xa2,0xaf,0x7f, +0xa0,0x99,0x10,0x06,0x02,0x00,0x00,0x00,0x00,0xa2,0xa0,0x80,0xa0,0x99,0x20,0xc0, +0x20,0x00,0x99,0x08,0x3c,0x2a,0x81,0xeb,0xff,0xe0,0x08,0x00,0x1d,0xf0,0x00,0x00, +0x68,0xf0,0xf5,0x3f,0xff,0xef,0xff,0x7f,0xff,0x7f,0xff,0xff,0xff,0x9f,0xff,0xff, +0xff,0xff,0x00,0x80,0x00,0x00,0x00,0x80,0x36,0x41,0x00,0x21,0xf9,0xff,0x91,0xf9, +0xff,0xc0,0x20,0x00,0x88,0x02,0x90,0x88,0x10,0xc0,0x20,0x00,0x89,0x02,0xc0,0x20, +0x00,0x88,0x02,0x91,0xf5,0xff,0x90,0x88,0x10,0xc0,0x20,0x00,0x89,0x02,0xc0,0x20, +0x00,0x88,0x02,0x91,0xf2,0xff,0x90,0x88,0x10,0xc0,0x20,0x00,0x89,0x02,0xc0,0x20, +0x00,0x88,0x02,0x91,0xef,0xff,0x90,0x88,0x10,0xc0,0x20,0x00,0x89,0x02,0xc0,0x20, +0x00,0x88,0x02,0x91,0xec,0xff,0x90,0x88,0x20,0xc0,0x20,0x00,0x89,0x02,0x0c,0x1a, +0x81,0xcd,0xff,0xe0,0x08,0x00,0xc0,0x20,0x00,0x88,0x02,0xf7,0x68,0xef,0x1d,0xf0, +0xf8,0x20,0xf4,0x3f,0xf8,0x30,0xf4,0x3f,0x6c,0x22,0x06,0x40,0x36,0x61,0x00,0x81, +0xfc,0xff,0xc0,0x20,0x00,0x28,0x08,0x20,0x20,0x24,0x56,0x42,0xff,0x81,0xf9,0xff, +0xc0,0x20,0x00,0x28,0x08,0x20,0x20,0x24,0x56,0x42,0xff,0xa1,0xc6,0xfe,0xbd,0x01, +0x81,0xf6,0xff,0xe0,0x08,0x00,0x0c,0x18,0xa0,0x28,0x93,0x1d,0xf0,0x00,0x00,0x00, +0x74,0x40,0xfe,0x3f,0x83,0xde,0x1b,0x43,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00, +0x50,0xc0,0x00,0x40,0x36,0x41,0x00,0x81,0xfe,0xff,0xe0,0x08,0x00,0x81,0xf8,0xff, +0x91,0xf9,0xff,0x88,0x08,0x90,0x88,0xa2,0x91,0xf8,0xff,0x80,0x82,0xd5,0x80,0xaa, +0xc2,0x0c,0x08,0x89,0x12,0x81,0xf4,0xff,0x99,0x32,0x89,0x22,0x91,0xf4,0xff,0x81, +0xf3,0xff,0xa9,0x02,0x89,0x42,0x99,0x52,0x1d,0xf0,0x00,0x00,0x36,0x81,0x00,0x21, +0x78,0xfe,0xa2,0xa1,0x03,0x22,0x02,0x00,0x9c,0xc2,0x21,0x76,0xfe,0xa2,0xa1,0x06, +0x88,0x22,0x9c,0x28,0x88,0x48,0x8c,0xe8,0xad,0x01,0xa5,0xfa,0xff,0x88,0x22,0xa8, +0x32,0x88,0x48,0xbd,0x01,0xe0,0x08,0x00,0x2d,0x0a,0x1d,0xf0,0x36,0x81,0x00,0xa2, +0xa1,0x02,0x16,0xc2,0x02,0x31,0x6a,0xfe,0xa2,0xa1,0x03,0x32,0x03,0x00,0x16,0x03, +0x02,0x31,0x68,0xfe,0xa2,0xa1,0x06,0x82,0x23,0x02,0x9c,0x48,0x88,0x28,0x9c,0x08, +0xad,0x01,0x25,0xf7,0xff,0x88,0x23,0xa8,0x33,0x88,0x28,0xcd,0x01,0xbd,0x02,0xe0, +0x08,0x00,0x2d,0x0a,0x1d,0xf0,0x00,0x00,0x36,0x81,0x00,0xad,0x02,0xac,0x72,0x31, +0x5c,0xfe,0x32,0x03,0x00,0xad,0x03,0x9c,0xd3,0x31,0x5a,0xfe,0xa8,0x23,0x9c,0x6a, +0x88,0x1a,0xad,0x08,0x9c,0x08,0xad,0x01,0xa5,0xf3,0xff,0x88,0x23,0xa8,0x33,0x88, +0x18,0xcd,0x01,0xbd,0x02,0xe0,0x08,0x00,0x2d,0x0a,0x1d,0xf0,0x36,0x81,0x00,0xa2, +0xa1,0x02,0x16,0xc2,0x02,0x31,0x4e,0xfe,0xa2,0xa1,0x03,0x32,0x03,0x00,0x16,0x03, +0x02,0x31,0x4c,0xfe,0xa2,0xa1,0x06,0x82,0x23,0x02,0x9c,0x48,0x88,0x68,0x9c,0x08, +0xad,0x01,0x25,0xf0,0xff,0x88,0x23,0xa8,0x33,0x88,0x78,0xcd,0x01,0xbd,0x02,0xe0, +0x08,0x00,0x2d,0x0a,0x1d,0xf0,0x00,0x00,0x36,0x81,0x00,0x32,0x22,0x00,0x30,0xa3, +0x20,0x16,0x83,0x02,0x31,0x3f,0xfe,0x32,0x03,0x00,0xad,0x03,0x9c,0xd3,0x31,0x3d, +0xfe,0xa8,0x23,0x9c,0x6a,0x88,0x6a,0xad,0x08,0x9c,0x08,0xad,0x01,0x65,0xec,0xff, +0x88,0x23,0xa8,0x33,0x88,0x68,0xcd,0x01,0xbd,0x02,0xe0,0x08,0x00,0x2d,0x0a,0x1d, +0xf0,0x00,0x00,0x00,0xc8,0xc2,0x00,0x40,0x36,0x61,0x00,0x61,0xa5,0xff,0xc6,0x0f, +0x00,0x81,0xa7,0xff,0xe0,0x08,0x00,0x51,0xa3,0xff,0x48,0x06,0x0c,0x17,0x50,0x44, +0xa2,0x58,0x03,0x40,0x42,0xd5,0x40,0xaa,0xc2,0x50,0x5a,0xc0,0x48,0x13,0x57,0x3a, +0x02,0x72,0xa0,0x00,0x40,0x40,0x60,0x70,0x44,0xc0,0x78,0x33,0x59,0x43,0x49,0x53, +0x77,0x24,0x0d,0x47,0x17,0x02,0x86,0x6b,0x00,0x48,0x23,0x47,0x35,0x02,0x86,0x69, +0x00,0x58,0x02,0xc0,0x20,0x00,0x48,0x12,0x58,0x05,0xc0,0x20,0x00,0xa8,0x12,0xe0, +0x05,0x00,0x5d,0x0a,0x56,0x6a,0x19,0x7c,0xf3,0x40,0x33,0x30,0x30,0x30,0x04,0xe0, +0x63,0x11,0x6a,0x62,0xc0,0x20,0x00,0xa9,0x26,0xc0,0x20,0x00,0x68,0x12,0xad,0x03, +0x1b,0x66,0xc0,0x20,0x00,0x69,0x12,0x68,0x02,0x2b,0x33,0x68,0x16,0xd0,0x33,0x11, +0x30,0x32,0x80,0xe0,0x06,0x00,0x78,0x03,0x38,0x02,0xa2,0x23,0x03,0xe0,0x0a,0x00, +0x16,0x5a,0x13,0x82,0x17,0x00,0x16,0xf8,0x12,0x6d,0x05,0x9d,0x05,0xc0,0x20,0x00, +0x38,0xb2,0xc0,0x20,0x00,0xa8,0xc2,0x37,0x3a,0x1d,0xc0,0x20,0x00,0x38,0x92,0xc0, +0x20,0x00,0xa8,0xc2,0xa0,0x33,0xc0,0x16,0x93,0x10,0xc0,0x20,0x00,0xa8,0xb2,0xdc, +0x9a,0x0b,0x33,0x86,0x04,0x00,0x00,0x00,0xc0,0x20,0x00,0x38,0xb2,0xc0,0x20,0x00, +0xa2,0x22,0x0c,0x32,0xc3,0xff,0xa0,0x33,0xc0,0x16,0x73,0x0e,0x60,0xa8,0xc0,0x30, +0x3a,0x63,0xb8,0x82,0xc0,0x20,0x00,0xa8,0xc2,0xc0,0x20,0x00,0xc8,0xb2,0xc0,0x20, +0x00,0xd8,0xc2,0xaa,0xab,0xc7,0xbd,0x02,0x46,0x21,0x00,0xc0,0x20,0x00,0xc8,0xc2, +0xc0,0x20,0x00,0xd8,0x92,0xca,0xc3,0xd7,0xbc,0x02,0x86,0x21,0x00,0xc0,0x20,0x00, +0xc8,0xb2,0x16,0xec,0x08,0xc0,0x20,0x00,0xc8,0xc2,0xc0,0x20,0x00,0xd8,0x92,0xca, +0xc3,0xd7,0x9c,0x07,0xc0,0x20,0x00,0x99,0xc2,0x06,0x1d,0x00,0xc0,0x20,0x00,0xa8, +0xb2,0x0b,0xaa,0x37,0x3a,0x6d,0xc0,0x20,0x00,0xa8,0xc2,0xc0,0x20,0x00,0xa9,0xa2, +0xc0,0x20,0x00,0x99,0xc2,0xc0,0x20,0x00,0xc8,0xb2,0xc0,0x20,0x00,0xa8,0xa2,0xa7, +0x9c,0x1d,0xc0,0x20,0x00,0x99,0xb2,0xc0,0x20,0x00,0xc8,0xa2,0xc0,0x20,0x00,0xa8, +0x92,0xa7,0xbc,0x0b,0xc0,0x20,0x00,0xa2,0x22,0x09,0xc0,0x20,0x00,0xa2,0x62,0x0a, +0xc0,0x20,0x00,0xa8,0xc2,0xaa,0xa3,0xc0,0x20,0x00,0xa9,0xc2,0xad,0x0b,0xc6,0x07, +0x00,0xc0,0x20,0x00,0xb8,0xb2,0xc0,0x20,0x00,0xc2,0x22,0x0c,0x0b,0xbb,0xc0,0xbb, +0xc0,0x37,0x3b,0x0f,0xc0,0x20,0x00,0xb8,0xc2,0xba,0xb3,0xc0,0x20,0x00,0xb2,0x62, +0x0c,0x56,0x3a,0x00,0x06,0xff,0xff,0x00,0x2b,0xb6,0xcd,0x03,0xba,0xb7,0x89,0x01, +0x99,0x11,0x81,0x90,0xff,0xe0,0x08,0x00,0x88,0x01,0x3a,0x66,0x98,0x11,0x87,0xb6, +0x02,0x06,0xb6,0xff,0x0c,0x03,0x32,0x57,0x00,0x40,0x40,0x04,0xe0,0x44,0x11,0x4a, +0x42,0xc0,0x20,0x00,0xa8,0x12,0x28,0x02,0xc0,0x20,0x00,0xb2,0x24,0x02,0x22,0x22, +0x02,0xe0,0x02,0x00,0x46,0x06,0x00,0x00,0x52,0xa1,0x07,0x86,0x04,0x00,0x48,0x23, +0x26,0x04,0x02,0x86,0x82,0xff,0x48,0x33,0x66,0x04,0x02,0x86,0x90,0xff,0xc6,0x7f, +0xff,0x2d,0x05,0x1d,0xf0,0x00,0x00,0x00,0x36,0x41,0x00,0x50,0xeb,0x03,0x50,0x5d, +0x04,0x82,0x02,0x00,0xa2,0xa1,0x03,0x57,0x58,0x3f,0xc0,0x20,0x00,0x88,0x22,0x4b, +0x52,0x80,0x80,0x04,0xe0,0x88,0x11,0x8a,0x82,0xc0,0x20,0x00,0x88,0x38,0x37,0xb8, +0x10,0x0c,0x0a,0xc6,0x08,0x00,0x40,0xb4,0x20,0x50,0xa5,0x20,0xa5,0xdb,0xff,0x56, +0x7a,0x01,0xc0,0x20,0x00,0x88,0x22,0x80,0x80,0x04,0xe0,0x88,0x11,0x8a,0x82,0xc0, +0x20,0x00,0x88,0x38,0x87,0x33,0xde,0x86,0xf5,0xff,0x2d,0x0a,0x1d,0xf0,0x00,0x00, +0x36,0x41,0x00,0x40,0xeb,0x03,0x40,0x4d,0x04,0x82,0x02,0x00,0xa2,0xa1,0x03,0x47, +0x58,0x35,0xc0,0x20,0x00,0x88,0x22,0x4b,0x42,0x80,0x80,0x04,0xe0,0x88,0x11,0x8a, +0x82,0xc0,0x20,0x00,0x88,0x38,0x46,0x02,0x00,0x00,0xbd,0x03,0xad,0x04,0xa5,0xd6, +0xff,0xdc,0x3a,0xc0,0x20,0x00,0x88,0x22,0x80,0x80,0x04,0xe0,0x88,0x11,0x8a,0x82, +0xc0,0x20,0x00,0xa8,0x38,0x56,0x1a,0xfe,0x2d,0x0a,0x1d,0xf0,0x36,0x41,0x00,0x5d, +0x02,0x80,0xeb,0x03,0x80,0x8d,0x04,0x92,0x02,0x00,0x61,0xf5,0xfe,0x4b,0x22,0x87, +0xd9,0x05,0x0c,0x02,0x06,0x45,0x00,0x00,0xc0,0x20,0x00,0x88,0xc5,0xc0,0x20,0x00, +0x98,0xd5,0x87,0x39,0x07,0xc0,0x20,0x00,0x88,0xd5,0x06,0x01,0x00,0xc0,0x20,0x00, +0x88,0xb5,0xc0,0x20,0x00,0x98,0xc5,0x90,0x88,0xc0,0x16,0x38,0x08,0x28,0x03,0x20, +0x88,0x63,0x89,0x03,0xc0,0x20,0x00,0x28,0xc5,0x38,0x95,0x2a,0x23,0xc0,0x20,0x00, +0x38,0xc5,0xc0,0x20,0x00,0x48,0xd5,0x37,0x34,0x11,0xc0,0x20,0x00,0x38,0xc5,0xc0, +0x20,0x00,0x48,0xd5,0x3a,0x38,0x37,0x34,0x52,0x06,0x10,0x00,0xc0,0x20,0x00,0x38, +0xc5,0xc0,0x20,0x00,0x48,0xb5,0x3a,0x38,0x37,0x34,0x40,0xc0,0x20,0x00,0x38,0xc5, +0xc0,0x20,0x00,0x48,0xb5,0x3a,0x38,0x47,0x93,0x22,0xc0,0x20,0x00,0x48,0xb5,0xc0, +0x20,0x00,0x38,0xa5,0x37,0xb4,0x09,0xc0,0x20,0x00,0x38,0xa5,0xc0,0x20,0x00,0x39, +0xb5,0x0c,0x03,0xc0,0x20,0x00,0x39,0xc5,0x46,0x03,0x00,0x00,0x00,0xc0,0x20,0x00, +0x38,0xc5,0x3a,0x88,0xc0,0x20,0x00,0x89,0xc5,0x56,0xf2,0x06,0x06,0xff,0xff,0x00, +0x00,0x82,0x25,0x01,0xa2,0x28,0x03,0xe0,0x0a,0x00,0x16,0xaa,0x00,0xbd,0x04,0xad, +0x02,0x65,0xc7,0xff,0x06,0xd0,0xff,0x00,0x88,0x24,0x66,0x08,0x07,0x88,0x34,0x66, +0x08,0x02,0x86,0xcc,0xff,0x81,0xc2,0xfe,0xe0,0x08,0x00,0x91,0xbe,0xfe,0x88,0x06, +0x0c,0x1b,0x90,0x88,0xa2,0x98,0x04,0x80,0x82,0xd5,0x80,0xaa,0xc2,0x90,0x9a,0xc0, +0x88,0x14,0x97,0x3a,0x02,0xb2,0xa0,0x00,0x80,0x80,0x60,0xb0,0x88,0xc0,0xa8,0x34, +0x99,0x44,0x89,0x54,0xa7,0xa8,0x02,0x46,0xbf,0xff,0x87,0x1a,0x02,0x46,0xbc,0xff, +0x88,0x24,0x87,0xb9,0x02,0xc6,0xbb,0xff,0x86,0xb9,0xff,0x00,0x1d,0xf0,0x00,0x00, +0x36,0x41,0x00,0xbd,0x04,0x50,0xeb,0x03,0x50,0x5d,0x04,0x82,0x02,0x00,0x57,0xd8, +0x04,0x0c,0x02,0x06,0x44,0x00,0xc0,0x20,0x00,0x58,0x22,0x50,0x50,0x04,0x2b,0x55, +0xd0,0x55,0x11,0x5a,0x52,0x58,0x25,0x52,0xc5,0xfc,0x37,0x35,0xe3,0xc0,0x20,0x00, +0x58,0x22,0x50,0x50,0x04,0xe0,0x55,0x11,0x5a,0x52,0xc0,0x20,0x00,0x98,0x35,0xc0, +0x20,0x00,0x88,0x22,0x4b,0x53,0x80,0x80,0x04,0x2b,0x88,0xd0,0x88,0x11,0x8a,0x82, +0x88,0x28,0x5a,0x99,0x97,0xb8,0x78,0x4b,0xa2,0xe5,0xbb,0xff,0x56,0x1a,0xfb,0xc0, +0x20,0x00,0x88,0x22,0x50,0x90,0xf4,0x80,0x80,0x04,0xe0,0x88,0x11,0x8a,0x82,0xc0, +0x20,0x00,0xa8,0x38,0xc0,0x20,0x00,0x88,0x22,0xaa,0x99,0x80,0x80,0x04,0x2b,0x88, +0xd0,0x88,0x11,0x8a,0x82,0x88,0x28,0x97,0x38,0x86,0xc0,0x20,0x00,0x98,0x22,0xc0, +0x20,0x00,0x88,0x22,0x90,0x90,0x04,0x80,0x80,0x04,0x2b,0x99,0xe0,0x88,0x11,0xd0, +0x99,0x11,0x8a,0x82,0x9a,0x92,0xc0,0x20,0x00,0x88,0x38,0x98,0x19,0x8a,0x89,0x16, +0xe8,0xf5,0xc0,0x20,0x00,0x98,0x22,0x90,0x90,0x04,0xe0,0x99,0x11,0x9a,0x22,0xc0, +0x20,0x00,0x98,0x32,0x5a,0x59,0xc0,0x20,0x00,0x59,0x32,0x86,0x10,0x00,0x00,0x00, +0xc0,0x20,0x00,0x98,0x22,0xc0,0x20,0x00,0x88,0x22,0x90,0x90,0x04,0x80,0x80,0x04, +0x2b,0x99,0xe0,0x88,0x11,0xd0,0x99,0x11,0x8a,0x82,0x9a,0x92,0xc0,0x20,0x00,0x88, +0x38,0x98,0x19,0x8a,0x89,0xc0,0x20,0x00,0x98,0x22,0x90,0x90,0x04,0xe0,0x99,0x11, +0x9a,0x22,0xc0,0x20,0x00,0x98,0x32,0x5a,0x59,0xc0,0x20,0x00,0x59,0x32,0x16,0xf8, +0xef,0x20,0xeb,0x03,0x20,0x2d,0x04,0x10,0x22,0x11,0x30,0x32,0x20,0x0c,0x02,0x22, +0x58,0x01,0x32,0x58,0x00,0x4b,0x28,0x1d,0xf0,0x00,0x00,0x00,0x40,0x44,0xfe,0x3f, +0x9c,0x30,0xf0,0x3f,0x00,0x30,0xf0,0x3f,0x90,0x30,0xf0,0x3f,0x94,0x30,0xf0,0x3f, +0xe0,0x4a,0x06,0x40,0x36,0x61,0x00,0x30,0x32,0x41,0x71,0xf8,0xff,0x1c,0x09,0x0c, +0x18,0xc6,0x19,0x00,0x00,0x48,0x07,0x40,0x40,0x34,0x40,0x59,0xc0,0x30,0x55,0x63, +0xa1,0xf4,0xff,0xc0,0x20,0x00,0x68,0x0a,0x56,0x46,0xff,0xa1,0xf2,0xff,0xe0,0x64, +0x11,0xe0,0xb5,0x11,0xaa,0x66,0xba,0xb2,0xa8,0x02,0x89,0x21,0x99,0x11,0xb9,0x01, +0x81,0xf0,0xff,0xe0,0x08,0x00,0xb8,0x01,0xa9,0x06,0x4b,0x22,0x4b,0x66,0x88,0x21, +0x98,0x11,0xb7,0x92,0xe2,0xc0,0x20,0x00,0x68,0x07,0x5a,0x44,0x6a,0x65,0x69,0x07, +0x50,0x33,0xc0,0x66,0xb4,0x15,0x66,0xb6,0x0a,0x41,0xe3,0xff,0xc0,0x20,0x00,0x89, +0x04,0xc6,0x01,0x00,0xa1,0xe2,0xff,0xc0,0x20,0x00,0x89,0x0a,0x56,0x53,0xf9,0x1d, +0xf0,0x00,0x00,0x00,0xff,0xff,0x00,0x00,0x1c,0x44,0xfe,0x3f,0x40,0x3f,0x00,0x00, +0x14,0x9a,0x00,0x40,0x36,0x81,0x00,0x20,0x92,0x20,0x32,0x61,0x05,0x60,0xeb,0x03, +0x60,0x6d,0x04,0x32,0xa0,0x00,0xbd,0x01,0xad,0x06,0x51,0xf6,0xff,0x39,0x01,0x99, +0x61,0x25,0x50,0xff,0x71,0xf5,0xff,0xe0,0x86,0x11,0x8a,0x77,0x20,0x20,0xf4,0x5a, +0x54,0x2a,0x55,0x78,0x07,0x98,0x61,0x8d,0x03,0x50,0x50,0xf5,0x4c,0x03,0x76,0x83, +0x0e,0xe0,0xa8,0x11,0x7a,0xaa,0xc0,0x20,0x00,0xa8,0x0a,0x26,0xfa,0x03,0x1b,0x88, +0x0c,0x08,0x89,0x41,0x8a,0x35,0x3c,0xfa,0x37,0x3a,0x32,0x90,0xa0,0xf5,0xe0,0x98, +0x11,0x9a,0x97,0x0c,0x03,0x86,0x02,0x00,0xaa,0xb3,0xc0,0x20,0x00,0xb9,0x09,0x1b, +0x33,0x4b,0x99,0x37,0x95,0xf1,0x31,0xe1,0xff,0xad,0x06,0x3a,0x38,0x00,0x33,0x11, +0x2a,0x33,0x81,0xdf,0xff,0xe0,0x08,0x00,0x0c,0x02,0x86,0x02,0x00,0x00,0x52,0xa0, +0x00,0x52,0x61,0x04,0x3d,0x05,0x0c,0x12,0xb8,0x01,0xad,0x06,0x25,0x42,0xff,0xfc, +0x62,0xa8,0x51,0xbd,0x03,0xcd,0x04,0x81,0x67,0xfe,0xe0,0x08,0x00,0xbd,0x01,0xad, +0x06,0x29,0x01,0x25,0x47,0xff,0x38,0x41,0x82,0xa1,0x00,0x3a,0x55,0x86,0x03,0x00, +0xe0,0x43,0x11,0x40,0x47,0x80,0xc0,0x20,0x00,0x82,0x64,0x00,0x32,0xc3,0x01,0x57, +0x33,0xed,0xb8,0x01,0xad,0x06,0xa5,0x3e,0xff,0x1d,0xf0,0x00,0x00,0x00,0xf3,0xbf, +0xff,0xff,0x32,0x00,0x00,0x00,0xc0,0xc0,0xff,0xff,0x3f,0x00,0x36,0x81,0x00,0x1c, +0x8c,0xbd,0x01,0xad,0x02,0xe5,0xf0,0xff,0x5d,0x0a,0x56,0xea,0x06,0x62,0x01,0x00, +0x42,0xa0,0xe9,0x47,0x96,0x6a,0x22,0xc2,0x18,0x6d,0x0a,0x4d,0x0a,0xc6,0x13,0x00, +0xc2,0xa0,0x08,0xb2,0xc1,0x18,0x20,0xa2,0x20,0xa5,0xee,0xff,0x16,0x2a,0x00,0x46, +0x12,0x00,0x98,0x61,0x81,0xee,0xff,0xa1,0xee,0xff,0x80,0x89,0x80,0x87,0xba,0x0b, +0x81,0xed,0xff,0xa1,0xed,0xff,0x80,0x89,0x80,0x87,0x3a,0x1b,0xf6,0x24,0x26,0xf0, +0x84,0x11,0x4a,0x88,0xe0,0x88,0x11,0x8a,0x83,0x99,0x28,0x98,0x71,0x8b,0xa2,0x1b, +0x44,0xa9,0x18,0x99,0x38,0x40,0x40,0xf4,0x88,0x71,0x1b,0x66,0x8b,0x88,0x8a,0x22, +0x82,0x01,0x01,0x87,0x26,0xa9,0x49,0x03,0xc6,0x01,0x00,0x00,0x7c,0xf5,0x46,0x00, +0x00,0x7c,0x85,0x2d,0x05,0x1d,0xf0,0x00,0x36,0x41,0x04,0x1b,0x62,0x2a,0x54,0x40, +0x66,0x11,0x3a,0x22,0xc6,0x11,0x00,0x00,0x0c,0x13,0x32,0x45,0x00,0x72,0xd6,0xf0, +0x32,0xa0,0xff,0x06,0x0c,0x00,0x00,0x00,0xc2,0xa2,0x00,0x10,0xb1,0x20,0x70,0xa7, +0x20,0x25,0xe6,0xff,0x56,0x2a,0x03,0x82,0xa2,0x00,0x76,0x88,0x11,0xaa,0x91,0x92, +0x09,0x00,0x37,0x19,0x07,0x0c,0x03,0x32,0x45,0x00,0x06,0x03,0x00,0x1b,0xaa,0x82, +0x05,0x00,0x72,0xd7,0x02,0x8c,0x18,0x67,0x97,0xcd,0x1b,0x55,0x62,0xd6,0x10,0x40, +0x75,0xc0,0x27,0x37,0xb2,0x0c,0x02,0x46,0x00,0x00,0x7c,0xf2,0x1d,0xf0,0x00,0x00, +0x00,0x00,0x80,0x3f,0x00,0x00,0x20,0x00,0x00,0x08,0x00,0x00,0x36,0x61,0x00,0x81, +0xb1,0xfc,0xc0,0x20,0x00,0x98,0x08,0x2c,0x08,0x87,0x09,0x0d,0x91,0xb0,0xfc,0xc0, +0x20,0x00,0x98,0x09,0x87,0x09,0x02,0x46,0x31,0x00,0x0c,0x08,0x91,0xa9,0xfc,0xc0, +0x20,0x00,0x89,0x01,0xc0,0x20,0x00,0xb8,0x09,0x0c,0x8a,0xa7,0x8b,0x0e,0xc0,0x20, +0x00,0x88,0x09,0xa0,0x88,0x20,0xc0,0x20,0x00,0x89,0x09,0x0c,0x18,0x91,0xa2,0xfc, +0x0c,0x8c,0xc0,0x20,0x00,0xb8,0x09,0xad,0x08,0xc7,0x8b,0x13,0xc0,0x20,0x00,0xb8, +0x09,0xa2,0xa0,0x02,0xc0,0xbb,0x20,0xa0,0xa8,0x20,0xc0,0x20,0x00,0xb2,0x69,0x00, +0xb1,0xe4,0xff,0xe1,0xe4,0xff,0xc1,0xe4,0xff,0x76,0x8c,0x2e,0xc0,0x20,0x00,0x92, +0x0b,0x00,0xc0,0x20,0x00,0xd8,0x01,0x90,0x90,0x74,0xda,0x99,0xc0,0x20,0x00,0x99, +0x01,0xea,0x9b,0xc0,0x20,0x00,0x92,0x09,0x00,0xc0,0x20,0x00,0xd8,0x01,0x90,0x90, +0x74,0xda,0x99,0xc0,0x20,0x00,0x99,0x01,0xb2,0xcb,0x20,0x9c,0xe8,0x91,0xa3,0xfc, +0xc0,0x20,0x00,0x88,0x09,0x80,0x87,0xb4,0x66,0x18,0xf4,0x91,0x85,0xfc,0x7c,0x7b, +0xc0,0x20,0x00,0x88,0x09,0xb0,0x88,0x10,0xc0,0x20,0x00,0x89,0x09,0x17,0x6a,0x1f, +0x91,0x9c,0xfc,0xc0,0x20,0x00,0x88,0x09,0x80,0x87,0xb4,0x66,0x18,0xf4,0x91,0x7e, +0xfc,0x7c,0x7a,0xc0,0x20,0x00,0x88,0x09,0xa0,0x88,0x10,0xc0,0x20,0x00,0x89,0x09, +0x0c,0x0a,0x81,0x4b,0xff,0xe0,0x08,0x00,0x0c,0x1a,0x81,0x49,0xff,0xe0,0x08,0x00, +0x1d,0xf0,0x00,0x00,0xff,0xef,0xff,0xff,0x00,0x00,0x0a,0x00,0xff,0xff,0xff,0x01, +0x78,0x40,0xfe,0x3f,0x81,0x40,0xfe,0x3f,0xff,0xff,0xff,0x7f,0x6c,0xf0,0xf5,0x3f, +0x0a,0x00,0x00,0x00,0x20,0xb3,0x81,0x00,0x00,0x40,0x42,0x0f,0x28,0x42,0xfe,0x3f, +0xbc,0x40,0xfe,0x3f,0xc9,0x40,0xfe,0x3f,0x0d,0x41,0xfe,0x3f,0x51,0x41,0xfe,0x3f, +0x54,0x7d,0x00,0x40,0xf8,0xcf,0x00,0x40,0x36,0x41,0x00,0x31,0xa0,0xfc,0xc0,0x20, +0x00,0x28,0x03,0xc0,0x20,0x00,0x28,0x03,0x77,0x62,0x04,0x0c,0x1a,0xa5,0x48,0xff, +0xc0,0x20,0x00,0x48,0x03,0xc0,0x20,0x00,0x28,0x03,0x82,0xa2,0x00,0x80,0x22,0x20, +0xc0,0x20,0x00,0x29,0x03,0x21,0x32,0xfd,0x91,0x35,0xfd,0xc0,0x20,0x00,0x88,0x02, +0x90,0x88,0x10,0x91,0x99,0xfc,0x90,0x88,0x20,0xc0,0x20,0x00,0x89,0x02,0xc0,0x20, +0x00,0x88,0x02,0x91,0xdc,0xff,0x90,0x88,0x10,0xc0,0x20,0x00,0x89,0x02,0xc0,0x20, +0x00,0x88,0x02,0x91,0x2b,0xfd,0x90,0x88,0x10,0x91,0xd7,0xff,0x90,0x88,0x20,0xc0, +0x20,0x00,0x89,0x02,0xc0,0x20,0x00,0x38,0x03,0xa5,0x1e,0xff,0x9c,0xca,0x31,0xd3, +0xff,0x82,0xa1,0x2d,0xa0,0x33,0xc2,0x37,0x38,0x11,0xb1,0xd1,0xff,0xa1,0xd1,0xff, +0x81,0xdc,0xff,0xe0,0x08,0x00,0x0c,0x0b,0x06,0x21,0x00,0x00,0xc0,0x20,0x00,0x38, +0x02,0x81,0xcd,0xff,0xa2,0xa1,0x2d,0x80,0x33,0x10,0xc0,0x20,0x00,0x39,0x02,0xc0, +0x20,0x00,0x38,0x02,0x81,0x18,0xfd,0x80,0x33,0x20,0xc0,0x20,0x00,0x39,0x02,0x81, +0xf9,0xfc,0xe0,0x08,0x00,0x22,0xa1,0x2d,0x31,0x0e,0xfd,0x86,0x02,0x00,0x0c,0x1a, +0x22,0xc2,0xff,0x81,0xf4,0xfc,0xe0,0x08,0x00,0xc0,0x20,0x00,0x88,0x03,0xf7,0xe8, +0x02,0x56,0x92,0xfe,0x31,0x6a,0xfc,0x92,0xa1,0x00,0xc0,0x20,0x00,0x88,0x03,0x90, +0x44,0x10,0x92,0xae,0xff,0x90,0x88,0x10,0x80,0x44,0x20,0xc0,0x20,0x00,0x49,0x03, +0xc0,0x20,0x00,0x48,0x03,0x82,0xad,0xff,0x80,0x44,0x10,0xc0,0x20,0x00,0x49,0x03, +0x0c,0x0b,0xb7,0x12,0x0a,0x21,0xb1,0xff,0xc0,0x20,0x00,0xb8,0x02,0xb0,0xb7,0x41, +0xc1,0xb0,0xff,0xd1,0x2a,0xfd,0xd0,0xab,0x01,0xb0,0xbd,0x41,0x81,0xb6,0xff,0xe0, +0x08,0x00,0x21,0xac,0xff,0xc1,0xac,0xff,0x20,0xba,0xa2,0xd1,0x24,0xfd,0x20,0xaa, +0x82,0x1c,0x83,0x81,0xb0,0xff,0xe0,0x08,0x00,0x30,0xbb,0x11,0xa0,0xa3,0xc5,0xa0, +0xcb,0x20,0x22,0xcc,0xeb,0x27,0x33,0x2c,0x31,0xa5,0xff,0xe0,0x22,0x11,0x2a,0x23, +0x28,0x02,0xa0,0x02,0x00,0xb1,0xa2,0xff,0xa1,0xa3,0xff,0x81,0xa5,0xff,0xe0,0x08, +0x00,0x86,0x08,0x00,0xb1,0x9f,0xff,0xa1,0xa0,0xff,0x81,0xa1,0xff,0xe0,0x08,0x00, +0x2c,0x82,0xc6,0x04,0x00,0xb1,0x9a,0xff,0xa1,0x9d,0xff,0x22,0xa0,0x00,0x81,0x9c, +0xff,0xe0,0x08,0x00,0x46,0x00,0x00,0x1c,0xa2,0x1d,0xf0,0x00,0x3c,0x00,0xf0,0x3f, +0x78,0x41,0xfe,0x3f,0x80,0x41,0xfe,0x3f,0x36,0x41,0x00,0x31,0x38,0xfc,0xc0,0x20, +0x00,0x48,0x03,0x40,0x4b,0x15,0x26,0x14,0x27,0x8c,0xb4,0x0c,0x88,0x0c,0x13,0xad, +0x08,0x26,0x24,0x65,0x46,0x10,0x00,0x00,0x31,0x2f,0xfc,0xc0,0x20,0x00,0x38,0x03, +0x25,0x09,0xff,0x30,0x30,0x94,0x1b,0x33,0x30,0x8a,0xc2,0xc6,0x12,0x00,0x00,0x00, +0x00,0x31,0xee,0xff,0xc0,0x20,0x00,0x38,0x03,0x30,0x30,0x14,0xac,0x83,0x26,0x13, +0x2e,0x82,0xa0,0xf0,0xa2,0xa1,0xe0,0x26,0x23,0x2f,0xb1,0xe9,0xff,0xa1,0xe9,0xff, +0x81,0x80,0xff,0xe0,0x08,0x00,0x06,0xff,0xff,0xb1,0xe5,0xff,0xa1,0xe6,0xff,0x81, +0x7c,0xff,0xe0,0x08,0x00,0x06,0xff,0xff,0x5c,0x08,0x0c,0x43,0xc6,0x01,0x00,0x00, +0x4d,0x03,0x82,0xa0,0xa0,0x0c,0x23,0xa2,0xa1,0x40,0x49,0x02,0xa9,0x12,0x39,0x22, +0x89,0x32,0x1d,0xf0,0x00,0xf0,0xff,0xff,0xff,0x0f,0x00,0x00,0xac,0x31,0x06,0x40, +0x36,0x41,0x00,0xad,0x02,0x20,0x20,0xb4,0x30,0xb3,0x20,0x16,0x52,0x00,0x21,0xf9, +0xff,0x20,0xaa,0x10,0xb0,0x20,0xb4,0x8c,0x92,0x31,0xf7,0xff,0x3a,0xbb,0x31,0xf5, +0xff,0x30,0xbb,0x10,0x81,0xf6,0xff,0xe0,0x08,0x00,0x0c,0x18,0x0c,0x02,0xa0,0x28, +0x93,0x20,0x20,0x60,0x1d,0xf0,0x00,0x00,0x78,0x2e,0x06,0x40,0x50,0x2d,0x06,0x40, +0x36,0x41,0x00,0xcc,0x95,0x65,0xda,0xfe,0xac,0x4a,0xdc,0x05,0x06,0x08,0x00,0x00, +0xa5,0xd9,0xfe,0x7c,0xf8,0x56,0xca,0xfe,0x86,0x08,0x00,0x00,0x00,0x00,0xcd,0x04, +0x30,0xb3,0x20,0x20,0xa2,0x20,0x81,0xf4,0xff,0xe0,0x08,0x00,0x06,0x03,0x00,0x00, +0xcd,0x04,0xbd,0x03,0xad,0x02,0x81,0xf1,0xff,0xe0,0x08,0x00,0x8d,0x0a,0x2d,0x08, +0x1d,0xf0,0x00,0x00,0x00,0x80,0x00,0x00,0xc4,0x42,0xfe,0x3f,0x98,0x30,0xf0,0x3f, +0x00,0xd0,0x0f,0xc0,0x20,0x30,0xf0,0x3f,0x10,0x80,0x00,0x00,0x7c,0xc0,0x05,0x40, +0xa8,0xc0,0x05,0x40,0x36,0x41,0x00,0x81,0xfc,0xff,0x0c,0x06,0x80,0x81,0xc0,0x10, +0x18,0x00,0x81,0xfa,0xff,0xe0,0x08,0x00,0x46,0x09,0x00,0x00,0x81,0xf2,0xff,0xbd, +0x01,0x80,0x53,0x63,0xcd,0x05,0x2a,0xa6,0xa5,0x9d,0xff,0x56,0xda,0x09,0x50,0x80, +0x14,0xcc,0x78,0x50,0xb5,0x20,0x10,0xa1,0x20,0xa5,0x93,0xff,0x50,0x33,0xc0,0x5a, +0x66,0x56,0x73,0xfd,0xcc,0x14,0x06,0x1f,0x00,0x21,0x44,0xfe,0x3c,0x7b,0x38,0x02, +0x30,0x20,0x34,0xe0,0x22,0x11,0x20,0xbb,0xc0,0xd6,0x5b,0x00,0xb2,0xa0,0x77,0x20, +0xbb,0xc0,0xa1,0xe1,0xff,0x5b,0xbb,0xe5,0x90,0xff,0xb0,0xa3,0x11,0x81,0x40,0xfe, +0xe0,0x08,0x00,0x21,0xdc,0xff,0x0c,0x4b,0x2a,0x21,0xa9,0x02,0xad,0x02,0x65,0x8f, +0xff,0x21,0x37,0xfe,0xc0,0x20,0x00,0x32,0x22,0x00,0x26,0x13,0xf6,0x31,0xd7,0xff, +0x52,0xa0,0x01,0xc0,0x20,0x00,0x52,0x63,0x00,0xc0,0x20,0x00,0x38,0x02,0x26,0x13, +0xf7,0x21,0x30,0xfe,0x61,0xd3,0xff,0x51,0xd3,0xff,0xa8,0x02,0x6a,0x32,0x81,0x30, +0xfe,0xe0,0x08,0x00,0x3a,0x34,0xa9,0x03,0x4b,0x22,0x57,0x92,0xec,0xc0,0x20,0x00, +0x81,0xd0,0xff,0xe0,0x08,0x00,0x0c,0x02,0x86,0x00,0x00,0x00,0x7c,0xf2,0x1d,0xf0, +0x10,0x40,0xfe,0x3f,0x34,0x40,0xfe,0x3f,0x4c,0xc4,0x00,0x40,0x36,0x41,0x00,0xb0, +0xeb,0x03,0xb0,0xbd,0x04,0x21,0x0b,0xfb,0xdc,0xab,0x1c,0x8c,0xad,0x02,0x81,0xfa, +0xff,0xe0,0x08,0x00,0x31,0xf7,0xff,0x0c,0x18,0x39,0x22,0x31,0xf6,0xff,0x39,0x32, +0x31,0x04,0xfb,0x82,0x43,0x00,0x0c,0x03,0x88,0x02,0xcc,0x88,0x1b,0x33,0x8b,0x22, +0x66,0x33,0xf4,0x86,0x03,0x00,0x88,0x08,0xa8,0x12,0xe0,0x08,0x00,0x16,0xba,0xfe, +0x7c,0xf2,0x06,0x04,0x00,0x31,0xc8,0xfb,0x20,0x63,0x40,0x81,0xd9,0xfb,0x80,0x22, +0x20,0x20,0x73,0x40,0x0c,0x02,0x1d,0xf0,0x3c,0x44,0xfe,0x3f,0x24,0x44,0xfe,0x3f, +0xf8,0xaa,0x00,0x00,0xf4,0xaa,0x00,0x00,0xf0,0xaa,0x00,0x00,0xff,0x7f,0x00,0x00, +0x10,0xab,0x00,0x00,0x1c,0xab,0x00,0x00,0x14,0xab,0x00,0x00,0x18,0xab,0x00,0x00, +0x20,0xab,0x00,0x00,0x00,0xab,0x00,0x00,0x2c,0xab,0x00,0x00,0x24,0xab,0x00,0x00, +0x08,0xab,0x00,0x00,0x30,0xab,0x00,0x00,0x30,0xef,0x05,0x40,0x36,0x41,0x00,0x81, +0xfd,0xff,0x20,0x52,0x20,0x22,0x22,0x06,0x80,0x81,0xc0,0x31,0xeb,0xff,0x20,0x20, +0x04,0x10,0x18,0x00,0x29,0x03,0x65,0xf4,0xff,0x2d,0x0a,0x56,0x7a,0x1d,0xa8,0x25, +0xb8,0x35,0x65,0xb7,0xfe,0x31,0xe5,0xff,0x48,0x05,0x81,0x93,0xff,0x49,0x03,0x48, +0x45,0x8a,0x61,0x49,0x13,0x48,0x15,0x69,0x33,0x49,0x23,0x42,0xc1,0x10,0x49,0x43, +0x49,0x53,0x91,0xe3,0xff,0x31,0xde,0xff,0xa1,0xe3,0xff,0x29,0x06,0x1a,0x99,0x3a, +0x64,0x1a,0xaa,0x29,0x09,0x69,0x0a,0x06,0x63,0x00,0x00,0x00,0x81,0xdd,0xff,0x91, +0xdd,0xff,0x1a,0x88,0x1a,0x99,0x98,0x09,0x88,0x08,0xad,0x09,0x80,0x33,0xc0,0x32, +0x69,0x00,0x31,0xd8,0xff,0x25,0x21,0xff,0x61,0xd8,0xff,0x1a,0x33,0x1a,0x66,0xa9, +0x06,0x16,0x8a,0x15,0x91,0xd6,0xff,0x81,0xd3,0xff,0x1a,0x99,0xa9,0x09,0xa1,0xcd, +0xff,0x1a,0x88,0xaa,0x34,0xa1,0xd2,0xff,0x88,0x08,0x1a,0xaa,0x68,0x08,0x0c,0x1e, +0x39,0x0a,0x06,0x3a,0x00,0x31,0xce,0xff,0x81,0xc5,0xff,0x1a,0x33,0x38,0x03,0xd8, +0x48,0x69,0x03,0x31,0x6c,0xff,0xe8,0x58,0x91,0xcb,0xff,0xa1,0xc0,0xff,0x3a,0x3d, +0xe0,0x33,0xc0,0x9a,0x81,0x39,0x08,0x38,0x2a,0x71,0xbf,0xff,0x20,0xa2,0x20,0x37, +0xb6,0x02,0xa2,0xa0,0x02,0x31,0xbb,0xff,0xa9,0x01,0xa1,0xc0,0xff,0x3a,0x84,0x91, +0xc2,0xff,0x31,0xb6,0xff,0x1a,0xaa,0x1a,0x99,0xb8,0x0a,0x7a,0x74,0xa8,0x33,0x89, +0x09,0xfd,0x07,0x80,0xc8,0x20,0x81,0xc0,0xff,0xe0,0x08,0x00,0x91,0xbb,0xff,0xed, +0x0a,0x1a,0x99,0x98,0x09,0xa8,0x23,0x88,0x09,0x78,0x07,0x80,0xaa,0xc0,0xa9,0x23, +0xa1,0xb3,0xff,0x80,0x66,0xc0,0x1a,0xaa,0xa8,0x0a,0xb8,0x43,0x8a,0x9a,0x88,0x53, +0xa1,0xaf,0xff,0x7a,0x78,0x0b,0x8e,0x1a,0xaa,0x80,0x8e,0x20,0x79,0x53,0x99,0x0a, +0x80,0x8f,0x05,0xb0,0x77,0xc0,0xcc,0xa8,0xa2,0xd7,0x80,0x92,0xa0,0x01,0xa0,0x89, +0x83,0x16,0x98,0x04,0x88,0x13,0x80,0xc7,0x63,0xac,0xfc,0xa1,0xa0,0xff,0xc7,0x3a, +0x06,0x87,0xb7,0x03,0x86,0x22,0x00,0x00,0x81,0x98,0xff,0x0c,0x1a,0xd8,0x08,0x0c, +0x08,0xd0,0xa8,0x83,0x81,0xa2,0xff,0xdd,0x0a,0x1a,0x88,0xa8,0x03,0xe9,0x08,0x25, +0xcb,0xff,0x91,0x9e,0xff,0x1a,0x99,0xe8,0x09,0x56,0x5a,0x06,0x88,0x03,0x7a,0x88, +0x89,0x03,0x88,0x13,0x70,0x78,0xc0,0x79,0x13,0x78,0x43,0x72,0x63,0x05,0x8c,0xe6, +0xa1,0x8b,0xff,0x38,0x1a,0x8c,0x73,0xe0,0x3f,0x31,0xe0,0x33,0xc0,0x96,0x43,0xf0, +0x96,0xee,0x03,0x31,0x86,0xff,0x38,0x13,0xcc,0x6e,0x8c,0x73,0x86,0x0c,0x00,0x00, +0x00,0x00,0x16,0xc3,0x02,0x31,0x88,0xff,0x10,0x33,0x80,0xa2,0x23,0x00,0xe5,0x08, +0xff,0xdc,0x8a,0x61,0x8b,0xff,0x81,0x82,0xff,0x6a,0x31,0x1a,0x88,0x88,0x08,0x38, +0x03,0x3a,0x98,0x81,0x7f,0xff,0x1a,0x88,0x99,0x08,0x46,0x02,0x00,0x7c,0xf2,0xc6, +0x04,0x00,0x7c,0xd2,0x86,0x03,0x00,0x91,0x7a,0xff,0x38,0x15,0x1a,0x99,0x98,0x09, +0x37,0xb9,0x02,0x46,0x99,0xff,0x1d,0xf0,0x20,0x80,0x00,0x00,0x18,0x80,0x00,0x00, +0x14,0x80,0x00,0x00,0x1c,0x80,0x00,0x00,0x30,0x80,0x00,0x00,0x36,0x41,0x00,0x81, +0xfe,0xff,0x20,0x42,0x20,0x22,0x22,0x06,0x80,0x81,0xc0,0x31,0x67,0xff,0x20,0x20, +0x04,0x10,0x18,0x00,0x29,0x03,0x65,0xd3,0xff,0x2d,0x0a,0x56,0x2a,0x16,0xb8,0x34, +0xa8,0x24,0x20,0x62,0x20,0x25,0x96,0xfe,0x31,0x61,0xff,0x58,0x04,0x81,0x0e,0xff, +0x59,0x03,0x58,0x44,0x1a,0x88,0x59,0x13,0x51,0x07,0xff,0x19,0x43,0x5a,0x51,0x19, +0x53,0x59,0x08,0x86,0x4c,0x00,0x00,0x00,0x60,0x88,0xc0,0x50,0xa5,0x20,0x82,0x65, +0x00,0x65,0x02,0xff,0xa0,0x7a,0x20,0x16,0x3a,0x11,0x98,0x05,0xfd,0x0a,0x86,0x34, +0x00,0xa8,0x53,0x88,0x43,0xc1,0xfb,0xfe,0x80,0x8a,0xc0,0x9a,0xb8,0xdd,0x09,0xb7, +0xbc,0x02,0x80,0xdc,0xc0,0xe1,0xdc,0xff,0xcd,0x0d,0x1a,0xee,0x89,0x0e,0xe1,0xdb, +0xff,0xbd,0x0f,0x1a,0xee,0x99,0x0e,0xe1,0xda,0xff,0x1a,0xee,0xd9,0x0e,0xe1,0xd9, +0xff,0x1a,0xee,0xf9,0x0e,0x81,0x07,0xfc,0xe0,0x08,0x00,0xa1,0xd3,0xff,0xb1,0xd4, +0xff,0xc1,0xd2,0xff,0xe1,0xd4,0xff,0x1a,0xaa,0x1a,0xbb,0x1a,0xcc,0x1a,0xee,0xd8, +0x0b,0x88,0x0a,0x98,0x0c,0xa8,0x53,0xf8,0x0e,0xda,0x88,0xd0,0x99,0xc0,0xda,0xff, +0xda,0xda,0xa8,0x13,0x0c,0x1b,0x80,0xaa,0xc0,0x0c,0x0c,0xa0,0xcb,0x83,0xd9,0x53, +0xc0,0xa0,0x74,0x56,0x8a,0x00,0xc2,0xd8,0x80,0xc0,0xab,0x83,0x16,0x4a,0x05,0xa1, +0x32,0xff,0xe1,0xc1,0xff,0xd8,0x0a,0x0c,0x1b,0x0c,0x0a,0xd0,0xab,0x93,0x1a,0xee, +0xb8,0x43,0xdd,0x0a,0xa8,0x03,0x89,0x0e,0xe1,0xbd,... [truncated message content] |