From 809b234c2b9cd5fb3fe3bc6f7611cc30b9fe40c8 Mon Sep 17 00:00:00 2001 From: root Date: Wed, 14 Jun 2017 09:10:58 +0100 Subject: initial commit --- Makefile | 1 + serial_over_dp.c | 815 ++++++++++++++++++++++++++++++++++ serial_over_speaker.c | 572 ++++++++++++++++++++++++ stm32f1/serial_over_dp.hex | 1043 ++++++++++++++++++++++++++++++++++++++++++++ stm32f1/usbdfu.hex | 393 +++++++++++++++++ 5 files changed, 2824 insertions(+) create mode 100644 Makefile create mode 100644 serial_over_dp.c create mode 100644 serial_over_speaker.c create mode 100644 stm32f1/serial_over_dp.hex create mode 100644 stm32f1/usbdfu.hex diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..ecdf4a0 --- /dev/null +++ b/Makefile @@ -0,0 +1 @@ +all: serial_over_speaker serial_over_dp diff --git a/serial_over_dp.c b/serial_over_dp.c new file mode 100644 index 0000000..20d55d9 --- /dev/null +++ b/serial_over_dp.c @@ -0,0 +1,815 @@ +#include +#include +#include +#include + +/* + * Linux won't let us access the MMIO bars from userland, becasue of a + * conflict in the PAT mappings. However Intel added a way of writing + * to the MMIO region using only IO port writes for their 16 bit video + * BIOS. So we use that. + * + * If you're in a kernel, you can write directly, and define this + * + */ + +#undef USE_MMIO + +/* PCI registers */ + +#define PCI_VENDOR_ID 0x00 +#define PCI_DEVICE_ID 0x02 +#define PCI_CLASS_DEVICE 0x0a + +#define PCI_BASE_ADDRESS(i) (0x10 + (i<< 2)) +#define PCI_BASE_ADDRESS_0 PCI_BASE_ADDRESS(0) + +#define PCI_NR_BASE_ADDRESS 6 + +#define PCI_BASE_ADDRESS_SPACE_IO (0x01UL) +#define PCI_BASE_ADDRESS_IO_MASK (~0x07UL) +#define PCI_BASE_ADDRESS_MEM_MASK (~0x0fUL) +#define PCI_BASE_ADDRESS_TYPE_MASK (0x06UL) +#define PCI_BASE_ADDRESS_TYPE_64BIT (0x04UL) +#define PCI_BASE_ADDRESS_PREFETCHABLE (0x08UL) + +/* Intel GPU registers */ +#define IGFX_PCH_OFFSET 0xc0000 + +#define IGFX_GPIOA 0x05010 +#define IGFX_GPIO(port) ((IGFX_GPIOA) + ((port) << 2)) +#define IGFX_NUM_PORTS 6 + +#define IGFX_GMBUS0 0x05100 +#define IGFX_GMBUS4 0x05110 + +/* + * These look like independent bits, but on the other + * side it's implemented by a uC. The uC programmers + * have implemented it as an RPC-a-like interface so + * so it gets confused if you change more than one + * set of pins at a time. + */ + +#define GPIO_CLOCK_DIR_MASK (1 << 0) +#define GPIO_CLOCK_DIR_IN (0 << 1) +#define GPIO_CLOCK_DIR_OUT (1 << 1) +#define GPIO_CLOCK_VAL_MASK (1 << 2) +#define GPIO_CLOCK_VAL_OUT (1 << 3) +#define GPIO_CLOCK_VAL_IN (1 << 4) +#define GPIO_CLOCK_PULLUP_DISABLE (1 << 5) +#define GPIO_DATA_DIR_MASK (1 << 8) +#define GPIO_DATA_DIR_IN (0 << 9) +#define GPIO_DATA_DIR_OUT (1 << 9) +#define GPIO_DATA_VAL_MASK (1 << 10) +#define GPIO_DATA_VAL_OUT (1 << 11) +#define GPIO_DATA_VAL_IN (1 << 12) +#define GPIO_DATA_PULLUP_DISABLE (1 << 13) + +/* I2C addresses (left shifted by one) */ + +#define I2C_EEPROM_ADDRESS 0xA0 +#define I2C_SC16IS7XX_ADDRESS 0x90 + +#define I2C_READ 1 +#define I2C_WRITE 0 + +/* 16550 registers */ + +#define BAUD_BASE 1843200 + +#define RXR ((0)) +#define TXR ((0)) +#define DLLR ((0)) + +#define IER ((1)) +#define DLHR ((1)) + +#define IIR ((2)) +#define FCR ((2)) + +#define LCR ((3)) +#define LCR_WS0 (1<<0) +#define LCR_WS1 (1<<1) +#define LCR_NSTOP (1<<2) +#define LCR_PARITY_ENABLE (1<<3) +#define LCR_EVEN_PARITY (1<<4) +#define LCR_STUCK_PARITY (1<<5) +#define LCR_BREAK (1<<6) +#define LCR_DLAB (1<<7) + +#define MCR ((4)) +#define MCR_DTR (1<<0) +#define MCR_RTS (1<<1) +#define MCR_AUX1 (1<<2) +#define MCR_AUX2 (1<<3) +#define MCR_LOOP (1<<4) +#define MCR_AUTOFLOW (1<<5) + +#define LSR ((5)) +#define LSR_DA (1<<0) +#define LSR_OR (1<<1) +#define LSR_PE (1<<2) +#define LSR_FE (1<<3) +#define LSR_BRK (1<<4) +#define LSR_THRE (1<<5) +#define LSR_THREI (1<<6) +#define LSR_FIFOE (1<<7) + +#define MSR ((6)) + +#define TXR_NOINC ((TXR) | (1UL << 4)) + +#define BAUD_RATE 115200 + + +/* intrinsics */ + +static inline void +out_8 (uint16_t port, uint8_t value) +{ + asm volatile ("outb %b0,%w1"::"a" (value), "Nd" (port)); +} + + +static inline uint8_t +in_8 (uint16_t port) +{ + uint8_t ret; + asm volatile ("inb %w1,%b0":"=a" (ret):"Nd" (port)); + return ret; +} + + +static inline uint16_t +in_16 (uint16_t port) +{ + uint16_t ret; + asm volatile ("inw %w1,%w0":"=a" (ret):"Nd" (port)); + return ret; +} + +static inline void +out_16 (uint16_t port, uint16_t value) +{ + asm volatile ("outw %w0,%w1"::"a" (value), "Nd" (port)); +} + +static inline void +out_32 (uint16_t port, uint32_t value) +{ + asm volatile ("outl %d0,%w1"::"a" (value), "Nd" (port)); +} + +static inline uint32_t +in_32 (uint16_t port) +{ + uint32_t ret; + asm volatile ("inl %w1,%d0":"=a" (ret):"Nd" (port)); + return ret; +} + +static inline void +io_delay (void) +{ + out_8 (0x80, 0x0); +} + +static inline void +write_32 (volatile void *addr, uint32_t val) +{ + asm volatile ("mov" "l" " %0,%1"::"r" (val), + "m" (*(volatile uint32_t *) addr):"memory"); +} + +static inline uint32_t +read_32 (const volatile void *addr) +{ + uint32_t ret; + asm volatile ("mov" "l" + " %1,%0":"=r" (ret):"m" (*(volatile uint32_t *) + addr):"memory"); + return ret; +} + + +/* PCI */ + +static uint16_t +pci_conf1_read_16 (int bus, int slot, int fn, int off) +{ + int addr = 0xcfc + (off & 3); + out_32 (0x0cf8, + 0x80000000 | (bus << 16) | (slot << 11) | (fn << 8) | (off & ~3)); + return in_16 (addr); +} + +static uint32_t +pci_conf1_read_32 (int bus, int slot, int fn, int off) +{ + int addr = 0xcfc + (off & 3); + out_32 (0x0cf8, + 0x80000000 | (bus << 16) | (slot << 11) | (fn << 8) | (off & ~3)); + return in_32 (addr); +} + + +/* IGFX */ + +static uint64_t igfx_mmio_base; + +static int +igfx_set_mmio_base (void) +{ + uint16_t vid, class; + unsigned b = 0, d = 2, f = 0; + uint64_t bar; + unsigned i; + + igfx_mmio_base = 0; + + vid = pci_conf1_read_32 (b, d, f, PCI_VENDOR_ID); + + if (vid != 0x8086) + return 0; + + class = pci_conf1_read_16 (b, d, f, PCI_CLASS_DEVICE); + + if (class != 0x300) + return -1; + + for (i = 0; i < PCI_NR_BASE_ADDRESS; i++) + { + bar = pci_conf1_read_32 (b, d, f, PCI_BASE_ADDRESS (i)); + + if (!bar) + continue; + +#ifdef USE_MMIO + + if (!bar) + continue; + + if (bar & PCI_BASE_ADDRESS_SPACE_IO) + continue; + + if ((bar & PCI_BASE_ADDRESS_TYPE_MASK) == PCI_BASE_ADDRESS_TYPE_64BIT) + { + i++; + bar |= + ((uint64_t) pci_conf1_read_32 (b, d, f, PCI_BASE_ADDRESS (i))) << + 32; + } + + if (bar & PCI_BASE_ADDRESS_PREFETCHABLE) + continue; + + igfx_mmio_base = bar & ~0xfULL; +#else + if (!(bar & PCI_BASE_ADDRESS_SPACE_IO)) + continue; + + igfx_mmio_base = bar & ~0xfULL; +#endif + + return 0; + } + + return -1; +} + + +static void +igfx_write_32 (uint32_t reg, uint32_t val) +{ +#ifdef USE_MMIO + uint32_t *p = (uint32_t *) (igfx_mmio_base + reg); +#endif + + if (!igfx_mmio_base) + return; + +#ifdef USE_MMIO + write_32 (p, val); +#else + out_32 (igfx_mmio_base, reg); + out_32 (igfx_mmio_base + 4, val); +#endif +} + + +static uint32_t +igfx_read_32 (uint32_t reg) +{ +#ifdef USE_MMIO + uint32_t *p = (uint32_t *) (igfx_mmio_base + reg); +#endif + + if (!igfx_mmio_base) + return ~0; + +#ifdef USE_MMIO + return read_32 (p); +#else + out_32 (igfx_mmio_base, reg); + return in_32 (igfx_mmio_base + 4); +#endif +} + +/* IGFX GPIO */ + +static uint64_t igfx_gpio_ctl; + +static int +igfx_set_gpio_ctl (unsigned port) +{ + igfx_gpio_ctl = 0; + + if (igfx_set_mmio_base ()) + return -1; + + igfx_gpio_ctl = IGFX_PCH_OFFSET + IGFX_GPIO (port); + + return 0; +} + +static inline void +igfx_write_gpio_ctl (uint32_t v) +{ + igfx_write_32 (igfx_gpio_ctl, v); + igfx_read_32 (igfx_gpio_ctl); +} + + +static inline uint32_t +igfx_read_gpio_ctl (void) +{ + igfx_read_32 (igfx_gpio_ctl); + return igfx_read_32 (igfx_gpio_ctl); +} + +/* I2C bits */ + +static void +i2c_set_scl (int clk) +{ + igfx_write_gpio_ctl (clk ? (GPIO_CLOCK_DIR_IN | GPIO_CLOCK_DIR_MASK) + : (GPIO_CLOCK_DIR_OUT | GPIO_CLOCK_DIR_MASK | + GPIO_CLOCK_VAL_MASK)); +} + + +static void +i2c_set_sda (int dat) +{ + igfx_write_gpio_ctl (dat ? (GPIO_DATA_DIR_IN | GPIO_DATA_DIR_MASK) + : (GPIO_DATA_DIR_OUT | GPIO_DATA_DIR_MASK | + GPIO_DATA_VAL_MASK)); +} + +static int +i2c_get_scl (void) +{ + return ! !(igfx_read_gpio_ctl () & GPIO_CLOCK_VAL_IN); +} + + +static int +i2c_get_sda (void) +{ + return ! !(igfx_read_gpio_ctl () & GPIO_DATA_VAL_IN); +} + +static void +i2c_bit_wait (void) +{ + io_delay (); +} + +static void +i2c_wait_scl (void) +{ + static int no_wait_scl = 0; + unsigned n = 1000; + + if (i2c_get_scl ()) + { + no_wait_scl = 0; + return; + } + + if (no_wait_scl == 1) + return; + + while (!i2c_get_scl ()) + { + if (!(n--)) + { + no_wait_scl = 1; + return; + } + + i2c_bit_wait (); + } +} + + +/* I2C protocol */ + +static void +i2c_start (void) +{ + i2c_set_scl (1); + i2c_set_sda (1); + i2c_bit_wait (); + + i2c_set_sda (0); + i2c_bit_wait (); + + i2c_set_scl (0); + i2c_bit_wait (); +} + +static void +i2c_write_bit (int b) +{ + i2c_set_scl (0); + i2c_set_sda (b); + i2c_bit_wait (); + + + i2c_set_scl (1); + i2c_bit_wait (); + i2c_wait_scl (); + + i2c_set_scl (0); + i2c_bit_wait (); +} + +/* Send a stop signal to the I2C bus */ +static void +i2c_stop () +{ + + i2c_set_sda (0); + i2c_set_scl (0); + i2c_bit_wait (); + + i2c_set_scl (1); + i2c_bit_wait (); + + i2c_set_sda (1); + i2c_bit_wait (); +} + +/* Write the specified number of bits to the I2C bus (msb first) */ +static void +i2c_write_bits (uint32_t d, unsigned n) +{ + uint32_t c; + + for (c = 1 << (n - 1); c; c >>= 1) + i2c_write_bit (d & c); +} + +static int +i2c_read_bit (void) +{ + int ret; + + i2c_set_sda (1); + i2c_set_scl (0); + i2c_bit_wait (); + + i2c_set_scl (1); + i2c_bit_wait (); + i2c_wait_scl (); + + ret = i2c_get_sda (); + + i2c_set_scl (0); + i2c_bit_wait (); + + return ret; +} + + +static uint32_t +i2c_read_bits (unsigned n) +{ + uint32_t ret = 0; + + while (n--) + { + ret <<= 1; + ret |= i2c_read_bit ()? 1 : 0; + } + + return ret; +} + +static int +i2c_read_bytes (uint8_t * buf, size_t n) +{ + while (n--) + { + *(buf++) = i2c_read_bits (8); + i2c_write_bit (!n); /*Don't ACK last byte */ + } + + return 0; +} + +static int +i2c_write_bytes (uint8_t * buf, size_t n) +{ + while (n--) + { + i2c_write_bits (*(buf++), 8); + + if (i2c_read_bit ()) /*check ACK */ + return -1; + } + + return 0; +} + + +static int +i2c_read (uint8_t i2c_addr, uint8_t dev_addr, uint8_t * buf, size_t n) +{ + int ret = -1; + + i2c_start (); + i2c_write_bits (i2c_addr | I2C_WRITE, 8); + + do + { + if (i2c_read_bit ()) /*check ACK */ + break; + + i2c_write_bits (dev_addr, 8); + + if (i2c_read_bit ()) /*check ACK */ + break; + + if (n) + { + i2c_start (); + i2c_write_bits (i2c_addr | I2C_READ, 8); + + if (i2c_read_bit ()) /*check ACK */ + break; + + if (i2c_read_bytes (buf, n)) + break; + } + + + ret = 0; + + + } + while (0); + + + i2c_stop (); + + return ret; +} + +static int +i2c_write (uint8_t i2c_addr, uint8_t dev_addr, uint8_t * buf, size_t n) +{ + int ret = -1; + + i2c_start (); + i2c_write_bits (i2c_addr | I2C_WRITE, 8); + + do + { + if (i2c_read_bit ()) /*check ACK */ + break; + + i2c_write_bits (dev_addr, 8); + + if (i2c_read_bit ()) /*check ACK */ + break; + + if (n && i2c_write_bytes (buf, n)) + break; + + ret = 0; + + } + while (0); + + + i2c_stop (); + + return ret; +} + +static int +i2c_test_state (int s_sda, int s_scl) +{ + int g_sda, g_scl; + + s_sda = ! !s_sda; + s_scl = ! !s_scl; + + i2c_set_scl (s_scl); + i2c_set_sda (s_sda); + i2c_bit_wait (); + g_scl = i2c_get_scl (); + g_sda = i2c_get_sda (); + + if ((g_scl != s_scl) || (g_sda != s_sda)) + return 1; + + return 0; +} + + +static int +i2c_test_adapter (void) +{ + int ret = 0; + ret |= i2c_test_state (1, 1); + ret |= i2c_test_state (0, 1); + ret |= i2c_test_state (0, 0); + ret |= i2c_test_state (0, 1); + ret |= i2c_test_state (1, 1); + return ret; +} + +static int +i2c_init_adapter (unsigned port) +{ + + if (igfx_set_gpio_ctl (port)) + return -1; + + if (i2c_test_adapter ()) + return -1; + + return 0; +} + +/* serial port */ + + +static uint8_t +serial_read_reg (unsigned reg) +{ + uint8_t val = 0; + i2c_read (I2C_SC16IS7XX_ADDRESS, reg, &val, 1); + return val; +} + + +static void +serial_write_reg (unsigned reg, uint8_t val) +{ + i2c_write (I2C_SC16IS7XX_ADDRESS, reg, &val, 1); +} + +static void +serial_write_reg_buf (unsigned reg, uint8_t * buf, size_t len) +{ + i2c_write (I2C_SC16IS7XX_ADDRESS, reg, buf, len); +} + + +static int +serial_probe (void) +{ + uint8_t ier, lcr, dlh; + + lcr = serial_read_reg (LCR); + serial_write_reg (LCR, lcr | LCR_DLAB); + dlh = serial_read_reg (DLHR); + serial_write_reg (DLHR, 0x55); + serial_write_reg (LCR, lcr); + + ier = serial_read_reg (IER); + serial_write_reg (IER, 0x00); + + if (serial_read_reg (IER) != 0x00) + return 1; + + serial_write_reg (IER, ier); + + serial_write_reg (LCR, lcr | LCR_DLAB); + + if (serial_read_reg (DLHR) != 0x55) + return 1; + + serial_write_reg (DLHR, 0xaa); + + if (serial_read_reg (DLHR) != 0xaa) + return 1; + + serial_write_reg (DLHR, dlh); + serial_write_reg (LCR, lcr); + + return 0; +} + + +static void +serial_set_baud (unsigned baud) +{ + uint32_t divisor = (BAUD_BASE >> 4) / baud; + uint8_t lcr; + + lcr = serial_read_reg (LCR); + serial_write_reg (LCR, lcr | LCR_DLAB); + + serial_write_reg (DLHR, divisor >> 8); + serial_write_reg (DLLR, divisor & 0xff); + + serial_write_reg (LCR, lcr); +} + + +void +serial_init (void) +{ + + serial_write_reg (FCR, 0x6); /*disable FIFOs and reset */ + serial_write_reg (IER, 0); /* no interrupts */ + + /* Clear all interrupts */ + serial_read_reg (IIR); + serial_read_reg (MSR); + serial_read_reg (RXR); + serial_read_reg (LSR); + + serial_set_baud (BAUD_RATE); + + serial_write_reg (LCR, LCR_WS0 | LCR_WS1); /*8 bits, 1 stop bit, no parity */ + serial_write_reg (MCR, MCR_RTS | MCR_DTR); /*rts and dtr on */ +} + + +void +serial_write (void *buf, size_t len) +{ +/* + * If we were to use a real SC16IS7XX + * we'd not be able to use this special + * extra non-incrementing register + * and we'd also have to check the THRE + * bit first + */ + + serial_write_reg_buf (TXR_NOINC, buf, len); +} + + + +/* main */ + +int +find_serial (void) +{ + unsigned i; + + for (i = 0; i < IGFX_NUM_PORTS; ++i) + { + if (i2c_init_adapter (i)) + continue; + + printf ("Found active IGFX I2C bus %d\n", i); + + if (serial_probe ()) + continue; + + printf ("Serial port found on IGFX I2C bus %d\n", i); + return 0; + + } + printf ("Serial port not found\n"); + return -1; +} + + +/* main */ + +int +main (int argc, char *argv[]) +{ + char msg[] = "The quick brown fox jumps over the lazy dog\r\n"; + + iopl (3); + + if (find_serial ()) + return -1; + + serial_init (); + + serial_write (msg, sizeof (msg)); + + return 0; +} diff --git a/serial_over_speaker.c b/serial_over_speaker.c new file mode 100644 index 0000000..9995123 --- /dev/null +++ b/serial_over_speaker.c @@ -0,0 +1,572 @@ +#include +#include +#include +#include + +#define BASE_CLK 1193180 +#define F 2200 + +#define DIVISOR (BASE_CLK /F) + +#define PIT_MCR_CH2 (2UL << 6) +#define PIT_MCR_AM_LOHI (3UL << 4) +#define PIT_MCR_MODE0 (0UL << 1) +#define PIT_MCR_MODE3 (3UL << 1) + +#define PIT_DATA_CH2 0x42 +#define PIT_MCR 0x43 + +#define PORTB 0x61 +#define PORTB_SP_GATE (1 << 1) +#define PORTB_SP_CH2_GATE (1 << 0) +#define PORTB_SP_STATUS (1 << 5) + +static inline uint64_t +rdtsc (void) +{ + uint32_t low, high; + __asm__ __volatile__ ("rdtsc":"=a" (low), "=d" (high)); + return ((uint64_t) high << 32) | low; +} + +static inline void +sti (void) +{ + __asm__ __volatile__ ("sti"); +} + +static inline void +cli (void) +{ + __asm__ __volatile__ ("cli"); +} + +static inline void +out_8 (uint16_t port, uint8_t value) +{ + asm volatile ("outb %b0,%w1"::"a" (value), "Nd" (port)); +} + + +static inline uint8_t +in_8 (uint16_t port) +{ + uint8_t ret; + asm volatile ("inb %w1,%b0":"=a" (ret):"Nd" (port)); + return ret; +} + + +static uint64_t t_f, t_b; +static int p = 0, f = 0; +static uint64_t tsc_baud, tsc_2f; +static unsigned baud; + +static const char *varicode_fsk[] = { + "1010101011", /* 0 - */ + "1011011011", /* 1 - */ + "1011101101", /* 2 - */ + "1101110111", /* 3 - */ + "1011101011", /* 4 - */ + "1101011111", /* 5 - */ + "1011101111", /* 6 - */ + "1011111101", /* 7 - */ + "1011111111", /* 8 - */ + "11101111", /* 9 - */ + "11101", /* 10 - */ + "1101101111", /* 11 - */ + "1011011101", /* 12 - */ + "11111", /* 13 - */ + "1101110101", /* 14 - */ + "1110101011", /* 15 - */ + "1011110111", /* 16 - */ + "1011110101", /* 17 - */ + "1110101101", /* 18 - */ + "1110101111", /* 19 - */ + "1101011011", /* 20 - */ + "1101101011", /* 21 - */ + "1101101101", /* 22 - */ + "1101010111", /* 23 - */ + "1101111011", /* 24 - */ + "1101111101", /* 25 - */ + "1110110111", /* 26 - */ + "1101010101", /* 27 - */ + "1101011101", /* 28 - */ + "1110111011", /* 29 - */ + "1011111011", /* 30 - */ + "1101111111", /* 31 - */ + "1", /* 32 - */ + "111111111", /* 33 - ! */ + "101011111", /* 34 - '"' */ + "111110101", /* 35 - # */ + "111011011", /* 36 - $ */ + "1011010101", /* 37 - % */ + "1010111011", /* 38 - & */ + "101111111", /* 39 - ' */ + "11111011", /* 40 - ( */ + "11110111", /* 41 - ) */ + "101101111", /* 42 - * */ + "111011111", /* 43 - + */ + "1110101", /* 44 - , */ + "110101", /* 45 - - */ + "1010111", /* 46 - . */ + "110101111", /* 47 - / */ + "10110111", /* 48 - 0 */ + "10111101", /* 49 - 1 */ + "11101101", /* 50 - 2 */ + "11111111", /* 51 - 3 */ + "101110111", /* 52 - 4 */ + "101011011", /* 53 - 5 */ + "101101011", /* 54 - 6 */ + "110101101", /* 55 - 7 */ + "110101011", /* 56 - 8 */ + "110110111", /* 57 - 9 */ + "11110101", /* 58 - : */ + "110111101", /* 59 - ; */ + "111101101", /* 60 - < */ + "1010101", /* 61 - = */ + "111010111", /* 62 - > */ + "1010101111", /* 63 - ? */ + "1010111101", /* 64 - @ */ + "1111101", /* 65 - A */ + "11101011", /* 66 - B */ + "10101101", /* 67 - C */ + "10110101", /* 68 - D */ + "1110111", /* 69 - E */ + "11011011", /* 70 - F */ + "11111101", /* 71 - G */ + "101010101", /* 72 - H */ + "1111111", /* 73 - I */ + "111111101", /* 74 - J */ + "101111101", /* 75 - K */ + "11010111", /* 76 - L */ + "10111011", /* 77 - M */ + "11011101", /* 78 - N */ + "10101011", /* 79 - O */ + "11010101", /* 80 - P */ + "111011101", /* 81 - Q */ + "10101111", /* 82 - R */ + "1101111", /* 83 - S */ + "1101101", /* 84 - T */ + "101010111", /* 85 - U */ + "110110101", /* 86 - V */ + "101011101", /* 87 - W */ + "101110101", /* 88 - X */ + "101111011", /* 89 - Y */ + "1010101101", /* 90 - Z */ + "111110111", /* 91 - [ */ + "111101111", /* 92 - \ */ + "111111011", /* 93 - ] */ + "1010111111", /* 94 - ^ */ + "101101101", /* 95 - _ */ + "1011011111", /* 96 - ` */ + "1011", /* 97 - a */ + "1011111", /* 98 - b */ + "101111", /* 99 - c */ + "101101", /* 100 - d */ + "11", /* 101 - e */ + "111101", /* 102 - f */ + "1011011", /* 103 - g */ + "101011", /* 104 - h */ + "1101", /* 105 - i */ + "111101011", /* 106 - j */ + "10111111", /* 107 - k */ + "11011", /* 108 - l */ + "111011", /* 109 - m */ + "1111", /* 110 - n */ + "111", /* 111 - o */ + "111111", /* 112 - p */ + "110111111", /* 113 - q */ + "10101", /* 114 - r */ + "10111", /* 115 - s */ + "101", /* 116 - t */ + "110111", /* 117 - u */ + "1111011", /* 118 - v */ + "1101011", /* 119 - w */ + "11011111", /* 120 - x */ + "1011101", /* 121 - y */ + "111010101", /* 122 - z */ + "1010110111", /* 123 - { */ + "110111011", /* 124 - | */ + "1010110101", /* 125 - } */ + "1011010111", /* 126 - ~ */ + "1110110101", /* 127 - */ + "1110111101", /* 128 - */ + "1110111111", /* 129 - */ + "1111010101", /* 130 - */ + "1111010111", /* 131 - */ + "1111011011", /* 132 - */ + "1111011101", /* 133 - */ + "1111011111", /* 134 - */ + "1111101011", /* 135 - */ + "1111101101", /* 136 - */ + "1111101111", /* 137 - */ + "1111110101", /* 138 - */ + "1111110111", /* 139 - */ + "1111111011", /* 140 - */ + "1111111101", /* 141 - */ + "1111111111", /* 142 - */ + "10101010101", /* 143 - */ + "10101010111", /* 144 - */ + "10101011011", /* 145 - */ + "10101011101", /* 146 - */ + "10101011111", /* 147 - */ + "10101101011", /* 148 - */ + "10101101101", /* 149 - */ + "10101101111", /* 150 - */ + "10101110101", /* 151 - */ + "10101110111", /* 152 - */ + "10101111011", /* 153 - */ + "10101111101", /* 154 - */ + "10101111111", /* 155 - */ + "10110101011", /* 156 - */ + "10110101101", /* 157 - */ + "10110101111", /* 158 - */ + "10110110101", /* 159 - */ + "10110110111", /* 160 - */ + "10110111011", /* 161 - */ + "10110111101", /* 162 - */ + "10110111111", /* 163 - */ + "10111010101", /* 164 - */ + "10111010111", /* 165 - */ + "10111011011", /* 166 - */ + "10111011101", /* 167 - */ + "10111011111", /* 168 - */ + "10111101011", /* 169 - */ + "10111101101", /* 170 - */ + "10111101111", /* 171 - */ + "10111110101", /* 172 - */ + "10111110111", /* 173 - */ + "10111111011", /* 174 - */ + "10111111101", /* 175 - */ + "10111111111", /* 176 - */ + "11010101011", /* 177 - */ + "11010101101", /* 178 - */ + "11010101111", /* 179 - */ + "11010110101", /* 180 - */ + "11010110111", /* 181 - */ + "11010111011", /* 182 - */ + "11010111101", /* 183 - */ + "11010111111", /* 184 - */ + "11011010101", /* 185 - */ + "11011010111", /* 186 - */ + "11011011011", /* 187 - */ + "11011011101", /* 188 - */ + "11011011111", /* 189 - */ + "11011101011", /* 190 - */ + "11011101101", /* 191 - */ + "11011101111", /* 192 - */ + "11011110101", /* 193 - */ + "11011110111", /* 194 - */ + "11011111011", /* 195 - */ + "11011111101", /* 196 - */ + "11011111111", /* 197 - */ + "11101010101", /* 198 - */ + "11101010111", /* 199 - */ + "11101011011", /* 200 - */ + "11101011101", /* 201 - */ + "11101011111", /* 202 - */ + "11101101011", /* 203 - */ + "11101101101", /* 204 - */ + "11101101111", /* 205 - */ + "11101110101", /* 206 - */ + "11101110111", /* 207 - */ + "11101111011", /* 208 - */ + "11101111101", /* 209 - */ + "11101111111", /* 210 - */ + "11110101011", /* 211 - */ + "11110101101", /* 212 - */ + "11110101111", /* 213 - */ + "11110110101", /* 214 - */ + "11110110111", /* 215 - */ + "11110111011", /* 216 - */ + "11110111101", /* 217 - */ + "11110111111", /* 218 - */ + "11111010101", /* 219 - */ + "11111010111", /* 220 - */ + "11111011011", /* 221 - */ + "11111011101", /* 222 - */ + "11111011111", /* 223 - */ + "11111101011", /* 224 - */ + "11111101101", /* 225 - */ + "11111101111", /* 226 - */ + "11111110101", /* 227 - */ + "11111110111", /* 228 - */ + "11111111011", /* 229 - */ + "11111111101", /* 230 - */ + "11111111111", /* 231 - */ + "101010101011", /* 232 - */ + "101010101101", /* 233 - */ + "101010101111", /* 234 - */ + "101010110101", /* 235 - */ + "101010110111", /* 236 - */ + "101010111011", /* 237 - */ + "101010111101", /* 238 - */ + "101010111111", /* 239 - */ + "101011010101", /* 240 - */ + "101011010111", /* 241 - */ + "101011011011", /* 242 - */ + "101011011101", /* 243 - */ + "101011011111", /* 244 - */ + "101011101011", /* 245 - */ + "101011101101", /* 246 - */ + "101011101111", /* 247 - */ + "101011110101", /* 248 - */ + "101011110111", /* 249 - */ + "101011111011", /* 250 - */ + "101011111101", /* 251 - */ + "101011111111", /* 252 - */ + "101101010101", /* 253 - */ + "101101010111", /* 254 - */ + "101101011011" /* 255 - */ +}; + +static void +program_pit_ch2 (uint32_t divisor, uint8_t mode) +{ + + out_8 (PIT_MCR, PIT_MCR_CH2 | PIT_MCR_AM_LOHI | mode); + + out_8 (PIT_DATA_CH2, divisor & 0xff); + out_8 (PIT_DATA_CH2, divisor >> 8); +} + + +static void +set_mask (int mask, uint8_t what) +{ + uint8_t v; + + v = in_8 (PORTB); + + if (mask) + v &= ~(what); + else + v |= what; + + out_8 (PORTB, v); +} + +static void +count_cycles (unsigned num) +{ + + while (num--) + { + while (!(in_8 (PORTB) & PORTB_SP_STATUS)); + while (in_8 (PORTB) & PORTB_SP_STATUS); + } + +} + + + +static void +give_to_pit (void) +{ + uint64_t t; + + set_mask (1, PORTB_SP_CH2_GATE); + program_pit_ch2 (DIVISOR, PIT_MCR_MODE3); + + + for (;;) + { + t = rdtsc (); + + if (t > t_f) + { + t_f += tsc_2f; + f = !f; + + if (f ^ p) + { + set_mask (1, PORTB_SP_GATE); + set_mask (0, PORTB_SP_CH2_GATE); + set_mask (0, PORTB_SP_GATE); + return; + } + else + { + set_mask (0, PORTB_SP_GATE); + } + } + } + +} + + +void +take_from_pit (void) +{ + uint64_t t; + + t = rdtsc (); + + while (t_b < t) + t_b += tsc_baud; + + while (!(in_8 (PORTB) & PORTB_SP_STATUS)); /*Low */ + while ((in_8 (PORTB) & PORTB_SP_STATUS)); /*High */ + t_f = rdtsc (); + set_mask (1, PORTB_SP_GATE | PORTB_SP_CH2_GATE); + + t_f += tsc_2f; + + while (t_b < t_f) + t_b += tsc_baud; +} + + +static void +start (void) +{ +/* This gets OUT2 from the 8254 high*/ + set_mask (1, PORTB_SP_CH2_GATE); + t_b = t_f = rdtsc (); +} + + + + +static void +send_bit_raw (int b) +{ + uint64_t t; + + if (!b) + p = !p; + + t_b += tsc_baud; + + while ((t = rdtsc ()) < t_b) + { + if (t > t_f) + { + t_f += tsc_2f; + f = !f; + set_mask (f ^ p, PORTB_SP_GATE); + } + } + +} + +static void +send_bit (int b) +{ + send_bit_raw (b); +} + + +static void +stop (void) +{ + set_mask (1, PORTB_SP_GATE | PORTB_SP_CH2_GATE); +} + + +static void +send_sync (int bits, int bit) +{ + + if (bit == 2) + { + bits >>= 1; + + while (bits--) + { + send_bit (1); + send_bit (0); + } + } + else + { + while (bits--) + send_bit (bit); + } +} + +static void +send_char (uint8_t c) +{ + const char *v = varicode_fsk[c]; + + if (!v) + return; + + while (*v) + send_bit (*(v++) - '0'); + + send_bit (0); + send_bit (0); +} + + +void +modem_xmit (void *_buf, size_t buf_len) +{ + uint8_t *buf = _buf; + take_from_pit (); + + send_sync (baud / 5, 0); + send_char (0); + + while (buf_len--) + send_char (*(buf++)); + + give_to_pit (); +} + + + +void +modem_on (unsigned _baud) +{ + uint64_t tsc, tsc_start; + + baud = _baud; + + program_pit_ch2 (DIVISOR, PIT_MCR_MODE3); + set_mask (0, PORTB_SP_GATE | PORTB_SP_CH2_GATE); + + count_cycles (10); + tsc_start = rdtsc (); + count_cycles (F); + tsc = rdtsc (); + + tsc -= tsc_start; + + tsc_baud = (tsc / baud); + tsc_2f = (tsc / (2 * F)); + + + start (); + send_sync (baud * 2, 0); + + give_to_pit (); +} + +void +modem_off (void) +{ + take_from_pit (); + send_sync (150, 1); + stop (); +} + +int +main (int argc, char *argv[]) +{ + char msg[] = "The quick brown fox jumps over the lazy dog\r\n"; + + iopl (3); + cli (); + + modem_on (125); + modem_xmit (msg, sizeof (msg)); + modem_off (); + + sti (); + + return 0; +} diff --git a/stm32f1/serial_over_dp.hex b/stm32f1/serial_over_dp.hex new file mode 100644 index 0000000..f5b5406 --- /dev/null +++ b/stm32f1/serial_over_dp.hex @@ -0,0 +1,1043 @@ +:020000040800F2 +:1020000000500020DD3A0008DB3A0008D93A000809 +:10201000D93A0008D93A0008D93A0008000000006F +:10202000000000000000000000000000DB3A000893 +:10203000DB3A000800000000DB3A00087D280008B9 +:10204000D93A0008D93A0008D93A0008D93A000824 +:10205000D93A0008D93A0008D93A0008D93A000814 +:10206000D93A0008D93A0008D93A0008D93A000804 +:10207000D93A0008D93A0008D93A0008D93A0008F4 +:10208000D93A0008D93A0008D93A0008D93A0008E4 +:10209000D93A0008D93A0008D93A0008D93A0008D4 +:1020A000D93A0008D93A0008D93A0008D93A0008C4 +:1020B000D93A0008D93A0008D93A00081927000887 +:1020C00015270008D93A0008D93A0008D93A00087B +:1020D000D93A0008B9250008D93A0008D93A0008C9 +:1020E000D93A0008D93A0008D93A0008D93A000884 +:1020F000D93A0008D93A0008D93A0008D93A000874 +:10210000D93A0008D93A0008D93A0008D93A000863 +:10211000D93A0008D93A0008D93A0008D93A000853 +:10212000D93A0008D93A0008D93A0008D93A000843 +:10213000D93A0008D93A0008D93A0008D93A000833 +:10214000D93A0008D93A0008D93A0008D93A000823 +:1021500008B500F0D5FC40F2023000F0A1FD40F2DD +:10216000033000F09DFD4FF4417000F099FD40F206 +:102170000E3000F095FD4FF4407000F091FD40F2FC +:10218000953000F08DFD1F20FF2101F027FD20205C +:10219000FF2101F023FDFF20802101F01FFD2520FC +:1021A000402101F01BFD0F48022101224FF48073F2 +:1021B00000F0C0FB022101224FF40073094800F037 +:1021C000B9FB00F057FA00F089FB074801F0C2FDA7 +:1021D00000F084F800F0E8FA044C206800F0B4FD48 +:1021E000FBE700BF000C0140745600087008002097 +:1021F00037B504460F4B00250093012102224023EE +:1022000000F0A6FD2046009582210222402300F026 +:102210009FFD2046009583210322102300F098FDA6 +:102220002046054B21217F2203B0BDE8304000F05D +:1022300063BE00BF3D2200086122000800B591B0D6 +:102240006A460121402300F0ADFD024618B1034863 +:10225000694600F09EF911B05DF804FBF408002017 +:1022600073B5069E0D4600961C4600F079F868B9D5 +:102270006878202804D0A0F122035842584106E093 +:102280002088062894BF0020012000E0012002B031 +:1022900070BD00001FB50E4800F062F9A8B90D4BE3 +:1022A0001B6803F03003302B0FD0044608480DEBB9 +:1022B000040100F05BF908B90134F7E7064B82210D +:1022C00018686A46A3B200F065FD04B010BD00BFF7 +:1022D000040D0020085C0040700800201FB5104865 +:1022E00010494FF4007200F023F90F480F494FF4E2 +:1022F000007200F01DF9042300930D4B0D4901936A +:10230000802302930C4A0D4B0D4800F0F1FC0D4B5D +:102310000D49186005B05DF804EB01F08EB800BF00 +:10232000F408002004090020040D0020040B002004 +:102330007408002084560008C356000800000020DE +:102340005058000870080020F121000808B5024A22 +:10235000024B1A6001F02EFCADDEE1FE004C0020C5 +:10236000087800F07F00212821D14978032906D080 +:10237000052914D0D9B90F4A009B1A6015E01068DE +:102380000021017010684170106881701068C17080 +:10239000106801711268517106221A8005E01268F6 +:1023A0000021012011701880704701207047002023 +:1023B000704700BF4D23000810B5094800F0D0F861 +:1023C000084C18B1084800F0CBF818B9237843F04E +:1023D000010302E0237823F00103237010BD00BF46 +:1023E000280F002013000020F408002013B5072850 +:1023F00040D8DFE800F004233F2C2E30373D1F4B40 +:1024000093F90030002B17DB02AC002304F8013DE8 +:102410001B48214600F0AAF818B91A4B64221A602A +:1024200005E01948214600F0A1F80028F5D0FFF793 +:10243000C3FF9DF807001EE0144B06E00F4B93F915 +:102440000030002BB4BF124B124B187813E00B4B2B +:10245000FBE7114BF9E7FFF7AFFF104B187820F0BF +:102460001E0203E00E4B187820F00F021A7002E0F3 +:102470000C4BEAE7002002B010BD00BF10000020A6 +:10248000280F002020000020F40800201100002068 +:10249000150D0020160D0020140000201300002050 +:1024A00012000020140D002010B50C4607282CD86F +:1024B000DFE800F004192B23252B2B29134B93F96C +:1024C0000030002B0DDB124B642212481A6000F022 +:1024D00035F800F0A7F82146BDE810400E4800F09E +:1024E0002DB80E4B10E0094B93F90030002BA6BF1E +:1024F00001F00F040A4B0B4B06E0044B04E001F023 +:102500001F04094B00E0094B1C7010BD1000002097 +:102510001C000020180D0020040D002011000020D8 +:10252000160D0020150D002014000020140D0020B1 +:10253000002380E806008360C3607047826810B59E +:102540004468531CA34228BF1B1BC468A3421FBF7F +:102550000468A1548360002008BF4FF0FF3010BD15 +:10256000C2688068131A584258417047C26810B553 +:102570004468531CA34228BF1B1B8468A2421FBF90 +:102580000468A25C0A70C36014BF00204FF0FF30E3 +:1025900010BD70B506460C468D18AC4209D03046C9 +:1025A00014F8011BFFF7CAFF0028F6D04FF0FF30E8 +:1025B00070BD002070BD0000164B37B51A681C4670 +:1025C00012F0200F0BD014480368990607D500F0CD +:1025D0005FFBC1B211488DF80710FFF7AFFF23680A +:1025E0000C4D1A0613D50C4C23681B060FD50C484E +:1025F0000DF10701FFF7BAFF20B12B6823F080032C +:102600002B6004E020469DF8071000F03DFB03B06E +:1026100030BD00BF0C38014000380140280F0020B9 +:10262000180D002008B50548FFF79AFF20B9044AA5 +:10263000136843F08003136008BD00BF180D00202D +:102640000C380140012810B50AD10948FFF7A1FF55 +:102650000446FFF7E7FF84EAE470A0EBE47010BDE6 +:1026600001F0CCFA052303604FF0FF3010BD00BF2E +:10267000180D002010B5214821494FF40072FFF7D2 +:1026800057FF204C20494FF400722048FFF750FFBD +:10269000252001F097FA2046032102224FF400730F +:1026A00000F048F901224FF480632046002104F530 +:1026B000405400F03FF920464FF4E13100F0AAFA0F +:1026C0002046082100F0BAFA2046002100F0BFFAA7 +:1026D0002046002100F0C1FA2046002100F0C9FA8E +:1026E00020460C2100F0BFFA094A2046BDE8104000 +:1026F000136843F02003136000F0C1BA280F0020D4 +:10270000380F002000080140280D0020180D00207F +:102710000C380140704700001D4B10B51C68A00725 +:1027200008D504331B681B4AC3F3C01313601A4B4C +:1027300001221A6021060FD5164B1A68174B18781C +:1027400022B1421C1A7000F0EDF803E0421C1A702E +:10275000FFF74CFE124B1860620612D5104B0F4A61 +:1027600019680D4B186818B1117000221A6008E042 +:102770001378C9B2102B1EBF581C10701846FFF7F3 +:1027800093FEE30642BF074B1A681A6010BD00BFF4 +:102790001454004038110020401100203C1100204A +:1027A000105400400054004038B52B4C2B4D2046AF +:1027B00000F004FA2368204623F48073236000F0BD +:1027C00002FA204600F0E8F9204600F0F7F9236805 +:1027D0004FF47A7043F40043236000F043F8236819 +:1027E000032123F40043236028460A46402300F0D7 +:1027F000A1F803210A468023284600F09BF82046D2 +:10280000242100F0F2F9204600F0F6F920464FF4BA +:10281000007100F0F6F920460B2100F0F8F920468F +:10282000482100F0D5F92046502100F0D6F9204685 +:1028300000F0D6F9204600F0C1F9094A1F201368BC +:1028400043F4C0631360236843F480632360BDE8EE +:10285000384001F0B7B900BF00540040000C0140FF +:1028600004540040044B1B68584310F1FF3001D35F +:1028700000BFFAE7704700BF18000020134A10B5E8 +:10288000136801331360FFF705FD114B1A680AB195 +:10289000013A1A600F4C22680AB1013A22601B68A3 +:1028A0000D484FF4807113B100F072F901E000F0AF +:1028B0006DF9236808484FF400711BB1BDE8104062 +:1028C00000F066B9BDE8104000F060B94411002086 +:1028D0001C00002020000020000C0140F8B5002062 +:1028E0000E4F01F04BF941F2707001F03FF93D4697 +:1028F00001F050F901F056F9094E33683C68013B8C +:1029000033602B689C42FCD04FF47A70FFF7AAFF2B +:102910002B680134A342F0D1F8BD00BF4411002060 +:1029200018000020024B00F07F00185C704700BFC9 +:102930006D5700082DE9F0474FF6E07796469C4624 +:102940000268436800264FF00F084CFA06F4E407CB +:1029500019D5072EB4B28BBF3C4615461D46A400C0 +:1029600098BFA4B208FA04F925EA0909A51C0EFAD1 +:1029700005FA01FA04F54AEA050444EA0904082EB6 +:102980002CBF2346224601360437102EBFB2DCD1BD +:1029900002604360BDE8F087024A136843F0807329 +:1029A0001360704700100240062827D8DFE800F0C7 +:1029B00004090E13181D2200114A13689B01FCD54F +:1029C00070470F4A13681801FCD570470C4A13680A +:1029D0009900FCD570470A4A13689B03FCD57047E1 +:1029E000074A13689807FCD57047064A1368990789 +:1029F000FCD57047044A13689B07FCD5704700BF9D +:102A000000100240201002402410024006281FD867 +:102A1000DFE800F004060B1015171900FFF7BCBF24 +:102A20000C4A136843F0806311E00A4A136843F0CC +:102A300080530CE0074A136843F4803307E0054AEB +:102A400002E0054A00E0054A136843F00103136001 +:102A5000704700BF001002402010024024100240C6 +:102A6000034A136823F0030318431060704700BF44 +:102A700004100240034A136823F4701343EA8040B1 +:102A80001060704704100240034A136823F4803337 +:102A900043EA00401060704704100240034A136884 +:102AA00023F4003343EA40401060704704100240B2 +:102AB000034A136823F4404343EA803010607047B0 +:102AC00004100240034A136823F4605343EAC02011 +:102AD0001060704704100240034A136823F4E06357 +:102AE00043EA00201060704704100240034A136854 +:102AF00023F0F00343EA0010106070470410024016 +:102B000008B50420FFF782FF0420FFF74DFF0020E7 +:102B1000FFF7A6FF0320FFF779FF0320FFF744FF2D +:102B20000120FFF79DFF0020FFF7E0FF0320FFF7E4 +:102B3000BFFF0420FFF7D0FF0020FFF7C3FF0220F4 +:102B400000F0CCF80720FFF795FF0120FFF79CFF6E +:102B50000020FFF7A3FFFFF71FFF0020FFF724FF70 +:102B60000220FFF77DFF044B044A05491360054A24 +:102B70001160054A136008BD00A24A042400002029 +:102B800000512502280000202C0000200161704720 +:102B90000904016170470000074B984204D003F517 +:102BA0008063984203D0704740F2152001E040F264 +:102BB000162000F082B800BF00540040036843F0C4 +:102BC000010303607047036823F4007303607047D8 +:102BD000490041F48041816070474900C1607047FD +:102BE000C36843F00103C3607047436823F03F03A9 +:102BF0009BB2194341607047C36923F40043C3612A +:102C00007047C36903F470431943C161704701629F +:102C100070470000064A074B90421B6804BF064BF2 +:102C20001B6801EB43034900B3FBF1F3836070477A +:102C300000380140280000202C000020C36808292B +:102C40000CBF23F4805343F48053C360704703697F +:102C500023F44053194301617047C36823F4C063F0 +:102C60001943C1607047C36823F00C031943C16066 +:102C70007047436923F44073194341617047C36847 +:102C800043F40053C3607047C1F3080141607047CB +:102C90004068C0F30800704703681943016070473B +:102CA000430903F1804303F50433196800F01F0062 +:102CB000012282400A431A607047430903F18043AE +:102CC00003F50433196800F01F000122824011430C +:102CD0001960196821EA02021A607047034A1368F2 +:102CE00023F0070318431060704700BF0020024024 +:102CF0002DE9F0411E460368054688461746984769 +:102D0000069BC0F8D850C360079BC0F800800361E1 +:102D1000BDF8203047608382084B8660C366084B4D +:102D20008366084B43660023C0F8C430C0F8C8303F +:102D3000C0F8CC30C0F8D030BDE8F0811F2F0008BB +:102D4000792F0008FF2F0008D0F8D8305B6A1847A9 +:102D500010B5D0F8D840A468A446BDE8104060473C +:102D600037B50446002503688575C575DB792946A6 +:102D70002A460095FFF7ECFFD4F8D83020465B6870 +:102D800029469847E3691BB103B0BDE830401847B6 +:102D900003B030BD10B5D0F8D840E469A446BDE812 +:102DA0001040604710B5D0F8D840246AA446BDE86A +:102DB00010406047D0F8D8301B691847D0F8D83099 +:102DC0009B69184710B5044600210122FFF7F2FF66 +:102DD000002384F82C3010BD38B50368828FC58E6F +:102DE000DB79AD1A9D42A8BF1D46836BADB21A4474 +:102DF00000212B460446FFF7D5FFA84205D0204608 +:102E0000FFF7E0FF4FF0FF3038BDA38F0344A387E7 +:102E100038BD38B503680446DD79838F00219D42B3 +:102E2000826B0FD22B46FFF7B5FF0223226884F88E +:102E30002C30D379A16B0B44A363D279A38F9B1A57 +:102E4000A38738BDFFF7A6FF032384F82C300023A7 +:102E5000A387A36338BD2DE9F74F04460E4600F162 +:102E6000440500F1640800F1380900F13C0B00F161 +:102E7000400A2F6857B92046314604F1380204F160 +:102E80003C0303B0BDE8F04F00F028BB697933780C +:102E90002A7919408A4208D1CDF800A0204631464F +:102EA0004A465B46B847012803D908354545E0D175 +:102EB000E1E703B0BDE8F08F10B503690446836312 +:102EC0008B79CA7943EA02238387FFF7C4FF70B185 +:102ED000A18F204619B1BDE81040FFF79ABF0B46FD +:102EE0000A46FFF757FF042384F82C3010BD204614 +:102EF000BDE81040FFF766BF70B5002600EBC605C1 +:102F00006C6C2CB10136042EF8D14FF0FF3070BD3F +:102F100085F8481085F849206B64204670BD70B56F +:102F200000F1300600250564294632460823044690 +:102F3000FFF738FF082804D02046BDE87040FFF7AF +:102F400041BFE38E1BB194F93020002A05DA2046F8 +:102F50003146BDE87040FFF7AFBFA28A9A42EBD37B +:102F60002269A587A2632268D2799A4234BF0523D9 +:102F7000062384F82C3070BD90F82C3010B5062B49 +:102F8000044610D0072B24D0052B33D1FFF724FFA4 +:102F9000002833DBA28FE38E9B1A2268D2799342FA +:102FA0002CDC062310E0FFF717FF002826DB204665 +:102FB00004F13001FFF74FFF48B100210B462046D6 +:102FC0000A46FFF7E7FE042384F82C3010BD2046A4 +:102FD00010E000210B460A46FFF7E4FE002384F8C8 +:102FE0002C30236C1BB1204604F13001984700239C +:102FF000236410BDBDE81040FFF7E4BE10BD90F89B +:103000002C3010B5032B044607D0042B07D0022B1D +:103010001CD1BDE81040FFF7FCBE072313E0036C92 +:1030200013B100F13001984794F8303053B994F857 +:103030003130052B06D1D4F8D830618E5B6820463C +:10304000C9B29847002384F82C3010BDBDE8104069 +:10305000FFF7B8BE1988012984BF012119801368C0 +:10306000C27D01201A70704730B5C57D0D246C43B8 +:1030700040680D3C20448D880479A5420CD201247F +:103080001C808B88D0F809001B011B58126803B103 +:103090001B781370012030BD002030BD198801203D +:1030A000022984BF02211980116800230B70126865 +:1030B0005370704719880120022984BF02211980AA +:1030C000116800230B7012685370704738B51446AE +:1030D0001A882568022A84BF02221A808988C9B208 +:1030E000FFF76CFE003018BF012028702368002213 +:1030F0005A70012038BD08B589880122C9B2FFF78E +:1031000059FE012008BD08B589880022C9B2FFF721 +:1031100051FE012008BD10B50B786BB94C887F2C8F +:103120000AD8D0F8D830847593F8302032B1498865 +:103130005B68C9B2984701E0002010BD012010BDB6 +:10314000F8B54B88C27D04469A420E4618D0C37526 +:10315000D0F8D830DB689847D4F8C43083B1002366 +:103160006364E3646365E36504F1C00504F1D007BB +:1031700055F8043F13B1204671889847BD42F7D1F6 +:103180000120F8BD70B51E46C37D0D225A43436829 +:103190000D3A1A448C8813790D46A34216D9D2F8F9 +:1031A000091022018C186B8824799C420ED98A5808 +:1031B0000AB1137000E04BB9D0F8D43013B1A9882C +:1031C0006A88984700233380012070BD002070BDBD +:1031D0002DE9F04F98464B8889B0DFB21B0A022BCD +:1031E0000546164611D0032B00F0E380012B40F07A +:1031F00020810268B8F800103260026812788A42B2 +:1032000028BF0A46A8F8002011E10369B8F8004079 +:10321000136000930D235F43D0F80490009819F8D1 +:10322000075009EB0703A54228BF254619462A4641 +:10323000019300F0E9FC009B641B19F807705E190C +:10324000A4B200230393019B1A79BDF80C309A4273 +:1032500040F2AA801B010593019B059AD3F809301F +:103260001344D3F808A0BAF1000F13D09AF80090D5 +:103270003046A14528BFA14651464A4600F0C4FC4D +:103280009AF80030C9EB04044D441F444E44A4B2E4 +:10329000ADB2BFB200230293019B059AD3F8093067 +:1032A000BDF808A013441A7952457AD9152202FBB9 +:1032B0000AFADB68304613F80A9003EB0A0BA145C3 +:1032C00028BFA14659464A46049300F09DFC049B42 +:1032D000DBF80D1013F80A30C9EB04044D441F4409 +:1032E0004E44A4B2ADB2BFB2A1B1DBF811903046EA +:1032F000A145A8BFA1461FFA89F94A4600F084FCFF +:10330000DBF81130C9EB04044D441F444E44A4B211 +:10331000ADB2BFB200230493BDF810A09BF80430F7 +:1033200053453BD9DBF809C0CAEB0A1A1CF80A90CE +:103330000CEB0A03A14528BFA146194630464A4670 +:10334000CDF81CC0069300F05FFCDDF81CC0069BA6 +:103350001CF80A20D3F80710C9EB04044D441744A5 +:103360004E44A4B2ADB2BFB2A9B1D3F80B9030466F +:10337000A145A8BFA1461FFA89F94A4600F044FCBE +:10338000069BC9EB0404D3F80B304D441F444E4454 +:10339000A4B2ADB2BFB2049B0133BCE7029B0133C0 +:1033A00079E7039B01334DE7009B5F80A8F800504D +:1033B0003DE0046967B90923A3700423E370237017 +:1033C000B8F80030042B28BF0423A8F800302BE005 +:1033D0008368013F6BB3C26897422ADA40F2094220 +:1033E0008988914225D153F8270000F0BBFC0130B9 +:1033F0004000C0B22070B8F800304FEA8709984208 +:1034000028BF18460022A8F80000B8F800305B0872 +:10341000013B9A4208DAAB6853F80930995C04EB37 +:10342000420359800132F0E70323637034600120C6 +:1034300000E0002009B0BDE8F08F10B5002200F1D7 +:10344000C00454F8043F2BB10132042AF9D14FF0E3 +:10345000FF3010BD00EB8200C0F8C410184610BD4C +:1034600030B54C78092C07D8044D55F824401CB1D0 +:10347000A446BDE830406047002030BDF05700084A +:1034800030B54C780B2C07D8044D55F824401CB1AE +:10349000A446BDE830406047002030BD1858000801 +:1034A00010B54C78012C03D00AD3032C04D00CE0C7 +:1034B0004C8854B9064C04E04C8834B9054C00E003 +:1034C000054CA446BDE810406047002010BD00BF79 +:1034D00007310008F7300008CD30000810B50C782F +:1034E00014F0600F12D104F01F04012C0AD005D390 +:1034F000022C0BD1BDE81040FFF7D2BFBDE8104051 +:10350000FFF7AEBFBDE81040FFF7BABF002010BD07 +:10351000024B41F080011960704700BF4C5C0040D5 +:1035200010B50E4A0E4940F63F731468234043F429 +:10353000004343F08003136043F60F731468234085 +:1035400043F4004343F0800342F8043B8A42EAD14B +:103550000368DB7920335B00038310BD045C00400B +:10356000205C004030B5C9B9354B10241B680120E0 +:1035700023F4E04323F040039BB2002A0CBF202534 +:103580001025054218BF43404000013C80B2F4D1F1 +:1035900043F400432A4843F0800303600B0624D51C +:1035A00001F07F01890001F1804101F5B8410B680C +:1035B000102423F4E04323F040039BB20120002AAF +:1035C0000CBF20251025054218BF43404000013C98 +:1035D00080B2F4D143F4004343F080030B606ABB34 +:1035E00048F6CF730A68134027E0890042B94CF6C9 +:1035F0008F7001F1804303F5B8431C6820401860C8 +:1036000001F1804101F5B8410B68102423F4804397 +:1036100023F070039BB20120002A14BF4FF48055A1 +:103620004FF44055054218BF43404000013C80B272 +:10363000F2D143F4004343F080030B6030BD00BF80 +:10364000005C00400B060BD501F07F01890001F101 +:10365000804101F5B841086800F03000102809E009 +:10366000890001F1804101F5B841086800F440503B +:10367000B0F5805F14BF00200120704701F07F018A +:10368000880000F1804000F5B840F0B5046804F00F +:103690003004302C3CD01F4EC9003468A4B20C4416 +:1036A000640004F1804404F5C04425685C1CADB29C +:1036B0006D00641005EB840405F1804704F180443B +:1036C00007F5C04704F5C044A74204D032F8025BB6 +:1036D00027F8045BF8E73268102492B211440E4ACE +:1036E000490053500268012122F4E04222F04002D6 +:1036F00092B211F0300F18BF4A404900013C89B224 +:10370000F7D142F4004242F0800202601846F0BD58 +:103710000020F0BD505C0040046000402DE9F04105 +:103720008C0004F1804404F5B844206800F4405053 +:10373000B0F5405F56D02E48CE0005682D4FADB293 +:1037400035446D007D59C5F309059D42054608DAEB +:10375000036800F56F709BB233445B00C358C3F33A +:1037600009032868244D80B23044400028585E0880 +:1037700080B2400000F1804000F5C0400746964608 +:10378000354603F0010C35B137F8048B013D2EF8B6 +:10379000028BADB2F7E7BCF1000F03D010F82600A2 +:1037A00002F8160040F60F722068024042F08002D4 +:1037B0002260124A525CC2B92268102022F4804270 +:1037C00022F0700292B2012111F4405F18BF4A400A +:1037D0004900013889B2F7D142F4004242F0800238 +:1037E000226002E00020BDE8F0811846BDE8F081CB +:1037F000505C00400C600040086000404012002017 +:10380000F8B5324B054619681C468EB216F4806F27 +:1038100008D04FF6FF321A6040230383BDE8F8401A +:10382000FFF79EBA080432D501F00F0116F010031D +:103830004FEA810209D002F1804303F5B8431B68C7 +:10384000C3F3C0230133DBB20CE040F60F7002F18A +:10385000804707F5B847D7F800E00EEA000040F4CB +:103860000040386001EB4100034405EB83035B6ECD +:1038700013B1284698470AE002F1804340F60F72E0 +:1038800003F5B84319680A4042F080021A60310516 +:1038900005D54FF2FF7323602B6A03B19847F204FA +:1038A00005D54EF6FF7323606B6A03B19847B305E5 +:1038B00005D54FF6FF532360AB6A03B19847AA6A58 +:1038C000034B02B101221A60F8BD00BF445C004006 +:1038D00000900B4208B508484FF40001FFF7DCF9EF +:1038E000064A0749002313600B6041F80C3C4FF473 +:1038F0001C431360034808BD1C100240405C00409C +:10390000505C0040481100202DE9F7430F466C46FB +:10391000574905460868496827F07F0803C407F03F +:103920007F018C0004F1804404F5B84420680A9EAD +:1039300020F4E04020F07F00084380B2206048F689 +:103940008F10276808F0FF0C384002AF07EB4202E7 +:1039500032F8082CDFF81CE102432260CF00B8F1F6 +:10396000000F1AD1C9B1DEF80020288B92B23A4478 +:10397000DFF804C152003E2B4CF802001A4644D92D +:1039800013F01F0F18BFA3F120026FEA82526FEAF3 +:103990005242DEF800E092B23EE0DEF80020288BD2 +:1039A00092B23A44520002F1804202F5C0421060E5 +:1039B0001EB10C2202FB0152566648F6CF72D4F8B3 +:1039C00000804FF0100908EA0202226022684FF0DE +:1039D000010822F4E04222F0400292B218F0200FD7 +:1039E00018BF88EA02024FEA4808B9F101091FFA34 +:1039F00088F8F3D142F4004242F080021844226079 +:103A00002883BCF1000F30D1ADE713F0010F18BFD0 +:103A10005A1CDEF800E092021FFA8EFE7744DFF8AF +:103A20005CE07F004EF807201EB10C2202FB015122 +:103A30008E664CF68F72216810260A40226022683A +:103A4000012122F4804222F0700292B211F4405F10 +:103A500018BF4A404900013E89B2F7D142F4004202 +:103A600042F08002034422602B8303B0BDE8F08360 +:103A700048580008505C0040086000400C6000405E +:103A80000B0626D4134B10205A54890001F18041B3 +:103A900001F5B8410B6823F4804323F070039BB217 +:103AA0004AB1012212F4005F18BF5340520001389E +:103AB00092B2F7D108E0012212F4405F18BF5340E0 +:103AC0005200013892B2F7D143F4004343F080032F +:103AD0000B60704740120020FEE77047184C1949F0 +:103AE000194800225318834203D213595350043209 +:103AF000F8E7164A0021934202D219600433FAE72C +:103B0000134A144C1368144D43F400731360AC4211 +:103B100003D254F8043B9847F9E7104C104DAC42DF +:103B200003D254F8043B9847F9E7FEF711FB0D4C1C +:103B30000D4DAC4203D254F8043B9847F9E700BF5F +:103B40009058000800000020700800208412002017 +:103B500014ED00E0905800089058000890580008B4 +:103B6000905800089058000890580008024B20F028 +:103B70007F401860704700BF14E000E0044A00F086 +:103B80000400136823F0040303431360704700BF6D +:103B900010E000E0024A136843F00203136070472C +:103BA00010E000E0024A136843F00103136070471D +:103BB00010E000E0014A024B1A60FEE70100FA053E +:103BC0000CED00E043099B0003F1604300F01F008F +:103BD000012203F5614382401A607047432893BF76 +:103BE00000F16040044B00F00F0000F564408CBF12 +:103BF000C1540170704700BF14ED00E0014B18681C +:103C0000704700BF30000020844641EA000313F0F3 +:103C1000030349D1403A23D30B6803604B684360E8 +:103C20008B688360CB68C3600B6903614B69436138 +:103C30008B698361CB69C3610B6A03624B6A436220 +:103C40008B6A8362CB6AC3620B6B03634B6B436308 +:103C50008B6B8363CB6BC36340304031403ADBD224 +:103C600030320BD30B6803604B6843608B68836012 +:103C7000CB68C36010301031103AF3D20C3205D348 +:103C800051F8043B40F8043B043AF9D2043208D01E +:103C9000D2071CBF11F8013B00F8013B01D30B8890 +:103CA00003806046704700BF082A13D38B07B1D04A +:103CB00010F00303AED0C3F10403D21ADB071CBF1C +:103CC00011F8013B00F8013BA4D331F8023B20F886 +:103CD000023B9FE7043AD9D3013A11F8013B00F8BF +:103CE000013BF9D20B7803704B7843708B7883706B +:103CF00060467047F0B5044689B008460D4600F0AE +:103D000031F8A36802219A89DFF844E000F1010C40 +:103D1000012704AE0291910404950590CDF80CC0E2 +:103D2000CDF818E00797019606D4596E42F4005278 +:103D300021F400519A8159662046194601AA00F0E3 +:103D40003FF8002814BF4FF0FF300A2009B0F0BD43 +:103D50008C580008024B01461868FFF7CBBF00BF24 +:103D60003000002020F0030110F00300C0F100003B +:103D700051F8043B00F1040C4FEACC0C6FF0000248 +:103D80001CBF22FA0CF213434FF0010C4CEA0C2C2E +:103D90004CEA0C4CA3EB0C0222EA030212EACC120E +:103DA00004BF51F8043B0430F4D0C2F1000102EA30 +:103DB0000102B2FA82F2C2F11F0200EBD200704798 +:103DC0009368002B00F0B1802DE9F04FB1F80CE0C2 +:103DD00083B01EF0080F0C468146164628D00B69AA +:103DE00033B30EF002081FFA88F0356880B34FF045 +:103DF000000BD846DFF8E4A2B8F1000F00F08F8086 +:103E0000D0454346484628BF5346E1695A46676A4B +:103E1000B847002840F3A880B36883441B1AC0EB5E +:103E20000808B360002BE7D1002003B0BDE8F08F95 +:103E30004846214600F080FE002840F04681B4F854 +:103E40000CE035680EF002081FFA88F00028CED189 +:103E50001EF0010B40F09180D846B8F1000F58D009 +:103E60001EF4007FA76862D0B845BA46C0F0C28091 +:103E70001EF4906F00F0C08067692169236807EB2A +:103E800047075B1A07EBD777581C7F1040448742DF +:103E90003A463CBF07463A461EF4806F009300F056 +:103EA000FB801146484600F01BF9009B8246002823 +:103EB00000F00E811A4621690093FFF7A5FEA28942 +:103EC000009B22F4906242F08002A2810AEB030080 +:103ED000C4F810A0FB1A6761C24647462060A36081 +:103EE0005246594600F0BEFBA0682268C01BA06085 +:103EF000404602EB0A032360B36883441B1AC0EBFD +:103F00000808B360002B8FD0B4F80CE0B8F1000FB4 +:103F1000A6D1D5F800B0D5F8048008359DE7D5F8CE +:103F200000B0D5F80480083566E7002070472068A7 +:103F30002369984203D86269904580F0858047459F +:103F400028BF474659463A4600F08CFBA3682268D2 +:103F5000DB1B3A44A3602260002B49D1484621462E +:103F600000F0F0FE002843D0A38943F040034FF057 +:103F7000FF30A38103B0BDE8F08F804683468246C0 +:103F80000090BAF1000F2BD0009B002B4FD0D045F2 +:103F9000434628BF5346206821691F468842D4F80B +:103FA00008E0626903D90EEB020C63455EDC9342C4 +:103FB00024DB1346676A4846E1695A46B847071E3C +:103FC000D2DDB8EB070829D0B368BB44DB1BC7EBD5 +:103FD0000A0AB360002B3FF427AFBAF1000FD3D128 +:103FE0000023D5F800B0D5F804A000930835C8E741 +:103FF000384681E74746C246206871E71A46594667 +:10400000019300F02FFBA2682168019BB8EB070821 +:10401000A2EB03020B44A2602360D5D1484621469F +:1040200000F090FE00289FD1CDF80080CCE75846E4 +:104030000A21524600F0CCFA002841D00130012379 +:10404000CBEB00080093A2E76FF00043434528BF85 +:10405000434693FBF2F3676A03FB02F34846E169C8 +:104060005A46B84700283FF747AF7DE762465946B2 +:10407000CDF804C000F0F6FA2368DDF804C0484625 +:1040800063442360214600F05DFEDDF804C0002893 +:104090007FF46AAF674694E7484600F04BFB009B0D +:1040A000824600287FF412AF4846216900F0C8FF1D +:1040B000A3890C2223F080039BB2C9F8002054E7A7 +:1040C00001230AF10108009361E74FF0FF30ACE6ED +:1040D0000C23C9F80030A38947E700BF00FCFF7F2D +:1040E0002DE9F04F01F10B05162D83B0064627D9B7 +:1040F00035F0070500F1B680A94200F2B38000F068 +:1041000015FBB5F5FC7F22D2CC4FE80807EBC003C6 +:10411000DC689C4200F0B4816368E16823F003032B +:1041200023445A68A56842F00102E96030468D6078 +:104130005A6000F0FDFA0834204603B0BDE8F08F65 +:10414000102900F28F8000F0F1FA1025DCE7680AF0 +:1041500000F08F80042800F24781A8093830410020 +:10416000B64F07EB8101CC68A14206D10CE0002AD2 +:1041700080F28280E468A14206D0636823F00303E2 +:104180005A1B0F2AF3DD01380130AC493C6901F1BB +:10419000080E744500F06981636823F003035A1B1D +:1041A0000F2A00F34F81002AC1F814E0C1F810E093 +:1041B00066DAB3F5007F80F02081DB0801EBC308ED +:1041C0004FEAA30C4A68012303FA0CF3D8F808C09D +:1041D0001343C4F808C0C4F80C804B60C8F808400A +:1041E000CCF80C408210012494409C4255D82342C4 +:1041F00006D120F003006400234200F10400FAD04D +:1042000007EBC008C4468146DCF80C309C4507D15A +:104210002DE1002980F23D81DB689C4500F027817B +:104220005A6822F00302511B0F29F2DD1C46DA689E +:1042300054F808CF45F0010941F001081D44C3F8C6 +:1042400004903046CCF80C20C2F808C07D613D6176 +:10425000C5F80CE0C5F808E0C5F80480695000F026 +:1042600067FA69E7002420460C23336003B0BDE8F9 +:10427000F08F7E213F2073E723445A68E16851E7BD +:1042800023445A68304642F001025A60083400F074 +:104290004FFA204603B0BDE8F08FBC68636823F096 +:1042A0000308454504D8C5EB08030F2B00F38C80A9 +:1042B000DFF88C91D7F80834D9F80020013304EBEB +:1042C000080A2A4400F0478102F580520F3222F496 +:1042D0007F6B2BF00F0B5946304600F01BFC411C46 +:1042E000024600F0F080824500F2EA80D9F804101E +:1042F00092455944C9F8041000F03781D7F80834C2 +:104300004E4801331BBFCAEB020A5144C0F80824CF +:10431000C9F8041012F0070100F00181C1F108038F +:10432000C1F580511A44083102EB0B03C3F30B03B0 +:10433000C3EB010A51463046019200F0EBFB431CEF +:10434000019A00F02181831A534443F00103D9F804 +:104350000410BC425144BA60C9F804105360DFF83D +:10436000E0A016D0B8F10F0F40F2DC806268A8F12F +:104370000C0323F0070302F00102E0184FF0050ED2 +:104380001A430F2B6260C0F804E0C0F808E000F2A6 +:10439000FF80D9F82C302A4A9942D9F8303088BFAA +:1043A000D162BC68264A994288BF1163626822F0D4 +:1043B00003029542A2EB050301D80F2B04DC304623 +:1043C00000F0B6F90024B7E645F0010243F001031E +:1043D000254462603046BD6008346B6000F0A8F987 +:1043E000204603B0BDE8F08F142861D9542800F2AC +:1043F0008F80280B6E304100B2E65A0A042A5AD93F +:10440000142A00F2AB805B324FEA420C07EB8C0CB3 +:10441000DCF80810DFF82480614500F088804A68E5 +:1044200022F00302934202D289688C45F7D1CA6810 +:104430007B68E260A1609460CC60D3E660040020F9 +:104440004812002045F0010742F00103254467604F +:1044500030464D610D61C5F80CE0C5F808E06B60B1 +:10446000AA50083400F064F966E64B68BAE609F130 +:10447000010919F0030F0CF1080C7FF4C5AE2BE015 +:1044800004F108036469A34208BF02303FF47DAE23 +:1044900042E61C461A445168DB6854F8085F41F054 +:1044A000010151603046EB609D6000F041F943E648 +:1044B0005B30410054E69A0938324FEA420CA5E7D6 +:1044C000BC423FF413AFBC68626822F0030270E79D +:1044D000D8F80080984578D110F0030FA8F10803B0 +:1044E00000F1FF30F4D17B6823EA04037B606400B1 +:1044F0009C423FF6D2AE002C3FF4CFAE234248465A +:104500007FF47EAE6400234200F10400FAD077E627 +:10451000B0F5AA7F17D8E80B7730410020E64FF4BA +:10452000805101E7012353601446002241E7D8F887 +:10453000043092104FF0010C0CFA02F21343C8F849 +:1045400004300A4675E740F25453984219D8A80C33 +:104550007C30410004E602F1100BBCE6542A1FD85F +:104560001A0B6E324FEA420C50E7CAF30B03002BD2 +:104570007FF4C4AE0BEB0803BA6843F00103536049 +:1045800007E7FC217E20EBE501234FF0000ADEE681 +:1045900004F10801304600F053FDDAF80410F8E6A3 +:1045A000B2F5AA7F04D8DA0B77324FEA420C2DE736 +:1045B00040F254518A4204D89A0C7C324FEA420CA1 +:1045C00024E74FF0FC0C7E2220E77B688FE700BFDA +:1045D000830770B4C9B240D0541E002A3FD003787C +:1045E0008B4218BF431C05D11CE0ECB10578013C9F +:1045F0008D4217D013F0030F184603F10103F4D1D5 +:10460000032C14D884B103788B420BD00619431CB9 +:1046100002E005788D4205D0B342184603F101034C +:10462000F7D1002070BC7047204670BC704705462B +:1046300041EA012242EA02422B6828465340A3F194 +:10464000013626EA030313F0803F05F10405D9D1B2 +:10465000043C032C2846EFD8D4E71446D0E7104694 +:10466000E0E700BF8842F0B50DD98B1898420AD216 +:104670008118002A54D09A1A13F8014D934201F878 +:10468000014DF9D1F0BD0F2A48D940EA01039B073B +:1046900047D1154600F1100401F1100353F8106CD6 +:1046A000103D44F8106C53F80C6C0F2D44F80C6C52 +:1046B00053F8086C04F1100444F8186C53F8046CB7 +:1046C00003F1100344F8146CE8D8A2F1100323F0AE +:1046D0000F0302F00F0E1033BEF1030F1944034411 +:1046E00021D90E4674461D1F56F8047B043C032C4A +:1046F00045F8047FF8D8AEF1040424F00304043430 +:104700002344214402F0030252B1013B0A4411F850 +:10471000014B914203F8014FF9D1F0BD0346F3E795 +:10472000F0BD0346F1E77246EEE700BF704700BFF9 +:10473000704700BF2DE9F04F174683B00D460029A2 +:1047400000F0E280814607F10B04FFF7EFFF55F818 +:10475000043C162C23F00306A5F108084BD81022C0 +:104760001446A7424CD8964251DADFF8A4B308EBBE +:104770000601DBF80800884200F0D380486820F08A +:10478000010E8E44DEF804E01EF0010F54D120F03B +:1047900003003044904280F2BD80DB0700F190803E +:1047A00055F8083CC3EB080ADAF8043023F0030399 +:1047B00000EB030E964549DB5746CB688968321FEC +:1047C000CB60996057F8081FDAF80C30242ACB60C8 +:1047D000996000F23381132A40F2FA802B681B2A79 +:1047E000CAF808306B68CAF80C3000F23B81083513 +:1047F0000AF11003EDE024F00704002C2246B0DAA1 +:104800000C230020C9F8003003B0BDE8F08F2F461C +:10481000321B0F2A03F0010340D83343C8F8043099 +:104820004644736843F0010373604846FFF780FF16 +:10483000384603B0BDE8F08FD90741D455F8083C9D +:10484000C3EB080ADAF8043023F00303334493423D +:1048500036DB5746DAF80C1057F8080F321F242AB7 +:10486000C160886000F2F580132A40F2F080296868 +:104870001B2ACAF808106968CAF80C1000F20781F0 +:1048800008350AF1100229681E4611606968D04691 +:104890005160AB689360DAF80430B9E708EB0401C3 +:1048A000234342F00100C8F804300A4448605368CA +:1048B000083143F001035360484600F0C1FBB4E700 +:1048C00039464846FFF70CFC07460028ADD055F89E +:1048D000043CA0F1080123F001024244914200F09F +:1048E000A680321F242A00F29380132A65D803463B +:1048F0002A46116819605168596092689A60294681 +:10490000484600F09DFB90E7114603B0BDE8F04F2C +:10491000FFF7E6BBCA6889682F46CA600646916001 +:1049200076E7416804F1100021F00301314481422F +:104930005ADADB07C4D455F8083CC3EB080ADAF8A6 +:10494000043023F0030301EB030C60453FF77EAF17 +:104950005746DAF80C3057F8081F321F242ACB606C +:10496000996000F2B680132A40F2A7802B681B2AB8 +:10497000CAF808306B68CAF80C3000F2B38008350A +:104980000AF110032A681A606A685A60AA689A6075 +:10499000C4EB0C030AEB040243F00103CBF808203C +:1049A0005360DAF80430484603F001031C43CAF8A8 +:1049B0000440FFF7BDFE38463BE72B681B2A036027 +:1049C0006B68436028D800F1080305F1080290E7FE +:1049D0003B462A6876461A606A68D0465A60AA68DA +:1049E0009A60DAF8043013E70B1B08EB040243F07B +:1049F0000103CBF80820536055F8043C484603F007 +:104A000001031C4345F8044CFFF792FE284610E7CB +:104A10002946FFF727FE72E7AB68242A8360EB681C +:104A2000C3602BD000F1100305F1100261E750F8CC +:104A3000042C2F4622F003021644E9E629463846A4 +:104A40007646D046FFF70EFEDAF80430E0E63A4646 +:104A500019E7294638461E46D046FFF703FEDAF826 +:104A60000430D5E6AB68242ACAF81030EB68CAF8DF +:104A7000143018D010350AF11803AAE72A6900F19A +:104A800018030261696905F11802416131E7A968FB +:104A9000242ACAF81010E968CAF814100FD010358B +:104AA0000AF11802EFE62A690AF12003CAF8182071 +:104AB0006A691835CAF81C208BE73B4662E729690A +:104AC0000AF12002CAF8181069691835CAF81C10D2 +:104AD000D9E629463846CDF804C0FFF7C3FDDDF816 +:104AE00004C055E7AB68242ACAF81030EB68CAF84E +:104AF000143003D010350AF1180343E72A690AF18C +:104B00002003CAF818206A691835CAF81C2039E74A +:104B10006004002038B5074C002305460846236092 +:104B200000F09AFD431C00D038BD2368002BFBD059 +:104B30002B6038BD801200202F4B70B506461868D8 +:104B40000C4610B1826B002A36D0A589ABB219078A +:104B50000CD52269AAB113F001011ED063690021AE +:104B60005B42A361A160F2B1002070BDDA063AD5C4 +:104B70005B0724D4226945F00803A3819BB2002A75 +:104B8000E9D103F42071B1F5007FE4D0304621462D +:104B900000F07AFBA3892269DDE7980758BF6169B5 +:104BA000A160002AE0D1A3891A06DDD543F04003B5 +:104BB000A3814FF0FF3070BD00F0D4F9C5E7216B41 +:104BC00049B104F14003994203D0304600F038FA6D +:104BD000A58900232363226925F024050023ADB2B3 +:104BE00084E80C00C7E745F04005092333604FF027 +:104BF000FF30A58170BD00BF300000208B892DE9FA +:104C0000F0419AB20D46110780463CD46A6843F4DD +:104C10000063002AAB8165DDAE6A002E4BD09BB2EB +:104C200003F48052002192B2D8F80040C8F8001076 +:104C3000002A5BD02A6D5F0705D569682B6B521A75 +:104C40000BB1EB6BD21A4046E9690023B047461C12 +:104C500056D0AB892A6923F400639BB200212A60F5 +:104C6000DA04AB8169603BD4296BC8F8004011B30A +:104C700005F14003994202D0404600F0E1F90020DE +:104C80002863BDE8F0812E69AEB191072C680CBF96 +:104C90006B6900232E60A41BAB600AE032462346FA +:104CA0006F6A4046E969B8470028A4EB000406444F +:104CB00004DD002CF2DC0020BDE8F081AB894FF070 +:104CC000FF3043F04003AB81BDE8F081AB892A6936 +:104CD00023F400639BB2AB81DB0469602A60C3D517 +:104CE0002865C1E7EA6B002A96DCE4E70123404629 +:104CF000E969B047431C024619D0AB89AE6A9AE70E +:104D0000D8F800100029E1D01D2907D0162905D0B8 +:104D1000AB8943F04003AB81BDE8F081AB892969E1 +:104D200023F400630022AB8185E806009CE7D8F8F5 +:104D30000030002BE1D01D2B01D0162BBED1C8F8BE +:104D40000040B8E710B5044682B008B1836B53B198 +:104D5000B1F90C0008B902B010BD204602B0BDE8A0 +:104D60001040FFF74BBF019100F0FCF80199EFE70D +:104D700020B1054B01461868FFF7E4BF034B044917 +:104D8000186800F059BA00BF3000002084580008AD +:104D9000454D00080020704700207047014900F091 +:104DA0004BBA00BFD95400082DE9F04F07463548EB +:104DB0007D68002407F53B7204230321F863C7F8DC +:104DC000E412C7F8E822C7F8E04283B02C606C60B8 +:104DD000AC606C66EC812C616C61AC61AB8121468E +:104DE00005F15C00082200F0BFFADFF89CB0BE6855 +:104DF000DFF898A0DFF89890DFF898800123092267 +:104E0000C5F820B0C5F824A0C5F82890C5F82C80B6 +:104E1000ED612146F381B28106F15C00346074607B +:104E2000B460746634617461B4610822019300F067 +:104E30009BFAFD6812200222F661C6F820B0C6F87F +:104E400024A0C6F82890C6F82C802146A881EA81C3 +:104E50002C606C60AC606C662C616C61AC6105F1BF +:104E60005C00082200F080FA019BED61C5F820B0DB +:104E7000C5F824A0C5F82890C5F82C80BB6303B002 +:104E8000BDE8F08F9D4D0008055400082D54000822 +:104E9000655400088554000870B568234D1E03FB57 +:104EA00005F50E4605F17401FFF71AF9044640B105 +:104EB00000210C30666005F168022160A06000F0FE +:104EC00053FA204670BD00BF204B70B51D680646E2 +:104ED000AB6B13B92846FFF767FF05F538756B68AC +:104EE000AC68013B05D521E0013B5A1C04F1680484 +:104EF0001CD0B4F90C20002AF6D14FF6FF72002521 +:104F00000123E281A38165662560A5606560256156 +:104F10006561A561294604F15C00082200F024FACD +:104F20002046256365636564A56470BD2B680BB17D +:104F30001D46D4E730460421FFF7AEFF286008B1D4 +:104F40000546CCE70C22326070BD00BF84580008D3 +:104F5000024B0349186800F06FB900BF845800087D +:104F6000D9540008836B03B170471DE7704700BF39 +:104F7000704700BF704700BF704700BF024B034936 +:104F8000186800F035B900BF30000020954D0008CA +:104F9000024B0349186800F02BB900BF3000002015 +:104FA000994D0008F8B50C46224F0646FFF7BEFBA8 +:104FB000BB685D6825F00305291B01F6EF7121F43C +:104FC0007F6121F00F01A1F58054B4F5805F07DB0C +:104FD00030460021FFF79EFDBB682B44984204D069 +:104FE0003046FFF7A5FB0020F8BD30466142FFF7D1 +:104FF00091FD01300DD0104BBA6819682D1B45F09A +:1050000001053046091B55601960FFF791FB01202F +:10501000F8BD30460021FFF77DFDBA68831A0F2BDB +:10502000DEDD064C0449246843F00103001B536095 +:105030000860D5E7600400204C12002068080020BA +:1050400000294ED02DE9F0410C468046FFF76EFB5B +:1050500054F8047C6249A4F1080527F00102AB185A +:105060008E6858689E4220F003005AD0FE075860B0 +:105070000BD454F8087C01F1080EED1BAC683A44DF +:10508000744567D0EF68E760BC601C186468E4078B +:105090000CD4544F9C680244BC427CD0D86842F087 +:1050A0000103E06084606B60AA5003E042F00103FA +:1050B0006B60AA50B2F5007F14D2D20801EBC20394 +:1050C00001244868921004FA02F29C681043AC6014 +:1050D000EB6048609D60E5604046BDE8F041FFF749 +:1050E00027BB7047530A042B47D8930903F13804B0 +:1050F000600001EB800083683949834243D05968DE +:1051000021F00301914202D99B689842F7D1DA68F5 +:10511000EA60AB6040469560DD60BDE8F041FFF7B6 +:1051200007BBFF07024407D454F8084C2D1BEB685B +:10513000A8682244C36098602B4B42F001001B68B2 +:1051400068609A428D60C7D3284B40461968FFF7C4 +:1051500029FFC1E719184968C90709D4D968024469 +:105160009B6842F00100D9608B606860AA50B3E789 +:1051700042F001036B60AA50AEE7142B14D803F180 +:105180005B046000B5E74A68A4100120A040024318 +:105190004A601A46BCE742F001034D610D61EC60C4 +:1051A000AC606B60AA5097E7542B04D8130B03F143 +:1051B0006E0460009DE7B3F5AA7F04D8D30B03F11A +:1051C0007704600095E740F25450834204D8930C72 +:1051D00003F17C0460008CE7FC207E2489E700BF9B +:1051E00060040020680400206C08002048120020A1 +:1051F0002DE9F04110F538771AD0884600267D68F1 +:10520000BC68013D0ED4A389013D012B06D9B4F938 +:105210000E30013302D02046C04706436B1C04F118 +:105220006804F0D13F68002FE9D13046BDE8F08135 +:105230003E463046BDE8F0812DE9F84310F538765A +:105240001ED0884607464FF000097568B468013DD6 +:1052500010D4A389013D012B08D9B4F90E300133D4 +:1052600004D038462146C04749EA00096B1C04F1C6 +:105270006804EED13668002EE7D14846BDE8F883D1 +:10528000B1464846BDE8F8838B899AB212F0020F06 +:105290003CD1F0B50C46B1F90E1091B0002905468D +:1052A00019DB01AA00F062F9002812DB029B03F46B +:1052B0007043A3F50057B7FA87F7B3F5004F4FEAED +:1052C00057172AD0A3894FF4806643F40063A38163 +:1052D0000BE0A3899AB212F0800F43F40063A3811C +:1052E0000CBF4FF480664026002728463146FEF763 +:1052F000F7FEA38940B31A4A43F08003EA63A3810F +:105300002060206166619FB911B0F0BD01F14303D7 +:1053100001220B600B614A617047124BA26A9A42EC +:10532000D0D1A3894FF480663343A381E664DCE7E0 +:105330002846B4F90E1000F02DF90028E4D0A38916 +:1053400043F00103A381DFE79A05DDD404F14302B2 +:1053500043F002030121A381226022616161D3E74E +:105360009D4D00086554000870B4840746D0541E53 +:10537000002A41D0CDB2034602E0621EE4B31446D7 +:1053800003F8015B9A07F8D1032C2ED9CDB245EA78 +:1053900005250F2C45EA054519D9264603F11002CB +:1053A000103E0F2E42F8105C42F80C5C42F8085C8C +:1053B00042F8045C02F11002F2D8A4F1100222F0CB +:1053C0000F0204F00F041032032C13440DD91E46B3 +:1053D0002246043A032A46F8045BFAD8221F22F038 +:1053E00003020432134404F003042CB1C9B21C4478 +:1053F00003F8011BA342FBD170BC7047144603465F +:10540000C2E700BF10B50C46B1F90E1000F0E8F885 +:10541000002803DB236D0344236510BDA38923F417 +:105420008053A38110BD00BF002070472DE9F041DB +:105430008C891E46E3050D461746804606D5B1F910 +:105440000E100022022300F0B7F8AC8924F4805437 +:10545000AC814046B5F90E103A463346BDE8F041FE +:1054600000F014B810B50C46B1F90E1000F0A4F815 +:10547000A389421C0EBF23F4805343F4805320655C +:10548000A38110BDB1F90E1000F014B870B5084C2E +:1054900006460025084611461A462560FDF7D2F853 +:1054A000431C00D070BD2368002BFBD0336070BD5F +:1054B0008012002038B5074C0023054608462360BB +:1054C00000F0A2F8431C00D038BD2368002BFBD0AD +:1054D0002B6038BD8012002000293DD070B50546F4 +:1054E0000C4608B1836B7BB3B4F90C300BB90020C8 +:1054F00070BD28462146FFF781FBE36A064633B1BB +:105500002846E16998470028B8BF4FF0FF36A389C5 +:105510001B061CD4216B41B104F14003994202D017 +:105520002846FFF78DFD00232363616C21B12846D7 +:10553000FFF786FD00236364FFF718FD0023A381B6 +:10554000FFF716FD304670BDFFF70CFDCCE728468F +:105550002169FFF775FDDDE700207047024B01462A +:105560001868FFF7B9BF00BF3000002038B5084CFD +:105570000023054608461146236000F04DF8431C01 +:1055800000D038BD2368002BFBD02B6038BD00BF96 +:105590008012002038B5074C0023054608462360DA +:1055A00000F042F8431C00D038BD2368002BFBD02C +:1055B0002B6038BD8012002070B5084C06460025CF +:1055C000084611461A46256000F036F8431C00D004 +:1055D00070BD2368002BFBD0336070BD80120020AB +:1055E00070B5084C06460025084611461A46256047 +:1055F00000F02AF8431C00D070BD2368002BFBD0BC +:10560000336070BD80120020024B58221A604FF0A8 +:10561000FF30704780120020024B58221A604FF072 +:10562000FF30704780120020024B58221A60002081 +:10563000704700BF80120020024B58221A604FF0C2 +:10564000FF30704780120020024B58221A604FF042 +:10565000FF30704780120020044A05491368002B70 +:1056600008BF0B4618441060184670477C12002093 +:10567000841200204D6F726E696E672063686170DE +:1056800073210D001201000202000040341278560E +:1056900000020102030107050102400001000000B1 +:1056A0000000000000070582024000010000000029 +:1056B00000000000070583031000FF000000000049 +:1056C0000000000902000003010080320C570008AE +:1056D000090400000102020100B45600083C570012 +:1056E00008130000004D6568004669736800536F39 +:1056F0007570004446550009040100020A000000CC +:1057000096560008000000000000000000000000A5 +:105710000100000000000000D0560008000000005A +:105720000100000000000000F75600080000000023 +:105730000100000000000000585700080524001078 +:1057400001052401000104240200052406000109CA +:105750002101FF0000041A010904020000FE0101FA +:1057600004000000004F5700080900000000FFFF80 +:10577000FFFFFFFF0010AC2440363434471A1101FC +:105780000380221B78EEA6C5A2574C9C25125054CC +:10579000A54B00714F81800101010101010101014F +:1057A000010101302A009851002A40307013005244 +:1057B0000E1100001E000000FF0046503138313746 +:1057C0003653473434360A000000FC0044454C4C44 +:1057D000203137303846500A20000000FD00384C98 +:1057E0001E510E000A202020202020006900000009 +:1057F0009D300008000000000000000000000000D4 +:105800000000000017310008D1310008000000003E +:105810005530000841310008B53000080000000094 +:105820000000000000000000000000000000000078 +:105830000000000000000000000000000000000068 +:1058400069300008853100080002000400000006ED +:10585000D53800081135000809390008213500083D +:1058600065350008813A0008453600087D36000895 +:105870001D3700080138000800000000000000008B +:105880000000000038000020430000000A00000073 +:10589000E5560008E9560008EE560008F3560008E1 +:1058A0000301B0600300000007000000E8030000EF +:1058B000E803000000127A0000127A0000127A0059 +:1058C0003800002000000000000000002403002039 +:1058D0008C030020F4030020000000000000000002 +:1058E00000000000000000000000000000000000B8 +:1058F00000000000000000000000000088580008C0 +:105900000000000000000000000000000000000097 +:105910000000000000000000000000000000000087 +:105920000000000000000000000000000000000077 +:105930000000000000000000000000000000000067 +:105940000000000000000000000000000000000057 +:105950000000000000000000000000000000000047 +:105960000000000000000000000000000000000037 +:1059700001000000000000000E33CDAB34126DE6D4 +:10598000ECDE05000B00000000000000000000003D +:105990000000000000000000000000000000000007 +:1059A00000000000000000000000000000000000F7 +:1059B00000000000000000000000000000000000E7 +:1059C00000000000000000000000000000000000D7 +:1059D00000000000000000000000000000000000C7 +:1059E00000000000000000000000000000000000B7 +:1059F00000000000000000000000000000000000A7 +:105A00000000000000000000000000000000000096 +:105A10000000000000000000000000000000000086 +:105A20000000000000000000000000000000000076 +:105A30000000000000000000000000000000000066 +:105A40000000000000000000000000000000000056 +:105A50000000000000000000000000000000000046 +:105A60000000000000000000000000000000000036 +:105A70000000000000000000000000000000000026 +:105A80000000000000000000000000000000000016 +:105A90000000000000000000000000000000000006 +:105AA00000000000000000000000000000000000F6 +:105AB00000000000000000000000000000000000E6 +:105AC00000000000000000000000000000000000D6 +:105AD00000000000000000000000000000000000C6 +:105AE00000000000000000000000000000000000B6 +:105AF00000000000000000000000000000000000A6 +:105B00000000000000000000000000000000000095 +:105B10000000000000000000000000000000000085 +:105B20000000000000000000000000000000000075 +:105B30000000000000000000000000000000000065 +:105B40000000000000000000000000000000000055 +:105B50000000000000000000000000000000000045 +:105B60000000000000000000000000000000000035 +:105B70000000000000000000000000000000000025 +:105B80000000000000000000000000000000000015 +:105B90000000000000000000000000000000000005 +:105BA00000000000000000000000000000000000F5 +:105BB00000000000000000000000000000000000E5 +:105BC00000000000000000000000000000000000D5 +:105BD00000000000000000000000000000000000C5 +:105BE00000000000000000000000000000000000B5 +:105BF00000000000000000000000000000000000A5 +:105C00000000000000000000000000000000000094 +:105C10000000000000000000000000000000000084 +:105C20000000000000000000000000000000000074 +:105C30000000000000000000000000000000000064 +:105C40000000000000000000000000000000000054 +:105C50000000000000000000000000000000000044 +:105C60000000000000000000000000000000000034 +:105C70000000000000000000000000000000000024 +:105C80000000000000000000000000000000000014 +:105C90000000000000000000000000000000000004 +:105CA00000000000000000000000000000000000F4 +:105CB00000000000000000000000000000000000E4 +:105CC00000000000000000000000000000000000D4 +:105CD00000000000000000000000000000000000C4 +:105CE00000000000000000000000000000000000B4 +:105CF000000000000000000060040020600400209C +:105D00006804002068040020700400207004002053 +:105D10007804002078040020800400208004002003 +:105D200088040020880400209004002090040020B3 +:105D30009804002098040020A0040020A004002063 +:105D4000A8040020A8040020B0040020B004002013 +:105D5000B8040020B8040020C0040020C0040020C3 +:105D6000C8040020C8040020D0040020D004002073 +:105D7000D8040020D8040020E0040020E004002023 +:105D8000E8040020E8040020F0040020F0040020D3 +:105D9000F8040020F8040020000500200005002081 +:105DA000080500200805002010050020100500202F +:105DB00018050020180500202005002020050020DF +:105DC000280500202805002030050020300500208F +:105DD000380500203805002040050020400500203F +:105DE00048050020480500205005002050050020EF +:105DF000580500205805002060050020600500209F +:105E0000680500206805002070050020700500204E +:105E100078050020780500208005002080050020FE +:105E200088050020880500209005002090050020AE +:105E30009805002098050020A0050020A00500205E +:105E4000A8050020A8050020B0050020B00500200E +:105E5000B8050020B8050020C0050020C0050020BE +:105E6000C8050020C8050020D0050020D00500206E +:105E7000D8050020D8050020E0050020E00500201E +:105E8000E8050020E8050020F0050020F0050020CE +:105E9000F8050020F805002000060020000600207C +:105EA000080600200806002010060020100600202A +:105EB00018060020180600202006002020060020DA +:105EC000280600202806002030060020300600208A +:105ED000380600203806002040060020400600203A +:105EE00048060020480600205006002050060020EA +:105EF000580600205806002060060020600600209A +:105F00006806002068060020700600207006002049 +:105F100078060020780600208006002080060020F9 +:105F200088060020880600209006002090060020A9 +:105F30009806002098060020A0060020A006002059 +:105F4000A8060020A8060020B0060020B006002009 +:105F5000B8060020B8060020C0060020C0060020B9 +:105F6000C8060020C8060020D0060020D006002069 +:105F7000D8060020D8060020E0060020E006002019 +:105F8000E8060020E8060020F0060020F0060020C9 +:105F9000F8060020F8060020000700200007002077 +:105FA0000807002008070020100700201007002025 +:105FB00018070020180700202007002020070020D5 +:105FC0002807002028070020300700203007002085 +:105FD0003807002038070020400700204007002035 +:105FE00048070020480700205007002050070020E5 +:105FF0005807002058070020600700206007002095 +:106000006807002068070020700700207007002044 +:1060100078070020780700208007002080070020F4 +:1060200088070020880700209007002090070020A4 +:106030009807002098070020A0070020A007002054 +:10604000A8070020A8070020B0070020B007002004 +:10605000B8070020B8070020C0070020C0070020B4 +:10606000C8070020C8070020D0070020D007002064 +:10607000D8070020D8070020E0070020E007002014 +:10608000E8070020E8070020F0070020F0070020C4 +:10609000F8070020F8070020000800200008002072 +:1060A0000808002008080020100800201008002020 +:1060B00018080020180800202008002020080020D0 +:1060C0002808002028080020300800203008002080 +:1060D0003808002038080020400800204008002030 +:1060E00048080020480800205008002050080020E0 +:1060F0005808002058080020FFFFFFFF00000200A2 +:0400000508003ADDD8 +:00000001FF diff --git a/stm32f1/usbdfu.hex b/stm32f1/usbdfu.hex new file mode 100644 index 0000000..4ba13a6 --- /dev/null +++ b/stm32f1/usbdfu.hex @@ -0,0 +1,393 @@ +:020000040800F2 +:1000000000500020151500081315000811150008F0 +:100010001115000811150008111500080000000056 +:1000200000000000000000000000000013150008A0 +:100030001315000800000000131500081315000830 +:1000400011150008111500081115000811150008F8 +:1000500011150008111500081115000811150008E8 +:1000600011150008111500081115000811150008D8 +:1000700011150008111500081115000811150008C8 +:1000800011150008111500081115000811150008B8 +:1000900011150008111500081115000811150008A8 +:1000A0001115000811150008111500081115000898 +:1000B0001115000811150008111500081115000888 +:1000C0001115000811150008111500081115000878 +:1000D0001115000811150008111500081115000868 +:1000E0001115000811150008111500081115000858 +:1000F0001115000811150008111500081115000848 +:100100001115000811150008111500081115000837 +:100110001115000811150008111500081115000827 +:100120001115000811150008111500081115000817 +:100130001115000811150008111500081115000807 +:1001400011150008111500081115000811150008F7 +:1001500021217F22014B00F0EBBB00BFD901000839 +:100160002DE9F0411A4E3378042B03D0072B2DD004 +:10017000BDE8F081174C00F0B7FAB4F808346BB959 +:100180002378212B05D0412B1AD1D4F8010000F09F +:1001900031F9D4F80130C4F8043411E0A046D4F8A1 +:1001A0000424023B02EB83270025B4F800349D426F +:1001B00006DAE81938F8051000F0ECF80235F4E733 +:1001C00000F0A4FA05233370BDE8F08101F0EAF9EC +:1001D000000000202004002038B5087800F07F00DF +:1001E000212852D14878013805284ED8DFE800F0A0 +:1001F000034D241A4620274D0BB1188808B9062351 +:100200000EE08C78C978244844EA0121A0F808144B +:100210001988A0F8001411681A8801F0CBF903239B +:100220002B7034E01B4B1A780A2A30D1022201E0ED +:10023000184B02221A702AE016481568047800212B +:10024000032C04D0062C06D10724047003E00424F8 +:100250000470642400E00C462970156800786C7006 +:100260001468A1701468E1701468207112685171EB +:1002700006221A80094A049B1A6008E005491268A0 +:10028000097801201170188038BD002038BD012088 +:1002900038BD00BF000000202004002061010008DC +:1002A00030B540F2023085B000F007FA224B234A05 +:1002B00019681C46914210D0214A224B11680B400C +:1002C000B3F1005F09D1204B4FF40051196013685E +:1002D00083F308881D4B1B6898470025256000F0B4 +:1002E000A1F94FF4417000F0E8F92A464FF4006399 +:1002F0001748032100F0BAF815484FF4006100F0E8 +:10030000D3F904230093134B134901934FF48063F3 +:100310000293124A124B134800F006FA124904469F +:1003200000F0A7FD0A484FF4006100F0BFF9204635 +:1003300000F026FAFBE700BF004C0020ADDEE1FE36 +:10034000002000080000FE2F08ED00E00420000857 +:100350000010014020000020FC1600080E170008C5 +:10036000040000200018000851010008064B18681E +:10037000064B1B68B3F5007F82BF054B1B68184313 +:1003800000F03500704700BF0C200240E0F7FF1F6F +:100390004C20024038B504460D4600F0BFF9114B21 +:1003A0001B68B3F5007F04D90F4B9C4201D90F4A5B +:1003B00000E00F4A136843F001031360258000F04A +:1003C000ADF9084B1B68B3F5007F04D9064B9C427E +:1003D00001D9064A00E0064A136823F001031360BE +:1003E00038BD00BFE0F7FF1FFFFF070850200240A5 +:1003F0001020024010B5044600F090F9154B1B6820 +:10040000B3F5007F09D9144B9C4206D9134B1A68E7 +:1004100042F002021A60124A05E0124B1A6842F0DA +:1004200002021A60104A14601A6842F040021A6010 +:1004300000F074F9074B1B68B3F5007F04D9064B35 +:100440009C4201D9054A00E0064A136823F00203E2 +:10045000136010BDE0F7FF1FFFFF070850200240A8 +:100460005420024010200240142002402DE9F047A1 +:100470004FF6E07796469C460268436800264FF0A8 +:100480000F084CFA06F4E40719D5072EB4B28BBF57 +:100490003C4615461D46A40098BFA4B208FA04F9CC +:1004A00025EA0909A51C0EFA05FA01FA04F54AEA3B +:1004B000050444EA0904082E2CBF234622460136CF +:1004C0000437102EBFB2DCD102604360BDE8F08774 +:1004D000024A136843F080731360704700100240B3 +:1004E000062827D8DFE800F004090E13181D2200A3 +:1004F000114A13689B01FCD570470F4A1368180115 +:10050000FCD570470C4A13689900FCD570470A4A1D +:1005100013689B03FCD57047074A13689807FCD5FE +:100520007047064A13689907FCD57047044A136858 +:100530009B07FCD5704700BF00100240201002400E +:100540002410024006281FD8DFE800F004060B1034 +:1005500015171900FFF7BCBF0C4A136843F08063FE +:1005600011E00A4A136843F080530CE0074A13680D +:1005700043F4803307E0054A02E0054A00E0054AFB +:10058000136843F001031360704700BF001002407E +:100590002010024024100240034A136823F0030392 +:1005A00018431060704700BF04100240034A1368EC +:1005B00023F4701343EA8040106070470410024037 +:1005C000034A136823F4803343EA00401060704705 +:1005D00004100240034A136823F4404343EA803086 +:1005E0001060704704100240034A136823F46053FC +:1005F00043EAC0201060704704100240034A1368A9 +:1006000023F4E06343EA00201060704704100240C6 +:10061000034A136823F0F00343EA001010607047A8 +:100620000410024008B50420FFF78CFF0420FFF7F8 +:1006300057FF0020FFF7B0FF0020FFF7E9FF03207E +:10064000FFF7C8FF0420FFF7D9FF0020FFF7CCFF1A +:100650000F4A0120136843F48003136000F03AF856 +:100660000A20FFF7A3FF0020FFF7AAFFFFF730FFE4 +:100670000020FFF735FF0220FFF78EFF054B064AEB +:1006800006491360064A1160064A136008BD00BFA0 +:1006900004100240006CDC021400002000366E01E1 +:1006A000180000201C00002001617047090401614E +:1006B00070470368194301607047430903F18043A1 +:1006C00003F50433196800F01F00012282400A4339 +:1006D0001A607047034A136823F007031843106039 +:1006E000704700BF00200240054A136843F08003B2 +:1006F0001360044B044A1A6002F188321A60704792 +:10070000102002400420024023016745024A13687A +:1007100043F08003136070471020024008B5FFF7D4 +:1007200025FEC307FBD408BD2DE9F0411E46036832 +:100730000546884617469847069BC0F8D850C360C0 +:10074000079BC0F800800361BDF8203047608382BA +:10075000084B8660C366084B8366084B43660023DC +:10076000C0F8C430C0F8C830C0F8CC30C0F8D030C1 +:10077000BDE8F08157090008B1090008370A0008F0 +:10078000D0F8D8305B6A184710B5D0F8D840A468C4 +:10079000A446BDE81040604737B50446002503680D +:1007A0008575C575DB7929462A460095FFF7ECFF6C +:1007B000D4F8D83020465B6829469847E3691BB1D6 +:1007C00003B0BDE83040184703B030BD10B5D0F8D5 +:1007D000D840E469A446BDE81040604710B5D0F8A1 +:1007E000D840246AA446BDE810406047D0F8D8300D +:1007F0001B691847D0F8D8309B69184710B50446D4 +:1008000000210122FFF7F2FF002384F82C3010BDF5 +:1008100038B50368828FC58EDB79AD1A9D42A8BFBB +:100820001D46836BADB21A4400212B460446FFF7E8 +:10083000D5FFA84205D02046FFF7E0FF4FF0FF307C +:1008400038BDA38F0344A38738BD38B50368044679 +:10085000DD79838F00219D42826B0FD22B46FFF7FB +:10086000B5FF0223226884F82C30D379A16B0B44A6 +:10087000A363D279A38F9B1AA38738BDFFF7A6FF86 +:10088000032384F82C300023A387A36338BD2DE90C +:10089000F74F04460E4600F1440500F1640800F1EC +:1008A000380900F13C0B00F1400A2F6857B9204687 +:1008B000314604F1380204F13C0303B0BDE8F04FC7 +:1008C00000F028BB697933782A7919408A4208D127 +:1008D000CDF800A0204631464A465B46B84701287D +:1008E00003D908354545E0D1E1E703B0BDE8F08F15 +:1008F00010B50369044683638B79CA7943EA0223FE +:100900008387FFF7C4FF70B1A18F204619B1BDE8FE +:100910001040FFF79ABF0B460A46FFF757FF042324 +:1009200084F82C3010BD2046BDE81040FFF766BFAC +:1009300070B5002600EBC6056C6C2CB10136042E98 +:10094000F8D14FF0FF3070BD85F8481085F8492088 +:100950006B64204670BD70B500F13006002505645B +:100960002946324608230446FFF738FF082804D0FA +:100970002046BDE87040FFF741BFE38E1BB194F9FC +:100980003020002A05DA20463146BDE87040FFF7E6 +:10099000AFBFA28A9A42EBD32269A587A2632268DD +:1009A000D2799A4234BF0523062384F82C3070BDD7 +:1009B00090F82C3010B5062B044610D0072B24D00D +:1009C000052B33D1FFF724FF002833DBA28FE38E02 +:1009D0009B1A2268D27993422CDC062310E0FFF7A1 +:1009E00017FF002826DB204604F13001FFF74FFFF8 +:1009F00048B100210B4620460A46FFF7E7FE0423D4 +:100A000084F82C3010BD204610E000210B460A4629 +:100A1000FFF7E4FE002384F82C30236C1BB1204642 +:100A200004F1300198470023236410BDBDE8104055 +:100A3000FFF7E4BE10BD90F82C3010B5032B044630 +:100A400007D0042B07D0022B1CD1BDE81040FFF7C4 +:100A5000FCBE072313E0036C13B100F1300198478B +:100A600094F8303053B994F83130052B06D1D4F8CE +:100A7000D830618E5B682046C9B29847002384F85D +:100A80002C3010BDBDE81040FFF7B8BE1988012911 +:100A900084BF012119801368C27D01201A7070473C +:100AA00030B5C57D0D246C4340680D3C20448D88D5 +:100AB0000479A5420CD201241C808B88D0F809004F +:100AC0001B011B58126803B11B781370012030BD45 +:100AD000002030BD19880120022984BF022119801D +:100AE000116800230B701268537070471988012039 +:100AF000022984BF02211980116800230B7012683B +:100B00005370704738B514461A882568022A84BF86 +:100B100002221A808988C9B2FFF76CFE003018BF24 +:100B200001202870236800225A70012038BD08B5C2 +:100B300089880122C9B2FFF759FE012008BD08B516 +:100B400089880022C9B2FFF751FE012008BD10B507 +:100B50000B786BB94C887F2C0AD8D0F8D8308475C4 +:100B600093F8302032B149885B68C9B2984701E0F8 +:100B7000002010BD012010BDF8B54B88C27D044691 +:100B80009A420E4618D0C375D0F8D830DB68984723 +:100B9000D4F8C43083B100236364E3646365E36520 +:100BA00004F1C00504F1D00755F8043F13B1204605 +:100BB00071889847BD42F7D10120F8BD70B51E4637 +:100BC000C37D0D225A4343680D3A1A448C88137929 +:100BD0000D46A34216D9D2F8091022018C186B8851 +:100BE00024799C420ED98A580AB1137000E04BB99F +:100BF000D0F8D43013B1A9886A889847002333808D +:100C0000012070BD002070BD2DE9F04F98464B8843 +:100C100089B0DFB21B0A022B0546164611D0032B02 +:100C200000F0E380012B40F020810268B8F800104A +:100C30003260026812788A4228BF0A46A8F800206B +:100C400011E10369B8F80040136000930D235F437E +:100C5000D0F80490009819F8075009EB0703A54253 +:100C600028BF254619462A46019300F0A3FC009BA5 +:100C7000641B19F807705E19A4B200230393019B4B +:100C80001A79BDF80C309A4240F2AA801B010593F4 +:100C9000019B059AD3F809301344D3F808A0BAF1A0 +:100CA000000F13D09AF800903046A14528BFA14606 +:100CB00051464A4600F07EFC9AF80030C9EB040425 +:100CC0004D441F444E44A4B2ADB2BFB200230293C0 +:100CD000019B059AD3F80930BDF808A013441A798E +:100CE00052457AD9152202FB0AFADB68304613F81E +:100CF0000A9003EB0A0BA14528BFA14659464A4674 +:100D0000049300F057FC049BDBF80D1013F80A3035 +:100D1000C9EB04044D441F444E44A4B2ADB2BFB26B +:100D2000A1B1DBF811903046A145A8BFA1461FFA3A +:100D300089F94A4600F03EFCDBF81130C9EB0404A7 +:100D40004D441F444E44A4B2ADB2BFB2002304933D +:100D5000BDF810A09BF8043053453BD9DBF809C01F +:100D6000CAEB0A1A1CF80A900CEB0A03A14528BF2B +:100D7000A146194630464A46CDF81CC0069300F0FD +:100D800019FCDDF81CC0069B1CF80A20D3F80710DC +:100D9000C9EB04044D4417444E44A4B2ADB2BFB2F3 +:100DA000A9B1D3F80B903046A145A8BFA1461FFAC0 +:100DB00089F94A4600F0FEFB069BC9EB0404D3F810 +:100DC0000B304D441F444E44A4B2ADB2BFB2049B9D +:100DD0000133BCE7029B013379E7039B01334DE705 +:100DE000009B5F80A8F800503DE0046967B90923C3 +:100DF000A3700423E3702370B8F80030042B28BFDD +:100E00000423A8F800302BE08368013F6BB3C2686D +:100E100097422ADA40F209428988914225D153F853 +:100E2000270000F03DFC01304000C0B22070B8F84F +:100E300000304FEA8709984228BF18460022A8F8D8 +:100E40000000B8F800305B08013B9A4208DAAB6852 +:100E500053F80930995C04EB420359800132F0E702 +:100E6000032363703460012000E0002009B0BDE876 +:100E7000F08F10B5002200F1C00454F8043F2BB1EC +:100E80000132042AF9D14FF0FF3010BD00EB82008F +:100E9000C0F8C410184610BD30B54C78092C07D8DE +:100EA000044D55F824401CB1A446BDE830406047CD +:100EB000002030BDA017000830B54C780B2C07D8A7 +:100EC000044D55F824401CB1A446BDE830406047AD +:100ED000002030BDC817000810B54C78012C03D095 +:100EE0000AD3032C04D00CE04C8854B9064C04E01F +:100EF0004C8834B9054C00E0054CA446BDE81040D0 +:100F00006047002010BD00BF3F0B00082F0B0008FA +:100F1000050B000810B50C7814F0600F12D104F026 +:100F20001F04012C0AD005D3022C0BD1BDE81040C0 +:100F3000FFF7D2BFBDE81040FFF7AEBFBDE81040DD +:100F4000FFF7BABF002010BD024B41F080011960CD +:100F5000704700BF4C5C004010B50E4A0E4940F689 +:100F60003F731468234043F4004343F0800313604D +:100F700043F60F731468234043F4004343F08003A7 +:100F800042F8043B8A42EAD10368DB7920335B00F4 +:100F9000038310BD045C0040205C004030B5C9B93B +:100FA000354B10241B68012023F4E04323F0400359 +:100FB0009BB2002A0CBF20251025054218BF4340D4 +:100FC0004000013C80B2F4D143F400432A4843F08E +:100FD000800303600B0624D501F07F01890001F135 +:100FE000804101F5B8410B68102423F4E04323F05D +:100FF00040039BB20120002A0CBF2025102505428A +:1010000018BF43404000013C80B2F4D143F4004398 +:1010100043F080030B606ABB48F6CF730A68134045 +:1010200027E0890042B94CF68F7001F1804303F547 +:10103000B8431C682040186001F1804101F5B841B7 +:101040000B68102423F4804323F070039BB201202B +:10105000002A14BF4FF480554FF44055054218BF85 +:1010600043404000013C80B2F2D143F4004343F0DE +:1010700080030B6030BD00BF005C00400B060BD549 +:1010800001F07F01890001F1804101F5B841086854 +:1010900000F03000102809E0890001F1804101F5DD +:1010A000B841086800F44050B0F5805F14BF0020DC +:1010B0000120704701F07F01880000F1804000F5B9 +:1010C000B840F0B5046804F03004302C3CD01F4E1A +:1010D000C9003468A4B20C44640004F1804404F5EF +:1010E000C04425685C1CADB26D00641005EB84043F +:1010F00005F1804704F1804407F5C04704F5C0447A +:10110000A74204D032F8025B27F8045BF8E73268A4 +:10111000102492B211440E4A490053500268012132 +:1011200022F4E04222F0400292B211F0300F18BFD8 +:101130004A404900013C89B2F7D142F4004242F0F2 +:10114000800202601846F0BD0020F0BD505C0040F7 +:10115000046000402DE9F0418C0004F1804404F566 +:10116000B844206800F44050B0F5405F56D02E4897 +:10117000CE0005682D4FADB235446D007D59C5F3E5 +:1011800009059D42054608DA036800F56F709BB2B9 +:1011900033445B00C358C3F309032868244D80B26D +:1011A0003044400028585E0880B2400000F1804082 +:1011B00000F5C04007469646354603F0010C35B1B0 +:1011C00037F8048B013D2EF8028BADB2F7E7BCF186 +:1011D000000F03D010F8260002F8160040F60F7238 +:1011E0002068024042F080022260124A525CC2B97A +:1011F0002268102022F4804222F0700292B2012173 +:1012000011F4405F18BF4A404900013889B2F7D154 +:1012100042F4004242F08002226002E00020BDE879 +:10122000F0811846BDE8F081505C00400C60004041 +:101230000860004024090020F8B5324B05461968C3 +:101240001C468EB216F4806F08D04FF6FF321A603B +:1012500040230383BDE8F840FFF79EBA080432D567 +:1012600001F00F0116F010034FEA810209D002F1DC +:10127000804303F5B8431B68C3F3C0230133DBB2DB +:101280000CE040F60F7002F1804707F5B847D7F839 +:1012900000E00EEA000040F40040386001EB41003D +:1012A000034405EB83035B6E13B1284698470AE0BD +:1012B00002F1804340F60F7203F5B84319680A4003 +:1012C00042F080021A60310505D54FF2FF732360AA +:1012D0002B6A03B19847F20405D54EF6FF732360DD +:1012E0006B6A03B19847B30505D54FF6FF532360EA +:1012F000AB6A03B19847AA6A034B02B101221A6094 +:10130000F8BD00BF445C004000900B4208B508489F +:101310004FF40001FFF7CDF9064A07490023136097 +:101320000B6041F80C3C4FF41C431360034808BDAC +:101330001C100240405C0040505C00402C08002023 +:101340002DE9F7430F466C4657490546086849683A +:1013500027F07F0803C407F07F018C0004F180446C +:1013600004F5B84420680A9E20F4E04020F07F0095 +:10137000084380B2206048F68F10276808F0FF0C01 +:10138000384002AF07EB420232F8082CDFF81CE1CC +:1013900002432260CF00B8F1000F1AD1C9B1DEF8C4 +:1013A0000020288B92B23A44DFF804C152003E2B51 +:1013B0004CF802001A4644D913F01F0F18BFA3F1CE +:1013C00020026FEA82526FEA5242DEF800E092B2E7 +:1013D0003EE0DEF80020288B92B23A44520002F13F +:1013E000804202F5C04210601EB10C2202FB015285 +:1013F000566648F6CF72D4F800804FF0100908EA1C +:101400000202226022684FF0010822F4E04222F03A +:10141000400292B218F0200F18BF88EA02024FEA89 +:101420004808B9F101091FFA88F8F3D142F40042E3 +:1014300042F08002184422602883BCF1000F30D1B2 +:10144000ADE713F0010F18BF5A1CDEF800E092025E +:101450001FFA8EFE7744DFF85CE07F004EF807202D +:101460001EB10C2202FB01518E664CF68F72216870 +:1014700010260A4022602268012122F4804222F0D4 +:10148000700292B211F4405F18BF4A404900013E19 +:1014900089B2F7D142F4004242F080020344226054 +:1014A0002B8303B0BDE8F083F8170008505C0040C0 +:1014B000086000400C6000400B0626D4134B10203F +:1014C0005A54890001F1804101F5B8410B6823F4B9 +:1014D000804323F070039BB24AB1012212F4005FF3 +:1014E00018BF53405200013892B2F7D108E00122F0 +:1014F00012F4405F18BF53405200013892B2F7D146 +:1015000043F4004343F080030B607047240900203C +:10151000FEE77047184C19491948002253188342B6 +:1015200003D2135953500432F8E7164A002193426C +:1015300002D219600433FAE7134A144C1368144DAD +:1015400043F400731360AC4203D254F8043B984751 +:10155000F9E7104C104DAC4203D254F8043B9847C5 +:10156000F9E7FEF79DFE0D4C0D4DAC4203D254F849 +:10157000043B9847F9E700BF34180008000000203A +:10158000200000202C09002014ED00E03418000891 +:1015900034180008341800083418000834180008FB +:1015A00034180008014A024B1A60FEE70400FA05ED +:1015B0000CED00E0844641EA000313F0030349D137 +:1015C000403A23D30B6803604B6843608B688360A9 +:1015D000CB68C3600B6903614B6943618B698361AD +:1015E000CB69C3610B6A03624B6A43628B6A836295 +:1015F000CB6AC3620B6B03634B6B43638B6B83637D +:10160000CB6BC36340304031403ADBD230320BD336 +:101610000B6803604B6843608B688360CB68C36072 +:1016200010301031103AF3D20C3205D351F8043B8C +:1016300040F8043B043AF9D2043208D0D2071CBF68 +:1016400011F8013B00F8013B01D30B880380604691 +:10165000704700BF082A13D38B07B1D010F00303E3 +:10166000AED0C3F10403D21ADB071CBF11F8013B53 +:1016700000F8013BA4D331F8023B20F8023B9FE77E +:10168000043AD9D3013A11F8013B00F8013BF9D2F1 +:101690000B7803704B7843708B788370604670478B +:1016A00020F0030110F00300C0F1000051F8043BEA +:1016B00000F1040C4FEACC0C6FF000021CBF22FAC0 +:1016C0000CF213434FF0010C4CEA0C2C4CEA0C4C7E +:1016D000A3EB0C0222EA030212EACC1204BF51F877 +:1016E000043B0430F4D0C2F1000102EA0102B2FA74 +:1016F00082F2C2F11F0200EBD20070471201000219 +:101700000000004034127856000201020301090271 +:101710000000010100C0321C17000800000000009A +:1017200001000000000000002C1700080904000060 +:1017300000FE01020400000000411700080900003B +:1017400000092101FF0000041A0143616262616720 +:1017500065732061726520676F6F6420666F722009 +:10176000796F75006669736800736F757000404922 +:101770006E7465726E616C20466C61736820202007 +:101780002F307830383030303030302F382A303009 +:10179000314B612C35362A3030314B670000000068 +:1017A000D50A000800000000000000000000000052 +:1017B000000000004F0B0008090C000800000000AA +:1017C0008D0A0008790B0008ED0A000800000000EF +:1017D0000000000000000000000000000000000009 +:1017E00000000000000000000000000000000000F9 +:1017F000A10A0008BD0B000800020004000000065A +:101800000D130008490F000841130008590F000884 +:101810009D0F0008B91400087D100008B5100008DD +:1018200055110008391200080000000000000000F7 +:0418300000000000B4 +:10183400020000004A17000864170008691700082E +:101844006E17000800127A0000127A0000127A0063 +:0400000508001515C5 +:00000001FF -- cgit v1.2.3