From 82ce8f0dbf0a5bd07b077d04c692a5f28e44ce2f Mon Sep 17 00:00:00 2001 From: Georg Date: Tue, 17 Jan 2017 10:53:21 +0100 Subject: [PATCH 001/104] added MiFare Classic and Crypto1 patch -- thanks to jsrFDED --- Firmware/Chameleon-Mini/Application/Crypto1.c | 1253 +++++++++++++---- Firmware/Chameleon-Mini/Application/Crypto1.h | 18 +- .../Application/MifareClassic.c | 454 +++++- 3 files changed, 1368 insertions(+), 357 deletions(-) diff --git a/Firmware/Chameleon-Mini/Application/Crypto1.c b/Firmware/Chameleon-Mini/Application/Crypto1.c index e172381..f4f3d18 100644 --- a/Firmware/Chameleon-Mini/Application/Crypto1.c +++ b/Firmware/Chameleon-Mini/Application/Crypto1.c @@ -1,11 +1,18 @@ #include "Crypto1.h" +/* avoid compiler complaining at the shift macros */ +#pragma GCC diagnostic ignored "-Wuninitialized" + +// uncomment if platform is not avr +// #define NO_INLINE_ASM 1 + #define PRNG_MASK 0x002D0000UL /* x^16 + x^14 + x^13 + x^11 + 1 */ #define PRNG_SIZE 4 /* Bytes */ +#define NONCE_SIZE 4 /* Bytes */ -#define LFSR_MASK_EVEN 0x2010E1UL +#define LFSR_MASK_EVEN 0x2010E1UL #define LFSR_MASK_ODD 0x3A7394UL /* x^48 + x^43 + x^39 + x^38 + x^36 + x^34 + x^33 + x^31 + x^29 + * x^24 + x^23 + x^21 + x^19 + x^13 + x^9 + x^7 + x^6 + x^5 + 1 */ @@ -26,44 +33,252 @@ ( x0 | ( (x1 | x4) & (x3 ^ x4) ) ) ^ ( ( x0 ^ (x1 & x3) ) & ( (x2 ^ x3) | (x1 & x4) ) ) \ ) -#define SWAPENDIAN(x)\ - (x = (x >> 8 & 0xff00ff) | (x & 0xff00ff) << 8, x = x >> 16 | x << 16) -/* Create tables from function fa, fb and fc for faster access */ -static const uint8_t TableAB[5][16] = { - { /* fa with Input {3,2,1,0} = (0,0,0,0) to (1,1,1,1) shifted by 0 */ - FA(0,0,0,0) << 0, FA(0,0,0,1) << 0, FA(0,0,1,0) << 0, FA(0,0,1,1) << 0, - FA(0,1,0,0) << 0, FA(0,1,0,1) << 0, FA(0,1,1,0) << 0, FA(0,1,1,1) << 0, - FA(1,0,0,0) << 0, FA(1,0,0,1) << 0, FA(1,0,1,0) << 0, FA(1,0,1,1) << 0, - FA(1,1,0,0) << 0, FA(1,1,0,1) << 0, FA(1,1,1,0) << 0, FA(1,1,1,1) << 0, +/* For AVR only */ +#ifndef NO_INLINE_ASM + +/* Buffer size and parity offset */ +#include "../Codec/ISO14443-2A.h" + +/* Table lookup for odd parity */ +#include "../Common.h" + +/* Special macros for optimized usage of the xmega */ +/* see http://rn-wissen.de/wiki/index.php?title=Inline-Assembler_in_avr-gcc */ + +/* Split byte into odd and even nibbles- */ +/* Used for LFSR setup. */ +#define SPLIT_BYTE(__even, __odd, __byte) \ + __asm__ __volatile__ ( \ + "lsr %2" "\n\t" \ + "ror %0" "\n\t" \ + "lsr %2" "\n\t" \ + "ror %1" "\n\t" \ + "lsr %2" "\n\t" \ + "ror %0" "\n\t" \ + "lsr %2" "\n\t" \ + "ror %1" "\n\t" \ + "lsr %2" "\n\t" \ + "ror %0" "\n\t" \ + "lsr %2" "\n\t" \ + "ror %1" "\n\t" \ + "lsr %2" "\n\t" \ + "ror %0" "\n\t" \ + "lsr %2" "\n\t" \ + "ror %1" \ + : "+r" (__even), \ + "+r" (__odd), \ + "+r" (__byte) \ + : \ + : "r0" ) + +/* Shift half LFSR state stored in three registers */ +/* Input is bit 0 of __in */ +#define SHIFT24(__b0, __b1, __b2, __in) \ + __asm__ __volatile__ ( \ + "lsr %3" "\n\t" \ + "ror %2" "\n\t" \ + "ror %1" "\n\t" \ + "ror %0" \ + : "+r" (__b0), \ + "+r" (__b1), \ + "+r" (__b2), \ + "+r" (__in) \ + : \ + : ) + +/* Shift half LFSR state stored in three registers */ +/* Input is bit 0 of __in */ +/* decrypt with __stream if bit 0 of __decrypt is set */ +#define SHIFT24_COND_DECRYPT(__b0, __b1, __b2, __in, __stream, __decrypt) \ + __asm__ __volatile__ ( \ + "sbrc %5, 0" "\n\t" \ + "eor %3, %4" "\n\t" \ + "lsr %3" "\n\t" \ + "ror %2" "\n\t" \ + "ror %1" "\n\t" \ + "ror %0" \ + : "+r" (__b0), \ + "+r" (__b1), \ + "+r" (__b2), \ + "+r" (__in) \ + : "r" (__stream), \ + "r" (__decrypt) \ + : "r0" ) + +/* Shift a byte with input from an other byte */ +/* Input is bit 0 of __in */ +#define SHIFT8(__byte, __in) \ + __asm__ __volatile__ ( \ + "lsr %1" "\n\t" \ + "ror %0" \ + : "+r" (__byte), \ + "+r" (__in) \ + : \ + : "r0" ) +/* End AVR specific */ +#else + +/* Plattform independend code */ + +/* avoid including avr-Files in case of test */ +#ifndef CODEC_BUFFER_SIZE +#define CODEC_BUFFER_SIZE 256 +#endif +#ifndef ISO14443A_BUFFER_PARITY_OFFSET +#define ISO14443A_BUFFER_PARITY_OFFSET (CODEC_BUFFER_SIZE/2) +#endif + +#define SHIFT24(__b0, __b1, __b2, __in) \ + __b0 = (__b0>>1) | (__b1<<7); \ + __b1 = (__b1>>1) | (__b2<<7); \ + __b2 = (__b2>>1) | ((__in)<<7) + +#define SHIFT24_COND_DECRYPT(__b0, __b1, __b2, __in, __stream, __decrypt) \ + __b0 = (__b0>>1) | (__b1<<7); \ + __b1 = (__b1>>1) | (__b2<<7); \ + __b2 = (__b2>>1) | (((__in)^((__stream)&(__decrypt)))<<7) + +#define SHIFT8(__byte, __in) __byte = (__byte>>1) | ((__in)<<7) + +#define SPLIT_BYTE(__even, __odd, __byte) \ + __even = (__even >> 1) | (__byte<<7); __byte>>=1; \ + __odd = (__odd >> 1) | (__byte<<7); __byte>>=1; \ + __even = (__even >> 1) | (__byte<<7); __byte>>=1; \ + __odd = (__odd >> 1) | (__byte<<7); __byte>>=1; \ + __even = (__even >> 1) | (__byte<<7); __byte>>=1; \ + __odd = (__odd >> 1) | (__byte<<7); __byte>>=1; \ + __even = (__even >> 1) | (__byte<<7); __byte>>=1; \ + __odd = (__odd >> 1) | (__byte<<7) + + +/* Generate odd parity bit */ +#define ODD_PARITY(val) \ + (__extension__({ \ + uint8_t __p = (uint8_t)(val); \ + __p ^= ((__p >> 4)|(__p << 4)) ; \ + __p ^= __p >> 2 ; \ + ((--__p) >> 1) & 1; /* see "avr/util.h" */ \ + })) +#endif + +/* Space/speed tradoff. */ +/* We want speed, so we have to pay with size. */ +/* If we combine the A und B Filtertables and precalculate the values */ +/* for each state byte, we get the following tables which gives a */ +/* faster calculation of the filter output */ +/* Table of the filter A/B output per byte */ +static const uint8_t abFilterTable[3][256] = +{ + /* for Odd[0] */ + { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 }, - { /* fb with Input {3,2,1,0} = (0,0,0,0) to (1,1,1,1) shifted by 1 */ - FB(0,0,0,0) << 1, FB(0,0,0,1) << 1, FB(0,0,1,0) << 1, FB(0,0,1,1) << 1, - FB(0,1,0,0) << 1, FB(0,1,0,1) << 1, FB(0,1,1,0) << 1, FB(0,1,1,1) << 1, - FB(1,0,0,0) << 1, FB(1,0,0,1) << 1, FB(1,0,1,0) << 1, FB(1,0,1,1) << 1, - FB(1,1,0,0) << 1, FB(1,1,0,1) << 1, FB(1,1,1,0) << 1, FB(1,1,1,1) << 1, + /* for Odd[1] */ + { + 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x02, + 0x00, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x02, + 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x02, + 0x00, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x02, + 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x02, + 0x00, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x02, + 0x04, 0x04, 0x04, 0x06, 0x06, 0x04, 0x04, 0x06, + 0x04, 0x06, 0x06, 0x06, 0x06, 0x04, 0x04, 0x06, + 0x04, 0x04, 0x04, 0x06, 0x06, 0x04, 0x04, 0x06, + 0x04, 0x06, 0x06, 0x06, 0x06, 0x04, 0x04, 0x06, + 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x02, + 0x00, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x02, + 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x02, + 0x00, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x02, + 0x04, 0x04, 0x04, 0x06, 0x06, 0x04, 0x04, 0x06, + 0x04, 0x06, 0x06, 0x06, 0x06, 0x04, 0x04, 0x06, + 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x02, + 0x00, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x02, + 0x04, 0x04, 0x04, 0x06, 0x06, 0x04, 0x04, 0x06, + 0x04, 0x06, 0x06, 0x06, 0x06, 0x04, 0x04, 0x06, + 0x04, 0x04, 0x04, 0x06, 0x06, 0x04, 0x04, 0x06, + 0x04, 0x06, 0x06, 0x06, 0x06, 0x04, 0x04, 0x06, + 0x04, 0x04, 0x04, 0x06, 0x06, 0x04, 0x04, 0x06, + 0x04, 0x06, 0x06, 0x06, 0x06, 0x04, 0x04, 0x06, + 0x04, 0x04, 0x04, 0x06, 0x06, 0x04, 0x04, 0x06, + 0x04, 0x06, 0x06, 0x06, 0x06, 0x04, 0x04, 0x06, + 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x02, + 0x00, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x02, + 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x02, + 0x00, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x02, + 0x04, 0x04, 0x04, 0x06, 0x06, 0x04, 0x04, 0x06, + 0x04, 0x06, 0x06, 0x06, 0x06, 0x04, 0x04, 0x06 }, - { /* fb with Input {3,2,1,0} = (0,0,0,0) to (1,1,1,1) shifted by 2 */ - FB(0,0,0,0) << 2, FB(0,0,0,1) << 2, FB(0,0,1,0) << 2, FB(0,0,1,1) << 2, - FB(0,1,0,0) << 2, FB(0,1,0,1) << 2, FB(0,1,1,0) << 2, FB(0,1,1,1) << 2, - FB(1,0,0,0) << 2, FB(1,0,0,1) << 2, FB(1,0,1,0) << 2, FB(1,0,1,1) << 2, - FB(1,1,0,0) << 2, FB(1,1,0,1) << 2, FB(1,1,1,0) << 2, FB(1,1,1,1) << 2, - }, - { /* fa with Input {3,2,1,0} = (0,0,0,0) to (1,1,1,1) shifted by 3 */ - FA(0,0,0,0) << 3, FA(0,0,0,1) << 3, FA(0,0,1,0) << 3, FA(0,0,1,1) << 3, - FA(0,1,0,0) << 3, FA(0,1,0,1) << 3, FA(0,1,1,0) << 3, FA(0,1,1,1) << 3, - FA(1,0,0,0) << 3, FA(1,0,0,1) << 3, FA(1,0,1,0) << 3, FA(1,0,1,1) << 3, - FA(1,1,0,0) << 3, FA(1,1,0,1) << 3, FA(1,1,1,0) << 3, FA(1,1,1,1) << 3, - }, - { /* fb with Input {3,2,1,0} = (0,0,0,0) to (1,1,1,1) shifted by 4 */ - FB(0,0,0,0) << 4, FB(0,0,0,1) << 4, FB(0,0,1,0) << 4, FB(0,0,1,1) << 4, - FB(0,1,0,0) << 4, FB(0,1,0,1) << 4, FB(0,1,1,0) << 4, FB(0,1,1,1) << 4, - FB(1,0,0,0) << 4, FB(1,0,0,1) << 4, FB(1,0,1,0) << 4, FB(1,0,1,1) << 4, - FB(1,1,0,0) << 4, FB(1,1,0,1) << 4, FB(1,1,1,0) << 4, FB(1,1,1,1) << 4, + /* for Odd[2] */ + { + 0x00, 0x08, 0x08, 0x08, 0x00, 0x00, 0x00, 0x08, + 0x00, 0x00, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, + 0x00, 0x08, 0x08, 0x08, 0x00, 0x00, 0x00, 0x08, + 0x00, 0x00, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, + 0x00, 0x08, 0x08, 0x08, 0x00, 0x00, 0x00, 0x08, + 0x00, 0x00, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, + 0x10, 0x18, 0x18, 0x18, 0x10, 0x10, 0x10, 0x18, + 0x10, 0x10, 0x18, 0x10, 0x18, 0x18, 0x10, 0x18, + 0x10, 0x18, 0x18, 0x18, 0x10, 0x10, 0x10, 0x18, + 0x10, 0x10, 0x18, 0x10, 0x18, 0x18, 0x10, 0x18, + 0x00, 0x08, 0x08, 0x08, 0x00, 0x00, 0x00, 0x08, + 0x00, 0x00, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, + 0x00, 0x08, 0x08, 0x08, 0x00, 0x00, 0x00, 0x08, + 0x00, 0x00, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, + 0x10, 0x18, 0x18, 0x18, 0x10, 0x10, 0x10, 0x18, + 0x10, 0x10, 0x18, 0x10, 0x18, 0x18, 0x10, 0x18, + 0x00, 0x08, 0x08, 0x08, 0x00, 0x00, 0x00, 0x08, + 0x00, 0x00, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, + 0x10, 0x18, 0x18, 0x18, 0x10, 0x10, 0x10, 0x18, + 0x10, 0x10, 0x18, 0x10, 0x18, 0x18, 0x10, 0x18, + 0x10, 0x18, 0x18, 0x18, 0x10, 0x10, 0x10, 0x18, + 0x10, 0x10, 0x18, 0x10, 0x18, 0x18, 0x10, 0x18, + 0x10, 0x18, 0x18, 0x18, 0x10, 0x10, 0x10, 0x18, + 0x10, 0x10, 0x18, 0x10, 0x18, 0x18, 0x10, 0x18, + 0x10, 0x18, 0x18, 0x18, 0x10, 0x10, 0x10, 0x18, + 0x10, 0x10, 0x18, 0x10, 0x18, 0x18, 0x10, 0x18, + 0x00, 0x08, 0x08, 0x08, 0x00, 0x00, 0x00, 0x08, + 0x00, 0x00, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, + 0x00, 0x08, 0x08, 0x08, 0x00, 0x00, 0x00, 0x08, + 0x00, 0x00, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, + 0x10, 0x18, 0x18, 0x18, 0x10, 0x10, 0x10, 0x18, + 0x10, 0x10, 0x18, 0x10, 0x18, 0x18, 0x10, 0x18 } }; -static const uint8_t TableC[32] = { +/* Standard FC table, feedback at bit 0 */ +static const uint8_t TableC0[32] = { /* fc with Input {4,3,2,1,0} = (0,0,0,0,0) to (1,1,1,1,1) */ FC(0,0,0,0,0), FC(0,0,0,0,1), FC(0,0,0,1,0), FC(0,0,0,1,1), FC(0,0,1,0,0), FC(0,0,1,0,1), FC(0,0,1,1,0), FC(0,0,1,1,1), @@ -72,326 +287,786 @@ static const uint8_t TableC[32] = { FC(1,0,0,0,0), FC(1,0,0,0,1), FC(1,0,0,1,0), FC(1,0,0,1,1), FC(1,0,1,0,0), FC(1,0,1,0,1), FC(1,0,1,1,0), FC(1,0,1,1,1), FC(1,1,0,0,0), FC(1,1,0,0,1), FC(1,1,0,1,0), FC(1,1,0,1,1), - FC(1,1,1,0,0), FC(1,1,1,0,1), FC(1,1,1,1,0), FC(1,1,1,1,1), + FC(1,1,1,0,0), FC(1,1,1,0,1), FC(1,1,1,1,0), FC(1,1,1,1,1) }; -/* Split Crypto1 state into even and odd bits to speed up the output filter network */ -static uint8_t StateEven[LFSR_SIZE/2] = {0}; -static uint8_t StateOdd[LFSR_SIZE/2] = {0}; +/* Special table for byte processing, feedback at bit 7 */ +static const uint8_t TableC7[32] = { + /* fc with Input {4,3,2,1,0} = (0,0,0,0,0) to (1,1,1,1,1) */ + FC(0,0,0,0,0)<<7, FC(0,0,0,0,1)<<7, FC(0,0,0,1,0)<<7, FC(0,0,0,1,1)<<7, + FC(0,0,1,0,0)<<7, FC(0,0,1,0,1)<<7, FC(0,0,1,1,0)<<7, FC(0,0,1,1,1)<<7, + FC(0,1,0,0,0)<<7, FC(0,1,0,0,1)<<7, FC(0,1,0,1,0)<<7, FC(0,1,0,1,1)<<7, + FC(0,1,1,0,0)<<7, FC(0,1,1,0,1)<<7, FC(0,1,1,1,0)<<7, FC(0,1,1,1,1)<<7, + FC(1,0,0,0,0)<<7, FC(1,0,0,0,1)<<7, FC(1,0,0,1,0)<<7, FC(1,0,0,1,1)<<7, + FC(1,0,1,0,0)<<7, FC(1,0,1,0,1)<<7, FC(1,0,1,1,0)<<7, FC(1,0,1,1,1)<<7, + FC(1,1,0,0,0)<<7, FC(1,1,0,0,1)<<7, FC(1,1,0,1,0)<<7, FC(1,1,0,1,1)<<7, + FC(1,1,1,0,0)<<7, FC(1,1,1,0,1)<<7, FC(1,1,1,1,0)<<7, FC(1,1,1,1,1)<<7 +}; + +/* Special table for nibble processing (e.g. ack), feedback at bit 3 */ +static const uint8_t TableC3[32] = { + /* fc with Input {4,3,2,1,0} = (0,0,0,0,0) to (1,1,1,1,1) */ + FC(0,0,0,0,0)<<3, FC(0,0,0,0,1)<<3, FC(0,0,0,1,0)<<3, FC(0,0,0,1,1)<<3, + FC(0,0,1,0,0)<<3, FC(0,0,1,0,1)<<3, FC(0,0,1,1,0)<<3, FC(0,0,1,1,1)<<3, + FC(0,1,0,0,0)<<3, FC(0,1,0,0,1)<<3, FC(0,1,0,1,0)<<3, FC(0,1,0,1,1)<<3, + FC(0,1,1,0,0)<<3, FC(0,1,1,0,1)<<3, FC(0,1,1,1,0)<<3, FC(0,1,1,1,1)<<3, + FC(1,0,0,0,0)<<3, FC(1,0,0,0,1)<<3, FC(1,0,0,1,0)<<3, FC(1,0,0,1,1)<<3, + FC(1,0,1,0,0)<<3, FC(1,0,1,0,1)<<3, FC(1,0,1,1,0)<<3, FC(1,0,1,1,1)<<3, + FC(1,1,0,0,0)<<3, FC(1,1,0,0,1)<<3, FC(1,1,0,1,0)<<3, FC(1,1,0,1,1)<<3, + FC(1,1,1,0,0)<<3, FC(1,1,1,0,1)<<3, FC(1,1,1,1,0)<<3, FC(1,1,1,1,1)<<3 +}; + +/* Filter Output Macros */ +/* Output at bit 7 for optimized byte processing */ +#define CRYPTO1_FILTER_OUTPUT_B7_24(__O0, __O1, __O2) TableC7[ abFilterTable[0][__O0] | \ + abFilterTable[1][__O1] | \ + abFilterTable[2][__O2]] + +/* Output at bit 3 for optimized nibble processing */ +#define CRYPTO1_FILTER_OUTPUT_B3_24(__O0, __O1, __O2) TableC3[ abFilterTable[0][__O0] | \ + abFilterTable[1][__O1] | \ + abFilterTable[2][__O2]] + +/* Output at bit 0 for general purpose */ +#define CRYPTO1_FILTER_OUTPUT_B0_24(__O0, __O1, __O2) TableC0[ abFilterTable[0][__O0] | \ + abFilterTable[1][__O1] | \ + abFilterTable[2][__O2]] + +/* Split Crypto1 state into even and odd bits */ +/* to speed up the output filter network */ +/* Put both into one struct to enable relative adressing */ +typedef struct +{ + uint8_t Even[LFSR_SIZE/2]; + uint8_t Odd[LFSR_SIZE/2]; +} Crypto1LfsrState_t; +static Crypto1LfsrState_t State = {{0},{0}}; + + +/* Debug output of state */ +void Crypto1GetState(uint8_t* pEven, uint8_t* pOdd) +{ + if (pEven) + { + pEven[0] = State.Even[0]; + pEven[1] = State.Even[1]; + pEven[2] = State.Even[2]; + } + if (pOdd) + { + pOdd[0] = State.Odd[0]; + pOdd[1] = State.Odd[1]; + pOdd[2] = State.Odd[2]; + } + +} /* Proceed LFSR by one clock cycle */ +/* Prototype to force inlining */ +static __inline__ uint8_t Crypto1LFSRbyteFeedback (uint8_t E0, + uint8_t E1, + uint8_t E2, + uint8_t O0, + uint8_t O1, + uint8_t O2) __attribute__((always_inline)); +static uint8_t Crypto1LFSRbyteFeedback (uint8_t E0, + uint8_t E1, + uint8_t E2, + uint8_t O0, + uint8_t O1, + uint8_t O2) +{ + uint8_t Feedback; + + /* Calculate feedback according to LFSR taps. XOR all state bytes + * into a single bit. */ + Feedback = E0 & (uint8_t) (LFSR_MASK_EVEN ); + Feedback ^= E1 & (uint8_t) (LFSR_MASK_EVEN >> 8); + Feedback ^= E2 & (uint8_t) (LFSR_MASK_EVEN >> 16); + + Feedback ^= O0 & (uint8_t) (LFSR_MASK_ODD ); + Feedback ^= O1 & (uint8_t) (LFSR_MASK_ODD >> 8); + Feedback ^= O2 & (uint8_t) (LFSR_MASK_ODD >> 16); + + /* fold 8 into 1 bit */ + Feedback ^= ((Feedback >> 4)|(Feedback << 4)); /* Compiler uses a swap for this (fast!) */ + Feedback ^= Feedback >> 2; + Feedback ^= Feedback >> 1; + + return(Feedback); +} + +/* Proceed LFSR by one clock cycle */ +/* Prototype to force inlining */ +static __inline__ void Crypto1LFSR (uint8_t In) __attribute__((always_inline)); static void Crypto1LFSR(uint8_t In) { - uint8_t Feedback = 0; + register uint8_t Temp0, Temp1, Temp2; + uint8_t Feedback; + + /* Load even state. */ + Temp0 = State.Even[0]; + Temp1 = State.Even[1]; + Temp2 = State.Even[2]; + /* Calculate feedback according to LFSR taps. XOR all 6 state bytes - * into a single bit. */ - Feedback ^= StateEven[0] & (uint8_t) (LFSR_MASK_EVEN >> 0); - Feedback ^= StateEven[1] & (uint8_t) (LFSR_MASK_EVEN >> 8); - Feedback ^= StateEven[2] & (uint8_t) (LFSR_MASK_EVEN >> 16); + * into a single bit. */ + Feedback = Temp0 & (uint8_t) (LFSR_MASK_EVEN >> 0); + Feedback ^= Temp1 & (uint8_t) (LFSR_MASK_EVEN >> 8); + Feedback ^= Temp2 & (uint8_t) (LFSR_MASK_EVEN >> 16); - Feedback ^= StateOdd[0] & (uint8_t) (LFSR_MASK_ODD >> 0); - Feedback ^= StateOdd[1] & (uint8_t) (LFSR_MASK_ODD >> 8); - Feedback ^= StateOdd[2] & (uint8_t) (LFSR_MASK_ODD >> 16); + Feedback ^= State.Odd[0] & (uint8_t) (LFSR_MASK_ODD >> 0); + Feedback ^= State.Odd[1] & (uint8_t) (LFSR_MASK_ODD >> 8); + Feedback ^= State.Odd[2] & (uint8_t) (LFSR_MASK_ODD >> 16); - Feedback ^= Feedback >> 4; + Feedback ^= ((Feedback >> 4)|(Feedback << 4)); /* Compiler uses a swap for this (fast!) */ Feedback ^= Feedback >> 2; Feedback ^= Feedback >> 1; /* Now the shifting of the Crypto1 state gets more complicated when - * split up into even/odd parts. After some hard thinking, one can - * see that after one LFSR clock cycle - * - the new even state becomes the old odd state - * - the new odd state becomes the old even state right-shifted by 1. - * For shifting the even state, we convert it into a 32 bit int first */ - uint32_t Temp = 0; - Temp |= ((uint32_t) StateEven[0] << 0); - Temp |= ((uint32_t) StateEven[1] << 8); - Temp |= ((uint32_t) StateEven[2] << 16); - - /* Proceed LFSR. Try to force compiler not to shift the unneded upper bits. */ - Temp = (Temp >> 1) & 0x00FFFFFF; - - /* Calculate MSBit of even state as input bit to LFSR */ - if ( (Feedback & 0x01) ^ In ) { - Temp |= (uint32_t) 1 << (8 * LFSR_SIZE/2 - 1); - } + * split up into even/odd parts. After some hard thinking, one can + * see that after one LFSR clock cycle + * - the new even state becomes the old odd state + * - the new odd state becomes the old even state right-shifted by 1. */ + SHIFT24(Temp0, Temp1, Temp2, Feedback); /* Convert even state back into byte array and swap odd/even state * as explained above. */ - StateEven[0] = StateOdd[0]; - StateEven[1] = StateOdd[1]; - StateEven[2] = StateOdd[2]; + State.Even[0] = State.Odd[0]; + State.Even[1] = State.Odd[1]; + State.Even[2] = State.Odd[2]; - StateOdd[0] = (uint8_t) (Temp >> 0); - StateOdd[1] = (uint8_t) (Temp >> 8); - StateOdd[2] = (uint8_t) (Temp >> 16); + State.Odd[0] = Temp0; + State.Odd[1] = Temp1; + State.Odd[2] = Temp2; } uint8_t Crypto1FilterOutput(void) { - /* Calculate the functions fa, fb. - * Note that only bits {4...23} of the odd state - * get fed into these function. - * The tables are designed to hold mask values, which - * can simply be ORed together to produce the resulting - * 5 bits that are used to lookup the output bit. - */ - uint8_t Sum = 0; - - Sum |= TableAB[0][(StateOdd[0] >> 4) & 0x0F]; - Sum |= TableAB[1][(StateOdd[1] >> 0) & 0x0F]; - Sum |= TableAB[2][(StateOdd[1] >> 4) & 0x0F]; - Sum |= TableAB[3][(StateOdd[2] >> 0) & 0x0F]; - Sum |= TableAB[4][(StateOdd[2] >> 4) & 0x0F]; - - return TableC[Sum]; + return( CRYPTO1_FILTER_OUTPUT_B0_24(State.Odd[0], State.Odd[1], State.Odd[2])); } -void Crypto1Setup(uint8_t Key[6], uint8_t Uid[4], uint8_t CardNonce[4]) +/* Setup LFSR split into odd and even states, feed in uid ^nonce */ +/* Version for first (not nested) authentication. */ +void Crypto1Setup(uint8_t Key[6], + uint8_t Uid[4], + uint8_t CardNonce[4]) { - uint8_t i; + /* state registers */ + register uint8_t Even0, Even1, Even2; + register uint8_t Odd0, Odd1, Odd2; + uint8_t KeyStream; + uint8_t Feedback; + uint8_t Out; + uint8_t In; + uint8_t ByteCount; - /* Again, one trade off when splitting up the state into even/odd parts - * is that loading the key into the state becomes a little more difficult. - * The inner loop generates 8 even and 8 odd bits from 16 key bits and - * the outer loop stores them. */ - for (i=0; i<(LFSR_SIZE/2); i++) { - uint8_t EvenByte = 0; - uint8_t OddByte = 0; - uint16_t KeyWord = ((uint16_t) Key[2*i+1] << 8) | Key[2*i+0]; - uint8_t j; + KeyStream = *Key++; + SPLIT_BYTE(Even0, Odd0, KeyStream); + KeyStream = *Key++; + SPLIT_BYTE(Even0, Odd0, KeyStream); + KeyStream = *Key++; + SPLIT_BYTE(Even1, Odd1, KeyStream); + KeyStream = *Key++; + SPLIT_BYTE(Even1, Odd1, KeyStream); + KeyStream = *Key++; + SPLIT_BYTE(Even2, Odd2, KeyStream); + KeyStream = *Key++; + SPLIT_BYTE(Even2, Odd2, KeyStream); - for (j=0; j<8; j++) { - EvenByte >>= 1; - OddByte >>= 1; - - if (KeyWord & (1<<0)) { - EvenByte |= 0x80; - } - - if (KeyWord & (1<<1)) { - OddByte |= 0x80; - } - - KeyWord >>= 2; - } - - StateEven[i] = EvenByte; - StateOdd[i] = OddByte; - } - - /* Use Uid XOR CardNonce as feed-in and do 32 clocks on the - * Crypto1 LFSR.*/ - uint32_t Temp = 0; - - Temp |= (uint32_t) (Uid[0] ^ CardNonce[0]) << 0; - Temp |= (uint32_t) (Uid[1] ^ CardNonce[1]) << 8; - Temp |= (uint32_t) (Uid[2] ^ CardNonce[2]) << 16; - Temp |= (uint32_t) (Uid[3] ^ CardNonce[3]) << 24; - - for (i=0; i<32; i++) { - uint8_t Out = Crypto1FilterOutput(); - - Crypto1LFSR(Temp & 0x01); - Temp >>= 1; - - /* Store the keystream for later use */ - if (Out) { - Temp |= (uint32_t) 1 << 31; - } - } - - /* Crypto1 state register is now set up to be used for authentication. - * In case of nested authentication, we need to use the produced keystream - * to encrypt the CardNonce. For this case we do the encryption in-place. */ - CardNonce[0] ^= (uint8_t) (Temp >> 0); - CardNonce[1] ^= (uint8_t) (Temp >> 8); - CardNonce[2] ^= (uint8_t) (Temp >> 16); - CardNonce[3] ^= (uint8_t) (Temp >> 24); -} - -void Crypto1SetupReader(uint8_t Key[6], uint8_t Uid[4], uint8_t CardNonce[4], bool Nested) -{ - uint8_t i; - - /* Again, one trade off when splitting up the state into even/odd parts - * is that loading the key into the state becomes a little more difficult. - * The inner loop generates 8 even and 8 odd bits from 16 key bits and - * the outer loop stores them. */ - for (i=0; i<(LFSR_SIZE/2); i++) { - uint8_t EvenByte = 0; - uint8_t OddByte = 0; - uint16_t KeyWord = ((uint16_t) Key[2*i+1] << 8) | Key[2*i+0]; - uint8_t j; - - for (j=0; j<8; j++) { - EvenByte >>= 1; - OddByte >>= 1; - - if (KeyWord & (1<<0)) { - EvenByte |= 0x80; - } - - if (KeyWord & (1<<1)) { - OddByte |= 0x80; - } - - KeyWord >>= 2; - } - - StateEven[i] = EvenByte; - StateOdd[i] = OddByte; - } - - if (Nested) + for ( ByteCount = 0; ByteCount < NONCE_SIZE; ByteCount++) { - /* Use Uid XOR DECRYPTED CardNonce as feed-in and do 32 clocks on the - * Crypto1 LFSR.*/ - for (i=0; i<32; i++) - { - CardNonce[i/8] ^= Crypto1FilterOutput() << (i % 8); // decrypt bit + In = *CardNonce ^ *Uid++; - Crypto1LFSR(((Uid[i/8]^CardNonce[i/8]) >> (i % 8)) & 0x01); // feed back decrypted CardNonce bit XOR uid bit - } - } else { - /* Use Uid XOR CardNonce as feed-in and do 32 clocks on the - * Crypto1 LFSR.*/ - uint32_t Temp = 0; + Out = CRYPTO1_FILTER_OUTPUT_B0_24(Odd0, Odd1, Odd2); + SHIFT8(KeyStream, Out); + Feedback = Crypto1LFSRbyteFeedback(Even0,Even1,Even2,Odd0,Odd1,Odd2); + Feedback ^= In; + SHIFT24(Even0,Even1,Even2, Feedback); - Temp |= (uint32_t) (Uid[0] ^ CardNonce[0]) << 0; - Temp |= (uint32_t) (Uid[1] ^ CardNonce[1]) << 8; - Temp |= (uint32_t) (Uid[2] ^ CardNonce[2]) << 16; - Temp |= (uint32_t) (Uid[3] ^ CardNonce[3]) << 24; + /* Bit 1 */ + In >>= 1; + /* remember Odd/Even swap has been omitted! */ + Out = CRYPTO1_FILTER_OUTPUT_B0_24(Even0,Even1,Even2); + SHIFT8(KeyStream, Out); + Feedback = Crypto1LFSRbyteFeedback(Odd0,Odd1,Odd2,Even0,Even1,Even2); + Feedback ^= In; + SHIFT24(Odd0,Odd1,Odd2, Feedback); - for (i=0; i<32; i++) - { - Crypto1LFSR(Temp & 0x01); - Temp >>= 1; - } + /* Bit 2 */ + In >>= 1; + Out = CRYPTO1_FILTER_OUTPUT_B0_24(Odd0, Odd1, Odd2); + SHIFT8(KeyStream, Out); + Feedback = Crypto1LFSRbyteFeedback(Even0,Even1,Even2,Odd0,Odd1,Odd2); + Feedback ^= In; + SHIFT24(Even0,Even1,Even2, Feedback); + + /* Bit 3 */ + In >>= 1; + Out = CRYPTO1_FILTER_OUTPUT_B0_24(Even0,Even1,Even2); + SHIFT8(KeyStream, Out); + Feedback = Crypto1LFSRbyteFeedback(Odd0,Odd1,Odd2,Even0,Even1,Even2); + Feedback ^= In; + SHIFT24(Odd0,Odd1,Odd2, Feedback); + + /* Bit 4 */ + In >>= 1; + Out = CRYPTO1_FILTER_OUTPUT_B0_24(Odd0, Odd1, Odd2); + SHIFT8(KeyStream, Out); + Feedback = Crypto1LFSRbyteFeedback(Even0,Even1,Even2,Odd0,Odd1,Odd2); + Feedback ^= In; + SHIFT24(Even0,Even1,Even2, Feedback); + + /* Bit 5 */ + In >>= 1; + Out = CRYPTO1_FILTER_OUTPUT_B0_24(Even0,Even1,Even2); + SHIFT8(KeyStream, Out); + Feedback = Crypto1LFSRbyteFeedback(Odd0,Odd1,Odd2,Even0,Even1,Even2); + Feedback ^= In; + SHIFT24(Odd0,Odd1,Odd2, Feedback); + + /* Bit 6 */ + In >>= 1; + Out = CRYPTO1_FILTER_OUTPUT_B0_24(Odd0, Odd1, Odd2); + SHIFT8(KeyStream, Out); + Feedback = Crypto1LFSRbyteFeedback(Even0,Even1,Even2,Odd0,Odd1,Odd2); + Feedback ^= In; + SHIFT24(Even0,Even1,Even2, Feedback); + + /* Bit 7 */ + In >>= 1; + Out = CRYPTO1_FILTER_OUTPUT_B0_24(Even0,Even1,Even2); + SHIFT8(KeyStream, Out); + Feedback = Crypto1LFSRbyteFeedback(Odd0,Odd1,Odd2,Even0,Even1,Even2); + Feedback ^= In; + SHIFT24(Odd0,Odd1,Odd2, Feedback); + + /* Encrypt Nonce */ + *CardNonce++ ^= KeyStream; /* Encrypt byte */ } + /* save state */ + State.Even[0] = Even0; + State.Even[1] = Even1; + State.Even[2] = Even2; + State.Odd[0] = Odd0; + State.Odd[1] = Odd1; + State.Odd[2] = Odd2; } -void Crypto1Auth(uint8_t EncryptedReaderNonce[4]) +/* Setup LFSR split into odd and even states, feed in uid ^nonce */ +/* Vesion for nested authentication. */ +/* Also generates encrypted parity bits at CardNonce[4]..[7] */ +/* Use: Decrypt = false for the tag, Decrypt = true for the reader */ +void Crypto1SetupNested(uint8_t Key[6], uint8_t Uid[4], uint8_t CardNonce[8], bool Decrypt) { - uint32_t Temp = 0; + /* state registers */ + register uint8_t Even0, Even1, Even2; + register uint8_t Odd0, Odd1, Odd2; + uint8_t KeyStream; + uint8_t Feedback; + uint8_t Out; + uint8_t In; + uint8_t ByteCount; - /* For ease of processing, we convert the encrypted reader nonce - * into a 32 bit integer */ - Temp |= (uint32_t) EncryptedReaderNonce[0] << 0; - Temp |= (uint32_t) EncryptedReaderNonce[1] << 8; - Temp |= (uint32_t) EncryptedReaderNonce[2] << 16; - Temp |= (uint32_t) EncryptedReaderNonce[3] << 24; + KeyStream = *Key++; + SPLIT_BYTE(Even0, Odd0, KeyStream); + KeyStream = *Key++; + SPLIT_BYTE(Even0, Odd0, KeyStream); + KeyStream = *Key++; + SPLIT_BYTE(Even1, Odd1, KeyStream); + KeyStream = *Key++; + SPLIT_BYTE(Even1, Odd1, KeyStream); + KeyStream = *Key++; + SPLIT_BYTE(Even2, Odd2, KeyStream); + KeyStream = *Key++; + SPLIT_BYTE(Even2, Odd2, KeyStream); + /* Get first filter output */ + Out = CRYPTO1_FILTER_OUTPUT_B0_24(Odd0, Odd1, Odd2); + + for ( ByteCount = 0; ByteCount < NONCE_SIZE; ByteCount++) + { + In = *CardNonce ^ *Uid++; + + /* we can reuse the filter output used to decrypt the parity bit! */ + SHIFT8(KeyStream, Out); + Feedback = Crypto1LFSRbyteFeedback(Even0,Even1,Even2,Odd0,Odd1,Odd2); + Feedback ^= In; + SHIFT24_COND_DECRYPT(Even0,Even1,Even2, Feedback, Out, Decrypt); + + /* Bit 1 */ + In >>= 1; + /* remember Odd/Even swap has been omitted! */ + Out = CRYPTO1_FILTER_OUTPUT_B0_24(Even0,Even1,Even2); + SHIFT8(KeyStream, Out); + Feedback = Crypto1LFSRbyteFeedback(Odd0,Odd1,Odd2,Even0,Even1,Even2); + Feedback ^= In; + SHIFT24_COND_DECRYPT(Odd0,Odd1,Odd2, Feedback, Out, Decrypt); + + /* Bit 2 */ + In >>= 1; + Out = CRYPTO1_FILTER_OUTPUT_B0_24(Odd0, Odd1, Odd2); + SHIFT8(KeyStream, Out); + Feedback = Crypto1LFSRbyteFeedback(Even0,Even1,Even2,Odd0,Odd1,Odd2); + Feedback ^= In; + SHIFT24_COND_DECRYPT(Even0,Even1,Even2, Feedback, Out, Decrypt); + + /* Bit 3 */ + In >>= 1; + Out = CRYPTO1_FILTER_OUTPUT_B0_24(Even0,Even1,Even2); + SHIFT8(KeyStream, Out); + Feedback = Crypto1LFSRbyteFeedback(Odd0,Odd1,Odd2,Even0,Even1,Even2); + Feedback ^= In; + SHIFT24_COND_DECRYPT(Odd0,Odd1,Odd2, Feedback, Out, Decrypt); + + /* Bit 4 */ + In >>= 1; + Out = CRYPTO1_FILTER_OUTPUT_B0_24(Odd0, Odd1, Odd2); + SHIFT8(KeyStream, Out); + Feedback = Crypto1LFSRbyteFeedback(Even0,Even1,Even2,Odd0,Odd1,Odd2); + Feedback ^= In; + SHIFT24_COND_DECRYPT(Even0,Even1,Even2, Feedback, Out, Decrypt); + + /* Bit 5 */ + In >>= 1; + Out = CRYPTO1_FILTER_OUTPUT_B0_24(Even0,Even1,Even2); + SHIFT8(KeyStream, Out); + Feedback = Crypto1LFSRbyteFeedback(Odd0,Odd1,Odd2,Even0,Even1,Even2); + Feedback ^= In; + SHIFT24_COND_DECRYPT(Odd0,Odd1,Odd2, Feedback, Out, Decrypt); + + /* Bit 6 */ + In >>= 1; + Out = CRYPTO1_FILTER_OUTPUT_B0_24(Odd0, Odd1, Odd2); + SHIFT8(KeyStream, Out); + Feedback = Crypto1LFSRbyteFeedback(Even0,Even1,Even2,Odd0,Odd1,Odd2); + Feedback ^= In; + SHIFT24_COND_DECRYPT(Even0,Even1,Even2, Feedback, Out, Decrypt); + + /* Bit 7 */ + In >>= 1; + Out = CRYPTO1_FILTER_OUTPUT_B0_24(Even0,Even1,Even2); + SHIFT8(KeyStream, Out); + Feedback = Crypto1LFSRbyteFeedback(Odd0,Odd1,Odd2,Even0,Even1,Even2); + Feedback ^= In; + SHIFT24_COND_DECRYPT(Odd0,Odd1,Odd2, Feedback, Out, Decrypt); + + /* Generate parity bit */ + Out = CRYPTO1_FILTER_OUTPUT_B0_24(Odd0, Odd1, Odd2); + In = *CardNonce; + Feedback = ODD_PARITY(In); + CardNonce[NONCE_SIZE] = Out ^ Feedback; /* Encrypted parity at Offset 4*/ + + /* Encrypt byte */ + *CardNonce++ = In ^ KeyStream; + } + /* save state */ + State.Even[0] = Even0; + State.Even[1] = Even1; + State.Even[2] = Even2; + State.Odd[0] = Odd0; + State.Odd[1] = Odd1; + State.Odd[2] = Odd2; +} + +/* Crypto1Auth is similar to Crypto1Byte but */ +/* EncryptedReaderNonce is decrypted and fed back */ +void Crypto1Auth(uint8_t EncryptedReaderNonce[NONCE_SIZE]) +{ + /* registers to hold temporary LFSR state */ + register uint8_t Even0,Even1,Even2; + register uint8_t Odd0,Odd1,Odd2; + uint8_t In; + uint8_t Feedback; uint8_t i; - for (i=0; i<32; i++) { - /* Decrypt one output bit of the given encrypted nonce using the - * filter output as keystream. */ - uint8_t Out = Crypto1FilterOutput(); - uint8_t Bit = Out ^ (Temp & 0x01); + /* read state */ + Even0 = State.Even[0]; + Even1 = State.Even[1]; + Even2 = State.Even[2]; + Odd0 = State.Odd[0]; + Odd1 = State.Odd[1]; + Odd2 = State.Odd[2]; - /* Feed back the bit to load the LFSR with the (decrypted) nonce */ - Crypto1LFSR(Bit); - Temp >>= 1; + /* 4 Bytes */ + for(i = 0; i < NONCE_SIZE; i++) + { + In = EncryptedReaderNonce[i]; + + /* Bit 0 */ + Feedback = CRYPTO1_FILTER_OUTPUT_B0_24(Odd0, Odd1, Odd2); + Feedback = Crypto1LFSRbyteFeedback(Even0,Even1,Even2,Odd0,Odd1,Odd2) + ^ Feedback + ^ In; + In >>= 1; + SHIFT24(Even0,Even1,Even2, Feedback); + + /* Bit 1 */ + /* remember Odd/Even swap has been omitted! */ + Feedback = CRYPTO1_FILTER_OUTPUT_B0_24(Even0,Even1,Even2); + Feedback = Crypto1LFSRbyteFeedback(Odd0,Odd1,Odd2,Even0,Even1,Even2) + ^ Feedback + ^ In; + In >>= 1; + SHIFT24(Odd0,Odd1,Odd2, Feedback); + + /* Bit 2 */ + Feedback = CRYPTO1_FILTER_OUTPUT_B0_24(Odd0, Odd1, Odd2); + Feedback = Crypto1LFSRbyteFeedback(Even0,Even1,Even2,Odd0,Odd1,Odd2) + ^ Feedback + ^ In; + In >>= 1; + SHIFT24(Even0,Even1,Even2, Feedback); + + /* Bit 3 */ + Feedback = CRYPTO1_FILTER_OUTPUT_B0_24(Even0,Even1,Even2); + Feedback = Crypto1LFSRbyteFeedback(Odd0,Odd1,Odd2,Even0,Even1,Even2) + ^ Feedback + ^ In; + In >>= 1; + SHIFT24(Odd0,Odd1,Odd2, Feedback); + + /* Bit 4 */ + Feedback = CRYPTO1_FILTER_OUTPUT_B0_24(Odd0, Odd1, Odd2); + Feedback = Crypto1LFSRbyteFeedback(Even0,Even1,Even2,Odd0,Odd1,Odd2) + ^ Feedback + ^ In; + In >>= 1; + SHIFT24(Even0,Even1,Even2, Feedback); + + /* Bit 5 */ + Feedback = CRYPTO1_FILTER_OUTPUT_B0_24(Even0,Even1,Even2); + Feedback = Crypto1LFSRbyteFeedback(Odd0,Odd1,Odd2,Even0,Even1,Even2) + ^ Feedback + ^ In; + In >>= 1; + SHIFT24(Odd0,Odd1,Odd2, Feedback); + + /* Bit 6 */ + Feedback = CRYPTO1_FILTER_OUTPUT_B0_24(Odd0, Odd1, Odd2); + Feedback = Crypto1LFSRbyteFeedback(Even0,Even1,Even2,Odd0,Odd1,Odd2) + ^ Feedback + ^ In; + In >>= 1; + SHIFT24(Even0,Even1,Even2, Feedback); + + /* Bit 7 */ + Feedback = CRYPTO1_FILTER_OUTPUT_B0_24(Even0,Even1,Even2); + Feedback = Crypto1LFSRbyteFeedback(Odd0,Odd1,Odd2,Even0,Even1,Even2) + ^ Feedback + ^ In; + SHIFT24(Odd0,Odd1,Odd2, Feedback); } + /* save state */ + State.Even[0] = Even0; + State.Even[1] = Even1; + State.Even[2] = Even2; + State.Odd[0] = Odd0; + State.Odd[1] = Odd1; + State.Odd[2] = Odd2; } -uint8_t Crypto1Byte(void) -{ - uint8_t KeyStream = 0; - uint8_t i; - - /* Generate 8 keystream-bits */ - for (i=0; i<8; i++) { - - /* Calculate output of function-network and cycle LFSR with no - * additional input, thus linearly! */ - uint8_t Out = Crypto1FilterOutput(); - Crypto1LFSR(0); - - /* Store keystream bit */ - KeyStream >>= 1; - - if (Out) { - KeyStream |= (1<<7); - } - } - - return KeyStream; -} - +/* Crypto1Nibble generates keystrem for a nibble (4 bit) */ +/* no input to the LFSR */ uint8_t Crypto1Nibble(void) { - uint8_t KeyStream = 0; - uint8_t i; + /* state registers */ + register uint8_t Even0, Even1, Even2; + register uint8_t Odd0, Odd1, Odd2; + uint8_t KeyStream; + uint8_t Feedback; + uint8_t Out; - /* Generate 4 keystream-bits */ - for (i=0; i<4; i++) { + /* read state */ + Even0 = State.Even[0]; + Even1 = State.Even[1]; + Even2 = State.Even[2]; + Odd0 = State.Odd[0]; + Odd1 = State.Odd[1]; + Odd2 = State.Odd[2]; - /* Calculate output of function-network and cycle LFSR with no - * additional input, thus linearly! */ - uint8_t Out = Crypto1FilterOutput(); - Crypto1LFSR(0); + /* Bit 0, initialise keystream */ + KeyStream = CRYPTO1_FILTER_OUTPUT_B3_24(Odd0, Odd1, Odd2); + Feedback = Crypto1LFSRbyteFeedback(Even0,Even1,Even2,Odd0,Odd1,Odd2); + SHIFT24(Even0,Even1,Even2, Feedback); - /* Store keystream bit */ - KeyStream >>= 1; + /* Bit 1 */ + Out = CRYPTO1_FILTER_OUTPUT_B3_24(Even0,Even1,Even2); + KeyStream = (KeyStream>>1) | Out; + Feedback = Crypto1LFSRbyteFeedback(Odd0,Odd1,Odd2,Even0,Even1,Even2); + SHIFT24(Odd0,Odd1,Odd2, Feedback); - if (Out) { - KeyStream |= (1<<3); - } - } + /* Bit 2 */ + Out = CRYPTO1_FILTER_OUTPUT_B3_24(Odd0, Odd1, Odd2); + KeyStream = (KeyStream>>1) | Out; + Feedback = Crypto1LFSRbyteFeedback(Even0,Even1,Even2,Odd0,Odd1,Odd2); + SHIFT24(Even0,Even1,Even2, Feedback); - return KeyStream; + /* Bit 3 */ + Out = CRYPTO1_FILTER_OUTPUT_B3_24(Even0,Even1,Even2); + KeyStream = (KeyStream>>1) | Out; + Feedback = Crypto1LFSRbyteFeedback(Odd0,Odd1,Odd2,Even0,Even1,Even2); + SHIFT24(Odd0,Odd1,Odd2, Feedback); + + /* save state */ + State.Even[0] = Even0; + State.Even[1] = Even1; + State.Even[2] = Even2; + State.Odd[0] = Odd0; + State.Odd[1] = Odd1; + State.Odd[2] = Odd2; + + return(KeyStream); } -void Crypto1PRNG(uint8_t State[4], uint16_t ClockCount) +/* Crypto1ByteArray transcrypts array of bytes */ +/* No input to the LFSR */ +/* Avoids load/store of the LFSR-state for each byte! */ +/* Enhacement for the original function Crypto1Byte() */ +void Crypto1ByteArray(uint8_t* Buffer, uint8_t Count) { - while(ClockCount--) { - /* Actually, the PRNG is a 32 bit register with the upper 16 bit - * used as a LFSR. Furthermore only mask-byte 2 contains feedback at all. - * We rely on the compiler to optimize this for us here. - * XOR all tapped bits to a single feedback bit. */ - uint8_t Feedback = 0; + /* state registers */ + register uint8_t Even0, Even1, Even2; + register uint8_t Odd0, Odd1, Odd2; + uint8_t KeyStream = 0; + uint8_t Feedback; + uint8_t Out; + + /* read state */ + Even0 = State.Even[0]; + Even1 = State.Even[1]; + Even2 = State.Even[2]; + Odd0 = State.Odd[0]; + Odd1 = State.Odd[1]; + Odd2 = State.Odd[2]; - Feedback ^= State[0] & (uint8_t) (PRNG_MASK >> 0); - Feedback ^= State[1] & (uint8_t) (PRNG_MASK >> 8); - Feedback ^= State[2] & (uint8_t) (PRNG_MASK >> 16); - Feedback ^= State[3] & (uint8_t) (PRNG_MASK >> 24); + while(Count--) + { + /* Bit 0, initialise keystream */ + KeyStream = CRYPTO1_FILTER_OUTPUT_B7_24(Odd0, Odd1, Odd2); + Feedback = Crypto1LFSRbyteFeedback(Even0,Even1,Even2,Odd0,Odd1,Odd2); + SHIFT24(Even0,Even1,Even2, Feedback); - Feedback ^= Feedback >> 4; - Feedback ^= Feedback >> 2; - Feedback ^= Feedback >> 1; + /* Bit 1 */ + /* remember Odd/Even swap has been omitted! */ + Out = CRYPTO1_FILTER_OUTPUT_B7_24(Even0,Even1,Even2); + KeyStream = (KeyStream>>1) | Out; + Feedback = Crypto1LFSRbyteFeedback(Odd0,Odd1,Odd2,Even0,Even1,Even2); + SHIFT24(Odd0,Odd1,Odd2, Feedback); - /* For ease of processing convert the state into a 32 bit integer first */ - uint32_t Temp = 0; + /* Bit 2 */ + Out = CRYPTO1_FILTER_OUTPUT_B7_24(Odd0, Odd1, Odd2); + KeyStream = (KeyStream>>1) | Out; + Feedback = Crypto1LFSRbyteFeedback(Even0,Even1,Even2,Odd0,Odd1,Odd2); + SHIFT24(Even0,Even1,Even2, Feedback); - Temp |= (uint32_t) State[0] << 0; - Temp |= (uint32_t) State[1] << 8; - Temp |= (uint32_t) State[2] << 16; - Temp |= (uint32_t) State[3] << 24; + /* Bit 3 */ + /* remember Odd/Even swap has been omitted! */ + Out = CRYPTO1_FILTER_OUTPUT_B7_24(Even0,Even1,Even2); + KeyStream = (KeyStream>>1) | Out; + Feedback = Crypto1LFSRbyteFeedback(Odd0,Odd1,Odd2,Even0,Even1,Even2); + SHIFT24(Odd0,Odd1,Odd2, Feedback); - /* Cycle LFSR and feed back. */ - Temp >>= 1; + /* Bit 4 */ + Out = CRYPTO1_FILTER_OUTPUT_B7_24(Odd0, Odd1, Odd2); + KeyStream = (KeyStream>>1) | Out; + Feedback = Crypto1LFSRbyteFeedback(Even0,Even1,Even2,Odd0,Odd1,Odd2); + SHIFT24(Even0,Even1,Even2, Feedback); - if (Feedback & 0x01) { - Temp |= (uint32_t) 1 << (8 * PRNG_SIZE - 1); - } + /* Bit 5 */ + /* remember Odd/Even swap has been omitted! */ + Out = CRYPTO1_FILTER_OUTPUT_B7_24(Even0,Even1,Even2); + KeyStream = (KeyStream>>1) | Out; + Feedback = Crypto1LFSRbyteFeedback(Odd0,Odd1,Odd2,Even0,Even1,Even2); + SHIFT24(Odd0,Odd1,Odd2, Feedback); - /* Store back state */ - State[0] = (uint8_t) (Temp >> 0); - State[1] = (uint8_t) (Temp >> 8); - State[2] = (uint8_t) (Temp >> 16); - State[3] = (uint8_t) (Temp >> 24); + /* Bit 6 */ + Out = CRYPTO1_FILTER_OUTPUT_B7_24(Odd0, Odd1, Odd2); + KeyStream = (KeyStream>>1) | Out; + Feedback = Crypto1LFSRbyteFeedback(Even0,Even1,Even2,Odd0,Odd1,Odd2); + SHIFT24(Even0,Even1,Even2, Feedback); + + /* Bit 7 */ + /* remember Odd/Even swap has been omitted! */ + Out = CRYPTO1_FILTER_OUTPUT_B7_24(Even0,Even1,Even2); + KeyStream = (KeyStream>>1) | Out; + Feedback = Crypto1LFSRbyteFeedback(Odd0,Odd1,Odd2,Even0,Even1,Even2); + SHIFT24(Odd0,Odd1,Odd2, Feedback); + + /* Transcrypt and increment buffer address */ + *Buffer++ ^= KeyStream; } - + /* save state */ + State.Even[0] = Even0; + State.Even[1] = Even1; + State.Even[2] = Even2; + State.Odd[0] = Odd0; + State.Odd[1] = Odd1; + State.Odd[2] = Odd2; } -void Crypto1EncryptWithParity(uint8_t * Buffer, uint16_t BitCount) +/* Crypto1ByteArrayWithParity encrypts an array of bytes */ +/* and generates the parity bits */ +/* No input to the LFSR */ +/* Avoids load/store of the LFSR-state for each byte! */ +/* The filter output used to encrypt the parity is */ +/* reused to encrypt bit 0 in the next byte. */ +void Crypto1ByteArrayWithParity(uint8_t* Buffer, uint8_t Count) +{ + /* state registers */ + register uint8_t Even0, Even1, Even2; + register uint8_t Odd0, Odd1, Odd2; + uint8_t KeyStream = 0; + uint8_t Feedback; + uint8_t Out; + + /* read state */ + Even0 = State.Even[0]; + Even1 = State.Even[1]; + Even2 = State.Even[2]; + Odd0 = State.Odd[0]; + Odd1 = State.Odd[1]; + Odd2 = State.Odd[2]; + + /* First pass needs output, next pass uses parity bit! */ + Out = CRYPTO1_FILTER_OUTPUT_B0_24(Odd0, Odd1, Odd2); + + while(Count--) + { + /* Bit 0, initialise keystream from parity */ + SHIFT8(KeyStream,Out); + Feedback = Crypto1LFSRbyteFeedback(Even0,Even1,Even2,Odd0,Odd1,Odd2); + SHIFT24(Even0,Even1,Even2, Feedback); + + /* Bit 1 */ + /* remember Odd/Even swap has been omitted! */ + Out = CRYPTO1_FILTER_OUTPUT_B7_24(Even0,Even1,Even2); + KeyStream = (KeyStream>>1) | Out; + Feedback = Crypto1LFSRbyteFeedback(Odd0,Odd1,Odd2,Even0,Even1,Even2); + SHIFT24(Odd0,Odd1,Odd2, Feedback); + + /* Bit 2 */ + Out = CRYPTO1_FILTER_OUTPUT_B7_24(Odd0, Odd1, Odd2); + KeyStream = (KeyStream>>1) | Out; + Feedback = Crypto1LFSRbyteFeedback(Even0,Even1,Even2,Odd0,Odd1,Odd2); + SHIFT24(Even0,Even1,Even2, Feedback); + + /* Bit 3 */ + /* remember Odd/Even swap has been omitted! */ + Out = CRYPTO1_FILTER_OUTPUT_B7_24(Even0,Even1,Even2); + KeyStream = (KeyStream>>1) | Out; + Feedback = Crypto1LFSRbyteFeedback(Odd0,Odd1,Odd2,Even0,Even1,Even2); + SHIFT24(Odd0,Odd1,Odd2, Feedback); + + /* Bit 4 */ + Out = CRYPTO1_FILTER_OUTPUT_B7_24(Odd0, Odd1, Odd2); + KeyStream = (KeyStream>>1) | Out; + Feedback = Crypto1LFSRbyteFeedback(Even0,Even1,Even2,Odd0,Odd1,Odd2); + SHIFT24(Even0,Even1,Even2, Feedback); + + /* Bit 5 */ + /* remember Odd/Even swap has been omitted! */ + Out = CRYPTO1_FILTER_OUTPUT_B7_24(Even0,Even1,Even2); + KeyStream = (KeyStream>>1) | Out; + Feedback = Crypto1LFSRbyteFeedback(Odd0,Odd1,Odd2,Even0,Even1,Even2); + SHIFT24(Odd0,Odd1,Odd2, Feedback); + + /* Bit 6 */ + Out = CRYPTO1_FILTER_OUTPUT_B7_24(Odd0, Odd1, Odd2); + KeyStream = (KeyStream>>1) | Out; + Feedback = Crypto1LFSRbyteFeedback(Even0,Even1,Even2,Odd0,Odd1,Odd2); + SHIFT24(Even0,Even1,Even2, Feedback); + + /* Bit 7 */ + /* remember Odd/Even swap has been omitted! */ + Out = CRYPTO1_FILTER_OUTPUT_B7_24(Even0,Even1,Even2); + KeyStream = (KeyStream>>1) | Out; + Feedback = Crypto1LFSRbyteFeedback(Odd0,Odd1,Odd2,Even0,Even1,Even2); + SHIFT24(Odd0,Odd1,Odd2, Feedback); + + /* Next bit encodes parity */ + Out = CRYPTO1_FILTER_OUTPUT_B0_24(Odd0, Odd1, Odd2); + Buffer[ISO14443A_BUFFER_PARITY_OFFSET] = ODD_PARITY(*Buffer) ^ Out; + + /* encode Byte */ + *Buffer++ ^= KeyStream; + } + /* save state */ + State.Even[0] = Even0; + State.Even[1] = Even1; + State.Even[2] = Even2; + State.Odd[0] = Odd0; + State.Odd[1] = Odd1; + State.Odd[2] = Odd2; +} + +/* Function Crypto1PRNG */ +/* New version of the PRNG wich can calculate multiple */ +/* feedback bits at once! */ +/* Feedback mask = 0x2d = 101101 binary */ +/* Because pattern 101 is repeated, only 2 shifts are neccessary! */ +/* Feedback ^= Feedback >> 3; folds 101 101 to 101 */ +/* Feedback ^= Feedback >> 2; folds 101 => 1 */ +/* With these two lines not only bit 0 is calculated, */ +/* but all the bits which do no overlap with the feedback! */ +/* I.e. the 10 leading zeros in the feedback mask bits */ +/* gives us a total of 11 valid feedback bits! */ +/* The ClockCount for the PRNG is always multiple of 32! */ +/* Up tp 11 Bits can be calculated at once */ +/* Split into chunks of 11+11+10 = 32 bits */ +/* This avoids a calculated number of shifts */ +void Crypto1PRNG(uint8_t State[4], uint8_t ClockCount) +{ + /* For ease of processing convert the state into a 32 bit integer first */ + uint32_t Temp; + uint16_t Feedback; + + Temp = (uint32_t) State[0] << 0; + Temp |= (uint32_t) State[1] << 8; + Temp |= (uint32_t) State[2] << 16; + Temp |= (uint32_t) State[3] << 24; + + /* PRNG is always a multiple of 32! */ + /* Up tp 11 Bits can be calculated at once */ + /* Split into chunks of 11+11+10 = 32 bits */ + while(ClockCount >= 32) { + Feedback = (uint16_t)(Temp>>16); + Feedback ^= Feedback >> 3; /* 2d = 101101, fold 101 101 => 101 */ + Feedback ^= Feedback >> 2; /* fold 101 => 1 */ + /* Cycle LFSR and feed back. */ + Temp = (Temp >> 11) | (((uint32_t)Feedback) << (32-11)); + + /* Same for the next 11 Bits */ + Feedback = (uint16_t)(Temp>>16); + Feedback ^= Feedback >> 3; /* 2d = 101101, fold 101 101 => 101 */ + Feedback ^= Feedback >> 2; /* fold 101 => 1 */ + Temp = (Temp >> 11) | (((uint32_t)Feedback) << (32-11)); + + /* Remaining 10 bits */ + Feedback = (uint16_t)(Temp>>16); + Feedback ^= Feedback >> 3; /* 2d = 101101, fold 101 101 => 101 */ + Feedback ^= Feedback >> 2; /* fold 101 => 1 */ + Temp = (Temp >> 10) | (((uint32_t)Feedback) << (32-10)); + + /* Now 32 bits are fed back */ + ClockCount -= 32; + } + + /* Store back state */ + State[0] = (uint8_t) (Temp >> 0); + State[1] = (uint8_t) (Temp >> 8); + State[2] = (uint8_t) (Temp >> 16); + State[3] = (uint8_t) (Temp >> 24); +} + +void Crypto1EncryptWithParity(uint8_t * Buffer, uint8_t BitCount) { uint8_t i = 0; while (i < BitCount) { - Buffer[i/8] ^= Crypto1FilterOutput() << (i % 8); + Buffer[i/8] ^= + CRYPTO1_FILTER_OUTPUT_B0_24(State.Odd[0], State.Odd[1], State.Odd[2]) + << (i % 8); if (++i % 9 != 0) // only shift, if this was no parity bit Crypto1LFSR(0); } @@ -403,7 +1078,9 @@ void Crypto1ReaderAuthWithParity(uint8_t PlainReaderAnswerWithParityBits[9]) while (i < 72) { feedback = PlainReaderAnswerWithParityBits[i/8] >> (i % 8); - PlainReaderAnswerWithParityBits[i/8] ^= Crypto1FilterOutput() << (i % 8); + PlainReaderAnswerWithParityBits[i/8] ^= + CRYPTO1_FILTER_OUTPUT_B0_24(State.Odd[0], State.Odd[1], State.Odd[2]) + << (i % 8); if (++i % 9 != 0) // only shift, if this was no parity bit { if (i <= 36) diff --git a/Firmware/Chameleon-Mini/Application/Crypto1.h b/Firmware/Chameleon-Mini/Application/Crypto1.h index dd4dfbc..e11fb1e 100644 --- a/Firmware/Chameleon-Mini/Application/Crypto1.h +++ b/Firmware/Chameleon-Mini/Application/Crypto1.h @@ -4,18 +4,16 @@ #include #include +void Crypto1GetState(uint8_t* pEven, uint8_t* pOdd); + /* Gets the current keystream-bit, without shifting the internal LFSR */ uint8_t Crypto1FilterOutput(void); /* Set up Crypto1 cipher using the given Key, Uid and CardNonce. Also encrypts * the CardNonce in-place while in non-linear mode. */ void Crypto1Setup(uint8_t Key[6], uint8_t Uid[4], uint8_t CardNonce[4]); - -/* Set up Crypto1 cipher using the given Key, Uid and CardNonce. Nested indicates - * whether the CardNonce is encrypted (true) or not (false). - * If the CardNonce is encrypted, it will we decrypted in-place. If not, it will - * be fed into the LFSR, but remains unchanged. */ -void Crypto1SetupReader(uint8_t Key[6], uint8_t Uid[4], uint8_t CardNonce[4], bool Nested); +/* Same for nested auth. CardNonce[4]..[7] will contain the parity bits after return */ +void Crypto1SetupNested(uint8_t Key[6], uint8_t Uid[4], uint8_t CardNonce[8], bool Decrypt); /* Load the decrypted ReaderNonce into the Crypto1 state LFSR */ void Crypto1Auth(uint8_t EncryptedReaderNonce[4]); @@ -23,14 +21,18 @@ void Crypto1Auth(uint8_t EncryptedReaderNonce[4]); /* Generate 8 Bits of key stream */ uint8_t Crypto1Byte(void); +/* Encrypt/Decrypt array */ +void Crypto1ByteArray(uint8_t* Buffer, uint8_t Count); +void Crypto1ByteArrayWithParity(uint8_t* Buffer, uint8_t Count); + /* Generate 4 Bits of key stream */ uint8_t Crypto1Nibble(void); /* Execute 'ClockCount' cycles on the PRNG state 'State' */ -void Crypto1PRNG(uint8_t State[4], uint16_t ClockCount); +void Crypto1PRNG(uint8_t State[4], uint8_t ClockCount); /* Encrypts buffer with consideration of parity bits */ -void Crypto1EncryptWithParity(uint8_t * Buffer, uint16_t BitCount); +void Crypto1EncryptWithParity(uint8_t * Buffer, uint8_t BitCount); /* Encrypts buffer with LFSR feedback within reader nonce and considers parity bits */ void Crypto1ReaderAuthWithParity(uint8_t PlainReaderAnswerWithParityBits[9]); diff --git a/Firmware/Chameleon-Mini/Application/MifareClassic.c b/Firmware/Chameleon-Mini/Application/MifareClassic.c index 63fccac..e843b30 100644 --- a/Firmware/Chameleon-Mini/Application/MifareClassic.c +++ b/Firmware/Chameleon-Mini/Application/MifareClassic.c @@ -31,10 +31,16 @@ #define MEM_KEY_B_OFFSET 58 /* Bytes */ #define MEM_KEY_BIGSECTOR_OFFSET 192 #define MEM_KEY_SIZE 6 /* Bytes */ +#define MEM_ACC_GPB_SIZE 4 /* Bytes */ #define MEM_SECTOR_ADDR_MASK 0xFC #define MEM_BYTES_PER_BLOCK 16 /* Bytes */ #define MEM_VALUE_SIZE 4 /* Bytes */ +/* NXP Originality check */ +/* Sector 18/Block 68..71 is used to store signature data for NXP originality check */ +#define MEM_EV1_SIGNATURE_BLOCK 68 +#define MEM_EV1_SIGNATURE_TRAILOR ((MEM_EV1_SIGNATURE_BLOCK + 3 ) * MEM_BYTES_PER_BLOCK) + #define ACK_NAK_FRAME_SIZE 4 /* Bits */ #define ACK_VALUE 0x0A #define NAK_INVALID_ARG 0x00 @@ -62,19 +68,201 @@ #define CMD_INCREMENT_FRAME_SIZE 2 /* Bytes without CRCA */ #define CMD_RESTORE 0xC2 #define CMD_RESTORE_FRAME_SIZE 2 /* Bytes without CRCA */ +#define CMD_SIG_READ 0xC2 +#define CMD_SIG_READ_FRAME_SIZE 1 /* Bytes without CRCA */ #define CMD_TRANSFER 0xB0 #define CMD_TRANSFER_FRAME_SIZE 2 /* Bytes without CRCA */ #define CMD_CHINESE_UNLOCK 0x40 #define CMD_CHINESE_WIPE 0x41 #define CMD_CHINESE_UNLOCK_RW 0x43 + + + +/* +Source: NXP: MF1S50YYX Product data sheet + +Access conditions for the sector trailer + +Access bits Access condition for Remark + KEYA Access bits KEYB +C1 C2 C3 read write read write read write +0 0 0 never key A key A never key A key A Key B may be read[1] +0 1 0 never never key A never key A never Key B may be read[1] +1 0 0 never key B keyA|B never never key B +1 1 0 never never keyA|B never never never +0 0 1 never key A key A key A key A key A Key B may be read, + transport configuration[1] +0 1 1 never key B keyA|B key B never key B +1 0 1 never never keyA|B key B never never +1 1 1 never never keyA|B never never never + +[1] For this access condition key B is readable and may be used for data +*/ +#define ACC_TRAILOR_READ_KEYA 0x01 +#define ACC_TRAILOR_WRITE_KEYA 0x02 +#define ACC_TRAILOR_READ_ACC 0x04 +#define ACC_TRAILOR_WRITE_ACC 0x08 +#define ACC_TRAILOR_READ_KEYB 0x10 +#define ACC_TRAILOR_WRITE_KEYB 0x20 + + + +/* +Access conditions for data blocks +Access bits Access condition for Application +C1 C2 C3 read write increment decrement, + transfer, + restore + +0 0 0 key A|B key A|B key A|B key A|B transport configuration +0 1 0 key A|B never never never read/write block +1 0 0 key A|B key B never never read/write block +1 1 0 key A|B key B key B key A|B value block +0 0 1 key A|B never never key A|B value block +0 1 1 key B key B never never read/write block +1 0 1 key B never never never read/write block +1 1 1 never never never never read/write block + +*/ +#define ACC_BLOCK_READ 0x01 +#define ACC_BLOCK_WRITE 0x02 +#define ACC_BLOCK_INCREMENT 0x04 +#define ACC_BLOCK_DECREMENT 0x08 + +#define KEY_A 0 +#define KEY_B 1 + +/* Decoding table for Access conditions of a data block */ +static const uint8_t abBlockAccessConditions[8][2] = +{ + /*C1C2C3 */ + /* 0 0 0 R:key A|B W: key A|B I:key A|B D:key A|B transport configuration */ + { + /* Access with Key A */ + ACC_BLOCK_READ | ACC_BLOCK_WRITE | ACC_BLOCK_INCREMENT | ACC_BLOCK_DECREMENT, + /* Access with Key B */ + ACC_BLOCK_READ | ACC_BLOCK_WRITE | ACC_BLOCK_INCREMENT | ACC_BLOCK_DECREMENT + }, + /* 1 0 0 R:key A|B W:key B I:never D:never read/write block */ + { + /* Access with Key A */ + ACC_BLOCK_READ, + /* Access with Key B */ + ACC_BLOCK_READ | ACC_BLOCK_WRITE + }, + /* 0 1 0 R:key A|B W:never I:never D:never read/write block */ + { + /* Access with Key A */ + ACC_BLOCK_READ, + /* Access with Key B */ + ACC_BLOCK_READ + }, + /* 1 1 0 R:key A|B W:key B I:key B D:key A|B value block */ + { + /* Access with Key A */ + ACC_BLOCK_READ | ACC_BLOCK_DECREMENT, + /* Access with Key B */ + ACC_BLOCK_READ | ACC_BLOCK_WRITE | ACC_BLOCK_INCREMENT | ACC_BLOCK_DECREMENT + }, + /* 0 0 1 R:key A|B W:never I:never D:key A|B value block */ + { + /* Access with Key A */ + ACC_BLOCK_READ | ACC_BLOCK_DECREMENT, + /* Access with Key B */ + ACC_BLOCK_READ | ACC_BLOCK_DECREMENT + }, + /* 1 0 1 R:key B W:never I:never D:never read/write block */ + { + /* Access with Key A */ + 0, + /* Access with Key B */ + ACC_BLOCK_READ + }, + /* 0 1 1 R:key B W:key B I:never D:never read/write block */ + { + /* Access with Key A */ + 0, + /* Access with Key B */ + ACC_BLOCK_READ | ACC_BLOCK_WRITE + }, + /* 1 1 1 R:never W:never I:never D:never read/write block */ + { + /* Access with Key A */ + 0, + /* Access with Key B */ + 0 + } + +}; +/* Decoding table for Access conditions of the sector trailor */ +static const uint8_t abTrailorAccessConditions[8][2] = +{ + /* 0 0 0 RdKA:never WrKA:key A RdAcc:key A WrAcc:never RdKB:key A WrKB:key A Key B may be read[1] */ + { + /* Access with Key A */ + ACC_TRAILOR_WRITE_KEYA | ACC_TRAILOR_READ_ACC | ACC_TRAILOR_WRITE_ACC | ACC_TRAILOR_READ_KEYB | ACC_TRAILOR_WRITE_KEYB, + /* Access with Key B */ + 0 + }, + /* 1 0 0 RdKA:never WrKA:key B RdAcc:keyA|B WrAcc:never RdKB:never WrKB:key B */ + { + /* Access with Key A */ + ACC_TRAILOR_READ_ACC, + /* Access with Key B */ + ACC_TRAILOR_WRITE_KEYA | ACC_TRAILOR_READ_ACC | ACC_TRAILOR_WRITE_KEYB + }, + /* 0 1 0 RdKA:never WrKA:never RdAcc:key A WrAcc:never RdKB:key A WrKB:never Key B may be read[1] */ + { + /* Access with Key A */ + ACC_TRAILOR_READ_ACC | ACC_TRAILOR_READ_KEYB, + /* Access with Key B */ + 0 + }, + /* 1 1 0 never never keyA|B never never never */ + { + /* Access with Key A */ + ACC_TRAILOR_READ_ACC, + /* Access with Key B */ + ACC_TRAILOR_READ_ACC + }, + /* 0 0 1 never key A key A key A key A key A Key B may be read,transport configuration[1] */ + { + /* Access with Key A */ + ACC_TRAILOR_WRITE_KEYA | ACC_TRAILOR_READ_ACC | ACC_TRAILOR_WRITE_ACC | ACC_TRAILOR_READ_KEYB | ACC_TRAILOR_WRITE_KEYB, + /* Access with Key B */ + 0 + }, + /* 0 1 1 never key B keyA|B key B never key B */ + { + /* Access with Key A */ + ACC_TRAILOR_READ_ACC, + /* Access with Key B */ + ACC_TRAILOR_WRITE_KEYA | ACC_TRAILOR_READ_ACC | ACC_TRAILOR_WRITE_ACC | ACC_TRAILOR_WRITE_KEYB + }, + /* 1 0 1 never never keyA|B key B never never */ + { + /* Access with Key A */ + ACC_TRAILOR_READ_ACC, + /* Access with Key B */ + ACC_TRAILOR_READ_ACC | ACC_TRAILOR_WRITE_ACC + }, + /* 1 1 1 never never keyA|B never never never */ + { + /* Access with Key A */ + ACC_TRAILOR_READ_ACC, + /* Access with Key B */ + ACC_TRAILOR_READ_ACC + }, +}; + static enum { STATE_HALT, STATE_IDLE, STATE_CHINESE_IDLE, STATE_CHINESE_WRITE, STATE_READY1, - STATE_READY2, + STATE_READY2, STATE_ACTIVE, STATE_AUTHING, STATE_AUTHED_IDLE, @@ -87,11 +275,56 @@ static enum { static uint8_t CardResponse[4]; static uint8_t ReaderResponse[4]; static uint8_t CurrentAddress; +static uint8_t KeyInUse; static uint8_t BlockBuffer[MEM_BYTES_PER_BLOCK]; +static uint8_t AccessConditions[MEM_ACC_GPB_SIZE]; /* Access Conditions + General purpose Byte */ +static uint8_t AccessAddress; static uint16_t CardATQAValue; static uint8_t CardSAKValue; static bool FromHalt = false; +#define BYTE_SWAP(x) (((uint8_t)(x)>>4)|((uint8_t)(x)<<4)) +#define NO_ACCESS 0x07 + +/* decode Access conditions for a block */ +INLINE uint8_t GetAccessCondition(uint8_t Block) +{ + uint8_t InvSAcc0; + uint8_t InvSAcc1; + uint8_t Acc0 = AccessConditions[0]; + uint8_t Acc1 = AccessConditions[1]; + uint8_t Acc2 = AccessConditions[2]; + uint8_t ResultForBlock = 0; + + InvSAcc0 = ~BYTE_SWAP(Acc0); + InvSAcc1 = ~BYTE_SWAP(Acc1); + + /* Check */ + if ( ((InvSAcc0 ^ Acc1) & 0xf0) || /* C1x */ + ((InvSAcc0 ^ Acc2) & 0x0f) || /* C2x */ + ((InvSAcc1 ^ Acc2) & 0xf0) || /* C1x */ + ((InvSAcc1 ^ Acc0) & 0x0f)) /* C3x */ + { + return(NO_ACCESS); + } + Block &= 3; + + Acc0 = ~Acc0; /* C1x Bits to bit 0..3 */ + Acc1 = Acc2; /* C2x Bits to bit 0..3 */ + Acc2 = Acc2 >> 4; /* C3x Bits to bit 0..3 */ + + if(Block) + { + Acc0 >>= Block; + Acc1 >>= Block; + Acc2 >>= Block; + } + /* combine the bits */ + ResultForBlock = ((Acc2 & 1) << 2) | + ((Acc1 & 1) << 1) | + (Acc0 & 1); + return(ResultForBlock); +} INLINE bool CheckValueIntegrity(uint8_t* Block) { @@ -163,6 +396,19 @@ void MifareClassicAppTask(void) uint16_t MifareClassicAppProcess(uint8_t* Buffer, uint16_t BitCount) { + /* Wakeup and Request may occure in all states */ + if ( (BitCount == 7) && + /* precheck of WUP/REQ because ISO14443AWakeUp destroys BitCount */ + (((State != STATE_HALT) && (Buffer[0] == ISO14443A_CMD_REQA)) || + (Buffer[0] == ISO14443A_CMD_WUPA) )){ + FromHalt = State == STATE_HALT; + if (ISO14443AWakeUp(Buffer, &BitCount, CardATQAValue, FromHalt)) { + AccessAddress = 0xff; + State = STATE_READY1; + return BitCount; + } + } + switch(State) { case STATE_IDLE: case STATE_HALT: @@ -194,7 +440,7 @@ uint16_t MifareClassicAppProcess(uint8_t* Buffer, uint16_t BitCount) } else if (Buffer[0] == CMD_READ) { if (ISO14443ACheckCRCA(Buffer, CMD_READ_FRAME_SIZE)) { /* Read command. Read data from memory and append CRCA. */ - MemoryReadBlock(Buffer, (uint16_t) Buffer[1] * MEM_BYTES_PER_BLOCK, MEM_BYTES_PER_BLOCK); + MemoryReadBlock(Buffer, (uint16_t)Buffer[1] * MEM_BYTES_PER_BLOCK, MEM_BYTES_PER_BLOCK); ISO14443AAppendCRCA(Buffer, MEM_BYTES_PER_BLOCK); return (CMD_READ_RESPONSE_FRAME_SIZE + ISO14443A_CRCA_SIZE ) @@ -268,10 +514,12 @@ uint16_t MifareClassicAppProcess(uint8_t* Buffer, uint16_t BitCount) UidCL1[0] = ISO14443A_UID0_CT; if (ISO14443ASelect(Buffer, &BitCount, UidCL1, SAK_UID_NOT_FINISHED)) State = STATE_READY2; - } else { + } else { MemoryReadBlock(UidCL1, MEM_UID_CL1_ADDRESS, MEM_UID_CL1_SIZE); - if (ISO14443ASelect(Buffer, &BitCount, UidCL1, CardSAKValue)) - State = STATE_ACTIVE; + if (ISO14443ASelect(Buffer, &BitCount, UidCL1, CardSAKValue)) { + AccessAddress = 0xff; /* invalid, force reload */ + State = STATE_ACTIVE; + } } return BitCount; @@ -291,6 +539,7 @@ uint16_t MifareClassicAppProcess(uint8_t* Buffer, uint16_t BitCount) MemoryReadBlock(UidCL2, MEM_UID_CL2_ADDRESS, MEM_UID_CL2_SIZE); if (ISO14443ASelect(Buffer, &BitCount, UidCL2, CardSAKValue)) { + AccessAddress = 0xff; /* invalid, force reload */ State = STATE_ACTIVE; } @@ -324,40 +573,53 @@ uint16_t MifareClassicAppProcess(uint8_t* Buffer, uint16_t BitCount) return ACK_NAK_FRAME_SIZE; } } else if ( (Buffer[0] == CMD_AUTH_A) || (Buffer[0] == CMD_AUTH_B)) { - if (ISO14443ACheckCRCA(Buffer, CMD_AUTH_FRAME_SIZE)) - { - /* Fix for MFClassic 4k cards */ + if (ISO14443ACheckCRCA(Buffer, CMD_AUTH_FRAME_SIZE)) { + uint16_t SectorAddress = Buffer[1] & MEM_SECTOR_ADDR_MASK; uint16_t KeyOffset = (Buffer[0] == CMD_AUTH_A ? MEM_KEY_A_OFFSET : MEM_KEY_B_OFFSET); - uint16_t KeyAddress = (uint16_t) SectorAddress * MEM_BYTES_PER_BLOCK + KeyOffset; - - if(Buffer[1] >= 128) - { - KeyAddress = (Buffer[1] & 0xF0) * 16 + KeyOffset + MEM_KEY_BIGSECTOR_OFFSET; - } + uint16_t SectorStartAddress = (uint16_t)SectorAddress * MEM_BYTES_PER_BLOCK; uint8_t Key[6]; uint8_t Uid[4]; uint8_t CardNonce[4]; + /* Fix for MFClassic 4k cards */ + if(Buffer[1] >= 128) + { + SectorStartAddress += MEM_KEY_BIGSECTOR_OFFSET; + } + LogEntry(LOG_INFO_APP_CMD_AUTH, Buffer, 2); + KeyInUse = Buffer[0] & 1; + CurrentAddress = Buffer[1] & MEM_SECTOR_ADDR_MASK; + if (!AccessConditions[MEM_ACC_GPB_SIZE-1] ||(CurrentAddress != AccessAddress)) { + /* Get access conditions from the sector trailor */ + MemoryReadBlock(AccessConditions, SectorStartAddress + MEM_KEY_A_OFFSET + MEM_KEY_SIZE, MEM_ACC_GPB_SIZE); + AccessAddress = CurrentAddress; + } + /* Generate a random nonce and read UID and key from memory */ RandomGetBuffer(CardNonce, sizeof(CardNonce)); if (ActiveConfiguration.UidSize == 7) MemoryReadBlock(Uid, MEM_UID_CL2_ADDRESS, MEM_UID_CL2_SIZE); else MemoryReadBlock(Uid, MEM_UID_CL1_ADDRESS, MEM_UID_CL1_SIZE); - MemoryReadBlock(Key, KeyAddress, MEM_KEY_SIZE); + + MemoryReadBlock(Key, SectorStartAddress + KeyOffset, MEM_KEY_SIZE); /* Precalculate the reader response from card-nonce */ - for (uint8_t i=0; i= 128) - { - KeyAddress = (Buffer[1] & 0xF0) * 16 + KeyOffset + MEM_KEY_BIGSECTOR_OFFSET; - } - + uint16_t SectorStartAddress = (uint16_t) SectorAddress * MEM_BYTES_PER_BLOCK; uint8_t Key[6]; uint8_t Uid[4]; - uint8_t CardNonce[4]; + uint8_t CardNonce[8]; + + /* Fix for MFClassic 4k cards */ + if(Buffer[1] >= 128) + { + SectorStartAddress += MEM_KEY_BIGSECTOR_OFFSET; + } LogEntry(LOG_INFO_APP_CMD_AUTH, Buffer, 2); + KeyInUse = Buffer[0] & 1; + CurrentAddress = Buffer[1] & MEM_SECTOR_ADDR_MASK; + if (CurrentAddress != AccessAddress) { + /* Get access conditions from the sector trailor */ + MemoryReadBlock(AccessConditions, SectorStartAddress + MEM_KEY_A_OFFSET + MEM_KEY_SIZE, MEM_ACC_GPB_SIZE); + AccessAddress = CurrentAddress; + } + /* Generate a random nonce and read UID and key from memory */ RandomGetBuffer(CardNonce, sizeof(CardNonce)); if (ActiveConfiguration.UidSize == 7) MemoryReadBlock(Uid, MEM_UID_CL2_ADDRESS, MEM_UID_CL2_SIZE); else MemoryReadBlock(Uid, MEM_UID_CL1_ADDRESS, MEM_UID_CL1_SIZE); - MemoryReadBlock(Key, KeyAddress, MEM_KEY_SIZE); + MemoryReadBlock(Key, SectorStartAddress + KeyOffset, MEM_KEY_SIZE); /* Precalculate the reader response from card-nonce */ for (uint8_t i=0; i Date: Tue, 4 Apr 2017 16:18:10 +0200 Subject: [PATCH 002/104] added Reader_FWT variable Application with this may now change the frame waiting time which may be helpful for ISO14443A-4 processing --- Firmware/Chameleon-Mini/Application/Reader14443A.c | 1 + Firmware/Chameleon-Mini/Codec/Codec.c | 2 ++ Firmware/Chameleon-Mini/Codec/Codec.h | 3 +++ Firmware/Chameleon-Mini/Codec/Reader14443-2A.c | 2 +- 4 files changed, 7 insertions(+), 1 deletion(-) diff --git a/Firmware/Chameleon-Mini/Application/Reader14443A.c b/Firmware/Chameleon-Mini/Application/Reader14443A.c index efbb107..65399bf 100644 --- a/Firmware/Chameleon-Mini/Application/Reader14443A.c +++ b/Firmware/Chameleon-Mini/Application/Reader14443A.c @@ -230,6 +230,7 @@ INLINE uint16_t Reader14443A_Select(uint8_t * Buffer, uint16_t BitCount) { case STATE_IDLE: case STATE_HALT: + Reader_FWT = ISO14443A_RX_PENDING_TIMEOUT; /* Send a REQA */ Buffer[0] = ISO14443A_CMD_WUPA; // whenever REQA works, WUPA also works, so we choose WUPA always ReaderState = STATE_READY; diff --git a/Firmware/Chameleon-Mini/Codec/Codec.c b/Firmware/Chameleon-Mini/Codec/Codec.c index 05f1481..5fbda38 100644 --- a/Firmware/Chameleon-Mini/Codec/Codec.c +++ b/Firmware/Chameleon-Mini/Codec/Codec.c @@ -9,6 +9,8 @@ #include "../System.h" #include "../LEDHook.h" +uint16_t Reader_FWT = ISO14443A_RX_PENDING_TIMEOUT; + #define READER_FIELD_MINIMUM_WAITING_TIME 70 // ms static uint16_t ReaderFieldStartTimestamp = 0; diff --git a/Firmware/Chameleon-Mini/Codec/Codec.h b/Firmware/Chameleon-Mini/Codec/Codec.h index 0070c37..7a49727 100644 --- a/Firmware/Chameleon-Mini/Codec/Codec.h +++ b/Firmware/Chameleon-Mini/Codec/Codec.h @@ -90,6 +90,9 @@ #define CodecPtrRegister2 (*((volatile uint8_t**) &GPIORA)) extern uint16_t ReaderThreshold; +extern uint16_t Reader_FWT; + +#define FWI2FWT(x) ((uint32_t)(256 * 16 * ((uint32_t)1 << (x))) / (CODEC_CARRIER_FREQ / 1000) + 1) typedef enum { CODEC_SUBCARRIERMOD_OFF, diff --git a/Firmware/Chameleon-Mini/Codec/Reader14443-2A.c b/Firmware/Chameleon-Mini/Codec/Reader14443-2A.c index 9d87662..e069b41 100644 --- a/Firmware/Chameleon-Mini/Codec/Reader14443-2A.c +++ b/Firmware/Chameleon-Mini/Codec/Reader14443-2A.c @@ -281,7 +281,7 @@ ISR(CODEC_TIMER_LOADMOD_CCA_VECT) // pause found void Reader14443ACodecTask(void) { - if (Flags.RxPending && SYSTICK_DIFF(RxPendingSince) > ISO14443A_RX_PENDING_TIMEOUT + 1) + if (Flags.RxPending && SYSTICK_DIFF(RxPendingSince) > Reader_FWT + 1) { BitCount = 0; Flags.RxDone = true; From 5850458dfbc2a3a5c5860abed48a4d628f67328e Mon Sep 17 00:00:00 2001 From: Georg Date: Tue, 4 Apr 2017 16:23:56 +0200 Subject: [PATCH 003/104] added new log type, so python knows that in reader mode the data also contain the parity bits --- Firmware/Chameleon-Mini/Codec/Reader14443-2A.c | 4 ++-- Firmware/Chameleon-Mini/Log.h | 2 ++ Software/Chameleon/Log.py | 2 ++ 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/Firmware/Chameleon-Mini/Codec/Reader14443-2A.c b/Firmware/Chameleon-Mini/Codec/Reader14443-2A.c index e069b41..1921e43 100644 --- a/Firmware/Chameleon-Mini/Codec/Reader14443-2A.c +++ b/Firmware/Chameleon-Mini/Codec/Reader14443-2A.c @@ -326,7 +326,7 @@ void Reader14443ACodecTask(void) if (BitCount % 8) // copy the last byte, if there is an incomplete byte CodecBuffer[BitCount / 8] = SampleRegister >> (8 - (BitCount % 8)); LEDHook(LED_CODEC_RX, LED_PULSE); - LogEntry(LOG_INFO_CODEC_RX_DATA, CodecBuffer, (BitCount + 7) / 8); + LogEntry(LOG_INFO_CODEC_RX_DATA_W_PARITY, CodecBuffer, (BitCount + 7) / 8); breakflag = true; break; @@ -384,7 +384,7 @@ void Reader14443ACodecTask(void) CODEC_DEMOD_IN_PORT.INTCTRL = 0; LEDHook(LED_CODEC_TX, LED_PULSE); - LogEntry(LOG_INFO_CODEC_TX_DATA, CodecBuffer, (BitCount + 7) / 8); + LogEntry(LOG_INFO_CODEC_TX_DATA_W_PARITY, CodecBuffer, (BitCount + 7) / 8); /* Set state and start timer for Miller encoding. */ State = STATE_MILLER_SOF0; diff --git a/Firmware/Chameleon-Mini/Log.h b/Firmware/Chameleon-Mini/Log.h index 5b3f776..bcd1567 100644 --- a/Firmware/Chameleon-Mini/Log.h +++ b/Firmware/Chameleon-Mini/Log.h @@ -19,6 +19,8 @@ typedef enum { /* Codec */ LOG_INFO_CODEC_RX_DATA = 0x40, ///< Currently active codec received data. LOG_INFO_CODEC_TX_DATA = 0x41, ///< Currently active codec sent data. + LOG_INFO_CODEC_RX_DATA_W_PARITY = 0x42, ///< Currently active codec received data. + LOG_INFO_CODEC_TX_DATA_W_PARITY = 0x43, ///< Currently active codec sent data. /* App */ LOG_INFO_APP_CMD_READ = 0x80, ///< Application processed read command. diff --git a/Software/Chameleon/Log.py b/Software/Chameleon/Log.py index 9b09769..c541c43 100644 --- a/Software/Chameleon/Log.py +++ b/Software/Chameleon/Log.py @@ -22,6 +22,8 @@ eventTypes = { 0x40: { 'name': 'CODEC RX', 'decoder': binaryDecoder }, 0x41: { 'name': 'CODEC TX', 'decoder': binaryDecoder }, + 0x42: { 'name': 'CODEC RX W/ PARITY', 'decoder': binaryDecoder }, + 0x43: { 'name': 'CODEC TX W/ PARITY', 'decoder': binaryDecoder }, 0x80: { 'name': 'APP READ', 'decoder': binaryDecoder }, 0x81: { 'name': 'APP WRITE', 'decoder': binaryDecoder }, From b1e457ca01c934b1e5515dbffacc9bae10d2f536 Mon Sep 17 00:00:00 2001 From: Georg Date: Tue, 4 Apr 2017 16:26:09 +0200 Subject: [PATCH 004/104] added reader restart function which may be called from application, so the reader field will be shut down and restarted after a given time --- Firmware/Chameleon-Mini/Codec/Codec.c | 28 ++++++++++++++++++- Firmware/Chameleon-Mini/Codec/Codec.h | 3 ++ .../Chameleon-Mini/Codec/Reader14443-2A.c | 2 +- 3 files changed, 31 insertions(+), 2 deletions(-) diff --git a/Firmware/Chameleon-Mini/Codec/Codec.c b/Firmware/Chameleon-Mini/Codec/Codec.c index 5fbda38..bb845e8 100644 --- a/Firmware/Chameleon-Mini/Codec/Codec.c +++ b/Firmware/Chameleon-Mini/Codec/Codec.c @@ -14,9 +14,12 @@ uint16_t Reader_FWT = ISO14443A_RX_PENDING_TIMEOUT; #define READER_FIELD_MINIMUM_WAITING_TIME 70 // ms static uint16_t ReaderFieldStartTimestamp = 0; +static uint16_t ReaderFieldRestartTimestamp = 0; +static uint16_t ReaderFieldRestartDelay = 0; static volatile struct { bool Started; bool Ready; + bool ToBeRestarted; } ReaderFieldFlags = { false }; uint8_t CodecBuffer[CODEC_BUFFER_SIZE]; @@ -25,7 +28,7 @@ uint16_t ReaderThreshold = 400; // standard value // the following three functions prevent sending data directly after turning on the reader field void CodecReaderFieldStart(void) // DO NOT CALL THIS FUNCTION INSIDE APPLICATION! { - if (!CodecGetReaderField()) + if (!CodecGetReaderField() && !ReaderFieldFlags.ToBeRestarted) { CodecSetReaderField(true); ReaderFieldFlags.Started = true; @@ -41,6 +44,14 @@ void CodecReaderFieldStop(void) ReaderFieldFlags.Ready = false; } +void CodecReaderFieldRestart(uint16_t delay) +{ + ReaderFieldFlags.ToBeRestarted = true; + ReaderFieldRestartTimestamp = SystemGetSysTick(); + ReaderFieldRestartDelay = delay; + CodecReaderFieldStop(); +} + /* * This function returns false if and only if the reader field has been turned on in the last READER_FIELD_MIN..._TIME ms. * If the reader field is not active, true is returned. @@ -56,3 +67,18 @@ bool CodecIsReaderFieldReady(void) } return false; } + +bool CodecIsReaderToBeRestarted(void) +{ + if (ReaderFieldFlags.ToBeRestarted) + { + if (SYSTICK_DIFF(ReaderFieldRestartTimestamp) >= ReaderFieldRestartDelay) + { + ReaderFieldFlags.ToBeRestarted = false; + CodecReaderFieldStart(); + } + return true; + } + return false; +} + diff --git a/Firmware/Chameleon-Mini/Codec/Codec.h b/Firmware/Chameleon-Mini/Codec/Codec.h index 7a49727..4ac44c6 100644 --- a/Firmware/Chameleon-Mini/Codec/Codec.h +++ b/Firmware/Chameleon-Mini/Codec/Codec.h @@ -248,4 +248,7 @@ void CodecReaderFieldStart(void); void CodecReaderFieldStop(void); bool CodecIsReaderFieldReady(void); +void CodecReaderFieldRestart(uint16_t delay); +#define FIELD_RESTART() CodecReaderFieldRestart(100) +bool CodecIsReaderToBeRestarted(void); #endif /* CODEC_H_ */ diff --git a/Firmware/Chameleon-Mini/Codec/Reader14443-2A.c b/Firmware/Chameleon-Mini/Codec/Reader14443-2A.c index 1921e43..a2f9d1c 100644 --- a/Firmware/Chameleon-Mini/Codec/Reader14443-2A.c +++ b/Firmware/Chameleon-Mini/Codec/Reader14443-2A.c @@ -287,7 +287,7 @@ void Reader14443ACodecTask(void) Flags.RxDone = true; Flags.RxPending = false; } - if (!CodecIsReaderFieldReady()) + if (CodecIsReaderToBeRestarted() || !CodecIsReaderFieldReady()) return; if (!Flags.RxPending && (Flags.Start || Flags.RxDone)) { From 65e5383ce48b318f9c29247055f088aa86d2e324 Mon Sep 17 00:00:00 2001 From: Georg Date: Tue, 4 Apr 2017 16:40:33 +0200 Subject: [PATCH 005/104] reader application fixes: changed identify typo, fixed identify bugs, select function resets Selected variable if necessary --- Firmware/Chameleon-Mini/Application/Reader14443A.c | 12 +++++++++--- Firmware/Chameleon-Mini/Application/Reader14443A.h | 2 +- Firmware/Chameleon-Mini/Terminal/Commands.c | 2 +- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/Firmware/Chameleon-Mini/Application/Reader14443A.c b/Firmware/Chameleon-Mini/Application/Reader14443A.c index 65399bf..ab00f00 100644 --- a/Firmware/Chameleon-Mini/Application/Reader14443A.c +++ b/Firmware/Chameleon-Mini/Application/Reader14443A.c @@ -225,7 +225,12 @@ INLINE uint16_t Reader14443A_Deselect(uint8_t* Buffer) // deselects the card bec INLINE uint16_t Reader14443A_Select(uint8_t * Buffer, uint16_t BitCount) { if (Selected) - return 0; + { + if (ReaderState > STATE_HALT) + return 0; + else + Selected = false; + } switch (ReaderState) { case STATE_IDLE: @@ -540,7 +545,7 @@ uint16_t Reader14443AAppProcess(uint8_t* Buffer, uint16_t BitCount) /************************************ * This function identifies a PICC. * ************************************/ - case Reader14443_Indentify: + case Reader14443_Identify: { uint16_t rVal = Reader14443A_Select(Buffer, BitCount); if (Selected) @@ -548,6 +553,7 @@ uint16_t Reader14443AAppProcess(uint8_t* Buffer, uint16_t BitCount) if (ReaderState >= STATE_SAK_CL1 && ReaderState <= STATE_SAK_CL3) { bool ISO14443_4A_compliant = IS_ISO14443A_4_COMPLIANT(Buffer); + CardCandidatesIdx = 0; uint8_t i; for (i = 0; i < ARRAY_COUNT(CardIdentificationList); i++) @@ -652,7 +658,7 @@ uint16_t Reader14443AAppProcess(uint8_t* Buffer, uint16_t BitCount) CardCandidatesIdx = 0; return Reader14443A_Deselect(Buffer); } - switch (Buffer[3]) + switch (Buffer[5]) { case 0x00: CardCandidatesIdx = 1; diff --git a/Firmware/Chameleon-Mini/Application/Reader14443A.h b/Firmware/Chameleon-Mini/Application/Reader14443A.h index 66f243f..63b8706 100644 --- a/Firmware/Chameleon-Mini/Application/Reader14443A.h +++ b/Firmware/Chameleon-Mini/Application/Reader14443A.h @@ -29,7 +29,7 @@ typedef enum { Reader14443_Send_Raw, Reader14443_Get_UID, Reader14443_Read_MF_Ultralight, - Reader14443_Indentify + Reader14443_Identify } Reader14443Command; diff --git a/Firmware/Chameleon-Mini/Terminal/Commands.c b/Firmware/Chameleon-Mini/Terminal/Commands.c index 9f0f70a..988eef6 100644 --- a/Firmware/Chameleon-Mini/Terminal/Commands.c +++ b/Firmware/Chameleon-Mini/Terminal/Commands.c @@ -548,7 +548,7 @@ CommandStatusIdType CommandExecIdentifyCard(char* OutMessage) return COMMAND_ERR_INVALID_USAGE_ID; ApplicationReset(); - Reader14443CurrentCommand = Reader14443_Indentify; + Reader14443CurrentCommand = Reader14443_Identify; Reader14443AAppInit(); Reader14443ACodecStart(); CommandLinePendingTaskTimeout = &Reader14443AAppTimeout; From 02ec23e3a63cfc6442c6c8c4d546108074a74257 Mon Sep 17 00:00:00 2001 From: Georg Date: Tue, 4 Apr 2017 16:43:43 +0200 Subject: [PATCH 006/104] major changes in log function and memory functions: 1. relocated EEPROM accessing functions 2. current FRAM log address is stored in FRAM 3. EEPROM contains flag that indicates whether this address in FRAM is valid 4. the log is written from SRAM to FRAM automatically 5. on boot, the Chameleon logs that it boots right now --- Firmware/Chameleon-Mini/Log.c | 60 ++++++++--- Firmware/Chameleon-Mini/Log.h | 7 +- Firmware/Chameleon-Mini/Memory.c | 102 +++++++++++++++++++ Firmware/Chameleon-Mini/Memory.h | 4 + Firmware/Chameleon-Mini/Settings.c | 106 +------------------- Firmware/Chameleon-Mini/Terminal/Commands.c | 3 +- Software/Chameleon/Log.py | 2 + 7 files changed, 161 insertions(+), 123 deletions(-) diff --git a/Firmware/Chameleon-Mini/Log.c b/Firmware/Chameleon-Mini/Log.c index 49e3781..a57edba 100644 --- a/Firmware/Chameleon-Mini/Log.c +++ b/Firmware/Chameleon-Mini/Log.c @@ -6,9 +6,11 @@ #include "LEDHook.h" static uint8_t LogMem[LOG_SIZE]; -static uint8_t* LogMemPtr; +static uint8_t *LogMemPtr; static uint16_t LogMemLeft; static uint16_t LogFRAMAddr = FRAM_LOG_START_ADDR; +static uint8_t EEMEM LogFRAMAddrValid = false; +static bool EnableLogSRAMtoFRAM = false; LogFuncType CurrentLogFunc; static const MapEntryType PROGMEM LogModeMap[] = { @@ -61,13 +63,30 @@ static void LogFuncLive(LogEntryEnum Entry, const void* Data, uint8_t Length) void LogInit(void) { - LogMemClear(); LogSetModeById(GlobalSettings.ActiveSettingPtr->LogMode); + LogMemPtr = LogMem; + LogMemLeft = sizeof(LogMem); + + uint8_t result; + ReadEEPBlock((uint16_t) &LogFRAMAddrValid, &result, 1); + memset(LogMemPtr, LOG_EMPTY, LOG_SIZE); + if (result) + { + MemoryReadBlock(&LogFRAMAddr, FRAM_LOG_ADDR_ADDR, 2); + } else { + LogFRAMAddr = FRAM_LOG_START_ADDR; + MemoryWriteBlock(&LogFRAMAddr, FRAM_LOG_ADDR_ADDR, 2); + result = true; + WriteEEPBlock((uint16_t) &LogFRAMAddrValid, &result, 1); + } + + LogEntry(LOG_INFO_SYSTEM_BOOT, NULL, 0); } void LogTick(void) { - + if (EnableLogSRAMtoFRAM) + LogSRAMToFRAM(); } void LogTask(void) @@ -118,23 +137,29 @@ bool LogMemLoadBlock(void* Buffer, uint32_t BlockAddress, uint16_t ByteCount) } } +INLINE void LogSRAMClear(void) +{ + uint16_t i, until = LOG_SIZE - LogMemLeft; + + for (i=0; i < until; i++) { + LogMem[i] = (uint8_t) LOG_EMPTY; + } + + LogMemPtr = LogMem; + LogMemLeft = sizeof(LogMem); +} + void LogMemClear(void) { - uint16_t i; - - for (i=0; i= LOG_SIZE - LogMemLeft) { MemoryWriteBlock(LogMem, LogFRAMAddr, LOG_SIZE - LogMemLeft); - uint16_t tmp = LogFRAMAddr + (LOG_SIZE - LogMemLeft); - LogMemClear(); // this function also resets LogFRAMAddr, but does not delete anything from FRAM, so we just save the new FRAM address - LogFRAMAddr = tmp; + LogFRAMAddr += LOG_SIZE - LogMemLeft; + LogSRAMClear(); + MemoryWriteBlock(&LogFRAMAddr, FRAM_LOG_ADDR_ADDR, 2); } else { // TODO handle the case in which the FRAM is full } diff --git a/Firmware/Chameleon-Mini/Log.h b/Firmware/Chameleon-Mini/Log.h index bcd1567..3d41896 100644 --- a/Firmware/Chameleon-Mini/Log.h +++ b/Firmware/Chameleon-Mini/Log.h @@ -4,8 +4,9 @@ #include "Common.h" #define LOG_SIZE 2048 -#define FRAM_LOG_START_ADDR 0x4000 // from the start of the second half of FRAM -#define FRAM_LOG_SIZE 0x4000 // the whole second half +#define FRAM_LOG_ADDR_ADDR 0x4000 // start of the second half of FRAM +#define FRAM_LOG_START_ADDR 0x4002 // directly after the address +#define FRAM_LOG_SIZE 0x3FFE // the whole second half (minus the 2 Bytes of Address) /** Enum for log entry type. \note Every entry type has a specific integer value, which can be found in the source code. */ typedef enum { @@ -38,6 +39,8 @@ typedef enum { LOG_ERR_APP_CHECKSUM_FAIL = 0xC1, ///< Application had a checksum fail. LOG_ERR_APP_NOT_AUTHED = 0xC2, ///< Application is not authenticated. + LOG_INFO_SYSTEM_BOOT = 0xFF, ///< Chameleon boots + LOG_EMPTY = 0x00 ///< Empty Log Entry. This is not followed by a length byte nor the two systick bytes nor any data. } LogEntryEnum; diff --git a/Firmware/Chameleon-Mini/Memory.c b/Firmware/Chameleon-Mini/Memory.c index c885397..15e78a3 100644 --- a/Firmware/Chameleon-Mini/Memory.c +++ b/Firmware/Chameleon-Mini/Memory.c @@ -440,3 +440,105 @@ bool MemoryDownloadBlock(void* Buffer, uint32_t BlockAddress, uint16_t ByteCount } } +// EEPROM functions + +static inline void NVM_EXEC(void) +{ + void *z = (void *)&NVM_CTRLA; + + __asm__ volatile("out %[ccp], %[ioreg]" "\n\t" + "st z, %[cmdex]" + : + : [ccp] "I" (_SFR_IO_ADDR(CCP)), + [ioreg] "d" (CCP_IOREG_gc), + [cmdex] "r" (NVM_CMDEX_bm), + [z] "z" (z) + ); +} + +void WaitForNVM(void) +{ + while (NVM.STATUS & NVM_NVMBUSY_bm) { }; +} + +void FlushNVMBuffer(void) +{ + WaitForNVM(); + + if ((NVM.STATUS & NVM_EELOAD_bm) != 0) { + NVM.CMD = NVM_CMD_ERASE_EEPROM_BUFFER_gc; + NVM_EXEC(); + } +} + +uint16_t ReadEEPBlock(uint16_t Address, void *DestPtr, uint16_t ByteCount) +{ + uint16_t BytesRead = 0; + uint8_t* BytePtr = (uint8_t*) DestPtr; + NVM.ADDR2 = 0; + + WaitForNVM(); + + while (ByteCount > 0) + { + NVM.ADDR0 = Address & 0xFF; + NVM.ADDR1 = (Address >> 8) & 0x1F; + + NVM.CMD = NVM_CMD_READ_EEPROM_gc; + NVM_EXEC(); + + *BytePtr++ = NVM.DATA0; + Address++; + + ByteCount--; + BytesRead++; + } + + return BytesRead; +} + + +uint16_t WriteEEPBlock(uint16_t Address, const void *SrcPtr, uint16_t ByteCount) +{ + const uint8_t* BytePtr = (const uint8_t*) SrcPtr; + uint8_t ByteAddress = Address % EEPROM_PAGE_SIZE; + uint16_t PageAddress = Address - ByteAddress; + uint16_t BytesWritten = 0; + + FlushNVMBuffer(); + WaitForNVM(); + NVM.CMD = NVM_CMD_LOAD_EEPROM_BUFFER_gc; + + NVM.ADDR1 = 0; + NVM.ADDR2 = 0; + + while (ByteCount > 0) + { + NVM.ADDR0 = ByteAddress; + + NVM.DATA0 = *BytePtr++; + + ByteAddress++; + ByteCount--; + + if (ByteCount == 0 || ByteAddress >= EEPROM_PAGE_SIZE) + { + NVM.ADDR0 = PageAddress & 0xFF; + NVM.ADDR1 = (PageAddress >> 8) & 0x1F; + + NVM.CMD = NVM_CMD_ERASE_WRITE_EEPROM_PAGE_gc; + NVM_EXEC(); + + PageAddress += EEPROM_PAGE_SIZE; + ByteAddress = 0; + + WaitForNVM(); + + NVM.CMD = NVM_CMD_LOAD_EEPROM_BUFFER_gc; + } + + BytesWritten++; + } + + return BytesWritten; +} diff --git a/Firmware/Chameleon-Mini/Memory.h b/Firmware/Chameleon-Mini/Memory.h index a10bb17..0ae3e51 100644 --- a/Firmware/Chameleon-Mini/Memory.h +++ b/Firmware/Chameleon-Mini/Memory.h @@ -28,6 +28,10 @@ void MemoryStore(void); bool MemoryUploadBlock(void* Buffer, uint32_t BlockAddress, uint16_t ByteCount); bool MemoryDownloadBlock(void* Buffer, uint32_t BlockAddress, uint16_t ByteCount); +/* EEPROM functions */ +uint16_t WriteEEPBlock(uint16_t Address, const void *SrcPtr, uint16_t ByteCount); +uint16_t ReadEEPBlock(uint16_t Address, void *DestPtr, uint16_t ByteCount); + #endif /* __ASSEMBLER__ */ #endif /* MEMORY_H_ */ diff --git a/Firmware/Chameleon-Mini/Settings.c b/Firmware/Chameleon-Mini/Settings.c index ef3fada..90cbaf6 100644 --- a/Firmware/Chameleon-Mini/Settings.c +++ b/Firmware/Chameleon-Mini/Settings.c @@ -29,115 +29,13 @@ SettingsType EEMEM StoredSettings = { }} }; -static inline void NVM_EXEC(void) -{ - void *z = (void *)&NVM_CTRLA; - - __asm__ volatile("out %[ccp], %[ioreg]" "\n\t" - "st z, %[cmdex]" - : - : [ccp] "I" (_SFR_IO_ADDR(CCP)), - [ioreg] "d" (CCP_IOREG_gc), - [cmdex] "r" (NVM_CMDEX_bm), - [z] "z" (z) - ); -} - -void WaitForNVM(void) -{ - while (NVM.STATUS & NVM_NVMBUSY_bm) { }; -} - -void FlushNVMBuffer(void) -{ - WaitForNVM(); - - if ((NVM.STATUS & NVM_EELOAD_bm) != 0) { - NVM.CMD = NVM_CMD_ERASE_EEPROM_BUFFER_gc; - NVM_EXEC(); - } -} - -uint16_t ReadEEPBlock(uint16_t Address, void *DestPtr, uint16_t ByteCount) -{ - uint16_t BytesRead = 0; - uint8_t* BytePtr = (uint8_t*) DestPtr; - NVM.ADDR2 = 0; - - WaitForNVM(); - - while (ByteCount > 0) - { - NVM.ADDR0 = Address & 0xFF; - NVM.ADDR1 = (Address >> 8) & 0x1F; - - NVM.CMD = NVM_CMD_READ_EEPROM_gc; - NVM_EXEC(); - - *BytePtr++ = NVM.DATA0; - Address++; - - ByteCount--; - BytesRead++; - } - - return BytesRead; -} - - -uint16_t WriteEEPBlock(uint16_t Address, const void *SrcPtr, uint16_t ByteCount) -{ - const uint8_t* BytePtr = (const uint8_t*) SrcPtr; - uint8_t ByteAddress = Address % EEPROM_PAGE_SIZE; - uint16_t PageAddress = Address - ByteAddress; - uint16_t BytesWritten = 0; - - FlushNVMBuffer(); - WaitForNVM(); - NVM.CMD = NVM_CMD_LOAD_EEPROM_BUFFER_gc; - - NVM.ADDR1 = 0; - NVM.ADDR2 = 0; - - while (ByteCount > 0) - { - NVM.ADDR0 = ByteAddress; - - NVM.DATA0 = *BytePtr++; - - ByteAddress++; - ByteCount--; - - if (ByteCount == 0 || ByteAddress >= EEPROM_PAGE_SIZE) - { - NVM.ADDR0 = PageAddress & 0xFF; - NVM.ADDR1 = (PageAddress >> 8) & 0x1F; - - NVM.CMD = NVM_CMD_ERASE_WRITE_EEPROM_PAGE_gc; - NVM_EXEC(); - - PageAddress += EEPROM_PAGE_SIZE; - ByteAddress = 0; - - WaitForNVM(); - - NVM.CMD = NVM_CMD_LOAD_EEPROM_BUFFER_gc; - } - - BytesWritten++; - } - - return BytesWritten; -} - - void SettingsLoad(void) { - ReadEEPBlock(0, &GlobalSettings, sizeof(SettingsType)); + ReadEEPBlock((uint16_t) &StoredSettings, &GlobalSettings, sizeof(SettingsType)); } void SettingsSave(void) { #if ENABLE_EEPROM_SETTINGS - WriteEEPBlock(0, &GlobalSettings, sizeof(SettingsType)); + WriteEEPBlock((uint16_t) &StoredSettings, &GlobalSettings, sizeof(SettingsType)); #endif } diff --git a/Firmware/Chameleon-Mini/Terminal/Commands.c b/Firmware/Chameleon-Mini/Terminal/Commands.c index 988eef6..bff3dc2 100644 --- a/Firmware/Chameleon-Mini/Terminal/Commands.c +++ b/Firmware/Chameleon-Mini/Terminal/Commands.c @@ -321,8 +321,9 @@ CommandStatusIdType CommandSetLogMode(char* OutMessage, const char* InParam) CommandStatusIdType CommandGetLogMem(char* OutParam) { + uint16_t free = LogMemFree(); snprintf_P(OutParam, TERMINAL_BUFFER_SIZE, - PSTR("%u"), LogMemFree()); + PSTR("%u (from which %u non-volatile)"), free, (free <= LOG_SIZE) ? 0 : (free - LOG_SIZE)); return COMMAND_INFO_OK_WITH_TEXT_ID; diff --git a/Software/Chameleon/Log.py b/Software/Chameleon/Log.py index c541c43..64e24e9 100644 --- a/Software/Chameleon/Log.py +++ b/Software/Chameleon/Log.py @@ -42,6 +42,8 @@ eventTypes = { 0xC0: { 'name': 'APP AUTH FAILED', 'decoder': binaryDecoder }, 0xC1: { 'name': 'APP CSUM FAILED', 'decoder': binaryDecoder }, 0xC2: { 'name': 'APP NOT AUTHED', 'decoder': binaryDecoder }, + + 0xFF: { 'name': 'BOOT', 'decoder': noDecoder }, } TIMESTAMP_MAX = 65536 From 90b09342d4c0ae186bc90567c3cf948d871d883b Mon Sep 17 00:00:00 2001 From: Georg Date: Tue, 4 Apr 2017 16:47:18 +0200 Subject: [PATCH 007/104] fixed bug in log download backend function --- Firmware/Chameleon-Mini/Log.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/Firmware/Chameleon-Mini/Log.c b/Firmware/Chameleon-Mini/Log.c index a57edba..c805c07 100644 --- a/Firmware/Chameleon-Mini/Log.c +++ b/Firmware/Chameleon-Mini/Log.c @@ -100,11 +100,12 @@ bool LogMemLoadBlock(void* Buffer, uint32_t BlockAddress, uint16_t ByteCount) { bool overflow = false; uint16_t remainderByteCount = 0; + uint16_t SizeInFRAMStored = LogFRAMAddr - FRAM_LOG_START_ADDR; // prevent buffer overflows: - if ((BlockAddress + ByteCount) >= sizeof(LogMem) + (LogFRAMAddr - FRAM_LOG_START_ADDR)) + if ((BlockAddress + ByteCount) >= sizeof(LogMem) + SizeInFRAMStored) { overflow = true; - uint16_t tmp = sizeof(LogMem) + (LogFRAMAddr - FRAM_LOG_START_ADDR) - BlockAddress; + uint16_t tmp = sizeof(LogMem) + SizeInFRAMStored - BlockAddress; remainderByteCount = ByteCount - tmp; ByteCount = tmp; } @@ -114,15 +115,15 @@ bool LogMemLoadBlock(void* Buffer, uint32_t BlockAddress, uint16_t ByteCount) * 2. case: The block wraps from FRAM to SRAM * 3. case: The whole block is in SRAM. */ - if (BlockAddress < (LogFRAMAddr - FRAM_LOG_START_ADDR) && (BlockAddress + ByteCount) < (LogFRAMAddr - FRAM_LOG_START_ADDR)) + if (BlockAddress < SizeInFRAMStored && (BlockAddress + ByteCount) < SizeInFRAMStored) { MemoryReadBlock(Buffer, BlockAddress + FRAM_LOG_START_ADDR, ByteCount); - } else if (BlockAddress < (LogFRAMAddr - FRAM_LOG_START_ADDR)) { - uint16_t FramByteCount = LogFRAMAddr - (BlockAddress + FRAM_LOG_START_ADDR); + } else if (BlockAddress < SizeInFRAMStored) { + uint16_t FramByteCount = SizeInFRAMStored - BlockAddress; MemoryReadBlock(Buffer, BlockAddress + FRAM_LOG_START_ADDR, FramByteCount); memcpy(Buffer + FramByteCount, LogMem, ByteCount - FramByteCount); } else { - memcpy(Buffer, LogMem + BlockAddress - LogFRAMAddr, ByteCount); + memcpy(Buffer, LogMem + BlockAddress - SizeInFRAMStored, ByteCount); } if (overflow) From f6826c3b5ee300d6adbbc8bdb343462513a4a653 Mon Sep 17 00:00:00 2001 From: Georg Date: Tue, 4 Apr 2017 16:52:52 +0200 Subject: [PATCH 008/104] small changes in command functions --- Firmware/Chameleon-Mini/Terminal/Commands.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Firmware/Chameleon-Mini/Terminal/Commands.c b/Firmware/Chameleon-Mini/Terminal/Commands.c index bff3dc2..84057c6 100644 --- a/Firmware/Chameleon-Mini/Terminal/Commands.c +++ b/Firmware/Chameleon-Mini/Terminal/Commands.c @@ -570,7 +570,7 @@ CommandStatusIdType CommandSetTimeout(char* OutMessage, const char* InParam) return COMMAND_INFO_OK_WITH_TEXT_ID; } uint16_t tmp = 601; - if (!sscanf(InParam, "%5d", &tmp) || tmp > 600) + if (!sscanf_P(InParam, PSTR("%5d"), &tmp) || tmp > 600) return COMMAND_ERR_INVALID_PARAM_ID; GlobalSettings.ActiveSettingPtr->PendingTaskTimeout = tmp; return COMMAND_INFO_OK_ID; @@ -590,7 +590,7 @@ CommandStatusIdType CommandSetThreshold(char* OutMessage, const char* InParam) return COMMAND_INFO_OK_WITH_TEXT_ID; } uint16_t tmp = 0; - if (!sscanf(InParam, "%5d", &tmp) || tmp > CODEC_MAXIMUM_THRESHOLD) + if (!sscanf_P(InParam, PSTR("%5d"), &tmp) || tmp > CODEC_MAXIMUM_THRESHOLD) return COMMAND_ERR_INVALID_PARAM_ID; DACB.CH0DATA = tmp; ReaderThreshold = tmp; From 2013c8fb4ec522cd88c8ce327aa9a838c1973090 Mon Sep 17 00:00:00 2001 From: Georg Date: Wed, 5 Apr 2017 10:02:00 +0200 Subject: [PATCH 009/104] updated latest version --- .../Chameleon-Mini/Latest/Chameleon-Mini.eep | 12 +- .../Chameleon-Mini/Latest/Chameleon-Mini.hex | 4764 +++++++++-------- 2 files changed, 2405 insertions(+), 2371 deletions(-) diff --git a/Firmware/Chameleon-Mini/Latest/Chameleon-Mini.eep b/Firmware/Chameleon-Mini/Latest/Chameleon-Mini.eep index ec4d190..94e9de2 100644 --- a/Firmware/Chameleon-Mini/Latest/Chameleon-Mini.eep +++ b/Firmware/Chameleon-Mini/Latest/Chameleon-Mini.eep @@ -1,7 +1,7 @@ -:10000000005A2B06060808000004010A000606082C -:1000100008000004010A0006060808000004010A9E -:100020000006060808000004010A00060608080089 -:100030000004010A0006060808000004010A000680 -:10004000060808000004010A00060608080000046B -:03005000010A00A2 +:1000000000005E2B06060808000004010A00060630 +:100010000808000004010A000606080800000401A0 +:100020000A0006060808000004010A00060608087F +:10003000000004010A0006060808000004010A0086 +:1000400006060808000004010A0006060808000069 +:0400500004010A009D :00000001FF diff --git a/Firmware/Chameleon-Mini/Latest/Chameleon-Mini.hex b/Firmware/Chameleon-Mini/Latest/Chameleon-Mini.hex index 04c57be..c7902df 100644 --- a/Firmware/Chameleon-Mini/Latest/Chameleon-Mini.hex +++ b/Firmware/Chameleon-Mini/Latest/Chameleon-Mini.hex @@ -1,35 +1,35 @@ -:100000000C94FB0A0C94200B0C94200B0C94200BEA -:100010000C94200B0C94200B0C94200B0C94200BB4 -:100020000C94200B0C94200B0C944D0C0C94200B76 -:100030000C94200B0C94200B0C94200B0C94200B94 -:100040000C94200B0C94200B0C94200B0C94200B84 -:100050000C94200B0C94200B0C94200B0C94200B74 -:100060000C94200B0C94200B0C94200B0C94200B64 -:100070000C94200B0C94200B0C94200B0C94200B54 -:100080000C94200B0C94200B0C94AC210C94200BA2 -:100090000C94200B0C94200B0C94200B0C94200B34 -:1000A0000C94200B0C94200B0C94200B0C94200B24 -:1000B0000C94200B0C94200B0C94200B0C947922A4 -:1000C0000C94200B0C943B260C94200B0C94200BCE -:1000D0000C94200B0C94200B0C94200B0C94200BF4 -:1000E0000C94200B0C94200B0C94200B0C94200BE4 -:1000F0000C94200B0C94200B0C94200B0C94200BD4 -:100100000C94200B0C94200B0C94200B0C94200BC3 -:100110000C94200B0C9416260C94200B0C94200BA2 -:100120000C94200B0C94200B0C94200B0C94200BA3 -:100130000C94200B0C94200B0C94200B0C94E421B9 -:100140000C94E1240C94200B0C94200B0C94200BA9 -:100150000C94200B0C94AB250C94200B0C94200BCE -:100160000C94200B0C94200B0C94200B0C94200B63 -:100170000C94200B0C94200B0C94200B0C94200B53 -:100180000C94200B0C94200B0C94200B0C94200B43 -:100190000C94200B0C94200B0C94200B0C94200B33 -:1001A0000C94200B0C94200B0C94200B0C94200B23 -:1001B0000C94200B0C94200B0C94200B0C94200B13 -:1001C0000C94200B0C94200B0C94200B0C94200B03 -:1001D0000C94200B0C94200B0C94200B0C94200BF3 -:1001E0000C94200B0C94200B0C94200B0C94200BE3 -:1001F0000C94200B0C94DB420C94200B1E03430048 +:100000000C940E0B0C94330B0C94330B0C94330B9D +:100010000C94330B0C94330B0C94330B0C94330B68 +:100020000C94330B0C94330B0C94620C0C94330B28 +:100030000C94330B0C94330B0C94330B0C94330B48 +:100040000C94330B0C94330B0C94330B0C94330B38 +:100050000C94330B0C94330B0C94330B0C94330B28 +:100060000C94330B0C94330B0C94330B0C94330B18 +:100070000C94330B0C94330B0C94330B0C94330B08 +:100080000C94330B0C94330B0C9495220C94330B7F +:100090000C94330B0C94330B0C94330B0C94330BE8 +:1000A0000C94330B0C94330B0C94330B0C94330BD8 +:1000B0000C94330B0C94330B0C94330B0C94622381 +:1000C0000C94330B0C9424270C94330B0C94330BAB +:1000D0000C94330B0C94330B0C94330B0C94330BA8 +:1000E0000C94330B0C94330B0C94330B0C94330B98 +:1000F0000C94330B0C94330B0C94330B0C94330B88 +:100100000C94330B0C94330B0C94330B0C94330B77 +:100110000C94330B0C94FF260C94330B0C94330B80 +:100120000C94330B0C94330B0C94330B0C94330B57 +:100130000C94330B0C94330B0C94330B0C94CD2296 +:100140000C94CA250C94330B0C94330B0C94330B86 +:100150000C94330B0C9494260C94330B0C94330BAB +:100160000C94330B0C94330B0C94330B0C94330B17 +:100170000C94330B0C94330B0C94330B0C94330B07 +:100180000C94330B0C94330B0C94330B0C94330BF7 +:100190000C94330B0C94330B0C94330B0C94330BE7 +:1001A0000C94330B0C94330B0C94330B0C94330BD7 +:1001B0000C94330B0C94330B0C94330B0C94330BC7 +:1001C0000C94330B0C94330B0C94330B0C94330BB7 +:1001D0000C94330B0C94330B0C94330B0C94330BA7 +:1001E0000C94330B0C94330B0C94330B0C94330B97 +:1001F0000C94330B0C94ED430C94330B1E0343000F :10020000680061006D0065006C0065006F006E00A5 :100210002D004D0069006E00690000002A034B00AC :10022000610073007000650072002000260020004D @@ -39,19 +39,19 @@ :10026000001001042402060524060001070582038C :100270000800FF09040100020A000000070504024B :10028000100005070583021000051201100102008D -:100290000008D016B20401000102DC01F70CF80CD2 -:1002A000F90CFA0CFB0CFC0CFD0CFE0C010D020D04 -:1002B000000000013A23A623C523DC28E228E62813 -:1002C000FD0CE728A62AB92A400007003A23A623F6 -:1002D000C523F92A262B2A2BFD0C2B2B093225327C -:1002E000000404003A23A623C523082B262B2A2B1F -:1002F000FD0C2B2B09322532000407003A23A623DC -:10030000C523172B262B2A2BFD0C2B2B093225322C -:10031000001004003A23A623C523172B262B2A2BD3 -:10032000FD0C2B2B09322532001007003A23A6239F -:10033000C523FA0CFB0CFC0CFD0CFE0C010D020D90 -:10034000000000015624CF240E274D3550355D3571 -:100350005E358335010D020D00000000004E4F4E4A +:100290000008D016B20401000102DC010C0D0D0DA6 +:1002A0000E0D0F0D100D110D120D130D160D170D56 +:1002B0000000000123248F24AE24CF29D529D92979 +:1002C000120DDA29992BAC2B4000070023248F2430 +:1002D000AE24EC2B192C1D2C120D1E2CFC321833C5 +:1002E0000004040023248F24AE24FB2B192C1D2C86 +:1002F000120D1E2CFC3218330004070023248F2417 +:10030000AE240A2C192C1D2C120D1E2CFC32183375 +:100310000010040023248F24AE240A2C192C1D2C39 +:10032000120D1E2CFC3218330010070023248F24DA +:10033000AE240F0D100D110D120D130D160D170D0E +:10034000000000013F25B825F727403643365036D8 +:1003500051367636160D170D00000000004E4F4E38 :100360004500000000000000000000000000000048 :1003700000000000000000000000000000014D46E9 :100380005F554C5452414C4947485400000000000E @@ -152,2331 +152,2365 @@ :100970000000000000000000000000000A4C4F478B :100980004D454D5F46554C4C0000000000000000F6 :100990000000000000000000000000000025632CA3 -:1009A000256300416E7920696E7465676572206603 -:1009B000726F6D203020746F2025752E2052656671 -:1009C0006572656E636520766F6C7461676520770C -:1009D000696C6C2062652028564343202A205448C5 -:1009E000524553484F4C44202F203430393529206C -:1009F0006D562E0025750030203D206E6F207469E5 -:100A00006D656F75740D0A312D363030203D203103 -:100A10003030206D73202D203630303030206D7313 -:100A20002074696D656F7574002575206D730025E0 -:100A3000342E345800253575206D56002575002557 -:100A4000750025750025632C25630052414E444FE7 -:100A50004D004E4F205549442E004368616D656C32 -:100A6000656F6E4D696E692052657647202553206B -:100A70007573696E67204C55464120255320636F7E -:100A80006D70696C65642077697468204156522DD9 -:100A90004743432025532E204261736564206F6EC7 -:100AA00020746865206F70656E2D736F7572636555 -:100AB000204E464320746F6F6C204368616D656CF7 -:100AC000656F6E4D696E692E2068747470733A2F6D -:100AD0002F6769746875622E636F6D2F656D73651E -:100AE000632F4368616D656C656F6E4D696E69203B -:100AF000636F6D6D697420255300313730313138A3 -:100B00000031353131313500342E392E32006561F6 -:100B10003939333862000D0A000D0A000D0A000D44 -:100B20000A000D0A000D0A00643130303A4F4B00C4 -:100B300000000000000000000000000000000000B5 -:100B4000000000000000000000653130313A4F4BDA -:100B500020574954482054455854000000000000D4 -:100B6000000000000000000000006E3131303A57F4 -:100B7000414954494E4720464F5220584D4F444515 -:100B80004D00000000000000000000C83230303A84 -:100B9000554E4B4E4F574E20434F4D4D414E440006 -:100BA000000000000000000000000000C9323031E9 -:100BB0003A494E56414C494420434F4D4D414E44D5 -:100BC00020555341474500000000000000CA323064 -:100BD000323A494E56414C494420504152414D45CC -:100BE0005445520000000000000000000000783171 -:100BF00032303A46414C53450000000000000000EE -:100C0000000000000000000000000000000000796B -:100C10003132313A545255450000000000000000C6 +:1009A00025630025356400416E7920696E746567A2 +:1009B00065722066726F6D203020746F2025752E51 +:1009C000205265666572656E636520766F6C746132 +:1009D00067652077696C6C20626520285643432048 +:1009E0002A205448524553484F4C44202F2034303D +:1009F000393529206D562E002575002535640030C7 +:100A0000203D206E6F2074696D656F75740D0A311D +:100A10002D363030203D20313030206D73202D2098 +:100A20003630303030206D732074696D656F7574A9 +:100A3000002575206D730025342E3458002535753A +:100A4000206D56002575202866726F6D20776869C5 +:100A50006368202575206E6F6E2D766F6C617469EA +:100A60006C65290025750025750025632C2563001C +:100A700052414E444F4D004E4F205549442E0043A5 +:100A800068616D656C656F6E4D696E692052657643 +:100A900047202553207573696E67204C55464120C9 +:100AA000255320636F6D70696C6564207769746885 +:100AB000204156522D4743432025532E2042617337 +:100AC0006564206F6E20746865206F70656E2D738D +:100AD0006F75726365204E464320746F6F6C2043C0 +:100AE00068616D656C656F6E4D696E692E20687406 +:100AF0007470733A2F2F6769746875622E636F6D17 +:100B00002F656D7365632F4368616D656C656F6EEE +:100B10004D696E6920636F6D6D69742025530031D6 +:100B200037303430350031353131313500342E39FC +:100B30002E320066363832366333000D0A000D0A55 +:100B4000000D0A000D0A000D0A000D0A0064313084 +:100B5000303A4F4B00000000000000000000000091 +:100B600000000000000000000000000000006531EF +:100B700030313A4F4B20574954482054455854007F +:100B80000000000000000000000000000000006EF7 +:100B90003131303A57414954494E4720464F52204F +:100BA000584D4F44454D000000000000000000007B +:100BB000C83230303A554E4B4E4F574E20434F4D72 +:100BC0004D414E4400000000000000000000000005 +:100BD00000C93230313A494E56414C494420434FC6 +:100BE0004D4D414E44205553414745000000000003 +:100BF0000000CA3230323A494E56414C49442050E6 +:100C00004152414D45544552000000000000000093 +:100C1000000000783132303A46414C534500000024 :100C200000000000000000000000000000000000C4 -:100C3000CB3230333A54494D454F555400000000F3 +:100C300000000000793132313A545255450000002D :100C400000000000000000000000000000000000A4 -:100C50000056455253494F4E00000000000000006E -:100C6000000000000000002218434F4E4649470094 -:100C7000000000000000000000000000004A1844CE -:100C8000185549440000000000000000000000006A -:100C90000000000000A0186118524541444F4E4C1E -:100CA00059000000000000000000000000FE18F2E3 -:100CB0001855504C4F414400000000000000000057 -:100CC000002B19000000000000444F574E4C4F41CC -:100CD0004400000000000000003019000000000087 -:100CE0000052455345540000000000000000000081 -:100CF000003519000000000000555047524144459E -:100D0000000000000000000000401900000000008A -:100D1000004D454D53495A450000000000000000B9 -:100D2000000000000000004B1955494453495A4542 -:100D30000000000000000000000000000000006350 -:100D40001952425554544F4E00000000000000005C -:100D500000000000008019791952425554544F4E3A -:100D60005F4C4F4E4700000000000000009C1995AA -:100D7000194C425554544F4E000000000000000032 -:100D80000000000000B819B1194C425554544F4EA0 -:100D90005F4C4F4E470000000000000000D419CD0A -:100DA000194C4544475245454E00000000000000E4 -:100DB0000000000000F019E9194C45445245440078 -:100DC000000000000000000000000000000C1A05F8 -:100DD0001A4C4F474D4F44450000000000000000F2 -:100DE0000000000000261A211A4C4F474D454D00C7 -:100DF0000000000000000000000000000000003BB8 -:100E00001A4C4F47444F574E4C4F4144000000008E -:100E100000551A0000000000004C4F4753544F5239 -:100E20004500000000000000005A1A000000000009 -:100E3000004C4F47434C4541520000000000000069 -:100E4000005D1A00000000000053455454494E470D -:100E500000000000000000000000000000651A60B3 -:100E60001A434C4541520000000000000000000001 -:100E7000006E1A00000000000053544F524500005D -:100E8000000000000000000000721A0000000000D6 -:100E900000524543414C4C0000000000000000009F -:100EA00000761A0000000000004348415247494EB6 -:100EB0004700000000000000000000000000007A71 -:100EC0001A48454C500000000000000000000000DF -:100ED00000821A0000000000005253534900000035 -:100EE000000000000000000000000000000000BE44 -:100EF0001A5359535449434B0000000000000000AE -:100F000000000000000000F11A53454E445F5241BA -:100F10005700000000000000000000971B000000C8 -:100F20000053454E44000000000000000000000097 -:100F30000000000D1B0000000047455455494400C7 -:100F4000000000000000000000531C000000000032 -:100F50000044554D505F4D46550000000000000014 -:100F600000361C0000000000004944454E5449462C -:100F7000590000000000000000701C00000000008C -:100F80000054494D454F555400000000000000003A -:100F90000000000000AD1C8D1C5448524553484FC2 -:100FA0004C440000000000000000000000111DF98A -:100FB0001C4649454C4400000000000000000000B1 -:100FC00000000000005D1D871D0000000000000003 -:100FD0000000000000000000000000000000000011 -:100FE00000040001090100000000000000000000F2 -:100FF00000000000000000004E58500000000000FB -:1010000000000000000000004D4946415245204DBF -:10101000696E690000000000000000000000000090 -:1010200000000000000000000000000000000000C0 -:1010300000000000000000000000000000000000B0 -:101040000000000000000000040001080100000092 -:101050000000000000000000000000000000004E42 -:101060005850000000000000000000000000004D8B -:10107000494641524520436C617373696320316B6B -:101080000000000000000000000000000000000060 -:101090000000000000000000000000000000000050 -:1010A000000000000000000000000000000000023E -:1010B0000001180100000000000000000000000016 -:1010C0000000000000004E5850000000000000002A -:1010D0000000000000004D494641524520436C612C -:1010E0007373696320346B0000000000000000008F -:1010F00000000000000000000000000000000000F0 -:1011000000000000000000000000000000000000DF -:101110000000000000004400010001000000000089 -:10112000000000000000000000000000004E5850C9 -:10113000000000000000000000000000004D4946D3 -:1011400041524520556C7472616C69676874000087 -:10115000000000000000000000000000000000008F -:10116000000000000000000000000000000000007F -:101170000000000000000000000000000044030127 -:10118000200175778102800000000000000000004F -:10119000000005004E585000000000000000000054 -:1011A000000000004D4946415245204445534669E0 -:1011B0007265000000000000000000000000000058 -:1011C000000000000000000000000000000000001F -:1011D000000000000000000000000000000000000F -:1011E00000000000440301200175778102800000A7 -:1011F00000000000000000000005004E58500000F4 -:1012000000000000000000000000004D494641526F -:10121000452044455346697265204556310000001B -:1012200000000000000000000000000000000000BE -:1012300000000000000000000000000000000000AE -:10124000000000000000000000000004030128016D -:101250003877B14A434F503331000000000000009E -:10126000090149424D00000000000000000000009C -:1012700000004A434F5033310000000000000000DE -:10128000000000000000000000000000000000005E -:10129000000000000000000000000000000000004E +:100C50000000000000CB3230333A54494D454F5527 +:100C60005400000000000000000000000000000030 +:100C700000000000000056455253494F4E0000004E +:100C8000000000000000000000000000D318434FE7 +:100C90004E46494700000000000000000000000030 +:100CA0000000FB18F5185549440000000000000042 +:100CB0000000000000000000000051191219524508 +:100CC00041444F4E4C59000000000000000000005D +:100CD0000000AF19A31955504C4F414400000000CB +:100CE000000000000000DC19000000000000444F7C +:100CF000574E4C4F41440000000000000000E11935 +:100D00000000000000005245534554000000000060 +:100D1000000000000000E61900000000000055502F +:100D20004752414445000000000000000000F11956 +:100D30000000000000004D454D53495A4500000099 +:100D4000000000000000000000000000FC195549F0 +:100D50004453495A45000000000000000000000014 +:100D600000000000141A52425554544F4E00000027 +:100D700000000000000000000000311A2A1A524250 +:100D80005554544F4E5F4C4F4E470000000000003A +:100D900000004D1A461A4C425554544F4E00000064 +:100DA00000000000000000000000691A621A4C42B6 +:100DB0005554544F4E5F4C4F4E470000000000000A +:100DC0000000851A7E1A4C4544475245454E0000A6 +:100DD00000000000000000000000A11A9A1A4C4513 +:100DE00044524544000000000000000000000000E4 +:100DF0000000BD1AB61A4C4F474D4F444500000045 +:100E000000000000000000000000D71AD21A4C4F6A +:100E1000474D454D000000000000000000000000AC +:100E200000000000EC1A4C4F47444F574E4C4F41C6 +:100E3000440000000000111B0000000000004C4FA7 +:100E40004753544F52450000000000000000161B9D +:100E50000000000000004C4F47434C454152000049 +:100E6000000000000000191B0000000000005345B6 +:100E70005454494E470000000000000000000000EC +:100E80000000211B1C1B434C454152000000000088 +:100E90000000000000002A1B000000000000535466 +:100EA0004F524500000000000000000000002E1B13 +:100EB000000000000000524543414C4C000000007F +:100EC000000000000000321B00000000000043484A +:100ED000415247494E47000000000000000000005A +:100EE00000000000361B48454C5000000000000088 +:100EF0000000000000003E1B0000000000005253F4 +:100F00005349000000000000000000000000000045 +:100F1000000000007A1B5359535449434B00000012 +:100F2000000000000000000000000000AD1B534561 +:100F30004E445F52415700000000000000000000D6 +:100F4000531C0000000053454E4400000000000008 +:100F50000000000000000000C91B00000000474521 +:100F600054554944000000000000000000000F1D1F +:100F700000000000000044554D505F4D46550000F4 +:100F8000000000000000F21C0000000000004944C6 +:100F9000454E5449465900000000000000002C1D39 +:100FA00000000000000054494D454F55540000001A +:100FB00000000000000000000000691D491D5448A9 +:100FC000524553484F4C4400000000000000000010 +:100FD0000000CD1DB51D4649454C440000000000F1 +:100FE00000000000000000000000191E431E000069 +:100FF00000000000000000000000000000000000F1 +:1010000000000000000004000109010000000000D1 +:10101000000000000000000000000000004E5850DA +:10102000000000000000000000000000004D4946E4 +:10103000415245204D696E6900000000000000002B +:1010400000000000000000000000000000000000A0 +:101050000000000000000000000000000000000090 +:10106000000000000000000000000000000400017B +:101070000801000000000000000000000000000067 +:10108000000000004E58500000000000000000006A +:10109000000000004D494641524520436C61737386 +:1010A000696320316B0000000000000000000000B8 +:1010B0000000000000000000000000000000000030 +:1010C0000000000000000000000000000000000020 +:1010D00000000000020001180100000000000000F4 +:1010E00000000000000000000000004E585000000A +:1010F00000000000000000000000004D4946415281 +:101100004520436C617373696320346B00000000F9 +:1011100000000000000000000000000000000000CF +:1011200000000000000000000000000000000000BF +:101130000000000000000000000000440001000169 +:10114000000000000000000000000000000000009F +:1011500000004E5850000000000000000000000099 +:1011600000004D494641524520556C7472616C69CE +:10117000676874000000000000000000000000002C +:10118000000000000000000000000000000000005F +:10119000000000000000000000000000000000004F +:1011A00000004403012001757781028000000000E7 +:1011B0000000000000000005004E58500000000034 +:1011C0000000000000000000004D4946415245204B +:1011D00044455346697265000000000000000000AD +:1011E00000000000000000000000000000000000FF +:1011F00000000000000000000000000000000000EF +:101200000000000000000000004403012001757789 +:1012100081028000000000000000000000000500C6 +:101220004E585000000000000000000000000000C8 +:101230004D49464152452044455346697265204513 +:101240005631000000000000000000000000000017 +:10125000000000000000000000000000000000008E +:10126000000000000000000000000000000000007E +:1012700004030128013877B14A434F50333100004D +:101280000000000000090149424D0000000000007C +:10129000000000000000004A434F503331000000BE :1012A000000000000000000000000000000000003E -:1012B000000048000120017877B1024A434F507680 -:1012C000323431000000000C0149424D00000000A2 -:1012D0000000000000000000004A434F503331205E -:1012E00076322E342E310000000000000000000095 -:1012F00000000000000000000000000000000000EE -:1013000000000000000000000000000000000000DD -:1013100000000000000000000048000120013833F8 -:10132000B14A434F503431563232000000000C01B4 -:1013300049424D00000000000000000000000000D5 -:101340004A434F5034312076322E320000000000E4 -:10135000000000000000000000000000000000008D -:10136000000000000000000000000000000000007D +:1012B000000000000000000000000000000000002E +:1012C000000000000000000000000000000000001E +:1012D0000000000000000048000120017877B10202 +:1012E0004A434F5076323431000000000C0149422D +:1012F0004D000000000000000000000000004A4314 +:101300004F5033312076322E342E31000000000051 +:1013100000000000000000000000000000000000CD +:1013200000000000000000000000000000000000BD +:101330000000000000000000000000000000480065 +:101340000120013833B14A434F5034315632320014 +:101350000000000C0149424D0000000000000000A8 +:1013600000000000004A434F5034312076322E32C4 :10137000000000000000000000000000000000006D -:1013800004000128013833B14A434F5034315632FA -:1013900033310000000D0149424D00000000000003 -:1013A000000000000000004A434F503431207632E4 -:1013B0002E332E310000000000000000000000006D -:1013C000000000000000000000000000000000001D -:1013D000000000000000000000000000000000000D -:1013E000000000000000000400018801000000006F -:1013F0000000000000000000000000000000496E36 -:1014000066696E656F6E00000000000000004D49C7 -:101410004641524520436C617373696320316B0010 -:1014200000000000000000000000000000000000BC -:1014300000000000000000000000000000000000AC -:10144000000000000000000000000000000002009A -:1014500001980100000000000000000000000000F2 -:10146000000000000047656D706C7573000000009F -:1014700000000000004D50434F53000000000000EA -:10148000000000000000000000000000000000005C -:10149000000000000000000000000000000000004C +:10138000000000000000000000000000000000005D +:10139000000000000000000000000000000000004D +:1013A000000000000004000128013833B14A434F17 +:1013B000503431563233310000000D0149424D00A6 +:1013C0000000000000000000000000004A434F50F1 +:1013D00034312076322E332E310000000000000020 +:1013E00000000000000000000000000000000000FD +:1013F00000000000000000000000000000000000ED +:10140000000000000000000000000000040001884F +:1014100001000000000000000000000000000000CB +:10142000000000496E66696E656F6E000000000086 +:101430000000004D494641524520436C6173736979 +:101440006320316B0000000000000000000000007D +:10145000000000000000000000000000000000008C +:10146000000000000000000000000000000000007C +:1014700000000002000198010000000000000000D0 +:101480000000000000000000000047656D706C75F2 +:10149000730000000000000000004D50434F530057 :1014A000000000000000000000000000000000003C -:1014B0000000000000000C0100000000000000001F -:1014C000000000000000000000000000496E6E6F88 -:1014D000766973696F6E2052265400004A657765FD -:1014E0006C00000000000000000000000000000090 -:1014F00000000000000000000000000000000000EC -:1015000000000000000000000000000000000000DB -:101510000000000000000000000000000200013890 -:1015200001000000000000000000000000000000BA -:101530000000004E6F6B69610000000000000000B9 -:101540000000004D494641524520436C6173736968 -:101550006320346B202D20656D756C61746564208B -:10156000283632313220436C61737369632900007D -:10157000000000000000000000000000000000006B -:101580000000000800013801000000000000000019 -:10159000000000000000000000004E6F6B69610059 -:1015A000000000000000000000004D494641524587 -:1015B00020436C617373696320346B202D20656D4B -:1015C000756C61746564202836313331204E464392 -:1015D00029000000000000000000000000000000E2 -:1015E000000000000000000000006364696E6F707E -:1015F000737578585B0011241FBECFEFCDBFDFE3BA -:10160000DEBF00E00CBF18BE19BE1ABE1BBE11E241 -:10161000A0E0B0E2E4E5F9E900E00BBF02C007900A -:101620000D92A438B107D9F71BBE22E3A4E8B1E2BA -:1016300001C01D92A733B207E1F73BD00C94A84C30 -:1016400023C13BB78BBFFB01879196913BBF0895A8 -:101650003BB78BBFCB0142E20D94F00F3BB70B01C0 -:1016600043E20D94F00F3BB78BBFCB0145E20D94E5 -:10167000F00F3BB746E208C02091CF0127FDFCCF19 -:1016800022272093CA0108954093CA0128ED31E032 -:10169000209334003093CB016091C4017091C50157 -:1016A0008091C60199270895FC014093CA01849155 -:1016B00008950CD10E945C150E94DB15C0D21092D7 -:1016C000520684E08093420682E680938601C1E060 -:1016D000C0932606C093210686E080932206C0931D -:1016E000310602E00093320610922A0613E01093AE -:1016F000290689E5809380018AE58093810180E451 -:1017000080934106809346069091B200907F90931B -:10171000B2009091B20092609093B20090E39093E7 -:1017200041069093460680935006C0934606009368 -:1017300045061093410683E18093010821E030E0E3 -:1017400020932608309327082093280830932908EF -:1017500010928C088093800810922303109221032A -:10176000D8E0D093220381E18093200380911E2052 -:1017700090911F2080933803909339038CE38093DA -:101780008203D093800380938303D09381036DD130 -:101790000E948617BED166D6C09300021092010245 -:1017A0000093020210930402C0932002D0932102FE -:1017B000FDD718D1D2E0C1E18091030481FF24C09C -:1017C0008091010480FDFCCFD0930304B7D10E9427 -:1017D000B81750D60DD70E94DF15E091492BF09134 -:1017E0004A2B19950E946E200E942317E091582BD6 -:1017F000F091592B8781813011F4C0938C29868117 -:10180000813011F4C0938B290E948A17F2D6E0919F -:10181000472BF091482B1995E091412BF091422BE9 -:101820001995CACF292F33272230310559F023309B -:10183000310569F021303105F9F482E190E02AE8C0 -:1018400032E01EC08EE390E02CE432E019C099270C -:101850008130910541F08230910541F0892B61F48E -:10186000E8E4F2E005C0ECE1F2E002C0ECEFF1E008 -:10187000849190E09F0104C080E090E020E030E09F -:10188000FA012083318308951F920F920FB60F92B1 -:10189000112408B60F9218BEFFCF1F920F920FB6F9 -:1018A0000F92112408B60F9218BE8F939F938EB19A -:1018B0009FB180589F4F8EB99FB99F918F910F9084 -:1018C00008BE0F900FBE0F901F9018958091780062 -:1018D00083FF0AC088E08093780088ED84BF81E0B0 -:1018E000809380000D94FE008BEC809352008091D9 -:1018F00050008860809350008091510083FFFCCF9E -:1019000082EC80935500809150008061809350005C -:101910008091510084FFFCCF88ED84BF84E08093E8 -:1019200040001EB81FB881E0809343002FE730E0ED -:1019300020930A0430930B0420930C0430930D047D -:10194000809300048093020480E88093000108954E -:1019500088ED84BF81E080937900089588ED84BF8D -:101960008BE1809380000895809150008260809385 -:1019700050008091510081FFFCCF82E08093CA012A -:10198000EDE1F0E0E491E0936200ECE1F0E0E4915D -:10199000E09363001092CA0180E8809365008BEBAE -:1019A0008093660080915600897F809356008091D5 -:1019B000560084608093560080916000816080931F -:1019C00060000895E0E4F0E084818E7F8483E0E6A7 -:1019D000F0E080818E7F8083E0E5F0E080818D7F84 -:1019E0008083089587E08093A200789408950895F5 -:1019F00008950895089508950895089580E090E069 -:101A00000895089508950F931F93CF93DF931F9226 -:101A1000CDB7DEB70DE31BE2D8011296ED91FC9134 -:101A20001397898319950E94A620E091582BF09175 -:101A3000592B89818583B8E18B9FB00111246456AD -:101A40007D4F48E150E0C8010E94C045D801ED91AA -:101A5000FC911995D8011696ED91FC9117970F906E -:101A6000DF91CF911F910F91199448E150E06CE9FB -:101A700072E08DE39BE20E94C045E091582BF0910B -:101A8000592B8581C0CF0F931F93E091582BF09174 -:101A9000592B8B019C01458168E08CE593E00E9405 -:101AA000C0161F910F910895FF920F931F93CF932C -:101AB000DF931F92CDB7DEB78C019E012F5F3F4FA2 -:101AC000AC0168E08CE593E00E94D816F82E8823DC -:101AD00089F0898198DFF80140E08191882319F02D -:101AE0004F5F4F31D1F7E091552BF091562BB80154 -:101AF00081E119958F2D0F90DF91CF911F910F915B -:101B0000FF9008959B01AC0168E08CE593E00C9494 -:101B1000FF1608950C94B24508951F93CF93DF9359 -:101B2000C82FD92F162F180F1C1721F00E94B2456D -:101B30008993FACFDF91CF911F9108950E94B2450A -:101B40000E94B2450E94B2450C94B245EF92FF92BA -:101B50000F931F93CF93DF937C0161507109FA01BA -:101B60008A01020F131FDC0140E050E0E017F1078B -:101B7000F1F062307105D8F09191392F32953F70B4 -:101B80003A3010F4305D01C0395C3C939F709A305C -:101B900010F4905D01C0995C9701240F351FE90195 -:101BA00099831296625071094E5F5F4FDFCF1C928E -:101BB000CA01DF91CF911F910F91FF90EF9008958F -:101BC000CF93DF93EC01DA01E0E0F0E04C914423A5 -:101BD00091F111969C911197992339F1E617F70726 -:101BE00021F180ED840F8A3020F08FEB840F863056 -:101BF000D0F480ED890F8A3020F02FEB290F2630AA -:101C000090F4242F30E0413410F02753310922950D -:101C1000207F913410F4982F01C09753292B2993DA -:101C200031961296D3CF80E004C011968C91811129 -:101C300002C090E001C0CF01DF91CF910895E0E6AE -:101C4000F6E080E1858382E0868388E085838AE10F -:101C50008183E0EAF9E01682178280EC858388E1CF -:101C60008483E0E0F1E0128A8BE6838B148A158A84 -:101C700020EA208F99E0918F128E148E158E168E89 -:101C800084E0808B12A23CE633A314A215A210A616 -:101C900011A612A624A795A716A680A308954115FC -:101CA000510509F449C020E12093660623E0209302 -:101CB000A0092091A10927FFFCCF2091A0097093D2 -:101CC000A0092091A10927FFFCCF2091A0096093D2 -:101CD000A0092091A10927FFFCCF2091A00921E0B4 -:101CE0002093120180931C0190931D0140931401D5 -:101CF000509315011092220184E891E2809328010B -:101D00009093290140932401509325018091100163 -:101D10008068809310018091200180688093200169 -:101D20008091100187FDFCCF80E3809311018093A7 -:101D3000210180E18093650608954115510509F45C -:101D400069C020E12093660626E02093A009209137 -:101D5000A10927FFFCCF2091A00920E1209365066F -:101D6000000000002093660622E02093A009209145 -:101D7000A10927FFFCCF2091A0097093A009209111 -:101D8000A10927FFFCCF2091A0096093A009209111 -:101D9000A10927FFFCCF2091A0091092120124E88D -:101DA00031E220931C0130931D01409314015093A4 -:101DB000150120E1209322018093280190932901AD -:101DC00040932401509325018091100180688093F5 -:101DD0001001809120018068809320018091100182 -:101DE00087FDFCCF80E3809311018093210180E186 -:101DF00080936506E091582BF091592B87818630AE -:101E000019F481E180938C298681863019F481E16F -:101E100080938B290895CF92DF92EF92FF92CF9318 -:101E2000DF93C090572BD12CE12CF12C8DE0CC0C02 -:101E3000DD1CEE1CFF1C8A95D1F7C114D10481E092 -:101E4000E806F10408F04EC080E18093660686E063 -:101E50008093A0098091A10987FFFCCF8091A00900 -:101E600080E180936506000000008093660682E0B2 -:101E70008093A0098091A10987FFFCCF8091A009E0 -:101E80001092A0098091A10987FFFCCF8091A00941 -:101E90001092A0098091A10987FFFCCF8FEFE81A6B -:101EA000F80A8091A009C0E0D0E1C701B601C9DB02 -:101EB0008093A0098091A10987FFFCCF8091A009A0 -:101EC0009093A0098091A10987FFFCCF8091A00980 -:101ED00082E0C80ED11CE11CF11C219731F780E192 -:101EE00080936506DF91CF91FF90EF90DF90CF90C8 -:101EF0000895CF92DF92EF92FF92CF93DF93C0903D -:101F0000572BD12CE12CF12C8DE0CC0CDD1CEE1CE0 -:101F1000FF1C8A95D1F7C114D10481E0E806F104D1 -:101F200038F0DF91CF91FF90EF90DF90CF9073CF9B -:101F30008FEFE81AF80AC1E2D0E0219791F39CDB19 -:101F4000C701B60185DB98DB8FEFD81AE80AF80ADB -:101F5000F4CFCF92DF92EF92FF920F931F93CF9324 -:101F6000DF93C090572BD12CE12CF12C8DE0CC0CC1 -:101F7000DD1CEE1CFF1C8A95D1F7C114D10481E051 -:101F8000E806F10408F04FC080E18093660683E024 -:101F90008093A0098091A10987FFFCCF8091A009BF -:101FA0001092A0098091A10987FFFCCF8091A00920 -:101FB0001092A0098091A10987FFFCCF8FEFE81A4A -:101FC000F80A8091A009C1E2D0E0219749F154DBE1 -:101FD00050DB52DB00E010E01092A0098091A109D3 -:101FE00087FFFCCF6091A00970E01092A00980915A -:101FF000A10987FFFCCF8091A009782BC8012EDBB7 -:102000003BDB0E5F1F4F011581E0180729F7C70161 -:10201000B60129DB31DB8FEFD81AE80AF80AD5CFF1 -:1020200080E180936506E091582BF091592B8781D0 -:10203000863019F490E190938C299681963049F47A -:1020400020E120938B29853059F483E180938C29FA -:1020500002C08530D1F3953019F483E180938B2948 -:10206000DF91CF911F910F91FF90EF90DF90CF9074 -:102070000895CF92DF92EF92FF920F931F93411535 -:10208000E0E25E076105710508F06BC06901E12CB3 -:10209000F12C00E010E220E030E0041B150B260BD1 -:1020A000370BC016D106E206F30610F4970186013D -:1020B00020E12093660626E02093A0092091A10943 -:1020C00027FFFCCF2091A00920E1209365060000A6 -:1020D00000002093660622E02093A0092091A10928 -:1020E00027FFFCCF2091A0095093A0092091A109BE -:1020F00027FFFCCF2091A0094093A0092091A109BE -:1021000027FFFCCF2091A0091092120124E831E2B0 -:1021100020931C0130931D010093140110931501AD -:1021200020E12093220180932801909329010093BC -:102130002401109325018091100180688093100183 -:10214000809120018068809320018091100187FD9B -:10215000FCCF80E3809311018093210180E1809383 -:10216000650681E01F910F91FF90EF90DF90CF9077 -:102170000895CF92DF92EF92FF920F931F93411534 -:10218000E0E25E076105710508F05DC06901E12CC0 -:10219000F12C00E010E220E030E0041B150B260BD0 -:1021A000370BC016D106E206F30610F4970186013C -:1021B00020E12093660623E02093A0092091A10945 -:1021C00027FFFCCF2091A0095093A0092091A109DD -:1021D00027FFFCCF2091A0094093A0092091A109DD -:1021E00027FFFCCF2091A00921E0209312018093CA -:1021F0001C0190931D01009314011093150110927E -:10220000220184E891E280932801909329010093B0 -:1022100024011093250180911001806880931001A2 -:10222000809120018068809320018091100187FDBA -:10223000FCCF80E3809311018093210180E18093A2 -:10224000650681E001C080E01F910F91FF90EF9043 -:10225000DF90CF9008951F93CF93DF93CDB7DEB774 -:10226000A097CDBFDEBF853009F4AEC078F48230D0 -:1022700081F128F4813009F0EEC010E01BC08330FA -:1022800009F453C0843009F475C0E5C0883009F4FE -:10229000D3C040F4863009F4CDC0873009F0DBC0EC -:1022A00058DED9C0893009F4C9C08A3009F0D3C0DA -:1022B0000BD3D1C08091532B181708F0A8C02ADC8B -:1022C000E1E0F0E0EC0FFD1FE10FF11D80831F5FE7 -:1022D000F1CF11E08091532B873009F010E0E091AD -:1022E0004D2BF0914E2BCE01019619954091532B19 -:1022F00031E0141708F08BC03323A9F0812F90E050 -:10230000E1E0F0E0EC0FFD1FE80FF91F208131E064 -:102310002F3F09F030E0E1E0F0E0EC0FFD1FE80FA7 -:10232000F91F2F5F20831F5FE4CFE0914D2BF091C9 -:102330004E2BCE01019619958091532B41E081508F -:1023400008F465C04423D9F3282F30E0E1E0F0E041 -:10235000EC0FFD1FE20FF31F908141E09F3F09F05A -:1023600040E0E1E0F0E0EC0FFD1FE20FF31F9F5FA4 -:102370009083E5CF11E08091532B873009F010E076 -:10238000E0914D2BF0914E2BCE0101961995409185 -:10239000532B31E01417D8F53323A1F0812F90E0AF -:1023A000E1E0F0E0EC0FFD1FE80FF91F208131E0C4 -:1023B000211130E0E1E0F0E0EC0FFD1FE80FF91F24 -:1023C000215020831F5FE6CFE0914D2BF0914E2BE3 -:1023D000CE01019619958091532B41E08150B8F0C0 -:1023E0004423E1F3282F30E0E1E0F0E0EC0FFD1FA3 -:1023F000E20FF31F908141E0911140E0E1E0F0E055 -:10240000EC0FFD1FE20FF31F91509083E7CFE09197 -:102410004F2BF091502BCE0101961995E091552B41 -:10242000F091562B4091532BBE016F5F7F4F83E19C -:10243000199511C08AD30FC0EEDC0DC08091000841 -:10244000813021F480918C08833019F00E94322170 -:1024500002C00E945121A096CDBFDEBFDF91CF9177 -:102460001F910895E0E0F6E080E6828388E1868BA4 -:10247000858B0895CF93C0910806C095C6FF12C002 -:10248000809186218A3050F08A30E1F4E091582B17 -:10249000F091592B8181DFDE809186218F5F8093BF -:1024A000862110C08C2F807669F48091862181501E -:1024B0008A3030F4E091582BF091592B8081CBDE9B -:1024C00010928621C5FF12C0809185218A3050F07C -:1024D0008A30D9F4E091582BF091592B8381BBDEDF -:1024E000809185218F5F809385210FC0C07669F42C -:1024F0008091852181508A3030F4E091582BF09101 -:10250000592B8281A8DE10928521CF9108959B01DD -:10251000AC016BE084E696E072C420E030E090E02D -:10252000F901E80FF91FE95AF44D6383265F3F4F25 -:1025300020353105A9F708950F931F939B01E09172 -:10254000582BF091592BE80FF11D8A0140816BE067 -:1025500084E696E015D41F910F9108950F931F9371 -:10256000CF93DF931F92CDB7DEB7082FAB019E014B -:102570002F5F3F4F6BE084E696E01AD4182F882334 -:1025800019F06981802FC9DF812F0F90DF91CF91E2 -:102590001F910F9108950895EF92FF920F931F934B -:1025A000CF937B01C42F2EB13FB10091080410914D -:1025B0000904022B132B682F83E090E20E94C6438C -:1025C0006C2F83E090E20E94C643612F83E090E28B -:1025D0000E94C643602F83E090E20E94C6436C2FA6 -:1025E00070E0C701CF911F910F91FF90EF9088C4C9 -:1025F000089508953F924F925F926F927F928F92CB -:102600009F92AF92BF92CF92DF92EF92FF920F9381 -:102610001F93CF93DF937C01E9012091002030913B -:102620000120C90198532C01612C712C44155505CA -:102630006605770508F05AC04A015B018C0E9D1EA5 -:10264000A11CB11C84149504A604B70448F0841B93 -:10265000950B8E01081B190BEC013324339403C036 -:1026600000E010E0312C690180E4D81A4601A12C69 -:10267000B12C481559056A057B0508F5CA01905C1F -:102680002A013B014C0E5D1E611C711C481459044B -:102690006A047B0428F4AE01BC01C70100DB18C04A -:1026A000C41AD50AA601BC01C701F9DAAE014C195A -:1026B0005D096BE871E2C7018C0D9D1D07C0421BCF -:1026C000530BBA0165577E4DAE01C7010E94EE451E -:1026D000311002C081E00BC001501109D8F3F8019C -:1026E000EC0FFD1FEE0DFF1D1082F6CF80E0DF9195 -:1026F000CF911F910F91FF90EF90DF90CF90BF90FF -:10270000AF909F908F907F906F905F904F903F9091 -:102710000895EBE8F1E2119289E2EB38F807D9F776 -:102720008BE891E28093892190938A2180E098E060 -:10273000809387219093882180E090E4809300200B -:1027400090930120E091582BF091592B87818A308A -:1027500019F480E180938C2986818A3019F480E114 -:1027600080938B29089580918721909188210895E5 -:1027700020E030E0F901E95AF44D8783265F3F4FAE -:1027800020353105B9F7813039F018F0823039F051 -:1027900008958BEC92E105C08DED93E102C08CECC5 -:1027A00092E18093552B9093562B0895B2DFE091E0 -:1027B000582BF091592B8481DBCF0F931F93CF932C -:1027C000DF93AEB1BFB1C0910804D091090420914C -:1027D000872130918821E42FF0E08F010C5F1F4F9B -:1027E0002017310758F1CA2BDB2B245031092E1B3F -:1027F0003F0B2093872130938821A0918921B091AC -:102800008A218C9311964C9311971296DC93129710 -:10281000CD0104968093892190938A211396CC93BD -:10282000DB01EC01415018F02D912993FBCFE80F0B -:10283000F91FE0938921F0938A2112C080E098DF8C -:10284000E091582BF091592B87818A3019F481E15E -:1028500080938C2986818A3019F481E180938B29B9 -:10286000DF91CF911F910F9108951F93CF93DF9325 -:102870001F92CDB7DEB79E012F5F3F4FAC0163E0E3 -:102880008FEC97E095D2182F882311F0898170DFA3 -:10289000812F0F90DF91CF911F9108950F931F9378 -:1028A000E091582BF091592B8B019C01448163E0FE -:1028B0008FEC97E065D21F910F9108959B01AC01B9 -:1028C00063E08FEC97E09BC2CF93DF9380918721E9 -:1028D00090918821811528E0920710F560910020E1 -:1028E0007091012040E058E0481B590B80E090E8CF -:1028F000861B970B8417950798F08BE891E21DDAF9 -:10290000C0910020D0910120D85F809187219091C3 -:102910008821C81BD90BFDDEC0930020D093012075 -:10292000DF91CF9108958091CF0187FDFCCF08956D -:10293000FADF8091CF0181FF0BC086E38093CA014B -:10294000EBECF1E021E030E088ED90E084BF208303 -:102950000895EF92FF920F931F93CF93DF931F92EF -:102960001F92CDB7DEB77C018A011092C201698344 -:102970007A83D9DF6981A62F7A81B72FC701800FAB -:10298000911F26E048ED50E061E070E0EBECF1E0F3 -:10299000E816F90689F0E092C0013F2D3F713093AF -:1029A000C1012093CA0144BF60833091C4013D93AB -:1029B0003FEFE31AF30AECCFC8010F900F90DF91BD -:1029C000CF911F910F91FF90EF9008952F923F921A -:1029D0004F925F926F927F928F929F92AF92BF922F -:1029E000CF92DF92EF92FF920F931F93CF93DF93DB -:1029F00000D0CDB7DEB76A01282F2F711C01221A33 -:102A0000310829836A837B8393DF8DDF83E380939F -:102A1000CA011092C1011092C2016A81E62E7B8127 -:102A2000F72E860185E3582E98ED892E912C662489 -:102A30006394712C3BECA32EBB24B39443E3442E4C -:102A400029810115110509F12093C001F701819138 -:102A50007F018093C4010150110919F02F5F2032CA -:102A600081F72092C001832D8F718093C101509214 -:102A7000CA01C401F50184BF608290E2290E311CB5 -:102A800052DF4092CA0120E0DCCFC6012396CDBFC1 -:102A9000DEBFDF91CF911F910F91FF90EF90DF90FC -:102AA000CF90BF90AF909F908F907F906F905F90EE -:102AB0004F903F902F90089543E550E067E57BE20B -:102AC00080E090E046CF43E550E067E57BE280E0C0 -:102AD00090E07CCFCF93DF93CFEFC80FC83078F56D -:102AE000D82F0E94A62035DAC093572B8AE0C89FC2 -:102AF00090011124C901865A944D8093582B9093CC -:102B0000592BF901E95AF44D80850E94030DE0919B -:102B1000582BF091592B84812BDE7DD98FE18D0FBD -:102B2000E091582BF091592B9781943011F48093B8 -:102B30008C299681943029F480938B2902C080E0FF -:102B400001C081E0DF91CF9108958091572B99E0EA -:102B50004AE0915099F0282F30E02F5F3F4F2770C7 -:102B60003327822F429FF001439FF00D1124E95A31 -:102B7000F44D2085222369F38F5FACCF0895FC01CB -:102B80009091572B9F5C908311820895CF93FC0105 -:102B9000C081818181110CC0BF01E091552BF09162 -:102BA000562B41E082E1199580ED8C0FCF9192CFA9 -:102BB00080E0CF91089588E1809301060895809187 -:102BC0008B29823191F030F48031B9F050F48823B0 -:102BD000A9F132C0833169F090EE980F983088F0F7 -:102BE0002BC088E08093050627C088E08093070605 -:102BF00023C08091040683FF12C088E080930606FC -:102C00001BC090918D299F5F923019F090938D2970 -:102C100015C010928D299091040693FD04C088E0A0 -:102C2000809305060BC098E090930606803221F051 -:102C3000815080938B2902C010928B2980918C291E -:102C4000823191F030F48031C1F050F48823A9F141 -:102C500032C0833169F090EE980F983088F02BC025 -:102C600080E18093050627C080E18093070623C09A -:102C70008091040684FF12C080E1809306061BC089 -:102C800090918E299F5F923019F090938E2908952C -:102C900010928E299091040694FD04C080E18093E7 -:102CA0000506089590E190930606803221F0815048 -:102CB00080938C29089510928C2908959B01AC0172 -:102CC0006BE082E398E09BC020E030E0982F9071A9 -:102CD0008870992321F0F901E95AF44D628788231D -:102CE00021F0F901E95AF44D6187265F3F4F203505 -:102CF000310579F7992329F090E190930606109217 -:102D00008C29882329F088E08093060610928B296D -:102D100008950F931F939B018A01803131F4E09154 -:102D2000582BF091592B478107C0883049F4E09126 -:102D3000582BF091592B46816BE082E398E020D02C -:102D40001F910F9108950F931F93CF93DF931F92BD -:102D5000CDB7DEB7082FAB019E012F5F3F4F6BE071 -:102D600082E398E025D0182F882319F06981802FFD -:102D7000ABDF812F0F90DF91CF911F910F910895BD -:102D80000F931F93FC01662379F094916150941383 -:102D900009C0BF016F5F7F4FA801C9010E94D245E2 -:102DA00081E003C0B196EFCF80E01F910F910895AD -:102DB000CF92DF92EF92FF921F93CF93DF93EC01BC -:102DC0007A016901162F112389F0BE016F5F7F4FD1 -:102DD000C7010E94C9451150892B31F4FE01C491ED -:102DE000F601C08381E003C0A196EDCF80E0DF91C2 -:102DF000CF911F91FF90EF90DF90CF900895CF93E8 -:102E00000196CCE26623C9F0FC01DA01AD017491B0 -:102E1000772341F021153105A1F07D9331962150A2 -:102E20003109F4CF623030F02115310551F04F5F98 -:102E30005F4FCC9361508196E5CF232B11F0FA01BF -:102E40001082CF91089580912002806880932002A3 -:102E50008091230280FFFCCF81E080932302A09128 -:102E60001002B0911102AE5BB109B7FF02C0A0E041 -:102E7000B0E020E038EB4BE050E00E944C45E091A0 -:102E8000582BF091592B61157105844F9140A8F48E -:102E90008781873019F480E180938C29868187307F -:102EA00019F480E180938B298091532B882389F03A -:102EB000E091452BF091462B19948781873019F4C6 -:102EC00081E180938C298681873019F481E1809398 -:102ED0008B290895BC0183E090E20C947843CF9352 -:102EE000DF93FC016491EC012196662331F083E0CD -:102EF00090E20E94C643CE01F4CFDF91CF910895B6 -:102F0000AB01BC0183E090E20C94A24380E2809389 -:102F100062060895CF93DF9380918F29823029F53F -:102F200083E090E20E942B440E94FA3E83E090E20C -:102F30000E944744EC0197FD18C0E091582BF09196 -:102F4000592B8781833019F483E180938C29868102 -:102F5000833019F483E180938B298C2F19D681114A -:102F600004C08C2FDF91CF91B7C7DF91CF91089527 -:102F700080918F29813079F028F08230D9F0833028 -:102F800011F12EC08091680685FF2AC08FE08093E2 -:102F9000022081E00CC080910220815080930220A9 -:102FA00081111EC00E94B40C0E94A54282E0809351 -:102FB0008F2916C08091680685FD12C08FE080932E -:102FC000022083E0F4CF8091022081508093022080 -:102FD000811106C00E946A420E94E20C10928F2961 -:102FE00080918F29823019F423D70C946E20089594 -:102FF000E091582BF091592B8781823019F481E1AF -:1030000080938C298681823019F481E180938B2909 -:103010000895E091582BF091592B8781823019F453 -:1030200080E180938C298681823019F480E180933D -:103030008B29089583E090E20C94534383E090E25F -:103040000C949A442EE03BE03F932F9328E03BE022 -:103050003F932F9321E03BE03F932F932AEF3AE0F9 -:103060003F932F932AE53AE03F932F9322E02F934B -:103070001F929F938F930E9457468DB79EB70E96CF -:103080008DBF9EBF85E6089560E072E00E94430D0B -:1030900085E60895FB0120812F3349F42181211118 -:1030A00006C060E072E00E94820D85E60895CB01C3 -:1030B0000E94540D882319F006DD84E608958AECF9 -:1030C0000895EF92FF920F931F93CF93DF93CDB7A5 -:1030D000DEB7A097CDBFDEBF7C010091532B10E07F -:1030E0000115110591F482E59AE09F938F9382E098 -:1030F0008F931F92FF92EF920E9457460F900F906E -:103100000F900F900F900F9010C0E0914D2BF09109 -:103110004E2BCE01019619959801AE014F5F5F4F7E -:1031200060E072E0C7010E94A60D85E6A096CDBFC3 -:10313000DEBFDF91CF911F910F91FF90EF90089527 -:10314000DF92EF92FF920F931F93CF93DF93CDB750 -:10315000DEB7A097CDBFDEBF7B010091532B10E0FF -:103160006BE47AE0C7010E94C945892B29F5D12C6F -:10317000ED2CF12CE016F10658F40E948A0DE1E0E6 -:10318000F0E0EC0FFD1FEE0DFF1D8083D394F0CF18 -:10319000E0914F2BF091502BCE0101961995E091C3 -:1031A000552BF091562B4091532BBE016F5F7F4FF3 -:1031B00083E1199584E60BC0A70160E270E0CE01BF -:1031C00001960E94E00D8017910711F38AECA096FA -:1031D000CDBFDEBFDF91CF911F910F91FF90EF9098 -:1031E000DF900895FC018091542B882311F081E336 -:1031F00001C080E38083118285E60895FB0121816F -:10320000211127C02081213321F481E08093542BA8 -:1032100004C0203321F41092542B84E608952F33F8 -:10322000C1F41F9220E32F931F9221E32F9325E4F3 -:103230003AE03F932F9322E02F931F929F938F9317 -:103240000E9457468DB79EB70A968DBF9EBF85E6F2 -:1032500008958AEC089589E390E169D48EE6089593 -:1032600089EB90E17FD48EE60895E0ECF4E0818173 -:103270008E7F81830E946A420E94A80C84E6089592 -:10328000E0ECF4E081818E7F81830E946A420E949B -:10329000AE0C84E60895EDE3FBE225892F932489A3 -:1032A0002F9322E43AE03F932F9322E02F931F9233 -:1032B0009F938F930E9457468DB79EB708968DBFF8 -:1032C0009EBF85E608952091532B1F922F932FE3E5 -:1032D0003AE03F932F9322E02F931F929F938F9377 -:1032E0000E9457468DB79EB708968DBF9EBF85E654 -:1032F000089540E052E0BC0180E01ED985E60895C3 -:10330000FB0120812F3341F42181211105C060E0B0 -:1033100072E0FDD885E6089580E020D9882319F071 -:10332000D2DB84E608958AEC089540E052E0BC01C7 -:1033300081E002D985E60895FB0120812F3341F415 -:103340002181211105C060E072E0E1D885E6089591 -:1033500081E004D9882319F0B6DB84E608958AEC6D -:10336000089540E052E0BC0182E0E6D885E6089589 -:10337000FB0120812F3341F42181211105C060E040 -:1033800072E0C5D885E6089582E0E8D8882319F070 -:103390009ADB84E608958AEC089540E052E0BC018F -:1033A00083E0CAD885E60895FB0120812F3341F4DC -:1033B0002181211105C060E072E0A9D885E6089559 -:1033C00083E0CCD8882319F07EDB84E608958AEC6C -:1033D000089540E052E0BC0180E19BDC85E6089561 -:1033E000FB0120812F3341F42181211105C060E0D0 -:1033F00072E064DC85E6089580E1A5DC882319F09D -:1034000062DB84E608958AEC089540E052E0BC0156 -:1034100088E07FDC85E60895FB0120812F3341F4AD -:103420002181211105C060E072E048DC85E6089545 -:1034300088E089DC882319F046DB84E608958AEC6D -:10344000089560E072E02ADA85E60895FB012081A4 -:103450002F3341F42181211105C060E072E02EDAA2 -:1034600085E60895CB0101DA882319F02CDB84E688 -:1034700008958AEC0895CF93DF93EC0174D99F935C -:103480008F932CE33AE03F932F9382E08F931F9228 -:10349000DF93CF930E9457468DB79EB708968DBF96 -:1034A0009EBF85E6DF91CF9108958AEF92E15AD3CE -:1034B0008EE6089509DA84E608952BD984E6089506 -:1034C00060E072E05CDB85E60895CB015FDB88237A -:1034D00019F0F9DA84E608958AEC08950E94790FCC -:1034E00084E608950E94A90F84E608950E940B0FB8 -:1034F00084E608958091680680FD02C089E70895FA -:1035000088E70895DF92EF92FF920F931F93CF9376 -:10351000DF93EC010FEF11E081E5E82E8CE0F82E4F -:103520009CE2D92EB7018EE691E20E94C945892B13 -:10353000D1F001151105B9F0DE01F7012491ED017B -:103540002196C8010197222341F00130110529F08D -:103550002C93DE0131968C01F1CFDC928C0188E155 -:10356000E80EF11CDFCF2197188285E6DF91CF911D -:103570001F910F91FF90EF90DF900895FC01209133 -:1035800020022068209320028091230280FFFCCF3C -:1035900081E080932302A0911002B0911102AE5BF2 -:1035A000B109B7FF02C0A0E0B0E020E038EB4BE08B -:1035B00050E00E944C45AA27BB279F938F9325E399 -:1035C0003AE03F932F9382E08F931F92FF93EF9304 -:1035D0000E9457468DB79EB708968DBF9EBF85E661 -:1035E00008952EB13FB14091080450910904242B55 -:1035F000352B3F932F932FE23AE03F932F9322E016 -:103600002F931F929F938F930E9457468DB79EB71B -:1036100008968DBF9EBF85E608950F931F93CF93A5 -:10362000DF931F921F92CDB7DEB78B01E091582B2D -:10363000F091592B8581873009F06FC0E091452BBF -:10364000F091462B199581E08093D92960E270E0D2 -:10365000C8010E940F460097F9F4F801019000207C -:10366000E9F73197E01BF10BE0FD59C0F695E795BE -:10367000E130F10539F487E090E080933B2B9093A3 -:103680003C2B37C053E0EE0FFF1F5A95E1F7E09354 -:103690003B2BF0933C2B2DC098012C5F3F4F8217A2 -:1036A0009307E9F5A80162E070E0CE0101960E945F -:1036B000E00D898190E0982F88272A81820F911D43 -:1036C00080933B2B90933C2B0B5F1F4FF801019095 -:1036D0000020E9F73197E01BF10BE0FD20C0F695E3 -:1036E000E79533E0EE0FFF1F3A95E1F7E817F9078A -:1036F000B0F060913B2B70913C2B695F7F4F83E072 -:10370000769567958A95E1F7A8018BE39AE20E9486 -:10371000E00D0E9488288FEF03C089EC01C08AEC7D -:103720000F900F90DF91CF911F910F910895EF921D -:10373000FF920F931F93CF93DF931F921F92CDB7EA -:10374000DEB78B01E091582BF091592B85818730A2 -:1037500009F080C0E091452BF091462B199582E04D -:103760008093D92960E270E0C8010E940F467C0175 -:10377000892B31F5F80101900020E9F73197E01B22 -:10378000F10BE0FD69C0F695E795E130F10539F4FC -:1037900087E090E080933B2B90933C2B47C063E005 -:1037A000EE0FFF1F6A95E1F7CF0169E070E00E941C -:1037B0003845E81BF90BE0933B2BF0933C2B36C0CC -:1037C000C8010496E816F90609F046C0A80162E0AF -:1037D00070E0CE0101960E94E00D298130E0322F89 -:1037E00022278A81280F311D20933B2B30933C2BBD -:1037F0002730310529F0C90187709927892B61F598 -:1038000087010F5F1F4FF80101900020E9F7319702 -:10381000E01BF10BE0FD20C0F695E79543E0EE0FCD -:10382000FF1F4A95E1F7E217F307B0F060913B2BD9 -:1038300070913C2B695F7F4F83E0769567958A9501 -:10384000E1F7A8018BE39AE20E94E00D0E9488282C -:103850008FEF03C089EC01C08AEC0F900F90DF91CD -:10386000CF911F910F91FF90EF900895E091582B09 -:10387000F091592B85818730A1F4E091452BF0918F -:10388000462B199584E08093D9290E944D350E94DA -:10389000882887E595E380939F299093A0298FEF4F -:1038A000089589EC0895E091582BF091592B85816A -:1038B0008730A1F4E091452BF091462B199583E0D8 -:1038C0008093D9290E944D350E94882887E595E389 -:1038D00080939F299093A0298FEF089589EC0895F4 -:1038E000E091582BF091592B85818730A1F4E0911C -:1038F000452BF091462B199585E08093D9290E949C -:103900004D350E94882887E595E380939F29909301 -:10391000A0298FEF089589EC0895E091582BF0913C -:10392000592B4085518564E6649F9001659F300D59 -:1039300011243F932F9329E23AE03F932F9322E003 -:103940002F931F929F938F930E9457468DB79EB7D8 -:1039500008968DBF9EBF85E60895CF93DF931F9293 -:103960001F92CDB7DEB7FB0120812F33B1F4218147 -:10397000211113C027EF39E03F932F9322E02F93BB -:103980001F929F938F930E9457460F900F900F9016 -:103990000F900F900F9085E627C089E592E089830C -:1039A0009A83CE0101969F938F938EEB90E29F9323 -:1039B0008F937F936F930E948D460F900F900F907F -:1039C0000F900F900F90892B71F089819A81893522 -:1039D000F2E09F0740F4E091582BF091592B80873B -:1039E000918784E601C08AEC0F900F90DF91CF9110 -:1039F000089520911F202F9320911E202F9324EFB4 -:103A000039E03F932F9322E02F931F929F938F9340 -:103A10000E9457468DB79EB708968DBF9EBF85E61C -:103A20000895CF93DF931F921F92CDB7DEB7FB01AE -:103A300020812F33B1F42181211113C02FE02F9366 -:103A40002FEF2F9323EA39E03F932F9322E02F9318 -:103A50001F929F938F930E945746CDBFDEBF85E68E -:103A600027C019821A82CE0101969F938F938EEB05 -:103A700090E29F938F937F936F930E948D460F9058 -:103A80000F900F900F900F900F90892B81F08981EC -:103A90009A818115E0E19E0750F48093380390935A -:103AA000390380931E2090931F2084E601C08AEC86 -:103AB0000F900F90DF91CF910895FB0120812F335C -:103AC000D9F42181211121C01F9220E32F931F924D -:103AD00021E32F932DE939E03F932F9322E02F9399 -:103AE0001F929F938F930E9457468DB79EB70A9659 -:103AF0008DBF9EBF85E60895213311F4B3D303C073 -:103B0000203319F4CED384E608958AEC0895FC019D -:103B100080910008813021F480918C08833011F06D -:103B200080E301C081E38083118285E6089521E06E -:103B300020939E2920939D292CE320939A2925E008 -:103B400030E020939829309399291092922910926D -:103B500093291092942910929529809390299093FB -:103B60009129089527E020939E292CE231E02093AB -:103B700098293093992910929229109293291092A2 -:103B800094291092952980939029909391290895D2 -:103B9000CF9390919E299530E1F130F4933029F143 -:103BA00040F5913068F440C1973009F4A7C008F49B -:103BB00045C0983009F4AAC0993009F432C134C123 -:103BC000813041F4109296291092972910929B29E6 -:103BD00083E0FBC0843011F466E08BC0883109F4C7 -:103BE00020C18B3109F0F3C01CC180939C2984E073 -:103BF000ECC090E040919C292FEF30E0241B31096C -:103C00008217930721F485E0E0C0981739F165E148 -:103C100069C02091962930919729A9014F5F5F4F84 -:103C20004093962950939729F901E655F44D8083E6 -:103C30004038510509F0CBC086E0C7C020919C29CF -:103C400090919D29291346C0EAEAFBE290E02CE21C -:103C5000EA32F207D1F22191920FF9CF40919229E5 -:103C6000509193296091942970919529E091902920 -:103C7000F091912920E830E08AEA9BE21995C82F5B -:103C8000882311F180919D298F5F80939D298091D8 -:103C9000922990919329A0919429B09195298058C7 -:103CA0009F4FAF4FBF4F8093922990939329A0933A -:103CB0009429B093952966E083E090E20E94C64380 -:103CC00082E080939E29B1C068E183E090E20E9487 -:103CD000C6430EC030E0892F90E0019728173907BE -:103CE00039F466E083E090E20E94C64382E06DC052 -:103CF00068E183E090E20E94C64393C0853119F4E5 -:103D000010929D2909C08B3109F48BC0883109F4C8 -:103D100063CF863009F05DC080919D298F5F8093CD -:103D20009D294091922950919329609194297091F5 -:103D30009529E0919029F091912920E830E08AEAD4 -:103D40009BE21995C82F8823D1F161E083E090E2CE -:103D50000E94C64360919D2983E090E20E94C64381 -:103D600060919D29609583E090E20E94C64360E8DF -:103D700070E08AEA9BE2C4D8EAEAFBE260E08CE207 -:103D8000EA32F80719F08191680FF9CF83E090E2E9 -:103D90000E94C6438091922990919329A0919429E1 -:103DA000B091952980589F4FAF4FBF4F8093922974 -:103DB00090939329A0939429B093952936C064E0F9 -:103DC00083E090E20E94C64389E080939E29C1E08F -:103DD0002CC08531E1F761E083E090E20E94C643A8 -:103DE00060919D2983E090E20E94C64360919D29E5 -:103DF000609583E090E20E94C64360E870E08AEA42 -:103E00009BE27ED8EAEAFBE260E02CE2EA32F207CB -:103E100019F08191680FF9CF83E090E20E94C643C8 -:103E2000D6CF10929E29D3CFC0E08C2FCF9108958A -:103E300080919E29813019F0873029F10895809171 -:103E40009829909199299C01215031092093982912 -:103E500030939929892B31F580919A299FEF980FFA -:103E600090939A29882331F065E183E090E20E94E3 -:103E7000C64302C010929E2985E090E08093982965 -:103E800090939929089580919829909199299C015E -:103E9000215031092093982930939929892B11F4C5 -:103EA00010929E290895E8E2FBE020E030E0949132 -:103EB000981309C041E2429FC001439F900D112415 -:103EC000875D944F08952F5F3F4FB196293031059C -:103ED00071F780E090E00895CF92DF92EF92FF9229 -:103EE0000F931F93CF93982F9F7D91549A3160F039 -:103EF00090ED980F9A3040F08F3531F0982F9D7FDC -:103F00009D3311F08032D1F49FE9980F9A3108F473 -:103F100080522091A4293091A5292F3F91E03907A3 -:103F200008F0D3C0A9014F5F5F4F4093A42950937D -:103F3000A529F901E655F44D8083C7C08D3009F0FD -:103F400095C0E091A429F091A529E655F44D108281 -:103F50001092A4291092A5298091A3298111B5C09E -:103F60008091AA2B982F9F7D09F495C08D7F8D336A -:103F700009F491C0EAEAFBE27F01C191CC2331F060 -:103F8000CF3321F0CD3311F0C032B1F7F7011082F9 -:103F900081E5C82E8CE0D82E00E010E0B6018AEA58 -:103FA0009BE20E94C945892B09F056C01092AA2BAA -:103FB000CF3349F488E1809FF001819FF00D1124F7 -:103FC000E959F34F18C0B7016F5F7F4FCD3349F404 -:103FD00088E1809FF001819FF00D1124EB59F34F90 -:103FE00020C0C11113C088E1809FF001819FF00DB6 -:103FF0001124EF59F34F259134912115310509F41E -:104000004DC08AEA9BE2F901199514C0C03209F04B -:1040100045C088E1809FF001819FF00D1124ED598A -:10402000F34F2591349121153105C1F18AEA9BE2C4 -:10403000F90119958F3F99F581E08093A3298EB1FD -:104040009FB12091080430910904822B932B809317 -:10405000A1299093A22939C00F5F1F4FF8E1CF0E1D -:10406000D11C0632110509F099CF15C0883061F4D2 -:104070008091A4299091A529009739F10197809307 -:10408000A4299093A52921C08B31F9F41092A42979 -:104090001092A5291AC088ECC0E002C089ECC1E0EA -:1040A00002DF0E946F1785E29BE00E946F17CC230E -:1040B00061F08091AA2B882341F08AEA9BE20E945A -:1040C0006A1782E29BE00E946F1781E0CF911F91F7 -:1040D0000F91FF90EF90DF90CF9008958091A329EA -:1040E000882399F1E091582BF091592B2085318547 -:1040F0002115310551F18EB19FB1409108045091C5 -:104100000904842B952B4091A1295091A229841B4D -:10411000950B64E670E00E94384562177307A8F0BB -:104120001092A3298BECBFDE0E946F178FE19BE0FA -:104130000E946F17E0919F29F091A029309729F0F4 -:10414000199510929F291092A02908958091A32972 -:104150008823A9F01092A3298BECA5DE0E946F178B -:104160008FE19BE00E946F17E0919F29F091A029B9 -:10417000309729F0199510929F291092A02908953F -:10418000CF93DF939091A3299923A9F0EB0110928B -:10419000A32989DE0E946F178CE19BE00E946F17B4 -:1041A000209749F0CE010E946A1789E19BE0DF91D8 -:1041B000CF910C946F17DF91CF910895EF92FF92FA -:1041C0000F931F93CF937C019B01613081E07807AF -:1041D00010F020E031E08B01021B130BA70160E01F -:1041E00072E08AEA9BE20E94A60D8AEA9BE20E94A4 -:1041F0006A17C1E0013081E01807B0F01A956C2F02 -:1042000070E0762F6627A701460F571F20E032E0A7 -:1042100060E072E08AEA9BE20E94A60D8AEA9BE2D5 -:104220000E946A17CF5FE6CF0115110591F0EC2FC0 -:10423000F0E0FE2FEE27A7014E0F5F1F980160E010 -:1042400072E08AEA9BE20E94A60D8AEA9BE20E9443 -:104250006A1786E19BE0CF911F910F91FF90EF903D -:104260000C946F1780910008813021F480918C08A4 -:104270008330B1F081E08093000893E090938C0844 -:104280008093A6291092A7298EB19FB1209108048E -:1042900030910904822B932B8093A8299093A9290C -:1042A000089510928C0810920008E6EAF9E2108254 -:1042B000118208959091A6299923F1F08091A72960 -:1042C000811115C02091A6292223B9F02EB13FB14A -:1042D0004091080450910904242B352B4091A829C2 -:1042E0005091A929241B350B2634310530F081E08B -:1042F0008093A729892F089581E00895A0E2B6E070 -:1043000081E015968C9315972AEA3DE228B939B9D0 -:104310002AE23EE22AB93BB910B813B812B816B86F -:1043200017B811B8E0E0F9E010A211A22FEF30E0C9 -:1043300026A337A32FEF3FEF20A731A7808388E87C -:10434000838380E1848783E087831C968C931C970A -:1043500082E01A968C9308951F920F920FB60F92D7 -:10436000112408B60F9218BE0BB60F921BBE8F9386 -:104370009F93EF93FF93E0E0F9E013828FE790E0E3 -:1043800086AB97AB81E190E080AF91AFE0E0FAE0DF -:1043900010A211A28FEF9FEF86A397A389E88383D2 -:1043A000168281E084878EE0808310922A06FF9136 -:1043B000EF919F918F910F900BBE0F9008BE0F90C1 -:1043C0000FBE0F901F9018951F920F920FB60F926D -:1043D000112408B60F9218BE0BB60F921BBE2F9376 -:1043E0003F938F939F93EF93FF932091280693B170 -:1043F000267081E009F080E0990F892B83B982B1A2 -:10440000882309F464C012B883B18770873059F5E6 -:104410001092000980E180930C091092030A1B9B03 -:1044200003C08CEA94E002C08CE694E08093260AF4 -:104430009093270A82E081B981E080930C0A83E09F -:104440008093060A86B197B1877049F090B18F5F6B -:10445000893011F09695FBCFE8B1F9B1908381E0F6 -:104460008093AA2937C093B1892F8C7099F192FB60 -:10447000992790F981E0982781B181111BC080B103 -:104480008695911190E8892B80B926B137B12F5FBD -:104490003F4F26B937B927703327232BD9F4E8B11A -:1044A000F9B19F012F5F3F4F28B939B9808381E06F -:1044B00081B910C081B1813069F4EAB1FBB19F01CB -:1044C0002F5F3F4F2AB93BB9908311B803C082B127 -:1044D000809582B9FF91EF919F918F913F912F919C -:1044E0000F900BBE0F9008BE0F900FBE0F901F9045 -:1044F00018951F920F920FB60F92112408B60F92C3 -:1045000018BE0BB60F921BBE2F933F938F939F93B2 -:10451000EF93FF9381B1823008F49DC081B18D305B -:1045200008F099C0E1B1F0E0EE0FFF1FEC5DFF4D28 -:104530000190F081E02D19948FE790E08093260A96 -:104540009093270A88C08E9A8EE0809340088FE36C -:1045500090E08093260A9093270A85E06FC08E989A -:1045600086E081B98FEF82B914B815B8E8B1F9B116 -:10457000808180B970C0009B05C08E9A82B1809501 -:1045800082B901C08E9887E059C0009B02C08E9806 -:1045900001C08E9A80B1869580B984B195B101969B -:1045A00084B995B984B195B187709927892B11F495 -:1045B00088E044C024B135B186B197B128173907D6 -:1045C000B1F52BC0EAB1FBB1309711F0808101C089 -:1045D00082B1882311F08E9A01C08E9889E02EC096 -:1045E000EAB1FBB1309751F08081882311F08E98A9 -:1045F00001C08E9A3196EAB9FBB908C082B188230E -:1046000011F08E9801C08E9A8FEF82B924B135B126 -:1046100086B197B12817390711F48AE00FC0E8B1C5 -:10462000F9B1CF01019688B999B9818180B986E045 -:1046300005C08E988BE002C08E988CE081B90BC0CB -:104640001092000A1092060A109240081092410837 -:1046500081E08093AB29FF91EF919F918F913F91E2 -:104660002F910F900BBE0F9008BE0F900FBE0F90B2 -:104670001F901895CF93DF93EAEAF9E21082118236 -:10468000E0E4F6E0128A84E08283C0E8D1E082E6CA -:104690008E83A0E2B6E081E016968C931697119671 -:1046A0008C93119796E012969C93129751968C9347 -:1046B000519742E052964C9352971A961C921A9731 -:1046C00033E019963C9399E598839AE5998390E4B1 -:1046D00091839683A0EBB0E012962C911297207FE5 -:1046E00012962C93129712962C9112972260129682 -:1046F0002C9320E321832683908B8683458331830B -:10470000E0E0F8E083E1818321E030E026A337A3F5 -:1047100020A731A7E0E8F8E014868083E0E2F3E028 -:104720001382118288E0828391E1908320911E2080 -:1047300030911F20208F318FE0E8F3E09CE39283DB -:10474000808393838183DF91CF91D8CDA0E2B6E0BF -:104750001A961C921A97EAEAF9E210821182E0E0B6 -:10476000F9E010821382178280E18487E0E0FAE0AA -:1047700010821382168281E08487E0E4F8E01082E0 -:10478000118216968C938E980895CF93DF93809123 -:10479000AA29882309F47EC01092AA29C6B1D7B1EC -:1047A000C730D10508F471C0AE01495F5F4F93E097 -:1047B000569547959A95E1F7E091552BF091562B38 -:1047C0006AEA7DE280E41995E091582BF091592B2B -:1047D0008781883019F483E180938C298681883021 -:1047E00019F483E180938B29E0914B2BF0914C2BB2 -:1047F000BE018AEA9DE21995EC0194FF06C0DF7EB6 -:104800008AE29EE28AB99BB902C01AB81BB8209707 -:10481000E1F1AE01495F5F4F83E0569547958A9578 -:10482000E1F7E091552BF091562B6AEA7DE281E4A5 -:104830001995E091582BF091592B8781893019F403 -:1048400083E180938C298681893019F483E18093F8 -:104850008B29C6B9D7B98AEA9DE288B999B910926D -:104860006008109261088FE090E080936608909352 -:10487000670888E090E080936A0890936B0883E271 -:104880008093410883E081B905C01092000A10921C -:10489000060A34DD8091AB29882329F01092AB29D8 -:1048A000DF91CF912BCDDF91CF910895CF93DF93FF -:1048B000E0E4F6E0128A84E08283C0E8D1E082E698 -:1048C0008E83A0E2B6E081E016968C93169711963F -:1048D0008C93119796E012969C93129751968C9315 -:1048E000519742E052964C9352971A961C921A97FF -:1048F00033E019963C93199799E598839AE5998343 -:1049000090E491839683C0EBD0E02A81207F2A83B4 -:104910002A8122602A8320E321832683908B868349 -:1049200045833183E0E0F8E093E1918321E030E0DA -:1049300026A337A320A731A7E0E8F8E014869083E8 -:10494000E0E2F3E01382118298E0928341E1408338 -:1049500040911E2050911F20408F518FE0E8F3E0DE -:104960004CE3428390834383918315968C93E0E0DC -:10497000F9E08FE790E086A397A322A733A71082E0 -:1049800016828CE087831092000A1092AC29EFEA1D -:10499000F9E2108212821182DF91CF91089581E0B5 -:1049A000809326067EDCE0E0F9E010821782E0E0EA -:1049B000FAE010821782EFEAF9E211821282108285 -:1049C00008951F920F920FB60F92112408B60F92FE -:1049D00018BE0BB60F921BBE2F933F938F939F93DE -:1049E000EF93FF93E091AC29F0E0EE0FFF1FE25C44 -:1049F000FF4D0190F081E02D199410928C081092D7 -:104A0000000886E18A95F1F700C081E080930008F4 -:104A100083E080938C0818B88091AA2D86B917B8C6 -:104A200082E001C083E08093AC2986C0309911C038 -:104A300082B181110EC010928C081092000896E18C -:104A40009A95F1F700C081E08093000883E080939D -:104A50008C0884E0E8CF309B10C010928C08109234 -:104A6000000886E18A95F1F700C081E08093000894 -:104A700093E090938C0882B901C012B886B18695F4 -:104A800086B984B195B1019784B995B9892B11F490 -:104A900085E001C083E08093AC2987B18F5F87B93F -:104AA000877009F049C0E8B1EF5FE8B9F0E0E6557A -:104AB000F24D808186B940C082B181110EC0109242 -:104AC0008C081092000896E19A95F1F700C081E0F9 -:104AD0008093000883E080938C0886E0A4CF109236 -:104AE000000982E591E00197F1F700C0000082E043 -:104AF0008093870389E3809381038AEA9DE28AB9E0 -:104B00009BB981E090E084B995B980E886B98EB10F -:104B10009FB12091080430910904822B932B80933C -:104B2000AD299093AE2981E08093B12918B817B8C8 -:104B30001092AC2901C000C0FF91EF919F918F911D -:104B40003F912F910F900BBE0F9008BE0F900FBE9C -:104B50000F901F9018951F920F920FB60F9211246D -:104B600008B60F9218BE0BB60F921BBE2F933F9341 -:104B70004F935F938F939F93EF93FF931092070A46 -:104B80001092000A10924709109240098091810307 -:104B90008E7F8093810384B195B187709927892B8B -:104BA000C9F0E4B1F5B186B144B155B193E0F695E1 -:104BB000E7959A95E1F7E655F24D90E04770552755 -:104BC00028E030E0241B350B02C0959587952A9587 -:104BD000E2F7808381E08093B0291092B1298FEFB2 -:104BE0009FEF8093260A9093270A1092200A109232 -:104BF000210A1092060A1092070A1092030A84E012 -:104C00008093000A87E08093AC29FF91EF919F91F8 -:104C10008F915F914F913F912F910F900BBE0F900D -:104C200008BE0F900FBE0F901F9018951F920F9205 -:104C30000FB60F92112408B60F9218BE0BB60F9242 -:104C40001BBE8F93EF93FF93E0E8F3E081818F7CAD -:104C50008183E0E0FAE088E8838381E08083FF914C -:104C6000EF918F910F900BBE0F9008BE0F900FBE6B -:104C70000F901F9018951F920F920FB60F9211244C -:104C800008B60F9218BE0BB60F921BBE2F933F9320 -:104C90004F935F938F939F93EF93FF93809160095E -:104CA000109260091092610992E090934009813658 -:104CB00020F0813A08F063C077C086B1869586B946 -:104CC00084B195B1019684B995B987709927892BDC -:104CD00041F4EAB1FBB1CF0101968AB99BB986B123 -:104CE000808384B195B180FD88C0369986C01092CA -:104CF000070A1092000A1092470910924009809109 -:104D000081038E7F8093810384B195B18770992749 -:104D1000892BC9F0E4B1F5B186B144B155B193E046 -:104D2000F695E7959A95E1F7E655F24D90E04770D4 -:104D3000552728E030E0241B350B02C09595879558 -:104D40002A95E2F7808381E08093B0291092B129FF -:104D50008FEF9FEF8093260A9093270A1092200AE4 -:104D60001092210A1092060A1092070A1092030A62 -:104D700084E08093000A87E08093AC293EC086B12E -:104D80008695806886B984B195B1019684B995B944 -:104D900087709927892B41F4EAB1FBB1CF010196C5 -:104DA0008AB99BB986B1808386B18695806886B9B9 -:104DB00084B195B1019684B995B987709927892BEB -:104DC00041F4EAB1FBB1CF0101968AB99BB986B132 -:104DD000808386B1869586B984B195B1019684B9F0 -:104DE00095B987709927892B41F4EAB1FBB1CF01BE -:104DF00001968AB99BB986B18083FF91EF919F910B -:104E00008F915F914F913F912F910F900BBE0F901B -:104E100008BE0F900FBE0F901F901895BF92CF92B3 -:104E2000DF92EF92FF920F931F93CF93DF93CDB753 -:104E3000DEB7DA95CDBFDEBF8091B1298823B9F006 -:104E40008EB19FB140910804509109042091AD2981 -:104E50003091AE29842B952B821B930B039738F04E -:104E600014B815B881E08093B0291092B12922DAE4 -:104E7000882309F440C18091B12981113CC18091FE -:104E8000AF29811105C08091B029882309F433C16D -:104E90008091AC29873041F48091200A9091210AB9 -:104EA0008532914008F427C18091B029882309F404 -:104EB000A6C084B195B1892B09F4A1C084B195B184 -:104EC000089718F414B815B89AC044B155B1495FA1 -:104ED0005F4F63E0569547956A95E1F76AEA7DE290 -:104EE000CE0101960E94EE458AEA9DE28AB99BB9FD -:104EF00004B115B114B815B8C12CD12C73E1B72E7B -:104F0000E8E0EE2EF12CC016D10608F078C0F601CC -:104F100053E0F695E7955A95E1F741E050E04C0FE4 -:104F20005D1FE40FF51F8081982F969596959083CD -:104F30008370813039F0E8F0823009F059C086B1D1 -:104F4000869503C086B18695806886B984B195B18F -:104F5000019684B995B987709927892B09F048C0C3 -:104F6000EAB1FBB1CF0101968AB99BB986B18083C2 -:104F70003FC084B195B187709927892BC1F0E4B106 -:104F8000F5B186B124B135B143E0F695E7954A9580 -:104F9000E1F7E655F24D90E027703327A701421B59 -:104FA000530B02C0959587954A95E2F78083E0916F -:104FB000582BF091592B8781883011F4B0928C29AD -:104FC0008681883011F4B0928B2944B155B1495F84 -:104FD0005F4F93E0569547959A95E1F7E091552BF1 -:104FE000F091562B6AEA7DE280E4199581E001C0D8 -:104FF00080E052E0C50ED11C882309F484CF1092C2 -:10500000AF291092B02964B175B1E0914B2BF091AA -:105010004C2B8AEA9DE2199584B995B984B195B172 -:10502000892B09F468C089E0809381031092000AFB -:105030001092200A1092210A8FE790E08093260AAE -:105040009093270A8FE590E08093280A9093290A8D -:105050001092060A80E180930C0A93E09093070A6D -:1050600010926009109261092FEF3FEF20936609BB -:105070003093670920E031E0209368093093690993 -:105080001092460980934C0981E08093470981E1A1 -:10509000809380011092880110928003109229065B -:1050A000E091582BF091592B8781893019F483E1D5 -:1050B00080938C298681893019F483E180938B2930 -:1050C00044B155B1495F5F4F83E0569547958A9546 -:1050D000E1F7E091552BF091562B6AEA7DE281E4ED -:1050E000199581E08093AC2912B810922009109292 -:1050F000210980930009D395CDBFDEBFDF91CF9109 -:105100001F910F91FF90EF90DF90CF90BF90089587 -:1051100014B815B881E08093AF29A4C81092070A8B -:105120001092000A10924709109240098091810361 -:105130008E7F8093810384B195B187709927892BE5 -:10514000C9F0E4B1F5B186B144B155B193E0F6953B -:10515000E7959A95E1F7E655F24D90E047705527AF -:1051600028E030E0241B350B02C0959587952A95E1 -:10517000E2F7808381E08093B0291092B1298FEF0C -:105180009FEF8093260A9093270A1092200A10928C -:10519000210A1092060A1092070A1092030A84E06C -:1051A0008093000A87E08093AC291092AC2910927A -:1051B000B0291092AF2975C881E08093B42910926C -:1051C000B229089581E08093B42908950895CF927B -:1051D000DF92EF92FF920F931F93CF93DF93CDB7A0 -:1051E000DEB72597CDBFDEBF8C01FC018081909199 -:1051F000B4299230F1F038F0943079F120F1953003 -:1052000009F44AC049C121E09227292F2170209337 -:10521000B229911102C0863219F0823509F03CC1E1 -:1052200084E4F8018083118282E08093B42980E1D4 -:1052300034C19091B229911102C08632B1F0823509 -:1052400009F04DC012C09091B229911102C086326E -:1052500061F0823509F075C008C09091B2299111B2 -:1052600002C0863211F0823539F484E4F80180837B -:10527000118281E089270DC0803309F41BC1823A75 -:1052800009F434C1803A09F450C1803509F4F6C0FC -:1052900081E08093B42900C160E170E0C8010E9400 -:1052A00079328823A1F08091542B81110BC0609139 -:1052B000B329F4E06F9FB001112444E050E0C8012D -:1052C0000E949D0E84E08093B4298AE004C084E0AB -:1052D0008093B42981E0F801808384E0DEC08339C3 -:1052E000B9F619821A821B821C8288E8898343E0FE -:1052F00050E060E070E0CE0102960E944F0EF8018F -:105300008181803209F4ABC0803709F048C0F801D0 -:10531000928189819813C0C093818A819813BCC0FF -:1053200094818B819813B8C095818C819813B4C0F7 -:1053300084E0808361E070E0C8010E944E3283E027 -:105340002AC0853909F0A4CF44E050E064E070E061 -:10535000CE0101960E944F0EF8018181803209F43E -:105360007EC08037E1F4F80192818981981394C05E -:1053700093818A81981390C094818B8198138CC0FB -:1053800095818C81981388C0108261E070E0C8011B -:105390000E944E3284E08093B42988E17EC0E82EDA -:1053A000E2949FE0E9222EEF2E0D8F70F82E88E018 -:1053B00090E08F1991094FEF50E06A0102C0D59437 -:1053C000C7948A95E2F7253021F0243059F5FF2063 -:1053D000E9F044E050E0B8016E5F7F4FCE010196E6 -:1053E0002D830E94E1452D81892B61F49A81898169 -:1053F00089279B8189279C818927F80196818927A4 -:105400008C2169F1243071F4F11046C044E050E081 -:10541000B8016E5F7F4FCE0101960E94E145892B56 -:10542000F1F03AC02430C0F5E22EF12CA701B8010A -:105430006E5F7F4FCE0101960E94E145892B61F599 -:10544000D801AE0DBF1DE1E0F0E0EC0FFD1FEE0D49 -:10545000FF1D12969C9180818927C822E9F4298139 -:10546000F80120833A8131839B8192838C818383ED -:10547000232792278927848388E20FC0F80181813E -:10548000811141C062E070E0C8010E947932882336 -:1054900009F420CF1092B42980E090E02596CDBF8A -:1054A000DEBFDF91CF911F910F91FF90EF90DF90C2 -:1054B000CF900895F801F18062E070E0C8010E9489 -:1054C0007932882309F406CFFFE0FF15E0F084E08D -:1054D000F89EB001112440E150E0C8010E944F0E37 -:1054E00060E170E0C801DAD780E9D7CFF801F18038 -:1054F00066E070E0C801FDD7882309F4EBCE8EEF9B -:105500008F0D8E3018F0F8011082E7CE8091542B69 -:105510008111DBCEF4E0FF9EB001112444E050E0A5 -:10552000C80102960E949D0ED0CEF801F18062E083 -:1055300070E0C801DED7882309F4CCCE8EEF8F0D42 -:105540008E3008F7F092B32985E0BDCECF93DF937C -:10555000EC0143E050E060E070E00E944F0E44E058 -:1055600050E064E070E0CE010396DF91CF910C949F -:105570004F0E0F931F93CF93DF931F921F92CDB7C0 -:10558000DEB78C01FC0190818181892798E8892709 -:10559000928189278A8394818381892795818927AC -:1055A00096818927898343E050E060E070E0C8017C -:1055B0000E949D0E41E050E063E070E0CE01029653 -:1055C0000E949D0E44E050E064E070E0C801039644 -:1055D0000E949D0E41E050E068E070E0CE0101962F -:1055E0000E949D0E0F900F90DF91CF911F910F9110 -:1055F000089581E08093D22984E090E08093B729D8 -:105600009093B82988E08093B6291092B52908951F -:1056100081E08093D22984E490E08093B72990932D -:10562000B82988E08093B6291092B529089581E0C1 -:105630008093D22982E490E08093B7299093B8298F -:1056400088E18093B6291092B529089581E080936E -:10565000D229089508958F929F92AF92BF92CF92D0 -:10566000DF92EF92FF920F931F93CF93DF93CDB70B -:10567000DEB72F97CDBFDEBF8C016B018091D229A1 -:10568000853009F4C1C058F4823009F446C050F1A5 -:10569000833009F48BC0843009F4A6C0EBC5883090 -:1056A00009F45BC198F4863009F4C2C0873009F070 -:1056B000E1C5C8010E9497336801F4E0CF0ED11C08 -:1056C0007601580128E0A20EB11CE4C0893009F42B -:1056D000DCC28D3008F0CEC578016801B6E0CB0E93 -:1056E000D11C10C391E08927982F91709093B52910 -:1056F0003091B7292091B829D8019C91811102C01D -:10570000963219F0923509F0BDC3F8013083218338 -:1057100084E08093D22980E1AEC5F8018081982F82 -:105720009D7F913411F48AE085C2803329F562E0CF -:1057300070E0C801DED68823E9F0D80111966C919B -:10574000B0E16B9FB001112440E150E0C8010E941C -:105750004F0E60E170E0C801A1D680E98CC590EAE7 -:10576000980F923008F006C662E070E0C801C1D61A -:10577000811183C581E05DC2803A91F462E070E0FE -:10578000C801B7D68823B1F3D80111968C9111972F -:105790008093C92983E08093D2298AE08C93B0C298 -:1057A000803509F067C5F80181815CC060E170E077 -:1057B000C8019FD6882399F08091542B81110BC08A -:1057C0006091C929B0E16B9FB001112440E150E024 -:1057D000C8010E949D0E8AE0F801808303C081E029 -:1057E000D8018C9382E08AC29091B5293091B72973 -:1057F0002091B829F8018081911102C0863299F078 -:10580000823509F047C30FC09091B5293091B7296F -:105810002091B829F8018081911102C0863219F0D7 -:10582000823509F072C4D8013C9311962C9311C0B3 -:105830009091B5293091B7292091B829D8018C9140 -:10584000911102C0863211F0823531F4F8013083B3 -:10585000218381E0892708C3803509F080CFD801F2 -:1058600011968C91882319F0D8011C9249C262E0EC -:1058700070E0C8013ED6882309F47CCFE091552B17 -:10588000F091562B40E060E070E081E919951092AC -:10589000D229F0C471D7D7019C918927F701819350 -:1058A0007F01EA15FB05B1F7E091552BF091562BDE -:1058B00044E0B60180EA1995D80114969C9114979A -:1058C0008091CA29981340C015969C911597809194 -:1058D000CB29981339C016969C9116978091CC29A4 -:1058E000981332C017969C918091CD2998132CC0A3 -:1058F00068018EECA82E89E2B82E94E0E92EEA0C1D -:105900004501F501F1905F0137D78F25D6018D93C1 -:105910006D01D401EC91F0E0EC59FB4FF4905ED6B0 -:10592000D601A158BF4F8F258C93EA10E9CFE091A3 -:10593000552BF091562B44E0B80181EA199588E087 -:105940008093D22980E256C0E091552BF091562BDE -:1059500040E060E070E080EC95C178014801B4E07F -:105960008B0E911C580108D7F50190818927D5012C -:105970008D935D01A815B905B1F7F80180818033D9 -:1059800009F048C062E070E0C801B3D58823A1F1F6 -:10599000D80111966C91B0E16B9FB001112440E1E8 -:1059A00050E0C8010E944F0E60E170E0C80176D55A -:1059B000E091552BF091562B42E1B80180E8199502 -:1059C0006801E2E1CE0ED11CD7011C91D5D681270A -:1059D000F70181937F01E12FF0E0EC59FB4F149127 -:1059E000FDD5D701A158BF4F81278C93EC14FD043E -:1059F00059F780E990E1FDC4D2D691E08927D8011A -:105A00008C93E091552BF091562B44E0B80181EC3A -:105A1000199576C1803A71F462E070E0C80169D5E9 -:105A2000882351F1F80181818093C92989E080930D -:105A3000D22967C0803C69F462E070E0C80159D5A2 -:105A40008823A1F1D80111968C918093C9298BE00C -:105A500028C0813CC1F462E070E0C8014AD58823C7 -:105A600059F0F80181818093C929BAE0FB2EF092A8 -:105A7000D22995D68F2548C0E091552BF091562B11 -:105A800044E0B80143C0823CE1F462E070E0C80148 -:105A900030D5882359F0D80111968C918093C9296B -:105AA0008CE08093D2297BD69AE0C2C0E091552B3E -:105AB000F091562B44E0B80181EC199570D691E035 -:105AC00022C0803B31F562E070E0C80112D5E09160 -:105AD000552BF091562B44E0B8018823B9F086E8A5 -:105AE00019958091542B81110CC0F8016181F0E16E -:105AF0006F9FB001112440E150E089EB99E20E94D0 -:105B00009D0E4DD69AE08927D80148CE81EC199593 -:105B10008DC090EA980F923008F08EC062E070E07D -:105B2000C801E7D4882309F481C0D80111962C91CB -:105B30001197322F3C7F8C91803619F08AE390E0E8 -:105B400002C080E390E06C01B0E13B9FC00CD11C2F -:105B5000112427FF0AC0207FE0E12E9F800D911DB8 -:105B600011249C0120543F4F6901E091552BF09185 -:105B7000562B42E0B80180E9199564E0CE01079602 -:105B80000E948D0D8091532B44E050E0873019F432 -:105B900063E070E002C060E070E0CE010B960E940E -:105BA0004F0E46E050E0B601CE0101960E944F0E26 -:105BB0008F818093CA2988858093CB29898580939A -:105BC000CC298A858093CD2960E470E08AEC99E243 -:105BD000F9D58091CA298093CE298091CB298093D1 -:105BE000CF298091CC298093D0298091CD29809391 -:105BF000D12960E270E08EEC99E2E4D5AE01495F14 -:105C00005F4FBE01655F7F4FCE01019620D5FE013B -:105C1000379684E08E0F9191D7019D937D018E136D -:105C2000FACF87E08093D22980E225C3B8D591E0EE -:105C30008927F801808364C08035B1F481818111A6 -:105C400013CE62E070E0C80154D4882309F492CDE9 -:105C50001092D229E091552BF091562B40E060E054 -:105C600070E081E9199506C3A601495F5F4FA3E083 -:105C700056954795AA95E1F7E091552BF091562B53 -:105C8000B80182E9199581E0EFC078016801B2E1BD -:105C9000CB0ED11C71D5F70190818927D7018D9347 -:105CA0007D01AC15BD05B1F760E170E0C80121D4FC -:105CB000E091552BF091562B8823B1F042E1B801C9 -:105CC00081E819958091542B81110BC06091C929ED -:105CD000B0E16B9FB001112440E150E0C8010E9487 -:105CE0009D0E5DD59AE081C344E0B80181EC199521 -:105CF00056D591E08927D8018C9388E08093D229EA -:105D000084E0B9C239D5F70190818927D7018D93F5 -:105D10007D01AC15BD05B1F764E070E0C801E9D3C1 -:105D2000882309F4A4C06091C929B0E16B9FB00138 -:105D3000112440E150E089EB99E20E944F0E9091CE -:105D4000B9298091BD29809598134DC38091C129AF -:105D5000981349C32091BA298091BE2980952813B0 -:105D600042C38091C22928133EC3C090BB298091B1 -:105D7000BF298095C81237C38091C329C81233C385 -:105D80008091BC293091C029309583132CC3309168 -:105D9000C429831328C34091C5293091C629309561 -:105DA000431321C33091C72943131DC33091C82920 -:105DB0003095431318C3D8013C9111964C9111971B -:105DC00012968C901297912CA12CB12C54019924ED -:105DD0008824942A832A13963C91B32AD12CE12C4F -:105DE000F12C7601DD24CC24D22AC92AF82A80910C -:105DF000D2298B3009F0DCC2E091552BF091562B63 -:105E000046E0B80185E81995C818D908EA08FB08E2 -:105E1000C092B92933272F2D1E2D0D2D0093BA299D -:105E2000A701662777274093BB298F2D9927AA279B -:105E3000BB278093BC29EC2DE095E093BD29E02F92 -:105E4000E095E093BE29E42FE095E093BF29E82F89 -:105E5000E095E093C029C092C1290093C2294093E4 -:105E6000C3298093C42988E08093D22903C2E0919A -:105E7000552BF091562B44E0B80181EC19958FD445 -:105E800091E0B3C2903409F0F5C182E08093D22949 -:105E90008AE03ACE833909F0FACC8091532B8730CF -:105EA00009F0A1C043E050E060E070E0CE0102964E -:105EB0000E944F0E88E88983F8019181903219F091 -:105EC000903761F024C0D80180833A8131832B81DF -:105ED00022839C8193832327822739C1F801828101 -:105EE000883809F0C7C193818A819813C3C194810E -:105EF0008B819813BFC195818C819813BBC184E0BD -:105F0000808361E070E0C801C9D285E03DC1E92E1F -:105F1000E2944FE0E4222EEF2E0D9F70F92E88E0E0 -:105F200090E08F1991094FEF50E06A0102C0D594BB -:105F3000C7948A95E2F7253021F0243061F5FF20DF -:105F4000F1F044E050E0B8016E5F7F4FCE01019662 -:105F50002F870E94E1452F85892B69F49A818B81D7 -:105F6000892798E889279C818927D80116969C91D2 -:105F700089278C2181F1243071F4F1107BC144E038 -:105F800050E0B8016E5F7F4FCE0101960E94E1455F -:105F9000892B09F16FC1243008F06CC1E22EF12C7D -:105FA000A701B8016E5F7F4FCE0101960E94E145C7 -:105FB000892B09F05FC1D801AE0DBF1DE1E0F0E013 -:105FC000EC0FFD1FEE0DFF1D12969C91808189271D -:105FD000C82209F04FC198E8F80190833A813183D3 -:105FE0002B8122830CC144E050E060E070E0CE01E0 -:105FF00001960E944F0E9091B629D80111968C916E -:10600000803209F4F5C08037D9F4D80112962C916A -:106010001297898128132EC113962C9113978A8188 -:10602000281328C114962C9114978B81281322C110 -:1060300015962C9115978C8128131CC19C939FC099 -:10604000E82EE2943FE0E3222EEF2E0D8F70F82E23 -:1060500088E090E08F1991094FEF50E06A0102C08B -:10606000D594C7948A95E2F7253021F0243061F564 -:10607000FF20F1F044E050E0B8016E5F7F4FCE01A9 -:1060800001962F870E94E1452F85892B69F49A811B -:10609000898189279B8189279C818927F80196819D -:1060A00089278C2109F442C0243071F4F110E2C038 -:1060B00044E050E0B8016E5F7F4FCE0101960E9430 -:1060C000E145892B99F1D6C0243008F0D3C0E22EE7 -:1060D000F12CA701B8016E5F7F4FCE0101960E949F -:1060E000E145892B09F0C6C0D801AE0DBF1DE1E026 -:1060F000F0E0EC0FFD1FEE0DFF1D12969C918081CC -:106100008927C82209F0B6C011C0853909F0BFCB74 -:1061100044E050E063E070E0CE0101960E944F0E33 -:106120009091B629F80181818032A9F42981D801A2 -:106130002C933A8111963C9311979B8112969C93D4 -:1061400012978C8113968C93139723279227892774 -:1061500014968C935AC08037D9F4F8012281898132 -:10616000281388C023818A81281384C024818B81CD -:10617000281380C025818C8128137CC0908361E026 -:1061800070E0C8018BD186E08093D22988E173C08A -:10619000E82EE2942FE0E2222EEF2E0D8F70F82EE3 -:1061A00088E090E08F1991094FEF50E06A0102C03A -:1061B000D594C7948A95E2F7253049F544E050E03C -:1061C000B8016E5F7F4FCE0101962F870E94E14597 -:1061D0002F85892B09F59A81898189279B818927B8 -:1061E0009C818927D80116969C9189278C21A1F43E -:1061F0002981F80120833A8131839B8192838C81AC -:106200008383232792278927848388E234C024301C -:1062100099F4FF2029F0D2CF243071F4F1102AC074 -:1062200044E050E0B8016E5F7F4FCE0101960E94BE -:10623000E145892BE9F21EC02430E0F4E22EF12C76 -:10624000A701B8016E5F7F4FCE0101960E94E14524 -:10625000892B81F4D801AE0DBF1DE1E0F0E0EC0F19 -:10626000FD1FEE0DFF1D12969C9180818927C8228B -:1062700009F4BECF80E090E0BCC0F8012181322F4C -:106280003C7F8081803619F08AE390E002C080E391 -:1062900090E06C01F0E13F9FC00CD11C112427FF5E -:1062A0000AC0207F30E1239F800D911D1124DC0165 -:1062B000A054BF4F6D01E091552BF091562B42E059 -:1062C000B80180E919957E01B7E0EB0EF11C64E09E -:1062D000C7010E948D0D8091532B44E050E0873020 -:1062E00019F463E070E002C060E070E0CE010B964C -:1062F0000E944F0E46E050E0B601CE0101960E948A -:106300004F0E8F818093CA2988858093CB298985F8 -:106310008093CC298A858093CD2960E470E08AEC53 -:1063200099E250D28091CA298093CE298091CB29BD -:106330008093CF298091CC298093D0298091CD2939 -:106340008093D12960E270E08EEC99E23BD287E045 -:106350008093D229D801F70184E08E0D91919D930D -:106360008E13FCCFA701BE01655F7F4FCE01019662 -:106370006ED15ACC982F9F77903329F0803A19F03C -:10638000805C833078F481E08093D22984E0F80146 -:106390008083E091552BF091562B40E060E070E057 -:1063A00082EC36CBE091552BF091562B40E068CC37 -:1063B0008A3069F4E091552BF091562B46E0B801F4 -:1063C00084E81995C80CD91CEA1CFB1C21CD8C3023 -:1063D00009F01ECDE091552BF091562B46E0B80107 -:1063E00087E8199515CDDBD196E08927F8018083E0 -:1063F00084CC2F96CDBFDEBFDF91CF911F910F913F -:10640000FF90EF90DF90CF90BF90AF909F908F90D4 -:106410000895CF93DF932091532B273071F4EC0133 -:1064200043E050E060E070E00E944F0E44E050E036 -:1064300063E070E0CE01039604C044E050E060E009 -:1064400070E0DF91CF910C944F0ECF93DF931F92AA -:10645000CDB7DEB72091532B273029F447E050E029 -:1064600060E070E015C0FC0131812081232732817A -:10647000232733812327298344E050E060E070E044 -:106480000E949D0E41E050E064E070E0CE01019674 -:106490000E949D0E0F90DF91CF91089520E42093EC -:1064A000D00026EC2093D5002093D40021E0209347 -:1064B000D000DC01680F791FA617B70741F0ED91F6 -:1064C000F0E0EC59FA4FE491E093D300F5CFE0917E -:1064D000D500F0E0EC59FA4FE491EC93E091D40050 -:1064E000F0E0EC59FA4FE4911196EC931092D00041 -:1064F000089520E42093D00026EC2093D50020932B -:10650000D40021E02093D000DC01680F791FA6178A -:10651000B70741F0ED91F0E0EC59FA4FE491E093C8 -:10652000D300F5CFE091D500F0E0EC59FA4FE491BB -:106530008C918E130AC0E091D400F0E0EC59FA4F30 -:10654000E49181E011969C919E1380E01092D0001E -:1065500081700895F091D629A091D7294091D8292A -:10656000E091D3293091D4292091D5295A2F507107 -:106570009F2F917E9527542F507295275E2F547927 -:106580009527532F53779527522F5A739527592FB5 -:1065900052955F709527592F569556959527B92F87 -:1065A000B69550E060E070E0BA01552744275A2BB9 -:1065B0004F2B76956795579547959B279170981324 -:1065C0006068E093D6293093D7292093D829409347 -:1065D000D3295093D4296093D5290895CF93DF937D -:1065E00083ED99E2DC011196EC911197CE2FCF70DB -:1065F000D0E0C259DF4D2C91A22FA295AF70B0E030 -:10660000A259BF4D38892C91232BE295EF70F0E011 -:10661000E259FF4D30A1232BDC011296EC91AE2FF5 -:10662000AF70B0E0A259BF4DD0968C91922F982BAD -:10663000E295EF70F0E0E255FF4D8081E92FE82B05 -:10664000F0E0E25BFF4D8081DF91CF910895CF9222 -:10665000DF92EF92FF920F931F93CF93DF93FB0193 -:10666000EA01BC016F5F7F4F03ED19E2B6EDEB2E3F -:10667000B9E2FB2E53E05E0DCB010197DC012C91BA -:10668000DB018C9130E0382B88E090E040E04695CB -:10669000969520FD406821FD9068369527953695A2 -:1066A00027958150A1F7D7014D937D01D8019D9386 -:1066B0008D016E5F7F4F5E11DFCF918189819827B9 -:1066C000C2808A81C826D12CE12CF12C7601DD24F0 -:1066D000CC24D92A908188818927C82A93818B81EB -:1066E0008927F82A10E27ADF082F8C2D817032DF9B -:1066F000F694E794D794C794002311F06894F7F8C0 -:10670000115089F788818C25888389818D2589831B -:106710008A818E258A838B818F258B83DF91CF9110 -:106720001F910F91FF90EF90DF90CF900895CF923F -:10673000DF92EF92FF92CF93FC018181C280D12C36 -:10674000E12CF12C7601DD24CC24D82A8081C82AC2 -:106750008381F82AC0E242DF9C2D91708927FADEFE -:10676000F694E794D794C794C150A9F7CF91FF90BE -:10677000EF90DF90CF9008951F93CF93DF93D8E0F1 -:10678000C0E02CDF182F80E0E5DEC6951111C0684F -:10679000D150B9F78C2FDF91CF911F9108951F939E -:1067A000CF93DF93D4E0C0E019DF182F80E0D2DE72 -:1067B000C6951111C860D150B9F78C2FDF91CF91D8 -:1067C0001F910895FC01CB01019728F14281242FEC -:1067D0002D72322F32953F702327322F3695369502 -:1067E0002327322F3695A18150E060E070E0BA0196 -:1067F000552744275A2BA0814A2BA3817A2B7695C3 -:10680000679557954795232720FD706840835183EE -:1068100062837383D9CF0895AF92BF92CF92DF92F4 -:10682000EF92FF920F931F93CF93DF936730710521 -:1068300009F451C09B0127703327232B09F04EC068 -:10684000EB016C015B0183E0B694A7948A95E1F7B4 -:106850007B0196E0F694E7949A95E1F7EA0CFB1C2D -:10686000EC0CFD1C8501015011090C0D1D1DA7012B -:10687000401B510B60E070E0C80101960E94084681 -:106880000C151D0520F1D801EC91F0E0EC59FB4FFF -:1068900044919701D7010A171B0768F48C91982F30 -:1068A000990FF90182919F01881F8827881F892BE2 -:1068B0008C931197F0CF11968C9111978E7FE42FC6 -:1068C000E170E82B1196EC9301501109D9CFC50165 -:1068D0008C0F9D1F04C087E090E001C0CB01DF91C9 -:1068E000CF911F910F91FF90EF90DF90CF90BF90CD -:1068F000AF900895EF92FF920F931F93CF93DF9382 -:10690000EC01CB0167307105D1F169E070E00E94C4 -:106910003845DE0120E030E088E090E026173707B8 -:1069200039F1F90143E0F695E7954A95E1F7E20F71 -:10693000F31FEC0FFD1F408150E089010770112704 -:10694000002E02C0559547950A94E2F74C93011525 -:10695000110551F0E1817C01E01AF10A01C0EE0F4E -:10696000EA94EAF74E2B4C932F5F3F4F1196D6CF08 -:10697000C90123E0880F991F2A95E1F702C087E03B -:1069800090E0DF91CF911F910F91FF90EF900895CC -:10699000CF93DF93FC016115710511F1808186951C -:1069A00080839B01295F3F4F83E0369527958A9529 -:1069B000E1F7DF0141E050E04217530770F4C19165 -:1069C0009081D0E89D9FC00111248C2B8D938081F4 -:1069D000869580834F5F5F4FEFCFCB01019702C059 -:1069E00080E090E0DF91CF910895EF92FF920F93B6 -:1069F0001F93CF93DF93EC01CB016730710509F44E -:106A000042C069E070E00E94384520E030E088E054 -:106A100090E026173707B9F1D90143E0B695A7955D -:106A20004A95E1F7A20FB31FA90147705527AC0F94 -:106A3000BD1FEC91F0E0042E02C0F595E7950A9495 -:106A4000E2F74115510559F011960C9111977C010F -:106A5000E41AF50A01C0000FEA94EAF7E02BF0E02F -:106A6000EC59FB4FE4911196AC91B0E08D0102C05E -:106A7000159507954A95E2F7A8014E2740FD05C0F8 -:106A80002F5F3F4FC6CF81E001C080E0DF91CF9103 -:106A90001F910F91FF90EF9008951092392A089559 -:106AA0001092392A1092D92910923A2A0895F8DFC3 -:106AB0000E948E281092392A089508950895DC01C5 -:106AC00023E633E66150E8F04D91942F922780E160 -:106AD000989FA00111244927E42FF0E042954F70C0 -:106AE000232F3327C9018427AC013E2F22272427D7 -:106AF000352743E0EE0FFF1F4A95E1F72E273F278A -:106B0000E1CFC90108958F929F92AF92BF92CF9229 -:106B1000DF92EF92FF920F931F93CF93DF93CDB746 -:106B2000DEB7C154D240CDBFDEBF8C016B012091D6 -:106B3000D929233009F43DC138F4213069F02230DD -:106B400009F4B3C00C94C53D243009F4B1C225301A -:106B500009F4CFC40C94C53DE0903B2BF0903C2B46 -:106B6000E114F104B9F0A701495F5F4F23E05695A6 -:106B700047952A95E1F76BE37AE20E94EE45609132 -:106B80003B2B70913C2BC80147DE10923B2B10929F -:106B90003C2BADC46115710509F4A8C0F9DE5C0198 -:106BA000BC01C80122DFD82EB501C801A3DE5C01FB -:106BB0009C01295F3F4FA901440F551F93E0569553 -:106BC00047959A95E1F74A5F5F4F4138510538F094 -:106BD00062EC70E2CE0101960E941A4690C0A3E0DA -:106BE00036952795AA95E1F7A80160E870E0CE01F7 -:106BF00001960E94A60D8C01CF5FDD4FB882C15077 -:106C0000D240CE5FDD4FA882C250D24085E691E2ED -:106C10009F938F93B0E8AB2EB12CC501801B910BD5 -:106C20009F938F9381E090E08C0F9D1F800F911FA9 -:106C30009F938F930E942146080F191FB501601B77 -:106C4000710B22E030E0AE014F5F5D4F81E090E0DC -:106C50008C0F9D1F800F911F0E94A60D800F911F0A -:106C60000F900F900F900F900F900F90A501481B61 -:106C7000590B21E030E02C0F3D1F280F391FD11098 -:106C800003C081ED90E202C080EE90E29F938F936B -:106C90005F934F933F932F930E9421460F900F9045 -:106CA0000F900F900F900F902AC0E0903B2BF09028 -:106CB0003C2BE114F104B9F0A701495F5F4FF3E009 -:106CC00056954795FA95E1F76BE37AE20E94EE4517 -:106CD00090913B2B80913C2B10923B2B10923C2BA4 -:106CE000E92EF82E54C76115710591F488E0EBE7A1 -:106CF000F1E2DE01119601900D928A95E1F7109272 -:106D0000D929BE016F5F7F4F85E60E94C0203FC733 -:106D10009B01295F3F4F73E0369527957A95E1F700 -:106D2000AC0160E870E0CE0101960E94A60D8C01D6 -:106D3000CF5FDD4FD882C150D240CE5FDD4FC882D9 -:106D4000C250D24085E691E29F938F93E0E8CE2E29 -:106D5000D12CC601801B910B9F938F9381E090E013 -:106D60008C0F9D1F800F911F9F938F930E94214630 -:106D7000800F911FB601681B790B22E030E0AE0155 -:106D80004F5F5D4FA1E0B0E0AC0FBD1F8A0F9B1FAE -:106D90000E94A60D1092D929BE016F5F7F4F85E634 -:106DA0000E94C0200F900F900F900F900F900F90A7 -:106DB000EEC680913A2A81115CC1B090392AB5E0C3 -:106DC000BB1588F0E3E0BE1608F04BC0F1E0FB1500 -:106DD00098F082E5D8018C9382E08093392A67E0AD -:106DE000E62EF12C48C128E02B1508F0B8C03AE097 -:106DF000B31609F403C13DC16331710508F4C8C07D -:106E0000C801CF5BDD4F2883C154D240C1DD7C0176 -:106E1000BC01C801EADDCF5BDD4F2881C154D240FF -:106E2000882359F1B701C801CF5BDD4F2883C154D6 -:106E3000D24060DDF801818190E0982F8827308171 -:106E4000832B80932B2A90932C2A83E9808380E2E2 -:106E50008183CF5BDD4F2881C154D2402093392AF2 -:106E6000B9C0C80195DD7C01BC01C801BEDD882325 -:106E700021F0F8E0EF16F10488F41092392AC701E6 -:106E8000089667E070E00E943845462FE091552B48 -:106E9000F091562BB80181EC1995B6C0B701C80125 -:106EA00029DDD8012C9111968C9111978227129689 -:106EB0009C911297892713969C9113978927149672 -:106EC0009C911497891364C08B2D90E00397283808 -:106ED00081F49C01220F331F820F931FFC01E25D9E -:106EE000F54D11962D913D914C9120833183428334 -:106EF00012C0FC01EE0FFF1F8E0F9F1F9C01225D31 -:106F0000354DF80180819181A281B381F90180839F -:106F10009183A283B38345E050E0B801C801029693 -:106F20000E94F745F3E0BF1629F024E0B21621F0E5 -:106F300087E903C083E901C085E9D8018C9380E724 -:106F400011968C9367E0C801BADDF80187839087BA -:106F500083E08B0D8093392A68E470E086C0693045 -:106F60007105B0F0C80114DD7C01BC01C8013DDD34 -:106F7000811111C0C701089667E070E00E94384592 -:106F8000462FE091552BF091562BB80181EC1995C5 -:106F90001092392A39C0B701C801ACDC63E0C801DE -:106FA0008EDD7C01892BA1F7D8018C9182FF15C061 -:106FB000B8E0BB1691F0E6E0BE1611F087E901C01B -:106FC00085E9D8018C9380E211968C93BA94BA9497 -:106FD000B092392A60E170E048C081E080933A2A9B -:106FE0008B2D90E00697B82EBB0C8B0D8C5F809399 -:106FF000382AF801808180932D2A3DC061157105E2 -:1070000031F481E08093392A0E94882832C0C80177 -:10701000BFDC7C01BC01C801E8DC81110FC0C701E5 -:10702000089667E070E00E943845462FE091552BA6 -:10703000F091562BB80181EC199508C0B701C80131 -:1070400059DC63E0C8013BDD892BD9F282ECD80121 -:107050008C9361E0C80133DDF80181839283B092A3 -:10706000392A10923A2A68E170E0C801D5DB7C0128 -:1070700002C0E12CF12C80913A2A882309F487C5BB -:107080002091382A30E04EE25AE264E170E0CE010D -:1070900001960E94A60DBE016F5F7F4F85E60E949C -:1070A000C02010923A2A1092D9290E9451216DC510 -:1070B00080913A2A811150C1B090392AF5E0FB1530 -:1070C00080F023E0B216D8F531E03B1598F082E568 -:1070D000F801808382E08093392AE7E0EE2EF12CDC -:1070E0003DC188E08B1508F0A1C0AAE0BA1609F4EA -:1070F000ECC032C16331710508F4B1C0C80148DC8D -:107100007C01BC01C80171DC882329F1B701C801E9 -:10711000F1DBD80111968C91119790E0982F882778 -:107120002C91822B80932B2A90932C2A83E98C9389 -:1071300080E211968C9383E08093392AB2C0C80113 -:1071400027DC7C01BC01C80150DC882321F0B8E0B9 -:10715000EB16F10488F41092392AC701089667E00B -:1071600070E00E943845462FE091552BF091562B48 -:10717000B80181EC1995AFC0B701C801BBDBF801BC -:107180002081818182279281892793818927948117 -:10719000891365C08B2D90E00397283889F49C01F2 -:1071A000220F331F820F931FFC01E25DF54DD801C2 -:1071B00011962D913D914C9120833183428312C0D1 -:1071C000FC01EE0FFF1F8E0F9F1F9C01225D354DAE -:1071D000F80180819181A281B381F901808391833B -:1071E000A283B38345E050E0B801C80102960E9433 -:1071F000F745F3E0BF1629F024E0B21621F087E945 -:1072000003C083E901C085E9D8018C9380E711961A -:107210008C9367E0C80153DCF8018783908783E093 -:107220008B0D8093392A68E470E092C06930710553 -:10723000B0F0C801ADDB7C01BC01C801D6DB811117 -:1072400011C0C701089667E070E00E943845462FDC -:10725000E091552BF091562BB80181EC19951092C5 -:10726000392A39C0B701C80145DB63E0C80127DC12 -:107270007C01892BA1F7D8018C9182FF15C0B8E061 -:10728000BB1691F0E6E0BE1611F087E901C085E972 -:10729000D8018C9380E211968C93BA94BA94B092F0 -:1072A000392A60E170E054C081E080933A2A8B2D46 -:1072B00090E00697B82EBB0C8B0D8C5F8093382A1C -:1072C000F801808180932D2A49C06115710531F440 -:1072D00081E08093392A0E9488283EC0C80158DB8B -:1072E0007C01BC01C80181DB81111AC0C70108966D -:1072F00067E070E00E943845462FE091552BF091F1 -:10730000562BB80181EC199582ECD8018C9361E081 -:10731000C801D5DBF80181839283B092392A14C069 -:10732000B701C801E7DA63E0C801C9DB892B81F244 -:1073300082ECD8018C9361E0C801C1DBF801818344 -:1073400092838AE08093392A10923A2A68E170E0A9 -:10735000C80162DA7C0102C0E12CF12C80913A2A4A -:10736000882309F414C4F0901A2AFF20A9F1B60169 -:10737000C8010EDB5C01009729F410921A2A1092C2 -:107380003A2A42C0823A910540F0BC01C8012DDB87 -:1073900091E08927C82ED12C03C0CC24C394D12CD2 -:1073A000B501C801A7DACD2829F462E1C80187DB5D -:1073B000892B29F0ACEFAF0DA0931A2A2AC024E044 -:1073C000F29ED0011124A653B64D80E1F801019040 -:1073D0000D928A95E1F71DC042E050E066E171E14F -:1073E000CE0101960E94C045E9E1F1E1E4912091CE -:1073F0002B2A30912C2A89819A812817390721F468 -:1074000080912D2A8E1729F01092392A0E948828FF -:10741000BCC320911A2A203109F04DC010923A2A9B -:1074200010921A2A1092D92920E130E04AED59E24F -:1074300067E870E0CE0101960E94A60D65E671E254 -:10744000CE0181960E941A4620E130E04AEE59E2D0 -:1074500065E670E0CE0183960E94A60D65E671E2B6 -:10746000CE018D5B9F4F0E941A4620E130E04AEF2B -:1074700059E263E470E0CE018B5B9F4F0E94A60D42 -:1074800065E671E2CE018B599F4F0E941A4620E1BA -:1074900030E04AE05AE261E270E0CE0189599F4F44 -:1074A0000E94A60D0E945121BE016F5F7F4F85E6AD -:1074B0000E94C0206AC380E3D8018C9311962C935C -:1074C00062E0C801CF5BDD4F2883C154D240F7DAB8 -:1074D000F80182839383CF5BDD4F2881C154D24072 -:1074E0002C5F20931A2A60E270E0C80195D97C01D4 -:1074F0004EC380913A2A811143C1B090392AF5E0F8 -:10750000FB1580F023E0B216C8F531E03B1598F08A -:1075100082E5F801808382E08093392A37E0E32E08 -:10752000F12C30C188E08B1508F09FC0AAE0BA1694 -:1075300009F4EAC025C16331710508F4AFC0C80180 -:1075400027DA7C01BC01C80150DA882319F1B701A0 -:10755000C801D0D9D80111968C91119790E0982F3D -:1075600088272C91822B80932B2A90932C2A83E9B5 -:107570008C9380E211968C9383E0B0C0C80108DA46 -:107580007C01BC01C80131DA882321F0B8E0EB1698 -:10759000F10488F41092392AC701089667E070E078 -:1075A0000E943845462FE091552BF091562BB8019B -:1075B00081EC1995AFC0B701C8019CD9F8012081B1 -:1075C00081818227928189279381892794818913D8 -:1075D00065C08B2D90E00397283889F49C01220F19 -:1075E000331F820F931FFC01E25DF54DD801119608 -:1075F0002D913D914C9120833183428312C0FC0137 -:10760000EE0FFF1F8E0F9F1F9C01225D354DF8016D -:1076100080819181A281B381F90180839183A283CA -:10762000B38345E050E0B801C80102960E94F745D7 -:10763000F3E0BF1629F024E0B21621F087E903C079 -:1076400083E901C085E9D8018C9380E711968C937A -:1076500067E0C80134DAF8018783908783E08B0DF7 -:107660008093392A68E470E087C069307105B0F012 -:10767000C8018ED97C01BC01C801B7D9811111C0E4 -:10768000C701089667E070E00E943845462FE091F8 -:10769000552BF091562BB80181EC19951092392A8F -:1076A00039C0B701C80126D963E0C80108DA7C01F6 -:1076B000892BA1F7D8018C9182FF15C0B8E0BB16C9 -:1076C00091F0E6E0BE1611F087E901C085E9D80126 -:1076D0008C9380E211968C938EEF8B0D8093392AD8 -:1076E00060E170E049C081E080933A2A8B2D90E000 -:1076F0000697982F990F890F8C5F8093382AF8018D -:10770000808180932D2A3EC06115710531F481E09E -:107710008093392A0E94882833C0C80139D97C0156 -:10772000BC01C80162D981110FC0C701089667E08A -:1077300070E00E943845462FE091552BF091562B72 -:10774000B80181EC199508C0B701C801D3D863E02E -:10775000C801B5D9892BD9F282ECD8018C9361E0AC -:10776000C801ADD9F801818392838AE08093392AD8 -:1077700010923A2A68E170E0C8014ED87C0102C03C -:10778000E12CF12C80913A2A882309F400C28091DF -:10779000392A9AEF980F933008F04CC0D801FC902A -:1077A000F5FAFF24F0F8E1EEAE2EEFE0BE2EE12C6C -:1077B00047E650E0B501CE0101960E94C0458B819D -:1077C000882349F029813A8180912B2A90912C2A93 -:1077D00028173907B9F48D81882329F09C8180917D -:1077E0002D2A98130FC08F89882311F0FF2051F0A4 -:1077F000E0911B2A81E08E0F80931B2AF0E0E45E6B -:10780000F54DE082E394B7E6AB0EB11CEFE0EE126B -:10781000CFCFFF2009F493C080EED8018C9380E88D -:1078200011968C9362E0C8014AD9F8018283938350 -:1078300089E0A6C0893009F082C0B601C801A8D885 -:107840007C01BC01C801D1D881110FC0C7010896C5 -:1078500067E070E00E943845462FE091552BF0918B -:10786000562BB80181EC1995BEC0B701C80142D8AA -:107870006C01D8016C91262F30E073E096958795C6 -:107880007A95E1F702972817390729F46E5FC80146 -:1078900016D9892B69F082ECF801808361E0C80178 -:1078A0000ED9D80111968C93119712969C93A4C06F -:1078B000F12C67E6E62E5801FFEFAF1ABF0A809160 -:1078C0001B2AF816E0F5EF2DF0E0E45EF54D60813F -:1078D000E69EB00111246F51704F47E650E0CE0193 -:1078E00001960E94C0458F89882339F14E8950E066 -:1078F000F801808190E001974817590739F4B501E4 -:10790000CE0106960E94E145892BB9F020911B2AF1 -:10791000422F50E0415051093F2D832F90E08417B2 -:1079200095073CF4FC01E45EF54D818180833F5F67 -:10793000F4CF215020931B2AFA94F394C0CF809166 -:10794000392A9AEF980F9430F0F490911B2A2CE189 -:107950003AE2F9018E2F821B891708F069C08191E4 -:1079600084508230B8F782E0D8018C9380E611967B -:107970008C9362E0C801A3D8F801828393838BE0E3 -:107980008093392AB0CD8B3009F052C0C114D10494 -:1079900009F44CC0B601C8010E94C8347C01BC0186 -:1079A000C80123D881110FC0C701089667E070E0B5 -:1079B0000E943845462FE091552BF091562BB80187 -:1079C00081EC19950EC0B701C8010E947A3453E0CA -:1079D000969587955A95E1F7682FC80170D8892B3D -:1079E00099F010921B2A82ECD8018C9361E0C801B7 -:1079F00066D8F801818392838AE08093392A1092B5 -:107A00003A2A68E170E071CDD80113968C918823F1 -:107A100031F0813059F480931B2A85E004C081E065 -:107A200080931B2A84E080931C2A02C010921B2A98 -:107A300080911B2A811103C06CEE70E213C081306B -:107A4000A9F460911C2AB7E66B9FB0011124685F0E -:107A50007F4E40E450E0CE0101960E94C045BE0139 -:107A60006F5F7F4F85E60E94C02068C0912C80E048 -:107A700090E000E010E027E6822E7E013FEFE31A5F -:107A80003DEFF30A3FEFC32E30E2D32EA12C42E0AC -:107A9000B42E20911B2A921680F50130E2E01E07D9 -:107AA00020F0081B190BF12C2EC0E92DF0E0E45E4C -:107AB000F54D6081869EB0011124685F7F4E40E4E1 -:107AC00050E0C7010E94C045FF92EF92DF92CF9233 -:107AD000C501801B910B9F938F9381E090E08C0FE9 -:107AE0009D1F800F911F9F938F930E942146080F27 -:107AF000191F9394CDBFDEBFCCCF0130A2E01A078F -:107B000080F6FF24F394EDEFFFEFEC0FFD1FE00F85 -:107B1000F11F8EE28083EEEFFFEFEC0FFD1FE00F11 -:107B2000F11F1082BE016F5F7F4F85E60E94C0206B -:107B3000F11004C086E091E20E946A1788E691E2A3 -:107B40000E946A1762E070E08BE29AE20E94DE20F7 -:107B50008FE691E20E946A176091382A70E08EE207 -:107B60009AE20E94DE2085E791E20E946A1761E0B6 -:107B700070E08DE29AE20E94DE201092D9291092E4 -:107B80001B2A0E94512110923A2AE12CF12CC701A4 -:107B9000CF5BDD4FCDBFDEBFDF91CF911F910F9146 -:107BA000FF90EF90DF90CF90BF90AF909F908F901D -:107BB0000895FF920F931F93CF93DF93CDB7DEB756 -:107BC000EA97CDBFDEBF0FEA1EE288E0F82EF00E86 -:107BD00091D2F80181938F01FE12FACF0E941E18F4 -:107BE00004D3882309F4F7C08091AF2E9091B02E72 -:107BF000953009F46FC030F4913069F168F093303A -:107C000051F1E9C0983009F4C2C0993009F4C8C0F4 -:107C1000963009F0E0C072C0803891F0823809F0E7 -:107C2000DAC08091B32E8F7085D2E091B92EF09199 -:107C3000BA2E118112FB112710F980E07BD206C009 -:107C40001091AB2E8091AC2E81111260E8D2812F61 -:107C500061D280E0A1C0282F2D7F09F0BCC088230D -:107C600019F0823061F0B7C08091B12E813009F0F7 -:107C7000B2C0933009F080E08093AC2E27C0809191 -:107C8000B12E811123C0E091B32E1E2F1F7009F475 -:107C9000A2C0812F4FD28091B02E833011F4EBD24D -:107CA00015C0E091B92EF091BA2E81818B7F81832E -:107CB00024E8129FF0011124E350F14D1082E0916D -:107CC000B92EF091BA2E80818E7F808380E032D2EF -:107CD000A6D264C081117FC01091B12E1F779FD2B0 -:107CE000A1D35DD28823E9F31093C304111102C01C -:107CF00082E001C083E08093AE2E6DC08058823058 -:107D000008F069C08091B12E9091B22E8C3DE3E0D5 -:107D10009E0761F583E08A838AE389834FB7F894ED -:107D2000DE01139620E038E052E05093CA01E32FC1 -:107D3000F0E0E4911092CA0120FF03C0E295EF70D9 -:107D40003F5FEF708E2F90E0EA3010F0C79601C0D1 -:107D5000C0968D939D932F5F2C3139F74FBF5FD223 -:107D60006AE370E0CE010196A3D00FC0AE014F5F71 -:107D70005F4F6091B32E0E94120C8C01892B59F138 -:107D80004ED2B80189819A810FD1A5D124C0803803 -:107D900011F545D28091AA2EBDD184D143D31BC009 -:107DA000811119C08091B12E8230A8F438D280910F -:107DB000B12E8093AA2E36D38091AA2E811106C0AF -:107DC0008091C304811102C081E001C084E08093EE -:107DD000AE2E0E941A1809D2882311F020D24BD25D -:107DE000EA96CDBFDEBFDF91CF911F910F91FF903B -:107DF00008950895CF938091AE2E882351F0C091BD -:107E0000BB2E80E097D1F1D18111D3DE8C2FCF91A1 -:107E100091C1CF910895CF92DF92EF92FF920F938D -:107E20001F93CF93DF93EC018B017A0111D3811162 -:107E300036C0E114F10439F0F70180819181081B0B -:107E4000190BC80FD91FC12CD12C0115110531F107 -:107E50008091B72E9091B82EFC01EF5BFF4F2081EF -:107E600031978081281790F01DD1C4DFE114F1040F -:107E700049F0F70180819181C80ED91EC082D1825C -:107E800085E00DC0E5D2882301F309C0899142D174 -:107E900001501109FFEFCF1ADF0AD7CF80E0DF9141 -:107EA000CF911F910F91FF90EF90DF90CF900895A9 -:107EB000DF92EF92FF920F931F93CF93DF93D82F10 -:107EC000C92F8B018091BB2E806834D12091B52EB3 -:107ED0003091B62E2017310728F00115110519F43D -:107EE000E1D001C08901ED2EFC2ED12C0115110528 -:107EF00009F440C08091AE2E811102C082E04CC0D6 -:107F0000853011F483E048C070D1882311F081E0FE -:107F100043C051D181113CC042D1882339F3209113 -:107F2000BB2E8091B72E9091B82EFC0127FF05C083 -:107F3000EF5BFF4FC081D0E013C0E05CFF4FC0811A -:107F400031968081D0E0C81BD1090AC0C830D10564 -:107F500050F4F70181917F01DDD001501109219684 -:107F60000115110599F7DD24D394289709F0D12C38 -:107F700099D0BCCFD110BECF0BC08091AE2E88233C -:107F800009F4BCCF853009F4BDCF2FD18111BFCF0B -:107F900012D1882391F380E0DF91CF911F910F914F -:107FA000FF90EF90DF900895DF92EF92FF920F9392 -:107FB0001F93CF93DF93D82FC92F8B018091BB2EB6 -:107FC0008068B8D02091B52E3091B62E2017310799 -:107FD00028F00115110519F465D001C08901ED2EB5 -:107FE000FC2ED12C0115110509F442C08091AE2E52 -:107FF000811102C082E04EC0853011F483E04AC096 -:10800000F4D0882311F081E045C0D5D081113EC065 -:10801000C6D0882339F32091BB2E8091B72E909142 -:10802000B82EFC0127FF05C0EF5BFF4FC081D0E0F9 -:1080300015C0E05CFF4FC08131968081D0E0C81B45 -:10804000D1090CC0C830D10560F4F701849162D029 -:10805000FFEFEF1AFF0A01501109219601151105D2 -:1080600089F7DD24D394289709F0D12C1BD0BACFFF -:10807000D110BCCF0BC08091AE2E882309F4BACFAB -:10808000853009F4BBCFB1D08111BDCF94D0882306 -:1080900091F380E0DF91CF911F910F91FF90EF90CE -:1080A000DF900895E091B92EF091BA2EA091B72EED -:1080B000B091B82EAF5BBF4F8C9190E082839383D9 -:1080C00080818D798083E091B72EF091B82EEF5B9F -:1080D000FF4F10820895E091B92EF091BA2E808161 -:1080E0008D798083E091B72EF091B82EEF5BFF4F32 -:1080F000108208958091B72E9091B82EFC01EF5B0D -:10810000FF4F208131E0320F3083FC01E20FF11D7F -:10811000808108952091B72E3091B82EF901EF5B40 -:10812000FF4F908141E0490F4083F901E90FF11DB4 -:10813000808308958093BB2E482F4F7050E060914C -:10814000C6047091C7049A0194E0220F331F9A95D8 -:10815000E1F7E4E887FF11C0E49FC001E59F900DBF -:1081600011248250914D8093B72E9093B82EC9015F -:1081700008969B01280F391F0DC0E49FC001E59FA1 -:10818000900D11248454914D8093B72E9093B82E66 -:10819000260F371F2093B92E3093BA2E0895809161 -:1081A000BB2E8068C7DFE091B92EF091BA2E808196 -:1081B0008695817008958091BB2E8F77BBDFA0914B -:1081C000B92EB091BA2E8C9185FF0DC0E091B72EDB -:1081D000F091B82E12968D919C911397E05CFF4F11 -:1081E000808381E0089580E008958091BB2E8F7791 -:1081F000A1DFA091B92EB091BA2E8C9184FF0DC051 -:10820000E091B72EF091B82E12968D919C91139714 -:10821000E05CFF4F808381E0089580E008958091C5 -:10822000BB2E8F7787DFE091B92EF091BA2E808137 -:108230008D788083E091B92EF091BA2E8081816093 -:108240008083E091B72EF091B82EEF5BFF4F108244 -:108250008091BB2E80686EDFE091B92EF091BA2E2E -:10826000808181608083E091B72EF091B82EEF5B22 -:10827000FF4F10820895E091B92EF091BA2E8181BE -:1082800084608183E091B92EF091BA2E8181807C47 -:10829000803459F48091BB2E80584CDFE091B92E88 -:1082A000F091BA2E81818460818308951F93CF93CA -:1082B000DF931F921F92CDB7DEB7182F4A836983D1 -:1082C00039DFE091B92EF091BA2E1182E091B92EEA -:1082D000F091BA2E812F881F8827881F880F8083EE -:1082E000E091B92EF091BA2E69816183E091B92EA7 -:1082F000F091BA2E128213822091B72E3091B82EAF -:1083000024833583110F110B4A814123F901E05C6D -:10831000FF4F40833196108281E00F900F90DF91E4 -:10832000CF911F910895AF92BF92CF92DF92EF92BB -:10833000FF920F931F93CF93DF93A62E8C017C01A6 -:1083400084E0E80EF11CB12CBA1409F443C0F80122 -:10835000D081DD23C1F1C180D280F70131978081C6 -:10836000F7019081923010F498E001C098E128E084 -:1083700030E0C0E02C153D0520F4CF5F220F331F05 -:10838000F9CFC92B9D2F9F70963010F080E023C04D -:10839000CF7EF1E4CF16D104C8F7882321F08130D5 -:1083A00021F4C06C0AC0C06403C0C068811105C05C -:1083B0004C2D6C2F80E88D0F79DF4C2D6C2F8D2F7D -:1083C00075DF882319F3B3940B5F1F4F85E0E80E28 -:1083D000F11CBACF81E0DF91CF911F910F91FF90F7 -:1083E000EF90DF90CF90BF90AF90089580E090E045 -:1083F000E091C604F091C7049C0144E0220F331FB2 -:108400004A95E1F7E20FF31F11864091C60450919F -:10841000C704FA01E20FF31F11820196863091051D -:1084200039F708958091AF2E87FF0DC0C4DE81110A -:1084300005C08091AE2E8111F9CF09C04CCE80913C -:10844000AE2E882321F0ABDE8823C9F32BCE08950E -:108450000F931F93CF93E091C604F091C704E05AA5 -:10846000FF4F00811181C4E68091BB2E87FF0AC0B7 -:1084700096DE811105C08091AE2E811105C021C00C -:1084800080E024C098DEF5CF8530E9F0E091B92E88 -:10849000F091BA2E818182FD18C0E091C604F0915E -:1084A000C704E05AFF4F8081918180179107E1F264 -:1084B0002FEF2C0FCC2319F08C01C22FD5CF84E0E5 -:1084C00005C082E003C083E001C081E0CF911F912D -:1084D0000F91089563D069D0E0ECF4E081818E7F44 -:1084E000818380818F7780831092AD2E0895CF9302 -:1084F000DF93E0E4F0E014828481836084834ED0D3 -:1085000054D0C0ECD4E088818F77888388818068DC -:1085100088831092AE2E1092AA2E1092AC2E10923A -:10852000AB2E88818064888348E068E480E8BEDE02 -:1085300048E068E480E0BADE8885806488878981C5 -:1085400081608983DF91CF910895CF93DF933FB707 -:10855000F894C0ECD1E022E02A87EAE1F0E0E4916F -:10856000A0ECB4E0DA96EC93DA97EBE1F0E0E4917A -:10857000DB96EC93DB971A8685ED91E38E7F16965A -:108580008D939C93179785E18C9318962C933FBFFE -:1085900081E08093AD2EDF91CF91A9CFE0ECF4E0A4 -:1085A00080858370808711860895E0ECF4E08FEF7A -:1085B0008287848708951F920F920FB60F9211241D -:1085C00008B60F9218BE09B60F9219BE0BB60F92DD -:1085D0001BBE2F933F934F935F936F937F938F9324 -:1085E0009F93AF93BF93EF93FF938091CA0487FF4C -:1085F00008C08091C80487FF04C080E88093CA0443 -:10860000F8DB8091CA0486FF07C080E48093CA0427 -:108610001092AE2E0E9409188091CA0485FF14C0E2 -:1086200080E28093CA048091AA2E882311F084E00E -:1086300007C08091C304811102C081E001C083E0C2 -:108640008093AE2E0E94F8178091CA0484FF14C054 -:1086500080E18093CA0482E08093AE2E1092AA2E0D -:108660001092C304C3DE48E068E480E81FDE48E0FF -:1086700068E480E01BDEBDDBFF91EF91BF91AF911D -:108680009F918F917F916F915F914F913F912F912A -:108690000F900BBE0F9009BE0F9008BE0F900FBE3B -:1086A0000F901F901895CF93DF93EC01FC0170960B -:1086B0008BE0DF011D928A95E9F782E08C83898740 -:1086C00083E08E8761E0CE0101962DDE882361F084 -:1086D00061E0CE01069627DE882331F061E0CE010D -:1086E0000B96DF91CF911FCE80E0DF91CF9108955F -:1086F0000F931F93CF93DF932091AE2E2430E1F49C -:10870000FC010489158926893789012B022B032B4B -:1087100099F0EB0181810EDDFE0101900020E9F767 -:108720003197BF016C1B7D0B40E050E0CE01DF9123 -:10873000CF911F910F916FCB82E0DF91CF911F916D -:108740000F9108950F931F93CF93DF93FC018091B6 -:10875000AE2E8430A9F484899589A689B789892B9E -:108760008A2B8B2B69F08A01EB018181E3DC40E0ED -:1087700050E0B801CE01DF91CF911F910F914BCB0B -:1087800082E0DF91CF911F910F910895CF93FC016B -:108790008091AE2E843001F584899589A689B789A8 -:1087A000892B8A2B8B2BC1F0C62F8181C3DC2091B2 -:1087B000B72E3091B82EF901EF5BFF4F90813197C2 -:1087C0008081981720F48C2FA5DC80E006C06ADC3D -:1087D0003FDE8823C1F301C082E0CF910895CF939B -:1087E000DF932091AE2E243091F5FC014489558908 -:1087F00066897789452B462B472B49F181819ADC85 -:108800008091BB2E2091B72E3091B82EF90187FFB1 -:1088100005C0EF5BFF4F808190E008C0E05CFF4F38 -:1088200080813196408190E0841B9109892B69F009 -:10883000F901EF5BFF4FD0813197C08133DCDC174A -:1088400020F006DE811104C02DDC80E001C082E052 -:10885000DF91CF910895CF93DF932091AE2E2430F6 -:1088600099F4FC014489558966897789452B462B03 -:10887000472B51F0EC0181815DDC91DC882321F0F4 -:10888000CE01DF91CF91ABCFDF91CF910895CF9300 -:10889000DF932091AE2E243019F08FEF9FEF46C06A -:1088A000FC014489558966897789452B462B472BDE -:1088B000A1F386813FDC7FDC882379F38091BB2E96 -:1088C0002091B72E3091B82EF90187FF05C0EF5BDC -:1088D000FF4F808190E008C0E05CFF4F80813196BF -:1088E000208190E0821B9109892B21F003DCC82FA5 -:1088F000D0E002C0CFEFDFEF2091BB2E8091B72EEA -:108900009091B82EFC0127FF05C0EF5BFF4F20813F -:1089100030E008C0E05CFF4F20813196808130E07C -:10892000281B3109232B09F4D6DBCE01DF91CF912F -:1089300008950895FF920F931F93CF93DF93EC0157 -:1089400054DC882309F48EC0888190E02091B32EF6 -:108950003091B42E2817390709F084C08091B02EC9 -:10896000813259F018F4803249F17CC0823209F426 -:1089700057C0833209F467C075C08091AF2E813A29 -:1089800009F070C04CDC0BDC8823E9F38C89FD888E -:108990000E891F89BFDB8F2DBDDB802FBBDB812FB5 -:1089A000B9DB888DB7DB898DB5DB8A8DB3DB7ADBEC -:1089B000DF91CF911F910F91FF9034CD8091AF2E19 -:1089C000813209F04FC02BDCF6DB811105C08091AC -:1089D000AE2E8111F9CF46C08DDB082F8BDB182F0F -:1089E00089DBF82E87DB4F2D50E060E070E0BA01A4 -:1089F00055274427782B402B512B4C8B5D8B6E8B4E -:108A00007F8B78DB888F76DB898F74DB8A8F63DBE3 -:108A100009DDCE01DF91CF911F910F91FF9089CF9A -:108A20008091AF2E8132F1F4FADBFCDC8091B12E23 -:108A30009091B22E888B998BCE01DF91CF911F91AF -:108A40000F91FF9076CF8091AF2E813259F4E7DB02 -:108A5000E9DC6091B12ECE01DF91CF911F910F9192 -:108A6000FF9067CFDF91CF911F910F91FF900895F5 -:108A7000AA1BBB1B51E107C0AA1FBB1FA617B70744 -:108A800010F0A61BB70B881F991F5A95A9F7809560 -:108A90009095BC01CD010895B7FF04C003D0821B9F -:108AA000930B089509D0A59F900DB49F900DA49F9E -:108AB000800D911D11240895A29FB001B39FC001A4 -:108AC000A39F700D811D1124911DB29F700D811DFA -:108AD0001124911D08958F929F92AF92BF92CF92D1 -:108AE000DF92EF92FF92CF93DF93EC01688179815F -:108AF0008A819B81611571058105910521F464E2EC -:108B000079ED8BE597E02DE133EF41E050E0E2D6DF -:108B100049015A019B01AC01A7EAB1E4C3DF6B0133 -:108B20007C01ACEEB4EFA5019401B8DFDC01CB0110 -:108B30008C0D9D1DAE1DBF1DB7FF03C00197A10980 -:108B4000B04888839983AA83BB839F77DF91CF91B5 -:108B5000FF90EF90DF90CF90BF90AF909F908F905D -:108B60000895B9CF80E290E2B6CFA0E0B0E0809364 -:108B7000202090932120A0932220B09323200895B9 -:108B8000FB01DC0102C005900D9241505040D8F726 -:108B90000895FB01DC018D91059080190110D9F336 -:108BA000990B0895FB01DC014150504048F00590BD -:108BB0000D920020C9F701C01D9241505040E0F7CE -:108BC0000895FB01DC0104C08D910190801921F40E -:108BD00041505040C8F7881B990B0895FB01DC01F8 -:108BE00002C001900D9241505040D8F70895681787 -:108BF000790768F4FB01DC01E40FF51FA40FB51F32 -:108C000002C002900E9241505040D8F70895E6CF2E -:108C1000DC0101C06D9341505040E0F70895FC0124 -:108C20008191861721F08823D9F7992708953197E4 -:108C3000CF010895FB01DC0101900D920020E1F7C6 -:108C400008950F931F93CF93DF93CDB7DEB72E9781 -:108C5000CDBFDEBF0E891F89888D998D26E02C83BC -:108C600009831A8397FF02C080E090E801978D8303 -:108C70009E83AE01445E5F4F6A8D7B8DCE0101966F -:108C800067D04D815E8157FD0AC02F81388542171C -:108C900053070CF49A01F801E20FF31F10822E968D -:108CA000CDBFDEBFDF91CF911F910F9108950F933C -:108CB0001F93CF93DF93CDB7DEB72E97CDBFDEBF27 -:108CC0000E891F89888D998D2EE02C8309831A8344 -:108CD00097FF02C080E090E801978D839E83AE01EC -:108CE000445E5F4F6A8D7B8DCE01019631D04D8100 -:108CF0005E8157FD0AC02F813885421753070CF457 -:108D00009A01F801E20FF31F10822E96CDBFDEBF4D -:108D1000DF91CF911F910F910895CF93DF93CDB73E -:108D2000DEB72E97CDBFDEBF85E08C838C899D8911 -:108D300089839A83AE01485E5F4F6E897F89CE0139 -:108D400001968FD32E96CDBFDEBFDF91CF910895D0 -:108D50002F923F924F925F926F927F928F929F924B -:108D6000AF92BF92CF92DF92EF92FF920F931F9339 -:108D7000CF93DF93CDB7DEB72C97CDBFDEBF7C019D -:108D80006B018A01FC0116821782838181FFB0C1C9 -:108D9000CE0101964C01F7019381F60193FD859177 -:108DA00093FF81916F01882309F49EC1853239F4C4 -:108DB00093FD859193FF81916F01853221F4B70175 -:108DC00090E0D6D4E8CF512C312C20E02032A0F412 -:108DD0008B3269F030F4803259F0833269F42061CB -:108DE0002CC08D3239F0803339F4216026C02260E6 -:108DF000246023C0286021C027FD27C030ED380F34 -:108E00003A3078F426FF06C0FAE05F9E300D112458 -:108E1000532E13C08AE0389E300D1124332E206269 -:108E20000CC08E3221F426FD5FC1206406C08C3652 -:108E300011F4206802C0883641F4F60193FD859153 -:108E400093FF81916F018111C1CF982F9F7D955420 -:108E5000933028F40C5F1F4FFFE3F9830DC0833676 -:108E600031F0833771F0833509F057C021C0F80124 -:108E7000808189830E5F1F4F44244394512C5401F9 -:108E800014C03801F2E06F0E711CF801A080B180AF -:108E900026FF03C0652D70E002C06FEF7FEFC501B4 -:108EA0002C871DD42C0183012C852F77222E16C0F0 -:108EB0003801F2E06F0E711CF801A080B18026FF2E -:108EC00003C0652D70E002C06FEF7FEFC5012C87F6 -:108ED000FBD32C012C852068222E830123FC19C092 -:108EE000832D90E048165906A0F4B70180E290E087 -:108EF0003FD43A94F5CFF50127FC859127FE819167 -:108F00005F01B70190E034D431103A94F1E04F1A88 -:108F100051084114510479F7DEC0843611F08936C6 -:108F200031F5F80127FF07C060817181828193814B -:108F30000C5F1F4F08C060817181072E000C880BE9 -:108F4000990B0E5F1F4F2F76722E97FF09C09095D9 -:108F50008095709561957F4F8F4F9F4F2068722E3F -:108F60002AE030E0A40155D4A82EA81843C08537C4 -:108F700029F42F7EB22E2AE030E025C0F22FF97FAF -:108F8000BF2E8F36C1F018F4883579F0ADC0803728 -:108F900019F0883721F0A8C02F2F2061B22EB4FE1F -:108FA0000DC08B2D8460B82E09C024FF0AC09F2FEE -:108FB0009660B92E06C028E030E005C020E130E020 -:108FC00002C020E132E0F801B7FE07C06081718184 -:108FD000828193810C5F1F4F06C06081718180E0A8 -:108FE00090E00E5F1F4FA40114D4A82EA818FB2DEB -:108FF000FF777F2E76FE0BC0372D3E7FA51450F4F1 -:1090000074FE0AC072FC08C0372D3E7E05C0BA2C23 -:10901000372D03C0BA2C01C0B52C34FF0DC0FE01A2 -:10902000EA0DF11D8081803311F4397E09C032FFD1 -:1090300006C0B394B39404C0832F867809F0B39428 -:1090400033FD12C030FF06C05A2CB31418F4530C71 -:109050005B18B32CB31460F4B70180E290E03C8756 -:1090600087D3B3943C85F6CFB31410F43B1801C0FA -:10907000312C34FF11C0B70180E390E03C8778D3F6 -:109080003C8532FF16C031FD03C088E790E002C086 -:1090900088E590E0B7010CC0832F867851F031FF4E -:1090A00002C08BE201C080E237FD8DE2B70190E0A3 -:1090B0005FD3A51430F4B70180E390E059D35A94FC -:1090C000F8CFAA94F401EA0DF11D8081B70190E078 -:1090D0004FD3A110F6CF332009F45DCEB70180E263 -:1090E00090E046D33A94F7CFF7018681978102C08A -:1090F0008FEF9FEF2C96CDBFDEBFDF91CF911F91F9 -:109100000F91FF90EF90DF90CF90BF90AF909F9026 -:109110008F907F906F905F904F903F902F90089529 -:1091200020FD09C0FC0123FD05C022FF02C073839E -:10913000628351834083089544FD10C046FD10C0F2 -:10914000DB01FC01AA0FBB1FEE1FFF1F1094D1F71C -:109150006A0F7B1F8E1F9F1F31E003C033E001C0E9 -:1091600034E0660F771F881F991F3150D1F7620FC7 -:10917000711D811D911D08950F931F93CF93DF9350 -:109180008C01C801B7D2EC0197FD06C08AD2892BA9 -:10919000C1F7B801CE0124D3CE01DF91CF911F9149 -:1091A0000F9108958F929F92AF92BF92CF92DF92CC -:1091B000EF92FF920F931F93CF93DF931F92CDB740 -:1091C000DEB78C01C62E7A01298394D2AC015527D3 -:1091D00029814B32510521F04D32510561F420684F -:1091E000CA94C11002C080E06FC0C801298382D236 -:1091F000298197FDF8CF322F3D7FD32E322F307348 -:1092000039F5803329F5BB24BA94BC0C09F449C064 -:10921000C80129836FD2298197FD43C0382F3F7D34 -:10922000383561F48D2D8264D82ECA94CA94CC202E -:10923000C1F1C8015FD297FF0BC033C026FF04C045 -:109240002D2D2260D22E03C03D2D3261D32ECB2C8A -:10925000812C912C540120ED280F283078F0D4FE79 -:1092600003C0B801BDD21AC02A3040F0D6FEF9CFF3 -:109270002F7D3FEE320F3630A0F727504D2DC50120 -:10928000B4015ADF4B015C018D2D8260D82ECA9447 -:10929000CC2051F0C8012ED297FFDDCFD1FC04C005 -:1092A000A2CF812C912C5401D7FE08C0B094A09479 -:1092B00090948094811C911CA11CB11C2D2DB50192 -:1092C000A401C7012DDF81E00F90DF91CF911F91A5 -:1092D0000F91FF90EF90DF90CF90BF90AF909F9055 -:1092E0008F9008956F927F928F929F92AF92BF92CC -:1092F000CF92DF92EF92FF920F931F93CF93DF9362 -:10930000CDB7DEB7A197CDBFDEBF5C017A01CE013C -:1093100001966C0180E2F60111928A95E9F7F50158 -:10932000838040E050E0912C712C70E0A1E0B0E02F -:10933000F90183FC859183FE81918F01982F9F0114 -:10934000811103C080E090E07AC08E3519F4411598 -:10935000510549F1E72FF0E0E417F5073CF48D35AE -:1093600059F18D3219F4772001F103C0711001C059 -:10937000982E892F8695869586958601080F111D52 -:10938000892F87703D0101C0660C8A95EAF7F801C4 -:10939000808186298083991559F0991510F49F5F73 -:1093A000E8CF9150E6CF71E004C07724739401C0F8 -:1093B000712C4F5F5F4FBCCF772019F08E81806298 -:1093C0008E83711103C09924939416C0F6019E01F7 -:1093D0002F5D3F4F808180958193E217F307D1F78E -:1093E000F2CFE114F10429F0F7018083C70101965F -:1093F0007C016150912CE9F0C50169A37BD169A181 -:1094000097FD15C0282F269526952695F601E20F83 -:10941000F11D208130E0AC014770552702C0359521 -:1094200027954A95E2F720FDDCCFB501D9D19110FF -:1094300089CFE114F10411F0F7011082C801A1965F -:10944000CDBFDEBFDF91CF911F910F91FF90EF90C5 -:10945000DF90CF90BF90AF909F908F907F906F9054 -:1094600008954F925F927F928F929F92AF92BF9298 -:10947000CF92DF92EF92FF920F931F93CF93DF93E0 -:109480001F92CDB7DEB76C012B015A01FC01168289 -:109490001782712CF601F380F201F3FC8591F3FE43 -:1094A0008191382F2F01882309F4E5C090E039839A -:1094B000F8D03981892B19F0C6015EDEEBCF353249 -:1094C00041F4F201F3FC3591F3FE31912F01353275 -:1094D00059F4C60139830ED1398197FDCAC03817B6 -:1094E000C9F2B6017DD1C7C03A3239F4F3FC3591E7 -:1094F000F3FE31912F0151E001C050E0420110E034 -:1095000020ED230F2A3088F45260612F70E080E054 -:1095100090E040E2598310DE162FF401F3FC359100 -:10952000F3FE31914F015981EBCF052F232F2401F9 -:1095300051FF03C0111102C09EC01FEF383619F051 -:109540003C3659F011C0F401F3FC2591F3FE219152 -:109550002F01283649F4052F08600460F201F3FC5E -:109560002591F3FE21912F01222309F484C0622F5B -:1095700070E08AEE95E129839CD02981892B09F43A -:109580007AC000FD07C0F501E080F180C5010296B8 -:109590005C0102C0E12CF12C2E3649F4F601468123 -:1095A000578160E070E0202FC701BADD73CF23360A -:1095B00089F401FF11E0C6019DD097FD5AC0E11466 -:1095C000F10429F0F7018083C70101967C01115055 -:1095D00091F74BC02B3551F49201A701612FC601C1 -:1095E00081DE2C01892B09F040C03AC0C6012983D5 -:1095F000C3DD298197FD3DC02F3641F128F4243683 -:1096000019F1293631F124C0233769F02537E1F00B -:109610001FC0E114F10429F0F7018082C70101960F -:109620007C01115059F0C60165D04C0197FD06C070 -:1096300038D0892B71F3B601C401D2D0E114F10402 -:10964000A1F0F701108211C0006203C0006101C0E7 -:109650000064202FA701612FC601A4DD811105C080 -:10966000F6018381807329F406C000FD13CF739443 -:1096700011CF772019F0872D90E002C08FEF9FEF78 -:109680000F90DF91CF911F910F91FF90EF90DF909E -:10969000CF90BF90AF909F908F907F905F904F90B2 -:1096A0000895911114C1803219F089508550D0F776 -:1096B0000895FC010590061621F00020D9F7C0019D -:1096C00008953197CF010895FC01059061507040D5 -:1096D0000110D8F7809590958E0F9F1F0895FC017B -:1096E0006150704001900110D8F7809590958E0FD1 -:1096F0009F1F0895CF93DF93EC012B8120FF33C090 -:1097000026FF0AC02F7B2B838E819F8101968E833B -:109710009F838A8190E029C022FF0FC0E881F981F0 -:109720008081082E000C990B009719F420622B837E -:109730001AC03196E883F9830EC0EA85FB85199536 -:1097400097FF09C02B81019611F080E201C080E1F2 -:10975000822B8B8308C02E813F812F5F3F4F2E834A -:109760003F83992702C08FEF9FEFDF91CF9108953C -:109770000F931F93CF93DF93FB01238121FD03C040 -:109780008FEF9FEF28C022FF16C0468157812481AA -:1097900035814217530744F4A081B1819D012F5FA9 -:1097A0003F4F208331838C93268137812F5F3F4F3A -:1097B0002683378310C0EB01092F182F0084F18511 -:1097C000E02D1995892BE1F68E819F8101968E837C -:1097D0009F83812F902FDF91CF911F910F9108953B -:1097E000FB01238120FF12C026FD10C08F3F3FEFF9 -:1097F000930761F082832F7D206423832681378144 -:109800002150310926833783992708958FEF9FEFE1 -:109810000895FA01AA27283051F1203181F1E89406 -:109820006F936E7F6E5F7F4F8F4F9F4FAF4FB1E053 -:109830003ED0B4E03CD0670F781F891F9A1FA11D4E -:10984000680F791F8A1F911DA11D6A0F711D811D4F -:10985000911DA11D20D009F468943F912AE0269F14 -:1098600011243019305D3193DEF6CF010895462F73 -:109870004770405D4193B3E00FD0C9F7F6CF462F54 -:109880004F70405D4A3318F0495D31FD40524193BD -:1098900002D0A9F7EACFB4E0A6959795879577957A -:1098A0006795BA95C9F700976105710508959B0101 -:1098B000AC010A2E06945795479537952795BA958A -:1098C000C9F7620F731F841F951FA01D0895992764 -:1098D00088270895052E97FB16F400940FD057FDA6 -:1098E00005D014D007FC02D046F408C0509540952E -:1098F000309521953F4F4F4F5F4F0895909580953C -:10990000709561957F4F8F4F9F4F0895A1E21A2E5A -:10991000AA1BBB1BFD010DC0AA1FBB1FEE1FFF1F13 -:10992000A217B307E407F50720F0A21BB30BE40B63 -:10993000F50B661F771F881F991F1A9469F76095AA -:109940007095809590959B01AC01BD01CF01089564 -:04995000F894FFCFB9 -:1099540000400F0083100000010410000001820881 -:109964000000010000000000000000000000900161 -:1099740001000000000000009C22A322A322AF22C9 -:10998400BB22C522E222F02219231C2320239B257B -:10999400FD24122516252B255C256F259C25000109 -:1099A40000010000000000000001000101010101AC -:1099B400010001000100000001010001010100019A -:1099C400010100000001000001000101000100008C -:1099D4000002020000020002020202000002000073 -:1099E400000404000004000404040400000400084B -:1099F400080800000008000008000808000800002B -:109A04000010100000100010101010000010253578 -:109A14006400546F6F206D616E7920646174612EEF -:109A2400000D0A504152495459204552524F520098 -:109A34000D0A504152495459204F4B00556E6B6EDC -:109A44006F776E206361726420747970652E0025CF -:109A540073206F72200054686572652069732061F9 -:109A640074206C65617374206F6E65206D6F726510 -:109A7400206361726420747970652063616E646927 -:109A8400646174652C206275742074686572652045 -:109A9400776173206E6F7420656E6F7567682074CC -:109AA40065726D696E616C2062756666657220739D -:109AB400706163652E0D0A00415451413A09005505 -:109AC40049443A090053414B3A09004E4F2044415E -:049AD40054410000F9 +:1014B000000000000000000000000000000000002C +:1014C000000000000000000000000000000000001C +:1014D00000000000000000000000000C01000000FF +:1014E00000000000000000000000000000000000FC +:1014F00000496E6E6F766973696F6E2052265400D4 +:10150000004A6577656C00000000000000000000E4 +:1015100000000000000000000000000000000000CB +:1015200000000000000000000000000000000000BB +:1015300000000000000000000000000000000000AB +:10154000000200013801000000000000000000005F +:1015500000000000000000004E6F6B696100000099 +:1015600000000000000000004D4946415245204364 +:101570006C617373696320346B202D20656D756C0D +:101580006174656420283632313220436C61737394 +:101590006963290000000000000000000000000056 +:1015A00000000000000000000800013801000000F9 +:1015B0000000000000000000000000000000004EDD +:1015C0006F6B696100000000000000000000004D2A +:1015D000494641524520436C617373696320346B03 +:1015E000202D20656D756C6174656420283631335B +:1015F00031204E464329000000000000000000009A +:101600000000000000000000000000000000006377 +:1016100064696E6F70737578585B000011241FBE8B +:10162000CFEFCDBFDFE3DEBF00E00CBF18BE19BEB9 +:101630001ABE1BBE11E2A0E0B0E2E8E7FBE900E061 +:101640000BBF02C007900D92A238B107D9F71BBE9D +:1016500022E3A2E8B1E201C01D92AB33B207E1F789 +:101660003BD00C94BA4D25C13BB78BBFFB01879192 +:1016700096913BBF08953BB78BBFCB0142E20D94DF +:10168000F00F3BB70B0143E20D94F00F3BB78BBF5C +:10169000CB0145E20D94F00F3BB746E208C0209124 +:1016A000CF0127FDFCCF22272093CA010895409344 +:1016B000CA0128ED31E0209334003093CB016091D2 +:1016C000C4017091C5018091C60199270895FC015C +:1016D0004093CA01849108950ED10E940D160E9474 +:1016E0008C16C2D21092520684E08093420682E6A3 +:1016F00080938601C1E0C0932606C093210686E050 +:1017000080932206C093310602E0009332061092C5 +:101710002A0613E01093290689E5809380018AE563 +:101720008093810180E480934106809346069091E6 +:10173000B200907F9093B2009091B200926090932B +:10174000B20090E390934106909346068093500632 +:10175000C0934606009345061093410683E18093AB +:10176000010821E030E020932608309327082093D9 +:1017700028083093290810928C08809380081092D2 +:10178000230310922103D8E0D093220381E18093B8 +:10179000200380911E2090911F2080933803909306 +:1017A00039038CE380938203D09380038093830377 +:1017B000D09381036FD10E943718C0D131D7C09325 +:1017C0000002109201020093020210930402C093DF +:1017D0002002D09321020E94D51419D1D2E0C1E198 +:1017E0008091030481FF25C08091010480FDFCCF1E +:1017F000D0930304B8D10E9469181AD70E94081622 +:101800000E949016E0914D2BF0914E2B19950E945D +:101810002A210E94D417E0915C2BF0915D2B8781E7 +:10182000813011F4C0938B298681813011F4C093EB +:101830008A290E943B18BAD7E0914B2BF0914C2B90 +:101840001995E091452BF091462B1995C9CF292F79 +:1018500033272230310559F02330310569F021302A +:101860003105F9F482E190E02AE832E01EC08EE30F +:1018700090E02CE432E019C099278130910541F0C5 +:101880008230910541F0892B61F4E8E4F2E005C073 +:10189000ECE1F2E002C0ECEFF1E0849190E09F0116 +:1018A00004C080E090E020E030E0FA012083318342 +:1018B00008951F920F920FB60F92112408B60F923F +:1018C00018BEFFCF1F920F920FB60F92112408B6C9 +:1018D0000F9218BE8F939F938EB19FB180589F4FE8 +:1018E0008EB99FB99F918F910F9008BE0F900FBE38 +:1018F0000F901F9018958091780083FF0AC088E0B0 +:101900008093780088ED84BF81E0809380000D94FF +:10191000FE008BEC80935200809150008860809391 +:1019200050008091510083FFFCCF82EC80935500E2 +:10193000809150008061809350008091510084FF1D +:10194000FCCF88ED84BF84E0809340001EB81FB8B0 +:1019500081E0809343002FE730E020930A04309326 +:101960000B0420930C0430930D04809300048093A7 +:10197000020480E880930001089588ED84BF81E02F +:1019800080937900089588ED84BF8BE18093800077 +:1019900008958091500082608093500080915100A2 +:1019A00081FFFCCF82E08093CA01EDE1F0E0E49199 +:1019B000E0936200ECE1F0E0E491E09363001092C8 +:1019C000CA0180E8809365008BEB8093660080916C +:1019D0005600897F809356008091560084608093E2 +:1019E0005600809160008160809360000895E0E47B +:1019F000F0E084818E7F8483E0E6F0E080818E7F5A +:101A00008083E0E5F0E080818D7F8083089587E02A +:101A10008093A200789408950895089508950895F4 +:101A200008950895089580E090E008950895089538 +:101A30000F931F93CF93DF931F92CDB7DEB701E4CF +:101A40001BE2D8011296ED91FC91139789831995A9 +:101A50000E946221E0915C2BF0915D2B898185834E +:101A6000B8E18B9FB001112464567D4F48E150E0EE +:101A7000C8010E94D246D801ED91FC911995D80178 +:101A80001696ED91FC9117970F90DF91CF911F91D2 +:101A90000F91199448E150E06CE972E081E49BE217 +:101AA0000E94D246E0915C2BF0915D2B8581C0CFE6 +:101AB0000F931F93E0915C2BF0915D2B8B019C01A8 +:101AC000458168E08CE593E00E9471171F910F91AA +:101AD0000895FF920F931F93CF93DF931F92CDB77B +:101AE000DEB78C019E012F5F3F4FAC0168E08CE5B3 +:101AF00093E00E948917F82E882389F0898198DF66 +:101B0000F80140E08191882319F04F5F4F31D1F700 +:101B1000E091592BF0915A2BB80181E119958F2D45 +:101B20000F90DF91CF911F910F91FF9008959B012E +:101B3000AC0168E08CE593E00C94B01708950C9428 +:101B4000C44608951F93CF93DF93C82FD92F162F24 +:101B5000180F1C1721F00E94C4468993FACFDF9119 +:101B6000CF911F9108950E94C4460E94C4460E94CE +:101B7000C4460C94C446EF92FF920F931F93CF93E9 +:101B8000DF937C0161507109FA018A01020F131F72 +:101B9000DC0140E050E0E017F107F1F06230710540 +:101BA000D8F09191392F32953F703A3010F4305D72 +:101BB00001C0395C3C939F709A3010F4905D01C075 +:101BC000995C9701240F351FE901998312966250A1 +:101BD00071094E5F5F4FDFCF1C92CA01DF91CF9139 +:101BE0001F910F91FF90EF900895CF93DF93EC0139 +:101BF000DA01E0E0F0E04C91442391F111969C91E0 +:101C00001197992339F1E617F70721F180ED840F39 +:101C10008A3020F08FEB840F8630D0F480ED890F6E +:101C20008A3020F02FEB290F263090F4242F30E05B +:101C3000413410F0275331092295207F913410F45C +:101C4000982F01C09753292B299331961296D3CF01 +:101C500080E004C011968C91811102C090E001C017 +:101C6000CF01DF91CF910895E0E6F6E080E1858332 +:101C700082E0868388E085838AE18183E0EAF9E077 +:101C80001682178280EC858388E18483E0E0F1E0AE +:101C9000128A8BE6838B148A158A20EA208F99E0BA +:101CA000918F128E148E158E168E84E0808B12A268 +:101CB0003CE633A314A215A210A611A612A624A7CF +:101CC00095A716A680A308954115510509F449C0AA +:101CD00020E12093660623E02093A0092091A1092A +:101CE00027FFFCCF2091A0097093A0092091A109A2 +:101CF00027FFFCCF2091A0096093A0092091A109A2 +:101D000027FFFCCF2091A00921E0209312018093AE +:101D10001C0190931D0140931401509315011092E2 +:101D2000220182E891E28093280190932901409357 +:101D30002401509325018091100180688093100147 +:101D4000809120018068809320018091100187FD9F +:101D5000FCCF80E3809311018093210180E1809387 +:101D6000650608954115510509F469C020E12093E5 +:101D7000660626E02093A0092091A10927FFFCCF49 +:101D80002091A00920E12093650600000000209327 +:101D9000660622E02093A0092091A10927FFFCCF2D +:101DA0002091A0097093A0092091A10927FFFCCFE1 +:101DB0002091A0096093A0092091A10927FFFCCFE1 +:101DC0002091A0091092120122E831E220931C0117 +:101DD00030931D01409314015093150120E120938D +:101DE000220180932801909329014093240150936C +:101DF000250180911001806880931001809120015D +:101E00008068809320018091100187FDFCCF80E3E2 +:101E1000809311018093210180E180936506E09118 +:101E20005C2BF0915D2B8781863019F481E18093E2 +:101E30008B298681863019F481E180938A2908955F +:101E4000CF92DF92EF92FF92CF93DF93C0905B2B04 +:101E5000D12CE12CF12C8DE0CC0CDD1CEE1CFF1CF8 +:101E60008A95D1F7C114D10481E0E806F10408F0A5 +:101E70004EC080E18093660686E08093A009809141 +:101E8000A10987FFFCCF8091A00980E180936506BE +:101E9000000000008093660682E08093A009809194 +:101EA000A10987FFFCCF8091A0091092A009809121 +:101EB000A10987FFFCCF8091A0091092A009809111 +:101EC000A10987FFFCCF8FEFE81AF80A8091A009DB +:101ED000C0E0D0E1C701B601C7DB8093A0098091C3 +:101EE000A10987FFFCCF8091A0099093A009809160 +:101EF000A10987FFFCCF8091A00982E0C80ED11C08 +:101F0000E11CF11C219731F780E180936506DF9198 +:101F1000CF91FF90EF90DF90CF900895CF92DF9216 +:101F2000EF92FF92CF93DF93C0905B2BD12CE12CEB +:101F3000F12C8DE0CC0CDD1CEE1CFF1C8A95D1F73A +:101F4000C114D10481E0E806F10438F0DF91CF91AB +:101F5000FF90EF90DF90CF9073CF8FEFE81AF80AE1 +:101F6000C1E2D0E0219791F39ADBC701B60183DB90 +:101F700096DB8FEFD81AE80AF80AF4CFCF92DF92F7 +:101F8000EF92FF920F931F93CF93DF93C0905B2B41 +:101F9000D12CE12CF12C8DE0CC0CDD1CEE1CFF1CB7 +:101FA0008A95D1F7C114D10481E0E806F10408F064 +:101FB0004FC080E18093660683E08093A009809102 +:101FC000A10987FFFCCF8091A0091092A009809100 +:101FD000A10987FFFCCF8091A0091092A0098091F0 +:101FE000A10987FFFCCF8FEFE81AF80A8091A009BA +:101FF000C1E2D0E0219749F152DB4EDB50DB00E03B +:1020000010E01092A0098091A10987FFFCCF609198 +:10201000A00970E01092A0098091A10987FFFCCF70 +:102020008091A009782BC8012CDB39DB0E5F1F4F94 +:10203000011581E0180729F7C701B60127DB2FDB5F +:102040008FEFD81AE80AF80AD5CF80E180936506A9 +:10205000E0915C2BF0915D2B8781863019F490E143 +:1020600090938B299681963049F420E120938A2918 +:10207000853059F483E180938B2902C08530D1F3F8 +:10208000953019F483E180938A29DF91CF911F91D4 +:102090000F91FF90EF90DF90CF900895CF92DF9255 +:1020A000EF92FF920F931F934115E0E25E076105E7 +:1020B000710508F06BC06901E12CF12C00E010E221 +:1020C00020E030E0041B150B260B370BC016D106A1 +:1020D000E206F30610F49701860120E120936606DC +:1020E00026E02093A0092091A10927FFFCCF209191 +:1020F000A00920E1209365060000000020936606F9 +:1021000022E02093A0092091A10927FFFCCF209174 +:10211000A0095093A0092091A10927FFFCCF20918D +:10212000A0094093A0092091A10927FFFCCF20918D +:10213000A0091092120122E831E220931C01309391 +:102140001D01009314011093150120E12093220139 +:102150008093280190932901009324011093250175 +:102160008091100180688093100180912001806827 +:10217000809320018091100187FDFCCF80E3809344 +:1021800011018093210180E18093650681E01F9118 +:102190000F91FF90EF90DF90CF900895CF92DF9254 +:1021A000EF92FF920F931F934115E0E25E076105E6 +:1021B000710508F05DC06901E12CF12C00E010E22E +:1021C00020E030E0041B150B260B370BC016D106A0 +:1021D000E206F30610F49701860120E120936606DB +:1021E00023E02093A0092091A10927FFFCCF209193 +:1021F000A0095093A0092091A10927FFFCCF2091AD +:10220000A0094093A0092091A10927FFFCCF2091AC +:10221000A00921E02093120180931C0190931D01DD +:1022200000931401109315011092220182E891E2AB +:102230008093280190932901009324011093250194 +:102240008091100180688093100180912001806846 +:10225000809320018091100187FDFCCF80E3809363 +:1022600011018093210180E18093650681E001C026 +:1022700080E01F910F91FF90EF90DF90CF90089535 +:102280008091CF0187FDFCCF0895FADF8091CF01C7 +:1022900081FF0BC086E38093CA01EBECF1E021E003 +:1022A00030E088ED90E084BF20830895EF92FF92A4 +:1022B0000F931F93CF93DF931F921F92CDB7DEB77B +:1022C0007C018A011092C20169837A83D9DF698116 +:1022D000A62F7A81B72FC701800F911F26E048ED06 +:1022E00050E061E070E0EBECF1E0E816F90689F00F +:1022F000E092C0013F2D3F713093C1012093CA018C +:1023000044BF60833091C4013D933FEFE31AF30A69 +:10231000ECCFC8010F900F90DF91CF911F910F91DB +:10232000FF90EF9008952F923F924F925F926F929D +:102330007F928F929F92AF92BF92CF92DF92EF9255 +:10234000FF920F931F93CF93DF9300D0CDB7DEB7EB +:102350006A01282F2F711C01221A310829836A83F0 +:102360007B8393DF8DDF83E38093CA011092C101E9 +:102370001092C2016A81E62E7B81F72E860185E3E9 +:10238000582E98ED892E912C66246394712C3BEC89 +:10239000A32EBB24B39443E3442E298101151105D8 +:1023A00009F12093C001F70181917F018093C4015D +:1023B0000150110919F02F5F203281F72092C001DE +:1023C000832D8F718093C1015092CA01C401F50120 +:1023D00084BF608290E2290E311C52DF4092CA0114 +:1023E00020E0DCCFC6012396CDBFDEBFDF91CF91C9 +:1023F0001F910F91FF90EF90DF90CF90BF90AF9023 +:102400009F908F907F906F905F904F903F902F9014 +:1024100008951F93CF93DF93CDB7DEB7A097CDBFBD +:10242000DEBF853009F4AEC078F4823081F128F443 +:10243000813009F0EEC010E01BC0833009F453C0B6 +:10244000843009F475C0E5C0883009F4D3C040F485 +:10245000863009F4CDC0873009F0DBC08FDDD9C0EC +:10246000893009F4C9C08A3009F0D3C080D3D1C003 +:102470008091572B181708F0A8C061DBE1E0F0E06D +:10248000EC0FFD1FE10FF11D80831F5FF1CF11E005 +:102490008091572B873009F010E0E091512BF0919B +:1024A000522BCE01019619954091572B31E014170C +:1024B00008F08BC03323A9F0812F90E0E1E0F0E039 +:1024C000EC0FFD1FE80FF91F208131E02F3F09F0CD +:1024D00030E0E1E0F0E0EC0FFD1FE80FF91F2F5FA7 +:1024E00020831F5FE4CFE091512BF091522BCE015E +:1024F000019619958091572B41E0815008F465C0F1 +:102500004423D9F3282F30E0E1E0F0E0EC0FFD1F89 +:10251000E20FF31F908141E09F3F09F040E0E1E0CE +:10252000F0E0EC0FFD1FE20FF31F9F5F9083E5CFFC +:1025300011E08091572B873009F010E0E091512B8A +:10254000F091522BCE01019619954091572B31E015 +:102550001417D8F53323A1F0812F90E0E1E0F0E0EB +:10256000EC0FFD1FE80FF91F208131E0211130E051 +:10257000E1E0F0E0EC0FFD1FE80FF91F2150208390 +:102580001F5FE6CFE091512BF091522BCE010196C7 +:1025900019958091572B41E08150B8F04423E1F325 +:1025A000282F30E0E1E0F0E0EC0FFD1FE20FF31F19 +:1025B000908141E0911140E0E1E0F0E0EC0FFD1F7F +:1025C000E20FF31F91509083E7CFE091532BF091EE +:1025D000542BCE0101961995E091592BF0915A2B6D +:1025E0004091572BBE016F5F7F4F83E1199511C05A +:1025F0005DD30FC025DC0DC080910008813021F42F +:1026000080918C08833019F00E94EE2102C00E9454 +:102610001322A096CDBFDEBFDF91CF911F91089509 +:10262000E0E0F6E080E6828388E1868B858B089582 +:10263000CF93C0910806C095C6FF12C08091842137 +:102640008A3050F08A30E1F4E0915C2BF0915D2B00 +:102650008181DFDE809184218F5F8093842110C08F +:102660008C2F807669F48091842181508A3030F4F7 +:10267000E0915C2BF0915D2B8081CBDE1092842168 +:10268000C5FF12C0809183218A3050F08A30D9F47E +:10269000E0915C2BF0915D2B8381BBDE80918321E7 +:1026A0008F5F809383210FC0C07669F4809183216E +:1026B00081508A3030F4E0915C2BF0915D2B828167 +:1026C000A8DE10928321CF9108959B01AC016BE0AD +:1026D00084E696E045C420E030E090E0F901E80FA0 +:1026E000F91FE55AF44D6383265F3F4F20353105CE +:1026F000A9F708950F931F939B01E0915C2BF09134 +:102700005D2BE80FF11D8A0140816BE084E696E0C5 +:10271000E8D31F910F9108950F931F93CF93DF93E9 +:102720001F92CDB7DEB7082FAB019E012F5F3F4F41 +:102730006BE084E696E0EDD3182F882319F06981C9 +:10274000802FC9DF812F0F90DF91CF911F910F91C3 +:1027500008950895EF92FF920F931F93CF937B01FB +:10276000C42F2EB13FB10091080410910904022B2F +:10277000132B682F83E090E20E94D8446C2F83E0F3 +:1027800090E20E94D844612F83E090E20E94D844F6 +:10279000602F83E090E20E94D8446C2F70E0C70164 +:1027A000CF911F910F91FF90EF905BC408953F92DE +:1027B0004F925F926F927F928F929F92AF92BF9251 +:1027C000CF92DF92EF92FF920F931F93CF93DF93FD +:1027D0007C01E901C0900020D09001209601225098 +:1027E0003843C901A0E0B0E0481759076A077B07E2 +:1027F00008F05CC0E2E0CE1AE0E4DE0A2A013B0108 +:102800004C0E5D1E611C711C481659066A067B063B +:1028100048F0241B350B8E01021B130BE9013324F6 +:10282000339403C000E010E0312C4601A12CB12C00 +:10283000481559056A057B0510F5CA018E5F9F4B47 +:102840002A013B014C0E5D1E611C711C4814590489 +:102850006A047B0428F4AE01BC01C70135DA18C054 +:10286000C41AD50AA601BC01C7012EDAAE014C1963 +:102870005D096AE871E2C7018C0D9D1D07C04C1906 +:102880005D09BA0166577E4DAE01C7010E9400473F +:10289000311002C081E00BC001501109D8F3F801DA +:1028A000EC0FFD1FEE0DFF1D1082F6CF80E0DF91D3 +:1028B000CF911F910F91FF90EF90DF90CF90BF903D +:1028C000AF909F908F907F906F905F904F903F90D0 +:1028D0000895209186213091872180E098E0821B25 +:1028E000930BEAE8F1E29F012A5831422817390791 +:1028F00010F41192F8CF8AE891E2809388219093A6 +:10290000892180E098E0809386219093872182E05E +:1029100090E4809300209093012042E050E060E03A +:1029200070E480E090E21EDAE0915C2BF0915D2B88 +:1029300087818A3019F480E180938B2986818A30DF +:1029400019F480E180938A290895809186219091DD +:10295000872190582091002030910120821B930BF9 +:10296000089520E030E0F901E55AF44D8783265FB1 +:102970003F4F20353105B9F7813049F018F08230EA +:1029800059F008951092852189EA93E109C0809356 +:10299000852180E395E104C0109285218AEA93E1C4 +:1029A0008093592B90935A2B08950F931F93CF9395 +:1029B000DF931F92CDB7DEB7E0915C2BF0915D2BDA +:1029C0008481CFDF8AE891E28093882190938921E6 +:1029D00000E018E0009386211093872141E050E049 +:1029E000BE016F5F7F4F80E090E060DCE091882166 +:1029F000F0918921DF01C8011D920197E9F78981D2 +:102A0000882341F042E050E060E070E480E090E232 +:102A10005BD917C082E090E480930020909301205E +:102A200042E050E060E070E480E090E29BD981E019 +:102A3000898341E050E0BE016F5F7F4F80E090E00E +:102A400072DCE091592BF0915A2B40E060E070E08D +:102A50008FEF19950F90DF91CF911F910F910895EE +:102A60000F931F93CF93DF93AEB1BFB1C091080412 +:102A7000D09109042091862130918721E42FF0E044 +:102A80008F010C5F1F4F2017310758F1CA2BDB2B2A +:102A9000245031092E1B3F0B209386213093872130 +:102AA000A0918821B09189218C9311964C93119714 +:102AB0001296DC931297CD0104968093882190930F +:102AC00089211396CC93DB01EC01415018F02D9134 +:102AD0002993FBCFE80FF91FE0938821F093892118 +:102AE00012C080E03EDFE0915C2BF0915D2B87818E +:102AF0008A3019F481E180938B2986818A3019F418 +:102B000081E180938A29DF91CF911F910F910895E0 +:102B10001F93CF93DF931F92CDB7DEB79E012F5F38 +:102B20003F4FAC0163E08FEC97E0F3D1182F88237F +:102B300011F0898116DF812F0F90DF91CF911F91C6 +:102B400008950F931F93E0915C2BF0915D2B8B0107 +:102B50009C01448163E08FEC97E0C3D11F910F91FA +:102B600008959B01AC0163E08FEC97E0F9C1CF932E +:102B7000DF938091862190918721811528E092072B +:102B800008F043C06091002070910120C0E0D8E0BF +:102B9000AE01481B590B80E090E8861B970B841709 +:102BA000950798F18AE891E2DDD82091862130914D +:102BB00087218091002090910120985F821B930BC8 +:102BC0008093002090930120C21BD30BEAE8F1E22E +:102BD000CF018A5891428C179D0710F41192F8CFBB +:102BE0008AE891E2809388219093892180E098E09F +:102BF000809386219093872142E050E060E070E46A +:102C000080E090E2DF91CF91ADC8DF91CF91089540 +:102C1000809185218111ABCF089543E550E06BE5AC +:102C20007BE281E090E042CB43E550E06BE57BE264 +:102C300081E090E078CBCF93DF93CFEFC80FC8301F +:102C400078F5D82F0E94622199D9C0935B2B8AE036 +:102C5000C89F90011124C901825A944D80935C2B26 +:102C600090935D2BF901E55AF44D80850E94180D73 +:102C7000E0915C2BF0915D2B848173DEE1D88FE1D4 +:102C80008D0FE0915C2BF0915D2B9781943011F4C6 +:102C900080938B299681943029F480938A2902C0ED +:102CA00080E001C081E0DF91CF91089580915B2B9E +:102CB00099E04AE0915099F0282F30E02F5F3F4F84 +:102CC00027703327822F429FF001439FF00D11247C +:102CD000E55AF44D2085222369F38F5FACCF089528 +:102CE000FC0190915B2B9F5C908311820895CF93A0 +:102CF000FC01C081818181110CC0BF01E091592B81 +:102D0000F0915A2B41E082E1199580ED8C0FCF9123 +:102D100092CF80E0CF91089588E1809301060895D5 +:102D200080918A29823191F030F48031B9F050F4E9 +:102D30008823A9F132C0833169F090EE980F983062 +:102D400088F02BC088E08093050627C088E0809338 +:102D5000070623C08091040683FF12C088E0809399 +:102D600006061BC090918C299F5F923019F09093BA +:102D70008C2915C010928C299091040693FD04C0F3 +:102D800088E0809305060BC098E090930606803299 +:102D900021F0815080938A2902C010928A29809163 +:102DA0008B29823191F030F48031C1F050F48823C6 +:102DB000A9F132C0833169F090EE980F983088F015 +:102DC0002BC080E18093050627C080E18093070631 +:102DD00023C08091040684FF12C080E18093060620 +:102DE0001BC090918D299F5F923019F090938D298F +:102DF000089510928D299091040694FD04C080E1FD +:102E000080930506089590E190930606803221F0A4 +:102E1000815080938B29089510928B2908959B01EE +:102E2000AC016BE082E398E09BC020E030E0982F9B +:102E300090718870992321F0F901E55AF44D628769 +:102E4000882321F0F901E55AF44D6187265F3F4F51 +:102E50002035310579F7992329F090E19093060602 +:102E600010928B29882329F088E08093060610921F +:102E70008A2908950F931F939B018A01803131F4B1 +:102E8000E0915C2BF0915D2B478107C0883049F4BD +:102E9000E0915C2BF0915D2B46816BE082E398E042 +:102EA00020D01F910F9108950F931F93CF93DF931D +:102EB0001F92CDB7DEB7082FAB019E012F5F3F4FAA +:102EC0006BE082E398E025D0182F882319F0698100 +:102ED000802FABDF812F0F90DF91CF911F910F914A +:102EE00008950F931F93FC01662379F0949161502C +:102EF000941309C0BF016F5F7F4FA801C9010E94F1 +:102F0000E44681E003C0B196EFCF80E01F910F91BE +:102F10000895CF92DF92EF92FF921F93CF93DF93AA +:102F2000EC017A016901162F112389F0BE016F5F50 +:102F30007F4FC7010E94DB461150892B31F4FE01FF +:102F4000C491F601C08381E003C0A196EDCF80E07B +:102F5000DF91CF911F91FF90EF90DF90CF90089578 +:102F6000CF930196CCE26623C9F0FC01DA01AD01F2 +:102F70007491772341F021153105A1F07D933196AD +:102F800021503109F4CF623030F02115310551F074 +:102F90004F5F5F4FCC9361508196E5CF232B11F0AB +:102FA000FA011082CF910895809120028068809369 +:102FB00020028091230280FFFCCF81E080932302D6 +:102FC000A0911002B0911102AE5BB109B7FF02C02F +:102FD000A0E0B0E020E038EB4BE050E00E945E461D +:102FE000E0915C2BF0915D2B61157105844F914050 +:102FF000A8F48781873019F480E180938B2986813A +:10300000873019F480E180938A298091572B882397 +:1030100089F0E091492BF0914A2B199487818730F0 +:1030200019F481E180938B298681873019F481E13D +:1030300080938A290895BC0183E090E20C948A442D +:10304000CF93DF93FC016491EC012196662331F06C +:1030500083E090E20E94D844CE01F4CFDF91CF917B +:103060000895AB01BC0183E090E20C94B44480E28B +:10307000809362060895CF93DF9380918E298230EA +:1030800029F583E090E20E943D450E940C4083E0D8 +:1030900090E20E945945EC0197FD18C0E0915C2B2D +:1030A000F0915D2B8781833019F483E180938B2924 +:1030B0008681833019F483E180938A298C2F24D66A +:1030C000811104C08C2FDF91CF91C2C7DF91CF91C6 +:1030D000089580918E29813079F028F08230D9F0DE +:1030E000833011F12EC08091680685FF2AC08FE0E1 +:1030F0008093022081E00CC0809102208150809357 +:10310000022081111EC00E94C90C0E94B74382E0B8 +:1031100080938E2916C08091680685FD12C08FE0CD +:103120008093022083E0F4CF80910220815080932D +:103130000220811106C00E947C430E94F70C10926D +:103140008E2980918E29823019F42ED70C942A2151 +:103150000895E0915C2BF0915D2B8781823019F40A +:1031600081E180938B298681823019F481E18093FB +:103170008A290895E0915C2BF0915D2B8781823044 +:1031800019F480E180938B298681823019F480E1E3 +:1031900080938A29089583E090E20C94654483E04B +:1031A00090E20C94AC4523E33BE03F932F932DE258 +:1031B0003BE03F932F9326E23BE03F932F932FE199 +:1031C0003BE03F932F932FE73AE03F932F9322E08A +:1031D0002F931F929F938F930E9469478DB79EB73D +:1031E0000E968DBF9EBF85E6089560E072E00E9456 +:1031F000580D85E60895FB0120812F3349F4218184 +:10320000211106C060E072E00E94970D85E60895E6 +:10321000CB010E94690D882319F006DD84E608952C +:103220008AEC0895EF92FF920F931F93CF93DF9351 +:10323000CDB7DEB7A097CDBFDEBF7C010091572B85 +:1032400010E00115110591F487E79AE09F938F93A1 +:1032500082E08F931F92FF92EF920E9469470F9036 +:103260000F900F900F900F900F9010C0E091512B86 +:10327000F091522BCE01019619959801AE014F5F46 +:103280005F4F60E072E0C7010E94BB0D85E6A0962B +:10329000CDBFDEBFDF91CF911F910F91FF90EF90D7 +:1032A0000895DF92EF92FF920F931F93CF93DF93D6 +:1032B000CDB7DEB7A097CDBFDEBF7B010091572B06 +:1032C00010E060E77AE0C7010E94DB46892B29F510 +:1032D000D12CED2CF12CE016F10658F40E949F0D34 +:1032E000E1E0F0E0EC0FFD1FEE0DFF1D8083D394B5 +:1032F000F0CFE091532BF091542BCE01019619950C +:10330000E091592BF0915A2B4091572BBE016F5FE2 +:103310007F4F83E1199584E60BC0A70160E270E05E +:10332000CE0101960E94F50D8017910711F38AECEA +:10333000A096CDBFDEBFDF91CF911F910F91FF907F +:10334000EF90DF900895FC018091582B882311F0B5 +:1033500081E301C080E38083118285E60895FB014B +:103360002181211127C02081213321F481E0809324 +:10337000582B04C0203321F41092582B84E6089572 +:103380002F33C1F41F9220E32F931F9221E32F9339 +:103390002AE63AE03F932F9322E02F931F929F93C8 +:1033A0008F930E9469478DB79EB70A968DBF9EBFC7 +:1033B00085E608958AEC08958EE490E174D48EE653 +:1033C00008958EEC90E18AD48EE60895E0ECF4E066 +:1033D00081818E7F81830E947C430E94BD0C84E6A4 +:1033E0000895E0ECF4E081818E7F81830E947C432C +:1033F0000E94C30C84E60895E1E4FBE225892F9343 +:1034000024892F9327E63AE03F932F9322E02F93CE +:103410001F929F938F930E9469478DB79EB708961E +:103420008DBF9EBF85E608952091572B1F922F9345 +:1034300024E63AE03F932F9322E02F931F929F932D +:103440008F930E9469478DB79EB708968DBF9EBF28 +:1034500085E6089540E052E0BC0180E04BD985E666 +:103460000895FB0120812F3341F42181211105C0F2 +:1034700060E072E02AD985E6089580E04DD988237E +:1034800019F0D2DB84E608958AEC089540E052E01A +:10349000BC0181E02FD985E60895FB0120812F33FF +:1034A00041F42181211105C060E072E00ED985E66A +:1034B000089581E031D9882319F0B6DB84E60895B8 +:1034C0008AEC089540E052E0BC0182E013D985E621 +:1034D0000895FB0120812F3341F42181211105C082 +:1034E00060E072E0F2D885E6089582E015D988237D +:1034F00019F09ADB84E608958AEC089540E052E0E2 +:10350000BC0183E0F7D885E60895FB0120812F33C5 +:1035100041F42181211105C060E072E0D6D885E632 +:10352000089583E0F9D8882319F07EDB84E60895B6 +:103530008AEC089540E052E0BC0180E19BDC85E626 +:103540000895FB0120812F3341F42181211105C011 +:1035500060E072E064DC85E6089580E1A5DC882304 +:1035600019F062DB84E608958AEC089540E052E0A9 +:10357000BC0188E07FDC85E60895FB0120812F33C4 +:1035800041F42181211105C060E072E048DC85E64C +:10359000089588E089DC882319F046DB84E60895E5 +:1035A0008AEC089560E072E0CCDA85E60895FB01CC +:1035B00020812F3341F42181211105C060E072E0A8 +:1035C000D0DA85E60895CB01A3DA882319F02CDB45 +:1035D00084E608958AEC0895CF93DF93EC01B5D982 +:1035E000813028E0920718F09C01385002C020E09A +:1035F00030E03F932F939F938F9324E43AE03F93DF +:103600002F9382E08F931F92DF93CF930E9469479D +:103610008DB79EB70A968DBF9EBF85E6DF91CF918D +:10362000089587ED93E15AD38EE60895A0DA84E6F3 +:1036300008954FD984E6089560E072E051DB85E695 +:103640000895CB0154DB882319F0EEDA84E608955F +:103650008AEC08950E948E0F84E608950E94BE0FA2 +:1036600084E608950E94200F84E6089580916806FC +:1036700080FD02C089E7089588E70895DF92EF9200 +:10368000FF920F931F93CF93DF93EC010FEF11E0A5 +:1036900086E7E82E8CE0F82E9CE2D92EB7018CE666 +:1036A00091E20E94DB46892BD1F001151105B9F09A +:1036B000DE01F7012491ED012196C8010197222333 +:1036C00041F00130110529F02C93DE0131968C0177 +:1036D000F1CFDC928C0188E1E80EF11CDFCF21975D +:1036E000188285E6DF91CF911F910F91FF90EF90A7 +:1036F000DF900895FC012091200220682093200291 +:103700008091230280FFFCCF81E080932302A0916F +:103710001002B0911102AE5BB109B7FF02C0A0E088 +:10372000B0E020E038EB4BE050E00E945E46AA2774 +:10373000BB279F938F932DE33AE03F932F9382E033 +:103740008F931F92FF93EF930E9469478DB79EB7A7 +:1037500008968DBF9EBF85E608952EB13FB140917A +:10376000080450910904242B352B3F932F9327E312 +:103770003AE03F932F9322E02F931F929F938F93D2 +:103780000E9469478DB79EB708968DBF9EBF85E69C +:1037900008950F931F93CF93DF931F921F92CDB77E +:1037A000DEB78B01E0915C2BF0915D2B858187303A +:1037B00009F06FC0E091492BF0914A2B199581E0F7 +:1037C0008093DD2960E270E0C8010E9421470097E4 +:1037D000F9F4F80101900020E9F73197E01BF10BB3 +:1037E000E0FD59C0F695E795E130F10539F487E041 +:1037F00090E080933F2B9093402B37C053E0EE0F27 +:10380000FF1F5A95E1F7E0933F2BF093402B2DC01B +:1038100098012C5F3F4F82179307E9F5A80162E0FA +:1038200070E0CE0101960E94F50D898190E0982FFD +:1038300088272A81820F911D80933F2B9093402BE4 +:103840000B5F1F4FF80101900020E9F73197E01B53 +:10385000F10BE0FD20C0F695E79533E0EE0FFF1F7A +:103860003A95E1F7E817F907B0F060913F2B7091B6 +:10387000402B695F7F4F83E0769567958A95E1F7E6 +:10388000A8018FE39AE20E94F50D0E947B298FEF39 +:1038900003C089EC01C08AEC0F900F90DF91CF91AB +:1038A0001F910F910895EF92FF920F931F93CF9363 +:1038B000DF931F921F92CDB7DEB78B01E0915C2B97 +:1038C000F0915D2B8581873009F080C0E091492B14 +:1038D000F0914A2B199582E08093DD2960E270E037 +:1038E000C8010E9421477C01892B31F5F801019024 +:1038F0000020E9F73197E01BF10BE0FD69C0F69578 +:10390000E795E130F10539F487E090E080933F2BB3 +:103910009093402B47C063E0EE0FFF1F6A95E1F7DD +:10392000CF0169E070E00E944A46E81BF90BE09382 +:103930003F2BF093402B36C0C8010496E816F906D9 +:1039400009F046C0A80162E070E0CE0101960E9435 +:10395000F50D298130E0322F22278A81280F311D71 +:1039600020933F2B3093402B2730310529F0C9019C +:1039700087709927892B61F587010F5F1F4FF80129 +:1039800001900020E9F73197E01BF10BE0FD20C02A +:10399000F695E79543E0EE0FFF1F4A95E1F7E21732 +:1039A000F307B0F060913F2B7091402B695F7F4F20 +:1039B00083E0769567958A95E1F7A8018FE39AE20F +:1039C0000E94F50D0E947B298FEF03C089EC01C096 +:1039D0008AEC0F900F90DF91CF911F910F91FF9084 +:1039E000EF900895E0915C2BF0915D2B85818730FD +:1039F000A1F4E091492BF0914A2B199584E0809332 +:103A0000DD290E9440360E947B298AE496E3809358 +:103A10009E2990939F298FEF089589EC0895E09156 +:103A20005C2BF0915D2B85818730A1F4E091492BCF +:103A3000F0914A2B199583E08093DD290E9440364E +:103A40000E947B298AE496E380939E2990939F2984 +:103A50008FEF089589EC0895E0915C2BF0915D2B38 +:103A600085818730A1F4E091492BF0914A2B19957B +:103A700085E08093DD290E9440360E947B298AE4FC +:103A800096E380939E2990939F298FEF089589EC68 +:103A90000895E0915C2BF0915D2B4085518564E6A3 +:103AA000649F9001659F300D11243F932F9321E374 +:103AB0003AE03F932F9322E02F931F929F938F938F +:103AC0000E9469478DB79EB708968DBF9EBF85E659 +:103AD0000895CF93DF931F921F92CDB7DEB7FB01FE +:103AE00020812F33B1F42181211113C02FEF39E050 +:103AF0003F932F9322E02F931F929F938F930E94C7 +:103B000069470F900F900F900F900F900F9085E6E0 +:103B100027C089E592E089839A83CE0101969F931D +:103B20008F938BEF99E09F938F937F936F930E9476 +:103B30009F470F900F900F900F900F900F90892B31 +:103B400071F089819A818935F2E09F0740F4E09114 +:103B50005C2BF0915D2B8087918784E601C08AEC15 +:103B60000F900F90DF91CF91089520911F202F93F8 +:103B700020911E202F9328EF39E03F932F9322E0CE +:103B80002F931F929F938F930E9469478DB79EB783 +:103B900008968DBF9EBF85E60895CF93DF931F9251 +:103BA0001F92CDB7DEB7FB0120812F33B1F4218105 +:103BB000211113C02FE02F932FEF2F9327EA39E025 +:103BC0003F932F9322E02F931F929F938F930E94F6 +:103BD0006947CDBFDEBF85E627C019821A82CE01B4 +:103BE00001969F938F9383EA99E09F938F937F939E +:103BF0006F930E949F470F900F900F900F900F9020 +:103C00000F90892B81F089819A818115E0E19E07CF +:103C100050F4809338039093390380931E2090933F +:103C20001F2084E601C08AEC0F900F90DF91CF91A6 +:103C30000895FB0120812F33D9F42181211121C066 +:103C40001F9220E32F931F9221E32F932DE939E058 +:103C50003F932F9322E02F931F929F938F930E9465 +:103C600069478DB79EB70A968DBF9EBF85E60895BA +:103C7000213311F4B3D303C0203319F4D4D384E631 +:103C800008958AEC0895FC0180910008813021F4A8 +:103C900080918C08833011F080E301C081E3808340 +:103CA000118285E6089521E020939D2920939C2987 +:103CB0002CE32093992925E030E020939729309335 +:103CC000982910929129109292291092932910927A +:103CD000942980938F2990939029089527E0209329 +:103CE0009D292CE231E02093972930939829109256 +:103CF00091291092922910929329109294298093DD +:103D00008F29909390290895CF9390919D29953074 +:103D1000E1F130F4933029F140F5913068F440C17D +:103D2000973009F4A7C008F445C0983009F4AAC038 +:103D3000993009F432C134C1813041F4109295298F +:103D40001092962910929A2983E0FBC0843011F4D6 +:103D500066E08BC0883109F420C18B3109F0F3C0D3 +:103D60001CC180939B2984E0ECC090E040919B298A +:103D70002FEF30E0241B31098217930721F485E0EF +:103D8000E0C0981739F165E169C02091952930911B +:103D90009629A9014F5F5F4F40939529509396292B +:103DA000F901E255F44D80834038510509F0CBC04C +:103DB00086E0C7C020919B2990919C29291346C079 +:103DC000EEEAFBE290E02CE2EE32F207D1F2219132 +:103DD000920FF9CF409191295091922960919329A6 +:103DE00070919429E0918F29F091902920E830E09A +:103DF0008EEA9BE21995C82F882311F180919C29A6 +:103E00008F5F80939C298091912990919229A09114 +:103E10009329B091942980589F4FAF4FBF4F809303 +:103E2000912990939229A0939329B093942966E0C5 +:103E300083E090E20E94D84482E080939D29B1C043 +:103E400068E183E090E20E94D8440EC030E0892F00 +:103E500090E001972817390739F466E083E090E293 +:103E60000E94D84482E06DC068E183E090E20E9445 +:103E7000D84493C0853119F410929C2909C08B3124 +:103E800009F48BC0883109F463CF863009F05DC036 +:103E900080919C298F5F80939C294091912950911A +:103EA00092296091932970919429E0918F29F09142 +:103EB000902920E830E08EEA9BE21995C82F8823EC +:103EC000D1F161E083E090E20E94D84460919C29A6 +:103ED00083E090E20E94D84460919C29609583E041 +:103EE00090E20E94D84460E870E08EEA9BE2B9D884 +:103EF000EEEAFBE260E08CE2EE32F80719F0819125 +:103F0000680FF9CF83E090E20E94D8448091912914 +:103F100090919229A0919329B091942980589F4F14 +:103F2000AF4FBF4F8093912990939229A0939329EB +:103F3000B093942936C064E083E090E20E94D844B4 +:103F400089E080939D29C1E02CC08531E1F761E0D3 +:103F500083E090E20E94D84460919C2983E090E243 +:103F60000E94D84460919C29609583E090E20E9471 +:103F7000D84460E870E08EEA9BE273D8EEEAFBE298 +:103F800060E02CE2EE32F20719F08191680FF9CF70 +:103F900083E090E20E94D844D6CF10929D29D3CFDF +:103FA000C0E08C2FCF91089580919D29813019F028 +:103FB000873029F1089580919729909198299C0143 +:103FC000215031092093972930939829892B31F575 +:103FD000809199299FEF980F90939929882331F028 +:103FE00065E183E090E20E94D84402C010929D29CE +:103FF00085E090E080939729909398290895809187 +:104000009729909198299C01215031092093972953 +:1040100030939829892B11F410929D290895EDE48D +:10402000FBE020E030E09491981309C041E2429F08 +:10403000C001439F900D1124825B944F08952F5F20 +:104040003F4FB1962930310571F780E090E0089537 +:10405000CF92DF92EF92FF920F931F93CF93982FFF +:104060009F7D91549A3160F090ED980F9A3040F016 +:104070008F3531F0982F9D7F9D3311F08032D1F430 +:104080009FE9980F9A3108F480522091A32930912A +:10409000A4292F3F91E0390708F0D3C0A9014F5F51 +:1040A0005F4F4093A3295093A429F901E255F44DA1 +:1040B0008083C7C08D3009F095C0E091A329F091AD +:1040C000A429E255F44D10821092A3291092A4293C +:1040D0008091A2298111B5C08091AE2B982F9F7D30 +:1040E00009F495C08D7F8D3309F491C0EEEAFBE2AF +:1040F0007F01C191CC2331F0CF3321F0CD3311F0CA +:10410000C032B1F7F701108286E7C82E8CE0D82EB6 +:1041100000E010E0B6018EEA9BE20E94DB46892BAC +:1041200009F056C01092AE2BCF3349F488E1809F3E +:10413000F001819FF00D1124E457F34F18C0B7012F +:104140006F5F7F4FCD3349F488E1809FF001819FFD +:10415000F00D1124E657F34F20C0C11113C088E1C0 +:10416000809FF001819FF00D1124EA57F34F2591B4 +:1041700034912115310509F44DC08EEA9BE2F90115 +:10418000199514C0C03209F045C088E1809FF00144 +:10419000819FF00D1124E857F34F2591349121159B +:1041A0003105C1F18EEA9BE2F90119958F3F99F52E +:1041B00081E08093A2298EB19FB1209108043091B3 +:1041C0000904822B932B8093A0299093A12939C0B5 +:1041D0000F5F1F4FF8E1CF0ED11C0632110509F019 +:1041E00099CF15C0883061F48091A3299091A429BA +:1041F000009739F101978093A3299093A42921C0B6 +:104200008B31F9F41092A3291092A4291AC088ECDA +:10421000C0E002C089ECC1E002DF0E9420188AE4FD +:104220009BE00E942018CC2361F08091AE2B882364 +:1042300041F08EEA9BE20E941B1887E49BE00E94FB +:10424000201881E0CF911F910F91FF90EF90DF90A8 +:10425000CF9008958091A229882399F1E0915C2B59 +:10426000F0915D2B208531852115310551F18EB1FD +:104270009FB14091080450910904842B952B4091E3 +:10428000A0295091A129841B950B64E670E00E943F +:104290004A4662177307A8F01092A2298BECBFDE82 +:1042A0000E94201884E49BE00E942018E0919E293F +:1042B000F0919F29309729F0199510929E2910921C +:1042C0009F2908958091A2298823A9F01092A229FC +:1042D0008BECA5DE0E94201884E49BE00E9420184D +:1042E000E0919E29F0919F29309729F0199510921D +:1042F0009E2910929F290895CF93DF939091A22930 +:104300009923A9F0EB011092A22989DE0E942018BE +:1043100081E49BE00E942018209749F0CE010E9482 +:104320001B188EE39BE0DF91CF910C942018DF9156 +:10433000CF910895EF92FF920F931F93CF937C013B +:104340009B01613081E0780710F020E031E08B01C3 +:10435000021B130BA70160E072E08EEA9BE20E9451 +:10436000BB0D8EEA9BE20E941B18C1E0013081E088 +:104370001807B0F01A956C2F70E0762F6627A7010A +:10438000460F571F20E032E060E072E08EEA9BE2C9 +:104390000E94BB0D8EEA9BE20E941B18CF5FE6CF06 +:1043A0000115110591F0EC2FF0E0FE2FEE27A7018B +:1043B0004E0F5F1F980160E072E08EEA9BE20E9460 +:1043C000BB0D8EEA9BE20E941B188BE39BE0CF9112 +:1043D0001F910F91FF90EF900C942018809100088E +:1043E000813029F480918C08833009F408958091FC +:1043F000A729811117C081E08093000893E0909372 +:104400008C088093A5291092A6298EB19FB1209186 +:10441000080430910904822B932B8093AC2990934C +:10442000AD290895089510928C0810920008E5EACD +:10443000F9E21082118208959091A5299923F1F053 +:104440008091A629811115C02091A5292223B9F0B8 +:104450002EB13FB14091080450910904242B352B13 +:104460004091AC295091AD29241B350B26343105E0 +:1044700030F081E08093A629892F089581E0089586 +:10448000CF93DF931F92CDB7DEB78091A729882302 +:10449000D1F02EB13FB14091080450910904242B72 +:1044A000352B4091AA295091AB29241B350B409103 +:1044B000A8295091A9292417350728F01092A72977 +:1044C00089838CDF89810F90DF91CF910895A0E2DD +:1044D000B6E081E015968C9315972EEA3DE228B957 +:1044E00039B92EE23EE22AB93BB910B813B812B876 +:1044F00016B817B811B8E0E0F9E010A211A22FEF3A +:1045000030E026A337A32FEF3FEF20A731A780830A +:1045100088E8838380E1848783E087831C968C937B +:104520001C9782E01A968C9308951F920F920FB6F3 +:104530000F92112408B60F9218BE0BB60F921BBE35 +:104540008F939F93EF93FF93E0E0F9E013828FE75F +:1045500090E086AB97AB81E190E080AF91AFE0E077 +:10456000FAE010A211A28FEF9FEF86A397A389E82C +:104570008383168281E084878EE0808310922A06EE +:10458000FF91EF919F918F910F900BBE0F9008BEFE +:104590000F900FBE0F901F9018951F920F920FB69D +:1045A0000F92112408B60F9218BE0BB60F921BBEC5 +:1045B0002F933F938F939F93EF93FF932091280620 +:1045C00093B1267081E009F080E0990F892B83B9BF +:1045D00082B1882309F464C012B883B18770873030 +:1045E00059F51092000980E180930C091092030A9A +:1045F0001B9B03C08CEA94E002C08CE694E080939D +:10460000260A9093270A82E081B981E080930C0A00 +:1046100083E08093060A86B197B1877049F090B124 +:104620008F5F893011F09695FBCFE8B1F9B1908397 +:1046300081E08093AE2937C093B1892F8C7099F1B6 +:1046400092FB992790F981E0982781B181111BC0D5 +:1046500080B18695911190E8892B80B926B137B148 +:104660002F5F3F4F26B937B927703327232BD9F453 +:10467000E8B1F9B19F012F5F3F4F28B939B9808365 +:1046800081E081B910C081B1813069F4EAB1FBB138 +:104690009F012F5F3F4F2AB93BB9908311B803C0E8 +:1046A00082B1809582B9FF91EF919F918F913F9157 +:1046B0002F910F900BBE0F9008BE0F900FBE0F9062 +:1046C0001F9018951F920F920FB60F92112408B6E3 +:1046D0000F9218BE0BB60F921BBE2F933F938F9372 +:1046E0009F93EF93FF9381B1823008F49DC081B115 +:1046F0008D3008F099C0E1B1F0E0EE0FFF1FEA5DE8 +:10470000FF4D0190F081E02D19948FE790E08093A8 +:10471000260A9093270A88C08E9A8EE080934008DC +:104720008FE390E08093260A9093270A85E06FC07C +:104730008E9886E081B98FEF82B914B815B8E8B1C8 +:10474000F9B1808180B970C0009B05C08E9A82B19A +:10475000809582B901C08E9887E059C0009B02C045 +:104760008E9801C08E9A80B1869580B984B195B13A +:10477000019684B995B984B195B187709927892B31 +:1047800011F488E044C024B135B186B197B128173F +:104790003907B1F52BC0EAB1FBB1309711F0808138 +:1047A00001C082B1882311F08E9A01C08E9889E0F1 +:1047B0002EC0EAB1FBB1309751F08081882311F00F +:1047C0008E9801C08E9A3196EAB9FBB908C082B1C1 +:1047D000882311F08E9801C08E9A8FEF82B924B190 +:1047E00035B186B197B12817390711F48AE00FC0A7 +:1047F000E8B1F9B1CF01019688B999B9818180B941 +:1048000086E005C08E988BE002C08E988CE081B95E +:104810000BC01092000A1092060A109240081092E3 +:10482000410881E08093AF29FF91EF919F918F9193 +:104830003F912F910F900BBE0F9008BE0F900FBEAF +:104840000F901F901895CF93DF93EEEAF9E2108254 +:104850001182E0E4F6E0128A84E08283C0E8D1E0CD +:1048600082E68E83A0E2B6E081E016968C931697DE +:1048700011968C93119796E012969C9312975196ED +:104880008C93519742E052964C9352971A961C92F1 +:104890001A9733E019963C9399E598839AE59983A2 +:1048A00090E491839683A0EBB0E012962C9112973E +:1048B000207F12962C93129712962C9112972260B9 +:1048C00012962C9320E321832683908B8683458345 +:1048D0003183E0E0F8E083E1818321E030E026A34A +:1048E00037A320A731A7E0E8F8E014868083E0E250 +:1048F000F3E01382118288E0828391E1908320911A +:104900001E2030911F20208F318FE0E8F3E09CE3E0 +:104910009283808393838183DF91CF91D8CDA0E26E +:10492000B6E01A961C921A97EEEAF9E2108211820A +:10493000E0E0F9E010821382178280E18487E0E0F2 +:10494000FAE010821382168281E08487E0E4F8E0C6 +:104950001082118216968C938E980895CF93DF93D0 +:104960008091AE29882309F47EC01092AE29C6B189 +:10497000D7B1C730D10508F471C0AE01495F5F4FB0 +:1049800093E0569547959A95E1F7E091592BF09170 +:104990005A2B6EEA7DE280E41995E0915C2BF09150 +:1049A0005D2B8781883019F483E180938B29868180 +:1049B000883019F483E180938A29E0914F2BF0919C +:1049C000502BBE018EEA9DE21995EC0194FF06C0C2 +:1049D000DF7E8EE29EE28AB99BB902C01AB81BB88C +:1049E0002097E1F1AE01495F5F4F83E0569547950F +:1049F0008A95E1F7E091592BF0915A2B6EEA7DE20E +:104A000081E41995E0915C2BF0915D2B87818930D1 +:104A100019F483E180938B298681893019F483E12D +:104A200080938A29C6B9D7B98EEA9DE288B999B927 +:104A300010926008109261088FE090E08093660801 +:104A40009093670888E090E080936A0890936B08E1 +:104A500083E28093410883E081B905C01092000A87 +:104A60001092060A34DD8091AF29882329F0109234 +:104A7000AF29DF91CF912BCDDF91CF910895CF93C7 +:104A8000DF93E0E4F6E0128A84E08283C0E8D1E0BC +:104A900082E68E83A0E2B6E081E016968C931697AC +:104AA00011968C93119796E012969C9312975196BB +:104AB0008C93519742E052964C9352971A961C92BF +:104AC0001A9733E019963C93199799E598839AE5DC +:104AD000998390E491839683C0EBD0E02A81207F74 +:104AE0002A832A8122602A8320E321832683908BD4 +:104AF000868345833183E0E0F8E093E1918321E010 +:104B000030E026A337A320A731A7E0E8F8E0148619 +:104B10009083E0E2F3E01382118298E0928341E116 +:104B2000408340911E2050911F20408F518FE0E81C +:104B3000F3E04CE3428390834383918315968C93F7 +:104B4000E0E0F9E08FE790E086A397A322A733A7E0 +:104B5000108216828CE087831092000A1092B0298E +:104B6000E3EBF9E2108212821182DF91CF91089576 +:104B700081E08093260657DCE0E0F9E0108217829E +:104B8000E0E0FAE010821782E3EBF9E21182128290 +:104B9000108208951F920F920FB60F92112408B63B +:104BA0000F9218BE0BB60F921BBE2F933F938F939D +:104BB0009F93EF93FF93E091B029F0E0EE0FFF1F7A +:104BC000E05CFF4D0190F081E02D199410928C086B +:104BD0001092000886E18A95F1F700C081E0809389 +:104BE000000883E080938C0818B88091AE2D86B9B8 +:104BF00017B882E001C083E08093B02986C0309965 +:104C000011C082B181110EC010928C081092000860 +:104C100096E19A95F1F700C081E08093000883E067 +:104C200080938C0884E0E8CF309B10C010928C08F1 +:104C30001092000886E18A95F1F700C081E0809328 +:104C4000000893E090938C0882B901C012B886B135 +:104C5000869586B984B195B1019784B995B9892BA8 +:104C600011F485E001C083E08093B02987B18F5FA4 +:104C700087B9877009F049C0E8B1EF5FE8B9F0E0A3 +:104C8000E255F24D808186B940C082B181110EC0DB +:104C900010928C081092000896E19A95F1F700C0E6 +:104CA00081E08093000883E080938C0886E0A4CFA5 +:104CB0001092000982E591E00197F1F700C0000031 +:104CC00082E08093870389E3809381038EEA9DE2EB +:104CD0008AB99BB981E090E084B995B980E886B93A +:104CE0008EB19FB12091080430910904822B932B3F +:104CF0008093B1299093B22981E08093B52918B8A7 +:104D000017B81092B02901C000C0FF91EF919F9198 +:104D10008F913F912F910F900BBE0F9008BE0F9077 +:104D20000FBE0F901F9018951F920F920FB60F9203 +:104D3000112408B60F9218BE0BB60F921BBE2F930C +:104D40003F934F935F938F939F93EF93FF931092B3 +:104D5000070A1092000A10924709109240098091A8 +:104D600081038E7F8093810384B195B187709927E9 +:104D7000892BC9F0E4B1F5B186B144B155B193E0E6 +:104D8000F695E7959A95E1F7E255F24D90E0477078 +:104D9000552728E030E0241B350B02C095958795F8 +:104DA0002A95E2F7808381E08093B4291092B52997 +:104DB0008FEF9FEF8093260A9093270A1092200A84 +:104DC0001092210A1092060A1092070A1092030A02 +:104DD00084E08093000A87E08093B029FF91EF91EF +:104DE0009F918F915F914F913F912F910F900BBEAB +:104DF0000F9008BE0F900FBE0F901F9018951F9236 +:104E00000F920FB60F92112408B60F9218BE0BB670 +:104E10000F921BBE8F93EF93FF93E0E8F3E0818145 +:104E20008F7C8183E0E0FAE088E8838381E08083FF +:104E3000FF91EF918F910F900BBE0F9008BE0F90D6 +:104E40000FBE0F901F9018951F920F920FB60F92E2 +:104E5000112408B60F9218BE0BB60F921BBE2F93EB +:104E60003F934F935F938F939F93EF93FF93809123 +:104E70006009109260091092610992E090934009D4 +:104E8000813620F0813A08F063C077C086B18695FC +:104E900086B984B195B1019684B995B9877099277F +:104EA000892B41F4EAB1FBB1CF0101968AB99BB9D4 +:104EB00086B1808384B195B180FD88C0369986C063 +:104EC0001092070A1092000A1092470910924009A6 +:104ED000809181038E7F8093810384B195B1877027 +:104EE0009927892BC9F0E4B1F5B186B144B155B128 +:104EF00093E0F695E7959A95E1F7E255F24D90E04B +:104F00004770552728E030E0241B350B02C09595EB +:104F100087952A95E2F7808381E08093B4291092E7 +:104F2000B5298FEF9FEF8093260A9093270A10925E +:104F3000200A1092210A1092060A1092070A109273 +:104F4000030A84E08093000A87E08093B0293EC082 +:104F500086B18695806886B984B195B1019684B989 +:104F600095B987709927892B41F4EAB1FBB1CF013C +:104F700001968AB99BB986B1808386B1869580688F +:104F800086B984B195B1019684B995B9877099278E +:104F9000892B41F4EAB1FBB1CF0101968AB99BB9E3 +:104FA00086B1808386B1869586B984B195B1019624 +:104FB00084B995B987709927892B41F4EAB1FBB17F +:104FC000CF0101968AB99BB986B18083FF91EF9199 +:104FD0009F918F915F914F913F912F910F900BBEB9 +:104FE0000F9008BE0F900FBE0F901F901895BF92A4 +:104FF000CF92DF92EF92FF920F931F93CF93DF93A5 +:10500000CDB7DEB7DA95CDBFDEBF8091B529882355 +:10501000F1F08EB19FB140910804509109042091A4 +:10502000B1293091B229842B952B821B930B2091AF +:105030002020309121202F5F3F4F2817390738F467 +:1050400014B815B881E08093B4291092B52918DA04 +:10505000811144C1F1D9882309F440C18091B52957 +:1050600081113CC18091B329811105C08091B4297F +:10507000882309F433C18091B029873041F48091AD +:10508000200A9091210A8532914008F427C180912D +:10509000B429882309F4A6C084B195B1892B09F4F9 +:1050A000A1C084B195B1089718F414B815B89AC086 +:1050B00044B155B1495F5F4F63E0569547956A9596 +:1050C000E1F76EEA7DE2CE0101960E9400478EEA8A +:1050D0009DE28AB99BB904B115B114B815B8C12CB9 +:1050E000D12C73E1B72EE8E0EE2EF12CC016D106DC +:1050F00008F078C0F60153E0F695E7955A95E1F788 +:1051000041E050E04C0F5D1FE40FF51F8081982FA8 +:105110009695969590838370813039F0E8F08230CF +:1051200009F059C086B1869503C086B1869580681E +:1051300086B984B195B1019684B995B987709927DC +:10514000892B09F048C0EAB1FBB1CF0101968AB9B9 +:105150009BB986B180833FC084B195B18770992790 +:10516000892BC1F0E4B1F5B186B124B135B143E08A +:10517000F695E7954A95E1F7E255F24D90E02770F4 +:105180003327A701421B530B02C0959587954A957B +:10519000E2F78083E0915C2BF0915D2B8781883072 +:1051A00011F4B0928B298681883011F4B0928A294B +:1051B00044B155B1495F5F4F93E0569547959A9535 +:1051C000E1F7E091592BF0915A2B6EEA7DE282E4EF +:1051D000199581E001C080E052E0C50ED11C882302 +:1051E00009F484CF1092B3291092B42964B175B137 +:1051F000E0914F2BF091502B8EEA9DE2199584B9E6 +:1052000095B984B195B1892B09F468C089E0809380 +:1052100081031092000A1092200A1092210A8FE74F +:1052200090E08093260A9093270A8FE590E0809380 +:10523000280A9093290A1092060A80E180930C0AAA +:1052400093E09093070A10926009109261092FEF82 +:105250003FEF209366093093670920E031E0209307 +:105260006809309369091092460980934C0981E0DE +:105270008093470981E18093800110928801109208 +:10528000800310922906E0915C2BF0915D2B8781C1 +:10529000893019F483E180938B298681893019F450 +:1052A00083E180938A2944B155B1495F5F4F83E020 +:1052B000569547958A95E1F7E091592BF0915A2B35 +:1052C0006EEA7DE283E4199581E08093B02912B8FB +:1052D000109220091092210980930009D395CDBF27 +:1052E000DEBFDF91CF911F910F91FF90EF90DF9084 +:1052F000CF90BF90089514B815B881E08093B3297A +:105300006DC81092070A1092000A10924709109275 +:105310004009809181038E7F8093810384B195B190 +:1053200087709927892BC9F0E4B1F5B186B144B1F2 +:1053300055B193E0F695E7959A95E1F7E255F24D70 +:1053400090E04770552728E030E0241B350B02C061 +:10535000959587952A95E2F7808381E08093B4291B +:105360001092B5298FEF9FEF8093260A9093270A1A +:105370001092200A1092210A1092060A1092070A2F +:105380001092030A84E08093000A87E08093B0299A +:105390001092B0291092B4291092B32944C881E028 +:1053A0008093B8291092B629089581E08093B82996 +:1053B00008950895CF92DF92EF92FF920F931F937B +:1053C000CF93DF93CDB7DEB72597CDBFDEBF8C017E +:1053D000FC0180819091B8299230F1F038F094303E +:1053E00079F120F1953009F44AC049C121E09227B2 +:1053F000292F21702093B629911102C0863219F00D +:10540000823509F03CC184E4F8018083118282E096 +:105410008093B82980E134C19091B629911102C0DE +:105420008632B1F0823509F04DC012C09091B62994 +:10543000911102C0863261F0823509F075C008C052 +:105440009091B629911102C0863211F0823539F45B +:1054500084E4F8018083118281E089270DC08033C4 +:1054600009F41BC1823A09F434C1803A09F450C1ED +:10547000803509F4F6C081E08093B82900C160E16D +:1054800070E0C8010E946C338823A1F08091582BF2 +:1054900081110BC06091B729F4E06F9FB001112416 +:1054A00044E050E0C8010E94B20E84E08093B82925 +:1054B0008AE004C084E08093B82981E0F801808309 +:1054C00084E0DEC08339B9F619821A821B821C82FD +:1054D00088E8898343E050E060E070E0CE01029606 +:1054E0000E94640EF8018181803209F4ABC08037DC +:1054F00009F048C0F801928189819813C0C0938156 +:105500008A819813BCC094818B819813B8C095810F +:105510008C819813B4C084E0808361E070E0C8019E +:105520000E94413383E02AC0853909F0A4CF44E0CA +:1055300050E064E070E0CE0101960E94640EF80134 +:105540008181803209F47EC08037E1F4F8019281D4 +:105550008981981394C093818A81981390C0948113 +:105560008B8198138CC095818C81981388C0108290 +:1055700061E070E0C8010E94413384E08093B82963 +:1055800088E17EC0E82EE2949FE0E9222EEF2E0D06 +:105590008F70F82E88E090E08F1991094FEF50E05E +:1055A0006A0102C0D594C7948A95E2F7253021F0AC +:1055B000243059F5FF20E9F044E050E0B8016E5F77 +:1055C0007F4FCE0101962D830E94F3462D81892BBA +:1055D00061F49A81898189279B8189279C81892708 +:1055E000F801968189278C2169F1243071F4F1103A +:1055F00046C044E050E0B8016E5F7F4FCE01019697 +:105600000E94F346892BF1F03AC02430C0F5E22E17 +:10561000F12CA701B8016E5F7F4FCE0101960E9469 +:10562000F346892B61F5D801AE0DBF1DE1E0F0E036 +:10563000EC0FFD1FEE0DFF1D12969C9180818927B6 +:10564000C822E9F42981F80120833A8131839B81C2 +:1056500092838C818383232792278927848388E2FE +:105660000FC0F8018181811141C062E070E0C80182 +:105670000E946C33882309F420CF1092B82980E06F +:1056800090E02596CDBFDEBFDF91CF911F910F91A6 +:10569000FF90EF90DF90CF900895F801F18062E0E5 +:1056A00070E0C8010E946C33882309F406CFFFE044 +:1056B000FF15E0F084E0F89EB001112440E150E0D5 +:1056C000C8010E94640E60E170E0C801DAD780E989 +:1056D000D7CFF801F18066E070E0C801FDD78823DC +:1056E00009F4EBCE8EEF8F0D8E3018F0F80110829A +:1056F000E7CE8091582B8111DBCEF4E0FF9EB00104 +:10570000112444E050E0C80102960E94B20ED0CEAF +:10571000F801F18062E070E0C801DED7882309F467 +:10572000CCCE8EEF8F0D8E3008F7F092B72985E042 +:10573000BDCECF93DF93EC0143E050E060E070E03A +:105740000E94640E44E050E064E070E0CE010396F5 +:10575000DF91CF910C94640E0F931F93CF93DF933F +:105760001F921F92CDB7DEB78C01FC019081818121 +:10577000892798E88927928189278A839481838160 +:1057800089279581892796818927898343E050E07D +:1057900060E070E0C8010E94B20E41E050E063E0BA +:1057A00070E0CE0102960E94B20E44E050E064E048 +:1057B00070E0C80103960E94B20E41E050E068E03C +:1057C00070E0CE0101960E94B20E0F900F90DF9113 +:1057D000CF911F910F91089581E08093D62984E0A5 +:1057E00090E08093BB299093BC2988E08093BA29EC +:1057F0001092B929089581E08093D62984E490E03D +:105800008093BB299093BC2988E08093BA29109299 +:10581000B929089581E08093D62982E490E08093AD +:10582000BB299093BC2988E18093BA291092B929A9 +:10583000089581E08093D629089508958F929F92CC +:10584000AF92BF92CF92DF92EF92FF920F931F938E +:10585000CF93DF93CDB7DEB72F97CDBFDEBF8C01DF +:105860006B018091D629853009F4C1C058F482308B +:1058700009F446C050F1833009F48BC0843009F438 +:10588000A6C0EBC5883009F45BC198F4863009F4F2 +:10589000C2C0873009F0E1C5C8010E948A3468019E +:1058A000F4E0CF0ED11C7601580128E0A20EB11C05 +:1058B000E4C0893009F4DCC28D3008F0CEC578012F +:1058C0006801B6E0CB0ED11C10C391E08927982F58 +:1058D00091709093B9293091BB292091BC29D801AE +:1058E0009C91811102C0963219F0923509F0BDC326 +:1058F000F8013083218384E08093D62980E1AEC50E +:10590000F8018081982F9D7F913411F48AE085C23F +:10591000803329F562E070E0C801DED68823E9F023 +:10592000D80111966C91B0E16B9FB001112440E158 +:1059300050E0C8010E94640E60E170E0C801A1D689 +:1059400080E98CC590EA980F923008F006C662E0B4 +:1059500070E0C801C1D6811183C581E05DC2803A83 +:1059600091F462E070E0C801B7D68823B1F3D801A2 +:1059700011968C9111978093CD2983E08093D6293D +:105980008AE08C93B0C2803509F067C5F801818147 +:105990005CC060E170E0C8019FD6882399F08091D7 +:1059A000582B81110BC06091CD29B0E16B9FB001E4 +:1059B000112440E150E0C8010E94B20E8AE0F801D3 +:1059C000808303C081E0D8018C9382E08AC29091E9 +:1059D000B9293091BB292091BC29F801808191110E +:1059E00002C0863299F0823509F047C30FC090910A +:1059F000B9293091BB292091BC29F80180819111EE +:105A000002C0863219F0823509F072C4D8013C9385 +:105A100011962C9311C09091B9293091BB292091F6 +:105A2000BC29D8018C91911102C0863211F08235C7 +:105A300031F4F8013083218381E0892708C3803560 +:105A400009F080CFD80111968C91882319F0D801E4 +:105A50001C9249C262E070E0C8013ED6882309F476 +:105A60007CCFE091592BF0915A2B40E060E070E040 +:105A700081E919951092D629F0C471D7D7019C916C +:105A80008927F70181937F01EA15FB05B1F7E091C2 +:105A9000592BF0915A2B44E0B60180EA1995D801B0 +:105AA00014969C9114978091CE29981340C0159616 +:105AB0009C9115978091CF29981339C016969C9187 +:105AC00016978091D029981332C017969C91809197 +:105AD000D12998132CC0680182EDA82E89E2B82E36 +:105AE00094E0E92EEA0C4501F501F1905F0137D70A +:105AF0008F25D6018D936D01D401EC91F0E0EC5926 +:105B0000FB4FF4905ED6D601A158BF4F8F258C93E2 +:105B1000EA10E9CFE091592BF0915A2B44E0B801FB +:105B200081EA199588E08093D62980E256C0E091F9 +:105B3000592BF0915A2B40E060E070E080EC95C169 +:105B400078014801B4E08B0E911C580108D7F5018B +:105B500090818927D5018D935D01A815B905B1F70D +:105B6000F8018081803309F048C062E070E0C8012C +:105B7000B3D58823A1F1D80111966C91B0E16B9F48 +:105B8000B001112440E150E0C8010E94640E60E1C0 +:105B900070E0C80176D5E091592BF0915A2B42E183 +:105BA000B80180E819956801E2E1CE0ED11CD70159 +:105BB0001C91D5D68127F70181937F01E12FF0E079 +:105BC000EC59FB4F1491FDD5D701A158BF4F812748 +:105BD0008C93EC14FD0459F780E990E1FDC4D2D612 +:105BE00091E08927D8018C93E091592BF0915A2BA1 +:105BF00044E0B80181EC199576C1803A71F462E015 +:105C000070E0C80169D5882351F1F8018181809342 +:105C1000CD2989E08093D62967C0803C69F462E091 +:105C200070E0C80159D58823A1F1D80111968C9153 +:105C30008093CD298BE028C0813CC1F462E070E004 +:105C4000C8014AD5882359F0F80181818093CD2974 +:105C5000BAE0FB2EF092D62995D68F2548C0E09168 +:105C6000592BF0915A2B44E0B80143C0823CE1F437 +:105C700062E070E0C80130D5882359F0D801119650 +:105C80008C918093CD298CE08093D6297BD69AE0A5 +:105C9000C2C0E091592BF0915A2B44E0B80181EC3D +:105CA000199570D691E022C0803B31F562E070E03A +:105CB000C80112D5E091592BF0915A2B44E0B8015C +:105CC0008823B9F086E819958091582B81110CC072 +:105CD000F8016181F0E16F9FB001112440E150E0D3 +:105CE0008DEB99E20E94B20E4DD69AE08927D80139 +:105CF00048CE81EC19958DC090EA980F923008F04B +:105D00008EC062E070E0C801E7D4882309F481C046 +:105D1000D80111962C911197322F3C7F8C918036AF +:105D200019F08AE390E002C080E390E06C01B0E1FA +:105D30003B9FC00CD11C112427FF0AC0207FE0E14B +:105D40002E9F800D911D11249C0120543F4F69010D +:105D5000E091592BF0915A2B42E0B80180E9199556 +:105D600064E0CE0107960E94A20D8091572B44E07B +:105D700050E0873019F463E070E002C060E070E04A +:105D8000CE010B960E94640E46E050E0B601CE01B3 +:105D900001960E94640E8F818093CE29888580931E +:105DA000CF2989858093D0298A858093D12960E481 +:105DB00070E08EEC99E2F9D58091CE298093D229BA +:105DC0008091CF298093D3298091D0298093D429A1 +:105DD0008091D1298093D52960E270E082ED99E22B +:105DE000E4D5AE01495F5F4FBE01655F7F4FCE01D5 +:105DF000019620D5FE01379684E08E0F9191D70150 +:105E00009D937D018E13FACF87E08093D62980E29F +:105E100025C3B8D591E08927F801808364C0803517 +:105E2000B1F48181811113CE62E070E0C80154D4D5 +:105E3000882309F492CD1092D629E091592BF09144 +:105E40005A2B40E060E070E081E9199506C3A60195 +:105E5000495F5F4FA3E056954795AA95E1F7E0911A +:105E6000592BF0915A2BB80182E9199581E0EFC0C6 +:105E700078016801B2E1CB0ED11C71D5F701908198 +:105E80008927D7018D937D01AC15BD05B1F760E180 +:105E900070E0C80121D4E091592BF0915A2B88234E +:105EA000B1F042E1B80181E819958091582B811138 +:105EB0000BC06091CD29B0E16B9FB001112440E18E +:105EC00050E0C8010E94B20E5DD59AE081C344E063 +:105ED000B80181EC199556D591E08927D8018C93AA +:105EE00088E08093D62984E0B9C239D5F701908142 +:105EF0008927D7018D937D01AC15BD05B1F764E00D +:105F000070E0C801E9D3882309F4A4C06091CD29C9 +:105F1000B0E16B9FB001112440E150E08DEB99E2BC +:105F20000E94640E9091BD298091C129809598139B +:105F30004DC38091C529981349C32091BE298091F2 +:105F4000C2298095281342C38091C62928133EC3D5 +:105F5000C090BF298091C3298095C81237C3809112 +:105F6000C729C81233C38091C0293091C429309504 +:105F700083132CC33091C829831328C34091C929A6 +:105F80003091CA293095431321C33091CB29431353 +:105F90001DC33091CC293095431318C3D8013C91CF +:105FA00011964C91119712968C901297912CA12CCE +:105FB000B12C540199248824942A832A13963C9165 +:105FC000B32AD12CE12CF12C7601DD24CC24D22A69 +:105FD000C92AF82A8091D6298B3009F0DCC2E091D9 +:105FE000592BF0915A2B46E0B80185E81995C8184D +:105FF000D908EA08FB08C092BD2933272F2D1E2D92 +:106000000D2D0093BE29A701662777274093BF294E +:106010008F2D9927AA27BB278093C029EC2DE095C7 +:10602000E093C129E02FE095E093C229E42FE095A9 +:10603000E093C329E82FE095E093C429C092C529D5 +:106040000093C6294093C7298093C82988E080938C +:10605000D62903C2E091592BF0915A2B44E0B801A4 +:1060600081EC19958FD491E0B3C2903409F0F5C159 +:1060700082E08093D6298AE03ACE833909F0FACCBF +:106080008091572B873009F0A1C043E050E060E0D9 +:1060900070E0CE0102960E94640E88E88983F801C0 +:1060A0009181903219F0903761F024C0D80180833B +:1060B0003A8131832B8122839C81938323278227FA +:1060C00039C1F8018281883809F0C7C193818A817A +:1060D0009813C3C194818B819813BFC195818C8122 +:1060E0009813BBC184E0808361E070E0C801C9D22D +:1060F00085E03DC1E92EE2944FE0E4222EEF2E0D23 +:106100009F70F92E88E090E08F1991094FEF50E0D1 +:106110006A0102C0D594C7948A95E2F7253021F030 +:10612000243061F5FF20F1F044E050E0B8016E5FEB +:106130007F4FCE0101962F870E94F3462F85892B32 +:1061400069F49A818B81892798E889279C8189271E +:10615000D80116969C9189278C2181F1243071F405 +:10616000F1107BC144E050E0B8016E5F7F4FCE017B +:1061700001960E94F346892B09F16FC1243008F083 +:106180006CC1E22EF12CA701B8016E5F7F4FCE01EA +:1061900001960E94F346892B09F05FC1D801AE0D2C +:1061A000BF1DE1E0F0E0EC0FFD1FEE0DFF1D1296AC +:1061B0009C9180818927C82209F04FC198E8F80195 +:1061C00090833A8131832B8122830CC144E050E0DB +:1061D00060E070E0CE0101960E94640E9091BA29B1 +:1061E000D80111968C91803209F4F5C08037D9F42A +:1061F000D80112962C911297898128132EC11396DB +:106200002C9113978A81281328C114962C911497E6 +:106210008B81281322C115962C9115978C812813F8 +:106220001CC19C939FC0E82EE2943FE0E3222EEF36 +:106230002E0D8F70F82E88E090E08F1991094FEFA6 +:1062400050E06A0102C0D594C7948A95E2F72530E0 +:1062500021F0243061F5FF20F1F044E050E0B80176 +:106260006E5F7F4FCE0101962F870E94F3462F85E8 +:10627000892B69F49A81898189279B8189279C814F +:106280008927F801968189278C2109F442C024309E +:1062900071F4F110E2C044E050E0B8016E5F7F4F4E +:1062A000CE0101960E94F346892B99F1D6C0243085 +:1062B00008F0D3C0E22EF12CA701B8016E5F7F4F2A +:1062C000CE0101960E94F346892B09F0C6C0D80181 +:1062D000AE0DBF1DE1E0F0E0EC0FFD1FEE0DFF1D68 +:1062E00012969C9180818927C82209F0B6C011C0FE +:1062F000853909F0BFCB44E050E063E070E0CE01A7 +:1063000001960E94640E9091BA29F8018181803231 +:10631000A9F42981D8012C933A8111963C931197C5 +:106320009B8112969C9312978C8113968C93139752 +:1063300023279227892714968C935AC08037D9F443 +:10634000F80122818981281388C023818A8128133A +:1063500084C024818B81281380C025818C812813DF +:106360007CC0908361E070E0C8018BD186E08093AF +:10637000D62988E173C0E82EE2942FE0E2222EEFC6 +:106380002E0D8F70F82E88E090E08F1991094FEF55 +:1063900050E06A0102C0D594C7948A95E2F725308F +:1063A00049F544E050E0B8016E5F7F4FCE010196A1 +:1063B0002F870E94F3462F85892B09F59A818981C1 +:1063C00089279B8189279C818927D80116969C91D2 +:1063D00089278C21A1F42981F80120833A81318316 +:1063E0009B8192838C8183832327922789278483AF +:1063F00088E234C0243099F4FF2029F0D2CF243031 +:1064000071F4F1102AC044E050E0B8016E5F7F4F94 +:10641000CE0101960E94F346892BE9F21EC024307A +:10642000E0F4E22EF12CA701B8016E5F7F4FCE01A0 +:1064300001960E94F346892B81F4D801AE0DBF1D51 +:10644000E1E0F0E0EC0FFD1FEE0DFF1D12969C91B8 +:1064500080818927C82209F4BECF80E090E0BCC0CB +:10646000F8012181322F3C7F8081803619F08AE348 +:1064700090E002C080E390E06C01F0E13F9FC00C2F +:10648000D11C112427FF0AC0207F30E1239F800DFB +:10649000911D1124DC01A054BF4F6D01E091592BD7 +:1064A000F0915A2B42E0B80180E919957E01B7E0DE +:1064B000EB0EF11C64E0C7010E94A20D8091572BE6 +:1064C00044E050E0873019F463E070E002C060E01F +:1064D00070E0CE010B960E94640E46E050E0B601DB +:1064E000CE0101960E94640E8F818093CE2988850B +:1064F0008093CF2989858093D0298A858093D1295B +:1065000060E470E08EEC99E250D28091CE298093C5 +:10651000D2298091CF298093D3298091D02980934B +:10652000D4298091D1298093D52960E270E082ED51 +:1065300099E23BD287E08093D629D801F70184E025 +:106540008E0D91919D938E13FCCFA701BE01655FC7 +:106550007F4FCE0101966ED15ACC982F9F77903302 +:1065600029F0803A19F0805C833078F481E08093E0 +:10657000D62984E0F8018083E091592BF0915A2BC1 +:1065800040E060E070E082EC36CBE091592BF09176 +:106590005A2B40E068CC8A3069F4E091592BF09195 +:1065A0005A2B46E0B80184E81995C80CD91CEA1C9E +:1065B000FB1C21CD8C3009F01ECDE091592BF091C0 +:1065C0005A2B46E0B80187E8199515CDDBD196E046 +:1065D0008927F801808384CC2F96CDBFDEBFDF9161 +:1065E000CF911F910F91FF90EF90DF90CF90BF90D0 +:1065F000AF909F908F900895CF93DF932091572B6A +:10660000273071F4EC0143E050E060E070E00E945C +:10661000640E44E050E063E070E0CE01039604C0F5 +:1066200044E050E060E070E0DF91CF910C94640EA4 +:10663000CF93DF931F92CDB7DEB72091572B273032 +:1066400029F447E050E060E070E015C0FC013181C2 +:10665000208123273281232733812327298344E084 +:1066600050E060E070E00E94B20E41E050E064E073 +:1066700070E0CE0101960E94B20E0F90DF91CF9193 +:10668000089520E42093D00026EC2093D500209399 +:10669000D40021E02093D000DC01680F791FA617F9 +:1066A000B70741F0ED91F0E0EC59FA4FE491E09337 +:1066B000D300F5CFE091D500F0E0EC59FA4FE4912A +:1066C000EC93E091D400F0E0EC59FA4FE49111968C +:1066D000EC931092D000089520E42093D00026EC93 +:1066E0002093D5002093D40021E02093D000DC013A +:1066F000680F791FA617B70741F0ED91F0E0EC594C +:10670000FA4FE491E093D300F5CFE091D500F0E0AB +:10671000EC59FA4FE4918C918E130AC0E091D400A9 +:10672000F0E0EC59FA4FE49181E011969C919E13B0 +:1067300080E01092D00081700895F091DA29A09144 +:10674000DB294091DC29E091D7293091D82920918B +:10675000D9295A2F50719F2F917E9527542F50720F +:1067600095275E2F54799527532F53779527522FCE +:106770005A739527592F52955F709527592F569523 +:1067800056959527B92FB69550E060E070E0BA01B4 +:10679000552744275A2B4F2B769567955795479544 +:1067A0009B27917098136068E093DA293093DB2976 +:1067B0002093DC294093D7295093D8296093D92975 +:1067C0000895CF93DF9387ED99E2DC011196EC9168 +:1067D0001197CE2FCF70D0E0C059DF4D2C91A22F52 +:1067E000A295AF70B0E0A059BF4D38892C91232BF2 +:1067F000E295EF70F0E0E059FF4D30A1232BDC0172 +:106800001296EC91AE2FAF70B0E0A059BF4DD0966C +:106810008C91922F982BE295EF70F0E0E055FF4DB0 +:106820008081E92FE82BF0E0E05BFF4D8081DF9174 +:10683000CF910895CF92DF92EF92FF920F931F9323 +:10684000CF93DF93FB01EA01BC016F5F7F4F07ED40 +:1068500019E2BAEDEB2EB9E2FB2E53E05E0DCB014F +:106860000197DC012C91DB018C9130E0382B88E022 +:1068700090E040E04695969520FD406821FD9068A7 +:1068800036952795369527958150A1F7D7014D93D9 +:106890007D01D8019D938D016E5F7F4F5E11DFCF2B +:1068A000918189819827C2808A81C826D12CE12CC8 +:1068B000F12C7601DD24CC24D92A90818881892786 +:1068C000C82A93818B818927F82A10E27ADF082F62 +:1068D0008C2D817032DFF694E794D794C79400230F +:1068E00011F06894F7F8115089F788818C25888316 +:1068F00089818D2589838A818E258A838B818F2545 +:106900008B83DF91CF911F910F91FF90EF90DF90DC +:10691000CF900895CF92DF92EF92FF92CF93FC0138 +:106920008181C280D12CE12CF12C7601DD24CC2494 +:10693000D82A8081C82A8381F82AC0E242DF9C2DB0 +:1069400091708927FADEF694E794D794C794C150E2 +:10695000A9F7CF91FF90EF90DF90CF9008951F930C +:10696000CF93DF93D8E0C0E02CDF182F80E0E5DE86 +:10697000C6951111C068D150B9F78C2FDF91CF9116 +:106980001F9108951F93CF93DF93D4E0C0E019DFE8 +:10699000182F80E0D2DEC6951111C860D150B9F72A +:1069A0008C2FDF91CF911F910895FC01CB010197AE +:1069B00028F14281242F2D72322F32953F702327E8 +:1069C000322F369536952327322F3695A18150E008 +:1069D00060E070E0BA01552744275A2BA0814A2B6A +:1069E000A3817A2B7695679557954795232720FDA8 +:1069F00070684083518362837383D9CF0895AF92C7 +:106A0000BF92CF92DF92EF92FF920F931F93CF939B +:106A1000DF936730710509F451C09B01277033275C +:106A2000232B09F04EC0EB016C015B0183E0B694AF +:106A3000A7948A95E1F77B0196E0F694E7949A95FE +:106A4000E1F7EA0CFB1CEC0CFD1C8501015011095F +:106A50000C0D1D1DA701401B510B60E070E0C8012B +:106A600001960E941A470C151D0520F1D801EC91E2 +:106A7000F0E0EC59FB4F44919701D7010A171B072F +:106A800068F48C91982F990FF90182919F01881FCA +:106A90008827881F892B8C931197F0CF11968C91A2 +:106AA00011978E7FE42FE170E82B1196EC93015043 +:106AB0001109D9CFC5018C0F9D1F04C087E090E05C +:106AC00001C0CB01DF91CF911F910F91FF90EF900B +:106AD000DF90CF90BF90AF900895EF92FF920F9309 +:106AE0001F93CF93DF93EC01CB0167307105D1F198 +:106AF00069E070E00E944A46DE0120E030E088E074 +:106B000090E02617370739F1F90143E0F695E7954C +:106B10004A95E1F7E20FF31FEC0FFD1F408150E0B3 +:106B2000890107701127002E02C0559547950A94D8 +:106B3000E2F74C930115110551F0E1817C01E01A57 +:106B4000F10A01C0EE0FEA94EAF74E2B4C932F5F47 +:106B50003F4F1196D6CFC90123E0880F991F2A9580 +:106B6000E1F702C087E090E0DF91CF911F910F9194 +:106B7000FF90EF900895CF93DF93FC0161157105AD +:106B800011F18081869580839B01295F3F4F83E0CF +:106B9000369527958A95E1F7DF0141E050E04217ED +:106BA000530770F4C1919081D0E89D9FC0011124DA +:106BB0008C2B8D938081869580834F5F5F4FEFCFC5 +:106BC000CB01019702C080E090E0DF91CF91089562 +:106BD000EF92FF920F931F93CF93DF93EC01CB01C2 +:106BE0006730710509F442C069E070E00E944A46CE +:106BF00020E030E088E090E026173707B9F1D901AE +:106C000043E0B695A7954A95E1F7A20FB31FA901F6 +:106C100047705527AC0FBD1FEC91F0E0042E02C069 +:106C2000F595E7950A94E2F74115510559F011964B +:106C30000C9111977C01E41AF50A01C0000FEA9447 +:106C4000EAF7E02BF0E0EC59FB4FE4911196AC91A0 +:106C5000B0E08D0102C0159507954A95E2F7A801AD +:106C60004E2740FD05C02F5F3F4FC6CF81E001C0DA +:106C700080E0DF91CF911F910F91FF90EF900895E9 +:106C800010923D2A089510923D2A1092DD2910920B +:106C90003E2A0895F8DF0E94812910923D2A089526 +:106CA00008950895DC0123E633E66150E8F04D9144 +:106CB000942F922780E1989FA00111244927E42F67 +:106CC000F0E042954F70232F3327C9018427AC0190 +:106CD0003E2F22272427352743E0EE0FFF1F4A953A +:106CE000E1F72E273F27E1CFC90108958F929F92A8 +:106CF000AF92BF92CF92DF92EF92FF920F931F93CA +:106D0000CF93DF93CDB7DEB7C154D240CDBFDEBF46 +:106D10008C016B018091DD29833009F440C138F486 +:106D2000813069F0823009F4B5C00C94D73E8430CC +:106D300009F4B3C2853009F4D8C40C94D73EE0906E +:106D40003F2BF090402BE114F104C1F0A701495F03 +:106D50005F4F23E0569547952A95E1F76FE37AE276 +:106D6000C8010E94004760913F2B7091402BC801E1 +:106D700046DE10923F2B1092402BB5C46115710571 +:106D800009F4AAC0C801F7DE5C01BC01C80120DF1C +:106D9000D82EB501C801A1DE5C019C01295F3F4FDF +:106DA000A901440F551F93E0569547959A95E1F731 +:106DB0004A5F5F4F4138510538F060EC70E2CE0118 +:106DC00001960E942C4791C0A3E036952795AA957D +:106DD000E1F7A80160E870E0CE0101960E94BB0DCA +:106DE0008C01CF5FDD4FB882C150D240CE5FDD4F06 +:106DF000A882C250D24083E691E29F938F93B0E87D +:106E0000AB2EB12CC501801B910B9F938F9381E01A +:106E100090E08C0F9D1F800F911F9F938F930E9476 +:106E20003347080F191FB501601B710B22E030E0DA +:106E3000AE014F5F5D4F81E090E08C0F9D1F800F92 +:106E4000911F0E94BB0D800F911F0F900F900F900C +:106E50000F900F900F90A501481B590B21E030E0D7 +:106E60002C0F3D1F280F391FD11003C08FEC90E26B +:106E700002C08EED90E29F938F935F934F933F9369 +:106E80002F930E9433470F900F900F900F900F9009 +:106E90000F902BC0E0903F2BF090402BE114F104B9 +:106EA000C1F0A701495F5F4FF3E056954795FA950A +:106EB000E1F76FE37AE2C8010E94004790913F2B0F +:106EC0008091402B10923F2B1092402BE92EF82EF0 +:106ED00070C76115710591F488E0E9E7F1E2DE0120 +:106EE000119601900D928A95E1F71092DD29BE016D +:106EF0006F5F7F4F85E60E947C215BC79B01295F06 +:106F00003F4F73E0369527957A95E1F7A80160E841 +:106F100070E0CE0101960E94BB0D8C01CF5FDD4F6A +:106F2000D882C150D240CE5FDD4FC882C250D2401D +:106F300083E691E29F938F93E0E8CE2ED12CC60199 +:106F4000801B910B9F938F9381E090E08C0F9D1F8E +:106F5000800F911F9F938F930E943347800F911F43 +:106F6000B601681B790B22E030E0AE014F5F5D4F48 +:106F7000A1E0B0E0AC0FBD1F8A0F9B1F0E94BB0DAC +:106F80001092DD29BE016F5F7F4F85E60E947C2154 +:106F90000F900F900F900F900F900F900AC7809155 +:106FA0003E2AB0903D2A882331F0B1E0BB1508F4A9 +:106FB00055C110923E2AE5E0EB15B8F0F3E0BF169C +:106FC00008F040C021E02B15C8F081E090E08093EC +:106FD00020209093212082E5D8018C9382E0809339 +:106FE0003D2A67E0E62EF12C3BC138E03B1508F066 +:106FF000A8C08AE0B81609F4F5C030C1B3E1CB16D9 +:10700000D10408F4B9C0B601C801B5DD7C01BC01EA +:10701000C801DEDD882319F1B701C8015EDDF80182 +:10702000818190E0982F88272081822B80932F2ABE +:107030009093302A83E9808380E2818383E0809388 +:107040003D2ABCC0B601C80196DD7C01BC01C80167 +:10705000BFDD882321F0F8E0EF16F10488F41092E8 +:107060003D2AC701089667E070E00E944A46462F15 +:10707000E091592BF0915A2BB80181EC1995B8C0C9 +:10708000B701C8012ADDD8012C9111968C91119776 +:10709000822712969C911297892713969C91139799 +:1070A000892714969C911497891366C08B2D90E0C4 +:1070B0000397283881F49C01220F331F820F931FFE +:1070C000FC01EE5CF54D11962D913D914C91208384 +:1070D0003183428312C0FC01EE0FFF1F8E0F9F1FF2 +:1070E0009C012E5C354DF80180819181A281B38194 +:1070F000F90180839183A283B38345E050E0B80116 +:10710000C80102960E940947F3E0BF1629F024E067 +:10711000B21621F087E903C083E901C085E9D801EF +:107120008C9380E711968C9367E0C801BBDDF80172 +:107130008783908783E08B0D80933D2A68E470E01D +:1071400089C0F9E0CF16D104B8F0B601C80113DD4B +:107150007C01BC01C8013CDD811111C0C70108964A +:1071600067E070E00E944A46462FE091592BF0916B +:107170005A2BB80181EC199510923D2A39C0B701FC +:10718000C801ABDC63E0C8018DDD7C01892BA1F770 +:10719000D8018C9182FF15C0B8E0BB1691F0E6E0F3 +:1071A000BE1611F087E901C085E9D8018C9380E211 +:1071B00011968C93BA94BA94B0923D2A60E170E033 +:1071C00049C081E080933E2A8B2D90E00697B82E2F +:1071D000BB0C8B0D8C5F80933C2AF80180818093DF +:1071E000312A3EC0C114D10431F481E080933D2A9C +:1071F0000E947B2933C0B601C801BDDC7C01BC0103 +:10720000C801E6DC81110FC0C701089667E070E095 +:107210000E944A46462FE091592BF0915A2BB80113 +:1072200081EC199508C0B701C80157DC63E0C801BB +:1072300039DD892BD1F282ECD8018C9361E0C80151 +:1072400031DDF80181839283B0923D2A10923E2A6B +:1072500068E170E0C801D3DB7C0102C0E12CF12CB5 +:1072600080913E2A882309F4A4C520913C2A30E06D +:1072700042E35AE264E170E0CE0101960E94BB0D48 +:10728000BE016F5F7F4F85E60E947C2110923E2AEF +:107290001092DD290E9413228AC580913E2AB09067 +:1072A0003D2A882331F0F1E0FB1508F451C110921A +:1072B0003E2A25E02B15B8F033E0B31608F043C0A2 +:1072C00081E08B15C8F081E090E0809320209093BE +:1072D000212082E5F801808382E080933D2AE7E067 +:1072E000EE2EF12C37C1A8E0AB1508F0A4C0BAE02F +:1072F000BB1609F4F1C02CC1F3E1CF16D10408F498 +:10730000B5C0B601C80137DC7C01BC01C80160DC36 +:10731000882331F1B701C801E0DBD80111968C91C7 +:10732000119790E0982F88272C91822B80932F2AF9 +:107330009093302A83E98C9380E211968C9383E0BA +:1073400080933D2AB5C0B601C80115DC7C01BC01A3 +:10735000C8013EDC882321F0B8E0EB16F10488F484 +:1073600010923D2AC701089667E070E00E944A46E5 +:10737000462FE091592BF0915A2BB80181EC1995C9 +:10738000B1C0B701C801A9DBF80120818181822742 +:1073900092818927938189279481891367C08B2DD6 +:1073A00090E00397283889F49C01220F331F820F45 +:1073B000931FFC01EE5CF54DD80111962D913D9186 +:1073C0004C9120833183428312C0FC01EE0FFF1FDA +:1073D0008E0F9F1F9C012E5C354DF801808191819D +:1073E000A281B381F90180839183A283B38345E0B5 +:1073F00050E0B801C80102960E940947F3E0BF16A9 +:1074000029F024E0B21621F087E903C083E901C026 +:1074100085E9D8018C9380E711968C9367E0C801C9 +:1074200041DCF8018783908783E08B0D80933D2AB0 +:1074300068E470E089C0F9E0CF16D104B8F0B60175 +:10744000C80199DB7C01BC01C801C2DB811111C0FC +:10745000C701089667E070E00E944A46462FE09117 +:10746000592BF0915A2BB80181EC199510923D2AB5 +:1074700039C0B701C80131DB63E0C80113DC7C010E +:10748000892BA1F7D8018C9182FF15C0B8E0BB16FB +:1074900091F0E6E0BE1611F087E901C085E9D80158 +:1074A0008C9380E211968C93BA94BA94B0923D2A50 +:1074B00060E170E049C081E080933E2A8B2D90E02E +:1074C0000697B82EBB0C8B0D8C5F80933C2AF8017D +:1074D00080818093312A3EC0C114D10431F481E00F +:1074E00080933D2A0E947B2933C0B601C80143DB4B +:1074F0007C01BC01C8016CDB81110FC0C70108967B +:1075000067E070E00E944A46462FE091592BF091C7 +:107510005A2BB80181EC199508C0B701C801DDDA12 +:1075200063E0C801BFDB892BD1F282ECD8018C93D8 +:1075300061E0C801B7DBF80181839283B0923D2AF4 +:1075400010923E2A68E170E0C80159DA7C0102C05D +:10755000E12CF12C80913E2A882309F42AC4F09072 +:107560001E2AFF20A9F1B601C80105DB5C010097C6 +:1075700029F410921E2A10923E2A42C0823A9105A6 +:1075800040F0BC01C80124DB91E08927C82ED12C32 +:1075900003C0CC24C394D12CB501C8019EDACD28F8 +:1075A00029F462E1C8017EDB892B29F0ACEFAF0D35 +:1075B000A0931E2A2AC024E0F29ED0011124A253D7 +:1075C000B64D80E1F80101900D928A95E1F71DC05A +:1075D00042E050E06BE371E1CE0101960E94D24699 +:1075E000EEE3F1E1E49120912F2A3091302A898154 +:1075F0009A812817390721F48091312A8E1729F0B2 +:1076000010923D2A0E947B29D2C320911E2A20314C +:1076100009F04DC010923E2A10921E2A1092DD29C8 +:1076200020E130E04EED59E267E870E0CE010196CE +:107630000E94BB0D63E671E2CE0181960E942C4749 +:1076400020E130E04EEE59E265E670E0CE0183962F +:107650000E94BB0D63E671E2CE018D5B9F4F0E94DD +:107660002C4720E130E04EEF59E263E470E0CE01B8 +:107670008B5B9F4F0E94BB0D63E671E2CE018B597D +:107680009F4F0E942C4720E130E04EE05AE261E239 +:1076900070E0CE0189599F4F0E94BB0D0E941322BA +:1076A000BE016F5F7F4F85E60E947C2180C380E32F +:1076B000D8018C9311962C9362E0C801CF5BDD4F0B +:1076C0002883C154D240EEDAF80182839383CF5BE2 +:1076D000DD4F2881C154D2402C5F20931E2A60E2E6 +:1076E00070E0C8018CD97C0164C380913E2AB090BF +:1076F0003D2A882331F0F1E0FB1508F451C11092C6 +:107700003E2A25E02B15B8F033E0B31608F043C04D +:1077100081E08B15C8F081E090E080932020909369 +:10772000212082E5F801808382E080933D2A37E0C2 +:10773000E32EF12C37C1A8E0AB1508F0A4C0BAE0E5 +:10774000BB1609F4F1C02CC1F3E1CF16D10408F443 +:10775000B5C0B601C8010FDA7C01BC01C80138DA36 +:10776000882331F1B701C801B8D9D80111968C919D +:10777000119790E0982F88272C91822B80932F2AA5 +:107780009093302A83E98C9380E211968C9383E066 +:1077900080933D2AB5C0B601C801EDD97C01BC017A +:1077A000C80116DA882321F0B8E0EB16F10488F45A +:1077B00010923D2AC701089667E070E00E944A4691 +:1077C000462FE091592BF0915A2BB80181EC199575 +:1077D000B1C0B701C80181D9F80120818181822718 +:1077E00092818927938189279481891367C08B2D82 +:1077F00090E00397283889F49C01220F331F820FF1 +:10780000931FFC01EE5CF54DD80111962D913D9131 +:107810004C9120833183428312C0FC01EE0FFF1F85 +:107820008E0F9F1F9C012E5C354DF8018081918148 +:10783000A281B381F90180839183A283B38345E060 +:1078400050E0B801C80102960E940947F3E0BF1654 +:1078500029F024E0B21621F087E903C083E901C0D2 +:1078600085E9D8018C9380E711968C9367E0C80175 +:1078700019DAF8018783908783E08B0D80933D2A86 +:1078800068E470E089C0F9E0CF16D104B8F0B60121 +:10789000C80171D97C01BC01C8019AD9811111C0FC +:1078A000C701089667E070E00E944A46462FE091C3 +:1078B000592BF0915A2BB80181EC199510923D2A61 +:1078C00039C0B701C80109D963E0C801EBD97C010F +:1078D000892BA1F7D8018C9182FF15C0B8E0BB16A7 +:1078E00091F0E6E0BE1611F087E901C085E9D80104 +:1078F0008C9380E211968C93BA94BA94B0923D2AFC +:1079000060E170E049C081E080933E2A8B2D90E0D9 +:107910000697B82EBB0C8B0D8C5F80933C2AF80128 +:1079200080818093312A3EC0C114D10431F481E0BA +:1079300080933D2A0E947B2933C0B601C8011BD920 +:107940007C01BC01C80144D981110FC0C701089650 +:1079500067E070E00E944A46462FE091592BF09173 +:107960005A2BB80181EC199508C0B701C801B5D8E8 +:1079700063E0C80197D9892BD1F282ECD8018C93AE +:1079800061E0C8018FD9F80181839283B0923D2ACA +:1079900010923E2A68E170E0C80131D87C0102C033 +:1079A000E12CF12C80913E2A882309F402C28091B7 +:1079B0003D2A9AEF980F933008F04EC0D801FC9002 +:1079C000F5FAFF24F0F810921F2AE6E0AE2EE0E16F +:1079D000BE2EE12C47E650E0B501CE0101960E9493 +:1079E000D2468B81882349F029813A8180912F2AC0 +:1079F0009091302A28173907B9F48D81882329F00E +:107A00009C818091312A98130FC08F89882311F0AF +:107A1000FF2051F0E0911F2A81E08E0F80931F2AF2 +:107A2000F0E0E05EF54DE082E394B7E6AB0EB11C0A +:107A3000EFE0EE12CFCFFF2009F493C080EED80123 +:107A40008C9380E811968C9362E0C8012BD9F801E1 +:107A50008283938389E0A6C0893009F082C0B60191 +:107A6000C80189D87C01BC01C801B2D881110FC0FE +:107A7000C701089667E070E00E944A46462FE091F1 +:107A8000592BF0915A2BB80181EC1995BEC0B70162 +:107A9000C80123D86C01D8016C91262F30E073E027 +:107AA000969587957A95E1F702972817390729F473 +:107AB0006E5FC801F7D8892B69F082ECF8018083EA +:107AC00061E0C801EFD8D80111968C9311971296F6 +:107AD0009C93A4C0F12C67E6E62E5801FFEFAF1A85 +:107AE000BF0A80911F2AF816E0F5EF2DF0E0E05E66 +:107AF000F54D6081E69EB00111246A5F7F4E47E636 +:107B000050E0CE0101960E94D2468F89882339F138 +:107B10004E8950E0F801808190E00197481759079D +:107B200039F4B501CE0106960E94F346892BB9F0CF +:107B300020911F2A422F50E0415051093F2D832FA1 +:107B400090E0841795073CF4FC01E05EF54D8181DF +:107B500080833F5FF4CF215020931F2AFA94F3943F +:107B6000C0CF80913D2A9AEF980F9430F0F4909115 +:107B70001F2A20E23AE2F9018E2F821B891708F0B2 +:107B800069C0819184508230B8F782E0D8018C932B +:107B900080E611968C9362E0C80184D8F801828354 +:107BA00093838BE080933D2A9ACD8B3009F052C0AD +:107BB000C114D10409F44CC0B601C8010E94BB3500 +:107BC0007C01BC01C80104D881110FC0C70108960F +:107BD00067E070E00E944A46462FE091592BF091F1 +:107BE0005A2BB80181EC19950EC0B701C8010E944B +:107BF0006D3553E0969587955A95E1F7682FC80142 +:107C000051D8892B99F010921F2A82ECD8018C93BD +:107C100061E0C80147D8F801818392838AE08093AC +:107C20003D2A10923E2A68E170E05BCDD80115969E +:107C30008C91882331F0813059F480931F2A85E09C +:107C400004C081E080931F2A84E08093202A02C030 +:107C500010921F2A80911F2A811103C06AEE70E2E0 +:107C600013C08130A9F46091202AB7E66B9FB00160 +:107C70001124635D7F4E40E450E0CE0101960E94E6 +:107C8000D246BE016F5F7F4F85E60E947C2168C0AF +:107C9000912C80E090E000E010E027E6822E7E014B +:107CA0003FEFE31A3DEFF30A3DEFC32E30E2D32E50 +:107CB000A12C42E0B42E20911F2A921680F50130AB +:107CC000E2E01E0720F0081B190BF12C2EC0E92D55 +:107CD000F0E0E05EF54D6081869EB0011124635DA9 +:107CE0007F4E40E450E0C7010E94D246FF92EF92DF +:107CF000DF92CF92C501801B910B9F938F9381E000 +:107D000090E08C0F9D1F800F911F9F938F930E9477 +:107D10003347080F191F9394CDBFDEBFCCCF01307E +:107D2000A2E01A0780F6FF24F394EDEFFFEFEC0FCB +:107D3000FD1FE00FF11F8EE28083EEEFFFEFEC0FEF +:107D4000FD1FE00FF11F1082BE016F5F7F4F85E6C0 +:107D50000E947C21F11004C084E091E20E941B1873 +:107D600086E691E20E941B1862E070E08FE29AE2E0 +:107D70000E949A218DE691E20E941B1860913C2A94 +:107D800070E082E39AE20E949A2183E791E20E94E6 +:107D90001B1861E070E081E39AE20E949A21109240 +:107DA000DD2910921F2A0E94132210923E2AE12CF4 +:107DB000F12CC701CF5BDD4FCDBFDEBFDF91CF918F +:107DC0001F910F91FF90EF90DF90CF90BF90AF90F9 +:107DD0009F908F900895FF920F931F93CF93DF93FF +:107DE000CDB7DEB7EA97CDBFDEBF03EB1EE288E07A +:107DF000F82EF00E91D2F80181938F01FE12FACF86 +:107E00000E94CF1804D3882309F4F7C08091B32EC1 +:107E10009091B42E953009F46FC030F4913069F12F +:107E200068F0933051F1E9C0983009F4C2C099303C +:107E300009F4C8C0963009F0E0C072C0803891F0F3 +:107E4000823809F0DAC08091B72E8F7085D2E09128 +:107E5000BD2EF091BE2E118112FB112710F980E08A +:107E60007BD206C01091AF2E8091B02E811112608E +:107E7000E8D2812F61D280E0A1C0282F2D7F09F0A8 +:107E8000BCC0882319F0823061F0B7C08091B52E54 +:107E9000813009F0B2C0933009F080E08093B02EB9 +:107EA00027C08091B52E811123C0E091B72E1E2FDF +:107EB0001F7009F4A2C0812F4FD28091B42E83305D +:107EC00011F4EBD215C0E091BD2EF091BE2E818150 +:107ED0008B7F818324E8129FF0011124EF5FF04D26 +:107EE0001082E091BD2EF091BE2E80818E7F808326 +:107EF00080E032D2A6D264C081117FC01091B52E2D +:107F00001F779FD2A1D35DD28823E9F31093C304D6 +:107F1000111102C082E001C083E08093B22E6DC0D7 +:107F20008058823008F069C08091B52E9091B62EAD +:107F30008C3DE3E09E0761F583E08A838AE38983D1 +:107F40004FB7F894DE01139620E038E052E05093EA +:107F5000CA01E32FF0E0E4911092CA0120FF03C0B0 +:107F6000E295EF703F5FEF708E2F90E0EA3010F0F7 +:107F7000C79601C0C0968D939D932F5F2C3139F722 +:107F80004FBF5FD26AE370E0CE010196A3D00FC06D +:107F9000AE014F5F5F4F6091B72E0E94270C8C019E +:107FA000892B59F14ED2B80189819A810FD1A5D17F +:107FB00024C0803811F545D28091AE2EBDD184D138 +:107FC00043D31BC0811119C08091B52E8230A8F413 +:107FD00038D28091B52E8093AE2E36D38091AE2EBE +:107FE000811106C08091C304811102C081E001C0EB +:107FF00084E08093B22E0E94CB1809D2882311F01E +:1080000020D24BD2EA96CDBFDEBFDF91CF911F9138 +:108010000F91FF9008950895CF938091B22E8823F9 +:1080200051F0C091BF2E80E097D1F1D18111D3DE04 +:108030008C2FCF9191C1CF910895CF92DF92EF9283 +:10804000FF920F931F93CF93DF93EC018B017A0183 +:1080500011D3811136C0E114F10439F0F7018081A8 +:108060009181081B190BC80FD91FC12CD12C0115E8 +:10807000110531F18091BB2E9091BC2EFC01EF5B7C +:10808000FF4F208131978081281790F01DD1C4DFE8 +:10809000E114F10449F0F70180819181C80ED91EE5 +:1080A000C082D18285E00DC0E5D2882301F309C0EA +:1080B000899142D101501109FFEFCF1ADF0AD7CFC2 +:1080C00080E0DF91CF911F910F91FF90EF90DF90B3 +:1080D000CF900895DF92EF92FF920F931F93CF936B +:1080E000DF93D82FC92F8B018091BF2E806834D1A8 +:1080F0002091B92E3091BA2E2017310728F00115A2 +:10810000110519F4E1D001C08901ED2EFC2ED12C0E +:108110000115110509F440C08091B22E811102C0F1 +:1081200082E04CC0853011F483E048C070D18823D0 +:1081300011F081E043C051D181113CC042D188236C +:1081400039F32091BF2E8091BB2E9091BC2EFC0163 +:1081500027FF05C0EF5BFF4FC081D0E013C0E05C9C +:10816000FF4FC08131968081D0E0C81BD1090AC081 +:10817000C830D10550F4F70181917F01DDD0015065 +:10818000110921960115110599F7DD24D39428973B +:1081900009F0D12C99D0BCCFD110BECF0BC08091AB +:1081A000B22E882309F4BCCF853009F4BDCF2FD17E +:1081B0008111BFCF12D1882391F380E0DF91CF915D +:1081C0001F910F91FF90EF90DF900895DF92EF9253 +:1081D000FF920F931F93CF93DF93D82FC92F8B015B +:1081E0008091BF2E8068B8D02091B92E3091BA2EE0 +:1081F0002017310728F00115110519F465D001C0C9 +:108200008901ED2EFC2ED12C0115110509F442C077 +:108210008091B22E811102C082E04EC0853011F4EF +:1082200083E04AC0F4D0882311F081E045C0D5D066 +:1082300081113EC0C6D0882339F32091BF2E809192 +:10824000BB2E9091BC2EFC0127FF05C0EF5BFF4FBA +:10825000C081D0E015C0E05CFF4FC08131968081C5 +:10826000D0E0C81BD1090CC0C830D10560F4F701BB +:10827000849162D0FFEFEF1AFF0A01501109219695 +:108280000115110589F7DD24D394289709F0D12C25 +:108290001BD0BACFD110BCCF0BC08091B22E882397 +:1082A00009F4BACF853009F4BBCFB1D08111BDCF6D +:1082B00094D0882391F380E0DF91CF911F910F91AB +:1082C000FF90EF90DF900895E091BD2EF091BE2ECB +:1082D000A091BB2EB091BC2EAF5BBF4F8C9190E0B4 +:1082E0008283938380818D798083E091BB2EF0918E +:1082F000BC2EEF5BFF4F10820895E091BD2EF091F0 +:10830000BE2E80818D798083E091BB2EF091BC2EB2 +:10831000EF5BFF4F108208958091BB2E9091BC2E91 +:10832000FC01EF5BFF4F208131E0320F3083FC0115 +:10833000E20FF11D808108952091BB2E3091BC2E5B +:10834000F901EF5BFF4F908141E0490F4083F90154 +:10835000E90FF11D808308958093BF2E482F4F7041 +:1083600050E06091C6047091C7049A0194E0220F16 +:10837000331F9A95E1F7E4E887FF11C0E49FC0013D +:10838000E59F900D11248E5F904D8093BB2E9093AE +:10839000BC2EC90108969B01280F391F0DC0E49F10 +:1083A000C001E59F900D11248054914D8093BB2E08 +:1083B0009093BC2E260F371F2093BD2E3093BE2ED8 +:1083C00008958091BF2E8068C7DFE091BD2EF091A7 +:1083D000BE2E80818695817008958091BF2E8F7703 +:1083E000BBDFA091BD2EB091BE2E8C9185FF0DC03C +:1083F000E091BB2EF091BC2E12968D919C9113971B +:10840000E05CFF4F808381E0089580E008958091D3 +:10841000BF2E8F77A1DFA091BD2EB091BE2E8C9183 +:1084200084FF0DC0E091BB2EF091BC2E12968D9171 +:108430009C911397E05CFF4F808381E0089580E07A +:1084400008958091BF2E8F7787DFE091BD2EF09148 +:10845000BE2E80818D788083E091BD2EF091BE2E5E +:10846000808181608083E091BB2EF091BC2EEF5B18 +:10847000FF4F10828091BF2E80686EDFE091BD2E8D +:10848000F091BE2E808181608083E091BB2EF091BF +:10849000BC2EEF5BFF4F10820895E091BD2EF0914E +:1084A000BE2E818184608183E091BD2EF091BE2E2D +:1084B0008181807C803459F48091BF2E80584CDFBC +:1084C000E091BD2EF091BE2E81818460818308955C +:1084D0001F93CF93DF931F921F92CDB7DEB7182F54 +:1084E0004A83698339DFE091BD2EF091BE2E11825F +:1084F000E091BD2EF091BE2E812F881F8827881F06 +:10850000880F8083E091BD2EF091BE2E698161833A +:10851000E091BD2EF091BE2E128213822091BB2ECF +:108520003091BC2E24833583110F110B4A814123D6 +:10853000F901E05CFF4F40833196108281E00F909B +:108540000F90DF91CF911F910895AF92BF92CF927C +:10855000DF92EF92FF920F931F93CF93DF93A62E9C +:108560008C017C0184E0E80EF11CB12CBA1409F4F2 +:1085700043C0F801D081DD23C1F1C180D280F70171 +:1085800031978081F7019081923010F498E001C01A +:1085900098E128E030E0C0E02C153D0520F4CF5FE5 +:1085A000220F331FF9CFC92B9D2F9F70963010F0EB +:1085B00080E023C0CF7EF1E4CF16D104C8F7882332 +:1085C00021F0813021F4C06C0AC0C06403C0C068CF +:1085D000811105C04C2D6C2F80E88D0F79DF4C2D5B +:1085E0006C2F8D2F75DF882319F3B3940B5F1F4F0A +:1085F00085E0E80EF11CBACF81E0DF91CF911F91A9 +:108600000F91FF90EF90DF90CF90BF90AF900895C3 +:1086100080E090E0E091C604F091C7049C0144E042 +:10862000220F331F4A95E1F7E20FF31F11864091A5 +:10863000C6045091C704FA01E20FF31F118201969C +:108640008630910539F708958091B32E87FF0DC0CC +:10865000C4DE811105C08091B22E8111F9CF09C00D +:108660004CCE8091B22E882321F0ABDE8823C9F353 +:108670002BCE08950F931F93CF93E091C604F091F2 +:10868000C704E05AFF4F00811181C4E68091BF2EDC +:1086900087FF0AC096DE811105C08091B22E81113C +:1086A00005C021C080E024C098DEF5CF8530E9F018 +:1086B000E091BD2EF091BE2E818182FD18C0E09127 +:1086C000C604F091C704E05AFF4F80819181801762 +:1086D0009107E1F22FEF2C0FCC2319F08C01C22F60 +:1086E000D5CF84E005C082E003C083E001C081E013 +:1086F000CF911F910F91089563D069D0E0ECF4E021 +:1087000081818E7F818380818F7780831092B12ECB +:108710000895CF93DF93E0E4F0E0148284818360D6 +:1087200084834ED054D0C0ECD4E088818F77888386 +:108730008881806888831092B22E1092AE2E10929B +:10874000B02E1092AF2E88818064888348E068E460 +:1087500080E8BEDE48E068E480E0BADE88858064B8 +:108760008887898181608983DF91CF910895CF9334 +:10877000DF933FB7F894C0ECD1E022E02A87EAE12A +:10878000F0E0E491A0ECB4E0DA96EC93DA97EBE158 +:10879000F0E0E491DB96EC93DB971A8689ED91E3A8 +:1087A0008E7F16968D939C93179785E18C931896E0 +:1087B0002C933FBF81E08093B12EDF91CF91A9CF61 +:1087C000E0ECF4E080858370808711860895E0EC0A +:1087D000F4E08FEF8287848708951F920F920FB67F +:1087E0000F92112408B60F9218BE09B60F9219BE47 +:1087F0000BB60F921BBE2F933F934F935F936F93D4 +:108800007F938F939F93AF93BF93EF93FF93809149 +:10881000CA0487FF08C08091C80487FF04C080E8AD +:108820008093CA04F8DB8091CA0486FF07C080E405 +:108830008093CA041092B22E0E94BA188091CA0482 +:1088400085FF14C080E28093CA048091AE2E8823F5 +:1088500011F084E007C08091C304811102C081E05F +:1088600001C083E08093B22E0E94A9188091CA04AF +:1088700084FF14C080E18093CA0482E08093B22E0A +:108880001092AE2E1092C304C3DE48E068E480E884 +:108890001FDE48E068E480E01BDEBDDBFF91EF9166 +:1088A000BF91AF919F918F917F916F915F914F9108 +:1088B0003F912F910F900BBE0F9009BE0F9008BEF5 +:1088C0000F900FBE0F901F901895CF93DF93EC0180 +:1088D000FC0170968BE0DF011D928A95E9F782E03A +:1088E0008C83898783E08E8761E0CE0101962DDE3F +:1088F000882361F061E0CE01069627DE882331F0FF +:1089000061E0CE010B96DF91CF911FCE80E0DF9129 +:10891000CF9108950F931F93CF93DF932091B22EA1 +:108920002430E1F4FC010489158926893789012B5B +:10893000022B032B99F0EB0181810EDDFE010190EA +:108940000020E9F73197BF016C1B7D0B40E050E040 +:10895000CE01DF91CF911F910F916FCB82E0DF911C +:10896000CF911F910F9108950F931F93CF93DF9392 +:10897000FC018091B22E8430A9F484899589A6895E +:10898000B789892B8A2B8B2B69F08A01EB018181B6 +:10899000E3DC40E050E0B801CE01DF91CF911F91C0 +:1089A0000F914BCB82E0DF91CF911F910F910895F2 +:1089B000CF93FC018091B22E843001F58489958992 +:1089C000A689B789892B8A2B8B2BC1F0C62F818171 +:1089D000C3DC2091BB2E3091BC2EF901EF5BFF4F21 +:1089E000908131978081981720F48C2FA5DC80E04E +:1089F00006C06ADC3FDE8823C1F301C082E0CF916C +:108A00000895CF93DF932091B22E243091F5FC018D +:108A10004489558966897789452B462B472B49F12F +:108A200081819ADC8091BF2E2091BB2E3091BC2E8B +:108A3000F90187FF05C0EF5BFF4F808190E008C020 +:108A4000E05CFF4F80813196408190E0841B91096A +:108A5000892B69F0F901EF5BFF4FD0813197C0811D +:108A600033DCDC1720F006DE811104C02DDC80E051 +:108A700001C082E0DF91CF910895CF93DF932091E1 +:108A8000B22E243099F4FC0144895589668977898E +:108A9000452B462B472B51F0EC0181815DDC91DCAD +:108AA000882321F0CE01DF91CF91ABCFDF91CF9121 +:108AB0000895CF93DF932091B22E243019F08FEFD9 +:108AC0009FEF46C0FC014489558966897789452B0B +:108AD000462B472BA1F386813FDC7FDC882379F38B +:108AE0008091BF2E2091BB2E3091BC2EF90187FFC3 +:108AF00005C0EF5BFF4F808190E008C0E05CFF4F56 +:108B000080813196208190E0821B9109892B21F090 +:108B100003DCC82FD0E002C0CFEFDFEF2091BF2EE3 +:108B20008091BB2E9091BC2EFC0127FF05C0EF5B0E +:108B3000FF4F208130E008C0E05CFF4F208131967C +:108B4000808130E0281B3109232B09F4D6DBCE01CC +:108B5000DF91CF9108950895FF920F931F93CF93C4 +:108B6000DF93EC0154DC882309F48EC0888190E007 +:108B70002091B72E3091B82E2817390709F084C0FC +:108B80008091B42E813259F018F4803249F17CC0C2 +:108B9000823209F457C0833209F467C075C08091EE +:108BA000B32E813A09F070C04CDC0BDC8823E9F36A +:108BB0008C89FD880E891F89BFDB8F2DBDDB802F3F +:108BC000BBDB812FB9DB888DB7DB898DB5DB8A8D67 +:108BD000B3DB7ADBDF91CF911F910F91FF9034CD02 +:108BE0008091B32E813209F04FC02BDCF6DB81116E +:108BF00005C08091B22E8111F9CF46C08DDB082FC0 +:108C00008BDB182F89DBF82E87DB4F2D50E060E0DF +:108C100070E0BA0155274427782B402B512B4C8B01 +:108C20005D8B6E8B7F8B78DB888F76DB898F74DB37 +:108C30008A8F63DB09DDCE01DF91CF911F910F9108 +:108C4000FF9089CF8091B32E8132F1F4FADBFCDC06 +:108C50008091B52E9091B62E888B998BCE01DF91A5 +:108C6000CF911F910F91FF9076CF8091B32E8132DB +:108C700059F4E7DBE9DC6091B52ECE01DF91CF91AD +:108C80001F910F91FF9067CFDF91CF911F910F91AF +:108C9000FF900895AA1BBB1B51E107C0AA1FBB1F71 +:108CA000A617B70710F0A61BB70B881F991F5A9578 +:108CB000A9F780959095BC01CD010895B7FF04C038 +:108CC00003D0821B930B089509D0A59F900DB49FEC +:108CD000900DA49F800D911D11240895A29FB001B5 +:108CE000B39FC001A39F700D811D1124911DB29FE0 +:108CF000700D811D1124911D08958F929F92AF9246 +:108D0000BF92CF92DF92EF92FF92CF93DF93EC016D +:108D1000688179818A819B81611571058105910541 +:108D200021F464E279ED8BE597E02DE133EF41E04A +:108D300050E0E2D649015A019B01AC01A7EAB1E437 +:108D4000C3DF6B017C01ACEEB4EFA5019401B8DF89 +:108D5000DC01CB018C0D9D1DAE1DBF1DB7FF03C0F7 +:108D60000197A109B04888839983AA83BB839F7721 +:108D7000DF91CF91FF90EF90DF90CF90BF90AF90B9 +:108D80009F908F900895B9CF82E290E2B6CFA0E095 +:108D9000B0E08093222090932320A0932420B093CE +:108DA00025200895FB01DC0102C005900D92415081 +:108DB0005040D8F70895FB01DC018D910590801992 +:108DC0000110D9F3990B0895FB01DC01415050408B +:108DD00048F005900D920020C9F701C01D92415046 +:108DE0005040E0F70895FB01DC0104C08D91019033 +:108DF000801921F441505040C8F7881B990B089501 +:108E0000FB01DC0102C001900D9241505040D8F7A7 +:108E100008956817790768F4FB01DC01E40FF51F7A +:108E2000A40FB51F02C002900E9241505040D8F7D7 +:108E30000895E6CFDC0101C06D9341505040E0F74A +:108E40000895FC018191861721F08823D9F799278D +:108E500008953197CF010895FB01DC0101900D9237 +:108E60000020E1F708950F931F93CF93DF93CDB7C1 +:108E7000DEB72E97CDBFDEBF0E891F89888D998DF5 +:108E800026E02C8309831A8397FF02C080E090E8D4 +:108E900001978D839E83AE01445E5F4F6A8D7B8D0B +:108EA000CE01019667D04D815E8157FD0AC02F81AA +:108EB0003885421753070CF49A01F801E20FF31FAB +:108EC00010822E96CDBFDEBFDF91CF911F910F9103 +:108ED00008950F931F93CF93DF93CDB7DEB72E97EF +:108EE000CDBFDEBF0E891F89888D998D2EE02C8322 +:108EF00009831A8397FF02C080E090E801978D8371 +:108F00009E83AE01445E5F4F6A8D7B8DCE010196DC +:108F100031D04D815E8157FD0AC02F8138854217BF +:108F200053070CF49A01F801E20FF31F10822E96FA +:108F3000CDBFDEBFDF91CF911F910F910895CF93E9 +:108F4000DF93CDB7DEB72E97CDBFDEBF8DE08C832C +:108F50008C899D8989839A83AE01485E5F4F6E89B3 +:108F60007F89CE0101968FD32E96CDBFDEBFDF91D4 +:108F7000CF9108952F923F924F925F926F927F927E +:108F80008F929F92AF92BF92CF92DF92EF92FF9219 +:108F90000F931F93CF93DF93CDB7DEB72C97CDBF41 +:108FA000DEBF7C016B018A01FC011682178283817E +:108FB00081FFB0C1CE0101964C01F7019381F6010A +:108FC00093FD859193FF81916F01882309F49EC1E0 +:108FD000853239F493FD859193FF81916F0185323C +:108FE00021F4B70190E0D6D4E8CF512C312C20E009 +:108FF0002032A0F48B3269F030F4803259F08332A1 +:1090000069F420612CC08D3239F0803339F421604D +:1090100026C02260246023C0286021C027FD27C00D +:1090200030ED380F3A3078F426FF06C0FAE05F9E44 +:10903000300D1124532E13C08AE0389E300D1124B8 +:10904000332E20620CC08E3221F426FD5FC12064D5 +:1090500006C08C3611F4206802C0883641F4F6014F +:1090600093FD859193FF81916F018111C1CF982F5D +:109070009F7D9554933028F40C5F1F4FFFE3F983D5 +:109080000DC0833631F0833771F0833509F057C056 +:1090900021C0F801808189830E5F1F4F44244394CF +:1090A000512C540114C03801F2E06F0E711CF8010C +:1090B000A080B18026FF03C0652D70E002C06FEF75 +:1090C0007FEFC5012C871DD42C0183012C852F77C0 +:1090D000222E16C03801F2E06F0E711CF801A0803C +:1090E000B18026FF03C0652D70E002C06FEF7FEFF7 +:1090F000C5012C87FBD32C012C852068222E8301EF +:1091000023FC19C0832D90E048165906A0F4B7013E +:1091100080E290E03FD43A94F5CFF50127FC8591A9 +:1091200027FE81915F01B70190E034D431103A9469 +:10913000F1E04F1A51084114510479F7DEC084362A +:1091400011F0893631F5F80127FF07C06081718180 +:10915000828193810C5F1F4F08C060817181072E4F +:10916000000C880B990B0E5F1F4F2F76722E97FF06 +:1091700009C090958095709561957F4F8F4F9F4F57 +:109180002068722E2AE030E0A40155D4A82EA81839 +:1091900043C0853729F42F7EB22E2AE030E025C067 +:1091A000F22FF97FBF2E8F36C1F018F4883579F091 +:1091B000ADC0803719F0883721F0A8C02F2F20616B +:1091C000B22EB4FE0DC08B2D8460B82E09C024FFD2 +:1091D0000AC09F2F9660B92E06C028E030E005C077 +:1091E00020E130E002C020E132E0F801B7FE07C024 +:1091F00060817181828193810C5F1F4F06C0608105 +:10920000718180E090E00E5F1F4FA40114D4A82E5E +:10921000A818FB2DFF777F2E76FE0BC0372D3E7FE3 +:10922000A51450F474FE0AC072FC08C0372D3E7EAF +:1092300005C0BA2C372D03C0BA2C01C0B52C34FFA1 +:109240000DC0FE01EA0DF11D8081803311F4397EDD +:1092500009C032FF06C0B394B39404C0832F86784C +:1092600009F0B39433FD12C030FF06C05A2CB3147A +:1092700018F4530C5B18B32CB31460F4B70180E2FC +:1092800090E03C8787D3B3943C85F6CFB31410F4B9 +:109290003B1801C0312C34FF11C0B70180E390E0CE +:1092A0003C8778D33C8532FF16C031FD03C088E788 +:1092B00090E002C088E590E0B7010CC0832F86786B +:1092C00051F031FF02C08BE201C080E237FD8DE238 +:1092D000B70190E05FD3A51430F4B70180E390E0CC +:1092E00059D35A94F8CFAA94F401EA0DF11D808164 +:1092F000B70190E04FD3A110F6CF332009F45DCE33 +:10930000B70180E290E046D33A94F7CFF701868127 +:10931000978102C08FEF9FEF2C96CDBFDEBFDF910C +:10932000CF911F910F91FF90EF90DF90CF90BF9062 +:10933000AF909F908F907F906F905F904F903F90F5 +:109340002F90089520FD09C0FC0123FD05C022FFD8 +:1093500002C07383628351834083089544FD10C02B +:1093600046FD10C0DB01FC01AA0FBB1FEE1FFF1F53 +:109370001094D1F76A0F7B1F8E1F9F1F31E003C02F +:1093800033E001C034E0660F771F881F991F31500A +:10939000D1F7620F711D811D911D08950F931F93C9 +:1093A000CF93DF938C01C801B7D2EC0197FD06C0C3 +:1093B0008AD2892BC1F7B801CE0124D3CE01DF9127 +:1093C000CF911F910F9108958F929F92AF92BF926C +:1093D000CF92DF92EF92FF920F931F93CF93DF9381 +:1093E0001F92CDB7DEB78C01C62E7A01298394D2A5 +:1093F000AC01552729814B32510521F04D325105E1 +:1094000061F42068CA94C11002C080E06FC0C80136 +:10941000298382D2298197FDF8CF322F3D7FD32E29 +:10942000322F307339F5803329F5BB24BA94BC0C44 +:1094300009F449C0C80129836FD2298197FD43C02F +:10944000382F3F7D383561F48D2D8264D82ECA9433 +:10945000CA94CC20C1F1C8015FD297FF0BC033C0C2 +:1094600026FF04C02D2D2260D22E03C03D2D326177 +:10947000D32ECB2C812C912C540120ED280F283099 +:1094800078F0D4FE03C0B801BDD21AC02A3040F033 +:10949000D6FEF9CF2F7D3FEE320F3630A0F72750A2 +:1094A0004D2DC501B4015ADF4B015C018D2D826049 +:1094B000D82ECA94CC2051F0C8012ED297FFDDCF10 +:1094C000D1FC04C0A2CF812C912C5401D7FE08C03E +:1094D000B094A09490948094811C911CA11CB11C08 +:1094E0002D2DB501A401C7012DDF81E00F90DF9183 +:1094F000CF911F910F91FF90EF90DF90CF90BF9091 +:10950000AF909F908F9008956F927F928F929F92CD +:10951000AF92BF92CF92DF92EF92FF920F931F9381 +:10952000CF93DF93CDB7DEB7A197CDBFDEBF5C0190 +:109530007A01CE0101966C0180E2F60111928A95C2 +:10954000E9F7F501838040E050E0912C712C70E048 +:10955000A1E0B0E0F90183FC859183FE81918F0148 +:10956000982F9F01811103C080E090E07AC08E3572 +:1095700019F44115510549F1E72FF0E0E417F5071B +:109580003CF48D3559F18D3219F4772001F103C087 +:10959000711001C0982E892F869586958695860133 +:1095A000080F111D892F87703D0101C0660C8A9537 +:1095B000EAF7F801808186298083991559F0991579 +:1095C00010F49F5FE8CF9150E6CF71E004C077249C +:1095D000739401C0712C4F5F5F4FBCCF772019F09F +:1095E0008E8180628E83711103C09924939416C07A +:1095F000F6019E012F5D3F4F808180958193E21798 +:10960000F307D1F7F2CFE114F10429F0F7018083D9 +:10961000C70101967C016150912CE9F0C50169A355 +:109620007BD169A197FD15C0282F269526952695F3 +:10963000F601E20FF11D208130E0AC0147705527A3 +:1096400002C0359527954A95E2F720FDDCCFB5019C +:10965000D9D1911089CFE114F10411F0F7011082F2 +:10966000C801A196CDBFDEBFDF91CF911F910F91B1 +:10967000FF90EF90DF90CF90BF90AF909F908F9032 +:109680007F906F9008954F925F927F928F929F92FA +:10969000AF92BF92CF92DF92EF92FF920F931F9300 +:1096A000CF93DF931F92CDB7DEB76C012B015A0128 +:1096B000FC0116821782712CF601F380F201F3FC93 +:1096C0008591F3FE8191382F2F01882309F4E5C09D +:1096D00090E03983F8D03981892B19F0C6015EDE1C +:1096E000EBCF353241F4F201F3FC3591F3FE3191C9 +:1096F0002F01353259F4C60139830ED1398197FDD6 +:10970000CAC03817C9F2B6017DD1C7C03A3239F4A0 +:10971000F3FC3591F3FE31912F0151E001C050E08F +:10972000420110E020ED230F2A3088F45260612FAF +:1097300070E080E090E040E2598310DE162FF401E3 +:10974000F3FC3591F3FE31914F015981EBCF052F99 +:10975000232F240151FF03C0111102C09EC01FEF2F +:10976000383619F03C3659F011C0F401F3FC25915C +:10977000F3FE21912F01283649F4052F086004607B +:10978000F201F3FC2591F3FE21912F01222309F42C +:1097900084C0622F70E08FE096E129839CD02981FC +:1097A000892B09F47AC000FD07C0F501E080F18043 +:1097B000C50102965C0102C0E12CF12C2E3649F461 +:1097C000F6014681578160E070E0202FC701BADDC5 +:1097D00073CF233689F401FF11E0C6019DD097FDB8 +:1097E0005AC0E114F10429F0F7018083C701019602 +:1097F0007C01115091F74BC02B3551F49201A70118 +:10980000612FC60181DE2C01892B09F040C03AC0CE +:10981000C6012983C3DD298197FD3DC02F3641F163 +:1098200028F4243619F1293631F124C0233769F0A0 +:109830002537E1F01FC0E114F10429F0F70180821F +:10984000C70101967C01115059F0C60165D04C0149 +:1098500097FD06C038D0892B71F3B601C401D2D070 +:10986000E114F104A1F0F701108211C0006203C0FD +:10987000006101C00064202FA701612FC601A4DD93 +:10988000811105C0F6018381807329F406C000FDB3 +:1098900013CF739411CF772019F0872D90E002C079 +:1098A0008FEF9FEF0F90DF91CF911F910F91FF905E +:1098B000EF90DF90CF90BF90AF909F908F907F9070 +:1098C0005F904F900895911114C1803219F0895022 +:1098D0008550D0F70895FC010590061621F0002070 +:1098E000D9F7C00108953197CF010895FC01059083 +:1098F000615070400110D8F7809590958E0F9F1F92 +:109900000895FC016150704001900110D8F78095D6 +:1099100090958E0F9F1F0895CF93DF93EC012B81BD +:1099200020FF33C026FF0AC02F7B2B838E819F81AF +:1099300001968E839F838A8190E029C022FF0FC009 +:10994000E881F9818081082E000C990B009719F4A9 +:1099500020622B831AC03196E883F9830EC0EA8512 +:10996000FB85199597FF09C02B81019611F080E2C4 +:1099700001C080E1822B8B8308C02E813F812F5F45 +:109980003F4F2E833F83992702C08FEF9FEFDF91D8 +:10999000CF9108950F931F93CF93DF93FB01238102 +:1099A00021FD03C08FEF9FEF28C022FF16C0468124 +:1099B0005781248135814217530744F4A081B18136 +:1099C0009D012F5F3F4F208331838C932681378108 +:1099D0002F5F3F4F2683378310C0EB01092F182FCD +:1099E0000084F185E02D1995892BE1F68E819F8108 +:1099F00001968E839F83812F902FDF91CF911F91AE +:109A00000F910895FB01238120FF12C026FD10C095 +:109A10008F3F3FEF930761F082832F7D2064238384 +:109A2000268137812150310926833783992708956C +:109A30008FEF9FEF0895FA01AA27283051F12031C6 +:109A400081F1E8946F936E7F6E5F7F4F8F4F9F4FD2 +:109A5000AF4FB1E03ED0B4E03CD0670F781F891F14 +:109A60009A1FA11D680F791F8A1F911DA11D6A0FE2 +:109A7000711D811D911DA11D20D009F468943F9195 +:109A80002AE0269F11243019305D3193DEF6CF0194 +:109A90000895462F4770405D4193B3E00FD0C9F75A +:109AA000F6CF462F4F70405D4A3318F0495D31FDC7 +:109AB0004052419302D0A9F7EACFB4E0A69597951A +:109AC000879577956795BA95C9F7009761057105F0 +:109AD00008959B01AC010A2E06945795479537953A +:109AE0002795BA95C9F7620F731F841F951FA01D94 +:109AF0000895992788270895052E97FB16F400945A +:109B00000FD057FD05D014D007FC02D046F408C092 +:109B100050954095309521953F4F4F4F5F4F089599 +:109B200090958095709561957F4F8F4F9F4F0895C9 +:109B3000A1E21A2EAA1BBB1BFD010DC0AA1FBB1F51 +:109B4000EE1FFF1FA217B307E407F50720F0A21BC3 +:109B5000B30BE40BF50B661F771F881F991F1A9430 +:109B600069F760957095809590959B01AC01BD015A +:089B7000CF010895F894FFCF26 +:109B780002400F0083100000010410000001820859 +:109B8800000001000000000000000000000090013B +:109B98000100010000000000000085238C238C23B5 +:109BA8009823A423AE23CB23D923022405240924F4 +:109BB8008426E625FB25FF251426452658268526D6 +:109BC8000001000100000000000000010001010187 +:109BD8000101010001000100000001010001010173 +:109BE8000001010100000001000001000101000165 +:109BF800000000020200000200020202020000024D +:109C0800000000040400000400040404040000042C +:109C180000080808000000080000080008080008FC +:109C280000000010100000100010101010000010AC +:109C3800546F6F206D616E7920646174612E000D20 +:109C48000A504152495459204552524F52000D0A68 +:109C5800504152495459204F4B00556E6B6E6F77E7 +:109C68006E206361726420747970652E00257320FC +:109C78006F722000546865726520697320617420D2 +:109C88006C65617374206F6E65206D6F72652063FB +:109C980061726420747970652063616E64696461BF +:109CA80074652C206275742074686572652077610C +:109CB80073206E6F7420656E6F75676820746572A7 +:109CC8006D696E616C20627566666572207370617D +:109CD80063652E0D0A00415451413A090055494423 +:109CE8003A090053414B3A09004E4F204441544130 +:029CF80000006A :020000021000EC :1000000000000000000000000000000000000000F0 :1000100000000000000000000000000000000000E0 From 35dcd0eb0e9760b298e0aa0552f5c27297641493 Mon Sep 17 00:00:00 2001 From: Georg Date: Wed, 5 Apr 2017 10:03:42 +0200 Subject: [PATCH 010/104] doxygen update --- Doc/Doxygen/html/Page_14443AReader.html | 2 +- Doc/Doxygen/html/Page_Buttons.html | 2 +- Doc/Doxygen/html/Page_CommandLine.html | 2 +- Doc/Doxygen/html/Page_Configurations.html | 2 +- Doc/Doxygen/html/Page_GettingStarted.html | 2 +- Doc/Doxygen/html/Page_LED.html | 2 +- Doc/Doxygen/html/Page_LEDs.html | 2 +- Doc/Doxygen/html/Page_Log.html | 2 +- Doc/Doxygen/html/Page_Settings.html | 2 +- .../html/Page_UploadingDownloading.html | 2 +- .../html/_antenna_level_8h_source.html | 2 +- Doc/Doxygen/html/_application_8h_source.html | 4 +- Doc/Doxygen/html/_battery_8h_source.html | 2 +- Doc/Doxygen/html/_button_8h_source.html | 2 +- Doc/Doxygen/html/_buttons_8txt.html | 2 +- .../html/_chameleon-_mini_8h_source.html | 2 +- Doc/Doxygen/html/_codec_8h_source.html | 4 +- Doc/Doxygen/html/_command_line_8h_source.html | 2 +- Doc/Doxygen/html/_command_line_8txt.html | 2 +- Doc/Doxygen/html/_commands_8h_source.html | 2 +- Doc/Doxygen/html/_common_8h_source.html | 2 +- Doc/Doxygen/html/_configuration_8h.html | 2 +- .../html/_configuration_8h_source.html | 2 +- Doc/Doxygen/html/_configurations_8txt.html | 2 +- Doc/Doxygen/html/_crypto1_8h_source.html | 2 +- Doc/Doxygen/html/_getting_started_8txt.html | 2 +- .../html/_i_s_o14443-2_a_8h_source.html | 2 +- .../html/_i_s_o14443-3_a_8h_source.html | 2 +- Doc/Doxygen/html/_l_e_d_8h_source.html | 2 +- Doc/Doxygen/html/_l_e_d_8txt.html | 2 +- Doc/Doxygen/html/_l_e_d_hook_8h_source.html | 2 +- Doc/Doxygen/html/_l_e_ds_8txt.html | 2 +- Doc/Doxygen/html/_l_u_f_a_config_8h.html | 2 +- .../html/_l_u_f_a_config_8h_source.html | 2 +- Doc/Doxygen/html/_l_u_f_a_descriptors_8c.html | 2 +- Doc/Doxygen/html/_l_u_f_a_descriptors_8h.html | 2 +- .../html/_l_u_f_a_descriptors_8h_source.html | 2 +- Doc/Doxygen/html/_log_8h.html | 11 +++- Doc/Doxygen/html/_log_8h_source.html | 51 ++++++++++--------- Doc/Doxygen/html/_log_8txt.html | 2 +- Doc/Doxygen/html/_main_page_8txt.html | 2 +- Doc/Doxygen/html/_map_8h_source.html | 2 +- Doc/Doxygen/html/_memory_8h_source.html | 4 +- .../html/_mifare_classic_8h_source.html | 2 +- .../html/_mifare_ultralight_8h_source.html | 2 +- Doc/Doxygen/html/_random_8h_source.html | 2 +- .../html/_reader14443-2_a_8h_source.html | 2 +- .../html/_reader14443_a_8h_source.html | 4 +- Doc/Doxygen/html/_reader_8txt.html | 2 +- Doc/Doxygen/html/_settings_8h.html | 2 +- Doc/Doxygen/html/_settings_8h_source.html | 2 +- Doc/Doxygen/html/_settings_8txt.html | 2 +- Doc/Doxygen/html/_system_8h_source.html | 2 +- Doc/Doxygen/html/_terminal_8h_source.html | 2 +- .../html/_uploading_downloading_8txt.html | 2 +- Doc/Doxygen/html/_x_modem_8h_source.html | 2 +- Doc/Doxygen/html/annotated.html | 2 +- Doc/Doxygen/html/classes.html | 2 +- .../dir_5de29d499bb29a41092979d00d22c134.html | 2 +- .../dir_74b6a3b63f61c160c0f14b7a283a4c9b.html | 2 +- .../dir_8465ec698d237f801ae9966d4551fcfa.html | 2 +- .../dir_ddeffaa734f77525428b0dd4068da9cb.html | 2 +- .../dir_f5aab302412c0352d69464400cc5ee44.html | 2 +- Doc/Doxygen/html/files.html | 2 +- Doc/Doxygen/html/functions.html | 2 +- Doc/Doxygen/html/functions_vars.html | 2 +- Doc/Doxygen/html/globals.html | 11 +++- Doc/Doxygen/html/globals_defs.html | 2 +- Doc/Doxygen/html/globals_enum.html | 2 +- Doc/Doxygen/html/globals_eval.html | 11 +++- Doc/Doxygen/html/globals_func.html | 2 +- Doc/Doxygen/html/globals_vars.html | 2 +- Doc/Doxygen/html/index.html | 2 +- Doc/Doxygen/html/pages.html | 2 +- Doc/Doxygen/html/search/all_6.js | 3 ++ Doc/Doxygen/html/search/enumvalues_0.js | 3 ++ .../struct_configuration_type-members.html | 2 +- .../html/struct_configuration_type.html | 2 +- .../struct_settings_entry_type-members.html | 2 +- .../html/struct_settings_entry_type.html | 2 +- ...descriptor___configuration__t-members.html | 2 +- ...u_s_b___descriptor___configuration__t.html | 2 +- 82 files changed, 143 insertions(+), 107 deletions(-) diff --git a/Doc/Doxygen/html/Page_14443AReader.html b/Doc/Doxygen/html/Page_14443AReader.html index 9cd4d2a..18eada9 100644 --- a/Doc/Doxygen/html/Page_14443AReader.html +++ b/Doc/Doxygen/html/Page_14443AReader.html @@ -160,7 +160,7 @@ Each of the following commands returns INVALID COMMAND USAGE on a n diff --git a/Doc/Doxygen/html/Page_Buttons.html b/Doc/Doxygen/html/Page_Buttons.html index 6ae0199..0fc6748 100644 --- a/Doc/Doxygen/html/Page_Buttons.html +++ b/Doc/Doxygen/html/Page_Buttons.html @@ -125,7 +125,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Doc/Doxygen/html/Page_CommandLine.html b/Doc/Doxygen/html/Page_CommandLine.html index b8412c2..414c333 100644 --- a/Doc/Doxygen/html/Page_CommandLine.html +++ b/Doc/Doxygen/html/Page_CommandLine.html @@ -284,7 +284,7 @@ When setting the timeout to zero, there is no timeout and thus a process may con diff --git a/Doc/Doxygen/html/Page_Configurations.html b/Doc/Doxygen/html/Page_Configurations.html index ea866d1..0d19c48 100644 --- a/Doc/Doxygen/html/Page_Configurations.html +++ b/Doc/Doxygen/html/Page_Configurations.html @@ -121,7 +121,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Doc/Doxygen/html/Page_GettingStarted.html b/Doc/Doxygen/html/Page_GettingStarted.html index b801a75..aa59e15 100644 --- a/Doc/Doxygen/html/Page_GettingStarted.html +++ b/Doc/Doxygen/html/Page_GettingStarted.html @@ -113,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Doc/Doxygen/html/Page_LED.html b/Doc/Doxygen/html/Page_LED.html index 00f7614..457bd4e 100644 --- a/Doc/Doxygen/html/Page_LED.html +++ b/Doc/Doxygen/html/Page_LED.html @@ -109,7 +109,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Doc/Doxygen/html/Page_LEDs.html b/Doc/Doxygen/html/Page_LEDs.html index e45005f..7f5b2fb 100644 --- a/Doc/Doxygen/html/Page_LEDs.html +++ b/Doc/Doxygen/html/Page_LEDs.html @@ -113,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Doc/Doxygen/html/Page_Log.html b/Doc/Doxygen/html/Page_Log.html index dc6ba51..c913f9d 100644 --- a/Doc/Doxygen/html/Page_Log.html +++ b/Doc/Doxygen/html/Page_Log.html @@ -112,7 +112,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Doc/Doxygen/html/Page_Settings.html b/Doc/Doxygen/html/Page_Settings.html index a248f70..55392cb 100644 --- a/Doc/Doxygen/html/Page_Settings.html +++ b/Doc/Doxygen/html/Page_Settings.html @@ -100,7 +100,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Doc/Doxygen/html/Page_UploadingDownloading.html b/Doc/Doxygen/html/Page_UploadingDownloading.html index 64e755e..5f7570b 100644 --- a/Doc/Doxygen/html/Page_UploadingDownloading.html +++ b/Doc/Doxygen/html/Page_UploadingDownloading.html @@ -91,7 +91,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Doc/Doxygen/html/_antenna_level_8h_source.html b/Doc/Doxygen/html/_antenna_level_8h_source.html index 2642c58..6069809 100644 --- a/Doc/Doxygen/html/_antenna_level_8h_source.html +++ b/Doc/Doxygen/html/_antenna_level_8h_source.html @@ -92,7 +92,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
1 /*
2  * AntennaLevel.h
3  *
4  * Created on: 24.11.2013
5  * Author: skuser
6  */
7 
8 #ifndef ANTENNALEVEL_H_
9 #define ANTENNALEVEL_H_
10 
11 #include "Common.h"
12 
13 #define ANTENNA_LEVEL_R1 47E3
14 #define ANTENNA_LEVEL_R2 1E3
15 #define ANTENNA_LEVEL_VREF 1.0
16 #define ANTENNA_LEVEL_RES 4096
17 #define ANTENNA_LEVEL_OFFSET 190 /* LSB */
18 
19 #define ANTENNA_LEVEL_MILLIVOLT 1E3
20 #define ANTENNA_LEVEL_FACTOR (ANTENNA_LEVEL_VREF * (ANTENNA_LEVEL_R1 + ANTENNA_LEVEL_R2) / (ANTENNA_LEVEL_RES * ANTENNA_LEVEL_R2) )
21 #define ANTENNA_LEVEL_SCALE ((uint32_t) 1<<16)
22 #define ANTENNA_LEVEL_NUMERATOR ((uint32_t) (ANTENNA_LEVEL_MILLIVOLT * ANTENNA_LEVEL_FACTOR * ANTENNA_LEVEL_SCALE + .5))
23 #define ANTENNA_LEVEL_DENOMINATOR (ANTENNA_LEVEL_SCALE)
24 
25 static inline
26 void AntennaLevelInit(void)
27 {
28  ADCA.CTRLA = ADC_ENABLE_bm;
29  ADCA.CTRLB = ADC_RESOLUTION_12BIT_gc;
30  ADCA.REFCTRL = ADC_REFSEL_INT1V_gc | ADC_BANDGAP_bm;
31  ADCA.PRESCALER = ADC_PRESCALER_DIV32_gc;
32  ADCA.CH0.CTRL = ADC_CH_INPUTMODE_SINGLEENDED_gc;
33  ADCA.CH0.MUXCTRL = ADC_CH_MUXPOS_PIN1_gc;
34 
35 }
36 
37 static inline
38 uint16_t AntennaLevelGet(void)
39 {
40  ADCA.CH0.CTRL |= ADC_CH_START_bm;
41  while( !(ADCA.CH0.INTFLAGS & ADC_CH_CHIF_bm) );
42 
43  ADCA.CH0.INTFLAGS = ADC_CH_CHIF_bm;
44 
45  int16_t Result = ADCA.CH0RES - ANTENNA_LEVEL_OFFSET;
46  if (Result < 0) Result = 0;
47 
48  return (uint16_t) (((uint32_t) Result * ANTENNA_LEVEL_NUMERATOR) / ANTENNA_LEVEL_DENOMINATOR);
49 }
50 
51 void AntennaLevelTick(void);
52 void AntennaLevelResetMaxRssi(void);
53 
54 #endif /* ANTENNALEVEL_H_ */
diff --git a/Doc/Doxygen/html/_application_8h_source.html b/Doc/Doxygen/html/_application_8h_source.html index d2e4f80..f95b201 100644 --- a/Doc/Doxygen/html/_application_8h_source.html +++ b/Doc/Doxygen/html/_application_8h_source.html @@ -92,7 +92,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
1 /*
2  * Application.h
3  *
4  * Created on: 18.02.2013
5  * Author: skuser
6  */
7 
8 #ifndef APPLICATION_H_
9 #define APPLICATION_H_
10 
11 #include "../Common.h"
12 #include "../Configuration.h"
13 #include "../Log.h"
14 
15 /* Applications */
16 #include "MifareUltralight.h"
17 #include "MifareClassic.h"
18 #include "Reader14443A.h"
19 
20 /* Function wrappers */
21 INLINE void ApplicationInit(void) {
22  ActiveConfiguration.ApplicationInitFunc();
23 }
24 
25 INLINE void ApplicationTask(void) {
26  ActiveConfiguration.ApplicationTaskFunc();
27 }
28 
29 INLINE void ApplicationTick(void) {
30  ActiveConfiguration.ApplicationTickFunc();
31 }
32 
33 INLINE uint16_t ApplicationProcess(uint8_t* ByteBuffer, uint16_t ByteCount) {
34  return ActiveConfiguration.ApplicationProcessFunc(ByteBuffer, ByteCount);
35 }
36 
37 INLINE void ApplicationReset(void) {
38  ActiveConfiguration.ApplicationResetFunc();
39  //LogEntry(LOG_INFO_RESET_APP, NULL, 0);
40 }
41 
42 INLINE void ApplicationGetUid(ConfigurationUidType Uid) {
43  ActiveConfiguration.ApplicationGetUidFunc(Uid);
44 }
45 
46 INLINE void ApplicationSetUid(ConfigurationUidType Uid) {
47  ActiveConfiguration.ApplicationSetUidFunc(Uid);
48  LogEntry(LOG_INFO_UID_SET, Uid, ActiveConfiguration.UidSize);
49 }
50 
51 #endif /* APPLICATION_H_ */
void(* ApplicationSetUidFunc)(ConfigurationUidType Uid)
Definition: Configuration.h:103
uint16_t(* ApplicationProcessFunc)(uint8_t *ByteBuffer, uint16_t BitCount)
Definition: Configuration.h:93
void(* ApplicationResetFunc)(void)
Definition: Configuration.h:77
-
UID change.
Definition: Log.h:16
+
UID change.
Definition: Log.h:17
void(* ApplicationGetUidFunc)(ConfigurationUidType Uid)
Definition: Configuration.h:98
void(* ApplicationTickFunc)(void)
Definition: Configuration.h:81
void(* ApplicationTaskFunc)(void)
Definition: Configuration.h:79
@@ -101,7 +101,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
diff --git a/Doc/Doxygen/html/_battery_8h_source.html b/Doc/Doxygen/html/_battery_8h_source.html index a895462..fd0f493 100644 --- a/Doc/Doxygen/html/_battery_8h_source.html +++ b/Doc/Doxygen/html/_battery_8h_source.html @@ -92,7 +92,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
1 /*
2  * Battery.h
3  *
4  * Created on: 20.08.2014
5  * Author: sk
6  */
7 
8 #ifndef BATTERY_H_
9 #define BATTERY_H_
10 
11 #include "Common.h"
12 
13 #define BATTERY_PORT PORTD
14 #define BATTERY_STAT_PIN PIN0_bm
15 #define BATTERY_STAT_PINCTRL PIN0CTRL
16 #define BATTERY_PORT_MASK (BATTERY_STAT_PIN)
17 
18 INLINE void BatteryInit(void) {
19  BATTERY_PORT.DIRCLR = BATTERY_PORT_MASK;
20  BATTERY_PORT.BATTERY_STAT_PINCTRL = PORT_OPC_PULLUP_gc;
21 }
22 
23 INLINE bool BatteryIsCharging(void) {
24  if (!(BATTERY_PORT.IN & BATTERY_STAT_PIN)) {
25  return true;
26  } else {
27  return false;
28  }
29 }
30 
31 #endif /* BATTERY_H_ */
diff --git a/Doc/Doxygen/html/_button_8h_source.html b/Doc/Doxygen/html/_button_8h_source.html index ccc69db..4bcb54d 100644 --- a/Doc/Doxygen/html/_button_8h_source.html +++ b/Doc/Doxygen/html/_button_8h_source.html @@ -92,7 +92,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
1 /*
2  * Button.h
3  *
4  * Created on: 13.05.2013
5  * Author: skuser
6  */
7 
8 #ifndef BUTTON_H_
9 #define BUTTON_H_
10 
11 #include "Common.h"
12 
13 typedef enum {
14  BUTTON_R_PRESS_SHORT = 0,
15  BUTTON_R_PRESS_LONG,
16  BUTTON_L_PRESS_SHORT,
17  BUTTON_L_PRESS_LONG,
18 
19  /* Must be last element */
20  BUTTON_TYPE_COUNT
21 } ButtonTypeEnum;
22 
23 typedef enum {
24  BUTTON_ACTION_NONE,
25  BUTTON_ACTION_UID_RANDOM,
26  BUTTON_ACTION_UID_LEFT_INCREMENT,
27  BUTTON_ACTION_UID_RIGHT_INCREMENT,
28  BUTTON_ACTION_UID_LEFT_DECREMENT,
29  BUTTON_ACTION_UID_RIGHT_DECREMENT,
30  BUTTON_ACTION_CYCLE_SETTINGS,
31  BUTTON_ACTION_STORE_MEM,
32  BUTTON_ACTION_RECALL_MEM,
33  BUTTON_ACTION_TOGGLE_FIELD,
34  BUTTON_ACTION_STORE_LOG,
35 
36  /* This has to be last element */
37  BUTTON_ACTION_COUNT
38 } ButtonActionEnum;
39 
40 void ButtonInit(void);
41 void ButtonTick(void);
42 
43 void ButtonGetActionList(char* List, uint16_t BufferSize);
44 void ButtonSetActionById(ButtonTypeEnum Type, ButtonActionEnum Action);
45 void ButtonGetActionByName(ButtonTypeEnum Type, char* Action, uint16_t BufferSize);
46 bool ButtonSetActionByName(ButtonTypeEnum Type, const char* Action);
47 
48 #endif /* BUTTON_H_ */
diff --git a/Doc/Doxygen/html/_buttons_8txt.html b/Doc/Doxygen/html/_buttons_8txt.html index cc29927..f0f385e 100644 --- a/Doc/Doxygen/html/_buttons_8txt.html +++ b/Doc/Doxygen/html/_buttons_8txt.html @@ -88,7 +88,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Doc/Doxygen/html/_chameleon-_mini_8h_source.html b/Doc/Doxygen/html/_chameleon-_mini_8h_source.html index 0b7bc4b..d00b8ee 100644 --- a/Doc/Doxygen/html/_chameleon-_mini_8h_source.html +++ b/Doc/Doxygen/html/_chameleon-_mini_8h_source.html @@ -95,7 +95,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Doc/Doxygen/html/_codec_8h_source.html b/Doc/Doxygen/html/_codec_8h_source.html index 1101db6..f083992 100644 --- a/Doc/Doxygen/html/_codec_8h_source.html +++ b/Doc/Doxygen/html/_codec_8h_source.html @@ -89,13 +89,13 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
Codec.h
-
1 /*
2  * CODEC.h
3  *
4  * Created on: 18.02.2013
5  * Author: skuser
6  */
7 
8 #ifndef CODEC_H_
9 #define CODEC_H_
10 
11 #include <avr/io.h>
12 #include <stdint.h>
13 #include <stdbool.h>
14 #include "../Common.h"
15 #include "../Configuration.h"
16 
17 #include "ISO14443-2A.h"
18 #include "Reader14443-2A.h"
19 
20 /* Timing definitions for ISO14443A */
21 #define ISO14443A_SUBCARRIER_DIVIDER 16
22 #define ISO14443A_BIT_GRID_CYCLES 128
23 #define ISO14443A_BIT_RATE_CYCLES 128
24 #define ISO14443A_FRAME_DELAY_PREV1 1236
25 #define ISO14443A_FRAME_DELAY_PREV0 1172
26 #define ISO14443A_RX_PENDING_TIMEOUT 1 // ms
27 
28 /* Peripheral definitions */
29 #define CODEC_DEMOD_POWER_PORT PORTB
30 #define CODEC_DEMOD_POWER_MASK PIN0_bm
31 #define CODEC_DEMOD_IN_PORT PORTB
32 #define CODEC_DEMOD_IN_MASK (CODEC_DEMOD_IN_MASK0 | CODEC_DEMOD_IN_MASK1)
33 #define CODEC_DEMOD_IN_MASK0 PIN1_bm
34 #define CODEC_DEMOD_IN_MASK1 PIN2_bm
35 #define CODEC_DEMOD_IN_PINCTRL0 PIN1CTRL
36 #define CODEC_DEMOD_IN_PINCTRL1 PIN2CTRL
37 #define CODEC_DEMOD_IN_EVMUX0 EVSYS_CHMUX_PORTB_PIN1_gc
38 #define CODEC_DEMOD_IN_EVMUX1 EVSYS_CHMUX_PORTB_PIN2_gc
39 #define CODEC_DEMOD_IN_INT0_VECT PORTB_INT0_vect
40 #define CODEC_LOADMOD_PORT PORTC
41 #define CODEC_LOADMOD_MASK PIN6_bm
42 #define CODEC_CARRIER_IN_PORT PORTC
43 #define CODEC_CARRIER_IN_MASK PIN2_bm
44 #define CODEC_CARRIER_IN_PINCTRL PIN2CTRL
45 #define CODEC_CARRIER_IN_EVMUX EVSYS_CHMUX_PORTC_PIN2_gc
46 #define CODEC_CARRIER_IN_DIV 2 /* external clock division factor */
47 #define CODEC_SUBCARRIER_PORT PORTC
48 #define CODEC_SUBCARRIER_MASK_PSK PIN4_bm
49 #define CODEC_SUBCARRIER_MASK_OOK PIN5_bm
50 #define CODEC_SUBCARRIER_MASK (CODEC_SUBCARRIER_MASK_PSK | CODEC_SUBCARRIER_MASK_OOK)
51 #define CODEC_SUBCARRIER_TIMER TCC1
52 #define CODEC_SUBCARRIER_CC_PSK CCA
53 #define CODEC_SUBCARRIER_CC_OOK CCB
54 #define CODEC_SUBCARRIER_CCEN_PSK TC1_CCAEN_bm
55 #define CODEC_SUBCARRIER_CCEN_OOK TC1_CCBEN_bm
56 #define CODEC_TIMER_SAMPLING TCD0
57 #define CODEC_TIMER_SAMPLING_CCA_VECT TCD0_CCA_vect
58 #define CODEC_TIMER_SAMPLING_CCB_VECT TCD0_CCB_vect
59 #define CODEC_TIMER_LOADMOD TCE0
60 #define CODEC_TIMER_LOADMOD_OVF_VECT TCE0_OVF_vect
61 #define CODEC_TIMER_LOADMOD_CCA_VECT TCE0_CCA_vect
62 #define CODEC_TIMER_LOADMOD_CCB_VECT TCE0_CCB_vect
63 #define CODEC_TIMER_LOADMOD_CCC_VECT TCE0_CCC_vect
64 #define CODEC_TIMER_MODSTART_EVSEL TC_EVSEL_CH0_gc
65 #define CODEC_TIMER_MODEND_EVSEL TC_EVSEL_CH1_gc
66 #define CODEC_TIMER_CARRIER_CLKSEL TC_CLKSEL_EVCH6_gc
67 #define CODEC_READER_TIMER TCC0
68 #define CODEC_READER_PORT PORTC
69 #define CODEC_READER_MASK_LEFT PIN0_bm
70 #define CODEC_READER_MASK_RIGHT PIN1_bm
71 #define CODEC_READER_MASK (CODEC_READER_MASK_LEFT | CODEC_READER_MASK_RIGHT)
72 #define CODEC_READER_PINCTRL_LEFT PIN0CTRL
73 #define CODEC_READER_PINCTRL_RIGHT PIN1CTRL
74 #define CODEC_AC_DEMOD_SETTINGS AC_HSMODE_bm | AC_HYSMODE_NO_gc
75 #define CODEC_MAXIMUM_THRESHOLD 0xFFF // the maximum voltage can be calculated with ch0data * Vref / 0xFFF
76 #define CODEC_TIMER_TIMESTAMPS TCD1
77 #define CODEC_TIMER_TIMESTAMPS_CCA_VECT TCD1_CCA_vect
78 
79 #define CODEC_BUFFER_SIZE 256
80 
81 #define CODEC_CARRIER_FREQ 13560000
82 
83 #define Codec8Reg0 GPIOR0
84 #define Codec8Reg1 GPIOR1
85 #define Codec8Reg2 GPIOR2
86 #define Codec8Reg3 GPIOR3
87 #define CodecCount16Register1 (*((volatile uint16_t*) &GPIOR4)) /* GPIOR4 & GPIOR5 */
88 #define CodecCount16Register2 (*((volatile uint16_t*) &GPIOR6)) /* GPIOR4 & GPIOR5 */
89 #define CodecPtrRegister1 (*((volatile uint8_t**) &GPIOR8))
90 #define CodecPtrRegister2 (*((volatile uint8_t**) &GPIORA))
91 
92 extern uint16_t ReaderThreshold;
93 
94 typedef enum {
95  CODEC_SUBCARRIERMOD_OFF,
96  CODEC_SUBCARRIERMOD_OOK
97 } SubcarrierModType;
98 
99 extern uint8_t CodecBuffer[CODEC_BUFFER_SIZE];
100 
101 INLINE void CodecInit(void) {
102  ActiveConfiguration.CodecInitFunc();
103 }
104 
105 INLINE void CodecDeInit(void) {
106  ActiveConfiguration.CodecDeInitFunc();
107 }
108 
109 INLINE void CodecTask(void) {
110  ActiveConfiguration.CodecTaskFunc();
111 }
112 
113 /* Helper Functions for Codec implementations */
114 INLINE void CodecInitCommon(void)
115 {
116  /* Configure CARRIER input pin and route it to EVSYS.
117  * Multiply by 2 again by using both edges when externally
118  * dividing by 2 */
119 #if CODEC_CARRIER_IN_DIV == 2
120  CODEC_CARRIER_IN_PORT.CODEC_CARRIER_IN_PINCTRL = PORT_ISC_BOTHEDGES_gc;
121 #else
122 #error Option not supported
123 #endif
124  CODEC_CARRIER_IN_PORT.DIRCLR = CODEC_CARRIER_IN_MASK;
125  EVSYS.CH6MUX = CODEC_CARRIER_IN_EVMUX;
126 
127  /* Configure two DEMOD pins for input.
128  * Configure event channel 0 for rising edge (begin of modulation pause)
129  * Configure event channel 1 for falling edge (end of modulation pause) */
130  CODEC_DEMOD_POWER_PORT.OUTCLR = CODEC_DEMOD_POWER_MASK;
131  CODEC_DEMOD_POWER_PORT.DIRSET = CODEC_DEMOD_POWER_MASK;
132  CODEC_DEMOD_IN_PORT.DIRCLR = CODEC_DEMOD_IN_MASK;
133  CODEC_DEMOD_IN_PORT.CODEC_DEMOD_IN_PINCTRL0 = PORT_ISC_RISING_gc;
134  CODEC_DEMOD_IN_PORT.CODEC_DEMOD_IN_PINCTRL1 = PORT_ISC_FALLING_gc;
135  CODEC_DEMOD_IN_PORT.INT0MASK = 0;
136  CODEC_DEMOD_IN_PORT.INTCTRL = PORT_INT0LVL_HI_gc;
137  EVSYS.CH0MUX = CODEC_DEMOD_IN_EVMUX0;
138  EVSYS.CH1MUX = CODEC_DEMOD_IN_EVMUX1;
139 
140  /* Configure loadmod pin configuration and use a virtual port configuration
141  * for single instruction cycle access */
142  CODEC_LOADMOD_PORT.DIRSET = CODEC_LOADMOD_MASK;
143  CODEC_LOADMOD_PORT.OUTCLR = CODEC_LOADMOD_MASK;
144  PORTCFG.VPCTRLA &= ~PORTCFG_VP0MAP_gm;
145  PORTCFG.VPCTRLA |= PORTCFG_VP02MAP_PORTC_gc;
146 
147  /* Configure subcarrier pins for output */
148  CODEC_SUBCARRIER_PORT.DIRSET = CODEC_SUBCARRIER_MASK;
149  CODEC_SUBCARRIER_PORT.OUTCLR = CODEC_SUBCARRIER_MASK;
150 
151  /* Configure pins for reader field with the LEFT output being inverted
152  * and all bridge outputs static high */
153  CODEC_READER_PORT.CODEC_READER_PINCTRL_LEFT = PORT_INVEN_bm;
154  CODEC_READER_PORT.OUTCLR = CODEC_READER_MASK_LEFT;
155  CODEC_READER_PORT.OUTSET = CODEC_READER_MASK_RIGHT;
156  CODEC_READER_PORT.DIRSET = CODEC_READER_MASK;
157 
158  /* Configure timer for generating reader field and configure AWEX for outputting pattern
159  * with disabled outputs. */
160  CODEC_READER_TIMER.CTRLB = TC0_CCAEN_bm | TC_WGMODE_SINGLESLOPE_gc;
161  CODEC_READER_TIMER.PER = F_CPU / CODEC_CARRIER_FREQ - 1;
162  CODEC_READER_TIMER.CCA = F_CPU / CODEC_CARRIER_FREQ / 2 ;
163 
164  AWEXC.OUTOVEN = 0x00;
165  AWEXC.CTRL = AWEX_CWCM_bm | AWEX_DTICCAEN_bm | AWEX_DTICCBEN_bm;
166 
167  /* Configure DAC for the reference voltage */
168  DACB.EVCTRL = 0;
169  DACB.CTRLB = DAC_CHSEL_SINGLE_gc;
170  DACB.CTRLC = DAC_REFSEL_AVCC_gc;
171  DACB.CTRLA = DAC_IDOEN_bm | DAC_ENABLE_bm;
172  DACB.CH0DATA = ReaderThreshold; // real threshold voltage can be calculated with ch0data * Vref / 0xFFF
173 
174  /* Configure Analog Comparator 0 to detect changes in demodulated reader field */
175  ACA.AC0MUXCTRL = AC_MUXPOS_DAC_gc | AC_MUXNEG_PIN7_gc;
176  ACA.AC0CTRL = CODEC_AC_DEMOD_SETTINGS;
177 
178  /* Configure Analog Comparator 1 to detect SOC */
179  ACA.AC1MUXCTRL = AC_MUXPOS_DAC_gc | AC_MUXNEG_PIN7_gc;
180  ACA.AC1CTRL = CODEC_AC_DEMOD_SETTINGS;
181 }
182 
183 INLINE void CodecSetSubcarrier(SubcarrierModType ModType, uint16_t Divider)
184 {
185  if (ModType == CODEC_SUBCARRIERMOD_OFF) {
186  CODEC_SUBCARRIER_TIMER.CTRLA = TC_CLKSEL_OFF_gc;
187  CODEC_SUBCARRIER_TIMER.CTRLB = 0;
188  } else if (ModType == CODEC_SUBCARRIERMOD_OOK) {
189  /* Configure subcarrier generation with 50% DC output using OOK */
190  CODEC_SUBCARRIER_TIMER.CNT = 0;
191  CODEC_SUBCARRIER_TIMER.PER = Divider - 1;
192  CODEC_SUBCARRIER_TIMER.CODEC_SUBCARRIER_CC_OOK = Divider/2;
193  CODEC_SUBCARRIER_TIMER.CTRLB = CODEC_SUBCARRIER_CCEN_OOK | TC_WGMODE_SINGLESLOPE_gc;
194  }
195 }
196 
197 INLINE void CodecStartSubcarrier(void)
198 {
199  CODEC_SUBCARRIER_TIMER.CTRLA = CODEC_TIMER_CARRIER_CLKSEL;
200 }
201 
202 INLINE void CodecSetDemodPower(bool bOnOff)
203 {
204  if (bOnOff) {
205  CODEC_DEMOD_POWER_PORT.OUTSET = CODEC_DEMOD_POWER_MASK;
206  } else {
207  CODEC_DEMOD_POWER_PORT.OUTCLR = CODEC_DEMOD_POWER_MASK;
208  }
209 }
210 
211 INLINE bool CodecGetLoadmodState(void) {
212  if (ACA.STATUS & AC_AC0STATE_bm) {
213  return true;
214  } else {
215  return false;
216  }
217 }
218 
219 INLINE void CodecSetLoadmodState(bool bOnOff) {
220  if (bOnOff) {
221  VPORT0.OUT |= CODEC_LOADMOD_MASK;
222  } else {
223  VPORT0.OUT &= ~CODEC_LOADMOD_MASK;
224  }
225 }
226 
227 INLINE void CodecSetReaderField(bool bOnOff) { // this is the function for turning on/off the reader field dumbly; before using this function, please consider to use CodecReaderField{Start,Stop}
228 
229  if (bOnOff) {
230  /* Start timer for field generation and unmask outputs */
231  CODEC_READER_TIMER.CTRLA = TC_CLKSEL_DIV1_gc;
232  AWEXC.OUTOVEN = CODEC_READER_MASK;
233  } else {
234  /* Disable outputs of AWEX and stop field generation */
235  AWEXC.OUTOVEN = 0x00;
236  CODEC_READER_TIMER.CTRLA = TC_CLKSEL_OFF_gc;
237  }
238 }
239 
240 INLINE bool CodecGetReaderField(void) {
241  return (CODEC_READER_TIMER.CTRLA == TC_CLKSEL_DIV1_gc) && (AWEXC.OUTOVEN == CODEC_READER_MASK);
242 }
243 
244 void CodecReaderFieldStart(void);
245 void CodecReaderFieldStop(void);
246 bool CodecIsReaderFieldReady(void);
247 
248 #endif /* CODEC_H_ */
void(* CodecInitFunc)(void)
Definition: Configuration.h:57
+
1 /*
2  * CODEC.h
3  *
4  * Created on: 18.02.2013
5  * Author: skuser
6  */
7 
8 #ifndef CODEC_H_
9 #define CODEC_H_
10 
11 #include <avr/io.h>
12 #include <stdint.h>
13 #include <stdbool.h>
14 #include "../Common.h"
15 #include "../Configuration.h"
16 
17 #include "ISO14443-2A.h"
18 #include "Reader14443-2A.h"
19 
20 /* Timing definitions for ISO14443A */
21 #define ISO14443A_SUBCARRIER_DIVIDER 16
22 #define ISO14443A_BIT_GRID_CYCLES 128
23 #define ISO14443A_BIT_RATE_CYCLES 128
24 #define ISO14443A_FRAME_DELAY_PREV1 1236
25 #define ISO14443A_FRAME_DELAY_PREV0 1172
26 #define ISO14443A_RX_PENDING_TIMEOUT 1 // ms
27 
28 /* Peripheral definitions */
29 #define CODEC_DEMOD_POWER_PORT PORTB
30 #define CODEC_DEMOD_POWER_MASK PIN0_bm
31 #define CODEC_DEMOD_IN_PORT PORTB
32 #define CODEC_DEMOD_IN_MASK (CODEC_DEMOD_IN_MASK0 | CODEC_DEMOD_IN_MASK1)
33 #define CODEC_DEMOD_IN_MASK0 PIN1_bm
34 #define CODEC_DEMOD_IN_MASK1 PIN2_bm
35 #define CODEC_DEMOD_IN_PINCTRL0 PIN1CTRL
36 #define CODEC_DEMOD_IN_PINCTRL1 PIN2CTRL
37 #define CODEC_DEMOD_IN_EVMUX0 EVSYS_CHMUX_PORTB_PIN1_gc
38 #define CODEC_DEMOD_IN_EVMUX1 EVSYS_CHMUX_PORTB_PIN2_gc
39 #define CODEC_DEMOD_IN_INT0_VECT PORTB_INT0_vect
40 #define CODEC_LOADMOD_PORT PORTC
41 #define CODEC_LOADMOD_MASK PIN6_bm
42 #define CODEC_CARRIER_IN_PORT PORTC
43 #define CODEC_CARRIER_IN_MASK PIN2_bm
44 #define CODEC_CARRIER_IN_PINCTRL PIN2CTRL
45 #define CODEC_CARRIER_IN_EVMUX EVSYS_CHMUX_PORTC_PIN2_gc
46 #define CODEC_CARRIER_IN_DIV 2 /* external clock division factor */
47 #define CODEC_SUBCARRIER_PORT PORTC
48 #define CODEC_SUBCARRIER_MASK_PSK PIN4_bm
49 #define CODEC_SUBCARRIER_MASK_OOK PIN5_bm
50 #define CODEC_SUBCARRIER_MASK (CODEC_SUBCARRIER_MASK_PSK | CODEC_SUBCARRIER_MASK_OOK)
51 #define CODEC_SUBCARRIER_TIMER TCC1
52 #define CODEC_SUBCARRIER_CC_PSK CCA
53 #define CODEC_SUBCARRIER_CC_OOK CCB
54 #define CODEC_SUBCARRIER_CCEN_PSK TC1_CCAEN_bm
55 #define CODEC_SUBCARRIER_CCEN_OOK TC1_CCBEN_bm
56 #define CODEC_TIMER_SAMPLING TCD0
57 #define CODEC_TIMER_SAMPLING_CCA_VECT TCD0_CCA_vect
58 #define CODEC_TIMER_SAMPLING_CCB_VECT TCD0_CCB_vect
59 #define CODEC_TIMER_LOADMOD TCE0
60 #define CODEC_TIMER_LOADMOD_OVF_VECT TCE0_OVF_vect
61 #define CODEC_TIMER_LOADMOD_CCA_VECT TCE0_CCA_vect
62 #define CODEC_TIMER_LOADMOD_CCB_VECT TCE0_CCB_vect
63 #define CODEC_TIMER_LOADMOD_CCC_VECT TCE0_CCC_vect
64 #define CODEC_TIMER_MODSTART_EVSEL TC_EVSEL_CH0_gc
65 #define CODEC_TIMER_MODEND_EVSEL TC_EVSEL_CH1_gc
66 #define CODEC_TIMER_CARRIER_CLKSEL TC_CLKSEL_EVCH6_gc
67 #define CODEC_READER_TIMER TCC0
68 #define CODEC_READER_PORT PORTC
69 #define CODEC_READER_MASK_LEFT PIN0_bm
70 #define CODEC_READER_MASK_RIGHT PIN1_bm
71 #define CODEC_READER_MASK (CODEC_READER_MASK_LEFT | CODEC_READER_MASK_RIGHT)
72 #define CODEC_READER_PINCTRL_LEFT PIN0CTRL
73 #define CODEC_READER_PINCTRL_RIGHT PIN1CTRL
74 #define CODEC_AC_DEMOD_SETTINGS AC_HSMODE_bm | AC_HYSMODE_NO_gc
75 #define CODEC_MAXIMUM_THRESHOLD 0xFFF // the maximum voltage can be calculated with ch0data * Vref / 0xFFF
76 #define CODEC_TIMER_TIMESTAMPS TCD1
77 #define CODEC_TIMER_TIMESTAMPS_CCA_VECT TCD1_CCA_vect
78 
79 #define CODEC_BUFFER_SIZE 256
80 
81 #define CODEC_CARRIER_FREQ 13560000
82 
83 #define Codec8Reg0 GPIOR0
84 #define Codec8Reg1 GPIOR1
85 #define Codec8Reg2 GPIOR2
86 #define Codec8Reg3 GPIOR3
87 #define CodecCount16Register1 (*((volatile uint16_t*) &GPIOR4)) /* GPIOR4 & GPIOR5 */
88 #define CodecCount16Register2 (*((volatile uint16_t*) &GPIOR6)) /* GPIOR4 & GPIOR5 */
89 #define CodecPtrRegister1 (*((volatile uint8_t**) &GPIOR8))
90 #define CodecPtrRegister2 (*((volatile uint8_t**) &GPIORA))
91 
92 extern uint16_t ReaderThreshold;
93 extern uint16_t Reader_FWT;
94 
95 #define FWI2FWT(x) ((uint32_t)(256 * 16 * ((uint32_t)1 << (x))) / (CODEC_CARRIER_FREQ / 1000) + 1)
96 
97 typedef enum {
98  CODEC_SUBCARRIERMOD_OFF,
99  CODEC_SUBCARRIERMOD_OOK
100 } SubcarrierModType;
101 
102 extern uint8_t CodecBuffer[CODEC_BUFFER_SIZE];
103 
104 INLINE void CodecInit(void) {
105  ActiveConfiguration.CodecInitFunc();
106 }
107 
108 INLINE void CodecDeInit(void) {
109  ActiveConfiguration.CodecDeInitFunc();
110 }
111 
112 INLINE void CodecTask(void) {
113  ActiveConfiguration.CodecTaskFunc();
114 }
115 
116 /* Helper Functions for Codec implementations */
117 INLINE void CodecInitCommon(void)
118 {
119  /* Configure CARRIER input pin and route it to EVSYS.
120  * Multiply by 2 again by using both edges when externally
121  * dividing by 2 */
122 #if CODEC_CARRIER_IN_DIV == 2
123  CODEC_CARRIER_IN_PORT.CODEC_CARRIER_IN_PINCTRL = PORT_ISC_BOTHEDGES_gc;
124 #else
125 #error Option not supported
126 #endif
127  CODEC_CARRIER_IN_PORT.DIRCLR = CODEC_CARRIER_IN_MASK;
128  EVSYS.CH6MUX = CODEC_CARRIER_IN_EVMUX;
129 
130  /* Configure two DEMOD pins for input.
131  * Configure event channel 0 for rising edge (begin of modulation pause)
132  * Configure event channel 1 for falling edge (end of modulation pause) */
133  CODEC_DEMOD_POWER_PORT.OUTCLR = CODEC_DEMOD_POWER_MASK;
134  CODEC_DEMOD_POWER_PORT.DIRSET = CODEC_DEMOD_POWER_MASK;
135  CODEC_DEMOD_IN_PORT.DIRCLR = CODEC_DEMOD_IN_MASK;
136  CODEC_DEMOD_IN_PORT.CODEC_DEMOD_IN_PINCTRL0 = PORT_ISC_RISING_gc;
137  CODEC_DEMOD_IN_PORT.CODEC_DEMOD_IN_PINCTRL1 = PORT_ISC_FALLING_gc;
138  CODEC_DEMOD_IN_PORT.INT0MASK = 0;
139  CODEC_DEMOD_IN_PORT.INTCTRL = PORT_INT0LVL_HI_gc;
140  EVSYS.CH0MUX = CODEC_DEMOD_IN_EVMUX0;
141  EVSYS.CH1MUX = CODEC_DEMOD_IN_EVMUX1;
142 
143  /* Configure loadmod pin configuration and use a virtual port configuration
144  * for single instruction cycle access */
145  CODEC_LOADMOD_PORT.DIRSET = CODEC_LOADMOD_MASK;
146  CODEC_LOADMOD_PORT.OUTCLR = CODEC_LOADMOD_MASK;
147  PORTCFG.VPCTRLA &= ~PORTCFG_VP0MAP_gm;
148  PORTCFG.VPCTRLA |= PORTCFG_VP02MAP_PORTC_gc;
149 
150  /* Configure subcarrier pins for output */
151  CODEC_SUBCARRIER_PORT.DIRSET = CODEC_SUBCARRIER_MASK;
152  CODEC_SUBCARRIER_PORT.OUTCLR = CODEC_SUBCARRIER_MASK;
153 
154  /* Configure pins for reader field with the LEFT output being inverted
155  * and all bridge outputs static high */
156  CODEC_READER_PORT.CODEC_READER_PINCTRL_LEFT = PORT_INVEN_bm;
157  CODEC_READER_PORT.OUTCLR = CODEC_READER_MASK_LEFT;
158  CODEC_READER_PORT.OUTSET = CODEC_READER_MASK_RIGHT;
159  CODEC_READER_PORT.DIRSET = CODEC_READER_MASK;
160 
161  /* Configure timer for generating reader field and configure AWEX for outputting pattern
162  * with disabled outputs. */
163  CODEC_READER_TIMER.CTRLB = TC0_CCAEN_bm | TC_WGMODE_SINGLESLOPE_gc;
164  CODEC_READER_TIMER.PER = F_CPU / CODEC_CARRIER_FREQ - 1;
165  CODEC_READER_TIMER.CCA = F_CPU / CODEC_CARRIER_FREQ / 2 ;
166 
167  AWEXC.OUTOVEN = 0x00;
168  AWEXC.CTRL = AWEX_CWCM_bm | AWEX_DTICCAEN_bm | AWEX_DTICCBEN_bm;
169 
170  /* Configure DAC for the reference voltage */
171  DACB.EVCTRL = 0;
172  DACB.CTRLB = DAC_CHSEL_SINGLE_gc;
173  DACB.CTRLC = DAC_REFSEL_AVCC_gc;
174  DACB.CTRLA = DAC_IDOEN_bm | DAC_ENABLE_bm;
175  DACB.CH0DATA = ReaderThreshold; // real threshold voltage can be calculated with ch0data * Vref / 0xFFF
176 
177  /* Configure Analog Comparator 0 to detect changes in demodulated reader field */
178  ACA.AC0MUXCTRL = AC_MUXPOS_DAC_gc | AC_MUXNEG_PIN7_gc;
179  ACA.AC0CTRL = CODEC_AC_DEMOD_SETTINGS;
180 
181  /* Configure Analog Comparator 1 to detect SOC */
182  ACA.AC1MUXCTRL = AC_MUXPOS_DAC_gc | AC_MUXNEG_PIN7_gc;
183  ACA.AC1CTRL = CODEC_AC_DEMOD_SETTINGS;
184 }
185 
186 INLINE void CodecSetSubcarrier(SubcarrierModType ModType, uint16_t Divider)
187 {
188  if (ModType == CODEC_SUBCARRIERMOD_OFF) {
189  CODEC_SUBCARRIER_TIMER.CTRLA = TC_CLKSEL_OFF_gc;
190  CODEC_SUBCARRIER_TIMER.CTRLB = 0;
191  } else if (ModType == CODEC_SUBCARRIERMOD_OOK) {
192  /* Configure subcarrier generation with 50% DC output using OOK */
193  CODEC_SUBCARRIER_TIMER.CNT = 0;
194  CODEC_SUBCARRIER_TIMER.PER = Divider - 1;
195  CODEC_SUBCARRIER_TIMER.CODEC_SUBCARRIER_CC_OOK = Divider/2;
196  CODEC_SUBCARRIER_TIMER.CTRLB = CODEC_SUBCARRIER_CCEN_OOK | TC_WGMODE_SINGLESLOPE_gc;
197  }
198 }
199 
200 INLINE void CodecStartSubcarrier(void)
201 {
202  CODEC_SUBCARRIER_TIMER.CTRLA = CODEC_TIMER_CARRIER_CLKSEL;
203 }
204 
205 INLINE void CodecSetDemodPower(bool bOnOff)
206 {
207  if (bOnOff) {
208  CODEC_DEMOD_POWER_PORT.OUTSET = CODEC_DEMOD_POWER_MASK;
209  } else {
210  CODEC_DEMOD_POWER_PORT.OUTCLR = CODEC_DEMOD_POWER_MASK;
211  }
212 }
213 
214 INLINE bool CodecGetLoadmodState(void) {
215  if (ACA.STATUS & AC_AC0STATE_bm) {
216  return true;
217  } else {
218  return false;
219  }
220 }
221 
222 INLINE void CodecSetLoadmodState(bool bOnOff) {
223  if (bOnOff) {
224  VPORT0.OUT |= CODEC_LOADMOD_MASK;
225  } else {
226  VPORT0.OUT &= ~CODEC_LOADMOD_MASK;
227  }
228 }
229 
230 INLINE void CodecSetReaderField(bool bOnOff) { // this is the function for turning on/off the reader field dumbly; before using this function, please consider to use CodecReaderField{Start,Stop}
231 
232  if (bOnOff) {
233  /* Start timer for field generation and unmask outputs */
234  CODEC_READER_TIMER.CTRLA = TC_CLKSEL_DIV1_gc;
235  AWEXC.OUTOVEN = CODEC_READER_MASK;
236  } else {
237  /* Disable outputs of AWEX and stop field generation */
238  AWEXC.OUTOVEN = 0x00;
239  CODEC_READER_TIMER.CTRLA = TC_CLKSEL_OFF_gc;
240  }
241 }
242 
243 INLINE bool CodecGetReaderField(void) {
244  return (CODEC_READER_TIMER.CTRLA == TC_CLKSEL_DIV1_gc) && (AWEXC.OUTOVEN == CODEC_READER_MASK);
245 }
246 
247 void CodecReaderFieldStart(void);
248 void CodecReaderFieldStop(void);
249 bool CodecIsReaderFieldReady(void);
250 
251 void CodecReaderFieldRestart(uint16_t delay);
252 #define FIELD_RESTART() CodecReaderFieldRestart(100)
253 bool CodecIsReaderToBeRestarted(void);
254 #endif /* CODEC_H_ */
void(* CodecInitFunc)(void)
Definition: Configuration.h:57
void(* CodecTaskFunc)(void)
Definition: Configuration.h:63
void(* CodecDeInitFunc)(void)
Definition: Configuration.h:59
diff --git a/Doc/Doxygen/html/_command_line_8h_source.html b/Doc/Doxygen/html/_command_line_8h_source.html index 6230ed1..7d4e21c 100644 --- a/Doc/Doxygen/html/_command_line_8h_source.html +++ b/Doc/Doxygen/html/_command_line_8h_source.html @@ -92,7 +92,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
1 /*
2  * CommandLine.h
3  *
4  * Created on: 04.05.2013
5  * Author: skuser
6  */
7 
8 #ifndef COMMANDLINE_H_
9 #define COMMANDLINE_H_
10 
11 #include "Terminal.h"
12 #include "Commands.h"
13 
14 void CommandLineInit(void);
15 bool CommandLineProcessByte(uint8_t Byte);
16 void CommandLineTick(void);
17 
18 void CommandLineAppendData(void const * const Buffer, uint16_t Bytes);
19 
20 /* Functions for timeout commands */
21 void CommandLinePendingTaskFinished(CommandStatusIdType ReturnStatusID, char const * const OutMessage); // must be called, when the intended task is finished
22 extern void (*CommandLinePendingTaskTimeout) (void); // gets called on timeout to end the pending task
23 void CommandLinePendingTaskBreak(void); // this manually triggers a timeout
24 
25 #endif /* COMMANDLINE_H_ */
diff --git a/Doc/Doxygen/html/_command_line_8txt.html b/Doc/Doxygen/html/_command_line_8txt.html index 5588619..a98d19c 100644 --- a/Doc/Doxygen/html/_command_line_8txt.html +++ b/Doc/Doxygen/html/_command_line_8txt.html @@ -88,7 +88,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Doc/Doxygen/html/_commands_8h_source.html b/Doc/Doxygen/html/_commands_8h_source.html index 1997ab6..4aad8e9 100644 --- a/Doc/Doxygen/html/_commands_8h_source.html +++ b/Doc/Doxygen/html/_commands_8h_source.html @@ -92,7 +92,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
1 
2 
3 #ifndef COMMANDS_H_
4 #define COMMANDS_H_
5 
6 #include "../Common.h"
7 
8 #define MAX_COMMAND_LENGTH 16
9 #define MAX_STATUS_LENGTH 32
10 
11 
12 #define COMMAND_INFO_OK_ID 100
13 #define COMMAND_INFO_OK "OK"
14 #define COMMAND_INFO_OK_WITH_TEXT_ID 101
15 #define COMMAND_INFO_OK_WITH_TEXT "OK WITH TEXT"
16 #define COMMAND_INFO_XMODEM_WAIT_ID 110
17 #define COMMAND_INFO_XMODEM_WAIT "WAITING FOR XMODEM"
18 #define COMMAND_INFO_FALSE_ID 120
19 #define COMMAND_INFO_FALSE "FALSE"
20 #define COMMAND_INFO_TRUE_ID 121
21 #define COMMAND_INFO_TRUE "TRUE"
22 #define COMMAND_ERR_UNKNOWN_CMD_ID 200
23 #define COMMAND_ERR_UNKNOWN_CMD "UNKNOWN COMMAND"
24 #define COMMAND_ERR_INVALID_USAGE_ID 201
25 #define COMMAND_ERR_INVALID_USAGE "INVALID COMMAND USAGE"
26 #define COMMAND_ERR_INVALID_PARAM_ID 202
27 #define COMMAND_ERR_INVALID_PARAM "INVALID PARAMETER"
28 #define COMMAND_ERR_TIMEOUT_ID 203
29 #define COMMAND_ERR_TIMEOUT "TIMEOUT"
30 #define TIMEOUT_COMMAND 255 // this is just for the CommandLine module to know that this is a timeout command
31 
32 
33 #define COMMAND_CHAR_TRUE '1'
34 #define COMMAND_CHAR_FALSE '0'
35 #define COMMAND_CHAR_SUGGEST '?' /* <CMD>=? for help */
36 
37 #define COMMAND_UID_BUFSIZE 32
38 
39 #define COMMAND_IS_SUGGEST_STRING(x) ( ((x)[0] == COMMAND_CHAR_SUGGEST) && ((x)[1] == '\0') )
40 
41 typedef uint8_t CommandStatusIdType;
42 typedef const char CommandStatusMessageType[MAX_STATUS_LENGTH];
43 
44 typedef CommandStatusIdType (*CommandExecFuncType) (char* OutMessage);
45 typedef CommandStatusIdType (*CommandExecParamFuncType) (char* OutMessage, const char* InParams);
46 typedef CommandStatusIdType (*CommandSetFuncType) (char* OutMessage, const char* InParam);
47 typedef CommandStatusIdType (*CommandGetFuncType) (char* OutParam);
48 
49 typedef struct {
50  char Command[MAX_COMMAND_LENGTH];
51  CommandExecFuncType ExecFunc;
52  CommandExecParamFuncType ExecParamFunc;
53  CommandSetFuncType SetFunc;
54  CommandGetFuncType GetFunc;
55 } CommandEntryType;
56 
57 #define COMMAND_VERSION "VERSION"
58 CommandStatusIdType CommandGetVersion(char* OutParam);
59 
60 #define COMMAND_CONFIG "CONFIG"
61 CommandStatusIdType CommandGetConfig(char* OutParam);
62 CommandStatusIdType CommandSetConfig(char* OutMessage, const char* InParam);
63 
64 #define COMMAND_UID "UID"
65 #define COMMAND_UID_RANDOM "RANDOM"
66 CommandStatusIdType CommandGetUid(char* OutParam);
67 CommandStatusIdType CommandSetUid(char* OutMessage, const char* InParam);
68 
69 #define COMMAND_READONLY "READONLY"
70 CommandStatusIdType CommandGetReadOnly(char* OutParam);
71 CommandStatusIdType CommandSetReadOnly(char* OutMessage, const char* InParam);
72 
73 #define COMMAND_UPLOAD "UPLOAD"
74 CommandStatusIdType CommandExecUpload(char* OutMessage);
75 
76 #define COMMAND_DOWNLOAD "DOWNLOAD"
77 CommandStatusIdType CommandExecDownload(char* OutMessage);
78 
79 #define COMMAND_RESET "RESET"
80 CommandStatusIdType CommandExecReset(char* OutMessage);
81 
82 #define COMMAND_UPGRADE "UPGRADE"
83 CommandStatusIdType CommandExecUpgrade(char* OutMessage);
84 
85 #define COMMAND_MEMSIZE "MEMSIZE"
86 CommandStatusIdType CommandGetMemSize(char* OutParam);
87 
88 #define COMMAND_UIDSIZE "UIDSIZE"
89 CommandStatusIdType CommandGetUidSize(char* OutParam);
90 
91 #define COMMAND_RBUTTON "RBUTTON"
92 CommandStatusIdType CommandGetRButton(char* OutParam);
93 CommandStatusIdType CommandSetRButton(char* OutMessage, const char* InParam);
94 
95 #define COMMAND_RBUTTON_LONG "RBUTTON_LONG"
96 CommandStatusIdType CommandGetRButtonLong(char* OutParam);
97 CommandStatusIdType CommandSetRButtonLong(char* OutMessage, const char* InParam);
98 
99 #define COMMAND_LBUTTON "LBUTTON"
100 CommandStatusIdType CommandGetLButton(char* OutParam);
101 CommandStatusIdType CommandSetLButton(char* OutMessage, const char* InParam);
102 
103 #define COMMAND_LBUTTON_LONG "LBUTTON_LONG"
104 CommandStatusIdType CommandGetLButtonLong(char* OutParam);
105 CommandStatusIdType CommandSetLButtonLong(char* OutMessage, const char* InParam);
106 
107 
108 #define COMMAND_LEDGREEN "LEDGREEN"
109 CommandStatusIdType CommandGetLedGreen(char* OutParam);
110 CommandStatusIdType CommandSetLedGreen(char* OutMessage, const char* InParam);
111 
112 #define COMMAND_LEDRED "LEDRED"
113 CommandStatusIdType CommandGetLedRed(char* OutParam);
114 CommandStatusIdType CommandSetLedRed(char* OutMessage, const char* InParam);
115 
116 #define COMMAND_LOGMODE "LOGMODE"
117 CommandStatusIdType CommandGetLogMode(char* OutParam);
118 CommandStatusIdType CommandSetLogMode(char* OutMessage, const char* InParam);
119 
120 #define COMMAND_LOGMEM "LOGMEM"
121 CommandStatusIdType CommandGetLogMem(char* OutParam);
122 
123 #define COMMAND_LOGDOWNLOAD "LOGDOWNLOAD"
124 CommandStatusIdType CommandExecLogDownload(char* OutMessage);
125 
126 #define COMMAND_STORELOG "LOGSTORE"
127 CommandStatusIdType CommandExecStoreLog(char* OutMessage);
128 
129 #define COMMAND_LOGCLEAR "LOGCLEAR"
130 CommandStatusIdType CommandExecLogClear(char* OutMessage);
131 
132 #define COMMAND_SETTING "SETTING"
133 CommandStatusIdType CommandGetSetting(char* OutParam);
134 CommandStatusIdType CommandSetSetting(char* OutMessage, const char* InParam);
135 
136 #define COMMAND_CLEAR "CLEAR"
137 CommandStatusIdType CommandExecClear(char* OutMessage);
138 
139 #define COMMAND_STORE "STORE"
140 CommandStatusIdType CommandExecStore(char* OutMessage);
141 
142 #define COMMAND_RECALL "RECALL"
143 CommandStatusIdType CommandExecRecall(char* OutMessage);
144 
145 #define COMMAND_CHARGING "CHARGING"
146 CommandStatusIdType CommandGetCharging(char* OutParam);
147 
148 #define COMMAND_HELP "HELP"
149 CommandStatusIdType CommandExecHelp(char* OutMessage);
150 
151 #define COMMAND_RSSI "RSSI"
152 CommandStatusIdType CommandGetRssi(char* OutParam);
153 
154 #define COMMAND_SYSTICK "SYSTICK"
155 CommandStatusIdType CommandGetSysTick(char* OutParam);
156 
157 #define COMMAND_SEND_RAW "SEND_RAW"
158 CommandStatusIdType CommandExecParamSendRaw(char* OutMessage, const char* InParams);
159 
160 #define COMMAND_SEND "SEND"
161 CommandStatusIdType CommandExecParamSend(char* OutMessage, const char* InParams);
162 
163 #define COMMAND_GETUID "GETUID"
164 CommandStatusIdType CommandExecGetUid(char* OutMessage);
165 
166 #define COMMAND_DUMP_MFU "DUMP_MFU"
167 CommandStatusIdType CommandExecDumpMFU(char* OutMessage);
168 
169 #define COMMAND_IDENTIFY_CARD "IDENTIFY"
170 CommandStatusIdType CommandExecIdentifyCard(char* OutMessage);
171 
172 #define COMMAND_TIMEOUT "TIMEOUT"
173 CommandStatusIdType CommandGetTimeout(char* OutMessage);
174 CommandStatusIdType CommandSetTimeout(char* OutMessage, const char* InParam);
175 
176 #define COMMAND_THRESHOLD "THRESHOLD"
177 CommandStatusIdType CommandGetThreshold(char* OutParam);
178 CommandStatusIdType CommandSetThreshold(char* OutMessage, const char* InParam);
179 
180 #define COMMAND_FIELD "FIELD"
181 CommandStatusIdType CommandSetField(char* OutMessage, const char* InParam);
182 CommandStatusIdType CommandGetField(char* OutMessage);
183 
184 #define COMMAND_LIST_END ""
185 /* Defines the end of command list. This is no actual command */
186 
187 #endif /* COMMANDS_H_ */
diff --git a/Doc/Doxygen/html/_common_8h_source.html b/Doc/Doxygen/html/_common_8h_source.html index 8f7cd82..299755f 100644 --- a/Doc/Doxygen/html/_common_8h_source.html +++ b/Doc/Doxygen/html/_common_8h_source.html @@ -92,7 +92,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
1 /*
2  * Common.h
3  *
4  * Created on: 20.03.2013
5  * Author: skuser
6  */
7 
8 #ifndef COMMON_H_
9 #define COMMON_H_
10 
11 #include <stdio.h>
12 #include <stdbool.h>
13 #include <util/parity.h>
14 #include <util/delay.h>
15 #include <avr/pgmspace.h>
16 #include <avr/io.h>
17 
18 #define ODD_PARITY(Value) OddParityBit(Value)//(parity_even_bit(Value) ? 0 : 1)
19 
20 #define INLINE \
21  static inline __attribute__((always_inline))
22 
23 #define ARRAY_COUNT(x) \
24  (sizeof(x) / sizeof(x[0]))
25 
26 #define NIBBLE_TO_HEXCHAR(x) ( (x) < 0x0A ? (x) + '0' : (x) + 'A' - 0x0A )
27 #define HEXCHAR_TO_NIBBLE(x) ( (x) < 'A' ? (x) - '0' : (x) - 'A' + 0x0A )
28 #define VALID_HEXCHAR(x) ( ( (x) >= '0' && (x) <= '9' ) || ( (x) >= 'A' && (x) <= 'F' ) )
29 #define MIN(x,y) ( (x) < (y) ? (x) : (y) )
30 #define MAX(x,y) ( (x) > (y) ? (x) : (y) )
31 #define SYSTICK_DIFF(since) ((uint16_t) (SystemGetSysTick() - since))
32 #define SYSTICK_DIFF_100MS(since) (SYSTICK_DIFF(since) / 100)
33 
34 #define BITS_PER_BYTE 8
35 
36 uint16_t BufferToHexString(char* HexOut, uint16_t MaxChars, const void* Buffer, uint16_t ByteCount);
37 uint16_t HexStringToBuffer(void* Buffer, uint16_t MaxBytes, const char* HexIn);
38 
39 INLINE uint8_t BitReverseByte(uint8_t Byte)
40 {
41  extern const uint8_t PROGMEM BitReverseByteTable[];
42 
43  return pgm_read_byte(&BitReverseByteTable[Byte]);
44 }
45 
46 INLINE uint8_t OddParityBit(uint8_t Byte)
47 {
48  extern const uint8_t PROGMEM OddParityByteTable[];
49 
50  return pgm_read_byte(&OddParityByteTable[Byte]);
51 }
52 
53 INLINE uint8_t StringLength(const char* Str, uint8_t MaxLen)
54 {
55  uint8_t StrLen = 0;
56 
57  while(MaxLen > 0) {
58  if (*Str++ == '\0')
59  break;
60 
61  MaxLen--;
62  StrLen++;
63  }
64 
65  return StrLen;
66 }
67 
68 #endif /* COMMON_H_ */
diff --git a/Doc/Doxygen/html/_configuration_8h.html b/Doc/Doxygen/html/_configuration_8h.html index 125859c..e453781 100644 --- a/Doc/Doxygen/html/_configuration_8h.html +++ b/Doc/Doxygen/html/_configuration_8h.html @@ -104,7 +104,7 @@ Classes diff --git a/Doc/Doxygen/html/_configuration_8h_source.html b/Doc/Doxygen/html/_configuration_8h_source.html index 7e0a331..6337398 100644 --- a/Doc/Doxygen/html/_configuration_8h_source.html +++ b/Doc/Doxygen/html/_configuration_8h_source.html @@ -96,7 +96,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Doc/Doxygen/html/_configurations_8txt.html b/Doc/Doxygen/html/_configurations_8txt.html index 4af2aed..53f85c2 100644 --- a/Doc/Doxygen/html/_configurations_8txt.html +++ b/Doc/Doxygen/html/_configurations_8txt.html @@ -88,7 +88,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Doc/Doxygen/html/_crypto1_8h_source.html b/Doc/Doxygen/html/_crypto1_8h_source.html index 2397b2b..a4ecd53 100644 --- a/Doc/Doxygen/html/_crypto1_8h_source.html +++ b/Doc/Doxygen/html/_crypto1_8h_source.html @@ -92,7 +92,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
1 #ifndef CRYPTO1_H
2 #define CRYPTO1_H
3 
4 #include <stdint.h>
5 #include <stdbool.h>
6 
7 /* Gets the current keystream-bit, without shifting the internal LFSR */
8 uint8_t Crypto1FilterOutput(void);
9 
10 /* Set up Crypto1 cipher using the given Key, Uid and CardNonce. Also encrypts
11  * the CardNonce in-place while in non-linear mode. */
12 void Crypto1Setup(uint8_t Key[6], uint8_t Uid[4], uint8_t CardNonce[4]);
13 
14 /* Set up Crypto1 cipher using the given Key, Uid and CardNonce. Nested indicates
15  * whether the CardNonce is encrypted (true) or not (false).
16  * If the CardNonce is encrypted, it will we decrypted in-place. If not, it will
17  * be fed into the LFSR, but remains unchanged. */
18 void Crypto1SetupReader(uint8_t Key[6], uint8_t Uid[4], uint8_t CardNonce[4], bool Nested);
19 
20 /* Load the decrypted ReaderNonce into the Crypto1 state LFSR */
21 void Crypto1Auth(uint8_t EncryptedReaderNonce[4]);
22 
23 /* Generate 8 Bits of key stream */
24 uint8_t Crypto1Byte(void);
25 
26 /* Generate 4 Bits of key stream */
27 uint8_t Crypto1Nibble(void);
28 
29 /* Execute 'ClockCount' cycles on the PRNG state 'State' */
30 void Crypto1PRNG(uint8_t State[4], uint16_t ClockCount);
31 
32 /* Encrypts buffer with consideration of parity bits */
33 void Crypto1EncryptWithParity(uint8_t * Buffer, uint16_t BitCount);
34 
35 /* Encrypts buffer with LFSR feedback within reader nonce and considers parity bits */
36 void Crypto1ReaderAuthWithParity(uint8_t PlainReaderAnswerWithParityBits[9]);
37 
38 #endif //CRYPTO1_H
diff --git a/Doc/Doxygen/html/_getting_started_8txt.html b/Doc/Doxygen/html/_getting_started_8txt.html index 5bbd863..7732bf4 100644 --- a/Doc/Doxygen/html/_getting_started_8txt.html +++ b/Doc/Doxygen/html/_getting_started_8txt.html @@ -88,7 +88,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Doc/Doxygen/html/_i_s_o14443-2_a_8h_source.html b/Doc/Doxygen/html/_i_s_o14443-2_a_8h_source.html index 192da09..af31680 100644 --- a/Doc/Doxygen/html/_i_s_o14443-2_a_8h_source.html +++ b/Doc/Doxygen/html/_i_s_o14443-2_a_8h_source.html @@ -92,7 +92,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
1 /*
2  * ISO14443-2A.h
3  *
4  * Created on: 18.02.2013
5  * Author: skuser
6  */
7 
8 #ifndef ISO14443_2A_H_
9 #define ISO14443_2A_H_
10 
11 #include "Codec.h"
12 
13 #define ISO14443A_APP_NO_RESPONSE 0x0000
14 #define ISO14443A_APP_CUSTOM_PARITY 0x1000
15 
16 #define ISO14443A_BUFFER_PARITY_OFFSET (CODEC_BUFFER_SIZE/2)
17 
18 /* Codec Interface */
19 void ISO14443ACodecInit(void);
20 void ISO14443ACodecDeInit(void);
21 void ISO14443ACodecTask(void);
22 
23 
24 
25 #endif
diff --git a/Doc/Doxygen/html/_i_s_o14443-3_a_8h_source.html b/Doc/Doxygen/html/_i_s_o14443-3_a_8h_source.html index 567076d..f9a1ea5 100644 --- a/Doc/Doxygen/html/_i_s_o14443-3_a_8h_source.html +++ b/Doc/Doxygen/html/_i_s_o14443-3_a_8h_source.html @@ -92,7 +92,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
1 /*
2  * ISO14443-2A.h
3  *
4  * Created on: 19.03.2013
5  * Author: skuser
6  */
7 
8 #ifndef ISO14443_3A_H_
9 #define ISO14443_3A_H_
10 
11 #include "../Common.h"
12 #include <string.h>
13 
14 #define ISO14443A_UID_SIZE_SINGLE 4 /* bytes */
15 #define ISO14443A_UID_SIZE_DOUBLE 7
16 #define ISO14443A_UID_SIZE_TRIPLE 10
17 
18 #define ISO14443A_CMD_REQA 0x26
19 #define ISO14443A_CMD_WUPA 0x52
20 #define ISO14443A_CMD_SELECT_CL1 0x93
21 #define ISO14443A_CMD_SELECT_CL2 0x95
22 #define ISO14443A_CMD_SELECT_CL3 0x97
23 #define ISO14443A_CMD_HLTA 0x50
24 
25 #define ISO14443A_NVB_AC_START 0x20
26 #define ISO14443A_NVB_AC_END 0x70
27 
28 #define ISO14443A_CL_UID_OFFSET 0
29 #define ISO14443A_CL_UID_SIZE 4
30 #define ISO14443A_CL_BCC_OFFSET 4
31 #define ISO14443A_CL_BCC_SIZE 1 /* Byte */
32 #define ISO14443A_CL_FRAME_SIZE ((ISO14443A_CL_UID_SIZE + ISO14443A_CL_BCC_SIZE) * 8) /* UID[N...N+3] || BCCN */
33 #define ISO14443A_SAK_INCOMPLETE 0x04
34 #define ISO14443A_SAK_COMPLETE_COMPLIANT 0x20
35 #define ISO14443A_SAK_COMPLETE_NOT_COMPLIANT 0x00
36 
37 #define ISO14443A_ATQA_FRAME_SIZE (2 * 8) /* Bit */
38 #define ISO14443A_SAK_FRAME_SIZE (3 * 8) /* Bit */
39 
40 #define ISO14443A_UID0_RANDOM 0x08
41 #define ISO14443A_UID0_CT 0x88
42 
43 #define ISO14443A_CRCA_SIZE 2
44 
45 #define ISO14443A_CALC_BCC(ByteBuffer) \
46  ( ByteBuffer[0] ^ ByteBuffer[1] ^ ByteBuffer[2] ^ ByteBuffer[3] )
47 
48 void ISO14443AAppendCRCA(void* Buffer, uint16_t ByteCount);
49 bool ISO14443ACheckCRCA(const void* Buffer, uint16_t ByteCount);
50 
51 INLINE bool ISO14443ASelect(void* Buffer, uint16_t* BitCount, uint8_t* UidCL, uint8_t SAKValue);
52 INLINE bool ISO14443AWakeUp(void* Buffer, uint16_t* BitCount, uint16_t ATQAValue, bool FromHalt);
53 
54 INLINE
55 bool ISO14443ASelect(void* Buffer, uint16_t* BitCount, uint8_t* UidCL, uint8_t SAKValue)
56 {
57  uint8_t* DataPtr = (uint8_t*) Buffer;
58  uint8_t NVB = DataPtr[1];
59  //uint8_t CollisionByteCount = (NVB >> 4) & 0x0F;
60  //uint8_t CollisionBitCount = (NVB >> 0) & 0x0F;
61 
62  switch (NVB) {
63  case ISO14443A_NVB_AC_START:
64  /* Start of anticollision procedure.
65  * Send whole UID CLn + BCC */
66  DataPtr[0] = UidCL[0];
67  DataPtr[1] = UidCL[1];
68  DataPtr[2] = UidCL[2];
69  DataPtr[3] = UidCL[3];
70  DataPtr[4] = ISO14443A_CALC_BCC(DataPtr);
71 
72  *BitCount = ISO14443A_CL_FRAME_SIZE;
73 
74  return false;
75 
76  case ISO14443A_NVB_AC_END:
77  /* End of anticollision procedure.
78  * Send SAK CLn if we are selected. */
79  if ( (DataPtr[2] == UidCL[0]) &&
80  (DataPtr[3] == UidCL[1]) &&
81  (DataPtr[4] == UidCL[2]) &&
82  (DataPtr[5] == UidCL[3]) ) {
83 
84  DataPtr[0] = SAKValue;
85  ISO14443AAppendCRCA(Buffer, 1);
86 
87  *BitCount = ISO14443A_SAK_FRAME_SIZE;
88  return true;
89  } else {
90  /* We have not been selected. Don't send anything. */
91  *BitCount = 0;
92  return false;
93  }
94  default:
95  {
96  uint8_t CollisionByteCount = ((NVB >> 4) & 0x0f) - 2;
97  uint8_t CollisionBitCount = (NVB >> 0) & 0x0f;
98  uint8_t mask = 0xFF >> (8 - CollisionBitCount);
99  // Since the UidCL does not contain the BCC, we have to distinguish here
100  if (
101  ((CollisionByteCount == 5 || (CollisionByteCount == 4 && CollisionBitCount > 0)) && memcmp(UidCL, &DataPtr[2], 4) == 0 && (ISO14443A_CALC_BCC(UidCL) & mask) == (DataPtr[6] & mask))
102  ||
103  (CollisionByteCount == 4 && CollisionBitCount == 0 && memcmp(UidCL, &DataPtr[2], 4) == 0)
104  ||
105  (CollisionByteCount < 4 && memcmp(UidCL, &DataPtr[2], CollisionByteCount) == 0 && (UidCL[CollisionByteCount] & mask) == (DataPtr[CollisionByteCount + 2] & mask))
106  )
107  {
108  DataPtr[0] = UidCL[0];
109  DataPtr[1] = UidCL[1];
110  DataPtr[2] = UidCL[2];
111  DataPtr[3] = UidCL[3];
112  DataPtr[4] = ISO14443A_CALC_BCC(DataPtr);
113 
114  *BitCount = ISO14443A_CL_FRAME_SIZE;
115  } else {
116  *BitCount = 0;
117  }
118  return false;
119  }
120  /* TODO: No anticollision supported */
121  *BitCount = 0;
122  return false;
123  }
124 }
125 
126 INLINE
127 bool ISO14443AWakeUp(void* Buffer, uint16_t* BitCount, uint16_t ATQAValue, bool FromHalt)
128 {
129  uint8_t* DataPtr = (uint8_t*) Buffer;
130 
131  if ( ((! FromHalt) && (DataPtr[0] == ISO14443A_CMD_REQA)) ||
132  (DataPtr[0] == ISO14443A_CMD_WUPA) ){
133  DataPtr[0] = (ATQAValue >> 0) & 0x00FF;
134  DataPtr[1] = (ATQAValue >> 8) & 0x00FF;
135 
136  *BitCount = ISO14443A_ATQA_FRAME_SIZE;
137 
138  return true;
139  } else {
140  *BitCount = 0;
141 
142  return false;
143  }
144 }
145 
146 #endif
diff --git a/Doc/Doxygen/html/_l_e_d_8h_source.html b/Doc/Doxygen/html/_l_e_d_8h_source.html index f636999..7e74e2e 100644 --- a/Doc/Doxygen/html/_l_e_d_8h_source.html +++ b/Doc/Doxygen/html/_l_e_d_8h_source.html @@ -92,7 +92,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
1 /*
2  * LED.h
3  *
4  * Created on: 10.02.2013
5  * Author: skuser
6  */
7 
8 #ifndef LED_H
9 #define LED_H
10 
11 #include <avr/io.h>
12 #include "Common.h"
13 
14 #define LED_PORT PORTA
15 #define LED_GREEN PIN4_bm
16 #define LED_RED PIN3_bm
17 #define LED_MASK (LED_GREEN | LED_RED)
18 
19 typedef enum LEDFunctionEnum {
20  LED_NO_FUNC = 0, /* Don't light up the LED */
21  LED_POWERED, /* Light up the LED whenever the Chameleon is powered */
22 
23  LED_TERMINAL_CONN, /* A Terminal/USB connection has been established */
24  LED_TERMINAL_RXTX, /* There is traffic on the terminal */
25 
26  LED_SETTING_CHANGE, /* Outputs a blink code that shows the current setting */
27 
28  LED_MEMORY_STORED, /* Blink once when memory has been stored to flash */
29  LED_MEMORY_CHANGED, /* Switch LED on when card memory has changed compared to flash */
30 
31  LED_FIELD_DETECTED, /* Shows LED while a reader field is being detected or turned on by the chameleon itself */
32 
33  LED_CODEC_RX, /* Blink LED when receiving codec data */
34  LED_CODEC_TX, /* Blink LED when transmitting codec data */
35 
36  LED_LOG_MEM_FULL, /* Light up if log memory is full. */
37 
38  //TODO: LED_APP_SELECTED, /* Show LED while the correct UID has been selected and the application is active */
39  /* Has to be last element */
40  LED_FUNC_COUNT
41 } LEDHookEnum;
42 
43 typedef enum LEDActionEnum {
44  LED_NO_ACTION = 0x00,
45  LED_OFF = 0x10,
46  LED_ON = 0x11,
47  LED_TOGGLE = 0x12,
48  LED_PULSE = 0x13,
49  LED_BLINK = 0x20,
50  LED_BLINK_1X = 0x20,
51  LED_BLINK_2X, /* Have to be sequentially ordered */
52  LED_BLINK_3X,
53  LED_BLINK_4X,
54  LED_BLINK_5X,
55  LED_BLINK_6X,
56  LED_BLINK_7X,
57  LED_BLINK_8X,
58 } LEDActionEnum;
59 
60 
61 
62 void LEDInit(void);
63 void LEDTick(void);
64 
65 void LEDGetFuncList(char* List, uint16_t BufferSize);
66 void LEDSetFuncById(uint8_t Mask, LEDHookEnum Func);
67 void LEDGetFuncByName(uint8_t Mask, char* Function, uint16_t BufferSize);
68 bool LEDSetFuncByName(uint8_t Mask, const char* Function);
69 
70 #endif /* LED_H */
diff --git a/Doc/Doxygen/html/_l_e_d_8txt.html b/Doc/Doxygen/html/_l_e_d_8txt.html index b47ba13..82ed094 100644 --- a/Doc/Doxygen/html/_l_e_d_8txt.html +++ b/Doc/Doxygen/html/_l_e_d_8txt.html @@ -88,7 +88,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Doc/Doxygen/html/_l_e_d_hook_8h_source.html b/Doc/Doxygen/html/_l_e_d_hook_8h_source.html index a76a8f5..1df309b 100644 --- a/Doc/Doxygen/html/_l_e_d_hook_8h_source.html +++ b/Doc/Doxygen/html/_l_e_d_hook_8h_source.html @@ -93,7 +93,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Doc/Doxygen/html/_l_e_ds_8txt.html b/Doc/Doxygen/html/_l_e_ds_8txt.html index b454e20..93dd998 100644 --- a/Doc/Doxygen/html/_l_e_ds_8txt.html +++ b/Doc/Doxygen/html/_l_e_ds_8txt.html @@ -88,7 +88,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Doc/Doxygen/html/_l_u_f_a_config_8h.html b/Doc/Doxygen/html/_l_u_f_a_config_8h.html index 5d4118e..03c046f 100644 --- a/Doc/Doxygen/html/_l_u_f_a_config_8h.html +++ b/Doc/Doxygen/html/_l_u_f_a_config_8h.html @@ -101,7 +101,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Doc/Doxygen/html/_l_u_f_a_config_8h_source.html b/Doc/Doxygen/html/_l_u_f_a_config_8h_source.html index 06fabd0..4781d47 100644 --- a/Doc/Doxygen/html/_l_u_f_a_config_8h_source.html +++ b/Doc/Doxygen/html/_l_u_f_a_config_8h_source.html @@ -92,7 +92,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); Go to the documentation of this file.
1 /*
2  LUFA Library
3  Copyright (C) Dean Camera, 2012.
4 
5  dean [at] fourwalledcubicle [dot] com
6  www.lufa-lib.org
7 */
8 
9 /*
10  Copyright 2012 Dean Camera (dean [at] fourwalledcubicle [dot] com)
11 
12  Permission to use, copy, modify, distribute, and sell this
13  software and its documentation for any purpose is hereby granted
14  without fee, provided that the above copyright notice appear in
15  all copies and that both that the copyright notice and this
16  permission notice and warranty disclaimer appear in supporting
17  documentation, and that the name of the author not be used in
18  advertising or publicity pertaining to distribution of the
19  software without specific, written prior permission.
20 
21  The author disclaim all warranties with regard to this
22  software, including all implied warranties of merchantability
23  and fitness. In no event shall the author be liable for any
24  special, indirect or consequential damages or any damages
25  whatsoever resulting from loss of use, data or profits, whether
26  in an action of contract, negligence or other tortious action,
27  arising out of or in connection with the use or performance of
28  this software.
29 */
30 
42 #ifndef _LUFA_CONFIG_H_
43 #define _LUFA_CONFIG_H_
44 
45  /* Non-USB Related Configuration Tokens: */
46 // #define DISABLE_TERMINAL_CODES
47 
48  /* USB Class Driver Related Tokens: */
49 // #define HID_HOST_BOOT_PROTOCOL_ONLY
50 // #define HID_STATETABLE_STACK_DEPTH {Insert Value Here}
51 // #define HID_USAGE_STACK_DEPTH {Insert Value Here}
52 // #define HID_MAX_COLLECTIONS {Insert Value Here}
53 // #define HID_MAX_REPORTITEMS {Insert Value Here}
54 // #define HID_MAX_REPORT_IDS {Insert Value Here}
55 // #define NO_CLASS_DRIVER_AUTOFLUSH
56 
57  /* General USB Driver Related Tokens: */
58  #define USE_STATIC_OPTIONS \
59  (USB_OPT_BUSEVENT_PRIMED | USB_DEVICE_OPT_FULLSPEED | /*USB_OPT_PLLCLKSRC*/ USB_OPT_RC32MCLKSRC)
60  #define USB_DEVICE_ONLY
61 // #define USB_STREAM_TIMEOUT_MS {Insert Value Here}
62 // #define NO_LIMITED_CONTROLLER_CONNECT
63 // #define NO_SOF_EVENTS
64 
65  /* USB Device Mode Driver Related Tokens: */
66 // #define USE_RAM_DESCRIPTORS
67  #define USE_FLASH_DESCRIPTORS
68 // #define USE_EEPROM_DESCRIPTORS
69 // #define NO_INTERNAL_SERIAL
70  #define FIXED_CONTROL_ENDPOINT_SIZE 8
71 // #define DEVICE_STATE_AS_GPIOR {Insert Value Here}
72  #define FIXED_NUM_CONFIGURATIONS 1
73 // #define CONTROL_ONLY_DEVICE
74  #define MAX_ENDPOINT_INDEX 5
75 // #define NO_DEVICE_REMOTE_WAKEUP
76 // #define NO_DEVICE_SELF_POWER
77 
78 #endif
diff --git a/Doc/Doxygen/html/_l_u_f_a_descriptors_8c.html b/Doc/Doxygen/html/_l_u_f_a_descriptors_8c.html index 7e62a67..913b4b0 100644 --- a/Doc/Doxygen/html/_l_u_f_a_descriptors_8c.html +++ b/Doc/Doxygen/html/_l_u_f_a_descriptors_8c.html @@ -218,7 +218,7 @@ Variables diff --git a/Doc/Doxygen/html/_l_u_f_a_descriptors_8h.html b/Doc/Doxygen/html/_l_u_f_a_descriptors_8h.html index c2d72b5..f1d8d49 100644 --- a/Doc/Doxygen/html/_l_u_f_a_descriptors_8h.html +++ b/Doc/Doxygen/html/_l_u_f_a_descriptors_8h.html @@ -226,7 +226,7 @@ Functions diff --git a/Doc/Doxygen/html/_l_u_f_a_descriptors_8h_source.html b/Doc/Doxygen/html/_l_u_f_a_descriptors_8h_source.html index 69de230..4d064b4 100644 --- a/Doc/Doxygen/html/_l_u_f_a_descriptors_8h_source.html +++ b/Doc/Doxygen/html/_l_u_f_a_descriptors_8h_source.html @@ -94,7 +94,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Doc/Doxygen/html/_log_8h.html b/Doc/Doxygen/html/_log_8h.html index 2cabe27..43f9a5f 100644 --- a/Doc/Doxygen/html/_log_8h.html +++ b/Doc/Doxygen/html/_log_8h.html @@ -131,6 +131,12 @@ Enumerations LOG_INFO_CODEC_TX_DATA 

Currently active codec sent data.

+LOG_INFO_CODEC_RX_DATA_W_PARITY  +

Currently active codec received data.

+ +LOG_INFO_CODEC_TX_DATA_W_PARITY  +

Currently active codec sent data.

+ LOG_INFO_APP_CMD_READ 

Application processed read command.

@@ -173,6 +179,9 @@ Enumerations LOG_ERR_APP_NOT_AUTHED 

Application is not authenticated.

+LOG_INFO_SYSTEM_BOOT  +

Chameleon boots.

+ LOG_EMPTY 

Empty Log Entry. This is not followed by a length byte nor the two systick bytes nor any data.

@@ -183,7 +192,7 @@ Enumerations diff --git a/Doc/Doxygen/html/_log_8h_source.html b/Doc/Doxygen/html/_log_8h_source.html index aff5dce..8dbab65 100644 --- a/Doc/Doxygen/html/_log_8h_source.html +++ b/Doc/Doxygen/html/_log_8h_source.html @@ -89,33 +89,36 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
Log.h
-Go to the documentation of this file.
1 #ifndef LOG_H_
2 #define LOG_H_
3 
4 #include "Common.h"
5 
6 #define LOG_SIZE 2048
7 #define FRAM_LOG_START_ADDR 0x4000 // from the start of the second half of FRAM
8 #define FRAM_LOG_SIZE 0x4000 // the whole second half
9 
11 typedef enum {
12  /* Generic */
18 
19  /* Codec */
22 
23  /* App */
38 
39  LOG_EMPTY = 0x00
40 } LogEntryEnum;
41 
42 typedef enum {
43  LOG_MODE_OFF,
44  LOG_MODE_MEMORY,
45  LOG_MODE_LIVE
46 } LogModeEnum;
47 
48 typedef void (*LogFuncType) (LogEntryEnum Entry, const void* Data, uint8_t Length);
49 
50 extern LogFuncType CurrentLogFunc;
51 
52 void LogInit(void);
53 void LogTick(void);
54 void LogTask(void);
55 
56 void LogMemClear(void);
57 uint16_t LogMemFree(void);
58 /* XModem callback */
59 bool LogMemLoadBlock(void* Buffer, uint32_t BlockAddress, uint16_t ByteCount);
60 
61 void LogSetModeById(LogModeEnum Mode);
62 bool LogSetModeByName(const char* Mode);
63 void LogGetModeByName(char* Mode, uint16_t BufferSize);
64 void LogGetModeList(char* List, uint16_t BufferSize);
65 void LogSRAMToFRAM(void);
66 
67 /* Wrapper function to call current logging function */
68 INLINE void LogEntry(LogEntryEnum Entry, const void* Data, uint8_t Length) { CurrentLogFunc(Entry, Data, Length); }
69 
70 #endif /* LOG_H_ */
Application processed authentication command.
Definition: Log.h:30
-
Application authentication failed.
Definition: Log.h:35
-
Application is in auth state.
Definition: Log.h:34
-
Application processed increment command.
Definition: Log.h:26
-
Currently active codec sent data.
Definition: Log.h:21
-
UID change.
Definition: Log.h:16
-
Empty Log Entry. This is not followed by a length byte nor the two systick bytes nor any data...
Definition: Log.h:39
-
LogEntryEnum
Definition: Log.h:11
-
Currently active codec received data.
Definition: Log.h:20
-
Application processed write command.
Definition: Log.h:25
-
Application processed halt command.
Definition: Log.h:31
-
Application processed an unknown command.
Definition: Log.h:32
-
Application reset.
Definition: Log.h:17
-
Unspecific log entry.
Definition: Log.h:13
-
Application processed restore command.
Definition: Log.h:29
-
Application processed read command.
Definition: Log.h:24
-
Application had a checksum fail.
Definition: Log.h:36
-
Application processed transfer command.
Definition: Log.h:28
-
Setting change.
Definition: Log.h:15
-
Application is not authenticated.
Definition: Log.h:37
-
Application processed decrement command.
Definition: Log.h:27
-
Configuration change.
Definition: Log.h:14
-
Application is in authing state.
Definition: Log.h:33
+Go to the documentation of this file.
1 #ifndef LOG_H_
2 #define LOG_H_
3 
4 #include "Common.h"
5 
6 #define LOG_SIZE 2048
7 #define FRAM_LOG_ADDR_ADDR 0x4000 // start of the second half of FRAM
8 #define FRAM_LOG_START_ADDR 0x4002 // directly after the address
9 #define FRAM_LOG_SIZE 0x3FFE // the whole second half (minus the 2 Bytes of Address)
10 
12 typedef enum {
13  /* Generic */
19 
20  /* Codec */
25 
26  /* App */
41 
43 
44  LOG_EMPTY = 0x00
45 } LogEntryEnum;
46 
47 typedef enum {
48  LOG_MODE_OFF,
49  LOG_MODE_MEMORY,
50  LOG_MODE_LIVE
51 } LogModeEnum;
52 
53 typedef void (*LogFuncType) (LogEntryEnum Entry, const void* Data, uint8_t Length);
54 
55 extern LogFuncType CurrentLogFunc;
56 
57 void LogInit(void);
58 void LogTick(void);
59 void LogTask(void);
60 
61 void LogMemClear(void);
62 uint16_t LogMemFree(void);
63 /* XModem callback */
64 bool LogMemLoadBlock(void* Buffer, uint32_t BlockAddress, uint16_t ByteCount);
65 
66 void LogSetModeById(LogModeEnum Mode);
67 bool LogSetModeByName(const char* Mode);
68 void LogGetModeByName(char* Mode, uint16_t BufferSize);
69 void LogGetModeList(char* List, uint16_t BufferSize);
70 void LogSRAMToFRAM(void);
71 
72 /* Wrapper function to call current logging function */
73 INLINE void LogEntry(LogEntryEnum Entry, const void* Data, uint8_t Length) { CurrentLogFunc(Entry, Data, Length); }
74 
75 #endif /* LOG_H_ */
Application processed authentication command.
Definition: Log.h:33
+
Chameleon boots.
Definition: Log.h:42
+
Application authentication failed.
Definition: Log.h:38
+
Application is in auth state.
Definition: Log.h:37
+
Application processed increment command.
Definition: Log.h:29
+
Currently active codec sent data.
Definition: Log.h:22
+
UID change.
Definition: Log.h:17
+
Empty Log Entry. This is not followed by a length byte nor the two systick bytes nor any data...
Definition: Log.h:44
+
LogEntryEnum
Definition: Log.h:12
+
Currently active codec received data.
Definition: Log.h:21
+
Application processed write command.
Definition: Log.h:28
+
Application processed halt command.
Definition: Log.h:34
+
Application processed an unknown command.
Definition: Log.h:35
+
Application reset.
Definition: Log.h:18
+
Unspecific log entry.
Definition: Log.h:14
+
Application processed restore command.
Definition: Log.h:32
+
Application processed read command.
Definition: Log.h:27
+
Application had a checksum fail.
Definition: Log.h:39
+
Application processed transfer command.
Definition: Log.h:31
+
Setting change.
Definition: Log.h:16
+
Currently active codec received data.
Definition: Log.h:23
+
Application is not authenticated.
Definition: Log.h:40
+
Application processed decrement command.
Definition: Log.h:30
+
Configuration change.
Definition: Log.h:15
+
Currently active codec sent data.
Definition: Log.h:24
+
Application is in authing state.
Definition: Log.h:36
diff --git a/Doc/Doxygen/html/_log_8txt.html b/Doc/Doxygen/html/_log_8txt.html index 29dff9a..4fc35af 100644 --- a/Doc/Doxygen/html/_log_8txt.html +++ b/Doc/Doxygen/html/_log_8txt.html @@ -88,7 +88,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
diff --git a/Doc/Doxygen/html/_main_page_8txt.html b/Doc/Doxygen/html/_main_page_8txt.html index f8ca28d..8c17c32 100644 --- a/Doc/Doxygen/html/_main_page_8txt.html +++ b/Doc/Doxygen/html/_main_page_8txt.html @@ -88,7 +88,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Doc/Doxygen/html/_map_8h_source.html b/Doc/Doxygen/html/_map_8h_source.html index d5548fc..dfec2d7 100644 --- a/Doc/Doxygen/html/_map_8h_source.html +++ b/Doc/Doxygen/html/_map_8h_source.html @@ -92,7 +92,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
1 /*
2  * Map.h
3  *
4  * Created on: 07.12.2014
5  * Author: sk
6  */
7 
8 #ifndef MAP_H_
9 #define MAP_H_
10 
11 #include <stdint.h>
12 #include <stdbool.h>
13 #include <avr/pgmspace.h>
14 
15 #define MAP_TEXT_BUF_SIZE 32
16 #define MAP_MAX_TEXT_SIZE (MAP_TEXT_BUF_SIZE - 1)
17 
18 typedef uint8_t MapIdType;
19 typedef const char* MapTextPtrType;
20 
21 const typedef struct {
22  MapIdType Id;
23  const char Text[MAP_TEXT_BUF_SIZE];
24 } MapEntryType;
25 
26 bool MapIdToText(const MapEntryType* MapPtr, uint8_t MapSize, MapIdType Id, char* Text, uint16_t MaxBufferSize);
27 bool MapTextToId(const MapEntryType* MapPtr, uint8_t MapSize, MapTextPtrType Text, MapIdType* IdPtr);
28 void MapToString(const MapEntryType* MapPtr, uint8_t MapSize, char* String, uint16_t MaxBufferSize);
29 
30 #endif /* MAP_H_ */
diff --git a/Doc/Doxygen/html/_memory_8h_source.html b/Doc/Doxygen/html/_memory_8h_source.html index 976b10f..55e674e 100644 --- a/Doc/Doxygen/html/_memory_8h_source.html +++ b/Doc/Doxygen/html/_memory_8h_source.html @@ -89,10 +89,10 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
Memory.h
-
1 /*
2  * Flash.h
3  *
4  * Created on: 20.03.2013
5  * Author: skuser
6  */
7 
8 #ifndef MEMORY_H_
9 #define MEMORY_H_
10 
11 #define MEMORY_SIZE (FLASH_DATA_SIZE) /* From makefile */
12 #define MEMORY_INIT_VALUE 0x00
13 #define MEMORY_SIZE_PER_SETTING 8192
14 
15 #ifndef __ASSEMBLER__
16 #include "Common.h"
17 
18 void MemoryInit(void);
19 void MemoryReadBlock(void* Buffer, uint16_t Address, uint16_t ByteCount);
20 void MemoryWriteBlock(const void* Buffer, uint16_t Address, uint16_t ByteCount);
21 void MemoryClear(void);
22 
23 
24 void MemoryRecall(void);
25 void MemoryStore(void);
26 
27 /* For use with XModem */
28 bool MemoryUploadBlock(void* Buffer, uint32_t BlockAddress, uint16_t ByteCount);
29 bool MemoryDownloadBlock(void* Buffer, uint32_t BlockAddress, uint16_t ByteCount);
30 
31 #endif /* __ASSEMBLER__ */
32 
33 #endif /* MEMORY_H_ */
+
1 /*
2  * Flash.h
3  *
4  * Created on: 20.03.2013
5  * Author: skuser
6  */
7 
8 #ifndef MEMORY_H_
9 #define MEMORY_H_
10 
11 #define MEMORY_SIZE (FLASH_DATA_SIZE) /* From makefile */
12 #define MEMORY_INIT_VALUE 0x00
13 #define MEMORY_SIZE_PER_SETTING 8192
14 
15 #ifndef __ASSEMBLER__
16 #include "Common.h"
17 
18 void MemoryInit(void);
19 void MemoryReadBlock(void* Buffer, uint16_t Address, uint16_t ByteCount);
20 void MemoryWriteBlock(const void* Buffer, uint16_t Address, uint16_t ByteCount);
21 void MemoryClear(void);
22 
23 
24 void MemoryRecall(void);
25 void MemoryStore(void);
26 
27 /* For use with XModem */
28 bool MemoryUploadBlock(void* Buffer, uint32_t BlockAddress, uint16_t ByteCount);
29 bool MemoryDownloadBlock(void* Buffer, uint32_t BlockAddress, uint16_t ByteCount);
30 
31 /* EEPROM functions */
32 uint16_t WriteEEPBlock(uint16_t Address, const void *SrcPtr, uint16_t ByteCount);
33 uint16_t ReadEEPBlock(uint16_t Address, void *DestPtr, uint16_t ByteCount);
34 
35 #endif /* __ASSEMBLER__ */
36 
37 #endif /* MEMORY_H_ */
diff --git a/Doc/Doxygen/html/_mifare_classic_8h_source.html b/Doc/Doxygen/html/_mifare_classic_8h_source.html index 9a0e11a..7b80619 100644 --- a/Doc/Doxygen/html/_mifare_classic_8h_source.html +++ b/Doc/Doxygen/html/_mifare_classic_8h_source.html @@ -92,7 +92,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
1 /*
2  * MifareClassic.h
3  *
4  * Created on: 13.05.2013
5  * Author: skuser
6  */
7 
8 #ifndef MIFARECLASSIC_H_
9 #define MIFARECLASSIC_H_
10 
11 #include "Application.h"
12 #include "ISO14443-3A.h"
13 
14 #define MIFARE_CLASSIC_UID_SIZE ISO14443A_UID_SIZE_SINGLE
15 #define MIFARE_CLASSIC_1K_MEM_SIZE 1024
16 #define MIFARE_CLASSIC_4K_MEM_SIZE 4096
17 
18 void MifareClassicAppInit1K(void);
19 void MifareClassicAppInit1K7B(void);
20 void MifareClassicAppInit4K(void);
21 void MifareClassicAppReset(void);
22 void MifareClassicAppTask(void);
23 
24 uint16_t MifareClassicAppProcess(uint8_t* Buffer, uint16_t BitCount);
25 
26 void MifareClassicGetUid(ConfigurationUidType Uid);
27 void MifareClassicSetUid(ConfigurationUidType Uid);
28 
29 
30 #endif /* MIFARECLASSIC_H_ */
diff --git a/Doc/Doxygen/html/_mifare_ultralight_8h_source.html b/Doc/Doxygen/html/_mifare_ultralight_8h_source.html index 7b5c8ef..3bedf4a 100644 --- a/Doc/Doxygen/html/_mifare_ultralight_8h_source.html +++ b/Doc/Doxygen/html/_mifare_ultralight_8h_source.html @@ -92,7 +92,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
1 /*
2  * MifareUltralight.h
3  *
4  * Created on: 20.03.2013
5  * Author: skuser
6  */
7 
8 #ifndef MIFAREULTRALIGHT_H_
9 #define MIFAREULTRALIGHT_H_
10 
11 #include "Application.h"
12 #include "ISO14443-3A.h"
13 
14 #define MIFARE_ULTRALIGHT_UID_SIZE ISO14443A_UID_SIZE_DOUBLE
15 #define MIFARE_ULTRALIGHT_MEM_SIZE 64
16 
17 void MifareUltralightAppInit(void);
18 void MifareUltralightAppReset(void);
19 void MifareUltralightAppTask(void);
20 
21 uint16_t MifareUltralightAppProcess(uint8_t* Buffer, uint16_t BitCount);
22 
23 void MifareUltralightGetUid(ConfigurationUidType Uid);
24 void MifareUltralightSetUid(ConfigurationUidType Uid);
25 
26 
27 
28 #endif /* MIFAREULTRALIGHT_H_ */
diff --git a/Doc/Doxygen/html/_random_8h_source.html b/Doc/Doxygen/html/_random_8h_source.html index 23a161d..33bd400 100644 --- a/Doc/Doxygen/html/_random_8h_source.html +++ b/Doc/Doxygen/html/_random_8h_source.html @@ -92,7 +92,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
1 /*
2  * Random.h
3  *
4  * Created on: 22.03.2013
5  * Author: skuser
6  */
7 
8 #ifndef RANDOM_H_
9 #define RANDOM_H_
10 
11 #include "Common.h"
12 
13 void RandomInit(void);
14 uint8_t RandomGetByte(void);
15 void RandomGetBuffer(void* Buffer, uint8_t ByteCount);
16 void RandomTick(void);
17 
18 #endif /* RANDOM_H_ */
diff --git a/Doc/Doxygen/html/_reader14443-2_a_8h_source.html b/Doc/Doxygen/html/_reader14443-2_a_8h_source.html index e00a00a..2029b17 100644 --- a/Doc/Doxygen/html/_reader14443-2_a_8h_source.html +++ b/Doc/Doxygen/html/_reader14443-2_a_8h_source.html @@ -92,7 +92,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
1 /*
2  * Reader14443-2A.h
3  *
4  * Created on: 26.08.2014
5  * Author: sk
6  */
7 
8 #ifndef READER14443_2A_H_
9 #define READER14443_2A_H_
10 
11 #include "Codec.h"
12 #include "Terminal/CommandLine.h"
13 
14 /* Codec Interface */
15 void Reader14443ACodecInit(void);
16 void Reader14443ACodecDeInit(void);
17 void Reader14443ACodecTask(void);
18 
19 /* Application Interface */
20 void Reader14443ACodecStart(void);
21 void Reader14443ACodecReset(void);
22 
23 #endif /* READER14443_2A_H_ */
diff --git a/Doc/Doxygen/html/_reader14443_a_8h_source.html b/Doc/Doxygen/html/_reader14443_a_8h_source.html index 4cc6136..f9fcaea 100644 --- a/Doc/Doxygen/html/_reader14443_a_8h_source.html +++ b/Doc/Doxygen/html/_reader14443_a_8h_source.html @@ -89,10 +89,10 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
Reader14443A.h
-
1 #ifndef READER14443A_H
2 #define READER14443A_H
3 
4 #include "Application.h"
5 #include "Codec/Codec.h"
6 
7 #define CRC_INIT 0x6363
8 
9 uint8_t ReaderSendBuffer[CODEC_BUFFER_SIZE];
10 uint16_t ReaderSendBitCount;
11 
12 void Reader14443AAppInit(void);
13 void Reader14443AAppReset(void);
14 void Reader14443AAppTask(void);
15 void Reader14443AAppTick(void);
16 void Reader14443AAppTimeout(void);
17 
18 uint16_t Reader14443AAppProcess(uint8_t* Buffer, uint16_t BitCount);
19 
20 uint16_t addParityBits(uint8_t * Buffer, uint16_t bits);
21 uint16_t removeParityBits(uint8_t * Buffer, uint16_t BitCount);
22 uint16_t removeSOC(uint8_t * Buffer, uint16_t BitCount);
23 bool checkParityBits(uint8_t * Buffer, uint16_t BitCount);
24 uint16_t ISO14443_CRCA(uint8_t * Buffer, uint8_t ByteCount);
25 
26 typedef enum {
27  Reader14443_Do_Nothing,
28  Reader14443_Send,
29  Reader14443_Send_Raw,
30  Reader14443_Get_UID,
31  Reader14443_Read_MF_Ultralight,
32  Reader14443_Indentify
33 } Reader14443Command;
34 
35 
36 #endif //READER14443A_H
+
1 #ifndef READER14443A_H
2 #define READER14443A_H
3 
4 #include "Application.h"
5 #include "Codec/Codec.h"
6 
7 #define CRC_INIT 0x6363
8 
9 uint8_t ReaderSendBuffer[CODEC_BUFFER_SIZE];
10 uint16_t ReaderSendBitCount;
11 
12 void Reader14443AAppInit(void);
13 void Reader14443AAppReset(void);
14 void Reader14443AAppTask(void);
15 void Reader14443AAppTick(void);
16 void Reader14443AAppTimeout(void);
17 
18 uint16_t Reader14443AAppProcess(uint8_t* Buffer, uint16_t BitCount);
19 
20 uint16_t addParityBits(uint8_t * Buffer, uint16_t bits);
21 uint16_t removeParityBits(uint8_t * Buffer, uint16_t BitCount);
22 uint16_t removeSOC(uint8_t * Buffer, uint16_t BitCount);
23 bool checkParityBits(uint8_t * Buffer, uint16_t BitCount);
24 uint16_t ISO14443_CRCA(uint8_t * Buffer, uint8_t ByteCount);
25 
26 typedef enum {
27  Reader14443_Do_Nothing,
28  Reader14443_Send,
29  Reader14443_Send_Raw,
30  Reader14443_Get_UID,
31  Reader14443_Read_MF_Ultralight,
32  Reader14443_Identify
33 } Reader14443Command;
34 
35 
36 #endif //READER14443A_H
diff --git a/Doc/Doxygen/html/_reader_8txt.html b/Doc/Doxygen/html/_reader_8txt.html index 9291b98..103983a 100644 --- a/Doc/Doxygen/html/_reader_8txt.html +++ b/Doc/Doxygen/html/_reader_8txt.html @@ -88,7 +88,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Doc/Doxygen/html/_settings_8h.html b/Doc/Doxygen/html/_settings_8h.html index 9e8a321..a925ea8 100644 --- a/Doc/Doxygen/html/_settings_8h.html +++ b/Doc/Doxygen/html/_settings_8h.html @@ -107,7 +107,7 @@ Classes diff --git a/Doc/Doxygen/html/_settings_8h_source.html b/Doc/Doxygen/html/_settings_8h_source.html index b6dd9ce..352c61f 100644 --- a/Doc/Doxygen/html/_settings_8h_source.html +++ b/Doc/Doxygen/html/_settings_8h_source.html @@ -100,7 +100,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Doc/Doxygen/html/_settings_8txt.html b/Doc/Doxygen/html/_settings_8txt.html index 271130b..f388f09 100644 --- a/Doc/Doxygen/html/_settings_8txt.html +++ b/Doc/Doxygen/html/_settings_8txt.html @@ -88,7 +88,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Doc/Doxygen/html/_system_8h_source.html b/Doc/Doxygen/html/_system_8h_source.html index 4cd4e2c..8bb80b0 100644 --- a/Doc/Doxygen/html/_system_8h_source.html +++ b/Doc/Doxygen/html/_system_8h_source.html @@ -92,7 +92,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
1 /*
2  * System.h
3  *
4  * Created on: 10.02.2013
5  * Author: skuser
6  */
7 
8 #ifndef SYSTEM_H
9 #define SYSTEM_H
10 
11 #include <avr/io.h>
12 #include <avr/pgmspace.h>
13 #include <avr/interrupt.h>
14 #include <stddef.h>
15 #include <stdbool.h>
16 #include "Common.h"
17 
18 #define F_RTC 1000
19 #define SYSTEM_MILLISECONDS_TO_RTC_CYCLES(x) \
20  ( (uint16_t) ( (double) F_RTC * x / 1E3 + 0.5) )
21 
22 #define SYSTEM_TICK_WIDTH 7 /* Bits */
23 #define SYSTEM_TICK_PERIOD (1<<7)
24 #define SYSTEM_TICK_MS (SYSTEM_TICK_PERIOD)
25 #define SYSTEM_TICK_FREQ (1000 / SYSTEM_TICK_PERIOD)
26 
27 #define SYSTEM_SMODE_PSAVE SLEEP_SMODE_PSAVE_gc
28 #define SYSTEM_SMODE_IDLE SLEEP_SMODE_IDLE_gc
29 
30 /* Use GPIORE and GPIORF as global tick register */
31 #define SYSTEM_TICK_REGISTER (*((volatile uint16_t*) &GPIORE))
32 
33 void SystemInit(void);
34 void SystemReset(void);
35 void SystemEnterBootloader(void);
36 void SystemStartUSBClock(void);
37 void SystemStopUSBClock(void);
38 void SystemInterruptInit(void);
39 INLINE bool SystemTick100ms(void);
40 
41 INLINE bool SystemTick100ms(void)
42 {
43  if (RTC.INTFLAGS & RTC_COMPIF_bm) {
44  while(RTC.STATUS & RTC_SYNCBUSY_bm)
45  ;
46 
47  RTC.INTFLAGS = RTC_COMPIF_bm;
48  return true;
49  }
50 
51  return false;
52 }
53 
54 INLINE uint16_t SystemGetSysTick(void) {
55  return SYSTEM_TICK_REGISTER | RTC.CNT;
56 }
57 
58 #endif /* SYSTEM_H */
diff --git a/Doc/Doxygen/html/_terminal_8h_source.html b/Doc/Doxygen/html/_terminal_8h_source.html index 410d0e7..8a80b6f 100644 --- a/Doc/Doxygen/html/_terminal_8h_source.html +++ b/Doc/Doxygen/html/_terminal_8h_source.html @@ -92,7 +92,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
1 /*
2  * CommandLine.h
3  *
4  * Created on: 10.02.2013
5  * Author: skuser
6  */
7 
8 #ifndef TERMINAL_H_
9 #define TERMINAL_H_
10 
11 #include "../Common.h"
12 #include "../LUFA/Drivers/USB/USB.h"
13 #include "XModem.h"
14 #include "CommandLine.h"
15 
16 #define TERMINAL_VBUS_PORT PORTD
17 #define TERMINAL_VBUS_MASK PIN5_bm
18 
19 #define TERMINAL_BUFFER_SIZE 512
20 
21 typedef enum {
22  TERMINAL_UNINITIALIZED,
23  TERMINAL_INITIALIZING,
24  TERMINAL_INITIALIZED,
25  TERMINAL_UNITIALIZING
26 } TerminalStateEnum;
27 
28 extern uint8_t TerminalBuffer[TERMINAL_BUFFER_SIZE];
29 extern USB_ClassInfo_CDC_Device_t TerminalHandle;
30 extern TerminalStateEnum TerminalState;
31 
32 void TerminalInit(void);
33 void TerminalTask(void);
34 void TerminalTick(void);
35 
36 /*void TerminalSendHex(void* Buffer, uint16_t ByteCount);*/
37 INLINE void TerminalSendByte(uint8_t Byte);
38 void TerminalSendBlock(const void* Buffer, uint16_t ByteCount);
39 
40 INLINE void TerminalSendChar(char c);
41 void TerminalSendString(const char* s);
42 void TerminalSendStringP(const char* s);
43 
44 void EVENT_USB_Device_Connect(void);
45 void EVENT_USB_Device_Disconnect(void);
46 void EVENT_USB_Device_ConfigurationChanged(void);
47 void EVENT_USB_Device_ControlRequest(void);
48 
49 INLINE void TerminalSendChar(char c) { CDC_Device_SendByte(&TerminalHandle, c); }
50 INLINE void TerminalSendByte(uint8_t Byte) { CDC_Device_SendByte(&TerminalHandle, Byte); }
51 
52 #endif /* TERMINAL_H_ */
diff --git a/Doc/Doxygen/html/_uploading_downloading_8txt.html b/Doc/Doxygen/html/_uploading_downloading_8txt.html index 5437fd3..171ee7d 100644 --- a/Doc/Doxygen/html/_uploading_downloading_8txt.html +++ b/Doc/Doxygen/html/_uploading_downloading_8txt.html @@ -88,7 +88,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Doc/Doxygen/html/_x_modem_8h_source.html b/Doc/Doxygen/html/_x_modem_8h_source.html index e842fcc..cc67288 100644 --- a/Doc/Doxygen/html/_x_modem_8h_source.html +++ b/Doc/Doxygen/html/_x_modem_8h_source.html @@ -92,7 +92,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
1 /*
2  * TerminalXModem.h
3  *
4  * Created on: 22.03.2013
5  * Author: skuser
6  */
7 
8 #ifndef XMODEM_H_
9 #define XMODEM_H_
10 
11 #include "../Common.h"
12 
13 typedef bool (*XModemCallbackType) (void* ByteBuffer, uint32_t BlockAddress, uint16_t ByteCount);
14 
15 void XModemReceive(XModemCallbackType CallbackFunc);
16 void XModemSend(XModemCallbackType CallbackFunc);
17 
18 bool XModemProcessByte(uint8_t Byte);
19 void XModemTick(void);
20 
21 #endif /* TERMINALXMODEM_H_ */
diff --git a/Doc/Doxygen/html/annotated.html b/Doc/Doxygen/html/annotated.html index 4c07e91..eeb6d83 100644 --- a/Doc/Doxygen/html/annotated.html +++ b/Doc/Doxygen/html/annotated.html @@ -96,7 +96,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Doc/Doxygen/html/classes.html b/Doc/Doxygen/html/classes.html index ae3b87f..f1b8ee8 100644 --- a/Doc/Doxygen/html/classes.html +++ b/Doc/Doxygen/html/classes.html @@ -100,7 +100,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Doc/Doxygen/html/dir_5de29d499bb29a41092979d00d22c134.html b/Doc/Doxygen/html/dir_5de29d499bb29a41092979d00d22c134.html index 7895fe2..bea3890 100644 --- a/Doc/Doxygen/html/dir_5de29d499bb29a41092979d00d22c134.html +++ b/Doc/Doxygen/html/dir_5de29d499bb29a41092979d00d22c134.html @@ -96,7 +96,7 @@ Files diff --git a/Doc/Doxygen/html/dir_74b6a3b63f61c160c0f14b7a283a4c9b.html b/Doc/Doxygen/html/dir_74b6a3b63f61c160c0f14b7a283a4c9b.html index 12d0f91..5b3c09a 100644 --- a/Doc/Doxygen/html/dir_74b6a3b63f61c160c0f14b7a283a4c9b.html +++ b/Doc/Doxygen/html/dir_74b6a3b63f61c160c0f14b7a283a4c9b.html @@ -96,7 +96,7 @@ Directories diff --git a/Doc/Doxygen/html/dir_8465ec698d237f801ae9966d4551fcfa.html b/Doc/Doxygen/html/dir_8465ec698d237f801ae9966d4551fcfa.html index c39a346..ff0ffd1 100644 --- a/Doc/Doxygen/html/dir_8465ec698d237f801ae9966d4551fcfa.html +++ b/Doc/Doxygen/html/dir_8465ec698d237f801ae9966d4551fcfa.html @@ -112,7 +112,7 @@ Files diff --git a/Doc/Doxygen/html/dir_ddeffaa734f77525428b0dd4068da9cb.html b/Doc/Doxygen/html/dir_ddeffaa734f77525428b0dd4068da9cb.html index 83a651c..db63017 100644 --- a/Doc/Doxygen/html/dir_ddeffaa734f77525428b0dd4068da9cb.html +++ b/Doc/Doxygen/html/dir_ddeffaa734f77525428b0dd4068da9cb.html @@ -96,7 +96,7 @@ Files diff --git a/Doc/Doxygen/html/dir_f5aab302412c0352d69464400cc5ee44.html b/Doc/Doxygen/html/dir_f5aab302412c0352d69464400cc5ee44.html index 6992298..937456c 100644 --- a/Doc/Doxygen/html/dir_f5aab302412c0352d69464400cc5ee44.html +++ b/Doc/Doxygen/html/dir_f5aab302412c0352d69464400cc5ee44.html @@ -96,7 +96,7 @@ Files diff --git a/Doc/Doxygen/html/files.html b/Doc/Doxygen/html/files.html index 9b49236..d35688e 100644 --- a/Doc/Doxygen/html/files.html +++ b/Doc/Doxygen/html/files.html @@ -122,7 +122,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Doc/Doxygen/html/functions.html b/Doc/Doxygen/html/functions.html index 3a64e37..263fd3a 100644 --- a/Doc/Doxygen/html/functions.html +++ b/Doc/Doxygen/html/functions.html @@ -147,7 +147,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Doc/Doxygen/html/functions_vars.html b/Doc/Doxygen/html/functions_vars.html index 86e71ad..cf4786b 100644 --- a/Doc/Doxygen/html/functions_vars.html +++ b/Doc/Doxygen/html/functions_vars.html @@ -147,7 +147,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Doc/Doxygen/html/globals.html b/Doc/Doxygen/html/globals.html index 196a5f5..a3fafcc 100644 --- a/Doc/Doxygen/html/globals.html +++ b/Doc/Doxygen/html/globals.html @@ -187,9 +187,15 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • LOG_INFO_CODEC_RX_DATA : Log.h
  • +
  • LOG_INFO_CODEC_RX_DATA_W_PARITY +: Log.h +
  • LOG_INFO_CODEC_TX_DATA : Log.h
  • +
  • LOG_INFO_CODEC_TX_DATA_W_PARITY +: Log.h +
  • LOG_INFO_CONFIG_SET : Log.h
  • @@ -202,6 +208,9 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • LOG_INFO_SETTING_SET : Log.h
  • +
  • LOG_INFO_SYSTEM_BOOT +: Log.h +
  • LOG_INFO_UID_SET : Log.h
  • @@ -226,7 +235,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Doc/Doxygen/html/globals_defs.html b/Doc/Doxygen/html/globals_defs.html index cac60d7..03c4f3d 100644 --- a/Doc/Doxygen/html/globals_defs.html +++ b/Doc/Doxygen/html/globals_defs.html @@ -111,7 +111,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Doc/Doxygen/html/globals_enum.html b/Doc/Doxygen/html/globals_enum.html index e8c1c04..374fe0d 100644 --- a/Doc/Doxygen/html/globals_enum.html +++ b/Doc/Doxygen/html/globals_enum.html @@ -99,7 +99,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Doc/Doxygen/html/globals_eval.html b/Doc/Doxygen/html/globals_eval.html index d1569c4..4ebe646 100644 --- a/Doc/Doxygen/html/globals_eval.html +++ b/Doc/Doxygen/html/globals_eval.html @@ -140,9 +140,15 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • LOG_INFO_CODEC_RX_DATA : Log.h
  • +
  • LOG_INFO_CODEC_RX_DATA_W_PARITY +: Log.h +
  • LOG_INFO_CODEC_TX_DATA : Log.h
  • +
  • LOG_INFO_CODEC_TX_DATA_W_PARITY +: Log.h +
  • LOG_INFO_CONFIG_SET : Log.h
  • @@ -155,6 +161,9 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • LOG_INFO_SETTING_SET : Log.h
  • +
  • LOG_INFO_SYSTEM_BOOT +: Log.h +
  • LOG_INFO_UID_SET : Log.h
  • @@ -162,7 +171,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Doc/Doxygen/html/globals_func.html b/Doc/Doxygen/html/globals_func.html index 4680408..5168afc 100644 --- a/Doc/Doxygen/html/globals_func.html +++ b/Doc/Doxygen/html/globals_func.html @@ -100,7 +100,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Doc/Doxygen/html/globals_vars.html b/Doc/Doxygen/html/globals_vars.html index 4b75b47..faeb201 100644 --- a/Doc/Doxygen/html/globals_vars.html +++ b/Doc/Doxygen/html/globals_vars.html @@ -111,7 +111,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Doc/Doxygen/html/index.html b/Doc/Doxygen/html/index.html index 0970067..9edc4ad 100644 --- a/Doc/Doxygen/html/index.html +++ b/Doc/Doxygen/html/index.html @@ -97,7 +97,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Doc/Doxygen/html/pages.html b/Doc/Doxygen/html/pages.html index 2a19cee..974f3f8 100644 --- a/Doc/Doxygen/html/pages.html +++ b/Doc/Doxygen/html/pages.html @@ -87,7 +87,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Doc/Doxygen/html/search/all_6.js b/Doc/Doxygen/html/search/all_6.js index 0256000..f4a8eca 100644 --- a/Doc/Doxygen/html/search/all_6.js +++ b/Doc/Doxygen/html/search/all_6.js @@ -23,11 +23,14 @@ var searchData= ['log_5finfo_5fapp_5fcmd_5funknown',['LOG_INFO_APP_CMD_UNKNOWN',['../_log_8h.html#a34112fbd78128ae58dc7801690dfa6e0a51365dd939423069d8fe2c09f51c805b',1,'Log.h']]], ['log_5finfo_5fapp_5fcmd_5fwrite',['LOG_INFO_APP_CMD_WRITE',['../_log_8h.html#a34112fbd78128ae58dc7801690dfa6e0abb646871507173fe4978b1342f238b7c',1,'Log.h']]], ['log_5finfo_5fcodec_5frx_5fdata',['LOG_INFO_CODEC_RX_DATA',['../_log_8h.html#a34112fbd78128ae58dc7801690dfa6e0a3b67fcd03ff3cc80231df3b7d9211380',1,'Log.h']]], + ['log_5finfo_5fcodec_5frx_5fdata_5fw_5fparity',['LOG_INFO_CODEC_RX_DATA_W_PARITY',['../_log_8h.html#a34112fbd78128ae58dc7801690dfa6e0a84aebf39984089d411b7e12158cfbcfd',1,'Log.h']]], ['log_5finfo_5fcodec_5ftx_5fdata',['LOG_INFO_CODEC_TX_DATA',['../_log_8h.html#a34112fbd78128ae58dc7801690dfa6e0a40884a5af2a5bfa73ab4824a3adc71af',1,'Log.h']]], + ['log_5finfo_5fcodec_5ftx_5fdata_5fw_5fparity',['LOG_INFO_CODEC_TX_DATA_W_PARITY',['../_log_8h.html#a34112fbd78128ae58dc7801690dfa6e0abbff6497a47c84b599fbf5f40e2e891e',1,'Log.h']]], ['log_5finfo_5fconfig_5fset',['LOG_INFO_CONFIG_SET',['../_log_8h.html#a34112fbd78128ae58dc7801690dfa6e0a837ae1da35dbdeb2cc1d8b7c22a0025d',1,'Log.h']]], ['log_5finfo_5fgeneric',['LOG_INFO_GENERIC',['../_log_8h.html#a34112fbd78128ae58dc7801690dfa6e0a0c156342f0056e472b5ac1ff48aa41fb',1,'Log.h']]], ['log_5finfo_5freset_5fapp',['LOG_INFO_RESET_APP',['../_log_8h.html#a34112fbd78128ae58dc7801690dfa6e0a27bb078ecb411f03d2a81fb68d2644c8',1,'Log.h']]], ['log_5finfo_5fsetting_5fset',['LOG_INFO_SETTING_SET',['../_log_8h.html#a34112fbd78128ae58dc7801690dfa6e0a1e360efb165c04ce7282511f80337483',1,'Log.h']]], + ['log_5finfo_5fsystem_5fboot',['LOG_INFO_SYSTEM_BOOT',['../_log_8h.html#a34112fbd78128ae58dc7801690dfa6e0af5b5f1a9a7e2d733e4958427da66985f',1,'Log.h']]], ['log_5finfo_5fuid_5fset',['LOG_INFO_UID_SET',['../_log_8h.html#a34112fbd78128ae58dc7801690dfa6e0a54d679e676c487407959422049e43956',1,'Log.h']]], ['logentryenum',['LogEntryEnum',['../_log_8h.html#a34112fbd78128ae58dc7801690dfa6e0',1,'Log.h']]], ['logmode',['LogMode',['../struct_settings_entry_type.html#a2de0f2e5da183f58d0a46c69e530905f',1,'SettingsEntryType']]], diff --git a/Doc/Doxygen/html/search/enumvalues_0.js b/Doc/Doxygen/html/search/enumvalues_0.js index ec09559..0bba871 100644 --- a/Doc/Doxygen/html/search/enumvalues_0.js +++ b/Doc/Doxygen/html/search/enumvalues_0.js @@ -16,10 +16,13 @@ var searchData= ['log_5finfo_5fapp_5fcmd_5funknown',['LOG_INFO_APP_CMD_UNKNOWN',['../_log_8h.html#a34112fbd78128ae58dc7801690dfa6e0a51365dd939423069d8fe2c09f51c805b',1,'Log.h']]], ['log_5finfo_5fapp_5fcmd_5fwrite',['LOG_INFO_APP_CMD_WRITE',['../_log_8h.html#a34112fbd78128ae58dc7801690dfa6e0abb646871507173fe4978b1342f238b7c',1,'Log.h']]], ['log_5finfo_5fcodec_5frx_5fdata',['LOG_INFO_CODEC_RX_DATA',['../_log_8h.html#a34112fbd78128ae58dc7801690dfa6e0a3b67fcd03ff3cc80231df3b7d9211380',1,'Log.h']]], + ['log_5finfo_5fcodec_5frx_5fdata_5fw_5fparity',['LOG_INFO_CODEC_RX_DATA_W_PARITY',['../_log_8h.html#a34112fbd78128ae58dc7801690dfa6e0a84aebf39984089d411b7e12158cfbcfd',1,'Log.h']]], ['log_5finfo_5fcodec_5ftx_5fdata',['LOG_INFO_CODEC_TX_DATA',['../_log_8h.html#a34112fbd78128ae58dc7801690dfa6e0a40884a5af2a5bfa73ab4824a3adc71af',1,'Log.h']]], + ['log_5finfo_5fcodec_5ftx_5fdata_5fw_5fparity',['LOG_INFO_CODEC_TX_DATA_W_PARITY',['../_log_8h.html#a34112fbd78128ae58dc7801690dfa6e0abbff6497a47c84b599fbf5f40e2e891e',1,'Log.h']]], ['log_5finfo_5fconfig_5fset',['LOG_INFO_CONFIG_SET',['../_log_8h.html#a34112fbd78128ae58dc7801690dfa6e0a837ae1da35dbdeb2cc1d8b7c22a0025d',1,'Log.h']]], ['log_5finfo_5fgeneric',['LOG_INFO_GENERIC',['../_log_8h.html#a34112fbd78128ae58dc7801690dfa6e0a0c156342f0056e472b5ac1ff48aa41fb',1,'Log.h']]], ['log_5finfo_5freset_5fapp',['LOG_INFO_RESET_APP',['../_log_8h.html#a34112fbd78128ae58dc7801690dfa6e0a27bb078ecb411f03d2a81fb68d2644c8',1,'Log.h']]], ['log_5finfo_5fsetting_5fset',['LOG_INFO_SETTING_SET',['../_log_8h.html#a34112fbd78128ae58dc7801690dfa6e0a1e360efb165c04ce7282511f80337483',1,'Log.h']]], + ['log_5finfo_5fsystem_5fboot',['LOG_INFO_SYSTEM_BOOT',['../_log_8h.html#a34112fbd78128ae58dc7801690dfa6e0af5b5f1a9a7e2d733e4958427da66985f',1,'Log.h']]], ['log_5finfo_5fuid_5fset',['LOG_INFO_UID_SET',['../_log_8h.html#a34112fbd78128ae58dc7801690dfa6e0a54d679e676c487407959422049e43956',1,'Log.h']]] ]; diff --git a/Doc/Doxygen/html/struct_configuration_type-members.html b/Doc/Doxygen/html/struct_configuration_type-members.html index 6156de3..ec16e51 100644 --- a/Doc/Doxygen/html/struct_configuration_type-members.html +++ b/Doc/Doxygen/html/struct_configuration_type-members.html @@ -105,7 +105,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Doc/Doxygen/html/struct_configuration_type.html b/Doc/Doxygen/html/struct_configuration_type.html index 2502a63..3efff71 100644 --- a/Doc/Doxygen/html/struct_configuration_type.html +++ b/Doc/Doxygen/html/struct_configuration_type.html @@ -322,7 +322,7 @@ Public Attributes diff --git a/Doc/Doxygen/html/struct_settings_entry_type-members.html b/Doc/Doxygen/html/struct_settings_entry_type-members.html index 308b6e7..0455914 100644 --- a/Doc/Doxygen/html/struct_settings_entry_type-members.html +++ b/Doc/Doxygen/html/struct_settings_entry_type-members.html @@ -97,7 +97,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Doc/Doxygen/html/struct_settings_entry_type.html b/Doc/Doxygen/html/struct_settings_entry_type.html index d086fe7..d0279ff 100644 --- a/Doc/Doxygen/html/struct_settings_entry_type.html +++ b/Doc/Doxygen/html/struct_settings_entry_type.html @@ -121,7 +121,7 @@ uint16_t  diff --git a/Doc/Doxygen/html/struct_u_s_b___descriptor___configuration__t-members.html b/Doc/Doxygen/html/struct_u_s_b___descriptor___configuration__t-members.html index 5bbd4ee..4a88225 100644 --- a/Doc/Doxygen/html/struct_u_s_b___descriptor___configuration__t-members.html +++ b/Doc/Doxygen/html/struct_u_s_b___descriptor___configuration__t-members.html @@ -92,7 +92,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Doc/Doxygen/html/struct_u_s_b___descriptor___configuration__t.html b/Doc/Doxygen/html/struct_u_s_b___descriptor___configuration__t.html index 0ed18c0..ea6577d 100644 --- a/Doc/Doxygen/html/struct_u_s_b___descriptor___configuration__t.html +++ b/Doc/Doxygen/html/struct_u_s_b___descriptor___configuration__t.html @@ -95,7 +95,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); From 136920bcdd856371e54ad039f52f3a72c25bbb71 Mon Sep 17 00:00:00 2001 From: TNEd Date: Tue, 6 Jun 2017 12:02:17 +0200 Subject: [PATCH 011/104] 4K fixes for authentication --- .../Application/MifareClassic.c | 566 ++++++++++-------- 1 file changed, 304 insertions(+), 262 deletions(-) diff --git a/Firmware/Chameleon-Mini/Application/MifareClassic.c b/Firmware/Chameleon-Mini/Application/MifareClassic.c index e843b30..61867c7 100644 --- a/Firmware/Chameleon-Mini/Application/MifareClassic.c +++ b/Firmware/Chameleon-Mini/Application/MifareClassic.c @@ -33,6 +33,7 @@ #define MEM_KEY_SIZE 6 /* Bytes */ #define MEM_ACC_GPB_SIZE 4 /* Bytes */ #define MEM_SECTOR_ADDR_MASK 0xFC +#define MEM_BIGSECTOR_ADDR_MASK 0xF0 #define MEM_BYTES_PER_BLOCK 16 /* Bytes */ #define MEM_VALUE_SIZE 4 /* Bytes */ @@ -302,12 +303,24 @@ INLINE uint8_t GetAccessCondition(uint8_t Block) /* Check */ if ( ((InvSAcc0 ^ Acc1) & 0xf0) || /* C1x */ ((InvSAcc0 ^ Acc2) & 0x0f) || /* C2x */ - ((InvSAcc1 ^ Acc2) & 0xf0) || /* C1x */ - ((InvSAcc1 ^ Acc0) & 0x0f)) /* C3x */ + ((InvSAcc1 ^ Acc2) & 0xf0)) /* C3x */ { return(NO_ACCESS); } - Block &= 3; + /* Fix for MFClassic 4K cards */ + if(Block<128) + Block &= 3; + else { + Block &= 15; + if (Block& 15) + Block=3; + else if (Block<=4) + Block=0; + else if (Block<=9) + Block=1; + else + Block=2; + } Acc0 = ~Acc0; /* C1x Bits to bit 0..3 */ Acc1 = Acc2; /* C2x Bits to bit 0..3 */ @@ -376,7 +389,24 @@ void MifareClassicAppInit1K(void) FromHalt = false; } +void MifareClassicAppInit1K7B(void) +{ + State = STATE_IDLE; + CardATQAValue = MFCLASSIC_1K_7B_ATQA_VALUE; + CardSAKValue = MFCLASSIC_1K_SAK_VALUE; + FromHalt = false; +} + + void MifareClassicAppInit4K(void) +{ + State = STATE_IDLE; + CardATQAValue = MFCLASSIC_4K_ATQA_VALUE; + CardSAKValue = MFCLASSIC_4K_SAK_VALUE; + FromHalt = false; +} + +void MifareClassicAppInit4K7B(void) { State = STATE_IDLE; CardATQAValue = MFCLASSIC_4K_7B_ATQA_VALUE; @@ -573,77 +603,77 @@ uint16_t MifareClassicAppProcess(uint8_t* Buffer, uint16_t BitCount) return ACK_NAK_FRAME_SIZE; } } else if ( (Buffer[0] == CMD_AUTH_A) || (Buffer[0] == CMD_AUTH_B)) { - if (ISO14443ACheckCRCA(Buffer, CMD_AUTH_FRAME_SIZE)) { + if (ISO14443ACheckCRCA(Buffer, CMD_AUTH_FRAME_SIZE)) { - uint16_t SectorAddress = Buffer[1] & MEM_SECTOR_ADDR_MASK; - uint16_t KeyOffset = (Buffer[0] == CMD_AUTH_A ? MEM_KEY_A_OFFSET : MEM_KEY_B_OFFSET); - uint16_t SectorStartAddress = (uint16_t)SectorAddress * MEM_BYTES_PER_BLOCK; - uint8_t Key[6]; - uint8_t Uid[4]; - uint8_t CardNonce[4]; + //uint16_t SectorAddress = Buffer[1] & MEM_SECTOR_ADDR_MASK; + uint16_t KeyOffset = (Buffer[0] == CMD_AUTH_A ? MEM_KEY_A_OFFSET : MEM_KEY_B_OFFSET); + uint16_t AccessOffset = MEM_KEY_A_OFFSET + MEM_KEY_SIZE; + uint16_t SectorStartAddress; + uint8_t Key[6]; + uint8_t Uid[4]; + uint8_t CardNonce[8]; - /* Fix for MFClassic 4k cards */ - if(Buffer[1] >= 128) - { - SectorStartAddress += MEM_KEY_BIGSECTOR_OFFSET; - } + /* Fix for MFClassic 4k cards */ + if(Buffer[1] >= 128) { + SectorStartAddress = (Buffer[1] & MEM_BIGSECTOR_ADDR_MASK) * MEM_BYTES_PER_BLOCK ; + KeyOffset += MEM_KEY_BIGSECTOR_OFFSET; + AccessOffset += MEM_KEY_BIGSECTOR_OFFSET; + } else { + SectorStartAddress = (Buffer[1] & MEM_SECTOR_ADDR_MASK) * MEM_BYTES_PER_BLOCK ; + } - LogEntry(LOG_INFO_APP_CMD_AUTH, Buffer, 2); + LogEntry(LOG_INFO_APP_CMD_AUTH, Buffer, 2); + /* set KeyInUse for global use to keep info about authentication */ + KeyInUse = Buffer[0] & 1; + CurrentAddress = SectorStartAddress / MEM_BYTES_PER_BLOCK; + //if (!AccessConditions[MEM_ACC_GPB_SIZE-1] ||(CurrentAddress != AccessAddress)) { + /* Get access conditions from the sector trailor */ + MemoryReadBlock(AccessConditions, SectorStartAddress + AccessOffset, MEM_ACC_GPB_SIZE); + AccessAddress = CurrentAddress; + //} - KeyInUse = Buffer[0] & 1; - CurrentAddress = Buffer[1] & MEM_SECTOR_ADDR_MASK; - if (!AccessConditions[MEM_ACC_GPB_SIZE-1] ||(CurrentAddress != AccessAddress)) { - /* Get access conditions from the sector trailor */ - MemoryReadBlock(AccessConditions, SectorStartAddress + MEM_KEY_A_OFFSET + MEM_KEY_SIZE, MEM_ACC_GPB_SIZE); - AccessAddress = CurrentAddress; - } - /* Generate a random nonce and read UID and key from memory */ - RandomGetBuffer(CardNonce, sizeof(CardNonce)); - if (ActiveConfiguration.UidSize == 7) - MemoryReadBlock(Uid, MEM_UID_CL2_ADDRESS, MEM_UID_CL2_SIZE); - else - MemoryReadBlock(Uid, MEM_UID_CL1_ADDRESS, MEM_UID_CL1_SIZE); + /* Generate a random nonce and read UID and key from memory */ + RandomGetBuffer(CardNonce, sizeof(CardNonce)); + if (ActiveConfiguration.UidSize == 7) + MemoryReadBlock(Uid, MEM_UID_CL2_ADDRESS, MEM_UID_CL2_SIZE); + else + MemoryReadBlock(Uid, MEM_UID_CL1_ADDRESS, MEM_UID_CL1_SIZE); + MemoryReadBlock(Key, SectorStartAddress + KeyOffset, MEM_KEY_SIZE); - MemoryReadBlock(Key, SectorStartAddress + KeyOffset, MEM_KEY_SIZE); + /* Precalculate the reader response from card-nonce */ + for (uint8_t i=0; i= 128) - { - SectorStartAddress += MEM_KEY_BIGSECTOR_OFFSET; - } + return ACK_NAK_FRAME_SIZE; + } else if ( (Buffer[0] == CMD_AUTH_A) || (Buffer[0] == CMD_AUTH_B) ) { + if (ISO14443ACheckCRCA(Buffer, CMD_AUTH_FRAME_SIZE)) + { + /* Nested authentication. */ + //uint16_t SectorAddress = Buffer[1] & MEM_SECTOR_ADDR_MASK; + uint16_t KeyOffset = (Buffer[0] == CMD_AUTH_A ? MEM_KEY_A_OFFSET : MEM_KEY_B_OFFSET); + uint16_t AccOffset = MEM_KEY_A_OFFSET + MEM_KEY_SIZE; + uint16_t SectorStartAddress; + uint8_t Key[6]; + uint8_t Uid[4]; + uint8_t CardNonce[8]; - LogEntry(LOG_INFO_APP_CMD_AUTH, Buffer, 2); + /* Fix for MFClassic 4k cards */ + if(Buffer[1] >= 128) { + SectorStartAddress = (Buffer[1] & MEM_BIGSECTOR_ADDR_MASK) * MEM_BYTES_PER_BLOCK ; + KeyOffset += MEM_KEY_BIGSECTOR_OFFSET; + AccOffset += MEM_KEY_BIGSECTOR_OFFSET; + } else { + SectorStartAddress = (Buffer[1] & MEM_SECTOR_ADDR_MASK) * MEM_BYTES_PER_BLOCK ; + } - KeyInUse = Buffer[0] & 1; - CurrentAddress = Buffer[1] & MEM_SECTOR_ADDR_MASK; - if (CurrentAddress != AccessAddress) { - /* Get access conditions from the sector trailor */ - MemoryReadBlock(AccessConditions, SectorStartAddress + MEM_KEY_A_OFFSET + MEM_KEY_SIZE, MEM_ACC_GPB_SIZE); - AccessAddress = CurrentAddress; - } + LogEntry(LOG_INFO_APP_CMD_AUTH, Buffer, 2); + /* set KeyInUse for global use to keep info about authentication */ + KeyInUse = Buffer[0] & 1; + CurrentAddress = SectorStartAddress / MEM_BYTES_PER_BLOCK; + if (CurrentAddress != AccessAddress) { + /* Get access conditions from the sector trailor */ + MemoryReadBlock(AccessConditions, SectorStartAddress + AccOffset, MEM_ACC_GPB_SIZE); + AccessAddress = CurrentAddress; + } - /* Generate a random nonce and read UID and key from memory */ - RandomGetBuffer(CardNonce, sizeof(CardNonce)); - if (ActiveConfiguration.UidSize == 7) - MemoryReadBlock(Uid, MEM_UID_CL2_ADDRESS, MEM_UID_CL2_SIZE); - else - MemoryReadBlock(Uid, MEM_UID_CL1_ADDRESS, MEM_UID_CL1_SIZE); - MemoryReadBlock(Key, SectorStartAddress + KeyOffset, MEM_KEY_SIZE); + /* Generate a random nonce and read UID and key from memory */ + RandomGetBuffer(CardNonce, sizeof(CardNonce)); + if (ActiveConfiguration.UidSize == 7) + MemoryReadBlock(Uid, MEM_UID_CL2_ADDRESS, MEM_UID_CL2_SIZE); + else + MemoryReadBlock(Uid, MEM_UID_CL1_ADDRESS, MEM_UID_CL1_SIZE); + MemoryReadBlock(Key, SectorStartAddress + KeyOffset, MEM_KEY_SIZE); - /* Precalculate the reader response from card-nonce */ - for (uint8_t i=0; i Date: Tue, 6 Jun 2017 12:59:59 +0200 Subject: [PATCH 012/104] remove partial auth --- Firmware/Chameleon-Mini/Application/MifareClassic.c | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/Firmware/Chameleon-Mini/Application/MifareClassic.c b/Firmware/Chameleon-Mini/Application/MifareClassic.c index 61867c7..548c921 100644 --- a/Firmware/Chameleon-Mini/Application/MifareClassic.c +++ b/Firmware/Chameleon-Mini/Application/MifareClassic.c @@ -714,13 +714,7 @@ uint16_t MifareClassicAppProcess(uint8_t* Buffer, uint16_t BitCount) /* Reader delivers an encrypted nonce. We use it * to setup the crypto1 LFSR in nonlinear feedback mode. * Furthermore it delivers an encrypted answer. Decrypt and check it */ - LogEntry(LOG_INFO_APP_CMD_AUTH,&BitCount,1); - /* Fix for quick nested authing no Reader Nonce */ - uint8_t start = 4; - if (BitCount<64) - start = 0; - else - Crypto1Auth(&Buffer[0]); + Crypto1Auth(&Buffer[0]); Crypto1ByteArray(&Buffer[start], 4); From e579bfb46970f334bed64d61e4d90c3de6f508bf Mon Sep 17 00:00:00 2001 From: TNEd Date: Tue, 6 Jun 2017 13:15:12 +0200 Subject: [PATCH 013/104] remove partial auth all --- Firmware/Chameleon-Mini/Application/MifareClassic.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Firmware/Chameleon-Mini/Application/MifareClassic.c b/Firmware/Chameleon-Mini/Application/MifareClassic.c index 548c921..b0e7df0 100644 --- a/Firmware/Chameleon-Mini/Application/MifareClassic.c +++ b/Firmware/Chameleon-Mini/Application/MifareClassic.c @@ -716,14 +716,14 @@ uint16_t MifareClassicAppProcess(uint8_t* Buffer, uint16_t BitCount) * Furthermore it delivers an encrypted answer. Decrypt and check it */ Crypto1Auth(&Buffer[0]); - Crypto1ByteArray(&Buffer[start], 4); + Crypto1ByteArray(&Buffer[4], 4); LogEntry(LOG_INFO_APP_AUTHING, &Buffer[start], 4); - if ((Buffer[start] == ReaderResponse[0]) && - (Buffer[start+1] == ReaderResponse[1]) && - (Buffer[start+2] == ReaderResponse[2]) && - (Buffer[start+3] == ReaderResponse[3])) { + if ((Buffer[4] == ReaderResponse[0]) && + (Buffer[5] == ReaderResponse[1]) && + (Buffer[6] == ReaderResponse[2]) && + (Buffer[7] == ReaderResponse[3])) { /* Reader is authenticated. Encrypt the precalculated card response * and generate the parity bits. */ From 2b127e4d3255df6f3e6ab7123d94a8e950ea66f9 Mon Sep 17 00:00:00 2001 From: TNEd Date: Tue, 6 Jun 2017 13:18:31 +0200 Subject: [PATCH 014/104] remove partial auth all2 --- Firmware/Chameleon-Mini/Application/MifareClassic.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Firmware/Chameleon-Mini/Application/MifareClassic.c b/Firmware/Chameleon-Mini/Application/MifareClassic.c index b0e7df0..aa071ac 100644 --- a/Firmware/Chameleon-Mini/Application/MifareClassic.c +++ b/Firmware/Chameleon-Mini/Application/MifareClassic.c @@ -718,7 +718,7 @@ uint16_t MifareClassicAppProcess(uint8_t* Buffer, uint16_t BitCount) Crypto1ByteArray(&Buffer[4], 4); - LogEntry(LOG_INFO_APP_AUTHING, &Buffer[start], 4); + LogEntry(LOG_INFO_APP_AUTHING, &Buffer[4], 4); if ((Buffer[4] == ReaderResponse[0]) && (Buffer[5] == ReaderResponse[1]) && From 2a2e0745d120f400af3140fbb1e2909346dbb160 Mon Sep 17 00:00:00 2001 From: Georg Date: Wed, 14 Jun 2017 12:22:39 +0200 Subject: [PATCH 015/104] added auto-alignment for PCD->PICC commands --- Firmware/Chameleon-Mini/Codec/ISO14443-2A.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Firmware/Chameleon-Mini/Codec/ISO14443-2A.c b/Firmware/Chameleon-Mini/Codec/ISO14443-2A.c index 22c19f1..7c621d5 100644 --- a/Firmware/Chameleon-Mini/Codec/ISO14443-2A.c +++ b/Firmware/Chameleon-Mini/Codec/ISO14443-2A.c @@ -217,7 +217,7 @@ ISR(CODEC_TIMER_SAMPLING_CCA_VECT) { * modulation pauses by using the RESTART event. * This can be understood as a "poor mans PLL" and makes sure that we are * never too far out the bit-grid while sampling. */ - //CODEC_TIMER_SAMPLING.CTRLD = TC_EVACT_RESTART_gc | CODEC_TIMER_MODSTART_EVSEL; + CODEC_TIMER_SAMPLING.CTRLD = TC_EVACT_RESTART_gc | CODEC_TIMER_MODSTART_EVSEL; } ISR(CODEC_TIMER_LOADMOD_OVF_VECT) { From 0e61d2a47ac710591dbcb0e85c7f1632d7068903 Mon Sep 17 00:00:00 2001 From: Georg Date: Wed, 14 Jun 2017 12:31:34 +0200 Subject: [PATCH 016/104] updated LATEST firmware --- .../Chameleon-Mini/Latest/Chameleon-Mini.eep | 2 +- .../Chameleon-Mini/Latest/Chameleon-Mini.hex | 3870 +++++++++-------- 2 files changed, 2155 insertions(+), 1717 deletions(-) diff --git a/Firmware/Chameleon-Mini/Latest/Chameleon-Mini.eep b/Firmware/Chameleon-Mini/Latest/Chameleon-Mini.eep index 94e9de2..7a69861 100644 --- a/Firmware/Chameleon-Mini/Latest/Chameleon-Mini.eep +++ b/Firmware/Chameleon-Mini/Latest/Chameleon-Mini.eep @@ -1,4 +1,4 @@ -:1000000000005E2B06060808000004010A00060630 +:100000000000642E06060808000004010A00060627 :100010000808000004010A000606080800000401A0 :100020000A0006060808000004010A00060608087F :10003000000004010A0006060808000004010A0086 diff --git a/Firmware/Chameleon-Mini/Latest/Chameleon-Mini.hex b/Firmware/Chameleon-Mini/Latest/Chameleon-Mini.hex index c7902df..d53bb0d 100644 --- a/Firmware/Chameleon-Mini/Latest/Chameleon-Mini.hex +++ b/Firmware/Chameleon-Mini/Latest/Chameleon-Mini.hex @@ -9,17 +9,17 @@ :100080000C94330B0C94330B0C9495220C94330B7F :100090000C94330B0C94330B0C94330B0C94330BE8 :1000A0000C94330B0C94330B0C94330B0C94330BD8 -:1000B0000C94330B0C94330B0C94330B0C94622381 -:1000C0000C94330B0C9424270C94330B0C94330BAB +:1000B0000C94330B0C94330B0C94330B0C9465237E +:1000C0000C94330B0C9427270C94330B0C94330BA8 :1000D0000C94330B0C94330B0C94330B0C94330BA8 :1000E0000C94330B0C94330B0C94330B0C94330B98 :1000F0000C94330B0C94330B0C94330B0C94330B88 :100100000C94330B0C94330B0C94330B0C94330B77 -:100110000C94330B0C94FF260C94330B0C94330B80 +:100110000C94330B0C9402270C94330B0C94330B7C :100120000C94330B0C94330B0C94330B0C94330B57 :100130000C94330B0C94330B0C94330B0C94CD2296 -:100140000C94CA250C94330B0C94330B0C94330B86 -:100150000C94330B0C9494260C94330B0C94330BAB +:100140000C94CD250C94330B0C94330B0C94330B83 +:100150000C94330B0C9497260C94330B0C94330BA8 :100160000C94330B0C94330B0C94330B0C94330B17 :100170000C94330B0C94330B0C94330B0C94330B07 :100180000C94330B0C94330B0C94330B0C94330BF7 @@ -29,7 +29,7 @@ :1001C0000C94330B0C94330B0C94330B0C94330BB7 :1001D0000C94330B0C94330B0C94330B0C94330BA7 :1001E0000C94330B0C94330B0C94330B0C94330B97 -:1001F0000C94330B0C94ED430C94330B1E0343000F +:1001F0000C94330B0C941B500C94330B1E034300D4 :10020000680061006D0065006C0065006F006E00A5 :100210002D004D0069006E00690000002A034B00AC :10022000610073007000650072002000260020004D @@ -41,17 +41,17 @@ :10028000100005070583021000051201100102008D :100290000008D016B20401000102DC010C0D0D0DA6 :1002A0000E0D0F0D100D110D120D130D160D170D56 -:1002B0000000000123248F24AE24CF29D529D92979 -:1002C000120DDA29992BAC2B4000070023248F2430 -:1002D000AE24EC2B192C1D2C120D1E2CFC321833C5 -:1002E0000004040023248F24AE24FB2B192C1D2C86 -:1002F000120D1E2CFC3218330004070023248F2417 -:10030000AE240A2C192C1D2C120D1E2CFC32183375 -:100310000010040023248F24AE240A2C192C1D2C39 -:10032000120D1E2CFC3218330010070023248F24DA -:10033000AE240F0D100D110D120D130D160D170D0E -:10034000000000013F25B825F727403643365036D8 -:1003500051367636160D170D00000000004E4F4E38 +:1002B0000000000126249224B124D229D829DC2967 +:1002C000120DDD299D2BB02B40000700262492241F +:1002D000B124F02B1D2C212C120D222C0C33283391 +:1002E0000004040026249224B124FF2B1D2C212C71 +:1002F000120D222C0C3328330004070026249224EC +:10030000B1240E2C1D2C212C120D222C0C33283341 +:100310000010040026249224B1240E2C1D2C212C24 +:10032000120D222C0C3328330010070026249224AF +:10033000B1240F0D100D110D120D130D160D170D0B +:10034000000000014225BB25FA276E4271427E4221 +:100350007F42A442160D170D00000000004E4F4EC4 :100360004500000000000000000000000000000048 :1003700000000000000000000000000000014D46E9 :100380005F554C5452414C4947485400000000000E @@ -176,8 +176,8 @@ :100AF0007470733A2F2F6769746875622E636F6D17 :100B00002F656D7365632F4368616D656C656F6EEE :100B10004D696E6920636F6D6D69742025530031D6 -:100B200037303430350031353131313500342E39FC -:100B30002E320066363832366333000D0A000D0A55 +:100B200037303631340031353131313500342E39FA +:100B30002E320032613265303734000D0A000D0A62 :100B4000000D0A000D0A000D0A000D0A0064313084 :100B5000303A4F4B00000000000000000000000091 :100B600000000000000000000000000000006531EF @@ -353,10 +353,10 @@ :101600000000000000000000000000000000006377 :1016100064696E6F70737578585B000011241FBE8B :10162000CFEFCDBFDFE3DEBF00E00CBF18BE19BEB9 -:101630001ABE1BBE11E2A0E0B0E2E8E7FBE900E061 +:101630001ABE1BBE14E2A0E0B0E2E4EDF3EB00E062 :101640000BBF02C007900D92A238B107D9F71BBE9D -:1016500022E3A2E8B1E201C01D92AB33B207E1F789 -:101660003BD00C94BA4D25C13BB78BBFFB01879192 +:1016500025E3A2E8B4E201C01D92A134B207E1F78C +:101660003BD00C94E85925C13BB78BBFFB01879158 :1016700096913BBF08953BB78BBFCB0142E20D94DF :10168000F00F3BB70B0143E20D94F00F3BB78BBF5C :10169000CB0145E20D94F00F3BB746E208C0209124 @@ -382,11 +382,11 @@ :1017D0002002D09321020E94D51419D1D2E0C1E198 :1017E0008091030481FF25C08091010480FDFCCF1E :1017F000D0930304B8D10E9469181AD70E94081622 -:101800000E949016E0914D2BF0914E2B19950E945D -:101810002A210E94D417E0915C2BF0915D2B8781E7 -:10182000813011F4C0938B298681813011F4C093EB -:101830008A290E943B18BAD7E0914B2BF0914C2B90 -:101840001995E091452BF091462B1995C9CF292F79 +:101800000E949016E091532EF091542E19950E944B +:101810002A210E94D417E091622EF091632E8781D5 +:10182000813011F4C0938B2C8681813011F4C093E8 +:101830008A2C0E943B18BAD7E091512EF091522E7B +:101840001995E0914B2EF0914C2E1995C9CF292F67 :1018500033272230310559F02330310569F021302A :101860003105F9F482E190E02AE832E01EC08EE30F :1018700090E02CE432E019C099278130910541F0C5 @@ -417,27 +417,27 @@ :101A00008083E0E5F0E080818D7F8083089587E02A :101A10008093A200789408950895089508950895F4 :101A200008950895089580E090E008950895089538 -:101A30000F931F93CF93DF931F92CDB7DEB701E4CF -:101A40001BE2D8011296ED91FC91139789831995A9 -:101A50000E946221E0915C2BF0915D2B898185834E +:101A30000F931F93CF93DF931F92CDB7DEB707E4C9 +:101A40001EE2D8011296ED91FC91139789831995A6 +:101A50000E946221E091622EF091632E898185833C :101A6000B8E18B9FB001112464567D4F48E150E0EE -:101A7000C8010E94D246D801ED91FC911995D80178 +:101A7000C8010E940053D801ED91FC911995D8013D :101A80001696ED91FC9117970F90DF91CF911F91D2 -:101A90000F91199448E150E06CE972E081E49BE217 -:101AA0000E94D246E0915C2BF0915D2B8581C0CFE6 -:101AB0000F931F93E0915C2BF0915D2B8B019C01A8 +:101A90000F91199448E150E06CE972E087E49EE20E +:101AA0000E940053E091622EF091632E8581C0CF99 +:101AB0000F931F93E091622EF091632E8B019C0196 :101AC000458168E08CE593E00E9471171F910F91AA :101AD0000895FF920F931F93CF93DF931F92CDB77B :101AE000DEB78C019E012F5F3F4FAC0168E08CE5B3 :101AF00093E00E948917F82E882389F0898198DF66 :101B0000F80140E08191882319F04F5F4F31D1F700 -:101B1000E091592BF0915A2BB80181E119958F2D45 +:101B1000E0915F2EF091602EB80181E119958F2D33 :101B20000F90DF91CF911F910F91FF9008959B012E :101B3000AC0168E08CE593E00C94B01708950C9428 -:101B4000C44608951F93CF93DF93C82FD92F162F24 -:101B5000180F1C1721F00E94C4468993FACFDF9119 -:101B6000CF911F9108950E94C4460E94C4460E94CE -:101B7000C4460C94C446EF92FF920F931F93CF93E9 +:101B4000F25208951F93CF93DF93C82FD92F162FEA +:101B5000180F1C1721F00E94F2528993FACFDF91DF +:101B6000CF911F9108950E94F2520E94F2520E945A +:101B7000F2520C94F252EF92FF920F931F93CF9375 :101B8000DF937C0161507109FA018A01020F131F72 :101B9000DC0140E050E0E017F107F1F06230710540 :101BA000D8F09191392F32953F703A3010F4305D72 @@ -464,7 +464,7 @@ :101CF00027FFFCCF2091A0096093A0092091A109A2 :101D000027FFFCCF2091A00921E0209312018093AE :101D10001C0190931D0140931401509315011092E2 -:101D2000220182E891E28093280190932901409357 +:101D2000220182E894E28093280190932901409354 :101D30002401509325018091100180688093100147 :101D4000809120018068809320018091100187FD9F :101D5000FCCF80E3809311018093210180E1809387 @@ -474,15 +474,15 @@ :101D9000660622E02093A0092091A10927FFFCCF2D :101DA0002091A0097093A0092091A10927FFFCCFE1 :101DB0002091A0096093A0092091A10927FFFCCFE1 -:101DC0002091A0091092120122E831E220931C0117 +:101DC0002091A0091092120122E834E220931C0114 :101DD00030931D01409314015093150120E120938D :101DE000220180932801909329014093240150936C :101DF000250180911001806880931001809120015D :101E00008068809320018091100187FDFCCF80E3E2 :101E1000809311018093210180E180936506E09118 -:101E20005C2BF0915D2B8781863019F481E18093E2 -:101E30008B298681863019F481E180938A2908955F -:101E4000CF92DF92EF92FF92CF93DF93C0905B2B04 +:101E2000622EF091632E8781863019F481E18093D0 +:101E30008B2C8681863019F481E180938A2C089559 +:101E4000CF92DF92EF92FF92CF93DF93C090612EFB :101E5000D12CE12CF12C8DE0CC0CDD1CEE1CFF1CF8 :101E60008A95D1F7C114D10481E0E806F10408F0A5 :101E70004EC080E18093660686E08093A009809141 @@ -496,13 +496,13 @@ :101EF000A10987FFFCCF8091A00982E0C80ED11C08 :101F0000E11CF11C219731F780E180936506DF9198 :101F1000CF91FF90EF90DF90CF900895CF92DF9216 -:101F2000EF92FF92CF93DF93C0905B2BD12CE12CEB +:101F2000EF92FF92CF93DF93C090612ED12CE12CE2 :101F3000F12C8DE0CC0CDD1CEE1CFF1C8A95D1F73A :101F4000C114D10481E0E806F10438F0DF91CF91AB :101F5000FF90EF90DF90CF9073CF8FEFE81AF80AE1 :101F6000C1E2D0E0219791F39ADBC701B60183DB90 :101F700096DB8FEFD81AE80AF80AF4CFCF92DF92F7 -:101F8000EF92FF920F931F93CF93DF93C0905B2B41 +:101F8000EF92FF920F931F93CF93DF93C090612E38 :101F9000D12CE12CF12C8DE0CC0CDD1CEE1CFF1CB7 :101FA0008A95D1F7C114D10481E0E806F10408F064 :101FB0004FC080E18093660683E08093A009809102 @@ -515,10 +515,10 @@ :102020008091A009782BC8012CDB39DB0E5F1F4F94 :10203000011581E0180729F7C701B60127DB2FDB5F :102040008FEFD81AE80AF80AD5CF80E180936506A9 -:10205000E0915C2BF0915D2B8781863019F490E143 -:1020600090938B299681963049F420E120938A2918 -:10207000853059F483E180938B2902C08530D1F3F8 -:10208000953019F483E180938A29DF91CF911F91D4 +:10205000E091622EF091632E8781863019F490E131 +:1020600090938B2C9681963049F420E120938A2C12 +:10207000853059F483E180938B2C02C08530D1F3F5 +:10208000953019F483E180938A2CDF91CF911F91D1 :102090000F91FF90EF90DF90CF900895CF92DF9255 :1020A000EF92FF920F931F934115E0E25E076105E7 :1020B000710508F06BC06901E12CF12C00E010E221 @@ -529,7 +529,7 @@ :1021000022E02093A0092091A10927FFFCCF209174 :10211000A0095093A0092091A10927FFFCCF20918D :10212000A0094093A0092091A10927FFFCCF20918D -:10213000A0091092120122E831E220931C01309391 +:10213000A0091092120122E834E220931C0130938E :102140001D01009314011093150120E12093220139 :102150008093280190932901009324011093250175 :102160008091100180688093100180912001806827 @@ -544,7 +544,7 @@ :1021F000A0095093A0092091A10927FFFCCF2091AD :10220000A0094093A0092091A10927FFFCCF2091AC :10221000A00921E02093120180931C0190931D01DD -:1022200000931401109315011092220182E891E2AB +:1022200000931401109315011092220182E894E2A8 :102230008093280190932901009324011093250194 :102240008091100180688093100180912001806846 :10225000809320018091100187FDFCCF80E3809363 @@ -581,57 +581,57 @@ :10244000843009F475C0E5C0883009F4D3C040F485 :10245000863009F4CDC0873009F0DBC08FDDD9C0EC :10246000893009F4C9C08A3009F0D3C080D3D1C003 -:102470008091572B181708F0A8C061DBE1E0F0E06D +:1024700080915D2E181708F0A8C061DBE1E0F0E064 :10248000EC0FFD1FE10FF11D80831F5FF1CF11E005 -:102490008091572B873009F010E0E091512BF0919B -:1024A000522BCE01019619954091572B31E014170C +:1024900080915D2E873009F010E0E091572EF09189 +:1024A000582ECE010196199540915D2E31E01417FA :1024B00008F08BC03323A9F0812F90E0E1E0F0E039 :1024C000EC0FFD1FE80FF91F208131E02F3F09F0CD :1024D00030E0E1E0F0E0EC0FFD1FE80FF91F2F5FA7 -:1024E00020831F5FE4CFE091512BF091522BCE015E -:1024F000019619958091572B41E0815008F465C0F1 +:1024E00020831F5FE4CFE091572EF091582ECE014C +:1024F0000196199580915D2E41E0815008F465C0E8 :102500004423D9F3282F30E0E1E0F0E0EC0FFD1F89 :10251000E20FF31F908141E09F3F09F040E0E1E0CE :10252000F0E0EC0FFD1FE20FF31F9F5F9083E5CFFC -:1025300011E08091572B873009F010E0E091512B8A -:10254000F091522BCE01019619954091572B31E015 +:1025300011E080915D2E873009F010E0E091572E78 +:10254000F091582ECE010196199540915D2E31E003 :102550001417D8F53323A1F0812F90E0E1E0F0E0EB :10256000EC0FFD1FE80FF91F208131E0211130E051 :10257000E1E0F0E0EC0FFD1FE80FF91F2150208390 -:102580001F5FE6CFE091512BF091522BCE010196C7 -:1025900019958091572B41E08150B8F04423E1F325 +:102580001F5FE6CFE091572EF091582ECE010196B5 +:10259000199580915D2E41E08150B8F04423E1F31C :1025A000282F30E0E1E0F0E0EC0FFD1FE20FF31F19 :1025B000908141E0911140E0E1E0F0E0EC0FFD1F7F -:1025C000E20FF31F91509083E7CFE091532BF091EE -:1025D000542BCE0101961995E091592BF0915A2B6D -:1025E0004091572BBE016F5F7F4F83E1199511C05A +:1025C000E20FF31F91509083E7CFE091592EF091E5 +:1025D0005A2ECE0101961995E0915F2EF091602E52 +:1025E00040915D2EBE016F5F7F4F83E1199511C051 :1025F0005DD30FC025DC0DC080910008813021F42F :1026000080918C08833019F00E94EE2102C00E9454 :102610001322A096CDBFDEBFDF91CF911F91089509 :10262000E0E0F6E080E6828388E1868B858B089582 -:10263000CF93C0910806C095C6FF12C08091842137 -:102640008A3050F08A30E1F4E0915C2BF0915D2B00 -:102650008181DFDE809184218F5F8093842110C08F -:102660008C2F807669F48091842181508A3030F4F7 -:10267000E0915C2BF0915D2B8081CBDE1092842168 -:10268000C5FF12C0809183218A3050F08A30D9F47E -:10269000E0915C2BF0915D2B8381BBDE80918321E7 -:1026A0008F5F809383210FC0C07669F4809183216E -:1026B00081508A3030F4E0915C2BF0915D2B828167 -:1026C000A8DE10928321CF9108959B01AC016BE0AD +:10263000CF93C0910806C095C6FF12C08091842434 +:102640008A3050F08A30E1F4E091622EF091632EEE +:102650008181DFDE809184248F5F8093842410C089 +:102660008C2F807669F48091842481508A3030F4F4 +:10267000E091622EF091632E8081CBDE1092842453 +:10268000C5FF12C0809183248A3050F08A30D9F47B +:10269000E091622EF091632E8381BBDE80918324D2 +:1026A0008F5F809383240FC0C07669F48091832468 +:1026B00081508A3030F4E091622EF091632E828155 +:1026C000A8DE10928324CF9108959B01AC016BE0AA :1026D00084E696E045C420E030E090E0F901E80FA0 -:1026E000F91FE55AF44D6383265F3F4F20353105CE -:1026F000A9F708950F931F939B01E0915C2BF09134 -:102700005D2BE80FF11D8A0140816BE084E696E0C5 +:1026E000F91FEF59F14D6383265F3F4F20353105C8 +:1026F000A9F708950F931F939B01E091622EF0912B +:10270000632EE80FF11D8A0140816BE084E696E0BC :10271000E8D31F910F9108950F931F93CF93DF93E9 :102720001F92CDB7DEB7082FAB019E012F5F3F4F41 :102730006BE084E696E0EDD3182F882319F06981C9 :10274000802FC9DF812F0F90DF91CF911F910F91C3 :1027500008950895EF92FF920F931F93CF937B01FB :10276000C42F2EB13FB10091080410910904022B2F -:10277000132B682F83E090E20E94D8446C2F83E0F3 -:1027800090E20E94D844612F83E090E20E94D844F6 -:10279000602F83E090E20E94D8446C2F70E0C70164 +:10277000132B682F83E090E20E9406516C2F83E0B8 +:1027800090E20E940651612F83E090E20E94065180 +:10279000602F83E090E20E9406516C2F70E0C70129 :1027A000CF911F910F91FF90EF905BC408953F92DE :1027B0004F925F926F927F928F929F92AF92BF9251 :1027C000CF92DF92EF92FF920F931F93CF93DF93FD @@ -645,115 +645,115 @@ :102840002A013B014C0E5D1E611C711C4814590489 :102850006A047B0428F4AE01BC01C70135DA18C054 :10286000C41AD50AA601BC01C7012EDAAE014C1963 -:102870005D096AE871E2C7018C0D9D1D07C04C1906 -:102880005D09BA0166577E4DAE01C7010E9400473F +:102870005D096AE874E2C7018C0D9D1D07C04C1903 +:102880005D09BA0166577B4DAE01C7010E942E5308 :10289000311002C081E00BC001501109D8F3F801DA :1028A000EC0FFD1FEE0DFF1D1082F6CF80E0DF91D3 :1028B000CF911F910F91FF90EF90DF90CF90BF903D :1028C000AF909F908F907F906F905F904F903F90D0 -:1028D0000895209186213091872180E098E0821B25 -:1028E000930BEAE8F1E29F012A5831422817390791 -:1028F00010F41192F8CF8AE891E2809388219093A6 -:10290000892180E098E0809386219093872182E05E +:1028D0000895209186243091872480E098E0821B1F +:1028E000930BEAE8F4E29F012A583442281739078B +:1028F00010F41192F8CF8AE894E2809388249093A0 +:10290000892480E098E0809386249093872482E055 :1029100090E4809300209093012042E050E060E03A -:1029200070E480E090E21EDAE0915C2BF0915D2B88 -:1029300087818A3019F480E180938B2986818A30DF -:1029400019F480E180938A290895809186219091DD -:10295000872190582091002030910120821B930BF9 -:10296000089520E030E0F901E55AF44D8783265FB1 +:1029200070E480E090E21EDAE091622EF091632E76 +:1029300087818A3019F480E180938B2C86818A30DC +:1029400019F480E180938A2C0895809186249091D7 +:10295000872490582091002030910120821B930BF6 +:10296000089520E030E0F901EF59F14D8783265FAB :102970003F4F20353105B9F7813049F018F08230EA -:1029800059F008951092852189EA93E109C0809356 -:10299000852180E395E104C0109285218AEA93E1C4 -:1029A0008093592B90935A2B08950F931F93CF9395 -:1029B000DF931F92CDB7DEB7E0915C2BF0915D2BDA -:1029C0008481CFDF8AE891E28093882190938921E6 -:1029D00000E018E0009386211093872141E050E049 -:1029E000BE016F5F7F4F80E090E060DCE091882166 -:1029F000F0918921DF01C8011D920197E9F78981D2 +:1029800059F008951092852489EA93E109C0809353 +:10299000852480E395E104C0109285248AEA93E1BE +:1029A00080935F2E9093602E08950F931F93CF9383 +:1029B000DF931F92CDB7DEB7E091622EF091632EC8 +:1029C0008481CFDF8AE894E28093882490938924DD +:1029D00000E018E0009386241093872441E050E043 +:1029E000BE016F5F7F4F80E090E060DCE091882463 +:1029F000F0918924DF01C8011D920197E9F78981CF :102A0000882341F042E050E060E070E480E090E232 :102A10005BD917C082E090E480930020909301205E :102A200042E050E060E070E480E090E29BD981E019 :102A3000898341E050E0BE016F5F7F4F80E090E00E -:102A400072DCE091592BF0915A2B40E060E070E08D +:102A400072DCE0915F2EF091602E40E060E070E07B :102A50008FEF19950F90DF91CF911F910F910895EE :102A60000F931F93CF93DF93AEB1BFB1C091080412 -:102A7000D09109042091862130918721E42FF0E044 +:102A7000D09109042091862430918724E42FF0E03E :102A80008F010C5F1F4F2017310758F1CA2BDB2B2A -:102A9000245031092E1B3F0B209386213093872130 -:102AA000A0918821B09189218C9311964C93119714 -:102AB0001296DC931297CD0104968093882190930F -:102AC00089211396CC93DB01EC01415018F02D9134 -:102AD0002993FBCFE80FF91FE0938821F093892118 -:102AE00012C080E03EDFE0915C2BF0915D2B87818E -:102AF0008A3019F481E180938B2986818A3019F418 -:102B000081E180938A29DF91CF911F910F910895E0 +:102A9000245031092E1B3F0B20938624309387242A +:102AA000A0918824B09189248C9311964C9311970E +:102AB0001296DC931297CD0104968093882490930C +:102AC00089241396CC93DB01EC01415018F02D9131 +:102AD0002993FBCFE80FF91FE0938824F093892412 +:102AE00012C080E03EDFE091622EF091632E87817C +:102AF0008A3019F481E180938B2C86818A3019F415 +:102B000081E180938A2CDF91CF911F910F910895DD :102B10001F93CF93DF931F92CDB7DEB79E012F5F38 :102B20003F4FAC0163E08FEC97E0F3D1182F88237F :102B300011F0898116DF812F0F90DF91CF911F91C6 -:102B400008950F931F93E0915C2BF0915D2B8B0107 +:102B400008950F931F93E091622EF091632E8B01F5 :102B50009C01448163E08FEC97E0C3D11F910F91FA :102B600008959B01AC0163E08FEC97E0F9C1CF932E -:102B7000DF938091862190918721811528E092072B +:102B7000DF938091862490918724811528E0920725 :102B800008F043C06091002070910120C0E0D8E0BF :102B9000AE01481B590B80E090E8861B970B841709 -:102BA000950798F18AE891E2DDD82091862130914D -:102BB00087218091002090910120985F821B930BC8 -:102BC0008093002090930120C21BD30BEAE8F1E22E -:102BD000CF018A5891428C179D0710F41192F8CFBB -:102BE0008AE891E2809388219093892180E098E09F -:102BF000809386219093872142E050E060E070E46A +:102BA000950798F18AE894E2DDD820918624309147 +:102BB00087248091002090910120985F821B930BC5 +:102BC0008093002090930120C21BD30BEAE8F4E22B +:102BD000CF018A5894428C179D0710F41192F8CFB8 +:102BE0008AE894E2809388249093892480E098E096 +:102BF000809386249093872442E050E060E070E464 :102C000080E090E2DF91CF91ADC8DF91CF91089540 -:102C1000809185218111ABCF089543E550E06BE5AC -:102C20007BE281E090E042CB43E550E06BE57BE264 +:102C1000809185248111ABCF089543E550E061E6B2 +:102C20007EE281E090E042CB43E550E061E67EE267 :102C300081E090E078CBCF93DF93CFEFC80FC8301F -:102C400078F5D82F0E94622199D9C0935B2B8AE036 -:102C5000C89F90011124C901825A944D80935C2B26 -:102C600090935D2BF901E55AF44D80850E94180D73 -:102C7000E0915C2BF0915D2B848173DEE1D88FE1D4 -:102C80008D0FE0915C2BF0915D2B9781943011F4C6 -:102C900080938B299681943029F480938A2902C0ED -:102CA00080E001C081E0DF91CF91089580915B2B9E +:102C400078F5D82F0E94622199D9C093612E8AE02D +:102C5000C89F90011124C9018C59914D8093622E17 +:102C60009093632EF901EF59F14D80850E94180D64 +:102C7000E091622EF091632E848173DEE1D88FE1C2 +:102C80008D0FE091622EF091632E9781943011F4B4 +:102C900080938B2C9681943029F480938A2C02C0E7 +:102CA00080E001C081E0DF91CF9108958091612E95 :102CB00099E04AE0915099F0282F30E02F5F3F4F84 :102CC00027703327822F429FF001439FF00D11247C -:102CD000E55AF44D2085222369F38F5FACCF089528 -:102CE000FC0190915B2B9F5C908311820895CF93A0 -:102CF000FC01C081818181110CC0BF01E091592B81 -:102D0000F0915A2B41E082E1199580ED8C0FCF9123 +:102CD000EF59F14D2085222369F38F5FACCF089522 +:102CE000FC019091612E9F5C908311820895CF9397 +:102CF000FC01C081818181110CC0BF01E0915F2E78 +:102D0000F091602E41E082E1199580ED8C0FCF911A :102D100092CF80E0CF91089588E1809301060895D5 -:102D200080918A29823191F030F48031B9F050F4E9 +:102D200080918A2C823191F030F48031B9F050F4E6 :102D30008823A9F132C0833169F090EE980F983062 :102D400088F02BC088E08093050627C088E0809338 :102D5000070623C08091040683FF12C088E0809399 -:102D600006061BC090918C299F5F923019F09093BA -:102D70008C2915C010928C299091040693FD04C0F3 +:102D600006061BC090918C2C9F5F923019F09093B7 +:102D70008C2C15C010928C2C9091040693FD04C0ED :102D800088E0809305060BC098E090930606803299 -:102D900021F0815080938A2902C010928A29809163 -:102DA0008B29823191F030F48031C1F050F48823C6 +:102D900021F0815080938A2C02C010928A2C80915D +:102DA0008B2C823191F030F48031C1F050F48823C3 :102DB000A9F132C0833169F090EE980F983088F015 :102DC0002BC080E18093050627C080E18093070631 :102DD00023C08091040684FF12C080E18093060620 -:102DE0001BC090918D299F5F923019F090938D298F -:102DF000089510928D299091040694FD04C080E1FD +:102DE0001BC090918D2C9F5F923019F090938D2C89 +:102DF000089510928D2C9091040694FD04C080E1FA :102E000080930506089590E190930606803221F0A4 -:102E1000815080938B29089510928B2908959B01EE +:102E1000815080938B2C089510928B2C08959B01E8 :102E2000AC016BE082E398E09BC020E030E0982F9B -:102E300090718870992321F0F901E55AF44D628769 -:102E4000882321F0F901E55AF44D6187265F3F4F51 +:102E300090718870992321F0F901EF59F14D628763 +:102E4000882321F0F901EF59F14D6187265F3F4F4B :102E50002035310579F7992329F090E19093060602 -:102E600010928B29882329F088E08093060610921F -:102E70008A2908950F931F939B018A01803131F4B1 -:102E8000E0915C2BF0915D2B478107C0883049F4BD -:102E9000E0915C2BF0915D2B46816BE082E398E042 +:102E600010928B2C882329F088E08093060610921C +:102E70008A2C08950F931F939B018A01803131F4AE +:102E8000E091622EF091632E478107C0883049F4AB +:102E9000E091622EF091632E46816BE082E398E030 :102EA00020D01F910F9108950F931F93CF93DF931D :102EB0001F92CDB7DEB7082FAB019E012F5F3F4FAA :102EC0006BE082E398E025D0182F882319F0698100 :102ED000802FABDF812F0F90DF91CF911F910F914A :102EE00008950F931F93FC01662379F0949161502C :102EF000941309C0BF016F5F7F4FA801C9010E94F1 -:102F0000E44681E003C0B196EFCF80E01F910F91BE +:102F0000125381E003C0B196EFCF80E01F910F9183 :102F10000895CF92DF92EF92FF921F93CF93DF93AA :102F2000EC017A016901162F112389F0BE016F5F50 -:102F30007F4FC7010E94DB461150892B31F4FE01FF +:102F30007F4FC7010E9409531150892B31F4FE01C4 :102F4000C491F601C08381E003C0A196EDCF80E07B :102F5000DF91CF911F91FF90EF90DF90CF90089578 :102F6000CF930196CCE26623C9F0FC01DA01AD01F2 @@ -763,78 +763,78 @@ :102FA000FA011082CF910895809120028068809369 :102FB00020028091230280FFFCCF81E080932302D6 :102FC000A0911002B0911102AE5BB109B7FF02C02F -:102FD000A0E0B0E020E038EB4BE050E00E945E461D -:102FE000E0915C2BF0915D2B61157105844F914050 -:102FF000A8F48781873019F480E180938B2986813A -:10300000873019F480E180938A298091572B882397 -:1030100089F0E091492BF0914A2B199487818730F0 -:1030200019F481E180938B298681873019F481E13D -:1030300080938A290895BC0183E090E20C948A442D +:102FD000A0E0B0E020E038EB4BE050E00E948C52E3 +:102FE000E091622EF091632E61157105844F91403E +:102FF000A8F48781873019F480E180938B2C868137 +:10300000873019F480E180938A2C80915D2E88238B +:1030100089F0E0914F2EF091502E199487818730DE +:1030200019F481E180938B2C8681873019F481E13A +:1030300080938A2C0895BC0183E090E20C94B850F0 :10304000CF93DF93FC016491EC012196662331F06C -:1030500083E090E20E94D844CE01F4CFDF91CF917B -:103060000895AB01BC0183E090E20C94B44480E28B -:10307000809362060895CF93DF9380918E298230EA -:1030800029F583E090E20E943D450E940C4083E0D8 -:1030900090E20E945945EC0197FD18C0E0915C2B2D -:1030A000F0915D2B8781833019F483E180938B2924 -:1030B0008681833019F483E180938A298C2F24D66A +:1030500083E090E20E940651CE01F4CFDF91CF9140 +:103060000895AB01BC0183E090E20C94E25080E251 +:10307000809362060895CF93DF9380918E2C8230E7 +:1030800029F583E090E20E946B510E943A4C83E064 +:1030900090E20E948751EC0197FD18C0E091622EEA +:1030A000F091632E8781833019F483E180938B2C18 +:1030B0008681833019F483E180938A2C8C2F24D667 :1030C000811104C08C2FDF91CF91C2C7DF91CF91C6 -:1030D000089580918E29813079F028F08230D9F0DE +:1030D000089580918E2C813079F028F08230D9F0DB :1030E000833011F12EC08091680685FF2AC08FE0E1 :1030F0008093022081E00CC0809102208150809357 -:10310000022081111EC00E94C90C0E94B74382E0B8 -:1031100080938E2916C08091680685FD12C08FE0CD +:10310000022081111EC00E94C90C0E94E54F82E07E +:1031100080938E2C16C08091680685FD12C08FE0CA :103120008093022083E0F4CF80910220815080932D -:103130000220811106C00E947C430E94F70C10926D -:103140008E2980918E29823019F42ED70C942A2151 -:103150000895E0915C2BF0915D2B8781823019F40A -:1031600081E180938B298681823019F481E18093FB -:103170008A290895E0915C2BF0915D2B8781823044 -:1031800019F480E180938B298681823019F480E1E3 -:1031900080938A29089583E090E20C94654483E04B -:1031A00090E20C94AC4523E33BE03F932F932DE258 +:103130000220811106C00E94AA4F0E94F70C109233 +:103140008E2C80918E2C823019F42ED70C942A214B +:103150000895E091622EF091632E8781823019F4F8 +:1031600081E180938B2C8681823019F481E18093F8 +:103170008A2C0895E091622EF091632E878182302F +:1031800019F480E180938B2C8681823019F480E1E0 +:1031900080938A2C089583E090E20C94935083E00E +:1031A00090E20C94DA5123E33BE03F932F932DE21E :1031B0003BE03F932F9326E23BE03F932F932FE199 :1031C0003BE03F932F932FE73AE03F932F9322E08A -:1031D0002F931F929F938F930E9469478DB79EB73D +:1031D0002F931F929F938F930E9497538DB79EB703 :1031E0000E968DBF9EBF85E6089560E072E00E9456 :1031F000580D85E60895FB0120812F3349F4218184 :10320000211106C060E072E00E94970D85E60895E6 :10321000CB010E94690D882319F006DD84E608952C :103220008AEC0895EF92FF920F931F93CF93DF9351 -:10323000CDB7DEB7A097CDBFDEBF7C010091572B85 +:10323000CDB7DEB7A097CDBFDEBF7C0100915D2E7C :1032400010E00115110591F487E79AE09F938F93A1 -:1032500082E08F931F92FF92EF920E9469470F9036 -:103260000F900F900F900F900F9010C0E091512B86 -:10327000F091522BCE01019619959801AE014F5F46 +:1032500082E08F931F92FF92EF920E9497530F90FC +:103260000F900F900F900F900F9010C0E091572E7D +:10327000F091582ECE01019619959801AE014F5F3D :103280005F4F60E072E0C7010E94BB0D85E6A0962B :10329000CDBFDEBFDF91CF911F910F91FF90EF90D7 :1032A0000895DF92EF92FF920F931F93CF93DF93D6 -:1032B000CDB7DEB7A097CDBFDEBF7B010091572B06 -:1032C00010E060E77AE0C7010E94DB46892B29F510 +:1032B000CDB7DEB7A097CDBFDEBF7B0100915D2EFD +:1032C00010E060E77AE0C7010E940953892B29F5D5 :1032D000D12CED2CF12CE016F10658F40E949F0D34 :1032E000E1E0F0E0EC0FFD1FEE0DFF1D8083D394B5 -:1032F000F0CFE091532BF091542BCE01019619950C -:10330000E091592BF0915A2B4091572BBE016F5FE2 +:1032F000F0CFE091592EF0915A2ECE0101961995FA +:10330000E0915F2EF091602E40915D2EBE016F5FC7 :103310007F4F83E1199584E60BC0A70160E270E05E :10332000CE0101960E94F50D8017910711F38AECEA :10333000A096CDBFDEBFDF91CF911F910F91FF907F -:10334000EF90DF900895FC018091582B882311F0B5 +:10334000EF90DF900895FC0180915E2E882311F0AC :1033500081E301C080E38083118285E60895FB014B :103360002181211127C02081213321F481E0809324 -:10337000582B04C0203321F41092582B84E6089572 +:103370005E2E04C0203321F410925E2E84E6089560 :103380002F33C1F41F9220E32F931F9221E32F9339 :103390002AE63AE03F932F9322E02F931F929F93C8 -:1033A0008F930E9469478DB79EB70A968DBF9EBFC7 +:1033A0008F930E9497538DB79EB70A968DBF9EBF8D :1033B00085E608958AEC08958EE490E174D48EE653 :1033C00008958EEC90E18AD48EE60895E0ECF4E066 -:1033D00081818E7F81830E947C430E94BD0C84E6A4 -:1033E0000895E0ECF4E081818E7F81830E947C432C -:1033F0000E94C30C84E60895E1E4FBE225892F9343 +:1033D00081818E7F81830E94AA4F0E94BD0C84E66A +:1033E0000895E0ECF4E081818E7F81830E94AA4FF2 +:1033F0000E94C30C84E60895E7E4FEE225892F933A :1034000024892F9327E63AE03F932F9322E02F93CE -:103410001F929F938F930E9469478DB79EB708961E -:103420008DBF9EBF85E608952091572B1F922F9345 +:103410001F929F938F930E9497538DB79EB70896E4 +:103420008DBF9EBF85E6089520915D2E1F922F933C :1034300024E63AE03F932F9322E02F931F929F932D -:103440008F930E9469478DB79EB708968DBF9EBF28 +:103440008F930E9497538DB79EB708968DBF9EBFEE :1034500085E6089540E052E0BC0180E04BD985E666 :103460000895FB0120812F3341F42181211105C0F2 :1034700060E072E02AD985E6089580E04DD988237E @@ -862,7 +862,7 @@ :1035D00084E608958AEC0895CF93DF93EC01B5D982 :1035E000813028E0920718F09C01385002C020E09A :1035F00030E03F932F939F938F9324E43AE03F93DF -:103600002F9382E08F931F92DF93CF930E9469479D +:103600002F9382E08F931F92DF93CF930E94975363 :103610008DB79EB70A968DBF9EBF85E6DF91CF918D :10362000089587ED93E15AD38EE60895A0DA84E6F3 :1036300008954FD984E6089560E072E051DB85E695 @@ -872,7 +872,7 @@ :1036700080FD02C089E7089588E70895DF92EF9200 :10368000FF920F931F93CF93DF93EC010FEF11E0A5 :1036900086E7E82E8CE0F82E9CE2D92EB7018CE666 -:1036A00091E20E94DB46892BD1F001151105B9F09A +:1036A00094E20E940953892BD1F001151105B9F05C :1036B000DE01F7012491ED012196C8010197222333 :1036C00041F00130110529F02C93DE0131968C0177 :1036D000F1CFDC928C0188E1E80EF11CDFCF21975D @@ -880,227 +880,227 @@ :1036F000DF900895FC012091200220682093200291 :103700008091230280FFFCCF81E080932302A0916F :103710001002B0911102AE5BB109B7FF02C0A0E088 -:10372000B0E020E038EB4BE050E00E945E46AA2774 +:10372000B0E020E038EB4BE050E00E948C52AA273A :10373000BB279F938F932DE33AE03F932F9382E033 -:103740008F931F92FF93EF930E9469478DB79EB7A7 +:103740008F931F92FF93EF930E9497538DB79EB76D :1037500008968DBF9EBF85E608952EB13FB140917A :10376000080450910904242B352B3F932F9327E312 :103770003AE03F932F9322E02F931F929F938F93D2 -:103780000E9469478DB79EB708968DBF9EBF85E69C +:103780000E9497538DB79EB708968DBF9EBF85E662 :1037900008950F931F93CF93DF931F921F92CDB77E -:1037A000DEB78B01E0915C2BF0915D2B858187303A -:1037B00009F06FC0E091492BF0914A2B199581E0F7 -:1037C0008093DD2960E270E0C8010E9421470097E4 +:1037A000DEB78B01E091622EF091632E8581873028 +:1037B00009F06FC0E0914F2EF091502E199581E0E5 +:1037C0008093E32C60E270E0C8010E944F530097A1 :1037D000F9F4F80101900020E9F73197E01BF10BB3 :1037E000E0FD59C0F695E795E130F10539F487E041 -:1037F00090E080933F2B9093402B37C053E0EE0F27 -:10380000FF1F5A95E1F7E0933F2BF093402B2DC01B +:1037F00090E08093452E9093462E37C053E0EE0F15 +:10380000FF1F5A95E1F7E093452EF093462E2DC009 :1038100098012C5F3F4F82179307E9F5A80162E0FA :1038200070E0CE0101960E94F50D898190E0982FFD -:1038300088272A81820F911D80933F2B9093402BE4 +:1038300088272A81820F911D8093452E9093462ED2 :103840000B5F1F4FF80101900020E9F73197E01B53 :10385000F10BE0FD20C0F695E79533E0EE0FFF1F7A -:103860003A95E1F7E817F907B0F060913F2B7091B6 -:10387000402B695F7F4F83E0769567958A95E1F7E6 -:10388000A8018FE39AE20E94F50D0E947B298FEF39 +:103860003A95E1F7E817F907B0F06091452E7091AD +:10387000462E695F7F4F83E0769567958A95E1F7DD +:10388000A80185E49DE20E94F50D0E947E298FEF3C :1038900003C089EC01C08AEC0F900F90DF91CF91AB :1038A0001F910F910895EF92FF920F931F93CF9363 -:1038B000DF931F921F92CDB7DEB78B01E0915C2B97 -:1038C000F0915D2B8581873009F080C0E091492B14 -:1038D000F0914A2B199582E08093DD2960E270E037 -:1038E000C8010E9421477C01892B31F5F801019024 +:1038B000DF931F921F92CDB7DEB78B01E091622E8E +:1038C000F091632E8581873009F080C0E0914F2E02 +:1038D000F091502E199582E08093E32C60E270E025 +:1038E000C8010E944F537C01892B31F5F8010190EA :1038F0000020E9F73197E01BF10BE0FD69C0F69578 -:10390000E795E130F10539F487E090E080933F2BB3 -:103910009093402B47C063E0EE0FFF1F6A95E1F7DD -:10392000CF0169E070E00E944A46E81BF90BE09382 -:103930003F2BF093402B36C0C8010496E816F906D9 +:10390000E795E130F10539F487E090E08093452EAA +:103910009093462E47C063E0EE0FFF1F6A95E1F7D4 +:10392000CF0169E070E00E947852E81BF90BE09348 +:10393000452EF093462E36C0C8010496E816F906C7 :1039400009F046C0A80162E070E0CE0101960E9435 :10395000F50D298130E0322F22278A81280F311D71 -:1039600020933F2B3093402B2730310529F0C9019C +:103960002093452E3093462E2730310529F0C9018A :1039700087709927892B61F587010F5F1F4FF80129 :1039800001900020E9F73197E01BF10BE0FD20C02A :10399000F695E79543E0EE0FFF1F4A95E1F7E21732 -:1039A000F307B0F060913F2B7091402B695F7F4F20 -:1039B00083E0769567958A95E1F7A8018FE39AE20F -:1039C0000E94F50D0E947B298FEF03C089EC01C096 +:1039A000F307B0F06091452E7091462E695F7F4F0E +:1039B00083E0769567958A95E1F7A80185E49DE215 +:1039C0000E94F50D0E947E298FEF03C089EC01C093 :1039D0008AEC0F900F90DF91CF911F910F91FF9084 -:1039E000EF900895E0915C2BF0915D2B85818730FD -:1039F000A1F4E091492BF0914A2B199584E0809332 -:103A0000DD290E9440360E947B298AE496E3809358 -:103A10009E2990939F298FEF089589EC0895E09156 -:103A20005C2BF0915D2B85818730A1F4E091492BCF -:103A3000F0914A2B199583E08093DD290E9440364E -:103A40000E947B298AE496E380939E2990939F2984 -:103A50008FEF089589EC0895E0915C2BF0915D2B38 -:103A600085818730A1F4E091492BF0914A2B19957B -:103A700085E08093DD290E9440360E947B298AE4FC -:103A800096E380939E2990939F298FEF089589EC68 -:103A90000895E0915C2BF0915D2B4085518564E6A3 +:1039E000EF900895E091622EF091632E85818730EB +:1039F000A1F4E0914F2EF091502E199584E0809320 +:103A0000E32C0E946E420E947E2988E792E4809314 +:103A10009E2C90939F2C8FEF089589EC0895E09150 +:103A2000622EF091632E85818730A1F4E0914F2EB4 +:103A3000F091502E199583E08093E32C0E946E4202 +:103A40000E947E2988E792E480939E2C90939F2C7D +:103A50008FEF089589EC0895E091622EF091632E26 +:103A600085818730A1F4E0914F2EF091502E199569 +:103A700085E08093E32C0E946E420E947E2988E7B5 +:103A800092E480939E2C90939F2C8FEF089589EC65 +:103A90000895E091622EF091632E4085518564E691 :103AA000649F9001659F300D11243F932F9321E374 :103AB0003AE03F932F9322E02F931F929F938F938F -:103AC0000E9469478DB79EB708968DBF9EBF85E659 +:103AC0000E9497538DB79EB708968DBF9EBF85E61F :103AD0000895CF93DF931F921F92CDB7DEB7FB01FE :103AE00020812F33B1F42181211113C02FEF39E050 :103AF0003F932F9322E02F931F929F938F930E94C7 -:103B000069470F900F900F900F900F900F9085E6E0 +:103B000097530F900F900F900F900F900F9085E6A6 :103B100027C089E592E089839A83CE0101969F931D :103B20008F938BEF99E09F938F937F936F930E9476 -:103B30009F470F900F900F900F900F900F90892B31 +:103B3000CD530F900F900F900F900F900F90892BF7 :103B400071F089819A818935F2E09F0740F4E09114 -:103B50005C2BF0915D2B8087918784E601C08AEC15 +:103B5000622EF091632E8087918784E601C08AEC03 :103B60000F900F90DF91CF91089520911F202F93F8 :103B700020911E202F9328EF39E03F932F9322E0CE -:103B80002F931F929F938F930E9469478DB79EB783 +:103B80002F931F929F938F930E9497538DB79EB749 :103B900008968DBF9EBF85E60895CF93DF931F9251 :103BA0001F92CDB7DEB7FB0120812F33B1F4218105 :103BB000211113C02FE02F932FEF2F9327EA39E025 :103BC0003F932F9322E02F931F929F938F930E94F6 -:103BD0006947CDBFDEBF85E627C019821A82CE01B4 +:103BD0009753CDBFDEBF85E627C019821A82CE017A :103BE00001969F938F9383EA99E09F938F937F939E -:103BF0006F930E949F470F900F900F900F900F9020 +:103BF0006F930E94CD530F900F900F900F900F90E6 :103C00000F90892B81F089819A818115E0E19E07CF :103C100050F4809338039093390380931E2090933F :103C20001F2084E601C08AEC0F900F90DF91CF91A6 :103C30000895FB0120812F33D9F42181211121C066 :103C40001F9220E32F931F9221E32F932DE939E058 :103C50003F932F9322E02F931F929F938F930E9465 -:103C600069478DB79EB70A968DBF9EBF85E60895BA +:103C600097538DB79EB70A968DBF9EBF85E6089580 :103C7000213311F4B3D303C0203319F4D4D384E631 :103C800008958AEC0895FC0180910008813021F4A8 :103C900080918C08833011F080E301C081E3808340 -:103CA000118285E6089521E020939D2920939C2987 -:103CB0002CE32093992925E030E020939729309335 -:103CC000982910929129109292291092932910927A -:103CD000942980938F2990939029089527E0209329 -:103CE0009D292CE231E02093972930939829109256 -:103CF00091291092922910929329109294298093DD -:103D00008F29909390290895CF9390919D29953074 +:103CA000118285E6089521E020939D2C20939C2C81 +:103CB0002CE32093992C25E030E02093972C30932F +:103CC000982C1092912C1092922C1092932C10926E +:103CD000942C80938F2C9093902C089527E0209320 +:103CE0009D2C2CE231E02093972C3093982C10924D +:103CF000912C1092922C1092932C1092942C8093D1 +:103D00008F2C9093902C0895CF9390919D2C95306B :103D1000E1F130F4933029F140F5913068F440C17D :103D2000973009F4A7C008F445C0983009F4AAC038 -:103D3000993009F432C134C1813041F4109295298F -:103D40001092962910929A2983E0FBC0843011F4D6 +:103D3000993009F432C134C1813041F41092952C8C +:103D40001092962C10929A2C83E0FBC0843011F4D0 :103D500066E08BC0883109F420C18B3109F0F3C0D3 -:103D60001CC180939B2984E0ECC090E040919B298A +:103D60001CC180939B2C84E0ECC090E040919B2C84 :103D70002FEF30E0241B31098217930721F485E0EF -:103D8000E0C0981739F165E169C02091952930911B -:103D90009629A9014F5F5F4F40939529509396292B -:103DA000F901E255F44D80834038510509F0CBC04C -:103DB00086E0C7C020919B2990919C29291346C079 -:103DC000EEEAFBE290E02CE2EE32F207D1F2219132 -:103DD000920FF9CF409191295091922960919329A6 -:103DE00070919429E0918F29F091902920E830E09A -:103DF0008EEA9BE21995C82F882311F180919C29A6 -:103E00008F5F80939C298091912990919229A09114 -:103E10009329B091942980589F4FAF4FBF4F809303 -:103E2000912990939229A0939329B093942966E0C5 -:103E300083E090E20E94D84482E080939D29B1C043 -:103E400068E183E090E20E94D8440EC030E0892F00 +:103D8000E0C0981739F165E169C02091952C309118 +:103D9000962CA9014F5F5F4F4093952C5093962C22 +:103DA000F901EC54F14D80834038510509F0CBC046 +:103DB00086E0C7C020919B2C90919C2C291346C073 +:103DC000E4EBFEE290E02FE2E433F207D1F221913E +:103DD000920FF9CF4091912C5091922C6091932C9D +:103DE0007091942CE0918F2CF091902C20E830E091 +:103DF00084EB9EE21995C82F882311F180919C2CA9 +:103E00008F5F80939C2C8091912C9091922CA0910B +:103E1000932CB091942C80589F4FAF4FBF4F8093FD +:103E2000912C9093922CA093932CB093942C66E0B9 +:103E300083E090E20E94065182E080939D2CB1C005 +:103E400068E183E090E20E9406510EC030E0892FC5 :103E500090E001972817390739F466E083E090E293 -:103E60000E94D84482E06DC068E183E090E20E9445 -:103E7000D84493C0853119F410929C2909C08B3124 +:103E60000E94065182E06DC068E183E090E20E940A +:103E7000065193C0853119F410929C2C09C08B31E6 :103E800009F48BC0883109F463CF863009F05DC036 -:103E900080919C298F5F80939C294091912950911A -:103EA00092296091932970919429E0918F29F09142 -:103EB000902920E830E08EEA9BE21995C82F8823EC -:103EC000D1F161E083E090E20E94D84460919C29A6 -:103ED00083E090E20E94D84460919C29609583E041 -:103EE00090E20E94D84460E870E08EEA9BE2B9D884 -:103EF000EEEAFBE260E08CE2EE32F80719F0819125 -:103F0000680FF9CF83E090E20E94D8448091912914 -:103F100090919229A0919329B091942980589F4F14 -:103F2000AF4FBF4F8093912990939229A0939329EB -:103F3000B093942936C064E083E090E20E94D844B4 -:103F400089E080939D29C1E02CC08531E1F761E0D3 -:103F500083E090E20E94D84460919C2983E090E243 -:103F60000E94D84460919C29609583E090E20E9471 -:103F7000D84460E870E08EEA9BE273D8EEEAFBE298 -:103F800060E02CE2EE32F20719F08191680FF9CF70 -:103F900083E090E20E94D844D6CF10929D29D3CFDF -:103FA000C0E08C2FCF91089580919D29813019F028 -:103FB000873029F1089580919729909198299C0143 -:103FC000215031092093972930939829892B31F575 -:103FD000809199299FEF980F90939929882331F028 -:103FE00065E183E090E20E94D84402C010929D29CE -:103FF00085E090E080939729909398290895809187 -:104000009729909198299C01215031092093972953 -:1040100030939829892B11F410929D290895EDE48D +:103E900080919C2C8F5F80939C2C4091912C509111 +:103EA000922C6091932C7091942CE0918F2CF09136 +:103EB000902C20E830E084EB9EE21995C82F8823EF +:103EC000D1F161E083E090E20E94065160919C2C68 +:103ED00083E090E20E94065160919C2C609583E003 +:103EE00090E20E94065160E870E084EB9EE2B9D84F +:103EF000E4EBFEE260E08FE2E433F80719F0819131 +:103F0000680FF9CF83E090E20E9406518091912CD6 +:103F10009091922CA091932CB091942C80589F4F0B +:103F2000AF4FBF4F8093912C9093922CA093932CE2 +:103F3000B093942C36C064E083E090E20E94065176 +:103F400089E080939D2CC1E02CC08531E1F761E0D0 +:103F500083E090E20E94065160919C2C83E090E205 +:103F60000E94065160919C2C609583E090E20E9433 +:103F7000065160E870E084EB9EE273D8E4EBFEE269 +:103F800060E02FE2E433F20719F08191680FF9CF76 +:103F900083E090E20E940651D6CF10929D2CD3CFA1 +:103FA000C0E08C2FCF91089580919D2C813019F025 +:103FB000873029F108958091972C9091982C9C013D +:103FC000215031092093972C3093982C892B31F56F +:103FD0008091992C9FEF980F9093992C882331F022 +:103FE00065E183E090E20E94065102C010929D2C90 +:103FF00085E090E08093972C9093982C0895809181 +:10400000972C9091982C9C01215031092093972C4A +:104010003093982C892B11F410929D2C0895EDE487 :10402000FBE020E030E09491981309C041E2429F08 :10403000C001439F900D1124825B944F08952F5F20 :104040003F4FB1962930310571F780E090E0089537 :10405000CF92DF92EF92FF920F931F93CF93982FFF :104060009F7D91549A3160F090ED980F9A3040F016 :104070008F3531F0982F9D7F9D3311F08032D1F430 -:104080009FE9980F9A3108F480522091A32930912A -:10409000A4292F3F91E0390708F0D3C0A9014F5F51 -:1040A0005F4F4093A3295093A429F901E255F44DA1 -:1040B0008083C7C08D3009F095C0E091A329F091AD -:1040C000A429E255F44D10821092A3291092A4293C -:1040D0008091A2298111B5C08091AE2B982F9F7D30 -:1040E00009F495C08D7F8D3309F491C0EEEAFBE2AF +:104080009FE9980F9A3108F480522091A32C309127 +:10409000A42C2F3F91E0390708F0D3C0A9014F5F4E +:1040A0005F4F4093A32C5093A42CF901EC54F14D95 +:1040B0008083C7C08D3009F095C0E091A32CF091AA +:1040C000A42CEC54F14D10821092A32C1092A42C2D +:1040D0008091A22C8111B5C08091B42E982F9F7D24 +:1040E00009F495C08D7F8D3309F491C0E4EBFEE2B5 :1040F0007F01C191CC2331F0CF3321F0CD3311F0CA :10410000C032B1F7F701108286E7C82E8CE0D82EB6 -:1041100000E010E0B6018EEA9BE20E94DB46892BAC -:1041200009F056C01092AE2BCF3349F488E1809F3E +:1041100000E010E0B60184EB9EE20E940953892B77 +:1041200009F056C01092B42ECF3349F488E1809F35 :10413000F001819FF00D1124E457F34F18C0B7012F :104140006F5F7F4FCD3349F488E1809FF001819FFD :10415000F00D1124E657F34F20C0C11113C088E1C0 :10416000809FF001819FF00D1124EA57F34F2591B4 -:1041700034912115310509F44DC08EEA9BE2F90115 +:1041700034912115310509F44DC084EB9EE2F9011B :10418000199514C0C03209F045C088E1809FF00144 :10419000819FF00D1124E857F34F2591349121159B -:1041A0003105C1F18EEA9BE2F90119958F3F99F52E -:1041B00081E08093A2298EB19FB1209108043091B3 -:1041C0000904822B932B8093A0299093A12939C0B5 +:1041A0003105C1F184EB9EE2F90119958F3F99F534 +:1041B00081E08093A22C8EB19FB1209108043091B0 +:1041C0000904822B932B8093A02C9093A12C39C0AF :1041D0000F5F1F4FF8E1CF0ED11C0632110509F019 -:1041E00099CF15C0883061F48091A3299091A429BA -:1041F000009739F101978093A3299093A42921C0B6 -:104200008B31F9F41092A3291092A4291AC088ECDA +:1041E00099CF15C0883061F48091A32C9091A42CB4 +:1041F000009739F101978093A32C9093A42C21C0B0 +:104200008B31F9F41092A32C1092A42C1AC088ECD4 :10421000C0E002C089ECC1E002DF0E9420188AE4FD -:104220009BE00E942018CC2361F08091AE2B882364 -:1042300041F08EEA9BE20E941B1887E49BE00E94FB +:104220009BE00E942018CC2361F08091B42E88235B +:1042300041F084EB9EE20E941B1887E49BE00E9401 :10424000201881E0CF911F910F91FF90EF90DF90A8 -:10425000CF9008958091A229882399F1E0915C2B59 -:10426000F0915D2B208531852115310551F18EB1FD +:10425000CF9008958091A22C882399F1E091622E4D +:10426000F091632E208531852115310551F18EB1F4 :104270009FB14091080450910904842B952B4091E3 -:10428000A0295091A129841B950B64E670E00E943F -:104290004A4662177307A8F01092A2298BECBFDE82 -:1042A0000E94201884E49BE00E942018E0919E293F -:1042B000F0919F29309729F0199510929E2910921C -:1042C0009F2908958091A2298823A9F01092A229FC +:10428000A02C5091A12C841B950B64E670E00E9439 +:10429000785262177307A8F01092A22C8BECBFDE45 +:1042A0000E94201884E49BE00E942018E0919E2C3C +:1042B000F0919F2C309729F0199510929E2C109216 +:1042C0009F2C08958091A22C8823A9F01092A22CF3 :1042D0008BECA5DE0E94201884E49BE00E9420184D -:1042E000E0919E29F0919F29309729F0199510921D -:1042F0009E2910929F290895CF93DF939091A22930 -:104300009923A9F0EB011092A22989DE0E942018BE +:1042E000E0919E2CF0919F2C309729F01995109217 +:1042F0009E2C10929F2C0895CF93DF939091A22C27 +:104300009923A9F0EB011092A22C89DE0E942018BB :1043100081E49BE00E942018209749F0CE010E9482 :104320001B188EE39BE0DF91CF910C942018DF9156 :10433000CF910895EF92FF920F931F93CF937C013B :104340009B01613081E0780710F020E031E08B01C3 -:10435000021B130BA70160E072E08EEA9BE20E9451 -:10436000BB0D8EEA9BE20E941B18C1E0013081E088 +:10435000021B130BA70160E072E084EB9EE20E9457 +:10436000BB0D84EB9EE20E941B18C1E0013081E08E :104370001807B0F01A956C2F70E0762F6627A7010A -:10438000460F571F20E032E060E072E08EEA9BE2C9 -:104390000E94BB0D8EEA9BE20E941B18CF5FE6CF06 +:10438000460F571F20E032E060E072E084EB9EE2CF +:104390000E94BB0D84EB9EE20E941B18CF5FE6CF0C :1043A0000115110591F0EC2FF0E0FE2FEE27A7018B -:1043B0004E0F5F1F980160E072E08EEA9BE20E9460 -:1043C000BB0D8EEA9BE20E941B188BE39BE0CF9112 +:1043B0004E0F5F1F980160E072E084EB9EE20E9466 +:1043C000BB0D84EB9EE20E941B188BE39BE0CF9118 :1043D0001F910F91FF90EF900C942018809100088E :1043E000813029F480918C08833009F408958091FC -:1043F000A729811117C081E08093000893E0909372 -:104400008C088093A5291092A6298EB19FB1209186 -:10441000080430910904822B932B8093AC2990934C -:10442000AD290895089510928C0810920008E5EACD -:10443000F9E21082118208959091A5299923F1F053 -:104440008091A629811115C02091A5292223B9F0B8 +:1043F000A72C811117C081E08093000893E090936F +:104400008C088093A52C1092A62C8EB19FB1209180 +:10441000080430910904822B932B8093AC2C909349 +:10442000AD2C0895089510928C0810920008E5EACA +:10443000FCE21082118208959091A52C9923F1F04D +:104440008091A62C811115C02091A52C2223B9F0B2 :104450002EB13FB14091080450910904242B352B13 -:104460004091AC295091AD29241B350B26343105E0 -:1044700030F081E08093A629892F089581E0089586 -:10448000CF93DF931F92CDB7DEB78091A729882302 +:104460004091AC2C5091AD2C241B350B26343105DA +:1044700030F081E08093A62C892F089581E0089583 +:10448000CF93DF931F92CDB7DEB78091A72C8823FF :10449000D1F02EB13FB14091080450910904242B72 -:1044A000352B4091AA295091AB29241B350B409103 -:1044B000A8295091A9292417350728F01092A72977 +:1044A000352B4091AA2C5091AB2C241B350B4091FD +:1044B000A82C5091A92C2417350728F01092A72C6E :1044C00089838CDF89810F90DF91CF910895A0E2DD -:1044D000B6E081E015968C9315972EEA3DE228B957 -:1044E00039B92EE23EE22AB93BB910B813B812B876 +:1044D000B6E081E015968C93159724EB30E328B96C +:1044E00039B924E331E32AB93BB910B813B812B88B :1044F00016B817B811B8E0E0F9E010A211A22FEF3A :1045000030E026A337A32FEF3FEF20A731A780830A :1045100088E8838380E1848783E087831C968C937B @@ -1121,1396 +1121,1834 @@ :10460000260A9093270A82E081B981E080930C0A00 :1046100083E08093060A86B197B1877049F090B124 :104620008F5F893011F09695FBCFE8B1F9B1908397 -:1046300081E08093AE2937C093B1892F8C7099F1B6 +:1046300081E08093AE2C37C093B1892F8C7099F1B3 :1046400092FB992790F981E0982781B181111BC0D5 :1046500080B18695911190E8892B80B926B137B148 :104660002F5F3F4F26B937B927703327232BD9F453 :10467000E8B1F9B19F012F5F3F4F28B939B9808365 :1046800081E081B910C081B1813069F4EAB1FBB138 :104690009F012F5F3F4F2AB93BB9908311B803C0E8 -:1046A00082B1809582B9FF91EF919F918F913F9157 -:1046B0002F910F900BBE0F9008BE0F900FBE0F9062 -:1046C0001F9018951F920F920FB60F92112408B6E3 -:1046D0000F9218BE0BB60F921BBE2F933F938F9372 -:1046E0009F93EF93FF9381B1823008F49DC081B115 -:1046F0008D3008F099C0E1B1F0E0EE0FFF1FEA5DE8 -:10470000FF4D0190F081E02D19948FE790E08093A8 -:10471000260A9093270A88C08E9A8EE080934008DC -:104720008FE390E08093260A9093270A85E06FC07C -:104730008E9886E081B98FEF82B914B815B8E8B1C8 -:10474000F9B1808180B970C0009B05C08E9A82B19A -:10475000809582B901C08E9887E059C0009B02C045 -:104760008E9801C08E9A80B1869580B984B195B13A -:10477000019684B995B984B195B187709927892B31 -:1047800011F488E044C024B135B186B197B128173F -:104790003907B1F52BC0EAB1FBB1309711F0808138 -:1047A00001C082B1882311F08E9A01C08E9889E0F1 -:1047B0002EC0EAB1FBB1309751F08081882311F00F -:1047C0008E9801C08E9A3196EAB9FBB908C082B1C1 -:1047D000882311F08E9801C08E9A8FEF82B924B190 -:1047E00035B186B197B12817390711F48AE00FC0A7 -:1047F000E8B1F9B1CF01019688B999B9818180B941 -:1048000086E005C08E988BE002C08E988CE081B95E -:104810000BC01092000A1092060A109240081092E3 -:10482000410881E08093AF29FF91EF919F918F9193 -:104830003F912F910F900BBE0F9008BE0F900FBEAF -:104840000F901F901895CF93DF93EEEAF9E2108254 -:104850001182E0E4F6E0128A84E08283C0E8D1E0CD -:1048600082E68E83A0E2B6E081E016968C931697DE -:1048700011968C93119796E012969C9312975196ED -:104880008C93519742E052964C9352971A961C92F1 -:104890001A9733E019963C9399E598839AE59983A2 -:1048A00090E491839683A0EBB0E012962C9112973E -:1048B000207F12962C93129712962C9112972260B9 -:1048C00012962C9320E321832683908B8683458345 -:1048D0003183E0E0F8E083E1818321E030E026A34A -:1048E00037A320A731A7E0E8F8E014868083E0E250 -:1048F000F3E01382118288E0828391E1908320911A -:104900001E2030911F20208F318FE0E8F3E09CE3E0 -:104910009283808393838183DF91CF91D8CDA0E26E -:10492000B6E01A961C921A97EEEAF9E2108211820A -:10493000E0E0F9E010821382178280E18487E0E0F2 -:10494000FAE010821382168281E08487E0E4F8E0C6 -:104950001082118216968C938E980895CF93DF93D0 -:104960008091AE29882309F47EC01092AE29C6B189 -:10497000D7B1C730D10508F471C0AE01495F5F4FB0 -:1049800093E0569547959A95E1F7E091592BF09170 -:104990005A2B6EEA7DE280E41995E0915C2BF09150 -:1049A0005D2B8781883019F483E180938B29868180 -:1049B000883019F483E180938A29E0914F2BF0919C -:1049C000502BBE018EEA9DE21995EC0194FF06C0C2 -:1049D000DF7E8EE29EE28AB99BB902C01AB81BB88C -:1049E0002097E1F1AE01495F5F4F83E0569547950F -:1049F0008A95E1F7E091592BF0915A2B6EEA7DE20E -:104A000081E41995E0915C2BF0915D2B87818930D1 -:104A100019F483E180938B298681893019F483E12D -:104A200080938A29C6B9D7B98EEA9DE288B999B927 -:104A300010926008109261088FE090E08093660801 -:104A40009093670888E090E080936A0890936B08E1 -:104A500083E28093410883E081B905C01092000A87 -:104A60001092060A34DD8091AF29882329F0109234 -:104A7000AF29DF91CF912BCDDF91CF910895CF93C7 -:104A8000DF93E0E4F6E0128A84E08283C0E8D1E0BC -:104A900082E68E83A0E2B6E081E016968C931697AC -:104AA00011968C93119796E012969C9312975196BB -:104AB0008C93519742E052964C9352971A961C92BF -:104AC0001A9733E019963C93199799E598839AE5DC -:104AD000998390E491839683C0EBD0E02A81207F74 -:104AE0002A832A8122602A8320E321832683908BD4 -:104AF000868345833183E0E0F8E093E1918321E010 -:104B000030E026A337A320A731A7E0E8F8E0148619 -:104B10009083E0E2F3E01382118298E0928341E116 -:104B2000408340911E2050911F20408F518FE0E81C -:104B3000F3E04CE3428390834383918315968C93F7 -:104B4000E0E0F9E08FE790E086A397A322A733A7E0 -:104B5000108216828CE087831092000A1092B0298E -:104B6000E3EBF9E2108212821182DF91CF91089576 -:104B700081E08093260657DCE0E0F9E0108217829E -:104B8000E0E0FAE010821782E3EBF9E21182128290 -:104B9000108208951F920F920FB60F92112408B63B -:104BA0000F9218BE0BB60F921BBE2F933F938F939D -:104BB0009F93EF93FF93E091B029F0E0EE0FFF1F7A -:104BC000E05CFF4D0190F081E02D199410928C086B -:104BD0001092000886E18A95F1F700C081E0809389 -:104BE000000883E080938C0818B88091AE2D86B9B8 -:104BF00017B882E001C083E08093B02986C0309965 -:104C000011C082B181110EC010928C081092000860 -:104C100096E19A95F1F700C081E08093000883E067 -:104C200080938C0884E0E8CF309B10C010928C08F1 -:104C30001092000886E18A95F1F700C081E0809328 -:104C4000000893E090938C0882B901C012B886B135 -:104C5000869586B984B195B1019784B995B9892BA8 -:104C600011F485E001C083E08093B02987B18F5FA4 -:104C700087B9877009F049C0E8B1EF5FE8B9F0E0A3 -:104C8000E255F24D808186B940C082B181110EC0DB -:104C900010928C081092000896E19A95F1F700C0E6 -:104CA00081E08093000883E080938C0886E0A4CFA5 -:104CB0001092000982E591E00197F1F700C0000031 -:104CC00082E08093870389E3809381038EEA9DE2EB -:104CD0008AB99BB981E090E084B995B980E886B93A -:104CE0008EB19FB12091080430910904822B932B3F -:104CF0008093B1299093B22981E08093B52918B8A7 -:104D000017B81092B02901C000C0FF91EF919F9198 -:104D10008F913F912F910F900BBE0F9008BE0F9077 -:104D20000FBE0F901F9018951F920F920FB60F9203 -:104D3000112408B60F9218BE0BB60F921BBE2F930C -:104D40003F934F935F938F939F93EF93FF931092B3 -:104D5000070A1092000A10924709109240098091A8 -:104D600081038E7F8093810384B195B187709927E9 -:104D7000892BC9F0E4B1F5B186B144B155B193E0E6 -:104D8000F695E7959A95E1F7E255F24D90E0477078 -:104D9000552728E030E0241B350B02C095958795F8 -:104DA0002A95E2F7808381E08093B4291092B52997 -:104DB0008FEF9FEF8093260A9093270A1092200A84 -:104DC0001092210A1092060A1092070A1092030A02 -:104DD00084E08093000A87E08093B029FF91EF91EF -:104DE0009F918F915F914F913F912F910F900BBEAB -:104DF0000F9008BE0F900FBE0F901F9018951F9236 -:104E00000F920FB60F92112408B60F9218BE0BB670 -:104E10000F921BBE8F93EF93FF93E0E8F3E0818145 -:104E20008F7C8183E0E0FAE088E8838381E08083FF -:104E3000FF91EF918F910F900BBE0F9008BE0F90D6 -:104E40000FBE0F901F9018951F920F920FB60F92E2 -:104E5000112408B60F9218BE0BB60F921BBE2F93EB -:104E60003F934F935F938F939F93EF93FF93809123 -:104E70006009109260091092610992E090934009D4 -:104E8000813620F0813A08F063C077C086B18695FC -:104E900086B984B195B1019684B995B9877099277F -:104EA000892B41F4EAB1FBB1CF0101968AB99BB9D4 -:104EB00086B1808384B195B180FD88C0369986C063 -:104EC0001092070A1092000A1092470910924009A6 -:104ED000809181038E7F8093810384B195B1877027 -:104EE0009927892BC9F0E4B1F5B186B144B155B128 -:104EF00093E0F695E7959A95E1F7E255F24D90E04B -:104F00004770552728E030E0241B350B02C09595EB -:104F100087952A95E2F7808381E08093B4291092E7 -:104F2000B5298FEF9FEF8093260A9093270A10925E -:104F3000200A1092210A1092060A1092070A109273 -:104F4000030A84E08093000A87E08093B0293EC082 -:104F500086B18695806886B984B195B1019684B989 -:104F600095B987709927892B41F4EAB1FBB1CF013C -:104F700001968AB99BB986B1808386B1869580688F -:104F800086B984B195B1019684B995B9877099278E -:104F9000892B41F4EAB1FBB1CF0101968AB99BB9E3 -:104FA00086B1808386B1869586B984B195B1019624 -:104FB00084B995B987709927892B41F4EAB1FBB17F -:104FC000CF0101968AB99BB986B18083FF91EF9199 -:104FD0009F918F915F914F913F912F910F900BBEB9 -:104FE0000F9008BE0F900FBE0F901F901895BF92A4 -:104FF000CF92DF92EF92FF920F931F93CF93DF93A5 -:10500000CDB7DEB7DA95CDBFDEBF8091B529882355 -:10501000F1F08EB19FB140910804509109042091A4 -:10502000B1293091B229842B952B821B930B2091AF -:105030002020309121202F5F3F4F2817390738F467 -:1050400014B815B881E08093B4291092B52918DA04 -:10505000811144C1F1D9882309F440C18091B52957 -:1050600081113CC18091B329811105C08091B4297F -:10507000882309F433C18091B029873041F48091AD -:10508000200A9091210A8532914008F427C180912D -:10509000B429882309F4A6C084B195B1892B09F4F9 -:1050A000A1C084B195B1089718F414B815B89AC086 -:1050B00044B155B1495F5F4F63E0569547956A9596 -:1050C000E1F76EEA7DE2CE0101960E9400478EEA8A -:1050D0009DE28AB99BB904B115B114B815B8C12CB9 -:1050E000D12C73E1B72EE8E0EE2EF12CC016D106DC -:1050F00008F078C0F60153E0F695E7955A95E1F788 -:1051000041E050E04C0F5D1FE40FF51F8081982FA8 -:105110009695969590838370813039F0E8F08230CF -:1051200009F059C086B1869503C086B1869580681E -:1051300086B984B195B1019684B995B987709927DC -:10514000892B09F048C0EAB1FBB1CF0101968AB9B9 -:105150009BB986B180833FC084B195B18770992790 -:10516000892BC1F0E4B1F5B186B124B135B143E08A -:10517000F695E7954A95E1F7E255F24D90E02770F4 -:105180003327A701421B530B02C0959587954A957B -:10519000E2F78083E0915C2BF0915D2B8781883072 -:1051A00011F4B0928B298681883011F4B0928A294B -:1051B00044B155B1495F5F4F93E0569547959A9535 -:1051C000E1F7E091592BF0915A2B6EEA7DE282E4EF -:1051D000199581E001C080E052E0C50ED11C882302 -:1051E00009F484CF1092B3291092B42964B175B137 -:1051F000E0914F2BF091502B8EEA9DE2199584B9E6 -:1052000095B984B195B1892B09F468C089E0809380 -:1052100081031092000A1092200A1092210A8FE74F -:1052200090E08093260A9093270A8FE590E0809380 -:10523000280A9093290A1092060A80E180930C0AAA -:1052400093E09093070A10926009109261092FEF82 -:105250003FEF209366093093670920E031E0209307 -:105260006809309369091092460980934C0981E0DE -:105270008093470981E18093800110928801109208 -:10528000800310922906E0915C2BF0915D2B8781C1 -:10529000893019F483E180938B298681893019F450 -:1052A00083E180938A2944B155B1495F5F4F83E020 -:1052B000569547958A95E1F7E091592BF0915A2B35 -:1052C0006EEA7DE283E4199581E08093B02912B8FB -:1052D000109220091092210980930009D395CDBF27 -:1052E000DEBFDF91CF911F910F91FF90EF90DF9084 -:1052F000CF90BF90089514B815B881E08093B3297A -:105300006DC81092070A1092000A10924709109275 -:105310004009809181038E7F8093810384B195B190 -:1053200087709927892BC9F0E4B1F5B186B144B1F2 -:1053300055B193E0F695E7959A95E1F7E255F24D70 -:1053400090E04770552728E030E0241B350B02C061 -:10535000959587952A95E2F7808381E08093B4291B -:105360001092B5298FEF9FEF8093260A9093270A1A -:105370001092200A1092210A1092060A1092070A2F -:105380001092030A84E08093000A87E08093B0299A -:105390001092B0291092B4291092B32944C881E028 -:1053A0008093B8291092B629089581E08093B82996 -:1053B00008950895CF92DF92EF92FF920F931F937B -:1053C000CF93DF93CDB7DEB72597CDBFDEBF8C017E -:1053D000FC0180819091B8299230F1F038F094303E -:1053E00079F120F1953009F44AC049C121E09227B2 -:1053F000292F21702093B629911102C0863219F00D -:10540000823509F03CC184E4F8018083118282E096 -:105410008093B82980E134C19091B629911102C0DE -:105420008632B1F0823509F04DC012C09091B62994 -:10543000911102C0863261F0823509F075C008C052 -:105440009091B629911102C0863211F0823539F45B -:1054500084E4F8018083118281E089270DC08033C4 -:1054600009F41BC1823A09F434C1803A09F450C1ED -:10547000803509F4F6C081E08093B82900C160E16D -:1054800070E0C8010E946C338823A1F08091582BF2 -:1054900081110BC06091B729F4E06F9FB001112416 -:1054A00044E050E0C8010E94B20E84E08093B82925 -:1054B0008AE004C084E08093B82981E0F801808309 -:1054C00084E0DEC08339B9F619821A821B821C82FD -:1054D00088E8898343E050E060E070E0CE01029606 -:1054E0000E94640EF8018181803209F4ABC08037DC -:1054F00009F048C0F801928189819813C0C0938156 -:105500008A819813BCC094818B819813B8C095810F -:105510008C819813B4C084E0808361E070E0C8019E -:105520000E94413383E02AC0853909F0A4CF44E0CA -:1055300050E064E070E0CE0101960E94640EF80134 -:105540008181803209F47EC08037E1F4F8019281D4 -:105550008981981394C093818A81981390C0948113 -:105560008B8198138CC095818C81981388C0108290 -:1055700061E070E0C8010E94413384E08093B82963 -:1055800088E17EC0E82EE2949FE0E9222EEF2E0D06 -:105590008F70F82E88E090E08F1991094FEF50E05E -:1055A0006A0102C0D594C7948A95E2F7253021F0AC -:1055B000243059F5FF20E9F044E050E0B8016E5F77 -:1055C0007F4FCE0101962D830E94F3462D81892BBA -:1055D00061F49A81898189279B8189279C81892708 -:1055E000F801968189278C2169F1243071F4F1103A -:1055F00046C044E050E0B8016E5F7F4FCE01019697 -:105600000E94F346892BF1F03AC02430C0F5E22E17 -:10561000F12CA701B8016E5F7F4FCE0101960E9469 -:10562000F346892B61F5D801AE0DBF1DE1E0F0E036 -:10563000EC0FFD1FEE0DFF1D12969C9180818927B6 -:10564000C822E9F42981F80120833A8131839B81C2 -:1056500092838C818383232792278927848388E2FE -:105660000FC0F8018181811141C062E070E0C80182 -:105670000E946C33882309F420CF1092B82980E06F -:1056800090E02596CDBFDEBFDF91CF911F910F91A6 -:10569000FF90EF90DF90CF900895F801F18062E0E5 -:1056A00070E0C8010E946C33882309F406CFFFE044 -:1056B000FF15E0F084E0F89EB001112440E150E0D5 -:1056C000C8010E94640E60E170E0C801DAD780E989 -:1056D000D7CFF801F18066E070E0C801FDD78823DC -:1056E00009F4EBCE8EEF8F0D8E3018F0F80110829A -:1056F000E7CE8091582B8111DBCEF4E0FF9EB00104 -:10570000112444E050E0C80102960E94B20ED0CEAF -:10571000F801F18062E070E0C801DED7882309F467 -:10572000CCCE8EEF8F0D8E3008F7F092B72985E042 -:10573000BDCECF93DF93EC0143E050E060E070E03A -:105740000E94640E44E050E064E070E0CE010396F5 -:10575000DF91CF910C94640E0F931F93CF93DF933F -:105760001F921F92CDB7DEB78C01FC019081818121 -:10577000892798E88927928189278A839481838160 -:1057800089279581892796818927898343E050E07D -:1057900060E070E0C8010E94B20E41E050E063E0BA -:1057A00070E0CE0102960E94B20E44E050E064E048 -:1057B00070E0C80103960E94B20E41E050E068E03C -:1057C00070E0CE0101960E94B20E0F900F90DF9113 -:1057D000CF911F910F91089581E08093D62984E0A5 -:1057E00090E08093BB299093BC2988E08093BA29EC -:1057F0001092B929089581E08093D62984E490E03D -:105800008093BB299093BC2988E08093BA29109299 -:10581000B929089581E08093D62982E490E08093AD -:10582000BB299093BC2988E18093BA291092B929A9 -:10583000089581E08093D629089508958F929F92CC -:10584000AF92BF92CF92DF92EF92FF920F931F938E -:10585000CF93DF93CDB7DEB72F97CDBFDEBF8C01DF -:105860006B018091D629853009F4C1C058F482308B -:1058700009F446C050F1833009F48BC0843009F438 -:10588000A6C0EBC5883009F45BC198F4863009F4F2 -:10589000C2C0873009F0E1C5C8010E948A3468019E -:1058A000F4E0CF0ED11C7601580128E0A20EB11C05 -:1058B000E4C0893009F4DCC28D3008F0CEC578012F -:1058C0006801B6E0CB0ED11C10C391E08927982F58 -:1058D00091709093B9293091BB292091BC29D801AE -:1058E0009C91811102C0963219F0923509F0BDC326 -:1058F000F8013083218384E08093D62980E1AEC50E -:10590000F8018081982F9D7F913411F48AE085C23F -:10591000803329F562E070E0C801DED68823E9F023 -:10592000D80111966C91B0E16B9FB001112440E158 -:1059300050E0C8010E94640E60E170E0C801A1D689 -:1059400080E98CC590EA980F923008F006C662E0B4 -:1059500070E0C801C1D6811183C581E05DC2803A83 -:1059600091F462E070E0C801B7D68823B1F3D801A2 -:1059700011968C9111978093CD2983E08093D6293D -:105980008AE08C93B0C2803509F067C5F801818147 -:105990005CC060E170E0C8019FD6882399F08091D7 -:1059A000582B81110BC06091CD29B0E16B9FB001E4 -:1059B000112440E150E0C8010E94B20E8AE0F801D3 -:1059C000808303C081E0D8018C9382E08AC29091E9 -:1059D000B9293091BB292091BC29F801808191110E -:1059E00002C0863299F0823509F047C30FC090910A -:1059F000B9293091BB292091BC29F80180819111EE -:105A000002C0863219F0823509F072C4D8013C9385 -:105A100011962C9311C09091B9293091BB292091F6 -:105A2000BC29D8018C91911102C0863211F08235C7 -:105A300031F4F8013083218381E0892708C3803560 -:105A400009F080CFD80111968C91882319F0D801E4 -:105A50001C9249C262E070E0C8013ED6882309F476 -:105A60007CCFE091592BF0915A2B40E060E070E040 -:105A700081E919951092D629F0C471D7D7019C916C -:105A80008927F70181937F01EA15FB05B1F7E091C2 -:105A9000592BF0915A2B44E0B60180EA1995D801B0 -:105AA00014969C9114978091CE29981340C0159616 -:105AB0009C9115978091CF29981339C016969C9187 -:105AC00016978091D029981332C017969C91809197 -:105AD000D12998132CC0680182EDA82E89E2B82E36 -:105AE00094E0E92EEA0C4501F501F1905F0137D70A -:105AF0008F25D6018D936D01D401EC91F0E0EC5926 -:105B0000FB4FF4905ED6D601A158BF4F8F258C93E2 -:105B1000EA10E9CFE091592BF0915A2B44E0B801FB -:105B200081EA199588E08093D62980E256C0E091F9 -:105B3000592BF0915A2B40E060E070E080EC95C169 -:105B400078014801B4E08B0E911C580108D7F5018B -:105B500090818927D5018D935D01A815B905B1F70D -:105B6000F8018081803309F048C062E070E0C8012C -:105B7000B3D58823A1F1D80111966C91B0E16B9F48 -:105B8000B001112440E150E0C8010E94640E60E1C0 -:105B900070E0C80176D5E091592BF0915A2B42E183 -:105BA000B80180E819956801E2E1CE0ED11CD70159 -:105BB0001C91D5D68127F70181937F01E12FF0E079 -:105BC000EC59FB4F1491FDD5D701A158BF4F812748 -:105BD0008C93EC14FD0459F780E990E1FDC4D2D612 -:105BE00091E08927D8018C93E091592BF0915A2BA1 -:105BF00044E0B80181EC199576C1803A71F462E015 -:105C000070E0C80169D5882351F1F8018181809342 -:105C1000CD2989E08093D62967C0803C69F462E091 -:105C200070E0C80159D58823A1F1D80111968C9153 -:105C30008093CD298BE028C0813CC1F462E070E004 -:105C4000C8014AD5882359F0F80181818093CD2974 -:105C5000BAE0FB2EF092D62995D68F2548C0E09168 -:105C6000592BF0915A2B44E0B80143C0823CE1F437 -:105C700062E070E0C80130D5882359F0D801119650 -:105C80008C918093CD298CE08093D6297BD69AE0A5 -:105C9000C2C0E091592BF0915A2B44E0B80181EC3D -:105CA000199570D691E022C0803B31F562E070E03A -:105CB000C80112D5E091592BF0915A2B44E0B8015C -:105CC0008823B9F086E819958091582B81110CC072 -:105CD000F8016181F0E16F9FB001112440E150E0D3 -:105CE0008DEB99E20E94B20E4DD69AE08927D80139 -:105CF00048CE81EC19958DC090EA980F923008F04B -:105D00008EC062E070E0C801E7D4882309F481C046 -:105D1000D80111962C911197322F3C7F8C918036AF -:105D200019F08AE390E002C080E390E06C01B0E1FA -:105D30003B9FC00CD11C112427FF0AC0207FE0E14B -:105D40002E9F800D911D11249C0120543F4F69010D -:105D5000E091592BF0915A2B42E0B80180E9199556 -:105D600064E0CE0107960E94A20D8091572B44E07B -:105D700050E0873019F463E070E002C060E070E04A -:105D8000CE010B960E94640E46E050E0B601CE01B3 -:105D900001960E94640E8F818093CE29888580931E -:105DA000CF2989858093D0298A858093D12960E481 -:105DB00070E08EEC99E2F9D58091CE298093D229BA -:105DC0008091CF298093D3298091D0298093D429A1 -:105DD0008091D1298093D52960E270E082ED99E22B -:105DE000E4D5AE01495F5F4FBE01655F7F4FCE01D5 -:105DF000019620D5FE01379684E08E0F9191D70150 -:105E00009D937D018E13FACF87E08093D62980E29F -:105E100025C3B8D591E08927F801808364C0803517 -:105E2000B1F48181811113CE62E070E0C80154D4D5 -:105E3000882309F492CD1092D629E091592BF09144 -:105E40005A2B40E060E070E081E9199506C3A60195 -:105E5000495F5F4FA3E056954795AA95E1F7E0911A -:105E6000592BF0915A2BB80182E9199581E0EFC0C6 -:105E700078016801B2E1CB0ED11C71D5F701908198 -:105E80008927D7018D937D01AC15BD05B1F760E180 -:105E900070E0C80121D4E091592BF0915A2B88234E -:105EA000B1F042E1B80181E819958091582B811138 -:105EB0000BC06091CD29B0E16B9FB001112440E18E -:105EC00050E0C8010E94B20E5DD59AE081C344E063 -:105ED000B80181EC199556D591E08927D8018C93AA -:105EE00088E08093D62984E0B9C239D5F701908142 -:105EF0008927D7018D937D01AC15BD05B1F764E00D -:105F000070E0C801E9D3882309F4A4C06091CD29C9 -:105F1000B0E16B9FB001112440E150E08DEB99E2BC -:105F20000E94640E9091BD298091C129809598139B -:105F30004DC38091C529981349C32091BE298091F2 -:105F4000C2298095281342C38091C62928133EC3D5 -:105F5000C090BF298091C3298095C81237C3809112 -:105F6000C729C81233C38091C0293091C429309504 -:105F700083132CC33091C829831328C34091C929A6 -:105F80003091CA293095431321C33091CB29431353 -:105F90001DC33091CC293095431318C3D8013C91CF -:105FA00011964C91119712968C901297912CA12CCE -:105FB000B12C540199248824942A832A13963C9165 -:105FC000B32AD12CE12CF12C7601DD24CC24D22A69 -:105FD000C92AF82A8091D6298B3009F0DCC2E091D9 -:105FE000592BF0915A2B46E0B80185E81995C8184D -:105FF000D908EA08FB08C092BD2933272F2D1E2D92 -:106000000D2D0093BE29A701662777274093BF294E -:106010008F2D9927AA27BB278093C029EC2DE095C7 -:10602000E093C129E02FE095E093C229E42FE095A9 -:10603000E093C329E82FE095E093C429C092C529D5 -:106040000093C6294093C7298093C82988E080938C -:10605000D62903C2E091592BF0915A2B44E0B801A4 -:1060600081EC19958FD491E0B3C2903409F0F5C159 -:1060700082E08093D6298AE03ACE833909F0FACCBF -:106080008091572B873009F0A1C043E050E060E0D9 -:1060900070E0CE0102960E94640E88E88983F801C0 -:1060A0009181903219F0903761F024C0D80180833B -:1060B0003A8131832B8122839C81938323278227FA -:1060C00039C1F8018281883809F0C7C193818A817A -:1060D0009813C3C194818B819813BFC195818C8122 -:1060E0009813BBC184E0808361E070E0C801C9D22D -:1060F00085E03DC1E92EE2944FE0E4222EEF2E0D23 -:106100009F70F92E88E090E08F1991094FEF50E0D1 -:106110006A0102C0D594C7948A95E2F7253021F030 -:10612000243061F5FF20F1F044E050E0B8016E5FEB -:106130007F4FCE0101962F870E94F3462F85892B32 -:1061400069F49A818B81892798E889279C8189271E -:10615000D80116969C9189278C2181F1243071F405 -:10616000F1107BC144E050E0B8016E5F7F4FCE017B -:1061700001960E94F346892B09F16FC1243008F083 -:106180006CC1E22EF12CA701B8016E5F7F4FCE01EA -:1061900001960E94F346892B09F05FC1D801AE0D2C -:1061A000BF1DE1E0F0E0EC0FFD1FEE0DFF1D1296AC -:1061B0009C9180818927C82209F04FC198E8F80195 -:1061C00090833A8131832B8122830CC144E050E0DB -:1061D00060E070E0CE0101960E94640E9091BA29B1 -:1061E000D80111968C91803209F4F5C08037D9F42A -:1061F000D80112962C911297898128132EC11396DB -:106200002C9113978A81281328C114962C911497E6 -:106210008B81281322C115962C9115978C812813F8 -:106220001CC19C939FC0E82EE2943FE0E3222EEF36 -:106230002E0D8F70F82E88E090E08F1991094FEFA6 -:1062400050E06A0102C0D594C7948A95E2F72530E0 -:1062500021F0243061F5FF20F1F044E050E0B80176 -:106260006E5F7F4FCE0101962F870E94F3462F85E8 -:10627000892B69F49A81898189279B8189279C814F -:106280008927F801968189278C2109F442C024309E -:1062900071F4F110E2C044E050E0B8016E5F7F4F4E -:1062A000CE0101960E94F346892B99F1D6C0243085 -:1062B00008F0D3C0E22EF12CA701B8016E5F7F4F2A -:1062C000CE0101960E94F346892B09F0C6C0D80181 -:1062D000AE0DBF1DE1E0F0E0EC0FFD1FEE0DFF1D68 -:1062E00012969C9180818927C82209F0B6C011C0FE -:1062F000853909F0BFCB44E050E063E070E0CE01A7 -:1063000001960E94640E9091BA29F8018181803231 -:10631000A9F42981D8012C933A8111963C931197C5 -:106320009B8112969C9312978C8113968C93139752 -:1063300023279227892714968C935AC08037D9F443 -:10634000F80122818981281388C023818A8128133A -:1063500084C024818B81281380C025818C812813DF -:106360007CC0908361E070E0C8018BD186E08093AF -:10637000D62988E173C0E82EE2942FE0E2222EEFC6 -:106380002E0D8F70F82E88E090E08F1991094FEF55 -:1063900050E06A0102C0D594C7948A95E2F725308F -:1063A00049F544E050E0B8016E5F7F4FCE010196A1 -:1063B0002F870E94F3462F85892B09F59A818981C1 -:1063C00089279B8189279C818927D80116969C91D2 -:1063D00089278C21A1F42981F80120833A81318316 -:1063E0009B8192838C8183832327922789278483AF -:1063F00088E234C0243099F4FF2029F0D2CF243031 -:1064000071F4F1102AC044E050E0B8016E5F7F4F94 -:10641000CE0101960E94F346892BE9F21EC024307A -:10642000E0F4E22EF12CA701B8016E5F7F4FCE01A0 -:1064300001960E94F346892B81F4D801AE0DBF1D51 -:10644000E1E0F0E0EC0FFD1FEE0DFF1D12969C91B8 -:1064500080818927C82209F4BECF80E090E0BCC0CB -:10646000F8012181322F3C7F8081803619F08AE348 -:1064700090E002C080E390E06C01F0E13F9FC00C2F -:10648000D11C112427FF0AC0207F30E1239F800DFB -:10649000911D1124DC01A054BF4F6D01E091592BD7 -:1064A000F0915A2B42E0B80180E919957E01B7E0DE -:1064B000EB0EF11C64E0C7010E94A20D8091572BE6 -:1064C00044E050E0873019F463E070E002C060E01F -:1064D00070E0CE010B960E94640E46E050E0B601DB -:1064E000CE0101960E94640E8F818093CE2988850B -:1064F0008093CF2989858093D0298A858093D1295B -:1065000060E470E08EEC99E250D28091CE298093C5 -:10651000D2298091CF298093D3298091D02980934B -:10652000D4298091D1298093D52960E270E082ED51 -:1065300099E23BD287E08093D629D801F70184E025 -:106540008E0D91919D938E13FCCFA701BE01655FC7 -:106550007F4FCE0101966ED15ACC982F9F77903302 -:1065600029F0803A19F0805C833078F481E08093E0 -:10657000D62984E0F8018083E091592BF0915A2BC1 -:1065800040E060E070E082EC36CBE091592BF09176 -:106590005A2B40E068CC8A3069F4E091592BF09195 -:1065A0005A2B46E0B80184E81995C80CD91CEA1C9E -:1065B000FB1C21CD8C3009F01ECDE091592BF091C0 -:1065C0005A2B46E0B80187E8199515CDDBD196E046 -:1065D0008927F801808384CC2F96CDBFDEBFDF9161 -:1065E000CF911F910F91FF90EF90DF90CF90BF90D0 -:1065F000AF909F908F900895CF93DF932091572B6A -:10660000273071F4EC0143E050E060E070E00E945C -:10661000640E44E050E063E070E0CE01039604C0F5 -:1066200044E050E060E070E0DF91CF910C94640EA4 -:10663000CF93DF931F92CDB7DEB72091572B273032 -:1066400029F447E050E060E070E015C0FC013181C2 -:10665000208123273281232733812327298344E084 -:1066600050E060E070E00E94B20E41E050E064E073 -:1066700070E0CE0101960E94B20E0F90DF91CF9193 -:10668000089520E42093D00026EC2093D500209399 -:10669000D40021E02093D000DC01680F791FA617F9 -:1066A000B70741F0ED91F0E0EC59FA4FE491E09337 -:1066B000D300F5CFE091D500F0E0EC59FA4FE4912A -:1066C000EC93E091D400F0E0EC59FA4FE49111968C -:1066D000EC931092D000089520E42093D00026EC93 -:1066E0002093D5002093D40021E02093D000DC013A -:1066F000680F791FA617B70741F0ED91F0E0EC594C -:10670000FA4FE491E093D300F5CFE091D500F0E0AB -:10671000EC59FA4FE4918C918E130AC0E091D400A9 -:10672000F0E0EC59FA4FE49181E011969C919E13B0 -:1067300080E01092D00081700895F091DA29A09144 -:10674000DB294091DC29E091D7293091D82920918B -:10675000D9295A2F50719F2F917E9527542F50720F -:1067600095275E2F54799527532F53779527522FCE -:106770005A739527592F52955F709527592F569523 -:1067800056959527B92FB69550E060E070E0BA01B4 -:10679000552744275A2B4F2B769567955795479544 -:1067A0009B27917098136068E093DA293093DB2976 -:1067B0002093DC294093D7295093D8296093D92975 -:1067C0000895CF93DF9387ED99E2DC011196EC9168 -:1067D0001197CE2FCF70D0E0C059DF4D2C91A22F52 -:1067E000A295AF70B0E0A059BF4D38892C91232BF2 -:1067F000E295EF70F0E0E059FF4D30A1232BDC0172 -:106800001296EC91AE2FAF70B0E0A059BF4DD0966C -:106810008C91922F982BE295EF70F0E0E055FF4DB0 -:106820008081E92FE82BF0E0E05BFF4D8081DF9174 -:10683000CF910895CF92DF92EF92FF920F931F9323 -:10684000CF93DF93FB01EA01BC016F5F7F4F07ED40 -:1068500019E2BAEDEB2EB9E2FB2E53E05E0DCB014F -:106860000197DC012C91DB018C9130E0382B88E022 -:1068700090E040E04695969520FD406821FD9068A7 -:1068800036952795369527958150A1F7D7014D93D9 -:106890007D01D8019D938D016E5F7F4F5E11DFCF2B -:1068A000918189819827C2808A81C826D12CE12CC8 -:1068B000F12C7601DD24CC24D92A90818881892786 -:1068C000C82A93818B818927F82A10E27ADF082F62 -:1068D0008C2D817032DFF694E794D794C79400230F -:1068E00011F06894F7F8115089F788818C25888316 -:1068F00089818D2589838A818E258A838B818F2545 -:106900008B83DF91CF911F910F91FF90EF90DF90DC -:10691000CF900895CF92DF92EF92FF92CF93FC0138 -:106920008181C280D12CE12CF12C7601DD24CC2494 -:10693000D82A8081C82A8381F82AC0E242DF9C2DB0 -:1069400091708927FADEF694E794D794C794C150E2 -:10695000A9F7CF91FF90EF90DF90CF9008951F930C -:10696000CF93DF93D8E0C0E02CDF182F80E0E5DE86 -:10697000C6951111C068D150B9F78C2FDF91CF9116 -:106980001F9108951F93CF93DF93D4E0C0E019DFE8 -:10699000182F80E0D2DEC6951111C860D150B9F72A -:1069A0008C2FDF91CF911F910895FC01CB010197AE -:1069B00028F14281242F2D72322F32953F702327E8 -:1069C000322F369536952327322F3695A18150E008 -:1069D00060E070E0BA01552744275A2BA0814A2B6A -:1069E000A3817A2B7695679557954795232720FDA8 -:1069F00070684083518362837383D9CF0895AF92C7 -:106A0000BF92CF92DF92EF92FF920F931F93CF939B -:106A1000DF936730710509F451C09B01277033275C -:106A2000232B09F04EC0EB016C015B0183E0B694AF -:106A3000A7948A95E1F77B0196E0F694E7949A95FE -:106A4000E1F7EA0CFB1CEC0CFD1C8501015011095F -:106A50000C0D1D1DA701401B510B60E070E0C8012B -:106A600001960E941A470C151D0520F1D801EC91E2 -:106A7000F0E0EC59FB4F44919701D7010A171B072F -:106A800068F48C91982F990FF90182919F01881FCA -:106A90008827881F892B8C931197F0CF11968C91A2 -:106AA00011978E7FE42FE170E82B1196EC93015043 -:106AB0001109D9CFC5018C0F9D1F04C087E090E05C -:106AC00001C0CB01DF91CF911F910F91FF90EF900B -:106AD000DF90CF90BF90AF900895EF92FF920F9309 -:106AE0001F93CF93DF93EC01CB0167307105D1F198 -:106AF00069E070E00E944A46DE0120E030E088E074 -:106B000090E02617370739F1F90143E0F695E7954C -:106B10004A95E1F7E20FF31FEC0FFD1F408150E0B3 -:106B2000890107701127002E02C0559547950A94D8 -:106B3000E2F74C930115110551F0E1817C01E01A57 -:106B4000F10A01C0EE0FEA94EAF74E2B4C932F5F47 -:106B50003F4F1196D6CFC90123E0880F991F2A9580 -:106B6000E1F702C087E090E0DF91CF911F910F9194 -:106B7000FF90EF900895CF93DF93FC0161157105AD -:106B800011F18081869580839B01295F3F4F83E0CF -:106B9000369527958A95E1F7DF0141E050E04217ED -:106BA000530770F4C1919081D0E89D9FC0011124DA -:106BB0008C2B8D938081869580834F5F5F4FEFCFC5 -:106BC000CB01019702C080E090E0DF91CF91089562 -:106BD000EF92FF920F931F93CF93DF93EC01CB01C2 -:106BE0006730710509F442C069E070E00E944A46CE -:106BF00020E030E088E090E026173707B9F1D901AE -:106C000043E0B695A7954A95E1F7A20FB31FA901F6 -:106C100047705527AC0FBD1FEC91F0E0042E02C069 -:106C2000F595E7950A94E2F74115510559F011964B -:106C30000C9111977C01E41AF50A01C0000FEA9447 -:106C4000EAF7E02BF0E0EC59FB4FE4911196AC91A0 -:106C5000B0E08D0102C0159507954A95E2F7A801AD -:106C60004E2740FD05C02F5F3F4FC6CF81E001C0DA -:106C700080E0DF91CF911F910F91FF90EF900895E9 -:106C800010923D2A089510923D2A1092DD2910920B -:106C90003E2A0895F8DF0E94812910923D2A089526 -:106CA00008950895DC0123E633E66150E8F04D9144 -:106CB000942F922780E1989FA00111244927E42F67 -:106CC000F0E042954F70232F3327C9018427AC0190 -:106CD0003E2F22272427352743E0EE0FFF1F4A953A -:106CE000E1F72E273F27E1CFC90108958F929F92A8 -:106CF000AF92BF92CF92DF92EF92FF920F931F93CA -:106D0000CF93DF93CDB7DEB7C154D240CDBFDEBF46 -:106D10008C016B018091DD29833009F440C138F486 -:106D2000813069F0823009F4B5C00C94D73E8430CC -:106D300009F4B3C2853009F4D8C40C94D73EE0906E -:106D40003F2BF090402BE114F104C1F0A701495F03 -:106D50005F4F23E0569547952A95E1F76FE37AE276 -:106D6000C8010E94004760913F2B7091402BC801E1 -:106D700046DE10923F2B1092402BB5C46115710571 -:106D800009F4AAC0C801F7DE5C01BC01C80120DF1C -:106D9000D82EB501C801A1DE5C019C01295F3F4FDF -:106DA000A901440F551F93E0569547959A95E1F731 -:106DB0004A5F5F4F4138510538F060EC70E2CE0118 -:106DC00001960E942C4791C0A3E036952795AA957D -:106DD000E1F7A80160E870E0CE0101960E94BB0DCA -:106DE0008C01CF5FDD4FB882C150D240CE5FDD4F06 -:106DF000A882C250D24083E691E29F938F93B0E87D -:106E0000AB2EB12CC501801B910B9F938F9381E01A -:106E100090E08C0F9D1F800F911F9F938F930E9476 -:106E20003347080F191FB501601B710B22E030E0DA -:106E3000AE014F5F5D4F81E090E08C0F9D1F800F92 -:106E4000911F0E94BB0D800F911F0F900F900F900C -:106E50000F900F900F90A501481B590B21E030E0D7 -:106E60002C0F3D1F280F391FD11003C08FEC90E26B -:106E700002C08EED90E29F938F935F934F933F9369 -:106E80002F930E9433470F900F900F900F900F9009 -:106E90000F902BC0E0903F2BF090402BE114F104B9 -:106EA000C1F0A701495F5F4FF3E056954795FA950A -:106EB000E1F76FE37AE2C8010E94004790913F2B0F -:106EC0008091402B10923F2B1092402BE92EF82EF0 -:106ED00070C76115710591F488E0E9E7F1E2DE0120 -:106EE000119601900D928A95E1F71092DD29BE016D -:106EF0006F5F7F4F85E60E947C215BC79B01295F06 -:106F00003F4F73E0369527957A95E1F7A80160E841 -:106F100070E0CE0101960E94BB0D8C01CF5FDD4F6A -:106F2000D882C150D240CE5FDD4FC882C250D2401D -:106F300083E691E29F938F93E0E8CE2ED12CC60199 -:106F4000801B910B9F938F9381E090E08C0F9D1F8E -:106F5000800F911F9F938F930E943347800F911F43 -:106F6000B601681B790B22E030E0AE014F5F5D4F48 -:106F7000A1E0B0E0AC0FBD1F8A0F9B1F0E94BB0DAC -:106F80001092DD29BE016F5F7F4F85E60E947C2154 -:106F90000F900F900F900F900F900F900AC7809155 -:106FA0003E2AB0903D2A882331F0B1E0BB1508F4A9 -:106FB00055C110923E2AE5E0EB15B8F0F3E0BF169C -:106FC00008F040C021E02B15C8F081E090E08093EC -:106FD00020209093212082E5D8018C9382E0809339 -:106FE0003D2A67E0E62EF12C3BC138E03B1508F066 -:106FF000A8C08AE0B81609F4F5C030C1B3E1CB16D9 -:10700000D10408F4B9C0B601C801B5DD7C01BC01EA -:10701000C801DEDD882319F1B701C8015EDDF80182 -:10702000818190E0982F88272081822B80932F2ABE -:107030009093302A83E9808380E2818383E0809388 -:107040003D2ABCC0B601C80196DD7C01BC01C80167 -:10705000BFDD882321F0F8E0EF16F10488F41092E8 -:107060003D2AC701089667E070E00E944A46462F15 -:10707000E091592BF0915A2BB80181EC1995B8C0C9 -:10708000B701C8012ADDD8012C9111968C91119776 -:10709000822712969C911297892713969C91139799 -:1070A000892714969C911497891366C08B2D90E0C4 -:1070B0000397283881F49C01220F331F820F931FFE -:1070C000FC01EE5CF54D11962D913D914C91208384 -:1070D0003183428312C0FC01EE0FFF1F8E0F9F1FF2 -:1070E0009C012E5C354DF80180819181A281B38194 -:1070F000F90180839183A283B38345E050E0B80116 -:10710000C80102960E940947F3E0BF1629F024E067 -:10711000B21621F087E903C083E901C085E9D801EF -:107120008C9380E711968C9367E0C801BBDDF80172 -:107130008783908783E08B0D80933D2A68E470E01D -:1071400089C0F9E0CF16D104B8F0B601C80113DD4B -:107150007C01BC01C8013CDD811111C0C70108964A -:1071600067E070E00E944A46462FE091592BF0916B -:107170005A2BB80181EC199510923D2A39C0B701FC -:10718000C801ABDC63E0C8018DDD7C01892BA1F770 -:10719000D8018C9182FF15C0B8E0BB1691F0E6E0F3 -:1071A000BE1611F087E901C085E9D8018C9380E211 -:1071B00011968C93BA94BA94B0923D2A60E170E033 -:1071C00049C081E080933E2A8B2D90E00697B82E2F -:1071D000BB0C8B0D8C5F80933C2AF80180818093DF -:1071E000312A3EC0C114D10431F481E080933D2A9C -:1071F0000E947B2933C0B601C801BDDC7C01BC0103 -:10720000C801E6DC81110FC0C701089667E070E095 -:107210000E944A46462FE091592BF0915A2BB80113 -:1072200081EC199508C0B701C80157DC63E0C801BB -:1072300039DD892BD1F282ECD8018C9361E0C80151 -:1072400031DDF80181839283B0923D2A10923E2A6B -:1072500068E170E0C801D3DB7C0102C0E12CF12CB5 -:1072600080913E2A882309F4A4C520913C2A30E06D -:1072700042E35AE264E170E0CE0101960E94BB0D48 -:10728000BE016F5F7F4F85E60E947C2110923E2AEF -:107290001092DD290E9413228AC580913E2AB09067 -:1072A0003D2A882331F0F1E0FB1508F451C110921A -:1072B0003E2A25E02B15B8F033E0B31608F043C0A2 -:1072C00081E08B15C8F081E090E0809320209093BE -:1072D000212082E5F801808382E080933D2AE7E067 -:1072E000EE2EF12C37C1A8E0AB1508F0A4C0BAE02F -:1072F000BB1609F4F1C02CC1F3E1CF16D10408F498 -:10730000B5C0B601C80137DC7C01BC01C80160DC36 -:10731000882331F1B701C801E0DBD80111968C91C7 -:10732000119790E0982F88272C91822B80932F2AF9 -:107330009093302A83E98C9380E211968C9383E0BA -:1073400080933D2AB5C0B601C80115DC7C01BC01A3 -:10735000C8013EDC882321F0B8E0EB16F10488F484 -:1073600010923D2AC701089667E070E00E944A46E5 -:10737000462FE091592BF0915A2BB80181EC1995C9 -:10738000B1C0B701C801A9DBF80120818181822742 -:1073900092818927938189279481891367C08B2DD6 -:1073A00090E00397283889F49C01220F331F820F45 -:1073B000931FFC01EE5CF54DD80111962D913D9186 -:1073C0004C9120833183428312C0FC01EE0FFF1FDA -:1073D0008E0F9F1F9C012E5C354DF801808191819D -:1073E000A281B381F90180839183A283B38345E0B5 -:1073F00050E0B801C80102960E940947F3E0BF16A9 -:1074000029F024E0B21621F087E903C083E901C026 -:1074100085E9D8018C9380E711968C9367E0C801C9 -:1074200041DCF8018783908783E08B0D80933D2AB0 -:1074300068E470E089C0F9E0CF16D104B8F0B60175 -:10744000C80199DB7C01BC01C801C2DB811111C0FC -:10745000C701089667E070E00E944A46462FE09117 -:10746000592BF0915A2BB80181EC199510923D2AB5 -:1074700039C0B701C80131DB63E0C80113DC7C010E -:10748000892BA1F7D8018C9182FF15C0B8E0BB16FB -:1074900091F0E6E0BE1611F087E901C085E9D80158 -:1074A0008C9380E211968C93BA94BA94B0923D2A50 -:1074B00060E170E049C081E080933E2A8B2D90E02E -:1074C0000697B82EBB0C8B0D8C5F80933C2AF8017D -:1074D00080818093312A3EC0C114D10431F481E00F -:1074E00080933D2A0E947B2933C0B601C80143DB4B -:1074F0007C01BC01C8016CDB81110FC0C70108967B -:1075000067E070E00E944A46462FE091592BF091C7 -:107510005A2BB80181EC199508C0B701C801DDDA12 -:1075200063E0C801BFDB892BD1F282ECD8018C93D8 -:1075300061E0C801B7DBF80181839283B0923D2AF4 -:1075400010923E2A68E170E0C80159DA7C0102C05D -:10755000E12CF12C80913E2A882309F42AC4F09072 -:107560001E2AFF20A9F1B601C80105DB5C010097C6 -:1075700029F410921E2A10923E2A42C0823A9105A6 -:1075800040F0BC01C80124DB91E08927C82ED12C32 -:1075900003C0CC24C394D12CB501C8019EDACD28F8 -:1075A00029F462E1C8017EDB892B29F0ACEFAF0D35 -:1075B000A0931E2A2AC024E0F29ED0011124A253D7 -:1075C000B64D80E1F80101900D928A95E1F71DC05A -:1075D00042E050E06BE371E1CE0101960E94D24699 -:1075E000EEE3F1E1E49120912F2A3091302A898154 -:1075F0009A812817390721F48091312A8E1729F0B2 -:1076000010923D2A0E947B29D2C320911E2A20314C -:1076100009F04DC010923E2A10921E2A1092DD29C8 -:1076200020E130E04EED59E267E870E0CE010196CE -:107630000E94BB0D63E671E2CE0181960E942C4749 -:1076400020E130E04EEE59E265E670E0CE0183962F -:107650000E94BB0D63E671E2CE018D5B9F4F0E94DD -:107660002C4720E130E04EEF59E263E470E0CE01B8 -:107670008B5B9F4F0E94BB0D63E671E2CE018B597D -:107680009F4F0E942C4720E130E04EE05AE261E239 -:1076900070E0CE0189599F4F0E94BB0D0E941322BA -:1076A000BE016F5F7F4F85E60E947C2180C380E32F -:1076B000D8018C9311962C9362E0C801CF5BDD4F0B -:1076C0002883C154D240EEDAF80182839383CF5BE2 -:1076D000DD4F2881C154D2402C5F20931E2A60E2E6 -:1076E00070E0C8018CD97C0164C380913E2AB090BF -:1076F0003D2A882331F0F1E0FB1508F451C11092C6 -:107700003E2A25E02B15B8F033E0B31608F043C04D -:1077100081E08B15C8F081E090E080932020909369 -:10772000212082E5F801808382E080933D2A37E0C2 -:10773000E32EF12C37C1A8E0AB1508F0A4C0BAE0E5 -:10774000BB1609F4F1C02CC1F3E1CF16D10408F443 -:10775000B5C0B601C8010FDA7C01BC01C80138DA36 -:10776000882331F1B701C801B8D9D80111968C919D -:10777000119790E0982F88272C91822B80932F2AA5 -:107780009093302A83E98C9380E211968C9383E066 -:1077900080933D2AB5C0B601C801EDD97C01BC017A -:1077A000C80116DA882321F0B8E0EB16F10488F45A -:1077B00010923D2AC701089667E070E00E944A4691 -:1077C000462FE091592BF0915A2BB80181EC199575 -:1077D000B1C0B701C80181D9F80120818181822718 -:1077E00092818927938189279481891367C08B2D82 -:1077F00090E00397283889F49C01220F331F820FF1 -:10780000931FFC01EE5CF54DD80111962D913D9131 -:107810004C9120833183428312C0FC01EE0FFF1F85 -:107820008E0F9F1F9C012E5C354DF8018081918148 -:10783000A281B381F90180839183A283B38345E060 -:1078400050E0B801C80102960E940947F3E0BF1654 -:1078500029F024E0B21621F087E903C083E901C0D2 -:1078600085E9D8018C9380E711968C9367E0C80175 -:1078700019DAF8018783908783E08B0D80933D2A86 -:1078800068E470E089C0F9E0CF16D104B8F0B60121 -:10789000C80171D97C01BC01C8019AD9811111C0FC -:1078A000C701089667E070E00E944A46462FE091C3 -:1078B000592BF0915A2BB80181EC199510923D2A61 -:1078C00039C0B701C80109D963E0C801EBD97C010F -:1078D000892BA1F7D8018C9182FF15C0B8E0BB16A7 -:1078E00091F0E6E0BE1611F087E901C085E9D80104 -:1078F0008C9380E211968C93BA94BA94B0923D2AFC -:1079000060E170E049C081E080933E2A8B2D90E0D9 -:107910000697B82EBB0C8B0D8C5F80933C2AF80128 -:1079200080818093312A3EC0C114D10431F481E0BA -:1079300080933D2A0E947B2933C0B601C8011BD920 -:107940007C01BC01C80144D981110FC0C701089650 -:1079500067E070E00E944A46462FE091592BF09173 -:107960005A2BB80181EC199508C0B701C801B5D8E8 -:1079700063E0C80197D9892BD1F282ECD8018C93AE -:1079800061E0C8018FD9F80181839283B0923D2ACA -:1079900010923E2A68E170E0C80131D87C0102C033 -:1079A000E12CF12C80913E2A882309F402C28091B7 -:1079B0003D2A9AEF980F933008F04EC0D801FC9002 -:1079C000F5FAFF24F0F810921F2AE6E0AE2EE0E16F -:1079D000BE2EE12C47E650E0B501CE0101960E9493 -:1079E000D2468B81882349F029813A8180912F2AC0 -:1079F0009091302A28173907B9F48D81882329F00E -:107A00009C818091312A98130FC08F89882311F0AF -:107A1000FF2051F0E0911F2A81E08E0F80931F2AF2 -:107A2000F0E0E05EF54DE082E394B7E6AB0EB11C0A -:107A3000EFE0EE12CFCFFF2009F493C080EED80123 -:107A40008C9380E811968C9362E0C8012BD9F801E1 -:107A50008283938389E0A6C0893009F082C0B60191 -:107A6000C80189D87C01BC01C801B2D881110FC0FE -:107A7000C701089667E070E00E944A46462FE091F1 -:107A8000592BF0915A2BB80181EC1995BEC0B70162 -:107A9000C80123D86C01D8016C91262F30E073E027 -:107AA000969587957A95E1F702972817390729F473 -:107AB0006E5FC801F7D8892B69F082ECF8018083EA -:107AC00061E0C801EFD8D80111968C9311971296F6 -:107AD0009C93A4C0F12C67E6E62E5801FFEFAF1A85 -:107AE000BF0A80911F2AF816E0F5EF2DF0E0E05E66 -:107AF000F54D6081E69EB00111246A5F7F4E47E636 -:107B000050E0CE0101960E94D2468F89882339F138 -:107B10004E8950E0F801808190E00197481759079D -:107B200039F4B501CE0106960E94F346892BB9F0CF -:107B300020911F2A422F50E0415051093F2D832FA1 -:107B400090E0841795073CF4FC01E05EF54D8181DF -:107B500080833F5FF4CF215020931F2AFA94F3943F -:107B6000C0CF80913D2A9AEF980F9430F0F4909115 -:107B70001F2A20E23AE2F9018E2F821B891708F0B2 -:107B800069C0819184508230B8F782E0D8018C932B -:107B900080E611968C9362E0C80184D8F801828354 -:107BA00093838BE080933D2A9ACD8B3009F052C0AD -:107BB000C114D10409F44CC0B601C8010E94BB3500 -:107BC0007C01BC01C80104D881110FC0C70108960F -:107BD00067E070E00E944A46462FE091592BF091F1 -:107BE0005A2BB80181EC19950EC0B701C8010E944B -:107BF0006D3553E0969587955A95E1F7682FC80142 -:107C000051D8892B99F010921F2A82ECD8018C93BD -:107C100061E0C80147D8F801818392838AE08093AC -:107C20003D2A10923E2A68E170E05BCDD80115969E -:107C30008C91882331F0813059F480931F2A85E09C -:107C400004C081E080931F2A84E08093202A02C030 -:107C500010921F2A80911F2A811103C06AEE70E2E0 -:107C600013C08130A9F46091202AB7E66B9FB00160 -:107C70001124635D7F4E40E450E0CE0101960E94E6 -:107C8000D246BE016F5F7F4F85E60E947C2168C0AF -:107C9000912C80E090E000E010E027E6822E7E014B -:107CA0003FEFE31A3DEFF30A3DEFC32E30E2D32E50 -:107CB000A12C42E0B42E20911F2A921680F50130AB -:107CC000E2E01E0720F0081B190BF12C2EC0E92D55 -:107CD000F0E0E05EF54D6081869EB0011124635DA9 -:107CE0007F4E40E450E0C7010E94D246FF92EF92DF -:107CF000DF92CF92C501801B910B9F938F9381E000 -:107D000090E08C0F9D1F800F911F9F938F930E9477 -:107D10003347080F191F9394CDBFDEBFCCCF01307E -:107D2000A2E01A0780F6FF24F394EDEFFFEFEC0FCB -:107D3000FD1FE00FF11F8EE28083EEEFFFEFEC0FEF -:107D4000FD1FE00FF11F1082BE016F5F7F4F85E6C0 -:107D50000E947C21F11004C084E091E20E941B1873 -:107D600086E691E20E941B1862E070E08FE29AE2E0 -:107D70000E949A218DE691E20E941B1860913C2A94 -:107D800070E082E39AE20E949A2183E791E20E94E6 -:107D90001B1861E070E081E39AE20E949A21109240 -:107DA000DD2910921F2A0E94132210923E2AE12CF4 -:107DB000F12CC701CF5BDD4FCDBFDEBFDF91CF918F -:107DC0001F910F91FF90EF90DF90CF90BF90AF90F9 -:107DD0009F908F900895FF920F931F93CF93DF93FF -:107DE000CDB7DEB7EA97CDBFDEBF03EB1EE288E07A -:107DF000F82EF00E91D2F80181938F01FE12FACF86 -:107E00000E94CF1804D3882309F4F7C08091B32EC1 -:107E10009091B42E953009F46FC030F4913069F12F -:107E200068F0933051F1E9C0983009F4C2C099303C -:107E300009F4C8C0963009F0E0C072C0803891F0F3 -:107E4000823809F0DAC08091B72E8F7085D2E09128 -:107E5000BD2EF091BE2E118112FB112710F980E08A -:107E60007BD206C01091AF2E8091B02E811112608E -:107E7000E8D2812F61D280E0A1C0282F2D7F09F0A8 -:107E8000BCC0882319F0823061F0B7C08091B52E54 -:107E9000813009F0B2C0933009F080E08093B02EB9 -:107EA00027C08091B52E811123C0E091B72E1E2FDF -:107EB0001F7009F4A2C0812F4FD28091B42E83305D -:107EC00011F4EBD215C0E091BD2EF091BE2E818150 -:107ED0008B7F818324E8129FF0011124EF5FF04D26 -:107EE0001082E091BD2EF091BE2E80818E7F808326 -:107EF00080E032D2A6D264C081117FC01091B52E2D -:107F00001F779FD2A1D35DD28823E9F31093C304D6 -:107F1000111102C082E001C083E08093B22E6DC0D7 -:107F20008058823008F069C08091B52E9091B62EAD -:107F30008C3DE3E09E0761F583E08A838AE38983D1 -:107F40004FB7F894DE01139620E038E052E05093EA -:107F5000CA01E32FF0E0E4911092CA0120FF03C0B0 -:107F6000E295EF703F5FEF708E2F90E0EA3010F0F7 -:107F7000C79601C0C0968D939D932F5F2C3139F722 -:107F80004FBF5FD26AE370E0CE010196A3D00FC06D -:107F9000AE014F5F5F4F6091B72E0E94270C8C019E -:107FA000892B59F14ED2B80189819A810FD1A5D17F -:107FB00024C0803811F545D28091AE2EBDD184D138 -:107FC00043D31BC0811119C08091B52E8230A8F413 -:107FD00038D28091B52E8093AE2E36D38091AE2EBE -:107FE000811106C08091C304811102C081E001C0EB -:107FF00084E08093B22E0E94CB1809D2882311F01E -:1080000020D24BD2EA96CDBFDEBFDF91CF911F9138 -:108010000F91FF9008950895CF938091B22E8823F9 -:1080200051F0C091BF2E80E097D1F1D18111D3DE04 -:108030008C2FCF9191C1CF910895CF92DF92EF9283 -:10804000FF920F931F93CF93DF93EC018B017A0183 -:1080500011D3811136C0E114F10439F0F7018081A8 -:108060009181081B190BC80FD91FC12CD12C0115E8 -:10807000110531F18091BB2E9091BC2EFC01EF5B7C -:10808000FF4F208131978081281790F01DD1C4DFE8 -:10809000E114F10449F0F70180819181C80ED91EE5 -:1080A000C082D18285E00DC0E5D2882301F309C0EA -:1080B000899142D101501109FFEFCF1ADF0AD7CFC2 -:1080C00080E0DF91CF911F910F91FF90EF90DF90B3 -:1080D000CF900895DF92EF92FF920F931F93CF936B -:1080E000DF93D82FC92F8B018091BF2E806834D1A8 -:1080F0002091B92E3091BA2E2017310728F00115A2 -:10810000110519F4E1D001C08901ED2EFC2ED12C0E -:108110000115110509F440C08091B22E811102C0F1 -:1081200082E04CC0853011F483E048C070D18823D0 -:1081300011F081E043C051D181113CC042D188236C -:1081400039F32091BF2E8091BB2E9091BC2EFC0163 -:1081500027FF05C0EF5BFF4FC081D0E013C0E05C9C -:10816000FF4FC08131968081D0E0C81BD1090AC081 -:10817000C830D10550F4F70181917F01DDD0015065 -:10818000110921960115110599F7DD24D39428973B -:1081900009F0D12C99D0BCCFD110BECF0BC08091AB -:1081A000B22E882309F4BCCF853009F4BDCF2FD17E -:1081B0008111BFCF12D1882391F380E0DF91CF915D -:1081C0001F910F91FF90EF90DF900895DF92EF9253 -:1081D000FF920F931F93CF93DF93D82FC92F8B015B -:1081E0008091BF2E8068B8D02091B92E3091BA2EE0 -:1081F0002017310728F00115110519F465D001C0C9 -:108200008901ED2EFC2ED12C0115110509F442C077 -:108210008091B22E811102C082E04EC0853011F4EF -:1082200083E04AC0F4D0882311F081E045C0D5D066 -:1082300081113EC0C6D0882339F32091BF2E809192 -:10824000BB2E9091BC2EFC0127FF05C0EF5BFF4FBA -:10825000C081D0E015C0E05CFF4FC08131968081C5 -:10826000D0E0C81BD1090CC0C830D10560F4F701BB -:10827000849162D0FFEFEF1AFF0A01501109219695 -:108280000115110589F7DD24D394289709F0D12C25 -:108290001BD0BACFD110BCCF0BC08091B22E882397 -:1082A00009F4BACF853009F4BBCFB1D08111BDCF6D -:1082B00094D0882391F380E0DF91CF911F910F91AB -:1082C000FF90EF90DF900895E091BD2EF091BE2ECB -:1082D000A091BB2EB091BC2EAF5BBF4F8C9190E0B4 -:1082E0008283938380818D798083E091BB2EF0918E -:1082F000BC2EEF5BFF4F10820895E091BD2EF091F0 -:10830000BE2E80818D798083E091BB2EF091BC2EB2 -:10831000EF5BFF4F108208958091BB2E9091BC2E91 -:10832000FC01EF5BFF4F208131E0320F3083FC0115 -:10833000E20FF11D808108952091BB2E3091BC2E5B -:10834000F901EF5BFF4F908141E0490F4083F90154 -:10835000E90FF11D808308958093BF2E482F4F7041 -:1083600050E06091C6047091C7049A0194E0220F16 -:10837000331F9A95E1F7E4E887FF11C0E49FC0013D -:10838000E59F900D11248E5F904D8093BB2E9093AE -:10839000BC2EC90108969B01280F391F0DC0E49F10 -:1083A000C001E59F900D11248054914D8093BB2E08 -:1083B0009093BC2E260F371F2093BD2E3093BE2ED8 -:1083C00008958091BF2E8068C7DFE091BD2EF091A7 -:1083D000BE2E80818695817008958091BF2E8F7703 -:1083E000BBDFA091BD2EB091BE2E8C9185FF0DC03C -:1083F000E091BB2EF091BC2E12968D919C9113971B -:10840000E05CFF4F808381E0089580E008958091D3 -:10841000BF2E8F77A1DFA091BD2EB091BE2E8C9183 -:1084200084FF0DC0E091BB2EF091BC2E12968D9171 -:108430009C911397E05CFF4F808381E0089580E07A -:1084400008958091BF2E8F7787DFE091BD2EF09148 -:10845000BE2E80818D788083E091BD2EF091BE2E5E -:10846000808181608083E091BB2EF091BC2EEF5B18 -:10847000FF4F10828091BF2E80686EDFE091BD2E8D -:10848000F091BE2E808181608083E091BB2EF091BF -:10849000BC2EEF5BFF4F10820895E091BD2EF0914E -:1084A000BE2E818184608183E091BD2EF091BE2E2D -:1084B0008181807C803459F48091BF2E80584CDFBC -:1084C000E091BD2EF091BE2E81818460818308955C -:1084D0001F93CF93DF931F921F92CDB7DEB7182F54 -:1084E0004A83698339DFE091BD2EF091BE2E11825F -:1084F000E091BD2EF091BE2E812F881F8827881F06 -:10850000880F8083E091BD2EF091BE2E698161833A -:10851000E091BD2EF091BE2E128213822091BB2ECF -:108520003091BC2E24833583110F110B4A814123D6 -:10853000F901E05CFF4F40833196108281E00F909B -:108540000F90DF91CF911F910895AF92BF92CF927C -:10855000DF92EF92FF920F931F93CF93DF93A62E9C -:108560008C017C0184E0E80EF11CB12CBA1409F4F2 -:1085700043C0F801D081DD23C1F1C180D280F70171 -:1085800031978081F7019081923010F498E001C01A -:1085900098E128E030E0C0E02C153D0520F4CF5FE5 -:1085A000220F331FF9CFC92B9D2F9F70963010F0EB -:1085B00080E023C0CF7EF1E4CF16D104C8F7882332 -:1085C00021F0813021F4C06C0AC0C06403C0C068CF -:1085D000811105C04C2D6C2F80E88D0F79DF4C2D5B -:1085E0006C2F8D2F75DF882319F3B3940B5F1F4F0A -:1085F00085E0E80EF11CBACF81E0DF91CF911F91A9 -:108600000F91FF90EF90DF90CF90BF90AF900895C3 -:1086100080E090E0E091C604F091C7049C0144E042 -:10862000220F331F4A95E1F7E20FF31F11864091A5 -:10863000C6045091C704FA01E20FF31F118201969C -:108640008630910539F708958091B32E87FF0DC0CC -:10865000C4DE811105C08091B22E8111F9CF09C00D -:108660004CCE8091B22E882321F0ABDE8823C9F353 -:108670002BCE08950F931F93CF93E091C604F091F2 -:10868000C704E05AFF4F00811181C4E68091BF2EDC -:1086900087FF0AC096DE811105C08091B22E81113C -:1086A00005C021C080E024C098DEF5CF8530E9F018 -:1086B000E091BD2EF091BE2E818182FD18C0E09127 -:1086C000C604F091C704E05AFF4F80819181801762 -:1086D0009107E1F22FEF2C0FCC2319F08C01C22F60 -:1086E000D5CF84E005C082E003C083E001C081E013 -:1086F000CF911F910F91089563D069D0E0ECF4E021 -:1087000081818E7F818380818F7780831092B12ECB -:108710000895CF93DF93E0E4F0E0148284818360D6 -:1087200084834ED054D0C0ECD4E088818F77888386 -:108730008881806888831092B22E1092AE2E10929B -:10874000B02E1092AF2E88818064888348E068E460 -:1087500080E8BEDE48E068E480E0BADE88858064B8 -:108760008887898181608983DF91CF910895CF9334 -:10877000DF933FB7F894C0ECD1E022E02A87EAE12A -:10878000F0E0E491A0ECB4E0DA96EC93DA97EBE158 -:10879000F0E0E491DB96EC93DB971A8689ED91E3A8 -:1087A0008E7F16968D939C93179785E18C931896E0 -:1087B0002C933FBF81E08093B12EDF91CF91A9CF61 -:1087C000E0ECF4E080858370808711860895E0EC0A -:1087D000F4E08FEF8287848708951F920F920FB67F -:1087E0000F92112408B60F9218BE09B60F9219BE47 -:1087F0000BB60F921BBE2F933F934F935F936F93D4 -:108800007F938F939F93AF93BF93EF93FF93809149 -:10881000CA0487FF08C08091C80487FF04C080E8AD -:108820008093CA04F8DB8091CA0486FF07C080E405 -:108830008093CA041092B22E0E94BA188091CA0482 -:1088400085FF14C080E28093CA048091AE2E8823F5 -:1088500011F084E007C08091C304811102C081E05F -:1088600001C083E08093B22E0E94A9188091CA04AF -:1088700084FF14C080E18093CA0482E08093B22E0A -:108880001092AE2E1092C304C3DE48E068E480E884 -:108890001FDE48E068E480E01BDEBDDBFF91EF9166 -:1088A000BF91AF919F918F917F916F915F914F9108 -:1088B0003F912F910F900BBE0F9009BE0F9008BEF5 -:1088C0000F900FBE0F901F901895CF93DF93EC0180 -:1088D000FC0170968BE0DF011D928A95E9F782E03A -:1088E0008C83898783E08E8761E0CE0101962DDE3F -:1088F000882361F061E0CE01069627DE882331F0FF -:1089000061E0CE010B96DF91CF911FCE80E0DF9129 -:10891000CF9108950F931F93CF93DF932091B22EA1 -:108920002430E1F4FC010489158926893789012B5B -:10893000022B032B99F0EB0181810EDDFE010190EA -:108940000020E9F73197BF016C1B7D0B40E050E040 -:10895000CE01DF91CF911F910F916FCB82E0DF911C -:10896000CF911F910F9108950F931F93CF93DF9392 -:10897000FC018091B22E8430A9F484899589A6895E -:10898000B789892B8A2B8B2B69F08A01EB018181B6 -:10899000E3DC40E050E0B801CE01DF91CF911F91C0 -:1089A0000F914BCB82E0DF91CF911F910F910895F2 -:1089B000CF93FC018091B22E843001F58489958992 -:1089C000A689B789892B8A2B8B2BC1F0C62F818171 -:1089D000C3DC2091BB2E3091BC2EF901EF5BFF4F21 -:1089E000908131978081981720F48C2FA5DC80E04E -:1089F00006C06ADC3FDE8823C1F301C082E0CF916C -:108A00000895CF93DF932091B22E243091F5FC018D -:108A10004489558966897789452B462B472B49F12F -:108A200081819ADC8091BF2E2091BB2E3091BC2E8B -:108A3000F90187FF05C0EF5BFF4F808190E008C020 -:108A4000E05CFF4F80813196408190E0841B91096A -:108A5000892B69F0F901EF5BFF4FD0813197C0811D -:108A600033DCDC1720F006DE811104C02DDC80E051 -:108A700001C082E0DF91CF910895CF93DF932091E1 -:108A8000B22E243099F4FC0144895589668977898E -:108A9000452B462B472B51F0EC0181815DDC91DCAD -:108AA000882321F0CE01DF91CF91ABCFDF91CF9121 -:108AB0000895CF93DF932091B22E243019F08FEFD9 -:108AC0009FEF46C0FC014489558966897789452B0B -:108AD000462B472BA1F386813FDC7FDC882379F38B -:108AE0008091BF2E2091BB2E3091BC2EF90187FFC3 -:108AF00005C0EF5BFF4F808190E008C0E05CFF4F56 -:108B000080813196208190E0821B9109892B21F090 -:108B100003DCC82FD0E002C0CFEFDFEF2091BF2EE3 -:108B20008091BB2E9091BC2EFC0127FF05C0EF5B0E -:108B3000FF4F208130E008C0E05CFF4F208131967C -:108B4000808130E0281B3109232B09F4D6DBCE01CC -:108B5000DF91CF9108950895FF920F931F93CF93C4 -:108B6000DF93EC0154DC882309F48EC0888190E007 -:108B70002091B72E3091B82E2817390709F084C0FC -:108B80008091B42E813259F018F4803249F17CC0C2 -:108B9000823209F457C0833209F467C075C08091EE -:108BA000B32E813A09F070C04CDC0BDC8823E9F36A -:108BB0008C89FD880E891F89BFDB8F2DBDDB802F3F -:108BC000BBDB812FB9DB888DB7DB898DB5DB8A8D67 -:108BD000B3DB7ADBDF91CF911F910F91FF9034CD02 -:108BE0008091B32E813209F04FC02BDCF6DB81116E -:108BF00005C08091B22E8111F9CF46C08DDB082FC0 -:108C00008BDB182F89DBF82E87DB4F2D50E060E0DF -:108C100070E0BA0155274427782B402B512B4C8B01 -:108C20005D8B6E8B7F8B78DB888F76DB898F74DB37 -:108C30008A8F63DB09DDCE01DF91CF911F910F9108 -:108C4000FF9089CF8091B32E8132F1F4FADBFCDC06 -:108C50008091B52E9091B62E888B998BCE01DF91A5 -:108C6000CF911F910F91FF9076CF8091B32E8132DB -:108C700059F4E7DBE9DC6091B52ECE01DF91CF91AD -:108C80001F910F91FF9067CFDF91CF911F910F91AF -:108C9000FF900895AA1BBB1B51E107C0AA1FBB1F71 -:108CA000A617B70710F0A61BB70B881F991F5A9578 -:108CB000A9F780959095BC01CD010895B7FF04C038 -:108CC00003D0821B930B089509D0A59F900DB49FEC -:108CD000900DA49F800D911D11240895A29FB001B5 -:108CE000B39FC001A39F700D811D1124911DB29FE0 -:108CF000700D811D1124911D08958F929F92AF9246 -:108D0000BF92CF92DF92EF92FF92CF93DF93EC016D -:108D1000688179818A819B81611571058105910541 -:108D200021F464E279ED8BE597E02DE133EF41E04A -:108D300050E0E2D649015A019B01AC01A7EAB1E437 -:108D4000C3DF6B017C01ACEEB4EFA5019401B8DF89 -:108D5000DC01CB018C0D9D1DAE1DBF1DB7FF03C0F7 -:108D60000197A109B04888839983AA83BB839F7721 -:108D7000DF91CF91FF90EF90DF90CF90BF90AF90B9 -:108D80009F908F900895B9CF82E290E2B6CFA0E095 -:108D9000B0E08093222090932320A0932420B093CE -:108DA00025200895FB01DC0102C005900D92415081 -:108DB0005040D8F70895FB01DC018D910590801992 -:108DC0000110D9F3990B0895FB01DC01415050408B -:108DD00048F005900D920020C9F701C01D92415046 -:108DE0005040E0F70895FB01DC0104C08D91019033 -:108DF000801921F441505040C8F7881B990B089501 -:108E0000FB01DC0102C001900D9241505040D8F7A7 -:108E100008956817790768F4FB01DC01E40FF51F7A -:108E2000A40FB51F02C002900E9241505040D8F7D7 -:108E30000895E6CFDC0101C06D9341505040E0F74A -:108E40000895FC018191861721F08823D9F799278D -:108E500008953197CF010895FB01DC0101900D9237 -:108E60000020E1F708950F931F93CF93DF93CDB7C1 -:108E7000DEB72E97CDBFDEBF0E891F89888D998DF5 -:108E800026E02C8309831A8397FF02C080E090E8D4 -:108E900001978D839E83AE01445E5F4F6A8D7B8D0B -:108EA000CE01019667D04D815E8157FD0AC02F81AA -:108EB0003885421753070CF49A01F801E20FF31FAB -:108EC00010822E96CDBFDEBFDF91CF911F910F9103 -:108ED00008950F931F93CF93DF93CDB7DEB72E97EF -:108EE000CDBFDEBF0E891F89888D998D2EE02C8322 -:108EF00009831A8397FF02C080E090E801978D8371 -:108F00009E83AE01445E5F4F6A8D7B8DCE010196DC -:108F100031D04D815E8157FD0AC02F8138854217BF -:108F200053070CF49A01F801E20FF31F10822E96FA -:108F3000CDBFDEBFDF91CF911F910F910895CF93E9 -:108F4000DF93CDB7DEB72E97CDBFDEBF8DE08C832C -:108F50008C899D8989839A83AE01485E5F4F6E89B3 -:108F60007F89CE0101968FD32E96CDBFDEBFDF91D4 -:108F7000CF9108952F923F924F925F926F927F927E -:108F80008F929F92AF92BF92CF92DF92EF92FF9219 -:108F90000F931F93CF93DF93CDB7DEB72C97CDBF41 -:108FA000DEBF7C016B018A01FC011682178283817E -:108FB00081FFB0C1CE0101964C01F7019381F6010A -:108FC00093FD859193FF81916F01882309F49EC1E0 -:108FD000853239F493FD859193FF81916F0185323C -:108FE00021F4B70190E0D6D4E8CF512C312C20E009 -:108FF0002032A0F48B3269F030F4803259F08332A1 -:1090000069F420612CC08D3239F0803339F421604D -:1090100026C02260246023C0286021C027FD27C00D -:1090200030ED380F3A3078F426FF06C0FAE05F9E44 -:10903000300D1124532E13C08AE0389E300D1124B8 -:10904000332E20620CC08E3221F426FD5FC12064D5 -:1090500006C08C3611F4206802C0883641F4F6014F -:1090600093FD859193FF81916F018111C1CF982F5D -:109070009F7D9554933028F40C5F1F4FFFE3F983D5 -:109080000DC0833631F0833771F0833509F057C056 -:1090900021C0F801808189830E5F1F4F44244394CF -:1090A000512C540114C03801F2E06F0E711CF8010C -:1090B000A080B18026FF03C0652D70E002C06FEF75 -:1090C0007FEFC5012C871DD42C0183012C852F77C0 -:1090D000222E16C03801F2E06F0E711CF801A0803C -:1090E000B18026FF03C0652D70E002C06FEF7FEFF7 -:1090F000C5012C87FBD32C012C852068222E8301EF -:1091000023FC19C0832D90E048165906A0F4B7013E -:1091100080E290E03FD43A94F5CFF50127FC8591A9 -:1091200027FE81915F01B70190E034D431103A9469 -:10913000F1E04F1A51084114510479F7DEC084362A -:1091400011F0893631F5F80127FF07C06081718180 -:10915000828193810C5F1F4F08C060817181072E4F -:10916000000C880B990B0E5F1F4F2F76722E97FF06 -:1091700009C090958095709561957F4F8F4F9F4F57 -:109180002068722E2AE030E0A40155D4A82EA81839 -:1091900043C0853729F42F7EB22E2AE030E025C067 -:1091A000F22FF97FBF2E8F36C1F018F4883579F091 -:1091B000ADC0803719F0883721F0A8C02F2F20616B -:1091C000B22EB4FE0DC08B2D8460B82E09C024FFD2 -:1091D0000AC09F2F9660B92E06C028E030E005C077 -:1091E00020E130E002C020E132E0F801B7FE07C024 -:1091F00060817181828193810C5F1F4F06C0608105 -:10920000718180E090E00E5F1F4FA40114D4A82E5E -:10921000A818FB2DFF777F2E76FE0BC0372D3E7FE3 -:10922000A51450F474FE0AC072FC08C0372D3E7EAF -:1092300005C0BA2C372D03C0BA2C01C0B52C34FFA1 -:109240000DC0FE01EA0DF11D8081803311F4397EDD -:1092500009C032FF06C0B394B39404C0832F86784C -:1092600009F0B39433FD12C030FF06C05A2CB3147A -:1092700018F4530C5B18B32CB31460F4B70180E2FC -:1092800090E03C8787D3B3943C85F6CFB31410F4B9 -:109290003B1801C0312C34FF11C0B70180E390E0CE -:1092A0003C8778D33C8532FF16C031FD03C088E788 -:1092B00090E002C088E590E0B7010CC0832F86786B -:1092C00051F031FF02C08BE201C080E237FD8DE238 -:1092D000B70190E05FD3A51430F4B70180E390E0CC -:1092E00059D35A94F8CFAA94F401EA0DF11D808164 -:1092F000B70190E04FD3A110F6CF332009F45DCE33 -:10930000B70180E290E046D33A94F7CFF701868127 -:10931000978102C08FEF9FEF2C96CDBFDEBFDF910C -:10932000CF911F910F91FF90EF90DF90CF90BF9062 -:10933000AF909F908F907F906F905F904F903F90F5 -:109340002F90089520FD09C0FC0123FD05C022FFD8 -:1093500002C07383628351834083089544FD10C02B -:1093600046FD10C0DB01FC01AA0FBB1FEE1FFF1F53 -:109370001094D1F76A0F7B1F8E1F9F1F31E003C02F -:1093800033E001C034E0660F771F881F991F31500A -:10939000D1F7620F711D811D911D08950F931F93C9 -:1093A000CF93DF938C01C801B7D2EC0197FD06C0C3 -:1093B0008AD2892BC1F7B801CE0124D3CE01DF9127 -:1093C000CF911F910F9108958F929F92AF92BF926C -:1093D000CF92DF92EF92FF920F931F93CF93DF9381 -:1093E0001F92CDB7DEB78C01C62E7A01298394D2A5 -:1093F000AC01552729814B32510521F04D325105E1 -:1094000061F42068CA94C11002C080E06FC0C80136 -:10941000298382D2298197FDF8CF322F3D7FD32E29 -:10942000322F307339F5803329F5BB24BA94BC0C44 -:1094300009F449C0C80129836FD2298197FD43C02F -:10944000382F3F7D383561F48D2D8264D82ECA9433 -:10945000CA94CC20C1F1C8015FD297FF0BC033C0C2 -:1094600026FF04C02D2D2260D22E03C03D2D326177 -:10947000D32ECB2C812C912C540120ED280F283099 -:1094800078F0D4FE03C0B801BDD21AC02A3040F033 -:10949000D6FEF9CF2F7D3FEE320F3630A0F72750A2 -:1094A0004D2DC501B4015ADF4B015C018D2D826049 -:1094B000D82ECA94CC2051F0C8012ED297FFDDCF10 -:1094C000D1FC04C0A2CF812C912C5401D7FE08C03E -:1094D000B094A09490948094811C911CA11CB11C08 -:1094E0002D2DB501A401C7012DDF81E00F90DF9183 -:1094F000CF911F910F91FF90EF90DF90CF90BF9091 -:10950000AF909F908F9008956F927F928F929F92CD -:10951000AF92BF92CF92DF92EF92FF920F931F9381 -:10952000CF93DF93CDB7DEB7A197CDBFDEBF5C0190 -:109530007A01CE0101966C0180E2F60111928A95C2 -:10954000E9F7F501838040E050E0912C712C70E048 -:10955000A1E0B0E0F90183FC859183FE81918F0148 -:10956000982F9F01811103C080E090E07AC08E3572 -:1095700019F44115510549F1E72FF0E0E417F5071B -:109580003CF48D3559F18D3219F4772001F103C087 -:10959000711001C0982E892F869586958695860133 -:1095A000080F111D892F87703D0101C0660C8A9537 -:1095B000EAF7F801808186298083991559F0991579 -:1095C00010F49F5FE8CF9150E6CF71E004C077249C -:1095D000739401C0712C4F5F5F4FBCCF772019F09F -:1095E0008E8180628E83711103C09924939416C07A -:1095F000F6019E012F5D3F4F808180958193E21798 -:10960000F307D1F7F2CFE114F10429F0F7018083D9 -:10961000C70101967C016150912CE9F0C50169A355 -:109620007BD169A197FD15C0282F269526952695F3 -:10963000F601E20FF11D208130E0AC0147705527A3 -:1096400002C0359527954A95E2F720FDDCCFB5019C -:10965000D9D1911089CFE114F10411F0F7011082F2 -:10966000C801A196CDBFDEBFDF91CF911F910F91B1 -:10967000FF90EF90DF90CF90BF90AF909F908F9032 -:109680007F906F9008954F925F927F928F929F92FA -:10969000AF92BF92CF92DF92EF92FF920F931F9300 -:1096A000CF93DF931F92CDB7DEB76C012B015A0128 -:1096B000FC0116821782712CF601F380F201F3FC93 -:1096C0008591F3FE8191382F2F01882309F4E5C09D -:1096D00090E03983F8D03981892B19F0C6015EDE1C -:1096E000EBCF353241F4F201F3FC3591F3FE3191C9 -:1096F0002F01353259F4C60139830ED1398197FDD6 -:10970000CAC03817C9F2B6017DD1C7C03A3239F4A0 -:10971000F3FC3591F3FE31912F0151E001C050E08F -:10972000420110E020ED230F2A3088F45260612FAF -:1097300070E080E090E040E2598310DE162FF401E3 -:10974000F3FC3591F3FE31914F015981EBCF052F99 -:10975000232F240151FF03C0111102C09EC01FEF2F -:10976000383619F03C3659F011C0F401F3FC25915C -:10977000F3FE21912F01283649F4052F086004607B -:10978000F201F3FC2591F3FE21912F01222309F42C -:1097900084C0622F70E08FE096E129839CD02981FC -:1097A000892B09F47AC000FD07C0F501E080F18043 -:1097B000C50102965C0102C0E12CF12C2E3649F461 -:1097C000F6014681578160E070E0202FC701BADDC5 -:1097D00073CF233689F401FF11E0C6019DD097FDB8 -:1097E0005AC0E114F10429F0F7018083C701019602 -:1097F0007C01115091F74BC02B3551F49201A70118 -:10980000612FC60181DE2C01892B09F040C03AC0CE -:10981000C6012983C3DD298197FD3DC02F3641F163 -:1098200028F4243619F1293631F124C0233769F0A0 -:109830002537E1F01FC0E114F10429F0F70180821F -:10984000C70101967C01115059F0C60165D04C0149 -:1098500097FD06C038D0892B71F3B601C401D2D070 -:10986000E114F104A1F0F701108211C0006203C0FD -:10987000006101C00064202FA701612FC601A4DD93 -:10988000811105C0F6018381807329F406C000FDB3 -:1098900013CF739411CF772019F0872D90E002C079 -:1098A0008FEF9FEF0F90DF91CF911F910F91FF905E -:1098B000EF90DF90CF90BF90AF909F908F907F9070 -:1098C0005F904F900895911114C1803219F0895022 -:1098D0008550D0F70895FC010590061621F0002070 -:1098E000D9F7C00108953197CF010895FC01059083 -:1098F000615070400110D8F7809590958E0F9F1F92 -:109900000895FC016150704001900110D8F78095D6 -:1099100090958E0F9F1F0895CF93DF93EC012B81BD -:1099200020FF33C026FF0AC02F7B2B838E819F81AF -:1099300001968E839F838A8190E029C022FF0FC009 -:10994000E881F9818081082E000C990B009719F4A9 -:1099500020622B831AC03196E883F9830EC0EA8512 -:10996000FB85199597FF09C02B81019611F080E2C4 -:1099700001C080E1822B8B8308C02E813F812F5F45 -:109980003F4F2E833F83992702C08FEF9FEFDF91D8 -:10999000CF9108950F931F93CF93DF93FB01238102 -:1099A00021FD03C08FEF9FEF28C022FF16C0468124 -:1099B0005781248135814217530744F4A081B18136 -:1099C0009D012F5F3F4F208331838C932681378108 -:1099D0002F5F3F4F2683378310C0EB01092F182FCD -:1099E0000084F185E02D1995892BE1F68E819F8108 -:1099F00001968E839F83812F902FDF91CF911F91AE -:109A00000F910895FB01238120FF12C026FD10C095 -:109A10008F3F3FEF930761F082832F7D2064238384 -:109A2000268137812150310926833783992708956C -:109A30008FEF9FEF0895FA01AA27283051F12031C6 -:109A400081F1E8946F936E7F6E5F7F4F8F4F9F4FD2 -:109A5000AF4FB1E03ED0B4E03CD0670F781F891F14 -:109A60009A1FA11D680F791F8A1F911DA11D6A0FE2 -:109A7000711D811D911DA11D20D009F468943F9195 -:109A80002AE0269F11243019305D3193DEF6CF0194 -:109A90000895462F4770405D4193B3E00FD0C9F75A -:109AA000F6CF462F4F70405D4A3318F0495D31FDC7 -:109AB0004052419302D0A9F7EACFB4E0A69597951A -:109AC000879577956795BA95C9F7009761057105F0 -:109AD00008959B01AC010A2E06945795479537953A -:109AE0002795BA95C9F7620F731F841F951FA01D94 -:109AF0000895992788270895052E97FB16F400945A -:109B00000FD057FD05D014D007FC02D046F408C092 -:109B100050954095309521953F4F4F4F5F4F089599 -:109B200090958095709561957F4F8F4F9F4F0895C9 -:109B3000A1E21A2EAA1BBB1BFD010DC0AA1FBB1F51 -:109B4000EE1FFF1FA217B307E407F50720F0A21BC3 -:109B5000B30BE40BF50B661F771F881F991F1A9430 -:109B600069F760957095809590959B01AC01BD015A -:089B7000CF010895F894FFCF26 -:109B780002400F0083100000010410000001820859 -:109B8800000001000000000000000000000090013B -:109B98000100010000000000000085238C238C23B5 -:109BA8009823A423AE23CB23D923022405240924F4 -:109BB8008426E625FB25FF251426452658268526D6 -:109BC8000001000100000000000000010001010187 -:109BD8000101010001000100000001010001010173 -:109BE8000001010100000001000001000101000165 -:109BF800000000020200000200020202020000024D -:109C0800000000040400000400040404040000042C -:109C180000080808000000080000080008080008FC -:109C280000000010100000100010101010000010AC -:109C3800546F6F206D616E7920646174612E000D20 -:109C48000A504152495459204552524F52000D0A68 -:109C5800504152495459204F4B00556E6B6E6F77E7 -:109C68006E206361726420747970652E00257320FC -:109C78006F722000546865726520697320617420D2 -:109C88006C65617374206F6E65206D6F72652063FB -:109C980061726420747970652063616E64696461BF -:109CA80074652C206275742074686572652077610C -:109CB80073206E6F7420656E6F75676820746572A7 -:109CC8006D696E616C20627566666572207370617D -:109CD80063652E0D0A00415451413A090055494423 -:109CE8003A090053414B3A09004E4F204441544130 -:029CF80000006A +:1046A00082B1809582B988E880930309FF91EF91E8 +:1046B0009F918F913F912F910F900BBE0F9008BE4D +:1046C0000F900FBE0F901F9018951F920F920FB66C +:1046D0000F92112408B60F9218BE0BB60F921BBE94 +:1046E0002F933F938F939F93EF93FF9381B18230EA +:1046F00008F49DC081B18D3008F099C0E1B1F0E0BF +:10470000EE0FFF1FEA5DFF4D0190F081E02D19943F +:104710008FE790E08093260A9093270A88C08E9AAC +:104720008EE0809340088FE390E08093260A909378 +:10473000270A85E06FC08E9886E081B98FEF82B935 +:1047400014B815B8E8B1F9B1808180B970C0009B88 +:1047500005C08E9A82B1809582B901C08E9887E09B +:1047600059C0009B02C08E9801C08E9A80B1869578 +:1047700080B984B195B1019684B995B984B195B1E8 +:1047800087709927892B11F488E044C024B135B192 +:1047900086B197B128173907B1F52BC0EAB1FBB143 +:1047A000309711F0808101C082B1882311F08E9A78 +:1047B00001C08E9889E02EC0EAB1FBB1309751F06C +:1047C0008081882311F08E9801C08E9A3196EAB9C3 +:1047D000FBB908C082B1882311F08E9801C08E9A6F +:1047E0008FEF82B924B135B186B197B12817390757 +:1047F00011F48AE00FC0E8B1F9B1CF01019688B990 +:1048000099B9818180B986E005C08E988BE002C09D +:104810008E988CE081B90BC01092000A1092060AA3 +:10482000109240081092410881E08093AF2CFF91D4 +:10483000EF919F918F913F912F910F900BBE0F9011 +:1048400008BE0F900FBE0F901F901895CF93DF9367 +:10485000EEEAFCE210821182E0E4F6E0128A84E0E3 +:104860008283C0E8D1E082E68E83A0E2B6E081E0F8 +:1048700016968C93169711968C93119796E0129634 +:104880009C93129751968C93519742E052964C9379 +:1048900052971A961C921A9733E019963C9399E511 +:1048A00098839AE5998390E491839683A0EBB0E096 +:1048B00012962C911297207F12962C931297129693 +:1048C0002C911297226012962C9320E32183268349 +:1048D000908B868345833183E0E0F8E083E1818338 +:1048E00021E030E026A337A320A731A7E0E8F8E0D5 +:1048F00014868083E0E2F3E01382118288E08283F1 +:1049000091E1908320911E2030911F20208F318FC4 +:10491000E0E8F3E09CE39283808393838183DF91DB +:10492000CF91D5CDA0E2B6E01A961C921A97EEEA86 +:10493000FCE210821182E0E0F9E01082138217821B +:1049400080E18487E0E0FAE010821382168281E041 +:104950008487E0E4F8E01082118216968C938E989A +:104960000895CF93DF938091AE2C882309F47EC005 +:104970001092AE2CC6B1D7B1C730D10508F471C0C2 +:10498000AE01495F5F4F93E0569547959A95E1F7E1 +:10499000E0915F2EF091602E64EB70E380E4199556 +:1049A000E091622EF091632E8781883019F483E1C3 +:1049B00080938B2C8681883019F483E180938A2C34 +:1049C000E091552EF091562EBE0184EB90E319959F +:1049D000EC0194FF06C0DF7E84E391E38AB99BB9C2 +:1049E00002C01AB81BB82097E1F1AE01495F5F4FD2 +:1049F00083E0569547958A95E1F7E0915F2EF09117 +:104A0000602E64EB70E381E41995E091622EF091E1 +:104A1000632E8781893019F483E180938B2C868102 +:104A2000893019F483E180938A2CC6B9D7B984EB15 +:104A300090E388B999B910926008109261088FE0EC +:104A400090E0809366089093670888E090E08093F8 +:104A50006A0890936B0883E28093410883E081B9F0 +:104A600005C01092000A1092060A31DD8091AF2C29 +:104A7000882329F01092AF2CDF91CF9128CDDF91C0 +:104A8000CF910895CF93DF93E0E4F6E0128A84E0BB +:104A90008283C0E8D1E082E68E83A0E2B6E081E0C6 +:104AA00016968C93169711968C93119796E0129602 +:104AB0009C93129751968C93519742E052964C9347 +:104AC00052971A961C921A9733E019963C931997AD +:104AD00099E598839AE5998390E491839683C0EB56 +:104AE000D0E02A81207F2A832A8122602A8320E342 +:104AF00021832683908B868345833183E0E0F8E031 +:104B000093E1918321E030E026A337A320A731A7CA +:104B1000E0E8F8E014869083E0E2F3E0138211828B +:104B200098E0928341E1408340911E2050911F20E4 +:104B3000408F518FE0E8F3E04CE34283908343835E +:104B4000918315968C93E0E0F9E08FE790E086A3DF +:104B500097A322A733A7108216828CE08783109236 +:104B6000000A1092B02CE3EBFCE210821282118258 +:104B7000DF91CF91089581E08093260654DCE0E038 +:104B8000F9E010821782E0E0FAE010821782E3EB8E +:104B9000FCE211821282108208951F920F920FB6CA +:104BA0000F92112408B60F9218BE0BB60F921BBEBF +:104BB0002F933F938F939F93EF93FF93E091B02CAC +:104BC000F0E0EE0FFF1FE05CFF4D0190F081E02D63 +:104BD000199410928C081092000886E18A95F1F7DA +:104BE00000C081E08093000883E080938C0818B8AF +:104BF0008091B43086B917B882E001C083E0809319 +:104C0000B02C86C0309911C082B181110EC01092B3 +:104C10008C081092000896E19A95F1F700C081E0A7 +:104C20008093000883E080938C0884E0E8CF309B79 +:104C300010C010928C081092000886E18A95F1F756 +:104C400000C081E08093000893E090938C0882B9C3 +:104C500001C012B886B1869586B984B195B1019725 +:104C600084B995B9892B11F485E001C083E0809364 +:104C7000B02C87B18F5F87B9877009F049C0E8B160 +:104C8000EF5FE8B9F0E0EC54FF4C808186B940C09A +:104C900082B181110EC010928C081092000896E12A +:104CA0009A95F1F700C081E08093000883E080933B +:104CB0008C0886E0A4CF1092000982E591E001976C +:104CC000F1F700C0000082E08093870389E38093BE +:104CD000810384EB90E38AB99BB981E090E084B9C9 +:104CE00095B980E886B98EB19FB1209108043091C2 +:104CF0000904822B932B8093B12C9093B22C81E0EA +:104D00008093B52C18B817B81092B02C01C000C011 +:104D1000FF91EF919F918F913F912F910F900BBE3B +:104D20000F9008BE0F900FBE0F901F9018951F9206 +:104D30000F920FB60F92112408B60F9218BE0BB641 +:104D40000F921BBE2F933F934F935F938F939F932D +:104D5000EF93FF931092070A1092000A10924709EE +:104D600010924009809181038E7F8093810384B1EA +:104D700095B187709927892BC9F0E4B1F5B186B157 +:104D800044B155B193E0F695E7959A95E1F7EC5467 +:104D9000FF4C90E04770552728E030E0241B350B8E +:104DA00002C0959587952A95E2F7808381E08093EC +:104DB000B42C1092B52C8FEF9FEF8093260A90931E +:104DC000270A1092200A1092210A1092060A1092C5 +:104DD000070A1092030A84E08093000A87E0809318 +:104DE000B02CFF91EF919F918F915F914F913F91E7 +:104DF0002F910F900BBE0F9008BE0F900FBE0F901B +:104E00001F9018951F920F920FB60F92112408B69B +:104E10000F9218BE0BB60F921BBE8F93EF93FF93AA +:104E2000E0E8F3E081818F7C8183E0E0FAE088E8CC +:104E3000838381E08083FF91EF918F910F900BBE70 +:104E40000F9008BE0F900FBE0F901F9018951F92E5 +:104E50000F920FB60F92112408B60F9218BE0BB620 +:104E60000F921BBE2F933F934F935F938F939F930C +:104E7000EF93FF938091600910926009109261098D +:104E800092E090934009813620F0813A08F063C0A7 +:104E900077C086B1869586B984B195B1019684B9FB +:104EA00095B987709927892B41F4EAB1FBB1CF01FD +:104EB00001968AB99BB986B1808384B195B180FD92 +:104EC00088C0369986C01092070A1092000A109284 +:104ED000470910924009809181038E7F809381035E +:104EE00084B195B187709927892BC9F0E4B1F5B1E8 +:104EF00086B144B155B193E0F695E7959A95E1F7FF +:104F0000EC54FF4C90E04770552728E030E0241B1C +:104F1000350B02C0959587952A95E2F7808381E04D +:104F20008093B42C1092B52C8FEF9FEF8093260ABC +:104F30009093270A1092200A1092210A1092060AD2 +:104F40001092070A1092030A84E08093000A87E017 +:104F50008093B02C3EC086B18695806886B984B1B6 +:104F600095B1019684B995B987709927892B41F439 +:104F7000EAB1FBB1CF0101968AB99BB986B18083B2 +:104F800086B18695806886B984B195B1019684B959 +:104F900095B987709927892B41F4EAB1FBB1CF010C +:104FA00001968AB99BB986B1808386B1869586B908 +:104FB00084B195B1019684B995B987709927892BE9 +:104FC00041F4EAB1FBB1CF0101968AB99BB986B130 +:104FD0008083FF91EF919F918F915F914F913F91CE +:104FE0002F910F900BBE0F9008BE0F900FBE0F9029 +:104FF0001F901895BF92CF92DF92EF92FF920F937E +:105000001F93CF93DF93CDB7DEB7DA95CDBFDEBF69 +:105010008091B52C8823F1F08EB19FB140910804A6 +:10502000509109042091B12C3091B22C842B952BF6 +:10503000821B930B20912020309121202F5F3F4F26 +:105040002817390738F414B815B881E08093B42CC8 +:105050001092B52C15DA811144C1EED9882309F4D8 +:1050600040C18091B52C81113CC18091B32C81113C +:1050700005C08091B42C882309F433C18091B02CF1 +:10508000873041F48091200A9091210A8532914025 +:1050900008F427C18091B42C882309F4A6C084B1F8 +:1050A00095B1892B09F4A1C084B195B1089718F482 +:1050B00014B815B89AC044B155B1495F5F4F63E069 +:1050C000569547956A95E1F764EB70E3CE0101963A +:1050D0000E942E5384EB90E38AB99BB904B115B1B9 +:1050E00014B815B8C12CD12C73E1B72EE8E0EE2E20 +:1050F000F12CC016D10608F078C0F60153E0F69501 +:10510000E7955A95E1F741E050E04C0F5D1FE40F41 +:10511000F51F8081982F96959695908383708130A6 +:1051200039F0E8F0823009F059C086B1869503C0A5 +:1051300086B18695806886B984B195B1019684B9A7 +:1051400095B987709927892B09F048C0EAB1FBB15E +:10515000CF0101968AB99BB986B180833FC084B1E3 +:1051600095B187709927892BC1F0E4B1F5B186B16B +:1051700024B135B143E0F695E7954A95E1F7EC5453 +:10518000FF4C90E027703327A701421B530B02C04E +:10519000959587954A95E2F78083E091622EF0918C +:1051A000632E8781883011F4B0928B2C86818830F1 +:1051B00011F4B0928A2C44B155B1495F5F4F93E02E +:1051C000569547959A95E1F7E0915F2EF091602E04 +:1051D00064EB70E382E4199581E001C080E052E065 +:1051E000C50ED11C882309F484CF1092B32C1092E1 +:1051F000B42C64B175B1E091552EF091562E84EB2C +:1052000090E3199584B995B984B195B1892B09F4C6 +:1052100068C089E0809381031092000A1092200AEE +:105220001092210A8FE790E08093260A9093270A34 +:105230008FE590E08093280A9093290A1092060A3D +:1052400080E180930C0A93E09093070A1092600922 +:10525000109261092FEF3FEF2093660930936709A1 +:1052600020E031E0209368093093690910924609E3 +:1052700080934C0981E08093470981E1809380010C +:10528000109288011092800310922906E091622EFC +:10529000F091632E8781893019F483E180938B2C00 +:1052A0008681893019F483E180938A2C44B155B109 +:1052B000495F5F4F83E0569547958A95E1F7E09106 +:1052C0005F2EF091602E64EB70E383E4199581E02A +:1052D0008093B02C12B8109220091092210980936B +:1052E0000009D395CDBFDEBFDF91CF911F910F9104 +:1052F000FF90EF90DF90CF90BF90089514B815B84D +:1053000081E08093B32C6AC81092070A1092000AB9 +:105310001092470910924009809181038E7F8093FB +:10532000810384B195B187709927892BC9F0E4B1C5 +:10533000F5B186B144B155B193E0F695E7959A95EC +:10534000E1F7EC54FF4C90E04770552728E030E03F +:10535000241B350B02C0959587952A95E2F780832B +:1053600081E08093B42C1092B52C8FEF9FEF809347 +:10537000260A9093270A1092200A1092210A10926E +:10538000060A1092070A1092030A84E08093000A2A +:1053900087E08093B02C1092B02C1092B42C109215 +:1053A000B32C41C881E08093B82C1092B62C08959C +:1053B00081E08093B82C08950895CF92DF92EF9208 +:1053C000FF920F931F93CF93DF93CDB7DEB725974F +:1053D000CDBFDEBF8C01FC0180819091B82C923052 +:1053E000F1F038F0943079F120F1953009F44AC0A9 +:1053F00049C121E09227292F21702093B62C9111C9 +:1054000002C0863219F0823509F03CC184E4F8010B +:105410008083118282E08093B82C80E134C1909126 +:10542000B62C911102C08632B1F0823509F04DC020 +:1054300012C09091B62C911102C0863261F0823573 +:1054400009F075C008C09091B62C911102C0863247 +:1054500011F0823539F484E4F8018083118281E00F +:1054600089270DC0803309F41BC1823A09F434C185 +:10547000803A09F451C1803509F4F6C081E0809387 +:10548000B82C00C160E170E0C8010E947C33882321 +:10549000A1F080915E2E81110BC06091B72CF4E0D9 +:1054A0006F9FB001112444E050E0C8010E94B20E89 +:1054B00084E08093B82C8AE004C084E08093B82C08 +:1054C00081E0F801808384E0DEC08339B9F6198277 +:1054D0001A821B821C8288E8898343E050E060E0E6 +:1054E00070E0CE0102960E94640EF8018181803244 +:1054F00009F4ABC0803709F048C0F8019281898176 +:105500009813C0C093818A819813BCC094818B8109 +:105510009813B8C095818C819813B4C084E08083BF +:1055200061E070E0C8010E94513383E02AC08539F0 +:1055300009F0A4CF44E050E064E070E0CE010196B1 +:105540000E94640EF8018181803209F47EC08037A8 +:10555000E1F4F80192818981981394C093818A8142 +:10556000981390C094818B8198138CC095818C8105 +:10557000981388C0108261E070E0C8010E94513326 +:1055800084E08093B82C88E17EC0E82EE2949FE00E +:10559000E9222EEF2E0D8F70F82E88E090E08F1903 +:1055A00091094FEF50E06A0102C0D594C7948A95E3 +:1055B000E2F7253021F0243059F5FF20E9F044E0EE +:1055C00050E0B8016E5F7F4FCE0101962D830E949F +:1055D00021532D81892B61F49A81898189279B81AF +:1055E00089279C818927F801968189278C2169F177 +:1055F000243071F4F11046C044E050E0B8016E5F11 +:105600007F4FCE0101960E942153892BF1F03AC0C1 +:105610002430C0F5E22EF12CA701B8016E5F7F4F58 +:10562000CE0101960E942153892B61F5D801AE0D60 +:10563000BF1DE1E0F0E0EC0FFD1FEE0DFF1D129627 +:105640009C9180818927C822E9F42981F80120836F +:105650003A8131839B8192838C8183832327922794 +:105660008927848388E20FC0F8018181811142C0BB +:1056700062E070E0C8010E947C33882309F420CFE7 +:105680001092B82C80E090E02596CDBFDEBFDF9170 +:10569000CF911F910F91FF90EF90DF90CF900895E1 +:1056A000F801F18062E070E0C8010E947C33882339 +:1056B00009F406CFFFE0FF15E8F084E0F89EB001A2 +:1056C000112440E150E0C8010E94640E60E170E0E6 +:1056D000C801E7D780E9D7CFF801F18066E070E034 +:1056E000C8010E947C33882309F4EACE8EEF8F0D27 +:1056F0008E3018F0F8011082E6CE80915E2E811176 +:10570000DACEF4E0FF9EB001112444E050E0C8017D +:1057100002960E94B20ECFCEF801F18062E070E0F6 +:10572000C801EAD7882309F4CBCE8EEF8F0D8E30D7 +:1057300008F7F092B72C85E0BCCECF93DF93EC0155 +:1057400043E050E060E070E00E94640E44E050E00E +:1057500064E070E0CE010396DF91CF910C94640E6B +:105760000F931F93CF93DF931F921F92CDB7DEB796 +:105770008C01FC0190818181892798E88927928199 +:1057800089278A83948183818927958189279681B6 +:105790008927898343E050E060E070E0C8010E94FF +:1057A000B20E41E050E063E070E0CE0102960E944C +:1057B000B20E44E050E064E070E0C80103960E943D +:1057C000B20E41E050E068E070E0CE0101960E9428 +:1057D000B20E0F900F90DF91CF911F910F9108950E +:1057E00081E08093DC2C84E090E08093BB2C90934C +:1057F000BC2C88E08093BA2C1092B92C089581E0DB +:105800008093DC2C84E490E08093BB2C9093BC2CA0 +:1058100088E08093BA2C1092B92C089581E080938F +:10582000DC2C82E090E08093BB2C9093BC2C88E130 +:105830008093BA2C1092B92C089581E08093DC2CCF +:10584000089508958F929F92AF92BF92CF92DF9268 +:10585000EF92FF920F931F93CF93DF93CDB7DEB7F5 +:105860006397CDBFDEBF8C015B018091DC2C67307C +:10587000710501F5F8019081882311F0963211F03D +:105880009235C1F421E0811120E02093B92C4091A0 +:10589000BB2C3091BC2C211102C0963211F09235F4 +:1058A00039F4F801408331838FEF8093BD2C38C0E9 +:1058B000A12CB12C853009F49CC050F48230A9F1A0 +:1058C000C8F0833009F469C0843009F482C0B5C5DA +:1058D000883009F425C138F4863009F49AC087303D +:1058E00009F4D3C0AAC5893009F442C38D3008F445 +:1058F00064C3A3C591E08927982F91709093B92C28 +:105900003091BB2C2091BC2CF8019081811102C0F8 +:10591000963219F0923509F00CC4F80130832183D6 +:1059200084E08093DC2C80E189C5F8018081982F88 +:105930009D7F913419F48AE080835AC38033C1F487 +:1059400062E070E0C801D8D6882309F49CC0F80151 +:105950006181F0E16F9FB001112440E150E0C80186 +:105960000E94640E60E170E0C8019BD680E966C5C4 +:10597000803A79F462E070E0C801BED6882309F469 +:1059800082C0F80181818093D32C83E08093DC2C4A +:10599000D2CF803509F051C552C060E170E0C80136 +:1059A000ABD6882389F080915E2E81110BC0609167 +:1059B000D32CF0E16F9FB001112440E150E0C80109 +:1059C0000E94B20E8AE001C081E0F801808382E08B +:1059D0000DC39091B92C3091BB2C2091BC2CF801B7 +:1059E0008081911102C0863211F1823509F0A9C37C +:1059F0001EC09091B92C3091BB2C2091BC2CF80189 +:105A00008081911102C0863291F0823509F046C43E +:105A10000EC09091B92C3091BB2C2091BC2CF80178 +:105A20008081911102C0863211F0823531F4F80183 +:105A30003083218381E0892779C38035C9F4F80157 +:105A40008181882319F0F8011082D2C262E070E0EF +:105A5000C80152D68823B9F0E0915F2EF091602EF4 +:105A600040E060E070E081E919951092DC2CE5C41B +:105A700090EA980F923008F0B4C462E070E0C80178 +:105A80003BD68111DDC481E047C2C8010E944F3975 +:105A900064E07801F4E0EF0EF11CC7010E94663C5F +:105AA000E0915F2EF091602E44E0B70180EA1995F5 +:105AB000F80194818091D42C981329C0958180910C +:105AC000D52C981324C096818091D62C98131FC092 +:105AD00097818091D72C98131AC08091D82C8083FD +:105AE0008091D92C81838091DA2C82838091DB2C68 +:105AF000838364E0C8010E94583EE0915F2EF091DC +:105B0000602E44E0B80181EA199588E0FCC1E0917B +:105B10005F2EF091602E44E064ED7CE280EC25C2C3 +:105B2000F8018081803551F48181811107C0828123 +:105B3000873521F483818D3C09F4FDC164E0C801FF +:105B40000E94663CF8018081803309F0C2C062E0A7 +:105B500070E0C801D1D5882309F4ACC0F801618197 +:105B600067FD04C0862F8370833029F0862F8F70E5 +:105B70008F3009F084C06093D32C8091BE2C90911B +:105B8000BF2C3091C02C282F22952095422F4927D9 +:105B9000407F09F043C023272F7009F03FC0929542 +:105BA00090959327907FD1F5262F67FD02C0237033 +:105BB00003C02F7009F023E0982F9095432F429552 +:105BC0004F702223C1F0892F90E0022E02C09595DC +:105BD00087950A94E2F7982FE32FF0E0022E02C097 +:105BE000F595E7950A94E2F73E2F50E002C05595EF +:105BF00047952A95E2F740FBCC24C0F8D12CCC0C79 +:105C0000DD1CCC0CDD1C30FBEE24E0F8F12CEE0C9E +:105C1000FF1CEC28892F81708E2901C087E020911C +:105C2000D22C30E0280F311D280F311DF901E05B27 +:105C3000FF4D8081F8019801205F3F4F1192E217DC +:105C4000F307E1F79091C12CF801918782FF09C019 +:105C50009091BE2C96839091BF2C97839091C02CED +:105C6000908784FF15C06360F0E16F9FB00111243D +:105C7000665F7F4F46E050E0C8010A9607C080E1AA +:105C8000689FB001112440E150E0C8010E94640EF9 +:105C900060E170E0C80105D5E0915F2EF091602EC3 +:105CA00042E1B80180E8199562E1C8010E94583EBE +:105CB00080E92CC10E94713B91E08927F801808323 +:105CC000E0915F2EF091602E44E0B80181EC1995CF +:105CD0008FC1803A61F462E070E0C8010DD588237D +:105CE000D9F1F80181818093D32C89E00DC0803CEB +:105CF00089F462E070E0C801FFD4882369F1F801FB +:105D000081818093D32C8BE08093DC2C0E94713BAB +:105D10009AE001C1813C91F462E070E0C801ECD4EA +:105D20008823D1F0F80181818093D32C4AE0F42EAE +:105D3000F092DC2C0E94713B8F25EEC0823C99F4DE +:105D400062E070E0C801D8D4882331F0F801818185 +:105D50008093D32C8CE0D8CFE0915F2EF091602E11 +:105D600044E0B80121C0803B11F562E070E0C80159 +:105D7000C3D4E0915F2EF091602E44E0B8018823F7 +:105D800099F086E8199580915E2E8111BFCFF801B8 +:105D90006181F0E16F9FB001112440E150E082EC9D +:105DA0009CE20E94B20EB2CF81EC1995B1C090EA8C +:105DB000980F923008F0B2C062E070E0C8019CD445 +:105DC000882309F4A5C0F8018081803621F03AE3E8 +:105DD000C32ED12C03C020E3C22ED12CF801818127 +:105DE00087FF0CC0807FF0E18F9F7001112480EC51 +:105DF000C80ED11C96EFA92EB12C08C08C7F90E163 +:105E0000899F7001112486E3A82EB12CE0915F2EAA +:105E1000F091602E42E0B80180E91995F801808187 +:105E200081708093D22CC701B4E096958795BA957E +:105E3000E1F78093D32C9091BD2C981769F0B701AE +:105E40006A0D7B1D44E050E08EEB9CE20E94640EE4 +:105E50008091D32C8093BD2C68E0CE0101960E94E6 +:105E6000A20D80915D2E44E050E0873019F463E08C +:105E700070E002C060E070E0CE010F960E94640EF8 +:105E8000B7016C0D7D1D46E050E0CE0109960E94E1 +:105E9000640E89818093D42C8A818093D52C8B8148 +:105EA0008093D62C8C818093D72C60E484ED9CE287 +:105EB0000E949E408091D42C8093D82C8091D52C28 +:105EC0008093D92C8091D62C8093DA2C8091D72C7A +:105ED0008093DB2C60E288ED9CE20E949E4020E0F3 +:105EE000AE014F5F5F4FBE01615F7F4FCE010996EC +:105EF000EAD68981F80180838A8181838B818283BC +:105F00008C81838387E08093DC2C80E290E174C3F2 +:105F10000E94713B91E08927F8010ECD8035B9F4DC +:105F2000F801818181118FCD62E070E0C801E4D376 +:105F3000882309F4A8CD1092DC2CE0915F2EF0911B +:105F4000602E40E060E070E081E9199576C2A5011D +:105F5000495F5F4FA3E056954795AA95E1F7E09119 +:105F60005F2EF091602EB80182E9199581E0DEC0C4 +:105F700062E1C8010E94663C60E170E0C801BCD3E8 +:105F8000E0915F2EF091602E882329F142E1B80163 +:105F900081E8199580915E2E81110BC06091D32C00 +:105FA000F0E16F9FB001112440E150E0C8010E9470 +:105FB000B20E0E94713B9AE015C066E0C8010E94D3 +:105FC000663C64E070E0C80197D3811113C0E09192 +:105FD0005F2EF091602E44E0B80181EC19950E948B +:105FE000713B91E08927F801808388E08093DC2C65 +:105FF00084E024C26091D32CF0E16F9FB0011124A2 +:1060000040E150E082EC9CE20E94640E9091C22C30 +:106010008091C62C80959813EBC28091CA2C98135E +:10602000E7C22091C32C8091C72C80952813E0C231 +:106030008091CB2C2813DCC2C090C42C8091C82C3A +:106040008095C812D5C28091CC2CC812D1C2809143 +:10605000C52C3091C92C30958313CAC23091CD2CF8 +:106060008313C6C24091CE2C3091CF2C3095431370 +:10607000BFC23091D02C4313BBC23091D12C30958C +:106080004313B6C2F801308141818280912CA12C4A +:10609000B12C540199248824942A832A3381B32A69 +:1060A000D12CE12CF12C7601DD24CC24D22AC92A72 +:1060B000F82A8091DC2C8B3009F07FC2E0915F2EB2 +:1060C000F091602E46E0B80185E81995C818D90806 +:1060D000EA08FB08C092C22C33272F2D1E2D0D2D50 +:1060E0000093C32CA701662777274093C42C8F2DDC +:1060F0009927AA27BB278093C52CEC2DE095E09328 +:10610000C62CE02FE095E093C72CE42FE095E093B8 +:10611000C82CE82FE095E093C92CC092CA2C0093BC +:10612000CB2C4093CC2C8093CD2C88E08093DC2C1E +:1061300084C1903409F081C182E08093DC2C8AE034 +:10614000EBCE833909F091CC80915D2E873009F038 +:10615000A0C043E050E060E070E0CE0102960E94F3 +:10616000640E88E88983F8019181903219F09037A4 +:1061700061F024C0F80180833A8131832B8122832E +:106180009C8193832327822728C1F8018281883844 +:1061900009F053C193818A8198134FC194818B81F7 +:1061A00098134BC195818C81981347C184E08083FB +:1061B00061E070E0C80175D285E09EC0E92EE294EE +:1061C0002FE0E2222EEF2E0D9F70F92E88E090E056 +:1061D0008F1991094FEF50E06A0102C0D594C7941E +:1061E0008A95E2F7253021F0243059F5FF20E9F0B7 +:1061F00044E050E0B8016E5F7F4FCE0101962B8BDB +:106200000E9421532B89892B61F49A818B818927E4 +:1062100098E889279C818927F801968189278C2114 +:1062200081F1243071F4F11008C144E050E0B8016C +:106230006E5F7F4FCE0101960E942153892B09F199 +:10624000FCC0243008F0F9C0E22EF12CA701B801FF +:106250006E5F7F4FCE0101960E942153892B09F07A +:10626000ECC0D801AE0DBF1DE1E0F0E0EC0FFD1F6A +:10627000EE0DFF1D12969C9180818927C82209F09E +:10628000DCC098E8F80190833A8131832B81228326 +:10629000A0C044E050E060E070E007C0853909F03C +:1062A000E4CB44E050E063E070E0CE0101960E9450 +:1062B000640E9091BA2CF8018181803209F482C079 +:1062C0008037F1F4F801228189812813B6C0238137 +:1062D0008A812813B2C024818B812813AEC0258106 +:1062E0008C812813AAC0908361E070E0C801D9D1E5 +:1062F0008FEF8093BD2C86E08093DC2C88E19EC0DC +:10630000E82EE2949FE0E9222EEF2E0D8F70F82EFA +:1063100088E090E08F1991094FEF50E06A0102C0C8 +:10632000D594C7948A95E2F7253021F0243059F5A9 +:10633000FF20E9F044E050E0B8016E5F7F4FCE01EE +:1063400001962B8B0E9421532B89892B61F49A8112 +:10635000898189279B8189279C818927F8019681DA +:1063600089278C2179F1243071F4F11066C044E062 +:1063700050E0B8016E5F7F4FCE0101960E9421531D +:10638000892B01F15AC0243008F057C0E22EF12CBD +:10639000A701B8016E5F7F4FCE0101960E94215385 +:1063A000892B09F04AC0D801AE0DBF1DE1E0F0E035 +:1063B000EC0FFD1FEE0DFF1D12969C918081892729 +:1063C000C822D9F52981F80120833A8131839B8144 +:1063D00092838C818383232792278927848388E271 +:1063E0002DC0823C09F0CBC0F8019181903E09F0AC +:1063F000C8C09281943B09F0C4C046E050E06AEA0C +:1064000074E0CE0101960E94640E89818B3409F0FC +:106410003ACB8A81893709F036CB8B818B3109F0F1 +:1064200032CB8C818A3E09F02ECB8D818B3709F0DF +:106430002ACB8E818C3C09F026CB80E090E0DCC03A +:10644000F8018081803621F08AE3C82ED12C03C068 +:10645000B0E3CB2ED12CF801818187FF0CC0807F67 +:10646000F0E18F9F7001112480ECC80ED11CA6EFC3 +:10647000AA2EB12C08C08C7F90E1899F7001112455 +:10648000F6E3AF2EB12CE0915F2EF091602E42E04A +:10649000B80180E91995F801808181708093D22C30 +:1064A000C701E4E096958795EA95E1F78093D32CB0 +:1064B000B7016A0D7B1D44E050E08EEB9CE20E9428 +:1064C000640E8091D32C8093BD2C68E0CE010196A0 +:1064D0000E94A20D80915D2E44E050E0873019F4B7 +:1064E00063E070E002C060E070E0CE010F960E94B1 +:1064F000640EB7016C0D7D1D46E050E0CE0109969B +:106500000E94640E89818093D42C8A818093D52C3B +:106510008B818093D62C8C818093D72C60E484ED82 +:106520009CE20E949E408091D42C8093D82C809134 +:10653000D52C8093D92C8091D62C8093DA2C809105 +:10654000D72C8093DB2C60E288ED9CE20E949E4079 +:1065500087E08093DC2C8981F80180838A818183A4 +:106560008B8182838C818383AE014F5F5F4FBE013D +:10657000615F7F4FCE010996F0D080E25FCF80331C +:1065800039F0982F9F7E903A19F0805C833078F430 +:1065900081E08093DC2C84E0F8018083E0915F2E21 +:1065A000F091602E40E060E070E082EC90CBE091F2 +:1065B0005F2EF091602E40E0D6CC8A3069F4E091F5 +:1065C0005F2EF091602E46E0B80184E81995C80C62 +:1065D000D91CEA1CFB1C7ECD8C3009F07BCDE091F0 +:1065E0005F2EF091602E46E0B80187E8199572CDD4 +:1065F0000E94713B96E0F6CC6396CDBFDEBFDF9183 +:10660000CF911F910F91FF90EF90DF90CF90BF90AF +:10661000AF909F908F900895CF93DF9320915D2E40 +:10662000273071F4EC0143E050E060E070E00E943C +:10663000640E44E050E063E070E0CE01039604C0D5 +:1066400044E050E060E070E0DF91CF910C94640E84 +:10665000CF93DF931F92CDB7DEB720915D2E273009 +:1066600029F447E050E060E070E015C0FC013181A2 +:10667000208123273281232733812327298344E064 +:1066800050E060E070E00E94B20E41E050E064E053 +:1066900070E0CE0101960E94B20E0F90DF91CF9173 +:1066A000089520E42093D00026EC2093D500209379 +:1066B000D40021E02093D000DC01680F791FA617D9 +:1066C000B70741F0ED91F0E0EC59FA4FE491E09317 +:1066D000D300F5CFE091D500F0E0EC59FA4FE4910A +:1066E000EC93E091D400F0E0EC59FA4FE49111966C +:1066F000EC931092D000089520E42093D00026EC73 +:106700002093D5002093D40021E02093D000DC0119 +:10671000680F791FA617B70741F0ED91F0E0EC592B +:10672000FA4FE491E093D300F5CFE091D500F0E08B +:10673000EC59FA4FE4918C918E130AC0E091D40089 +:10674000F0E0EC59FA4FE49181E011969C919E1390 +:1067500080E01092D000817008958F929F92AF9246 +:10676000BF92CF92DF92EF92FF920F931F93CF933E +:10677000DF93DC018C9110E0E0E08695179586951B +:10678000E795869517958695E7958695179586954D +:10679000E795869517958695E79511968C911197B3 +:1067A000869517958695E795869517958695E7952D +:1067B000869517958695E795869517958695E7951D +:1067C00012968C911297F0E030E08695F7958695B9 +:1067D00037958695F795869537958695F79586959D +:1067E00037958695F7958695379513968C911397DF +:1067F0008695F795869537958695F795869537957D +:106800008695F795869537958695F795869537956C +:1068100014968C91149790E020E086959795869534 +:10682000279586959795869527958695979586952C +:106830002795869597958695279515968C9186959B +:10684000979586952795869597958695279586950C +:1068500097958695279586959795869527955B01BB +:10686000DA014A0144E0840E911C6C91E5017991B2 +:106870005E017627C32ED12CA60140545E4DEE2E2C +:10688000F12CE701C054DF4D7E01EA01D880E70119 +:106890000881ED2CE02AC22ED12CA60140545D4D7A +:1068A000EA010881E02AF12CA70140565F4DEA0178 +:1068B000088106958795DF2FD071FD2E012F017E6F +:1068C000F026092F0072F0260E2F0479F026032FF0 +:1068D0000377F026022F0A73F0260F2D0295F0267B +:1068E0000F2D06950695F0260F2D0727F6940F25F8 +:1068F00006959795F79517957695CF2ED12CA601ED +:1069000040545E4DE12EF12CE701C054DF4D7E0175 +:10691000EA01D880E7010881ED2CE02AC92ED12CAC +:10692000A60140545D4DEA010881E02AF12CA7013F +:1069300040565F4DEA01088106958795D32FD071A7 +:10694000FD2E0E2F017EF026022F0072F026012F61 +:106950000479F0260F2F0377F026092F0A73F0260B +:106960000F2D0295F0260F2D06950695F0260F2D7A +:106970000727F6940F25069527953795E795769581 +:10698000C32ED12CA60140545E4DEE2EF12CE70112 +:10699000C054DF4D7E01EA01D880E7010881ED2C6B +:1069A000E02AC22ED12CA60140545D4DEA01088197 +:1069B000E02AF12CA70140565F4DEA0108810695B7 +:1069C0008795DF2FD071FD2E012F017EF026092F34 +:1069D0000072F0260E2F0479F026032F0377F0269D +:1069E000022F0A730F25F02EF2940F25F02EF69445 +:1069F000F6940F25F02EF72606950F25D12E102F91 +:106A000016959795F795D79476950F2F10E0A801D6 +:106A100040545E4D0D2D10E000541F4DEA01F880EA +:106A2000E80118810F2D012BE92EF12CA70140540C +:106A30005D4DEA011881012B10E000561F4DE80161 +:106A4000188116958795032F00711E2F117E01273F +:106A5000122F107201271D2D147901271F2F137774 +:106A60000127192F1A730127102F12950127102FB4 +:106A7000169516950127102F17270695102716959E +:106A800027953795E7957695032F10E0A801405498 +:106A90005E4D0E2F10E000541F4DEA01F880E80112 +:106AA00018810F2D012BE22EF12CA70140545D4DD2 +:106AB000EA011881012B10E000561F4DE8011881F2 +:106AC000169587950F2F00711D2D117E0127192F07 +:106AD000107201271E2F14790127132F1377012716 +:106AE000122F1A730127102F12950127102F1695B8 +:106AF00016950127102F172706950127102F169599 +:106B00009795F795D79476950F2F10E0A8014054EC +:106B10005E4D0D2D10E000541F4DEA01F880E80194 +:106B200018810F2D012BE92EF12CA70140545D4D4A +:106B3000EA011881012B10E000561F4DE801188171 +:106B400016958795032F00711E2F117E0127122F96 +:106B5000107201271D2D147901271F2F137701278C +:106B6000192F1A730127102F12950127102F169530 +:106B700016950127102F172706951027169527958C +:106B80003795E7957695032F10E0A80140545E4DA8 +:106B90000E2F10E000541F4DEA01F880E801188123 +:106BA0000F2D012BE22EF12CA70140545D4DEA017F +:106BB0001881012B10E000561F4DE8011881169531 +:106BC00087950F2F00711D2D117E1027092F007240 +:106BD00010270E2F04791027032F03771027022F79 +:106BE0000A731027012F02951027012F069506958D +:106BF0001027012F0727169501271D2D069597951C +:106C0000F7951795CF2ED12CA60140545E4DE12E5D +:106C1000F12CE701C054DF4D7E01EA01D880E70185 +:106C20000881ED2CE02AC92ED12CA60140545D4DDF +:106C3000EA010881E02AF12CA70140565F4DEA01E4 +:106C4000088106958795D32FD071FD2E0E2F017EDA +:106C5000F026022F0072F026012F0479F0260F2F64 +:106C60000377F026092F0A730F25F02EF2940F25D3 +:106C7000F02EF694F6940F257695702706957027DA +:106C8000769527953795E79568276D93A815B905EB +:106C900009F0EBCD1093DD2CF093DE2C9093DF2CDC +:106CA000E093E02C3093E12C2093E22CDF91CF9104 +:106CB0001F910F91FF90EF90DF90CF90BF90AF901A +:106CC0009F908F9008954F925F926F927F929F92C4 +:106CD000AF92BF92CF92DF92EF92FF920F931F93EA +:106CE000CF93DF93DC018C9110E0B12CEB2D8695D6 +:106CF000E795869517958695E795869517958695D8 +:106D0000E795869517958695E7958695179511963B +:106D10008C911197BE2E8695B7948695179586957A +:106D2000B794869517958695B79486951795869509 +:106D3000B7948695179512969C91129730E080E053 +:106D400096958795969537959695879596953795C7 +:106D500096958795969537959695879596953795B7 +:106D600013969C911397969587959695379596953A +:106D70008795969537959695879596953795969597 +:106D80008795969537951496EC91149790E000E0CE +:106D9000E6950795E6959795E6950795E695979577 +:106DA000E6950795E6959795E6950795E695979567 +:106DB0001596DC90D6940795D6949795D69407951A +:106DC000D6949795D6940795D6949795D69407958B +:106DD000D6949795E32FF0E0E054FE4DA12FB0E05C +:106DE000A054BF4DF081EC91EF2BA92FB0E0A0543F +:106DF000BD4DFC91EF2BF0E0E056FF4DE0802B0104 +:106E0000BA016C5F7F4FDA013B01AC90E201C9909F +:106E10002E01CA24FD2DE694F795D82FD071FD2EB2 +:106E2000EB2DE17EFE26E02FE072FE26E12FE479D5 +:106E3000FE26E32FE377FE26E92FEA73EF25FE2EE9 +:106E4000F294EF25FE2EF694F694EF25FE2EFC2408 +:106E5000E695FE26EB2D20FDFE24F69407958795FA +:106E6000E795BC2CB694C82ED12CA60140545E4D9B +:106E7000EE2EF12CE701C054DF4D7E01EA01D880EF +:106E8000E701F880ED2CEF28C02ED12CA60140544C +:106E90005D4DEA01F880EF28F12CA70140565F4DC7 +:106EA000EA01D880D694F795D32FD071ED2E412FDB +:106EB000417EE426592F5072E526CE2FC479EC2668 +:106EC000D82FD377ED26402F4A73E426FE2CF29478 +:106ED000EF24FE2CF694F694EF24FE2CFB24E6948B +:106EE000FE2420FDFD24F694979537951795B694CA +:106EF000C32ED12CE601C054DE4DE12EF12CA701AA +:106F000040545F4DD880EA01F880ED2CEF28C92E5F +:106F1000D12CA60140545D4DEA01F880EF28F12CF8 +:106F2000A70140565F4DEA01D880D694F795D82F37 +:106F3000D071ED2E4E2F417EE426502F5072E52663 +:106F4000C12FC479EC26D32FD377ED26492F4A736E +:106F5000E426FE2CF294EF24FE2CF694F694EF2413 +:106F6000FE2CFB24E694FE2420FDFD24F6940795D8 +:106F70008795E795B694C82ED12CE601C054DE4D16 +:106F8000EE2EF12CA70140545F4DD880EA01F88025 +:106F9000ED2CEF28C02ED12CA60140545D4DEA0106 +:106FA000F880EF28F12CA70140565F4DEA01D88008 +:106FB000D694F795D32FD071ED2E412F417EE42644 +:106FC000592F5072E526CE2FC479EC26D82FD377CF +:106FD000ED26402F4A73E426FE2CF294EF24FE2C7B +:106FE000F694F694EF24FE2CFB24E694FE2420FD78 +:106FF000FD24F694979537951795B694C32ED12C0A +:10700000E601C054DE4DE12EF12CA70140545F4D46 +:10701000D880EA01F880ED2CEF28C92ED12CA601EA +:1070200040545D4DEA01F880EF28F12CA70140564D +:107030005F4DEA01D880D694F795D82FD071ED2E08 +:107040004E2F417EE426502F5072E526C12FC47981 +:10705000EC26D32FD377ED26492F4A73E426FE2C56 +:10706000F294EF24FE2CF694F694EF24FE2CFB24ED +:10707000E694FE2420FDFD24F69407958795E79578 +:10708000B694C82ED12CE601C054DE4DEE2EF12C64 +:10709000A70140545F4DD880EA01F880ED2CEF281D +:1070A000C02ED12CA60140545D4DEA01F880EF2896 +:1070B000F12CA70140565F4DEA01D880D694F79590 +:1070C000D32FD071ED2E412F417EE426592F5072DF +:1070D000E526CE2FC479EC26D82FD377ED26402F86 +:1070E0004A73E426FE2CF294EF24FE2CF694F694D8 +:1070F000EF24FE2CFB24E694FE2420FDFD24F694D0 +:107100009795379517959B2C9694C32ED12CE60115 +:10711000C054DE4DE12EF12CA70140545F4DD880C4 +:10712000EA01F880ED2CEF28C92ED12CA60140549D +:107130005D4DEA01F880EF28F12CA70140565F4D24 +:10714000EA01D880D694F795D82FD0714E2F417E82 +:10715000F42EFD26502F5072F526C12FC479FC263F +:10716000D32FD377FD26492F4A73F426EF2CE294D0 +:10717000FE24EF2CE694E694FE24EF2CE924F6940A +:10718000FE24BE2EEF2D20FDED25E6950795879573 +:10719000B794C82ED12CE601C054DE4DEB2CF12C57 +:1071A000A70140545F4DD880EA01E881ED2CEE2A1A +:1071B000C02ED12CA60140545D4DEA01E881EE2A93 +:1071C000F12CA70140565F4DEA01F880DF2EF694BE +:1071D000D794F32FF071E12FE17EEF27F92FF072B2 +:1071E000EF27FB2DF479EF27F82FF377EF27F02F18 +:1071F000FA73EF27FE2FF295EF27FE2FF695F695FF +:10720000EF2796949E26E6959E2620FD9F24969431 +:10721000979537951795E32FF0E0AF0140545E4DF9 +:10722000E12FF0E0E054FF4DEA01F880E081EF2922 +:10723000E92EF12CA70140545D4DEA01F881EF2BB6 +:10724000F0E0E056FF4DE080EA2DF0E0EC59FB4F16 +:10725000E491EE25E301E9933E01AD24AD92A6173A +:10726000B70709F0D2CDB092DD2C8093DE2C0093CD +:10727000DF2C1093E02C3093E12C9093E22CDF91E3 +:10728000CF911F910F91FF90EF90DF90CF90BF9023 +:10729000AF909F907F906F905F904F900895AF92C6 +:1072A000BF92CF92DF92EF92FF920F931F93CF93F3 +:1072B000DF936091DD2C5091DE2C2091DF2C4091EA +:1072C000E02C3091E12CD091E22CFC015C0104E037 +:1072D000A00EB11C8191C52FC071962F917EC92738 +:1072E000922F9072C927942F9479C927932F93775F +:1072F000C9279D2F9A73C9277C2F7295C7277C2F8A +:1073000076957695C727A32FB0E08D0100541E4DCA +:107310006801A42FB0E08D0100541F4D7801D60103 +:107320000C91D7019C91092BED2EF12CD701A05483 +:10733000BD4D9C91092B10E000561F4DD8017C914A +:1073400078277C27C6957C2786957695279557952F +:107350006795C32FC071942F917EC9279D2F90727E +:10736000C927962F9479C927952F9377C927922FEC +:107370009A73C9277C2F7295C7277C2F76957695AF +:10738000C727052F10E0D801A054BE4D6D01062F70 +:1073900010E0D801A054BF4D7D01D6010C91D7015A +:1073A0009C91092BE22EF12CD701A054BD4D9C914C +:1073B000092B10E000561F4DD8017C9178277C27BF +:1073C000C6957C2786959D2F7695979537954795F9 +:1073D000C52FC071762F717EC727722F7072C72795 +:1073E000742F7479C727732F7377C727792F7A7310 +:1073F000C7277C2F7295C7277C2F76957695C72750 +:10740000032F10E0D801A054BE4D6D01042F10E0F1 +:10741000D801A054BF4D7D01D6010C91D7017C91BC +:10742000072BE92EF12CD701A054BD4D7C91072BE1 +:1074300010E000561F4DD8017C9178277C27C69517 +:107440007C2786957695279557956795C32FC071AC +:10745000742F717EC727792F7072C727762F7479A2 +:10746000C727752F7377C727722F7A73C7277C2F8B +:107470007295C7277C2F76957695C727052F10E044 +:10748000D801A054BE4D6D01062F10E0D801A054C4 +:10749000BF4D7D01D6010C91D7017C91072BE22EC7 +:1074A000F12CD701A054BD4D7C91072B10E0005664 +:1074B0001F4DD8017C9178277C27C6957C2786951F +:1074C0007695979537954795C52FC071762F717E24 +:1074D000C727722F7072C727742F7479C727732F2D +:1074E0007377C727792F7A73C7277C2F7295C727A1 +:1074F0007C2F76957695C727032F10E0D801A054EE +:10750000BE4D6D01042F10E0D801A054BF4D7D0188 +:10751000D6010C91D7017C91072BE92EF12CD701D4 +:10752000A054BD4D7C91072B10E000561F4DD80193 +:107530007C9178277C27C6957C278695769527951C +:1075400057956795C32FC071742F717EC727792F08 +:107550007072C727762F7479C727752F7377C7275F +:10756000722F7A73C7277C2F7295C7277C2F769549 +:107570007695C727052F10E0D801A054BE4D6D01A8 +:10758000062F10E0D801A054BF4D7D01D6010C910B +:10759000D7017C91072BE22EF12CD701A054BD4DD1 +:1075A0007C91072B10E000561F4DD8017C91782765 +:1075B0007C27C6957C278695769597953795479530 +:1075C000C52FC071762F717EC727722F7072C727A3 +:1075D000742F7479C727732F7377C727792F7A731E +:1075E000C7277C2F7295C7277C2F76957695C7275E +:1075F000032F10E0D801A054BE4D6D01042F10E000 +:10760000D801A054BF4D7D01D6010C91D7017C91CA +:10761000072BE92EF12CD701A054BD4D7C91072BEF +:1076200010E000561F4DD8017C9178277C27C69525 +:107630007C277695279557956795C32FC071742F32 +:10764000717E7C27C92FC0727C27C62FC4797C2706 +:10765000C52FC3777C27C22FCA737C27C72FC2953B +:107660007C27C72FC695C6957C278695C52FD0E069 +:10767000C054DE4D062F10E000541F4DD881D801B4 +:10768000CC91CD2B022F10E000541D4DD801DC9180 +:10769000CD2BD0E0C056DF4DC8818C27872776954B +:1076A0008727D92F8695D79537954795EA15FB05F6 +:1076B00009F010CE6093DD2C5093DE2C2093DF2C4C +:1076C0004093E02C3093E12CD093E22CDF91CF91CA +:1076D0001F910F91FF90EF90DF90CF90BF90AF90F0 +:1076E0000895CF93DF93EDEDFCE2A081718162817B +:1076F000338124819581472F40718A2F817E842791 +:10770000462F40728427432F44798427422F4377A2 +:107710008427492F4A738427482F42958427482F6E +:10772000469546958427482F4695842786956795E4 +:107730007795A795C22FD0E0C054DE4D432F50E07F +:1077400040545F4DB881EA018881B82B492F50E041 +:1077500040545D4DEA018881CB2FC82BD0E0C05A40 +:10776000DF4D88818695522F5071432F417E4527EA +:10777000592F507245275A2F54794527572F537741 +:107780004527562F5A734527542F52954527542F76 +:10779000569556954527542F5695452746959795C6 +:1077A00027953795C72FD0E0C054DE4D4A2F50E0C3 +:1077B00040545F4DB881EA014881B42B462F50E018 +:1077C00040545D4DEA014881CB2FC42BD0E0C05A14 +:1077D000DF4D4881842B8695572F50714A2F417E6B +:1077E0004527562F50724527532F54794527522F3E +:1077F00053774527592F5A734527542F52954527BC +:10780000542F569556954527542F569545274695FE +:1078100067957795A795C22FD0E0C054DE4D432FD2 +:1078200050E040545F4DB881EA014881B42B492FA4 +:1078300050E040545D4DEA014881CB2FC42BD0E08D +:10784000C05ADF4D4881842B8695C72FD0E0C054A5 +:10785000DE4D4A2F50E040545F4DB881EA01488127 +:10786000B42B462F50E040545D4DEA014881CB2FA8 +:10787000C42BD0E0C05ADF4D4881842B522F507169 +:10788000432F417E4527592F507245275A2F54794F +:107890004527572F53774527562F5A734527542F7F +:1078A00052954527542F569556954527542F569552 +:1078B00045274695979527953795A08371836283D1 +:1078C000338324839583DF91CF9108950F931F9382 +:1078D000CF93DF93A091DD2C7091DE2C2091DF2CD3 +:1078E0005091E02C4091E12C3091E22CFC01615050 +:1078F00008F4CDC1972F90718A2F817E8927922F0E +:1079000090728927952F94798927942F93778927C7 +:10791000932F9A738927982F92958927982F969558 +:1079200096958927982F96958927869527957795F7 +:10793000A795C42FD0E0C054DE4D852F90E0805431 +:107940009F4DB881EC018881B82B832F90E0805443 +:107950009D4DEC018881CB2FC82BD0E0C058DF4D66 +:10796000B881B695942F9071852F817E8927932FAA +:10797000907289279A2F94798927972F937789274F +:10798000922F9A738927982F92958927982F9695E9 +:1079900096958927982F96958927869537954795A7 +:1079A0005795C72FD0E0C054DE4D8A2F90E0805409 +:1079B0009F4D1881EC018881182B822F90E0805414 +:1079C0009D4DEC018881C12FC82BD0E0C058DF4D00 +:1079D0008881B82BB695972F90718A2F817E892741 +:1079E000922F90728927952F94798927942F9377D6 +:1079F0008927932F9A738927982F92958927982FF3 +:107A0000969596958927982F9695892786952795F7 +:107A10007795A795C42FD0E0C054DE4D852F90E018 +:107A200080549F4D1881EC018881182B832F90E0A2 +:107A300080549D4DEC018881C12FC82BD0E0C058E7 +:107A4000DF4D8881B82BB695942F9071852F817E5C +:107A50008927932F907289279A2F94798927972FB6 +:107A600093778927922F9A738927982F9295892740 +:107A7000982F969596958927982F9695892786957C +:107A8000379547955795C72FD0E0C054DE4D8A2FC4 +:107A900090E080549F4D1881EC018881182B822F33 +:107AA00090E080549D4DEC018881C12FC82BD0E01F +:107AB000C058DF4D8881B82BB695972F90718A2FCB +:107AC000817E8927922F90728927952F9479892713 +:107AD000942F93778927932F9A738927982F9295BC +:107AE0008927982F969596958927982F9695892777 +:107AF000869527957795A795C42FD0E0C054DE4D85 +:107B0000852F90E080549F4D1881EC018881182BBF +:107B1000832F90E080549D4DEC018881C12FC82BAC +:107B2000D0E0C058DF4D8881B82BB695942F907166 +:107B3000852F817E9827832F807298278A2F8479BA +:107B40009827872F83779827822F8A739827892FE2 +:107B500082959827892F869586959827892F8695CF +:107B60009827832F9695879547955795C72FD0E0EF +:107B7000C054DE4D0A2F10E000541F4D3881E8013B +:107B80009881392B022F10E000541D4DE801988197 +:107B9000C32FC92BD0E0C058DF4D3881B32BB69529 +:107BA000372F30719A2F917E9327322F307293277F +:107BB000352F34799327342F33779327382F3A731F +:107BC0009327392F32959327392F3695369593275A +:107BD000392F36959327969527957795A795C42F96 +:107BE000D0E0C054DE4D052F10E000541F4D388109 +:107BF000E8019881392B082F10E000541D4DE80151 +:107C00009881C32FC92BD0E0C058DF4D98813B2FFE +:107C1000392B3695C72FD0E0C054DE4D0A2F10E027 +:107C200000541F4DB881E8019881B92B022F10E054 +:107C300000541D4DE8019881CB2FC92BD0E0C058CE +:107C4000DF4DB881B32B342F3071952F917E932760 +:107C5000382F307293273A2F34799327372F337781 +:107C60009327322F3A739327392F32959327392F41 +:107C7000369536959327392F36959327382F969535 +:107C800037954795579580818B27819330CEA09368 +:107C9000DD2C7093DE2C2093DF2C5093E02C40934E +:107CA000E12C3093E22CDF91CF911F910F91089539 +:107CB000CF92DF92EF92FF921F93CF93DF931091B9 +:107CC000DD2CD091DE2CC091DF2C7091E02C409106 +:107CD000E12C2091E22CE42FF0E0E054FE4DA72FA0 +:107CE000B0E0A054BF4DE0813C91E32BA22FB0E067 +:107CF000A054BD4D3C91E32BF0E0E056FF4D3081A8 +:107D0000DC0180E0615008F405C2582F3695579584 +:107D10009D2F9071812F817E89279C2F90728927BA +:107D2000972F94798927942F93778927322F3A7345 +:107D30008327982F92958927982F9695969589272E +:107D4000982F969589279C2F86959795D795179567 +:107D50005695342F3071872F817E8327322F3072D2 +:107D60008327312F347983273D2F33778327392F8A +:107D70003A738327382F32958327382F36953695D7 +:107D80008327382F369583278695279547957795AE +:107D9000CD2ED12CF601E054FE4D6F01E12EF12CD9 +:107DA000F701E054FF4D7F01F6013081F70180813A +:107DB000832BE92EF12CF701E054FD4D3081E82FA3 +:107DC000E32BF0E0E058FF4D8081582B56953D2F76 +:107DD0003071812F817E8327392F30728327372F8F +:107DE00034798327342F33778327322F3A738327CD +:107DF000382F32958327382F369536958327382F9D +:107E00003695832786959795D7951795C42ED12CAF +:107E1000F601E054FE4D6F01E72EF12CF701E0541E +:107E2000FF4D7F01F6013081F7018081832BE22E27 +:107E3000F12CF701E054FD4D3081E82FE32BF0E009 +:107E4000E058FF4DC0815C2B5695342F3071872F41 +:107E5000817E8327322F30728327312F3479832715 +:107E60003D2F33778327392F3A738327382F329565 +:107E70008327382F369536958327382F36958327D5 +:107E80008695279547957795CD2ED12CF601E05410 +:107E9000FE4D6F01E12EF12CF701E054FF4D7F0103 +:107EA000F6013081F7018081832BE92EF12CF70157 +:107EB000E054FD4D3081E82FE32BF0E0E058FF4D1A +:107EC000C081C52BC6953D2F3071812F817E8327C0 +:107ED000392F30728327372F34798327342F337724 +:107EE0008327322F3A738327382F32958327382FF1 +:107EF000369536958327382F36958327869597951F +:107F0000D7951795C42ED12CF601E054FE4D6F0184 +:107F1000E72EF12CF701E054FF4D7F01F60130818F +:107F2000F7018081382BE22EF12CF701E054FD4D52 +:107F30008081E32FE82BF0E0E058FF4D8081C82BD3 +:107F4000C695342F3071872F817E8327322F307270 +:107F50008327312F347983273D2F33778327392F98 +:107F60003A738327382F32958327382F36953695E5 +:107F70008327382F36958327542F86952795579535 +:107F80007795CD2ED12CF601E054FE4D6F01E12EF8 +:107F9000F12CF701E054FF4D7F01F6013081F7012C +:107FA0008081832BE92EF12CF701E054FD4D3081C7 +:107FB000E82FE32BF0E0E058FF4D80818C2B482F19 +:107FC00046953D2F3071812F817E3827892F807211 +:107FD0003827872F84793827852F83773827822F72 +:107FE0008A733827832F82953827832F8695869525 +:107FF0003827832F86953827C92F3695C795D7956B +:108000001795E52FF0E0E054FE4D872F90E0805467 +:108010009F4D3081FC018081382B822F90E080546D +:108020009D4DFC019081E32FE92BF0E0E058FF4DDE +:108030009081842F892B382F3695ED2FF0E0CF01DA +:1080400080549E4D6C01E12FF0E0CF0180549F4D94 +:10805000F6014081FC019081492BEC2EF12CC701E7 +:1080600080549D4DFC019081E42FE92BF0E0E05815 +:10807000FF4D9081832F892B352F3071972F917E63 +:108080003927922F90723927912F947939279D2F74 +:10809000937739274C2F4A733427932F929539279A +:1080A000932F969596953927932F96953927452F97 +:1080B0003695279547957795C42ED12CF601E05437 +:1080C000FE4D6F01E72EF12CF701E054FF4D7F01CB +:1080D000F6013081F7019081392BE22EF12CF70166 +:1080E000E054FD4D9081E32FE92BF0E0E056FF4D89 +:1080F00030819C91E92FF0E0EC59FB4FE4917D0138 +:10810000F0E8EF0EF11C5E2F5327F70150839827FC +:108110009D93F8CD1093DD2CD093DE2CC093DF2CF3 +:108120007093E02C4093E12C2093E22CDF91CF91CF +:108130001F91FF90EF90DF90CF9008950F931F93C2 +:10814000FC01862F90812181428150E060E070E047 +:10815000BA0155274427522B492B9381792B8B0148 +:1081600022273327803208F471C0D80123E0B69566 +:10817000A7952A95E1F70A271B2798013695279599 +:1081800036952795BBE07695679557954795BA95AF +:10819000D1F70227132720E030E095E1000F111FEF +:1081A000221F331F9A95D1F7402B512B622B732B33 +:1081B0008B0122273327D80133E0B695A7953A954E +:1081C000E1F70A271B2798013695279536952795BD +:1081D000BBE07695679557954795BA95D1F70227F5 +:1081E000132720E030E095E1000F111F221F331FFD +:1081F0009A95D1F7402B512B622B732B8B012227A1 +:108200003327D80133E0B695A7953A95E1F70A27C9 +:108210001B2798013695279536952795BAE07695D0 +:10822000679557954795BA95D1F70227132720E010 +:1082300030E096E1000F111F221F331F9A95D1F7EE +:10824000402B512B622B732B805289CF408351835B +:10825000028373831F910F910895AF92BF92CF92C3 +:10826000DF92EF92FF920F931F93CF93DF936730CC +:10827000710509F451C09B0127703327232B09F0A6 +:108280004EC0EB016C015B0183E0B694A7948A9524 +:10829000E1F77B0196E0F694E7949A95E1F7EA0C12 +:1082A000FB1CEC0CFD1C8501015011090C0D1D1D62 +:1082B000A701401B510B60E070E0C80101960E94CD +:1082C00048530C151D0520F1D801EC91F0E0EC5954 +:1082D000FB4F44919701D7010A171B0768F48C9153 +:1082E000982F990FF90182919F01881F8827881F75 +:1082F000892B8C931197F0CF11968C9111978E7FCB +:10830000E42FE170E82B1196EC9301501109D9CFBD +:10831000C5018C0F9D1F04C087E090E001C0CB0118 +:10832000DF91CF911F910F91FF90EF90DF90CF9051 +:10833000BF90AF900895EF92FF920F931F93CF934A +:10834000DF93EC01CB0167307105D1F169E070E09A +:108350000E947852DE0120E030E088E090E02617AD +:10836000370739F1F90143E0F695E7954A95E1F7CA +:10837000E20FF31FEC0FFD1F408150E089010770F1 +:108380001127002E02C0559547950A94E2F74C93A9 +:108390000115110551F0E1817C01E01AF10A01C0DB +:1083A000EE0FEA94EAF74E2B4C932F5F3F4F119656 +:1083B000D6CFC90123E0880F991F2A95E1F702C0A3 +:1083C00087E090E0DF91CF911F910F91FF90EF90A8 +:1083D0000895CF93DF93FC016115710511F1808140 +:1083E000869580839B01295F3F4F83E036952795D3 +:1083F0008A95E1F7DF0141E050E04217530770F43E +:10840000C1919081D0E89D9FC00111248C2B8D9348 +:108410008081869580834F5F5F4FEFCFCB010197BF +:1084200002C080E090E0DF91CF910895EF92FF923B +:108430000F931F93CF93DF93EC01CB01673071054E +:1084400009F442C069E070E00E94785220E030E018 +:1084500088E090E026173707B9F1D90143E0B695D7 +:10846000A7954A95E1F7A20FB31FA90147705527B9 +:10847000AC0FBD1FEC91F0E0042E02C0F595E7951E +:108480000A94E2F74115510559F011960C91119794 +:108490007C01E41AF50A01C0000FEA94EAF7E02B28 +:1084A000F0E0EC59FB4FE4911196AC91B0E08D01F6 +:1084B00002C0159507954A95E2F7A8014E2740FDA1 +:1084C00005C02F5F3F4FC6CF81E001C080E0DF9144 +:1084D000CF911F910F91FF90EF9008951092432D2F +:1084E00008951092432D1092E32C1092442D08957C +:1084F000F8DF0E9484291092432D0895089508956D +:10850000DC0123E633E66150E8F04D91942F922789 +:1085100080E1989FA00111244927E42FF0E04295C3 +:108520004F70232F3327C9018427AC013E2F222708 +:108530002427352743E0EE0FFF1F4A95E1F72E274A +:108540003F27E1CFC90108958F929F92AF92BF92CA +:10855000CF92DF92EF92FF920F931F93CF93DF930F +:10856000CDB7DEB7C154D240CDBFDEBF8C016B01A9 +:108570008091E32C833009F440C138F4813069F0F4 +:10858000823009F4B5C00C94054B843009F4B3C2B1 +:10859000853009F4D8C40C94054BE090452EF0903A +:1085A000462EE114F104C1F0A701495F5F4F23E0BB +:1085B000569547952A95E1F765E47DE2C8010E944A +:1085C0002E536091452E7091462EC80146DE1092C2 +:1085D000452E1092462EB5C46115710509F4AAC046 +:1085E000C801F7DE5C01BC01C80120DFD82EB5014F +:1085F000C801A1DE5C019C01295F3F4FA901440F26 +:10860000551F93E0569547959A95E1F74A5F5F4F5E +:108610004138510538F060EC73E2CE0101960E94BA +:108620005A5391C0A3E036952795AA95E1F7A80182 +:1086300060E870E0CE0101960E94BB0D8C01CF5F17 +:10864000DD4FB882C150D240CE5FDD4FA882C2500C +:10865000D24083E694E29F938F93B0E8AB2EB12C87 +:10866000C501801B910B9F938F9381E090E08C0F4D +:108670009D1F800F911F9F938F930E946153080F3E +:10868000191FB501601B710B22E030E0AE014F5F96 +:108690005D4F81E090E08C0F9D1F800F911F0E9425 +:1086A000BB0D800F911F0F900F900F900F900F90A8 +:1086B0000F90A501481B590B21E030E02C0F3D1F06 +:1086C000280F391FD11003C08FEC93E202C08EED4A +:1086D00093E29F938F935F934F933F932F930E94C7 +:1086E00061530F900F900F900F900F900F902BC031 +:1086F000E090452EF090462EE114F104C1F0A70160 +:10870000495F5F4FF3E056954795FA95E1F765E4C9 +:108710007DE2C8010E942E539091452E8091462EF5 +:108720001092452E1092462EE92EF82E70C7611534 +:10873000710591F488E0E9E7F4E2DE011196019019 +:108740000D928A95E1F71092E32CBE016F5F7F4F87 +:1087500085E60E947C215BC79B01295F3F4F73E048 +:10876000369527957A95E1F7A80160E870E0CE018B +:1087700001960E94BB0D8C01CF5FDD4FD882C150A6 +:10878000D240CE5FDD4FC882C250D24083E694E231 +:108790009F938F93E0E8CE2ED12CC601801B910BC6 +:1087A0009F938F9381E090E08C0F9D1F800F911F0E +:1087B0009F938F930E946153800F911FB601681B96 +:1087C000790B22E030E0AE014F5F5D4FA1E0B0E0F9 +:1087D000AC0FBD1F8A0F9B1F0E94BB0D1092E32C94 +:1087E000BE016F5F7F4F85E60E947C210F900F9046 +:1087F0000F900F900F900F900AC78091442DB0906A +:10880000432D882331F0B1E0BB1508F455C1109217 +:10881000442DE5E0EB15B8F0F3E0BF1608F040C0DA +:1088200021E02B15C8F081E090E080932020909308 +:10883000212082E5D8018C9382E08093432D67E06C +:10884000E62EF12C3BC138E03B1508F0A8C08AE0C9 +:10885000B81609F4F5C030C1B3E1CB16D10408F461 +:10886000B9C0B601C801B5DD7C01BC01C801DEDDBF +:10887000882319F1B701C8015EDDF801818190E01C +:10888000982F88272081822B8093352D9093362D29 +:1088900083E9808380E2818383E08093432DBCC0A1 +:1088A000B601C80196DD7C01BC01C801BFDD88238B +:1088B00021F0F8E0EF16F10488F41092432DC7017F +:1088C000089667E070E00E947852462FE0915F2E94 +:1088D000F091602EB80181EC1995B8C0B701C801BC +:1088E0002ADDD8012C9111968C911197822712962E +:1088F0009C911297892713969C9113978927149618 +:108900009C911497891366C08B2D90E003972838AB +:1089100081F49C01220F331F820F931FFC01E85C3E +:10892000F24D11962D913D914C91208331834283DC +:1089300012C0FC01EE0FFF1F8E0F9F1F9C01285CD1 +:10894000324DF80180819181A281B381F901808348 +:108950009183A283B38345E050E0B801C801029639 +:108960000E943753F3E0BF1629F024E0B21621F03D +:1089700087E903C083E901C085E9D8018C9380E7CA +:1089800011968C9367E0C801BBDDF801878390875F +:1089900083E08B0D8093432D68E470E089C0F9E09B +:1089A000CF16D104B8F0B601C80113DD7C01BC01BB +:1089B000C8013CDD811111C0C701089667E070E075 +:1089C0000E947852462FE0915F2EF091602EB80100 +:1089D00081EC19951092432D39C0B701C801ABDC69 +:1089E00063E0C8018DDD7C01892BA1F7D8018C9152 +:1089F00082FF15C0B8E0BB1691F0E6E0BE1611F09C +:108A000087E901C085E9D8018C9380E211968C93A7 +:108A1000BA94BA94B092432D60E170E049C081E00D +:108A20008093442D8B2D90E00697B82EBB0C8B0DB8 +:108A30008C5F8093422DF80180818093372D3EC05A +:108A4000C114D10431F481E08093432D0E947E292A +:108A500033C0B601C801BDDC7C01BC01C801E6DC45 +:108A600081110FC0C701089667E070E00E9478523C +:108A7000462FE0915F2EF091602EB80181EC1995A0 +:108A800008C0B701C80157DC63E0C80139DD892B94 +:108A9000D1F282ECD8018C9361E0C80131DDF8019C +:108AA00081839283B092432D1092442D68E170E04F +:108AB000C801D3DB7C0102C0E12CF12C8091442D54 +:108AC000882309F4A4C52091422D30E048E35DE2FB +:108AD00064E170E0CE0101960E94BB0DBE016F5FA4 +:108AE0007F4F85E60E947C211092442D1092E32C4A +:108AF0000E9413228AC58091442DB090432D882373 +:108B000031F0F1E0FB1508F451C11092442D25E03D +:108B10002B15B8F033E0B31608F043C081E08B1595 +:108B2000C8F081E090E0809320209093212082E59E +:108B3000F801808382E08093432DE7E0EE2EF12C54 +:108B400037C1A8E0AB1508F0A4C0BAE0BB1609F421 +:108B5000F1C02CC1F3E1CF16D10408F4B5C0B601C1 +:108B6000C80137DC7C01BC01C80160DC882331F11D +:108B7000B701C801E0DBD80111968C91119790E004 +:108B8000982F88272C91822B8093352D9093362D0A +:108B900083E98C9380E211968C9383E08093432D3C +:108BA000B5C0B601C80115DC7C01BC01C8013EDCC2 +:108BB000882321F0B8E0EB16F10488F41092432DDD +:108BC000C701089667E070E00E947852462FE09156 +:108BD0005F2EF091602EB80181EC1995B1C0B701FC +:108BE000C801A9DBF8012081818182279281892730 +:108BF000938189279481891367C08B2D90E0039717 +:108C0000283889F49C01220F331F820F931FFC0127 +:108C1000E85CF24DD80111962D913D914C91208345 +:108C20003183428312C0FC01EE0FFF1F8E0F9F1F86 +:108C30009C01285C324DF80180819181A281B38131 +:108C4000F90180839183A283B38345E050E0B801AA +:108C5000C80102960E943753F3E0BF1629F024E0C2 +:108C6000B21621F087E903C083E901C085E9D80184 +:108C70008C9380E711968C9367E0C80141DCF80182 +:108C80008783908783E08B0D8093432D68E470E0A9 +:108C900089C0F9E0CF16D104B8F0B601C80199DB5C +:108CA0007C01BC01C801C2DB811111C0C70108965B +:108CB00067E070E00E947852462FE0915F2EF091BD +:108CC000602EB80181EC19951092432D39C0B7017F +:108CD000C80131DB63E0C80113DC7C01892BA1F7FB +:108CE000D8018C9182FF15C0B8E0BB1691F0E6E088 +:108CF000BE1611F087E901C085E9D8018C9380E2A6 +:108D000011968C93BA94BA94B092432D60E170E0BE +:108D100049C081E08093442D8B2D90E00697B82EBA +:108D2000BB0C8B0D8C5F8093422DF801808180936A +:108D3000372D3EC0C114D10431F481E08093432D1E +:108D40000E947E2933C0B601C80143DB7C01BC010F +:108D5000C8016CDB81110FC0C701089667E070E0A5 +:108D60000E947852462FE0915F2EF091602EB8015C +:108D700081EC199508C0B701C801DDDA63E0C801CC +:108D8000BFDB892BD1F282ECD8018C9361E0C80162 +:108D9000B7DBF80181839283B092432D1092442D6A +:108DA00068E170E0C80159DA7C0102C0E12CF12CC5 +:108DB0008091442D882309F42AC4F090242DFF20AB +:108DC000A9F1B601C80105DB5C01009729F41092F6 +:108DD000242D1092442D42C0823A910540F0BC01EE +:108DE000C80124DB91E08927C82ED12C03C0CC24F4 +:108DF000C394D12CB501C8019EDACD2829F462E1D3 +:108E0000C8017EDB892B29F0ACEFAF0DA093242D98 +:108E10002AC024E0F29ED0011124AC52B34D80E16F +:108E2000F80101900D928A95E1F71DC042E050E0F3 +:108E30006BE371E1CE0101960E940053EEE3F1E194 +:108E4000E4912091352D3091362D89819A81281712 +:108E5000390721F48091372D8E1729F01092432D78 +:108E60000E947E29D2C32091242D203109F04DC0CB +:108E70001092442D1092242D1092E32C20E130E02A +:108E800044EE5CE267E870E0CE0101960E94BB0D03 +:108E900063E674E2CE0181960E945A5320E130E0ED +:108EA00044EF5CE265E670E0CE0183960E94BB0D64 +:108EB00063E674E2CE018D5B9F4F0E945A5320E11E +:108EC00030E044E05DE263E470E0CE018B5B9F4FF5 +:108ED0000E94BB0D63E674E2CE018B599F4F0E9446 +:108EE0005A5320E130E044E15DE261E270E0CE01FE +:108EF00089599F4F0E94BB0D0E941322BE016F5FD4 +:108F00007F4F85E60E947C2180C380E3D8018C934B +:108F100011962C9362E0C801CF5BDD4F2883C154CA +:108F2000D240EEDAF80182839383CF5BDD4F288154 +:108F3000C154D2402C5F2093242D60E270E0C80120 +:108F40008CD97C0164C38091442DB090432D88233B +:108F500031F0F1E0FB1508F451C11092442D25E0E9 +:108F60002B15B8F033E0B31608F043C081E08B1541 +:108F7000C8F081E090E0809320209093212082E54A +:108F8000F801808382E08093432D37E0E32EF12CBB +:108F900037C1A8E0AB1508F0A4C0BAE0BB1609F4CD +:108FA000F1C02CC1F3E1CF16D10408F4B5C0B6016D +:108FB000C8010FDA7C01BC01C80138DA882331F11D +:108FC000B701C801B8D9D80111968C91119790E0DA +:108FD000982F88272C91822B8093352D9093362DB6 +:108FE00083E98C9380E211968C9383E08093432DE8 +:108FF000B5C0B601C801EDD97C01BC01C80116DAC3 +:10900000882321F0B8E0EB16F10488F41092432D88 +:10901000C701089667E070E00E947852462FE09101 +:109020005F2EF091602EB80181EC1995B1C0B701A7 +:10903000C80181D9F8012081818182279281892705 +:10904000938189279481891367C08B2D90E00397C2 +:10905000283889F49C01220F331F820F931FFC01D3 +:10906000E85CF24DD80111962D913D914C912083F1 +:109070003183428312C0FC01EE0FFF1F8E0F9F1F32 +:109080009C01285C324DF80180819181A281B381DD +:10909000F90180839183A283B38345E050E0B80156 +:1090A000C80102960E943753F3E0BF1629F024E06E +:1090B000B21621F087E903C083E901C085E9D80130 +:1090C0008C9380E711968C9367E0C80119DAF80158 +:1090D0008783908783E08B0D8093432D68E470E055 +:1090E00089C0F9E0CF16D104B8F0B601C80171D932 +:1090F0007C01BC01C8019AD9811111C0C701089631 +:1091000067E070E00E947852462FE0915F2EF09168 +:10911000602EB80181EC19951092432D39C0B7012A +:10912000C80109D963E0C801EBD97C01892BA1F7FB +:10913000D8018C9182FF15C0B8E0BB1691F0E6E033 +:10914000BE1611F087E901C085E9D8018C9380E251 +:1091500011968C93BA94BA94B092432D60E170E06A +:1091600049C081E08093442D8B2D90E00697B82E66 +:10917000BB0C8B0D8C5F8093422DF8018081809316 +:10918000372D3EC0C114D10431F481E08093432DCA +:109190000E947E2933C0B601C8011BD97C01BC01E5 +:1091A000C80144D981110FC0C701089667E070E07B +:1091B0000E947852462FE0915F2EF091602EB80108 +:1091C00081EC199508C0B701C801B5D863E0C801A2 +:1091D00097D9892BD1F282ECD8018C9361E0C80138 +:1091E0008FD9F80181839283B092432D1092442D40 +:1091F00068E170E0C80131D87C0102C0E12CF12C9B +:109200008091442D882309F402C28091432D9AEF66 +:10921000980F933008F04EC0D801FC90F5FAFF2467 +:10922000F0F81092252DE6E0AE2EE0E1BE2EE12C06 +:1092300047E650E0B501CE0101960E9400538B81B4 +:10924000882349F029813A818091352D9091362DDE +:1092500028173907B9F48D81882329F09C818091E2 +:10926000372D98130FC08F89882311F0FF2051F0FC +:10927000E091252D81E08E0F8093252DF0E0EA5DB1 +:10928000F24DE082E394B7E6AB0EB11CEFE0EE12D4 +:10929000CFCFFF2009F493C080EED8018C9380E8F3 +:1092A00011968C9362E0C8012BD9F80182839383D5 +:1092B00089E0A6C0893009F082C0B601C80189D80A +:1092C0007C01BC01C801B2D881110FC0C70108964A +:1092D00067E070E00E947852462FE0915F2EF09197 +:1092E000602EB80181EC1995BEC0B701C80123D822 +:1092F0006C01D8016C91262F30E073E0969587952C +:109300007A95E1F702972817390729F46E5FC801AB +:10931000F7D8892B69F082ECF801808361E0C801FD +:10932000EFD8D80111968C93119712969C93A4C0F4 +:10933000F12C67E6E62E5801FFEFAF1ABF0A8091C5 +:10934000252DF816E0F5EF2DF0E0EA5DF24D608195 +:10935000E69EB00111246A5F7F4E47E650E0CE01E1 +:1093600001960E9400538F89882339F14E8950E07D +:10937000F801808190E001974817590739F4B50149 +:10938000CE0106960E942153892BB9F02091252DFC +:10939000422F50E0415051093F2D832F90E0841718 +:1093A00095073CF4FC01EA5DF24D818180833F5FCB +:1093B000F4CF21502093252DFA94F394C0CF8091BF +:1093C000432D9AEF980F9430F0F49091252D26E2DA +:1093D0003DE2F9018E2F821B891708F069C0819147 +:1093E00084508230B8F782E0D8018C9380E61196E1 +:1093F0008C9362E0C80184D8F801828393838BE068 +:109400008093432D9ACD8B3009F052C0C114D10402 +:1094100009F44CC0B601C8010E94E9417C01BC01BD +:10942000C80104D881110FC0C701089667E070E039 +:109430000E947852462FE0915F2EF091602EB80185 +:1094400081EC19950EC0B701C8010E949B4153E001 +:10945000969587955A95E1F7682FC80151D8892BC1 +:1094600099F01092252D82ECD8018C9361E0C8010F +:1094700047D8F801818392838AE08093432D10922C +:10948000442D68E170E05BCDD80115968C9188235E +:1094900031F0813059F48093252D85E004C081E0BE +:1094A0008093252D84E08093262D02C01092252DD7 +:1094B0008091252D811103C06AEE73E213C08130C3 +:1094C000A9F46091262DB7E66B9FB0011124635D6E +:1094D0007F4E40E450E0CE0101960E940053BE0151 +:1094E0006F5F7F4F85E60E947C2168C0912C80E0F1 +:1094F00090E000E010E027E6822E7E013FEFE31AC5 +:109500003DEFF30A3DEFC32E33E2D32EA12C42E010 +:10951000B42E2091252D921680F50130E2E01E0731 +:1095200020F0081B190BF12C2EC0E92DF0E0EA5DAC +:10953000F24D6081869EB0011124635D7F4E40E450 +:1095400050E0C7010E940053FF92EF92DF92CF924A +:10955000C501801B910B9F938F9381E090E08C0F4E +:109560009D1F800F911F9F938F930E946153080F3F +:10957000191F9394CDBFDEBFCCCF0130A2E01A07F4 +:1095800080F6FF24F394EDEFFFEFEC0FFD1FE00FEB +:10959000F11F8EE28083EEEFFFEFEC0FFD1FE00F77 +:1095A000F11F1082BE016F5F7F4F85E60E947C2114 +:1095B000F11004C084E094E20E941B1886E694E255 +:1095C0000E941B1862E070E085E39DE20E949A21F0 +:1095D0008DE694E20E941B186091422D70E088E3B2 +:1095E0009DE20E949A2183E794E20E941B1861E0A9 +:1095F00070E087E39DE20E949A211092E32C109282 +:10960000252D0E9413221092442DE12CF12CC7012C +:10961000CF5BDD4FCDBFDEBFDF91CF911F910F91AB +:10962000FF90EF90DF90CF90BF90AF909F908F9082 +:109630000895FF920F931F93CF93DF93CDB7DEB7BB +:10964000EA97CDBFDEBF09EB11E388E0F82EF00EFC +:1096500091D2F80181938F01FE12FACF0E94CF18A8 +:1096600004D3882309F4F7C08091B9319091BA31BD +:10967000953009F46FC030F4913069F168F093309F +:1096800051F1E9C0983009F4C2C0993009F4C8C05A +:10969000963009F0E0C072C0803891F0823809F04D +:1096A000DAC08091BD318F7085D2E091C331F091E5 +:1096B000C431118112FB112710F980E07BD206C062 +:1096C0001091B5318091B63181111260E8D2812FAD +:1096D00061D280E0A1C0282F2D7F09F0BCC0882373 +:1096E00019F0823061F0B7C08091BB31813009F050 +:1096F000B2C0933009F080E08093B63127C08091EA +:10970000BB31811123C0E091BD311E2F1F7009F4C0 +:10971000A2C0812F4FD28091BA31833011F4EBD2A5 +:1097200015C0E091C331F091C43181818B7F818379 +:1097300024E8129FF0011124E95FFD4C1082E091B2 +:10974000C331F091C43180818E7F808380E032D23A +:10975000A6D264C081117FC01091BB311F779FD208 +:10976000A1D35DD28823E9F31093C304111102C081 +:1097700082E001C083E08093B8316DC080588230B0 +:1097800008F069C08091BB319091BC318C3DE3E021 +:109790009E0761F583E08A838AE389834FB7F89453 +:1097A000DE01139620E038E052E05093CA01E32F27 +:1097B000F0E0E4911092CA0120FF03C0E295EF703F +:1097C0003F5FEF708E2F90E0EA3010F0C79601C037 +:1097D000C0968D939D932F5F2C3139F74FBF5FD289 +:1097E0006AE370E0CE010196A3D00FC0AE014F5FD7 +:1097F0005F4F6091BD310E94270C8C01892B59F17C +:109800004ED2B80189819A810FD1A5D124C0803868 +:1098100011F545D28091B431BDD184D143D31BC061 +:10982000811119C08091BB318230A8F438D2809167 +:10983000BB318093B43136D38091B431811106C0ED +:109840008091C304811102C081E001C084E0809353 +:10985000B8310E94CB1809D2882311F020D24BD204 +:10986000EA96CDBFDEBFDF91CF911F910F91FF90A0 +:1098700008950895CF938091B831882351F0C09115 +:10988000C53180E097D1F1D18111D3DE8C2FCF91FA +:1098900091C1CF910895CF92DF92EF92FF920F93F3 +:1098A0001F93CF93DF93EC018B017A0111D38111C8 +:1098B00036C0E114F10439F0F70180819181081B71 +:1098C000190BC80FD91FC12CD12C0115110531F16D +:1098D0008091C1319091C231FC01EF5BFF4F20813B +:1098E00031978081281790F01DD1C4DFE114F10475 +:1098F00049F0F70180819181C80ED91EC082D182C2 +:1099000085E00DC0E5D2882301F309C0899142D1D9 +:1099100001501109FFEFCF1ADF0AD7CF80E0DF91A6 +:10992000CF911F910F91FF90EF90DF90CF9008950E +:10993000DF92EF92FF920F931F93CF93DF93D82F75 +:10994000C92F8B018091C531806834D12091BF31FE +:109950003091C0312017310728F00115110519F495 +:10996000E1D001C08901ED2EFC2ED12C011511058D +:1099700009F440C08091B831811102C082E04CC02E +:10998000853011F483E048C070D1882311F081E064 +:1099900043C051D181113CC042D1882339F3209179 +:1099A000C5318091C1319091C231FC0127FF05C0C2 +:1099B000EF5BFF4FC081D0E013C0E05CFF4FC08180 +:1099C00031968081D0E0C81BD1090AC0C830D105CA +:1099D00050F4F70181917F01DDD0015011092196EA +:1099E0000115110599F7DD24D394289709F0D12C9E +:1099F00099D0BCCFD110BECF0BC08091B831882395 +:109A000009F4BCCF853009F4BDCF2FD18111BFCF70 +:109A100012D1882391F380E0DF91CF911F910F91B4 +:109A2000FF90EF90DF900895DF92EF92FF920F93F7 +:109A30001F93CF93DF93D82FC92F8B018091C5310E +:109A40008068B8D02091BF313091C03120173107E4 +:109A500028F00115110519F465D001C08901ED2E1A +:109A6000FC2ED12C0115110509F442C08091B831AA +:109A7000811102C082E04EC0853011F483E04AC0FB +:109A8000F4D0882311F081E045C0D5D081113EC0CB +:109A9000C6D0882339F32091C5318091C13190918E +:109AA000C231FC0127FF05C0EF5BFF4FC081D0E052 +:109AB00015C0E05CFF4FC08131968081D0E0C81BAB +:109AC000D1090CC0C830D10560F4F701849162D08F +:109AD000FFEFEF1AFF0A0150110921960115110538 +:109AE00089F7DD24D394289709F0D12C1BD0BACF65 +:109AF000D110BCCF0BC08091B831882309F4BACF04 +:109B0000853009F4BBCFB1D08111BDCF94D088236B +:109B100091F380E0DF91CF911F910F91FF90EF9033 +:109B2000DF900895E091C331F091C431A091C1312B +:109B3000B091C231AF5BBF4F8C9190E08283938331 +:109B400080818D798083E091C131F091C231EF5BEA +:109B5000FF4F10820895E091C331F091C4318081AC +:109B60008D798083E091C131F091C231EF5BFF4F7D +:109B7000108208958091C1319091C231FC01EF5B58 +:109B8000FF4F208131E0320F3083FC01E20FF11DE5 +:109B9000808108952091C1313091C231F901EF5B8C +:109BA000FF4F908141E0490F4083F901E90FF11D1A +:109BB000808308958093C531482F4F7050E06091A5 +:109BC000C6047091C7049A0194E0220F331F9A953E +:109BD000E1F7E4E887FF11C0E49FC001E59F900D25 +:109BE0001124885F9D4C8093C1319093C231C9018B +:109BF00008969B01280F391F0DC0E49FC001E59F07 +:109C0000900D11248A539E4C8093C1319093C231A0 +:109C1000260F371F2093C3313093C43108958091AC +:109C2000C5318068C7DFE091C331F091C4318081D4 +:109C30008695817008958091C5318F77BBDFA091A3 +:109C4000C331B091C4318C9185FF0DC0E091C13119 +:109C5000F091C23112968D919C911397E05CFF4F69 +:109C6000808381E0089580E008958091C5318F77E9 +:109C7000A1DFA091C331B091C4318C9184FF0DC09C +:109C8000E091C131F091C23112968D919C91139760 +:109C9000E05CFF4F808381E0089580E0089580912B +:109CA000C5318F7787DFE091C331F091C431808176 +:109CB0008D788083E091C331F091C43180818160DF +:109CC0008083E091C131F091C231EF5BFF4F108290 +:109CD0008091C53180686EDFE091C331F091C4316D +:109CE000808181608083E091C131F091C231EF5B6E +:109CF000FF4F10820895E091C331F091C43181810A +:109D000084608183E091C331F091C4318181807C92 +:109D1000803459F48091C53180584CDFE091C331D3 +:109D2000F091C43181818460818308951F93CF9322 +:109D3000DF931F921F92CDB7DEB7182F4A83698336 +:109D400039DFE091C331F091C4311182E091C33128 +:109D5000F091C431812F881F8827881F880F808346 +:109D6000E091C331F091C43169816183E091C331E5 +:109D7000F091C431128213822091C1313091C231ED +:109D800024833583110F110B4A814123F901E05CD3 +:109D9000FF4F40833196108281E00F900F90DF914A +:109DA000CF911F910895AF92BF92CF92DF92EF9221 +:109DB000FF920F931F93CF93DF93A62E8C017C010C +:109DC00084E0E80EF11CB12CBA1409F443C0F80188 +:109DD000D081DD23C1F1C180D280F701319780812C +:109DE000F7019081923010F498E001C098E128E0EA +:109DF00030E0C0E02C153D0520F4CF5F220F331F6B +:109E0000F9CFC92B9D2F9F70963010F080E023C0B2 +:109E1000CF7EF1E4CF16D104C8F7882321F081303A +:109E200021F4C06C0AC0C06403C0C068811105C0C1 +:109E30004C2D6C2F80E88D0F79DF4C2D6C2F8D2FE2 +:109E400075DF882319F3B3940B5F1F4F85E0E80E8D +:109E5000F11CBACF81E0DF91CF911F910F91FF905C +:109E6000EF90DF90CF90BF90AF90089580E090E0AA +:109E7000E091C604F091C7049C0144E0220F331F17 +:109E80004A95E1F7E20FF31F11864091C604509105 +:109E9000C704FA01E20FF31F118201968630910583 +:109EA00039F708958091B93187FF0DC0C4DE811163 +:109EB00005C08091B8318111F9CF09C04CCE809195 +:109EC000B831882321F0ABDE8823C9F32BCE089567 +:109ED0000F931F93CF93E091C604F091C704E05A0B +:109EE000FF4F00811181C4E68091C53187FF0AC010 +:109EF00096DE811105C08091B831811105C021C065 +:109F000080E024C098DEF5CF8530E9F0E091C331E0 +:109F1000F091C431818182FD18C0E091C604F091B6 +:109F2000C704E05AFF4F8081918180179107E1F2C9 +:109F30002FEF2C0FCC2319F08C01C22FD5CF84E04A +:109F400005C082E003C083E001C081E0CF911F9192 +:109F50000F91089563D069D0E0ECF4E081818E7FA9 +:109F6000818380818F7780831092B7310895CF935A +:109F7000DF93E0E4F0E014828481836084834ED038 +:109F800054D0C0ECD4E088818F7788838881806842 +:109F900088831092B8311092B4311092B631109279 +:109FA000B53188818064888348E068E480E8BEDE5B +:109FB00048E068E480E0BADE88858064888789812B +:109FC00081608983DF91CF910895CF93DF933FB76D +:109FD000F894C0ECD1E022E02A87EAE1F0E0E491D5 +:109FE000A0ECB4E0DA96EC93DA97EBE1F0E0E491E0 +:109FF000DB96EC93DB971A868FED94E38E7F1696B3 +:10A000008D939C93179785E18C9318962C933FBF63 +:10A0100081E08093B731DF91CF91A9CFE0ECF4E0FC +:10A0200080858370808711860895E0ECF4E08FEFDF +:10A030008287848708951F920F920FB60F92112482 +:10A0400008B60F9218BE09B60F9219BE0BB60F9242 +:10A050001BBE2F933F934F935F936F937F938F9389 +:10A060009F93AF93BF93EF93FF938091CA0487FFB1 +:10A0700008C08091C80487FF04C080E88093CA04A8 +:10A08000F8DB8091CA0486FF07C080E48093CA048D +:10A090001092B8310E94BA188091CA0485FF14C08A +:10A0A00080E28093CA048091B431882311F084E067 +:10A0B00007C08091C304811102C081E001C083E028 +:10A0C0008093B8310E94A9188091CA0484FF14C0FB +:10A0D00080E18093CA0482E08093B8311092B43159 +:10A0E0001092C304C3DE48E068E480E81FDE48E065 +:10A0F00068E480E01BDEBDDBFF91EF91BF91AF9183 +:10A100009F918F917F916F915F914F913F912F918F +:10A110000F900BBE0F9009BE0F9008BE0F900FBEA0 +:10A120000F901F901895CF93DF93EC01FC01709670 +:10A130008BE0DF011D928A95E9F782E08C838987A5 +:10A1400083E08E8761E0CE0101962DDE882361F0E9 +:10A1500061E0CE01069627DE882331F061E0CE0172 +:10A160000B96DF91CF911FCE80E0DF91CF910895C4 +:10A170000F931F93CF93DF932091B8312430E1F4F4 +:10A18000FC010489158926893789012B022B032BB1 +:10A1900099F0EB0181810EDDFE0101900020E9F7CD +:10A1A0003197BF016C1B7D0B40E050E0CE01DF9189 +:10A1B000CF911F910F916FCB82E0DF91CF911F91D3 +:10A1C0000F9108950F931F93CF93DF93FC0180911C +:10A1D000B8318430A9F484899589A689B789892BF7 +:10A1E0008A2B8B2B69F08A01EB018181E3DC40E053 +:10A1F00050E0B801CE01DF91CF911F910F914BCB71 +:10A2000082E0DF91CF911F910F910895CF93FC01D0 +:10A210008091B831843001F584899589A689B78900 +:10A22000892B8A2B8B2BC1F0C62F8181C3DC209117 +:10A23000C1313091C231F901EF5BFF4F908131970D +:10A240008081981720F48C2FA5DC80E006C06ADCA2 +:10A250003FDE8823C1F301C082E0CF910895CF9300 +:10A26000DF932091B831243091F5FC014489558960 +:10A2700066897789452B462B472B49F181819ADCEA +:10A280008091C5312091C1313091C231F90187FFF0 +:10A2900005C0EF5BFF4F808190E008C0E05CFF4F9E +:10A2A00080813196408190E0841B9109892B69F06F +:10A2B000F901EF5BFF4FD0813197C08133DCDC17B0 +:10A2C00020F006DE811104C02DDC80E001C082E0B8 +:10A2D000DF91CF910895CF93DF932091B83124304F +:10A2E00099F4FC014489558966897789452B462B69 +:10A2F000472B51F0EC0181815DDC91DC882321F05A +:10A30000CE01DF91CF91ABCFDF91CF910895CF9365 +:10A31000DF932091B831243019F08FEF9FEF46C0C2 +:10A32000FC014489558966897789452B462B472B43 +:10A33000A1F386813FDC7FDC882379F38091C531EE +:10A340002091C1313091C231F90187FF05C0EF5B27 +:10A35000FF4F808190E008C0E05CFF4F8081319624 +:10A36000208190E0821B9109892B21F003DCC82F0A +:10A37000D0E002C0CFEFDFEF2091C5318091C13135 +:10A380009091C231FC0127FF05C0EF5BFF4F208198 +:10A3900030E008C0E05CFF4F20813196808130E0E2 +:10A3A000281B3109232B09F4D6DBCE01DF91CF9195 +:10A3B00008950895FF920F931F93CF93DF93EC01BD +:10A3C00054DC882309F48EC0888190E02091BD314F +:10A3D0003091BE312817390709F084C08091BA3115 +:10A3E000813259F018F4803249F17CC0823209F48C +:10A3F00057C0833209F467C075C08091B931813A82 +:10A4000009F070C04CDC0BDC8823E9F38C89FD88F3 +:10A410000E891F89BFDB8F2DBDDB802FBBDB812F1A +:10A42000B9DB888DB7DB898DB5DB8A8DB3DB7ADB51 +:10A43000DF91CF911F910F91FF9034CD8091B93171 +:10A44000813209F04FC02BDCF6DB811105C0809111 +:10A45000B8318111F9CF46C08DDB082F8BDB182F67 +:10A4600089DBF82E87DB4F2D50E060E070E0BA0109 +:10A4700055274427782B402B512B4C8B5D8B6E8BB3 +:10A480007F8B78DB888F76DB898F74DB8A8F63DB49 +:10A4900009DDCE01DF91CF911F910F91FF9089CF00 +:10A4A0008091B9318132F1F4FADBFCDC8091BB316F +:10A4B0009091BC31888B998BCE01DF91CF911F9108 +:10A4C0000F91FF9076CF8091B931813259F4E7DB5B +:10A4D000E9DC6091BB31CE01DF91CF911F910F91EB +:10A4E000FF9067CFDF91CF911F910F91FF9008955B +:10A4F000AA1BBB1B51E107C0AA1FBB1FA617B707AA +:10A5000010F0A61BB70B881F991F5A95A9F78095C5 +:10A510009095BC01CD010895B7FF04C003D0821B04 +:10A52000930B089509D0A59F900DB49F900DA49F03 +:10A53000800D911D11240895A29FB001B39FC00109 +:10A54000A39F700D811D1124911DB29F700D811D5F +:10A550001124911D08958F929F92AF92BF92CF9236 +:10A56000DF92EF92FF92CF93DF93EC0168817981C4 +:10A570008A819B81611571058105910521F464E251 +:10A5800079ED8BE597E02DE133EF41E050E0E2D645 +:10A5900049015A019B01AC01A7EAB1E4C3DF6B0199 +:10A5A0007C01ACEEB4EFA5019401B8DFDC01CB0176 +:10A5B0008C0D9D1DAE1DBF1DB7FF03C00197A109E6 +:10A5C000B04888839983AA83BB839F77DF91CF911B +:10A5D000FF90EF90DF90CF90BF90AF909F908F90C3 +:10A5E0000895B9CF82E290E2B6CFA0E0B0E08093C8 +:10A5F000222090932320A0932420B0932520089517 +:10A60000FB01DC0102C005900D9241505040D8F78B +:10A610000895FB01DC018D91059080190110D9F39B +:10A62000990B0895FB01DC014150504048F0059022 +:10A630000D920020C9F701C01D9241505040E0F733 +:10A640000895FB01DC0104C08D910190801921F473 +:10A6500041505040C8F7881B990B0895FB01DC015D +:10A6600002C001900D9241505040D8F708956817EC +:10A67000790768F4FB01DC01E40FF51FA40FB51F97 +:10A6800002C002900E9241505040D8F70895E6CF94 +:10A69000DC0101C06D9341505040E0F70895FC018A +:10A6A0008191861721F08823D9F79927089531974A +:10A6B000CF010895FB01DC0101900D920020E1F72C +:10A6C00008950F931F93CF93DF93CDB7DEB72E97E7 +:10A6D000CDBFDEBF0E891F89888D998D26E02C8322 +:10A6E00009831A8397FF02C080E090E801978D8369 +:10A6F0009E83AE01445E5F4F6A8D7B8DCE010196D5 +:10A7000067D04D815E8157FD0AC02F813885421781 +:10A7100053070CF49A01F801E20FF31F10822E96F2 +:10A72000CDBFDEBFDF91CF911F910F9108950F93A1 +:10A730001F93CF93DF93CDB7DEB72E97CDBFDEBF8C +:10A740000E891F89888D998D2EE02C8309831A83A9 +:10A7500097FF02C080E090E801978D839E83AE0151 +:10A76000445E5F4F6A8D7B8DCE01019631D04D8165 +:10A770005E8157FD0AC02F813885421753070CF4BC +:10A780009A01F801E20FF31F10822E96CDBFDEBFB3 +:10A79000DF91CF911F910F910895CF93DF93CDB7A4 +:10A7A000DEB72E97CDBFDEBF8DE08C838C899D896F +:10A7B00089839A83AE01485E5F4F6E897F89CE019F +:10A7C00001968FD32E96CDBFDEBFDF91CF91089536 +:10A7D0002F923F924F925F926F927F928F929F92B1 +:10A7E000AF92BF92CF92DF92EF92FF920F931F939F +:10A7F000CF93DF93CDB7DEB72C97CDBFDEBF7C0103 +:10A800006B018A01FC0116821782838181FFB0C12E +:10A81000CE0101964C01F7019381F60193FD8591DC +:10A8200093FF81916F01882309F49EC1853239F429 +:10A8300093FD859193FF81916F01853221F4B701DA +:10A8400090E0D6D4E8CF512C312C20E02032A0F477 +:10A850008B3269F030F4803259F0833269F4206130 +:10A860002CC08D3239F0803339F4216026C022604B +:10A87000246023C0286021C027FD27C030ED380F99 +:10A880003A3078F426FF06C0FAE05F9E300D1124BE +:10A89000532E13C08AE0389E300D1124332E2062CF +:10A8A0000CC08E3221F426FD5FC1206406C08C36B8 +:10A8B00011F4206802C0883641F4F60193FD8591B9 +:10A8C00093FF81916F018111C1CF982F9F7D955486 +:10A8D000933028F40C5F1F4FFFE3F9830DC08336DC +:10A8E00031F0833771F0833509F057C021C0F8018A +:10A8F000808189830E5F1F4F44244394512C54015F +:10A9000014C03801F2E06F0E711CF801A080B18014 +:10A9100026FF03C0652D70E002C06FEF7FEFC50119 +:10A920002C871DD42C0183012C852F77222E16C055 +:10A930003801F2E06F0E711CF801A080B18026FF93 +:10A9400003C0652D70E002C06FEF7FEFC5012C875B +:10A95000FBD32C012C852068222E830123FC19C0F7 +:10A96000832D90E048165906A0F4B70180E290E0EC +:10A970003FD43A94F5CFF50127FC859127FE8191CC +:10A980005F01B70190E034D431103A94F1E04F1AEE +:10A9900051084114510479F7DEC0843611F089362C +:10A9A00031F5F80127FF07C06081718182819381B1 +:10A9B0000C5F1F4F08C060817181072E000C880B4F +:10A9C000990B0E5F1F4F2F76722E97FF09C090953F +:10A9D0008095709561957F4F8F4F9F4F2068722EA5 +:10A9E0002AE030E0A40155D4A82EA81843C085372A +:10A9F00029F42F7EB22E2AE030E025C0F22FF97F15 +:10AA0000BF2E8F36C1F018F4883579F0ADC080378D +:10AA100019F0883721F0A8C02F2F2061B22EB4FE84 +:10AA20000DC08B2D8460B82E09C024FF0AC09F2F53 +:10AA30009660B92E06C028E030E005C020E130E085 +:10AA400002C020E132E0F801B7FE07C060817181E9 +:10AA5000828193810C5F1F4F06C06081718180E00D +:10AA600090E00E5F1F4FA40114D4A82EA818FB2D50 +:10AA7000FF777F2E76FE0BC0372D3E7FA51450F456 +:10AA800074FE0AC072FC08C0372D3E7E05C0BA2C89 +:10AA9000372D03C0BA2C01C0B52C34FF0DC0FE0108 +:10AAA000EA0DF11D8081803311F4397E09C032FF37 +:10AAB00006C0B394B39404C0832F867809F0B3948E +:10AAC00033FD12C030FF06C05A2CB31418F4530CD7 +:10AAD0005B18B32CB31460F4B70180E290E03C87BC +:10AAE00087D3B3943C85F6CFB31410F43B1801C060 +:10AAF000312C34FF11C0B70180E390E03C8778D35C +:10AB00003C8532FF16C031FD03C088E790E002C0EB +:10AB100088E590E0B7010CC0832F867851F031FFB3 +:10AB200002C08BE201C080E237FD8DE2B70190E008 +:10AB30005FD3A51430F4B70180E390E059D35A9461 +:10AB4000F8CFAA94F401EA0DF11D8081B70190E0DD +:10AB50004FD3A110F6CF332009F45DCEB70180E2C8 +:10AB600090E046D33A94F7CFF7018681978102C0EF +:10AB70008FEF9FEF2C96CDBFDEBFDF91CF911F915E +:10AB80000F91FF90EF90DF90CF90BF90AF909F908C +:10AB90008F907F906F905F904F903F902F9008958F +:10ABA00020FD09C0FC0123FD05C022FF02C0738304 +:10ABB000628351834083089544FD10C046FD10C058 +:10ABC000DB01FC01AA0FBB1FEE1FFF1F1094D1F782 +:10ABD0006A0F7B1F8E1F9F1F31E003C033E001C04F +:10ABE00034E0660F771F881F991F3150D1F7620F2D +:10ABF000711D811D911D08950F931F93CF93DF93B6 +:10AC00008C01C801B7D2EC0197FD06C08AD2892B0E +:10AC1000C1F7B801CE0124D3CE01DF91CF911F91AE +:10AC20000F9108958F929F92AF92BF92CF92DF9231 +:10AC3000EF92FF920F931F93CF93DF931F92CDB7A5 +:10AC4000DEB78C01C62E7A01298394D2AC01552738 +:10AC500029814B32510521F04D32510561F42068B4 +:10AC6000CA94C11002C080E06FC0C801298382D29B +:10AC7000298197FDF8CF322F3D7FD32E322F3073AD +:10AC800039F5803329F5BB24BA94BC0C09F449C0CA +:10AC9000C80129836FD2298197FD43C0382F3F7D9A +:10ACA000383561F48D2D8264D82ECA94CA94CC2094 +:10ACB000C1F1C8015FD297FF0BC033C026FF04C0AB +:10ACC0002D2D2260D22E03C03D2D3261D32ECB2CF0 +:10ACD000812C912C540120ED280F283078F0D4FEDF +:10ACE00003C0B801BDD21AC02A3040F0D6FEF9CF59 +:10ACF0002F7D3FEE320F3630A0F727504D2DC50186 +:10AD0000B4015ADF4B015C018D2D8260D82ECA94AC +:10AD1000CC2051F0C8012ED297FFDDCFD1FC04C06A +:10AD2000A2CF812C912C5401D7FE08C0B094A094DE +:10AD300090948094811C911CA11CB11C2D2DB501F7 +:10AD4000A401C7012DDF81E00F90DF91CF911F910A +:10AD50000F91FF90EF90DF90CF90BF90AF909F90BA +:10AD60008F9008956F927F928F929F92AF92BF9231 +:10AD7000CF92DF92EF92FF920F931F93CF93DF93C7 +:10AD8000CDB7DEB7A197CDBFDEBF5C017A01CE01A2 +:10AD900001966C0180E2F60111928A95E9F7F501BE +:10ADA000838040E050E0912C712C70E0A1E0B0E095 +:10ADB000F90183FC859183FE81918F01982F9F017A +:10ADC000811103C080E090E07AC08E3519F44115FE +:10ADD000510549F1E72FF0E0E417F5073CF48D3514 +:10ADE00059F18D3219F4772001F103C0711001C0BF +:10ADF000982E892F8695869586958601080F111DB8 +:10AE0000892F87703D0101C0660C8A95EAF7F80129 +:10AE1000808186298083991559F0991510F49F5FD8 +:10AE2000E8CF9150E6CF71E004C07724739401C05D +:10AE3000712C4F5F5F4FBCCF772019F08E818062FD +:10AE40008E83711103C09924939416C0F6019E015C +:10AE50002F5D3F4F808180958193E217F307D1F7F3 +:10AE6000F2CFE114F10429F0F7018083C7010196C4 +:10AE70007C016150912CE9F0C50169A37BD169A1E6 +:10AE800097FD15C0282F269526952695F601E20FE9 +:10AE9000F11D208130E0AC014770552702C0359587 +:10AEA00027954A95E2F720FDDCCFB501D9D1911065 +:10AEB00089CFE114F10411F0F7011082C801A196C5 +:10AEC000CDBFDEBFDF91CF911F910F91FF90EF902B +:10AED000DF90CF90BF90AF909F908F907F906F90BA +:10AEE00008954F925F927F928F929F92AF92BF92FE +:10AEF000CF92DF92EF92FF920F931F93CF93DF9346 +:10AF00001F92CDB7DEB76C012B015A01FC011682EE +:10AF10001782712CF601F380F201F3FC8591F3FEA8 +:10AF20008191382F2F01882309F4E5C090E03983FF +:10AF3000F8D03981892B19F0C6015EDEEBCF3532AE +:10AF400041F4F201F3FC3591F3FE31912F013532DA +:10AF500059F4C60139830ED1398197FDCAC038171B +:10AF6000C9F2B6017DD1C7C03A3239F4F3FC35914C +:10AF7000F3FE31912F0151E001C050E0420110E099 +:10AF800020ED230F2A3088F45260612F70E080E0BA +:10AF900090E040E2598310DE162FF401F3FC359166 +:10AFA000F3FE31914F015981EBCF052F232F24015F +:10AFB00051FF03C0111102C09EC01FEF383619F0B7 +:10AFC0003C3659F011C0F401F3FC2591F3FE2191B8 +:10AFD0002F01283649F4052F08600460F201F3FCC4 +:10AFE0002591F3FE21912F01222309F484C0622FC1 +:10AFF00070E08FE096E129839CD02981892B09F4A8 +:10B000007AC000FD07C0F501E080F180C50102961D +:10B010005C0102C0E12CF12C2E3649F4F601468188 +:10B02000578160E070E0202FC701BADD73CF23366F +:10B0300089F401FF11E0C6019DD097FD5AC0E114CB +:10B04000F10429F0F7018083C70101967C011150BA +:10B0500091F74BC02B3551F49201A701612FC60126 +:10B0600081DE2C01892B09F040C03AC0C60129833A +:10B07000C3DD298197FD3DC02F3641F128F42436E8 +:10B0800019F1293631F124C0233769F02537E1F071 +:10B090001FC0E114F10429F0F7018082C701019675 +:10B0A0007C01115059F0C60165D04C0197FD06C0D6 +:10B0B00038D0892B71F3B601C401D2D0E114F10468 +:10B0C000A1F0F701108211C0006203C0006101C04D +:10B0D0000064202FA701612FC601A4DD811105C0E6 +:10B0E000F6018381807329F406C000FD13CF7394A9 +:10B0F00011CF772019F0872D90E002C08FEF9FEFDE +:10B100000F90DF91CF911F910F91FF90EF90DF9003 +:10B11000CF90BF90AF909F908F907F905F904F9017 +:10B120000895911114C1803219F089508550D0F7DB +:10B130000895FC010590061621F00020D9F7C00102 +:10B1400008953197CF010895FC010590615070403A +:10B150000110D8F7809590958E0F9F1F0895FC01E0 +:10B160006150704001900110D8F7809590958E0F36 +:10B170009F1F0895CF93DF93EC012B8120FF33C0F5 +:10B1800026FF0AC02F7B2B838E819F8101968E83A1 +:10B190009F838A8190E029C022FF0FC0E881F98156 +:10B1A0008081082E000C990B009719F420622B83E4 +:10B1B0001AC03196E883F9830EC0EA85FB8519959C +:10B1C00097FF09C02B81019611F080E201C080E158 +:10B1D000822B8B8308C02E813F812F5F3F4F2E83B0 +:10B1E0003F83992702C08FEF9FEFDF91CF910895A2 +:10B1F0000F931F93CF93DF93FB01238121FD03C0A6 +:10B200008FEF9FEF28C022FF16C04681578124810F +:10B2100035814217530744F4A081B1819D012F5F0E +:10B220003F4F208331838C93268137812F5F3F4F9F +:10B230002683378310C0EB01092F182F0084F18576 +:10B24000E02D1995892BE1F68E819F8101968E83E1 +:10B250009F83812F902FDF91CF911F910F910895A0 +:10B26000FB01238120FF12C026FD10C08F3F3FEF5E +:10B27000930761F082832F7D2064238326813781A9 +:10B280002150310926833783992708958FEF9FEF47 +:10B290000895FA01AA27283051F1203181F1E8946C +:10B2A0006F936E7F6E5F7F4F8F4F9F4FAF4FB1E0B9 +:10B2B0003ED0B4E03CD0670F781F891F9A1FA11DB4 +:10B2C000680F791F8A1F911DA11D6A0F711D811DB5 +:10B2D000911DA11D20D009F468943F912AE0269F7A +:10B2E00011243019305D3193DEF6CF010895462FD9 +:10B2F0004770405D4193B3E00FD0C9F7F6CF462FBA +:10B300004F70405D4A3318F0495D31FD4052419322 +:10B3100002D0A9F7EACFB4E0A695979587957795DF +:10B320006795BA95C9F700976105710508959B0166 +:10B33000AC010A2E06945795479537952795BA95EF +:10B34000C9F7620F731F841F951FA01D08959927C9 +:10B3500088270895052E97FB16F400940FD057FD0B +:10B3600005D014D007FC02D046F408C05095409593 +:10B37000309521953F4F4F4F5F4F089590958095A1 +:10B38000709561957F4F8F4F9F4F0895A1E21A2EC0 +:10B39000AA1BBB1BFD010DC0AA1FBB1FEE1FFF1F79 +:10B3A000A217B307E407F50720F0A21BB30BE40BC9 +:10B3B000F50B661F771F881F991F1A9469F7609510 +:10B3C0007095809590959B01AC01BD01CF010895CA +:04B3D000F894FFCF1F +:10B3D40002400F00831000000104100000018208E5 +:10B3E40000000100000000000000000000009001C7 +:10B3F4000100010000000000000088238F238F2338 +:10B404009B23A723B123CE23DC23052408240C2467 +:10B414008726E925FE250226172648265B26882648 +:10B424003E000426140004043E00042E040C04040C +:10B4340000080008000000000000000800080808D8 +:10B4440008080800080008000000080800080808A8 +:10B4540000800080000000000000008000808080E8 +:10B4640080808000800080000000808000808080D8 +:10B4740000010001000000000000000100010101C2 +:10B4840001010100010001000000010100010101AE +:10B4940000000000000000000000000000000000A8 +:10B4A4000101010101010101010101010101010188 +:10B4B4000101010101010101010101010101010178 +:10B4C4000101010101010101010101010101010168 +:10B4D4000000000000000000000000000000000068 +:10B4E4000000000000000000000000000000000058 +:10B4F4000000000000000000000000000000000048 +:10B504000101010101010101010101010101010127 +:10B514000000000000000000000000000000000027 +:10B524000000000000000000000000000000000017 +:10B5340001010101010101010101010101010101F7 +:10B5440000000000000000000000000000000000F7 +:10B5540001010101010101010101010101010101D7 +:10B5640001010101010101010101010101010101C7 +:10B5740000000000000000000000000000000000C7 +:10B5840001010101010101010101010101010101A7 +:10B594000000000202000002000202020200000297 +:10B5A4000000000202000002000202020200000287 +:10B5B4000000000202000002000202020200000277 +:10B5C4000404040606040406040606060604040627 +:10B5D4000404040606040406040606060604040617 +:10B5E4000000000202000002000202020200000247 +:10B5F4000000000202000002000202020200000237 +:10B6040004040406060404060406060606040406E6 +:10B614000000000202000002000202020200000216 +:10B6240004040406060404060406060606040406C6 +:10B6340004040406060404060406060606040406B6 +:10B6440004040406060404060406060606040406A6 +:10B654000404040606040406040606060604040696 +:10B6640000000002020000020002020202000002C6 +:10B6740000000002020000020002020202000002B6 +:10B684000404040606040406040606060604040666 +:10B694000008080800000008000008000808000866 +:10B6A4000008080800000008000008000808000856 +:10B6B4000008080800000008000008000808000846 +:10B6C4001018181810101018101018101818101836 +:10B6D4001018181810101018101018101818101826 +:10B6E4000008080800000008000008000808000816 +:10B6F4000008080800000008000008000808000806 +:10B7040010181818101010181010181018181018F5 +:10B7140000080808000000080000080008080008E5 +:10B7240010181818101010181010181018181018D5 +:10B7340010181818101010181010181018181018C5 +:10B7440010181818101010181010181018181018B5 +:10B7540010181818101010181010181018181018A5 +:10B764000008080800000008000008000808000895 +:10B774000008080800000008000008000808000885 +:10B784001018181810101018101018101818101875 +:10B79400546F6F206D616E7920646174612E000DA9 +:10B7A4000A504152495459204552524F52000D0AF1 +:10B7B400504152495459204F4B00556E6B6E6F7770 +:10B7C4006E206361726420747970652E0025732085 +:10B7D4006F7220005468657265206973206174205B +:10B7E4006C65617374206F6E65206D6F7265206384 +:10B7F40061726420747970652063616E6469646148 +:10B8040074652C2062757420746865726520776194 +:10B8140073206E6F7420656E6F756768207465722F +:10B824006D696E616C206275666665722073706105 +:10B8340063652E0D0A00415451413A0900554944AB +:10B844003A090053414B3A09004E4F2044415441B8 +:02B854000000F2 :020000021000EC :1000000000000000000000000000000000000000F0 :1000100000000000000000000000000000000000E0 From 6016bb7944f1efe600573b614fedc7b8f927c47d Mon Sep 17 00:00:00 2001 From: Michal Demin Date: Thu, 15 Jun 2017 22:09:29 +0200 Subject: [PATCH 017/104] ReaderThreshold is stored in eeprom. Signed-off-by: Michal Demin --- Firmware/Chameleon-Mini/Codec/Codec.c | 1 - Firmware/Chameleon-Mini/Codec/Codec.h | 4 ++-- Firmware/Chameleon-Mini/Settings.c | 3 ++- Firmware/Chameleon-Mini/Settings.h | 1 + Firmware/Chameleon-Mini/Terminal/Commands.c | 4 ++-- 5 files changed, 7 insertions(+), 6 deletions(-) diff --git a/Firmware/Chameleon-Mini/Codec/Codec.c b/Firmware/Chameleon-Mini/Codec/Codec.c index bb845e8..2a23415 100644 --- a/Firmware/Chameleon-Mini/Codec/Codec.c +++ b/Firmware/Chameleon-Mini/Codec/Codec.c @@ -23,7 +23,6 @@ static volatile struct { } ReaderFieldFlags = { false }; uint8_t CodecBuffer[CODEC_BUFFER_SIZE]; -uint16_t ReaderThreshold = 400; // standard value // the following three functions prevent sending data directly after turning on the reader field void CodecReaderFieldStart(void) // DO NOT CALL THIS FUNCTION INSIDE APPLICATION! diff --git a/Firmware/Chameleon-Mini/Codec/Codec.h b/Firmware/Chameleon-Mini/Codec/Codec.h index 4ac44c6..9ee49b0 100644 --- a/Firmware/Chameleon-Mini/Codec/Codec.h +++ b/Firmware/Chameleon-Mini/Codec/Codec.h @@ -13,6 +13,7 @@ #include #include "../Common.h" #include "../Configuration.h" +#include "../Settings.h" #include "ISO14443-2A.h" #include "Reader14443-2A.h" @@ -89,7 +90,6 @@ #define CodecPtrRegister1 (*((volatile uint8_t**) &GPIOR8)) #define CodecPtrRegister2 (*((volatile uint8_t**) &GPIORA)) -extern uint16_t ReaderThreshold; extern uint16_t Reader_FWT; #define FWI2FWT(x) ((uint32_t)(256 * 16 * ((uint32_t)1 << (x))) / (CODEC_CARRIER_FREQ / 1000) + 1) @@ -172,7 +172,7 @@ INLINE void CodecInitCommon(void) DACB.CTRLB = DAC_CHSEL_SINGLE_gc; DACB.CTRLC = DAC_REFSEL_AVCC_gc; DACB.CTRLA = DAC_IDOEN_bm | DAC_ENABLE_bm; - DACB.CH0DATA = ReaderThreshold; // real threshold voltage can be calculated with ch0data * Vref / 0xFFF + DACB.CH0DATA = GlobalSettings.ActiveSettingPtr->ReaderThreshold; // real threshold voltage can be calculated with ch0data * Vref / 0xFFF /* Configure Analog Comparator 0 to detect changes in demodulated reader field */ ACA.AC0MUXCTRL = AC_MUXPOS_DAC_gc | AC_MUXNEG_PIN7_gc; diff --git a/Firmware/Chameleon-Mini/Settings.c b/Firmware/Chameleon-Mini/Settings.c index 90cbaf6..1505cc7 100644 --- a/Firmware/Chameleon-Mini/Settings.c +++ b/Firmware/Chameleon-Mini/Settings.c @@ -25,7 +25,8 @@ SettingsType EEMEM StoredSettings = { .LogMode = DEFAULT_LOG_MODE, .LEDRedFunction = DEFAULT_RED_LED_ACTION, .LEDGreenFunction = DEFAULT_GREEN_LED_ACTION, - .PendingTaskTimeout = DEFAULT_PENDING_TASK_TIMEOUT + .PendingTaskTimeout = DEFAULT_PENDING_TASK_TIMEOUT, + .ReaderThreshold = 400 }} }; diff --git a/Firmware/Chameleon-Mini/Settings.h b/Firmware/Chameleon-Mini/Settings.h index 29e4b9e..507d900 100644 --- a/Firmware/Chameleon-Mini/Settings.h +++ b/Firmware/Chameleon-Mini/Settings.h @@ -29,6 +29,7 @@ typedef struct { LEDHookEnum LEDRedFunction; /// Red LED function for this setting. LEDHookEnum LEDGreenFunction; /// Green LED function for this setting. uint16_t PendingTaskTimeout; /// Timeout for timeout commands for this setting, in multiples of 100 ms. + uint16_t ReaderThreshold; } SettingsEntryType; typedef struct { diff --git a/Firmware/Chameleon-Mini/Terminal/Commands.c b/Firmware/Chameleon-Mini/Terminal/Commands.c index 84057c6..4033146 100644 --- a/Firmware/Chameleon-Mini/Terminal/Commands.c +++ b/Firmware/Chameleon-Mini/Terminal/Commands.c @@ -578,7 +578,7 @@ CommandStatusIdType CommandSetTimeout(char* OutMessage, const char* InParam) CommandStatusIdType CommandGetThreshold(char* OutParam) { - snprintf_P(OutParam, TERMINAL_BUFFER_SIZE, PSTR("%u"), ReaderThreshold); + snprintf_P(OutParam, TERMINAL_BUFFER_SIZE, PSTR("%u"), GlobalSettings.ActiveSettingPtr->ReaderThreshold); return COMMAND_INFO_OK_WITH_TEXT_ID; } @@ -593,7 +593,7 @@ CommandStatusIdType CommandSetThreshold(char* OutMessage, const char* InParam) if (!sscanf_P(InParam, PSTR("%5d"), &tmp) || tmp > CODEC_MAXIMUM_THRESHOLD) return COMMAND_ERR_INVALID_PARAM_ID; DACB.CH0DATA = tmp; - ReaderThreshold = tmp; + GlobalSettings.ActiveSettingPtr->ReaderThreshold = tmp; return COMMAND_INFO_OK_ID; } From 372fe67da473da47aaab296d7427e0b689ffb787 Mon Sep 17 00:00:00 2001 From: Michal Demin Date: Thu, 15 Jun 2017 22:10:34 +0200 Subject: [PATCH 018/104] Make terminal commands executable from within firmware. Signed-off-by: Michal Demin --- Firmware/Chameleon-Mini/Terminal/CommandLine.c | 12 ++++++++++++ Firmware/Chameleon-Mini/Terminal/CommandLine.h | 1 + 2 files changed, 13 insertions(+) diff --git a/Firmware/Chameleon-Mini/Terminal/CommandLine.c b/Firmware/Chameleon-Mini/Terminal/CommandLine.c index e62403b..bd990ee 100644 --- a/Firmware/Chameleon-Mini/Terminal/CommandLine.c +++ b/Firmware/Chameleon-Mini/Terminal/CommandLine.c @@ -389,6 +389,18 @@ static CommandStatusIdType CallCommandFunc( return Status; } +void CommandExecute(const char* command) +{ + uint8_t i; + + for (i = 0; i < ARRAY_COUNT(CommandTable); i++) { + if (strcmp_P(command, CommandTable[i].Command) == 0) { + CallCommandFunc(&CommandTable[i], CHAR_EXEC_MODE, NULL); + break; + } + } +} + static void DecodeCommand(void) { uint8_t i; diff --git a/Firmware/Chameleon-Mini/Terminal/CommandLine.h b/Firmware/Chameleon-Mini/Terminal/CommandLine.h index 3ee0388..097a3ea 100644 --- a/Firmware/Chameleon-Mini/Terminal/CommandLine.h +++ b/Firmware/Chameleon-Mini/Terminal/CommandLine.h @@ -15,6 +15,7 @@ void CommandLineInit(void); bool CommandLineProcessByte(uint8_t Byte); void CommandLineTick(void); +void CommandExecute(const char* command); void CommandLineAppendData(void const * const Buffer, uint16_t Bytes); /* Functions for timeout commands */ From c9ebec90f45d1bbf72588fc7cd31b6f72ae64b9e Mon Sep 17 00:00:00 2001 From: Michal Demin Date: Thu, 15 Jun 2017 22:11:17 +0200 Subject: [PATCH 019/104] Add CLONE command This command is extended original identify command. Upon execution it will do following: - change current config to "reader" mode - identify card - if multiple or no card detected -> end - change config to identified card (mifare classic 1k/4k or ultralight) - set UID of the card Signed-off-by: Michal Demin --- .../Chameleon-Mini/Application/Reader14443A.c | 124 ++++++++++++------ .../Chameleon-Mini/Application/Reader14443A.h | 3 +- .../Chameleon-Mini/Terminal/CommandLine.c | 11 +- Firmware/Chameleon-Mini/Terminal/Commands.c | 14 ++ Firmware/Chameleon-Mini/Terminal/Commands.h | 3 + 5 files changed, 115 insertions(+), 40 deletions(-) diff --git a/Firmware/Chameleon-Mini/Application/Reader14443A.c b/Firmware/Chameleon-Mini/Application/Reader14443A.c index ab00f00..91434be 100644 --- a/Firmware/Chameleon-Mini/Application/Reader14443A.c +++ b/Firmware/Chameleon-Mini/Application/Reader14443A.c @@ -546,6 +546,7 @@ uint16_t Reader14443AAppProcess(uint8_t* Buffer, uint16_t BitCount) * This function identifies a PICC. * ************************************/ case Reader14443_Identify: + case Reader14443_Identify_Clone: { uint16_t rVal = Reader14443A_Select(Buffer, BitCount); if (Selected) @@ -680,49 +681,98 @@ uint16_t Reader14443AAppProcess(uint8_t* Buffer, uint16_t BitCount) } } - if (CardCandidatesIdx == 0) - { - CommandLinePendingTaskFinished(COMMAND_INFO_OK_WITH_TEXT_ID, "Unknown card type."); - } else if (CardCandidatesIdx == 1) { - char tmpType[64]; - memcpy_P(tmpType, &CardIdentificationList[CardCandidates[0]].Type, 64); - CommandLinePendingTaskFinished(COMMAND_INFO_OK_WITH_TEXT_ID, tmpType); - } else { - char tmpBuf[TERMINAL_BUFFER_SIZE]; - uint16_t size = 0, tmpsize = 0; - bool enoughspace = true; + if (Reader14443CurrentCommand == Reader14443_Identify) { + if (CardCandidatesIdx == 0) + { + CommandLinePendingTaskFinished(COMMAND_INFO_OK_WITH_TEXT_ID, "Unknown card type."); + } else if (CardCandidatesIdx == 1) { + char tmpType[64]; + memcpy_P(tmpType, &CardIdentificationList[CardCandidates[0]].Type, 64); + CommandLinePendingTaskFinished(COMMAND_INFO_OK_WITH_TEXT_ID, tmpType); + } else { + char tmpBuf[TERMINAL_BUFFER_SIZE]; + uint16_t size = 0, tmpsize = 0; + bool enoughspace = true; - uint8_t i; - for (i = 0; i < CardCandidatesIdx; i++) - { - if (size <= TERMINAL_BUFFER_SIZE) // prevents buffer overflow + uint8_t i; + for (i = 0; i < CardCandidatesIdx; i++) { - char tmpType[64]; - memcpy_P(tmpType, &CardIdentificationList[CardCandidates[i]].Type, 64); - tmpsize = snprintf(tmpBuf + size, TERMINAL_BUFFER_SIZE - size, "%s or ", tmpType); - size += tmpsize; - } else { - break; + if (size <= TERMINAL_BUFFER_SIZE) // prevents buffer overflow + { + char tmpType[64]; + memcpy_P(tmpType, &CardIdentificationList[CardCandidates[i]].Type, 64); + tmpsize = snprintf(tmpBuf + size, TERMINAL_BUFFER_SIZE - size, "%s or ", tmpType); + size += tmpsize; + } else { + break; + } } + if (size > TERMINAL_BUFFER_SIZE) + { + size -= tmpsize; + enoughspace = false; + } + tmpBuf[size-4] = '.'; + tmpBuf[size-3] = '\0'; + CommandLinePendingTaskFinished(COMMAND_INFO_OK_WITH_TEXT_ID, tmpBuf); + if (!enoughspace) + TerminalSendString("There is at least one more card type candidate, but there was not enough terminal buffer space.\r\n"); } - if (size > TERMINAL_BUFFER_SIZE) - { - size -= tmpsize; - enoughspace = false; + // print general data + TerminalSendString("ATQA:\t"); + CommandLineAppendData(&CardCharacteristics.ATQA, 2); + TerminalSendString("UID:\t"); + CommandLineAppendData(CardCharacteristics.UID, CardCharacteristics.UIDSize); + TerminalSendString("SAK:\t"); + CommandLineAppendData(&CardCharacteristics.SAK, 1); + } else if (Reader14443CurrentCommand == Reader14443_Identify_Clone) { + if (CardCandidatesIdx == 1) { + int cfgid = -1; + switch (CardCandidates[0]) { + case CardType_NXP_MIFARE_Ultralight: + { + cfgid = CONFIG_MF_ULTRALIGHT; + // TODO: enter MFU clone mdoe + break; + } + case CardType_NXP_MIFARE_Classic_1k: + case CardType_Infineon_MIFARE_Classic_1k: + { + if (CardCharacteristics.UIDSize == UIDSize_Single) { + cfgid = CONFIG_MF_CLASSIC_1K; + } else if (CardCharacteristics.UIDSize == UIDSize_Double) { + cfgid = CONFIG_MF_CLASSIC_1K_7B; + } + break; + } + case CardType_NXP_MIFARE_Classic_4k: + case CardType_Nokia_MIFARE_Classic_4k_emulated_6212: + case CardType_Nokia_MIFARE_Classic_4k_emulated_6131: + { + if (CardCharacteristics.UIDSize == UIDSize_Single) { + cfgid = CONFIG_MF_CLASSIC_4K; + } else if (CardCharacteristics.UIDSize == UIDSize_Double) { + cfgid = CONFIG_MF_CLASSIC_4K_7B; + } + break; + } + default: + cfgid = -1; + } + + if (cfgid > -1) { + CommandLinePendingTaskFinished(COMMAND_INFO_OK_WITH_TEXT_ID, "Cloned OK!"); + + ConfigurationSetById(cfgid); + ApplicationReset(); + ApplicationSetUid(CardCharacteristics.UID); + } else { + CommandLinePendingTaskFinished(COMMAND_INFO_OK_WITH_TEXT_ID, "Clone unsupported!"); + } + } else { + CommandLinePendingTaskFinished(COMMAND_INFO_OK_WITH_TEXT_ID, "Multiple possibilities, not clonable!"); } - tmpBuf[size-4] = '.'; - tmpBuf[size-3] = '\0'; - CommandLinePendingTaskFinished(COMMAND_INFO_OK_WITH_TEXT_ID, tmpBuf); - if (!enoughspace) - TerminalSendString("There is at least one more card type candidate, but there was not enough terminal buffer space.\r\n"); } - // print general data - TerminalSendString("ATQA:\t"); - CommandLineAppendData(&CardCharacteristics.ATQA, 2); - TerminalSendString("UID:\t"); - CommandLineAppendData(CardCharacteristics.UID, CardCharacteristics.UIDSize); - TerminalSendString("SAK:\t"); - CommandLineAppendData(&CardCharacteristics.SAK, 1); Reader14443CurrentCommand = Reader14443_Do_Nothing; CardCandidatesIdx = 0; diff --git a/Firmware/Chameleon-Mini/Application/Reader14443A.h b/Firmware/Chameleon-Mini/Application/Reader14443A.h index 63b8706..613beb0 100644 --- a/Firmware/Chameleon-Mini/Application/Reader14443A.h +++ b/Firmware/Chameleon-Mini/Application/Reader14443A.h @@ -29,7 +29,8 @@ typedef enum { Reader14443_Send_Raw, Reader14443_Get_UID, Reader14443_Read_MF_Ultralight, - Reader14443_Identify + Reader14443_Identify, + Reader14443_Identify_Clone } Reader14443Command; diff --git a/Firmware/Chameleon-Mini/Terminal/CommandLine.c b/Firmware/Chameleon-Mini/Terminal/CommandLine.c index bd990ee..41a44c9 100644 --- a/Firmware/Chameleon-Mini/Terminal/CommandLine.c +++ b/Firmware/Chameleon-Mini/Terminal/CommandLine.c @@ -298,7 +298,7 @@ const PROGMEM CommandEntryType CommandTable[] = { { .Command = COMMAND_FIELD, .ExecFunc = NO_FUNCTION, - .ExecParamFunc = NO_FUNCTION, + .ExecParamFunc = NO_FUNCTION, .SetFunc = CommandSetField, .GetFunc = CommandGetField }, @@ -308,7 +308,14 @@ const PROGMEM CommandEntryType CommandTable[] = { .ExecParamFunc = NO_FUNCTION, .SetFunc = NO_FUNCTION, .GetFunc = NO_FUNCTION - } + }, + { + .Command = COMMAND_CLONE, + .ExecFunc = CommandExecClone, + .ExecParamFunc = NO_FUNCTION, + .SetFunc = NO_FUNCTION, + .GetFunc = NO_FUNCTION + } }; #define STATUS_TABLE_ENTRY(Id, Text) \ diff --git a/Firmware/Chameleon-Mini/Terminal/Commands.c b/Firmware/Chameleon-Mini/Terminal/Commands.c index 4033146..83a907b 100644 --- a/Firmware/Chameleon-Mini/Terminal/Commands.c +++ b/Firmware/Chameleon-Mini/Terminal/Commands.c @@ -624,3 +624,17 @@ CommandStatusIdType CommandGetField(char* OutMessage) OutMessage[1] = '\0'; return COMMAND_INFO_OK_WITH_TEXT_ID; } + +CommandStatusIdType CommandExecClone(char *OutMessage) +{ + ConfigurationSetById(CONFIG_ISO14443A_READER); + + ApplicationReset(); + + Reader14443CurrentCommand = Reader14443_Identify_Clone; + Reader14443AAppInit(); + Reader14443ACodecStart(); + CommandLinePendingTaskTimeout = &Reader14443AAppTimeout; + + return TIMEOUT_COMMAND; +} diff --git a/Firmware/Chameleon-Mini/Terminal/Commands.h b/Firmware/Chameleon-Mini/Terminal/Commands.h index 6e2e364..cb17dca 100644 --- a/Firmware/Chameleon-Mini/Terminal/Commands.h +++ b/Firmware/Chameleon-Mini/Terminal/Commands.h @@ -181,6 +181,9 @@ CommandStatusIdType CommandSetThreshold(char* OutMessage, const char* InParam); CommandStatusIdType CommandSetField(char* OutMessage, const char* InParam); CommandStatusIdType CommandGetField(char* OutMessage); +#define COMMAND_CLONE "CLONE" +CommandStatusIdType CommandExecClone(char* OutMessage); + #define COMMAND_LIST_END "" /* Defines the end of command list. This is no actual command */ From 80ddd96ac5715a8fd4376f376c76a32a0ccb4ea7 Mon Sep 17 00:00:00 2001 From: Michal Demin Date: Thu, 15 Jun 2017 22:11:38 +0200 Subject: [PATCH 020/104] Add CLONE command to button. Signed-off-by: Michal Demin --- Firmware/Chameleon-Mini/Button.c | 7 +++++++ Firmware/Chameleon-Mini/Button.h | 1 + 2 files changed, 8 insertions(+) diff --git a/Firmware/Chameleon-Mini/Button.c b/Firmware/Chameleon-Mini/Button.c index 458db97..e2d2b6b 100644 --- a/Firmware/Chameleon-Mini/Button.c +++ b/Firmware/Chameleon-Mini/Button.c @@ -4,6 +4,7 @@ #include "Settings.h" #include "Memory.h" #include "Map.h" +#include "Terminal/CommandLine.h" #include "Application/Application.h" #define BUTTON_PORT PORTA @@ -27,6 +28,7 @@ static const MapEntryType PROGMEM ButtonActionMap[] = { { .Id = BUTTON_ACTION_RECALL_MEM, .Text = "RECALL_MEM" }, { .Id = BUTTON_ACTION_TOGGLE_FIELD, .Text = "TOGGLE_FIELD" }, { .Id = BUTTON_ACTION_STORE_LOG, .Text = "STORE_LOG" }, + { .Id = BUTTON_ACTION_CLONE, .Text = "CLONE" }, }; static void ExecuteButtonAction(ButtonActionEnum ButtonAction) @@ -180,6 +182,11 @@ static void ExecuteButtonAction(ButtonActionEnum ButtonAction) break; } + case BUTTON_ACTION_CLONE: + { + CommandExecute("CLONE"); + break; + } default: break; diff --git a/Firmware/Chameleon-Mini/Button.h b/Firmware/Chameleon-Mini/Button.h index 0bc67c9..c23f013 100644 --- a/Firmware/Chameleon-Mini/Button.h +++ b/Firmware/Chameleon-Mini/Button.h @@ -32,6 +32,7 @@ typedef enum { BUTTON_ACTION_RECALL_MEM, BUTTON_ACTION_TOGGLE_FIELD, BUTTON_ACTION_STORE_LOG, + BUTTON_ACTION_CLONE, /* This has to be last element */ BUTTON_ACTION_COUNT From 63c8fb481284dce6460f451f9a57a364951b3fd9 Mon Sep 17 00:00:00 2001 From: Georg Date: Tue, 20 Jun 2017 18:33:35 +0200 Subject: [PATCH 021/104] chamlog python update --- Software/Chameleon/Log.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/Software/Chameleon/Log.py b/Software/Chameleon/Log.py index 64e24e9..bcf7a24 100644 --- a/Software/Chameleon/Log.py +++ b/Software/Chameleon/Log.py @@ -17,13 +17,13 @@ eventTypes = { 0x10: { 'name': 'GENERIC', 'decoder': textDecoder }, 0x11: { 'name': 'CONFIG SET', 'decoder': textDecoder }, 0x12: { 'name': 'SETTING SET', 'decoder': textDecoder }, - 0x13: { 'name': 'UID SET', 'decoder': textDecoder }, + 0x13: { 'name': 'UID SET', 'decoder': binaryDecoder }, 0x20: { 'name': 'RESET APP', 'decoder': noDecoder }, 0x40: { 'name': 'CODEC RX', 'decoder': binaryDecoder }, 0x41: { 'name': 'CODEC TX', 'decoder': binaryDecoder }, - 0x42: { 'name': 'CODEC RX W/ PARITY', 'decoder': binaryDecoder }, - 0x43: { 'name': 'CODEC TX W/ PARITY', 'decoder': binaryDecoder }, + 0x42: { 'name': 'CODEC RX W/PARITY', 'decoder': binaryDecoder }, + 0x43: { 'name': 'CODEC TX W/PARITY', 'decoder': binaryDecoder }, 0x80: { 'name': 'APP READ', 'decoder': binaryDecoder }, 0x81: { 'name': 'APP WRITE', 'decoder': binaryDecoder }, @@ -34,19 +34,20 @@ eventTypes = { 0x90: { 'name': 'APP AUTH', 'decoder': binaryDecoder }, 0x91: { 'name': 'APP HALT', 'decoder': binaryDecoder }, - 0x92: { 'name': 'APP UNKNOWN', 'decoder': binaryDecoder }, + 0x92: { 'name': 'APP UNKNOWN', 'decoder': binaryDecoder }, - 0xA0: { 'name': 'APP AUTHING', 'decoder': binaryDecoder }, + 0xA0: { 'name': 'APP AUTHING' , 'decoder': binaryDecoder }, 0xA1: { 'name': 'APP AUTHED', 'decoder': binaryDecoder }, 0xC0: { 'name': 'APP AUTH FAILED', 'decoder': binaryDecoder }, 0xC1: { 'name': 'APP CSUM FAILED', 'decoder': binaryDecoder }, 0xC2: { 'name': 'APP NOT AUTHED', 'decoder': binaryDecoder }, - 0xFF: { 'name': 'BOOT', 'decoder': noDecoder }, + 0xFF: { 'name': 'BOOT', 'decoder': binaryDecoder }, } TIMESTAMP_MAX = 65536 +eventTypes = { i : ({'name': 'UNKNOWN', 'decoder': binaryDecoder} if i not in eventTypes.keys() else eventTypes[i]) for i in range(256) } def parseBinary(binaryStream): log = [] From cbe50ba7d792a2e610107663d8e437e52e9ed35c Mon Sep 17 00:00:00 2001 From: Georg Date: Wed, 21 Jun 2017 10:38:34 +0200 Subject: [PATCH 022/104] fixed bug within MF Classic application --- Firmware/Chameleon-Mini/Application/MifareClassic.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Firmware/Chameleon-Mini/Application/MifareClassic.c b/Firmware/Chameleon-Mini/Application/MifareClassic.c index aa071ac..093a570 100644 --- a/Firmware/Chameleon-Mini/Application/MifareClassic.c +++ b/Firmware/Chameleon-Mini/Application/MifareClassic.c @@ -934,10 +934,10 @@ uint16_t MifareClassicAppProcess(uint8_t* Buffer, uint16_t BitCount) Buffer[2] = CardNonce[2]; Buffer[3] = CardNonce[3]; /* Encryption is on, so we have also to encrypt the pariy */ -/* Buffer[ ISO14443A_BUFFER_PARITY_OFFSET + 0] = CardNonce[4]; + Buffer[ ISO14443A_BUFFER_PARITY_OFFSET + 0] = CardNonce[4]; Buffer[ ISO14443A_BUFFER_PARITY_OFFSET + 1] = CardNonce[5]; Buffer[ ISO14443A_BUFFER_PARITY_OFFSET + 2] = CardNonce[6]; - Buffer[ ISO14443A_BUFFER_PARITY_OFFSET + 3] = CardNonce[7]; */ + Buffer[ ISO14443A_BUFFER_PARITY_OFFSET + 3] = CardNonce[7]; State = STATE_AUTHING; return CMD_AUTH_RB_FRAME_SIZE * BITS_PER_BYTE | ISO14443A_APP_CUSTOM_PARITY; From b6e920b9848efcd2fad94289fbf02a46a3faa3a8 Mon Sep 17 00:00:00 2001 From: Georg Date: Wed, 21 Jun 2017 10:41:24 +0200 Subject: [PATCH 023/104] updated LATEST firmware --- .../Chameleon-Mini/Latest/Chameleon-Mini.hex | 3125 +++++++++-------- 1 file changed, 1563 insertions(+), 1562 deletions(-) diff --git a/Firmware/Chameleon-Mini/Latest/Chameleon-Mini.hex b/Firmware/Chameleon-Mini/Latest/Chameleon-Mini.hex index d53bb0d..96738d0 100644 --- a/Firmware/Chameleon-Mini/Latest/Chameleon-Mini.hex +++ b/Firmware/Chameleon-Mini/Latest/Chameleon-Mini.hex @@ -29,7 +29,7 @@ :1001C0000C94330B0C94330B0C94330B0C94330BB7 :1001D0000C94330B0C94330B0C94330B0C94330BA7 :1001E0000C94330B0C94330B0C94330B0C94330B97 -:1001F0000C94330B0C941B500C94330B1E034300D4 +:1001F0000C94330B0C9428500C94330B1E034300C7 :10020000680061006D0065006C0065006F006E00A5 :100210002D004D0069006E00690000002A034B00AC :10022000610073007000650072002000260020004D @@ -43,15 +43,15 @@ :1002A0000E0D0F0D100D110D120D130D160D170D56 :1002B0000000000126249224B124D229D829DC2967 :1002C000120DDD299D2BB02B40000700262492241F -:1002D000B124F02B1D2C212C120D222C0C33283391 +:1002D000B124F02B1D2C212C120D222C1933353377 :1002E0000004040026249224B124FF2B1D2C212C71 -:1002F000120D222C0C3328330004070026249224EC -:10030000B1240E2C1D2C212C120D222C0C33283341 +:1002F000120D222C193335330004070026249224D2 +:10030000B1240E2C1D2C212C120D222C1933353327 :100310000010040026249224B1240E2C1D2C212C24 -:10032000120D222C0C3328330010070026249224AF +:10032000120D222C19333533001007002624922495 :10033000B1240F0D100D110D120D130D160D170D0B -:10034000000000014225BB25FA276E4271427E4221 -:100350007F42A442160D170D00000000004E4F4EC4 +:10034000000000014225BB25FA277B427E428B42FA +:100350008C42B142160D170D00000000004E4F4EAA :100360004500000000000000000000000000000048 :1003700000000000000000000000000000014D46E9 :100380005F554C5452414C4947485400000000000E @@ -176,8 +176,8 @@ :100AF0007470733A2F2F6769746875622E636F6D17 :100B00002F656D7365632F4368616D656C656F6EEE :100B10004D696E6920636F6D6D69742025530031D6 -:100B200037303631340031353131313500342E39FA -:100B30002E320032613265303734000D0A000D0A62 +:100B200037303632310031353131313500342E39FC +:100B30002E320063626535306261000D0A000D0AD5 :100B4000000D0A000D0A000D0A000D0A0064313084 :100B5000303A4F4B00000000000000000000000091 :100B600000000000000000000000000000006531EF @@ -353,10 +353,10 @@ :101600000000000000000000000000000000006377 :1016100064696E6F70737578585B000011241FBE8B :10162000CFEFCDBFDFE3DEBF00E00CBF18BE19BEB9 -:101630001ABE1BBE14E2A0E0B0E2E4EDF3EB00E062 +:101630001ABE1BBE14E2A0E0B0E2EEEEF3EB00E057 :101640000BBF02C007900D92A238B107D9F71BBE9D :1016500025E3A2E8B4E201C01D92A134B207E1F78C -:101660003BD00C94E85925C13BB78BBFFB01879158 +:101660003BD00C94F55925C13BB78BBFFB0187914B :1016700096913BBF08953BB78BBFCB0142E20D94DF :10168000F00F3BB70B0143E20D94F00F3BB78BBF5C :10169000CB0145E20D94F00F3BB746E208C0209124 @@ -421,10 +421,10 @@ :101A40001EE2D8011296ED91FC91139789831995A6 :101A50000E946221E091622EF091632E898185833C :101A6000B8E18B9FB001112464567D4F48E150E0EE -:101A7000C8010E940053D801ED91FC911995D8013D +:101A7000C8010E940D53D801ED91FC911995D80130 :101A80001696ED91FC9117970F90DF91CF911F91D2 :101A90000F91199448E150E06CE972E087E49EE20E -:101AA0000E940053E091622EF091632E8581C0CF99 +:101AA0000E940D53E091622EF091632E8581C0CF8C :101AB0000F931F93E091622EF091632E8B019C0196 :101AC000458168E08CE593E00E9471171F910F91AA :101AD0000895FF920F931F93CF93DF931F92CDB77B @@ -434,10 +434,10 @@ :101B1000E0915F2EF091602EB80181E119958F2D33 :101B20000F90DF91CF911F910F91FF9008959B012E :101B3000AC0168E08CE593E00C94B01708950C9428 -:101B4000F25208951F93CF93DF93C82FD92F162FEA -:101B5000180F1C1721F00E94F2528993FACFDF91DF -:101B6000CF911F9108950E94F2520E94F2520E945A -:101B7000F2520C94F252EF92FF920F931F93CF9375 +:101B4000FF5208951F93CF93DF93C82FD92F162FDD +:101B5000180F1C1721F00E94FF528993FACFDF91D2 +:101B6000CF911F9108950E94FF520E94FF520E9440 +:101B7000FF520C94FF52EF92FF920F931F93CF935B :101B8000DF937C0161507109FA018A01020F131F72 :101B9000DC0140E050E0E017F107F1F06230710540 :101BA000D8F09191392F32953F703A3010F4305D72 @@ -629,9 +629,9 @@ :10274000802FC9DF812F0F90DF91CF911F910F91C3 :1027500008950895EF92FF920F931F93CF937B01FB :10276000C42F2EB13FB10091080410910904022B2F -:10277000132B682F83E090E20E9406516C2F83E0B8 -:1027800090E20E940651612F83E090E20E94065180 -:10279000602F83E090E20E9406516C2F70E0C70129 +:10277000132B682F83E090E20E9413516C2F83E0AB +:1027800090E20E941351612F83E090E20E94135166 +:10279000602F83E090E20E9413516C2F70E0C7011C :1027A000CF911F910F91FF90EF905BC408953F92DE :1027B0004F925F926F927F928F929F92AF92BF9251 :1027C000CF92DF92EF92FF920F931F93CF93DF93FD @@ -646,7 +646,7 @@ :102850006A047B0428F4AE01BC01C70135DA18C054 :10286000C41AD50AA601BC01C7012EDAAE014C1963 :102870005D096AE874E2C7018C0D9D1D07C04C1903 -:102880005D09BA0166577B4DAE01C7010E942E5308 +:102880005D09BA0166577B4DAE01C7010E943B53FB :10289000311002C081E00BC001501109D8F3F801DA :1028A000EC0FFD1FEE0DFF1D1082F6CF80E0DF91D3 :1028B000CF911F910F91FF90EF90DF90CF90BF903D @@ -750,10 +750,10 @@ :102ED000802FABDF812F0F90DF91CF911F910F914A :102EE00008950F931F93FC01662379F0949161502C :102EF000941309C0BF016F5F7F4FA801C9010E94F1 -:102F0000125381E003C0B196EFCF80E01F910F9183 +:102F00001F5381E003C0B196EFCF80E01F910F9176 :102F10000895CF92DF92EF92FF921F93CF93DF93AA :102F2000EC017A016901162F112389F0BE016F5F50 -:102F30007F4FC7010E9409531150892B31F4FE01C4 +:102F30007F4FC7010E9416531150892B31F4FE01B7 :102F4000C491F601C08381E003C0A196EDCF80E07B :102F5000DF91CF911F91FF90EF90DF90CF90089578 :102F6000CF930196CCE26623C9F0FC01DA01AD01F2 @@ -763,39 +763,39 @@ :102FA000FA011082CF910895809120028068809369 :102FB00020028091230280FFFCCF81E080932302D6 :102FC000A0911002B0911102AE5BB109B7FF02C02F -:102FD000A0E0B0E020E038EB4BE050E00E948C52E3 +:102FD000A0E0B0E020E038EB4BE050E00E949952D6 :102FE000E091622EF091632E61157105844F91403E :102FF000A8F48781873019F480E180938B2C868137 :10300000873019F480E180938A2C80915D2E88238B :1030100089F0E0914F2EF091502E199487818730DE :1030200019F481E180938B2C8681873019F481E13A -:1030300080938A2C0895BC0183E090E20C94B850F0 +:1030300080938A2C0895BC0183E090E20C94C550E3 :10304000CF93DF93FC016491EC012196662331F06C -:1030500083E090E20E940651CE01F4CFDF91CF9140 -:103060000895AB01BC0183E090E20C94E25080E251 +:1030500083E090E20E941351CE01F4CFDF91CF9133 +:103060000895AB01BC0183E090E20C94EF5080E244 :10307000809362060895CF93DF9380918E2C8230E7 -:1030800029F583E090E20E946B510E943A4C83E064 -:1030900090E20E948751EC0197FD18C0E091622EEA +:1030800029F583E090E20E9478510E94474C83E04A +:1030900090E20E949451EC0197FD18C0E091622EDD :1030A000F091632E8781833019F483E180938B2C18 :1030B0008681833019F483E180938A2C8C2F24D667 :1030C000811104C08C2FDF91CF91C2C7DF91CF91C6 :1030D000089580918E2C813079F028F08230D9F0DB :1030E000833011F12EC08091680685FF2AC08FE0E1 :1030F0008093022081E00CC0809102208150809357 -:10310000022081111EC00E94C90C0E94E54F82E07E +:10310000022081111EC00E94C90C0E94F24F82E071 :1031100080938E2C16C08091680685FD12C08FE0CA :103120008093022083E0F4CF80910220815080932D -:103130000220811106C00E94AA4F0E94F70C109233 +:103130000220811106C00E94B74F0E94F70C109226 :103140008E2C80918E2C823019F42ED70C942A214B :103150000895E091622EF091632E8781823019F4F8 :1031600081E180938B2C8681823019F481E18093F8 :103170008A2C0895E091622EF091632E878182302F :1031800019F480E180938B2C8681823019F480E1E0 -:1031900080938A2C089583E090E20C94935083E00E -:1031A00090E20C94DA5123E33BE03F932F932DE21E +:1031900080938A2C089583E090E20C94A05083E001 +:1031A00090E20C94E75123E33BE03F932F932DE211 :1031B0003BE03F932F9326E23BE03F932F932FE199 :1031C0003BE03F932F932FE73AE03F932F9322E08A -:1031D0002F931F929F938F930E9497538DB79EB703 +:1031D0002F931F929F938F930E94A4538DB79EB7F6 :1031E0000E968DBF9EBF85E6089560E072E00E9456 :1031F000580D85E60895FB0120812F3349F4218184 :10320000211106C060E072E00E94970D85E60895E6 @@ -803,14 +803,14 @@ :103220008AEC0895EF92FF920F931F93CF93DF9351 :10323000CDB7DEB7A097CDBFDEBF7C0100915D2E7C :1032400010E00115110591F487E79AE09F938F93A1 -:1032500082E08F931F92FF92EF920E9497530F90FC +:1032500082E08F931F92FF92EF920E94A4530F90EF :103260000F900F900F900F900F9010C0E091572E7D :10327000F091582ECE01019619959801AE014F5F3D :103280005F4F60E072E0C7010E94BB0D85E6A0962B :10329000CDBFDEBFDF91CF911F910F91FF90EF90D7 :1032A0000895DF92EF92FF920F931F93CF93DF93D6 :1032B000CDB7DEB7A097CDBFDEBF7B0100915D2EFD -:1032C00010E060E77AE0C7010E940953892B29F5D5 +:1032C00010E060E77AE0C7010E941653892B29F5C8 :1032D000D12CED2CF12CE016F10658F40E949F0D34 :1032E000E1E0F0E0EC0FFD1FEE0DFF1D8083D394B5 :1032F000F0CFE091592EF0915A2ECE0101961995FA @@ -824,17 +824,17 @@ :103370005E2E04C0203321F410925E2E84E6089560 :103380002F33C1F41F9220E32F931F9221E32F9339 :103390002AE63AE03F932F9322E02F931F929F93C8 -:1033A0008F930E9497538DB79EB70A968DBF9EBF8D +:1033A0008F930E94A4538DB79EB70A968DBF9EBF80 :1033B00085E608958AEC08958EE490E174D48EE653 :1033C00008958EEC90E18AD48EE60895E0ECF4E066 -:1033D00081818E7F81830E94AA4F0E94BD0C84E66A -:1033E0000895E0ECF4E081818E7F81830E94AA4FF2 +:1033D00081818E7F81830E94B74F0E94BD0C84E65D +:1033E0000895E0ECF4E081818E7F81830E94B74FE5 :1033F0000E94C30C84E60895E7E4FEE225892F933A :1034000024892F9327E63AE03F932F9322E02F93CE -:103410001F929F938F930E9497538DB79EB70896E4 +:103410001F929F938F930E94A4538DB79EB70896D7 :103420008DBF9EBF85E6089520915D2E1F922F933C :1034300024E63AE03F932F9322E02F931F929F932D -:103440008F930E9497538DB79EB708968DBF9EBFEE +:103440008F930E94A4538DB79EB708968DBF9EBFE1 :1034500085E6089540E052E0BC0180E04BD985E666 :103460000895FB0120812F3341F42181211105C0F2 :1034700060E072E02AD985E6089580E04DD988237E @@ -862,7 +862,7 @@ :1035D00084E608958AEC0895CF93DF93EC01B5D982 :1035E000813028E0920718F09C01385002C020E09A :1035F00030E03F932F939F938F9324E43AE03F93DF -:103600002F9382E08F931F92DF93CF930E94975363 +:103600002F9382E08F931F92DF93CF930E94A45356 :103610008DB79EB70A968DBF9EBF85E6DF91CF918D :10362000089587ED93E15AD38EE60895A0DA84E6F3 :1036300008954FD984E6089560E072E051DB85E695 @@ -872,7 +872,7 @@ :1036700080FD02C089E7089588E70895DF92EF9200 :10368000FF920F931F93CF93DF93EC010FEF11E0A5 :1036900086E7E82E8CE0F82E9CE2D92EB7018CE666 -:1036A00094E20E940953892BD1F001151105B9F05C +:1036A00094E20E941653892BD1F001151105B9F04F :1036B000DE01F7012491ED012196C8010197222333 :1036C00041F00130110529F02C93DE0131968C0177 :1036D000F1CFDC928C0188E1E80EF11CDFCF21975D @@ -880,17 +880,17 @@ :1036F000DF900895FC012091200220682093200291 :103700008091230280FFFCCF81E080932302A0916F :103710001002B0911102AE5BB109B7FF02C0A0E088 -:10372000B0E020E038EB4BE050E00E948C52AA273A +:10372000B0E020E038EB4BE050E00E949952AA272D :10373000BB279F938F932DE33AE03F932F9382E033 -:103740008F931F92FF93EF930E9497538DB79EB76D +:103740008F931F92FF93EF930E94A4538DB79EB760 :1037500008968DBF9EBF85E608952EB13FB140917A :10376000080450910904242B352B3F932F9327E312 :103770003AE03F932F9322E02F931F929F938F93D2 -:103780000E9497538DB79EB708968DBF9EBF85E662 +:103780000E94A4538DB79EB708968DBF9EBF85E655 :1037900008950F931F93CF93DF931F921F92CDB77E :1037A000DEB78B01E091622EF091632E8581873028 :1037B00009F06FC0E0914F2EF091502E199581E0E5 -:1037C0008093E32C60E270E0C8010E944F530097A1 +:1037C0008093E32C60E270E0C8010E945C53009794 :1037D000F9F4F80101900020E9F73197E01BF10BB3 :1037E000E0FD59C0F695E795E130F10539F487E041 :1037F00090E08093452E9093462E37C053E0EE0F15 @@ -908,11 +908,11 @@ :1038B000DF931F921F92CDB7DEB78B01E091622E8E :1038C000F091632E8581873009F080C0E0914F2E02 :1038D000F091502E199582E08093E32C60E270E025 -:1038E000C8010E944F537C01892B31F5F8010190EA +:1038E000C8010E945C537C01892B31F5F8010190DD :1038F0000020E9F73197E01BF10BE0FD69C0F69578 :10390000E795E130F10539F487E090E08093452EAA :103910009093462E47C063E0EE0FFF1F6A95E1F7D4 -:10392000CF0169E070E00E947852E81BF90BE09348 +:10392000CF0169E070E00E948552E81BF90BE0933B :10393000452EF093462E36C0C8010496E816F906C7 :1039400009F046C0A80162E070E0CE0101960E9435 :10395000F50D298130E0322F22278A81280F311D71 @@ -926,45 +926,45 @@ :1039D0008AEC0F900F90DF91CF911F910F91FF9084 :1039E000EF900895E091622EF091632E85818730EB :1039F000A1F4E0914F2EF091502E199584E0809320 -:103A0000E32C0E946E420E947E2988E792E4809314 +:103A0000E32C0E947B420E947E2985E892E4809309 :103A10009E2C90939F2C8FEF089589EC0895E09150 :103A2000622EF091632E85818730A1F4E0914F2EB4 -:103A3000F091502E199583E08093E32C0E946E4202 -:103A40000E947E2988E792E480939E2C90939F2C7D +:103A3000F091502E199583E08093E32C0E947B42F5 +:103A40000E947E2985E892E480939E2C90939F2C7F :103A50008FEF089589EC0895E091622EF091632E26 :103A600085818730A1F4E0914F2EF091502E199569 -:103A700085E08093E32C0E946E420E947E2988E7B5 +:103A700085E08093E32C0E947B420E947E2985E8AA :103A800092E480939E2C90939F2C8FEF089589EC65 :103A90000895E091622EF091632E4085518564E691 :103AA000649F9001659F300D11243F932F9321E374 :103AB0003AE03F932F9322E02F931F929F938F938F -:103AC0000E9497538DB79EB708968DBF9EBF85E61F +:103AC0000E94A4538DB79EB708968DBF9EBF85E612 :103AD0000895CF93DF931F921F92CDB7DEB7FB01FE :103AE00020812F33B1F42181211113C02FEF39E050 :103AF0003F932F9322E02F931F929F938F930E94C7 -:103B000097530F900F900F900F900F900F9085E6A6 +:103B0000A4530F900F900F900F900F900F9085E699 :103B100027C089E592E089839A83CE0101969F931D :103B20008F938BEF99E09F938F937F936F930E9476 -:103B3000CD530F900F900F900F900F900F90892BF7 +:103B3000DA530F900F900F900F900F900F90892BEA :103B400071F089819A818935F2E09F0740F4E09114 :103B5000622EF091632E8087918784E601C08AEC03 :103B60000F900F90DF91CF91089520911F202F93F8 :103B700020911E202F9328EF39E03F932F9322E0CE -:103B80002F931F929F938F930E9497538DB79EB749 +:103B80002F931F929F938F930E94A4538DB79EB73C :103B900008968DBF9EBF85E60895CF93DF931F9251 :103BA0001F92CDB7DEB7FB0120812F33B1F4218105 :103BB000211113C02FE02F932FEF2F9327EA39E025 :103BC0003F932F9322E02F931F929F938F930E94F6 -:103BD0009753CDBFDEBF85E627C019821A82CE017A +:103BD000A453CDBFDEBF85E627C019821A82CE016D :103BE00001969F938F9383EA99E09F938F937F939E -:103BF0006F930E94CD530F900F900F900F900F90E6 +:103BF0006F930E94DA530F900F900F900F900F90D9 :103C00000F90892B81F089819A818115E0E19E07CF :103C100050F4809338039093390380931E2090933F :103C20001F2084E601C08AEC0F900F90DF91CF91A6 :103C30000895FB0120812F33D9F42181211121C066 :103C40001F9220E32F931F9221E32F932DE939E058 :103C50003F932F9322E02F931F929F938F930E9465 -:103C600097538DB79EB70A968DBF9EBF85E6089580 +:103C6000A4538DB79EB70A968DBF9EBF85E6089573 :103C7000213311F4B3D303C0203319F4D4D384E631 :103C800008958AEC0895FC0180910008813021F4A8 :103C900080918C08833011F080E301C081E3808340 @@ -993,34 +993,34 @@ :103E00008F5F80939C2C8091912C9091922CA0910B :103E1000932CB091942C80589F4FAF4FBF4F8093FD :103E2000912C9093922CA093932CB093942C66E0B9 -:103E300083E090E20E94065182E080939D2CB1C005 -:103E400068E183E090E20E9406510EC030E0892FC5 +:103E300083E090E20E94135182E080939D2CB1C0F8 +:103E400068E183E090E20E9413510EC030E0892FB8 :103E500090E001972817390739F466E083E090E293 -:103E60000E94065182E06DC068E183E090E20E940A -:103E7000065193C0853119F410929C2C09C08B31E6 +:103E60000E94135182E06DC068E183E090E20E94FD +:103E7000135193C0853119F410929C2C09C08B31D9 :103E800009F48BC0883109F463CF863009F05DC036 :103E900080919C2C8F5F80939C2C4091912C509111 :103EA000922C6091932C7091942CE0918F2CF09136 :103EB000902C20E830E084EB9EE21995C82F8823EF -:103EC000D1F161E083E090E20E94065160919C2C68 -:103ED00083E090E20E94065160919C2C609583E003 -:103EE00090E20E94065160E870E084EB9EE2B9D84F +:103EC000D1F161E083E090E20E94135160919C2C5B +:103ED00083E090E20E94135160919C2C609583E0F6 +:103EE00090E20E94135160E870E084EB9EE2B9D842 :103EF000E4EBFEE260E08FE2E433F80719F0819131 -:103F0000680FF9CF83E090E20E9406518091912CD6 +:103F0000680FF9CF83E090E20E9413518091912CC9 :103F10009091922CA091932CB091942C80589F4F0B :103F2000AF4FBF4F8093912C9093922CA093932CE2 -:103F3000B093942C36C064E083E090E20E94065176 +:103F3000B093942C36C064E083E090E20E94135169 :103F400089E080939D2CC1E02CC08531E1F761E0D0 -:103F500083E090E20E94065160919C2C83E090E205 -:103F60000E94065160919C2C609583E090E20E9433 -:103F7000065160E870E084EB9EE273D8E4EBFEE269 +:103F500083E090E20E94135160919C2C83E090E2F8 +:103F60000E94135160919C2C609583E090E20E9426 +:103F7000135160E870E084EB9EE273D8E4EBFEE25C :103F800060E02FE2E433F20719F08191680FF9CF76 -:103F900083E090E20E940651D6CF10929D2CD3CFA1 +:103F900083E090E20E941351D6CF10929D2CD3CF94 :103FA000C0E08C2FCF91089580919D2C813019F025 :103FB000873029F108958091972C9091982C9C013D :103FC000215031092093972C3093982C892B31F56F :103FD0008091992C9FEF980F9093992C882331F022 -:103FE00065E183E090E20E94065102C010929D2C90 +:103FE00065E183E090E20E94135102C010929D2C83 :103FF00085E090E08093972C9093982C0895809181 :10400000972C9091982C9C01215031092093972C4A :104010003093982C892B11F410929D2C0895EDE487 @@ -1039,7 +1039,7 @@ :1040E00009F495C08D7F8D3309F491C0E4EBFEE2B5 :1040F0007F01C191CC2331F0CF3321F0CD3311F0CA :10410000C032B1F7F701108286E7C82E8CE0D82EB6 -:1041100000E010E0B60184EB9EE20E940953892B77 +:1041100000E010E0B60184EB9EE20E941653892B6A :1041200009F056C01092B42ECF3349F488E1809F35 :10413000F001819FF00D1124E457F34F18C0B7012F :104140006F5F7F4FCD3349F488E1809FF001819FFD @@ -1063,7 +1063,7 @@ :10426000F091632E208531852115310551F18EB1F4 :104270009FB14091080450910904842B952B4091E3 :10428000A02C5091A12C841B950B64E670E00E9439 -:10429000785262177307A8F01092A22C8BECBFDE45 +:10429000855262177307A8F01092A22C8BECBFDE38 :1042A0000E94201884E49BE00E942018E0919E2C3C :1042B000F0919F2C309729F0199510929E2C109216 :1042C0009F2C08958091A22C8823A9F01092A22CF3 @@ -1291,7 +1291,7 @@ :1050A00095B1892B09F4A1C084B195B1089718F482 :1050B00014B815B89AC044B155B1495F5F4F63E069 :1050C000569547956A95E1F764EB70E3CE0101963A -:1050D0000E942E5384EB90E38AB99BB904B115B1B9 +:1050D0000E943B5384EB90E38AB99BB904B115B1AC :1050E00014B815B8C12CD12C73E1B72EE8E0EE2E20 :1050F000F12CC016D10608F078C0F60153E0F69501 :10510000E7955A95E1F741E050E04C0F5D1FE40F41 @@ -1350,7 +1350,7 @@ :1054500011F0823539F484E4F8018083118281E00F :1054600089270DC0803309F41BC1823A09F434C185 :10547000803A09F451C1803509F4F6C081E0809387 -:10548000B82C00C160E170E0C8010E947C33882321 +:10548000B82C00C160E170E0C8010E948933882314 :10549000A1F080915E2E81110BC06091B72CF4E0D9 :1054A0006F9FB001112444E050E0C8010E94B20E89 :1054B00084E08093B82C8AE004C084E08093B82C08 @@ -1360,39 +1360,39 @@ :1054F00009F4ABC0803709F048C0F8019281898176 :105500009813C0C093818A819813BCC094818B8109 :105510009813B8C095818C819813B4C084E08083BF -:1055200061E070E0C8010E94513383E02AC08539F0 +:1055200061E070E0C8010E945E3383E02AC08539E3 :1055300009F0A4CF44E050E064E070E0CE010196B1 :105540000E94640EF8018181803209F47EC08037A8 :10555000E1F4F80192818981981394C093818A8142 :10556000981390C094818B8198138CC095818C8105 -:10557000981388C0108261E070E0C8010E94513326 +:10557000981388C0108261E070E0C8010E945E3319 :1055800084E08093B82C88E17EC0E82EE2949FE00E :10559000E9222EEF2E0D8F70F82E88E090E08F1903 :1055A00091094FEF50E06A0102C0D594C7948A95E3 :1055B000E2F7253021F0243059F5FF20E9F044E0EE :1055C00050E0B8016E5F7F4FCE0101962D830E949F -:1055D00021532D81892B61F49A81898189279B81AF +:1055D0002E532D81892B61F49A81898189279B81A2 :1055E00089279C818927F801968189278C2169F177 :1055F000243071F4F11046C044E050E0B8016E5F11 -:105600007F4FCE0101960E942153892BF1F03AC0C1 +:105600007F4FCE0101960E942E53892BF1F03AC0B4 :105610002430C0F5E22EF12CA701B8016E5F7F4F58 -:10562000CE0101960E942153892B61F5D801AE0D60 +:10562000CE0101960E942E53892B61F5D801AE0D53 :10563000BF1DE1E0F0E0EC0FFD1FEE0DFF1D129627 :105640009C9180818927C822E9F42981F80120836F :105650003A8131839B8192838C8183832327922794 :105660008927848388E20FC0F8018181811142C0BB -:1056700062E070E0C8010E947C33882309F420CFE7 +:1056700062E070E0C8010E948933882309F420CFDA :105680001092B82C80E090E02596CDBFDEBFDF9170 :10569000CF911F910F91FF90EF90DF90CF900895E1 -:1056A000F801F18062E070E0C8010E947C33882339 +:1056A000F801F18062E070E0C8010E94893388232C :1056B00009F406CFFFE0FF15E8F084E0F89EB001A2 :1056C000112440E150E0C8010E94640E60E170E0E6 -:1056D000C801E7D780E9D7CFF801F18066E070E034 -:1056E000C8010E947C33882309F4EACE8EEF8F0D27 +:1056D000C801F4D780E9D7CFF801F18066E070E027 +:1056E000C8010E948933882309F4EACE8EEF8F0D1A :1056F0008E3018F0F8011082E6CE80915E2E811176 :10570000DACEF4E0FF9EB001112444E050E0C8017D :1057100002960E94B20ECFCEF801F18062E070E0F6 -:10572000C801EAD7882309F4CBCE8EEF8F0D8E30D7 +:10572000C801F7D7882309F4CBCE8EEF8F0D8E30CA :1057300008F7F092B72C85E0BCCECF93DF93EC0155 :1057400043E050E060E070E00E94640E44E050E00E :1057500064E070E0CE010396DF91CF910C94640E6B @@ -1418,48 +1418,48 @@ :10589000BB2C3091BC2C211102C0963211F09235F4 :1058A00039F4F801408331838FEF8093BD2C38C0E9 :1058B000A12CB12C853009F49CC050F48230A9F1A0 -:1058C000C8F0833009F469C0843009F482C0B5C5DA +:1058C000C8F0833009F469C0843009F482C0C2C5CD :1058D000883009F425C138F4863009F49AC087303D -:1058E00009F4D3C0AAC5893009F442C38D3008F445 -:1058F00064C3A3C591E08927982F91709093B92C28 +:1058E00009F4D3C0B7C5893009F44FC38D3008F42B +:1058F00071C3B0C591E08927982F91709093B92C0E :105900003091BB2C2091BC2CF8019081811102C0F8 -:10591000963219F0923509F00CC4F80130832183D6 -:1059200084E08093DC2C80E189C5F8018081982F88 -:105930009D7F913419F48AE080835AC38033C1F487 -:1059400062E070E0C801D8D6882309F49CC0F80151 +:10591000963219F0923509F019C4F80130832183C9 +:1059200084E08093DC2C80E196C5F8018081982F7B +:105930009D7F913419F48AE0808367C38033C1F47A +:1059400062E070E0C801E5D6882309F49CC0F80144 :105950006181F0E16F9FB001112440E150E0C80186 -:105960000E94640E60E170E0C8019BD680E966C5C4 -:10597000803A79F462E070E0C801BED6882309F469 +:105960000E94640E60E170E0C801A8D680E973C5AA +:10597000803A79F462E070E0C801CBD6882309F45C :1059800082C0F80181818093D32C83E08093DC2C4A -:10599000D2CF803509F051C552C060E170E0C80136 -:1059A000ABD6882389F080915E2E81110BC0609167 +:10599000D2CF803509F05EC552C060E170E0C80129 +:1059A000B8D6882389F080915E2E81110BC060915A :1059B000D32CF0E16F9FB001112440E150E0C80109 :1059C0000E94B20E8AE001C081E0F801808382E08B -:1059D0000DC39091B92C3091BB2C2091BC2CF801B7 -:1059E0008081911102C0863211F1823509F0A9C37C +:1059D0001AC39091B92C3091BB2C2091BC2CF801AA +:1059E0008081911102C0863211F1823509F0B6C36F :1059F0001EC09091B92C3091BB2C2091BC2CF80189 -:105A00008081911102C0863291F0823509F046C43E +:105A00008081911102C0863291F0823509F053C431 :105A10000EC09091B92C3091BB2C2091BC2CF80178 :105A20008081911102C0863211F0823531F4F80183 -:105A30003083218381E0892779C38035C9F4F80157 -:105A40008181882319F0F8011082D2C262E070E0EF -:105A5000C80152D68823B9F0E0915F2EF091602EF4 -:105A600040E060E070E081E919951092DC2CE5C41B -:105A700090EA980F923008F0B4C462E070E0C80178 -:105A80003BD68111DDC481E047C2C8010E944F3975 -:105A900064E07801F4E0EF0EF11CC7010E94663C5F +:105A30003083218381E0892786C38035C9F4F8014A +:105A40008181882319F0F8011082DFC262E070E0E2 +:105A5000C8015FD68823B9F0E0915F2EF091602EE7 +:105A600040E060E070E081E919951092DC2CF2C40E +:105A700090EA980F923008F0C1C462E070E0C8016B +:105A800048D68111EAC481E054C2C8010E945C3941 +:105A900064E07801F4E0EF0EF11CC7010E94733C52 :105AA000E0915F2EF091602E44E0B70180EA1995F5 :105AB000F80194818091D42C981329C0958180910C :105AC000D52C981324C096818091D62C98131FC092 :105AD00097818091D72C98131AC08091D82C8083FD :105AE0008091D92C81838091DA2C82838091DB2C68 -:105AF000838364E0C8010E94583EE0915F2EF091DC -:105B0000602E44E0B80181EA199588E0FCC1E0917B -:105B10005F2EF091602E44E064ED7CE280EC25C2C3 +:105AF000838364E0C8010E94653EE0915F2EF091CF +:105B0000602E44E0B80181EA199588E009C2E0916D +:105B10005F2EF091602E44E064ED7CE280EC32C2B6 :105B2000F8018081803551F48181811107C0828123 -:105B3000873521F483818D3C09F4FDC164E0C801FF -:105B40000E94663CF8018081803309F0C2C062E0A7 -:105B500070E0C801D1D5882309F4ACC0F801618197 +:105B3000873521F483818D3C09F40AC264E0C801F1 +:105B40000E94733CF8018081803309F0C2C062E09A +:105B500070E0C801DED5882309F4ACC0F80161818A :105B600067FD04C0862F8370833029F0862F8F70E5 :105B70008F3009F084C06093D32C8091BE2C90911B :105B8000BF2C3091C02C282F22952095422F4927D9 @@ -1479,26 +1479,26 @@ :105C6000908784FF15C06360F0E16F9FB00111243D :105C7000665F7F4F46E050E0C8010A9607C080E1AA :105C8000689FB001112440E150E0C8010E94640EF9 -:105C900060E170E0C80105D5E0915F2EF091602EC3 -:105CA00042E1B80180E8199562E1C8010E94583EBE -:105CB00080E92CC10E94713B91E08927F801808323 +:105C900060E170E0C80112D5E0915F2EF091602EB6 +:105CA00042E1B80180E8199562E1C8010E94653EB1 +:105CB00080E939C10E947E3B91E08927F801808309 :105CC000E0915F2EF091602E44E0B80181EC1995CF -:105CD0008FC1803A61F462E070E0C8010DD588237D +:105CD0009CC1803A61F462E070E0C8011AD5882363 :105CE000D9F1F80181818093D32C89E00DC0803CEB -:105CF00089F462E070E0C801FFD4882369F1F801FB -:105D000081818093D32C8BE08093DC2C0E94713BAB -:105D10009AE001C1813C91F462E070E0C801ECD4EA +:105CF00089F462E070E0C8010CD5882369F1F801ED +:105D000081818093D32C8BE08093DC2C0E947E3B9E +:105D10009AE00EC1813C91F462E070E0C801F9D4D0 :105D20008823D1F0F80181818093D32C4AE0F42EAE -:105D3000F092DC2C0E94713B8F25EEC0823C99F4DE -:105D400062E070E0C801D8D4882331F0F801818185 +:105D3000F092DC2C0E947E3B8F25FBC0823C99F4C4 +:105D400062E070E0C801E5D4882331F0F801818178 :105D50008093D32C8CE0D8CFE0915F2EF091602E11 :105D600044E0B80121C0803B11F562E070E0C80159 -:105D7000C3D4E0915F2EF091602E44E0B8018823F7 +:105D7000D0D4E0915F2EF091602E44E0B8018823EA :105D800099F086E8199580915E2E8111BFCFF801B8 :105D90006181F0E16F9FB001112440E150E082EC9D -:105DA0009CE20E94B20EB2CF81EC1995B1C090EA8C -:105DB000980F923008F0B2C062E070E0C8019CD445 -:105DC000882309F4A5C0F8018081803621F03AE3E8 +:105DA0009CE20E94B20EB2CF81EC1995BEC090EA7F +:105DB000980F923008F0BFC062E070E0C801A9D42B +:105DC000882309F4B2C0F8018081803621F03AE3DB :105DD000C32ED12C03C020E3C22ED12CF801818127 :105DE00087FF0CC0807FF0E18F9F7001112480EC51 :105DF000C80ED11C96EFA92EB12C08C08C7F90E163 @@ -1513,1442 +1513,1443 @@ :105E8000B7016C0D7D1D46E050E0CE0109960E94E1 :105E9000640E89818093D42C8A818093D52C8B8148 :105EA0008093D62C8C818093D72C60E484ED9CE287 -:105EB0000E949E408091D42C8093D82C8091D52C28 +:105EB0000E94AB408091D42C8093D82C8091D52C1B :105EC0008093D92C8091D62C8093DA2C8091D72C7A -:105ED0008093DB2C60E288ED9CE20E949E4020E0F3 +:105ED0008093DB2C60E288ED9CE20E94AB4020E0E6 :105EE000AE014F5F5F4FBE01615F7F4FCE010996EC -:105EF000EAD68981F80180838A8181838B818283BC -:105F00008C81838387E08093DC2C80E290E174C3F2 -:105F10000E94713B91E08927F8010ECD8035B9F4DC -:105F2000F801818181118FCD62E070E0C801E4D376 -:105F3000882309F4A8CD1092DC2CE0915F2EF0911B -:105F4000602E40E060E070E081E9199576C2A5011D -:105F5000495F5F4FA3E056954795AA95E1F7E09119 -:105F60005F2EF091602EB80182E9199581E0DEC0C4 -:105F700062E1C8010E94663C60E170E0C801BCD3E8 -:105F8000E0915F2EF091602E882329F142E1B80163 -:105F900081E8199580915E2E81110BC06091D32C00 -:105FA000F0E16F9FB001112440E150E0C8010E9470 -:105FB000B20E0E94713B9AE015C066E0C8010E94D3 -:105FC000663C64E070E0C80197D3811113C0E09192 -:105FD0005F2EF091602E44E0B80181EC19950E948B -:105FE000713B91E08927F801808388E08093DC2C65 -:105FF00084E024C26091D32CF0E16F9FB0011124A2 -:1060000040E150E082EC9CE20E94640E9091C22C30 -:106010008091C62C80959813EBC28091CA2C98135E -:10602000E7C22091C32C8091C72C80952813E0C231 -:106030008091CB2C2813DCC2C090C42C8091C82C3A -:106040008095C812D5C28091CC2CC812D1C2809143 -:10605000C52C3091C92C30958313CAC23091CD2CF8 -:106060008313C6C24091CE2C3091CF2C3095431370 -:10607000BFC23091D02C4313BBC23091D12C30958C -:106080004313B6C2F801308141818280912CA12C4A -:10609000B12C540199248824942A832A3381B32A69 -:1060A000D12CE12CF12C7601DD24CC24D22AC92A72 -:1060B000F82A8091DC2C8B3009F07FC2E0915F2EB2 -:1060C000F091602E46E0B80185E81995C818D90806 -:1060D000EA08FB08C092C22C33272F2D1E2D0D2D50 -:1060E0000093C32CA701662777274093C42C8F2DDC -:1060F0009927AA27BB278093C52CEC2DE095E09328 -:10610000C62CE02FE095E093C72CE42FE095E093B8 -:10611000C82CE82FE095E093C92CC092CA2C0093BC -:10612000CB2C4093CC2C8093CD2C88E08093DC2C1E -:1061300084C1903409F081C182E08093DC2C8AE034 -:10614000EBCE833909F091CC80915D2E873009F038 -:10615000A0C043E050E060E070E0CE0102960E94F3 -:10616000640E88E88983F8019181903219F09037A4 -:1061700061F024C0F80180833A8131832B8122832E -:106180009C8193832327822728C1F8018281883844 -:1061900009F053C193818A8198134FC194818B81F7 -:1061A00098134BC195818C81981347C184E08083FB -:1061B00061E070E0C80175D285E09EC0E92EE294EE -:1061C0002FE0E2222EEF2E0D9F70F92E88E090E056 -:1061D0008F1991094FEF50E06A0102C0D594C7941E -:1061E0008A95E2F7253021F0243059F5FF20E9F0B7 -:1061F00044E050E0B8016E5F7F4FCE0101962B8BDB -:106200000E9421532B89892B61F49A818B818927E4 -:1062100098E889279C818927F801968189278C2114 -:1062200081F1243071F4F11008C144E050E0B8016C -:106230006E5F7F4FCE0101960E942153892B09F199 -:10624000FCC0243008F0F9C0E22EF12CA701B801FF -:106250006E5F7F4FCE0101960E942153892B09F07A -:10626000ECC0D801AE0DBF1DE1E0F0E0EC0FFD1F6A -:10627000EE0DFF1D12969C9180818927C82209F09E -:10628000DCC098E8F80190833A8131832B81228326 -:10629000A0C044E050E060E070E007C0853909F03C -:1062A000E4CB44E050E063E070E0CE0101960E9450 -:1062B000640E9091BA2CF8018181803209F482C079 -:1062C0008037F1F4F801228189812813B6C0238137 -:1062D0008A812813B2C024818B812813AEC0258106 -:1062E0008C812813AAC0908361E070E0C801D9D1E5 -:1062F0008FEF8093BD2C86E08093DC2C88E19EC0DC -:10630000E82EE2949FE0E9222EEF2E0D8F70F82EFA -:1063100088E090E08F1991094FEF50E06A0102C0C8 -:10632000D594C7948A95E2F7253021F0243059F5A9 -:10633000FF20E9F044E050E0B8016E5F7F4FCE01EE -:1063400001962B8B0E9421532B89892B61F49A8112 -:10635000898189279B8189279C818927F8019681DA -:1063600089278C2179F1243071F4F11066C044E062 -:1063700050E0B8016E5F7F4FCE0101960E9421531D -:10638000892B01F15AC0243008F057C0E22EF12CBD -:10639000A701B8016E5F7F4FCE0101960E94215385 -:1063A000892B09F04AC0D801AE0DBF1DE1E0F0E035 -:1063B000EC0FFD1FEE0DFF1D12969C918081892729 -:1063C000C822D9F52981F80120833A8131839B8144 -:1063D00092838C818383232792278927848388E271 -:1063E0002DC0823C09F0CBC0F8019181903E09F0AC -:1063F000C8C09281943B09F0C4C046E050E06AEA0C -:1064000074E0CE0101960E94640E89818B3409F0FC -:106410003ACB8A81893709F036CB8B818B3109F0F1 -:1064200032CB8C818A3E09F02ECB8D818B3709F0DF -:106430002ACB8E818C3C09F026CB80E090E0DCC03A -:10644000F8018081803621F08AE3C82ED12C03C068 -:10645000B0E3CB2ED12CF801818187FF0CC0807F67 -:10646000F0E18F9F7001112480ECC80ED11CA6EFC3 -:10647000AA2EB12C08C08C7F90E1899F7001112455 -:10648000F6E3AF2EB12CE0915F2EF091602E42E04A -:10649000B80180E91995F801808181708093D22C30 -:1064A000C701E4E096958795EA95E1F78093D32CB0 -:1064B000B7016A0D7B1D44E050E08EEB9CE20E9428 -:1064C000640E8091D32C8093BD2C68E0CE010196A0 -:1064D0000E94A20D80915D2E44E050E0873019F4B7 -:1064E00063E070E002C060E070E0CE010F960E94B1 -:1064F000640EB7016C0D7D1D46E050E0CE0109969B -:106500000E94640E89818093D42C8A818093D52C3B -:106510008B818093D62C8C818093D72C60E484ED82 -:106520009CE20E949E408091D42C8093D82C809134 -:10653000D52C8093D92C8091D62C8093DA2C809105 -:10654000D72C8093DB2C60E288ED9CE20E949E4079 -:1065500087E08093DC2C8981F80180838A818183A4 -:106560008B8182838C818383AE014F5F5F4FBE013D -:10657000615F7F4FCE010996F0D080E25FCF80331C -:1065800039F0982F9F7E903A19F0805C833078F430 -:1065900081E08093DC2C84E0F8018083E0915F2E21 -:1065A000F091602E40E060E070E082EC90CBE091F2 -:1065B0005F2EF091602E40E0D6CC8A3069F4E091F5 -:1065C0005F2EF091602E46E0B80184E81995C80C62 -:1065D000D91CEA1CFB1C7ECD8C3009F07BCDE091F0 -:1065E0005F2EF091602E46E0B80187E8199572CDD4 -:1065F0000E94713B96E0F6CC6396CDBFDEBFDF9183 -:10660000CF911F910F91FF90EF90DF90CF90BF90AF -:10661000AF909F908F900895CF93DF9320915D2E40 -:10662000273071F4EC0143E050E060E070E00E943C -:10663000640E44E050E063E070E0CE01039604C0D5 -:1066400044E050E060E070E0DF91CF910C94640E84 -:10665000CF93DF931F92CDB7DEB720915D2E273009 -:1066600029F447E050E060E070E015C0FC013181A2 -:10667000208123273281232733812327298344E064 -:1066800050E060E070E00E94B20E41E050E064E053 -:1066900070E0CE0101960E94B20E0F90DF91CF9173 -:1066A000089520E42093D00026EC2093D500209379 -:1066B000D40021E02093D000DC01680F791FA617D9 -:1066C000B70741F0ED91F0E0EC59FA4FE491E09317 -:1066D000D300F5CFE091D500F0E0EC59FA4FE4910A -:1066E000EC93E091D400F0E0EC59FA4FE49111966C -:1066F000EC931092D000089520E42093D00026EC73 -:106700002093D5002093D40021E02093D000DC0119 -:10671000680F791FA617B70741F0ED91F0E0EC592B -:10672000FA4FE491E093D300F5CFE091D500F0E08B -:10673000EC59FA4FE4918C918E130AC0E091D40089 -:10674000F0E0EC59FA4FE49181E011969C919E1390 -:1067500080E01092D000817008958F929F92AF9246 -:10676000BF92CF92DF92EF92FF920F931F93CF933E -:10677000DF93DC018C9110E0E0E08695179586951B -:10678000E795869517958695E7958695179586954D -:10679000E795869517958695E79511968C911197B3 -:1067A000869517958695E795869517958695E7952D -:1067B000869517958695E795869517958695E7951D -:1067C00012968C911297F0E030E08695F7958695B9 -:1067D00037958695F795869537958695F79586959D -:1067E00037958695F7958695379513968C911397DF -:1067F0008695F795869537958695F795869537957D -:106800008695F795869537958695F795869537956C -:1068100014968C91149790E020E086959795869534 -:10682000279586959795869527958695979586952C -:106830002795869597958695279515968C9186959B -:10684000979586952795869597958695279586950C -:1068500097958695279586959795869527955B01BB -:10686000DA014A0144E0840E911C6C91E5017991B2 -:106870005E017627C32ED12CA60140545E4DEE2E2C -:10688000F12CE701C054DF4D7E01EA01D880E70119 -:106890000881ED2CE02AC22ED12CA60140545D4D7A -:1068A000EA010881E02AF12CA70140565F4DEA0178 -:1068B000088106958795DF2FD071FD2E012F017E6F -:1068C000F026092F0072F0260E2F0479F026032FF0 -:1068D0000377F026022F0A73F0260F2D0295F0267B -:1068E0000F2D06950695F0260F2D0727F6940F25F8 -:1068F00006959795F79517957695CF2ED12CA601ED -:1069000040545E4DE12EF12CE701C054DF4D7E0175 -:10691000EA01D880E7010881ED2CE02AC92ED12CAC -:10692000A60140545D4DEA010881E02AF12CA7013F -:1069300040565F4DEA01088106958795D32FD071A7 -:10694000FD2E0E2F017EF026022F0072F026012F61 -:106950000479F0260F2F0377F026092F0A73F0260B -:106960000F2D0295F0260F2D06950695F0260F2D7A -:106970000727F6940F25069527953795E795769581 -:10698000C32ED12CA60140545E4DEE2EF12CE70112 -:10699000C054DF4D7E01EA01D880E7010881ED2C6B -:1069A000E02AC22ED12CA60140545D4DEA01088197 -:1069B000E02AF12CA70140565F4DEA0108810695B7 -:1069C0008795DF2FD071FD2E012F017EF026092F34 -:1069D0000072F0260E2F0479F026032F0377F0269D -:1069E000022F0A730F25F02EF2940F25F02EF69445 -:1069F000F6940F25F02EF72606950F25D12E102F91 -:106A000016959795F795D79476950F2F10E0A801D6 -:106A100040545E4D0D2D10E000541F4DEA01F880EA -:106A2000E80118810F2D012BE92EF12CA70140540C -:106A30005D4DEA011881012B10E000561F4DE80161 -:106A4000188116958795032F00711E2F117E01273F -:106A5000122F107201271D2D147901271F2F137774 -:106A60000127192F1A730127102F12950127102FB4 -:106A7000169516950127102F17270695102716959E -:106A800027953795E7957695032F10E0A801405498 -:106A90005E4D0E2F10E000541F4DEA01F880E80112 -:106AA00018810F2D012BE22EF12CA70140545D4DD2 -:106AB000EA011881012B10E000561F4DE8011881F2 -:106AC000169587950F2F00711D2D117E0127192F07 -:106AD000107201271E2F14790127132F1377012716 -:106AE000122F1A730127102F12950127102F1695B8 -:106AF00016950127102F172706950127102F169599 -:106B00009795F795D79476950F2F10E0A8014054EC -:106B10005E4D0D2D10E000541F4DEA01F880E80194 -:106B200018810F2D012BE92EF12CA70140545D4D4A -:106B3000EA011881012B10E000561F4DE801188171 -:106B400016958795032F00711E2F117E0127122F96 -:106B5000107201271D2D147901271F2F137701278C -:106B6000192F1A730127102F12950127102F169530 -:106B700016950127102F172706951027169527958C -:106B80003795E7957695032F10E0A80140545E4DA8 -:106B90000E2F10E000541F4DEA01F880E801188123 -:106BA0000F2D012BE22EF12CA70140545D4DEA017F -:106BB0001881012B10E000561F4DE8011881169531 -:106BC00087950F2F00711D2D117E1027092F007240 -:106BD00010270E2F04791027032F03771027022F79 -:106BE0000A731027012F02951027012F069506958D -:106BF0001027012F0727169501271D2D069597951C -:106C0000F7951795CF2ED12CA60140545E4DE12E5D -:106C1000F12CE701C054DF4D7E01EA01D880E70185 -:106C20000881ED2CE02AC92ED12CA60140545D4DDF -:106C3000EA010881E02AF12CA70140565F4DEA01E4 -:106C4000088106958795D32FD071FD2E0E2F017EDA -:106C5000F026022F0072F026012F0479F0260F2F64 -:106C60000377F026092F0A730F25F02EF2940F25D3 -:106C7000F02EF694F6940F257695702706957027DA -:106C8000769527953795E79568276D93A815B905EB -:106C900009F0EBCD1093DD2CF093DE2C9093DF2CDC -:106CA000E093E02C3093E12C2093E22CDF91CF9104 -:106CB0001F910F91FF90EF90DF90CF90BF90AF901A -:106CC0009F908F9008954F925F926F927F929F92C4 -:106CD000AF92BF92CF92DF92EF92FF920F931F93EA -:106CE000CF93DF93DC018C9110E0B12CEB2D8695D6 -:106CF000E795869517958695E795869517958695D8 -:106D0000E795869517958695E7958695179511963B -:106D10008C911197BE2E8695B7948695179586957A -:106D2000B794869517958695B79486951795869509 -:106D3000B7948695179512969C91129730E080E053 -:106D400096958795969537959695879596953795C7 -:106D500096958795969537959695879596953795B7 -:106D600013969C911397969587959695379596953A -:106D70008795969537959695879596953795969597 -:106D80008795969537951496EC91149790E000E0CE -:106D9000E6950795E6959795E6950795E695979577 -:106DA000E6950795E6959795E6950795E695979567 -:106DB0001596DC90D6940795D6949795D69407951A -:106DC000D6949795D6940795D6949795D69407958B -:106DD000D6949795E32FF0E0E054FE4DA12FB0E05C -:106DE000A054BF4DF081EC91EF2BA92FB0E0A0543F -:106DF000BD4DFC91EF2BF0E0E056FF4DE0802B0104 -:106E0000BA016C5F7F4FDA013B01AC90E201C9909F -:106E10002E01CA24FD2DE694F795D82FD071FD2EB2 -:106E2000EB2DE17EFE26E02FE072FE26E12FE479D5 -:106E3000FE26E32FE377FE26E92FEA73EF25FE2EE9 -:106E4000F294EF25FE2EF694F694EF25FE2EFC2408 -:106E5000E695FE26EB2D20FDFE24F69407958795FA -:106E6000E795BC2CB694C82ED12CA60140545E4D9B -:106E7000EE2EF12CE701C054DF4D7E01EA01D880EF -:106E8000E701F880ED2CEF28C02ED12CA60140544C -:106E90005D4DEA01F880EF28F12CA70140565F4DC7 -:106EA000EA01D880D694F795D32FD071ED2E412FDB -:106EB000417EE426592F5072E526CE2FC479EC2668 -:106EC000D82FD377ED26402F4A73E426FE2CF29478 -:106ED000EF24FE2CF694F694EF24FE2CFB24E6948B -:106EE000FE2420FDFD24F694979537951795B694CA -:106EF000C32ED12CE601C054DE4DE12EF12CA701AA -:106F000040545F4DD880EA01F880ED2CEF28C92E5F -:106F1000D12CA60140545D4DEA01F880EF28F12CF8 -:106F2000A70140565F4DEA01D880D694F795D82F37 -:106F3000D071ED2E4E2F417EE426502F5072E52663 -:106F4000C12FC479EC26D32FD377ED26492F4A736E -:106F5000E426FE2CF294EF24FE2CF694F694EF2413 -:106F6000FE2CFB24E694FE2420FDFD24F6940795D8 -:106F70008795E795B694C82ED12CE601C054DE4D16 -:106F8000EE2EF12CA70140545F4DD880EA01F88025 -:106F9000ED2CEF28C02ED12CA60140545D4DEA0106 -:106FA000F880EF28F12CA70140565F4DEA01D88008 -:106FB000D694F795D32FD071ED2E412F417EE42644 -:106FC000592F5072E526CE2FC479EC26D82FD377CF -:106FD000ED26402F4A73E426FE2CF294EF24FE2C7B -:106FE000F694F694EF24FE2CFB24E694FE2420FD78 -:106FF000FD24F694979537951795B694C32ED12C0A -:10700000E601C054DE4DE12EF12CA70140545F4D46 -:10701000D880EA01F880ED2CEF28C92ED12CA601EA -:1070200040545D4DEA01F880EF28F12CA70140564D -:107030005F4DEA01D880D694F795D82FD071ED2E08 -:107040004E2F417EE426502F5072E526C12FC47981 -:10705000EC26D32FD377ED26492F4A73E426FE2C56 -:10706000F294EF24FE2CF694F694EF24FE2CFB24ED -:10707000E694FE2420FDFD24F69407958795E79578 -:10708000B694C82ED12CE601C054DE4DEE2EF12C64 -:10709000A70140545F4DD880EA01F880ED2CEF281D -:1070A000C02ED12CA60140545D4DEA01F880EF2896 -:1070B000F12CA70140565F4DEA01D880D694F79590 -:1070C000D32FD071ED2E412F417EE426592F5072DF -:1070D000E526CE2FC479EC26D82FD377ED26402F86 -:1070E0004A73E426FE2CF294EF24FE2CF694F694D8 -:1070F000EF24FE2CFB24E694FE2420FDFD24F694D0 -:107100009795379517959B2C9694C32ED12CE60115 -:10711000C054DE4DE12EF12CA70140545F4DD880C4 -:10712000EA01F880ED2CEF28C92ED12CA60140549D -:107130005D4DEA01F880EF28F12CA70140565F4D24 -:10714000EA01D880D694F795D82FD0714E2F417E82 -:10715000F42EFD26502F5072F526C12FC479FC263F -:10716000D32FD377FD26492F4A73F426EF2CE294D0 -:10717000FE24EF2CE694E694FE24EF2CE924F6940A -:10718000FE24BE2EEF2D20FDED25E6950795879573 -:10719000B794C82ED12CE601C054DE4DEB2CF12C57 -:1071A000A70140545F4DD880EA01E881ED2CEE2A1A -:1071B000C02ED12CA60140545D4DEA01E881EE2A93 -:1071C000F12CA70140565F4DEA01F880DF2EF694BE -:1071D000D794F32FF071E12FE17EEF27F92FF072B2 -:1071E000EF27FB2DF479EF27F82FF377EF27F02F18 -:1071F000FA73EF27FE2FF295EF27FE2FF695F695FF -:10720000EF2796949E26E6959E2620FD9F24969431 -:10721000979537951795E32FF0E0AF0140545E4DF9 -:10722000E12FF0E0E054FF4DEA01F880E081EF2922 -:10723000E92EF12CA70140545D4DEA01F881EF2BB6 -:10724000F0E0E056FF4DE080EA2DF0E0EC59FB4F16 -:10725000E491EE25E301E9933E01AD24AD92A6173A -:10726000B70709F0D2CDB092DD2C8093DE2C0093CD -:10727000DF2C1093E02C3093E12C9093E22CDF91E3 -:10728000CF911F910F91FF90EF90DF90CF90BF9023 -:10729000AF909F907F906F905F904F900895AF92C6 -:1072A000BF92CF92DF92EF92FF920F931F93CF93F3 -:1072B000DF936091DD2C5091DE2C2091DF2C4091EA -:1072C000E02C3091E12CD091E22CFC015C0104E037 -:1072D000A00EB11C8191C52FC071962F917EC92738 -:1072E000922F9072C927942F9479C927932F93775F -:1072F000C9279D2F9A73C9277C2F7295C7277C2F8A -:1073000076957695C727A32FB0E08D0100541E4DCA -:107310006801A42FB0E08D0100541F4D7801D60103 -:107320000C91D7019C91092BED2EF12CD701A05483 -:10733000BD4D9C91092B10E000561F4DD8017C914A -:1073400078277C27C6957C2786957695279557952F -:107350006795C32FC071942F917EC9279D2F90727E -:10736000C927962F9479C927952F9377C927922FEC -:107370009A73C9277C2F7295C7277C2F76957695AF -:10738000C727052F10E0D801A054BE4D6D01062F70 -:1073900010E0D801A054BF4D7D01D6010C91D7015A -:1073A0009C91092BE22EF12CD701A054BD4D9C914C -:1073B000092B10E000561F4DD8017C9178277C27BF -:1073C000C6957C2786959D2F7695979537954795F9 -:1073D000C52FC071762F717EC727722F7072C72795 -:1073E000742F7479C727732F7377C727792F7A7310 -:1073F000C7277C2F7295C7277C2F76957695C72750 -:10740000032F10E0D801A054BE4D6D01042F10E0F1 -:10741000D801A054BF4D7D01D6010C91D7017C91BC -:10742000072BE92EF12CD701A054BD4D7C91072BE1 -:1074300010E000561F4DD8017C9178277C27C69517 -:107440007C2786957695279557956795C32FC071AC -:10745000742F717EC727792F7072C727762F7479A2 -:10746000C727752F7377C727722F7A73C7277C2F8B -:107470007295C7277C2F76957695C727052F10E044 -:10748000D801A054BE4D6D01062F10E0D801A054C4 -:10749000BF4D7D01D6010C91D7017C91072BE22EC7 -:1074A000F12CD701A054BD4D7C91072B10E0005664 -:1074B0001F4DD8017C9178277C27C6957C2786951F -:1074C0007695979537954795C52FC071762F717E24 -:1074D000C727722F7072C727742F7479C727732F2D -:1074E0007377C727792F7A73C7277C2F7295C727A1 -:1074F0007C2F76957695C727032F10E0D801A054EE -:10750000BE4D6D01042F10E0D801A054BF4D7D0188 -:10751000D6010C91D7017C91072BE92EF12CD701D4 -:10752000A054BD4D7C91072B10E000561F4DD80193 -:107530007C9178277C27C6957C278695769527951C -:1075400057956795C32FC071742F717EC727792F08 -:107550007072C727762F7479C727752F7377C7275F -:10756000722F7A73C7277C2F7295C7277C2F769549 -:107570007695C727052F10E0D801A054BE4D6D01A8 -:10758000062F10E0D801A054BF4D7D01D6010C910B -:10759000D7017C91072BE22EF12CD701A054BD4DD1 -:1075A0007C91072B10E000561F4DD8017C91782765 -:1075B0007C27C6957C278695769597953795479530 -:1075C000C52FC071762F717EC727722F7072C727A3 -:1075D000742F7479C727732F7377C727792F7A731E -:1075E000C7277C2F7295C7277C2F76957695C7275E -:1075F000032F10E0D801A054BE4D6D01042F10E000 -:10760000D801A054BF4D7D01D6010C91D7017C91CA -:10761000072BE92EF12CD701A054BD4D7C91072BEF -:1076200010E000561F4DD8017C9178277C27C69525 -:107630007C277695279557956795C32FC071742F32 -:10764000717E7C27C92FC0727C27C62FC4797C2706 -:10765000C52FC3777C27C22FCA737C27C72FC2953B -:107660007C27C72FC695C6957C278695C52FD0E069 -:10767000C054DE4D062F10E000541F4DD881D801B4 -:10768000CC91CD2B022F10E000541D4DD801DC9180 -:10769000CD2BD0E0C056DF4DC8818C27872776954B -:1076A0008727D92F8695D79537954795EA15FB05F6 -:1076B00009F010CE6093DD2C5093DE2C2093DF2C4C -:1076C0004093E02C3093E12CD093E22CDF91CF91CA -:1076D0001F910F91FF90EF90DF90CF90BF90AF90F0 -:1076E0000895CF93DF93EDEDFCE2A081718162817B -:1076F000338124819581472F40718A2F817E842791 -:10770000462F40728427432F44798427422F4377A2 -:107710008427492F4A738427482F42958427482F6E -:10772000469546958427482F4695842786956795E4 -:107730007795A795C22FD0E0C054DE4D432F50E07F -:1077400040545F4DB881EA018881B82B492F50E041 -:1077500040545D4DEA018881CB2FC82BD0E0C05A40 -:10776000DF4D88818695522F5071432F417E4527EA -:10777000592F507245275A2F54794527572F537741 -:107780004527562F5A734527542F52954527542F76 -:10779000569556954527542F5695452746959795C6 -:1077A00027953795C72FD0E0C054DE4D4A2F50E0C3 -:1077B00040545F4DB881EA014881B42B462F50E018 -:1077C00040545D4DEA014881CB2FC42BD0E0C05A14 -:1077D000DF4D4881842B8695572F50714A2F417E6B -:1077E0004527562F50724527532F54794527522F3E -:1077F00053774527592F5A734527542F52954527BC -:10780000542F569556954527542F569545274695FE -:1078100067957795A795C22FD0E0C054DE4D432FD2 -:1078200050E040545F4DB881EA014881B42B492FA4 -:1078300050E040545D4DEA014881CB2FC42BD0E08D -:10784000C05ADF4D4881842B8695C72FD0E0C054A5 -:10785000DE4D4A2F50E040545F4DB881EA01488127 -:10786000B42B462F50E040545D4DEA014881CB2FA8 -:10787000C42BD0E0C05ADF4D4881842B522F507169 -:10788000432F417E4527592F507245275A2F54794F -:107890004527572F53774527562F5A734527542F7F -:1078A00052954527542F569556954527542F569552 -:1078B00045274695979527953795A08371836283D1 -:1078C000338324839583DF91CF9108950F931F9382 -:1078D000CF93DF93A091DD2C7091DE2C2091DF2CD3 -:1078E0005091E02C4091E12C3091E22CFC01615050 -:1078F00008F4CDC1972F90718A2F817E8927922F0E -:1079000090728927952F94798927942F93778927C7 -:10791000932F9A738927982F92958927982F969558 -:1079200096958927982F96958927869527957795F7 -:10793000A795C42FD0E0C054DE4D852F90E0805431 -:107940009F4DB881EC018881B82B832F90E0805443 -:107950009D4DEC018881CB2FC82BD0E0C058DF4D66 -:10796000B881B695942F9071852F817E8927932FAA -:10797000907289279A2F94798927972F937789274F -:10798000922F9A738927982F92958927982F9695E9 -:1079900096958927982F96958927869537954795A7 -:1079A0005795C72FD0E0C054DE4D8A2F90E0805409 -:1079B0009F4D1881EC018881182B822F90E0805414 -:1079C0009D4DEC018881C12FC82BD0E0C058DF4D00 -:1079D0008881B82BB695972F90718A2F817E892741 -:1079E000922F90728927952F94798927942F9377D6 -:1079F0008927932F9A738927982F92958927982FF3 -:107A0000969596958927982F9695892786952795F7 -:107A10007795A795C42FD0E0C054DE4D852F90E018 -:107A200080549F4D1881EC018881182B832F90E0A2 -:107A300080549D4DEC018881C12FC82BD0E0C058E7 -:107A4000DF4D8881B82BB695942F9071852F817E5C -:107A50008927932F907289279A2F94798927972FB6 -:107A600093778927922F9A738927982F9295892740 -:107A7000982F969596958927982F9695892786957C -:107A8000379547955795C72FD0E0C054DE4D8A2FC4 -:107A900090E080549F4D1881EC018881182B822F33 -:107AA00090E080549D4DEC018881C12FC82BD0E01F -:107AB000C058DF4D8881B82BB695972F90718A2FCB -:107AC000817E8927922F90728927952F9479892713 -:107AD000942F93778927932F9A738927982F9295BC -:107AE0008927982F969596958927982F9695892777 -:107AF000869527957795A795C42FD0E0C054DE4D85 -:107B0000852F90E080549F4D1881EC018881182BBF -:107B1000832F90E080549D4DEC018881C12FC82BAC -:107B2000D0E0C058DF4D8881B82BB695942F907166 -:107B3000852F817E9827832F807298278A2F8479BA -:107B40009827872F83779827822F8A739827892FE2 -:107B500082959827892F869586959827892F8695CF -:107B60009827832F9695879547955795C72FD0E0EF -:107B7000C054DE4D0A2F10E000541F4D3881E8013B -:107B80009881392B022F10E000541D4DE801988197 -:107B9000C32FC92BD0E0C058DF4D3881B32BB69529 -:107BA000372F30719A2F917E9327322F307293277F -:107BB000352F34799327342F33779327382F3A731F -:107BC0009327392F32959327392F3695369593275A -:107BD000392F36959327969527957795A795C42F96 -:107BE000D0E0C054DE4D052F10E000541F4D388109 -:107BF000E8019881392B082F10E000541D4DE80151 -:107C00009881C32FC92BD0E0C058DF4D98813B2FFE -:107C1000392B3695C72FD0E0C054DE4D0A2F10E027 -:107C200000541F4DB881E8019881B92B022F10E054 -:107C300000541D4DE8019881CB2FC92BD0E0C058CE -:107C4000DF4DB881B32B342F3071952F917E932760 -:107C5000382F307293273A2F34799327372F337781 -:107C60009327322F3A739327392F32959327392F41 -:107C7000369536959327392F36959327382F969535 -:107C800037954795579580818B27819330CEA09368 -:107C9000DD2C7093DE2C2093DF2C5093E02C40934E -:107CA000E12C3093E22CDF91CF911F910F91089539 -:107CB000CF92DF92EF92FF921F93CF93DF931091B9 -:107CC000DD2CD091DE2CC091DF2C7091E02C409106 -:107CD000E12C2091E22CE42FF0E0E054FE4DA72FA0 -:107CE000B0E0A054BF4DE0813C91E32BA22FB0E067 -:107CF000A054BD4D3C91E32BF0E0E056FF4D3081A8 -:107D0000DC0180E0615008F405C2582F3695579584 -:107D10009D2F9071812F817E89279C2F90728927BA -:107D2000972F94798927942F93778927322F3A7345 -:107D30008327982F92958927982F9695969589272E -:107D4000982F969589279C2F86959795D795179567 -:107D50005695342F3071872F817E8327322F3072D2 -:107D60008327312F347983273D2F33778327392F8A -:107D70003A738327382F32958327382F36953695D7 -:107D80008327382F369583278695279547957795AE -:107D9000CD2ED12CF601E054FE4D6F01E12EF12CD9 -:107DA000F701E054FF4D7F01F6013081F70180813A -:107DB000832BE92EF12CF701E054FD4D3081E82FA3 -:107DC000E32BF0E0E058FF4D8081582B56953D2F76 -:107DD0003071812F817E8327392F30728327372F8F -:107DE00034798327342F33778327322F3A738327CD -:107DF000382F32958327382F369536958327382F9D -:107E00003695832786959795D7951795C42ED12CAF -:107E1000F601E054FE4D6F01E72EF12CF701E0541E -:107E2000FF4D7F01F6013081F7018081832BE22E27 -:107E3000F12CF701E054FD4D3081E82FE32BF0E009 -:107E4000E058FF4DC0815C2B5695342F3071872F41 -:107E5000817E8327322F30728327312F3479832715 -:107E60003D2F33778327392F3A738327382F329565 -:107E70008327382F369536958327382F36958327D5 -:107E80008695279547957795CD2ED12CF601E05410 -:107E9000FE4D6F01E12EF12CF701E054FF4D7F0103 -:107EA000F6013081F7018081832BE92EF12CF70157 -:107EB000E054FD4D3081E82FE32BF0E0E058FF4D1A -:107EC000C081C52BC6953D2F3071812F817E8327C0 -:107ED000392F30728327372F34798327342F337724 -:107EE0008327322F3A738327382F32958327382FF1 -:107EF000369536958327382F36958327869597951F -:107F0000D7951795C42ED12CF601E054FE4D6F0184 -:107F1000E72EF12CF701E054FF4D7F01F60130818F -:107F2000F7018081382BE22EF12CF701E054FD4D52 -:107F30008081E32FE82BF0E0E058FF4D8081C82BD3 -:107F4000C695342F3071872F817E8327322F307270 -:107F50008327312F347983273D2F33778327392F98 -:107F60003A738327382F32958327382F36953695E5 -:107F70008327382F36958327542F86952795579535 -:107F80007795CD2ED12CF601E054FE4D6F01E12EF8 -:107F9000F12CF701E054FF4D7F01F6013081F7012C -:107FA0008081832BE92EF12CF701E054FD4D3081C7 -:107FB000E82FE32BF0E0E058FF4D80818C2B482F19 -:107FC00046953D2F3071812F817E3827892F807211 -:107FD0003827872F84793827852F83773827822F72 -:107FE0008A733827832F82953827832F8695869525 -:107FF0003827832F86953827C92F3695C795D7956B -:108000001795E52FF0E0E054FE4D872F90E0805467 -:108010009F4D3081FC018081382B822F90E080546D -:108020009D4DFC019081E32FE92BF0E0E058FF4DDE -:108030009081842F892B382F3695ED2FF0E0CF01DA -:1080400080549E4D6C01E12FF0E0CF0180549F4D94 -:10805000F6014081FC019081492BEC2EF12CC701E7 -:1080600080549D4DFC019081E42FE92BF0E0E05815 -:10807000FF4D9081832F892B352F3071972F917E63 -:108080003927922F90723927912F947939279D2F74 -:10809000937739274C2F4A733427932F929539279A -:1080A000932F969596953927932F96953927452F97 -:1080B0003695279547957795C42ED12CF601E05437 -:1080C000FE4D6F01E72EF12CF701E054FF4D7F01CB -:1080D000F6013081F7019081392BE22EF12CF70166 -:1080E000E054FD4D9081E32FE92BF0E0E056FF4D89 -:1080F00030819C91E92FF0E0EC59FB4FE4917D0138 -:10810000F0E8EF0EF11C5E2F5327F70150839827FC -:108110009D93F8CD1093DD2CD093DE2CC093DF2CF3 -:108120007093E02C4093E12C2093E22CDF91CF91CF -:108130001F91FF90EF90DF90CF9008950F931F93C2 -:10814000FC01862F90812181428150E060E070E047 -:10815000BA0155274427522B492B9381792B8B0148 -:1081600022273327803208F471C0D80123E0B69566 -:10817000A7952A95E1F70A271B2798013695279599 -:1081800036952795BBE07695679557954795BA95AF -:10819000D1F70227132720E030E095E1000F111FEF -:1081A000221F331F9A95D1F7402B512B622B732B33 -:1081B0008B0122273327D80133E0B695A7953A954E -:1081C000E1F70A271B2798013695279536952795BD -:1081D000BBE07695679557954795BA95D1F70227F5 -:1081E000132720E030E095E1000F111F221F331FFD -:1081F0009A95D1F7402B512B622B732B8B012227A1 -:108200003327D80133E0B695A7953A95E1F70A27C9 -:108210001B2798013695279536952795BAE07695D0 -:10822000679557954795BA95D1F70227132720E010 -:1082300030E096E1000F111F221F331F9A95D1F7EE -:10824000402B512B622B732B805289CF408351835B -:10825000028373831F910F910895AF92BF92CF92C3 -:10826000DF92EF92FF920F931F93CF93DF936730CC -:10827000710509F451C09B0127703327232B09F0A6 -:108280004EC0EB016C015B0183E0B694A7948A9524 -:10829000E1F77B0196E0F694E7949A95E1F7EA0C12 -:1082A000FB1CEC0CFD1C8501015011090C0D1D1D62 -:1082B000A701401B510B60E070E0C80101960E94CD -:1082C00048530C151D0520F1D801EC91F0E0EC5954 -:1082D000FB4F44919701D7010A171B0768F48C9153 -:1082E000982F990FF90182919F01881F8827881F75 -:1082F000892B8C931197F0CF11968C9111978E7FCB -:10830000E42FE170E82B1196EC9301501109D9CFBD -:10831000C5018C0F9D1F04C087E090E001C0CB0118 -:10832000DF91CF911F910F91FF90EF90DF90CF9051 -:10833000BF90AF900895EF92FF920F931F93CF934A -:10834000DF93EC01CB0167307105D1F169E070E09A -:108350000E947852DE0120E030E088E090E02617AD -:10836000370739F1F90143E0F695E7954A95E1F7CA -:10837000E20FF31FEC0FFD1F408150E089010770F1 -:108380001127002E02C0559547950A94E2F74C93A9 -:108390000115110551F0E1817C01E01AF10A01C0DB -:1083A000EE0FEA94EAF74E2B4C932F5F3F4F119656 -:1083B000D6CFC90123E0880F991F2A95E1F702C0A3 -:1083C00087E090E0DF91CF911F910F91FF90EF90A8 -:1083D0000895CF93DF93FC016115710511F1808140 -:1083E000869580839B01295F3F4F83E036952795D3 -:1083F0008A95E1F7DF0141E050E04217530770F43E -:10840000C1919081D0E89D9FC00111248C2B8D9348 -:108410008081869580834F5F5F4FEFCFCB010197BF -:1084200002C080E090E0DF91CF910895EF92FF923B -:108430000F931F93CF93DF93EC01CB01673071054E -:1084400009F442C069E070E00E94785220E030E018 -:1084500088E090E026173707B9F1D90143E0B695D7 -:10846000A7954A95E1F7A20FB31FA90147705527B9 -:10847000AC0FBD1FEC91F0E0042E02C0F595E7951E -:108480000A94E2F74115510559F011960C91119794 -:108490007C01E41AF50A01C0000FEA94EAF7E02B28 -:1084A000F0E0EC59FB4FE4911196AC91B0E08D01F6 -:1084B00002C0159507954A95E2F7A8014E2740FDA1 -:1084C00005C02F5F3F4FC6CF81E001C080E0DF9144 -:1084D000CF911F910F91FF90EF9008951092432D2F -:1084E00008951092432D1092E32C1092442D08957C -:1084F000F8DF0E9484291092432D0895089508956D -:10850000DC0123E633E66150E8F04D91942F922789 -:1085100080E1989FA00111244927E42FF0E04295C3 -:108520004F70232F3327C9018427AC013E2F222708 -:108530002427352743E0EE0FFF1F4A95E1F72E274A -:108540003F27E1CFC90108958F929F92AF92BF92CA -:10855000CF92DF92EF92FF920F931F93CF93DF930F -:10856000CDB7DEB7C154D240CDBFDEBF8C016B01A9 -:108570008091E32C833009F440C138F4813069F0F4 -:10858000823009F4B5C00C94054B843009F4B3C2B1 -:10859000853009F4D8C40C94054BE090452EF0903A -:1085A000462EE114F104C1F0A701495F5F4F23E0BB -:1085B000569547952A95E1F765E47DE2C8010E944A -:1085C0002E536091452E7091462EC80146DE1092C2 -:1085D000452E1092462EB5C46115710509F4AAC046 -:1085E000C801F7DE5C01BC01C80120DFD82EB5014F -:1085F000C801A1DE5C019C01295F3F4FA901440F26 -:10860000551F93E0569547959A95E1F74A5F5F4F5E -:108610004138510538F060EC73E2CE0101960E94BA -:108620005A5391C0A3E036952795AA95E1F7A80182 -:1086300060E870E0CE0101960E94BB0D8C01CF5F17 -:10864000DD4FB882C150D240CE5FDD4FA882C2500C -:10865000D24083E694E29F938F93B0E8AB2EB12C87 -:10866000C501801B910B9F938F9381E090E08C0F4D -:108670009D1F800F911F9F938F930E946153080F3E -:10868000191FB501601B710B22E030E0AE014F5F96 -:108690005D4F81E090E08C0F9D1F800F911F0E9425 -:1086A000BB0D800F911F0F900F900F900F900F90A8 -:1086B0000F90A501481B590B21E030E02C0F3D1F06 -:1086C000280F391FD11003C08FEC93E202C08EED4A -:1086D00093E29F938F935F934F933F932F930E94C7 -:1086E00061530F900F900F900F900F900F902BC031 -:1086F000E090452EF090462EE114F104C1F0A70160 -:10870000495F5F4FF3E056954795FA95E1F765E4C9 -:108710007DE2C8010E942E539091452E8091462EF5 -:108720001092452E1092462EE92EF82E70C7611534 -:10873000710591F488E0E9E7F4E2DE011196019019 -:108740000D928A95E1F71092E32CBE016F5F7F4F87 -:1087500085E60E947C215BC79B01295F3F4F73E048 -:10876000369527957A95E1F7A80160E870E0CE018B -:1087700001960E94BB0D8C01CF5FDD4FD882C150A6 -:10878000D240CE5FDD4FC882C250D24083E694E231 -:108790009F938F93E0E8CE2ED12CC601801B910BC6 -:1087A0009F938F9381E090E08C0F9D1F800F911F0E -:1087B0009F938F930E946153800F911FB601681B96 -:1087C000790B22E030E0AE014F5F5D4FA1E0B0E0F9 -:1087D000AC0FBD1F8A0F9B1F0E94BB0D1092E32C94 -:1087E000BE016F5F7F4F85E60E947C210F900F9046 -:1087F0000F900F900F900F900AC78091442DB0906A -:10880000432D882331F0B1E0BB1508F455C1109217 -:10881000442DE5E0EB15B8F0F3E0BF1608F040C0DA -:1088200021E02B15C8F081E090E080932020909308 -:10883000212082E5D8018C9382E08093432D67E06C -:10884000E62EF12C3BC138E03B1508F0A8C08AE0C9 -:10885000B81609F4F5C030C1B3E1CB16D10408F461 -:10886000B9C0B601C801B5DD7C01BC01C801DEDDBF -:10887000882319F1B701C8015EDDF801818190E01C -:10888000982F88272081822B8093352D9093362D29 -:1088900083E9808380E2818383E08093432DBCC0A1 -:1088A000B601C80196DD7C01BC01C801BFDD88238B -:1088B00021F0F8E0EF16F10488F41092432DC7017F -:1088C000089667E070E00E947852462FE0915F2E94 -:1088D000F091602EB80181EC1995B8C0B701C801BC -:1088E0002ADDD8012C9111968C911197822712962E -:1088F0009C911297892713969C9113978927149618 -:108900009C911497891366C08B2D90E003972838AB -:1089100081F49C01220F331F820F931FFC01E85C3E -:10892000F24D11962D913D914C91208331834283DC -:1089300012C0FC01EE0FFF1F8E0F9F1F9C01285CD1 -:10894000324DF80180819181A281B381F901808348 -:108950009183A283B38345E050E0B801C801029639 -:108960000E943753F3E0BF1629F024E0B21621F03D -:1089700087E903C083E901C085E9D8018C9380E7CA -:1089800011968C9367E0C801BBDDF801878390875F -:1089900083E08B0D8093432D68E470E089C0F9E09B -:1089A000CF16D104B8F0B601C80113DD7C01BC01BB -:1089B000C8013CDD811111C0C701089667E070E075 -:1089C0000E947852462FE0915F2EF091602EB80100 -:1089D00081EC19951092432D39C0B701C801ABDC69 -:1089E00063E0C8018DDD7C01892BA1F7D8018C9152 -:1089F00082FF15C0B8E0BB1691F0E6E0BE1611F09C -:108A000087E901C085E9D8018C9380E211968C93A7 -:108A1000BA94BA94B092432D60E170E049C081E00D -:108A20008093442D8B2D90E00697B82EBB0C8B0DB8 -:108A30008C5F8093422DF80180818093372D3EC05A -:108A4000C114D10431F481E08093432D0E947E292A -:108A500033C0B601C801BDDC7C01BC01C801E6DC45 -:108A600081110FC0C701089667E070E00E9478523C -:108A7000462FE0915F2EF091602EB80181EC1995A0 -:108A800008C0B701C80157DC63E0C80139DD892B94 -:108A9000D1F282ECD8018C9361E0C80131DDF8019C -:108AA00081839283B092432D1092442D68E170E04F -:108AB000C801D3DB7C0102C0E12CF12C8091442D54 -:108AC000882309F4A4C52091422D30E048E35DE2FB -:108AD00064E170E0CE0101960E94BB0DBE016F5FA4 -:108AE0007F4F85E60E947C211092442D1092E32C4A -:108AF0000E9413228AC58091442DB090432D882373 -:108B000031F0F1E0FB1508F451C11092442D25E03D -:108B10002B15B8F033E0B31608F043C081E08B1595 -:108B2000C8F081E090E0809320209093212082E59E -:108B3000F801808382E08093432DE7E0EE2EF12C54 -:108B400037C1A8E0AB1508F0A4C0BAE0BB1609F421 -:108B5000F1C02CC1F3E1CF16D10408F4B5C0B601C1 -:108B6000C80137DC7C01BC01C80160DC882331F11D -:108B7000B701C801E0DBD80111968C91119790E004 -:108B8000982F88272C91822B8093352D9093362D0A -:108B900083E98C9380E211968C9383E08093432D3C -:108BA000B5C0B601C80115DC7C01BC01C8013EDCC2 -:108BB000882321F0B8E0EB16F10488F41092432DDD -:108BC000C701089667E070E00E947852462FE09156 -:108BD0005F2EF091602EB80181EC1995B1C0B701FC -:108BE000C801A9DBF8012081818182279281892730 -:108BF000938189279481891367C08B2D90E0039717 -:108C0000283889F49C01220F331F820F931FFC0127 -:108C1000E85CF24DD80111962D913D914C91208345 -:108C20003183428312C0FC01EE0FFF1F8E0F9F1F86 -:108C30009C01285C324DF80180819181A281B38131 -:108C4000F90180839183A283B38345E050E0B801AA -:108C5000C80102960E943753F3E0BF1629F024E0C2 -:108C6000B21621F087E903C083E901C085E9D80184 -:108C70008C9380E711968C9367E0C80141DCF80182 -:108C80008783908783E08B0D8093432D68E470E0A9 -:108C900089C0F9E0CF16D104B8F0B601C80199DB5C -:108CA0007C01BC01C801C2DB811111C0C70108965B -:108CB00067E070E00E947852462FE0915F2EF091BD -:108CC000602EB80181EC19951092432D39C0B7017F -:108CD000C80131DB63E0C80113DC7C01892BA1F7FB -:108CE000D8018C9182FF15C0B8E0BB1691F0E6E088 -:108CF000BE1611F087E901C085E9D8018C9380E2A6 -:108D000011968C93BA94BA94B092432D60E170E0BE -:108D100049C081E08093442D8B2D90E00697B82EBA -:108D2000BB0C8B0D8C5F8093422DF801808180936A -:108D3000372D3EC0C114D10431F481E08093432D1E -:108D40000E947E2933C0B601C80143DB7C01BC010F -:108D5000C8016CDB81110FC0C701089667E070E0A5 -:108D60000E947852462FE0915F2EF091602EB8015C -:108D700081EC199508C0B701C801DDDA63E0C801CC -:108D8000BFDB892BD1F282ECD8018C9361E0C80162 -:108D9000B7DBF80181839283B092432D1092442D6A -:108DA00068E170E0C80159DA7C0102C0E12CF12CC5 -:108DB0008091442D882309F42AC4F090242DFF20AB -:108DC000A9F1B601C80105DB5C01009729F41092F6 -:108DD000242D1092442D42C0823A910540F0BC01EE -:108DE000C80124DB91E08927C82ED12C03C0CC24F4 -:108DF000C394D12CB501C8019EDACD2829F462E1D3 -:108E0000C8017EDB892B29F0ACEFAF0DA093242D98 -:108E10002AC024E0F29ED0011124AC52B34D80E16F -:108E2000F80101900D928A95E1F71DC042E050E0F3 -:108E30006BE371E1CE0101960E940053EEE3F1E194 -:108E4000E4912091352D3091362D89819A81281712 -:108E5000390721F48091372D8E1729F01092432D78 -:108E60000E947E29D2C32091242D203109F04DC0CB -:108E70001092442D1092242D1092E32C20E130E02A -:108E800044EE5CE267E870E0CE0101960E94BB0D03 -:108E900063E674E2CE0181960E945A5320E130E0ED -:108EA00044EF5CE265E670E0CE0183960E94BB0D64 -:108EB00063E674E2CE018D5B9F4F0E945A5320E11E -:108EC00030E044E05DE263E470E0CE018B5B9F4FF5 -:108ED0000E94BB0D63E674E2CE018B599F4F0E9446 -:108EE0005A5320E130E044E15DE261E270E0CE01FE -:108EF00089599F4F0E94BB0D0E941322BE016F5FD4 -:108F00007F4F85E60E947C2180C380E3D8018C934B -:108F100011962C9362E0C801CF5BDD4F2883C154CA -:108F2000D240EEDAF80182839383CF5BDD4F288154 -:108F3000C154D2402C5F2093242D60E270E0C80120 -:108F40008CD97C0164C38091442DB090432D88233B -:108F500031F0F1E0FB1508F451C11092442D25E0E9 -:108F60002B15B8F033E0B31608F043C081E08B1541 -:108F7000C8F081E090E0809320209093212082E54A -:108F8000F801808382E08093432D37E0E32EF12CBB -:108F900037C1A8E0AB1508F0A4C0BAE0BB1609F4CD -:108FA000F1C02CC1F3E1CF16D10408F4B5C0B6016D -:108FB000C8010FDA7C01BC01C80138DA882331F11D -:108FC000B701C801B8D9D80111968C91119790E0DA -:108FD000982F88272C91822B8093352D9093362DB6 -:108FE00083E98C9380E211968C9383E08093432DE8 -:108FF000B5C0B601C801EDD97C01BC01C80116DAC3 -:10900000882321F0B8E0EB16F10488F41092432D88 -:10901000C701089667E070E00E947852462FE09101 -:109020005F2EF091602EB80181EC1995B1C0B701A7 -:10903000C80181D9F8012081818182279281892705 -:10904000938189279481891367C08B2D90E00397C2 -:10905000283889F49C01220F331F820F931FFC01D3 -:10906000E85CF24DD80111962D913D914C912083F1 -:109070003183428312C0FC01EE0FFF1F8E0F9F1F32 -:109080009C01285C324DF80180819181A281B381DD -:10909000F90180839183A283B38345E050E0B80156 -:1090A000C80102960E943753F3E0BF1629F024E06E -:1090B000B21621F087E903C083E901C085E9D80130 -:1090C0008C9380E711968C9367E0C80119DAF80158 -:1090D0008783908783E08B0D8093432D68E470E055 -:1090E00089C0F9E0CF16D104B8F0B601C80171D932 -:1090F0007C01BC01C8019AD9811111C0C701089631 -:1091000067E070E00E947852462FE0915F2EF09168 -:10911000602EB80181EC19951092432D39C0B7012A -:10912000C80109D963E0C801EBD97C01892BA1F7FB -:10913000D8018C9182FF15C0B8E0BB1691F0E6E033 -:10914000BE1611F087E901C085E9D8018C9380E251 -:1091500011968C93BA94BA94B092432D60E170E06A -:1091600049C081E08093442D8B2D90E00697B82E66 -:10917000BB0C8B0D8C5F8093422DF8018081809316 -:10918000372D3EC0C114D10431F481E08093432DCA -:109190000E947E2933C0B601C8011BD97C01BC01E5 -:1091A000C80144D981110FC0C701089667E070E07B -:1091B0000E947852462FE0915F2EF091602EB80108 -:1091C00081EC199508C0B701C801B5D863E0C801A2 -:1091D00097D9892BD1F282ECD8018C9361E0C80138 -:1091E0008FD9F80181839283B092432D1092442D40 -:1091F00068E170E0C80131D87C0102C0E12CF12C9B -:109200008091442D882309F402C28091432D9AEF66 -:10921000980F933008F04EC0D801FC90F5FAFF2467 -:10922000F0F81092252DE6E0AE2EE0E1BE2EE12C06 -:1092300047E650E0B501CE0101960E9400538B81B4 -:10924000882349F029813A818091352D9091362DDE -:1092500028173907B9F48D81882329F09C818091E2 -:10926000372D98130FC08F89882311F0FF2051F0FC -:10927000E091252D81E08E0F8093252DF0E0EA5DB1 -:10928000F24DE082E394B7E6AB0EB11CEFE0EE12D4 -:10929000CFCFFF2009F493C080EED8018C9380E8F3 -:1092A00011968C9362E0C8012BD9F80182839383D5 -:1092B00089E0A6C0893009F082C0B601C80189D80A -:1092C0007C01BC01C801B2D881110FC0C70108964A -:1092D00067E070E00E947852462FE0915F2EF09197 -:1092E000602EB80181EC1995BEC0B701C80123D822 -:1092F0006C01D8016C91262F30E073E0969587952C -:109300007A95E1F702972817390729F46E5FC801AB -:10931000F7D8892B69F082ECF801808361E0C801FD -:10932000EFD8D80111968C93119712969C93A4C0F4 -:10933000F12C67E6E62E5801FFEFAF1ABF0A8091C5 -:10934000252DF816E0F5EF2DF0E0EA5DF24D608195 -:10935000E69EB00111246A5F7F4E47E650E0CE01E1 -:1093600001960E9400538F89882339F14E8950E07D -:10937000F801808190E001974817590739F4B50149 -:10938000CE0106960E942153892BB9F02091252DFC -:10939000422F50E0415051093F2D832F90E0841718 -:1093A00095073CF4FC01EA5DF24D818180833F5FCB -:1093B000F4CF21502093252DFA94F394C0CF8091BF -:1093C000432D9AEF980F9430F0F49091252D26E2DA -:1093D0003DE2F9018E2F821B891708F069C0819147 -:1093E00084508230B8F782E0D8018C9380E61196E1 -:1093F0008C9362E0C80184D8F801828393838BE068 -:109400008093432D9ACD8B3009F052C0C114D10402 -:1094100009F44CC0B601C8010E94E9417C01BC01BD -:10942000C80104D881110FC0C701089667E070E039 -:109430000E947852462FE0915F2EF091602EB80185 -:1094400081EC19950EC0B701C8010E949B4153E001 -:10945000969587955A95E1F7682FC80151D8892BC1 -:1094600099F01092252D82ECD8018C9361E0C8010F -:1094700047D8F801818392838AE08093432D10922C -:10948000442D68E170E05BCDD80115968C9188235E -:1094900031F0813059F48093252D85E004C081E0BE -:1094A0008093252D84E08093262D02C01092252DD7 -:1094B0008091252D811103C06AEE73E213C08130C3 -:1094C000A9F46091262DB7E66B9FB0011124635D6E -:1094D0007F4E40E450E0CE0101960E940053BE0151 -:1094E0006F5F7F4F85E60E947C2168C0912C80E0F1 -:1094F00090E000E010E027E6822E7E013FEFE31AC5 -:109500003DEFF30A3DEFC32E33E2D32EA12C42E010 -:10951000B42E2091252D921680F50130E2E01E0731 -:1095200020F0081B190BF12C2EC0E92DF0E0EA5DAC -:10953000F24D6081869EB0011124635D7F4E40E450 -:1095400050E0C7010E940053FF92EF92DF92CF924A -:10955000C501801B910B9F938F9381E090E08C0F4E -:109560009D1F800F911F9F938F930E946153080F3F -:10957000191F9394CDBFDEBFCCCF0130A2E01A07F4 -:1095800080F6FF24F394EDEFFFEFEC0FFD1FE00FEB -:10959000F11F8EE28083EEEFFFEFEC0FFD1FE00F77 -:1095A000F11F1082BE016F5F7F4F85E60E947C2114 -:1095B000F11004C084E094E20E941B1886E694E255 -:1095C0000E941B1862E070E085E39DE20E949A21F0 -:1095D0008DE694E20E941B186091422D70E088E3B2 -:1095E0009DE20E949A2183E794E20E941B1861E0A9 -:1095F00070E087E39DE20E949A211092E32C109282 -:10960000252D0E9413221092442DE12CF12CC7012C -:10961000CF5BDD4FCDBFDEBFDF91CF911F910F91AB -:10962000FF90EF90DF90CF90BF90AF909F908F9082 -:109630000895FF920F931F93CF93DF93CDB7DEB7BB -:10964000EA97CDBFDEBF09EB11E388E0F82EF00EFC -:1096500091D2F80181938F01FE12FACF0E94CF18A8 -:1096600004D3882309F4F7C08091B9319091BA31BD -:10967000953009F46FC030F4913069F168F093309F -:1096800051F1E9C0983009F4C2C0993009F4C8C05A -:10969000963009F0E0C072C0803891F0823809F04D -:1096A000DAC08091BD318F7085D2E091C331F091E5 -:1096B000C431118112FB112710F980E07BD206C062 -:1096C0001091B5318091B63181111260E8D2812FAD -:1096D00061D280E0A1C0282F2D7F09F0BCC0882373 -:1096E00019F0823061F0B7C08091BB31813009F050 -:1096F000B2C0933009F080E08093B63127C08091EA -:10970000BB31811123C0E091BD311E2F1F7009F4C0 -:10971000A2C0812F4FD28091BA31833011F4EBD2A5 -:1097200015C0E091C331F091C43181818B7F818379 -:1097300024E8129FF0011124E95FFD4C1082E091B2 -:10974000C331F091C43180818E7F808380E032D23A -:10975000A6D264C081117FC01091BB311F779FD208 -:10976000A1D35DD28823E9F31093C304111102C081 -:1097700082E001C083E08093B8316DC080588230B0 -:1097800008F069C08091BB319091BC318C3DE3E021 -:109790009E0761F583E08A838AE389834FB7F89453 -:1097A000DE01139620E038E052E05093CA01E32F27 -:1097B000F0E0E4911092CA0120FF03C0E295EF703F -:1097C0003F5FEF708E2F90E0EA3010F0C79601C037 -:1097D000C0968D939D932F5F2C3139F74FBF5FD289 -:1097E0006AE370E0CE010196A3D00FC0AE014F5FD7 -:1097F0005F4F6091BD310E94270C8C01892B59F17C -:109800004ED2B80189819A810FD1A5D124C0803868 -:1098100011F545D28091B431BDD184D143D31BC061 -:10982000811119C08091BB318230A8F438D2809167 -:10983000BB318093B43136D38091B431811106C0ED -:109840008091C304811102C081E001C084E0809353 -:10985000B8310E94CB1809D2882311F020D24BD204 -:10986000EA96CDBFDEBFDF91CF911F910F91FF90A0 -:1098700008950895CF938091B831882351F0C09115 -:10988000C53180E097D1F1D18111D3DE8C2FCF91FA -:1098900091C1CF910895CF92DF92EF92FF920F93F3 -:1098A0001F93CF93DF93EC018B017A0111D38111C8 -:1098B00036C0E114F10439F0F70180819181081B71 -:1098C000190BC80FD91FC12CD12C0115110531F16D -:1098D0008091C1319091C231FC01EF5BFF4F20813B -:1098E00031978081281790F01DD1C4DFE114F10475 -:1098F00049F0F70180819181C80ED91EC082D182C2 -:1099000085E00DC0E5D2882301F309C0899142D1D9 -:1099100001501109FFEFCF1ADF0AD7CF80E0DF91A6 -:10992000CF911F910F91FF90EF90DF90CF9008950E -:10993000DF92EF92FF920F931F93CF93DF93D82F75 -:10994000C92F8B018091C531806834D12091BF31FE -:109950003091C0312017310728F00115110519F495 -:10996000E1D001C08901ED2EFC2ED12C011511058D -:1099700009F440C08091B831811102C082E04CC02E -:10998000853011F483E048C070D1882311F081E064 -:1099900043C051D181113CC042D1882339F3209179 -:1099A000C5318091C1319091C231FC0127FF05C0C2 -:1099B000EF5BFF4FC081D0E013C0E05CFF4FC08180 -:1099C00031968081D0E0C81BD1090AC0C830D105CA -:1099D00050F4F70181917F01DDD0015011092196EA -:1099E0000115110599F7DD24D394289709F0D12C9E -:1099F00099D0BCCFD110BECF0BC08091B831882395 -:109A000009F4BCCF853009F4BDCF2FD18111BFCF70 -:109A100012D1882391F380E0DF91CF911F910F91B4 -:109A2000FF90EF90DF900895DF92EF92FF920F93F7 -:109A30001F93CF93DF93D82FC92F8B018091C5310E -:109A40008068B8D02091BF313091C03120173107E4 -:109A500028F00115110519F465D001C08901ED2E1A -:109A6000FC2ED12C0115110509F442C08091B831AA -:109A7000811102C082E04EC0853011F483E04AC0FB -:109A8000F4D0882311F081E045C0D5D081113EC0CB -:109A9000C6D0882339F32091C5318091C13190918E -:109AA000C231FC0127FF05C0EF5BFF4FC081D0E052 -:109AB00015C0E05CFF4FC08131968081D0E0C81BAB -:109AC000D1090CC0C830D10560F4F701849162D08F -:109AD000FFEFEF1AFF0A0150110921960115110538 -:109AE00089F7DD24D394289709F0D12C1BD0BACF65 -:109AF000D110BCCF0BC08091B831882309F4BACF04 -:109B0000853009F4BBCFB1D08111BDCF94D088236B -:109B100091F380E0DF91CF911F910F91FF90EF9033 -:109B2000DF900895E091C331F091C431A091C1312B -:109B3000B091C231AF5BBF4F8C9190E08283938331 -:109B400080818D798083E091C131F091C231EF5BEA -:109B5000FF4F10820895E091C331F091C4318081AC -:109B60008D798083E091C131F091C231EF5BFF4F7D -:109B7000108208958091C1319091C231FC01EF5B58 -:109B8000FF4F208131E0320F3083FC01E20FF11DE5 -:109B9000808108952091C1313091C231F901EF5B8C -:109BA000FF4F908141E0490F4083F901E90FF11D1A -:109BB000808308958093C531482F4F7050E06091A5 -:109BC000C6047091C7049A0194E0220F331F9A953E -:109BD000E1F7E4E887FF11C0E49FC001E59F900D25 -:109BE0001124885F9D4C8093C1319093C231C9018B -:109BF00008969B01280F391F0DC0E49FC001E59F07 -:109C0000900D11248A539E4C8093C1319093C231A0 -:109C1000260F371F2093C3313093C43108958091AC -:109C2000C5318068C7DFE091C331F091C4318081D4 -:109C30008695817008958091C5318F77BBDFA091A3 -:109C4000C331B091C4318C9185FF0DC0E091C13119 -:109C5000F091C23112968D919C911397E05CFF4F69 -:109C6000808381E0089580E008958091C5318F77E9 -:109C7000A1DFA091C331B091C4318C9184FF0DC09C -:109C8000E091C131F091C23112968D919C91139760 -:109C9000E05CFF4F808381E0089580E0089580912B -:109CA000C5318F7787DFE091C331F091C431808176 -:109CB0008D788083E091C331F091C43180818160DF -:109CC0008083E091C131F091C231EF5BFF4F108290 -:109CD0008091C53180686EDFE091C331F091C4316D -:109CE000808181608083E091C131F091C231EF5B6E -:109CF000FF4F10820895E091C331F091C43181810A -:109D000084608183E091C331F091C4318181807C92 -:109D1000803459F48091C53180584CDFE091C331D3 -:109D2000F091C43181818460818308951F93CF9322 -:109D3000DF931F921F92CDB7DEB7182F4A83698336 -:109D400039DFE091C331F091C4311182E091C33128 -:109D5000F091C431812F881F8827881F880F808346 -:109D6000E091C331F091C43169816183E091C331E5 -:109D7000F091C431128213822091C1313091C231ED -:109D800024833583110F110B4A814123F901E05CD3 -:109D9000FF4F40833196108281E00F900F90DF914A -:109DA000CF911F910895AF92BF92CF92DF92EF9221 -:109DB000FF920F931F93CF93DF93A62E8C017C010C -:109DC00084E0E80EF11CB12CBA1409F443C0F80188 -:109DD000D081DD23C1F1C180D280F701319780812C -:109DE000F7019081923010F498E001C098E128E0EA -:109DF00030E0C0E02C153D0520F4CF5F220F331F6B -:109E0000F9CFC92B9D2F9F70963010F080E023C0B2 -:109E1000CF7EF1E4CF16D104C8F7882321F081303A -:109E200021F4C06C0AC0C06403C0C068811105C0C1 -:109E30004C2D6C2F80E88D0F79DF4C2D6C2F8D2FE2 -:109E400075DF882319F3B3940B5F1F4F85E0E80E8D -:109E5000F11CBACF81E0DF91CF911F910F91FF905C -:109E6000EF90DF90CF90BF90AF90089580E090E0AA -:109E7000E091C604F091C7049C0144E0220F331F17 -:109E80004A95E1F7E20FF31F11864091C604509105 -:109E9000C704FA01E20FF31F118201968630910583 -:109EA00039F708958091B93187FF0DC0C4DE811163 -:109EB00005C08091B8318111F9CF09C04CCE809195 -:109EC000B831882321F0ABDE8823C9F32BCE089567 -:109ED0000F931F93CF93E091C604F091C704E05A0B -:109EE000FF4F00811181C4E68091C53187FF0AC010 -:109EF00096DE811105C08091B831811105C021C065 -:109F000080E024C098DEF5CF8530E9F0E091C331E0 -:109F1000F091C431818182FD18C0E091C604F091B6 -:109F2000C704E05AFF4F8081918180179107E1F2C9 -:109F30002FEF2C0FCC2319F08C01C22FD5CF84E04A -:109F400005C082E003C083E001C081E0CF911F9192 -:109F50000F91089563D069D0E0ECF4E081818E7FA9 -:109F6000818380818F7780831092B7310895CF935A -:109F7000DF93E0E4F0E014828481836084834ED038 -:109F800054D0C0ECD4E088818F7788838881806842 -:109F900088831092B8311092B4311092B631109279 -:109FA000B53188818064888348E068E480E8BEDE5B -:109FB00048E068E480E0BADE88858064888789812B -:109FC00081608983DF91CF910895CF93DF933FB76D -:109FD000F894C0ECD1E022E02A87EAE1F0E0E491D5 -:109FE000A0ECB4E0DA96EC93DA97EBE1F0E0E491E0 -:109FF000DB96EC93DB971A868FED94E38E7F1696B3 -:10A000008D939C93179785E18C9318962C933FBF63 -:10A0100081E08093B731DF91CF91A9CFE0ECF4E0FC -:10A0200080858370808711860895E0ECF4E08FEFDF -:10A030008287848708951F920F920FB60F92112482 -:10A0400008B60F9218BE09B60F9219BE0BB60F9242 -:10A050001BBE2F933F934F935F936F937F938F9389 -:10A060009F93AF93BF93EF93FF938091CA0487FFB1 -:10A0700008C08091C80487FF04C080E88093CA04A8 -:10A08000F8DB8091CA0486FF07C080E48093CA048D -:10A090001092B8310E94BA188091CA0485FF14C08A -:10A0A00080E28093CA048091B431882311F084E067 -:10A0B00007C08091C304811102C081E001C083E028 -:10A0C0008093B8310E94A9188091CA0484FF14C0FB -:10A0D00080E18093CA0482E08093B8311092B43159 -:10A0E0001092C304C3DE48E068E480E81FDE48E065 -:10A0F00068E480E01BDEBDDBFF91EF91BF91AF9183 -:10A100009F918F917F916F915F914F913F912F918F -:10A110000F900BBE0F9009BE0F9008BE0F900FBEA0 -:10A120000F901F901895CF93DF93EC01FC01709670 -:10A130008BE0DF011D928A95E9F782E08C838987A5 -:10A1400083E08E8761E0CE0101962DDE882361F0E9 -:10A1500061E0CE01069627DE882331F061E0CE0172 -:10A160000B96DF91CF911FCE80E0DF91CF910895C4 -:10A170000F931F93CF93DF932091B8312430E1F4F4 -:10A18000FC010489158926893789012B022B032BB1 -:10A1900099F0EB0181810EDDFE0101900020E9F7CD -:10A1A0003197BF016C1B7D0B40E050E0CE01DF9189 -:10A1B000CF911F910F916FCB82E0DF91CF911F91D3 -:10A1C0000F9108950F931F93CF93DF93FC0180911C -:10A1D000B8318430A9F484899589A689B789892BF7 -:10A1E0008A2B8B2B69F08A01EB018181E3DC40E053 -:10A1F00050E0B801CE01DF91CF911F910F914BCB71 -:10A2000082E0DF91CF911F910F910895CF93FC01D0 -:10A210008091B831843001F584899589A689B78900 -:10A22000892B8A2B8B2BC1F0C62F8181C3DC209117 -:10A23000C1313091C231F901EF5BFF4F908131970D -:10A240008081981720F48C2FA5DC80E006C06ADCA2 -:10A250003FDE8823C1F301C082E0CF910895CF9300 -:10A26000DF932091B831243091F5FC014489558960 -:10A2700066897789452B462B472B49F181819ADCEA -:10A280008091C5312091C1313091C231F90187FFF0 -:10A2900005C0EF5BFF4F808190E008C0E05CFF4F9E -:10A2A00080813196408190E0841B9109892B69F06F -:10A2B000F901EF5BFF4FD0813197C08133DCDC17B0 -:10A2C00020F006DE811104C02DDC80E001C082E0B8 -:10A2D000DF91CF910895CF93DF932091B83124304F -:10A2E00099F4FC014489558966897789452B462B69 -:10A2F000472B51F0EC0181815DDC91DC882321F05A -:10A30000CE01DF91CF91ABCFDF91CF910895CF9365 -:10A31000DF932091B831243019F08FEF9FEF46C0C2 -:10A32000FC014489558966897789452B462B472B43 -:10A33000A1F386813FDC7FDC882379F38091C531EE -:10A340002091C1313091C231F90187FF05C0EF5B27 -:10A35000FF4F808190E008C0E05CFF4F8081319624 -:10A36000208190E0821B9109892B21F003DCC82F0A -:10A37000D0E002C0CFEFDFEF2091C5318091C13135 -:10A380009091C231FC0127FF05C0EF5BFF4F208198 -:10A3900030E008C0E05CFF4F20813196808130E0E2 -:10A3A000281B3109232B09F4D6DBCE01DF91CF9195 -:10A3B00008950895FF920F931F93CF93DF93EC01BD -:10A3C00054DC882309F48EC0888190E02091BD314F -:10A3D0003091BE312817390709F084C08091BA3115 -:10A3E000813259F018F4803249F17CC0823209F48C -:10A3F00057C0833209F467C075C08091B931813A82 -:10A4000009F070C04CDC0BDC8823E9F38C89FD88F3 -:10A410000E891F89BFDB8F2DBDDB802FBBDB812F1A -:10A42000B9DB888DB7DB898DB5DB8A8DB3DB7ADB51 -:10A43000DF91CF911F910F91FF9034CD8091B93171 -:10A44000813209F04FC02BDCF6DB811105C0809111 -:10A45000B8318111F9CF46C08DDB082F8BDB182F67 -:10A4600089DBF82E87DB4F2D50E060E070E0BA0109 -:10A4700055274427782B402B512B4C8B5D8B6E8BB3 -:10A480007F8B78DB888F76DB898F74DB8A8F63DB49 -:10A4900009DDCE01DF91CF911F910F91FF9089CF00 -:10A4A0008091B9318132F1F4FADBFCDC8091BB316F -:10A4B0009091BC31888B998BCE01DF91CF911F9108 -:10A4C0000F91FF9076CF8091B931813259F4E7DB5B -:10A4D000E9DC6091BB31CE01DF91CF911F910F91EB -:10A4E000FF9067CFDF91CF911F910F91FF9008955B -:10A4F000AA1BBB1B51E107C0AA1FBB1FA617B707AA -:10A5000010F0A61BB70B881F991F5A95A9F78095C5 -:10A510009095BC01CD010895B7FF04C003D0821B04 -:10A52000930B089509D0A59F900DB49F900DA49F03 -:10A53000800D911D11240895A29FB001B39FC00109 -:10A54000A39F700D811D1124911DB29F700D811D5F -:10A550001124911D08958F929F92AF92BF92CF9236 -:10A56000DF92EF92FF92CF93DF93EC0168817981C4 -:10A570008A819B81611571058105910521F464E251 -:10A5800079ED8BE597E02DE133EF41E050E0E2D645 -:10A5900049015A019B01AC01A7EAB1E4C3DF6B0199 -:10A5A0007C01ACEEB4EFA5019401B8DFDC01CB0176 -:10A5B0008C0D9D1DAE1DBF1DB7FF03C00197A109E6 -:10A5C000B04888839983AA83BB839F77DF91CF911B -:10A5D000FF90EF90DF90CF90BF90AF909F908F90C3 -:10A5E0000895B9CF82E290E2B6CFA0E0B0E08093C8 -:10A5F000222090932320A0932420B0932520089517 -:10A60000FB01DC0102C005900D9241505040D8F78B -:10A610000895FB01DC018D91059080190110D9F39B -:10A62000990B0895FB01DC014150504048F0059022 -:10A630000D920020C9F701C01D9241505040E0F733 -:10A640000895FB01DC0104C08D910190801921F473 -:10A6500041505040C8F7881B990B0895FB01DC015D -:10A6600002C001900D9241505040D8F708956817EC -:10A67000790768F4FB01DC01E40FF51FA40FB51F97 -:10A6800002C002900E9241505040D8F70895E6CF94 -:10A69000DC0101C06D9341505040E0F70895FC018A -:10A6A0008191861721F08823D9F79927089531974A -:10A6B000CF010895FB01DC0101900D920020E1F72C -:10A6C00008950F931F93CF93DF93CDB7DEB72E97E7 -:10A6D000CDBFDEBF0E891F89888D998D26E02C8322 -:10A6E00009831A8397FF02C080E090E801978D8369 -:10A6F0009E83AE01445E5F4F6A8D7B8DCE010196D5 -:10A7000067D04D815E8157FD0AC02F813885421781 -:10A7100053070CF49A01F801E20FF31F10822E96F2 -:10A72000CDBFDEBFDF91CF911F910F9108950F93A1 -:10A730001F93CF93DF93CDB7DEB72E97CDBFDEBF8C -:10A740000E891F89888D998D2EE02C8309831A83A9 -:10A7500097FF02C080E090E801978D839E83AE0151 -:10A76000445E5F4F6A8D7B8DCE01019631D04D8165 -:10A770005E8157FD0AC02F813885421753070CF4BC -:10A780009A01F801E20FF31F10822E96CDBFDEBFB3 -:10A79000DF91CF911F910F910895CF93DF93CDB7A4 -:10A7A000DEB72E97CDBFDEBF8DE08C838C899D896F -:10A7B00089839A83AE01485E5F4F6E897F89CE019F -:10A7C00001968FD32E96CDBFDEBFDF91CF91089536 -:10A7D0002F923F924F925F926F927F928F929F92B1 -:10A7E000AF92BF92CF92DF92EF92FF920F931F939F -:10A7F000CF93DF93CDB7DEB72C97CDBFDEBF7C0103 -:10A800006B018A01FC0116821782838181FFB0C12E -:10A81000CE0101964C01F7019381F60193FD8591DC -:10A8200093FF81916F01882309F49EC1853239F429 -:10A8300093FD859193FF81916F01853221F4B701DA -:10A8400090E0D6D4E8CF512C312C20E02032A0F477 -:10A850008B3269F030F4803259F0833269F4206130 -:10A860002CC08D3239F0803339F4216026C022604B -:10A87000246023C0286021C027FD27C030ED380F99 -:10A880003A3078F426FF06C0FAE05F9E300D1124BE -:10A89000532E13C08AE0389E300D1124332E2062CF -:10A8A0000CC08E3221F426FD5FC1206406C08C36B8 -:10A8B00011F4206802C0883641F4F60193FD8591B9 -:10A8C00093FF81916F018111C1CF982F9F7D955486 -:10A8D000933028F40C5F1F4FFFE3F9830DC08336DC -:10A8E00031F0833771F0833509F057C021C0F8018A -:10A8F000808189830E5F1F4F44244394512C54015F -:10A9000014C03801F2E06F0E711CF801A080B18014 -:10A9100026FF03C0652D70E002C06FEF7FEFC50119 -:10A920002C871DD42C0183012C852F77222E16C055 -:10A930003801F2E06F0E711CF801A080B18026FF93 -:10A9400003C0652D70E002C06FEF7FEFC5012C875B -:10A95000FBD32C012C852068222E830123FC19C0F7 -:10A96000832D90E048165906A0F4B70180E290E0EC -:10A970003FD43A94F5CFF50127FC859127FE8191CC -:10A980005F01B70190E034D431103A94F1E04F1AEE -:10A9900051084114510479F7DEC0843611F089362C -:10A9A00031F5F80127FF07C06081718182819381B1 -:10A9B0000C5F1F4F08C060817181072E000C880B4F -:10A9C000990B0E5F1F4F2F76722E97FF09C090953F -:10A9D0008095709561957F4F8F4F9F4F2068722EA5 -:10A9E0002AE030E0A40155D4A82EA81843C085372A -:10A9F00029F42F7EB22E2AE030E025C0F22FF97F15 -:10AA0000BF2E8F36C1F018F4883579F0ADC080378D -:10AA100019F0883721F0A8C02F2F2061B22EB4FE84 -:10AA20000DC08B2D8460B82E09C024FF0AC09F2F53 -:10AA30009660B92E06C028E030E005C020E130E085 -:10AA400002C020E132E0F801B7FE07C060817181E9 -:10AA5000828193810C5F1F4F06C06081718180E00D -:10AA600090E00E5F1F4FA40114D4A82EA818FB2D50 -:10AA7000FF777F2E76FE0BC0372D3E7FA51450F456 -:10AA800074FE0AC072FC08C0372D3E7E05C0BA2C89 -:10AA9000372D03C0BA2C01C0B52C34FF0DC0FE0108 -:10AAA000EA0DF11D8081803311F4397E09C032FF37 -:10AAB00006C0B394B39404C0832F867809F0B3948E -:10AAC00033FD12C030FF06C05A2CB31418F4530CD7 -:10AAD0005B18B32CB31460F4B70180E290E03C87BC -:10AAE00087D3B3943C85F6CFB31410F43B1801C060 -:10AAF000312C34FF11C0B70180E390E03C8778D35C -:10AB00003C8532FF16C031FD03C088E790E002C0EB -:10AB100088E590E0B7010CC0832F867851F031FFB3 -:10AB200002C08BE201C080E237FD8DE2B70190E008 -:10AB30005FD3A51430F4B70180E390E059D35A9461 -:10AB4000F8CFAA94F401EA0DF11D8081B70190E0DD -:10AB50004FD3A110F6CF332009F45DCEB70180E2C8 -:10AB600090E046D33A94F7CFF7018681978102C0EF -:10AB70008FEF9FEF2C96CDBFDEBFDF91CF911F915E -:10AB80000F91FF90EF90DF90CF90BF90AF909F908C -:10AB90008F907F906F905F904F903F902F9008958F -:10ABA00020FD09C0FC0123FD05C022FF02C0738304 -:10ABB000628351834083089544FD10C046FD10C058 -:10ABC000DB01FC01AA0FBB1FEE1FFF1F1094D1F782 -:10ABD0006A0F7B1F8E1F9F1F31E003C033E001C04F -:10ABE00034E0660F771F881F991F3150D1F7620F2D -:10ABF000711D811D911D08950F931F93CF93DF93B6 -:10AC00008C01C801B7D2EC0197FD06C08AD2892B0E -:10AC1000C1F7B801CE0124D3CE01DF91CF911F91AE -:10AC20000F9108958F929F92AF92BF92CF92DF9231 -:10AC3000EF92FF920F931F93CF93DF931F92CDB7A5 -:10AC4000DEB78C01C62E7A01298394D2AC01552738 -:10AC500029814B32510521F04D32510561F42068B4 -:10AC6000CA94C11002C080E06FC0C801298382D29B -:10AC7000298197FDF8CF322F3D7FD32E322F3073AD -:10AC800039F5803329F5BB24BA94BC0C09F449C0CA -:10AC9000C80129836FD2298197FD43C0382F3F7D9A -:10ACA000383561F48D2D8264D82ECA94CA94CC2094 -:10ACB000C1F1C8015FD297FF0BC033C026FF04C0AB -:10ACC0002D2D2260D22E03C03D2D3261D32ECB2CF0 -:10ACD000812C912C540120ED280F283078F0D4FEDF -:10ACE00003C0B801BDD21AC02A3040F0D6FEF9CF59 -:10ACF0002F7D3FEE320F3630A0F727504D2DC50186 -:10AD0000B4015ADF4B015C018D2D8260D82ECA94AC -:10AD1000CC2051F0C8012ED297FFDDCFD1FC04C06A -:10AD2000A2CF812C912C5401D7FE08C0B094A094DE -:10AD300090948094811C911CA11CB11C2D2DB501F7 -:10AD4000A401C7012DDF81E00F90DF91CF911F910A -:10AD50000F91FF90EF90DF90CF90BF90AF909F90BA -:10AD60008F9008956F927F928F929F92AF92BF9231 -:10AD7000CF92DF92EF92FF920F931F93CF93DF93C7 -:10AD8000CDB7DEB7A197CDBFDEBF5C017A01CE01A2 -:10AD900001966C0180E2F60111928A95E9F7F501BE -:10ADA000838040E050E0912C712C70E0A1E0B0E095 -:10ADB000F90183FC859183FE81918F01982F9F017A -:10ADC000811103C080E090E07AC08E3519F44115FE -:10ADD000510549F1E72FF0E0E417F5073CF48D3514 -:10ADE00059F18D3219F4772001F103C0711001C0BF -:10ADF000982E892F8695869586958601080F111DB8 -:10AE0000892F87703D0101C0660C8A95EAF7F80129 -:10AE1000808186298083991559F0991510F49F5FD8 -:10AE2000E8CF9150E6CF71E004C07724739401C05D -:10AE3000712C4F5F5F4FBCCF772019F08E818062FD -:10AE40008E83711103C09924939416C0F6019E015C -:10AE50002F5D3F4F808180958193E217F307D1F7F3 -:10AE6000F2CFE114F10429F0F7018083C7010196C4 -:10AE70007C016150912CE9F0C50169A37BD169A1E6 -:10AE800097FD15C0282F269526952695F601E20FE9 -:10AE9000F11D208130E0AC014770552702C0359587 -:10AEA00027954A95E2F720FDDCCFB501D9D1911065 -:10AEB00089CFE114F10411F0F7011082C801A196C5 -:10AEC000CDBFDEBFDF91CF911F910F91FF90EF902B -:10AED000DF90CF90BF90AF909F908F907F906F90BA -:10AEE00008954F925F927F928F929F92AF92BF92FE -:10AEF000CF92DF92EF92FF920F931F93CF93DF9346 -:10AF00001F92CDB7DEB76C012B015A01FC011682EE -:10AF10001782712CF601F380F201F3FC8591F3FEA8 -:10AF20008191382F2F01882309F4E5C090E03983FF -:10AF3000F8D03981892B19F0C6015EDEEBCF3532AE -:10AF400041F4F201F3FC3591F3FE31912F013532DA -:10AF500059F4C60139830ED1398197FDCAC038171B -:10AF6000C9F2B6017DD1C7C03A3239F4F3FC35914C -:10AF7000F3FE31912F0151E001C050E0420110E099 -:10AF800020ED230F2A3088F45260612F70E080E0BA -:10AF900090E040E2598310DE162FF401F3FC359166 -:10AFA000F3FE31914F015981EBCF052F232F24015F -:10AFB00051FF03C0111102C09EC01FEF383619F0B7 -:10AFC0003C3659F011C0F401F3FC2591F3FE2191B8 -:10AFD0002F01283649F4052F08600460F201F3FCC4 -:10AFE0002591F3FE21912F01222309F484C0622FC1 -:10AFF00070E08FE096E129839CD02981892B09F4A8 -:10B000007AC000FD07C0F501E080F180C50102961D -:10B010005C0102C0E12CF12C2E3649F4F601468188 -:10B02000578160E070E0202FC701BADD73CF23366F -:10B0300089F401FF11E0C6019DD097FD5AC0E114CB -:10B04000F10429F0F7018083C70101967C011150BA -:10B0500091F74BC02B3551F49201A701612FC60126 -:10B0600081DE2C01892B09F040C03AC0C60129833A -:10B07000C3DD298197FD3DC02F3641F128F42436E8 -:10B0800019F1293631F124C0233769F02537E1F071 -:10B090001FC0E114F10429F0F7018082C701019675 -:10B0A0007C01115059F0C60165D04C0197FD06C0D6 -:10B0B00038D0892B71F3B601C401D2D0E114F10468 -:10B0C000A1F0F701108211C0006203C0006101C04D -:10B0D0000064202FA701612FC601A4DD811105C0E6 -:10B0E000F6018381807329F406C000FD13CF7394A9 -:10B0F00011CF772019F0872D90E002C08FEF9FEFDE -:10B100000F90DF91CF911F910F91FF90EF90DF9003 -:10B11000CF90BF90AF909F908F907F905F904F9017 -:10B120000895911114C1803219F089508550D0F7DB -:10B130000895FC010590061621F00020D9F7C00102 -:10B1400008953197CF010895FC010590615070403A -:10B150000110D8F7809590958E0F9F1F0895FC01E0 -:10B160006150704001900110D8F7809590958E0F36 -:10B170009F1F0895CF93DF93EC012B8120FF33C0F5 -:10B1800026FF0AC02F7B2B838E819F8101968E83A1 -:10B190009F838A8190E029C022FF0FC0E881F98156 -:10B1A0008081082E000C990B009719F420622B83E4 -:10B1B0001AC03196E883F9830EC0EA85FB8519959C -:10B1C00097FF09C02B81019611F080E201C080E158 -:10B1D000822B8B8308C02E813F812F5F3F4F2E83B0 -:10B1E0003F83992702C08FEF9FEFDF91CF910895A2 -:10B1F0000F931F93CF93DF93FB01238121FD03C0A6 -:10B200008FEF9FEF28C022FF16C04681578124810F -:10B2100035814217530744F4A081B1819D012F5F0E -:10B220003F4F208331838C93268137812F5F3F4F9F -:10B230002683378310C0EB01092F182F0084F18576 -:10B24000E02D1995892BE1F68E819F8101968E83E1 -:10B250009F83812F902FDF91CF911F910F910895A0 -:10B26000FB01238120FF12C026FD10C08F3F3FEF5E -:10B27000930761F082832F7D2064238326813781A9 -:10B280002150310926833783992708958FEF9FEF47 -:10B290000895FA01AA27283051F1203181F1E8946C -:10B2A0006F936E7F6E5F7F4F8F4F9F4FAF4FB1E0B9 -:10B2B0003ED0B4E03CD0670F781F891F9A1FA11DB4 -:10B2C000680F791F8A1F911DA11D6A0F711D811DB5 -:10B2D000911DA11D20D009F468943F912AE0269F7A -:10B2E00011243019305D3193DEF6CF010895462FD9 -:10B2F0004770405D4193B3E00FD0C9F7F6CF462FBA -:10B300004F70405D4A3318F0495D31FD4052419322 -:10B3100002D0A9F7EACFB4E0A695979587957795DF -:10B320006795BA95C9F700976105710508959B0166 -:10B33000AC010A2E06945795479537952795BA95EF -:10B34000C9F7620F731F841F951FA01D08959927C9 -:10B3500088270895052E97FB16F400940FD057FD0B -:10B3600005D014D007FC02D046F408C05095409593 -:10B37000309521953F4F4F4F5F4F089590958095A1 -:10B38000709561957F4F8F4F9F4F0895A1E21A2EC0 -:10B39000AA1BBB1BFD010DC0AA1FBB1FEE1FFF1F79 -:10B3A000A217B307E407F50720F0A21BB30BE40BC9 -:10B3B000F50B661F771F881F991F1A9469F7609510 -:10B3C0007095809590959B01AC01BD01CF010895CA -:04B3D000F894FFCF1F -:10B3D40002400F00831000000104100000018208E5 -:10B3E40000000100000000000000000000009001C7 -:10B3F4000100010000000000000088238F238F2338 -:10B404009B23A723B123CE23DC23052408240C2467 -:10B414008726E925FE250226172648265B26882648 -:10B424003E000426140004043E00042E040C04040C -:10B4340000080008000000000000000800080808D8 -:10B4440008080800080008000000080800080808A8 -:10B4540000800080000000000000008000808080E8 -:10B4640080808000800080000000808000808080D8 -:10B4740000010001000000000000000100010101C2 -:10B4840001010100010001000000010100010101AE -:10B4940000000000000000000000000000000000A8 -:10B4A4000101010101010101010101010101010188 -:10B4B4000101010101010101010101010101010178 -:10B4C4000101010101010101010101010101010168 -:10B4D4000000000000000000000000000000000068 -:10B4E4000000000000000000000000000000000058 -:10B4F4000000000000000000000000000000000048 -:10B504000101010101010101010101010101010127 -:10B514000000000000000000000000000000000027 -:10B524000000000000000000000000000000000017 -:10B5340001010101010101010101010101010101F7 -:10B5440000000000000000000000000000000000F7 -:10B5540001010101010101010101010101010101D7 -:10B5640001010101010101010101010101010101C7 -:10B5740000000000000000000000000000000000C7 -:10B5840001010101010101010101010101010101A7 -:10B594000000000202000002000202020200000297 -:10B5A4000000000202000002000202020200000287 -:10B5B4000000000202000002000202020200000277 -:10B5C4000404040606040406040606060604040627 -:10B5D4000404040606040406040606060604040617 -:10B5E4000000000202000002000202020200000247 -:10B5F4000000000202000002000202020200000237 -:10B6040004040406060404060406060606040406E6 -:10B614000000000202000002000202020200000216 -:10B6240004040406060404060406060606040406C6 -:10B6340004040406060404060406060606040406B6 -:10B6440004040406060404060406060606040406A6 -:10B654000404040606040406040606060604040696 -:10B6640000000002020000020002020202000002C6 -:10B6740000000002020000020002020202000002B6 -:10B684000404040606040406040606060604040666 -:10B694000008080800000008000008000808000866 -:10B6A4000008080800000008000008000808000856 -:10B6B4000008080800000008000008000808000846 -:10B6C4001018181810101018101018101818101836 -:10B6D4001018181810101018101018101818101826 -:10B6E4000008080800000008000008000808000816 -:10B6F4000008080800000008000008000808000806 -:10B7040010181818101010181010181018181018F5 -:10B7140000080808000000080000080008080008E5 -:10B7240010181818101010181010181018181018D5 -:10B7340010181818101010181010181018181018C5 -:10B7440010181818101010181010181018181018B5 -:10B7540010181818101010181010181018181018A5 -:10B764000008080800000008000008000808000895 -:10B774000008080800000008000008000808000885 -:10B784001018181810101018101018101818101875 -:10B79400546F6F206D616E7920646174612E000DA9 -:10B7A4000A504152495459204552524F52000D0AF1 -:10B7B400504152495459204F4B00556E6B6E6F7770 -:10B7C4006E206361726420747970652E0025732085 -:10B7D4006F7220005468657265206973206174205B -:10B7E4006C65617374206F6E65206D6F7265206384 -:10B7F40061726420747970652063616E6469646148 -:10B8040074652C2062757420746865726520776194 -:10B8140073206E6F7420656E6F756768207465722F -:10B824006D696E616C206275666665722073706105 -:10B8340063652E0D0A00415451413A0900554944AB -:10B844003A090053414B3A09004E4F2044415441B8 -:02B854000000F2 +:105EF000F7D68981F80180838A8181838B818283AF +:105F00008C818383E058FF4F8D81808331968E8111 +:105F1000808331968F81808331968885808387E066 +:105F20008093DC2C80E290E174C30E947E3B91E080 +:105F30008927F80101CD8035B9F4F80181818111FB +:105F400082CD62E070E0C801E4D3882309F49BCDE0 +:105F50001092DC2CE0915F2EF091602E40E060E02A +:105F600070E081E9199576C2A501495F5F4FA3E012 +:105F700056954795AA95E1F7E0915F2EF091602E36 +:105F8000B80182E9199581E0DEC062E1C8010E9492 +:105F9000733C60E170E0C801BCD3E0915F2EF091EA +:105FA000602E882329F142E1B80181E8199580919A +:105FB0005E2E81110BC06091D32CF0E16F9FB00178 +:105FC000112440E150E0C8010E94B20E0E947E3BC5 +:105FD0009AE015C066E0C8010E94733C64E070E07E +:105FE000C80197D3811113C0E0915F2EF091602E0C +:105FF00044E0B80181EC19950E947E3B91E089272D +:10600000F801808388E08093DC2C84E024C26091D6 +:10601000D32CF0E16F9FB001112440E150E082ECFD +:106020009CE20E94640E9091C22C8091C62C8095B7 +:106030009813EBC28091CA2C9813E7C22091C32C0D +:106040008091C72C80952813E0C28091CB2C281317 +:10605000DCC2C090C42C8091C82C8095C812D5C2D7 +:106060008091CC2CC812D1C28091C52C3091C92C02 +:1060700030958313CAC23091CD2C8313C6C2409190 +:10608000CE2C3091CF2C30954313BFC23091D02C01 +:106090004313BBC23091D12C30954313B6C2F801E3 +:1060A000308141818280912CA12CB12C5401992402 +:1060B0008824942A832A3381B32AD12CE12CF12C11 +:1060C0007601DD24CC24D22AC92AF82A8091DC2C3E +:1060D0008B3009F07FC2E0915F2EF091602E46E098 +:1060E000B80185E81995C818D908EA08FB08C092D4 +:1060F000C22C33272F2D1E2D0D2D0093C32CA7014D +:10610000662777274093C42C8F2D9927AA27BB2772 +:106110008093C52CEC2DE095E093C62CE02FE09504 +:10612000E093C72CE42FE095E093C82CE82FE0958E +:10613000E093C92CC092CA2C0093CB2C4093CC2C5A +:106140008093CD2C88E08093DC2C84C1903409F0BE +:1061500081C182E08093DC2C8AE0EBCE833909F0A8 +:1061600084CC80915D2E873009F0A0C043E050E0E0 +:1061700060E070E0CE0102960E94640E88E8898398 +:10618000F8019181903219F0903761F024C0F80144 +:1061900080833A8131832B8122839C8193832327BF +:1061A000822728C1F8018281883809F053C1938180 +:1061B0008A8198134FC194818B8198134BC195812B +:1061C0008C81981347C184E0808361E070E0C8014E +:1061D00075D285E09EC0E92EE2942FE0E2222EEFF8 +:1061E0002E0D9F70F92E88E090E08F1991094FEFE6 +:1061F00050E06A0102C0D594C7948A95E2F7253031 +:1062000021F0243059F5FF20E9F044E050E0B801D6 +:106210006E5F7F4FCE0101962B8B0E942E532B89F0 +:10622000892B61F49A818B81892798E889279C8141 +:106230008927F801968189278C2181F1243071F416 +:10624000F11008C144E050E0B8016E5F7F4FCE010D +:1062500001960E942E53892B09F1FCC0243008F0CE +:10626000F9C0E22EF12CA701B8016E5F7F4FCE017D +:1062700001960E942E53892B09F0ECC0D801AE0D77 +:10628000BF1DE1E0F0E0EC0FFD1FEE0DFF1D1296CB +:106290009C9180818927C82209F0DCC098E8F80128 +:1062A00090833A8131832B812283A0C044E050E067 +:1062B00060E070E007C0853909F0D7CB44E050E0DA +:1062C00063E070E0CE0101960E94640E9091BA2CBA +:1062D000F8018181803209F482C08037F1F4F8013D +:1062E000228189812813B6C023818A812813B2C0F4 +:1062F00024818B812813AEC025818C812813AAC0EC +:10630000908361E070E0C801D9D18FEF8093BD2CFC +:1063100086E08093DC2C88E19EC0E82EE2949FE02A +:10632000E9222EEF2E0D8F70F82E88E090E08F1965 +:1063300091094FEF50E06A0102C0D594C7948A9545 +:10634000E2F7253021F0243059F5FF20E9F044E050 +:1063500050E0B8016E5F7F4FCE0101962B8B0E94FB +:106360002E532B89892B61F49A81898189279B81FE +:1063700089279C818927F801968189278C2179F1C9 +:10638000243071F4F11066C044E050E0B8016E5F53 +:106390007F4FCE0101960E942E53892B01F15AC0E6 +:1063A000243008F057C0E22EF12CA701B8016E5F2F +:1063B0007F4FCE0101960E942E53892B09F04AC0CF +:1063C000D801AE0DBF1DE1E0F0E0EC0FFD1FEE0DBA +:1063D000FF1D12969C9180818927C822D9F52981B9 +:1063E000F80120833A8131839B8192838C8183835E +:1063F000232792278927848388E22DC0823C09F0D5 +:10640000CBC0F8019181903E09F0C8C09281943BC5 +:1064100009F0C4C046E050E06AEA74E0CE0101969B +:106420000E94640E89818B3409F02DCB8A818937D3 +:1064300009F029CB8B818B3109F025CB8C818A3EE9 +:1064400009F021CB8D818B3709F01DCB8E818C3CDF +:1064500009F019CB80E090E0DCC0F8018081803643 +:1064600021F08AE3C82ED12C03C0B0E3CB2ED12C6F +:10647000F801818187FF0CC0807FF0E18F9F700160 +:10648000112480ECC80ED11CA6EFAA2EB12C08C096 +:106490008C7F90E1899F70011124F6E3AF2EB12C1F +:1064A000E0915F2EF091602E42E0B80180E91995ED +:1064B000F801808181708093D22CC701E4E0969529 +:1064C0008795EA95E1F78093D32CB7016A0D7B1D80 +:1064D00044E050E08EEB9CE20E94640E8091D32C4D +:1064E0008093BD2C68E0CE0101960E94A20D8091A0 +:1064F0005D2E44E050E0873019F463E070E002C0A4 +:1065000060E070E0CE010F960E94640EB7016C0D42 +:106510007D1D46E050E0CE0109960E94640E8981FF +:106520008093D42C8A818093D52C8B818093D62C18 +:106530008C818093D72C60E484ED9CE20E94AB4078 +:106540008091D42C8093D82C8091D52C8093D92CF9 +:106550008091D62C8093DA2C8091D72C8093DB2CE1 +:1065600060E288ED9CE20E94AB4087E08093DC2CE7 +:106570008981F80180838A8181838B8182838C81E8 +:106580008383AE014F5F5F4FBE01615F7F4FCE01DE +:106590000996F0D080E25FCF803339F0982F9F7E4C +:1065A000903A19F0805C833078F481E08093DC2CA1 +:1065B00084E0F8018083E0915F2EF091602E40E04E +:1065C00060E070E082EC83CBE0915F2EF091602E72 +:1065D00040E0D6CC8A3069F4E0915F2EF091602ED5 +:1065E00046E0B80184E81995C80CD91CEA1CFB1CCC +:1065F0007ECD8C3009F07BCDE0915F2EF091602E46 +:1066000046E0B80187E8199572CD0E947E3B96E07E +:10661000F6CC6396CDBFDEBFDF91CF911F910F9176 +:10662000FF90EF90DF90CF90BF90AF909F908F90B2 +:106630000895CF93DF9320915D2E273071F4EC0104 +:1066400043E050E060E070E00E94640E44E050E0FF +:1066500063E070E0CE01039604C044E050E060E0E7 +:1066600070E0DF91CF910C94640ECF93DF931F9273 +:10667000CDB7DEB720915D2E273029F447E050E0FA +:1066800060E070E015C0FC01318120812327328158 +:10669000232733812327298344E050E060E070E022 +:1066A0000E94B20E41E050E064E070E0CE0101963D +:1066B0000E94B20E0F90DF91CF91089520E42093B5 +:1066C000D00026EC2093D5002093D40021E0209325 +:1066D000D000DC01680F791FA617B70741F0ED91D4 +:1066E000F0E0EC59FA4FE491E093D300F5CFE0915C +:1066F000D500F0E0EC59FA4FE491EC93E091D4002E +:10670000F0E0EC59FA4FE4911196EC931092D0001E +:10671000089520E42093D00026EC2093D500209308 +:10672000D40021E02093D000DC01680F791FA61768 +:10673000B70741F0ED91F0E0EC59FA4FE491E093A6 +:10674000D300F5CFE091D500F0E0EC59FA4FE49199 +:106750008C918E130AC0E091D400F0E0EC59FA4F0E +:10676000E49181E011969C919E1380E01092D000FC +:10677000817008958F929F92AF92BF92CF92DF92D5 +:10678000EF92FF920F931F93CF93DF93DC018C91D5 +:1067900010E0E0E0869517958695E7958695179524 +:1067A0008695E795869517958695E795869517952D +:1067B0008695E79511968C911197869517958695F4 +:1067C000E795869517958695E7958695179586950D +:1067D000E795869517958695E79512968C91129771 +:1067E000F0E030E08695F795869537958695F79594 +:1067F000869537958695F795869537958695F7957D +:106800008695379513968C9113978695F79586956F +:1068100037958695F795869537958695F79586955C +:1068200037958695F7958695379514968C9114979C +:1068300090E020E086959795869527958695979583 +:10684000869527958695979586952795869597950C +:106850008695279515968C9186959795869527957B +:1068600086959795869527958695979586952795EC +:1068700086959795869527955B01DA014A0144E054 +:10688000840E911C6C91E50179915E017627C32EEF +:10689000D12CA60140545E4DEE2EF12CE701C054E0 +:1068A000DF4D7E01EA01D880E7010881ED2CE02A66 +:1068B000C22ED12CA60140545D4DEA010881E02A88 +:1068C000F12CA70140565F4DEA0108810695879596 +:1068D000DF2FD071FD2E012F017EF026092F0072CF +:1068E000F0260E2F0479F026032F0377F026022FCF +:1068F0000A73F0260F2D0295F0260F2D06950695AA +:10690000F0260F2D0727F6940F2506959795F795F6 +:1069100017957695CF2ED12CA60140545E4DE12ED1 +:10692000F12CE701C054DF4D7E01EA01D880E70178 +:106930000881ED2CE02AC92ED12CA60140545D4DD2 +:10694000EA010881E02AF12CA70140565F4DEA01D7 +:10695000088106958795D32FD071FD2E0E2F017ECD +:10696000F026022F0072F026012F0479F0260F2F57 +:106970000377F026092F0A73F0260F2D0295F026D3 +:106980000F2D06950695F0260F2D0727F6940F2557 +:10699000069527953795E7957695C32ED12CA601B8 +:1069A00040545E4DEE2EF12CE701C054DF4D7E01C8 +:1069B000EA01D880E7010881ED2CE02AC22ED12C13 +:1069C000A60140545D4DEA010881E02AF12CA7019F +:1069D00040565F4DEA01088106958795DF2FD071FB +:1069E000FD2E012F017EF026092F0072F0260E2FBA +:1069F0000479F026032F0377F026022F0A730F2560 +:106A0000F02EF2940F25F02EF694F6940F25F02E2A +:106A1000F72606950F25D12E102F16959795F795E9 +:106A2000D79476950F2F10E0A80140545E4D0D2DA0 +:106A300010E000541F4DEA01F880E80118810F2D85 +:106A4000012BE92EF12CA70140545D4DEA0118817C +:106A5000012B10E000561F4DE8011881169587950F +:106A6000032F00711E2F117E0127122F1072012794 +:106A70001D2D147901271F2F13770127192F1A7342 +:106A80000127102F12950127102F16951695012713 +:106A9000102F172706951027169527953795E795F8 +:106AA0007695032F10E0A80140545E4D0E2F10E0A4 +:106AB00000541F4DEA01F880E80118810F2D012BC9 +:106AC000E22EF12CA70140545D4DEA011881012B03 +:106AD00010E000561F4DE8011881169587950F2F7D +:106AE00000711D2D117E0127192F107201271E2FF5 +:106AF00014790127132F13770127122F1A730127F7 +:106B0000102F12950127102F169516950127102F7B +:106B1000172706950127102F16959795F795D79467 +:106B200076950F2F10E0A80140545E4D0D2D10E01A +:106B300000541F4DEA01F880E80118810F2D012B48 +:106B4000E92EF12CA70140545D4DEA011881012B7B +:106B500010E000561F4DE801188116958795032F08 +:106B600000711E2F117E0127122F107201271D2D7B +:106B7000147901271F2F13770127192F1A73012763 +:106B8000102F12950127102F169516950127102FFB +:106B9000172706951027169527953795E79576952B +:106BA000032F10E0A80140545E4D0E2F10E000545A +:106BB0001F4DEA01F880E80118810F2D012BE22E0C +:106BC000F12CA70140545D4DEA011881012B10E022 +:106BD00000561F4DE8011881169587950F2F0071FB +:106BE0001D2D117E1027092F007210270E2F0479FA +:106BF0001027032F03771027022F0A731027012F66 +:106C000002951027012F069506951027012F0727BB +:106C1000169501271D2D06959795F7951795CF2E5B +:106C2000D12CA60140545E4DE12EF12CE701C05459 +:106C3000DF4D7E01EA01D880E7010881ED2CE02AD2 +:106C4000C92ED12CA60140545D4DEA010881E02AED +:106C5000F12CA70140565F4DEA0108810695879502 +:106C6000D32FD071FD2E0E2F017EF026022F007241 +:106C7000F026012F0479F0260F2F0377F026092F35 +:106C80000A730F25F02EF2940F25F02EF694F69449 +:106C90000F25769570270695702776952795379559 +:106CA000E79568276D93A815B90509F0EBCD10930A +:106CB000DD2CF093DE2C9093DF2CE093E02C3093CE +:106CC000E12C2093E22CDF91CF911F910F91FF9047 +:106CD000EF90DF90CF90BF90AF909F908F900895EE +:106CE0004F925F926F927F929F92AF92BF92CF929C +:106CF000DF92EF92FF920F931F93CF93DF93DC010C +:106D00008C9110E0B12CEB2D8695E7958695179523 +:106D10008695E795869517958695E79586951795B7 +:106D20008695E7958695179511968C911197BE2EAD +:106D30008695B794869517958695B79486951795F9 +:106D40008695B794869517958695B79486951795E9 +:106D500012969C91129730E080E0969587959695D3 +:106D600037959695879596953795969587959695A7 +:106D70003795969587959695379513969C91139789 +:106D80009695879596953795969587959695379587 +:106D90009695879596953795969587959695379577 +:106DA0001496EC91149790E000E0E6950795E6952F +:106DB0009795E6950795E6959795E6950795E69557 +:106DC0009795E6950795E69597951596DC90D69458 +:106DD0000795D6949795D6940795D6949795D6947B +:106DE0000795D6949795D6940795D6949795E32FC3 +:106DF000F0E0E054FE4DA12FB0E0A054BF4DF08173 +:106E0000EC91EF2BA92FB0E0A054BD4DFC91EF2BDE +:106E1000F0E0E056FF4DE0802B01BA016C5F7F4F40 +:106E2000DA013B01AC90E201C9902E01CA24FD2D8C +:106E3000E694F795D82FD071FD2EEB2DE17EFE263E +:106E4000E02FE072FE26E12FE479FE26E32FE377C0 +:106E5000FE26E92FEA73EF25FE2EF294EF25FE2E93 +:106E6000F694F694EF25FE2EFC24E695FE26EB2DF7 +:106E700020FDFE24F69407958795E795BC2CB694E3 +:106E8000C82ED12CA60140545E4DEE2EF12CE70108 +:106E9000C054DF4D7E01EA01D880E701F880ED2C77 +:106EA000EF28C02ED12CA60140545D4DEA01F88098 +:106EB000EF28F12CA70140565F4DEA01D880D69407 +:106EC000F795D32FD071ED2E412F417EE426592F17 +:106ED0005072E526CE2FC479EC26D82FD377ED2635 +:106EE000402F4A73E426FE2CF294EF24FE2CF694F5 +:106EF000F694EF24FE2CFB24E694FE2420FDFD24D2 +:106F0000F694979537951795B694C32ED12CE60134 +:106F1000C054DE4DE12EF12CA70140545F4DD880C6 +:106F2000EA01F880ED2CEF28C92ED12CA60140549F +:106F30005D4DEA01F880EF28F12CA70140565F4D26 +:106F4000EA01D880D694F795D82FD071ED2E4E2F28 +:106F5000417EE426502F5072E526C12FC479EC26DD +:106F6000D32FD377ED26492F4A73E426FE2CF294D3 +:106F7000EF24FE2CF694F694EF24FE2CFB24E694EA +:106F8000FE2420FDFD24F69407958795E795B69499 +:106F9000C82ED12CE601C054DE4DEE2EF12CA701F7 +:106FA00040545F4DD880EA01F880ED2CEF28C02EC8 +:106FB000D12CA60140545D4DEA01F880EF28F12C58 +:106FC000A70140565F4DEA01D880D694F795D32F9C +:106FD000D071ED2E412F417EE426592F5072E526C7 +:106FE000CE2FC479EC26D82FD377ED26402F4A73C5 +:106FF000E426FE2CF294EF24FE2CF694F694EF2473 +:10700000FE2CFB24E694FE2420FDFD24F6949795A7 +:1070100037951795B694C32ED12CE601C054DE4D9A +:10702000E12EF12CA70140545F4DD880EA01F88091 +:10703000ED2CEF28C92ED12CA60140545D4DEA015C +:10704000F880EF28F12CA70140565F4DEA01D88067 +:10705000D694F795D82FD071ED2E4E2F417EE42691 +:10706000502F5072E526C12FC479EC26D32FD37749 +:10707000ED26492F4A73E426FE2CF294EF24FE2CD1 +:10708000F694F694EF24FE2CFB24E694FE2420FDD7 +:10709000FD24F69407958795E795B694C82ED12CD4 +:1070A000E601C054DE4DEE2EF12CA70140545F4D99 +:1070B000D880EA01F880ED2CEF28C02ED12CA60153 +:1070C00040545D4DEA01F880EF28F12CA7014056AD +:1070D0005F4DEA01D880D694F795D32FD071ED2E6D +:1070E000412F417EE426592F5072E526CE2FC479D8 +:1070F000EC26D82FD377ED26402F4A73E426FE2CBA +:10710000F294EF24FE2CF694F694EF24FE2CFB244C +:10711000E694FE2420FDFD24F69497953795179567 +:107120009B2C9694C32ED12CE601C054DE4DE12E4B +:10713000F12CA70140545F4DD880EA01F880ED2C76 +:10714000EF28C92ED12CA60140545D4DEA01F880EC +:10715000EF28F12CA70140565F4DEA01D880D69464 +:10716000F795D82FD0714E2F417EF42EFD26502F4B +:107170005072F526C12FC479FC26D32FD377FD2674 +:10718000492F4A73F426EF2CE294FE24EF2CE69468 +:10719000E694FE24EF2CE924F694FE24BE2EEF2D77 +:1071A00020FDED25E69507958795B794C82ED12C3F +:1071B000E601C054DE4DEB2CF12CA70140545F4D8D +:1071C000D880EA01E881ED2CEE2AC02ED12CA60150 +:1071D00040545D4DEA01E881EE2AF12CA7014056AA +:1071E0005F4DEA01F880DF2EF694D794F32FF0710B +:1071F000E12FE17EEF27F92FF072EF27FB2DF479D5 +:10720000EF27F82FF377EF27F02FFA73EF27FE2FF2 +:10721000F295EF27FE2FF695F695EF2796949E268A +:10722000E6959E2620FD9F24969497953795179571 +:10723000E32FF0E0AF0140545E4DE12FF0E0E05469 +:10724000FF4DEA01F880E081EF29E92EF12CA7013A +:1072500040545D4DEA01F881EF2BF0E0E056FF4D20 +:10726000E080EA2DF0E0EC59FB4FE491EE25E301DC +:10727000E9933E01AD24AD92A617B70709F0D2CD30 +:10728000B092DD2C8093DE2C0093DF2C1093E02C49 +:107290003093E12C9093E22CDF91CF911F910F91CD +:1072A000FF90EF90DF90CF90BF90AF909F907F9036 +:1072B0006F905F904F900895AF92BF92CF92DF9200 +:1072C000EF92FF920F931F93CF93DF936091DD2C8A +:1072D0005091DE2C2091DF2C4091E02C3091E12C5C +:1072E000D091E22CFC015C0104E0A00EB11C819164 +:1072F000C52FC071962F917EC927922F9072C927F2 +:10730000942F9479C927932F9377C9279D2F9A7328 +:10731000C9277C2F7295C7277C2F76957695C7272E +:10732000A32FB0E08D0100541E4D6801A42FB0E0E2 +:107330008D0100541F4D7801D6010C91D7019C910D +:10734000092BED2EF12CD701A054BD4D9C91092B9A +:1073500010E000561F4DD8017C9178277C27C695F8 +:107360007C2786957695279557956795C32FC0718D +:10737000942F917EC9279D2F9072C927962F9479BB +:10738000C927952F9377C927922F9A73C9277C2FE6 +:107390007295C7277C2F76957695C727052F10E025 +:1073A000D801A054BE4D6D01062F10E0D801A054A5 +:1073B000BF4D7D01D6010C91D7019C91092BE22E86 +:1073C000F12CD701A054BD4D9C91092B10E0005623 +:1073D0001F4DD8017C9178277C27C6957C27869500 +:1073E0009D2F7695979537954795C52FC071762F28 +:1073F000717EC727722F7072C727742F7479C727C1 +:10740000732F7377C727792F7A73C7277C2F7295CD +:10741000C7277C2F76957695C727032F10E0D801D4 +:10742000A054BE4D6D01042F10E0D801A054BF4DF3 +:107430007D01D6010C91D7017C91072BE92EF12C0F +:10744000D701A054BD4D7C91072B10E000561F4D75 +:10745000D8017C9178277C27C6957C2786957695E0 +:10746000279557956795C32FC071742F717EC727D5 +:10747000792F7072C727762F7479C727752F737786 +:10748000C727722F7A73C7277C2F7295C7277C2F47 +:1074900076957695C727052F10E0D801A054BE4DEC +:1074A0006D01062F10E0D801A054BF4D7D01D6011B +:1074B0000C91D7017C91072BE22EF12CD701A0541F +:1074C000BD4D7C91072B10E000561F4DD8017C91DB +:1074D00078277C27C6957C2786957695979537954E +:1074E0004795C52FC071762F717EC727722F707296 +:1074F000C727742F7479C727732F7377C727792FFE +:107500007A73C7277C2F7295C7277C2F769576953F +:10751000C727032F10E0D801A054BE4D6D01042FE2 +:1075200010E0D801A054BF4D7D01D6010C91D701C8 +:107530007C91072BE92EF12CD701A054BD4D7C91F5 +:10754000072B10E000561F4DD8017C9178277C272F +:10755000C6957C2786957695279557956795C32F71 +:10756000C071742F717EC727792F7072C727762F4D +:107570007479C727752F7377C727722F7A73C72738 +:107580007C2F7295C7277C2F76957695C727052F78 +:1075900010E0D801A054BE4D6D01062F10E0D801B7 +:1075A000A054BF4D7D01D6010C91D7017C91072BD2 +:1075B000E22EF12CD701A054BD4D7C91072B10E099 +:1075C00000561F4DD8017C9178277C27C6957C27D3 +:1075D00086957695979537954795C52FC071762FE7 +:1075E000717EC727722F7072C727742F7479C727CF +:1075F000732F7377C727792F7A73C7277C2F7295DC +:10760000C7277C2F76957695C727032F10E0D801E2 +:10761000A054BE4D6D01042F10E0D801A054BF4D01 +:107620007D01D6010C91D7017C91072BE92EF12C1D +:10763000D701A054BD4D7C91072B10E000561F4D83 +:10764000D8017C9178277C27C6957C27769527954D +:1076500057956795C32FC071742F717E7C27C92FF2 +:10766000C0727C27C62FC4797C27C52FC3777C279F +:10767000C22FCA737C27C72FC2957C27C72FC695F8 +:10768000C6957C278695C52FD0E0C054DE4D062FC9 +:1076900010E000541F4DD881D801CC91CD2B022F82 +:1076A00010E000541D4DD801DC91CD2BD0E0C05628 +:1076B000DF4DC8818C27872776958727D92F869518 +:1076C000D79537954795EA15FB0509F010CE6093DD +:1076D000DD2C5093DE2C2093DF2C4093E02C309354 +:1076E000E12CD093E22CDF91CF911F910F91FF906D +:1076F000EF90DF90CF90BF90AF900895CF93DF933E +:10770000EDEDFCE2A081718162813381248195815C +:10771000472F40718A2F817E8427462F407284270D +:10772000432F44798427422F43778427492F4A7374 +:107730008427482F42958427482F469546958427CD +:10774000482F46958427869567957795A795C22FEC +:10775000D0E0C054DE4D432F50E040545F4DB8811F +:10776000EA018881B82B492F50E040545D4DEA0171 +:107770008881CB2FC82BD0E0C05ADF4D88818695F9 +:10778000522F5071432F417E4527592F5072452764 +:107790005A2F54794527572F53774527562F5A7319 +:1077A0004527542F52954527542F569556954527D2 +:1077B000542F569545274695979527953795C72F6A +:1077C000D0E0C054DE4D4A2F50E040545F4DB881A8 +:1077D000EA014881B42B462F50E040545D4DEA0148 +:1077E0004881CB2FC42BD0E0C05ADF4D4881842B79 +:1077F0008695572F50714A2F417E4527562F50723C +:107800004527532F54794527522F53774527592F12 +:107810005A734527542F52954527542F5695569500 +:107820004527542F56954527469567957795A795F3 +:10783000C22FD0E0C054DE4D432F50E040545F4D86 +:10784000B881EA014881B42B492F50E040545D4D86 +:10785000EA014881CB2FC42BD0E0C05ADF4D4881CC +:10786000842B8695C72FD0E0C054DE4D4A2F50E0C0 +:1078700040545F4DB881EA014881B42B462F50E057 +:1078800040545D4DEA014881CB2FC42BD0E0C05A53 +:10789000DF4D4881842B522F5071432F417E452765 +:1078A000592F507245275A2F54794527572F537710 +:1078B0004527562F5A734527542F52954527542F45 +:1078C000569556954527542F569545274695979595 +:1078D00027953795A08371836283338324839583AF +:1078E000DF91CF9108950F931F93CF93DF93A091D2 +:1078F000DD2C7091DE2C2091DF2C5091E02C4091FA +:10790000E12C3091E22CFC01615008F4CDC1972F9D +:1079100090718A2F817E8927922F90728927952FC7 +:1079200094798927942F93778927932F9A7389279E +:10793000982F92958927982F969596958927982F15 +:1079400096958927869527957795A795C42FD0E09A +:10795000C054DE4D852F90E080549F4DB881EC01DE +:107960008881B82B832F90E080549D4DEC01888155 +:10797000CB2FC82BD0E0C058DF4DB881B695942FDF +:107980009071852F817E8927932F907289279A2F56 +:1079900094798927972F93778927922F9A7389272C +:1079A000982F92958927982F969596958927982FA5 +:1079B000969589278695379547955795C72FD0E097 +:1079C000C054DE4D8A2F90E080549F4D1881EC0109 +:1079D0008881182B822F90E080549D4DEC01888186 +:1079E000C12FC82BD0E0C058DF4D8881B82BB69589 +:1079F000972F90718A2F817E8927922F90728927E5 +:107A0000952F94798927942F93778927932F9A73A9 +:107A10008927982F92958927982F9695969589274B +:107A2000982F96958927869527957795A795C42FA2 +:107A3000D0E0C054DE4D852F90E080549F4D1881DA +:107A4000EC018881182B832F90E080549D4DEC0130 +:107A50008881C12FC82BD0E0C058DF4D8881B82B5A +:107A6000B695942F9071852F817E8927932F9072E0 +:107A700089279A2F94798927972F93778927922F8F +:107A80009A738927982F92958927982F969596957E +:107A90008927982F969589278695379547955795E5 +:107AA000C72FD0E0C054DE4D8A2F90E080549F4D08 +:107AB0001881EC018881182B822F90E080549D4D15 +:107AC000EC018881C12FC82BD0E0C058DF4D8881E0 +:107AD000B82BB695972F90718A2F817E8927922F88 +:107AE00090728927952F94798927942F93778927E6 +:107AF000932F9A738927982F92958927982F969577 +:107B000096958927982F9695892786952795779515 +:107B1000A795C42FD0E0C054DE4D852F90E080544F +:107B20009F4D1881EC018881182B832F90E08054A1 +:107B30009D4DEC018881C12FC82BD0E0C058DF4D8E +:107B40008881B82BB695942F9071852F817E9827C8 +:107B5000832F807298278A2F84799827872F83779D +:107B60009827822F8A739827892F82959827892FA3 +:107B7000869586959827892F86959827832F9695A1 +:107B8000879547955795C72FD0E0C054DE4D0A2FF3 +:107B900010E000541F4D3881E8019881392B022FE5 +:107BA00010E000541D4DE8019881C32FC92BD0E08F +:107BB000C058DF4D3881B32BB695372F30719A2FCF +:107BC000917E9327322F30729327352F3479932764 +:107BD000342F33779327382F3A739327392F3295E1 +:107BE0009327392F369536959327392F3695932736 +:107BF000969527957795A795C42FD0E0C054DE4D74 +:107C0000052F10E000541F4D3881E8019881392B71 +:107C1000082F10E000541D4DE8019881C32FC92B97 +:107C2000D0E0C058DF4D98813B2F392B3695C72FB8 +:107C3000D0E0C054DE4D0A2F10E000541F4DB88133 +:107C4000E8019881B92B022F10E000541D4DE80186 +:107C50009881CB2FC92BD0E0C058DF4DB881B32B12 +:107C6000342F3071952F917E9327382F30729327C0 +:107C70003A2F34799327372F33779327322F3A735C +:107C80009327392F32959327392F36953695932799 +:107C9000392F36959327382F9695379547955795D1 +:107CA00080818B27819330CEA093DD2C7093DE2CC6 +:107CB0002093DF2C5093E02C4093E12C3093E22C66 +:107CC000DF91CF911F910F910895CF92DF92EF92A4 +:107CD000FF921F93CF93DF931091DD2CD091DE2C78 +:107CE000C091DF2C7091E02C4091E12C2091E22C8E +:107CF000E42FF0E0E054FE4DA72FB0E0A054BF4DBC +:107D0000E0813C91E32BA22FB0E0A054BD4D3C910B +:107D1000E32BF0E0E056FF4D3081DC0180E0615064 +:107D200008F405C2582F369557959D2F9071812FD5 +:107D3000817E89279C2F90728927972F9479892794 +:107D4000942F93778927322F3A738327982F929510 +:107D50008927982F969596958927982F9695892704 +:107D60009C2F86959795D79517955695342F3071FA +:107D7000872F817E8327322F30728327312F3479EA +:107D800083273D2F33778327392F3A738327382F63 +:107D900032958327382F369536958327382F369599 +:107DA00083278695279547957795CD2ED12CF6017B +:107DB000E054FE4D6F01E12EF12CF701E054FF4D30 +:107DC0007F01F6013081F7018081832BE92EF12CB0 +:107DD000F701E054FD4D3081E82FE32BF0E0E0584F +:107DE000FF4D8081582B56953D2F3071812F817E1C +:107DF0008327392F30728327372F34798327342F05 +:107E000033778327322F3A738327382F329583278E +:107E1000382F369536958327382F369583278695C4 +:107E20009795D7951795C42ED12CF601E054FE4DA9 +:107E30006F01E72EF12CF701E054FF4D7F01F601B1 +:107E40003081F7018081832BE22EF12CF701E05481 +:107E5000FD4D3081E82FE32BF0E0E058FF4DC0816D +:107E60005C2B5695342F3071872F817E8327322FDC +:107E700030728327312F347983273D2F337783273F +:107E8000392F3A738327382F32958327382F369529 +:107E900036958327382F36958327869527954795DE +:107EA0007795CD2ED12CF601E054FE4D6F01E12ED9 +:107EB000F12CF701E054FF4D7F01F6013081F7010D +:107EC0008081832BE92EF12CF701E054FD4D3081A8 +:107ED000E82FE32BF0E0E058FF4DC081C52BC6959D +:107EE0003D2F3071812F817E8327392F3072832778 +:107EF000372F34798327342F33778327322F3A7300 +:107F00008327382F32958327382F36953695832748 +:107F1000382F3695832786959795D7951795C42E34 +:107F2000D12CF601E054FE4D6F01E72EF12CF70144 +:107F3000E054FF4D7F01F6013081F7018081382B3D +:107F4000E22EF12CF701E054FD4D8081E32FE82B68 +:107F5000F0E0E058FF4D8081C82BC695342F30717A +:107F6000872F817E8327322F30728327312F3479F8 +:107F700083273D2F33778327392F3A738327382F71 +:107F800032958327382F369536958327382F3695A7 +:107F90008327542F8695279557957795CD2ED12CED +:107FA000F601E054FE4D6F01E12EF12CF701E05493 +:107FB000FF4D7F01F6013081F7018081832BE92E8F +:107FC000F12CF701E054FD4D3081E82FE32BF0E078 +:107FD000E058FF4D80818C2B482F46953D2F307106 +:107FE000812F817E3827892F80723827872F8479C7 +:107FF0003827852F83773827822F8A733827832F56 +:1080000082953827832F869586953827832F8695E6 +:108010003827C92F3695C795D7951795E52FF0E0E6 +:10802000E054FE4D872F90E080549F4D3081FC013D +:108030008081382B822F90E080549D4DFC019081EF +:10804000E32FE92BF0E0E058FF4D9081842F892B3E +:10805000382F3695ED2FF0E0CF0180549E4D6C0106 +:10806000E12FF0E0CF0180549F4DF6014081FC01EB +:108070009081492BEC2EF12CC70180549D4DFC01C1 +:108080009081E42FE92BF0E0E058FF4D9081832FA1 +:10809000892B352F3071972F917E3927922F90722F +:1080A0003927912F947939279D2F937739274C2F92 +:1080B0004A733427932F92953927932F9695969547 +:1080C0003927932F96953927452F3695279547952C +:1080D0007795C42ED12CF601E054FE4D6F01E72EAA +:1080E000F12CF701E054FF4D7F01F6013081F701DB +:1080F0009081392BE22EF12CF701E054FD4D908157 +:10810000E32FE92BF0E0E056FF4D30819C91E92F01 +:10811000F0E0EC59FB4FE4917D01F0E8EF0EF11C2B +:108120005E2F5327F701508398279D93F8CD109326 +:10813000DD2CD093DE2CC093DF2C7093E02C409389 +:10814000E12C2093E22CDF91CF911F91FF90EF90D3 +:10815000DF90CF9008950F931F93FC01862F90819D +:108160002181428150E060E070E0BA015527442748 +:10817000522B492B9381792B8B0122273327803275 +:1081800008F471C0D80123E0B695A7952A95E1F7C8 +:108190000A271B2798013695279536952795BBE02A +:1081A0007695679557954795BA95D1F70227132786 +:1081B00020E030E095E1000F111F221F331F9A9538 +:1081C000D1F7402B512B622B732B8B0122273327A6 +:1081D000D80133E0B695A7953A95E1F70A271B2712 +:1081E00098013695279536952795BBE07695679546 +:1081F00057954795BA95D1F70227132720E030E02D +:1082000095E1000F111F221F331F9A95D1F7402BC4 +:10821000512B622B732B8B0122273327D80133E09C +:10822000B695A7953A95E1F70A271B279801369549 +:10823000279536952795BAE0769567955795479592 +:10824000BA95D1F70227132720E030E096E1000F1E +:10825000111F221F331F9A95D1F7402B512B622BF0 +:10826000732B805289CF40835183028373831F9184 +:108270000F910895AF92BF92CF92DF92EF92FF924B +:108280000F931F93CF93DF936730710509F451C0AB +:108290009B0127703327232B09F04EC0EB016C01A3 +:1082A0005B0183E0B694A7948A95E1F77B0196E0A1 +:1082B000F694E7949A95E1F7EA0CFB1CEC0CFD1C94 +:1082C0008501015011090C0D1D1DA701401B510B0B +:1082D00060E070E0C80101960E9455530C151D0521 +:1082E00020F1D801EC91F0E0EC59FB4F449197015B +:1082F000D7010A171B0768F48C91982F990FF90181 +:1083000082919F01881F8827881F892B8C93119742 +:10831000F0CF11968C9111978E7FE42FE170E82BAE +:108320001196EC9301501109D9CFC5018C0F9D1FF7 +:1083300004C087E090E001C0CB01DF91CF911F9195 +:108340000F91FF90EF90DF90CF90BF90AF90089586 +:10835000EF92FF920F931F93CF93DF93EC01CB012A +:1083600067307105D1F169E070E00E948552DE014D +:1083700020E030E088E090E02617370739F1F90176 +:1083800043E0F695E7954A95E1F7E20FF31FEC0F0E +:10839000FD1F408150E0890107701127002E02C0A7 +:1083A000559547950A94E2F74C930115110551F044 +:1083B000E1817C01E01AF10A01C0EE0FEA94EAF7CC +:1083C0004E2B4C932F5F3F4F1196D6CFC90123E020 +:1083D000880F991F2A95E1F702C087E090E0DF91AE +:1083E000CF911F910F91FF90EF900895CF93DF935E +:1083F000FC016115710511F18081869580839B01D7 +:10840000295F3F4F83E0369527958A95E1F7DF0195 +:1084100041E050E04217530770F4C1919081D0E8D9 +:108420009D9FC00111248C2B8D9380818695808324 +:108430004F5F5F4FEFCFCB01019702C080E090E02C +:10844000DF91CF910895EF92FF920F931F93CF93F7 +:10845000DF93EC01CB016730710509F442C069E09C +:1084600070E00E94855220E030E088E090E026171E +:108470003707B9F1D90143E0B695A7954A95E1F7D9 +:10848000A20FB31FA90147705527AC0FBD1FEC9178 +:10849000F0E0042E02C0F595E7950A94E2F7411545 +:1084A000510559F011960C9111977C01E41AF50AC7 +:1084B00001C0000FEA94EAF7E02BF0E0EC59FB4F23 +:1084C000E4911196AC91B0E08D0102C0159507952D +:1084D0004A95E2F7A8014E2740FD05C02F5F3F4FA8 +:1084E000C6CF81E001C080E0DF91CF911F910F9155 +:1084F000FF90EF9008951092432D08951092432D10 +:108500001092E32C1092442D0895F8DF0E948429E4 +:108510001092432D089508950895DC0123E633E673 +:108520006150E8F04D91942F922780E1989FA0012F +:1085300011244927E42FF0E042954F70232F332771 +:10854000C9018427AC013E2F22272427352743E089 +:10855000EE0FFF1F4A95E1F72E273F27E1CFC90114 +:1085600008958F929F92AF92BF92CF92DF92EF9237 +:10857000FF920F931F93CF93DF93CDB7DEB7C15414 +:10858000D240CDBFDEBF8C016B018091E32C8330E4 +:1085900009F440C138F4813069F0823009F4B5C083 +:1085A0000C94124B843009F4B3C2853009F4D8C45A +:1085B0000C94124BE090452EF090462EE114F104FD +:1085C000C1F0A701495F5F4F23E0569547952A9573 +:1085D000E1F765E47DE2C8010E943B536091452EBE +:1085E0007091462EC80146DE1092452E1092462EFE +:1085F000B5C46115710509F4AAC0C801F7DE5C01B4 +:10860000BC01C80120DFD82EB501C801A1DE5C0184 +:108610009C01295F3F4FA901440F551F93E05695D8 +:1086200047959A95E1F74A5F5F4F4138510538F019 +:1086300060EC73E2CE0101960E94675391C0A3E003 +:1086400036952795AA95E1F7A80160E870E0CE017C +:1086500001960E94BB0D8C01CF5FDD4FB882C150E7 +:10866000D240CE5FDD4FA882C250D24083E694E272 +:108670009F938F93B0E8AB2EB12CC501801B910B5B +:108680009F938F9381E090E08C0F9D1F800F911F2F +:108690009F938F930E946E53080F191FB501601BA3 +:1086A000710B22E030E0AE014F5F5D4F81E090E062 +:1086B0008C0F9D1F800F911F0E94BB0D800F911F7B +:1086C0000F900F900F900F900F900F90A501481BE7 +:1086D000590B21E030E02C0F3D1F280F391FD1101E +:1086E00003C08FEC93E202C08EED93E29F938F93D1 +:1086F0005F934F933F932F930E946E530F900F9071 +:108700000F900F900F900F902BC0E090452EF0909F +:10871000462EE114F104C1F0A701495F5F4FF3E079 +:1087200056954795FA95E1F765E47DE2C8010E9408 +:108730003B539091452E8091462E1092452E1092DB +:10874000462EE92EF82E70C76115710591F488E068 +:10875000E9E7F4E2DE01119601900D928A95E1F7C6 +:108760001092E32CBE016F5F7F4F85E60E947C2153 +:108770005BC79B01295F3F4F73E0369527957A953C +:10878000E1F7A80160E870E0CE0101960E94BB0D00 +:108790008C01CF5FDD4FD882C150D240CE5FDD4F1C +:1087A000C882C250D24083E694E29F938F93E0E860 +:1087B000CE2ED12CC601801B910B9F938F9381E00D +:1087C00090E08C0F9D1F800F911F9F938F930E94AD +:1087D0006E53800F911FB601681B790B22E030E0C9 +:1087E000AE014F5F5D4FA1E0B0E0AC0FBD1F8A0F3F +:1087F0009B1F0E94BB0D1092E32CBE016F5F7F4F49 +:1088000085E60E947C210F900F900F900F900F90A3 +:108810000F900AC78091442DB090432D882331F0EA +:10882000B1E0BB1508F455C11092442DE5E0EB15FD +:10883000B8F0F3E0BF1608F040C021E02B15C8F0F7 +:1088400081E090E0809320209093212082E5D80160 +:108850008C9382E08093432D67E0E62EF12C3BC1A0 +:1088600038E03B1508F0A8C08AE0B81609F4F5C056 +:1088700030C1B3E1CB16D10408F4B9C0B601C801C8 +:10888000B5DD7C01BC01C801DEDD882319F1B7012B +:10889000C8015EDDF801818190E0982F8827208152 +:1088A000822B8093352D9093362D83E9808380E24F +:1088B000818383E08093432DBCC0B601C80196DD5F +:1088C0007C01BC01C801BFDD882321F0F8E0EF1670 +:1088D000F10488F41092432DC701089667E070E018 +:1088E0000E948552462FE0915F2EF091602EB801D4 +:1088F00081EC1995B8C0B701C8012ADDD8012C91C7 +:1089000011968C911197822712969C911297892724 +:1089100013969C911397892714969C911497891309 +:1089200066C08B2D90E00397283881F49C01220FBC +:10893000331F820F931FFC01E85CF24D11962D91BD +:108940003D914C9120833183428312C0FC01EE0F94 +:10895000FF1F8E0F9F1F9C01285C324DF801808104 +:108960009181A281B381F90180839183A283B38332 +:1089700045E050E0B801C80102960E944453F3E07C +:10898000BF1629F024E0B21621F087E903C083E97D +:1089900001C085E9D8018C9380E711968C9367E03C +:1089A000C801BBDDF8018783908783E08B0D80933E +:1089B000432D68E470E089C0F9E0CF16D104B8F027 +:1089C000B601C80113DD7C01BC01C8013CDD811189 +:1089D00011C0C701089667E070E00E948552462FDB +:1089E000E0915F2EF091602EB80181EC1995109204 +:1089F000432D39C0B701C801ABDC63E0C8018DDD90 +:108A00007C01892BA1F7D8018C9182FF15C0B8E0B9 +:108A1000BB1691F0E6E0BE1611F087E901C085E9CA +:108A2000D8018C9380E211968C93BA94BA94B09248 +:108A3000432D60E170E049C081E08093442D8B2D8F +:108A400090E00697B82EBB0C8B0D8C5F8093422D67 +:108A5000F80180818093372D3EC0C114D10431F4D8 +:108A600081E08093432D0E947E2933C0B601C80166 +:108A7000BDDC7C01BC01C801E6DC81110FC0C7016F +:108A8000089667E070E00E948552462FE0915F2EC5 +:108A9000F091602EB80181EC199508C0B701C801AA +:108AA00057DC63E0C80139DD892BD1F282ECD801B3 +:108AB0008C9361E0C80131DDF80181839283B0922B +:108AC000432D1092442D68E170E0C801D3DB7C0196 +:108AD00002C0E12CF12C8091442D882309F4A4C517 +:108AE0002091422D30E048E35DE264E170E0CE0188 +:108AF00001960E94BB0DBE016F5F7F4F85E60E940D +:108B00007C211092442D1092E32C0E9413228AC5DE +:108B10008091442DB090432D882331F0F1E0FB1576 +:108B200008F451C11092442D25E02B15B8F033E024 +:108B3000B31608F043C081E08B15C8F081E090E0E7 +:108B4000809320209093212082E5F801808382E0A9 +:108B50008093432DE7E0EE2EF12C37C1A8E0AB1552 +:108B600008F0A4C0BAE0BB1609F4F1C02CC1F3E1CF +:108B7000CF16D10408F4B5C0B601C80137DC7C01BA +:108B8000BC01C80160DC882331F1B701C801E0DB1A +:108B9000D80111968C91119790E0982F88272C91ED +:108BA000822B8093352D9093362D83E98C9380E230 +:108BB00011968C9383E08093432DB5C0B601C80114 +:108BC00015DC7C01BC01C8013EDC882321F0B8E043 +:108BD000EB16F10488F41092432DC701089667E064 +:108BE00070E00E948552462FE0915F2EF091602E3A +:108BF000B80181EC1995B1C0B701C801A9DBF80132 +:108C0000208181818227928189279381892794817C +:108C1000891367C08B2D90E00397283889F49C0155 +:108C2000220F331F820F931FFC01E85CF24DD80125 +:108C300011962D913D914C9120833183428312C036 +:108C4000FC01EE0FFF1F8E0F9F1F9C01285C324D11 +:108C5000F80180819181A281B381F90180839183A0 +:108C6000A283B38345E050E0B801C80102960E9498 +:108C70004453F3E0BF1629F024E0B21621F087E94F +:108C800003C083E901C085E9D8018C9380E7119680 +:108C90008C9367E0C80141DCF8018783908783E00B +:108CA0008B0D8093432D68E470E089C0F9E0CF1606 +:108CB000D104B8F0B601C80199DB7C01BC01C80140 +:108CC000C2DB811111C0C701089667E070E00E9405 +:108CD0008552462FE0915F2EF091602EB80181EC15 +:108CE00019951092432D39C0B701C80131DB63E0FB +:108CF000C80113DC7C01892BA1F7D8018C9182FF7C +:108D000015C0B8E0BB1691F0E6E0BE1611F087E999 +:108D100001C085E9D8018C9380E211968C93BA94B6 +:108D2000BA94B092432D60E170E049C081E0809335 +:108D3000442D8B2D90E00697B82EBB0C8B0D8C5FCD +:108D40008093422DF80180818093372D3EC0C1145D +:108D5000D10431F481E08093432D0E947E2933C0F9 +:108D6000B601C80143DB7C01BC01C8016CDB811189 +:108D70000FC0C701089667E070E00E948552462F39 +:108D8000E0915F2EF091602EB80181EC199508C03A +:108D9000B701C801DDDA63E0C801BFDB892BD1F27E +:108DA00082ECD8018C9361E0C801B7DBF8018183C4 +:108DB0009283B092432D1092442D68E170E0C80177 +:108DC00059DA7C0102C0E12CF12C8091442D8823DA +:108DD00009F42AC4F090242DFF20A9F1B601C8019E +:108DE00005DB5C01009729F41092242D1092442D8C +:108DF00042C0823A910540F0BC01C80124DB91E0F9 +:108E00008927C82ED12C03C0CC24C394D12CB50102 +:108E1000C8019EDACD2829F462E1C8017EDB892BE6 +:108E200029F0ACEFAF0DA093242D2AC024E0F29ED0 +:108E3000D0011124AC52B34D80E1F80101900D92A4 +:108E40008A95E1F71DC042E050E06BE371E1CE018D +:108E500001960E940D53EEE3F1E1E4912091352D4E +:108E60003091362D89819A812817390721F4809114 +:108E7000372D8E1729F01092432D0E947E29D2C3E0 +:108E80002091242D203109F04DC01092442D1092D4 +:108E9000242D1092E32C20E130E044EE5CE267E800 +:108EA00070E0CE0101960E94BB0D63E674E2CE0134 +:108EB00081960E94675320E130E044EF5CE265E672 +:108EC00070E0CE0183960E94BB0D63E674E2CE0192 +:108ED0008D5B9F4F0E94675320E130E044E05DE2EC +:108EE00063E470E0CE018B5B9F4F0E94BB0D63E695 +:108EF00074E2CE018B599F4F0E94675320E130E00E +:108F000044E15DE261E270E0CE0189599F4F0E9429 +:108F1000BB0D0E941322BE016F5F7F4F85E60E944A +:108F20007C2180C380E3D8018C9311962C9362E05E +:108F3000C801CF5BDD4F2883C154D240EEDAF8017F +:108F400082839383CF5BDD4F2881C154D2402C5F55 +:108F50002093242D60E270E0C8018CD97C0164C3A9 +:108F60008091442DB090432D882331F0F1E0FB1522 +:108F700008F451C11092442D25E02B15B8F033E0D0 +:108F8000B31608F043C081E08B15C8F081E090E093 +:108F9000809320209093212082E5F801808382E055 +:108FA0008093432D37E0E32EF12C37C1A8E0AB15B9 +:108FB00008F0A4C0BAE0BB1609F4F1C02CC1F3E17B +:108FC000CF16D10408F4B5C0B601C8010FDA7C0190 +:108FD000BC01C80138DA882331F1B701C801B8D91A +:108FE000D80111968C91119790E0982F88272C9199 +:108FF000822B8093352D9093362D83E98C9380E2DC +:1090000011968C9383E08093432DB5C0B601C801BF +:10901000EDD97C01BC01C80116DA882321F0B8E043 +:10902000EB16F10488F41092432DC701089667E00F +:1090300070E00E948552462FE0915F2EF091602EE5 +:10904000B80181EC1995B1C0B701C80181D9F80107 +:109050002081818182279281892793818927948128 +:10906000891367C08B2D90E00397283889F49C0101 +:10907000220F331F820F931FFC01E85CF24DD801D1 +:1090800011962D913D914C9120833183428312C0E2 +:10909000FC01EE0FFF1F8E0F9F1F9C01285C324DBD +:1090A000F80180819181A281B381F901808391834C +:1090B000A283B38345E050E0B801C80102960E9444 +:1090C0004453F3E0BF1629F024E0B21621F087E9FB +:1090D00003C083E901C085E9D8018C9380E711962C +:1090E0008C9367E0C80119DAF8018783908783E0E1 +:1090F0008B0D8093432D68E470E089C0F9E0CF16B2 +:10910000D104B8F0B601C80171D97C01BC01C80115 +:109110009AD9811111C0C701089667E070E00E94DA +:109120008552462FE0915F2EF091602EB80181ECC0 +:1091300019951092432D39C0B701C80109D963E0D0 +:10914000C801EBD97C01892BA1F7D8018C9182FF52 +:1091500015C0B8E0BB1691F0E6E0BE1611F087E945 +:1091600001C085E9D8018C9380E211968C93BA9462 +:10917000BA94B092432D60E170E049C081E08093E1 +:10918000442D8B2D90E00697B82EBB0C8B0D8C5F79 +:109190008093422DF80180818093372D3EC0C11409 +:1091A000D10431F481E08093432D0E947E2933C0A5 +:1091B000B601C8011BD97C01BC01C80144D9811189 +:1091C0000FC0C701089667E070E00E948552462FE5 +:1091D000E0915F2EF091602EB80181EC199508C0E6 +:1091E000B701C801B5D863E0C80197D9892BD1F27E +:1091F00082ECD8018C9361E0C8018FD9F80181839A +:109200009283B092432D1092442D68E170E0C80122 +:1092100031D87C0102C0E12CF12C8091442D8823AF +:1092200009F402C28091432D9AEF980F933008F011 +:109230004EC0D801FC90F5FAFF24F0F81092252DCD +:10924000E6E0AE2EE0E1BE2EE12C47E650E0B501AF +:10925000CE0101960E940D538B81882349F029810C +:109260003A818091352D9091362D28173907B9F420 +:109270008D81882329F09C818091372D98130FC010 +:109280008F89882311F0FF2051F0E091252D81E096 +:109290008E0F8093252DF0E0EA5DF24DE082E3949D +:1092A000B7E6AB0EB11CEFE0EE12CFCFFF2009F412 +:1092B00093C080EED8018C9380E811968C9362E085 +:1092C000C8012BD9F8018283938389E0A6C0893035 +:1092D00009F082C0B601C80189D87C01BC01C8016F +:1092E000B2D881110FC0C701089667E070E00E94F4 +:1092F0008552462FE0915F2EF091602EB80181ECEF +:109300001995BEC0B701C80123D86C01D8016C9172 +:10931000262F30E073E0969587957A95E1F70297CE +:109320002817390729F46E5FC801F7D8892B69F02F +:1093300082ECF801808361E0C801EFD8D801119672 +:109340008C93119712969C93A4C0F12C67E6E62E9D +:109350005801FFEFAF1ABF0A8091252DF816E0F5EE +:10936000EF2DF0E0EA5DF24D6081E69EB001112440 +:109370006A5F7F4E47E650E0CE0101960E940D5392 +:109380008F89882339F14E8950E0F801808190E07F +:1093900001974817590739F4B501CE0106960E9486 +:1093A0002E53892BB9F02091252D422F50E04150AA +:1093B00051093F2D832F90E0841795073CF4FC0161 +:1093C000EA5DF24D818180833F5FF4CF215020938D +:1093D000252DFA94F394C0CF8091432D9AEF980FE6 +:1093E0009430F0F49091252D26E23DE2F9018E2F84 +:1093F000821B891708F069C0819184508230B8F7C8 +:1094000082E0D8018C9380E611968C9362E0C801CB +:1094100084D8F801828393838BE08093432D9ACD87 +:109420008B3009F052C0C114D10409F44CC0B6010C +:10943000C8010E94F6417C01BC01C80104D8811119 +:109440000FC0C701089667E070E00E948552462F62 +:10945000E0915F2EF091602EB80181EC19950EC05D +:10946000B701C8010E94A84153E0969587955A9587 +:10947000E1F7682FC80151D8892B99F01092252D5A +:1094800082ECD8018C9361E0C80147D8F801818350 +:1094900092838AE08093432D1092442D68E170E01E +:1094A0005BCDD80115968C91882331F0813059F429 +:1094B0008093252D85E004C081E08093252D84E0F4 +:1094C0008093262D02C01092252D8091252D81118B +:1094D00003C06AEE73E213C08130A9F46091262DB7 +:1094E000B7E66B9FB0011124635D7F4E40E450E00E +:1094F000CE0101960E940D53BE016F5F7F4F85E63E +:109500000E947C2168C0912C80E090E000E010E097 +:1095100027E6822E7E013FEFE31A3DEFF30A3DEF8F +:10952000C32E33E2D32EA12C42E0B42E2091252D60 +:10953000921680F50130E2E01E0720F0081B190B9F +:10954000F12C2EC0E92DF0E0EA5DF24D6081869E9F +:10955000B0011124635D7F4E40E450E0C7010E94DA +:109560000D53FF92EF92DF92CF92C501801B910BBA +:109570009F938F9381E090E08C0F9D1F800F911F30 +:109580009F938F930E946E53080F191F9394CDBF22 +:10959000DEBFCCCF0130A2E01A0780F6FF24F3949F +:1095A000EDEFFFEFEC0FFD1FE00FF11F8EE2808368 +:1095B000EEEFFFEFEC0FFD1FE00FF11F1082BE0179 +:1095C0006F5F7F4F85E60E947C21F11004C084E02C +:1095D00094E20E941B1886E694E20E941B1862E047 +:1095E00070E085E39DE20E949A218DE694E20E945C +:1095F0001B186091422D70E088E39DE20E949A2141 +:1096000083E794E20E941B1861E070E087E39DE22B +:109610000E949A211092E32C1092252D0E94132271 +:109620001092442DE12CF12CC701CF5BDD4FCDBF53 +:10963000DEBFDF91CF911F910F91FF90EF90DF90F0 +:10964000CF90BF90AF909F908F900895FF920F930F +:109650001F93CF93DF93CDB7DEB7EA97CDBFDEBFC1 +:1096600009EB11E388E0F82EF00E91D2F801819316 +:109670008F01FE12FACF0E94CF1804D3882309F479 +:10968000F7C08091B9319091BA31953009F46FC02B +:1096900030F4913069F168F0933051F1E9C09830BD +:1096A00009F4C2C0993009F4C8C0963009F0E0C08E +:1096B00072C0803891F0823809F0DAC08091BD31F3 +:1096C0008F7085D2E091C331F091C431118112FBCA +:1096D000112710F980E07BD206C01091B53180913E +:1096E000B63181111260E8D2812F61D280E0A1C031 +:1096F000282F2D7F09F0BCC0882319F0823061F03B +:10970000B7C08091BB31813009F0B2C0933009F00D +:1097100080E08093B63127C08091BB31811123C096 +:10972000E091BD311E2F1F7009F4A2C0812F4FD2CE +:109730008091BA31833011F4EBD215C0E091C3317E +:10974000F091C43181818B7F818324E8129FF001E5 +:109750001124E95FFD4C1082E091C331F091C431D6 +:1097600080818E7F808380E032D2A6D264C0811156 +:109770007FC01091BB311F779FD2A1D35DD28823C8 +:10978000E9F31093C304111102C082E001C083E029 +:109790008093B8316DC08058823008F069C08091E4 +:1097A000BB319091BC318C3DE3E09E0761F583E0D5 +:1097B0008A838AE389834FB7F894DE01139620E009 +:1097C00038E052E05093CA01E32FF0E0E4911092A8 +:1097D000CA0120FF03C0E295EF703F5FEF708E2F4C +:1097E00090E0EA3010F0C79601C0C0968D939D932B +:1097F0002F5F2C3139F74FBF5FD26AE370E0CE01A3 +:109800000196A3D00FC0AE014F5F5F4F6091BD3195 +:109810000E94270C8C01892B59F14ED2B801898105 +:109820009A810FD1A5D124C0803811F545D28091FD +:10983000B431BDD184D143D31BC0811119C08091F3 +:10984000BB318230A8F438D28091BB318093B431DF +:1098500036D38091B431811106C08091C304811147 +:1098600002C081E001C084E08093B8310E94CB182F +:1098700009D2882311F020D24BD2EA96CDBFDEBFA9 +:10988000DF91CF911F910F91FF9008950895CF938D +:109890008091B831882351F0C091C53180E097D1D3 +:1098A000F1D18111D3DE8C2FCF9191C1CF91089549 +:1098B000CF92DF92EF92FF920F931F93CF93DF939C +:1098C000EC018B017A0111D3811136C0E114F1044E +:1098D00039F0F70180819181081B190BC80FD91F3E +:1098E000C12CD12C0115110531F18091C13190911C +:1098F000C231FC01EF5BFF4F208131978081281737 +:1099000090F01DD1C4DFE114F10449F0F70180812A +:109910009181C80ED91EC082D18285E00DC0E5D2EA +:10992000882301F309C0899142D101501109FFEF49 +:10993000CF1ADF0AD7CF80E0DF91CF911F910F912F +:10994000FF90EF90DF90CF900895DF92EF92FF921B +:109950000F931F93CF93DF93D82FC92F8B01809143 +:10996000C531806834D12091BF313091C03120178A +:10997000310728F00115110519F4E1D001C0890162 +:10998000ED2EFC2ED12C0115110509F440C080915B +:10999000B831811102C082E04CC0853011F483E0FF +:1099A00048C070D1882311F081E043C051D18111AA +:1099B0003CC042D1882339F32091C5318091C13117 +:1099C0009091C231FC0127FF05C0EF5BFF4FC081C2 +:1099D000D0E013C0E05CFF4FC08131968081D0E0C1 +:1099E000C81BD1090AC0C830D10550F4F7018191D4 +:1099F0007F01DDD00150110921960115110599F75C +:109A0000DD24D394289709F0D12C99D0BCCFD11064 +:109A1000BECF0BC08091B831882309F4BCCF85300C +:109A200009F4BDCF2FD18111BFCF12D1882391F37B +:109A300080E0DF91CF911F910F91FF90EF90DF9029 +:109A40000895DF92EF92FF920F931F93CF93DF93CE +:109A5000D82FC92F8B018091C5318068B8D0209153 +:109A6000BF313091C0312017310728F001151105A1 +:109A700019F465D001C08901ED2EFC2ED12C011501 +:109A8000110509F442C08091B831811102C082E011 +:109A90004EC0853011F483E04AC0F4D0882311F021 +:109AA00081E045C0D5D081113EC0C6D0882339F3AE +:109AB0002091C5318091C1319091C231FC0127FFC5 +:109AC00005C0EF5BFF4FC081D0E015C0E05CFF4FE9 +:109AD000C08131968081D0E0C81BD1090CC0C8304C +:109AE000D10560F4F701849162D0FFEFEF1AFF0A0D +:109AF0000150110921960115110589F7DD24D39430 +:109B0000289709F0D12C1BD0BACFD110BCCF0BC0F5 +:109B10008091B831882309F4BACF853009F4BBCFDE +:109B2000B1D08111BDCF94D0882391F380E0DF9133 +:109B3000CF911F910F91FF90EF90DF900895E091EA +:109B4000C331F091C431A091C131B091C231AF5B4A +:109B5000BF4F8C9190E08283938380818D79808345 +:109B6000E091C131F091C231EF5BFF4F1082089557 +:109B7000E091C331F091C43180818D798083E0918F +:109B8000C131F091C231EF5BFF4F10820895809197 +:109B9000C1319091C231FC01EF5BFF4F208131E078 +:109BA000320F3083FC01E20FF11D80810895209176 +:109BB000C1313091C231F901EF5BFF4F908141E03B +:109BC000490F4083F901E90FF11D808308958093C7 +:109BD000C531482F4F7050E06091C6047091C704A2 +:109BE0009A0194E0220F331F9A95E1F7E4E887FF8A +:109BF00011C0E49FC001E59F900D1124885F9D4C2A +:109C00008093C1319093C231C90108969B01280FFE +:109C1000391F0DC0E49FC001E59F900D11248A53A8 +:109C20009E4C8093C1319093C231260F371F2093F1 +:109C3000C3313093C43108958091C5318068C7DF46 +:109C4000E091C331F091C43180818695817008958F +:109C50008091C5318F77BBDFA091C331B091C43102 +:109C60008C9185FF0DC0E091C131F091C231129607 +:109C70008D919C911397E05CFF4F808381E0089564 +:109C800080E008958091C5318F77A1DFA091C33125 +:109C9000B091C4318C9184FF0DC0E091C131F0913D +:109CA000C23112968D919C911397E05CFF4F808397 +:109CB00081E0089580E008958091C5318F7787DF36 +:109CC000E091C331F091C43180818D788083E0913F +:109CD000C331F091C431808181608083E091C131D2 +:109CE000F091C231EF5BFF4F10828091C5318068E7 +:109CF0006EDFE091C331F091C43180818160808357 +:109D0000E091C131F091C231EF5BFF4F10820895B5 +:109D1000E091C331F091C431818184608183E0910D +:109D2000C331F091C4318181807C803459F48091B9 +:109D3000C53180584CDFE091C331F091C43181814D +:109D40008460818308951F93CF93DF931F921F92A6 +:109D5000CDB7DEB7182F4A83698339DFE091C3316D +:109D6000F091C4311182E091C331F091C431812F5F +:109D7000881F8827881F880F8083E091C331F09166 +:109D8000C43169816183E091C331F091C4311282A1 +:109D900013822091C1313091C23124833583110F58 +:109DA000110B4A814123F901E05CFF4F408331965A +:109DB000108281E00F900F90DF91CF911F91089555 +:109DC000AF92BF92CF92DF92EF92FF920F931F93C9 +:109DD000CF93DF93A62E8C017C0184E0E80EF11C6A +:109DE000B12CBA1409F443C0F801D081DD23C1F1CC +:109DF000C180D280F70131978081F7019081923044 +:109E000010F498E001C098E128E030E0C0E02C15A3 +:109E10003D0520F4CF5F220F331FF9CFC92B9D2FB3 +:109E20009F70963010F080E023C0CF7EF1E4CF1613 +:109E3000D104C8F7882321F0813021F4C06C0AC016 +:109E4000C06403C0C068811105C04C2D6C2F80E830 +:109E50008D0F79DF4C2D6C2F8D2F75DF882319F333 +:109E6000B3940B5F1F4F85E0E80EF11CBACF81E081 +:109E7000DF91CF911F910F91FF90EF90DF90CF90E6 +:109E8000BF90AF90089580E090E0E091C604F0911B +:109E9000C7049C0144E0220F331F4A95E1F7E20F0B +:109EA000F31F11864091C6045091C704FA01E20FD6 +:109EB000F31F118201968630910539F7089580913C +:109EC000B93187FF0DC0C4DE811105C08091B83162 +:109ED0008111F9CF09C04CCE8091B831882321F08F +:109EE000ABDE8823C9F32BCE08950F931F93CF9336 +:109EF000E091C604F091C704E05AFF4F0081118140 +:109F0000C4E68091C53187FF0AC096DE811105C085 +:109F10008091B831811105C021C080E024C098DE55 +:109F2000F5CF8530E9F0E091C331F091C431818102 +:109F300082FD18C0E091C604F091C704E05AFF4FBB +:109F40008081918180179107E1F22FEF2C0FCC23B4 +:109F500019F08C01C22FD5CF84E005C082E003C088 +:109F600083E001C081E0CF911F910F91089563D0EC +:109F700069D0E0ECF4E081818E7F818380818F77EE +:109F800080831092B7310895CF93DF93E0E4F0E03F +:109F900014828481836084834ED054D0C0ECD4E09A +:109FA00088818F7788838881806888831092B83110 +:109FB0001092B4311092B6311092B531888180641C +:109FC000888348E068E480E8BEDE48E068E480E03A +:109FD000BADE888580648887898181608983DF9182 +:109FE000CF910895CF93DF933FB7F894C0ECD1E0C1 +:109FF00022E02A87EAE1F0E0E491A0ECB4E0DA960E +:10A00000EC93DA97EBE1F0E0E491DB96EC93DB97ED +:10A010001A868FED94E38E7F16968D939C931797F7 +:10A0200085E18C9318962C933FBF81E08093B731E4 +:10A03000DF91CF91A9CFE0ECF4E080858370808739 +:10A0400011860895E0ECF4E08FEF8287848708950D +:10A050001F920F920FB60F92112408B60F9218BEDE +:10A0600009B60F9219BE0BB60F921BBE2F933F93EA +:10A070004F935F936F937F938F939F93AF93BF9310 +:10A08000EF93FF938091CA0487FF08C08091C804B2 +:10A0900087FF04C080E88093CA04F8DB8091CA047B +:10A0A00086FF07C080E48093CA041092B8310E94F2 +:10A0B000BA188091CA0485FF14C080E28093CA0454 +:10A0C0008091B431882311F084E007C08091C304EB +:10A0D000811102C081E001C083E08093B8310E9409 +:10A0E000A9188091CA0484FF14C080E18093CA0437 +:10A0F00082E08093B8311092B4311092C304C3DE71 +:10A1000048E068E480E81FDE48E068E480E01BDEA9 +:10A11000BDDBFF91EF91BF91AF919F918F917F91A7 +:10A120006F915F914F913F912F910F900BBE0F90C8 +:10A1300009BE0F9008BE0F900FBE0F901F9018958C +:10A14000CF93DF93EC01FC0170968BE0DF011D9251 +:10A150008A95E9F782E08C83898783E08E8761E0C6 +:10A16000CE0101962DDE882361F061E0CE010696D6 +:10A1700027DE882331F061E0CE010B96DF91CF918D +:10A180001FCE80E0DF91CF9108950F931F93CF935F +:10A19000DF932091B8312430E1F4FC010489158962 +:10A1A00026893789012B022B032B99F0EB01818142 +:10A1B0000EDDFE0101900020E9F73197BF016C1B15 +:10A1C0007D0B40E050E0CE01DF91CF911F910F91C8 +:10A1D0006FCB82E0DF91CF911F910F9108950F9384 +:10A1E0001F93CF93DF93FC018091B8318430A9F4A1 +:10A1F00084899589A689B789892B8A2B8B2B69F04D +:10A200008A01EB018181E3DC40E050E0B801CE013E +:10A21000DF91CF911F910F914BCB82E0DF91CF91D6 +:10A220001F910F910895CF93FC018091B831843034 +:10A2300001F584899589A689B789892B8A2B8B2B6F +:10A24000C1F0C62F8181C3DC2091C1313091C23170 +:10A25000F901EF5BFF4F908131978081981720F4CF +:10A260008C2FA5DC80E006C06ADC3FDE8823C1F3CA +:10A2700001C082E0CF910895CF93DF932091B83150 +:10A28000243091F5FC014489558966897789452BED +:10A29000462B472B49F181819ADC8091C531209171 +:10A2A000C1313091C231F90187FF05C0EF5BFF4F2B +:10A2B000808190E008C0E05CFF4F80813196408152 +:10A2C00090E0841B9109892B69F0F901EF5BFF4F46 +:10A2D000D0813197C08133DCDC1720F006DE81119C +:10A2E00004C02DDC80E001C082E0DF91CF910895B1 +:10A2F000CF93DF932091B831243099F4FC01448945 +:10A30000558966897789452B462B472B51F0EC01FF +:10A3100081815DDC91DC882321F0CE01DF91CF913A +:10A32000ABCFDF91CF910895CF93DF932091B831D8 +:10A33000243019F08FEF9FEF46C0FC014489558906 +:10A3400066897789452B462B472BA1F386813FDC15 +:10A350007FDC882379F38091C5312091C131309120 +:10A36000C231F90187FF05C0EF5BFF4F808190E0AC +:10A3700008C0E05CFF4F80813196208190E0821B15 +:10A380009109892B21F003DCC82FD0E002C0CFEF68 +:10A39000DFEF2091C5318091C1319091C231FC0134 +:10A3A00027FF05C0EF5BFF4F208130E008C0E05C75 +:10A3B000FF4F20813196808130E0281B3109232B0B +:10A3C00009F4D6DBCE01DF91CF9108950895FF9275 +:10A3D0000F931F93CF93DF93EC0154DC882309F490 +:10A3E0008EC0888190E02091BD313091BE31281718 +:10A3F000390709F084C08091BA31813259F018F4DC +:10A40000803249F17CC0823209F457C0833209F4AA +:10A4100067C075C08091B931813A09F070C04CDCD9 +:10A420000BDC8823E9F38C89FD880E891F89BFDB4B +:10A430008F2DBDDB802FBBDB812FB9DB888DB7DB98 +:10A44000898DB5DB8A8DB3DB7ADBDF91CF911F91EC +:10A450000F91FF9034CD8091B931813209F04FC016 +:10A460002BDCF6DB811105C08091B8318111F9CF69 +:10A4700046C08DDB082F8BDB182F89DBF82E87DB9E +:10A480004F2D50E060E070E0BA0155274427782B4B +:10A49000402B512B4C8B5D8B6E8B7F8B78DB888FA9 +:10A4A00076DB898F74DB8A8F63DB09DDCE01DF9178 +:10A4B000CF911F910F91FF9089CF8091B931813257 +:10A4C000F1F4FADBFCDC8091BB319091BC31888BDC +:10A4D000998BCE01DF91CF911F910F91FF9076CF95 +:10A4E0008091B931813259F4E7DBE9DC6091BB310D +:10A4F000CE01DF91CF911F910F91FF9067CFDF9138 +:10A50000CF911F910F91FF900895AA1BBB1B51E1A2 +:10A5100007C0AA1FBB1FA617B70710F0A61BB70BD3 +:10A52000881F991F5A95A9F780959095BC01CD0178 +:10A530000895B7FF04C003D0821B930B089509D080 +:10A54000A59F900DB49F900DA49F800D911D112487 +:10A550000895A29FB001B39FC001A39F700D811DFC +:10A560001124911DB29F700D811D1124911D08951C +:10A570008F929F92AF92BF92CF92DF92EF92FF9213 +:10A58000CF93DF93EC01688179818A819B8161158A +:10A5900071058105910521F464E279ED8BE597E081 +:10A5A0002DE133EF41E050E0E2D649015A019B0131 +:10A5B000AC01A7EAB1E4C3DF6B017C01ACEEB4EF00 +:10A5C000A5019401B8DFDC01CB018C0D9D1DAE1DF2 +:10A5D000BF1DB7FF03C00197A109B04888839983C5 +:10A5E000AA83BB839F77DF91CF91FF90EF90DF909D +:10A5F000CF90BF90AF909F908F900895B9CF82E297 +:10A6000090E2B6CFA0E0B0E0809322209093232088 +:10A61000A0932420B09325200895FB01DC0102C003 +:10A6200005900D9241505040D8F70895FB01DC0190 +:10A630008D91059080190110D9F3990B0895FB01B4 +:10A64000DC014150504048F005900D920020C9F7C0 +:10A6500001C01D9241505040E0F70895FB01DC011C +:10A6600004C08D910190801921F441505040C8F7E9 +:10A67000881B990B0895FB01DC0102C001900D922B +:10A6800041505040D8F708956817790768F4FB01E6 +:10A69000DC01E40FF51FA40FB51F02C002900E925B +:10A6A00041505040D8F70895E6CFDC0101C06D93CA +:10A6B00041505040E0F70895FC018191861721F048 +:10A6C0008823D9F7992708953197CF010895FB0181 +:10A6D000DC0101900D920020E1F708950F931F9384 +:10A6E000CF93DF93CDB7DEB72E97CDBFDEBF0E89F8 +:10A6F0001F89888D998D26E02C8309831A8397FF03 +:10A7000002C080E090E801978D839E83AE01445E95 +:10A710005F4F6A8D7B8DCE01019667D04D815E8142 +:10A7200057FD0AC02F813885421753070CF49A0150 +:10A73000F801E20FF31F10822E96CDBFDEBFDF912E +:10A74000CF911F910F9108950F931F93CF93DF9394 +:10A75000CDB7DEB72E97CDBFDEBF0E891F89888D9E +:10A76000998D2EE02C8309831A8397FF02C080E025 +:10A7700090E801978D839E83AE01445E5F4F6A8DA2 +:10A780007B8DCE01019631D04D815E8157FD0AC08F +:10A790002F813885421753070CF49A01F801E20F14 +:10A7A000F31F10822E96CDBFDEBFDF91CF911F9198 +:10A7B0000F910895CF93DF93CDB7DEB72E97CDBF1E +:10A7C000DEBF8DE08C838C899D8989839A83AE015D +:10A7D000485E5F4F6E897F89CE0101968FD32E969A +:10A7E000CDBFDEBFDF91CF9108952F923F924F9260 +:10A7F0005F926F927F928F929F92AF92BF92CF9211 +:10A80000DF92EF92FF920F931F93CF93DF93CDB719 +:10A81000DEB72C97CDBFDEBF7C016B018A01FC0146 +:10A8200016821782838181FFB0C1CE0101964C014F +:10A83000F7019381F60193FD859193FF81916F015B +:10A84000882309F49EC1853239F493FD859193FFE5 +:10A8500081916F01853221F4B70190E0D6D4E8CF21 +:10A86000512C312C20E02032A0F48B3269F030F4EE +:10A87000803259F0833269F420612CC08D3239F076 +:10A88000803339F4216026C02260246023C0286010 +:10A8900021C027FD27C030ED380F3A3078F426FF6D +:10A8A00006C0FAE05F9E300D1124532E13C08AE0DB +:10A8B000389E300D1124332E20620CC08E3221F4CC +:10A8C00026FD5FC1206406C08C3611F4206802C0EA +:10A8D000883641F4F60193FD859193FF81916F01D4 +:10A8E0008111C1CF982F9F7D9554933028F40C5F30 +:10A8F0001F4FFFE3F9830DC0833631F0833771F0CA +:10A90000833509F057C021C0F801808189830E5F2B +:10A910001F4F44244394512C540114C03801F2E0D9 +:10A920006F0E711CF801A080B18026FF03C0652D59 +:10A9300070E002C06FEF7FEFC5012C871DD42C01A2 +:10A9400083012C852F77222E16C03801F2E06F0E7E +:10A95000711CF801A080B18026FF03C0652D70E056 +:10A9600002C06FEF7FEFC5012C87FBD32C012C8534 +:10A970002068222E830123FC19C0832D90E0481605 +:10A980005906A0F4B70180E290E03FD43A94F5CFA5 +:10A99000F50127FC859127FE81915F01B70190E0C9 +:10A9A00034D431103A94F1E04F1A51084114510453 +:10A9B00079F7DEC0843611F0893631F5F80127FFCA +:10A9C00007C060817181828193810C5F1F4F08C035 +:10A9D00060817181072E000C880B990B0E5F1F4F51 +:10A9E0002F76722E97FF09C090958095709561958E +:10A9F0007F4F8F4F9F4F2068722E2AE030E0A401D6 +:10AA000055D4A82EA81843C0853729F42F7EB22E1E +:10AA10002AE030E025C0F22FF97FBF2E8F36C1F03B +:10AA200018F4883579F0ADC0803719F0883721F0F7 +:10AA3000A8C02F2F2061B22EB4FE0DC08B2D8460D4 +:10AA4000B82E09C024FF0AC09F2F9660B92E06C0F9 +:10AA500028E030E005C020E130E002C020E132E033 +:10AA6000F801B7FE07C060817181828193810C5F1C +:10AA70001F4F06C06081718180E090E00E5F1F4F24 +:10AA8000A40114D4A82EA818FB2DFF777F2E76FEE4 +:10AA90000BC0372D3E7FA51450F474FE0AC072FC23 +:10AAA00008C0372D3E7E05C0BA2C372D03C0BA2C06 +:10AAB00001C0B52C34FF0DC0FE01EA0DF11D8081EF +:10AAC000803311F4397E09C032FF06C0B394B394C9 +:10AAD00004C0832F867809F0B39433FD12C030FF91 +:10AAE00006C05A2CB31418F4530C5B18B32CB314CF +:10AAF00060F4B70180E290E03C8787D3B3943C8553 +:10AB0000F6CFB31410F43B1801C0312C34FF11C040 +:10AB1000B70180E390E03C8778D33C8532FF16C0D4 +:10AB200031FD03C088E790E002C088E590E0B701FE +:10AB30000CC0832F867851F031FF02C08BE201C038 +:10AB400080E237FD8DE2B70190E05FD3A51430F4C9 +:10AB5000B70180E390E059D35A94F8CFAA94F40156 +:10AB6000EA0DF11D8081B70190E04FD3A110F6CF1F +:10AB7000332009F45DCEB70180E290E046D33A94E9 +:10AB8000F7CFF7018681978102C08FEF9FEF2C9658 +:10AB9000CDBFDEBFDF91CF911F910F91FF90EF905E +:10ABA000DF90CF90BF90AF909F908F907F906F90ED +:10ABB0005F904F903F902F90089520FD09C0FC01B9 +:10ABC00023FD05C022FF02C073836283518340834B +:10ABD000089544FD10C046FD10C0DB01FC01AA0F22 +:10ABE000BB1FEE1FFF1F1094D1F76A0F7B1F8E1F34 +:10ABF0009F1F31E003C033E001C034E0660F771FD0 +:10AC0000881F991F3150D1F7620F711D811D911D51 +:10AC100008950F931F93CF93DF938C01C801B7D290 +:10AC2000EC0197FD06C08AD2892BC1F7B801CE018D +:10AC300024D3CE01DF91CF911F910F9108958F9270 +:10AC40009F92AF92BF92CF92DF92EF92FF920F93BB +:10AC50001F93CF93DF931F92CDB7DEB78C01C62E23 +:10AC60007A01298394D2AC01552729814B325105B1 +:10AC700021F04D32510561F42068CA94C11002C020 +:10AC800080E06FC0C801298382D2298197FDF8CF67 +:10AC9000322F3D7FD32E322F307339F5803329F593 +:10ACA000BB24BA94BC0C09F449C0C80129836FD2F3 +:10ACB000298197FD43C0382F3F7D383561F48D2DB4 +:10ACC0008264D82ECA94CA94CC20C1F1C8015FD244 +:10ACD00097FF0BC033C026FF04C02D2D2260D22E5B +:10ACE00003C03D2D3261D32ECB2C812C912C5401ED +:10ACF00020ED280F283078F0D4FE03C0B801BDD273 +:10AD00001AC02A3040F0D6FEF9CF2F7D3FEE320F29 +:10AD10003630A0F727504D2DC501B4015ADF4B0145 +:10AD20005C018D2D8260D82ECA94CC2051F0C801D0 +:10AD30002ED297FFDDCFD1FC04C0A2CF812C912C65 +:10AD40005401D7FE08C0B094A09490948094811CC4 +:10AD5000911CA11CB11C2D2DB501A401C7012DDF33 +:10AD600081E00F90DF91CF911F910F91FF90EF90B5 +:10AD7000DF90CF90BF90AF909F908F9008956F928B +:10AD80007F928F929F92AF92BF92CF92DF92EF927B +:10AD9000FF920F931F93CF93DF93CDB7DEB7A197A9 +:10ADA000CDBFDEBF5C017A01CE0101966C0180E26D +:10ADB000F60111928A95E9F7F501838040E050E0B1 +:10ADC000912C712C70E0A1E0B0E0F90183FC859139 +:10ADD00083FE81918F01982F9F01811103C080E034 +:10ADE00090E07AC08E3519F44115510549F1E72FED +:10ADF000F0E0E417F5073CF48D3559F18D3219F484 +:10AE0000772001F103C0711001C0982E892F86951B +:10AE1000869586958601080F111D892F87703D0143 +:10AE200001C0660C8A95EAF7F80180818629808343 +:10AE3000991559F0991510F49F5FE8CF9150E6CF1E +:10AE400071E004C07724739401C0712C4F5F5F4F91 +:10AE5000BCCF772019F08E8180628E83711103C080 +:10AE60009924939416C0F6019E012F5D3F4F808177 +:10AE700080958193E217F307D1F7F2CFE114F10443 +:10AE800029F0F7018083C70101967C016150912C64 +:10AE9000E9F0C50169A37BD169A197FD15C0282FF1 +:10AEA000269526952695F601E20FF11D208130E0CA +:10AEB000AC014770552702C0359527954A95E2F7B2 +:10AEC00020FDDCCFB501D9D1911089CFE114F10477 +:10AED00011F0F7011082C801A196CDBFDEBFDF914E +:10AEE000CF911F910F91FF90EF90DF90CF90BF9087 +:10AEF000AF909F908F907F906F9008954F925F9248 +:10AF00007F928F929F92AF92BF92CF92DF92EF92F9 +:10AF1000FF920F931F93CF93DF931F92CDB7DEB7AE +:10AF20006C012B015A01FC0116821782712CF6016B +:10AF3000F380F201F3FC8591F3FE8191382F2F010C +:10AF4000882309F4E5C090E03983F8D03981892B52 +:10AF500019F0C6015EDEEBCF353241F4F201F3FCAD +:10AF60003591F3FE31912F01353259F4C601398301 +:10AF70000ED1398197FDCAC03817C9F2B6017DD10B +:10AF8000C7C03A3239F4F3FC3591F3FE31912F0109 +:10AF900051E001C050E0420110E020ED230F2A30C3 +:10AFA00088F45260612F70E080E090E040E25983C5 +:10AFB00010DE162FF401F3FC3591F3FE31914F01B1 +:10AFC0005981EBCF052F232F240151FF03C011110D +:10AFD00002C09EC01FEF383619F03C3659F011C040 +:10AFE000F401F3FC2591F3FE21912F01283649F459 +:10AFF000052F08600460F201F3FC2591F3FE219116 +:10B000002F01222309F484C0622F70E08FE096E1C3 +:10B0100029839CD02981892B09F47AC000FD07C0BF +:10B02000F501E080F180C50102965C0102C0E12CCF +:10B03000F12C2E3649F4F6014681578160E070E02C +:10B04000202FC701BADD73CF233689F401FF11E049 +:10B05000C6019DD097FD5AC0E114F10429F0F70113 +:10B060008083C70101967C01115091F74BC02B35AD +:10B0700051F49201A701612FC60181DE2C01892BB9 +:10B0800009F040C03AC0C6012983C3DD298197FD7C +:10B090003DC02F3641F128F4243619F1293631F11B +:10B0A00024C0233769F02537E1F01FC0E114F10413 +:10B0B00029F0F7018082C70101967C01115059F0F7 +:10B0C000C60165D04C0197FD06C038D0892B71F3BD +:10B0D000B601C401D2D0E114F104A1F0F70110824D +:10B0E00011C0006203C0006101C00064202FA701ED +:10B0F000612FC601A4DD811105C0F6018381807333 +:10B1000029F406C000FD13CF739411CF772019F0F6 +:10B11000872D90E002C08FEF9FEF0F90DF91CF91CE +:10B120001F910F91FF90EF90DF90CF90BF90AF9065 +:10B130009F908F907F905F904F900895911114C1D0 +:10B14000803219F089508550D0F70895FC010590A0 +:10B15000061621F00020D9F7C00108953197CF01DC +:10B160000895FC010590615070400110D8F780955A +:10B1700090958E0F9F1F0895FC01615070400190C3 +:10B180000110D8F7809590958E0F9F1F0895CF934B +:10B19000DF93EC012B8120FF33C026FF0AC02F7BF9 +:10B1A0002B838E819F8101968E839F838A8190E07D +:10B1B00029C022FF0FC0E881F9818081082E000C90 +:10B1C000990B009719F420622B831AC03196E883FB +:10B1D000F9830EC0EA85FB85199597FF09C02B817D +:10B1E000019611F080E201C080E1822B8B8308C0C0 +:10B1F0002E813F812F5F3F4F2E833F83992702C0CF +:10B200008FEF9FEFDF91CF9108950F931F93CF930F +:10B21000DF93FB01238121FD03C08FEF9FEF28C047 +:10B2200022FF16C04681578124813581421753077A +:10B2300044F4A081B1819D012F5F3F4F2083318372 +:10B240008C93268137812F5F3F4F2683378310C031 +:10B25000EB01092F182F0084F185E02D1995892B1A +:10B26000E1F68E819F8101968E839F83812F902F9F +:10B27000DF91CF911F910F910895FB01238120FF52 +:10B2800012C026FD10C08F3F3FEF930761F082830D +:10B290002F7D206423832681378121503109268325 +:10B2A0003783992708958FEF9FEF0895FA01AA2712 +:10B2B000283051F1203181F1E8946F936E7F6E5FF9 +:10B2C0007F4F8F4F9F4FAF4FB1E03ED0B4E03CD0A7 +:10B2D000670F781F891F9A1FA11D680F791F8A1F8A +:10B2E000911DA11D6A0F711D811D911DA11D20D0F1 +:10B2F00009F468943F912AE0269F11243019305DAB +:10B300003193DEF6CF010895462F4770405D41939B +:10B31000B3E00FD0C9F7F6CF462F4F70405D4A33E8 +:10B3200018F0495D31FD4052419302D0A9F7EACFB0 +:10B33000B4E0A6959795879577956795BA95C9F7DF +:10B3400000976105710508959B01AC010A2E0694D2 +:10B350005795479537952795BA95C9F7620F731F8B +:10B36000841F951FA01D0895992788270895052EED +:10B3700097FB16F400940FD057FD05D014D007FCAE +:10B3800002D046F408C050954095309521953F4F26 +:10B390004F4F5F4F089590958095709561957F4FC1 +:10B3A0008F4F9F4F0895A1E21A2EAA1BBB1BFD01D0 +:10B3B0000DC0AA1FBB1FEE1FFF1FA217B307E40794 +:10B3C000F50720F0A21BB30BE40BF50B661F771FEC +:10B3D000881F991F1A9469F76095709580959095CC +:0EB3E0009B01AC01BD01CF010895F894FFCF91 +:10B3EE0002400F00831000000104100000018208CB +:10B3FE0000000100000000000000000000009001AD +:10B40E000100010000000000000088238F238F231D +:10B41E009B23A723B123CE23DC23052408240C244D +:10B42E008726E925FE250226172648265B2688262E +:10B43E003E000426140004043E00042E040C0404F2 +:10B44E0000080008000000000000000800080808BE +:10B45E00080808000800080000000808000808088E +:10B46E0000800080000000000000008000808080CE +:10B47E0080808000800080000000808000808080BE +:10B48E0000010001000000000000000100010101A8 +:10B49E000101010001000100000001010001010194 +:10B4AE00000000000000000000000000000000008E +:10B4BE00010101010101010101010101010101016E +:10B4CE00010101010101010101010101010101015E +:10B4DE00010101010101010101010101010101014E +:10B4EE00000000000000000000000000000000004E +:10B4FE00000000000000000000000000000000003E +:10B50E00000000000000000000000000000000002D +:10B51E00010101010101010101010101010101010D +:10B52E00000000000000000000000000000000000D +:10B53E0000000000000000000000000000000000FD +:10B54E0001010101010101010101010101010101DD +:10B55E0000000000000000000000000000000000DD +:10B56E0001010101010101010101010101010101BD +:10B57E0001010101010101010101010101010101AD +:10B58E0000000000000000000000000000000000AD +:10B59E00010101010101010101010101010101018D +:10B5AE00000000020200000200020202020000027D +:10B5BE00000000020200000200020202020000026D +:10B5CE00000000020200000200020202020000025D +:10B5DE00040404060604040604060606060404060D +:10B5EE0004040406060404060406060606040406FD +:10B5FE00000000020200000200020202020000022D +:10B60E00000000020200000200020202020000021C +:10B61E0004040406060404060406060606040406CC +:10B62E0000000002020000020002020202000002FC +:10B63E0004040406060404060406060606040406AC +:10B64E00040404060604040604060606060404069C +:10B65E00040404060604040604060606060404068C +:10B66E00040404060604040604060606060404067C +:10B67E0000000002020000020002020202000002AC +:10B68E00000000020200000200020202020000029C +:10B69E00040404060604040604060606060404064C +:10B6AE00000808080000000800000800080800084C +:10B6BE00000808080000000800000800080800083C +:10B6CE00000808080000000800000800080800082C +:10B6DE00101818181010101810101810181810181C +:10B6EE00101818181010101810101810181810180C +:10B6FE0000080808000000080000080008080008FC +:10B70E0000080808000000080000080008080008EB +:10B71E0010181818101010181010181018181018DB +:10B72E0000080808000000080000080008080008CB +:10B73E0010181818101010181010181018181018BB +:10B74E0010181818101010181010181018181018AB +:10B75E00101818181010101810101810181810189B +:10B76E00101818181010101810101810181810188B +:10B77E00000808080000000800000800080800087B +:10B78E00000808080000000800000800080800086B +:10B79E00101818181010101810101810181810185B +:10B7AE00546F6F206D616E7920646174612E000D8F +:10B7BE000A504152495459204552524F52000D0AD7 +:10B7CE00504152495459204F4B00556E6B6E6F7756 +:10B7DE006E206361726420747970652E002573206B +:10B7EE006F72200054686572652069732061742041 +:10B7FE006C65617374206F6E65206D6F726520636A +:10B80E0061726420747970652063616E646964612D +:10B81E0074652C206275742074686572652077617A +:10B82E0073206E6F7420656E6F7567682074657215 +:10B83E006D696E616C2062756666657220737061EB +:10B84E0063652E0D0A00415451413A090055494491 +:10B85E003A090053414B3A09004E4F20444154419E +:02B86E000000D8 :020000021000EC :1000000000000000000000000000000000000000F0 :1000100000000000000000000000000000000000E0 From c764e52bdca1a2cf75444cfc02d7484f651b7442 Mon Sep 17 00:00:00 2001 From: Georg Date: Wed, 12 Jul 2017 10:52:05 +0200 Subject: [PATCH 024/104] added autocalibrate command --- .../Chameleon-Mini/Application/Reader14443A.c | 92 +++++++++++++++++-- .../Chameleon-Mini/Application/Reader14443A.h | 1 + Firmware/Chameleon-Mini/Codec/Codec.c | 19 ++++ Firmware/Chameleon-Mini/Codec/Codec.h | 7 ++ .../Chameleon-Mini/Terminal/CommandLine.c | 15 ++- Firmware/Chameleon-Mini/Terminal/Commands.c | 14 +++ Firmware/Chameleon-Mini/Terminal/Commands.h | 3 + 7 files changed, 140 insertions(+), 11 deletions(-) diff --git a/Firmware/Chameleon-Mini/Application/Reader14443A.c b/Firmware/Chameleon-Mini/Application/Reader14443A.c index ab00f00..78f8e78 100644 --- a/Firmware/Chameleon-Mini/Application/Reader14443A.c +++ b/Firmware/Chameleon-Mini/Application/Reader14443A.c @@ -101,9 +101,6 @@ static uint8_t CardCandidatesIdx = 0; uint16_t addParityBits(uint8_t * Buffer, uint16_t BitCount) { - uint8_t i = CardIdentificationList[0].ATQA; - if (i == 0) - return 0; if (BitCount == 7) return 7; if (BitCount % 8) @@ -473,6 +470,87 @@ uint16_t Reader14443AAppProcess(uint8_t* Buffer, uint16_t BitCount) return rVal; } + case Reader14443_Autocalibrate: + { + static enum { + RT_STATE_IDLE, + RT_STATE_SEARCHING + } RTState = RT_STATE_IDLE; + static uint8_t ErrorCount = 0; + static uint8_t Thresholds[(CODEC_THRESHOLD_CALIBRATE_MAX - CODEC_THRESHOLD_CALIBRATE_MIN) / CODEC_THRESHOLD_CALIBRATE_STEPS] = {0}; // todo this could be improved by using the bits and not the whole bytes + + if (RTState == RT_STATE_IDLE) + { + CodecThresholdSet(CODEC_THRESHOLD_CALIBRATE_MIN); + RTState = RT_STATE_SEARCHING; + ErrorCount = 0; + } else if (RTState == RT_STATE_SEARCHING && ReaderState <= STATE_HALT && ErrorCount++ == 8) { + if (CodecThresholdIncrement() >= CODEC_THRESHOLD_CALIBRATE_MAX) + { + RTState = RT_STATE_IDLE; + + bool block = false; + uint16_t min = 0; + uint16_t max = 0; + uint16_t maxdiff = 0; + uint16_t maxdiffoffset = 0; + + CommandLinePendingTaskFinished(COMMAND_INFO_OK_WITH_TEXT_ID, NULL); + uint16_t i; + for (i = 0; i < (CODEC_THRESHOLD_CALIBRATE_MAX - CODEC_THRESHOLD_CALIBRATE_MIN) / CODEC_THRESHOLD_CALIBRATE_STEPS; i++) + { + char tmpBuf[10]; + snprintf(tmpBuf, 10, "%4" PRIu16 ": ", i*CODEC_THRESHOLD_CALIBRATE_STEPS + CODEC_THRESHOLD_CALIBRATE_MIN); + TerminalSendString(tmpBuf); + if (Thresholds[i]) + { + TerminalSendStringP(PSTR("+\r\n")); + if (!block) + { + block = true; + min = i; + } + } else { + TerminalSendStringP(PSTR("-\r\n")); + if (block) + { + block = false; + max = i; + if ((max - min) > maxdiff) + { + maxdiff = max - min; + maxdiffoffset = min; + } + } + } + Thresholds[i] = 0; // reset the threshold so the next run won't show old results + } + + CodecThresholdSet((maxdiffoffset + maxdiff / 2) * CODEC_THRESHOLD_CALIBRATE_STEPS + CODEC_THRESHOLD_CALIBRATE_MIN); + + Selected = false; + Reader14443CurrentCommand = Reader14443_Do_Nothing; + CodecReaderFieldStop(); + return 0; + } + + Thresholds[(ReaderThreshold - CODEC_THRESHOLD_CALIBRATE_MIN) / CODEC_THRESHOLD_CALIBRATE_STEPS] = 0; + CodecThresholdIncrement(); + ErrorCount = 0; + } + + uint16_t rVal = Reader14443A_Select(Buffer, BitCount); + if (Selected) // we are done finding the threshold + { + Thresholds[(ReaderThreshold - CODEC_THRESHOLD_CALIBRATE_MIN) / CODEC_THRESHOLD_CALIBRATE_STEPS] = 1; + CodecThresholdIncrement(); + ReaderState = STATE_IDLE; + Reader14443ACodecStart(); + return Reader14443A_Halt(Buffer); + } + return rVal; + } + case Reader14443_Read_MF_Ultralight: { static uint8_t MFURead_CurrentAdress = 0; @@ -714,14 +792,14 @@ uint16_t Reader14443AAppProcess(uint8_t* Buffer, uint16_t BitCount) tmpBuf[size-3] = '\0'; CommandLinePendingTaskFinished(COMMAND_INFO_OK_WITH_TEXT_ID, tmpBuf); if (!enoughspace) - TerminalSendString("There is at least one more card type candidate, but there was not enough terminal buffer space.\r\n"); + TerminalSendStringP(PSTR("There is at least one more card type candidate, but there was not enough terminal buffer space.\r\n")); } // print general data - TerminalSendString("ATQA:\t"); + TerminalSendStringP(PSTR("ATQA:\t")); CommandLineAppendData(&CardCharacteristics.ATQA, 2); - TerminalSendString("UID:\t"); + TerminalSendStringP(PSTR("UID:\t")); CommandLineAppendData(CardCharacteristics.UID, CardCharacteristics.UIDSize); - TerminalSendString("SAK:\t"); + TerminalSendStringP(PSTR("SAK:\t")); CommandLineAppendData(&CardCharacteristics.SAK, 1); Reader14443CurrentCommand = Reader14443_Do_Nothing; diff --git a/Firmware/Chameleon-Mini/Application/Reader14443A.h b/Firmware/Chameleon-Mini/Application/Reader14443A.h index 63b8706..97bff8f 100644 --- a/Firmware/Chameleon-Mini/Application/Reader14443A.h +++ b/Firmware/Chameleon-Mini/Application/Reader14443A.h @@ -28,6 +28,7 @@ typedef enum { Reader14443_Send, Reader14443_Send_Raw, Reader14443_Get_UID, + Reader14443_Autocalibrate, Reader14443_Read_MF_Ultralight, Reader14443_Identify } Reader14443Command; diff --git a/Firmware/Chameleon-Mini/Codec/Codec.c b/Firmware/Chameleon-Mini/Codec/Codec.c index bb845e8..8d5b7cc 100644 --- a/Firmware/Chameleon-Mini/Codec/Codec.c +++ b/Firmware/Chameleon-Mini/Codec/Codec.c @@ -82,3 +82,22 @@ bool CodecIsReaderToBeRestarted(void) return false; } +void CodecThresholdSet(uint16_t th) +{ + ReaderThreshold = th; + DACB.CH0DATA = th; +} + +uint16_t CodecThresholdIncrement(void) +{ + ReaderThreshold += CODEC_THRESHOLD_CALIBRATE_STEPS; + DACB.CH0DATA = ReaderThreshold; + return ReaderThreshold; +} + +void CodecThresholdReset(void) +{ + ReaderThreshold = 400; + DACB.CH0DATA = ReaderThreshold; +} + diff --git a/Firmware/Chameleon-Mini/Codec/Codec.h b/Firmware/Chameleon-Mini/Codec/Codec.h index 4ac44c6..14bf6ef 100644 --- a/Firmware/Chameleon-Mini/Codec/Codec.h +++ b/Firmware/Chameleon-Mini/Codec/Codec.h @@ -73,6 +73,9 @@ #define CODEC_READER_PINCTRL_RIGHT PIN1CTRL #define CODEC_AC_DEMOD_SETTINGS AC_HSMODE_bm | AC_HYSMODE_NO_gc #define CODEC_MAXIMUM_THRESHOLD 0xFFF // the maximum voltage can be calculated with ch0data * Vref / 0xFFF +#define CODEC_THRESHOLD_CALIBRATE_MIN 128 +#define CODEC_THRESHOLD_CALIBRATE_MAX 1024 +#define CODEC_THRESHOLD_CALIBRATE_STEPS 8 #define CODEC_TIMER_TIMESTAMPS TCD1 #define CODEC_TIMER_TIMESTAMPS_CCA_VECT TCD1_CCA_vect @@ -251,4 +254,8 @@ bool CodecIsReaderFieldReady(void); void CodecReaderFieldRestart(uint16_t delay); #define FIELD_RESTART() CodecReaderFieldRestart(100) bool CodecIsReaderToBeRestarted(void); + +void CodecThresholdSet(uint16_t th); +uint16_t CodecThresholdIncrement(void); +void CodecThresholdReset(void); #endif /* CODEC_H_ */ diff --git a/Firmware/Chameleon-Mini/Terminal/CommandLine.c b/Firmware/Chameleon-Mini/Terminal/CommandLine.c index e62403b..78d5225 100644 --- a/Firmware/Chameleon-Mini/Terminal/CommandLine.c +++ b/Firmware/Chameleon-Mini/Terminal/CommandLine.c @@ -296,11 +296,18 @@ const PROGMEM CommandEntryType CommandTable[] = { .GetFunc = CommandGetThreshold }, { - .Command = COMMAND_FIELD, - .ExecFunc = NO_FUNCTION, + .Command = COMMAND_AUTOCALIBRATE, + .ExecFunc = CommandExecAutocalibrate, .ExecParamFunc = NO_FUNCTION, - .SetFunc = CommandSetField, - .GetFunc = CommandGetField + .SetFunc = NO_FUNCTION, + .GetFunc = NO_FUNCTION + }, + { + .Command = COMMAND_FIELD, + .ExecFunc = NO_FUNCTION, + .ExecParamFunc = NO_FUNCTION, + .SetFunc = CommandSetField, + .GetFunc = CommandGetField }, { /* This has to be last element */ .Command = COMMAND_LIST_END, diff --git a/Firmware/Chameleon-Mini/Terminal/Commands.c b/Firmware/Chameleon-Mini/Terminal/Commands.c index 84057c6..ecc63b8 100644 --- a/Firmware/Chameleon-Mini/Terminal/Commands.c +++ b/Firmware/Chameleon-Mini/Terminal/Commands.c @@ -624,3 +624,17 @@ CommandStatusIdType CommandGetField(char* OutMessage) OutMessage[1] = '\0'; return COMMAND_INFO_OK_WITH_TEXT_ID; } + + +CommandStatusIdType CommandExecAutocalibrate(char* OutMessage) +{ + if (GlobalSettings.ActiveSettingPtr->Configuration != CONFIG_ISO14443A_READER) + return COMMAND_ERR_INVALID_USAGE_ID; + ApplicationReset(); + + Reader14443CurrentCommand = Reader14443_Autocalibrate; + Reader14443AAppInit(); + Reader14443ACodecStart(); + CommandLinePendingTaskTimeout = &Reader14443AAppTimeout; + return TIMEOUT_COMMAND; +} diff --git a/Firmware/Chameleon-Mini/Terminal/Commands.h b/Firmware/Chameleon-Mini/Terminal/Commands.h index 6e2e364..744d376 100644 --- a/Firmware/Chameleon-Mini/Terminal/Commands.h +++ b/Firmware/Chameleon-Mini/Terminal/Commands.h @@ -177,6 +177,9 @@ CommandStatusIdType CommandSetTimeout(char* OutMessage, const char* InParam); CommandStatusIdType CommandGetThreshold(char* OutParam); CommandStatusIdType CommandSetThreshold(char* OutMessage, const char* InParam); +#define COMMAND_AUTOCALIBRATE "AUTOCALIBRATE" +CommandStatusIdType CommandExecAutocalibrate(char* OutMessage); + #define COMMAND_FIELD "FIELD" CommandStatusIdType CommandSetField(char* OutMessage, const char* InParam); CommandStatusIdType CommandGetField(char* OutMessage); From d4ae2f2060b9824a9c035e245e6190feb7a692fc Mon Sep 17 00:00:00 2001 From: Georg Date: Wed, 12 Jul 2017 10:56:56 +0200 Subject: [PATCH 025/104] changed standard timeout so autocalibrate can run flawless --- Firmware/Chameleon-Mini/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Firmware/Chameleon-Mini/Makefile b/Firmware/Chameleon-Mini/Makefile index 7b06115..6ce0adc 100644 --- a/Firmware/Chameleon-Mini/Makefile +++ b/Firmware/Chameleon-Mini/Makefile @@ -61,7 +61,7 @@ SETTINGS += -DLOG_SETTING_GLOBAL SETTINGS += -DDEFAULT_SETTING=SETTINGS_FIRST #Default pending task timeout -SETTINGS += -DDEFAULT_PENDING_TASK_TIMEOUT=10 #* 100ms +SETTINGS += -DDEFAULT_PENDING_TASK_TIMEOUT=50 #* 100ms #Use EEPROM to store settings From 7c99c0131d35245a27def6b088c8e9bd1054907a Mon Sep 17 00:00:00 2001 From: Georg Date: Wed, 12 Jul 2017 11:14:04 +0200 Subject: [PATCH 026/104] short fix within autocalibrate --- Firmware/Chameleon-Mini/Application/Reader14443A.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Firmware/Chameleon-Mini/Application/Reader14443A.c b/Firmware/Chameleon-Mini/Application/Reader14443A.c index 78f8e78..28bcc9e 100644 --- a/Firmware/Chameleon-Mini/Application/Reader14443A.c +++ b/Firmware/Chameleon-Mini/Application/Reader14443A.c @@ -526,7 +526,10 @@ uint16_t Reader14443AAppProcess(uint8_t* Buffer, uint16_t BitCount) Thresholds[i] = 0; // reset the threshold so the next run won't show old results } - CodecThresholdSet((maxdiffoffset + maxdiff / 2) * CODEC_THRESHOLD_CALIBRATE_STEPS + CODEC_THRESHOLD_CALIBRATE_MIN); + if (maxdiff != 0) + CodecThresholdSet((maxdiffoffset + maxdiff / 2) * CODEC_THRESHOLD_CALIBRATE_STEPS + CODEC_THRESHOLD_CALIBRATE_MIN); + else + CodecThresholdReset(); Selected = false; Reader14443CurrentCommand = Reader14443_Do_Nothing; From 3c0435cde19781c4710360ffd4ed4760f63eea5e Mon Sep 17 00:00:00 2001 From: Georg Date: Wed, 12 Jul 2017 11:27:20 +0200 Subject: [PATCH 027/104] doxygen update --- Doc/Doxygen/html/Page_14443AReader.html | 11 +++++++++-- Doc/Doxygen/html/Page_Buttons.html | 2 +- Doc/Doxygen/html/Page_CommandLine.html | 6 ++++-- Doc/Doxygen/html/Page_Configurations.html | 2 +- Doc/Doxygen/html/Page_GettingStarted.html | 2 +- Doc/Doxygen/html/Page_LED.html | 2 +- Doc/Doxygen/html/Page_LEDs.html | 2 +- Doc/Doxygen/html/Page_Log.html | 2 +- Doc/Doxygen/html/Page_Settings.html | 2 +- Doc/Doxygen/html/Page_UploadingDownloading.html | 2 +- Doc/Doxygen/html/_antenna_level_8h_source.html | 2 +- Doc/Doxygen/html/_application_8h_source.html | 2 +- Doc/Doxygen/html/_battery_8h_source.html | 2 +- Doc/Doxygen/html/_button_8h_source.html | 2 +- Doc/Doxygen/html/_buttons_8txt.html | 2 +- Doc/Doxygen/html/_chameleon-_mini_8h_source.html | 2 +- Doc/Doxygen/html/_codec_8h_source.html | 4 ++-- Doc/Doxygen/html/_command_line_8h_source.html | 2 +- Doc/Doxygen/html/_command_line_8txt.html | 2 +- Doc/Doxygen/html/_commands_8h_source.html | 4 ++-- Doc/Doxygen/html/_common_8h_source.html | 2 +- Doc/Doxygen/html/_configuration_8h.html | 2 +- Doc/Doxygen/html/_configuration_8h_source.html | 2 +- Doc/Doxygen/html/_configurations_8txt.html | 2 +- Doc/Doxygen/html/_crypto1_8h_source.html | 4 ++-- Doc/Doxygen/html/_getting_started_8txt.html | 2 +- Doc/Doxygen/html/_i_s_o14443-2_a_8h_source.html | 2 +- Doc/Doxygen/html/_i_s_o14443-3_a_8h_source.html | 2 +- Doc/Doxygen/html/_l_e_d_8h_source.html | 2 +- Doc/Doxygen/html/_l_e_d_8txt.html | 2 +- Doc/Doxygen/html/_l_e_d_hook_8h_source.html | 2 +- Doc/Doxygen/html/_l_e_ds_8txt.html | 2 +- Doc/Doxygen/html/_l_u_f_a_config_8h.html | 2 +- Doc/Doxygen/html/_l_u_f_a_config_8h_source.html | 2 +- Doc/Doxygen/html/_l_u_f_a_descriptors_8c.html | 2 +- Doc/Doxygen/html/_l_u_f_a_descriptors_8h.html | 2 +- Doc/Doxygen/html/_l_u_f_a_descriptors_8h_source.html | 2 +- Doc/Doxygen/html/_log_8h.html | 2 +- Doc/Doxygen/html/_log_8h_source.html | 2 +- Doc/Doxygen/html/_log_8txt.html | 2 +- Doc/Doxygen/html/_main_page_8txt.html | 2 +- Doc/Doxygen/html/_map_8h_source.html | 2 +- Doc/Doxygen/html/_memory_8h_source.html | 2 +- Doc/Doxygen/html/_mifare_classic_8h_source.html | 2 +- Doc/Doxygen/html/_mifare_ultralight_8h_source.html | 2 +- Doc/Doxygen/html/_random_8h_source.html | 2 +- Doc/Doxygen/html/_reader14443-2_a_8h_source.html | 2 +- Doc/Doxygen/html/_reader14443_a_8h_source.html | 4 ++-- Doc/Doxygen/html/_reader_8txt.html | 2 +- Doc/Doxygen/html/_settings_8h.html | 2 +- Doc/Doxygen/html/_settings_8h_source.html | 2 +- Doc/Doxygen/html/_settings_8txt.html | 2 +- Doc/Doxygen/html/_system_8h_source.html | 2 +- Doc/Doxygen/html/_terminal_8h_source.html | 2 +- Doc/Doxygen/html/_uploading_downloading_8txt.html | 2 +- Doc/Doxygen/html/_x_modem_8h_source.html | 2 +- Doc/Doxygen/html/annotated.html | 2 +- Doc/Doxygen/html/classes.html | 2 +- .../html/dir_5de29d499bb29a41092979d00d22c134.html | 2 +- .../html/dir_74b6a3b63f61c160c0f14b7a283a4c9b.html | 2 +- .../html/dir_8465ec698d237f801ae9966d4551fcfa.html | 2 +- .../html/dir_ddeffaa734f77525428b0dd4068da9cb.html | 2 +- .../html/dir_f5aab302412c0352d69464400cc5ee44.html | 2 +- Doc/Doxygen/html/files.html | 2 +- Doc/Doxygen/html/functions.html | 2 +- Doc/Doxygen/html/functions_vars.html | 2 +- Doc/Doxygen/html/globals.html | 2 +- Doc/Doxygen/html/globals_defs.html | 2 +- Doc/Doxygen/html/globals_enum.html | 2 +- Doc/Doxygen/html/globals_eval.html | 2 +- Doc/Doxygen/html/globals_func.html | 2 +- Doc/Doxygen/html/globals_vars.html | 2 +- Doc/Doxygen/html/index.html | 2 +- Doc/Doxygen/html/pages.html | 2 +- .../html/struct_configuration_type-members.html | 2 +- Doc/Doxygen/html/struct_configuration_type.html | 2 +- .../html/struct_settings_entry_type-members.html | 2 +- Doc/Doxygen/html/struct_settings_entry_type.html | 2 +- ...u_s_b___descriptor___configuration__t-members.html | 2 +- .../struct_u_s_b___descriptor___configuration__t.html | 2 +- Doc/DoxygenPages/CommandLine.txt | 3 ++- Doc/DoxygenPages/Reader.txt | 10 ++++++++++ 82 files changed, 107 insertions(+), 87 deletions(-) diff --git a/Doc/Doxygen/html/Page_14443AReader.html b/Doc/Doxygen/html/Page_14443AReader.html index 18eada9..8152b5c 100644 --- a/Doc/Doxygen/html/Page_14443AReader.html +++ b/Doc/Doxygen/html/Page_14443AReader.html @@ -155,12 +155,19 @@ Each of the following commands returns INVALID COMMAND USAGE on a n

    If this command is called within the reader configuration, it ends in one of three ways:

    1. Return code 101:OK WITH TEXT, the card type and ATQA value, UID value and SAK value of the highest cascade level.
    2. Return code 101:OK WITH TEXT, the information that this card type is unknown to the ChameleonMini ("Unknown card.") and ATQA value, UID value and SAK value of the highest cascade level.
    3. -
    4. Timeout (no matter if on setting/configuration change or on real timeout).
    5. +
    6. Timeout (no matter if on setting/configuration change or on real timeout).
    +

    AUTOCALIBRATE

    +

    This is a timeout command. Tries to select to a card with every threshold within a range with a specific step size and chooses the best threshold.

    +

    If this command is called within the reader configuration, it ends in one of the following ways:

      +
    1. Return code 101:OK WITH TEXT and a list of the tested thresholds with a + for every threshold where the select protocol was successful and a - if the select protocol was not successfully finished.
    2. +
    3. Timeout (no matter if on setting/configuration change or on real timeout).
    4. +
    +
    Note
    If no working threshold was found, the threshold is reset to the standard threshold.
    diff --git a/Doc/Doxygen/html/Page_Buttons.html b/Doc/Doxygen/html/Page_Buttons.html index 0fc6748..07ee3b8 100644 --- a/Doc/Doxygen/html/Page_Buttons.html +++ b/Doc/Doxygen/html/Page_Buttons.html @@ -125,7 +125,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Doc/Doxygen/html/Page_CommandLine.html b/Doc/Doxygen/html/Page_CommandLine.html index 414c333..c5547f0 100644 --- a/Doc/Doxygen/html/Page_CommandLine.html +++ b/Doc/Doxygen/html/Page_CommandLine.html @@ -249,7 +249,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); DUMP_MFU Reads the whole content of a Mifare Ultralight card that is in the range of the antenna and returns it. This command is a Timeout command. -IDENTIFY Identifies the type of a card in the range of the antenna and returns it. +IDENTIFY Identifies the type of a card in the range of the antenna and returns it. This command is a Timeout command. THRESHOLD=? Returns the possible number range for the reader threshold. @@ -257,6 +257,8 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); THRESHOLD? Returns the current reader threshold. +AUTOCALIBRATE Automatically finds a good threshold for communicating with the card that currently is on top of the Chameleon. This command is a Timeout command. + FIELD? Returns whether (1) or not (0) the reader field is active. FIELD=[0;1] Enables/disables the reader field. @@ -284,7 +286,7 @@ When setting the timeout to zero, there is no timeout and thus a process may con diff --git a/Doc/Doxygen/html/Page_Configurations.html b/Doc/Doxygen/html/Page_Configurations.html index 0d19c48..ac93e9b 100644 --- a/Doc/Doxygen/html/Page_Configurations.html +++ b/Doc/Doxygen/html/Page_Configurations.html @@ -121,7 +121,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Doc/Doxygen/html/Page_GettingStarted.html b/Doc/Doxygen/html/Page_GettingStarted.html index aa59e15..1911b43 100644 --- a/Doc/Doxygen/html/Page_GettingStarted.html +++ b/Doc/Doxygen/html/Page_GettingStarted.html @@ -113,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Doc/Doxygen/html/Page_LED.html b/Doc/Doxygen/html/Page_LED.html index 457bd4e..3584e29 100644 --- a/Doc/Doxygen/html/Page_LED.html +++ b/Doc/Doxygen/html/Page_LED.html @@ -109,7 +109,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Doc/Doxygen/html/Page_LEDs.html b/Doc/Doxygen/html/Page_LEDs.html index 7f5b2fb..8785cfa 100644 --- a/Doc/Doxygen/html/Page_LEDs.html +++ b/Doc/Doxygen/html/Page_LEDs.html @@ -113,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Doc/Doxygen/html/Page_Log.html b/Doc/Doxygen/html/Page_Log.html index c913f9d..766b381 100644 --- a/Doc/Doxygen/html/Page_Log.html +++ b/Doc/Doxygen/html/Page_Log.html @@ -112,7 +112,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Doc/Doxygen/html/Page_Settings.html b/Doc/Doxygen/html/Page_Settings.html index 55392cb..960823a 100644 --- a/Doc/Doxygen/html/Page_Settings.html +++ b/Doc/Doxygen/html/Page_Settings.html @@ -100,7 +100,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Doc/Doxygen/html/Page_UploadingDownloading.html b/Doc/Doxygen/html/Page_UploadingDownloading.html index 5f7570b..a68c00f 100644 --- a/Doc/Doxygen/html/Page_UploadingDownloading.html +++ b/Doc/Doxygen/html/Page_UploadingDownloading.html @@ -91,7 +91,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Doc/Doxygen/html/_antenna_level_8h_source.html b/Doc/Doxygen/html/_antenna_level_8h_source.html index 6069809..6120257 100644 --- a/Doc/Doxygen/html/_antenna_level_8h_source.html +++ b/Doc/Doxygen/html/_antenna_level_8h_source.html @@ -92,7 +92,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    1 /*
    2  * AntennaLevel.h
    3  *
    4  * Created on: 24.11.2013
    5  * Author: skuser
    6  */
    7 
    8 #ifndef ANTENNALEVEL_H_
    9 #define ANTENNALEVEL_H_
    10 
    11 #include "Common.h"
    12 
    13 #define ANTENNA_LEVEL_R1 47E3
    14 #define ANTENNA_LEVEL_R2 1E3
    15 #define ANTENNA_LEVEL_VREF 1.0
    16 #define ANTENNA_LEVEL_RES 4096
    17 #define ANTENNA_LEVEL_OFFSET 190 /* LSB */
    18 
    19 #define ANTENNA_LEVEL_MILLIVOLT 1E3
    20 #define ANTENNA_LEVEL_FACTOR (ANTENNA_LEVEL_VREF * (ANTENNA_LEVEL_R1 + ANTENNA_LEVEL_R2) / (ANTENNA_LEVEL_RES * ANTENNA_LEVEL_R2) )
    21 #define ANTENNA_LEVEL_SCALE ((uint32_t) 1<<16)
    22 #define ANTENNA_LEVEL_NUMERATOR ((uint32_t) (ANTENNA_LEVEL_MILLIVOLT * ANTENNA_LEVEL_FACTOR * ANTENNA_LEVEL_SCALE + .5))
    23 #define ANTENNA_LEVEL_DENOMINATOR (ANTENNA_LEVEL_SCALE)
    24 
    25 static inline
    26 void AntennaLevelInit(void)
    27 {
    28  ADCA.CTRLA = ADC_ENABLE_bm;
    29  ADCA.CTRLB = ADC_RESOLUTION_12BIT_gc;
    30  ADCA.REFCTRL = ADC_REFSEL_INT1V_gc | ADC_BANDGAP_bm;
    31  ADCA.PRESCALER = ADC_PRESCALER_DIV32_gc;
    32  ADCA.CH0.CTRL = ADC_CH_INPUTMODE_SINGLEENDED_gc;
    33  ADCA.CH0.MUXCTRL = ADC_CH_MUXPOS_PIN1_gc;
    34 
    35 }
    36 
    37 static inline
    38 uint16_t AntennaLevelGet(void)
    39 {
    40  ADCA.CH0.CTRL |= ADC_CH_START_bm;
    41  while( !(ADCA.CH0.INTFLAGS & ADC_CH_CHIF_bm) );
    42 
    43  ADCA.CH0.INTFLAGS = ADC_CH_CHIF_bm;
    44 
    45  int16_t Result = ADCA.CH0RES - ANTENNA_LEVEL_OFFSET;
    46  if (Result < 0) Result = 0;
    47 
    48  return (uint16_t) (((uint32_t) Result * ANTENNA_LEVEL_NUMERATOR) / ANTENNA_LEVEL_DENOMINATOR);
    49 }
    50 
    51 void AntennaLevelTick(void);
    52 void AntennaLevelResetMaxRssi(void);
    53 
    54 #endif /* ANTENNALEVEL_H_ */
    diff --git a/Doc/Doxygen/html/_application_8h_source.html b/Doc/Doxygen/html/_application_8h_source.html index f95b201..d9c32ec 100644 --- a/Doc/Doxygen/html/_application_8h_source.html +++ b/Doc/Doxygen/html/_application_8h_source.html @@ -101,7 +101,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Doc/Doxygen/html/_battery_8h_source.html b/Doc/Doxygen/html/_battery_8h_source.html index fd0f493..8bd2dd0 100644 --- a/Doc/Doxygen/html/_battery_8h_source.html +++ b/Doc/Doxygen/html/_battery_8h_source.html @@ -92,7 +92,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    1 /*
    2  * Battery.h
    3  *
    4  * Created on: 20.08.2014
    5  * Author: sk
    6  */
    7 
    8 #ifndef BATTERY_H_
    9 #define BATTERY_H_
    10 
    11 #include "Common.h"
    12 
    13 #define BATTERY_PORT PORTD
    14 #define BATTERY_STAT_PIN PIN0_bm
    15 #define BATTERY_STAT_PINCTRL PIN0CTRL
    16 #define BATTERY_PORT_MASK (BATTERY_STAT_PIN)
    17 
    18 INLINE void BatteryInit(void) {
    19  BATTERY_PORT.DIRCLR = BATTERY_PORT_MASK;
    20  BATTERY_PORT.BATTERY_STAT_PINCTRL = PORT_OPC_PULLUP_gc;
    21 }
    22 
    23 INLINE bool BatteryIsCharging(void) {
    24  if (!(BATTERY_PORT.IN & BATTERY_STAT_PIN)) {
    25  return true;
    26  } else {
    27  return false;
    28  }
    29 }
    30 
    31 #endif /* BATTERY_H_ */
    diff --git a/Doc/Doxygen/html/_button_8h_source.html b/Doc/Doxygen/html/_button_8h_source.html index 4bcb54d..4a862ce 100644 --- a/Doc/Doxygen/html/_button_8h_source.html +++ b/Doc/Doxygen/html/_button_8h_source.html @@ -92,7 +92,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    1 /*
    2  * Button.h
    3  *
    4  * Created on: 13.05.2013
    5  * Author: skuser
    6  */
    7 
    8 #ifndef BUTTON_H_
    9 #define BUTTON_H_
    10 
    11 #include "Common.h"
    12 
    13 typedef enum {
    14  BUTTON_R_PRESS_SHORT = 0,
    15  BUTTON_R_PRESS_LONG,
    16  BUTTON_L_PRESS_SHORT,
    17  BUTTON_L_PRESS_LONG,
    18 
    19  /* Must be last element */
    20  BUTTON_TYPE_COUNT
    21 } ButtonTypeEnum;
    22 
    23 typedef enum {
    24  BUTTON_ACTION_NONE,
    25  BUTTON_ACTION_UID_RANDOM,
    26  BUTTON_ACTION_UID_LEFT_INCREMENT,
    27  BUTTON_ACTION_UID_RIGHT_INCREMENT,
    28  BUTTON_ACTION_UID_LEFT_DECREMENT,
    29  BUTTON_ACTION_UID_RIGHT_DECREMENT,
    30  BUTTON_ACTION_CYCLE_SETTINGS,
    31  BUTTON_ACTION_STORE_MEM,
    32  BUTTON_ACTION_RECALL_MEM,
    33  BUTTON_ACTION_TOGGLE_FIELD,
    34  BUTTON_ACTION_STORE_LOG,
    35 
    36  /* This has to be last element */
    37  BUTTON_ACTION_COUNT
    38 } ButtonActionEnum;
    39 
    40 void ButtonInit(void);
    41 void ButtonTick(void);
    42 
    43 void ButtonGetActionList(char* List, uint16_t BufferSize);
    44 void ButtonSetActionById(ButtonTypeEnum Type, ButtonActionEnum Action);
    45 void ButtonGetActionByName(ButtonTypeEnum Type, char* Action, uint16_t BufferSize);
    46 bool ButtonSetActionByName(ButtonTypeEnum Type, const char* Action);
    47 
    48 #endif /* BUTTON_H_ */
    diff --git a/Doc/Doxygen/html/_buttons_8txt.html b/Doc/Doxygen/html/_buttons_8txt.html index f0f385e..17894e7 100644 --- a/Doc/Doxygen/html/_buttons_8txt.html +++ b/Doc/Doxygen/html/_buttons_8txt.html @@ -88,7 +88,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Doc/Doxygen/html/_chameleon-_mini_8h_source.html b/Doc/Doxygen/html/_chameleon-_mini_8h_source.html index d00b8ee..85d0c5b 100644 --- a/Doc/Doxygen/html/_chameleon-_mini_8h_source.html +++ b/Doc/Doxygen/html/_chameleon-_mini_8h_source.html @@ -95,7 +95,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Doc/Doxygen/html/_codec_8h_source.html b/Doc/Doxygen/html/_codec_8h_source.html index f083992..1dbc20e 100644 --- a/Doc/Doxygen/html/_codec_8h_source.html +++ b/Doc/Doxygen/html/_codec_8h_source.html @@ -89,13 +89,13 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    Codec.h
    -
    1 /*
    2  * CODEC.h
    3  *
    4  * Created on: 18.02.2013
    5  * Author: skuser
    6  */
    7 
    8 #ifndef CODEC_H_
    9 #define CODEC_H_
    10 
    11 #include <avr/io.h>
    12 #include <stdint.h>
    13 #include <stdbool.h>
    14 #include "../Common.h"
    15 #include "../Configuration.h"
    16 
    17 #include "ISO14443-2A.h"
    18 #include "Reader14443-2A.h"
    19 
    20 /* Timing definitions for ISO14443A */
    21 #define ISO14443A_SUBCARRIER_DIVIDER 16
    22 #define ISO14443A_BIT_GRID_CYCLES 128
    23 #define ISO14443A_BIT_RATE_CYCLES 128
    24 #define ISO14443A_FRAME_DELAY_PREV1 1236
    25 #define ISO14443A_FRAME_DELAY_PREV0 1172
    26 #define ISO14443A_RX_PENDING_TIMEOUT 1 // ms
    27 
    28 /* Peripheral definitions */
    29 #define CODEC_DEMOD_POWER_PORT PORTB
    30 #define CODEC_DEMOD_POWER_MASK PIN0_bm
    31 #define CODEC_DEMOD_IN_PORT PORTB
    32 #define CODEC_DEMOD_IN_MASK (CODEC_DEMOD_IN_MASK0 | CODEC_DEMOD_IN_MASK1)
    33 #define CODEC_DEMOD_IN_MASK0 PIN1_bm
    34 #define CODEC_DEMOD_IN_MASK1 PIN2_bm
    35 #define CODEC_DEMOD_IN_PINCTRL0 PIN1CTRL
    36 #define CODEC_DEMOD_IN_PINCTRL1 PIN2CTRL
    37 #define CODEC_DEMOD_IN_EVMUX0 EVSYS_CHMUX_PORTB_PIN1_gc
    38 #define CODEC_DEMOD_IN_EVMUX1 EVSYS_CHMUX_PORTB_PIN2_gc
    39 #define CODEC_DEMOD_IN_INT0_VECT PORTB_INT0_vect
    40 #define CODEC_LOADMOD_PORT PORTC
    41 #define CODEC_LOADMOD_MASK PIN6_bm
    42 #define CODEC_CARRIER_IN_PORT PORTC
    43 #define CODEC_CARRIER_IN_MASK PIN2_bm
    44 #define CODEC_CARRIER_IN_PINCTRL PIN2CTRL
    45 #define CODEC_CARRIER_IN_EVMUX EVSYS_CHMUX_PORTC_PIN2_gc
    46 #define CODEC_CARRIER_IN_DIV 2 /* external clock division factor */
    47 #define CODEC_SUBCARRIER_PORT PORTC
    48 #define CODEC_SUBCARRIER_MASK_PSK PIN4_bm
    49 #define CODEC_SUBCARRIER_MASK_OOK PIN5_bm
    50 #define CODEC_SUBCARRIER_MASK (CODEC_SUBCARRIER_MASK_PSK | CODEC_SUBCARRIER_MASK_OOK)
    51 #define CODEC_SUBCARRIER_TIMER TCC1
    52 #define CODEC_SUBCARRIER_CC_PSK CCA
    53 #define CODEC_SUBCARRIER_CC_OOK CCB
    54 #define CODEC_SUBCARRIER_CCEN_PSK TC1_CCAEN_bm
    55 #define CODEC_SUBCARRIER_CCEN_OOK TC1_CCBEN_bm
    56 #define CODEC_TIMER_SAMPLING TCD0
    57 #define CODEC_TIMER_SAMPLING_CCA_VECT TCD0_CCA_vect
    58 #define CODEC_TIMER_SAMPLING_CCB_VECT TCD0_CCB_vect
    59 #define CODEC_TIMER_LOADMOD TCE0
    60 #define CODEC_TIMER_LOADMOD_OVF_VECT TCE0_OVF_vect
    61 #define CODEC_TIMER_LOADMOD_CCA_VECT TCE0_CCA_vect
    62 #define CODEC_TIMER_LOADMOD_CCB_VECT TCE0_CCB_vect
    63 #define CODEC_TIMER_LOADMOD_CCC_VECT TCE0_CCC_vect
    64 #define CODEC_TIMER_MODSTART_EVSEL TC_EVSEL_CH0_gc
    65 #define CODEC_TIMER_MODEND_EVSEL TC_EVSEL_CH1_gc
    66 #define CODEC_TIMER_CARRIER_CLKSEL TC_CLKSEL_EVCH6_gc
    67 #define CODEC_READER_TIMER TCC0
    68 #define CODEC_READER_PORT PORTC
    69 #define CODEC_READER_MASK_LEFT PIN0_bm
    70 #define CODEC_READER_MASK_RIGHT PIN1_bm
    71 #define CODEC_READER_MASK (CODEC_READER_MASK_LEFT | CODEC_READER_MASK_RIGHT)
    72 #define CODEC_READER_PINCTRL_LEFT PIN0CTRL
    73 #define CODEC_READER_PINCTRL_RIGHT PIN1CTRL
    74 #define CODEC_AC_DEMOD_SETTINGS AC_HSMODE_bm | AC_HYSMODE_NO_gc
    75 #define CODEC_MAXIMUM_THRESHOLD 0xFFF // the maximum voltage can be calculated with ch0data * Vref / 0xFFF
    76 #define CODEC_TIMER_TIMESTAMPS TCD1
    77 #define CODEC_TIMER_TIMESTAMPS_CCA_VECT TCD1_CCA_vect
    78 
    79 #define CODEC_BUFFER_SIZE 256
    80 
    81 #define CODEC_CARRIER_FREQ 13560000
    82 
    83 #define Codec8Reg0 GPIOR0
    84 #define Codec8Reg1 GPIOR1
    85 #define Codec8Reg2 GPIOR2
    86 #define Codec8Reg3 GPIOR3
    87 #define CodecCount16Register1 (*((volatile uint16_t*) &GPIOR4)) /* GPIOR4 & GPIOR5 */
    88 #define CodecCount16Register2 (*((volatile uint16_t*) &GPIOR6)) /* GPIOR4 & GPIOR5 */
    89 #define CodecPtrRegister1 (*((volatile uint8_t**) &GPIOR8))
    90 #define CodecPtrRegister2 (*((volatile uint8_t**) &GPIORA))
    91 
    92 extern uint16_t ReaderThreshold;
    93 extern uint16_t Reader_FWT;
    94 
    95 #define FWI2FWT(x) ((uint32_t)(256 * 16 * ((uint32_t)1 << (x))) / (CODEC_CARRIER_FREQ / 1000) + 1)
    96 
    97 typedef enum {
    98  CODEC_SUBCARRIERMOD_OFF,
    99  CODEC_SUBCARRIERMOD_OOK
    100 } SubcarrierModType;
    101 
    102 extern uint8_t CodecBuffer[CODEC_BUFFER_SIZE];
    103 
    104 INLINE void CodecInit(void) {
    105  ActiveConfiguration.CodecInitFunc();
    106 }
    107 
    108 INLINE void CodecDeInit(void) {
    109  ActiveConfiguration.CodecDeInitFunc();
    110 }
    111 
    112 INLINE void CodecTask(void) {
    113  ActiveConfiguration.CodecTaskFunc();
    114 }
    115 
    116 /* Helper Functions for Codec implementations */
    117 INLINE void CodecInitCommon(void)
    118 {
    119  /* Configure CARRIER input pin and route it to EVSYS.
    120  * Multiply by 2 again by using both edges when externally
    121  * dividing by 2 */
    122 #if CODEC_CARRIER_IN_DIV == 2
    123  CODEC_CARRIER_IN_PORT.CODEC_CARRIER_IN_PINCTRL = PORT_ISC_BOTHEDGES_gc;
    124 #else
    125 #error Option not supported
    126 #endif
    127  CODEC_CARRIER_IN_PORT.DIRCLR = CODEC_CARRIER_IN_MASK;
    128  EVSYS.CH6MUX = CODEC_CARRIER_IN_EVMUX;
    129 
    130  /* Configure two DEMOD pins for input.
    131  * Configure event channel 0 for rising edge (begin of modulation pause)
    132  * Configure event channel 1 for falling edge (end of modulation pause) */
    133  CODEC_DEMOD_POWER_PORT.OUTCLR = CODEC_DEMOD_POWER_MASK;
    134  CODEC_DEMOD_POWER_PORT.DIRSET = CODEC_DEMOD_POWER_MASK;
    135  CODEC_DEMOD_IN_PORT.DIRCLR = CODEC_DEMOD_IN_MASK;
    136  CODEC_DEMOD_IN_PORT.CODEC_DEMOD_IN_PINCTRL0 = PORT_ISC_RISING_gc;
    137  CODEC_DEMOD_IN_PORT.CODEC_DEMOD_IN_PINCTRL1 = PORT_ISC_FALLING_gc;
    138  CODEC_DEMOD_IN_PORT.INT0MASK = 0;
    139  CODEC_DEMOD_IN_PORT.INTCTRL = PORT_INT0LVL_HI_gc;
    140  EVSYS.CH0MUX = CODEC_DEMOD_IN_EVMUX0;
    141  EVSYS.CH1MUX = CODEC_DEMOD_IN_EVMUX1;
    142 
    143  /* Configure loadmod pin configuration and use a virtual port configuration
    144  * for single instruction cycle access */
    145  CODEC_LOADMOD_PORT.DIRSET = CODEC_LOADMOD_MASK;
    146  CODEC_LOADMOD_PORT.OUTCLR = CODEC_LOADMOD_MASK;
    147  PORTCFG.VPCTRLA &= ~PORTCFG_VP0MAP_gm;
    148  PORTCFG.VPCTRLA |= PORTCFG_VP02MAP_PORTC_gc;
    149 
    150  /* Configure subcarrier pins for output */
    151  CODEC_SUBCARRIER_PORT.DIRSET = CODEC_SUBCARRIER_MASK;
    152  CODEC_SUBCARRIER_PORT.OUTCLR = CODEC_SUBCARRIER_MASK;
    153 
    154  /* Configure pins for reader field with the LEFT output being inverted
    155  * and all bridge outputs static high */
    156  CODEC_READER_PORT.CODEC_READER_PINCTRL_LEFT = PORT_INVEN_bm;
    157  CODEC_READER_PORT.OUTCLR = CODEC_READER_MASK_LEFT;
    158  CODEC_READER_PORT.OUTSET = CODEC_READER_MASK_RIGHT;
    159  CODEC_READER_PORT.DIRSET = CODEC_READER_MASK;
    160 
    161  /* Configure timer for generating reader field and configure AWEX for outputting pattern
    162  * with disabled outputs. */
    163  CODEC_READER_TIMER.CTRLB = TC0_CCAEN_bm | TC_WGMODE_SINGLESLOPE_gc;
    164  CODEC_READER_TIMER.PER = F_CPU / CODEC_CARRIER_FREQ - 1;
    165  CODEC_READER_TIMER.CCA = F_CPU / CODEC_CARRIER_FREQ / 2 ;
    166 
    167  AWEXC.OUTOVEN = 0x00;
    168  AWEXC.CTRL = AWEX_CWCM_bm | AWEX_DTICCAEN_bm | AWEX_DTICCBEN_bm;
    169 
    170  /* Configure DAC for the reference voltage */
    171  DACB.EVCTRL = 0;
    172  DACB.CTRLB = DAC_CHSEL_SINGLE_gc;
    173  DACB.CTRLC = DAC_REFSEL_AVCC_gc;
    174  DACB.CTRLA = DAC_IDOEN_bm | DAC_ENABLE_bm;
    175  DACB.CH0DATA = ReaderThreshold; // real threshold voltage can be calculated with ch0data * Vref / 0xFFF
    176 
    177  /* Configure Analog Comparator 0 to detect changes in demodulated reader field */
    178  ACA.AC0MUXCTRL = AC_MUXPOS_DAC_gc | AC_MUXNEG_PIN7_gc;
    179  ACA.AC0CTRL = CODEC_AC_DEMOD_SETTINGS;
    180 
    181  /* Configure Analog Comparator 1 to detect SOC */
    182  ACA.AC1MUXCTRL = AC_MUXPOS_DAC_gc | AC_MUXNEG_PIN7_gc;
    183  ACA.AC1CTRL = CODEC_AC_DEMOD_SETTINGS;
    184 }
    185 
    186 INLINE void CodecSetSubcarrier(SubcarrierModType ModType, uint16_t Divider)
    187 {
    188  if (ModType == CODEC_SUBCARRIERMOD_OFF) {
    189  CODEC_SUBCARRIER_TIMER.CTRLA = TC_CLKSEL_OFF_gc;
    190  CODEC_SUBCARRIER_TIMER.CTRLB = 0;
    191  } else if (ModType == CODEC_SUBCARRIERMOD_OOK) {
    192  /* Configure subcarrier generation with 50% DC output using OOK */
    193  CODEC_SUBCARRIER_TIMER.CNT = 0;
    194  CODEC_SUBCARRIER_TIMER.PER = Divider - 1;
    195  CODEC_SUBCARRIER_TIMER.CODEC_SUBCARRIER_CC_OOK = Divider/2;
    196  CODEC_SUBCARRIER_TIMER.CTRLB = CODEC_SUBCARRIER_CCEN_OOK | TC_WGMODE_SINGLESLOPE_gc;
    197  }
    198 }
    199 
    200 INLINE void CodecStartSubcarrier(void)
    201 {
    202  CODEC_SUBCARRIER_TIMER.CTRLA = CODEC_TIMER_CARRIER_CLKSEL;
    203 }
    204 
    205 INLINE void CodecSetDemodPower(bool bOnOff)
    206 {
    207  if (bOnOff) {
    208  CODEC_DEMOD_POWER_PORT.OUTSET = CODEC_DEMOD_POWER_MASK;
    209  } else {
    210  CODEC_DEMOD_POWER_PORT.OUTCLR = CODEC_DEMOD_POWER_MASK;
    211  }
    212 }
    213 
    214 INLINE bool CodecGetLoadmodState(void) {
    215  if (ACA.STATUS & AC_AC0STATE_bm) {
    216  return true;
    217  } else {
    218  return false;
    219  }
    220 }
    221 
    222 INLINE void CodecSetLoadmodState(bool bOnOff) {
    223  if (bOnOff) {
    224  VPORT0.OUT |= CODEC_LOADMOD_MASK;
    225  } else {
    226  VPORT0.OUT &= ~CODEC_LOADMOD_MASK;
    227  }
    228 }
    229 
    230 INLINE void CodecSetReaderField(bool bOnOff) { // this is the function for turning on/off the reader field dumbly; before using this function, please consider to use CodecReaderField{Start,Stop}
    231 
    232  if (bOnOff) {
    233  /* Start timer for field generation and unmask outputs */
    234  CODEC_READER_TIMER.CTRLA = TC_CLKSEL_DIV1_gc;
    235  AWEXC.OUTOVEN = CODEC_READER_MASK;
    236  } else {
    237  /* Disable outputs of AWEX and stop field generation */
    238  AWEXC.OUTOVEN = 0x00;
    239  CODEC_READER_TIMER.CTRLA = TC_CLKSEL_OFF_gc;
    240  }
    241 }
    242 
    243 INLINE bool CodecGetReaderField(void) {
    244  return (CODEC_READER_TIMER.CTRLA == TC_CLKSEL_DIV1_gc) && (AWEXC.OUTOVEN == CODEC_READER_MASK);
    245 }
    246 
    247 void CodecReaderFieldStart(void);
    248 void CodecReaderFieldStop(void);
    249 bool CodecIsReaderFieldReady(void);
    250 
    251 void CodecReaderFieldRestart(uint16_t delay);
    252 #define FIELD_RESTART() CodecReaderFieldRestart(100)
    253 bool CodecIsReaderToBeRestarted(void);
    254 #endif /* CODEC_H_ */
    void(* CodecInitFunc)(void)
    Definition: Configuration.h:57
    +
    1 /*
    2  * CODEC.h
    3  *
    4  * Created on: 18.02.2013
    5  * Author: skuser
    6  */
    7 
    8 #ifndef CODEC_H_
    9 #define CODEC_H_
    10 
    11 #include <avr/io.h>
    12 #include <stdint.h>
    13 #include <stdbool.h>
    14 #include "../Common.h"
    15 #include "../Configuration.h"
    16 
    17 #include "ISO14443-2A.h"
    18 #include "Reader14443-2A.h"
    19 
    20 /* Timing definitions for ISO14443A */
    21 #define ISO14443A_SUBCARRIER_DIVIDER 16
    22 #define ISO14443A_BIT_GRID_CYCLES 128
    23 #define ISO14443A_BIT_RATE_CYCLES 128
    24 #define ISO14443A_FRAME_DELAY_PREV1 1236
    25 #define ISO14443A_FRAME_DELAY_PREV0 1172
    26 #define ISO14443A_RX_PENDING_TIMEOUT 1 // ms
    27 
    28 /* Peripheral definitions */
    29 #define CODEC_DEMOD_POWER_PORT PORTB
    30 #define CODEC_DEMOD_POWER_MASK PIN0_bm
    31 #define CODEC_DEMOD_IN_PORT PORTB
    32 #define CODEC_DEMOD_IN_MASK (CODEC_DEMOD_IN_MASK0 | CODEC_DEMOD_IN_MASK1)
    33 #define CODEC_DEMOD_IN_MASK0 PIN1_bm
    34 #define CODEC_DEMOD_IN_MASK1 PIN2_bm
    35 #define CODEC_DEMOD_IN_PINCTRL0 PIN1CTRL
    36 #define CODEC_DEMOD_IN_PINCTRL1 PIN2CTRL
    37 #define CODEC_DEMOD_IN_EVMUX0 EVSYS_CHMUX_PORTB_PIN1_gc
    38 #define CODEC_DEMOD_IN_EVMUX1 EVSYS_CHMUX_PORTB_PIN2_gc
    39 #define CODEC_DEMOD_IN_INT0_VECT PORTB_INT0_vect
    40 #define CODEC_LOADMOD_PORT PORTC
    41 #define CODEC_LOADMOD_MASK PIN6_bm
    42 #define CODEC_CARRIER_IN_PORT PORTC
    43 #define CODEC_CARRIER_IN_MASK PIN2_bm
    44 #define CODEC_CARRIER_IN_PINCTRL PIN2CTRL
    45 #define CODEC_CARRIER_IN_EVMUX EVSYS_CHMUX_PORTC_PIN2_gc
    46 #define CODEC_CARRIER_IN_DIV 2 /* external clock division factor */
    47 #define CODEC_SUBCARRIER_PORT PORTC
    48 #define CODEC_SUBCARRIER_MASK_PSK PIN4_bm
    49 #define CODEC_SUBCARRIER_MASK_OOK PIN5_bm
    50 #define CODEC_SUBCARRIER_MASK (CODEC_SUBCARRIER_MASK_PSK | CODEC_SUBCARRIER_MASK_OOK)
    51 #define CODEC_SUBCARRIER_TIMER TCC1
    52 #define CODEC_SUBCARRIER_CC_PSK CCA
    53 #define CODEC_SUBCARRIER_CC_OOK CCB
    54 #define CODEC_SUBCARRIER_CCEN_PSK TC1_CCAEN_bm
    55 #define CODEC_SUBCARRIER_CCEN_OOK TC1_CCBEN_bm
    56 #define CODEC_TIMER_SAMPLING TCD0
    57 #define CODEC_TIMER_SAMPLING_CCA_VECT TCD0_CCA_vect
    58 #define CODEC_TIMER_SAMPLING_CCB_VECT TCD0_CCB_vect
    59 #define CODEC_TIMER_LOADMOD TCE0
    60 #define CODEC_TIMER_LOADMOD_OVF_VECT TCE0_OVF_vect
    61 #define CODEC_TIMER_LOADMOD_CCA_VECT TCE0_CCA_vect
    62 #define CODEC_TIMER_LOADMOD_CCB_VECT TCE0_CCB_vect
    63 #define CODEC_TIMER_LOADMOD_CCC_VECT TCE0_CCC_vect
    64 #define CODEC_TIMER_MODSTART_EVSEL TC_EVSEL_CH0_gc
    65 #define CODEC_TIMER_MODEND_EVSEL TC_EVSEL_CH1_gc
    66 #define CODEC_TIMER_CARRIER_CLKSEL TC_CLKSEL_EVCH6_gc
    67 #define CODEC_READER_TIMER TCC0
    68 #define CODEC_READER_PORT PORTC
    69 #define CODEC_READER_MASK_LEFT PIN0_bm
    70 #define CODEC_READER_MASK_RIGHT PIN1_bm
    71 #define CODEC_READER_MASK (CODEC_READER_MASK_LEFT | CODEC_READER_MASK_RIGHT)
    72 #define CODEC_READER_PINCTRL_LEFT PIN0CTRL
    73 #define CODEC_READER_PINCTRL_RIGHT PIN1CTRL
    74 #define CODEC_AC_DEMOD_SETTINGS AC_HSMODE_bm | AC_HYSMODE_NO_gc
    75 #define CODEC_MAXIMUM_THRESHOLD 0xFFF // the maximum voltage can be calculated with ch0data * Vref / 0xFFF
    76 #define CODEC_THRESHOLD_CALIBRATE_MIN 128
    77 #define CODEC_THRESHOLD_CALIBRATE_MAX 1024
    78 #define CODEC_THRESHOLD_CALIBRATE_STEPS 8
    79 #define CODEC_TIMER_TIMESTAMPS TCD1
    80 #define CODEC_TIMER_TIMESTAMPS_CCA_VECT TCD1_CCA_vect
    81 
    82 #define CODEC_BUFFER_SIZE 256
    83 
    84 #define CODEC_CARRIER_FREQ 13560000
    85 
    86 #define Codec8Reg0 GPIOR0
    87 #define Codec8Reg1 GPIOR1
    88 #define Codec8Reg2 GPIOR2
    89 #define Codec8Reg3 GPIOR3
    90 #define CodecCount16Register1 (*((volatile uint16_t*) &GPIOR4)) /* GPIOR4 & GPIOR5 */
    91 #define CodecCount16Register2 (*((volatile uint16_t*) &GPIOR6)) /* GPIOR4 & GPIOR5 */
    92 #define CodecPtrRegister1 (*((volatile uint8_t**) &GPIOR8))
    93 #define CodecPtrRegister2 (*((volatile uint8_t**) &GPIORA))
    94 
    95 extern uint16_t ReaderThreshold;
    96 extern uint16_t Reader_FWT;
    97 
    98 #define FWI2FWT(x) ((uint32_t)(256 * 16 * ((uint32_t)1 << (x))) / (CODEC_CARRIER_FREQ / 1000) + 1)
    99 
    100 typedef enum {
    101  CODEC_SUBCARRIERMOD_OFF,
    102  CODEC_SUBCARRIERMOD_OOK
    103 } SubcarrierModType;
    104 
    105 extern uint8_t CodecBuffer[CODEC_BUFFER_SIZE];
    106 
    107 INLINE void CodecInit(void) {
    108  ActiveConfiguration.CodecInitFunc();
    109 }
    110 
    111 INLINE void CodecDeInit(void) {
    112  ActiveConfiguration.CodecDeInitFunc();
    113 }
    114 
    115 INLINE void CodecTask(void) {
    116  ActiveConfiguration.CodecTaskFunc();
    117 }
    118 
    119 /* Helper Functions for Codec implementations */
    120 INLINE void CodecInitCommon(void)
    121 {
    122  /* Configure CARRIER input pin and route it to EVSYS.
    123  * Multiply by 2 again by using both edges when externally
    124  * dividing by 2 */
    125 #if CODEC_CARRIER_IN_DIV == 2
    126  CODEC_CARRIER_IN_PORT.CODEC_CARRIER_IN_PINCTRL = PORT_ISC_BOTHEDGES_gc;
    127 #else
    128 #error Option not supported
    129 #endif
    130  CODEC_CARRIER_IN_PORT.DIRCLR = CODEC_CARRIER_IN_MASK;
    131  EVSYS.CH6MUX = CODEC_CARRIER_IN_EVMUX;
    132 
    133  /* Configure two DEMOD pins for input.
    134  * Configure event channel 0 for rising edge (begin of modulation pause)
    135  * Configure event channel 1 for falling edge (end of modulation pause) */
    136  CODEC_DEMOD_POWER_PORT.OUTCLR = CODEC_DEMOD_POWER_MASK;
    137  CODEC_DEMOD_POWER_PORT.DIRSET = CODEC_DEMOD_POWER_MASK;
    138  CODEC_DEMOD_IN_PORT.DIRCLR = CODEC_DEMOD_IN_MASK;
    139  CODEC_DEMOD_IN_PORT.CODEC_DEMOD_IN_PINCTRL0 = PORT_ISC_RISING_gc;
    140  CODEC_DEMOD_IN_PORT.CODEC_DEMOD_IN_PINCTRL1 = PORT_ISC_FALLING_gc;
    141  CODEC_DEMOD_IN_PORT.INT0MASK = 0;
    142  CODEC_DEMOD_IN_PORT.INTCTRL = PORT_INT0LVL_HI_gc;
    143  EVSYS.CH0MUX = CODEC_DEMOD_IN_EVMUX0;
    144  EVSYS.CH1MUX = CODEC_DEMOD_IN_EVMUX1;
    145 
    146  /* Configure loadmod pin configuration and use a virtual port configuration
    147  * for single instruction cycle access */
    148  CODEC_LOADMOD_PORT.DIRSET = CODEC_LOADMOD_MASK;
    149  CODEC_LOADMOD_PORT.OUTCLR = CODEC_LOADMOD_MASK;
    150  PORTCFG.VPCTRLA &= ~PORTCFG_VP0MAP_gm;
    151  PORTCFG.VPCTRLA |= PORTCFG_VP02MAP_PORTC_gc;
    152 
    153  /* Configure subcarrier pins for output */
    154  CODEC_SUBCARRIER_PORT.DIRSET = CODEC_SUBCARRIER_MASK;
    155  CODEC_SUBCARRIER_PORT.OUTCLR = CODEC_SUBCARRIER_MASK;
    156 
    157  /* Configure pins for reader field with the LEFT output being inverted
    158  * and all bridge outputs static high */
    159  CODEC_READER_PORT.CODEC_READER_PINCTRL_LEFT = PORT_INVEN_bm;
    160  CODEC_READER_PORT.OUTCLR = CODEC_READER_MASK_LEFT;
    161  CODEC_READER_PORT.OUTSET = CODEC_READER_MASK_RIGHT;
    162  CODEC_READER_PORT.DIRSET = CODEC_READER_MASK;
    163 
    164  /* Configure timer for generating reader field and configure AWEX for outputting pattern
    165  * with disabled outputs. */
    166  CODEC_READER_TIMER.CTRLB = TC0_CCAEN_bm | TC_WGMODE_SINGLESLOPE_gc;
    167  CODEC_READER_TIMER.PER = F_CPU / CODEC_CARRIER_FREQ - 1;
    168  CODEC_READER_TIMER.CCA = F_CPU / CODEC_CARRIER_FREQ / 2 ;
    169 
    170  AWEXC.OUTOVEN = 0x00;
    171  AWEXC.CTRL = AWEX_CWCM_bm | AWEX_DTICCAEN_bm | AWEX_DTICCBEN_bm;
    172 
    173  /* Configure DAC for the reference voltage */
    174  DACB.EVCTRL = 0;
    175  DACB.CTRLB = DAC_CHSEL_SINGLE_gc;
    176  DACB.CTRLC = DAC_REFSEL_AVCC_gc;
    177  DACB.CTRLA = DAC_IDOEN_bm | DAC_ENABLE_bm;
    178  DACB.CH0DATA = ReaderThreshold; // real threshold voltage can be calculated with ch0data * Vref / 0xFFF
    179 
    180  /* Configure Analog Comparator 0 to detect changes in demodulated reader field */
    181  ACA.AC0MUXCTRL = AC_MUXPOS_DAC_gc | AC_MUXNEG_PIN7_gc;
    182  ACA.AC0CTRL = CODEC_AC_DEMOD_SETTINGS;
    183 
    184  /* Configure Analog Comparator 1 to detect SOC */
    185  ACA.AC1MUXCTRL = AC_MUXPOS_DAC_gc | AC_MUXNEG_PIN7_gc;
    186  ACA.AC1CTRL = CODEC_AC_DEMOD_SETTINGS;
    187 }
    188 
    189 INLINE void CodecSetSubcarrier(SubcarrierModType ModType, uint16_t Divider)
    190 {
    191  if (ModType == CODEC_SUBCARRIERMOD_OFF) {
    192  CODEC_SUBCARRIER_TIMER.CTRLA = TC_CLKSEL_OFF_gc;
    193  CODEC_SUBCARRIER_TIMER.CTRLB = 0;
    194  } else if (ModType == CODEC_SUBCARRIERMOD_OOK) {
    195  /* Configure subcarrier generation with 50% DC output using OOK */
    196  CODEC_SUBCARRIER_TIMER.CNT = 0;
    197  CODEC_SUBCARRIER_TIMER.PER = Divider - 1;
    198  CODEC_SUBCARRIER_TIMER.CODEC_SUBCARRIER_CC_OOK = Divider/2;
    199  CODEC_SUBCARRIER_TIMER.CTRLB = CODEC_SUBCARRIER_CCEN_OOK | TC_WGMODE_SINGLESLOPE_gc;
    200  }
    201 }
    202 
    203 INLINE void CodecStartSubcarrier(void)
    204 {
    205  CODEC_SUBCARRIER_TIMER.CTRLA = CODEC_TIMER_CARRIER_CLKSEL;
    206 }
    207 
    208 INLINE void CodecSetDemodPower(bool bOnOff)
    209 {
    210  if (bOnOff) {
    211  CODEC_DEMOD_POWER_PORT.OUTSET = CODEC_DEMOD_POWER_MASK;
    212  } else {
    213  CODEC_DEMOD_POWER_PORT.OUTCLR = CODEC_DEMOD_POWER_MASK;
    214  }
    215 }
    216 
    217 INLINE bool CodecGetLoadmodState(void) {
    218  if (ACA.STATUS & AC_AC0STATE_bm) {
    219  return true;
    220  } else {
    221  return false;
    222  }
    223 }
    224 
    225 INLINE void CodecSetLoadmodState(bool bOnOff) {
    226  if (bOnOff) {
    227  VPORT0.OUT |= CODEC_LOADMOD_MASK;
    228  } else {
    229  VPORT0.OUT &= ~CODEC_LOADMOD_MASK;
    230  }
    231 }
    232 
    233 INLINE void CodecSetReaderField(bool bOnOff) { // this is the function for turning on/off the reader field dumbly; before using this function, please consider to use CodecReaderField{Start,Stop}
    234 
    235  if (bOnOff) {
    236  /* Start timer for field generation and unmask outputs */
    237  CODEC_READER_TIMER.CTRLA = TC_CLKSEL_DIV1_gc;
    238  AWEXC.OUTOVEN = CODEC_READER_MASK;
    239  } else {
    240  /* Disable outputs of AWEX and stop field generation */
    241  AWEXC.OUTOVEN = 0x00;
    242  CODEC_READER_TIMER.CTRLA = TC_CLKSEL_OFF_gc;
    243  }
    244 }
    245 
    246 INLINE bool CodecGetReaderField(void) {
    247  return (CODEC_READER_TIMER.CTRLA == TC_CLKSEL_DIV1_gc) && (AWEXC.OUTOVEN == CODEC_READER_MASK);
    248 }
    249 
    250 void CodecReaderFieldStart(void);
    251 void CodecReaderFieldStop(void);
    252 bool CodecIsReaderFieldReady(void);
    253 
    254 void CodecReaderFieldRestart(uint16_t delay);
    255 #define FIELD_RESTART() CodecReaderFieldRestart(100)
    256 bool CodecIsReaderToBeRestarted(void);
    257 
    258 void CodecThresholdSet(uint16_t th);
    259 uint16_t CodecThresholdIncrement(void);
    260 void CodecThresholdReset(void);
    261 #endif /* CODEC_H_ */
    void(* CodecInitFunc)(void)
    Definition: Configuration.h:57
    void(* CodecTaskFunc)(void)
    Definition: Configuration.h:63
    void(* CodecDeInitFunc)(void)
    Definition: Configuration.h:59
    diff --git a/Doc/Doxygen/html/_command_line_8h_source.html b/Doc/Doxygen/html/_command_line_8h_source.html index 7d4e21c..8103e14 100644 --- a/Doc/Doxygen/html/_command_line_8h_source.html +++ b/Doc/Doxygen/html/_command_line_8h_source.html @@ -92,7 +92,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    1 /*
    2  * CommandLine.h
    3  *
    4  * Created on: 04.05.2013
    5  * Author: skuser
    6  */
    7 
    8 #ifndef COMMANDLINE_H_
    9 #define COMMANDLINE_H_
    10 
    11 #include "Terminal.h"
    12 #include "Commands.h"
    13 
    14 void CommandLineInit(void);
    15 bool CommandLineProcessByte(uint8_t Byte);
    16 void CommandLineTick(void);
    17 
    18 void CommandLineAppendData(void const * const Buffer, uint16_t Bytes);
    19 
    20 /* Functions for timeout commands */
    21 void CommandLinePendingTaskFinished(CommandStatusIdType ReturnStatusID, char const * const OutMessage); // must be called, when the intended task is finished
    22 extern void (*CommandLinePendingTaskTimeout) (void); // gets called on timeout to end the pending task
    23 void CommandLinePendingTaskBreak(void); // this manually triggers a timeout
    24 
    25 #endif /* COMMANDLINE_H_ */
    diff --git a/Doc/Doxygen/html/_command_line_8txt.html b/Doc/Doxygen/html/_command_line_8txt.html index a98d19c..bb8b61f 100644 --- a/Doc/Doxygen/html/_command_line_8txt.html +++ b/Doc/Doxygen/html/_command_line_8txt.html @@ -88,7 +88,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Doc/Doxygen/html/_commands_8h_source.html b/Doc/Doxygen/html/_commands_8h_source.html index 4aad8e9..450438c 100644 --- a/Doc/Doxygen/html/_commands_8h_source.html +++ b/Doc/Doxygen/html/_commands_8h_source.html @@ -89,10 +89,10 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    Commands.h
    -
    1 
    2 
    3 #ifndef COMMANDS_H_
    4 #define COMMANDS_H_
    5 
    6 #include "../Common.h"
    7 
    8 #define MAX_COMMAND_LENGTH 16
    9 #define MAX_STATUS_LENGTH 32
    10 
    11 
    12 #define COMMAND_INFO_OK_ID 100
    13 #define COMMAND_INFO_OK "OK"
    14 #define COMMAND_INFO_OK_WITH_TEXT_ID 101
    15 #define COMMAND_INFO_OK_WITH_TEXT "OK WITH TEXT"
    16 #define COMMAND_INFO_XMODEM_WAIT_ID 110
    17 #define COMMAND_INFO_XMODEM_WAIT "WAITING FOR XMODEM"
    18 #define COMMAND_INFO_FALSE_ID 120
    19 #define COMMAND_INFO_FALSE "FALSE"
    20 #define COMMAND_INFO_TRUE_ID 121
    21 #define COMMAND_INFO_TRUE "TRUE"
    22 #define COMMAND_ERR_UNKNOWN_CMD_ID 200
    23 #define COMMAND_ERR_UNKNOWN_CMD "UNKNOWN COMMAND"
    24 #define COMMAND_ERR_INVALID_USAGE_ID 201
    25 #define COMMAND_ERR_INVALID_USAGE "INVALID COMMAND USAGE"
    26 #define COMMAND_ERR_INVALID_PARAM_ID 202
    27 #define COMMAND_ERR_INVALID_PARAM "INVALID PARAMETER"
    28 #define COMMAND_ERR_TIMEOUT_ID 203
    29 #define COMMAND_ERR_TIMEOUT "TIMEOUT"
    30 #define TIMEOUT_COMMAND 255 // this is just for the CommandLine module to know that this is a timeout command
    31 
    32 
    33 #define COMMAND_CHAR_TRUE '1'
    34 #define COMMAND_CHAR_FALSE '0'
    35 #define COMMAND_CHAR_SUGGEST '?' /* <CMD>=? for help */
    36 
    37 #define COMMAND_UID_BUFSIZE 32
    38 
    39 #define COMMAND_IS_SUGGEST_STRING(x) ( ((x)[0] == COMMAND_CHAR_SUGGEST) && ((x)[1] == '\0') )
    40 
    41 typedef uint8_t CommandStatusIdType;
    42 typedef const char CommandStatusMessageType[MAX_STATUS_LENGTH];
    43 
    44 typedef CommandStatusIdType (*CommandExecFuncType) (char* OutMessage);
    45 typedef CommandStatusIdType (*CommandExecParamFuncType) (char* OutMessage, const char* InParams);
    46 typedef CommandStatusIdType (*CommandSetFuncType) (char* OutMessage, const char* InParam);
    47 typedef CommandStatusIdType (*CommandGetFuncType) (char* OutParam);
    48 
    49 typedef struct {
    50  char Command[MAX_COMMAND_LENGTH];
    51  CommandExecFuncType ExecFunc;
    52  CommandExecParamFuncType ExecParamFunc;
    53  CommandSetFuncType SetFunc;
    54  CommandGetFuncType GetFunc;
    55 } CommandEntryType;
    56 
    57 #define COMMAND_VERSION "VERSION"
    58 CommandStatusIdType CommandGetVersion(char* OutParam);
    59 
    60 #define COMMAND_CONFIG "CONFIG"
    61 CommandStatusIdType CommandGetConfig(char* OutParam);
    62 CommandStatusIdType CommandSetConfig(char* OutMessage, const char* InParam);
    63 
    64 #define COMMAND_UID "UID"
    65 #define COMMAND_UID_RANDOM "RANDOM"
    66 CommandStatusIdType CommandGetUid(char* OutParam);
    67 CommandStatusIdType CommandSetUid(char* OutMessage, const char* InParam);
    68 
    69 #define COMMAND_READONLY "READONLY"
    70 CommandStatusIdType CommandGetReadOnly(char* OutParam);
    71 CommandStatusIdType CommandSetReadOnly(char* OutMessage, const char* InParam);
    72 
    73 #define COMMAND_UPLOAD "UPLOAD"
    74 CommandStatusIdType CommandExecUpload(char* OutMessage);
    75 
    76 #define COMMAND_DOWNLOAD "DOWNLOAD"
    77 CommandStatusIdType CommandExecDownload(char* OutMessage);
    78 
    79 #define COMMAND_RESET "RESET"
    80 CommandStatusIdType CommandExecReset(char* OutMessage);
    81 
    82 #define COMMAND_UPGRADE "UPGRADE"
    83 CommandStatusIdType CommandExecUpgrade(char* OutMessage);
    84 
    85 #define COMMAND_MEMSIZE "MEMSIZE"
    86 CommandStatusIdType CommandGetMemSize(char* OutParam);
    87 
    88 #define COMMAND_UIDSIZE "UIDSIZE"
    89 CommandStatusIdType CommandGetUidSize(char* OutParam);
    90 
    91 #define COMMAND_RBUTTON "RBUTTON"
    92 CommandStatusIdType CommandGetRButton(char* OutParam);
    93 CommandStatusIdType CommandSetRButton(char* OutMessage, const char* InParam);
    94 
    95 #define COMMAND_RBUTTON_LONG "RBUTTON_LONG"
    96 CommandStatusIdType CommandGetRButtonLong(char* OutParam);
    97 CommandStatusIdType CommandSetRButtonLong(char* OutMessage, const char* InParam);
    98 
    99 #define COMMAND_LBUTTON "LBUTTON"
    100 CommandStatusIdType CommandGetLButton(char* OutParam);
    101 CommandStatusIdType CommandSetLButton(char* OutMessage, const char* InParam);
    102 
    103 #define COMMAND_LBUTTON_LONG "LBUTTON_LONG"
    104 CommandStatusIdType CommandGetLButtonLong(char* OutParam);
    105 CommandStatusIdType CommandSetLButtonLong(char* OutMessage, const char* InParam);
    106 
    107 
    108 #define COMMAND_LEDGREEN "LEDGREEN"
    109 CommandStatusIdType CommandGetLedGreen(char* OutParam);
    110 CommandStatusIdType CommandSetLedGreen(char* OutMessage, const char* InParam);
    111 
    112 #define COMMAND_LEDRED "LEDRED"
    113 CommandStatusIdType CommandGetLedRed(char* OutParam);
    114 CommandStatusIdType CommandSetLedRed(char* OutMessage, const char* InParam);
    115 
    116 #define COMMAND_LOGMODE "LOGMODE"
    117 CommandStatusIdType CommandGetLogMode(char* OutParam);
    118 CommandStatusIdType CommandSetLogMode(char* OutMessage, const char* InParam);
    119 
    120 #define COMMAND_LOGMEM "LOGMEM"
    121 CommandStatusIdType CommandGetLogMem(char* OutParam);
    122 
    123 #define COMMAND_LOGDOWNLOAD "LOGDOWNLOAD"
    124 CommandStatusIdType CommandExecLogDownload(char* OutMessage);
    125 
    126 #define COMMAND_STORELOG "LOGSTORE"
    127 CommandStatusIdType CommandExecStoreLog(char* OutMessage);
    128 
    129 #define COMMAND_LOGCLEAR "LOGCLEAR"
    130 CommandStatusIdType CommandExecLogClear(char* OutMessage);
    131 
    132 #define COMMAND_SETTING "SETTING"
    133 CommandStatusIdType CommandGetSetting(char* OutParam);
    134 CommandStatusIdType CommandSetSetting(char* OutMessage, const char* InParam);
    135 
    136 #define COMMAND_CLEAR "CLEAR"
    137 CommandStatusIdType CommandExecClear(char* OutMessage);
    138 
    139 #define COMMAND_STORE "STORE"
    140 CommandStatusIdType CommandExecStore(char* OutMessage);
    141 
    142 #define COMMAND_RECALL "RECALL"
    143 CommandStatusIdType CommandExecRecall(char* OutMessage);
    144 
    145 #define COMMAND_CHARGING "CHARGING"
    146 CommandStatusIdType CommandGetCharging(char* OutParam);
    147 
    148 #define COMMAND_HELP "HELP"
    149 CommandStatusIdType CommandExecHelp(char* OutMessage);
    150 
    151 #define COMMAND_RSSI "RSSI"
    152 CommandStatusIdType CommandGetRssi(char* OutParam);
    153 
    154 #define COMMAND_SYSTICK "SYSTICK"
    155 CommandStatusIdType CommandGetSysTick(char* OutParam);
    156 
    157 #define COMMAND_SEND_RAW "SEND_RAW"
    158 CommandStatusIdType CommandExecParamSendRaw(char* OutMessage, const char* InParams);
    159 
    160 #define COMMAND_SEND "SEND"
    161 CommandStatusIdType CommandExecParamSend(char* OutMessage, const char* InParams);
    162 
    163 #define COMMAND_GETUID "GETUID"
    164 CommandStatusIdType CommandExecGetUid(char* OutMessage);
    165 
    166 #define COMMAND_DUMP_MFU "DUMP_MFU"
    167 CommandStatusIdType CommandExecDumpMFU(char* OutMessage);
    168 
    169 #define COMMAND_IDENTIFY_CARD "IDENTIFY"
    170 CommandStatusIdType CommandExecIdentifyCard(char* OutMessage);
    171 
    172 #define COMMAND_TIMEOUT "TIMEOUT"
    173 CommandStatusIdType CommandGetTimeout(char* OutMessage);
    174 CommandStatusIdType CommandSetTimeout(char* OutMessage, const char* InParam);
    175 
    176 #define COMMAND_THRESHOLD "THRESHOLD"
    177 CommandStatusIdType CommandGetThreshold(char* OutParam);
    178 CommandStatusIdType CommandSetThreshold(char* OutMessage, const char* InParam);
    179 
    180 #define COMMAND_FIELD "FIELD"
    181 CommandStatusIdType CommandSetField(char* OutMessage, const char* InParam);
    182 CommandStatusIdType CommandGetField(char* OutMessage);
    183 
    184 #define COMMAND_LIST_END ""
    185 /* Defines the end of command list. This is no actual command */
    186 
    187 #endif /* COMMANDS_H_ */
    +
    1 
    2 
    3 #ifndef COMMANDS_H_
    4 #define COMMANDS_H_
    5 
    6 #include "../Common.h"
    7 
    8 #define MAX_COMMAND_LENGTH 16
    9 #define MAX_STATUS_LENGTH 32
    10 
    11 
    12 #define COMMAND_INFO_OK_ID 100
    13 #define COMMAND_INFO_OK "OK"
    14 #define COMMAND_INFO_OK_WITH_TEXT_ID 101
    15 #define COMMAND_INFO_OK_WITH_TEXT "OK WITH TEXT"
    16 #define COMMAND_INFO_XMODEM_WAIT_ID 110
    17 #define COMMAND_INFO_XMODEM_WAIT "WAITING FOR XMODEM"
    18 #define COMMAND_INFO_FALSE_ID 120
    19 #define COMMAND_INFO_FALSE "FALSE"
    20 #define COMMAND_INFO_TRUE_ID 121
    21 #define COMMAND_INFO_TRUE "TRUE"
    22 #define COMMAND_ERR_UNKNOWN_CMD_ID 200
    23 #define COMMAND_ERR_UNKNOWN_CMD "UNKNOWN COMMAND"
    24 #define COMMAND_ERR_INVALID_USAGE_ID 201
    25 #define COMMAND_ERR_INVALID_USAGE "INVALID COMMAND USAGE"
    26 #define COMMAND_ERR_INVALID_PARAM_ID 202
    27 #define COMMAND_ERR_INVALID_PARAM "INVALID PARAMETER"
    28 #define COMMAND_ERR_TIMEOUT_ID 203
    29 #define COMMAND_ERR_TIMEOUT "TIMEOUT"
    30 #define TIMEOUT_COMMAND 255 // this is just for the CommandLine module to know that this is a timeout command
    31 
    32 
    33 #define COMMAND_CHAR_TRUE '1'
    34 #define COMMAND_CHAR_FALSE '0'
    35 #define COMMAND_CHAR_SUGGEST '?' /* <CMD>=? for help */
    36 
    37 #define COMMAND_UID_BUFSIZE 32
    38 
    39 #define COMMAND_IS_SUGGEST_STRING(x) ( ((x)[0] == COMMAND_CHAR_SUGGEST) && ((x)[1] == '\0') )
    40 
    41 typedef uint8_t CommandStatusIdType;
    42 typedef const char CommandStatusMessageType[MAX_STATUS_LENGTH];
    43 
    44 typedef CommandStatusIdType (*CommandExecFuncType) (char* OutMessage);
    45 typedef CommandStatusIdType (*CommandExecParamFuncType) (char* OutMessage, const char* InParams);
    46 typedef CommandStatusIdType (*CommandSetFuncType) (char* OutMessage, const char* InParam);
    47 typedef CommandStatusIdType (*CommandGetFuncType) (char* OutParam);
    48 
    49 typedef struct {
    50  char Command[MAX_COMMAND_LENGTH];
    51  CommandExecFuncType ExecFunc;
    52  CommandExecParamFuncType ExecParamFunc;
    53  CommandSetFuncType SetFunc;
    54  CommandGetFuncType GetFunc;
    55 } CommandEntryType;
    56 
    57 #define COMMAND_VERSION "VERSION"
    58 CommandStatusIdType CommandGetVersion(char* OutParam);
    59 
    60 #define COMMAND_CONFIG "CONFIG"
    61 CommandStatusIdType CommandGetConfig(char* OutParam);
    62 CommandStatusIdType CommandSetConfig(char* OutMessage, const char* InParam);
    63 
    64 #define COMMAND_UID "UID"
    65 #define COMMAND_UID_RANDOM "RANDOM"
    66 CommandStatusIdType CommandGetUid(char* OutParam);
    67 CommandStatusIdType CommandSetUid(char* OutMessage, const char* InParam);
    68 
    69 #define COMMAND_READONLY "READONLY"
    70 CommandStatusIdType CommandGetReadOnly(char* OutParam);
    71 CommandStatusIdType CommandSetReadOnly(char* OutMessage, const char* InParam);
    72 
    73 #define COMMAND_UPLOAD "UPLOAD"
    74 CommandStatusIdType CommandExecUpload(char* OutMessage);
    75 
    76 #define COMMAND_DOWNLOAD "DOWNLOAD"
    77 CommandStatusIdType CommandExecDownload(char* OutMessage);
    78 
    79 #define COMMAND_RESET "RESET"
    80 CommandStatusIdType CommandExecReset(char* OutMessage);
    81 
    82 #define COMMAND_UPGRADE "UPGRADE"
    83 CommandStatusIdType CommandExecUpgrade(char* OutMessage);
    84 
    85 #define COMMAND_MEMSIZE "MEMSIZE"
    86 CommandStatusIdType CommandGetMemSize(char* OutParam);
    87 
    88 #define COMMAND_UIDSIZE "UIDSIZE"
    89 CommandStatusIdType CommandGetUidSize(char* OutParam);
    90 
    91 #define COMMAND_RBUTTON "RBUTTON"
    92 CommandStatusIdType CommandGetRButton(char* OutParam);
    93 CommandStatusIdType CommandSetRButton(char* OutMessage, const char* InParam);
    94 
    95 #define COMMAND_RBUTTON_LONG "RBUTTON_LONG"
    96 CommandStatusIdType CommandGetRButtonLong(char* OutParam);
    97 CommandStatusIdType CommandSetRButtonLong(char* OutMessage, const char* InParam);
    98 
    99 #define COMMAND_LBUTTON "LBUTTON"
    100 CommandStatusIdType CommandGetLButton(char* OutParam);
    101 CommandStatusIdType CommandSetLButton(char* OutMessage, const char* InParam);
    102 
    103 #define COMMAND_LBUTTON_LONG "LBUTTON_LONG"
    104 CommandStatusIdType CommandGetLButtonLong(char* OutParam);
    105 CommandStatusIdType CommandSetLButtonLong(char* OutMessage, const char* InParam);
    106 
    107 
    108 #define COMMAND_LEDGREEN "LEDGREEN"
    109 CommandStatusIdType CommandGetLedGreen(char* OutParam);
    110 CommandStatusIdType CommandSetLedGreen(char* OutMessage, const char* InParam);
    111 
    112 #define COMMAND_LEDRED "LEDRED"
    113 CommandStatusIdType CommandGetLedRed(char* OutParam);
    114 CommandStatusIdType CommandSetLedRed(char* OutMessage, const char* InParam);
    115 
    116 #define COMMAND_LOGMODE "LOGMODE"
    117 CommandStatusIdType CommandGetLogMode(char* OutParam);
    118 CommandStatusIdType CommandSetLogMode(char* OutMessage, const char* InParam);
    119 
    120 #define COMMAND_LOGMEM "LOGMEM"
    121 CommandStatusIdType CommandGetLogMem(char* OutParam);
    122 
    123 #define COMMAND_LOGDOWNLOAD "LOGDOWNLOAD"
    124 CommandStatusIdType CommandExecLogDownload(char* OutMessage);
    125 
    126 #define COMMAND_STORELOG "LOGSTORE"
    127 CommandStatusIdType CommandExecStoreLog(char* OutMessage);
    128 
    129 #define COMMAND_LOGCLEAR "LOGCLEAR"
    130 CommandStatusIdType CommandExecLogClear(char* OutMessage);
    131 
    132 #define COMMAND_SETTING "SETTING"
    133 CommandStatusIdType CommandGetSetting(char* OutParam);
    134 CommandStatusIdType CommandSetSetting(char* OutMessage, const char* InParam);
    135 
    136 #define COMMAND_CLEAR "CLEAR"
    137 CommandStatusIdType CommandExecClear(char* OutMessage);
    138 
    139 #define COMMAND_STORE "STORE"
    140 CommandStatusIdType CommandExecStore(char* OutMessage);
    141 
    142 #define COMMAND_RECALL "RECALL"
    143 CommandStatusIdType CommandExecRecall(char* OutMessage);
    144 
    145 #define COMMAND_CHARGING "CHARGING"
    146 CommandStatusIdType CommandGetCharging(char* OutParam);
    147 
    148 #define COMMAND_HELP "HELP"
    149 CommandStatusIdType CommandExecHelp(char* OutMessage);
    150 
    151 #define COMMAND_RSSI "RSSI"
    152 CommandStatusIdType CommandGetRssi(char* OutParam);
    153 
    154 #define COMMAND_SYSTICK "SYSTICK"
    155 CommandStatusIdType CommandGetSysTick(char* OutParam);
    156 
    157 #define COMMAND_SEND_RAW "SEND_RAW"
    158 CommandStatusIdType CommandExecParamSendRaw(char* OutMessage, const char* InParams);
    159 
    160 #define COMMAND_SEND "SEND"
    161 CommandStatusIdType CommandExecParamSend(char* OutMessage, const char* InParams);
    162 
    163 #define COMMAND_GETUID "GETUID"
    164 CommandStatusIdType CommandExecGetUid(char* OutMessage);
    165 
    166 #define COMMAND_DUMP_MFU "DUMP_MFU"
    167 CommandStatusIdType CommandExecDumpMFU(char* OutMessage);
    168 
    169 #define COMMAND_IDENTIFY_CARD "IDENTIFY"
    170 CommandStatusIdType CommandExecIdentifyCard(char* OutMessage);
    171 
    172 #define COMMAND_TIMEOUT "TIMEOUT"
    173 CommandStatusIdType CommandGetTimeout(char* OutMessage);
    174 CommandStatusIdType CommandSetTimeout(char* OutMessage, const char* InParam);
    175 
    176 #define COMMAND_THRESHOLD "THRESHOLD"
    177 CommandStatusIdType CommandGetThreshold(char* OutParam);
    178 CommandStatusIdType CommandSetThreshold(char* OutMessage, const char* InParam);
    179 
    180 #define COMMAND_AUTOCALIBRATE "AUTOCALIBRATE"
    181 CommandStatusIdType CommandExecAutocalibrate(char* OutMessage);
    182 
    183 #define COMMAND_FIELD "FIELD"
    184 CommandStatusIdType CommandSetField(char* OutMessage, const char* InParam);
    185 CommandStatusIdType CommandGetField(char* OutMessage);
    186 
    187 #define COMMAND_LIST_END ""
    188 /* Defines the end of command list. This is no actual command */
    189 
    190 #endif /* COMMANDS_H_ */
    diff --git a/Doc/Doxygen/html/_common_8h_source.html b/Doc/Doxygen/html/_common_8h_source.html index 299755f..c94e4c0 100644 --- a/Doc/Doxygen/html/_common_8h_source.html +++ b/Doc/Doxygen/html/_common_8h_source.html @@ -92,7 +92,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    1 /*
    2  * Common.h
    3  *
    4  * Created on: 20.03.2013
    5  * Author: skuser
    6  */
    7 
    8 #ifndef COMMON_H_
    9 #define COMMON_H_
    10 
    11 #include <stdio.h>
    12 #include <stdbool.h>
    13 #include <util/parity.h>
    14 #include <util/delay.h>
    15 #include <avr/pgmspace.h>
    16 #include <avr/io.h>
    17 
    18 #define ODD_PARITY(Value) OddParityBit(Value)//(parity_even_bit(Value) ? 0 : 1)
    19 
    20 #define INLINE \
    21  static inline __attribute__((always_inline))
    22 
    23 #define ARRAY_COUNT(x) \
    24  (sizeof(x) / sizeof(x[0]))
    25 
    26 #define NIBBLE_TO_HEXCHAR(x) ( (x) < 0x0A ? (x) + '0' : (x) + 'A' - 0x0A )
    27 #define HEXCHAR_TO_NIBBLE(x) ( (x) < 'A' ? (x) - '0' : (x) - 'A' + 0x0A )
    28 #define VALID_HEXCHAR(x) ( ( (x) >= '0' && (x) <= '9' ) || ( (x) >= 'A' && (x) <= 'F' ) )
    29 #define MIN(x,y) ( (x) < (y) ? (x) : (y) )
    30 #define MAX(x,y) ( (x) > (y) ? (x) : (y) )
    31 #define SYSTICK_DIFF(since) ((uint16_t) (SystemGetSysTick() - since))
    32 #define SYSTICK_DIFF_100MS(since) (SYSTICK_DIFF(since) / 100)
    33 
    34 #define BITS_PER_BYTE 8
    35 
    36 uint16_t BufferToHexString(char* HexOut, uint16_t MaxChars, const void* Buffer, uint16_t ByteCount);
    37 uint16_t HexStringToBuffer(void* Buffer, uint16_t MaxBytes, const char* HexIn);
    38 
    39 INLINE uint8_t BitReverseByte(uint8_t Byte)
    40 {
    41  extern const uint8_t PROGMEM BitReverseByteTable[];
    42 
    43  return pgm_read_byte(&BitReverseByteTable[Byte]);
    44 }
    45 
    46 INLINE uint8_t OddParityBit(uint8_t Byte)
    47 {
    48  extern const uint8_t PROGMEM OddParityByteTable[];
    49 
    50  return pgm_read_byte(&OddParityByteTable[Byte]);
    51 }
    52 
    53 INLINE uint8_t StringLength(const char* Str, uint8_t MaxLen)
    54 {
    55  uint8_t StrLen = 0;
    56 
    57  while(MaxLen > 0) {
    58  if (*Str++ == '\0')
    59  break;
    60 
    61  MaxLen--;
    62  StrLen++;
    63  }
    64 
    65  return StrLen;
    66 }
    67 
    68 #endif /* COMMON_H_ */
    diff --git a/Doc/Doxygen/html/_configuration_8h.html b/Doc/Doxygen/html/_configuration_8h.html index e453781..9fd5290 100644 --- a/Doc/Doxygen/html/_configuration_8h.html +++ b/Doc/Doxygen/html/_configuration_8h.html @@ -104,7 +104,7 @@ Classes diff --git a/Doc/Doxygen/html/_configuration_8h_source.html b/Doc/Doxygen/html/_configuration_8h_source.html index 6337398..8826b97 100644 --- a/Doc/Doxygen/html/_configuration_8h_source.html +++ b/Doc/Doxygen/html/_configuration_8h_source.html @@ -96,7 +96,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Doc/Doxygen/html/_configurations_8txt.html b/Doc/Doxygen/html/_configurations_8txt.html index 53f85c2..0ba4168 100644 --- a/Doc/Doxygen/html/_configurations_8txt.html +++ b/Doc/Doxygen/html/_configurations_8txt.html @@ -88,7 +88,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Doc/Doxygen/html/_crypto1_8h_source.html b/Doc/Doxygen/html/_crypto1_8h_source.html index a4ecd53..ca9aca4 100644 --- a/Doc/Doxygen/html/_crypto1_8h_source.html +++ b/Doc/Doxygen/html/_crypto1_8h_source.html @@ -89,10 +89,10 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    Crypto1.h
    -
    1 #ifndef CRYPTO1_H
    2 #define CRYPTO1_H
    3 
    4 #include <stdint.h>
    5 #include <stdbool.h>
    6 
    7 /* Gets the current keystream-bit, without shifting the internal LFSR */
    8 uint8_t Crypto1FilterOutput(void);
    9 
    10 /* Set up Crypto1 cipher using the given Key, Uid and CardNonce. Also encrypts
    11  * the CardNonce in-place while in non-linear mode. */
    12 void Crypto1Setup(uint8_t Key[6], uint8_t Uid[4], uint8_t CardNonce[4]);
    13 
    14 /* Set up Crypto1 cipher using the given Key, Uid and CardNonce. Nested indicates
    15  * whether the CardNonce is encrypted (true) or not (false).
    16  * If the CardNonce is encrypted, it will we decrypted in-place. If not, it will
    17  * be fed into the LFSR, but remains unchanged. */
    18 void Crypto1SetupReader(uint8_t Key[6], uint8_t Uid[4], uint8_t CardNonce[4], bool Nested);
    19 
    20 /* Load the decrypted ReaderNonce into the Crypto1 state LFSR */
    21 void Crypto1Auth(uint8_t EncryptedReaderNonce[4]);
    22 
    23 /* Generate 8 Bits of key stream */
    24 uint8_t Crypto1Byte(void);
    25 
    26 /* Generate 4 Bits of key stream */
    27 uint8_t Crypto1Nibble(void);
    28 
    29 /* Execute 'ClockCount' cycles on the PRNG state 'State' */
    30 void Crypto1PRNG(uint8_t State[4], uint16_t ClockCount);
    31 
    32 /* Encrypts buffer with consideration of parity bits */
    33 void Crypto1EncryptWithParity(uint8_t * Buffer, uint16_t BitCount);
    34 
    35 /* Encrypts buffer with LFSR feedback within reader nonce and considers parity bits */
    36 void Crypto1ReaderAuthWithParity(uint8_t PlainReaderAnswerWithParityBits[9]);
    37 
    38 #endif //CRYPTO1_H
    +
    1 #ifndef CRYPTO1_H
    2 #define CRYPTO1_H
    3 
    4 #include <stdint.h>
    5 #include <stdbool.h>
    6 
    7 void Crypto1GetState(uint8_t* pEven, uint8_t* pOdd);
    8 
    9 /* Gets the current keystream-bit, without shifting the internal LFSR */
    10 uint8_t Crypto1FilterOutput(void);
    11 
    12 /* Set up Crypto1 cipher using the given Key, Uid and CardNonce. Also encrypts
    13  * the CardNonce in-place while in non-linear mode. */
    14 void Crypto1Setup(uint8_t Key[6], uint8_t Uid[4], uint8_t CardNonce[4]);
    15 /* Same for nested auth. CardNonce[4]..[7] will contain the parity bits after return */
    16 void Crypto1SetupNested(uint8_t Key[6], uint8_t Uid[4], uint8_t CardNonce[8], bool Decrypt);
    17 
    18 /* Load the decrypted ReaderNonce into the Crypto1 state LFSR */
    19 void Crypto1Auth(uint8_t EncryptedReaderNonce[4]);
    20 
    21 /* Generate 8 Bits of key stream */
    22 uint8_t Crypto1Byte(void);
    23 
    24 /* Encrypt/Decrypt array */
    25 void Crypto1ByteArray(uint8_t* Buffer, uint8_t Count);
    26 void Crypto1ByteArrayWithParity(uint8_t* Buffer, uint8_t Count);
    27 
    28 /* Generate 4 Bits of key stream */
    29 uint8_t Crypto1Nibble(void);
    30 
    31 /* Execute 'ClockCount' cycles on the PRNG state 'State' */
    32 void Crypto1PRNG(uint8_t State[4], uint8_t ClockCount);
    33 
    34 /* Encrypts buffer with consideration of parity bits */
    35 void Crypto1EncryptWithParity(uint8_t * Buffer, uint8_t BitCount);
    36 
    37 /* Encrypts buffer with LFSR feedback within reader nonce and considers parity bits */
    38 void Crypto1ReaderAuthWithParity(uint8_t PlainReaderAnswerWithParityBits[9]);
    39 
    40 #endif //CRYPTO1_H
    diff --git a/Doc/Doxygen/html/_getting_started_8txt.html b/Doc/Doxygen/html/_getting_started_8txt.html index 7732bf4..51ee229 100644 --- a/Doc/Doxygen/html/_getting_started_8txt.html +++ b/Doc/Doxygen/html/_getting_started_8txt.html @@ -88,7 +88,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Doc/Doxygen/html/_i_s_o14443-2_a_8h_source.html b/Doc/Doxygen/html/_i_s_o14443-2_a_8h_source.html index af31680..c9ba1c1 100644 --- a/Doc/Doxygen/html/_i_s_o14443-2_a_8h_source.html +++ b/Doc/Doxygen/html/_i_s_o14443-2_a_8h_source.html @@ -92,7 +92,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    1 /*
    2  * ISO14443-2A.h
    3  *
    4  * Created on: 18.02.2013
    5  * Author: skuser
    6  */
    7 
    8 #ifndef ISO14443_2A_H_
    9 #define ISO14443_2A_H_
    10 
    11 #include "Codec.h"
    12 
    13 #define ISO14443A_APP_NO_RESPONSE 0x0000
    14 #define ISO14443A_APP_CUSTOM_PARITY 0x1000
    15 
    16 #define ISO14443A_BUFFER_PARITY_OFFSET (CODEC_BUFFER_SIZE/2)
    17 
    18 /* Codec Interface */
    19 void ISO14443ACodecInit(void);
    20 void ISO14443ACodecDeInit(void);
    21 void ISO14443ACodecTask(void);
    22 
    23 
    24 
    25 #endif
    diff --git a/Doc/Doxygen/html/_i_s_o14443-3_a_8h_source.html b/Doc/Doxygen/html/_i_s_o14443-3_a_8h_source.html index f9a1ea5..1a377a1 100644 --- a/Doc/Doxygen/html/_i_s_o14443-3_a_8h_source.html +++ b/Doc/Doxygen/html/_i_s_o14443-3_a_8h_source.html @@ -92,7 +92,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    1 /*
    2  * ISO14443-2A.h
    3  *
    4  * Created on: 19.03.2013
    5  * Author: skuser
    6  */
    7 
    8 #ifndef ISO14443_3A_H_
    9 #define ISO14443_3A_H_
    10 
    11 #include "../Common.h"
    12 #include <string.h>
    13 
    14 #define ISO14443A_UID_SIZE_SINGLE 4 /* bytes */
    15 #define ISO14443A_UID_SIZE_DOUBLE 7
    16 #define ISO14443A_UID_SIZE_TRIPLE 10
    17 
    18 #define ISO14443A_CMD_REQA 0x26
    19 #define ISO14443A_CMD_WUPA 0x52
    20 #define ISO14443A_CMD_SELECT_CL1 0x93
    21 #define ISO14443A_CMD_SELECT_CL2 0x95
    22 #define ISO14443A_CMD_SELECT_CL3 0x97
    23 #define ISO14443A_CMD_HLTA 0x50
    24 
    25 #define ISO14443A_NVB_AC_START 0x20
    26 #define ISO14443A_NVB_AC_END 0x70
    27 
    28 #define ISO14443A_CL_UID_OFFSET 0
    29 #define ISO14443A_CL_UID_SIZE 4
    30 #define ISO14443A_CL_BCC_OFFSET 4
    31 #define ISO14443A_CL_BCC_SIZE 1 /* Byte */
    32 #define ISO14443A_CL_FRAME_SIZE ((ISO14443A_CL_UID_SIZE + ISO14443A_CL_BCC_SIZE) * 8) /* UID[N...N+3] || BCCN */
    33 #define ISO14443A_SAK_INCOMPLETE 0x04
    34 #define ISO14443A_SAK_COMPLETE_COMPLIANT 0x20
    35 #define ISO14443A_SAK_COMPLETE_NOT_COMPLIANT 0x00
    36 
    37 #define ISO14443A_ATQA_FRAME_SIZE (2 * 8) /* Bit */
    38 #define ISO14443A_SAK_FRAME_SIZE (3 * 8) /* Bit */
    39 
    40 #define ISO14443A_UID0_RANDOM 0x08
    41 #define ISO14443A_UID0_CT 0x88
    42 
    43 #define ISO14443A_CRCA_SIZE 2
    44 
    45 #define ISO14443A_CALC_BCC(ByteBuffer) \
    46  ( ByteBuffer[0] ^ ByteBuffer[1] ^ ByteBuffer[2] ^ ByteBuffer[3] )
    47 
    48 void ISO14443AAppendCRCA(void* Buffer, uint16_t ByteCount);
    49 bool ISO14443ACheckCRCA(const void* Buffer, uint16_t ByteCount);
    50 
    51 INLINE bool ISO14443ASelect(void* Buffer, uint16_t* BitCount, uint8_t* UidCL, uint8_t SAKValue);
    52 INLINE bool ISO14443AWakeUp(void* Buffer, uint16_t* BitCount, uint16_t ATQAValue, bool FromHalt);
    53 
    54 INLINE
    55 bool ISO14443ASelect(void* Buffer, uint16_t* BitCount, uint8_t* UidCL, uint8_t SAKValue)
    56 {
    57  uint8_t* DataPtr = (uint8_t*) Buffer;
    58  uint8_t NVB = DataPtr[1];
    59  //uint8_t CollisionByteCount = (NVB >> 4) & 0x0F;
    60  //uint8_t CollisionBitCount = (NVB >> 0) & 0x0F;
    61 
    62  switch (NVB) {
    63  case ISO14443A_NVB_AC_START:
    64  /* Start of anticollision procedure.
    65  * Send whole UID CLn + BCC */
    66  DataPtr[0] = UidCL[0];
    67  DataPtr[1] = UidCL[1];
    68  DataPtr[2] = UidCL[2];
    69  DataPtr[3] = UidCL[3];
    70  DataPtr[4] = ISO14443A_CALC_BCC(DataPtr);
    71 
    72  *BitCount = ISO14443A_CL_FRAME_SIZE;
    73 
    74  return false;
    75 
    76  case ISO14443A_NVB_AC_END:
    77  /* End of anticollision procedure.
    78  * Send SAK CLn if we are selected. */
    79  if ( (DataPtr[2] == UidCL[0]) &&
    80  (DataPtr[3] == UidCL[1]) &&
    81  (DataPtr[4] == UidCL[2]) &&
    82  (DataPtr[5] == UidCL[3]) ) {
    83 
    84  DataPtr[0] = SAKValue;
    85  ISO14443AAppendCRCA(Buffer, 1);
    86 
    87  *BitCount = ISO14443A_SAK_FRAME_SIZE;
    88  return true;
    89  } else {
    90  /* We have not been selected. Don't send anything. */
    91  *BitCount = 0;
    92  return false;
    93  }
    94  default:
    95  {
    96  uint8_t CollisionByteCount = ((NVB >> 4) & 0x0f) - 2;
    97  uint8_t CollisionBitCount = (NVB >> 0) & 0x0f;
    98  uint8_t mask = 0xFF >> (8 - CollisionBitCount);
    99  // Since the UidCL does not contain the BCC, we have to distinguish here
    100  if (
    101  ((CollisionByteCount == 5 || (CollisionByteCount == 4 && CollisionBitCount > 0)) && memcmp(UidCL, &DataPtr[2], 4) == 0 && (ISO14443A_CALC_BCC(UidCL) & mask) == (DataPtr[6] & mask))
    102  ||
    103  (CollisionByteCount == 4 && CollisionBitCount == 0 && memcmp(UidCL, &DataPtr[2], 4) == 0)
    104  ||
    105  (CollisionByteCount < 4 && memcmp(UidCL, &DataPtr[2], CollisionByteCount) == 0 && (UidCL[CollisionByteCount] & mask) == (DataPtr[CollisionByteCount + 2] & mask))
    106  )
    107  {
    108  DataPtr[0] = UidCL[0];
    109  DataPtr[1] = UidCL[1];
    110  DataPtr[2] = UidCL[2];
    111  DataPtr[3] = UidCL[3];
    112  DataPtr[4] = ISO14443A_CALC_BCC(DataPtr);
    113 
    114  *BitCount = ISO14443A_CL_FRAME_SIZE;
    115  } else {
    116  *BitCount = 0;
    117  }
    118  return false;
    119  }
    120  /* TODO: No anticollision supported */
    121  *BitCount = 0;
    122  return false;
    123  }
    124 }
    125 
    126 INLINE
    127 bool ISO14443AWakeUp(void* Buffer, uint16_t* BitCount, uint16_t ATQAValue, bool FromHalt)
    128 {
    129  uint8_t* DataPtr = (uint8_t*) Buffer;
    130 
    131  if ( ((! FromHalt) && (DataPtr[0] == ISO14443A_CMD_REQA)) ||
    132  (DataPtr[0] == ISO14443A_CMD_WUPA) ){
    133  DataPtr[0] = (ATQAValue >> 0) & 0x00FF;
    134  DataPtr[1] = (ATQAValue >> 8) & 0x00FF;
    135 
    136  *BitCount = ISO14443A_ATQA_FRAME_SIZE;
    137 
    138  return true;
    139  } else {
    140  *BitCount = 0;
    141 
    142  return false;
    143  }
    144 }
    145 
    146 #endif
    diff --git a/Doc/Doxygen/html/_l_e_d_8h_source.html b/Doc/Doxygen/html/_l_e_d_8h_source.html index 7e74e2e..91db7d8 100644 --- a/Doc/Doxygen/html/_l_e_d_8h_source.html +++ b/Doc/Doxygen/html/_l_e_d_8h_source.html @@ -92,7 +92,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    1 /*
    2  * LED.h
    3  *
    4  * Created on: 10.02.2013
    5  * Author: skuser
    6  */
    7 
    8 #ifndef LED_H
    9 #define LED_H
    10 
    11 #include <avr/io.h>
    12 #include "Common.h"
    13 
    14 #define LED_PORT PORTA
    15 #define LED_GREEN PIN4_bm
    16 #define LED_RED PIN3_bm
    17 #define LED_MASK (LED_GREEN | LED_RED)
    18 
    19 typedef enum LEDFunctionEnum {
    20  LED_NO_FUNC = 0, /* Don't light up the LED */
    21  LED_POWERED, /* Light up the LED whenever the Chameleon is powered */
    22 
    23  LED_TERMINAL_CONN, /* A Terminal/USB connection has been established */
    24  LED_TERMINAL_RXTX, /* There is traffic on the terminal */
    25 
    26  LED_SETTING_CHANGE, /* Outputs a blink code that shows the current setting */
    27 
    28  LED_MEMORY_STORED, /* Blink once when memory has been stored to flash */
    29  LED_MEMORY_CHANGED, /* Switch LED on when card memory has changed compared to flash */
    30 
    31  LED_FIELD_DETECTED, /* Shows LED while a reader field is being detected or turned on by the chameleon itself */
    32 
    33  LED_CODEC_RX, /* Blink LED when receiving codec data */
    34  LED_CODEC_TX, /* Blink LED when transmitting codec data */
    35 
    36  LED_LOG_MEM_FULL, /* Light up if log memory is full. */
    37 
    38  //TODO: LED_APP_SELECTED, /* Show LED while the correct UID has been selected and the application is active */
    39  /* Has to be last element */
    40  LED_FUNC_COUNT
    41 } LEDHookEnum;
    42 
    43 typedef enum LEDActionEnum {
    44  LED_NO_ACTION = 0x00,
    45  LED_OFF = 0x10,
    46  LED_ON = 0x11,
    47  LED_TOGGLE = 0x12,
    48  LED_PULSE = 0x13,
    49  LED_BLINK = 0x20,
    50  LED_BLINK_1X = 0x20,
    51  LED_BLINK_2X, /* Have to be sequentially ordered */
    52  LED_BLINK_3X,
    53  LED_BLINK_4X,
    54  LED_BLINK_5X,
    55  LED_BLINK_6X,
    56  LED_BLINK_7X,
    57  LED_BLINK_8X,
    58 } LEDActionEnum;
    59 
    60 
    61 
    62 void LEDInit(void);
    63 void LEDTick(void);
    64 
    65 void LEDGetFuncList(char* List, uint16_t BufferSize);
    66 void LEDSetFuncById(uint8_t Mask, LEDHookEnum Func);
    67 void LEDGetFuncByName(uint8_t Mask, char* Function, uint16_t BufferSize);
    68 bool LEDSetFuncByName(uint8_t Mask, const char* Function);
    69 
    70 #endif /* LED_H */
    diff --git a/Doc/Doxygen/html/_l_e_d_8txt.html b/Doc/Doxygen/html/_l_e_d_8txt.html index 82ed094..8a937d1 100644 --- a/Doc/Doxygen/html/_l_e_d_8txt.html +++ b/Doc/Doxygen/html/_l_e_d_8txt.html @@ -88,7 +88,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Doc/Doxygen/html/_l_e_d_hook_8h_source.html b/Doc/Doxygen/html/_l_e_d_hook_8h_source.html index 1df309b..6beecb4 100644 --- a/Doc/Doxygen/html/_l_e_d_hook_8h_source.html +++ b/Doc/Doxygen/html/_l_e_d_hook_8h_source.html @@ -93,7 +93,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Doc/Doxygen/html/_l_e_ds_8txt.html b/Doc/Doxygen/html/_l_e_ds_8txt.html index 93dd998..ad40217 100644 --- a/Doc/Doxygen/html/_l_e_ds_8txt.html +++ b/Doc/Doxygen/html/_l_e_ds_8txt.html @@ -88,7 +88,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Doc/Doxygen/html/_l_u_f_a_config_8h.html b/Doc/Doxygen/html/_l_u_f_a_config_8h.html index 03c046f..b05e7e7 100644 --- a/Doc/Doxygen/html/_l_u_f_a_config_8h.html +++ b/Doc/Doxygen/html/_l_u_f_a_config_8h.html @@ -101,7 +101,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Doc/Doxygen/html/_l_u_f_a_config_8h_source.html b/Doc/Doxygen/html/_l_u_f_a_config_8h_source.html index 4781d47..688bc81 100644 --- a/Doc/Doxygen/html/_l_u_f_a_config_8h_source.html +++ b/Doc/Doxygen/html/_l_u_f_a_config_8h_source.html @@ -92,7 +92,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); Go to the documentation of this file.
    1 /*
    2  LUFA Library
    3  Copyright (C) Dean Camera, 2012.
    4 
    5  dean [at] fourwalledcubicle [dot] com
    6  www.lufa-lib.org
    7 */
    8 
    9 /*
    10  Copyright 2012 Dean Camera (dean [at] fourwalledcubicle [dot] com)
    11 
    12  Permission to use, copy, modify, distribute, and sell this
    13  software and its documentation for any purpose is hereby granted
    14  without fee, provided that the above copyright notice appear in
    15  all copies and that both that the copyright notice and this
    16  permission notice and warranty disclaimer appear in supporting
    17  documentation, and that the name of the author not be used in
    18  advertising or publicity pertaining to distribution of the
    19  software without specific, written prior permission.
    20 
    21  The author disclaim all warranties with regard to this
    22  software, including all implied warranties of merchantability
    23  and fitness. In no event shall the author be liable for any
    24  special, indirect or consequential damages or any damages
    25  whatsoever resulting from loss of use, data or profits, whether
    26  in an action of contract, negligence or other tortious action,
    27  arising out of or in connection with the use or performance of
    28  this software.
    29 */
    30 
    42 #ifndef _LUFA_CONFIG_H_
    43 #define _LUFA_CONFIG_H_
    44 
    45  /* Non-USB Related Configuration Tokens: */
    46 // #define DISABLE_TERMINAL_CODES
    47 
    48  /* USB Class Driver Related Tokens: */
    49 // #define HID_HOST_BOOT_PROTOCOL_ONLY
    50 // #define HID_STATETABLE_STACK_DEPTH {Insert Value Here}
    51 // #define HID_USAGE_STACK_DEPTH {Insert Value Here}
    52 // #define HID_MAX_COLLECTIONS {Insert Value Here}
    53 // #define HID_MAX_REPORTITEMS {Insert Value Here}
    54 // #define HID_MAX_REPORT_IDS {Insert Value Here}
    55 // #define NO_CLASS_DRIVER_AUTOFLUSH
    56 
    57  /* General USB Driver Related Tokens: */
    58  #define USE_STATIC_OPTIONS \
    59  (USB_OPT_BUSEVENT_PRIMED | USB_DEVICE_OPT_FULLSPEED | /*USB_OPT_PLLCLKSRC*/ USB_OPT_RC32MCLKSRC)
    60  #define USB_DEVICE_ONLY
    61 // #define USB_STREAM_TIMEOUT_MS {Insert Value Here}
    62 // #define NO_LIMITED_CONTROLLER_CONNECT
    63 // #define NO_SOF_EVENTS
    64 
    65  /* USB Device Mode Driver Related Tokens: */
    66 // #define USE_RAM_DESCRIPTORS
    67  #define USE_FLASH_DESCRIPTORS
    68 // #define USE_EEPROM_DESCRIPTORS
    69 // #define NO_INTERNAL_SERIAL
    70  #define FIXED_CONTROL_ENDPOINT_SIZE 8
    71 // #define DEVICE_STATE_AS_GPIOR {Insert Value Here}
    72  #define FIXED_NUM_CONFIGURATIONS 1
    73 // #define CONTROL_ONLY_DEVICE
    74  #define MAX_ENDPOINT_INDEX 5
    75 // #define NO_DEVICE_REMOTE_WAKEUP
    76 // #define NO_DEVICE_SELF_POWER
    77 
    78 #endif
    diff --git a/Doc/Doxygen/html/_l_u_f_a_descriptors_8c.html b/Doc/Doxygen/html/_l_u_f_a_descriptors_8c.html index 913b4b0..235c111 100644 --- a/Doc/Doxygen/html/_l_u_f_a_descriptors_8c.html +++ b/Doc/Doxygen/html/_l_u_f_a_descriptors_8c.html @@ -218,7 +218,7 @@ Variables diff --git a/Doc/Doxygen/html/_l_u_f_a_descriptors_8h.html b/Doc/Doxygen/html/_l_u_f_a_descriptors_8h.html index f1d8d49..07e4ff7 100644 --- a/Doc/Doxygen/html/_l_u_f_a_descriptors_8h.html +++ b/Doc/Doxygen/html/_l_u_f_a_descriptors_8h.html @@ -226,7 +226,7 @@ Functions diff --git a/Doc/Doxygen/html/_l_u_f_a_descriptors_8h_source.html b/Doc/Doxygen/html/_l_u_f_a_descriptors_8h_source.html index 4d064b4..4d755de 100644 --- a/Doc/Doxygen/html/_l_u_f_a_descriptors_8h_source.html +++ b/Doc/Doxygen/html/_l_u_f_a_descriptors_8h_source.html @@ -94,7 +94,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Doc/Doxygen/html/_log_8h.html b/Doc/Doxygen/html/_log_8h.html index 43f9a5f..81dde6f 100644 --- a/Doc/Doxygen/html/_log_8h.html +++ b/Doc/Doxygen/html/_log_8h.html @@ -192,7 +192,7 @@ Enumerations diff --git a/Doc/Doxygen/html/_log_8h_source.html b/Doc/Doxygen/html/_log_8h_source.html index 8dbab65..24b4da0 100644 --- a/Doc/Doxygen/html/_log_8h_source.html +++ b/Doc/Doxygen/html/_log_8h_source.html @@ -118,7 +118,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Doc/Doxygen/html/_log_8txt.html b/Doc/Doxygen/html/_log_8txt.html index 4fc35af..2163bf9 100644 --- a/Doc/Doxygen/html/_log_8txt.html +++ b/Doc/Doxygen/html/_log_8txt.html @@ -88,7 +88,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Doc/Doxygen/html/_main_page_8txt.html b/Doc/Doxygen/html/_main_page_8txt.html index 8c17c32..e4a6c97 100644 --- a/Doc/Doxygen/html/_main_page_8txt.html +++ b/Doc/Doxygen/html/_main_page_8txt.html @@ -88,7 +88,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Doc/Doxygen/html/_map_8h_source.html b/Doc/Doxygen/html/_map_8h_source.html index dfec2d7..ab4217f 100644 --- a/Doc/Doxygen/html/_map_8h_source.html +++ b/Doc/Doxygen/html/_map_8h_source.html @@ -92,7 +92,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    1 /*
    2  * Map.h
    3  *
    4  * Created on: 07.12.2014
    5  * Author: sk
    6  */
    7 
    8 #ifndef MAP_H_
    9 #define MAP_H_
    10 
    11 #include <stdint.h>
    12 #include <stdbool.h>
    13 #include <avr/pgmspace.h>
    14 
    15 #define MAP_TEXT_BUF_SIZE 32
    16 #define MAP_MAX_TEXT_SIZE (MAP_TEXT_BUF_SIZE - 1)
    17 
    18 typedef uint8_t MapIdType;
    19 typedef const char* MapTextPtrType;
    20 
    21 const typedef struct {
    22  MapIdType Id;
    23  const char Text[MAP_TEXT_BUF_SIZE];
    24 } MapEntryType;
    25 
    26 bool MapIdToText(const MapEntryType* MapPtr, uint8_t MapSize, MapIdType Id, char* Text, uint16_t MaxBufferSize);
    27 bool MapTextToId(const MapEntryType* MapPtr, uint8_t MapSize, MapTextPtrType Text, MapIdType* IdPtr);
    28 void MapToString(const MapEntryType* MapPtr, uint8_t MapSize, char* String, uint16_t MaxBufferSize);
    29 
    30 #endif /* MAP_H_ */
    diff --git a/Doc/Doxygen/html/_memory_8h_source.html b/Doc/Doxygen/html/_memory_8h_source.html index 55e674e..9608c80 100644 --- a/Doc/Doxygen/html/_memory_8h_source.html +++ b/Doc/Doxygen/html/_memory_8h_source.html @@ -92,7 +92,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    1 /*
    2  * Flash.h
    3  *
    4  * Created on: 20.03.2013
    5  * Author: skuser
    6  */
    7 
    8 #ifndef MEMORY_H_
    9 #define MEMORY_H_
    10 
    11 #define MEMORY_SIZE (FLASH_DATA_SIZE) /* From makefile */
    12 #define MEMORY_INIT_VALUE 0x00
    13 #define MEMORY_SIZE_PER_SETTING 8192
    14 
    15 #ifndef __ASSEMBLER__
    16 #include "Common.h"
    17 
    18 void MemoryInit(void);
    19 void MemoryReadBlock(void* Buffer, uint16_t Address, uint16_t ByteCount);
    20 void MemoryWriteBlock(const void* Buffer, uint16_t Address, uint16_t ByteCount);
    21 void MemoryClear(void);
    22 
    23 
    24 void MemoryRecall(void);
    25 void MemoryStore(void);
    26 
    27 /* For use with XModem */
    28 bool MemoryUploadBlock(void* Buffer, uint32_t BlockAddress, uint16_t ByteCount);
    29 bool MemoryDownloadBlock(void* Buffer, uint32_t BlockAddress, uint16_t ByteCount);
    30 
    31 /* EEPROM functions */
    32 uint16_t WriteEEPBlock(uint16_t Address, const void *SrcPtr, uint16_t ByteCount);
    33 uint16_t ReadEEPBlock(uint16_t Address, void *DestPtr, uint16_t ByteCount);
    34 
    35 #endif /* __ASSEMBLER__ */
    36 
    37 #endif /* MEMORY_H_ */
    diff --git a/Doc/Doxygen/html/_mifare_classic_8h_source.html b/Doc/Doxygen/html/_mifare_classic_8h_source.html index 7b80619..5107be0 100644 --- a/Doc/Doxygen/html/_mifare_classic_8h_source.html +++ b/Doc/Doxygen/html/_mifare_classic_8h_source.html @@ -92,7 +92,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    1 /*
    2  * MifareClassic.h
    3  *
    4  * Created on: 13.05.2013
    5  * Author: skuser
    6  */
    7 
    8 #ifndef MIFARECLASSIC_H_
    9 #define MIFARECLASSIC_H_
    10 
    11 #include "Application.h"
    12 #include "ISO14443-3A.h"
    13 
    14 #define MIFARE_CLASSIC_UID_SIZE ISO14443A_UID_SIZE_SINGLE
    15 #define MIFARE_CLASSIC_1K_MEM_SIZE 1024
    16 #define MIFARE_CLASSIC_4K_MEM_SIZE 4096
    17 
    18 void MifareClassicAppInit1K(void);
    19 void MifareClassicAppInit1K7B(void);
    20 void MifareClassicAppInit4K(void);
    21 void MifareClassicAppReset(void);
    22 void MifareClassicAppTask(void);
    23 
    24 uint16_t MifareClassicAppProcess(uint8_t* Buffer, uint16_t BitCount);
    25 
    26 void MifareClassicGetUid(ConfigurationUidType Uid);
    27 void MifareClassicSetUid(ConfigurationUidType Uid);
    28 
    29 
    30 #endif /* MIFARECLASSIC_H_ */
    diff --git a/Doc/Doxygen/html/_mifare_ultralight_8h_source.html b/Doc/Doxygen/html/_mifare_ultralight_8h_source.html index 3bedf4a..7220b07 100644 --- a/Doc/Doxygen/html/_mifare_ultralight_8h_source.html +++ b/Doc/Doxygen/html/_mifare_ultralight_8h_source.html @@ -92,7 +92,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    1 /*
    2  * MifareUltralight.h
    3  *
    4  * Created on: 20.03.2013
    5  * Author: skuser
    6  */
    7 
    8 #ifndef MIFAREULTRALIGHT_H_
    9 #define MIFAREULTRALIGHT_H_
    10 
    11 #include "Application.h"
    12 #include "ISO14443-3A.h"
    13 
    14 #define MIFARE_ULTRALIGHT_UID_SIZE ISO14443A_UID_SIZE_DOUBLE
    15 #define MIFARE_ULTRALIGHT_MEM_SIZE 64
    16 
    17 void MifareUltralightAppInit(void);
    18 void MifareUltralightAppReset(void);
    19 void MifareUltralightAppTask(void);
    20 
    21 uint16_t MifareUltralightAppProcess(uint8_t* Buffer, uint16_t BitCount);
    22 
    23 void MifareUltralightGetUid(ConfigurationUidType Uid);
    24 void MifareUltralightSetUid(ConfigurationUidType Uid);
    25 
    26 
    27 
    28 #endif /* MIFAREULTRALIGHT_H_ */
    diff --git a/Doc/Doxygen/html/_random_8h_source.html b/Doc/Doxygen/html/_random_8h_source.html index 33bd400..3ea833b 100644 --- a/Doc/Doxygen/html/_random_8h_source.html +++ b/Doc/Doxygen/html/_random_8h_source.html @@ -92,7 +92,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    1 /*
    2  * Random.h
    3  *
    4  * Created on: 22.03.2013
    5  * Author: skuser
    6  */
    7 
    8 #ifndef RANDOM_H_
    9 #define RANDOM_H_
    10 
    11 #include "Common.h"
    12 
    13 void RandomInit(void);
    14 uint8_t RandomGetByte(void);
    15 void RandomGetBuffer(void* Buffer, uint8_t ByteCount);
    16 void RandomTick(void);
    17 
    18 #endif /* RANDOM_H_ */
    diff --git a/Doc/Doxygen/html/_reader14443-2_a_8h_source.html b/Doc/Doxygen/html/_reader14443-2_a_8h_source.html index 2029b17..76d3884 100644 --- a/Doc/Doxygen/html/_reader14443-2_a_8h_source.html +++ b/Doc/Doxygen/html/_reader14443-2_a_8h_source.html @@ -92,7 +92,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    1 /*
    2  * Reader14443-2A.h
    3  *
    4  * Created on: 26.08.2014
    5  * Author: sk
    6  */
    7 
    8 #ifndef READER14443_2A_H_
    9 #define READER14443_2A_H_
    10 
    11 #include "Codec.h"
    12 #include "Terminal/CommandLine.h"
    13 
    14 /* Codec Interface */
    15 void Reader14443ACodecInit(void);
    16 void Reader14443ACodecDeInit(void);
    17 void Reader14443ACodecTask(void);
    18 
    19 /* Application Interface */
    20 void Reader14443ACodecStart(void);
    21 void Reader14443ACodecReset(void);
    22 
    23 #endif /* READER14443_2A_H_ */
    diff --git a/Doc/Doxygen/html/_reader14443_a_8h_source.html b/Doc/Doxygen/html/_reader14443_a_8h_source.html index f9fcaea..f06b2c8 100644 --- a/Doc/Doxygen/html/_reader14443_a_8h_source.html +++ b/Doc/Doxygen/html/_reader14443_a_8h_source.html @@ -89,10 +89,10 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    Reader14443A.h
    -
    1 #ifndef READER14443A_H
    2 #define READER14443A_H
    3 
    4 #include "Application.h"
    5 #include "Codec/Codec.h"
    6 
    7 #define CRC_INIT 0x6363
    8 
    9 uint8_t ReaderSendBuffer[CODEC_BUFFER_SIZE];
    10 uint16_t ReaderSendBitCount;
    11 
    12 void Reader14443AAppInit(void);
    13 void Reader14443AAppReset(void);
    14 void Reader14443AAppTask(void);
    15 void Reader14443AAppTick(void);
    16 void Reader14443AAppTimeout(void);
    17 
    18 uint16_t Reader14443AAppProcess(uint8_t* Buffer, uint16_t BitCount);
    19 
    20 uint16_t addParityBits(uint8_t * Buffer, uint16_t bits);
    21 uint16_t removeParityBits(uint8_t * Buffer, uint16_t BitCount);
    22 uint16_t removeSOC(uint8_t * Buffer, uint16_t BitCount);
    23 bool checkParityBits(uint8_t * Buffer, uint16_t BitCount);
    24 uint16_t ISO14443_CRCA(uint8_t * Buffer, uint8_t ByteCount);
    25 
    26 typedef enum {
    27  Reader14443_Do_Nothing,
    28  Reader14443_Send,
    29  Reader14443_Send_Raw,
    30  Reader14443_Get_UID,
    31  Reader14443_Read_MF_Ultralight,
    32  Reader14443_Identify
    33 } Reader14443Command;
    34 
    35 
    36 #endif //READER14443A_H
    +
    1 #ifndef READER14443A_H
    2 #define READER14443A_H
    3 
    4 #include "Application.h"
    5 #include "Codec/Codec.h"
    6 
    7 #define CRC_INIT 0x6363
    8 
    9 uint8_t ReaderSendBuffer[CODEC_BUFFER_SIZE];
    10 uint16_t ReaderSendBitCount;
    11 
    12 void Reader14443AAppInit(void);
    13 void Reader14443AAppReset(void);
    14 void Reader14443AAppTask(void);
    15 void Reader14443AAppTick(void);
    16 void Reader14443AAppTimeout(void);
    17 
    18 uint16_t Reader14443AAppProcess(uint8_t* Buffer, uint16_t BitCount);
    19 
    20 uint16_t addParityBits(uint8_t * Buffer, uint16_t bits);
    21 uint16_t removeParityBits(uint8_t * Buffer, uint16_t BitCount);
    22 uint16_t removeSOC(uint8_t * Buffer, uint16_t BitCount);
    23 bool checkParityBits(uint8_t * Buffer, uint16_t BitCount);
    24 uint16_t ISO14443_CRCA(uint8_t * Buffer, uint8_t ByteCount);
    25 
    26 typedef enum {
    27  Reader14443_Do_Nothing,
    28  Reader14443_Send,
    29  Reader14443_Send_Raw,
    30  Reader14443_Get_UID,
    31  Reader14443_Autocalibrate,
    32  Reader14443_Read_MF_Ultralight,
    33  Reader14443_Identify
    34 } Reader14443Command;
    35 
    36 
    37 #endif //READER14443A_H
    diff --git a/Doc/Doxygen/html/_reader_8txt.html b/Doc/Doxygen/html/_reader_8txt.html index 103983a..5f83bf3 100644 --- a/Doc/Doxygen/html/_reader_8txt.html +++ b/Doc/Doxygen/html/_reader_8txt.html @@ -88,7 +88,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Doc/Doxygen/html/_settings_8h.html b/Doc/Doxygen/html/_settings_8h.html index a925ea8..26f3a3f 100644 --- a/Doc/Doxygen/html/_settings_8h.html +++ b/Doc/Doxygen/html/_settings_8h.html @@ -107,7 +107,7 @@ Classes diff --git a/Doc/Doxygen/html/_settings_8h_source.html b/Doc/Doxygen/html/_settings_8h_source.html index 352c61f..4422112 100644 --- a/Doc/Doxygen/html/_settings_8h_source.html +++ b/Doc/Doxygen/html/_settings_8h_source.html @@ -100,7 +100,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Doc/Doxygen/html/_settings_8txt.html b/Doc/Doxygen/html/_settings_8txt.html index f388f09..0d9e2d9 100644 --- a/Doc/Doxygen/html/_settings_8txt.html +++ b/Doc/Doxygen/html/_settings_8txt.html @@ -88,7 +88,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Doc/Doxygen/html/_system_8h_source.html b/Doc/Doxygen/html/_system_8h_source.html index 8bb80b0..dbaaaf6 100644 --- a/Doc/Doxygen/html/_system_8h_source.html +++ b/Doc/Doxygen/html/_system_8h_source.html @@ -92,7 +92,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    1 /*
    2  * System.h
    3  *
    4  * Created on: 10.02.2013
    5  * Author: skuser
    6  */
    7 
    8 #ifndef SYSTEM_H
    9 #define SYSTEM_H
    10 
    11 #include <avr/io.h>
    12 #include <avr/pgmspace.h>
    13 #include <avr/interrupt.h>
    14 #include <stddef.h>
    15 #include <stdbool.h>
    16 #include "Common.h"
    17 
    18 #define F_RTC 1000
    19 #define SYSTEM_MILLISECONDS_TO_RTC_CYCLES(x) \
    20  ( (uint16_t) ( (double) F_RTC * x / 1E3 + 0.5) )
    21 
    22 #define SYSTEM_TICK_WIDTH 7 /* Bits */
    23 #define SYSTEM_TICK_PERIOD (1<<7)
    24 #define SYSTEM_TICK_MS (SYSTEM_TICK_PERIOD)
    25 #define SYSTEM_TICK_FREQ (1000 / SYSTEM_TICK_PERIOD)
    26 
    27 #define SYSTEM_SMODE_PSAVE SLEEP_SMODE_PSAVE_gc
    28 #define SYSTEM_SMODE_IDLE SLEEP_SMODE_IDLE_gc
    29 
    30 /* Use GPIORE and GPIORF as global tick register */
    31 #define SYSTEM_TICK_REGISTER (*((volatile uint16_t*) &GPIORE))
    32 
    33 void SystemInit(void);
    34 void SystemReset(void);
    35 void SystemEnterBootloader(void);
    36 void SystemStartUSBClock(void);
    37 void SystemStopUSBClock(void);
    38 void SystemInterruptInit(void);
    39 INLINE bool SystemTick100ms(void);
    40 
    41 INLINE bool SystemTick100ms(void)
    42 {
    43  if (RTC.INTFLAGS & RTC_COMPIF_bm) {
    44  while(RTC.STATUS & RTC_SYNCBUSY_bm)
    45  ;
    46 
    47  RTC.INTFLAGS = RTC_COMPIF_bm;
    48  return true;
    49  }
    50 
    51  return false;
    52 }
    53 
    54 INLINE uint16_t SystemGetSysTick(void) {
    55  return SYSTEM_TICK_REGISTER | RTC.CNT;
    56 }
    57 
    58 #endif /* SYSTEM_H */
    diff --git a/Doc/Doxygen/html/_terminal_8h_source.html b/Doc/Doxygen/html/_terminal_8h_source.html index 8a80b6f..9763df7 100644 --- a/Doc/Doxygen/html/_terminal_8h_source.html +++ b/Doc/Doxygen/html/_terminal_8h_source.html @@ -92,7 +92,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    1 /*
    2  * CommandLine.h
    3  *
    4  * Created on: 10.02.2013
    5  * Author: skuser
    6  */
    7 
    8 #ifndef TERMINAL_H_
    9 #define TERMINAL_H_
    10 
    11 #include "../Common.h"
    12 #include "../LUFA/Drivers/USB/USB.h"
    13 #include "XModem.h"
    14 #include "CommandLine.h"
    15 
    16 #define TERMINAL_VBUS_PORT PORTD
    17 #define TERMINAL_VBUS_MASK PIN5_bm
    18 
    19 #define TERMINAL_BUFFER_SIZE 512
    20 
    21 typedef enum {
    22  TERMINAL_UNINITIALIZED,
    23  TERMINAL_INITIALIZING,
    24  TERMINAL_INITIALIZED,
    25  TERMINAL_UNITIALIZING
    26 } TerminalStateEnum;
    27 
    28 extern uint8_t TerminalBuffer[TERMINAL_BUFFER_SIZE];
    29 extern USB_ClassInfo_CDC_Device_t TerminalHandle;
    30 extern TerminalStateEnum TerminalState;
    31 
    32 void TerminalInit(void);
    33 void TerminalTask(void);
    34 void TerminalTick(void);
    35 
    36 /*void TerminalSendHex(void* Buffer, uint16_t ByteCount);*/
    37 INLINE void TerminalSendByte(uint8_t Byte);
    38 void TerminalSendBlock(const void* Buffer, uint16_t ByteCount);
    39 
    40 INLINE void TerminalSendChar(char c);
    41 void TerminalSendString(const char* s);
    42 void TerminalSendStringP(const char* s);
    43 
    44 void EVENT_USB_Device_Connect(void);
    45 void EVENT_USB_Device_Disconnect(void);
    46 void EVENT_USB_Device_ConfigurationChanged(void);
    47 void EVENT_USB_Device_ControlRequest(void);
    48 
    49 INLINE void TerminalSendChar(char c) { CDC_Device_SendByte(&TerminalHandle, c); }
    50 INLINE void TerminalSendByte(uint8_t Byte) { CDC_Device_SendByte(&TerminalHandle, Byte); }
    51 
    52 #endif /* TERMINAL_H_ */
    diff --git a/Doc/Doxygen/html/_uploading_downloading_8txt.html b/Doc/Doxygen/html/_uploading_downloading_8txt.html index 171ee7d..90d0371 100644 --- a/Doc/Doxygen/html/_uploading_downloading_8txt.html +++ b/Doc/Doxygen/html/_uploading_downloading_8txt.html @@ -88,7 +88,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Doc/Doxygen/html/_x_modem_8h_source.html b/Doc/Doxygen/html/_x_modem_8h_source.html index cc67288..44e54cb 100644 --- a/Doc/Doxygen/html/_x_modem_8h_source.html +++ b/Doc/Doxygen/html/_x_modem_8h_source.html @@ -92,7 +92,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    1 /*
    2  * TerminalXModem.h
    3  *
    4  * Created on: 22.03.2013
    5  * Author: skuser
    6  */
    7 
    8 #ifndef XMODEM_H_
    9 #define XMODEM_H_
    10 
    11 #include "../Common.h"
    12 
    13 typedef bool (*XModemCallbackType) (void* ByteBuffer, uint32_t BlockAddress, uint16_t ByteCount);
    14 
    15 void XModemReceive(XModemCallbackType CallbackFunc);
    16 void XModemSend(XModemCallbackType CallbackFunc);
    17 
    18 bool XModemProcessByte(uint8_t Byte);
    19 void XModemTick(void);
    20 
    21 #endif /* TERMINALXMODEM_H_ */
    diff --git a/Doc/Doxygen/html/annotated.html b/Doc/Doxygen/html/annotated.html index eeb6d83..a98b171 100644 --- a/Doc/Doxygen/html/annotated.html +++ b/Doc/Doxygen/html/annotated.html @@ -96,7 +96,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Doc/Doxygen/html/classes.html b/Doc/Doxygen/html/classes.html index f1b8ee8..a5f2fb9 100644 --- a/Doc/Doxygen/html/classes.html +++ b/Doc/Doxygen/html/classes.html @@ -100,7 +100,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Doc/Doxygen/html/dir_5de29d499bb29a41092979d00d22c134.html b/Doc/Doxygen/html/dir_5de29d499bb29a41092979d00d22c134.html index bea3890..1af58d5 100644 --- a/Doc/Doxygen/html/dir_5de29d499bb29a41092979d00d22c134.html +++ b/Doc/Doxygen/html/dir_5de29d499bb29a41092979d00d22c134.html @@ -96,7 +96,7 @@ Files diff --git a/Doc/Doxygen/html/dir_74b6a3b63f61c160c0f14b7a283a4c9b.html b/Doc/Doxygen/html/dir_74b6a3b63f61c160c0f14b7a283a4c9b.html index 5b3c09a..38e1ef2 100644 --- a/Doc/Doxygen/html/dir_74b6a3b63f61c160c0f14b7a283a4c9b.html +++ b/Doc/Doxygen/html/dir_74b6a3b63f61c160c0f14b7a283a4c9b.html @@ -96,7 +96,7 @@ Directories diff --git a/Doc/Doxygen/html/dir_8465ec698d237f801ae9966d4551fcfa.html b/Doc/Doxygen/html/dir_8465ec698d237f801ae9966d4551fcfa.html index ff0ffd1..5faf79b 100644 --- a/Doc/Doxygen/html/dir_8465ec698d237f801ae9966d4551fcfa.html +++ b/Doc/Doxygen/html/dir_8465ec698d237f801ae9966d4551fcfa.html @@ -112,7 +112,7 @@ Files diff --git a/Doc/Doxygen/html/dir_ddeffaa734f77525428b0dd4068da9cb.html b/Doc/Doxygen/html/dir_ddeffaa734f77525428b0dd4068da9cb.html index db63017..1ae71d0 100644 --- a/Doc/Doxygen/html/dir_ddeffaa734f77525428b0dd4068da9cb.html +++ b/Doc/Doxygen/html/dir_ddeffaa734f77525428b0dd4068da9cb.html @@ -96,7 +96,7 @@ Files diff --git a/Doc/Doxygen/html/dir_f5aab302412c0352d69464400cc5ee44.html b/Doc/Doxygen/html/dir_f5aab302412c0352d69464400cc5ee44.html index 937456c..e9a95e3 100644 --- a/Doc/Doxygen/html/dir_f5aab302412c0352d69464400cc5ee44.html +++ b/Doc/Doxygen/html/dir_f5aab302412c0352d69464400cc5ee44.html @@ -96,7 +96,7 @@ Files diff --git a/Doc/Doxygen/html/files.html b/Doc/Doxygen/html/files.html index d35688e..d6ea409 100644 --- a/Doc/Doxygen/html/files.html +++ b/Doc/Doxygen/html/files.html @@ -122,7 +122,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Doc/Doxygen/html/functions.html b/Doc/Doxygen/html/functions.html index 263fd3a..f4fdd50 100644 --- a/Doc/Doxygen/html/functions.html +++ b/Doc/Doxygen/html/functions.html @@ -147,7 +147,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Doc/Doxygen/html/functions_vars.html b/Doc/Doxygen/html/functions_vars.html index cf4786b..fd8a2eb 100644 --- a/Doc/Doxygen/html/functions_vars.html +++ b/Doc/Doxygen/html/functions_vars.html @@ -147,7 +147,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Doc/Doxygen/html/globals.html b/Doc/Doxygen/html/globals.html index a3fafcc..ec34d5f 100644 --- a/Doc/Doxygen/html/globals.html +++ b/Doc/Doxygen/html/globals.html @@ -235,7 +235,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Doc/Doxygen/html/globals_defs.html b/Doc/Doxygen/html/globals_defs.html index 03c4f3d..d0d3af3 100644 --- a/Doc/Doxygen/html/globals_defs.html +++ b/Doc/Doxygen/html/globals_defs.html @@ -111,7 +111,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Doc/Doxygen/html/globals_enum.html b/Doc/Doxygen/html/globals_enum.html index 374fe0d..f157a12 100644 --- a/Doc/Doxygen/html/globals_enum.html +++ b/Doc/Doxygen/html/globals_enum.html @@ -99,7 +99,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Doc/Doxygen/html/globals_eval.html b/Doc/Doxygen/html/globals_eval.html index 4ebe646..49e85cf 100644 --- a/Doc/Doxygen/html/globals_eval.html +++ b/Doc/Doxygen/html/globals_eval.html @@ -171,7 +171,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Doc/Doxygen/html/globals_func.html b/Doc/Doxygen/html/globals_func.html index 5168afc..f36b85a 100644 --- a/Doc/Doxygen/html/globals_func.html +++ b/Doc/Doxygen/html/globals_func.html @@ -100,7 +100,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Doc/Doxygen/html/globals_vars.html b/Doc/Doxygen/html/globals_vars.html index faeb201..64aebab 100644 --- a/Doc/Doxygen/html/globals_vars.html +++ b/Doc/Doxygen/html/globals_vars.html @@ -111,7 +111,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Doc/Doxygen/html/index.html b/Doc/Doxygen/html/index.html index 9edc4ad..1b091e2 100644 --- a/Doc/Doxygen/html/index.html +++ b/Doc/Doxygen/html/index.html @@ -97,7 +97,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Doc/Doxygen/html/pages.html b/Doc/Doxygen/html/pages.html index 974f3f8..23a4ae1 100644 --- a/Doc/Doxygen/html/pages.html +++ b/Doc/Doxygen/html/pages.html @@ -87,7 +87,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Doc/Doxygen/html/struct_configuration_type-members.html b/Doc/Doxygen/html/struct_configuration_type-members.html index ec16e51..6ecbc70 100644 --- a/Doc/Doxygen/html/struct_configuration_type-members.html +++ b/Doc/Doxygen/html/struct_configuration_type-members.html @@ -105,7 +105,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Doc/Doxygen/html/struct_configuration_type.html b/Doc/Doxygen/html/struct_configuration_type.html index 3efff71..de9b399 100644 --- a/Doc/Doxygen/html/struct_configuration_type.html +++ b/Doc/Doxygen/html/struct_configuration_type.html @@ -322,7 +322,7 @@ Public Attributes diff --git a/Doc/Doxygen/html/struct_settings_entry_type-members.html b/Doc/Doxygen/html/struct_settings_entry_type-members.html index 0455914..0d5b0ea 100644 --- a/Doc/Doxygen/html/struct_settings_entry_type-members.html +++ b/Doc/Doxygen/html/struct_settings_entry_type-members.html @@ -97,7 +97,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Doc/Doxygen/html/struct_settings_entry_type.html b/Doc/Doxygen/html/struct_settings_entry_type.html index d0279ff..68e77c2 100644 --- a/Doc/Doxygen/html/struct_settings_entry_type.html +++ b/Doc/Doxygen/html/struct_settings_entry_type.html @@ -121,7 +121,7 @@ uint16_t  diff --git a/Doc/Doxygen/html/struct_u_s_b___descriptor___configuration__t-members.html b/Doc/Doxygen/html/struct_u_s_b___descriptor___configuration__t-members.html index 4a88225..e0d92b6 100644 --- a/Doc/Doxygen/html/struct_u_s_b___descriptor___configuration__t-members.html +++ b/Doc/Doxygen/html/struct_u_s_b___descriptor___configuration__t-members.html @@ -92,7 +92,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Doc/Doxygen/html/struct_u_s_b___descriptor___configuration__t.html b/Doc/Doxygen/html/struct_u_s_b___descriptor___configuration__t.html index ea6577d..ee41d9d 100644 --- a/Doc/Doxygen/html/struct_u_s_b___descriptor___configuration__t.html +++ b/Doc/Doxygen/html/struct_u_s_b___descriptor___configuration__t.html @@ -95,7 +95,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Doc/DoxygenPages/CommandLine.txt b/Doc/DoxygenPages/CommandLine.txt index df816f0..66e9fef 100644 --- a/Doc/DoxygenPages/CommandLine.txt +++ b/Doc/DoxygenPages/CommandLine.txt @@ -110,10 +110,11 @@ * `SEND_RAW `| Does NOT add parity bits, sends the given byte string and returns the cards answer * `GETUID` | Obtains the UID of a card that is in the range of the antenna and returns it. This command is a \ref Anchor_TimeoutCommands "Timeout command". * `DUMP_MFU` | Reads the whole content of a Mifare Ultralight card that is in the range of the antenna and returns it. This command is a \ref Anchor_TimeoutCommands "Timeout command". - * `IDENTIFY` | Identifies the type of a card in the range of the antenna and returns it. + * `IDENTIFY` | Identifies the type of a card in the range of the antenna and returns it. This command is a \ref Anchor_TimeoutCommands "Timeout command". * `THRESHOLD=?` | Returns the possible number range for the reader threshold. * `THRESHOLD=` | Globally sets the reader threshold. The influences the reader function and range. Setting a wrong value may result in malfunctioning of the reader. DEFAULT: 400 * `THRESHOLD?` | Returns the current reader threshold. + * `AUTOCALIBRATE` | Automatically finds a good threshold for communicating with the card that currently is on top of the Chameleon. This command is a \ref Anchor_TimeoutCommands "Timeout command". * `FIELD?` | Returns whether (1) or not (0) the reader field is active. * `FIELD=[0;1]` | Enables/disables the reader field. * diff --git a/Doc/DoxygenPages/Reader.txt b/Doc/DoxygenPages/Reader.txt index e258657..6f3dabb 100644 --- a/Doc/DoxygenPages/Reader.txt +++ b/Doc/DoxygenPages/Reader.txt @@ -96,4 +96,14 @@ * -# Return code `101:OK WITH TEXT`, the card type and ATQA value, UID value and SAK value of the highest cascade level. * -# Return code `101:OK WITH TEXT`, the information that this card type is unknown to the ChameleonMini ("Unknown card.") and ATQA value, UID value and SAK value of the highest cascade level. * -# Timeout (no matter if on setting/configuration change or on real timeout). + * + * `AUTOCALIBRATE` + * --------------- + * This is a \ref Anchor_TimeoutCommands "timeout command". Tries to select to a card with every threshold within a range with a specific step size and chooses the best threshold. + * + * If this command is called within the reader configuration, it ends in one of the following ways: + * -# Return code `101:OK WITH TEXT` and a list of the tested thresholds with a `+` for every threshold where the select protocol was successful and a `-` if the select protocol was not successfully finished. + * -# Timeout (no matter if on setting/configuration change or on real timeout). + * + * \note If no working threshold was found, the threshold is reset to the standard threshold. */ \ No newline at end of file From e03fa973573ac299737cddaa09f0f9acd5bff8f2 Mon Sep 17 00:00:00 2001 From: Georg Date: Wed, 12 Jul 2017 11:45:59 +0200 Subject: [PATCH 028/104] updated LATEST firmware --- .../Chameleon-Mini/Latest/Chameleon-Mini.eep | 12 +- .../Chameleon-Mini/Latest/Chameleon-Mini.hex | 5644 +++++++++-------- 2 files changed, 2871 insertions(+), 2785 deletions(-) diff --git a/Firmware/Chameleon-Mini/Latest/Chameleon-Mini.eep b/Firmware/Chameleon-Mini/Latest/Chameleon-Mini.eep index 7a69861..239b5c4 100644 --- a/Firmware/Chameleon-Mini/Latest/Chameleon-Mini.eep +++ b/Firmware/Chameleon-Mini/Latest/Chameleon-Mini.eep @@ -1,7 +1,7 @@ -:100000000000642E06060808000004010A00060627 -:100010000808000004010A000606080800000401A0 -:100020000A0006060808000004010A00060608087F -:10003000000004010A0006060808000004010A0086 -:1000400006060808000004010A0006060808000069 -:0400500004010A009D +:1000000000006A2E060608080000040132000606F9 +:100010000808000004013200060608080000040178 +:10002000320006060808000004013200060608082F +:100030000000040132000606080800000401320036 +:100040000606080800000401320006060808000041 +:040050000401320075 :00000001FF diff --git a/Firmware/Chameleon-Mini/Latest/Chameleon-Mini.hex b/Firmware/Chameleon-Mini/Latest/Chameleon-Mini.hex index 96738d0..1c56b47 100644 --- a/Firmware/Chameleon-Mini/Latest/Chameleon-Mini.hex +++ b/Firmware/Chameleon-Mini/Latest/Chameleon-Mini.hex @@ -1,35 +1,35 @@ -:100000000C940E0B0C94330B0C94330B0C94330B9D -:100010000C94330B0C94330B0C94330B0C94330B68 -:100020000C94330B0C94330B0C94620C0C94330B28 -:100030000C94330B0C94330B0C94330B0C94330B48 -:100040000C94330B0C94330B0C94330B0C94330B38 -:100050000C94330B0C94330B0C94330B0C94330B28 -:100060000C94330B0C94330B0C94330B0C94330B18 -:100070000C94330B0C94330B0C94330B0C94330B08 -:100080000C94330B0C94330B0C9495220C94330B7F -:100090000C94330B0C94330B0C94330B0C94330BE8 -:1000A0000C94330B0C94330B0C94330B0C94330BD8 -:1000B0000C94330B0C94330B0C94330B0C9465237E -:1000C0000C94330B0C9427270C94330B0C94330BA8 -:1000D0000C94330B0C94330B0C94330B0C94330BA8 -:1000E0000C94330B0C94330B0C94330B0C94330B98 -:1000F0000C94330B0C94330B0C94330B0C94330B88 -:100100000C94330B0C94330B0C94330B0C94330B77 -:100110000C94330B0C9402270C94330B0C94330B7C -:100120000C94330B0C94330B0C94330B0C94330B57 -:100130000C94330B0C94330B0C94330B0C94CD2296 -:100140000C94CD250C94330B0C94330B0C94330B83 -:100150000C94330B0C9497260C94330B0C94330BA8 -:100160000C94330B0C94330B0C94330B0C94330B17 -:100170000C94330B0C94330B0C94330B0C94330B07 -:100180000C94330B0C94330B0C94330B0C94330BF7 -:100190000C94330B0C94330B0C94330B0C94330BE7 -:1001A0000C94330B0C94330B0C94330B0C94330BD7 -:1001B0000C94330B0C94330B0C94330B0C94330BC7 -:1001C0000C94330B0C94330B0C94330B0C94330BB7 -:1001D0000C94330B0C94330B0C94330B0C94330BA7 -:1001E0000C94330B0C94330B0C94330B0C94330B97 -:1001F0000C94330B0C9428500C94330B1E034300C7 +:100000000C94580B0C947D0B0C947D0B0C947D0B75 +:100010000C947D0B0C947D0B0C947D0B0C947D0B40 +:100020000C947D0B0C947D0B0C94AC0C0C947D0B00 +:100030000C947D0B0C947D0B0C947D0B0C947D0B20 +:100040000C947D0B0C947D0B0C947D0B0C947D0B10 +:100050000C947D0B0C947D0B0C947D0B0C947D0B00 +:100060000C947D0B0C947D0B0C947D0B0C947D0BF0 +:100070000C947D0B0C947D0B0C947D0B0C947D0BE0 +:100080000C947D0B0C947D0B0C941E230C947D0B17 +:100090000C947D0B0C947D0B0C947D0B0C947D0BC0 +:1000A0000C947D0B0C947D0B0C947D0B0C947D0BB0 +:1000B0000C947D0B0C947D0B0C947D0B0C94EE2317 +:1000C0000C947D0B0C94B0270C947D0B0C947D0B41 +:1000D0000C947D0B0C947D0B0C947D0B0C947D0B80 +:1000E0000C947D0B0C947D0B0C947D0B0C947D0B70 +:1000F0000C947D0B0C947D0B0C947D0B0C947D0B60 +:100100000C947D0B0C947D0B0C947D0B0C947D0B4F +:100110000C947D0B0C948B270C947D0B0C947D0B15 +:100120000C947D0B0C947D0B0C947D0B0C947D0B2F +:100130000C947D0B0C947D0B0C947D0B0C9456232E +:100140000C9456260C947D0B0C947D0B0C947D0B1B +:100150000C947D0B0C9420270C947D0B0C947D0B40 +:100160000C947D0B0C947D0B0C947D0B0C947D0BEF +:100170000C947D0B0C947D0B0C947D0B0C947D0BDF +:100180000C947D0B0C947D0B0C947D0B0C947D0BCF +:100190000C947D0B0C947D0B0C947D0B0C947D0BBF +:1001A0000C947D0B0C947D0B0C947D0B0C947D0BAF +:1001B0000C947D0B0C947D0B0C947D0B0C947D0B9F +:1001C0000C947D0B0C947D0B0C947D0B0C947D0B8F +:1001D0000C947D0B0C947D0B0C947D0B0C947D0B7F +:1001E0000C947D0B0C947D0B0C947D0B0C947D0B6F +:1001F0000C947D0B0C940A530C947D0B1E0343004E :10020000680061006D0065006C0065006F006E00A5 :100210002D004D0069006E00690000002A034B00AC :10022000610073007000650072002000260020004D @@ -39,19 +39,19 @@ :10026000001001042402060524060001070582038C :100270000800FF09040100020A000000070504024B :10028000100005070583021000051201100102008D -:100290000008D016B20401000102DC010C0D0D0DA6 -:1002A0000E0D0F0D100D110D120D130D160D170D56 -:1002B0000000000126249224B124D229D829DC2967 -:1002C000120DDD299D2BB02B40000700262492241F -:1002D000B124F02B1D2C212C120D222C1933353377 -:1002E0000004040026249224B124FF2B1D2C212C71 -:1002F000120D222C193335330004070026249224D2 -:10030000B1240E2C1D2C212C120D222C1933353327 -:100310000010040026249224B1240E2C1D2C212C24 -:10032000120D222C19333533001007002624922495 -:10033000B1240F0D100D110D120D130D160D170D0B -:10034000000000014225BB25FA277B427E428B42FA -:100350008C42B142160D170D00000000004E4F4EAA +:100290000008D016B20401000102DC01560D570D12 +:1002A000580D590D5A0D5B0D5C0D5D0D600D610D06 +:1002B00000000001AF241B253A255B2A612A652A2C +:1002C0005C0D662A262C392C40000700AF241B2524 +:1002D0003A25792CA62CAA2C5C0DAB2CA233BE336C +:1002E00000040400AF241B253A25882CA62CAA2C38 +:1002F0005C0DAB2CA233BE3300040700AF241B25DA +:100300003A25972CA62CAA2C5C0DAB2CA233BE331D +:1003100000100400AF241B253A25972CA62CAA2CEC +:100320005C0DAB2CA233BE3300100700AF241B259D +:100330003A25590D5A0D5B0D5C0D5D0D600D610D7B +:1003400000000001CB2544268328044307431443BF +:1003500015433A43600D610D00000000004E4F4E02 :100360004500000000000000000000000000000048 :1003700000000000000000000000000000014D46E9 :100380005F554C5452414C4947485400000000000E @@ -176,8 +176,8 @@ :100AF0007470733A2F2F6769746875622E636F6D17 :100B00002F656D7365632F4368616D656C656F6EEE :100B10004D696E6920636F6D6D69742025530031D6 -:100B200037303632310031353131313500342E39FC -:100B30002E320063626535306261000D0A000D0AD5 +:100B200037303731320031353131313500342E39FB +:100B30002E320033633034333563000D0A000D0A62 :100B4000000D0A000D0A000D0A000D0A0064313084 :100B5000303A4F4B00000000000000000000000091 :100B600000000000000000000000000000006531EF @@ -198,2758 +198,2844 @@ :100C50000000000000CB3230333A54494D454F5527 :100C60005400000000000000000000000000000030 :100C700000000000000056455253494F4E0000004E -:100C8000000000000000000000000000D318434FE7 +:100C80000000000000000000000000001D19434F9C :100C90004E46494700000000000000000000000030 -:100CA0000000FB18F5185549440000000000000042 -:100CB0000000000000000000000051191219524508 +:100CA000000045193F1955494400000000000000AC +:100CB000000000000000000000009B195C19524574 :100CC00041444F4E4C59000000000000000000005D -:100CD0000000AF19A31955504C4F414400000000CB -:100CE000000000000000DC19000000000000444F7C -:100CF000574E4C4F41440000000000000000E11935 +:100CD0000000F919ED1955504C4F41440000000037 +:100CE000000000000000261A000000000000444F31 +:100CF000574E4C4F414400000000000000002B1AEA :100D00000000000000005245534554000000000060 -:100D1000000000000000E61900000000000055502F -:100D20004752414445000000000000000000F11956 +:100D1000000000000000301A0000000000005550E4 +:100D200047524144450000000000000000003B1A0B :100D30000000000000004D454D53495A4500000099 -:100D4000000000000000000000000000FC195549F0 +:100D4000000000000000000000000000461A5549A5 :100D50004453495A45000000000000000000000014 -:100D600000000000141A52425554544F4E00000027 -:100D700000000000000000000000311A2A1A524250 +:100D6000000000005E1A52425554544F4E000000DD +:100D7000000000000000000000007B1A741A5242BC :100D80005554544F4E5F4C4F4E470000000000003A -:100D900000004D1A461A4C425554544F4E00000064 -:100DA00000000000000000000000691A621A4C42B6 +:100D90000000971A901A4C425554544F4E000000D0 +:100DA00000000000000000000000B31AAC1A4C4222 :100DB0005554544F4E5F4C4F4E470000000000000A -:100DC0000000851A7E1A4C4544475245454E0000A6 -:100DD00000000000000000000000A11A9A1A4C4513 +:100DC0000000CF1AC81A4C4544475245454E000012 +:100DD00000000000000000000000EB1AE41A4C457F :100DE00044524544000000000000000000000000E4 -:100DF0000000BD1AB61A4C4F474D4F444500000045 -:100E000000000000000000000000D71AD21A4C4F6A +:100DF0000000071B001B4C4F474D4F4445000000AF +:100E000000000000000000000000211B1C1B4C4FD4 :100E1000474D454D000000000000000000000000AC -:100E200000000000EC1A4C4F47444F574E4C4F41C6 -:100E3000440000000000111B0000000000004C4FA7 -:100E40004753544F52450000000000000000161B9D +:100E200000000000361B4C4F47444F574E4C4F417B +:100E30004400000000005B1B0000000000004C4F5D +:100E40004753544F52450000000000000000601B53 :100E50000000000000004C4F47434C454152000049 -:100E6000000000000000191B0000000000005345B6 +:100E6000000000000000631B00000000000053456C :100E70005454494E470000000000000000000000EC -:100E80000000211B1C1B434C454152000000000088 -:100E90000000000000002A1B000000000000535466 -:100EA0004F524500000000000000000000002E1B13 +:100E800000006B1B661B434C4541520000000000F4 +:100E9000000000000000741B00000000000053541C +:100EA0004F52450000000000000000000000781BC9 :100EB000000000000000524543414C4C000000007F -:100EC000000000000000321B00000000000043484A +:100EC0000000000000007C1B000000000000434800 :100ED000415247494E47000000000000000000005A -:100EE00000000000361B48454C5000000000000088 -:100EF0000000000000003E1B0000000000005253F4 +:100EE00000000000801B48454C500000000000003E +:100EF000000000000000881B0000000000005253AA :100F00005349000000000000000000000000000045 -:100F1000000000007A1B5359535449434B00000012 -:100F2000000000000000000000000000AD1B534561 +:100F100000000000C41B5359535449434B000000C8 +:100F2000000000000000000000000000F71B534517 :100F30004E445F52415700000000000000000000D6 -:100F4000531C0000000053454E4400000000000008 -:100F50000000000000000000C91B00000000474521 -:100F600054554944000000000000000000000F1D1F +:100F40009D1C0000000053454E44000000000000BE +:100F50000000000000000000131C000000004745D6 +:100F60005455494400000000000000000000591DD5 :100F700000000000000044554D505F4D46550000F4 -:100F8000000000000000F21C0000000000004944C6 -:100F9000454E5449465900000000000000002C1D39 +:100F80000000000000003C1D00000000000049447B +:100F9000454E544946590000000000000000761DEF :100FA00000000000000054494D454F55540000001A -:100FB00000000000000000000000691D491D5448A9 +:100FB00000000000000000000000B31D931D544815 :100FC000524553484F4C4400000000000000000010 -:100FD0000000CD1DB51D4649454C440000000000F1 -:100FE00000000000000000000000191E431E000069 -:100FF00000000000000000000000000000000000F1 -:1010000000000000000004000109010000000000D1 -:10101000000000000000000000000000004E5850DA -:10102000000000000000000000000000004D4946E4 -:10103000415245204D696E6900000000000000002B -:1010400000000000000000000000000000000000A0 -:101050000000000000000000000000000000000090 -:10106000000000000000000000000000000400017B -:101070000801000000000000000000000000000067 -:10108000000000004E58500000000000000000006A -:10109000000000004D494641524520436C61737386 -:1010A000696320316B0000000000000000000000B8 -:1010B0000000000000000000000000000000000030 -:1010C0000000000000000000000000000000000020 -:1010D00000000000020001180100000000000000F4 -:1010E00000000000000000000000004E585000000A -:1010F00000000000000000000000004D4946415281 -:101100004520436C617373696320346B00000000F9 -:1011100000000000000000000000000000000000CF -:1011200000000000000000000000000000000000BF -:101130000000000000000000000000440001000169 +:100FD0000000171EFF1D4155544F43414C494252DA +:100FE0004154450000009D1E0000000000004649DD +:100FF000454C44000000000000000000000000001C +:101000000000631E8D1E00000000000000000000B4 +:10101000000000000000000000000000000053413C +:101020004B3A09005549443A0900415451413A09A3 +:10103000005468657265206973206174206C656175 +:101040007374206F6E65206D6F72652063617264CA +:1010500020747970652063616E6469646174652CC5 +:101060002062757420746865726520776173206EE4 +:101070006F7420656E6F756768207465726D696E38 +:10108000616C206275666665722073706163652E9F +:101090000D0A002D0D0A002B0D0A000400010901A4 +:1010A0000000000000000000000000000000000040 +:1010B00000004E585000000000000000000000003A +:1010C00000004D4946415245204D696E69000000BF +:1010D0000000000000000000000000000000000010 +:1010E0000000000000000000000000000000000000 +:1010F00000000000000000000000000000000000F0 +:1011000000000400010801000000000000000000D1 +:101110000000000000000000004E585000000000D9 +:101120000000000000000000004D494641524520EB +:10113000436C617373696320316B00000000000031 :10114000000000000000000000000000000000009F -:1011500000004E5850000000000000000000000099 -:1011600000004D494641524520556C7472616C69CE -:10117000676874000000000000000000000000002C -:10118000000000000000000000000000000000005F -:10119000000000000000000000000000000000004F -:1011A00000004403012001757781028000000000E7 -:1011B0000000000000000005004E58500000000034 -:1011C0000000000000000000004D4946415245204B -:1011D00044455346697265000000000000000000AD -:1011E00000000000000000000000000000000000FF -:1011F00000000000000000000000000000000000EF -:101200000000000000000000004403012001757789 -:1012100081028000000000000000000000000500C6 -:101220004E585000000000000000000000000000C8 -:101230004D49464152452044455346697265204513 -:101240005631000000000000000000000000000017 -:10125000000000000000000000000000000000008E -:10126000000000000000000000000000000000007E -:1012700004030128013877B14A434F50333100004D -:101280000000000000090149424D0000000000007C -:10129000000000000000004A434F503331000000BE -:1012A000000000000000000000000000000000003E -:1012B000000000000000000000000000000000002E -:1012C000000000000000000000000000000000001E -:1012D0000000000000000048000120017877B10202 -:1012E0004A434F5076323431000000000C0149422D -:1012F0004D000000000000000000000000004A4314 -:101300004F5033312076322E342E31000000000051 -:1013100000000000000000000000000000000000CD -:1013200000000000000000000000000000000000BD -:101330000000000000000000000000000000480065 -:101340000120013833B14A434F5034315632320014 -:101350000000000C0149424D0000000000000000A8 -:1013600000000000004A434F5034312076322E32C4 -:10137000000000000000000000000000000000006D -:10138000000000000000000000000000000000005D -:10139000000000000000000000000000000000004D -:1013A000000000000004000128013833B14A434F17 -:1013B000503431563233310000000D0149424D00A6 -:1013C0000000000000000000000000004A434F50F1 -:1013D00034312076322E332E310000000000000020 -:1013E00000000000000000000000000000000000FD -:1013F00000000000000000000000000000000000ED -:10140000000000000000000000000000040001884F -:1014100001000000000000000000000000000000CB -:10142000000000496E66696E656F6E000000000086 -:101430000000004D494641524520436C6173736979 -:101440006320316B0000000000000000000000007D -:10145000000000000000000000000000000000008C -:10146000000000000000000000000000000000007C -:1014700000000002000198010000000000000000D0 -:101480000000000000000000000047656D706C75F2 -:10149000730000000000000000004D50434F530057 -:1014A000000000000000000000000000000000003C -:1014B000000000000000000000000000000000002C -:1014C000000000000000000000000000000000001C -:1014D00000000000000000000000000C01000000FF +:10115000000000000000000000000000000000008F +:101160000000000000000000000200011801000063 +:10117000000000000000000000000000000000006F +:101180004E58500000000000000000000000000069 +:101190004D494641524520436C6173736963203465 +:1011A0006B000000000000000000000000000000D4 +:1011B000000000000000000000000000000000002F +:1011C000000000000000000000000000000000001F +:1011D00044000100010000000000000000000000C9 +:1011E000000000000000004E585000000000000009 +:1011F000000000000000004D494641524520556C5A +:101200007472616C6967687400000000000000007F +:1012100000000000000000000000000000000000CE +:1012200000000000000000000000000000000000BE +:1012300000000000000000440301200175778102D6 +:1012400080000000000000000000000005004E5873 +:1012500050000000000000000000000000004D49A8 +:1012600046415245204445534669726500000000DE +:10127000000000000000000000000000000000006E +:10128000000000000000000000000000000000005E +:101290000000000000000000000000000000440307 +:1012A000012001757781028000000000000000002D +:1012B00000000005004E5850000000000000000033 +:1012C00000000000004D4946415245204445534628 +:1012D00069726520455631000000000000000000E2 +:1012E00000000000000000000000000000000000FE +:1012F00000000000000000000000000000000000EE +:10130000000000000004030128013877B14A434F70 +:1013100050333100000000000000090149424D0037 +:101320000000000000000000000000004A434F5091 +:101330003331000000000000000000000000000049 +:10134000000000000000000000000000000000009D +:10135000000000000000000000000000000000008D +:101360000000000000000000000000004800012014 +:10137000017877B1024A434F507632343100000091 +:10138000000C0149424D0000000000000000000078 +:101390000000004A434F5033312076322E342E3134 +:1013A000000000000000000000000000000000003D +:1013B000000000000000000000000000000000002D +:1013C000000000000000000000000000000000001D +:1013D00000000048000120013833B14A434F503427 +:1013E00031563232000000000C0149424D0000002D +:1013F000000000000000000000004A434F5034315C +:101400002076322E320000000000000000000000B4 +:1014100000000000000000000000000000000000CC +:1014200000000000000000000000000000000000BC +:101430000000000000000000000004000128013846 +:1014400033B14A434F503431563233310000000D2E +:101450000149424D000000000000000000000000B3 +:10146000004A434F5034312076322E332E31000063 +:10147000000000000000000000000000000000006C +:10148000000000000000000000000000000000005C +:10149000000000000000000000000000000000004C +:1014A00000040001880100000000000000000000AE +:1014B0000000000000000000496E66696E656F6EF6 +:1014C00000000000000000004D4946415245204305 +:1014D0006C617373696320316B00000000000000D1 :1014E00000000000000000000000000000000000FC -:1014F00000496E6E6F766973696F6E2052265400D4 -:10150000004A6577656C00000000000000000000E4 -:1015100000000000000000000000000000000000CB -:1015200000000000000000000000000000000000BB -:1015300000000000000000000000000000000000AB -:10154000000200013801000000000000000000005F -:1015500000000000000000004E6F6B696100000099 -:1015600000000000000000004D4946415245204364 -:101570006C617373696320346B202D20656D756C0D -:101580006174656420283632313220436C61737394 -:101590006963290000000000000000000000000056 -:1015A00000000000000000000800013801000000F9 -:1015B0000000000000000000000000000000004EDD -:1015C0006F6B696100000000000000000000004D2A -:1015D000494641524520436C617373696320346B03 -:1015E000202D20656D756C6174656420283631335B -:1015F00031204E464329000000000000000000009A -:101600000000000000000000000000000000006377 -:1016100064696E6F70737578585B000011241FBE8B -:10162000CFEFCDBFDFE3DEBF00E00CBF18BE19BEB9 -:101630001ABE1BBE14E2A0E0B0E2EEEEF3EB00E057 -:101640000BBF02C007900D92A238B107D9F71BBE9D -:1016500025E3A2E8B4E201C01D92A134B207E1F78C -:101660003BD00C94F55925C13BB78BBFFB0187914B -:1016700096913BBF08953BB78BBFCB0142E20D94DF -:10168000F00F3BB70B0143E20D94F00F3BB78BBF5C -:10169000CB0145E20D94F00F3BB746E208C0209124 -:1016A000CF0127FDFCCF22272093CA010895409344 -:1016B000CA0128ED31E0209334003093CB016091D2 -:1016C000C4017091C5018091C60199270895FC015C -:1016D0004093CA01849108950ED10E940D160E9474 -:1016E0008C16C2D21092520684E08093420682E6A3 -:1016F00080938601C1E0C0932606C093210686E050 -:1017000080932206C093310602E0009332061092C5 -:101710002A0613E01093290689E5809380018AE563 -:101720008093810180E480934106809346069091E6 -:10173000B200907F9093B2009091B200926090932B -:10174000B20090E390934106909346068093500632 -:10175000C0934606009345061093410683E18093AB -:10176000010821E030E020932608309327082093D9 -:1017700028083093290810928C08809380081092D2 -:10178000230310922103D8E0D093220381E18093B8 -:10179000200380911E2090911F2080933803909306 -:1017A00039038CE380938203D09380038093830377 -:1017B000D09381036FD10E943718C0D131D7C09325 -:1017C0000002109201020093020210930402C093DF -:1017D0002002D09321020E94D51419D1D2E0C1E198 -:1017E0008091030481FF25C08091010480FDFCCF1E -:1017F000D0930304B8D10E9469181AD70E94081622 -:101800000E949016E091532EF091542E19950E944B -:101810002A210E94D417E091622EF091632E8781D5 -:10182000813011F4C0938B2C8681813011F4C093E8 -:101830008A2C0E943B18BAD7E091512EF091522E7B -:101840001995E0914B2EF0914C2E1995C9CF292F67 -:1018500033272230310559F02330310569F021302A -:101860003105F9F482E190E02AE832E01EC08EE30F -:1018700090E02CE432E019C099278130910541F0C5 -:101880008230910541F0892B61F4E8E4F2E005C073 -:10189000ECE1F2E002C0ECEFF1E0849190E09F0116 -:1018A00004C080E090E020E030E0FA012083318342 -:1018B00008951F920F920FB60F92112408B60F923F -:1018C00018BEFFCF1F920F920FB60F92112408B6C9 -:1018D0000F9218BE8F939F938EB19FB180589F4FE8 -:1018E0008EB99FB99F918F910F9008BE0F900FBE38 -:1018F0000F901F9018958091780083FF0AC088E0B0 -:101900008093780088ED84BF81E0809380000D94FF -:10191000FE008BEC80935200809150008860809391 -:1019200050008091510083FFFCCF82EC80935500E2 -:10193000809150008061809350008091510084FF1D -:10194000FCCF88ED84BF84E0809340001EB81FB8B0 -:1019500081E0809343002FE730E020930A04309326 -:101960000B0420930C0430930D04809300048093A7 -:10197000020480E880930001089588ED84BF81E02F -:1019800080937900089588ED84BF8BE18093800077 -:1019900008958091500082608093500080915100A2 -:1019A00081FFFCCF82E08093CA01EDE1F0E0E49199 -:1019B000E0936200ECE1F0E0E491E09363001092C8 -:1019C000CA0180E8809365008BEB8093660080916C -:1019D0005600897F809356008091560084608093E2 -:1019E0005600809160008160809360000895E0E47B -:1019F000F0E084818E7F8483E0E6F0E080818E7F5A -:101A00008083E0E5F0E080818D7F8083089587E02A -:101A10008093A200789408950895089508950895F4 -:101A200008950895089580E090E008950895089538 -:101A30000F931F93CF93DF931F92CDB7DEB707E4C9 -:101A40001EE2D8011296ED91FC91139789831995A6 -:101A50000E946221E091622EF091632E898185833C -:101A6000B8E18B9FB001112464567D4F48E150E0EE -:101A7000C8010E940D53D801ED91FC911995D80130 -:101A80001696ED91FC9117970F90DF91CF911F91D2 -:101A90000F91199448E150E06CE972E087E49EE20E -:101AA0000E940D53E091622EF091632E8581C0CF8C -:101AB0000F931F93E091622EF091632E8B019C0196 -:101AC000458168E08CE593E00E9471171F910F91AA -:101AD0000895FF920F931F93CF93DF931F92CDB77B -:101AE000DEB78C019E012F5F3F4FAC0168E08CE5B3 -:101AF00093E00E948917F82E882389F0898198DF66 -:101B0000F80140E08191882319F04F5F4F31D1F700 -:101B1000E0915F2EF091602EB80181E119958F2D33 -:101B20000F90DF91CF911F910F91FF9008959B012E -:101B3000AC0168E08CE593E00C94B01708950C9428 -:101B4000FF5208951F93CF93DF93C82FD92F162FDD -:101B5000180F1C1721F00E94FF528993FACFDF91D2 -:101B6000CF911F9108950E94FF520E94FF520E9440 -:101B7000FF520C94FF52EF92FF920F931F93CF935B -:101B8000DF937C0161507109FA018A01020F131F72 -:101B9000DC0140E050E0E017F107F1F06230710540 -:101BA000D8F09191392F32953F703A3010F4305D72 -:101BB00001C0395C3C939F709A3010F4905D01C075 -:101BC000995C9701240F351FE901998312966250A1 -:101BD00071094E5F5F4FDFCF1C92CA01DF91CF9139 -:101BE0001F910F91FF90EF900895CF93DF93EC0139 -:101BF000DA01E0E0F0E04C91442391F111969C91E0 -:101C00001197992339F1E617F70721F180ED840F39 -:101C10008A3020F08FEB840F8630D0F480ED890F6E -:101C20008A3020F02FEB290F263090F4242F30E05B -:101C3000413410F0275331092295207F913410F45C -:101C4000982F01C09753292B299331961296D3CF01 -:101C500080E004C011968C91811102C090E001C017 -:101C6000CF01DF91CF910895E0E6F6E080E1858332 -:101C700082E0868388E085838AE18183E0EAF9E077 -:101C80001682178280EC858388E18483E0E0F1E0AE -:101C9000128A8BE6838B148A158A20EA208F99E0BA -:101CA000918F128E148E158E168E84E0808B12A268 -:101CB0003CE633A314A215A210A611A612A624A7CF -:101CC00095A716A680A308954115510509F449C0AA -:101CD00020E12093660623E02093A0092091A1092A -:101CE00027FFFCCF2091A0097093A0092091A109A2 -:101CF00027FFFCCF2091A0096093A0092091A109A2 -:101D000027FFFCCF2091A00921E0209312018093AE -:101D10001C0190931D0140931401509315011092E2 -:101D2000220182E894E28093280190932901409354 -:101D30002401509325018091100180688093100147 -:101D4000809120018068809320018091100187FD9F -:101D5000FCCF80E3809311018093210180E1809387 -:101D6000650608954115510509F469C020E12093E5 -:101D7000660626E02093A0092091A10927FFFCCF49 -:101D80002091A00920E12093650600000000209327 -:101D9000660622E02093A0092091A10927FFFCCF2D -:101DA0002091A0097093A0092091A10927FFFCCFE1 -:101DB0002091A0096093A0092091A10927FFFCCFE1 -:101DC0002091A0091092120122E834E220931C0114 -:101DD00030931D01409314015093150120E120938D -:101DE000220180932801909329014093240150936C -:101DF000250180911001806880931001809120015D -:101E00008068809320018091100187FDFCCF80E3E2 -:101E1000809311018093210180E180936506E09118 -:101E2000622EF091632E8781863019F481E18093D0 -:101E30008B2C8681863019F481E180938A2C089559 -:101E4000CF92DF92EF92FF92CF93DF93C090612EFB -:101E5000D12CE12CF12C8DE0CC0CDD1CEE1CFF1CF8 -:101E60008A95D1F7C114D10481E0E806F10408F0A5 -:101E70004EC080E18093660686E08093A009809141 -:101E8000A10987FFFCCF8091A00980E180936506BE -:101E9000000000008093660682E08093A009809194 -:101EA000A10987FFFCCF8091A0091092A009809121 -:101EB000A10987FFFCCF8091A0091092A009809111 -:101EC000A10987FFFCCF8FEFE81AF80A8091A009DB -:101ED000C0E0D0E1C701B601C7DB8093A0098091C3 -:101EE000A10987FFFCCF8091A0099093A009809160 -:101EF000A10987FFFCCF8091A00982E0C80ED11C08 -:101F0000E11CF11C219731F780E180936506DF9198 -:101F1000CF91FF90EF90DF90CF900895CF92DF9216 -:101F2000EF92FF92CF93DF93C090612ED12CE12CE2 -:101F3000F12C8DE0CC0CDD1CEE1CFF1C8A95D1F73A -:101F4000C114D10481E0E806F10438F0DF91CF91AB -:101F5000FF90EF90DF90CF9073CF8FEFE81AF80AE1 -:101F6000C1E2D0E0219791F39ADBC701B60183DB90 -:101F700096DB8FEFD81AE80AF80AF4CFCF92DF92F7 -:101F8000EF92FF920F931F93CF93DF93C090612E38 -:101F9000D12CE12CF12C8DE0CC0CDD1CEE1CFF1CB7 -:101FA0008A95D1F7C114D10481E0E806F10408F064 -:101FB0004FC080E18093660683E08093A009809102 -:101FC000A10987FFFCCF8091A0091092A009809100 -:101FD000A10987FFFCCF8091A0091092A0098091F0 -:101FE000A10987FFFCCF8FEFE81AF80A8091A009BA -:101FF000C1E2D0E0219749F152DB4EDB50DB00E03B -:1020000010E01092A0098091A10987FFFCCF609198 -:10201000A00970E01092A0098091A10987FFFCCF70 -:102020008091A009782BC8012CDB39DB0E5F1F4F94 -:10203000011581E0180729F7C701B60127DB2FDB5F -:102040008FEFD81AE80AF80AD5CF80E180936506A9 -:10205000E091622EF091632E8781863019F490E131 -:1020600090938B2C9681963049F420E120938A2C12 -:10207000853059F483E180938B2C02C08530D1F3F5 -:10208000953019F483E180938A2CDF91CF911F91D1 -:102090000F91FF90EF90DF90CF900895CF92DF9255 -:1020A000EF92FF920F931F934115E0E25E076105E7 -:1020B000710508F06BC06901E12CF12C00E010E221 -:1020C00020E030E0041B150B260B370BC016D106A1 -:1020D000E206F30610F49701860120E120936606DC -:1020E00026E02093A0092091A10927FFFCCF209191 -:1020F000A00920E1209365060000000020936606F9 -:1021000022E02093A0092091A10927FFFCCF209174 -:10211000A0095093A0092091A10927FFFCCF20918D -:10212000A0094093A0092091A10927FFFCCF20918D -:10213000A0091092120122E834E220931C0130938E -:102140001D01009314011093150120E12093220139 -:102150008093280190932901009324011093250175 -:102160008091100180688093100180912001806827 -:10217000809320018091100187FDFCCF80E3809344 -:1021800011018093210180E18093650681E01F9118 -:102190000F91FF90EF90DF90CF900895CF92DF9254 -:1021A000EF92FF920F931F934115E0E25E076105E6 -:1021B000710508F05DC06901E12CF12C00E010E22E -:1021C00020E030E0041B150B260B370BC016D106A0 -:1021D000E206F30610F49701860120E120936606DB -:1021E00023E02093A0092091A10927FFFCCF209193 -:1021F000A0095093A0092091A10927FFFCCF2091AD -:10220000A0094093A0092091A10927FFFCCF2091AC -:10221000A00921E02093120180931C0190931D01DD -:1022200000931401109315011092220182E894E2A8 -:102230008093280190932901009324011093250194 -:102240008091100180688093100180912001806846 -:10225000809320018091100187FDFCCF80E3809363 -:1022600011018093210180E18093650681E001C026 -:1022700080E01F910F91FF90EF90DF90CF90089535 -:102280008091CF0187FDFCCF0895FADF8091CF01C7 -:1022900081FF0BC086E38093CA01EBECF1E021E003 -:1022A00030E088ED90E084BF20830895EF92FF92A4 -:1022B0000F931F93CF93DF931F921F92CDB7DEB77B -:1022C0007C018A011092C20169837A83D9DF698116 -:1022D000A62F7A81B72FC701800F911F26E048ED06 -:1022E00050E061E070E0EBECF1E0E816F90689F00F -:1022F000E092C0013F2D3F713093C1012093CA018C -:1023000044BF60833091C4013D933FEFE31AF30A69 -:10231000ECCFC8010F900F90DF91CF911F910F91DB -:10232000FF90EF9008952F923F924F925F926F929D -:102330007F928F929F92AF92BF92CF92DF92EF9255 -:10234000FF920F931F93CF93DF9300D0CDB7DEB7EB -:102350006A01282F2F711C01221A310829836A83F0 -:102360007B8393DF8DDF83E38093CA011092C101E9 -:102370001092C2016A81E62E7B81F72E860185E3E9 -:10238000582E98ED892E912C66246394712C3BEC89 -:10239000A32EBB24B39443E3442E298101151105D8 -:1023A00009F12093C001F70181917F018093C4015D -:1023B0000150110919F02F5F203281F72092C001DE -:1023C000832D8F718093C1015092CA01C401F50120 -:1023D00084BF608290E2290E311C52DF4092CA0114 -:1023E00020E0DCCFC6012396CDBFDEBFDF91CF91C9 -:1023F0001F910F91FF90EF90DF90CF90BF90AF9023 -:102400009F908F907F906F905F904F903F902F9014 -:1024100008951F93CF93DF93CDB7DEB7A097CDBFBD -:10242000DEBF853009F4AEC078F4823081F128F443 -:10243000813009F0EEC010E01BC0833009F453C0B6 -:10244000843009F475C0E5C0883009F4D3C040F485 -:10245000863009F4CDC0873009F0DBC08FDDD9C0EC -:10246000893009F4C9C08A3009F0D3C080D3D1C003 -:1024700080915D2E181708F0A8C061DBE1E0F0E064 -:10248000EC0FFD1FE10FF11D80831F5FF1CF11E005 -:1024900080915D2E873009F010E0E091572EF09189 -:1024A000582ECE010196199540915D2E31E01417FA -:1024B00008F08BC03323A9F0812F90E0E1E0F0E039 -:1024C000EC0FFD1FE80FF91F208131E02F3F09F0CD -:1024D00030E0E1E0F0E0EC0FFD1FE80FF91F2F5FA7 -:1024E00020831F5FE4CFE091572EF091582ECE014C -:1024F0000196199580915D2E41E0815008F465C0E8 -:102500004423D9F3282F30E0E1E0F0E0EC0FFD1F89 -:10251000E20FF31F908141E09F3F09F040E0E1E0CE -:10252000F0E0EC0FFD1FE20FF31F9F5F9083E5CFFC -:1025300011E080915D2E873009F010E0E091572E78 -:10254000F091582ECE010196199540915D2E31E003 -:102550001417D8F53323A1F0812F90E0E1E0F0E0EB -:10256000EC0FFD1FE80FF91F208131E0211130E051 -:10257000E1E0F0E0EC0FFD1FE80FF91F2150208390 -:102580001F5FE6CFE091572EF091582ECE010196B5 -:10259000199580915D2E41E08150B8F04423E1F31C -:1025A000282F30E0E1E0F0E0EC0FFD1FE20FF31F19 -:1025B000908141E0911140E0E1E0F0E0EC0FFD1F7F -:1025C000E20FF31F91509083E7CFE091592EF091E5 -:1025D0005A2ECE0101961995E0915F2EF091602E52 -:1025E00040915D2EBE016F5F7F4F83E1199511C051 -:1025F0005DD30FC025DC0DC080910008813021F42F -:1026000080918C08833019F00E94EE2102C00E9454 -:102610001322A096CDBFDEBFDF91CF911F91089509 -:10262000E0E0F6E080E6828388E1868B858B089582 -:10263000CF93C0910806C095C6FF12C08091842434 -:102640008A3050F08A30E1F4E091622EF091632EEE -:102650008181DFDE809184248F5F8093842410C089 -:102660008C2F807669F48091842481508A3030F4F4 -:10267000E091622EF091632E8081CBDE1092842453 -:10268000C5FF12C0809183248A3050F08A30D9F47B -:10269000E091622EF091632E8381BBDE80918324D2 -:1026A0008F5F809383240FC0C07669F48091832468 -:1026B00081508A3030F4E091622EF091632E828155 -:1026C000A8DE10928324CF9108959B01AC016BE0AA -:1026D00084E696E045C420E030E090E0F901E80FA0 -:1026E000F91FEF59F14D6383265F3F4F20353105C8 -:1026F000A9F708950F931F939B01E091622EF0912B -:10270000632EE80FF11D8A0140816BE084E696E0BC -:10271000E8D31F910F9108950F931F93CF93DF93E9 -:102720001F92CDB7DEB7082FAB019E012F5F3F4F41 -:102730006BE084E696E0EDD3182F882319F06981C9 -:10274000802FC9DF812F0F90DF91CF911F910F91C3 -:1027500008950895EF92FF920F931F93CF937B01FB -:10276000C42F2EB13FB10091080410910904022B2F -:10277000132B682F83E090E20E9413516C2F83E0AB -:1027800090E20E941351612F83E090E20E94135166 -:10279000602F83E090E20E9413516C2F70E0C7011C -:1027A000CF911F910F91FF90EF905BC408953F92DE -:1027B0004F925F926F927F928F929F92AF92BF9251 -:1027C000CF92DF92EF92FF920F931F93CF93DF93FD -:1027D0007C01E901C0900020D09001209601225098 -:1027E0003843C901A0E0B0E0481759076A077B07E2 -:1027F00008F05CC0E2E0CE1AE0E4DE0A2A013B0108 -:102800004C0E5D1E611C711C481659066A067B063B -:1028100048F0241B350B8E01021B130BE9013324F6 -:10282000339403C000E010E0312C4601A12CB12C00 -:10283000481559056A057B0510F5CA018E5F9F4B47 -:102840002A013B014C0E5D1E611C711C4814590489 -:102850006A047B0428F4AE01BC01C70135DA18C054 -:10286000C41AD50AA601BC01C7012EDAAE014C1963 -:102870005D096AE874E2C7018C0D9D1D07C04C1903 -:102880005D09BA0166577B4DAE01C7010E943B53FB -:10289000311002C081E00BC001501109D8F3F801DA -:1028A000EC0FFD1FEE0DFF1D1082F6CF80E0DF91D3 -:1028B000CF911F910F91FF90EF90DF90CF90BF903D -:1028C000AF909F908F907F906F905F904F903F90D0 -:1028D0000895209186243091872480E098E0821B1F -:1028E000930BEAE8F4E29F012A583442281739078B -:1028F00010F41192F8CF8AE894E2809388249093A0 -:10290000892480E098E0809386249093872482E055 -:1029100090E4809300209093012042E050E060E03A -:1029200070E480E090E21EDAE091622EF091632E76 -:1029300087818A3019F480E180938B2C86818A30DC -:1029400019F480E180938A2C0895809186249091D7 -:10295000872490582091002030910120821B930BF6 -:10296000089520E030E0F901EF59F14D8783265FAB -:102970003F4F20353105B9F7813049F018F08230EA -:1029800059F008951092852489EA93E109C0809353 -:10299000852480E395E104C0109285248AEA93E1BE -:1029A00080935F2E9093602E08950F931F93CF9383 -:1029B000DF931F92CDB7DEB7E091622EF091632EC8 -:1029C0008481CFDF8AE894E28093882490938924DD -:1029D00000E018E0009386241093872441E050E043 -:1029E000BE016F5F7F4F80E090E060DCE091882463 -:1029F000F0918924DF01C8011D920197E9F78981CF -:102A0000882341F042E050E060E070E480E090E232 -:102A10005BD917C082E090E480930020909301205E -:102A200042E050E060E070E480E090E29BD981E019 -:102A3000898341E050E0BE016F5F7F4F80E090E00E -:102A400072DCE0915F2EF091602E40E060E070E07B -:102A50008FEF19950F90DF91CF911F910F910895EE -:102A60000F931F93CF93DF93AEB1BFB1C091080412 -:102A7000D09109042091862430918724E42FF0E03E -:102A80008F010C5F1F4F2017310758F1CA2BDB2B2A -:102A9000245031092E1B3F0B20938624309387242A -:102AA000A0918824B09189248C9311964C9311970E -:102AB0001296DC931297CD0104968093882490930C -:102AC00089241396CC93DB01EC01415018F02D9131 -:102AD0002993FBCFE80FF91FE0938824F093892412 -:102AE00012C080E03EDFE091622EF091632E87817C -:102AF0008A3019F481E180938B2C86818A3019F415 -:102B000081E180938A2CDF91CF911F910F910895DD -:102B10001F93CF93DF931F92CDB7DEB79E012F5F38 -:102B20003F4FAC0163E08FEC97E0F3D1182F88237F -:102B300011F0898116DF812F0F90DF91CF911F91C6 -:102B400008950F931F93E091622EF091632E8B01F5 -:102B50009C01448163E08FEC97E0C3D11F910F91FA -:102B600008959B01AC0163E08FEC97E0F9C1CF932E -:102B7000DF938091862490918724811528E0920725 -:102B800008F043C06091002070910120C0E0D8E0BF -:102B9000AE01481B590B80E090E8861B970B841709 -:102BA000950798F18AE894E2DDD820918624309147 -:102BB00087248091002090910120985F821B930BC5 -:102BC0008093002090930120C21BD30BEAE8F4E22B -:102BD000CF018A5894428C179D0710F41192F8CFB8 -:102BE0008AE894E2809388249093892480E098E096 -:102BF000809386249093872442E050E060E070E464 -:102C000080E090E2DF91CF91ADC8DF91CF91089540 -:102C1000809185248111ABCF089543E550E061E6B2 -:102C20007EE281E090E042CB43E550E061E67EE267 -:102C300081E090E078CBCF93DF93CFEFC80FC8301F -:102C400078F5D82F0E94622199D9C093612E8AE02D -:102C5000C89F90011124C9018C59914D8093622E17 -:102C60009093632EF901EF59F14D80850E94180D64 -:102C7000E091622EF091632E848173DEE1D88FE1C2 -:102C80008D0FE091622EF091632E9781943011F4B4 -:102C900080938B2C9681943029F480938A2C02C0E7 -:102CA00080E001C081E0DF91CF9108958091612E95 -:102CB00099E04AE0915099F0282F30E02F5F3F4F84 -:102CC00027703327822F429FF001439FF00D11247C -:102CD000EF59F14D2085222369F38F5FACCF089522 -:102CE000FC019091612E9F5C908311820895CF9397 -:102CF000FC01C081818181110CC0BF01E0915F2E78 -:102D0000F091602E41E082E1199580ED8C0FCF911A -:102D100092CF80E0CF91089588E1809301060895D5 -:102D200080918A2C823191F030F48031B9F050F4E6 -:102D30008823A9F132C0833169F090EE980F983062 -:102D400088F02BC088E08093050627C088E0809338 -:102D5000070623C08091040683FF12C088E0809399 -:102D600006061BC090918C2C9F5F923019F09093B7 -:102D70008C2C15C010928C2C9091040693FD04C0ED -:102D800088E0809305060BC098E090930606803299 -:102D900021F0815080938A2C02C010928A2C80915D -:102DA0008B2C823191F030F48031C1F050F48823C3 -:102DB000A9F132C0833169F090EE980F983088F015 -:102DC0002BC080E18093050627C080E18093070631 -:102DD00023C08091040684FF12C080E18093060620 -:102DE0001BC090918D2C9F5F923019F090938D2C89 -:102DF000089510928D2C9091040694FD04C080E1FA -:102E000080930506089590E190930606803221F0A4 -:102E1000815080938B2C089510928B2C08959B01E8 -:102E2000AC016BE082E398E09BC020E030E0982F9B -:102E300090718870992321F0F901EF59F14D628763 -:102E4000882321F0F901EF59F14D6187265F3F4F4B -:102E50002035310579F7992329F090E19093060602 -:102E600010928B2C882329F088E08093060610921C -:102E70008A2C08950F931F939B018A01803131F4AE -:102E8000E091622EF091632E478107C0883049F4AB -:102E9000E091622EF091632E46816BE082E398E030 -:102EA00020D01F910F9108950F931F93CF93DF931D -:102EB0001F92CDB7DEB7082FAB019E012F5F3F4FAA -:102EC0006BE082E398E025D0182F882319F0698100 -:102ED000802FABDF812F0F90DF91CF911F910F914A -:102EE00008950F931F93FC01662379F0949161502C -:102EF000941309C0BF016F5F7F4FA801C9010E94F1 -:102F00001F5381E003C0B196EFCF80E01F910F9176 -:102F10000895CF92DF92EF92FF921F93CF93DF93AA -:102F2000EC017A016901162F112389F0BE016F5F50 -:102F30007F4FC7010E9416531150892B31F4FE01B7 -:102F4000C491F601C08381E003C0A196EDCF80E07B -:102F5000DF91CF911F91FF90EF90DF90CF90089578 -:102F6000CF930196CCE26623C9F0FC01DA01AD01F2 -:102F70007491772341F021153105A1F07D933196AD -:102F800021503109F4CF623030F02115310551F074 -:102F90004F5F5F4FCC9361508196E5CF232B11F0AB -:102FA000FA011082CF910895809120028068809369 -:102FB00020028091230280FFFCCF81E080932302D6 -:102FC000A0911002B0911102AE5BB109B7FF02C02F -:102FD000A0E0B0E020E038EB4BE050E00E949952D6 -:102FE000E091622EF091632E61157105844F91403E -:102FF000A8F48781873019F480E180938B2C868137 -:10300000873019F480E180938A2C80915D2E88238B -:1030100089F0E0914F2EF091502E199487818730DE -:1030200019F481E180938B2C8681873019F481E13A -:1030300080938A2C0895BC0183E090E20C94C550E3 -:10304000CF93DF93FC016491EC012196662331F06C -:1030500083E090E20E941351CE01F4CFDF91CF9133 -:103060000895AB01BC0183E090E20C94EF5080E244 -:10307000809362060895CF93DF9380918E2C8230E7 -:1030800029F583E090E20E9478510E94474C83E04A -:1030900090E20E949451EC0197FD18C0E091622EDD -:1030A000F091632E8781833019F483E180938B2C18 -:1030B0008681833019F483E180938A2C8C2F24D667 -:1030C000811104C08C2FDF91CF91C2C7DF91CF91C6 -:1030D000089580918E2C813079F028F08230D9F0DB -:1030E000833011F12EC08091680685FF2AC08FE0E1 -:1030F0008093022081E00CC0809102208150809357 -:10310000022081111EC00E94C90C0E94F24F82E071 -:1031100080938E2C16C08091680685FD12C08FE0CA -:103120008093022083E0F4CF80910220815080932D -:103130000220811106C00E94B74F0E94F70C109226 -:103140008E2C80918E2C823019F42ED70C942A214B -:103150000895E091622EF091632E8781823019F4F8 -:1031600081E180938B2C8681823019F481E18093F8 -:103170008A2C0895E091622EF091632E878182302F -:1031800019F480E180938B2C8681823019F480E1E0 -:1031900080938A2C089583E090E20C94A05083E001 -:1031A00090E20C94E75123E33BE03F932F932DE211 -:1031B0003BE03F932F9326E23BE03F932F932FE199 -:1031C0003BE03F932F932FE73AE03F932F9322E08A -:1031D0002F931F929F938F930E94A4538DB79EB7F6 -:1031E0000E968DBF9EBF85E6089560E072E00E9456 -:1031F000580D85E60895FB0120812F3349F4218184 -:10320000211106C060E072E00E94970D85E60895E6 -:10321000CB010E94690D882319F006DD84E608952C -:103220008AEC0895EF92FF920F931F93CF93DF9351 -:10323000CDB7DEB7A097CDBFDEBF7C0100915D2E7C -:1032400010E00115110591F487E79AE09F938F93A1 -:1032500082E08F931F92FF92EF920E94A4530F90EF -:103260000F900F900F900F900F9010C0E091572E7D -:10327000F091582ECE01019619959801AE014F5F3D -:103280005F4F60E072E0C7010E94BB0D85E6A0962B -:10329000CDBFDEBFDF91CF911F910F91FF90EF90D7 -:1032A0000895DF92EF92FF920F931F93CF93DF93D6 -:1032B000CDB7DEB7A097CDBFDEBF7B0100915D2EFD -:1032C00010E060E77AE0C7010E941653892B29F5C8 -:1032D000D12CED2CF12CE016F10658F40E949F0D34 -:1032E000E1E0F0E0EC0FFD1FEE0DFF1D8083D394B5 -:1032F000F0CFE091592EF0915A2ECE0101961995FA -:10330000E0915F2EF091602E40915D2EBE016F5FC7 -:103310007F4F83E1199584E60BC0A70160E270E05E -:10332000CE0101960E94F50D8017910711F38AECEA -:10333000A096CDBFDEBFDF91CF911F910F91FF907F -:10334000EF90DF900895FC0180915E2E882311F0AC -:1033500081E301C080E38083118285E60895FB014B -:103360002181211127C02081213321F481E0809324 -:103370005E2E04C0203321F410925E2E84E6089560 -:103380002F33C1F41F9220E32F931F9221E32F9339 -:103390002AE63AE03F932F9322E02F931F929F93C8 -:1033A0008F930E94A4538DB79EB70A968DBF9EBF80 -:1033B00085E608958AEC08958EE490E174D48EE653 -:1033C00008958EEC90E18AD48EE60895E0ECF4E066 -:1033D00081818E7F81830E94B74F0E94BD0C84E65D -:1033E0000895E0ECF4E081818E7F81830E94B74FE5 -:1033F0000E94C30C84E60895E7E4FEE225892F933A -:1034000024892F9327E63AE03F932F9322E02F93CE -:103410001F929F938F930E94A4538DB79EB70896D7 -:103420008DBF9EBF85E6089520915D2E1F922F933C -:1034300024E63AE03F932F9322E02F931F929F932D -:103440008F930E94A4538DB79EB708968DBF9EBFE1 -:1034500085E6089540E052E0BC0180E04BD985E666 -:103460000895FB0120812F3341F42181211105C0F2 -:1034700060E072E02AD985E6089580E04DD988237E -:1034800019F0D2DB84E608958AEC089540E052E01A -:10349000BC0181E02FD985E60895FB0120812F33FF -:1034A00041F42181211105C060E072E00ED985E66A -:1034B000089581E031D9882319F0B6DB84E60895B8 -:1034C0008AEC089540E052E0BC0182E013D985E621 -:1034D0000895FB0120812F3341F42181211105C082 -:1034E00060E072E0F2D885E6089582E015D988237D -:1034F00019F09ADB84E608958AEC089540E052E0E2 -:10350000BC0183E0F7D885E60895FB0120812F33C5 -:1035100041F42181211105C060E072E0D6D885E632 -:10352000089583E0F9D8882319F07EDB84E60895B6 -:103530008AEC089540E052E0BC0180E19BDC85E626 -:103540000895FB0120812F3341F42181211105C011 -:1035500060E072E064DC85E6089580E1A5DC882304 -:1035600019F062DB84E608958AEC089540E052E0A9 -:10357000BC0188E07FDC85E60895FB0120812F33C4 -:1035800041F42181211105C060E072E048DC85E64C -:10359000089588E089DC882319F046DB84E60895E5 -:1035A0008AEC089560E072E0CCDA85E60895FB01CC -:1035B00020812F3341F42181211105C060E072E0A8 -:1035C000D0DA85E60895CB01A3DA882319F02CDB45 -:1035D00084E608958AEC0895CF93DF93EC01B5D982 -:1035E000813028E0920718F09C01385002C020E09A -:1035F00030E03F932F939F938F9324E43AE03F93DF -:103600002F9382E08F931F92DF93CF930E94A45356 -:103610008DB79EB70A968DBF9EBF85E6DF91CF918D -:10362000089587ED93E15AD38EE60895A0DA84E6F3 -:1036300008954FD984E6089560E072E051DB85E695 -:103640000895CB0154DB882319F0EEDA84E608955F -:103650008AEC08950E948E0F84E608950E94BE0FA2 -:1036600084E608950E94200F84E6089580916806FC -:1036700080FD02C089E7089588E70895DF92EF9200 -:10368000FF920F931F93CF93DF93EC010FEF11E0A5 -:1036900086E7E82E8CE0F82E9CE2D92EB7018CE666 -:1036A00094E20E941653892BD1F001151105B9F04F -:1036B000DE01F7012491ED012196C8010197222333 -:1036C00041F00130110529F02C93DE0131968C0177 -:1036D000F1CFDC928C0188E1E80EF11CDFCF21975D -:1036E000188285E6DF91CF911F910F91FF90EF90A7 -:1036F000DF900895FC012091200220682093200291 -:103700008091230280FFFCCF81E080932302A0916F -:103710001002B0911102AE5BB109B7FF02C0A0E088 -:10372000B0E020E038EB4BE050E00E949952AA272D -:10373000BB279F938F932DE33AE03F932F9382E033 -:103740008F931F92FF93EF930E94A4538DB79EB760 -:1037500008968DBF9EBF85E608952EB13FB140917A -:10376000080450910904242B352B3F932F9327E312 -:103770003AE03F932F9322E02F931F929F938F93D2 -:103780000E94A4538DB79EB708968DBF9EBF85E655 -:1037900008950F931F93CF93DF931F921F92CDB77E -:1037A000DEB78B01E091622EF091632E8581873028 -:1037B00009F06FC0E0914F2EF091502E199581E0E5 -:1037C0008093E32C60E270E0C8010E945C53009794 -:1037D000F9F4F80101900020E9F73197E01BF10BB3 -:1037E000E0FD59C0F695E795E130F10539F487E041 -:1037F00090E08093452E9093462E37C053E0EE0F15 -:10380000FF1F5A95E1F7E093452EF093462E2DC009 -:1038100098012C5F3F4F82179307E9F5A80162E0FA -:1038200070E0CE0101960E94F50D898190E0982FFD -:1038300088272A81820F911D8093452E9093462ED2 -:103840000B5F1F4FF80101900020E9F73197E01B53 -:10385000F10BE0FD20C0F695E79533E0EE0FFF1F7A -:103860003A95E1F7E817F907B0F06091452E7091AD -:10387000462E695F7F4F83E0769567958A95E1F7DD -:10388000A80185E49DE20E94F50D0E947E298FEF3C -:1038900003C089EC01C08AEC0F900F90DF91CF91AB -:1038A0001F910F910895EF92FF920F931F93CF9363 -:1038B000DF931F921F92CDB7DEB78B01E091622E8E -:1038C000F091632E8581873009F080C0E0914F2E02 -:1038D000F091502E199582E08093E32C60E270E025 -:1038E000C8010E945C537C01892B31F5F8010190DD -:1038F0000020E9F73197E01BF10BE0FD69C0F69578 -:10390000E795E130F10539F487E090E08093452EAA -:103910009093462E47C063E0EE0FFF1F6A95E1F7D4 -:10392000CF0169E070E00E948552E81BF90BE0933B -:10393000452EF093462E36C0C8010496E816F906C7 -:1039400009F046C0A80162E070E0CE0101960E9435 -:10395000F50D298130E0322F22278A81280F311D71 -:103960002093452E3093462E2730310529F0C9018A -:1039700087709927892B61F587010F5F1F4FF80129 -:1039800001900020E9F73197E01BF10BE0FD20C02A -:10399000F695E79543E0EE0FFF1F4A95E1F7E21732 -:1039A000F307B0F06091452E7091462E695F7F4F0E -:1039B00083E0769567958A95E1F7A80185E49DE215 -:1039C0000E94F50D0E947E298FEF03C089EC01C093 -:1039D0008AEC0F900F90DF91CF911F910F91FF9084 -:1039E000EF900895E091622EF091632E85818730EB -:1039F000A1F4E0914F2EF091502E199584E0809320 -:103A0000E32C0E947B420E947E2985E892E4809309 -:103A10009E2C90939F2C8FEF089589EC0895E09150 -:103A2000622EF091632E85818730A1F4E0914F2EB4 -:103A3000F091502E199583E08093E32C0E947B42F5 -:103A40000E947E2985E892E480939E2C90939F2C7F -:103A50008FEF089589EC0895E091622EF091632E26 -:103A600085818730A1F4E0914F2EF091502E199569 -:103A700085E08093E32C0E947B420E947E2985E8AA -:103A800092E480939E2C90939F2C8FEF089589EC65 -:103A90000895E091622EF091632E4085518564E691 -:103AA000649F9001659F300D11243F932F9321E374 -:103AB0003AE03F932F9322E02F931F929F938F938F -:103AC0000E94A4538DB79EB708968DBF9EBF85E612 -:103AD0000895CF93DF931F921F92CDB7DEB7FB01FE -:103AE00020812F33B1F42181211113C02FEF39E050 -:103AF0003F932F9322E02F931F929F938F930E94C7 -:103B0000A4530F900F900F900F900F900F9085E699 -:103B100027C089E592E089839A83CE0101969F931D -:103B20008F938BEF99E09F938F937F936F930E9476 -:103B3000DA530F900F900F900F900F900F90892BEA -:103B400071F089819A818935F2E09F0740F4E09114 -:103B5000622EF091632E8087918784E601C08AEC03 -:103B60000F900F90DF91CF91089520911F202F93F8 -:103B700020911E202F9328EF39E03F932F9322E0CE -:103B80002F931F929F938F930E94A4538DB79EB73C -:103B900008968DBF9EBF85E60895CF93DF931F9251 -:103BA0001F92CDB7DEB7FB0120812F33B1F4218105 -:103BB000211113C02FE02F932FEF2F9327EA39E025 -:103BC0003F932F9322E02F931F929F938F930E94F6 -:103BD000A453CDBFDEBF85E627C019821A82CE016D -:103BE00001969F938F9383EA99E09F938F937F939E -:103BF0006F930E94DA530F900F900F900F900F90D9 -:103C00000F90892B81F089819A818115E0E19E07CF -:103C100050F4809338039093390380931E2090933F -:103C20001F2084E601C08AEC0F900F90DF91CF91A6 -:103C30000895FB0120812F33D9F42181211121C066 -:103C40001F9220E32F931F9221E32F932DE939E058 -:103C50003F932F9322E02F931F929F938F930E9465 -:103C6000A4538DB79EB70A968DBF9EBF85E6089573 -:103C7000213311F4B3D303C0203319F4D4D384E631 -:103C800008958AEC0895FC0180910008813021F4A8 -:103C900080918C08833011F080E301C081E3808340 -:103CA000118285E6089521E020939D2C20939C2C81 -:103CB0002CE32093992C25E030E02093972C30932F -:103CC000982C1092912C1092922C1092932C10926E -:103CD000942C80938F2C9093902C089527E0209320 -:103CE0009D2C2CE231E02093972C3093982C10924D -:103CF000912C1092922C1092932C1092942C8093D1 -:103D00008F2C9093902C0895CF9390919D2C95306B -:103D1000E1F130F4933029F140F5913068F440C17D -:103D2000973009F4A7C008F445C0983009F4AAC038 -:103D3000993009F432C134C1813041F41092952C8C -:103D40001092962C10929A2C83E0FBC0843011F4D0 -:103D500066E08BC0883109F420C18B3109F0F3C0D3 -:103D60001CC180939B2C84E0ECC090E040919B2C84 -:103D70002FEF30E0241B31098217930721F485E0EF -:103D8000E0C0981739F165E169C02091952C309118 -:103D9000962CA9014F5F5F4F4093952C5093962C22 -:103DA000F901EC54F14D80834038510509F0CBC046 -:103DB00086E0C7C020919B2C90919C2C291346C073 -:103DC000E4EBFEE290E02FE2E433F207D1F221913E -:103DD000920FF9CF4091912C5091922C6091932C9D -:103DE0007091942CE0918F2CF091902C20E830E091 -:103DF00084EB9EE21995C82F882311F180919C2CA9 -:103E00008F5F80939C2C8091912C9091922CA0910B -:103E1000932CB091942C80589F4FAF4FBF4F8093FD -:103E2000912C9093922CA093932CB093942C66E0B9 -:103E300083E090E20E94135182E080939D2CB1C0F8 -:103E400068E183E090E20E9413510EC030E0892FB8 -:103E500090E001972817390739F466E083E090E293 -:103E60000E94135182E06DC068E183E090E20E94FD -:103E7000135193C0853119F410929C2C09C08B31D9 -:103E800009F48BC0883109F463CF863009F05DC036 -:103E900080919C2C8F5F80939C2C4091912C509111 -:103EA000922C6091932C7091942CE0918F2CF09136 -:103EB000902C20E830E084EB9EE21995C82F8823EF -:103EC000D1F161E083E090E20E94135160919C2C5B -:103ED00083E090E20E94135160919C2C609583E0F6 -:103EE00090E20E94135160E870E084EB9EE2B9D842 -:103EF000E4EBFEE260E08FE2E433F80719F0819131 -:103F0000680FF9CF83E090E20E9413518091912CC9 -:103F10009091922CA091932CB091942C80589F4F0B -:103F2000AF4FBF4F8093912C9093922CA093932CE2 -:103F3000B093942C36C064E083E090E20E94135169 -:103F400089E080939D2CC1E02CC08531E1F761E0D0 -:103F500083E090E20E94135160919C2C83E090E2F8 -:103F60000E94135160919C2C609583E090E20E9426 -:103F7000135160E870E084EB9EE273D8E4EBFEE25C -:103F800060E02FE2E433F20719F08191680FF9CF76 -:103F900083E090E20E941351D6CF10929D2CD3CF94 -:103FA000C0E08C2FCF91089580919D2C813019F025 -:103FB000873029F108958091972C9091982C9C013D -:103FC000215031092093972C3093982C892B31F56F -:103FD0008091992C9FEF980F9093992C882331F022 -:103FE00065E183E090E20E94135102C010929D2C83 -:103FF00085E090E08093972C9093982C0895809181 -:10400000972C9091982C9C01215031092093972C4A -:104010003093982C892B11F410929D2C0895EDE487 -:10402000FBE020E030E09491981309C041E2429F08 -:10403000C001439F900D1124825B944F08952F5F20 -:104040003F4FB1962930310571F780E090E0089537 -:10405000CF92DF92EF92FF920F931F93CF93982FFF -:104060009F7D91549A3160F090ED980F9A3040F016 -:104070008F3531F0982F9D7F9D3311F08032D1F430 -:104080009FE9980F9A3108F480522091A32C309127 -:10409000A42C2F3F91E0390708F0D3C0A9014F5F4E -:1040A0005F4F4093A32C5093A42CF901EC54F14D95 -:1040B0008083C7C08D3009F095C0E091A32CF091AA -:1040C000A42CEC54F14D10821092A32C1092A42C2D -:1040D0008091A22C8111B5C08091B42E982F9F7D24 -:1040E00009F495C08D7F8D3309F491C0E4EBFEE2B5 -:1040F0007F01C191CC2331F0CF3321F0CD3311F0CA -:10410000C032B1F7F701108286E7C82E8CE0D82EB6 -:1041100000E010E0B60184EB9EE20E941653892B6A -:1041200009F056C01092B42ECF3349F488E1809F35 -:10413000F001819FF00D1124E457F34F18C0B7012F -:104140006F5F7F4FCD3349F488E1809FF001819FFD -:10415000F00D1124E657F34F20C0C11113C088E1C0 -:10416000809FF001819FF00D1124EA57F34F2591B4 -:1041700034912115310509F44DC084EB9EE2F9011B -:10418000199514C0C03209F045C088E1809FF00144 -:10419000819FF00D1124E857F34F2591349121159B -:1041A0003105C1F184EB9EE2F90119958F3F99F534 -:1041B00081E08093A22C8EB19FB1209108043091B0 -:1041C0000904822B932B8093A02C9093A12C39C0AF -:1041D0000F5F1F4FF8E1CF0ED11C0632110509F019 -:1041E00099CF15C0883061F48091A32C9091A42CB4 -:1041F000009739F101978093A32C9093A42C21C0B0 -:104200008B31F9F41092A32C1092A42C1AC088ECD4 -:10421000C0E002C089ECC1E002DF0E9420188AE4FD -:104220009BE00E942018CC2361F08091B42E88235B -:1042300041F084EB9EE20E941B1887E49BE00E9401 -:10424000201881E0CF911F910F91FF90EF90DF90A8 -:10425000CF9008958091A22C882399F1E091622E4D -:10426000F091632E208531852115310551F18EB1F4 -:104270009FB14091080450910904842B952B4091E3 -:10428000A02C5091A12C841B950B64E670E00E9439 -:10429000855262177307A8F01092A22C8BECBFDE38 -:1042A0000E94201884E49BE00E942018E0919E2C3C -:1042B000F0919F2C309729F0199510929E2C109216 -:1042C0009F2C08958091A22C8823A9F01092A22CF3 -:1042D0008BECA5DE0E94201884E49BE00E9420184D -:1042E000E0919E2CF0919F2C309729F01995109217 -:1042F0009E2C10929F2C0895CF93DF939091A22C27 -:104300009923A9F0EB011092A22C89DE0E942018BB -:1043100081E49BE00E942018209749F0CE010E9482 -:104320001B188EE39BE0DF91CF910C942018DF9156 -:10433000CF910895EF92FF920F931F93CF937C013B -:104340009B01613081E0780710F020E031E08B01C3 -:10435000021B130BA70160E072E084EB9EE20E9457 -:10436000BB0D84EB9EE20E941B18C1E0013081E08E -:104370001807B0F01A956C2F70E0762F6627A7010A -:10438000460F571F20E032E060E072E084EB9EE2CF -:104390000E94BB0D84EB9EE20E941B18CF5FE6CF0C -:1043A0000115110591F0EC2FF0E0FE2FEE27A7018B -:1043B0004E0F5F1F980160E072E084EB9EE20E9466 -:1043C000BB0D84EB9EE20E941B188BE39BE0CF9118 -:1043D0001F910F91FF90EF900C942018809100088E -:1043E000813029F480918C08833009F408958091FC -:1043F000A72C811117C081E08093000893E090936F -:104400008C088093A52C1092A62C8EB19FB1209180 -:10441000080430910904822B932B8093AC2C909349 -:10442000AD2C0895089510928C0810920008E5EACA -:10443000FCE21082118208959091A52C9923F1F04D -:104440008091A62C811115C02091A52C2223B9F0B2 -:104450002EB13FB14091080450910904242B352B13 -:104460004091AC2C5091AD2C241B350B26343105DA -:1044700030F081E08093A62C892F089581E0089583 -:10448000CF93DF931F92CDB7DEB78091A72C8823FF -:10449000D1F02EB13FB14091080450910904242B72 -:1044A000352B4091AA2C5091AB2C241B350B4091FD -:1044B000A82C5091A92C2417350728F01092A72C6E -:1044C00089838CDF89810F90DF91CF910895A0E2DD -:1044D000B6E081E015968C93159724EB30E328B96C -:1044E00039B924E331E32AB93BB910B813B812B88B -:1044F00016B817B811B8E0E0F9E010A211A22FEF3A -:1045000030E026A337A32FEF3FEF20A731A780830A -:1045100088E8838380E1848783E087831C968C937B -:104520001C9782E01A968C9308951F920F920FB6F3 -:104530000F92112408B60F9218BE0BB60F921BBE35 -:104540008F939F93EF93FF93E0E0F9E013828FE75F -:1045500090E086AB97AB81E190E080AF91AFE0E077 -:10456000FAE010A211A28FEF9FEF86A397A389E82C -:104570008383168281E084878EE0808310922A06EE -:10458000FF91EF919F918F910F900BBE0F9008BEFE -:104590000F900FBE0F901F9018951F920F920FB69D -:1045A0000F92112408B60F9218BE0BB60F921BBEC5 -:1045B0002F933F938F939F93EF93FF932091280620 -:1045C00093B1267081E009F080E0990F892B83B9BF -:1045D00082B1882309F464C012B883B18770873030 -:1045E00059F51092000980E180930C091092030A9A -:1045F0001B9B03C08CEA94E002C08CE694E080939D -:10460000260A9093270A82E081B981E080930C0A00 -:1046100083E08093060A86B197B1877049F090B124 -:104620008F5F893011F09695FBCFE8B1F9B1908397 -:1046300081E08093AE2C37C093B1892F8C7099F1B3 -:1046400092FB992790F981E0982781B181111BC0D5 -:1046500080B18695911190E8892B80B926B137B148 -:104660002F5F3F4F26B937B927703327232BD9F453 -:10467000E8B1F9B19F012F5F3F4F28B939B9808365 -:1046800081E081B910C081B1813069F4EAB1FBB138 -:104690009F012F5F3F4F2AB93BB9908311B803C0E8 -:1046A00082B1809582B988E880930309FF91EF91E8 -:1046B0009F918F913F912F910F900BBE0F9008BE4D -:1046C0000F900FBE0F901F9018951F920F920FB66C -:1046D0000F92112408B60F9218BE0BB60F921BBE94 -:1046E0002F933F938F939F93EF93FF9381B18230EA -:1046F00008F49DC081B18D3008F099C0E1B1F0E0BF -:10470000EE0FFF1FEA5DFF4D0190F081E02D19943F -:104710008FE790E08093260A9093270A88C08E9AAC -:104720008EE0809340088FE390E08093260A909378 -:10473000270A85E06FC08E9886E081B98FEF82B935 -:1047400014B815B8E8B1F9B1808180B970C0009B88 -:1047500005C08E9A82B1809582B901C08E9887E09B -:1047600059C0009B02C08E9801C08E9A80B1869578 -:1047700080B984B195B1019684B995B984B195B1E8 -:1047800087709927892B11F488E044C024B135B192 -:1047900086B197B128173907B1F52BC0EAB1FBB143 -:1047A000309711F0808101C082B1882311F08E9A78 -:1047B00001C08E9889E02EC0EAB1FBB1309751F06C -:1047C0008081882311F08E9801C08E9A3196EAB9C3 -:1047D000FBB908C082B1882311F08E9801C08E9A6F -:1047E0008FEF82B924B135B186B197B12817390757 -:1047F00011F48AE00FC0E8B1F9B1CF01019688B990 -:1048000099B9818180B986E005C08E988BE002C09D -:104810008E988CE081B90BC01092000A1092060AA3 -:10482000109240081092410881E08093AF2CFF91D4 -:10483000EF919F918F913F912F910F900BBE0F9011 -:1048400008BE0F900FBE0F901F901895CF93DF9367 -:10485000EEEAFCE210821182E0E4F6E0128A84E0E3 -:104860008283C0E8D1E082E68E83A0E2B6E081E0F8 -:1048700016968C93169711968C93119796E0129634 -:104880009C93129751968C93519742E052964C9379 -:1048900052971A961C921A9733E019963C9399E511 -:1048A00098839AE5998390E491839683A0EBB0E096 -:1048B00012962C911297207F12962C931297129693 -:1048C0002C911297226012962C9320E32183268349 -:1048D000908B868345833183E0E0F8E083E1818338 -:1048E00021E030E026A337A320A731A7E0E8F8E0D5 -:1048F00014868083E0E2F3E01382118288E08283F1 -:1049000091E1908320911E2030911F20208F318FC4 -:10491000E0E8F3E09CE39283808393838183DF91DB -:10492000CF91D5CDA0E2B6E01A961C921A97EEEA86 -:10493000FCE210821182E0E0F9E01082138217821B -:1049400080E18487E0E0FAE010821382168281E041 -:104950008487E0E4F8E01082118216968C938E989A -:104960000895CF93DF938091AE2C882309F47EC005 -:104970001092AE2CC6B1D7B1C730D10508F471C0C2 -:10498000AE01495F5F4F93E0569547959A95E1F7E1 -:10499000E0915F2EF091602E64EB70E380E4199556 -:1049A000E091622EF091632E8781883019F483E1C3 -:1049B00080938B2C8681883019F483E180938A2C34 -:1049C000E091552EF091562EBE0184EB90E319959F -:1049D000EC0194FF06C0DF7E84E391E38AB99BB9C2 -:1049E00002C01AB81BB82097E1F1AE01495F5F4FD2 -:1049F00083E0569547958A95E1F7E0915F2EF09117 -:104A0000602E64EB70E381E41995E091622EF091E1 -:104A1000632E8781893019F483E180938B2C868102 -:104A2000893019F483E180938A2CC6B9D7B984EB15 -:104A300090E388B999B910926008109261088FE0EC -:104A400090E0809366089093670888E090E08093F8 -:104A50006A0890936B0883E28093410883E081B9F0 -:104A600005C01092000A1092060A31DD8091AF2C29 -:104A7000882329F01092AF2CDF91CF9128CDDF91C0 -:104A8000CF910895CF93DF93E0E4F6E0128A84E0BB -:104A90008283C0E8D1E082E68E83A0E2B6E081E0C6 -:104AA00016968C93169711968C93119796E0129602 -:104AB0009C93129751968C93519742E052964C9347 -:104AC00052971A961C921A9733E019963C931997AD -:104AD00099E598839AE5998390E491839683C0EB56 -:104AE000D0E02A81207F2A832A8122602A8320E342 -:104AF00021832683908B868345833183E0E0F8E031 -:104B000093E1918321E030E026A337A320A731A7CA -:104B1000E0E8F8E014869083E0E2F3E0138211828B -:104B200098E0928341E1408340911E2050911F20E4 -:104B3000408F518FE0E8F3E04CE34283908343835E -:104B4000918315968C93E0E0F9E08FE790E086A3DF -:104B500097A322A733A7108216828CE08783109236 -:104B6000000A1092B02CE3EBFCE210821282118258 -:104B7000DF91CF91089581E08093260654DCE0E038 -:104B8000F9E010821782E0E0FAE010821782E3EB8E -:104B9000FCE211821282108208951F920F920FB6CA -:104BA0000F92112408B60F9218BE0BB60F921BBEBF -:104BB0002F933F938F939F93EF93FF93E091B02CAC -:104BC000F0E0EE0FFF1FE05CFF4D0190F081E02D63 -:104BD000199410928C081092000886E18A95F1F7DA -:104BE00000C081E08093000883E080938C0818B8AF -:104BF0008091B43086B917B882E001C083E0809319 -:104C0000B02C86C0309911C082B181110EC01092B3 -:104C10008C081092000896E19A95F1F700C081E0A7 -:104C20008093000883E080938C0884E0E8CF309B79 -:104C300010C010928C081092000886E18A95F1F756 -:104C400000C081E08093000893E090938C0882B9C3 -:104C500001C012B886B1869586B984B195B1019725 -:104C600084B995B9892B11F485E001C083E0809364 -:104C7000B02C87B18F5F87B9877009F049C0E8B160 -:104C8000EF5FE8B9F0E0EC54FF4C808186B940C09A -:104C900082B181110EC010928C081092000896E12A -:104CA0009A95F1F700C081E08093000883E080933B -:104CB0008C0886E0A4CF1092000982E591E001976C -:104CC000F1F700C0000082E08093870389E38093BE -:104CD000810384EB90E38AB99BB981E090E084B9C9 -:104CE00095B980E886B98EB19FB1209108043091C2 -:104CF0000904822B932B8093B12C9093B22C81E0EA -:104D00008093B52C18B817B81092B02C01C000C011 -:104D1000FF91EF919F918F913F912F910F900BBE3B -:104D20000F9008BE0F900FBE0F901F9018951F9206 -:104D30000F920FB60F92112408B60F9218BE0BB641 -:104D40000F921BBE2F933F934F935F938F939F932D -:104D5000EF93FF931092070A1092000A10924709EE -:104D600010924009809181038E7F8093810384B1EA -:104D700095B187709927892BC9F0E4B1F5B186B157 -:104D800044B155B193E0F695E7959A95E1F7EC5467 -:104D9000FF4C90E04770552728E030E0241B350B8E -:104DA00002C0959587952A95E2F7808381E08093EC -:104DB000B42C1092B52C8FEF9FEF8093260A90931E -:104DC000270A1092200A1092210A1092060A1092C5 -:104DD000070A1092030A84E08093000A87E0809318 -:104DE000B02CFF91EF919F918F915F914F913F91E7 -:104DF0002F910F900BBE0F9008BE0F900FBE0F901B -:104E00001F9018951F920F920FB60F92112408B69B -:104E10000F9218BE0BB60F921BBE8F93EF93FF93AA -:104E2000E0E8F3E081818F7C8183E0E0FAE088E8CC -:104E3000838381E08083FF91EF918F910F900BBE70 -:104E40000F9008BE0F900FBE0F901F9018951F92E5 -:104E50000F920FB60F92112408B60F9218BE0BB620 -:104E60000F921BBE2F933F934F935F938F939F930C -:104E7000EF93FF938091600910926009109261098D -:104E800092E090934009813620F0813A08F063C0A7 -:104E900077C086B1869586B984B195B1019684B9FB -:104EA00095B987709927892B41F4EAB1FBB1CF01FD -:104EB00001968AB99BB986B1808384B195B180FD92 -:104EC00088C0369986C01092070A1092000A109284 -:104ED000470910924009809181038E7F809381035E -:104EE00084B195B187709927892BC9F0E4B1F5B1E8 -:104EF00086B144B155B193E0F695E7959A95E1F7FF -:104F0000EC54FF4C90E04770552728E030E0241B1C -:104F1000350B02C0959587952A95E2F7808381E04D -:104F20008093B42C1092B52C8FEF9FEF8093260ABC -:104F30009093270A1092200A1092210A1092060AD2 -:104F40001092070A1092030A84E08093000A87E017 -:104F50008093B02C3EC086B18695806886B984B1B6 -:104F600095B1019684B995B987709927892B41F439 -:104F7000EAB1FBB1CF0101968AB99BB986B18083B2 -:104F800086B18695806886B984B195B1019684B959 -:104F900095B987709927892B41F4EAB1FBB1CF010C -:104FA00001968AB99BB986B1808386B1869586B908 -:104FB00084B195B1019684B995B987709927892BE9 -:104FC00041F4EAB1FBB1CF0101968AB99BB986B130 -:104FD0008083FF91EF919F918F915F914F913F91CE -:104FE0002F910F900BBE0F9008BE0F900FBE0F9029 -:104FF0001F901895BF92CF92DF92EF92FF920F937E -:105000001F93CF93DF93CDB7DEB7DA95CDBFDEBF69 -:105010008091B52C8823F1F08EB19FB140910804A6 -:10502000509109042091B12C3091B22C842B952BF6 -:10503000821B930B20912020309121202F5F3F4F26 -:105040002817390738F414B815B881E08093B42CC8 -:105050001092B52C15DA811144C1EED9882309F4D8 -:1050600040C18091B52C81113CC18091B32C81113C -:1050700005C08091B42C882309F433C18091B02CF1 -:10508000873041F48091200A9091210A8532914025 -:1050900008F427C18091B42C882309F4A6C084B1F8 -:1050A00095B1892B09F4A1C084B195B1089718F482 -:1050B00014B815B89AC044B155B1495F5F4F63E069 -:1050C000569547956A95E1F764EB70E3CE0101963A -:1050D0000E943B5384EB90E38AB99BB904B115B1AC -:1050E00014B815B8C12CD12C73E1B72EE8E0EE2E20 -:1050F000F12CC016D10608F078C0F60153E0F69501 -:10510000E7955A95E1F741E050E04C0F5D1FE40F41 -:10511000F51F8081982F96959695908383708130A6 -:1051200039F0E8F0823009F059C086B1869503C0A5 -:1051300086B18695806886B984B195B1019684B9A7 -:1051400095B987709927892B09F048C0EAB1FBB15E -:10515000CF0101968AB99BB986B180833FC084B1E3 -:1051600095B187709927892BC1F0E4B1F5B186B16B -:1051700024B135B143E0F695E7954A95E1F7EC5453 -:10518000FF4C90E027703327A701421B530B02C04E -:10519000959587954A95E2F78083E091622EF0918C -:1051A000632E8781883011F4B0928B2C86818830F1 -:1051B00011F4B0928A2C44B155B1495F5F4F93E02E -:1051C000569547959A95E1F7E0915F2EF091602E04 -:1051D00064EB70E382E4199581E001C080E052E065 -:1051E000C50ED11C882309F484CF1092B32C1092E1 -:1051F000B42C64B175B1E091552EF091562E84EB2C -:1052000090E3199584B995B984B195B1892B09F4C6 -:1052100068C089E0809381031092000A1092200AEE -:105220001092210A8FE790E08093260A9093270A34 -:105230008FE590E08093280A9093290A1092060A3D -:1052400080E180930C0A93E09093070A1092600922 -:10525000109261092FEF3FEF2093660930936709A1 -:1052600020E031E0209368093093690910924609E3 -:1052700080934C0981E08093470981E1809380010C -:10528000109288011092800310922906E091622EFC -:10529000F091632E8781893019F483E180938B2C00 -:1052A0008681893019F483E180938A2C44B155B109 -:1052B000495F5F4F83E0569547958A95E1F7E09106 -:1052C0005F2EF091602E64EB70E383E4199581E02A -:1052D0008093B02C12B8109220091092210980936B -:1052E0000009D395CDBFDEBFDF91CF911F910F9104 -:1052F000FF90EF90DF90CF90BF90089514B815B84D -:1053000081E08093B32C6AC81092070A1092000AB9 -:105310001092470910924009809181038E7F8093FB -:10532000810384B195B187709927892BC9F0E4B1C5 -:10533000F5B186B144B155B193E0F695E7959A95EC -:10534000E1F7EC54FF4C90E04770552728E030E03F -:10535000241B350B02C0959587952A95E2F780832B -:1053600081E08093B42C1092B52C8FEF9FEF809347 -:10537000260A9093270A1092200A1092210A10926E -:10538000060A1092070A1092030A84E08093000A2A -:1053900087E08093B02C1092B02C1092B42C109215 -:1053A000B32C41C881E08093B82C1092B62C08959C -:1053B00081E08093B82C08950895CF92DF92EF9208 -:1053C000FF920F931F93CF93DF93CDB7DEB725974F -:1053D000CDBFDEBF8C01FC0180819091B82C923052 -:1053E000F1F038F0943079F120F1953009F44AC0A9 -:1053F00049C121E09227292F21702093B62C9111C9 -:1054000002C0863219F0823509F03CC184E4F8010B -:105410008083118282E08093B82C80E134C1909126 -:10542000B62C911102C08632B1F0823509F04DC020 -:1054300012C09091B62C911102C0863261F0823573 -:1054400009F075C008C09091B62C911102C0863247 -:1054500011F0823539F484E4F8018083118281E00F -:1054600089270DC0803309F41BC1823A09F434C185 -:10547000803A09F451C1803509F4F6C081E0809387 -:10548000B82C00C160E170E0C8010E948933882314 -:10549000A1F080915E2E81110BC06091B72CF4E0D9 -:1054A0006F9FB001112444E050E0C8010E94B20E89 -:1054B00084E08093B82C8AE004C084E08093B82C08 -:1054C00081E0F801808384E0DEC08339B9F6198277 -:1054D0001A821B821C8288E8898343E050E060E0E6 -:1054E00070E0CE0102960E94640EF8018181803244 -:1054F00009F4ABC0803709F048C0F8019281898176 -:105500009813C0C093818A819813BCC094818B8109 -:105510009813B8C095818C819813B4C084E08083BF -:1055200061E070E0C8010E945E3383E02AC08539E3 -:1055300009F0A4CF44E050E064E070E0CE010196B1 -:105540000E94640EF8018181803209F47EC08037A8 -:10555000E1F4F80192818981981394C093818A8142 -:10556000981390C094818B8198138CC095818C8105 -:10557000981388C0108261E070E0C8010E945E3319 -:1055800084E08093B82C88E17EC0E82EE2949FE00E -:10559000E9222EEF2E0D8F70F82E88E090E08F1903 -:1055A00091094FEF50E06A0102C0D594C7948A95E3 -:1055B000E2F7253021F0243059F5FF20E9F044E0EE -:1055C00050E0B8016E5F7F4FCE0101962D830E949F -:1055D0002E532D81892B61F49A81898189279B81A2 -:1055E00089279C818927F801968189278C2169F177 -:1055F000243071F4F11046C044E050E0B8016E5F11 -:105600007F4FCE0101960E942E53892BF1F03AC0B4 -:105610002430C0F5E22EF12CA701B8016E5F7F4F58 -:10562000CE0101960E942E53892B61F5D801AE0D53 -:10563000BF1DE1E0F0E0EC0FFD1FEE0DFF1D129627 -:105640009C9180818927C822E9F42981F80120836F -:105650003A8131839B8192838C8183832327922794 -:105660008927848388E20FC0F8018181811142C0BB -:1056700062E070E0C8010E948933882309F420CFDA -:105680001092B82C80E090E02596CDBFDEBFDF9170 -:10569000CF911F910F91FF90EF90DF90CF900895E1 -:1056A000F801F18062E070E0C8010E94893388232C -:1056B00009F406CFFFE0FF15E8F084E0F89EB001A2 -:1056C000112440E150E0C8010E94640E60E170E0E6 -:1056D000C801F4D780E9D7CFF801F18066E070E027 -:1056E000C8010E948933882309F4EACE8EEF8F0D1A -:1056F0008E3018F0F8011082E6CE80915E2E811176 -:10570000DACEF4E0FF9EB001112444E050E0C8017D -:1057100002960E94B20ECFCEF801F18062E070E0F6 -:10572000C801F7D7882309F4CBCE8EEF8F0D8E30CA -:1057300008F7F092B72C85E0BCCECF93DF93EC0155 -:1057400043E050E060E070E00E94640E44E050E00E -:1057500064E070E0CE010396DF91CF910C94640E6B -:105760000F931F93CF93DF931F921F92CDB7DEB796 -:105770008C01FC0190818181892798E88927928199 -:1057800089278A83948183818927958189279681B6 -:105790008927898343E050E060E070E0C8010E94FF -:1057A000B20E41E050E063E070E0CE0102960E944C -:1057B000B20E44E050E064E070E0C80103960E943D -:1057C000B20E41E050E068E070E0CE0101960E9428 -:1057D000B20E0F900F90DF91CF911F910F9108950E -:1057E00081E08093DC2C84E090E08093BB2C90934C -:1057F000BC2C88E08093BA2C1092B92C089581E0DB -:105800008093DC2C84E490E08093BB2C9093BC2CA0 -:1058100088E08093BA2C1092B92C089581E080938F -:10582000DC2C82E090E08093BB2C9093BC2C88E130 -:105830008093BA2C1092B92C089581E08093DC2CCF -:10584000089508958F929F92AF92BF92CF92DF9268 -:10585000EF92FF920F931F93CF93DF93CDB7DEB7F5 -:105860006397CDBFDEBF8C015B018091DC2C67307C -:10587000710501F5F8019081882311F0963211F03D -:105880009235C1F421E0811120E02093B92C4091A0 -:10589000BB2C3091BC2C211102C0963211F09235F4 -:1058A00039F4F801408331838FEF8093BD2C38C0E9 -:1058B000A12CB12C853009F49CC050F48230A9F1A0 -:1058C000C8F0833009F469C0843009F482C0C2C5CD -:1058D000883009F425C138F4863009F49AC087303D -:1058E00009F4D3C0B7C5893009F44FC38D3008F42B -:1058F00071C3B0C591E08927982F91709093B92C0E -:105900003091BB2C2091BC2CF8019081811102C0F8 -:10591000963219F0923509F019C4F80130832183C9 -:1059200084E08093DC2C80E196C5F8018081982F7B -:105930009D7F913419F48AE0808367C38033C1F47A -:1059400062E070E0C801E5D6882309F49CC0F80144 -:105950006181F0E16F9FB001112440E150E0C80186 -:105960000E94640E60E170E0C801A8D680E973C5AA -:10597000803A79F462E070E0C801CBD6882309F45C -:1059800082C0F80181818093D32C83E08093DC2C4A -:10599000D2CF803509F05EC552C060E170E0C80129 -:1059A000B8D6882389F080915E2E81110BC060915A -:1059B000D32CF0E16F9FB001112440E150E0C80109 -:1059C0000E94B20E8AE001C081E0F801808382E08B -:1059D0001AC39091B92C3091BB2C2091BC2CF801AA -:1059E0008081911102C0863211F1823509F0B6C36F -:1059F0001EC09091B92C3091BB2C2091BC2CF80189 -:105A00008081911102C0863291F0823509F053C431 -:105A10000EC09091B92C3091BB2C2091BC2CF80178 -:105A20008081911102C0863211F0823531F4F80183 -:105A30003083218381E0892786C38035C9F4F8014A -:105A40008181882319F0F8011082DFC262E070E0E2 -:105A5000C8015FD68823B9F0E0915F2EF091602EE7 -:105A600040E060E070E081E919951092DC2CF2C40E -:105A700090EA980F923008F0C1C462E070E0C8016B -:105A800048D68111EAC481E054C2C8010E945C3941 -:105A900064E07801F4E0EF0EF11CC7010E94733C52 -:105AA000E0915F2EF091602E44E0B70180EA1995F5 -:105AB000F80194818091D42C981329C0958180910C -:105AC000D52C981324C096818091D62C98131FC092 -:105AD00097818091D72C98131AC08091D82C8083FD -:105AE0008091D92C81838091DA2C82838091DB2C68 -:105AF000838364E0C8010E94653EE0915F2EF091CF -:105B0000602E44E0B80181EA199588E009C2E0916D -:105B10005F2EF091602E44E064ED7CE280EC32C2B6 -:105B2000F8018081803551F48181811107C0828123 -:105B3000873521F483818D3C09F40AC264E0C801F1 -:105B40000E94733CF8018081803309F0C2C062E09A -:105B500070E0C801DED5882309F4ACC0F80161818A -:105B600067FD04C0862F8370833029F0862F8F70E5 -:105B70008F3009F084C06093D32C8091BE2C90911B -:105B8000BF2C3091C02C282F22952095422F4927D9 -:105B9000407F09F043C023272F7009F03FC0929542 -:105BA00090959327907FD1F5262F67FD02C0237033 -:105BB00003C02F7009F023E0982F9095432F429552 -:105BC0004F702223C1F0892F90E0022E02C09595DC -:105BD00087950A94E2F7982FE32FF0E0022E02C097 -:105BE000F595E7950A94E2F73E2F50E002C05595EF -:105BF00047952A95E2F740FBCC24C0F8D12CCC0C79 -:105C0000DD1CCC0CDD1C30FBEE24E0F8F12CEE0C9E -:105C1000FF1CEC28892F81708E2901C087E020911C -:105C2000D22C30E0280F311D280F311DF901E05B27 -:105C3000FF4D8081F8019801205F3F4F1192E217DC -:105C4000F307E1F79091C12CF801918782FF09C019 -:105C50009091BE2C96839091BF2C97839091C02CED -:105C6000908784FF15C06360F0E16F9FB00111243D -:105C7000665F7F4F46E050E0C8010A9607C080E1AA -:105C8000689FB001112440E150E0C8010E94640EF9 -:105C900060E170E0C80112D5E0915F2EF091602EB6 -:105CA00042E1B80180E8199562E1C8010E94653EB1 -:105CB00080E939C10E947E3B91E08927F801808309 -:105CC000E0915F2EF091602E44E0B80181EC1995CF -:105CD0009CC1803A61F462E070E0C8011AD5882363 -:105CE000D9F1F80181818093D32C89E00DC0803CEB -:105CF00089F462E070E0C8010CD5882369F1F801ED -:105D000081818093D32C8BE08093DC2C0E947E3B9E -:105D10009AE00EC1813C91F462E070E0C801F9D4D0 -:105D20008823D1F0F80181818093D32C4AE0F42EAE -:105D3000F092DC2C0E947E3B8F25FBC0823C99F4C4 -:105D400062E070E0C801E5D4882331F0F801818178 -:105D50008093D32C8CE0D8CFE0915F2EF091602E11 -:105D600044E0B80121C0803B11F562E070E0C80159 -:105D7000D0D4E0915F2EF091602E44E0B8018823EA -:105D800099F086E8199580915E2E8111BFCFF801B8 -:105D90006181F0E16F9FB001112440E150E082EC9D -:105DA0009CE20E94B20EB2CF81EC1995BEC090EA7F -:105DB000980F923008F0BFC062E070E0C801A9D42B -:105DC000882309F4B2C0F8018081803621F03AE3DB -:105DD000C32ED12C03C020E3C22ED12CF801818127 -:105DE00087FF0CC0807FF0E18F9F7001112480EC51 -:105DF000C80ED11C96EFA92EB12C08C08C7F90E163 -:105E0000899F7001112486E3A82EB12CE0915F2EAA -:105E1000F091602E42E0B80180E91995F801808187 -:105E200081708093D22CC701B4E096958795BA957E -:105E3000E1F78093D32C9091BD2C981769F0B701AE -:105E40006A0D7B1D44E050E08EEB9CE20E94640EE4 -:105E50008091D32C8093BD2C68E0CE0101960E94E6 -:105E6000A20D80915D2E44E050E0873019F463E08C -:105E700070E002C060E070E0CE010F960E94640EF8 -:105E8000B7016C0D7D1D46E050E0CE0109960E94E1 -:105E9000640E89818093D42C8A818093D52C8B8148 -:105EA0008093D62C8C818093D72C60E484ED9CE287 -:105EB0000E94AB408091D42C8093D82C8091D52C1B -:105EC0008093D92C8091D62C8093DA2C8091D72C7A -:105ED0008093DB2C60E288ED9CE20E94AB4020E0E6 -:105EE000AE014F5F5F4FBE01615F7F4FCE010996EC -:105EF000F7D68981F80180838A8181838B818283AF -:105F00008C818383E058FF4F8D81808331968E8111 -:105F1000808331968F81808331968885808387E066 -:105F20008093DC2C80E290E174C30E947E3B91E080 -:105F30008927F80101CD8035B9F4F80181818111FB -:105F400082CD62E070E0C801E4D3882309F49BCDE0 -:105F50001092DC2CE0915F2EF091602E40E060E02A -:105F600070E081E9199576C2A501495F5F4FA3E012 -:105F700056954795AA95E1F7E0915F2EF091602E36 -:105F8000B80182E9199581E0DEC062E1C8010E9492 -:105F9000733C60E170E0C801BCD3E0915F2EF091EA -:105FA000602E882329F142E1B80181E8199580919A -:105FB0005E2E81110BC06091D32CF0E16F9FB00178 -:105FC000112440E150E0C8010E94B20E0E947E3BC5 -:105FD0009AE015C066E0C8010E94733C64E070E07E -:105FE000C80197D3811113C0E0915F2EF091602E0C -:105FF00044E0B80181EC19950E947E3B91E089272D -:10600000F801808388E08093DC2C84E024C26091D6 -:10601000D32CF0E16F9FB001112440E150E082ECFD -:106020009CE20E94640E9091C22C8091C62C8095B7 -:106030009813EBC28091CA2C9813E7C22091C32C0D -:106040008091C72C80952813E0C28091CB2C281317 -:10605000DCC2C090C42C8091C82C8095C812D5C2D7 -:106060008091CC2CC812D1C28091C52C3091C92C02 -:1060700030958313CAC23091CD2C8313C6C2409190 -:10608000CE2C3091CF2C30954313BFC23091D02C01 -:106090004313BBC23091D12C30954313B6C2F801E3 -:1060A000308141818280912CA12CB12C5401992402 -:1060B0008824942A832A3381B32AD12CE12CF12C11 -:1060C0007601DD24CC24D22AC92AF82A8091DC2C3E -:1060D0008B3009F07FC2E0915F2EF091602E46E098 -:1060E000B80185E81995C818D908EA08FB08C092D4 -:1060F000C22C33272F2D1E2D0D2D0093C32CA7014D -:10610000662777274093C42C8F2D9927AA27BB2772 -:106110008093C52CEC2DE095E093C62CE02FE09504 -:10612000E093C72CE42FE095E093C82CE82FE0958E -:10613000E093C92CC092CA2C0093CB2C4093CC2C5A -:106140008093CD2C88E08093DC2C84C1903409F0BE -:1061500081C182E08093DC2C8AE0EBCE833909F0A8 -:1061600084CC80915D2E873009F0A0C043E050E0E0 -:1061700060E070E0CE0102960E94640E88E8898398 -:10618000F8019181903219F0903761F024C0F80144 -:1061900080833A8131832B8122839C8193832327BF -:1061A000822728C1F8018281883809F053C1938180 -:1061B0008A8198134FC194818B8198134BC195812B -:1061C0008C81981347C184E0808361E070E0C8014E -:1061D00075D285E09EC0E92EE2942FE0E2222EEFF8 -:1061E0002E0D9F70F92E88E090E08F1991094FEFE6 -:1061F00050E06A0102C0D594C7948A95E2F7253031 -:1062000021F0243059F5FF20E9F044E050E0B801D6 -:106210006E5F7F4FCE0101962B8B0E942E532B89F0 -:10622000892B61F49A818B81892798E889279C8141 -:106230008927F801968189278C2181F1243071F416 -:10624000F11008C144E050E0B8016E5F7F4FCE010D -:1062500001960E942E53892B09F1FCC0243008F0CE -:10626000F9C0E22EF12CA701B8016E5F7F4FCE017D -:1062700001960E942E53892B09F0ECC0D801AE0D77 -:10628000BF1DE1E0F0E0EC0FFD1FEE0DFF1D1296CB -:106290009C9180818927C82209F0DCC098E8F80128 -:1062A00090833A8131832B812283A0C044E050E067 -:1062B00060E070E007C0853909F0D7CB44E050E0DA -:1062C00063E070E0CE0101960E94640E9091BA2CBA -:1062D000F8018181803209F482C08037F1F4F8013D -:1062E000228189812813B6C023818A812813B2C0F4 -:1062F00024818B812813AEC025818C812813AAC0EC -:10630000908361E070E0C801D9D18FEF8093BD2CFC -:1063100086E08093DC2C88E19EC0E82EE2949FE02A -:10632000E9222EEF2E0D8F70F82E88E090E08F1965 -:1063300091094FEF50E06A0102C0D594C7948A9545 -:10634000E2F7253021F0243059F5FF20E9F044E050 -:1063500050E0B8016E5F7F4FCE0101962B8B0E94FB -:106360002E532B89892B61F49A81898189279B81FE -:1063700089279C818927F801968189278C2179F1C9 -:10638000243071F4F11066C044E050E0B8016E5F53 -:106390007F4FCE0101960E942E53892B01F15AC0E6 -:1063A000243008F057C0E22EF12CA701B8016E5F2F -:1063B0007F4FCE0101960E942E53892B09F04AC0CF -:1063C000D801AE0DBF1DE1E0F0E0EC0FFD1FEE0DBA -:1063D000FF1D12969C9180818927C822D9F52981B9 -:1063E000F80120833A8131839B8192838C8183835E -:1063F000232792278927848388E22DC0823C09F0D5 -:10640000CBC0F8019181903E09F0C8C09281943BC5 -:1064100009F0C4C046E050E06AEA74E0CE0101969B -:106420000E94640E89818B3409F02DCB8A818937D3 -:1064300009F029CB8B818B3109F025CB8C818A3EE9 -:1064400009F021CB8D818B3709F01DCB8E818C3CDF -:1064500009F019CB80E090E0DCC0F8018081803643 -:1064600021F08AE3C82ED12C03C0B0E3CB2ED12C6F -:10647000F801818187FF0CC0807FF0E18F9F700160 -:10648000112480ECC80ED11CA6EFAA2EB12C08C096 -:106490008C7F90E1899F70011124F6E3AF2EB12C1F -:1064A000E0915F2EF091602E42E0B80180E91995ED -:1064B000F801808181708093D22CC701E4E0969529 -:1064C0008795EA95E1F78093D32CB7016A0D7B1D80 -:1064D00044E050E08EEB9CE20E94640E8091D32C4D -:1064E0008093BD2C68E0CE0101960E94A20D8091A0 -:1064F0005D2E44E050E0873019F463E070E002C0A4 -:1065000060E070E0CE010F960E94640EB7016C0D42 -:106510007D1D46E050E0CE0109960E94640E8981FF -:106520008093D42C8A818093D52C8B818093D62C18 -:106530008C818093D72C60E484ED9CE20E94AB4078 -:106540008091D42C8093D82C8091D52C8093D92CF9 -:106550008091D62C8093DA2C8091D72C8093DB2CE1 -:1065600060E288ED9CE20E94AB4087E08093DC2CE7 -:106570008981F80180838A8181838B8182838C81E8 -:106580008383AE014F5F5F4FBE01615F7F4FCE01DE -:106590000996F0D080E25FCF803339F0982F9F7E4C -:1065A000903A19F0805C833078F481E08093DC2CA1 -:1065B00084E0F8018083E0915F2EF091602E40E04E -:1065C00060E070E082EC83CBE0915F2EF091602E72 -:1065D00040E0D6CC8A3069F4E0915F2EF091602ED5 -:1065E00046E0B80184E81995C80CD91CEA1CFB1CCC -:1065F0007ECD8C3009F07BCDE0915F2EF091602E46 -:1066000046E0B80187E8199572CD0E947E3B96E07E -:10661000F6CC6396CDBFDEBFDF91CF911F910F9176 -:10662000FF90EF90DF90CF90BF90AF909F908F90B2 -:106630000895CF93DF9320915D2E273071F4EC0104 -:1066400043E050E060E070E00E94640E44E050E0FF -:1066500063E070E0CE01039604C044E050E060E0E7 -:1066600070E0DF91CF910C94640ECF93DF931F9273 -:10667000CDB7DEB720915D2E273029F447E050E0FA -:1066800060E070E015C0FC01318120812327328158 -:10669000232733812327298344E050E060E070E022 -:1066A0000E94B20E41E050E064E070E0CE0101963D -:1066B0000E94B20E0F90DF91CF91089520E42093B5 -:1066C000D00026EC2093D5002093D40021E0209325 -:1066D000D000DC01680F791FA617B70741F0ED91D4 -:1066E000F0E0EC59FA4FE491E093D300F5CFE0915C -:1066F000D500F0E0EC59FA4FE491EC93E091D4002E -:10670000F0E0EC59FA4FE4911196EC931092D0001E -:10671000089520E42093D00026EC2093D500209308 -:10672000D40021E02093D000DC01680F791FA61768 -:10673000B70741F0ED91F0E0EC59FA4FE491E093A6 -:10674000D300F5CFE091D500F0E0EC59FA4FE49199 -:106750008C918E130AC0E091D400F0E0EC59FA4F0E -:10676000E49181E011969C919E1380E01092D000FC -:10677000817008958F929F92AF92BF92CF92DF92D5 -:10678000EF92FF920F931F93CF93DF93DC018C91D5 -:1067900010E0E0E0869517958695E7958695179524 -:1067A0008695E795869517958695E795869517952D -:1067B0008695E79511968C911197869517958695F4 -:1067C000E795869517958695E7958695179586950D -:1067D000E795869517958695E79512968C91129771 -:1067E000F0E030E08695F795869537958695F79594 -:1067F000869537958695F795869537958695F7957D -:106800008695379513968C9113978695F79586956F -:1068100037958695F795869537958695F79586955C -:1068200037958695F7958695379514968C9114979C -:1068300090E020E086959795869527958695979583 -:10684000869527958695979586952795869597950C -:106850008695279515968C9186959795869527957B -:1068600086959795869527958695979586952795EC -:1068700086959795869527955B01DA014A0144E054 -:10688000840E911C6C91E50179915E017627C32EEF -:10689000D12CA60140545E4DEE2EF12CE701C054E0 -:1068A000DF4D7E01EA01D880E7010881ED2CE02A66 -:1068B000C22ED12CA60140545D4DEA010881E02A88 -:1068C000F12CA70140565F4DEA0108810695879596 -:1068D000DF2FD071FD2E012F017EF026092F0072CF -:1068E000F0260E2F0479F026032F0377F026022FCF -:1068F0000A73F0260F2D0295F0260F2D06950695AA -:10690000F0260F2D0727F6940F2506959795F795F6 -:1069100017957695CF2ED12CA60140545E4DE12ED1 -:10692000F12CE701C054DF4D7E01EA01D880E70178 -:106930000881ED2CE02AC92ED12CA60140545D4DD2 -:10694000EA010881E02AF12CA70140565F4DEA01D7 -:10695000088106958795D32FD071FD2E0E2F017ECD -:10696000F026022F0072F026012F0479F0260F2F57 -:106970000377F026092F0A73F0260F2D0295F026D3 -:106980000F2D06950695F0260F2D0727F6940F2557 -:10699000069527953795E7957695C32ED12CA601B8 -:1069A00040545E4DEE2EF12CE701C054DF4D7E01C8 -:1069B000EA01D880E7010881ED2CE02AC22ED12C13 -:1069C000A60140545D4DEA010881E02AF12CA7019F -:1069D00040565F4DEA01088106958795DF2FD071FB -:1069E000FD2E012F017EF026092F0072F0260E2FBA -:1069F0000479F026032F0377F026022F0A730F2560 -:106A0000F02EF2940F25F02EF694F6940F25F02E2A -:106A1000F72606950F25D12E102F16959795F795E9 -:106A2000D79476950F2F10E0A80140545E4D0D2DA0 -:106A300010E000541F4DEA01F880E80118810F2D85 -:106A4000012BE92EF12CA70140545D4DEA0118817C -:106A5000012B10E000561F4DE8011881169587950F -:106A6000032F00711E2F117E0127122F1072012794 -:106A70001D2D147901271F2F13770127192F1A7342 -:106A80000127102F12950127102F16951695012713 -:106A9000102F172706951027169527953795E795F8 -:106AA0007695032F10E0A80140545E4D0E2F10E0A4 -:106AB00000541F4DEA01F880E80118810F2D012BC9 -:106AC000E22EF12CA70140545D4DEA011881012B03 -:106AD00010E000561F4DE8011881169587950F2F7D -:106AE00000711D2D117E0127192F107201271E2FF5 -:106AF00014790127132F13770127122F1A730127F7 -:106B0000102F12950127102F169516950127102F7B -:106B1000172706950127102F16959795F795D79467 -:106B200076950F2F10E0A80140545E4D0D2D10E01A -:106B300000541F4DEA01F880E80118810F2D012B48 -:106B4000E92EF12CA70140545D4DEA011881012B7B -:106B500010E000561F4DE801188116958795032F08 -:106B600000711E2F117E0127122F107201271D2D7B -:106B7000147901271F2F13770127192F1A73012763 -:106B8000102F12950127102F169516950127102FFB -:106B9000172706951027169527953795E79576952B -:106BA000032F10E0A80140545E4D0E2F10E000545A -:106BB0001F4DEA01F880E80118810F2D012BE22E0C -:106BC000F12CA70140545D4DEA011881012B10E022 -:106BD00000561F4DE8011881169587950F2F0071FB -:106BE0001D2D117E1027092F007210270E2F0479FA -:106BF0001027032F03771027022F0A731027012F66 -:106C000002951027012F069506951027012F0727BB -:106C1000169501271D2D06959795F7951795CF2E5B -:106C2000D12CA60140545E4DE12EF12CE701C05459 -:106C3000DF4D7E01EA01D880E7010881ED2CE02AD2 -:106C4000C92ED12CA60140545D4DEA010881E02AED -:106C5000F12CA70140565F4DEA0108810695879502 -:106C6000D32FD071FD2E0E2F017EF026022F007241 -:106C7000F026012F0479F0260F2F0377F026092F35 -:106C80000A730F25F02EF2940F25F02EF694F69449 -:106C90000F25769570270695702776952795379559 -:106CA000E79568276D93A815B90509F0EBCD10930A -:106CB000DD2CF093DE2C9093DF2CE093E02C3093CE -:106CC000E12C2093E22CDF91CF911F910F91FF9047 -:106CD000EF90DF90CF90BF90AF909F908F900895EE -:106CE0004F925F926F927F929F92AF92BF92CF929C -:106CF000DF92EF92FF920F931F93CF93DF93DC010C -:106D00008C9110E0B12CEB2D8695E7958695179523 -:106D10008695E795869517958695E79586951795B7 -:106D20008695E7958695179511968C911197BE2EAD -:106D30008695B794869517958695B79486951795F9 -:106D40008695B794869517958695B79486951795E9 -:106D500012969C91129730E080E0969587959695D3 -:106D600037959695879596953795969587959695A7 -:106D70003795969587959695379513969C91139789 -:106D80009695879596953795969587959695379587 -:106D90009695879596953795969587959695379577 -:106DA0001496EC91149790E000E0E6950795E6952F -:106DB0009795E6950795E6959795E6950795E69557 -:106DC0009795E6950795E69597951596DC90D69458 -:106DD0000795D6949795D6940795D6949795D6947B -:106DE0000795D6949795D6940795D6949795E32FC3 -:106DF000F0E0E054FE4DA12FB0E0A054BF4DF08173 -:106E0000EC91EF2BA92FB0E0A054BD4DFC91EF2BDE -:106E1000F0E0E056FF4DE0802B01BA016C5F7F4F40 -:106E2000DA013B01AC90E201C9902E01CA24FD2D8C -:106E3000E694F795D82FD071FD2EEB2DE17EFE263E -:106E4000E02FE072FE26E12FE479FE26E32FE377C0 -:106E5000FE26E92FEA73EF25FE2EF294EF25FE2E93 -:106E6000F694F694EF25FE2EFC24E695FE26EB2DF7 -:106E700020FDFE24F69407958795E795BC2CB694E3 -:106E8000C82ED12CA60140545E4DEE2EF12CE70108 -:106E9000C054DF4D7E01EA01D880E701F880ED2C77 -:106EA000EF28C02ED12CA60140545D4DEA01F88098 -:106EB000EF28F12CA70140565F4DEA01D880D69407 -:106EC000F795D32FD071ED2E412F417EE426592F17 -:106ED0005072E526CE2FC479EC26D82FD377ED2635 -:106EE000402F4A73E426FE2CF294EF24FE2CF694F5 -:106EF000F694EF24FE2CFB24E694FE2420FDFD24D2 -:106F0000F694979537951795B694C32ED12CE60134 -:106F1000C054DE4DE12EF12CA70140545F4DD880C6 -:106F2000EA01F880ED2CEF28C92ED12CA60140549F -:106F30005D4DEA01F880EF28F12CA70140565F4D26 -:106F4000EA01D880D694F795D82FD071ED2E4E2F28 -:106F5000417EE426502F5072E526C12FC479EC26DD -:106F6000D32FD377ED26492F4A73E426FE2CF294D3 -:106F7000EF24FE2CF694F694EF24FE2CFB24E694EA -:106F8000FE2420FDFD24F69407958795E795B69499 -:106F9000C82ED12CE601C054DE4DEE2EF12CA701F7 -:106FA00040545F4DD880EA01F880ED2CEF28C02EC8 -:106FB000D12CA60140545D4DEA01F880EF28F12C58 -:106FC000A70140565F4DEA01D880D694F795D32F9C -:106FD000D071ED2E412F417EE426592F5072E526C7 -:106FE000CE2FC479EC26D82FD377ED26402F4A73C5 -:106FF000E426FE2CF294EF24FE2CF694F694EF2473 -:10700000FE2CFB24E694FE2420FDFD24F6949795A7 -:1070100037951795B694C32ED12CE601C054DE4D9A -:10702000E12EF12CA70140545F4DD880EA01F88091 -:10703000ED2CEF28C92ED12CA60140545D4DEA015C -:10704000F880EF28F12CA70140565F4DEA01D88067 -:10705000D694F795D82FD071ED2E4E2F417EE42691 -:10706000502F5072E526C12FC479EC26D32FD37749 -:10707000ED26492F4A73E426FE2CF294EF24FE2CD1 -:10708000F694F694EF24FE2CFB24E694FE2420FDD7 -:10709000FD24F69407958795E795B694C82ED12CD4 -:1070A000E601C054DE4DEE2EF12CA70140545F4D99 -:1070B000D880EA01F880ED2CEF28C02ED12CA60153 -:1070C00040545D4DEA01F880EF28F12CA7014056AD -:1070D0005F4DEA01D880D694F795D32FD071ED2E6D -:1070E000412F417EE426592F5072E526CE2FC479D8 -:1070F000EC26D82FD377ED26402F4A73E426FE2CBA -:10710000F294EF24FE2CF694F694EF24FE2CFB244C -:10711000E694FE2420FDFD24F69497953795179567 -:107120009B2C9694C32ED12CE601C054DE4DE12E4B -:10713000F12CA70140545F4DD880EA01F880ED2C76 -:10714000EF28C92ED12CA60140545D4DEA01F880EC -:10715000EF28F12CA70140565F4DEA01D880D69464 -:10716000F795D82FD0714E2F417EF42EFD26502F4B -:107170005072F526C12FC479FC26D32FD377FD2674 -:10718000492F4A73F426EF2CE294FE24EF2CE69468 -:10719000E694FE24EF2CE924F694FE24BE2EEF2D77 -:1071A00020FDED25E69507958795B794C82ED12C3F -:1071B000E601C054DE4DEB2CF12CA70140545F4D8D -:1071C000D880EA01E881ED2CEE2AC02ED12CA60150 -:1071D00040545D4DEA01E881EE2AF12CA7014056AA -:1071E0005F4DEA01F880DF2EF694D794F32FF0710B -:1071F000E12FE17EEF27F92FF072EF27FB2DF479D5 -:10720000EF27F82FF377EF27F02FFA73EF27FE2FF2 -:10721000F295EF27FE2FF695F695EF2796949E268A -:10722000E6959E2620FD9F24969497953795179571 -:10723000E32FF0E0AF0140545E4DE12FF0E0E05469 -:10724000FF4DEA01F880E081EF29E92EF12CA7013A -:1072500040545D4DEA01F881EF2BF0E0E056FF4D20 -:10726000E080EA2DF0E0EC59FB4FE491EE25E301DC -:10727000E9933E01AD24AD92A617B70709F0D2CD30 -:10728000B092DD2C8093DE2C0093DF2C1093E02C49 -:107290003093E12C9093E22CDF91CF911F910F91CD -:1072A000FF90EF90DF90CF90BF90AF909F907F9036 -:1072B0006F905F904F900895AF92BF92CF92DF9200 -:1072C000EF92FF920F931F93CF93DF936091DD2C8A -:1072D0005091DE2C2091DF2C4091E02C3091E12C5C -:1072E000D091E22CFC015C0104E0A00EB11C819164 -:1072F000C52FC071962F917EC927922F9072C927F2 -:10730000942F9479C927932F9377C9279D2F9A7328 -:10731000C9277C2F7295C7277C2F76957695C7272E -:10732000A32FB0E08D0100541E4D6801A42FB0E0E2 -:107330008D0100541F4D7801D6010C91D7019C910D -:10734000092BED2EF12CD701A054BD4D9C91092B9A -:1073500010E000561F4DD8017C9178277C27C695F8 -:107360007C2786957695279557956795C32FC0718D -:10737000942F917EC9279D2F9072C927962F9479BB -:10738000C927952F9377C927922F9A73C9277C2FE6 -:107390007295C7277C2F76957695C727052F10E025 -:1073A000D801A054BE4D6D01062F10E0D801A054A5 -:1073B000BF4D7D01D6010C91D7019C91092BE22E86 -:1073C000F12CD701A054BD4D9C91092B10E0005623 -:1073D0001F4DD8017C9178277C27C6957C27869500 -:1073E0009D2F7695979537954795C52FC071762F28 -:1073F000717EC727722F7072C727742F7479C727C1 -:10740000732F7377C727792F7A73C7277C2F7295CD -:10741000C7277C2F76957695C727032F10E0D801D4 -:10742000A054BE4D6D01042F10E0D801A054BF4DF3 -:107430007D01D6010C91D7017C91072BE92EF12C0F -:10744000D701A054BD4D7C91072B10E000561F4D75 -:10745000D8017C9178277C27C6957C2786957695E0 -:10746000279557956795C32FC071742F717EC727D5 -:10747000792F7072C727762F7479C727752F737786 -:10748000C727722F7A73C7277C2F7295C7277C2F47 -:1074900076957695C727052F10E0D801A054BE4DEC -:1074A0006D01062F10E0D801A054BF4D7D01D6011B -:1074B0000C91D7017C91072BE22EF12CD701A0541F -:1074C000BD4D7C91072B10E000561F4DD8017C91DB -:1074D00078277C27C6957C2786957695979537954E -:1074E0004795C52FC071762F717EC727722F707296 -:1074F000C727742F7479C727732F7377C727792FFE -:107500007A73C7277C2F7295C7277C2F769576953F -:10751000C727032F10E0D801A054BE4D6D01042FE2 -:1075200010E0D801A054BF4D7D01D6010C91D701C8 -:107530007C91072BE92EF12CD701A054BD4D7C91F5 -:10754000072B10E000561F4DD8017C9178277C272F -:10755000C6957C2786957695279557956795C32F71 -:10756000C071742F717EC727792F7072C727762F4D -:107570007479C727752F7377C727722F7A73C72738 -:107580007C2F7295C7277C2F76957695C727052F78 -:1075900010E0D801A054BE4D6D01062F10E0D801B7 -:1075A000A054BF4D7D01D6010C91D7017C91072BD2 -:1075B000E22EF12CD701A054BD4D7C91072B10E099 -:1075C00000561F4DD8017C9178277C27C6957C27D3 -:1075D00086957695979537954795C52FC071762FE7 -:1075E000717EC727722F7072C727742F7479C727CF -:1075F000732F7377C727792F7A73C7277C2F7295DC -:10760000C7277C2F76957695C727032F10E0D801E2 -:10761000A054BE4D6D01042F10E0D801A054BF4D01 -:107620007D01D6010C91D7017C91072BE92EF12C1D -:10763000D701A054BD4D7C91072B10E000561F4D83 -:10764000D8017C9178277C27C6957C27769527954D -:1076500057956795C32FC071742F717E7C27C92FF2 -:10766000C0727C27C62FC4797C27C52FC3777C279F -:10767000C22FCA737C27C72FC2957C27C72FC695F8 -:10768000C6957C278695C52FD0E0C054DE4D062FC9 -:1076900010E000541F4DD881D801CC91CD2B022F82 -:1076A00010E000541D4DD801DC91CD2BD0E0C05628 -:1076B000DF4DC8818C27872776958727D92F869518 -:1076C000D79537954795EA15FB0509F010CE6093DD -:1076D000DD2C5093DE2C2093DF2C4093E02C309354 -:1076E000E12CD093E22CDF91CF911F910F91FF906D -:1076F000EF90DF90CF90BF90AF900895CF93DF933E -:10770000EDEDFCE2A081718162813381248195815C -:10771000472F40718A2F817E8427462F407284270D -:10772000432F44798427422F43778427492F4A7374 -:107730008427482F42958427482F469546958427CD -:10774000482F46958427869567957795A795C22FEC -:10775000D0E0C054DE4D432F50E040545F4DB8811F -:10776000EA018881B82B492F50E040545D4DEA0171 -:107770008881CB2FC82BD0E0C05ADF4D88818695F9 -:10778000522F5071432F417E4527592F5072452764 -:107790005A2F54794527572F53774527562F5A7319 -:1077A0004527542F52954527542F569556954527D2 -:1077B000542F569545274695979527953795C72F6A -:1077C000D0E0C054DE4D4A2F50E040545F4DB881A8 -:1077D000EA014881B42B462F50E040545D4DEA0148 -:1077E0004881CB2FC42BD0E0C05ADF4D4881842B79 -:1077F0008695572F50714A2F417E4527562F50723C -:107800004527532F54794527522F53774527592F12 -:107810005A734527542F52954527542F5695569500 -:107820004527542F56954527469567957795A795F3 -:10783000C22FD0E0C054DE4D432F50E040545F4D86 -:10784000B881EA014881B42B492F50E040545D4D86 -:10785000EA014881CB2FC42BD0E0C05ADF4D4881CC -:10786000842B8695C72FD0E0C054DE4D4A2F50E0C0 -:1078700040545F4DB881EA014881B42B462F50E057 -:1078800040545D4DEA014881CB2FC42BD0E0C05A53 -:10789000DF4D4881842B522F5071432F417E452765 -:1078A000592F507245275A2F54794527572F537710 -:1078B0004527562F5A734527542F52954527542F45 -:1078C000569556954527542F569545274695979595 -:1078D00027953795A08371836283338324839583AF -:1078E000DF91CF9108950F931F93CF93DF93A091D2 -:1078F000DD2C7091DE2C2091DF2C5091E02C4091FA -:10790000E12C3091E22CFC01615008F4CDC1972F9D -:1079100090718A2F817E8927922F90728927952FC7 -:1079200094798927942F93778927932F9A7389279E -:10793000982F92958927982F969596958927982F15 -:1079400096958927869527957795A795C42FD0E09A -:10795000C054DE4D852F90E080549F4DB881EC01DE -:107960008881B82B832F90E080549D4DEC01888155 -:10797000CB2FC82BD0E0C058DF4DB881B695942FDF -:107980009071852F817E8927932F907289279A2F56 -:1079900094798927972F93778927922F9A7389272C -:1079A000982F92958927982F969596958927982FA5 -:1079B000969589278695379547955795C72FD0E097 -:1079C000C054DE4D8A2F90E080549F4D1881EC0109 -:1079D0008881182B822F90E080549D4DEC01888186 -:1079E000C12FC82BD0E0C058DF4D8881B82BB69589 -:1079F000972F90718A2F817E8927922F90728927E5 -:107A0000952F94798927942F93778927932F9A73A9 -:107A10008927982F92958927982F9695969589274B -:107A2000982F96958927869527957795A795C42FA2 -:107A3000D0E0C054DE4D852F90E080549F4D1881DA -:107A4000EC018881182B832F90E080549D4DEC0130 -:107A50008881C12FC82BD0E0C058DF4D8881B82B5A -:107A6000B695942F9071852F817E8927932F9072E0 -:107A700089279A2F94798927972F93778927922F8F -:107A80009A738927982F92958927982F969596957E -:107A90008927982F969589278695379547955795E5 -:107AA000C72FD0E0C054DE4D8A2F90E080549F4D08 -:107AB0001881EC018881182B822F90E080549D4D15 -:107AC000EC018881C12FC82BD0E0C058DF4D8881E0 -:107AD000B82BB695972F90718A2F817E8927922F88 -:107AE00090728927952F94798927942F93778927E6 -:107AF000932F9A738927982F92958927982F969577 -:107B000096958927982F9695892786952795779515 -:107B1000A795C42FD0E0C054DE4D852F90E080544F -:107B20009F4D1881EC018881182B832F90E08054A1 -:107B30009D4DEC018881C12FC82BD0E0C058DF4D8E -:107B40008881B82BB695942F9071852F817E9827C8 -:107B5000832F807298278A2F84799827872F83779D -:107B60009827822F8A739827892F82959827892FA3 -:107B7000869586959827892F86959827832F9695A1 -:107B8000879547955795C72FD0E0C054DE4D0A2FF3 -:107B900010E000541F4D3881E8019881392B022FE5 -:107BA00010E000541D4DE8019881C32FC92BD0E08F -:107BB000C058DF4D3881B32BB695372F30719A2FCF -:107BC000917E9327322F30729327352F3479932764 -:107BD000342F33779327382F3A739327392F3295E1 -:107BE0009327392F369536959327392F3695932736 -:107BF000969527957795A795C42FD0E0C054DE4D74 -:107C0000052F10E000541F4D3881E8019881392B71 -:107C1000082F10E000541D4DE8019881C32FC92B97 -:107C2000D0E0C058DF4D98813B2F392B3695C72FB8 -:107C3000D0E0C054DE4D0A2F10E000541F4DB88133 -:107C4000E8019881B92B022F10E000541D4DE80186 -:107C50009881CB2FC92BD0E0C058DF4DB881B32B12 -:107C6000342F3071952F917E9327382F30729327C0 -:107C70003A2F34799327372F33779327322F3A735C -:107C80009327392F32959327392F36953695932799 -:107C9000392F36959327382F9695379547955795D1 -:107CA00080818B27819330CEA093DD2C7093DE2CC6 -:107CB0002093DF2C5093E02C4093E12C3093E22C66 -:107CC000DF91CF911F910F910895CF92DF92EF92A4 -:107CD000FF921F93CF93DF931091DD2CD091DE2C78 -:107CE000C091DF2C7091E02C4091E12C2091E22C8E -:107CF000E42FF0E0E054FE4DA72FB0E0A054BF4DBC -:107D0000E0813C91E32BA22FB0E0A054BD4D3C910B -:107D1000E32BF0E0E056FF4D3081DC0180E0615064 -:107D200008F405C2582F369557959D2F9071812FD5 -:107D3000817E89279C2F90728927972F9479892794 -:107D4000942F93778927322F3A738327982F929510 -:107D50008927982F969596958927982F9695892704 -:107D60009C2F86959795D79517955695342F3071FA -:107D7000872F817E8327322F30728327312F3479EA -:107D800083273D2F33778327392F3A738327382F63 -:107D900032958327382F369536958327382F369599 -:107DA00083278695279547957795CD2ED12CF6017B -:107DB000E054FE4D6F01E12EF12CF701E054FF4D30 -:107DC0007F01F6013081F7018081832BE92EF12CB0 -:107DD000F701E054FD4D3081E82FE32BF0E0E0584F -:107DE000FF4D8081582B56953D2F3071812F817E1C -:107DF0008327392F30728327372F34798327342F05 -:107E000033778327322F3A738327382F329583278E -:107E1000382F369536958327382F369583278695C4 -:107E20009795D7951795C42ED12CF601E054FE4DA9 -:107E30006F01E72EF12CF701E054FF4D7F01F601B1 -:107E40003081F7018081832BE22EF12CF701E05481 -:107E5000FD4D3081E82FE32BF0E0E058FF4DC0816D -:107E60005C2B5695342F3071872F817E8327322FDC -:107E700030728327312F347983273D2F337783273F -:107E8000392F3A738327382F32958327382F369529 -:107E900036958327382F36958327869527954795DE -:107EA0007795CD2ED12CF601E054FE4D6F01E12ED9 -:107EB000F12CF701E054FF4D7F01F6013081F7010D -:107EC0008081832BE92EF12CF701E054FD4D3081A8 -:107ED000E82FE32BF0E0E058FF4DC081C52BC6959D -:107EE0003D2F3071812F817E8327392F3072832778 -:107EF000372F34798327342F33778327322F3A7300 -:107F00008327382F32958327382F36953695832748 -:107F1000382F3695832786959795D7951795C42E34 -:107F2000D12CF601E054FE4D6F01E72EF12CF70144 -:107F3000E054FF4D7F01F6013081F7018081382B3D -:107F4000E22EF12CF701E054FD4D8081E32FE82B68 -:107F5000F0E0E058FF4D8081C82BC695342F30717A -:107F6000872F817E8327322F30728327312F3479F8 -:107F700083273D2F33778327392F3A738327382F71 -:107F800032958327382F369536958327382F3695A7 -:107F90008327542F8695279557957795CD2ED12CED -:107FA000F601E054FE4D6F01E12EF12CF701E05493 -:107FB000FF4D7F01F6013081F7018081832BE92E8F -:107FC000F12CF701E054FD4D3081E82FE32BF0E078 -:107FD000E058FF4D80818C2B482F46953D2F307106 -:107FE000812F817E3827892F80723827872F8479C7 -:107FF0003827852F83773827822F8A733827832F56 -:1080000082953827832F869586953827832F8695E6 -:108010003827C92F3695C795D7951795E52FF0E0E6 -:10802000E054FE4D872F90E080549F4D3081FC013D -:108030008081382B822F90E080549D4DFC019081EF -:10804000E32FE92BF0E0E058FF4D9081842F892B3E -:10805000382F3695ED2FF0E0CF0180549E4D6C0106 -:10806000E12FF0E0CF0180549F4DF6014081FC01EB -:108070009081492BEC2EF12CC70180549D4DFC01C1 -:108080009081E42FE92BF0E0E058FF4D9081832FA1 -:10809000892B352F3071972F917E3927922F90722F -:1080A0003927912F947939279D2F937739274C2F92 -:1080B0004A733427932F92953927932F9695969547 -:1080C0003927932F96953927452F3695279547952C -:1080D0007795C42ED12CF601E054FE4D6F01E72EAA -:1080E000F12CF701E054FF4D7F01F6013081F701DB -:1080F0009081392BE22EF12CF701E054FD4D908157 -:10810000E32FE92BF0E0E056FF4D30819C91E92F01 -:10811000F0E0EC59FB4FE4917D01F0E8EF0EF11C2B -:108120005E2F5327F701508398279D93F8CD109326 -:10813000DD2CD093DE2CC093DF2C7093E02C409389 -:10814000E12C2093E22CDF91CF911F91FF90EF90D3 -:10815000DF90CF9008950F931F93FC01862F90819D -:108160002181428150E060E070E0BA015527442748 -:10817000522B492B9381792B8B0122273327803275 -:1081800008F471C0D80123E0B695A7952A95E1F7C8 -:108190000A271B2798013695279536952795BBE02A -:1081A0007695679557954795BA95D1F70227132786 -:1081B00020E030E095E1000F111F221F331F9A9538 -:1081C000D1F7402B512B622B732B8B0122273327A6 -:1081D000D80133E0B695A7953A95E1F70A271B2712 -:1081E00098013695279536952795BBE07695679546 -:1081F00057954795BA95D1F70227132720E030E02D -:1082000095E1000F111F221F331F9A95D1F7402BC4 -:10821000512B622B732B8B0122273327D80133E09C -:10822000B695A7953A95E1F70A271B279801369549 -:10823000279536952795BAE0769567955795479592 -:10824000BA95D1F70227132720E030E096E1000F1E -:10825000111F221F331F9A95D1F7402B512B622BF0 -:10826000732B805289CF40835183028373831F9184 -:108270000F910895AF92BF92CF92DF92EF92FF924B -:108280000F931F93CF93DF936730710509F451C0AB -:108290009B0127703327232B09F04EC0EB016C01A3 -:1082A0005B0183E0B694A7948A95E1F77B0196E0A1 -:1082B000F694E7949A95E1F7EA0CFB1CEC0CFD1C94 -:1082C0008501015011090C0D1D1DA701401B510B0B -:1082D00060E070E0C80101960E9455530C151D0521 -:1082E00020F1D801EC91F0E0EC59FB4F449197015B -:1082F000D7010A171B0768F48C91982F990FF90181 -:1083000082919F01881F8827881F892B8C93119742 -:10831000F0CF11968C9111978E7FE42FE170E82BAE -:108320001196EC9301501109D9CFC5018C0F9D1FF7 -:1083300004C087E090E001C0CB01DF91CF911F9195 -:108340000F91FF90EF90DF90CF90BF90AF90089586 -:10835000EF92FF920F931F93CF93DF93EC01CB012A -:1083600067307105D1F169E070E00E948552DE014D -:1083700020E030E088E090E02617370739F1F90176 -:1083800043E0F695E7954A95E1F7E20FF31FEC0F0E -:10839000FD1F408150E0890107701127002E02C0A7 -:1083A000559547950A94E2F74C930115110551F044 -:1083B000E1817C01E01AF10A01C0EE0FEA94EAF7CC -:1083C0004E2B4C932F5F3F4F1196D6CFC90123E020 -:1083D000880F991F2A95E1F702C087E090E0DF91AE -:1083E000CF911F910F91FF90EF900895CF93DF935E -:1083F000FC016115710511F18081869580839B01D7 -:10840000295F3F4F83E0369527958A95E1F7DF0195 -:1084100041E050E04217530770F4C1919081D0E8D9 -:108420009D9FC00111248C2B8D9380818695808324 -:108430004F5F5F4FEFCFCB01019702C080E090E02C -:10844000DF91CF910895EF92FF920F931F93CF93F7 -:10845000DF93EC01CB016730710509F442C069E09C -:1084600070E00E94855220E030E088E090E026171E -:108470003707B9F1D90143E0B695A7954A95E1F7D9 -:10848000A20FB31FA90147705527AC0FBD1FEC9178 -:10849000F0E0042E02C0F595E7950A94E2F7411545 -:1084A000510559F011960C9111977C01E41AF50AC7 -:1084B00001C0000FEA94EAF7E02BF0E0EC59FB4F23 -:1084C000E4911196AC91B0E08D0102C0159507952D -:1084D0004A95E2F7A8014E2740FD05C02F5F3F4FA8 -:1084E000C6CF81E001C080E0DF91CF911F910F9155 -:1084F000FF90EF9008951092432D08951092432D10 -:108500001092E32C1092442D0895F8DF0E948429E4 -:108510001092432D089508950895DC0123E633E673 -:108520006150E8F04D91942F922780E1989FA0012F -:1085300011244927E42FF0E042954F70232F332771 -:10854000C9018427AC013E2F22272427352743E089 -:10855000EE0FFF1F4A95E1F72E273F27E1CFC90114 -:1085600008958F929F92AF92BF92CF92DF92EF9237 -:10857000FF920F931F93CF93DF93CDB7DEB7C15414 -:10858000D240CDBFDEBF8C016B018091E32C8330E4 -:1085900009F440C138F4813069F0823009F4B5C083 -:1085A0000C94124B843009F4B3C2853009F4D8C45A -:1085B0000C94124BE090452EF090462EE114F104FD -:1085C000C1F0A701495F5F4F23E0569547952A9573 -:1085D000E1F765E47DE2C8010E943B536091452EBE -:1085E0007091462EC80146DE1092452E1092462EFE -:1085F000B5C46115710509F4AAC0C801F7DE5C01B4 -:10860000BC01C80120DFD82EB501C801A1DE5C0184 -:108610009C01295F3F4FA901440F551F93E05695D8 -:1086200047959A95E1F74A5F5F4F4138510538F019 -:1086300060EC73E2CE0101960E94675391C0A3E003 -:1086400036952795AA95E1F7A80160E870E0CE017C -:1086500001960E94BB0D8C01CF5FDD4FB882C150E7 -:10866000D240CE5FDD4FA882C250D24083E694E272 -:108670009F938F93B0E8AB2EB12CC501801B910B5B -:108680009F938F9381E090E08C0F9D1F800F911F2F -:108690009F938F930E946E53080F191FB501601BA3 -:1086A000710B22E030E0AE014F5F5D4F81E090E062 -:1086B0008C0F9D1F800F911F0E94BB0D800F911F7B -:1086C0000F900F900F900F900F900F90A501481BE7 -:1086D000590B21E030E02C0F3D1F280F391FD1101E -:1086E00003C08FEC93E202C08EED93E29F938F93D1 -:1086F0005F934F933F932F930E946E530F900F9071 -:108700000F900F900F900F902BC0E090452EF0909F -:10871000462EE114F104C1F0A701495F5F4FF3E079 -:1087200056954795FA95E1F765E47DE2C8010E9408 -:108730003B539091452E8091462E1092452E1092DB -:10874000462EE92EF82E70C76115710591F488E068 -:10875000E9E7F4E2DE01119601900D928A95E1F7C6 -:108760001092E32CBE016F5F7F4F85E60E947C2153 -:108770005BC79B01295F3F4F73E0369527957A953C -:10878000E1F7A80160E870E0CE0101960E94BB0D00 -:108790008C01CF5FDD4FD882C150D240CE5FDD4F1C -:1087A000C882C250D24083E694E29F938F93E0E860 -:1087B000CE2ED12CC601801B910B9F938F9381E00D -:1087C00090E08C0F9D1F800F911F9F938F930E94AD -:1087D0006E53800F911FB601681B790B22E030E0C9 -:1087E000AE014F5F5D4FA1E0B0E0AC0FBD1F8A0F3F -:1087F0009B1F0E94BB0D1092E32CBE016F5F7F4F49 -:1088000085E60E947C210F900F900F900F900F90A3 -:108810000F900AC78091442DB090432D882331F0EA -:10882000B1E0BB1508F455C11092442DE5E0EB15FD -:10883000B8F0F3E0BF1608F040C021E02B15C8F0F7 -:1088400081E090E0809320209093212082E5D80160 -:108850008C9382E08093432D67E0E62EF12C3BC1A0 -:1088600038E03B1508F0A8C08AE0B81609F4F5C056 -:1088700030C1B3E1CB16D10408F4B9C0B601C801C8 -:10888000B5DD7C01BC01C801DEDD882319F1B7012B -:10889000C8015EDDF801818190E0982F8827208152 -:1088A000822B8093352D9093362D83E9808380E24F -:1088B000818383E08093432DBCC0B601C80196DD5F -:1088C0007C01BC01C801BFDD882321F0F8E0EF1670 -:1088D000F10488F41092432DC701089667E070E018 -:1088E0000E948552462FE0915F2EF091602EB801D4 -:1088F00081EC1995B8C0B701C8012ADDD8012C91C7 -:1089000011968C911197822712969C911297892724 -:1089100013969C911397892714969C911497891309 -:1089200066C08B2D90E00397283881F49C01220FBC -:10893000331F820F931FFC01E85CF24D11962D91BD -:108940003D914C9120833183428312C0FC01EE0F94 -:10895000FF1F8E0F9F1F9C01285C324DF801808104 -:108960009181A281B381F90180839183A283B38332 -:1089700045E050E0B801C80102960E944453F3E07C -:10898000BF1629F024E0B21621F087E903C083E97D -:1089900001C085E9D8018C9380E711968C9367E03C -:1089A000C801BBDDF8018783908783E08B0D80933E -:1089B000432D68E470E089C0F9E0CF16D104B8F027 -:1089C000B601C80113DD7C01BC01C8013CDD811189 -:1089D00011C0C701089667E070E00E948552462FDB -:1089E000E0915F2EF091602EB80181EC1995109204 -:1089F000432D39C0B701C801ABDC63E0C8018DDD90 -:108A00007C01892BA1F7D8018C9182FF15C0B8E0B9 -:108A1000BB1691F0E6E0BE1611F087E901C085E9CA -:108A2000D8018C9380E211968C93BA94BA94B09248 -:108A3000432D60E170E049C081E08093442D8B2D8F -:108A400090E00697B82EBB0C8B0D8C5F8093422D67 -:108A5000F80180818093372D3EC0C114D10431F4D8 -:108A600081E08093432D0E947E2933C0B601C80166 -:108A7000BDDC7C01BC01C801E6DC81110FC0C7016F -:108A8000089667E070E00E948552462FE0915F2EC5 -:108A9000F091602EB80181EC199508C0B701C801AA -:108AA00057DC63E0C80139DD892BD1F282ECD801B3 -:108AB0008C9361E0C80131DDF80181839283B0922B -:108AC000432D1092442D68E170E0C801D3DB7C0196 -:108AD00002C0E12CF12C8091442D882309F4A4C517 -:108AE0002091422D30E048E35DE264E170E0CE0188 -:108AF00001960E94BB0DBE016F5F7F4F85E60E940D -:108B00007C211092442D1092E32C0E9413228AC5DE -:108B10008091442DB090432D882331F0F1E0FB1576 -:108B200008F451C11092442D25E02B15B8F033E024 -:108B3000B31608F043C081E08B15C8F081E090E0E7 -:108B4000809320209093212082E5F801808382E0A9 -:108B50008093432DE7E0EE2EF12C37C1A8E0AB1552 -:108B600008F0A4C0BAE0BB1609F4F1C02CC1F3E1CF -:108B7000CF16D10408F4B5C0B601C80137DC7C01BA -:108B8000BC01C80160DC882331F1B701C801E0DB1A -:108B9000D80111968C91119790E0982F88272C91ED -:108BA000822B8093352D9093362D83E98C9380E230 -:108BB00011968C9383E08093432DB5C0B601C80114 -:108BC00015DC7C01BC01C8013EDC882321F0B8E043 -:108BD000EB16F10488F41092432DC701089667E064 -:108BE00070E00E948552462FE0915F2EF091602E3A -:108BF000B80181EC1995B1C0B701C801A9DBF80132 -:108C0000208181818227928189279381892794817C -:108C1000891367C08B2D90E00397283889F49C0155 -:108C2000220F331F820F931FFC01E85CF24DD80125 -:108C300011962D913D914C9120833183428312C036 -:108C4000FC01EE0FFF1F8E0F9F1F9C01285C324D11 -:108C5000F80180819181A281B381F90180839183A0 -:108C6000A283B38345E050E0B801C80102960E9498 -:108C70004453F3E0BF1629F024E0B21621F087E94F -:108C800003C083E901C085E9D8018C9380E7119680 -:108C90008C9367E0C80141DCF8018783908783E00B -:108CA0008B0D8093432D68E470E089C0F9E0CF1606 -:108CB000D104B8F0B601C80199DB7C01BC01C80140 -:108CC000C2DB811111C0C701089667E070E00E9405 -:108CD0008552462FE0915F2EF091602EB80181EC15 -:108CE00019951092432D39C0B701C80131DB63E0FB -:108CF000C80113DC7C01892BA1F7D8018C9182FF7C -:108D000015C0B8E0BB1691F0E6E0BE1611F087E999 -:108D100001C085E9D8018C9380E211968C93BA94B6 -:108D2000BA94B092432D60E170E049C081E0809335 -:108D3000442D8B2D90E00697B82EBB0C8B0D8C5FCD -:108D40008093422DF80180818093372D3EC0C1145D -:108D5000D10431F481E08093432D0E947E2933C0F9 -:108D6000B601C80143DB7C01BC01C8016CDB811189 -:108D70000FC0C701089667E070E00E948552462F39 -:108D8000E0915F2EF091602EB80181EC199508C03A -:108D9000B701C801DDDA63E0C801BFDB892BD1F27E -:108DA00082ECD8018C9361E0C801B7DBF8018183C4 -:108DB0009283B092432D1092442D68E170E0C80177 -:108DC00059DA7C0102C0E12CF12C8091442D8823DA -:108DD00009F42AC4F090242DFF20A9F1B601C8019E -:108DE00005DB5C01009729F41092242D1092442D8C -:108DF00042C0823A910540F0BC01C80124DB91E0F9 -:108E00008927C82ED12C03C0CC24C394D12CB50102 -:108E1000C8019EDACD2829F462E1C8017EDB892BE6 -:108E200029F0ACEFAF0DA093242D2AC024E0F29ED0 -:108E3000D0011124AC52B34D80E1F80101900D92A4 -:108E40008A95E1F71DC042E050E06BE371E1CE018D -:108E500001960E940D53EEE3F1E1E4912091352D4E -:108E60003091362D89819A812817390721F4809114 -:108E7000372D8E1729F01092432D0E947E29D2C3E0 -:108E80002091242D203109F04DC01092442D1092D4 -:108E9000242D1092E32C20E130E044EE5CE267E800 -:108EA00070E0CE0101960E94BB0D63E674E2CE0134 -:108EB00081960E94675320E130E044EF5CE265E672 -:108EC00070E0CE0183960E94BB0D63E674E2CE0192 -:108ED0008D5B9F4F0E94675320E130E044E05DE2EC -:108EE00063E470E0CE018B5B9F4F0E94BB0D63E695 -:108EF00074E2CE018B599F4F0E94675320E130E00E -:108F000044E15DE261E270E0CE0189599F4F0E9429 -:108F1000BB0D0E941322BE016F5F7F4F85E60E944A -:108F20007C2180C380E3D8018C9311962C9362E05E -:108F3000C801CF5BDD4F2883C154D240EEDAF8017F -:108F400082839383CF5BDD4F2881C154D2402C5F55 -:108F50002093242D60E270E0C8018CD97C0164C3A9 -:108F60008091442DB090432D882331F0F1E0FB1522 -:108F700008F451C11092442D25E02B15B8F033E0D0 -:108F8000B31608F043C081E08B15C8F081E090E093 -:108F9000809320209093212082E5F801808382E055 -:108FA0008093432D37E0E32EF12C37C1A8E0AB15B9 -:108FB00008F0A4C0BAE0BB1609F4F1C02CC1F3E17B -:108FC000CF16D10408F4B5C0B601C8010FDA7C0190 -:108FD000BC01C80138DA882331F1B701C801B8D91A -:108FE000D80111968C91119790E0982F88272C9199 -:108FF000822B8093352D9093362D83E98C9380E2DC -:1090000011968C9383E08093432DB5C0B601C801BF -:10901000EDD97C01BC01C80116DA882321F0B8E043 -:10902000EB16F10488F41092432DC701089667E00F -:1090300070E00E948552462FE0915F2EF091602EE5 -:10904000B80181EC1995B1C0B701C80181D9F80107 -:109050002081818182279281892793818927948128 -:10906000891367C08B2D90E00397283889F49C0101 -:10907000220F331F820F931FFC01E85CF24DD801D1 -:1090800011962D913D914C9120833183428312C0E2 -:10909000FC01EE0FFF1F8E0F9F1F9C01285C324DBD -:1090A000F80180819181A281B381F901808391834C -:1090B000A283B38345E050E0B801C80102960E9444 -:1090C0004453F3E0BF1629F024E0B21621F087E9FB -:1090D00003C083E901C085E9D8018C9380E711962C -:1090E0008C9367E0C80119DAF8018783908783E0E1 -:1090F0008B0D8093432D68E470E089C0F9E0CF16B2 -:10910000D104B8F0B601C80171D97C01BC01C80115 -:109110009AD9811111C0C701089667E070E00E94DA -:109120008552462FE0915F2EF091602EB80181ECC0 -:1091300019951092432D39C0B701C80109D963E0D0 -:10914000C801EBD97C01892BA1F7D8018C9182FF52 -:1091500015C0B8E0BB1691F0E6E0BE1611F087E945 -:1091600001C085E9D8018C9380E211968C93BA9462 -:10917000BA94B092432D60E170E049C081E08093E1 -:10918000442D8B2D90E00697B82EBB0C8B0D8C5F79 -:109190008093422DF80180818093372D3EC0C11409 -:1091A000D10431F481E08093432D0E947E2933C0A5 -:1091B000B601C8011BD97C01BC01C80144D9811189 -:1091C0000FC0C701089667E070E00E948552462FE5 -:1091D000E0915F2EF091602EB80181EC199508C0E6 -:1091E000B701C801B5D863E0C80197D9892BD1F27E -:1091F00082ECD8018C9361E0C8018FD9F80181839A -:109200009283B092432D1092442D68E170E0C80122 -:1092100031D87C0102C0E12CF12C8091442D8823AF -:1092200009F402C28091432D9AEF980F933008F011 -:109230004EC0D801FC90F5FAFF24F0F81092252DCD -:10924000E6E0AE2EE0E1BE2EE12C47E650E0B501AF -:10925000CE0101960E940D538B81882349F029810C -:109260003A818091352D9091362D28173907B9F420 -:109270008D81882329F09C818091372D98130FC010 -:109280008F89882311F0FF2051F0E091252D81E096 -:109290008E0F8093252DF0E0EA5DF24DE082E3949D -:1092A000B7E6AB0EB11CEFE0EE12CFCFFF2009F412 -:1092B00093C080EED8018C9380E811968C9362E085 -:1092C000C8012BD9F8018283938389E0A6C0893035 -:1092D00009F082C0B601C80189D87C01BC01C8016F -:1092E000B2D881110FC0C701089667E070E00E94F4 -:1092F0008552462FE0915F2EF091602EB80181ECEF -:109300001995BEC0B701C80123D86C01D8016C9172 -:10931000262F30E073E0969587957A95E1F70297CE -:109320002817390729F46E5FC801F7D8892B69F02F -:1093300082ECF801808361E0C801EFD8D801119672 -:109340008C93119712969C93A4C0F12C67E6E62E9D -:109350005801FFEFAF1ABF0A8091252DF816E0F5EE -:10936000EF2DF0E0EA5DF24D6081E69EB001112440 -:109370006A5F7F4E47E650E0CE0101960E940D5392 -:109380008F89882339F14E8950E0F801808190E07F -:1093900001974817590739F4B501CE0106960E9486 -:1093A0002E53892BB9F02091252D422F50E04150AA -:1093B00051093F2D832F90E0841795073CF4FC0161 -:1093C000EA5DF24D818180833F5FF4CF215020938D -:1093D000252DFA94F394C0CF8091432D9AEF980FE6 -:1093E0009430F0F49091252D26E23DE2F9018E2F84 -:1093F000821B891708F069C0819184508230B8F7C8 -:1094000082E0D8018C9380E611968C9362E0C801CB -:1094100084D8F801828393838BE08093432D9ACD87 -:109420008B3009F052C0C114D10409F44CC0B6010C -:10943000C8010E94F6417C01BC01C80104D8811119 -:109440000FC0C701089667E070E00E948552462F62 -:10945000E0915F2EF091602EB80181EC19950EC05D -:10946000B701C8010E94A84153E0969587955A9587 -:10947000E1F7682FC80151D8892B99F01092252D5A -:1094800082ECD8018C9361E0C80147D8F801818350 -:1094900092838AE08093432D1092442D68E170E01E -:1094A0005BCDD80115968C91882331F0813059F429 -:1094B0008093252D85E004C081E08093252D84E0F4 -:1094C0008093262D02C01092252D8091252D81118B -:1094D00003C06AEE73E213C08130A9F46091262DB7 -:1094E000B7E66B9FB0011124635D7F4E40E450E00E -:1094F000CE0101960E940D53BE016F5F7F4F85E63E -:109500000E947C2168C0912C80E090E000E010E097 -:1095100027E6822E7E013FEFE31A3DEFF30A3DEF8F -:10952000C32E33E2D32EA12C42E0B42E2091252D60 -:10953000921680F50130E2E01E0720F0081B190B9F -:10954000F12C2EC0E92DF0E0EA5DF24D6081869E9F -:10955000B0011124635D7F4E40E450E0C7010E94DA -:109560000D53FF92EF92DF92CF92C501801B910BBA -:109570009F938F9381E090E08C0F9D1F800F911F30 -:109580009F938F930E946E53080F191F9394CDBF22 -:10959000DEBFCCCF0130A2E01A0780F6FF24F3949F -:1095A000EDEFFFEFEC0FFD1FE00FF11F8EE2808368 -:1095B000EEEFFFEFEC0FFD1FE00FF11F1082BE0179 -:1095C0006F5F7F4F85E60E947C21F11004C084E02C -:1095D00094E20E941B1886E694E20E941B1862E047 -:1095E00070E085E39DE20E949A218DE694E20E945C -:1095F0001B186091422D70E088E39DE20E949A2141 -:1096000083E794E20E941B1861E070E087E39DE22B -:109610000E949A211092E32C1092252D0E94132271 -:109620001092442DE12CF12CC701CF5BDD4FCDBF53 -:10963000DEBFDF91CF911F910F91FF90EF90DF90F0 -:10964000CF90BF90AF909F908F900895FF920F930F -:109650001F93CF93DF93CDB7DEB7EA97CDBFDEBFC1 -:1096600009EB11E388E0F82EF00E91D2F801819316 -:109670008F01FE12FACF0E94CF1804D3882309F479 -:10968000F7C08091B9319091BA31953009F46FC02B -:1096900030F4913069F168F0933051F1E9C09830BD -:1096A00009F4C2C0993009F4C8C0963009F0E0C08E -:1096B00072C0803891F0823809F0DAC08091BD31F3 -:1096C0008F7085D2E091C331F091C431118112FBCA -:1096D000112710F980E07BD206C01091B53180913E -:1096E000B63181111260E8D2812F61D280E0A1C031 -:1096F000282F2D7F09F0BCC0882319F0823061F03B -:10970000B7C08091BB31813009F0B2C0933009F00D -:1097100080E08093B63127C08091BB31811123C096 -:10972000E091BD311E2F1F7009F4A2C0812F4FD2CE -:109730008091BA31833011F4EBD215C0E091C3317E -:10974000F091C43181818B7F818324E8129FF001E5 -:109750001124E95FFD4C1082E091C331F091C431D6 -:1097600080818E7F808380E032D2A6D264C0811156 -:109770007FC01091BB311F779FD2A1D35DD28823C8 -:10978000E9F31093C304111102C082E001C083E029 -:109790008093B8316DC08058823008F069C08091E4 -:1097A000BB319091BC318C3DE3E09E0761F583E0D5 -:1097B0008A838AE389834FB7F894DE01139620E009 -:1097C00038E052E05093CA01E32FF0E0E4911092A8 -:1097D000CA0120FF03C0E295EF703F5FEF708E2F4C -:1097E00090E0EA3010F0C79601C0C0968D939D932B -:1097F0002F5F2C3139F74FBF5FD26AE370E0CE01A3 -:109800000196A3D00FC0AE014F5F5F4F6091BD3195 -:109810000E94270C8C01892B59F14ED2B801898105 -:109820009A810FD1A5D124C0803811F545D28091FD -:10983000B431BDD184D143D31BC0811119C08091F3 -:10984000BB318230A8F438D28091BB318093B431DF -:1098500036D38091B431811106C08091C304811147 -:1098600002C081E001C084E08093B8310E94CB182F -:1098700009D2882311F020D24BD2EA96CDBFDEBFA9 -:10988000DF91CF911F910F91FF9008950895CF938D -:109890008091B831882351F0C091C53180E097D1D3 -:1098A000F1D18111D3DE8C2FCF9191C1CF91089549 -:1098B000CF92DF92EF92FF920F931F93CF93DF939C -:1098C000EC018B017A0111D3811136C0E114F1044E -:1098D00039F0F70180819181081B190BC80FD91F3E -:1098E000C12CD12C0115110531F18091C13190911C -:1098F000C231FC01EF5BFF4F208131978081281737 -:1099000090F01DD1C4DFE114F10449F0F70180812A -:109910009181C80ED91EC082D18285E00DC0E5D2EA -:10992000882301F309C0899142D101501109FFEF49 -:10993000CF1ADF0AD7CF80E0DF91CF911F910F912F -:10994000FF90EF90DF90CF900895DF92EF92FF921B -:109950000F931F93CF93DF93D82FC92F8B01809143 -:10996000C531806834D12091BF313091C03120178A -:10997000310728F00115110519F4E1D001C0890162 -:10998000ED2EFC2ED12C0115110509F440C080915B -:10999000B831811102C082E04CC0853011F483E0FF -:1099A00048C070D1882311F081E043C051D18111AA -:1099B0003CC042D1882339F32091C5318091C13117 -:1099C0009091C231FC0127FF05C0EF5BFF4FC081C2 -:1099D000D0E013C0E05CFF4FC08131968081D0E0C1 -:1099E000C81BD1090AC0C830D10550F4F7018191D4 -:1099F0007F01DDD00150110921960115110599F75C -:109A0000DD24D394289709F0D12C99D0BCCFD11064 -:109A1000BECF0BC08091B831882309F4BCCF85300C -:109A200009F4BDCF2FD18111BFCF12D1882391F37B -:109A300080E0DF91CF911F910F91FF90EF90DF9029 -:109A40000895DF92EF92FF920F931F93CF93DF93CE -:109A5000D82FC92F8B018091C5318068B8D0209153 -:109A6000BF313091C0312017310728F001151105A1 -:109A700019F465D001C08901ED2EFC2ED12C011501 -:109A8000110509F442C08091B831811102C082E011 -:109A90004EC0853011F483E04AC0F4D0882311F021 -:109AA00081E045C0D5D081113EC0C6D0882339F3AE -:109AB0002091C5318091C1319091C231FC0127FFC5 -:109AC00005C0EF5BFF4FC081D0E015C0E05CFF4FE9 -:109AD000C08131968081D0E0C81BD1090CC0C8304C -:109AE000D10560F4F701849162D0FFEFEF1AFF0A0D -:109AF0000150110921960115110589F7DD24D39430 -:109B0000289709F0D12C1BD0BACFD110BCCF0BC0F5 -:109B10008091B831882309F4BACF853009F4BBCFDE -:109B2000B1D08111BDCF94D0882391F380E0DF9133 -:109B3000CF911F910F91FF90EF90DF900895E091EA -:109B4000C331F091C431A091C131B091C231AF5B4A -:109B5000BF4F8C9190E08283938380818D79808345 -:109B6000E091C131F091C231EF5BFF4F1082089557 -:109B7000E091C331F091C43180818D798083E0918F -:109B8000C131F091C231EF5BFF4F10820895809197 -:109B9000C1319091C231FC01EF5BFF4F208131E078 -:109BA000320F3083FC01E20FF11D80810895209176 -:109BB000C1313091C231F901EF5BFF4F908141E03B -:109BC000490F4083F901E90FF11D808308958093C7 -:109BD000C531482F4F7050E06091C6047091C704A2 -:109BE0009A0194E0220F331F9A95E1F7E4E887FF8A -:109BF00011C0E49FC001E59F900D1124885F9D4C2A -:109C00008093C1319093C231C90108969B01280FFE -:109C1000391F0DC0E49FC001E59F900D11248A53A8 -:109C20009E4C8093C1319093C231260F371F2093F1 -:109C3000C3313093C43108958091C5318068C7DF46 -:109C4000E091C331F091C43180818695817008958F -:109C50008091C5318F77BBDFA091C331B091C43102 -:109C60008C9185FF0DC0E091C131F091C231129607 -:109C70008D919C911397E05CFF4F808381E0089564 -:109C800080E008958091C5318F77A1DFA091C33125 -:109C9000B091C4318C9184FF0DC0E091C131F0913D -:109CA000C23112968D919C911397E05CFF4F808397 -:109CB00081E0089580E008958091C5318F7787DF36 -:109CC000E091C331F091C43180818D788083E0913F -:109CD000C331F091C431808181608083E091C131D2 -:109CE000F091C231EF5BFF4F10828091C5318068E7 -:109CF0006EDFE091C331F091C43180818160808357 -:109D0000E091C131F091C231EF5BFF4F10820895B5 -:109D1000E091C331F091C431818184608183E0910D -:109D2000C331F091C4318181807C803459F48091B9 -:109D3000C53180584CDFE091C331F091C43181814D -:109D40008460818308951F93CF93DF931F921F92A6 -:109D5000CDB7DEB7182F4A83698339DFE091C3316D -:109D6000F091C4311182E091C331F091C431812F5F -:109D7000881F8827881F880F8083E091C331F09166 -:109D8000C43169816183E091C331F091C4311282A1 -:109D900013822091C1313091C23124833583110F58 -:109DA000110B4A814123F901E05CFF4F408331965A -:109DB000108281E00F900F90DF91CF911F91089555 -:109DC000AF92BF92CF92DF92EF92FF920F931F93C9 -:109DD000CF93DF93A62E8C017C0184E0E80EF11C6A -:109DE000B12CBA1409F443C0F801D081DD23C1F1CC -:109DF000C180D280F70131978081F7019081923044 -:109E000010F498E001C098E128E030E0C0E02C15A3 -:109E10003D0520F4CF5F220F331FF9CFC92B9D2FB3 -:109E20009F70963010F080E023C0CF7EF1E4CF1613 -:109E3000D104C8F7882321F0813021F4C06C0AC016 -:109E4000C06403C0C068811105C04C2D6C2F80E830 -:109E50008D0F79DF4C2D6C2F8D2F75DF882319F333 -:109E6000B3940B5F1F4F85E0E80EF11CBACF81E081 -:109E7000DF91CF911F910F91FF90EF90DF90CF90E6 -:109E8000BF90AF90089580E090E0E091C604F0911B -:109E9000C7049C0144E0220F331F4A95E1F7E20F0B -:109EA000F31F11864091C6045091C704FA01E20FD6 -:109EB000F31F118201968630910539F7089580913C -:109EC000B93187FF0DC0C4DE811105C08091B83162 -:109ED0008111F9CF09C04CCE8091B831882321F08F -:109EE000ABDE8823C9F32BCE08950F931F93CF9336 -:109EF000E091C604F091C704E05AFF4F0081118140 -:109F0000C4E68091C53187FF0AC096DE811105C085 -:109F10008091B831811105C021C080E024C098DE55 -:109F2000F5CF8530E9F0E091C331F091C431818102 -:109F300082FD18C0E091C604F091C704E05AFF4FBB -:109F40008081918180179107E1F22FEF2C0FCC23B4 -:109F500019F08C01C22FD5CF84E005C082E003C088 -:109F600083E001C081E0CF911F910F91089563D0EC -:109F700069D0E0ECF4E081818E7F818380818F77EE -:109F800080831092B7310895CF93DF93E0E4F0E03F -:109F900014828481836084834ED054D0C0ECD4E09A -:109FA00088818F7788838881806888831092B83110 -:109FB0001092B4311092B6311092B531888180641C -:109FC000888348E068E480E8BEDE48E068E480E03A -:109FD000BADE888580648887898181608983DF9182 -:109FE000CF910895CF93DF933FB7F894C0ECD1E0C1 -:109FF00022E02A87EAE1F0E0E491A0ECB4E0DA960E -:10A00000EC93DA97EBE1F0E0E491DB96EC93DB97ED -:10A010001A868FED94E38E7F16968D939C931797F7 -:10A0200085E18C9318962C933FBF81E08093B731E4 -:10A03000DF91CF91A9CFE0ECF4E080858370808739 -:10A0400011860895E0ECF4E08FEF8287848708950D -:10A050001F920F920FB60F92112408B60F9218BEDE -:10A0600009B60F9219BE0BB60F921BBE2F933F93EA -:10A070004F935F936F937F938F939F93AF93BF9310 -:10A08000EF93FF938091CA0487FF08C08091C804B2 -:10A0900087FF04C080E88093CA04F8DB8091CA047B -:10A0A00086FF07C080E48093CA041092B8310E94F2 -:10A0B000BA188091CA0485FF14C080E28093CA0454 -:10A0C0008091B431882311F084E007C08091C304EB -:10A0D000811102C081E001C083E08093B8310E9409 -:10A0E000A9188091CA0484FF14C080E18093CA0437 -:10A0F00082E08093B8311092B4311092C304C3DE71 -:10A1000048E068E480E81FDE48E068E480E01BDEA9 -:10A11000BDDBFF91EF91BF91AF919F918F917F91A7 -:10A120006F915F914F913F912F910F900BBE0F90C8 -:10A1300009BE0F9008BE0F900FBE0F901F9018958C -:10A14000CF93DF93EC01FC0170968BE0DF011D9251 -:10A150008A95E9F782E08C83898783E08E8761E0C6 -:10A16000CE0101962DDE882361F061E0CE010696D6 -:10A1700027DE882331F061E0CE010B96DF91CF918D -:10A180001FCE80E0DF91CF9108950F931F93CF935F -:10A19000DF932091B8312430E1F4FC010489158962 -:10A1A00026893789012B022B032B99F0EB01818142 -:10A1B0000EDDFE0101900020E9F73197BF016C1B15 -:10A1C0007D0B40E050E0CE01DF91CF911F910F91C8 -:10A1D0006FCB82E0DF91CF911F910F9108950F9384 -:10A1E0001F93CF93DF93FC018091B8318430A9F4A1 -:10A1F00084899589A689B789892B8A2B8B2B69F04D -:10A200008A01EB018181E3DC40E050E0B801CE013E -:10A21000DF91CF911F910F914BCB82E0DF91CF91D6 -:10A220001F910F910895CF93FC018091B831843034 -:10A2300001F584899589A689B789892B8A2B8B2B6F -:10A24000C1F0C62F8181C3DC2091C1313091C23170 -:10A25000F901EF5BFF4F908131978081981720F4CF -:10A260008C2FA5DC80E006C06ADC3FDE8823C1F3CA -:10A2700001C082E0CF910895CF93DF932091B83150 -:10A28000243091F5FC014489558966897789452BED -:10A29000462B472B49F181819ADC8091C531209171 -:10A2A000C1313091C231F90187FF05C0EF5BFF4F2B -:10A2B000808190E008C0E05CFF4F80813196408152 -:10A2C00090E0841B9109892B69F0F901EF5BFF4F46 -:10A2D000D0813197C08133DCDC1720F006DE81119C -:10A2E00004C02DDC80E001C082E0DF91CF910895B1 -:10A2F000CF93DF932091B831243099F4FC01448945 -:10A30000558966897789452B462B472B51F0EC01FF -:10A3100081815DDC91DC882321F0CE01DF91CF913A -:10A32000ABCFDF91CF910895CF93DF932091B831D8 -:10A33000243019F08FEF9FEF46C0FC014489558906 -:10A3400066897789452B462B472BA1F386813FDC15 -:10A350007FDC882379F38091C5312091C131309120 -:10A36000C231F90187FF05C0EF5BFF4F808190E0AC -:10A3700008C0E05CFF4F80813196208190E0821B15 -:10A380009109892B21F003DCC82FD0E002C0CFEF68 -:10A39000DFEF2091C5318091C1319091C231FC0134 -:10A3A00027FF05C0EF5BFF4F208130E008C0E05C75 -:10A3B000FF4F20813196808130E0281B3109232B0B -:10A3C00009F4D6DBCE01DF91CF9108950895FF9275 -:10A3D0000F931F93CF93DF93EC0154DC882309F490 -:10A3E0008EC0888190E02091BD313091BE31281718 -:10A3F000390709F084C08091BA31813259F018F4DC -:10A40000803249F17CC0823209F457C0833209F4AA -:10A4100067C075C08091B931813A09F070C04CDCD9 -:10A420000BDC8823E9F38C89FD880E891F89BFDB4B -:10A430008F2DBDDB802FBBDB812FB9DB888DB7DB98 -:10A44000898DB5DB8A8DB3DB7ADBDF91CF911F91EC -:10A450000F91FF9034CD8091B931813209F04FC016 -:10A460002BDCF6DB811105C08091B8318111F9CF69 -:10A4700046C08DDB082F8BDB182F89DBF82E87DB9E -:10A480004F2D50E060E070E0BA0155274427782B4B -:10A49000402B512B4C8B5D8B6E8B7F8B78DB888FA9 -:10A4A00076DB898F74DB8A8F63DB09DDCE01DF9178 -:10A4B000CF911F910F91FF9089CF8091B931813257 -:10A4C000F1F4FADBFCDC8091BB319091BC31888BDC -:10A4D000998BCE01DF91CF911F910F91FF9076CF95 -:10A4E0008091B931813259F4E7DBE9DC6091BB310D -:10A4F000CE01DF91CF911F910F91FF9067CFDF9138 -:10A50000CF911F910F91FF900895AA1BBB1B51E1A2 -:10A5100007C0AA1FBB1FA617B70710F0A61BB70BD3 -:10A52000881F991F5A95A9F780959095BC01CD0178 -:10A530000895B7FF04C003D0821B930B089509D080 -:10A54000A59F900DB49F900DA49F800D911D112487 -:10A550000895A29FB001B39FC001A39F700D811DFC -:10A560001124911DB29F700D811D1124911D08951C -:10A570008F929F92AF92BF92CF92DF92EF92FF9213 -:10A58000CF93DF93EC01688179818A819B8161158A -:10A5900071058105910521F464E279ED8BE597E081 -:10A5A0002DE133EF41E050E0E2D649015A019B0131 -:10A5B000AC01A7EAB1E4C3DF6B017C01ACEEB4EF00 -:10A5C000A5019401B8DFDC01CB018C0D9D1DAE1DF2 -:10A5D000BF1DB7FF03C00197A109B04888839983C5 -:10A5E000AA83BB839F77DF91CF91FF90EF90DF909D -:10A5F000CF90BF90AF909F908F900895B9CF82E297 -:10A6000090E2B6CFA0E0B0E0809322209093232088 -:10A61000A0932420B09325200895FB01DC0102C003 -:10A6200005900D9241505040D8F70895FB01DC0190 -:10A630008D91059080190110D9F3990B0895FB01B4 -:10A64000DC014150504048F005900D920020C9F7C0 -:10A6500001C01D9241505040E0F70895FB01DC011C -:10A6600004C08D910190801921F441505040C8F7E9 -:10A67000881B990B0895FB01DC0102C001900D922B -:10A6800041505040D8F708956817790768F4FB01E6 -:10A69000DC01E40FF51FA40FB51F02C002900E925B -:10A6A00041505040D8F70895E6CFDC0101C06D93CA -:10A6B00041505040E0F70895FC018191861721F048 -:10A6C0008823D9F7992708953197CF010895FB0181 -:10A6D000DC0101900D920020E1F708950F931F9384 -:10A6E000CF93DF93CDB7DEB72E97CDBFDEBF0E89F8 -:10A6F0001F89888D998D26E02C8309831A8397FF03 -:10A7000002C080E090E801978D839E83AE01445E95 -:10A710005F4F6A8D7B8DCE01019667D04D815E8142 -:10A7200057FD0AC02F813885421753070CF49A0150 -:10A73000F801E20FF31F10822E96CDBFDEBFDF912E -:10A74000CF911F910F9108950F931F93CF93DF9394 -:10A75000CDB7DEB72E97CDBFDEBF0E891F89888D9E -:10A76000998D2EE02C8309831A8397FF02C080E025 -:10A7700090E801978D839E83AE01445E5F4F6A8DA2 -:10A780007B8DCE01019631D04D815E8157FD0AC08F -:10A790002F813885421753070CF49A01F801E20F14 -:10A7A000F31F10822E96CDBFDEBFDF91CF911F9198 -:10A7B0000F910895CF93DF93CDB7DEB72E97CDBF1E -:10A7C000DEBF8DE08C838C899D8989839A83AE015D -:10A7D000485E5F4F6E897F89CE0101968FD32E969A -:10A7E000CDBFDEBFDF91CF9108952F923F924F9260 -:10A7F0005F926F927F928F929F92AF92BF92CF9211 -:10A80000DF92EF92FF920F931F93CF93DF93CDB719 -:10A81000DEB72C97CDBFDEBF7C016B018A01FC0146 -:10A8200016821782838181FFB0C1CE0101964C014F -:10A83000F7019381F60193FD859193FF81916F015B -:10A84000882309F49EC1853239F493FD859193FFE5 -:10A8500081916F01853221F4B70190E0D6D4E8CF21 -:10A86000512C312C20E02032A0F48B3269F030F4EE -:10A87000803259F0833269F420612CC08D3239F076 -:10A88000803339F4216026C02260246023C0286010 -:10A8900021C027FD27C030ED380F3A3078F426FF6D -:10A8A00006C0FAE05F9E300D1124532E13C08AE0DB -:10A8B000389E300D1124332E20620CC08E3221F4CC -:10A8C00026FD5FC1206406C08C3611F4206802C0EA -:10A8D000883641F4F60193FD859193FF81916F01D4 -:10A8E0008111C1CF982F9F7D9554933028F40C5F30 -:10A8F0001F4FFFE3F9830DC0833631F0833771F0CA -:10A90000833509F057C021C0F801808189830E5F2B -:10A910001F4F44244394512C540114C03801F2E0D9 -:10A920006F0E711CF801A080B18026FF03C0652D59 -:10A9300070E002C06FEF7FEFC5012C871DD42C01A2 -:10A9400083012C852F77222E16C03801F2E06F0E7E -:10A95000711CF801A080B18026FF03C0652D70E056 -:10A9600002C06FEF7FEFC5012C87FBD32C012C8534 -:10A970002068222E830123FC19C0832D90E0481605 -:10A980005906A0F4B70180E290E03FD43A94F5CFA5 -:10A99000F50127FC859127FE81915F01B70190E0C9 -:10A9A00034D431103A94F1E04F1A51084114510453 -:10A9B00079F7DEC0843611F0893631F5F80127FFCA -:10A9C00007C060817181828193810C5F1F4F08C035 -:10A9D00060817181072E000C880B990B0E5F1F4F51 -:10A9E0002F76722E97FF09C090958095709561958E -:10A9F0007F4F8F4F9F4F2068722E2AE030E0A401D6 -:10AA000055D4A82EA81843C0853729F42F7EB22E1E -:10AA10002AE030E025C0F22FF97FBF2E8F36C1F03B -:10AA200018F4883579F0ADC0803719F0883721F0F7 -:10AA3000A8C02F2F2061B22EB4FE0DC08B2D8460D4 -:10AA4000B82E09C024FF0AC09F2F9660B92E06C0F9 -:10AA500028E030E005C020E130E002C020E132E033 -:10AA6000F801B7FE07C060817181828193810C5F1C -:10AA70001F4F06C06081718180E090E00E5F1F4F24 -:10AA8000A40114D4A82EA818FB2DFF777F2E76FEE4 -:10AA90000BC0372D3E7FA51450F474FE0AC072FC23 -:10AAA00008C0372D3E7E05C0BA2C372D03C0BA2C06 -:10AAB00001C0B52C34FF0DC0FE01EA0DF11D8081EF -:10AAC000803311F4397E09C032FF06C0B394B394C9 -:10AAD00004C0832F867809F0B39433FD12C030FF91 -:10AAE00006C05A2CB31418F4530C5B18B32CB314CF -:10AAF00060F4B70180E290E03C8787D3B3943C8553 -:10AB0000F6CFB31410F43B1801C0312C34FF11C040 -:10AB1000B70180E390E03C8778D33C8532FF16C0D4 -:10AB200031FD03C088E790E002C088E590E0B701FE -:10AB30000CC0832F867851F031FF02C08BE201C038 -:10AB400080E237FD8DE2B70190E05FD3A51430F4C9 -:10AB5000B70180E390E059D35A94F8CFAA94F40156 -:10AB6000EA0DF11D8081B70190E04FD3A110F6CF1F -:10AB7000332009F45DCEB70180E290E046D33A94E9 -:10AB8000F7CFF7018681978102C08FEF9FEF2C9658 -:10AB9000CDBFDEBFDF91CF911F910F91FF90EF905E -:10ABA000DF90CF90BF90AF909F908F907F906F90ED -:10ABB0005F904F903F902F90089520FD09C0FC01B9 -:10ABC00023FD05C022FF02C073836283518340834B -:10ABD000089544FD10C046FD10C0DB01FC01AA0F22 -:10ABE000BB1FEE1FFF1F1094D1F76A0F7B1F8E1F34 -:10ABF0009F1F31E003C033E001C034E0660F771FD0 -:10AC0000881F991F3150D1F7620F711D811D911D51 -:10AC100008950F931F93CF93DF938C01C801B7D290 -:10AC2000EC0197FD06C08AD2892BC1F7B801CE018D -:10AC300024D3CE01DF91CF911F910F9108958F9270 -:10AC40009F92AF92BF92CF92DF92EF92FF920F93BB -:10AC50001F93CF93DF931F92CDB7DEB78C01C62E23 -:10AC60007A01298394D2AC01552729814B325105B1 -:10AC700021F04D32510561F42068CA94C11002C020 -:10AC800080E06FC0C801298382D2298197FDF8CF67 -:10AC9000322F3D7FD32E322F307339F5803329F593 -:10ACA000BB24BA94BC0C09F449C0C80129836FD2F3 -:10ACB000298197FD43C0382F3F7D383561F48D2DB4 -:10ACC0008264D82ECA94CA94CC20C1F1C8015FD244 -:10ACD00097FF0BC033C026FF04C02D2D2260D22E5B -:10ACE00003C03D2D3261D32ECB2C812C912C5401ED -:10ACF00020ED280F283078F0D4FE03C0B801BDD273 -:10AD00001AC02A3040F0D6FEF9CF2F7D3FEE320F29 -:10AD10003630A0F727504D2DC501B4015ADF4B0145 -:10AD20005C018D2D8260D82ECA94CC2051F0C801D0 -:10AD30002ED297FFDDCFD1FC04C0A2CF812C912C65 -:10AD40005401D7FE08C0B094A09490948094811CC4 -:10AD5000911CA11CB11C2D2DB501A401C7012DDF33 -:10AD600081E00F90DF91CF911F910F91FF90EF90B5 -:10AD7000DF90CF90BF90AF909F908F9008956F928B -:10AD80007F928F929F92AF92BF92CF92DF92EF927B -:10AD9000FF920F931F93CF93DF93CDB7DEB7A197A9 -:10ADA000CDBFDEBF5C017A01CE0101966C0180E26D -:10ADB000F60111928A95E9F7F501838040E050E0B1 -:10ADC000912C712C70E0A1E0B0E0F90183FC859139 -:10ADD00083FE81918F01982F9F01811103C080E034 -:10ADE00090E07AC08E3519F44115510549F1E72FED -:10ADF000F0E0E417F5073CF48D3559F18D3219F484 -:10AE0000772001F103C0711001C0982E892F86951B -:10AE1000869586958601080F111D892F87703D0143 -:10AE200001C0660C8A95EAF7F80180818629808343 -:10AE3000991559F0991510F49F5FE8CF9150E6CF1E -:10AE400071E004C07724739401C0712C4F5F5F4F91 -:10AE5000BCCF772019F08E8180628E83711103C080 -:10AE60009924939416C0F6019E012F5D3F4F808177 -:10AE700080958193E217F307D1F7F2CFE114F10443 -:10AE800029F0F7018083C70101967C016150912C64 -:10AE9000E9F0C50169A37BD169A197FD15C0282FF1 -:10AEA000269526952695F601E20FF11D208130E0CA -:10AEB000AC014770552702C0359527954A95E2F7B2 -:10AEC00020FDDCCFB501D9D1911089CFE114F10477 -:10AED00011F0F7011082C801A196CDBFDEBFDF914E -:10AEE000CF911F910F91FF90EF90DF90CF90BF9087 -:10AEF000AF909F908F907F906F9008954F925F9248 -:10AF00007F928F929F92AF92BF92CF92DF92EF92F9 -:10AF1000FF920F931F93CF93DF931F92CDB7DEB7AE -:10AF20006C012B015A01FC0116821782712CF6016B -:10AF3000F380F201F3FC8591F3FE8191382F2F010C -:10AF4000882309F4E5C090E03983F8D03981892B52 -:10AF500019F0C6015EDEEBCF353241F4F201F3FCAD -:10AF60003591F3FE31912F01353259F4C601398301 -:10AF70000ED1398197FDCAC03817C9F2B6017DD10B -:10AF8000C7C03A3239F4F3FC3591F3FE31912F0109 -:10AF900051E001C050E0420110E020ED230F2A30C3 -:10AFA00088F45260612F70E080E090E040E25983C5 -:10AFB00010DE162FF401F3FC3591F3FE31914F01B1 -:10AFC0005981EBCF052F232F240151FF03C011110D -:10AFD00002C09EC01FEF383619F03C3659F011C040 -:10AFE000F401F3FC2591F3FE21912F01283649F459 -:10AFF000052F08600460F201F3FC2591F3FE219116 -:10B000002F01222309F484C0622F70E08FE096E1C3 -:10B0100029839CD02981892B09F47AC000FD07C0BF -:10B02000F501E080F180C50102965C0102C0E12CCF -:10B03000F12C2E3649F4F6014681578160E070E02C -:10B04000202FC701BADD73CF233689F401FF11E049 -:10B05000C6019DD097FD5AC0E114F10429F0F70113 -:10B060008083C70101967C01115091F74BC02B35AD -:10B0700051F49201A701612FC60181DE2C01892BB9 -:10B0800009F040C03AC0C6012983C3DD298197FD7C -:10B090003DC02F3641F128F4243619F1293631F11B -:10B0A00024C0233769F02537E1F01FC0E114F10413 -:10B0B00029F0F7018082C70101967C01115059F0F7 -:10B0C000C60165D04C0197FD06C038D0892B71F3BD -:10B0D000B601C401D2D0E114F104A1F0F70110824D -:10B0E00011C0006203C0006101C00064202FA701ED -:10B0F000612FC601A4DD811105C0F6018381807333 -:10B1000029F406C000FD13CF739411CF772019F0F6 -:10B11000872D90E002C08FEF9FEF0F90DF91CF91CE -:10B120001F910F91FF90EF90DF90CF90BF90AF9065 -:10B130009F908F907F905F904F900895911114C1D0 -:10B14000803219F089508550D0F70895FC010590A0 -:10B15000061621F00020D9F7C00108953197CF01DC -:10B160000895FC010590615070400110D8F780955A -:10B1700090958E0F9F1F0895FC01615070400190C3 -:10B180000110D8F7809590958E0F9F1F0895CF934B -:10B19000DF93EC012B8120FF33C026FF0AC02F7BF9 -:10B1A0002B838E819F8101968E839F838A8190E07D -:10B1B00029C022FF0FC0E881F9818081082E000C90 -:10B1C000990B009719F420622B831AC03196E883FB -:10B1D000F9830EC0EA85FB85199597FF09C02B817D -:10B1E000019611F080E201C080E1822B8B8308C0C0 -:10B1F0002E813F812F5F3F4F2E833F83992702C0CF -:10B200008FEF9FEFDF91CF9108950F931F93CF930F -:10B21000DF93FB01238121FD03C08FEF9FEF28C047 -:10B2200022FF16C04681578124813581421753077A -:10B2300044F4A081B1819D012F5F3F4F2083318372 -:10B240008C93268137812F5F3F4F2683378310C031 -:10B25000EB01092F182F0084F185E02D1995892B1A -:10B26000E1F68E819F8101968E839F83812F902F9F -:10B27000DF91CF911F910F910895FB01238120FF52 -:10B2800012C026FD10C08F3F3FEF930761F082830D -:10B290002F7D206423832681378121503109268325 -:10B2A0003783992708958FEF9FEF0895FA01AA2712 -:10B2B000283051F1203181F1E8946F936E7F6E5FF9 -:10B2C0007F4F8F4F9F4FAF4FB1E03ED0B4E03CD0A7 -:10B2D000670F781F891F9A1FA11D680F791F8A1F8A -:10B2E000911DA11D6A0F711D811D911DA11D20D0F1 -:10B2F00009F468943F912AE0269F11243019305DAB -:10B300003193DEF6CF010895462F4770405D41939B -:10B31000B3E00FD0C9F7F6CF462F4F70405D4A33E8 -:10B3200018F0495D31FD4052419302D0A9F7EACFB0 -:10B33000B4E0A6959795879577956795BA95C9F7DF -:10B3400000976105710508959B01AC010A2E0694D2 -:10B350005795479537952795BA95C9F7620F731F8B -:10B36000841F951FA01D0895992788270895052EED -:10B3700097FB16F400940FD057FD05D014D007FCAE -:10B3800002D046F408C050954095309521953F4F26 -:10B390004F4F5F4F089590958095709561957F4FC1 -:10B3A0008F4F9F4F0895A1E21A2EAA1BBB1BFD01D0 -:10B3B0000DC0AA1FBB1FEE1FFF1FA217B307E40794 -:10B3C000F50720F0A21BB30BE40BF50B661F771FEC -:10B3D000881F991F1A9469F76095709580959095CC -:0EB3E0009B01AC01BD01CF010895F894FFCF91 -:10B3EE0002400F00831000000104100000018208CB -:10B3FE0000000100000000000000000000009001AD -:10B40E000100010000000000000088238F238F231D -:10B41E009B23A723B123CE23DC23052408240C244D -:10B42E008726E925FE250226172648265B2688262E -:10B43E003E000426140004043E00042E040C0404F2 -:10B44E0000080008000000000000000800080808BE -:10B45E00080808000800080000000808000808088E -:10B46E0000800080000000000000008000808080CE -:10B47E0080808000800080000000808000808080BE -:10B48E0000010001000000000000000100010101A8 -:10B49E000101010001000100000001010001010194 -:10B4AE00000000000000000000000000000000008E -:10B4BE00010101010101010101010101010101016E -:10B4CE00010101010101010101010101010101015E -:10B4DE00010101010101010101010101010101014E -:10B4EE00000000000000000000000000000000004E -:10B4FE00000000000000000000000000000000003E -:10B50E00000000000000000000000000000000002D -:10B51E00010101010101010101010101010101010D -:10B52E00000000000000000000000000000000000D -:10B53E0000000000000000000000000000000000FD -:10B54E0001010101010101010101010101010101DD -:10B55E0000000000000000000000000000000000DD -:10B56E0001010101010101010101010101010101BD -:10B57E0001010101010101010101010101010101AD -:10B58E0000000000000000000000000000000000AD -:10B59E00010101010101010101010101010101018D -:10B5AE00000000020200000200020202020000027D -:10B5BE00000000020200000200020202020000026D -:10B5CE00000000020200000200020202020000025D -:10B5DE00040404060604040604060606060404060D -:10B5EE0004040406060404060406060606040406FD -:10B5FE00000000020200000200020202020000022D -:10B60E00000000020200000200020202020000021C -:10B61E0004040406060404060406060606040406CC -:10B62E0000000002020000020002020202000002FC -:10B63E0004040406060404060406060606040406AC -:10B64E00040404060604040604060606060404069C -:10B65E00040404060604040604060606060404068C -:10B66E00040404060604040604060606060404067C -:10B67E0000000002020000020002020202000002AC -:10B68E00000000020200000200020202020000029C -:10B69E00040404060604040604060606060404064C -:10B6AE00000808080000000800000800080800084C -:10B6BE00000808080000000800000800080800083C -:10B6CE00000808080000000800000800080800082C -:10B6DE00101818181010101810101810181810181C -:10B6EE00101818181010101810101810181810180C -:10B6FE0000080808000000080000080008080008FC -:10B70E0000080808000000080000080008080008EB -:10B71E0010181818101010181010181018181018DB -:10B72E0000080808000000080000080008080008CB -:10B73E0010181818101010181010181018181018BB -:10B74E0010181818101010181010181018181018AB -:10B75E00101818181010101810101810181810189B -:10B76E00101818181010101810101810181810188B -:10B77E00000808080000000800000800080800087B -:10B78E00000808080000000800000800080800086B -:10B79E00101818181010101810101810181810185B -:10B7AE00546F6F206D616E7920646174612E000D8F -:10B7BE000A504152495459204552524F52000D0AD7 -:10B7CE00504152495459204F4B00556E6B6E6F7756 -:10B7DE006E206361726420747970652E002573206B -:10B7EE006F72200054686572652069732061742041 -:10B7FE006C65617374206F6E65206D6F726520636A -:10B80E0061726420747970652063616E646964612D -:10B81E0074652C206275742074686572652077617A -:10B82E0073206E6F7420656E6F7567682074657215 -:10B83E006D696E616C2062756666657220737061EB -:10B84E0063652E0D0A00415451413A090055494491 -:10B85E003A090053414B3A09004E4F20444154419E -:02B86E000000D8 +:1014F00000000000000000000000000000000000EC +:10150000000000000000000002000198010000003F +:101510000000000000000000000000000000004784 +:10152000656D706C75730000000000000000004DD8 +:1015300050434F5300000000000000000000000076 +:10154000000000000000000000000000000000009B +:10155000000000000000000000000000000000008B +:10156000000000000000000000000000000000007B +:101570000C0100000000000000000000000000005E +:10158000000000000000496E6E6F766973696F6E2F +:101590002052265400004A6577656C000000000068 +:1015A000000000000000000000000000000000003B +:1015B000000000000000000000000000000000002B +:1015C000000000000000000000000000000000001B +:1015D00000000000000002000138010000000000CF +:1015E000000000000000000000000000004E6F6BD3 +:1015F000696100000000000000000000004D494645 +:1016000041524520436C617373696320346B202D14 +:1016100020656D756C617465642028363231322026 +:10162000436C6173736963290000000000000000CF +:1016300000000000000000000000000000080001A1 +:101640003801000000000000000000000000000061 +:10165000000000004E6F6B69610000000000000098 +:10166000000000004D494641524520436C617373B0 +:10167000696320346B202D20656D756C6174656421 +:10168000202836313331204E464329000000000027 +:10169000000000000000000000000000000000004A +:1016A000000000006364696E6F70737578585B00AA +:1016B00011241FBECFEFCDBFDFE3DEBF00E00CBFC4 +:1016C00018BE19BE1ABE1BBE14E2A0E0B0E2E2EBE7 +:1016D000F9EB00E00BBF02C007900D92A631B107F5 +:1016E000D9F71BBE25E3A6E1B4E201C01D92A734E1 +:1016F000B207E1F73BD00C94D75C25C13BB78BBF59 +:10170000FB01879196913BBF08953BB78BBFCB01FF +:1017100042E20D94F00F3BB70B0143E20D94F00F42 +:101720003BB78BBFCB0145E20D94F00F3BB746E2D0 +:1017300008C02091CF0127FDFCCF22272093CA01AA +:1017400008954093CA0128ED31E02093340030938E +:10175000CB016091C4017091C5018091C6019927A8 +:101760000895FC014093CA01849108950ED10E940E +:1017700057160E94D616C2D21092520684E0809369 +:10178000420682E680938601C1E0C0932606C0939C +:10179000210686E080932206C093310602E0009382 +:1017A000320610922A0613E01093290689E58093E9 +:1017B00080018AE58093810180E4809341068093D3 +:1017C00046069091B200907F9093B2009091B20043 +:1017D00092609093B20090E39093410690934606F6 +:1017E00080935006C0934606009345061093410629 +:1017F00083E18093010821E030E0209326083093B4 +:101800002708209328083093290810928C08809389 +:1018100080081092230310922103D8E0D093220372 +:1018200081E18093200380911E2090911F2080935E +:101830003803909339038CE380938203D093800321 +:1018400080938303D09381036FD10E948118C0D10C +:1018500031D7C0930002109201020093020210934C +:101860000402C0932002D09321020E941F1519D1B7 +:10187000D2E0C1E18091030481FF25C08091010481 +:1018800080FDFCCFD0930304B8D10E94B3181AD7BF +:101890000E9452160E94DA16E091592EF0915A2EAB +:1018A00019950E9491210E941E18E091682EF091D6 +:1018B000692E8781813011F4C0931F2C868181307D +:1018C00011F4C0931E2C0E948518BAD7E091572EB0 +:1018D000F091582E1995E091512EF091522E1995B4 +:1018E000C9CF292F33272230310559F02330310554 +:1018F00069F021303105F9F482E190E02AE832E024 +:101900001EC08EE390E02CE432E019C099278130AC +:10191000910541F08230910541F0892B61F4E8E4B2 +:10192000F2E005C0ECE1F2E002C0ECEFF1E08491FE +:1019300090E09F0104C080E090E020E030E0FA01F8 +:101940002083318308951F920F920FB60F921124B6 +:1019500008B60F9218BEFFCF1F920F920FB60F92CC +:10196000112408B60F9218BE8F939F938EB19FB12A +:1019700080589F4F8EB99FB99F918F910F9008BE4D +:101980000F900FBE0F901F9018958091780083FFE5 +:101990000AC088E08093780088ED84BF81E080935E +:1019A00080000D94FE008BEC8093520080915000DB +:1019B0008860809350008091510083FFFCCF82ECBF +:1019C00080935500809150008061809350008091F9 +:1019D000510084FFFCCF88ED84BF84E080934000F9 +:1019E0001EB81FB881E0809343002FE730E02093BA +:1019F0000A0430930B0420930C0430930D0480935D +:101A000000048093020480E880930001089588ED2B +:101A100084BF81E080937900089588ED84BF8BE1D5 +:101A200080938000089580915000826080935000E0 +:101A30008091510081FFFCCF82E08093CA01EDE1EB +:101A4000F0E0E491E0936200ECE1F0E0E491E093F7 +:101A500063001092CA0180E8809365008BEB80934D +:101A6000660080915600897F8093560080915600D1 +:101A70008460809356008091600081608093600054 +:101A80000895E0E4F0E084818E7F8483E0E6F0E076 +:101A900080818E7F8083E0E5F0E080818D7F808390 +:101AA000089587E08093A20078940895089508959A +:101AB0000895089508950895089580E090E00895A8 +:101AC000089508950F931F93CF93DF931F92CDB77F +:101AD000DEB70DE41EE2D8011296ED91FC9113974A +:101AE000898319950E94C921E091682EF091692E91 +:101AF00089818583B8E18B9FB001112464567D4FA5 +:101B000048E150E0C8010E94EF55D801ED91FC91E9 +:101B10001995D8011696ED91FC9117970F90DF91CA +:101B2000CF911F910F91199448E150E06CE972E058 +:101B30008DE49EE20E94EF55E091682EF091692EAF +:101B40008581C0CF0F931F93E091682EF091692E8D +:101B50008B019C01458168E08CE593E00E94BB17F6 +:101B60001F910F910895FF920F931F93CF93DF93CF +:101B70001F92CDB7DEB78C019E012F5F3F4FAC01A6 +:101B800068E08CE593E00E94D317F82E882389F053 +:101B9000898198DFF80140E08191882319F04F5F37 +:101BA0004F31D1F7E091652EF091662EB80181E1B9 +:101BB00019958F2D0F90DF91CF911F910F91FF906D +:101BC00008959B01AC0168E08CE593E00C94FA1752 +:101BD00008950C94E15508951F93CF93DF93C82F78 +:101BE000D92F162F180F1C1721F00E94E155899349 +:101BF000FACFDF91CF911F9108950E94E1550E9485 +:101C0000E1550E94E1550C94E155EF92FF920F933C +:101C10001F93CF93DF937C0161507109FA018A0110 +:101C2000020F131FDC0140E050E0E017F107F1F074 +:101C300062307105D8F09191392F32953F703A306A +:101C400010F4305D01C0395C3C939F709A3010F401 +:101C5000905D01C0995C9701240F351FE9019983BC +:101C60001296625071094E5F5F4FDFCF1C92CA011E +:101C7000DF91CF911F910F91FF90EF900895CF9337 +:101C8000DF93EC01DA01E0E0F0E04C91442391F1C4 +:101C900011969C911197992339F1E617F70721F1D5 +:101CA00080ED840F8A3020F08FEB840F8630D0F4E3 +:101CB00080ED890F8A3020F02FEB290F263090F429 +:101CC000242F30E0413410F0275331092295207F32 +:101CD000913410F4982F01C09753292B29933196F2 +:101CE0001296D3CF80E004C011968C91811102C06E +:101CF00090E001C0CF01DF91CF910895E0E6F6E0DA +:101D000080E1858382E0868388E085838AE1818320 +:101D1000E0EAF9E01682178280EC858388E184830B +:101D2000E0E0F1E0128A8BE6838B148A158A20EAC0 +:101D3000208F99E0918F128E148E158E168E84E06E +:101D4000808B12A23CE633A314A215A210A611A602 +:101D500012A624A795A716A680A30895411551059C +:101D600009F449C020E12093660623E02093A009EE +:101D70002091A10927FFFCCF2091A0097093A00911 +:101D80002091A10927FFFCCF2091A0096093A00911 +:101D90002091A10927FFFCCF2091A00921E02093E9 +:101DA000120180931C0190931D01409314015093E4 +:101DB00015011092220186E194E28093280190930C +:101DC00029014093240150932501809110018068DE +:101DD0008093100180912001806880932001809180 +:101DE000100187FDFCCF80E38093110180932101D6 +:101DF00080E18093650608954115510509F469C095 +:101E000020E12093660626E02093A0092091A109F5 +:101E100027FFFCCF2091A00920E120936506000058 +:101E200000002093660622E02093A0092091A109DA +:101E300027FFFCCF2091A0097093A0092091A10950 +:101E400027FFFCCF2091A0096093A0092091A10950 +:101E500027FFFCCF2091A0091092120126E134E265 +:101E600020931C0130931D014093140150931501E0 +:101E700020E120932201809328019093290140932F +:101E800024015093250180911001806880931001F6 +:101E9000809120018068809320018091100187FD4E +:101EA000FCCF80E3809311018093210180E1809336 +:101EB0006506E091682EF091692E8781863019F4CD +:101EC00081E180931F2C8681863019F481E1809313 +:101ED0001E2C0895CF92DF92EF92FF92CF93DF9363 +:101EE000C090672ED12CE12CF12C8DE0CC0CDD1CA8 +:101EF000EE1CFF1C8A95D1F7C114D10481E0E806DD +:101F0000F10408F04EC080E18093660686E080937D +:101F1000A0098091A10987FFFCCF8091A00980E1F1 +:101F200080936506000000008093660682E080933F +:101F3000A0098091A10987FFFCCF8091A009109290 +:101F4000A0098091A10987FFFCCF8091A009109280 +:101F5000A0098091A10987FFFCCF8FEFE81AF80A4A +:101F60008091A009C0E0D0E1C701B601C7DB809332 +:101F7000A0098091A10987FFFCCF8091A0099093CF +:101F8000A0098091A10987FFFCCF8091A00982E080 +:101F9000C80ED11CE11CF11C219731F780E1809320 +:101FA0006506DF91CF91FF90EF90DF90CF9008957D +:101FB000CF92DF92EF92FF92CF93DF93C090672E84 +:101FC000D12CE12CF12C8DE0CC0CDD1CEE1CFF1C87 +:101FD0008A95D1F7C114D10481E0E806F10438F004 +:101FE000DF91CF91FF90EF90DF90CF9073CF8FEF85 +:101FF000E81AF80AC1E2D0E0219791F39ADBC70111 +:10200000B60183DB96DB8FEFD81AE80AF80AF4CF23 +:10201000CF92DF92EF92FF920F931F93CF93DF93B4 +:10202000C090672ED12CE12CF12C8DE0CC0CDD1C66 +:10203000EE1CFF1C8A95D1F7C114D10481E0E8069B +:10204000F10408F04FC080E18093660683E080933E +:10205000A0098091A10987FFFCCF8091A00910926F +:10206000A0098091A10987FFFCCF8091A00910925F +:10207000A0098091A10987FFFCCF8FEFE81AF80A29 +:102080008091A009C1E2D0E0219749F152DB4EDBFB +:1020900050DB00E010E01092A0098091A10987FFB9 +:1020A000FCCF6091A00970E01092A0098091A10975 +:1020B00087FFFCCF8091A009782BC8012CDB39DB8E +:1020C0000E5F1F4F011581E0180729F7C701B60100 +:1020D00027DB2FDB8FEFD81AE80AF80AD5CF80E18B +:1020E00080936506E091682EF091692E8781863095 +:1020F00019F490E190931F2C9681963049F420E1D9 +:1021000020931E2C853059F483E180931F2C02C04C +:102110008530D1F3953019F483E180931E2CDF9143 +:10212000CF911F910F91FF90EF90DF90CF90089586 +:10213000CF92DF92EF92FF920F931F934115E0E24F +:102140005E076105710508F06BC06901E12CF12C97 +:1021500000E010E220E030E0041B150B260B370BEB +:10216000C016D106E206F30610F49701860120E1BD +:102170002093660626E02093A0092091A10927FF5D +:10218000FCCF2091A00920E120936506000000000B +:102190002093660622E02093A0092091A10927FF41 +:1021A000FCCF2091A0095093A0092091A10927FFFD +:1021B000FCCF2091A0094093A0092091A10927FFFD +:1021C000FCCF2091A0091092120126E134E2209365 +:1021D0001C0130931D01009314011093150120E19F +:1021E00020932201809328019093290100932401D8 +:1021F00010932501809110018068809310018091D7 +:1022000020018068809320018091100187FDFCCF20 +:1022100080E3809311018093210180E18093650622 +:1022200081E01F910F91FF90EF90DF90CF90089584 +:10223000CF92DF92EF92FF920F931F934115E0E24E +:102240005E076105710508F05DC06901E12CF12CA4 +:1022500000E010E220E030E0041B150B260B370BEA +:10226000C016D106E206F30610F49701860120E1BC +:102270002093660623E02093A0092091A10927FF5F +:10228000FCCF2091A0095093A0092091A10927FF1C +:10229000FCCF2091A0094093A0092091A10927FF1C +:1022A000FCCF2091A00921E02093120180931C0112 +:1022B00090931D01009314011093150110922201B7 +:1022C00086E194E2809328019093290100932401F0 +:1022D00010932501809110018068809310018091F6 +:1022E00020018068809320018091100187FDFCCF40 +:1022F00080E3809311018093210180E18093650642 +:1023000081E001C080E01F910F91FF90EF90DF907E +:10231000CF9008958091CF0187FDFCCF0895FADF1B +:102320008091CF0181FF0BC086E38093CA01EBEC63 +:10233000F1E021E030E088ED90E084BF2083089553 +:10234000EF92FF920F931F93CF93DF931F921F92F1 +:10235000CDB7DEB77C018A011092C20169837A830E +:10236000D9DF6981A62F7A81B72FC701800F911F0E +:1023700026E048ED50E061E070E0EBECF1E0E816BB +:10238000F90689F0E092C0013F2D3F713093C10101 +:102390002093CA0144BF60833091C4013D933FEF55 +:1023A000E31AF30AECCFC8010F900F90DF91CF91A1 +:1023B0001F910F91FF90EF9008952F923F924F92AF +:1023C0005F926F927F928F929F92AF92BF92CF92C5 +:1023D000DF92EF92FF920F931F93CF93DF9300D082 +:1023E000CDB7DEB76A01282F2F711C01221A3108E0 +:1023F00029836A837B8393DF8DDF83E38093CA0124 +:102400001092C1011092C2016A81E62E7B81F72EE3 +:10241000860185E3582E98ED892E912C66246394CD +:10242000712C3BECA32EBB24B39443E3442E2981AF +:102430000115110509F12093C001F70181917F0178 +:102440008093C4010150110919F02F5F203281F7E8 +:102450002092C001832D8F718093C1015092CA01D7 +:10246000C401F50184BF608290E2290E311C52DF65 +:102470004092CA0120E0DCCFC6012396CDBFDEBF6B +:10248000DF91CF911F910F91FF90EF90DF90CF9050 +:10249000BF90AF909F908F907F906F905F904F9084 +:1024A0003F902F9008951F93CF93DF93CDB7DEB762 +:1024B000A097CDBFDEBF853009F4AEC078F482307E +:1024C00081F128F4813009F0EEC010E01BC08330A8 +:1024D00009F453C0843009F475C0E5C0883009F4AC +:1024E000D3C040F4863009F4CDC0873009F0DBC09A +:1024F0008FDDD9C0893009F4C9C08A3009F0D3C052 +:1025000080D3D1C08091632E181708F0A8C061DB7A +:10251000E1E0F0E0EC0FFD1FE10FF11D80831F5F94 +:10252000F1CF11E08091632E873009F010E0E09147 +:102530005D2EF0915E2ECE01019619954091632E8D +:1025400031E0141708F08BC03323A9F0812F90E0FD +:10255000E1E0F0E0EC0FFD1FE80FF91F208131E012 +:102560002F3F09F030E0E1E0F0E0EC0FFD1FE80F55 +:10257000F91F2F5F20831F5FE4CFE0915D2EF09164 +:102580005E2ECE01019619958091632E41E0815017 +:1025900008F465C04423D9F3282F30E0E1E0F0E0EF +:1025A000EC0FFD1FE20FF31F908141E09F3F09F008 +:1025B00040E0E1E0F0E0EC0FFD1FE20FF31F9F5F52 +:1025C0009083E5CF11E08091632E873009F010E011 +:1025D000E0915D2EF0915E2ECE010196199540910D +:1025E000632E31E01417D8F53323A1F0812F90E04A +:1025F000E1E0F0E0EC0FFD1FE80FF91F208131E072 +:10260000211130E0E1E0F0E0EC0FFD1FE80FF91FD1 +:10261000215020831F5FE6CFE0915D2EF0915E2E6A +:10262000CE01019619958091632E41E08150B8F05A +:102630004423E1F3282F30E0E1E0F0E0EC0FFD1F50 +:10264000E20FF31F908141E0911140E0E1E0F0E002 +:10265000EC0FFD1FE20FF31F91509083E7CFE09145 +:102660005F2EF091602ECE0101961995E091652EB6 +:10267000F091662E4091632EBE016F5F7F4F83E124 +:10268000199511C05DD30FC025DC0DC080910008E5 +:10269000813021F480918C08833019F00E945522FA +:1026A00002C00E947A22A096CDBFDEBFDF91CF91FB +:1026B0001F910895E0E0F6E080E6828388E1868B52 +:1026C000858B0895CF93C0910806C095C6FF12C0B0 +:1026D000809118248A3050F08A30E1F4E091682E1D +:1026E000F091692E8181DFDE809118248F5F8093C5 +:1026F000182410C08C2F807669F4809118248150A2 +:102700008A3030F4E091682EF091692E8081CBDE22 +:1027100010921824C5FF12C0809117248A3050F0FF +:102720008A30D9F4E091682EF091692E8381BBDE66 +:10273000809117248F5F809317240FC0C07669F4AF +:102740008091172481508A3030F4E091682EF09106 +:10275000692E8281A8DE10921724CF9108959B01E3 +:10276000AC016BE084E696E045C420E030E090E008 +:10277000F901E80FF91FE959F14D6383265F3F4FD7 +:1027800020353105A9F708950F931F939B01E09120 +:10279000682EF091692EE80FF11D8A0140816BE0EF +:1027A00084E696E0E8D31F910F9108950F931F934D +:1027B000CF93DF931F92CDB7DEB7082FAB019E01F9 +:1027C0002F5F3F4F6BE084E696E0EDD3182F882310 +:1027D00019F06981802FC9DF812F0F90DF91CF9190 +:1027E0001F910F9108950895EF92FF920F931F93F9 +:1027F000CF937B01C42F2EB13FB1009108041091FB +:102800000904022B132B682F83E090E20E94F553FA +:102810006C2F83E090E20E94F553612F83E090E2F9 +:102820000E94F553602F83E090E20E94F5536C2FD5 +:1028300070E0C701CF911F910F91FF90EF905BC4A3 +:1028400008953F924F925F926F927F928F929F92E4 +:10285000AF92BF92CF92DF92EF92FF920F931F93AE +:10286000CF93DF937C01E901C0900020D09001203C +:10287000960122503843C901A0E0B0E0481759073B +:102880006A077B0708F05CC0E2E0CE1AE0E4DE0AEB +:102890002A013B014C0E5D1E611C711C4816590635 +:1028A0006A067B0648F0241B350B8E01021B130BB6 +:1028B000E9013324339403C000E010E0312C4601D9 +:1028C000A12CB12C481559056A057B0510F5CA01E4 +:1028D0008E5F9F4B2A013B014C0E5D1E611C711CDB +:1028E000481459046A047B0428F4AE01BC01C701F2 +:1028F00035DA18C0C41AD50AA601BC01C7012EDA00 +:10290000AE014C195D096EE174E2C7018C0D9D1D8D +:1029100007C04C195D09BA01625E7B4DAE01C7016B +:102920000E941D56311002C081E00BC001501109F8 +:10293000D8F3F801EC0FFD1FEE0DFF1D1082F6CF4E +:1029400080E0DF91CF911F910F91FF90EF90DF908A +:10295000CF90BF90AF909F908F907F906F905F903F +:102960004F903F90089520911A2430911B2480E0CD +:1029700098E0821B930BEEE1F4E29F012E5134426A +:102980002817390710F41192F8CF8EE194E2809362 +:102990001C2490931D2480E098E080931A24909347 +:1029A0001B2482E090E4809300209093012042E079 +:1029B00050E060E070E480E090E21EDAE091682E82 +:1029C000F091692E87818A3019F480E180931F2C61 +:1029D00086818A3019F480E180931E2C08958091BD +:1029E0001A2490911B2490582091002030910120AE +:1029F000821B930B089520E030E0F901E959F14D75 +:102A00008783265F3F4F20353105B9F7813049F084 +:102A100018F0823059F008951092192483EF93E151 +:102A200009C0809319248AE795E104C01092192403 +:102A300084EF93E18093652E9093662E08950F9313 +:102A40001F93CF93DF931F92CDB7DEB7E091682E2F +:102A5000F091692E8481CFDF8EE194E280931C2473 +:102A600090931D2400E018E000931A2410931B2477 +:102A700041E050E0BE016F5F7F4F80E090E060DC9E +:102A8000E0911C24F0911D24DF01C8011D920197E3 +:102A9000E9F78981882341F042E050E060E070E48A +:102AA00080E090E25BD917C082E090E48093002040 +:102AB0009093012042E050E060E070E480E090E21A +:102AC0009BD981E0898341E050E0BE016F5F7F4F79 +:102AD00080E090E072DCE091652EF091662E40E09F +:102AE00060E070E08FEF19950F90DF91CF911F910B +:102AF0000F9108950F931F93CF93DF93AEB1BFB1A2 +:102B0000C0910804D091090420911A2430911B240B +:102B1000E42FF0E08F010C5F1F4F2017310758F1B1 +:102B2000CA2BDB2B245031092E1B3F0B20931A2478 +:102B300030931B24A0911C24B0911D248C931196DA +:102B40004C9311971296DC931297CD0104968093C3 +:102B50001C2490931D241396CC93DB01EC0141506F +:102B600018F02D912993FBCFE80FF91FE0931C2457 +:102B7000F0931D2412C080E03EDFE091682EF091BA +:102B8000692E87818A3019F481E180931F2C868118 +:102B90008A3019F481E180931E2CDF91CF911F912F +:102BA0000F9108951F93CF93DF931F92CDB7DEB798 +:102BB0009E012F5F3F4FAC0163E08FEC97E0F3D1B4 +:102BC000182F882311F0898116DF812F0F90DF9154 +:102BD000CF911F9108950F931F93E091682EF0916C +:102BE000692E8B019C01448163E08FEC97E0C3D197 +:102BF0001F910F9108959B01AC0163E08FEC97E06A +:102C0000F9C1CF93DF9380911A2490911B248115F1 +:102C100028E0920708F043C06091002070910120E5 +:102C2000C0E0D8E0AE01481B590B80E090E8861B5D +:102C3000970B8417950798F18EE194E2DDD82091E7 +:102C40001A2430911B248091002090910120985FDC +:102C5000821B930B8093002090930120C21BD30B07 +:102C6000EEE1F4E2CF018E5194428C179D0710F4EF +:102C70001192F8CF8EE194E280931C2490931D244E +:102C800080E098E080931A2490931B2442E050E067 +:102C900060E070E480E090E2DF91CF91ADC8DF9119 +:102CA000CF910895809119248111ABCF089543E508 +:102CB00050E067E67EE281E090E042CB43E550E001 +:102CC00067E67EE281E090E078CBCF93DF93CFEFB1 +:102CD000C80FC83078F5D82F0E94C92199D9C09360 +:102CE000672E8AE0C89F90011124C9018659914D31 +:102CF0008093682E9093692EF901E959F14D8085F2 +:102D00000E94620DE091682EF091692E848173DE3D +:102D1000E1D88FE18D0FE091682EF091692E9781B7 +:102D2000943011F480931F2C9681943029F4809371 +:102D30001E2C02C080E001C081E0DF91CF91089598 +:102D40008091672E99E04AE0915099F0282F30E069 +:102D50002F5F3F4F27703327822F429FF001439F01 +:102D6000F00D1124E959F14D2085222369F38F5F7D +:102D7000ACCF0895FC019091672E9F5C90831182E7 +:102D80000895CF93FC01C081818181110CC0BF01E6 +:102D9000E091652EF091662E41E082E1199580ED7B +:102DA0008C0FCF9192CF80E0CF91089588E18093EE +:102DB0000106089580911E2C823191F030F480310B +:102DC000B9F050F48823A9F132C0833169F090EE54 +:102DD000980F983088F02BC088E08093050627C0B4 +:102DE00088E08093070623C08091040683FF12C009 +:102DF00088E0809306061BC09091202C9F5F923044 +:102E000019F09093202C15C01092202C909104065C +:102E100093FD04C088E0809305060BC098E0909372 +:102E20000606803221F0815080931E2C02C0109241 +:102E30001E2C80911F2C823191F030F48031C1F032 +:102E400050F48823A9F132C0833169F090EE980FD5 +:102E5000983088F02BC080E18093050627C080E180 +:102E60008093070623C08091040684FF12C080E18E +:102E7000809306061BC09091212C9F5F923019F021 +:102E80009093212C08951092212C9091040694FD8A +:102E900004C080E180930506089590E190930606B2 +:102EA000803221F0815080931F2C089510921F2CA6 +:102EB00008959B01AC016BE082E398E09BC020E0A9 +:102EC00030E0982F90718870992321F0F901E95929 +:102ED000F14D6287882321F0F901E959F14D6187AD +:102EE000265F3F4F2035310579F7992329F090E18E +:102EF0009093060610921F2C882329F088E0809377 +:102F0000060610921E2C08950F931F939B018A01B1 +:102F1000803131F4E091682EF091692E478107C02D +:102F2000883049F4E091682EF091692E46816BE07B +:102F300082E398E020D01F910F9108950F931F9383 +:102F4000CF93DF931F92CDB7DEB7082FAB019E0161 +:102F50002F5F3F4F6BE082E398E025D0182F882346 +:102F600019F06981802FABDF812F0F90DF91CF9116 +:102F70001F910F9108950F931F93FC01662379F021 +:102F800094916150941309C0BF016F5F7F4FA801F6 +:102F9000C9010E94015681E003C0B196EFCF80E0E5 +:102FA0001F910F910895CF92DF92EF92FF921F939E +:102FB000CF93DF93EC017A016901162F112389F079 +:102FC000BE016F5F7F4FC7010E94F8551150892BDA +:102FD00031F4FE01C491F601C08381E003C0A196E3 +:102FE000EDCF80E0DF91CF911F91FF90EF90DF90C8 +:102FF000CF900895CF930196CCE26623C9F0FC01EF +:10300000DA01AD017491772341F021153105A1F06A +:103010007D93319621503109F4CF623030F0211583 +:10302000310551F04F5F5F4FCC9361508196E5CFF2 +:10303000232B11F0FA011082CF9108958091200284 +:103040008068809320028091230280FFFCCF81E082 +:1030500080932302A0911002B0911102AE5BB109DE +:10306000B7FF02C0A0E0B0E020E038EB4BE050E05A +:103070000E947B55E091682EF091692E61157105D3 +:10308000844F9140A8F48781873019F480E18093C0 +:103090001F2C8681873019F480E180931E2C80914B +:1030A000632E882389F0E091552EF091562E1994C5 +:1030B0008781873019F481E180931F2C86818730C6 +:1030C00019F481E180931E2C0895BC0183E090E205 +:1030D0000C94A753CF93DF93FC016491EC012196EC +:1030E000662331F083E090E20E94F553CE01F4CFE5 +:1030F000DF91CF910895AB01BC0183E090E20C9485 +:10310000D15380E2809362060895CF93DF9380913C +:10311000222C823029F583E090E20E945A540E94CA +:10312000294F83E090E20E947654EC0197FD18C08D +:10313000E091682EF091692E8781833019F483E144 +:1031400080931F2C8681833019F483E180931E2C99 +:103150008C2F41D6811104C08C2FDF91CF91DFC716 +:10316000DF91CF9108958091222C813079F028F061 +:103170008230D9F0833011F12EC08091680685FF2E +:103180002AC08FE08093022081E00CC08091022051 +:1031900081508093022081111EC00E94130D0E9455 +:1031A000D45282E08093222C16C08091680685FD5F +:1031B00012C08FE08093022083E0F4CF8091022040 +:1031C000815080930220811106C00E9499520E9472 +:1031D000410D1092222C8091222C823019F44BD771 +:1031E0000C9491210895E091682EF091692E8781C9 +:1031F000823019F481E180931F2C8681823019F48A +:1032000081E180931E2C0895E091682EF091692E43 +:103210008781823019F480E180931F2C868182306F +:1032200019F480E180931E2C089583E090E20C94C1 +:10323000825383E090E20C94C95423E33BE03F9334 +:103240002F932DE23BE03F932F9326E23BE03F9309 +:103250002F932FE13BE03F932F932FE73AE03F93EB +:103260002F9322E02F931F929F938F930E94865655 +:103270008DB79EB70E968DBF9EBF85E6089560E020 +:1032800072E00E94A20D85E60895FB0120812F3394 +:1032900049F42181211106C060E072E00E94E10D35 +:1032A00085E60895CB010E94B30D882319F006DD51 +:1032B00084E608958AEC0895EF92FF920F931F938E +:1032C000CF93DF93CDB7DEB7A097CDBFDEBF7C0134 +:1032D0000091632E10E00115110591F487E79AE043 +:1032E0009F938F9382E08F931F92FF92EF920E94A1 +:1032F00086560F900F900F900F900F900F9010C068 +:10330000E0915D2EF0915E2ECE0101961995980107 +:10331000AE014F5F5F4F60E072E0C7010E94050E93 +:1033200085E6A096CDBFDEBFDF91CF911F910F91B3 +:10333000FF90EF900895DF92EF92FF920F931F930B +:10334000CF93DF93CDB7DEB7A097CDBFDEBF7B01B4 +:103350000091632E10E060E77AE0C7010E94F85503 +:10336000892B29F5D12CED2CF12CE016F10658F41F +:103370000E94E90DE1E0F0E0EC0FFD1FEE0DFF1DF6 +:103380008083D394F0CFE0915F2EF091602ECE0138 +:1033900001961995E091652EF091662E4091632E6D +:1033A000BE016F5F7F4F83E1199584E60BC0A701D3 +:1033B00060E270E0CE0101960E943F0E80179107F7 +:1033C00011F38AECA096CDBFDEBFDF91CF911F91A4 +:1033D0000F91FF90EF90DF900895FC018091642E93 +:1033E000882311F081E301C080E38083118285E6A8 +:1033F0000895FB012181211127C02081213321F46F +:1034000081E08093642E04C0203321F41092642E56 +:1034100084E608952F33C1F41F9220E32F931F9267 +:1034200021E32F932AE63AE03F932F9322E02F9354 +:103430001F929F938F930E9486568DB79EB70A96D0 +:103440008DBF9EBF85E608958AEC089588E990E1D6 +:1034500091D48EE6089588E191E1A7D48EE608958F +:10346000E0ECF4E081818E7F81830E9499520E947A +:10347000070D84E60895E0ECF4E081818E7F81837E +:103480000E9499520E940D0D84E60895EDE4FEE23B +:1034900025892F9324892F9327E63AE03F932F9392 +:1034A00022E02F931F929F938F930E9486568DB791 +:1034B0009EB708968DBF9EBF85E608952091632E26 +:1034C0001F922F9324E63AE03F932F9322E02F930D +:1034D0001F929F938F930E9486568DB79EB7089632 +:1034E0008DBF9EBF85E6089540E052E0BC0180E0BC +:1034F0004BD985E60895FB0120812F3341F42181CA +:10350000211105C060E072E02AD985E6089580E0C7 +:103510004DD9882319F0D2DB84E608958AEC08950A +:1035200040E052E0BC0181E02FD985E60895FB011F +:1035300020812F3341F42181211105C060E072E028 +:103540000ED985E6089581E031D9882319F0B6DBDC +:1035500084E608958AEC089540E052E0BC0182E0E0 +:1035600013D985E60895FB0120812F3341F4218191 +:10357000211105C060E072E0F2D885E6089582E08E +:1035800015D9882319F09ADB84E608958AEC08950A +:1035900040E052E0BC0183E0F7D885E60895FB01E6 +:1035A00020812F3341F42181211105C060E072E0B8 +:1035B000D6D885E6089583E0F9D8882319F07EDB14 +:1035C00084E608958AEC089540E052E0BC0180E171 +:1035D0009BDC85E60895FB0120812F3341F4218196 +:1035E000211105C060E072E064DC85E6089580E1A9 +:1035F000A5DC882319F062DB84E608958AEC08953F +:1036000040E052E0BC0188E07FDC85E60895FB01E4 +:1036100020812F3341F42181211105C060E072E047 +:1036200048DC85E6089588E089DC882319F046DBCC +:1036300084E608958AEC089560E072E0CCDA85E6CD +:103640000895FB0120812F3341F42181211105C010 +:1036500060E072E0D0DA85E60895CB01A3DA882332 +:1036600019F02CDB84E608958AEC0895CF93DF935C +:10367000EC01B5D9813028E0920718F09C01385050 +:1036800002C020E030E03F932F939F938F9324E478 +:103690003AE03F932F9382E08F931F92DF93CF9373 +:1036A0000E9486568DB79EB70A968DBF9EBF85E64F +:1036B000DF91CF91089581E294E177D38EE608956A +:1036C000A0DA84E608954FD984E6089560E072E0B8 +:1036D00051DB85E60895CB0154DB882319F0EEDA3F +:1036E00084E608958AEC08950E94D80F84E6089530 +:1036F0000E94081084E608950E946A0F84E60895E7 +:103700008091680680FD02C089E7089588E70895E2 +:10371000DF92EF92FF920F931F93CF93DF93EC0111 +:103720000FEF11E086E7E82E8CE0F82E9CE2D92E10 +:10373000B70181ED93E20E94F855892BD1F0011574 +:103740001105B9F0DE01F7012491ED012196C801C0 +:103750000197222341F00130110529F02C93DE015D +:1037600031968C01F1CFDC928C0188E1E80EF11CDE +:10377000DFCF2197188285E6DF91CF911F910F91BE +:10378000FF90EF90DF900895FC01209120022068C7 +:10379000209320028091230280FFFCCF81E0809360 +:1037A0002302A0911002B0911102AE5BB109B7FFE4 +:1037B00002C0A0E0B0E020E038EB4BE050E00E9417 +:1037C0007B55AA27BB279F938F932DE33AE03F9326 +:1037D0002F9382E08F931F92FF93EF930E94865660 +:1037E0008DB79EB708968DBF9EBF85E608952EB112 +:1037F0003FB14091080450910904242B352B3F938D +:103800002F9327E33AE03F932F9322E02F931F92C9 +:103810009F938F930E9486568DB79EB708968DBF53 +:103820009EBF85E608950F931F93CF93DF931F925A +:103830001F92CDB7DEB78B01E091682EF091692E13 +:103840008581873009F06FC0E091552EF091562E9A +:10385000199581E08093772C60E270E0C8010E94A6 +:103860003E560097F9F4F80101900020E9F73197EE +:10387000E01BF10BE0FD59C0F695E795E130F1054D +:1038800039F487E090E080934B2E90934C2E37C014 +:1038900053E0EE0FFF1F5A95E1F7E0934B2EF093A4 +:1038A0004C2E2DC098012C5F3F4F82179307E9F5EE +:1038B000A80162E070E0CE0101960E943F0E89816E +:1038C00090E0982F88272A81820F911D80934B2E9C +:1038D00090934C2E0B5F1F4FF80101900020E9F7E9 +:1038E0003197E01BF10BE0FD20C0F695E79533E042 +:1038F000EE0FFF1F3A95E1F7E817F907B0F0609176 +:103900004B2E70914C2E695F7F4F83E076956795C3 +:103910008A95E1F7A8018BE49DE20E943F0E0E9488 +:10392000072A8FEF03C089EC01C08AEC0F900F903B +:10393000DF91CF911F910F910895EF92FF920F9316 +:103940001F93CF93DF931F921F92CDB7DEB78B01EA +:10395000E091682EF091692E8581873009F080C052 +:10396000E091552EF091562E199582E08093772C98 +:1039700060E270E0C8010E943E567C01892B31F55F +:10398000F80101900020E9F73197E01BF10BE0FD11 +:1039900069C0F695E795E130F10539F487E090E0EC +:1039A00080934B2E90934C2E47C063E0EE0FFF1F89 +:1039B0006A95E1F7CF0169E070E00E946755E81B66 +:1039C000F90BE0934B2EF0934C2E36C0C8010496B1 +:1039D000E816F90609F046C0A80162E070E0CE01E1 +:1039E00001960E943F0E298130E0322F22278A81E2 +:1039F000280F311D20934B2E30934C2E273031054C +:103A000029F0C90187709927892B61F587010F5F1C +:103A10001F4FF80101900020E9F73197E01BF10BEF +:103A2000E0FD20C0F695E79543E0EE0FFF1F4A95B5 +:103A3000E1F7E217F307B0F060914B2E70914C2E36 +:103A4000695F7F4F83E0769567958A95E1F7A801D6 +:103A50008BE49DE20E943F0E0E94072A8FEF03C075 +:103A600089EC01C08AEC0F900F90DF91CF911F91EC +:103A70000F91FF90EF900895E091682EF091692EDC +:103A800085818730A1F4E091552EF091562E19953D +:103A900085E08093772C0E9404430E94072A8EE0E1 +:103AA00093E48093322C9093332C8FEF089589EC1C +:103AB0000895E091682EF091692E85818730A1F4F8 +:103AC000E091552EF091562E199583E08093772C36 +:103AD0000E9404430E94072A8EE093E48093322CD4 +:103AE0009093332C8FEF089589EC0895E091682E20 +:103AF000F091692E85818730A1F4E091552EF091E7 +:103B0000562E199586E08093772C0E9404430E94DC +:103B1000072A8EE093E48093322C9093332C8FEF1E +:103B2000089589EC0895E091682EF091692E408502 +:103B3000518564E6649F9001659F300D11243F9389 +:103B40002F9321E33AE03F932F9322E02F931F928C +:103B50009F938F930E9486568DB79EB708968DBF10 +:103B60009EBF85E60895CF93DF931F921F92CDB736 +:103B7000DEB7FB0120812F33B1F42181211113C065 +:103B80002FEF39E03F932F9322E02F931F929F93C3 +:103B90008F930E9486560F900F900F900F900F906A +:103BA0000F9085E627C089E592E089839A83CE014C +:103BB00001969F938F938BEF99E09F938F937F93C1 +:103BC0006F930E94BC560F900F900F900F900F9024 +:103BD0000F90892B71F089819A818935F2E09F07D6 +:103BE00040F4E091682EF091692E8087918784E6F9 +:103BF00001C08AEC0F900F90DF91CF910895209132 +:103C00001F202F9320911E202F9328EF39E03F9300 +:103C10002F9322E02F931F929F938F930E9486569B +:103C20008DB79EB708968DBF9EBF85E60895CF934A +:103C3000DF931F921F92CDB7DEB7FB0120812F3398 +:103C4000B1F42181211113C02FE02F932FEF2F9377 +:103C500027EA39E03F932F9322E02F931F929F93FF +:103C60008F930E948656CDBFDEBF85E627C019829E +:103C70001A82CE0101969F938F9383EA99E09F93D6 +:103C80008F937F936F930E94BC560F900F900F906D +:103C90000F900F900F90892B81F089819A81811567 +:103CA000E0E19E0750F480933803909339038093AA +:103CB0001E2090931F2084E601C08AEC0F900F9085 +:103CC000DF91CF910895FB0120812F33D9F4218119 +:103CD000211121C01F9220E32F931F9221E32F93E4 +:103CE0002DE939E03F932F9322E02F931F929F936A +:103CF0008F930E9486568DB79EB70A968DBF9EBF42 +:103D000085E60895213311F4D0D303C0203319F48C +:103D1000F1D384E608958AEC0895FC0180910008AF +:103D2000813021F480918C08833011F080E301C050 +:103D300081E38083118285E60895E091682EF091F9 +:103D4000692E85818730A1F4E091552EF091562E91 +:103D5000199584E08093772C0E9404430E94072ADF +:103D60008EE093E48093322C9093332C8FEF089560 +:103D700089EC089521E02093312C2093302C2CE302 +:103D800020932D2C25E030E020932B2C30932C2CED +:103D90001092252C1092262C1092272C1092282C51 +:103DA0008093232C9093242C089527E02093312C8A +:103DB0002CE231E020932B2C30932C2C1092252CCC +:103DC0001092262C1092272C1092282C8093232CB2 +:103DD0009093242C0895CF939091312C9530E1F15C +:103DE00030F4933029F140F5913068F440C19730B8 +:103DF00009F4A7C008F445C0983009F4AAC0993066 +:103E000009F432C134C1813041F41092292C10924E +:103E10002A2C10922E2C83E0FBC0843011F466E033 +:103E20008BC0883109F420C18B3109F0F3C01CC16B +:103E300080932F2C84E0ECC090E040912F2C2FEF4A +:103E400030E0241B31098217930721F485E0E0C09C +:103E5000981739F165E169C02091292C30912A2CFD +:103E6000A9014F5F5F4F4093292C50932A2CF901F1 +:103E7000E654F14D80834038510509F0CBC086E00F +:103E8000C7C020912F2C9091302C291346C0EAEB0B +:103E9000FEE290E02FE2EA33F207D1F22191920F95 +:103EA000F9CF4091252C5091262C6091272C7091B0 +:103EB000282CE091232CF091242C20E830E08AEB90 +:103EC0009EE21995C82F882311F18091302C8F5FC5 +:103ED0008093302C8091252C9091262CA091272C1A +:103EE000B091282C80589F4FAF4FBF4F8093252C07 +:103EF0009093262CA093272CB093282C66E083E087 +:103F000090E20E94F55382E08093312CB1C068E1C9 +:103F100083E090E20E94F5530EC030E0892F90E0DC +:103F200001972817390739F466E083E090E20E9490 +:103F3000F55382E06DC068E183E090E20E94F553A2 +:103F400093C0853119F41092302C09C08B3109F4DB +:103F50008BC0883109F463CF863009F05DC0809151 +:103F6000302C8F5F8093302C4091252C5091262C43 +:103F70006091272C7091282CE091232CF091242C17 +:103F800020E830E08AEB9EE21995C82F8823D1F112 +:103F900061E083E090E20E94F5536091302C83E071 +:103FA00090E20E94F5536091302C609583E090E29E +:103FB0000E94F55360E870E08AEB9EE29CD8EAEB41 +:103FC000FEE260E08FE2EA33F80719F08191680FB2 +:103FD000F9CF83E090E20E94F5538091252C9091D7 +:103FE000262CA091272CB091282C80589F4FAF4FA2 +:103FF000BF4F8093252C9093262CA093272CB09311 +:10400000282C36C064E083E090E20E94F55389E0FA +:104010008093312CC1E02CC08531E1F761E083E071 +:1040200090E20E94F5536091302C83E090E20E9470 +:10403000F5536091302C609583E090E20E94F55337 +:1040400060E870E08AEB9EE256D8EAEBFEE260E0C0 +:104050002FE2EA33F20719F08191680FF9CF83E07C +:1040600090E20E94F553D6CF1092312CD3CFC0E00E +:104070008C2FCF9108958091312C813019F08730A9 +:1040800029F1089580912B2C90912C2C9C0121508A +:10409000310920932B2C30932C2C892B31F58091D6 +:1040A0002D2C9FEF980F90932D2C882331F065E1F4 +:1040B00083E090E20E94F55302C01092312C85E01B +:1040C00090E080932B2C90932C2C089580912B2C96 +:1040D00090912C2C9C012150310920932B2C309352 +:1040E0002C2C892B11F41092312C0895EDE4FBE077 +:1040F00020E030E09491981309C041E2429FC00152 +:10410000439F900D1124825B944F08952F5F3F4F82 +:10411000B1962930310571F780E090E00895CF9293 +:10412000DF92EF92FF920F931F93CF93982F9F7D73 +:1041300091549A3160F090ED980F9A3040F08F359D +:1041400031F0982F9D7F9D3311F08032D1F49FE99B +:10415000980F9A3108F480522091372C3091382CE6 +:104160002F3F91E0390708F0D3C0A9014F5F5F4F9F +:104170004093372C5093382CF901E654F14D80834D +:10418000C7C08D3009F095C0E091372CF091382CE4 +:10419000E654F14D10821092372C1092382C8091F9 +:1041A000362C8111B5C08091BA2E982F9F7D09F4CD +:1041B00095C08D7F8D3309F491C0EAEBFEE27F015B +:1041C000C191CC2331F0CF3321F0CD3311F0C03287 +:1041D000B1F7F701108286E7C82E8CE0D82E00E0F8 +:1041E00010E0B6018AEB9EE20E94F855892B09F097 +:1041F00056C01092BA2ECF3349F488E1809FF00167 +:10420000819FF00D1124E457F34F18C0B7016F5F81 +:104210007F4FCD3349F488E1809FF001819FF00DFD +:104220001124E657F34F20C0C11113C088E1809FCD +:10423000F001819FF00D1124EA57F34F259134913D +:104240002115310509F44DC08AEB9EE2F90119955B +:1042500014C0C03209F045C088E1809FF001819F01 +:10426000F00D1124E857F34F2591349121153105B4 +:10427000C1F18AEB9EE2F90119958F3F99F581E032 +:104280008093362C8EB19FB120910804309109049F +:10429000822B932B8093342C9093352C39C00F5F55 +:1042A0001F4FF8E1CF0ED11C0732110509F099CF4D +:1042B00015C0883061F48091372C9091382C00978C +:1042C00039F101978093372C9093382C21C08B3192 +:1042D000F9F41092372C1092382C1AC088ECC0E0F8 +:1042E00002C089ECC1E002DF0E946A188AE49BE008 +:1042F0000E946A18CC2361F08091BA2E882341F085 +:104300008AEB9EE20E94651887E49BE00E946A188F +:1043100081E0CF911F910F91FF90EF90DF90CF90B0 +:1043200008958091362C882399F1E091682EF091C0 +:10433000692E208531852115310551F18EB19FB14E +:104340004091080450910904842B952B4091342C02 +:104350005091352C841B950B64E670E00E946755E4 +:1043600062177307A8F01092362C8BECBFDE0E9408 +:104370006A1884E49BE00E946A18E091322CF09164 +:10438000332C309729F019951092322C1092332C3F +:1043900008958091362C8823A9F01092362C8BEC4E +:1043A000A5DE0E946A1884E49BE00E946A18E091EE +:1043B000322CF091332C309729F019951092322C31 +:1043C0001092332C0895CF93DF939091362C99233C +:1043D000A9F0EB011092362C89DE0E946A1881E464 +:1043E0009BE00E946A18209749F0CE010E94651850 +:1043F0008EE39BE0DF91CF910C946A18DF91CF910F +:104400000895EF92FF920F931F93CF937C019B012E +:10441000613081E0780710F020E031E08B01021B71 +:10442000130BA70160E072E08AEB9EE20E94050E8A +:104430008AEB9EE20E946518C1E0013081E0180716 +:10444000B0F01A956C2F70E0762F6627A701460F03 +:10445000571F20E032E060E072E08AEB9EE20E94AB +:10446000050E8AEB9EE20E946518CF5FE6CF01152C +:10447000110591F0EC2FF0E0FE2FEE27A7014E0F73 +:104480005F1F980160E072E08AEB9EE20E94050ED9 +:104490008AEB9EE20E9465188BE39BE0CF911F910F +:1044A0000F91FF90EF900C946A1880910008813072 +:1044B00029F480918C08833009F4089580913B2C75 +:1044C000811117C081E08093000893E090938C08DD +:1044D0008093392C10923A2C8EB19FB12091080410 +:1044E00030910904822B932B8093402C9093412C84 +:1044F0000895089510928C0810920008E9E3FCE2F8 +:104500001082118208959091392C9923F1F08091B5 +:104510003A2C811115C02091392C2223B9F02EB1EB +:104520003FB14091080450910904242B352B409150 +:10453000402C5091412C241B350B2634310530F092 +:1045400081E080933A2C892F089581E00895CF93DC +:10455000DF931F92CDB7DEB780913B2C8823D1F03B +:104560002EB13FB14091080450910904242B352B02 +:1045700040913E2C50913F2C241B350B40913C2CFC +:1045800050913D2C2417350728F010923B2C89833D +:104590008CDF89810F90DF91CF91089580931E2049 +:1045A00090931F208093380390933903089580914E +:1045B0001E2090911F20089680931E2090931F200C +:1045C0008093380390933903089580E991E08093B4 +:1045D0001E2090931F2080933803909339030895F1 +:1045E000A0E2B6E081E015968C9315972AEB30E3B4 +:1045F00028B939B92AE331E32AB93BB910B813B85D +:1046000012B816B817B811B8E0E0F9E010A211A27C +:104610002FEF30E026A337A32FEF3FEF20A731A7DE +:10462000808388E8838380E1848783E087831C9686 +:104630008C931C9782E01A968C9308951F920F9288 +:104640000FB60F92112408B60F9218BE0BB60F9238 +:104650001BBE8F939F93EF93FF93E0E0F9E01382EB +:104660008FE790E086AB97AB81E190E080AF91AFB0 +:10467000E0E0FAE010A211A28FEF9FEF86A397A3CC +:1046800089E88383168281E084878EE0808310929C +:104690002A06FF91EF919F918F910F900BBE0F9083 +:1046A00008BE0F900FBE0F901F9018951F920F928B +:1046B0000FB60F92112408B60F9218BE0BB60F92C8 +:1046C0001BBE2F933F938F939F93EF93FF93209164 +:1046D000280693B1267081E009F080E0990F892BBC +:1046E00083B982B1882309F464C012B883B187709A +:1046F000873059F51092000980E180930C091092DF +:10470000030A1B9B03C08CEA94E002C08CE694E091 +:104710008093260A9093270A82E081B981E08093F2 +:104720000C0A83E08093060A86B197B1877049F03E +:1047300090B18F5F893011F09695FBCFE8B1F9B158 +:10474000908381E08093422C37C093B1892F8C7085 +:1047500099F192FB992790F981E0982781B1811115 +:104760001BC080B18695911190E8892B80B926B144 +:1047700037B12F5F3F4F26B937B927703327232B27 +:10478000D9F4E8B1F9B19F012F5F3F4F28B939B98A +:10479000808381E081B910C081B1813069F4EAB1D0 +:1047A000FBB19F012F5F3F4F2AB93BB9908311B8EE +:1047B00003C082B1809582B988E880930309FF9194 +:1047C000EF919F918F913F912F910F900BBE0F9082 +:1047D00008BE0F900FBE0F901F9018951F920F925A +:1047E0000FB60F92112408B60F9218BE0BB60F9297 +:1047F0001BBE2F933F938F939F93EF93FF9381B1B2 +:10480000823008F49DC081B18D3008F099C0E1B1CB +:10481000F0E0EE0FFF1FEA5DFF4D0190F081E02D0B +:1048200019948FE790E08093260A9093270A88C016 +:104830008E9A8EE0809340088FE390E08093260A62 +:104840009093270A85E06FC08E9886E081B98FEF3C +:1048500082B914B815B8E8B1F9B1808180B970C0D7 +:10486000009B05C08E9A82B1809582B901C08E9856 +:1048700087E059C0009B02C08E9801C08E9A80B11B +:10488000869580B984B195B1019684B995B984B102 +:1048900095B187709927892B11F488E044C024B121 +:1048A00035B186B197B128173907B1F52BC0EAB1F8 +:1048B000FBB1309711F0808101C082B1882311F0E3 +:1048C0008E9A01C08E9889E02EC0EAB1FBB1309774 +:1048D00051F08081882311F08E9801C08E9A319614 +:1048E000EAB9FBB908C082B1882311F08E9801C0E3 +:1048F0008E9A8FEF82B924B135B186B197B128175E +:10490000390711F48AE00FC0E8B1F9B1CF0101967F +:1049100088B999B9818180B986E005C08E988BE00D +:1049200002C08E988CE081B90BC01092000A1092E0 +:10493000060A109240081092410881E08093432CAF +:10494000FF91EF919F918F913F912F910F900BBE0F +:104950000F9008BE0F900FBE0F901F901895CF9329 +:10496000DF93E2E4FCE210821182E0E4F6E0128AD6 +:1049700084E08283C0E8D1E082E68E83A0E2B6E0E4 +:1049800081E016968C93169711968C93119796E06A +:1049900012969C93129751968C93519742E052969F +:1049A0004C9352971A961C921A9733E019963C939F +:1049B00099E598839AE5998390E491839683A0EB97 +:1049C000B0E012962C911297207F12962C9312979A +:1049D00012962C911297226012962C9320E3218339 +:1049E0002683908B868345833183E0E0F8E083E182 +:1049F000818321E030E026A337A320A731A7E0E898 +:104A0000F8E014868083E0E2F3E01382118288E00C +:104A1000828391E1908320911E2030911F20208F6E +:104A2000318FE0E8F3E09CE392838083938381837A +:104A3000DF91CF91D5CDA0E2B6E01A961C921A97DD +:104A4000E2E4FCE210821182E0E0F9E010821382DD +:104A5000178280E18487E0E0FAE0108213821682F8 +:104A600081E08487E0E4F8E01082118216968C934E +:104A70008E980895CF93DF938091422C882309F478 +:104A80007EC01092422CC6B1D7B1C730D10508F410 +:104A900071C0AE01495F5F4F93E0569547959A9577 +:104AA000E1F7E091652EF091662E6AEB70E380E409 +:104AB0001995E091682EF091692E8781883019F45C +:104AC00083E180931F2C8681883019F483E18093E1 +:104AD0001E2CE0915B2EF0915C2EBE018AEB90E3E0 +:104AE0001995EC0194FF06C0DF7E8AE391E38AB951 +:104AF0009BB902C01AB81BB82097E1F1AE01495F1B +:104B00005F4F83E0569547958A95E1F7E091652ED2 +:104B1000F091662E6AEB70E381E41995E091682EBE +:104B2000F091692E8781893019F483E180931F2CDD +:104B30008681893019F483E180931E2CC6B9D7B9D8 +:104B40008AEB90E388B999B91092600810926108D5 +:104B50008FE090E0809366089093670888E090E08B +:104B600080936A0890936B0883E28093410883E006 +:104B700081B905C01092000A1092060A31DD8091B9 +:104B8000432C882329F01092432CDF91CF9128CD1C +:104B9000DF91CF910895CF93DF93E0E4F6E0128A9E +:104BA00084E08283C0E8D1E082E68E83A0E2B6E0B2 +:104BB00081E016968C93169711968C93119796E038 +:104BC00012969C93129751968C93519742E052966D +:104BD0004C9352971A961C921A9733E019963C936D +:104BE000199799E598839AE5998390E49183968340 +:104BF000C0EBD0E02A81207F2A832A8122602A8389 +:104C000020E321832683908B868345833183E0E0F4 +:104C1000F8E093E1918321E030E026A337A320A7B9 +:104C200031A7E0E8F8E014869083E0E2F3E0138235 +:104C3000118298E0928341E1408340911E2050917F +:104C40001F20408F518FE0E8F3E04CE342839083D4 +:104C50004383918315968C93E0E0F9E08FE790E031 +:104C600086A397A322A733A7108216828CE087839E +:104C70001092000A1092442CE7E4FCE210821282A7 +:104C80001182DF91CF91089581E08093260632DC76 +:104C9000E0E0F9E010821782E0E0FAE0108217828B +:104CA000E7E4FCE211821282108208951F920F92B3 +:104CB0000FB60F92112408B60F9218BE0BB60F92C2 +:104CC0001BBE2F933F938F939F93EF93FF93E0919E +:104CD000442CF0E0EE0FFF1FE05CFF4D0190F081EF +:104CE000E02D199410928C081092000886E18A95A4 +:104CF000F1F700C081E08093000883E080938C0886 +:104D000018B88091BA3086B917B882E001C083E044 +:104D10008093442C86C0309911C082B181110EC09D +:104D200010928C081092000896E19A95F1F700C055 +:104D300081E08093000883E080938C0884E0E8CFD2 +:104D4000309B10C010928C081092000886E18A9562 +:104D5000F1F700C081E08093000893E090938C0805 +:104D600082B901C012B886B1869586B984B195B171 +:104D7000019784B995B9892B11F485E001C083E0CE +:104D80008093442C87B18F5F87B9877009F049C041 +:104D9000E8B1EF5FE8B9F0E0E654FF4C808186B9F6 +:104DA00040C082B181110EC010928C081092000890 +:104DB00096E19A95F1F700C081E08093000883E0C6 +:104DC00080938C0886E0A4CF1092000982E591E0E0 +:104DD0000197F1F700C0000082E08093870389E328 +:104DE000809381038AEB90E38AB99BB981E090E0DC +:104DF00084B995B980E886B98EB19FB12091080435 +:104E000030910904822B932B8093452C9093462C50 +:104E100081E08093492C18B817B81092442C01C037 +:104E200000C0FF91EF919F918F913F912F910F9033 +:104E30000BBE0F9008BE0F900FBE0F901F901895DD +:104E40001F920F920FB60F92112408B60F9218BE40 +:104E50000BB60F921BBE2F933F934F935F938F938D +:104E60009F93EF93FF931092070A1092000A1092FB +:104E7000470910924009809181038E7F80938103BE +:104E800084B195B187709927892BC9F0E4B1F5B148 +:104E900086B144B155B193E0F695E7959A95E1F75F +:104EA000E654FF4C90E04770552728E030E0241B83 +:104EB000350B02C0959587952A95E2F7808381E0AE +:104EC0008093482C1092492C8FEF9FEF8093260AF5 +:104ED0009093270A1092200A1092210A1092060A33 +:104EE0001092070A1092030A84E08093000A87E078 +:104EF0008093442CFF91EF919F918F915F914F91FF +:104F00003F912F910F900BBE0F9008BE0F900FBED8 +:104F10000F901F9018951F920F920FB60F921124A9 +:104F200008B60F9218BE0BB60F921BBE8F93EF936D +:104F3000FF93E0E8F3E081818F7C8183E0E0FAE099 +:104F400088E8838381E08083FF91EF918F910F90B8 +:104F50000BBE0F9008BE0F900FBE0F901F901895BC +:104F60001F920F920FB60F92112408B60F9218BE1F +:104F70000BB60F921BBE2F933F934F935F938F936C +:104F80009F93EF93FF9380916009109260091092B4 +:104F9000610992E090934009813620F0813A08F04F +:104FA00063C077C086B1869586B984B195B1019604 +:104FB00084B995B987709927892B41F4EAB1FBB17F +:104FC000CF0101968AB99BB986B1808384B195B12E +:104FD00080FD88C0369986C01092070A1092000A98 +:104FE0001092470910924009809181038E7F80932F +:104FF000810384B195B187709927892BC9F0E4B1F9 +:10500000F5B186B144B155B193E0F695E7959A951F +:10501000E1F7E654FF4C90E04770552728E030E078 +:10502000241B350B02C0959587952A95E2F780835E +:1050300081E08093482C1092492C8FEF9FEF809352 +:10504000260A9093270A1092200A1092210A1092A1 +:10505000060A1092070A1092030A84E08093000A5D +:1050600087E08093442C3EC086B18695806886B9DF +:1050700084B195B1019684B995B987709927892B28 +:1050800041F4EAB1FBB1CF0101968AB99BB986B16F +:10509000808386B18695806886B984B195B1019682 +:1050A00084B995B987709927892B41F4EAB1FBB18E +:1050B000CF0101968AB99BB986B1808386B1869566 +:1050C00086B984B195B1019684B995B9877099274D +:1050D000892B41F4EAB1FBB1CF0101968AB99BB9A2 +:1050E00086B18083FF91EF919F918F915F914F9156 +:1050F0003F912F910F900BBE0F9008BE0F900FBEE7 +:105100000F901F901895BF92CF92DF92EF92FF926F +:105110000F931F93CF93DF93CDB7DEB7DA95CDBF53 +:10512000DEBF8091492C8823F1F08EB19FB1409170 +:105130000804509109042091452C3091462C842B71 +:10514000952B821B930B20912020309121202F5FE3 +:105150003F4F2817390738F414B815B881E0809309 +:10516000482C1092492CF3D9811144C1CCD9882301 +:1051700009F440C18091492C81113CC18091472C98 +:10518000811105C08091482C882309F433C1809196 +:10519000442C873041F48091200A9091210A853275 +:1051A000914008F427C18091482C882309F4A6C0B7 +:1051B00084B195B1892B09F4A1C084B195B1089748 +:1051C00018F414B815B89AC044B155B1495F5F4F8F +:1051D00063E0569547956A95E1F76AEB70E3CE0177 +:1051E00001960E941D568AEB90E38AB99BB904B1DF +:1051F00015B114B815B8C12CD12C73E1B72EE8E065 +:10520000EE2EF12CC016D10608F078C0F60153E05E +:10521000F695E7955A95E1F741E050E04C0F5D1F98 +:10522000E40FF51F8081982F969596959083837053 +:10523000813039F0E8F0823009F059C086B18695A6 +:1052400003C086B18695806886B984B195B1019610 +:1052500084B995B987709927892B09F048C0EAB1BC +:10526000FBB1CF0101968AB99BB986B180833FC05B +:1052700084B195B187709927892BC1F0E4B1F5B15C +:1052800086B124B135B143E0F695E7954A95E1F74B +:10529000E654FF4C90E027703327A701421B530BC5 +:1052A00002C0959587954A95E2F78083E091682E34 +:1052B000F091692E8781883011F4B0921F2C86817D +:1052C000883011F4B0921E2C44B155B1495F5F4F44 +:1052D00093E0569547959A95E1F7E091652EF09108 +:1052E000662E6AEB70E382E4199581E001C080E0EC +:1052F00052E0C50ED11C882309F484CF1092472CAC +:105300001092482C64B175B1E0915B2EF0915C2E47 +:105310008AEB90E3199584B995B984B195B1892B3D +:1053200009F468C089E0809381031092000A10920A +:10533000200A1092210A8FE790E08093260A90932A +:10534000270A8FE590E08093280A9093290A10920B +:10535000060A80E180930C0A93E09093070A10926A +:105360006009109261092FEF3FEF20936609309397 +:10537000670920E031E020936809309369091092B1 +:10538000460980934C0981E08093470981E180932D +:105390008001109288011092800310922906E091FA +:1053A000682EF091692E8781893019F483E180930A +:1053B0001F2C8681893019F483E180931E2C44B11F +:1053C00055B1495F5F4F83E0569547958A95E1F760 +:1053D000E091652EF091662E6AEB70E383E41995F7 +:1053E00081E08093442C12B8109220091092210978 +:1053F00080930009D395CDBFDEBFDF91CF911F9180 +:105400000F91FF90EF90DF90CF90BF90089514B868 +:1054100015B881E08093472C48C81092070A109273 +:10542000000A1092470910924009809181038E7FF3 +:105430008093810384B195B187709927892BC9F036 +:10544000E4B1F5B186B144B155B193E0F695E79575 +:105450009A95E1F7E654FF4C90E04770552728E015 +:1054600030E0241B350B02C0959587952A95E2F70D +:10547000808381E08093482C1092492C8FEF9FEF1E +:105480008093260A9093270A1092200A1092210AEC +:105490001092060A1092070A1092030A84E0809381 +:1054A000000A87E08093442C1092442C1092482CE0 +:1054B0001092472C1FC881E080934C2C10924A2CEC +:1054C000089581E080934C2C08950895CF92DF9247 +:1054D000EF92FF920F931F93CF93DF93CDB7DEB779 +:1054E0002597CDBFDEBF8C01FC01808190914C2CB3 +:1054F0009230F1F038F0943079F120F1953009F4E0 +:105500004AC049C121E09227292F217020934A2CBB +:10551000911102C0863219F0823509F03CC184E451 +:10552000F8018083118282E080934C2C80E134C1A9 +:1055300090914A2C911102C08632B1F0823509F067 +:105540004DC012C090914A2C911102C0863261F078 +:10555000823509F075C008C090914A2C911102C0A3 +:10556000863211F0823539F484E4F80180831182A7 +:1055700081E089270DC0803309F41BC1823A09F408 +:1055800034C1803A09F451C1803509F4F6C081E094 +:1055900080934C2C00C160E170E0C8010E9412347D +:1055A0008823A1F08091642E81110BC060914B2C57 +:1055B000F4E06F9FB001112444E050E0C8010E9464 +:1055C000FC0E84E080934C2C8AE004C084E080933D +:1055D0004C2C81E0F801808384E0DEC08339B9F689 +:1055E00019821A821B821C8288E8898343E050E07A +:1055F00060E070E0CE0102960E94AE0EF80181815B +:10560000803209F4ABC0803709F048C0F8019281BC +:1056100089819813C0C093818A819813BCC09481FA +:105620008B819813B8C095818C819813B4C084E0A5 +:10563000808361E070E0C8010E94E73383E02AC004 +:10564000853909F0A4CF44E050E064E070E0CE0179 +:1056500001960E94AE0EF8018181803209F47EC06D +:105660008037E1F4F80192818981981394C0938185 +:105670008A81981390C094818B8198138CC09581F6 +:105680008C81981388C0108261E070E0C8010E948C +:10569000E73384E080934C2C88E17EC0E82EE294CE +:1056A0009FE0E9222EEF2E0D8F70F82E88E090E01B +:1056B0008F1991094FEF50E06A0102C0D594C79449 +:1056C0008A95E2F7253021F0243059F5FF20E9F0E2 +:1056D00044E050E0B8016E5F7F4FCE0101962D830C +:1056E0000E9410562D81892B61F49A818981892726 +:1056F0009B8189279C818927F801968189278C21A4 +:1057000069F1243071F4F11046C044E050E0B80172 +:105710006E5F7F4FCE0101960E941056892BF1F0EB +:105720003AC02430C0F5E22EF12CA701B8016E5F1B +:105730007F4FCE0101960E941056892B61F5D8014A +:10574000AE0DBF1DE1E0F0E0EC0FFD1FEE0DFF1D03 +:1057500012969C9180818927C822E9F42981F80159 +:1057600020833A8131839B8192838C818383232799 +:1057700092278927848388E20FC0F80181818111F3 +:1057800042C062E070E0C8010E941234882309F42C +:1057900020CF10924C2C80E090E02596CDBFDEBF4C +:1057A000DF91CF911F910F91FF90EF90DF90CF90FD +:1057B0000895F801F18062E070E0C8010E9412349F +:1057C000882309F406CFFFE0FF15E8F084E0F89E97 +:1057D000B001112440E150E0C8010E94AE0E60E12A +:1057E00070E0C801F4D780E9D7CFF801F18066E016 +:1057F00070E0C8010E941234882309F4EACE8EEFCB +:105800008F0D8E3018F0F8011082E6CE8091642E54 +:105810008111DACEF4E0FF9EB001112444E050E0A3 +:10582000C80102960E94FC0ECFCEF801F18062E022 +:1058300070E0C801F7D7882309F4CBCE8EEF8F0D27 +:105840008E3008F7F0924B2C85E0BCCECF93DF93DF +:10585000EC0143E050E060E070E00E94AE0E44E0F6 +:1058600050E064E070E0CE010396DF91CF910C949C +:10587000AE0E0F931F93CF93DF931F921F92CDB75E +:10588000DEB78C01FC0190818181892798E8892706 +:10589000928189278A8394818381892795818927A9 +:1058A00096818927898343E050E060E070E0C80179 +:1058B0000E94FC0E41E050E063E070E0CE010296F1 +:1058C0000E94FC0E44E050E064E070E0C8010396E2 +:1058D0000E94FC0E41E050E068E070E0CE010196CD +:1058E0000E94FC0E0F900F90DF91CF911F910F91AE +:1058F000089581E08093702C84E090E080934F2C99 +:105900009093502C88E080934E2C10924D2C08954B +:1059100081E08093702C84E490E080934F2C9093EE +:10592000502C88E080934E2C10924D2C089581E0ED +:105930008093702C82E090E080934F2C9093502CB9 +:1059400088E180934E2C10924D2C089581E0809335 +:10595000702C089508958F929F92AF92BF92CF922C +:10596000DF92EF92FF920F931F93CF93DF93CDB708 +:10597000DEB76397CDBFDEBF8C015B018091702CD9 +:105980006730710501F5F8019081882311F0963296 +:1059900011F09235C1F421E0811120E020934D2CCB +:1059A00040914F2C3091502C211102C0963211F0B1 +:1059B000923539F4F801408331838FEF8093512C75 +:1059C00038C0A12CB12C853009F49CC050F4823031 +:1059D000A9F1C8F0833009F469C0843009F482C0A9 +:1059E000C2C5883009F425C138F4863009F49AC05C +:1059F000873009F4D3C0B7C5893009F44FC38D305F +:105A000008F471C3B0C591E08927982F91709093E5 +:105A10004D2C30914F2C2091502CF8019081811108 +:105A200002C0963219F0923509F019C4F80130839A +:105A3000218384E08093702C80E196C5F8018081F9 +:105A4000982F9D7F913419F48AE0808367C3803357 +:105A5000C1F462E070E0C801E5D6882309F49CC077 +:105A6000F8016181F0E16F9FB001112440E150E045 +:105A7000C8010E94AE0E60E170E0C801A8D680E9BE +:105A800073C5803A79F462E070E0C801CBD6882310 +:105A900009F482C0F80181818093672C83E08093B0 +:105AA000702CD2CF803509F05EC552C060E170E045 +:105AB000C801B8D6882389F08091642E81110BC06B +:105AC0006091672CF0E16F9FB001112440E150E03C +:105AD000C8010E94FC0E8AE001C081E0F8018083C9 +:105AE00082E01AC390914D2C30914F2C2091502C74 +:105AF000F8018081911102C0863211F1823509F0DE +:105B0000B6C31EC090914D2C30914F2C2091502C3B +:105B1000F8018081911102C0863291F0823509F03E +:105B200053C40EC090914D2C30914F2C2091502C8D +:105B3000F8018081911102C0863211F0823531F472 +:105B4000F8013083218381E0892786C38035C9F439 +:105B5000F8018181882319F0F8011082DFC262E028 +:105B600070E0C8015FD68823B9F0E091652EF0910E +:105B7000662E40E060E070E081E919951092702C8B +:105B8000F2C490EA980F923008F0C1C462E070E06D +:105B9000C80148D68111EAC481E054C2C8010E94FC +:105BA000E53964E07801F4E0EF0EF11CC7010E94D2 +:105BB000FC3CE091652EF091662E44E0B70180EA4E +:105BC0001995F80194818091682C981329C09581CA +:105BD0008091692C981324C0968180916A2C981327 +:105BE0001FC0978180916B2C98131AC080916C2CE8 +:105BF000808380916D2C818380916E2C8283809133 +:105C00006F2C838364E0C8010E94EE3EE091652E14 +:105C1000F091662E44E0B80181EA199588E009C246 +:105C2000E091652EF091662E44E068E67CE280EC1F +:105C300032C2F8018081803551F48181811107C021 +:105C40008281873521F483818D3C09F40AC264E0A6 +:105C5000C8010E94FC3CF8018081803309F0C2C079 +:105C600062E070E0C801DED5882309F4ACC0F80119 +:105C7000618167FD04C0862F8370833029F0862FF1 +:105C80008F708F3009F084C06093672C8091522C04 +:105C90009091532C3091542C282F22952095422FEF +:105CA0004927407F09F043C023272F7009F03FC0E8 +:105CB000929590959327907FD1F5262F67FD02C08E +:105CC000237003C02F7009F023E0982F9095432F85 +:105CD00042954F702223C1F0892F90E0022E02C01E +:105CE000959587950A94E2F7982FE32FF0E0022E1E +:105CF00002C0F595E7950A94E2F73E2F50E002C006 +:105D0000559547952A95E2F740FBCC24C0F8D12C55 +:105D1000CC0CDD1CCC0CDD1C30FBEE24E0F8F12CAF +:105D2000EE0CFF1CEC28892F81708E2901C087E0C2 +:105D30002091662C30E0280F311D280F311DF9010C +:105D4000E05BFF4D8081F8019801205F3F4F119289 +:105D5000E217F307E1F79091552CF801918782FF44 +:105D600009C09091522C96839091532C97839091D7 +:105D7000542C908784FF15C06360F0E16F9FB001E1 +:105D80001124665F7F4F46E050E0C8010A9607C0C5 +:105D900080E1689FB001112440E150E0C8010E94F9 +:105DA000AE0E60E170E0C80112D5E091652EF09171 +:105DB000662E42E1B80180E8199562E1C8010E94AF +:105DC000EE3E80E939C10E94073C91E08927F80145 +:105DD0008083E091652EF091662E44E0B80181EC5D +:105DE00019959CC1803A61F462E070E0C8011AD54F +:105DF0008823D9F1F80181818093672C89E00DC057 +:105E0000803C89F462E070E0C8010CD5882369F118 +:105E1000F80181818093672C8BE08093702C0E9425 +:105E2000073C9AE00EC1813C91F462E070E0C80149 +:105E3000F9D48823D1F0F80181818093672C4AE05E +:105E4000F42EF092702C0E94073C8F25FBC0823C00 +:105E500099F462E070E0C801E5D4882331F0F801DC +:105E600081818093672C8CE0D8CFE091652EF091F2 +:105E7000662E44E0B80121C0803B11F562E070E07D +:105E8000C801D0D4E091652EF091662E44E0B801AF +:105E9000882399F086E819958091642E8111BFCFEF +:105EA000F8016181F0E16F9FB001112440E150E001 +:105EB00086E59CE20E94FC0EB2CF81EC1995BEC033 +:105EC00090EA980F923008F0BFC062E070E0C8011D +:105ED000A9D4882309F4B2C0F8018081803621F06A +:105EE0003AE3C32ED12C03C020E3C22ED12CF801FB +:105EF000818187FF0CC0807FF0E18F9F70011124AA +:105F000080ECC80ED11C96EFA92EB12C08C08C7F56 +:105F100090E1899F7001112486E3A82EB12CE091B5 +:105F2000652EF091662E42E0B80180E91995F801DE +:105F3000808181708093662CC701B4E09695879527 +:105F4000BA95E1F78093672C9091512C981769F0DE +:105F5000B7016A0D7B1D44E050E082E59CE20E949F +:105F6000AE0E8091672C8093512C68E0CE01019693 +:105F70000E94EC0D8091632E44E050E0873019F4CC +:105F800063E070E002C060E070E0CE010F960E9416 +:105F9000AE0EB7016C0D7D1D46E050E0CE010996B6 +:105FA0000E94AE0E89818093682C8A818093692C2F +:105FB0008B8180936A2C8C8180936B2C60E488E6C3 +:105FC0009CE20E9434418091682C80936C2C8091DB +:105FD000692C80936D2C80916A2C80936E2C80911B +:105FE0006B2C80936F2C60E28CE69CE20E94344123 +:105FF00020E0AE014F5F5F4FBE01615F7F4FCE017A +:106000000996F7D68981F80180838A8181838B8103 +:1060100082838C818383E058FF4F8D81808331960A +:106020008E81808331968F818083319688858083AD +:1060300087E08093702C80E290E174C30E94073C5B +:1060400091E08927F80101CD8035B9F4F80181810B +:10605000811182CD62E070E0C801E4D3882309F4A5 +:106060009BCD1092702CE091652EF091662E40E051 +:1060700060E070E081E9199576C2A501495F5F4F44 +:10608000A3E056954795AA95E1F7E091652EF0912A +:10609000662EB80182E9199581E0DEC062E1C8018F +:1060A0000E94FC3C60E170E0C801BCD3E091652E29 +:1060B000F091662E882329F142E1B80181E8199513 +:1060C0008091642E81110BC06091672CF0E16F9F6D +:1060D000B001112440E150E0C8010E94FC0E0E9472 +:1060E000073C9AE015C066E0C8010E94FC3C64E0F1 +:1060F00070E0C80197D3811113C0E091652EF09133 +:10610000662E44E0B80181EC19950E94073C91E0AD +:106110008927F801808388E08093702C84E024C272 +:106120006091672CF0E16F9FB001112440E150E0D5 +:1061300086E59CE20E94AE0E9091562C80915A2CDE +:1061400080959813EBC280915E2C9813E7C2209142 +:10615000572C80915B2C80952813E0C280915F2C96 +:106160002813DCC2C090582C80915C2C8095C812FA +:10617000D5C28091602CC812D1C28091592C309127 +:106180005D2C30958313CAC23091612C8313C6C233 +:106190004091622C3091632C30954313BFC23091F3 +:1061A000642C4313BBC23091652C30954313B6C2A7 +:1061B000F801308141818280912CA12CB12C5401B5 +:1061C00099248824942A832A3381B32AD12CE12C60 +:1061D000F12C7601DD24CC24D22AC92AF82A809118 +:1061E000702C8B3009F07FC2E091652EF091662E05 +:1061F00046E0B80185E81995C818D908EA08FB08EF +:10620000C092562C33272F2D1E2D0D2D0093572C69 +:10621000A701662777274093582C8F2D9927AA2707 +:10622000BB278093592CEC2DE095E0935A2CE02F5E +:10623000E095E0935B2CE42FE095E0935C2CE82F55 +:10624000E095E0935D2CC0925E2C00935F2C409310 +:10625000602C8093612C88E08093702C84C19034F2 +:1062600009F081C182E08093702C8AE0EBCE833903 +:1062700009F084CC8091632E873009F0A0C043E000 +:1062800050E060E070E0CE0102960E94AE0E88E819 +:106290008983F8019181903219F0903761F024C020 +:1062A000F80180833A8131832B8122839C819383FF +:1062B0002327822728C1F8018281883809F053C139 +:1062C00093818A8198134FC194818B8198134BC11C +:1062D00095818C81981347C184E0808361E070E0F0 +:1062E000C80175D285E09EC0E92EE2942FE0E2223B +:1062F0002EEF2E0D9F70F92E88E090E08F199109F6 +:106300004FEF50E06A0102C0D594C7948A95E2F736 +:10631000253021F0243059F5FF20E9F044E050E029 +:10632000B8016E5F7F4FCE0101962B8B0E941056F5 +:106330002B89892B61F49A818B81892798E8892799 +:106340009C818927F801968189278C2181F124304D +:1063500071F4F11008C144E050E0B8016E5F7F4F66 +:10636000CE0101960E941056892B09F1FCC0243001 +:1063700008F0F9C0E22EF12CA701B8016E5F7F4F43 +:10638000CE0101960E941056892B09F0ECC0D8016D +:10639000AE0DBF1DE1E0F0E0EC0FFD1FEE0DFF1DA7 +:1063A00012969C9180818927C82209F0DCC098E868 +:1063B000F80190833A8131832B812283A0C044E08D +:1063C00050E060E070E007C0853909F0D7CB44E0C9 +:1063D00050E063E070E0CE0101960E94AE0E909115 +:1063E0004E2CF8018181803209F482C08037F1F4AB +:1063F000F801228189812813B6C023818A8128135C +:10640000B2C024818B812813AEC025818C812813D2 +:10641000AAC0908361E070E0C801D9D18FEF80936A +:10642000512C86E08093702C88E19EC0E82EE29487 +:106430009FE0E9222EEF2E0D8F70F82E88E090E07D +:106440008F1991094FEF50E06A0102C0D594C794AB +:106450008A95E2F7253021F0243059F5FF20E9F044 +:1064600044E050E0B8016E5F7F4FCE0101962B8B68 +:106470000E9410562B89892B61F49A818981892782 +:106480009B8189279C818927F801968189278C2106 +:1064900079F1243071F4F11066C044E050E0B801A5 +:1064A0006E5F7F4FCE0101960E941056892B01F13D +:1064B0005AC0243008F057C0E22EF12CA701B801D1 +:1064C0006E5F7F4FCE0101960E941056892B09F016 +:1064D0004AC0D801AE0DBF1DE1E0F0E0EC0FFD1F9A +:1064E000EE0DFF1D12969C9180818927C822D9F557 +:1064F0002981F80120833A8131839B8192838C81A9 +:106500008383232792278927848388E22DC0823CB6 +:1065100009F0CBC0F8019181903E09F0C8C092818A +:10652000943B09F0C4C046E050E06AEA74E0CE0152 +:1065300001960E94AE0E89818B3409F02DCB8A81A1 +:10654000893709F029CB8B818B3109F025CB8C81E0 +:106550008A3E09F021CB8D818B3709F01DCB8E81CE +:106560008C3C09F019CB80E090E0DCC0F801808120 +:10657000803621F08AE3C82ED12C03C0B0E3CB2EA5 +:10658000D12CF801818187FF0CC0807FF0E18F9FC3 +:106590007001112480ECC80ED11CA6EFAA2EB12CDC +:1065A00008C08C7F90E1899F70011124F6E3AF2E23 +:1065B000B12CE091652EF091662E42E0B80180E9A1 +:1065C0001995F801808181708093662CC701E4E001 +:1065D00096958795EA95E1F78093672CB7016A0D48 +:1065E0007B1D44E050E082E59CE20E94AE0E80916B +:1065F000672C8093512C68E0CE0101960E94EC0D2F +:106600008091632E44E050E0873019F463E070E03D +:1066100002C060E070E0CE010F960E94AE0EB7019E +:106620006C0D7D1D46E050E0CE0109960E94AE0E35 +:1066300089818093682C8A818093692C8B818093D7 +:106640006A2C8C8180936B2C60E488E69CE20E942B +:1066500034418091682C80936C2C8091692C8093BC +:106660006D2C80916A2C80936E2C80916B2C809382 +:106670006F2C60E28CE69CE20E94344187E08093BC +:10668000702C8981F80180838A8181838B81828348 +:106690008C818383AE014F5F5F4FBE01615F7F4F8F +:1066A000CE010996F0D080E25FCF803339F0982F89 +:1066B0009F7E903A19F0805C833078F481E080937B +:1066C000702C84E0F8018083E091652EF091662EB5 +:1066D00040E060E070E082EC83CBE091652EF091C9 +:1066E000662E40E0D6CC8A3069F4E091652EF091B8 +:1066F000662E46E0B80184E81995C80CD91CEA1C3E +:10670000FB1C7ECD8C3009F07BCDE091652EF091A5 +:10671000662E46E0B80187E8199572CD0E94073CC5 +:1067200096E0F6CC6396CDBFDEBFDF91CF911F918F +:106730000F91FF90EF90DF90CF90BF90AF909F9020 +:106740008F900895CF93DF932091632E273071F4BB +:10675000EC0143E050E060E070E00E94AE0E44E0E7 +:1067600050E063E070E0CE01039604C044E050E0E6 +:1067700060E070E0DF91CF910C94AE0ECF93DF9389 +:106780001F92CDB7DEB72091632E273029F447E062 +:1067900050E060E070E015C0FC01318120812327CA +:1067A0003281232733812327298344E050E060E0AE +:1067B00070E00E94FC0E41E050E064E070E0CE0129 +:1067C00001960E94FC0E0F90DF91CF91089520E476 +:1067D0002093D00026EC2093D5002093D40021E014 +:1067E0002093D000DC01680F791FA617B70741F08E +:1067F000ED91F0E0EC59FA4FE491E093D300F5CF3E +:10680000E091D500F0E0EC59FA4FE491EC93E0917F +:10681000D400F0E0EC59FA4FE4911196EC93109209 +:10682000D000089520E42093D00026EC2093D500DA +:106830002093D40021E02093D000DC01680F791F61 +:10684000A617B70741F0ED91F0E0EC59FA4FE4914B +:10685000E093D300F5CFE091D500F0E0EC59FA4F8A +:10686000E4918C918E130AC0E091D400F0E0EC59D1 +:10687000FA4FE49181E011969C919E1380E0109272 +:10688000D000817008958F929F92AF92BF92CF9265 +:10689000DF92EF92FF920F931F93CF93DF93DC0170 +:1068A0008C9110E0E0E0869517958695E7958695A2 +:1068B00017958695E795869517958695E79586951C +:1068C00017958695E79511968C9111978695179552 +:1068D0008695E795869517958695E79586951795FC +:1068E0008695E795869517958695E79512968C91EE +:1068F0001297F0E030E08695F79586953795869566 +:10690000F795869537958695F7958695379586956B +:10691000F7958695379513968C9113978695F795ED +:10692000869537958695F795869537958695F7954B +:10693000869537958695F7958695379514968C911B +:10694000149790E020E086959795869527958695F3 +:1069500097958695279586959795869527958695FB +:1069600097958695279515968C91869597958695FA +:1069700027958695979586952795869597958695DB +:10698000279586959795869527955B01DA014A01AB +:1069900044E0840E911C6C91E50179915E017627AB +:1069A000C32ED12CA60140545E4DEE2EF12CE701F2 +:1069B000C054DF4D7E01EA01D880E7010881ED2C4B +:1069C000E02AC22ED12CA60140545D4DEA01088177 +:1069D000E02AF12CA70140565F4DEA010881069597 +:1069E0008795DF2FD071FD2E012F017EF026092F14 +:1069F0000072F0260E2F0479F026032F0377F0267D +:106A0000022F0A73F0260F2D0295F0260F2D069502 +:106A10000695F0260F2D0727F6940F2506959795D6 +:106A2000F79517957695CF2ED12CA60140545E4D43 +:106A3000E12EF12CE701C054DF4D7E01EA01D88040 +:106A4000E7010881ED2CE02AC92ED12CA601405483 +:106A50005D4DEA010881E02AF12CA70140565F4D07 +:106A6000EA01088106958795D32FD071FD2E0E2F50 +:106A7000017EF026022F0072F026012F0479F02605 +:106A80000F2F0377F026092F0A73F0260F2D02959A +:106A9000F0260F2D06950695F0260F2D0727F69464 +:106AA0000F25069527953795E7957695C32ED12C1A +:106AB000A60140545E4DEE2EF12CE701C054DF4D8F +:106AC0007E01EA01D880E7010881ED2CE02AC22E80 +:106AD000D12CA60140545D4DEA010881E02AF12C39 +:106AE000A70140565F4DEA01088106958795DF2F83 +:106AF000D071FD2E012F017EF026092F0072F026A5 +:106B00000E2F0479F026032F0377F026022F0A7345 +:106B10000F25F02EF2940F25F02EF694F6940F2503 +:106B2000F02EF72606950F25D12E102F1695979546 +:106B3000F795D79476950F2F10E0A80140545E4D3D +:106B40000D2D10E000541F4DEA01F880E801188176 +:106B50000F2D012BE92EF12CA70140545D4DEA01C8 +:106B60001881012B10E000561F4DE8011881169581 +:106B70008795032F00711E2F117E0127122F10728F +:106B800001271D2D147901271F2F13770127192F96 +:106B90001A730127102F12950127102F169516959D +:106BA0000127102F1727069510271695279537953B +:106BB000E7957695032F10E0A80140545E4D0E2F07 +:106BC00010E000541F4DEA01F880E80118810F2DF4 +:106BD000012BE22EF12CA70140545D4DEA011881F2 +:106BE000012B10E000561F4DE8011881169587957E +:106BF0000F2F00711D2D117E0127192F10720127F3 +:106C00001E2F14790127132F13770127122F1A73C0 +:106C10000127102F12950127102F16951695012781 +:106C2000102F172706950127102F16959795F79582 +:106C3000D79476950F2F10E0A80140545E4D0D2D8E +:106C400010E000541F4DEA01F880E80118810F2D73 +:106C5000012BE92EF12CA70140545D4DEA0118816A +:106C6000012B10E000561F4DE801188116958795FD +:106C7000032F00711E2F117E0127122F1072012782 +:106C80001D2D147901271F2F13770127192F1A7330 +:106C90000127102F12950127102F16951695012701 +:106CA000102F172706951027169527953795E795E6 +:106CB0007695032F10E0A80140545E4D0E2F10E092 +:106CC00000541F4DEA01F880E80118810F2D012BB7 +:106CD000E22EF12CA70140545D4DEA011881012BF1 +:106CE00010E000561F4DE8011881169587950F2F6B +:106CF00000711D2D117E1027092F007210270E2FF5 +:106D000004791027032F03771027022F0A73102707 +:106D1000012F02951027012F069506951027012FA8 +:106D20000727169501271D2D06959795F795179519 +:106D3000CF2ED12CA60140545E4DE12EF12CE7015F +:106D4000C054DF4D7E01EA01D880E7010881ED2CB7 +:106D5000E02AC92ED12CA60140545D4DEA010881DC +:106D6000E02AF12CA70140565F4DEA010881069503 +:106D70008795D32FD071FD2E0E2F017EF026022F86 +:106D80000072F026012F0479F0260F2F0377F026EA +:106D9000092F0A730F25F02EF2940F25F02EF6948A +:106DA000F6940F257695702706957027769527958A +:106DB0003795E79568276D93A815B90509F0EBCDD0 +:106DC0001093712CF093722C9093732CE093742C8D +:106DD0003093752C2093762CDF91CF911F910F91DA +:106DE000FF90EF90DF90CF90BF90AF909F908F90EB +:106DF00008954F925F926F927F929F92AF92BF924F +:106E0000CF92DF92EF92FF920F931F93CF93DF9376 +:106E1000DC018C9110E0B12CEB2D8695E7958695E1 +:106E200017958695E795869517958695E7958695A6 +:106E300017958695E7958695179511968C911197DC +:106E4000BE2E8695B794869517958695B7948695A8 +:106E500017958695B794869517958695B7948695D8 +:106E6000179512969C91129730E080E09695879541 +:106E70009695379596958795969537959695879596 +:106E800096953795969587959695379513969C91F7 +:106E90001397969587959695379596958795969598 +:106EA0003795969587959695379596958795969566 +:106EB00037951496EC91149790E000E0E6950795CD +:106EC000E6959795E6950795E6959795E695079546 +:106ED000E6959795E6950795E69597951596DC9036 +:106EE000D6940795D6949795D6940795D69497956A +:106EF000D6940795D6949795D6940795D69497955A +:106F0000E32FF0E0E054FE4DA12FB0E0A054BF4DC0 +:106F1000F081EC91EF2BA92FB0E0A054BD4DFC9176 +:106F2000EF2BF0E0E056FF4DE0802B01BA016C5FE3 +:106F30007F4FDA013B01AC90E201C9902E01CA24D7 +:106F4000FD2DE694F795D82FD071FD2EEB2DE17E27 +:106F5000FE26E02FE072FE26E12FE479FE26E32FE5 +:106F6000E377FE26E92FEA73EF25FE2EF294EF2554 +:106F7000FE2EF694F694EF25FE2EFC24E695FE26D2 +:106F8000EB2D20FDFE24F69407958795E795BC2C04 +:106F9000B694C82ED12CA60140545E4DEE2EF12C95 +:106FA000E701C054DF4D7E01EA01D880E701F88097 +:106FB000ED2CEF28C02ED12CA60140545D4DEA01E6 +:106FC000F880EF28F12CA70140565F4DEA01D880E8 +:106FD000D694F795D32FD071ED2E412F417EE42624 +:106FE000592F5072E526CE2FC479EC26D82FD377AF +:106FF000ED26402F4A73E426FE2CF294EF24FE2C5B +:10700000F694F694EF24FE2CFB24E694FE2420FD57 +:10701000FD24F694979537951795B694C32ED12CE9 +:10702000E601C054DE4DE12EF12CA70140545F4D26 +:10703000D880EA01F880ED2CEF28C92ED12CA601CA +:1070400040545D4DEA01F880EF28F12CA70140562D +:107050005F4DEA01D880D694F795D82FD071ED2EE8 +:107060004E2F417EE426502F5072E526C12FC47961 +:10707000EC26D32FD377ED26492F4A73E426FE2C36 +:10708000F294EF24FE2CF694F694EF24FE2CFB24CD +:10709000E694FE2420FDFD24F69407958795E79558 +:1070A000B694C82ED12CE601C054DE4DEE2EF12C44 +:1070B000A70140545F4DD880EA01F880ED2CEF28FD +:1070C000C02ED12CA60140545D4DEA01F880EF2876 +:1070D000F12CA70140565F4DEA01D880D694F79570 +:1070E000D32FD071ED2E412F417EE426592F5072BF +:1070F000E526CE2FC479EC26D82FD377ED26402F66 +:107100004A73E426FE2CF294EF24FE2CF694F694B7 +:10711000EF24FE2CFB24E694FE2420FDFD24F694AF +:10712000979537951795B694C32ED12CE601C05488 +:10713000DE4DE12EF12CA70140545F4DD880EA01CD +:10714000F880ED2CEF28C92ED12CA60140545D4DBE +:10715000EA01F880EF28F12CA70140565F4DEA01C3 +:10716000D880D694F795D82FD071ED2E4E2F417E32 +:10717000E426502F5072E526C12FC479EC26D32F78 +:10718000D377ED26492F4A73E426FE2CF294EF24A0 +:10719000FE2CF694F694EF24FE2CFB24E694FE24B9 +:1071A00020FDFD24F69407958795E795B694C82EA3 +:1071B000D12CE601C054DE4DEE2EF12CA701405437 +:1071C0005F4DD880EA01F880ED2CEF28C02ED12C3D +:1071D000A60140545D4DEA01F880EF28F12CA7018B +:1071E00040565F4DEA01D880D694F795D32FD071E1 +:1071F000ED2E412F417EE426592F5072E526CE2FE9 +:10720000C479EC26D82FD377ED26402F4A73E42695 +:10721000FE2CF294EF24FE2CF694F694EF24FE2C30 +:10722000FB24E694FE2420FDFD24F69497953795E3 +:1072300017959B2C9694C32ED12CE601C054DE4D9D +:10724000E12EF12CA70140545F4DD880EA01F8806F +:10725000ED2CEF28C92ED12CA60140545D4DEA013A +:10726000F880EF28F12CA70140565F4DEA01D88045 +:10727000D694F795D82FD0714E2F417EF42EFD264F +:10728000502F5072F526C12FC479FC26D32FD37707 +:10729000FD26492F4A73F426EF2CE294FE24EF2CAE +:1072A000E694E694FE24EF2CE924F694FE24BE2E08 +:1072B000EF2D20FDED25E69507958795B794C82E0F +:1072C000D12CE601C054DE4DEB2CF12CA70140542B +:1072D0005F4DD880EA01E881ED2CEE2AC02ED12C3A +:1072E000A60140545D4DEA01E881EE2AF12CA70188 +:1072F00040565F4DEA01F880DF2EF694D794F32FC5 +:10730000F071E12FE17EEF27F92FF072EF27FB2DCF +:10731000F479EF27F82FF377EF27F02FFA73EF27A1 +:10732000FE2FF295EF27FE2FF695F695EF27969410 +:107330009E26E6959E2620FD9F2496949795379548 +:107340001795E32FF0E0AF0140545E4DE12FF0E0E0 +:10735000E054FF4DEA01F880E081EF29E92EF12C9D +:10736000A70140545D4DEA01F881EF2BF0E0E056B3 +:10737000FF4DE080EA2DF0E0EC59FB4FE491EE2563 +:10738000E301E9933E01AD24AD92A617B70709F0DA +:10739000D2CDB092712C8093722C0093732C1093E9 +:1073A000742C3093752C9093762CDF91CF911F9194 +:1073B0000F91FF90EF90DF90CF90BF90AF909F9094 +:1073C0007F906F905F904F900895AF92BF92CF9251 +:1073D000DF92EF92FF920F931F93CF93DF93609111 +:1073E000712C5091722C2091732C4091742C3091FF +:1073F000752CD091762CFC015C0104E0A00EB11C30 +:107400008191C52FC071962F917EC927922F9072BE +:10741000C927942F9479C927932F9377C9279D2F34 +:107420009A73C9277C2F7295C7277C2F76957695FE +:10743000C727A32FB0E08D0100541E4D6801A42F73 +:10744000B0E08D0100541F4D7801D6010C91D70199 +:107450009C91092BED2EF12CD701A054BD4D9C9190 +:10746000092B10E000561F4DD8017C9178277C270E +:10747000C6957C2786957695279557956795C32F52 +:10748000C071942F917EC9279D2F9072C927962F86 +:107490009479C927952F9377C927922F9A73C92773 +:1074A0007C2F7295C7277C2F76957695C727052F59 +:1074B00010E0D801A054BE4D6D01062F10E0D80198 +:1074C000A054BF4D7D01D6010C91D7019C91092B91 +:1074D000E22EF12CD701A054BD4D9C91092B10E058 +:1074E00000561F4DD8017C9178277C27C6957C27B4 +:1074F00086959D2F7695979537954795C52FC071A1 +:10750000762F717EC727722F7072C727742F7479F8 +:10751000C727732F7377C727792F7A73C7277C2FD5 +:107520007295C7277C2F76957695C727032F10E095 +:10753000D801A054BE4D6D01042F10E0D801A05415 +:10754000BF4D7D01D6010C91D7017C91072BE92E0F +:10755000F12CD701A054BD4D7C91072B10E00056B3 +:107560001F4DD8017C9178277C27C6957C2786956E +:107570007695279557956795C32FC071742F717EA7 +:10758000C727792F7072C727762F7479C727752F71 +:107590007377C727722F7A73C7277C2F7295C727F7 +:1075A0007C2F76957695C727052F10E0D801A0543B +:1075B000BE4D6D01062F10E0D801A054BF4D7D01D6 +:1075C000D6010C91D7017C91072BE22EF12CD7012B +:1075D000A054BD4D7C91072B10E000561F4DD801E3 +:1075E0007C9178277C27C6957C27869576959795FC +:1075F00037954795C52FC071762F717EC727722F9B +:107600007072C727742F7479C727732F7377C727B2 +:10761000792F7A73C7277C2F7295C7277C2F769591 +:107620007695C727032F10E0D801A054BE4D6D01F9 +:10763000042F10E0D801A054BF4D7D01D6010C915C +:10764000D7017C91072BE92EF12CD701A054BD4D19 +:107650007C91072B10E000561F4DD8017C917827B4 +:107660007C27C6957C2786957695279557956795AF +:10767000C32FC071742F717EC727792F7072C727EF +:10768000762F7479C727752F7377C727722F7A7370 +:10769000C7277C2F7295C7277C2F76957695C727AD +:1076A000052F10E0D801A054BE4D6D01062F10E04B +:1076B000D801A054BF4D7D01D6010C91D7017C911A +:1076C000072BE22EF12CD701A054BD4D7C91072B46 +:1076D00010E000561F4DD8017C9178277C27C69575 +:1076E0007C2786957695979537954795C52FC071D8 +:1076F000762F717EC727722F7072C727742F747907 +:10770000C727732F7377C727792F7A73C7277C2FE3 +:107710007295C7277C2F76957695C727032F10E0A3 +:10772000D801A054BE4D6D01042F10E0D801A05423 +:10773000BF4D7D01D6010C91D7017C91072BE92E1D +:10774000F12CD701A054BD4D7C91072B10E00056C1 +:107750001F4DD8017C9178277C27C6957C2776958C +:10776000279557956795C32FC071742F717E7C271D +:10777000C92FC0727C27C62FC4797C27C52FC37739 +:107780007C27C22FCA737C27C72FC2957C27C72F9F +:10779000C695C6957C278695C52FD0E0C054DE4D92 +:1077A000062F10E000541F4DD881D801CC91CD2B6D +:1077B000022F10E000541D4DD801DC91CD2BD0E0FC +:1077C000C056DF4DC8818C27872776958727D92F0C +:1077D0008695D79537954795EA15FB0509F010CEA4 +:1077E0006093712C5093722C2093732C4093742CC3 +:1077F0003093752CD093762CDF91CF911F910F9100 +:10780000FF90EF90DF90CF90BF90AF900895CF930F +:10781000DF93E1E7FCE2A081718162813381248101 +:107820009581472F40718A2F817E8427462F407291 +:107830008427432F44798427422F43778427492F75 +:107840004A738427482F42958427482F46954695AA +:107850008427482F46958427869567957795A79521 +:10786000C22FD0E0C054DE4D432F50E040545F4D56 +:10787000B881EA018881B82B492F50E040545D4D12 +:10788000EA018881CB2FC82BD0E0C05ADF4D888118 +:107890008695522F5071432F417E4527592F5072A4 +:1078A00045275A2F54794527572F53774527562F69 +:1078B0005A734527542F52954527542F5695569560 +:1078C0004527542F569545274695979527953795E3 +:1078D000C72FD0E0C054DE4D4A2F50E040545F4DDA +:1078E000B881EA014881B42B462F50E040545D4DE9 +:1078F000EA014881CB2FC42BD0E0C05ADF4D48812C +:10790000842B8695572F50714A2F417E4527562F3D +:1079100050724527532F54794527522F53774527C7 +:10792000592F5A734527542F52954527542F569552 +:1079300056954527542F5695452746956795779533 +:10794000A795C22FD0E0C054DE4D432F50E04054E5 +:107950005F4DB881EA014881B42B492F50E0405473 +:107960005D4DEA014881CB2FC42BD0E0C05ADF4DDA +:107970004881842B8695C72FD0E0C054DE4D4A2F16 +:1079800050E040545F4DB881EA014881B42B462F46 +:1079900050E040545D4DEA014881CB2FC42BD0E02C +:1079A000C05ADF4D4881842B522F5071432F417EA6 +:1079B0004527592F507245275A2F54794527572F5D +:1079C00053774527562F5A734527542F52954527ED +:1079D000542F569556954527542F5695452746952D +:1079E000979527953795A08371836283338324838A +:1079F0009583DF91CF9108950F931F93CF93DF93DA +:107A0000A091712C7091722C2091732C5091742C38 +:107A10004091752C3091762CFC01615008F4CDC159 +:107A2000972F90718A2F817E8927922F90728927B4 +:107A3000952F94798927942F93778927932F9A7379 +:107A40008927982F92958927982F9695969589271B +:107A5000982F96958927869527957795A795C42F72 +:107A6000D0E0C054DE4D852F90E080549F4DB8810A +:107A7000EC018881B82B832F90E080549D4DEC0160 +:107A80008881CB2FC82BD0E0C058DF4DB881B69588 +:107A9000942F9071852F817E8927932F907289274B +:107AA0009A2F94798927972F93778927922F9A7302 +:107AB0008927982F92958927982F969596958927AB +:107AC000982F969589278695379547955795C72F6F +:107AD000D0E0C054DE4D8A2F90E080549F4D188135 +:107AE000EC018881182B822F90E080549D4DEC0191 +:107AF0008881C12FC82BD0E0C058DF4D8881B82BBA +:107B0000B695972F90718A2F817E8927922F907238 +:107B10008927952F94798927942F93778927932FF5 +:107B20009A738927982F92958927982F96959695DD +:107B30008927982F96958927869527957795A795D4 +:107B4000C42FD0E0C054DE4D852F90E080549F4D6F +:107B50001881EC018881182B832F90E080549D4D73 +:107B6000EC018881C12FC82BD0E0C058DF4D88813F +:107B7000B82BB695942F9071852F817E8927932FEE +:107B8000907289279A2F94798927972F937789273D +:107B9000922F9A738927982F92958927982F9695D7 +:107BA00096958927982F9695892786953795479595 +:107BB0005795C72FD0E0C054DE4D8A2F90E08054F7 +:107BC0009F4D1881EC018881182B822F90E0805402 +:107BD0009D4DEC018881C12FC82BD0E0C058DF4DEE +:107BE0008881B82BB695972F90718A2F817E89272F +:107BF000922F90728927952F94798927942F9377C4 +:107C00008927932F9A738927982F92958927982FE0 +:107C1000969596958927982F9695892786952795E5 +:107C20007795A795C42FD0E0C054DE4D852F90E006 +:107C300080549F4D1881EC018881182B832F90E090 +:107C400080549D4DEC018881C12FC82BD0E0C058D5 +:107C5000DF4D8881B82BB695942F9071852F817E4A +:107C60009827832F807298278A2F84799827872FC7 +:107C700083779827822F8A739827892F8295982750 +:107C8000892F869586959827892F86959827832F03 +:107C90009695879547955795C72FD0E0C054DE4DF0 +:107CA0000A2F10E000541F4D3881E8019881392BCC +:107CB000022F10E000541D4DE8019881C32FC92BFD +:107CC000D0E0C058DF4D3881B32BB695372F3071D7 +:107CD0009A2F917E9327322F30729327352F347944 +:107CE0009327342F33779327382F3A739327392FDD +:107CF00032959327392F369536959327392F369518 +:107D00009327969527957795A795C42FD0E0C054D3 +:107D1000DE4D052F10E000541F4D3881E801988199 +:107D2000392B082F10E000541D4DE8019881C32F16 +:107D3000C92BD0E0C058DF4D98813B2F392B3695A9 +:107D4000C72FD0E0C054DE4D0A2F10E000541F4D65 +:107D5000B881E8019881B92B022F10E000541D4D25 +:107D6000E8019881CB2FC92BD0E0C058DF4DB881F6 +:107D7000B32B342F3071952F917E9327382F30728B +:107D800093273A2F34799327372F33779327322F3E +:107D90003A739327392F32959327392F3695369595 +:107DA0009327392F36959327382F969537954795F2 +:107DB000579580818B27819330CEA093712C70933F +:107DC000722C2093732C5093742C4093752C309309 +:107DD000762CDF91CF911F910F910895CF92DF9272 +:107DE000EF92FF921F93CF93DF931091712CD0915C +:107DF000722CC091732C7091742C4091752C209131 +:107E0000762CE42FF0E0E054FE4DA72FB0E0A05414 +:107E1000BF4DE0813C91E32BA22FB0E0A054BD4DBB +:107E20003C91E32BF0E0E056FF4D3081DC0180E037 +:107E3000615008F405C2582F369557959D2F9071C3 +:107E4000812F817E89279C2F90728927972F947983 +:107E50008927942F93778927322F3A738327982F76 +:107E600092958927982F969596958927982F96957C +:107E700089279C2F86959795D79517955695342FDA +:107E80003071872F817E8327322F30728327312FE5 +:107E9000347983273D2F33778327392F3A7383270C +:107EA000382F32958327382F369536958327382FEC +:107EB000369583278695279547957795CD2ED12C96 +:107EC000F601E054FE4D6F01E12EF12CF701E05474 +:107ED000FF4D7F01F6013081F7018081832BE92E70 +:107EE000F12CF701E054FD4D3081E82FE32BF0E059 +:107EF000E058FF4D8081582B56953D2F3071812FD2 +:107F0000817E8327392F30728327372F3479832757 +:107F1000342F33778327322F3A738327382F3295C4 +:107F20008327382F369536958327382F3695832724 +:107F300086959795D7951795C42ED12CF601E054C8 +:107F4000FE4D6F01E72EF12CF701E054FF4D7F014C +:107F5000F6013081F7018081832BE22EF12CF701AD +:107F6000E054FD4D3081E82FE32BF0E0E058FF4D69 +:107F7000C0815C2B5695342F3071872F817E8327EB +:107F8000322F30728327312F347983273D2F337777 +:107F90008327392F3A738327382F32958327382F39 +:107FA000369536958327382F3695832786952795DE +:107FB00047957795CD2ED12CF601E054FE4D6F01FB +:107FC000E12EF12CF701E054FF4D7F01F6013081E5 +:107FD000F7018081832BE92EF12CF701E054FD4D50 +:107FE0003081E82FE32BF0E0E058FF4DC081C52B36 +:107FF000C6953D2F3071812F817E8327392F3072B6 +:108000008327372F34798327342F33778327322FF1 +:108010003A738327382F32958327382F3695369534 +:108020008327382F3695832786959795D79517956B +:10803000C42ED12CF601E054FE4D6F01E72EF12C39 +:10804000F701E054FF4D7F01F6013081F701808197 +:10805000382BE22EF12CF701E054FD4D8081E32F07 +:10806000E82BF0E0E058FF4D8081C82BC695342FF7 +:108070003071872F817E8327322F30728327312FF3 +:10808000347983273D2F33778327392F3A7383271A +:10809000382F32958327382F369536958327382FFA +:1080A00036958327542F8695279557957795CD2E0E +:1080B000D12CF601E054FE4D6F01E12EF12CF701B9 +:1080C000E054FF4D7F01F6013081F7018081832B61 +:1080D000E92EF12CF701E054FD4D3081E82FE32B20 +:1080E000F0E0E058FF4D80818C2B482F46953D2FC6 +:1080F0003071812F817E3827892F80723827872F12 +:1081000084793827852F83773827822F8A733827F9 +:10811000832F82953827832F869586953827832F3E +:1081200086953827C92F3695C795D7951795E52F8A +:10813000F0E0E054FE4D872F90E080549F4D308159 +:10814000FC018081382B822F90E080549D4DFC01F2 +:108150009081E32FE92BF0E0E058FF4D9081842FD0 +:10816000892B382F3695ED2FF0E0CF0180549E4DAE +:108170006C01E12FF0E0CF0180549F4DF60140816A +:10818000FC019081492BEC2EF12CC70180549D4DB0 +:10819000FC019081E42FE92BF0E0E058FF4D908145 +:1081A000832F892B352F3071972F917E3927922F6E +:1081B00090723927912F947939279D2F93773927FA +:1081C0004C2F4A733427932F92953927932F9695E6 +:1081D00096953927932F96953927452F36952795CC +:1081E00047957795C42ED12CF601E054FE4D6F01D2 +:1081F000E72EF12CF701E054FF4D7F01F6013081AD +:10820000F7019081392BE22EF12CF701E054FD4D5E +:108210009081E32FE92BF0E0E056FF4D30819C91F7 +:10822000E92FF0E0EC59FB4FE4917D01F0E8EF0E0F +:10823000F11C5E2F5327F701508398279D93F8CDAB +:108240001093712CD093722CC093732C7093742C58 +:108250004093752C2093762CDF91CF911F91FF9046 +:10826000EF90DF90CF9008950F931F93FC01862F1E +:1082700090812181428150E060E070E0BA01552791 +:108280004427522B492B9381792B8B0122273327AB +:10829000803208F471C0D80123E0B695A7952A95DD +:1082A000E1F70A271B2798013695279536952795DC +:1082B000BBE07695679557954795BA95D1F7022714 +:1082C000132720E030E095E1000F111F221F331F1C +:1082D0009A95D1F7402B512B622B732B8B012227C0 +:1082E0003327D80133E0B695A7953A95E1F70A27E9 +:1082F0001B2798013695279536952795BBE07695EF +:10830000679557954795BA95D1F70227132720E02F +:1083100030E095E1000F111F221F331F9A95D1F70E +:10832000402B512B622B732B8B0122273327D80133 +:1083300033E0B695A7953A95E1F70A271B279801F0 +:108340003695279536952795BAE076956795579592 +:108350004795BA95D1F70227132720E030E096E140 +:10836000000F111F221F331F9A95D1F7402B512B5D +:10837000622B732B805289CF408351830283738396 +:108380001F910F910895AF92BF92CF92DF92EF921B +:10839000FF920F931F93CF93DF936730710509F41A +:1083A00051C09B0127703327232B09F04EC0EB01EE +:1083B0006C015B0183E0B694A7948A95E1F77B0199 +:1083C00096E0F694E7949A95E1F7EA0CFB1CEC0C26 +:1083D000FD1C8501015011090C0D1D1DA701401B3D +:1083E000510B60E070E0C80101960E9437560C15F1 +:1083F0001D0520F1D801EC91F0E0EC59FB4F4491C0 +:108400009701D7010A171B0768F48C91982F990FD1 +:10841000F90182919F01881F8827881F892B8C93DF +:108420001197F0CF11968C9111978E7FE42FE17008 +:10843000E82B1196EC9301501109D9CFC5018C0F8F +:108440009D1F04C087E090E001C0CB01DF91CF9178 +:108450001F910F91FF90EF90DF90CF90BF90AF9062 +:108460000895EF92FF920F931F93CF93DF93EC0148 +:10847000CB0167307105D1F169E070E00E9467556A +:10848000DE0120E030E088E090E02617370739F180 +:10849000F90143E0F695E7954A95E1F7E20FF31FFE +:1084A000EC0FFD1F408150E0890107701127002E5D +:1084B00002C0559547950A94E2F74C9301151105B2 +:1084C00051F0E1817C01E01AF10A01C0EE0FEA945B +:1084D000EAF74E2B4C932F5F3F4F1196D6CFC90131 +:1084E00023E0880F991F2A95E1F702C087E090E00A +:1084F000DF91CF911F910F91FF90EF900895CF934F +:10850000DF93FC016115710511F1808186958083EF +:108510009B01295F3F4F83E0369527958A95E1F7C8 +:10852000DF0141E050E04217530770F4C1919081A0 +:10853000D0E89D9FC00111248C2B8D93808186955E +:1085400080834F5F5F4FEFCFCB01019702C080E088 +:1085500090E0DF91CF910895EF92FF920F931F93D8 +:10856000CF93DF93EC01CB016730710509F442C072 +:1085700069E070E00E94675520E030E088E090E01C +:1085800026173707B9F1D90143E0B695A7954A9563 +:10859000E1F7A20FB31FA90147705527AC0FBD1F0C +:1085A000EC91F0E0042E02C0F595E7950A94E2F70D +:1085B0004115510559F011960C9111977C01E41A5F +:1085C000F50A01C0000FEA94EAF7E02BF0E0EC595D +:1085D000FB4FE4911196AC91B0E08D0102C015956E +:1085E00007954A95E2F7A8014E2740FD05C02F5F89 +:1085F0003F4FC6CF81E001C080E0DF91CF911F9156 +:108600000F91FF90EF9008951092492D08951092C8 +:10861000492D1092772C10924A2D0895F8DF0E9470 +:108620000D2A1092492D089508950895DC0123E63E +:1086300033E66150E8F04D91942F922780E1989FA6 +:10864000A00111244927E42FF0E042954F70232F19 +:108650003327C9018427AC013E2F22272427352741 +:1086600043E0EE0FFF1F4A95E1F72E273F27E1CFAA +:10867000C90108952F923F924F925F926F927F921D +:108680008F929F92AF92BF92CF92DF92EF92FF9222 +:108690000F931F93CF93DF93CDB7DEB7C154D24072 +:1086A000CDBFDEBF8C016B018091772C833009F444 +:1086B00045C138F4813079F0823009F4B7C00C94A8 +:1086C000EE4D853009F4EAC408F4B0C2863009F4EE +:1086D00008C70C94EE4DE0904B2EF0904C2EE11418 +:1086E000F104C1F0A701495F5F4F23E0569547951C +:1086F0002A95E1F76BE47DE2C8010E941D56609166 +:108700004B2E70914C2EC8013EDE10924B2E1092D3 +:108710004C2EC2C46115710509F4ABC0C801EFDE6F +:108720005C01BC01C80118DFD82EB501C80199DE73 +:108730005C019C01295F3F4FA901440F551F93E045 +:10874000569547959A95E1F74A5F5F4F4138510535 +:1087500038F060EC73E2CE0101960E94495692C057 +:10876000A3E036952795AA95E1F7A80160E870E0A7 +:10877000CE0101960E94050E8C01CF5FDD4FB882BD +:10878000C150D240CE5FDD4FA882C250D2408FECA4 +:1087900093E29F938F93B0E8AB2EB12CC501801B61 +:1087A000910B9F938F9381E090E08C0F9D1F800F22 +:1087B000911F9F938F930E945056080F191FB50168 +:1087C000601B710B22E030E0AE014F5F5D4F81E036 +:1087D00090E08C0F9D1F800F911F0E94050E800F4F +:1087E000911F0F900F900F900F900F900F90A50179 +:1087F000481B590B21E030E02C0F3D1F280F391F7B +:10880000D11003C082ED93E202C081EE93E29F9308 +:108810008F935F934F933F932F930E9450560F90E7 +:108820000F900F900F900F900F902CC0E0904B2E58 +:10883000F0904C2EE114F104C9F0A701495F5F4F9D +:10884000F3E056954795FA95E1F76BE47DE2C801B0 +:108850000E941D5690914B2E80914C2E10924B2EC3 +:1088600010924C2EE92EF82E0C94F04D61157105E6 +:1088700099F488E0EDE0F4E2DE01119601900D92AA +:108880008A95E1F71092772CBE016F5F7F4F85E6E6 +:108890000E94E3210C94F04D9B01295F3F4F73E050 +:1088A000369527957A95E1F7A80160E870E0CE014A +:1088B00001960E94050E8C01CF5FDD4FD882C1501A +:1088C000D240CE5FDD4FC882C250D2408FEC93E2DF +:1088D0009F938F93E0E8CE2ED12CC601801B910B85 +:1088E0009F938F9381E090E08C0F9D1F800F911FCD +:1088F0009F938F930E945056800F911FB601681B63 +:10890000790B22E030E0AE014F5F5D4FA1E0B0E0B7 +:10891000AC0FBD1F8A0F9B1F0E94050E1092772C73 +:10892000BE016F5F7F4F85E60E94E3210F900F909D +:108930000F900F900F900F900C94F04D80914A2D56 +:10894000B090492D882331F0B1E0BB1508F455C132 +:1089500010924A2DE5E0EB15B8F0F3E0BF1608F0F1 +:1089600040C021E02B15C8F081E090E080932020EA +:108970009093212082E5D8018C9382E08093492D49 +:1089800067E0E62EF12C3BC138E03B1508F0A8C0AB +:108990008AE0B81609F4F5C030C1B3E1CB16D104B2 +:1089A00008F4B9C0B601C801AADD7C01BC01C80148 +:1089B000D3DD882319F1B701C80153DDF8018181A6 +:1089C00090E0982F88272081822B80933B2D9093D5 +:1089D0003C2D83E9808380E2818383E08093492D6D +:1089E000BCC0B601C8018BDD7C01BC01C801B4DD8F +:1089F000882321F0F8E0EF16F10488F41092492D55 +:108A0000C701089667E070E00E946755462FE09125 +:108A1000652EF091662EB80181EC1995B8C0B701AA +:108A2000C8011FDDD8012C9111968C9111978227D6 +:108A300012969C911297892713969C9113978927D8 +:108A400014969C911497891366C08B2D90E0039720 +:108A5000283881F49C01220F331F820F931FFC01E1 +:108A6000E25CF24D11962D913D914C912083318322 +:108A7000428312C0FC01EE0FFF1F8E0F9F1F9C014F +:108A8000225C324DF80180819181A281B381F9018C +:108A900080839183A283B38345E050E0B801C8018D +:108AA00002960E942656F3E0BF1629F024E0B21683 +:108AB00021F087E903C083E901C085E9D8018C93DF +:108AC00080E711968C9367E0C801B0DDF8018783D9 +:108AD000908783E08B0D8093492D68E470E089C016 +:108AE000F9E0CF16D104B8F0B601C80108DD7C0169 +:108AF000BC01C80131DD811111C0C701089667E0D2 +:108B000070E00E946755462FE091652EF091662E29 +:108B1000B80181EC19951092492D39C0B701C801EF +:108B2000A0DC63E0C80182DD7C01892BA1F7D801BC +:108B30008C9182FF15C0B8E0BB1691F0E6E0BE163E +:108B400011F087E901C085E9D8018C9380E2119684 +:108B50008C93BA94BA94B092492D60E170E049C008 +:108B600081E080934A2D8B2D90E00697B82EBB0CA8 +:108B70008B0D8C5F8093482DF801808180933D2D73 +:108B80003EC0C114D10431F481E08093492D0E948C +:108B9000072A33C0B601C801B2DC7C01BC01C801A0 +:108BA000DBDC81110FC0C701089667E070E00E940E +:108BB0006755462FE091652EF091662EB80181EC45 +:108BC000199508C0B701C8014CDC63E0C8012EDD6F +:108BD000892BD1F282ECD8018C9361E0C80126DDAB +:108BE000F80181839283B092492D10924A2D68E159 +:108BF00070E0C801C8DB7C0102C0E12CF12C80913F +:108C00004A2D882309F4ECC72091482D30E04EE32B +:108C10005DE264E170E0CE0101960E94050EBE01A6 +:108C20006F5F7F4F85E60E94E3218EC080912A2DE1 +:108C3000811108C080E890E00E94CE2281E08093FC +:108C40002A2D99C0813009F098C08091492D823039 +:108C500008F093C08091292D91E0980F9093292DD1 +:108C6000883009F08AC00E94D7228115944008F408 +:108C700072C010922A2D60E070E085E60E94E32128 +:108C8000A9EB4A2EACE25A2EB0E8CB2ED12C612CA7 +:108C9000712CE12CF12C00E010E0A12CB12C312C36 +:108CA0008AE0282E9E012F5F3F4F4901DF92CF922D +:108CB000ADEEB3E2BF93AF931F922F929F928F922C +:108CC0000E945056C4010E946518CDBFDEBFD2017C +:108CD0008C91882351F087E990E10E946A18311045 +:108CE00013C05301332433940FC083E990E10E94F1 +:108CF0006A18332049F0C3018A199B09081719071C +:108D000010F475018C01312CF20111922F01FFEF4B +:108D10006F1A7F0A28E0C20ED11C30E76316710477 +:108D200029F60115110571F0C701409616950795B2 +:108D3000800F911FF3E0880F991FFA95E1F70E94C9 +:108D4000CE2202C00E94E52210924A2D1092772C6A +:108D50000E947A2243C7E0911E20F0911F20E05824 +:108D6000F10973E0F695E7957A95E1F7E754F34D4D +:108D700010820E94D7221092292D80914A2DB09006 +:108D8000492D882331F081E08B1508F455C11092EC +:108D90004A2D95E09B15B8F0A3E0BA1608F040C044 +:108DA000B1E0BB15C8F081E090E080932020909363 +:108DB000212082E5D8018C9382E08093492D67E0E1 +:108DC000E62EF12C3BC1E8E0EB1508F0A8C0FAE074 +:108DD000BF1609F4F5C030C1B3E1CB16D10408F4D5 +:108DE000B9C0B601C8018BDB7C01BC01C801B4DB92 +:108DF000882319F1B701C80134DBF801818190E0C3 +:108E0000982F88272081822B80933B2D90933C2D97 +:108E100083E9808380E2818383E08093492DBCC015 +:108E2000B601C8016CDB7C01BC01C80195DB88235D +:108E300021F0F8E0EF16F10488F41092492DC701F3 +:108E4000089667E070E00E946755462FE091652E16 +:108E5000F091662EB80181EC1995B8C0B701C80130 +:108E600000DBD8012C9111968C91119782271296D4 +:108E70009C911297892713969C9113978927149692 +:108E80009C911497891366C08B2D90E00397283826 +:108E900081F49C01220F331F820F931FFC01E25CBF +:108EA000F24D11962D913D914C9120833183428357 +:108EB00012C0FC01EE0FFF1F8E0F9F1F9C01225C52 +:108EC000324DF80180819181A281B381F9018083C3 +:108ED0009183A283B38345E050E0B801C8010296B4 +:108EE0000E942656F3E0BF1629F024E0B21621F0C6 +:108EF00087E903C083E901C085E9D8018C9380E745 +:108F000011968C9367E0C80191DBF8018783908705 +:108F100083E08B0D8093492D68E470E089C0F9E00F +:108F2000CF16D104B8F0B601C801E9DA7C01BC0162 +:108F3000C80112DB811111C0C701089667E070E01B +:108F40000E946755462FE091652EF091662EB8017C +:108F500081EC19951092492D39C0B701C80181DA09 +:108F600063E0C80163DB7C01892BA1F7D8018C91F8 +:108F700082FF15C0B8E0BB1691F0E6E0BE1611F016 +:108F800087E901C085E9D8018C9380E211968C9322 +:108F9000BA94BA94B092492D60E170E049C081E082 +:108FA00080934A2D8B2D90E00697B82EBB0C8B0D2D +:108FB0008C5F8093482DF801808180933D2D3EC0C9 +:108FC000C114D10431F481E08093492D0E94072A15 +:108FD00033C0B601C80193DA7C01BC01C801BCDA18 +:108FE00081110FC0C701089667E070E00E946755C5 +:108FF000462FE091652EF091662EB80181EC19950F +:1090000008C0B701C8012DDA63E0C8010FDB892B66 +:10901000D1F282ECD8018C9361E0C80107DBF80142 +:1090200081839283B092492D10924A2D68E170E0BD +:10903000C801A9D97C0102C0E12CF12C80914A2DF4 +:10904000882309F4CDC5E0911E20F0911F20E0583F +:10905000F109A3E0F695E795AA95E1F7E754F34DFA +:10906000FF24F394F0820E94D7221092492D0E948F +:10907000072A80E5D8018C9311961C9262E0C80102 +:10908000D5DAF80182839383F092492D10924A2D0C +:1090900060E270E0C80177D97C01A2C580914A2DB9 +:1090A000B090492D882331F0F1E0FB1508F451C14F +:1090B00010924A2D25E02B15B8F033E0B31608F0D6 +:1090C00043C081E08B15C8F081E090E080932020C0 +:1090D0009093212082E5F801808382E08093492DDE +:1090E000E7E0EE2EF12C37C198E09B1508F0A4C004 +:1090F000AAE0BA1609F4F1C02CC1F3E1CF16D104ED +:1091000008F4B5C0B601C801FAD97C01BC01C80198 +:1091100023DA882331F1B701C801A3D9D801119608 +:109120008C91119790E0982F88272C91822B809317 +:109130003B2D90933C2D83E98C9380E211968C9388 +:1091400083E08093492DB5C0B601C801D8D97C0110 +:10915000BC01C80101DA882321F0B8E0EB16F10464 +:1091600088F41092492DC701089667E070E00E94CC +:109170006755462FE091652EF091662EB80181EC7F +:109180001995B1C0B701C8016CD9F801208181815E +:10919000822792818927938189279481891367C0C7 +:1091A0008B2D90E00397283889F49C01220F331F00 +:1091B000820F931FFC01E25CF24DD80111962D91B4 +:1091C0003D914C9120833183428312C0FC01EE0F0C +:1091D000FF1F8E0F9F1F9C01225C324DF801808182 +:1091E0009181A281B381F90180839183A283B383AA +:1091F00045E050E0B801C80102960E942656F3E00F +:10920000BF1629F024E0B21621F087E903C083E9F4 +:1092100001C085E9D8018C9380E711968C9367E0B3 +:10922000C80104DAF8018783908783E08B0D80936F +:10923000492D68E470E089C0F9E0CF16D104B8F098 +:10924000B601C8015CD97C01BC01C80185D9811176 +:1092500011C0C701089667E070E00E946755462F6D +:10926000E091652EF091662EB80181EC199510926F +:10927000492D39C0B701C801F4D863E0C801D6D977 +:109280007C01892BA1F7D8018C9182FF15C0B8E031 +:10929000BB1691F0E6E0BE1611F087E901C085E942 +:1092A000D8018C9380E211968C93BA94BA94B092C0 +:1092B000492D60E170E049C081E080934A2D8B2DFB +:1092C00090E00697B82EBB0C8B0D8C5F8093482DD9 +:1092D000F801808180933D2D3EC0C114D10431F44A +:1092E00081E08093492D0E94072A33C0B601C8014E +:1092F00006D97C01BC01C8012FD981110FC0C7015B +:10930000089667E070E00E946755462FE091652E51 +:10931000F091662EB80181EC199508C0B701C8011B +:10932000A0D863E0C80182D9892BD1F282ECD801A0 +:109330008C9361E0C8017AD9F80181839283B0925D +:10934000492D10924A2D68E170E0C8011CD87C01BB +:1093500002C0E12CF12C80914A2D882309F440C4ED +:10936000F090B82CFF20A9F1B601C801C8D85C0163 +:10937000009729F41092B82C10924A2D42C0823ADC +:10938000910540F0BC01C801E7D891E08927C82EBB +:10939000D12C03C0CC24C394D12CB501C80161D811 +:1093A000CD2829F462E1C80141D9892B29F0ACEF1D +:1093B000AF0DA093B82C2AC024E0F29ED001112456 +:1093C000A859B34D80E1F80101900D928A95E1F71B +:1093D0001DC042E050E060ED71E1CE0101960E94B7 +:1093E000EF55E3EDF1E1E49120913B2D30913C2DDF +:1093F00089819A812817390721F480913D2D8E1794 +:1094000029F01092492D0E94072AE8C32091B82C18 +:10941000203109F04DC010924A2D1092B82C1092B4 +:10942000772C20E130E048E75CE267E870E0CE01AD +:1094300001960E94050E6FEC73E2CE0181960E94A8 +:10944000495620E130E048E85CE265E670E0CE0194 +:1094500083960E94050E6FEC73E2CE018D5B9F4FE9 +:109460000E94495620E130E048E95CE263E470E0A4 +:10947000CE018B5B9F4F0E94050E6FEC73E2CE0115 +:109480008B599F4F0E94495620E130E048EA5CE248 +:1094900061E270E0CE0189599F4F0E94050E0E9443 +:1094A0007A22BE016F5F7F4F85E60E94E32196C35B +:1094B00080E3D8018C9311962C9362E0C801CF5BB6 +:1094C000DD4F2883C154D240B1D8F8018283938301 +:1094D000CF5BDD4F2881C154D2402C5F2093B82C44 +:1094E000D7CD80914A2DB090492D882331F0F1E0FD +:1094F000FB1508F462C110924A2D25E02B15B8F037 +:1095000033E0B31608F046C081E08B15C8F081E067 +:1095100090E0809320209093212082E5F8018083C1 +:1095200082E08093492D37E0E32EF12C48C198E08A +:109530009B1508F0ABC0AAE0BA1609F4FCC03DC107 +:10954000F3E1CF16D10408F4BEC0B601C8010E94F1 +:109550007F427C01BC01C8010E94AC42882349F1D2 +:10956000B701C8010E943142D80111968C91119720 +:1095700090E0982F88272C91822B80933B2D9093FD +:109580003C2D83E98C9380E211968C9383E0809349 +:10959000492DBDC0B601C8010E947F427C01BC01BB +:1095A000C8010E94AC42882321F0B8E0EB16F10418 +:1095B00088F41092492DC701089667E070E00E9478 +:1095C0006755462FE091652EF091662EB80181EC2B +:1095D0001995B7C0B701C8010E943142F801208136 +:1095E0008181822792818927938189279481891398 +:1095F0006AC08B2D90E00397283889F49C01220FD4 +:10960000331F820F931FFC01E25CF24DD8011196CB +:109610002D913D914C9120833183428312C0FC01F6 +:10962000EE0FFF1F8E0F9F1F9C01225C324DF80131 +:1096300080819181A281B381F90180839183A2838A +:10964000B38345E050E0B801C80102960E94265657 +:10965000F3E0BF1629F024E0B21621F087E903C039 +:1096600083E901C085E9D8018C9380E711968C933A +:1096700067E0C8010E941643F8018783908783E062 +:109680008B0D8093492D68E470E092C0F9E0CF160D +:10969000D104C8F0B601C8010E947F427C01BC0120 +:1096A000C8010E94AC42811111C0C701089667E051 +:1096B00070E00E946755462FE091652EF091662E6E +:1096C000B80181EC19951092492D3BC0B701C80132 +:1096D0000E94314263E0C8010E9416437C01892B3D +:1096E00091F7D8018C9182FF15C0B8E0BB1691F0BC +:1096F000E6E0BE1611F087E901C085E9D8018C9338 +:1097000080E211968C93BA94BA94B092492D60E19C +:1097100070E04EC081E080934A2D8B2D90E006973B +:10972000B82EBB0C8B0D8C5F8093482DF801808187 +:1097300080933D2D44C0C114D10431F481E0809365 +:10974000492D0E94072A39C0B601C8010E947F42F4 +:109750007C01BC01C8010E94AC4281110FC0C7014D +:10976000089667E070E00E946755462FE091652EED +:10977000F091662EB80181EC19950AC0B701C801B5 +:109780000E94314263E0C8010E941643892BB1F266 +:1097900082ECD8018C9361E0C8010E941643F80165 +:1097A00081839283B092492D10924A2D68E170E036 +:1097B000C8010E94C3417C0102C0E12CF12C8091C0 +:1097C0004A2D882309F40CC28091492D9AEF980FF5 +:1097D000933008F04FC0D801FC90F5FAFF24F0F860 +:1097E00010922B2DEBE9AE2EE0E1BE2EE12C47E6E8 +:1097F00050E0B501CE0101960E94EF558B81882380 +:1098000049F029813A8180913B2D90913C2D281778 +:109810003907B9F48D81882329F09C8180913D2DF1 +:1098200098130FC08F89882311F0FF2051F0E09129 +:109830002B2D81E08E0F80932B2DF0E0E45DF24D17 +:10984000E082E394B7E6AB0EB11CEFE0EE12CFCFAF +:10985000FF2009F499C080EED8018C9380E811961E +:109860008C9362E0C8010E941643F80182839383BF +:1098700089E0ACC0893009F087C0B601C8010E94F8 +:109880007F427C01BC01C8010E94AC4281110FC023 +:10989000C701089667E070E00E946755462FE09187 +:1098A000652EF091662EB80181EC1995C4C0B70100 +:1098B000C8010E9431426C01D8016C91262F30E022 +:1098C00073E0969587957A95E1F7029728173907FF +:1098D00031F46E5FC8010E941643892B71F082EC4F +:1098E000F801808361E0C8010E941643D8011196F7 +:1098F0008C93119712969C93A8C0F12C67E6E62EE4 +:109900005801FFEFAF1ABF0A80912B2DF816E0F532 +:10991000EF2DF0E0E45DF24D6081E69EB001112490 +:1099200065567F4E47E650E0CE0101960E94EF5506 +:109930008F89882339F14E8950E0F801808190E0C9 +:1099400001974817590739F4B501CE0106960E94D0 +:109950001056892BB9F020912B2D422F50E0415009 +:1099600051093F2D832F90E0841795073CF4FC01AB +:10997000E45DF24D818180833F5FF4CF21502093DD +:109980002B2DFA94F394C0CF8091492D9AEF980F24 +:109990009430F8F490912B2D2CE23DE2F9018E2FBA +:1099A000821B891708F06DC0819184508230B8F70E +:1099B00082E0D8018C9380E611968C9362E0C80116 +:1099C0000E941643F801828393838BE08093492D94 +:1099D0005FCB8B3009F055C0C114D10409F44FC0DE +:1099E000B601C8010E947F427C01BC01C8010E94EF +:1099F000AC4281110FC0C701089667E070E00E9479 +:109A00006755462FE091652EF091662EB80181ECE6 +:109A100019950FC0B701C8010E94314253E09695D5 +:109A200087955A95E1F7682FC8010E941643892B44 +:109A3000A1F010922B2D82ECD8018C9361E0C8012B +:109A40000E941643F801818392838AE08093492D16 +:109A500010924A2D68E170E01DCBD80115968C91CB +:109A6000882331F0813059F480932B2D85E004C098 +:109A700081E080932B2D84E080932C2D02C01092E6 +:109A80002B2D80912B2D811103C063EF73E213C046 +:109A90008130A9F460912C2DB7E66B9FB0011124A1 +:109AA0006E537F4E40E450E0CE0101960E94EF5588 +:109AB000BE016F5F7F4F85E60E94E32168C0912C55 +:109AC00080E090E000E010E027E6822E7E013FEF8C +:109AD000E31A3DEFF30A36E0C32E34E2D32EA12C75 +:109AE00042E0B42E20912B2D921680F50130E2E059 +:109AF0001E0720F0081B190BF12C2EC0E92DF0E0F9 +:109B0000E45DF24D6081869EB00111246E537F4E5C +:109B100040E450E0C7010E94EF55FF92EF92DF92C0 +:109B2000CF92C501801B910B9F938F9381E090E0B2 +:109B30008C0F9D1F800F911F9F938F930E945056F3 +:109B4000080F191F9394CDBFDEBFCCCF0130A2E028 +:109B50001A0780F6FF24F394EDEFFFEFEC0FFD1FE3 +:109B6000E00FF11F8EE28083EEEFFFEFEC0FFD1FA1 +:109B7000E00FF11F1082BE016F5F7F4F85E60E94EC +:109B8000E321F11004C081E390E10E946A188AE2A7 +:109B900090E10E946A1862E070E08BE39DE20E940F +:109BA000012284E290E10E946A186091482D70E0E1 +:109BB0008EE39DE20E9401228EE190E10E946A18EC +:109BC00061E070E08DE39DE20E9401221092772C0B +:109BD00010922B2D0E947A2210924A2DE12CF12C0A +:109BE000C701CF5BDD4FCDBFDEBFDF91CF911F91AE +:109BF0000F91FF90EF90DF90CF90BF90AF909F902C +:109C00008F907F906F905F904F903F902F9008952E +:109C1000FF920F931F93CF93DF93CDB7DEB7EA97F1 +:109C2000CDBFDEBF0FEB11E388E0F82EF00E91D22E +:109C3000F80181938F01FE12FACF0E94191904D303 +:109C4000882309F4F7C08091BF319091C0319530DD +:109C500009F46FC030F4913069F168F0933051F13C +:109C6000E9C0983009F4C2C0993009F4C8C09630F0 +:109C700009F0E0C072C0803891F0823809F0DAC093 +:109C80008091C3318F7085D2E091C931F091CA3192 +:109C9000118112FB112710F980E07BD206C01091D0 +:109CA000BB318091BC3181111260E8D2812F61D229 +:109CB00080E0A1C0282F2D7F09F0BCC0882319F0B7 +:109CC000823061F0B7C08091C131813009F0B2C0FB +:109CD000933009F080E08093BC3127C08091C1317E +:109CE000811123C0E091C3311E2F1F7009F4A2C05F +:109CF000812F4FD28091C031833011F4EBD215C047 +:109D0000E091C931F091CA3181818B7F818324E850 +:109D1000129FF0011124E35FFD4C1082E091C931E4 +:109D2000F091CA3180818E7F808380E032D2A6D2CA +:109D300064C081117FC01091C1311F779FD2A1D320 +:109D40005DD28823E9F31093C304111102C082E0AD +:109D500001C083E08093BE316DC08058823008F02E +:109D600069C08091C1319091C2318C3DE3E09E0782 +:109D700061F583E08A838AE389834FB7F894DE0133 +:109D8000139620E038E052E05093CA01E32FF0E050 +:109D9000E4911092CA0120FF03C0E295EF703F5F8B +:109DA000EF708E2F90E0EA3010F0C79601C0C09699 +:109DB0008D939D932F5F2C3139F74FBF5FD26AE3AC +:109DC00070E0CE010196A3D00FC0AE014F5F5F4F90 +:109DD0006091C3310E94710C8C01892B59F14ED2D4 +:109DE000B80189819A810FD1A5D124C0803811F59D +:109DF00045D28091BA31BDD184D143D31BC08111EA +:109E000019C08091C1318230A8F438D28091C1311B +:109E10008093BA3136D38091BA31811106C08091D6 +:109E2000C304811102C081E001C084E08093BE318F +:109E30000E94151909D2882311F020D24BD2EA963C +:109E4000CDBFDEBFDF91CF911F910F91FF9008959D +:109E50000895CF938091BE31882351F0C091CB31CA +:109E600080E097D1F1D18111D3DE8C2FCF9191C1B8 +:109E7000CF910895CF92DF92EF92FF920F931F93AD +:109E8000CF93DF93EC018B017A0111D3811136C09E +:109E9000E114F10439F0F70180819181081B190B5D +:109EA000C80FD91FC12CD12C0115110531F180919A +:109EB000C7319091C831FC01EF5BFF4F2081319792 +:109EC0008081281790F01DD1C4DFE114F10449F01E +:109ED000F70180819181C80ED91EC082D18285E0B0 +:109EE0000DC0E5D2882301F309C0899142D1015008 +:109EF0001109FFEFCF1ADF0AD7CF80E0DF91CF91B2 +:109F00001F910F91FF90EF90DF90CF900895DF9217 +:109F1000EF92FF920F931F93CF93DF93D82FC92F08 +:109F20008B018091CB31806834D12091C531309143 +:109F3000C6312017310728F00115110519F4E1D0B9 +:109F400001C08901ED2EFC2ED12C0115110509F45B +:109F500040C08091BE31811102C082E04CC085308A +:109F600011F483E048C070D1882311F081E043C030 +:109F700051D181113CC042D1882339F32091CB319A +:109F80008091C7319091C831FC0127FF05C0EF5B7C +:109F9000FF4FC081D0E013C0E05CFF4FC08131961D +:109FA0008081D0E0C81BD1090AC0C830D10550F467 +:109FB000F70181917F01DDD0015011092196011532 +:109FC000110599F7DD24D394289709F0D12C99D065 +:109FD000BCCFD110BECF0BC08091BE31882309F415 +:109FE000BCCF853009F4BDCF2FD18111BFCF12D1A5 +:109FF000882391F380E0DF91CF911F910F91FF9023 +:10A00000EF90DF900895DF92EF92FF920F931F93EE +:10A01000CF93DF93D82FC92F8B018091CB318068EC +:10A02000B8D02091C5313091C6312017310728F0C2 +:10A030000115110519F465D001C08901ED2EFC2E22 +:10A04000D12C0115110509F442C08091BE31811156 +:10A0500002C082E04EC0853011F483E04AC0F4D0E3 +:10A06000882311F081E045C0D5D081113EC0C6D013 +:10A07000882339F32091CB318091C7319091C83139 +:10A08000FC0127FF05C0EF5BFF4FC081D0E015C08A +:10A09000E05CFF4FC08131968081D0E0C81BD109C0 +:10A0A0000CC0C830D10560F4F701849162D0FFEF95 +:10A0B000EF1AFF0A0150110921960115110589F7C0 +:10A0C000DD24D394289709F0D12C1BD0BACFD1101E +:10A0D000BCCF0BC08091BE31882309F4BACF853044 +:10A0E00009F4BBCFB1D08111BDCF94D0882391F3B7 +:10A0F00080E0DF91CF911F910F91FF90EF90DF9063 +:10A100000895E091C931F091CA31A091C731B09161 +:10A11000C831AF5BBF4F8C9190E082839383808185 +:10A120008D798083E091C731F091C831EF5BFF4FAB +:10A1300010820895E091C931F091CA3180818D7902 +:10A140008083E091C731F091C831EF5BFF4F1082FF +:10A1500008958091C7319091C831FC01EF5BFF4FAA +:10A16000208131E0320F3083FC01E20FF11D80814C +:10A1700008952091C7313091C831F901EF5BFF4F4D +:10A18000908141E0490F4083F901E90FF11D80837F +:10A1900008958093CB31482F4F7050E06091C604F2 +:10A1A0007091C7049A0194E0220F331F9A95E1F74A +:10A1B000E4E887FF11C0E49FC001E59F900D1124E2 +:10A1C000825F9D4C8093C7319093C831C901089636 +:10A1D0009B01280F391F0DC0E49FC001E59F900D22 +:10A1E000112484539E4C8093C7319093C831260F1D +:10A1F000371F2093C9313093CA3108958091CB31F4 +:10A200008068C7DFE091C931F091CA3180818695BD +:10A21000817008958091CB318F77BBDFA091C931D8 +:10A22000B091CA318C9185FF0DC0E091C731F0919A +:10A23000C83112968D919C911397E05CFF4F8083FB +:10A2400081E0089580E008958091CB318F77A1DF80 +:10A25000A091C931B091CA318C9184FF0DC0E091B9 +:10A26000C731F091C83112968D919C911397E05CA3 +:10A27000FF4F808381E0089580E008958091CB3185 +:10A280008F7787DFE091C931F091CA3180818D7875 +:10A290008083E091C931F091CA31808181608083EF +:10A2A000E091C731F091C831EF5BFF4F1082809190 +:10A2B000CB3180686EDFE091C931F091CA31808185 +:10A2C00081608083E091C731F091C831EF5BFF4F2F +:10A2D00010820895E091C931F091CA318181846082 +:10A2E0008183E091C931F091CA318181807C8034D1 +:10A2F00059F48091CB3180584CDFE091C931F09115 +:10A30000CA3181818460818308951F93CF93DF9345 +:10A310001F921F92CDB7DEB7182F4A83698339DFAA +:10A32000E091C931F091CA311182E091C931F091C7 +:10A33000CA31812F881F8827881F880F8083E0916A +:10A34000C931F091CA3169816183E091C931F091DD +:10A35000CA31128213822091C7313091C8312483CF +:10A360003583110F110B4A814123F901E05CFF4F46 +:10A3700040833196108281E00F900F90DF91CF9152 +:10A380001F910895AF92BF92CF92DF92EF92FF920A +:10A390000F931F93CF93DF93A62E8C017C0184E053 +:10A3A000E80EF11CB12CBA1409F443C0F801D081B5 +:10A3B000DD23C1F1C180D280F70131978081F7019F +:10A3C0009081923010F498E001C098E128E030E0EC +:10A3D000C0E02C153D0520F4CF5F220F331FF9CFCD +:10A3E000C92B9D2F9F70963010F080E023C0CF7E48 +:10A3F000F1E4CF16D104C8F7882321F0813021F48D +:10A40000C06C0AC0C06403C0C068811105C04C2D77 +:10A410006C2F80E88D0F79DF4C2D6C2F8D2F75DF21 +:10A42000882319F3B3940B5F1F4F85E0E80EF11CEE +:10A43000BACF81E0DF91CF911F910F91FF90EF9004 +:10A44000DF90CF90BF90AF90089580E090E0E091D2 +:10A45000C604F091C7049C0144E0220F331F4A95C3 +:10A46000E1F7E20FF31F11864091C6045091C70433 +:10A47000FA01E20FF31F118201968630910539F738 +:10A4800008958091BF3187FF0DC0C4DE811105C0E2 +:10A490008091BE318111F9CF09C04CCE8091BE317F +:10A4A000882321F0ABDE8823C9F32BCE08950F93C8 +:10A4B0001F93CF93E091C604F091C704E05AFF4F79 +:10A4C00000811181C4E68091CB3187FF0AC096DEFE +:10A4D000811105C08091BE31811105C021C080E08D +:10A4E00024C098DEF5CF8530E9F0E091C931F091D4 +:10A4F000CA31818182FD18C0E091C604F091C70481 +:10A50000E05AFF4F8081918180179107E1F22FEF90 +:10A510002C0FCC2319F08C01C22FD5CF84E005C0BD +:10A5200082E003C083E001C081E0CF911F910F91D1 +:10A53000089563D069D0E0ECF4E081818E7F81835F +:10A5400080818F7780831092BD310895CF93DF9300 +:10A55000E0E4F0E014828481836084834ED054D0A0 +:10A56000C0ECD4E088818F77888388818068888375 +:10A570001092BE311092BA311092BC311092BB31A0 +:10A5800088818064888348E068E480E8BEDE48E033 +:10A5900068E480E0BADE888580648887898181608C +:10A5A0008983DF91CF910895CF93DF933FB7F894DC +:10A5B000C0ECD1E022E02A87EAE1F0E0E491A0ECEF +:10A5C000B4E0DA96EC93DA97EBE1F0E0E491DB9615 +:10A5D000EC93DB971A8685EE94E38E7F16968D9327 +:10A5E0009C93179785E18C9318962C933FBF81E03D +:10A5F0008093BD31DF91CF91A9CFE0ECF4E080856D +:10A600008370808711860895E0ECF4E08FEF8287F5 +:10A61000848708951F920F920FB60F92112408B6E7 +:10A620000F9218BE09B60F9219BE0BB60F921BBE41 +:10A630002F933F934F935F936F937F938F939F934A +:10A64000AF93BF93EF93FF938091CA0487FF08C035 +:10A650008091C80487FF04C080E88093CA04F8DBB7 +:10A660008091CA0486FF07C080E48093CA041092D8 +:10A67000BE310E9404198091CA0485FF14C080E293 +:10A680008093CA048091BA31882311F084E007C016 +:10A690008091C304811102C081E001C083E08093F6 +:10A6A000BE310E94F3188091CA0484FF14C080E177 +:10A6B0008093CA0482E08093BE311092BA31109226 +:10A6C000C304C3DE48E068E480E81FDE48E068E4D5 +:10A6D00080E01BDEBDDBFF91EF91BF91AF919F91B9 +:10A6E0008F917F916F915F914F913F912F910F903B +:10A6F0000BBE0F9009BE0F9008BE0F900FBE0F90BB +:10A700001F901895CF93DF93EC01FC0170968BE0BE +:10A71000DF011D928A95E9F782E08C83898783E0C7 +:10A720008E8761E0CE0101962DDE882361F061E025 +:10A73000CE01069627DE882331F061E0CE010B962C +:10A74000DF91CF911FCE80E0DF91CF9108950F93DD +:10A750001F93CF93DF932091BE312430E1F4FC01AD +:10A760000489158926893789012B022B032B99F03F +:10A77000EB0181810EDDFE0101900020E9F73197A8 +:10A78000BF016C1B7D0B40E050E0CE01DF91CF910B +:10A790001F910F916FCB82E0DF91CF911F910F91AD +:10A7A00008950F931F93CF93DF93FC018091BE31E7 +:10A7B0008430A9F484899589A689B789892B8A2B45 +:10A7C0008B2B69F08A01EB018181E3DC40E050E0F2 +:10A7D000B801CE01DF91CF911F910F914BCB82E059 +:10A7E000DF91CF911F910F910895CF93FC0180913C +:10A7F000BE31843001F584899589A689B789892B72 +:10A800008A2B8B2BC1F0C62F8181C3DC2091C731ED +:10A810003091C831F901EF5BFF4F90813197808112 +:10A82000981720F48C2FA5DC80E006C06ADC3FDEA0 +:10A830008823C1F301C082E0CF910895CF93DF93C5 +:10A840002091BE31243091F5FC01448955896689F7 +:10A850007789452B462B472B49F181819ADC8091E2 +:10A86000CB312091C7313091C831F90187FF05C044 +:10A87000EF5BFF4F808190E008C0E05CFF4F80817C +:10A880003196408190E0841B9109892B69F0F90190 +:10A89000EF5BFF4FD0813197C08133DCDC1720F0B4 +:10A8A00006DE811104C02DDC80E001C082E0DF9172 +:10A8B000CF910895CF93DF932091BE31243099F446 +:10A8C000FC014489558966897789452B462B472B9E +:10A8D00051F0EC0181815DDC91DC882321F0CE0117 +:10A8E000DF91CF91ABCFDF91CF910895CF93DF93DD +:10A8F0002091BE31243019F08FEF9FEF46C0FC014C +:10A900004489558966897789452B462B472BA1F3C6 +:10A9100086813FDC7FDC882379F38091CB312091E5 +:10A92000C7313091C831F90187FF05C0EF5BFF4F98 +:10A93000808190E008C0E05CFF4F808131962081EB +:10A9400090E0821B9109892B21F003DCC82FD0E015 +:10A9500002C0CFEFDFEF2091CB318091C7319091D2 +:10A96000C831FC0127FF05C0EF5BFF4F208130E0BD +:10A9700008C0E05CFF4F20813196808130E0281BC9 +:10A980003109232B09F4D6DBCE01DF91CF91089555 +:10A990000895FF920F931F93CF93DF93EC0154DC44 +:10A9A000882309F48EC0888190E02091C3313091D2 +:10A9B000C4312817390709F084C08091C031813231 +:10A9C00059F018F4803249F17CC0823209F457C042 +:10A9D000833209F467C075C08091BF31813A09F0B4 +:10A9E00070C04CDC0BDC8823E9F38C89FD880E8970 +:10A9F0001F89BFDB8F2DBDDB802FBBDB812FB9DB38 +:10AA0000888DB7DB898DB5DB8A8DB3DB7ADBDF918F +:10AA1000CF911F910F91FF9034CD8091BF31813242 +:10AA200009F04FC02BDCF6DB811105C08091BE31EF +:10AA30008111F9CF46C08DDB082F8BDB182F89DB06 +:10AA4000F82E87DB4F2D50E060E070E0BA0155270B +:10AA50004427782B402B512B4C8B5D8B6E8B7F8B3F +:10AA600078DB888F76DB898F74DB8A8F63DB09DD87 +:10AA7000CE01DF91CF911F910F91FF9089CF8091EF +:10AA8000BF318132F1F4FADBFCDC8091C13190916D +:10AA9000C231888B998BCE01DF91CF911F910F919D +:10AAA000FF9076CF8091BF31813259F4E7DBE9DC4A +:10AAB0006091C131CE01DF91CF911F910F91FF9035 +:10AAC00067CFDF91CF911F910F91FF900895AA1B3F +:10AAD000BB1B51E107C0AA1FBB1FA617B70710F089 +:10AAE000A61BB70B881F991F5A95A9F780959095BB +:10AAF000BC01CD010895B7FF04C003D0821B930BA6 +:10AB0000089509D0A59F900DB49F900DA49F800D2E +:10AB1000911D11240895A29FB001B39FC001A39F6E +:10AB2000700D811D1124911DB29F700D811D112486 +:10AB3000911D08958F929F92AF92BF92CF92DF9214 +:10AB4000EF92FF92CF93DF93EC01688179818A8144 +:10AB50009B81611571058105910521F464E279ED10 +:10AB60008BE597E02DE133EF41E050E0E2D649017B +:10AB70005A019B01AC01A7EAB1E4C3DF6B017C0180 +:10AB8000ACEEB4EFA5019401B8DFDC01CB018C0D74 +:10AB90009D1DAE1DBF1DB7FF03C00197A109B048A1 +:10ABA00088839983AA83BB839F77DF91CF91FF909E +:10ABB000EF90DF90CF90BF90AF909F908F900895CF +:10ABC000B9CF82E290E2B6CFA0E0B0E0809322203D +:10ABD00090932320A0932420B09325200895FB0177 +:10ABE000DC0102C005900D9241505040D8F7089505 +:10ABF000FB01DC018D91059080190110D9F3990BAF +:10AC00000895FB01DC014150504048F005900D9241 +:10AC10000020C9F701C01D9241505040E0F708954F +:10AC2000FB01DC0104C08D910190801921F4415099 +:10AC30005040C8F7881B990B0895FB01DC0102C046 +:10AC400001900D9241505040D8F708956817790748 +:10AC500068F4FB01DC01E40FF51FA40FB51F02C06F +:10AC600002900E9241505040D8F70895E6CFDC0193 +:10AC700001C06D9341505040E0F70895FC0181916F +:10AC8000861721F08823D9F7992708953197CF01A6 +:10AC90000895FB01DC0101900D920020E1F7089579 +:10ACA0000F931F93CF93DF93CDB7DEB72E97CDBF12 +:10ACB000DEBF0E891F89888D998D26E02C8309833C +:10ACC0001A8397FF02C080E090E801978D839E83EE +:10ACD000AE01445E5F4F6A8D7B8DCE01019667D0D9 +:10ACE0004D815E8157FD0AC02F8138854217530779 +:10ACF0000CF49A01F801E20FF31F10822E96CDBFDB +:10AD0000DEBFDF91CF911F910F9108950F931F9395 +:10AD1000CF93DF93CDB7DEB72E97CDBFDEBF0E89C1 +:10AD20001F89888D998D2EE02C8309831A8397FFC4 +:10AD300002C080E090E801978D839E83AE01445E5F +:10AD40005F4F6A8D7B8DCE01019631D04D815E8142 +:10AD500057FD0AC02F813885421753070CF49A011A +:10AD6000F801E20FF31F10822E96CDBFDEBFDF91F8 +:10AD7000CF911F910F910895CF93DF93CDB7DEB799 +:10AD80002E97CDBFDEBF8DE08C838C899D89898312 +:10AD90009A83AE01485E5F4F6E897F89CE0101962E +:10ADA0008FD32E96CDBFDEBFDF91CF9108952F9226 +:10ADB0003F924F925F926F927F928F929F92AF924B +:10ADC000BF92CF92DF92EF92FF920F931F93CF9398 +:10ADD000DF93CDB7DEB72C97CDBFDEBF7C016B0113 +:10ADE0008A01FC0116821782838181FFB0C1CE01E6 +:10ADF00001964C01F7019381F60193FD859193FF34 +:10AE000081916F01882309F49EC1853239F493FD45 +:10AE1000859193FF81916F01853221F4B70190E014 +:10AE2000D6D4E8CF512C312C20E02032A0F48B3244 +:10AE300069F030F4803259F0833269F420612CC01B +:10AE40008D3239F0803339F4216026C022602460CD +:10AE500023C0286021C027FD27C030ED380F3A30CD +:10AE600078F426FF06C0FAE05F9E300D1124532EC1 +:10AE700013C08AE0389E300D1124332E20620CC09E +:10AE80008E3221F426FD5FC1206406C08C3611F499 +:10AE9000206802C0883641F4F60193FD859193FF46 +:10AEA00081916F018111C1CF982F9F7D955493306F +:10AEB00028F40C5F1F4FFFE3F9830DC0833631F098 +:10AEC000833771F0833509F057C021C0F8018081C4 +:10AED00089830E5F1F4F44244394512C540114C0A6 +:10AEE0003801F2E06F0E711CF801A080B18026FFDE +:10AEF00003C0652D70E002C06FEF7FEFC5012C87A6 +:10AF00001DD42C0183012C852F77222E16C03801E9 +:10AF1000F2E06F0E711CF801A080B18026FF03C023 +:10AF2000652D70E002C06FEF7FEFC5012C87FBD36A +:10AF30002C012C852068222E830123FC19C0832D2F +:10AF400090E048165906A0F4B70180E290E03FD4A3 +:10AF50003A94F5CFF50127FC859127FE81915F0199 +:10AF6000B70190E034D431103A94F1E04F1A51080F +:10AF70004114510479F7DEC0843611F0893631F579 +:10AF8000F80127FF07C060817181828193810C5F86 +:10AF90001F4F08C060817181072E000C880B990B30 +:10AFA0000E5F1F4F2F76722E97FF09C090958095E8 +:10AFB000709561957F4F8F4F9F4F2068722E2AE0CA +:10AFC00030E0A40155D4A82EA81843C0853729F431 +:10AFD0002F7EB22E2AE030E025C0F22FF97FBF2E5F +:10AFE0008F36C1F018F4883579F0ADC0803719F08C +:10AFF000883721F0A8C02F2F2061B22EB4FE0DC0DB +:10B000008B2D8460B82E09C024FF0AC09F2F966044 +:10B01000B92E06C028E030E005C020E130E002C0D3 +:10B0200020E132E0F801B7FE07C0608171818281C2 +:10B0300093810C5F1F4F06C06081718180E090E0BA +:10B040000E5F1F4FA40114D4A82EA818FB2DFF7764 +:10B050007F2E76FE0BC0372D3E7FA51450F474FE74 +:10B060000AC072FC08C0372D3E7E05C0BA2C372DB1 +:10B0700003C0BA2C01C0B52C34FF0DC0FE01EA0D8F +:10B08000F11D8081803311F4397E09C032FF06C082 +:10B09000B394B39404C0832F867809F0B39433FD3E +:10B0A00012C030FF06C05A2CB31418F4530C5B18AE +:10B0B000B32CB31460F4B70180E290E03C8787D3EF +:10B0C000B3943C85F6CFB31410F43B1801C0312C77 +:10B0D00034FF11C0B70180E390E03C8778D33C8512 +:10B0E00032FF16C031FD03C088E790E002C088E55A +:10B0F00090E0B7010CC0832F867851F031FF02C079 +:10B100008BE201C080E237FD8DE2B70190E05FD3B2 +:10B11000A51430F4B70180E390E059D35A94F8CFE6 +:10B12000AA94F401EA0DF11D8081B70190E04FD39C +:10B13000A110F6CF332009F45DCEB70180E290E094 +:10B1400046D33A94F7CFF7018681978102C08FEFFB +:10B150009FEF2C96CDBFDEBFDF91CF911F910F9156 +:10B16000FF90EF90DF90CF90BF90AF909F908F9027 +:10B170007F906F905F904F903F902F90089520FDAB +:10B1800009C0FC0123FD05C022FF02C07383628356 +:10B1900051834083089544FD10C046FD10C0DB017B +:10B1A000FC01AA0FBB1FEE1FFF1F1094D1F76A0FFF +:10B1B0007B1F8E1F9F1F31E003C033E001C034E0CE +:10B1C000660F771F881F991F3150D1F7620F711DCD +:10B1D000811D911D08950F931F93CF93DF938C01D1 +:10B1E000C801B7D2EC0197FD06C08AD2892BC1F7FE +:10B1F000B801CE0124D3CE01DF91CF911F910F91E1 +:10B2000008958F929F92AF92BF92CF92DF92EF926A +:10B21000FF920F931F93CF93DF931F92CDB7DEB7AB +:10B220008C01C62E7A01298394D2AC01552729813D +:10B230004B32510521F04D32510561F42068CA941A +:10B24000C11002C080E06FC0C801298382D2298169 +:10B2500097FDF8CF322F3D7FD32E322F307339F543 +:10B26000803329F5BB24BA94BC0C09F449C0C80149 +:10B2700029836FD2298197FD43C0382F3F7D383510 +:10B2800061F48D2D8264D82ECA94CA94CC20C1F169 +:10B29000C8015FD297FF0BC033C026FF04C02D2D1D +:10B2A0002260D22E03C03D2D3261D32ECB2C812CB7 +:10B2B000912C540120ED280F283078F0D4FE03C0E3 +:10B2C000B801BDD21AC02A3040F0D6FEF9CF2F7D8A +:10B2D0003FEE320F3630A0F727504D2DC501B40197 +:10B2E0005ADF4B015C018D2D8260D82ECA94CC2090 +:10B2F00051F0C8012ED297FFDDCFD1FC04C0A2CF00 +:10B30000812C912C5401D7FE08C0B094A094909445 +:10B310008094811C911CA11CB11C2D2DB501A40190 +:10B32000C7012DDF81E00F90DF91CF911F910F9129 +:10B33000FF90EF90DF90CF90BF90AF909F908F9055 +:10B3400008956F927F928F929F92AF92BF92CF9209 +:10B35000DF92EF92FF920F931F93CF93DF93CDB7BE +:10B36000DEB7A197CDBFDEBF5C017A01CE010196A9 +:10B370006C0180E2F60111928A95E9F7F50183806C +:10B3800040E050E0912C712C70E0A1E0B0E0F901B8 +:10B3900083FC859183FE81918F01982F9F018111FC +:10B3A00003C080E090E07AC08E3519F44115510554 +:10B3B00049F1E72FF0E0E417F5073CF48D3559F13A +:10B3C0008D3219F4772001F103C0711001C0982E5D +:10B3D000892F8695869586958601080F111D892FE0 +:10B3E00087703D0101C0660C8A95EAF7F8018081FB +:10B3F00086298083991559F0991510F49F5FE8CF3D +:10B400009150E6CF71E004C07724739401C0712C91 +:10B410004F5F5F4FBCCF772019F08E8180628E83A3 +:10B42000711103C09924939416C0F6019E012F5DFB +:10B430003F4F808180958193E217F307D1F7F2CFD8 +:10B44000E114F10429F0F7018083C70101967C0122 +:10B450006150912CE9F0C50169A37BD169A197FDE9 +:10B4600015C0282F269526952695F601E20FF11D89 +:10B47000208130E0AC014770552702C035952795F3 +:10B480004A95E2F720FDDCCFB501D9D1911089CFE3 +:10B49000E114F10411F0F7011082C801A196CDBFAB +:10B4A000DEBFDF91CF911F910F91FF90EF90DF9062 +:10B4B000CF90BF90AF909F908F907F906F900895A6 +:10B4C0004F925F927F928F929F92AF92BF92CF9254 +:10B4D000DF92EF92FF920F931F93CF93DF931F9210 +:10B4E000CDB7DEB76C012B015A01FC011682178221 +:10B4F000712CF601F380F201F3FC8591F3FE81914A +:10B50000382F2F01882309F4E5C090E03983F8D063 +:10B510003981892B19F0C6015EDEEBCF353241F45B +:10B52000F201F3FC3591F3FE31912F01353259F4DC +:10B53000C60139830ED1398197FDCAC03817C9F2C7 +:10B54000B6017DD1C7C03A3239F4F3FC3591F3FE30 +:10B5500031912F0151E001C050E0420110E020ED97 +:10B56000230F2A3088F45260612F70E080E090E071 +:10B5700040E2598310DE162FF401F3FC3591F3FEFF +:10B5800031914F015981EBCF052F232F240151FF1A +:10B5900003C0111102C09EC01FEF383619F03C36AF +:10B5A00059F011C0F401F3FC2591F3FE21912F0114 +:10B5B000283649F4052F08600460F201F3FC259158 +:10B5C000F3FE21912F01222309F484C0622F70E041 +:10B5D00084EA96E129839CD02981892B09F47AC0D9 +:10B5E00000FD07C0F501E080F180C50102965C0115 +:10B5F00002C0E12CF12C2E3649F4F6014681578128 +:10B6000060E070E0202FC701BADD73CF233689F4E4 +:10B6100001FF11E0C6019DD097FD5AC0E114F1046D +:10B6200029F0F7018083C70101967C01115091F741 +:10B630004BC02B3551F49201A701612FC60181DE69 +:10B640002C01892B09F040C03AC0C6012983C3DD13 +:10B65000298197FD3DC02F3641F128F4243619F198 +:10B66000293631F124C0233769F02537E1F01FC0B6 +:10B67000E114F10429F0F7018082C70101967C01F1 +:10B68000115059F0C60165D04C0197FD06C038D065 +:10B69000892B71F3B601C401D2D0E114F104A1F0F9 +:10B6A000F701108211C0006203C0006101C0006494 +:10B6B000202FA701612FC601A4DD811105C0F6016D +:10B6C0008381807329F406C000FD13CF739411CFDA +:10B6D000772019F0872D90E002C08FEF9FEF0F9039 +:10B6E000DF91CF911F910F91FF90EF90DF90CF905E +:10B6F000BF90AF909F908F907F905F904F900895F4 +:10B70000911114C1803219F089508550D0F70895F5 +:10B71000FC010590061621F00020D9F7C00108951C +:10B720003197CF010895FC010590615070400110E0 +:10B73000D8F7809590958E0F9F1F0895FC0161505A +:10B74000704001900110D8F7809590958E0F9F1F43 +:10B750000895CF93DF93EC012B8120FF33C026FFA8 +:10B760000AC02F7B2B838E819F8101968E839F83BE +:10B770008A8190E029C022FF0FC0E881F981808191 +:10B78000082E000C990B009719F420622B831AC025 +:10B790003196E883F9830EC0EA85FB85199597FFFA +:10B7A00009C02B81019611F080E201C080E1822B5B +:10B7B0008B8308C02E813F812F5F3F4F2E833F83B5 +:10B7C000992702C08FEF9FEFDF91CF9108950F93DC +:10B7D0001F93CF93DF93FB01238121FD03C08FEFE4 +:10B7E0009FEF28C022FF16C04681578124813581F2 +:10B7F0004217530744F4A081B1819D012F5F3F4F51 +:10B80000208331838C93268137812F5F3F4F26839E +:10B81000378310C0EB01092F182F0084F185E02D2C +:10B820001995892BE1F68E819F8101968E839F83E6 +:10B83000812F902FDF91CF911F910F910895FB01E0 +:10B84000238120FF12C026FD10C08F3F3FEF9307DA +:10B8500061F082832F7D20642383268137812150EC +:10B86000310926833783992708958FEF9FEF089535 +:10B87000FA01AA27283051F1203181F1E8946F9321 +:10B880006E7F6E5F7F4F8F4F9F4FAF4FB1E03ED0C7 +:10B89000B4E03CD0670F781F891F9A1FA11D680F65 +:10B8A000791F8A1F911DA11D6A0F711D811D911D98 +:10B8B000A11D20D009F468943F912AE0269F11240D +:10B8C0003019305D3193DEF6CF010895462F477071 +:10B8D000405D4193B3E00FD0C9F7F6CF462F4F70CC +:10B8E000405D4A3318F0495D31FD4052419302D02A +:10B8F000A9F7EACFB4E0A6959795879577956795D0 +:10B90000BA95C9F700976105710508959B01AC01CF +:10B910000A2E06945795479537952795BA95C9F7F6 +:10B92000620F731F841F951FA01D089599278827F4 +:10B930000895052E97FB16F400940FD057FD05D0FF +:10B9400014D007FC02D046F408C0509540953095BD +:10B9500021953F4F4F4F5F4F08959095809570957B +:10B9600061957F4F8F4F9F4F0895A1E21A2EAA1B1A +:10B97000BB1BFD010DC0AA1FBB1FEE1FFF1FA2179F +:10B98000B307E407F50720F0A21BB30BE40BF50B9C +:10B99000661F771F881F991F1A9469F76095709525 +:10B9A000809590959B01AC01BD01CF010895F8945D +:02B9B000FFCFC7 +:10B9B20002400F0083100000010410000001820801 +:10B9C20000000100000000000000000000009001E3 +:10B9D20001000100000000000000112418241824B6 +:10B9E200242430243A24572465248E249124952437 +:10B9F2001027722687268B26A026D126E426112719 +:10BA02003E000426140004043E00042E040C040428 +:10BA120000080008000000000000000800080808F4 +:10BA220008080800080008000000080800080808C4 +:10BA32000080008000000000000000800080808004 +:10BA420080808000800080000000808000808080F4 +:10BA520000010001000000000000000100010101DE +:10BA620001010100010001000000010100010101CA +:10BA720000000000000000000000000000000000C4 +:10BA820001010101010101010101010101010101A4 +:10BA92000101010101010101010101010101010194 +:10BAA2000101010101010101010101010101010184 +:10BAB2000000000000000000000000000000000084 +:10BAC2000000000000000000000000000000000074 +:10BAD2000000000000000000000000000000000064 +:10BAE2000101010101010101010101010101010144 +:10BAF2000000000000000000000000000000000044 +:10BB02000000000000000000000000000000000033 +:10BB12000101010101010101010101010101010113 +:10BB22000000000000000000000000000000000013 +:10BB320001010101010101010101010101010101F3 +:10BB420001010101010101010101010101010101E3 +:10BB520000000000000000000000000000000000E3 +:10BB620001010101010101010101010101010101C3 +:10BB720000000002020000020002020202000002B3 +:10BB820000000002020000020002020202000002A3 +:10BB92000000000202000002000202020200000293 +:10BBA2000404040606040406040606060604040643 +:10BBB2000404040606040406040606060604040633 +:10BBC2000000000202000002000202020200000263 +:10BBD2000000000202000002000202020200000253 +:10BBE2000404040606040406040606060604040603 +:10BBF2000000000202000002000202020200000233 +:10BC020004040406060404060406060606040406E2 +:10BC120004040406060404060406060606040406D2 +:10BC220004040406060404060406060606040406C2 +:10BC320004040406060404060406060606040406B2 +:10BC420000000002020000020002020202000002E2 +:10BC520000000002020000020002020202000002D2 +:10BC62000404040606040406040606060604040682 +:10BC72000008080800000008000008000808000882 +:10BC82000008080800000008000008000808000872 +:10BC92000008080800000008000008000808000862 +:10BCA2001018181810101018101018101818101852 +:10BCB2001018181810101018101018101818101842 +:10BCC2000008080800000008000008000808000832 +:10BCD2000008080800000008000008000808000822 +:10BCE2001018181810101018101018101818101812 +:10BCF2000008080800000008000008000808000802 +:10BD020010181818101010181010181018181018F1 +:10BD120010181818101010181010181018181018E1 +:10BD220010181818101010181010181018181018D1 +:10BD320010181818101010181010181018181018C1 +:10BD420000080808000000080000080008080008B1 +:10BD520000080808000000080000080008080008A1 +:10BD62001018181810101018101018101818101891 +:10BD7200546F6F206D616E7920646174612E000DC5 +:10BD82000A000D0A504152495459204552524F520D +:10BD9200000D0A504152495459204F4B0025347529 +:10BDA2003A2000556E6B6E6F776E2063617264206D +:10BDB200747970652E002573206F7220004E4F201B +:06BDC20044415441000061 :020000021000EC :1000000000000000000000000000000000000000F0 :1000100000000000000000000000000000000000E0 From d33675cbd12d2748e523ec51b39b0cd2d9c49662 Mon Sep 17 00:00:00 2001 From: Georg Land Date: Thu, 3 Aug 2017 15:14:34 +0200 Subject: [PATCH 029/104] Update README.md --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index a4f3ecb..b114789 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,10 @@ First Steps ----------- To upgrade the firmware of your ChameleonMini, please visit the [Getting Started page](http://rawgit.com/emsec/ChameleonMini/master/Doc/Doxygen/html/Page_GettingStarted.html) from the [doxygen documentation](http://rawgit.com/emsec/ChameleonMini/master/Doc/Doxygen/html/index.html). +Supported Cards and Codecs +-------------------------- +See [here](https://github.com/emsec/ChameleonMini/wiki/Supported-Cards-and--Codecs). + Questions --------- From 62ba2e0ce4e0658368335769236fc964ca6f02ce Mon Sep 17 00:00:00 2001 From: Michal Demin Date: Thu, 24 Aug 2017 19:54:32 +0200 Subject: [PATCH 030/104] fix: clone command was not visible in command list Signed-off-by: Michal Demin --- Firmware/Chameleon-Mini/Terminal/CommandLine.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Firmware/Chameleon-Mini/Terminal/CommandLine.c b/Firmware/Chameleon-Mini/Terminal/CommandLine.c index 41a44c9..a0a6c13 100644 --- a/Firmware/Chameleon-Mini/Terminal/CommandLine.c +++ b/Firmware/Chameleon-Mini/Terminal/CommandLine.c @@ -302,6 +302,13 @@ const PROGMEM CommandEntryType CommandTable[] = { .SetFunc = CommandSetField, .GetFunc = CommandGetField }, + { + .Command = COMMAND_CLONE, + .ExecFunc = CommandExecClone, + .ExecParamFunc = NO_FUNCTION, + .SetFunc = NO_FUNCTION, + .GetFunc = NO_FUNCTION + }, { /* This has to be last element */ .Command = COMMAND_LIST_END, .ExecFunc = NO_FUNCTION, @@ -309,13 +316,6 @@ const PROGMEM CommandEntryType CommandTable[] = { .SetFunc = NO_FUNCTION, .GetFunc = NO_FUNCTION }, - { - .Command = COMMAND_CLONE, - .ExecFunc = CommandExecClone, - .ExecParamFunc = NO_FUNCTION, - .SetFunc = NO_FUNCTION, - .GetFunc = NO_FUNCTION - } }; #define STATUS_TABLE_ENTRY(Id, Text) \ From 28e56ade464d402ac424d896462d01375785e943 Mon Sep 17 00:00:00 2001 From: Georg Land Date: Tue, 26 Sep 2017 15:12:25 +0200 Subject: [PATCH 031/104] Update README.md --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index b114789..8629481 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,11 @@ This is the official repository of ChameleonMini, a freely programmable, portabl The ChameleonMini RevG is now also available via the Kasper & Oswald [Webshop](https://shop.kasper.it/). Thank you for supporting the project! +IMPORTANT: Third-party Clones +------------------ +We are aware of various third-party ChameleonMini clones or modified variants that are available on the Internet. Warning: We have evidence that some of these devices are defective or suffer from reading problems et cetera. Please understand that we cannot give support for these non-official devices, as we have no schematics / layout or other information, nor do we know the manufacturers. In case of problems, please contact the manufacturers of your device directly. + +Note to the manufacturers: Some of the third-party ChameleonMini are violating the ChameleonMini license, please obey the license (see LICENSE.txt)! First Steps ----------- From 1dc6698915a0831c7d4d3c7524506aca050a4888 Mon Sep 17 00:00:00 2001 From: Georg Date: Tue, 7 Nov 2017 15:15:25 +0100 Subject: [PATCH 032/104] fixed LED bug, now blinks faster without problems --- Firmware/Chameleon-Mini/Chameleon-Mini.c | 3 ++- Firmware/Chameleon-Mini/LED.c | 2 +- Firmware/Chameleon-Mini/Memory.c | 5 +++++ Firmware/Chameleon-Mini/System.h | 8 ++++++++ 4 files changed, 16 insertions(+), 2 deletions(-) diff --git a/Firmware/Chameleon-Mini/Chameleon-Mini.c b/Firmware/Chameleon-Mini/Chameleon-Mini.c index ff4d241..d969af6 100644 --- a/Firmware/Chameleon-Mini/Chameleon-Mini.c +++ b/Firmware/Chameleon-Mini/Chameleon-Mini.c @@ -17,11 +17,12 @@ int main(void) while(1) { if (SystemTick100ms()) { + LEDTick(); // this has to be the first function called here, since it is time-critical - the functions below may have non-negligible runtimes! + RandomTick(); TerminalTick(); ButtonTick(); LogTick(); - LEDTick(); ApplicationTick(); CommandLineTick(); AntennaLevelTick(); diff --git a/Firmware/Chameleon-Mini/LED.c b/Firmware/Chameleon-Mini/LED.c index edb3ace..d0c8fdc 100644 --- a/Firmware/Chameleon-Mini/LED.c +++ b/Firmware/Chameleon-Mini/LED.c @@ -5,7 +5,7 @@ #include "Terminal/CommandLine.h" #include "System.h" -#define BLINK_PRESCALER 2 /* x LEDTick(); */ +#define BLINK_PRESCALER 1 /* x LEDTick(); */ LEDActionEnum LEDGreenAction = LED_NO_ACTION; LEDActionEnum LEDRedAction = LED_NO_ACTION; diff --git a/Firmware/Chameleon-Mini/Memory.c b/Firmware/Chameleon-Mini/Memory.c index 15e78a3..f82e680 100644 --- a/Firmware/Chameleon-Mini/Memory.c +++ b/Firmware/Chameleon-Mini/Memory.c @@ -10,6 +10,7 @@ #include "Common.h" #include "Settings.h" #include "LEDHook.h" +#include "System.h" #define USE_DMA #define RECV_DMA DMA.CH0 @@ -395,6 +396,8 @@ void MemoryRecall(void) { /* Recall memory from permanent flash */ FlashToFRAM((uint32_t) GlobalSettings.ActiveSettingIdx * MEMORY_SIZE_PER_SETTING, MEMORY_SIZE_PER_SETTING); + + SystemTickClearFlag(); } void MemoryStore(void) @@ -404,6 +407,8 @@ void MemoryStore(void) LEDHook(LED_MEMORY_CHANGED, LED_OFF); LEDHook(LED_MEMORY_STORED, LED_PULSE); + + SystemTickClearFlag(); } bool MemoryUploadBlock(void* Buffer, uint32_t BlockAddress, uint16_t ByteCount) diff --git a/Firmware/Chameleon-Mini/System.h b/Firmware/Chameleon-Mini/System.h index 2fcce7c..45e8fc2 100644 --- a/Firmware/Chameleon-Mini/System.h +++ b/Firmware/Chameleon-Mini/System.h @@ -51,6 +51,14 @@ INLINE bool SystemTick100ms(void) return false; } +INLINE void SystemTickClearFlag(void) +{ + while(RTC.STATUS & RTC_SYNCBUSY_bm) + ; + + RTC.INTFLAGS = RTC_COMPIF_bm; +} + INLINE uint16_t SystemGetSysTick(void) { return SYSTEM_TICK_REGISTER | RTC.CNT; } From 44f20854010f1cc6876111d1a939204dd56025cf Mon Sep 17 00:00:00 2001 From: Georg Date: Tue, 7 Nov 2017 15:29:23 +0100 Subject: [PATCH 033/104] fixed bug within cycle_settings button functionality --- Firmware/Chameleon-Mini/Settings.c | 52 ++++++++++++--------- Firmware/Chameleon-Mini/Settings.h | 1 + Firmware/Chameleon-Mini/Terminal/Commands.c | 1 - 3 files changed, 32 insertions(+), 22 deletions(-) diff --git a/Firmware/Chameleon-Mini/Settings.c b/Firmware/Chameleon-Mini/Settings.c index 90cbaf6..7f7b384 100644 --- a/Firmware/Chameleon-Mini/Settings.c +++ b/Firmware/Chameleon-Mini/Settings.c @@ -35,7 +35,14 @@ void SettingsLoad(void) { void SettingsSave(void) { #if ENABLE_EEPROM_SETTINGS - WriteEEPBlock((uint16_t) &StoredSettings, &GlobalSettings, sizeof(SettingsType)); + WriteEEPBlock((uint16_t) &StoredSettings, &GlobalSettings, sizeof(SettingsType)); +#endif +} + +void ActiveSettingNumberSave(void) { +#if ENABLE_EEPROM_SETTINGS + eeprom_update_byte(&StoredSettings.ActiveSettingIdx, GlobalSettings.ActiveSettingIdx); + eeprom_update_word((uint16_t*)&StoredSettings.ActiveSettingPtr, (uint16_t)GlobalSettings.ActiveSettingPtr); #endif } @@ -56,33 +63,36 @@ void SettingsCycle(void) { } bool SettingsSetActiveById(uint8_t Setting) { - if ( (Setting >= SETTINGS_FIRST) && (Setting <= SETTINGS_LAST) ) { - uint8_t SettingIdx = SETTING_TO_INDEX(Setting); + if ( (Setting >= SETTINGS_FIRST) && (Setting <= SETTINGS_LAST) ) { + uint8_t SettingIdx = SETTING_TO_INDEX(Setting); - /* Break potentially pending timeout task (manual timeout) */ - CommandLinePendingTaskBreak(); + /* Break potentially pending timeout task (manual timeout) */ + CommandLinePendingTaskBreak(); - /* Store current memory contents permanently */ - MemoryStore(); + /* Store current memory contents permanently */ + MemoryStore(); - GlobalSettings.ActiveSettingIdx = SettingIdx; - GlobalSettings.ActiveSettingPtr = - &GlobalSettings.Settings[SettingIdx]; + GlobalSettings.ActiveSettingIdx = SettingIdx; + GlobalSettings.ActiveSettingPtr = + &GlobalSettings.Settings[SettingIdx]; - /* Settings have changed. Progress changes through system */ - ConfigurationSetById(GlobalSettings.ActiveSettingPtr->Configuration); - LogSetModeById(GlobalSettings.ActiveSettingPtr->LogMode); + /* Settings have changed. Progress changes through system */ + ConfigurationSetById(GlobalSettings.ActiveSettingPtr->Configuration); + LogSetModeById(GlobalSettings.ActiveSettingPtr->LogMode); - /* Recall new memory contents */ - MemoryRecall(); + /* Recall new memory contents */ + MemoryRecall(); - /* Notify LED. blink according to current setting */ - LEDHook(LED_SETTING_CHANGE, LED_BLINK + SettingIdx); + /* Store new setting number. */ + ActiveSettingNumberSave(); - return true; - } else { - return false; - } + /* Notify LED. blink according to current setting */ + LEDHook(LED_SETTING_CHANGE, LED_BLINK + SettingIdx); + + return true; + } else { + return false; + } } uint8_t SettingsGetActiveById(void) { diff --git a/Firmware/Chameleon-Mini/Settings.h b/Firmware/Chameleon-Mini/Settings.h index 29e4b9e..987bfd7 100644 --- a/Firmware/Chameleon-Mini/Settings.h +++ b/Firmware/Chameleon-Mini/Settings.h @@ -41,6 +41,7 @@ extern SettingsType GlobalSettings; void SettingsLoad(void); void SettingsSave(void); +void ActiveSettingNumberSave(void); void SettingsCycle(void); bool SettingsSetActiveById(uint8_t Setting); diff --git a/Firmware/Chameleon-Mini/Terminal/Commands.c b/Firmware/Chameleon-Mini/Terminal/Commands.c index ecc63b8..efd5cf8 100644 --- a/Firmware/Chameleon-Mini/Terminal/Commands.c +++ b/Firmware/Chameleon-Mini/Terminal/Commands.c @@ -357,7 +357,6 @@ CommandStatusIdType CommandGetSetting(char* OutParam) CommandStatusIdType CommandSetSetting(char* OutMessage, const char* InParam) { if (SettingsSetActiveByName(InParam)) { - SettingsSave(); return COMMAND_INFO_OK_ID; } else { return COMMAND_ERR_INVALID_PARAM_ID; From 94d24d95c6bf7e5c7d31e10a1d4b73f99db69b0a Mon Sep 17 00:00:00 2001 From: Georg Date: Tue, 7 Nov 2017 15:53:23 +0100 Subject: [PATCH 034/104] unified indentation --- Firmware/Chameleon-Mini/AntennaLevel.c | 18 +- Firmware/Chameleon-Mini/AntennaLevel.h | 24 +- .../Chameleon-Mini/Application/Application.h | 4 +- Firmware/Chameleon-Mini/Application/Crypto1.c | 210 +-- .../Chameleon-Mini/Application/ISO14443-3A.h | 22 +- .../Application/MifareClassic.c | 878 ++++++------ .../Application/MifareUltralight.c | 2 +- .../Chameleon-Mini/Application/Reader14443A.c | 1226 ++++++++--------- .../Chameleon-Mini/Application/Reader14443A.h | 14 +- Firmware/Chameleon-Mini/Battery.h | 14 +- Firmware/Chameleon-Mini/Button.c | 160 +-- Firmware/Chameleon-Mini/Button.h | 16 +- Firmware/Chameleon-Mini/Chameleon-Mini.c | 28 +- Firmware/Chameleon-Mini/Codec/Codec.c | 70 +- Firmware/Chameleon-Mini/Codec/Codec.h | 72 +- Firmware/Chameleon-Mini/Codec/ISO14443-2A.c | 144 +- .../Chameleon-Mini/Codec/Reader14443-2A.c | 514 +++---- Firmware/Chameleon-Mini/Common.c | 32 +- Firmware/Chameleon-Mini/Common.h | 24 +- Firmware/Chameleon-Mini/Configuration.c | 112 +- Firmware/Chameleon-Mini/Configuration.h | 38 +- Firmware/Chameleon-Mini/LED.c | 210 +-- Firmware/Chameleon-Mini/LED.h | 56 +- Firmware/Chameleon-Mini/LEDHook.h | 16 +- Firmware/Chameleon-Mini/LUFADescriptors.c | 4 +- Firmware/Chameleon-Mini/Log.c | 172 +-- Firmware/Chameleon-Mini/Log.h | 2 +- Firmware/Chameleon-Mini/Map.c | 78 +- Firmware/Chameleon-Mini/Map.h | 4 +- Firmware/Chameleon-Mini/Memory.c | 594 ++++---- Firmware/Chameleon-Mini/MemoryAsm.S | 106 +- Firmware/Chameleon-Mini/Settings.c | 70 +- Firmware/Chameleon-Mini/Settings.h | 18 +- Firmware/Chameleon-Mini/System.c | 22 +- Firmware/Chameleon-Mini/System.h | 10 +- .../Chameleon-Mini/Terminal/CommandLine.c | 282 ++-- Firmware/Chameleon-Mini/Terminal/Commands.c | 444 +++--- Firmware/Chameleon-Mini/Terminal/Terminal.c | 70 +- Firmware/Chameleon-Mini/Terminal/Terminal.h | 8 +- Firmware/Chameleon-Mini/Terminal/XModem.c | 2 +- 40 files changed, 2895 insertions(+), 2895 deletions(-) diff --git a/Firmware/Chameleon-Mini/AntennaLevel.c b/Firmware/Chameleon-Mini/AntennaLevel.c index 30baed6..15aa284 100644 --- a/Firmware/Chameleon-Mini/AntennaLevel.c +++ b/Firmware/Chameleon-Mini/AntennaLevel.c @@ -6,14 +6,14 @@ void AntennaLevelTick(void) { - uint16_t rssi = AntennaLevelGet(); + uint16_t rssi = AntennaLevelGet(); - if (rssi < FIELD_MIN_RSSI) - { - LEDHook(LED_FIELD_DETECTED, LED_OFF); - if (ActiveConfiguration.UidSize != 0) // this implies that we are emulating right now - ApplicationReset(); // reset the application just like a real card gets reset when there is no field - } else { - LEDHook(LED_FIELD_DETECTED, LED_ON); - } + if (rssi < FIELD_MIN_RSSI) + { + LEDHook(LED_FIELD_DETECTED, LED_OFF); + if (ActiveConfiguration.UidSize != 0) // this implies that we are emulating right now + ApplicationReset(); // reset the application just like a real card gets reset when there is no field + } else { + LEDHook(LED_FIELD_DETECTED, LED_ON); + } } diff --git a/Firmware/Chameleon-Mini/AntennaLevel.h b/Firmware/Chameleon-Mini/AntennaLevel.h index 5af7368..2ca58e4 100644 --- a/Firmware/Chameleon-Mini/AntennaLevel.h +++ b/Firmware/Chameleon-Mini/AntennaLevel.h @@ -25,27 +25,27 @@ static inline void AntennaLevelInit(void) { - ADCA.CTRLA = ADC_ENABLE_bm; - ADCA.CTRLB = ADC_RESOLUTION_12BIT_gc; - ADCA.REFCTRL = ADC_REFSEL_INT1V_gc | ADC_BANDGAP_bm; - ADCA.PRESCALER = ADC_PRESCALER_DIV32_gc; - ADCA.CH0.CTRL = ADC_CH_INPUTMODE_SINGLEENDED_gc; - ADCA.CH0.MUXCTRL = ADC_CH_MUXPOS_PIN1_gc; + ADCA.CTRLA = ADC_ENABLE_bm; + ADCA.CTRLB = ADC_RESOLUTION_12BIT_gc; + ADCA.REFCTRL = ADC_REFSEL_INT1V_gc | ADC_BANDGAP_bm; + ADCA.PRESCALER = ADC_PRESCALER_DIV32_gc; + ADCA.CH0.CTRL = ADC_CH_INPUTMODE_SINGLEENDED_gc; + ADCA.CH0.MUXCTRL = ADC_CH_MUXPOS_PIN1_gc; } static inline uint16_t AntennaLevelGet(void) { - ADCA.CH0.CTRL |= ADC_CH_START_bm; - while( !(ADCA.CH0.INTFLAGS & ADC_CH_CHIF_bm) ); + ADCA.CH0.CTRL |= ADC_CH_START_bm; + while( !(ADCA.CH0.INTFLAGS & ADC_CH_CHIF_bm) ); - ADCA.CH0.INTFLAGS = ADC_CH_CHIF_bm; + ADCA.CH0.INTFLAGS = ADC_CH_CHIF_bm; - int16_t Result = ADCA.CH0RES - ANTENNA_LEVEL_OFFSET; - if (Result < 0) Result = 0; + int16_t Result = ADCA.CH0RES - ANTENNA_LEVEL_OFFSET; + if (Result < 0) Result = 0; - return (uint16_t) (((uint32_t) Result * ANTENNA_LEVEL_NUMERATOR) / ANTENNA_LEVEL_DENOMINATOR); + return (uint16_t) (((uint32_t) Result * ANTENNA_LEVEL_NUMERATOR) / ANTENNA_LEVEL_DENOMINATOR); } void AntennaLevelTick(void); diff --git a/Firmware/Chameleon-Mini/Application/Application.h b/Firmware/Chameleon-Mini/Application/Application.h index 6667477..0b94960 100644 --- a/Firmware/Chameleon-Mini/Application/Application.h +++ b/Firmware/Chameleon-Mini/Application/Application.h @@ -23,11 +23,11 @@ INLINE void ApplicationInit(void) { } INLINE void ApplicationTask(void) { - ActiveConfiguration.ApplicationTaskFunc(); + ActiveConfiguration.ApplicationTaskFunc(); } INLINE void ApplicationTick(void) { - ActiveConfiguration.ApplicationTickFunc(); + ActiveConfiguration.ApplicationTickFunc(); } INLINE uint16_t ApplicationProcess(uint8_t* ByteBuffer, uint16_t ByteCount) { diff --git a/Firmware/Chameleon-Mini/Application/Crypto1.c b/Firmware/Chameleon-Mini/Application/Crypto1.c index f4f3d18..6be6780 100644 --- a/Firmware/Chameleon-Mini/Application/Crypto1.c +++ b/Firmware/Chameleon-Mini/Application/Crypto1.c @@ -50,42 +50,42 @@ /* Used for LFSR setup. */ #define SPLIT_BYTE(__even, __odd, __byte) \ __asm__ __volatile__ ( \ - "lsr %2" "\n\t" \ - "ror %0" "\n\t" \ - "lsr %2" "\n\t" \ - "ror %1" "\n\t" \ - "lsr %2" "\n\t" \ - "ror %0" "\n\t" \ - "lsr %2" "\n\t" \ - "ror %1" "\n\t" \ - "lsr %2" "\n\t" \ - "ror %0" "\n\t" \ - "lsr %2" "\n\t" \ - "ror %1" "\n\t" \ - "lsr %2" "\n\t" \ - "ror %0" "\n\t" \ - "lsr %2" "\n\t" \ - "ror %1" \ - : "+r" (__even), \ + "lsr %2" "\n\t" \ + "ror %0" "\n\t" \ + "lsr %2" "\n\t" \ + "ror %1" "\n\t" \ + "lsr %2" "\n\t" \ + "ror %0" "\n\t" \ + "lsr %2" "\n\t" \ + "ror %1" "\n\t" \ + "lsr %2" "\n\t" \ + "ror %0" "\n\t" \ + "lsr %2" "\n\t" \ + "ror %1" "\n\t" \ + "lsr %2" "\n\t" \ + "ror %0" "\n\t" \ + "lsr %2" "\n\t" \ + "ror %1" \ + : "+r" (__even), \ "+r" (__odd), \ - "+r" (__byte) \ + "+r" (__byte) \ : \ - : "r0" ) + : "r0" ) /* Shift half LFSR state stored in three registers */ /* Input is bit 0 of __in */ #define SHIFT24(__b0, __b1, __b2, __in) \ __asm__ __volatile__ ( \ - "lsr %3" "\n\t" \ - "ror %2" "\n\t" \ - "ror %1" "\n\t" \ - "ror %0" \ - : "+r" (__b0), \ + "lsr %3" "\n\t" \ + "ror %2" "\n\t" \ + "ror %1" "\n\t" \ + "ror %0" \ + : "+r" (__b0), \ "+r" (__b1), \ "+r" (__b2), \ - "+r" (__in) \ + "+r" (__in) \ : \ - : ) + : ) /* Shift half LFSR state stored in three registers */ /* Input is bit 0 of __in */ @@ -93,29 +93,29 @@ #define SHIFT24_COND_DECRYPT(__b0, __b1, __b2, __in, __stream, __decrypt) \ __asm__ __volatile__ ( \ "sbrc %5, 0" "\n\t" \ - "eor %3, %4" "\n\t" \ + "eor %3, %4" "\n\t" \ "lsr %3" "\n\t" \ - "ror %2" "\n\t" \ - "ror %1" "\n\t" \ - "ror %0" \ - : "+r" (__b0), \ + "ror %2" "\n\t" \ + "ror %1" "\n\t" \ + "ror %0" \ + : "+r" (__b0), \ "+r" (__b1), \ "+r" (__b2), \ - "+r" (__in) \ - : "r" (__stream), \ - "r" (__decrypt) \ - : "r0" ) + "+r" (__in) \ + : "r" (__stream), \ + "r" (__decrypt) \ + : "r0" ) /* Shift a byte with input from an other byte */ /* Input is bit 0 of __in */ #define SHIFT8(__byte, __in) \ - __asm__ __volatile__ ( \ - "lsr %1" "\n\t" \ - "ror %0" \ - : "+r" (__byte), \ - "+r" (__in) \ + __asm__ __volatile__ ( \ + "lsr %1" "\n\t" \ + "ror %0" \ + : "+r" (__byte), \ + "+r" (__in) \ : \ - : "r0" ) + : "r0" ) /* End AVR specific */ #else @@ -142,14 +142,14 @@ #define SHIFT8(__byte, __in) __byte = (__byte>>1) | ((__in)<<7) #define SPLIT_BYTE(__even, __odd, __byte) \ - __even = (__even >> 1) | (__byte<<7); __byte>>=1; \ - __odd = (__odd >> 1) | (__byte<<7); __byte>>=1; \ - __even = (__even >> 1) | (__byte<<7); __byte>>=1; \ - __odd = (__odd >> 1) | (__byte<<7); __byte>>=1; \ - __even = (__even >> 1) | (__byte<<7); __byte>>=1; \ - __odd = (__odd >> 1) | (__byte<<7); __byte>>=1; \ - __even = (__even >> 1) | (__byte<<7); __byte>>=1; \ - __odd = (__odd >> 1) | (__byte<<7) + __even = (__even >> 1) | (__byte<<7); __byte>>=1; \ + __odd = (__odd >> 1) | (__byte<<7); __byte>>=1; \ + __even = (__even >> 1) | (__byte<<7); __byte>>=1; \ + __odd = (__odd >> 1) | (__byte<<7); __byte>>=1; \ + __even = (__even >> 1) | (__byte<<7); __byte>>=1; \ + __odd = (__odd >> 1) | (__byte<<7); __byte>>=1; \ + __even = (__even >> 1) | (__byte<<7); __byte>>=1; \ + __odd = (__odd >> 1) | (__byte<<7) /* Generate odd parity bit */ @@ -319,26 +319,26 @@ static const uint8_t TableC3[32] = { /* Filter Output Macros */ /* Output at bit 7 for optimized byte processing */ #define CRYPTO1_FILTER_OUTPUT_B7_24(__O0, __O1, __O2) TableC7[ abFilterTable[0][__O0] | \ - abFilterTable[1][__O1] | \ - abFilterTable[2][__O2]] + abFilterTable[1][__O1] | \ + abFilterTable[2][__O2]] /* Output at bit 3 for optimized nibble processing */ #define CRYPTO1_FILTER_OUTPUT_B3_24(__O0, __O1, __O2) TableC3[ abFilterTable[0][__O0] | \ - abFilterTable[1][__O1] | \ - abFilterTable[2][__O2]] + abFilterTable[1][__O1] | \ + abFilterTable[2][__O2]] /* Output at bit 0 for general purpose */ #define CRYPTO1_FILTER_OUTPUT_B0_24(__O0, __O1, __O2) TableC0[ abFilterTable[0][__O0] | \ - abFilterTable[1][__O1] | \ - abFilterTable[2][__O2]] + abFilterTable[1][__O1] | \ + abFilterTable[2][__O2]] /* Split Crypto1 state into even and odd bits */ /* to speed up the output filter network */ /* Put both into one struct to enable relative adressing */ typedef struct { - uint8_t Even[LFSR_SIZE/2]; - uint8_t Odd[LFSR_SIZE/2]; + uint8_t Even[LFSR_SIZE/2]; + uint8_t Odd[LFSR_SIZE/2]; } Crypto1LfsrState_t; static Crypto1LfsrState_t State = {{0},{0}}; @@ -346,35 +346,35 @@ static Crypto1LfsrState_t State = {{0},{0}}; /* Debug output of state */ void Crypto1GetState(uint8_t* pEven, uint8_t* pOdd) { - if (pEven) - { - pEven[0] = State.Even[0]; - pEven[1] = State.Even[1]; - pEven[2] = State.Even[2]; - } - if (pOdd) - { - pOdd[0] = State.Odd[0]; - pOdd[1] = State.Odd[1]; - pOdd[2] = State.Odd[2]; - } + if (pEven) + { + pEven[0] = State.Even[0]; + pEven[1] = State.Even[1]; + pEven[2] = State.Even[2]; + } + if (pOdd) + { + pOdd[0] = State.Odd[0]; + pOdd[1] = State.Odd[1]; + pOdd[2] = State.Odd[2]; + } } /* Proceed LFSR by one clock cycle */ /* Prototype to force inlining */ static __inline__ uint8_t Crypto1LFSRbyteFeedback (uint8_t E0, - uint8_t E1, - uint8_t E2, - uint8_t O0, - uint8_t O1, - uint8_t O2) __attribute__((always_inline)); + uint8_t E1, + uint8_t E2, + uint8_t O0, + uint8_t O1, + uint8_t O2) __attribute__((always_inline)); static uint8_t Crypto1LFSRbyteFeedback (uint8_t E0, - uint8_t E1, - uint8_t E2, - uint8_t O0, - uint8_t O1, - uint8_t O2) + uint8_t E1, + uint8_t E2, + uint8_t O0, + uint8_t O1, + uint8_t O2) { uint8_t Feedback; @@ -448,8 +448,8 @@ uint8_t Crypto1FilterOutput(void) { /* Setup LFSR split into odd and even states, feed in uid ^nonce */ /* Version for first (not nested) authentication. */ void Crypto1Setup(uint8_t Key[6], - uint8_t Uid[4], - uint8_t CardNonce[4]) + uint8_t Uid[4], + uint8_t CardNonce[4]) { /* state registers */ register uint8_t Even0, Even1, Even2; @@ -1061,32 +1061,32 @@ void Crypto1PRNG(uint8_t State[4], uint8_t ClockCount) void Crypto1EncryptWithParity(uint8_t * Buffer, uint8_t BitCount) { - uint8_t i = 0; - while (i < BitCount) - { - Buffer[i/8] ^= - CRYPTO1_FILTER_OUTPUT_B0_24(State.Odd[0], State.Odd[1], State.Odd[2]) - << (i % 8); - if (++i % 9 != 0) // only shift, if this was no parity bit - Crypto1LFSR(0); - } + uint8_t i = 0; + while (i < BitCount) + { + Buffer[i/8] ^= + CRYPTO1_FILTER_OUTPUT_B0_24(State.Odd[0], State.Odd[1], State.Odd[2]) + << (i % 8); + if (++i % 9 != 0) // only shift, if this was no parity bit + Crypto1LFSR(0); + } } void Crypto1ReaderAuthWithParity(uint8_t PlainReaderAnswerWithParityBits[9]) { - uint8_t i = 0, feedback; - while (i < 72) - { - feedback = PlainReaderAnswerWithParityBits[i/8] >> (i % 8); - PlainReaderAnswerWithParityBits[i/8] ^= - CRYPTO1_FILTER_OUTPUT_B0_24(State.Odd[0], State.Odd[1], State.Odd[2]) - << (i % 8); - if (++i % 9 != 0) // only shift, if this was no parity bit - { - if (i <= 36) - Crypto1LFSR(feedback & 1); - else - Crypto1LFSR(0); - } - } + uint8_t i = 0, feedback; + while (i < 72) + { + feedback = PlainReaderAnswerWithParityBits[i/8] >> (i % 8); + PlainReaderAnswerWithParityBits[i/8] ^= + CRYPTO1_FILTER_OUTPUT_B0_24(State.Odd[0], State.Odd[1], State.Odd[2]) + << (i % 8); + if (++i % 9 != 0) // only shift, if this was no parity bit + { + if (i <= 36) + Crypto1LFSR(feedback & 1); + else + Crypto1LFSR(0); + } + } } diff --git a/Firmware/Chameleon-Mini/Application/ISO14443-3A.h b/Firmware/Chameleon-Mini/Application/ISO14443-3A.h index be55418..a8c1663 100644 --- a/Firmware/Chameleon-Mini/Application/ISO14443-3A.h +++ b/Firmware/Chameleon-Mini/Application/ISO14443-3A.h @@ -93,16 +93,16 @@ bool ISO14443ASelect(void* Buffer, uint16_t* BitCount, uint8_t* UidCL, uint8_t S } default: { - uint8_t CollisionByteCount = ((NVB >> 4) & 0x0f) - 2; - uint8_t CollisionBitCount = (NVB >> 0) & 0x0f; - uint8_t mask = 0xFF >> (8 - CollisionBitCount); - // Since the UidCL does not contain the BCC, we have to distinguish here + uint8_t CollisionByteCount = ((NVB >> 4) & 0x0f) - 2; + uint8_t CollisionBitCount = (NVB >> 0) & 0x0f; + uint8_t mask = 0xFF >> (8 - CollisionBitCount); + // Since the UidCL does not contain the BCC, we have to distinguish here if ( - ((CollisionByteCount == 5 || (CollisionByteCount == 4 && CollisionBitCount > 0)) && memcmp(UidCL, &DataPtr[2], 4) == 0 && (ISO14443A_CALC_BCC(UidCL) & mask) == (DataPtr[6] & mask)) - || - (CollisionByteCount == 4 && CollisionBitCount == 0 && memcmp(UidCL, &DataPtr[2], 4) == 0) - || - (CollisionByteCount < 4 && memcmp(UidCL, &DataPtr[2], CollisionByteCount) == 0 && (UidCL[CollisionByteCount] & mask) == (DataPtr[CollisionByteCount + 2] & mask)) + ((CollisionByteCount == 5 || (CollisionByteCount == 4 && CollisionBitCount > 0)) && memcmp(UidCL, &DataPtr[2], 4) == 0 && (ISO14443A_CALC_BCC(UidCL) & mask) == (DataPtr[6] & mask)) + || + (CollisionByteCount == 4 && CollisionBitCount == 0 && memcmp(UidCL, &DataPtr[2], 4) == 0) + || + (CollisionByteCount < 4 && memcmp(UidCL, &DataPtr[2], CollisionByteCount) == 0 && (UidCL[CollisionByteCount] & mask) == (DataPtr[CollisionByteCount + 2] & mask)) ) { DataPtr[0] = UidCL[0]; @@ -113,7 +113,7 @@ bool ISO14443ASelect(void* Buffer, uint16_t* BitCount, uint8_t* UidCL, uint8_t S *BitCount = ISO14443A_CL_FRAME_SIZE; } else { - *BitCount = 0; + *BitCount = 0; } return false; } @@ -137,7 +137,7 @@ bool ISO14443AWakeUp(void* Buffer, uint16_t* BitCount, uint16_t ATQAValue, bool return true; } else { - *BitCount = 0; + *BitCount = 0; return false; } diff --git a/Firmware/Chameleon-Mini/Application/MifareClassic.c b/Firmware/Chameleon-Mini/Application/MifareClassic.c index 093a570..e96cf45 100644 --- a/Firmware/Chameleon-Mini/Application/MifareClassic.c +++ b/Firmware/Chameleon-Mini/Application/MifareClassic.c @@ -86,7 +86,7 @@ Source: NXP: MF1S50YYX Product data sheet Access conditions for the sector trailer Access bits Access condition for Remark - KEYA Access bits KEYB + KEYA Access bits KEYB C1 C2 C3 read write read write read write 0 0 0 never key A key A never key A key A Key B may be read[1] 0 1 0 never never key A never key A never Key B may be read[1] @@ -137,124 +137,124 @@ C1 C2 C3 read write increment decrement, /* Decoding table for Access conditions of a data block */ static const uint8_t abBlockAccessConditions[8][2] = { - /*C1C2C3 */ - /* 0 0 0 R:key A|B W: key A|B I:key A|B D:key A|B transport configuration */ - { - /* Access with Key A */ - ACC_BLOCK_READ | ACC_BLOCK_WRITE | ACC_BLOCK_INCREMENT | ACC_BLOCK_DECREMENT, - /* Access with Key B */ - ACC_BLOCK_READ | ACC_BLOCK_WRITE | ACC_BLOCK_INCREMENT | ACC_BLOCK_DECREMENT - }, - /* 1 0 0 R:key A|B W:key B I:never D:never read/write block */ - { - /* Access with Key A */ - ACC_BLOCK_READ, - /* Access with Key B */ - ACC_BLOCK_READ | ACC_BLOCK_WRITE - }, - /* 0 1 0 R:key A|B W:never I:never D:never read/write block */ - { - /* Access with Key A */ - ACC_BLOCK_READ, - /* Access with Key B */ - ACC_BLOCK_READ - }, - /* 1 1 0 R:key A|B W:key B I:key B D:key A|B value block */ - { - /* Access with Key A */ - ACC_BLOCK_READ | ACC_BLOCK_DECREMENT, - /* Access with Key B */ - ACC_BLOCK_READ | ACC_BLOCK_WRITE | ACC_BLOCK_INCREMENT | ACC_BLOCK_DECREMENT - }, - /* 0 0 1 R:key A|B W:never I:never D:key A|B value block */ - { - /* Access with Key A */ - ACC_BLOCK_READ | ACC_BLOCK_DECREMENT, - /* Access with Key B */ - ACC_BLOCK_READ | ACC_BLOCK_DECREMENT - }, - /* 1 0 1 R:key B W:never I:never D:never read/write block */ - { - /* Access with Key A */ - 0, - /* Access with Key B */ - ACC_BLOCK_READ - }, - /* 0 1 1 R:key B W:key B I:never D:never read/write block */ - { - /* Access with Key A */ - 0, - /* Access with Key B */ - ACC_BLOCK_READ | ACC_BLOCK_WRITE - }, - /* 1 1 1 R:never W:never I:never D:never read/write block */ - { - /* Access with Key A */ - 0, - /* Access with Key B */ - 0 - } + /*C1C2C3 */ + /* 0 0 0 R:key A|B W: key A|B I:key A|B D:key A|B transport configuration */ + { + /* Access with Key A */ + ACC_BLOCK_READ | ACC_BLOCK_WRITE | ACC_BLOCK_INCREMENT | ACC_BLOCK_DECREMENT, + /* Access with Key B */ + ACC_BLOCK_READ | ACC_BLOCK_WRITE | ACC_BLOCK_INCREMENT | ACC_BLOCK_DECREMENT + }, + /* 1 0 0 R:key A|B W:key B I:never D:never read/write block */ + { + /* Access with Key A */ + ACC_BLOCK_READ, + /* Access with Key B */ + ACC_BLOCK_READ | ACC_BLOCK_WRITE + }, + /* 0 1 0 R:key A|B W:never I:never D:never read/write block */ + { + /* Access with Key A */ + ACC_BLOCK_READ, + /* Access with Key B */ + ACC_BLOCK_READ + }, + /* 1 1 0 R:key A|B W:key B I:key B D:key A|B value block */ + { + /* Access with Key A */ + ACC_BLOCK_READ | ACC_BLOCK_DECREMENT, + /* Access with Key B */ + ACC_BLOCK_READ | ACC_BLOCK_WRITE | ACC_BLOCK_INCREMENT | ACC_BLOCK_DECREMENT + }, + /* 0 0 1 R:key A|B W:never I:never D:key A|B value block */ + { + /* Access with Key A */ + ACC_BLOCK_READ | ACC_BLOCK_DECREMENT, + /* Access with Key B */ + ACC_BLOCK_READ | ACC_BLOCK_DECREMENT + }, + /* 1 0 1 R:key B W:never I:never D:never read/write block */ + { + /* Access with Key A */ + 0, + /* Access with Key B */ + ACC_BLOCK_READ + }, + /* 0 1 1 R:key B W:key B I:never D:never read/write block */ + { + /* Access with Key A */ + 0, + /* Access with Key B */ + ACC_BLOCK_READ | ACC_BLOCK_WRITE + }, + /* 1 1 1 R:never W:never I:never D:never read/write block */ + { + /* Access with Key A */ + 0, + /* Access with Key B */ + 0 + } }; /* Decoding table for Access conditions of the sector trailor */ static const uint8_t abTrailorAccessConditions[8][2] = { - /* 0 0 0 RdKA:never WrKA:key A RdAcc:key A WrAcc:never RdKB:key A WrKB:key A Key B may be read[1] */ - { - /* Access with Key A */ - ACC_TRAILOR_WRITE_KEYA | ACC_TRAILOR_READ_ACC | ACC_TRAILOR_WRITE_ACC | ACC_TRAILOR_READ_KEYB | ACC_TRAILOR_WRITE_KEYB, - /* Access with Key B */ - 0 - }, - /* 1 0 0 RdKA:never WrKA:key B RdAcc:keyA|B WrAcc:never RdKB:never WrKB:key B */ - { - /* Access with Key A */ - ACC_TRAILOR_READ_ACC, - /* Access with Key B */ - ACC_TRAILOR_WRITE_KEYA | ACC_TRAILOR_READ_ACC | ACC_TRAILOR_WRITE_KEYB - }, - /* 0 1 0 RdKA:never WrKA:never RdAcc:key A WrAcc:never RdKB:key A WrKB:never Key B may be read[1] */ - { - /* Access with Key A */ - ACC_TRAILOR_READ_ACC | ACC_TRAILOR_READ_KEYB, - /* Access with Key B */ - 0 - }, - /* 1 1 0 never never keyA|B never never never */ - { - /* Access with Key A */ - ACC_TRAILOR_READ_ACC, - /* Access with Key B */ - ACC_TRAILOR_READ_ACC - }, - /* 0 0 1 never key A key A key A key A key A Key B may be read,transport configuration[1] */ - { - /* Access with Key A */ - ACC_TRAILOR_WRITE_KEYA | ACC_TRAILOR_READ_ACC | ACC_TRAILOR_WRITE_ACC | ACC_TRAILOR_READ_KEYB | ACC_TRAILOR_WRITE_KEYB, - /* Access with Key B */ - 0 - }, - /* 0 1 1 never key B keyA|B key B never key B */ - { - /* Access with Key A */ - ACC_TRAILOR_READ_ACC, - /* Access with Key B */ - ACC_TRAILOR_WRITE_KEYA | ACC_TRAILOR_READ_ACC | ACC_TRAILOR_WRITE_ACC | ACC_TRAILOR_WRITE_KEYB - }, - /* 1 0 1 never never keyA|B key B never never */ - { - /* Access with Key A */ - ACC_TRAILOR_READ_ACC, - /* Access with Key B */ - ACC_TRAILOR_READ_ACC | ACC_TRAILOR_WRITE_ACC - }, - /* 1 1 1 never never keyA|B never never never */ - { - /* Access with Key A */ - ACC_TRAILOR_READ_ACC, - /* Access with Key B */ - ACC_TRAILOR_READ_ACC - }, + /* 0 0 0 RdKA:never WrKA:key A RdAcc:key A WrAcc:never RdKB:key A WrKB:key A Key B may be read[1] */ + { + /* Access with Key A */ + ACC_TRAILOR_WRITE_KEYA | ACC_TRAILOR_READ_ACC | ACC_TRAILOR_WRITE_ACC | ACC_TRAILOR_READ_KEYB | ACC_TRAILOR_WRITE_KEYB, + /* Access with Key B */ + 0 + }, + /* 1 0 0 RdKA:never WrKA:key B RdAcc:keyA|B WrAcc:never RdKB:never WrKB:key B */ + { + /* Access with Key A */ + ACC_TRAILOR_READ_ACC, + /* Access with Key B */ + ACC_TRAILOR_WRITE_KEYA | ACC_TRAILOR_READ_ACC | ACC_TRAILOR_WRITE_KEYB + }, + /* 0 1 0 RdKA:never WrKA:never RdAcc:key A WrAcc:never RdKB:key A WrKB:never Key B may be read[1] */ + { + /* Access with Key A */ + ACC_TRAILOR_READ_ACC | ACC_TRAILOR_READ_KEYB, + /* Access with Key B */ + 0 + }, + /* 1 1 0 never never keyA|B never never never */ + { + /* Access with Key A */ + ACC_TRAILOR_READ_ACC, + /* Access with Key B */ + ACC_TRAILOR_READ_ACC + }, + /* 0 0 1 never key A key A key A key A key A Key B may be read,transport configuration[1] */ + { + /* Access with Key A */ + ACC_TRAILOR_WRITE_KEYA | ACC_TRAILOR_READ_ACC | ACC_TRAILOR_WRITE_ACC | ACC_TRAILOR_READ_KEYB | ACC_TRAILOR_WRITE_KEYB, + /* Access with Key B */ + 0 + }, + /* 0 1 1 never key B keyA|B key B never key B */ + { + /* Access with Key A */ + ACC_TRAILOR_READ_ACC, + /* Access with Key B */ + ACC_TRAILOR_WRITE_KEYA | ACC_TRAILOR_READ_ACC | ACC_TRAILOR_WRITE_ACC | ACC_TRAILOR_WRITE_KEYB + }, + /* 1 0 1 never never keyA|B key B never never */ + { + /* Access with Key A */ + ACC_TRAILOR_READ_ACC, + /* Access with Key B */ + ACC_TRAILOR_READ_ACC | ACC_TRAILOR_WRITE_ACC + }, + /* 1 1 1 never never keyA|B never never never */ + { + /* Access with Key A */ + ACC_TRAILOR_READ_ACC, + /* Access with Key B */ + ACC_TRAILOR_READ_ACC + }, }; static enum { @@ -309,17 +309,17 @@ INLINE uint8_t GetAccessCondition(uint8_t Block) } /* Fix for MFClassic 4K cards */ if(Block<128) - Block &= 3; + Block &= 3; else { - Block &= 15; - if (Block& 15) - Block=3; - else if (Block<=4) - Block=0; - else if (Block<=9) - Block=1; - else - Block=2; + Block &= 15; + if (Block& 15) + Block=3; + else if (Block<=4) + Block=0; + else if (Block<=9) + Block=1; + else + Block=2; } Acc0 = ~Acc0; /* C1x Bits to bit 0..3 */ @@ -431,7 +431,7 @@ uint16_t MifareClassicAppProcess(uint8_t* Buffer, uint16_t BitCount) /* precheck of WUP/REQ because ISO14443AWakeUp destroys BitCount */ (((State != STATE_HALT) && (Buffer[0] == ISO14443A_CMD_REQA)) || (Buffer[0] == ISO14443A_CMD_WUPA) )){ - FromHalt = State == STATE_HALT; + FromHalt = State == STATE_HALT; if (ISO14443AWakeUp(Buffer, &BitCount, CardATQAValue, FromHalt)) { AccessAddress = 0xff; State = STATE_READY1; @@ -442,7 +442,7 @@ uint16_t MifareClassicAppProcess(uint8_t* Buffer, uint16_t BitCount) switch(State) { case STATE_IDLE: case STATE_HALT: - FromHalt = State == STATE_HALT; + FromHalt = State == STATE_HALT; if (ISO14443AWakeUp(Buffer, &BitCount, CardATQAValue, FromHalt)) { State = STATE_READY1; return BitCount; @@ -499,7 +499,7 @@ uint16_t MifareClassicAppProcess(uint8_t* Buffer, uint16_t BitCount) if (ISO14443ACheckCRCA(Buffer, CMD_HALT_FRAME_SIZE)) { /* According to ISO14443, we must not send anything * in order to acknowledge the HALT command. */ - LogEntry(LOG_INFO_APP_CMD_HALT, NULL, 0); + LogEntry(LOG_INFO_APP_CMD_HALT, NULL, 0); State = STATE_HALT; return ISO14443A_APP_NO_RESPONSE; } else { @@ -538,17 +538,17 @@ uint16_t MifareClassicAppProcess(uint8_t* Buffer, uint16_t BitCount) } else if (Buffer[0] == ISO14443A_CMD_SELECT_CL1) { /* Load UID CL1 and perform anticollision */ uint8_t UidCL1[ISO14443A_CL_UID_SIZE]; - /* For Longer UIDs indicate that more UID-Bytes follow (-> CL2) */ + /* For Longer UIDs indicate that more UID-Bytes follow (-> CL2) */ if (ActiveConfiguration.UidSize == 7) { - MemoryReadBlock(&UidCL1[1], MEM_UID_CL1_ADDRESS, MEM_UID_CL1_SIZE-1); - UidCL1[0] = ISO14443A_UID0_CT; - if (ISO14443ASelect(Buffer, &BitCount, UidCL1, SAK_UID_NOT_FINISHED)) - State = STATE_READY2; + MemoryReadBlock(&UidCL1[1], MEM_UID_CL1_ADDRESS, MEM_UID_CL1_SIZE-1); + UidCL1[0] = ISO14443A_UID0_CT; + if (ISO14443ASelect(Buffer, &BitCount, UidCL1, SAK_UID_NOT_FINISHED)) + State = STATE_READY2; } else { - MemoryReadBlock(UidCL1, MEM_UID_CL1_ADDRESS, MEM_UID_CL1_SIZE); - if (ISO14443ASelect(Buffer, &BitCount, UidCL1, CardSAKValue)) { + MemoryReadBlock(UidCL1, MEM_UID_CL1_ADDRESS, MEM_UID_CL1_SIZE); + if (ISO14443ASelect(Buffer, &BitCount, UidCL1, CardSAKValue)) { AccessAddress = 0xff; /* invalid, force reload */ - State = STATE_ACTIVE; + State = STATE_ACTIVE; } } @@ -562,21 +562,21 @@ uint16_t MifareClassicAppProcess(uint8_t* Buffer, uint16_t BitCount) case STATE_READY2: if (ISO14443AWakeUp(Buffer, &BitCount, CardATQAValue, FromHalt)) { State = FromHalt ? STATE_HALT : STATE_IDLE; - return ISO14443A_APP_NO_RESPONSE; - } else if (Buffer[0] == ISO14443A_CMD_SELECT_CL2) { - /* Load UID CL2 and perform anticollision */ - uint8_t UidCL2[ISO14443A_CL_UID_SIZE]; - MemoryReadBlock(UidCL2, MEM_UID_CL2_ADDRESS, MEM_UID_CL2_SIZE); + return ISO14443A_APP_NO_RESPONSE; + } else if (Buffer[0] == ISO14443A_CMD_SELECT_CL2) { + /* Load UID CL2 and perform anticollision */ + uint8_t UidCL2[ISO14443A_CL_UID_SIZE]; + MemoryReadBlock(UidCL2, MEM_UID_CL2_ADDRESS, MEM_UID_CL2_SIZE); - if (ISO14443ASelect(Buffer, &BitCount, UidCL2, CardSAKValue)) { + if (ISO14443ASelect(Buffer, &BitCount, UidCL2, CardSAKValue)) { AccessAddress = 0xff; /* invalid, force reload */ - State = STATE_ACTIVE; - } + State = STATE_ACTIVE; + } - return BitCount; - } else { - /* Unknown command. Enter HALT state. */ - State = STATE_HALT; + return BitCount; + } else { + /* Unknown command. Enter HALT state. */ + State = STATE_HALT; } break; case STATE_ACTIVE: @@ -590,9 +590,9 @@ uint16_t MifareClassicAppProcess(uint8_t* Buffer, uint16_t BitCount) if (ISO14443ACheckCRCA(Buffer, CMD_HALT_FRAME_SIZE)) { /* According to ISO14443, we must not send anything * in order to acknowledge the HALT command. */ - LogEntry(LOG_INFO_APP_CMD_HALT, NULL, 0); + LogEntry(LOG_INFO_APP_CMD_HALT, NULL, 0); - State = STATE_HALT; + State = STATE_HALT; return ISO14443A_APP_NO_RESPONSE; } else { Buffer[0] = NAK_CRC_ERROR; @@ -603,93 +603,93 @@ uint16_t MifareClassicAppProcess(uint8_t* Buffer, uint16_t BitCount) return ACK_NAK_FRAME_SIZE; } } else if ( (Buffer[0] == CMD_AUTH_A) || (Buffer[0] == CMD_AUTH_B)) { - if (ISO14443ACheckCRCA(Buffer, CMD_AUTH_FRAME_SIZE)) { + if (ISO14443ACheckCRCA(Buffer, CMD_AUTH_FRAME_SIZE)) { - //uint16_t SectorAddress = Buffer[1] & MEM_SECTOR_ADDR_MASK; - uint16_t KeyOffset = (Buffer[0] == CMD_AUTH_A ? MEM_KEY_A_OFFSET : MEM_KEY_B_OFFSET); - uint16_t AccessOffset = MEM_KEY_A_OFFSET + MEM_KEY_SIZE; - uint16_t SectorStartAddress; - uint8_t Key[6]; - uint8_t Uid[4]; - uint8_t CardNonce[8]; + //uint16_t SectorAddress = Buffer[1] & MEM_SECTOR_ADDR_MASK; + uint16_t KeyOffset = (Buffer[0] == CMD_AUTH_A ? MEM_KEY_A_OFFSET : MEM_KEY_B_OFFSET); + uint16_t AccessOffset = MEM_KEY_A_OFFSET + MEM_KEY_SIZE; + uint16_t SectorStartAddress; + uint8_t Key[6]; + uint8_t Uid[4]; + uint8_t CardNonce[8]; - /* Fix for MFClassic 4k cards */ - if(Buffer[1] >= 128) { - SectorStartAddress = (Buffer[1] & MEM_BIGSECTOR_ADDR_MASK) * MEM_BYTES_PER_BLOCK ; - KeyOffset += MEM_KEY_BIGSECTOR_OFFSET; - AccessOffset += MEM_KEY_BIGSECTOR_OFFSET; - } else { - SectorStartAddress = (Buffer[1] & MEM_SECTOR_ADDR_MASK) * MEM_BYTES_PER_BLOCK ; - } + /* Fix for MFClassic 4k cards */ + if(Buffer[1] >= 128) { + SectorStartAddress = (Buffer[1] & MEM_BIGSECTOR_ADDR_MASK) * MEM_BYTES_PER_BLOCK ; + KeyOffset += MEM_KEY_BIGSECTOR_OFFSET; + AccessOffset += MEM_KEY_BIGSECTOR_OFFSET; + } else { + SectorStartAddress = (Buffer[1] & MEM_SECTOR_ADDR_MASK) * MEM_BYTES_PER_BLOCK ; + } - LogEntry(LOG_INFO_APP_CMD_AUTH, Buffer, 2); - /* set KeyInUse for global use to keep info about authentication */ - KeyInUse = Buffer[0] & 1; - CurrentAddress = SectorStartAddress / MEM_BYTES_PER_BLOCK; - //if (!AccessConditions[MEM_ACC_GPB_SIZE-1] ||(CurrentAddress != AccessAddress)) { - /* Get access conditions from the sector trailor */ - MemoryReadBlock(AccessConditions, SectorStartAddress + AccessOffset, MEM_ACC_GPB_SIZE); - AccessAddress = CurrentAddress; - //} + LogEntry(LOG_INFO_APP_CMD_AUTH, Buffer, 2); + /* set KeyInUse for global use to keep info about authentication */ + KeyInUse = Buffer[0] & 1; + CurrentAddress = SectorStartAddress / MEM_BYTES_PER_BLOCK; + //if (!AccessConditions[MEM_ACC_GPB_SIZE-1] ||(CurrentAddress != AccessAddress)) { + /* Get access conditions from the sector trailor */ + MemoryReadBlock(AccessConditions, SectorStartAddress + AccessOffset, MEM_ACC_GPB_SIZE); + AccessAddress = CurrentAddress; + //} - /* Generate a random nonce and read UID and key from memory */ - RandomGetBuffer(CardNonce, sizeof(CardNonce)); - if (ActiveConfiguration.UidSize == 7) - MemoryReadBlock(Uid, MEM_UID_CL2_ADDRESS, MEM_UID_CL2_SIZE); - else - MemoryReadBlock(Uid, MEM_UID_CL1_ADDRESS, MEM_UID_CL1_SIZE); - MemoryReadBlock(Key, SectorStartAddress + KeyOffset, MEM_KEY_SIZE); + /* Generate a random nonce and read UID and key from memory */ + RandomGetBuffer(CardNonce, sizeof(CardNonce)); + if (ActiveConfiguration.UidSize == 7) + MemoryReadBlock(Uid, MEM_UID_CL2_ADDRESS, MEM_UID_CL2_SIZE); + else + MemoryReadBlock(Uid, MEM_UID_CL1_ADDRESS, MEM_UID_CL1_SIZE); + MemoryReadBlock(Key, SectorStartAddress + KeyOffset, MEM_KEY_SIZE); - /* Precalculate the reader response from card-nonce */ - for (uint8_t i=0; i= 128) { - SectorStartAddress = (Buffer[1] & MEM_BIGSECTOR_ADDR_MASK) * MEM_BYTES_PER_BLOCK ; - KeyOffset += MEM_KEY_BIGSECTOR_OFFSET; - AccOffset += MEM_KEY_BIGSECTOR_OFFSET; - } else { - SectorStartAddress = (Buffer[1] & MEM_SECTOR_ADDR_MASK) * MEM_BYTES_PER_BLOCK ; - } + /* Fix for MFClassic 4k cards */ + if(Buffer[1] >= 128) { + SectorStartAddress = (Buffer[1] & MEM_BIGSECTOR_ADDR_MASK) * MEM_BYTES_PER_BLOCK ; + KeyOffset += MEM_KEY_BIGSECTOR_OFFSET; + AccOffset += MEM_KEY_BIGSECTOR_OFFSET; + } else { + SectorStartAddress = (Buffer[1] & MEM_SECTOR_ADDR_MASK) * MEM_BYTES_PER_BLOCK ; + } - LogEntry(LOG_INFO_APP_CMD_AUTH, Buffer, 2); - /* set KeyInUse for global use to keep info about authentication */ - KeyInUse = Buffer[0] & 1; - CurrentAddress = SectorStartAddress / MEM_BYTES_PER_BLOCK; - if (CurrentAddress != AccessAddress) { - /* Get access conditions from the sector trailor */ - MemoryReadBlock(AccessConditions, SectorStartAddress + AccOffset, MEM_ACC_GPB_SIZE); - AccessAddress = CurrentAddress; - } + LogEntry(LOG_INFO_APP_CMD_AUTH, Buffer, 2); + /* set KeyInUse for global use to keep info about authentication */ + KeyInUse = Buffer[0] & 1; + CurrentAddress = SectorStartAddress / MEM_BYTES_PER_BLOCK; + if (CurrentAddress != AccessAddress) { + /* Get access conditions from the sector trailor */ + MemoryReadBlock(AccessConditions, SectorStartAddress + AccOffset, MEM_ACC_GPB_SIZE); + AccessAddress = CurrentAddress; + } - /* Generate a random nonce and read UID and key from memory */ - RandomGetBuffer(CardNonce, sizeof(CardNonce)); - if (ActiveConfiguration.UidSize == 7) - MemoryReadBlock(Uid, MEM_UID_CL2_ADDRESS, MEM_UID_CL2_SIZE); - else - MemoryReadBlock(Uid, MEM_UID_CL1_ADDRESS, MEM_UID_CL1_SIZE); - MemoryReadBlock(Key, SectorStartAddress + KeyOffset, MEM_KEY_SIZE); + /* Generate a random nonce and read UID and key from memory */ + RandomGetBuffer(CardNonce, sizeof(CardNonce)); + if (ActiveConfiguration.UidSize == 7) + MemoryReadBlock(Uid, MEM_UID_CL2_ADDRESS, MEM_UID_CL2_SIZE); + else + MemoryReadBlock(Uid, MEM_UID_CL1_ADDRESS, MEM_UID_CL1_SIZE); + MemoryReadBlock(Key, SectorStartAddress + KeyOffset, MEM_KEY_SIZE); - /* Precalculate the reader response from card-nonce */ - for (uint8_t i=0; i= Buffer) // loop over all input bytes - { - parity = OddParityBit(*currByte); // get parity bit - tmpByte = lastByte; - while (tmpByte > currByte) // loop over all bytes from the last byte to the current one -- shifts the whole byte string - { - *tmpByte <<= 1; // shift this byte - *tmpByte |= (*(tmpByte-1) & 0x80) >> 7; // insert the last bit from the previous byte - tmpByte--; // go to the previous byte - } - *(++tmpByte) &= 0xFE; // zeroize the bit, where we want to put the parity bit - *tmpByte |= parity & 1; // add the parity bit - currByte--; // go to previous input byte - } - return BitCount + (BitCount / 8); + if (BitCount == 7) + return 7; + if (BitCount % 8) + return BitCount; + uint8_t * currByte, * tmpByte; + uint8_t * const lastByte = Buffer + BitCount/8 + BitCount/64; // starting address + number of bytes + number of parity bytes + currByte = Buffer + BitCount/8 - 1; + uint8_t parity; + memset(currByte+1, 0, lastByte-currByte); // zeroize all bytes used for parity bits + while (currByte >= Buffer) // loop over all input bytes + { + parity = OddParityBit(*currByte); // get parity bit + tmpByte = lastByte; + while (tmpByte > currByte) // loop over all bytes from the last byte to the current one -- shifts the whole byte string + { + *tmpByte <<= 1; // shift this byte + *tmpByte |= (*(tmpByte-1) & 0x80) >> 7; // insert the last bit from the previous byte + tmpByte--; // go to the previous byte + } + *(++tmpByte) &= 0xFE; // zeroize the bit, where we want to put the parity bit + *tmpByte |= parity & 1; // add the parity bit + currByte--; // go to previous input byte + } + return BitCount + (BitCount / 8); } uint16_t removeParityBits(uint8_t * Buffer, uint16_t BitCount) { - if (BitCount == 7) - return 7; + if (BitCount == 7) + return 7; - uint16_t i; - for (i = 0; i < (BitCount / 9); i++) - { - Buffer[i] = (Buffer[i + i/8] >> (i%8)); - if (i%8) - Buffer[i] |= (Buffer[i + i/8 + 1] << (8 - (i % 8))); - } - return BitCount/9*8; + uint16_t i; + for (i = 0; i < (BitCount / 9); i++) + { + Buffer[i] = (Buffer[i + i/8] >> (i%8)); + if (i%8) + Buffer[i] |= (Buffer[i + i/8 + 1] << (8 - (i % 8))); + } + return BitCount/9*8; } uint16_t removeSOC(uint8_t * Buffer, uint16_t BitCount) { - if (BitCount == 0) - return 0; - uint16_t i; - Buffer[0] >>= 1; - for (i = 1; i < (BitCount + 7) / 8; i++) - { - Buffer[i-1] |= Buffer[i] << 7; - Buffer[i] >>= 1; - } - return BitCount - 1; + if (BitCount == 0) + return 0; + uint16_t i; + Buffer[0] >>= 1; + for (i = 1; i < (BitCount + 7) / 8; i++) + { + Buffer[i-1] |= Buffer[i] << 7; + Buffer[i] >>= 1; + } + return BitCount - 1; } bool checkParityBits(uint8_t * Buffer, uint16_t BitCount) { - if (BitCount == 7) - return true; + if (BitCount == 7) + return true; - //if (BitCount % 9 || BitCount == 0) - // return false; + //if (BitCount % 9 || BitCount == 0) + // return false; - uint16_t i; - uint8_t currentByte, parity; - for (i = 0; i < (BitCount / 9); i++) - { - currentByte = (Buffer[i + i/8] >> (i%8)); - if (i%8) - currentByte |= (Buffer[i + i/8 + 1] << (8 - (i % 8))); - parity = OddParityBit(currentByte); - if (((Buffer[i + i/8 + 1] >> (i % 8)) ^ parity) & 1) { - return false; - } - } - return true; + uint16_t i; + uint8_t currentByte, parity; + for (i = 0; i < (BitCount / 9); i++) + { + currentByte = (Buffer[i + i/8] >> (i%8)); + if (i%8) + currentByte |= (Buffer[i + i/8 + 1] << (8 - (i % 8))); + parity = OddParityBit(currentByte); + if (((Buffer[i + i/8 + 1] >> (i % 8)) ^ parity) & 1) { + return false; + } + } + return true; } void Reader14443AAppTimeout(void) { - Reader14443AAppReset(); - Reader14443ACodecReset(); - ReaderState = STATE_IDLE; + Reader14443AAppReset(); + Reader14443ACodecReset(); + ReaderState = STATE_IDLE; } void Reader14443AAppInit(void) { - ReaderState = STATE_IDLE; + ReaderState = STATE_IDLE; } void Reader14443AAppReset(void) { - ReaderState = STATE_IDLE; - Reader14443CurrentCommand = Reader14443_Do_Nothing; - Selected = false; + ReaderState = STATE_IDLE; + Reader14443CurrentCommand = Reader14443_Do_Nothing; + Selected = false; } void Reader14443AAppTask(void) @@ -210,265 +210,265 @@ void Reader14443AAppTick(void) INLINE uint16_t Reader14443A_Deselect(uint8_t* Buffer) // deselects the card because of an error, so we will continue to select the card afterwards { - Buffer[0] = 0xC2; - uint16_t crc = ISO14443_CRCA(Buffer, 1); - Buffer[1] = crc; - Buffer[2] = crc >> 8; - ReaderState = STATE_DESELECT; - Selected = false; - return addParityBits(Buffer, 24); + Buffer[0] = 0xC2; + uint16_t crc = ISO14443_CRCA(Buffer, 1); + Buffer[1] = crc; + Buffer[2] = crc >> 8; + ReaderState = STATE_DESELECT; + Selected = false; + return addParityBits(Buffer, 24); } INLINE uint16_t Reader14443A_Select(uint8_t * Buffer, uint16_t BitCount) { - if (Selected) - { - if (ReaderState > STATE_HALT) - return 0; - else - Selected = false; - } - switch (ReaderState) - { - case STATE_IDLE: - case STATE_HALT: - Reader_FWT = ISO14443A_RX_PENDING_TIMEOUT; - /* Send a REQA */ - Buffer[0] = ISO14443A_CMD_WUPA; // whenever REQA works, WUPA also works, so we choose WUPA always - ReaderState = STATE_READY; - return 7; + if (Selected) + { + if (ReaderState > STATE_HALT) + return 0; + else + Selected = false; + } + switch (ReaderState) + { + case STATE_IDLE: + case STATE_HALT: + Reader_FWT = ISO14443A_RX_PENDING_TIMEOUT; + /* Send a REQA */ + Buffer[0] = ISO14443A_CMD_WUPA; // whenever REQA works, WUPA also works, so we choose WUPA always + ReaderState = STATE_READY; + return 7; - case STATE_READY: - if (BitCount < 19) - { - ReaderState = STATE_IDLE; - Reader14443ACodecStart(); - return 0; - } - BitCount = removeSOC(Buffer, BitCount); - if (!checkParityBits(Buffer, BitCount)) - { - ReaderState = STATE_IDLE; - LogEntry(LOG_ERR_APP_CHECKSUM_FAIL, Buffer, (BitCount + 8) / 7); - Reader14443ACodecStart(); - return 0; - } - BitCount = removeParityBits(Buffer, BitCount); - CardCharacteristics.ATQA = Buffer[1] << 8 | Buffer[0]; // save ATQA for possible later use - Buffer[0] = ISO14443A_CMD_SELECT_CL1; - Buffer[1] = 0x20; // NVB = 16 - ReaderState = STATE_ACTIVE_CL1; - return addParityBits(Buffer, 16); + case STATE_READY: + if (BitCount < 19) + { + ReaderState = STATE_IDLE; + Reader14443ACodecStart(); + return 0; + } + BitCount = removeSOC(Buffer, BitCount); + if (!checkParityBits(Buffer, BitCount)) + { + ReaderState = STATE_IDLE; + LogEntry(LOG_ERR_APP_CHECKSUM_FAIL, Buffer, (BitCount + 8) / 7); + Reader14443ACodecStart(); + return 0; + } + BitCount = removeParityBits(Buffer, BitCount); + CardCharacteristics.ATQA = Buffer[1] << 8 | Buffer[0]; // save ATQA for possible later use + Buffer[0] = ISO14443A_CMD_SELECT_CL1; + Buffer[1] = 0x20; // NVB = 16 + ReaderState = STATE_ACTIVE_CL1; + return addParityBits(Buffer, 16); - case STATE_ACTIVE_CL1 ... STATE_ACTIVE_CL3: - BitCount = removeSOC(Buffer, BitCount); - if (!checkParityBits(Buffer, BitCount) || BitCount < 8) - { - ReaderState = STATE_IDLE; - LogEntry(LOG_ERR_APP_CHECKSUM_FAIL, Buffer, (BitCount + 8) / 7); - Reader14443ACodecStart(); - return 0; - } - BitCount = removeParityBits(Buffer, BitCount); - if (!CHECK_BCC(Buffer)) - { - ReaderState = STATE_IDLE; - Reader14443ACodecStart(); - return 0; - } + case STATE_ACTIVE_CL1 ... STATE_ACTIVE_CL3: + BitCount = removeSOC(Buffer, BitCount); + if (!checkParityBits(Buffer, BitCount) || BitCount < 8) + { + ReaderState = STATE_IDLE; + LogEntry(LOG_ERR_APP_CHECKSUM_FAIL, Buffer, (BitCount + 8) / 7); + Reader14443ACodecStart(); + return 0; + } + BitCount = removeParityBits(Buffer, BitCount); + if (!CHECK_BCC(Buffer)) + { + ReaderState = STATE_IDLE; + Reader14443ACodecStart(); + return 0; + } - if (Buffer[0] == ISO14443A_UID0_CT) - { - memcpy(CardCharacteristics.UID + (ReaderState - STATE_ACTIVE_CL1) * 3, Buffer + 1, 3); - } else { - memcpy(CardCharacteristics.UID + (ReaderState - STATE_ACTIVE_CL1) * 3, Buffer, 4); - } - // shift received UID two bytes to the right - memmove(Buffer+2, Buffer, 5); - Buffer[0] = (ReaderState == STATE_ACTIVE_CL1) ? ISO14443A_CMD_SELECT_CL1 : (ReaderState == STATE_ACTIVE_CL2) ? ISO14443A_CMD_SELECT_CL2 : ISO14443A_CMD_SELECT_CL3; - Buffer[1] = 0x70; // NVB = 56 - uint16_t crc = ISO14443_CRCA(Buffer, 7); - Buffer[7] = crc & 0xFF; - Buffer[8] = crc >> 8; - ReaderState = ReaderState - STATE_ACTIVE_CL1 + STATE_SAK_CL1; - return addParityBits(Buffer, 72); + if (Buffer[0] == ISO14443A_UID0_CT) + { + memcpy(CardCharacteristics.UID + (ReaderState - STATE_ACTIVE_CL1) * 3, Buffer + 1, 3); + } else { + memcpy(CardCharacteristics.UID + (ReaderState - STATE_ACTIVE_CL1) * 3, Buffer, 4); + } + // shift received UID two bytes to the right + memmove(Buffer+2, Buffer, 5); + Buffer[0] = (ReaderState == STATE_ACTIVE_CL1) ? ISO14443A_CMD_SELECT_CL1 : (ReaderState == STATE_ACTIVE_CL2) ? ISO14443A_CMD_SELECT_CL2 : ISO14443A_CMD_SELECT_CL3; + Buffer[1] = 0x70; // NVB = 56 + uint16_t crc = ISO14443_CRCA(Buffer, 7); + Buffer[7] = crc & 0xFF; + Buffer[8] = crc >> 8; + ReaderState = ReaderState - STATE_ACTIVE_CL1 + STATE_SAK_CL1; + return addParityBits(Buffer, 72); - case STATE_SAK_CL1 ... STATE_SAK_CL3: - if (BitCount < 9) - { - ReaderState = STATE_IDLE; - Reader14443ACodecStart(); - return 0; - } - BitCount = removeSOC(Buffer, BitCount); - if (!checkParityBits(Buffer, BitCount)) - { - LogEntry(LOG_ERR_APP_CHECKSUM_FAIL, Buffer, (BitCount + 8) / 7); - ReaderState = STATE_IDLE; - Reader14443ACodecStart(); - return 0; - } - BitCount = removeParityBits(Buffer, BitCount); - if (ISO14443_CRCA(Buffer, 3)) - { - ReaderState = STATE_IDLE; - Reader14443ACodecStart(); - return 0; - } - if (IS_CASCADE_BIT_SET(Buffer) && ReaderState != STATE_SAK_CL3) - { - Buffer[0] = (ReaderState == STATE_SAK_CL1) ? ISO14443A_CMD_SELECT_CL2 : ISO14443A_CMD_SELECT_CL3; - Buffer[1] = 0x20; // NVB = 16 bit - ReaderState = ReaderState - STATE_SAK_CL1 + STATE_ACTIVE_CL1 + 1; - return addParityBits(Buffer, 16); - } else if (IS_CASCADE_BIT_SET(Buffer) && ReaderState == STATE_SAK_CL3) { - // TODO handle this very strange hopefully not happening error - } - Selected = true; - CardCharacteristics.UIDSize = (ReaderState - STATE_SAK_CL1) * 3 + 4; - CardCharacteristics.SAK = Buffer[0]; // save last SAK for possible later use + case STATE_SAK_CL1 ... STATE_SAK_CL3: + if (BitCount < 9) + { + ReaderState = STATE_IDLE; + Reader14443ACodecStart(); + return 0; + } + BitCount = removeSOC(Buffer, BitCount); + if (!checkParityBits(Buffer, BitCount)) + { + LogEntry(LOG_ERR_APP_CHECKSUM_FAIL, Buffer, (BitCount + 8) / 7); + ReaderState = STATE_IDLE; + Reader14443ACodecStart(); + return 0; + } + BitCount = removeParityBits(Buffer, BitCount); + if (ISO14443_CRCA(Buffer, 3)) + { + ReaderState = STATE_IDLE; + Reader14443ACodecStart(); + return 0; + } + if (IS_CASCADE_BIT_SET(Buffer) && ReaderState != STATE_SAK_CL3) + { + Buffer[0] = (ReaderState == STATE_SAK_CL1) ? ISO14443A_CMD_SELECT_CL2 : ISO14443A_CMD_SELECT_CL3; + Buffer[1] = 0x20; // NVB = 16 bit + ReaderState = ReaderState - STATE_SAK_CL1 + STATE_ACTIVE_CL1 + 1; + return addParityBits(Buffer, 16); + } else if (IS_CASCADE_BIT_SET(Buffer) && ReaderState == STATE_SAK_CL3) { + // TODO handle this very strange hopefully not happening error + } + Selected = true; + CardCharacteristics.UIDSize = (ReaderState - STATE_SAK_CL1) * 3 + 4; + CardCharacteristics.SAK = Buffer[0]; // save last SAK for possible later use - return 0; + return 0; - case STATE_DESELECT: - if (BitCount == 0) // most likely the card already understood the deselect - { - ReaderState = STATE_HALT; - Reader14443ACodecStart(); - return 0; - } - BitCount = removeSOC(Buffer, BitCount); - if (!checkParityBits(Buffer, BitCount)) - { - LogEntry(LOG_ERR_APP_CHECKSUM_FAIL, Buffer, (BitCount + 8) / 7); - return Reader14443A_Deselect(Buffer); - } - BitCount = removeParityBits(Buffer, BitCount); - if (ISO14443_CRCA(Buffer, 3)) - { - return Reader14443A_Deselect(Buffer); - } - ReaderState = STATE_HALT; - Reader14443ACodecStart(); - return 0; + case STATE_DESELECT: + if (BitCount == 0) // most likely the card already understood the deselect + { + ReaderState = STATE_HALT; + Reader14443ACodecStart(); + return 0; + } + BitCount = removeSOC(Buffer, BitCount); + if (!checkParityBits(Buffer, BitCount)) + { + LogEntry(LOG_ERR_APP_CHECKSUM_FAIL, Buffer, (BitCount + 8) / 7); + return Reader14443A_Deselect(Buffer); + } + BitCount = removeParityBits(Buffer, BitCount); + if (ISO14443_CRCA(Buffer, 3)) + { + return Reader14443A_Deselect(Buffer); + } + ReaderState = STATE_HALT; + Reader14443ACodecStart(); + return 0; - default: - return 0; - } + default: + return 0; + } } INLINE uint16_t Reader14443A_Halt(uint8_t* Buffer) { - Buffer[0] = ISO14443A_CMD_HLTA; - Buffer[1] = 0x00; - uint16_t crc = ISO14443_CRCA(Buffer, 2); - Buffer[2] = crc; - Buffer[3] = crc >> 8; - ReaderState = STATE_HALT; - Selected = false; - return addParityBits(Buffer, 32); + Buffer[0] = ISO14443A_CMD_HLTA; + Buffer[1] = 0x00; + uint16_t crc = ISO14443_CRCA(Buffer, 2); + Buffer[2] = crc; + Buffer[3] = crc >> 8; + ReaderState = STATE_HALT; + Selected = false; + return addParityBits(Buffer, 32); } INLINE uint16_t Reader14443A_RATS(uint8_t* Buffer) { - Buffer[0] = 0xE0; // RATS command - Buffer[1] = 0x80; - uint16_t crc = ISO14443_CRCA(Buffer, 2); - Buffer[2] = crc; - Buffer[3] = crc >> 8; - ReaderState = STATE_ATS; - return addParityBits(Buffer, 32); + Buffer[0] = 0xE0; // RATS command + Buffer[1] = 0x80; + uint16_t crc = ISO14443_CRCA(Buffer, 2); + Buffer[2] = crc; + Buffer[3] = crc >> 8; + ReaderState = STATE_ATS; + return addParityBits(Buffer, 32); } uint16_t Reader14443AAppProcess(uint8_t* Buffer, uint16_t BitCount) { - switch (Reader14443CurrentCommand) - { - case Reader14443_Send: - { - if (ReaderSendBitCount) - { - memcpy(Buffer, ReaderSendBuffer, (ReaderSendBitCount + 7) / 8); - uint16_t tmp = addParityBits(Buffer, ReaderSendBitCount); - ReaderSendBitCount = 0; - return tmp; - } + switch (Reader14443CurrentCommand) + { + case Reader14443_Send: + { + if (ReaderSendBitCount) + { + memcpy(Buffer, ReaderSendBuffer, (ReaderSendBitCount + 7) / 8); + uint16_t tmp = addParityBits(Buffer, ReaderSendBitCount); + ReaderSendBitCount = 0; + return tmp; + } - if (BitCount == 0) - { - char tmpBuf[] = "NO DATA"; - Reader14443CurrentCommand = Reader14443_Do_Nothing; - CommandLinePendingTaskFinished(COMMAND_INFO_OK_WITH_TEXT_ID, tmpBuf); - return 0; - } - char tmpBuf[128]; - BitCount = removeSOC(Buffer, BitCount); - bool parity = checkParityBits(Buffer, BitCount); - BitCount = removeParityBits(Buffer, BitCount); - if ((2 * (BitCount + 7) / 8 + 2 + 4) > 128) // 2 = \r\n, 4 = size of bitcount in hex - { - sprintf(tmpBuf, "Too many data."); - Reader14443CurrentCommand = Reader14443_Do_Nothing; - CommandLinePendingTaskFinished(COMMAND_INFO_OK_WITH_TEXT_ID, tmpBuf); - return 0; - } - uint16_t charCnt = BufferToHexString(tmpBuf, 128, Buffer, (BitCount + 7) / 8); - uint8_t count[2] = {(BitCount>>8)&0xFF, BitCount&0xFF}; - charCnt += snprintf(tmpBuf + charCnt, 128 - charCnt, "\r\n"); - charCnt += BufferToHexString(tmpBuf + charCnt, 128 - charCnt, count, 2); - if (!parity) - snprintf(tmpBuf + charCnt, 128 - charCnt, "\r\nPARITY ERROR"); - else - snprintf(tmpBuf + charCnt, 128 - charCnt, "\r\nPARITY OK"); - Reader14443CurrentCommand = Reader14443_Do_Nothing; - CommandLinePendingTaskFinished(COMMAND_INFO_OK_WITH_TEXT_ID, tmpBuf); - return 0; - } + if (BitCount == 0) + { + char tmpBuf[] = "NO DATA"; + Reader14443CurrentCommand = Reader14443_Do_Nothing; + CommandLinePendingTaskFinished(COMMAND_INFO_OK_WITH_TEXT_ID, tmpBuf); + return 0; + } + char tmpBuf[128]; + BitCount = removeSOC(Buffer, BitCount); + bool parity = checkParityBits(Buffer, BitCount); + BitCount = removeParityBits(Buffer, BitCount); + if ((2 * (BitCount + 7) / 8 + 2 + 4) > 128) // 2 = \r\n, 4 = size of bitcount in hex + { + sprintf(tmpBuf, "Too many data."); + Reader14443CurrentCommand = Reader14443_Do_Nothing; + CommandLinePendingTaskFinished(COMMAND_INFO_OK_WITH_TEXT_ID, tmpBuf); + return 0; + } + uint16_t charCnt = BufferToHexString(tmpBuf, 128, Buffer, (BitCount + 7) / 8); + uint8_t count[2] = {(BitCount>>8)&0xFF, BitCount&0xFF}; + charCnt += snprintf(tmpBuf + charCnt, 128 - charCnt, "\r\n"); + charCnt += BufferToHexString(tmpBuf + charCnt, 128 - charCnt, count, 2); + if (!parity) + snprintf(tmpBuf + charCnt, 128 - charCnt, "\r\nPARITY ERROR"); + else + snprintf(tmpBuf + charCnt, 128 - charCnt, "\r\nPARITY OK"); + Reader14443CurrentCommand = Reader14443_Do_Nothing; + CommandLinePendingTaskFinished(COMMAND_INFO_OK_WITH_TEXT_ID, tmpBuf); + return 0; + } - case Reader14443_Send_Raw: - { - if (ReaderSendBitCount) - { - memcpy(Buffer, ReaderSendBuffer, (ReaderSendBitCount + 7) / 8); - uint16_t tmp = ReaderSendBitCount; - ReaderSendBitCount = 0; - return tmp; - } + case Reader14443_Send_Raw: + { + if (ReaderSendBitCount) + { + memcpy(Buffer, ReaderSendBuffer, (ReaderSendBitCount + 7) / 8); + uint16_t tmp = ReaderSendBitCount; + ReaderSendBitCount = 0; + return tmp; + } - if (BitCount == 0) - { - char tmpBuf[] = "NO DATA"; - Reader14443CurrentCommand = Reader14443_Do_Nothing; - CommandLinePendingTaskFinished(COMMAND_INFO_OK_WITH_TEXT_ID, tmpBuf); - return 0; - } + if (BitCount == 0) + { + char tmpBuf[] = "NO DATA"; + Reader14443CurrentCommand = Reader14443_Do_Nothing; + CommandLinePendingTaskFinished(COMMAND_INFO_OK_WITH_TEXT_ID, tmpBuf); + return 0; + } - char tmpBuf[128]; - uint16_t charCnt = BufferToHexString(tmpBuf, 128, Buffer, (BitCount + 7) / 8); - uint8_t count[2] = {(BitCount>>8)&0xFF, BitCount&0xFF}; - charCnt += snprintf(tmpBuf + charCnt, 128 - charCnt, "\r\n"); - charCnt += BufferToHexString(tmpBuf + charCnt, 128 - charCnt, count, 2); - Reader14443CurrentCommand = Reader14443_Do_Nothing; - CommandLinePendingTaskFinished(COMMAND_INFO_OK_WITH_TEXT_ID, tmpBuf); - return 0; - } + char tmpBuf[128]; + uint16_t charCnt = BufferToHexString(tmpBuf, 128, Buffer, (BitCount + 7) / 8); + uint8_t count[2] = {(BitCount>>8)&0xFF, BitCount&0xFF}; + charCnt += snprintf(tmpBuf + charCnt, 128 - charCnt, "\r\n"); + charCnt += BufferToHexString(tmpBuf + charCnt, 128 - charCnt, count, 2); + Reader14443CurrentCommand = Reader14443_Do_Nothing; + CommandLinePendingTaskFinished(COMMAND_INFO_OK_WITH_TEXT_ID, tmpBuf); + return 0; + } - case Reader14443_Get_UID: - { - uint16_t rVal = Reader14443A_Select(Buffer, BitCount); - if (Selected) // we are done finding the UID - { - char tmpBuf[20]; - BufferToHexString(tmpBuf, 20, CardCharacteristics.UID, CardCharacteristics.UIDSize); - CommandLinePendingTaskFinished(COMMAND_INFO_OK_WITH_TEXT_ID, tmpBuf); - Selected = false; - Reader14443CurrentCommand = Reader14443_Do_Nothing; - CodecReaderFieldStop(); - return 0; - } - return rVal; - } + case Reader14443_Get_UID: + { + uint16_t rVal = Reader14443A_Select(Buffer, BitCount); + if (Selected) // we are done finding the UID + { + char tmpBuf[20]; + BufferToHexString(tmpBuf, 20, CardCharacteristics.UID, CardCharacteristics.UIDSize); + CommandLinePendingTaskFinished(COMMAND_INFO_OK_WITH_TEXT_ID, tmpBuf); + Selected = false; + Reader14443CurrentCommand = Reader14443_Do_Nothing; + CodecReaderFieldStop(); + return 0; + } + return rVal; + } case Reader14443_Autocalibrate: { @@ -554,282 +554,282 @@ uint16_t Reader14443AAppProcess(uint8_t* Buffer, uint16_t BitCount) return rVal; } - case Reader14443_Read_MF_Ultralight: - { - static uint8_t MFURead_CurrentAdress = 0; - static uint8_t MFUContents[64]; + case Reader14443_Read_MF_Ultralight: + { + static uint8_t MFURead_CurrentAdress = 0; + static uint8_t MFUContents[64]; - uint16_t rVal = Reader14443A_Select(Buffer, BitCount); - if (Selected) - { - if (MFURead_CurrentAdress != 0) - { - BitCount = removeSOC(Buffer, BitCount); - if (BitCount == 0) // relaunch select protocol - { - MFURead_CurrentAdress = 0; // reset read address - Selected = false; - ReaderState = STATE_IDLE; - Reader14443ACodecStart(); - return 0; - } - bool readPageAgain = (BitCount < 162) || !checkParityBits(Buffer, BitCount); - BitCount = removeParityBits(Buffer, BitCount); - if (readPageAgain || ISO14443_CRCA(Buffer, 18)) // the CRC function should return 0 if everything is ok - { - MFURead_CurrentAdress -= 4; - } else { // everything is ok for this page - memcpy(MFUContents + (MFURead_CurrentAdress - 4) * 4, Buffer, 16); - } - } else { - uint16_t RefATQA; - memcpy_P(&RefATQA, &CardIdentificationList[CardType_NXP_MIFARE_Ultralight].ATQA, 2); - uint8_t RefSAK = pgm_read_byte(&CardIdentificationList[CardType_NXP_MIFARE_Ultralight].SAK); - if (CardCharacteristics.ATQA != RefATQA || CardCharacteristics.SAK != RefSAK) // seems to be no MiFare Ultralight card, so retry - { - ReaderState = STATE_IDLE; - Reader14443ACodecStart(); - return 0; - } - } - if (MFURead_CurrentAdress == 16) - { - Selected = false; - MFURead_CurrentAdress = 0; - Reader14443CurrentCommand = Reader14443_Do_Nothing; + uint16_t rVal = Reader14443A_Select(Buffer, BitCount); + if (Selected) + { + if (MFURead_CurrentAdress != 0) + { + BitCount = removeSOC(Buffer, BitCount); + if (BitCount == 0) // relaunch select protocol + { + MFURead_CurrentAdress = 0; // reset read address + Selected = false; + ReaderState = STATE_IDLE; + Reader14443ACodecStart(); + return 0; + } + bool readPageAgain = (BitCount < 162) || !checkParityBits(Buffer, BitCount); + BitCount = removeParityBits(Buffer, BitCount); + if (readPageAgain || ISO14443_CRCA(Buffer, 18)) // the CRC function should return 0 if everything is ok + { + MFURead_CurrentAdress -= 4; + } else { // everything is ok for this page + memcpy(MFUContents + (MFURead_CurrentAdress - 4) * 4, Buffer, 16); + } + } else { + uint16_t RefATQA; + memcpy_P(&RefATQA, &CardIdentificationList[CardType_NXP_MIFARE_Ultralight].ATQA, 2); + uint8_t RefSAK = pgm_read_byte(&CardIdentificationList[CardType_NXP_MIFARE_Ultralight].SAK); + if (CardCharacteristics.ATQA != RefATQA || CardCharacteristics.SAK != RefSAK) // seems to be no MiFare Ultralight card, so retry + { + ReaderState = STATE_IDLE; + Reader14443ACodecStart(); + return 0; + } + } + if (MFURead_CurrentAdress == 16) + { + Selected = false; + MFURead_CurrentAdress = 0; + Reader14443CurrentCommand = Reader14443_Do_Nothing; - char tmpBuf[135]; // 135 = 128 hex digits + 3 * \r\n + \0 - BufferToHexString( tmpBuf, 135, MFUContents, 16); - snprintf( tmpBuf + 32, 135 - 32, "\r\n"); - BufferToHexString( tmpBuf + 32 + 2, 135 - 32 - 2, MFUContents + 16, 16); - snprintf( tmpBuf + 32 + 2 + 32, 135 - 32 - 2 - 32, "\r\n"); - BufferToHexString( tmpBuf + 32 + 2 + 32 + 2, 135 - 32 - 2 - 32 - 2, MFUContents + 32, 16); - snprintf( tmpBuf + 32 + 2 + 32 + 2 + 32, 135 - 32 - 2 - 32 - 2 - 32, "\r\n"); - BufferToHexString( tmpBuf + 32 + 2 + 32 + 2 + 32 + 2, 135 - 32 - 2 - 32 - 2 - 32 - 2, MFUContents + 48, 16); - CodecReaderFieldStop(); - CommandLinePendingTaskFinished(COMMAND_INFO_OK_WITH_TEXT_ID, tmpBuf); - return 0; - } - Buffer[0] = 0x30; // MiFare Ultralight read command - Buffer[1] = MFURead_CurrentAdress; - uint16_t crc = ISO14443_CRCA(Buffer, 2); - Buffer[2] = crc; - Buffer[3] = crc >> 8; + char tmpBuf[135]; // 135 = 128 hex digits + 3 * \r\n + \0 + BufferToHexString( tmpBuf, 135, MFUContents, 16); + snprintf( tmpBuf + 32, 135 - 32, "\r\n"); + BufferToHexString( tmpBuf + 32 + 2, 135 - 32 - 2, MFUContents + 16, 16); + snprintf( tmpBuf + 32 + 2 + 32, 135 - 32 - 2 - 32, "\r\n"); + BufferToHexString( tmpBuf + 32 + 2 + 32 + 2, 135 - 32 - 2 - 32 - 2, MFUContents + 32, 16); + snprintf( tmpBuf + 32 + 2 + 32 + 2 + 32, 135 - 32 - 2 - 32 - 2 - 32, "\r\n"); + BufferToHexString( tmpBuf + 32 + 2 + 32 + 2 + 32 + 2, 135 - 32 - 2 - 32 - 2 - 32 - 2, MFUContents + 48, 16); + CodecReaderFieldStop(); + CommandLinePendingTaskFinished(COMMAND_INFO_OK_WITH_TEXT_ID, tmpBuf); + return 0; + } + Buffer[0] = 0x30; // MiFare Ultralight read command + Buffer[1] = MFURead_CurrentAdress; + uint16_t crc = ISO14443_CRCA(Buffer, 2); + Buffer[2] = crc; + Buffer[3] = crc >> 8; - MFURead_CurrentAdress += 4; + MFURead_CurrentAdress += 4; - return addParityBits(Buffer, 32); - } - return rVal; - } + return addParityBits(Buffer, 32); + } + return rVal; + } - /************************************ - * This function identifies a PICC. * - ************************************/ - case Reader14443_Identify: - { - uint16_t rVal = Reader14443A_Select(Buffer, BitCount); - if (Selected) - { - if (ReaderState >= STATE_SAK_CL1 && ReaderState <= STATE_SAK_CL3) - { - bool ISO14443_4A_compliant = IS_ISO14443A_4_COMPLIANT(Buffer); - CardCandidatesIdx = 0; + /************************************ + * This function identifies a PICC. * + ************************************/ + case Reader14443_Identify: + { + uint16_t rVal = Reader14443A_Select(Buffer, BitCount); + if (Selected) + { + if (ReaderState >= STATE_SAK_CL1 && ReaderState <= STATE_SAK_CL3) + { + bool ISO14443_4A_compliant = IS_ISO14443A_4_COMPLIANT(Buffer); + CardCandidatesIdx = 0; - uint8_t i; - for (i = 0; i < ARRAY_COUNT(CardIdentificationList); i++) - { - CardIdentificationType card; - memcpy_P(&card, &CardIdentificationList[i], sizeof(CardIdentificationType)); - if (card.ATQARelevant && card.ATQA != CardCharacteristics.ATQA) - continue; - if (card.SAKRelevant && card.SAK != CardCharacteristics.SAK) - continue; - if (card.ATSRelevant && !ISO14443_4A_compliant) - continue; // for this card type candidate, the ATS is relevant, but the card does not support ISO14443-4A - CardCandidates[CardCandidatesIdx++] = i; - } + uint8_t i; + for (i = 0; i < ARRAY_COUNT(CardIdentificationList); i++) + { + CardIdentificationType card; + memcpy_P(&card, &CardIdentificationList[i], sizeof(CardIdentificationType)); + if (card.ATQARelevant && card.ATQA != CardCharacteristics.ATQA) + continue; + if (card.SAKRelevant && card.SAK != CardCharacteristics.SAK) + continue; + if (card.ATSRelevant && !ISO14443_4A_compliant) + continue; // for this card type candidate, the ATS is relevant, but the card does not support ISO14443-4A + CardCandidates[CardCandidatesIdx++] = i; + } - if (ISO14443_4A_compliant) - { - // send RATS - return Reader14443A_RATS(Buffer); - } - // if we don't have to send the RATS, we are finished for distinguishing with ISO 14443A + if (ISO14443_4A_compliant) + { + // send RATS + return Reader14443A_RATS(Buffer); + } + // if we don't have to send the RATS, we are finished for distinguishing with ISO 14443A - } else if (ReaderState == STATE_ATS) { // we have got the ATS - BitCount = removeSOC(Buffer, BitCount); - if (!checkParityBits(Buffer, BitCount)) - { - LogEntry(LOG_ERR_APP_CHECKSUM_FAIL, Buffer, (BitCount + 8) / 7); - return Reader14443A_Deselect(Buffer); - } - BitCount = removeParityBits(Buffer, BitCount); + } else if (ReaderState == STATE_ATS) { // we have got the ATS + BitCount = removeSOC(Buffer, BitCount); + if (!checkParityBits(Buffer, BitCount)) + { + LogEntry(LOG_ERR_APP_CHECKSUM_FAIL, Buffer, (BitCount + 8) / 7); + return Reader14443A_Deselect(Buffer); + } + BitCount = removeParityBits(Buffer, BitCount); - if (Buffer[0] != BitCount / 8 - 2 || ISO14443_CRCA(Buffer, Buffer[0] + 2)) - { - return Reader14443A_Deselect(Buffer); - } + if (Buffer[0] != BitCount / 8 - 2 || ISO14443_CRCA(Buffer, Buffer[0] + 2)) + { + return Reader14443A_Deselect(Buffer); + } - uint8_t i; - for (i = 0; i < CardCandidatesIdx; i++) - { - CardIdentificationType card; - memcpy_P(&card, &CardIdentificationList[CardCandidates[i]], sizeof(CardIdentificationType)); - if (!card.ATSRelevant || (card.ATSRelevant && card.ATSSize == Buffer[0] - 1 && memcmp(card.ATS, Buffer + 1, card.ATSSize) == 0)) - /* - * If for this candidate the ATS is not relevant, it remains being a candidate. - * If the ATS is relevant and the size is correct and the ATS is the same as the reference value, this candidate remains a candidate. - */ - continue; + uint8_t i; + for (i = 0; i < CardCandidatesIdx; i++) + { + CardIdentificationType card; + memcpy_P(&card, &CardIdentificationList[CardCandidates[i]], sizeof(CardIdentificationType)); + if (!card.ATSRelevant || (card.ATSRelevant && card.ATSSize == Buffer[0] - 1 && memcmp(card.ATS, Buffer + 1, card.ATSSize) == 0)) + /* + * If for this candidate the ATS is not relevant, it remains being a candidate. + * If the ATS is relevant and the size is correct and the ATS is the same as the reference value, this candidate remains a candidate. + */ + continue; - // Else, we have to delete this candidate - uint8_t j; - for (j = i; j < CardCandidatesIdx - 1; j++) - CardCandidates[j] = CardCandidates[j+1]; - CardCandidatesIdx--; - i--; - } - } + // Else, we have to delete this candidate + uint8_t j; + for (j = i; j < CardCandidatesIdx - 1; j++) + CardCandidates[j] = CardCandidates[j+1]; + CardCandidatesIdx--; + i--; + } + } - /* - * If any cards are not distinguishable with ISO14443A commands only, this is the place to run some proprietary commands. - */ + /* + * If any cards are not distinguishable with ISO14443A commands only, this is the place to run some proprietary commands. + */ - if ((ReaderState >= STATE_SAK_CL1 && ReaderState <= STATE_SAK_CL3) || ReaderState == STATE_ATS) - { - uint8_t i; - for (i = 0; i < CardCandidatesIdx; i++) - { - switch (CardCandidates[i]) - { - case CardType_NXP_MIFARE_DESFire: - case CardType_NXP_MIFARE_DESFire_EV1: - Buffer[0] = 0x02; - Buffer[1] = 0x60; - uint16_t crc = ISO14443_CRCA(Buffer, 2); - Buffer[2] = crc; - Buffer[3] = crc >> 8; - ReaderState = STATE_DESFIRE_INFO; - return addParityBits(Buffer, 32); + if ((ReaderState >= STATE_SAK_CL1 && ReaderState <= STATE_SAK_CL3) || ReaderState == STATE_ATS) + { + uint8_t i; + for (i = 0; i < CardCandidatesIdx; i++) + { + switch (CardCandidates[i]) + { + case CardType_NXP_MIFARE_DESFire: + case CardType_NXP_MIFARE_DESFire_EV1: + Buffer[0] = 0x02; + Buffer[1] = 0x60; + uint16_t crc = ISO14443_CRCA(Buffer, 2); + Buffer[2] = crc; + Buffer[3] = crc >> 8; + ReaderState = STATE_DESFIRE_INFO; + return addParityBits(Buffer, 32); - default: - break; - } - } - } else { - switch (ReaderState) - { - case STATE_DESFIRE_INFO: - if (BitCount == 0) - { - CardCandidatesIdx = 0; // this will return that this card is unknown to us - break; - } - BitCount = removeSOC(Buffer, BitCount); - if (!checkParityBits(Buffer, BitCount)) - { - LogEntry(LOG_ERR_APP_CHECKSUM_FAIL, Buffer, (BitCount + 8) / 7); - CardCandidatesIdx = 0; - return Reader14443A_Deselect(Buffer); - } - BitCount = removeParityBits(Buffer, BitCount); - if (ISO14443_CRCA(Buffer, BitCount / 8)) - { - CardCandidatesIdx = 0; - return Reader14443A_Deselect(Buffer); - } - switch (Buffer[5]) - { - case 0x00: - CardCandidatesIdx = 1; - CardCandidates[0] = CardType_NXP_MIFARE_DESFire; - break; + default: + break; + } + } + } else { + switch (ReaderState) + { + case STATE_DESFIRE_INFO: + if (BitCount == 0) + { + CardCandidatesIdx = 0; // this will return that this card is unknown to us + break; + } + BitCount = removeSOC(Buffer, BitCount); + if (!checkParityBits(Buffer, BitCount)) + { + LogEntry(LOG_ERR_APP_CHECKSUM_FAIL, Buffer, (BitCount + 8) / 7); + CardCandidatesIdx = 0; + return Reader14443A_Deselect(Buffer); + } + BitCount = removeParityBits(Buffer, BitCount); + if (ISO14443_CRCA(Buffer, BitCount / 8)) + { + CardCandidatesIdx = 0; + return Reader14443A_Deselect(Buffer); + } + switch (Buffer[5]) + { + case 0x00: + CardCandidatesIdx = 1; + CardCandidates[0] = CardType_NXP_MIFARE_DESFire; + break; - case 0x01: - CardCandidatesIdx = 1; - CardCandidates[0] = CardType_NXP_MIFARE_DESFire_EV1; - break; + case 0x01: + CardCandidatesIdx = 1; + CardCandidates[0] = CardType_NXP_MIFARE_DESFire_EV1; + break; - default: - CardCandidatesIdx = 0; - } - break; + default: + CardCandidatesIdx = 0; + } + break; - default: - break; - } - } + default: + break; + } + } - if (CardCandidatesIdx == 0) - { - CommandLinePendingTaskFinished(COMMAND_INFO_OK_WITH_TEXT_ID, "Unknown card type."); - } else if (CardCandidatesIdx == 1) { - char tmpType[64]; - memcpy_P(tmpType, &CardIdentificationList[CardCandidates[0]].Type, 64); - CommandLinePendingTaskFinished(COMMAND_INFO_OK_WITH_TEXT_ID, tmpType); - } else { - char tmpBuf[TERMINAL_BUFFER_SIZE]; - uint16_t size = 0, tmpsize = 0; - bool enoughspace = true; + if (CardCandidatesIdx == 0) + { + CommandLinePendingTaskFinished(COMMAND_INFO_OK_WITH_TEXT_ID, "Unknown card type."); + } else if (CardCandidatesIdx == 1) { + char tmpType[64]; + memcpy_P(tmpType, &CardIdentificationList[CardCandidates[0]].Type, 64); + CommandLinePendingTaskFinished(COMMAND_INFO_OK_WITH_TEXT_ID, tmpType); + } else { + char tmpBuf[TERMINAL_BUFFER_SIZE]; + uint16_t size = 0, tmpsize = 0; + bool enoughspace = true; - uint8_t i; - for (i = 0; i < CardCandidatesIdx; i++) - { - if (size <= TERMINAL_BUFFER_SIZE) // prevents buffer overflow - { - char tmpType[64]; - memcpy_P(tmpType, &CardIdentificationList[CardCandidates[i]].Type, 64); - tmpsize = snprintf(tmpBuf + size, TERMINAL_BUFFER_SIZE - size, "%s or ", tmpType); - size += tmpsize; - } else { - break; - } - } - if (size > TERMINAL_BUFFER_SIZE) - { - size -= tmpsize; - enoughspace = false; - } - tmpBuf[size-4] = '.'; - tmpBuf[size-3] = '\0'; - CommandLinePendingTaskFinished(COMMAND_INFO_OK_WITH_TEXT_ID, tmpBuf); - if (!enoughspace) - TerminalSendStringP(PSTR("There is at least one more card type candidate, but there was not enough terminal buffer space.\r\n")); - } - // print general data - TerminalSendStringP(PSTR("ATQA:\t")); - CommandLineAppendData(&CardCharacteristics.ATQA, 2); - TerminalSendStringP(PSTR("UID:\t")); - CommandLineAppendData(CardCharacteristics.UID, CardCharacteristics.UIDSize); - TerminalSendStringP(PSTR("SAK:\t")); - CommandLineAppendData(&CardCharacteristics.SAK, 1); + uint8_t i; + for (i = 0; i < CardCandidatesIdx; i++) + { + if (size <= TERMINAL_BUFFER_SIZE) // prevents buffer overflow + { + char tmpType[64]; + memcpy_P(tmpType, &CardIdentificationList[CardCandidates[i]].Type, 64); + tmpsize = snprintf(tmpBuf + size, TERMINAL_BUFFER_SIZE - size, "%s or ", tmpType); + size += tmpsize; + } else { + break; + } + } + if (size > TERMINAL_BUFFER_SIZE) + { + size -= tmpsize; + enoughspace = false; + } + tmpBuf[size-4] = '.'; + tmpBuf[size-3] = '\0'; + CommandLinePendingTaskFinished(COMMAND_INFO_OK_WITH_TEXT_ID, tmpBuf); + if (!enoughspace) + TerminalSendStringP(PSTR("There is at least one more card type candidate, but there was not enough terminal buffer space.\r\n")); + } + // print general data + TerminalSendStringP(PSTR("ATQA:\t")); + CommandLineAppendData(&CardCharacteristics.ATQA, 2); + TerminalSendStringP(PSTR("UID:\t")); + CommandLineAppendData(CardCharacteristics.UID, CardCharacteristics.UIDSize); + TerminalSendStringP(PSTR("SAK:\t")); + CommandLineAppendData(&CardCharacteristics.SAK, 1); - Reader14443CurrentCommand = Reader14443_Do_Nothing; - CardCandidatesIdx = 0; - CodecReaderFieldStop(); - Selected = false; - return 0; - } - return rVal; - } + Reader14443CurrentCommand = Reader14443_Do_Nothing; + CardCandidatesIdx = 0; + CodecReaderFieldStop(); + Selected = false; + return 0; + } + return rVal; + } - default: // e.g. Do_Nothing - return 0; - } - return 0; + default: // e.g. Do_Nothing + return 0; + } + return 0; } uint16_t ISO14443_CRCA(uint8_t * Buffer, uint8_t ByteCount) { - uint8_t * DataPtr = Buffer; - uint16_t crc = 0x6363; - uint8_t ch; - while (ByteCount--) - { - ch = *DataPtr++ ^ crc; - ch = ch ^ (ch << 4); - crc = (crc >> 8) ^ (ch << 8) ^ (ch << 3) ^ (ch >> 4); - } - return crc; + uint8_t * DataPtr = Buffer; + uint16_t crc = 0x6363; + uint8_t ch; + while (ByteCount--) + { + ch = *DataPtr++ ^ crc; + ch = ch ^ (ch << 4); + crc = (crc >> 8) ^ (ch << 8) ^ (ch << 3) ^ (ch >> 4); + } + return crc; } diff --git a/Firmware/Chameleon-Mini/Application/Reader14443A.h b/Firmware/Chameleon-Mini/Application/Reader14443A.h index 97bff8f..e9519ed 100644 --- a/Firmware/Chameleon-Mini/Application/Reader14443A.h +++ b/Firmware/Chameleon-Mini/Application/Reader14443A.h @@ -24,13 +24,13 @@ bool checkParityBits(uint8_t * Buffer, uint16_t BitCount); uint16_t ISO14443_CRCA(uint8_t * Buffer, uint8_t ByteCount); typedef enum { - Reader14443_Do_Nothing, - Reader14443_Send, - Reader14443_Send_Raw, - Reader14443_Get_UID, - Reader14443_Autocalibrate, - Reader14443_Read_MF_Ultralight, - Reader14443_Identify + Reader14443_Do_Nothing, + Reader14443_Send, + Reader14443_Send_Raw, + Reader14443_Get_UID, + Reader14443_Autocalibrate, + Reader14443_Read_MF_Ultralight, + Reader14443_Identify } Reader14443Command; diff --git a/Firmware/Chameleon-Mini/Battery.h b/Firmware/Chameleon-Mini/Battery.h index 3cb335b..850954b 100644 --- a/Firmware/Chameleon-Mini/Battery.h +++ b/Firmware/Chameleon-Mini/Battery.h @@ -16,16 +16,16 @@ #define BATTERY_PORT_MASK (BATTERY_STAT_PIN) INLINE void BatteryInit(void) { - BATTERY_PORT.DIRCLR = BATTERY_PORT_MASK; - BATTERY_PORT.BATTERY_STAT_PINCTRL = PORT_OPC_PULLUP_gc; + BATTERY_PORT.DIRCLR = BATTERY_PORT_MASK; + BATTERY_PORT.BATTERY_STAT_PINCTRL = PORT_OPC_PULLUP_gc; } INLINE bool BatteryIsCharging(void) { - if (!(BATTERY_PORT.IN & BATTERY_STAT_PIN)) { - return true; - } else { - return false; - } + if (!(BATTERY_PORT.IN & BATTERY_STAT_PIN)) { + return true; + } else { + return false; + } } #endif /* BATTERY_H_ */ diff --git a/Firmware/Chameleon-Mini/Button.c b/Firmware/Chameleon-Mini/Button.c index 458db97..d7d5e82 100644 --- a/Firmware/Chameleon-Mini/Button.c +++ b/Firmware/Chameleon-Mini/Button.c @@ -16,17 +16,17 @@ #define LONG_PRESS_TICK_COUNT 10 static const MapEntryType PROGMEM ButtonActionMap[] = { - { .Id = BUTTON_ACTION_NONE, .Text = "NONE" }, - { .Id = BUTTON_ACTION_UID_RANDOM, .Text = "UID_RANDOM" }, - { .Id = BUTTON_ACTION_UID_LEFT_INCREMENT, .Text = "UID_LEFT_INCREMENT" }, - { .Id = BUTTON_ACTION_UID_RIGHT_INCREMENT, .Text = "UID_RIGHT_INCREMENT" }, - { .Id = BUTTON_ACTION_UID_LEFT_DECREMENT, .Text = "UID_LEFT_DECREMENT" }, - { .Id = BUTTON_ACTION_UID_RIGHT_DECREMENT, .Text = "UID_RIGHT_DECREMENT" }, - { .Id = BUTTON_ACTION_CYCLE_SETTINGS, .Text = "CYCLE_SETTINGS" }, - { .Id = BUTTON_ACTION_STORE_MEM, .Text = "STORE_MEM" }, - { .Id = BUTTON_ACTION_RECALL_MEM, .Text = "RECALL_MEM" }, - { .Id = BUTTON_ACTION_TOGGLE_FIELD, .Text = "TOGGLE_FIELD" }, - { .Id = BUTTON_ACTION_STORE_LOG, .Text = "STORE_LOG" }, + { .Id = BUTTON_ACTION_NONE, .Text = "NONE" }, + { .Id = BUTTON_ACTION_UID_RANDOM, .Text = "UID_RANDOM" }, + { .Id = BUTTON_ACTION_UID_LEFT_INCREMENT, .Text = "UID_LEFT_INCREMENT" }, + { .Id = BUTTON_ACTION_UID_RIGHT_INCREMENT, .Text = "UID_RIGHT_INCREMENT" }, + { .Id = BUTTON_ACTION_UID_LEFT_DECREMENT, .Text = "UID_LEFT_DECREMENT" }, + { .Id = BUTTON_ACTION_UID_RIGHT_DECREMENT, .Text = "UID_RIGHT_DECREMENT" }, + { .Id = BUTTON_ACTION_CYCLE_SETTINGS, .Text = "CYCLE_SETTINGS" }, + { .Id = BUTTON_ACTION_STORE_MEM, .Text = "STORE_MEM" }, + { .Id = BUTTON_ACTION_RECALL_MEM, .Text = "RECALL_MEM" }, + { .Id = BUTTON_ACTION_TOGGLE_FIELD, .Text = "TOGGLE_FIELD" }, + { .Id = BUTTON_ACTION_STORE_LOG, .Text = "STORE_LOG" }, }; static void ExecuteButtonAction(ButtonActionEnum ButtonAction) @@ -147,51 +147,51 @@ static void ExecuteButtonAction(ButtonActionEnum ButtonAction) case BUTTON_ACTION_CYCLE_SETTINGS: { - SettingsCycle(); + SettingsCycle(); break; } case BUTTON_ACTION_STORE_MEM: { - MemoryStore(); + MemoryStore(); break; } case BUTTON_ACTION_RECALL_MEM: { - MemoryRecall(); + MemoryRecall(); break; } case BUTTON_ACTION_TOGGLE_FIELD: { - if (!CodecGetReaderField()) - { - CodecReaderFieldStart(); - } else { - CodecReaderFieldStop(); - } - break; + if (!CodecGetReaderField()) + { + CodecReaderFieldStart(); + } else { + CodecReaderFieldStop(); + } + break; } case BUTTON_ACTION_STORE_LOG: { - LogSRAMToFRAM(); - break; + LogSRAMToFRAM(); + break; } default: - break; + break; } } void ButtonInit(void) { - BUTTON_PORT.DIRCLR = BUTTON_MASK; - BUTTON_PORT.BUTTON_R_PINCTRL = PORT_OPC_PULLUP_gc; - BUTTON_PORT.BUTTON_L_PINCTRL = PORT_OPC_PULLUP_gc; + BUTTON_PORT.DIRCLR = BUTTON_MASK; + BUTTON_PORT.BUTTON_R_PINCTRL = PORT_OPC_PULLUP_gc; + BUTTON_PORT.BUTTON_L_PINCTRL = PORT_OPC_PULLUP_gc; } void ButtonTick(void) @@ -201,85 +201,85 @@ void ButtonTick(void) uint8_t ThisButtonState = ~BUTTON_PORT.IN; if (ThisButtonState & BUTTON_R) { - /* Button is currently pressed */ - if (ButtonRPressTick < LONG_PRESS_TICK_COUNT) { - /* Count ticks while button is being pressed */ - ButtonRPressTick++; - } else if (ButtonRPressTick == LONG_PRESS_TICK_COUNT) { - /* Long button press detected execute button action and advance PressTickCounter - * to an invalid state. */ - ExecuteButtonAction(GlobalSettings.ActiveSettingPtr->ButtonActions[BUTTON_R_PRESS_LONG]); - ButtonRPressTick++; - } else { - /* Button is still pressed, ignore */ - } + /* Button is currently pressed */ + if (ButtonRPressTick < LONG_PRESS_TICK_COUNT) { + /* Count ticks while button is being pressed */ + ButtonRPressTick++; + } else if (ButtonRPressTick == LONG_PRESS_TICK_COUNT) { + /* Long button press detected execute button action and advance PressTickCounter + * to an invalid state. */ + ExecuteButtonAction(GlobalSettings.ActiveSettingPtr->ButtonActions[BUTTON_R_PRESS_LONG]); + ButtonRPressTick++; + } else { + /* Button is still pressed, ignore */ + } } else if (!(ThisButtonState & BUTTON_MASK)) { - /* Button is currently not being pressed. Check if PressTickCounter contains - * a recent short button press. */ - if ( (ButtonRPressTick > 0) && (ButtonRPressTick <= LONG_PRESS_TICK_COUNT) ) { - /* We have a short button press */ - ExecuteButtonAction(GlobalSettings.ActiveSettingPtr->ButtonActions[BUTTON_R_PRESS_SHORT]); - } + /* Button is currently not being pressed. Check if PressTickCounter contains + * a recent short button press. */ + if ( (ButtonRPressTick > 0) && (ButtonRPressTick <= LONG_PRESS_TICK_COUNT) ) { + /* We have a short button press */ + ExecuteButtonAction(GlobalSettings.ActiveSettingPtr->ButtonActions[BUTTON_R_PRESS_SHORT]); + } - ButtonRPressTick = 0; + ButtonRPressTick = 0; } if (ThisButtonState & BUTTON_L) { - /* Button is currently pressed */ - if (ButtonLPressTick < LONG_PRESS_TICK_COUNT) { - /* Count ticks while button is being pressed */ - ButtonLPressTick++; - } else if (ButtonLPressTick == LONG_PRESS_TICK_COUNT) { - /* Long button press detected execute button action and advance PressTickCounter - * to an invalid state. */ - ExecuteButtonAction(GlobalSettings.ActiveSettingPtr->ButtonActions[BUTTON_L_PRESS_LONG]); - ButtonLPressTick++; - } else { - /* Button is still pressed, ignore */ - } + /* Button is currently pressed */ + if (ButtonLPressTick < LONG_PRESS_TICK_COUNT) { + /* Count ticks while button is being pressed */ + ButtonLPressTick++; + } else if (ButtonLPressTick == LONG_PRESS_TICK_COUNT) { + /* Long button press detected execute button action and advance PressTickCounter + * to an invalid state. */ + ExecuteButtonAction(GlobalSettings.ActiveSettingPtr->ButtonActions[BUTTON_L_PRESS_LONG]); + ButtonLPressTick++; + } else { + /* Button is still pressed, ignore */ + } } else if (!(ThisButtonState & BUTTON_MASK)) { - /* Button is currently not being pressed. Check if PressTickCounter contains - * a recent short button press. */ - if ( (ButtonLPressTick > 0) && (ButtonLPressTick <= LONG_PRESS_TICK_COUNT) ) { - /* We have a short button press */ - ExecuteButtonAction(GlobalSettings.ActiveSettingPtr->ButtonActions[BUTTON_L_PRESS_SHORT]); - } + /* Button is currently not being pressed. Check if PressTickCounter contains + * a recent short button press. */ + if ( (ButtonLPressTick > 0) && (ButtonLPressTick <= LONG_PRESS_TICK_COUNT) ) { + /* We have a short button press */ + ExecuteButtonAction(GlobalSettings.ActiveSettingPtr->ButtonActions[BUTTON_L_PRESS_SHORT]); + } - ButtonLPressTick = 0; + ButtonLPressTick = 0; } } void ButtonGetActionList(char* List, uint16_t BufferSize) { - MapToString(ButtonActionMap, ARRAY_COUNT(ButtonActionMap), List, BufferSize); + MapToString(ButtonActionMap, ARRAY_COUNT(ButtonActionMap), List, BufferSize); } void ButtonSetActionById(ButtonTypeEnum Type, ButtonActionEnum Action) { #ifndef BUTTON_SETTING_GLOBAL - GlobalSettings.ActiveSettingPtr->ButtonActions[Type] = Action; + GlobalSettings.ActiveSettingPtr->ButtonActions[Type] = Action; #else - /* Write button action to all settings when using global settings */ - for (uint8_t i=0; iButtonActions[Type], Action, BufferSize); + MapIdToText(ButtonActionMap, ARRAY_COUNT(ButtonActionMap), + GlobalSettings.ActiveSettingPtr->ButtonActions[Type], Action, BufferSize); } bool ButtonSetActionByName(ButtonTypeEnum Type, const char* Action) { - MapIdType Id; + MapIdType Id; - if (MapTextToId(ButtonActionMap, ARRAY_COUNT(ButtonActionMap), Action, &Id)) { - ButtonSetActionById(Type, Id); - return true; - } else { - return false; - } + if (MapTextToId(ButtonActionMap, ARRAY_COUNT(ButtonActionMap), Action, &Id)) { + ButtonSetActionById(Type, Id); + return true; + } else { + return false; + } } diff --git a/Firmware/Chameleon-Mini/Button.h b/Firmware/Chameleon-Mini/Button.h index 0bc67c9..77c9e5b 100644 --- a/Firmware/Chameleon-Mini/Button.h +++ b/Firmware/Chameleon-Mini/Button.h @@ -11,13 +11,13 @@ #include "Common.h" typedef enum { - BUTTON_R_PRESS_SHORT = 0, - BUTTON_R_PRESS_LONG, - BUTTON_L_PRESS_SHORT, - BUTTON_L_PRESS_LONG, + BUTTON_R_PRESS_SHORT = 0, + BUTTON_R_PRESS_LONG, + BUTTON_L_PRESS_SHORT, + BUTTON_L_PRESS_LONG, - /* Must be last element */ - BUTTON_TYPE_COUNT + /* Must be last element */ + BUTTON_TYPE_COUNT } ButtonTypeEnum; typedef enum { @@ -30,8 +30,8 @@ typedef enum { BUTTON_ACTION_CYCLE_SETTINGS, BUTTON_ACTION_STORE_MEM, BUTTON_ACTION_RECALL_MEM, - BUTTON_ACTION_TOGGLE_FIELD, - BUTTON_ACTION_STORE_LOG, + BUTTON_ACTION_TOGGLE_FIELD, + BUTTON_ACTION_STORE_LOG, /* This has to be last element */ BUTTON_ACTION_COUNT diff --git a/Firmware/Chameleon-Mini/Chameleon-Mini.c b/Firmware/Chameleon-Mini/Chameleon-Mini.c index d969af6..18a0a2b 100644 --- a/Firmware/Chameleon-Mini/Chameleon-Mini.c +++ b/Firmware/Chameleon-Mini/Chameleon-Mini.c @@ -16,24 +16,24 @@ int main(void) SystemInterruptInit(); while(1) { - if (SystemTick100ms()) { + if (SystemTick100ms()) { LEDTick(); // this has to be the first function called here, since it is time-critical - the functions below may have non-negligible runtimes! - RandomTick(); - TerminalTick(); - ButtonTick(); - LogTick(); - ApplicationTick(); - CommandLineTick(); - AntennaLevelTick(); + RandomTick(); + TerminalTick(); + ButtonTick(); + LogTick(); + ApplicationTick(); + CommandLineTick(); + AntennaLevelTick(); - LEDHook(LED_POWERED, LED_ON); - } + LEDHook(LED_POWERED, LED_ON); + } - TerminalTask(); - LogTask(); - ApplicationTask(); - CodecTask(); + TerminalTask(); + LogTask(); + ApplicationTask(); + CodecTask(); } } diff --git a/Firmware/Chameleon-Mini/Codec/Codec.c b/Firmware/Chameleon-Mini/Codec/Codec.c index 8d5b7cc..f9ac2fa 100644 --- a/Firmware/Chameleon-Mini/Codec/Codec.c +++ b/Firmware/Chameleon-Mini/Codec/Codec.c @@ -17,9 +17,9 @@ static uint16_t ReaderFieldStartTimestamp = 0; static uint16_t ReaderFieldRestartTimestamp = 0; static uint16_t ReaderFieldRestartDelay = 0; static volatile struct { - bool Started; - bool Ready; - bool ToBeRestarted; + bool Started; + bool Ready; + bool ToBeRestarted; } ReaderFieldFlags = { false }; uint8_t CodecBuffer[CODEC_BUFFER_SIZE]; @@ -28,28 +28,28 @@ uint16_t ReaderThreshold = 400; // standard value // the following three functions prevent sending data directly after turning on the reader field void CodecReaderFieldStart(void) // DO NOT CALL THIS FUNCTION INSIDE APPLICATION! { - if (!CodecGetReaderField() && !ReaderFieldFlags.ToBeRestarted) - { - CodecSetReaderField(true); - ReaderFieldFlags.Started = true; - ReaderFieldFlags.Ready = false; - ReaderFieldStartTimestamp = SystemGetSysTick(); - } + if (!CodecGetReaderField() && !ReaderFieldFlags.ToBeRestarted) + { + CodecSetReaderField(true); + ReaderFieldFlags.Started = true; + ReaderFieldFlags.Ready = false; + ReaderFieldStartTimestamp = SystemGetSysTick(); + } } void CodecReaderFieldStop(void) { - CodecSetReaderField(false); - ReaderFieldFlags.Started = false; - ReaderFieldFlags.Ready = false; + CodecSetReaderField(false); + ReaderFieldFlags.Started = false; + ReaderFieldFlags.Ready = false; } void CodecReaderFieldRestart(uint16_t delay) { - ReaderFieldFlags.ToBeRestarted = true; - ReaderFieldRestartTimestamp = SystemGetSysTick(); - ReaderFieldRestartDelay = delay; - CodecReaderFieldStop(); + ReaderFieldFlags.ToBeRestarted = true; + ReaderFieldRestartTimestamp = SystemGetSysTick(); + ReaderFieldRestartDelay = delay; + CodecReaderFieldStop(); } /* @@ -58,28 +58,28 @@ void CodecReaderFieldRestart(uint16_t delay) */ bool CodecIsReaderFieldReady(void) { - if (!ReaderFieldFlags.Started) - return true; - if (ReaderFieldFlags.Ready || (ReaderFieldFlags.Started && SYSTICK_DIFF(ReaderFieldStartTimestamp) >= READER_FIELD_MINIMUM_WAITING_TIME)) - { - ReaderFieldFlags.Ready = true; - return true; - } - return false; + if (!ReaderFieldFlags.Started) + return true; + if (ReaderFieldFlags.Ready || (ReaderFieldFlags.Started && SYSTICK_DIFF(ReaderFieldStartTimestamp) >= READER_FIELD_MINIMUM_WAITING_TIME)) + { + ReaderFieldFlags.Ready = true; + return true; + } + return false; } bool CodecIsReaderToBeRestarted(void) { - if (ReaderFieldFlags.ToBeRestarted) - { - if (SYSTICK_DIFF(ReaderFieldRestartTimestamp) >= ReaderFieldRestartDelay) - { - ReaderFieldFlags.ToBeRestarted = false; - CodecReaderFieldStart(); - } - return true; - } - return false; + if (ReaderFieldFlags.ToBeRestarted) + { + if (SYSTICK_DIFF(ReaderFieldRestartTimestamp) >= ReaderFieldRestartDelay) + { + ReaderFieldFlags.ToBeRestarted = false; + CodecReaderFieldStart(); + } + return true; + } + return false; } void CodecThresholdSet(uint16_t th) diff --git a/Firmware/Chameleon-Mini/Codec/Codec.h b/Firmware/Chameleon-Mini/Codec/Codec.h index 14bf6ef..38927dc 100644 --- a/Firmware/Chameleon-Mini/Codec/Codec.h +++ b/Firmware/Chameleon-Mini/Codec/Codec.h @@ -98,8 +98,8 @@ extern uint16_t Reader_FWT; #define FWI2FWT(x) ((uint32_t)(256 * 16 * ((uint32_t)1 << (x))) / (CODEC_CARRIER_FREQ / 1000) + 1) typedef enum { - CODEC_SUBCARRIERMOD_OFF, - CODEC_SUBCARRIERMOD_OOK + CODEC_SUBCARRIERMOD_OFF, + CODEC_SUBCARRIERMOD_OOK } SubcarrierModType; extern uint8_t CodecBuffer[CODEC_BUFFER_SIZE]; @@ -127,7 +127,7 @@ INLINE void CodecInitCommon(void) #else #error Option not supported #endif - CODEC_CARRIER_IN_PORT.DIRCLR = CODEC_CARRIER_IN_MASK; + CODEC_CARRIER_IN_PORT.DIRCLR = CODEC_CARRIER_IN_MASK; EVSYS.CH6MUX = CODEC_CARRIER_IN_EVMUX; /* Configure two DEMOD pins for input. @@ -143,8 +143,8 @@ INLINE void CodecInitCommon(void) EVSYS.CH0MUX = CODEC_DEMOD_IN_EVMUX0; EVSYS.CH1MUX = CODEC_DEMOD_IN_EVMUX1; - /* Configure loadmod pin configuration and use a virtual port configuration - * for single instruction cycle access */ + /* Configure loadmod pin configuration and use a virtual port configuration + * for single instruction cycle access */ CODEC_LOADMOD_PORT.DIRSET = CODEC_LOADMOD_MASK; CODEC_LOADMOD_PORT.OUTCLR = CODEC_LOADMOD_MASK; PORTCFG.VPCTRLA &= ~PORTCFG_VP0MAP_gm; @@ -188,21 +188,21 @@ INLINE void CodecInitCommon(void) INLINE void CodecSetSubcarrier(SubcarrierModType ModType, uint16_t Divider) { - if (ModType == CODEC_SUBCARRIERMOD_OFF) { - CODEC_SUBCARRIER_TIMER.CTRLA = TC_CLKSEL_OFF_gc; - CODEC_SUBCARRIER_TIMER.CTRLB = 0; - } else if (ModType == CODEC_SUBCARRIERMOD_OOK) { - /* Configure subcarrier generation with 50% DC output using OOK */ - CODEC_SUBCARRIER_TIMER.CNT = 0; - CODEC_SUBCARRIER_TIMER.PER = Divider - 1; - CODEC_SUBCARRIER_TIMER.CODEC_SUBCARRIER_CC_OOK = Divider/2; - CODEC_SUBCARRIER_TIMER.CTRLB = CODEC_SUBCARRIER_CCEN_OOK | TC_WGMODE_SINGLESLOPE_gc; - } + if (ModType == CODEC_SUBCARRIERMOD_OFF) { + CODEC_SUBCARRIER_TIMER.CTRLA = TC_CLKSEL_OFF_gc; + CODEC_SUBCARRIER_TIMER.CTRLB = 0; + } else if (ModType == CODEC_SUBCARRIERMOD_OOK) { + /* Configure subcarrier generation with 50% DC output using OOK */ + CODEC_SUBCARRIER_TIMER.CNT = 0; + CODEC_SUBCARRIER_TIMER.PER = Divider - 1; + CODEC_SUBCARRIER_TIMER.CODEC_SUBCARRIER_CC_OOK = Divider/2; + CODEC_SUBCARRIER_TIMER.CTRLB = CODEC_SUBCARRIER_CCEN_OOK | TC_WGMODE_SINGLESLOPE_gc; + } } INLINE void CodecStartSubcarrier(void) { - CODEC_SUBCARRIER_TIMER.CTRLA = CODEC_TIMER_CARRIER_CLKSEL; + CODEC_SUBCARRIER_TIMER.CTRLA = CODEC_TIMER_CARRIER_CLKSEL; } INLINE void CodecSetDemodPower(bool bOnOff) @@ -215,36 +215,36 @@ INLINE void CodecSetDemodPower(bool bOnOff) } INLINE bool CodecGetLoadmodState(void) { - if (ACA.STATUS & AC_AC0STATE_bm) { - return true; - } else { - return false; - } + if (ACA.STATUS & AC_AC0STATE_bm) { + return true; + } else { + return false; + } } INLINE void CodecSetLoadmodState(bool bOnOff) { - if (bOnOff) { - VPORT0.OUT |= CODEC_LOADMOD_MASK; - } else { - VPORT0.OUT &= ~CODEC_LOADMOD_MASK; - } + if (bOnOff) { + VPORT0.OUT |= CODEC_LOADMOD_MASK; + } else { + VPORT0.OUT &= ~CODEC_LOADMOD_MASK; + } } INLINE void CodecSetReaderField(bool bOnOff) { // this is the function for turning on/off the reader field dumbly; before using this function, please consider to use CodecReaderField{Start,Stop} - if (bOnOff) { - /* Start timer for field generation and unmask outputs */ - CODEC_READER_TIMER.CTRLA = TC_CLKSEL_DIV1_gc; - AWEXC.OUTOVEN = CODEC_READER_MASK; - } else { - /* Disable outputs of AWEX and stop field generation */ - AWEXC.OUTOVEN = 0x00; - CODEC_READER_TIMER.CTRLA = TC_CLKSEL_OFF_gc; - } + if (bOnOff) { + /* Start timer for field generation and unmask outputs */ + CODEC_READER_TIMER.CTRLA = TC_CLKSEL_DIV1_gc; + AWEXC.OUTOVEN = CODEC_READER_MASK; + } else { + /* Disable outputs of AWEX and stop field generation */ + AWEXC.OUTOVEN = 0x00; + CODEC_READER_TIMER.CTRLA = TC_CLKSEL_OFF_gc; + } } INLINE bool CodecGetReaderField(void) { - return (CODEC_READER_TIMER.CTRLA == TC_CLKSEL_DIV1_gc) && (AWEXC.OUTOVEN == CODEC_READER_MASK); + return (CODEC_READER_TIMER.CTRLA == TC_CLKSEL_DIV1_gc) && (AWEXC.OUTOVEN == CODEC_READER_MASK); } void CodecReaderFieldStart(void); diff --git a/Firmware/Chameleon-Mini/Codec/ISO14443-2A.c b/Firmware/Chameleon-Mini/Codec/ISO14443-2A.c index 7c621d5..e43ea61 100644 --- a/Firmware/Chameleon-Mini/Codec/ISO14443-2A.c +++ b/Firmware/Chameleon-Mini/Codec/ISO14443-2A.c @@ -24,11 +24,11 @@ static volatile struct { } Flags = { 0 }; typedef enum { - /* Demod */ - DEMOD_DATA_BIT, - DEMOD_PARITY_BIT, + /* Demod */ + DEMOD_DATA_BIT, + DEMOD_PARITY_BIT, - /* Loadmod */ + /* Loadmod */ LOADMOD_FDT, LOADMOD_START, LOADMOD_START_BIT0, @@ -120,7 +120,7 @@ ISR(CODEC_TIMER_SAMPLING_CCA_VECT) { SampleRegister = (SampleRegister << 1) | (!SamplePin ? 0x01 : 0x00); if (SampleIdxRegister) { - SampleIdxRegister = 0; + SampleIdxRegister = 0; /* Analyze the sampling register after 2 samples. */ if ((SampleRegister & 0x07) == 0x07) { /* No carrier modulation for 3 sample points. EOC! */ @@ -201,7 +201,7 @@ ISR(CODEC_TIMER_SAMPLING_CCA_VECT) { *ParityBufferPtr++ = Bit; StateRegister = DEMOD_DATA_BIT; } else { - /* Should never Happen (TM) */ + /* Should never Happen (TM) */ } } else { /* 00 sequence. -> No valid data yet. This also occurs if we just started @@ -210,7 +210,7 @@ ISR(CODEC_TIMER_SAMPLING_CCA_VECT) { } } else { /* On odd sample position just sample. */ - SampleIdxRegister = ~SampleIdxRegister; + SampleIdxRegister = ~SampleIdxRegister; } /* Make sure the sampling timer gets automatically aligned to the @@ -224,23 +224,23 @@ ISR(CODEC_TIMER_LOADMOD_OVF_VECT) { /* Bit rate timer. Output a half bit on the output. */ static void* JumpTable[] = { - [LOADMOD_FDT] = &&LOADMOD_FDT_LABEL, - [LOADMOD_START] = &&LOADMOD_START_LABEL, - [LOADMOD_START_BIT0] = &&LOADMOD_START_BIT0_LABEL, - [LOADMOD_START_BIT1] = &&LOADMOD_START_BIT1_LABEL, - [LOADMOD_DATA0] = &&LOADMOD_DATA0_LABEL, - [LOADMOD_DATA1] = &&LOADMOD_DATA1_LABEL, - [LOADMOD_PARITY0] = &&LOADMOD_PARITY0_LABEL, - [LOADMOD_PARITY1] = &&LOADMOD_PARITY1_LABEL, - [LOADMOD_STOP_BIT0] = &&LOADMOD_STOP_BIT0_LABEL, - [LOADMOD_STOP_BIT1] = &&LOADMOD_STOP_BIT1_LABEL, - [LOADMOD_FINISHED] = &&LOADMOD_FINISHED_LABEL + [LOADMOD_FDT] = &&LOADMOD_FDT_LABEL, + [LOADMOD_START] = &&LOADMOD_START_LABEL, + [LOADMOD_START_BIT0] = &&LOADMOD_START_BIT0_LABEL, + [LOADMOD_START_BIT1] = &&LOADMOD_START_BIT1_LABEL, + [LOADMOD_DATA0] = &&LOADMOD_DATA0_LABEL, + [LOADMOD_DATA1] = &&LOADMOD_DATA1_LABEL, + [LOADMOD_PARITY0] = &&LOADMOD_PARITY0_LABEL, + [LOADMOD_PARITY1] = &&LOADMOD_PARITY1_LABEL, + [LOADMOD_STOP_BIT0] = &&LOADMOD_STOP_BIT0_LABEL, + [LOADMOD_STOP_BIT1] = &&LOADMOD_STOP_BIT1_LABEL, + [LOADMOD_FINISHED] = &&LOADMOD_FINISHED_LABEL }; if ( (StateRegister >= LOADMOD_FDT) && (StateRegister <= LOADMOD_FINISHED) ) { - goto *JumpTable[StateRegister]; + goto *JumpTable[StateRegister]; } else { - return; + return; } LOADMOD_FDT_LABEL: @@ -253,17 +253,17 @@ ISR(CODEC_TIMER_LOADMOD_OVF_VECT) { /* Fallthrough to first bit */ LOADMOD_START_BIT0_LABEL: - /* Start subcarrier generation, output startbit and align to bitrate. */ - CodecSetLoadmodState(true); - CodecStartSubcarrier(); + /* Start subcarrier generation, output startbit and align to bitrate. */ + CodecSetLoadmodState(true); + CodecStartSubcarrier(); - CODEC_TIMER_LOADMOD.PER = ISO14443A_BIT_RATE_CYCLES / 2 - 1; + CODEC_TIMER_LOADMOD.PER = ISO14443A_BIT_RATE_CYCLES / 2 - 1; StateRegister = LOADMOD_START_BIT1; return; LOADMOD_START_BIT1_LABEL: - CodecSetLoadmodState(false); + CodecSetLoadmodState(false); StateRegister = LOADMOD_DATA0; ParityRegister = ~0; BitSent = 0; @@ -272,12 +272,12 @@ ISR(CODEC_TIMER_LOADMOD_OVF_VECT) { DataRegister = *CodecBufferPtr; return; - LOADMOD_DATA0_LABEL: + LOADMOD_DATA0_LABEL: if (DataRegister & 1) { - CodecSetLoadmodState(true); - ParityRegister = ~ParityRegister; + CodecSetLoadmodState(true); + ParityRegister = ~ParityRegister; } else { - CodecSetLoadmodState(false); + CodecSetLoadmodState(false); } StateRegister = LOADMOD_DATA1; @@ -285,9 +285,9 @@ ISR(CODEC_TIMER_LOADMOD_OVF_VECT) { LOADMOD_DATA1_LABEL: if (DataRegister & 1) { - CodecSetLoadmodState(false); + CodecSetLoadmodState(false); } else { - CodecSetLoadmodState(true); + CodecSetLoadmodState(true); } DataRegister = DataRegister >> 1; @@ -300,47 +300,47 @@ ISR(CODEC_TIMER_LOADMOD_OVF_VECT) { /* End of transmission without byte boundary. Don't send parity. */ StateRegister = LOADMOD_STOP_BIT0; } else { - /* Next bit is data */ - StateRegister = LOADMOD_DATA0; + /* Next bit is data */ + StateRegister = LOADMOD_DATA0; } return; LOADMOD_PARITY0_LABEL: - if (ParityBufferPtr != NULL) { - if (*ParityBufferPtr) { - CodecSetLoadmodState(true); - } else { - CodecSetLoadmodState(false); - } - } else { - if (ParityRegister) { - CodecSetLoadmodState(true); - } else { - CodecSetLoadmodState(false); - } - } + if (ParityBufferPtr != NULL) { + if (*ParityBufferPtr) { + CodecSetLoadmodState(true); + } else { + CodecSetLoadmodState(false); + } + } else { + if (ParityRegister) { + CodecSetLoadmodState(true); + } else { + CodecSetLoadmodState(false); + } + } StateRegister = LOADMOD_PARITY1; return; LOADMOD_PARITY1_LABEL: - if (ParityBufferPtr != NULL) { - if (*ParityBufferPtr) { - CodecSetLoadmodState(false); - } else { - CodecSetLoadmodState(true); - } + if (ParityBufferPtr != NULL) { + if (*ParityBufferPtr) { + CodecSetLoadmodState(false); + } else { + CodecSetLoadmodState(true); + } ParityBufferPtr++; - } else { - if (ParityRegister) { - CodecSetLoadmodState(false); - } else { - CodecSetLoadmodState(true); - } + } else { + if (ParityRegister) { + CodecSetLoadmodState(false); + } else { + CodecSetLoadmodState(true); + } - ParityRegister = ~0; - } + ParityRegister = ~0; + } if (BitSent == BitCount) { /* No data left */ @@ -354,12 +354,12 @@ ISR(CODEC_TIMER_LOADMOD_OVF_VECT) { return; LOADMOD_STOP_BIT0_LABEL: - CodecSetLoadmodState(false); + CodecSetLoadmodState(false); StateRegister = LOADMOD_STOP_BIT1; return; LOADMOD_STOP_BIT1_LABEL: - CodecSetLoadmodState(false); + CodecSetLoadmodState(false); StateRegister = LOADMOD_FINISHED; return; @@ -378,25 +378,25 @@ ISR(CODEC_TIMER_LOADMOD_OVF_VECT) { void ISO14443ACodecInit(void) { /* Initialize some global vars and start looking out for reader commands */ - Flags.DemodFinished = 0; - Flags.LoadmodFinished = 0; + Flags.DemodFinished = 0; + Flags.LoadmodFinished = 0; - CodecInitCommon(); + CodecInitCommon(); StartDemod(); } void ISO14443ACodecDeInit(void) { - /* Gracefully shutdown codec */ - CODEC_DEMOD_IN_PORT.INT0MASK = 0; + /* Gracefully shutdown codec */ + CODEC_DEMOD_IN_PORT.INT0MASK = 0; - Flags.DemodFinished = 0; - Flags.LoadmodFinished = 0; + Flags.DemodFinished = 0; + Flags.LoadmodFinished = 0; CODEC_TIMER_SAMPLING.CTRLA = TC_CLKSEL_OFF_gc; - CODEC_TIMER_SAMPLING.CTRLD = TC_EVACT_OFF_gc; + CODEC_TIMER_SAMPLING.CTRLD = TC_EVACT_OFF_gc; CODEC_TIMER_SAMPLING.INTCTRLB = TC_CCAINTLVL_OFF_gc; - CODEC_TIMER_SAMPLING.INTFLAGS = TC0_CCAIF_bm; + CODEC_TIMER_SAMPLING.INTFLAGS = TC0_CCAIF_bm; CODEC_TIMER_LOADMOD.CTRLA = TC_CLKSEL_OFF_gc; @@ -431,7 +431,7 @@ void ISO14443ACodecTask(void) { ParityBufferPtr = &CodecBuffer[ISO14443A_BUFFER_PARITY_OFFSET]; } else { /* We have to generate the parity bits ourself */ - ParityBufferPtr = 0; + ParityBufferPtr = 0; } } diff --git a/Firmware/Chameleon-Mini/Codec/Reader14443-2A.c b/Firmware/Chameleon-Mini/Codec/Reader14443-2A.c index a2f9d1c..10bb076 100644 --- a/Firmware/Chameleon-Mini/Codec/Reader14443-2A.c +++ b/Firmware/Chameleon-Mini/Codec/Reader14443-2A.c @@ -27,14 +27,14 @@ static volatile struct { static volatile uint16_t RxPendingSince; static volatile enum { - STATE_IDLE, - STATE_MILLER_SOF0, - STATE_MILLER_SOF1, - STATE_MILLER_TX0, - STATE_MILLER_TX1, - STATE_MILLER_EOF0, - STATE_MILLER_EOF1, - STATE_FDT + STATE_IDLE, + STATE_MILLER_SOF0, + STATE_MILLER_SOF1, + STATE_MILLER_TX0, + STATE_MILLER_TX1, + STATE_MILLER_EOF0, + STATE_MILLER_EOF1, + STATE_FDT } State; // GPIOR0 and 1 are used as storage for the timer value of the current modulation @@ -51,8 +51,8 @@ static volatile enum { void Reader14443ACodecInit(void) { /* Initialize common peripherals and start listening * for incoming data. */ - CodecInitCommon(); - CodecSetDemodPower(true); + CodecInitCommon(); + CodecSetDemodPower(true); CODEC_TIMER_SAMPLING.PER = SAMPLE_RATE_SYSTEM_CYCLES/2 - 1; CODEC_TIMER_SAMPLING.CCB = 1; @@ -69,27 +69,27 @@ void Reader14443ACodecInit(void) { } void Reader14443ACodecDeInit(void) { - CodecSetDemodPower(false); - CodecReaderFieldStop(); - CODEC_TIMER_SAMPLING.CTRLA = 0; - CODEC_TIMER_SAMPLING.INTCTRLB = 0; - CODEC_TIMER_LOADMOD.CTRLA = 0; - CODEC_TIMER_LOADMOD.INTCTRLB = 0; - Flags.RxDone = false; - Flags.RxPending = false; - Flags.Start = false; + CodecSetDemodPower(false); + CodecReaderFieldStop(); + CODEC_TIMER_SAMPLING.CTRLA = 0; + CODEC_TIMER_SAMPLING.INTCTRLB = 0; + CODEC_TIMER_LOADMOD.CTRLA = 0; + CODEC_TIMER_LOADMOD.INTCTRLB = 0; + Flags.RxDone = false; + Flags.RxPending = false; + Flags.Start = false; } INLINE void Reader14443A_EOC(void) { - CODEC_TIMER_LOADMOD.INTCTRLB = 0; + CODEC_TIMER_LOADMOD.INTCTRLB = 0; CODEC_TIMER_LOADMOD.CTRLA = TC_CLKSEL_OFF_gc; CODEC_TIMER_TIMESTAMPS.INTCTRLB = 0; CODEC_TIMER_TIMESTAMPS.CTRLA = TC_CLKSEL_OFF_gc; ACA.AC1CTRL &= ~AC_ENABLE_bm; - if (BitCount % 8) // copy the last byte, if there is an incomplete byte - CodecBuffer[BitCount / 8] = SampleRegister >> (8 - (BitCount % 8)); + if (BitCount % 8) // copy the last byte, if there is an incomplete byte + CodecBuffer[BitCount / 8] = SampleRegister >> (8 - (BitCount % 8)); Flags.RxDone = true; Flags.RxPending = false; @@ -106,309 +106,309 @@ INLINE void Reader14443A_EOC(void) ISR(CODEC_TIMER_SAMPLING_CCB_VECT) { - static void * JumpTable[] = { - [STATE_IDLE] = &&STATE_IDLE_LABEL, - [STATE_MILLER_SOF0] = &&STATE_MILLER_SOF0_LABEL, - [STATE_MILLER_SOF1] = &&STATE_MILLER_SOF1_LABEL, - [STATE_MILLER_TX0] = &&STATE_MILLER_TX0_LABEL, - [STATE_MILLER_TX1] = &&STATE_MILLER_TX1_LABEL, - [STATE_MILLER_EOF0] = &&STATE_MILLER_EOF0_LABEL, - [STATE_MILLER_EOF1] = &&STATE_MILLER_EOF1_LABEL, - [STATE_FDT] = &&STATE_FDT_LABEL - }; + static void * JumpTable[] = { + [STATE_IDLE] = &&STATE_IDLE_LABEL, + [STATE_MILLER_SOF0] = &&STATE_MILLER_SOF0_LABEL, + [STATE_MILLER_SOF1] = &&STATE_MILLER_SOF1_LABEL, + [STATE_MILLER_TX0] = &&STATE_MILLER_TX0_LABEL, + [STATE_MILLER_TX1] = &&STATE_MILLER_TX1_LABEL, + [STATE_MILLER_EOF0] = &&STATE_MILLER_EOF0_LABEL, + [STATE_MILLER_EOF1] = &&STATE_MILLER_EOF1_LABEL, + [STATE_FDT] = &&STATE_FDT_LABEL + }; - goto *JumpTable[State]; + goto *JumpTable[State]; - STATE_MILLER_SOF0_LABEL: - /* Output a SOF */ - CodecSetReaderField(false); - _delay_us(2.5); - CodecSetReaderField(true); + STATE_MILLER_SOF0_LABEL: + /* Output a SOF */ + CodecSetReaderField(false); + _delay_us(2.5); + CodecSetReaderField(true); - CodecBufferIdx = 0; - SampleRegister = CodecBuffer[0]; - BitCountUp = 0; + CodecBufferIdx = 0; + SampleRegister = CodecBuffer[0]; + BitCountUp = 0; - State = STATE_MILLER_SOF1; - return; + State = STATE_MILLER_SOF1; + return; - STATE_MILLER_SOF1_LABEL: - State = STATE_MILLER_TX0; - return; + STATE_MILLER_SOF1_LABEL: + State = STATE_MILLER_TX0; + return; - STATE_MILLER_TX0_LABEL: - /* First half of bit-slot */ - if (SampleRegister & 0x01) { - /* Do Nothing */ - } else { - if (LastBit == 0) { - CodecSetReaderField(false); - _delay_us(2.5); - CodecSetReaderField(true); - } else { - /* Do Nothing */ - } - } + STATE_MILLER_TX0_LABEL: + /* First half of bit-slot */ + if (SampleRegister & 0x01) { + /* Do Nothing */ + } else { + if (LastBit == 0) { + CodecSetReaderField(false); + _delay_us(2.5); + CodecSetReaderField(true); + } else { + /* Do Nothing */ + } + } - State = STATE_MILLER_TX1; - return; + State = STATE_MILLER_TX1; + return; - STATE_MILLER_TX1_LABEL: - /* Second half of bit-slot */ - if (SampleRegister & 0x01) { - CodecSetReaderField(false); - _delay_us(2.5); - CodecSetReaderField(true); - LastBit = 1; - } else { - /* No modulation pauses */ - LastBit = 0; - } + STATE_MILLER_TX1_LABEL: + /* Second half of bit-slot */ + if (SampleRegister & 0x01) { + CodecSetReaderField(false); + _delay_us(2.5); + CodecSetReaderField(true); + LastBit = 1; + } else { + /* No modulation pauses */ + LastBit = 0; + } - SampleRegister >>= 1; - if (--BitCount == 0) { - State = STATE_MILLER_EOF0; - } else { - State = STATE_MILLER_TX0; - } + SampleRegister >>= 1; + if (--BitCount == 0) { + State = STATE_MILLER_EOF0; + } else { + State = STATE_MILLER_TX0; + } - if ((++BitCountUp % 8) == 0) - SampleRegister = CodecBuffer[++CodecBufferIdx]; - return; + if ((++BitCountUp % 8) == 0) + SampleRegister = CodecBuffer[++CodecBufferIdx]; + return; - STATE_MILLER_EOF0_LABEL: - if (LastBit == 0) { - CodecSetReaderField(false); - _delay_us(2.5); - CodecSetReaderField(true); - } else { - /* Do Nothing */ - } + STATE_MILLER_EOF0_LABEL: + if (LastBit == 0) { + CodecSetReaderField(false); + _delay_us(2.5); + CodecSetReaderField(true); + } else { + /* Do Nothing */ + } - State = STATE_MILLER_EOF1; - return; + State = STATE_MILLER_EOF1; + return; - STATE_MILLER_EOF1_LABEL: - CODEC_TIMER_SAMPLING.CTRLA = TC_CLKSEL_OFF_gc; - _delay_us(50); // wait for DEMOD signal to stabilize + STATE_MILLER_EOF1_LABEL: + CODEC_TIMER_SAMPLING.CTRLA = TC_CLKSEL_OFF_gc; + _delay_us(50); // wait for DEMOD signal to stabilize - /* Enable the AC interrupt, which either finds the SOC and then starts the pause-finding timer, - * or it is triggered before the SOC, which mostly isn't bad at all, since the first pause - * needs to be found. */ - ACA.STATUS = AC_AC1IF_bm; - ACA.AC1CTRL = AC_HSMODE_bm | AC_HYSMODE_NO_gc | AC_INTMODE_BOTHEDGES_gc | AC_INTLVL_HI_gc | AC_ENABLE_bm; + /* Enable the AC interrupt, which either finds the SOC and then starts the pause-finding timer, + * or it is triggered before the SOC, which mostly isn't bad at all, since the first pause + * needs to be found. */ + ACA.STATUS = AC_AC1IF_bm; + ACA.AC1CTRL = AC_HSMODE_bm | AC_HYSMODE_NO_gc | AC_INTMODE_BOTHEDGES_gc | AC_INTLVL_HI_gc | AC_ENABLE_bm; - CodecBufferPtr = CodecBuffer; // use GPIOR for faster access - BitCount = 1; // the first modulation of the SOC is "found" implicitly - SampleRegister = 0x80; + CodecBufferPtr = CodecBuffer; // use GPIOR for faster access + BitCount = 1; // the first modulation of the SOC is "found" implicitly + SampleRegister = 0x80; - RxPendingSince = SystemGetSysTick(); - Flags.RxPending = true; + RxPendingSince = SystemGetSysTick(); + Flags.RxPending = true; - // reset for future use - CodecBufferIdx = 0; - BitCountUp = 0; + // reset for future use + CodecBufferIdx = 0; + BitCountUp = 0; - State = STATE_IDLE; - return; + State = STATE_IDLE; + return; - STATE_IDLE_LABEL: - STATE_FDT_LABEL: - return; - } + STATE_IDLE_LABEL: + STATE_FDT_LABEL: + return; + } ISR(CODEC_TIMER_TIMESTAMPS_CCA_VECT) // EOC found { - Reader14443A_EOC(); + Reader14443A_EOC(); } INLINE void Insert0(void) { - SampleRegister >>= 1; - if (++BitCount % 8) - return; - *CodecBufferPtr++ = SampleRegister; + SampleRegister >>= 1; + if (++BitCount % 8) + return; + *CodecBufferPtr++ = SampleRegister; } INLINE void Insert1(void) { - SampleRegister = (SampleRegister >> 1) | 0x80; - if (++BitCount % 8) - return; - *CodecBufferPtr++ = SampleRegister; + SampleRegister = (SampleRegister >> 1) | 0x80; + if (++BitCount % 8) + return; + *CodecBufferPtr++ = SampleRegister; } ISR(ACA_AC1_vect) // this interrupt either finds the SOC or gets triggered before { - ACA.AC1CTRL &= ~AC_INTLVL_HI_gc; // disable this interrupt - // enable the pause-finding timer - CODEC_TIMER_LOADMOD.CTRLD = TC_EVACT_RESTART_gc | TC_EVSEL_CH0_gc; - CODEC_TIMER_LOADMOD.CTRLA = TC_CLKSEL_DIV1_gc; + ACA.AC1CTRL &= ~AC_INTLVL_HI_gc; // disable this interrupt + // enable the pause-finding timer + CODEC_TIMER_LOADMOD.CTRLD = TC_EVACT_RESTART_gc | TC_EVSEL_CH0_gc; + CODEC_TIMER_LOADMOD.CTRLA = TC_CLKSEL_DIV1_gc; } ISR(CODEC_TIMER_LOADMOD_CCA_VECT) // pause found { - uint8_t tmp = CODEC_TIMER_TIMESTAMPS.CNTL; - CODEC_TIMER_TIMESTAMPS.CNT = 0; + uint8_t tmp = CODEC_TIMER_TIMESTAMPS.CNTL; + CODEC_TIMER_TIMESTAMPS.CNT = 0; - /* This needs to be done only on the first call, - * but doing this only on a condition means wasting time, so we do it every time. */ - CODEC_TIMER_TIMESTAMPS.CTRLA = TC_CLKSEL_DIV2_gc; + /* This needs to be done only on the first call, + * but doing this only on a condition means wasting time, so we do it every time. */ + CODEC_TIMER_TIMESTAMPS.CTRLA = TC_CLKSEL_DIV2_gc; - switch (tmp) // decide how many half bit periods have been modulations - { - case 0 ... 96: // 64 ticks is one half of a bit period - Insert0(); - // If one full bit period is over AND the last half bit period also was a pause, - // we have found the EOC. - if ((BitCount & 1) == 0 && (SampleRegister & 0x40) == 0) - Reader14443A_EOC(); - return; + switch (tmp) // decide how many half bit periods have been modulations + { + case 0 ... 96: // 64 ticks is one half of a bit period + Insert0(); + // If one full bit period is over AND the last half bit period also was a pause, + // we have found the EOC. + if ((BitCount & 1) == 0 && (SampleRegister & 0x40) == 0) + Reader14443A_EOC(); + return; - case 97 ... 160: // 128 ticks is a full bit period - Insert1(); - Insert0(); - return; + case 97 ... 160: // 128 ticks is a full bit period + Insert1(); + Insert0(); + return; - default: // every value over 128 + 32 (tolerance) is considered to be 3 half bit periods - Insert1(); - Insert1(); - Insert0(); - return; - } - return; + default: // every value over 128 + 32 (tolerance) is considered to be 3 half bit periods + Insert1(); + Insert1(); + Insert0(); + return; + } + return; } void Reader14443ACodecTask(void) { - if (Flags.RxPending && SYSTICK_DIFF(RxPendingSince) > Reader_FWT + 1) - { - BitCount = 0; - Flags.RxDone = true; - Flags.RxPending = false; - } - if (CodecIsReaderToBeRestarted() || !CodecIsReaderFieldReady()) - return; - if (!Flags.RxPending && (Flags.Start || Flags.RxDone)) - { - if (State == STATE_FDT && CODEC_TIMER_LOADMOD.CNT < ISO14443A_PICC_TO_PCD_MIN_FDT) // we are in frame delay time, so we can return later - return; - if (Flags.RxDone && BitCount > 0) // decode the raw received data - { - if (BitCount < ISO14443A_RX_MINIMUM_BITCOUNT * 2) - { - BitCount = 0; - } else { - uint8_t TmpCodecBuffer[CODEC_BUFFER_SIZE]; - memcpy(TmpCodecBuffer, CodecBuffer, (BitCount + 7) / 8); + if (Flags.RxPending && SYSTICK_DIFF(RxPendingSince) > Reader_FWT + 1) + { + BitCount = 0; + Flags.RxDone = true; + Flags.RxPending = false; + } + if (CodecIsReaderToBeRestarted() || !CodecIsReaderFieldReady()) + return; + if (!Flags.RxPending && (Flags.Start || Flags.RxDone)) + { + if (State == STATE_FDT && CODEC_TIMER_LOADMOD.CNT < ISO14443A_PICC_TO_PCD_MIN_FDT) // we are in frame delay time, so we can return later + return; + if (Flags.RxDone && BitCount > 0) // decode the raw received data + { + if (BitCount < ISO14443A_RX_MINIMUM_BITCOUNT * 2) + { + BitCount = 0; + } else { + uint8_t TmpCodecBuffer[CODEC_BUFFER_SIZE]; + memcpy(TmpCodecBuffer, CodecBuffer, (BitCount + 7) / 8); - CodecBufferPtr = CodecBuffer; - uint16_t BitCountTmp = 0, TotalBitCount = BitCount; - BitCount = 0; + CodecBufferPtr = CodecBuffer; + uint16_t BitCountTmp = 0, TotalBitCount = BitCount; + BitCount = 0; - bool breakflag = false; + bool breakflag = false; - while (!breakflag && BitCountTmp < TotalBitCount) - { - uint8_t Bit = TmpCodecBuffer[BitCountTmp / 8] & 0x03; - TmpCodecBuffer[BitCountTmp / 8] >>= 2; - switch (Bit) - { - case 0b10: - Insert0(); - break; + while (!breakflag && BitCountTmp < TotalBitCount) + { + uint8_t Bit = TmpCodecBuffer[BitCountTmp / 8] & 0x03; + TmpCodecBuffer[BitCountTmp / 8] >>= 2; + switch (Bit) + { + case 0b10: + Insert0(); + break; - case 0b01: - Insert1(); - break; + case 0b01: + Insert1(); + break; - case 0b00: // EOC - if (BitCount % 8) // copy the last byte, if there is an incomplete byte - CodecBuffer[BitCount / 8] = SampleRegister >> (8 - (BitCount % 8)); - LEDHook(LED_CODEC_RX, LED_PULSE); - LogEntry(LOG_INFO_CODEC_RX_DATA_W_PARITY, CodecBuffer, (BitCount + 7) / 8); - breakflag = true; - break; + case 0b00: // EOC + if (BitCount % 8) // copy the last byte, if there is an incomplete byte + CodecBuffer[BitCount / 8] = SampleRegister >> (8 - (BitCount % 8)); + LEDHook(LED_CODEC_RX, LED_PULSE); + LogEntry(LOG_INFO_CODEC_RX_DATA_W_PARITY, CodecBuffer, (BitCount + 7) / 8); + breakflag = true; + break; - default: - // error, should not happen, TODO handle this - break; - } - BitCountTmp += 2; - } - } - } - Flags.Start = false; - Flags.RxDone = false; + default: + // error, should not happen, TODO handle this + break; + } + BitCountTmp += 2; + } + } + } + Flags.Start = false; + Flags.RxDone = false; - /* Call application with received data */ - BitCount = ApplicationProcess(CodecBuffer, BitCount); + /* Call application with received data */ + BitCount = ApplicationProcess(CodecBuffer, BitCount); - if (BitCount > 0) - { - /* - * Prepare for Manchester decoding. - * The basic idea is to use two timers. The first one will be reset everytime the DEMOD signal - * passes a (configurable) threshold. This is realized with the event system and an analog - * comparator. - * Once this timer reaches 3/4 of a bit half (this means it has not been reset this long), we - * assume there is a pause. Now we read the second timers count value and can decide how many - * bit halves had modulations since the last pause. - */ + if (BitCount > 0) + { + /* + * Prepare for Manchester decoding. + * The basic idea is to use two timers. The first one will be reset everytime the DEMOD signal + * passes a (configurable) threshold. This is realized with the event system and an analog + * comparator. + * Once this timer reaches 3/4 of a bit half (this means it has not been reset this long), we + * assume there is a pause. Now we read the second timers count value and can decide how many + * bit halves had modulations since the last pause. + */ - /* Configure and enable the analog comparator for finding pauses in the DEMOD signal. */ - ACA.AC1CTRL = AC_HSMODE_bm | AC_HYSMODE_NO_gc | AC_INTMODE_BOTHEDGES_gc | AC_ENABLE_bm; + /* Configure and enable the analog comparator for finding pauses in the DEMOD signal. */ + ACA.AC1CTRL = AC_HSMODE_bm | AC_HYSMODE_NO_gc | AC_INTMODE_BOTHEDGES_gc | AC_ENABLE_bm; - /* This timer will be used to detect the pauses between the modulation sequences. */ - CODEC_TIMER_LOADMOD.CTRLA = 0; - CODEC_TIMER_LOADMOD.CNT = 0; - CODEC_TIMER_LOADMOD.PER = 127; // with 27.12 MHz this is exactly one half bit width - CODEC_TIMER_LOADMOD.CCA = 95; // with 27.12 MHz this is 3/4 of a half bit width - CODEC_TIMER_LOADMOD.INTCTRLA = 0; - CODEC_TIMER_LOADMOD.INTFLAGS = TC1_CCAIF_bm; - CODEC_TIMER_LOADMOD.INTCTRLB = TC_CCAINTLVL_HI_gc; + /* This timer will be used to detect the pauses between the modulation sequences. */ + CODEC_TIMER_LOADMOD.CTRLA = 0; + CODEC_TIMER_LOADMOD.CNT = 0; + CODEC_TIMER_LOADMOD.PER = 127; // with 27.12 MHz this is exactly one half bit width + CODEC_TIMER_LOADMOD.CCA = 95; // with 27.12 MHz this is 3/4 of a half bit width + CODEC_TIMER_LOADMOD.INTCTRLA = 0; + CODEC_TIMER_LOADMOD.INTFLAGS = TC1_CCAIF_bm; + CODEC_TIMER_LOADMOD.INTCTRLB = TC_CCAINTLVL_HI_gc; - /* This timer will be used to find out how many bit halfs since the last pause have been passed. */ - CODEC_TIMER_TIMESTAMPS.CNT = 0; - CODEC_TIMER_TIMESTAMPS.PER = 0xFFFF; - CODEC_TIMER_TIMESTAMPS.CCA = 256; - CODEC_TIMER_TIMESTAMPS.INTCTRLA = 0; - CODEC_TIMER_TIMESTAMPS.INTFLAGS = TC1_CCAIF_bm; - CODEC_TIMER_TIMESTAMPS.INTCTRLB = TC_CCAINTLVL_LO_gc; + /* This timer will be used to find out how many bit halfs since the last pause have been passed. */ + CODEC_TIMER_TIMESTAMPS.CNT = 0; + CODEC_TIMER_TIMESTAMPS.PER = 0xFFFF; + CODEC_TIMER_TIMESTAMPS.CCA = 256; + CODEC_TIMER_TIMESTAMPS.INTCTRLA = 0; + CODEC_TIMER_TIMESTAMPS.INTFLAGS = TC1_CCAIF_bm; + CODEC_TIMER_TIMESTAMPS.INTCTRLB = TC_CCAINTLVL_LO_gc; - /* Use the event system for resetting the pause-detecting timer. */ - EVSYS.CH0MUX = EVSYS_CHMUX_ACA_CH1_gc; // on every ACA_AC1 INT - EVSYS.CH0CTRL = EVSYS_DIGFILT_1SAMPLE_gc; + /* Use the event system for resetting the pause-detecting timer. */ + EVSYS.CH0MUX = EVSYS_CHMUX_ACA_CH1_gc; // on every ACA_AC1 INT + EVSYS.CH0CTRL = EVSYS_DIGFILT_1SAMPLE_gc; - ACA.AC0CTRL = 0; - CODEC_DEMOD_IN_PORT.INTCTRL = 0; + ACA.AC0CTRL = 0; + CODEC_DEMOD_IN_PORT.INTCTRL = 0; - LEDHook(LED_CODEC_TX, LED_PULSE); - LogEntry(LOG_INFO_CODEC_TX_DATA_W_PARITY, CodecBuffer, (BitCount + 7) / 8); + LEDHook(LED_CODEC_TX, LED_PULSE); + LogEntry(LOG_INFO_CODEC_TX_DATA_W_PARITY, CodecBuffer, (BitCount + 7) / 8); - /* Set state and start timer for Miller encoding. */ - State = STATE_MILLER_SOF0; - LastBit = 0; - CODEC_TIMER_SAMPLING.CNT = 0; - CODEC_TIMER_SAMPLING.CTRLA = TC_CLKSEL_DIV1_gc; - } - } + /* Set state and start timer for Miller encoding. */ + State = STATE_MILLER_SOF0; + LastBit = 0; + CODEC_TIMER_SAMPLING.CNT = 0; + CODEC_TIMER_SAMPLING.CTRLA = TC_CLKSEL_DIV1_gc; + } + } } void Reader14443ACodecStart(void) { - /* Application wants us to start a card transaction */ - BitCount = 0; - Flags.Start = true; + /* Application wants us to start a card transaction */ + BitCount = 0; + Flags.Start = true; - CodecReaderFieldStart(); + CodecReaderFieldStart(); } void Reader14443ACodecReset(void) { - Reader14443A_EOC(); // this breaks every interrupt etc. - State = STATE_IDLE; - Flags.RxDone = false; - Flags.Start = false; - CodecReaderFieldStop(); + Reader14443A_EOC(); // this breaks every interrupt etc. + State = STATE_IDLE; + Flags.RxDone = false; + Flags.Start = false; + CodecReaderFieldStop(); } diff --git a/Firmware/Chameleon-Mini/Common.c b/Firmware/Chameleon-Mini/Common.c index 51dd452..1e33304 100644 --- a/Firmware/Chameleon-Mini/Common.c +++ b/Firmware/Chameleon-Mini/Common.c @@ -8,22 +8,22 @@ const uint8_t PROGMEM BitReverseByteTable[256] = { }; const uint8_t PROGMEM OddParityByteTable[256] = { - 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, - 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, - 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, - 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, - 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, - 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, - 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, - 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, - 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, - 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, - 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, - 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, - 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, - 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, - 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, - 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, + 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, + 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, + 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, + 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, + 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, + 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, + 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, + 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, + 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, + 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, + 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, + 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, + 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, + 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, + 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, + 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, }; uint16_t BufferToHexString(char* HexOut, uint16_t MaxChars, const void* Buffer, uint16_t ByteCount) diff --git a/Firmware/Chameleon-Mini/Common.h b/Firmware/Chameleon-Mini/Common.h index 86875bc..80cd0f0 100644 --- a/Firmware/Chameleon-Mini/Common.h +++ b/Firmware/Chameleon-Mini/Common.h @@ -38,31 +38,31 @@ uint16_t HexStringToBuffer(void* Buffer, uint16_t MaxBytes, const char* HexIn); INLINE uint8_t BitReverseByte(uint8_t Byte) { - extern const uint8_t PROGMEM BitReverseByteTable[]; + extern const uint8_t PROGMEM BitReverseByteTable[]; - return pgm_read_byte(&BitReverseByteTable[Byte]); + return pgm_read_byte(&BitReverseByteTable[Byte]); } INLINE uint8_t OddParityBit(uint8_t Byte) { - extern const uint8_t PROGMEM OddParityByteTable[]; + extern const uint8_t PROGMEM OddParityByteTable[]; - return pgm_read_byte(&OddParityByteTable[Byte]); + return pgm_read_byte(&OddParityByteTable[Byte]); } INLINE uint8_t StringLength(const char* Str, uint8_t MaxLen) { - uint8_t StrLen = 0; + uint8_t StrLen = 0; - while(MaxLen > 0) { - if (*Str++ == '\0') - break; + while(MaxLen > 0) { + if (*Str++ == '\0') + break; - MaxLen--; - StrLen++; - } + MaxLen--; + StrLen++; + } - return StrLen; + return StrLen; } #endif /* COMMON_H_ */ diff --git a/Firmware/Chameleon-Mini/Configuration.c b/Firmware/Chameleon-Mini/Configuration.c index d7cad61..ebbea50 100644 --- a/Firmware/Chameleon-Mini/Configuration.c +++ b/Firmware/Chameleon-Mini/Configuration.c @@ -13,27 +13,27 @@ /* Map IDs to text */ static const MapEntryType PROGMEM ConfigurationMap[] = { - { .Id = CONFIG_NONE, .Text = "NONE" }, + { .Id = CONFIG_NONE, .Text = "NONE" }, #ifdef CONFIG_MF_ULTRALIGHT_SUPPORT - { .Id = CONFIG_MF_ULTRALIGHT, .Text = "MF_ULTRALIGHT" }, + { .Id = CONFIG_MF_ULTRALIGHT, .Text = "MF_ULTRALIGHT" }, #endif #ifdef CONFIG_MF_CLASSIC_1K_SUPPORT - { .Id = CONFIG_MF_CLASSIC_1K, .Text = "MF_CLASSIC_1K" }, + { .Id = CONFIG_MF_CLASSIC_1K, .Text = "MF_CLASSIC_1K" }, #endif #ifdef CONFIG_MF_CLASSIC_1K_7B_SUPPORT - { .Id = CONFIG_MF_CLASSIC_1K_7B, .Text = "MF_CLASSIC_1K_7B" }, + { .Id = CONFIG_MF_CLASSIC_1K_7B, .Text = "MF_CLASSIC_1K_7B" }, #endif #ifdef CONFIG_MF_CLASSIC_4K_SUPPORT - { .Id = CONFIG_MF_CLASSIC_4K, .Text = "MF_CLASSIC_4K" }, + { .Id = CONFIG_MF_CLASSIC_4K, .Text = "MF_CLASSIC_4K" }, #endif #ifdef CONFIG_MF_CLASSIC_4K_7B_SUPPORT - { .Id = CONFIG_MF_CLASSIC_4K_7B, .Text = "MF_CLASSIC_4K_7B" }, + { .Id = CONFIG_MF_CLASSIC_4K_7B, .Text = "MF_CLASSIC_4K_7B" }, #endif #ifdef CONFIG_ISO14443A_SNIFF_SUPPORT - { .Id = CONFIG_ISO14443A_SNIFF, .Text = "ISO14443A_SNIFF" }, + { .Id = CONFIG_ISO14443A_SNIFF, .Text = "ISO14443A_SNIFF" }, #endif #ifdef CONFIG_ISO14443A_READER_SUPPORT - { .Id = CONFIG_ISO14443A_READER, .Text = "ISO14443A_READER" }, + { .Id = CONFIG_ISO14443A_READER, .Text = "ISO14443A_READER" }, #endif }; @@ -105,19 +105,19 @@ static const PROGMEM ConfigurationType ConfigurationTable[] = { #endif #ifdef CONFIG_MF_CLASSIC_1K_7B_SUPPORT [CONFIG_MF_CLASSIC_1K_7B] = { - .CodecInitFunc = ISO14443ACodecInit, - .CodecDeInitFunc = ISO14443ACodecDeInit, - .CodecTaskFunc = ISO14443ACodecTask, - .ApplicationInitFunc = MifareClassicAppInit1K7B, - .ApplicationResetFunc = MifareClassicAppReset, - .ApplicationTaskFunc = MifareClassicAppTask, - .ApplicationTickFunc = ApplicationTickDummy, - .ApplicationProcessFunc = MifareClassicAppProcess, - .ApplicationGetUidFunc = MifareClassicGetUid, - .ApplicationSetUidFunc = MifareClassicSetUid, - .UidSize = ISO14443A_UID_SIZE_DOUBLE, - .MemorySize = MIFARE_CLASSIC_1K_MEM_SIZE, - .ReadOnly = false + .CodecInitFunc = ISO14443ACodecInit, + .CodecDeInitFunc = ISO14443ACodecDeInit, + .CodecTaskFunc = ISO14443ACodecTask, + .ApplicationInitFunc = MifareClassicAppInit1K7B, + .ApplicationResetFunc = MifareClassicAppReset, + .ApplicationTaskFunc = MifareClassicAppTask, + .ApplicationTickFunc = ApplicationTickDummy, + .ApplicationProcessFunc = MifareClassicAppProcess, + .ApplicationGetUidFunc = MifareClassicGetUid, + .ApplicationSetUidFunc = MifareClassicSetUid, + .UidSize = ISO14443A_UID_SIZE_DOUBLE, + .MemorySize = MIFARE_CLASSIC_1K_MEM_SIZE, + .ReadOnly = false }, #endif #ifdef CONFIG_MF_CLASSIC_4K_SUPPORT @@ -156,36 +156,36 @@ static const PROGMEM ConfigurationType ConfigurationTable[] = { #endif #ifdef CONFIG_ISO14443A_SNIFF_SUPPORT [CONFIG_ISO14443A_SNIFF] = { - .CodecInitFunc = ISO14443ACodecInit, - .CodecDeInitFunc = ISO14443ACodecDeInit, - .CodecTaskFunc = ISO14443ACodecTask, - .ApplicationInitFunc = ApplicationInitDummy, - .ApplicationResetFunc = ApplicationResetDummy, - .ApplicationTaskFunc = ApplicationTaskDummy, - .ApplicationTickFunc = ApplicationTickDummy, - .ApplicationProcessFunc = ApplicationProcessDummy, - .ApplicationGetUidFunc = ApplicationGetUidDummy, - .ApplicationSetUidFunc = ApplicationSetUidDummy, - .UidSize = 0, - .MemorySize = 0, - .ReadOnly = true + .CodecInitFunc = ISO14443ACodecInit, + .CodecDeInitFunc = ISO14443ACodecDeInit, + .CodecTaskFunc = ISO14443ACodecTask, + .ApplicationInitFunc = ApplicationInitDummy, + .ApplicationResetFunc = ApplicationResetDummy, + .ApplicationTaskFunc = ApplicationTaskDummy, + .ApplicationTickFunc = ApplicationTickDummy, + .ApplicationProcessFunc = ApplicationProcessDummy, + .ApplicationGetUidFunc = ApplicationGetUidDummy, + .ApplicationSetUidFunc = ApplicationSetUidDummy, + .UidSize = 0, + .MemorySize = 0, + .ReadOnly = true }, #endif #ifdef CONFIG_ISO14443A_READER_SUPPORT [CONFIG_ISO14443A_READER] = { - .CodecInitFunc = Reader14443ACodecInit, - .CodecDeInitFunc = Reader14443ACodecDeInit, - .CodecTaskFunc = Reader14443ACodecTask, - .ApplicationInitFunc = Reader14443AAppInit, - .ApplicationResetFunc = Reader14443AAppReset, - .ApplicationTaskFunc = Reader14443AAppTask, - .ApplicationTickFunc = Reader14443AAppTick, - .ApplicationProcessFunc = Reader14443AAppProcess, - .ApplicationGetUidFunc = ApplicationGetUidDummy, - .ApplicationSetUidFunc = ApplicationSetUidDummy, - .UidSize = 0, - .MemorySize = 0, - .ReadOnly = false + .CodecInitFunc = Reader14443ACodecInit, + .CodecDeInitFunc = Reader14443ACodecDeInit, + .CodecTaskFunc = Reader14443ACodecTask, + .ApplicationInitFunc = Reader14443AAppInit, + .ApplicationResetFunc = Reader14443AAppReset, + .ApplicationTaskFunc = Reader14443AAppTask, + .ApplicationTickFunc = Reader14443AAppTick, + .ApplicationProcessFunc = Reader14443AAppProcess, + .ApplicationGetUidFunc = ApplicationGetUidDummy, + .ApplicationSetUidFunc = ApplicationSetUidDummy, + .UidSize = 0, + .MemorySize = 0, + .ReadOnly = false }, #endif }; @@ -202,11 +202,11 @@ void ConfigurationInit(void) void ConfigurationSetById( ConfigurationEnum Configuration ) { - CodecDeInit(); + CodecDeInit(); - CommandLinePendingTaskBreak(); // break possibly pending task + CommandLinePendingTaskBreak(); // break possibly pending task - GlobalSettings.ActiveSettingPtr->Configuration = Configuration; + GlobalSettings.ActiveSettingPtr->Configuration = Configuration; /* Copy struct from PROGMEM to RAM */ memcpy_P(&ActiveConfiguration, @@ -218,7 +218,7 @@ void ConfigurationSetById( ConfigurationEnum Configuration ) void ConfigurationGetByName(char* Configuration, uint16_t BufferSize) { - MapIdToText(ConfigurationMap, ARRAY_COUNT(ConfigurationMap), GlobalSettings.ActiveSettingPtr->Configuration, Configuration, BufferSize); + MapIdToText(ConfigurationMap, ARRAY_COUNT(ConfigurationMap), GlobalSettings.ActiveSettingPtr->Configuration, Configuration, BufferSize); } bool ConfigurationSetByName(const char* Configuration) @@ -226,16 +226,16 @@ bool ConfigurationSetByName(const char* Configuration) MapIdType Id; if (MapTextToId(ConfigurationMap, ARRAY_COUNT(ConfigurationMap), Configuration, &Id)) { - ConfigurationSetById(Id); - LogEntry(LOG_INFO_CONFIG_SET, Configuration, StringLength(Configuration, CONFIGURATION_NAME_LENGTH_MAX-1)); - return true; + ConfigurationSetById(Id); + LogEntry(LOG_INFO_CONFIG_SET, Configuration, StringLength(Configuration, CONFIGURATION_NAME_LENGTH_MAX-1)); + return true; } else { - return false; + return false; } } void ConfigurationGetList(char* List, uint16_t BufferSize) { - MapToString(ConfigurationMap, ARRAY_COUNT(ConfigurationMap), List, BufferSize); + MapToString(ConfigurationMap, ARRAY_COUNT(ConfigurationMap), List, BufferSize); } diff --git a/Firmware/Chameleon-Mini/Configuration.h b/Firmware/Chameleon-Mini/Configuration.h index d645857..52d1e23 100644 --- a/Firmware/Chameleon-Mini/Configuration.h +++ b/Firmware/Chameleon-Mini/Configuration.h @@ -39,7 +39,7 @@ typedef enum { CONFIG_ISO14443A_SNIFF, #endif #ifdef CONFIG_ISO14443A_READER_SUPPORT - CONFIG_ISO14443A_READER, + CONFIG_ISO14443A_READER, #endif /* This HAS to be the last element */ CONFIG_COUNT @@ -53,7 +53,7 @@ typedef struct { * Codec related methods. * @{ */ - /** Function that initializes the codec. */ + /** Function that initializes the codec. */ void (*CodecInitFunc) (void); /** Function that deinitializes the codec. */ void (*CodecDeInitFunc) (void); @@ -79,17 +79,17 @@ typedef struct { void (*ApplicationTaskFunc) (void); /** Function that is called roughly every 100ms. This can be used for parallel tasks of the application, that is independent of the codec module. */ void (*ApplicationTickFunc) (void); - /** This function does two important things. It gets called by the codec. - * The first task is to deliver data that have been received by the codec module to - * the application module. The application then can decide how to answer to these data and return - * the response to the codec module, which will process it according to the configured codec. - * - * \param ByteBuffer Pointer to the start of the buffer, where the received data are and where the - * application can put the response data. - * \param BitCount Number of bits that have been received. - * - * \return Number of bits of the response. - */ + /** This function does two important things. It gets called by the codec. + * The first task is to deliver data that have been received by the codec module to + * the application module. The application then can decide how to answer to these data and return + * the response to the codec module, which will process it according to the configured codec. + * + * \param ByteBuffer Pointer to the start of the buffer, where the received data are and where the + * application can put the response data. + * \param BitCount Number of bits that have been received. + * + * \return Number of bits of the response. + */ uint16_t (*ApplicationProcessFunc) (uint8_t* ByteBuffer, uint16_t BitCount); /** * Writes the UID for the current configuration to the given buffer. @@ -105,12 +105,12 @@ typedef struct { * @} */ - /** - * Defines how many space the configuration needs. For emulating configurations this is the memory space of - * the emulated card. - * - * \note For reader or sniff configurations this is set to zero. - */ + /** + * Defines how many space the configuration needs. For emulating configurations this is the memory space of + * the emulated card. + * + * \note For reader or sniff configurations this is set to zero. + */ uint16_t MemorySize; /** * Defines the size of the UID for emulating configurations. diff --git a/Firmware/Chameleon-Mini/LED.c b/Firmware/Chameleon-Mini/LED.c index d0c8fdc..6ae69e2 100644 --- a/Firmware/Chameleon-Mini/LED.c +++ b/Firmware/Chameleon-Mini/LED.c @@ -11,158 +11,158 @@ LEDActionEnum LEDGreenAction = LED_NO_ACTION; LEDActionEnum LEDRedAction = LED_NO_ACTION; static const MapEntryType PROGMEM LEDFunctionMap[] = { - { .Id = LED_NO_FUNC, .Text = "NONE" }, - { .Id = LED_POWERED, .Text = "POWERED" }, - { .Id = LED_TERMINAL_CONN, .Text = "TERMINAL_CONN" }, - { .Id = LED_TERMINAL_RXTX, .Text = "TERMINAL_RXTX" }, - { .Id = LED_SETTING_CHANGE, .Text = "SETTING_CHANGE" }, - { .Id = LED_MEMORY_STORED, .Text = "MEMORY_STORED" }, - { .Id = LED_MEMORY_CHANGED, .Text = "MEMORY_CHANGED" }, - { .Id = LED_CODEC_RX, .Text = "CODEC_RX" }, - { .Id = LED_CODEC_TX, .Text = "CODEC_TX" }, - { .Id = LED_FIELD_DETECTED, .Text = "FIELD_DETECTED" }, - { .Id = LED_LOG_MEM_FULL, .Text = "LOGMEM_FULL" }, + { .Id = LED_NO_FUNC, .Text = "NONE" }, + { .Id = LED_POWERED, .Text = "POWERED" }, + { .Id = LED_TERMINAL_CONN, .Text = "TERMINAL_CONN" }, + { .Id = LED_TERMINAL_RXTX, .Text = "TERMINAL_RXTX" }, + { .Id = LED_SETTING_CHANGE, .Text = "SETTING_CHANGE" }, + { .Id = LED_MEMORY_STORED, .Text = "MEMORY_STORED" }, + { .Id = LED_MEMORY_CHANGED, .Text = "MEMORY_CHANGED" }, + { .Id = LED_CODEC_RX, .Text = "CODEC_RX" }, + { .Id = LED_CODEC_TX, .Text = "CODEC_TX" }, + { .Id = LED_FIELD_DETECTED, .Text = "FIELD_DETECTED" }, + { .Id = LED_LOG_MEM_FULL, .Text = "LOGMEM_FULL" }, }; INLINE void Tick(uint8_t Mask, LEDActionEnum* Action) { - static uint8_t LEDRedBlinkPrescaler = 0; - static uint8_t LEDGreenBlinkPrescaler = 0; - uint8_t * BlinkPrescaler = (Action == &LEDGreenAction) ? &LEDGreenBlinkPrescaler : &LEDRedBlinkPrescaler; + static uint8_t LEDRedBlinkPrescaler = 0; + static uint8_t LEDGreenBlinkPrescaler = 0; + uint8_t * BlinkPrescaler = (Action == &LEDGreenAction) ? &LEDGreenBlinkPrescaler : &LEDRedBlinkPrescaler; - switch (*Action) - { - case LED_NO_ACTION: - /* Do nothing */ - break; + switch (*Action) + { + case LED_NO_ACTION: + /* Do nothing */ + break; - case LED_OFF: - LED_PORT.OUTCLR = Mask; - *Action = LED_NO_ACTION; - break; + case LED_OFF: + LED_PORT.OUTCLR = Mask; + *Action = LED_NO_ACTION; + break; - case LED_ON: - LED_PORT.OUTSET = Mask; - *Action = LED_NO_ACTION; - break; + case LED_ON: + LED_PORT.OUTSET = Mask; + *Action = LED_NO_ACTION; + break; - case LED_TOGGLE: - LED_PORT.OUTTGL = Mask; - *Action = LED_NO_ACTION; - break; + case LED_TOGGLE: + LED_PORT.OUTTGL = Mask; + *Action = LED_NO_ACTION; + break; - case LED_PULSE: - if (!(LED_PORT.OUT & Mask)) { - LED_PORT.OUTSET = Mask; - } else { - LED_PORT.OUTCLR = Mask; - *Action = LED_NO_ACTION; - } - break; + case LED_PULSE: + if (!(LED_PORT.OUT & Mask)) { + LED_PORT.OUTSET = Mask; + } else { + LED_PORT.OUTCLR = Mask; + *Action = LED_NO_ACTION; + } + break; - case LED_BLINK_1X ... LED_BLINK_8X: - if (++(*BlinkPrescaler) == BLINK_PRESCALER) { - *BlinkPrescaler = 0; + case LED_BLINK_1X ... LED_BLINK_8X: + if (++(*BlinkPrescaler) == BLINK_PRESCALER) { + *BlinkPrescaler = 0; - /* Blink functionality occurs at slower speed than Tick-frequency */ - if (!(LED_PORT.OUT & Mask)) { - /* LED is off, turn it on */ - LED_PORT.OUTSET = Mask; - } else { - /* LED is on, turn it off and change state */ - LED_PORT.OUTCLR = Mask; + /* Blink functionality occurs at slower speed than Tick-frequency */ + if (!(LED_PORT.OUT & Mask)) { + /* LED is off, turn it on */ + LED_PORT.OUTSET = Mask; + } else { + /* LED is on, turn it off and change state */ + LED_PORT.OUTCLR = Mask; - if (*Action == LED_BLINK_1X) { - *Action = LED_NO_ACTION; - } else { - /* Still some blinks to do. Use the fact that LED_BLINK_XY are ordered sequentially */ - *Action = *Action - 1; - } - } - } - break; + if (*Action == LED_BLINK_1X) { + *Action = LED_NO_ACTION; + } else { + /* Still some blinks to do. Use the fact that LED_BLINK_XY are ordered sequentially */ + *Action = *Action - 1; + } + } + } + break; - default: - /* Should not happen (TM) */ - *Action = LED_NO_ACTION; - break; + default: + /* Should not happen (TM) */ + *Action = LED_NO_ACTION; + break; - } + } } void LEDInit(void) { - LED_PORT.DIRSET = LED_MASK; + LED_PORT.DIRSET = LED_MASK; } void LEDTick(void) { - Tick(LED_RED, &LEDRedAction); - Tick(LED_GREEN, &LEDGreenAction); + Tick(LED_RED, &LEDRedAction); + Tick(LED_GREEN, &LEDGreenAction); } void LEDGetFuncList(char* List, uint16_t BufferSize) { - MapToString(LEDFunctionMap, ARRAY_COUNT(LEDFunctionMap), List, BufferSize); + MapToString(LEDFunctionMap, ARRAY_COUNT(LEDFunctionMap), List, BufferSize); } void LEDSetFuncById(uint8_t Mask, LEDHookEnum Function) { #ifndef LED_SETTING_GLOBAL - if (Mask & LED_GREEN) { - GlobalSettings.ActiveSettingPtr->LEDGreenFunction = Function; - } + if (Mask & LED_GREEN) { + GlobalSettings.ActiveSettingPtr->LEDGreenFunction = Function; + } - if (Mask & LED_RED) { - GlobalSettings.ActiveSettingPtr->LEDRedFunction = Function; - } + if (Mask & LED_RED) { + GlobalSettings.ActiveSettingPtr->LEDRedFunction = Function; + } #else - /* Write LED func to all settings when using global settings */ - for (uint8_t i=0; iLEDGreenFunction, Function, BufferSize); - } else if (Mask == LED_RED) { - MapIdToText(LEDFunctionMap, ARRAY_COUNT(LEDFunctionMap), - GlobalSettings.ActiveSettingPtr->LEDRedFunction, Function, BufferSize); - } + if (Mask == LED_GREEN) { + MapIdToText(LEDFunctionMap, ARRAY_COUNT(LEDFunctionMap), + GlobalSettings.ActiveSettingPtr->LEDGreenFunction, Function, BufferSize); + } else if (Mask == LED_RED) { + MapIdToText(LEDFunctionMap, ARRAY_COUNT(LEDFunctionMap), + GlobalSettings.ActiveSettingPtr->LEDRedFunction, Function, BufferSize); + } } bool LEDSetFuncByName(uint8_t Mask, const char* Function) { - MapIdType Id; + MapIdType Id; - if (MapTextToId(LEDFunctionMap, ARRAY_COUNT(LEDFunctionMap), Function, &Id)) { - LEDSetFuncById(Mask, Id); - return true; - } else { - return false; - } + if (MapTextToId(LEDFunctionMap, ARRAY_COUNT(LEDFunctionMap), Function, &Id)) { + LEDSetFuncById(Mask, Id); + return true; + } else { + return false; + } } diff --git a/Firmware/Chameleon-Mini/LED.h b/Firmware/Chameleon-Mini/LED.h index b739dd1..e13ee05 100644 --- a/Firmware/Chameleon-Mini/LED.h +++ b/Firmware/Chameleon-Mini/LED.h @@ -17,44 +17,44 @@ #define LED_MASK (LED_GREEN | LED_RED) typedef enum LEDFunctionEnum { - LED_NO_FUNC = 0, /* Don't light up the LED */ - LED_POWERED, /* Light up the LED whenever the Chameleon is powered */ + LED_NO_FUNC = 0, /* Don't light up the LED */ + LED_POWERED, /* Light up the LED whenever the Chameleon is powered */ - LED_TERMINAL_CONN, /* A Terminal/USB connection has been established */ - LED_TERMINAL_RXTX, /* There is traffic on the terminal */ + LED_TERMINAL_CONN, /* A Terminal/USB connection has been established */ + LED_TERMINAL_RXTX, /* There is traffic on the terminal */ - LED_SETTING_CHANGE, /* Outputs a blink code that shows the current setting */ + LED_SETTING_CHANGE, /* Outputs a blink code that shows the current setting */ - LED_MEMORY_STORED, /* Blink once when memory has been stored to flash */ - LED_MEMORY_CHANGED, /* Switch LED on when card memory has changed compared to flash */ + LED_MEMORY_STORED, /* Blink once when memory has been stored to flash */ + LED_MEMORY_CHANGED, /* Switch LED on when card memory has changed compared to flash */ - LED_FIELD_DETECTED, /* Shows LED while a reader field is being detected or turned on by the chameleon itself */ + LED_FIELD_DETECTED, /* Shows LED while a reader field is being detected or turned on by the chameleon itself */ - LED_CODEC_RX, /* Blink LED when receiving codec data */ - LED_CODEC_TX, /* Blink LED when transmitting codec data */ + LED_CODEC_RX, /* Blink LED when receiving codec data */ + LED_CODEC_TX, /* Blink LED when transmitting codec data */ - LED_LOG_MEM_FULL, /* Light up if log memory is full. */ + LED_LOG_MEM_FULL, /* Light up if log memory is full. */ - //TODO: LED_APP_SELECTED, /* Show LED while the correct UID has been selected and the application is active */ - /* Has to be last element */ - LED_FUNC_COUNT + //TODO: LED_APP_SELECTED, /* Show LED while the correct UID has been selected and the application is active */ + /* Has to be last element */ + LED_FUNC_COUNT } LEDHookEnum; typedef enum LEDActionEnum { - LED_NO_ACTION = 0x00, - LED_OFF = 0x10, - LED_ON = 0x11, - LED_TOGGLE = 0x12, - LED_PULSE = 0x13, - LED_BLINK = 0x20, - LED_BLINK_1X = 0x20, - LED_BLINK_2X, /* Have to be sequentially ordered */ - LED_BLINK_3X, - LED_BLINK_4X, - LED_BLINK_5X, - LED_BLINK_6X, - LED_BLINK_7X, - LED_BLINK_8X, + LED_NO_ACTION = 0x00, + LED_OFF = 0x10, + LED_ON = 0x11, + LED_TOGGLE = 0x12, + LED_PULSE = 0x13, + LED_BLINK = 0x20, + LED_BLINK_1X = 0x20, + LED_BLINK_2X, /* Have to be sequentially ordered */ + LED_BLINK_3X, + LED_BLINK_4X, + LED_BLINK_5X, + LED_BLINK_6X, + LED_BLINK_7X, + LED_BLINK_8X, } LEDActionEnum; diff --git a/Firmware/Chameleon-Mini/LEDHook.h b/Firmware/Chameleon-Mini/LEDHook.h index ac88351..9827ae0 100644 --- a/Firmware/Chameleon-Mini/LEDHook.h +++ b/Firmware/Chameleon-Mini/LEDHook.h @@ -11,16 +11,16 @@ #include "Settings.h" INLINE void LEDHook(LEDHookEnum Func, LEDActionEnum Action) { - extern LEDActionEnum LEDGreenAction; - extern LEDActionEnum LEDRedAction; + extern LEDActionEnum LEDGreenAction; + extern LEDActionEnum LEDRedAction; - if (GlobalSettings.ActiveSettingPtr->LEDGreenFunction == Func) { - LEDGreenAction = Action; - } + if (GlobalSettings.ActiveSettingPtr->LEDGreenFunction == Func) { + LEDGreenAction = Action; + } - if (GlobalSettings.ActiveSettingPtr->LEDRedFunction == Func) { - LEDRedAction = Action; - } + if (GlobalSettings.ActiveSettingPtr->LEDRedFunction == Func) { + LEDRedAction = Action; + } } #endif /* LEDHOOK_H_ */ diff --git a/Firmware/Chameleon-Mini/LUFADescriptors.c b/Firmware/Chameleon-Mini/LUFADescriptors.c index 2ae5366..c8fddb9 100644 --- a/Firmware/Chameleon-Mini/LUFADescriptors.c +++ b/Firmware/Chameleon-Mini/LUFADescriptors.c @@ -58,8 +58,8 @@ const USB_Descriptor_Device_t PROGMEM DeviceDescriptor = .Endpoint0Size = FIXED_CONTROL_ENDPOINT_SIZE, - .VendorID = 0x16D0, // MCS Electronics (http://www.mcselec.com) - .ProductID = 0x04B2, // darksimpson's PID #2 granted to Chameleon-Mini + .VendorID = 0x16D0, // MCS Electronics (http://www.mcselec.com) + .ProductID = 0x04B2, // darksimpson's PID #2 granted to Chameleon-Mini #if LUFA_VERSION_INTEGER >= 0x140928 .ReleaseNumber = VERSION_BCD(0,0,1), #else diff --git a/Firmware/Chameleon-Mini/Log.c b/Firmware/Chameleon-Mini/Log.c index c805c07..facb0a1 100644 --- a/Firmware/Chameleon-Mini/Log.c +++ b/Firmware/Chameleon-Mini/Log.c @@ -14,9 +14,9 @@ static bool EnableLogSRAMtoFRAM = false; LogFuncType CurrentLogFunc; static const MapEntryType PROGMEM LogModeMap[] = { - { .Id = LOG_MODE_OFF, .Text = "OFF" }, - { .Id = LOG_MODE_MEMORY, .Text = "MEMORY" }, - { .Id = LOG_MODE_LIVE, .Text = "LIVE" } + { .Id = LOG_MODE_OFF, .Text = "OFF" }, + { .Id = LOG_MODE_MEMORY, .Text = "MEMORY" }, + { .Id = LOG_MODE_LIVE, .Text = "LIVE" } }; static void LogFuncOff(LogEntryEnum Entry, const void* Data, uint8_t Length) @@ -26,7 +26,7 @@ static void LogFuncOff(LogEntryEnum Entry, const void* Data, uint8_t Length) static void LogFuncMemory(LogEntryEnum Entry, const void* Data, uint8_t Length) { - uint16_t SysTick = SystemGetSysTick(); + uint16_t SysTick = SystemGetSysTick(); if (LogMemLeft >= (Length + 4)) { LogMemLeft -= Length + 4; @@ -52,13 +52,13 @@ static void LogFuncMemory(LogEntryEnum Entry, const void* Data, uint8_t Length) static void LogFuncLive(LogEntryEnum Entry, const void* Data, uint8_t Length) { - uint16_t SysTick = SystemGetSysTick(); + uint16_t SysTick = SystemGetSysTick(); - TerminalSendByte((uint8_t) Entry); - TerminalSendByte((uint8_t) Length); - TerminalSendByte((uint8_t) (SysTick >> 8)); - TerminalSendByte((uint8_t) (SysTick >> 0)); - TerminalSendBlock(Data, Length); + TerminalSendByte((uint8_t) Entry); + TerminalSendByte((uint8_t) Length); + TerminalSendByte((uint8_t) (SysTick >> 8)); + TerminalSendByte((uint8_t) (SysTick >> 0)); + TerminalSendBlock(Data, Length); } void LogInit(void) @@ -72,12 +72,12 @@ void LogInit(void) memset(LogMemPtr, LOG_EMPTY, LOG_SIZE); if (result) { - MemoryReadBlock(&LogFRAMAddr, FRAM_LOG_ADDR_ADDR, 2); + MemoryReadBlock(&LogFRAMAddr, FRAM_LOG_ADDR_ADDR, 2); } else { - LogFRAMAddr = FRAM_LOG_START_ADDR; - MemoryWriteBlock(&LogFRAMAddr, FRAM_LOG_ADDR_ADDR, 2); - result = true; - WriteEEPBlock((uint16_t) &LogFRAMAddrValid, &result, 1); + LogFRAMAddr = FRAM_LOG_START_ADDR; + MemoryWriteBlock(&LogFRAMAddr, FRAM_LOG_ADDR_ADDR, 2); + result = true; + WriteEEPBlock((uint16_t) &LogFRAMAddrValid, &result, 1); } LogEntry(LOG_INFO_SYSTEM_BOOT, NULL, 0); @@ -85,8 +85,8 @@ void LogInit(void) void LogTick(void) { - if (EnableLogSRAMtoFRAM) - LogSRAMToFRAM(); + if (EnableLogSRAMtoFRAM) + LogSRAMToFRAM(); } void LogTask(void) @@ -96,58 +96,58 @@ void LogTask(void) bool LogMemLoadBlock(void* Buffer, uint32_t BlockAddress, uint16_t ByteCount) { - if (BlockAddress < sizeof(LogMem) + (LogFRAMAddr - FRAM_LOG_START_ADDR)) - { - bool overflow = false; - uint16_t remainderByteCount = 0; - uint16_t SizeInFRAMStored = LogFRAMAddr - FRAM_LOG_START_ADDR; - // prevent buffer overflows: - if ((BlockAddress + ByteCount) >= sizeof(LogMem) + SizeInFRAMStored) - { - overflow = true; - uint16_t tmp = sizeof(LogMem) + SizeInFRAMStored - BlockAddress; - remainderByteCount = ByteCount - tmp; - ByteCount = tmp; - } + if (BlockAddress < sizeof(LogMem) + (LogFRAMAddr - FRAM_LOG_START_ADDR)) + { + bool overflow = false; + uint16_t remainderByteCount = 0; + uint16_t SizeInFRAMStored = LogFRAMAddr - FRAM_LOG_START_ADDR; + // prevent buffer overflows: + if ((BlockAddress + ByteCount) >= sizeof(LogMem) + SizeInFRAMStored) + { + overflow = true; + uint16_t tmp = sizeof(LogMem) + SizeInFRAMStored - BlockAddress; + remainderByteCount = ByteCount - tmp; + ByteCount = tmp; + } - /* - * 1. case: The whole block is in FRAM. - * 2. case: The block wraps from FRAM to SRAM - * 3. case: The whole block is in SRAM. - */ - if (BlockAddress < SizeInFRAMStored && (BlockAddress + ByteCount) < SizeInFRAMStored) - { - MemoryReadBlock(Buffer, BlockAddress + FRAM_LOG_START_ADDR, ByteCount); - } else if (BlockAddress < SizeInFRAMStored) { - uint16_t FramByteCount = SizeInFRAMStored - BlockAddress; - MemoryReadBlock(Buffer, BlockAddress + FRAM_LOG_START_ADDR, FramByteCount); - memcpy(Buffer + FramByteCount, LogMem, ByteCount - FramByteCount); - } else { - memcpy(Buffer, LogMem + BlockAddress - SizeInFRAMStored, ByteCount); - } + /* + * 1. case: The whole block is in FRAM. + * 2. case: The block wraps from FRAM to SRAM + * 3. case: The whole block is in SRAM. + */ + if (BlockAddress < SizeInFRAMStored && (BlockAddress + ByteCount) < SizeInFRAMStored) + { + MemoryReadBlock(Buffer, BlockAddress + FRAM_LOG_START_ADDR, ByteCount); + } else if (BlockAddress < SizeInFRAMStored) { + uint16_t FramByteCount = SizeInFRAMStored - BlockAddress; + MemoryReadBlock(Buffer, BlockAddress + FRAM_LOG_START_ADDR, FramByteCount); + memcpy(Buffer + FramByteCount, LogMem, ByteCount - FramByteCount); + } else { + memcpy(Buffer, LogMem + BlockAddress - SizeInFRAMStored, ByteCount); + } - if (overflow) - { - while (remainderByteCount--) - ((uint8_t*) Buffer)[ByteCount + remainderByteCount] = 0x00; - } + if (overflow) + { + while (remainderByteCount--) + ((uint8_t*) Buffer)[ByteCount + remainderByteCount] = 0x00; + } - return true; - } else { - return false; - } + return true; + } else { + return false; + } } INLINE void LogSRAMClear(void) { - uint16_t i, until = LOG_SIZE - LogMemLeft; + uint16_t i, until = LOG_SIZE - LogMemLeft; - for (i=0; i < until; i++) { - LogMem[i] = (uint8_t) LOG_EMPTY; - } + for (i=0; i < until; i++) { + LogMem[i] = (uint8_t) LOG_EMPTY; + } - LogMemPtr = LogMem; - LogMemLeft = sizeof(LogMem); + LogMemPtr = LogMem; + LogMemLeft = sizeof(LogMem); } void LogMemClear(void) @@ -169,25 +169,25 @@ void LogSetModeById(LogModeEnum Mode) #ifndef LOG_SETTING_GLOBAL GlobalSettings.ActiveSettingPtr->LogMode = Mode; #else - /* Write Log settings globally */ - for (uint8_t i=0; iLogMode, Mode, BufferSize); + MapIdToText(LogModeMap, ARRAY_COUNT(LogModeMap), + GlobalSettings.ActiveSettingPtr->LogMode, Mode, BufferSize); } void LogGetModeList(char* List, uint16_t BufferSize) @@ -222,16 +222,16 @@ void LogGetModeList(char* List, uint16_t BufferSize) void LogSRAMToFRAM(void) { - if (LogMemLeft < LOG_SIZE) - { - if (FRAM_LOG_SIZE - (LogFRAMAddr - FRAM_LOG_START_ADDR) >= LOG_SIZE - LogMemLeft) - { - MemoryWriteBlock(LogMem, LogFRAMAddr, LOG_SIZE - LogMemLeft); - LogFRAMAddr += LOG_SIZE - LogMemLeft; - LogSRAMClear(); - MemoryWriteBlock(&LogFRAMAddr, FRAM_LOG_ADDR_ADDR, 2); - } else { - // TODO handle the case in which the FRAM is full - } - } + if (LogMemLeft < LOG_SIZE) + { + if (FRAM_LOG_SIZE - (LogFRAMAddr - FRAM_LOG_START_ADDR) >= LOG_SIZE - LogMemLeft) + { + MemoryWriteBlock(LogMem, LogFRAMAddr, LOG_SIZE - LogMemLeft); + LogFRAMAddr += LOG_SIZE - LogMemLeft; + LogSRAMClear(); + MemoryWriteBlock(&LogFRAMAddr, FRAM_LOG_ADDR_ADDR, 2); + } else { + // TODO handle the case in which the FRAM is full + } + } } diff --git a/Firmware/Chameleon-Mini/Log.h b/Firmware/Chameleon-Mini/Log.h index 3d41896..ce0bbfd 100644 --- a/Firmware/Chameleon-Mini/Log.h +++ b/Firmware/Chameleon-Mini/Log.h @@ -39,7 +39,7 @@ typedef enum { LOG_ERR_APP_CHECKSUM_FAIL = 0xC1, ///< Application had a checksum fail. LOG_ERR_APP_NOT_AUTHED = 0xC2, ///< Application is not authenticated. - LOG_INFO_SYSTEM_BOOT = 0xFF, ///< Chameleon boots + LOG_INFO_SYSTEM_BOOT = 0xFF, ///< Chameleon boots LOG_EMPTY = 0x00 ///< Empty Log Entry. This is not followed by a length byte nor the two systick bytes nor any data. } LogEntryEnum; diff --git a/Firmware/Chameleon-Mini/Map.c b/Firmware/Chameleon-Mini/Map.c index b6011d4..97e9db6 100644 --- a/Firmware/Chameleon-Mini/Map.c +++ b/Firmware/Chameleon-Mini/Map.c @@ -2,49 +2,49 @@ bool MapIdToText(const MapEntryType* MapPtr, uint8_t MapSize, MapIdType Id, char* Text, uint16_t MaxBufferSize) { - while (MapSize--) { - if (pgm_read_byte(&MapPtr->Id) == Id) { - strncpy_P(Text, MapPtr->Text, MaxBufferSize); - return true; - } + while (MapSize--) { + if (pgm_read_byte(&MapPtr->Id) == Id) { + strncpy_P(Text, MapPtr->Text, MaxBufferSize); + return true; + } - MapPtr++; - } + MapPtr++; + } - return false; + return false; } bool MapTextToId(const MapEntryType* MapPtr, uint8_t MapSize, MapTextPtrType Text, MapIdType* IdPtr) { - while (MapSize--) { - if (strcmp_P(Text, MapPtr->Text) == 0) { - if (sizeof(MapIdType) == 1) { - *IdPtr = pgm_read_byte(&MapPtr->Id); - } else if (sizeof(MapIdType) == 2) { - *IdPtr = pgm_read_word(&MapPtr->Id); - } - return true; - } + while (MapSize--) { + if (strcmp_P(Text, MapPtr->Text) == 0) { + if (sizeof(MapIdType) == 1) { + *IdPtr = pgm_read_byte(&MapPtr->Id); + } else if (sizeof(MapIdType) == 2) { + *IdPtr = pgm_read_word(&MapPtr->Id); + } + return true; + } - MapPtr++; - } + MapPtr++; + } - return false; + return false; } void MapToString(MapEntryType* MapPtr, uint8_t MapSize, char* String, uint16_t MaxBufferSize) { - uint8_t EntriesLeft = MapSize; - uint16_t BytesLeft = MaxBufferSize; + uint8_t EntriesLeft = MapSize; + uint16_t BytesLeft = MaxBufferSize; - while (EntriesLeft > 0) { - const char* Text = MapPtr->Text; - char c; + while (EntriesLeft > 0) { + const char* Text = MapPtr->Text; + char c; while( (c = pgm_read_byte(Text)) != '\0') { - if (BytesLeft == 0) { - return; - } + if (BytesLeft == 0) { + return; + } *String++ = c; Text++; @@ -52,21 +52,21 @@ void MapToString(MapEntryType* MapPtr, uint8_t MapSize, char* String, uint16_t M } if (EntriesLeft > 1) { - /* More than one map entries left */ - if (BytesLeft == 0) { - return; - } + /* More than one map entries left */ + if (BytesLeft == 0) { + return; + } - *String++ = ','; + *String++ = ','; } MapPtr++; EntriesLeft--; - } + } - /* Terminate string */ - if (BytesLeft > 0) { - *String++ = '\0'; - BytesLeft--; - } + /* Terminate string */ + if (BytesLeft > 0) { + *String++ = '\0'; + BytesLeft--; + } } diff --git a/Firmware/Chameleon-Mini/Map.h b/Firmware/Chameleon-Mini/Map.h index 7180280..76bd19f 100644 --- a/Firmware/Chameleon-Mini/Map.h +++ b/Firmware/Chameleon-Mini/Map.h @@ -19,8 +19,8 @@ typedef uint8_t MapIdType; typedef const char* MapTextPtrType; const typedef struct { - MapIdType Id; - const char Text[MAP_TEXT_BUF_SIZE]; + MapIdType Id; + const char Text[MAP_TEXT_BUF_SIZE]; } MapEntryType; bool MapIdToText(const MapEntryType* MapPtr, uint8_t MapSize, MapIdType Id, char* Text, uint16_t MaxBufferSize); diff --git a/Firmware/Chameleon-Mini/Memory.c b/Firmware/Chameleon-Mini/Memory.c index f82e680..68551a0 100644 --- a/Firmware/Chameleon-Mini/Memory.c +++ b/Firmware/Chameleon-Mini/Memory.c @@ -40,50 +40,50 @@ static uint8_t ScrapBuffer[] = {0}; INLINE uint8_t SPITransferByte(uint8_t Data) { - FRAM_USART.DATA = Data; + FRAM_USART.DATA = Data; - while (!(FRAM_USART.STATUS & USART_RXCIF_bm)); + while (!(FRAM_USART.STATUS & USART_RXCIF_bm)); - return FRAM_USART.DATA; + return FRAM_USART.DATA; } #ifdef USE_DMA INLINE void SPIReadBlock(void* Buffer, uint16_t ByteCount) { - /* Set up read and write transfers */ - RECV_DMA.ADDRCTRL = DMA_CH_SRCRELOAD_NONE_gc | DMA_CH_SRCDIR_FIXED_gc | DMA_CH_DESTRELOAD_NONE_gc | DMA_CH_DESTDIR_INC_gc; - RECV_DMA.DESTADDR0 = ((uintptr_t) Buffer >> 0) & 0xFF; - RECV_DMA.DESTADDR1 = ((uintptr_t) Buffer >> 8) & 0xFF; - RECV_DMA.TRFCNT = ByteCount; - SEND_DMA.ADDRCTRL = DMA_CH_SRCRELOAD_NONE_gc | DMA_CH_SRCDIR_FIXED_gc | DMA_CH_DESTRELOAD_NONE_gc | DMA_CH_DESTDIR_FIXED_gc; - SEND_DMA.SRCADDR0 = ((uintptr_t) ScrapBuffer >> 0) & 0xFF; - SEND_DMA.SRCADDR1 = ((uintptr_t) ScrapBuffer >> 8) & 0xFF; - SEND_DMA.TRFCNT = ByteCount; + /* Set up read and write transfers */ + RECV_DMA.ADDRCTRL = DMA_CH_SRCRELOAD_NONE_gc | DMA_CH_SRCDIR_FIXED_gc | DMA_CH_DESTRELOAD_NONE_gc | DMA_CH_DESTDIR_INC_gc; + RECV_DMA.DESTADDR0 = ((uintptr_t) Buffer >> 0) & 0xFF; + RECV_DMA.DESTADDR1 = ((uintptr_t) Buffer >> 8) & 0xFF; + RECV_DMA.TRFCNT = ByteCount; + SEND_DMA.ADDRCTRL = DMA_CH_SRCRELOAD_NONE_gc | DMA_CH_SRCDIR_FIXED_gc | DMA_CH_DESTRELOAD_NONE_gc | DMA_CH_DESTDIR_FIXED_gc; + SEND_DMA.SRCADDR0 = ((uintptr_t) ScrapBuffer >> 0) & 0xFF; + SEND_DMA.SRCADDR1 = ((uintptr_t) ScrapBuffer >> 8) & 0xFF; + SEND_DMA.TRFCNT = ByteCount; - /* Enable read and write transfers */ - RECV_DMA.CTRLA |= DMA_CH_ENABLE_bm; - SEND_DMA.CTRLA |= DMA_CH_ENABLE_bm; + /* Enable read and write transfers */ + RECV_DMA.CTRLA |= DMA_CH_ENABLE_bm; + SEND_DMA.CTRLA |= DMA_CH_ENABLE_bm; - /* Wait for DMA to finish */ - while( RECV_DMA.CTRLA & DMA_CH_ENABLE_bm ) - ; + /* Wait for DMA to finish */ + while( RECV_DMA.CTRLA & DMA_CH_ENABLE_bm ) + ; - /* Clear Interrupt flag */ - RECV_DMA.CTRLB = DMA_CH_TRNIF_bm | DMA_CH_ERRIF_bm; - SEND_DMA.CTRLB = DMA_CH_TRNIF_bm | DMA_CH_ERRIF_bm; + /* Clear Interrupt flag */ + RECV_DMA.CTRLB = DMA_CH_TRNIF_bm | DMA_CH_ERRIF_bm; + SEND_DMA.CTRLB = DMA_CH_TRNIF_bm | DMA_CH_ERRIF_bm; } #else INLINE void SPIReadBlock(void* Buffer, uint16_t ByteCount) { - uint8_t* ByteBuffer = (uint8_t*) Buffer; + uint8_t* ByteBuffer = (uint8_t*) Buffer; - while(ByteCount-- > 0) { - FRAM_USART.DATA = 0; - while (!(FRAM_USART.STATUS & USART_RXCIF_bm)); + while(ByteCount-- > 0) { + FRAM_USART.DATA = 0; + while (!(FRAM_USART.STATUS & USART_RXCIF_bm)); - *ByteBuffer++ = FRAM_USART.DATA; - } + *ByteBuffer++ = FRAM_USART.DATA; + } } #endif @@ -91,322 +91,322 @@ INLINE void SPIReadBlock(void* Buffer, uint16_t ByteCount) #ifdef USE_DMA INLINE void SPIWriteBlock(const void* Buffer, uint16_t ByteCount) { - /* Set up read and write transfers */ - RECV_DMA.ADDRCTRL = DMA_CH_SRCRELOAD_NONE_gc | DMA_CH_SRCDIR_FIXED_gc | DMA_CH_DESTRELOAD_NONE_gc | DMA_CH_DESTDIR_FIXED_gc; - RECV_DMA.DESTADDR0 = ((uintptr_t) ScrapBuffer >> 0) & 0xFF; - RECV_DMA.DESTADDR1 = ((uintptr_t) ScrapBuffer >> 8) & 0xFF; - RECV_DMA.TRFCNT = ByteCount; - SEND_DMA.ADDRCTRL = DMA_CH_SRCRELOAD_NONE_gc | DMA_CH_SRCDIR_INC_gc | DMA_CH_DESTRELOAD_NONE_gc | DMA_CH_DESTDIR_FIXED_gc; - SEND_DMA.SRCADDR0 = ((uintptr_t) Buffer >> 0) & 0xFF; - SEND_DMA.SRCADDR1 = ((uintptr_t) Buffer >> 8) & 0xFF; - SEND_DMA.TRFCNT = ByteCount; + /* Set up read and write transfers */ + RECV_DMA.ADDRCTRL = DMA_CH_SRCRELOAD_NONE_gc | DMA_CH_SRCDIR_FIXED_gc | DMA_CH_DESTRELOAD_NONE_gc | DMA_CH_DESTDIR_FIXED_gc; + RECV_DMA.DESTADDR0 = ((uintptr_t) ScrapBuffer >> 0) & 0xFF; + RECV_DMA.DESTADDR1 = ((uintptr_t) ScrapBuffer >> 8) & 0xFF; + RECV_DMA.TRFCNT = ByteCount; + SEND_DMA.ADDRCTRL = DMA_CH_SRCRELOAD_NONE_gc | DMA_CH_SRCDIR_INC_gc | DMA_CH_DESTRELOAD_NONE_gc | DMA_CH_DESTDIR_FIXED_gc; + SEND_DMA.SRCADDR0 = ((uintptr_t) Buffer >> 0) & 0xFF; + SEND_DMA.SRCADDR1 = ((uintptr_t) Buffer >> 8) & 0xFF; + SEND_DMA.TRFCNT = ByteCount; - /* Enable read and write transfers */ - RECV_DMA.CTRLA |= DMA_CH_ENABLE_bm; - SEND_DMA.CTRLA |= DMA_CH_ENABLE_bm; + /* Enable read and write transfers */ + RECV_DMA.CTRLA |= DMA_CH_ENABLE_bm; + SEND_DMA.CTRLA |= DMA_CH_ENABLE_bm; - /* Wait for DMA to finish */ - while( RECV_DMA.CTRLA & DMA_CH_ENABLE_bm ) - ; + /* Wait for DMA to finish */ + while( RECV_DMA.CTRLA & DMA_CH_ENABLE_bm ) + ; - /* Clear Interrupt flag */ - RECV_DMA.CTRLB = DMA_CH_TRNIF_bm | DMA_CH_ERRIF_bm; - SEND_DMA.CTRLB = DMA_CH_TRNIF_bm | DMA_CH_ERRIF_bm; + /* Clear Interrupt flag */ + RECV_DMA.CTRLB = DMA_CH_TRNIF_bm | DMA_CH_ERRIF_bm; + SEND_DMA.CTRLB = DMA_CH_TRNIF_bm | DMA_CH_ERRIF_bm; } #else INLINE void SPIWriteBlock(const void* Buffer, uint16_t ByteCount) { - uint8_t* ByteBuffer = (uint8_t*) Buffer; + uint8_t* ByteBuffer = (uint8_t*) Buffer; - while(ByteCount-- > 0) { - FRAM_USART.DATA = *ByteBuffer++; - while (!(FRAM_USART.STATUS & USART_RXCIF_bm)); + while(ByteCount-- > 0) { + FRAM_USART.DATA = *ByteBuffer++; + while (!(FRAM_USART.STATUS & USART_RXCIF_bm)); - FRAM_USART.DATA; /* Flush Buffer */ - } + FRAM_USART.DATA; /* Flush Buffer */ + } } #endif INLINE void FRAMRead(void* Buffer, uint16_t Address, uint16_t ByteCount) { - FRAM_PORT.OUTCLR = FRAM_CS; + FRAM_PORT.OUTCLR = FRAM_CS; - SPITransferByte(0x03); /* Read command */ - SPITransferByte( (Address >> 8) & 0xFF ); /* Address hi and lo byte */ - SPITransferByte( (Address >> 0) & 0xFF ); + SPITransferByte(0x03); /* Read command */ + SPITransferByte( (Address >> 8) & 0xFF ); /* Address hi and lo byte */ + SPITransferByte( (Address >> 0) & 0xFF ); - SPIReadBlock(Buffer, ByteCount); + SPIReadBlock(Buffer, ByteCount); - FRAM_PORT.OUTSET = FRAM_CS; + FRAM_PORT.OUTSET = FRAM_CS; } INLINE void FRAMWrite(const void* Buffer, uint16_t Address, uint16_t ByteCount) { - FRAM_PORT.OUTCLR = FRAM_CS; - SPITransferByte(0x06); /* Write Enable */ - FRAM_PORT.OUTSET = FRAM_CS; + FRAM_PORT.OUTCLR = FRAM_CS; + SPITransferByte(0x06); /* Write Enable */ + FRAM_PORT.OUTSET = FRAM_CS; - asm volatile ("nop"); - asm volatile ("nop"); + asm volatile ("nop"); + asm volatile ("nop"); - FRAM_PORT.OUTCLR = FRAM_CS; + FRAM_PORT.OUTCLR = FRAM_CS; - SPITransferByte(0x02); /* Write command */ - SPITransferByte( (Address >> 8) & 0xFF ); /* Address hi and lo byte */ - SPITransferByte( (Address >> 0) & 0xFF ); + SPITransferByte(0x02); /* Write command */ + SPITransferByte( (Address >> 8) & 0xFF ); /* Address hi and lo byte */ + SPITransferByte( (Address >> 0) & 0xFF ); - SPIWriteBlock(Buffer, ByteCount); + SPIWriteBlock(Buffer, ByteCount); - FRAM_PORT.OUTSET = FRAM_CS; + FRAM_PORT.OUTSET = FRAM_CS; } INLINE void FlashRead(void* Buffer, uint32_t Address, uint16_t ByteCount) { - uint8_t* BufPtr = (uint8_t*) Buffer; + uint8_t* BufPtr = (uint8_t*) Buffer; - /* We assume that ByteCount is a multiple of 2 */ - uint32_t PhysicalAddress = Address + FLASH_DATA_ADDR; + /* We assume that ByteCount is a multiple of 2 */ + uint32_t PhysicalAddress = Address + FLASH_DATA_ADDR; - if ( (PhysicalAddress >= FLASH_DATA_START) && (PhysicalAddress <= FLASH_DATA_END) ) { - /* Sanity check to limit access to the allocated area */ - while(ByteCount > 1) { - uint16_t Word = FlashReadWord(PhysicalAddress); + if ( (PhysicalAddress >= FLASH_DATA_START) && (PhysicalAddress <= FLASH_DATA_END) ) { + /* Sanity check to limit access to the allocated area */ + while(ByteCount > 1) { + uint16_t Word = FlashReadWord(PhysicalAddress); - *BufPtr++ = (Word >> 0) & 0xFF; - *BufPtr++ = (Word >> 8) & 0xFF; + *BufPtr++ = (Word >> 0) & 0xFF; + *BufPtr++ = (Word >> 8) & 0xFF; - PhysicalAddress += 2; - ByteCount -= 2; - } - } + PhysicalAddress += 2; + ByteCount -= 2; + } + } } INLINE void FlashWrite(const void* Buffer, uint32_t Address, uint16_t ByteCount) { - const uint8_t* BufPtr = (uint8_t*) Buffer; + const uint8_t* BufPtr = (uint8_t*) Buffer; - /* We assume that FlashWrite is always called for write actions that are - * aligned to APP_SECTION_PAGE_SIZE and a multiple of APP_SECTION_PAGE_SIZE. - * Thus only full pages are written into the flash. */ - uint16_t PageCount = ByteCount / APP_SECTION_PAGE_SIZE; - uint32_t PhysicalAddress = Address + FLASH_DATA_ADDR; + /* We assume that FlashWrite is always called for write actions that are + * aligned to APP_SECTION_PAGE_SIZE and a multiple of APP_SECTION_PAGE_SIZE. + * Thus only full pages are written into the flash. */ + uint16_t PageCount = ByteCount / APP_SECTION_PAGE_SIZE; + uint32_t PhysicalAddress = Address + FLASH_DATA_ADDR; - if ( (PhysicalAddress >= FLASH_DATA_START) && (PhysicalAddress <= FLASH_DATA_END) ) { - /* Sanity check to limit access to the allocated area */ + if ( (PhysicalAddress >= FLASH_DATA_START) && (PhysicalAddress <= FLASH_DATA_END) ) { + /* Sanity check to limit access to the allocated area */ - while(PageCount-- > 0) { - /* For each page to program, wait for NVM to get ready, - * erase the flash page buffer, program all data to the - * flash page buffer and write buffer to flash using - * the atomic erase and write operation. */ + while(PageCount-- > 0) { + /* For each page to program, wait for NVM to get ready, + * erase the flash page buffer, program all data to the + * flash page buffer and write buffer to flash using + * the atomic erase and write operation. */ - FlashWaitForSPM(); + FlashWaitForSPM(); - FlashEraseFlashBuffer(); - FlashWaitForSPM(); + FlashEraseFlashBuffer(); + FlashWaitForSPM(); - for (uint16_t i=0; i= FLASH_DATA_START) && (PhysicalAddress <= FLASH_DATA_END) ) { - /* Sanity check to limit access to the allocated area */ - while(PageCount-- > 0) { - FlashWaitForSPM(); + if ( (PhysicalAddress >= FLASH_DATA_START) && (PhysicalAddress <= FLASH_DATA_END) ) { + /* Sanity check to limit access to the allocated area */ + while(PageCount-- > 0) { + FlashWaitForSPM(); - FlashEraseApplicationPage(PhysicalAddress); - FlashWaitForSPM(); + FlashEraseApplicationPage(PhysicalAddress); + FlashWaitForSPM(); - PhysicalAddress += APP_SECTION_PAGE_SIZE; - } - } + PhysicalAddress += APP_SECTION_PAGE_SIZE; + } + } } INLINE void FlashToFRAM(uint32_t Address, uint16_t ByteCount) { - /* We assume that ByteCount is a multiple of 2 */ - uint32_t PhysicalAddress = Address + FLASH_DATA_ADDR; + /* We assume that ByteCount is a multiple of 2 */ + uint32_t PhysicalAddress = Address + FLASH_DATA_ADDR; - if ( (PhysicalAddress >= FLASH_DATA_START) && (PhysicalAddress <= FLASH_DATA_END) ) { - /* Sanity check to limit access to the allocated area. - * Set up FRAM memory for writing. */ - FRAM_PORT.OUTCLR = FRAM_CS; - SPITransferByte(0x06); /* Write Enable */ - FRAM_PORT.OUTSET = FRAM_CS; + if ( (PhysicalAddress >= FLASH_DATA_START) && (PhysicalAddress <= FLASH_DATA_END) ) { + /* Sanity check to limit access to the allocated area. + * Set up FRAM memory for writing. */ + FRAM_PORT.OUTCLR = FRAM_CS; + SPITransferByte(0x06); /* Write Enable */ + FRAM_PORT.OUTSET = FRAM_CS; - asm volatile ("nop"); - asm volatile ("nop"); + asm volatile ("nop"); + asm volatile ("nop"); - FRAM_PORT.OUTCLR = FRAM_CS; + FRAM_PORT.OUTCLR = FRAM_CS; - SPITransferByte(0x02); /* Write command */ - SPITransferByte(0); /* Address hi and lo byte */ - SPITransferByte(0); + SPITransferByte(0x02); /* Write command */ + SPITransferByte(0); /* Address hi and lo byte */ + SPITransferByte(0); - /* Loop through bytes, read words from flash and write - * double byte into FRAM. */ - while(ByteCount > 1) { - uint16_t Word = FlashReadWord(PhysicalAddress); + /* Loop through bytes, read words from flash and write + * double byte into FRAM. */ + while(ByteCount > 1) { + uint16_t Word = FlashReadWord(PhysicalAddress); - SPITransferByte( (Word >> 0) & 0xFF ); - SPITransferByte( (Word >> 8) & 0xFF ); + SPITransferByte( (Word >> 0) & 0xFF ); + SPITransferByte( (Word >> 8) & 0xFF ); - PhysicalAddress += 2; - ByteCount -= 2; - } + PhysicalAddress += 2; + ByteCount -= 2; + } - /* End write procedure of FRAM */ - FRAM_PORT.OUTSET = FRAM_CS; - } + /* End write procedure of FRAM */ + FRAM_PORT.OUTSET = FRAM_CS; + } } INLINE void FRAMToFlash(uint32_t Address, uint16_t ByteCount) { - /* We assume that FlashWrite is always called for write actions that are - * aligned to APP_SECTION_PAGE_SIZE and a multiple of APP_SECTION_PAGE_SIZE. - * Thus only full pages are written into the flash. */ - uint16_t PageCount = ByteCount / APP_SECTION_PAGE_SIZE; - uint32_t PhysicalAddress = Address + FLASH_DATA_ADDR; + /* We assume that FlashWrite is always called for write actions that are + * aligned to APP_SECTION_PAGE_SIZE and a multiple of APP_SECTION_PAGE_SIZE. + * Thus only full pages are written into the flash. */ + uint16_t PageCount = ByteCount / APP_SECTION_PAGE_SIZE; + uint32_t PhysicalAddress = Address + FLASH_DATA_ADDR; - if ( (PhysicalAddress >= FLASH_DATA_START) && (PhysicalAddress <= FLASH_DATA_END) ) { - /* Sanity check to limit access to the allocated area and setup FRAM - * read. */ - FRAM_PORT.OUTCLR = FRAM_CS; + if ( (PhysicalAddress >= FLASH_DATA_START) && (PhysicalAddress <= FLASH_DATA_END) ) { + /* Sanity check to limit access to the allocated area and setup FRAM + * read. */ + FRAM_PORT.OUTCLR = FRAM_CS; - SPITransferByte(0x03); /* Read command */ - SPITransferByte(0); /* Address hi and lo byte */ - SPITransferByte(0); + SPITransferByte(0x03); /* Read command */ + SPITransferByte(0); /* Address hi and lo byte */ + SPITransferByte(0); - while(PageCount-- > 0) { - /* For each page to program, wait for NVM to get ready, - * erase the flash page buffer, program all data to the - * flash page buffer and write buffer to flash using - * the atomic erase and write operation. */ + while(PageCount-- > 0) { + /* For each page to program, wait for NVM to get ready, + * erase the flash page buffer, program all data to the + * flash page buffer and write buffer to flash using + * the atomic erase and write operation. */ - FlashWaitForSPM(); + FlashWaitForSPM(); - FlashEraseFlashBuffer(); - FlashWaitForSPM(); + FlashEraseFlashBuffer(); + FlashWaitForSPM(); - /* Write one page worth of data into flash buffer */ - for (uint16_t i=0; i> 0) & 0xFF; - RECV_DMA.SRCADDR1 = ((uintptr_t) &FRAM_USART.DATA >> 8) & 0xFF; - RECV_DMA.SRCADDR2 = 0; - RECV_DMA.DESTADDR0 = 0; - RECV_DMA.DESTADDR1 = 0; - RECV_DMA.DESTADDR2 = 0; - RECV_DMA.CTRLA = DMA_CH_SINGLE_bm | DMA_CH_BURSTLEN_1BYTE_gc; + /* Init DMAs for reading and writing */ + RECV_DMA.ADDRCTRL = DMA_CH_SRCRELOAD_NONE_gc | DMA_CH_SRCDIR_FIXED_gc | DMA_CH_DESTRELOAD_NONE_gc | DMA_CH_DESTDIR_FIXED_gc; + RECV_DMA.TRIGSRC = DMA_CH_TRIGSRC_USARTD0_RXC_gc; + RECV_DMA.TRFCNT = 0; + RECV_DMA.SRCADDR0 = ((uintptr_t) &FRAM_USART.DATA >> 0) & 0xFF; + RECV_DMA.SRCADDR1 = ((uintptr_t) &FRAM_USART.DATA >> 8) & 0xFF; + RECV_DMA.SRCADDR2 = 0; + RECV_DMA.DESTADDR0 = 0; + RECV_DMA.DESTADDR1 = 0; + RECV_DMA.DESTADDR2 = 0; + RECV_DMA.CTRLA = DMA_CH_SINGLE_bm | DMA_CH_BURSTLEN_1BYTE_gc; - SEND_DMA.ADDRCTRL = DMA_CH_SRCRELOAD_NONE_gc | DMA_CH_SRCDIR_FIXED_gc | DMA_CH_DESTRELOAD_NONE_gc | DMA_CH_DESTDIR_FIXED_gc; - SEND_DMA.TRIGSRC = DMA_CH_TRIGSRC_USARTD0_DRE_gc; - SEND_DMA.TRFCNT = 0; - SEND_DMA.SRCADDR0 = 0; - SEND_DMA.SRCADDR1 = 0; - SEND_DMA.SRCADDR2 = 0; - SEND_DMA.DESTADDR0 = ((uintptr_t) &FRAM_USART.DATA >> 0) & 0xFF; - SEND_DMA.DESTADDR1 = ((uintptr_t) &FRAM_USART.DATA >> 8) & 0xFF; - SEND_DMA.DESTADDR2 = 0; - SEND_DMA.CTRLA = DMA_CH_SINGLE_bm | DMA_CH_BURSTLEN_1BYTE_gc; + SEND_DMA.ADDRCTRL = DMA_CH_SRCRELOAD_NONE_gc | DMA_CH_SRCDIR_FIXED_gc | DMA_CH_DESTRELOAD_NONE_gc | DMA_CH_DESTDIR_FIXED_gc; + SEND_DMA.TRIGSRC = DMA_CH_TRIGSRC_USARTD0_DRE_gc; + SEND_DMA.TRFCNT = 0; + SEND_DMA.SRCADDR0 = 0; + SEND_DMA.SRCADDR1 = 0; + SEND_DMA.SRCADDR2 = 0; + SEND_DMA.DESTADDR0 = ((uintptr_t) &FRAM_USART.DATA >> 0) & 0xFF; + SEND_DMA.DESTADDR1 = ((uintptr_t) &FRAM_USART.DATA >> 8) & 0xFF; + SEND_DMA.DESTADDR2 = 0; + SEND_DMA.CTRLA = DMA_CH_SINGLE_bm | DMA_CH_BURSTLEN_1BYTE_gc; } void MemoryReadBlock(void* Buffer, uint16_t Address, uint16_t ByteCount) { - if (ByteCount == 0) - return; - FRAMRead(Buffer, Address, ByteCount); + if (ByteCount == 0) + return; + FRAMRead(Buffer, Address, ByteCount); } void MemoryWriteBlock(const void* Buffer, uint16_t Address, uint16_t ByteCount) { - if (ByteCount == 0) - return; - FRAMWrite(Buffer, Address, ByteCount); + if (ByteCount == 0) + return; + FRAMWrite(Buffer, Address, ByteCount); - LEDHook(LED_MEMORY_CHANGED, LED_ON); + LEDHook(LED_MEMORY_CHANGED, LED_ON); } void MemoryClear(void) { - FlashErase((uint32_t) GlobalSettings.ActiveSettingIdx * MEMORY_SIZE_PER_SETTING, MEMORY_SIZE_PER_SETTING); + FlashErase((uint32_t) GlobalSettings.ActiveSettingIdx * MEMORY_SIZE_PER_SETTING, MEMORY_SIZE_PER_SETTING); - MemoryRecall(); + MemoryRecall(); } void MemoryRecall(void) { - /* Recall memory from permanent flash */ - FlashToFRAM((uint32_t) GlobalSettings.ActiveSettingIdx * MEMORY_SIZE_PER_SETTING, MEMORY_SIZE_PER_SETTING); + /* Recall memory from permanent flash */ + FlashToFRAM((uint32_t) GlobalSettings.ActiveSettingIdx * MEMORY_SIZE_PER_SETTING, MEMORY_SIZE_PER_SETTING); SystemTickClearFlag(); } void MemoryStore(void) { - /* Store current memory into permanent flash */ - FRAMToFlash((uint32_t) GlobalSettings.ActiveSettingIdx * MEMORY_SIZE_PER_SETTING, MEMORY_SIZE_PER_SETTING); + /* Store current memory into permanent flash */ + FRAMToFlash((uint32_t) GlobalSettings.ActiveSettingIdx * MEMORY_SIZE_PER_SETTING, MEMORY_SIZE_PER_SETTING); - LEDHook(LED_MEMORY_CHANGED, LED_OFF); - LEDHook(LED_MEMORY_STORED, LED_PULSE); + LEDHook(LED_MEMORY_CHANGED, LED_OFF); + LEDHook(LED_MEMORY_STORED, LED_PULSE); SystemTickClearFlag(); } @@ -417,14 +417,14 @@ bool MemoryUploadBlock(void* Buffer, uint32_t BlockAddress, uint16_t ByteCount) /* Prevent writing out of bounds by silently ignoring it */ return true; } else { - /* Calculate bytes left in memory and start writing */ - uint32_t BytesLeft = MEMORY_SIZE_PER_SETTING - BlockAddress; - ByteCount = MIN(ByteCount, BytesLeft); + /* Calculate bytes left in memory and start writing */ + uint32_t BytesLeft = MEMORY_SIZE_PER_SETTING - BlockAddress; + ByteCount = MIN(ByteCount, BytesLeft); - /* Store to local memory */ - FRAMWrite(Buffer, BlockAddress, ByteCount); + /* Store to local memory */ + FRAMWrite(Buffer, BlockAddress, ByteCount); - return true; + return true; } } @@ -434,12 +434,12 @@ bool MemoryDownloadBlock(void* Buffer, uint32_t BlockAddress, uint16_t ByteCount /* There are bytes out of bounds to be read. Notify that we are done. */ return false; } else { - /* Calculate bytes left in memory and issue reading */ - uint32_t BytesLeft = MEMORY_SIZE_PER_SETTING - BlockAddress; - ByteCount = MIN(ByteCount, BytesLeft); + /* Calculate bytes left in memory and issue reading */ + uint32_t BytesLeft = MEMORY_SIZE_PER_SETTING - BlockAddress; + ByteCount = MIN(ByteCount, BytesLeft); - /* Output local memory contents */ - FRAMRead(Buffer, BlockAddress, ByteCount); + /* Output local memory contents */ + FRAMRead(Buffer, BlockAddress, ByteCount); return true; } @@ -449,16 +449,16 @@ bool MemoryDownloadBlock(void* Buffer, uint32_t BlockAddress, uint16_t ByteCount static inline void NVM_EXEC(void) { - void *z = (void *)&NVM_CTRLA; + void *z = (void *)&NVM_CTRLA; - __asm__ volatile("out %[ccp], %[ioreg]" "\n\t" - "st z, %[cmdex]" - : - : [ccp] "I" (_SFR_IO_ADDR(CCP)), - [ioreg] "d" (CCP_IOREG_gc), - [cmdex] "r" (NVM_CMDEX_bm), - [z] "z" (z) - ); + __asm__ volatile("out %[ccp], %[ioreg]" "\n\t" + "st z, %[cmdex]" + : + : [ccp] "I" (_SFR_IO_ADDR(CCP)), + [ioreg] "d" (CCP_IOREG_gc), + [cmdex] "r" (NVM_CMDEX_bm), + [z] "z" (z) + ); } void WaitForNVM(void) @@ -468,82 +468,82 @@ void WaitForNVM(void) void FlushNVMBuffer(void) { - WaitForNVM(); + WaitForNVM(); - if ((NVM.STATUS & NVM_EELOAD_bm) != 0) { - NVM.CMD = NVM_CMD_ERASE_EEPROM_BUFFER_gc; - NVM_EXEC(); - } + if ((NVM.STATUS & NVM_EELOAD_bm) != 0) { + NVM.CMD = NVM_CMD_ERASE_EEPROM_BUFFER_gc; + NVM_EXEC(); + } } uint16_t ReadEEPBlock(uint16_t Address, void *DestPtr, uint16_t ByteCount) { - uint16_t BytesRead = 0; - uint8_t* BytePtr = (uint8_t*) DestPtr; - NVM.ADDR2 = 0; + uint16_t BytesRead = 0; + uint8_t* BytePtr = (uint8_t*) DestPtr; + NVM.ADDR2 = 0; - WaitForNVM(); + WaitForNVM(); - while (ByteCount > 0) - { - NVM.ADDR0 = Address & 0xFF; - NVM.ADDR1 = (Address >> 8) & 0x1F; + while (ByteCount > 0) + { + NVM.ADDR0 = Address & 0xFF; + NVM.ADDR1 = (Address >> 8) & 0x1F; - NVM.CMD = NVM_CMD_READ_EEPROM_gc; - NVM_EXEC(); + NVM.CMD = NVM_CMD_READ_EEPROM_gc; + NVM_EXEC(); - *BytePtr++ = NVM.DATA0; - Address++; + *BytePtr++ = NVM.DATA0; + Address++; - ByteCount--; - BytesRead++; - } + ByteCount--; + BytesRead++; + } - return BytesRead; + return BytesRead; } uint16_t WriteEEPBlock(uint16_t Address, const void *SrcPtr, uint16_t ByteCount) { - const uint8_t* BytePtr = (const uint8_t*) SrcPtr; - uint8_t ByteAddress = Address % EEPROM_PAGE_SIZE; - uint16_t PageAddress = Address - ByteAddress; - uint16_t BytesWritten = 0; + const uint8_t* BytePtr = (const uint8_t*) SrcPtr; + uint8_t ByteAddress = Address % EEPROM_PAGE_SIZE; + uint16_t PageAddress = Address - ByteAddress; + uint16_t BytesWritten = 0; - FlushNVMBuffer(); - WaitForNVM(); - NVM.CMD = NVM_CMD_LOAD_EEPROM_BUFFER_gc; + FlushNVMBuffer(); + WaitForNVM(); + NVM.CMD = NVM_CMD_LOAD_EEPROM_BUFFER_gc; - NVM.ADDR1 = 0; - NVM.ADDR2 = 0; + NVM.ADDR1 = 0; + NVM.ADDR2 = 0; - while (ByteCount > 0) - { - NVM.ADDR0 = ByteAddress; + while (ByteCount > 0) + { + NVM.ADDR0 = ByteAddress; - NVM.DATA0 = *BytePtr++; + NVM.DATA0 = *BytePtr++; - ByteAddress++; - ByteCount--; + ByteAddress++; + ByteCount--; - if (ByteCount == 0 || ByteAddress >= EEPROM_PAGE_SIZE) - { - NVM.ADDR0 = PageAddress & 0xFF; - NVM.ADDR1 = (PageAddress >> 8) & 0x1F; + if (ByteCount == 0 || ByteAddress >= EEPROM_PAGE_SIZE) + { + NVM.ADDR0 = PageAddress & 0xFF; + NVM.ADDR1 = (PageAddress >> 8) & 0x1F; - NVM.CMD = NVM_CMD_ERASE_WRITE_EEPROM_PAGE_gc; - NVM_EXEC(); + NVM.CMD = NVM_CMD_ERASE_WRITE_EEPROM_PAGE_gc; + NVM_EXEC(); - PageAddress += EEPROM_PAGE_SIZE; - ByteAddress = 0; + PageAddress += EEPROM_PAGE_SIZE; + ByteAddress = 0; - WaitForNVM(); + WaitForNVM(); - NVM.CMD = NVM_CMD_LOAD_EEPROM_BUFFER_gc; - } + NVM.CMD = NVM_CMD_LOAD_EEPROM_BUFFER_gc; + } - BytesWritten++; - } + BytesWritten++; + } - return BytesWritten; + return BytesWritten; } diff --git a/Firmware/Chameleon-Mini/MemoryAsm.S b/Firmware/Chameleon-Mini/MemoryAsm.S index efb3374..be91df9 100644 --- a/Firmware/Chameleon-Mini/MemoryAsm.S +++ b/Firmware/Chameleon-Mini/MemoryAsm.S @@ -53,13 +53,13 @@ .section .text .global FlashReadWord FlashReadWord: - in r19, RAMPZ ; Save RAMPZ. - out RAMPZ, r24 ; Load RAMPZ with the MSB of the address. - movw ZL, r22 ; Move the low bytes to the Z pointer - elpm r24, Z+ ; Extended load byte from address pointed to by Z. - elpm r25, Z ; Extended load byte from address pointed to by Z. - out RAMPZ, r19 ; Restore RAMPZ register. - ret + in r19, RAMPZ ; Save RAMPZ. + out RAMPZ, r24 ; Load RAMPZ with the MSB of the address. + movw ZL, r22 ; Move the low bytes to the Z pointer + elpm r24, Z+ ; Extended load byte from address pointed to by Z. + elpm r25, Z ; Extended load byte from address pointed to by Z. + out RAMPZ, r19 ; Restore RAMPZ register. + ret ; This routine erases the page at address R25:R24:R23:R22 in the application ; section. The address can point anywhere inside the page. @@ -72,11 +72,11 @@ FlashReadWord: .section .text .global FlashEraseApplicationPage FlashEraseApplicationPage: - in r19, RAMPZ ; Save RAMPZ, which is restored in FlashCommonSPM. - out RAMPZ, r24 ; Load RAMPZ with the MSB of the address. - movw r24, r22 ; Move low bytes for ZH:ZL to R25:R24 - ldi r20, NVM_CMD_ERASE_APP_PAGE_gc ; Prepare NVM command in R20. - jmp FlashCommonSPM ; Jump to common SPM code. + in r19, RAMPZ ; Save RAMPZ, which is restored in FlashCommonSPM. + out RAMPZ, r24 ; Load RAMPZ with the MSB of the address. + movw r24, r22 ; Move low bytes for ZH:ZL to R25:R24 + ldi r20, NVM_CMD_ERASE_APP_PAGE_gc ; Prepare NVM command in R20. + jmp FlashCommonSPM ; Jump to common SPM code. ; This routine writes the word from R23:R22 into the Flash page buffer at ; address R25:R24. @@ -90,10 +90,10 @@ FlashEraseApplicationPage: .section .text .global FlashLoadFlashWord FlashLoadFlashWord: - in r19, RAMPZ ; Save RAMPZ, which is restored in FlashCommonSPM. - movw r0, r22 ; Prepare flash word in R1:R0. - ldi r20, NVM_CMD_LOAD_FLASH_BUFFER_gc ; Prepare NVM command in R20. - jmp FlashCommonSPM ; Jump to common SPM code. + in r19, RAMPZ ; Save RAMPZ, which is restored in FlashCommonSPM. + movw r0, r22 ; Prepare flash word in R1:R0. + ldi r20, NVM_CMD_LOAD_FLASH_BUFFER_gc ; Prepare NVM command in R20. + jmp FlashCommonSPM ; Jump to common SPM code. ; This routine erases first and then writes the page buffer to the @@ -108,11 +108,11 @@ FlashLoadFlashWord: .section .text .global FlashEraseWriteApplicationPage FlashEraseWriteApplicationPage: - in r19, RAMPZ ; Save RAMPZ, which is restored in FlashCommonSPM. - out RAMPZ, r24 ; Load RAMPZ with the MSB of the address. - movw r24, r22 ; Move low bytes of address to ZH:ZL from R23:R22 - ldi r20, NVM_CMD_ERASE_WRITE_APP_PAGE_gc ; Prepare NVM command in R20. - jmp FlashCommonSPM ; Jump to common SPM code. + in r19, RAMPZ ; Save RAMPZ, which is restored in FlashCommonSPM. + out RAMPZ, r24 ; Load RAMPZ with the MSB of the address. + movw r24, r22 ; Move low bytes of address to ZH:ZL from R23:R22 + ldi r20, NVM_CMD_ERASE_WRITE_APP_PAGE_gc ; Prepare NVM command in R20. + jmp FlashCommonSPM ; Jump to common SPM code. ; This routine flushes the Flash page buffer. ; @@ -124,10 +124,10 @@ FlashEraseWriteApplicationPage: .section .text .global FlashEraseFlashBuffer FlashEraseFlashBuffer: - in r19, RAMPZ ; Save RAMPZ, which is restored in FlashCommonSPM. - ldi r20, NVM_CMD_ERASE_FLASH_BUFFER_gc ; Prepare NVM command in R20. - ;jmp FlashCommonSPM ; Jump to common SPM code. - jmp FlashCommonCMD + in r19, RAMPZ ; Save RAMPZ, which is restored in FlashCommonSPM. + ldi r20, NVM_CMD_ERASE_FLASH_BUFFER_gc ; Prepare NVM command in R20. + ;jmp FlashCommonSPM ; Jump to common SPM code. + jmp FlashCommonCMD ; This routine wait for the SPM to finish and clears the command register. ; @@ -142,12 +142,12 @@ FlashEraseFlashBuffer: .section .text .global FlashWaitForSPM FlashWaitForSPM: - lds r18, NVM_STATUS ; Load the NVM Status register. - sbrc r18, NVM_NVMBUSY_bp ; Check if bit is cleared. - rjmp FlashWaitForSPM ; Repeat check if bit is not cleared. - clr r18 - sts NVM_CMD, r18 ; Clear up command register to NO_OPERATION. - ret + lds r18, NVM_STATUS ; Load the NVM Status register. + sbrc r18, NVM_NVMBUSY_bp ; Check if bit is cleared. + rjmp FlashWaitForSPM ; Repeat check if bit is not cleared. + clr r18 + sts NVM_CMD, r18 ; Clear up command register to NO_OPERATION. + ret ; This routine is called by several other routines, and contains common code ; for executing an NVM command, including the return statement itself. @@ -165,16 +165,16 @@ FlashWaitForSPM: ; R25:R24:R23:R22 - 32-bit result from NVM operation. .section .text FlashCommonCMD: - sts NVM_CMD, r20 ; Load command into NVM Command register. - ldi r18, CCP_IOREG_gc ; Prepare Protect IO-register signature in R18. - ldi r19, NVM_CMDEX_bm ; Prepare bitmask for setting NVM Command Execute bit into R19. - sts CCP, r18 ; Enable IO-register operation (this disables interrupts for 4 cycles). - sts NVM_CTRLA, r19 ; Load bitmask into NVM Control Register A, which executes the command. - lds r22, NVM_DATA0 ; Load NVM Data Register 0 into R22. - lds r23, NVM_DATA1 ; Load NVM Data Register 1 into R23. - lds r24, NVM_DATA2 ; Load NVM Data Register 2 into R24. - clr r25 ; Clear R25 in order to return a clean 32-bit value. - ret + sts NVM_CMD, r20 ; Load command into NVM Command register. + ldi r18, CCP_IOREG_gc ; Prepare Protect IO-register signature in R18. + ldi r19, NVM_CMDEX_bm ; Prepare bitmask for setting NVM Command Execute bit into R19. + sts CCP, r18 ; Enable IO-register operation (this disables interrupts for 4 cycles). + sts NVM_CTRLA, r19 ; Load bitmask into NVM Control Register A, which executes the command. + lds r22, NVM_DATA0 ; Load NVM Data Register 0 into R22. + lds r23, NVM_DATA1 ; Load NVM Data Register 1 into R23. + lds r24, NVM_DATA2 ; Load NVM Data Register 2 into R24. + clr r25 ; Clear R25 in order to return a clean 32-bit value. + ret ; This routine is called by several other routines, and contains common code ; for executing an LPM command, including the return statement itself. @@ -190,10 +190,10 @@ FlashCommonCMD: ; R24 - Result from LPM operation. .section .text FlashCommonLPM: - movw ZL, r24 ; Load index into Z. - sts NVM_CMD, r20 ; Load prepared command into NVM Command register. - lpm r24,Z - ret + movw ZL, r24 ; Load index into Z. + sts NVM_CMD, r20 ; Load prepared command into NVM Command register. + lpm r24,Z + ret ; This routine is called by several other routines, and contains common code ; for executing an SPM command, including the return statement itself. @@ -210,14 +210,14 @@ FlashCommonLPM: ; Nothing. .section .spmhelper FlashCommonSPM: - movw ZL, r24 ; Load R25:R24 into Z. - sts NVM_CMD, r20 ; Load prepared command into NVM Command register. - ldi r18, CCP_SPM_gc ; Prepare Protect SPM signature in R18 - sts CCP, r18 ; Enable SPM operation (this disables interrupts for 4 cycles). - spm ; Self-program. - clr r1 ; Clear R1 for GCC _zero_reg_ to function properly. - out RAMPZ, r19 ; Restore RAMPZ register. - ret + movw ZL, r24 ; Load R25:R24 into Z. + sts NVM_CMD, r20 ; Load prepared command into NVM Command register. + ldi r18, CCP_SPM_gc ; Prepare Protect SPM signature in R18 + sts CCP, r18 ; Enable SPM operation (this disables interrupts for 4 cycles). + spm ; Self-program. + clr r1 ; Clear R1 for GCC _zero_reg_ to function properly. + out RAMPZ, r19 ; Restore RAMPZ register. + ret /* Reserve memory for data */ .section .flashdata diff --git a/Firmware/Chameleon-Mini/Settings.c b/Firmware/Chameleon-Mini/Settings.c index 7f7b384..6ef2d33 100644 --- a/Firmware/Chameleon-Mini/Settings.c +++ b/Firmware/Chameleon-Mini/Settings.c @@ -13,24 +13,24 @@ SettingsType GlobalSettings; SettingsType EEMEM StoredSettings = { - .ActiveSettingIdx = SETTING_TO_INDEX(DEFAULT_SETTING), - .ActiveSettingPtr = &GlobalSettings.Settings[SETTING_TO_INDEX(DEFAULT_SETTING)], + .ActiveSettingIdx = SETTING_TO_INDEX(DEFAULT_SETTING), + .ActiveSettingPtr = &GlobalSettings.Settings[SETTING_TO_INDEX(DEFAULT_SETTING)], - .Settings = { [0 ... (SETTINGS_COUNT-1)] = { - .Configuration = DEFAULT_CONFIGURATION, - .ButtonActions = { - [BUTTON_L_PRESS_SHORT] = DEFAULT_LBUTTON_ACTION, [BUTTON_R_PRESS_SHORT] = DEFAULT_RBUTTON_ACTION, - [BUTTON_L_PRESS_LONG] = DEFAULT_LBUTTON_ACTION, [BUTTON_R_PRESS_LONG] = DEFAULT_RBUTTON_ACTION - }, - .LogMode = DEFAULT_LOG_MODE, - .LEDRedFunction = DEFAULT_RED_LED_ACTION, - .LEDGreenFunction = DEFAULT_GREEN_LED_ACTION, - .PendingTaskTimeout = DEFAULT_PENDING_TASK_TIMEOUT - }} + .Settings = { [0 ... (SETTINGS_COUNT-1)] = { + .Configuration = DEFAULT_CONFIGURATION, + .ButtonActions = { + [BUTTON_L_PRESS_SHORT] = DEFAULT_LBUTTON_ACTION, [BUTTON_R_PRESS_SHORT] = DEFAULT_RBUTTON_ACTION, + [BUTTON_L_PRESS_LONG] = DEFAULT_LBUTTON_ACTION, [BUTTON_R_PRESS_LONG] = DEFAULT_RBUTTON_ACTION + }, + .LogMode = DEFAULT_LOG_MODE, + .LEDRedFunction = DEFAULT_RED_LED_ACTION, + .LEDGreenFunction = DEFAULT_GREEN_LED_ACTION, + .PendingTaskTimeout = DEFAULT_PENDING_TASK_TIMEOUT + }} }; void SettingsLoad(void) { - ReadEEPBlock((uint16_t) &StoredSettings, &GlobalSettings, sizeof(SettingsType)); + ReadEEPBlock((uint16_t) &StoredSettings, &GlobalSettings, sizeof(SettingsType)); } void SettingsSave(void) { @@ -47,19 +47,19 @@ void ActiveSettingNumberSave(void) { } void SettingsCycle(void) { - uint8_t i = SETTINGS_COUNT; - uint8_t SettingIdx = GlobalSettings.ActiveSettingIdx; + uint8_t i = SETTINGS_COUNT; + uint8_t SettingIdx = GlobalSettings.ActiveSettingIdx; - while (i-- > 0) { - /* Try to set one of the SETTINGS_COUNT following settings. - * But only set if it is not CONFIG_NONE. */ - SettingIdx = (SettingIdx + 1) % SETTINGS_COUNT; + while (i-- > 0) { + /* Try to set one of the SETTINGS_COUNT following settings. + * But only set if it is not CONFIG_NONE. */ + SettingIdx = (SettingIdx + 1) % SETTINGS_COUNT; - if (GlobalSettings.Settings[SettingIdx].Configuration != CONFIG_NONE) { - SettingsSetActiveById(INDEX_TO_SETTING(SettingIdx)); - break; - } - } + if (GlobalSettings.Settings[SettingIdx].Configuration != CONFIG_NONE) { + SettingsSetActiveById(INDEX_TO_SETTING(SettingIdx)); + break; + } + } } bool SettingsSetActiveById(uint8_t Setting) { @@ -96,22 +96,22 @@ bool SettingsSetActiveById(uint8_t Setting) { } uint8_t SettingsGetActiveById(void) { - return INDEX_TO_SETTING(GlobalSettings.ActiveSettingIdx); + return INDEX_TO_SETTING(GlobalSettings.ActiveSettingIdx); } void SettingsGetActiveByName(char* SettingOut, uint16_t BufferSize) { - SettingOut[0] = SettingsGetActiveById() + '0'; - SettingOut[1] = '\0'; + SettingOut[0] = SettingsGetActiveById() + '0'; + SettingOut[1] = '\0'; } bool SettingsSetActiveByName(const char* Setting) { - uint8_t SettingNr = Setting[0] - '0'; + uint8_t SettingNr = Setting[0] - '0'; - if (Setting[1] == '\0') { - LogEntry(LOG_INFO_SETTING_SET, Setting, 1); - return SettingsSetActiveById(SettingNr); - } else { - return false; - } + if (Setting[1] == '\0') { + LogEntry(LOG_INFO_SETTING_SET, Setting, 1); + return SettingsSetActiveById(SettingNr); + } else { + return false; + } } diff --git a/Firmware/Chameleon-Mini/Settings.h b/Firmware/Chameleon-Mini/Settings.h index 987bfd7..4d5bd3d 100644 --- a/Firmware/Chameleon-Mini/Settings.h +++ b/Firmware/Chameleon-Mini/Settings.h @@ -23,18 +23,18 @@ * \note Some properties may change globally if this is defined in the Makefile. */ typedef struct { - ButtonActionEnum ButtonActions[BUTTON_TYPE_COUNT]; /// Button actions for this setting. - LogModeEnum LogMode; /// Log mode for this setting. - ConfigurationEnum Configuration; /// Active configuration for this setting. - LEDHookEnum LEDRedFunction; /// Red LED function for this setting. - LEDHookEnum LEDGreenFunction; /// Green LED function for this setting. - uint16_t PendingTaskTimeout; /// Timeout for timeout commands for this setting, in multiples of 100 ms. + ButtonActionEnum ButtonActions[BUTTON_TYPE_COUNT]; /// Button actions for this setting. + LogModeEnum LogMode; /// Log mode for this setting. + ConfigurationEnum Configuration; /// Active configuration for this setting. + LEDHookEnum LEDRedFunction; /// Red LED function for this setting. + LEDHookEnum LEDGreenFunction; /// Green LED function for this setting. + uint16_t PendingTaskTimeout; /// Timeout for timeout commands for this setting, in multiples of 100 ms. } SettingsEntryType; typedef struct { - uint8_t ActiveSettingIdx; - SettingsEntryType* ActiveSettingPtr; - SettingsEntryType Settings[SETTINGS_COUNT]; + uint8_t ActiveSettingIdx; + SettingsEntryType* ActiveSettingPtr; + SettingsEntryType Settings[SETTINGS_COUNT]; } SettingsType; extern SettingsType GlobalSettings; diff --git a/Firmware/Chameleon-Mini/System.c b/Firmware/Chameleon-Mini/System.c index 978bf49..fd44543 100644 --- a/Firmware/Chameleon-Mini/System.c +++ b/Firmware/Chameleon-Mini/System.c @@ -15,13 +15,13 @@ ISR(BADISR_vect) { - //LED_PORT.OUTSET = LED_RED; + //LED_PORT.OUTSET = LED_RED; while(1); } ISR(RTC_OVF_vect) { - SYSTEM_TICK_REGISTER += SYSTEM_TICK_PERIOD; + SYSTEM_TICK_REGISTER += SYSTEM_TICK_PERIOD; } void SystemInit(void) @@ -46,14 +46,14 @@ void SystemInit(void) OSC.PLLCTRL = OSC_PLLSRC_XOSC_gc | (2 << OSC_PLLFAC_gp); OSC.CTRL |= OSC_PLLEN_bm; - while(!(OSC.STATUS & OSC_PLLRDY_bm)) - ; + while(!(OSC.STATUS & OSC_PLLRDY_bm)) + ; - /* Set PLL as main clock */ - CCP = CCP_IOREG_gc; - CLK.CTRL = CLK_SCLKSEL_PLL_gc; + /* Set PLL as main clock */ + CCP = CCP_IOREG_gc; + CLK.CTRL = CLK_SCLKSEL_PLL_gc; - SYSTEM_TICK_REGISTER = 0; + SYSTEM_TICK_REGISTER = 0; /* Enable RTC with roughly 1kHz clock for system tick * and to wake up while sleeping. */ @@ -67,7 +67,7 @@ void SystemInit(void) //NVM.CTRLB |= NVM_EEMAPEN_bm; /* Enable DMA */ - DMA.CTRL = DMA_ENABLE_bm | DMA_DBUFMODE_DISABLED_gc | DMA_PRIMODE_RR0123_gc; + DMA.CTRL = DMA_ENABLE_bm | DMA_DBUFMODE_DISABLED_gc | DMA_PRIMODE_RR0123_gc; } @@ -87,7 +87,7 @@ void SystemEnterBootloader(void) void SystemStartUSBClock(void) { - //SystemSleepDisable(); + //SystemSleepDisable(); #if 0 /* 48MHz USB Clock using 12MHz XTAL */ OSC.XOSCCTRL = OSC_FRQRANGE_12TO16_gc | OSC_XOSCSEL_XTAL_16KCLK_gc; @@ -127,7 +127,7 @@ void SystemStartUSBClock(void) void SystemStopUSBClock(void) { - //SystemSleepEnable(); + //SystemSleepEnable(); #if 0 /* Disable USB Clock to minimize power consumption */ diff --git a/Firmware/Chameleon-Mini/System.h b/Firmware/Chameleon-Mini/System.h index 45e8fc2..2f648b4 100644 --- a/Firmware/Chameleon-Mini/System.h +++ b/Firmware/Chameleon-Mini/System.h @@ -41,11 +41,11 @@ INLINE bool SystemTick100ms(void); INLINE bool SystemTick100ms(void) { if (RTC.INTFLAGS & RTC_COMPIF_bm) { - while(RTC.STATUS & RTC_SYNCBUSY_bm) - ; + while(RTC.STATUS & RTC_SYNCBUSY_bm) + ; - RTC.INTFLAGS = RTC_COMPIF_bm; - return true; + RTC.INTFLAGS = RTC_COMPIF_bm; + return true; } return false; @@ -60,7 +60,7 @@ INLINE void SystemTickClearFlag(void) } INLINE uint16_t SystemGetSysTick(void) { - return SYSTEM_TICK_REGISTER | RTC.CNT; + return SYSTEM_TICK_REGISTER | RTC.CNT; } #endif /* SYSTEM_H */ diff --git a/Firmware/Chameleon-Mini/Terminal/CommandLine.c b/Firmware/Chameleon-Mini/Terminal/CommandLine.c index 78d5225..ce94bff 100644 --- a/Firmware/Chameleon-Mini/Terminal/CommandLine.c +++ b/Firmware/Chameleon-Mini/Terminal/CommandLine.c @@ -191,32 +191,32 @@ const PROGMEM CommandEntryType CommandTable[] = { .GetFunc = NO_FUNCTION }, { - .Command = COMMAND_SETTING, - .ExecFunc = NO_FUNCTION, + .Command = COMMAND_SETTING, + .ExecFunc = NO_FUNCTION, .ExecParamFunc = NO_FUNCTION, - .SetFunc = CommandSetSetting, - .GetFunc = CommandGetSetting + .SetFunc = CommandSetSetting, + .GetFunc = CommandGetSetting }, { - .Command = COMMAND_CLEAR, - .ExecFunc = CommandExecClear, + .Command = COMMAND_CLEAR, + .ExecFunc = CommandExecClear, .ExecParamFunc = NO_FUNCTION, - .SetFunc = NO_FUNCTION, - .GetFunc = NO_FUNCTION + .SetFunc = NO_FUNCTION, + .GetFunc = NO_FUNCTION }, { - .Command = COMMAND_STORE, - .ExecFunc = CommandExecStore, + .Command = COMMAND_STORE, + .ExecFunc = CommandExecStore, .ExecParamFunc = NO_FUNCTION, - .SetFunc = NO_FUNCTION, - .GetFunc = NO_FUNCTION + .SetFunc = NO_FUNCTION, + .GetFunc = NO_FUNCTION }, { - .Command = COMMAND_RECALL, - .ExecFunc = CommandExecRecall, + .Command = COMMAND_RECALL, + .ExecFunc = CommandExecRecall, .ExecParamFunc = NO_FUNCTION, - .SetFunc = NO_FUNCTION, - .GetFunc = NO_FUNCTION + .SetFunc = NO_FUNCTION, + .GetFunc = NO_FUNCTION }, { .Command = COMMAND_CHARGING, @@ -233,67 +233,67 @@ const PROGMEM CommandEntryType CommandTable[] = { .GetFunc = NO_FUNCTION }, { - .Command = COMMAND_RSSI, - .ExecFunc = NO_FUNCTION, + .Command = COMMAND_RSSI, + .ExecFunc = NO_FUNCTION, .ExecParamFunc = NO_FUNCTION, - .SetFunc = NO_FUNCTION, - .GetFunc = CommandGetRssi + .SetFunc = NO_FUNCTION, + .GetFunc = CommandGetRssi }, { - .Command = COMMAND_SYSTICK, - .ExecFunc = NO_FUNCTION, + .Command = COMMAND_SYSTICK, + .ExecFunc = NO_FUNCTION, .ExecParamFunc = NO_FUNCTION, - .SetFunc = NO_FUNCTION, - .GetFunc = CommandGetSysTick + .SetFunc = NO_FUNCTION, + .GetFunc = CommandGetSysTick }, { - .Command = COMMAND_SEND_RAW, - .ExecFunc = NO_FUNCTION, + .Command = COMMAND_SEND_RAW, + .ExecFunc = NO_FUNCTION, .ExecParamFunc = CommandExecParamSendRaw, - .SetFunc = NO_FUNCTION, - .GetFunc = NO_FUNCTION + .SetFunc = NO_FUNCTION, + .GetFunc = NO_FUNCTION }, { - .Command = COMMAND_SEND, - .ExecFunc = NO_FUNCTION, + .Command = COMMAND_SEND, + .ExecFunc = NO_FUNCTION, .ExecParamFunc = CommandExecParamSend, - .SetFunc = NO_FUNCTION, - .GetFunc = NO_FUNCTION + .SetFunc = NO_FUNCTION, + .GetFunc = NO_FUNCTION }, { - .Command = COMMAND_GETUID, - .ExecFunc = CommandExecGetUid, + .Command = COMMAND_GETUID, + .ExecFunc = CommandExecGetUid, .ExecParamFunc = NO_FUNCTION, - .SetFunc = NO_FUNCTION, - .GetFunc = NO_FUNCTION + .SetFunc = NO_FUNCTION, + .GetFunc = NO_FUNCTION }, { - .Command = COMMAND_DUMP_MFU, - .ExecFunc = CommandExecDumpMFU, + .Command = COMMAND_DUMP_MFU, + .ExecFunc = CommandExecDumpMFU, .ExecParamFunc = NO_FUNCTION, - .SetFunc = NO_FUNCTION, - .GetFunc = NO_FUNCTION + .SetFunc = NO_FUNCTION, + .GetFunc = NO_FUNCTION }, { - .Command = COMMAND_IDENTIFY_CARD, - .ExecFunc = CommandExecIdentifyCard, + .Command = COMMAND_IDENTIFY_CARD, + .ExecFunc = CommandExecIdentifyCard, .ExecParamFunc = NO_FUNCTION, - .SetFunc = NO_FUNCTION, - .GetFunc = NO_FUNCTION + .SetFunc = NO_FUNCTION, + .GetFunc = NO_FUNCTION }, { - .Command = COMMAND_TIMEOUT, - .ExecFunc = NO_FUNCTION, + .Command = COMMAND_TIMEOUT, + .ExecFunc = NO_FUNCTION, .ExecParamFunc = NO_FUNCTION, - .SetFunc = CommandSetTimeout, - .GetFunc = CommandGetTimeout + .SetFunc = CommandSetTimeout, + .GetFunc = CommandGetTimeout }, { - .Command = COMMAND_THRESHOLD, - .ExecFunc = NO_FUNCTION, + .Command = COMMAND_THRESHOLD, + .ExecFunc = NO_FUNCTION, .ExecParamFunc = NO_FUNCTION, - .SetFunc = CommandSetThreshold, - .GetFunc = CommandGetThreshold + .SetFunc = CommandSetThreshold, + .GetFunc = CommandGetThreshold }, { .Command = COMMAND_AUTOCALIBRATE, @@ -361,39 +361,39 @@ static CommandStatusIdType CallCommandFunc( char* pTerminalBuffer = (char*) TerminalBuffer; CommandStatusIdType Status = COMMAND_ERR_INVALID_USAGE_ID; - /* Call appropriate function depending on CommandDelimiter */ - if (CommandDelimiter == CHAR_GET_MODE) { - CommandGetFuncType GetFunc = pgm_read_ptr(&CommandEntry->GetFunc); - if (GetFunc != NO_FUNCTION) { - Status = GetFunc(pTerminalBuffer); - } - } else if (CommandDelimiter == CHAR_SET_MODE) { - CommandSetFuncType SetFunc = pgm_read_ptr(&CommandEntry->SetFunc); - if (SetFunc != NO_FUNCTION) { - Status = SetFunc(pTerminalBuffer, pParam); - } - } else if (CommandDelimiter == CHAR_EXEC_MODE) { - CommandExecFuncType ExecFunc = pgm_read_ptr(&CommandEntry->ExecFunc); - if (ExecFunc != NO_FUNCTION) { - Status = ExecFunc(pTerminalBuffer); - } - } else if (CommandDelimiter == CHAR_EXEC_MODE_PARAM) { - CommandExecParamFuncType ExecParamFunc = pgm_read_ptr(&CommandEntry->ExecParamFunc); - if (ExecParamFunc != NO_FUNCTION) { - Status = ExecParamFunc(pTerminalBuffer, pParam); - } - } else { - /* This should not happen (TM) */ - } + /* Call appropriate function depending on CommandDelimiter */ + if (CommandDelimiter == CHAR_GET_MODE) { + CommandGetFuncType GetFunc = pgm_read_ptr(&CommandEntry->GetFunc); + if (GetFunc != NO_FUNCTION) { + Status = GetFunc(pTerminalBuffer); + } + } else if (CommandDelimiter == CHAR_SET_MODE) { + CommandSetFuncType SetFunc = pgm_read_ptr(&CommandEntry->SetFunc); + if (SetFunc != NO_FUNCTION) { + Status = SetFunc(pTerminalBuffer, pParam); + } + } else if (CommandDelimiter == CHAR_EXEC_MODE) { + CommandExecFuncType ExecFunc = pgm_read_ptr(&CommandEntry->ExecFunc); + if (ExecFunc != NO_FUNCTION) { + Status = ExecFunc(pTerminalBuffer); + } + } else if (CommandDelimiter == CHAR_EXEC_MODE_PARAM) { + CommandExecParamFuncType ExecParamFunc = pgm_read_ptr(&CommandEntry->ExecParamFunc); + if (ExecParamFunc != NO_FUNCTION) { + Status = ExecParamFunc(pTerminalBuffer, pParam); + } + } else { + /* This should not happen (TM) */ + } - if (Status == TIMEOUT_COMMAND) - { - TaskPending = true; - TaskPendingSince = SystemGetSysTick(); - } + if (Status == TIMEOUT_COMMAND) + { + TaskPending = true; + TaskPendingSince = SystemGetSysTick(); + } - /* This delimiter has not been registered with this command */ - return Status; + /* This delimiter has not been registered with this command */ + return Status; } static void DecodeCommand(void) @@ -432,7 +432,7 @@ static void DecodeCommand(void) } if (StatusId == TIMEOUT_COMMAND) // it is a timeout command, so we return - return; + return; /* Send command status message */ TerminalSendStringP(GetStatusMessageP(StatusId)); @@ -451,83 +451,83 @@ void CommandLineInit(void) } bool CommandLineProcessByte(uint8_t Byte) { - if (IS_CHARACTER(Byte)) { - /* Store uppercase character */ - if (IS_LOWERCASE(Byte)) { - Byte = TO_UPPERCASE(Byte); - } + if (IS_CHARACTER(Byte)) { + /* Store uppercase character */ + if (IS_LOWERCASE(Byte)) { + Byte = TO_UPPERCASE(Byte); + } - /* Prevent buffer overflow and account for '\0' */ - if (BufferIdx < TERMINAL_BUFFER_SIZE - 1) { - TerminalBuffer[BufferIdx++] = Byte; - } - } else if (Byte == '\r') { - /* Process on \r. Terminate string and decode. */ - TerminalBuffer[BufferIdx] = '\0'; - BufferIdx = 0; + /* Prevent buffer overflow and account for '\0' */ + if (BufferIdx < TERMINAL_BUFFER_SIZE - 1) { + TerminalBuffer[BufferIdx++] = Byte; + } + } else if (Byte == '\r') { + /* Process on \r. Terminate string and decode. */ + TerminalBuffer[BufferIdx] = '\0'; + BufferIdx = 0; - if (!TaskPending) - DecodeCommand(); - } else if (Byte == '\b') { - /* Backspace. Delete last character in buffer. */ - if (BufferIdx > 0) { - BufferIdx--; - } - } else if (Byte == 0x1B) { - /* Drop buffer on escape */ - BufferIdx = 0; - } else { - /* Ignore other chars */ - } + if (!TaskPending) + DecodeCommand(); + } else if (Byte == '\b') { + /* Backspace. Delete last character in buffer. */ + if (BufferIdx > 0) { + BufferIdx--; + } + } else if (Byte == 0x1B) { + /* Drop buffer on escape */ + BufferIdx = 0; + } else { + /* Ignore other chars */ + } - return true; + return true; } INLINE void Timeout(void) { - TaskPending = false; - TerminalSendStringP(GetStatusMessageP(COMMAND_ERR_TIMEOUT_ID)); - TerminalSendStringP(PSTR(STATUS_MESSAGE_TRAILER)); + TaskPending = false; + TerminalSendStringP(GetStatusMessageP(COMMAND_ERR_TIMEOUT_ID)); + TerminalSendStringP(PSTR(STATUS_MESSAGE_TRAILER)); - if (CommandLinePendingTaskTimeout != NO_FUNCTION) - { - CommandLinePendingTaskTimeout(); // call the function that ends the task - CommandLinePendingTaskTimeout = NO_FUNCTION; - } + if (CommandLinePendingTaskTimeout != NO_FUNCTION) + { + CommandLinePendingTaskTimeout(); // call the function that ends the task + CommandLinePendingTaskTimeout = NO_FUNCTION; + } } void CommandLineTick(void) { - if (TaskPending && - GlobalSettings.ActiveSettingPtr->PendingTaskTimeout != 0 && // 0 means no timeout - SYSTICK_DIFF_100MS(TaskPendingSince) >= GlobalSettings.ActiveSettingPtr->PendingTaskTimeout) // timeout expired - { - Timeout(); - } + if (TaskPending && + GlobalSettings.ActiveSettingPtr->PendingTaskTimeout != 0 && // 0 means no timeout + SYSTICK_DIFF_100MS(TaskPendingSince) >= GlobalSettings.ActiveSettingPtr->PendingTaskTimeout) // timeout expired + { + Timeout(); + } } void CommandLinePendingTaskBreak(void) { - if (!TaskPending) - return; + if (!TaskPending) + return; - Timeout(); + Timeout(); } void CommandLinePendingTaskFinished(CommandStatusIdType ReturnStatusID, char const * const OutMessage) { - if (!TaskPending) // if no task is pending, no task can be finished - return; - TaskPending = false; + if (!TaskPending) // if no task is pending, no task can be finished + return; + TaskPending = false; - TerminalSendStringP(GetStatusMessageP(ReturnStatusID)); - TerminalSendStringP(PSTR(STATUS_MESSAGE_TRAILER)); + TerminalSendStringP(GetStatusMessageP(ReturnStatusID)); + TerminalSendStringP(PSTR(STATUS_MESSAGE_TRAILER)); - if (OutMessage != NULL) - { - TerminalSendString(OutMessage); - TerminalSendStringP(PSTR(OPTIONAL_ANSWER_TRAILER)); - } + if (OutMessage != NULL) + { + TerminalSendString(OutMessage); + TerminalSendStringP(PSTR(OPTIONAL_ANSWER_TRAILER)); + } } void CommandLineAppendData(void const * const Buffer, uint16_t Bytes) @@ -536,7 +536,7 @@ void CommandLineAppendData(void const * const Buffer, uint16_t Bytes) uint16_t tmpBytes = Bytes; if (Bytes > (TERMINAL_BUFFER_SIZE / 2)) - tmpBytes = TERMINAL_BUFFER_SIZE / 2; + tmpBytes = TERMINAL_BUFFER_SIZE / 2; Bytes -= tmpBytes; BufferToHexString(pTerminalBuffer, TERMINAL_BUFFER_SIZE, Buffer, tmpBytes); @@ -545,10 +545,10 @@ void CommandLineAppendData(void const * const Buffer, uint16_t Bytes) uint8_t i = 1; while (Bytes > (TERMINAL_BUFFER_SIZE / 2)) { - Bytes -= TERMINAL_BUFFER_SIZE / 2; + Bytes -= TERMINAL_BUFFER_SIZE / 2; BufferToHexString(pTerminalBuffer, TERMINAL_BUFFER_SIZE, Buffer + i * TERMINAL_BUFFER_SIZE / 2, TERMINAL_BUFFER_SIZE); TerminalSendString(pTerminalBuffer); - i++; + i++; } if (Bytes > 0) diff --git a/Firmware/Chameleon-Mini/Terminal/Commands.c b/Firmware/Chameleon-Mini/Terminal/Commands.c index efd5cf8..5eb60b6 100644 --- a/Firmware/Chameleon-Mini/Terminal/Commands.c +++ b/Firmware/Chameleon-Mini/Terminal/Commands.c @@ -38,15 +38,15 @@ CommandStatusIdType CommandGetConfig(char* OutParam) CommandStatusIdType CommandSetConfig(char* OutMessage, const char* InParam) { - if (COMMAND_IS_SUGGEST_STRING(InParam)) { - ConfigurationGetList(OutMessage, TERMINAL_BUFFER_SIZE); - return COMMAND_INFO_OK_WITH_TEXT_ID; - } else if (ConfigurationSetByName(InParam)) { - SettingsSave(); - return COMMAND_INFO_OK_ID; - } else { - return COMMAND_ERR_INVALID_PARAM_ID; - } + if (COMMAND_IS_SUGGEST_STRING(InParam)) { + ConfigurationGetList(OutMessage, TERMINAL_BUFFER_SIZE); + return COMMAND_INFO_OK_WITH_TEXT_ID; + } else if (ConfigurationSetByName(InParam)) { + SettingsSave(); + return COMMAND_INFO_OK_ID; + } else { + return COMMAND_ERR_INVALID_PARAM_ID; + } } CommandStatusIdType CommandGetUid(char* OutParam) @@ -56,8 +56,8 @@ CommandStatusIdType CommandGetUid(char* OutParam) if (UidSize == 0) { - snprintf_P(OutParam, TERMINAL_BUFFER_SIZE, PSTR("NO UID.")); - return COMMAND_INFO_OK_WITH_TEXT_ID; + snprintf_P(OutParam, TERMINAL_BUFFER_SIZE, PSTR("NO UID.")); + return COMMAND_INFO_OK_WITH_TEXT_ID; } ApplicationGetUid(UidBuffer); @@ -114,8 +114,8 @@ CommandStatusIdType CommandSetReadOnly(char* OutMessage, const char* InParam) ActiveConfiguration.ReadOnly = false; return COMMAND_INFO_OK_ID; } else if (InParam[0] == COMMAND_CHAR_SUGGEST) { - snprintf_P(OutMessage, TERMINAL_BUFFER_SIZE, PSTR("%c,%c"), COMMAND_CHAR_TRUE, COMMAND_CHAR_FALSE); - return COMMAND_INFO_OK_WITH_TEXT_ID; + snprintf_P(OutMessage, TERMINAL_BUFFER_SIZE, PSTR("%c,%c"), COMMAND_CHAR_TRUE, COMMAND_CHAR_FALSE); + return COMMAND_INFO_OK_WITH_TEXT_ID; } } @@ -179,12 +179,12 @@ CommandStatusIdType CommandGetRButton(char* OutParam) CommandStatusIdType CommandSetRButton(char* OutMessage, const char* InParam) { - if (COMMAND_IS_SUGGEST_STRING(InParam)) { - /* Get suggestion list */ - ButtonGetActionList(OutMessage, TERMINAL_BUFFER_SIZE); - return COMMAND_INFO_OK_WITH_TEXT_ID; - } else if (ButtonSetActionByName(BUTTON_R_PRESS_SHORT, InParam)) { - /* Try to set action name */ + if (COMMAND_IS_SUGGEST_STRING(InParam)) { + /* Get suggestion list */ + ButtonGetActionList(OutMessage, TERMINAL_BUFFER_SIZE); + return COMMAND_INFO_OK_WITH_TEXT_ID; + } else if (ButtonSetActionByName(BUTTON_R_PRESS_SHORT, InParam)) { + /* Try to set action name */ SettingsSave(); return COMMAND_INFO_OK_ID; } else { @@ -201,12 +201,12 @@ CommandStatusIdType CommandGetRButtonLong(char* OutParam) CommandStatusIdType CommandSetRButtonLong(char* OutMessage, const char* InParam) { - if (COMMAND_IS_SUGGEST_STRING(InParam)) { - /* Get suggestion list */ - ButtonGetActionList(OutMessage, TERMINAL_BUFFER_SIZE); - return COMMAND_INFO_OK_WITH_TEXT_ID; - } else if (ButtonSetActionByName(BUTTON_R_PRESS_LONG, InParam)) { - /* Try to set action name */ + if (COMMAND_IS_SUGGEST_STRING(InParam)) { + /* Get suggestion list */ + ButtonGetActionList(OutMessage, TERMINAL_BUFFER_SIZE); + return COMMAND_INFO_OK_WITH_TEXT_ID; + } else if (ButtonSetActionByName(BUTTON_R_PRESS_LONG, InParam)) { + /* Try to set action name */ SettingsSave(); return COMMAND_INFO_OK_ID; } else { @@ -223,12 +223,12 @@ CommandStatusIdType CommandGetLButton(char* OutParam) CommandStatusIdType CommandSetLButton(char* OutMessage, const char* InParam) { - if (COMMAND_IS_SUGGEST_STRING(InParam)) { - /* Get suggestion list */ - ButtonGetActionList(OutMessage, TERMINAL_BUFFER_SIZE); - return COMMAND_INFO_OK_WITH_TEXT_ID; - } else if (ButtonSetActionByName(BUTTON_L_PRESS_SHORT, InParam)) { - /* Try to set action name */ + if (COMMAND_IS_SUGGEST_STRING(InParam)) { + /* Get suggestion list */ + ButtonGetActionList(OutMessage, TERMINAL_BUFFER_SIZE); + return COMMAND_INFO_OK_WITH_TEXT_ID; + } else if (ButtonSetActionByName(BUTTON_L_PRESS_SHORT, InParam)) { + /* Try to set action name */ SettingsSave(); return COMMAND_INFO_OK_ID; } else { @@ -245,12 +245,12 @@ CommandStatusIdType CommandGetLButtonLong(char* OutParam) CommandStatusIdType CommandSetLButtonLong(char* OutMessage, const char* InParam) { - if (COMMAND_IS_SUGGEST_STRING(InParam)) { - /* Get suggestion list */ - ButtonGetActionList(OutMessage, TERMINAL_BUFFER_SIZE); - return COMMAND_INFO_OK_WITH_TEXT_ID; - } else if (ButtonSetActionByName(BUTTON_L_PRESS_LONG, InParam)) { - /* Try to set action name */ + if (COMMAND_IS_SUGGEST_STRING(InParam)) { + /* Get suggestion list */ + ButtonGetActionList(OutMessage, TERMINAL_BUFFER_SIZE); + return COMMAND_INFO_OK_WITH_TEXT_ID; + } else if (ButtonSetActionByName(BUTTON_L_PRESS_LONG, InParam)) { + /* Try to set action name */ SettingsSave(); return COMMAND_INFO_OK_ID; } else { @@ -260,42 +260,42 @@ CommandStatusIdType CommandSetLButtonLong(char* OutMessage, const char* InParam) CommandStatusIdType CommandGetLedGreen(char* OutParam) { - LEDGetFuncByName(LED_GREEN, OutParam, TERMINAL_BUFFER_SIZE); + LEDGetFuncByName(LED_GREEN, OutParam, TERMINAL_BUFFER_SIZE); - return COMMAND_INFO_OK_WITH_TEXT_ID; + return COMMAND_INFO_OK_WITH_TEXT_ID; } CommandStatusIdType CommandSetLedGreen(char* OutMessage, const char* InParam) { - if (COMMAND_IS_SUGGEST_STRING(InParam)) { - LEDGetFuncList(OutMessage, TERMINAL_BUFFER_SIZE); - return COMMAND_INFO_OK_WITH_TEXT_ID; - } else if (LEDSetFuncByName(LED_GREEN, InParam)) { - SettingsSave(); - return COMMAND_INFO_OK_ID; - } else { - return COMMAND_ERR_INVALID_PARAM_ID; - } + if (COMMAND_IS_SUGGEST_STRING(InParam)) { + LEDGetFuncList(OutMessage, TERMINAL_BUFFER_SIZE); + return COMMAND_INFO_OK_WITH_TEXT_ID; + } else if (LEDSetFuncByName(LED_GREEN, InParam)) { + SettingsSave(); + return COMMAND_INFO_OK_ID; + } else { + return COMMAND_ERR_INVALID_PARAM_ID; + } } CommandStatusIdType CommandGetLedRed(char* OutParam) { - LEDGetFuncByName(LED_RED, OutParam, TERMINAL_BUFFER_SIZE); + LEDGetFuncByName(LED_RED, OutParam, TERMINAL_BUFFER_SIZE); - return COMMAND_INFO_OK_WITH_TEXT_ID; + return COMMAND_INFO_OK_WITH_TEXT_ID; } CommandStatusIdType CommandSetLedRed(char* OutMessage, const char* InParam) { - if (COMMAND_IS_SUGGEST_STRING(InParam)) { - LEDGetFuncList(OutMessage, TERMINAL_BUFFER_SIZE); - return COMMAND_INFO_OK_WITH_TEXT_ID; - } else if (LEDSetFuncByName(LED_RED, InParam)) { - SettingsSave(); - return COMMAND_INFO_OK_ID; - } else { - return COMMAND_ERR_INVALID_PARAM_ID; - } + if (COMMAND_IS_SUGGEST_STRING(InParam)) { + LEDGetFuncList(OutMessage, TERMINAL_BUFFER_SIZE); + return COMMAND_INFO_OK_WITH_TEXT_ID; + } else if (LEDSetFuncByName(LED_RED, InParam)) { + SettingsSave(); + return COMMAND_INFO_OK_ID; + } else { + return COMMAND_ERR_INVALID_PARAM_ID; + } } CommandStatusIdType CommandGetLogMode(char* OutParam) @@ -308,10 +308,10 @@ CommandStatusIdType CommandGetLogMode(char* OutParam) CommandStatusIdType CommandSetLogMode(char* OutMessage, const char* InParam) { - if (COMMAND_IS_SUGGEST_STRING(InParam)) { - LogGetModeList(OutMessage, TERMINAL_BUFFER_SIZE); - return COMMAND_INFO_OK_WITH_TEXT_ID; - } else if (LogSetModeByName(InParam)) { + if (COMMAND_IS_SUGGEST_STRING(InParam)) { + LogGetModeList(OutMessage, TERMINAL_BUFFER_SIZE); + return COMMAND_INFO_OK_WITH_TEXT_ID; + } else if (LogSetModeByName(InParam)) { SettingsSave(); return COMMAND_INFO_OK_ID; } else { @@ -321,7 +321,7 @@ CommandStatusIdType CommandSetLogMode(char* OutMessage, const char* InParam) CommandStatusIdType CommandGetLogMem(char* OutParam) { - uint16_t free = LogMemFree(); + uint16_t free = LogMemFree(); snprintf_P(OutParam, TERMINAL_BUFFER_SIZE, PSTR("%u (from which %u non-volatile)"), free, (free <= LOG_SIZE) ? 0 : (free - LOG_SIZE)); @@ -338,8 +338,8 @@ CommandStatusIdType CommandExecLogDownload(char* OutMessage) CommandStatusIdType CommandExecStoreLog(char* OutMessage) { - LogSRAMToFRAM(); - return COMMAND_INFO_OK_ID; + LogSRAMToFRAM(); + return COMMAND_INFO_OK_ID; } CommandStatusIdType CommandExecLogClear(char* OutMessage) @@ -350,44 +350,44 @@ CommandStatusIdType CommandExecLogClear(char* OutMessage) CommandStatusIdType CommandGetSetting(char* OutParam) { - SettingsGetActiveByName(OutParam, TERMINAL_BUFFER_SIZE); - return COMMAND_INFO_OK_WITH_TEXT_ID; + SettingsGetActiveByName(OutParam, TERMINAL_BUFFER_SIZE); + return COMMAND_INFO_OK_WITH_TEXT_ID; } CommandStatusIdType CommandSetSetting(char* OutMessage, const char* InParam) { - if (SettingsSetActiveByName(InParam)) { - return COMMAND_INFO_OK_ID; - } else { - return COMMAND_ERR_INVALID_PARAM_ID; - } + if (SettingsSetActiveByName(InParam)) { + return COMMAND_INFO_OK_ID; + } else { + return COMMAND_ERR_INVALID_PARAM_ID; + } } CommandStatusIdType CommandExecClear(char* OutMessage) { - MemoryClear(); - return COMMAND_INFO_OK_ID; + MemoryClear(); + return COMMAND_INFO_OK_ID; } CommandStatusIdType CommandExecStore(char* OutMessage) { - MemoryStore(); - return COMMAND_INFO_OK_ID; + MemoryStore(); + return COMMAND_INFO_OK_ID; } CommandStatusIdType CommandExecRecall(char* OutMessage) { - MemoryRecall(); - return COMMAND_INFO_OK_ID; + MemoryRecall(); + return COMMAND_INFO_OK_ID; } CommandStatusIdType CommandGetCharging(char* OutMessage) { - if (BatteryIsCharging()) { - return COMMAND_INFO_TRUE_ID; - } else { - return COMMAND_INFO_FALSE_ID; - } + if (BatteryIsCharging()) { + return COMMAND_INFO_TRUE_ID; + } else { + return COMMAND_INFO_FALSE_ID; + } } CommandStatusIdType CommandExecHelp(char* OutMessage) @@ -426,202 +426,202 @@ CommandStatusIdType CommandGetRssi(char* OutParam) CommandStatusIdType CommandGetSysTick(char* OutParam) { - snprintf_P(OutParam, TERMINAL_BUFFER_SIZE, PSTR("%4.4X"), SystemGetSysTick()); + snprintf_P(OutParam, TERMINAL_BUFFER_SIZE, PSTR("%4.4X"), SystemGetSysTick()); - return COMMAND_INFO_OK_WITH_TEXT_ID; + return COMMAND_INFO_OK_WITH_TEXT_ID; } CommandStatusIdType CommandExecParamSend(char* OutMessage, const char* InParams) { - if (GlobalSettings.ActiveSettingPtr->Configuration != CONFIG_ISO14443A_READER) - return COMMAND_ERR_INVALID_USAGE_ID; + if (GlobalSettings.ActiveSettingPtr->Configuration != CONFIG_ISO14443A_READER) + return COMMAND_ERR_INVALID_USAGE_ID; - ApplicationReset(); - Reader14443CurrentCommand = Reader14443_Send; + ApplicationReset(); + Reader14443CurrentCommand = Reader14443_Send; - char const * paramTwo = strchr(InParams, ' '); - uint16_t length; - if (paramTwo == NULL) // this means, we have to calculate the length - { - length = strlen(InParams); - if (length&1) // return error when length is odd - return COMMAND_ERR_INVALID_PARAM_ID; - length /= 2; - if (length == 1) - { - ReaderSendBitCount = 7; // this is a short frame - } else { - ReaderSendBitCount = length * 8; - } - } else if(paramTwo == (InParams+4)) { // we have a bitcount prepended - uint8_t tmp[2]; - HexStringToBuffer(tmp, 2, InParams); - ReaderSendBitCount = (tmp[0]<<8) + tmp[1]; // set our BitCount to the given value - InParams = ++paramTwo; // set InParams to the beginning of the second parameter - length = strlen(InParams); - if ((length&1) || (length / 2 * 8) < ReaderSendBitCount) // this parameter is malformed, if it is odd or if there are less bits than the BitCount indicates - return COMMAND_ERR_INVALID_PARAM_ID; - } else { // any other case means we have malformed parameters - return COMMAND_ERR_INVALID_PARAM_ID; - } + char const * paramTwo = strchr(InParams, ' '); + uint16_t length; + if (paramTwo == NULL) // this means, we have to calculate the length + { + length = strlen(InParams); + if (length&1) // return error when length is odd + return COMMAND_ERR_INVALID_PARAM_ID; + length /= 2; + if (length == 1) + { + ReaderSendBitCount = 7; // this is a short frame + } else { + ReaderSendBitCount = length * 8; + } + } else if(paramTwo == (InParams+4)) { // we have a bitcount prepended + uint8_t tmp[2]; + HexStringToBuffer(tmp, 2, InParams); + ReaderSendBitCount = (tmp[0]<<8) + tmp[1]; // set our BitCount to the given value + InParams = ++paramTwo; // set InParams to the beginning of the second parameter + length = strlen(InParams); + if ((length&1) || (length / 2 * 8) < ReaderSendBitCount) // this parameter is malformed, if it is odd or if there are less bits than the BitCount indicates + return COMMAND_ERR_INVALID_PARAM_ID; + } else { // any other case means we have malformed parameters + return COMMAND_ERR_INVALID_PARAM_ID; + } - HexStringToBuffer(ReaderSendBuffer, (ReaderSendBitCount+7)/8, InParams); + HexStringToBuffer(ReaderSendBuffer, (ReaderSendBitCount+7)/8, InParams); - Reader14443ACodecStart(); + Reader14443ACodecStart(); - return TIMEOUT_COMMAND; + return TIMEOUT_COMMAND; } CommandStatusIdType CommandExecParamSendRaw(char* OutMessage, const char* InParams) { - if (GlobalSettings.ActiveSettingPtr->Configuration != CONFIG_ISO14443A_READER) - return COMMAND_ERR_INVALID_USAGE_ID; + if (GlobalSettings.ActiveSettingPtr->Configuration != CONFIG_ISO14443A_READER) + return COMMAND_ERR_INVALID_USAGE_ID; - ApplicationReset(); - Reader14443CurrentCommand = Reader14443_Send_Raw; + ApplicationReset(); + Reader14443CurrentCommand = Reader14443_Send_Raw; - char const * paramTwo = strchr(InParams, ' '); - uint16_t length; - if (paramTwo == NULL) // this means, we have to calculate the length - { - length = strlen(InParams); - if (length&1) // return error when length is odd - return COMMAND_ERR_INVALID_PARAM_ID; - length /= 2; - if (length == 1) - { - ReaderSendBitCount = 7; // this is a short frame - } else { - length *= 8; - ReaderSendBitCount = length - (length % 9); // how many bytes+paritybit match into our input? - } - } else if(paramTwo == (InParams+4)) { // we have a bitcount prepended - uint8_t tmp[2]; - HexStringToBuffer(tmp, 2, InParams); - ReaderSendBitCount = (tmp[0]<<8) + tmp[1]; // set our BitCount to the given value - if (ReaderSendBitCount != 7 && (ReaderSendBitCount % 8)) // since we have to add parity bits here (in case this is not a short frame), the number of bits to be sent has to be a multiple of 8 - return COMMAND_ERR_INVALID_PARAM_ID; - InParams = ++paramTwo; // set InParams to the beginning of the second parameter - length = strlen(InParams); - if ((length&1) || (length / 2 * 8) < ReaderSendBitCount) // this parameter is malformed, if it is odd or if there are less bits than the BitCount indicates - return COMMAND_ERR_INVALID_PARAM_ID; - } else { // any other case means we have malformed parameters - return COMMAND_ERR_INVALID_PARAM_ID; - } + char const * paramTwo = strchr(InParams, ' '); + uint16_t length; + if (paramTwo == NULL) // this means, we have to calculate the length + { + length = strlen(InParams); + if (length&1) // return error when length is odd + return COMMAND_ERR_INVALID_PARAM_ID; + length /= 2; + if (length == 1) + { + ReaderSendBitCount = 7; // this is a short frame + } else { + length *= 8; + ReaderSendBitCount = length - (length % 9); // how many bytes+paritybit match into our input? + } + } else if(paramTwo == (InParams+4)) { // we have a bitcount prepended + uint8_t tmp[2]; + HexStringToBuffer(tmp, 2, InParams); + ReaderSendBitCount = (tmp[0]<<8) + tmp[1]; // set our BitCount to the given value + if (ReaderSendBitCount != 7 && (ReaderSendBitCount % 8)) // since we have to add parity bits here (in case this is not a short frame), the number of bits to be sent has to be a multiple of 8 + return COMMAND_ERR_INVALID_PARAM_ID; + InParams = ++paramTwo; // set InParams to the beginning of the second parameter + length = strlen(InParams); + if ((length&1) || (length / 2 * 8) < ReaderSendBitCount) // this parameter is malformed, if it is odd or if there are less bits than the BitCount indicates + return COMMAND_ERR_INVALID_PARAM_ID; + } else { // any other case means we have malformed parameters + return COMMAND_ERR_INVALID_PARAM_ID; + } - HexStringToBuffer(ReaderSendBuffer, (ReaderSendBitCount+7)/8, InParams); + HexStringToBuffer(ReaderSendBuffer, (ReaderSendBitCount+7)/8, InParams); - Reader14443ACodecStart(); + Reader14443ACodecStart(); - return TIMEOUT_COMMAND; + return TIMEOUT_COMMAND; } CommandStatusIdType CommandExecDumpMFU(char* OutMessage) { - if (GlobalSettings.ActiveSettingPtr->Configuration != CONFIG_ISO14443A_READER) - return COMMAND_ERR_INVALID_USAGE_ID; - ApplicationReset(); + if (GlobalSettings.ActiveSettingPtr->Configuration != CONFIG_ISO14443A_READER) + return COMMAND_ERR_INVALID_USAGE_ID; + ApplicationReset(); - Reader14443CurrentCommand = Reader14443_Read_MF_Ultralight; - Reader14443AAppInit(); - Reader14443ACodecStart(); - CommandLinePendingTaskTimeout = &Reader14443AAppTimeout; - return TIMEOUT_COMMAND; + Reader14443CurrentCommand = Reader14443_Read_MF_Ultralight; + Reader14443AAppInit(); + Reader14443ACodecStart(); + CommandLinePendingTaskTimeout = &Reader14443AAppTimeout; + return TIMEOUT_COMMAND; } CommandStatusIdType CommandExecGetUid(char* OutMessage) // this function is for reading the uid in reader mode { - if (GlobalSettings.ActiveSettingPtr->Configuration != CONFIG_ISO14443A_READER) - return COMMAND_ERR_INVALID_USAGE_ID; - ApplicationReset(); + if (GlobalSettings.ActiveSettingPtr->Configuration != CONFIG_ISO14443A_READER) + return COMMAND_ERR_INVALID_USAGE_ID; + ApplicationReset(); - Reader14443CurrentCommand = Reader14443_Get_UID; - Reader14443AAppInit(); - Reader14443ACodecStart(); - CommandLinePendingTaskTimeout = &Reader14443AAppTimeout; - return TIMEOUT_COMMAND; + Reader14443CurrentCommand = Reader14443_Get_UID; + Reader14443AAppInit(); + Reader14443ACodecStart(); + CommandLinePendingTaskTimeout = &Reader14443AAppTimeout; + return TIMEOUT_COMMAND; } CommandStatusIdType CommandExecIdentifyCard(char* OutMessage) { - if (GlobalSettings.ActiveSettingPtr->Configuration != CONFIG_ISO14443A_READER) - return COMMAND_ERR_INVALID_USAGE_ID; - ApplicationReset(); + if (GlobalSettings.ActiveSettingPtr->Configuration != CONFIG_ISO14443A_READER) + return COMMAND_ERR_INVALID_USAGE_ID; + ApplicationReset(); - Reader14443CurrentCommand = Reader14443_Identify; - Reader14443AAppInit(); - Reader14443ACodecStart(); - CommandLinePendingTaskTimeout = &Reader14443AAppTimeout; - return TIMEOUT_COMMAND; + Reader14443CurrentCommand = Reader14443_Identify; + Reader14443AAppInit(); + Reader14443ACodecStart(); + CommandLinePendingTaskTimeout = &Reader14443AAppTimeout; + return TIMEOUT_COMMAND; } CommandStatusIdType CommandGetTimeout(char* OutParam) { - snprintf_P(OutParam, TERMINAL_BUFFER_SIZE, PSTR("%u ms"), GlobalSettings.ActiveSettingPtr->PendingTaskTimeout * 100); - return COMMAND_INFO_OK_WITH_TEXT_ID; + snprintf_P(OutParam, TERMINAL_BUFFER_SIZE, PSTR("%u ms"), GlobalSettings.ActiveSettingPtr->PendingTaskTimeout * 100); + return COMMAND_INFO_OK_WITH_TEXT_ID; } CommandStatusIdType CommandSetTimeout(char* OutMessage, const char* InParam) { - if (COMMAND_IS_SUGGEST_STRING(InParam)) - { - snprintf_P(OutMessage, TERMINAL_BUFFER_SIZE, PSTR("0 = no timeout\r\n1-600 = 100 ms - 60000 ms timeout")); - return COMMAND_INFO_OK_WITH_TEXT_ID; - } - uint16_t tmp = 601; - if (!sscanf_P(InParam, PSTR("%5d"), &tmp) || tmp > 600) - return COMMAND_ERR_INVALID_PARAM_ID; - GlobalSettings.ActiveSettingPtr->PendingTaskTimeout = tmp; - return COMMAND_INFO_OK_ID; + if (COMMAND_IS_SUGGEST_STRING(InParam)) + { + snprintf_P(OutMessage, TERMINAL_BUFFER_SIZE, PSTR("0 = no timeout\r\n1-600 = 100 ms - 60000 ms timeout")); + return COMMAND_INFO_OK_WITH_TEXT_ID; + } + uint16_t tmp = 601; + if (!sscanf_P(InParam, PSTR("%5d"), &tmp) || tmp > 600) + return COMMAND_ERR_INVALID_PARAM_ID; + GlobalSettings.ActiveSettingPtr->PendingTaskTimeout = tmp; + return COMMAND_INFO_OK_ID; } CommandStatusIdType CommandGetThreshold(char* OutParam) { - snprintf_P(OutParam, TERMINAL_BUFFER_SIZE, PSTR("%u"), ReaderThreshold); - return COMMAND_INFO_OK_WITH_TEXT_ID; + snprintf_P(OutParam, TERMINAL_BUFFER_SIZE, PSTR("%u"), ReaderThreshold); + return COMMAND_INFO_OK_WITH_TEXT_ID; } CommandStatusIdType CommandSetThreshold(char* OutMessage, const char* InParam) { - if (COMMAND_IS_SUGGEST_STRING(InParam)) - { - snprintf_P(OutMessage, TERMINAL_BUFFER_SIZE, PSTR("Any integer from 0 to %u. Reference voltage will be (VCC * THRESHOLD / 4095) mV."), CODEC_MAXIMUM_THRESHOLD); - return COMMAND_INFO_OK_WITH_TEXT_ID; - } - uint16_t tmp = 0; - if (!sscanf_P(InParam, PSTR("%5d"), &tmp) || tmp > CODEC_MAXIMUM_THRESHOLD) - return COMMAND_ERR_INVALID_PARAM_ID; - DACB.CH0DATA = tmp; - ReaderThreshold = tmp; - return COMMAND_INFO_OK_ID; + if (COMMAND_IS_SUGGEST_STRING(InParam)) + { + snprintf_P(OutMessage, TERMINAL_BUFFER_SIZE, PSTR("Any integer from 0 to %u. Reference voltage will be (VCC * THRESHOLD / 4095) mV."), CODEC_MAXIMUM_THRESHOLD); + return COMMAND_INFO_OK_WITH_TEXT_ID; + } + uint16_t tmp = 0; + if (!sscanf_P(InParam, PSTR("%5d"), &tmp) || tmp > CODEC_MAXIMUM_THRESHOLD) + return COMMAND_ERR_INVALID_PARAM_ID; + DACB.CH0DATA = tmp; + ReaderThreshold = tmp; + return COMMAND_INFO_OK_ID; } CommandStatusIdType CommandSetField(char* OutMessage, const char* InParam) { - if (COMMAND_IS_SUGGEST_STRING(InParam)) - { - snprintf_P(OutMessage, TERMINAL_BUFFER_SIZE, PSTR("%c,%c"), COMMAND_CHAR_TRUE, COMMAND_CHAR_FALSE); - return COMMAND_INFO_OK_WITH_TEXT_ID; - } - if (InParam[0] == COMMAND_CHAR_TRUE) - { - CodecReaderFieldStart(); - } else if(InParam[0] == COMMAND_CHAR_FALSE) { - CodecReaderFieldStop(); - } else { - return COMMAND_ERR_INVALID_PARAM_ID; - } - return COMMAND_INFO_OK_ID; + if (COMMAND_IS_SUGGEST_STRING(InParam)) + { + snprintf_P(OutMessage, TERMINAL_BUFFER_SIZE, PSTR("%c,%c"), COMMAND_CHAR_TRUE, COMMAND_CHAR_FALSE); + return COMMAND_INFO_OK_WITH_TEXT_ID; + } + if (InParam[0] == COMMAND_CHAR_TRUE) + { + CodecReaderFieldStart(); + } else if(InParam[0] == COMMAND_CHAR_FALSE) { + CodecReaderFieldStop(); + } else { + return COMMAND_ERR_INVALID_PARAM_ID; + } + return COMMAND_INFO_OK_ID; } CommandStatusIdType CommandGetField(char* OutMessage) { - if (CodecGetReaderField()) - OutMessage[0] = COMMAND_CHAR_TRUE; - else - OutMessage[0] = COMMAND_CHAR_FALSE; - OutMessage[1] = '\0'; - return COMMAND_INFO_OK_WITH_TEXT_ID; + if (CodecGetReaderField()) + OutMessage[0] = COMMAND_CHAR_TRUE; + else + OutMessage[0] = COMMAND_CHAR_FALSE; + OutMessage[1] = '\0'; + return COMMAND_INFO_OK_WITH_TEXT_ID; } diff --git a/Firmware/Chameleon-Mini/Terminal/Terminal.c b/Firmware/Chameleon-Mini/Terminal/Terminal.c index 9b77998..dfb15ca 100644 --- a/Firmware/Chameleon-Mini/Terminal/Terminal.c +++ b/Firmware/Chameleon-Mini/Terminal/Terminal.c @@ -32,7 +32,7 @@ TerminalStateEnum TerminalState = TERMINAL_UNINITIALIZED; static uint8_t TerminalInitDelay = INIT_DELAY; void TerminalSendString(const char* s) { - CDC_Device_SendString(&TerminalHandle, s); + CDC_Device_SendString(&TerminalHandle, s); } void TerminalSendStringP(const char* s) { @@ -67,7 +67,7 @@ static void ProcessByte(void) { if (Byte >= 0) { /* Byte received */ - LEDHook(LED_TERMINAL_RXTX, LED_PULSE); + LEDHook(LED_TERMINAL_RXTX, LED_PULSE); if (XModemProcessByte(Byte)) { /* XModem handled the byte */ @@ -81,39 +81,39 @@ static void SenseVBus(void) { switch(TerminalState) { case TERMINAL_UNINITIALIZED: - if (TERMINAL_VBUS_PORT.IN & TERMINAL_VBUS_MASK) { - /* Not initialized and VBUS sense high */ - TerminalInitDelay = INIT_DELAY; - TerminalState = TERMINAL_INITIALIZING; - } + if (TERMINAL_VBUS_PORT.IN & TERMINAL_VBUS_MASK) { + /* Not initialized and VBUS sense high */ + TerminalInitDelay = INIT_DELAY; + TerminalState = TERMINAL_INITIALIZING; + } break; case TERMINAL_INITIALIZING: - if (--TerminalInitDelay == 0) { + if (--TerminalInitDelay == 0) { SystemStartUSBClock(); USB_Init(); TerminalState = TERMINAL_INITIALIZED; - } - break; + } + break; case TERMINAL_INITIALIZED: - if (!(TERMINAL_VBUS_PORT.IN & TERMINAL_VBUS_MASK)) { - /* Initialized and VBUS sense low */ - TerminalInitDelay = INIT_DELAY; - TerminalState = TERMINAL_UNITIALIZING; - } - break; + if (!(TERMINAL_VBUS_PORT.IN & TERMINAL_VBUS_MASK)) { + /* Initialized and VBUS sense low */ + TerminalInitDelay = INIT_DELAY; + TerminalState = TERMINAL_UNITIALIZING; + } + break; case TERMINAL_UNITIALIZING: - if (--TerminalInitDelay == 0) { - USB_Disable(); - SystemStopUSBClock(); - TerminalState = TERMINAL_UNINITIALIZED; - } - break; + if (--TerminalInitDelay == 0) { + USB_Disable(); + SystemStopUSBClock(); + TerminalState = TERMINAL_UNINITIALIZED; + } + break; default: - break; + break; } } @@ -124,34 +124,34 @@ void TerminalInit(void) void TerminalTask(void) { - if (TerminalState == TERMINAL_INITIALIZED) { - CDC_Device_USBTask(&TerminalHandle); - USB_USBTask(); + if (TerminalState == TERMINAL_INITIALIZED) { + CDC_Device_USBTask(&TerminalHandle); + USB_USBTask(); - ProcessByte(); - } + ProcessByte(); + } } void TerminalTick(void) { - SenseVBus(); + SenseVBus(); - if (TerminalState == TERMINAL_INITIALIZED) { - XModemTick(); - CommandLineTick(); - } + if (TerminalState == TERMINAL_INITIALIZED) { + XModemTick(); + CommandLineTick(); + } } /** Event handler for the library USB Connection event. */ void EVENT_USB_Device_Connect(void) { - LEDHook(LED_TERMINAL_CONN, LED_ON); + LEDHook(LED_TERMINAL_CONN, LED_ON); } /** Event handler for the library USB Disconnection event. */ void EVENT_USB_Device_Disconnect(void) { - LEDHook(LED_TERMINAL_CONN, LED_OFF); + LEDHook(LED_TERMINAL_CONN, LED_OFF); } diff --git a/Firmware/Chameleon-Mini/Terminal/Terminal.h b/Firmware/Chameleon-Mini/Terminal/Terminal.h index 47e4069..06194a5 100644 --- a/Firmware/Chameleon-Mini/Terminal/Terminal.h +++ b/Firmware/Chameleon-Mini/Terminal/Terminal.h @@ -19,10 +19,10 @@ #define TERMINAL_BUFFER_SIZE 512 typedef enum { - TERMINAL_UNINITIALIZED, - TERMINAL_INITIALIZING, - TERMINAL_INITIALIZED, - TERMINAL_UNITIALIZING + TERMINAL_UNINITIALIZED, + TERMINAL_INITIALIZING, + TERMINAL_INITIALIZED, + TERMINAL_UNITIALIZING } TerminalStateEnum; extern uint8_t TerminalBuffer[TERMINAL_BUFFER_SIZE]; diff --git a/Firmware/Chameleon-Mini/Terminal/XModem.c b/Firmware/Chameleon-Mini/Terminal/XModem.c index 6ea379f..8881525 100644 --- a/Firmware/Chameleon-Mini/Terminal/XModem.c +++ b/Firmware/Chameleon-Mini/Terminal/XModem.c @@ -165,7 +165,7 @@ bool XModemProcessByte(uint8_t Byte) CurrentFrameNumber = FIRST_FRAME_NUMBER - 1; Byte = BYTE_ACK; } else if (Byte == BYTE_ESC) { - State = STATE_OFF; + State = STATE_OFF; } /* Fallthrough */ From 4427ae12770972cd5965b247664f28386c66e051 Mon Sep 17 00:00:00 2001 From: Georg Date: Tue, 7 Nov 2017 16:16:26 +0100 Subject: [PATCH 035/104] fixed bug in sram to fram function for log --- Firmware/Chameleon-Mini/Log.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/Firmware/Chameleon-Mini/Log.c b/Firmware/Chameleon-Mini/Log.c index facb0a1..8a5a68e 100644 --- a/Firmware/Chameleon-Mini/Log.c +++ b/Firmware/Chameleon-Mini/Log.c @@ -224,12 +224,23 @@ void LogSRAMToFRAM(void) { if (LogMemLeft < LOG_SIZE) { - if (FRAM_LOG_SIZE - (LogFRAMAddr - FRAM_LOG_START_ADDR) >= LOG_SIZE - LogMemLeft) + uint16_t FRAM_Free = FRAM_LOG_SIZE - (LogFRAMAddr - FRAM_LOG_START_ADDR); + + if (FRAM_Free >= LOG_SIZE - LogMemLeft) { MemoryWriteBlock(LogMem, LogFRAMAddr, LOG_SIZE - LogMemLeft); LogFRAMAddr += LOG_SIZE - LogMemLeft; LogSRAMClear(); MemoryWriteBlock(&LogFRAMAddr, FRAM_LOG_ADDR_ADDR, 2); + } else if (FRAM_Free > 0) { + // not everything fits in FRAM, simply write as much as possible to FRAM + MemoryWriteBlock(LogMem, LogFRAMAddr, FRAM_Free); + memmove(LogMem, LogMem + FRAM_Free, LOG_SIZE - FRAM_Free); // FRAM_Free is < LOG_SIZE - LogMemLeft and thus also < LOG_SIZE + + LogMemPtr -= FRAM_Free; + LogMemLeft += FRAM_Free; + LogFRAMAddr += FRAM_Free; + MemoryWriteBlock(&LogFRAMAddr, FRAM_LOG_ADDR_ADDR, 2); } else { // TODO handle the case in which the FRAM is full } From 33f35254973dc6fc4db7dc3f26ea211859f05a8c Mon Sep 17 00:00:00 2001 From: Georg Date: Tue, 7 Nov 2017 16:27:26 +0100 Subject: [PATCH 036/104] removed removeSOC function (not needed anymore) --- .../Chameleon-Mini/Application/Reader14443A.c | 26 ++----------------- .../Chameleon-Mini/Codec/Reader14443-2A.c | 4 +-- 2 files changed, 4 insertions(+), 26 deletions(-) diff --git a/Firmware/Chameleon-Mini/Application/Reader14443A.c b/Firmware/Chameleon-Mini/Application/Reader14443A.c index 28bbe73..7c0aa9e 100644 --- a/Firmware/Chameleon-Mini/Application/Reader14443A.c +++ b/Firmware/Chameleon-Mini/Application/Reader14443A.c @@ -142,20 +142,6 @@ uint16_t removeParityBits(uint8_t * Buffer, uint16_t BitCount) return BitCount/9*8; } -uint16_t removeSOC(uint8_t * Buffer, uint16_t BitCount) -{ - if (BitCount == 0) - return 0; - uint16_t i; - Buffer[0] >>= 1; - for (i = 1; i < (BitCount + 7) / 8; i++) - { - Buffer[i-1] |= Buffer[i] << 7; - Buffer[i] >>= 1; - } - return BitCount - 1; -} - bool checkParityBits(uint8_t * Buffer, uint16_t BitCount) { if (BitCount == 7) @@ -239,13 +225,12 @@ INLINE uint16_t Reader14443A_Select(uint8_t * Buffer, uint16_t BitCount) return 7; case STATE_READY: - if (BitCount < 19) + if (BitCount < 18) { ReaderState = STATE_IDLE; Reader14443ACodecStart(); return 0; } - BitCount = removeSOC(Buffer, BitCount); if (!checkParityBits(Buffer, BitCount)) { ReaderState = STATE_IDLE; @@ -261,7 +246,6 @@ INLINE uint16_t Reader14443A_Select(uint8_t * Buffer, uint16_t BitCount) return addParityBits(Buffer, 16); case STATE_ACTIVE_CL1 ... STATE_ACTIVE_CL3: - BitCount = removeSOC(Buffer, BitCount); if (!checkParityBits(Buffer, BitCount) || BitCount < 8) { ReaderState = STATE_IDLE; @@ -294,13 +278,12 @@ INLINE uint16_t Reader14443A_Select(uint8_t * Buffer, uint16_t BitCount) return addParityBits(Buffer, 72); case STATE_SAK_CL1 ... STATE_SAK_CL3: - if (BitCount < 9) + if (BitCount < 27) { ReaderState = STATE_IDLE; Reader14443ACodecStart(); return 0; } - BitCount = removeSOC(Buffer, BitCount); if (!checkParityBits(Buffer, BitCount)) { LogEntry(LOG_ERR_APP_CHECKSUM_FAIL, Buffer, (BitCount + 8) / 7); @@ -337,7 +320,6 @@ INLINE uint16_t Reader14443A_Select(uint8_t * Buffer, uint16_t BitCount) Reader14443ACodecStart(); return 0; } - BitCount = removeSOC(Buffer, BitCount); if (!checkParityBits(Buffer, BitCount)) { LogEntry(LOG_ERR_APP_CHECKSUM_FAIL, Buffer, (BitCount + 8) / 7); @@ -402,7 +384,6 @@ uint16_t Reader14443AAppProcess(uint8_t* Buffer, uint16_t BitCount) return 0; } char tmpBuf[128]; - BitCount = removeSOC(Buffer, BitCount); bool parity = checkParityBits(Buffer, BitCount); BitCount = removeParityBits(Buffer, BitCount); if ((2 * (BitCount + 7) / 8 + 2 + 4) > 128) // 2 = \r\n, 4 = size of bitcount in hex @@ -564,7 +545,6 @@ uint16_t Reader14443AAppProcess(uint8_t* Buffer, uint16_t BitCount) { if (MFURead_CurrentAdress != 0) { - BitCount = removeSOC(Buffer, BitCount); if (BitCount == 0) // relaunch select protocol { MFURead_CurrentAdress = 0; // reset read address @@ -658,7 +638,6 @@ uint16_t Reader14443AAppProcess(uint8_t* Buffer, uint16_t BitCount) // if we don't have to send the RATS, we are finished for distinguishing with ISO 14443A } else if (ReaderState == STATE_ATS) { // we have got the ATS - BitCount = removeSOC(Buffer, BitCount); if (!checkParityBits(Buffer, BitCount)) { LogEntry(LOG_ERR_APP_CHECKSUM_FAIL, Buffer, (BitCount + 8) / 7); @@ -726,7 +705,6 @@ uint16_t Reader14443AAppProcess(uint8_t* Buffer, uint16_t BitCount) CardCandidatesIdx = 0; // this will return that this card is unknown to us break; } - BitCount = removeSOC(Buffer, BitCount); if (!checkParityBits(Buffer, BitCount)) { LogEntry(LOG_ERR_APP_CHECKSUM_FAIL, Buffer, (BitCount + 8) / 7); diff --git a/Firmware/Chameleon-Mini/Codec/Reader14443-2A.c b/Firmware/Chameleon-Mini/Codec/Reader14443-2A.c index 10bb076..26afb64 100644 --- a/Firmware/Chameleon-Mini/Codec/Reader14443-2A.c +++ b/Firmware/Chameleon-Mini/Codec/Reader14443-2A.c @@ -303,11 +303,11 @@ void Reader14443ACodecTask(void) memcpy(TmpCodecBuffer, CodecBuffer, (BitCount + 7) / 8); CodecBufferPtr = CodecBuffer; - uint16_t BitCountTmp = 0, TotalBitCount = BitCount; + uint16_t BitCountTmp = 2, TotalBitCount = BitCount; BitCount = 0; bool breakflag = false; - + TmpCodecBuffer[0] >>= 2; // with this (and BitCountTmp = 2), the SOC is ignored and thus it's not neccessary to remove it later while (!breakflag && BitCountTmp < TotalBitCount) { uint8_t Bit = TmpCodecBuffer[BitCountTmp / 8] & 0x03; From 8a18378479829eb523fa5a9a4bb1358e6eb6f1fd Mon Sep 17 00:00:00 2001 From: Georg Date: Tue, 7 Nov 2017 16:37:14 +0100 Subject: [PATCH 037/104] updated LATEST firmware --- .../Chameleon-Mini/Latest/Chameleon-Mini.hex | 5223 +++++++++-------- 1 file changed, 2613 insertions(+), 2610 deletions(-) diff --git a/Firmware/Chameleon-Mini/Latest/Chameleon-Mini.hex b/Firmware/Chameleon-Mini/Latest/Chameleon-Mini.hex index 1c56b47..29d6339 100644 --- a/Firmware/Chameleon-Mini/Latest/Chameleon-Mini.hex +++ b/Firmware/Chameleon-Mini/Latest/Chameleon-Mini.hex @@ -6,20 +6,20 @@ :100050000C947D0B0C947D0B0C947D0B0C947D0B00 :100060000C947D0B0C947D0B0C947D0B0C947D0BF0 :100070000C947D0B0C947D0B0C947D0B0C947D0BE0 -:100080000C947D0B0C947D0B0C941E230C947D0B17 +:100080000C947D0B0C947D0B0C947A230C947D0BBB :100090000C947D0B0C947D0B0C947D0B0C947D0BC0 :1000A0000C947D0B0C947D0B0C947D0B0C947D0BB0 -:1000B0000C947D0B0C947D0B0C947D0B0C94EE2317 -:1000C0000C947D0B0C94B0270C947D0B0C947D0B41 +:1000B0000C947D0B0C947D0B0C947D0B0C944A24BA +:1000C0000C947D0B0C940C280C947D0B0C947D0BE4 :1000D0000C947D0B0C947D0B0C947D0B0C947D0B80 :1000E0000C947D0B0C947D0B0C947D0B0C947D0B70 :1000F0000C947D0B0C947D0B0C947D0B0C947D0B60 :100100000C947D0B0C947D0B0C947D0B0C947D0B4F -:100110000C947D0B0C948B270C947D0B0C947D0B15 +:100110000C947D0B0C94E7270C947D0B0C947D0BB9 :100120000C947D0B0C947D0B0C947D0B0C947D0B2F -:100130000C947D0B0C947D0B0C947D0B0C9456232E -:100140000C9456260C947D0B0C947D0B0C947D0B1B -:100150000C947D0B0C9420270C947D0B0C947D0B40 +:100130000C947D0B0C947D0B0C947D0B0C94B223D2 +:100140000C94B2260C947D0B0C947D0B0C947D0BBF +:100150000C947D0B0C947C270C947D0B0C947D0BE4 :100160000C947D0B0C947D0B0C947D0B0C947D0BEF :100170000C947D0B0C947D0B0C947D0B0C947D0BDF :100180000C947D0B0C947D0B0C947D0B0C947D0BCF @@ -29,7 +29,7 @@ :1001C0000C947D0B0C947D0B0C947D0B0C947D0B8F :1001D0000C947D0B0C947D0B0C947D0B0C947D0B7F :1001E0000C947D0B0C947D0B0C947D0B0C947D0B6F -:1001F0000C947D0B0C940A530C947D0B1E0343004E +:1001F0000C947D0B0C94E9520C947D0B1E03430070 :10020000680061006D0065006C0065006F006E00A5 :100210002D004D0069006E00690000002A034B00AC :10022000610073007000650072002000260020004D @@ -41,17 +41,17 @@ :10028000100005070583021000051201100102008D :100290000008D016B20401000102DC01560D570D12 :1002A000580D590D5A0D5B0D5C0D5D0D600D610D06 -:1002B00000000001AF241B253A255B2A612A652A2C -:1002C0005C0D662A262C392C40000700AF241B2524 -:1002D0003A25792CA62CAA2C5C0DAB2CA233BE336C -:1002E00000040400AF241B253A25882CA62CAA2C38 -:1002F0005C0DAB2CA233BE3300040700AF241B25DA -:100300003A25972CA62CAA2C5C0DAB2CA233BE331D -:1003100000100400AF241B253A25972CA62CAA2CEC -:100320005C0DAB2CA233BE3300100700AF241B259D -:100330003A25590D5A0D5B0D5C0D5D0D600D610D7B -:1003400000000001CB2544268328044307431443BF -:1003500015433A43600D610D00000000004E4F4E02 +:1002B000000000010B2577259625BC2AC22AC62AF4 +:1002C0005C0DC72A872C9A2C400007000B25772548 +:1002D0009625DA2C072D0B2D5C0D0C2D03341F34C5 +:1002E000000404000B2577259625E92C072D0B2DFE +:1002F0005C0D0C2D03341F34000407000B257725FB +:100300009625F82C072D0B2D5C0D0C2D03341F3476 +:10031000001004000B2577259625F82C072D0B2DB2 +:100320005C0D0C2D03341F34001007000B257725BE +:100330009625590D5A0D5B0D5C0D5D0D600D610D1F +:10034000000000012726A026DF2838433B4348430E +:1003500049436E43600D610D00000000004E4F4E9A :100360004500000000000000000000000000000048 :1003700000000000000000000000000000014D46E9 :100380005F554C5452414C4947485400000000000E @@ -176,8 +176,8 @@ :100AF0007470733A2F2F6769746875622E636F6D17 :100B00002F656D7365632F4368616D656C656F6EEE :100B10004D696E6920636F6D6D69742025530031D6 -:100B200037303731320031353131313500342E39FB -:100B30002E320033633034333563000D0A000D0A62 +:100B200037313130370031353131313500342E39FC +:100B30002E320033336633353235000D0A000D0A8C :100B4000000D0A000D0A000D0A000D0A0064313084 :100B5000303A4F4B00000000000000000000000091 :100B600000000000000000000000000000006531EF @@ -198,63 +198,63 @@ :100C50000000000000CB3230333A54494D454F5527 :100C60005400000000000000000000000000000030 :100C700000000000000056455253494F4E0000004E -:100C80000000000000000000000000001D19434F9C +:100C80000000000000000000000000007A19434F3F :100C90004E46494700000000000000000000000030 -:100CA000000045193F1955494400000000000000AC -:100CB000000000000000000000009B195C19524574 +:100CA0000000A2199C1955494400000000000000F2 +:100CB00000000000000000000000F819B9195245BA :100CC00041444F4E4C59000000000000000000005D -:100CD0000000F919ED1955504C4F41440000000037 -:100CE000000000000000261A000000000000444F31 -:100CF000574E4C4F414400000000000000002B1AEA +:100CD0000000561A4A1A55504C4F4144000000007B +:100CE000000000000000831A000000000000444FD4 +:100CF000574E4C4F41440000000000000000881A8D :100D00000000000000005245534554000000000060 -:100D1000000000000000301A0000000000005550E4 -:100D200047524144450000000000000000003B1A0B +:100D10000000000000008D1A000000000000555087 +:100D20004752414445000000000000000000981AAE :100D30000000000000004D454D53495A4500000099 -:100D4000000000000000000000000000461A5549A5 +:100D4000000000000000000000000000A31A554948 :100D50004453495A45000000000000000000000014 -:100D6000000000005E1A52425554544F4E000000DD -:100D7000000000000000000000007B1A741A5242BC +:100D600000000000BB1A52425554544F4E00000080 +:100D700000000000000000000000D81AD11A524202 :100D80005554544F4E5F4C4F4E470000000000003A -:100D90000000971A901A4C425554544F4E000000D0 -:100DA00000000000000000000000B31AAC1A4C4222 +:100D90000000F41AED1A4C425554544F4E00000016 +:100DA00000000000000000000000101B091B4C4266 :100DB0005554544F4E5F4C4F4E470000000000000A -:100DC0000000CF1AC81A4C4544475245454E000012 -:100DD00000000000000000000000EB1AE41A4C457F +:100DC00000002C1B251B4C4544475245454E000056 +:100DD00000000000000000000000481B411B4C45C3 :100DE00044524544000000000000000000000000E4 -:100DF0000000071B001B4C4F474D4F4445000000AF -:100E000000000000000000000000211B1C1B4C4FD4 +:100DF0000000641B5D1B4C4F474D4F4445000000F5 +:100E0000000000000000000000007E1B791B4C4F1A :100E1000474D454D000000000000000000000000AC -:100E200000000000361B4C4F47444F574E4C4F417B -:100E30004400000000005B1B0000000000004C4F5D -:100E40004753544F52450000000000000000601B53 +:100E200000000000931B4C4F47444F574E4C4F411E +:100E3000440000000000B81B0000000000004C4F00 +:100E40004753544F52450000000000000000BD1BF6 :100E50000000000000004C4F47434C454152000049 -:100E6000000000000000631B00000000000053456C +:100E6000000000000000C01B00000000000053450F :100E70005454494E470000000000000000000000EC -:100E800000006B1B661B434C4541520000000000F4 -:100E9000000000000000741B00000000000053541C -:100EA0004F52450000000000000000000000781BC9 +:100E80000000C81BC31B434C45415200000000003A +:100E9000000000000000D01B0000000000005354C0 +:100EA0004F52450000000000000000000000D41B6D :100EB000000000000000524543414C4C000000007F -:100EC0000000000000007C1B000000000000434800 +:100EC000000000000000D81B0000000000004348A4 :100ED000415247494E47000000000000000000005A -:100EE00000000000801B48454C500000000000003E -:100EF000000000000000881B0000000000005253AA +:100EE00000000000DC1B48454C50000000000000E2 +:100EF000000000000000E41B00000000000052534E :100F00005349000000000000000000000000000045 -:100F100000000000C41B5359535449434B000000C8 -:100F2000000000000000000000000000F71B534517 +:100F100000000000201C5359535449434B0000006B +:100F2000000000000000000000000000531C5345BA :100F30004E445F52415700000000000000000000D6 -:100F40009D1C0000000053454E44000000000000BE -:100F50000000000000000000131C000000004745D6 -:100F60005455494400000000000000000000591DD5 +:100F4000F91C0000000053454E4400000000000062 +:100F500000000000000000006F1C0000000047457A +:100F60005455494400000000000000000000B51D79 :100F700000000000000044554D505F4D46550000F4 -:100F80000000000000003C1D00000000000049447B -:100F9000454E544946590000000000000000761DEF +:100F8000000000000000981D00000000000049441F +:100F9000454E544946590000000000000000D21D93 :100FA00000000000000054494D454F55540000001A -:100FB00000000000000000000000B31D931D544815 +:100FB000000000000000000000000F1EEF1D54485C :100FC000524553484F4C4400000000000000000010 -:100FD0000000171EFF1D4155544F43414C494252DA -:100FE0004154450000009D1E0000000000004649DD +:100FD0000000731E5B1E4155544F43414C49425221 +:100FE000415445000000F91E000000000000464981 :100FF000454C44000000000000000000000000001C -:101000000000631E8D1E00000000000000000000B4 +:101000000000BF1EE91E00000000000000000000FC :10101000000000000000000000000000000053413C :101020004B3A09005549443A0900415451413A09A3 :10103000005468657265206973206174206C656175 @@ -362,10 +362,10 @@ :10169000000000000000000000000000000000004A :1016A000000000006364696E6F70737578585B00AA :1016B00011241FBECFEFCDBFDFE3DEBF00E00CBFC4 -:1016C00018BE19BE1ABE1BBE14E2A0E0B0E2E2EBE7 +:1016C00018BE19BE1ABE1BBE14E2A0E0B0E2E0EFE5 :1016D000F9EB00E00BBF02C007900D92A631B107F5 :1016E000D9F71BBE25E3A6E1B4E201C01D92A734E1 -:1016F000B207E1F73BD00C94D75C25C13BB78BBF59 +:1016F000B207E1F73BD00C94F65C25C13BB78BBF3A :10170000FB01879196913BBF08953BB78BBFCB01FF :1017100042E20D94F00F3BB70B0143E20D94F00F42 :101720003BB78BBFCB0145E20D94F00F3BB746E2D0 @@ -373,7 +373,7 @@ :1017400008954093CA0128ED31E02093340030938E :10175000CB016091C4017091C5018091C6019927A8 :101760000895FC014093CA01849108950ED10E940E -:1017700057160E94D616C2D21092520684E0809369 +:10177000A2160E943317C2D21092520684E08093C0 :10178000420682E680938601C1E0C0932606C0939C :10179000210686E080932206C093310602E0009382 :1017A000320610922A0613E01093290689E58093E9 @@ -386,15 +386,15 @@ :1018100080081092230310922103D8E0D093220372 :1018200081E18093200380911E2090911F2080935E :101830003803909339038CE380938203D093800321 -:1018400080938303D09381036FD10E948118C0D10C -:1018500031D7C0930002109201020093020210934C -:101860000402C0932002D09321020E941F1519D1B7 +:1018400080938303D09381036FD10E94DE18C0D1AF +:101850003FD7C0930002109201020093020210933E +:101860000402C0932002D09321020E942D1519D1A9 :10187000D2E0C1E18091030481FF25C08091010481 -:1018800080FDFCCFD0930304B8D10E94B3181AD7BF -:101890000E9452160E94DA16E091592EF0915A2EAB -:1018A00019950E9491210E941E18E091682EF091D6 +:1018800080FDFCCFD09303040E943717B6D10E948D +:10189000101926D70E949D16E091592EF0915A2ECC +:1018A00019950E94ED210E947B18E091682EF0911D :1018B000692E8781813011F4C0931F2C868181307D -:1018C00011F4C0931E2C0E948518BAD7E091572EB0 +:1018C00011F4C0931E2C0E94E218C8D7E091572E45 :1018D000F091582E1995E091512EF091522E1995B4 :1018E000C9CF292F33272230310559F02330310554 :1018F00069F021303105F9F482E190E02AE832E024 @@ -428,25 +428,25 @@ :101AB0000895089508950895089580E090E00895A8 :101AC000089508950F931F93CF93DF931F92CDB77F :101AD000DEB70DE41EE2D8011296ED91FC9113974A -:101AE000898319950E94C921E091682EF091692E91 +:101AE000898319950E942522E091682EF091692E34 :101AF00089818583B8E18B9FB001112464567D4FA5 -:101B000048E150E0C8010E94EF55D801ED91FC91E9 +:101B000048E150E0C8010E94CE55D801ED91FC910A :101B10001995D8011696ED91FC9117970F90DF91CA :101B2000CF911F910F91199448E150E06CE972E058 -:101B30008DE49EE20E94EF55E091682EF091692EAF +:101B30008DE49EE20E94CE55E091682EF091692ED0 :101B40008581C0CF0F931F93E091682EF091692E8D -:101B50008B019C01458168E08CE593E00E94BB17F6 +:101B50008B019C01458168E08CE593E00E94181898 :101B60001F910F910895FF920F931F93CF93DF93CF :101B70001F92CDB7DEB78C019E012F5F3F4FAC01A6 -:101B800068E08CE593E00E94D317F82E882389F053 +:101B800068E08CE593E00E943018F82E882389F0F5 :101B9000898198DFF80140E08191882319F04F5F37 :101BA0004F31D1F7E091652EF091662EB80181E1B9 :101BB00019958F2D0F90DF91CF911F910F91FF906D -:101BC00008959B01AC0168E08CE593E00C94FA1752 -:101BD00008950C94E15508951F93CF93DF93C82F78 -:101BE000D92F162F180F1C1721F00E94E155899349 -:101BF000FACFDF91CF911F9108950E94E1550E9485 -:101C0000E1550E94E1550C94E155EF92FF920F933C +:101BC00008959B01AC0168E08CE593E00C945718F4 +:101BD00008950C94C05508951F93CF93DF93C82F99 +:101BE000D92F162F180F1C1721F00E94C05589936A +:101BF000FACFDF91CF911F9108950E94C0550E94A6 +:101C0000C0550E94C0550C94C055EF92FF920F939F :101C10001F93CF93DF937C0161507109FA018A0110 :101C2000020F131FDC0140E050E0E017F107F1F074 :101C300062307105D8F09191392F32953F703A306A @@ -504,2538 +504,2541 @@ :101F7000A0098091A10987FFFCCF8091A0099093CF :101F8000A0098091A10987FFFCCF8091A00982E080 :101F9000C80ED11CE11CF11C219731F780E1809320 -:101FA0006506DF91CF91FF90EF90DF90CF9008957D -:101FB000CF92DF92EF92FF92CF93DF93C090672E84 -:101FC000D12CE12CF12C8DE0CC0CDD1CEE1CFF1C87 -:101FD0008A95D1F7C114D10481E0E806F10438F004 -:101FE000DF91CF91FF90EF90DF90CF9073CF8FEF85 -:101FF000E81AF80AC1E2D0E0219791F39ADBC70111 -:10200000B60183DB96DB8FEFD81AE80AF80AF4CF23 -:10201000CF92DF92EF92FF920F931F93CF93DF93B4 -:10202000C090672ED12CE12CF12C8DE0CC0CDD1C66 -:10203000EE1CFF1C8A95D1F7C114D10481E0E8069B -:10204000F10408F04FC080E18093660683E080933E -:10205000A0098091A10987FFFCCF8091A00910926F -:10206000A0098091A10987FFFCCF8091A00910925F -:10207000A0098091A10987FFFCCF8FEFE81AF80A29 -:102080008091A009C1E2D0E0219749F152DB4EDBFB -:1020900050DB00E010E01092A0098091A10987FFB9 -:1020A000FCCF6091A00970E01092A0098091A10975 -:1020B00087FFFCCF8091A009782BC8012CDB39DB8E -:1020C0000E5F1F4F011581E0180729F7C701B60100 -:1020D00027DB2FDB8FEFD81AE80AF80AD5CF80E18B -:1020E00080936506E091682EF091692E8781863095 -:1020F00019F490E190931F2C9681963049F420E1D9 -:1021000020931E2C853059F483E180931F2C02C04C -:102110008530D1F3953019F483E180931E2CDF9143 -:10212000CF911F910F91FF90EF90DF90CF90089586 -:10213000CF92DF92EF92FF920F931F934115E0E24F -:102140005E076105710508F06BC06901E12CF12C97 -:1021500000E010E220E030E0041B150B260B370BEB -:10216000C016D106E206F30610F49701860120E1BD -:102170002093660626E02093A0092091A10927FF5D -:10218000FCCF2091A00920E120936506000000000B -:102190002093660622E02093A0092091A10927FF41 -:1021A000FCCF2091A0095093A0092091A10927FFFD -:1021B000FCCF2091A0094093A0092091A10927FFFD -:1021C000FCCF2091A0091092120126E134E2209365 -:1021D0001C0130931D01009314011093150120E19F -:1021E00020932201809328019093290100932401D8 -:1021F00010932501809110018068809310018091D7 -:1022000020018068809320018091100187FDFCCF20 -:1022100080E3809311018093210180E18093650622 -:1022200081E01F910F91FF90EF90DF90CF90089584 -:10223000CF92DF92EF92FF920F931F934115E0E24E -:102240005E076105710508F05DC06901E12CF12CA4 -:1022500000E010E220E030E0041B150B260B370BEA -:10226000C016D106E206F30610F49701860120E1BC -:102270002093660623E02093A0092091A10927FF5F -:10228000FCCF2091A0095093A0092091A10927FF1C -:10229000FCCF2091A0094093A0092091A10927FF1C -:1022A000FCCF2091A00921E02093120180931C0112 -:1022B00090931D01009314011093150110922201B7 -:1022C00086E194E2809328019093290100932401F0 -:1022D00010932501809110018068809310018091F6 -:1022E00020018068809320018091100187FDFCCF40 -:1022F00080E3809311018093210180E18093650642 -:1023000081E001C080E01F910F91FF90EF90DF907E -:10231000CF9008958091CF0187FDFCCF0895FADF1B -:102320008091CF0181FF0BC086E38093CA01EBEC63 -:10233000F1E021E030E088ED90E084BF2083089553 -:10234000EF92FF920F931F93CF93DF931F921F92F1 -:10235000CDB7DEB77C018A011092C20169837A830E -:10236000D9DF6981A62F7A81B72FC701800F911F0E -:1023700026E048ED50E061E070E0EBECF1E0E816BB -:10238000F90689F0E092C0013F2D3F713093C10101 -:102390002093CA0144BF60833091C4013D933FEF55 -:1023A000E31AF30AECCFC8010F900F90DF91CF91A1 -:1023B0001F910F91FF90EF9008952F923F924F92AF -:1023C0005F926F927F928F929F92AF92BF92CF92C5 -:1023D000DF92EF92FF920F931F93CF93DF9300D082 -:1023E000CDB7DEB76A01282F2F711C01221A3108E0 -:1023F00029836A837B8393DF8DDF83E38093CA0124 -:102400001092C1011092C2016A81E62E7B81F72EE3 -:10241000860185E3582E98ED892E912C66246394CD -:10242000712C3BECA32EBB24B39443E3442E2981AF -:102430000115110509F12093C001F70181917F0178 -:102440008093C4010150110919F02F5F203281F7E8 -:102450002092C001832D8F718093C1015092CA01D7 -:10246000C401F50184BF608290E2290E311C52DF65 -:102470004092CA0120E0DCCFC6012396CDBFDEBF6B -:10248000DF91CF911F910F91FF90EF90DF90CF9050 -:10249000BF90AF909F908F907F906F905F904F9084 -:1024A0003F902F9008951F93CF93DF93CDB7DEB762 -:1024B000A097CDBFDEBF853009F4AEC078F482307E -:1024C00081F128F4813009F0EEC010E01BC08330A8 -:1024D00009F453C0843009F475C0E5C0883009F4AC -:1024E000D3C040F4863009F4CDC0873009F0DBC09A -:1024F0008FDDD9C0893009F4C9C08A3009F0D3C052 -:1025000080D3D1C08091632E181708F0A8C061DB7A -:10251000E1E0F0E0EC0FFD1FE10FF11D80831F5F94 -:10252000F1CF11E08091632E873009F010E0E09147 -:102530005D2EF0915E2ECE01019619954091632E8D -:1025400031E0141708F08BC03323A9F0812F90E0FD -:10255000E1E0F0E0EC0FFD1FE80FF91F208131E012 -:102560002F3F09F030E0E1E0F0E0EC0FFD1FE80F55 -:10257000F91F2F5F20831F5FE4CFE0915D2EF09164 -:102580005E2ECE01019619958091632E41E0815017 -:1025900008F465C04423D9F3282F30E0E1E0F0E0EF -:1025A000EC0FFD1FE20FF31F908141E09F3F09F008 -:1025B00040E0E1E0F0E0EC0FFD1FE20FF31F9F5F52 -:1025C0009083E5CF11E08091632E873009F010E011 -:1025D000E0915D2EF0915E2ECE010196199540910D -:1025E000632E31E01417D8F53323A1F0812F90E04A -:1025F000E1E0F0E0EC0FFD1FE80FF91F208131E072 -:10260000211130E0E1E0F0E0EC0FFD1FE80FF91FD1 -:10261000215020831F5FE6CFE0915D2EF0915E2E6A -:10262000CE01019619958091632E41E08150B8F05A -:102630004423E1F3282F30E0E1E0F0E0EC0FFD1F50 -:10264000E20FF31F908141E0911140E0E1E0F0E002 -:10265000EC0FFD1FE20FF31F91509083E7CFE09145 -:102660005F2EF091602ECE0101961995E091652EB6 -:10267000F091662E4091632EBE016F5F7F4F83E124 -:10268000199511C05DD30FC025DC0DC080910008E5 -:10269000813021F480918C08833019F00E945522FA -:1026A00002C00E947A22A096CDBFDEBFDF91CF91FB -:1026B0001F910895E0E0F6E080E6828388E1868B52 -:1026C000858B0895CF93C0910806C095C6FF12C0B0 -:1026D000809118248A3050F08A30E1F4E091682E1D -:1026E000F091692E8181DFDE809118248F5F8093C5 -:1026F000182410C08C2F807669F4809118248150A2 -:102700008A3030F4E091682EF091692E8081CBDE22 -:1027100010921824C5FF12C0809117248A3050F0FF -:102720008A30D9F4E091682EF091692E8381BBDE66 -:10273000809117248F5F809317240FC0C07669F4AF -:102740008091172481508A3030F4E091682EF09106 -:10275000692E8281A8DE10921724CF9108959B01E3 -:10276000AC016BE084E696E045C420E030E090E008 -:10277000F901E80FF91FE959F14D6383265F3F4FD7 -:1027800020353105A9F708950F931F939B01E09120 -:10279000682EF091692EE80FF11D8A0140816BE0EF -:1027A00084E696E0E8D31F910F9108950F931F934D -:1027B000CF93DF931F92CDB7DEB7082FAB019E01F9 -:1027C0002F5F3F4F6BE084E696E0EDD3182F882310 -:1027D00019F06981802FC9DF812F0F90DF91CF9190 -:1027E0001F910F9108950895EF92FF920F931F93F9 -:1027F000CF937B01C42F2EB13FB1009108041091FB -:102800000904022B132B682F83E090E20E94F553FA -:102810006C2F83E090E20E94F553612F83E090E2F9 -:102820000E94F553602F83E090E20E94F5536C2FD5 -:1028300070E0C701CF911F910F91FF90EF905BC4A3 -:1028400008953F924F925F926F927F928F929F92E4 -:10285000AF92BF92CF92DF92EF92FF920F931F93AE -:10286000CF93DF937C01E901C0900020D09001203C -:10287000960122503843C901A0E0B0E0481759073B -:102880006A077B0708F05CC0E2E0CE1AE0E4DE0AEB -:102890002A013B014C0E5D1E611C711C4816590635 -:1028A0006A067B0648F0241B350B8E01021B130BB6 -:1028B000E9013324339403C000E010E0312C4601D9 -:1028C000A12CB12C481559056A057B0510F5CA01E4 -:1028D0008E5F9F4B2A013B014C0E5D1E611C711CDB -:1028E000481459046A047B0428F4AE01BC01C701F2 -:1028F00035DA18C0C41AD50AA601BC01C7012EDA00 -:10290000AE014C195D096EE174E2C7018C0D9D1D8D -:1029100007C04C195D09BA01625E7B4DAE01C7016B -:102920000E941D56311002C081E00BC001501109F8 -:10293000D8F3F801EC0FFD1FEE0DFF1D1082F6CF4E -:1029400080E0DF91CF911F910F91FF90EF90DF908A -:10295000CF90BF90AF909F908F907F906F905F903F -:102960004F903F90089520911A2430911B2480E0CD -:1029700098E0821B930BEEE1F4E29F012E5134426A -:102980002817390710F41192F8CF8EE194E2809362 -:102990001C2490931D2480E098E080931A24909347 -:1029A0001B2482E090E4809300209093012042E079 -:1029B00050E060E070E480E090E21EDAE091682E82 -:1029C000F091692E87818A3019F480E180931F2C61 -:1029D00086818A3019F480E180931E2C08958091BD -:1029E0001A2490911B2490582091002030910120AE -:1029F000821B930B089520E030E0F901E959F14D75 -:102A00008783265F3F4F20353105B9F7813049F084 -:102A100018F0823059F008951092192483EF93E151 -:102A200009C0809319248AE795E104C01092192403 -:102A300084EF93E18093652E9093662E08950F9313 -:102A40001F93CF93DF931F92CDB7DEB7E091682E2F -:102A5000F091692E8481CFDF8EE194E280931C2473 -:102A600090931D2400E018E000931A2410931B2477 -:102A700041E050E0BE016F5F7F4F80E090E060DC9E -:102A8000E0911C24F0911D24DF01C8011D920197E3 -:102A9000E9F78981882341F042E050E060E070E48A -:102AA00080E090E25BD917C082E090E48093002040 -:102AB0009093012042E050E060E070E480E090E21A -:102AC0009BD981E0898341E050E0BE016F5F7F4F79 -:102AD00080E090E072DCE091652EF091662E40E09F -:102AE00060E070E08FEF19950F90DF91CF911F910B -:102AF0000F9108950F931F93CF93DF93AEB1BFB1A2 -:102B0000C0910804D091090420911A2430911B240B -:102B1000E42FF0E08F010C5F1F4F2017310758F1B1 -:102B2000CA2BDB2B245031092E1B3F0B20931A2478 -:102B300030931B24A0911C24B0911D248C931196DA -:102B40004C9311971296DC931297CD0104968093C3 -:102B50001C2490931D241396CC93DB01EC0141506F -:102B600018F02D912993FBCFE80FF91FE0931C2457 -:102B7000F0931D2412C080E03EDFE091682EF091BA -:102B8000692E87818A3019F481E180931F2C868118 -:102B90008A3019F481E180931E2CDF91CF911F912F -:102BA0000F9108951F93CF93DF931F92CDB7DEB798 -:102BB0009E012F5F3F4FAC0163E08FEC97E0F3D1B4 -:102BC000182F882311F0898116DF812F0F90DF9154 -:102BD000CF911F9108950F931F93E091682EF0916C -:102BE000692E8B019C01448163E08FEC97E0C3D197 -:102BF0001F910F9108959B01AC0163E08FEC97E06A -:102C0000F9C1CF93DF9380911A2490911B248115F1 -:102C100028E0920708F043C06091002070910120E5 -:102C2000C0E0D8E0AE01481B590B80E090E8861B5D -:102C3000970B8417950798F18EE194E2DDD82091E7 -:102C40001A2430911B248091002090910120985FDC -:102C5000821B930B8093002090930120C21BD30B07 -:102C6000EEE1F4E2CF018E5194428C179D0710F4EF -:102C70001192F8CF8EE194E280931C2490931D244E -:102C800080E098E080931A2490931B2442E050E067 -:102C900060E070E480E090E2DF91CF91ADC8DF9119 -:102CA000CF910895809119248111ABCF089543E508 -:102CB00050E067E67EE281E090E042CB43E550E001 -:102CC00067E67EE281E090E078CBCF93DF93CFEFB1 -:102CD000C80FC83078F5D82F0E94C92199D9C09360 -:102CE000672E8AE0C89F90011124C9018659914D31 -:102CF0008093682E9093692EF901E959F14D8085F2 -:102D00000E94620DE091682EF091692E848173DE3D -:102D1000E1D88FE18D0FE091682EF091692E9781B7 -:102D2000943011F480931F2C9681943029F4809371 -:102D30001E2C02C080E001C081E0DF91CF91089598 -:102D40008091672E99E04AE0915099F0282F30E069 -:102D50002F5F3F4F27703327822F429FF001439F01 -:102D6000F00D1124E959F14D2085222369F38F5F7D -:102D7000ACCF0895FC019091672E9F5C90831182E7 -:102D80000895CF93FC01C081818181110CC0BF01E6 -:102D9000E091652EF091662E41E082E1199580ED7B -:102DA0008C0FCF9192CF80E0CF91089588E18093EE -:102DB0000106089580911E2C823191F030F480310B -:102DC000B9F050F48823A9F132C0833169F090EE54 -:102DD000980F983088F02BC088E08093050627C0B4 -:102DE00088E08093070623C08091040683FF12C009 -:102DF00088E0809306061BC09091202C9F5F923044 -:102E000019F09093202C15C01092202C909104065C -:102E100093FD04C088E0809305060BC098E0909372 -:102E20000606803221F0815080931E2C02C0109241 -:102E30001E2C80911F2C823191F030F48031C1F032 -:102E400050F48823A9F132C0833169F090EE980FD5 -:102E5000983088F02BC080E18093050627C080E180 -:102E60008093070623C08091040684FF12C080E18E -:102E7000809306061BC09091212C9F5F923019F021 -:102E80009093212C08951092212C9091040694FD8A -:102E900004C080E180930506089590E190930606B2 -:102EA000803221F0815080931F2C089510921F2CA6 -:102EB00008959B01AC016BE082E398E09BC020E0A9 -:102EC00030E0982F90718870992321F0F901E95929 -:102ED000F14D6287882321F0F901E959F14D6187AD -:102EE000265F3F4F2035310579F7992329F090E18E -:102EF0009093060610921F2C882329F088E0809377 -:102F0000060610921E2C08950F931F939B018A01B1 -:102F1000803131F4E091682EF091692E478107C02D -:102F2000883049F4E091682EF091692E46816BE07B -:102F300082E398E020D01F910F9108950F931F9383 -:102F4000CF93DF931F92CDB7DEB7082FAB019E0161 -:102F50002F5F3F4F6BE082E398E025D0182F882346 -:102F600019F06981802FABDF812F0F90DF91CF9116 -:102F70001F910F9108950F931F93FC01662379F021 -:102F800094916150941309C0BF016F5F7F4FA801F6 -:102F9000C9010E94015681E003C0B196EFCF80E0E5 -:102FA0001F910F910895CF92DF92EF92FF921F939E -:102FB000CF93DF93EC017A016901162F112389F079 -:102FC000BE016F5F7F4FC7010E94F8551150892BDA -:102FD00031F4FE01C491F601C08381E003C0A196E3 -:102FE000EDCF80E0DF91CF911F91FF90EF90DF90C8 -:102FF000CF900895CF930196CCE26623C9F0FC01EF -:10300000DA01AD017491772341F021153105A1F06A -:103010007D93319621503109F4CF623030F0211583 -:10302000310551F04F5F5F4FCC9361508196E5CFF2 -:10303000232B11F0FA011082CF9108958091200284 -:103040008068809320028091230280FFFCCF81E082 -:1030500080932302A0911002B0911102AE5BB109DE -:10306000B7FF02C0A0E0B0E020E038EB4BE050E05A -:103070000E947B55E091682EF091692E61157105D3 -:10308000844F9140A8F48781873019F480E18093C0 -:103090001F2C8681873019F480E180931E2C80914B -:1030A000632E882389F0E091552EF091562E1994C5 -:1030B0008781873019F481E180931F2C86818730C6 -:1030C00019F481E180931E2C0895BC0183E090E205 -:1030D0000C94A753CF93DF93FC016491EC012196EC -:1030E000662331F083E090E20E94F553CE01F4CFE5 -:1030F000DF91CF910895AB01BC0183E090E20C9485 -:10310000D15380E2809362060895CF93DF9380913C -:10311000222C823029F583E090E20E945A540E94CA -:10312000294F83E090E20E947654EC0197FD18C08D -:10313000E091682EF091692E8781833019F483E144 -:1031400080931F2C8681833019F483E180931E2C99 -:103150008C2F41D6811104C08C2FDF91CF91DFC716 -:10316000DF91CF9108958091222C813079F028F061 -:103170008230D9F0833011F12EC08091680685FF2E -:103180002AC08FE08093022081E00CC08091022051 -:1031900081508093022081111EC00E94130D0E9455 -:1031A000D45282E08093222C16C08091680685FD5F -:1031B00012C08FE08093022083E0F4CF8091022040 -:1031C000815080930220811106C00E9499520E9472 -:1031D000410D1092222C8091222C823019F44BD771 -:1031E0000C9491210895E091682EF091692E8781C9 -:1031F000823019F481E180931F2C8681823019F48A -:1032000081E180931E2C0895E091682EF091692E43 -:103210008781823019F480E180931F2C868182306F -:1032200019F480E180931E2C089583E090E20C94C1 -:10323000825383E090E20C94C95423E33BE03F9334 -:103240002F932DE23BE03F932F9326E23BE03F9309 -:103250002F932FE13BE03F932F932FE73AE03F93EB -:103260002F9322E02F931F929F938F930E94865655 -:103270008DB79EB70E968DBF9EBF85E6089560E020 -:1032800072E00E94A20D85E60895FB0120812F3394 -:1032900049F42181211106C060E072E00E94E10D35 -:1032A00085E60895CB010E94B30D882319F006DD51 -:1032B00084E608958AEC0895EF92FF920F931F938E -:1032C000CF93DF93CDB7DEB7A097CDBFDEBF7C0134 -:1032D0000091632E10E00115110591F487E79AE043 -:1032E0009F938F9382E08F931F92FF92EF920E94A1 -:1032F00086560F900F900F900F900F900F9010C068 -:10330000E0915D2EF0915E2ECE0101961995980107 -:10331000AE014F5F5F4F60E072E0C7010E94050E93 -:1033200085E6A096CDBFDEBFDF91CF911F910F91B3 -:10333000FF90EF900895DF92EF92FF920F931F930B -:10334000CF93DF93CDB7DEB7A097CDBFDEBF7B01B4 -:103350000091632E10E060E77AE0C7010E94F85503 -:10336000892B29F5D12CED2CF12CE016F10658F41F -:103370000E94E90DE1E0F0E0EC0FFD1FEE0DFF1DF6 -:103380008083D394F0CFE0915F2EF091602ECE0138 -:1033900001961995E091652EF091662E4091632E6D -:1033A000BE016F5F7F4F83E1199584E60BC0A701D3 -:1033B00060E270E0CE0101960E943F0E80179107F7 -:1033C00011F38AECA096CDBFDEBFDF91CF911F91A4 -:1033D0000F91FF90EF90DF900895FC018091642E93 -:1033E000882311F081E301C080E38083118285E6A8 -:1033F0000895FB012181211127C02081213321F46F -:1034000081E08093642E04C0203321F41092642E56 -:1034100084E608952F33C1F41F9220E32F931F9267 -:1034200021E32F932AE63AE03F932F9322E02F9354 -:103430001F929F938F930E9486568DB79EB70A96D0 -:103440008DBF9EBF85E608958AEC089588E990E1D6 -:1034500091D48EE6089588E191E1A7D48EE608958F -:10346000E0ECF4E081818E7F81830E9499520E947A -:10347000070D84E60895E0ECF4E081818E7F81837E -:103480000E9499520E940D0D84E60895EDE4FEE23B -:1034900025892F9324892F9327E63AE03F932F9392 -:1034A00022E02F931F929F938F930E9486568DB791 -:1034B0009EB708968DBF9EBF85E608952091632E26 -:1034C0001F922F9324E63AE03F932F9322E02F930D -:1034D0001F929F938F930E9486568DB79EB7089632 -:1034E0008DBF9EBF85E6089540E052E0BC0180E0BC -:1034F0004BD985E60895FB0120812F3341F42181CA -:10350000211105C060E072E02AD985E6089580E0C7 -:103510004DD9882319F0D2DB84E608958AEC08950A -:1035200040E052E0BC0181E02FD985E60895FB011F -:1035300020812F3341F42181211105C060E072E028 -:103540000ED985E6089581E031D9882319F0B6DBDC -:1035500084E608958AEC089540E052E0BC0182E0E0 -:1035600013D985E60895FB0120812F3341F4218191 -:10357000211105C060E072E0F2D885E6089582E08E -:1035800015D9882319F09ADB84E608958AEC08950A -:1035900040E052E0BC0183E0F7D885E60895FB01E6 -:1035A00020812F3341F42181211105C060E072E0B8 -:1035B000D6D885E6089583E0F9D8882319F07EDB14 -:1035C00084E608958AEC089540E052E0BC0180E171 -:1035D0009BDC85E60895FB0120812F3341F4218196 -:1035E000211105C060E072E064DC85E6089580E1A9 -:1035F000A5DC882319F062DB84E608958AEC08953F -:1036000040E052E0BC0188E07FDC85E60895FB01E4 -:1036100020812F3341F42181211105C060E072E047 -:1036200048DC85E6089588E089DC882319F046DBCC -:1036300084E608958AEC089560E072E0CCDA85E6CD -:103640000895FB0120812F3341F42181211105C010 -:1036500060E072E0D0DA85E60895CB01A3DA882332 -:1036600019F02CDB84E608958AEC0895CF93DF935C -:10367000EC01B5D9813028E0920718F09C01385050 -:1036800002C020E030E03F932F939F938F9324E478 -:103690003AE03F932F9382E08F931F92DF93CF9373 -:1036A0000E9486568DB79EB70A968DBF9EBF85E64F -:1036B000DF91CF91089581E294E177D38EE608956A -:1036C000A0DA84E608954FD984E6089560E072E0B8 -:1036D00051DB85E60895CB0154DB882319F0EEDA3F -:1036E00084E608958AEC08950E94D80F84E6089530 -:1036F0000E94081084E608950E946A0F84E60895E7 -:103700008091680680FD02C089E7089588E70895E2 -:10371000DF92EF92FF920F931F93CF93DF93EC0111 -:103720000FEF11E086E7E82E8CE0F82E9CE2D92E10 -:10373000B70181ED93E20E94F855892BD1F0011574 -:103740001105B9F0DE01F7012491ED012196C801C0 -:103750000197222341F00130110529F02C93DE015D -:1037600031968C01F1CFDC928C0188E1E80EF11CDE -:10377000DFCF2197188285E6DF91CF911F910F91BE -:10378000FF90EF90DF900895FC01209120022068C7 -:10379000209320028091230280FFFCCF81E0809360 -:1037A0002302A0911002B0911102AE5BB109B7FFE4 -:1037B00002C0A0E0B0E020E038EB4BE050E00E9417 -:1037C0007B55AA27BB279F938F932DE33AE03F9326 -:1037D0002F9382E08F931F92FF93EF930E94865660 -:1037E0008DB79EB708968DBF9EBF85E608952EB112 -:1037F0003FB14091080450910904242B352B3F938D -:103800002F9327E33AE03F932F9322E02F931F92C9 -:103810009F938F930E9486568DB79EB708968DBF53 -:103820009EBF85E608950F931F93CF93DF931F925A -:103830001F92CDB7DEB78B01E091682EF091692E13 -:103840008581873009F06FC0E091552EF091562E9A -:10385000199581E08093772C60E270E0C8010E94A6 -:103860003E560097F9F4F80101900020E9F73197EE -:10387000E01BF10BE0FD59C0F695E795E130F1054D -:1038800039F487E090E080934B2E90934C2E37C014 -:1038900053E0EE0FFF1F5A95E1F7E0934B2EF093A4 -:1038A0004C2E2DC098012C5F3F4F82179307E9F5EE -:1038B000A80162E070E0CE0101960E943F0E89816E -:1038C00090E0982F88272A81820F911D80934B2E9C -:1038D00090934C2E0B5F1F4FF80101900020E9F7E9 -:1038E0003197E01BF10BE0FD20C0F695E79533E042 -:1038F000EE0FFF1F3A95E1F7E817F907B0F0609176 -:103900004B2E70914C2E695F7F4F83E076956795C3 -:103910008A95E1F7A8018BE49DE20E943F0E0E9488 -:10392000072A8FEF03C089EC01C08AEC0F900F903B -:10393000DF91CF911F910F910895EF92FF920F9316 -:103940001F93CF93DF931F921F92CDB7DEB78B01EA -:10395000E091682EF091692E8581873009F080C052 -:10396000E091552EF091562E199582E08093772C98 -:1039700060E270E0C8010E943E567C01892B31F55F -:10398000F80101900020E9F73197E01BF10BE0FD11 -:1039900069C0F695E795E130F10539F487E090E0EC -:1039A00080934B2E90934C2E47C063E0EE0FFF1F89 -:1039B0006A95E1F7CF0169E070E00E946755E81B66 -:1039C000F90BE0934B2EF0934C2E36C0C8010496B1 -:1039D000E816F90609F046C0A80162E070E0CE01E1 -:1039E00001960E943F0E298130E0322F22278A81E2 -:1039F000280F311D20934B2E30934C2E273031054C -:103A000029F0C90187709927892B61F587010F5F1C -:103A10001F4FF80101900020E9F73197E01BF10BEF -:103A2000E0FD20C0F695E79543E0EE0FFF1F4A95B5 -:103A3000E1F7E217F307B0F060914B2E70914C2E36 -:103A4000695F7F4F83E0769567958A95E1F7A801D6 -:103A50008BE49DE20E943F0E0E94072A8FEF03C075 -:103A600089EC01C08AEC0F900F90DF91CF911F91EC -:103A70000F91FF90EF900895E091682EF091692EDC -:103A800085818730A1F4E091552EF091562E19953D -:103A900085E08093772C0E9404430E94072A8EE0E1 -:103AA00093E48093322C9093332C8FEF089589EC1C -:103AB0000895E091682EF091692E85818730A1F4F8 -:103AC000E091552EF091562E199583E08093772C36 -:103AD0000E9404430E94072A8EE093E48093322CD4 -:103AE0009093332C8FEF089589EC0895E091682E20 -:103AF000F091692E85818730A1F4E091552EF091E7 -:103B0000562E199586E08093772C0E9404430E94DC -:103B1000072A8EE093E48093322C9093332C8FEF1E -:103B2000089589EC0895E091682EF091692E408502 -:103B3000518564E6649F9001659F300D11243F9389 -:103B40002F9321E33AE03F932F9322E02F931F928C -:103B50009F938F930E9486568DB79EB708968DBF10 -:103B60009EBF85E60895CF93DF931F921F92CDB736 -:103B7000DEB7FB0120812F33B1F42181211113C065 -:103B80002FEF39E03F932F9322E02F931F929F93C3 -:103B90008F930E9486560F900F900F900F900F906A -:103BA0000F9085E627C089E592E089839A83CE014C -:103BB00001969F938F938BEF99E09F938F937F93C1 -:103BC0006F930E94BC560F900F900F900F900F9024 -:103BD0000F90892B71F089819A818935F2E09F07D6 -:103BE00040F4E091682EF091692E8087918784E6F9 -:103BF00001C08AEC0F900F90DF91CF910895209132 -:103C00001F202F9320911E202F9328EF39E03F9300 -:103C10002F9322E02F931F929F938F930E9486569B -:103C20008DB79EB708968DBF9EBF85E60895CF934A -:103C3000DF931F921F92CDB7DEB7FB0120812F3398 -:103C4000B1F42181211113C02FE02F932FEF2F9377 -:103C500027EA39E03F932F9322E02F931F929F93FF -:103C60008F930E948656CDBFDEBF85E627C019829E -:103C70001A82CE0101969F938F9383EA99E09F93D6 -:103C80008F937F936F930E94BC560F900F900F906D -:103C90000F900F900F90892B81F089819A81811567 -:103CA000E0E19E0750F480933803909339038093AA -:103CB0001E2090931F2084E601C08AEC0F900F9085 -:103CC000DF91CF910895FB0120812F33D9F4218119 -:103CD000211121C01F9220E32F931F9221E32F93E4 -:103CE0002DE939E03F932F9322E02F931F929F936A -:103CF0008F930E9486568DB79EB70A968DBF9EBF42 -:103D000085E60895213311F4D0D303C0203319F48C -:103D1000F1D384E608958AEC0895FC0180910008AF -:103D2000813021F480918C08833011F080E301C050 -:103D300081E38083118285E60895E091682EF091F9 -:103D4000692E85818730A1F4E091552EF091562E91 -:103D5000199584E08093772C0E9404430E94072ADF -:103D60008EE093E48093322C9093332C8FEF089560 -:103D700089EC089521E02093312C2093302C2CE302 -:103D800020932D2C25E030E020932B2C30932C2CED -:103D90001092252C1092262C1092272C1092282C51 -:103DA0008093232C9093242C089527E02093312C8A -:103DB0002CE231E020932B2C30932C2C1092252CCC -:103DC0001092262C1092272C1092282C8093232CB2 -:103DD0009093242C0895CF939091312C9530E1F15C -:103DE00030F4933029F140F5913068F440C19730B8 -:103DF00009F4A7C008F445C0983009F4AAC0993066 -:103E000009F432C134C1813041F41092292C10924E -:103E10002A2C10922E2C83E0FBC0843011F466E033 -:103E20008BC0883109F420C18B3109F0F3C01CC16B -:103E300080932F2C84E0ECC090E040912F2C2FEF4A -:103E400030E0241B31098217930721F485E0E0C09C -:103E5000981739F165E169C02091292C30912A2CFD -:103E6000A9014F5F5F4F4093292C50932A2CF901F1 -:103E7000E654F14D80834038510509F0CBC086E00F -:103E8000C7C020912F2C9091302C291346C0EAEB0B -:103E9000FEE290E02FE2EA33F207D1F22191920F95 -:103EA000F9CF4091252C5091262C6091272C7091B0 -:103EB000282CE091232CF091242C20E830E08AEB90 -:103EC0009EE21995C82F882311F18091302C8F5FC5 -:103ED0008093302C8091252C9091262CA091272C1A -:103EE000B091282C80589F4FAF4FBF4F8093252C07 -:103EF0009093262CA093272CB093282C66E083E087 -:103F000090E20E94F55382E08093312CB1C068E1C9 -:103F100083E090E20E94F5530EC030E0892F90E0DC -:103F200001972817390739F466E083E090E20E9490 -:103F3000F55382E06DC068E183E090E20E94F553A2 -:103F400093C0853119F41092302C09C08B3109F4DB -:103F50008BC0883109F463CF863009F05DC0809151 -:103F6000302C8F5F8093302C4091252C5091262C43 -:103F70006091272C7091282CE091232CF091242C17 -:103F800020E830E08AEB9EE21995C82F8823D1F112 -:103F900061E083E090E20E94F5536091302C83E071 -:103FA00090E20E94F5536091302C609583E090E29E -:103FB0000E94F55360E870E08AEB9EE29CD8EAEB41 -:103FC000FEE260E08FE2EA33F80719F08191680FB2 -:103FD000F9CF83E090E20E94F5538091252C9091D7 -:103FE000262CA091272CB091282C80589F4FAF4FA2 -:103FF000BF4F8093252C9093262CA093272CB09311 -:10400000282C36C064E083E090E20E94F55389E0FA -:104010008093312CC1E02CC08531E1F761E083E071 -:1040200090E20E94F5536091302C83E090E20E9470 -:10403000F5536091302C609583E090E20E94F55337 -:1040400060E870E08AEB9EE256D8EAEBFEE260E0C0 -:104050002FE2EA33F20719F08191680FF9CF83E07C -:1040600090E20E94F553D6CF1092312CD3CFC0E00E -:104070008C2FCF9108958091312C813019F08730A9 -:1040800029F1089580912B2C90912C2C9C0121508A -:10409000310920932B2C30932C2C892B31F58091D6 -:1040A0002D2C9FEF980F90932D2C882331F065E1F4 -:1040B00083E090E20E94F55302C01092312C85E01B -:1040C00090E080932B2C90932C2C089580912B2C96 -:1040D00090912C2C9C012150310920932B2C309352 -:1040E0002C2C892B11F41092312C0895EDE4FBE077 -:1040F00020E030E09491981309C041E2429FC00152 -:10410000439F900D1124825B944F08952F5F3F4F82 -:10411000B1962930310571F780E090E00895CF9293 -:10412000DF92EF92FF920F931F93CF93982F9F7D73 -:1041300091549A3160F090ED980F9A3040F08F359D -:1041400031F0982F9D7F9D3311F08032D1F49FE99B -:10415000980F9A3108F480522091372C3091382CE6 -:104160002F3F91E0390708F0D3C0A9014F5F5F4F9F -:104170004093372C5093382CF901E654F14D80834D -:10418000C7C08D3009F095C0E091372CF091382CE4 -:10419000E654F14D10821092372C1092382C8091F9 -:1041A000362C8111B5C08091BA2E982F9F7D09F4CD -:1041B00095C08D7F8D3309F491C0EAEBFEE27F015B -:1041C000C191CC2331F0CF3321F0CD3311F0C03287 -:1041D000B1F7F701108286E7C82E8CE0D82E00E0F8 -:1041E00010E0B6018AEB9EE20E94F855892B09F097 -:1041F00056C01092BA2ECF3349F488E1809FF00167 -:10420000819FF00D1124E457F34F18C0B7016F5F81 -:104210007F4FCD3349F488E1809FF001819FF00DFD -:104220001124E657F34F20C0C11113C088E1809FCD -:10423000F001819FF00D1124EA57F34F259134913D -:104240002115310509F44DC08AEB9EE2F90119955B -:1042500014C0C03209F045C088E1809FF001819F01 -:10426000F00D1124E857F34F2591349121153105B4 -:10427000C1F18AEB9EE2F90119958F3F99F581E032 -:104280008093362C8EB19FB120910804309109049F -:10429000822B932B8093342C9093352C39C00F5F55 -:1042A0001F4FF8E1CF0ED11C0732110509F099CF4D -:1042B00015C0883061F48091372C9091382C00978C -:1042C00039F101978093372C9093382C21C08B3192 -:1042D000F9F41092372C1092382C1AC088ECC0E0F8 -:1042E00002C089ECC1E002DF0E946A188AE49BE008 -:1042F0000E946A18CC2361F08091BA2E882341F085 -:104300008AEB9EE20E94651887E49BE00E946A188F -:1043100081E0CF911F910F91FF90EF90DF90CF90B0 -:1043200008958091362C882399F1E091682EF091C0 -:10433000692E208531852115310551F18EB19FB14E -:104340004091080450910904842B952B4091342C02 -:104350005091352C841B950B64E670E00E946755E4 -:1043600062177307A8F01092362C8BECBFDE0E9408 -:104370006A1884E49BE00E946A18E091322CF09164 -:10438000332C309729F019951092322C1092332C3F -:1043900008958091362C8823A9F01092362C8BEC4E -:1043A000A5DE0E946A1884E49BE00E946A18E091EE -:1043B000322CF091332C309729F019951092322C31 -:1043C0001092332C0895CF93DF939091362C99233C -:1043D000A9F0EB011092362C89DE0E946A1881E464 -:1043E0009BE00E946A18209749F0CE010E94651850 -:1043F0008EE39BE0DF91CF910C946A18DF91CF910F -:104400000895EF92FF920F931F93CF937C019B012E -:10441000613081E0780710F020E031E08B01021B71 -:10442000130BA70160E072E08AEB9EE20E94050E8A -:104430008AEB9EE20E946518C1E0013081E0180716 -:10444000B0F01A956C2F70E0762F6627A701460F03 -:10445000571F20E032E060E072E08AEB9EE20E94AB -:10446000050E8AEB9EE20E946518CF5FE6CF01152C -:10447000110591F0EC2FF0E0FE2FEE27A7014E0F73 -:104480005F1F980160E072E08AEB9EE20E94050ED9 -:104490008AEB9EE20E9465188BE39BE0CF911F910F -:1044A0000F91FF90EF900C946A1880910008813072 -:1044B00029F480918C08833009F4089580913B2C75 -:1044C000811117C081E08093000893E090938C08DD -:1044D0008093392C10923A2C8EB19FB12091080410 -:1044E00030910904822B932B8093402C9093412C84 -:1044F0000895089510928C0810920008E9E3FCE2F8 -:104500001082118208959091392C9923F1F08091B5 -:104510003A2C811115C02091392C2223B9F02EB1EB -:104520003FB14091080450910904242B352B409150 -:10453000402C5091412C241B350B2634310530F092 -:1045400081E080933A2C892F089581E00895CF93DC -:10455000DF931F92CDB7DEB780913B2C8823D1F03B -:104560002EB13FB14091080450910904242B352B02 -:1045700040913E2C50913F2C241B350B40913C2CFC -:1045800050913D2C2417350728F010923B2C89833D -:104590008CDF89810F90DF91CF91089580931E2049 -:1045A00090931F208093380390933903089580914E -:1045B0001E2090911F20089680931E2090931F200C -:1045C0008093380390933903089580E991E08093B4 -:1045D0001E2090931F2080933803909339030895F1 -:1045E000A0E2B6E081E015968C9315972AEB30E3B4 -:1045F00028B939B92AE331E32AB93BB910B813B85D -:1046000012B816B817B811B8E0E0F9E010A211A27C -:104610002FEF30E026A337A32FEF3FEF20A731A7DE -:10462000808388E8838380E1848783E087831C9686 -:104630008C931C9782E01A968C9308951F920F9288 -:104640000FB60F92112408B60F9218BE0BB60F9238 -:104650001BBE8F939F93EF93FF93E0E0F9E01382EB -:104660008FE790E086AB97AB81E190E080AF91AFB0 -:10467000E0E0FAE010A211A28FEF9FEF86A397A3CC -:1046800089E88383168281E084878EE0808310929C -:104690002A06FF91EF919F918F910F900BBE0F9083 -:1046A00008BE0F900FBE0F901F9018951F920F928B -:1046B0000FB60F92112408B60F9218BE0BB60F92C8 -:1046C0001BBE2F933F938F939F93EF93FF93209164 -:1046D000280693B1267081E009F080E0990F892BBC -:1046E00083B982B1882309F464C012B883B187709A -:1046F000873059F51092000980E180930C091092DF -:10470000030A1B9B03C08CEA94E002C08CE694E091 -:104710008093260A9093270A82E081B981E08093F2 -:104720000C0A83E08093060A86B197B1877049F03E -:1047300090B18F5F893011F09695FBCFE8B1F9B158 -:10474000908381E08093422C37C093B1892F8C7085 -:1047500099F192FB992790F981E0982781B1811115 -:104760001BC080B18695911190E8892B80B926B144 -:1047700037B12F5F3F4F26B937B927703327232B27 -:10478000D9F4E8B1F9B19F012F5F3F4F28B939B98A -:10479000808381E081B910C081B1813069F4EAB1D0 -:1047A000FBB19F012F5F3F4F2AB93BB9908311B8EE -:1047B00003C082B1809582B988E880930309FF9194 -:1047C000EF919F918F913F912F910F900BBE0F9082 -:1047D00008BE0F900FBE0F901F9018951F920F925A -:1047E0000FB60F92112408B60F9218BE0BB60F9297 -:1047F0001BBE2F933F938F939F93EF93FF9381B1B2 -:10480000823008F49DC081B18D3008F099C0E1B1CB -:10481000F0E0EE0FFF1FEA5DFF4D0190F081E02D0B -:1048200019948FE790E08093260A9093270A88C016 -:104830008E9A8EE0809340088FE390E08093260A62 -:104840009093270A85E06FC08E9886E081B98FEF3C -:1048500082B914B815B8E8B1F9B1808180B970C0D7 -:10486000009B05C08E9A82B1809582B901C08E9856 -:1048700087E059C0009B02C08E9801C08E9A80B11B -:10488000869580B984B195B1019684B995B984B102 -:1048900095B187709927892B11F488E044C024B121 -:1048A00035B186B197B128173907B1F52BC0EAB1F8 -:1048B000FBB1309711F0808101C082B1882311F0E3 -:1048C0008E9A01C08E9889E02EC0EAB1FBB1309774 -:1048D00051F08081882311F08E9801C08E9A319614 -:1048E000EAB9FBB908C082B1882311F08E9801C0E3 -:1048F0008E9A8FEF82B924B135B186B197B128175E -:10490000390711F48AE00FC0E8B1F9B1CF0101967F -:1049100088B999B9818180B986E005C08E988BE00D -:1049200002C08E988CE081B90BC01092000A1092E0 -:10493000060A109240081092410881E08093432CAF -:10494000FF91EF919F918F913F912F910F900BBE0F -:104950000F9008BE0F900FBE0F901F901895CF9329 -:10496000DF93E2E4FCE210821182E0E4F6E0128AD6 -:1049700084E08283C0E8D1E082E68E83A0E2B6E0E4 -:1049800081E016968C93169711968C93119796E06A -:1049900012969C93129751968C93519742E052969F -:1049A0004C9352971A961C921A9733E019963C939F -:1049B00099E598839AE5998390E491839683A0EB97 -:1049C000B0E012962C911297207F12962C9312979A -:1049D00012962C911297226012962C9320E3218339 -:1049E0002683908B868345833183E0E0F8E083E182 -:1049F000818321E030E026A337A320A731A7E0E898 -:104A0000F8E014868083E0E2F3E01382118288E00C -:104A1000828391E1908320911E2030911F20208F6E -:104A2000318FE0E8F3E09CE392838083938381837A -:104A3000DF91CF91D5CDA0E2B6E01A961C921A97DD -:104A4000E2E4FCE210821182E0E0F9E010821382DD -:104A5000178280E18487E0E0FAE0108213821682F8 -:104A600081E08487E0E4F8E01082118216968C934E -:104A70008E980895CF93DF938091422C882309F478 -:104A80007EC01092422CC6B1D7B1C730D10508F410 -:104A900071C0AE01495F5F4F93E0569547959A9577 -:104AA000E1F7E091652EF091662E6AEB70E380E409 -:104AB0001995E091682EF091692E8781883019F45C -:104AC00083E180931F2C8681883019F483E18093E1 -:104AD0001E2CE0915B2EF0915C2EBE018AEB90E3E0 -:104AE0001995EC0194FF06C0DF7E8AE391E38AB951 -:104AF0009BB902C01AB81BB82097E1F1AE01495F1B -:104B00005F4F83E0569547958A95E1F7E091652ED2 -:104B1000F091662E6AEB70E381E41995E091682EBE -:104B2000F091692E8781893019F483E180931F2CDD -:104B30008681893019F483E180931E2CC6B9D7B9D8 -:104B40008AEB90E388B999B91092600810926108D5 -:104B50008FE090E0809366089093670888E090E08B -:104B600080936A0890936B0883E28093410883E006 -:104B700081B905C01092000A1092060A31DD8091B9 -:104B8000432C882329F01092432CDF91CF9128CD1C -:104B9000DF91CF910895CF93DF93E0E4F6E0128A9E -:104BA00084E08283C0E8D1E082E68E83A0E2B6E0B2 -:104BB00081E016968C93169711968C93119796E038 -:104BC00012969C93129751968C93519742E052966D -:104BD0004C9352971A961C921A9733E019963C936D -:104BE000199799E598839AE5998390E49183968340 -:104BF000C0EBD0E02A81207F2A832A8122602A8389 -:104C000020E321832683908B868345833183E0E0F4 -:104C1000F8E093E1918321E030E026A337A320A7B9 -:104C200031A7E0E8F8E014869083E0E2F3E0138235 -:104C3000118298E0928341E1408340911E2050917F -:104C40001F20408F518FE0E8F3E04CE342839083D4 -:104C50004383918315968C93E0E0F9E08FE790E031 -:104C600086A397A322A733A7108216828CE087839E -:104C70001092000A1092442CE7E4FCE210821282A7 -:104C80001182DF91CF91089581E08093260632DC76 -:104C9000E0E0F9E010821782E0E0FAE0108217828B -:104CA000E7E4FCE211821282108208951F920F92B3 -:104CB0000FB60F92112408B60F9218BE0BB60F92C2 -:104CC0001BBE2F933F938F939F93EF93FF93E0919E -:104CD000442CF0E0EE0FFF1FE05CFF4D0190F081EF -:104CE000E02D199410928C081092000886E18A95A4 -:104CF000F1F700C081E08093000883E080938C0886 -:104D000018B88091BA3086B917B882E001C083E044 -:104D10008093442C86C0309911C082B181110EC09D -:104D200010928C081092000896E19A95F1F700C055 -:104D300081E08093000883E080938C0884E0E8CFD2 -:104D4000309B10C010928C081092000886E18A9562 -:104D5000F1F700C081E08093000893E090938C0805 -:104D600082B901C012B886B1869586B984B195B171 -:104D7000019784B995B9892B11F485E001C083E0CE -:104D80008093442C87B18F5F87B9877009F049C041 -:104D9000E8B1EF5FE8B9F0E0E654FF4C808186B9F6 -:104DA00040C082B181110EC010928C081092000890 -:104DB00096E19A95F1F700C081E08093000883E0C6 -:104DC00080938C0886E0A4CF1092000982E591E0E0 -:104DD0000197F1F700C0000082E08093870389E328 -:104DE000809381038AEB90E38AB99BB981E090E0DC -:104DF00084B995B980E886B98EB19FB12091080435 -:104E000030910904822B932B8093452C9093462C50 -:104E100081E08093492C18B817B81092442C01C037 -:104E200000C0FF91EF919F918F913F912F910F9033 -:104E30000BBE0F9008BE0F900FBE0F901F901895DD -:104E40001F920F920FB60F92112408B60F9218BE40 -:104E50000BB60F921BBE2F933F934F935F938F938D -:104E60009F93EF93FF931092070A1092000A1092FB -:104E7000470910924009809181038E7F80938103BE -:104E800084B195B187709927892BC9F0E4B1F5B148 -:104E900086B144B155B193E0F695E7959A95E1F75F -:104EA000E654FF4C90E04770552728E030E0241B83 -:104EB000350B02C0959587952A95E2F7808381E0AE -:104EC0008093482C1092492C8FEF9FEF8093260AF5 -:104ED0009093270A1092200A1092210A1092060A33 -:104EE0001092070A1092030A84E08093000A87E078 -:104EF0008093442CFF91EF919F918F915F914F91FF -:104F00003F912F910F900BBE0F9008BE0F900FBED8 -:104F10000F901F9018951F920F920FB60F921124A9 -:104F200008B60F9218BE0BB60F921BBE8F93EF936D -:104F3000FF93E0E8F3E081818F7C8183E0E0FAE099 -:104F400088E8838381E08083FF91EF918F910F90B8 -:104F50000BBE0F9008BE0F900FBE0F901F901895BC -:104F60001F920F920FB60F92112408B60F9218BE1F -:104F70000BB60F921BBE2F933F934F935F938F936C -:104F80009F93EF93FF9380916009109260091092B4 -:104F9000610992E090934009813620F0813A08F04F -:104FA00063C077C086B1869586B984B195B1019604 -:104FB00084B995B987709927892B41F4EAB1FBB17F -:104FC000CF0101968AB99BB986B1808384B195B12E -:104FD00080FD88C0369986C01092070A1092000A98 -:104FE0001092470910924009809181038E7F80932F -:104FF000810384B195B187709927892BC9F0E4B1F9 -:10500000F5B186B144B155B193E0F695E7959A951F -:10501000E1F7E654FF4C90E04770552728E030E078 -:10502000241B350B02C0959587952A95E2F780835E -:1050300081E08093482C1092492C8FEF9FEF809352 -:10504000260A9093270A1092200A1092210A1092A1 -:10505000060A1092070A1092030A84E08093000A5D -:1050600087E08093442C3EC086B18695806886B9DF -:1050700084B195B1019684B995B987709927892B28 -:1050800041F4EAB1FBB1CF0101968AB99BB986B16F -:10509000808386B18695806886B984B195B1019682 -:1050A00084B995B987709927892B41F4EAB1FBB18E -:1050B000CF0101968AB99BB986B1808386B1869566 -:1050C00086B984B195B1019684B995B9877099274D -:1050D000892B41F4EAB1FBB1CF0101968AB99BB9A2 -:1050E00086B18083FF91EF919F918F915F914F9156 -:1050F0003F912F910F900BBE0F9008BE0F900FBEE7 -:105100000F901F901895BF92CF92DF92EF92FF926F -:105110000F931F93CF93DF93CDB7DEB7DA95CDBF53 -:10512000DEBF8091492C8823F1F08EB19FB1409170 -:105130000804509109042091452C3091462C842B71 -:10514000952B821B930B20912020309121202F5FE3 -:105150003F4F2817390738F414B815B881E0809309 -:10516000482C1092492CF3D9811144C1CCD9882301 -:1051700009F440C18091492C81113CC18091472C98 -:10518000811105C08091482C882309F433C1809196 -:10519000442C873041F48091200A9091210A853275 -:1051A000914008F427C18091482C882309F4A6C0B7 -:1051B00084B195B1892B09F4A1C084B195B1089748 -:1051C00018F414B815B89AC044B155B1495F5F4F8F -:1051D00063E0569547956A95E1F76AEB70E3CE0177 -:1051E00001960E941D568AEB90E38AB99BB904B1DF -:1051F00015B114B815B8C12CD12C73E1B72EE8E065 -:10520000EE2EF12CC016D10608F078C0F60153E05E -:10521000F695E7955A95E1F741E050E04C0F5D1F98 -:10522000E40FF51F8081982F969596959083837053 -:10523000813039F0E8F0823009F059C086B18695A6 -:1052400003C086B18695806886B984B195B1019610 -:1052500084B995B987709927892B09F048C0EAB1BC -:10526000FBB1CF0101968AB99BB986B180833FC05B -:1052700084B195B187709927892BC1F0E4B1F5B15C -:1052800086B124B135B143E0F695E7954A95E1F74B -:10529000E654FF4C90E027703327A701421B530BC5 -:1052A00002C0959587954A95E2F78083E091682E34 -:1052B000F091692E8781883011F4B0921F2C86817D -:1052C000883011F4B0921E2C44B155B1495F5F4F44 -:1052D00093E0569547959A95E1F7E091652EF09108 -:1052E000662E6AEB70E382E4199581E001C080E0EC -:1052F00052E0C50ED11C882309F484CF1092472CAC -:105300001092482C64B175B1E0915B2EF0915C2E47 -:105310008AEB90E3199584B995B984B195B1892B3D -:1053200009F468C089E0809381031092000A10920A -:10533000200A1092210A8FE790E08093260A90932A -:10534000270A8FE590E08093280A9093290A10920B -:10535000060A80E180930C0A93E09093070A10926A -:105360006009109261092FEF3FEF20936609309397 -:10537000670920E031E020936809309369091092B1 -:10538000460980934C0981E08093470981E180932D -:105390008001109288011092800310922906E091FA -:1053A000682EF091692E8781893019F483E180930A -:1053B0001F2C8681893019F483E180931E2C44B11F -:1053C00055B1495F5F4F83E0569547958A95E1F760 -:1053D000E091652EF091662E6AEB70E383E41995F7 -:1053E00081E08093442C12B8109220091092210978 -:1053F00080930009D395CDBFDEBFDF91CF911F9180 -:105400000F91FF90EF90DF90CF90BF90089514B868 -:1054100015B881E08093472C48C81092070A109273 -:10542000000A1092470910924009809181038E7FF3 -:105430008093810384B195B187709927892BC9F036 -:10544000E4B1F5B186B144B155B193E0F695E79575 -:105450009A95E1F7E654FF4C90E04770552728E015 -:1054600030E0241B350B02C0959587952A95E2F70D -:10547000808381E08093482C1092492C8FEF9FEF1E -:105480008093260A9093270A1092200A1092210AEC -:105490001092060A1092070A1092030A84E0809381 -:1054A000000A87E08093442C1092442C1092482CE0 -:1054B0001092472C1FC881E080934C2C10924A2CEC -:1054C000089581E080934C2C08950895CF92DF9247 -:1054D000EF92FF920F931F93CF93DF93CDB7DEB779 -:1054E0002597CDBFDEBF8C01FC01808190914C2CB3 -:1054F0009230F1F038F0943079F120F1953009F4E0 -:105500004AC049C121E09227292F217020934A2CBB -:10551000911102C0863219F0823509F03CC184E451 -:10552000F8018083118282E080934C2C80E134C1A9 -:1055300090914A2C911102C08632B1F0823509F067 -:105540004DC012C090914A2C911102C0863261F078 -:10555000823509F075C008C090914A2C911102C0A3 -:10556000863211F0823539F484E4F80180831182A7 -:1055700081E089270DC0803309F41BC1823A09F408 -:1055800034C1803A09F451C1803509F4F6C081E094 -:1055900080934C2C00C160E170E0C8010E9412347D -:1055A0008823A1F08091642E81110BC060914B2C57 -:1055B000F4E06F9FB001112444E050E0C8010E9464 -:1055C000FC0E84E080934C2C8AE004C084E080933D -:1055D0004C2C81E0F801808384E0DEC08339B9F689 -:1055E00019821A821B821C8288E8898343E050E07A -:1055F00060E070E0CE0102960E94AE0EF80181815B -:10560000803209F4ABC0803709F048C0F8019281BC -:1056100089819813C0C093818A819813BCC09481FA -:105620008B819813B8C095818C819813B4C084E0A5 -:10563000808361E070E0C8010E94E73383E02AC004 -:10564000853909F0A4CF44E050E064E070E0CE0179 -:1056500001960E94AE0EF8018181803209F47EC06D -:105660008037E1F4F80192818981981394C0938185 -:105670008A81981390C094818B8198138CC09581F6 -:105680008C81981388C0108261E070E0C8010E948C -:10569000E73384E080934C2C88E17EC0E82EE294CE -:1056A0009FE0E9222EEF2E0D8F70F82E88E090E01B -:1056B0008F1991094FEF50E06A0102C0D594C79449 -:1056C0008A95E2F7253021F0243059F5FF20E9F0E2 -:1056D00044E050E0B8016E5F7F4FCE0101962D830C -:1056E0000E9410562D81892B61F49A818981892726 -:1056F0009B8189279C818927F801968189278C21A4 -:1057000069F1243071F4F11046C044E050E0B80172 -:105710006E5F7F4FCE0101960E941056892BF1F0EB -:105720003AC02430C0F5E22EF12CA701B8016E5F1B -:105730007F4FCE0101960E941056892B61F5D8014A -:10574000AE0DBF1DE1E0F0E0EC0FFD1FEE0DFF1D03 -:1057500012969C9180818927C822E9F42981F80159 -:1057600020833A8131839B8192838C818383232799 -:1057700092278927848388E20FC0F80181818111F3 -:1057800042C062E070E0C8010E941234882309F42C -:1057900020CF10924C2C80E090E02596CDBFDEBF4C -:1057A000DF91CF911F910F91FF90EF90DF90CF90FD -:1057B0000895F801F18062E070E0C8010E9412349F -:1057C000882309F406CFFFE0FF15E8F084E0F89E97 -:1057D000B001112440E150E0C8010E94AE0E60E12A -:1057E00070E0C801F4D780E9D7CFF801F18066E016 -:1057F00070E0C8010E941234882309F4EACE8EEFCB -:105800008F0D8E3018F0F8011082E6CE8091642E54 -:105810008111DACEF4E0FF9EB001112444E050E0A3 -:10582000C80102960E94FC0ECFCEF801F18062E022 -:1058300070E0C801F7D7882309F4CBCE8EEF8F0D27 -:105840008E3008F7F0924B2C85E0BCCECF93DF93DF -:10585000EC0143E050E060E070E00E94AE0E44E0F6 -:1058600050E064E070E0CE010396DF91CF910C949C -:10587000AE0E0F931F93CF93DF931F921F92CDB75E -:10588000DEB78C01FC0190818181892798E8892706 -:10589000928189278A8394818381892795818927A9 -:1058A00096818927898343E050E060E070E0C80179 -:1058B0000E94FC0E41E050E063E070E0CE010296F1 -:1058C0000E94FC0E44E050E064E070E0C8010396E2 -:1058D0000E94FC0E41E050E068E070E0CE010196CD -:1058E0000E94FC0E0F900F90DF91CF911F910F91AE -:1058F000089581E08093702C84E090E080934F2C99 -:105900009093502C88E080934E2C10924D2C08954B -:1059100081E08093702C84E490E080934F2C9093EE -:10592000502C88E080934E2C10924D2C089581E0ED -:105930008093702C82E090E080934F2C9093502CB9 -:1059400088E180934E2C10924D2C089581E0809335 -:10595000702C089508958F929F92AF92BF92CF922C -:10596000DF92EF92FF920F931F93CF93DF93CDB708 -:10597000DEB76397CDBFDEBF8C015B018091702CD9 -:105980006730710501F5F8019081882311F0963296 -:1059900011F09235C1F421E0811120E020934D2CCB -:1059A00040914F2C3091502C211102C0963211F0B1 -:1059B000923539F4F801408331838FEF8093512C75 -:1059C00038C0A12CB12C853009F49CC050F4823031 -:1059D000A9F1C8F0833009F469C0843009F482C0A9 -:1059E000C2C5883009F425C138F4863009F49AC05C -:1059F000873009F4D3C0B7C5893009F44FC38D305F -:105A000008F471C3B0C591E08927982F91709093E5 -:105A10004D2C30914F2C2091502CF8019081811108 -:105A200002C0963219F0923509F019C4F80130839A -:105A3000218384E08093702C80E196C5F8018081F9 -:105A4000982F9D7F913419F48AE0808367C3803357 -:105A5000C1F462E070E0C801E5D6882309F49CC077 -:105A6000F8016181F0E16F9FB001112440E150E045 -:105A7000C8010E94AE0E60E170E0C801A8D680E9BE -:105A800073C5803A79F462E070E0C801CBD6882310 -:105A900009F482C0F80181818093672C83E08093B0 -:105AA000702CD2CF803509F05EC552C060E170E045 -:105AB000C801B8D6882389F08091642E81110BC06B -:105AC0006091672CF0E16F9FB001112440E150E03C -:105AD000C8010E94FC0E8AE001C081E0F8018083C9 -:105AE00082E01AC390914D2C30914F2C2091502C74 -:105AF000F8018081911102C0863211F1823509F0DE -:105B0000B6C31EC090914D2C30914F2C2091502C3B -:105B1000F8018081911102C0863291F0823509F03E -:105B200053C40EC090914D2C30914F2C2091502C8D -:105B3000F8018081911102C0863211F0823531F472 -:105B4000F8013083218381E0892786C38035C9F439 -:105B5000F8018181882319F0F8011082DFC262E028 -:105B600070E0C8015FD68823B9F0E091652EF0910E -:105B7000662E40E060E070E081E919951092702C8B -:105B8000F2C490EA980F923008F0C1C462E070E06D -:105B9000C80148D68111EAC481E054C2C8010E94FC -:105BA000E53964E07801F4E0EF0EF11CC7010E94D2 -:105BB000FC3CE091652EF091662E44E0B70180EA4E -:105BC0001995F80194818091682C981329C09581CA -:105BD0008091692C981324C0968180916A2C981327 -:105BE0001FC0978180916B2C98131AC080916C2CE8 -:105BF000808380916D2C818380916E2C8283809133 -:105C00006F2C838364E0C8010E94EE3EE091652E14 -:105C1000F091662E44E0B80181EA199588E009C246 -:105C2000E091652EF091662E44E068E67CE280EC1F -:105C300032C2F8018081803551F48181811107C021 -:105C40008281873521F483818D3C09F40AC264E0A6 -:105C5000C8010E94FC3CF8018081803309F0C2C079 -:105C600062E070E0C801DED5882309F4ACC0F80119 -:105C7000618167FD04C0862F8370833029F0862FF1 -:105C80008F708F3009F084C06093672C8091522C04 -:105C90009091532C3091542C282F22952095422FEF -:105CA0004927407F09F043C023272F7009F03FC0E8 -:105CB000929590959327907FD1F5262F67FD02C08E -:105CC000237003C02F7009F023E0982F9095432F85 -:105CD00042954F702223C1F0892F90E0022E02C01E -:105CE000959587950A94E2F7982FE32FF0E0022E1E -:105CF00002C0F595E7950A94E2F73E2F50E002C006 -:105D0000559547952A95E2F740FBCC24C0F8D12C55 -:105D1000CC0CDD1CCC0CDD1C30FBEE24E0F8F12CAF -:105D2000EE0CFF1CEC28892F81708E2901C087E0C2 -:105D30002091662C30E0280F311D280F311DF9010C -:105D4000E05BFF4D8081F8019801205F3F4F119289 -:105D5000E217F307E1F79091552CF801918782FF44 -:105D600009C09091522C96839091532C97839091D7 -:105D7000542C908784FF15C06360F0E16F9FB001E1 -:105D80001124665F7F4F46E050E0C8010A9607C0C5 -:105D900080E1689FB001112440E150E0C8010E94F9 -:105DA000AE0E60E170E0C80112D5E091652EF09171 -:105DB000662E42E1B80180E8199562E1C8010E94AF -:105DC000EE3E80E939C10E94073C91E08927F80145 -:105DD0008083E091652EF091662E44E0B80181EC5D -:105DE00019959CC1803A61F462E070E0C8011AD54F -:105DF0008823D9F1F80181818093672C89E00DC057 -:105E0000803C89F462E070E0C8010CD5882369F118 -:105E1000F80181818093672C8BE08093702C0E9425 -:105E2000073C9AE00EC1813C91F462E070E0C80149 -:105E3000F9D48823D1F0F80181818093672C4AE05E -:105E4000F42EF092702C0E94073C8F25FBC0823C00 -:105E500099F462E070E0C801E5D4882331F0F801DC -:105E600081818093672C8CE0D8CFE091652EF091F2 -:105E7000662E44E0B80121C0803B11F562E070E07D -:105E8000C801D0D4E091652EF091662E44E0B801AF -:105E9000882399F086E819958091642E8111BFCFEF -:105EA000F8016181F0E16F9FB001112440E150E001 -:105EB00086E59CE20E94FC0EB2CF81EC1995BEC033 -:105EC00090EA980F923008F0BFC062E070E0C8011D -:105ED000A9D4882309F4B2C0F8018081803621F06A -:105EE0003AE3C32ED12C03C020E3C22ED12CF801FB -:105EF000818187FF0CC0807FF0E18F9F70011124AA -:105F000080ECC80ED11C96EFA92EB12C08C08C7F56 -:105F100090E1899F7001112486E3A82EB12CE091B5 -:105F2000652EF091662E42E0B80180E91995F801DE -:105F3000808181708093662CC701B4E09695879527 -:105F4000BA95E1F78093672C9091512C981769F0DE -:105F5000B7016A0D7B1D44E050E082E59CE20E949F -:105F6000AE0E8091672C8093512C68E0CE01019693 -:105F70000E94EC0D8091632E44E050E0873019F4CC -:105F800063E070E002C060E070E0CE010F960E9416 -:105F9000AE0EB7016C0D7D1D46E050E0CE010996B6 -:105FA0000E94AE0E89818093682C8A818093692C2F -:105FB0008B8180936A2C8C8180936B2C60E488E6C3 -:105FC0009CE20E9434418091682C80936C2C8091DB -:105FD000692C80936D2C80916A2C80936E2C80911B -:105FE0006B2C80936F2C60E28CE69CE20E94344123 -:105FF00020E0AE014F5F5F4FBE01615F7F4FCE017A -:106000000996F7D68981F80180838A8181838B8103 -:1060100082838C818383E058FF4F8D81808331960A -:106020008E81808331968F818083319688858083AD -:1060300087E08093702C80E290E174C30E94073C5B -:1060400091E08927F80101CD8035B9F4F80181810B -:10605000811182CD62E070E0C801E4D3882309F4A5 -:106060009BCD1092702CE091652EF091662E40E051 -:1060700060E070E081E9199576C2A501495F5F4F44 -:10608000A3E056954795AA95E1F7E091652EF0912A -:10609000662EB80182E9199581E0DEC062E1C8018F -:1060A0000E94FC3C60E170E0C801BCD3E091652E29 -:1060B000F091662E882329F142E1B80181E8199513 -:1060C0008091642E81110BC06091672CF0E16F9F6D -:1060D000B001112440E150E0C8010E94FC0E0E9472 -:1060E000073C9AE015C066E0C8010E94FC3C64E0F1 -:1060F00070E0C80197D3811113C0E091652EF09133 -:10610000662E44E0B80181EC19950E94073C91E0AD -:106110008927F801808388E08093702C84E024C272 -:106120006091672CF0E16F9FB001112440E150E0D5 -:1061300086E59CE20E94AE0E9091562C80915A2CDE -:1061400080959813EBC280915E2C9813E7C2209142 -:10615000572C80915B2C80952813E0C280915F2C96 -:106160002813DCC2C090582C80915C2C8095C812FA -:10617000D5C28091602CC812D1C28091592C309127 -:106180005D2C30958313CAC23091612C8313C6C233 -:106190004091622C3091632C30954313BFC23091F3 -:1061A000642C4313BBC23091652C30954313B6C2A7 -:1061B000F801308141818280912CA12CB12C5401B5 -:1061C00099248824942A832A3381B32AD12CE12C60 -:1061D000F12C7601DD24CC24D22AC92AF82A809118 -:1061E000702C8B3009F07FC2E091652EF091662E05 -:1061F00046E0B80185E81995C818D908EA08FB08EF -:10620000C092562C33272F2D1E2D0D2D0093572C69 -:10621000A701662777274093582C8F2D9927AA2707 -:10622000BB278093592CEC2DE095E0935A2CE02F5E -:10623000E095E0935B2CE42FE095E0935C2CE82F55 -:10624000E095E0935D2CC0925E2C00935F2C409310 -:10625000602C8093612C88E08093702C84C19034F2 -:1062600009F081C182E08093702C8AE0EBCE833903 -:1062700009F084CC8091632E873009F0A0C043E000 -:1062800050E060E070E0CE0102960E94AE0E88E819 -:106290008983F8019181903219F0903761F024C020 -:1062A000F80180833A8131832B8122839C819383FF -:1062B0002327822728C1F8018281883809F053C139 -:1062C00093818A8198134FC194818B8198134BC11C -:1062D00095818C81981347C184E0808361E070E0F0 -:1062E000C80175D285E09EC0E92EE2942FE0E2223B -:1062F0002EEF2E0D9F70F92E88E090E08F199109F6 -:106300004FEF50E06A0102C0D594C7948A95E2F736 -:10631000253021F0243059F5FF20E9F044E050E029 -:10632000B8016E5F7F4FCE0101962B8B0E941056F5 -:106330002B89892B61F49A818B81892798E8892799 -:106340009C818927F801968189278C2181F124304D -:1063500071F4F11008C144E050E0B8016E5F7F4F66 -:10636000CE0101960E941056892B09F1FCC0243001 -:1063700008F0F9C0E22EF12CA701B8016E5F7F4F43 -:10638000CE0101960E941056892B09F0ECC0D8016D -:10639000AE0DBF1DE1E0F0E0EC0FFD1FEE0DFF1DA7 -:1063A00012969C9180818927C82209F0DCC098E868 -:1063B000F80190833A8131832B812283A0C044E08D -:1063C00050E060E070E007C0853909F0D7CB44E0C9 -:1063D00050E063E070E0CE0101960E94AE0E909115 -:1063E0004E2CF8018181803209F482C08037F1F4AB -:1063F000F801228189812813B6C023818A8128135C -:10640000B2C024818B812813AEC025818C812813D2 -:10641000AAC0908361E070E0C801D9D18FEF80936A -:10642000512C86E08093702C88E19EC0E82EE29487 -:106430009FE0E9222EEF2E0D8F70F82E88E090E07D -:106440008F1991094FEF50E06A0102C0D594C794AB -:106450008A95E2F7253021F0243059F5FF20E9F044 -:1064600044E050E0B8016E5F7F4FCE0101962B8B68 -:106470000E9410562B89892B61F49A818981892782 -:106480009B8189279C818927F801968189278C2106 -:1064900079F1243071F4F11066C044E050E0B801A5 -:1064A0006E5F7F4FCE0101960E941056892B01F13D -:1064B0005AC0243008F057C0E22EF12CA701B801D1 -:1064C0006E5F7F4FCE0101960E941056892B09F016 -:1064D0004AC0D801AE0DBF1DE1E0F0E0EC0FFD1F9A -:1064E000EE0DFF1D12969C9180818927C822D9F557 -:1064F0002981F80120833A8131839B8192838C81A9 -:106500008383232792278927848388E22DC0823CB6 -:1065100009F0CBC0F8019181903E09F0C8C092818A -:10652000943B09F0C4C046E050E06AEA74E0CE0152 -:1065300001960E94AE0E89818B3409F02DCB8A81A1 -:10654000893709F029CB8B818B3109F025CB8C81E0 -:106550008A3E09F021CB8D818B3709F01DCB8E81CE -:106560008C3C09F019CB80E090E0DCC0F801808120 -:10657000803621F08AE3C82ED12C03C0B0E3CB2EA5 -:10658000D12CF801818187FF0CC0807FF0E18F9FC3 -:106590007001112480ECC80ED11CA6EFAA2EB12CDC -:1065A00008C08C7F90E1899F70011124F6E3AF2E23 -:1065B000B12CE091652EF091662E42E0B80180E9A1 -:1065C0001995F801808181708093662CC701E4E001 -:1065D00096958795EA95E1F78093672CB7016A0D48 -:1065E0007B1D44E050E082E59CE20E94AE0E80916B -:1065F000672C8093512C68E0CE0101960E94EC0D2F -:106600008091632E44E050E0873019F463E070E03D -:1066100002C060E070E0CE010F960E94AE0EB7019E -:106620006C0D7D1D46E050E0CE0109960E94AE0E35 -:1066300089818093682C8A818093692C8B818093D7 -:106640006A2C8C8180936B2C60E488E69CE20E942B -:1066500034418091682C80936C2C8091692C8093BC -:106660006D2C80916A2C80936E2C80916B2C809382 -:106670006F2C60E28CE69CE20E94344187E08093BC -:10668000702C8981F80180838A8181838B81828348 -:106690008C818383AE014F5F5F4FBE01615F7F4F8F -:1066A000CE010996F0D080E25FCF803339F0982F89 -:1066B0009F7E903A19F0805C833078F481E080937B -:1066C000702C84E0F8018083E091652EF091662EB5 -:1066D00040E060E070E082EC83CBE091652EF091C9 -:1066E000662E40E0D6CC8A3069F4E091652EF091B8 -:1066F000662E46E0B80184E81995C80CD91CEA1C3E -:10670000FB1C7ECD8C3009F07BCDE091652EF091A5 -:10671000662E46E0B80187E8199572CD0E94073CC5 -:1067200096E0F6CC6396CDBFDEBFDF91CF911F918F -:106730000F91FF90EF90DF90CF90BF90AF909F9020 -:106740008F900895CF93DF932091632E273071F4BB -:10675000EC0143E050E060E070E00E94AE0E44E0E7 -:1067600050E063E070E0CE01039604C044E050E0E6 -:1067700060E070E0DF91CF910C94AE0ECF93DF9389 -:106780001F92CDB7DEB72091632E273029F447E062 -:1067900050E060E070E015C0FC01318120812327CA -:1067A0003281232733812327298344E050E060E0AE -:1067B00070E00E94FC0E41E050E064E070E0CE0129 -:1067C00001960E94FC0E0F90DF91CF91089520E476 -:1067D0002093D00026EC2093D5002093D40021E014 -:1067E0002093D000DC01680F791FA617B70741F08E -:1067F000ED91F0E0EC59FA4FE491E093D300F5CF3E -:10680000E091D500F0E0EC59FA4FE491EC93E0917F -:10681000D400F0E0EC59FA4FE4911196EC93109209 -:10682000D000089520E42093D00026EC2093D500DA -:106830002093D40021E02093D000DC01680F791F61 -:10684000A617B70741F0ED91F0E0EC59FA4FE4914B -:10685000E093D300F5CFE091D500F0E0EC59FA4F8A -:10686000E4918C918E130AC0E091D400F0E0EC59D1 -:10687000FA4FE49181E011969C919E1380E0109272 -:10688000D000817008958F929F92AF92BF92CF9265 -:10689000DF92EF92FF920F931F93CF93DF93DC0170 -:1068A0008C9110E0E0E0869517958695E7958695A2 -:1068B00017958695E795869517958695E79586951C -:1068C00017958695E79511968C9111978695179552 -:1068D0008695E795869517958695E79586951795FC -:1068E0008695E795869517958695E79512968C91EE -:1068F0001297F0E030E08695F79586953795869566 -:10690000F795869537958695F7958695379586956B -:10691000F7958695379513968C9113978695F795ED -:10692000869537958695F795869537958695F7954B -:10693000869537958695F7958695379514968C911B -:10694000149790E020E086959795869527958695F3 -:1069500097958695279586959795869527958695FB -:1069600097958695279515968C91869597958695FA -:1069700027958695979586952795869597958695DB -:10698000279586959795869527955B01DA014A01AB -:1069900044E0840E911C6C91E50179915E017627AB -:1069A000C32ED12CA60140545E4DEE2EF12CE701F2 -:1069B000C054DF4D7E01EA01D880E7010881ED2C4B -:1069C000E02AC22ED12CA60140545D4DEA01088177 -:1069D000E02AF12CA70140565F4DEA010881069597 -:1069E0008795DF2FD071FD2E012F017EF026092F14 -:1069F0000072F0260E2F0479F026032F0377F0267D -:106A0000022F0A73F0260F2D0295F0260F2D069502 -:106A10000695F0260F2D0727F6940F2506959795D6 -:106A2000F79517957695CF2ED12CA60140545E4D43 -:106A3000E12EF12CE701C054DF4D7E01EA01D88040 -:106A4000E7010881ED2CE02AC92ED12CA601405483 -:106A50005D4DEA010881E02AF12CA70140565F4D07 -:106A6000EA01088106958795D32FD071FD2E0E2F50 -:106A7000017EF026022F0072F026012F0479F02605 -:106A80000F2F0377F026092F0A73F0260F2D02959A -:106A9000F0260F2D06950695F0260F2D0727F69464 -:106AA0000F25069527953795E7957695C32ED12C1A -:106AB000A60140545E4DEE2EF12CE701C054DF4D8F -:106AC0007E01EA01D880E7010881ED2CE02AC22E80 -:106AD000D12CA60140545D4DEA010881E02AF12C39 -:106AE000A70140565F4DEA01088106958795DF2F83 -:106AF000D071FD2E012F017EF026092F0072F026A5 -:106B00000E2F0479F026032F0377F026022F0A7345 -:106B10000F25F02EF2940F25F02EF694F6940F2503 -:106B2000F02EF72606950F25D12E102F1695979546 -:106B3000F795D79476950F2F10E0A80140545E4D3D -:106B40000D2D10E000541F4DEA01F880E801188176 -:106B50000F2D012BE92EF12CA70140545D4DEA01C8 -:106B60001881012B10E000561F4DE8011881169581 -:106B70008795032F00711E2F117E0127122F10728F -:106B800001271D2D147901271F2F13770127192F96 -:106B90001A730127102F12950127102F169516959D -:106BA0000127102F1727069510271695279537953B -:106BB000E7957695032F10E0A80140545E4D0E2F07 -:106BC00010E000541F4DEA01F880E80118810F2DF4 -:106BD000012BE22EF12CA70140545D4DEA011881F2 -:106BE000012B10E000561F4DE8011881169587957E -:106BF0000F2F00711D2D117E0127192F10720127F3 -:106C00001E2F14790127132F13770127122F1A73C0 -:106C10000127102F12950127102F16951695012781 -:106C2000102F172706950127102F16959795F79582 -:106C3000D79476950F2F10E0A80140545E4D0D2D8E -:106C400010E000541F4DEA01F880E80118810F2D73 -:106C5000012BE92EF12CA70140545D4DEA0118816A -:106C6000012B10E000561F4DE801188116958795FD -:106C7000032F00711E2F117E0127122F1072012782 -:106C80001D2D147901271F2F13770127192F1A7330 -:106C90000127102F12950127102F16951695012701 -:106CA000102F172706951027169527953795E795E6 -:106CB0007695032F10E0A80140545E4D0E2F10E092 -:106CC00000541F4DEA01F880E80118810F2D012BB7 -:106CD000E22EF12CA70140545D4DEA011881012BF1 -:106CE00010E000561F4DE8011881169587950F2F6B -:106CF00000711D2D117E1027092F007210270E2FF5 -:106D000004791027032F03771027022F0A73102707 -:106D1000012F02951027012F069506951027012FA8 -:106D20000727169501271D2D06959795F795179519 -:106D3000CF2ED12CA60140545E4DE12EF12CE7015F -:106D4000C054DF4D7E01EA01D880E7010881ED2CB7 -:106D5000E02AC92ED12CA60140545D4DEA010881DC -:106D6000E02AF12CA70140565F4DEA010881069503 -:106D70008795D32FD071FD2E0E2F017EF026022F86 -:106D80000072F026012F0479F0260F2F0377F026EA -:106D9000092F0A730F25F02EF2940F25F02EF6948A -:106DA000F6940F257695702706957027769527958A -:106DB0003795E79568276D93A815B90509F0EBCDD0 -:106DC0001093712CF093722C9093732CE093742C8D -:106DD0003093752C2093762CDF91CF911F910F91DA -:106DE000FF90EF90DF90CF90BF90AF909F908F90EB -:106DF00008954F925F926F927F929F92AF92BF924F -:106E0000CF92DF92EF92FF920F931F93CF93DF9376 -:106E1000DC018C9110E0B12CEB2D8695E7958695E1 -:106E200017958695E795869517958695E7958695A6 -:106E300017958695E7958695179511968C911197DC -:106E4000BE2E8695B794869517958695B7948695A8 -:106E500017958695B794869517958695B7948695D8 -:106E6000179512969C91129730E080E09695879541 -:106E70009695379596958795969537959695879596 -:106E800096953795969587959695379513969C91F7 -:106E90001397969587959695379596958795969598 -:106EA0003795969587959695379596958795969566 -:106EB00037951496EC91149790E000E0E6950795CD -:106EC000E6959795E6950795E6959795E695079546 -:106ED000E6959795E6950795E69597951596DC9036 -:106EE000D6940795D6949795D6940795D69497956A -:106EF000D6940795D6949795D6940795D69497955A -:106F0000E32FF0E0E054FE4DA12FB0E0A054BF4DC0 -:106F1000F081EC91EF2BA92FB0E0A054BD4DFC9176 -:106F2000EF2BF0E0E056FF4DE0802B01BA016C5FE3 -:106F30007F4FDA013B01AC90E201C9902E01CA24D7 -:106F4000FD2DE694F795D82FD071FD2EEB2DE17E27 -:106F5000FE26E02FE072FE26E12FE479FE26E32FE5 -:106F6000E377FE26E92FEA73EF25FE2EF294EF2554 -:106F7000FE2EF694F694EF25FE2EFC24E695FE26D2 -:106F8000EB2D20FDFE24F69407958795E795BC2C04 -:106F9000B694C82ED12CA60140545E4DEE2EF12C95 -:106FA000E701C054DF4D7E01EA01D880E701F88097 -:106FB000ED2CEF28C02ED12CA60140545D4DEA01E6 -:106FC000F880EF28F12CA70140565F4DEA01D880E8 -:106FD000D694F795D32FD071ED2E412F417EE42624 -:106FE000592F5072E526CE2FC479EC26D82FD377AF -:106FF000ED26402F4A73E426FE2CF294EF24FE2C5B -:10700000F694F694EF24FE2CFB24E694FE2420FD57 -:10701000FD24F694979537951795B694C32ED12CE9 -:10702000E601C054DE4DE12EF12CA70140545F4D26 -:10703000D880EA01F880ED2CEF28C92ED12CA601CA -:1070400040545D4DEA01F880EF28F12CA70140562D -:107050005F4DEA01D880D694F795D82FD071ED2EE8 -:107060004E2F417EE426502F5072E526C12FC47961 -:10707000EC26D32FD377ED26492F4A73E426FE2C36 -:10708000F294EF24FE2CF694F694EF24FE2CFB24CD -:10709000E694FE2420FDFD24F69407958795E79558 -:1070A000B694C82ED12CE601C054DE4DEE2EF12C44 -:1070B000A70140545F4DD880EA01F880ED2CEF28FD -:1070C000C02ED12CA60140545D4DEA01F880EF2876 -:1070D000F12CA70140565F4DEA01D880D694F79570 -:1070E000D32FD071ED2E412F417EE426592F5072BF -:1070F000E526CE2FC479EC26D82FD377ED26402F66 -:107100004A73E426FE2CF294EF24FE2CF694F694B7 -:10711000EF24FE2CFB24E694FE2420FDFD24F694AF -:10712000979537951795B694C32ED12CE601C05488 -:10713000DE4DE12EF12CA70140545F4DD880EA01CD -:10714000F880ED2CEF28C92ED12CA60140545D4DBE -:10715000EA01F880EF28F12CA70140565F4DEA01C3 -:10716000D880D694F795D82FD071ED2E4E2F417E32 -:10717000E426502F5072E526C12FC479EC26D32F78 -:10718000D377ED26492F4A73E426FE2CF294EF24A0 -:10719000FE2CF694F694EF24FE2CFB24E694FE24B9 -:1071A00020FDFD24F69407958795E795B694C82EA3 -:1071B000D12CE601C054DE4DEE2EF12CA701405437 -:1071C0005F4DD880EA01F880ED2CEF28C02ED12C3D -:1071D000A60140545D4DEA01F880EF28F12CA7018B -:1071E00040565F4DEA01D880D694F795D32FD071E1 -:1071F000ED2E412F417EE426592F5072E526CE2FE9 -:10720000C479EC26D82FD377ED26402F4A73E42695 -:10721000FE2CF294EF24FE2CF694F694EF24FE2C30 -:10722000FB24E694FE2420FDFD24F69497953795E3 -:1072300017959B2C9694C32ED12CE601C054DE4D9D -:10724000E12EF12CA70140545F4DD880EA01F8806F -:10725000ED2CEF28C92ED12CA60140545D4DEA013A -:10726000F880EF28F12CA70140565F4DEA01D88045 -:10727000D694F795D82FD0714E2F417EF42EFD264F -:10728000502F5072F526C12FC479FC26D32FD37707 -:10729000FD26492F4A73F426EF2CE294FE24EF2CAE -:1072A000E694E694FE24EF2CE924F694FE24BE2E08 -:1072B000EF2D20FDED25E69507958795B794C82E0F -:1072C000D12CE601C054DE4DEB2CF12CA70140542B -:1072D0005F4DD880EA01E881ED2CEE2AC02ED12C3A -:1072E000A60140545D4DEA01E881EE2AF12CA70188 -:1072F00040565F4DEA01F880DF2EF694D794F32FC5 -:10730000F071E12FE17EEF27F92FF072EF27FB2DCF -:10731000F479EF27F82FF377EF27F02FFA73EF27A1 -:10732000FE2FF295EF27FE2FF695F695EF27969410 -:107330009E26E6959E2620FD9F2496949795379548 -:107340001795E32FF0E0AF0140545E4DE12FF0E0E0 -:10735000E054FF4DEA01F880E081EF29E92EF12C9D -:10736000A70140545D4DEA01F881EF2BF0E0E056B3 -:10737000FF4DE080EA2DF0E0EC59FB4FE491EE2563 -:10738000E301E9933E01AD24AD92A617B70709F0DA -:10739000D2CDB092712C8093722C0093732C1093E9 -:1073A000742C3093752C9093762CDF91CF911F9194 -:1073B0000F91FF90EF90DF90CF90BF90AF909F9094 -:1073C0007F906F905F904F900895AF92BF92CF9251 -:1073D000DF92EF92FF920F931F93CF93DF93609111 -:1073E000712C5091722C2091732C4091742C3091FF -:1073F000752CD091762CFC015C0104E0A00EB11C30 -:107400008191C52FC071962F917EC927922F9072BE -:10741000C927942F9479C927932F9377C9279D2F34 -:107420009A73C9277C2F7295C7277C2F76957695FE -:10743000C727A32FB0E08D0100541E4D6801A42F73 -:10744000B0E08D0100541F4D7801D6010C91D70199 -:107450009C91092BED2EF12CD701A054BD4D9C9190 -:10746000092B10E000561F4DD8017C9178277C270E -:10747000C6957C2786957695279557956795C32F52 -:10748000C071942F917EC9279D2F9072C927962F86 -:107490009479C927952F9377C927922F9A73C92773 -:1074A0007C2F7295C7277C2F76957695C727052F59 -:1074B00010E0D801A054BE4D6D01062F10E0D80198 -:1074C000A054BF4D7D01D6010C91D7019C91092B91 -:1074D000E22EF12CD701A054BD4D9C91092B10E058 -:1074E00000561F4DD8017C9178277C27C6957C27B4 -:1074F00086959D2F7695979537954795C52FC071A1 -:10750000762F717EC727722F7072C727742F7479F8 -:10751000C727732F7377C727792F7A73C7277C2FD5 -:107520007295C7277C2F76957695C727032F10E095 -:10753000D801A054BE4D6D01042F10E0D801A05415 -:10754000BF4D7D01D6010C91D7017C91072BE92E0F -:10755000F12CD701A054BD4D7C91072B10E00056B3 -:107560001F4DD8017C9178277C27C6957C2786956E -:107570007695279557956795C32FC071742F717EA7 -:10758000C727792F7072C727762F7479C727752F71 -:107590007377C727722F7A73C7277C2F7295C727F7 -:1075A0007C2F76957695C727052F10E0D801A0543B -:1075B000BE4D6D01062F10E0D801A054BF4D7D01D6 -:1075C000D6010C91D7017C91072BE22EF12CD7012B -:1075D000A054BD4D7C91072B10E000561F4DD801E3 -:1075E0007C9178277C27C6957C27869576959795FC -:1075F00037954795C52FC071762F717EC727722F9B -:107600007072C727742F7479C727732F7377C727B2 -:10761000792F7A73C7277C2F7295C7277C2F769591 -:107620007695C727032F10E0D801A054BE4D6D01F9 -:10763000042F10E0D801A054BF4D7D01D6010C915C -:10764000D7017C91072BE92EF12CD701A054BD4D19 -:107650007C91072B10E000561F4DD8017C917827B4 -:107660007C27C6957C2786957695279557956795AF -:10767000C32FC071742F717EC727792F7072C727EF -:10768000762F7479C727752F7377C727722F7A7370 -:10769000C7277C2F7295C7277C2F76957695C727AD -:1076A000052F10E0D801A054BE4D6D01062F10E04B -:1076B000D801A054BF4D7D01D6010C91D7017C911A -:1076C000072BE22EF12CD701A054BD4D7C91072B46 -:1076D00010E000561F4DD8017C9178277C27C69575 -:1076E0007C2786957695979537954795C52FC071D8 -:1076F000762F717EC727722F7072C727742F747907 -:10770000C727732F7377C727792F7A73C7277C2FE3 -:107710007295C7277C2F76957695C727032F10E0A3 -:10772000D801A054BE4D6D01042F10E0D801A05423 -:10773000BF4D7D01D6010C91D7017C91072BE92E1D -:10774000F12CD701A054BD4D7C91072B10E00056C1 -:107750001F4DD8017C9178277C27C6957C2776958C -:10776000279557956795C32FC071742F717E7C271D -:10777000C92FC0727C27C62FC4797C27C52FC37739 -:107780007C27C22FCA737C27C72FC2957C27C72F9F -:10779000C695C6957C278695C52FD0E0C054DE4D92 -:1077A000062F10E000541F4DD881D801CC91CD2B6D -:1077B000022F10E000541D4DD801DC91CD2BD0E0FC -:1077C000C056DF4DC8818C27872776958727D92F0C -:1077D0008695D79537954795EA15FB0509F010CEA4 -:1077E0006093712C5093722C2093732C4093742CC3 -:1077F0003093752CD093762CDF91CF911F910F9100 -:10780000FF90EF90DF90CF90BF90AF900895CF930F -:10781000DF93E1E7FCE2A081718162813381248101 -:107820009581472F40718A2F817E8427462F407291 -:107830008427432F44798427422F43778427492F75 -:107840004A738427482F42958427482F46954695AA -:107850008427482F46958427869567957795A79521 -:10786000C22FD0E0C054DE4D432F50E040545F4D56 -:10787000B881EA018881B82B492F50E040545D4D12 -:10788000EA018881CB2FC82BD0E0C05ADF4D888118 -:107890008695522F5071432F417E4527592F5072A4 -:1078A00045275A2F54794527572F53774527562F69 -:1078B0005A734527542F52954527542F5695569560 -:1078C0004527542F569545274695979527953795E3 -:1078D000C72FD0E0C054DE4D4A2F50E040545F4DDA -:1078E000B881EA014881B42B462F50E040545D4DE9 -:1078F000EA014881CB2FC42BD0E0C05ADF4D48812C -:10790000842B8695572F50714A2F417E4527562F3D -:1079100050724527532F54794527522F53774527C7 -:10792000592F5A734527542F52954527542F569552 -:1079300056954527542F5695452746956795779533 -:10794000A795C22FD0E0C054DE4D432F50E04054E5 -:107950005F4DB881EA014881B42B492F50E0405473 -:107960005D4DEA014881CB2FC42BD0E0C05ADF4DDA -:107970004881842B8695C72FD0E0C054DE4D4A2F16 -:1079800050E040545F4DB881EA014881B42B462F46 -:1079900050E040545D4DEA014881CB2FC42BD0E02C -:1079A000C05ADF4D4881842B522F5071432F417EA6 -:1079B0004527592F507245275A2F54794527572F5D -:1079C00053774527562F5A734527542F52954527ED -:1079D000542F569556954527542F5695452746952D -:1079E000979527953795A08371836283338324838A -:1079F0009583DF91CF9108950F931F93CF93DF93DA -:107A0000A091712C7091722C2091732C5091742C38 -:107A10004091752C3091762CFC01615008F4CDC159 -:107A2000972F90718A2F817E8927922F90728927B4 -:107A3000952F94798927942F93778927932F9A7379 -:107A40008927982F92958927982F9695969589271B -:107A5000982F96958927869527957795A795C42F72 -:107A6000D0E0C054DE4D852F90E080549F4DB8810A -:107A7000EC018881B82B832F90E080549D4DEC0160 -:107A80008881CB2FC82BD0E0C058DF4DB881B69588 -:107A9000942F9071852F817E8927932F907289274B -:107AA0009A2F94798927972F93778927922F9A7302 -:107AB0008927982F92958927982F969596958927AB -:107AC000982F969589278695379547955795C72F6F -:107AD000D0E0C054DE4D8A2F90E080549F4D188135 -:107AE000EC018881182B822F90E080549D4DEC0191 -:107AF0008881C12FC82BD0E0C058DF4D8881B82BBA -:107B0000B695972F90718A2F817E8927922F907238 -:107B10008927952F94798927942F93778927932FF5 -:107B20009A738927982F92958927982F96959695DD -:107B30008927982F96958927869527957795A795D4 -:107B4000C42FD0E0C054DE4D852F90E080549F4D6F -:107B50001881EC018881182B832F90E080549D4D73 -:107B6000EC018881C12FC82BD0E0C058DF4D88813F -:107B7000B82BB695942F9071852F817E8927932FEE -:107B8000907289279A2F94798927972F937789273D -:107B9000922F9A738927982F92958927982F9695D7 -:107BA00096958927982F9695892786953795479595 -:107BB0005795C72FD0E0C054DE4D8A2F90E08054F7 -:107BC0009F4D1881EC018881182B822F90E0805402 -:107BD0009D4DEC018881C12FC82BD0E0C058DF4DEE -:107BE0008881B82BB695972F90718A2F817E89272F -:107BF000922F90728927952F94798927942F9377C4 -:107C00008927932F9A738927982F92958927982FE0 -:107C1000969596958927982F9695892786952795E5 -:107C20007795A795C42FD0E0C054DE4D852F90E006 -:107C300080549F4D1881EC018881182B832F90E090 -:107C400080549D4DEC018881C12FC82BD0E0C058D5 -:107C5000DF4D8881B82BB695942F9071852F817E4A -:107C60009827832F807298278A2F84799827872FC7 -:107C700083779827822F8A739827892F8295982750 -:107C8000892F869586959827892F86959827832F03 -:107C90009695879547955795C72FD0E0C054DE4DF0 -:107CA0000A2F10E000541F4D3881E8019881392BCC -:107CB000022F10E000541D4DE8019881C32FC92BFD -:107CC000D0E0C058DF4D3881B32BB695372F3071D7 -:107CD0009A2F917E9327322F30729327352F347944 -:107CE0009327342F33779327382F3A739327392FDD -:107CF00032959327392F369536959327392F369518 -:107D00009327969527957795A795C42FD0E0C054D3 -:107D1000DE4D052F10E000541F4D3881E801988199 -:107D2000392B082F10E000541D4DE8019881C32F16 -:107D3000C92BD0E0C058DF4D98813B2F392B3695A9 -:107D4000C72FD0E0C054DE4D0A2F10E000541F4D65 -:107D5000B881E8019881B92B022F10E000541D4D25 -:107D6000E8019881CB2FC92BD0E0C058DF4DB881F6 -:107D7000B32B342F3071952F917E9327382F30728B -:107D800093273A2F34799327372F33779327322F3E -:107D90003A739327392F32959327392F3695369595 -:107DA0009327392F36959327382F969537954795F2 -:107DB000579580818B27819330CEA093712C70933F -:107DC000722C2093732C5093742C4093752C309309 -:107DD000762CDF91CF911F910F910895CF92DF9272 -:107DE000EF92FF921F93CF93DF931091712CD0915C -:107DF000722CC091732C7091742C4091752C209131 -:107E0000762CE42FF0E0E054FE4DA72FB0E0A05414 -:107E1000BF4DE0813C91E32BA22FB0E0A054BD4DBB -:107E20003C91E32BF0E0E056FF4D3081DC0180E037 -:107E3000615008F405C2582F369557959D2F9071C3 -:107E4000812F817E89279C2F90728927972F947983 -:107E50008927942F93778927322F3A738327982F76 -:107E600092958927982F969596958927982F96957C -:107E700089279C2F86959795D79517955695342FDA -:107E80003071872F817E8327322F30728327312FE5 -:107E9000347983273D2F33778327392F3A7383270C -:107EA000382F32958327382F369536958327382FEC -:107EB000369583278695279547957795CD2ED12C96 -:107EC000F601E054FE4D6F01E12EF12CF701E05474 -:107ED000FF4D7F01F6013081F7018081832BE92E70 -:107EE000F12CF701E054FD4D3081E82FE32BF0E059 -:107EF000E058FF4D8081582B56953D2F3071812FD2 -:107F0000817E8327392F30728327372F3479832757 -:107F1000342F33778327322F3A738327382F3295C4 -:107F20008327382F369536958327382F3695832724 -:107F300086959795D7951795C42ED12CF601E054C8 -:107F4000FE4D6F01E72EF12CF701E054FF4D7F014C -:107F5000F6013081F7018081832BE22EF12CF701AD -:107F6000E054FD4D3081E82FE32BF0E0E058FF4D69 -:107F7000C0815C2B5695342F3071872F817E8327EB -:107F8000322F30728327312F347983273D2F337777 -:107F90008327392F3A738327382F32958327382F39 -:107FA000369536958327382F3695832786952795DE -:107FB00047957795CD2ED12CF601E054FE4D6F01FB -:107FC000E12EF12CF701E054FF4D7F01F6013081E5 -:107FD000F7018081832BE92EF12CF701E054FD4D50 -:107FE0003081E82FE32BF0E0E058FF4DC081C52B36 -:107FF000C6953D2F3071812F817E8327392F3072B6 -:108000008327372F34798327342F33778327322FF1 -:108010003A738327382F32958327382F3695369534 -:108020008327382F3695832786959795D79517956B -:10803000C42ED12CF601E054FE4D6F01E72EF12C39 -:10804000F701E054FF4D7F01F6013081F701808197 -:10805000382BE22EF12CF701E054FD4D8081E32F07 -:10806000E82BF0E0E058FF4D8081C82BC695342FF7 -:108070003071872F817E8327322F30728327312FF3 -:10808000347983273D2F33778327392F3A7383271A -:10809000382F32958327382F369536958327382FFA -:1080A00036958327542F8695279557957795CD2E0E -:1080B000D12CF601E054FE4D6F01E12EF12CF701B9 -:1080C000E054FF4D7F01F6013081F7018081832B61 -:1080D000E92EF12CF701E054FD4D3081E82FE32B20 -:1080E000F0E0E058FF4D80818C2B482F46953D2FC6 -:1080F0003071812F817E3827892F80723827872F12 -:1081000084793827852F83773827822F8A733827F9 -:10811000832F82953827832F869586953827832F3E -:1081200086953827C92F3695C795D7951795E52F8A -:10813000F0E0E054FE4D872F90E080549F4D308159 -:10814000FC018081382B822F90E080549D4DFC01F2 -:108150009081E32FE92BF0E0E058FF4D9081842FD0 -:10816000892B382F3695ED2FF0E0CF0180549E4DAE -:108170006C01E12FF0E0CF0180549F4DF60140816A -:10818000FC019081492BEC2EF12CC70180549D4DB0 -:10819000FC019081E42FE92BF0E0E058FF4D908145 -:1081A000832F892B352F3071972F917E3927922F6E -:1081B00090723927912F947939279D2F93773927FA -:1081C0004C2F4A733427932F92953927932F9695E6 -:1081D00096953927932F96953927452F36952795CC -:1081E00047957795C42ED12CF601E054FE4D6F01D2 -:1081F000E72EF12CF701E054FF4D7F01F6013081AD -:10820000F7019081392BE22EF12CF701E054FD4D5E -:108210009081E32FE92BF0E0E056FF4D30819C91F7 -:10822000E92FF0E0EC59FB4FE4917D01F0E8EF0E0F -:10823000F11C5E2F5327F701508398279D93F8CDAB -:108240001093712CD093722CC093732C7093742C58 -:108250004093752C2093762CDF91CF911F91FF9046 -:10826000EF90DF90CF9008950F931F93FC01862F1E -:1082700090812181428150E060E070E0BA01552791 -:108280004427522B492B9381792B8B0122273327AB -:10829000803208F471C0D80123E0B695A7952A95DD -:1082A000E1F70A271B2798013695279536952795DC -:1082B000BBE07695679557954795BA95D1F7022714 -:1082C000132720E030E095E1000F111F221F331F1C -:1082D0009A95D1F7402B512B622B732B8B012227C0 -:1082E0003327D80133E0B695A7953A95E1F70A27E9 -:1082F0001B2798013695279536952795BBE07695EF -:10830000679557954795BA95D1F70227132720E02F -:1083100030E095E1000F111F221F331F9A95D1F70E -:10832000402B512B622B732B8B0122273327D80133 -:1083300033E0B695A7953A95E1F70A271B279801F0 -:108340003695279536952795BAE076956795579592 -:108350004795BA95D1F70227132720E030E096E140 -:10836000000F111F221F331F9A95D1F7402B512B5D -:10837000622B732B805289CF408351830283738396 -:108380001F910F910895AF92BF92CF92DF92EF921B -:10839000FF920F931F93CF93DF936730710509F41A -:1083A00051C09B0127703327232B09F04EC0EB01EE -:1083B0006C015B0183E0B694A7948A95E1F77B0199 -:1083C00096E0F694E7949A95E1F7EA0CFB1CEC0C26 -:1083D000FD1C8501015011090C0D1D1DA701401B3D -:1083E000510B60E070E0C80101960E9437560C15F1 -:1083F0001D0520F1D801EC91F0E0EC59FB4F4491C0 -:108400009701D7010A171B0768F48C91982F990FD1 -:10841000F90182919F01881F8827881F892B8C93DF -:108420001197F0CF11968C9111978E7FE42FE17008 -:10843000E82B1196EC9301501109D9CFC5018C0F8F -:108440009D1F04C087E090E001C0CB01DF91CF9178 -:108450001F910F91FF90EF90DF90CF90BF90AF9062 -:108460000895EF92FF920F931F93CF93DF93EC0148 -:10847000CB0167307105D1F169E070E00E9467556A -:10848000DE0120E030E088E090E02617370739F180 -:10849000F90143E0F695E7954A95E1F7E20FF31FFE -:1084A000EC0FFD1F408150E0890107701127002E5D -:1084B00002C0559547950A94E2F74C9301151105B2 -:1084C00051F0E1817C01E01AF10A01C0EE0FEA945B -:1084D000EAF74E2B4C932F5F3F4F1196D6CFC90131 -:1084E00023E0880F991F2A95E1F702C087E090E00A -:1084F000DF91CF911F910F91FF90EF900895CF934F -:10850000DF93FC016115710511F1808186958083EF -:108510009B01295F3F4F83E0369527958A95E1F7C8 -:10852000DF0141E050E04217530770F4C1919081A0 -:10853000D0E89D9FC00111248C2B8D93808186955E -:1085400080834F5F5F4FEFCFCB01019702C080E088 -:1085500090E0DF91CF910895EF92FF920F931F93D8 -:10856000CF93DF93EC01CB016730710509F442C072 -:1085700069E070E00E94675520E030E088E090E01C -:1085800026173707B9F1D90143E0B695A7954A9563 -:10859000E1F7A20FB31FA90147705527AC0FBD1F0C -:1085A000EC91F0E0042E02C0F595E7950A94E2F70D -:1085B0004115510559F011960C9111977C01E41A5F -:1085C000F50A01C0000FEA94EAF7E02BF0E0EC595D -:1085D000FB4FE4911196AC91B0E08D0102C015956E -:1085E00007954A95E2F7A8014E2740FD05C02F5F89 -:1085F0003F4FC6CF81E001C080E0DF91CF911F9156 -:108600000F91FF90EF9008951092492D08951092C8 -:10861000492D1092772C10924A2D0895F8DF0E9470 -:108620000D2A1092492D089508950895DC0123E63E -:1086300033E66150E8F04D91942F922780E1989FA6 -:10864000A00111244927E42FF0E042954F70232F19 -:108650003327C9018427AC013E2F22272427352741 -:1086600043E0EE0FFF1F4A95E1F72E273F27E1CFAA -:10867000C90108952F923F924F925F926F927F921D -:108680008F929F92AF92BF92CF92DF92EF92FF9222 -:108690000F931F93CF93DF93CDB7DEB7C154D24072 -:1086A000CDBFDEBF8C016B018091772C833009F444 -:1086B00045C138F4813079F0823009F4B7C00C94A8 -:1086C000EE4D853009F4EAC408F4B0C2863009F4EE -:1086D00008C70C94EE4DE0904B2EF0904C2EE11418 -:1086E000F104C1F0A701495F5F4F23E0569547951C -:1086F0002A95E1F76BE47DE2C8010E941D56609166 -:108700004B2E70914C2EC8013EDE10924B2E1092D3 -:108710004C2EC2C46115710509F4ABC0C801EFDE6F -:108720005C01BC01C80118DFD82EB501C80199DE73 -:108730005C019C01295F3F4FA901440F551F93E045 -:10874000569547959A95E1F74A5F5F4F4138510535 -:1087500038F060EC73E2CE0101960E94495692C057 -:10876000A3E036952795AA95E1F7A80160E870E0A7 -:10877000CE0101960E94050E8C01CF5FDD4FB882BD -:10878000C150D240CE5FDD4FA882C250D2408FECA4 -:1087900093E29F938F93B0E8AB2EB12CC501801B61 -:1087A000910B9F938F9381E090E08C0F9D1F800F22 -:1087B000911F9F938F930E945056080F191FB50168 -:1087C000601B710B22E030E0AE014F5F5D4F81E036 -:1087D00090E08C0F9D1F800F911F0E94050E800F4F -:1087E000911F0F900F900F900F900F900F90A50179 -:1087F000481B590B21E030E02C0F3D1F280F391F7B -:10880000D11003C082ED93E202C081EE93E29F9308 -:108810008F935F934F933F932F930E9450560F90E7 -:108820000F900F900F900F900F902CC0E0904B2E58 -:10883000F0904C2EE114F104C9F0A701495F5F4F9D -:10884000F3E056954795FA95E1F76BE47DE2C801B0 -:108850000E941D5690914B2E80914C2E10924B2EC3 -:1088600010924C2EE92EF82E0C94F04D61157105E6 -:1088700099F488E0EDE0F4E2DE01119601900D92AA -:108880008A95E1F71092772CBE016F5F7F4F85E6E6 -:108890000E94E3210C94F04D9B01295F3F4F73E050 -:1088A000369527957A95E1F7A80160E870E0CE014A -:1088B00001960E94050E8C01CF5FDD4FD882C1501A -:1088C000D240CE5FDD4FC882C250D2408FEC93E2DF -:1088D0009F938F93E0E8CE2ED12CC601801B910B85 -:1088E0009F938F9381E090E08C0F9D1F800F911FCD -:1088F0009F938F930E945056800F911FB601681B63 -:10890000790B22E030E0AE014F5F5D4FA1E0B0E0B7 -:10891000AC0FBD1F8A0F9B1F0E94050E1092772C73 -:10892000BE016F5F7F4F85E60E94E3210F900F909D -:108930000F900F900F900F900C94F04D80914A2D56 -:10894000B090492D882331F0B1E0BB1508F455C132 -:1089500010924A2DE5E0EB15B8F0F3E0BF1608F0F1 -:1089600040C021E02B15C8F081E090E080932020EA -:108970009093212082E5D8018C9382E08093492D49 -:1089800067E0E62EF12C3BC138E03B1508F0A8C0AB -:108990008AE0B81609F4F5C030C1B3E1CB16D104B2 -:1089A00008F4B9C0B601C801AADD7C01BC01C80148 -:1089B000D3DD882319F1B701C80153DDF8018181A6 -:1089C00090E0982F88272081822B80933B2D9093D5 -:1089D0003C2D83E9808380E2818383E08093492D6D -:1089E000BCC0B601C8018BDD7C01BC01C801B4DD8F -:1089F000882321F0F8E0EF16F10488F41092492D55 -:108A0000C701089667E070E00E946755462FE09125 -:108A1000652EF091662EB80181EC1995B8C0B701AA -:108A2000C8011FDDD8012C9111968C9111978227D6 -:108A300012969C911297892713969C9113978927D8 -:108A400014969C911497891366C08B2D90E0039720 -:108A5000283881F49C01220F331F820F931FFC01E1 -:108A6000E25CF24D11962D913D914C912083318322 -:108A7000428312C0FC01EE0FFF1F8E0F9F1F9C014F -:108A8000225C324DF80180819181A281B381F9018C -:108A900080839183A283B38345E050E0B801C8018D -:108AA00002960E942656F3E0BF1629F024E0B21683 -:108AB00021F087E903C083E901C085E9D8018C93DF -:108AC00080E711968C9367E0C801B0DDF8018783D9 -:108AD000908783E08B0D8093492D68E470E089C016 -:108AE000F9E0CF16D104B8F0B601C80108DD7C0169 -:108AF000BC01C80131DD811111C0C701089667E0D2 -:108B000070E00E946755462FE091652EF091662E29 -:108B1000B80181EC19951092492D39C0B701C801EF -:108B2000A0DC63E0C80182DD7C01892BA1F7D801BC -:108B30008C9182FF15C0B8E0BB1691F0E6E0BE163E -:108B400011F087E901C085E9D8018C9380E2119684 -:108B50008C93BA94BA94B092492D60E170E049C008 -:108B600081E080934A2D8B2D90E00697B82EBB0CA8 -:108B70008B0D8C5F8093482DF801808180933D2D73 -:108B80003EC0C114D10431F481E08093492D0E948C -:108B9000072A33C0B601C801B2DC7C01BC01C801A0 -:108BA000DBDC81110FC0C701089667E070E00E940E -:108BB0006755462FE091652EF091662EB80181EC45 -:108BC000199508C0B701C8014CDC63E0C8012EDD6F -:108BD000892BD1F282ECD8018C9361E0C80126DDAB -:108BE000F80181839283B092492D10924A2D68E159 -:108BF00070E0C801C8DB7C0102C0E12CF12C80913F -:108C00004A2D882309F4ECC72091482D30E04EE32B -:108C10005DE264E170E0CE0101960E94050EBE01A6 -:108C20006F5F7F4F85E60E94E3218EC080912A2DE1 -:108C3000811108C080E890E00E94CE2281E08093FC -:108C40002A2D99C0813009F098C08091492D823039 -:108C500008F093C08091292D91E0980F9093292DD1 -:108C6000883009F08AC00E94D7228115944008F408 -:108C700072C010922A2D60E070E085E60E94E32128 -:108C8000A9EB4A2EACE25A2EB0E8CB2ED12C612CA7 -:108C9000712CE12CF12C00E010E0A12CB12C312C36 -:108CA0008AE0282E9E012F5F3F4F4901DF92CF922D -:108CB000ADEEB3E2BF93AF931F922F929F928F922C -:108CC0000E945056C4010E946518CDBFDEBFD2017C -:108CD0008C91882351F087E990E10E946A18311045 -:108CE00013C05301332433940FC083E990E10E94F1 -:108CF0006A18332049F0C3018A199B09081719071C -:108D000010F475018C01312CF20111922F01FFEF4B -:108D10006F1A7F0A28E0C20ED11C30E76316710477 -:108D200029F60115110571F0C701409616950795B2 -:108D3000800F911FF3E0880F991FFA95E1F70E94C9 -:108D4000CE2202C00E94E52210924A2D1092772C6A -:108D50000E947A2243C7E0911E20F0911F20E05824 -:108D6000F10973E0F695E7957A95E1F7E754F34D4D -:108D700010820E94D7221092292D80914A2DB09006 -:108D8000492D882331F081E08B1508F455C11092EC -:108D90004A2D95E09B15B8F0A3E0BA1608F040C044 -:108DA000B1E0BB15C8F081E090E080932020909363 -:108DB000212082E5D8018C9382E08093492D67E0E1 -:108DC000E62EF12C3BC1E8E0EB1508F0A8C0FAE074 -:108DD000BF1609F4F5C030C1B3E1CB16D10408F4D5 -:108DE000B9C0B601C8018BDB7C01BC01C801B4DB92 -:108DF000882319F1B701C80134DBF801818190E0C3 -:108E0000982F88272081822B80933B2D90933C2D97 -:108E100083E9808380E2818383E08093492DBCC015 -:108E2000B601C8016CDB7C01BC01C80195DB88235D -:108E300021F0F8E0EF16F10488F41092492DC701F3 -:108E4000089667E070E00E946755462FE091652E16 -:108E5000F091662EB80181EC1995B8C0B701C80130 -:108E600000DBD8012C9111968C91119782271296D4 -:108E70009C911297892713969C9113978927149692 -:108E80009C911497891366C08B2D90E00397283826 -:108E900081F49C01220F331F820F931FFC01E25CBF -:108EA000F24D11962D913D914C9120833183428357 -:108EB00012C0FC01EE0FFF1F8E0F9F1F9C01225C52 -:108EC000324DF80180819181A281B381F9018083C3 -:108ED0009183A283B38345E050E0B801C8010296B4 -:108EE0000E942656F3E0BF1629F024E0B21621F0C6 -:108EF00087E903C083E901C085E9D8018C9380E745 -:108F000011968C9367E0C80191DBF8018783908705 -:108F100083E08B0D8093492D68E470E089C0F9E00F -:108F2000CF16D104B8F0B601C801E9DA7C01BC0162 -:108F3000C80112DB811111C0C701089667E070E01B -:108F40000E946755462FE091652EF091662EB8017C -:108F500081EC19951092492D39C0B701C80181DA09 -:108F600063E0C80163DB7C01892BA1F7D8018C91F8 -:108F700082FF15C0B8E0BB1691F0E6E0BE1611F016 -:108F800087E901C085E9D8018C9380E211968C9322 -:108F9000BA94BA94B092492D60E170E049C081E082 -:108FA00080934A2D8B2D90E00697B82EBB0C8B0D2D -:108FB0008C5F8093482DF801808180933D2D3EC0C9 -:108FC000C114D10431F481E08093492D0E94072A15 -:108FD00033C0B601C80193DA7C01BC01C801BCDA18 -:108FE00081110FC0C701089667E070E00E946755C5 -:108FF000462FE091652EF091662EB80181EC19950F -:1090000008C0B701C8012DDA63E0C8010FDB892B66 -:10901000D1F282ECD8018C9361E0C80107DBF80142 -:1090200081839283B092492D10924A2D68E170E0BD -:10903000C801A9D97C0102C0E12CF12C80914A2DF4 -:10904000882309F4CDC5E0911E20F0911F20E0583F -:10905000F109A3E0F695E795AA95E1F7E754F34DFA -:10906000FF24F394F0820E94D7221092492D0E948F -:10907000072A80E5D8018C9311961C9262E0C80102 -:10908000D5DAF80182839383F092492D10924A2D0C -:1090900060E270E0C80177D97C01A2C580914A2DB9 -:1090A000B090492D882331F0F1E0FB1508F451C14F -:1090B00010924A2D25E02B15B8F033E0B31608F0D6 -:1090C00043C081E08B15C8F081E090E080932020C0 -:1090D0009093212082E5F801808382E08093492DDE -:1090E000E7E0EE2EF12C37C198E09B1508F0A4C004 -:1090F000AAE0BA1609F4F1C02CC1F3E1CF16D104ED -:1091000008F4B5C0B601C801FAD97C01BC01C80198 -:1091100023DA882331F1B701C801A3D9D801119608 -:109120008C91119790E0982F88272C91822B809317 -:109130003B2D90933C2D83E98C9380E211968C9388 -:1091400083E08093492DB5C0B601C801D8D97C0110 -:10915000BC01C80101DA882321F0B8E0EB16F10464 +:101FA00065068091010480FDFCCF82E080930304EC +:101FB000DF91CF91FF90EF90DF90CF900895CF9277 +:101FC000DF92EF92FF92CF93DF93C090672ED12CD8 +:101FD000E12CF12C8DE0CC0CDD1CEE1CFF1C8A9555 +:101FE000D1F7C114D10481E0E806F10438F0DF91A3 +:101FF000CF91FF90EF90DF90CF906CCF8FEFE81AEA +:10200000F80AC1E2D0E0219791F393DBC701B60152 +:102010007CDB8FDB8FEFD81AE80AF80AF4CFCF9277 +:10202000DF92EF92FF920F931F93CF93DF93C090B5 +:10203000672ED12CE12CF12C8DE0CC0CDD1CEE1C9C +:10204000FF1C8A95D1F7C114D10481E0E806F104A0 +:1020500008F04FC080E18093660683E08093A0097A +:102060008091A10987FFFCCF8091A0091092A0095F +:102070008091A10987FFFCCF8091A0091092A0094F +:102080008091A10987FFFCCF8FEFE81AF80A8091B1 +:10209000A009C1E2D0E0219749F14BDB47DB49DBE6 +:1020A00000E010E01092A0098091A10987FFFCCF09 +:1020B0006091A00970E01092A0098091A10987FFAA +:1020C000FCCF8091A009782BC80125DB32DB0E5FA5 +:1020D0001F4F011581E0180729F7C701B60120DB62 +:1020E00028DB8FEFD81AE80AF80AD5CF80E1809371 +:1020F0006506E091682EF091692E8781863019F48B +:1021000090E190931F2C9681963049F420E1209322 +:102110001E2C853059F483E180931F2C02C085303A +:10212000D1F3953019F483E180931E2C8091010442 +:1021300080FDFCCF82E080930304DF91CF911F915B +:102140000F91FF90EF90DF90CF900895CF92DF92A4 +:10215000EF92FF920F931F934115E0E25E07610536 +:10216000710508F06BC06901E12CF12C00E010E270 +:1021700020E030E0041B150B260B370BC016D106F0 +:10218000E206F30610F49701860120E1209366062B +:1021900026E02093A0092091A10927FFFCCF2091E0 +:1021A000A00920E120936506000000002093660648 +:1021B00022E02093A0092091A10927FFFCCF2091C4 +:1021C000A0095093A0092091A10927FFFCCF2091DD +:1021D000A0094093A0092091A10927FFFCCF2091DD +:1021E000A0091092120126E134E220931C013093E1 +:1021F0001D01009314011093150120E12093220189 +:1022000080932801909329010093240110932501C4 +:102210008091100180688093100180912001806876 +:10222000809320018091100187FDFCCF80E3809393 +:1022300011018093210180E18093650681E01F9167 +:102240000F91FF90EF90DF90CF900895CF92DF92A3 +:10225000EF92FF920F931F934115E0E25E07610535 +:10226000710508F05DC06901E12CF12C00E010E27D +:1022700020E030E0041B150B260B370BC016D106EF +:10228000E206F30610F49701860120E1209366062A +:1022900023E02093A0092091A10927FFFCCF2091E2 +:1022A000A0095093A0092091A10927FFFCCF2091FC +:1022B000A0094093A0092091A10927FFFCCF2091FC +:1022C000A00921E02093120180931C0190931D012D +:1022D00000931401109315011092220186E194E2FB +:1022E00080932801909329010093240110932501E4 +:1022F0008091100180688093100180912001806896 +:10230000809320018091100187FDFCCF80E38093B2 +:1023100011018093210180E18093650681E001C075 +:1023200080E01F910F91FF90EF90DF90CF90089584 +:102330008091CF0187FDFCCF0895FADF8091CF0116 +:1023400081FF0BC086E38093CA01EBECF1E021E052 +:1023500030E088ED90E084BF20830895EF92FF92F3 +:102360000F931F93CF93DF931F921F92CDB7DEB7CA +:102370007C018A011092C20169837A83D9DF698165 +:10238000A62F7A81B72FC701800F911F26E048ED55 +:1023900050E061E070E0EBECF1E0E816F90689F05E +:1023A000E092C0013F2D3F713093C1012093CA01DB +:1023B00044BF60833091C4013D933FEFE31AF30AB9 +:1023C000ECCFC8010F900F90DF91CF911F910F912B +:1023D000FF90EF9008952F923F924F925F926F92ED +:1023E0007F928F929F92AF92BF92CF92DF92EF92A5 +:1023F000FF920F931F93CF93DF9300D0CDB7DEB73B +:102400006A01282F2F711C01221A310829836A833F +:102410007B8393DF8DDF83E38093CA011092C10138 +:102420001092C2016A81E62E7B81F72E860185E338 +:10243000582E98ED892E912C66246394712C3BECD8 +:10244000A32EBB24B39443E3442E29810115110527 +:1024500009F12093C001F70181917F018093C401AC +:102460000150110919F02F5F203281F72092C0012D +:10247000832D8F718093C1015092CA01C401F5016F +:1024800084BF608290E2290E311C52DF4092CA0163 +:1024900020E0DCCFC6012396CDBFDEBFDF91CF9118 +:1024A0001F910F91FF90EF90DF90CF90BF90AF9072 +:1024B0009F908F907F906F905F904F903F902F9064 +:1024C00008951F93CF93DF93CDB7DEB7A097CDBF0D +:1024D000DEBF853009F4AEC078F4823081F128F493 +:1024E000813009F0EEC010E01BC0833009F453C006 +:1024F000843009F475C0E5C0883009F4D3C040F4D5 +:10250000863009F4CDC0873009F0DBC088DDD9C042 +:10251000893009F4C9C08A3009F0D3C080D3D1C052 +:102520008091632E181708F0A8C053DBE1E0F0E0BB +:10253000EC0FFD1FE10FF11D80831F5FF1CF11E054 +:102540008091632E873009F010E0E0915D2EF091CC +:102550005E2ECE01019619954091632E31E014173D +:1025600008F08BC03323A9F0812F90E0E1E0F0E088 +:10257000EC0FFD1FE80FF91F208131E02F3F09F01C +:1025800030E0E1E0F0E0EC0FFD1FE80FF91F2F5FF6 +:1025900020831F5FE4CFE0915D2EF0915E2ECE018F +:1025A000019619958091632E41E0815008F465C031 +:1025B0004423D9F3282F30E0E1E0F0E0EC0FFD1FD9 +:1025C000E20FF31F908141E09F3F09F040E0E1E01E +:1025D000F0E0EC0FFD1FE20FF31F9F5F9083E5CF4C +:1025E00011E08091632E873009F010E0E0915D2EBC +:1025F000F0915E2ECE01019619954091632E31E047 +:102600001417D8F53323A1F0812F90E0E1E0F0E03A +:10261000EC0FFD1FE80FF91F208131E0211130E0A0 +:10262000E1E0F0E0EC0FFD1FE80FF91F21502083DF +:102630001F5FE6CFE0915D2EF0915E2ECE010196F8 +:1026400019958091632E41E08150B8F04423E1F365 +:10265000282F30E0E1E0F0E0EC0FFD1FE20FF31F68 +:10266000908141E0911140E0E1E0F0E0EC0FFD1FCE +:10267000E20FF31F91509083E7CFE0915F2EF0912E +:10268000602ECE0101961995E091652EF091662E8F +:102690004091632EBE016F5F7F4F83E1199511C09A +:1026A000ACD30FC017DC0DC080910008813021F43D +:1026B00080918C08833019F00E94B12202C00E94E0 +:1026C000D622A096CDBFDEBFDF91CF911F91089596 +:1026D000E0E0F6E080E6828388E1868B858B0895D2 +:1026E000CF93C0910806C095C6FF12C080911824F0 +:1026F0008A3050F08A30E1F4E091682EF091692E32 +:102700008181DFDE809118248F5F8093182410C0B0 +:102710008C2F807669F48091182481508A3030F4AF +:10272000E091682EF091692E8081CBDE1092182402 +:10273000C5FF12C0809117248A3050F08A30D9F436 +:10274000E091682EF091692E8381BBDE8091172481 +:102750008F5F809317240FC0C07669F4809117248F +:1027600081508A3030F4E091682EF091692E828198 +:10277000A8DE10921724CF9108959B01AC016BE065 +:1027800084E696E094C420E030E090E0F901E80FA0 +:10279000F91FE959F14D6383265F3F4F203531051D +:1027A000A9F708950F931F939B01E091682EF09174 +:1027B000692EE80FF11D8A0140816BE084E696E006 +:1027C00037D41F910F9108950F931F93CF93DF93E9 +:1027D0001F92CDB7DEB7082FAB019E012F5F3F4F91 +:1027E0006BE084E696E03CD4182F882319F06981C9 +:1027F000802FC9DF812F0F90DF91CF911F910F9113 +:1028000008950895EF92FF920F931F93CF937B014A +:10281000C42F2EB13FB10091080410910904022B7E +:10282000132B682F83E090E20E94D4536C2F83E037 +:1028300090E20E94D453612F83E090E20E94D4532F +:10284000602F83E090E20E94D4536C2F70E0C701A8 +:10285000CF911F910F91FF90EF90AAC408953F92DE +:102860004F925F926F927F928F929F92AF92BF92A0 +:10287000CF92DF92EF92FF920F931F93CF93DF934C +:102880007C01E901C0900020D090012096012250E7 +:102890003843C901A0E0B0E0481759076A077B0731 +:1028A00008F05CC0E2E0CE1AE0E4DE0A2A013B0157 +:1028B0004C0E5D1E611C711C481659066A067B068B +:1028C00048F0241B350B8E01021B130BE901332446 +:1028D000339403C000E010E0312C4601A12CB12C50 +:1028E000481559056A057B0510F5CA018E5F9F4B97 +:1028F0002A013B014C0E5D1E611C711C48145904D9 +:102900006A047B0428F4AE01BC01C70127DA18C0B1 +:10291000C41AD50AA601BC01C70120DAAE014C19C0 +:102920005D096EE174E2C7018C0D9D1D07C04C1955 +:102930005D09BA01625E7B4DAE01C7010E94FC5584 +:10294000311002C081E00BC001501109D8F3F80129 +:10295000EC0FFD1FEE0DFF1D1082F6CF80E0DF9122 +:10296000CF911F910F91FF90EF90DF90CF90BF908C +:10297000AF909F908F907F906F905F904F903F901F +:10298000089520911A2430911B2480E098E0821B46 +:10299000930BEEE1F4E29F012E51344228173907E0 +:1029A00010F41192F8CF8EE194E280931C2490935E +:1029B0001D2480E098E080931A2490931B2482E0E9 +:1029C00090E4809300209093012042E050E060E08A +:1029D00070E480E090E210DAE091682EF091692EC8 +:1029E00087818A3019F480E180931F2C86818A3098 +:1029F00019F480E180931E2C089580911A249091FF +:102A00001B2490582091002030910120821B930BB1 +:102A1000089520E030E0F901E959F14D8783265F00 +:102A20003F4F20353105B9F7813049F018F0823039 +:102A300059F008951092192481E094E109C080931F +:102A4000192488E895E104C01092192482E094E1E9 +:102A50008093652E9093662E08950F931F93CF93C6 +:102A6000DF931F92CDB7DEB7E091682EF091692E0B +:102A70008481CFDF8EE194E280931C2490931D2407 +:102A800000E018E000931A2410931B2441E050E06A +:102A9000BE016F5F7F4F80E090E060DCE0911C241E +:102AA000F0911D24DF01C8011D920197E9F789818A +:102AB000882341F042E050E060E070E480E090E282 +:102AC0004DD917C082E090E48093002090930120BC +:102AD00042E050E060E070E480E090E28DD981E077 +:102AE000898341E050E0BE016F5F7F4F80E090E05E +:102AF00072DCE091652EF091662E40E060E070E0BF +:102B00008FEF19950F90DF91CF911F910F9108953D +:102B10000F931F93CF93DF93AEB1BFB1C091080461 +:102B2000D091090420911A2430911B24E42FF0E065 +:102B30008F010C5F1F4F2017310758F1CA2BDB2B79 +:102B4000245031092E1B3F0B20931A2430931B2451 +:102B5000A0911C24B0911D248C9311964C93119735 +:102B60001296DC931297CD01049680931C249093C7 +:102B70001D241396CC93DB01EC01415018F02D91EC +:102B80002993FBCFE80FF91FE0931C24F0931D2439 +:102B900012C080E03EDFE091682EF091692E8781BF +:102BA0008A3019F481E180931F2C86818A3019F4D0 +:102BB00081E180931E2CDF91CF911F910F91089599 +:102BC0001F93CF93DF931F92CDB7DEB79E012F5F88 +:102BD0003F4FAC0163E08FEC97E042D2182F88237F +:102BE00011F0898116DF812F0F90DF91CF911F9116 +:102BF00008950F931F93E091682EF091692E8B0139 +:102C00009C01448163E08FEC97E012D21F910F91F9 +:102C100008959B01AC0163E08FEC97E048C2EF920E +:102C2000FF920F931F93CF93DF9380911A2490917B +:102C30001B24811528E0920708F078C0009100203D +:102C400010910120C0E0D0E8C01BD10BE12C28E09E +:102C5000F22EA701481B590BC417D50760F1B80124 +:102C60008EE194E2C9D820911A2430911B248091DE +:102C7000002090910120985F821B930B809300208D +:102C800090930120E21AF30AEEE1F4E2CF018E51B3 +:102C900094428E159F0510F41192F8CF8EE194E2C4 +:102CA00080931C2490931D2480E098E080931A2444 +:102CB00090931B242EC02097C9F1AE01B8018EE17C +:102CC00094E29AD8A8015857BE01625E7B4D8EE10E +:102CD00094E20E94055680911C2490911D248C1B27 +:102CE0009D0B80931C2490931D2480911A24909115 +:102CF0001B248C0F9D1F80931A2490931B2480917A +:102D0000002090910120C80FD91FC0930020D093BC +:102D1000012042E050E060E070E480E090E2DF916A +:102D2000CF911F910F91FF90EF9066C8DF91CF91E7 +:102D30001F910F91FF90EF900895809119248111B8 +:102D40006ECF089543E550E067E67EE281E090E0D3 +:102D500005CB43E550E067E67EE281E090E03BCBC7 +:102D6000CF93DF93C7E6DEE2688181E090E00E94C6 +:102D7000885C69817A8182E090E0DF91CF910C9448 +:102D8000915CCF93DF93CFEFC80FC83080F5D82F79 +:102D90000E94252244D9C093672E8AE0C89F9001E3 +:102DA0001124C9018659914D8093682E9093692E04 +:102DB000F901E959F14D80850E94620DE091682E7C +:102DC000F091692E848125DE85D8CADF8FE18D0FD1 +:102DD000E091682EF091692E9781943011F48093E0 +:102DE0001F2C9681943029F480931E2C02C080E021 +:102DF00001C081E0DF91CF9108958091672E99E025 +:102E00004AE0915099F0282F30E02F5F3F4F277014 +:102E10003327822F429FF001439FF00D1124E9597F +:102E2000F14D2085222369F38F5FABCF0895FC011C +:102E30009091672E9F5C908311820895CF93FC013F +:102E4000C081818181110CC0BF01E091652EF0919C +:102E5000662E41E082E1199580ED8C0FCF9191CFE4 +:102E600080E0CF91089588E18093010608958091D4 +:102E70001E2C823191F030F48031B9F050F4882367 +:102E8000A9F132C0833169F090EE980F983088F044 +:102E90002BC088E08093050627C088E08093070652 +:102EA00023C08091040683FF12C088E08093060649 +:102EB0001BC09091202C9F5F913019F09093202C93 +:102EC00015C01092202C9091040693FD04C088E058 +:102ED000809305060BC098E090930606803221F09F +:102EE000815080931E2C02C010921E2C80911F2CAA +:102EF000823191F030F48031C1F050F48823A9F18F +:102F000032C0833169F090EE980F983088F02BC072 +:102F100080E18093050627C080E18093070623C0E7 +:102F20008091040684FF12C080E1809306061BC0D6 +:102F30009091212C9F5F913019F09093212C08954E +:102F40001092212C9091040694FD04C080E180939E +:102F50000506089590E190930606803221F0815095 +:102F600080931F2C089510921F2C08959B01AC0193 +:102F70006BE082E398E09BC020E030E0982F9071F6 +:102F80008870992321F0F901E959F14D628788236E +:102F900021F0F901E959F14D6187265F3F4F203556 +:102FA000310579F7992329F090E190930606109264 +:102FB0001F2C882329F088E08093060610921E2C8F +:102FC00008950F931F939B018A01803131F4E091A2 +:102FD000682EF091692E478107C0883049F4E0914E +:102FE000682EF091692E46816BE082E398E020D054 +:102FF0001F910F9108950F931F93CF93DF931F920B +:10300000CDB7DEB7082FAB019E012F5F3F4F6BE0BE +:1030100082E398E025D0182F882319F06981802F4A +:10302000ABDF812F0F90DF91CF911F910F9108950A +:103030000F931F93FC01662379F0949161509413D0 +:1030400009C0BF016F5F7F4FA801C9010E94E05511 +:1030500081E003C0B196EFCF80E01F910F910895FA +:10306000CF92DF92EF92FF921F93CF93DF93EC0109 +:103070007A016901162F112389F0BE016F5F7F4F1E +:10308000C7010E94D7551150892B31F4FE01C4911C +:10309000F601C08381E003C0A196EDCF80E0DF910F +:1030A000CF911F91FF90EF90DF90CF900895CF9335 +:1030B0000196CCE26623C9F0FC01DA01AD017491FE +:1030C000772341F021153105A1F07D9331962150F0 +:1030D0003109F4CF623030F02115310551F04F5FE6 +:1030E0005F4FCC9361508196E5CF232B11F0FA010D +:1030F0001082CF91089580912002806880932002F1 +:103100008091230280FFFCCF81E080932302A09175 +:103110001002B0911102AE5BB109B7FF02C0A0E08E +:10312000B0E020E038EB4BE050E00E945A55E091CF +:10313000682EF091692E61157105844F9140A8F4B5 +:103140008781873019F480E180931F2C8681873036 +:1031500019F480E180931E2C8091632E882389F0DE +:10316000E091552EF091562E19948781873019F4ED +:1031700081E180931F2C8681873019F481E180934F +:103180001E2C0895BC0183E090E20C948653CF93EB +:10319000DF93FC016491EC012196662331F083E01A +:1031A00090E20E94D453CE01F4CFDF91CF910895E5 +:1031B000AB01BC0183E090E20C94B05380E28093B9 +:1031C00062060895CF93DF938091222C823029F5F7 +:1031D00083E090E20E9439540E94084F83E090E21D +:1031E0000E945554EC0197FD18C0E091682EF091B3 +:1031F000692E8781833019F483E180931F2C8681A7 +:10320000833019F483E180931E2C8C2F40D68111DA +:1032100004C08C2FDF91CF91DEC7DF91CF9108954D +:103220008091222C813079F028F08230D9F08330DF +:1032300011F12EC08091680685FF2AC08FE080932F +:10324000022081E00CC080910220815080930220F6 +:1032500081111EC00E94130D0E94B35282E0809320 +:10326000222C16C08091680685FD12C08FE08093E5 +:10327000022083E0F4CF80910220815080930220CD +:10328000811106C00E9478520E94410D1092222C9A +:103290008091222C823019F44AD70C94ED210895A4 +:1032A000E091682EF091692E8781823019F481E1D6 +:1032B00080931F2C8681823019F481E180931E2C2B +:1032C0000895E091682EF091692E8781823019F47B +:1032D00080E180931F2C8681823019F480E18093F5 +:1032E0001E2C089583E090E20C94615383E090E2F9 +:1032F0000C94A85423E33BE03F932F932DE23BE053 +:103300003F932F9326E23BE03F932F932FE13BE047 +:103310003F932F932FE73AE03F932F9322E02F9391 +:103320001F929F938F930E9465568DB79EB70E96FE +:103330008DBF9EBF85E6089560E072E00E94A20DF9 +:1033400085E60895FB0120812F3349F42181211165 +:1033500006C060E072E00E94E10D85E60895CB01B1 +:103360000E94B30D882319F0F4DC84E608958AECFA +:103370000895EF92FF920F931F93CF93DF93CDB7F2 +:10338000DEB7A097CDBFDEBF7C010091632E10E0B9 +:103390000115110591F487E79AE09F938F9382E0DE +:1033A0008F931F92FF92EF920E9465560F900F909D +:1033B0000F900F900F900F9010C0E0915D2EF09144 +:1033C0005E2ECE01019619959801AE014F5F5F4FB9 +:1033D00060E072E0C7010E94050E85E6A096CDBFB1 +:1033E000DEBFDF91CF911F910F91FF90EF90089575 +:1033F000DF92EF92FF920F931F93CF93DF93CDB79E +:10340000DEB7A097CDBFDEBF7B010091632E10E039 +:1034100060E77AE0C7010E94D755892B29F5D12CA6 +:10342000ED2CF12CE016F10658F40E94E90DE1E0D4 +:10343000F0E0EC0FFD1FEE0DFF1D8083D394F0CF65 +:10344000E0915F2EF091602ECE0101961995E091EA +:10345000652EF091662E4091632EBE016F5F7F4F07 +:1034600083E1199584E60BC0A70160E270E0CE010C +:1034700001960E943F0E8017910711F38AECA096E7 +:10348000CDBFDEBFDF91CF911F910F91FF90EF90E5 +:10349000DF900895FC018091642E882311F081E370 +:1034A00001C080E38083118285E60895FB012181BC +:1034B000211127C02081213321F481E08093642EE3 +:1034C00004C0203321F41092642E84E608952F3333 +:1034D000C1F41F9220E32F931F9221E32F932AE63A +:1034E0003AE03F932F9322E02F931F929F938F9365 +:1034F0000E9465568DB79EB70A968DBF9EBF85E622 +:1035000008958AEC089586EA90E190D48EE60895B5 +:1035100086E291E1A6D48EE60895E0ECF4E08181A4 +:103520008E7F81830E9478520E94070D84E6089561 +:10353000E0ECF4E081818E7F81830E9478520E94CA +:103540000D0D84E60895EDE4FEE225892F9324898C +:103550002F9327E63AE03F932F9322E02F931F9279 +:103560009F938F930E9465568DB79EB708968DBF27 +:103570009EBF85E608952091632E1F922F9324E627 +:103580003AE03F932F9322E02F931F929F938F93C4 +:103590000E9465568DB79EB708968DBF9EBF85E683 +:1035A000089540E052E0BC0180E0FCD885E6089533 +:1035B000FB0120812F3341F42181211105C060E0FE +:1035C00072E0DBD885E6089580E0FED8882319F004 +:1035D000C0DB84E608958AEC089540E052E0BC0127 +:1035E00081E0E0D885E60895FB0120812F3341F486 +:1035F0002181211105C060E072E0BFD885E6089501 +:1036000081E0E2D8882319F0A4DB84E608958AECEF +:10361000089540E052E0BC0182E0C4D885E60895F8 +:10362000FB0120812F3341F42181211105C060E08D +:1036300072E0A3D885E6089582E0C6D8882319F001 +:1036400088DB84E608958AEC089540E052E0BC01EE +:1036500083E0A8D885E60895FB0120812F3341F44B +:103660002181211105C060E072E087D885E60895C8 +:1036700083E0AAD8882319F06CDB84E608958AECED +:10368000089540E052E0BC0180E19BDC85E60895AE +:10369000FB0120812F3341F42181211105C060E01D +:1036A00072E064DC85E6089580E1A5DC882319F0EA +:1036B00050DB84E608958AEC089540E052E0BC01B6 +:1036C00088E07FDC85E60895FB0120812F3341F4FB +:1036D0002181211105C060E072E048DC85E6089593 +:1036E00088E089DC882319F034DB84E608958AECCD +:1036F000089560E072E07DDA85E60895FB0120819F +:103700002F3341F42181211105C060E072E081DA9C +:1037100085E60895CB0154DA882319F01ADB84E694 +:1037200008958AEC0895CF93DF93EC0166D9813038 +:1037300028E0920718F09C01385002C020E030E0E9 +:103740003F932F939F938F9324E43AE03F932F93DB +:1037500082E08F931F92DF93CF930E9465568DB7BF +:103760009EB70A968DBF9EBF85E6DF91CF910895E3 +:103770008FE294E176D38EE6089551DA84E60895D7 +:1037800000D984E6089560E072E051DB85E6089593 +:10379000CB0154DB811102C08AEC089584E60895C0 +:1037A0000E94DF0F84E608950E940F1084E60895BA +:1037B0000E946A0F84E608958091680680FD02C029 +:1037C00089E7089588E70895DF92EF92FF920F93BB +:1037D0001F93CF93DF93EC010FEF11E086E7E82E04 +:1037E0008CE0F82E9CE2D92EB70181ED93E20E9485 +:1037F000D755892BD1F001151105B9F0DE01F7017C +:103800002491ED012196C8010197222341F0013056 +:10381000110529F02C93DE0131968C01F1CFDC9259 +:103820008C0188E1E80EF11CDFCF2197188285E634 +:10383000DF91CF911F910F91FF90EF90DF9008954E +:10384000FC01209120022068209320028091230215 +:1038500080FFFCCF81E080932302A0911002B09101 +:103860001102AE5BB109B7FF02C0A0E0B0E020E0FA +:1038700038EB4BE050E00E945A55AA27BB279F9394 +:103880008F932DE33AE03F932F9382E08F931F9223 +:10389000FF93EF930E9465568DB79EB708968DBF34 +:1038A0009EBF85E608952EB13FB140910804509126 +:1038B0000904242B352B3F932F9327E33AE03F93C2 +:1038C0002F9322E02F931F929F938F930E94655610 +:1038D0008DB79EB708968DBF9EBF85E608950F935E +:1038E0001F93CF93DF931F921F92CDB7DEB78B014B +:1038F000E091682EF091692E8581873009F06FC0C4 +:10390000E091552EF091562E199581E08093772CF9 +:1039100060E270E0C8010E941D560097F9F4F801BA +:1039200001900020E9F73197E01BF10BE0FD59C051 +:10393000F695E795E130F10539F487E090E0809362 +:103940004B2E90934C2E37C053E0EE0FFF1F5A952D +:10395000E1F7E0934B2EF0934C2E2DC098012C5F95 +:103960003F4F82179307E9F5A80162E070E0CE01AE +:1039700001960E943F0E898190E0982F88272A8126 +:10398000820F911D80934B2E90934C2E0B5F1F4FF7 +:10399000F80101900020E9F73197E01BF10BE0FD01 +:1039A00020C0F695E79533E0EE0FFF1F3A95E1F75B +:1039B000E817F907B0F060914B2E70914C2E695FBB +:1039C0007F4F83E0769567958A95E1F7A8018BE4B0 +:1039D0009DE20E943F0E0E94682A8FEF03C089EC8F +:1039E00001C08AEC0F900F90DF91CF911F910F9142 +:1039F0000895EF92FF920F931F93CF93DF931F923F +:103A00001F92CDB7DEB78B01E091682EF091692E41 +:103A10008581873009F080C0E091552EF091562EB7 +:103A2000199582E08093772C60E270E0C8010E94D3 +:103A30001D567C01892B31F5F80101900020E9F732 +:103A40003197E01BF10BE0FD69C0F695E795E13099 +:103A5000F10539F487E090E080934B2E90934C2E43 +:103A600047C063E0EE0FFF1F6A95E1F7CF0169E001 +:103A700070E00E944655E81BF90BE0934B2EF09343 +:103A80004C2E36C0C8010496E816F90609F046C067 +:103A9000A80162E070E0CE0101960E943F0E2981EC +:103AA00030E0322F22278A81280F311D20934B2EA0 +:103AB00030934C2E2730310529F0C90187709927A2 +:103AC000892B61F587010F5F1F4FF80101900020DE +:103AD000E9F73197E01BF10BE0FD20C0F695E79583 +:103AE00043E0EE0FFF1F4A95E1F7E217F307B0F04E +:103AF00060914B2E70914C2E695F7F4F83E07695DD +:103B000067958A95E1F7A8018BE49DE20E943F0E3C +:103B10000E94682A8FEF03C089EC01C08AEC0F90E5 +:103B20000F90DF91CF911F910F91FF90EF9008952B +:103B3000E091682EF091692E85818730A1F4E091A3 +:103B4000552EF091562E199585E08093772C0E9482 +:103B500038430E94682A82E493E48093322C909345 +:103B6000332C8FEF089589EC0895E091682EF09141 +:103B7000692E85818730A1F4E091552EF091562E63 +:103B8000199583E08093772C0E9438430E94682A1D +:103B900082E493E48093322C9093332C8FEF08953A +:103BA00089EC0895E091682EF091692E8581873027 +:103BB000A1F4E091552EF091562E199586E0809350 +:103BC000772C0E9438430E94682A82E493E4809311 +:103BD000322C9093332C8FEF089589EC0895E09167 +:103BE000682EF091692E4085518564E6649F9001AE +:103BF000659F300D11243F932F9321E33AE03F93CB +:103C00002F9322E02F931F929F938F930E946556CC +:103C10008DB79EB708968DBF9EBF85E60895CF935A +:103C2000DF931F921F92CDB7DEB7FB0120812F33A8 +:103C3000B1F42181211113C02FEF39E03F932F936D +:103C400022E02F931F929F938F930E9465560F90AF +:103C50000F900F900F900F900F9085E627C089E589 +:103C600092E089839A83CE0101969F938F938BEF85 +:103C700099E09F938F937F936F930E949B560F9031 +:103C80000F900F900F900F900F90892B71F08981FA +:103C90009A818935F2E09F0740F4E091682EF09117 +:103CA000692E8087918784E601C08AEC0F900F907F +:103CB000DF91CF91089520911F202F9320911E20F6 +:103CC0002F9328EF39E03F932F9322E02F931F92F9 +:103CD0009F938F930E9465568DB79EB708968DBFB0 +:103CE0009EBF85E60895CF93DF931F921F92CDB7B5 +:103CF000DEB7FB0120812F33B1F42181211113C0E4 +:103D00002FE02F932FEF2F9327EA39E03F932F9344 +:103D100022E02F931F929F938F930E946556CDBFF1 +:103D2000DEBF85E627C019821A82CE0101969F93D5 +:103D30008F9383EA99E09F938F937F936F930E9471 +:103D40009B560F900F900F900F900F900F90892B14 +:103D500081F089819A818115E0E19E0750F480937A +:103D600038039093390380931E2090931F2084E69C +:103D700001C08AEC0F900F90DF91CF910895FB0165 +:103D800020812F33D9F42181211121C01F9220E3FA +:103D90002F931F9221E32F932DE939E03F932F9327 +:103DA00022E02F931F929F938F930E9465568DB7A9 +:103DB0009EB70A968DBF9EBF85E60895213311F404 +:103DC000D0D303C0203319F4F1D384E608958AECEC +:103DD0000895FC0180910008813021F480918C08C5 +:103DE000833011F080E301C081E38083118285E696 +:103DF0000895E091682EF091692E85818730A1F4B5 +:103E0000E091552EF091562E199584E08093772CF1 +:103E10000E9438430E94682A82E493E48093322C03 +:103E20009093332C8FEF089589EC089521E020932F +:103E3000312C2093302C2CE320932D2C25E030E0E6 +:103E400020932B2C30932C2C1092252C1092262C66 +:103E50001092272C1092282C8093232C9093242CA2 +:103E6000089527E02093312C2CE231E020932B2C75 +:103E700030932C2C1092252C1092262C1092272C4B +:103E80001092282C8093232C9093242C0895CF9368 +:103E90009091312C9530E1F130F4933029F140F5D7 +:103EA000913068F440C1973009F4A7C008F445C0C8 +:103EB000983009F4AAC0993009F432C134C1813074 +:103EC00041F41092292C10922A2C10922E2C83E06F +:103ED000FBC0843011F466E08BC0883109F420C146 +:103EE0008B3109F0F3C01CC180932F2C84E0ECC00F +:103EF00090E040912F2C2FEF30E0241B31098217E6 +:103F0000930721F485E0E0C0981739F165E169C0B5 +:103F10002091292C30912A2CA9014F5F5F4F4093AB +:103F2000292C50932A2CF901E654F14D8083403816 +:103F3000510509F0CBC086E0C7C020912F2C90918D +:103F4000302C291346C0EAEBFEE290E02FE2EA3380 +:103F5000F207D1F22191920FF9CF4091252C509187 +:103F6000262C6091272C7091282CE091232CF09125 +:103F7000242C20E830E08AEB9EE21995C82F882394 +:103F800011F18091302C8F5F8093302C8091252C03 +:103F90009091262CA091272CB091282C80589F4FCF +:103FA000AF4FBF4F8093252C9093262CA093272CA6 +:103FB000B093282C66E083E090E20E94D45382E024 +:103FC0008093312CB1C068E183E090E20E94D45329 +:103FD0000EC030E0892F90E001972817390739F497 +:103FE00066E083E090E20E94D45382E06DC068E115 +:103FF00083E090E20E94D45393C0853119F410926B +:10400000302C09C08B3109F48BC0883109F463CF9F +:10401000863009F05DC08091302C8F5F8093302C0A +:104020004091252C5091262C6091272C7091282CA2 +:10403000E091232CF091242C20E830E08AEB9EE2E2 +:104040001995C82F8823D1F161E083E090E20E94A6 +:10405000D4536091302C83E090E20E94D45360915D +:10406000302C609583E090E20E94D45360E870E0C9 +:104070008AEB9EE29DD8EAEBFEE260E08FE2EA3353 +:10408000F80719F08191680FF9CF83E090E20E9460 +:10409000D4538091252C9091262CA091272CB0915F +:1040A000282C80589F4FAF4FBF4F8093252C909363 +:1040B000262CA093272CB093282C36C064E083E0F4 +:1040C00090E20E94D45389E08093312CC1E02CC04F +:1040D0008531E1F761E083E090E20E94D453609182 +:1040E000302C83E090E20E94D4536091302C609594 +:1040F00083E090E20E94D45360E870E08AEB9EE295 +:1041000057D8EAEBFEE260E02FE2EA33F20719F05B +:104110008191680FF9CF83E090E20E94D453D6CF0B +:104120001092312CD3CFC0E08C2FCF910895809185 +:10413000312C813019F0873029F1089580912B2C92 +:1041400090912C2C9C012150310920932B2C3093E1 +:104150002C2C892B31F580912D2C9FEF980F90936B +:104160002D2C882331F065E183E090E20E94D45346 +:1041700002C01092312C85E090E080932B2C90931C +:104180002C2C089580912B2C90912C2C9C0121504B +:10419000310920932B2C30932C2C892B11F4109265 +:1041A000312C0895EDE4FBE020E030E09491981389 +:1041B00009C041E2429FC001439F900D1124825BE0 +:1041C000944F08952F5F3F4FB1962930310571F715 +:1041D00080E090E00895CF92DF92EF92FF920F93EC +:1041E0001F93CF93982F9F7D91549A3160F090ED5B +:1041F000980F9A3040F08F3531F0982F9D7F9D3386 +:1042000011F08032D1F49FE9980F9A3108F480526E +:104210002091372C3091382C2F3F91E0390708F04E +:10422000D3C0A9014F5F5F4F4093372C5093382C78 +:10423000F901E654F14D8083C7C08D3009F095C077 +:10424000E091372CF091382CE654F14D1082109209 +:10425000372C1092382C8091362C8111B5C080916A +:10426000BA2E982F9F7D09F495C08D7F8D3309F468 +:1042700091C0EAEBFEE27F01C191CC2331F0CF3354 +:1042800021F0CD3311F0C032B1F7F701108286E78B +:10429000C82E8CE0D82E00E010E0B6018AEB9EE23A +:1042A0000E94D755892B09F056C01092BA2ECF33F1 +:1042B00049F488E1809FF001819FF00D1124E457BB +:1042C000F34F18C0B7016F5F7F4FCD3349F488E1DA +:1042D000809FF001819FF00D1124E657F34F20C01D +:1042E000C11113C088E1809FF001819FF00D11245E +:1042F000EA57F34F259134912115310509F44DC04A +:104300008AEB9EE2F901199514C0C03209F045C04C +:1043100088E1809FF001819FF00D1124E857F34F51 +:104320002591349121153105C1F18AEB9EE2F90105 +:1043300019958F3F99F581E08093362C8EB19FB10E +:104340002091080430910904822B932B8093342C04 +:104350009093352C39C00F5F1F4FF8E1CF0ED11C61 +:104360000732110509F099CF15C0883061F48091AA +:10437000372C9091382C009739F101978093372C86 +:104380009093382C21C08B31F9F41092372C109275 +:10439000382C1AC088ECC0E002C089ECC1E002DF12 +:1043A0000E94C7188AE49BE00E94C718CC2361F0E2 +:1043B0008091BA2E882341F08AEB9EE20E94C218B7 +:1043C00087E49BE00E94C71881E0CF911F910F9175 +:1043D000FF90EF90DF90CF9008958091362C882346 +:1043E00099F1E091682EF091692E20853185211593 +:1043F000310551F18EB19FB14091080450910904EB +:10440000842B952B4091342C5091352C841B950B8B +:1044100064E670E00E94465562177307A8F0109298 +:10442000362C8BECBFDE0E94C71884E49BE00E9410 +:10443000C718E091322CF091332C309729F0199560 +:104440001092322C1092332C08958091362C8823B0 +:10445000A9F01092362C8BECA5DE0E94C71884E4DC +:104460009BE00E94C718E091322CF091332C3097DA +:1044700029F019951092322C1092332C0895CF9375 +:10448000DF939091362C9923A9F0EB011092362CF2 +:1044900089DE0E94C71881E49BE00E94C71820971C +:1044A00049F0CE010E94C2188EE39BE0DF91CF91CC +:1044B0000C94C718DF91CF910895EF92FF920F935C +:1044C0001F93CF937C019B01613081E0780710F04E +:1044D00020E031E08B01021B130BA70160E072E0CA +:1044E0008AEB9EE20E94050E8AEB9EE20E94C218B1 +:1044F000C1E0013081E01807B0F01A956C2F70E030 +:10450000762F6627A701460F571F20E032E060E0B4 +:1045100072E08AEB9EE20E94050E8AEB9EE20E9408 +:10452000C218CF5FE6CF0115110591F0EC2FF0E036 +:10453000FE2FEE27A7014E0F5F1F980160E072E08B +:104540008AEB9EE20E94050E8AEB9EE20E94C21850 +:104550008BE39BE0CF911F910F91FF90EF900C9414 +:10456000C71880910008813029F480918C0883302D +:1045700009F4089580913B2C811117C081E080934C +:10458000000893E090938C088093392C10923A2C79 +:104590008EB19FB12091080430910904822B932B96 +:1045A0008093402C9093412C0895089510928C088C +:1045B00010920008E9E3FCE21082118208959091C4 +:1045C000392C9923F1F080913A2C811115C020915A +:1045D000392C2223B9F02EB13FB1409108045091FB +:1045E0000904242B352B4091402C5091412C241B45 +:1045F000350B2634310530F081E080933A2C892F39 +:10460000089581E00895CF93DF931F92CDB7DEB771 +:1046100080913B2C8823D1F02EB13FB1409108040A +:1046200050910904242B352B40913E2C50913F2C66 +:10463000241B350B40913C2C50913D2C2417350701 +:1046400028F010923B2C89838CDF89810F90DF91B9 +:10465000CF91089580931E2090931F20809338035C +:1046600090933903089580911E2090911F20089601 +:1046700080931E2090931F208093380390933903DA +:10468000089580E991E080931E2090931F208093ED +:104690003803909339030895A0E2B6E081E01596BF +:1046A0008C9315972AEB30E328B939B92AE331E323 +:1046B0002AB93BB910B813B812B816B817B811B860 +:1046C000E0E0F9E010A211A22FEF30E026A337A31B +:1046D0002FEF3FEF20A731A7808388E8838380E115 +:1046E000848783E087831C968C931C9782E01A96BC +:1046F0008C9308951F920F920FB60F92112408B653 +:104700000F9218BE0BB60F921BBE8F939F93EF9321 +:10471000FF93E0E0F9E013828FE790E086AB97AB80 +:1047200081E190E080AF91AFE0E0FAE010A211A249 +:104730008FEF9FEF86A397A389E88383168281E09A +:1047400084878EE0808310922A06FF91EF919F91DB +:104750008F910F900BBE0F9008BE0F900FBE0F9061 +:104760001F9018951F920F920FB60F92112408B642 +:104770000F9218BE0BB60F921BBE2F933F938F93D1 +:104780009F93EF93FF932091280693B1267081E0C9 +:1047900009F080E0990F892B83B982B1882309F44D +:1047A00064C012B883B18770873059F51092000940 +:1047B00080E180930C091092030A1B9B03C08CEAD2 +:1047C00094E002C08CE694E08093260A9093270A36 +:1047D00082E081B981E080930C0A83E08093060A2D +:1047E00086B197B1877049F090B18F5F893011F031 +:1047F0009695FBCFE8B1F9B1908381E08093422C8C +:1048000037C093B1892F8C7099F192FB992790F959 +:1048100081E0982781B181111BC080B186959111EB +:1048200090E8892B80B926B137B12F5F3F4F26B969 +:1048300037B927703327232BD9F4E8B1F9B19F0199 +:104840002F5F3F4F28B939B9808381E081B910C00B +:1048500081B1813069F4EAB1FBB19F012F5F3F4F15 +:104860002AB93BB9908311B803C082B1809582B94F +:1048700088E880930309FF91EF919F918F913F9179 +:104880002F910F900BBE0F9008BE0F900FBE0F9090 +:104890001F9018951F920F920FB60F92112408B611 +:1048A0000F9218BE0BB60F921BBE2F933F938F93A0 +:1048B0009F93EF93FF9381B1823008F49DC081B143 +:1048C0008D3008F099C0E1B1F0E0EE0FFF1FEA5D16 +:1048D000FF4D0190F081E02D19948FE790E08093D7 +:1048E000260A9093270A88C08E9A8EE0809340080B +:1048F0008FE390E08093260A9093270A85E06FC0AB +:104900008E9886E081B98FEF82B914B815B8E8B1F6 +:10491000F9B1808180B970C0009B05C08E9A82B1C8 +:10492000809582B901C08E9887E059C0009B02C073 +:104930008E9801C08E9A80B1869580B984B195B168 +:10494000019684B995B984B195B187709927892B5F +:1049500011F488E044C024B135B186B197B128176D +:104960003907B1F52BC0EAB1FBB1309711F0808166 +:1049700001C082B1882311F08E9A01C08E9889E01F +:104980002EC0EAB1FBB1309751F08081882311F03D +:104990008E9801C08E9A3196EAB9FBB908C082B1EF +:1049A000882311F08E9801C08E9A8FEF82B924B1BE +:1049B00035B186B197B12817390711F48AE00FC0D5 +:1049C000E8B1F9B1CF01019688B999B9818180B96F +:1049D00086E005C08E988BE002C08E988CE081B98D +:1049E0000BC01092000A1092060A10924008109212 +:1049F000410881E08093432CFF91EF919F918F912B +:104A00003F912F910F900BBE0F9008BE0F900FBEDD +:104A10000F901F901895CF93DF93E2E4FCE2108291 +:104A20001182E0E4F6E0128A84E08283C0E8D1E0FB +:104A300082E68E83A0E2B6E081E016968C9316970C +:104A400011968C93119796E012969C93129751961B +:104A50008C93519742E052964C9352971A961C921F +:104A60001A9733E019963C9399E598839AE59983D0 +:104A700090E491839683A0EBB0E012962C9112976C +:104A8000207F12962C93129712962C9112972260E7 +:104A900012962C9320E321832683908B8683458373 +:104AA0003183E0E0F8E083E1818321E030E026A378 +:104AB00037A320A731A7E0E8F8E014868083E0E27E +:104AC000F3E01382118288E0828391E19083209148 +:104AD0001E2030911F20208F318FE0E8F3E09CE30F +:104AE0009283808393838183DF91CF91D5CDA0E2A0 +:104AF000B6E01A961C921A97E2E4FCE21082118248 +:104B0000E0E0F9E010821382178280E18487E0E020 +:104B1000FAE010821382168281E08487E0E4F8E0F4 +:104B20001082118216968C938E980895CF93DF93FE +:104B30008091422C882309F47EC01092422CC6B189 +:104B4000D7B1C730D10508F471C0AE01495F5F4FDE +:104B500093E0569547959A95E1F7E091652EF0918F +:104B6000662E6AEB70E380E41995E091682EF0916F +:104B7000692E8781883019F483E180931F2C868108 +:104B8000883019F483E180931E2CE0915B2EF09124 +:104B90005C2EBE018AEB90E31995EC0194FF06C0F0 +:104BA000DF7E8AE391E38AB99BB902C01AB81BB8C9 +:104BB0002097E1F1AE01495F5F4F83E0569547953D +:104BC0008A95E1F7E091652EF091662E6AEB70E32D +:104BD00081E41995E091682EF091692E87818930E2 +:104BE00019F483E180931F2C8681893019F483E1C5 +:104BF00080931E2CC6B9D7B98AEB90E388B999B9CE +:104C000010926008109261088FE090E0809366082F +:104C10009093670888E090E080936A0890936B080F +:104C200083E28093410883E081B905C01092000AB5 +:104C30001092060A31DD8091432C882329F01092CE +:104C4000432CDF91CF9128CDDF91CF910895CF9361 +:104C5000DF93E0E4F6E0128A84E08283C0E8D1E0EA +:104C600082E68E83A0E2B6E081E016968C931697DA +:104C700011968C93119796E012969C9312975196E9 +:104C80008C93519742E052964C9352971A961C92ED +:104C90001A9733E019963C93199799E598839AE50A +:104CA000998390E491839683C0EBD0E02A81207FA2 +:104CB0002A832A8122602A8320E321832683908B02 +:104CC000868345833183E0E0F8E093E1918321E03E +:104CD00030E026A337A320A731A7E0E8F8E0148648 +:104CE0009083E0E2F3E01382118298E0928341E145 +:104CF000408340911E2050911F20408F518FE0E84B +:104D0000F3E04CE3428390834383918315968C9325 +:104D1000E0E0F9E08FE790E086A397A322A733A70E +:104D2000108216828CE087831092000A1092442C25 +:104D3000E7E4FCE2108212821182DF91CF910895A4 +:104D400081E08093260632DCE0E0F9E010821782F1 +:104D5000E0E0FAE010821782E7E4FCE211821282BE +:104D6000108208951F920F920FB60F92112408B669 +:104D70000F9218BE0BB60F921BBE2F933F938F93CB +:104D80009F93EF93FF93E091442CF0E0EE0FFF1F11 +:104D9000E05CFF4D0190F081E02D199410928C0899 +:104DA0001092000886E18A95F1F700C081E08093B7 +:104DB000000883E080938C0818B88091BA3086B9D7 +:104DC00017B882E001C083E08093442C86C03099FC +:104DD00011C082B181110EC010928C08109200088F +:104DE00096E19A95F1F700C081E08093000883E096 +:104DF00080938C0884E0E8CF309B10C010928C0820 +:104E00001092000886E18A95F1F700C081E0809356 +:104E1000000893E090938C0882B901C012B886B163 +:104E2000869586B984B195B1019784B995B9892BD6 +:104E300011F485E001C083E08093442C87B18F5F3B +:104E400087B9877009F049C0E8B1EF5FE8B9F0E0D1 +:104E5000E654FF4C808186B940C082B181110EC0FA +:104E600010928C081092000896E19A95F1F700C014 +:104E700081E08093000883E080938C0886E0A4CFD3 +:104E80001092000982E591E00197F1F700C000005F +:104E900082E08093870389E3809381038AEB90E328 +:104EA0008AB99BB981E090E084B995B980E886B968 +:104EB0008EB19FB12091080430910904822B932B6D +:104EC0008093452C9093462C81E08093492C18B810 +:104ED00017B81092442C01C000C0FF91EF919F9130 +:104EE0008F913F912F910F900BBE0F9008BE0F90A6 +:104EF0000FBE0F901F9018951F920F920FB60F9232 +:104F0000112408B60F9218BE0BB60F921BBE2F933A +:104F10003F934F935F938F939F93EF93FF931092E1 +:104F2000070A1092000A10924709109240098091D6 +:104F300081038E7F8093810384B195B18770992717 +:104F4000892BC9F0E4B1F5B186B144B155B193E014 +:104F5000F695E7959A95E1F7E654FF4C90E0477097 +:104F6000552728E030E0241B350B02C09595879526 +:104F70002A95E2F7808381E08093482C1092492C97 +:104F80008FEF9FEF8093260A9093270A1092200AB2 +:104F90001092210A1092060A1092070A1092030A30 +:104FA00084E08093000A87E08093442CFF91EF9186 +:104FB0009F918F915F914F913F912F910F900BBED9 +:104FC0000F9008BE0F900FBE0F901F9018951F9264 +:104FD0000F920FB60F92112408B60F9218BE0BB69F +:104FE0000F921BBE8F93EF93FF93E0E8F3E0818174 +:104FF0008F7C8183E0E0FAE088E8838381E080832E +:10500000FF91EF918F910F900BBE0F9008BE0F9004 +:105010000FBE0F901F9018951F920F920FB60F9210 +:10502000112408B60F9218BE0BB60F921BBE2F9319 +:105030003F934F935F938F939F93EF93FF93809151 +:105040006009109260091092610992E09093400902 +:10505000813620F0813A08F063C077C086B186952A +:1050600086B984B195B1019684B995B987709927AD +:10507000892B41F4EAB1FBB1CF0101968AB99BB902 +:1050800086B1808384B195B180FD88C0369986C091 +:105090001092070A1092000A1092470910924009D4 +:1050A000809181038E7F8093810384B195B1877055 +:1050B0009927892BC9F0E4B1F5B186B144B155B156 +:1050C00093E0F695E7959A95E1F7E654FF4C90E06A +:1050D0004770552728E030E0241B350B02C095951A +:1050E00087952A95E2F7808381E08093482C10927F +:1050F000492C8FEF9FEF8093260A9093270A1092F6 +:10510000200A1092210A1092060A1092070A1092A1 +:10511000030A84E08093000A87E08093442C3EC019 +:1051200086B18695806886B984B195B1019684B9B7 +:1051300095B987709927892B41F4EAB1FBB1CF016A +:1051400001968AB99BB986B1808386B186958068BD +:1051500086B984B195B1019684B995B987709927BC +:10516000892B41F4EAB1FBB1CF0101968AB99BB911 +:1051700086B1808386B1869586B984B195B1019652 +:1051800084B995B987709927892B41F4EAB1FBB1AD +:10519000CF0101968AB99BB986B18083FF91EF91C7 +:1051A0009F918F915F914F913F912F910F900BBEE7 +:1051B0000F9008BE0F900FBE0F901F901895BF92D2 +:1051C000CF92DF92EF92FF920F931F93CF93DF93D3 +:1051D000CDB7DEB7DA95CDBFDEBF8091492C8823ED +:1051E000F1F08EB19FB140910804509109042091D3 +:1051F000452C3091462C842B952B821B930B2091B0 +:105200002020309121202F5F3F4F2817390738F495 +:1052100014B815B881E08093482C1092492CF3D92A +:10522000811149C1CCD9882309F445C18091492C09 +:10523000811141C18091472C811105C08091482C7A +:10524000882309F438C18091442C873041F480913F +:10525000200A9091210A8532914008F42CC1809156 +:10526000482C882309F4ABC084B195B1892B09F48B +:10527000A6C084B195B1089718F414B815B89FC0AA +:1052800044B155B1495F5F4F63E0569547956A95C4 +:10529000E1F76AEB70E3CE0101960E94FC558AEBC0 +:1052A00090E38AB99BB904B115B114B815B88981D6 +:1052B00086958695898372E0C72ED12CE3E1BE2EB8 +:1052C000F8E0EF2EF12CC016D10608F078C0F601F8 +:1052D00053E0F695E7955A95E1F741E050E04C0F21 +:1052E0005D1FE40FF51F8081982F9695969590830A +:1052F0008370813039F0E8F0823009F059C086B10E +:10530000869503C086B18695806886B984B195B1CB +:10531000019684B995B987709927892B09F048C0FF +:10532000EAB1FBB1CF0101968AB99BB986B18083FE +:105330003FC084B195B187709927892BC1F0E4B142 +:10534000F5B186B124B135B143E0F695E7954A95BC +:10535000E1F7E654FF4C90E027703327A701421B8A +:10536000530B02C0959587954A95E2F78083E091AB +:10537000682EF091692E8781883011F4B0921F2C2D +:105380008681883011F4B0921E2C44B155B1495F2A +:105390005F4F93E0569547959A95E1F7E091652E1A +:1053A000F091662E6AEB70E382E4199581E001C00A +:1053B00080E052E0C50ED11C882309F484CF1092FE +:1053C000472C1092482C64B175B1E0915B2EF0919E +:1053D0005C2E8AEB90E3199584B995B984B195B1A7 +:1053E000892B09F468C089E0809381031092000A38 +:1053F0001092200A1092210A8FE790E08093260AEB +:105400009093270A8FE590E08093280A9093290AC9 +:105410001092060A80E180930C0A93E09093070AA9 +:1054200010926009109261092FEF3FEF20936609F7 +:105430003093670920E031E02093680930936909CF +:105440001092460980934C0981E08093470981E1DD +:105450008093800110928801109280031092290697 +:10546000E091682EF091692E8781893019F483E1EB +:1054700080931F2C8681893019F483E180931E2C40 +:1054800044B155B1495F5F4F83E0569547958A9582 +:10549000E1F7E091652EF091662E6AEB70E383E40C +:1054A000199581E08093442C12B810922009109233 +:1054B000210980930009D395CDBFDEBFDF91CF9145 +:1054C0001F910F91FF90EF90DF90CF90BF900895C4 +:1054D00014B815B881E08093472C43C81092070A8E +:1054E0001092000A1092470910924009809181039E +:1054F0008E7F8093810384B195B187709927892B22 +:10550000C9F0E4B1F5B186B144B155B193E0F69577 +:10551000E7959A95E1F7E654FF4C90E047705527E0 +:1055200028E030E0241B350B02C0959587952A951D +:10553000E2F7808381E08093482C1092492C8FEF12 +:105540009FEF8093260A9093270A1092200A1092C8 +:10555000210A1092060A1092070A1092030A84E0A8 +:105560008093000A87E08093442C1092442C109280 +:10557000482C1092472C1AC881E080934C2C109232 +:105580004A2C089581E080934C2C08950895CF9281 +:10559000DF92EF92FF920F931F93CF93DF93CDB7DC +:1055A000DEB72597CDBFDEBF8C01FC0180819091D5 +:1055B0004C2C9230F1F038F0943079F120F19530A4 +:1055C00009F44AC049C121E09227292F2170209374 +:1055D0004A2C911102C0863219F0823509F03CC183 +:1055E00084E4F8018083118282E080934C2C80E176 +:1055F00034C190914A2C911102C08632B1F08235AB +:1056000009F04DC012C090914A2C911102C086320F +:1056100061F0823509F075C008C090914A2C911153 +:1056200002C0863211F0823539F484E4F8018083B7 +:10563000118281E089270DC0803309F41BC1823AB1 +:1056400009F434C1803A09F451C1803509F4F6C037 +:1056500081E080934C2C00C160E170E0C8010E94A1 +:1056600073348823A1F08091642E81110BC0609166 +:105670004B2CF4E06F9FB001112444E050E0C801CE +:105680000E94FC0E84E080934C2C8AE004C084E0ED +:1056900080934C2C81E0F801808384E0DEC0833964 +:1056A000B9F619821A821B821C8288E8898343E03A +:1056B00050E060E070E0CE0102960E94AE0EF8016C +:1056C0008181803209F4ABC0803709F048C0F8010D +:1056D000928189819813C0C093818A819813BCC03C +:1056E00094818B819813B8C095818C819813B4C034 +:1056F00084E0808361E070E0C8010E94483483E068 +:105700002AC0853909F0A4CF44E050E064E070E09D +:10571000CE0101960E94AE0EF8018181803209F41B +:105720007EC08037E1F4F80192818981981394C09A +:1057300093818A81981390C094818B8198138CC037 +:1057400095818C81981388C0108261E070E0C80157 +:105750000E94483484E080934C2C88E17EC0E82E7F +:10576000E2949FE0E9222EEF2E0D8F70F82E88E054 +:1057700090E08F1991094FEF50E06A0102C0D59473 +:10578000C7948A95E2F7253021F0243059F5FF209F +:10579000E9F044E050E0B8016E5F7F4FCE01019622 +:1057A0002D830E94EF552D81892B61F49A81898187 +:1057B00089279B8189279C818927F80196818927E0 +:1057C0008C2169F1243071F4F11046C044E050E0BE +:1057D000B8016E5F7F4FCE0101960E94EF55892B75 +:1057E000F1F03AC02430C0F5E22EF12CA701B80147 +:1057F0006E5F7F4FCE0101960E94EF55892B61F5B8 +:10580000D801AE0DBF1DE1E0F0E0EC0FFD1FEE0D85 +:10581000FF1D12969C9180818927C822E9F4298175 +:10582000F80120833A8131839B8192838C81838329 +:10583000232792278927848388E20FC0F80181817A +:10584000811142C062E070E0C8010E947334882375 +:1058500009F420CF10924C2C80E090E02596CDBF2B +:10586000DEBFDF91CF911F910F91FF90EF90DF90FE +:10587000CF900895F801F18062E070E0C8010E94C5 +:105880007334882309F406CFFFE0FF15E8F084E0C5 +:10589000F89EB001112440E150E0C8010E94AE0E14 +:1058A00060E170E0C801F4D780E9D7CFF801F1805A +:1058B00066E070E0C8010E947334882309F4EACEE0 +:1058C0008EEF8F0D8E3018F0F8011082E6CE8091A9 +:1058D000642E8111DACEF4E0FF9EB001112444E081 +:1058E00050E0C80102960E94FC0ECFCEF801F18074 +:1058F00062E070E0C801F7D7882309F4CBCE8EEFC1 +:105900008F0D8E3008F7F0924B2C85E0BCCECF93F4 +:10591000DF93EC0143E050E060E070E00E94AE0EE7 +:1059200044E050E064E070E0CE010396DF91CF9157 +:105930000C94AE0E0F931F93CF93DF931F921F9281 +:10594000CDB7DEB78C01FC0190818181892798E871 +:105950008927928189278A839481838189279581E8 +:10596000892796818927898343E050E060E070E0D1 +:10597000C8010E94FC0E41E050E063E070E0CE01FF +:1059800002960E94FC0E44E050E064E070E0C80122 +:1059900003960E94FC0E41E050E068E070E0CE010A +:1059A00001960E94FC0E0F900F90DF91CF911F91F6 +:1059B0000F91089581E08093702C84E090E08093B3 +:1059C0004F2C9093502C88E080934E2C10924D2CAD +:1059D000089581E08093702C84E490E080934F2CB4 +:1059E0009093502C88E080934E2C10924D2C08956B +:1059F00081E08093702C82E090E080934F2C909314 +:105A0000502C88E180934E2C10924D2C089581E00B +:105A10008093702C089508958F929F92AF92BF92B9 +:105A2000CF92DF92EF92FF920F931F93CF93DF936A +:105A3000CDB7DEB76397CDBFDEBF8C015B01809130 +:105A4000702C6730710501F5F8019081882311F001 +:105A5000963211F09235C1F421E0811120E02093BB +:105A60004D2C40914F2C3091502C211102C0963278 +:105A700011F0923539F4F801408331838FEF809330 +:105A8000512C38C0A12CB12C853009F49CC050F4A5 +:105A90008230A9F1C8F0833009F469C0843009F478 +:105AA00082C0C2C5883009F425C138F4863009F4B3 +:105AB0009AC0873009F4D3C0B7C5893009F44FC301 +:105AC0008D3008F471C3B0C591E08927982F91708B +:105AD00090934D2C30914F2C2091502CF8019081B7 +:105AE000811102C0963219F0923509F019C4F801FB +:105AF0003083218384E08093702C80E196C5F80187 +:105B00008081982F9D7F913419F48AE0808367C348 +:105B10008033C1F462E070E0C801E5D6882309F45F +:105B20009CC0F8016181F0E16F9FB001112440E158 +:105B300050E0C8010E94AE0E60E170E0C801A8D636 +:105B400080E973C5803A79F462E070E0C801CBD691 +:105B5000882309F482C0F80181818093672C83E057 +:105B60008093702CD2CF803509F05EC552C060E1C1 +:105B700070E0C801B8D6882389F08091642E811125 +:105B80000BC06091672CF0E16F9FB001112440E1E0 +:105B900050E0C8010E94FC0E8AE001C081E0F801DB +:105BA000808382E01AC390914D2C30914F2C20912C +:105BB000502CF8018081911102C0863211F182359A +:105BC00009F0B6C31EC090914D2C30914F2C2091FE +:105BD000502CF8018081911102C0863291F08235FB +:105BE00009F053C40EC090914D2C30914F2C209150 +:105BF000502CF8018081911102C0863211F082355B +:105C000031F4F8013083218381E0892786C3803510 +:105C1000C9F4F8018181882319F0F8011082DFC2EC +:105C200062E070E0C8015FD68823B9F0E091652E8C +:105C3000F091662E40E060E070E081E919951092E5 +:105C4000702CF2C490EA980F923008F0C1C462E060 +:105C500070E0C80148D68111EAC481E054C2C8018D +:105C60000E94463A64E07801F4E0EF0EF11CC701AF +:105C70000E945D3DE091652EF091662E44E0B701F3 +:105C800080EA1995F80194818091682C981329C0B5 +:105C900095818091692C981324C0968180916A2CFB +:105CA00098131FC0978180916B2C98131AC0809114 +:105CB0006C2C808380916D2C818380916E2C8283EB +:105CC00080916F2C838364E0C8010E944F3FE09174 +:105CD000652EF091662E44E0B80181EA199588E0BE +:105CE00009C2E091652EF091662E44E068E67CE200 +:105CF00080EC32C2F8018081803551F481818111BC +:105D000007C08281873521F483818D3C09F40AC262 +:105D100064E0C8010E945D3DF8018081803309F094 +:105D2000C2C062E070E0C801DED5882309F4ACC0CF +:105D3000F801618167FD04C0862F8370833029F0EC +:105D4000862F8F708F3009F084C06093672C80910C +:105D5000522C9091532C3091542C282F2295209521 +:105D6000422F4927407F09F043C023272F7009F0B5 +:105D70003FC0929590959327907FD1F5262F67FD90 +:105D800002C0237003C02F7009F023E0982F909574 +:105D9000432F42954F702223C1F0892F90E0022EAD +:105DA00002C0959587950A94E2F7982FE32FF0E0CB +:105DB000022E02C0F595E7950A94E2F73E2F50E0D7 +:105DC00002C0559547952A95E2F740FBCC24C0F8D0 +:105DD000D12CCC0CDD1CCC0CDD1C30FBEE24E0F80F +:105DE000F12CEE0CFF1CEC28892F81708E2901C04C +:105DF00087E02091662C30E0280F311D280F311DDF +:105E0000F901E05BFF4D8081F8019801205F3F4F71 +:105E10001192E217F307E1F79091552CF801918761 +:105E200082FF09C09091522C96839091532C9783B6 +:105E30009091542C908784FF15C06360F0E16F9FB0 +:105E4000B0011124665F7F4F46E050E0C8010A961A +:105E500007C080E1689FB001112440E150E0C80113 +:105E60000E94AE0E60E170E0C80112D5E091652E8F +:105E7000F091662E42E1B80180E8199562E1C8010F +:105E80000E944F3F80E939C10E94683C91E0892718 +:105E9000F8018083E091652EF091662E44E0B80110 +:105EA00081EC19959CC1803A61F462E070E0C80110 +:105EB0001AD58823D9F1F80181818093672C89E074 +:105EC0000DC0803C89F462E070E0C8010CD58823E5 +:105ED00069F1F80181818093672C8BE08093702CAD +:105EE0000E94683C9AE00EC1813C91F462E070E04F +:105EF000C801F9D48823D1F0F80181818093672CFF +:105F00004AE0F42EF092702C0E94683C8F25FBC072 +:105F1000823C99F462E070E0C801E5D4882331F056 +:105F2000F80181818093672C8CE0D8CFE091652EB9 +:105F3000F091662E44E0B80121C0803B11F562E08B +:105F400070E0C801D0D4E091652EF091662E44E057 +:105F5000B801882399F086E819958091642E811103 +:105F6000BFCFF8016181F0E16F9FB001112440E1E2 +:105F700050E086E59CE20E94FC0EB2CF81EC1995C0 +:105F8000BEC090EA980F923008F0BFC062E070E0A7 +:105F9000C801A9D4882309F4B2C0F80180818036F1 +:105FA00021F03AE3C32ED12C03C020E3C22ED12C22 +:105FB000F801818187FF0CC0807FF0E18F9F700125 +:105FC000112480ECC80ED11C96EFA92EB12C08C06C +:105FD0008C7F90E1899F7001112486E3A82EB12C5B +:105FE000E091652EF091662E42E0B80180E91995A6 +:105FF000F801808181708093662CC701B4E096958A +:106000008795BA95E1F78093672C9091512C98175A +:1060100069F0B7016A0D7B1D44E050E082E59CE227 +:106020000E94AE0E8091672C8093512C68E0CE01C7 +:1060300001960E94EC0D8091632E44E050E0873081 +:1060400019F463E070E002C060E070E0CE010F96EA +:106050000E94AE0EB7016C0D7D1D46E050E0CE01F2 +:1060600009960E94AE0E89818093682C8A81809364 +:10607000692C8B8180936A2C8C8180936B2C60E4DB +:1060800088E69CE20E9495418091682C80936C2C5C +:106090008091692C80936D2C80916A2C80936E2C5A +:1060A00080916B2C80936F2C60E28CE69CE20E94C6 +:1060B000954120E0AE014F5F5F4FBE01615F7F4FB2 +:1060C000CE010996F7D68981F80180838A81818380 +:1060D0008B8182838C818383E058FF4F8D81808305 +:1060E00031968E81808331968F8180833196888529 +:1060F000808387E08093702C80E290E174C30E94DB +:10610000683C91E08927F80101CD8035B9F4F801A8 +:106110008181811182CD62E070E0C801E4D38823DF +:1061200009F49BCD1092702CE091652EF091662EB3 +:1061300040E060E070E081E9199576C2A501495F11 +:106140005F4FA3E056954795AA95E1F7E091652E3C +:10615000F091662EB80182E9199581E0DEC062E116 +:10616000C8010E945D3D60E170E0C801BCD3E091D0 +:10617000652EF091662E882329F142E1B80181E86D +:1061800019958091642E81110BC06091672CF0E10C +:106190006F9FB001112440E150E0C8010E94FC0E45 +:1061A0000E94683C9AE015C066E0C8010E945D3D0F +:1061B00064E070E0C80197D3811113C0E091652EAF +:1061C000F091662E44E0B80181EC19950E94683C7C +:1061D00091E08927F801808388E08093702C84E027 +:1061E00024C26091672CF0E16F9FB001112440E15F +:1061F00050E086E59CE20E94AE0E9091562C809174 +:106200005A2C80959813EBC280915E2C9813E7C2AC +:106210002091572C80915B2C80952813E0C28091AF +:106220005F2C2813DCC2C090582C80915C2C809588 +:10623000C812D5C28091602CC812D1C28091592C4D +:1062400030915D2C30958313CAC23091612C831339 +:10625000C6C24091622C3091632C30954313BFC26B +:106260003091642C4313BBC23091652C309543139D +:10627000B6C2F801308141818280912CA12CB12CD1 +:10628000540199248824942A832A3381B32AD12C57 +:10629000E12CF12C7601DD24CC24D22AC92AF82A5B +:1062A0008091702C8B3009F07FC2E091652EF091C7 +:1062B000662E46E0B80185E81995C818D908EA089D +:1062C000FB08C092562C33272F2D1E2D0D2D009329 +:1062D000572CA701662777274093582C8F2D992795 +:1062E000AA27BB278093592CEC2DE095E0935A2CDC +:1062F000E02FE095E0935B2CE42FE095E0935C2C9D +:10630000E82FE095E0935D2CC0925E2C00935F2C0B +:106310004093602C8093612C88E08093702C84C122 +:10632000903409F081C182E08093702C8AE0EBCE3A +:10633000833909F084CC8091632E873009F0A0C0A6 +:1063400043E050E060E070E0CE0102960E94AE0EA5 +:1063500088E88983F8019181903219F0903761F0D3 +:1063600024C0F80180833A8131832B8122839C8170 +:1063700093832327822728C1F8018281883809F076 +:1063800053C193818A8198134FC194818B81981353 +:106390004BC195818C81981347C184E0808361E073 +:1063A00070E0C80175D285E09EC0E92EE2942FE02E +:1063B000E2222EEF2E0D9F70F92E88E090E08F19CB +:1063C00091094FEF50E06A0102C0D594C7948A95B5 +:1063D000E2F7253021F0243059F5FF20E9F044E0C0 +:1063E00050E0B8016E5F7F4FCE0101962B8B0E946B +:1063F000EF552B89892B61F49A818B81892798E845 +:1064000089279C818927F801968189278C2181F130 +:10641000243071F4F11008C144E050E0B8016E5F1F +:106420007F4FCE0101960E94EF55892B09F1FCC0E8 +:10643000243008F0F9C0E22EF12CA701B8016E5FFC +:106440007F4FCE0101960E94EF55892B09F0ECC0D9 +:10645000D801AE0DBF1DE1E0F0E0EC0FFD1FEE0D29 +:10646000FF1D12969C9180818927C82209F0DCC00B +:1064700098E8F80190833A8131832B812283A0C070 +:1064800044E050E060E070E007C0853909F0D7CB08 +:1064900044E050E063E070E0CE0101960E94AE0E51 +:1064A00090914E2CF8018181803209F482C08037AE +:1064B000F1F4F801228189812813B6C023818A81F1 +:1064C0002813B2C024818B812813AEC025818C8112 +:1064D0002813AAC0908361E070E0C801D9D18FEF82 +:1064E0008093512C86E08093702C88E19EC0E82E2A +:1064F000E2949FE0E9222EEF2E0D8F70F82E88E0B7 +:1065000090E08F1991094FEF50E06A0102C0D594D5 +:10651000C7948A95E2F7253021F0243059F5FF2001 +:10652000E9F044E050E0B8016E5F7F4FCE01019684 +:106530002B8B0E94EF552B89892B61F49A818981DD +:1065400089279B8189279C818927F8019681892742 +:106550008C2179F1243071F4F11066C044E050E0F0 +:10656000B8016E5F7F4FCE0101960E94EF55892BD7 +:1065700001F15AC0243008F057C0E22EF12CA701D7 +:10658000B8016E5F7F4FCE0101960E94EF55892BB7 +:1065900009F04AC0D801AE0DBF1DE1E0F0E0EC0FFC +:1065A000FD1FEE0DFF1D12969C9180818927C82248 +:1065B000D9F52981F80120833A8131839B81928327 +:1065C0008C818383232792278927848388E22DC0A7 +:1065D000823C09F0CBC0F8019181903E09F0C8C01F +:1065E0009281943B09F0C4C046E050E06AEA74E04E +:1065F000CE0101960E94AE0E89818B3409F02DCB1D +:106600008A81893709F029CB8B818B3109F025CB21 +:106610008C818A3E09F021CB8D818B3709F01DCB0F +:106620008E818C3C09F019CB80E090E0DCC0F80151 +:106630008081803621F08AE3C82ED12C03C0B0E3DC +:10664000CB2ED12CF801818187FF0CC0807FF0E137 +:106650008F9F7001112480ECC80ED11CA6EFAA2ECA +:10666000B12C08C08C7F90E1899F70011124F6E362 +:10667000AF2EB12CE091652EF091662E42E0B8016C +:1066800080E91995F801808181708093662CC7019B +:10669000E4E096958795EA95E1F78093672CB7013A +:1066A0006A0D7B1D44E050E082E59CE20E94AE0E44 +:1066B0008091672C8093512C68E0CE0101960E9456 +:1066C000EC0D8091632E44E050E0873019F463E0D4 +:1066D00070E002C060E070E0CE010F960E94AE0E46 +:1066E000B7016C0D7D1D46E050E0CE0109960E9479 +:1066F000AE0E89818093682C8A818093692C8B816E +:1067000080936A2C8C8180936B2C60E488E69CE2F9 +:106710000E9495418091682C80936C2C8091692C0B +:1067200080936D2C80916A2C80936E2C80916B2CC1 +:1067300080936F2C60E28CE69CE20E94954187E09A +:106740008093702C8981F80180838A8181838B8179 +:1067500082838C818383AE014F5F5F4FBE01615F97 +:106760007F4FCE010996F0D080E25FCF803339F0C1 +:10677000982F9F7E903A19F0805C833078F481E006 +:106780008093702C84E0F8018083E091652EF09175 +:10679000662E40E060E070E082EC83CBE091652EF5 +:1067A000F091662E40E0D6CC8A3069F4E091652EF7 +:1067B000F091662E46E0B80184E81995C80CD91C02 +:1067C000EA1CFB1C7ECD8C3009F07BCDE091652E60 +:1067D000F091662E46E0B80187E8199572CD0E94C7 +:1067E000683C96E0F6CC6396CDBFDEBFDF91CF91DB +:1067F0001F910F91FF90EF90DF90CF90BF90AF90DF +:106800009F908F900895CF93DF932091632E273030 +:1068100071F4EC0143E050E060E070E00E94AE0EE5 +:1068200044E050E063E070E0CE01039604C044E031 +:1068300050E060E070E0DF91CF910C94AE0ECF930A +:10684000DF931F92CDB7DEB72091632E273029F456 +:1068500047E050E060E070E015C0FC01318120812C +:1068600023273281232733812327298344E050E0E3 +:1068700060E070E00E94FC0E41E050E064E070E0F7 +:10688000CE0101960E94FC0E0F90DF91CF910895EA +:1068900020E42093D00026EC2093D5002093D40050 +:1068A00021E02093D000DC01680F791FA617B707FD +:1068B00041F0ED91F0E0EC59FA4FE491E093D30010 +:1068C000F5CFE091D500F0E0EC59FA4FE491EC936C +:1068D000E091D400F0E0EC59FA4FE4911196EC937A +:1068E0001092D000089520E42093D00026EC20934D +:1068F000D5002093D40021E02093D000DC01680F64 +:10690000791FA617B70741F0ED91F0E0EC59FA4F67 +:10691000E491E093D300F5CFE091D500F0E0EC599D +:10692000FA4FE4918C918E130AC0E091D400F0E00C +:10693000EC59FA4FE49181E011969C919E1380E00E +:106940001092D000817008958F929F92AF92BF9263 +:10695000CF92DF92EF92FF920F931F93CF93DF932B +:10696000DC018C9110E0E0E0869517958695E7951F +:10697000869517958695E795869517958695E7955B +:10698000869517958695E79511968C911197869522 +:1069900017958695E795869517958695E79586953B +:1069A00017958695E795869517958695E79512969E +:1069B0008C911297F0E030E08695F79586953795A3 +:1069C0008695F795869537958695F79586953795AB +:1069D0008695F7958695379513968C91139786959E +:1069E000F795869537958695F7958695379586958B +:1069F000F795869537958695F795869537951496EC +:106A00008C91149790E020E0869597958695279530 +:106A1000869597958695279586959795869527953A +:106A2000869597958695279515968C918695979539 +:106A3000869527958695979586952795869597951A +:106A40008695279586959795869527955B01DA011A +:106A50004A0144E0840E911C6C91E50179915E013C +:106A60007627C32ED12CA60140545E4DEE2EF12C7C +:106A7000E701C054DF4D7E01EA01D880E7010881BB +:106A8000ED2CE02AC22ED12CA60140545D4DEA0126 +:106A90000881E02AF12CA70140565F4DEA010881E8 +:106AA00006958795DF2FD071FD2E012F017EF026F0 +:106AB000092F0072F0260E2F0479F026032F03779A +:106AC000F026022F0A73F0260F2D0295F0260F2DC7 +:106AD00006950695F0260F2D0727F6940F250695A7 +:106AE0009795F79517957695CF2ED12CA601405402 +:106AF0005E4DE12EF12CE701C054DF4D7E01EA012D +:106B0000D880E7010881ED2CE02AC92ED12CA601FE +:106B100040545D4DEA010881E02AF12CA70140565E +:106B20005F4DEA01088106958795D32FD071FD2E20 +:106B30000E2F017EF026022F0072F026012F04791D +:106B4000F0260F2F0377F026092F0A73F0260F2D5A +:106B50000295F0260F2D06950695F0260F2D072796 +:106B6000F6940F25069527953795E7957695C32ECC +:106B7000D12CA60140545E4DEE2EF12CE701C054FD +:106B8000DF4D7E01EA01D880E7010881ED2CE02A83 +:106B9000C22ED12CA60140545D4DEA010881E02AA5 +:106BA000F12CA70140565F4DEA01088106958795B3 +:106BB000DF2FD071FD2E012F017EF026092F0072EC +:106BC000F0260E2F0479F026032F0377F026022FEC +:106BD0000A730F25F02EF2940F25F02EF694F694FA +:106BE0000F25F02EF72606950F25D12E102F16957E +:106BF0009795F795D79476950F2F10E0A8014054FC +:106C00005E4D0D2D10E000541F4DEA01F880E801A3 +:106C100018810F2D012BE92EF12CA70140545D4D59 +:106C2000EA011881012B10E000561F4DE801188180 +:106C300016958795032F00711E2F117E0127122FA5 +:106C4000107201271D2D147901271F2F137701279B +:106C5000192F1A730127102F12950127102F16953F +:106C600016950127102F172706951027169527959B +:106C70003795E7957695032F10E0A80140545E4DB7 +:106C80000E2F10E000541F4DEA01F880E801188132 +:106C90000F2D012BE22EF12CA70140545D4DEA018E +:106CA0001881012B10E000561F4DE8011881169540 +:106CB00087950F2F00711D2D117E0127192F10723E +:106CC00001271E2F14790127132F13770127122F65 +:106CD0001A730127102F12950127102F169516955C +:106CE0000127102F172706950127102F1695979526 +:106CF000F795D79476950F2F10E0A80140545E4D7C +:106D00000D2D10E000541F4DEA01F880E8011881B4 +:106D10000F2D012BE92EF12CA70140545D4DEA0106 +:106D20001881012B10E000561F4DE80118811695BF +:106D30008795032F00711E2F117E0127122F1072CD +:106D400001271D2D147901271F2F13770127192FD4 +:106D50001A730127102F12950127102F16951695DB +:106D60000127102F17270695102716952795379579 +:106D7000E7957695032F10E0A80140545E4D0E2F45 +:106D800010E000541F4DEA01F880E80118810F2D32 +:106D9000012BE22EF12CA70140545D4DEA01188130 +:106DA000012B10E000561F4DE801188116958795BC +:106DB0000F2F00711D2D117E1027092F0072102733 +:106DC0000E2F04791027032F03771027022F0A7341 +:106DD0001027012F02951027012F069506951027E1 +:106DE000012F0727169501271D2D06959795F795D5 +:106DF0001795CF2ED12CA60140545E4DE12EF12CDB +:106E0000E701C054DF4D7E01EA01D880E701088127 +:106E1000ED2CE02AC92ED12CA60140545D4DEA018B +:106E20000881E02AF12CA70140565F4DEA01088154 +:106E300006958795D32FD071FD2E0E2F017EF0265B +:106E4000022F0072F026012F0479F0260F2F03770E +:106E5000F026092F0A730F25F02EF2940F25F02E3D +:106E6000F694F6940F2576957027069570277695FB +:106E700027953795E79568276D93A815B90509F00B +:106E8000EBCD1093712CF093722C9093732CE093B4 +:106E9000742C3093752C2093762CDF91CF911F9119 +:106EA0000F91FF90EF90DF90CF90BF90AF909F90A9 +:106EB0008F9008954F925F926F927F929F92AF92C0 +:106EC000BF92CF92DF92EF92FF920F931F93CF93D7 +:106ED000DF93DC018C9110E0B12CEB2D8695E795CA +:106EE000869517958695E795869517958695E795E6 +:106EF000869517958695E7958695179511968C91A9 +:106F00001197BE2E8695B794869517958695B7945A +:106F1000869517958695B794869517958695B79417 +:106F20008695179512969C91129730E080E0969581 +:106F300087959695379596958795969537959695D5 +:106F40008795969537959695879596953795139647 +:106F50009C911397969587959695379596958795D5 +:106F600096953795969587959695379596958795A5 +:106F7000969537951496EC91149790E000E0E6957D +:106F80000795E6959795E6950795E6959795E69585 +:106F90000795E6959795E6950795E6959795159645 +:106FA000DC90D6940795D6949795D6940795D69469 +:106FB0009795D6940795D6949795D6940795D69499 +:106FC0009795E32FF0E0E054FE4DA12FB0E0A054E0 +:106FD000BF4DF081EC91EF2BA92FB0E0A054BD4D37 +:106FE000FC91EF2BF0E0E056FF4DE0802B01BA0161 +:106FF0006C5F7F4FDA013B01AC90E201C9902E013A +:10700000CA24FD2DE694F795D82FD071FD2EEB2DD7 +:10701000E17EFE26E02FE072FE26E12FE479FE26D7 +:10702000E32FE377FE26E92FEA73EF25FE2EF29495 +:10703000EF25FE2EF694F694EF25FE2EFC24E69521 +:10704000FE26EB2D20FDFE24F69407958795E79507 +:10705000BC2CB694C82ED12CA60140545E4DEE2E09 +:10706000F12CE701C054DF4D7E01EA01D880E70131 +:10707000F880ED2CEF28C02ED12CA60140545D4D98 +:10708000EA01F880EF28F12CA70140565F4DEA0194 +:10709000D880D694F795D32FD071ED2E412F417E15 +:1070A000E426592F5072E526CE2FC479EC26D82F2E +:1070B000D377ED26402F4A73E426FE2CF294EF247A +:1070C000FE2CF694F694EF24FE2CFB24E694FE248A +:1070D00020FDFD24F694979537951795B694C32E09 +:1070E000D12CE601C054DE4DE12EF12CA701405415 +:1070F0005F4DD880EA01F880ED2CEF28C92ED12C05 +:10710000A60140545D4DEA01F880EF28F12CA7015B +:1071100040565F4DEA01D880D694F795D82FD071AC +:10712000ED2E4E2F417EE426502F5072E526C12FC2 +:10713000C479EC26D32FD377ED26492F4A73E42662 +:10714000FE2CF294EF24FE2CF694F694EF24FE2C01 +:10715000FB24E694FE2420FDFD24F69407958795F4 +:10716000E795B694C82ED12CE601C054DE4DEE2E24 +:10717000F12CA70140545F4DD880EA01F880ED2C36 +:10718000EF28C02ED12CA60140545D4DEA01F880B5 +:10719000EF28F12CA70140565F4DEA01D880D69424 +:1071A000F795D32FD071ED2E412F417EE426592F34 +:1071B0005072E526CE2FC479EC26D82FD377ED2652 +:1071C000402F4A73E426FE2CF294EF24FE2CF69412 +:1071D000F694EF24FE2CFB24E694FE2420FDFD24EF +:1071E000F694979537951795B694C32ED12CE60152 +:1071F000C054DE4DE12EF12CA70140545F4DD880E4 +:10720000EA01F880ED2CEF28C92ED12CA6014054BC +:107210005D4DEA01F880EF28F12CA70140565F4D43 +:10722000EA01D880D694F795D82FD071ED2E4E2F45 +:10723000417EE426502F5072E526C12FC479EC26FA +:10724000D32FD377ED26492F4A73E426FE2CF294F0 +:10725000EF24FE2CF694F694EF24FE2CFB24E69407 +:10726000FE2420FDFD24F69407958795E795B694B6 +:10727000C82ED12CE601C054DE4DEE2EF12CA70114 +:1072800040545F4DD880EA01F880ED2CEF28C02EE5 +:10729000D12CA60140545D4DEA01F880EF28F12C75 +:1072A000A70140565F4DEA01D880D694F795D32FB9 +:1072B000D071ED2E412F417EE426592F5072E526E4 +:1072C000CE2FC479EC26D82FD377ED26402F4A73E2 +:1072D000E426FE2CF294EF24FE2CF694F694EF2490 +:1072E000FE2CFB24E694FE2420FDFD24F6949795C5 +:1072F000379517959B2C9694C32ED12CE601C0543C +:10730000DE4DE12EF12CA70140545F4DD880EA01FB +:10731000F880ED2CEF28C92ED12CA60140545D4DEC +:10732000EA01F880EF28F12CA70140565F4DEA01F1 +:10733000D880D694F795D82FD0714E2F417EF42E59 +:10734000FD26502F5072F526C12FC479FC26D32F6D +:10735000D377FD26492F4A73F426EF2CE294FE24BE +:10736000EF2CE694E694FE24EF2CE924F694FE2418 +:10737000BE2EEF2D20FDED25E69507958795B79458 +:10738000C82ED12CE601C054DE4DEB2CF12CA70108 +:1073900040545F4DD880EA01E881ED2CEE2AC02EE2 +:1073A000D12CA60140545D4DEA01E881EE2AF12C72 +:1073B000A70140565F4DEA01F880DF2EF694D7947E +:1073C000F32FF071E12FE17EEF27F92FF072EF2715 +:1073D000FB2DF479EF27F82FF377EF27F02FFA73CF +:1073E000EF27FE2FF295EF27FE2FF695F695EF2764 +:1073F00096949E26E6959E2620FD9F24969497952A +:1074000037951795E32FF0E0AF0140545E4DE12F23 +:10741000F0E0E054FF4DEA01F880E081EF29E92E29 +:10742000F12CA70140545D4DEA01F881EF2BF0E00B +:10743000E056FF4DE080EA2DF0E0EC59FB4FE4917F +:10744000EE25E301E9933E01AD24AD92A617B707FF +:1074500009F0D2CDB092712C8093722C0093732CD2 +:107460001093742C3093752C9093762CDF91CF91E0 +:107470001F910F91FF90EF90DF90CF90BF90AF9052 +:107480009F907F906F905F904F900895AF92BF92C2 +:10749000CF92DF92EF92FF920F931F93CF93DF93E0 +:1074A0006091712C5091722C2091732C4091742C0E +:1074B0003091752CD091762CFC015C0104E0A00E7B +:1074C000B11C8191C52FC071962F917EC927922F33 +:1074D0009072C927942F9479C927932F9377C9273E +:1074E0009D2F9A73C9277C2F7295C7277C2F76957D +:1074F0007695C727A32FB0E08D0100541E4D68017B +:10750000A42FB0E08D0100541F4D7801D6010C91DD +:10751000D7019C91092BED2EF12CD701A054BD4D24 +:107520009C91092B10E000561F4DD8017C917827C3 +:107530007C27C6957C2786957695279557956795E0 +:10754000C32FC071942F917EC9279D2F9072C92798 +:10755000962F9479C927952F9377C927922F9A73DD +:10756000C9277C2F7295C7277C2F76957695C727DC +:10757000052F10E0D801A054BE4D6D01062F10E07C +:10758000D801A054BF4D7D01D6010C91D7019C912B +:10759000092BE22EF12CD701A054BD4D9C91092B53 +:1075A00010E000561F4DD8017C9178277C27C695A6 +:1075B0007C2786959D2F7695979537954795C52F6E +:1075C000C071762F717EC727722F7072C727742FF4 +:1075D0007479C727732F7377C727792F7A73C727D3 +:1075E0007C2F7295C7277C2F76957695C727032F1A +:1075F00010E0D801A054BE4D6D01042F10E0D80159 +:10760000A054BF4D7D01D6010C91D7017C91072B71 +:10761000E92EF12CD701A054BD4D7C91072B10E031 +:1076200000561F4DD8017C9178277C27C6957C2772 +:1076300086957695279557956795C32FC071742FBA +:10764000717EC727792F7072C727762F7479C72765 +:10765000752F7377C727722F7A73C7277C2F729580 +:10766000C7277C2F76957695C727052F10E0D80180 +:10767000A054BE4D6D01062F10E0D801A054BF4D9F +:107680007D01D6010C91D7017C91072BE22EF12CC4 +:10769000D701A054BD4D7C91072B10E000561F4D23 +:1076A000D8017C9178277C27C6957C27869576958E +:1076B000979537954795C52FC071762F717EC7274F +:1076C000722F7072C727742F7479C727732F73773F +:1076D000C727792F7A73C7277C2F7295C7277C2FEE +:1076E00076957695C727032F10E0D801A054BE4D9C +:1076F0006D01042F10E0D801A054BF4D7D01D601CB +:107700000C91D7017C91072BE92EF12CD701A054C5 +:10771000BD4D7C91072B10E000561F4DD8017C9188 +:1077200078277C27C6957C2786957695279557954B +:107730006795C32FC071742F717EC727792F707220 +:10774000C727762F7479C727752F7377C727722FAE +:107750007A73C7277C2F7295C7277C2F76957695ED +:10776000C727052F10E0D801A054BE4D6D01062F8C +:1077700010E0D801A054BF4D7D01D6010C91D70176 +:107780007C91072BE22EF12CD701A054BD4D7C91AA +:10779000072B10E000561F4DD8017C9178277C27DD +:1077A000C6957C2786957695979537954795C52FED +:1077B000C071762F717EC727722F7072C727742F02 +:1077C0007479C727732F7377C727792F7A73C727E1 +:1077D0007C2F7295C7277C2F76957695C727032F28 +:1077E00010E0D801A054BE4D6D01042F10E0D80167 +:1077F000A054BF4D7D01D6010C91D7017C91072B80 +:10780000E92EF12CD701A054BD4D7C91072B10E03F +:1078100000561F4DD8017C9178277C27C6957C2780 +:107820007695279557956795C32FC071742F717EF4 +:107830007C27C92FC0727C27C62FC4797C27C52F0F +:10784000C3777C27C22FCA737C27C72FC2957C279A +:10785000C72FC695C6957C278695C52FD0E0C05406 +:10786000DE4D062F10E000541F4DD881D801CC9179 +:10787000CD2B022F10E000541D4DD801DC91CD2BF3 +:10788000D0E0C056DF4DC8818C27872776958727A3 +:10789000D92F8695D79537954795EA15FB0509F0B9 +:1078A00010CE6093712C5093722C2093732C4093C4 +:1078B000742C3093752CD093762CDF91CF911F913F +:1078C0000F91FF90EF90DF90CF90BF90AF90089511 +:1078D000CF93DF93E1E7FCE2A08171816281338184 +:1078E00024819581472F40718A2F817E8427462FDE +:1078F00040728427432F44798427422F437784277B +:10790000492F4A738427482F42958427482F46954C +:1079100046958427482F46958427869567957795C1 +:10792000A795C22FD0E0C054DE4D432F50E0405405 +:107930005F4DB881EA018881B82B492F50E040544F +:107940005D4DEA018881CB2FC82BD0E0C05ADF4DB6 +:1079500088818695522F5071432F417E4527592F9C +:10796000507245275A2F54794527572F537745276B +:10797000562F5A734527542F52954527542F569505 +:1079800056954527542F5695452746959795279503 +:107990003795C72FD0E0C054DE4D4A2F50E04054F9 +:1079A0005F4DB881EA014881B42B462F50E0405426 +:1079B0005D4DEA014881CB2FC42BD0E0C05ADF4D8A +:1079C0004881842B8695572F50714A2F417E452739 +:1079D000562F50724527532F54794527522F5377EE +:1079E0004527592F5A734527542F52954527542F11 +:1079F000569556954527542F569545274695679594 +:107A00007795A795C22FD0E0C054DE4D432F50E0AC +:107A100040545F4DB881EA014881B42B492F50E0B2 +:107A200040545D4DEA014881CB2FC42BD0E0C05AB1 +:107A3000DF4D4881842B8695C72FD0E0C054DE4DA2 +:107A40004A2F50E040545F4DB881EA014881B42B81 +:107A5000462F50E040545D4DEA014881CB2FC42BA6 +:107A6000D0E0C05ADF4D4881842B522F5071432FF4 +:107A7000417E4527592F507245275A2F5479452763 +:107A8000572F53774527562F5A734527542F529512 +:107A90004527542F569556954527542F56954527DB +:107AA0004695979527953795A08371836283338395 +:107AB00024839583DF91CF9108950F931F93CF93E4 +:107AC000DF93A091712C7091722C2091732C5091A6 +:107AD000742C4091752C3091762CFC01615008F487 +:107AE000CDC1972F90718A2F817E8927922F907216 +:107AF0008927952F94798927942F93778927932F16 +:107B00009A738927982F92958927982F96959695FD +:107B10008927982F96958927869527957795A795F4 +:107B2000C42FD0E0C054DE4D852F90E080549F4D8F +:107B3000B881EC018881B82B832F90E080549D4D53 +:107B4000EC018881CB2FC82BD0E0C058DF4DB88125 +:107B5000B695942F9071852F817E8927932F9072EF +:107B600089279A2F94798927972F93778927922F9E +:107B70009A738927982F92958927982F969596958D +:107B80008927982F969589278695379547955795F4 +:107B9000C72FD0E0C054DE4D8A2F90E080549F4D17 +:107BA0001881EC018881182B822F90E080549D4D24 +:107BB000EC018881C12FC82BD0E0C058DF4D8881EF +:107BC000B82BB695972F90718A2F817E8927922F97 +:107BD00090728927952F94798927942F93778927F5 +:107BE000932F9A738927982F92958927982F969586 +:107BF00096958927982F9695892786952795779525 +:107C0000A795C42FD0E0C054DE4D852F90E080545E +:107C10009F4D1881EC018881182B832F90E08054B0 +:107C20009D4DEC018881C12FC82BD0E0C058DF4D9D +:107C30008881B82BB695942F9071852F817E8927E6 +:107C4000932F907289279A2F94798927972F93776A +:107C50008927922F9A738927982F92958927982F91 +:107C6000969596958927982F969589278695379585 +:107C700047955795C72FD0E0C054DE4D8A2F90E02E +:107C800080549F4D1881EC018881182B822F90E041 +:107C900080549D4DEC018881C12FC82BD0E0C05885 +:107CA000DF4D8881B82BB695972F90718A2F817EF2 +:107CB0008927922F90728927952F94798927942F5D +:107CC00093778927932F9A738927982F92958927DD +:107CD000982F969596958927982F9695892786951A +:107CE00027957795A795C42FD0E0C054DE4D852FFA +:107CF00090E080549F4D1881EC018881182B832FD0 +:107D000090E080549D4DEC018881C12FC82BD0E0BC +:107D1000C058DF4D8881B82BB695942F9071852F70 +:107D2000817E9827832F807298278A2F84799827BD +:107D3000872F83779827822F8A739827892F829598 +:107D40009827892F869586959827892F8695982735 +:107D5000832F9695879547955795C72FD0E0C054A8 +:107D6000DE4D0A2F10E000541F4D3881E801988144 +:107D7000392B022F10E000541D4DE8019881C32FCC +:107D8000C92BD0E0C058DF4D3881B32BB695372FC3 +:107D900030719A2F917E9327322F30729327352F8F +:107DA00034799327342F33779327382F3A739327D7 +:107DB000392F32959327392F369536959327392FBA +:107DC00036959327969527957795A795C42FD0E05C +:107DD000C054DE4D052F10E000541F4D3881E801DE +:107DE0009881392B082F10E000541D4DE80198812F +:107DF000C32FC92BD0E0C058DF4D98813B2F392BC2 +:107E00003695C72FD0E0C054DE4D0A2F10E0005445 +:107E10001F4DB881E8019881B92B022F10E0005462 +:107E20001D4DE8019881CB2FC92BD0E0C058DF4D04 +:107E3000B881B32B342F3071952F917E9327382F33 +:107E4000307293273A2F34799327372F337793273C +:107E5000322F3A739327392F32959327392F36953E +:107E600036959327392F36959327382F9695379542 +:107E70004795579580818B27819330CEA093712CA5 +:107E80007093722C2093732C5093742C4093752C08 +:107E90003093762CDF91CF911F910F910895CF925F +:107EA000DF92EF92FF921F93CF93DF931091712C8B +:107EB000D091722CC091732C7091742C4091752CC0 +:107EC0002091762CE42FF0E0E054FE4DA72FB0E097 +:107ED000A054BF4DE0813C91E32BA22FB0E0A05411 +:107EE000BD4D3C91E32BF0E0E056FF4D3081DC01CD +:107EF00080E0615008F405C2582F369557959D2FA4 +:107F00009071812F817E89279C2F90728927972FCE +:107F100094798927942F93778927322F3A7383276F +:107F2000982F92958927982F969596958927982F1F +:107F3000969589279C2F86959795D7951795569551 +:107F4000342F3071872F817E8327322F3072832721 +:107F5000312F347983273D2F33778327392F3A7395 +:107F60008327382F32958327382F369536958327E8 +:107F7000382F369583278695279547957795CD2E6B +:107F8000D12CF601E054FE4D6F01E12EF12CF701EA +:107F9000E054FF4D7F01F6013081F7018081832B92 +:107FA000E92EF12CF701E054FD4D3081E82FE32B51 +:107FB000F0E0E058FF4D8081582B56953D2F3071F1 +:107FC000812F817E8327392F30728327372F347991 +:107FD0008327342F33778327322F3A738327382F21 +:107FE00032958327382F369536958327382F369547 +:107FF000832786959795D7951795C42ED12CF60192 +:10800000E054FE4D6F01E72EF12CF701E054FF4DD7 +:108010007F01F6013081F7018081832BE22EF12C64 +:10802000F701E054FD4D3081E82FE32BF0E0E058FC +:10803000FF4DC0815C2B5695342F3071872F817E88 +:108040008327322F30728327312F347983273D2FB6 +:1080500033778327392F3A738327382F3295832735 +:10806000382F369536958327382F36958327869572 +:10807000279547957795CD2ED12CF601E054FE4DEE +:108080006F01E12EF12CF701E054FF4D7F01F60165 +:108090003081F7018081832BE92EF12CF701E05428 +:1080A000FD4D3081E82FE32BF0E0E058FF4DC0811B +:1080B000C52BC6953D2F3071812F817E8327392FA7 +:1080C00030728327372F34798327342F33778327F0 +:1080D000322F3A738327382F32958327382F3695DE +:1080E00036958327382F3695832786959795D7958C +:1080F0001795C42ED12CF601E054FE4D6F01E72EEA +:10810000F12CF701E054FF4D7F01F6013081F701BA +:108110008081382BE22EF12CF701E054FD4D808157 +:10812000E32FE82BF0E0E058FF4D8081C82BC69587 +:10813000342F3071872F817E8327322F307283272F +:10814000312F347983273D2F33778327392F3A73A3 +:108150008327382F32958327382F369536958327F6 +:10816000382F36958327542F8695279557957795E1 +:10817000CD2ED12CF601E054FE4D6F01E12EF12CF5 +:10818000F701E054FF4D7F01F6013081F701808156 +:10819000832BE92EF12CF701E054FD4D3081E82FBF +:1081A000E32BF0E0E058FF4D80818C2B482F469563 +:1081B0003D2F3071812F817E3827892F807238279B +:1081C000872F84793827852F83773827822F8A73E2 +:1081D0003827832F82953827832F869586953827D1 +:1081E000832F86953827C92F3695C795D79517952C +:1081F000E52FF0E0E054FE4D872F90E080549F4D36 +:108200003081FC018081382B822F90E080549D4D7D +:10821000FC019081E32FE92BF0E0E058FF4D9081C5 +:10822000842F892B382F3695ED2FF0E0CF01805425 +:108230009E4D6C01E12FF0E0CF0180549F4DF6017F +:108240004081FC019081492BEC2EF12CC701805418 +:108250009D4DFC019081E42FE92BF0E0E058FF4DAB +:108260009081832F892B352F3071972F917E39275D +:10827000922F90723927912F947939279D2F9377D8 +:1082800039274C2F4A733427932F92953927932FF0 +:10829000969596953927932F96953927452F36959C +:1082A000279547957795C42ED12CF601E054FE4DC5 +:1082B0006F01E72EF12CF701E054FF4D7F01F6012D +:1082C0003081F7019081392BE22EF12CF701E05437 +:1082D000FD4D9081E32FE92BF0E0E056FF4D30811A +:1082E0009C91E92FF0E0EC59FB4FE4917D01F0E81F +:1082F000EF0EF11C5E2F5327F701508398279D93B3 +:10830000F8CD1093712CD093722CC093732C709372 +:10831000742C4093752C2093762CDF91CF911F9174 +:10832000FF90EF90DF90CF9008950F931F93FC0183 +:10833000862F90812181428150E060E070E0BA0197 +:1083400055274427522B492B9381792B8B012227C8 +:108350003327803208F471C0D80123E0B695A79581 +:108360002A95E1F70A271B27980136952795369518 +:108370002795BBE07695679557954795BA95D1F7C0 +:108380000227132720E030E095E1000F111F221F84 +:10839000331F9A95D1F7402B512B622B732B8B01F6 +:1083A00022273327D80133E0B695A7953A95E1F710 +:1083B0000A271B2798013695279536952795BBE008 +:1083C0007695679557954795BA95D1F70227132764 +:1083D00020E030E095E1000F111F221F331F9A9516 +:1083E000D1F7402B512B622B732B8B012227332784 +:1083F000D80133E0B695A7953A95E1F70A271B27F0 +:1084000098013695279536952795BAE07695679524 +:1084100057954795BA95D1F70227132720E030E00A +:1084200096E1000F111F221F331F9A95D1F7402BA1 +:10843000512B622B732B805289CF4083518302834F +:1084400073831F910F910895AF92BF92CF92DF92E5 +:10845000EF92FF920F931F93CF93DF9367307105D5 +:1084600009F451C09B0127703327232B09F04EC01C +:10847000EB016C015B0183E0B694A7948A95E1F768 +:108480007B0196E0F694E7949A95E1F7EA0CFB1CE1 +:10849000EC0CFD1C8501015011090C0D1D1DA701DF +:1084A000401B510B60E070E0C80101960E94165617 +:1084B0000C151D0520F1D801EC91F0E0EC59FB4FB3 +:1084C00044919701D7010A171B0768F48C91982FE4 +:1084D000990FF90182919F01881F8827881F892B96 +:1084E0008C931197F0CF11968C9111978E7FE42F7A +:1084F000E170E82B1196EC9301501109D9CFC50119 +:108500008C0F9D1F04C087E090E001C0CB01DF917C +:10851000CF911F910F91FF90EF90DF90CF90BF9080 +:10852000AF900895EF92FF920F931F93CF93DF9335 +:10853000EC01CB0167307105D1F169E070E00E9478 +:108540004655DE0120E030E088E090E0261737074E +:1085500039F1F90143E0F695E7954A95E1F7E20F25 +:10856000F31FEC0FFD1F408150E0890107701127B8 +:10857000002E02C0559547950A94E2F74C930115D9 +:10858000110551F0E1817C01E01AF10A01C0EE0F02 +:10859000EA94EAF74E2B4C932F5F3F4F1196D6CFBC +:1085A000C90123E0880F991F2A95E1F702C087E0EF +:1085B00090E0DF91CF911F910F91FF90EF90089580 +:1085C000EF92FF920F931F93CF93DF93EC01CB01B8 +:1085D0006730710509F442C069E070E00E944655B9 +:1085E00020E030E088E090E026173707B9F1D901A4 +:1085F00043E0B695A7954A95E1F7A20FB31FA901ED +:1086000047705527AC0FBD1FEC91F0E0042E02C05F +:10861000F595E7950A94E2F74115510559F0119641 +:108620000C9111977C01E41AF50A01C0000FEA943D +:10863000EAF7E02BF0E0EC59FB4FE4911196AC9196 +:10864000B0E08D0102C0159507954A95E2F7A801A3 +:108650004E2740FD05C02F5F3F4FC6CF81E001C0D0 +:1086600080E0DF91CF911F910F91FF90EF900895DF +:108670001092492D08951092492D1092772C109246 +:108680004A2D0895F8DF0E946E2A1092492D089510 +:1086900008950895DC0123E633E66150E8F04D913A +:1086A000942F922780E1989FA00111244927E42F5D +:1086B000F0E042954F70232F3327C9018427AC0186 +:1086C0003E2F22272427352743E0EE0FFF1F4A9530 +:1086D000E1F72E273F27E1CFC90108952F923F925E +:1086E0004F925F926F927F928F929F92AF92BF92C2 +:1086F000CF92DF92EF92FF920F931F93CF93DF936E +:10870000CDB7DEB7C154D240CDBFDEBF8C017B01F7 +:108710008091772C833009F442C138F4813079F0AC +:10872000823009F4B4C00C94CD4D853009F4C2C434 +:1087300008F49CC2863009F4D1C60C94CD4DC0908B +:108740004B2ED0904C2EC114D104C1F0A601495F2C +:108750005F4F23E0569547952A95E1F76BE47DE25C +:10876000C8010E94FC5560914B2E70914C2EC8019F +:108770006BDE10924B2E10924C2E9AC4611571052F +:1087800009F4A8C0C8011CDFB82EB701C801CADEB1 +:108790007C019C01295F3F4FA901440F551F93E0C5 +:1087A000569547959A95E1F74A5F5F4F41385105D5 +:1087B00038F060EC73E2CE0101960E94285693C017 +:1087C000A3E036952795AA95E1F7A80160E870E047 +:1087D000CE0101960E94050E8C01CF5FDD4FF8821D +:1087E000C150D240CE5FDD4FE882C250D2408FEC04 +:1087F00093E29F938F93B0E8EB2EF12CC701801B7F +:10880000910B9F938F9381E090E08C0F9D1F800FC1 +:10881000911F9F938F930E942F56080F191FB70126 +:10882000601B710B22E030E0AE014F5F5D4F81E0D5 +:1088300090E08C0F9D1F800F911F0E94050E9801E4 +:10884000280F391F0F900F900F900F900F900F90DF +:10885000C701821B930B41E050E04C0F5D1F240FBA +:10886000351FB11003C042ED53E202C041EE53E2A6 +:108870005F934F939F938F933F932F930E942F5615 +:108880000F900F900F900F900F900F902CC0C090F2 +:108890004B2ED0904C2EC114D104C9F0A601495FD3 +:1088A0005F4FF3E056954795FA95E1F76BE47DE26B +:1088B000C8010E94FC5590914B2E80914C2E109235 +:1088C0004B2E10924C2EC92ED82E0C94CF4D6115E4 +:1088D000710599F488E0EDE0F4E2DE011196019073 +:1088E0000D928A95E1F71092772CBE016F5F7F4F52 +:1088F00085E60E943F220C94CF4D9B01295F3F4F9C +:1089000073E0369527957A95E1F7A80160E870E065 +:10891000CE0101960E94050E8C01CF5FDD4FF882DB +:10892000C150D240CE5FDD4FE882C250D2408FECC2 +:1089300093E29F938F93E0E8EE2EF12CC701801B0A +:10894000910B9F938F9381E090E08C0F9D1F800F80 +:10895000911F9F938F930E942F56800F911FB701F5 +:10896000681B790B22E030E0AE014F5F5D4FA1E064 +:10897000B0E0AC0FBD1F8A0F9B1F0E94050E109226 +:10898000772CBE016F5F7F4F85E60E943F220F90DC +:108990000F900F900F900F900F900C94CF4D8091EF +:1089A0004A2DB090492D882331F0B1E0BB1508F471 +:1089B00044C110924A2DE5E0EB15B0F0F3E0BF168C +:1089C000E0F521E02B15C8F081E090E080932020B5 +:1089D0009093212082E5D8018C9382E08093492DE9 +:1089E00067E0C62ED12C2BC138E03B1508F0A0C0A3 +:1089F0004AE0B41609F4E9C020C1B2E1EB16F10473 +:108A000008F4ADC0B701C801DBDD8823F9F0B70178 +:108A1000C80188DDF801818190E0982F88272081A6 +:108A2000822B80933B2D90933C2D83E9808380E2C1 +:108A3000818383E08093492DB4C0B701C801C0DDB4 +:108A4000882321F0F8E0EF16F10488F41092492D04 +:108A5000C701089667E070E00E944655462FE091F6 +:108A6000652EF091662EB80181EC1995B4C0B7015E +:108A7000C80158DDD8012C9111968C91119782274D +:108A800012969C911297892713969C911397892788 +:108A900014969C911497891362C08B2D90E00397D4 +:108AA000283881F49C01220F331F820F931FFC0191 +:108AB000E25CF24D11962D913D914C9120833183D2 +:108AC000428312C0FC01EE0FFF1F8E0F9F1F9C01FF +:108AD000225C324DF80180819181A281B381F9013C +:108AE00080839183A283B38345E050E0B801C8013D +:108AF00002960E940556F3E0BF1629F024E0B21654 +:108B000021F087E903C083E901C085E9D8018C938E +:108B100080E711968C9367E0C801BCDDF80187837C +:108B2000908783E08B0D8093492D68E470E081C0CD +:108B3000FBE1EF16F10498F0B701C80141DD8111A6 +:108B400011C0C701089667E070E00E944655462FA5 +:108B5000E091652EF091662EB80181EC1995109286 +:108B6000492D39C0B701C801DDDC63E0C80192DDE1 +:108B70006C01892BA1F7D8018C9182FF15C0B8E058 +:108B8000BB1691F0E6E0BE1611F087E901C085E959 +:108B9000D8018C9380E211968C93BA94BA94B092D7 +:108BA000492D60E170E045C081E080934A2D8B2D16 +:108BB00090E00697B82EBB0C8B0D8C5F8093482DF0 +:108BC000F801808180933D2D3AC0E114F10431F425 +:108BD00081E08093492D0E94682A2FC0B701C80107 +:108BE000EFDC81110FC0C701089667E070E00E94BA +:108BF0004655462FE091652EF091662EB80181EC26 +:108C0000199508C0B701C8018DDC63E0C80142DDD9 +:108C1000892BF1F282ECD8018C9361E0C8013ADD36 +:108C2000F80181839283B092492D10924A2D68E118 +:108C300070E0C80109DC6C0102C0C12CD12C80910C +:108C40004A2D882309F4ABC72091482D30E04EE32C +:108C50005DE264E170E0CE0101960E94050EBE0166 +:108C60006F5F7F4F85E60E943F228EC080912A2D44 +:108C7000811108C080E890E00E942A2381E080935F +:108C80002A2D99C0813009F098C08091492D8230F9 +:108C900008F093C08091292D91E0980F9093292D91 +:108CA000883009F08AC00E9433238115944008F46B +:108CB00072C010922A2D60E070E085E60E943F228B +:108CC00079EB472E7CE2572EE0E8CE2ED12C612C9A +:108CD000712CE12CF12C00E010E0A12CB12C312CF6 +:108CE000FAE02F2E9E012F5F3F4F4901DF92CF9276 +:108CF000ADEEB3E2BF93AF931F922F929F928F92EC +:108D00000E942F56C4010E94C218CDBFDEBFD201FF +:108D10008C91882351F087E990E10E94C7183110A7 +:108D200013C05301332433940FC083E990E10E94B0 +:108D3000C718332049F0C3018A199B09081719077E +:108D400010F475018C01312CF20111922F01FFEF0B +:108D50006F1A7F0A28E0C20ED11C30E76316710437 +:108D600029F60115110571F0C70140961695079572 +:108D7000800F911F63E0880F991F6A95E1F70E94A9 +:108D80002A2302C00E94412310924A2D1092772C70 +:108D90000E94D62202C7E0911E20F0911F20E058C9 +:108DA000F10943E0F695E7954A95E1F7E754F34D6D +:108DB00010820E9433231092292D80914A2DB09069 +:108DC000492D882331F041E04B1508F441C1109240 +:108DD0004A2D55E05B15B8F083E0B81608F03FC0A7 +:108DE00091E09B15C8F081E090E080932020909363 +:108DF000212082E5F801808382E08093492D37E0CD +:108E0000C32ED12C27C1A8E0AB1508F09CC0BAE056 +:108E1000BB1609F4E5C01CC1F2E1EF16F10408F439 +:108E2000A9C0B701C801CCDB882311F1B701C80183 +:108E300079DBD80111968C91119790E0982F8827B3 +:108E40002C91822B80933B2D90933C2D83E98C9326 +:108E500080E211968C9383E08093492DADC0B701D9 +:108E6000C801AEDB882321F0B8E0EB16F10488F4EA +:108E70001092492DC701089667E070E00E944655A0 +:108E8000462FE091652EF091662EB80181EC199580 +:108E9000ADC0B701C80146DBF8012081818182277E +:108EA00092818927938189279481891363C08B2DAF +:108EB00090E00397283889F49C01220F331F820F1A +:108EC000931FFC01E25CF24DD80111962D913D916A +:108ED0004C9120833183428312C0FC01EE0FFF1FAF +:108EE0008E0F9F1F9C01225C324DF8018081918181 +:108EF000A281B381F90180839183A283B38345E08A +:108F000050E0B801C80102960E940556F3E0BF1672 +:108F100029F024E0B21621F087E903C083E901C0FB +:108F200085E9D8018C9380E711968C9367E0C8019E +:108F3000B1DBF8018783908783E08B0D8093492D07 +:108F400068E470E081C0FBE1EF16F10498F0B7012E +:108F5000C80136DB811111C0C701089667E070E0D7 +:108F60000E944655462FE091652EF091662EB8017D +:108F700081EC19951092492D39C0B701C801D2DA98 +:108F800063E0C80187DB6C01892BA1F7D8018C91C4 +:108F900082FF15C0B8E0BB1691F0E6E0BE1611F0F6 +:108FA00087E901C085E9D8018C9380E211968C9302 +:108FB000BA94BA94B092492D60E170E045C081E066 +:108FC00080934A2D8B2D90E00697B82EBB0C8B0D0D +:108FD0008C5F8093482DF801808180933D2D3AC0AD +:108FE000E114F10431F481E08093492D0E94682A54 +:108FF0002FC0B701C801E4DA81110FC0C70108967C +:1090000067E070E00E944655462FE091652EF09192 +:10901000662EB80181EC199508C0B701C80182DA43 +:1090200063E0C80137DB892BF1F282ECD8018C9325 +:1090300061E0C8012FDBF80181839283B092492D52 +:1090400010924A2D68E170E0C801FED96C0102C09F +:10905000C12CD12C80914A2D882309F4A0C5E09120 +:109060001E20F0911F20E058F10973E0F695E79576 +:109070007A95E1F7E754F34DFF24F394F0820E94D0 +:1090800033231092492D0E94682A80E5D8018C93E1 +:1090900011961C9262E0C801FDDAF8018283938385 +:1090A000F092492D10924A2D60E270E0C801CCD9AF +:1090B0006C0175C580914A2DB090492D882331F0FF +:1090C000F1E0FB1508F444C110924A2D25E02B1560 +:1090D000B0F033E0B316E0F541E04B15C8F081E0A5 +:1090E00090E0809320209093212082E5D8018C93FA +:1090F00082E08093492D67E0C62ED12C2BC158E029 +:109100005B1508F0A0C08AE0B81609F4E9C020C1D8 +:10911000B2E1EB16F10408F4ADC0B701C80150DAB2 +:109120008823F9F0B701C801FDD9F801818190E0E9 +:10913000982F88272081822B80933B2D90933C2D64 +:1091400083E9808380E2818383E08093492DB4C0EA +:10915000B701C80135DA882321F0F8E0EF16F104F1 :1091600088F41092492DC701089667E070E00E94CC -:109170006755462FE091652EF091662EB80181EC7F -:109180001995B1C0B701C8016CD9F801208181815E -:10919000822792818927938189279481891367C0C7 -:1091A0008B2D90E00397283889F49C01220F331F00 -:1091B000820F931FFC01E25CF24DD80111962D91B4 -:1091C0003D914C9120833183428312C0FC01EE0F0C -:1091D000FF1F8E0F9F1F9C01225C324DF801808182 -:1091E0009181A281B381F90180839183A283B383AA -:1091F00045E050E0B801C80102960E942656F3E00F -:10920000BF1629F024E0B21621F087E903C083E9F4 -:1092100001C085E9D8018C9380E711968C9367E0B3 -:10922000C80104DAF8018783908783E08B0D80936F -:10923000492D68E470E089C0F9E0CF16D104B8F098 -:10924000B601C8015CD97C01BC01C80185D9811176 -:1092500011C0C701089667E070E00E946755462F6D -:10926000E091652EF091662EB80181EC199510926F -:10927000492D39C0B701C801F4D863E0C801D6D977 -:109280007C01892BA1F7D8018C9182FF15C0B8E031 -:10929000BB1691F0E6E0BE1611F087E901C085E942 -:1092A000D8018C9380E211968C93BA94BA94B092C0 -:1092B000492D60E170E049C081E080934A2D8B2DFB -:1092C00090E00697B82EBB0C8B0D8C5F8093482DD9 -:1092D000F801808180933D2D3EC0C114D10431F44A -:1092E00081E08093492D0E94072A33C0B601C8014E -:1092F00006D97C01BC01C8012FD981110FC0C7015B -:10930000089667E070E00E946755462FE091652E51 -:10931000F091662EB80181EC199508C0B701C8011B -:10932000A0D863E0C80182D9892BD1F282ECD801A0 -:109330008C9361E0C8017AD9F80181839283B0925D -:10934000492D10924A2D68E170E0C8011CD87C01BB -:1093500002C0E12CF12C80914A2D882309F440C4ED -:10936000F090B82CFF20A9F1B601C801C8D85C0163 -:10937000009729F41092B82C10924A2D42C0823ADC -:10938000910540F0BC01C801E7D891E08927C82EBB -:10939000D12C03C0CC24C394D12CB501C80161D811 -:1093A000CD2829F462E1C80141D9892B29F0ACEF1D -:1093B000AF0DA093B82C2AC024E0F29ED001112456 -:1093C000A859B34D80E1F80101900D928A95E1F71B -:1093D0001DC042E050E060ED71E1CE0101960E94B7 -:1093E000EF55E3EDF1E1E49120913B2D30913C2DDF -:1093F00089819A812817390721F480913D2D8E1794 -:1094000029F01092492D0E94072AE8C32091B82C18 -:10941000203109F04DC010924A2D1092B82C1092B4 -:10942000772C20E130E048E75CE267E870E0CE01AD -:1094300001960E94050E6FEC73E2CE0181960E94A8 -:10944000495620E130E048E85CE265E670E0CE0194 -:1094500083960E94050E6FEC73E2CE018D5B9F4FE9 -:109460000E94495620E130E048E95CE263E470E0A4 -:10947000CE018B5B9F4F0E94050E6FEC73E2CE0115 -:109480008B599F4F0E94495620E130E048EA5CE248 -:1094900061E270E0CE0189599F4F0E94050E0E9443 -:1094A0007A22BE016F5F7F4F85E60E94E32196C35B -:1094B00080E3D8018C9311962C9362E0C801CF5BB6 -:1094C000DD4F2883C154D240B1D8F8018283938301 -:1094D000CF5BDD4F2881C154D2402C5F2093B82C44 -:1094E000D7CD80914A2DB090492D882331F0F1E0FD -:1094F000FB1508F462C110924A2D25E02B15B8F037 -:1095000033E0B31608F046C081E08B15C8F081E067 -:1095100090E0809320209093212082E5F8018083C1 -:1095200082E08093492D37E0E32EF12C48C198E08A -:109530009B1508F0ABC0AAE0BA1609F4FCC03DC107 -:10954000F3E1CF16D10408F4BEC0B601C8010E94F1 -:109550007F427C01BC01C8010E94AC42882349F1D2 -:10956000B701C8010E943142D80111968C91119720 -:1095700090E0982F88272C91822B80933B2D9093FD -:109580003C2D83E98C9380E211968C9383E0809349 -:10959000492DBDC0B601C8010E947F427C01BC01BB -:1095A000C8010E94AC42882321F0B8E0EB16F10418 -:1095B00088F41092492DC701089667E070E00E9478 -:1095C0006755462FE091652EF091662EB80181EC2B -:1095D0001995B7C0B701C8010E943142F801208136 -:1095E0008181822792818927938189279481891398 -:1095F0006AC08B2D90E00397283889F49C01220FD4 -:10960000331F820F931FFC01E25CF24DD8011196CB -:109610002D913D914C9120833183428312C0FC01F6 -:10962000EE0FFF1F8E0F9F1F9C01225C324DF80131 -:1096300080819181A281B381F90180839183A2838A -:10964000B38345E050E0B801C80102960E94265657 -:10965000F3E0BF1629F024E0B21621F087E903C039 -:1096600083E901C085E9D8018C9380E711968C933A -:1096700067E0C8010E941643F8018783908783E062 -:109680008B0D8093492D68E470E092C0F9E0CF160D -:10969000D104C8F0B601C8010E947F427C01BC0120 -:1096A000C8010E94AC42811111C0C701089667E051 -:1096B00070E00E946755462FE091652EF091662E6E -:1096C000B80181EC19951092492D3BC0B701C80132 -:1096D0000E94314263E0C8010E9416437C01892B3D -:1096E00091F7D8018C9182FF15C0B8E0BB1691F0BC -:1096F000E6E0BE1611F087E901C085E9D8018C9338 -:1097000080E211968C93BA94BA94B092492D60E19C -:1097100070E04EC081E080934A2D8B2D90E006973B -:10972000B82EBB0C8B0D8C5F8093482DF801808187 -:1097300080933D2D44C0C114D10431F481E0809365 -:10974000492D0E94072A39C0B601C8010E947F42F4 -:109750007C01BC01C8010E94AC4281110FC0C7014D -:10976000089667E070E00E946755462FE091652EED -:10977000F091662EB80181EC19950AC0B701C801B5 -:109780000E94314263E0C8010E941643892BB1F266 -:1097900082ECD8018C9361E0C8010E941643F80165 -:1097A00081839283B092492D10924A2D68E170E036 -:1097B000C8010E94C3417C0102C0E12CF12C8091C0 -:1097C0004A2D882309F40CC28091492D9AEF980FF5 -:1097D000933008F04FC0D801FC90F5FAFF24F0F860 -:1097E00010922B2DEBE9AE2EE0E1BE2EE12C47E6E8 -:1097F00050E0B501CE0101960E94EF558B81882380 -:1098000049F029813A8180913B2D90913C2D281778 -:109810003907B9F48D81882329F09C8180913D2DF1 -:1098200098130FC08F89882311F0FF2051F0E09129 -:109830002B2D81E08E0F80932B2DF0E0E45DF24D17 -:10984000E082E394B7E6AB0EB11CEFE0EE12CFCFAF -:10985000FF2009F499C080EED8018C9380E811961E -:109860008C9362E0C8010E941643F80182839383BF -:1098700089E0ACC0893009F087C0B601C8010E94F8 -:109880007F427C01BC01C8010E94AC4281110FC023 -:10989000C701089667E070E00E946755462FE09187 -:1098A000652EF091662EB80181EC1995C4C0B70100 -:1098B000C8010E9431426C01D8016C91262F30E022 -:1098C00073E0969587957A95E1F7029728173907FF -:1098D00031F46E5FC8010E941643892B71F082EC4F -:1098E000F801808361E0C8010E941643D8011196F7 -:1098F0008C93119712969C93A8C0F12C67E6E62EE4 -:109900005801FFEFAF1ABF0A80912B2DF816E0F532 -:10991000EF2DF0E0E45DF24D6081E69EB001112490 -:1099200065567F4E47E650E0CE0101960E94EF5506 -:109930008F89882339F14E8950E0F801808190E0C9 -:1099400001974817590739F4B501CE0106960E94D0 -:109950001056892BB9F020912B2D422F50E0415009 -:1099600051093F2D832F90E0841795073CF4FC01AB -:10997000E45DF24D818180833F5FF4CF21502093DD -:109980002B2DFA94F394C0CF8091492D9AEF980F24 -:109990009430F8F490912B2D2CE23DE2F9018E2FBA -:1099A000821B891708F06DC0819184508230B8F70E -:1099B00082E0D8018C9380E611968C9362E0C80116 -:1099C0000E941643F801828393838BE08093492D94 -:1099D0005FCB8B3009F055C0C114D10409F44FC0DE -:1099E000B601C8010E947F427C01BC01C8010E94EF -:1099F000AC4281110FC0C701089667E070E00E9479 -:109A00006755462FE091652EF091662EB80181ECE6 -:109A100019950FC0B701C8010E94314253E09695D5 -:109A200087955A95E1F7682FC8010E941643892B44 -:109A3000A1F010922B2D82ECD8018C9361E0C8012B -:109A40000E941643F801818392838AE08093492D16 -:109A500010924A2D68E170E01DCBD80115968C91CB -:109A6000882331F0813059F480932B2D85E004C098 -:109A700081E080932B2D84E080932C2D02C01092E6 -:109A80002B2D80912B2D811103C063EF73E213C046 -:109A90008130A9F460912C2DB7E66B9FB0011124A1 -:109AA0006E537F4E40E450E0CE0101960E94EF5588 -:109AB000BE016F5F7F4F85E60E94E32168C0912C55 -:109AC00080E090E000E010E027E6822E7E013FEF8C -:109AD000E31A3DEFF30A36E0C32E34E2D32EA12C75 -:109AE00042E0B42E20912B2D921680F50130E2E059 -:109AF0001E0720F0081B190BF12C2EC0E92DF0E0F9 -:109B0000E45DF24D6081869EB00111246E537F4E5C -:109B100040E450E0C7010E94EF55FF92EF92DF92C0 -:109B2000CF92C501801B910B9F938F9381E090E0B2 -:109B30008C0F9D1F800F911F9F938F930E945056F3 -:109B4000080F191F9394CDBFDEBFCCCF0130A2E028 -:109B50001A0780F6FF24F394EDEFFFEFEC0FFD1FE3 -:109B6000E00FF11F8EE28083EEEFFFEFEC0FFD1FA1 -:109B7000E00FF11F1082BE016F5F7F4F85E60E94EC -:109B8000E321F11004C081E390E10E946A188AE2A7 -:109B900090E10E946A1862E070E08BE39DE20E940F -:109BA000012284E290E10E946A186091482D70E0E1 -:109BB0008EE39DE20E9401228EE190E10E946A18EC -:109BC00061E070E08DE39DE20E9401221092772C0B -:109BD00010922B2D0E947A2210924A2DE12CF12C0A -:109BE000C701CF5BDD4FCDBFDEBFDF91CF911F91AE -:109BF0000F91FF90EF90DF90CF90BF90AF909F902C -:109C00008F907F906F905F904F903F902F9008952E -:109C1000FF920F931F93CF93DF93CDB7DEB7EA97F1 -:109C2000CDBFDEBF0FEB11E388E0F82EF00E91D22E -:109C3000F80181938F01FE12FACF0E94191904D303 -:109C4000882309F4F7C08091BF319091C0319530DD -:109C500009F46FC030F4913069F168F0933051F13C -:109C6000E9C0983009F4C2C0993009F4C8C09630F0 -:109C700009F0E0C072C0803891F0823809F0DAC093 -:109C80008091C3318F7085D2E091C931F091CA3192 -:109C9000118112FB112710F980E07BD206C01091D0 -:109CA000BB318091BC3181111260E8D2812F61D229 -:109CB00080E0A1C0282F2D7F09F0BCC0882319F0B7 -:109CC000823061F0B7C08091C131813009F0B2C0FB -:109CD000933009F080E08093BC3127C08091C1317E -:109CE000811123C0E091C3311E2F1F7009F4A2C05F -:109CF000812F4FD28091C031833011F4EBD215C047 -:109D0000E091C931F091CA3181818B7F818324E850 -:109D1000129FF0011124E35FFD4C1082E091C931E4 -:109D2000F091CA3180818E7F808380E032D2A6D2CA -:109D300064C081117FC01091C1311F779FD2A1D320 -:109D40005DD28823E9F31093C304111102C082E0AD -:109D500001C083E08093BE316DC08058823008F02E -:109D600069C08091C1319091C2318C3DE3E09E0782 -:109D700061F583E08A838AE389834FB7F894DE0133 -:109D8000139620E038E052E05093CA01E32FF0E050 -:109D9000E4911092CA0120FF03C0E295EF703F5F8B -:109DA000EF708E2F90E0EA3010F0C79601C0C09699 -:109DB0008D939D932F5F2C3139F74FBF5FD26AE3AC -:109DC00070E0CE010196A3D00FC0AE014F5F5F4F90 -:109DD0006091C3310E94710C8C01892B59F14ED2D4 -:109DE000B80189819A810FD1A5D124C0803811F59D -:109DF00045D28091BA31BDD184D143D31BC08111EA -:109E000019C08091C1318230A8F438D28091C1311B -:109E10008093BA3136D38091BA31811106C08091D6 -:109E2000C304811102C081E001C084E08093BE318F -:109E30000E94151909D2882311F020D24BD2EA963C -:109E4000CDBFDEBFDF91CF911F910F91FF9008959D -:109E50000895CF938091BE31882351F0C091CB31CA -:109E600080E097D1F1D18111D3DE8C2FCF9191C1B8 -:109E7000CF910895CF92DF92EF92FF920F931F93AD -:109E8000CF93DF93EC018B017A0111D3811136C09E -:109E9000E114F10439F0F70180819181081B190B5D -:109EA000C80FD91FC12CD12C0115110531F180919A -:109EB000C7319091C831FC01EF5BFF4F2081319792 -:109EC0008081281790F01DD1C4DFE114F10449F01E -:109ED000F70180819181C80ED91EC082D18285E0B0 -:109EE0000DC0E5D2882301F309C0899142D1015008 -:109EF0001109FFEFCF1ADF0AD7CF80E0DF91CF91B2 -:109F00001F910F91FF90EF90DF90CF900895DF9217 -:109F1000EF92FF920F931F93CF93DF93D82FC92F08 -:109F20008B018091CB31806834D12091C531309143 -:109F3000C6312017310728F00115110519F4E1D0B9 -:109F400001C08901ED2EFC2ED12C0115110509F45B -:109F500040C08091BE31811102C082E04CC085308A -:109F600011F483E048C070D1882311F081E043C030 -:109F700051D181113CC042D1882339F32091CB319A -:109F80008091C7319091C831FC0127FF05C0EF5B7C -:109F9000FF4FC081D0E013C0E05CFF4FC08131961D -:109FA0008081D0E0C81BD1090AC0C830D10550F467 -:109FB000F70181917F01DDD0015011092196011532 -:109FC000110599F7DD24D394289709F0D12C99D065 -:109FD000BCCFD110BECF0BC08091BE31882309F415 -:109FE000BCCF853009F4BDCF2FD18111BFCF12D1A5 -:109FF000882391F380E0DF91CF911F910F91FF9023 -:10A00000EF90DF900895DF92EF92FF920F931F93EE -:10A01000CF93DF93D82FC92F8B018091CB318068EC -:10A02000B8D02091C5313091C6312017310728F0C2 -:10A030000115110519F465D001C08901ED2EFC2E22 -:10A04000D12C0115110509F442C08091BE31811156 -:10A0500002C082E04EC0853011F483E04AC0F4D0E3 -:10A06000882311F081E045C0D5D081113EC0C6D013 -:10A07000882339F32091CB318091C7319091C83139 -:10A08000FC0127FF05C0EF5BFF4FC081D0E015C08A -:10A09000E05CFF4FC08131968081D0E0C81BD109C0 -:10A0A0000CC0C830D10560F4F701849162D0FFEF95 -:10A0B000EF1AFF0A0150110921960115110589F7C0 -:10A0C000DD24D394289709F0D12C1BD0BACFD1101E -:10A0D000BCCF0BC08091BE31882309F4BACF853044 -:10A0E00009F4BBCFB1D08111BDCF94D0882391F3B7 -:10A0F00080E0DF91CF911F910F91FF90EF90DF9063 -:10A100000895E091C931F091CA31A091C731B09161 -:10A11000C831AF5BBF4F8C9190E082839383808185 -:10A120008D798083E091C731F091C831EF5BFF4FAB -:10A1300010820895E091C931F091CA3180818D7902 -:10A140008083E091C731F091C831EF5BFF4F1082FF -:10A1500008958091C7319091C831FC01EF5BFF4FAA -:10A16000208131E0320F3083FC01E20FF11D80814C -:10A1700008952091C7313091C831F901EF5BFF4F4D -:10A18000908141E0490F4083F901E90FF11D80837F -:10A1900008958093CB31482F4F7050E06091C604F2 -:10A1A0007091C7049A0194E0220F331F9A95E1F74A -:10A1B000E4E887FF11C0E49FC001E59F900D1124E2 -:10A1C000825F9D4C8093C7319093C831C901089636 -:10A1D0009B01280F391F0DC0E49FC001E59F900D22 -:10A1E000112484539E4C8093C7319093C831260F1D -:10A1F000371F2093C9313093CA3108958091CB31F4 -:10A200008068C7DFE091C931F091CA3180818695BD -:10A21000817008958091CB318F77BBDFA091C931D8 -:10A22000B091CA318C9185FF0DC0E091C731F0919A -:10A23000C83112968D919C911397E05CFF4F8083FB -:10A2400081E0089580E008958091CB318F77A1DF80 -:10A25000A091C931B091CA318C9184FF0DC0E091B9 -:10A26000C731F091C83112968D919C911397E05CA3 -:10A27000FF4F808381E0089580E008958091CB3185 -:10A280008F7787DFE091C931F091CA3180818D7875 -:10A290008083E091C931F091CA31808181608083EF -:10A2A000E091C731F091C831EF5BFF4F1082809190 -:10A2B000CB3180686EDFE091C931F091CA31808185 -:10A2C00081608083E091C731F091C831EF5BFF4F2F -:10A2D00010820895E091C931F091CA318181846082 -:10A2E0008183E091C931F091CA318181807C8034D1 -:10A2F00059F48091CB3180584CDFE091C931F09115 -:10A30000CA3181818460818308951F93CF93DF9345 -:10A310001F921F92CDB7DEB7182F4A83698339DFAA -:10A32000E091C931F091CA311182E091C931F091C7 -:10A33000CA31812F881F8827881F880F8083E0916A -:10A34000C931F091CA3169816183E091C931F091DD -:10A35000CA31128213822091C7313091C8312483CF -:10A360003583110F110B4A814123F901E05CFF4F46 -:10A3700040833196108281E00F900F90DF91CF9152 -:10A380001F910895AF92BF92CF92DF92EF92FF920A -:10A390000F931F93CF93DF93A62E8C017C0184E053 -:10A3A000E80EF11CB12CBA1409F443C0F801D081B5 -:10A3B000DD23C1F1C180D280F70131978081F7019F -:10A3C0009081923010F498E001C098E128E030E0EC -:10A3D000C0E02C153D0520F4CF5F220F331FF9CFCD -:10A3E000C92B9D2F9F70963010F080E023C0CF7E48 -:10A3F000F1E4CF16D104C8F7882321F0813021F48D -:10A40000C06C0AC0C06403C0C068811105C04C2D77 -:10A410006C2F80E88D0F79DF4C2D6C2F8D2F75DF21 -:10A42000882319F3B3940B5F1F4F85E0E80EF11CEE -:10A43000BACF81E0DF91CF911F910F91FF90EF9004 -:10A44000DF90CF90BF90AF90089580E090E0E091D2 -:10A45000C604F091C7049C0144E0220F331F4A95C3 -:10A46000E1F7E20FF31F11864091C6045091C70433 -:10A47000FA01E20FF31F118201968630910539F738 -:10A4800008958091BF3187FF0DC0C4DE811105C0E2 -:10A490008091BE318111F9CF09C04CCE8091BE317F -:10A4A000882321F0ABDE8823C9F32BCE08950F93C8 -:10A4B0001F93CF93E091C604F091C704E05AFF4F79 -:10A4C00000811181C4E68091CB3187FF0AC096DEFE -:10A4D000811105C08091BE31811105C021C080E08D -:10A4E00024C098DEF5CF8530E9F0E091C931F091D4 -:10A4F000CA31818182FD18C0E091C604F091C70481 -:10A50000E05AFF4F8081918180179107E1F22FEF90 -:10A510002C0FCC2319F08C01C22FD5CF84E005C0BD -:10A5200082E003C083E001C081E0CF911F910F91D1 -:10A53000089563D069D0E0ECF4E081818E7F81835F -:10A5400080818F7780831092BD310895CF93DF9300 -:10A55000E0E4F0E014828481836084834ED054D0A0 -:10A56000C0ECD4E088818F77888388818068888375 -:10A570001092BE311092BA311092BC311092BB31A0 -:10A5800088818064888348E068E480E8BEDE48E033 -:10A5900068E480E0BADE888580648887898181608C -:10A5A0008983DF91CF910895CF93DF933FB7F894DC -:10A5B000C0ECD1E022E02A87EAE1F0E0E491A0ECEF -:10A5C000B4E0DA96EC93DA97EBE1F0E0E491DB9615 -:10A5D000EC93DB971A8685EE94E38E7F16968D9327 -:10A5E0009C93179785E18C9318962C933FBF81E03D -:10A5F0008093BD31DF91CF91A9CFE0ECF4E080856D -:10A600008370808711860895E0ECF4E08FEF8287F5 -:10A61000848708951F920F920FB60F92112408B6E7 -:10A620000F9218BE09B60F9219BE0BB60F921BBE41 -:10A630002F933F934F935F936F937F938F939F934A -:10A64000AF93BF93EF93FF938091CA0487FF08C035 -:10A650008091C80487FF04C080E88093CA04F8DBB7 -:10A660008091CA0486FF07C080E48093CA041092D8 -:10A67000BE310E9404198091CA0485FF14C080E293 -:10A680008093CA048091BA31882311F084E007C016 -:10A690008091C304811102C081E001C083E08093F6 -:10A6A000BE310E94F3188091CA0484FF14C080E177 -:10A6B0008093CA0482E08093BE311092BA31109226 -:10A6C000C304C3DE48E068E480E81FDE48E068E4D5 -:10A6D00080E01BDEBDDBFF91EF91BF91AF919F91B9 -:10A6E0008F917F916F915F914F913F912F910F903B -:10A6F0000BBE0F9009BE0F9008BE0F900FBE0F90BB -:10A700001F901895CF93DF93EC01FC0170968BE0BE -:10A71000DF011D928A95E9F782E08C83898783E0C7 -:10A720008E8761E0CE0101962DDE882361F061E025 -:10A73000CE01069627DE882331F061E0CE010B962C -:10A74000DF91CF911FCE80E0DF91CF9108950F93DD -:10A750001F93CF93DF932091BE312430E1F4FC01AD -:10A760000489158926893789012B022B032B99F03F -:10A77000EB0181810EDDFE0101900020E9F73197A8 -:10A78000BF016C1B7D0B40E050E0CE01DF91CF910B -:10A790001F910F916FCB82E0DF91CF911F910F91AD -:10A7A00008950F931F93CF93DF93FC018091BE31E7 -:10A7B0008430A9F484899589A689B789892B8A2B45 -:10A7C0008B2B69F08A01EB018181E3DC40E050E0F2 -:10A7D000B801CE01DF91CF911F910F914BCB82E059 -:10A7E000DF91CF911F910F910895CF93FC0180913C -:10A7F000BE31843001F584899589A689B789892B72 -:10A800008A2B8B2BC1F0C62F8181C3DC2091C731ED -:10A810003091C831F901EF5BFF4F90813197808112 -:10A82000981720F48C2FA5DC80E006C06ADC3FDEA0 -:10A830008823C1F301C082E0CF910895CF93DF93C5 -:10A840002091BE31243091F5FC01448955896689F7 -:10A850007789452B462B472B49F181819ADC8091E2 -:10A86000CB312091C7313091C831F90187FF05C044 -:10A87000EF5BFF4F808190E008C0E05CFF4F80817C -:10A880003196408190E0841B9109892B69F0F90190 -:10A89000EF5BFF4FD0813197C08133DCDC1720F0B4 -:10A8A00006DE811104C02DDC80E001C082E0DF9172 -:10A8B000CF910895CF93DF932091BE31243099F446 -:10A8C000FC014489558966897789452B462B472B9E -:10A8D00051F0EC0181815DDC91DC882321F0CE0117 -:10A8E000DF91CF91ABCFDF91CF910895CF93DF93DD -:10A8F0002091BE31243019F08FEF9FEF46C0FC014C -:10A900004489558966897789452B462B472BA1F3C6 -:10A9100086813FDC7FDC882379F38091CB312091E5 -:10A92000C7313091C831F90187FF05C0EF5BFF4F98 -:10A93000808190E008C0E05CFF4F808131962081EB -:10A9400090E0821B9109892B21F003DCC82FD0E015 -:10A9500002C0CFEFDFEF2091CB318091C7319091D2 -:10A96000C831FC0127FF05C0EF5BFF4F208130E0BD -:10A9700008C0E05CFF4F20813196808130E0281BC9 -:10A980003109232B09F4D6DBCE01DF91CF91089555 -:10A990000895FF920F931F93CF93DF93EC0154DC44 -:10A9A000882309F48EC0888190E02091C3313091D2 -:10A9B000C4312817390709F084C08091C031813231 -:10A9C00059F018F4803249F17CC0823209F457C042 -:10A9D000833209F467C075C08091BF31813A09F0B4 -:10A9E00070C04CDC0BDC8823E9F38C89FD880E8970 -:10A9F0001F89BFDB8F2DBDDB802FBBDB812FB9DB38 -:10AA0000888DB7DB898DB5DB8A8DB3DB7ADBDF918F -:10AA1000CF911F910F91FF9034CD8091BF31813242 -:10AA200009F04FC02BDCF6DB811105C08091BE31EF -:10AA30008111F9CF46C08DDB082F8BDB182F89DB06 -:10AA4000F82E87DB4F2D50E060E070E0BA0155270B -:10AA50004427782B402B512B4C8B5D8B6E8B7F8B3F -:10AA600078DB888F76DB898F74DB8A8F63DB09DD87 -:10AA7000CE01DF91CF911F910F91FF9089CF8091EF -:10AA8000BF318132F1F4FADBFCDC8091C13190916D -:10AA9000C231888B998BCE01DF91CF911F910F919D -:10AAA000FF9076CF8091BF31813259F4E7DBE9DC4A -:10AAB0006091C131CE01DF91CF911F910F91FF9035 -:10AAC00067CFDF91CF911F910F91FF900895AA1B3F -:10AAD000BB1B51E107C0AA1FBB1FA617B70710F089 -:10AAE000A61BB70B881F991F5A95A9F780959095BB -:10AAF000BC01CD010895B7FF04C003D0821B930BA6 -:10AB0000089509D0A59F900DB49F900DA49F800D2E -:10AB1000911D11240895A29FB001B39FC001A39F6E -:10AB2000700D811D1124911DB29F700D811D112486 -:10AB3000911D08958F929F92AF92BF92CF92DF9214 -:10AB4000EF92FF92CF93DF93EC01688179818A8144 -:10AB50009B81611571058105910521F464E279ED10 -:10AB60008BE597E02DE133EF41E050E0E2D649017B -:10AB70005A019B01AC01A7EAB1E4C3DF6B017C0180 -:10AB8000ACEEB4EFA5019401B8DFDC01CB018C0D74 -:10AB90009D1DAE1DBF1DB7FF03C00197A109B048A1 -:10ABA00088839983AA83BB839F77DF91CF91FF909E -:10ABB000EF90DF90CF90BF90AF909F908F900895CF -:10ABC000B9CF82E290E2B6CFA0E0B0E0809322203D -:10ABD00090932320A0932420B09325200895FB0177 -:10ABE000DC0102C005900D9241505040D8F7089505 -:10ABF000FB01DC018D91059080190110D9F3990BAF -:10AC00000895FB01DC014150504048F005900D9241 -:10AC10000020C9F701C01D9241505040E0F708954F -:10AC2000FB01DC0104C08D910190801921F4415099 -:10AC30005040C8F7881B990B0895FB01DC0102C046 -:10AC400001900D9241505040D8F708956817790748 -:10AC500068F4FB01DC01E40FF51FA40FB51F02C06F -:10AC600002900E9241505040D8F70895E6CFDC0193 -:10AC700001C06D9341505040E0F70895FC0181916F -:10AC8000861721F08823D9F7992708953197CF01A6 -:10AC90000895FB01DC0101900D920020E1F7089579 -:10ACA0000F931F93CF93DF93CDB7DEB72E97CDBF12 -:10ACB000DEBF0E891F89888D998D26E02C8309833C -:10ACC0001A8397FF02C080E090E801978D839E83EE -:10ACD000AE01445E5F4F6A8D7B8DCE01019667D0D9 -:10ACE0004D815E8157FD0AC02F8138854217530779 -:10ACF0000CF49A01F801E20FF31F10822E96CDBFDB -:10AD0000DEBFDF91CF911F910F9108950F931F9395 -:10AD1000CF93DF93CDB7DEB72E97CDBFDEBF0E89C1 -:10AD20001F89888D998D2EE02C8309831A8397FFC4 -:10AD300002C080E090E801978D839E83AE01445E5F -:10AD40005F4F6A8D7B8DCE01019631D04D815E8142 -:10AD500057FD0AC02F813885421753070CF49A011A -:10AD6000F801E20FF31F10822E96CDBFDEBFDF91F8 -:10AD7000CF911F910F910895CF93DF93CDB7DEB799 -:10AD80002E97CDBFDEBF8DE08C838C899D89898312 -:10AD90009A83AE01485E5F4F6E897F89CE0101962E -:10ADA0008FD32E96CDBFDEBFDF91CF9108952F9226 -:10ADB0003F924F925F926F927F928F929F92AF924B -:10ADC000BF92CF92DF92EF92FF920F931F93CF9398 -:10ADD000DF93CDB7DEB72C97CDBFDEBF7C016B0113 -:10ADE0008A01FC0116821782838181FFB0C1CE01E6 -:10ADF00001964C01F7019381F60193FD859193FF34 -:10AE000081916F01882309F49EC1853239F493FD45 -:10AE1000859193FF81916F01853221F4B70190E014 -:10AE2000D6D4E8CF512C312C20E02032A0F48B3244 -:10AE300069F030F4803259F0833269F420612CC01B -:10AE40008D3239F0803339F4216026C022602460CD -:10AE500023C0286021C027FD27C030ED380F3A30CD -:10AE600078F426FF06C0FAE05F9E300D1124532EC1 -:10AE700013C08AE0389E300D1124332E20620CC09E -:10AE80008E3221F426FD5FC1206406C08C3611F499 -:10AE9000206802C0883641F4F60193FD859193FF46 -:10AEA00081916F018111C1CF982F9F7D955493306F -:10AEB00028F40C5F1F4FFFE3F9830DC0833631F098 -:10AEC000833771F0833509F057C021C0F8018081C4 -:10AED00089830E5F1F4F44244394512C540114C0A6 -:10AEE0003801F2E06F0E711CF801A080B18026FFDE -:10AEF00003C0652D70E002C06FEF7FEFC5012C87A6 -:10AF00001DD42C0183012C852F77222E16C03801E9 -:10AF1000F2E06F0E711CF801A080B18026FF03C023 -:10AF2000652D70E002C06FEF7FEFC5012C87FBD36A -:10AF30002C012C852068222E830123FC19C0832D2F -:10AF400090E048165906A0F4B70180E290E03FD4A3 -:10AF50003A94F5CFF50127FC859127FE81915F0199 -:10AF6000B70190E034D431103A94F1E04F1A51080F -:10AF70004114510479F7DEC0843611F0893631F579 -:10AF8000F80127FF07C060817181828193810C5F86 -:10AF90001F4F08C060817181072E000C880B990B30 -:10AFA0000E5F1F4F2F76722E97FF09C090958095E8 -:10AFB000709561957F4F8F4F9F4F2068722E2AE0CA -:10AFC00030E0A40155D4A82EA81843C0853729F431 -:10AFD0002F7EB22E2AE030E025C0F22FF97FBF2E5F -:10AFE0008F36C1F018F4883579F0ADC0803719F08C -:10AFF000883721F0A8C02F2F2061B22EB4FE0DC0DB -:10B000008B2D8460B82E09C024FF0AC09F2F966044 -:10B01000B92E06C028E030E005C020E130E002C0D3 -:10B0200020E132E0F801B7FE07C0608171818281C2 -:10B0300093810C5F1F4F06C06081718180E090E0BA -:10B040000E5F1F4FA40114D4A82EA818FB2DFF7764 -:10B050007F2E76FE0BC0372D3E7FA51450F474FE74 -:10B060000AC072FC08C0372D3E7E05C0BA2C372DB1 -:10B0700003C0BA2C01C0B52C34FF0DC0FE01EA0D8F -:10B08000F11D8081803311F4397E09C032FF06C082 -:10B09000B394B39404C0832F867809F0B39433FD3E -:10B0A00012C030FF06C05A2CB31418F4530C5B18AE -:10B0B000B32CB31460F4B70180E290E03C8787D3EF -:10B0C000B3943C85F6CFB31410F43B1801C0312C77 -:10B0D00034FF11C0B70180E390E03C8778D33C8512 -:10B0E00032FF16C031FD03C088E790E002C088E55A -:10B0F00090E0B7010CC0832F867851F031FF02C079 -:10B100008BE201C080E237FD8DE2B70190E05FD3B2 -:10B11000A51430F4B70180E390E059D35A94F8CFE6 -:10B12000AA94F401EA0DF11D8081B70190E04FD39C -:10B13000A110F6CF332009F45DCEB70180E290E094 -:10B1400046D33A94F7CFF7018681978102C08FEFFB -:10B150009FEF2C96CDBFDEBFDF91CF911F910F9156 -:10B16000FF90EF90DF90CF90BF90AF909F908F9027 -:10B170007F906F905F904F903F902F90089520FDAB -:10B1800009C0FC0123FD05C022FF02C07383628356 -:10B1900051834083089544FD10C046FD10C0DB017B -:10B1A000FC01AA0FBB1FEE1FFF1F1094D1F76A0FFF -:10B1B0007B1F8E1F9F1F31E003C033E001C034E0CE -:10B1C000660F771F881F991F3150D1F7620F711DCD -:10B1D000811D911D08950F931F93CF93DF938C01D1 -:10B1E000C801B7D2EC0197FD06C08AD2892BC1F7FE -:10B1F000B801CE0124D3CE01DF91CF911F910F91E1 -:10B2000008958F929F92AF92BF92CF92DF92EF926A -:10B21000FF920F931F93CF93DF931F92CDB7DEB7AB -:10B220008C01C62E7A01298394D2AC01552729813D -:10B230004B32510521F04D32510561F42068CA941A -:10B24000C11002C080E06FC0C801298382D2298169 -:10B2500097FDF8CF322F3D7FD32E322F307339F543 -:10B26000803329F5BB24BA94BC0C09F449C0C80149 -:10B2700029836FD2298197FD43C0382F3F7D383510 -:10B2800061F48D2D8264D82ECA94CA94CC20C1F169 -:10B29000C8015FD297FF0BC033C026FF04C02D2D1D -:10B2A0002260D22E03C03D2D3261D32ECB2C812CB7 -:10B2B000912C540120ED280F283078F0D4FE03C0E3 -:10B2C000B801BDD21AC02A3040F0D6FEF9CF2F7D8A -:10B2D0003FEE320F3630A0F727504D2DC501B40197 -:10B2E0005ADF4B015C018D2D8260D82ECA94CC2090 -:10B2F00051F0C8012ED297FFDDCFD1FC04C0A2CF00 -:10B30000812C912C5401D7FE08C0B094A094909445 -:10B310008094811C911CA11CB11C2D2DB501A40190 -:10B32000C7012DDF81E00F90DF91CF911F910F9129 -:10B33000FF90EF90DF90CF90BF90AF909F908F9055 -:10B3400008956F927F928F929F92AF92BF92CF9209 -:10B35000DF92EF92FF920F931F93CF93DF93CDB7BE -:10B36000DEB7A197CDBFDEBF5C017A01CE010196A9 -:10B370006C0180E2F60111928A95E9F7F50183806C -:10B3800040E050E0912C712C70E0A1E0B0E0F901B8 -:10B3900083FC859183FE81918F01982F9F018111FC -:10B3A00003C080E090E07AC08E3519F44115510554 -:10B3B00049F1E72FF0E0E417F5073CF48D3559F13A -:10B3C0008D3219F4772001F103C0711001C0982E5D -:10B3D000892F8695869586958601080F111D892FE0 -:10B3E00087703D0101C0660C8A95EAF7F8018081FB -:10B3F00086298083991559F0991510F49F5FE8CF3D -:10B400009150E6CF71E004C07724739401C0712C91 -:10B410004F5F5F4FBCCF772019F08E8180628E83A3 -:10B42000711103C09924939416C0F6019E012F5DFB -:10B430003F4F808180958193E217F307D1F7F2CFD8 -:10B44000E114F10429F0F7018083C70101967C0122 -:10B450006150912CE9F0C50169A37BD169A197FDE9 -:10B4600015C0282F269526952695F601E20FF11D89 -:10B47000208130E0AC014770552702C035952795F3 -:10B480004A95E2F720FDDCCFB501D9D1911089CFE3 -:10B49000E114F10411F0F7011082C801A196CDBFAB -:10B4A000DEBFDF91CF911F910F91FF90EF90DF9062 -:10B4B000CF90BF90AF909F908F907F906F900895A6 -:10B4C0004F925F927F928F929F92AF92BF92CF9254 -:10B4D000DF92EF92FF920F931F93CF93DF931F9210 -:10B4E000CDB7DEB76C012B015A01FC011682178221 -:10B4F000712CF601F380F201F3FC8591F3FE81914A -:10B50000382F2F01882309F4E5C090E03983F8D063 -:10B510003981892B19F0C6015EDEEBCF353241F45B -:10B52000F201F3FC3591F3FE31912F01353259F4DC -:10B53000C60139830ED1398197FDCAC03817C9F2C7 -:10B54000B6017DD1C7C03A3239F4F3FC3591F3FE30 -:10B5500031912F0151E001C050E0420110E020ED97 -:10B56000230F2A3088F45260612F70E080E090E071 -:10B5700040E2598310DE162FF401F3FC3591F3FEFF -:10B5800031914F015981EBCF052F232F240151FF1A -:10B5900003C0111102C09EC01FEF383619F03C36AF -:10B5A00059F011C0F401F3FC2591F3FE21912F0114 -:10B5B000283649F4052F08600460F201F3FC259158 -:10B5C000F3FE21912F01222309F484C0622F70E041 -:10B5D00084EA96E129839CD02981892B09F47AC0D9 -:10B5E00000FD07C0F501E080F180C50102965C0115 -:10B5F00002C0E12CF12C2E3649F4F6014681578128 -:10B6000060E070E0202FC701BADD73CF233689F4E4 -:10B6100001FF11E0C6019DD097FD5AC0E114F1046D -:10B6200029F0F7018083C70101967C01115091F741 -:10B630004BC02B3551F49201A701612FC60181DE69 -:10B640002C01892B09F040C03AC0C6012983C3DD13 -:10B65000298197FD3DC02F3641F128F4243619F198 -:10B66000293631F124C0233769F02537E1F01FC0B6 -:10B67000E114F10429F0F7018082C70101967C01F1 -:10B68000115059F0C60165D04C0197FD06C038D065 -:10B69000892B71F3B601C401D2D0E114F104A1F0F9 -:10B6A000F701108211C0006203C0006101C0006494 -:10B6B000202FA701612FC601A4DD811105C0F6016D -:10B6C0008381807329F406C000FD13CF739411CFDA -:10B6D000772019F0872D90E002C08FEF9FEF0F9039 -:10B6E000DF91CF911F910F91FF90EF90DF90CF905E -:10B6F000BF90AF909F908F907F905F904F900895F4 -:10B70000911114C1803219F089508550D0F70895F5 -:10B71000FC010590061621F00020D9F7C00108951C -:10B720003197CF010895FC010590615070400110E0 -:10B73000D8F7809590958E0F9F1F0895FC0161505A -:10B74000704001900110D8F7809590958E0F9F1F43 -:10B750000895CF93DF93EC012B8120FF33C026FFA8 -:10B760000AC02F7B2B838E819F8101968E839F83BE -:10B770008A8190E029C022FF0FC0E881F981808191 -:10B78000082E000C990B009719F420622B831AC025 -:10B790003196E883F9830EC0EA85FB85199597FFFA -:10B7A00009C02B81019611F080E201C080E1822B5B -:10B7B0008B8308C02E813F812F5F3F4F2E833F83B5 -:10B7C000992702C08FEF9FEFDF91CF9108950F93DC -:10B7D0001F93CF93DF93FB01238121FD03C08FEFE4 -:10B7E0009FEF28C022FF16C04681578124813581F2 -:10B7F0004217530744F4A081B1819D012F5F3F4F51 -:10B80000208331838C93268137812F5F3F4F26839E -:10B81000378310C0EB01092F182F0084F185E02D2C -:10B820001995892BE1F68E819F8101968E839F83E6 -:10B83000812F902FDF91CF911F910F910895FB01E0 -:10B84000238120FF12C026FD10C08F3F3FEF9307DA -:10B8500061F082832F7D20642383268137812150EC -:10B86000310926833783992708958FEF9FEF089535 -:10B87000FA01AA27283051F1203181F1E8946F9321 -:10B880006E7F6E5F7F4F8F4F9F4FAF4FB1E03ED0C7 -:10B89000B4E03CD0670F781F891F9A1FA11D680F65 -:10B8A000791F8A1F911DA11D6A0F711D811D911D98 -:10B8B000A11D20D009F468943F912AE0269F11240D -:10B8C0003019305D3193DEF6CF010895462F477071 -:10B8D000405D4193B3E00FD0C9F7F6CF462F4F70CC -:10B8E000405D4A3318F0495D31FD4052419302D02A -:10B8F000A9F7EACFB4E0A6959795879577956795D0 -:10B90000BA95C9F700976105710508959B01AC01CF -:10B910000A2E06945795479537952795BA95C9F7F6 -:10B92000620F731F841F951FA01D089599278827F4 -:10B930000895052E97FB16F400940FD057FD05D0FF -:10B9400014D007FC02D046F408C0509540953095BD -:10B9500021953F4F4F4F5F4F08959095809570957B -:10B9600061957F4F8F4F9F4F0895A1E21A2EAA1B1A -:10B97000BB1BFD010DC0AA1FBB1FEE1FFF1FA2179F -:10B98000B307E407F50720F0A21BB30BE40BF50B9C -:10B99000661F771F881F991F1A9469F76095709525 -:10B9A000809590959B01AC01BD01CF010895F8945D -:02B9B000FFCFC7 -:10B9B20002400F0083100000010410000001820801 -:10B9C20000000100000000000000000000009001E3 -:10B9D20001000100000000000000112418241824B6 -:10B9E200242430243A24572465248E249124952437 -:10B9F2001027722687268B26A026D126E426112719 -:10BA02003E000426140004043E00042E040C040428 -:10BA120000080008000000000000000800080808F4 -:10BA220008080800080008000000080800080808C4 -:10BA32000080008000000000000000800080808004 -:10BA420080808000800080000000808000808080F4 -:10BA520000010001000000000000000100010101DE -:10BA620001010100010001000000010100010101CA -:10BA720000000000000000000000000000000000C4 -:10BA820001010101010101010101010101010101A4 -:10BA92000101010101010101010101010101010194 -:10BAA2000101010101010101010101010101010184 -:10BAB2000000000000000000000000000000000084 -:10BAC2000000000000000000000000000000000074 -:10BAD2000000000000000000000000000000000064 -:10BAE2000101010101010101010101010101010144 -:10BAF2000000000000000000000000000000000044 -:10BB02000000000000000000000000000000000033 -:10BB12000101010101010101010101010101010113 -:10BB22000000000000000000000000000000000013 -:10BB320001010101010101010101010101010101F3 -:10BB420001010101010101010101010101010101E3 -:10BB520000000000000000000000000000000000E3 -:10BB620001010101010101010101010101010101C3 -:10BB720000000002020000020002020202000002B3 -:10BB820000000002020000020002020202000002A3 -:10BB92000000000202000002000202020200000293 -:10BBA2000404040606040406040606060604040643 -:10BBB2000404040606040406040606060604040633 -:10BBC2000000000202000002000202020200000263 -:10BBD2000000000202000002000202020200000253 -:10BBE2000404040606040406040606060604040603 -:10BBF2000000000202000002000202020200000233 -:10BC020004040406060404060406060606040406E2 -:10BC120004040406060404060406060606040406D2 -:10BC220004040406060404060406060606040406C2 -:10BC320004040406060404060406060606040406B2 -:10BC420000000002020000020002020202000002E2 -:10BC520000000002020000020002020202000002D2 -:10BC62000404040606040406040606060604040682 -:10BC72000008080800000008000008000808000882 -:10BC82000008080800000008000008000808000872 -:10BC92000008080800000008000008000808000862 -:10BCA2001018181810101018101018101818101852 -:10BCB2001018181810101018101018101818101842 -:10BCC2000008080800000008000008000808000832 -:10BCD2000008080800000008000008000808000822 -:10BCE2001018181810101018101018101818101812 -:10BCF2000008080800000008000008000808000802 -:10BD020010181818101010181010181018181018F1 -:10BD120010181818101010181010181018181018E1 -:10BD220010181818101010181010181018181018D1 -:10BD320010181818101010181010181018181018C1 -:10BD420000080808000000080000080008080008B1 -:10BD520000080808000000080000080008080008A1 -:10BD62001018181810101018101018101818101891 -:10BD7200546F6F206D616E7920646174612E000DC5 -:10BD82000A000D0A504152495459204552524F520D -:10BD9200000D0A504152495459204F4B0025347529 -:10BDA2003A2000556E6B6E6F776E2063617264206D -:10BDB200747970652E002573206F7220004E4F201B -:06BDC20044415441000061 +:109170004655462FE091652EF091662EB80181ECA0 +:109180001995B4C0B701C801CDD9D8012C91119659 +:109190008C911197822712969C911297892713968A +:1091A0009C911397892714969C911497891362C0F8 +:1091B0008B2D90E00397283881F49C01220F331FF8 +:1091C000820F931FFC01E25CF24D11962D913D91AF +:1091D0004C9120833183428312C0FC01EE0FFF1FAC +:1091E0008E0F9F1F9C01225C324DF801808191817E +:1091F000A281B381F90180839183A283B38345E087 +:1092000050E0B801C80102960E940556F3E0BF166F +:1092100029F024E0B21621F087E903C083E901C0F8 +:1092200085E9D8018C9380E711968C9367E0C8019B +:1092300031DAF8018783908783E08B0D8093492D85 +:1092400068E470E081C0FBE1EF16F10498F0B7012B +:10925000C801B6D9811111C0C701089667E070E056 +:109260000E944655462FE091652EF091662EB8017A +:1092700081EC19951092492D39C0B701C80152D916 +:1092800063E0C80107DA6C01892BA1F7D8018C9142 +:1092900082FF15C0B8E0BB1691F0E6E0BE1611F0F3 +:1092A00087E901C085E9D8018C9380E211968C93FF +:1092B000BA94BA94B092492D60E170E045C081E063 +:1092C00080934A2D8B2D90E00697B82EBB0C8B0D0A +:1092D0008C5F8093482DF801808180933D2D3AC0AA +:1092E000E114F10431F481E08093492D0E94682A51 +:1092F0002FC0B701C80164D981110FC0C7010896FA +:1093000067E070E00E944655462FE091652EF0918F +:10931000662EB80181EC199508C0B701C80102D9C1 +:1093200063E0C801B7D9892BF1F282ECD8018C93A4 +:1093300061E0C801AFD9F80181839283B092492DD1 +:1093400010924A2D68E170E0C8017ED86C0102C01D +:10935000C12CD12C80914A2D882309F420C4D090AF +:10936000B82CDD2099F1E114F10429F41092B82C05 +:1093700010924A2D43C0F2EAEF16F10440F0B70113 +:10938000C8011ED991E08927A82EB12C03C0AA24B8 +:10939000A394B12CB701C801C5D8AB2829F462E168 +:1093A000C80178D9892B29F0ACEFAD0DA093B82C6A +:1093B0002AC024E0D29ED0011124A859B34D80E1E7 +:1093C000F80101900D928A95E1F71DC042E050E04E +:1093D00060ED71E1CE0101960E94CE55E3EDF1E121 +:1093E000E49120913B2D30913C2D89819A81281761 +:1093F000390721F480913D2D8E1729F01092492DC7 +:109400000E94682ACAC32091B82C203109F04DC0AF +:1094100010924A2D1092B82C1092772C20E130E057 +:1094200048E75CE267E870E0CE0101960E94050E15 +:109430006FEC73E2CE0181960E94285620E130E065 +:1094400048E85CE265E670E0CE0183960E94050E76 +:109450006FEC73E2CE018D5B9F4F0E94285620E196 +:1094600030E048E95CE263E470E0CE018B5B9F4F43 +:109470000E94050E6FEC73E2CE018B599F4F0E9444 +:10948000285620E130E048EA5CE261E270E0CE017B +:1094900089599F4F0E94050E0E94D622BE016F5F20 +:1094A0007F4F85E60E943F2278C380E3D8018C93EA +:1094B00011962C9362E0C801CF5BDD4F2883C15425 +:1094C000D240E8D8F80182839383CF5BDD4F2881B7 +:1094D000C154D2402C5F2093B82CE6CD80914A2D08 +:1094E000B090492D882331F0F1E0FB1508F44EC10E +:1094F00010924A2D25E02B15B0F033E0B316E8F5B5 +:1095000041E04B15C8F081E090E0809320209093DB +:10951000212082E5D8018C9382E08093492D67E079 +:10952000C62ED12C35C158E05B1508F0A2C08AE0E8 +:10953000B81609F4EEC02AC1B2E1EB16F10408F442 +:10954000B0C0B701C8013CD8882301F1B701C801F8 +:109550000E949242F801818190E0982F8827208113 +:10956000822B80933B2D90933C2D83E9808380E276 +:10957000818383E08093492DB8C0B701C80120D80A +:10958000882321F0F8E0EF16F10488F41092492DB9 +:10959000C701089667E070E00E944655462FE091AB +:1095A000652EF091662EB80181EC1995B8C0B7010F +:1095B000C8010E949242D8012C9111968C9111976A +:1095C000822712969C911297892713969C91139744 +:1095D000892714969C911497891363C08B2D90E072 +:1095E0000397283881F49C01220F331F820F931FA9 +:1095F000FC01E25CF24D11962D913D914C9120833E +:109600003183428312C0FC01EE0FFF1F8E0F9F1F9C +:109610009C01225C324DF80180819181A281B3814D +:10962000F90180839183A283B38345E050E0B801C0 +:10963000C80102960E940556F3E0BF1629F024E007 +:10964000B21621F087E903C083E901C085E9D8019A +:109650008C9380E711968C9367E0C8011BD8F801C2 +:109660008783908783E08B0D8093492D68E470E0B9 +:1096700088C0FBE1EF16F104A0F0B701C8010E9419 +:10968000E042811111C0C701089667E070E00E94B6 +:109690004655462FE091652EF091662EB80181EC7B +:1096A00019951092492D3BC0B701C8010E94924202 +:1096B00063E0C8010E944A436C01892B91F7D801ED +:1096C0008C9182FF15C0B8E0BB1691F0E6E0BE16A3 +:1096D00011F087E901C085E9D8018C9380E21196E9 +:1096E0008C93BA94BA94B092492D60E170E049C06D +:1096F00081E080934A2D8B2D90E00697B82EBB0C0D +:109700008B0D8C5F8093482DF801808180933D2DD7 +:109710003FC0E114F10431F481E08093492D0E94AF +:10972000682A34C0B701C8010E94E04281110FC00D +:10973000C701089667E070E00E944655462FE09109 +:10974000652EF091662EB80181EC19950AC0B7011B +:10975000C8010E94924263E0C8010E944A43892BDB +:10976000D9F282ECD8018C9361E0C8010E944A438F +:10977000F80181839283B092492D10924A2D68E1BD +:1097800070E0C8010E9424426C0102C0C12CD12C9F +:1097900080914A2D882309F402C28091492D9AEFC5 +:1097A000980F933008F04FC0D801DC90D5FADD2433 +:1097B000D0F810922B2DEBE9AE2EE0E1BE2EC12C9D +:1097C00047E650E0B501CE0101960E94CE558B814F +:1097D000882349F029813A8180913B2D90913C2D3D +:1097E00028173907B9F48D81882329F09C8180914D +:1097F0003D2D98130FC08F89882311F0DD2051F083 +:10980000E0912B2D81E08E0F80932B2DF0E0E45D15 +:10981000F24DC082C394B7E6AB0EB11CEFE0CE129E +:10982000CFCFDD2009F494C080EED8018C9380E87E +:1098300011968C9362E0C8010E944A43F80182832A +:10984000938389E0A7C0893009F082C0B701C801BD +:109850000E94E04281110FC0C701089667E070E0E6 +:109860000E944655462FE091652EF091662EB80174 +:1098700081EC1995BFC0B701C8010E9492427C01DA +:10988000D8016C91262F30E073E0969587957A95F4 +:10989000E1F702972817390731F46E5FC8010E947B +:1098A0004A43892B71F082ECF801808361E0C801A2 +:1098B0000E944A43D80111968C93119712969C935B +:1098C000A3C0D12C67E6C62E5801FFEFAF1ABF0A1E +:1098D00080912B2DD816E0F5ED2DF0E0E45DF24DF2 +:1098E0006081C69EB001112465567F4E47E650E068 +:1098F000CE0101960E94CE558F89882339F14E8979 +:1099000050E0F801808190E001974817590739F439 +:10991000B501CE0106960E94EF55892BB9F0209132 +:109920002B2D422F50E0415051093D2D832F90E0C7 +:10993000841795073CF4FC01E45DF24D818180833E +:109940003F5FF4CF215020932B2DDA94D394C0CFD6 +:109950008091492D9AEF980F9430F8F490912B2D27 +:109960002CE23DE2F9018E2F821B891708F068C0B6 +:10997000819184508230B8F782E0D8018C9380E6E0 +:1099800011968C9362E0C8010E944A43F8018283D9 +:1099900093838BE08093492D87CB8B3009F050C0A7 +:1099A000E114F10409F44AC0B701C8010E94E04281 +:1099B00081110FC0C701089667E070E00E9446550C +:1099C000462FE091652EF091662EB80181EC199535 +:1099D0000FC0B701C8010E94924253E09695879547 +:1099E0005A95E1F7682FC8010E944A43892BA1F0DC +:1099F00010922B2D82ECD8018C9361E0C8010E945B +:109A00004A43F801818392838AE08093492D109222 +:109A10004A2D68E170E04ACBD80115968C918823D5 +:109A200031F0813059F480932B2D85E004C081E022 +:109A300080932B2D84E080932C2D02C010922B2D2F +:109A400080912B2D811103C063EF73E213C081302D +:109A5000A9F460912C2DB7E66B9FB00111246E53D1 +:109A60007F4E40E450E0CE0101960E94CE55BE01EB +:109A70006F5F7F4F85E60E943F2268C0912C80E097 +:109A800090E000E010E027E6822E7E013FEFE31A2F +:109A90003DEFF30A36E0C32E34E2D32EA12C42E090 +:109AA000B42E20912B2D921680F50130E2E01E0796 +:109AB00020F0081B190BF12C2EC0E92DF0E0E45D1D +:109AC000F24D6081869EB00111246E537F4E40E4BA +:109AD00050E0C7010E94CE55FF92EF92DF92CF92E5 +:109AE000C501801B910B9F938F9381E090E08C0FB9 +:109AF0009D1F800F911F9F938F930E942F56080FD9 +:109B0000191F9394CDBFDEBFCCCF013042E01407C4 +:109B100080F6FF24F394EDEFFFEFEC0FFD1FE00F55 +:109B2000F11F8EE28083EEEFFFEFEC0FFD1FE00FE1 +:109B3000F11F1082BE016F5F7F4F85E60E943F22BA +:109B4000F11004C081E390E10E94C7188AE290E11D +:109B50000E94C71862E070E08BE39DE20E945D22E4 +:109B600084E290E10E94C7186091482D70E08EE376 +:109B70009DE20E945D228EE190E10E94C71861E0A3 +:109B800070E08DE39DE20E945D221092772C10928E +:109B90002B2D0E94D62210924A2DC12CD12CC60109 +:109BA000CF5BDD4FCDBFDEBFDF91CF911F910F9116 +:109BB000FF90EF90DF90CF90BF90AF909F908F90ED +:109BC0007F906F905F904F903F902F900895FF92FD +:109BD0000F931F93CF93DF93CDB7DEB7EA97CDBF37 +:109BE000DEBF0FEB11E388E0F82EF00E91D2F80102 +:109BF00081938F01FE12FACF0E94761904D3882335 +:109C000009F4F7C08091BF319091C031953009F4CB +:109C10006FC030F4913069F168F0933051F1E9C0D0 +:109C2000983009F4C2C0993009F4C8C0963009F0E0 +:109C3000E0C072C0803891F0823809F0DAC08091BB +:109C4000C3318F7085D2E091C931F091CA31118151 +:109C500012FB112710F980E07BD206C01091BB31B6 +:109C60008091BC3181111260E8D2812F61D280E0F5 +:109C7000A1C0282F2D7F09F0BCC0882319F08230A5 +:109C800061F0B7C08091C131813009F0B2C093302A +:109C900009F080E08093BC3127C08091C1318111EF +:109CA00023C0E091C3311E2F1F7009F4A2C0812F81 +:109CB0004FD28091C031833011F4EBD215C0E091C6 +:109CC000C931F091CA3181818B7F818324E8129F51 +:109CD000F0011124E35FFD4C1082E091C931F09155 +:109CE000CA3180818E7F808380E032D2A6D264C068 +:109CF00081117FC01091C1311F779FD2A1D35DD256 +:109D00008823E9F31093C304111102C082E001C05B +:109D100083E08093BE316DC08058823008F069C006 +:109D20008091C1319091C2318C3DE3E09E0761F595 +:109D300083E08A838AE389834FB7F894DE01139620 +:109D400020E038E052E05093CA01E32FF0E0E491C4 +:109D50001092CA0120FF03C0E295EF703F5FEF70E1 +:109D60008E2F90E0EA3010F0C79601C0C0968D9318 +:109D70009D932F5F2C3139F74FBF5FD26AE370E0BC +:109D8000CE010196A3D00FC0AE014F5F5F4F60912F +:109D9000C3310E94710C8C01892B59F14ED2B8014C +:109DA00089819A810FD1A5D124C0803811F545D27F +:109DB0008091BA31BDD184D143D31BC0811119C068 +:109DC0008091C1318230A8F438D28091C131809322 +:109DD000BA3136D38091BA31811106C08091C30463 +:109DE000811102C081E001C084E08093BE310E94F5 +:109DF000721909D2882311F020D24BD2EA96CDBF36 +:109E0000DEBFDF91CF911F910F91FF9008950895CC +:109E1000CF938091BE31882351F0C091CB3180E047 +:109E200097D1F1D18111D3DE8C2FCF9191C1CF91F8 +:109E30000895CF92DF92EF92FF920F931F93CF93EB +:109E4000DF93EC018B017A0111D3811136C0E1144B +:109E5000F10439F0F70180819181081B190BC80FBB +:109E6000D91FC12CD12C0115110531F18091C731B9 +:109E70009091C831FC01EF5BFF4F208131978081C9 +:109E8000281790F01DD1C4DFE114F10449F0F70167 +:109E900080819181C80ED91EC082D18285E00DC01B +:109EA000E5D2882301F309C0899142D101501109FB +:109EB000FFEFCF1ADF0AD7CF80E0DF91CF911F915C +:109EC0000F91FF90EF90DF90CF900895DF92EF9287 +:109ED000FF920F931F93CF93DF93D82FC92F8B013E +:109EE0008091CB31806834D12091C5313091C63119 +:109EF0002017310728F00115110519F4E1D001C030 +:109F00008901ED2EFC2ED12C0115110509F440C05C +:109F10008091BE31811102C082E04CC0853011F4C5 +:109F200083E048C070D1882311F081E043C051D153 +:109F300081113CC042D1882339F32091CB318091EB +:109F4000C7319091C831FC0127FF05C0EF5BFF4F7F +:109F5000C081D0E013C0E05CFF4FC08131968081AA +:109F6000D0E0C81BD1090AC0C830D10550F4F701B0 +:109F700081917F01DDD00150110921960115110554 +:109F800099F7DD24D394289709F0D12C99D0BCCF30 +:109F9000D110BECF0BC08091BE31882309F4BCCF55 +:109FA000853009F4BDCF2FD18111BFCF12D18823C5 +:109FB00091F380E0DF91CF911F910F91FF90EF908F +:109FC000DF900895DF92EF92FF920F931F93CF934C +:109FD000DF93D82FC92F8B018091CB318068B8D007 +:109FE0002091C5313091C6312017310728F0011575 +:109FF000110519F465D001C08901ED2EFC2ED12C7C +:10A000000115110509F442C08091BE31811102C0D1 +:10A0100082E04EC0853011F483E04AC0F4D088233A +:10A0200011F081E045C0D5D081113EC0C6D0882353 +:10A0300039F32091CB318091C7319091C831FC0127 +:10A0400027FF05C0EF5BFF4FC081D0E015C0E05C8B +:10A05000FF4FC08131968081D0E0C81BD1090CC070 +:10A06000C830D10560F4F701849162D0FFEFEF1A98 +:10A07000FF0A0150110921960115110589F7DD2408 +:10A08000D394289709F0D12C1BD0BACFD110BCCFD4 +:10A090000BC08091BE31882309F4BACF853009F412 +:10A0A000BBCFB1D08111BDCF94D0882391F380E094 +:10A0B000DF91CF911F910F91FF90EF90DF90089566 +:10A0C000E091C931F091CA31A091C731B091C83146 +:10A0D000AF5BBF4F8C9190E08283938380818D79B9 +:10A0E0008083E091C731F091C831EF5BFF4F108260 +:10A0F0000895E091C931F091CA3180818D798083D2 +:10A10000E091C731F091C831EF5BFF4F10820895A5 +:10A110008091C7319091C831FC01EF5BFF4F2081E6 +:10A1200031E0320F3083FC01E20FF11D8081089590 +:10A130002091C7313091C831F901EF5BFF4F908119 +:10A1400041E0490F4083F901E90FF11D8083089533 +:10A150008093CB31482F4F7050E06091C6047091CE +:10A16000C7049A0194E0220F331F9A95E1F7E4E8BF +:10A1700087FF11C0E49FC001E59F900D1124825F0D +:10A180009D4C8093C7319093C831C90108969B01BB +:10A19000280F391F0DC0E49FC001E59F900D1124C9 +:10A1A00084539E4C8093C7319093C831260F371F3C +:10A1B0002093C9313093CA3108958091CB318068A2 +:10A1C000C7DFE091C931F091CA31808186958170F5 +:10A1D00008958091CB318F77BBDFA091C931B091C9 +:10A1E000CA318C9185FF0DC0E091C731F091C83123 +:10A1F00012968D919C911397E05CFF4F808381E0D4 +:10A20000089580E008958091CB318F77A1DFA091F0 +:10A21000C931B091CA318C9184FF0DC0E091C73132 +:10A22000F091C83112968D919C911397E05CFF4F8D +:10A23000808381E0089580E008958091CB318F770D +:10A2400087DFE091C931F091CA3180818D788083B8 +:10A25000E091C931F091CA31808181608083E091C1 +:10A26000C731F091C831EF5BFF4F10828091CB3145 +:10A2700080686EDFE091C931F091CA3180818160E0 +:10A280008083E091C731F091C831EF5BFF4F1082BE +:10A290000895E091C931F091CA3181818460818350 +:10A2A000E091C931F091CA318181807C803459F4C8 +:10A2B0008091CB3180584CDFE091C931F091CA31A7 +:10A2C00081818460818308951F93CF93DF931F92D0 +:10A2D0001F92CDB7DEB7182F4A83698339DFE0912B +:10A2E000C931F091CA311182E091C931F091CA317E +:10A2F000812F881F8827881F880F8083E091C931AC +:10A30000F091CA3169816183E091C931F091CA311C +:10A31000128213822091C7313091C8312483358352 +:10A32000110F110B4A814123F901E05CFF4F40837B +:10A330003196108281E00F900F90DF91CF911F91A5 +:10A340000895AF92BF92CF92DF92EF92FF920F9358 +:10A350001F93CF93DF93A62E8C017C0184E0E80E3F +:10A36000F11CB12CBA1409F443C0F801D081DD23EB +:10A37000C1F1C180D280F70131978081F7019081CE +:10A38000923010F498E001C098E128E030E0C0E09D +:10A390002C153D0520F4CF5F220F331FF9CFC92BB9 +:10A3A0009D2F9F70963010F080E023C0CF7EF1E4A7 +:10A3B000CF16D104C8F7882321F0813021F4C06C76 +:10A3C0000AC0C06403C0C068811105C04C2D6C2F49 +:10A3D00080E88D0F79DF4C2D6C2F8D2F75DF882352 +:10A3E00019F3B3940B5F1F4F85E0E80EF11CBACF51 +:10A3F00081E0DF91CF911F910F91FF90EF90DF905F +:10A40000CF90BF90AF90089580E090E0E091C604B7 +:10A41000F091C7049C0144E0220F331F4A95E1F7F5 +:10A42000E20FF31F11864091C6045091C704FA0150 +:10A43000E20FF31F118201968630910539F70895D6 +:10A440008091BF3187FF0DC0C4DE811105C08091AE +:10A45000BE318111F9CF09C04CCE8091BE31882325 +:10A4600021F0ABDE8823C9F32BCE08950F931F9301 +:10A47000CF93E091C604F091C704E05AFF4F0081EA +:10A480001181C4E68091CB3187FF0AC096DE81112D +:10A4900005C08091BE31811105C021C080E024C07B +:10A4A00098DEF5CF8530E9F0E091C931F091CA31FD +:10A4B000818182FD18C0E091C604F091C704E05A82 +:10A4C000FF4F8081918180179107E1F22FEF2C0FD0 +:10A4D000CC2319F08C01C22FD5CF84E005C082E0D7 +:10A4E00003C083E001C081E0CF911F910F910895D7 +:10A4F00063D069D0E0ECF4E081818E7F818380813C +:10A500008F7780831092BD310895CF93DF93E0E47D +:10A51000F0E014828481836084834ED054D0C0ECF8 +:10A52000D4E088818F7788838881806888831092BF +:10A53000BE311092BA311092BC311092BB31888179 +:10A540008064888348E068E480E8BEDE48E068E430 +:10A5500080E0BADE8885806488878981816089830C +:10A56000DF91CF910895CF93DF933FB7F894C0EC7C +:10A57000D1E022E02A87EAE1F0E0E491A0ECB4E047 +:10A58000DA96EC93DA97EBE1F0E0E491DB96EC936A +:10A59000DB971A8685EE94E38E7F16968D939C93B7 +:10A5A000179785E18C9318962C933FBF81E0809399 +:10A5B000BD31DF91CF91A9CFE0ECF4E080858370CD +:10A5C000808711860895E0ECF4E08FEF828784871E +:10A5D00008951F920F920FB60F92112408B60F9292 +:10A5E00018BE09B60F9219BE0BB60F921BBE2F9361 +:10A5F0003F934F935F936F937F938F939F93AF930B +:10A60000BF93EF93FF938091CA0487FF08C08091A6 +:10A61000C80487FF04C080E88093CA04F8DB8091F7 +:10A62000CA0486FF07C080E48093CA041092BE313A +:10A630000E9461198091CA0485FF14C080E2809352 +:10A64000CA048091BA31882311F084E007C0809158 +:10A65000C304811102C081E001C083E08093BE3158 +:10A660000E9450198091CA0484FF14C080E1809335 +:10A67000CA0482E08093BE311092BA311092C304B2 +:10A68000C3DE48E068E480E81FDE48E068E480E07C +:10A690001BDEBDDBFF91EF91BF91AF919F918F9139 +:10A6A0007F916F915F914F913F912F910F900BBED2 +:10A6B0000F9009BE0F9008BE0F900FBE0F901F9015 +:10A6C0001895CF93DF93EC01FC0170968BE0DF01CE +:10A6D0001D928A95E9F782E08C83898783E08E87D3 +:10A6E00061E0CE0101962DDE882361F061E0CE01AC +:10A6F000069627DE882331F061E0CE010B96DF91CC +:10A70000CF911FCE80E0DF91CF9108950F931F93DB +:10A71000CF93DF932091BE312430E1F4FC01048912 +:10A72000158926893789012B022B032B99F0EB0120 +:10A7300081810EDDFE0101900020E9F73197BF0114 +:10A740006C1B7D0B40E050E0CE01DF91CF911F915B +:10A750000F916FCB82E0DF91CF911F910F91089500 +:10A760000F931F93CF93DF93FC018091BE31843010 +:10A77000A9F484899589A689B789892B8A2B8B2B83 +:10A7800069F08A01EB018181E3DC40E050E0B8012F +:10A79000CE01DF91CF911F910F914BCB82E0DF91E2 +:10A7A000CF911F910F910895CF93FC018091BE31FD +:10A7B000843001F584899589A689B789892B8A2BEC +:10A7C0008B2BC1F0C62F8181C3DC2091C731309122 +:10A7D000C831F901EF5BFF4F908131978081981765 +:10A7E00020F48C2FA5DC80E006C06ADC3FDE8823E5 +:10A7F000C1F301C082E0CF910895CF93DF93209100 +:10A80000BE31243091F5FC014489558966897789E8 +:10A81000452B462B472B49F181819ADC8091CB3126 +:10A820002091C7313091C831F90187FF05C0EF5B36 +:10A83000FF4F808190E008C0E05CFF4F808131963F +:10A84000408190E0841B9109892B69F0F901EF5B4D +:10A85000FF4FD0813197C08133DCDC1720F006DE5A +:10A86000811104C02DDC80E001C082E0DF91CF9136 +:10A870000895CF93DF932091BE31243099F4FC01E9 +:10A880004489558966897789452B462B472B51F09A +:10A89000EC0181815DDC91DC882321F0CE01DF9128 +:10A8A000CF91ABCFDF91CF910895CF93DF932091DC +:10A8B000BE31243019F08FEF9FEF46C0FC01448970 +:10A8C000558966897789452B462B472BA1F38681CD +:10A8D0003FDC7FDC882379F38091CB312091C73135 +:10A8E0003091C831F90187FF05C0EF5BFF4F8081D0 +:10A8F00090E008C0E05CFF4F80813196208190E0BD +:10A90000821B9109892B21F003DCC82FD0E002C003 +:10A91000CFEFDFEF2091CB318091C7319091C831DB +:10A92000FC0127FF05C0EF5BFF4F208130E008C02E +:10A93000E05CFF4F20813196808130E0281B310997 +:10A94000232B09F4D6DBCE01DF91CF910895089532 +:10A95000FF920F931F93CF93DF93EC0154DC882376 +:10A9600009F48EC0888190E02091C3313091C431C8 +:10A970002817390709F084C08091C031813259F01D +:10A9800018F4803249F17CC0823209F457C0833216 +:10A9900009F467C075C08091BF31813A09F070C079 +:10A9A0004CDC0BDC8823E9F38C89FD880E891F8938 +:10A9B000BFDB8F2DBDDB802FBBDB812FB9DB888D0B +:10A9C000B7DB898DB5DB8A8DB3DB7ADBDF91CF9185 +:10A9D0001F910F91FF9034CD8091BF31813209F0EA +:10A9E0004FC02BDCF6DB811105C08091BE31811197 +:10A9F000F9CF46C08DDB082F8BDB182F89DBF82EB3 +:10AA000087DB4F2D50E060E070E0BA015527442706 +:10AA1000782B402B512B4C8B5D8B6E8B7F8B78DB97 +:10AA2000888F76DB898F74DB8A8F63DB09DDCE014B +:10AA3000DF91CF911F910F91FF9089CF8091BF310E +:10AA40008132F1F4FADBFCDC8091C1319091C231AA +:10AA5000888B998BCE01DF91CF911F910F91FF9041 +:10AA600076CF8091BF31813259F4E7DBE9DC609128 +:10AA7000C131CE01DF91CF911F910F91FF9067CF30 +:10AA8000DF91CF911F910F91FF900895AA1BBB1BDF +:10AA900051E107C0AA1FBB1FA617B70710F0A61BDE +:10AAA000B70B881F991F5A95A9F780959095BC01FF +:10AAB000CD010895B7FF04C003D0821B930B089506 +:10AAC00009D0A59F900DB49F900DA49F800D911D5E +:10AAD00011240895A29FB001B39FC001A39F700DE0 +:10AAE000811D1124911DB29F700D811D1124911D96 +:10AAF00008958F929F92AF92BF92CF92DF92EF9282 +:10AB0000FF92CF93DF93EC01688179818A819B81E9 +:10AB1000611571058105910521F464E279ED8BE5FC +:10AB200097E02DE133EF41E050E022D749015A018F +:10AB30009B01AC01A7EAB1E4C3DF6B017C01ACEE81 +:10AB4000B4EFA5019401B8DFDC01CB018C0D9D1D94 +:10AB5000AE1DBF1DB7FF03C00197A109B048888390 +:10AB60009983AA83BB839F77DF91CF91FF90EF906A +:10AB7000DF90CF90BF90AF909F908F900895B9CF06 +:10AB800082E290E2B6CFA0E0B0E0809322209093E2 +:10AB90002320A0932420B09325200895FB01DC01FD +:10ABA00002C005900D9241505040D8F70895FB0126 +:10ABB000DC018D91059080190110D9F3990B08954E +:10ABC000FB01DC014150504048F005900D920020FF +:10ABD000C9F701C01D9241505040E0F70895FB01B4 +:10ABE000DC0104C08D910190801921F44150504046 +:10ABF000C8F7881B990B0895FB01DC0102C0019086 +:10AC00000D9241505040D8F708956817790768F4BD +:10AC1000FB01DC01E40FF51FA40FB51F02C0029079 +:10AC20000E9241505040D8F70895E6CFDC0101C0A4 +:10AC30006D9341505040E0F70895FC0181918617D3 +:10AC400021F08823D9F7992708953197CF010895E6 +:10AC5000FB01DC0101900D920020E1F708950F93B4 +:10AC60001F93CF93DF93CDB7DEB72E97CDBFDEBF57 +:10AC70000E891F89888D998D26E02C8309831A837C +:10AC800097FF02C080E090E801978D839E83AE011C +:10AC9000445E5F4F6A8D7B8DCE01019667D04D81FA +:10ACA0005E8157FD0AC02F813885421753070CF487 +:10ACB0009A01F801E20FF31F10822E96CDBFDEBF7E +:10ACC000DF91CF911F910F9108950F931F93CF9311 +:10ACD000DF93CDB7DEB72E97CDBFDEBF0E891F89BC +:10ACE000888D998D2EE02C8309831A8397FF02C0EB +:10ACF00080E090E801978D839E83AE01445E5F4FB4 +:10AD00006A8D7B8DCE01019631D04D815E8157FDDC +:10AD10000AC02F813885421753070CF49A01F801B5 +:10AD2000E20FF31F10822E96CDBFDEBFDF91CF91D1 +:10AD30001F910F910895CF93DF93CDB7DEB72E9774 +:10AD4000CDBFDEBF8DE08C838C899D8989839A83FA +:10AD5000AE01485E5F4F6E897F89CE0101968FD329 +:10AD60002E96CDBFDEBFDF91CF9108952F923F92F7 +:10AD70004F925F926F927F928F929F92AF92BF920B +:10AD8000CF92DF92EF92FF920F931F93CF93DF93B7 +:10AD9000CDB7DEB72C97CDBFDEBF7C016B018A013A +:10ADA000FC0116821782838181FFB0C1CE0101961A +:10ADB0004C01F7019381F60193FD859193FF8191F9 +:10ADC0006F01882309F49EC1853239F493FD859182 +:10ADD00093FF81916F01853221F4B70190E0D6D4C1 +:10ADE000E8CF512C312C20E02032A0F48B3269F0D6 +:10ADF00030F4803259F0833269F420612CC08D32F6 +:10AE000039F0803339F4216026C02260246023C0E9 +:10AE1000286021C027FD27C030ED380F3A3078F484 +:10AE200026FF06C0FAE05F9E300D1124532E13C09A +:10AE30008AE0389E300D1124332E20620CC08E32F1 +:10AE400021F426FD5FC1206406C08C3611F4206811 +:10AE500002C0883641F4F60193FD859193FF8191FC +:10AE60006F018111C1CF982F9F7D9554933028F4A5 +:10AE70000C5F1F4FFFE3F9830DC0833631F083373A +:10AE800071F0833509F057C021C0F80180818983B2 +:10AE90000E5F1F4F44244394512C540114C03801B9 +:10AEA000F2E06F0E711CF801A080B18026FF03C094 +:10AEB000652D70E002C06FEF7FEFC5012C871DD4B8 +:10AEC0002C0183012C852F77222E16C03801F2E049 +:10AED0006F0E711CF801A080B18026FF03C0652DA4 +:10AEE00070E002C06FEF7FEFC5012C87FBD32C0110 +:10AEF0002C852068222E830123FC19C0832D90E02D +:10AF000048165906A0F4B70180E290E03FD43A9485 +:10AF1000F5CFF50127FC859127FE81915F01B701EF +:10AF200090E034D431103A94F1E04F1A51084114B2 +:10AF3000510479F7DEC0843611F0893631F5F80115 +:10AF400027FF07C060817181828193810C5F1F4F51 +:10AF500008C060817181072E000C880B990B0E5F71 +:10AF60001F4F2F76722E97FF09C090958095709590 +:10AF700061957F4F8F4F9F4F2068722E2AE030E0FF +:10AF8000A40155D4A82EA81843C0853729F42F7ED4 +:10AF9000B22E2AE030E025C0F22FF97FBF2E8F3687 +:10AFA000C1F018F4883579F0ADC0803719F08837D2 +:10AFB00021F0A8C02F2F2061B22EB4FE0DC08B2D22 +:10AFC0008460B82E09C024FF0AC09F2F9660B92E56 +:10AFD00006C028E030E005C020E130E002C020E1FA +:10AFE00032E0F801B7FE07C06081718182819381F0 +:10AFF0000C5F1F4F06C06081718180E090E00E5FA2 +:10B000001F4FA40114D4A82EA818FB2DFF777F2E64 +:10B0100076FE0BC0372D3E7FA51450F474FE0AC097 +:10B0200072FC08C0372D3E7E05C0BA2C372D03C0F8 +:10B03000BA2C01C0B52C34FF0DC0FE01EA0DF11D84 +:10B040008081803311F4397E09C032FF06C0B39489 +:10B05000B39404C0832F867809F0B39433FD12C0F3 +:10B0600030FF06C05A2CB31418F4530C5B18B32CE1 +:10B07000B31460F4B70180E290E03C8787D3B394C7 +:10B080003C85F6CFB31410F43B1801C0312C34FFCB +:10B0900011C0B70180E390E03C8778D33C8532FF54 +:10B0A00016C031FD03C088E790E002C088E590E05B +:10B0B000B7010CC0832F867851F031FF02C08BE2BC +:10B0C00001C080E237FD8DE2B70190E05FD3A514A7 +:10B0D00030F4B70180E390E059D35A94F8CFAA94A2 +:10B0E000F401EA0DF11D8081B70190E04FD3A1106A +:10B0F000F6CF332009F45DCEB70180E290E046D36D +:10B100003A94F7CFF7018681978102C08FEF9FEFC6 +:10B110002C96CDBFDEBFDF91CF911F910F91FF9095 +:10B12000EF90DF90CF90BF90AF909F908F907F90E7 +:10B130006F905F904F903F902F90089520FD09C031 +:10B14000FC0123FD05C022FF02C07383628351838B +:10B150004083089544FD10C046FD10C0DB01FC0192 +:10B16000AA0FBB1FEE1FFF1F1094D1F76A0F7B1FA2 +:10B170008E1F9F1F31E003C033E001C034E0660F33 +:10B18000771F881F991F3150D1F7620F711D811DE4 +:10B19000911D08950F931F93CF93DF938C01C801E6 +:10B1A000B7D2EC0197FD06C08AD2892BC1F7B8014E +:10B1B000CE0124D3CE01DF91CF911F910F9108953D +:10B1C0008F929F92AF92BF92CF92DF92EF92FF92B7 +:10B1D0000F931F93CF93DF931F92CDB7DEB78C01F0 +:10B1E000C62E7A01298394D2AC01552729814B328E +:10B1F000510521F04D32510561F42068CA94C11007 +:10B2000002C080E06FC0C801298382D2298197FDE6 +:10B21000F8CF322F3D7FD32E322F307339F5803364 +:10B2200029F5BB24BA94BC0C09F449C0C801298390 +:10B230006FD2298197FD43C0382F3F7D383561F4A7 +:10B240008D2D8264D82ECA94CA94CC20C1F1C80135 +:10B250005FD297FF0BC033C026FF04C02D2D2260A4 +:10B26000D22E03C03D2D3261D32ECB2C812C912CBC +:10B27000540120ED280F283078F0D4FE03C0B80127 +:10B28000BDD21AC02A3040F0D6FEF9CF2F7D3FEE56 +:10B29000320F3630A0F727504D2DC501B4015ADFCB +:10B2A0004B015C018D2D8260D82ECA94CC2051F0C8 +:10B2B000C8012ED297FFDDCFD1FC04C0A2CF812CD4 +:10B2C000912C5401D7FE08C0B094A094909480941F +:10B2D000811C911CA11CB11C2D2DB501A401C7011D +:10B2E0002DDF81E00F90DF91CF911F910F91FF90A3 +:10B2F000EF90DF90CF90BF90AF909F908F90089588 +:10B300006F927F928F929F92AF92BF92CF92DF9275 +:10B31000EF92FF920F931F93CF93DF93CDB7DEB7DA +:10B32000A197CDBFDEBF5C017A01CE0101966C0111 +:10B3300080E2F60111928A95E9F7F501838040E0F9 +:10B3400050E0912C712C70E0A1E0B0E0F90183FC99 +:10B35000859183FE81918F01982F9F01811103C0F8 +:10B3600080E090E07AC08E3519F44115510549F11D +:10B37000E72FF0E0E417F5073CF48D3559F18D32F5 +:10B3800019F4772001F103C0711001C0982E892FA4 +:10B390008695869586958601080F111D892F8770E1 +:10B3A0003D0101C0660C8A95EAF7F8018081862983 +:10B3B0008083991559F0991510F49F5FE8CF91504B +:10B3C000E6CF71E004C07724739401C0712C4F5F05 +:10B3D0005F4FBCCF772019F08E8180628E83711110 +:10B3E00003C09924939416C0F6019E012F5D3F4F30 +:10B3F000808180958193E217F307D1F7F2CFE114B2 +:10B40000F10429F0F7018083C70101967C016150A6 +:10B41000912CE9F0C50169A37BD169A197FD15C005 +:10B42000282F269526952695F601E20FF11D2081FD +:10B4300030E0AC014770552702C0359527954A95F5 +:10B44000E2F720FDDCCFB501D9D1911089CFE1140D +:10B45000F10411F0F7011082C801A196CDBFDEBF43 +:10B46000DF91CF911F910F91FF90EF90DF90CF90E0 +:10B47000BF90AF909F908F907F906F9008954F9264 +:10B480005F927F928F929F92AF92BF92CF92DF9204 +:10B49000EF92FF920F931F93CF93DF931F92CDB73D +:10B4A000DEB76C012B015A01FC0116821782712C48 +:10B4B000F601F380F201F3FC8591F3FE8191382FC0 +:10B4C0002F01882309F4E5C090E03983F8D0398151 +:10B4D000892B19F0C6015EDEEBCF353241F4F20163 +:10B4E000F3FC3591F3FE31912F01353259F4C60149 +:10B4F00039830ED1398197FDCAC03817C9F2B60118 +:10B500007DD1C7C03A3239F4F3FC3591F3FE319165 +:10B510002F0151E001C050E0420110E020ED230F67 +:10B520002A3088F45260612F70E080E090E040E2C1 +:10B53000598310DE162FF401F3FC3591F3FE31919F +:10B540004F015981EBCF052F232F240151FF03C059 +:10B55000111102C09EC01FEF383619F03C3659F069 +:10B5600011C0F401F3FC2591F3FE21912F0128363F +:10B5700049F4052F08600460F201F3FC2591F3FE05 +:10B5800021912F01222309F484C0622F70E084EA04 +:10B5900096E129839CD02981892B09F47AC000FD8A +:10B5A00007C0F501E080F180C50102965C0102C090 +:10B5B000E12CF12C2E3649F4F6014681578160E0EA +:10B5C00070E0202FC701BADD73CF233689F401FF65 +:10B5D00011E0C6019DD097FD5AC0E114F10429F095 +:10B5E000F7018083C70101967C01115091F74BC090 +:10B5F0002B3551F49201A701612FC60181DE2C0188 +:10B60000892B09F040C03AC0C6012983C3DD2981D6 +:10B6100097FD3DC02F3641F128F4243619F1293623 +:10B6200031F124C0233769F02537E1F01FC0E11460 +:10B63000F10429F0F7018082C70101967C011150C5 +:10B6400059F0C60165D04C0197FD06C038D0892B52 +:10B6500071F3B601C401D2D0E114F104A1F0F701F5 +:10B66000108211C0006203C0006101C00064202F7D +:10B67000A701612FC601A4DD811105C0F6018381F8 +:10B68000807329F406C000FD13CF739411CF772087 +:10B6900019F0872D90E002C08FEF9FEF0F90DF91A0 +:10B6A000CF911F910F91FF90EF90DF90CF90BF90BF +:10B6B000AF909F908F907F905F904F9008959111E1 +:10B6C00014C1803219F089508550D0F70895FC01DB +:10B6D0000590061621F00020D9F7C0010895319792 +:10B6E000CF010895FC010590615070400110D8F71A +:10B6F000809590958E0F9F1F0895FC0161507040BA +:10B7000001900110D8F7809590958E0F9F1F089596 +:10B71000CF93DF93EC012B8120FF33C026FF0AC0BB +:10B720002F7B2B838E819F8101968E839F838A81BD +:10B7300090E029C022FF0FC0E881F9818081082EA6 +:10B74000000C990B009719F420622B831AC03196D4 +:10B75000E883F9830EC0EA85FB85199597FF09C038 +:10B760002B81019611F080E201C080E1822B8B8356 +:10B7700008C02E813F812F5F3F4F2E833F83992743 +:10B7800002C08FEF9FEFDF91CF9108950F931F932A +:10B79000CF93DF93FB01238121FD03C08FEF9FEF48 +:10B7A00028C022FF16C04681578124813581421767 +:10B7B000530744F4A081B1819D012F5F3F4F208347 +:10B7C00031838C93268137812F5F3F4F26833783C8 +:10B7D00010C0EB01092F182F0084F185E02D199579 +:10B7E000892BE1F68E819F8101968E839F83812F25 +:10B7F000902FDF91CF911F910F910895FB0123812D +:10B8000020FF12C026FD10C08F3F3FEF930761F06D +:10B8100082832F7D20642383268137812150310943 +:10B8200026833783992708958FEF9FEF0895FA01B4 +:10B83000AA27283051F1203181F1E8946F936E7F6F +:10B840006E5F7F4F8F4F9F4FAF4FB1E03ED0B4E060 +:10B850003CD0670F781F891F9A1FA11D680F791FA1 +:10B860008A1F911DA11D6A0F711D811D911DA11DB2 +:10B8700020D009F468943F912AE0269F11243019C2 +:10B88000305D3193DEF6CF010895462F4770405D5D +:10B890004193B3E00FD0C9F7F6CF462F4F70405D0C +:10B8A0004A3318F0495D31FD4052419302D0A9F767 +:10B8B000EACFB4E0A6959795879577956795BA9561 +:10B8C000C9F700976105710508959B01AC010A2E27 +:10B8D00006945795479537952795BA95C9F7620FFE +:10B8E000731F841F951FA01D089599278827089509 +:10B8F00003D0808199270895E0ECF1E0378537FD8A +:10B90000FDCF348538603487FC01E050F04F089556 +:10B91000262FF2DF0080021611F008D00197019760 +:10B9200008950196272FF5DFF3CF262FE0ECF1E005 +:10B93000378537FDFDCF3485377F3487378531FF35 +:10B9400009C036E3328738ED34BF31E033873785BD +:10B9500037FDFDCF33E332878083918312822483C6 +:10B9600025E3228728ED31E024BF3387019608952F +:10B97000052E97FB16F400940FD057FD05D014D078 +:10B9800007FC02D046F408C05095409530952195AB +:10B990003F4F4F4F5F4F08959095809570956195FB +:10B9A0007F4F8F4F9F4F0895A1E21A2EAA1BBB1BFA +:10B9B000FD010DC0AA1FBB1FEE1FFF1FA217B3077B +:10B9C000E407F50720F0A21BB30BE40BF50B661F91 +:10B9D000771F881F991F1A9469F760957095809555 +:10B9E00090959B01AC01BD01CF010895F894FFCF64 +:10B9F00002400F00831000000104100000018208C3 +:10BA000000000100000000000000000000009001A4 +:10BA1000010001000000000000006D247424742463 +:10BA200080248C249624B324C124EA24ED24F12418 +:10BA30006C27CE26E326E726FC262D2740276D27F8 +:10BA40003E000426140004043E00042E040C0404EA +:10BA500000080008000000000000000800080808B6 +:10BA60000808080008000800000008080008080886 +:10BA700000800080000000000000008000808080C6 +:10BA800080808000800080000000808000808080B6 +:10BA900000010001000000000000000100010101A0 +:10BAA000010101000100010000000101000101018C +:10BAB0000000000000000000000000000000000086 +:10BAC0000101010101010101010101010101010166 +:10BAD0000101010101010101010101010101010156 +:10BAE0000101010101010101010101010101010146 +:10BAF0000000000000000000000000000000000046 +:10BB00000000000000000000000000000000000035 +:10BB10000000000000000000000000000000000025 +:10BB20000101010101010101010101010101010105 +:10BB30000000000000000000000000000000000005 +:10BB400000000000000000000000000000000000F5 +:10BB500001010101010101010101010101010101D5 +:10BB600000000000000000000000000000000000D5 +:10BB700001010101010101010101010101010101B5 +:10BB800001010101010101010101010101010101A5 +:10BB900000000000000000000000000000000000A5 +:10BBA0000101010101010101010101010101010185 +:10BBB0000000000202000002000202020200000275 +:10BBC0000000000202000002000202020200000265 +:10BBD0000000000202000002000202020200000255 +:10BBE0000404040606040406040606060604040605 +:10BBF00004040406060404060406060606040406F5 +:10BC00000000000202000002000202020200000224 +:10BC10000000000202000002000202020200000214 +:10BC200004040406060404060406060606040406C4 +:10BC300000000002020000020002020202000002F4 +:10BC400004040406060404060406060606040406A4 +:10BC50000404040606040406040606060604040694 +:10BC60000404040606040406040606060604040684 +:10BC70000404040606040406040606060604040674 +:10BC800000000002020000020002020202000002A4 +:10BC90000000000202000002000202020200000294 +:10BCA0000404040606040406040606060604040644 +:10BCB0000008080800000008000008000808000844 +:10BCC0000008080800000008000008000808000834 +:10BCD0000008080800000008000008000808000824 +:10BCE0001018181810101018101018101818101814 +:10BCF0001018181810101018101018101818101804 +:10BD000000080808000000080000080008080008F3 +:10BD100000080808000000080000080008080008E3 +:10BD200010181818101010181010181018181018D3 +:10BD300000080808000000080000080008080008C3 +:10BD400010181818101010181010181018181018B3 +:10BD500010181818101010181010181018181018A3 +:10BD60001018181810101018101018101818101893 +:10BD70001018181810101018101018101818101883 +:10BD80000008080800000008000008000808000873 +:10BD90000008080800000008000008000808000863 +:10BDA0001018181810101018101018101818101853 +:10BDB000546F6F206D616E7920646174612E000D87 +:10BDC0000A000D0A504152495459204552524F52CF +:10BDD000000D0A504152495459204F4B00253475EB +:10BDE0003A2000556E6B6E6F776E2063617264202F +:10BDF000747970652E002573206F7220004E4F20DD +:06BE000044415441000022 :020000021000EC :1000000000000000000000000000000000000000F0 :1000100000000000000000000000000000000000E0 From 154383ec660316cf531b059b960a9543af80763c Mon Sep 17 00:00:00 2001 From: Georg Date: Tue, 7 Nov 2017 17:05:56 +0100 Subject: [PATCH 038/104] more indentation changes --- Firmware/Chameleon-Mini/Application/Crypto1.c | 66 +++++++++---------- .../Application/MifareUltralight.c | 52 +++++++-------- Firmware/Chameleon-Mini/Configuration.c | 26 ++++---- Firmware/Chameleon-Mini/MemoryAsm.S | 26 ++++---- 4 files changed, 85 insertions(+), 85 deletions(-) diff --git a/Firmware/Chameleon-Mini/Application/Crypto1.c b/Firmware/Chameleon-Mini/Application/Crypto1.c index 6be6780..feb6aa5 100644 --- a/Firmware/Chameleon-Mini/Application/Crypto1.c +++ b/Firmware/Chameleon-Mini/Application/Crypto1.c @@ -66,56 +66,56 @@ "ror %0" "\n\t" \ "lsr %2" "\n\t" \ "ror %1" \ - : "+r" (__even), \ - "+r" (__odd), \ + : "+r" (__even), \ + "+r" (__odd), \ "+r" (__byte) \ - : \ + : \ : "r0" ) /* Shift half LFSR state stored in three registers */ /* Input is bit 0 of __in */ #define SHIFT24(__b0, __b1, __b2, __in) \ - __asm__ __volatile__ ( \ - "lsr %3" "\n\t" \ - "ror %2" "\n\t" \ - "ror %1" "\n\t" \ - "ror %0" \ - : "+r" (__b0), \ - "+r" (__b1), \ - "+r" (__b2), \ - "+r" (__in) \ - : \ - : ) + __asm__ __volatile__ ( \ + "lsr %3" "\n\t" \ + "ror %2" "\n\t" \ + "ror %1" "\n\t" \ + "ror %0" \ + : "+r" (__b0), \ + "+r" (__b1), \ + "+r" (__b2), \ + "+r" (__in) \ + : \ + : ) /* Shift half LFSR state stored in three registers */ /* Input is bit 0 of __in */ /* decrypt with __stream if bit 0 of __decrypt is set */ #define SHIFT24_COND_DECRYPT(__b0, __b1, __b2, __in, __stream, __decrypt) \ __asm__ __volatile__ ( \ - "sbrc %5, 0" "\n\t" \ - "eor %3, %4" "\n\t" \ - "lsr %3" "\n\t" \ - "ror %2" "\n\t" \ - "ror %1" "\n\t" \ - "ror %0" \ - : "+r" (__b0), \ - "+r" (__b1), \ - "+r" (__b2), \ - "+r" (__in) \ - : "r" (__stream), \ - "r" (__decrypt) \ + "sbrc %5, 0" "\n\t" \ + "eor %3, %4" "\n\t" \ + "lsr %3" "\n\t" \ + "ror %2" "\n\t" \ + "ror %1" "\n\t" \ + "ror %0" \ + : "+r" (__b0), \ + "+r" (__b1), \ + "+r" (__b2), \ + "+r" (__in) \ + : "r" (__stream), \ + "r" (__decrypt) \ : "r0" ) /* Shift a byte with input from an other byte */ /* Input is bit 0 of __in */ #define SHIFT8(__byte, __in) \ - __asm__ __volatile__ ( \ - "lsr %1" "\n\t" \ - "ror %0" \ - : "+r" (__byte), \ - "+r" (__in) \ - : \ - : "r0" ) + __asm__ __volatile__ ( \ + "lsr %1" "\n\t" \ + "ror %0" \ + : "+r" (__byte), \ + "+r" (__in) \ + : \ + : "r0" ) /* End AVR specific */ #else diff --git a/Firmware/Chameleon-Mini/Application/MifareUltralight.c b/Firmware/Chameleon-Mini/Application/MifareUltralight.c index f55c126..98c5181 100644 --- a/Firmware/Chameleon-Mini/Application/MifareUltralight.c +++ b/Firmware/Chameleon-Mini/Application/MifareUltralight.c @@ -12,45 +12,45 @@ #include "../LEDHook.h" -#define ATQA_VALUE 0x0044 -#define SAK_CL1_VALUE ISO14443A_SAK_INCOMPLETE -#define SAK_CL2_VALUE ISO14443A_SAK_COMPLETE_NOT_COMPLIANT +#define ATQA_VALUE 0x0044 +#define SAK_CL1_VALUE ISO14443A_SAK_INCOMPLETE +#define SAK_CL2_VALUE ISO14443A_SAK_COMPLETE_NOT_COMPLIANT -#define ACK_VALUE 0x0A -#define ACK_FRAME_SIZE 4 /* Bits */ -#define NAK_INVALID_ARG 0x00 -#define NAK_CRC_ERROR 0x01 -#define NAK_EEPROM_ERROR 0x05 -#define NAK_OTHER_ERROR 0x06 -#define NAK_FRAME_SIZE 4 +#define ACK_VALUE 0x0A +#define ACK_FRAME_SIZE 4 /* Bits */ +#define NAK_INVALID_ARG 0x00 +#define NAK_CRC_ERROR 0x01 +#define NAK_EEPROM_ERROR 0x05 +#define NAK_OTHER_ERROR 0x06 +#define NAK_FRAME_SIZE 4 #define CMD_READ 0x30 -#define CMD_READ_FRAME_SIZE 2 /* without CRC bytes */ -#define CMD_WRITE 0xA2 +#define CMD_READ_FRAME_SIZE 2 /* without CRC bytes */ +#define CMD_WRITE 0xA2 #define CMD_WRITE_FRAME_SIZE 6 /* without CRC bytes */ #define CMD_COMPAT_WRITE 0xA0 #define CMD_COMPAT_WRITE_FRAME_SIZE 2 #define CMD_HALT 0x50 -#define UID_CL1_ADDRESS 0x00 /* In Card Memory */ -#define UID_CL1_SIZE 3 /* In Bytes */ -#define UID_BCC1_ADDRESS 0x03 +#define UID_CL1_ADDRESS 0x00 /* In Card Memory */ +#define UID_CL1_SIZE 3 /* In Bytes */ +#define UID_BCC1_ADDRESS 0x03 #define UID_CL2_ADDRESS 0x04 -#define UID_CL2_SIZE 4 -#define UID_BCC2_ADDRESS 0x08 +#define UID_CL2_SIZE 4 +#define UID_BCC2_ADDRESS 0x08 -#define BYTES_PER_PAGE 4 -#define PAGE_ADDRESS_MASK 0x0F +#define BYTES_PER_PAGE 4 +#define PAGE_ADDRESS_MASK 0x0F -#define BYTES_PER_READ 16 -#define PAGE_READ_MIN 0x00 -#define PAGE_READ_MAX 0x0F +#define BYTES_PER_READ 16 +#define PAGE_READ_MIN 0x00 +#define PAGE_READ_MAX 0x0F -#define BYTES_PER_WRITE 4 -#define PAGE_WRITE_MIN 0x02 -#define PAGE_WRITE_MAX 0x0F +#define BYTES_PER_WRITE 4 +#define PAGE_WRITE_MIN 0x02 +#define PAGE_WRITE_MAX 0x0F -#define BYTES_PER_COMPAT_WRITE 16 +#define BYTES_PER_COMPAT_WRITE 16 static enum { STATE_HALT, diff --git a/Firmware/Chameleon-Mini/Configuration.c b/Firmware/Chameleon-Mini/Configuration.c index ebbea50..df0707c 100644 --- a/Firmware/Chameleon-Mini/Configuration.c +++ b/Firmware/Chameleon-Mini/Configuration.c @@ -105,19 +105,19 @@ static const PROGMEM ConfigurationType ConfigurationTable[] = { #endif #ifdef CONFIG_MF_CLASSIC_1K_7B_SUPPORT [CONFIG_MF_CLASSIC_1K_7B] = { - .CodecInitFunc = ISO14443ACodecInit, - .CodecDeInitFunc = ISO14443ACodecDeInit, - .CodecTaskFunc = ISO14443ACodecTask, - .ApplicationInitFunc = MifareClassicAppInit1K7B, - .ApplicationResetFunc = MifareClassicAppReset, - .ApplicationTaskFunc = MifareClassicAppTask, - .ApplicationTickFunc = ApplicationTickDummy, - .ApplicationProcessFunc = MifareClassicAppProcess, - .ApplicationGetUidFunc = MifareClassicGetUid, - .ApplicationSetUidFunc = MifareClassicSetUid, - .UidSize = ISO14443A_UID_SIZE_DOUBLE, - .MemorySize = MIFARE_CLASSIC_1K_MEM_SIZE, - .ReadOnly = false + .CodecInitFunc = ISO14443ACodecInit, + .CodecDeInitFunc = ISO14443ACodecDeInit, + .CodecTaskFunc = ISO14443ACodecTask, + .ApplicationInitFunc = MifareClassicAppInit1K7B, + .ApplicationResetFunc = MifareClassicAppReset, + .ApplicationTaskFunc = MifareClassicAppTask, + .ApplicationTickFunc = ApplicationTickDummy, + .ApplicationProcessFunc = MifareClassicAppProcess, + .ApplicationGetUidFunc = MifareClassicGetUid, + .ApplicationSetUidFunc = MifareClassicSetUid, + .UidSize = ISO14443A_UID_SIZE_DOUBLE, + .MemorySize = MIFARE_CLASSIC_1K_MEM_SIZE, + .ReadOnly = false }, #endif #ifdef CONFIG_MF_CLASSIC_4K_SUPPORT diff --git a/Firmware/Chameleon-Mini/MemoryAsm.S b/Firmware/Chameleon-Mini/MemoryAsm.S index be91df9..1821302 100644 --- a/Firmware/Chameleon-Mini/MemoryAsm.S +++ b/Firmware/Chameleon-Mini/MemoryAsm.S @@ -55,9 +55,9 @@ FlashReadWord: in r19, RAMPZ ; Save RAMPZ. out RAMPZ, r24 ; Load RAMPZ with the MSB of the address. - movw ZL, r22 ; Move the low bytes to the Z pointer - elpm r24, Z+ ; Extended load byte from address pointed to by Z. - elpm r25, Z ; Extended load byte from address pointed to by Z. + movw ZL, r22 ; Move the low bytes to the Z pointer + elpm r24, Z+ ; Extended load byte from address pointed to by Z. + elpm r25, Z ; Extended load byte from address pointed to by Z. out RAMPZ, r19 ; Restore RAMPZ register. ret @@ -74,9 +74,9 @@ FlashReadWord: FlashEraseApplicationPage: in r19, RAMPZ ; Save RAMPZ, which is restored in FlashCommonSPM. out RAMPZ, r24 ; Load RAMPZ with the MSB of the address. - movw r24, r22 ; Move low bytes for ZH:ZL to R25:R24 + movw r24, r22 ; Move low bytes for ZH:ZL to R25:R24 ldi r20, NVM_CMD_ERASE_APP_PAGE_gc ; Prepare NVM command in R20. - jmp FlashCommonSPM ; Jump to common SPM code. + jmp FlashCommonSPM ; Jump to common SPM code. ; This routine writes the word from R23:R22 into the Flash page buffer at ; address R25:R24. @@ -91,9 +91,9 @@ FlashEraseApplicationPage: .global FlashLoadFlashWord FlashLoadFlashWord: in r19, RAMPZ ; Save RAMPZ, which is restored in FlashCommonSPM. - movw r0, r22 ; Prepare flash word in R1:R0. + movw r0, r22 ; Prepare flash word in R1:R0. ldi r20, NVM_CMD_LOAD_FLASH_BUFFER_gc ; Prepare NVM command in R20. - jmp FlashCommonSPM ; Jump to common SPM code. + jmp FlashCommonSPM ; Jump to common SPM code. ; This routine erases first and then writes the page buffer to the @@ -110,9 +110,9 @@ FlashLoadFlashWord: FlashEraseWriteApplicationPage: in r19, RAMPZ ; Save RAMPZ, which is restored in FlashCommonSPM. out RAMPZ, r24 ; Load RAMPZ with the MSB of the address. - movw r24, r22 ; Move low bytes of address to ZH:ZL from R23:R22 + movw r24, r22 ; Move low bytes of address to ZH:ZL from R23:R22 ldi r20, NVM_CMD_ERASE_WRITE_APP_PAGE_gc ; Prepare NVM command in R20. - jmp FlashCommonSPM ; Jump to common SPM code. + jmp FlashCommonSPM ; Jump to common SPM code. ; This routine flushes the Flash page buffer. ; @@ -126,7 +126,7 @@ FlashEraseWriteApplicationPage: FlashEraseFlashBuffer: in r19, RAMPZ ; Save RAMPZ, which is restored in FlashCommonSPM. ldi r20, NVM_CMD_ERASE_FLASH_BUFFER_gc ; Prepare NVM command in R20. - ;jmp FlashCommonSPM ; Jump to common SPM code. + ;jmp FlashCommonSPM ; Jump to common SPM code. jmp FlashCommonCMD ; This routine wait for the SPM to finish and clears the command register. @@ -190,7 +190,7 @@ FlashCommonCMD: ; R24 - Result from LPM operation. .section .text FlashCommonLPM: - movw ZL, r24 ; Load index into Z. + movw ZL, r24 ; Load index into Z. sts NVM_CMD, r20 ; Load prepared command into NVM Command register. lpm r24,Z ret @@ -210,11 +210,11 @@ FlashCommonLPM: ; Nothing. .section .spmhelper FlashCommonSPM: - movw ZL, r24 ; Load R25:R24 into Z. + movw ZL, r24 ; Load R25:R24 into Z. sts NVM_CMD, r20 ; Load prepared command into NVM Command register. ldi r18, CCP_SPM_gc ; Prepare Protect SPM signature in R18 sts CCP, r18 ; Enable SPM operation (this disables interrupts for 4 cycles). - spm ; Self-program. + spm ; Self-program. clr r1 ; Clear R1 for GCC _zero_reg_ to function properly. out RAMPZ, r19 ; Restore RAMPZ register. ret From d8e67a18c359da33ac2740f40349ad928093760c Mon Sep 17 00:00:00 2001 From: dev_zzo Date: Fri, 17 Nov 2017 18:58:54 +0100 Subject: [PATCH 039/104] UL EV1: initial working version --- .../Application/MifareUltralight.c | 443 +++++++++++++----- .../Application/MifareUltralight.h | 8 +- Firmware/Chameleon-Mini/Configuration.c | 31 ++ Firmware/Chameleon-Mini/Configuration.h | 2 + 4 files changed, 361 insertions(+), 123 deletions(-) diff --git a/Firmware/Chameleon-Mini/Application/MifareUltralight.c b/Firmware/Chameleon-Mini/Application/MifareUltralight.c index 98c5181..6a57e36 100644 --- a/Firmware/Chameleon-Mini/Application/MifareUltralight.c +++ b/Firmware/Chameleon-Mini/Application/MifareUltralight.c @@ -10,6 +10,7 @@ #include "../Codec/ISO14443-2A.h" #include "../Memory.h" #include "../LEDHook.h" +#include "../Terminal/Terminal.h" #define ATQA_VALUE 0x0044 @@ -20,38 +21,69 @@ #define ACK_FRAME_SIZE 4 /* Bits */ #define NAK_INVALID_ARG 0x00 #define NAK_CRC_ERROR 0x01 +#define NAK_CTR_ERROR 0x04 #define NAK_EEPROM_ERROR 0x05 #define NAK_OTHER_ERROR 0x06 +#define NAK_AUTH_REQUIRED NAK_OTHER_ERROR #define NAK_FRAME_SIZE 4 +/* ISO commands */ +#define CMD_HALT 0x50 +/* EV0 commands */ #define CMD_READ 0x30 #define CMD_READ_FRAME_SIZE 2 /* without CRC bytes */ #define CMD_WRITE 0xA2 #define CMD_WRITE_FRAME_SIZE 6 /* without CRC bytes */ #define CMD_COMPAT_WRITE 0xA0 #define CMD_COMPAT_WRITE_FRAME_SIZE 2 -#define CMD_HALT 0x50 +/* EV1 commands */ +#define CMD_GET_VERSION 0x60 +#define CMD_FAST_READ 0x3A +#define CMD_READ_CNT 0x39 +#define CMD_INCREMENT_CNT 0xA5 +#define CMD_PWD_AUTH 0x1B +#define CMD_READ_SIG 0x3C +#define CMD_CHECK_TEARING_EVENT 0x3E +#define CMD_VCSL 0x4B -#define UID_CL1_ADDRESS 0x00 /* In Card Memory */ -#define UID_CL1_SIZE 3 /* In Bytes */ +/* Tag memory layout; addresses and sizes in bytes */ +#define UID_CL1_ADDRESS 0x00 +#define UID_CL1_SIZE 3 #define UID_BCC1_ADDRESS 0x03 -#define UID_CL2_ADDRESS 0x04 +#define UID_CL2_ADDRESS 0x04 #define UID_CL2_SIZE 4 #define UID_BCC2_ADDRESS 0x08 +#define LOCK_BYTES_1_ADDRESS 0x0A +#define LOCK_BYTES_2_ADDRESS 0x90 +#define CONFIG_AREA_SIZE 0x10 +#define CONF_AUTH0_OFFSET 0x03 +#define CONF_ACCESS_OFFSET 0x04 +#define CONF_PASSWORD_OFFSET 0x08 +#define CONF_PACK_OFFSET 0x0C + +#define CONF_ACCESS_PROT 0x80 +#define CONF_ACCESS_CNFLCK 0x40 + +#define CNT_MAX 2 +#define CNT_SIZE 4 +#define CNT_MAX_VALUE 0x00FFFFFF #define BYTES_PER_PAGE 4 #define PAGE_ADDRESS_MASK 0x0F #define BYTES_PER_READ 16 #define PAGE_READ_MIN 0x00 -#define PAGE_READ_MAX 0x0F #define BYTES_PER_WRITE 4 #define PAGE_WRITE_MIN 0x02 -#define PAGE_WRITE_MAX 0x0F #define BYTES_PER_COMPAT_WRITE 16 +static enum { + UL_EV0, + UL_EV1, +} Flavor; + static enum { STATE_HALT, STATE_IDLE, @@ -61,13 +93,52 @@ static enum { STATE_COMPAT_WRITE } State; -static uint8_t CompatWritePageAddress; static bool FromHalt = false; +static uint8_t PageCount; +static bool ArmedForCompatWrite; +static uint8_t CompatWritePageAddress; +static bool Authenticated; +static uint8_t FirstAuthenticatedPage; +static bool ReadAccessProtected; -void MifareUltralightAppInit(void) +static void AppInitCommon(void) { State = STATE_IDLE; FromHalt = false; + Authenticated = false; + ArmedForCompatWrite = false; +} + +void MifareUltralightAppInit(void) +{ + Flavor = UL_EV0; + PageCount = MIFARE_ULTRALIGHT_PAGES; + FirstAuthenticatedPage = 0xFF; + ReadAccessProtected = false; + AppInitCommon(); +} + +static void AppInitEV1Common(void) +{ + uint8_t ConfigAreaAddress = PageCount * BYTES_PER_PAGE - CONFIG_AREA_SIZE; + uint8_t Access; + Flavor = UL_EV1; + MemoryReadBlock(&FirstAuthenticatedPage, ConfigAreaAddress + CONF_AUTH0_OFFSET, 1); + MemoryReadBlock(&Access, ConfigAreaAddress + CONF_ACCESS_OFFSET, 1); + ReadAccessProtected = !!(Access & CONF_ACCESS_PROT); + AppInitCommon(); +} + +void MifareUltralightEV11AppInit(void) +{ + PageCount = MIFARE_ULTRALIGHT_EV11_PAGES; + AppInitEV1Common(); +} + +void MifareUltralightEV12AppInit(void) +{ + PageCount = MIFARE_ULTRALIGHT_EV12_PAGES; + AppInitEV1Common(); } void MifareUltralightAppReset(void) @@ -80,10 +151,249 @@ void MifareUltralightAppTask(void) } +static bool VerifyAuthentication(uint8_t PageAddress) +{ + /* No authentication for EV0 cards */ + if (Flavor < UL_EV1) { + return true; + } + /* If authenticated; no verification needed */ + if (Authenticated) { + return true; + } + return PageAddress < FirstAuthenticatedPage; +} + +/* Perform access verification and commit data if passed */ +static uint8_t AppWritePage(uint8_t PageAddress, uint8_t* const Buffer) +{ + if (!ActiveConfiguration.ReadOnly) { + MemoryWriteBlock(Buffer, PageAddress * BYTES_PER_PAGE, BYTES_PER_PAGE); + } else { + /* If the chameleon is in read only mode, it silently + * ignores any attempt to write data. */ + } + return 0; +} + +/* Handles processing of MF commands */ +static uint16_t AppProcess(uint8_t* const Buffer, uint16_t ByteCount) +{ + uint8_t Cmd = Buffer[0]; + + /* All commands here have CRCA appended; verify it right away */ + if (!ISO14443ACheckCRCA(Buffer, ByteCount - 2)) { + Buffer[0] = NAK_CRC_ERROR; + return NAK_FRAME_SIZE; + } + + if (ArmedForCompatWrite) { + ArmedForCompatWrite = false; + AppWritePage(CompatWritePageAddress, &Buffer[2]); + Buffer[0] = ACK_VALUE; + return ACK_FRAME_SIZE; + } + + /* Handle EV0 commands */ + switch (Cmd) { + + case CMD_READ: { + uint8_t PageAddress = Buffer[1]; + uint8_t PageLimit; + uint8_t Offset; + /* For EV1+ cards, ensure the wraparound is at the first protected page */ + if (Flavor >= UL_EV1 && ReadAccessProtected && !Authenticated) { + PageLimit = FirstAuthenticatedPage; + } else { + PageLimit = PageCount; + } + /* Validation */ + if (PageAddress >= PageLimit) { + Buffer[0] = NAK_INVALID_ARG; + return NAK_FRAME_SIZE; + } + /* Read out, emulating the wraparound */ + for (Offset = 0; Offset < BYTES_PER_READ; Offset += 4) { + MemoryReadBlock(&Buffer[Offset], PageAddress * BYTES_PER_PAGE, BYTES_PER_PAGE); + PageAddress++; + if (PageAddress == PageLimit) { + PageAddress = 0; + } + } + ISO14443AAppendCRCA(Buffer, BYTES_PER_READ); + return (BYTES_PER_READ + ISO14443A_CRCA_SIZE) * 8; + } + + case CMD_WRITE: { + /* This is a write command containing 4 bytes of data that + * should be written to the given page address. */ + uint8_t PageAddress = Buffer[1]; + /* Validation */ + if ((PageAddress < PAGE_WRITE_MIN) || (PageAddress >= PageCount)) { + Buffer[0] = NAK_INVALID_ARG; + return NAK_FRAME_SIZE; + } + if (!VerifyAuthentication(PageAddress)) { + Buffer[0] = NAK_AUTH_REQUIRED; + return NAK_FRAME_SIZE; + } + AppWritePage(PageAddress, &Buffer[2]); + Buffer[0] = ACK_VALUE; + return ACK_FRAME_SIZE; + } + + case CMD_COMPAT_WRITE: { + uint8_t PageAddress = Buffer[1]; + /* Validation */ + if ((PageAddress < PAGE_WRITE_MIN) || (PageAddress >= PageCount)) { + Buffer[0] = NAK_INVALID_ARG; + return NAK_FRAME_SIZE; + } + if (!VerifyAuthentication(PageAddress)) { + Buffer[0] = NAK_AUTH_REQUIRED; + return NAK_FRAME_SIZE; + } + /* CRC check passed and page-address is within bounds. + * Store address and proceed to receiving the data. */ + CompatWritePageAddress = PageAddress; + ArmedForCompatWrite = true; + Buffer[0] = ACK_VALUE; + return ACK_FRAME_SIZE; + } + + case CMD_HALT: { + /* Halts the tag. According to the ISO14443, the second + * byte is supposed to be 0. */ + if (Buffer[1] == 0) { + /* According to ISO14443, we must not send anything + * in order to acknowledge the HALT command. */ + State = STATE_HALT; + return ISO14443A_APP_NO_RESPONSE; + } else { + Buffer[0] = NAK_INVALID_ARG; + return NAK_FRAME_SIZE; + } + } + default: + break; + } + /* Handle EV1 commands */ + if (Flavor >= UL_EV1) { + switch (Cmd) { + + case CMD_GET_VERSION: { + /* Provide hardcoded version response */ + Buffer[0] = 0x00; + Buffer[1] = 0x04; + Buffer[2] = 0x03; + Buffer[3] = 0x01; /**/ + Buffer[4] = 0x01; + Buffer[5] = 0x00; + Buffer[6] = PageCount == MIFARE_ULTRALIGHT_EV11_PAGES ? 0x0B : 0x0E; + Buffer[7] = 0x03; + ISO14443AAppendCRCA(Buffer, 8); + return (8 + ISO14443A_CRCA_SIZE) * 8; + } + + case CMD_FAST_READ: { + uint8_t StartPageAddress = Buffer[1]; + uint8_t EndPageAddress = Buffer[2]; + /* Validation */ + if ((StartPageAddress > EndPageAddress) || (StartPageAddress >= PageCount) || (EndPageAddress >= PageCount)) { + Buffer[0] = NAK_INVALID_ARG; + return NAK_FRAME_SIZE; + } + /* Check authentication only if protection is read&write */ + if (ReadAccessProtected) { + if (!VerifyAuthentication(StartPageAddress) || !VerifyAuthentication(EndPageAddress)) { + Buffer[0] = NAK_AUTH_REQUIRED; + return NAK_FRAME_SIZE; + } + } + /* NOTE: With the current implementation, reading the password out is possible. */ + ByteCount = (EndPageAddress - StartPageAddress + 1) * BYTES_PER_PAGE; + MemoryReadBlock(Buffer, StartPageAddress * BYTES_PER_PAGE, ByteCount); + ISO14443AAppendCRCA(Buffer, ByteCount); + return (ByteCount + ISO14443A_CRCA_SIZE) * 8; + } + + case CMD_PWD_AUTH: { + uint8_t ConfigAreaAddress = PageCount * BYTES_PER_PAGE - CONFIG_AREA_SIZE; + uint8_t Password[4]; + MemoryReadBlock(Password, ConfigAreaAddress + CONF_PASSWORD_OFFSET, 4); + if (Password[0] != Buffer[1] || Password[1] != Buffer[2] || Password[2] != Buffer[3] || Password[3] != Buffer[4]) { + Buffer[0] = NAK_AUTH_REQUIRED; + return NAK_FRAME_SIZE; + } + Authenticated = 1; + MemoryReadBlock(Buffer, ConfigAreaAddress + CONF_PACK_OFFSET, 2); + ISO14443AAppendCRCA(Buffer, 2); + return (2 + ISO14443A_CRCA_SIZE) * 8; + } + + case CMD_READ_CNT: { + uint8_t CounterId = Buffer[1]; + /* Validation */ + if (CounterId > CNT_MAX) { + Buffer[0] = NAK_INVALID_ARG; + return NAK_FRAME_SIZE; + } + MemoryReadBlock(Buffer, (PageCount + CounterId) * BYTES_PER_PAGE, BYTES_PER_PAGE); + ISO14443AAppendCRCA(Buffer, BYTES_PER_PAGE); + return (BYTES_PER_PAGE + ISO14443A_CRCA_SIZE) * 8; + } + + case CMD_INCREMENT_CNT: { + uint8_t CounterId = Buffer[1]; + uint32_t Addend = (Buffer[0]) | (Buffer[1] << 8) | ((uint32_t)Buffer[2] << 16); + uint32_t Counter; + /* Validation */ + if (CounterId > CNT_MAX) { + Buffer[0] = NAK_INVALID_ARG; + return NAK_FRAME_SIZE; + } + MemoryReadBlock(&Counter, (PageCount + CounterId) * BYTES_PER_PAGE, BYTES_PER_PAGE); + Counter += Addend; + if (Counter > CNT_MAX_VALUE) { + Buffer[0] = NAK_CTR_ERROR; + return NAK_FRAME_SIZE; + } + MemoryWriteBlock(&Counter, (PageCount + CounterId) * BYTES_PER_PAGE, BYTES_PER_PAGE); + Buffer[0] = ACK_VALUE; + return ACK_FRAME_SIZE; + } + + case CMD_READ_SIG: + /* Hardcoded response */ + memset(Buffer, 0xCA, 32); + ISO14443AAppendCRCA(Buffer, 32); + return (32 + ISO14443A_CRCA_SIZE) * 8; + + case CMD_CHECK_TEARING_EVENT: + /* Hardcoded response */ + Buffer[0] = 0xBD; + ISO14443AAppendCRCA(Buffer, 1); + return (1 + ISO14443A_CRCA_SIZE) * 8; + + case CMD_VCSL: + /* Hardcoded response */ + Buffer[0] = 0x05; + ISO14443AAppendCRCA(Buffer, 1); + return (1 + ISO14443A_CRCA_SIZE) * 8; + + default: + break; + } + } + /* Command not handled. Switch to idle. */ + State = STATE_IDLE; + return ISO14443A_APP_NO_RESPONSE; +} uint16_t MifareUltralightAppProcess(uint8_t* Buffer, uint16_t BitCount) { uint8_t Cmd = Buffer[0]; + uint16_t ByteCount; switch(State) { case STATE_IDLE: @@ -144,124 +454,13 @@ uint16_t MifareUltralightAppProcess(uint8_t* Buffer, uint16_t BitCount) break; case STATE_ACTIVE: + /* Preserve incoming data length */ + ByteCount = (BitCount + 7) >> 3; if (ISO14443AWakeUp(Buffer, &BitCount, ATQA_VALUE, FromHalt)) { State = FromHalt ? STATE_HALT : STATE_IDLE; return ISO14443A_APP_NO_RESPONSE; - } else if (Cmd == CMD_READ) { - uint8_t PageAddress = Buffer[1]; - - if (ISO14443ACheckCRCA(Buffer, CMD_READ_FRAME_SIZE)) { - if ( (PageAddress >= PAGE_READ_MIN) - && (PageAddress <= PAGE_READ_MAX) ) { - /* TODO: Missing address wrap around behaviour. - * Implement using a for-loop copying 4 bytes each iteration - * and mask pageaddress */ - MemoryReadBlock(Buffer, PageAddress * BYTES_PER_PAGE, BYTES_PER_READ); - ISO14443AAppendCRCA(Buffer, BYTES_PER_READ); - return (BYTES_PER_READ + ISO14443A_CRCA_SIZE) * 8; - } else { - Buffer[0] = NAK_INVALID_ARG; - return NAK_FRAME_SIZE; - } - } else { - Buffer[0] = NAK_CRC_ERROR; - return NAK_FRAME_SIZE; - } - } else if (Cmd == CMD_WRITE) { - /* This is a write command containing 4 bytes of data that - * should be written to the given page address. */ - uint8_t PageAddress = Buffer[1]; - if (ISO14443ACheckCRCA(Buffer, CMD_WRITE_FRAME_SIZE)) { - /* CRC check passed */ - if ( (PageAddress >= PAGE_WRITE_MIN) - && (PageAddress <= PAGE_WRITE_MAX) ) { - /* PageAddress is within bounds. */ - - if (!ActiveConfiguration.ReadOnly) { - MemoryWriteBlock(&Buffer[2], PageAddress * BYTES_PER_PAGE, BYTES_PER_WRITE); - } else { - /* If the chameleon is in read only mode, it silently - * ignores any attempt to write data. */ - } - - Buffer[0] = ACK_VALUE; - return ACK_FRAME_SIZE; - - } else { - Buffer[0] = NAK_INVALID_ARG; - return NAK_FRAME_SIZE; - } - } else { - Buffer[0] = NAK_CRC_ERROR; - return NAK_FRAME_SIZE; - } - } else if (Cmd == CMD_COMPAT_WRITE) { - /* The Mifare compatbility write command is a 2-frame command. - * The first frame contains the page-address and the second frame - * holds the data. */ - uint8_t PageAddress = Buffer[1]; - - if (ISO14443ACheckCRCA(Buffer, CMD_COMPAT_WRITE_FRAME_SIZE)) { - if ( (PageAddress >= PAGE_WRITE_MIN) - && (PageAddress <= PAGE_WRITE_MAX) ) { - /* CRC check passed and page-address is within bounds. - * Store address and proceed to receiving the data. */ - CompatWritePageAddress = PageAddress; - State = STATE_COMPAT_WRITE; - - Buffer[0] = ACK_VALUE; - return ACK_FRAME_SIZE; - } else { - Buffer[0] = NAK_INVALID_ARG; - return NAK_FRAME_SIZE; - } - } else { - Buffer[0] = NAK_CRC_ERROR; - return NAK_FRAME_SIZE; - } - } else if (Cmd == CMD_HALT) { - /* Halts the tag. According to the ISO14443, the second - * byte is supposed to be 0. */ - if (Buffer[1] == 0) { - if (ISO14443ACheckCRCA(Buffer, 2)) { - /* According to ISO14443, we must not send anything - * in order to acknowledge the HALT command. */ - State = STATE_HALT; - return ISO14443A_APP_NO_RESPONSE; - } else { - Buffer[0] = NAK_CRC_ERROR; - return NAK_FRAME_SIZE; - } - } else { - Buffer[0] = NAK_INVALID_ARG; - return NAK_FRAME_SIZE; - } - } else { - /* Unknown command. Enter halt state */ - State = STATE_IDLE; - } - break; - - case STATE_COMPAT_WRITE: - /* Compatibility write. Receiving 16 bytes of data of which 4 bytes are valid. */ - if (ISO14443ACheckCRCA(Buffer, BYTES_PER_COMPAT_WRITE)) { - /* We don't perform any checks here. You will be able to program the - * whole memory. Also there is no OTP behaviour. */ - if (!ActiveConfiguration.ReadOnly) { - MemoryWriteBlock(Buffer, CompatWritePageAddress * BYTES_PER_PAGE, BYTES_PER_WRITE); - } else { - /* If we are told to be read only, we silently ignore the write command - * and pretend to have written data. */ - } - - State = STATE_ACTIVE; - Buffer[0] = ACK_VALUE; - return ACK_FRAME_SIZE; - } else { - State = STATE_ACTIVE; - Buffer[0] = NAK_CRC_ERROR; - return NAK_FRAME_SIZE; } + return AppProcess(Buffer, ByteCount); default: /* Unknown state? Should never happen. */ diff --git a/Firmware/Chameleon-Mini/Application/MifareUltralight.h b/Firmware/Chameleon-Mini/Application/MifareUltralight.h index 275685c..61577de 100644 --- a/Firmware/Chameleon-Mini/Application/MifareUltralight.h +++ b/Firmware/Chameleon-Mini/Application/MifareUltralight.h @@ -12,9 +12,15 @@ #include "ISO14443-3A.h" #define MIFARE_ULTRALIGHT_UID_SIZE ISO14443A_UID_SIZE_DOUBLE -#define MIFARE_ULTRALIGHT_MEM_SIZE 64 +#define MIFARE_ULTRALIGHT_PAGE_SIZE 4 +#define MIFARE_ULTRALIGHT_PAGES 16 +#define MIFARE_ULTRALIGHT_EV11_PAGES 20 +#define MIFARE_ULTRALIGHT_EV12_PAGES 41 +#define MIFARE_ULTRALIGHT_MEM_SIZE (MIFARE_ULTRALIGHT_PAGES * MIFARE_ULTRALIGHT_PAGE_SIZE) void MifareUltralightAppInit(void); +void MifareUltralightEV11AppInit(void); +void MifareUltralightEV12AppInit(void); void MifareUltralightAppReset(void); void MifareUltralightAppTask(void); diff --git a/Firmware/Chameleon-Mini/Configuration.c b/Firmware/Chameleon-Mini/Configuration.c index df0707c..2bf5039 100644 --- a/Firmware/Chameleon-Mini/Configuration.c +++ b/Firmware/Chameleon-Mini/Configuration.c @@ -16,6 +16,7 @@ static const MapEntryType PROGMEM ConfigurationMap[] = { { .Id = CONFIG_NONE, .Text = "NONE" }, #ifdef CONFIG_MF_ULTRALIGHT_SUPPORT { .Id = CONFIG_MF_ULTRALIGHT, .Text = "MF_ULTRALIGHT" }, + { .Id = CONFIG_MF_ULTRALIGHT_EV1_80B, .Text = "MF_ULTRALIGHT_EV1_80B" }, #endif #ifdef CONFIG_MF_CLASSIC_1K_SUPPORT { .Id = CONFIG_MF_CLASSIC_1K, .Text = "MF_CLASSIC_1K" }, @@ -85,6 +86,36 @@ static const PROGMEM ConfigurationType ConfigurationTable[] = { .MemorySize = MIFARE_ULTRALIGHT_MEM_SIZE, .ReadOnly = false }, + [CONFIG_MF_ULTRALIGHT_EV1_80B] = { + .CodecInitFunc = ISO14443ACodecInit, + .CodecDeInitFunc = ISO14443ACodecDeInit, + .CodecTaskFunc = ISO14443ACodecTask, + .ApplicationInitFunc = MifareUltralightEV11AppInit, + .ApplicationResetFunc = MifareUltralightAppReset, + .ApplicationTaskFunc = MifareUltralightAppTask, + .ApplicationTickFunc = ApplicationTickDummy, + .ApplicationProcessFunc = MifareUltralightAppProcess, + .ApplicationGetUidFunc = MifareUltralightGetUid, + .ApplicationSetUidFunc = MifareUltralightSetUid, + .UidSize = MIFARE_ULTRALIGHT_UID_SIZE, + .MemorySize = MIFARE_ULTRALIGHT_MEM_SIZE, + .ReadOnly = false + }, + [CONFIG_MF_ULTRALIGHT_EV1_164B] = { + .CodecInitFunc = ISO14443ACodecInit, + .CodecDeInitFunc = ISO14443ACodecDeInit, + .CodecTaskFunc = ISO14443ACodecTask, + .ApplicationInitFunc = MifareUltralightEV12AppInit, + .ApplicationResetFunc = MifareUltralightAppReset, + .ApplicationTaskFunc = MifareUltralightAppTask, + .ApplicationTickFunc = ApplicationTickDummy, + .ApplicationProcessFunc = MifareUltralightAppProcess, + .ApplicationGetUidFunc = MifareUltralightGetUid, + .ApplicationSetUidFunc = MifareUltralightSetUid, + .UidSize = MIFARE_ULTRALIGHT_UID_SIZE, + .MemorySize = MIFARE_ULTRALIGHT_MEM_SIZE, + .ReadOnly = false + }, #endif #ifdef CONFIG_MF_CLASSIC_1K_SUPPORT [CONFIG_MF_CLASSIC_1K] = { diff --git a/Firmware/Chameleon-Mini/Configuration.h b/Firmware/Chameleon-Mini/Configuration.h index 52d1e23..2ca4944 100644 --- a/Firmware/Chameleon-Mini/Configuration.h +++ b/Firmware/Chameleon-Mini/Configuration.h @@ -22,6 +22,8 @@ typedef enum { #ifdef CONFIG_MF_ULTRALIGHT_SUPPORT CONFIG_MF_ULTRALIGHT, + CONFIG_MF_ULTRALIGHT_EV1_80B, + CONFIG_MF_ULTRALIGHT_EV1_164B, #endif #ifdef CONFIG_MF_CLASSIC_1K_SUPPORT CONFIG_MF_CLASSIC_1K, From ac8b1cc944a8b8f1a9054db1b455d91448157fab Mon Sep 17 00:00:00 2001 From: dev_zzo Date: Fri, 17 Nov 2017 19:27:20 +0100 Subject: [PATCH 040/104] UL EV1: enable x21 size; minor improvements --- .../Application/MifareUltralight.c | 92 ++++++++++++++----- .../Application/MifareUltralight.h | 4 +- Firmware/Chameleon-Mini/Configuration.c | 5 +- 3 files changed, 76 insertions(+), 25 deletions(-) diff --git a/Firmware/Chameleon-Mini/Application/MifareUltralight.c b/Firmware/Chameleon-Mini/Application/MifareUltralight.c index 6a57e36..c1bb6af 100644 --- a/Firmware/Chameleon-Mini/Application/MifareUltralight.c +++ b/Firmware/Chameleon-Mini/Application/MifareUltralight.c @@ -24,7 +24,9 @@ #define NAK_CTR_ERROR 0x04 #define NAK_EEPROM_ERROR 0x05 #define NAK_OTHER_ERROR 0x06 +/* NOTE: the spec is not crystal clear which error is returned */ #define NAK_AUTH_REQUIRED NAK_OTHER_ERROR +#define NAK_AUTH_FAILED NAK_OTHER_ERROR #define NAK_FRAME_SIZE 4 /* ISO commands */ @@ -58,6 +60,7 @@ #define CONFIG_AREA_SIZE 0x10 #define CONF_AUTH0_OFFSET 0x03 #define CONF_ACCESS_OFFSET 0x04 +#define CONF_VCTID_OFFSET 0x05 #define CONF_PASSWORD_OFFSET 0x08 #define CONF_PACK_OFFSET 0x0C @@ -79,6 +82,9 @@ #define BYTES_PER_COMPAT_WRITE 16 +#define VERSION_INFO_LENGTH 8 +#define SIGNATURE_LENGTH 32 + static enum { UL_EV0, UL_EV1, @@ -111,8 +117,11 @@ static void AppInitCommon(void) void MifareUltralightAppInit(void) { + /* Set up the emulation flavor */ Flavor = UL_EV0; + /* EV0 cards have fixed size */ PageCount = MIFARE_ULTRALIGHT_PAGES; + /* Default values */ FirstAuthenticatedPage = 0xFF; ReadAccessProtected = false; AppInitCommon(); @@ -122,7 +131,10 @@ static void AppInitEV1Common(void) { uint8_t ConfigAreaAddress = PageCount * BYTES_PER_PAGE - CONFIG_AREA_SIZE; uint8_t Access; + + /* Set up the emulation flavor */ Flavor = UL_EV1; + /* Fetch some of the configuration into RAM */ MemoryReadBlock(&FirstAuthenticatedPage, ConfigAreaAddress + CONF_AUTH0_OFFSET, 1); MemoryReadBlock(&Access, ConfigAreaAddress + CONF_ACCESS_OFFSET, 1); ReadAccessProtected = !!(Access & CONF_ACCESS_PROT); @@ -153,17 +165,29 @@ void MifareUltralightAppTask(void) static bool VerifyAuthentication(uint8_t PageAddress) { - /* No authentication for EV0 cards */ + /* No authentication for EV0 cards; always pass */ if (Flavor < UL_EV1) { return true; } - /* If authenticated; no verification needed */ + /* If authenticated, no verification needed */ if (Authenticated) { return true; } + /* Otherwise, verify the accessed page is below the limit */ return PageAddress < FirstAuthenticatedPage; } +static bool AuthCounterIncrement(void) +{ + /* Currently not implemented */ + return true; +} + +static void AuthCounterReset(void) +{ + /* Currently not implemented */ +} + /* Perform access verification and commit data if passed */ static uint8_t AppWritePage(uint8_t PageAddress, uint8_t* const Buffer) { @@ -181,12 +205,7 @@ static uint16_t AppProcess(uint8_t* const Buffer, uint16_t ByteCount) { uint8_t Cmd = Buffer[0]; - /* All commands here have CRCA appended; verify it right away */ - if (!ISO14443ACheckCRCA(Buffer, ByteCount - 2)) { - Buffer[0] = NAK_CRC_ERROR; - return NAK_FRAME_SIZE; - } - + /* Handle the compatibility write command */ if (ArmedForCompatWrite) { ArmedForCompatWrite = false; AppWritePage(CompatWritePageAddress, &Buffer[2]); @@ -291,8 +310,8 @@ static uint16_t AppProcess(uint8_t* const Buffer, uint16_t ByteCount) Buffer[5] = 0x00; Buffer[6] = PageCount == MIFARE_ULTRALIGHT_EV11_PAGES ? 0x0B : 0x0E; Buffer[7] = 0x03; - ISO14443AAppendCRCA(Buffer, 8); - return (8 + ISO14443A_CRCA_SIZE) * 8; + ISO14443AAppendCRCA(Buffer, VERSION_INFO_LENGTH); + return (VERSION_INFO_LENGTH + ISO14443A_CRCA_SIZE) * 8; } case CMD_FAST_READ: { @@ -320,12 +339,23 @@ static uint16_t AppProcess(uint8_t* const Buffer, uint16_t ByteCount) case CMD_PWD_AUTH: { uint8_t ConfigAreaAddress = PageCount * BYTES_PER_PAGE - CONFIG_AREA_SIZE; uint8_t Password[4]; - MemoryReadBlock(Password, ConfigAreaAddress + CONF_PASSWORD_OFFSET, 4); - if (Password[0] != Buffer[1] || Password[1] != Buffer[2] || Password[2] != Buffer[3] || Password[3] != Buffer[4]) { - Buffer[0] = NAK_AUTH_REQUIRED; + + /* Verify value and increment authentication attempt counter */ + if (!AuthCounterIncrement()) { + /* Too many failed attempts */ + Buffer[0] = NAK_AUTH_FAILED; return NAK_FRAME_SIZE; } + /* Read and compare the password */ + MemoryReadBlock(Password, ConfigAreaAddress + CONF_PASSWORD_OFFSET, 4); + if (Password[0] != Buffer[1] || Password[1] != Buffer[2] || Password[2] != Buffer[3] || Password[3] != Buffer[4]) { + Buffer[0] = NAK_AUTH_FAILED; + return NAK_FRAME_SIZE; + } + /* Authenticate the user */ + AuthCounterReset(); Authenticated = 1; + /* Send the PACK value back */ MemoryReadBlock(Buffer, ConfigAreaAddress + CONF_PACK_OFFSET, 2); ISO14443AAppendCRCA(Buffer, 2); return (2 + ISO14443A_CRCA_SIZE) * 8; @@ -338,9 +368,10 @@ static uint16_t AppProcess(uint8_t* const Buffer, uint16_t ByteCount) Buffer[0] = NAK_INVALID_ARG; return NAK_FRAME_SIZE; } - MemoryReadBlock(Buffer, (PageCount + CounterId) * BYTES_PER_PAGE, BYTES_PER_PAGE); - ISO14443AAppendCRCA(Buffer, BYTES_PER_PAGE); - return (BYTES_PER_PAGE + ISO14443A_CRCA_SIZE) * 8; + /* Returned counter length is 3 bytes */ + MemoryReadBlock(Buffer, (PageCount + CounterId) * BYTES_PER_PAGE, 3); + ISO14443AAppendCRCA(Buffer, 3); + return (3 + ISO14443A_CRCA_SIZE) * 8; } case CMD_INCREMENT_CNT: { @@ -352,12 +383,15 @@ static uint16_t AppProcess(uint8_t* const Buffer, uint16_t ByteCount) Buffer[0] = NAK_INVALID_ARG; return NAK_FRAME_SIZE; } + /* Read the value out */ MemoryReadBlock(&Counter, (PageCount + CounterId) * BYTES_PER_PAGE, BYTES_PER_PAGE); + /* Add and check for overflow */ Counter += Addend; if (Counter > CNT_MAX_VALUE) { Buffer[0] = NAK_CTR_ERROR; return NAK_FRAME_SIZE; } + /* Update memory */ MemoryWriteBlock(&Counter, (PageCount + CounterId) * BYTES_PER_PAGE, BYTES_PER_PAGE); Buffer[0] = ACK_VALUE; return ACK_FRAME_SIZE; @@ -365,9 +399,9 @@ static uint16_t AppProcess(uint8_t* const Buffer, uint16_t ByteCount) case CMD_READ_SIG: /* Hardcoded response */ - memset(Buffer, 0xCA, 32); - ISO14443AAppendCRCA(Buffer, 32); - return (32 + ISO14443A_CRCA_SIZE) * 8; + memset(Buffer, 0xCA, SIGNATURE_LENGTH); + ISO14443AAppendCRCA(Buffer, SIGNATURE_LENGTH); + return (SIGNATURE_LENGTH + ISO14443A_CRCA_SIZE) * 8; case CMD_CHECK_TEARING_EVENT: /* Hardcoded response */ @@ -375,11 +409,14 @@ static uint16_t AppProcess(uint8_t* const Buffer, uint16_t ByteCount) ISO14443AAppendCRCA(Buffer, 1); return (1 + ISO14443A_CRCA_SIZE) * 8; - case CMD_VCSL: - /* Hardcoded response */ - Buffer[0] = 0x05; + case CMD_VCSL: { + uint8_t ConfigAreaAddress = PageCount * BYTES_PER_PAGE - CONFIG_AREA_SIZE; + /* Input is ignored completely */ + /* Read out the value */ + MemoryReadBlock(Buffer, ConfigAreaAddress + CONF_VCTID_OFFSET, 1); ISO14443AAppendCRCA(Buffer, 1); return (1 + ISO14443A_CRCA_SIZE) * 8; + } default: break; @@ -460,6 +497,17 @@ uint16_t MifareUltralightAppProcess(uint8_t* Buffer, uint16_t BitCount) State = FromHalt ? STATE_HALT : STATE_IDLE; return ISO14443A_APP_NO_RESPONSE; } + /* At the very least, there should be 3 bytes in the buffer. */ + if (ByteCount < (1 + ISO14443A_CRCA_SIZE)) { + State = STATE_IDLE; + return ISO14443A_APP_NO_RESPONSE; + } + /* All commands here have CRCA appended; verify it right away */ + ByteCount -= 2; + if (!ISO14443ACheckCRCA(Buffer, ByteCount)) { + Buffer[0] = NAK_CRC_ERROR; + return NAK_FRAME_SIZE; + } return AppProcess(Buffer, ByteCount); default: diff --git a/Firmware/Chameleon-Mini/Application/MifareUltralight.h b/Firmware/Chameleon-Mini/Application/MifareUltralight.h index 61577de..bae7a38 100644 --- a/Firmware/Chameleon-Mini/Application/MifareUltralight.h +++ b/Firmware/Chameleon-Mini/Application/MifareUltralight.h @@ -16,7 +16,9 @@ #define MIFARE_ULTRALIGHT_PAGES 16 #define MIFARE_ULTRALIGHT_EV11_PAGES 20 #define MIFARE_ULTRALIGHT_EV12_PAGES 41 -#define MIFARE_ULTRALIGHT_MEM_SIZE (MIFARE_ULTRALIGHT_PAGES * MIFARE_ULTRALIGHT_PAGE_SIZE) +#define MIFARE_ULTRALIGHT_MEM_SIZE (MIFARE_ULTRALIGHT_PAGES * MIFARE_ULTRALIGHT_PAGE_SIZE) +#define MIFARE_ULTRALIGHT_EV11_MEM_SIZE (MIFARE_ULTRALIGHT_EV11_PAGES * MIFARE_ULTRALIGHT_PAGE_SIZE) +#define MIFARE_ULTRALIGHT_EV12_MEM_SIZE (MIFARE_ULTRALIGHT_EV12_PAGES * MIFARE_ULTRALIGHT_PAGE_SIZE) void MifareUltralightAppInit(void); void MifareUltralightEV11AppInit(void); diff --git a/Firmware/Chameleon-Mini/Configuration.c b/Firmware/Chameleon-Mini/Configuration.c index 2bf5039..8beba51 100644 --- a/Firmware/Chameleon-Mini/Configuration.c +++ b/Firmware/Chameleon-Mini/Configuration.c @@ -17,6 +17,7 @@ static const MapEntryType PROGMEM ConfigurationMap[] = { #ifdef CONFIG_MF_ULTRALIGHT_SUPPORT { .Id = CONFIG_MF_ULTRALIGHT, .Text = "MF_ULTRALIGHT" }, { .Id = CONFIG_MF_ULTRALIGHT_EV1_80B, .Text = "MF_ULTRALIGHT_EV1_80B" }, + { .Id = CONFIG_MF_ULTRALIGHT_EV1_164B, .Text = "MF_ULTRALIGHT_EV1_164B" }, #endif #ifdef CONFIG_MF_CLASSIC_1K_SUPPORT { .Id = CONFIG_MF_CLASSIC_1K, .Text = "MF_CLASSIC_1K" }, @@ -98,7 +99,7 @@ static const PROGMEM ConfigurationType ConfigurationTable[] = { .ApplicationGetUidFunc = MifareUltralightGetUid, .ApplicationSetUidFunc = MifareUltralightSetUid, .UidSize = MIFARE_ULTRALIGHT_UID_SIZE, - .MemorySize = MIFARE_ULTRALIGHT_MEM_SIZE, + .MemorySize = MIFARE_ULTRALIGHT_EV11_MEM_SIZE, .ReadOnly = false }, [CONFIG_MF_ULTRALIGHT_EV1_164B] = { @@ -113,7 +114,7 @@ static const PROGMEM ConfigurationType ConfigurationTable[] = { .ApplicationGetUidFunc = MifareUltralightGetUid, .ApplicationSetUidFunc = MifareUltralightSetUid, .UidSize = MIFARE_ULTRALIGHT_UID_SIZE, - .MemorySize = MIFARE_ULTRALIGHT_MEM_SIZE, + .MemorySize = MIFARE_ULTRALIGHT_EV12_MEM_SIZE, .ReadOnly = false }, #endif From e5506a6b3251e37c953db6e3c09942105455a0aa Mon Sep 17 00:00:00 2001 From: dev_zzo Date: Fri, 17 Nov 2017 19:34:40 +0100 Subject: [PATCH 041/104] UL EV1: make use of public define --- .../Application/MifareUltralight.c | 25 ++++++++----------- 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/Firmware/Chameleon-Mini/Application/MifareUltralight.c b/Firmware/Chameleon-Mini/Application/MifareUltralight.c index c1bb6af..b381b93 100644 --- a/Firmware/Chameleon-Mini/Application/MifareUltralight.c +++ b/Firmware/Chameleon-Mini/Application/MifareUltralight.c @@ -9,8 +9,6 @@ #include "ISO14443-3A.h" #include "../Codec/ISO14443-2A.h" #include "../Memory.h" -#include "../LEDHook.h" -#include "../Terminal/Terminal.h" #define ATQA_VALUE 0x0044 @@ -71,9 +69,6 @@ #define CNT_SIZE 4 #define CNT_MAX_VALUE 0x00FFFFFF -#define BYTES_PER_PAGE 4 -#define PAGE_ADDRESS_MASK 0x0F - #define BYTES_PER_READ 16 #define PAGE_READ_MIN 0x00 @@ -129,7 +124,7 @@ void MifareUltralightAppInit(void) static void AppInitEV1Common(void) { - uint8_t ConfigAreaAddress = PageCount * BYTES_PER_PAGE - CONFIG_AREA_SIZE; + uint8_t ConfigAreaAddress = PageCount * MIFARE_ULTRALIGHT_PAGE_SIZE - CONFIG_AREA_SIZE; uint8_t Access; /* Set up the emulation flavor */ @@ -192,7 +187,7 @@ static void AuthCounterReset(void) static uint8_t AppWritePage(uint8_t PageAddress, uint8_t* const Buffer) { if (!ActiveConfiguration.ReadOnly) { - MemoryWriteBlock(Buffer, PageAddress * BYTES_PER_PAGE, BYTES_PER_PAGE); + MemoryWriteBlock(Buffer, PageAddress * MIFARE_ULTRALIGHT_PAGE_SIZE, MIFARE_ULTRALIGHT_PAGE_SIZE); } else { /* If the chameleon is in read only mode, it silently * ignores any attempt to write data. */ @@ -233,7 +228,7 @@ static uint16_t AppProcess(uint8_t* const Buffer, uint16_t ByteCount) } /* Read out, emulating the wraparound */ for (Offset = 0; Offset < BYTES_PER_READ; Offset += 4) { - MemoryReadBlock(&Buffer[Offset], PageAddress * BYTES_PER_PAGE, BYTES_PER_PAGE); + MemoryReadBlock(&Buffer[Offset], PageAddress * MIFARE_ULTRALIGHT_PAGE_SIZE, MIFARE_ULTRALIGHT_PAGE_SIZE); PageAddress++; if (PageAddress == PageLimit) { PageAddress = 0; @@ -330,14 +325,14 @@ static uint16_t AppProcess(uint8_t* const Buffer, uint16_t ByteCount) } } /* NOTE: With the current implementation, reading the password out is possible. */ - ByteCount = (EndPageAddress - StartPageAddress + 1) * BYTES_PER_PAGE; - MemoryReadBlock(Buffer, StartPageAddress * BYTES_PER_PAGE, ByteCount); + ByteCount = (EndPageAddress - StartPageAddress + 1) * MIFARE_ULTRALIGHT_PAGE_SIZE; + MemoryReadBlock(Buffer, StartPageAddress * MIFARE_ULTRALIGHT_PAGE_SIZE, ByteCount); ISO14443AAppendCRCA(Buffer, ByteCount); return (ByteCount + ISO14443A_CRCA_SIZE) * 8; } case CMD_PWD_AUTH: { - uint8_t ConfigAreaAddress = PageCount * BYTES_PER_PAGE - CONFIG_AREA_SIZE; + uint8_t ConfigAreaAddress = PageCount * MIFARE_ULTRALIGHT_PAGE_SIZE - CONFIG_AREA_SIZE; uint8_t Password[4]; /* Verify value and increment authentication attempt counter */ @@ -369,7 +364,7 @@ static uint16_t AppProcess(uint8_t* const Buffer, uint16_t ByteCount) return NAK_FRAME_SIZE; } /* Returned counter length is 3 bytes */ - MemoryReadBlock(Buffer, (PageCount + CounterId) * BYTES_PER_PAGE, 3); + MemoryReadBlock(Buffer, (PageCount + CounterId) * MIFARE_ULTRALIGHT_PAGE_SIZE, 3); ISO14443AAppendCRCA(Buffer, 3); return (3 + ISO14443A_CRCA_SIZE) * 8; } @@ -384,7 +379,7 @@ static uint16_t AppProcess(uint8_t* const Buffer, uint16_t ByteCount) return NAK_FRAME_SIZE; } /* Read the value out */ - MemoryReadBlock(&Counter, (PageCount + CounterId) * BYTES_PER_PAGE, BYTES_PER_PAGE); + MemoryReadBlock(&Counter, (PageCount + CounterId) * MIFARE_ULTRALIGHT_PAGE_SIZE, MIFARE_ULTRALIGHT_PAGE_SIZE); /* Add and check for overflow */ Counter += Addend; if (Counter > CNT_MAX_VALUE) { @@ -392,7 +387,7 @@ static uint16_t AppProcess(uint8_t* const Buffer, uint16_t ByteCount) return NAK_FRAME_SIZE; } /* Update memory */ - MemoryWriteBlock(&Counter, (PageCount + CounterId) * BYTES_PER_PAGE, BYTES_PER_PAGE); + MemoryWriteBlock(&Counter, (PageCount + CounterId) * MIFARE_ULTRALIGHT_PAGE_SIZE, MIFARE_ULTRALIGHT_PAGE_SIZE); Buffer[0] = ACK_VALUE; return ACK_FRAME_SIZE; } @@ -410,7 +405,7 @@ static uint16_t AppProcess(uint8_t* const Buffer, uint16_t ByteCount) return (1 + ISO14443A_CRCA_SIZE) * 8; case CMD_VCSL: { - uint8_t ConfigAreaAddress = PageCount * BYTES_PER_PAGE - CONFIG_AREA_SIZE; + uint8_t ConfigAreaAddress = PageCount * MIFARE_ULTRALIGHT_PAGE_SIZE - CONFIG_AREA_SIZE; /* Input is ignored completely */ /* Read out the value */ MemoryReadBlock(Buffer, ConfigAreaAddress + CONF_VCTID_OFFSET, 1); From d27013106283260d14d37bb4df2a209495d9bbe7 Mon Sep 17 00:00:00 2001 From: KaOs Date: Thu, 23 Nov 2017 14:09:15 +0000 Subject: [PATCH 042/104] RevE-light development version WARNING: The files in this commit are our current development version. The hardware and software is not functional yet - so do not use it. We will not answer any support inquiry regarding this version at the moment. --- README.md | 1 + RevE-light/EAGLE/RevE-light-board.pdf | Bin 0 -> 304545 bytes RevE-light/EAGLE/RevE-light-schematic.pdf | Bin 0 -> 35695 bytes RevE-light/EAGLE/RevE-light.brd | 2459 +++ RevE-light/EAGLE/RevE-light.sch | 12624 ++++++++++++++++ RevE-light/EAGLE/WARNING.txt | 1 + RevE-light/Firmware/.gitignore | 1 + RevE-light/Firmware/Chameleon-Mini/.gitignore | 1 + .../Firmware/Chameleon-Mini/AntennaLevel.h | 51 + .../Chameleon-Mini/Application/Application.h | 51 + .../Chameleon-Mini/Application/Crypto1.c | 323 + .../Chameleon-Mini/Application/Crypto1.h | 25 + .../Chameleon-Mini/Application/ISO14443-3A.c | 108 + .../Chameleon-Mini/Application/ISO14443-3A.h | 117 + .../Application/MifareClassic.c | 644 + .../Application/MifareClassic.h | 30 + .../Application/MifareUltralight.c | 288 + .../Application/MifareUltralight.h | 28 + RevE-light/Firmware/Chameleon-Mini/Battery.h | 36 + RevE-light/Firmware/Chameleon-Mini/Button.c | 217 + RevE-light/Firmware/Chameleon-Mini/Button.h | 46 + .../Firmware/Chameleon-Mini/Chameleon-Mini.c | 43 + .../Firmware/Chameleon-Mini/Chameleon-Mini.h | 25 + .../Firmware/Chameleon-Mini/Codec/Codec.c | 10 + .../Firmware/Chameleon-Mini/Codec/Codec.h | 78 + .../Chameleon-Mini/Codec/ISO14443-2A.c | 479 + .../Chameleon-Mini/Codec/ISO14443-2A.h | 24 + RevE-light/Firmware/Chameleon-Mini/Common.c | 64 + RevE-light/Firmware/Chameleon-Mini/Common.h | 48 + .../Firmware/Chameleon-Mini/Configuration.c | 178 + .../Firmware/Chameleon-Mini/Configuration.h | 69 + RevE-light/Firmware/Chameleon-Mini/LED.c | 163 + RevE-light/Firmware/Chameleon-Mini/LED.h | 69 + RevE-light/Firmware/Chameleon-Mini/LEDHook.h | 29 + .../Firmware/Chameleon-Mini/LUFAConfig.h | 78 + .../Firmware/Chameleon-Mini/LUFADescriptors.c | 260 + .../Firmware/Chameleon-Mini/LUFADescriptors.h | 89 + RevE-light/Firmware/Chameleon-Mini/Log.c | 161 + RevE-light/Firmware/Chameleon-Mini/Log.h | 66 + RevE-light/Firmware/Chameleon-Mini/Makefile | 185 + RevE-light/Firmware/Chameleon-Mini/Map.c | 72 + RevE-light/Firmware/Chameleon-Mini/Map.h | 30 + RevE-light/Firmware/Chameleon-Mini/Memory.c | 228 + RevE-light/Firmware/Chameleon-Mini/Memory.h | 33 + .../Firmware/Chameleon-Mini/MemoryAsm.S | 225 + .../Chameleon-Mini/ProgramViaBootloader.bat | 21 + RevE-light/Firmware/Chameleon-Mini/README.txt | 9 + RevE-light/Firmware/Chameleon-Mini/Random.c | 30 + RevE-light/Firmware/Chameleon-Mini/Random.h | 18 + RevE-light/Firmware/Chameleon-Mini/Settings.c | 101 + RevE-light/Firmware/Chameleon-Mini/Settings.h | 47 + RevE-light/Firmware/Chameleon-Mini/System.c | 119 + RevE-light/Firmware/Chameleon-Mini/System.h | 84 + .../Chameleon-Mini/Terminal/CommandLine.c | 412 + .../Chameleon-Mini/Terminal/CommandLine.h | 19 + .../Chameleon-Mini/Terminal/Commands.c | 418 + .../Chameleon-Mini/Terminal/Commands.h | 154 + .../Chameleon-Mini/Terminal/Terminal.c | 170 + .../Chameleon-Mini/Terminal/Terminal.h | 52 + .../Firmware/Chameleon-Mini/Terminal/XModem.c | 248 + .../Firmware/Chameleon-Mini/Terminal/XModem.h | 21 + RevE-light/Firmware/WARNING.txt | 1 + RevE-light/README.md | 14 + RevE-light/WARNING.txt | 1 + 64 files changed, 21696 insertions(+) create mode 100644 RevE-light/EAGLE/RevE-light-board.pdf create mode 100644 RevE-light/EAGLE/RevE-light-schematic.pdf create mode 100644 RevE-light/EAGLE/RevE-light.brd create mode 100644 RevE-light/EAGLE/RevE-light.sch create mode 100644 RevE-light/EAGLE/WARNING.txt create mode 100644 RevE-light/Firmware/.gitignore create mode 100644 RevE-light/Firmware/Chameleon-Mini/.gitignore create mode 100644 RevE-light/Firmware/Chameleon-Mini/AntennaLevel.h create mode 100644 RevE-light/Firmware/Chameleon-Mini/Application/Application.h create mode 100644 RevE-light/Firmware/Chameleon-Mini/Application/Crypto1.c create mode 100644 RevE-light/Firmware/Chameleon-Mini/Application/Crypto1.h create mode 100644 RevE-light/Firmware/Chameleon-Mini/Application/ISO14443-3A.c create mode 100644 RevE-light/Firmware/Chameleon-Mini/Application/ISO14443-3A.h create mode 100644 RevE-light/Firmware/Chameleon-Mini/Application/MifareClassic.c create mode 100644 RevE-light/Firmware/Chameleon-Mini/Application/MifareClassic.h create mode 100644 RevE-light/Firmware/Chameleon-Mini/Application/MifareUltralight.c create mode 100644 RevE-light/Firmware/Chameleon-Mini/Application/MifareUltralight.h create mode 100644 RevE-light/Firmware/Chameleon-Mini/Battery.h create mode 100644 RevE-light/Firmware/Chameleon-Mini/Button.c create mode 100644 RevE-light/Firmware/Chameleon-Mini/Button.h create mode 100644 RevE-light/Firmware/Chameleon-Mini/Chameleon-Mini.c create mode 100644 RevE-light/Firmware/Chameleon-Mini/Chameleon-Mini.h create mode 100644 RevE-light/Firmware/Chameleon-Mini/Codec/Codec.c create mode 100644 RevE-light/Firmware/Chameleon-Mini/Codec/Codec.h create mode 100644 RevE-light/Firmware/Chameleon-Mini/Codec/ISO14443-2A.c create mode 100644 RevE-light/Firmware/Chameleon-Mini/Codec/ISO14443-2A.h create mode 100644 RevE-light/Firmware/Chameleon-Mini/Common.c create mode 100644 RevE-light/Firmware/Chameleon-Mini/Common.h create mode 100644 RevE-light/Firmware/Chameleon-Mini/Configuration.c create mode 100644 RevE-light/Firmware/Chameleon-Mini/Configuration.h create mode 100644 RevE-light/Firmware/Chameleon-Mini/LED.c create mode 100644 RevE-light/Firmware/Chameleon-Mini/LED.h create mode 100644 RevE-light/Firmware/Chameleon-Mini/LEDHook.h create mode 100644 RevE-light/Firmware/Chameleon-Mini/LUFAConfig.h create mode 100644 RevE-light/Firmware/Chameleon-Mini/LUFADescriptors.c create mode 100644 RevE-light/Firmware/Chameleon-Mini/LUFADescriptors.h create mode 100644 RevE-light/Firmware/Chameleon-Mini/Log.c create mode 100644 RevE-light/Firmware/Chameleon-Mini/Log.h create mode 100644 RevE-light/Firmware/Chameleon-Mini/Makefile create mode 100644 RevE-light/Firmware/Chameleon-Mini/Map.c create mode 100644 RevE-light/Firmware/Chameleon-Mini/Map.h create mode 100644 RevE-light/Firmware/Chameleon-Mini/Memory.c create mode 100644 RevE-light/Firmware/Chameleon-Mini/Memory.h create mode 100644 RevE-light/Firmware/Chameleon-Mini/MemoryAsm.S create mode 100644 RevE-light/Firmware/Chameleon-Mini/ProgramViaBootloader.bat create mode 100644 RevE-light/Firmware/Chameleon-Mini/README.txt create mode 100644 RevE-light/Firmware/Chameleon-Mini/Random.c create mode 100644 RevE-light/Firmware/Chameleon-Mini/Random.h create mode 100644 RevE-light/Firmware/Chameleon-Mini/Settings.c create mode 100644 RevE-light/Firmware/Chameleon-Mini/Settings.h create mode 100644 RevE-light/Firmware/Chameleon-Mini/System.c create mode 100644 RevE-light/Firmware/Chameleon-Mini/System.h create mode 100644 RevE-light/Firmware/Chameleon-Mini/Terminal/CommandLine.c create mode 100644 RevE-light/Firmware/Chameleon-Mini/Terminal/CommandLine.h create mode 100644 RevE-light/Firmware/Chameleon-Mini/Terminal/Commands.c create mode 100644 RevE-light/Firmware/Chameleon-Mini/Terminal/Commands.h create mode 100644 RevE-light/Firmware/Chameleon-Mini/Terminal/Terminal.c create mode 100644 RevE-light/Firmware/Chameleon-Mini/Terminal/Terminal.h create mode 100644 RevE-light/Firmware/Chameleon-Mini/Terminal/XModem.c create mode 100644 RevE-light/Firmware/Chameleon-Mini/Terminal/XModem.h create mode 100644 RevE-light/Firmware/WARNING.txt create mode 100644 RevE-light/README.md create mode 100644 RevE-light/WARNING.txt diff --git a/README.md b/README.md index 8629481..581a0ac 100644 --- a/README.md +++ b/README.md @@ -34,3 +34,4 @@ The code repository contains * Firmware: The complete firmware including a modified Atmel DFU bootloader and LUFA * Software: Contains a python tool for an easy configuration (and more) of the ChameleonMini, Note that this is currently under construction * RevE: Contains the whole contents of the discontinued RevE repository. +* RevE-light: Contains our development files for the RevE-light - **WARNING:** currently not supported / not functional diff --git a/RevE-light/EAGLE/RevE-light-board.pdf b/RevE-light/EAGLE/RevE-light-board.pdf new file mode 100644 index 0000000000000000000000000000000000000000..e63799b97c384880229c8e2a666eee884c31cb50 GIT binary patch literal 304545 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 Xfb zH~v3h5b$#IbYoy-WMlw?|F;>O8JL-vK!}-{nT45|g_VPqm4$_si=CZ~gNKWUhntI= zo0m^WfR|5@kDFUSOh8arL{wCihhJPmOhiIRL{tQ12qQBK3o8pNCo3zb2roCU2+838 z0R}-11`Y-eW=16jCP7AKLB{__7~~lk7+D#?0PJ1{1_nkZW)@a9b`DN1?*B&^whAyX zF)}kVu`q*N&A`A|%gDscz#_;hq-f~KCLEZ^u2d*u)Hrb=hqBYggQ7tfKd2Zd6*X~k ziHS={N~x-;YiMejn3|beSXw!|xVpJ}czOkggocGjL`Eg2q^6~3WM&nYl$MoOR8}>& zw6?W(baqXeJZ0*%=`&`|TC{k{(q+q6tX#Ee^OmjKw(r=v>(JpNM~@vpaq`rq%U7;m zyME*5t%r{uKY9A>`HPpYK7RWA#!|&jK9_#=5%S-MF{qgnBp4BP0|DAiU|0C4C zB+!+i{{Ky`)VvgE%1q5m0Tni;D2GcxQ?i1M4HqPd8!DKBGgS~MP21Ul^h0!kYHbh; zq|(VLzd|8e!9c-4!B7Ew7zZpvx#c95q{6ZkG$WaqaOwLdmK0@z_2_|)70@$K02SD} z1~49}%do(n7{GD|d2pEcFa%ZEgD4C^o*2L|L~c_NABM>7jzN$PL7o`EFhp)p5g&%g zecVA1h9FN2U>G8|sE7_jl!F)sK^THOF>qmsa>4}hVK}(z6tE`-FbqM(F|2kVJ`4v} zonis_+K{^C^ zVgSPsR2-9@4hL7A0zM~W0K<@+I>ij-EQUdl4ndw6urM@3Ib?#^^3V+BFoppSLx?8^ zFbv75Q_R388Nf<_K@f%@PYhrff{J5UXb_(c2US1C4189`0EQtsb&47IECX1`4}x?E z^27j!A*eWpg$B{-5amFIK@f%@PYhfbqMS5Ad>9U@u`e^QCk8MKLB%oY>2Of>Q_R5U zWei{#l2xamoXIfoc^Q0Q#sG#Ps5mA)9S*8~ikTtE69X8ApyHV1Fhn_(VGyK4kS7K% z3{j4oAi7RLIgDZ8!w~F=0SrU3>J;!12C&pS2*MELi2)2lvg#D@83uzW3_+e4z%T?A z$FR^KJ}(chIt6@6#sG#Ps5mA$3{g&E7zBA4#+Kk#7)_QU{& zA*eWpg$D6qIJo*L;Da&-FbqM(G3jAAxW>M~CuIy^7?M?|fKM`jh5R7M%OFn-U>Jgm zV_0YqotIILV;BTs2=c_hg(1p06U2w%;2Qe^dtv~?kgPfde3$_&^$vVG1fP~MfMG~h zoq}>A!ypJlkS7K(3_-;)EJYEYmj_or1$q{!~ljNS#=8d9D_j=h9FN2U>JgmV_0YqpAH9CKLvbd#sG#PS#=8d z)B;$@4}!c5^27j!A*eWpg$B{-5PV(%OxGX?Ly#v1E(}r5lpsC~2UkA@?1=#kLr`%H zOHss!;outk0w0MnfMG~hodQ0m02cBCpO?)*o*2L|1Qo}y&>%h?4z7NR8ORd@7>1zY znB*`7Zw!a&8U*POJgmW75NLaMdXTyN})syak=~FdSTU3fL0^m<~b3G3jAAxayRF-A8W*-hxhY z7!Iy|^bk)BTsj1AK_@*72Unc}_QU{&Az5{b<>0DQ26i94nI&2Ml)<%+9^#1sOowFE zDVBq)P8ryJ^k$ZzCO)aI!Do*2M%NLHOPxc1ST8-P49aA64Ef=+V1 zY&fX;Ddu2L3}6_7ieu8la8UJA%m;QKy*YRbI_Y6Jxat(JCk8Mbl2xY|4yt~N`M~a@ zH#YP$K%N-DFeIy=GPw59 zn}aXd=qM{jOKR-H1q_R&K;F>vV+yak=)I%RO}qc;b8VgSPsR2-8Y zhJ&l0GO+vT&B0sHNe{!p)lUI?VgS=2S#`?b+DC704D!SPh9OyX%HY~ZZ*C0o#K46i zcndnodD&!e^;5u}7{D+jt4OFb|1aD30eJ=!L^Sb;)wxFhoIt^^t?Q{`Y8ju zkKWt_R2-8WhJ$M#J;W0Omkz;O&`A%&!BwY#Ju!e`NLHOPxc1STn}R$sfMG~honkt; z`Y8jukKWvrtU6_I?W2cyVgS=2S#`?b+DC703i8Cjg&}wgI>~j4+2E>Ez@8YuFa#CH zq=(_)8v7d9ee~wwE$F0&;oz!Mz@8YubVyd6Vm7$?DFeHY-rNjS9Fv?52iHD&h$jXv z9fG%@lOBeHt4;xXVgSRCtU6_I?V~pz*nRZo;4SE+r^CTjr+_^%fa#E|I>mf&)hPqJ zkKP=-1)bz{IJoxFLp(8X=@7gHo%ApqTy+ZA69X8AWYsAagR7r1u>0uE!CTNtPlto6 zP62yj0Mj8^b&AE{s#6AbAH6wQ`{>OF*FJiPCk8GZg14ZPoRzZM{iEnK6;D6wT~X+i2+N87G&+C zw-{Xe=pmjMz%V4IPO%tV`{*qOb|1Y3cndnIZ5xZhwT~X+i2+Q9`{*H_7`Su@-hxhg7!InjFAK0I1~3fCS@&fz zxbCC37}$OE7T_)Dq^H9{HTDJZ!~mv4vg(wFvMg&}wgI?3s9aNS350rtcI zh9Oz~l)<%+-eO?)(OZDGpp%{s2i1HE#1jLU4$11L46c3j76ZGF-h!-s^cI6_A3ekq z1D6iLThK|)%Y$nly#?440~m&6)hWh#1jLT4#8W{Ne{z8weHIT?1=#kL$d0W!L^UxVqo{tTadMn z-ePd=qlb860Mj8^b&AR08v7d9ee@P&?W4CCT>I!Do*1}v2;PEDa-A}`?xVK=dtv~? zkgPgoaP6bF7}$OE7T_)Dq^HBd)lUI?VgS=2S#`?b+DC5zJ`7+0!;q}`l)<%+-eO?) z(OZDGpp%@J2iHD&h$jXv9fG%@lOBeHYwQc`i2)2lvgYUq*M0OB1G|sj0=xyC^mI75 z`YB*f3}8AWt4K5Brwp!r^cDlVkKO{j1)cPCIJoK*uqOsE9g`M{h~iK6=Z+ zwT~X+i2+Q95!~_^p=BbAH5~m69X8A zWYsB#gKCc6a$xt-TY|Tslb)9c)z}xr69bqI$*NNZ*M0Ps;KKk0Fbv6=qqiJf`{*qP zb|1YZcndnod3kW{qlb86;L;&@3p(jxIJoK*uqOsE49QvdWjVO+qqhVf1~7nONLHOP zxc1Rof;};SVMtb;GPw59TY?V*7`QM5Z$T%yJRDs6=q^^!+ z@D_B^)8XLir+_^%fa#E|I%RO}qqiK`ee{-O?W4CGT>I!Do*1}v2;PEDa$X)>_t9H| zJu!e`NLHOPxc1Ro4(vX9OS1OSTMn*$^bk)BU^*nLP8nSL=q(3!AH5}6`{*qP*FJiP zCk8GZg14ZPT&E1Kee{-KPYhrfl2xY+u6^{D1G|sj61)YS^mI75`YB*f3}8AWt42PrEqlb86;L;&k`{*qP*FJhnuqOsE49Tif%m&wd%E0cUw*+rN zCp|9@t~v$mi2+Q9WYsBy>pptRf!#-M3EqNEaylGb`{*H_7`Su@-hxhg7!ImEkCtFh z3}6_NRi_NDee{+CyN})yyak=~bU3)`6tE`-FddRrrwp!r^p*p=kKU53ee{-tYaczt z69bnH!CTNt&dY;qAH5~m69X8AWYsByYahMk!0w~B1aCnnJsl3NItA>B0ZfNv)hUB( zAHC(k?xVLPYahMk;MzwI@x;KTL+}=KlJoN5+DC5*_QU{&Az5|G;MzxTIk5ZaEy>zP zZ#lU3(L+2jfa#E|I%RO}qqiK`ee{-O?V~p|7+f3aA-))}glK3$)=qjugTb|x9_o#O z3`TM)7DI!h3 znHtHfVg}a+d_#kQ-GOgtK-Ly~LxaJ!2OsK<0ZfhH4eX?6>cO=Q-_QW;je!hC@~W7@ zwG-daU|_f68yb+c7vIoeaBaqidSf6{BY9QK;M$LGXfUuF@(m5h+L3Q)Fu1nlL%lJ8 zsS&)No%AYZaP7)BGyr>JAcK*-DrRtP%r`U`*q!-?2H;)oWTeJH){6mqV<1x_c~#8d z+MaJ{FtGdc4GqZJpl@g}xOV76y)l5P5xl*f^h`atHt8E0fW0x0!AM>eGr0EY8yXDk zMtwsA@FsUMQsW@2V!+-Q$ka$)6*IVY>l+#j>~?)a1G4t(8yXC*4f{}U3}9*m?{+6W zQ=1R6xfrlF1~M4Qt6~P%wtYi`f!()nXaL^xPDW}RWK|5<8v~gd$*W=p*XDgggMr<> zZ)iZ)_I*Qx!L@%M>Wu+Rjo{7iq-W~EwT0i%0PKx{3`X**n8CG+-_T%SxA7YqfVaSt zks1eC6$AFhK&D3Ws+hsGm*3D}U^nv{8j!V{-_T%iZRdx2V*pblcrQHZnR;;T=r=R~ zdt)Gjk-REqaBb>0G#J=j{e}i)ZRJ6k)Ck@dPjWBDaFFfpHw1fQAcK*-DrS)F?l&CZ z-Tj8-?d~@mWV`zz-WbT#NM02)$aeP|4)E@NL-Ka_8xFGF{Sa>qU}^+!izmH`8DzWr z4Z+?R$Y4aSV%#!wN>Ymy^xbk2OHy4@lk-zjx%7Qf^U_N)6b#KwjLf*~?6`_cic%AE zxhm$ot-am%)@st7-~YNk=Oj#5owTdAk&&6L<|otR1L6{^7;TIj>hE8Q5;1lPd3NQN zws*~otObp)Uc@e3A>jFO(wRT{`~SUP|1SB(uhcjHSJnSm|Nmk5|LgU4{{616`+C>? z`;YVS|6hKTz8nAlefW$+jBOWczdZgH{Ok4S@EPs>Q?~sV6o}{Szv~{e?Y~XIgNp@E ze%{~z@AmrGpZoux|Nl4s|JV9IpY8vC{l0(7{NHx}zUtTi7cSP5ciwS9%_7_T^l_6M zskX^%yzcY<|9xHmZ+Cp%wtL!lH<{Yz^j@ym(=PG5e_{Nz%9~q``a0jYmt*+hRl)Ts zYohz%iN_CKE4!o{-M)P7=RbnqzZ=ZmqI=nW#y9mjTNwSM8r%=>&CON2yQ#G1)-C?y z`b#RazuZoKo_SsDmoxJN?Z<~dK0ak5#b+b8&1`bsO{=Th`s5Sq!|z5$AN0R9EqRSq z=7oX>AGduCdpT`waq8`Kgjp%uMSy^-yeXGe0sqa1I!9Lp@v?Ky9=qYLl2^IE)9 z?t5(gDPzZH_0=;=PG2k7X4>;IdHI~@?b{-rooia(;{W&fp8bb{`vVJ~eBAmq?d7z! z8#k3o*&X{k{jull2WxVxTQA$Kf9)@2B2zghcW?Nv)YrvRMK681c=Wjbk<@=Pp7$2t z2ybwX+<7!t=KPo2U3oM3a&PC?9?4y5ZXZ^4d%yqX$F|G$WG}x6efT|c4=50R#iYJn zeb>V7p8u<3{fY4c?`<`gd}_Gz^;2a_Xz{CU$KM%EXP;;H?RnY9^;f3bXNUf%%>f7S znP}aY75tiKgEUQ1GO1 z+t;|4ZEFqJZ<_Y+hnm~Zpm)2oU%oJGSl`nB@v)&~<)cH3AD(z@crZ)t?k3aqo1VQ? zu*%e4{a~`$K~Lrn89TPGJ-Z}&+q2MXGW{#rvL}ZcWHZk(<>+tQefyTzuGH)`IkM^z zs}{6zPSa}e7c}MWZ&U8yy!N}-_8i}<3J$k69A98|AhP*G#*W=<*Di_P#&=b{d+Wg; zez#cEc@Hdpcn_SGW`#!#7cG;WdNUb3yBV&dteHy}QZO zo#$AAt#{|+uR5#+ml$lM-sNT+znr$#GRfd%gYg;n#rL=He#&Bv=ag@jaaRI`csn?f z&TU;QXr>z|{mx#YZ@pNhiOsKf+d;{6SID+yLbYdZvDjyF7x_1uXjpu*xLvir&Po{$?;azjJ*rkSj+peGS%;HDqWMSYi*{U%bK3M zNx9_G0=TnYhlZKQo)2QN&wRZ;U0JHn<{Y@>E46#i*}@vXvqqTld24Aqv$)Oz(K!`0 z-&yje<=xyhr+kCoty8OQGnu(OkMQO zeQ=uk{rTkq&uGaAzgr0h9CY^(kXV@f-(`uai@?+uA0y zRoHqT6cBiH@xzZ?;WeOo!f)$ZffFuL3JjcuJP}TEyybldvp{KMUCz-B)|VI_7PUOi zm40%u;C{zJkYiqlim`Q0YWrC=t?A%`6N?|7`?&V)66tN{DyNzrO`dSi{E*7QFBYfs zBI{4woG+T1KV4|{nN3sgJ-lCZ^nEfochzpaYIJ@FlT5#hYU09qD$(z6?>}Gv`qz)| zKMy*-d$^u!|L?HVphWvwEBjqvxb>Iwdu}bP&S9P!W7V*}y4*g^*!6WUufo^TxP#_k`3!yJ~Ksu_1Z;( zOUS8fznpSp-dl8Jd4KBpc97mXJGX+ean%zEo%?pz%+9(e314fo_$Kk>VnI429cV>o z-eKo8dB^N$%T{4>=lA5RAggNl#Jn=6os7TJ@hME=f%Ze@rMBXr3g&*o!r4osx5)`M zKm9OgYpYRna&E(9wg(pr@}p;an&-s!bsQ|=u*=lmxx?=k3sMPqYx<9CHl-Gs+AAOV zqew_;MK>?f)ws22k>laR-)~l}FFAcJf|tqhrKjUd&%l?4QgZw91$Kn*O3hwn7wIVZ zz1irUduq+~4zWCuoEhGiV2{s3%sk{2rhMDCt#!I%R z3--6UKmU>h3MM~Q0ps^?=WUt#WuiL7^&ei$<5}NZa{8Kbl0cf^#Lx22rrz_Eey}2O z-@M+K&(^s-phA3C$Tq&G6B@U2p1ak?y8Tk4`(a44Mv zQ#->xA-n#dPdt?-GL<&qMuh45O^aGeJbGX5b%|Q}nD<9l#gm|npySa8JC85j6|D_w zgScTK zylvCx>m=RA@8ycPzK8om+DH+TysdDZ=bGwzRBK-Ey;| zLPl}E`G<@hpX zK29Hj`8$q_$nn0fT`y!lIq&8yt?1u!M#T+m2P37QPIm-JOztw7oOiQo&8AaplzVT_ zs$BeXx6QlfwlN374=w*^@j9{-)XF~!uEma@x|aCl{L6)j5l~g2{(jH*VaMa;hra)QbaMa8i>`|gw8lxiwy*eo_mb1S zPe0GkzJ5NsVjpWVPiN@b7bfL1K5l=rgmIsd-Qf_~N|Qam*U4M}Rf%u4qmO^I2u#jx z+PsaEsdxg+fzjKpW#7-UdRDWiL1d2jgxV%0uLGb4?w)U;7Jv4doVV!}Pgf+ih4K}u&)InBRt%FXW4xe$EdNpaR`_FsvO6Dr+m^d{rzrEYPex)XXz$mAVI0SMdAnITbbG!XU@4y|(XzWJ>OjN|%~< ziPGSz0+e2V$?IOav`6O7EhXJ^_T5`Py|9m6vhloq_m=lDOP=}|8u{OAR(_=SdgG;u zam+tX{a`Bg0wtf1KOUJ*&bu*d*Qsk;JRD531pX}H?cTYV4epOy*SAgceKvVp)8=g^ zwQtnFpDwwEXhJ!6t~_~IFMBda{IxcVEC+Zo7je^zStMftBUhnJ2dFMT4)$?B*S$$E zw!cq#$1xRD1lQ+1u@84RvH0QK*ITxO6Mj>9r*vxW%AB7Y%wVlsQ1L7$x@UKhd;3;T zsqAZPux9zxlGE2#ZZa)#-@u$LJZEdGpeb{I8#A=KFn6_M!&cA!L`Y#?kPmJ=$FA}h z%WVEQcZ(vdXjHwsq4b4U+u=Qr&sc4q2fL-lKX;%yJL+qoZqX1^(V?&lk`6@NnND)O@XpVwR1 z_4`g(=dfjM?1lTE^ttc9?^gf6%>8s+MPp%f^%b6)uLX`@f8OR3|Cf005O;5FTkF03 zcW)e@e~iy;|D_wI^XsK{`zPACzA-xX`u%Afwon#{m@|Man`9SjdH7Cb8KEXh*6yQy?#&Rk}e?Tuy!!;dMx znp1K|o$#{9 zk7s2-IpqG;^oY5_wQy~+kKk+HhS^#JCPrz7V@ljlH+BUTkg03 z)CyR+skB32E*q%)N^WPK4o)1PPS5FUR;w>@-2C!Q#HDf-;}5SNF3&X&Eq=H-U+Dm- z89Dt_*v#b{%??K1o|ABp7ZeEKF2;t^Q>%3{)pXka>ByPzHL31eB1u;*TviXG`HQAA@U>o-Q*Q^^|$qY*q@26cw4i1 z$`#JzOaZxXJ}%$bd{%#6e%!A=mv7|fyjdI*`|ebKREB;2-#GXzTx$2T&;H5ZGv8c)`?W(|s$ci>m9rayRes)Ni053M;}0%hi=N%}+Lih` z=%&=ibqX0B72yIOt~}hi`$I-W$-ZYde0C+i*0H`@Ilbom?AR`M#~z^vBD;@7J_P5z z%;md5F}82h*5+GmD;6Gp^SW z=0Z)red@2OPCmA9co);@=TkD(@x$Bx_6@NQL0Rsk|7}oU)NCt#;Wu+$cU$nX=gjY! z)lP}Y@xI?PIb{2!yqi@=ggu*HzumaBCq?FwVKZ}$>Yn)@jkQ53PVb}3+9lH4^kP%9 z7YG<#6wqk#`H<_Wv|g;j#HPZ1|5ngoM0TS8QwJ*^N3&(yLT9K19?<&OkUW9+Q-;N- z9cNggJh$iYKA*{u**$69ObbDz;Fz^~%h@R%YVq?@LG|Vh*_&-(zZORFZ2_6875$j0 z@?_v)rpl9y{t?UA5e=)?0pD0YS=i+~F0ym3&|C9ap6Q2I#T~ib-X4{VwV+6_c+0tE zV%|-wFzbjVyxXe-q#rC{tT4HA8&ZvgPK#mSzulrFd+V2x2lGCoeZK4ECqHrLX9nfi z=}*DMOmS-VedlRm7ZfbAZ-1}(9xv-B6|(2Mufc6dgRwQ}w&BI8cO|@zChgk9{i8)) z1T=uOy?3_f_1xarxYVyNB}^ltUo6#8$wDb*;-@kH{E$5%qv`p(sCzLCHK{dKA>tgz z^`ahL{BZ8;*J_5H+MR7H zV(2OZ8m?6C|9tGh-b=dC!KvEcRIW7GHhg%QEZ@EiG|pMe4(=ScX9*nGoAAbPN4vMJ z&Y?=FZxXEK_m1U(dayRPcg@$aStQJq%{*u8Lr&Jr9mhJ4U%v+GlRc|S2>#jHB7Ww( zj@xlLy*M8AJ$LeBX1X7)eSd5_XxKG;o7xHURw-0-r{(y$Zl~SKFc6`499#*|SH+N}p;suB0JC{hZD_tq*t(MOKnN~F?)%W;z z{St1zfTEi_q6->?_Q)3~2+8rj7kj>OE2z3oo_cj^kIj-?$QplwFI0KzId#>qIqIT?XWF}Lq~z`-Z@A^LJ?CtCBy-B7 zBf$?h=JYb}6FN81;?UxUe;>st?*Tb==O)u>PQTWG;_u}@rVkkwAHaiLr?1sayQ&`) zDqkI>@w&^ymb37UA!vA@*}?c_+gio>sim7kuDa*eMha{;JCdouB**(*4&3%Q`+d{4 z^rwN!yv#fS)u|hvCrUoher%krXCr0zqYqpUwVk>qn8&f0?O^0>iG&(=Io|g%%51ki zx99Y3UCX)d(ZV*C@Q(t=g(^-get7b`SR$xKTdAU=cik!A_P4jzX40N0-H-NLVQ)NF zFjfmax{(ZOfU!4%TI$D7g-LyPWbXalao(m{(?;supOc`0+ET0ARwcq`R=R>l=DAbe zyUOv-ubIva8mc|FbuA;`?Lg;-!(~U|Vm6uYg2z9~ zR+`-T2_9|8){$;@&(WD$BKQ08URAA^Jr>^#o?I+=o^=J}D7mk-k3Y)!-BS6=oXrf* zLe}6m!0Q6N*)^B8O*v2rY9`JoSXbLy4IWs29dUD(lFDQz-lomlTBd4GbU(Z}Uv3R3 zM3!d>B;;O7j(`_1pb@I)uO=V8l~R+Q+pw4oJ}ffzjkx`pXL50zY|BQkW;W8I_= zz^~s0jh)A8MZY{Jk+Hx!x#RI&aD-&MNxQ@w-M)^8Y3I$)b2nyAD>mL^%w}>vx-idZh1Ddt+A?I$WP~+_O*iXT zWuV0UF-QA5s4(O#*j2-CBlXUf1Jqfa^*)t1Fi&mTp4Q#lHmzf*QMEbZzO46oj5Mfn ziFpPdUErI#Hb{RaXjJByN@B^0#Sc$B&UpEv@ie?9t;MbIDdjKk(etwYLv!+P^Z@DpPpQ*4+J3Lhlt3 zV>hu{(aJ~KC$ilzTE477^WulAS`}Y-bFpe3-rR}$=Yd6}biGxcU;WKd)VB<*9+uCkjoAm4965e1Z1v~F`5sxmy zXT>&d6J2LHnQh0s9*bOl#{RbId4FuC(RE(|m<>g?G) z`~LY2yb7w(&*N0h&OZS4(U~+(EPl8*d(lNuWA*r{Yj!q8lUoWvV?3`DwdYot$W(wj zmb+447wUU&D|Kq9GQMqY_@Dnk__6dWJT_8tHQrCbk)q6&?743KG=`kcQknnoJmMQH$(-XO)c=*~%ZPVCK`fq;oSW3U2_tnGbAm=_I zyR#cEF@uH{m(SA6T@t-bE3$kQdsrOva9OHP`mpS#FfafnF+)LeLZ6x24Fn-#rr zm3r2JBh?+w1{xnTb`(2a0(ttm)qIELF{j?^=|5ersx|$+>7L*FYM4M%8+%XGUDVW6 z*>ze(Xboef$)4Z)-iUAaGS8X2`&8H~&jpQDsHOJrTVXQa1DX4NcRc>l2QRcu=j7f^ ze*Jm%t*wqMXBpNDd|278^%dNB&VGINl5TWz>T8pvSH>3%l3p1fJbyBf9~7dHF~V8r zH(e@`xq2+M?No7)sg)k5*F4V~XV^}rF8zD|d1&z~r8N@zKWoL-gUZ@x9gdN2m+>9@ z`#0dtiU$`DUQ#{~YIBBr^Z(y}cgFtF{(52Zx}S3wMS%iBb~TsF?@s4V{^lavru8kC z6>Y#xxp0MDpuyT${nhgoW(k5uKAkc})p@yK^DSHVO?O={lXv@qHhT^KdTnNr53u>i zt^1~L-8(6$SIXsNv*6Lx z<1F9_-94vfEq{Ew{8AX#tU2g|q0fr^8@HZ4eDO^r%Jg4y>T8R`L9C`{HiR(NGqcR_YP` zW|vTP!<>%IY!5FMlt)KqK;(>BfT zk3AbCfYbq~x^jA!KGL*fJnFP#1@>vjuc_Azbpj41PYBok;q^n}$rcIFKy-{yFSrc8 zzRm5%7MEN>@2^bg^Nwme^qQoEVm>S6O1$ck60!MtuOw6b?uM=Jv!WNLOi|7iWST5+ z+-UNN#SbrTi1T9nxPu|C zjZAM-ce@|F3tC^X!L$VLyyH)`d0S43S!Xt^En$TY+P~82-g?q};?{$W0@)Lq?&OKV+c%k=$aA@+;4#JY3wXBs{SR;lM(+D2ufMrb5%0?671#?RdU%L^y?U9*4=7I1&i=6KQ{cYCU!TrPEx59RHu}i(sn)hIbWv7kQ zySnZTpr%d0&93M-OB9ptIv)VnZg;+yEC6*aB5qqHZw$F$ki0SE;Kv8-pqSEG4U!1C zDYf#CO2&dulN$~js(#GaQU3G{sD0Re>zd?im8Ley*D73n?XN)Xqe3QdluunNA>}0X z=&Mfaq%X?-h%~Y)_vnD)O%Hfuk2H1d0Lxx zv-kDF9j{dPgPNq#+rFi)Ub@6c`^)+8d8}`L^GtAG788B%f9=2M`MwWtxX%7)U3l{S zwyT#wC6dOrXOcJLE-bk+`(|g6k;H-ULz$jT;3{$3wuyN+rL?1y*(IMkIKSC(%<IE7hPKLXl}mI9#Ab89QvlRTD975?}s0A`T`_(KG1%+r$G!<*E~-;4_dh)s}=on zYBO8a(++?6-#biu)p@m`6U4ITTfam~hs;&ah4u&_Q)DYQO+8k7!QrvpgDc6P8r?n; zR1ckdp0JR2Ql!@%_sP#gm_JPY(0FMccYmAueNJ%m#{Edb%sCskDI8to0dFINTc*lM z0YxV^ZF~4BRPmfti~Hfbxu8W6TlKecyq4RX9jzBH`e;q!u6K#k|M-C?ifB9g=&2|; ztw@9I$EhDI>LTEB>bEPXoT{9vnknyp%j?&P$!4$-W>ELxoT|X)GfE!Oo@G^+*pLU< zmu@Q6$e+BGH{u}kM@hf>iLfT4^tQfO(`}o~Bs(IcA0SOf{XTU~?)BM*HaYLFOmZvQ zIs4nbpIcf4YSWWA?YQ~Ky+v)TN%@TZo$vLh?A!(~9%WZ;oVxX(gA3|RWq4%uyQYsH z-`@5<>A`b&!;}ctgW-oZ&QSr4EmeTV6F{?fZyPsV{?xPJ;G*E5Pdpz)Ki>E*P^fGp zB@ER{N&>er_Tc`h+o_(?6nA4%9oU36C`QhBPuk6OYF07+B>YZkg+R`uxVmA{}+1k~{R#Tn$S02)HD2DdHw zj$X4_>hZWjW})p?SzEUcQ$KLNzsm&bRZU(CYWVj}U3<7=e(;X{4V*p!#%T{65RJxC zt?ui0jN3XacWqPk-1(u?a+g5-2T)vDFBi`SEjwJ7^HxmeyKD1hSVXz{}%j}yT?{GV~x0{SE)ZqM*K zlmY61Atu=$+8p#c%`@?lku>9+bWK?~k%u`?q}1i^b6x{A^N*jpmf0W^yTG^L(zIuC z-#Wl!;GntH=xxt7>&&!zQSr^i<_QtJ!Q<2~D3VmF=xs zshRBzYl(t}x&x<1tWwx$rg`M}E!gloxNR7+txfJ#bu(xwj6|Y1Z>7neay{RBARQ6B zOly3rco1XiAiML`-ggF2 zx(k+DV|Gb58Z=O_SMnO0ZNnDC5O6* zz#TXv4)FMSc;uv&70-2|-~9Gn@~53)pOV~ex!F$op| zP)+L`t{WH3KY4%d(sCXhPW%3j^T+q9#=Trw@!mQ=SMBbmP@|pl^Q|wj{T4zU+FJOA zQ)c!A&6<`gw#Bk8E8O&doceLi_*suwmQy1d}8j4l`&f3dmdU zpW-iglS6Uhe1O#!n{u|et2LF9>@OLA<;95 zVb^4t*g}n!ri}5D{sof-D^2zk`|4iZTSf8 z!>PH<`-JRRPIPnFNX?sb*#tB;RCVRFmhRj%&FapMKXn;pjuvO!I@}L87k``x3atLB z$ReSOx%TQ)Yi_c+GshTKz-Is9>g`{Cwl-nXDaq4-;ONL1A=HUW<- z=2K-h#j^k8Z~u4V_FOBUv%7g;9bd9Rdc&LZqWjN-)y#9RL7cqGjN3adsw7n*aLSD*5C>y5`#rFVmRNHx<$ zCoj3`xj|f~b0M?ZWA~aPmqC+4PYOHpL9OPm5vfy4S>y9&J#Es6&10IQZ^+r-w)_6+ zEYOT~hlEaWuYu#uFMAoh?ww|=Nv&Zydt&j!eWLeogW48KY|Td+r=I@epZk-au|~B< z>gSdnM|w3aKJB=1%j?(WYyT2nuaZCYpH=evx!He;{r3D=``q;EEz@&P zefo3aU4DJG@aJG3yY}jwKD+jJe!)7Ou6c9re*C@h zx5wSaWsjfd-jF%wbKyMe-1&yr`(2%W%-Agd*S#yX^Mj$CYF=^ky9Z}EPkyhrmQ&sK z&GE?(%c=Ko{cEdu;rsb`#fN1zPm}%YD+<>B{QCE&^p3if^E;dkZ-1ToY}3}w${t&_ zpUT{sefs?+AFsoa^?#?8O`3gBSeJL{mbtvVJ4?UTPd&DI@lVsz`l;78FN_YBoTu+N z>pb7|ZJX46{aE#SU8OFtd1p@)+j4m2isoY2IV`{16O{VP8{ znSU?SX7qsAliRcj`L+6g z@uz--ZunB;xc{{O-OozLnNQhImH+pvI(xyTY5ny#_xOY17uhT9BC-wp zug&$|I&0zV{>%&hDD%xzkbA{N+Dhp1Zrf^tpWjRK4S;o5AI5ceYwDk6Se*v7GG>|L$U~h2QM& z{;b~pS>EFB<+;1xzd6_M{`gdq4fF+WGoV zO~?a_yo+ZJ|DMhMv~v2MKYNzi`}@bt+g{6|xJTe)Am5sp`R0clXa9Kfdrt)0)VJaf zm<%4xZLzhojU$As{hp< zI$b~i^N*s^X`3D#w8}fR?ECHKSJU42{M_%rJ}vn7=FK9ScYbW%^BNN7#nV28F0Y?f z9$S7q?`%xpp6@0u6L^F^{QLXVv2xxKHOBYqk0+RXYJI1(_?(^EGmg*m-~Bn-_Qk9G zAM^71UB%_@<$T5EU*=lyRTKsXJ?;x!#C*T*o~pim{_M58a=*oWuDf*quA{}|^-Sh0}^U7`0v*W%6-&(tV{uOz>-zT-_ODDa!XCrfhG12JE zn*Aw9IE5yO_GN6mFCa1P)cSU1k(|G#G7nR3PY7;0%Jt*Q>HT-TPb60QRJ3(Zl$&t* zGPBK-~L`XYyQ{I`*uCiTmC_H=F95U3+1Xx^Oh_<@BLoi z{>|ivm##dOpY|egp|-%;!`xc7{y!kOC2HAo)@hX$`pFl6^8cHBwl{okUApNP{x4$p z>{dsgIw;uMrV!WOw&&xX$~`+4{Pf)6{^Io2`{LFoDj6y|CP^Lo{9ZWj-*1=p!=KwW z-MXEh)jhvKzo7cX+vmBfTWc1aKF@sTYvsx%Q@Dg3rqh(wVDTeJ4S%M%Bha zh8@(;-f>4iU-j?mW6!$nJ<9~=zbg8|@<99Xj4xc3CNdRsdUBQj{(a!HQqwCn-c7@e zii=%!O!xTR7b*7d*Z0^G{P3@e zP00KA-j^d*{Lx)KY5wEM>wYnxtN(DCyUo7f*Yh7wyz?Lay&N#(!MO?RW3yV+PHx+? zYtFuFd(LyUv(CRiU*TlvZ0&pgPv8H$#iHr8>PW2^L#v+GEd2xFhnS~{Fo1@UmhYOI zyX5~*pYnHp_dkj-=g2VLWA_aI`0ewtpq;E0_MH6>TYER|eV7yVnK6Ki+s#c+H8-#! z-}I4Tf)?LH(7?NA^F^;;tB-xVVd3D)uiyQ_@!3a6@Ab{zOZVST+`Oc1@u&ICSC+iE ze}C1!s<``yJ+*AszmK=rS!*Km;D{G%@)7O}M*A4$s&sZa$HhF_TRgEf?b7~~oL8zH z@>d_8b}GG-;lc{q+qCiQlK($bmh+#Fn7H%}+gaOVhdBCN6>R6L?>XNjay+r`^=G}x zpOwY$1-%39{Xc(R`uy!|he-{_XJ>2;ce=1`!{= zn=4G1?)=~Nxc9=xzn^4jg|#wHH`#QAp+>c)r(hB9Y-2fXcJx$iHtOYwJ? zsDq+kc3(^gBWPz;j`7RL%%(Dy!i3zoZn7I ziK;UW8qf1V0}nSVL2GaewSL}n`?dO5(PIJ8ADcMjcYLUMc=5x7IPd+vU$$3!OgLgF zET_Znxzp;aTzFIebH?`y2e&Lqo{)Kcx|CnM9gF8C4*UOYi%TXy(0)8Yr?0|f&*xl= zvrFnvM$~97$(uIa;}wIuC}`06nAzlag&$^F{}ZUz*w0=eVZ&eL%@y|GuS!fwO`+`0 zDTnNw58PGqyu$zEl*OOiBa0ti+&VAD`sI45>O7ftuA0ae_Z0^_Y^3h}o;Ec{?eE(M ztNC8F9qX@rEs}WZxf%OD&713&wjWJQXFqS*I{m!8>+$R7l|R?y{Ev;~E?+9d_dxq` zvkHT%9B=(6t47vYePHtA4+_kA?Lv=4-WC*&Ja9+UfM+ zNZF>F*J2Sl^=F)58QRSNq#8`~14z^LE|U-2NRQ>=vtEh?L&_ zE_vJQ*KccG&q)og9VgzN`pesRx+X6_ABP!V%lfKx80=E{qW-VqOEC{;!VxIU4NBSzgF*9wy4&<`q`iy zy1Tt)lT+`Hvt5%`tDe*Al>Pj9g7|EOR~1iZ|KZSm*=L%uNYyxx$c%E&R-_(-`f%k1>IkTNGwmtX;A{>&*?vY03eL7OSNd|H^#KsCYhm!OEFm zruX_5cuRz;y!qeIzbQ)cGDii*KO4X3rNcnE55Vcd0(ZiUs-%k1Q@J_qSQs@0sOUKBx7~$vsc3IK|rM%3Rh@ zHoV38$$*Q`>RPz;xeE_v9SbEtOfBSyRFdPJKj*sQ+9msQbgtGhixzBgvWSURljHr) z%b2hJ_v%8vvw$h%rD#16`NI#9ogg`xUO;Ml$n!s z-W}>rT^n%RJ9U|#<>Ji!SvuzXGyiuK%!yX&Z&QDMW&heG^(Su_o=Ta0W$Nuc>ZJ{f zxj^fwl4pDVpS4lQ?BpvIRg2Zkb3#C?xTSA{st~m`j=WkzSN5pYH0jHO_SslSSFisP z-p&-J{)SxScpK^Q%KMq~tgk$tuNGFFt7@2@X1n0= z(@6hGhZ;--mKSY0&usX};(-z|DAttSCf%v2KPo3}!P>bbEc8*5f7fsIk56>|{o&Bz>o)oS zrTz)aRQ&t+I==32fBgS{tA9)Fs+0VE|GE6X=k-TBb|GZ!SHNN&m z-T(RVi4prAZHU}tc>eEolf16G??WF3|KYlMD>XRf73ce9=DzXC|L#s)^ZZkmZKiqn z`lsi;tNwq?-+#!Wwlwo`%(nf!@prGaRi2vj_|w)L!%OZ*_M6&Gk>79X&&@us{?D)Y z|4;LGDgXaI-CEB0ukG=&_|xA4ru{3w)uL)~?1$;`x6cJX=C|e_yz>2a|6y+Nd18Gw zBFF7ge?|9+YUSQFnYJwBHA8q9gFkn=^*6)I_VQJ`*1!CE>c`x+h+ijGeK4s%`seWx ziC4!yYCoCqYC?JFjvF7}1(;9SXttAKR%xRPS7srg6qfPG_t6MKT!u?^L)cUeLHgon%$+BE{_7j< zbAIjrlY9F4x;>lQY}Vei+cWKH_KmnBpNsZv=Bs(}?2_ev&Z^QNu07h15{~bFf8y8Q z3ID&%`1dYXL%y@AUU}W&@QSD%j~4Pg^`BXHaig>O&TEW$YoevDZT;|4@A$tBFYEWW z>pVXF$)Nu0&u+`Ve6=SY7H9zV)y_TU-@b?K zQIJddd6)NIwp;)1dCp$r_3!jUY^Rrp{++hA{8{YP9ZTkE_atlaCEN)vWPZHl zh~!Ow<(~aN_P8be&v|)Qls(V-UC-xZKZJiv$u|jqiHTc$T;_euz4?;y+vWTJZ8rPk zb1i%8`sx36z5d#|!uoH(f8o9z3-d1idHt(#WBS(64R2Lt;_UyFs@yKwe|-Ix|J(P! z^8ea?|NpPo>un<)|33Qm)+*ZW;Hrp!*^U1v-CsMU-ttks=GUxc2d2hLoX@@Y@0)!1 zyu)TSakYH^Kj!nsA75N}_h0LLbA$NZ;k)O5lRS`J{>8M}DB(`^q<^1xtXFK{`=j(H zE|ukw7H`B>!GGWGOnYD3`M*WBev{;kXIetfn9eQQ(;_VKs<_RbKmPE_TE}_jCv=YH z1z0X&Ty1vf{;yoi?K{_n+!r;kk9hVk-6wS7|Nf*`kHZ6Aoyz+sruOu>=*KNz#LaI0 zTVj69>T6I{lXX>o>CAtdP?cHw zbglCKo69fpw*(mcJ-7Np{D<9BKkK{y(_b3TD=HCRRh;!hBChKH&uVS88%loh>s5E` zVUTFIdd>PL`myQH&(WW^6g*IT!(^BKE4oj1*C+MNmt29{^sY^bJh)%*zQ>bpW>DTr zv;dVSew?$Mf6h4}!TUZH5m`>*|DtaeMI;p}KDf^{ zKaDf^N#?^7hi^=;Kl5d~jCJ{@@SbbA{2wP=xW>3{4Z}RKb7gOmm(|Y^GC6K!%8}@B zn$@+myeCeKXumhw9JS6-s|gs<)6KLsIh&@{l7gg z!)0gpt?y1)BODVwoz2IWWu6$HP0I0qYhKRZw|UW?*-1Q;mWV%f;RLxdq(2hm%GVPM zr+L=$OzM$;TFdie`=Ma|V4DXZN6v_`P5TwyH`RR2HotpUZdo0eDth4Zp__fRXTI#e z?`-xrS$L7$>sMdXqW{{h`|Wa{WiJ=g`&A!y?%(ioBJ=X~={%n^7Nypv<~ug zI&k@?=7U1^gM;s!`g31S_qDz$PGwE$)s`vRE$YwxT zUi;|fL)BUTJ{K?B|MW)g4XyV2sihkye-+unSGa|#GRorS#{QXgS2wP*Zxmf+uh{pO ztuo4@QlsL`m(zVm%^9K^^BIm5E^(hH=2ur~oA&GYebz&B&cE^UP~c-1x4+i?b%yAN zbyDxw$%^+ZJT~j$8ex~KY^{eoWsicwQpmy|WVG^}ZEo6b7J6&eG`Fumx9EX`f)qIX9zYwW#=r>^uX~O`@N_judn<;(;sj=y4Gg0x2p2l zl*6-%Uf8U3p0nZS<+Da|zy8coU3%Q7{`|&J-BpKsoWuLzG`X%7cab14yg5{$?Im69wdOp0` zWSqEjTUfiQLzC7V#icGyEB^!(X3Tz+`OtQ!z?I--@nvhc_%<90sne+7nJ|aVMpvft zM&IAS%l2_+3h ze^$R!MU=&-fNin!jQ;NJJ+v!w?b_Md`}S?)D@bMiu%%#IvOK6}zjl4?#ykz7V^#;Z ziXOUr=w)B+sV}Shj&{|Y;#v{f^g|?JFIz>F#m*TIikHR9a&0NSkUyogDOx$}Jo}yZ#_pZ#?lJsZ`$5xjW+W(eJ9|ddoci)zCVIO> zPiePJS?b&ex40f=J}d#X9jbSpHvO@+)Z6yonzhU^k&HIFbKc$n$JXRMP6v10xOyb^ zXxENyAYa|x=s)w{wbR~WMZKlYXZbE)$nGvQKT~UbvPy zCR))(ch0*T%YEwg^H)x*GPuTTWF2;m6Or-vKfiHv?&c?3Jo3*q?bw!7_FTu#{v^nP zdueqg&vguW-pyexL=LiZ@8+PE|L?*!MTx2mbKQ(ObWObVVTT7OIT-Tx-y#?7#62d}L;TYhlIDa$8y0zTR_U4(7K5lz??fk5|s~bP%u30O5C*u0S zouXS7H7fJp+-RTuEA_bBO7Vqjnz^5e*m#;E)K4X^p%={<^c`ne(RL09|kun&iq#mC$=x_0&Z;*EaO zI;Mzj5V>;TC8)sbe!cOQRi%B_>x97IXvOa7ymQ{)SnjibM{~lO)$iSt=jt5R)=t>D zxAC&Qoy=xE4=VI_xGY)IuvE4+*+Rje z`}w*&+w@;51Ln@80LCbD(^@)-RPcCs0dfn~A7DcmI)z?*T+Zujo}9O+pJb%E;nA18sk%4fUw+U|nzB@T&2gpUQ#SJ&xUMjlZLK`Ap09tt zh=u>mfAf+P->#1fTE=DfwDfw_(trs|ekd$Ix<8)(yM)TDwSsk%lII)EEnI);qsBuc z*V6lE3s&;omH(Qx^snR9o6Iq9e$-W$ev(-4H|KbE#8$_L1*N+{g>1P-{h2ST`*^p? ztlXyOFf*w2uyY8guK`Y}_Um{ouPs{i>QVBM?e25*PxGA4cTznS*m~~ZZmmC;TraKv zlw%urPbbm#+N+h#Q36gi6Heb0_2*V!pK6=-EA)8YU(5KTGFHiRAKcm{@sX7UVeWj_ zzEm;G8@D#F?*DSGD*0N~l{r`6ryN*+z3uJOODQt^+w+@~3tju$J09<7x6z$rGsPZc z-m3=!+E=7y3TuLu{khfs?c|LA-WA#Z`0wN^Gk5K)o1|8{jPC>E>K)Af-0AY{HD|tj zpA@w8$ofrs9#@M}Wgnd4dXV`r2b3(U`+T2jpN&u#jogY{e!ssbRlJ5%^7SkG9%SM0 z<2P=+tUi3ILBzT?KjJ9!J$^PD-95_jmEWek3_l)`D$C<>%Ie5Pt|yrfQ$VI)H4KYp zzq(;+=_)U?2uR7j+-JYlv8>lA4wtSm%6<8pFm-ur`4{c;^9=vKU%yx9@jfqA@e@3p z@18~`IL*+zbNaKo?E~M^gV~{F9RL27nHBG3R8rm9s;QrIeWmlH+ml7?4yH?g+Va6= zufr=)8NVjRcJbQTr}`Q?hSKZzoI|4|CRC+#mnM*BT{8;;!vdjnFMc-H zApV@e-hzb=2rpJ%U_!pp0CO^dmniSPS|nsw^mf3xhc z_jq`>_1n|N>J=-GRhB!19d4U-o$<%^L(cs36%K&fHHHP?bl7%syPgm4>uGJJx;4Ab zf@*-{wkk`b4m*AII5N}LNbiQz%ZVNFZztZqe=H|E|4@`(+Vw=<9bEAbG9SK?`#Ixf zxa{gfQfp^OUDM@#9rdGRc5?l-FaFgYcJATXd0zs23#-$w>iqxrS$fTCxletYEY`e{ zNDchHH)&dc(+ctT$4xv8bwXFl6og92RYX@@(emmZ$grc(q6C!K)ap4_gYp1>QdHv;WPF zsB4EK+Mn7992aIh0cwYWnrwd`mxqO~U*T`)*qd{}-22{nj~|QUChghHku3fo>Gq( z$`|D4FF#}IWczgebA`W0V#FtuyEdF~|Fh=0_@Z}Tod5c(G4*f!9e>@vM=AZ-AMy3; z7rgr(zrNtc{D|*d>tt=}e%)JM^v(SDbwkf3E%9F@8aH^YzQ0**)qUnSKPK<*Q%%kO z_EG)*?_D2$n)3$)hP^qng5z?{Kil(1ii2NOR9z4LcR1nCd5#J@rhBs*A1@A{9cL8F z%h?{$dbqs#QRc&hyU&e39QUcezOmHj*cGLU=PSxL9(!u-@OjIJQ_e+ijF;_y9`Uuv zw&iT{`-OdT>fQtevQ|b_oY!sqKI7&4+MfR38%$;%Uzgtb?~UMZ-cMT!ijLT&{YpI^ zSNo>oR8;iC$4@$H&wN>}zh3V2+(uE`Y1Ym%&klDjZ=I~Y)i&+d)sE0>j{5_zDZ*Nc zhL`Ub>(nqNo0|O*GL2s+3LdUf4==4h^W}S6lb_sahTA;1tW4Qg?uc|+VWV5~;95(? znJ@bVH*TmmKHboQY>*_kM{8xsZnI4R7D=TJJD=$HW+m@?b}&^YZujZ%e_vCL_V3@i zVor6y9|MoRma|qd0y@Ii65CQDHaJhc>ayEf_R-e4vU83$UAVqqzb@p@q+RUa3dC5v zQ+kzkYLxgc%O7h>kW@0Wt>9#;yHs7ia)n#MUZqF*dK}+Mw>~*Oz4_P2Kh@WcoS)wO z?A%Y^e9H{IOaI^NaKzP~s?T=(FkkS(-vpLDzkONPOIW^}m2|gT@K5yP?tcs`ZFFm% z&AU>2=1aM3^znP1{+~}-yMM^<-u?O2f0pOx0_Ge2z02xYvGdS!6PtU2_De%8JPM1S zWIj}`6n&t1d41aR703HFAMrdtUmMZ|v`msW{<|r8z1=s@_m`VR?fm*~9QWD(>(ivm z4&a7nmZY%TFSb6LC)2N=pH*j?G_~}{!nSLP^-kI!KAJ%~BX^%p{lsdsN?GLt7d%4V z@A$pGe`a0j|I&yrMX7&}#D9@tS<~jZ=);zRCyMX)|6B7iTsbU~{bbZBP!HtS$6Xe; zH}=o`_w#1Tir2H_vYY?zTfp2pMO?G;+!f)twb%9M-w%BF@@vI@zDEIBZL8WD(Hb>0!(aR0CD8Rp^VA7B0GbhWth`Z0@w<#G>% zAG7he=Ql|kTsZGzJN^5yii7{|J)Zq+*~g_f?=!03`SkVpx4TQlmwi%`TVnEJ)yH`f z`g-}-W}j{o`u_KN&iogF_uuQi@BPeqJ^#{@w#LW>Ua9?@{K%JJQ|rjQ_4m zHmqh?dmy&vh`NPLzm0B<%Jp}kge=2-kxyH0Rrvw0)|aNHa}Ruxl7Fsu%_jZVa`s&x zXJqhyZ_}=scxT%AuTLb_e0cSEW9^;^s|)9>(kXqUtA3?^O|FB@3gzxYplYCG)hEfz z`qtZ~AIVRZy|Zt9K}AQ`^49NH=6rqb^Z$p#_mIy|9x+YcSyTM+;~$1}kx0RNm5t4N z6OQkR*?qvoD|OqS?e53V&GA}2E!3r^aj7kMK!#(^ai9A2C%URMlIF&guLbq`3|A-= z7lOK`b9c;{DYmAi^+&z5VBS5M17Q6;xN%J1Q; zoqMu&PFwT*W7gi(#3?eCuXUFh#blzz+dLiSvX-Z8`IQ@+pR&coEdh;}9^?K|Tz%WC z?tkoK@6G$U^~&zt*th#j%1;wr#xD%hwPkly9a=ptd*}Q8X}?|if7O*&=FjopQTO<~ z`YZE&Pu@HgIr%u_^s0h8H~vTD&&aa0dl)OKS61*f>g{fC|E=%e|1z%k@Q6x~VAFW2 z`MR>9KD(yzecF@Ehs|_rtkyo8PZq#DK$mqrb0Cdq=V>@7=@)>ru})`ukY5N#gXv$qniH zi$r2ME7Ben+deoN$$zV`^xEdaX$G=FDF;0_>K@oHYImqe@6(ooCy6ZQl9%m&e#1{r zEUKNK8@ZGJzvQB+r&H%IKF2-Wdt^%Imw%oTGr{@l=SuUvJL~L=zsB6#!x81Zy7+5M z+}h(m`o4UL`sj2u`)BZn-eoa1u2-4kMCZrYPM>~X{*`p$y2)$itc}d?Kb;xk&Zql; z#ddo5%hs7U?WUI>Ed!af_2F~#bcy1%m&B&=JuB}%^O)uTHH$k;Ybv5Dj?bNCm-egr zXWiF2_8mX6_>V0<(Xvl~yYR-(a8Qd+<7XXsq-#fMci4k#YY(a4?^2tWR}7lZD0F*s zt^CwJtvFkm?S(5MPVA|Q`1t5+afW-nqWv?|D_6VEe!edkTm4)o+PkSfTV`EIh>h-^ z=g*GVr~Rt#dt3YZ*^B7*9h(;AM_j-E{Kj&h|2FDzla_7&uQz?wS?8II4Ch`I9m|nX>SY=H>gZCtlp1SKYC$v_V_DVR`Fj zP#0VN`-Cee&;4lOZuoRgXwC)YiQ@ey7RiS9pE$H?)}6N-*WYriyWUuzUDLFN=}G3p z#;CH_mY46x7L=^*zPO#QFxBy@ebT!#texdg^yAGsa+;t~4zQEfTa|h2D{abty{$c3TU%qE7&OEx@8$i? z;0~VP-6LvOZ?ny>1vz-4cwol- zudn|8AF}Dr^D4RgYqRq&&6cj}R^bo&`|@L!ZRNTcTUq@}@9Op)pZ~Y#pO5*=rET-B z`=9vNazu2gyXTa`U%M|cTQdcpe{A|z`IT$r9IlF!>kcWu|M_#z?zpq7{O)|4Tlsm( zuHEkEpPsGS)b0Cq`RVL08ry$cR!QjJc=t}NzU+a2&APk3ACtbE``hx`U&cPL-!ks^ z9yfi%uL(B6Rrf6XzNLSde?Rtdy7&6oGpqjnc6=!N@u#mTYfZUE6;pmA!JC z|L@$R7Pq3x@z>T*=|Z+?|BEZHItt|N(J`3!@OQ>M**O>Y{XAb4Qh#or{l>fHFB9t{ zc17RYK6}dR^H;9!x_ssN^UqSY&#L&h@n5grRdD*ZS?PuULa%r)?K^Vib4BmH*tfy| zWb!|$Z&^J3--3d)ns1lR2eE(DJSxYK{-SbE%#UxVWM1R1G3Vz0n0sr=FV`rQ{QDuvRBHD>>uR=Lyz#8byX=`hv`#3G z`T9ga;lsTZpx)sweUEFak1oE{U_M>J&X8}C_}*E)TzewdKQk%%>g20%>h+^!ovH@* zQ%|#8^{*5!V)XB8kv#1#xN7e7_qShdU%_3-P^bF*eV5!b2|aJiz2dt&3nNo5ey;fb zeq(aM;%(=jn^sLZB=4#}%};!{<1gobaVzWO?B4UA`yRN@p7#&uj}zJQZ*CvqJKw3m zmwt3bRmHK~6|bjkd@p(RfA_rOyH{2B?RX0cN)MU%V=DjVET~Q1<9Yt^-QpSD^LJLs zz2Eo0uIKuNymSA4&kTQkQr#}xzhbNX%D)GnUj2CJ>gS4Z(d{wy=X#%;TR)a@e}887 zS2xWQ&Y;Axb!hiKuFiu~XYcu&IlcUUoyPh8)z3e^t5WUT@$XB; z);Rl5Uq03KJ@-HI{?g$eKA$E!UHe>d{d&32TlFhnQ~IyJINKAY(-2p~KbrMMbQI2cV)SL+ zj=HvV_rUxYPu6G#^XE+st}>ih+`ebL(R~0@`^S6A@HdcFXy}y%In?L@?{J`klg!}HsS1bzd2lsq$uDO3|`H?OQ zow>$evO*92@tVF#Zu`s1J+EIkE$?DadV7#_-|X}qZwrO?I#m2$cyH$Q7lGGK%i4ze z1l*FfUfFZ>%kmGa{#0(7cYOE0E}3akTru@kd))e^^ySunTYf}$r+v?c`CWx3MZfQZ zbbk9UvzL*3r}J*j?XuSYLP}@8{u#Y#-tpDvo=^Du^5eWOeVUKwR&BL2y*XcQ{mc54 zy~gV$<5!$N|JbzZ%D;CXrRsye-S3X`eI;r2=ih9rneWe?dH($4v-eY%)~yft8gs99 z|6_}Cp0{Z)D)&UKUw<@tXVszAe{X*8`Fe1(eQWq}?$Gm3V?*x*{ndOt^P=#a+wwMX zU-zB8zp(tw^TzP`_fuZA?o{(!%K2%%DBskU6;)HquQ$Jsj;i^!C(>W5t?;YOy*1|3 zt-@2l{+p!#=Ecg2#xni+>-~59i%HoVY8$?4-tpaLzc`oIrrH@Etm^n=ytVeLRkw`( z)=Lo+KG)y*_u!M%-rcv_&-<_YyWrK+=%s!AFSe-ssB_I#@YQ}rs-z71&{pPQ) zTAh$of5I(p+kgE9>!aUypPK&bIr3g~`t>8+k?XI#yHa)GolDI5S6Ow_D(j5uKn?&IE-_J4Zhw#>fu-{#(Ax%}Fb zPfgGF-@0!bclrLxD!KQoj>|5y57vKOy5pYk(>=naAo;2@U#+H>AJvXEIwu_;b8k)f z83c06`-mf6 zbE?`Gl|Qq6`SF^4Y~17XecSCGet!4&;g26rUhUko%--Pd%TH2!4_MrP@q+ct{Dv~& z-_8=R7xo!A)TJEru05Lg@N9W)+*P0`NamFe`KHG8k= z9TEIAeMwySvClmlyO(_3Y`p&B?0wVbZQ1ww^SWJkjX(cB@%Zlb>b`Rx*TCgq(EPct z{rj)K2z-3>vFSgV&Y#{A`i!q)73OvPWYv4W?_cD-;27Kf^7s5tmz|!o$acfCbiMbU z{X6bG{wP&{?YY;tqa-TDM*}f|?ufMpeDH92b%5yzceSP-nHvUZKr>+VA z6hB37+wNn!>i?g52$_8hvX-^9v%NQ2&d|>GUg-AOGv7b^H1A8r`St53E7r<;$v=@3 zeD-VR>Fh67N%iHGo8zWfrE-7#ed6iaDpUEMHP1h$?Va`A>)Z0<*Sbj(U@r#4C39IfNsZp9={+|EqJZXgY-tpi0R=H>Q zy^S;6u3LYe_0Rn)*u1~zADjML^O)i0{H&VB=U&%9QVt-gU)Eb|<=)?tIQ~BOzU^ag z-(P2b&fj!T>n-yftGMl7g$n;)dwTb8IUb{Z;)#S%5!7VcNf$r&s^7zTqev@AF$B?_^ba+~xZ-f6mZbe=+%)J18+6so)!nANe`yeDgxtR%Q&03#oOOkpPRTgys~_6)w;=* z_f9^&J3oHs_LkMpKd!Ut>-hJj(!XlYd*$iZe@vE|FZaIouj2FS>lKoBKC4K+-?lL~ z>E+zY?|=7K_03)ds)d%y&D=73arraTD&fyIO~uzn{Z<~96e}9|tWD=-+3|IdSDIRbAw~2e~ z|LVu1kFzQkzN*}_x-WW_y=~lL@rs{PcI!W?m;Sx{*!1JcE3;o&MM^!~v*M8TqwiZz z&;I(#N)D8|E@i5`U2OhW8xm4_psrA@(E;G28dE;H*^!u+q&-xblwIO_~|A)M~yY4P0!+A7CH`QG2 zIivo>Ze`8ZD<8{c_8PChC|&XVcnzo+sIYH3Kl|&lPX>@=eun+zzb_TNa;9;h_<8oH zD*KAz{0`1n!YeIab$k{FrO;LEdsfvp9dC`Wmz)=Tq(<|F`ox*~Pd~kSF0OvB*2NB# zm-Kgnaz{*gKLel+E_w@>|ul`Yedw$vo5~p?H(z^R4Hf-hF*r<~M(eZGZW7>pDxL@8LCZ zi^V&?9*l{5eE!7R>!r_3KRSWhxU$aW!t?f88;kniY3a6*|FZNGY(|If{G-xOY7 z?H9Q$|4K>w=6pHOQayLwa8Rf1t8%OLz8!nq`YYpCpU(bsa!&oOJ-g!~zyFoA%`h*v zd;dww_F2WVPqUsMfAd~%{mb`HK0ZCO`&D84oAZ;l8}Mzao2%ab^j`Hr$tt<^7rjC4 z3iH>hC;j`5R2AvvU*n!p?|bEQMfl&CmH)m}Tz8Y1_|yq(K3T*6N1um2RtJ?(UyDKId8~AyOP>6_^0ulozb@#lzxaB`=by&w zJE!;k-23R`yQ-ynw$bm;tUhME$=){ZYn{UO^N&p*b4R{ElYPt|T(Y>ot(RN>QT?-> zE4ZEX{!I2SW>A&;^8J->m3y+2W%h5bHSg75JV)4j$9;|;2iAzc{*<`n~UKPp|$vbH(q=a_?_-C}-I>L7xcbjJ5%zaW*1PfFvK4;KxnqyIZPH)k{_8gOY4zomzV+(;`sw#V`>n5hG`1`~5Y}sa zUVQhS-@g}L(_H+ja?kJI{NJ8d{sk>2ZT$Vu`m_qx|l*8ANb zpR3F*rQCTnReRjtulu(0*ZjM-U(YYQw?4nQ!hOyC$Dh({fBt*?3RKI_d>{0>dFLLt z{z&;VPfh=+Jmdcb?(T05bmPBucFq1RzN=3EYFXuOyVB}T$X?_3asFSYRfXxj|Fz0F z>h%ia*VViCxb?%TA){YkPb{1Ls@lKz*FA~tA>bB#-!yR zZ&`mSsy#EyUOpw>?)vd3SI;}`W%#-|K>y>X_04lmpDQ&;wPP$RIepz^!?VwN>+|Hp z`Ts1t#a{LKx`gNB$e!9r5t*tr`NEU$95>(RRo;5w+Uh-S{X726{Mz?#-uuVWW{*Cc z`tM>r<9jfu`V@NaUs@S{_npTc`*TmvRyn>~y95-z_dePw{RUM`ofY>Jg7v5U^ZT~^ z`0m%T-IGi98n1u({>t;`pe9BA_ljQo*ERwYgw(*4Mlv;<*Z*)h^R}FE{_IT-TAa z_iaDF`V+hD-puP?zBkSQ6`^}4&a{93QL5hP{o=W=7AeF`+*R5&h_iIuI(0}GAjQ2O_~1+-~coJ{%^4{xNqyc{@!8HM-kU# zeQWs4k3PTf;d#O3&%tk*=UD6ydwck6tW5cg-u@?ve#byQPtejpv+c&W^u3Fmg;9$ zU*FoNpFQ`k$*Di8rKXm%q~_bLzqosK?S=cn;gipvtlBE){cP>$yFJr)Ey&qxoPTZg z+=-wnvg-H}o?B-xT7Qvez21{^O+yw+S$*(>+CX8-Bk*EjD{-hcJ^)vrmQ(VkWFwXeA^XDJW{_-sPmF28|d~f4se0{e%?!f2w0pCpw&fosM$1Q))(z?~R zQ{?yl7 zzv@3{S;3>vpsE8@v;3+~xR(CCqBm~OQ#-Z?rvH{4<9<>4t8PJ4zj5)t*B@VfEBtB` z7aA{d>#St_xjoDF8-JI7FehUAlG?--uQ#mZ-t)V*_TJx`J0DM1W=`5}|LoJdDpmfz zwdK$5o_{>`^ZQL-PF2>W$1N7``2Ak*{k!u;@Ah|}sfrbtzbejClzq-Z^{;^&>MZA( zr(9e7t#YbdPG`W^hVtv$zhzIKvE5(!EcW9ZRZvs;xAWfog2ZRdm3zGOj|&>^H$Azx zMEFX&L(P-3@iq7M%3ZpsZ(R3BcKQFgm7#xCcio#AK6m*Ui;eRdj%R;Sdj{(6o)@3~ z*8)_jJlYxB5#0wG;W@i~&VJT=e}7J`o-)1lr`@Lt-};EWmF{JiR)4oL`usB{Zn68> z{og9C{;UIy`34PRdU_loeXc_*%Zt|;A8@YnKjb<8>WgF6dB)t2_W$)FtgyV7e0`{#4v zpbF~epP0C}{vb(kBX<2d_44TYfPXA=tm;5n`}-CB3-8N&lo!R#NwrNmR3+XaeEoIJ zy*27T4}nK}PVRbPBKUrHS!J)>$2}{~Xa705rvK5Wb-flzFRrR=w@9p=vh!XtC=h$) zOzjrdO3e4xRXT8W^7NcLZBusLmk-{1hPj|Gu9thM`i`8yg4^nQcGbq%TK+dk`j_t2 zCo5ySzxM0z4sZwmS1bp3Y|JfRvG2Ox`fuvn?JK|y@0AztE9R~I*YeTl<<<8lMZazC zh2GrgyRzf^R?tx1EqR-JvG0GR7S(^R`2IZn9AoiUn>bm0pZY_!8XLPe>{B@?{Pcv* z^WX2!?0#gMpSZB@e$}4py~~v&PJ(*Y;m5?E{rzjV{^IM-uU}(9X==|}y@J>2SAV?u zxNmyZO`Zold#hIZ1pH*}2!5acrQ-YFv&x=^w;lJq-|Y9Oc#ntO+B??5D}G89txOE~ z>2g`+?Xr9RFF#7{ZM8@_^Pi8`@}5<_j`?1^$zE~)f^+sKKZ5MseQWuz>a(*|UY{+hXV~V?cfa`WOHc#q@7<@d zrMuPd{bjUUe{u0U`zy77@7UeQUo%<#-DgneV|zDfD^P{LB(z_DrlPR2*FODTt)kuf zPVr^)PVauTBlTDCx%Dr;H_y4P_#LSoVX;r(YuZkG_pR%nIZyuk@}rdPtDiFc;dAR7 zERtSS?%6GOMtEga`n^#5@KvDxwfo!ma_c{;Z?&)3^Xd;*=g+Qoc3++UwHe`jfw^?X>s%+Rpjjdhxyfx@ULKmmjd1zXCLL@j=#ECf+7) zvAdmq@iS24DqU`UrhIA5$BN#2b@opF-_t=BeY5Ys{>8qi-v0BtDwze)v7C>fk%_+t zADg~i{H?sdJh$g@`L_4-KB~6OIx^u>!&iI8_3md*RB^su>nSUIP_pX4>RZddbi7^t z)B9&l!~K2pBHv$lY+BVAx&Peb*wWpdUz$@NC={djq`eg0zwMF0o>5i{_x2wwMlz*x$ z{r~vY&*!{_G7s$RLG8TXyN_r8@wELPr(fyGeC2xkU*7|kzgI5ZAHDZiT+EE0JeTYq zUVXdxl`i9L#jk18?rm(|EdOqs|GD)Oz+s~{%tCj-~D_2`@>%sf*Y1=er|d4G5FYKhUfAHHr&R>@qx!u zSBHOeu{q!K*1KSyS_V zf0mm%C!+rPW7De3x<9)PWdE_eH>sa<&+58$<7Vd4m=x_0}^r_r^ z$@}~n>_2~o-sAYnV3?=8dET7kyOU(s&uQ{olm6zTlx^DIp9|+bZ(4fjYiYidrMaGW z6%T0CoA=23=;`HG-^z79myW$x`$y-i!_ekyid6m8P!iE3E9;+Ux zW$h?G^4@p)^&{$`ps_}tJHO*V{+m&i`RmoA*Q!g78(ZZ2_xghdt$)uyz57*}@o{m` zV379@@L-TRFS{RTJo3wmkB>lY(BsB6bvOPS^v(FLyA#yI`akh>_Aln*KP8prdll`s z9Jy}&In8!u@}aMwCUdX8`{vuvKhFB+aP@PAZ~byedj9tuG+S|hyWILtaqs{sv@`nT z=joY<#J#L4&U(e~?%-Osf^!rI{VMg53j!e z07seJ`&Eypy*e*={rsz+?K9M3?3F=tq+eG2Yx$;Ge=gOyX|?+72fOTZDt3OK{>p#4 z`RmqCr@kxum6~QOWr2#vRzjF_loPsEb7vKzmtrAP_45xaQ*%%Ro^pH z&ONt{TWl`y+I`oaSJkSjuYS!uzPohQGWDdt+0)Hmt6IKy zxeDsC&r0`3j}&bH;Nw2?hn6cpJFIZu zv;NL=)2buCgzeV%ouAS1*?)R?e|n5<|Mf5I$bPM~JNGp9>W;(Liq8js6MX+t862yf zyYCBbw*MU-x8cqA{QH@y_l})C|EZ!^uJZrhZRg*JhuhqF;y-mi%UjSEPPhI&@pHN( z_k8+v_Fw$bmG}7{otJx`-TLk8ncs<^(B6}O;pyG4MTRqK&h1RUcmMsTcYhbo;a~7- z=bl~v1OL7RH2{?C_j5dN6j*-k_t%Q=|E4cHe12lZy^~KNV@GE{dms6&3)K*V#ALp844VnizOgsQ}6p)m@hk?9o5{^lVk_$!yT#wPhd&eO%XT@yKp};*rmc zi_|T)*GBpOx^E!-`E^X(VsoMIk5lI7a|mDgKgB}o&>3(QaD2`A2cOohy1P;NT7OC9 z)z6Dx&#nCaam}6n1K?Qm+4JZ3`v2SG3zvrXx-`(~5|L>3a`FC@p{{R19&24$_SKYklf0Wx_ ziXHxC-)}$7x>nVn|9|}UeEa^rwfyf-Y=5vcI^zH0(>XT%@7v79 z604`oZZ3av`@z}mA$FP@KDMmCnjTZX{om_(%JKE5S@qXe9Dd6;J?dwR-?Z}&8s(ox zNBl3Har2*Mjr7k;&3{xE?r)g4vf`oHk=@r z4qQLM{^gz7n!YRPOmT0Vp3ZJt_;2T$FEz8T|9_!;NwPxjKAZk^&AC15HRgM2H+ecI zy}JB3`op8QdfKw*AMcLX9rX3($5^|M%0_YJvp;uT-(InZ$!OjO-3p`5i63qD&ED^m zI!`*RYDei~8-L}K@qIPYd**H5_q#^Awk!7JFOz>vk0*6K|CsyCc$J;)KHj(;Pd~{D zOZ)#Y`<2qyZgl#5f9!~{N2U3e)3rp<++W|KW?q~duGb{$I%}St<{&_zU7ko zqQ5cwSo2M9Ror(6*(rT*pQqC6%a5}^?)aDVq3w{xy^mM&Z+^Qi{`E?K=+@qPzN<%4 z{)_DEtqHMtko|%DF(}|DAzfBKaRdj#iv)gy_KR-8lRTKN7R5tGAZ%atp z^X;iD*I%w!z3_X_k4eqfv;SOPb6BK4GJW+X`_n}y1s}2e6n60cem3U1tI<4= z%PguqY?b$|u5jO{dhhbppR>B3gG7%ut@fY3{%G)SqYsO2oj;*|&g3;1)t9f zIy%+=r`(5A>1UMX^Pfk5P|0t}vG0GMw*Rkz|FO?MqUs;MD4uPfe5&huvt6T{+OZ$j zk2LQ$nO`a0c!Bf#Y*A1OP5JD7?DG#X8_#E|-~@SPU5w3ZeXa60mCr@zum38pH}81) z&y+a@PbU9d(_At4sn=G~9aKc@YRYKnf~&Qn`eGky2G^2MO!*S%3YbiUqwHvf4uCVp%IC4dTxPj~+m z^Y5E2}Za#6@&5dSr;GTFRF73}1(i7;R{Z+%Bk$Lp|Asf?ZT6kMyRLNp`J+D)`>I(zI?tTAVvvz;MN1J`!AEVdVeYHFANOkA@XQ!Tjj6GA{Gv)gt_n&Sx`duZj zDn9%Wv)TLnVP82YT2IdIdH!+hKc}nDb>1gQ?eYA!H0GzxK3+M)_*2h!-#On}Dt`v# zxwm^Fzh4irnf^ZM?WrrvPhWo&_}qW``m5@t|4M%5{fm6O`_9i>kQ89`!s{gG)#n!1 zDwj|Bv*0QJubS=O#eV+4W(>-k4; z8MLx_-NDHxr|5u7AjdQ5-+#(|Sn<4F`F@l7(V88P?>^mqGe3ULiO=1~w|^90W%qRA ztfSH2n}6G@J+7?bo+om?`)vGaq-p@;6WBqn*sBp0-~{TARzC?0(c5`ObD_h2H(9 z<-cR6&IVTlE0v$^-%+#HF5K$nD4);o_}qQGd~^KX<&Pg#f}-i`%Ab*9{+~DR_*7XVZL_LI?*7peXJy~Z z-Dj4|-*bNNv+Jr6_rt69s-M_t7y0~w>`$`_=0f`ypJLbCVSZn`<9zvP{RuU$TJw&V zA6{MgC#JRvWXS%C8tGcKNB@LBTHT0OwiUW>zoTY*&Fo)sZu^@j=NCV@-NUXm@A!7f z_h)K+K-I~P&(9}GXAdf7pH;I=&ws2RV$+{*EC)*I zW{>A;%?A}Xa`kI!_-DpHkp18CSANsH*~=Wx%rE$9Rw29CenRv0O#4Mn>mL`*nfYGR zcHil}eV%7egG`@Z{a0XTefq1*Pj5dk{Co6K=0Eixx}oz=h@W@&nBVbSbo%?GS8saG ze4c-LyCi>zP5*k?_m2;(c7OIc_k)|8Z76$wOVuh3^PBNmdun_N?zt_wmYIj*r=QTK(}8@m~8?`%mo734Sl| z^2#5N>F?Fz*V=l8ue=EGVJ5k~JOYr93Jx^Xw{`&HxZpEjH-k#?l?|xX~ zXZp3~$w%7#5Fw?D}Izdyd2y~y~v@$~nM{om`3KD~XT-|C+2zOp@= zpHEl5fApMn<8QgWpL#j(A5ME|y{ZIU$#Wn1dGzV-hi{+%a#_p&?33w74@mL7^ws6Z zyK5e~r|jYTY&yknZTX8&TfZegmi=k=@227V-?sbC{`k#x@BV-3Y`^JuB4$ips%Ct_ zUPrddP{MBh#m4jT_y4{2Uw(Ds?y5T#=az>beK)`4&*Sg=Y9?GYW4-L*w`p?YKgR=? zk6k!uGKsmW+~&mmW2Yar?v(%VK$BOz@!WyQEeG%Pe|MUBS!@Q&uU%&Azf4q&Uumbv zUg@!gdvnM~CM)LrL(MHJ@1(2j^n8|oy?N5PMf|;YO}scu*yhD_ER|VsQR>3w zGt%#uM%}YJvG%W;rG3HM<*d1D{!TczMgC3vuLAGKawm@c?Y^}0_w-B6`|REred)9K zHz|k7`)nd-3VZGj#uB!B0pi@N~+#I&q>uV+6LO5Pv$MRMl1?!96{ zj=v?XKJVfDy?J4KyUqstV5{ro``Ln*Bx?A6OX~L0r z_7l(Dsekn+>FH(e)O9sh{SiMWoSWhwzj${0%T#-g!gYt8r(LdCx&H3z2j`Do*m|5d z*!exr)z{M{I-GpBuh7#8SdG&qTyG_S)xV3(JpG zSRS!I%||EPn7HY94TH9cddfs$lRo)d(S<#U%RC2^Odt?t9G)@3)^Qry`m3A zc`sN#-?%G(#zF(3OUq~OjPKgD|JZN)9rX+D{Xb~iyz@V^)z>zm;Tw{w|9T*U&(vxAN=d7+~4%uU{Abb)tt(YKMhXXojEo= z?V`H*J`?u6{zrcZU0C^1b;9{I?-k@rYuPQ&{OT)t_D}WY&ueS=cdl=@d-rQW;T?nY z58?~_jo<$XU*-LF`ewn;zTTlGJLSEP{8T-?G?ypf$Mp-!g*GZT-J^eAvbx7@JMrmd zi;Tfw~& zRWg;|j~=ZvwY&JZHgwVx*9FEOo@~wFDzI~^I=`o%`Tv#T)QS2Xcg}oH`*`@5LB@gK zqD#IXsS(+0bMm!Sz_ddvZ$F(}L{fcjb>qaXt6XiC2C{pJ?`3 zRw#C9=66|x{a={-%IC&UIX5@HYEQhQm9g9+$9XHFUy0^VQ88a&{K4d%{bIX`erM9# zKTbD!mv}6G(J|+Qd2>G2uzcyP+;=raG1?+bUSW4@*7@81pU!wSMx33`{%hB}_usvG z{!WTnH+@e{?ak#sCxVj6y@1Mcg`dkj-gka~7;(eCU!ecWs<#g54>FTq*f`gSznm#? zzxCMK8T+|EW@r7=yYrd#^F4tVvX|}E6=!|6Hrcaq-u=a4yc}u!*nS;3WB>cfzrAt-zS8T4yakplQ@+>I+v-BDF_lkQiR)+g+UMa7el*QMpzGdOg zOFKV%ADVu{qyM!**OOh3V z(o6dzBm`beobi6{Q^Tmr>1>~PXZ7DSe(D`1!TH>H0soO7&$VVf@jNs6SiDz|V{X9O zFYg~uebRVqMp@e-|F&~B>(3Z@F25%tG*iXyK6}!h^lLS3c8982mXsg)s}NS#5s?w` ze(ltAH{!h)9_{$4*e2KU@dW3)gK0T3mWg)OhVnj-nPw#=KRdrA?``GJiB&TvTI=jt z>v+xQ>T56%KtRHUTyZc+q>i)}@)5^?d9Qt+7-|PP3mk<9LJ~YdH z{9*4BtD~pV=SsExeVkqLv`>0_#nr#}`470SSGecR-=-4e`tzSjX8xj2^2PUlo|qqR zxc2>@lFRQhi(fx4U&U(rJnOMt$f}57-#;Ih9Sh-JAF}aj)`N(jt5mydH&3|y?fa=k zcINvgAMH!H+iz~FEK#ni{?}^bTQ4zXvCCbxlV;iXeHAKD?dI%Ge0m_Icjs?*<#W2< zpIMg9a94VMX-?JMa+bU4V!Mt=FZkyjXCM7)(v&?Df9cs7z7GdA={{?v*9!b(SidKG z;(Laj$@;$&7B3gdS@AP;#dV=OHyjW0@&Cyy-&;M$-qy?RL-Pek#^5#XR}R{m|Hyx# z5HJ46wxro?1#4x~^%cLi%nOk}XmTv<|AzYu|E27c{&W5WXBqq6fbX7Z@{HcD3-)zi z{`lwSzSf@a{V)CJ*Kc3GzdrB3?Wb6~kJ+zkZoD{o`F^-rda>v6i2W8l*Z2MA-}Zi< z>E;Kw%KsaFzx(e+?1XoF#Q&}QTyaJ8W#i|jKbgx|=j!~*wY54U#>_KCVcoXuN?D4EdSQsXSRGc%)X3VaR*t~FD&2FGDq{+?n#Go%&mgIh<)q-YMu7? z`=rM)FDB)NiG}P;nBSB#eHQET6UyB8mvA!lPZEB%&CSpMpT4EtluH+b=9C=2|5@YI zlKSI2su%h#-Q34E^Y6XYXIgiaU)8zCd-+|=-~YA;DxB`$J05(0LVL3DtId~wamDD& zjWE9UeD?zHv@?=y;%4a{1wZF3a5LbUSY&p8`Bi?Ipw!B#Gfa0VeD!&w|NQjf4+*Rq zN1vzmbALH;X6l?TeT$bQpSr7jWBY~B^NviaPj@b#!>V?-*?o`ooKp@rxhiJJOc1IR zt6b1&@3LfP(XL;&zi3tbke&58aldsQC-=gs!GAYh?EX=>*xmm2Zs`-8U`FO*w` zor;ycar{X{qb>6_CC1-}Z>#Tqa%RGBwxVg)#Zl)b))#NAQL-&7bcAKOe|{aB`1yLG7fE6F)rQdaUgF z!%jlp^YY;{KQ!_)6XrIX>mM;Uvx|Sc{+soc__yV&_eWV?jb9sgC4Q~k-O^rd^?i3; zYoEszD_*dZEK;~Q&+^fqwcpN1-j`Xt|4HC`rVIOxKK2@YIw}>)f0(&CwL-b+n`u$A zy@YM!e~GqT34gs)>%tw?9q)vr)6i{_Jb}DH|F#2~RR~V%wqeu+{m*)!*61PBWy8 zq!zl`?nZ^23n+k8fUwV3${zif1t2=G$$m)ykkDW)uqG!gH<^QYNch`82zWeUQSLf7;KL6`;ex2;K?X6XkjhAlx?GWD( zC;gyQd2wLf(aYtg-}Wxr!`>Zd&&M|J)7Fa21QWLM4;$t)Kj8KIFUEGS;crsF{D(gK z>`Sz?r?P*uUtj52_y0;I=PS;3p7(qgvt9;#f3&(x{)yp*)bgKyPv4Mz&1$|lbkkhF zTek7f&tBj9TVjKs+KpPf;(INhCSS08yJ`2Ie>=;r?>b;O>z_n`z4ey&H|t;BS*Ra* zI{EqEZBN0{&->zDH}Wn!-x{U6-1xQi5y?gSLiWAU+h0G`!uiUsX=>*L4lkVd-2diY z>8+a%l^hj~&zX1qQP9TY`*`MlTl$u-)TlnIR(|Q4#4BD#)9*h0etzrk1z+ctc5nZh zzw&Xdg#TS-hvml=Zf*j}`S)piImL5Du%}(vrSo@X%p?o7HFFAY{@wa!-O;|acemP~ z_1yi~`{(O>8-BiKJy&Qne|EL=i|vJO3#s zTQ14}SAKui_m^GQOV?+Amwa5B@!gs4-TArqeO>=*=Y39kUcMp!{r&sTUS8SD6T)}p zx;xkDDV&l|9%0{yu%?^R4uCS4wZs zm!Dc!?kxLcY5ntmJa4ie$C`b7*>&E$e(!;b>vdDq?BrEmYL))oxhMYe$A`Dh@1J&e zvCO?gEU$FJCg;oyt_%w(+#e!wzu6h&)bm@bXFmVBE#$Ms)vOEtpS;WFyYKxtbN%lf z;+ub~On<#CUMlMCo!xRzH+Y5ecY`#nPx^i(G0y5nZC~#Ene(f|Y`mX`*Pf^Yx&F>y zn=jf|qQsWQFO1TiW3``MH!;9!PTbGW`el8S)0#OyzwWxKa%}?>g!(xk^lW{Y`MYJlWuM)A@a6j&sr<0LyaB=7FDtcIf4*AWzR#zf zZ~65-D*Nk;>}H&?KU(iP_h{DdhsICdh0I}mvu@$C)9*h0p1!gA-NyTKZ`t~#e^X4` zbNknY>38E#zbkm>uv=Z@^`F0`uD|SO@7uldvPJm&FL!PG)xRe%{o4F(FI(00^G`Or zpQyg%*Ev1@^!xd*uTS_sWn;bG6WheM&-AZ2zj8Y}Ws15FDB#X-{jHLC->EpL^ZnP;6{}yDsQVsI zo^|fZ^$yRzl^<_S2SxSX_17}Ye}7u?-8n+|=kM3cL_YOxd%y15weP>)%{xB1pFL3A z`TbnGm&-qz)GxBByli86c0Pj@vw!xD>^<3rUu?E-ZQLKFzwrG!n>*sO*Ds7~TK3{* z6=$r?iEy3vi4sZQkS-T4LtTSME06W?D0iqh2X69sZuBF zTTDasGZkAtZ?mT}|LDvxbo2ZNmV38P&wKHjAbHnwg&C%6n=8!hv)`;Q|E!<({mRw0 z>7L%|H~y?q-2VRAesTVZRR>i%HlJsJ0=ogoBmpu#q9k!W!=2 zKQouv-+Zo~IsN;#lh;zei&yZgI2*pnHGcoPdSg`V{oN0*O|{=2u|NIN+#9LipRE@^ z5kJXy<;LobQD?7P-;%X^w*2F^eHDS#Cuhz3`1qGB>k|3;<>`OKKYAscfLn?|LX0zK|hZ6e?4~bcifb%+ILyndw(_hGW=fm>$UsGySI!s z$Y;49@8Q1c_o;+@A70GiJZlM?)iJo-?rCfNBtSAN!upe ztd82N6K0nONXT1Mk$6%*@`R@Jumn&vZ@>qJ<+PCz3^oz@7{Ko$q?Dr={ z-T(P=*;TsY3O7er&rMFnP{0iO8=^U&E4s|6t4e0*vPo!2C34mFdf&X6bY9~|diUJK zjcLpG?0#kTzVLx$#-%q`7i8Z`dU^Nbqc0|Lo@-{l3)MO6mfm&m(7%m!$JhLi(<|ey zogM029v|?2R!{k^C80ARt>BQu3*`AH!<)hT>I(H9*Y4iC-1^_VrYN<)*2nI0muk%| zH97I-dt9pCmCW6D^zZRrUUw{&xkvrW+gh8iypqR+FFti_>|V;hXY=gy<&M+O2xe_* z=ALb=vZLl$46lUJ)0}<&tK}`07+q^&6JIi~^Y7D|N(s3&44P%Tjz{Xzv&hM%zUdAZs2%+7rSmbn#I~i9ZzB87 z3o$eQp8k0AlZ*$GjMHnSS&F8mFKD0T#A8{=|LnBCth&PSq-jOU<~o1f{9oCJt$&q& zjqla`Yk3=jmz;X}$@DY-i`iN3*7t3*uBo~udGehdDf!zYJMUwKI z_xCi#FRgfy>GU!DLH3`kb?v`a|IPavuD$%%>Z{$qR$pDbdtKqvE9d0W{%Vz+)OGxw zvf^Rew<}B1vg_CCBwSm6X|vNirVIN&Ei@NAp8qvxrwt$fo24~pt1_Rm)f-eX{Wq*) zt>0W0@PA9$=Qn>MEVchuOtU}q$L`*$)@r|ROEx;&IC<`kF>mo~*nB&@vABGF`om{G z!(@`=))sjEQ_XlR_Pc9Ft&_v&8+xzpr|#MkVln^yBksQzvF{l791!#CI4_cCTXn8@ z^0Fg>dHi?(L_Ivi5nf(ewbHU_2-Hg)pqwL!V@er@-solVZZ$dSLw z#-w7>Dy3%2nX^pdg6`XvrkM1&=&n9u+x~8x*e|28bg_gHXO6!xK+}_RVKKYcGySez;Yh#%Y8Or%PM6>UjQsm0|{r>tFFK?c8mtOY% z`q%OcQ`T;j7CxK0`v=#ubCYjX99zR!nPV*)bd5nLrT57@3F)*2rBYIC6D33AWqp$_ zhDS)P$dHTP%w}Nva?{p~P7Ce&re)sDAZHj)54dQvEv>}(?Xyi=Gmcz*yJ_p@qWfXd zixwR9>#jSnAl#@_&(Wmd>Lry`d-p2$Fr;Q*IF#^y8duy6`PuhBpZ$G1V$ZL*>jtMT z2QH{rs6FvPPWFeyulW1_KKtAM`)(ch>wf)%aE9;I6IUIZlot`qv86W4)A`CL^&4TL zFP?pF_G z;%<7y)3W7OSzKGsT0Xz_;>7lY();XXcUL?(x$n+?kNKU|FV$;4+upI_J3ozIZqLNG z<@38PGe7-&{HE2vNijmf$D7Y@Kd9WtKL7pWXVd3jQZKZT*k>R&PfNbg#^l@Nj|Zl$ z&+GnV_ix#|;{uDsE}e>;B+*u<@Mvd^Zk$ZzLbECUKi5?_uQ>Je5$~?$2ETMzH*N3M zS!Wl!Pwai*C&^krBaR&vmt)M+nx6%)t=OExQuy`dr`UUJwHMrve*P(DQz$n9G)bBJ zA?bF+{1*1dj8FB>*Y2~fulg0T?`XWs&iyR>Pt!!AzI<6(BfaN_n3M8D&iHKmXBFRn z-umb_H$G-x_ssGYzup|pU^{<7zP0_^>)_fQpj8KE6+ZQaKlSFnnAsq{Yu1#krMjl#AQ(@6o5N6<5BVf13T(GxmP$zH9NI#rui($|aEmM{GeUhVO^86>pp-_Dx1KNdgQStD-DAMh0{1G4+qlXLUsK#KS5u9@!t z>?8ZB@6w-7&%ggqKI5>lH`X;=W=Lze0uoC~Qj78wK-YCZ*@g-r1wmZ;Fus9;5op;L zvWS6#k)eTtfdaCap@Na25t^8hf{~#KnwYVIks-PbCJIJ|7HH~B6^x9~?J!d?GD5e* zT)_x@>j<)2EEJ54(Cx5PFfu~3!%)G<9Mx7s0|g^vG+PY~6^xA0Y&A4eFfvB-nW3?Q zkukb?CJIKzmS}dEDj1mu?quFX~qF`i>ZmX$+ zkp;RPW(r0Y=ysSZ7+Ij(VWD7Tfo_MTf{_K99VQCssmH`X!N?NLRue-7BTF<}O+e9& zW~+&@f{`VfttKW4MwaNdnkpC@pxa@lU~GVHhq;2W0lFO)3dRQLc33JH8=%=?s(_vc zObrx_4bf~hHB>M*M6=b@NWs_;%~n%m1!F@rTTM+Aj1AFkHB~S+LbtDaMj1-K~Q?i+{f-!m;Ff&mw zMh`tRQw3uTd(9M#(Mu3Ba|L7c62#0x!5F;+F|$-KMlV6k70^vHH&8G(Me~`tp@K1b z31V)fV2oaZn1iw{TAZ1iC>W!cAm*kD#^@!8xtW47dI@4~u3(H_f|y$<7^9aU=9UV^ z=p~4S0(zKO7$_K{mmn5~3dZJWab{tpV2oaZSQsl9qn98Spsb9R8ZAr}jL}OF3o`{{ z^b*9vT)`N<1hKGCFh(yyEG!j_(Mu3Z1@xG;G*B=`FF`B~6^zkK5KAKkV@tGrW@)To zj9!9RnkX2fmmrp=3MS|!h^3i=33>@)X|7;`UV>O!D43v^AeNR2CTJyykpgPXZDgQe zidst>85k&-pp_^_28IeIXeEk~fsujD z0ksWH&`J~|BXb24v=Rl>UNk`~QH+c%6->}d6eD8=Q`FWbs10d?R-zag8!DKfl_;Qg zr3qSzVq|QrV1ibnfZCcSXl)WBV^akav=YV0*i69$twaH}Nlnm76eD8`1rxLq1=LP8 zK`T*=OcYGfa-NBSf(crQ0&2~gpp_^_CPoS-XeA1$g=>OVq8OQ&D43v?D40lVrr;hie7@48Y!5f zmmsFb3a02Kh^dK!DS8QFYN}w0UV@mKDVU;{Ag1ODrsySzsfB_mdI@4`sbGp;f|x0o zp_L$J1`4L=C5V}!f+>0lVrHaZie7@487r8gmmp>)3a02Kh?%K^DS8QFW~N|@UV@mJ zE105}AZ8W{rsySznWcg$dI@5#V1`zLm>VdVqL(1%h6<+WC5X9^f+>0lVs5Npie7@4 zn<$u~mmub*3a02Kh`E`9DS8QFZmwX8UV@lgD43#`Am)||rsySzg@PGc31VTOU}}yQ zj~0dsrsilNU}2T<_cy8=yq5rm>HnkVX0t-HsWEdfG%L5V2*PGqgbwP-n{wZBWG6 zz(~OiZBPW%0W(7z6frh1Q7}Ur6ajV0%+Ll!j153#0IF9(9W^twK@npE3k5T@K@m{r z%?xb_#Mn>)Eh!os8Yq~d4T^v|bY^ISBF2VB3TDQr0c>n&tYBu08okCvhE^~b8-dCSG@lt+ zDwv_CJ!1v5V!_zhK*0<>9*qqZ%+N!?*hs+)L$9%d8CsEIY;2-nW`P!G#-<8pXhn*# zv6+GyT9E?k=9-}uDaOVY3T9|U3aIOAhE}8)n<${W#Kb_s46R53b&$=_iWFlLBLy?G zA_dfGHbW~?j7>}w%+ZPzP)FL_04+6|m?@Z}6)B+3wK-amVr*ieV2)O#fI8gf=p~4$ z0(y9w8Yq~fmmsEw3g+k~h^di+IeH0VYOG+6UV@mKD43&{Af~1Y=IAAeshNT~+OVpz zskwqVdI@4`p|Am-)@=IAAexrKr` zTBU4kZmD37UV>OCpyyBv0|j&R62!t#!5qB=u`p6FM=wDvj1|n$^Q{FaE2EVl7N!d3 z=xN2mOu-yIlr78^%rV?&p>B8n4^~Kr2#A3{4a)(25k$*pUTVkz!(KreJ|qq=3egEYOM+6GICH3$!8yG{$6sR-~91 zDWD}g6C(o!3$!8yG!kWjR-~9187Wwx6)B+6DGRhB#l*-&!2+#F0gYH$pcN@5MrH~Y zXhjNW6w3mwNHH-2l@+Ls641z&1zM3}Vyu9cc}$EA6fDq+6wqjw1zM3}Vr-;ffmWn| zM!+o4iWC!L69o&jN)$9IW`S0um>8QWSfCXtpph~Qv?9gC*h0Yqt*`)%o>`#hDiZ~? zBEZDNK*0h%g_;;DSfIzPiIIW@dZ?HfD_CHdXQE(DZrqL(3NCJL75Wr&%nf+czxVrHgbiC%`7nJZYLmmy{r3YO?) zh?%8=C3+cRu3(6s2+R!>EYS-Qb3+A7^g_hkNWl`l5HUAautYCJ%uN(5(F+lCQw2-( zLd4um!4ka?F*jGRL@z|lEfg%#+9jYtPfPSd#6rOkJuO=pC|IJGA{K@UmguF3g^_|K zdMRRItYC>=idcZMGit*GG=^%4UW!ixEo`P<}@9n<(13=Y4Gqvr8dF1%C(();(4e%T0a{sOY6$WqT44hksx~x0D{V{-L7qe_ zZa@Rrh6ZTmjj18XlV}AFXjt3O0IkF^HBvA{j~^qDC(()=(D=8Z0a}@3Y6S8mTA>3P z6*n|MD|JkbK%PV^c0gn0h6ZTmj;RsIlV}AGXawER0IlRPH3E4Ot>^)bs~Z}il|81$ z3WjJEnyE3!lW2txXt>?b0Il>fH3oSSt@r^A!W$Z(l|QD&AWxz-V?aamh6ZRQkf|}q zlW0W{Xu#gk0Idu%H3oSStq=kY;~N^Fl|rT_3Wn(U#{}d_v|gq~5snHN1_gA+S?LI5WY^ne2gCWb|(paKE4xHUCXFhnnl%oPmLOCk#e zL-caUQo#_d6f#pln~X9uP%uO*l*|kj4AIITGb05@fp%GEqa=%v8Y; zt=us)Q!qp;b&g$`cC{1w*vb#KKg;5Unh+FjFu@D@iQO z6%5hJ5eo|iL$p%F!cxHytqieLK%2d^G*B=^D^e^C6%5fz4@)BjL$tEP(pbR|t>gf; zR?x}~OH&2VY7gYqr+>pI4HaS5mAHtpLeF3Xr)}1xW5u08PXjC`Mt+fkMoMB?W{M^#I8qZ! zGV}9XKB(0E#5Ce_5p^1T4Ng<1Y*q}8CAR4CEz`(!) zG<%OO23qNXDrRU1nlnci1Ff$>69cbxK@$TtD?vgA2zw2|L$M%1gqRU{1{O`s3{*O! ziGjQM=whH^4^_+g2okC~V{^=OU~CTV9)c9Y-E3@O0IF!w#6Xj=AR&ZXj4g~oH5f<` zNiTR}7hMcgHK2)s2NO`mEDb>YMKm!ZP(_9&2AUQH2_d<~61*w^B#3Z}C3vzIO$>MD>jgdHY^2B38&AVIhtCWZ!}^+#x8;FY9kVxX~FkPxzYW}sD6AVDPa z%t32oP{oW4Kx>lF#Xu`f(8NGfz91naJB&b+Gw5PwnEo&_!}N!dC1~{tNHfBH#s;9) z6q*=#g*uuTXz~>#gya@uGfaONn_>FH*b-FwgES-AYl%^=nV5jqaDkK|*O~LyaK!ON+O+o!dkPxyuQ%rxDT42V9 zsRd?ym>FWmhZ$(KB$^#&;MI8`L4;e(K%F&^5RzNWEHLB4%mOn$%)zxWNHfAbb3;sj zn1e=&LCTQqFbA*C0|_GOHOKUaxdmo?SQuc&hlL?#d{}^Hf)~Fptd=x9hRV(6_5~;TP)2$YaT&@2)9^*r;$;_Obx(8ROn(D zVP$FnS^xo3hOoobz!=nM1_{FLFf{-#9YGT_M{jQ!m>O7uR(+zXGc*8o+|a~8OM^f{ zNcI|nSK)&M5%wCIVYEw34Z#aL(9~hp0j5RWsiUZ_va*OIbidNNzC#ukHc~ zBHUtR23p~VCT0ohLZOR+dPk^Y#-R13AR#0>jKTY2K!ON6j4{g>Q)BQ_D>QZBc^@<} zOVAoeR526K%4?7ilD#HI7;Pj|6VUh#x;j(PDqN5t!hI%~dD_$jvmP`x1^4Pu^_qe^ zC}?7sZ4gsaQ&2Y;O&xe97F`UZ9cF4~h#5y_;Qkk?UNaNSI5NX5V@=J>LFswypjFmrV&IkR=whJ0CYl&{u>_hJX1Qi+VSpJ&7U1y?RJ|6Uxn__MQaZ2z zuQLY;BI4J=9JKBhT@2LGMisLJ4~L?O8G=?Vqltm{nxKh+=0-t6NN%wNFJA%)BHUtW z4q6q9B4%b_fKl$685n>D70}cfgN9|$#6YVCKtc$6%?!*i;>gSZytoLY5bhQ;1Mrjv zs+gexXk9Rxm@!7(V`gZK(e5-e1TQE=(`$y&k1{i~#Ax%I8G$DiQ1u!aVZ@P{5oqZd zNEwoUjm$9O$jk`5+z+G>;a?;0JR`aoMjdKq4Bn54s?Hd+C=(=vWUsL)W*ixtVf2~I zj4eTH>p_|kZZQT=0-}nUfc8#+gplko0q>Rs2_p2GfW}-wLdfdOKy$4iK_qqHxqmb< zOVG-9R54RS%s4Uyt@Q^fL$U)@04iXJfp%hm1QGU{T7cH7ql3259AB#2}lcnKYvm<4EW2dbE* z0cIRog2%qm)EQ&OktJrE)y&cyqknE@30~laVxGBy0Y)5|8yJB0vY@F0??6No1Fic3 z2_eG3+yK0&6(k4`19Jn+{-C*`0mfL6g)w+#2#Q_{V@r&Fg@p-b`m-=G0*xP|>NUYk zf1oC{FfX2>I)mdPsKMM=+ED4%A%=Bkr0p6R2rVcaxSy+G< zJEE$y1W%x%i5Y_C>(Ru(`%}@xKJhB;nrX#!p^h^EdGqhD)jYKSpTV`*vxnoC60 zYYJMV01`rSpQ$Nm_a;aX;XYFfjInx4Q}Aj&RCQ+Hc|kNW(EeAD5Rx5c;Qf{$L4+M< zpviNP5VAV(3SN*Pk~#~Fu?I_YL(Dib2T$0c>NPjP7&Est2Q54SDMPZ?+#F-=2AFYV37#=W z)oW=CnrK851Mg2p6Envcd$61wl0|Sh)WaquuO zG%x^fgaHY{!obkLz#M(-!O+0a0DXK2B!)ir08)iMJ_Hg&@7Ed{7-Ed?8iFS4j8NMV zh6aY<)p4lqGcrK$*BTlafwruHlp*=e$QXU>0kqr-w5kE55aC}VGxV_sLjxmA^sxuf z0xa}-2txy7BlNKcLjz-s@peN4V^hpHG6ruPLv@QWc*!cd7<#`JwDt-!j!cZu#~us~ zOiVH3$OL1I+t9$o0yB@@@L$OQ=^>@~AMAA2w~FaxjgMpb7H zUJ`;P20GgTB!py#Id~U7NDyI%IcTvMNC;USc%uhM5J{Z{`q+b^frTOZ*aJumeeA)| zz`_Ky9tPDs3-BI!G%<7Zu?Ir~3-GQBRCSgH=wlCt29}2C{aVlhEzCHwG(n#)Gc>RS zZ@ogZ!yJ9=!O+ma0DXMO(9i(9yb47xXnCRmTAUjifY$7Tlp(?yw8jptPhx0j0Nxk{ zQV0)w(5f&qbn^@i(8vA_4GlqC>p)tO>@WoFWyXy%!r_x%hFjWOobL1O6h_J)QgM(AS?hK44f?ZY4|kiy;sW4_GL&;(84;!?mgs#yLqk*0nI0fzNOqVSp^rTn8k&L@1EQ-lLmzuEG&Hrqj3ZO< zHUp4mgj>wO%azc?Fy=1}4b4CcX+g@6+-GKr-aj`qGz0G~0x3kY!vcNm!O+m$5HpU< zL8r5Tv?AGIZh{#{<`{E^hKA-A=wlBcG4%eqp`itMc_7FVg!?Qo);Jg%T7b`HK~o1> z91Rjea-RjpniE4q3k&qVpP`|pA!Zy|f*10E3`Dra610m6B!py#CHUkNkRXyebM!G3 zLqkjO<~$U2pecIv^2*4-5WRnHXk-9BJqb-OXx9x$2;mkZ1Mr4ikRaSGMh52SeLq7Z zLj&~rP>>jU-_Ov<&=@0*j0{2h(Lh!p*=q>i3JnrO*lTEx-X}3MGBQB#H-f~_`;CT1 zMxc$^AmfniFan<{1rkKqVPuBhw>LC00&i4CQwQELfhuNffZiuDG%^MqSpZUoWUsL? zdY{D5$QXQF0Z1XjEyiZ(eG)?>V@veDy`hnb0ca}&s$LT#^uE2JkqP+ZH#Bt^eNICo z6U?@jm$CI%0`%d zPD3Me%(k+Tg&}&M)6mEQv#o4|+2=GgvH-0HM01}7MxWEr$O5yiY=qh8G&HirY%3dC zV)Qu;jVv+S%0^iFoJN+IZDnHvL-g?%Lt_K*`eu+v;CaT_0JQ%RB!mciV*?ZPH3^2s z2H?%;AcaVJEin3=#)bwMdC(Zt3PEeb85@Fj27`=4veyt}?T4YUp*i~44M+@qT)@!S z$N+up#?aWv5Pe+0(AWrkmLJGsgg=ZxJ6S;KLix)PZ-Ap^BLpVDveSO+W{)fRrKG zYhsMi=QK6}AJ_s?h;WOE8AhMe*u)Ye9~qm1_idr-H8sMFBUA9%muTuR#xV_zO)9rHt*CaGfetMJ2_c1n8OGeKp|Kgp+^nIonI%TM-PjDg4G&}> zBCO1fFzQfabI=hoAZ1AQnwz4Jy@E!SF~*FH%`w*78X8+*_SK9nz(*f|EJ3&hbG?9} zu_bsf8k#y|%s8?H?U4p4Lvphv_-GT5Ad(%J<$;L-cnchgIuio}^f7%y6U;GvLlXng z2>>9i2zyNoz=zL(1mX6Y7=VutK@~GJK%ZkaG%+;5=%<(%f{xn(X+^Tb&=`HL+|a}j zbKJ+o5M#}Rp@|`Qrzyxlg!_yPFvhP;jEvC77!6H~j4{e96Huj$R&JOWfe+W-| z!7}z`VuG>$%Fx6FWBrw(i3xb$G^$%nL8n}TgplIb6f<9frV=dB!`T#L9kQW`Dfnar zkb#K!HN}`CH8e59m?JebF*CyGi<_94f;PRPnrCK;F(zYT20pt2O&$0=0#q?`@D?UC zG0ZlNi8;nNx}k|V#u_w36LatZBxvS=PmDknvjFcZLl?u$=N2aDb9aU&7MOiR6D)m1 z6AO%aVnY*4jCBeiG0c2!2|B?7~n`hXN7;@1*YFQM51J~{_g46-j5O$>Z21DcpI#yEqiA!a|>)DUyL$I zt%ji~=9(vv7)CxfH3A*21#$`^oIy(i(8udcjljp5ffT~S+0+QLO=D_=*`_fy#@N$f zXo@*62@=Doe@%_S2hO3|YmC`XHZ=wxUVy63!~nF>6HN?bAB&->3FerasR`zoo2dzA z+rrcYW8IgbsR{VR091QTjWFg(OieNNbr^z{a-x^Jrly$fI#W~dsUT=}V9d=LnwnwE z&4R=*^0}!Q#$FynQ#0^sil}y&fzNG069b>SfhuMW-qwdMhLO)rv5eoFnq#beGc+~F zSVL-PY7Rav1=S7<@J>rKG0=IyAR(kQZefB^pPO2kV&-!T@M%aO&4_ewfiXXAXljYE z&co2u61>|HRj;K9WZd36!7;8VwO)$s$%uO)I`piu*))^U^n_{fj1Bqeeb8}N;^!?L@=BA(%7(vcMieFRk z@x35HMEsh94`4+T!yIoiH^ZEZHaEkZi#9jI*biZ7ZicZR0wjj9HpScwd{`H%Tg(kG z#`Mk2jWEWG&CM~#JI&3(M_{9whdI_~ZjP~L(a;=ozcVOzV9bq~TNq=s+s!S&=a{3~ zYXLrZ8chs*3Ld%`WW=(wc<<#=1>I3j>Vx&xRHT;L`y?n&D~E0yI;MR)$#^V(hav zv@ir6%>~kmWUrwqMtyE!2tNH2q!7st%(XohMwn}REQ~Prml;|ZVeBt6v@il4?*y^} z$t_0U16x6Y2z!mdCv2jM8H11HK^Mcw=N878^S>6x7;C@{EsQbNfE!vETVT}Z7AD|h zl~C<90UwKlCI&iF6eNV?Hxm<#cDscM_!wl6LWF-!FxNL(fHs_>$FC{I9y>z|Q;fZ; zh8CtK81=b@DdzmIg(>*(VN|!6fzL8S7sHqXw=lz;1Gg~4SO;%tVTQ2}!_dMEd^|L& z9p(lY<8T({1{nF=!W?tnz{1=Zqup*{4nF=J%?|JZ-e_W&^S>4r82fcW%Of!6r!6cn z=fEv2Fz3K6EWn4ZquOf$KI{=y%+dgKavz!)=6V_nOJj_7yM-mjo-RWROYpJyXy$>B z=tLL8sLw48jL`QF8d@5Ft~~&0MWk^{1Moc@4w}CAU!M9I8Qk);vlnj%XhjD2l}mPVj+ z_&~-Xxz7lEKL|(=VXqPRY+`gVjQZTt7<^0>sybuPeM}%BBs+{T=YK7YG1i_NS{h@l zJqL+lwA(FB3_)iWf-FI}*#vwt6q=X`Mtu&N7RLyC6Yvq>XnHZ%Rau&1u1~Zy1)tu9 zsuwhfhgSYsnwntbb4$?R5{5ePsoJRKfd)O$)tP}0R6|pTIR|cOhOz$M(9#TJ9}7qf zqup)^>b#)aYYskI6xCjHV~llkmgbI0A* zPuS2BR5_x%&jNIkI7lm!y`VxHLml|S0gyt3TP(oGoT7?ZVy*+Qv;+{nPd2z}q8k%0l|S_qIneGb}{ z06OOo)ed8fHSb0S#u)2(K+FF?M?|9PHNiM{!N|Y_bQ>E;8B+Y3fR2~N5JPXbgH{)V zj+z50M1+9}_`GsdF;k3nk)YKt==Hggfhoq`NFxJN(0QaFfx6GjH+;6p@F?KKCV`-mn6 zItd>ngyc7K6ZCewk%2k*+7FOIgx}0D)`l7xSbz_LMO9~ku|L$vzyf@WCYm}dVPJtV z?`LFSVUE6U(a69O+v5`5tZNFh87 zK%0`#^Om830s7ut(9%`(y#Pjr1{mYipiwFGI?Bipb6>O(cq0K?{so=!idOF%ffl%< zwe>(^=xe7zBl_rjDU3jC{4xAyh;fFR5onFSIl5bnFwU7UGBm;%TQUNz@yBqpkvaMr zB_l&4OZ5FhMux^1>qd+~3&}9tYz)3-7d76D&CvJCfR+uTukA51G{)!$7#W&i>`6B= zG{IOyWdvF{g5ft4j5$6dLlca>1xAJ@mgxJzKw{`)Mn;CFM(FK7BSTYT^t}&8hNc*2 z7V%A%ri8Ty2n_8l;`!_N)!&rX`5<{QkGcv?n&u;{pOfW@HFJ>0#d&!Ip%`o~O zMuz5~yGub)iO8#l<{0N{7#W&_Z#x7jMC4U-jCIIHhUOUat44-a<}Y=m}AUi8yT5noQY**WDdT~9b^e2t(jwt*BKd^gD?I=Q-`s)*~rKOW6ugm41Fzx zk&y+)dL$zg6O4WNMrH;WV`N6=1{muxjVwU3Xo&bNDN4-DNiE_6oeu4pmzEDYff;(a veNcXWi2~@bvGN=?k=s+hBP?#Xp3yC=my|0!A?)4+7kJYK<}fo&4oF9u(hhk*{g zufCtIw3&15NFR$(`A4x20qT{;*X`0wlKp>uxOM&Eul@Vmt{WVY|9AR%{q18fe}4Qw zCI0`v?7Q>q`(A&Dy8hXwe}9+uy=`AjWe*$7t^fP_`q%jQ<3)cH|3|$u`2Xu`ef{6} z^}k>Lk2eaxX)y2hkL%C*|9{^9PwM}#{OkY!-Cw`)@2vlSe~F(q{PR_Q|FYCtUGb_J z|7LCbYZ`0cd-F7^{Tpg~qZiE&+^apM&wTse?@P@0YjA^$PoS zTkNI3_f0RZzOKD$`3_C_fO@UGOU{p73n$y(-kV3=QKlVh$8~hhBfB810 zdf5&``D=%Faa@_-{xxCWzX;o-y&q5h3ND;1C#Byt`_IisVi%&1vzy6&&X(0LpBI`R zEBAa?kyCzMulSo7{dM{AH9tRDt^U&SB6t19U%5MXJkDOV?B2JXpW>=|t6zt{UHq%K zcGZlFzn_HdeQbL6dc8!3?a{qo@68o{_xt_{hq~KRBx9XVJU$pSx}srhS#!{wj9znOVP2ht}DJ`n=H0 zyBZzu{+C}mcm5+b+vn*H`BL+iM4vl+YkI29e1*oh!FN`b+w^L#S-vAQzut;F-F)Hl z9ggpr3V*KKd2oKt9*?{Z@d*FI?*8a&^DqDK>6#R$o&GquX!X52%WEgzS+(8fFWYSX zNzz}gB|bPNJWKjd9Ht^@giP-ez7L}&Znia?=$1qe|x&+V_t^+`Sf^!ck&|NFGU|q|KERg@}21Sf7!SF zQ!#%z@uMa*tgcG`>UqBZmFe!A-+YQD%iWCg&Rb=_$$rwE3GWO3FW+%=yY&Y9?d~eC zbc^Tzi!JK@Z~LGo{LYg0ZRuUnUvF6|@7Nm#3etMXYr%H}^f%c1&#e#RyS@GOzia0> zH&B?$GRWg z`+7aqKBmZd&xU_noYxx0t(ns+esXP9@ch3?C)ZYOejB~`n`YjH2^hpKkJ%h%0I zte>~-|AVjJ4qlt<@mp`5&HBWr1$J|`*+2Vy@J;g9Zzs<+vi!bg_j~1U#WyRec5j${ z;r9L?#jlIwoQs;}K#ArL=kvq=RR8z+{an5y^!=7fvseB{d8-QcXypBzq~37P@a0zl z?e?#1d;gc8sl7ItJ^KHiwngt(y8P6vztxz%;@i7T5_|pgE=BM7T{tUx(OvCwdxzrH zan?TkuQl_oZvHBMZGPA6FBd8T@2tAc_kQ;d)h{C7uT_7VbnW+(Fx%+k$$wYw@Z<+a z`J1Wy&3CtZJiSrteAf4$%U7oBH`AZK=DfFE;?};9P3O0+p8IE~T-p7Tuh&M;|95c5 z$@$UqYdXH|{517U`RUE2+kS6%Tpugj`ZoK{67!<(`KIRE^j{y?tG-}oq0PZpnt7+# zufQDg;(KSt$WOTwQE$AfZrKh) zyXStdOC#T}48JzND|+7%!I=8om3B9;pSt+<%g*HOy>r|5m28>(wRIi$ zUY|T~_tT{D@BAlfd%r2Kxn8GpF|WwhyJ&S>^pU2opy0j5hzRxVTPr6Y)m^xJN9cOq zc?q^h*H*bpt8e-ja%V~VvF=A|_1{jh@0WXd%Dw1saM5D>NZaS<6XsvGKJfGR)jGT9 zVvB08ttHaiiw{6E$0tI1%%olVko*xpT#SK~zh@~Z<$YcJ%5t)ZSgSw!sOqUGPS=JKfLhw{)VrT^?Y@IFW=rf>G@I- z^KF>Lv`9D5=^3(C8@7vQi(rr~5!>Me8d>-Jw?nZ8%AiM_UY z(md_?JHFR7%TBhQ|MV@}*Jq`f-*sP2{oq}-{_o*E=gvPVp39$SvtnoH`FCqKfojlW zW$*61QTrld{_3ha`>U!GJg+6qe-$%cXE!xJ#=Uy^4%H*NuR&GM_4sx6d|Tok-~0Og zPIb!HTgSC0*{_{**8b?)s<)37K{@V<^V`k+k6nJpSZ2+C61Ml`BaW-VccR}{`ZJuh zKiONAQLVf4;`|&?))aC-P?40^{r>aAeb1krKHvEJUdyv-^S^iAYo7K~=HOq3lWVKq z8nI;0f8w^6`Hx(DE&EeRe!1n+=k;@C4^9=X%C+5eEAeq`cpcxH-zRn7#s1U1ocCD6 zNM2?8tF0ex)-2z#{oZFj-kb9>^R6i0&OY1wPvy7r+1`(bUTNlW7M=!I)fRGB?tJ<@ zuR_{=VbyY(^S_JC{`*9J%>Z+c9 zzxI#Kq_65bJ@c!3udm;7eoO7??ER05Uzq-0uJv2-hVn@_zWEg9 z*MG~j55K#g|J%8%JloUf-&xWAZTlqYzny*RDyZ@Iq#~~9{kP9^|7@7I*In#y=F^;i znt4Beu6z8sPh3iWlJwVr-^a=#Rc@v~T~pf?edxPVBq+Om>l2?O+si|ub# z1m5|i+Sl;4=zHzDryD-&FO>NsxAs}s-ka}Ao9+u=yR$0&K5x?7;5$po3!Zm2*_%uA zv+eDbu0QwgxBJEU3+GtdEA9+kugaJ+|52Fj?{)0i^B>i{X#Dx%tX;U@vE{$*JUhg{ z>)B?_e^U3N@T>Yx)mwXuKbN2Nt=jwQ{CEC)c_I3H>>s`5M{U`UNCaP$1oPPbUKgIXw zI^GsPx%O*$*{lEO^#9IZ9e!p0w|z-H;^BSAx*vtvet#z&Ro@l;b(TfW{6}iGM)&vH z|E+4gu6#Xy+vWAwcmA=ijcWoq<@~fg2F zy01VPbnhqqC%+Z1&1BqLEAsl0>a@u})pv&GZ~Mk`HTce|?LSHt^zN&IJih(K*OdJ7 zY@vjDv%D_xko--5+ZSyA68ZjS_+9%SpW><%|KF9zUG&lA+V$*b?N6?)YQAw? z=?mLl`!b%oIVYZi+6kZ*$rFE2;dqpLmHErBVe;D-*k9i|H+ufLqwlPLetP`mp7oVG ztFE6@_kVuk?)po2R$aGS#CUu8j==MOd|u35|CP!As$IEUaqMm7h7Gl#wo7u^hIx;| z_Li-?chmQUX5OXQJAYTqlKy-0Sofo26^UO(wjbG{`ZvxUI5@7YilZeQ^9aLKZN8Mo(ob3h8I&v$Q& ze|le`ck)10xOLId6Z=$uudBTLJHY6*Kd6-Y=b6V@w)ySyM{2g4{;jKg6TrT+`qJm8 zE9^zTUwb{N9+cFU8b$&H1Ou)t5?@z)q z`dzcXocQW^viG0M^X-$Ozw%|5{}Z%LH@DnB_0E#^Z~R@eU-7?{7cqZk4JysISue3a zzpY>L^ZT6lO`G0!KMC8r^L*8&Ct-WH%|Ep*ebVeNC%*XwA1i@r0r4NjdvaY?u_~^`RC;+P*Zo+_OCbnr`}n$eS58cn1A8w zIP3L{zoFeC>AxqRHG`wkZ0~*j&r8z(eeIl{JL5^+@Nr2vuEUeQvb2nVD&dy+0+FtJLo*GWjpE{Z;PyAFO@iM}4bS)c!Ws^ZK^4=!)IZwVz)eeAICT)N!!2 zOaAN+?I3(om(-sWz3<4y``4q-t*s3&kX-Yx=I5So7mf3-X1`ZBXZ*9)>*U_I)$i>O zRK1(tiwmA^j;|GBsIN!Z@ck|n#UKn>fj^9%PLZhMuPcg5IVxazHKqrm*td$aqV zH9u3cEwa(ysd|g|*z#v?wq|kP^grHIdzhgs2Ib7UFUf{LHq`#jtH3n$Cn+~?EXcYdYsxrDvj_6t2u&HJsL^Vc%3 z$N#r&#NKWFlip~t*YW}kEv+~)sRk{1SWY2r&{rvd(ca6%LZ7l zFU~Kqt0`K2@6Vj;?O#RApEAEXzwQ2vFKgzUEkC-pYWdmZ0NbN$e~0GUPnGre$h)Kr z3Tyk5|6+@R_bjN&op1Zfa`(wUx1W{Gw|vs9ul_i=c=f#p*FSEkxOiuk`R}hf0r?vX zcfam;vb-@bGw*8jQ7fi}+fRM%%)Pg}=eeo*tBH?0bM21o_{ zy+s;Sh*V|l(RurKf`tC*Yu_qw{JNdH@6qR4%Ux&WP0U|y{CDT5&HGEy?PllPzg|0e zjk^XC%-^s5p7Y(PD$8!~TJQNkrre2M-)jsW%22*7ezNyp%H!a|_p!&x-!~W{yNQxOS=C_+HfI_qND2j|Ho`-~BhUUf+0a{$sbj zOa1G2`gFI@h8d10JqJ*e~jn;m5B zXUF&L*Db2{8#6rL{b*T@!{3$H?Q1P(f$Hl!b}Hb``sPxFA{)h>p8RL+kNW;o`CWd} z_aoEmt$(L3*xp&{oK$=Ln);!i{=eU8RR0SudjIvw@$)O@J()JY^nSW6i><%*PS1WD zeVv^r=Rc{;IO+SbXv4>!Cv^?;AdYyi?D1~z{|{$oN7zQM@BUZv6x3n=xikFQ(>?p1 zsM%iG7kmHxho>uQckkPubl@-?9s@(75=cZM6#IN32WxlOa zV^%%59F78w)>KRcHM#!nySHh}cZ<7$Z-h>{7wio!ULCi4`j$R*as64oM#prYkm zyMNx*+rPfNpCtX6@$2)O@2p*I!~34?eiF9Vb4zi{y(PEL7k_*0aHqnlXtLbQdQhAB z+xtnFM)w z%ZxvMI@w!w`iIQIl&?L~e|P#M)NAiFjEk^6s;ih63F@0m&s$u(0o-d^qrb80?eD)Q z=ZBqpHviGR_l$O*qs`((%wJ9Xw)XIaXWQ@D#rxe_4r;PlIDtFD&$g%hgLh$4AW8Ap z@2by>o}E>lGWoIp*}Y%VPTLpRtk`*V-^#Vj3#+=1cF)iMRaCTZ(azBI=YMsBGWTcu zv%OVMst)dvNt*lSQndT+?P{OFasPA1vuO$D(x7pL6BUu_vh!bOz4puao4f7aNB>_eeCcy_|A&s z+w_-PJTH3rcC!8PgD>B{n=`Y2dhO=gluiF+%wK)Aj5n8GY}0S_zWr=Cq&$1>J}LUE zpJBez7e8D1&F=*_R!xdd+6&5VE84&DPl7Zw?tQ%Uc+c!-$7&M(TE6_bR@?n^Y|-j_ zO1CVX@-M!9zVTP7LLRKl>HX*OyZmJDN2k|2f9}2pEf?Pc6~jl?0)@umh@lGclH^1J)qvccSkgMz~aDP`?G7SqNC%JzWVKq ze{=fgAM2-e|7&j9N}0rg`itM@ZqAF3vCO`|=JWe4zg5Jv{Hz!KsVCmPg6dU7mgOeQQmT_a9rg54JlCE3ZYXTW7`H z|C}+|G2HKk=DWXjC#sDsZU&}0`4>*Eq`pe60r! zk$pBk+VJ=0j?niN_e>ig6(^|p0F`H-o*($?zVF|gQxQGq=hplOHE!-L-+S-x@A>!M zHB0Mf=B=>@4UW`o0=XJ8ezR={>oMWe?~Y%5ue;;7?auEh7p5{-O^W`iX3ux*8?%Y| zt?l#Q{H~dQN9a$_E8SfAU2#Wim)Bj2zWH6oey3;upLvU(Ow0K0x9|VT9j0-|mS2jn zJ=y!S0o1ILlhmIC9*bYM|6u+4b4M?7oI9>!{?hlspRl4}yEAwGO?{<zZIo-EypU5fmygk-8Z5OB7CL|KijA^XLDYdo}oub=?HnSCoXIqdw7i}NpgJlhR!ri*NE*^&Bp<&MDoobY)M|772}J^#E7@72wqe*8Ka zaG&t)K4EFlxIx74u)F(q6kXdF`uu*{YX?xewvA?Y`s`n{SngJwcitCuX?@VxAgFPg zb2;PYow`De`v<+&JP+-gyZz!F3H>$m9)XIj%*O{; zq(9C1eQA=-HvPOg9j|s4#&0-3b@AKoC({i2lHSfPseXGbeNAnb^w$eD9sjm`)A=VC z^ZVts>ZCmpmeKWQ|9ZZrKXwc`-#fkUYQ6kI-LM7UADfuJY`kyG`)%j@nZG_NtV(~M zeC%hlzWVd+lcMYPy?$}-Ytd)XlWVK;_I2J`zQePBj{I8h=>I+7sVT*{Tf3iuy63jh z>D&Bc1gpAce+ett>sK_{{@~|(vu3|>{_I$2|7F8x;aRi)bZ!I1_Y>7Q^$Y)jihp*U zo6k>OtO>ZYD*gAToZpLfJbiAx?!BXA_I&X0YLmTg+@tr5@7T9^zc-Alv5c(0t#YmK z{m-=N|1vVC#~%LM5Owd`%#&X|POhywmlp!+d0%_i@Ld<=o#*AIpuySvsdrYTKY#vT za_`Ch+Z#U5nDu*M``zzX?}XHI@3^nOQ}ccxxVx(O_vN$X#Jbm~*$e)<7QO!&AIy`LOi_iS(MFZ+|aiSy201EoRG zD9=yfv->^!<7@UVs_K%y?hGFBS3WL0N&5Qq09*U}UtUMn*}1K|?wNPV`s7#fqrR_& z*>~<+vLo|fT}jk=t9@(I=gz&h*>CSW*M0Ms?z}kv$?q+*K*rb}1r?Q-&nN$_WQ+Hk zXFvJQ4*9-$?i259v1Qu2WuV!#--~u=#$EXQt84bPY7iy;wd!fS&3gMUlJh&`xtysY>OH3i>t_x&#}+%oa++DFH} zrN;jLvi+Fvw~5aes+u2FU-|s=`QMkPFMjWTqxyDp{rnSm^JPwapP=&nTJ<|){wKd} zC(ZtH;%~@F-+wIkPhY+x^m^)*$#*_|*1J4eeFdn~yYPLwCTQBL$A12|9FOh8be-jQH?RM-Cfi@p4_&#UkJueZ~a|Bu{^XKeMms$Bm{ zK0f-X@#^F|6ZpaX=!wtORm`{Qr`T24e&2iW0$;=Z;>&lIn3rdrPrEK3xj(}GEZ;u+ zg*(6*%=c&Cui(P&_sb)GgY;~;r*8h#`lbI#P?ffB|AhLvkB-W5@BcTy_I{n@?I&kI z1LU*6YCF5%e?idSJ@f5UUnL!HaIGA1JpphP*Hg2Z|LRP{nw*o z?;QI2Jum)RVddNDN9>;cm=k~5w0?%4m7TQt&GuK8c^l48?N6wF_C~sF`@L6hKKa$-XzxFj&xzme zciZIbO}}@0LF&wdzd1ld5w+7n0vbsFn(*~a?ZcD3)1NJt-BkFrW!|G{KdN=^{D>;H|FYxH zWK;92_nFT1tC&Bv zUbTFO>Ne{Y_Py4>e$MYcU&wxZ_ay1B%NniEzk6$(*W(|QzxMH>>cU-h?K{7^f3?1E zpS<MK@%lyc_SqM}a{{luXU+b@xvo6}8e%=s;Camh-&~8| z|H{7a>;6^j_qpm1%eCD<`xmah_bq4Jfsc!Jc=B&uKli>bbOfww`BCmwpn+7&AA6pF z7BqmT$Umt|fhwINf(yd;M+ftl$Ne;)v#$2$?Y$M@=U&)WihYf-tf)7>@%&vr+wXwA z+x|~~Q~Y%Am!{gc0gN&AU9-P<{O&80SG-mJ^zd&1X3#>0_fqHMBh6!fn&;f9RXFQg z#a>?TT0GhQWW~fgLa#-y2H)9TpYfIf-gf*sNxkKs#;ub=rvvM?-mNWf)-^FUnWlyQePy>buhXio*BF>uz6sc9Z#s9B5GH zv*jK3*P3~6@84dmcrGu=X5kJ`{+fEH;>q?0zpI;kzn1;>fc?VfZ`s~|&wke~S61&@ z9Q-#I+^Vf{2Q@Fs+P^G+yZ`*8ptOQSO)L zf1P_*ZLjz0ZS5^kui?S(pjpvh`Rw&rKRXt#j;nsdb}blGE`M46M9p^7-zj&V_;2|e za>v^4{H_;9m#eyFe`5Ud-0XJU;(Yto+EpwuHx^Hch-Gj-}c6XW_V>7)-2!gy}IH3*$VLT9?$+i z_hy0u^S=G0JFs|MVSn59*pll~(l_jmf)kVRS>LJ*I}LEX3tF~w_4d5ui=Zv`%Xag` zzP^dk2e$&R*d5iqm}dl#7y=9^I=tzk5N- zo{YRp%#T5N@nS{b9TEM4nz|zIp6E;SzX^U@a$PU{5F{RN+y@2aef6L_zin54(|d7d zU;0(71jQ-9@ubZu4lQ~6aOFZ$a)a|Z?3pWr)B&WqOQ z`xi~FeekRMnVRjEy>U-#jBogEyFO|5C;qF!cZ6;;g3B+^0+A>FCh{WYH$kh4rs=<} z@c;d5i~iR=S3aM+^zzhu%HLc5JmmDj&q1JO^aq>WPt@x3 zVyc(z)Qk(*YnIU-H~pJNN( z|EiuJ3>w-y%KhrRn2M?V8@o07@0W_ddcR?h%iondzE^5qU)KbhhGwrWe+913b07T8 z1dVHgnqA;oh@X?xWkKWaXOf$*u5J8g=cOTU{jyhV{^r{2T-QLe_mciG&bfK}ly-XZ z@3CLI^W^*oe+|$2e$%~Etut%(mjk~oXU+b@32O2@^^QCAbNZ|G{(B;ROMY2amdA2! z^FPIB^R?X{AN^A~@7-_4eKo3|V+)i2ZmjB({@g#OKl5FC-1Kix?_ zN6VXvKF8NqeY2BaWzPRLCTYX@>EADX{JY7)&remqWc|Hu`6X~o_xrq^<6d)vo;$y5X3hSh zwgH^`Kh!Fn1(h{tA7|gYS1AAJbKUm$E%*Dc+!3nhFR1k_w*Ru@$CNv}?O$Em=kdhtOY@U&FPZi2;2X`uuiby3 zsw?{O(zVn5rGNaJ^i0k6!{6+)zW-SEKVQ33GtOggw#+xV^Xm0}wV(Wp-v3+g{SVas zm5V?85wvLO&%Hg*)an=g1Qj85&qV)En73K_Ec?;ks^16RhJ!|GUYkeMxBWZuRCTra z%YS#bTCcIsotqQ=_s_wp{12)cqwS6JV(gv2-r4023-MCPF#p2GRoBdl?%%(1X9@eh z_ywTU@>^;aXeNI1chjVrcXK~E7J5fKPkQZN`1qIPs^_=X{{8S;cwLR+_19}`jq`HO z2iS_YAGC|V=Y9V6^G_{TgYVqf_a=M(x1&2e^Odiwi*n%+JG%$%uJ>)O>XQDw|M82<|0T^|&P~~; zo%iLr<%Z|ncHq(7?DI)~BljP?HviGFZ=m7K-l}h&o?+*AY}~u8tRZ)O^6#X-Y^#^= z*tj1wgyOkA*zU+5Za_!@fU+TZstgd~ZD)si>RnIg1_o^mIe|aT3 z{d@3l*|(ef7j6FLnRg-i?c}=G3(ftv*Z%(euVydTi!a-r|NU8|`th#{XoaO`zWO)o zmV58st*+dCyMKfI?f%g9p;Bv>?=by;%Nmm1Cw^4gd2+t?4F0(D_rHHFY`LRf_iFvt zbkFlsx2tb@Sd(!lq<+P`r_H_x7um1>R6hCmt@Jw~^~@XP_5N7ycz^t7S;CtuasB)D zmi=sar3p@#pp_sM6Ysq6?~cAU-%wr$G!N|i_VkAuE`e*s&()nQKh>IE+_&TRqJ^>! z_g)LVJ^kkR{B<&x|24n-`MziG-PfOA3f!3ATYdfh@7+Zk<~>?g;Ru=x$jhu_WIYGKB{{&&(FW;w7C7@k1zM@zdCmCu+y9MHGS)QrEmK`vpskI+pYb_ zC0~Ksh9UJQs;!jb?o?YX+;jOyvB%?|Y34<7fj^9oEbslCxz|6h>%8CR#V^js{e18# z|H5DE;{X0z^xyr9*Kj`<&uv@&&+3M);P(Ube}6x(dH4CJr*mUYy=wiK_c!m5ZRfpXAI(4Sx4%01&MNco8~uwG z-}|upcSZf0>vI3Ss>14e*E{|O&B^-LfU3)@*7M8QxA_+?mXp>$H^1)x!T)mmZ@>Q$ zym#|nX4%I_r!M{qT1is5Z#ExjS!8tl@u$x-_n-Ry+#NJvEEiSZCH=Q^+kEic$?W-_ z)t8KSU;JZz`}>Vxy9i6^`CZXXH;_|=Av8(|t&3S7i zcjeBi?Hs!~_de~mU;Ag(sqg!fL9;I>k3H8q{&`{j=HkD-+bZU<>7s|o`0>`cfR|ocGmny zVSBf&<9)4}chx$_#vc?UUoZTMW|KZ&{d?NQXYQaleD!sc{+4ua>oY8`Eq~wn&gN`s zIWK;i{oa~U?YwAbc3;%|8275} z+xnwi_Ljako;Ur@iuPyoH|sySUv!FGJzl!k zn)P`1qhp_KGxmU{*&n-tmYMwuz9aN%Yxo`)TkHFWe+3uXf7vx>y3srLJq^!I@9Y$Q z?_ZwBa@PK&@AJR|6+4&Qs!F+%Eid2lHuz4(Ki1rM&~oaZpc(#*ecpMTUvFv0ExLE( z==@o~7hZq*CnzI6X>U{2yFZtfofrQ5t?se>Yt6hX%AfDve*XFHe9+uYqWj(V`SSV+ zUscTKsVm(EwP92KdFFjlzqQXJkMrxPZRuUo=XY;>I}@~OD^6v5%}L>Jd#*fr_qeq< zBwc=QK>fcM;Z@6beEcIcyB@T9_?v4XWaXTM{)&0l_|7Wx zn|tQ-PUB+VW53yWRV5|4xIWq!hIL z@{;mx<9fNA@6Y4g>>gL1?0tSP;P-@>TwIA*YSzgguwY+z6K)u$xcDV{UpF;abOHWtM zp1}Wa&c&P0{{(F~KYy{6_1yEHK0Z3%xv*;Xo%1)pEj<5g-IK7rWg0CY&)jrBw*1Mp zU)lH9H+^<2^j;IbsdnO>40-AK?Q)<|sjq)3S1x#d&UEhFbKbQVlRxKQ`>p-^R(k!> z+uL{jj@dWoj{NQZvVP?o*I(9L`}VZv+OvCtPPdIu`c|dv15H27;*UR<{Lm=U2QsZvN+l+tWWM%&so)I=esie1DB)RQVJ>PBqKC}G~Dw0#~-%z)EuK(V0Q&m}?>9zUR z_q#x=qduPm4gP;V1X`GRN%`}^xtHgbiR-W1Gd-?jdT~}=+E)?tedj?rRn68YPR0C} z@L6`y#O14>pJ(j*cgXVW-pfDF$If4`{5ZJy@=vQv`wF-Hy!h|wo|pGt?#a9$onu$l z@R|K&Z&k{^?7T1PQu>pko%U`5xpw!)e<62D_VM+Cr=MDE*Gv3;dCqWA)wjHu6ZZA% zCR~|)>v-0rdD`l){fiz~N^jbK6_n4mf)*b|*2ljsewy<8(YfrFio*9X8$rWa$!~-2 z2)%i?O#IdPbHWRMZaA~czUXPj-=D?K`~Karwq7!C{(k*`zkBQA_BTJyKI!}UyI)mV zh<06mlH`G(6XW%7e64D<^*#1V_uuc{yx8iWcfZ^Hj{r3oSynIKQMk9^>+(m-zH%Db z-Th;Bn)6pPZx6qiSF+K03Y1%;PNd{&o5O>)xucbI+Qi&)@o5#lPzLHT9<2ck^_j>ho%q zUhORH_WQ96}P?u+d4e)tu%2%h_T>emk{Fa@(I(*(a_pn7Gw9Nq_6(jlx@flbWTZRL@O5{aW4Xc}leQzu#HU z{~FGeQC&Abv>zXC*N7oe#?CA`po}t-XF_e z^x@uyrnlM4MJLsU-8;Q6p#Gd)NPb+ryJ^J0NJo^JxyL;8|Sk&D)cYWVK9i9c3+0KGip4EX z_O+Io^Pm5!ncudvS2z;X9@~1`Zo|AsaaGCI3tG3$pC$eE!Y}FQ2`ay%j5ht7a%aW$ z({}gg`Ch(~y6@539c^v)H&k!B_dQ>pIsNg$m$R1FPW%7*dOg$re4a$E)Vvhvp1;(* z6wp>dQ=+#FnwglQY#Dqz*L$6e=j6H1V_1(fX$ihR&Lt(VpmB++$pWz!d$zm6x%&?r z8{d(uT(rug&hMYY<_0E@$9tc*%$)u6@SQt<>+65ckN@}A`}>UDb@9K}-(6h&FTMUp z{Qpl&|Npvw{{R2`)Aw=xKR*4Rq3_-6|No~-JU_l;&Zd9a`}z7)@0|a?Pi}cl?VG

    9=yZ-M_+2~nZrMib3P2-(Yk)p;To>*Po%?s_q`0PTO`eC z*E#!(wA|s6e}&7wuHJDmK44#EbX#@|mRa?{Sg zH1zLRe>3IF?CHnjR)n|Y*Ymvo{CIKQ>t8Rr_n+BNC$#;;+y1qGQX798cS?VC{w>}a z{iE%5d!k)ybxWD+Z{yC{Uz8umK60y9{CO;|rswlb-(~-D-fTNw^l$0>OuN?VPhbBo z-jZs+;qCH5WqHZ>Qr|hs+y00xo=`~O?`uWd7py& zZU0B}Y93!{^M53^@8GfWOYtgsPnZ zwgZ!QQRDWWA{hH?%cgi=|s^&ccg@9VU;?HkCFN!L^%lx-_j4*EF3l4%|FrO*QeppW3&tO9_dd-xRjp^SyakSy-XCRW&A*wwSNrSw z$j$Cbyh`2{_1F5l&rD~xSNeIZ_=5K9jZ^qP7J(!l-afjk>A~%%RjISsqU|UA(=1e$ zzg4%rCOFo7;kPL}TJv)^)m_*zk$>y+OSa1T>KmvkZBKZ-(Hiy{p7X!eSc--U+RC>lsR==ec#Uc^N-0| zh1vI3f8vdu{P#npOm>~-r`-OPXRT1Z=8L`ofGcIb|35g=5pKrk=(-A z=%3zCqTg71RD0by!roUeW&V@4iVv*}D{CBU= zX8G}~xVB{5Zx1}r zzTNEiU#ag;ZvR&M{ScfA^a>Z-UaXj~!#yK>n*T$weeYgQVct`}q)=J@mA=sT9i765 z;>Av1Z>@;9wdT0WyN{_am#MvG?~VR(&AnV}cix))Aa8HGe~EwE`J&(T-ut^M%@1xr z^|NL|^T!2+-1k#{s!s8LsAhL%-eep8D{KC$?XBNE=k<*9l_CeXpZIyxDA)H_cCYl$ zh-$4n$~Sg~{$|}*xVcnHl3&RDmHWDWle|yjlitsH68H0bg1@@^W5-AHYM#e;6;@aL zcYG|iZ{^9lImdcyGHm92UYcF={cCC5y)OM9r+-dYs}b6Mqd0$(|Fs_YY@u6pcnC4c=-fhqov z#O$o6XaAnSGXGF-4X7l@@V^#cR=Mxgc1R}3dYy@y3C{g|U^<`UTS?Kh{1rc!3e;bY zcwG>%uZaJ!<^9;=J=K;sL3v~6U*&>5S9hr2&-%@>qE5*CX{P%R;&z}$U zpV~EwJ)VE0w`N71(07ii?T@(MZa=$CkL7XV=jU(d*2VR0yKi^;=aFl=zQ4}r22>tb zJ`w$q^{?CM^sSFR|J&3%P2BbG(mB@uUu^GFP=78gwf)0c-(SYP)t^kQ{_ndxr~dx4 zjh?lQ$9ij4)SsJuXaCnvVKoQsrZ|*Pu&gxHVy(fQkd@N>n zT6)rF<6h~X7k*6Mad93f1-{VNn195!>HeZ`I?rpb{&@E!$0lOmx!=#vIU*0jXzi0p7 zXEi&nOMmt61Qpz%A~<^18}qC?C)$5?AF<7Q#PUG8bl;uR(H~oXSYH>N|9c(-B!Dh! zy=LD#=g#?yJJj#nn9StQx^rmzt$mU!L9%Q1TU77*TK$8s;O{ z(X;mayYqK{{@Z-9(x(6Q>(=jX&w0O}{q)q)USIud@eW6O_4KdBm9G}W&;GOZc<--` zzxmH!J!l*s{(05u80QBZpH}YnIsHj8?}_zthWDDHr_*;#T)%#$+O+cp%=cG*GG+Zy zxbNmCtA&5(>=B)Rxb~{}p3g5d<{!&VKVK@pzEJPR<+|n^?3wfCyh+~ff1msM-^WiY|9d*<_xZ#E-8Nx!u$$$gUvu2<{!&oTN`xp(z_p7|cGu={ednk$fBgAl!dKgz zKfZrU<-MQGepRb#aKDT*`S;DA%Gbbk#s8$-v`Y*LHna$bBoO`VyFREI+}&u zw%6T0Zn$^k@T2RZ@9!)B5XpO_{QNqo8tk=io&9I>ljye9^Yr`p{qA+?Z@C|IpR@U~ z<3q81JI~exJQCaI`oi~vuKBkZsjc_po+m2GKYEh!$Ma5++``?jv=aWls%_Z#S4RG^ z{^hc#@%KurPe-iR>-;G`nYl*jd&m7iZ>EI5T6vFNcm7%a;Pv0SzO~_gme=cqzL(DX zH0%AQ8ZPsn+*#+V>SMP&4|va=^mX!%*7f(^vwhaQGb29f?aBgSd8v9X^P8LFJh^Uf zezfmX^YuSZpMS92tDdyq>qc?W@6foo{)B@yqUKxWE$uw+h`iUBf5 zXHU+XEx+8MTIt6Qx{@TkDelFYP;aTJ7cWn2O+K-|3O+W1lh2?YnCHXI%W4T}U zSU-4n#q=HSfB1^*Gzx{~E$>eSRl=L=ChS=McTV>F_NT!+PR4swpZgluB2gcAuj~Bw z`#HbYtguzhyHlU=QzY+Bd?MJJpe9X<|0es%J5I(2*tJ&QIpTTxNA^?wuYcm-tbe}M zw_dGKSpHU>-~J1Adh6Xj>DHb-&;ECs+s~y>)%J@#owMKLj`AztW6ei=Yf^r%Z9b>I ze)9R?qPOaW!tvUFYi!nZKRq9?&-b}<_-*y{w<`<$?RHO}_Y@S^-z!V>{;7b{!)GD$ zo0HFM_qro~|95-6(EQ7@&%F1#bHx4Id?E9#@{;d`%#T{%+OKg(`J43$+vD0Vf^2+p zznQD%J#v2R_)sn|e~SM@IrFl%pH4OwdjsnOcXaai?)U6}9|x6S`|-{1dHMFGXaD#- zQnNFW6Ulp+J!SpvyicW1_g>4M*Z)cLj`B9`O#jZ=Kcar7cYNP_wrfe5K`)%Ah`^SZUJ`dHZ7u9fm-?8y?|L3XI z>#qL0e{H3W&cWrMcSoC>olMWXbI9EE<$065N6e4?AFEY2{p~)cTT_l zw#+Kt>W#}ML1B4v zUWSdvoh9;8@43G3czHbfmHT)7GP|$0#J4GbJO263kL7b7Nay{yQ+`He{vqEQ;fMN7 z`JcX;6|Xg(<@RBpUgz&s=XZT-)0uzB_g~Yk&HKcK{-$pHEW4tv`)K5o&9&ktaw_ix z_c!;jch3HC;@jjMt@&H4IWK+--m$)FrMCUSPnvh0=r6HlkDl)H?_X!#_PT~W^-hoE z&KED)D(~=9ZriKgyitZ{GL2qP!@?{=E2~%jYI8`lwgf|J?GX zRo;RcuJ0A|nEzdw{UAE;&CV^E_R%@6|7CRg5B%yrWIOM9@ZCMUJ?x;E{1&|9;=DEW zTF_Q^f5AVot;>)2);#&4UO0LGf|{~=kB;_2u|m%eXRYqJueNr0?Egs34wOE&s7v#I z_O*%Fy$NL5z5kVWAD_7u{1B2zKZ#E|KR251wWz-OW5-8w|7xqv?y2uSZvCVCvGd={ zJu`m1xhFCW)L=6L1>#q?pCa!HlhbGD|5$!mx|h9G`sa;`fE^d->C8W5oA>6Aa*g_- zlh^0}^?rC``TD>2ZdM2R?bA`-X#cIsfAReG=f7&>_s!e)^Tp}kSx;>>)!pyM7gqKB zUFrVwx#}m&pZ(k8>-84t|DE>hz59go&qWey{!M&peCN=1n``M`=70LQ@m#<@zsF+x z-d3^jT=ReEX1Ccm=ls)+;(vdwiJ!XopCxbUYr`MQColfho4q&4{>SqjYx>unD4%h@ zfII%Kdc#kVyo~*YH`mp%fAw#l{i94TeqG^W+wcOLOFIJhZ;g9+;8psL&h>evhiXL4 zZ*D%unR9;jkK~^+c^US%;_ZHIu6#AecCCGJ(U!l<)_(uC=9jPZspSRS_iKEW66{)~ z{~UeU`^$UN^2z68{&pYp{kA5U@5Ve)^Pk+H-11_3?i?)Y&9&gZi1} z1a07;HSIqISI_@`USWOsoV1z6`bIg~R9H&#Uru=6|MT1Iw!5DeEwD9xchdZu z*n1UF2P_-?~nX(y-{5L@%a<)<5#z5 z-MLZsq+&^7@}9+@F3VrO68C_9?z?J9QXR& zi657DxbDAr@4fqvd++!Eu3VOFudjZ4y~M{==^wu7%x=8?t0Tw0clM71-#|ssito23 zKAs3F!S3sy29;FnR@jQ>JyAZ+-Yfmq^V@Z)?H?jz6;CfONVb{qP3QfemH#%+iO)2Y zzp`Wf=NR2*-cshDHhv4);a=fB>5F)8bxXNQq+M$@i+$G9`4{J%%Rl&Y-Lc+pDSv|> zZtG|d{}=q+()r)zs}KMD_~Qy?GSn<{U$MQgCS&i}wEp(CDrtT7*MTN^4_AMU%-Gv| zOt)t14t{Xr-E>dw#^tNGTi!Fg&Ye@=Rwey>e#YM3%ldD=S6fE@UsT8)zgM5}S@4d9 ze=k%?gZx(|4f4XZ+ZlIO$VcWcE){ESm2Zj4zc=^2!}Zzg)~UUC z{zTxuyRFxL|Gx9D;(ygXxaKZp{xLT^_|UJ=I|2F3A8W7NZuthvI5D*z7tUYxU-0e9 z4);HOogMZI=YKx0AiwkL#ACc)%`$8r+cY4t+qzbsPxQsy5UKdvjBZ2R2(XHV_Yw~>X;d(ZkmDz4JM^UMFS+P<$+N{Rcr zX5ZqM={L#iDxc*4NN(eO$2UI%^M!x;tGoa95C1Rpg}Z2j{pB4C@3HmT_e#IYRoK^G zHTyyxs3X2Qo#R`{@4p$pGw&Q>-!>oQycZQq3Y}{?&cM^uBj)4my|dqNe!DJZe&zN7 za5et!I}cCSWg`-k4}1|C{_genR-3(>t@U$Sd0ZGR)8 zcRSi5-lKkxUR*WT^k1*nM?ai*=e>DTS_6}~f%ZM^cnaDK4;o!auN z7c?V$AL@L}+*H5kS2O?3-@*RIe9@|ryS$(Nx;piPNZxFNHk09pXGKi_r$sL zdLPPL{`5_#|Hi@CzI5a3H93Yn;lhE>KF2AGz(5tu%W* zIe-3N!{p1-Pbcp<-aEIxM#}hY?OwLDy$_=grk}96|LpepkGV_gp3Zt`ocDXp{Os@$ z`{Ubr!_uDr^x^w__sC(lWAWjapIx@tmD{*)e^$<1nFpW-gUEfy7v?dyXHHzd`lZke z|A%7xiq~kRFEH4*egB|FPL@0<(%57qv={QP%op2q#$|BK%E zyh#81>A||6d}VPR$=Qqkij}`T>i=C_UA{BfzbSu9vj5Wf+W$*W+%Nk#&E)cx{L&@H z{(sJy1W)ySe>L)N@b{>r_O8E$T;umi_nh9<>9O7iYivx;y`+{6F>eN4F>Z zQx5pOe(n5kZQr?4TF>AAyDa3`_lRG+gCzfdje013=k6=_`rXyh<^TD-|CfD#_kQ

    CYE$HXQP;dGW^U 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +ON +OFF +RevE light +RevE light + + + + + + + +V+ +VCC ++UB + + + + + + + + + + +This is an unsupported development version, and NOT YET FUNCTIONAL! + + + + + +<b>Ceramic Chip Capacitor KEMET 1206 reflow solder</b><p> +Metric Code Size 3216 + + + + +>NAME +>VALUE + + + + +<b>Ceramic Chip Capacitor KEMET 0603 reflow solder</b><p> +Metric Code Size 1608 + + + + +>NAME +>VALUE + + + + +<b>RESISTOR</b> + + + + + + + + +>NAME +>VALUE + + + + + +<b>RESISTOR</b><p> +MELF 0.10 W + + + + + + + + +>NAME +>VALUE + + + + + +<b>RESISTOR</b> + + + + + + + + +>NAME +>VALUE + + + + + +<b>CAPACITOR</b> + + + + + + + + +>NAME +>VALUE + + + + + +<b>INDUCTOR</b> + + + + + + + + +>NAME +>VALUE + + + + + +<b>RESISTOR</b><p> +MELF 0.25 W + + + + + + + + +>NAME +>VALUE + + + + + + + + + +<b>Small Outline Transistor; 6 leads</b><p> +Philips Semiconductors, SOT363.pdf + + + + + + + + + + + +>NAME +>VALUE + + + + + + + + +<B>DIODE</B> + + + + + + + +>NAME +>VALUE + + + + + + + + + +<b>SOT-23</b> + + + + + + + +>NAME +>VALUE + + + + + + + + + +<b>SOT-23</b> + + + + + + + +>NAME +>VALUE + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + + + + +<b>Trimm capacitor</b> AVX + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + + + + + + +<b>Thin Quad Flat Pack</b><p> +package type TQ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + + + + + + + + + + + +<b>SMT SC70-5</b><p> +SOT353 - Philips Semiconductors<br> +Source: http://www.semiconductors.philips.com/acrobat_download/datasheets/74HC_HCT1G66_3.pdf + + + + + + + + + +>NAME +>VALUE + + + + + + + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + + + + +<b>Small Outline Diode</b> + + + + + + +>NAME +>VALUE + + + + + + + +<b>LEDs</b><p> +<author>Created by librarian@cadsoft.de</author><br> +Extended by Federico Battaglin <author>&lt;federico.rd@fdpinternational.com&gt;</author> with DUOLED + + +<b>CHIPLED</b><p> +Source: http://www.osram.convergy.de/ ... LG_LY Q971.pdf + + + + + + + +>NAME +>VALUE + + + + + + + + + + + + + + + + + +<b>Small Outline Transistor; 6 leads</b><p> +Philips Semiconductors, SOT363.pdf + + + + + + + + + + + +>NAME +>VALUE + + + + + + + + + + + + +<b>Small Outline Transistor</b> + + + + + + + + + + + + +>NAME +>VALUE + + + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + + + + + +<b>SMALL OUTLINE TRANSISTOR</b><p> +reflow soldering + + + + + + + + + + + +>NAME +>VALUE + + + + + + + + +<b>Test Pins/Pads</b><p> +Cream on SMD OFF.<br> +new: Attribute TP_SIGNAL_NAME<br> +<author>Created by librarian@cadsoft.de</author> + + +<b>TEST PAD</b> + +>NAME +>VALUE +>TP_SIGNAL_NAME + + +<b>TEST PAD</b> + +>NAME +>VALUE +>TP_SIGNAL_NAME + + + + + + + + + + + + + +<b>Dirty Cheap Dirty Board Design Rules</b> +<br> +<br>Min width/Spacing: 5/5mil +<br>Min diameter of finished hole 12mil + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/RevE-light/EAGLE/RevE-light.sch b/RevE-light/EAGLE/RevE-light.sch new file mode 100644 index 0000000..2d92e3a --- /dev/null +++ b/RevE-light/EAGLE/RevE-light.sch @@ -0,0 +1,12624 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +<b>RESISTOR</b> + + + + + + + + +>NAME +>VALUE + + + + + +<b>RESISTOR</b> + + + + + + + + +>NAME +>VALUE + + + + + +<b>RESISTOR</b><p> + + + + + + + + +>NAME +>VALUE + + + + + +<b>RESISTOR</b> wave soldering<p> + + + + + + + + +>NAME +>VALUE + + + + + +<b>RESISTOR</b> + + + + + + + + +>NAME +>VALUE + + + + + +<b>RESISTOR</b> + + + + + + + + +>NAME +>VALUE + + + + + +<b>RESISTOR</b><p> +wave soldering + + + + + + + + +>NAME +>VALUE + + + + + +<b>RESISTOR</b> + + + + + + + + +>NAME +>VALUE + + + + + +<b>RESISTOR</b><p> +wave soldering + + + + + + + + +>NAME +>VALUE + + + + + +<b>RESISTOR</b> + + + + + + + + +>NAME +>VALUE + + + + +<b>RESISTOR</b><p> +wave soldering + + + + + + + + +>NAME +>VALUE + + + + +<b>RESISTOR</b> + + + + + + + + +>NAME +>VALUE + + + + + +<b>RESISTOR</b><p> +wave soldering + + + + + + + + +>NAME +>VALUE + + + + + +<b>RESISTOR</b> + + + + + + + + +>NAME +>VALUE + + + + + +<b>RESISTOR</b><p> +wave soldering + + + + + + + + +>NAME +>VALUE + + + + + +<b>RESISTOR</b> + + + + + + + + +>NAME +>VALUE + + + + + +<b>RESISTOR</b><p> +wave soldering + + + + + + + + +>NAME +>VALUE + + + + + +<b>RESISTOR</b> + + + + + + + + +>NAME +>VALUE + + + + + +<b>RESISTOR</b><p> +wave soldering + + + + + + + + +>NAME +>VALUE + + + + + +<b>RESISTOR</b> + + + + + + + + +>NAME +>VALUE + + + + + +<b>RESISTOR</b><p> +wave soldering + + + + + + + + +>NAME +>VALUE + + + + + +<b>RESISTOR</b><p> +Source: http://download.siliconexpert.com/pdfs/2005/02/24/Semi_Ap/2/VSH/Resistor/dcrcwfre.pdf + + + + + + + + +>NAME +>VALUE + + + + + +<b>RESISTOR</b> wave soldering<p> +Source: http://download.siliconexpert.com/pdfs/2005/02/24/Semi_Ap/2/VSH/Resistor/dcrcwfre.pdf + + + + + + + + +>NAME +>VALUE + + + + + +<b>RESISTOR</b><p> +MELF 0.10 W + + + + + + + + +>NAME +>VALUE + + + + + +<b>RESISTOR</b><p> +MELF 0.25 W + + + + + + + + +>NAME +>VALUE + + + + + +<b>RESISTOR</b><p> +MELF 0.12 W + + + + + + + + +>NAME +>VALUE + + + + + +<b>RESISTOR</b><p> +MELF 0.10 W + + + + + + + + +>NAME +>VALUE + + + + + +<b>RESISTOR</b><p> +MELF 0.25 W + + + + + + + + +>NAME +>VALUE + + + + + +<b>RESISTOR</b><p> +MELF 0.25 W + + + + + + + + +>NAME +>VALUE + + + + + +<b>RESISTOR</b><p> +MELF 0.12 W + + + + + + + + +>NAME +>VALUE + + + + + +<b>RESISTOR</b><p> +MELF 0.25 W + + + + + + + + +>NAME +>VALUE + + + + + +<b>RESISTOR</b><p> +type 0204, grid 5 mm + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + +<b>RESISTOR</b><p> +type 0204, grid 7.5 mm + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + +<b>RESISTOR</b><p> +type 0204, grid 2.5 mm + + + + + + +>NAME +>VALUE + + +<b>RESISTOR</b><p> +type 0207, grid 10 mm + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + +<b>RESISTOR</b><p> +type 0207, grid 12 mm + + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + + + +<b>RESISTOR</b><p> +type 0207, grid 15mm + + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + + + +<b>RESISTOR</b><p> +type 0207, grid 2.5 mm + + + + + + + +>NAME +>VALUE + + +<b>RESISTOR</b><p> +type 0207, grid 5 mm + + + + + + + +>NAME +>VALUE + + +<b>RESISTOR</b><p> +type 0207, grid 7.5 mm + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + +<b>RESISTOR</b><p> +type 0309, grid 10mm + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + +<b>RESISTOR</b><p> +type 0309, grid 12.5 mm + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + +<b>RESISTOR</b><p> +type 0309, grid 2.5 mm + + + + + + +>NAME +>VALUE + + + + + +<b>RESISTOR</b><p> +type 0411, grid 12.5 mm + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + +<b>RESISTOR</b><p> +type 0411, grid 15 mm + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + +<b>RESISTOR</b><p> +type 0411, grid 3.81 mm + + + + + + +>NAME +>VALUE + + + +<b>RESISTOR</b><p> +type 0414, grid 15 mm + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + +<b>RESISTOR</b><p> +type 0414, grid 5 mm + + + + + + +>NAME +>VALUE + + + +<b>RESISTOR</b><p> +type 0617, grid 17.5 mm + + + + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + +<b>RESISTOR</b><p> +type 0617, grid 22.5 mm + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + +<b>RESISTOR</b><p> +type 0617, grid 5 mm + + + + + + +>NAME +>VALUE + + + +<b>RESISTOR</b><p> +type 0922, grid 22.5 mm + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + + + +<b>RESISTOR</b><p> +type 0613, grid 5 mm + + + + + + +>NAME +>VALUE + + + +<b>RESISTOR</b><p> +type 0613, grid 15 mm + + + + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + +<b>RESISTOR</b><p> +type 0817, grid 22.5 mm + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE +0817 + + + + +<b>RESISTOR</b><p> +type 0817, grid 6.35 mm + + + + + + +>NAME +>VALUE +0817 + + + +<b>RESISTOR</b><p> +type V234, grid 12.5 mm + + + + + + + + + + + + +>NAME +>VALUE + + + + +<b>RESISTOR</b><p> +type V235, grid 17.78 mm + + + + + + + + + + + + +>NAME +>VALUE + + + + +<b>RESISTOR</b><p> +type V526-0, grid 2.5 mm + + + + + + + + + + +>NAME +>VALUE + + +<b>CECC Size RC2211</b> Reflow Soldering<p> +source Beyschlag + + + + + + +>NAME +>VALUE + + +<b>CECC Size RC2211</b> Wave Soldering<p> +source Beyschlag + + + + + + +>NAME +>VALUE + + +<b>CECC Size RC3715</b> Reflow Soldering<p> +source Beyschlag + + + + + + + + +>NAME +>VALUE + + +<b>CECC Size RC3715</b> Wave Soldering<p> +source Beyschlag + + + + + + + + +>NAME +>VALUE + + +<b>CECC Size RC6123</b> Reflow Soldering<p> +source Beyschlag + + + + + + + + +>NAME +>VALUE + + +<b>CECC Size RC6123</b> Wave Soldering<p> +source Beyschlag + + + + + + + + +>NAME +>VALUE + + +<b>RESISTOR</b><p> +type 0922, grid 7.5 mm + + + + + + +>NAME +>VALUE +0922 + + + +<b>RESISTOR</b><p> +type RDH, grid 15 mm + + + + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE +RDH + + + + +<b>Mini MELF 0102 Axial</b> + + + + +>NAME +>VALUE + + + +<b>RESISTOR</b> chip<p> +Source: http://www.vishay.com/docs/20008/dcrcw.pdf + + +>NAME +>VALUE + + + + + +<b>Bulk Metal® Foil Technology</b>, Tubular Axial Lead Resistors, Meets or Exceeds MIL-R-39005 Requirements<p> +MIL SIZE RBR52<br> +Source: VISHAY .. vta56.pdf + + + + + + + + + + +>NAME +>VALUE + + + + +<b>Bulk Metal® Foil Technology</b>, Tubular Axial Lead Resistors, Meets or Exceeds MIL-R-39005 Requirements<p> +MIL SIZE RBR53<br> +Source: VISHAY .. vta56.pdf + + + + + + + + + + +>NAME +>VALUE + + + + +<b>Bulk Metal® Foil Technology</b>, Tubular Axial Lead Resistors, Meets or Exceeds MIL-R-39005 Requirements<p> +MIL SIZE RBR54<br> +Source: VISHAY .. vta56.pdf + + + + + + + + + + +>NAME +>VALUE + + + + +<b>Bulk Metal® Foil Technology</b>, Tubular Axial Lead Resistors, Meets or Exceeds MIL-R-39005 Requirements<p> +MIL SIZE RBR55<br> +Source: VISHAY .. vta56.pdf + + + + + + + + + + +>NAME +>VALUE + + + + +<b>Bulk Metal® Foil Technology</b>, Tubular Axial Lead Resistors, Meets or Exceeds MIL-R-39005 Requirements<p> +MIL SIZE RBR56<br> +Source: VISHAY .. vta56.pdf + + + + + + + + + + +>NAME +>VALUE + + + + +<b>Bulk Metal® Foil Technology</b>, Tubular Axial Lead Resistors, Meets or Exceeds MIL-R-39005 Requirements<p> +MIL SIZE RNC55<br> +Source: VISHAY .. vta56.pdf + + + + + + + + +>NAME +>VALUE + + + + +<b>Bulk Metal® Foil Technology</b>, Tubular Axial Lead Resistors, Meets or Exceeds MIL-R-39005 Requirements<p> +MIL SIZE RNC60<br> +Source: VISHAY .. vta56.pdf + + + + + + + + +>NAME +>VALUE + + + + +<b>Package 4527</b><p> +Source: http://www.vishay.com/docs/31059/wsrhigh.pdf + + + + + + +>NAME +>VALUE + + +<b>Wirewound Resistors, Precision Power</b><p> +Source: VISHAY wscwsn.pdf + + + + + + + + + + +>NAME +>VALUE + + +<b>Wirewound Resistors, Precision Power</b><p> +Source: VISHAY wscwsn.pdf + + + + + + +>NAME +>VALUE + + +<b>Wirewound Resistors, Precision Power</b><p> +Source: VISHAY wscwsn.pdf + + + + + + + + + + +>NAME +>VALUE + + +<b>Wirewound Resistors, Precision Power</b><p> +Source: VISHAY wscwsn.pdf + + + + + + + + + + +>NAME +>VALUE + + +<b>Wirewound Resistors, Precision Power</b><p> +Source: VISHAY wscwsn.pdf + + + + + + +>NAME +>VALUE + + +<b>Wirewound Resistors, Precision Power</b><p> +Source: VISHAY wscwsn.pdf + + + + + + +>NAME +>VALUE + + +<b>CRCW1218 Thick Film, Rectangular Chip Resistors</b><p> +Source: http://www.vishay.com .. dcrcw.pdf + + + + +>NAME +>VALUE + + + + +<b>CAPACITOR</b> + + + + + + + + +>NAME +>VALUE + + + + + +<b>CAPACITOR</b> + + + + + + + + +>NAME +>VALUE + + + + + +<b>CAPACITOR</b> + + + + + + + + +>NAME +>VALUE + + + + + +<b>CAPACITOR</b><p> + + + + + + + + +>NAME +>VALUE + + + + + +<b>CAPACITOR</b> + + + + + + + + +>NAME +>VALUE + + + + + +<b>CAPACITOR</b> + + + + + + + + +>NAME +>VALUE + + + + + +<b>CAPACITOR</b> + + + + + + + + +>NAME +>VALUE + + + + + +<b>CAPACITOR</b> + + + + + + + + +>NAME +>VALUE + + + + + +<b>CAPACITOR</b> + + + + + + + + +>NAME +>VALUE + + + + + +<b>CAPACITOR</b> + + + + + + + + +>NAME +>VALUE + + + + + +<b>CAPACITOR</b> + + + + + + + + +>NAME +>VALUE + + + + + +<b>CAPACITOR</b> + + + + + + + + +>NAME +>VALUE + + + + + +<b>CAPACITOR</b> + + + + + + + + +>NAME +>VALUE + + + + + +<b>CAPACITOR</b> + + + + + + + + +>NAME +>VALUE + + + + + +<b>CAPACITOR</b><p> +grid 2.5 mm, outline 2.4 x 4.4 mm + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 2.5 mm, outline 2.5 x 5 mm + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 2.5 mm, outline 3 x 5 mm + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 2.5 mm, outline 4 x 5 mm + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 2.5 mm, outline 5 x 5 mm + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 2.5 mm, outline 6 x 5 mm + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 2.5 mm + 5 mm, outline 2.4 x 7 mm + + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 2.5 + 5 mm, outline 2.5 x 7.5 mm + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 2.5 + 5 mm, outline 3.5 x 7.5 mm + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 2.5 + 5 mm, outline 4.5 x 7.5 mm + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 2.5 + 5 mm, outline 5.5 x 7.5 mm + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 5 mm, outline 2.4 x 4.4 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + +<b>CAPACITOR</b><p> +grid 5 mm, outline 2.5 x 7.5 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 5 mm, outline 4.5 x 7.5 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 5 mm, outline 3 x 7.5 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 5 mm, outline 5 x 7.5 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 5 mm, outline 5.5 x 7.5 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 5 mm, outline 7.5 x 7.5 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +Horizontal, grid 5 mm, outline 7.5 x 7.5 mm + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + +<b>CAPACITOR</b><p> +grid 7.5 mm, outline 3.2 x 10.3 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 7.5 mm, outline 4.2 x 10.3 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 7.5 mm, outline 5.2 x 10.6 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 10.2 mm, outline 4.3 x 13.3 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 10.2 mm, outline 5.4 x 13.3 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 10.2 mm, outline 6.4 x 13.3 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 10.2 mm + 15.2 mm, outline 6.2 x 18.4 mm + + + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 15 mm, outline 5.4 x 18.3 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 15 mm, outline 6.4 x 18.3 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 15 mm, outline 7.2 x 18.3 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 15 mm, outline 8.4 x 18.3 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 15 mm, outline 9.1 x 18.2 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 22.5 mm, outline 6.2 x 26.8 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 22.5 mm, outline 7.4 x 26.8 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 22.5 mm, outline 8.7 x 26.8 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 22.5 mm, outline 10.8 x 26.8 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 22.5 mm, outline 11.3 x 26.8 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 27.5 mm, outline 9.3 x 31.6 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 27.5 mm, outline 11.3 x 31.6 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 27.5 mm, outline 13.4 x 31.6 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 27.5 mm, outline 20.5 x 31.6 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 32.5 mm, outline 13.7 x 37.4 mm + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 32.5 mm, outline 16.2 x 37.4 mm + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 32.5 mm, outline 18.2 x 37.4 mm + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 37.5 mm, outline 19.2 x 41.8 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 37.5 mm, outline 20.3 x 41.8 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 5 mm, outline 3.5 x 7.5 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 37.5 mm, outline 15.5 x 41.8 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 7.5 mm, outline 6.3 x 10.6 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 27.5 mm, outline 15.4 x 31.6 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 27.5 mm, outline 17.3 x 31.6 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>Ceramic Chip Capacitor KEMET 0204 reflow solder</b><p> +Metric Code Size 1005 + + + + +>NAME +>VALUE + + + + +<b>Ceramic Chip Capacitor KEMET 0603 reflow solder</b><p> +Metric Code Size 1608 + + + + +>NAME +>VALUE + + + + +<b>Ceramic Chip Capacitor KEMET 0805 reflow solder</b><p> +Metric Code Size 2012 + + + + +>NAME +>VALUE + + + + +<b>Ceramic Chip Capacitor KEMET 1206 reflow solder</b><p> +Metric Code Size 3216 + + + + +>NAME +>VALUE + + + + +<b>Ceramic Chip Capacitor KEMET 1210 reflow solder</b><p> +Metric Code Size 3225 + + + + +>NAME +>VALUE + + + + +<b>Ceramic Chip Capacitor KEMET 1812 reflow solder</b><p> +Metric Code Size 4532 + + + + +>NAME +>VALUE + + + + +<b>Ceramic Chip Capacitor KEMET 1825 reflow solder</b><p> +Metric Code Size 4564 + + + + +>NAME +>VALUE + + + + +<b>Ceramic Chip Capacitor KEMET 2220 reflow solder</b><p>Metric Code Size 5650 + + + + +>NAME +>VALUE + + + + +<b>Ceramic Chip Capacitor KEMET 2225 reflow solder</b><p>Metric Code Size 5664 + + + + +>NAME +>VALUE + + + + +<b> </b><p> +Source: http://www.vishay.com/docs/10129/hpc0201a.pdf + + +>NAME +>VALUE + + + +Source: http://www.avxcorp.com/docs/catalogs/cx5r.pdf + + +>NAME +>VALUE + + + + + + +<b>INDUCTOR</b> + + + + + + + + +>NAME +>VALUE + + + + + +<b>INDUCTOR</b><p> +precision wire wound + + + + + + + + + + + +>NAME +>VALUE + + + + + +<b>INDUCTOR</b> + + + + + + + + +>NAME +>VALUE + + + + + +<b>INDUCTOR</b><p> +molded + + + + + + + + + + + + +>NAME +>VALUE + + + +<b>INDUCTOR</b><p> +precision wire wound + + + + + + + + + + + + + +>NAME +>VALUE + + + +<b>INDUCTOR</b><p> +molded + + + + + + + + + + + + +>NAME +>VALUE + + + +<b>INDUCTOR</b><p> +molded + + + + + + + + + + + + +>NAME +>VALUE + + + +<b>INDUCTOR</b> + + + + + + + + +>NAME +>VALUE + + + + + +<b>INDUCTOR</b><p> +molded + + + + + + + + + + + + +>NAME +>VALUE + + + +<b>INDUCTOR</b><p> +precision wire wound + + + + + + + + + + + + + +>NAME +>VALUE + + + +<b>INDUCTOR</b><p> +precision wire wound + + + + + + + + + + + + + + + +>NAME +>VALUE + + + +<b>INDUCTOR</b><p> +molded + + + + + + + + + + + + +>NAME +>VALUE + + + +<b>INDUCTOR</b><p> +molded + + + + + + + + + + + + +>NAME +>VALUE + + + +<b>INDUCTOR</b><p> +chip + + + + +>NAME +>VALUE + + + + +<b>Inductor</b><p> +Source: TJ-Serie Vishay.pdf + + + + + + + + + + +>NAME +>VALUE + + +<b>Inductor</b><p> +Source: TJ-Serie Vishay.pdf + + + +>NAME +>VALUE + + +<b>Inductor</b><p> +Source: TJ-Serie Vishay.pdf + + + + + + +>NAME +>VALUE + + +<b>Inductor</b><p> +Source: TJ-Serie Vishay.pdf + + + +>NAME +>VALUE + + +<b>Inductor</b><p> +Source: TJ-Serie Vishay.pdf + + + + + + +>NAME +>VALUE + + +<b>Inductor</b><p> +Source: TJ-Serie Vishay.pdf + + + +>NAME +>VALUE + + +<b>Inductor</b><p> +Source: TJ-Serie Vishay.pdf + + + + + + +>NAME +>VALUE + + +<b>Inductor</b><p> +Source: TJ-Serie Vishay.pdf + + + +>NAME +>VALUE + + +<b>Inductor</b><p> +Source: TJ-Serie Vishay.pdf + + + + + + +>NAME +>VALUE + + +<b>Inductor</b><p> +Source: TJ-Serie Vishay.pdf + + + +>NAME +>VALUE + + +<b>Inductor</b><p> +Source: TJ-Serie Vishay.pdf + + + + + + +>NAME +>VALUE + + +<b>Inductor</b><p> +Source: TJ-Serie Vishay.pdf + + + +>NAME +>VALUE + + +<b>Inductor</b><p> +Source: TJ-Serie Vishay.pdf + + + + + + +>NAME +>VALUE + + +<b>Inductor</b><p> +Source: TJ-Serie Vishay.pdf + + + +>NAME +>VALUE + + +<b>POWER-CHOKE WE-TPC</b><p> +Würth Elektronik, Partnumber: 744053220<br> +Source: WE-TPC 744053220.pdf + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>newport components</b> 2200 Serie RM 12.7 mm<p> +Miniatur Axial Lead Inductors<br> +Source: www.rsonline.de<br> +Order code 240-517 + + + + + + + + +>NAME +>VALUE + + +<b>newport components</b> 2200 Serie RM 15.24 mm<p> +Miniatur Axial Lead Inductors<br> +Source: www.rsonline.de<br> +Order code 240-517 + + + + + + + + +>NAME +>VALUE + + +<b>newport components</b> 2200 Serie RM 11.43 mm<p> +Miniatur Axial Lead Inductors<br> +Source: www.rsonline.de<br> +Order code 240-517 + + + + + + + + +>NAME +>VALUE + + +<b>POWER INDUCTORS</b> (SMT Type)<p> +Source: www.sumida.com/products/pdf/CEP125.pdf + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>NIS02 Chip Inductor</b><p> +Source: http://www.niccomp.com/Catalog/nis.pdf + + +>NAME +>VALUE + + + + + + +<b>PIS 2826</b> Inductor<p> +Source: http://www.stetco.com/products/inductors/pdf/PIS2816.pdf + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<B>Vishay Dale Inductor</b><p> +Source: www.vishay.com .. ir.pdf + + + + + + + + + + + + +>NAME +>VALUE + + + + +<B>Vishay Dale Inductor</b><p> +Source: www.vishay.com .. ir.pdf + + + + + + + + + + + + +>NAME +>VALUE + + + + +<B>Vishay Dale Inductor</b><p> +Source: www.vishay.com .. irf.pdf + + + + + + + + + + + + +>NAME +>VALUE + + + + +<B>Vishay Dale Inductor</b><p> +Source: www.vishay.com .. irf.pdf + + + + + + + + + + + + +>NAME +>VALUE + + + + +<B>Vishay Dale Inductor</b><p> +Source: www.vishay.com .. irf24.pdf + + + + + + + + + + + + + + +>NAME +>VALUE + + + + +<B>Vishay Dale Inductor</b><p> +Source: www.vishay.com .. irf36.pdf + + + + + + + + + + + + + + +>NAME +>VALUE + + + + +<B>Vishay Dale Inductor</b><p> +Source: www.vishay.com .. irf46.pdf + + + + + + + + + + + + +>NAME +>VALUE + + + + +<b>TAYO YUDEN Inductor</b><p> +Source: je999f5.pdf + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + +<b>TAYO YUDEN Inductor</b><p> +Source: je999f5.pdf + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + +<b>TAYO YUDEN Inductor</b><p> +Source: je999f5.pdf + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + +<b>TAYO YUDEN Inductor</b><p> +Source: je999f5.pdf + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + +<b>TAYO YUDEN Inductor</b><p> +Source: je999f5.pdf + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + +<b>TAYO YUDEN Inductor</b><p> +Source: je999f5.pdf + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + +<b>TAYO YUDEN Inductor</b><p> +Source: je999f5.pdf + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + +<b>Axial Conformal Coated Inductor</b><p> +Source: TOP MAGNETICS CORPORATION .. tfi.pdf + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + +<b>Axial Conformal Coated Inductor</b><p> +Source: TOP MAGNETICS CORPORATION .. tfi.pdf + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + +<b>Axial Conformal Coated Inductor</b><p> +Source: TOP MAGNETICS CORPORATION .. tfi.pdf + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + +<b>Axial Conformal Coated Inductor</b><p> +Source: TOP MAGNETICS CORPORATION .. tfi.pdf + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + +<b>Axial Conformal Coated Inductor</b><p> +Source: TOP MAGNETICS CORPORATION .. tfi.pdf + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + +<b>CAPACITOR</b> + + + + + + + + +>NAME +>VALUE + + + + + +<b>CAPACITOR</b> + + + + + + + + +>NAME +>VALUE + + + + + +<b>Chip Monolithic Ceramic Capacitors</b> Medium Voltage High Capacitance for General Use<p> +Source: http://www.murata.com .. GRM43DR72E224KW01.pdf + + + + + + +>NAME +>VALUE + + + + + + + + + + +>NAME +>VALUE + + + + + + +>NAME +>VALUE + + + + + + +>NAME +>VALUE + + + + + + + +<B>INDUCTOR</B>, European symbol + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +<B>RESISTOR</B>, European symbol + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +<B>CAPACITOR</B>, European symbol + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +>VALUE + + + + + +>VALUE + + + + + +<b>SUPPLY SYMBOL</b> + + + + + + + + + + + + +<b>SUPPLY SYMBOL</b> + + + + + + + + + + + + + + + + +<b>SOT143 / SOT143B Reflow soldering</b><p> +Source: Philips SC01_Mounting_1996.pdf / BAS70_1PS7XSB70_SER_8.pdf + + + + + + + + +>NAME +>VALUE + + + + + + +<b>Small Outline Transistor; 6 leads</b><p> +Philips Semiconductors, SOT363.pdf + + + + + + + + + + + +>NAME +>VALUE + + + + + + + + +<b>SOT 666 Reflow soldering foorprint</b><p> +Source: Philips - BAS70_1PS7XSB70_SER_8.pdf + + + + + + + + + + + +>NAME +>VALUE + + + + + + + + +<B>DIODE</B><p> +diameter 2 mm, horizontal, grid 10.16mm + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + + +<B>DIODE</B><p> +diameter 2.54 mm, horizontal, grid 10.16 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + + +<B>DIODE</B><p> +diameter 3.5 mm, horizontal, grid 15.24 mm + + + + + + + + +>NAME +>VALUE + + + + + +<B>DIODE</B><p> +diameter 6.35 mm metall, horizontal, grid 20.32 mm + + + + + + + + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + + +<B>DIODE</B><p> +diameter 4 mm, vertical, grid 10.16 mm + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + + +<B>DIODE</B><p> +diameter 1.8 mm, horizontal, grid 7.62 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + + +<B>DIODE</B><p> +diameter 4.8 mm, vertical, grid 10.16 mm + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + + +<B>DIODE</B><p> +diameter 4.8 mm, vertical, grid 12.7 mm + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + + +<B>DIODE</B><p> +3-lead smd + + + + + + + + + + + + + +>NAME +>VALUE + + + + + +<B>DIODE</B><p> +diameter 3 mm, horizontal, grid 10.16 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + + +<B>DIODE</B><p> +diameter 3 mm, horizontal, grid 12.7 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + + +<b>Z DIODE</b> + + + + + + + + + + + + +>NAME +>VALUE + + +<b>Z DIODE</b> + + + + + + + + + + + + +>NAME +>VALUE + + +<b>Z DIODE</b> + + + + + + + + + + + + +>NAME +>VALUE + + +<b>Z DIODE</b> + + + + + + + + + + + + +>NAME +>VALUE + + +<b>Z DIODE</b> + + + + + + + + + + + + +>NAME +>VALUE + + +<B>DIODE</B><p> +diameter 3 mm, horizontal, grid 12.7 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + + +<B>DIODE</B> + + + + + + + +>NAME +>VALUE + + + + + +<B>DIODE</B> + + + + + + + + + + + +>NAME +>VALUE + + + + + +<b>Small Outline Transistor</b> + + + + + + + + +>NAME +>VALUE + + + + + + + + + + +<B>DIODE</B> + + + + + + + + + +>NAME +>VALUE + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + + + + + + + +>NAME +>VALUE + + + + + + +<b>Silicon Schottky Diodes</b><p> +General-purpose diode for high-speed switching<br> +Source: BAS70_1PS7XSB70_SER_8.pdf + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Z-Diode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +<b>SOT-23</b> + + + + + + + +>NAME +>VALUE + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + + + + + + + +<b>N-CHANNEL MOS FET</b> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +>DRAWING_NAME +>LAST_DATE_TIME +>SHEET +Sheet: + + + + + +<b>FRAME</b><p> +DIN A4, landscape with location and doc. field + + + + + + + + + + + + + + + + +<b>SOT-23</b> + + + + + + + +>NAME +>VALUE + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + + + + + +<b>NPN Transistor</b> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + + + + +>NAME +>VALUE + + + + + + + + + + + + + + + + + + + + + + + + + + + + +<b>Trimm capacitor</b> AVX + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + + + + + + + + + + + + + + + + + + + + + + + + + +<b>Thin Quad Flat Pack</b><p> +package type TQ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + + + + + + + + +>NAME +>VALUE + + + + + + + + +>NAME +>VALUE + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +<b>Plastic Small Outline</b> + + + + + + + + + + + + + +>NAME +>VALUE +CHECK! + + + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +<b>Small Outline Transistor</b><p> +SOT753 - Philips Semiconductors<br> +Source: http://www.semiconductors.philips.com/acrobat_download/datasheets/74HC_HCT1G66_3.pdf + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + + + + +<b>SMT SC70-5</b><p> +SOT353 - Philips Semiconductors<br> +Source: http://www.semiconductors.philips.com/acrobat_download/datasheets/74HC_HCT1G66_3.pdf + + + + + + + + + +>NAME +>VALUE + + + + + + + + + + + +>NAME +>VALUE + + + + + +>NAME +GND +VCC + + + + + + + + +>NAME +>VALUE +e + + + + + + + +2-input <b>AND</b> gate + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +2-input <b>EXCLUSIV-OR</b> gate + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + + + + + + + + + +>NAME +>VALUE + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + + + + + + + + + + + + + + + + + + + + + + + +<b>Small Outline Diode</b> + + + + + + +>NAME +>VALUE + + + + + + + + + + + + + +>NAME +>VALUE + + + + + + + + + + + + + + + + + + + + + + + + +<b>LEDs</b><p> +<author>Created by librarian@cadsoft.de</author><br> +Extended by Federico Battaglin <author>&lt;federico.rd@fdpinternational.com&gt;</author> with DUOLED + + +<b>CHIPLED</b><p> +Source: http://www.osram.convergy.de/ ... LG_LY Q971.pdf + + + + + + + +>NAME +>VALUE + + + + + + + + + + + + + +<b>CHICAGO MINIATURE LAMP, INC.</b><p> +7022X Series SMT LEDs 1206 Package Size + + + + + + + + + + +>NAME +>VALUE + + + + + + + + + +<B>LED</B><p> +5 mm, square, Siemens + + + + + + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + +<B>LED</B><p> +2 x 5 mm, rectangle + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + +<B>LED</B><p> +3 mm, round + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<B>LED</B><p> +5 mm, round + + + + + + + + + + + +>NAME +>VALUE + + +<B>LED</B><p> +1 mm, round, Siemens + + + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + +<B>LED BLOCK</B><p> +1 LED, Siemens + + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + +<b>LED HOLDER</b><p> +Siemens + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>LED HOLDER</b><p> +Siemens + + + + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>LED HOLDER</b><p> +Siemens + + + + + + + + + + + + + + + + + +A+ +K- +>NAME +>VALUE + + + + + +<b>LED HOLDER</b><p> +Siemens + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE ++ +- + + +<B>IR LED</B><p> +infrared emitting diode, Infineon +TO-18, lead spacing 2.54 mm, cathode marking<p> +Inifineon + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<B>IR LED</B><p> +infrared emitting diode, Infineon +TO-18, lead spacing 2.54 mm, cathode marking<p> +Inifineon + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<B>LED</B><p> +rectangle, 5.7 x 3.2 mm + + + + + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<B>IR LED</B><p> +IR transmitter Siemens + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>TOPLED® High-optical Power LED (HOP)</b><p> +Source: http://www.osram.convergy.de/ ... ls_t675.pdf + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE +A +C + + + + + + + +<b>BLUE LINETM Hyper Mini TOPLED® Hyper-Bright LED</b><p> +Source: http://www.osram.convergy.de/ ... LB M676.pdf + + + + + + + + + + + + + + +A +C +>NAME +>VALUE + + + + + + + +<b>Super SIDELED® High-Current LED</b><p> +LG A672, LP A672 <br> +Source: http://www.osram.convergy.de/ ... LG_LP_A672.pdf (2004.05.13) + + + + + + + + + + + + + + + + + + + +C +A +>NAME +>VALUE + + + + + + + +<b>SmartLEDTM Hyper-Bright LED</b><p> +Source: http://www.osram.convergy.de/ ... LA_LO_LS_LY L896.pdf + + + + + + + + +>NAME +>VALUE + + + + + +<b>Hyper TOPLED® RG Hyper-Bright LED</b><p> +Source: http://www.osram.convergy.de/ ... LA_LO_LS_LY T776.pdf + + + + + + + + + + + + + + + + + + +>NAME +>VALUE +A +C + + + + + + + + + + +<b>Hyper Micro SIDELED®</b><p> +Source: http://www.osram.convergy.de/ ... LA_LO_LS_LY Y876.pdf + + + + + + + + + + + +>NAME +>VALUE + + + + + + + + +<b>Power TOPLED®</b><p> +Source: http://www.osram.convergy.de/ ... LA_LO_LA_LY E67B.pdf + + + + + + + + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE +C +A +C +C + + + + + + + + + + + +<b>Hyper CHIPLED Hyper-Bright LED</b><p> +LB Q993<br> +Source: http://www.osram.convergy.de/ ... Lb_q993.pdf + + + + +>NAME +>VALUE + + + + + + + +<b>Hyper CHIPLED Hyper-Bright LED</b><p> +LB R99A<br> +Source: http://www.osram.convergy.de/ ... lb_r99a.pdf + + + + +>NAME +>VALUE + + + + + + + +<b>Mini TOPLED Santana®</b><p> +Source: http://www.osram.convergy.de/ ... LG M470.pdf + + + + + + + + + + + + + +>NAME +>VALUE + + + + + + + + + + + + +<b>CHIPLED</b><p> +Source: http://www.osram.convergy.de/ ... LG_R971.pdf + + + + + + + +>NAME +>VALUE + + + + + + + + + + + + + + +<b>CHIPLED</b><p> +Source: http://www.osram.convergy.de/ ... LG_LY N971.pdf + + + + + + +>NAME +>VALUE + + + + + + + + + + + + + +<b>CHIPLED-0603</b><p> +Recommended Solder Pad useable for SmartLEDTM and Chipled - Package 0603<br> +Package able to withstand TTW-soldering heat<br> +Package suitable for TTW-soldering<br> +Source: http://www.osram.convergy.de/ ... LO_LS_LY L89K.pdf + + + + + + + + + +>NAME +>VALUE + + + + + + + + + + + + + + + + + +<b>SmartLED TTW</b><p> +Recommended Solder Pad useable for SmartLEDTM and Chipled - Package 0603<br> +Package able to withstand TTW-soldering heat<br> +Package suitable for TTW-soldering<br> +Source: http://www.osram.convergy.de/ ... LO_LS_LY L89K.pdf + + + + + + + + + + +>NAME +>VALUE + + + + + + + + + +<b>Lumileds Lighting. LUXEON®</b> with cool pad<p> +Source: K2.pdf + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +<b>Lumileds Lighting. LUXEON®</b> without cool pad<p> +Source: K2.pdf + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + + + + + + + + + + + + + + + + + + + +<B>LED</B><p> +10 mm, round + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>SURFACE MOUNT LED LAMP</b> 3.5x2.8mm<p> +Source: http://www.kingbright.com/manager/upload/pdf/KA-3528ASYC(Ver1189474662.1) + + + + + + + + + +>NAME +>VALUE + + + + + + + + + + + + + + + + + +<b>SML0805-2CW-TR (0805 PROFILE)</b> COOL WHITE<p> +Source: http://www.ledtronics.com/ds/smd-0603/Dstr0093.pdf + + + + + + + + + + + +>NAME +>VALUE + + +<b>SML10XXKH-TR (HIGH INTENSITY) LED</b><p> +<table> +<tr><td>SML10R3KH-TR</td><td>ULTRA RED</td></tr> +<tr><td>SML10E3KH-TR</td><td>SUPER REDSUPER BLUE</td></tr> +<tr><td>SML10O3KH-TR</td><td>SUPER ORANGE</td></tr> +<tr><td>SML10PY3KH-TR</td><td>PURE YELLOW</td></tr> +<tr><td>SML10OY3KH-TR</td><td>ULTRA YELLOW</td></tr> +<tr><td>SML10AG3KH-TR</td><td>AQUA GREEN</td></tr> +<tr><td>SML10BG3KH-TR</td><td>BLUE GREEN</td></tr> +<tr><td>SML10PB1KH-TR</td><td>SUPER BLUE</td></tr> +<tr><td>SML10CW1KH-TR</td><td>WHITE</td></tr> +</table> + +Source: http://www.ledtronics.com/ds/smd-1206/dstr0094.PDF + + + + + + + +>NAME +>VALUE + + + + + + + + + +<b>SML0603-XXX (HIGH INTENSITY) LED</b><p> +<table> +<tr><td>AG3K</td><td>AQUA GREEN</td></tr> +<tr><td>B1K</td><td>SUPER BLUE</td></tr> +<tr><td>R1K</td><td>SUPER RED</td></tr> +<tr><td>R3K</td><td>ULTRA RED</td></tr> +<tr><td>O3K</td><td>SUPER ORANGE</td></tr> +<tr><td>O3KH</td><td>SOFT ORANGE</td></tr> +<tr><td>Y3KH</td><td>SUPER YELLOW</td></tr> +<tr><td>Y3K</td><td>SUPER YELLOW</td></tr> +<tr><td>2CW</td><td>WHITE</td></tr> +</table> +Source: http://www.ledtronics.com/ds/smd-0603/Dstr0092.pdf + + + + + + + + + + +>NAME +>VALUE + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + + + + + + + + + + + + + +<b>LED</b><p> +<u>OSRAM</u>:<br> + +- <u>CHIPLED</u><br> +LG R971, LG N971, LY N971, LG Q971, LY Q971, LO R971, LY R971 +LH N974, LH R974<br> +LS Q976, LO Q976, LY Q976<br> +LO Q996<br> + +- <u>Hyper CHIPLED</u><br> +LW Q18S<br> +LB Q993, LB Q99A, LB R99A<br> + +- <u>SideLED</u><br> +LS A670, LO A670, LY A670, LG A670, LP A670<br> +LB A673, LV A673, LT A673, LW A673<br> +LH A674<br> +LY A675<br> +LS A676, LA A676, LO A676, LY A676, LW A676<br> +LS A679, LY A679, LG A679<br> + +- <u>Hyper Micro SIDELED®</u><br> +LS Y876, LA Y876, LO Y876, LY Y876<br> +LT Y87S<br> + +- <u>SmartLED</u><br> +LW L88C, LW L88S<br> +LB L89C, LB L89S, LG L890<br> +LS L89K, LO L89K, LY L89K<br> +LS L896, LA L896, LO L896, LY L896<br> + +- <u>TOPLED</u><br> +LS T670, LO T670, LY T670, LG T670, LP T670<br> +LSG T670, LSP T670, LSY T670, LOP T670, LYG T670<br> +LG T671, LOG T671, LSG T671<br> +LB T673, LV T673, LT T673, LW T673<br> +LH T674<br> +LS T676, LA T676, LO T676, LY T676, LB T676, LH T676, LSB T676, LW T676<br> +LB T67C, LV T67C, LT T67C, LS T67K, LO T67K, LY T67K, LW E67C<br> +LS E67B, LA E67B, LO E67B, LY E67B, LB E67C, LV E67C, LT E67C<br> +LW T67C<br> +LS T679, LY T679, LG T679<br> +LS T770, LO T770, LY T770, LG T770, LP T770<br> +LB T773, LV T773, LT T773, LW T773<br> +LH T774<br> +LS E675, LA E675, LY E675, LS T675<br> +LS T776, LA T776, LO T776, LY T776, LB T776<br> +LHGB T686<br> +LT T68C, LB T68C<br> + +- <u>Hyper Mini TOPLED®</u><br> +LB M676<br> + +- <u>Mini TOPLED Santana®</u><br> +LG M470<br> +LS M47K, LO M47K, LY M47K +<p> +Source: http://www.osram.convergy.de<p> + +<u>LUXEON:</u><br> +- <u>LUMILED®</u><br> +LXK2-PW12-R00, LXK2-PW12-S00, LXK2-PW14-U00, LXK2-PW14-V00<br> +LXK2-PM12-R00, LXK2-PM12-S00, LXK2-PM14-U00<br> +LXK2-PE12-Q00, LXK2-PE12-R00, LXK2-PE12-S00, LXK2-PE14-T00, LXK2-PE14-U00<br> +LXK2-PB12-K00, LXK2-PB12-L00, LXK2-PB12-M00, LXK2-PB14-N00, LXK2-PB14-P00, LXK2-PB14-Q00<br> +LXK2-PR12-L00, LXK2-PR12-M00, LXK2-PR14-Q00, LXK2-PR14-R00<br> +LXK2-PD12-Q00, LXK2-PD12-R00, LXK2-PD12-S00<br> +LXK2-PH12-R00, LXK2-PH12-S00<br> +LXK2-PL12-P00, LXK2-PL12-Q00, LXK2-PL12-R00 +<p> +Source: www.luxeon.com<p> + +<u>KINGBRIGHT:</U><p> +KA-3528ASYC<br> +Source: www.kingbright.com + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +<b>Supply Symbols</b><p> +GND, VCC, 0V, +5V, -5V, etc.<p> +Please keep in mind, that these devices are necessary for the +automatic wiring of the supply signals.<p> +The pin name defined in the symbol is identical to the net which is to be wired automatically.<p> +In this library the device names are the same as the pin names of the symbols, therefore the correct signal names appear next to the supply symbols in the schematic.<p> +<author>Created by librarian@cadsoft.de</author> + + + + + + + +>VALUE + + + + + +>VALUE + + + + + +<b>SUPPLY SYMBOL</b> + + + + + + + + + + + + +<b>SUPPLY SYMBOL</b> + + + + + + + + + + + + + + + + +<b>Small Outline Transistor; 6 leads</b><p> +Philips Semiconductors, SOT363.pdf + + + + + + + + + + + +>NAME +>VALUE + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +>VALUE +>NAME + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +<b>Small Outline Transistor</b> + + + + + + + + + + + + +>NAME +>VALUE + + + + + + + + + + + + + +>Name +>Value + + + + + + + + + +<h3> Microchip's MCP73831</h3> +Miniature single cell, fully integrated Li-Ion, Li-polymer charge management controller<br> +http://ww1.microchip.com/downloads/en/DeviceDoc/21984a.pdf + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + + + + + + + + + +>NAME +>VALUE + + + + + + + + + + + + + + + + + + + + + + + + + + + + +<b>SMALL OUTLINE TRANSISTOR</b><p> +reflow soldering + + + + + + + + + + + +>NAME +>VALUE + + + + + + + + + + + + +>NAME +>VALUE +GND +IN +OUT + + + + + + + + + + + + + + + + + + + + + + + + + + +<b>Test Pins/Pads</b><p> +Cream on SMD OFF.<br> +new: Attribute TP_SIGNAL_NAME<br> +<author>Created by librarian@cadsoft.de</author> + + +<b>TEST PAD</b> + + + +>NAME +>VALUE +>TP_SIGNAL_NAME + + +<b>TEST PAD</b> + + + + +>NAME +>VALUE +>TP_SIGNAL_NAME + + +<b>TEST PAD</b> + + +>NAME +>VALUE +>TP_SIGNAL_NAME + + + +<b>TEST PAD</b> + + +>NAME +>VALUE +>TP_SIGNAL_NAME + + + +<b>TEST PAD</b> + + +>NAME +>VALUE +>TP_SIGNAL_NAME + + + +<b>TEST PAD</b> + + +>NAME +>VALUE +>TP_SIGNAL_NAME + + + +<b>TEST PAD</b> + + +>NAME +>VALUE +>TP_SIGNAL_NAME + + + +<b>TEST PAD</b> + + +>NAME +>VALUE +>TP_SIGNAL_NAME + + + +<b>TEST PAD</b> + +>NAME +>VALUE +>TP_SIGNAL_NAME + + +<b>TEST PAD</b> + +>NAME +>VALUE +>TP_SIGNAL_NAME + + +<b>TEST PAD</b> + +>NAME +>VALUE +>TP_SIGNAL_NAME + + +<b>TEST PAD</b> + +>NAME +>VALUE +>TP_SIGNAL_NAME + + +<b>TEST PAD</b> + +>NAME +>VALUE +>TP_SIGNAL_NAME + + +<b>TEST PAD</b> + +>NAME +>VALUE +>TP_SIGNAL_NAME + + +<b>TEST PAD</b> + +>NAME +>VALUE +>TP_SIGNAL_NAME + + +<b>TEST PAD</b> + +>NAME +>VALUE +>TP_SIGNAL_NAME + + +<b>TEST PAD</b> + +>NAME +>VALUE +>TP_SIGNAL_NAME + + +<b>TEST PAD</b> + +>NAME +>VALUE +>TP_SIGNAL_NAME + + +<b>TEST PAD</b> + +>NAME +>VALUE +>TP_SIGNAL_NAME + + +<b>TEST PAD</b> + +>NAME +>VALUE +>TP_SIGNAL_NAME + + +<b>TEST PAD</b> + +>NAME +>VALUE +>TP_SIGNAL_NAME + + +<b>TEST PAD</b> + +>NAME +>VALUE +>TP_SIGNAL_NAME + + +<b>TEST PAD</b> + +>NAME +>VALUE +>TP_SIGNAL_NAME + + +<b>TEST PAD</b> + +>NAME +>VALUE +>TP_SIGNAL_NAME + + +<b>TEST PAD</b> + +>NAME +>VALUE +>TP_SIGNAL_NAME + + +<b>TEST PAD</b> + +>NAME +>VALUE +>TP_SIGNAL_NAME + + +<b>TEST PAD</b> + +>NAME +>VALUE +>TP_SIGNAL_NAME + + +<b>TEST PAD</b> + +>NAME +>VALUE +>TP_SIGNAL_NAME + + +<b>TEST PAD</b> + +>NAME +>VALUE +>TP_SIGNAL_NAME + + +<b>TEST PAD</b> + +>NAME +>VALUE +>TP_SIGNAL_NAME + + +<b>TEST PAD</b> + +>NAME +>VALUE +>TP_SIGNAL_NAME + + +<b>TEST PAD</b> + +>NAME +>VALUE +>TP_SIGNAL_NAME + + +<b>TEST PAD</b> + +>NAME +>VALUE +>TP_SIGNAL_NAME + + +<b>TEST PAD</b> + +>NAME +>VALUE +>TP_SIGNAL_NAME + + +<b>TEST PAD</b> + +>NAME +>VALUE +>TP_SIGNAL_NAME + + +<b>TEST PAD</b> + +>NAME +>VALUE +>TP_SIGNAL_NAME + + +<b>TEST PAD</b> + +>NAME +>VALUE +>TP_SIGNAL_NAME + + +<b>TEST PAD</b> + +>NAME +>VALUE +>TP_SIGNAL_NAME + + + + + + + + + + + + + + + + + + + + + + + +>NAME +>TP_SIGNAL_NAME + + + + + + +<b>TEST PIN</b> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +1:20 Divider with 50R Termination +Envelope Detector +RSSI Lowpass +AC-coupled Amp. +Load Modulation +Rectification +USB Power Supply + ORing Diode +Antenna + Tuning +WARNING: this is a +development version, +and NOT YET +FUNCTIONAL!!! +N.M. = DO NOT MOUNT +Unreg. +input voltage +A voltage > 6 V +here will kill +caps & charger +was approx 0.6 V drop 22R @ 30mA +changed to 3R +approx 0.75V drop +Replace with NXP BAT720 +WARNING: this is a development version, and NOT YET FUNCTIONAL!!! + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Regulated voltage for uC and other components +Unregulated input voltage from USB or field +Unreg. input +LiIon 3.7 (nom.) / 4.2V (max.) +Input to LDO +Warning: Charger tolerates max. 6 V +Should be clamped +Series resistor after rectifier may protect a bit +another 0.7 V drop +-> 5V USB - 0.6 - 0.7 - 0.7 + = 3 V +WARNING: this is a +development version, +and NOT YET +FUNCTIONAL!!! +WARNING: this is a development version, and NOT YET FUNCTIONAL!!! + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Since Version 6.2.2 text objects can contain more than one line, +which will not be processed correctly with this version. + + + diff --git a/RevE-light/EAGLE/WARNING.txt b/RevE-light/EAGLE/WARNING.txt new file mode 100644 index 0000000..ae131bf --- /dev/null +++ b/RevE-light/EAGLE/WARNING.txt @@ -0,0 +1 @@ +WARNING: The files in this folder are our current development version. The hardware and software is not functional yet - so do not use it. We will not answer any support inquiry regarding this version at the moment. \ No newline at end of file diff --git a/RevE-light/Firmware/.gitignore b/RevE-light/Firmware/.gitignore new file mode 100644 index 0000000..e8d0311 --- /dev/null +++ b/RevE-light/Firmware/.gitignore @@ -0,0 +1 @@ +/.metadata diff --git a/RevE-light/Firmware/Chameleon-Mini/.gitignore b/RevE-light/Firmware/Chameleon-Mini/.gitignore new file mode 100644 index 0000000..a9d00d8 --- /dev/null +++ b/RevE-light/Firmware/Chameleon-Mini/.gitignore @@ -0,0 +1 @@ +/Bin diff --git a/RevE-light/Firmware/Chameleon-Mini/AntennaLevel.h b/RevE-light/Firmware/Chameleon-Mini/AntennaLevel.h new file mode 100644 index 0000000..6818ec9 --- /dev/null +++ b/RevE-light/Firmware/Chameleon-Mini/AntennaLevel.h @@ -0,0 +1,51 @@ +/* + * AntennaLevel.h + * + * Created on: 24.11.2013 + * Author: skuser + */ + +#ifndef ANTENNALEVEL_H_ +#define ANTENNALEVEL_H_ + +#include "Common.h" + +#define ANTENNA_LEVEL_R1 10E3 +#define ANTENNA_LEVEL_R2 220E0 +#define ANTENNA_LEVEL_VREF 1.0 +#define ANTENNA_LEVEL_RES 4096 +#define ANTENNA_LEVEL_OFFSET 190 /* LSB */ + +#define ANTENNA_LEVEL_MILLIVOLT 1E3 +#define ANTENNA_LEVEL_FACTOR (ANTENNA_LEVEL_VREF * (ANTENNA_LEVEL_R1 + ANTENNA_LEVEL_R2) / (ANTENNA_LEVEL_RES * ANTENNA_LEVEL_R2) ) +#define ANTENNA_LEVEL_SCALE ((uint32_t) 1<<16) +#define ANTENNA_LEVEL_NUMERATOR ((uint32_t) (ANTENNA_LEVEL_MILLIVOLT * ANTENNA_LEVEL_FACTOR * ANTENNA_LEVEL_SCALE + .5)) +#define ANTENNA_LEVEL_DENOMINATOR (ANTENNA_LEVEL_SCALE) + +static inline +void AntennaLevelInit(void) +{ + ADCA.CTRLA = ADC_ENABLE_bm; + ADCA.CTRLB = ADC_RESOLUTION_12BIT_gc; + ADCA.REFCTRL = ADC_REFSEL_INT1V_gc | ADC_BANDGAP_bm; + ADCA.PRESCALER = ADC_PRESCALER_DIV32_gc; + ADCA.CH0.CTRL = ADC_CH_INPUTMODE_SINGLEENDED_gc; + ADCA.CH0.MUXCTRL = ADC_CH_MUXPOS_PIN7_gc; + +} + +static inline +uint16_t AntennaLevelGet(void) +{ + ADCA.CH0.CTRL |= ADC_CH_START_bm; + while( !(ADCA.CH0.INTFLAGS & ADC_CH_CHIF_bm) ); + + ADCA.CH0.INTFLAGS = ADC_CH_CHIF_bm; + + int16_t Result = ADCA.CH0RES - ANTENNA_LEVEL_OFFSET; + if (Result < 0) Result = 0; + + return (uint16_t) (((uint32_t) Result * ANTENNA_LEVEL_NUMERATOR) / ANTENNA_LEVEL_DENOMINATOR); +} + +#endif /* ANTENNALEVEL_H_ */ diff --git a/RevE-light/Firmware/Chameleon-Mini/Application/Application.h b/RevE-light/Firmware/Chameleon-Mini/Application/Application.h new file mode 100644 index 0000000..0c70cfc --- /dev/null +++ b/RevE-light/Firmware/Chameleon-Mini/Application/Application.h @@ -0,0 +1,51 @@ +/* + * Application.h + * + * Created on: 18.02.2013 + * Author: skuser + */ + +#ifndef APPLICATION_H_ +#define APPLICATION_H_ + +#include "../Common.h" +#include "../Configuration.h" +#include "../Log.h" + +/* Applications */ +#include "MifareUltralight.h" +#include "MifareClassic.h" + + +/* Function wrappers */ +INLINE void ApplicationInit(void) { + ActiveConfiguration.ApplicationInitFunc(); +} + +INLINE void ApplicationTask(void) { + ActiveConfiguration.ApplicationTaskFunc(); +} + +INLINE uint16_t ApplicationProcess(uint8_t* ByteBuffer, uint16_t ByteCount) { + return ActiveConfiguration.ApplicationProcessFunc(ByteBuffer, ByteCount); +} + +INLINE void ApplicationTick(void) { + ActiveConfiguration.ApplicationTickFunc(); +} + +INLINE void ApplicationReset(void) { + ActiveConfiguration.ApplicationResetFunc(); + //LogEntry(LOG_INFO_APP_RESET, NULL, 0); +} + +INLINE void ApplicationGetUid(ConfigurationUidType Uid) { + ActiveConfiguration.ApplicationGetUidFunc(Uid); +} + +INLINE void ApplicationSetUid(ConfigurationUidType Uid) { + ActiveConfiguration.ApplicationSetUidFunc(Uid); + LogEntry(LOG_INFO_UID_SET, Uid, ActiveConfiguration.UidSize); +} + +#endif /* APPLICATION_H_ */ diff --git a/RevE-light/Firmware/Chameleon-Mini/Application/Crypto1.c b/RevE-light/Firmware/Chameleon-Mini/Application/Crypto1.c new file mode 100644 index 0000000..b35fcb0 --- /dev/null +++ b/RevE-light/Firmware/Chameleon-Mini/Application/Crypto1.c @@ -0,0 +1,323 @@ +#include "Crypto1.h" + +#define PRNG_MASK 0x002D0000UL +/* x^16 + x^14 + x^13 + x^11 + 1 */ + +#define PRNG_SIZE 4 /* Bytes */ + +#define LFSR_MASK_EVEN 0x2010E1UL +#define LFSR_MASK_ODD 0x3A7394UL +/* x^48 + x^43 + x^39 + x^38 + x^36 + x^34 + x^33 + x^31 + x^29 + + * x^24 + x^23 + x^21 + x^19 + x^13 + x^9 + x^7 + x^6 + x^5 + 1 */ + +#define LFSR_SIZE 6 /* Bytes */ + +/* Functions fa, fb and fc in filter output network. Definitions taken + * from Timo Kasper's thesis */ +#define FA(x3, x2, x1, x0) ( \ + ( (x0 | x1) ^ (x0 & x3) ) ^ ( x2 & ( (x0 ^ x1) | x3 ) ) \ +) + +#define FB(x3, x2, x1, x0) ( \ + ( (x0 & x1) | x2 ) ^ ( (x0 ^ x1) & (x2 | x3) ) \ +) + +#define FC(x4, x3, x2, x1, x0) ( \ + ( x0 | ( (x1 | x4) & (x3 ^ x4) ) ) ^ ( ( x0 ^ (x1 & x3) ) & ( (x2 ^ x3) | (x1 & x4) ) ) \ +) + +/* Create tables from function fa, fb and fc for faster access */ +static const uint8_t TableAB[5][16] = { + { /* fa with Input {3,2,1,0} = (0,0,0,0) to (1,1,1,1) shifted by 0 */ + FA(0,0,0,0) << 0, FA(0,0,0,1) << 0, FA(0,0,1,0) << 0, FA(0,0,1,1) << 0, + FA(0,1,0,0) << 0, FA(0,1,0,1) << 0, FA(0,1,1,0) << 0, FA(0,1,1,1) << 0, + FA(1,0,0,0) << 0, FA(1,0,0,1) << 0, FA(1,0,1,0) << 0, FA(1,0,1,1) << 0, + FA(1,1,0,0) << 0, FA(1,1,0,1) << 0, FA(1,1,1,0) << 0, FA(1,1,1,1) << 0, + }, + { /* fb with Input {3,2,1,0} = (0,0,0,0) to (1,1,1,1) shifted by 1 */ + FB(0,0,0,0) << 1, FB(0,0,0,1) << 1, FB(0,0,1,0) << 1, FB(0,0,1,1) << 1, + FB(0,1,0,0) << 1, FB(0,1,0,1) << 1, FB(0,1,1,0) << 1, FB(0,1,1,1) << 1, + FB(1,0,0,0) << 1, FB(1,0,0,1) << 1, FB(1,0,1,0) << 1, FB(1,0,1,1) << 1, + FB(1,1,0,0) << 1, FB(1,1,0,1) << 1, FB(1,1,1,0) << 1, FB(1,1,1,1) << 1, + }, + { /* fb with Input {3,2,1,0} = (0,0,0,0) to (1,1,1,1) shifted by 2 */ + FB(0,0,0,0) << 2, FB(0,0,0,1) << 2, FB(0,0,1,0) << 2, FB(0,0,1,1) << 2, + FB(0,1,0,0) << 2, FB(0,1,0,1) << 2, FB(0,1,1,0) << 2, FB(0,1,1,1) << 2, + FB(1,0,0,0) << 2, FB(1,0,0,1) << 2, FB(1,0,1,0) << 2, FB(1,0,1,1) << 2, + FB(1,1,0,0) << 2, FB(1,1,0,1) << 2, FB(1,1,1,0) << 2, FB(1,1,1,1) << 2, + }, + { /* fa with Input {3,2,1,0} = (0,0,0,0) to (1,1,1,1) shifted by 3 */ + FA(0,0,0,0) << 3, FA(0,0,0,1) << 3, FA(0,0,1,0) << 3, FA(0,0,1,1) << 3, + FA(0,1,0,0) << 3, FA(0,1,0,1) << 3, FA(0,1,1,0) << 3, FA(0,1,1,1) << 3, + FA(1,0,0,0) << 3, FA(1,0,0,1) << 3, FA(1,0,1,0) << 3, FA(1,0,1,1) << 3, + FA(1,1,0,0) << 3, FA(1,1,0,1) << 3, FA(1,1,1,0) << 3, FA(1,1,1,1) << 3, + }, + { /* fb with Input {3,2,1,0} = (0,0,0,0) to (1,1,1,1) shifted by 4 */ + FB(0,0,0,0) << 4, FB(0,0,0,1) << 4, FB(0,0,1,0) << 4, FB(0,0,1,1) << 4, + FB(0,1,0,0) << 4, FB(0,1,0,1) << 4, FB(0,1,1,0) << 4, FB(0,1,1,1) << 4, + FB(1,0,0,0) << 4, FB(1,0,0,1) << 4, FB(1,0,1,0) << 4, FB(1,0,1,1) << 4, + FB(1,1,0,0) << 4, FB(1,1,0,1) << 4, FB(1,1,1,0) << 4, FB(1,1,1,1) << 4, + } +}; + +static const uint8_t TableC[32] = { + /* fc with Input {4,3,2,1,0} = (0,0,0,0,0) to (1,1,1,1,1) */ + FC(0,0,0,0,0), FC(0,0,0,0,1), FC(0,0,0,1,0), FC(0,0,0,1,1), + FC(0,0,1,0,0), FC(0,0,1,0,1), FC(0,0,1,1,0), FC(0,0,1,1,1), + FC(0,1,0,0,0), FC(0,1,0,0,1), FC(0,1,0,1,0), FC(0,1,0,1,1), + FC(0,1,1,0,0), FC(0,1,1,0,1), FC(0,1,1,1,0), FC(0,1,1,1,1), + FC(1,0,0,0,0), FC(1,0,0,0,1), FC(1,0,0,1,0), FC(1,0,0,1,1), + FC(1,0,1,0,0), FC(1,0,1,0,1), FC(1,0,1,1,0), FC(1,0,1,1,1), + FC(1,1,0,0,0), FC(1,1,0,0,1), FC(1,1,0,1,0), FC(1,1,0,1,1), + FC(1,1,1,0,0), FC(1,1,1,0,1), FC(1,1,1,1,0), FC(1,1,1,1,1), +}; + +/* Split Crypto1 state into even and odd bits to speed up the output filter network */ +static uint8_t StateEven[LFSR_SIZE/2] = {0}; +static uint8_t StateOdd[LFSR_SIZE/2] = {0}; + +/* Proceed LFSR by one clock cycle */ +static void Crypto1LFSR(uint8_t In) { + uint8_t Feedback = 0; + + /* Calculate feedback according to LFSR taps. XOR all 6 state bytes + * into a single bit. */ + Feedback ^= StateEven[0] & (uint8_t) (LFSR_MASK_EVEN >> 0); + Feedback ^= StateEven[1] & (uint8_t) (LFSR_MASK_EVEN >> 8); + Feedback ^= StateEven[2] & (uint8_t) (LFSR_MASK_EVEN >> 16); + + Feedback ^= StateOdd[0] & (uint8_t) (LFSR_MASK_ODD >> 0); + Feedback ^= StateOdd[1] & (uint8_t) (LFSR_MASK_ODD >> 8); + Feedback ^= StateOdd[2] & (uint8_t) (LFSR_MASK_ODD >> 16); + + Feedback ^= Feedback >> 4; + Feedback ^= Feedback >> 2; + Feedback ^= Feedback >> 1; + + /* Now the shifting of the Crypto1 state gets more complicated when + * split up into even/odd parts. After some hard thinking, one can + * see that after one LFSR clock cycle + * - the new even state becomes the old odd state + * - the new odd state becomes the old even state right-shifted by 1. + * For shifting the even state, we convert it into a 32 bit int first */ + uint32_t Temp = 0; + Temp |= ((uint32_t) StateEven[0] << 0); + Temp |= ((uint32_t) StateEven[1] << 8); + Temp |= ((uint32_t) StateEven[2] << 16); + + /* Proceed LFSR. Try to force compiler not to shift the unneded upper bits. */ + Temp = (Temp >> 1) & 0x00FFFFFF; + + /* Calculate MSBit of even state as input bit to LFSR */ + if ( (Feedback & 0x01) ^ In ) { + Temp |= (uint32_t) 1 << (8 * LFSR_SIZE/2 - 1); + } + + /* Convert even state back into byte array and swap odd/even state + * as explained above. */ + StateEven[0] = StateOdd[0]; + StateEven[1] = StateOdd[1]; + StateEven[2] = StateOdd[2]; + + StateOdd[0] = (uint8_t) (Temp >> 0); + StateOdd[1] = (uint8_t) (Temp >> 8); + StateOdd[2] = (uint8_t) (Temp >> 16); +} + +uint8_t Crypto1FilterOutput(void) { + /* Calculate the functions fa, fb. + * Note that only bits {4...23} of the odd state + * get fed into these function. + * The tables are designed to hold mask values, which + * can simply be ORed together to produce the resulting + * 5 bits that are used to lookup the output bit. + */ + uint8_t Sum = 0; + + Sum |= TableAB[0][(StateOdd[0] >> 4) & 0x0F]; + Sum |= TableAB[1][(StateOdd[1] >> 0) & 0x0F]; + Sum |= TableAB[2][(StateOdd[1] >> 4) & 0x0F]; + Sum |= TableAB[3][(StateOdd[2] >> 0) & 0x0F]; + Sum |= TableAB[4][(StateOdd[2] >> 4) & 0x0F]; + + return TableC[Sum]; +} + +void Crypto1Setup(uint8_t Key[6], uint8_t Uid[4], uint8_t CardNonce[4]) +{ + uint8_t i; + + /* Again, one trade off when splitting up the state into even/odd parts + * is that loading the key into the state becomes a little more difficult. + * The inner loop generates 8 even and 8 odd bits from 16 key bits and + * the outer loop stores them. */ + for (i=0; i<(LFSR_SIZE/2); i++) { + uint8_t EvenByte = 0; + uint8_t OddByte = 0; + uint16_t KeyWord = ((uint16_t) Key[2*i+1] << 8) | Key[2*i+0]; + uint8_t j; + + for (j=0; j<8; j++) { + EvenByte >>= 1; + OddByte >>= 1; + + if (KeyWord & (1<<0)) { + EvenByte |= 0x80; + } + + if (KeyWord & (1<<1)) { + OddByte |= 0x80; + } + + KeyWord >>= 2; + } + + StateEven[i] = EvenByte; + StateOdd[i] = OddByte; + } + + /* Use Uid XOR CardNonce as feed-in and do 32 clocks on the + * Crypto1 LFSR.*/ + uint32_t Temp = 0; + + Temp |= (uint32_t) (Uid[0] ^ CardNonce[0]) << 0; + Temp |= (uint32_t) (Uid[1] ^ CardNonce[1]) << 8; + Temp |= (uint32_t) (Uid[2] ^ CardNonce[2]) << 16; + Temp |= (uint32_t) (Uid[3] ^ CardNonce[3]) << 24; + + for (i=0; i<32; i++) { + uint8_t Out = Crypto1FilterOutput(); + + Crypto1LFSR(Temp & 0x01); + Temp >>= 1; + + /* Store the keystream for later use */ + if (Out) { + Temp |= (uint32_t) 1 << 31; + } + } + + /* Crypto1 state register is now set up to be used for authentication. + * In case of nested authentication, we need to use the produced keystream + * to encrypt the CardNonce. For this case we do the encryption in-place. */ + CardNonce[0] ^= (uint8_t) (Temp >> 0); + CardNonce[1] ^= (uint8_t) (Temp >> 8); + CardNonce[2] ^= (uint8_t) (Temp >> 16); + CardNonce[3] ^= (uint8_t) (Temp >> 24); +} + +void Crypto1Auth(uint8_t EncryptedReaderNonce[4]) +{ + uint32_t Temp = 0; + + /* For ease of processing, we convert the encrypted reader nonce + * into a 32 bit integer */ + Temp |= (uint32_t) EncryptedReaderNonce[0] << 0; + Temp |= (uint32_t) EncryptedReaderNonce[1] << 8; + Temp |= (uint32_t) EncryptedReaderNonce[2] << 16; + Temp |= (uint32_t) EncryptedReaderNonce[3] << 24; + + uint8_t i; + + for (i=0; i<32; i++) { + /* Decrypt one output bit of the given encrypted nonce using the + * filter output as keystream. */ + uint8_t Out = Crypto1FilterOutput(); + uint8_t Bit = Out ^ (Temp & 0x01); + + /* Feed back the bit to load the LFSR with the (decrypted) nonce */ + Crypto1LFSR(Bit); + Temp >>= 1; + } +} + +uint8_t Crypto1Byte(void) +{ + uint8_t KeyStream = 0; + uint8_t i; + + /* Generate 8 keystream-bits */ + for (i=0; i<8; i++) { + + /* Calculate output of function-network and cycle LFSR with no + * additional input, thus linearly! */ + uint8_t Out = Crypto1FilterOutput(); + Crypto1LFSR(0); + + /* Store keystream bit */ + KeyStream >>= 1; + + if (Out) { + KeyStream |= (1<<7); + } + } + + return KeyStream; +} + +uint8_t Crypto1Nibble(void) +{ + uint8_t KeyStream = 0; + uint8_t i; + + /* Generate 4 keystream-bits */ + for (i=0; i<4; i++) { + + /* Calculate output of function-network and cycle LFSR with no + * additional input, thus linearly! */ + uint8_t Out = Crypto1FilterOutput(); + Crypto1LFSR(0); + + /* Store keystream bit */ + KeyStream >>= 1; + + if (Out) { + KeyStream |= (1<<3); + } + } + + return KeyStream; +} + +void Crypto1PRNG(uint8_t State[4], uint16_t ClockCount) +{ + while(ClockCount--) { + /* Actually, the PRNG is a 32 bit register with the upper 16 bit + * used as a LFSR. Furthermore only mask-byte 2 contains feedback at all. + * We rely on the compiler to optimize this for us here. + * XOR all tapped bits to a single feedback bit. */ + uint8_t Feedback = 0; + + Feedback ^= State[0] & (uint8_t) (PRNG_MASK >> 0); + Feedback ^= State[1] & (uint8_t) (PRNG_MASK >> 8); + Feedback ^= State[2] & (uint8_t) (PRNG_MASK >> 16); + Feedback ^= State[3] & (uint8_t) (PRNG_MASK >> 24); + + Feedback ^= Feedback >> 4; + Feedback ^= Feedback >> 2; + Feedback ^= Feedback >> 1; + + /* For ease of processing convert the state into a 32 bit integer first */ + uint32_t Temp = 0; + + Temp |= (uint32_t) State[0] << 0; + Temp |= (uint32_t) State[1] << 8; + Temp |= (uint32_t) State[2] << 16; + Temp |= (uint32_t) State[3] << 24; + + /* Cycle LFSR and feed back. */ + Temp >>= 1; + + if (Feedback & 0x01) { + Temp |= (uint32_t) 1 << (8 * PRNG_SIZE - 1); + } + + /* Store back state */ + State[0] = (uint8_t) (Temp >> 0); + State[1] = (uint8_t) (Temp >> 8); + State[2] = (uint8_t) (Temp >> 16); + State[3] = (uint8_t) (Temp >> 24); + } + + +} diff --git a/RevE-light/Firmware/Chameleon-Mini/Application/Crypto1.h b/RevE-light/Firmware/Chameleon-Mini/Application/Crypto1.h new file mode 100644 index 0000000..7a00b7f --- /dev/null +++ b/RevE-light/Firmware/Chameleon-Mini/Application/Crypto1.h @@ -0,0 +1,25 @@ +#ifndef CRYPTO1_H +#define CRYPTO1_H + +#include + +/* Gets the current keystream-bit, without shifting the internal LFSR */ +uint8_t Crypto1FilterOutput(void); + +/* Set up Crypto1 cipher using the given Key, Uid and CardNonce. Also encrypts + * the CardNonce in-place while in non-linear mode. */ +void Crypto1Setup(uint8_t Key[6], uint8_t Uid[4], uint8_t CardNonce[4]); + +/* Load the decrypted ReaderNonce into the Crypto1 state LFSR */ +void Crypto1Auth(uint8_t EncryptedReaderNonce[4]); + +/* Generate 8 Bits of key stream */ +uint8_t Crypto1Byte(void); + +/* Generate 4 Bits of key stream */ +uint8_t Crypto1Nibble(void); + +/* Execute 'ClockCount' cycles on the PRNG state 'State' */ +void Crypto1PRNG(uint8_t State[4], uint16_t ClockCount); + +#endif //CRYPTO1_H diff --git a/RevE-light/Firmware/Chameleon-Mini/Application/ISO14443-3A.c b/RevE-light/Firmware/Chameleon-Mini/Application/ISO14443-3A.c new file mode 100644 index 0000000..0b093e2 --- /dev/null +++ b/RevE-light/Firmware/Chameleon-Mini/Application/ISO14443-3A.c @@ -0,0 +1,108 @@ +/* + * ISO14443A.c + * + * Created on: 19.03.2013 + * Author: skuser + */ + +#include "ISO14443-3A.h" + +void ISO14443AAppendCRCA(void* Buffer, uint16_t ByteCount) { + uint16_t Checksum = 0x6363; + uint8_t* DataPtr = (uint8_t*) Buffer; + + while(ByteCount--) { + uint8_t Byte = *DataPtr++; + + Byte ^= (uint8_t) (Checksum & 0x00FF); + Byte ^= Byte << 4; + + Checksum = (Checksum >> 8) ^ ( (uint16_t) Byte << 8 ) ^ + ( (uint16_t) Byte << 3 ) ^ ( (uint16_t) Byte >> 4 ); + } + + *DataPtr++ = (Checksum >> 0) & 0x00FF; + *DataPtr = (Checksum >> 8) & 0x00FF; +} + +bool ISO14443ACheckCRCA(void* Buffer, uint16_t ByteCount) +{ + uint16_t Checksum = 0x6363; + uint8_t* DataPtr = (uint8_t*) Buffer; + + while(ByteCount--) { + uint8_t Byte = *DataPtr++; + + Byte ^= (uint8_t) (Checksum & 0x00FF); + Byte ^= Byte << 4; + + Checksum = (Checksum >> 8) ^ ( (uint16_t) Byte << 8 ) ^ + ( (uint16_t) Byte << 3 ) ^ ( (uint16_t) Byte >> 4 ); + } + + return (DataPtr[0] == ((Checksum >> 0) & 0xFF)) && (DataPtr[1] == ((Checksum >> 8) & 0xFF)); +} + +#if 0 +bool ISO14443ASelect(void* Buffer, uint16_t* BitCount, uint8_t* UidCL, uint8_t SAKValue) +{ + uint8_t* DataPtr = (uint8_t*) Buffer; + uint8_t NVB = DataPtr[1]; + //uint8_t CollisionByteCount = (NVB >> 4) & 0x0F; + //uint8_t CollisionBitCount = (NVB >> 0) & 0x0F; + + switch (NVB) { + case ISO14443A_NVB_AC_START: + /* Start of anticollision procedure. + * Send whole UID CLn + BCC */ + DataPtr[0] = UidCL[0]; + DataPtr[1] = UidCL[1]; + DataPtr[2] = UidCL[2]; + DataPtr[3] = UidCL[3]; + DataPtr[4] = ISO14443A_CALC_BCC(DataPtr); + + *BitCount = ISO14443A_CL_FRAME_SIZE; + + return false; + + case ISO14443A_NVB_AC_END: + /* End of anticollision procedure. + * Send SAK CLn if we are selected. */ + if ( (DataPtr[2] == UidCL[0]) && + (DataPtr[3] == UidCL[1]) && + (DataPtr[4] == UidCL[2]) && + (DataPtr[5] == UidCL[3]) ) { + + DataPtr[0] = SAKValue; + ISO14443AAppendCRCA(Buffer, 1); + + *BitCount = ISO14443A_SAK_FRAME_SIZE; + return true; + } else { + /* We have not been selected. Don't send anything. */ + *BitCount = 0; + return false; + } + default: + /* TODO: No anticollision supported */ + *BitCount = 0; + return false; + } +} + +bool ISO14443AWakeUp(void* Buffer, uint16_t* BitCount, uint16_t ATQAValue) +{ + uint8_t* DataPtr = (uint8_t*) Buffer; + + if ( (DataPtr[0] == ISO14443A_CMD_REQA) || (DataPtr[0] == ISO14443A_CMD_WUPA) ){ + DataPtr[0] = (ATQAValue >> 0) & 0x00FF; + DataPtr[1] = (ATQAValue >> 8) & 0x00FF; + + *BitCount = ISO14443A_ATQA_FRAME_SIZE; + + return true; + } else { + return false; + } +} +#endif diff --git a/RevE-light/Firmware/Chameleon-Mini/Application/ISO14443-3A.h b/RevE-light/Firmware/Chameleon-Mini/Application/ISO14443-3A.h new file mode 100644 index 0000000..87f6ff2 --- /dev/null +++ b/RevE-light/Firmware/Chameleon-Mini/Application/ISO14443-3A.h @@ -0,0 +1,117 @@ +/* + * ISO14443-2A.h + * + * Created on: 19.03.2013 + * Author: skuser + */ + +#ifndef ISO14443_3A_H_ +#define ISO14443_3A_H_ + +#include "../Common.h" + +#define ISO14443A_UID_SIZE_SINGLE 4 /* bytes */ +#define ISO14443A_UID_SIZE_DOUBLE 7 +#define ISO14443A_UID_SIZE_TRIPLE 10 + +#define ISO14443A_CMD_REQA 0x26 +#define ISO14443A_CMD_WUPA 0x52 +#define ISO14443A_CMD_SELECT_CL1 0x93 +#define ISO14443A_CMD_SELECT_CL2 0x95 +#define ISO14443A_CMD_SELECT_CL3 0x97 +#define ISO14443A_CMD_HLTA 0x50 + +#define ISO14443A_NVB_AC_START 0x20 +#define ISO14443A_NVB_AC_END 0x70 + +#define ISO14443A_CL_UID_OFFSET 0 +#define ISO14443A_CL_UID_SIZE 4 +#define ISO14443A_CL_BCC_OFFSET 4 +#define ISO14443A_CL_BCC_SIZE 1 /* Byte */ +#define ISO14443A_CL_FRAME_SIZE ((ISO14443A_CL_UID_SIZE + ISO14443A_CL_BCC_SIZE) * 8) /* UID[N...N+3] || BCCN */ +#define ISO14443A_SAK_INCOMPLETE 0x04 +#define ISO14443A_SAK_COMPLETE_COMPLIANT 0x20 +#define ISO14443A_SAK_COMPLETE_NOT_COMPLIANT 0x00 + +#define ISO14443A_ATQA_FRAME_SIZE (2 * 8) /* Bit */ +#define ISO14443A_SAK_FRAME_SIZE (3 * 8) /* Bit */ + +#define ISO14443A_UID0_RANDOM 0x08 +#define ISO14443A_UID0_CT 0x88 + +#define ISO14443A_CRCA_SIZE 2 + +#define ISO14443A_CALC_BCC(ByteBuffer) \ + ( ByteBuffer[0] ^ ByteBuffer[1] ^ ByteBuffer[2] ^ ByteBuffer[3] ) + +void ISO14443AAppendCRCA(void* Buffer, uint16_t ByteCount); +bool ISO14443ACheckCRCA(void* Buffer, uint16_t ByteCount); + +INLINE bool ISO14443ASelect(void* Buffer, uint16_t* BitCount, uint8_t* UidCL, uint8_t SAKValue); +INLINE bool ISO14443AWakeUp(void* Buffer, uint16_t* BitCount, uint16_t ATQAValue); + +INLINE +bool ISO14443ASelect(void* Buffer, uint16_t* BitCount, uint8_t* UidCL, uint8_t SAKValue) +{ + uint8_t* DataPtr = (uint8_t*) Buffer; + uint8_t NVB = DataPtr[1]; + //uint8_t CollisionByteCount = (NVB >> 4) & 0x0F; + //uint8_t CollisionBitCount = (NVB >> 0) & 0x0F; + + switch (NVB) { + case ISO14443A_NVB_AC_START: + /* Start of anticollision procedure. + * Send whole UID CLn + BCC */ + DataPtr[0] = UidCL[0]; + DataPtr[1] = UidCL[1]; + DataPtr[2] = UidCL[2]; + DataPtr[3] = UidCL[3]; + DataPtr[4] = ISO14443A_CALC_BCC(DataPtr); + + *BitCount = ISO14443A_CL_FRAME_SIZE; + + return false; + + case ISO14443A_NVB_AC_END: + /* End of anticollision procedure. + * Send SAK CLn if we are selected. */ + if ( (DataPtr[2] == UidCL[0]) && + (DataPtr[3] == UidCL[1]) && + (DataPtr[4] == UidCL[2]) && + (DataPtr[5] == UidCL[3]) ) { + + DataPtr[0] = SAKValue; + ISO14443AAppendCRCA(Buffer, 1); + + *BitCount = ISO14443A_SAK_FRAME_SIZE; + return true; + } else { + /* We have not been selected. Don't send anything. */ + *BitCount = 0; + return false; + } + default: + /* TODO: No anticollision supported */ + *BitCount = 0; + return false; + } +} + +INLINE +bool ISO14443AWakeUp(void* Buffer, uint16_t* BitCount, uint16_t ATQAValue) +{ + uint8_t* DataPtr = (uint8_t*) Buffer; + + if ( (DataPtr[0] == ISO14443A_CMD_REQA) || (DataPtr[0] == ISO14443A_CMD_WUPA) ){ + DataPtr[0] = (ATQAValue >> 0) & 0x00FF; + DataPtr[1] = (ATQAValue >> 8) & 0x00FF; + + *BitCount = ISO14443A_ATQA_FRAME_SIZE; + + return true; + } else { + return false; + } +} + +#endif diff --git a/RevE-light/Firmware/Chameleon-Mini/Application/MifareClassic.c b/RevE-light/Firmware/Chameleon-Mini/Application/MifareClassic.c new file mode 100644 index 0000000..a09345a --- /dev/null +++ b/RevE-light/Firmware/Chameleon-Mini/Application/MifareClassic.c @@ -0,0 +1,644 @@ +/* + * MifareClassic.c + * + * Created on: 13.05.2013 + * Author: skuser + */ + +#include "MifareClassic.h" + +#include "ISO14443-3A.h" +#include "../Codec/ISO14443-2A.h" +#include "../Memory.h" +#include "Crypto1.h" +#include "../Random.h" + +#define MFCLASSIC_1K_ATQA_VALUE 0x0004 +#define MFCLASSIC_4K_ATQA_VALUE 0x0002 +#define MFCLASSIC_1K_SAK_CL1_VALUE 0x08 +#define MFCLASSIC_4K_SAK_CL1_VALUE 0x18 + +#define MEM_UID_CL1_ADDRESS 0x00 +#define MEM_UID_CL1_SIZE 4 +#define MEM_UID_BCC1_ADDRESS 0x04 +#define MEM_KEY_A_OFFSET 48 /* Bytes */ +#define MEM_KEY_B_OFFSET 58 /* Bytes */ +#define MEM_KEY_BIGSECTOR_OFFSET 192 +#define MEM_KEY_SIZE 6 /* Bytes */ +#define MEM_SECTOR_ADDR_MASK 0xFC +#define MEM_BYTES_PER_BLOCK 16 /* Bytes */ +#define MEM_VALUE_SIZE 4 /* Bytes */ + +#define ACK_NAK_FRAME_SIZE 4 /* Bits */ +#define ACK_VALUE 0x0A +#define NAK_INVALID_ARG 0x00 +#define NAK_CRC_ERROR 0x01 +#define NAK_NOT_AUTHED 0x04 +#define NAK_EEPROM_ERROR 0x05 +#define NAK_OTHER_ERROR 0x06 + +#define CMD_AUTH_A 0x60 +#define CMD_AUTH_B 0x61 +#define CMD_AUTH_FRAME_SIZE 2 /* Bytes without CRCA */ +#define CMD_AUTH_RB_FRAME_SIZE 4 /* Bytes */ +#define CMD_AUTH_AB_FRAME_SIZE 8 /* Bytes */ +#define CMD_AUTH_BA_FRAME_SIZE 4 /* Bytes */ +#define CMD_HALT 0x50 +#define CMD_HALT_FRAME_SIZE 2 /* Bytes without CRCA */ +#define CMD_READ 0x30 +#define CMD_READ_FRAME_SIZE 2 /* Bytes without CRCA */ +#define CMD_READ_RESPONSE_FRAME_SIZE 16 /* Bytes without CRCA */ +#define CMD_WRITE 0xA0 +#define CMD_WRITE_FRAME_SIZE 2 /* Bytes without CRCA */ +#define CMD_DECREMENT 0xC0 +#define CMD_DECREMENT_FRAME_SIZE 2 /* Bytes without CRCA */ +#define CMD_INCREMENT 0xC1 +#define CMD_INCREMENT_FRAME_SIZE 2 /* Bytes without CRCA */ +#define CMD_RESTORE 0xC2 +#define CMD_RESTORE_FRAME_SIZE 2 /* Bytes without CRCA */ +#define CMD_TRANSFER 0xB0 +#define CMD_TRANSFER_FRAME_SIZE 2 /* Bytes without CRCA */ +#define CMD_CHINESE_UNLOCK 0x40 +#define CMD_CHINESE_WIPE 0x41 +#define CMD_CHINESE_UNLOCK_RW 0x43 + +static enum { + STATE_HALT, + STATE_IDLE, + STATE_CHINESE_IDLE, + STATE_CHINESE_WRITE, + STATE_READY, + STATE_ACTIVE, + STATE_AUTHING, + STATE_AUTHED_IDLE, + STATE_WRITE, + STATE_INCREMENT, + STATE_DECREMENT, + STATE_RESTORE +} State; + +static uint8_t CardResponse[4]; +static uint8_t ReaderResponse[4]; +static uint8_t CurrentAddress; +static uint8_t BlockBuffer[MEM_BYTES_PER_BLOCK]; +static uint16_t CardATQAValue; +static uint8_t CardSAKValue; + +INLINE bool CheckValueIntegrity(uint8_t* Block) +{ + /* Value Blocks contain a value stored three times, with + * the middle portion inverted. */ + if ( (Block[0] == (uint8_t) ~Block[4]) && (Block[0] == Block[8]) + && (Block[1] == (uint8_t) ~Block[5]) && (Block[1] == Block[9]) + && (Block[2] == (uint8_t) ~Block[6]) && (Block[2] == Block[10]) + && (Block[3] == (uint8_t) ~Block[7]) && (Block[3] == Block[11]) + && (Block[12] == (uint8_t) ~Block[13]) + && (Block[12] == Block[14]) + && (Block[14] == (uint8_t) ~Block[15])) { + return true; + } else { + return false; + } +} + +INLINE void ValueFromBlock(uint32_t* Value, uint8_t* Block) +{ + *Value = 0; + *Value |= ((uint32_t) Block[0] << 0); + *Value |= ((uint32_t) Block[1] << 8); + *Value |= ((uint32_t) Block[2] << 16); + *Value |= ((uint32_t) Block[3] << 24); +} + +INLINE void ValueToBlock(uint8_t* Block, uint32_t Value) +{ + Block[0] = (uint8_t) (Value >> 0); + Block[1] = (uint8_t) (Value >> 8); + Block[2] = (uint8_t) (Value >> 16); + Block[3] = (uint8_t) (Value >> 24); + Block[4] = ~Block[0]; + Block[5] = ~Block[1]; + Block[6] = ~Block[2]; + Block[7] = ~Block[3]; + Block[8] = Block[0]; + Block[9] = Block[1]; + Block[10] = Block[2]; + Block[11] = Block[3]; +} + +void MifareClassicAppInit1K(void) +{ + State = STATE_IDLE; + CardATQAValue = MFCLASSIC_1K_ATQA_VALUE; + CardSAKValue = MFCLASSIC_1K_SAK_CL1_VALUE; +} + +void MifareClassicAppInit4K(void) +{ + State = STATE_IDLE; + CardATQAValue = MFCLASSIC_4K_ATQA_VALUE; + CardSAKValue = MFCLASSIC_4K_SAK_CL1_VALUE; +} + +void MifareClassicAppReset(void) +{ + State = STATE_IDLE; +} + +void MifareClassicAppTask(void) +{ + +} + +uint16_t MifareClassicAppProcess(uint8_t* Buffer, uint16_t BitCount) +{ + switch(State) { + case STATE_IDLE: + case STATE_HALT: + if (ISO14443AWakeUp(Buffer, &BitCount, CardATQAValue)) { + State = STATE_READY; + return BitCount; + } +#ifdef SUPPORT_MF_CLASSIC_MAGIC_MODE + else if (Buffer[0] == CMD_CHINESE_UNLOCK) { + State = STATE_CHINESE_IDLE; + Buffer[0] = ACK_VALUE; + return ACK_NAK_FRAME_SIZE; + } +#endif + break; + +#ifdef SUPPORT_MF_CLASSIC_MAGIC_MODE + case STATE_CHINESE_IDLE: + /* Support special china commands that dont require authentication. */ + if (Buffer[0] == CMD_CHINESE_UNLOCK_RW) { + /* Unlock read and write commands */ + Buffer[0] = ACK_VALUE; + return ACK_NAK_FRAME_SIZE; + } else if (Buffer[0] == CMD_CHINESE_WIPE) { + /* Wipe memory */ + Buffer[0] = ACK_VALUE; + return ACK_NAK_FRAME_SIZE; + } else if (Buffer[0] == CMD_READ) { + if (ISO14443ACheckCRCA(Buffer, CMD_READ_FRAME_SIZE)) { + /* Read command. Read data from memory and append CRCA. */ + MemoryReadBlock(Buffer, (uint16_t) Buffer[1] * MEM_BYTES_PER_BLOCK, MEM_BYTES_PER_BLOCK); + ISO14443AAppendCRCA(Buffer, MEM_BYTES_PER_BLOCK); + + return (CMD_READ_RESPONSE_FRAME_SIZE + ISO14443A_CRCA_SIZE ) + * BITS_PER_BYTE; + } else { + Buffer[0] = NAK_CRC_ERROR; + return ACK_NAK_FRAME_SIZE; + } + } else if (Buffer[0] == CMD_WRITE) { + if (ISO14443ACheckCRCA(Buffer, CMD_WRITE_FRAME_SIZE)) { + /* Write command. Store the address and prepare for the upcoming data. + * Respond with ACK. */ + CurrentAddress = Buffer[1]; + State = STATE_CHINESE_WRITE; + + Buffer[0] = ACK_VALUE; + return ACK_NAK_FRAME_SIZE; + } else { + Buffer[0] = NAK_CRC_ERROR; + return ACK_NAK_FRAME_SIZE; + } + } else if (Buffer[0] == CMD_HALT) { + /* Halts the tag. According to the ISO14443, the second + * byte is supposed to be 0. */ + if (Buffer[1] == 0) { + if (ISO14443ACheckCRCA(Buffer, CMD_HALT_FRAME_SIZE)) { + /* According to ISO14443, we must not send anything + * in order to acknowledge the HALT command. */ + LogEntry(LOG_INFO_APP_CMD_HALT, NULL, 0); + State = STATE_HALT; + return ISO14443A_APP_NO_RESPONSE; + } else { + Buffer[0] = NAK_CRC_ERROR; + return ACK_NAK_FRAME_SIZE; + } + } else { + Buffer[0] = NAK_INVALID_ARG; + return ACK_NAK_FRAME_SIZE; + } + } + break; + + case STATE_CHINESE_WRITE: + if (ISO14443ACheckCRCA(Buffer, MEM_BYTES_PER_BLOCK)) { + /* CRC check passed. Write data into memory and send ACK. */ + if (!ActiveConfiguration.ReadOnly) { + MemoryWriteBlock(Buffer, CurrentAddress * MEM_BYTES_PER_BLOCK, MEM_BYTES_PER_BLOCK); + } + + Buffer[0] = ACK_VALUE; + } else { + /* CRC Error. */ + Buffer[0] = NAK_CRC_ERROR; + } + + State = STATE_CHINESE_IDLE; + + return ACK_NAK_FRAME_SIZE; +#endif + + case STATE_READY: + if (ISO14443AWakeUp(Buffer, &BitCount, CardATQAValue)) { + State = STATE_READY; + return BitCount; + } else if (Buffer[0] == ISO14443A_CMD_SELECT_CL1) { + /* Load UID CL1 and perform anticollision */ + uint8_t UidCL1[4]; + MemoryReadBlock(UidCL1, MEM_UID_CL1_ADDRESS, MEM_UID_CL1_SIZE); + + if (ISO14443ASelect(Buffer, &BitCount, UidCL1, CardSAKValue)) { + State = STATE_ACTIVE; + } + + return BitCount; + } else { + /* Unknown command. Enter HALT state. */ + State = STATE_HALT; + } + break; + + case STATE_ACTIVE: + if (ISO14443AWakeUp(Buffer, &BitCount, MFCLASSIC_1K_ATQA_VALUE)) { + State = STATE_READY; + return BitCount; + } else if (Buffer[0] == CMD_HALT) { + /* Halts the tag. According to the ISO14443, the second + * byte is supposed to be 0. */ + if (Buffer[1] == 0) { + if (ISO14443ACheckCRCA(Buffer, CMD_HALT_FRAME_SIZE)) { + /* According to ISO14443, we must not send anything + * in order to acknowledge the HALT command. */ + LogEntry(LOG_INFO_APP_CMD_HALT, NULL, 0); + + State = STATE_HALT; + return ISO14443A_APP_NO_RESPONSE; + } else { + Buffer[0] = NAK_CRC_ERROR; + return ACK_NAK_FRAME_SIZE; + } + } else { + Buffer[0] = NAK_INVALID_ARG; + return ACK_NAK_FRAME_SIZE; + } + } else if ( (Buffer[0] == CMD_AUTH_A) || (Buffer[0] == CMD_AUTH_B)) { + if (ISO14443ACheckCRCA(Buffer, CMD_AUTH_FRAME_SIZE)) { + uint8_t SectorAddress = Buffer[1] & MEM_SECTOR_ADDR_MASK; + uint8_t KeyOffset = (Buffer[0] == CMD_AUTH_A ? MEM_KEY_A_OFFSET : MEM_KEY_B_OFFSET); + uint16_t KeyAddress = (uint16_t) SectorAddress * MEM_BYTES_PER_BLOCK + KeyOffset; + uint8_t Key[6]; + uint8_t Uid[4]; + uint8_t CardNonce[4]; + + LogEntry(LOG_INFO_APP_CMD_AUTH, Buffer, 2); + + /* Generate a random nonce and read UID and key from memory */ + RandomGetBuffer(CardNonce, sizeof(CardNonce)); + MemoryReadBlock(Uid, MEM_UID_CL1_ADDRESS, MEM_UID_CL1_SIZE); + MemoryReadBlock(Key, KeyAddress, MEM_KEY_SIZE); + + /* Precalculate the reader response from card-nonce */ + for (uint8_t i=0; i= PAGE_READ_MIN) + && (PageAddress <= PAGE_READ_MAX) ) { + /* TODO: Missing address wrap around behaviour. + * Implement using a for-loop copying 4 bytes each iteration + * and mask pageaddress */ + MemoryReadBlock(Buffer, PageAddress * BYTES_PER_PAGE, BYTES_PER_READ); + ISO14443AAppendCRCA(Buffer, BYTES_PER_READ); + return (BYTES_PER_READ + ISO14443A_CRCA_SIZE) * 8; + } else { + Buffer[0] = NAK_INVALID_ARG; + return NAK_FRAME_SIZE; + } + } else { + Buffer[0] = NAK_CRC_ERROR; + return NAK_FRAME_SIZE; + } + } else if (Cmd == CMD_WRITE) { + /* This is a write command containing 4 bytes of data that + * should be written to the given page address. */ + uint8_t PageAddress = Buffer[1]; + if (ISO14443ACheckCRCA(Buffer, CMD_WRITE_FRAME_SIZE)) { + /* CRC check passed */ + if ( (PageAddress >= PAGE_WRITE_MIN) + && (PageAddress <= PAGE_WRITE_MAX) ) { + /* PageAddress is within bounds. */ + + if (!ActiveConfiguration.ReadOnly) { + MemoryWriteBlock(&Buffer[2], PageAddress * BYTES_PER_PAGE, BYTES_PER_WRITE); + } else { + /* If the chameleon is in read only mode, it silently + * ignores any attempt to write data. */ + } + + Buffer[0] = ACK_VALUE; + return ACK_FRAME_SIZE; + + } else { + Buffer[0] = NAK_INVALID_ARG; + return NAK_FRAME_SIZE; + } + } else { + Buffer[0] = NAK_CRC_ERROR; + return NAK_FRAME_SIZE; + } + } else if (Cmd == CMD_COMPAT_WRITE) { + /* The Mifare compatbility write command is a 2-frame command. + * The first frame contains the page-address and the second frame + * holds the data. */ + uint8_t PageAddress = Buffer[1]; + + if (ISO14443ACheckCRCA(Buffer, CMD_COMPAT_WRITE_FRAME_SIZE)) { + if ( (PageAddress >= PAGE_WRITE_MIN) + && (PageAddress <= PAGE_WRITE_MAX) ) { + /* CRC check passed and page-address is within bounds. + * Store address and proceed to receiving the data. */ + CompatWritePageAddress = PageAddress; + State = STATE_COMPAT_WRITE; + + Buffer[0] = ACK_VALUE; + return ACK_FRAME_SIZE; + } else { + Buffer[0] = NAK_INVALID_ARG; + return NAK_FRAME_SIZE; + } + } else { + Buffer[0] = NAK_CRC_ERROR; + return NAK_FRAME_SIZE; + } + } else if (Cmd == CMD_HALT) { + /* Halts the tag. According to the ISO14443, the second + * byte is supposed to be 0. */ + if (Buffer[1] == 0) { + if (ISO14443ACheckCRCA(Buffer, 2)) { + /* According to ISO14443, we must not send anything + * in order to acknowledge the HALT command. */ + State = STATE_HALT; + return ISO14443A_APP_NO_RESPONSE; + } else { + Buffer[0] = NAK_CRC_ERROR; + return NAK_FRAME_SIZE; + } + } else { + Buffer[0] = NAK_INVALID_ARG; + return NAK_FRAME_SIZE; + } + } else { + /* Unknown command. Enter halt state */ + State = STATE_IDLE; + } + break; + + case STATE_COMPAT_WRITE: + /* Compatibility write. Receiving 16 bytes of data of which 4 bytes are valid. */ + if (ISO14443ACheckCRCA(Buffer, BYTES_PER_COMPAT_WRITE)) { + /* We don't perform any checks here. You will be able to program the + * whole memory. Also there is no OTP behaviour. */ + if (!ActiveConfiguration.ReadOnly) { + MemoryWriteBlock(Buffer, CompatWritePageAddress * BYTES_PER_PAGE, BYTES_PER_WRITE); + } else { + /* If we are told to be read only, we silently ignore the write command + * and pretend to have written data. */ + } + + State = STATE_ACTIVE; + Buffer[0] = ACK_VALUE; + return ACK_FRAME_SIZE; + } else { + State = STATE_ACTIVE; + Buffer[0] = NAK_CRC_ERROR; + return NAK_FRAME_SIZE; + } + + default: + /* Unknown state? Should never happen. */ + break; + } + + /* No response has been sent, when we reach here */ + return ISO14443A_APP_NO_RESPONSE; +} + +void MifareUltralightGetUid(ConfigurationUidType Uid) +{ + /* Read UID from memory */ + MemoryReadBlock(&Uid[0], UID_CL1_ADDRESS, UID_CL1_SIZE); + MemoryReadBlock(&Uid[UID_CL1_SIZE], UID_CL2_ADDRESS, UID_CL2_SIZE); +} + +void MifareUltralightSetUid(ConfigurationUidType Uid) +{ + /* Calculate check bytes and write everything into memory */ + uint8_t BCC1 = ISO14443A_UID0_CT ^ Uid[0] ^ Uid[1] ^ Uid[2]; + uint8_t BCC2 = Uid[3] ^ Uid[4] ^ Uid[5] ^ Uid[6]; + + MemoryWriteBlock(&Uid[0], UID_CL1_ADDRESS, UID_CL1_SIZE); + MemoryWriteBlock(&BCC1, UID_BCC1_ADDRESS, ISO14443A_CL_BCC_SIZE); + MemoryWriteBlock(&Uid[UID_CL1_SIZE], UID_CL2_ADDRESS, UID_CL2_SIZE); + MemoryWriteBlock(&BCC2, UID_BCC2_ADDRESS, ISO14443A_CL_BCC_SIZE); +} diff --git a/RevE-light/Firmware/Chameleon-Mini/Application/MifareUltralight.h b/RevE-light/Firmware/Chameleon-Mini/Application/MifareUltralight.h new file mode 100644 index 0000000..275685c --- /dev/null +++ b/RevE-light/Firmware/Chameleon-Mini/Application/MifareUltralight.h @@ -0,0 +1,28 @@ +/* + * MifareUltralight.h + * + * Created on: 20.03.2013 + * Author: skuser + */ + +#ifndef MIFAREULTRALIGHT_H_ +#define MIFAREULTRALIGHT_H_ + +#include "Application.h" +#include "ISO14443-3A.h" + +#define MIFARE_ULTRALIGHT_UID_SIZE ISO14443A_UID_SIZE_DOUBLE +#define MIFARE_ULTRALIGHT_MEM_SIZE 64 + +void MifareUltralightAppInit(void); +void MifareUltralightAppReset(void); +void MifareUltralightAppTask(void); + +uint16_t MifareUltralightAppProcess(uint8_t* Buffer, uint16_t BitCount); + +void MifareUltralightGetUid(ConfigurationUidType Uid); +void MifareUltralightSetUid(ConfigurationUidType Uid); + + + +#endif /* MIFAREULTRALIGHT_H_ */ diff --git a/RevE-light/Firmware/Chameleon-Mini/Battery.h b/RevE-light/Firmware/Chameleon-Mini/Battery.h new file mode 100644 index 0000000..02faa14 --- /dev/null +++ b/RevE-light/Firmware/Chameleon-Mini/Battery.h @@ -0,0 +1,36 @@ +/* + * Battery.h + * + * Created on: 20.08.2014 + * Author: sk + */ + +#ifndef BATTERY_H_ +#define BATTERY_H_ + +#include "Common.h" + +#define BATTERY_PORT PORTD +#define BATTERY_STAT_PIN PIN4_bm +#define BATTERY_STAT_PINCTRL PIN4CTRL +#define BATTERY_PORT_MASK (BATTERY_STAT_PIN) + +INLINE void BatteryInit(void) +{ + BATTERY_PORT.DIRCLR = BATTERY_PORT_MASK; + BATTERY_PORT.BATTERY_STAT_PINCTRL = PORT_OPC_PULLUP_gc; +} + +INLINE bool BatteryIsCharging(void) +{ + if (!(BATTERY_PORT.IN & BATTERY_STAT_PIN)) + { + return true; + } + else + { + return false; + } +} + +#endif /* BATTERY_H_ */ diff --git a/RevE-light/Firmware/Chameleon-Mini/Button.c b/RevE-light/Firmware/Chameleon-Mini/Button.c new file mode 100644 index 0000000..b6d38d7 --- /dev/null +++ b/RevE-light/Firmware/Chameleon-Mini/Button.c @@ -0,0 +1,217 @@ +#include "Button.h" +#include "Random.h" +#include "Common.h" +#include "Settings.h" +#include "Memory.h" +#include "Map.h" +#include "Application/Application.h" + +#define BUTTON_PORT PORTA +#define BUTTON_L PIN3_bm +#define BUTTON_R PIN6_bm +#define BUTTON_L_PINCTRL PIN3CTRL +#define BUTTON_R_PINCTRL PIN6CTRL +#define BUTTON_MASK (BUTTON_L | BUTTON_R) + +#define LONG_PRESS_TICK_COUNT 10 + +static const MapEntryType PROGMEM ButtonActionMap[] = { + { .Id = BUTTON_ACTION_NONE, .Text = "NONE" }, + { .Id = BUTTON_ACTION_UID_RANDOM, .Text = "UID_RANDOM" }, + { .Id = BUTTON_ACTION_UID_LEFT_INCREMENT, .Text = "UID_LEFT_INCREMENT" }, + { .Id = BUTTON_ACTION_UID_RIGHT_INCREMENT, .Text = "UID_RIGHT_INCREMENT" }, + { .Id = BUTTON_ACTION_UID_LEFT_DECREMENT, .Text = "UID_LEFT_DECREMENT" }, + { .Id = BUTTON_ACTION_UID_RIGHT_DECREMENT, .Text = "UID_RIGHT_DECREMENT" }, + { .Id = BUTTON_ACTION_CYCLE_SETTINGS, .Text = "CYCLE_SETTINGS" }, + { .Id = BUTTON_ACTION_STORE_MEM, .Text = "STORE_MEM" }, + { .Id = BUTTON_ACTION_RECALL_MEM, .Text = "RECALL_MEM" }, +}; + +static void ExecuteButtonAction(ButtonActionEnum ButtonAction) +{ + uint8_t UidBuffer[32]; + + if (ButtonAction == BUTTON_ACTION_UID_RANDOM) { + for (uint8_t i=0; i 0) { + if (Carry) { + if (UidBuffer[i] == 0xFF) { + Carry = 1; + } else { + Carry = 0; + } + + UidBuffer[i] = (UidBuffer[i] + 1) & 0xFF; + } + } + + ApplicationSetUid(UidBuffer); + } else if (ButtonAction == BUTTON_ACTION_UID_LEFT_DECREMENT) { + ApplicationGetUid(UidBuffer); + bool Carry = 1; + uint8_t i; + + for (i=0; i 0) { + if (Carry) { + if (UidBuffer[i] == 0x00) { + Carry = 1; + } else { + Carry = 0; + } + + UidBuffer[i] = (UidBuffer[i] - 1) & 0xFF; + } + } + + ApplicationSetUid(UidBuffer); + } else if (ButtonAction == BUTTON_ACTION_CYCLE_SETTINGS) { + SettingsCycle(); + } else if (ButtonAction == BUTTON_ACTION_STORE_MEM) { + MemoryStore(); + } else if (ButtonAction == BUTTON_ACTION_RECALL_MEM) { + MemoryRecall(); + } +} + +void ButtonInit(void) +{ + BUTTON_PORT.DIRCLR = BUTTON_MASK; + BUTTON_PORT.BUTTON_R_PINCTRL = PORT_OPC_PULLUP_gc; + BUTTON_PORT.BUTTON_L_PINCTRL = PORT_OPC_PULLUP_gc; +} + +void ButtonTick(void) +{ + static uint8_t ButtonRPressTick = 0; + static uint8_t ButtonLPressTick = 0; + uint8_t ThisButtonState = ~BUTTON_PORT.IN; + + if (ThisButtonState & BUTTON_R) { + /* Button is currently pressed */ + if (ButtonRPressTick < LONG_PRESS_TICK_COUNT) { + /* Count ticks while button is being pressed */ + ButtonRPressTick++; + } else if (ButtonRPressTick == LONG_PRESS_TICK_COUNT) { + /* Long button press detected execute button action and advance PressTickCounter + * to an invalid state. */ + ExecuteButtonAction(GlobalSettings.ActiveSettingPtr->ButtonActions[BUTTON_R_PRESS_LONG]); + ButtonRPressTick++; + } else { + /* Button is still pressed, ignore */ + } + } else if (!(ThisButtonState & BUTTON_MASK)) { + /* Button is currently not being pressed. Check if PressTickCounter contains + * a recent short button press. */ + if ( (ButtonRPressTick > 0) && (ButtonRPressTick <= LONG_PRESS_TICK_COUNT) ) { + /* We have a short button press */ + ExecuteButtonAction(GlobalSettings.ActiveSettingPtr->ButtonActions[BUTTON_R_PRESS_SHORT]); + } + + ButtonRPressTick = 0; + } + + if (ThisButtonState & BUTTON_L) { + /* Button is currently pressed */ + if (ButtonLPressTick < LONG_PRESS_TICK_COUNT) { + /* Count ticks while button is being pressed */ + ButtonLPressTick++; + } else if (ButtonLPressTick == LONG_PRESS_TICK_COUNT) { + /* Long button press detected execute button action and advance PressTickCounter + * to an invalid state. */ + ExecuteButtonAction(GlobalSettings.ActiveSettingPtr->ButtonActions[BUTTON_L_PRESS_LONG]); + ButtonLPressTick++; + } else { + /* Button is still pressed, ignore */ + } + } else if (!(ThisButtonState & BUTTON_MASK)) { + /* Button is currently not being pressed. Check if PressTickCounter contains + * a recent short button press. */ + if ( (ButtonLPressTick > 0) && (ButtonLPressTick <= LONG_PRESS_TICK_COUNT) ) { + /* We have a short button press */ + ExecuteButtonAction(GlobalSettings.ActiveSettingPtr->ButtonActions[BUTTON_L_PRESS_SHORT]); + } + + ButtonLPressTick = 0; + } +} + +void ButtonGetActionList(char* List, uint16_t BufferSize) +{ + MapToString(ButtonActionMap, sizeof(ButtonActionMap)/sizeof(*ButtonActionMap), List, BufferSize); +} + +void ButtonSetActionById(ButtonTypeEnum Type, ButtonActionEnum Action) +{ +#ifndef BUTTON_SETTING_GLOBAL + GlobalSettings.ActiveSettingPtr->ButtonActions[Type] = Action; +#else + /* Write button action to all settings when using global settings */ + for (uint8_t i=0; iButtonActions[Type], Action, BufferSize); +} + +bool ButtonSetActionByName(ButtonTypeEnum Type, const char* Action) +{ + MapIdType Id; + + if (MapTextToId(ButtonActionMap, sizeof(ButtonActionMap)/sizeof(*ButtonActionMap), + Action, &Id)) { + ButtonSetActionById(Type, Id); + return true; + } else { + return false; + } +} diff --git a/RevE-light/Firmware/Chameleon-Mini/Button.h b/RevE-light/Firmware/Chameleon-Mini/Button.h new file mode 100644 index 0000000..154813c --- /dev/null +++ b/RevE-light/Firmware/Chameleon-Mini/Button.h @@ -0,0 +1,46 @@ +/* + * Button.h + * + * Created on: 13.05.2013 + * Author: skuser + */ + +#ifndef BUTTON_H_ +#define BUTTON_H_ + +#include "Common.h" + +typedef enum { + BUTTON_R_PRESS_SHORT = 0, + BUTTON_R_PRESS_LONG, + BUTTON_L_PRESS_SHORT, + BUTTON_L_PRESS_LONG, + + /* Must be last element */ + BUTTON_TYPE_COUNT +} ButtonTypeEnum; + +typedef enum { + BUTTON_ACTION_NONE, + BUTTON_ACTION_UID_RANDOM, + BUTTON_ACTION_UID_LEFT_INCREMENT, + BUTTON_ACTION_UID_RIGHT_INCREMENT, + BUTTON_ACTION_UID_LEFT_DECREMENT, + BUTTON_ACTION_UID_RIGHT_DECREMENT, + BUTTON_ACTION_CYCLE_SETTINGS, + BUTTON_ACTION_STORE_MEM, + BUTTON_ACTION_RECALL_MEM, + + /* This has to be last element */ + BUTTON_ACTION_COUNT +} ButtonActionEnum; + +void ButtonInit(void); +void ButtonTick(void); + +void ButtonGetActionList(char* List, uint16_t BufferSize); +void ButtonSetActionById(ButtonTypeEnum Type, ButtonActionEnum Action); +void ButtonGetActionByName(ButtonTypeEnum Type, char* Action, uint16_t BufferSize); +bool ButtonSetActionByName(ButtonTypeEnum Type, const char* Action); + +#endif /* BUTTON_H_ */ diff --git a/RevE-light/Firmware/Chameleon-Mini/Chameleon-Mini.c b/RevE-light/Firmware/Chameleon-Mini/Chameleon-Mini.c new file mode 100644 index 0000000..220f1de --- /dev/null +++ b/RevE-light/Firmware/Chameleon-Mini/Chameleon-Mini.c @@ -0,0 +1,43 @@ +#include "Chameleon-Mini.h" +#include "LEDHook.h" + +int main(void) +{ + SystemInit(); + SettingsLoad(); + LogInit(); + LEDInit(); + MemoryInit(); + ConfigurationInit(); + TerminalInit(); + RandomInit(); + ButtonInit(); + AntennaLevelInit(); + + SystemInterruptInit(); + SystemSleepEnable(); + + + while(1) + { + if (SystemTick100ms()) + { + RandomTick(); + TerminalTick(); + ButtonTick(); + LogTick(); + LEDTick(); + ApplicationTick(); + + LEDHook(LED_POWERED, LED_ON); + } + + TerminalTask(); + ApplicationTask(); + LogTask(); + CodecTask(); + } +} + + + diff --git a/RevE-light/Firmware/Chameleon-Mini/Chameleon-Mini.h b/RevE-light/Firmware/Chameleon-Mini/Chameleon-Mini.h new file mode 100644 index 0000000..709e178 --- /dev/null +++ b/RevE-light/Firmware/Chameleon-Mini/Chameleon-Mini.h @@ -0,0 +1,25 @@ +#ifndef CHAMELEON_MINI_H +#define CHAMELEON_MINI_H + +#include +#include +#include +#include + +#include "System.h" +#include "Memory.h" +#include "LED.h" +#include "Terminal/Terminal.h" +#include "Codec/Codec.h" +#include "Application/Application.h" +#include "Configuration.h" +#include "Random.h" +#include "Button.h" +#include "Log.h" +#include "AntennaLevel.h" +#include "Settings.h" + +#define CHAMELEON_MINI_VERSION_STRING BUILD_DATE + +#endif //CHAMELEON_MINI_H + diff --git a/RevE-light/Firmware/Chameleon-Mini/Codec/Codec.c b/RevE-light/Firmware/Chameleon-Mini/Codec/Codec.c new file mode 100644 index 0000000..08729ef --- /dev/null +++ b/RevE-light/Firmware/Chameleon-Mini/Codec/Codec.c @@ -0,0 +1,10 @@ +/* + * CODEC.c + * + * Created on: 18.02.2013 + * Author: skuser + */ + +#include "Codec.h" + +uint8_t CodecBuffer[CODEC_BUFFER_SIZE]; diff --git a/RevE-light/Firmware/Chameleon-Mini/Codec/Codec.h b/RevE-light/Firmware/Chameleon-Mini/Codec/Codec.h new file mode 100644 index 0000000..beaaf2a --- /dev/null +++ b/RevE-light/Firmware/Chameleon-Mini/Codec/Codec.h @@ -0,0 +1,78 @@ +/* + * CODEC.h + * + * Created on: 18.02.2013 + * Author: skuser + */ + +#ifndef CODEC_H_ +#define CODEC_H_ + +#include +#include +#include +#include "../Common.h" +#include "../Configuration.h" + +#include "ISO14443-2A.h" + +#define CODEC_DEMOD_POWER_PORT PORTB +#define CODEC_DEMOD_POWER_MASK PIN1_bm +#define CODEC_DEMOD_IN_PORT PORTB +#define CODEC_DEMOD_IN_MASK (CODEC_DEMOD_IN_MASK0 | CODEC_DEMOD_IN_MASK1) +#define CODEC_DEMOD_IN_MASK0 PIN2_bm +#define CODEC_DEMOD_IN_MASK1 PIN0_bm +#define CODEC_DEMOD_IN_PINCTRL0 PIN2CTRL +#define CODEC_DEMOD_IN_PINCTRL1 PIN0CTRL +#define CODEC_DEMOD_IN_EVMUX0 EVSYS_CHMUX_PORTB_PIN2_gc +#define CODEC_DEMOD_IN_EVMUX1 EVSYS_CHMUX_PORTB_PIN0_gc +#define CODEC_DEMOD_IN_INT0_VECT PORTB_INT0_vect +#define CODEC_LOADMOD_PORT PORTC +#define CODEC_LOADMOD_MASK PIN6_bm +#define CODEC_CARRIER_IN_PORT PORTC +#define CODEC_CARRIER_IN_MASK PIN2_bm +#define CODEC_CARRIER_IN_PINCTRL PIN2CTRL +#define CODEC_CARRIER_IN_EVMUX EVSYS_CHMUX_PORTC_PIN2_gc +#define CODEC_SUBCARRIER_PORT PORTC +#define CODEC_SUBCARRIER_MASK_PSK PIN0_bm +#define CODEC_SUBCARRIER_MASK_OOK PIN1_bm +#define CODEC_SUBCARRIER_MASK (CODEC_SUBCARRIER_MASK_PSK | CODEC_SUBCARRIER_MASK_OOK) +#define CODEC_SUBCARRIER_TIMER TCC0 +#define CODEC_SUBCARRIER_CC_PSK CCA +#define CODEC_SUBCARRIER_CC_OOK CCB +#define CODEC_SUBCARRIER_CCEN_PSK TC0_CCAEN_bm +#define CODEC_SUBCARRIER_CCEN_OOK TC0_CCBEN_bm +#define CODEC_TIMER_SAMPLING TCC1 +#define CODEC_TIMER_SAMPLING_CCA_VECT TCC1_CCA_vect +#define CODEC_TIMER_LOADMOD TCD1 +#define CODEC_TIMER_OVF_VECT TCD1_OVF_vect + +#define CODEC_BUFFER_SIZE 256 /* Byte */ + +#define CODEC_CARRIER_FREQ 13560000 + +extern uint8_t CodecBuffer[CODEC_BUFFER_SIZE]; + +INLINE void CodecInit(void) { + ActiveConfiguration.CodecInitFunc(); +} + +INLINE void CodecDeInit(void) { + ActiveConfiguration.CodecDeInitFunc(); +} + +INLINE void CodecTask(void) { + ActiveConfiguration.CodecTaskFunc(); +} + +INLINE void CodecSetDemodPower(bool bOnOff) { + CODEC_DEMOD_POWER_PORT.DIRSET = CODEC_DEMOD_POWER_MASK; + + if (bOnOff) { + CODEC_DEMOD_POWER_PORT.OUTSET = CODEC_DEMOD_POWER_MASK; + } else { + CODEC_DEMOD_POWER_PORT.OUTCLR = CODEC_DEMOD_POWER_MASK; + } +} + +#endif /* CODEC_H_ */ diff --git a/RevE-light/Firmware/Chameleon-Mini/Codec/ISO14443-2A.c b/RevE-light/Firmware/Chameleon-Mini/Codec/ISO14443-2A.c new file mode 100644 index 0000000..fb4d0f3 --- /dev/null +++ b/RevE-light/Firmware/Chameleon-Mini/Codec/ISO14443-2A.c @@ -0,0 +1,479 @@ +/* + * ISO14443A.c + * + * Created on: 18.02.2013 + * Author: skuser + */ + +#include "ISO14443-2A.h" +#include "../System.h" +#include "../Application/Application.h" +#include "../LEDHook.h" +#include "Codec.h" +#include "Log.h" + +/* Timing definitions for ISO14443A */ +#define ISO14443A_SUBCARRIER_DIVIDER 16 +#define ISO14443A_BIT_GRID_CYCLES 128 +#define ISO14443A_BIT_RATE_CYCLES 128 +#define ISO14443A_FRAME_DELAY_PREV1 (1236 - 24) /* compensate for ISR prolog */ +#define ISO14443A_FRAME_DELAY_PREV0 (1172 - 24) + +/* Sampling is done using internal clock, synchronized to the field modulation. + * For that we need to convert the bit rate for the internal clock. */ +#define SAMPLE_RATE_SYSTEM_CYCLES ((uint16_t) (((uint64_t) F_CPU * ISO14443A_BIT_RATE_CYCLES) / CODEC_CARRIER_FREQ) ) + +static volatile struct { + volatile bool DemodFinished; + volatile bool LoadmodFinished; +} Flags = { 0 }; + +typedef enum { + LOADMOD_FDT, + LOADMOD_START, + LOADMOD_START_BIT0, + LOADMOD_START_BIT1, + LOADMOD_DATA0, + LOADMOD_DATA1, + LOADMOD_PARITY0, + LOADMOD_PARITY1, + LOADMOD_STOP_BIT0, + LOADMOD_STOP_BIT1, + LOADMOD_FINISHED +} LoadModStateType; + +static volatile uint8_t* CodecBufferPtr; +static volatile uint8_t* ParityBufferPtr; +static volatile uint16_t BitCount; +static volatile uint16_t BitSent; +static volatile uint8_t DataRegister; +static volatile uint8_t SampleRegister; +static volatile bool IsParityBit; +static volatile uint8_t LastBit; +static volatile LoadModStateType LoadModState; +static volatile bool SamplePosition; + +static void Initialize(void) { + /* Configure CARRIER input pin and route it to EVSYS */ + CODEC_CARRIER_IN_PORT.DIRCLR = CODEC_CARRIER_IN_MASK; + CODEC_CARRIER_IN_PORT.CODEC_CARRIER_IN_PINCTRL = PORT_ISC_BOTHEDGES_gc; + EVSYS.CH6MUX = CODEC_CARRIER_IN_EVMUX; + + /* Configure two DEMOD pins for input. + * Configure event channel 0 for rising edge (begin of modulation pause) + * Configure event channel 1 for falling edge (end of modulation pause) */ + CODEC_DEMOD_IN_PORT.DIRCLR = CODEC_DEMOD_IN_MASK; + CODEC_DEMOD_IN_PORT.CODEC_DEMOD_IN_PINCTRL0 = PORT_ISC_RISING_gc; + CODEC_DEMOD_IN_PORT.CODEC_DEMOD_IN_PINCTRL1 = PORT_ISC_FALLING_gc; + CODEC_DEMOD_IN_PORT.INT0MASK = 0; + CODEC_DEMOD_IN_PORT.INTCTRL = PORT_INT0LVL_HI_gc; + EVSYS.CH0MUX = CODEC_DEMOD_IN_EVMUX0; + EVSYS.CH1MUX = CODEC_DEMOD_IN_EVMUX1; + + /* Configure LOADMOD and SUBCARRIER output pins. + * Disable PSK modulation by setting pin to low. */ + CODEC_LOADMOD_PORT.DIRSET = CODEC_LOADMOD_MASK; + CODEC_LOADMOD_PORT.OUTCLR = CODEC_LOADMOD_MASK; + CODEC_SUBCARRIER_PORT.DIRSET = CODEC_SUBCARRIER_MASK; + CODEC_SUBCARRIER_PORT.OUTCLR = CODEC_SUBCARRIER_MASK; + + /* Configure subcarrier generation with 50% DC output using OOK */ + CODEC_SUBCARRIER_TIMER.PER = ISO14443A_SUBCARRIER_DIVIDER - 1; + CODEC_SUBCARRIER_TIMER.CODEC_SUBCARRIER_CC_OOK = ISO14443A_SUBCARRIER_DIVIDER/2; + CODEC_SUBCARRIER_TIMER.CTRLB = CODEC_SUBCARRIER_CCEN_OOK | TC_WGMODE_SINGLESLOPE_gc; +} + +static void StartDemod(void) { + /* Activate Power for demodulator */ + CodecSetDemodPower(true); + + CodecBufferPtr = CodecBuffer; + ParityBufferPtr = &CodecBuffer[ISO14443A_BUFFER_PARITY_OFFSET]; + DataRegister = 0; + SampleRegister = 0; + SamplePosition = 0; + BitCount = 0; + IsParityBit = false; + + /* Configure sampling-timer free running and sync to first modulation-pause. */ + CODEC_TIMER_SAMPLING.CNT = 0; + CODEC_TIMER_SAMPLING.PER = SAMPLE_RATE_SYSTEM_CYCLES - 1; + CODEC_TIMER_SAMPLING.CCA = 0xFFFF; /* CCA Interrupt is not active! */ + CODEC_TIMER_SAMPLING.CTRLA = TC_CLKSEL_DIV1_gc; + CODEC_TIMER_SAMPLING.CTRLD = TC_EVACT_RESTART_gc | TC_EVSEL_CH0_gc; + CODEC_TIMER_SAMPLING.INTCTRLB = TC_CCAINTLVL_HI_gc; + + /* Start looking out for modulation pause via interrupt. */ + CODEC_DEMOD_IN_PORT.INT0MASK = CODEC_DEMOD_IN_MASK0; + SystemSleepSetMode(SYSTEM_SMODE_PSAVE); +} + +ISR(CODEC_DEMOD_IN_INT0_VECT) { + /* This is the first edge of the first modulation-pause after StartDemod. + * Now we have time to start + * demodulating beginning from one bit-width after this edge. */ + SystemSleepSetMode(SYSTEM_SMODE_IDLE); + + /* Sampling timer has been preset to sample-rate and has automatically synced + * to THIS first modulation pause. Thus after exactly one bit-width from here, + * an OVF is generated. We want to start sampling with the next bit and use the + * XYZBUF mechanism of the xmega to automatically double the sampling rate on the + * next overflow. For this we have to temporarily deactivate the automatical alignment + * in order to catch next overflow event for updating the BUF registers. + * We want to sample the demodulated data stream in the first quarter of the half-bit + * where the pulsed miller encoded is located. */ + CODEC_TIMER_SAMPLING.CTRLD = TC_EVACT_OFF_gc; + CODEC_TIMER_SAMPLING.PERBUF = SAMPLE_RATE_SYSTEM_CYCLES/2 - 1; /* Half bit width */ + CODEC_TIMER_SAMPLING.CCABUF = SAMPLE_RATE_SYSTEM_CYCLES/8 - 10 - 1; /* Compensate for DIGFILT and ISR prolog */ + + /* Setup Frame Delay Timer and wire to EVSYS. Frame delay time is + * measured from last change in RF field, therefore we use + * the event channel 1 (end of modulation pause) as the restart event. + * The preliminary frame delay time chosen here is irrelevant, because + * the correct FDT gets set automatically after demodulation. */ + CODEC_TIMER_LOADMOD.CNT = 0; + CODEC_TIMER_LOADMOD.PER = 0xFFFF; + CODEC_TIMER_LOADMOD.CTRLD = TC_EVACT_RESTART_gc | TC_EVSEL_CH1_gc; + CODEC_TIMER_LOADMOD.CTRLA = TC_CLKSEL_EVCH6_gc; + + /* Disable this interrupt */ + CODEC_DEMOD_IN_PORT.INT0MASK = 0; +} + +ISR(CODEC_TIMER_SAMPLING_CCA_VECT) { + /* This interrupt gets called twice for every bit to sample it. */ + uint8_t SamplePin = CODEC_DEMOD_IN_PORT.IN & CODEC_DEMOD_IN_MASK; + uint8_t NewSampleRegister; + + /* Shift sampled bit into sampling register and hold a local copy for fast access. */ + NewSampleRegister = SampleRegister << 1; + NewSampleRegister |= (!SamplePin ? 0x01 : 0x00); + SampleRegister = NewSampleRegister; + + if (SamplePosition) { + /* Analyze the sampling register after 2 samples. */ + if ((NewSampleRegister & 0x07) == 0x07) { + /* No carrier modulation for 3 sample points. EOC! */ + CODEC_TIMER_SAMPLING.CTRLA = TC_CLKSEL_OFF_gc; + CODEC_TIMER_SAMPLING.INTFLAGS = TC0_CCAIF_bm; + + /* By this time, the FDT timer is aligned to the last modulation + * edge of the reader. So we disable the auto-synchronization and + * let it count the frame delay time in the background, and generate + * an interrupt once it has reached the FDT. */ + CODEC_TIMER_LOADMOD.CTRLD = TC_EVACT_OFF_gc; + + if (LastBit) { + CODEC_TIMER_LOADMOD.PER = ISO14443A_FRAME_DELAY_PREV1; + } else { + CODEC_TIMER_LOADMOD.PER = ISO14443A_FRAME_DELAY_PREV0; + } + + LoadModState = LOADMOD_FDT; + + CODEC_TIMER_LOADMOD.INTFLAGS = TC1_OVFIF_bm; + CODEC_TIMER_LOADMOD.INTCTRLA = TC_OVFINTLVL_HI_gc; + + /* Determine if we did not receive a multiple of 8 bits. + * If this is the case, right-align the remaining data and + * store it into the buffer. */ + uint8_t RemainingBits = BitCount % 8; + if (RemainingBits != 0) { + uint8_t NewDataRegister = DataRegister; + + while (RemainingBits++ < 8) { + /* Pad with zeroes to right-align. */ + NewDataRegister >>= 1; + } + + /* TODO: Prevent buffer overflow */ + *CodecBufferPtr = NewDataRegister; + } + + /* Signal, that we have finished sampling */ + Flags.DemodFinished = 1; + } else { + /* Otherwise, we check the two sample bits from the bit before. */ + uint8_t BitSample = NewSampleRegister & 0xC; + uint8_t Bit = 0; + + if (BitSample != (0x0 << 2)) { + /* We have a valid bit. decode and process it. */ + if (BitSample & (0x1 << 2)) { + /* 01 sequence or 11 sequence -> This is a zero bit */ + Bit = 0; + } else { + /* 10 sequence -> This is a one bit */ + Bit = 1; + } + + LastBit = Bit; + + if (!IsParityBit) { + /* This is a data bit, so shift it into the data register and + * hold a local copy of it. */ + uint8_t NewDataRegister = DataRegister >> 1; + NewDataRegister |= (Bit ? 0x80 : 0x00); + DataRegister = NewDataRegister; + + /* Update bitcount */ + uint16_t NewBitCount = ++BitCount; + if ((NewBitCount & 0x07) == 0) { + /* We have reached a byte boundary! Store the data register. */ + /* TODO: Prevent buffer overflow */ + *CodecBufferPtr++ = NewDataRegister; + + /* Store bit for determining FDT at EOC and enable parity + * handling on next bit. */ + IsParityBit = true; + } + + } else { + /* This is a parity bit. Store it */ + /* TODO: Store parity and prevent overflow */ + //*ParityBufferPtr++ = Bit; + IsParityBit = false; + } + } else { + /* 00 sequence. -> No valid data yet. This also occurs if we just started + * sampling and have sampled less than 2 bits yet. Thus ignore. */ + } + } + } else { + /* On odd sample position just sample. */ + } + + SamplePosition = !SamplePosition; + + /* Make sure the sampling timer gets automatically aligned to the + * modulation pauses by using the RESTART event. + * This can be understood as a "poor mans PLL" and makes sure that we are + * never too far out the bit-grid while sampling. */ + CODEC_TIMER_SAMPLING.CTRLD = TC_EVACT_RESTART_gc | TC_EVSEL_CH0_gc; +} + +ISR(CODEC_TIMER_OVF_VECT) { + /* Bit rate timer. Output a half bit on the output. */ + uint8_t Temp8; + uint16_t Temp16; + + switch (LoadModState) { + case LOADMOD_FDT: + /* No data has been produced, but FDT has ended. Switch over to bit-grid aligning. */ + CODEC_TIMER_LOADMOD.PER = ISO14443A_BIT_GRID_CYCLES - 1; + break; + + case LOADMOD_START: + /* Application produced data. With this interrupt we are aligned to the bit-grid. + * Start subcarrier generation and align to bitrate. */ + CODEC_TIMER_LOADMOD.PER = ISO14443A_BIT_RATE_CYCLES / 2 - 1; + CODEC_SUBCARRIER_TIMER.CTRLA = TC_CLKSEL_EVCH6_gc; + + /* Fallthrough to first bit */ + + case LOADMOD_START_BIT0: + CODEC_LOADMOD_PORT.OUTSET = CODEC_LOADMOD_MASK; + LoadModState = LOADMOD_START_BIT1; + break; + + case LOADMOD_START_BIT1: + CODEC_LOADMOD_PORT.OUTCLR = CODEC_LOADMOD_MASK; + LoadModState = LOADMOD_DATA0; + + /* Fetch first byte */ + DataRegister = *CodecBufferPtr; + break; + + case LOADMOD_DATA0: + if (DataRegister & 1) { + CODEC_LOADMOD_PORT.OUTSET = CODEC_LOADMOD_MASK; + } else { + CODEC_LOADMOD_PORT.OUTCLR = CODEC_LOADMOD_MASK; + } + + LoadModState = LOADMOD_DATA1; + break; + + case LOADMOD_DATA1: + Temp8 = DataRegister; + + if (Temp8 & 1) { + CODEC_LOADMOD_PORT.OUTCLR = CODEC_LOADMOD_MASK; + } else { + CODEC_LOADMOD_PORT.OUTSET = CODEC_LOADMOD_MASK; + } + + DataRegister = Temp8 >> 1; + + Temp16 = BitSent; + BitSent = ++Temp16; + + if ((Temp16 & 0x07) == 0) { + /* Byte boundary. Load parity bit and output it later. */ + LoadModState = LOADMOD_PARITY0; + break; + } + + if (Temp16 == BitCount) { + /* End of transmission without byte boundary. Don't send parity. */ + LoadModState = LOADMOD_STOP_BIT0; + break; + } + + /* Next bit is data */ + LoadModState = LOADMOD_DATA0; + + break; + + case LOADMOD_PARITY0: + if (*ParityBufferPtr) { + CODEC_LOADMOD_PORT.OUTSET = CODEC_LOADMOD_MASK; + } else { + CODEC_LOADMOD_PORT.OUTCLR = CODEC_LOADMOD_MASK; + } + + LoadModState = LOADMOD_PARITY1; + break; + + case LOADMOD_PARITY1: + if (*ParityBufferPtr) { + CODEC_LOADMOD_PORT.OUTCLR = CODEC_LOADMOD_MASK; + } else { + CODEC_LOADMOD_PORT.OUTSET = CODEC_LOADMOD_MASK; + } + + if (BitSent == BitCount) { + /* No data left */ + LoadModState = LOADMOD_STOP_BIT0; + } else { + /* Fetch next data and continue sending bits. */ + ParityBufferPtr++; + DataRegister = *++CodecBufferPtr; + LoadModState = LOADMOD_DATA0; + } + + break; + + case LOADMOD_STOP_BIT0: + CODEC_LOADMOD_PORT.OUTCLR = CODEC_LOADMOD_MASK; + LoadModState = LOADMOD_STOP_BIT1; + break; + + case LOADMOD_STOP_BIT1: + CODEC_LOADMOD_PORT.OUTCLR = CODEC_LOADMOD_MASK; + LoadModState = LOADMOD_FINISHED; + break; + + case LOADMOD_FINISHED: + /* We have written all of our bits. Deactivate the loadmod + * timer. Also disable the bit-rate interrupt again. And + * stop the subcarrier divider. */ + CODEC_TIMER_LOADMOD.CTRLA = TC_CLKSEL_OFF_gc; + CODEC_TIMER_LOADMOD.INTCTRLA = 0; + CODEC_SUBCARRIER_TIMER.CTRLA = TC_CLKSEL_OFF_gc; + + /* Signal application that we have finished loadmod */ + Flags.LoadmodFinished = 1; + break; + + default: + break; + } +} + +void ISO14443ACodecInit(void) +{ + /* Initialize common peripherals and start listening + * for incoming data. */ + Initialize(); + StartDemod(); +} + +/*** + * CHECKME!!! Mostly copied from RevG + ***/ +void ISO14443ACodecDeInit(void) +{ + /* Gracefully shutdown codec */ + CODEC_DEMOD_IN_PORT.INT0MASK = 0; + + Flags.DemodFinished = 0; + Flags.LoadmodFinished = 0; + + CODEC_TIMER_SAMPLING.CTRLA = TC_CLKSEL_OFF_gc; + CODEC_TIMER_SAMPLING.CTRLD = TC_EVACT_OFF_gc; + CODEC_TIMER_SAMPLING.INTCTRLB = TC_CCAINTLVL_OFF_gc; + CODEC_TIMER_SAMPLING.INTFLAGS = TC0_CCAIF_bm; + + + CODEC_TIMER_LOADMOD.CTRLA = TC_CLKSEL_OFF_gc; + CODEC_TIMER_LOADMOD.CTRLD = TC_EVACT_OFF_gc; + CODEC_TIMER_LOADMOD.INTCTRLA = TC_OVFINTLVL_HI_gc; + CODEC_TIMER_LOADMOD.INTFLAGS = TC0_OVFIF_bm; + + //CodecSetSubcarrier(CODEC_SUBCARRIERMOD_OFF, 0); + CodecSetDemodPower(false); + //CodecSetLoadmodState(false); + +} + +void ISO14443ACodecTask(void) { + if (Flags.DemodFinished) { + Flags.DemodFinished = 0; + /* Reception finished. Process the received bytes */ + CodecSetDemodPower(false); + + uint16_t DemodBitCount = BitCount; + uint16_t AnswerBitCount = ISO14443A_APP_NO_RESPONSE; + + if (DemodBitCount > 0) { + LogEntry(LOG_INFO_CODEC_RX_DATA, CodecBuffer, (DemodBitCount+7)/8); + LEDHook(LED_CODEC_RX, LED_PULSE); + + /* Call application if we received data */ + AnswerBitCount = ApplicationProcess(CodecBuffer, DemodBitCount); + + if (AnswerBitCount & ISO14443A_APP_CUSTOM_PARITY) { + /* Application has generated it's own parity bits. + * Clear this option bit. */ + AnswerBitCount &= ~ISO14443A_APP_CUSTOM_PARITY; + } else { + /* We have to generate the parity bits ourself */ + for (uint8_t i = 0; i < (AnswerBitCount / 8); i++) { + /* For each whole byte, generate a parity bit. */ + CodecBuffer[ISO14443A_BUFFER_PARITY_OFFSET + i] = + ODD_PARITY(CodecBuffer[i]); + } + } + } else { + ApplicationReset(); + } + + if (AnswerBitCount != ISO14443A_APP_NO_RESPONSE) { + LogEntry(LOG_INFO_CODEC_TX_DATA, CodecBuffer, (AnswerBitCount + 7) / 8); + LEDHook(LED_CODEC_TX, LED_PULSE); + + BitCount = AnswerBitCount; + BitSent = 0; + CodecBufferPtr = CodecBuffer; + ParityBufferPtr = &CodecBuffer[ISO14443A_BUFFER_PARITY_OFFSET]; + LoadModState = LOADMOD_START; + } else { + /* No data to be processed. Disable loadmodding and start listening again */ + CODEC_TIMER_LOADMOD.CTRLA = TC_CLKSEL_OFF_gc; + CODEC_TIMER_LOADMOD.INTCTRLA = 0; + + StartDemod(); + } + } + + if (Flags.LoadmodFinished) { + Flags.LoadmodFinished = 0; + /* Load modulation has been finished. Stop it and start to listen + * for incoming data again. */ + StartDemod(); + } + + //SystemSleep(); +} + diff --git a/RevE-light/Firmware/Chameleon-Mini/Codec/ISO14443-2A.h b/RevE-light/Firmware/Chameleon-Mini/Codec/ISO14443-2A.h new file mode 100644 index 0000000..7370ccb --- /dev/null +++ b/RevE-light/Firmware/Chameleon-Mini/Codec/ISO14443-2A.h @@ -0,0 +1,24 @@ +/* + * ISO14443-2A.h + * + * Created on: 18.02.2013 + * Author: skuser + */ + +#ifndef ISO14443_2A_H_ +#define ISO14443_2A_H_ + +#include "Codec.h" + +#define ISO14443A_APP_NO_RESPONSE 0x0000 +#define ISO14443A_APP_CUSTOM_PARITY 0x1000 + +#define ISO14443A_BUFFER_PARITY_OFFSET (CODEC_BUFFER_SIZE/2) + +/* Codec Interface */ +void ISO14443ACodecInit(void); +void ISO14443ACodecTask(void); +void ISO14443ACodecDeInit(void); + + +#endif diff --git a/RevE-light/Firmware/Chameleon-Mini/Common.c b/RevE-light/Firmware/Chameleon-Mini/Common.c new file mode 100644 index 0000000..36af329 --- /dev/null +++ b/RevE-light/Firmware/Chameleon-Mini/Common.c @@ -0,0 +1,64 @@ +#include "Common.h" + +uint16_t BufferToHexString(char* HexOut, uint16_t MaxChars, const void* Buffer, uint16_t ByteCount) +{ + uint8_t* ByteBuffer = (uint8_t*) Buffer; + uint16_t CharCount = 0; + + /* Account for '\0' at the end */ + MaxChars--; + + while( (ByteCount > 0) && (MaxChars >= 2) ) { + uint8_t Byte = *ByteBuffer; + + HexOut[0] = NIBBLE_TO_HEXCHAR( (Byte >> 4) & 0x0F ); + HexOut[1] = NIBBLE_TO_HEXCHAR( (Byte >> 0) & 0x0F ); + + HexOut += 2; + MaxChars -= 2; + CharCount += 2; + ByteBuffer++; + ByteCount -= 1; + } + + *HexOut = '\0'; + + return CharCount; +} + +uint16_t HexStringToBuffer(void* Buffer, uint16_t MaxBytes, const char* HexIn) +{ + uint8_t* ByteBuffer = (uint8_t*) Buffer; + uint16_t ByteCount = 0; + + while( (HexIn[0] != '\0') && (HexIn[1] != '\0') && (MaxBytes > 0) ) { + if (VALID_HEXCHAR(HexIn[0]) && VALID_HEXCHAR(HexIn[1])) { + uint8_t Byte = 0; + + Byte |= HEXCHAR_TO_NIBBLE(HexIn[0]) << 4; + Byte |= HEXCHAR_TO_NIBBLE(HexIn[1]) << 0; + + *ByteBuffer = Byte; + + ByteBuffer++; + MaxBytes--; + ByteCount++; + HexIn += 2; + } else { + /* HEX chars only */ + return 0; + } + } + + if ( (HexIn[0] != '\0') && (HexIn[1] == '\0') ) { + /* Odd number of characters */ + return 0; + } + + return ByteCount; +} + + + + + diff --git a/RevE-light/Firmware/Chameleon-Mini/Common.h b/RevE-light/Firmware/Chameleon-Mini/Common.h new file mode 100644 index 0000000..8aeeff8 --- /dev/null +++ b/RevE-light/Firmware/Chameleon-Mini/Common.h @@ -0,0 +1,48 @@ +/* + * Common.h + * + * Created on: 20.03.2013 + * Author: skuser + */ + +#ifndef COMMON_H_ +#define COMMON_H_ + +#include +#include +#include +#include +#include + +#define ODD_PARITY(Value) (parity_even_bit(Value) ? 0 : 1) + +#define INLINE \ + static inline __attribute__((always_inline)) + +#define NIBBLE_TO_HEXCHAR(x) ( (x) < 0x0A ? (x) + '0' : (x) + 'A' - 0x0A ) +#define HEXCHAR_TO_NIBBLE(x) ( (x) < 'A' ? (x) - '0' : (x) - 'A' + 0x0A ) +#define VALID_HEXCHAR(x) ( ( (x) >= '0' && (x) <= '9' ) || ( (x) >= 'A' && (x) <= 'F' ) ) +#define MIN(x,y) ( (x) < (y) ? (x) : (y) ) +#define MAX(x,y) ( (x) > (y) ? (x) : (y) ) + +#define BITS_PER_BYTE 8 + +uint16_t BufferToHexString(char* HexOut, uint16_t MaxChars, const void* Buffer, uint16_t ByteCount); +uint16_t HexStringToBuffer(void* Buffer, uint16_t MaxBytes, const char* HexIn); + +INLINE uint8_t StringLength(const char* Str, uint8_t MaxLen) +{ + uint8_t StrLen = 0; + + while(MaxLen > 0) { + if (*Str++ == '\0') + break; + + MaxLen--; + StrLen++; + } + + return StrLen; +} + +#endif /* COMMON_H_ */ diff --git a/RevE-light/Firmware/Chameleon-Mini/Configuration.c b/RevE-light/Firmware/Chameleon-Mini/Configuration.c new file mode 100644 index 0000000..15a78e8 --- /dev/null +++ b/RevE-light/Firmware/Chameleon-Mini/Configuration.c @@ -0,0 +1,178 @@ +/* + * Standards.c + * + * Created on: 15.02.2013 + * Author: skuser + */ + +#include "Configuration.h" +#include "Settings.h" +#include +#include "Map.h" + +/* Map IDs to text */ +static const MapEntryType PROGMEM ConfigurationMap[] = { + { .Id = CONFIG_NONE, .Text = "NONE" }, +#ifdef CONFIG_MF_ULTRALIGHT_SUPPORT + { .Id = CONFIG_MF_ULTRALIGHT, .Text = "MF_ULTRALIGHT" }, +#endif +#ifdef CONFIG_MF_CLASSIC_1K_SUPPORT + { .Id = CONFIG_MF_CLASSIC_1K, .Text = "MF_CLASSIC_1K" }, +#endif +#ifdef CONFIG_MF_CLASSIC_4K_SUPPORT + { .Id = CONFIG_MF_CLASSIC_4K, .Text = "MF_CLASSIC_4K" }, +#endif +#ifdef CONFIG_ISO14443A_SNIFF_SUPPORT + { .Id = CONFIG_ISO14443A_SNIFF, .Text = "ISO14443A_SNIFF" }, +#endif +}; + +/* Include all Codecs and Applications */ +#include "Codec/Codec.h" +#include "Application/Application.h" + +static void CodecInitDummy(void) { } +static void CodecDeInitDummy(void) { } +static void CodecTaskDummy(void) { } +static void ApplicationInitDummy(void) {} +static void ApplicationResetDummy(void) {} +static void ApplicationTaskDummy(void) {} +static void ApplicationTickDummy(void) {} +static uint16_t ApplicationProcessDummy(uint8_t* ByteBuffer, uint16_t ByteCount) { return 0; } +static void ApplicationGetUidDummy(ConfigurationUidType Uid) { } +static void ApplicationSetUidDummy(ConfigurationUidType Uid) { } + + +static const PROGMEM ConfigurationType ConfigurationTable[] = { + [CONFIG_NONE] = { + .CodecInitFunc = CodecInitDummy, + .CodecDeInitFunc = CodecDeInitDummy, + .CodecTaskFunc = CodecTaskDummy, + .ApplicationInitFunc = ApplicationInitDummy, + .ApplicationResetFunc = ApplicationResetDummy, + .ApplicationTaskFunc = ApplicationTaskDummy, + .ApplicationTickFunc = ApplicationTickDummy, + .ApplicationProcessFunc = ApplicationProcessDummy, + .ApplicationGetUidFunc = ApplicationGetUidDummy, + .ApplicationSetUidFunc = ApplicationSetUidDummy, + .UidSize = 0, + .MemorySize = 0, + .ReadOnly = true + }, +#ifdef CONFIG_MF_ULTRALIGHT_SUPPORT + [CONFIG_MF_ULTRALIGHT] = { + .CodecInitFunc = ISO14443ACodecInit, + .CodecDeInitFunc = ISO14443ACodecDeInit, + .CodecTaskFunc = ISO14443ACodecTask, + .ApplicationInitFunc = MifareUltralightAppInit, + .ApplicationResetFunc = MifareUltralightAppReset, + .ApplicationTaskFunc = MifareUltralightAppTask, + .ApplicationTickFunc = ApplicationTickDummy, + .ApplicationProcessFunc = MifareUltralightAppProcess, + .ApplicationGetUidFunc = MifareUltralightGetUid, + .ApplicationSetUidFunc = MifareUltralightSetUid, + .UidSize = MIFARE_ULTRALIGHT_UID_SIZE, + .MemorySize = MIFARE_ULTRALIGHT_MEM_SIZE, + .ReadOnly = false + }, +#endif +#ifdef CONFIG_MF_CLASSIC_1K_SUPPORT + [CONFIG_MF_CLASSIC_1K] = { + .CodecInitFunc = ISO14443ACodecInit, + .CodecDeInitFunc = ISO14443ACodecDeInit, + .CodecTaskFunc = ISO14443ACodecTask, + .ApplicationInitFunc = MifareClassicAppInit1K, + .ApplicationResetFunc = MifareClassicAppReset, + .ApplicationTaskFunc = MifareClassicAppTask, + .ApplicationTickFunc = ApplicationTickDummy, + .ApplicationProcessFunc = MifareClassicAppProcess, + .ApplicationGetUidFunc = MifareClassicGetUid, + .ApplicationSetUidFunc = MifareClassicSetUid, + .UidSize = MIFARE_CLASSIC_UID_SIZE, + .MemorySize = MIFARE_CLASSIC_1K_MEM_SIZE, + .ReadOnly = false + }, +#endif +#ifdef CONFIG_MF_CLASSIC_4K_SUPPORT + [CONFIG_MF_CLASSIC_4K] = { + .CodecInitFunc = ISO14443ACodecInit, + .CodecDeInitFunc = ISO14443ACodecDeInit, + .CodecTaskFunc = ISO14443ACodecTask, + .ApplicationInitFunc = MifareClassicAppInit4K, + .ApplicationResetFunc = MifareClassicAppReset, + .ApplicationTaskFunc = MifareClassicAppTask, + .ApplicationTickFunc = ApplicationTickDummy, + .ApplicationProcessFunc = MifareClassicAppProcess, + .ApplicationGetUidFunc = MifareClassicGetUid, + .ApplicationSetUidFunc = MifareClassicSetUid, + .UidSize = MIFARE_CLASSIC_UID_SIZE, + .MemorySize = MIFARE_CLASSIC_4K_MEM_SIZE, + .ReadOnly = false + }, +#endif +#ifdef CONFIG_ISO14443A_SNIFF_SUPPORT + [CONFIG_ISO14443A_SNIFF] = { + .CodecInitFunc = ISO14443ACodecInit, + .CodecDeInitFunc = ISO14443ACodecDeInit, + .CodecTaskFunc = ISO14443ACodecTask, + .ApplicationInitFunc = ApplicationInitDummy, + .ApplicationResetFunc = ApplicationResetDummy, + .ApplicationTaskFunc = ApplicationTaskDummy, + .ApplicationTickFunc = ApplicationTickDummy, + .ApplicationProcessFunc = ApplicationProcessDummy, + .ApplicationGetUidFunc = ApplicationGetUidDummy, + .ApplicationSetUidFunc = ApplicationSetUidDummy, + .UidSize = 0, + .MemorySize = 0, + .ReadOnly = true + }, +#endif +}; + +ConfigurationType ActiveConfiguration; + +void ConfigurationInit(void) +{ + memcpy_P(&ActiveConfiguration, + &ConfigurationTable[CONFIG_NONE], sizeof(ConfigurationType)); + + ConfigurationSetById(GlobalSettings.ActiveSettingPtr->Configuration); +} + +void ConfigurationSetById( ConfigurationEnum Configuration ) +{ + CodecDeInit(); + + GlobalSettings.ActiveSettingPtr->Configuration = Configuration; + + /* Copy struct from PROGMEM to RAM */ + memcpy_P(&ActiveConfiguration, + &ConfigurationTable[Configuration], sizeof(ConfigurationType)); + + ApplicationInit(); + CodecInit(); +} + +void ConfigurationGetByName(char* Configuration, uint16_t BufferSize) +{ + MapIdToText(ConfigurationMap, sizeof(ConfigurationMap)/sizeof(*ConfigurationMap), GlobalSettings.ActiveSettingPtr->Configuration, Configuration, BufferSize); +} + +bool ConfigurationSetByName(const char* Configuration) +{ + MapIdType Id; + + if (MapTextToId(ConfigurationMap, sizeof(ConfigurationMap)/sizeof(*ConfigurationMap), Configuration, &Id)) { + ConfigurationSetById(Id); + LogEntry(LOG_INFO_CONFIG_SET, Configuration, StringLength(Configuration, CONFIGURATION_NAME_LENGTH_MAX-1)); + return true; + } else { + return false; + } +} + +void ConfigurationGetList(char* List, uint16_t BufferSize) +{ + MapToString(ConfigurationMap, sizeof(ConfigurationMap)/sizeof(*ConfigurationMap), List, BufferSize); +} + diff --git a/RevE-light/Firmware/Chameleon-Mini/Configuration.h b/RevE-light/Firmware/Chameleon-Mini/Configuration.h new file mode 100644 index 0000000..1d0ce71 --- /dev/null +++ b/RevE-light/Firmware/Chameleon-Mini/Configuration.h @@ -0,0 +1,69 @@ +/* + * Standards.h + * + * Created on: 15.02.2013 + * Author: skuser + */ + +#ifndef STANDARDS_H_ +#define STANDARDS_H_ + +#include +#include + +#define CONFIGURATION_NAME_LENGTH_MAX 32 +#define CONFIGURATION_UID_SIZE_MAX 16 + +typedef uint8_t ConfigurationUidType[CONFIGURATION_UID_SIZE_MAX]; + +typedef enum { + /* This HAS to be the first element */ + CONFIG_NONE = 0, + +#ifdef CONFIG_MF_ULTRALIGHT_SUPPORT + CONFIG_MF_ULTRALIGHT, +#endif +#ifdef CONFIG_MF_CLASSIC_1K_SUPPORT + CONFIG_MF_CLASSIC_1K, +#endif +#ifdef CONFIG_MF_CLASSIC_4K_SUPPORT + CONFIG_MF_CLASSIC_4K, +#endif +#ifdef CONFIG_ISO14443A_SNIFF_SUPPORT + CONFIG_ISO14443A_SNIFF, +#endif + + /* This HAS to be the last element */ + CONFIG_COUNT +} ConfigurationEnum; + +typedef struct { + /* Codec used for this configuration */ + void (*CodecInitFunc) (void); + void (*CodecDeInitFunc) (void); + void (*CodecTaskFunc) (void); + + /* Application used for this configuration */ + void (*ApplicationInitFunc) (void); + void (*ApplicationResetFunc) (void); + void (*ApplicationTaskFunc) (void); + void (*ApplicationTickFunc) (void); + uint16_t (*ApplicationProcessFunc) (uint8_t* ByteBuffer, uint16_t ByteCount); + void (*ApplicationGetUidFunc) (ConfigurationUidType Uid); + void (*ApplicationSetUidFunc) (ConfigurationUidType Uid); + + uint16_t MemorySize; + uint8_t UidSize; + bool ReadOnly; + +} ConfigurationType; + +extern ConfigurationType ActiveConfiguration; + +void ConfigurationInit(void); +void ConfigurationSetById(ConfigurationEnum Configuration); +void ConfigurationGetByName(char* Configuration, uint16_t BufferSize); +bool ConfigurationSetByName(const char* Configuration); +void ConfigurationGetList(char* ConfigurationList, uint16_t BufferSize); + +#endif /* STANDARDS_H_ */ diff --git a/RevE-light/Firmware/Chameleon-Mini/LED.c b/RevE-light/Firmware/Chameleon-Mini/LED.c new file mode 100644 index 0000000..e6b2d72 --- /dev/null +++ b/RevE-light/Firmware/Chameleon-Mini/LED.c @@ -0,0 +1,163 @@ +#include "LED.h" +#include "Settings.h" +#include "Map.h" + +#define BLINK_PRESCALER 1 /* x LEDTick(); */ + +LEDActionEnum LEDGreenAction = LED_NO_ACTION; +LEDActionEnum LEDRedAction = LED_NO_ACTION; + +static const MapEntryType PROGMEM LEDFunctionMap[] = { + { .Id = LED_NO_FUNC, .Text = "NONE" }, + { .Id = LED_POWERED, .Text = "POWERED" }, + { .Id = LED_TERMINAL_CONN, .Text = "TERMINAL_CONN" }, + { .Id = LED_TERMINAL_RXTX, .Text = "TERMINAL_RXTX" }, + { .Id = LED_SETTING_CHANGE, .Text = "SETTING_CHANGE" }, + { .Id = LED_MEMORY_STORED, .Text = "MEMORY_STORED" }, + { .Id = LED_MEMORY_CHANGED, .Text = "MEMORY_CHANGED" }, + { .Id = LED_CODEC_RX, .Text = "CODEC_RX" }, + { .Id = LED_CODEC_TX, .Text = "CODEC_TX" } + //TODO: [LED_FIELD_DETECTED] = "FIELD_DETECTED", + //TODO: [LED_APP_SELECTED] = "APP_SELECTED", +}; + +INLINE void Tick(uint8_t Mask, LEDActionEnum* Action) +{ + static uint8_t BlinkPrescaler = 0; + + switch (*Action) + { + case LED_NO_ACTION: + /* Do nothing */ + break; + + case LED_OFF: + LED_PORT.OUTCLR = Mask; + *Action = LED_NO_ACTION; + break; + + case LED_ON: + LED_PORT.OUTSET = Mask; + *Action = LED_NO_ACTION; + break; + + case LED_TOGGLE: + LED_PORT.OUTTGL = Mask; + *Action = LED_NO_ACTION; + break; + + case LED_PULSE: + if (!(LED_PORT.OUT & Mask)) { + LED_PORT.OUTSET = Mask; + } else { + LED_PORT.OUTCLR = Mask; + *Action = LED_NO_ACTION; + } + break; + + case LED_BLINK_1X ... LED_BLINK_8X: + if (++BlinkPrescaler == BLINK_PRESCALER) { + BlinkPrescaler = 0; + /* Blink functionality occurs at slower speed than Tick-frequency */ + + if (!(LED_PORT.OUT & Mask)) { + /* LED is off, turn it on */ + LED_PORT.OUTSET = Mask; + } else { + /* LED is on, turn it off and change state */ + LED_PORT.OUTCLR = Mask; + + if (*Action == LED_BLINK_1X) { + *Action = LED_NO_ACTION; + } else { + /* Still some blinks to do. Use the fact that LED_BLINK_XY are ordered sequentially */ + *Action = *Action - 1; + } + } + } + break; + + default: + /* Should not happen (TM) */ + *Action = LED_NO_ACTION; + break; + + } +} + +void LEDInit(void) +{ + LED_PORT.DIRSET = LED_MASK; +} + + +void LEDTick(void) +{ + Tick(LED_RED, &LEDRedAction); + Tick(LED_GREEN, &LEDGreenAction); +} + +void LEDGetFuncList(char* List, uint16_t BufferSize) +{ + MapToString(LEDFunctionMap, sizeof(LEDFunctionMap)/sizeof(*LEDFunctionMap), List, BufferSize); +} + +void LEDSetFuncById(uint8_t Mask, LEDHookEnum Function) +{ +#ifndef LED_SETTING_GLOBAL + if (Mask & LED_GREEN) { + GlobalSettings.ActiveSettingPtr->LEDGreenFunction = Function; + } + + if (Mask & LED_RED) { + GlobalSettings.ActiveSettingPtr->LEDRedFunction = Function; + } +#else + /* Write LED func to all settings when using global settings */ + for (uint8_t i=0; iLEDGreenFunction, Function, BufferSize); + } else if (Mask == LED_RED) { + MapIdToText(LEDFunctionMap, sizeof(LEDFunctionMap)/sizeof(*LEDFunctionMap), + GlobalSettings.ActiveSettingPtr->LEDRedFunction, Function, BufferSize); + } +} + +bool LEDSetFuncByName(uint8_t Mask, const char* Function) +{ + MapIdType Id; + + if (MapTextToId(LEDFunctionMap, sizeof(LEDFunctionMap)/sizeof(*LEDFunctionMap), Function, &Id)) { + LEDSetFuncById(Mask, Id); + return true; + } else { + return false; + } +} + diff --git a/RevE-light/Firmware/Chameleon-Mini/LED.h b/RevE-light/Firmware/Chameleon-Mini/LED.h new file mode 100644 index 0000000..03c1cc4 --- /dev/null +++ b/RevE-light/Firmware/Chameleon-Mini/LED.h @@ -0,0 +1,69 @@ +/* + * LED.h + * + * Created on: 10.02.2013 + * Author: skuser + */ + +#ifndef LED_H +#define LED_H + +#include +#include "Common.h" + +#define LED_PORT PORTA +#define LED_GREEN PIN5_bm +#define LED_RED PIN4_bm +#define LED_MASK (LED_GREEN | LED_RED) + +typedef enum LEDFunctionEnum { + LED_NO_FUNC = 0, /* Don't light up the LED */ + LED_POWERED, /* Light up the LED whenever the Chameleon is powered */ + + LED_TERMINAL_CONN, /* A Terminal/USB connection has been established */ + LED_TERMINAL_RXTX, /* There is traffic on the terminal */ + + LED_SETTING_CHANGE, /* Outputs a blink code that shows the current setting */ + + LED_MEMORY_STORED, /* Blink once when memory has been stored to flash */ + LED_MEMORY_CHANGED, /* Switch LED on when card memory has changed compared to flash */ + + //TODO: LED_FIELD_DETECTED, /* Shows LED while a reader field is being detected */ + + LED_CODEC_RX, /* Blink LED when receiving codec data */ + LED_CODEC_TX, /* Blink LED when transmitting codec data */ + + //TODO: LED_APP_SELECTED, /* Show LED while the correct UID has been selected and the application is active */ + + /* Has to be last element */ + LED_FUNC_COUNT +} LEDHookEnum; + +typedef enum LEDActionEnum { + LED_NO_ACTION = 0x00, + LED_OFF = 0x10, + LED_ON = 0x11, + LED_TOGGLE = 0x12, + LED_PULSE = 0x13, + LED_BLINK = 0x20, + LED_BLINK_1X = 0x20, + LED_BLINK_2X, /* Have to be sequentially ordered */ + LED_BLINK_3X, + LED_BLINK_4X, + LED_BLINK_5X, + LED_BLINK_6X, + LED_BLINK_7X, + LED_BLINK_8X, +} LEDActionEnum; + + + +void LEDInit(void); +void LEDTick(void); + +void LEDGetFuncList(char* List, uint16_t BufferSize); +void LEDSetFuncById(uint8_t Mask, LEDHookEnum Func); +void LEDGetFuncByName(uint8_t Mask, char* Function, uint16_t BufferSize); +bool LEDSetFuncByName(uint8_t Mask, const char* Function); + +#endif /* LED_H */ \ No newline at end of file diff --git a/RevE-light/Firmware/Chameleon-Mini/LEDHook.h b/RevE-light/Firmware/Chameleon-Mini/LEDHook.h new file mode 100644 index 0000000..f187ab4 --- /dev/null +++ b/RevE-light/Firmware/Chameleon-Mini/LEDHook.h @@ -0,0 +1,29 @@ +/* + * LEDHook.h + * + * Created on: 02.12.2014 + * Author: sk + */ + +#ifndef LEDHOOK_H_ +#define LEDHOOK_H_ + +#include "Settings.h" + +INLINE void LEDHook(LEDHookEnum Func, LEDActionEnum Action) +{ + extern LEDActionEnum LEDGreenAction; + extern LEDActionEnum LEDRedAction; + + if (GlobalSettings.ActiveSettingPtr->LEDGreenFunction == Func) + { + LEDGreenAction = Action; + } + + if (GlobalSettings.ActiveSettingPtr->LEDRedFunction == Func) + { + LEDRedAction = Action; + } +} + +#endif /* LEDHOOK_H_ */ diff --git a/RevE-light/Firmware/Chameleon-Mini/LUFAConfig.h b/RevE-light/Firmware/Chameleon-Mini/LUFAConfig.h new file mode 100644 index 0000000..98f60ed --- /dev/null +++ b/RevE-light/Firmware/Chameleon-Mini/LUFAConfig.h @@ -0,0 +1,78 @@ +/* + LUFA Library + Copyright (C) Dean Camera, 2012. + + dean [at] fourwalledcubicle [dot] com + www.lufa-lib.org +*/ + +/* + Copyright 2012 Dean Camera (dean [at] fourwalledcubicle [dot] com) + + Permission to use, copy, modify, distribute, and sell this + software and its documentation for any purpose is hereby granted + without fee, provided that the above copyright notice appear in + all copies and that both that the copyright notice and this + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the + software without specific, written prior permission. + + The author disclaim all warranties with regard to this + software, including all implied warranties of merchantability + and fitness. In no event shall the author be liable for any + special, indirect or consequential damages or any damages + whatsoever resulting from loss of use, data or profits, whether + in an action of contract, negligence or other tortious action, + arising out of or in connection with the use or performance of + this software. +*/ + +/** \file + * \brief LUFA Library Configuration Header File + * + * This header file is used to configure LUFA's compile time options, + * as an alternative to the compile time constants supplied through + * a makefile. + * + * For information on what each token does, refer to the LUFA + * manual section "Summary of Compile Tokens". + */ + +#ifndef _LUFA_CONFIG_H_ +#define _LUFA_CONFIG_H_ + + /* Non-USB Related Configuration Tokens: */ +// #define DISABLE_TERMINAL_CODES + + /* USB Class Driver Related Tokens: */ +// #define HID_HOST_BOOT_PROTOCOL_ONLY +// #define HID_STATETABLE_STACK_DEPTH {Insert Value Here} +// #define HID_USAGE_STACK_DEPTH {Insert Value Here} +// #define HID_MAX_COLLECTIONS {Insert Value Here} +// #define HID_MAX_REPORTITEMS {Insert Value Here} +// #define HID_MAX_REPORT_IDS {Insert Value Here} +// #define NO_CLASS_DRIVER_AUTOFLUSH + + /* General USB Driver Related Tokens: */ + #define USE_STATIC_OPTIONS \ + (USB_OPT_BUSEVENT_PRIMED | USB_DEVICE_OPT_FULLSPEED | USB_OPT_PLLCLKSRC /*USB_OPT_RC32MCLKSRC*/) + #define USB_DEVICE_ONLY +// #define USB_STREAM_TIMEOUT_MS {Insert Value Here} +// #define NO_LIMITED_CONTROLLER_CONNECT +// #define NO_SOF_EVENTS + + /* USB Device Mode Driver Related Tokens: */ +// #define USE_RAM_DESCRIPTORS + #define USE_FLASH_DESCRIPTORS +// #define USE_EEPROM_DESCRIPTORS +// #define NO_INTERNAL_SERIAL + #define FIXED_CONTROL_ENDPOINT_SIZE 8 +// #define DEVICE_STATE_AS_GPIOR {Insert Value Here} + #define FIXED_NUM_CONFIGURATIONS 1 +// #define CONTROL_ONLY_DEVICE + #define MAX_ENDPOINT_INDEX 5 +// #define NO_DEVICE_REMOTE_WAKEUP +// #define NO_DEVICE_SELF_POWER + +#endif diff --git a/RevE-light/Firmware/Chameleon-Mini/LUFADescriptors.c b/RevE-light/Firmware/Chameleon-Mini/LUFADescriptors.c new file mode 100644 index 0000000..6a9ed25 --- /dev/null +++ b/RevE-light/Firmware/Chameleon-Mini/LUFADescriptors.c @@ -0,0 +1,260 @@ +/* + LUFA Library + Copyright (C) Dean Camera, 2012. + + dean [at] fourwalledcubicle [dot] com + www.lufa-lib.org +*/ + +/* + Copyright 2012 Dean Camera (dean [at] fourwalledcubicle [dot] com) + + Permission to use, copy, modify, distribute, and sell this + software and its documentation for any purpose is hereby granted + without fee, provided that the above copyright notice appear in + all copies and that both that the copyright notice and this + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the + software without specific, written prior permission. + + The author disclaim all warranties with regard to this + software, including all implied warranties of merchantability + and fitness. In no event shall the author be liable for any + special, indirect or consequential damages or any damages + whatsoever resulting from loss of use, data or profits, whether + in an action of contract, negligence or other tortious action, + arising out of or in connection with the use or performance of + this software. +*/ + +/** \file + * + * USB Device Descriptors, for library use when in USB device mode. Descriptors are special + * computer-readable structures which the host requests upon device enumeration, to determine + * the device's capabilities and functions. + */ + +#include "LUFADescriptors.h" + + +/** Device descriptor structure. This descriptor, located in FLASH memory, describes the overall + * device characteristics, including the supported USB version, control endpoint size and the + * number of device configurations. The descriptor is read out by the USB host when the enumeration + * process begins. + */ +const USB_Descriptor_Device_t PROGMEM DeviceDescriptor = +{ + .Header = {.Size = sizeof(USB_Descriptor_Device_t), .Type = DTYPE_Device}, + + .USBSpecification = VERSION_BCD(1,1,0), + .Class = CDC_CSCP_CDCClass, + .SubClass = CDC_CSCP_NoSpecificSubclass, + .Protocol = CDC_CSCP_NoSpecificProtocol, + + .Endpoint0Size = FIXED_CONTROL_ENDPOINT_SIZE, + + .VendorID = 0x16D0, // MCS Electronics (http://www.mcselec.com) + .ProductID = 0x04B2, // darksimpson's PID #2 granted to Chameleon-Mini + .ReleaseNumber = VERSION_BCD(0,0,1), + + .ManufacturerStrIndex = 0x01, + .ProductStrIndex = 0x02, + .SerialNumStrIndex = USE_INTERNAL_SERIAL, + + .NumberOfConfigurations = FIXED_NUM_CONFIGURATIONS +}; + +/** Configuration descriptor structure. This descriptor, located in FLASH memory, describes the usage + * of the device in one of its supported configurations, including information about any device interfaces + * and endpoints. The descriptor is read out by the USB host during the enumeration process when selecting + * a configuration so that the host may correctly communicate with the USB device. + */ +const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor = +{ + .Config = + { + .Header = {.Size = sizeof(USB_Descriptor_Configuration_Header_t), .Type = DTYPE_Configuration}, + + .TotalConfigurationSize = sizeof(USB_Descriptor_Configuration_t), + .TotalInterfaces = 2, + + .ConfigurationNumber = 1, + .ConfigurationStrIndex = NO_DESCRIPTOR, + + .ConfigAttributes = (USB_CONFIG_ATTR_RESERVED | USB_CONFIG_ATTR_SELFPOWERED), + + .MaxPowerConsumption = USB_CONFIG_POWER_MA(100) + }, + + .CDC_CCI_Interface = + { + .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, + + .InterfaceNumber = 0, + .AlternateSetting = 0, + + .TotalEndpoints = 1, + + .Class = CDC_CSCP_CDCClass, + .SubClass = CDC_CSCP_ACMSubclass, + .Protocol = CDC_CSCP_ATCommandProtocol, + + .InterfaceStrIndex = NO_DESCRIPTOR + }, + + .CDC_Functional_Header = + { + .Header = {.Size = sizeof(USB_CDC_Descriptor_FunctionalHeader_t), .Type = DTYPE_CSInterface}, + .Subtype = CDC_DSUBTYPE_CSInterface_Header, + + .CDCSpecification = VERSION_BCD(1,1,0), + }, + + .CDC_Functional_ACM = + { + .Header = {.Size = sizeof(USB_CDC_Descriptor_FunctionalACM_t), .Type = DTYPE_CSInterface}, + .Subtype = CDC_DSUBTYPE_CSInterface_ACM, + + .Capabilities = 0x06, + }, + + .CDC_Functional_Union = + { + .Header = {.Size = sizeof(USB_CDC_Descriptor_FunctionalUnion_t), .Type = DTYPE_CSInterface}, + .Subtype = CDC_DSUBTYPE_CSInterface_Union, + + .MasterInterfaceNumber = 0, + .SlaveInterfaceNumber = 1, + }, + + .CDC_NotificationEndpoint = + { + .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, + + .EndpointAddress = CDC_NOTIFICATION_EPADDR, + .Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), + .EndpointSize = CDC_NOTIFICATION_EPSIZE, + .PollingIntervalMS = 0xFF + }, + + .CDC_DCI_Interface = + { + .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, + + .InterfaceNumber = 1, + .AlternateSetting = 0, + + .TotalEndpoints = 2, + + .Class = CDC_CSCP_CDCDataClass, + .SubClass = CDC_CSCP_NoDataSubclass, + .Protocol = CDC_CSCP_NoDataProtocol, + + .InterfaceStrIndex = NO_DESCRIPTOR + }, + + .CDC_DataOutEndpoint = + { + .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, + + .EndpointAddress = CDC_RX_EPADDR, + .Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), + .EndpointSize = CDC_TXRX_EPSIZE, + .PollingIntervalMS = 0x05 + }, + + .CDC_DataInEndpoint = + { + .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, + + .EndpointAddress = CDC_TX_EPADDR, + .Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), + .EndpointSize = CDC_TXRX_EPSIZE, + .PollingIntervalMS = 0x05 + } +}; + +/** Language descriptor structure. This descriptor, located in FLASH memory, is returned when the host requests + * the string descriptor with index 0 (the first index). It is actually an array of 16-bit integers, which indicate + * via the language ID table available at USB.org what languages the device supports for its string descriptors. + */ +const USB_Descriptor_String_t PROGMEM LanguageString = +{ + .Header = {.Size = USB_STRING_LEN(1), .Type = DTYPE_String}, + + .UnicodeString = {LANGUAGE_ID_ENG} +}; + +/** Manufacturer descriptor string. This is a Unicode string containing the manufacturer's details in human readable + * form, and is read out upon request by the host when the appropriate string ID is requested, listed in the Device + * Descriptor. + */ +const USB_Descriptor_String_t PROGMEM ManufacturerString = +{ + .Header = {.Size = USB_STRING_LEN(11), .Type = DTYPE_String}, + + .UnicodeString = L"Dean Camera" +}; + +/** Product descriptor string. This is a Unicode string containing the product's details in human readable form, + * and is read out upon request by the host when the appropriate string ID is requested, listed in the Device + * Descriptor. + */ +const USB_Descriptor_String_t PROGMEM ProductString = +{ + .Header = {.Size = USB_STRING_LEN(13), .Type = DTYPE_String}, + + .UnicodeString = L"LUFA CDC Demo" +}; + +/** This function is called by the library when in device mode, and must be overridden (see library "USB Descriptors" + * documentation) by the application code so that the address and size of a requested descriptor can be given + * to the USB library. When the device receives a Get Descriptor request on the control endpoint, this function + * is called so that the descriptor details can be passed back and the appropriate descriptor sent back to the + * USB host. + */ +uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, + const uint8_t wIndex, + const void** const DescriptorAddress) +{ + const uint8_t DescriptorType = (wValue >> 8); + const uint8_t DescriptorNumber = (wValue & 0xFF); + + const void* Address = NULL; + uint16_t Size = NO_DESCRIPTOR; + + switch (DescriptorType) + { + case DTYPE_Device: + Address = &DeviceDescriptor; + Size = sizeof(USB_Descriptor_Device_t); + break; + case DTYPE_Configuration: + Address = &ConfigurationDescriptor; + Size = sizeof(USB_Descriptor_Configuration_t); + break; + case DTYPE_String: + switch (DescriptorNumber) + { + case 0x00: + Address = &LanguageString; + Size = pgm_read_byte(&LanguageString.Header.Size); + break; + case 0x01: + Address = &ManufacturerString; + Size = pgm_read_byte(&ManufacturerString.Header.Size); + break; + case 0x02: + Address = &ProductString; + Size = pgm_read_byte(&ProductString.Header.Size); + break; + } + + break; + } + + *DescriptorAddress = Address; + return Size; +} + diff --git a/RevE-light/Firmware/Chameleon-Mini/LUFADescriptors.h b/RevE-light/Firmware/Chameleon-Mini/LUFADescriptors.h new file mode 100644 index 0000000..500649f --- /dev/null +++ b/RevE-light/Firmware/Chameleon-Mini/LUFADescriptors.h @@ -0,0 +1,89 @@ +/* + LUFA Library + Copyright (C) Dean Camera, 2012. + + dean [at] fourwalledcubicle [dot] com + www.lufa-lib.org +*/ + +/* + Copyright 2012 Dean Camera (dean [at] fourwalledcubicle [dot] com) + + Permission to use, copy, modify, distribute, and sell this + software and its documentation for any purpose is hereby granted + without fee, provided that the above copyright notice appear in + all copies and that both that the copyright notice and this + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the + software without specific, written prior permission. + + The author disclaim all warranties with regard to this + software, including all implied warranties of merchantability + and fitness. In no event shall the author be liable for any + special, indirect or consequential damages or any damages + whatsoever resulting from loss of use, data or profits, whether + in an action of contract, negligence or other tortious action, + arising out of or in connection with the use or performance of + this software. +*/ + +/** \file + * + * Header file for Descriptors.c. + */ + +#ifndef _DESCRIPTORS_H_ +#define _DESCRIPTORS_H_ + + /* Includes: */ + #include + + #include + + /* Macros: */ + /** Endpoint address of the CDC device-to-host notification IN endpoint. */ + #define CDC_NOTIFICATION_EPADDR (ENDPOINT_DIR_IN | 2) + + /** Endpoint address of the CDC device-to-host data IN endpoint. */ + #define CDC_TX_EPADDR (ENDPOINT_DIR_IN | 3) + + /** Endpoint address of the CDC host-to-device data OUT endpoint. */ + #define CDC_RX_EPADDR (ENDPOINT_DIR_OUT | 4) + + /** Size in bytes of the CDC device-to-host notification IN endpoint. */ + #define CDC_NOTIFICATION_EPSIZE 8 + + /** Size in bytes of the CDC data IN and OUT endpoints. */ + #define CDC_TXRX_EPSIZE 16 + + /* Type Defines: */ + /** Type define for the device configuration descriptor structure. This must be defined in the + * application code, as the configuration descriptor contains several sub-descriptors which + * vary between devices, and which describe the device's usage to the host. + */ + typedef struct + { + USB_Descriptor_Configuration_Header_t Config; + + // CDC Control Interface + USB_Descriptor_Interface_t CDC_CCI_Interface; + USB_CDC_Descriptor_FunctionalHeader_t CDC_Functional_Header; + USB_CDC_Descriptor_FunctionalACM_t CDC_Functional_ACM; + USB_CDC_Descriptor_FunctionalUnion_t CDC_Functional_Union; + USB_Descriptor_Endpoint_t CDC_NotificationEndpoint; + + // CDC Data Interface + USB_Descriptor_Interface_t CDC_DCI_Interface; + USB_Descriptor_Endpoint_t CDC_DataOutEndpoint; + USB_Descriptor_Endpoint_t CDC_DataInEndpoint; + } USB_Descriptor_Configuration_t; + + /* Function Prototypes: */ + uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, + const uint8_t wIndex, + const void** const DescriptorAddress) + ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(3); + +#endif + diff --git a/RevE-light/Firmware/Chameleon-Mini/Log.c b/RevE-light/Firmware/Chameleon-Mini/Log.c new file mode 100644 index 0000000..ada0f48 --- /dev/null +++ b/RevE-light/Firmware/Chameleon-Mini/Log.c @@ -0,0 +1,161 @@ +#include "Log.h" +#include "Settings.h" +#include "Terminal/Terminal.h" +#include "System.h" +#include "Map.h" + +static uint8_t LogMem[LOG_SIZE]; +static uint8_t* LogMemPtr; +static uint16_t LogMemLeft; +LogFuncType CurrentLogFunc; + +static const MapEntryType PROGMEM LogModeMap[] = { + { .Id = LOG_MODE_OFF, .Text = "OFF" }, + { .Id = LOG_MODE_MEMORY, .Text = "MEMORY" }, + { .Id = LOG_MODE_LIVE, .Text = "LIVE" } +}; + +static void LogFuncOff(LogEntryEnum Entry, const void* Data, uint8_t Length) +{ + /* Do nothing */ +} + +static void LogFuncMemory(LogEntryEnum Entry, const void* Data, uint8_t Length) +{ + uint16_t SysTick = SystemGetSysTick(); + + if (LogMemLeft >= (Length + 4)) { + LogMemLeft -= Length + 4; + + uint8_t* DataPtr = (uint8_t*) Data; + + /* Write down Entry Id, Data length and Timestamp */ + *LogMemPtr++ = (uint8_t) Entry; + *LogMemPtr++ = (uint8_t) Length; + *LogMemPtr++ = (uint8_t) (SysTick >> 8); + *LogMemPtr++ = (uint8_t) (SysTick >> 0); + + /* Write down data bytes */ + while(Length--) { + *LogMemPtr++ = *DataPtr++; + } + } else { + /* If memory full. Deactivate logmode */ + LogSetModeById(LOG_MODE_OFF); + } +} + +static void LogFuncLive(LogEntryEnum Entry, const void* Data, uint8_t Length) +{ + uint16_t SysTick = SystemGetSysTick(); + + TerminalSendByte((uint8_t) Entry); + TerminalSendByte((uint8_t) Length); + TerminalSendByte((uint8_t) (SysTick >> 8)); + TerminalSendByte((uint8_t) (SysTick >> 0)); + TerminalSendBlock(Data, Length); +} + +void LogInit(void) +{ + LogMemClear(); + LogSetModeById(GlobalSettings.ActiveSettingPtr->LogMode); +} + +void LogTick(void) +{ + +} + +void LogTask(void) +{ + +} + +bool LogMemLoadBlock(void* Buffer, uint32_t BlockAddress, uint16_t ByteCount) +{ + if (BlockAddress < sizeof(LogMem)) { + uint8_t* DataPtr = (uint8_t*) Buffer; + uint8_t* MemPtr = &LogMem[BlockAddress]; + + while(ByteCount-- > 0) { + *DataPtr++ = *MemPtr++; + } + + return true; + } else { + return false; + } +} + +void LogMemClear(void) +{ + uint16_t i; + + for (i=0; iLogMode = Mode; +#else + /* Write Log settings globally */ + for (uint8_t i=0; iLogMode, Mode, BufferSize); +} + +void LogGetModeList(char* List, uint16_t BufferSize) +{ + MapToString(LogModeMap, sizeof(LogModeMap)/sizeof(*LogModeMap), List, BufferSize); +} diff --git a/RevE-light/Firmware/Chameleon-Mini/Log.h b/RevE-light/Firmware/Chameleon-Mini/Log.h new file mode 100644 index 0000000..37a3c68 --- /dev/null +++ b/RevE-light/Firmware/Chameleon-Mini/Log.h @@ -0,0 +1,66 @@ +#ifndef LOG_H_ +#define LOG_H_ + +#include "Common.h" + +#define LOG_SIZE 2048 + +typedef enum { + /* Generic */ + LOG_INFO_GENERIC = 0x10, + LOG_INFO_CONFIG_SET = 0x11, + LOG_INFO_SETTING_SET = 0x12, + LOG_INFO_UID_SET = 0x13, + LOG_INFO_RESET_APP = 0x20, + + /* Codec */ + LOG_INFO_CODEC_RX_DATA = 0x40, + LOG_INFO_CODEC_TX_DATA = 0x41, + + /* App */ + LOG_INFO_APP_CMD_READ = 0x80, + LOG_INFO_APP_CMD_WRITE = 0x81, + LOG_INFO_APP_CMD_INC = 0x84, + LOG_INFO_APP_CMD_DEC = 0x85, + LOG_INFO_APP_CMD_TRANSFER = 0x86, + LOG_INFO_APP_CMD_RESTORE = 0x87, + LOG_INFO_APP_CMD_AUTH = 0x90, + LOG_INFO_APP_CMD_HALT = 0x91, + LOG_INFO_APP_CMD_UNKNOWN = 0x92, + LOG_INFO_APP_AUTHING = 0xA0, + LOG_INFO_APP_AUTHED = 0xA1, + LOG_ERR_APP_AUTH_FAIL = 0xC0, + LOG_ERR_APP_CHECKSUM_FAIL = 0xC1, + LOG_ERR_APP_NOT_AUTHED = 0xC2, + + LOG_EMPTY = 0x00 +} LogEntryEnum; + +typedef enum { + LOG_MODE_OFF, + LOG_MODE_MEMORY, + LOG_MODE_LIVE +} LogModeEnum; + +typedef void (*LogFuncType) (LogEntryEnum Entry, const void* Data, uint8_t Length); + +extern LogFuncType CurrentLogFunc; + +void LogInit(void); +void LogTick(void); +void LogTask(void); + +void LogMemClear(void); +uint16_t LogMemFree(void); +/* XModem callback */ +bool LogMemLoadBlock(void* Buffer, uint32_t BlockAddress, uint16_t ByteCount); + +void LogSetModeById(LogModeEnum Mode); +bool LogSetModeByName(const char* Mode); +void LogGetModeByName(char* Mode, uint16_t BufferSize); +void LogGetModeList(char* List, uint16_t BufferSize); + +/* Wrapper function to call current logging function */ +INLINE void LogEntry(LogEntryEnum Entry, const void* Data, uint8_t Length) { CurrentLogFunc(Entry, Data, Length); } + +#endif /* LOG_H_ */ diff --git a/RevE-light/Firmware/Chameleon-Mini/Makefile b/RevE-light/Firmware/Chameleon-Mini/Makefile new file mode 100644 index 0000000..c1340a0 --- /dev/null +++ b/RevE-light/Firmware/Chameleon-Mini/Makefile @@ -0,0 +1,185 @@ +# This makefile uses sh in order to build the project. +# Note when using AVR-Toolchain, you have to install cygwin and +# append cygwin's bin directory to the PATH environment variable +# because Atmel does not ship sh.exe anymore with the toolchain. +SHELL = /bin/sh + +# Supported configurations +SETTINGS += -DCONFIG_MF_CLASSIC_1K_SUPPORT +SETTINGS += -DCONFIG_MF_Plus1k_7B_SUPPORT +SETTINGS += -DCONFIG_MF_CLASSIC_4K_SUPPORT +SETTINGS += -DCONFIG_MF_ULTRALIGHT_SUPPORT +SETTINGS += -DCONFIG_ISO14443A_SNIFF_SUPPORT + +# Support magic mode on mifare classic configuration +SETTINGS += -DSUPPORT_MF_CLASSIC_MAGIC_MODE + +# Support activating firmware upgrade mode through command-line +SETTINGS += -DSUPPORT_FIRMWARE_UPGRADE + +# Default configuration +#SETTINGS += -DDEFAULT_CONFIGURATION=CONFIG_MF_Plus1k_7B +#SETTINGS += -DDEFAULT_CONFIGURATION=CONFIG_MF_CLASSIC_1K +#SETTINGS += -DDEFAULT_CONFIGURATION=CONFIG_MF_CLASSIC_4K +#SETTINGS += -DDEFAULT_CONFIGURATION=CONFIG_MF_ULTRALIGHT +SETTINGS += -DDEFAULT_CONFIGURATION=CONFIG_MF_CLASSIC_1K + +# Default button actions +#SETTINGS += -DDEFAULT_RBUTTON_ACTION=BUTTON_ACTION_UID_RANDOM +#SETTINGS += -DDEFAULT_RBUTTON_ACTION=BUTTON_ACTION_UID_LEFT_INCREMENT +#SETTINGS += -DDEFAULT_RBUTTON_ACTION=BUTTON_ACTION_UID_RIGHT_INCREMENT +#SETTINGS += -DDEFAULT_RBUTTON_ACTION=BUTTON_ACTION_UID_LEFT_DECREMENT +#SETTINGS += -DDEFAULT_RBUTTON_ACTION=BUTTON_ACTION_UID_RIGHT_DECREMENT +SETTINGS += -DDEFAULT_RBUTTON_ACTION=BUTTON_ACTION_CYCLE_SETTINGS +#SETTINGS += -DDEFAULT_RBUTTON_ACTION=BUTTON_ACTION_STORE_MEM +SETTINGS += -DDEFAULT_LBUTTON_ACTION=BUTTON_ACTION_STORE_MEM + +# Define if button action setting should be independent of active setting +SETTINGS += -DBUTTON_SETTING_GLOBAL + +# Default LED functions + +#SETTINGS += -DDEFAULT_RED_LED_ACTION=LED_TERMINAL_CONN +#SETTINGS += -DDEFAULT_RED_LED_ACTION=LED_TERMINAL_RXTX +SETTINGS += -DDEFAULT_RED_LED_ACTION=LED_SETTING_CHANGE +#SETTINGS += -DDEFAULT_RED_LED_ACTION=LED_MEMORY_STORED +#SETTINGS += -DDEFAULT_RED_LED_ACTION=LED_MEMORY_CHANGED +#SETTINGS += -DDEFAULT_RED_LED_ACTION=LED_CODEC_RX +#SETTINGS += -DDEFAULT_RED_LED_ACTION=LED_CODEC_TX + +SETTINGS += -DDEFAULT_GREEN_LED_ACTION=LED_TERMINAL_CONN +#SETTINGS += -DDEFAULT_GREEN_LED_ACTION=LED_TERMINAL_RXTX +#SETTINGS += -DDEFAULT_GREEN_LED_ACTION=LED_SETTING_CHANGE +#SETTINGS += -DDEFAULT_GREEN_LED_ACTION=LED_MEMORY_STORED +#SETTINGS += -DDEFAULT_GREEN_LED_ACTION=LED_MEMORY_CHANGED +#SETTINGS += -DDEFAULT_GREEN_LED_ACTION=LED_CODEC_RX +#SETTINGS += -DDEFAULT_GREEN_LED_ACTION=LED_CODEC_TX + + +# Define if LED function setting should be independent of active setting +SETTINGS += -DLED_SETTING_GLOBAL + +# Default logging mode +SETTINGS += -DDEFAULT_LOG_MODE=LOG_MODE_OFF +#SETTINGS += -DDEFAULT_LOG_MODE=LOG_MODE_MEMORY +#SETTINGS += -DDEFAULT_LOG_MODE=LOG_MODE_TERMINAL + +# Default setting +SETTINGS += -DDEFAULT_SETTING=SETTINGS_FIRST + +# Use EEPROM to store settings +SETTINGS += -DENABLE_EEPROM_SETTINGS + + +# Memory definitions and objcopy flags to include sections in binaries +FLASH_DATA_ADDR = 0x10000 # Start of data section in flash +FLASH_DATA_SIZE = 0x8000 # Size of data section in flash +FLASH_DATA_OBJCOPY = --set-section-flags=.flashdata="alloc,load" +SPM_HELPER_ADDR = 0x21FE0 # Start of SPM helper section. Should be last 32Byte in bootloader section +SPM_HELPER_OBJCOPY = --set-section-flags=.spmhelper="alloc,load" + + +# Build configuration +BUILD_DATE = $(shell date +'\"%y%m%d\"') +MCU = atxmega128a4u +ARCH = XMEGA +BOARD = NONE +F_CPU = 32000000 +F_USB = 48000000 +TARGET = Chameleon-Mini +OPTIMIZATION = 3 + +# Core files +SRC += $(TARGET).c +SRC += Button.c +SRC += Common.c +SRC += Configuration.c +SRC += LED.c +SRC += LUFADescriptors.c +SRC += Log.c +SRC += Map.c +SRC += Memory.c +SRC += MemoryAsm.S +SRC += Random.c +SRC += Settings.c +SRC += System.c + +# Terminal +SRC += Terminal/Terminal.c +SRC += Terminal/Commands.c +SRC += Terminal/XModem.c +SRC += Terminal/CommandLine.c + +# Codecs +SRC += Codec/Codec.c +SRC += Codec/ISO14443-2A.c + +# Applications +SRC += Application/MifareUltralight.c +SRC += Application/MifareClassic.c +SRC += Application/ISO14443-3A.c +SRC += Application/Crypto1.c + +# LUFA +SRC += $(LUFA_SRC_USB) $(LUFA_SRC_USBCLASS) +LUFA_PATH = ../../../Firmware/LUFA + +# General linker / compiler settings +CC_FLAGS = -DUSE_LUFA_CONFIG_HEADER -DFLASH_DATA_ADDR=$(FLASH_DATA_ADDR) -DFLASH_DATA_SIZE=$(FLASH_DATA_SIZE) -DSPM_HELPER_ADDR=$(SPM_HELPER_ADDR) -DBUILD_DATE=$(BUILD_DATE) $(SETTINGS) -I$(LUFA_PATH) +LD_FLAGS = -Wl,--section-start=.flashdata=$(FLASH_DATA_ADDR) -Wl,--section-start=.spmhelper=$(SPM_HELPER_ADDR) +OBJDIR = Bin +OBJECT_FILES = + +#AVRDUDE settings +AVRDUDE_PROGRAMMER = jtag2pdi #avrisp2 +AVRDUDE_MCU = atxmega128a4 +AVRDUDE_PORT = usb +AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex +AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep +AVRDUDE_FLAGS = -p $(AVRDUDE_MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER) + +# Default target +all: + +# Include LUFA build script makefiles +include $(LUFA_PATH)/Build/lufa_core.mk +include $(LUFA_PATH)/Build/lufa_sources.mk +include $(LUFA_PATH)/Build/lufa_build.mk +include $(LUFA_PATH)/Build/lufa_cppcheck.mk +# include $(LUFA_PATH)/Build/lufa_doxygen.mk +# include $(LUFA_PATH)/Build/lufa_dfu.mk +# include $(LUFA_PATH)/Build/lufa_hid.mk +# include $(LUFA_PATH)/Build/lufa_avrdude.mk +# include $(LUFA_PATH)/Build/lufa_atprogram.mk + +# Overwrite the LUFA versions of hex/bin file generation to include spmhelper and flashdata sections +%.hex: %.elf + @echo $(MSG_OBJCPY_CMD) Chameleon: Extracting HEX file data from \"$<\" + @$(CROSS)-objcopy -O ihex -R .eeprom -R .fuse -R .lock -R .signature $(FLASH_DATA_OBJCOPY) $< $@ + +%.bin: %.elf + @echo $(MSG_OBJCPY_CMD) Chameleon: Extracting BIN file data from \"$<\" + @$(CROSS)-objcopy -O binary -R .eeprom -R .fuse -R .lock -R .signature $(FLASH_DATA_OBJCOPY) $< $@ + +# Extract SPMHelper in the last 32 Byte of the bootloader section to externally combine it with any bootloader +spmhelper: $(TARGET).elf + @echo $(MSG_OBJCPY_CMD) Chameleon: Extracting SPM helper HEX file from $(TARGET).elf + @$(CROSS)-objcopy -O ihex -j .spmhelper $(SPM_HELPER_OBJCOPY) $(TARGET).elf $(TARGET).hex + +# Program the device using avrdude +program: $(TARGET).hex $(TARGET).eep + avrdude $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM) + +# Program the device using batchisp and the DFU bootloader +# Note that the device has to be in bootloader mode already +dfu-flip: $(TARGET).hex $(TARGET).eep + cp $(TARGET).eep EEPROM.hex + batchisp -hardware usb -device $(MCU) -operation erase f memory FLASH loadbuffer $(TARGET).hex program verify memory EEPROM loadbuffer EEPROM.hex program verify start reset 0 + rm EEPROM.hex + +# Program the device using dfu-programmer +dfu-prog: $(TARGET).hex $(TARGET).eep + dfu-programmer $(MCU) erase + dfu-programmer $(MCU) flash-eeprom $(TARGET).eep + dfu-programmer $(MCU) flash $(TARGET).hex + dfu-programmer $(MCU) reset diff --git a/RevE-light/Firmware/Chameleon-Mini/Map.c b/RevE-light/Firmware/Chameleon-Mini/Map.c new file mode 100644 index 0000000..b6011d4 --- /dev/null +++ b/RevE-light/Firmware/Chameleon-Mini/Map.c @@ -0,0 +1,72 @@ +#include "Map.h" + +bool MapIdToText(const MapEntryType* MapPtr, uint8_t MapSize, MapIdType Id, char* Text, uint16_t MaxBufferSize) +{ + while (MapSize--) { + if (pgm_read_byte(&MapPtr->Id) == Id) { + strncpy_P(Text, MapPtr->Text, MaxBufferSize); + return true; + } + + MapPtr++; + } + + return false; +} + +bool MapTextToId(const MapEntryType* MapPtr, uint8_t MapSize, MapTextPtrType Text, MapIdType* IdPtr) +{ + while (MapSize--) { + if (strcmp_P(Text, MapPtr->Text) == 0) { + if (sizeof(MapIdType) == 1) { + *IdPtr = pgm_read_byte(&MapPtr->Id); + } else if (sizeof(MapIdType) == 2) { + *IdPtr = pgm_read_word(&MapPtr->Id); + } + return true; + } + + MapPtr++; + } + + return false; +} + +void MapToString(MapEntryType* MapPtr, uint8_t MapSize, char* String, uint16_t MaxBufferSize) +{ + uint8_t EntriesLeft = MapSize; + uint16_t BytesLeft = MaxBufferSize; + + while (EntriesLeft > 0) { + const char* Text = MapPtr->Text; + char c; + + while( (c = pgm_read_byte(Text)) != '\0') { + if (BytesLeft == 0) { + return; + } + + *String++ = c; + Text++; + BytesLeft--; + } + + if (EntriesLeft > 1) { + /* More than one map entries left */ + if (BytesLeft == 0) { + return; + } + + *String++ = ','; + } + + MapPtr++; + EntriesLeft--; + } + + /* Terminate string */ + if (BytesLeft > 0) { + *String++ = '\0'; + BytesLeft--; + } +} diff --git a/RevE-light/Firmware/Chameleon-Mini/Map.h b/RevE-light/Firmware/Chameleon-Mini/Map.h new file mode 100644 index 0000000..7180280 --- /dev/null +++ b/RevE-light/Firmware/Chameleon-Mini/Map.h @@ -0,0 +1,30 @@ +/* + * Map.h + * + * Created on: 07.12.2014 + * Author: sk + */ + +#ifndef MAP_H_ +#define MAP_H_ + +#include +#include +#include + +#define MAP_TEXT_BUF_SIZE 32 +#define MAP_MAX_TEXT_SIZE (MAP_TEXT_BUF_SIZE - 1) + +typedef uint8_t MapIdType; +typedef const char* MapTextPtrType; + +const typedef struct { + MapIdType Id; + const char Text[MAP_TEXT_BUF_SIZE]; +} MapEntryType; + +bool MapIdToText(const MapEntryType* MapPtr, uint8_t MapSize, MapIdType Id, char* Text, uint16_t MaxBufferSize); +bool MapTextToId(const MapEntryType* MapPtr, uint8_t MapSize, MapTextPtrType Text, MapIdType* IdPtr); +void MapToString(const MapEntryType* MapPtr, uint8_t MapSize, char* String, uint16_t MaxBufferSize); + +#endif /* MAP_H_ */ diff --git a/RevE-light/Firmware/Chameleon-Mini/Memory.c b/RevE-light/Firmware/Chameleon-Mini/Memory.c new file mode 100644 index 0000000..cdaadb7 --- /dev/null +++ b/RevE-light/Firmware/Chameleon-Mini/Memory.c @@ -0,0 +1,228 @@ +/* + * Flash.c + * + * Created on: 20.03.2013 + * Author: skuser + */ + +#include "Memory.h" +#include "Configuration.h" +#include "Common.h" +#include "Settings.h" +#include "LEDHook.h" + +/* 4k SRAM buffer */ +static uint8_t Memory[MEMORY_SIZE_PER_SETTING]; + +/* Declarations from assembler file */ +uint16_t FlashReadWord(uint32_t Address); +void FlashEraseApplicationPage(uint32_t Address); +void FlashLoadFlashWord(uint16_t Address, uint16_t Data); +void FlashEraseWriteApplicationPage(uint32_t Address); +void FlashEraseFlashBuffer(void); +void FlashWaitForSPM(void); + +/* Convert defines from Makefile */ +#define FLASH_DATA_START FLASH_DATA_ADDR +#define FLASH_DATA_END (FLASH_DATA_ADDR + FLASH_DATA_SIZE - 1) + +INLINE void FlashRead(void* Buffer, uint32_t Address, uint16_t ByteCount) +{ + uint8_t* BufPtr = (uint8_t*) Buffer; + + /* We assume that ByteCount is a multiple of 2 */ + uint32_t PhysicalAddress = Address + FLASH_DATA_ADDR; + + if ( (PhysicalAddress >= FLASH_DATA_START) && (PhysicalAddress <= FLASH_DATA_END) ) { + /* Sanity check to limit access to the allocated area */ + while(ByteCount > 1) { + uint16_t Word = FlashReadWord(PhysicalAddress); + + *BufPtr++ = (Word >> 0) & 0xFF; + *BufPtr++ = (Word >> 8) & 0xFF; + + PhysicalAddress += 2; + ByteCount -= 2; + } + } +} + +INLINE void FlashWrite(const void* Buffer, uint32_t Address, uint16_t ByteCount) +{ + const uint8_t* BufPtr = (uint8_t*) Buffer; + + /* We assume that FlashWrite is always called for write actions that are + * aligned to APP_SECTION_PAGE_SIZE and a multiple of APP_SECTION_PAGE_SIZE. + * Thus only full pages are written into the flash. */ + uint16_t PageCount = ByteCount / APP_SECTION_PAGE_SIZE; + uint32_t PhysicalAddress = Address + FLASH_DATA_ADDR; + + if ( (PhysicalAddress >= FLASH_DATA_START) && (PhysicalAddress <= FLASH_DATA_END) ) { + /* Sanity check to limit access to the allocated area */ + + while(PageCount-- > 0) { + /* For each page to program, wait for NVM to get ready, + * erase the flash page buffer, program all data to the + * flash page buffer and write buffer to flash using + * the atomic erase and write operation. */ + + FlashWaitForSPM(); + + FlashEraseFlashBuffer(); + FlashWaitForSPM(); + + for (uint16_t i=0; i= FLASH_DATA_START) && (PhysicalAddress <= FLASH_DATA_END) ) { + /* Sanity check to limit access to the allocated area */ + while(PageCount-- > 0) { + FlashWaitForSPM(); + + FlashEraseApplicationPage(PhysicalAddress); + FlashWaitForSPM(); + + PhysicalAddress += APP_SECTION_PAGE_SIZE; + } + } +} + +void MemoryInit(void) +{ + /* Load permanent flash contents to memory at startup */ + MemoryRecall(); +} + +void MemoryReadBlock(void* Buffer, uint16_t Address, uint16_t ByteCount) +{ + uint8_t* SrcPtr = &Memory[Address]; + uint8_t* DstPtr = (uint8_t*) Buffer; + + /* Prevent Buf Ovfs */ + ByteCount = MIN(ByteCount, MEMORY_SIZE_PER_SETTING - Address); + + while(ByteCount--) + { + *DstPtr++ = *SrcPtr++; + } +} + +void MemoryWriteBlock(const void* Buffer, uint16_t Address, uint16_t ByteCount) +{ + uint8_t* SrcPtr = (uint8_t*) Buffer; + uint8_t* DstPtr = &Memory[Address]; + + /* Prevent Buf Ovfs */ + ByteCount = MIN(ByteCount, MEMORY_SIZE_PER_SETTING - Address); + + while(ByteCount--) { + *DstPtr++ = *SrcPtr++; + } + + LEDHook(LED_MEMORY_CHANGED, LED_ON); +} + +void MemoryClear(void) +{ + for (uint16_t i = 0; i < MEMORY_SIZE_PER_SETTING; i++) + { + Memory[i] = 0; + } +} + +void MemoryRecall(void) +{ + /* Recall memory from permanent internal flash */ + FlashRead(Memory, (uint32_t) GlobalSettings.ActiveSettingIdx * MEMORY_SIZE_PER_SETTING, MEMORY_SIZE_PER_SETTING); +} + +void MemoryStore(void) +{ + /* Store current memory into permanent internal flash */ + FlashWrite(Memory, (uint32_t) GlobalSettings.ActiveSettingIdx * MEMORY_SIZE_PER_SETTING, MEMORY_SIZE_PER_SETTING); + + LEDHook(LED_MEMORY_CHANGED, LED_OFF); + LEDHook(LED_MEMORY_STORED, LED_PULSE); +} + +bool MemoryUploadBlock(void* Buffer, uint32_t BlockAddress, uint16_t ByteCount) +{ + if (BlockAddress >= MEMORY_SIZE_PER_SETTING) + { + /* Prevent writing out of bounds by silently ignoring it */ + return true; + } + else + { + /* Calculate bytes left in memory and start writing */ + uint32_t BytesLeft = MEMORY_SIZE_PER_SETTING - BlockAddress; + uint32_t FlashAddress = (uint32_t) BlockAddress + (uint32_t) GlobalSettings.ActiveSettingIdx * MEMORY_SIZE_PER_SETTING; + ByteCount = MIN(ByteCount, BytesLeft); + + /* Store into flash */ + + /// TODO: Do we want to also upload to Flash or only to RAM (& do store then) + // FlashWrite(Buffer, FlashAddress, ByteCount); + //// FIXME, redirect to internal flash + + /* Store to local memory */ + uint8_t* DstPtr = &Memory[BlockAddress]; + uint8_t* SrcPtr = (uint8_t*) Buffer; + + while(ByteCount--) + { + *DstPtr++ = *SrcPtr++; + } + + return true; + } + +} + +bool MemoryDownloadBlock(void* Buffer, uint32_t BlockAddress, uint16_t ByteCount) +{ + if (BlockAddress >= MEMORY_SIZE_PER_SETTING) + { + /* There are bytes out of bounds to be read. Notify that we are done. */ + return false; + } + else + { + /* Calculate bytes left in memory and issue reading */ + uint32_t BytesLeft = MEMORY_SIZE_PER_SETTING - BlockAddress; + //uint32_t FlashAddress = (uint32_t) BlockAddress + (uint32_t) GlobalSettings.ActiveSetting * MEMORY_SIZE_PER_SETTING; + ByteCount = MIN(ByteCount, BytesLeft); + + /* Output local memory contents */ + uint8_t* DstPtr = (uint8_t*) Buffer; + uint8_t* SrcPtr = &Memory[BlockAddress]; + + while(ByteCount--) + { + *DstPtr++ = *SrcPtr++; + } + + return true; + } +} + diff --git a/RevE-light/Firmware/Chameleon-Mini/Memory.h b/RevE-light/Firmware/Chameleon-Mini/Memory.h new file mode 100644 index 0000000..4a7f9bb --- /dev/null +++ b/RevE-light/Firmware/Chameleon-Mini/Memory.h @@ -0,0 +1,33 @@ +/* + * Flash.h + * + * Created on: 20.03.2013 + * Author: skuser + */ + +#ifndef MEMORY_H_ +#define MEMORY_H_ + +#define MEMORY_SIZE (FLASH_DATA_SIZE) /* From makefile */ +#define MEMORY_INIT_VALUE 0x00 +#define MEMORY_SIZE_PER_SETTING 4096 + +#ifndef __ASSEMBLER__ +#include "Common.h" + +void MemoryInit(void); +void MemoryReadBlock(void* Buffer, uint16_t Address, uint16_t ByteCount); +void MemoryWriteBlock(const void* Buffer, uint16_t Address, uint16_t ByteCount); +void MemoryClear(void); + + +void MemoryRecall(void); +void MemoryStore(void); + +/* For use with XModem */ +bool MemoryUploadBlock(void* Buffer, uint32_t BlockAddress, uint16_t ByteCount); +bool MemoryDownloadBlock(void* Buffer, uint32_t BlockAddress, uint16_t ByteCount); + +#endif /* __ASSEMBLER__ */ + +#endif /* MEMORY_H_ */ diff --git a/RevE-light/Firmware/Chameleon-Mini/MemoryAsm.S b/RevE-light/Firmware/Chameleon-Mini/MemoryAsm.S new file mode 100644 index 0000000..efb3374 --- /dev/null +++ b/RevE-light/Firmware/Chameleon-Mini/MemoryAsm.S @@ -0,0 +1,225 @@ +#include +#include "Memory.h" + +#define NVM_CMD_NO_OPERATION_gc (0x00<<0) +#define NVM_CMD_READ_USER_SIG_ROW_gc (0x01<<0) +#define NVM_CMD_READ_CALIB_ROW_gc (0x02<<0) +#define NVM_CMD_READ_EEPROM_gc (0x06<<0) +#define NVM_CMD_READ_FUSES_gc (0x07<<0) +#define NVM_CMD_WRITE_LOCK_BITS_gc (0x08<<0) +#define NVM_CMD_ERASE_USER_SIG_ROW_gc (0x18<<0) +#define NVM_CMD_WRITE_USER_SIG_ROW_gc (0x1A<<0) +#define NVM_CMD_ERASE_APP_gc (0x20<<0) +#define NVM_CMD_ERASE_APP_PAGE_gc (0x22<<0) +#define NVM_CMD_LOAD_FLASH_BUFFER_gc (0x23<<0) +#define NVM_CMD_WRITE_APP_PAGE_gc (0x24<<0) +#define NVM_CMD_ERASE_WRITE_APP_PAGE_gc (0x25<<0) +#define NVM_CMD_ERASE_FLASH_BUFFER_gc (0x26<<0) +#define NVM_CMD_ERASE_BOOT_PAGE_gc (0x2A<<0) +#define NVM_CMD_WRITE_BOOT_PAGE_gc (0x2C<<0) +#define NVM_CMD_ERASE_WRITE_BOOT_PAGE_gc (0x2D<<0) +#define NVM_CMD_ERASE_EEPROM_gc (0x30<<0) +#define NVM_CMD_ERASE_EEPROM_PAGE_gc (0x32<<0) +#define NVM_CMD_LOAD_EEPROM_BUFFER_gc (0x33<<0) +#define NVM_CMD_WRITE_EEPROM_PAGE_gc (0x34<<0) +#define NVM_CMD_ERASE_WRITE_EEPROM_PAGE_gc (0x35<<0) +#define NVM_CMD_ERASE_EEPROM_BUFFER_gc (0x36<<0) +#define NVM_CMD_APP_CRC_gc (0x38<<0) +#define NVM_CMD_BOOT_CRC_gc (0x39<<0) +#define NVM_CMD_FLASH_RANGE_CRC_gc (0x3A<<0) +#define CCP_SPM_gc (0x9D<<0) +#define CCP_IOREG_gc (0xD8<<0) + +/* FlashCommonSPM needs to reside in boot loader section */ +#define SPM_HELPER_ADDR_REF (BOOT_SECTION_START + BOOT_SECTION_SIZE - 32) +#ifdef SPM_HELPER_ADDR +/* If enabled by makefile, we can check the hardcoded address from makefile + * against avr/io.h and generate an error on mismatch */ +#if ((SPM_HELPER_ADDR - SPM_HELPER_ADDR_REF) != 0) +#error SPM helper function addresses from Makefile and avr/io.h do not match! +#endif +#endif + +/* The following assembly code is taken from Atmels sp_driver.S in AVR1316 */ + +; This routine reads a word from flash given by the address in +; R25:R24:R23:R22. +; +; Input: +; R25:R24:R23:R22. +; +; Returns: +; R25:R24 - Read word. +.section .text +.global FlashReadWord +FlashReadWord: + in r19, RAMPZ ; Save RAMPZ. + out RAMPZ, r24 ; Load RAMPZ with the MSB of the address. + movw ZL, r22 ; Move the low bytes to the Z pointer + elpm r24, Z+ ; Extended load byte from address pointed to by Z. + elpm r25, Z ; Extended load byte from address pointed to by Z. + out RAMPZ, r19 ; Restore RAMPZ register. + ret + +; This routine erases the page at address R25:R24:R23:R22 in the application +; section. The address can point anywhere inside the page. +; +; Input: +; R25:R24:R23:R22 - Byte address into Flash page. +; +; Returns: +; Nothing. +.section .text +.global FlashEraseApplicationPage +FlashEraseApplicationPage: + in r19, RAMPZ ; Save RAMPZ, which is restored in FlashCommonSPM. + out RAMPZ, r24 ; Load RAMPZ with the MSB of the address. + movw r24, r22 ; Move low bytes for ZH:ZL to R25:R24 + ldi r20, NVM_CMD_ERASE_APP_PAGE_gc ; Prepare NVM command in R20. + jmp FlashCommonSPM ; Jump to common SPM code. + +; This routine writes the word from R23:R22 into the Flash page buffer at +; address R25:R24. +; +; Input: +; R25:R24 - Byte address into Flash page. +; R23:R22 - Word to write. +; +; Returns: +; Nothing. +.section .text +.global FlashLoadFlashWord +FlashLoadFlashWord: + in r19, RAMPZ ; Save RAMPZ, which is restored in FlashCommonSPM. + movw r0, r22 ; Prepare flash word in R1:R0. + ldi r20, NVM_CMD_LOAD_FLASH_BUFFER_gc ; Prepare NVM command in R20. + jmp FlashCommonSPM ; Jump to common SPM code. + + +; This routine erases first and then writes the page buffer to the +; Flash page at address R25:R24:R23:R22 in the application section. The address +; can point anywhere inside the page. +; +; Input: +; R25:R24:R23:R22 - Byte address into Flash page. +; +; Returns: +; Nothing. +.section .text +.global FlashEraseWriteApplicationPage +FlashEraseWriteApplicationPage: + in r19, RAMPZ ; Save RAMPZ, which is restored in FlashCommonSPM. + out RAMPZ, r24 ; Load RAMPZ with the MSB of the address. + movw r24, r22 ; Move low bytes of address to ZH:ZL from R23:R22 + ldi r20, NVM_CMD_ERASE_WRITE_APP_PAGE_gc ; Prepare NVM command in R20. + jmp FlashCommonSPM ; Jump to common SPM code. + +; This routine flushes the Flash page buffer. +; +; Input: +; Nothing. +; +; Returns: +; Nothing. +.section .text +.global FlashEraseFlashBuffer +FlashEraseFlashBuffer: + in r19, RAMPZ ; Save RAMPZ, which is restored in FlashCommonSPM. + ldi r20, NVM_CMD_ERASE_FLASH_BUFFER_gc ; Prepare NVM command in R20. + ;jmp FlashCommonSPM ; Jump to common SPM code. + jmp FlashCommonCMD + +; This routine wait for the SPM to finish and clears the command register. +; +; Note that this routine is blocking, and will halt any execution until the SPM +; is finished. +; +; Input: +; Nothing. +; +; Returns: +; Nothing. +.section .text +.global FlashWaitForSPM +FlashWaitForSPM: + lds r18, NVM_STATUS ; Load the NVM Status register. + sbrc r18, NVM_NVMBUSY_bp ; Check if bit is cleared. + rjmp FlashWaitForSPM ; Repeat check if bit is not cleared. + clr r18 + sts NVM_CMD, r18 ; Clear up command register to NO_OPERATION. + ret + +; This routine is called by several other routines, and contains common code +; for executing an NVM command, including the return statement itself. +; +; If the operation (NVM command) requires the NVM Address registers to be +; prepared, this must be done before jumping to this routine. +; +; Note that R25:R24:R23:R22 is used for returning results, even if the +; C-domain calling function only expects a single byte or even void. +; +; Input: +; R20 - NVM Command code. +; +; Returns: +; R25:R24:R23:R22 - 32-bit result from NVM operation. +.section .text +FlashCommonCMD: + sts NVM_CMD, r20 ; Load command into NVM Command register. + ldi r18, CCP_IOREG_gc ; Prepare Protect IO-register signature in R18. + ldi r19, NVM_CMDEX_bm ; Prepare bitmask for setting NVM Command Execute bit into R19. + sts CCP, r18 ; Enable IO-register operation (this disables interrupts for 4 cycles). + sts NVM_CTRLA, r19 ; Load bitmask into NVM Control Register A, which executes the command. + lds r22, NVM_DATA0 ; Load NVM Data Register 0 into R22. + lds r23, NVM_DATA1 ; Load NVM Data Register 1 into R23. + lds r24, NVM_DATA2 ; Load NVM Data Register 2 into R24. + clr r25 ; Clear R25 in order to return a clean 32-bit value. + ret + +; This routine is called by several other routines, and contains common code +; for executing an LPM command, including the return statement itself. +; +; Note that R24 is used for returning results, even if the +; C-domain calling function expects a void. +; +; Input: +; R25:R24 - Low bytes of Z pointer. +; R20 - NVM Command code. +; +; Returns: +; R24 - Result from LPM operation. +.section .text +FlashCommonLPM: + movw ZL, r24 ; Load index into Z. + sts NVM_CMD, r20 ; Load prepared command into NVM Command register. + lpm r24,Z + ret + +; This routine is called by several other routines, and contains common code +; for executing an SPM command, including the return statement itself. +; +; If the operation (SPM command) requires the R1:R0 registers to be +; prepared, this must be done before jumping to this routine. +; +; Input: +; R1:R0 - Optional input to SPM command. +; R25:R24 - Low bytes of Z pointer. +; R20 - NVM Command code. +; +; Returns: +; Nothing. +.section .spmhelper +FlashCommonSPM: + movw ZL, r24 ; Load R25:R24 into Z. + sts NVM_CMD, r20 ; Load prepared command into NVM Command register. + ldi r18, CCP_SPM_gc ; Prepare Protect SPM signature in R18 + sts CCP, r18 ; Enable SPM operation (this disables interrupts for 4 cycles). + spm ; Self-program. + clr r1 ; Clear R1 for GCC _zero_reg_ to function properly. + out RAMPZ, r19 ; Restore RAMPZ register. + ret + +/* Reserve memory for data */ +.section .flashdata +.align 1 +.skip MEMORY_SIZE, MEMORY_INIT_VALUE diff --git a/RevE-light/Firmware/Chameleon-Mini/ProgramViaBootloader.bat b/RevE-light/Firmware/Chameleon-Mini/ProgramViaBootloader.bat new file mode 100644 index 0000000..77329d3 --- /dev/null +++ b/RevE-light/Firmware/Chameleon-Mini/ProgramViaBootloader.bat @@ -0,0 +1,21 @@ +@ECHO OFF + +REM This script programs the Chameleon using batchisp (Atmel Flip) and DFU (device firmware upgrade via USB) +REM You need to install Flip, otherwise it does not work +REM Make sure to adjust the COMPORT variable to the actual com port the CDC Device enumerates as +REM This is necessary to send the upgrade command and thus set the chameleon into DFU mode + +SET COMPORT=COM5 +SET TIMEOUT=5 +SET COMMAND=UPGRADE + +ECHO Trying to set bootloader mode on Chameleon-Mini on %COMPORT% +@MODE %COMPORT% baud=11 parity=n data=8 stop=1 to=off xon=off odsr=off octs=off dtr=off rts=off idsr=off > nul +@ECHO. > \\.\%COMPORT% +@ECHO %COMMAND% > \\.\%COMPORT% + +ECHO Waiting for DFU Bootloader +ping 127.0.0.1 -n %TIMEOUT% -w 1000 > nul + +ECHO Start Programming +make dfu-flip diff --git a/RevE-light/Firmware/Chameleon-Mini/README.txt b/RevE-light/Firmware/Chameleon-Mini/README.txt new file mode 100644 index 0000000..e84da10 --- /dev/null +++ b/RevE-light/Firmware/Chameleon-Mini/README.txt @@ -0,0 +1,9 @@ +== Compiling the firmware == +For compiling under windows you need to do the following: +1. Install AVR GNU Toolchain from Atmel +2. Install Cygwin for sh.exe (base installation is sufficient) +3. Add the bin path of cygwin (containing sh.exe) to the PATH environment variable for MAKE to find it + +Then you should be good to go to build the firmware by typing in the following: +> make + diff --git a/RevE-light/Firmware/Chameleon-Mini/Random.c b/RevE-light/Firmware/Chameleon-Mini/Random.c new file mode 100644 index 0000000..fb1a592 --- /dev/null +++ b/RevE-light/Firmware/Chameleon-Mini/Random.c @@ -0,0 +1,30 @@ +#include "Random.h" + +#include + +void RandomInit(void) +{ + +} + +uint8_t RandomGetByte(void) +{ + return rand() & 0xFF; +} + +void RandomGetBuffer(void* Buffer, uint8_t ByteCount) +{ + uint8_t* BufferPtr = (uint8_t*) Buffer; + + while(ByteCount--) { + *BufferPtr++ = RandomGetByte(); + } +} + +void RandomTick(void) +{ + rand(); + rand(); + rand(); + rand(); +} diff --git a/RevE-light/Firmware/Chameleon-Mini/Random.h b/RevE-light/Firmware/Chameleon-Mini/Random.h new file mode 100644 index 0000000..c6609ed --- /dev/null +++ b/RevE-light/Firmware/Chameleon-Mini/Random.h @@ -0,0 +1,18 @@ +/* + * Random.h + * + * Created on: 22.03.2013 + * Author: skuser + */ + +#ifndef RANDOM_H_ +#define RANDOM_H_ + +#include "Common.h" + +void RandomInit(void); +uint8_t RandomGetByte(void); +void RandomGetBuffer(void* Buffer, uint8_t ByteCount); +void RandomTick(void); + +#endif /* RANDOM_H_ */ diff --git a/RevE-light/Firmware/Chameleon-Mini/Settings.c b/RevE-light/Firmware/Chameleon-Mini/Settings.c new file mode 100644 index 0000000..22c7183 --- /dev/null +++ b/RevE-light/Firmware/Chameleon-Mini/Settings.c @@ -0,0 +1,101 @@ +#include "Settings.h" +#include +#include "Configuration.h" +#include "Log.h" +#include "Memory.h" +#include "LEDHook.h" + +#define SETTING_TO_INDEX(S) (S - SETTINGS_FIRST) +#define INDEX_TO_SETTING(I) (I + SETTINGS_FIRST) + +SettingsType GlobalSettings; +SettingsType EEMEM StoredSettings = { + .ActiveSettingIdx = SETTING_TO_INDEX(DEFAULT_SETTING), + .ActiveSettingPtr = &GlobalSettings.Settings[SETTING_TO_INDEX(DEFAULT_SETTING)], + + .Settings = { [0 ... (SETTINGS_COUNT-1)] = { + .Configuration = DEFAULT_CONFIGURATION, + .ButtonActions = { + [BUTTON_L_PRESS_SHORT] = DEFAULT_LBUTTON_ACTION, [BUTTON_R_PRESS_SHORT] = DEFAULT_RBUTTON_ACTION, + [BUTTON_L_PRESS_LONG] = DEFAULT_LBUTTON_ACTION, [BUTTON_R_PRESS_LONG] = DEFAULT_RBUTTON_ACTION + }, + .LogMode = DEFAULT_LOG_MODE, + .LEDRedFunction = DEFAULT_RED_LED_ACTION, + .LEDGreenFunction = DEFAULT_GREEN_LED_ACTION + }} +}; + +void SettingsLoad(void) { + eeprom_read_block(&GlobalSettings, &StoredSettings, sizeof(SettingsType)); +} + +void SettingsSave(void) { +#if ENABLE_EEPROM_SETTINGS + eeprom_write_block(&GlobalSettings, &StoredSettings, sizeof(SettingsType)); +#endif +} + + +void SettingsCycle(void) { + uint8_t i = SETTINGS_COUNT; + uint8_t SettingIdx = GlobalSettings.ActiveSettingIdx; + + while (i-- > 0) { + /* Try to set one of the SETTINGS_COUNT following settings. + * But only set if it is not CONFIG_NONE. */ + SettingIdx = (SettingIdx + 1) % SETTINGS_COUNT; + + if (GlobalSettings.Settings[SettingIdx].Configuration != CONFIG_NONE) { + SettingsSetActiveById(INDEX_TO_SETTING(SettingIdx)); + break; + } + } +} + +bool SettingsSetActiveById(uint8_t Setting) { + if ( (Setting >= SETTINGS_FIRST) && (Setting <= SETTINGS_LAST) ) { + uint8_t SettingIdx = SETTING_TO_INDEX(Setting); + + /* Store current memory contents permanently */ + MemoryStore(); + + GlobalSettings.ActiveSettingIdx = SettingIdx; + GlobalSettings.ActiveSettingPtr = + &GlobalSettings.Settings[SettingIdx]; + + /* Settings have changed. Progress changes through system */ + ConfigurationSetById(GlobalSettings.ActiveSettingPtr->Configuration); + LogSetModeById(GlobalSettings.ActiveSettingPtr->LogMode); + + /* Recall new memory contents */ + MemoryRecall(); + + /* Notify LED. blink according to current setting */ + LEDHook(LED_SETTING_CHANGE, LED_BLINK + SettingIdx); + + return true; + } else { + return false; + } +} + +uint8_t SettingsGetActiveById(void) { + return INDEX_TO_SETTING(GlobalSettings.ActiveSettingIdx); +} + +void SettingsGetActiveByName(char* SettingOut, uint16_t BufferSize) { + SettingOut[0] = SettingsGetActiveById() + '0'; + SettingOut[1] = '\0'; +} + +bool SettingsSetActiveByName(const char* Setting) { + uint8_t SettingNr = Setting[0] - '0'; + + if (Setting[1] == '\0') { + LogEntry(LOG_INFO_SETTING_SET, Setting, 1); + return SettingsSetActiveById(SettingNr); + } else { + return false; + } +} + diff --git a/RevE-light/Firmware/Chameleon-Mini/Settings.h b/RevE-light/Firmware/Chameleon-Mini/Settings.h new file mode 100644 index 0000000..1f841fe --- /dev/null +++ b/RevE-light/Firmware/Chameleon-Mini/Settings.h @@ -0,0 +1,47 @@ +/* + * Settings.h + * + * Created on: 21.12.2013 + * Author: skuser + */ + +#ifndef SETTINGS_H_ +#define SETTINGS_H_ + +#include "Button.h" +#include "Configuration.h" +#include "Log.h" +#include "LED.h" +#include "Memory.h" + +#define SETTINGS_COUNT (MEMORY_SIZE / MEMORY_SIZE_PER_SETTING) +#define SETTINGS_FIRST 1 +#define SETTINGS_LAST (SETTINGS_FIRST + SETTINGS_COUNT - 1) + + +typedef struct { + ButtonActionEnum ButtonActions[BUTTON_TYPE_COUNT]; + LogModeEnum LogMode; + ConfigurationEnum Configuration; + LEDHookEnum LEDRedFunction; + LEDHookEnum LEDGreenFunction; +} SettingsEntryType; + +typedef struct { + uint8_t ActiveSettingIdx; + SettingsEntryType* ActiveSettingPtr; + SettingsEntryType Settings[SETTINGS_COUNT]; +} SettingsType; + +extern SettingsType GlobalSettings; + +void SettingsLoad(void); +void SettingsSave(void); + +void SettingsCycle(void); +bool SettingsSetActiveById(uint8_t Setting); +uint8_t SettingsGetActiveById(void); +void SettingsGetActiveByName(char* SettingOut, uint16_t BufferSize); +bool SettingsSetActiveByName(const char* Setting); + +#endif /* SETTINGS_H_ */ diff --git a/RevE-light/Firmware/Chameleon-Mini/System.c b/RevE-light/Firmware/Chameleon-Mini/System.c new file mode 100644 index 0000000..23ba199 --- /dev/null +++ b/RevE-light/Firmware/Chameleon-Mini/System.c @@ -0,0 +1,119 @@ +/* + * System.c + * + * Created on: 10.02.2013 + * Author: skuser + */ + +#include "System.h" +#include "LED.h" +#include + +/* AVR Toolchain 3.4.5 changed defines */ +#ifndef WDT_PER_500CLK_gc +#define WDT_PER_500CLK_gc WDT_PER_512CLK_gc +#endif + + +ISR(BADISR_vect) +{ + while(1); +} + +ISR(RTC_OVF_vect) +{ + SYSTEM_TICK_REGISTER += SYSTEM_TICK_PERIOD; +} + +void SystemInit(void) +{ + if (RST.STATUS & RST_WDRF_bm) { + /* On Watchdog reset clear WDRF bit, disable watchdog + * and jump into bootloader */ + RST.STATUS = RST_WDRF_bm; + + CCP = CCP_IOREG_gc; + WDT.CTRL = WDT_CEN_bm; + + asm volatile ("jmp %0"::"i" (BOOT_SECTION_START + 0x1FC)); + } + + /* 32MHz system clock using internal RC and 32K DFLL*/ + OSC.CTRL |= OSC_RC32MEN_bm | OSC_RC32KEN_bm; + while(!(OSC.STATUS & OSC_RC32MRDY_bm)) + ; + while(!(OSC.STATUS & OSC_RC32KRDY_bm)) + ; + + OSC.DFLLCTRL = OSC_RC32MCREF_RC32K_gc; + DFLLRC32M.CTRL = DFLL_ENABLE_bm; + + CCP = CCP_IOREG_gc; + CLK.CTRL = CLK_SCLKSEL_RC32M_gc; + + /* Use TCE0 as system tick */ + TCE0.PER = F_CPU / 256 / SYSTEM_TICK_FREQ - 1; + TCE0.CTRLA = TC_CLKSEL_DIV256_gc; + + /* Enable RTC with roughly 1kHz clock for system tick + * and to wake up while sleeping. */ + CLK.RTCCTRL = CLK_RTCSRC_ULP_gc | CLK_RTCEN_bm; + RTC.PER = 1000 / SYSTEM_TICK_FREQ - 1; + RTC.COMP = 1000 / SYSTEM_TICK_FREQ - 1; + RTC.CTRL = RTC_PRESCALER_DIV1_gc; + RTC.INTCTRL = RTC_OVFINTLVL_LO_gc; + + + /* Enable EEPROM data memory mapping */ + NVM.CTRLB |= NVM_EEMAPEN_bm; +} + +void SystemReset(void) +{ + CCP = CCP_IOREG_gc; + RST.CTRL = RST_SWRST_bm; + +} + +void SystemEnterBootloader(void) +{ + /* Use Watchdog timer to reset into bootloader. */ + CCP = CCP_IOREG_gc; + WDT.CTRL = WDT_PER_500CLK_gc | WDT_ENABLE_bm | WDT_CEN_bm; +} + + +void SystemStartUSBClock(void) +{ + SystemSleepDisable(); + + /* 48MHz USB Clock using 12MHz XTAL */ + OSC.XOSCCTRL = OSC_FRQRANGE_12TO16_gc | OSC_XOSCSEL_XTAL_16KCLK_gc; + OSC.CTRL |= OSC_XOSCEN_bm; + while(!(OSC.STATUS & OSC_XOSCRDY_bm)) + ; + + OSC.PLLCTRL = OSC_PLLSRC_XOSC_gc | (4 << OSC_PLLFAC_gp); + + OSC.CTRL |= OSC_PLLEN_bm; + while(!(OSC.STATUS & OSC_PLLRDY_bm)) + ; +} + +void SystemStopUSBClock(void) +{ + SystemSleepEnable(); + + /* Disable USB Clock to minimize power consumption */ + CLK.USBCTRL &= ~CLK_USBSEN_bm; + OSC.CTRL &= ~OSC_PLLEN_bm; + OSC.CTRL &= ~OSC_XOSCEN_bm; +} + +void SystemInterruptInit(void) +{ + /* Enable all interrupt levels */ + PMIC.CTRL = PMIC_LOLVLEN_bm | PMIC_MEDLVLEN_bm | PMIC_HILVLEN_bm; + sei(); +} + diff --git a/RevE-light/Firmware/Chameleon-Mini/System.h b/RevE-light/Firmware/Chameleon-Mini/System.h new file mode 100644 index 0000000..65fe539 --- /dev/null +++ b/RevE-light/Firmware/Chameleon-Mini/System.h @@ -0,0 +1,84 @@ +/* + * System.h + * + * Created on: 10.02.2013 + * Author: skuser + */ + +#ifndef SYSTEM_H +#define SYSTEM_H + +#include +#include +#include +#include +#include +#include "Common.h" + +typedef uint16_t SystemRTCType; + +#define F_RTC 1000 +#define SYSTEM_MILLISECONDS_TO_RTC_CYCLES(x) \ + ( (uint16_t) ( (double) F_RTC * x / 1E3 + 0.5) ) + +#define SYSTEM_TICK_WIDTH 7 /* Bits */ +#define SYSTEM_TICK_PERIOD (1<<7) +#define SYSTEM_TICK_FREQ 10 +#define SYSTEM_TICK_MS (1000/SYSTEM_TICK_FREQ) + +#define SYSTEM_SMODE_PSAVE SLEEP_SMODE_PSAVE_gc +#define SYSTEM_SMODE_IDLE SLEEP_SMODE_IDLE_gc + +/* Use GPIORE and GPIORF as global tick register */ +#define SYSTEM_TICK_REGISTER (*((volatile uint16_t*) &GPIORE)) + +void SystemInit(void); +void SystemReset(void); +void SystemEnterBootloader(void); +void SystemStartUSBClock(void); +void SystemStopUSBClock(void); +void SystemInterruptInit(void); +INLINE bool SystemTick100ms(void); +INLINE void SystemSleep(void); +INLINE void SystemSleepEnable(void); +INLINE void SystemSleepDisable(void); +INLINE void SystemSleepSetMode(uint8_t SleepMode); + +INLINE bool SystemTick100ms(void) +{ + if (RTC.INTFLAGS & RTC_COMPIF_bm) { + while(RTC.STATUS & RTC_SYNCBUSY_bm) + ; + + RTC.INTFLAGS = RTC_COMPIF_bm; + return true; + } + + return false; +} + +INLINE uint16_t SystemGetSysTick(void) { + return SYSTEM_TICK_REGISTER | RTC.CNT; +} + +INLINE void SystemSleep(void) +{ + asm volatile("sleep"); +} + +INLINE void SystemSleepEnable(void) +{ + SLEEP.CTRL |= SLEEP_SEN_bm; +} + +INLINE void SystemSleepDisable(void) +{ + SLEEP.CTRL &= ~SLEEP_SEN_bm; +} + +INLINE void SystemSleepSetMode(uint8_t SleepMode) +{ + SLEEP.CTRL = (SLEEP.CTRL & ~SLEEP_SMODE_gm) | SleepMode; +} + +#endif /* SYSTEM_H */ diff --git a/RevE-light/Firmware/Chameleon-Mini/Terminal/CommandLine.c b/RevE-light/Firmware/Chameleon-Mini/Terminal/CommandLine.c new file mode 100644 index 0000000..e7ad8ca --- /dev/null +++ b/RevE-light/Firmware/Chameleon-Mini/Terminal/CommandLine.c @@ -0,0 +1,412 @@ +/* + * CommandLine.c + * + * Created on: 04.05.2013 + * Author: skuser + */ + +#include "CommandLine.h" + +#define CHAR_GET_MODE '?' /* ? */ +#define CHAR_SET_MODE '=' /* = */ +#define CHAR_EXEC_MODE '\0' /* */ +#define CHAR_EXEC_MODE_PARAM ' ' /* ... */ + +#define IS_COMMAND_DELIMITER(c) ( \ + ((c) == CHAR_EXEC_MODE) || ((c) == CHAR_GET_MODE) || ((c) == CHAR_SET_MODE) || ((c) == CHAR_EXEC_MODE_PARAM) \ +) + +#define IS_CHARACTER(c) ( \ + ( ((c) >= 'A') && ((c) <= 'Z') ) || \ + ( ((c) >= 'a') && ((c) <= 'z') ) || \ + ( ((c) >= '0') && ((c) <= '9') ) || \ + ( ((c) == '_') ) || \ + ( ((c) == CHAR_GET_MODE) || ((c) == CHAR_SET_MODE) || ((c) == CHAR_EXEC_MODE_PARAM) ) \ +) + +#define IS_LOWERCASE(c) ( ((c) >= 'a') && ((c) <= 'z') ) +#define TO_UPPERCASE(c) ( (c) - 'a' + 'A' ) + +#define IS_WHITESPACE(c) ( ((c) == ' ') || ((c) == '\t') ) + +#define NO_FUNCTION ((void*) 0) + +#define STATUS_MESSAGE_TRAILER "\r\n" +#define OPTIONAL_ANSWER_TRAILER "\r\n" + +/* Include all command functions */ +#include "Commands.h" + +const PROGMEM CommandEntryType CommandTable[] = { + { + .Command = COMMAND_VERSION, + .ExecFunc = NO_FUNCTION, + .ExecParamFunc = NO_FUNCTION, + .SetFunc = NO_FUNCTION, + .GetFunc = CommandGetVersion, + }, + { + .Command = COMMAND_CONFIG, + .ExecFunc = NO_FUNCTION, + .ExecParamFunc = NO_FUNCTION, + .SetFunc = CommandSetConfig, + .GetFunc = CommandGetConfig + }, + { + .Command = COMMAND_UID, + .ExecFunc = NO_FUNCTION, + .ExecParamFunc = NO_FUNCTION, + .SetFunc = CommandSetUid, + .GetFunc = CommandGetUid + }, + { + .Command = COMMAND_READONLY, + .ExecFunc = NO_FUNCTION, + .ExecParamFunc = NO_FUNCTION, + .GetFunc = CommandGetReadOnly, + .SetFunc = CommandSetReadOnly + + }, + { + .Command = COMMAND_UPLOAD, + .ExecFunc = CommandExecUpload, + .ExecParamFunc = NO_FUNCTION, + .SetFunc = NO_FUNCTION, + .GetFunc = NO_FUNCTION + }, + { + .Command = COMMAND_DOWNLOAD, + .ExecFunc = CommandExecDownload, + .ExecParamFunc = NO_FUNCTION, + .SetFunc = NO_FUNCTION, + .GetFunc = NO_FUNCTION + }, + { + .Command = COMMAND_RESET, + .ExecFunc = CommandExecReset, + .ExecParamFunc = NO_FUNCTION, + .SetFunc = NO_FUNCTION, + .GetFunc = NO_FUNCTION + }, +#ifdef SUPPORT_FIRMWARE_UPGRADE + { + .Command = COMMAND_UPGRADE, + .ExecFunc = CommandExecUpgrade, + .ExecParamFunc = NO_FUNCTION, + .SetFunc = NO_FUNCTION, + .GetFunc = NO_FUNCTION + }, +#endif + { + .Command = COMMAND_MEMSIZE, + .ExecFunc = NO_FUNCTION, + .ExecParamFunc = NO_FUNCTION, + .SetFunc = NO_FUNCTION, + .GetFunc = CommandGetMemSize + }, + { + .Command = COMMAND_UIDSIZE, + .ExecFunc = NO_FUNCTION, + .ExecParamFunc = NO_FUNCTION, + .SetFunc = NO_FUNCTION, + .GetFunc = CommandGetUidSize + }, + { + .Command = COMMAND_RBUTTON, + .ExecFunc = NO_FUNCTION, + .ExecParamFunc = NO_FUNCTION, + .SetFunc = CommandSetRButton, + .GetFunc = CommandGetRButton + }, + { + .Command = COMMAND_RBUTTON_LONG, + .ExecFunc = NO_FUNCTION, + .ExecParamFunc = NO_FUNCTION, + .SetFunc = CommandSetRButtonLong, + .GetFunc = CommandGetRButtonLong + }, + { + .Command = COMMAND_LBUTTON, + .ExecFunc = NO_FUNCTION, + .ExecParamFunc = NO_FUNCTION, + .SetFunc = CommandSetLButton, + .GetFunc = CommandGetLButton + }, + { + .Command = COMMAND_LBUTTON_LONG, + .ExecFunc = NO_FUNCTION, + .ExecParamFunc = NO_FUNCTION, + .SetFunc = CommandSetLButtonLong, + .GetFunc = CommandGetLButtonLong + }, + { + .Command = COMMAND_LEDGREEN, + .ExecFunc = NO_FUNCTION, + .ExecParamFunc = NO_FUNCTION, + .SetFunc = CommandSetLedGreen, + .GetFunc = CommandGetLedGreen + }, + { + .Command = COMMAND_LEDRED, + .ExecFunc = NO_FUNCTION, + .ExecParamFunc = NO_FUNCTION, + .SetFunc = CommandSetLedRed, + .GetFunc = CommandGetLedRed + }, + { + .Command = COMMAND_LOGMODE, + .ExecFunc = NO_FUNCTION, + .ExecParamFunc = NO_FUNCTION, + .SetFunc = CommandSetLogMode, + .GetFunc = CommandGetLogMode + }, + { + .Command = COMMAND_LOGMEM, + .ExecFunc = NO_FUNCTION, + .ExecParamFunc = NO_FUNCTION, + .SetFunc = NO_FUNCTION, + .GetFunc = CommandGetLogMem + }, + { + .Command = COMMAND_LOGDOWNLOAD, + .ExecFunc = CommandExecLogDownload, + .ExecParamFunc = NO_FUNCTION, + .SetFunc = NO_FUNCTION, + .GetFunc = NO_FUNCTION + }, + { + .Command = COMMAND_LOGCLEAR, + .ExecFunc = CommandExecLogClear, + .ExecParamFunc = NO_FUNCTION, + .SetFunc = NO_FUNCTION, + .GetFunc = NO_FUNCTION + }, + { + .Command = COMMAND_SETTING, + .ExecFunc = NO_FUNCTION, + .ExecParamFunc = NO_FUNCTION, + .SetFunc = CommandSetSetting, + .GetFunc = CommandGetSetting + }, + { + .Command = COMMAND_CLEAR, + .ExecFunc = CommandExecClear, + .ExecParamFunc = NO_FUNCTION, + .SetFunc = NO_FUNCTION, + .GetFunc = NO_FUNCTION + }, + { + .Command = COMMAND_STORE, + .ExecFunc = CommandExecStore, + .ExecParamFunc = NO_FUNCTION, + .SetFunc = NO_FUNCTION, + .GetFunc = NO_FUNCTION + }, + { + .Command = COMMAND_RECALL, + .ExecFunc = CommandExecRecall, + .ExecParamFunc = NO_FUNCTION, + .SetFunc = NO_FUNCTION, + .GetFunc = NO_FUNCTION + }, + { + .Command = COMMAND_CHARGING, + .ExecFunc = NO_FUNCTION, + .ExecParamFunc = NO_FUNCTION, + .SetFunc = NO_FUNCTION, + .GetFunc = CommandGetCharging + }, + { + .Command = COMMAND_HELP, + .ExecFunc = CommandExecHelp, + .ExecParamFunc = NO_FUNCTION, + .SetFunc = NO_FUNCTION, + .GetFunc = NO_FUNCTION + }, + { + .Command = COMMAND_RSSI, + .ExecFunc = NO_FUNCTION, + .ExecParamFunc = NO_FUNCTION, + .SetFunc = NO_FUNCTION, + .GetFunc = CommandGetRssi + }, + { + .Command = COMMAND_SYSTICK, + .ExecFunc = NO_FUNCTION, + .ExecParamFunc = NO_FUNCTION, + .SetFunc = NO_FUNCTION, + .GetFunc = CommandGetSysTick + }, + { /* This has to be last element */ + .Command = COMMAND_LIST_END, + .ExecFunc = NO_FUNCTION, + .ExecParamFunc = NO_FUNCTION, + .SetFunc = NO_FUNCTION, + .GetFunc = NO_FUNCTION + } +}; + +#define STATUS_TABLE_ENTRY(Id, Text) \ + { Id, STRINGIFY(Id) ":" Text } + +typedef struct { + CommandStatusIdType Id; + CommandStatusMessageType Message; +} CommandStatusType; + +static const CommandStatusType PROGMEM StatusTable[] = { + STATUS_TABLE_ENTRY(COMMAND_INFO_OK_ID, COMMAND_INFO_OK), + STATUS_TABLE_ENTRY(COMMAND_INFO_OK_WITH_TEXT_ID, COMMAND_INFO_OK_WITH_TEXT), + STATUS_TABLE_ENTRY(COMMAND_INFO_XMODEM_WAIT_ID, COMMAND_INFO_XMODEM_WAIT), + STATUS_TABLE_ENTRY(COMMAND_ERR_UNKNOWN_CMD_ID, COMMAND_ERR_UNKNOWN_CMD), + STATUS_TABLE_ENTRY(COMMAND_ERR_INVALID_USAGE_ID, COMMAND_ERR_INVALID_USAGE), + STATUS_TABLE_ENTRY(COMMAND_ERR_INVALID_PARAM_ID, COMMAND_ERR_INVALID_PARAM), + STATUS_TABLE_ENTRY(COMMAND_INFO_FALSE_ID, COMMAND_INFO_FALSE), + STATUS_TABLE_ENTRY(COMMAND_INFO_TRUE_ID, COMMAND_INFO_TRUE), +}; + +static uint16_t BufferIdx; + +static const char* GetStatusMessageP(CommandStatusIdType StatusId) +{ + uint8_t i; + + for (i=0; i<(sizeof(StatusTable)/sizeof(*StatusTable)); i++) { + if (pgm_read_byte(&StatusTable[i].Id) == StatusId) + return StatusTable[i].Message; + } + + return (void*) 0; +} + +static CommandStatusIdType CallCommandFunc( + const CommandEntryType* CommandEntry, char CommandDelimiter, char* pParam) { + char* pTerminalBuffer = (char*) TerminalBuffer; + + /* Call appropriate function depending on CommandDelimiter */ + if (CommandDelimiter == CHAR_GET_MODE) { + CommandGetFuncType GetFunc = pgm_read_ptr(&CommandEntry->GetFunc); + if (GetFunc != NO_FUNCTION) { + return GetFunc(pTerminalBuffer); + } + } else if (CommandDelimiter == CHAR_SET_MODE) { + CommandSetFuncType SetFunc = pgm_read_ptr(&CommandEntry->SetFunc); + if (SetFunc != NO_FUNCTION) { + return SetFunc(pTerminalBuffer, pParam); + } + } else if (CommandDelimiter == CHAR_EXEC_MODE) { + CommandExecFuncType ExecFunc = pgm_read_ptr(&CommandEntry->ExecFunc); + if (ExecFunc != NO_FUNCTION) { + return ExecFunc(pTerminalBuffer); + } + } else if (CommandDelimiter == CHAR_EXEC_MODE_PARAM) { + CommandExecParamFuncType ExecParamFunc = pgm_read_ptr(&CommandEntry->ExecParamFunc); + if (ExecParamFunc != NO_FUNCTION) { + return ExecParamFunc(pTerminalBuffer, pParam); + } + } else { + /* This should not happen (TM) */ + } + + /* This delimiter has not been registered with this command */ + return COMMAND_ERR_INVALID_USAGE_ID; +} + +static void DecodeCommand(void) +{ + uint8_t i; + bool CommandFound = false; + CommandStatusIdType StatusId = COMMAND_ERR_UNKNOWN_CMD_ID; + char* pTerminalBuffer = (char*) TerminalBuffer; + + /* Do some sanity check first */ + if (!IS_COMMAND_DELIMITER(pTerminalBuffer[0])) { + char* pCommandDelimiter = pTerminalBuffer; + char CommandDelimiter = '\0'; + + /* Search for command delimiter, store it and replace with '\0' */ + while(!(IS_COMMAND_DELIMITER(*pCommandDelimiter))) + pCommandDelimiter++; + + CommandDelimiter = *pCommandDelimiter; + *pCommandDelimiter = '\0'; + + /* Search in command table */ + for (i=0; i<(sizeof(CommandTable) / sizeof(*CommandTable)); i++) { + if (strcmp_P(pTerminalBuffer, CommandTable[i].Command) == 0) { + /* Command found. Clear buffer, and call appropriate function */ + char* pParam = ++pCommandDelimiter; + + pTerminalBuffer[0] = '\0'; + CommandFound = true; + + StatusId = CallCommandFunc(&CommandTable[i], CommandDelimiter, pParam); + + break; + } + } + } + + /* Send command status message */ + TerminalSendStringP(GetStatusMessageP(StatusId)); + TerminalSendStringP(PSTR(STATUS_MESSAGE_TRAILER)); + + if (CommandFound && (pTerminalBuffer[0] != '\0') ) { + /* Send optional answer */ + TerminalSendString(pTerminalBuffer); + TerminalSendStringP(PSTR(OPTIONAL_ANSWER_TRAILER)); + } +} + +void CommandLineInit(void) +{ + BufferIdx = 0; +} + +bool CommandLineProcessByte(uint8_t Byte) { + if (IS_CHARACTER(Byte)) { + /* Store uppercase character */ + if (IS_LOWERCASE(Byte)) { + Byte = TO_UPPERCASE(Byte); + } + + /* Prevent buffer overflow and account for '\0' */ + if (BufferIdx + < (sizeof(TerminalBuffer) / sizeof(*TerminalBuffer) - 1)) { + TerminalBuffer[BufferIdx++] = Byte; + } + } else if (Byte == '\r') { + /* Process on \r. Terminate string and decode. */ + TerminalBuffer[BufferIdx] = '\0'; + BufferIdx = 0; + + DecodeCommand(); + } else if (Byte == '\b') { + /* Backspace. Delete last character in buffer. */ + if (BufferIdx > 0) { + BufferIdx--; + } + } else if (Byte == 0x1B) { + /* Drop buffer on escape */ + BufferIdx = 0; + } else { + /* Ignore other chars */ + } + + return true; +} + +void CommandLineTick(void) +{ + +} + +void CommandLineAppendData(void* Buffer, uint16_t Bytes) +{ + char* pTerminalBuffer = (char*) TerminalBuffer; + + BufferToHexString(pTerminalBuffer, sizeof(TerminalBuffer), Buffer, Bytes); + + TerminalSendString(pTerminalBuffer); + TerminalSendStringP(PSTR(OPTIONAL_ANSWER_TRAILER)); +} diff --git a/RevE-light/Firmware/Chameleon-Mini/Terminal/CommandLine.h b/RevE-light/Firmware/Chameleon-Mini/Terminal/CommandLine.h new file mode 100644 index 0000000..bb6b627 --- /dev/null +++ b/RevE-light/Firmware/Chameleon-Mini/Terminal/CommandLine.h @@ -0,0 +1,19 @@ +/* + * CommandLine.h + * + * Created on: 04.05.2013 + * Author: skuser + */ + +#ifndef COMMANDLINE_H_ +#define COMMANDLINE_H_ + +#include "Terminal.h" + +void CommandLineInit(void); +bool CommandLineProcessByte(uint8_t Byte); +void CommandLineTick(void); + +void CommandLineAppendData(void* Buffer, uint16_t Bytes); + +#endif /* COMMANDLINE_H_ */ diff --git a/RevE-light/Firmware/Chameleon-Mini/Terminal/Commands.c b/RevE-light/Firmware/Chameleon-Mini/Terminal/Commands.c new file mode 100644 index 0000000..e693991 --- /dev/null +++ b/RevE-light/Firmware/Chameleon-Mini/Terminal/Commands.c @@ -0,0 +1,418 @@ + +#include "Commands.h" +#include +#include +#include "XModem.h" +#include "../Settings.h" +#include "../Chameleon-Mini.h" +#include "../LUFA/Version.h" +#include "../Configuration.h" +#include "../Random.h" +#include "../Memory.h" +#include "../System.h" +#include "../Button.h" +#include "../AntennaLevel.h" +#include "../Battery.h" + +extern const PROGMEM CommandEntryType CommandTable[]; + +CommandStatusIdType CommandGetVersion(char* OutParam) +{ + snprintf_P(OutParam, TERMINAL_BUFFER_SIZE, PSTR( + "Chameleon-Mini %S using LUFA %S compiled with AVR-GCC %S" + ), PSTR(CHAMELEON_MINI_VERSION_STRING), PSTR(LUFA_VERSION_STRING), PSTR(__VERSION__) + ); + + return COMMAND_INFO_OK_WITH_TEXT_ID; +} + +CommandStatusIdType CommandGetConfig(char* OutParam) +{ + ConfigurationGetByName(OutParam, TERMINAL_BUFFER_SIZE); + + return COMMAND_INFO_OK_WITH_TEXT_ID; +} + +CommandStatusIdType CommandSetConfig(char* OutMessage, const char* InParam) +{ + if (COMMAND_IS_SUGGEST_STRING(InParam)) { + ConfigurationGetList(OutMessage, TERMINAL_BUFFER_SIZE); + return COMMAND_INFO_OK_WITH_TEXT_ID; + } else if (ConfigurationSetByName(InParam)) { + SettingsSave(); + return COMMAND_INFO_OK_ID; + } else { + return COMMAND_ERR_INVALID_PARAM_ID; + } +} + +CommandStatusIdType CommandGetUid(char* OutParam) +{ + uint8_t UidBuffer[COMMAND_UID_BUFSIZE]; + uint16_t UidSize = ActiveConfiguration.UidSize; + + ApplicationGetUid(UidBuffer); + + BufferToHexString(OutParam, TERMINAL_BUFFER_SIZE, + UidBuffer, UidSize); + + return COMMAND_INFO_OK_WITH_TEXT_ID; +} + +CommandStatusIdType CommandSetUid(char* OutMessage, const char* InParam) +{ + uint8_t UidBuffer[COMMAND_UID_BUFSIZE]; + uint16_t UidSize = ActiveConfiguration.UidSize; + + if (strcmp_P(InParam, PSTR(COMMAND_UID_RANDOM)) == 0) { + /* Load with random bytes */ + for (uint8_t i=0; iCommand) != 0) { + const char* CommandName = EntryPtr->Command; + char c; + + while( (c = pgm_read_byte(CommandName)) != '\0' && ByteCount > 32) { + *OutMessage++ = c; + CommandName++; + ByteCount--; + } + + *OutMessage++ = ','; + ByteCount--; + + EntryPtr++; + } + + *--OutMessage = '\0'; + + return COMMAND_INFO_OK_WITH_TEXT_ID; +} + +CommandStatusIdType CommandGetRssi(char* OutParam) +{ + snprintf_P(OutParam, TERMINAL_BUFFER_SIZE, + PSTR("%5u mV"), AntennaLevelGet()); + + return COMMAND_INFO_OK_WITH_TEXT_ID; +} + +CommandStatusIdType CommandGetSysTick(char* OutParam) +{ + snprintf_P(OutParam, TERMINAL_BUFFER_SIZE, PSTR("%4.4X"), SystemGetSysTick()); + + return COMMAND_INFO_OK_WITH_TEXT_ID; +} + diff --git a/RevE-light/Firmware/Chameleon-Mini/Terminal/Commands.h b/RevE-light/Firmware/Chameleon-Mini/Terminal/Commands.h new file mode 100644 index 0000000..a481130 --- /dev/null +++ b/RevE-light/Firmware/Chameleon-Mini/Terminal/Commands.h @@ -0,0 +1,154 @@ + + +#ifndef COMMANDS_H_ +#define COMMANDS_H_ + +#include "../Common.h" + +#define MAX_COMMAND_LENGTH 16 +#define MAX_STATUS_LENGTH 32 + + +#define COMMAND_INFO_OK_ID 100 +#define COMMAND_INFO_OK "OK" +#define COMMAND_INFO_OK_WITH_TEXT_ID 101 +#define COMMAND_INFO_OK_WITH_TEXT "OK WITH TEXT" +#define COMMAND_INFO_XMODEM_WAIT_ID 110 +#define COMMAND_INFO_XMODEM_WAIT "WAITING FOR XMODEM" +#define COMMAND_INFO_FALSE_ID 120 +#define COMMAND_INFO_FALSE "FALSE" +#define COMMAND_INFO_TRUE_ID 121 +#define COMMAND_INFO_TRUE "TRUE" +#define COMMAND_ERR_UNKNOWN_CMD_ID 200 +#define COMMAND_ERR_UNKNOWN_CMD "UNKNOWN COMMAND" +#define COMMAND_ERR_INVALID_USAGE_ID 201 +#define COMMAND_ERR_INVALID_USAGE "INVALID COMMAND USAGE" +#define COMMAND_ERR_INVALID_PARAM_ID 202 +#define COMMAND_ERR_INVALID_PARAM "INVALID PARAMETER" + + +#define COMMAND_CHAR_TRUE '1' +#define COMMAND_CHAR_FALSE '0' +#define COMMAND_CHAR_SUGGEST '?' /* =? for help */ + +#define COMMAND_UID_BUFSIZE 32 + +#define COMMAND_IS_SUGGEST_STRING(x) ( ((x)[0] == COMMAND_CHAR_SUGGEST) && ((x)[1] == '\0') ) + +typedef uint8_t CommandStatusIdType; +typedef const char CommandStatusMessageType[MAX_STATUS_LENGTH]; + +typedef CommandStatusIdType (*CommandExecFuncType) (char* OutMessage); +typedef CommandStatusIdType (*CommandExecParamFuncType) (char* OutMessage, const char* InParams); +typedef CommandStatusIdType (*CommandSetFuncType) (char* OutMessage, const char* InParam); +typedef CommandStatusIdType (*CommandGetFuncType) (char* OutParam); + +typedef struct { + char Command[MAX_COMMAND_LENGTH]; + CommandExecFuncType ExecFunc; + CommandExecParamFuncType ExecParamFunc; + CommandSetFuncType SetFunc; + CommandGetFuncType GetFunc; +} CommandEntryType; + +#define COMMAND_VERSION "VERSION" +CommandStatusIdType CommandGetVersion(char* OutParam); + +#define COMMAND_CONFIG "CONFIG" +CommandStatusIdType CommandGetConfig(char* OutParam); +CommandStatusIdType CommandSetConfig(char* OutMessage, const char* InParam); + +#define COMMAND_UID "UID" +#define COMMAND_UID_RANDOM "RANDOM" +CommandStatusIdType CommandGetUid(char* OutParam); +CommandStatusIdType CommandSetUid(char* OutMessage, const char* InParam); + +#define COMMAND_READONLY "READONLY" +CommandStatusIdType CommandGetReadOnly(char* OutParam); +CommandStatusIdType CommandSetReadOnly(char* OutMessage, const char* InParam); + +#define COMMAND_UPLOAD "UPLOAD" +CommandStatusIdType CommandExecUpload(char* OutMessage); + +#define COMMAND_DOWNLOAD "DOWNLOAD" +CommandStatusIdType CommandExecDownload(char* OutMessage); + +#define COMMAND_RESET "RESET" +CommandStatusIdType CommandExecReset(char* OutMessage); + +#define COMMAND_UPGRADE "UPGRADE" +CommandStatusIdType CommandExecUpgrade(char* OutMessage); + +#define COMMAND_MEMSIZE "MEMSIZE" +CommandStatusIdType CommandGetMemSize(char* OutParam); + +#define COMMAND_UIDSIZE "UIDSIZE" +CommandStatusIdType CommandGetUidSize(char* OutParam); + +#define COMMAND_RBUTTON "RBUTTON" +CommandStatusIdType CommandGetRButton(char* OutParam); +CommandStatusIdType CommandSetRButton(char* OutMessage, const char* InParam); + +#define COMMAND_RBUTTON_LONG "RBUTTON_LONG" +CommandStatusIdType CommandGetRButtonLong(char* OutParam); +CommandStatusIdType CommandSetRButtonLong(char* OutMessage, const char* InParam); + +#define COMMAND_LBUTTON "LBUTTON" +CommandStatusIdType CommandGetLButton(char* OutParam); +CommandStatusIdType CommandSetLButton(char* OutMessage, const char* InParam); + +#define COMMAND_LBUTTON_LONG "LBUTTON_LONG" +CommandStatusIdType CommandGetLButtonLong(char* OutParam); +CommandStatusIdType CommandSetLButtonLong(char* OutMessage, const char* InParam); + + +#define COMMAND_LEDGREEN "LEDGREEN" +CommandStatusIdType CommandGetLedGreen(char* OutParam); +CommandStatusIdType CommandSetLedGreen(char* OutMessage, const char* InParam); + +#define COMMAND_LEDRED "LEDRED" +CommandStatusIdType CommandGetLedRed(char* OutParam); +CommandStatusIdType CommandSetLedRed(char* OutMessage, const char* InParam); + +#define COMMAND_LOGMODE "LOGMODE" +CommandStatusIdType CommandGetLogMode(char* OutParam); +CommandStatusIdType CommandSetLogMode(char* OutMessage, const char* InParam); + +#define COMMAND_LOGMEM "LOGMEM" +CommandStatusIdType CommandGetLogMem(char* OutParam); + +#define COMMAND_LOGDOWNLOAD "LOGDOWNLOAD" +CommandStatusIdType CommandExecLogDownload(char* OutMessage); + +#define COMMAND_LOGCLEAR "LOGCLEAR" +CommandStatusIdType CommandExecLogClear(char* OutMessage); + +#define COMMAND_SETTING "SETTING" +CommandStatusIdType CommandGetSetting(char* OutParam); +CommandStatusIdType CommandSetSetting(char* OutMessage, const char* InParam); + +#define COMMAND_CLEAR "CLEAR" +CommandStatusIdType CommandExecClear(char* OutMessage); + +#define COMMAND_STORE "STORE" +CommandStatusIdType CommandExecStore(char* OutMessage); + +#define COMMAND_RECALL "RECALL" +CommandStatusIdType CommandExecRecall(char* OutMessage); + +#define COMMAND_CHARGING "CHARGING" +CommandStatusIdType CommandGetCharging(char* OutParam); + +#define COMMAND_HELP "HELP" +CommandStatusIdType CommandExecHelp(char* OutMessage); + +#define COMMAND_RSSI "RSSI" +CommandStatusIdType CommandGetRssi(char* OutParam); + +#define COMMAND_SYSTICK "SYSTICK" +CommandStatusIdType CommandGetSysTick(char* OutParam); + +#define COMMAND_LIST_END "" +/* Defines the end of command list. This is no actual command */ + +#endif /* COMMANDS_H_ */ diff --git a/RevE-light/Firmware/Chameleon-Mini/Terminal/Terminal.c b/RevE-light/Firmware/Chameleon-Mini/Terminal/Terminal.c new file mode 100644 index 0000000..6867047 --- /dev/null +++ b/RevE-light/Firmware/Chameleon-Mini/Terminal/Terminal.c @@ -0,0 +1,170 @@ + +#include "Terminal.h" +#include "../System.h" +#include "../LEDHook.h" + +#include "../LUFADescriptors.h" + +#define INIT_DELAY (2000 / SYSTEM_TICK_MS) + + +USB_ClassInfo_CDC_Device_t TerminalHandle = { + .Config = { + .ControlInterfaceNumber = 0, + .DataINEndpoint = { + .Address = CDC_TX_EPADDR, + .Size = CDC_TXRX_EPSIZE, + .Banks = 1, + }, .DataOUTEndpoint = { + .Address = CDC_RX_EPADDR, + .Size = CDC_TXRX_EPSIZE, + .Banks = 1, + }, .NotificationEndpoint = { + .Address = CDC_NOTIFICATION_EPADDR, + .Size = CDC_NOTIFICATION_EPSIZE, + .Banks = 1, + }, + } +}; + +uint8_t TerminalBuffer[TERMINAL_BUFFER_SIZE]; +TerminalStateEnum TerminalState = TERMINAL_UNINITIALIZED; +static uint8_t TerminalInitDelay = INIT_DELAY; + +void TerminalSendString(const char* s) { + CDC_Device_SendString(&TerminalHandle, s); +} + +void TerminalSendStringP(const char* s) { + char c; + + while( (c = pgm_read_byte(s++)) != '\0' ) { + TerminalSendChar(c); + } +} + +/* +void TerminalSendHex(void* Buffer, uint16_t ByteCount) +{ + char* pTerminalBuffer = (char*) TerminalBuffer; + + BufferToHexString(pTerminalBuffer, sizeof(TerminalBuffer), Buffer, ByteCount); + + TerminalSendString(pTerminalBuffer); +} + +*/ + + +void TerminalSendBlock(const void* Buffer, uint16_t ByteCount) +{ + CDC_Device_SendData(&TerminalHandle, Buffer, ByteCount); +} + + +static void ProcessByte(void) { + int16_t Byte = CDC_Device_ReceiveByte(&TerminalHandle); + + if (Byte >= 0) { + /* Byte received */ + LEDHook(LED_TERMINAL_RXTX, LED_PULSE); + + if (XModemProcessByte(Byte)) { + /* XModem handled the byte */ + } else if (CommandLineProcessByte(Byte)) { + /* CommandLine handled the byte */ + } + } +} + +static void SenseVBus(void) +{ + switch(TerminalState) { + case TERMINAL_UNINITIALIZED: + if (TERMINAL_VBUS_PORT.IN & TERMINAL_VBUS_MASK) { + /* Not initialized and VBUS sense high */ + TerminalInitDelay = INIT_DELAY; + TerminalState = TERMINAL_INITIALIZING; + } + break; + + case TERMINAL_INITIALIZING: + if (--TerminalInitDelay == 0) { + SystemStartUSBClock(); + USB_Init(); + TerminalState = TERMINAL_INITIALIZED; + } + break; + + case TERMINAL_INITIALIZED: + if (!(TERMINAL_VBUS_PORT.IN & TERMINAL_VBUS_MASK)) { + /* Initialized and VBUS sense low */ + TerminalInitDelay = INIT_DELAY; + TerminalState = TERMINAL_UNITIALIZING; + } + break; + + case TERMINAL_UNITIALIZING: + if (--TerminalInitDelay == 0) { + USB_Disable(); + SystemStopUSBClock(); + TerminalState = TERMINAL_UNINITIALIZED; + } + break; + + default: + break; + } +} + +void TerminalInit(void) +{ + TERMINAL_VBUS_PORT.DIRCLR = TERMINAL_VBUS_MASK; +} + +void TerminalTask(void) +{ + if (TerminalState == TERMINAL_INITIALIZED) { + CDC_Device_USBTask(&TerminalHandle); + USB_USBTask(); + + ProcessByte(); + } +} + +void TerminalTick(void) +{ + SenseVBus(); + + if (TerminalState == TERMINAL_INITIALIZED) { + XModemTick(); + CommandLineTick(); + } +} + +/** Event handler for the library USB Connection event. */ +void EVENT_USB_Device_Connect(void) +{ + LEDHook(LED_TERMINAL_CONN, LED_ON); +} + +/** Event handler for the library USB Disconnection event. */ +void EVENT_USB_Device_Disconnect(void) +{ + LEDHook(LED_TERMINAL_CONN, LED_OFF); +} + + +/** Event handler for the library USB Configuration Changed event. */ +void EVENT_USB_Device_ConfigurationChanged(void) +{ + CDC_Device_ConfigureEndpoints(&TerminalHandle); +} + +/** Event handler for the library USB Control Request reception event. */ +void EVENT_USB_Device_ControlRequest(void) +{ + CDC_Device_ProcessControlRequest(&TerminalHandle); +} + + diff --git a/RevE-light/Firmware/Chameleon-Mini/Terminal/Terminal.h b/RevE-light/Firmware/Chameleon-Mini/Terminal/Terminal.h new file mode 100644 index 0000000..aea0c1c --- /dev/null +++ b/RevE-light/Firmware/Chameleon-Mini/Terminal/Terminal.h @@ -0,0 +1,52 @@ +/* + * CommandLine.h + * + * Created on: 10.02.2013 + * Author: skuser + */ + +#ifndef TERMINAL_H_ +#define TERMINAL_H_ + +#include "../Common.h" +#include +#include "XModem.h" +#include "CommandLine.h" + +#define TERMINAL_VBUS_PORT PORTD +#define TERMINAL_VBUS_MASK PIN5_bm + +#define TERMINAL_BUFFER_SIZE 256 + +typedef enum { + TERMINAL_UNINITIALIZED, + TERMINAL_INITIALIZING, + TERMINAL_INITIALIZED, + TERMINAL_UNITIALIZING +} TerminalStateEnum; + +extern uint8_t TerminalBuffer[TERMINAL_BUFFER_SIZE]; +extern USB_ClassInfo_CDC_Device_t TerminalHandle; +extern TerminalStateEnum TerminalState; + +void TerminalInit(void); +void TerminalTask(void); +void TerminalTick(void); + +/*void TerminalSendHex(void* Buffer, uint16_t ByteCount);*/ +INLINE void TerminalSendByte(uint8_t Byte); +void TerminalSendBlock(const void* Buffer, uint16_t ByteCount); + +INLINE void TerminalSendChar(char c); +void TerminalSendString(const char* s); +void TerminalSendStringP(const char* s); + +void EVENT_USB_Device_Connect(void); +void EVENT_USB_Device_Disconnect(void); +void EVENT_USB_Device_ConfigurationChanged(void); +void EVENT_USB_Device_ControlRequest(void); + +INLINE void TerminalSendChar(char c) { CDC_Device_SendByte(&TerminalHandle, c); } +INLINE void TerminalSendByte(uint8_t Byte) { CDC_Device_SendByte(&TerminalHandle, Byte); } + +#endif /* TERMINAL_H_ */ diff --git a/RevE-light/Firmware/Chameleon-Mini/Terminal/XModem.c b/RevE-light/Firmware/Chameleon-Mini/Terminal/XModem.c new file mode 100644 index 0000000..6ea379f --- /dev/null +++ b/RevE-light/Firmware/Chameleon-Mini/Terminal/XModem.c @@ -0,0 +1,248 @@ +#include "XModem.h" +#include "Terminal.h" + +#define BYTE_NAK 0x15 +#define BYTE_SOH 0x01 +#define BYTE_ACK 0x06 +#define BYTE_CAN 0x18 +#define BYTE_EOF 0x1A +#define BYTE_EOT 0x04 +#define BYTE_ESC 0x1B + +#define XMODEM_BLOCK_SIZE 128 + +#define RECV_INIT_TIMEOUT 5 /* #Ticks between sending of NAKs to the sender */ +#define RECV_INIT_COUNT 60 /* #Timeouts until receive failure */ +#define SEND_INIT_TIMEOUT 300 /* #Ticks waiting for NAKs from the receiver before failure */ + +#define FIRST_FRAME_NUMBER 1 +#define CHECKSUM_INIT_VALUE 0 + +static enum { + STATE_OFF, + STATE_RECEIVE_INIT, + STATE_RECEIVE_WAIT, + STATE_RECEIVE_FRAMENUM1, + STATE_RECEIVE_FRAMENUM2, + STATE_RECEIVE_DATA, + STATE_RECEIVE_PROCESS, + STATE_SEND_INIT, + STATE_SEND_WAIT, + STATE_SEND_EOT +} State = STATE_OFF; + +static uint8_t CurrentFrameNumber; +static uint8_t ReceivedFrameNumber; +static uint8_t Checksum; +static uint8_t RetryCount; +static uint16_t RetryTimeout; +static uint16_t BufferIdx; +static uint32_t BlockAddress; + +static XModemCallbackType CallbackFunc; + +static uint8_t CalcChecksum(const void* Buffer, uint16_t ByteCount) { + uint8_t Checksum = CHECKSUM_INIT_VALUE; + uint8_t* DataPtr = (uint8_t*) Buffer; + + while(ByteCount--) { + Checksum += *DataPtr++; + } + + return Checksum; +} + +void XModemReceive(XModemCallbackType TheCallbackFunc) +{ + State = STATE_RECEIVE_INIT; + CurrentFrameNumber = FIRST_FRAME_NUMBER; + RetryCount = RECV_INIT_COUNT; + RetryTimeout = RECV_INIT_TIMEOUT; + BlockAddress = 0; + + CallbackFunc = TheCallbackFunc; +} + +void XModemSend(XModemCallbackType TheCallbackFunc) +{ + State = STATE_SEND_INIT; + RetryTimeout = SEND_INIT_TIMEOUT; + BlockAddress = 0; + + CallbackFunc = TheCallbackFunc; +} + +bool XModemProcessByte(uint8_t Byte) +{ + switch(State) { + case STATE_RECEIVE_INIT: + case STATE_RECEIVE_WAIT: + if (Byte == BYTE_SOH) { + /* Next frame incoming */ + BufferIdx = 0; + Checksum = CHECKSUM_INIT_VALUE; + State = STATE_RECEIVE_FRAMENUM1; + } else if (Byte == BYTE_EOT) { + /* Transmission finished */ + TerminalSendByte(BYTE_ACK); + State = STATE_OFF; + } else if ( (Byte == BYTE_CAN) || (Byte == BYTE_ESC) ) { + /* Cancel transmission */ + State = STATE_OFF; + } else { + /* Ignore other bytes */ + } + + break; + + case STATE_RECEIVE_FRAMENUM1: + /* Store frame number */ + ReceivedFrameNumber = Byte; + State = STATE_RECEIVE_FRAMENUM2; + break; + + case STATE_RECEIVE_FRAMENUM2: + if (Byte == (255 - ReceivedFrameNumber)) { + /* frame-number check passed. */ + State = STATE_RECEIVE_DATA; + } else { + /* Something went wrong. Try to recover by sending NAK */ + TerminalSendByte(BYTE_NAK); + State = STATE_RECEIVE_WAIT; + } + + break; + + case STATE_RECEIVE_DATA: + /* Process byte and update checksum */ + TerminalBuffer[BufferIdx++] = Byte; + + if (BufferIdx == XMODEM_BLOCK_SIZE) { + /* Block full */ + State = STATE_RECEIVE_PROCESS; + } + + break; + + case STATE_RECEIVE_PROCESS: + if (ReceivedFrameNumber == CurrentFrameNumber) { + /* This is the expected frame. Calculate and verify checksum */ + + if (CalcChecksum(TerminalBuffer, XMODEM_BLOCK_SIZE) == Byte) { + /* Checksum is valid. Pass received data to callback function */ + if (CallbackFunc(TerminalBuffer, BlockAddress, XMODEM_BLOCK_SIZE)) { + /* Proceed to next frame and send ACK */ + CurrentFrameNumber++; + BlockAddress += XMODEM_BLOCK_SIZE; + TerminalSendChar(BYTE_ACK); + State = STATE_RECEIVE_WAIT; + } else { + /* Application signals to cancel the transmission */ + TerminalSendByte(BYTE_CAN); + TerminalSendByte(BYTE_CAN); + State = STATE_OFF; + } + } else { + /* Data seems to be damaged */ + TerminalSendByte(BYTE_NAK); + State = STATE_RECEIVE_WAIT; + } + } else if (ReceivedFrameNumber == (CurrentFrameNumber - 1)) { + /* This is a retransmission */ + TerminalSendByte(BYTE_ACK); + State = STATE_RECEIVE_WAIT; + } else { + /* This frame is completely out of order. Just cancel */ + TerminalSendByte(BYTE_CAN); + State = STATE_OFF; + } + + break; + + case STATE_SEND_INIT: + /* Start sending on NAK */ + if (Byte == BYTE_NAK) { + CurrentFrameNumber = FIRST_FRAME_NUMBER - 1; + Byte = BYTE_ACK; + } else if (Byte == BYTE_ESC) { + State = STATE_OFF; + } + + /* Fallthrough */ + + case STATE_SEND_WAIT: + if (Byte == BYTE_CAN) { + /* Cancel */ + TerminalSendByte(BYTE_ACK); + State = STATE_OFF; + } else if (Byte == BYTE_ACK) { + /* Acknowledge. Proceed to next frame, get data and calc checksum */ + CurrentFrameNumber++; + + if (CallbackFunc(TerminalBuffer, BlockAddress, XMODEM_BLOCK_SIZE)) { + TerminalSendByte(BYTE_SOH); + TerminalSendByte(CurrentFrameNumber); + TerminalSendByte(255 - CurrentFrameNumber); + TerminalSendBlock(TerminalBuffer, XMODEM_BLOCK_SIZE); + TerminalSendByte(CalcChecksum(TerminalBuffer, XMODEM_BLOCK_SIZE)); + + BlockAddress += XMODEM_BLOCK_SIZE; + } else { + TerminalSendByte(BYTE_EOT); + State = STATE_SEND_EOT; + } + } else if (Byte == BYTE_NAK){ + /* Resend frame */ + TerminalSendByte(BYTE_SOH); + TerminalSendByte(CurrentFrameNumber); + TerminalSendByte(255 - CurrentFrameNumber); + TerminalSendBlock(TerminalBuffer, XMODEM_BLOCK_SIZE); + TerminalSendByte(CalcChecksum(TerminalBuffer, XMODEM_BLOCK_SIZE)); + } else { + /* Ignore other chars */ + } + + break; + + case STATE_SEND_EOT: + /* Receive Ack */ + State = STATE_OFF; + break; + + default: + return false; + break; + } + + return true; +} + +void XModemTick(void) +{ + /* Timeouts go here */ + switch(State) { + case STATE_RECEIVE_INIT: + if (RetryTimeout-- == 0) { + if (RetryCount-- > 0) { + /* Put out communication request */ + TerminalSendChar(BYTE_NAK); + } else { + /* Just shut off after some time. */ + State = STATE_OFF; + } + + RetryTimeout = RECV_INIT_TIMEOUT; + } + break; + + case STATE_SEND_INIT: + if (RetryTimeout-- == 0) { + /* Abort */ + State = STATE_OFF; + } + break; + + default: + break; + } +} diff --git a/RevE-light/Firmware/Chameleon-Mini/Terminal/XModem.h b/RevE-light/Firmware/Chameleon-Mini/Terminal/XModem.h new file mode 100644 index 0000000..ac839b4 --- /dev/null +++ b/RevE-light/Firmware/Chameleon-Mini/Terminal/XModem.h @@ -0,0 +1,21 @@ +/* + * TerminalXModem.h + * + * Created on: 22.03.2013 + * Author: skuser + */ + +#ifndef XMODEM_H_ +#define XMODEM_H_ + +#include "../Common.h" + +typedef bool (*XModemCallbackType) (void* ByteBuffer, uint32_t BlockAddress, uint16_t ByteCount); + +void XModemReceive(XModemCallbackType CallbackFunc); +void XModemSend(XModemCallbackType CallbackFunc); + +bool XModemProcessByte(uint8_t Byte); +void XModemTick(void); + +#endif /* TERMINALXMODEM_H_ */ diff --git a/RevE-light/Firmware/WARNING.txt b/RevE-light/Firmware/WARNING.txt new file mode 100644 index 0000000..ae131bf --- /dev/null +++ b/RevE-light/Firmware/WARNING.txt @@ -0,0 +1 @@ +WARNING: The files in this folder are our current development version. The hardware and software is not functional yet - so do not use it. We will not answer any support inquiry regarding this version at the moment. \ No newline at end of file diff --git a/RevE-light/README.md b/RevE-light/README.md new file mode 100644 index 0000000..b665887 --- /dev/null +++ b/RevE-light/README.md @@ -0,0 +1,14 @@ +Chameleon-Mini RevE-light +============== + +**WARNING:** The files in this folder are our current development version. *The hardware and software is not functional yet* - so do not use it. We will not answer any support inquiry regarding this version at the moment. + +Structure +-------------------- +This part of the code repository contains + +* Doc: A doxygen documentation +* Drivers: Chameleon drivers for Windows and Linux +* Dumps: Dumps of different smartcards +* Hardware: The layout and schematics of the RevE-light - *NOT FUNCTIONAL* +* Firmware: The RevE-light firmware - *NOT FUNCTIONAL* \ No newline at end of file diff --git a/RevE-light/WARNING.txt b/RevE-light/WARNING.txt new file mode 100644 index 0000000..ae131bf --- /dev/null +++ b/RevE-light/WARNING.txt @@ -0,0 +1 @@ +WARNING: The files in this folder are our current development version. The hardware and software is not functional yet - so do not use it. We will not answer any support inquiry regarding this version at the moment. \ No newline at end of file From 8275b59f775854a319e90c026982aeb338c918d9 Mon Sep 17 00:00:00 2001 From: KaOs Date: Thu, 23 Nov 2017 15:17:49 +0000 Subject: [PATCH 043/104] Fixes to Readme and schematics PDF of RevE-light --- RevE-light/EAGLE/RevE-light-schematic.pdf | Bin 35695 -> 140266 bytes RevE-light/README.md | 3 --- 2 files changed, 3 deletions(-) diff --git a/RevE-light/EAGLE/RevE-light-schematic.pdf b/RevE-light/EAGLE/RevE-light-schematic.pdf index a312763c0ab9b3536f87121340985eefca514fe2..de6902a6c5efa0cf5399378998af5e0501776679 100644 GIT binary patch delta 105196 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 sS~$`@YS;^c9}$ zw^lYipIJ8L`nUUY?a%(RK4tv-!o2iXlBa@qHM$?`zVh|=`@0op_s{;bp7lP>{?6_6 zdaxJj?B{$1wH~hQ+a~|6a@k(-^FKHDdPjn4Lglx{zqj|L-#+<#H%K?AFn;g9`5QR( z9sPCrn(=An*E4U{f8Vq1|G7`M{;lozhq~x}PK{RVe*3exmX|Q|_xeBf7uRoVKXSUd z{??~Ac9xd+uk5P(Klf?<-`3g(RgKqpzfF8Cd@0|y;{D&~@c10-ne{=}-|t`i)%6v~ z+y8C({azMe_b>jKva7CMYODV%HaV&J$L8nl%dB|tr}o~fz27pW&(<q zTk{_3`fqHk^xFR6*5BRW0+07j<)X^m?}zf5f65)+WbZopsps88w_p8zqXTN`?)H%0 zEqO26{KJXg1xxcjJmC-7*iwVc7K~2 zoqu&#YxwJ|dF*+AeO}MoV`Fo^yndQ`ss6n>DQn*ipg3Q9=X34ppEI9}-rZ%l|LK)a zLQg>jHh=Yub$>n;Cv^H=TD!MhaY1M08+?K_bDHm5dlS8Mop)dWzB^q2jEs`_Om%=~N9 zz07|IuhsW5ztMh8eCh8;jXxKZ?6tpH6Ta)Xd)%R)&ws5C-;=X8E;`P*>*?9jzh|EB z&UF8)S<1cst~#jg{P1dNpqc!VyayA%27|gF=h?x-4hL7iUc2yrRJH!R?fH4%CZ1OY zH8X7`xB0)UlAB!rsOJ1P8Q%KO&#P}O|9RuHt?%{u+Y>A6x4r-W@^d68;2zmrOxpK8 z`}V<)ldkbTpI-KEpTb({bNUNymP(%!1`V+_Zg03RyzRMqSoOXGbBYxzgUsj5cc}C- zpEEz==4Yw=yW;Qbp0Yf@yX)Zmt?Lf`+w%3+H|Rn#X zyu|yl>C=?F6YN*!KeK6mdb4axoz~rgI;N+-yXM_2)=IIRyh~p$96YoW8NVcN13xIF zK3u2?*mZDz%0BPAkCpWw{we-@T|4f~Pu1hb&!-2>vn+q~sdnpMu3y0~+di9V_`huX z?2=)parZ#<&CikfcOUqF0S%J%TQt?57ryy#^V_`@*Y>S_7k&`zw}~Gil~9oRkI6Ov zJnstVOPBxew%u=X{(NZgfBCubzodV^>fccN^>~8($;oxE4_42gJ}Y>2`nuYO=eB3v zEwIaec#VB)p2d9EPfOO>>$m<2e#I8|=$QVuniF&8hu=H=Q((&S5(xRX{^x`=^Xj-$ zzb|hs{;5~mY@Z$5`Zx3S*0uPfKop31ka2(NioUlth?7hHYc zT>tRq9XYoc=Uv%b;V&D%JUw$JD5K>+dDVT5_n*vs?YPAHu)Bx9YoDC``e|*ssB+E=dz7mN!(E-KN#7aSga$7s*? zb?3{csF&8-I{(!yW$y10UnyPx$Mae9Q{88k*{=^=dS3ba=`Y(Dc=Jo|3I z`GkAX=2yh8%=ZG3c1xu{H9qmYJK_Bjdq^Sof9Idy=107ANbjPh4(AZv%R1)_aCU~eysb_*RPv*Hmt3muP5&_*SRw2 z`gP+g^MlN<_#4G7$*YiC_%q>EcjWrwx7y|Z7hL20>;4JU@_9X9@4wFZZThv>;-BU0 zyPyAe&d%R_Tk}3Vzmi^erKGu5<-AS*rrG}HaczcyUDLhgRa}( z&%76H{^b6J^gXZt?z~;?bD$z{SN*@A^B#U(x_w=}Txvz_qqVPJd%xRa_wY~VYd%T+ zAoHH-7itW?re=PR-BI@8&mNdVbnpDt2fJkb`D;J+?~8x>PTKT$;kP*@PRFjl|NQ1; z&-(34rMN%;%elY*>Ar|$`BR`=vitktwYAN*_W8Gjx5qCn{ag8W&VkSMtU=f3Uw5wz zGQX4W1;=`%TRP&WBHAC!B4%dmf|`4nyb!Oh_Q(!3AqKlXC2m43wf zRP}GohC=Rp&)1hS^PeqWD*b2XuRZ@Cyq@{;`jzK@`%bJb?EZE6&iWS>%W7YIu4`DY z|IE%EWN7W24BOycjqTTr>p{5!lz-khzwQP#_2j4IeMo=x`QPF6e+z9EzXq4Q-+o@G z_+}S6DgFIpnJ+&px9sz{`+CoJOE%eMQ=e(xE%^WZ!t+{|_x_jtKm$R4I*)ZjOSB#H zr>&VEWd7mAFU`_s`;%2_rOta)zSS<+o(C@L_C-v8U;k`g3@C#haQ?fp%S+b(*4uTa|5^W6)!Tlzw)>RX+@I&(9qsN=nSb|?^zSqM zOY$CGb>?{k8e5h7Su-6}EP{(I4gZ&Nc6p$d8?Vi$N)?bBekp;{;GV$s?KgI~{r(eNJ>H2$A zdHs$2ECs*MwzFCKx{|r*{=@liqU)D^4qrAGT(4x${{-&*c;DWy`|axQKhsTYf6rbv z_rc76#Wt7i{;m0ZZjb-VH!F6vZE%-OL7aC4zolQ+-BZ=c za3*+{;{Skp*Z^Twz2Dqp`jaisr_Yxbu80eK-S%ho;~-E$?q#;o;YO>Lfvnce+e3;zeqyR`S!>Aih?zk^@0 z$w}$EnQ#Ao95hU7vg`V#Ywy4Mi@R@??K`h8XJsE$ze`d6)&Azs3;%tezz<64KV1HT zx-q@ti>hHPlm({*Cj*~LCjhD1OYreM@#I2XuEPwv`x2NT&c)nDu zeA)KTxzfx0gOTOD{GabC*X{MUQ?dP@{kGtL?MJmDoAo7sKPSrUeBYRP_d>mf|I1%h zXMY9PgI(AcekrHo>g$QO`8A%;oBv)~?_Evy@4nZ23V&NheSebc{P&*1>ED}c&(vDw z|9(?zbsY=wg~T8cKZ#7%@>=J-~X0Z^#`AqzyCb(;QY0+Tm4_fJ&%6> z+~CaVMf3Tt_Z?e)W$!undyi-3*~sgcPB?w+bkaQLUwf3m{Zy-$&6Qr?AKBjD7=7V0 zXgp2r)4r0Wum7HWHviJskB2@@dH3+~v@hw_^>h zfd)IO=AHj>xqfcGsm+$UXJYMoaZ%Q{>%FeeecoKTS#G|r_iXcp&y_)A34gc0_&I;$ z@0{oRmMfOl?zyn%w@mB<$=w(Kte$?dr6%KTPL0;x*ZU@=-#PnfO5Ve(r{_NaH)@|X zU;6ql<#F)KUlj{0zbk>XoUDmx|FySrI{&lX-%b3__4`=Y&*DF3H=X~O-L&anE9&OH z`u;m|-leZL+x|~^_wdcTW1D~OTW0q)b?(=Sds{aDHGlo{*{*AaO5n!xy5LFY*;h(e zWc*)SwfE|c-fP(_Uq5brdi8W3bH3>7TmOIk`m^V%_w(m5@o%l_&Q|Z8pXg^@Za@E; zZQWcm`}3~TzKef*`gCUfq)p#UWAo)tUaot6aQCClH_GkvpWE0u|317uJ+B@#S@GqM z(V5^~;_vJH&OY6{B>N<|UgrNJ*L;ol-r)QuDpOe<=I@ zXy>oUgmsZz2;XJtd_58-|C8zd3RsNr5{f-TkHt#++1x>;< zy4%TvW+g4^ukTWf3z&Dww&spnl5OM@XQS6^_tnd;(FZsF=bv`pYxcM66Qms+9X-E% z&)$y#zs+pzrGBsZZt*+D_IB>whZUC>JWsxSCAGGEX4WOvd70|3mtWD{lXLx|^$-8ue)4Z$YSiyD$CukQGDkP3Re)V;E?XtN&=f7x(@<`S;3}FE{xo?7IH@Z|$f2e<$|W?>t?%>KgAqm&e5yKP%r}uaSTC z_e!%o!TPx8=imHgy?x`I`PTPG*Gn79)l_(WfAV%~eB!f7koDqQBp%)-)|I`CBW#1~lk@q9XJD zU#>mh_OWKqzx4HcWzL81SMTj=Y_I$8kD6NN{SE}rx;Z~~eJLkj>Ga`Nt(=`ac!=-% z{pSZimC4S3X2)M|5(gUVf1j;=_kq7j+_(N;D<5@iSbul@!{7Q}CF^HZ3)<*M+kbx; zSwE{<hI+cHn} zca6c`TzSa-WEz{rk=F z+}U#HZvQ+K36=(RrJ^g6=l^9`S^e={@ui%9;PH;- zS9t%aJcb6r_YZ~LKR(y)%ZqyZJ?GZXd7r$l?3dGj|GCun`uy_b%KB~ky)OUvzRlis z4^mlvw>xjH`)tpm-1{fr>uSc<-|Ky<8CyTEKL6H<&ojKtKZw1n?us)1QT*_p{AEz7 zwedN-?fSRt!Ex;jszg3FgOljz=CyNe&p&@_{5E5cMr?guLDbIg|F^8OKYtuF(AM80 zUaWWO^DQf5Q0jdC^TIDsN2kWlX&i=glRsVele+HDs+pOCM^4+F7FGLEsdG2~;oOS&1ThqV( zIk9c=SDl;Bn^&eEvzzjLV_d>H{!M$z{+;>kV;yBbwSJww{fS%4OaA_}x?%^aP3)%OO=BZd~|3hjS;+CN#&r?#;Et@TIS{DZe|f8XQ% zd#?J=KjjB1Zyf`z0r<;d0eEw_v`ih(Lzh0YA?>!$}rCr(g^zqMqTb~=udhhl9$J^)CvW(9(?;if1 zy}qLGpUK;decG|_{muS^nreSD>t}!}wh8}oM^AarW`Cbm^33lu&vq}ayub6i>(+NCPkVngKK*-fZShZ)zx(I$>;LXqx49oO zcKdqw(S6T<8y&uIZGCKY?5C#6(C@$MUhTcd{CUc|uYa#R-#yj&*UZz`_&(R~4O=Q* zp}gI0eQC2jd)|KM*P!X~4`<5LWzW|vp9Y!b34ZnK{oAs~H-A}PePH;OMc?-G#)SEq z?!WzC{(Ap=Uge>y{wrVauRjec0Qh^Szm;6h68GCrEqnf@z5Dk6tnn9I3+{wIZ@$9& z&*iuOOSygV)knP_*xsL*^0yw+*#Kw3gW319zy3@B&j?)q9{m2G#_7qs{#CEd*y912 zYhtUP^iip_zu!Ws;_E+7`*{ZUvt5r1XVzV-cG@$e?26se>e~9vr$5KOire%1kE9H! zS$^RkXdtTd#(BYiKDqYCziOZQJwtw}-{;$34ELY?Iz6)fHz@U7SB?Z#2@`)#U;g}$ z_k)?=;%ub#cV7OZQGcetDDSV=HE~dyubl{Lkl1P570@?W-}hYh{Eglx_qWQud}qDo zd+zMt*N#p7QTO98sFwN8G{1NoXiWWY^t;t2-xk_{=2w32+3?XK@wLfyx?2=rPA-}<==?tPYi$W2|N&{xrtYJzt=C?Q?`H6d;9w0_ezoWOW&2sKd8-P*#=V2 z7x){rDC}qYd)du4m+y5ye{}TD;bWhsWkdf2f_1~?ZRjq%x<^0<^>FaUReG=lX>h7_6-wK-BnD%`7^1m{_ru}btBky_l z!09`GJYKWar@i~R4m^hOtIpwt{bjr2?~$2z53T;LaL8t9bj8=FEtmT4o?i|c4?>K1 zKH_+=^()i;dhgozUA@zn>P4~7%Y2_Y|LgLt_54q-y2{0$Klk&#ZGYnH^xtyM8}i>> zsrTCc;Z>~;c#+}U_D!JHj~r<1`GY#Bd-J11xoNxY=avig%WMUoo3iL{{mkP%d;j5Y zns<%n$EF`7C;SlkHuFcxw~65Nt!;PR@cMVB^x}Evw_Xp|hlJ$%c2HNu_I>2M;FJMUSrXP2Dhuk%~hgIBl3?Oo3L474b2&vVo3;Sa&H zMxZ9t!TA~cv_Yf53~|;W&wuBy`u=+J$4h3taeHpvJ8k#cKU@CP>hCXqRGD3^{&(}2 z<=I1hhqpsIedk^$&bzd?;{5NdjM|C28r?ye`A_Gu<(F*j9(B||xcb}P`TxvsGk4tg z{qU@8|81+Q??n$lLNZ!b9lVm^+5C^oXRnu#i#&g6$>XEjCjXtTX1mXC=h@i-_tqTu z-X_~S{ikwV*7AejH18hD{@%6`RB9`KKKSeM)8>bYKR?*nZ(RGVuC4y}&(57|Z%^K{ ze?$K1Bb6(`%V6rE>tKFAoV_#t;@0`W4~(A1WyW3o`uiwoMb_UBxs3PcPutbFz3KZ# zkGl`f|KilRF+bG&2=__j-3 zDgDRu+3qVKZ$4NWHa+(L*3UdSd#=1UX9K6c&&xORKds+dTNZx)j3vXCx>>bR^7BjQ zvE5!?vi|Qst96c*Uf1XACm=PTX4QjwX{UmB{i|Vo<-hs<`$tE&P5$N?TfeX2Y3l6v z$LucO>rOxJon|j{_Iv5I$Bw6+-&DW%*ZdD_a{Q&n|minPKM<``+IKG!rQ3 z&Z57y>g})fZ^bu%40>LvfA8|W({}IAr^%nr{yk$|{k)mAVIaR7h|hm(-MywZ==-hv zYaUBoneTP|{rycp*Ol1zuTA&5{(JIS`=zfRvp)5V-Cy7R>++lByDALdf@h=eZ`u>t z&+c2TKTleJ=3lpM`_5F^WK{IjUawJo`*q*5RFAd)FWK2ozWX`9!pr<%@GkZI*>zp{ z-+ey+%eZe;ukgAQx#IpfbDNc4WZRu{?{|Hhc>Dcz&?-$yNHMTQpSdD_`ZeA?N3I&L zmHsnx$7e;*q<^O<%sYPu=N%?)lVb;I$Fa^QZSEfRg_Ae}Z%Py}lnk ze9Sw_{D<&a`=y|bHLyQ}`?pVive@2_^0-~TLz zmM?Q_pZ#`U7hnF)PIhhdzW)YWs$D%m6E^2&C>enkMn-t1TBx(m-}I> zx%BlP&gb(lm40OUJgM&A%^j|v{a>=(J2LnAWl+_>PaCO;zi;}}&-t0(y%v3SeYxv> z@j>wNKi=E*uR0wx->MgvFz?dW`~AtUXI|pn6ZiA^tC<_6K~spJHR6!= zXWqA;2^GIT%kk#K|Bjpc{A$^bdAV=vqQcLAE0b40wEO$=^M%!S=dTO*mE9kd_kI7H zPHX%1rR)Emt=@F{)4yYOpKO}1fR0uVwV_{+9i0xBd5PuiwS_r{emb80^`e z_i$#hsD}T`xR0CWAL~1L%NMj!LHADm57*ah_1A0~|GxZm{tIY+w7vg!Yel@Ji0Bu~9%--1`0l*;r(P*{{+j1^BEf0eiZdo2H2L>)K}oay$sbeTgIkOK zt(pFueO{*fe15O(AJU}VLF)nzMbGoCy8&9In6byAe%AB(zpW4a+G+Q^{R-Rcj;KWl!@vr`met--R^tV zyz%@~=XX=ygS(`~^S^R}`hNeRCd&U|DCmSpGoevQ-3Ni&*}VqUJkTi z;_bY8M$n3hXA`aaSC+!60?YeR&(A*VXtS@MJAJu|!Jh5!O8@Nw&)qA^ue!_P|8if& zjql7`K+|xxBH(E_kfYwZ?YqCQB;MvjE%#FCKRborXLHxTdsdrvdp&em=H@;A4?pv6 zRey~6zxBI3Xl(40-LLu!%l|KVceMJRz8iQ>w#IJ8_aA#}K}(R1J)d){SRPd5mDgWy zuKfq<4Oaj2y!*ia6KF20_Q_|DSNkdw{(*uLG=&CU2EhIIx_aCz72_w)b9oN^Tvx)q z{_f>Npkeu^Ve2pcT2#W!f42S4M;oKE#UEFeIPY0dZ?hD%-fiMtE!Z`;~2=mhBlUrdj-6<{vK9 z)c=UE-wbukfjztI9#+h~HvLw4q_bVl`F%F$CckFgCVQ4WdH!kkWcicP$NBHwORsf$ z1+r@Qy!@!$)gN>At^aCmo>LpCZaZ)L+l)OvRr_{6`xfH@ZuWhzSO^-@tH}5d3ZzYO z-k=iX{MyYD^ES>tv;XRu<#X%p!*~B@_;&x=vH5!cx7mGWUm5+ayWQ@wBWUF7Y?c{# zSn#hpXzH+L0w{~eWjz*oeqLqXZyx_X^=&K9*X_TeyJur>Gsu7Xa@%nv*5|i(f)lH! z-Tx(^u|@Njf0LxQudv@-fA9VFw<~IIzWYAABJ$T8|NK0=+)oETlzp)KpStS)eVONF z@$(|D&pX~}p&zRkEFbbj%MZ=SKoliyCRdwnqbH-EVu%kQkY&3|rQ zn|yy)qxpo_!e{p-=H5SF_;&6e%N_r+ziqTxDqW%d-FDHW`t!fD=B3|yeM#)i`J|<_ z{-C%#}?|5L_^iuah{J-|E{`373?eAXy|GP=| z?(tpkf7frToxA(je))a1x3>3J>ec`I_4aiA-%sn~73N*m-SaQ`#;&{@=f8bTmfy8b zUJ$f4>0z>je}((!DetkVDVqB&)@p?^!kb4QK}PK8&gzqtPY4+;HspeaqUdj-<0pX;aOJ?#B{ctWrLO6kg+ z|C)DSoHy2Q|MXn;+wzykDi&5=S26!M=kAjqmiqFSIdATg(Z76LJ#W$D;FoT4+4C>i zHr+j2p=g)hEp8$oHoyMd{OrXQfxB9_-~IzyrzgICUGjG_W1$R)x*Bdu8 z!|l%et;z45Q@>~HzrLOF??PBAg3LcG%iZ%`Q~K8Sv+}QZ%DuL}0UG#RQ+p|2w<5eI zuT*ySo7wO7^Zfk$O!MxM*9ShHxq1ES%D;lQ%R&BLT&v^%QY~)l><5wmT<2xqKk(P% z{rRVHi&TDRS-&~2e(%f1IorM&pIyDH)%@Q1m6y)Fo$q<~(Chd0&jrsQMeu_fiN8M{ z-TGav+5gLUUjD4wH$RtM@!eDGReEdtTa)##mii;REpxVT2*JX^v4Ge3)O zKlzh$Yj^+GVkOt_@mGESxm0?Ye>#)5<3H2+TigHMvr2e-`&$1}7PoozQPwj0jnC_j z{|THXde`Z8cEE4w#(9m;5AUw6UnUJ+j;LF)NbYIP zy=i|pn;t*Sx6XWN-l}@V%6)uCZa;r*k!2kt|LKVH+u&U*|1A|g|9t-X`pAP{m#uf_ z{8#dJMXi_lRnWx5>{s!i*!JDS8nfT~?h}8L|5M(56mT#2+kKur{=d_+=Jm=S{(ULs zTT&bJJ=DHXcG^LkrL*f_nV$GDWml*Bv-wwi|EU}oUpe~`DD8y&Z~7JdQY~)vAMT&; zUeyK6TMf1>$MmcA;s<|(?CNa4wY(&FZ-{nW$N8!ohn^iadhzq-rMu1M^|$MT%s+b6d)-yO zb+_yJ@BEkcUfrYVH*?yX;d@-1-k_o8M~dHKf7=Gv`WN3x51(JUE_~fT z>F@Jy{NGdQ^?j>+<=W(gd;B-H3x16}wD0WI*;T(i=6#9gp7+*2SO-|K2|+p7Q0d$YQ|ZbR+wzjnW**Kb?=xO=mHkN!EkN$J1!FWTMj z`}FEzz?SphQWNf3W=vC&-(0(Huc-cw@bj#R^DgneF8@}kQYzekrhMh>Kc1lJ-}kd5^Zf+CPE6 z&;8l`pzfW?dw!H{`Y*O!Px9$sDT92m^B=F*IZpoCe8tzsC~nC+!MAxwKY!fmb8US_ zjo!98{%=>SM7I6ER%ItPzkcjHb)e_qCA4@yu)Hj{U0#$EVWeEqd3Xg6-Q(2|ciS)cbz-PLM-V-MR? z&Aa07t^Ow;H(og#+^~4!Zz9jOx9$UI^7@_NW3jK#4_DpVzWAH%8uRO0&({6?wPD`3 zdYdEruKzr2aqVzxs>IvBa|&O*|GOsjMaRG06+z#hL<(A;{w?@B>!f^6{8eA@aF*Df z@S48M75m?8=J`6c@A2lpMemHh-1#jVwfzGdcs4rzW09@S9B^y&JAQlBZ^`@gyu_ao)QJMCSXSfk*Yd9Z{AD%eZ`W2V z{Qs<4i19aQZL)40xJ`Gh+K3rk?EI=(;o5c5?)tqh@khnmpIe^-4IsRGw@CHdPxaFK z6?Z=Szf!ATbY6Ms>^I8u-Gj_Op7=9)*U9-Wek>~KZ{O4MS^tc>)X~%RHus*JY09@% zUp)S7H)ywJ4;!d%EuZUs;BogQUmFwoDS4mNCFcj39|dh(cJGP4GXHXI-IR)TvbA;^ zcMr{88-KATU{~w*JI|9h)OwkJyiig2kLSGoap&XbzwTo(INF^Jnhp?)tM!+Crg`_! z?cBL-ee*%;{@woi>+bFP-gDEZc{8m2b{}*OafZmYg57{llGK zvY@5T#lJaH>^$xsQU07*dBgs5+2oI!rNMg+?Ac{6Ske1!`m~RBM?8NTblNCZOunc8 z;cbSU#cwA&pWaWkS3mzu&D(6RSSrl_c7No0^SyW1Rw&-TyHCn$Urv?X`}*4#|K0vl zRs1$*p2w#p@4Cxl{f>e1#iNOT)k`PapZpm0YFUNjeE!{Ymsic(4r-gOUEXZ({@?n* zzv9;m1m+jd{v5J0x?=L#W>7G6y1x_m02O_4X|;CS%%c3g?~1QKSvmEJuZ>CEly@H| zsI%l>|Gcy`J2+mUlsi8+IKEz?R2VeVIQviMv%|~Ich~M;v?q4G{I+xFKU>y&-8}-{ zNyA@x=);qryYtn5pMU-9XG`r7wr%ULf37_5{HA)pe&W14e|NvLP1xh7zaFsbq}?R-zt@_|ug>1}{r>ZdpU&@>&vUotc^~_|bbj*N>l63Z%YTkF zKYE(up1W?Ta6Z%i?@FbU?bScn6++A53i%eL0(8BIjMPJ!C5g+OP1a*Y};d@3)=b!uAB- z%jfz$C2x;DBdFJOM0tLFeUSOj$u)AGcT?m+i|O-i4E}=>oYg*!yN?z1AO7(Mm3nXN zI%e>HtqZoeKQ(Vpf9q4tyUKTFAL`QwC8L@da`W8J<(b$`g}CT(t??TBxBsS}D1HlC zr*rIg#EqJOUG6)~S-1MX0#()r=bP0XyMM5E{yVwZ0{Zp)=Dx9CS^eX8dE&fFz2DC+ zc)a|Iug#YKZhPy#mreex3JQj2S8F)-Y&`qx?%m76pAT*Yb=>2-zM6W z*ZV(toBK_DNnZV`YZqf74f8V;>zWU9NNAG5Le&fx(Hap1tp84TVQ}XuY zv(31H@|9fvbW5ewoCtBsQ>9-!LQUnbLjQoD^3VEnZNpZ+HA{8{Rz8{KQI4# z*NW}Sa!}rn14YFw{${)UFMqo}x$UjH;WqpH;(ws(^jP;LTRG5Dr(b{WZeRS@{O9NL z+5S1+vp+vNyEgxC&7sc%zwf~^zo#$!=6Ux-@@K^#m*;K&SY99VwxzaAKIqHxt)SI^74kx-gLi$j zQz@yLxNBm2pMH?}FX6NHE30je2p-)0yEEy3WVLqOmhBXv?${YNJ--Q=`=3FWLzCQ8o?JqSKwr>8p@AdPEyYtze?)+V1wEpCu%QwaU zynN$a`R?8vgMD+}=EXICx>w4bpJ9A|Dk$Z0$gW?SSN~|@Pd!jU_m>Hj)SqhJt+*e2 zf8zIz8h4K7k&YpiK-0`pE?dw=B=FhA09`cH92Q^gh z*&n>MyhND)Ec`7h;rzS61aJb-cX&G)+kz0R)IPHWwy*H6w*wDAuG zl}L*33g5lCzM2JG4*WX@iox~2X4>xWwXt?jdmFs#2JXuTi%Oqu&G}veg5!G&=|n=7r#}q zf7y9%m4=3TwcTF3n*63`dtb{vv}V)se|hZlhpiXCt6gh<@4Mi$_{!OTBL8!}@weaq z4b;HQTXTJbP_Bi1+IQQdH~2sy_ET7PJ+x8^wmXyi%2et6*2RyzuP$!+c=T%a0-Nx7 zfj6J)-#+=FRNDVRmigMghX?1E>47HXh5OI6zwnnn|LFaLWB%oOGLKWUMCN;$&uiao zvsC*0@9S>&>m%g%{Xg*S{-W=j_uPH*+5gqDipI*)TImY!*OMOEdQZig^X-Y>@Bfy0{WtIMJ;9HapQq&A&~K=;Pq<$df0q^9kyY{kwH7pz zl0W~v{e8QJuQfs2=PWP#Ue)^4^RD>&TkW!CUuTc&&cGuH(*ehkj1~wcdBnj`~9FC-Xri@XLJ_;d|}wfacfTs{Iy%hE+=U z^L+!=gC%?7YW`dP787*$`FqpU-uq)@w{c?J+V`H{c9u=q-dV@>RbS`)yJn9)QRf-J zjb~Qv-!;>Bb+*s**S`DY{LYhq6%Flb_b;+pD*Y-qp*y_uGzxBb*n(wP7`+vLoJwu`XR@IwW z^N$C9TWrmHcy-sr$~PVFHSdA?pI0rKD&N=daz7&sIg9Aq%*5YQ-evzSUn`$5?~-lO zyaoS4z(Ms_{L}i-JrVzS6K#y``9D;ATPOY3vf=ytth?s-zP>M*SN+d&cX&~~)5~KY zXFUu3o%Y)<=fT-K-=mt}C4E2G{_Uk+YSUZkNBb3dHq#uJCevcLX z6YAH!`~802_NM#E(|2jcJu~~PdfE5eLYvv~-!D7==Y3M+^ir*!FZY@L#eD~upXp!! zRkq@}d*RbDo%uv=PPbL=fEXbD3{C1{{Rj=z%gd;E$0 zVIPxzihtvtGoQV}ruusCKbP<7OWsNISM2i!htkQvOe>|2XU__M`}w!Mg+z3$`xdwu)I^oaalWkt5SrH?<$-qoJ~8iSm7srNBAc+}`g zRn#lD`bEE4gUpX{pAO!2+(zLRdb`zmk9wc{0Ttj%A3y!G^Q`>3VZrqXd7~T4 z*I)d_xxBjNyLH4p{u|rPR`M6Z`V-&d?DwC0_w(KDlV6uzv31(}kL&vWJ+I{+?(HZ| z`TqPqsQdZbFUb7o=4YI5{O8yIEB8sM?YQK-XXc-O%P#r;n{)H?m2yb?z8>7bzq4cN ztN1L?lKJmPcfa-pwVBp`p7U$Ytec-7mES$I`Fl8|);#|D==b@X^92iCKD?=&DKY=s zKAzK?zb7rKT_^iAchUU55Bqpd6~AY6nYXw7;HN3?1n(I;&VLW@`hrW^8=zSqxresG z*TB8ddeBmQ=XnA))%B{sE^pobsP#|utuxb?}ubCU*!G%^1FxcS95(fv%UZIZ`Y5{x%Meie}C7TouBWvX`aU`xqrK@4BoT9 zxjpMmy5-#z(3+y`gVoXZ{TA=jPn3H2+vZ-W_y4!o)~nQmif+aC%@cNYZf|&gG|2pC zvEuvffx9&0rm20uz2{@rok{<;{B1f?4C>Ox*8XqFcEA4KP`<|cR{iSU=){_p_cfb9 z!~gp4{`$^XUc$e>{{X1b@e#B#=Hz_t>iCnp^SY+D?(KgX`@N&E8#JaSH|xEZ`J4F% z_xSciC)U?@KD}9G^{jdA@|!i&cP0J@t+Cm#|45&H(D&ZsXYE1bF*Wzk?1pr%`X#o1 z_`c*GXr$)+642n(lYdJs;(ph~&bqVz%Q4WVw&HKQ`kvo<_})79cWGu# zwQzneF9`;1POm<)!}ZTkEBWZ{Yp_sRLr>iI#hLDl>FUEt9dukR-+n`-ZSzTWqz(pDrPuC`L^ z=jE-7e}cBLhzTD8mF#!Fvu^ykuH=42!hg-XPtH%A9iI)V)AKhzkLfsn^%IM1{HyOb zgwJnX{PAV|8}5&wKEm(2mYw0>6BFlMs{NR?XTeWUBN;Tn^Tgl8Zt6Qh@cgd$`&m7Q zka~YC5&uie;_n&l`2NwVI)Bbn&AUgKAFJMY{wVeJn|*0*Du|9xBQ5%VK&|CG)6{$t;ntsQ!AU;H+Dzia)!-M^&d*z`UUj|qU(AW$^OivRB#(c)ud$z+_oy`YUU}E!nR}lf{q$yE z_Y42*^w0h;_q}qy_2l=b3GZLm-s6A1`%*7x`%>PQ=a(kG57)dap|5j(U;Sf|$Hn4> zr?2e4^S(Is-raM@mfsYAT%13-J}u-) z<-gBsv3o)Lojcy~g9e4Z+k^7u&i&e@@Z<<81m>vUsho4A_UruH>1>s|ZydKxvYu7H z`;LFy@pX0S%uhY<9$G#9)#jgirS~gh{(Ihi;{VB}J`~*Q-+Od#zyI$DChL7Y>->~H zW?4(kKeta{{yDoT=C)6q@0zz%dVN2-`&;URKf${?!TW~5!?fQ!z)jzWtyX*&z{M%F zG~ILb)!n9A&@|J_eHHIZm3jQHE$-=k6}aSG_w}@zNcm&aw_g0Q$*xDgxBk`iC7`n9 zd%%3v&r4GOUHtf|?q8kk*}bn!|Ljb6zjIyZ6}MHm{G;>x$>6moFKuL= zYThlm*AFgvrS!c(<1OF**xq`6EAaP}cdP67J@}``l0E-Y?N#wR_qQihdYNA{-T=;I z&zeDv=+Ch)mw|S+e6Kh$dD_qK%^!<2ui4vtI=B4L$>^Ltal4M5J6=<5U-SI;<^2bY z?;etVU;Aw7|9ju})XxGfS;U(C;lElgB-|y9L z01t*m z^0%{ZKDYt0`t_G1#=9^6iO#;5cZxkb{c-Tid3$n2_A@{5ynDj=?d?}Ksvon84t%>R zKfmJIy;J*c)ThaxUhO&W&E{|QVS5th-?cyZZT^*Bn@jt)zJB+!MrQr@yYmh&v0s|^ zaBc3h=Ai8##1hR9M$7%le0%?|+;9C4f4<+?dpDjWUtc9=@Pm3ID)n(m z``C9!|NPu}{O9KNrMn*fd~iGZqtpMd$&GPDlhi}d1s~-nVpJx2$-Fx==-rBJE0byNJ<=7n)t z%%A7fZmze_%h+^J=l$xHUjr-WFF9Hh{(9fN>Gg&CAO9+6@PDQD`@mn-wZE(C-~8eS zRX!Kizxbh4y0|uHpY~k|eU0c8C$obmk4=f^Yi)sJsp z8Fy;>o7uO|fDS^@{Z}6Izwd$O-4uCH-E~O%sGZe8>8JnpyblL;=q}os++Uj4BR<9a zyqWx$`aPARpUs-Kzxui0D*vXx>ZQv3XUkVsv)FG2^?)YNe;)@mYUcYO^RMzz>mR;S z7mKww?8&WI7G3dGRei?tlH|Q-KkWU!8k{iJKYkSa+O7UuwRHWgyjAZNE5H3+b*27m ztvYD?D zi0EsazpAghYu<@l4}UFXmz(`QEnX&mO&#acx21&wmDRC22W^&0*T3$(@X_a$n%vC# zAoE|svhhpa3H}0AIuY-WfjaRYPgG0B>xF?{06GWMX2513w%Ihl7`1GTNf4?7@eblP=!P%m} z+snG&o?h^;K4e#?`>)Gag^$*(`0joPycxCbySUtWP|xr0a?k+ck2|F`yXsskgUqj8 zU-)mzu1@xK$G3pWO!Jd}#qXc{c3B zo^Q=t!=C*1byjW43;XzZ_hYATy#Dz$V*lbZx717H>%Y%7n>l~yu30B;-?F*CG;hcH zNxiTTeBp0qXI{Ba=+#oGqux)xn)NIF)hre62c0}3qOXyE<#TL&`j+i0JQ7;^~XqG zy`FjZP8F>jq)W!Q14zb{`!gJy^}+DSh3yc?n41Fk2GUDYaN2fh&zV7BU@PB#i_sc5oFiB%`q#oeoCS6#kPzt68YH{}1$ zSHG-G?3U)OTCe=}c6zk@TK=!gvKLofKC=7YC!?G@zZ_q?$;|?XORxCK>Xy1xP_?of zG(f&`A0H^+**xKlUjO2+od@!$65^IHc$9=)D@q$1MAI`RIe7rHC+@4XK5(z^OX=N#9_-qVlxT6Zv{Ufx&d ze97bAm#?j7@qc;jFXt5X(#Lg-ul!fe{-%D-?7gx3?>oD;3+f+P9({k)-{mEj|DC?| ztoCAI@o(05wvp48mplfqhd=f`@oe6r|7CCeub+E1|5EQim&d`cj#VU9dYSLD@BMXo z?{(?QYv+zFzkNRHYaRco;@`pt?Y_^`xm91ESFiNx&OTS=-%a*&YjyIke-usE zwdTV6$rB#W1P#UiUy}DlU3&iNdFOY7L-O7C3IDF_n&=MN?hTp)xw$X&%kr(;AN~CE z`Mvq1kBdr``?sFIC){n5Enj}gZmINl_Q2mu@@}11dOI0BLGjvtdmX<`!QXe^Wf#}m zFIW5QxK{f6=74#(r*l7Eo}Yh2diw8rf16GJ@BEA0a(?ULZ!`0@oc|c`JLkUPE%VMw z%{~7m-xS+i*mv?Cv&8e4i)U<~{{HQ+Z!7a0H`-j*-Sab9`%5cmrZw8`n^E8Q^xu~2 zrrqD7Y_n9lviR<;q{?N|e=B$G>9qF+jU23gUmvY9Z}aYBx(Bqs<~{wneOb+hs{9$t zOS)@+yN9b~{Jt5tU4XM*>n?PNx2*Ti&7c2@|K2j~ntot4KkK#m(9X4HTtJ-dbgAd!wf zls&_~Ho9W(+1&?gKuhq=ok52MJnT)1^ZMXsd4KNPd7(GG}OP_kHHQ4QkJczUFG$e(LL~oaZZF)HuCXle<|T_DBA> z`1L-}evZm-lWem=4XG=3yYo$MhQGINc^fTXk*s`g-E-k}bH6^<`>ve+yHEQxXpQLm zN|*D&TkG?lEPUL3rT3r9b$(D=?$qYrqRBP8%0Tl^4{z?&I~}~M)%^B*g~!3K+~j`k znY!!Z{0uvfyD9RZ0Q-32=Q_};o%#Gh-z!ddTikd4zqM<66=%(+^II4HTu|aaZ#A>S zadD8>=BZq>TRFQTSh@Ze$a`_qj()4I*|Vdpe%t?7f74g~eeH0Ghq~L=Is9E&qRcOAzclZQx^-Q> z7N{SXKjo{wm4DPTd1?Lm@tl^Ge{bCV%KEqT>7VqPU*Af9L>yxSWvyRDPW#u)k5;?e z@?pxmle1r0s(=Igv+=>z_Z2;DvhA1OI{Zb_O6Pou|2@mj{hwO4`hyOzmR{6W^e0;?3Z%^li zsL$KFeUtu|`J4Nn@ZSA$QGb2Shi^Z>h1ulazu=!VkMYBjyeA94&8`1@{+CVB`fL6R9&f$Y`)%TH@2KrZPKQ1JsZ#I%T5e(d#gDF_d4ihhyA0zz z?pa)!o}!e$;{MXMN-y(I7ycA~YyBhr`Y(^c`8OXPM`o}e-&`2;^xp%EvtKQHZmE}Y z=Wnhx1+7iGXjfu0c~|T8n}38s!^K~;E$3z4O_2w+oR4vzihf&T{NY-ayd>yU?Ctm8 zzuX9FZP&w^+k4{9PoMT{qGMUj#9fdkdYAYF^RHj+8aM3w`Znc%=H1EV=Y(f}Sd#a! z^ji)4W7pSiax>pYng5zBbAAiBIqy@R{AT~Yvp<(z)7`W5$JXy8tPW$R-`j_wAwByX2e?|A(&SH-u z@Lc$_<}1DbQb48^}8<42X%A~|DB=Z|7zd6 z?zO)+fO>vU7J@ePw%aKF%HRI?d{k9cOPN_*S>-&dx4Gx?x4wJ5Z_jJ}#o(&8M|`dH z-%ik^`A4Tu&-~`!|5aubx8>dIeOtwzKaBeRW6$z6>*PUe3@5gKyRV$TrOFP}H@j2M z_B(j~@?Z63SLPostN*U@>~O$)!6wie_+7t$JG`k-gXci_fY0w;`ETbv2b~TLZ-Q^{ zD7_$f>*Bx3yPno|^L5!iS=sYT-o36{^!gs# zjeU;u{Hx`p^uN`1pSWFr?6;i8HM^D36|O!LfD+1D-&dm3i~mK= zcfU73`TCQZsMlimGS1r<*jxrBF}tPjPD#(2{AUbo-R%%1;^+Wz62+Vh7|=AS@~ zR!H@r`~`Hnq^jNb-*si6Ho_;+wF}3c=P~R_-SpRLKL0vdP@4R7ZQ;rKU*L-iepf(3 z?DzS1$9bODpEm2RG(R}|Yt6mwlYc6da-Y9yxxi-W?1~lkrF-30|BJS+t=oO8JpIC- z%ez{)n@O(Un)d|MGjjh>y!v1Fo}x zYL_()lxK5_cVaRkQVJf`QMaX6WfnDSVG4?gF=zJ14i z@6>9Eb-y|fe14noKlARP=-F4Cv+qte?_IQx>4E3nBhJ6yAGEvf*Qb9w=l5sDxHriH zpl{ZtO@w-4O&2Odwcn| z`B%H@pFd80pA$c&XZqef<^Rm`WEakz3pP26b{ZD!FjPEgT?>kjjvS$99V^qs+wePR}zCYXRfBxF9 zaM($y=l<=Cx9zXLZZrB*`rYrw!`stS_pvrb`oHyCKI?0Eebt-Kaoy{mvNc9ET1FP0 z7rdQ4>Cab=z&&}pCaA_i3GLuK)gXtiBg2v&yYDB>%rR-!JWirBD2NUwQtS zTuIb(_%6F(Q z@5%lzc3W2ah0RuLStY}|+y4JEk6%;p*nf`IJ!AdW%P+%061O(izxG!*PKkWG`j}Pl z!=9MA%Tt#9v&!Fa$u8WWcFtR~yRTkxOS1UCbc>7UE{vS_QjWiD`*jh5kTQGWc+vXjGxHv;-S+24>AgP*^0M=zzdyRV^UkH-ZOcBst*s3d ze7FDJ&GhZRc9b=!mkQ@^zG`&pc24QMTcDMLC!8M#zcM@1o_X={^DTF+x!?RyDy?_l zqmw(&JuhGn)YShfOvp0XXYKZ$R^NXwZ)K%@{{~oXRdDgDC zUtfc|4tM>Y{I)({5`89K@807dk^Zx}-rr(StMK}6x^KsGyA#2?>c82%x^M86|7$(h z#6b5y_4fZ#uKv1L@nhS|&o<9q%YXG>zi3VP<*&(80S zuDHH`Z`A(}^`9^OcAoH`BjbPeYyaI(_A=gl@cI5V(-Lj}|0kLL%#W-1dMKXfyVZjK z!td-~yx1@G&i=*A`a^rO#oukq`=x%T{=&t2!#nj?F8^<-{{HykzrP*4+*2<4KM`@b*q`)+() z_tE!m-0jQjS10@a66Jpz*WPzy|JUXJKUvk!e3u-1eQNz_yUd+0UTCr8?d(t7b@<1I z{>B^WuOF;t%CNKkS*7@d{++^Am{#M1ubuu_b2Tp zeShMAXJ7c9DeINv^4oh}r+gH8GkZtz(~axDN>6yg!aPSsXC;dsmQUhe#}->14#W7Y^|ZnzY7{hZzZWAFC8sMojqFLCemzLl%D zFKGLxy|pyFXu;p-+E;4+|18_`|6A4VfDQRuPI+C~cQH?&=iAS+OLpbIvp3|&z1q=y z%Upk};f?3FJ>zED-TyZC{Ku$DiCgaL&MCdfoA!QT?O)D&I|Hx$DQGDxzad>R@77J*$@jlsKFK3_*K_l^ z5Hsb!9gB^>UUv^E-=8ND=*=H<`B$3qoyoN?IPTpRzW6;pgS}i}&pP>o&eh+A_ZWYC zzV9BZP4Di_i5r&B+gi{4cHYy{dAIiRP580@{qp}?lJ9;C`cbN9;Z!}hae4g5EAL7& zj@SQNYd`nQgo9V>Uih>cUpiY@vW%%XWOt(Oxj^%06p$UH=!Kclyugw>;MrS^HQ#rwmW^(`zwuUmq425dP5e)6e@@>1UhaI`@75_F z_T_Krui0I&T6^P%ThY%hQM_S1On1;0;kehU13dHY~_ZPU7HakVY^_S+Ae*5{T^-;={~ z>-XJiS>@Q@+i$#!aD2Y9*0p>`-F;9&yGwlYq4fm^1#hKSKU9BVv(^6v-}U#uUnaC2 z5sXRGnmuu!mtVS;!J@pc(zgp;?p}YU93v4}Yki{F_)oxBliOQPZe`xH@ZQx~6`$iD zPhI+dUgM~*{`Aw zmGob*Yj`i7ZQa*?|Kg?jTWZ7i_N#^3gSu94l4pMRx3@!b2rKI?AQ z)Z71*oRaOHZgQ*d@x$^hU(|E&SMSMrC**$L@13T_T?6H>Z*%@%{Wae}dG6i4!7q3& z-h7z8WZ~R3(RW`}8*I!gT`OIabN5wLwr0}ZRoUqk>09RS*}FPEG3wdHcitb~2D|S` z|8UOu?g?x8uLr6{-rHR6-BYJ>>~;CPmu&Zb{ue&K*h@Tr=I+}oF4V8vD|-IrzI~et z_m?|=+LC8opZ7ZExbAy@(17T*-0AiHHqXnjtk zHeM9p;ZQnn6-TO(v8USqe_!9$@BMp!`#amxzgFMvcYS~N)&Bp(_TWe&tf8c$8I`59&+fOxr>${rz zAG+;3_|Nb3^BouGIsd=+-hQ2Dj{ouAe~X^JzE{k-S@jd^-n03lHK$d1K5i&E`E}YS z!#jt}W6xRfAFkfM`c^up{Nc4fmi#+eu-NwZ)?QoLa_+aQo+j^T&EGpGG{?U!`lILL z{)b`z7Cm|W`+K7JSLam!_dHuax)*ZCE8SOoP=C8O^{@3e_v-Y*+V(B~7w?$ppMCz! zTh1!;$A>F!Nax;h_v*I#_pRT5cQQ}xQS&F?cb0@Ko|RvFzIyT3*sFEP*Hdba6)Ml) z^4DSi1O4QB-lDBFk6(N{^2f-}E-(0)_0is%wO_iw`SiZw{3Yp{>c6z!Z*Kp2p)c;c z@BCV<@}^&-KJVe?gO_c5uG>T(JYJwY|BAh4UZ(x;b_+R)yoaal_`;s~cSV2HJbqoo z{8q4ZJlDTLD%EPhhqEgq}g~Ba^DZqa*CaP^rJ(ewq5G) zrT2~{E|g;`%KQ^}=a9L{rS;YFWgE82`7_Kv7QgK2s_%Q+E?%zhubgw*y`(m_zVPSs zpBC@L_9yS~GD-T&^Zl552m7h#A1{0j53IY_zUa`m%R6nTN@7ec@ z^G-g?jH))eb7=b7_$!|b??l93x;6RXy&o+fj~8fH-x6`o@jt9vv-#=O^$(f%svoTq z-T3^;>rlse>jXqUOXgjzJM^!<@p0Hky{E}LqR&_dRj)If*I%QMf3*GW_Wz$u=TG|- zc&E$%W}QfR^@hz&`8y6I*}Ybe-aqvlzsUAS*-Pbb70;g&Y2)!z?ELAB^9RkOGv0a@ zYVQmCwa~VGUvK@p$rD%WiT`w1*HhjV{X^}$vL-mCe4A5Y6JX8#$oqr%a>ALrJqKezt>`&*Ryj%)o}ezrc8du@5$s(%_N{U~jH{-9FmG5^!GKQ{dR zcJNzh_~cuYA07M3t}B1I_q8@C6uSIpuGh><_0Rk_=SPLW?a))l3%0jgWJ=br{iAyO zSNxgl*|Tfh3bpMre>c|MsGIy=f5Io<`o&kDH`fI({&nd~K)ln=OYs`-#J+|dV?Mg} z$CS6z)#Cj94D5rp$sb+&BkE=Q#|dK5|0jPstJd?+=(p9*EAvFQf8dSV56KZ#vayo& zBHxcKmp&hS=hVDYRoX{&YxX|>sQ-|8@6@lcpj7l({pi|T{!;Im^*gcp z&wW?soxJ|o$>vP%HFM3pqw2lvZM$9fF0J7K1^NvABg`*!zlwviQR1_|)~|G*Chxf2 zJeRem^1}|kzi%(4LA+#RaA&T*`Ks$r+pA*V70%IrlDs22Cw!@`X5P{3r|b>y1?H#z z3B2=Ye)jCIAzjf&o3G59`Fy&~w#fSUg*&4E@MYSh*v;$s^!fdhn&a&ENdQ(g@c3&b8$;Z(Z4}k@wI$_mkw&y&pM0OCDZZ|3>p{ zI?wk9n@gud0!p@({U zcSN6IUi-=W#C3(~-`sh&Z(3fzWq<09=(*vokHy<|+dlc&_Uq*5?)lgEU29#=^8902 z`rc#SmsjkL?|K|ov--n7)hqd~e{15`PdTq2*_P`P8ba=*cy4F6mkgFCugR!{4Hn797((ePNeEO1HsxbacgKc%Oii?=2IYcEQz zw+XoOwv_KjRQRN0zaM<}bFVM7TUpOnXQ%$@r>%UH9XR1PKFkZu*OWheSMH6@Gwy$! zRo;&qAG+CrY{>8jIa}_{AIW{PiO;1^sm`g6DZkubclYP18B3oSPdHzv^4PfM_;3Eh z7O^V3^W#LMPc41l+93DXPDIzfwD?Iq^UvqE^Ci+Q=ezxNn0M)S(5=w3&v&%GpYi|g ze~Gf{XDX|%7v4$oUu~TIb@7gg=ilmVd;VviSl7O5=br@qpHuc~^K0IJoJA|^lDDac zH`Vujo|kp1fAx&>h1~Pk3U~aJ$jjJY7}xU8sZe`gXt+M8hK;--UwCIl{5EaRt-mbu zj@FyMIQCg)`=;ebJ8#V6|G4}qb4-r?&i!{jMb5I?u>8641n=AVQB_-(zcklff0iTm ze)ett0`B-a`R;prXZ1g1t7qK1^k2|T;U}Kk+H^q1Ra z-+W$od^7oZr*zlXq(134n$MDV9Gv&`uf@&3*JZXps-NBR*tkpj4d+{}t^^GUcUC7&o?smaehAaW8cD}eU^SNXZf)G4OsWk`gZ*Prg~IeE=9+rMvj z>-z%xORw7hNj~|!wLV1mnem-N*Q@_E5Jj zsdop<|9ukw*m!Ss(jTWcJDvVC*1RkE9c`JHW1m`oq%e6;_D_j-VxRhs)z5SPcSrin zwS2?+MKLq&PcP1zw%*ZxiuPy87)A=5+pHm;7X(;z($MMQ_pQkVVcd}4<{U0`Ql_ptO_ z!2gz73nshk%5Sza+P$osy>;{9+Qj|5r>6c6w8(q7*;ne)Uo)BQA9Szp@mwQ+xVPri zU$cYr>Nnh1t7$LT&-)|&Mn3aD&Aa)`zgoZ6P0{|ozu?Z{dC&E`L5bM@Wu0_i^heI` zw+rrM_&=?a?vwr+{BHZh9isCK_VXTJ`$qH5|3ih_+joc@ufAFrRloD;<_-7RKFuuI z&$}i5hCI_RPmpnk(r2q3so^pI(Om-4^rPjsvqgPgs{g}(;(gISyQlO&%)6L>`-btG z`3yTt{&OGa{U-9+@J@n1#B$$LA0-d-ewzZa_I9(p=kwYA&#j}*n$JI1?(ux~hV^PM z*oy@3=h}Pim-9|N{?Ft7|4Zv9{ob7SJC|Ymqs>d}H`cXDf4klBBky;v)9=QZTXh@k zRbH^y|5jh}?a7YlKYX8+H`YCv?`ZexnY)bno9z>iF(2psox7w)X8R}cPTTz7xlT3> zF;e^+-pStLzjkuzwlQS@r2f#q=?mf~aDSEr zTm12O;o&-I!TY)UeKYJQc;Dv#X3SE3sA~TfSb~%OcH85(a-a0K_6|^Dz8#tcYHf4= zX77u>89ZaXW!{Z^I0jTjL-k?`TPF=x9Mjm?z;Zr$8Ed6>&>4OZmgF|b8kCTDW!Y5@z3?=KQFzQ zrF?&0!doVG#ru1nWS57{3cqjB`bnoIL+wGmlLA}iFNXVa5}WORO*YaoJ9AIC@lW^^ z=I{fRlbHJy4EDXhY@ZWRA*xZsYT-WNa9&r#XBBptt%>`;TwW?@S;6*T;;P;gsVv?X zJw!kJ{CDe$di^Pd6Pq8s+HQT{;6R|%l<)Env>PX0+S;zcJC}d`^PBHvSbnb8U|$C| z#x6s`gxY| za~7x7S=$eeZQh%cj8C3)FXWzY%f)d2<7@9Kp0#!RUgkv>UU)S7OUyr0+bM1DujFqN zR|=ZGzVzaY`ExJXYrZ=-eN$}IW03Mkv8&=YiNC#MQJ*|L+4_pZKhvK}MdN2UH^x}C zJH^a#UifEmvBrzoLoO^;D-8r4E&VJ6o_p%ebFRI;y#B@p3&Dfy4|H;zDm>I^;a~Jo z=GASxSgDCOlrMQ)bxV1%Fk?wp^$~-1r^-CzLmb5#Q|e3jSdCv82sX~Fn9;F7MqQ@k zvx@lnh5O!Kw$G}+VIbJJoCScj z>$WHR>u1aI8O{giL|ZNY+52bFL+dZvD$76fa+-7evby~s{|{IF4~@Ksn{PWkuokK5 zvzARS?Bkt&Lj7w0!);sCH{bqtVIA*n{-07W#c!XtDxJ{%_@Sr$$;PMN_R)^)cf@L* zTbXaUexm+aeV*r=EukWY)U)Ys`9l^)7$sf+m^iSLVc42J2^fviVrkC`$&3|q@9c;ezsf^DvA8&iG`|0$Jum3bn zzp!rdBd3;XyXb_Pwa=~JSn_RaTsLR!2JWlJJ|#R__~svP7yCawySC^bZxUo`+MCW7 zw!gEo4*KZ%HF<~b+mmm$*>1@`{f&8_+pnYFxR-7T*6V9m|EnUN7gw`zQ+BpbebqkY z{RzJx{xRFKdc(Zd9TADwKHvR&^!qyZeTAVh4ki8U$9vyCzrXP7dBela+#1tg9WRK! zHTh<4b;k8+Z=ctkeIt2`|CN4Z`1;3HA>ZDJvb*Wooj=`oyXpPB_+?l16}UbEWum^WJZGzTwODgxZ+u{RPD*e%9XoyF$Lcr~dSk9SI+vEZ)(Yzp3`sKUprj zJMT8jv44`iG(N-rbh?80@xznrCUM*4|Kur%{&4rx=`H+>=jFBk`*i(#c<#FHhX-rs zyq9@jR@R;0(JrXBD&&{?aow7--^)z?G3gy~p5ToZ=wZKFze%sF_xLP%eeos#8Ry;Z z{}KE&bKd(o{~doP+Ht?tI#ZwC(f!lse0lzU&4spe^J7HB@7;TRurRsq>&$Kf(FQ@uK~mpT}6f zo^Y!Fd}KE?6@le!Pf@5%ahZPlBXudzE(xP8U`kg$6PSJ-E>*Eea?Q-Zxa^FB=Z-}d(yFZ$Aag#?fzbFv@ids zx}i{hk?fOOE?w>V`;`hG9}=y9zd@uiarK+T$L6P|a(^uNq%V`|{8PbqiBJFAht^TI zg4f=^8(;94?bK9ha{+O2tH66J{yvM{zbUa?Qu}{Q`dv4*oaLhN)5s{K4a@n@U=U+{&h&T~UA4Q?4Z4yC%tJoHfDw2j5?Y?R$J* zx~In4m3nUf+V@zl=K7@ieDmLT4;80BU!!j0WLh~Vi?+As7mC#16Kku` zE4s}8$bOF{&rhX2Ur&9GJpF##524$g5A!6RFP?s|E-_9c-^F>JiMrJD$nqBcN7-}K zUx?eD>%KE>hk|~O@gCk^Pwzi3Y~nKkn5P`!tHae-FFQTh|s|*Iu_+ zJnpPxVSnA>U&T)=njeYntNH7E=6C_~{CYF}z&i>4hM>;X9}jE0xewnyo7AtnuIg@B z$87;tErrJUO7JhGoRu8B3~_~`wV~AOv<0JXFpfXH@8+$`m32-^oM1~ z&FzO4?^)xvdfPhI7>g*mC!X6yqzew;&er=LyEAIv(U|3rjIFzWhS^6o6g|Dlz-aEs zS}**x``rth2YwZ%4ioxMRSG;f6gWj8zBD{sANZtvH5FHQf5zxNUH#0xKJNUbGspA3KHCr~^VIAAk)QET zPOIp#)+B5{(Eim?RsISiv-~yo{F=YL$Le0x{>aI*J+sZ?TmJ3a_Hm-SxlhOMY1k!i ze_pWY+%=(2Zndrc!<>3Mne%O8iTnQj zJ|8}5O^d?j{c?Tv=2^_V8-DN{wm)tsv+uSE3+q{t^ggSUttY#3=DpkWIk;Y`NYS#e z?ohb&!}FV81<&4C{CAJ2A8(hU-{ZeFO8Ymht(E3ze)A{$$72^C#IN@1M3# z!<%6`8S~$+4Jkes&$jb{4)=pcv9%ia)me6JHa>CvVB}o4n&AC$i}MfMU1am}-95LM zEBYVSa_y_V74f6(;?Fm?79BE=xmrJmF@Ek}lll5rLcir4Jzl_l|H=J}ntzXejZQdS zcOiPm!uH2r~m5vlWnj5nyY%?=(kRv!%XdL4(l$yKQ~=rQsBDW z{r_&ww?1pI$a8hCfa5>YU!Fhz1SEX%pK|`t?fs0`{g=A$TlxEeV(SxgpNGA3GX3f{ zGv2Z2Dth8HN8R#~#^?AH8 z%vj>pUwgFY)$x5>B+vDiAMN2P;=R98KIhb_5Btt`UVnS?sh!T=zveMLdi0yE(SN1<(cBFGEKt)3-ZFZtGGU+p!LKX62=DU`Y~xPf z#PvS-#m{p!Y;W7I%e0h<#uYd0_+i&N@BKUdANv?TY2KH9uw&!jDepBE^!DWoJPG_1)v^$so?X3-e8`jUXb^cu`7XUW$O}%E#e5TJv`}`L^-~C*C&olKCt?z?b>Kn78 zztk+Z-7J6VAQ$JUcGvAEtE2v0P(NoLxNgq>LfdWa?=v#|ch)W6pTfOs!%Dpq;<2v0 zg@ym*o*eoXowj?jV$9{1qEs85g4~&p^BmXhG3x{ek9YN|uhxH3XTJSVbYi}v-kJFw z-Sv+TDulff_Jo@@Qzmi&)%|1aEgGIP0!<3H_FjoP3t zk9%On-);W?S0vu$d~|(bF^gqPlzhRwCk@JGZ?4yYTF$Q3CP7C9JH8)JSr*pYMLY`9@vmo|si<({q3FRX@A;-D~a1_0lnaZYfOQ z*2)qw|G*nur+@i^Y4%Tsa_7BEYwBe{!`us+%p)QzJsxLUzX?3Zyf;?wsdV{No&5~* zC$`p1jt!RhskUQZzzOkn8(sEajhS8fTw8yKjHcD6oiVTVi=S)TywERR9?i&EQ{blb zfzw}8Nq(M{v)$8~JWmb>*PK{xIoa{Y10IhDr+0m{`LuTO`Thy#pWdoCp1sWAUhKO1 zr_u?nGC$cKa#cP!z2!gi&T08`5?a}R#H@SjJ$b)EM~&X~PY+FNyZ_vBKE!@~GuuAb zaCsNIIro+37uogJRPYLa(p;a&Ra3wl{6IMFa7&HFJ~z9k6>`7J_iW?-UH){dlDJP7T0XLzF<<(a^U2|#@}D%H*B=l+Hs9iW zSf73ItQuLKTl`Nh{j9z>_ixO9>0=*lmv{3&nf2?)-FX)E4%J%E`77mXL~q!He=FH} zZC>5l@T2LU!s_3O|BPApwAjAqA5+oF{Rd1l8~L9^*?sQrI{)-k)!jWyvM0N(5MK}z z%y0Sg+PhnN@~`wYu3u4q_sjO9=hx~@%VYKz|38v+-m3kV`l+d3b&edZ;y<VVxZ0;)z@9aM zyWHb>%4~_Yx{trOzwy^8_BHiC6tk;tl-cKe`#)cT<&Ch;|3EnyLuK$~cn4dlm zp8U z)hzrQU{}+yJ|^zk&3lK7cGqv6Kk4IgP6tHxF08z{z4n(o?`uDS{d{wkPduEF3a(sk zY>5B;@)QTBVVH%^*o@Nh@#c|Hx#^AnWi=Y7msK3{d}mK(F}Zr{H2)01<0_Se(KXA&IN zJ*bYI@?ZJRMp3PO9|}5`JgWX!c<03O6%P#U)+j8v=VjNo+xEuKN5AJve`jvu{r2xs z@9*}_cmF3;Ge3I$tGZ&{!TR`#8^jgQ$)D=|{;i<#|DwJ54+_+bR(;z3?_SgYW%g$r zX4JF2`u8uU`JnZq*u;~mzY8A5Y5bnb{rQ}V;@xMhH4)of#RI3A3X1nHozngP9FLCf z?V>v?=70KBvgNt*ec%24Y-`0A{AYQ4Uniq5m!Uaqr@7R;lAdhA3(i{~ac2wOsAtxm zJjq^D{MxgCburvW)IS&KYkbPQwyJ-kg3U&Wtmh||uhA{ObLjd+seRl2ZYaCwv;U}B zUF+VhnOmRe-;M76*Hj%Gu&0 zyEo;IPTt?fDpC8*{76HAh5xhgcypfXv;7<=cWTy#aq_LanQjrUpqI(!miFG;u66#` zyNUgs#a{$py?ViUs+9T3VXf2;HV=25c#yxey|hd5_R+hSR=s#9@GVAf-fG94Me)jy z9@#}qx&OVh{@*q0oZa*1&5xJsvatSUzw^QW`!NRJ%$9O&-#|4Sz-593ET5e z=f5`(d@fXE@5Cr z(9Wd(rF)}I{WyQd*gZ3=Np`dQooWagU|zR<+WV99g6zJWXYv2s9P?T4`cnBHik})| ze)8S0d7k|~%_3O3{z>yXJ<)=PKDiUl%U5TX%*z$O`r^F%RI^Xwu`&O&Po-bi1y{No zzP|iz_xEsH>%qVuToOI3KcBEKWMy2X{{~k2e(XSHOvX@d)R5=UsQPP=QjWU^&1imb3SStpooUM zd7Q8?3EC5UmO4HT18mFTdfs{m0o?dg31f@0@t9Z*M3igy=`O4>x%A)U*L|}~&WkUr{XRW$U)=1~|4e?}*S!>OpC_tRyS9IQtp!xc z#*3MgIm1}~Zd=jveh2H$53=S*c(-RP_|yD;N9z7{n)Nnq)Bego6x^%;9TIhn1O@cs zwxh={e9#6BiOSh>Tlg2fwa&Z$9aQ{%pK#Gb)LrG?VrS*h0pQ2-wyMjY`{k}y zU-XYE>!mj}-=F;5`)%^8>yZ=H=e>G+eYKost@!)$KdzOl%00#6Hca2JCnszA+3s%= z^S;;BAL?HDP{i<5_}$&wr!(}`-Ty9ov%F*KFW=_94w7G-cLwc0`nvDo)7S~#@xNNj zKOQ=LNMZWE6rZm*pR&&gu^0oE-H*4D_=hyew%qowo>Axkr zeT{kAZuaZ@owNP-l*g^Vzjfcui`AzC=UF|J3p~Lv3%~TXX79w0py7!<-<|Uj9T0Ejq67NrpyBGu53_GoF5#+r za8s{-GS}5ynZoR>IC1&IcYj{;TJ-O98?a6}ZE%$5PZd|kX-10j2VZ86m^fy~-PaT?WaWQWP^YWRtjN;c%e*IT@bMn^Ujmzg& zdEVQp@k1i-;pXSzm*%v-buWzm^?b5zqOZ#t_8sr$KcA{!zqH6wJAPAF&Aa)TMgL=7 z)ym9&ytzj9k*t`^RQ*Dw_;04mj=K9OT>lVje)#vYGtKX3UECdW?zw)X>)#Un$c6H0 z6`eXi_crTI|6F;L>96YRccD5vuG{vde%={+<myD4vv7fAQTE9pHEKhLap{n_+8$#sSHr}modXOMp) z-furW`?L2u!~F;TuG(v~pCSH(xcv2uzn4Fs?&JP>RBN-s^v{lUoWD3fbN@&bKR!Ra z{&i8|zm{kYr~m4ES{0t8#wdCuuJ6lhRrqx9&)i&&$s;_%P+roeZ2H3;C*K5`KJr-Z8ll;{X&`6H=f6pvHwBqn-*93*RA+&^7*`ab=xji zZM*O1c|JR(?p1&F@ZZdZ@?qDi71kx!?>YR#HS+z*g>sL+&XakizpKih?%l4^UsrC=$`_q5}4ngD)C*vC)=P%pAdt86!)zWPf*q3~r*TMbs=wFYh_nkEp;%(~x zE%_>ULVw{s=AS-MAZIZB6MCiZ`^kI7_a_0%r#usX(ELZ}i|{k?4~P5u?U#bws2KPD z;6Hzao4t2c`9Ep?SuJ$_e&)V!AeX7e?qx5V_WpCU{Q1Q(k@^gGHY7_vo%B)tBL8dF z=f&4|Up#5~$Nxj`-1GT{_3{1p{Flak_mll}*7nQ$1Lofk$=>Y$Rhkl~|LkxTH2D= zev_VLyK~Z~SD)JzWt%sJ|F?T_PxR>y>-$q`Z8mBh`>ZbiNGV?X?+Urw&2y!1)eHYz z^7eRv_C8PZeQtk0u=rl6zIOGsfcWFs^W`@-$MDvCWB$D3knWR$-@8t;)^u3^{G(WN ze8~)Zfqm+Kr_}g=oASE+2lu_U{`Xnze_Q;O`gY6f9p!)C#s5`!-|E=Be|zrn&abLq zWq6Xje)apllYIBw|4#7#>9=#gzHRTx*ZPij^>N$FvwwaF`==0Zf8hK4|NH*0wdH27 zkG{8Q8)NAKm!BNP>_;jmDfc~CaPB*(Rcg(5A>xN{q=bHu+j#jKW}x6@^3+xt0!e9h}M5?MK(p5hXC(8eWDe`>0z z!YcQNum2tVI(zullryrS^iK)Sdpl6I}FW+J}wHF2wqF9iMgX(8DZl zrrp~DPB8CGd;H|&^W-*0^Q=X8_B*e>FFZeFzk2nlul3g48($afy={C(*5-Rp(Zgfm zM`9nWx}Xrg?S9hs7gGc_JXb${bl$F6AB1k4|7>{YP`at!4?foUkKOi#{W7%O#%{fR z%ks~eUz2xCt(*I<(Dn+yI9Jo2>$*NH)rYPYSM57JFV5lErYAef!sku4YwxLg5L&L0 zUgH)l{NH%rUC(tjck2%q?|LfvzL+szBivfvUh9WM-jn2iD=(ZcJY9VE+p|s6@;6LZ zS!~<>G0S9v_791?qucjri7n(&erSA0_Z4(4+R>WhxmTC(Z@8x>e*1Hy|LgfY=C?M7 z+Sq)|d^^)qj`RHI?yt!^qJQwMtv9;Um0vgixL8eF^@q9db+dl6*LOw#I9JrT%YM<0 zi}72&#jL&G`H}BaSk1z}IkOvY%;WifBcsIc(3TpJ?H_*D_+A$YC?IquR6Hw=Uyng2XC+!s{a^H9so<3&%I~6qe{^Q)q?rncT%fNE%yQJT0o=q1i zul}ISI{)p;&c~f6uXSyGTrb`w{d3E|m%m*9%dGERUu1V#fA93Q>$2Cq)y%cO9T0u< zvR^mI`K|ed`=|cueyiB=>u2q=C_9j@ZzX@5Y|HnleQfx(u--Ife$;<*-g7?uW6T?U zp6!n&|KdK}`|ZlM__`PJ)65==cSZlWX7)9#tNQWowe8(M{O-)&|Ki89zUTg+=T)+NI^6VNjeVh74F`!j%52M$vQ#(6fr2P5mxwj)%%7fM+Ue#RsEAUS9 z`Bxi2!*NHKe>rbc^_TUpaecqte$mf&3zg?@`|Gx8UBr)NX0NqZ$oD;89AiH3yz%<> z1u?JY8?XQVEu4|ijMVF;U zJj#b0Bu|M<5nYoB%fJF(lL znUH8T1x4#I=A*XXcE^@->&hQq`^Yit{6itP>P0a-?>QFo+r4g|`m^;>-ul`j+w>Hl zChuUMfA;lK@S3zM@e+AkmT$A4_2U;8WYHOa;U%MgQ9n&F8H-1nW1NpkIL z?T^29^|fM9wb7j}|6BL#jX-NPe@Px)`^WXv^x8i{Kd!00whT7E{CBrT_^;{jUM>zDuD3+Del zeag2bJIw7O>mKefuNVB(yJcQaQSNU>y;s}SMOUBp_$l%3;PplOtSuu_&)56B+84EN zMSNb6|Fa#f`I$xk8Xvpa<^KP0Wcx3>=#{pT@4m6MU)l0)$&QKsS?3q3S1$Rmv9_Gc zZr^Zy$RC(pO_o`u^Jo`<~^|2a+Vb+3&1D|OlWAaFW!ix6+C z@|d9g*0YfN{*{#aqKC<^El(`(Ew6T1{;0V$+wi`u`KQdcFMqZEkiPwid539LU zv-iSRWjXb(Z_+R8YNurXZG9-V?@CI&(Q)0H&DVLCegv({{#M5;z5KwX|6)%syXroh z{pZ%(jq>X%g>}wqf}6L6y)!_gMbi5_-kvPb-uJG~{$l*|%^zKs%Ad$R8G0st$L-f~ zGd9O5JWJleet%`o#QWkO6-uKbrP!b8)@X zql$zb?DAjS4^<@W5S?!VPLP-WH9iC_ng1MKskKkx`pwCY#O$oMgI4pH+bsm8iG=iz zH9X&&AMWwo`M>88+rE{XRXtbMHB_JZe{R?08T?;nub0=Z);h2J!)E;@{%7@vtj+61M1(zXFvCytGhG&vpp!m8OmEfc0BD~xccY( zO@B4=9^Ce=*?&L!0Q-)E^P=h(?uh=Pta<;%c(ye!aHnx&4t} z^*3$rP0Zi)d)rn}@$|kVY;Aqeode6?_G{#ASibGA#=Ew+w@$_9)jUsd%l7Y*{;}ns zQ{nb@i@+`SU;Na$!)_5<>0n*IU`ONnsdb@y{J-sMou=b0R)% zy?fFh%lQ`j*UUSA=xd)5tM{IVvzXR{^zSa3A-d6n~(q5;R zy)F8s`o8|pebHOz|Jdi%T|Q_3`=Zs>Gh+^yAHN&-eRt&F9-Ga7um6_tR|?wK5@rX+of-h7i_<=ZtWk{ z4>xVqlE6jdD}A2w>JDMn`De|O_nn*joH6yk19)+N;-2?4*LSr{(dWNcXYt>8Cuqt1 zw_W_-XPK}3y8D%_;=c+0lJ6}m?YL`hf|ua)@5`Q}e^y^)`=iOA?6PR?(i)!c4|cyg zbE_g@$JF||$p!V=pk?tVpZBkwKI!YtuX*c#m+SuXS@$4$$L-g#A6N4|@mB%m@}tXp z%DZ;&eN%J3c-FVaKQF88e)Q*1fwo=dA45Q0MyME#))p_>fyN|n^IbOg$-*g$I z_W$A!S_Cdt&r{z0R_kf-Ij{7&wNGTIr7hZVh(DUB`Q@=d{E%cjTc&B;&(VAJ0#rAFVwC#SJcd>s7 zxE2C00rX#4-)C~~_R;3~$GboB6@ju;VSTpn|0O$)*RBe?9`?$;P}}ZhRr`AOC4ATG ze>>W7K6mf1cBr2nv;PYBZ~Lz5HRUm1tsvVP)@?8Qt8q*C$)#`6Isa!qmV4bBUU%`6 z;hp6AgImwr_MZA`2wEV0yZ>R>w<*8WL4}dmPlFh>BgUt-v%lV6AirjF)=##1_RkO2f1Wud|JhHTYa5sR?0Fu%{_5b z`$?~k7d)<-8fM=neSP(oUxs(O)?Z(jANP9YMf=)XpR?u1*Zx@Ymi<@jx6NlK71^z> zS6{!Qp6Sc$mftrMYgNzWC&~ta)lB*3@^{1EguB6~&8zmX|J@U}ZmarX&?XG=H!ol7 z1?{^!rK?6G{8q8-9{Ku5!QbACly~1>cxL|V6Q7^I`aUD$r$pXS^{>+>eqlcT>*ChD zwNHy}o%Xr?UGmTJ^Pio+Y;_?E%imf~uCGg|-pgHao|$Xk)Mw|5G!8skAH423$kkKp z68vM{U%00H_fJIBM;o~-Tf?9Jv~SzpTD&PU^xA8QyeG4(Q~&lnbgMpBwzTQmyuRJ7 zWmi8r${K8$zxTA}H*t{4@TmI49TWYt{oABpuU&gf|I^K#F@-h;cf9t$lj`dFYJ6u^ z{og4y1#_x4cdII`ftqp6wtlU)!zow%$`btIxANia+3!W31^7;a6uaRV>)y zUi(k#Iw)9T>L(lnZD*PC(V=klSN3|)V*Rds!E^UD^S(@<()!&o;7-({8VwiZp3lnXW4DhKbKEfUq5I4u5aq@`vhOdIN7yHpEuXK-T&Cl zZfSiHXbZz0W9SwJv3*Zo{{^)fPb`0P-!kv%{Gfe574JP)`)T!o^{?2bbE_Uizxb6q zG5fW?_33lde+mA+U7WSob?1{mY7d(~FLI5$a(ZcBf_sE%P5GVXeBJM#d#nDw+tHd| zRbStFa>=#+hjKNQ|NHK&{+hf)bpFqYP3Mnazi3}uv-a8U$71{b*u6Puzea!OgMBx; z`yYY|?Zh3?TQ*Mt^)kN9D@$$ndpjRAgA{V-yUQ2pzx$Raq-);)m{C7JyZV={)2(mG zJJ{vVIJbgEIsSr*soST|O$$Hzw*2_rq}^WipScgO{WAHPKWLN5qLP!W~oVKyCWa-=04c?96`F{&Um= zRh&PbnLT#wivE!>f1=4ha3=I`i@q5QDtlM|^*FKpL508{;U_`$i91^Jj}~s9P!ICE z8UNH@pxnLW-^l{)YOlYkPd`t6;cm5W`2J-psNTpnvXgHAUV87V zbXN5tJB!TUpv{OsEg~dAThc%dUHe8e*S>A{(X!m9`l9zkzNMCDfyzODSbY}%>0{o8 z=XcWnHPk5nOPf=Foa1k5ZG73Chhp^#)7Kmqw2P?s2yXxVgY~z)zg<`Kk3+wfO#r#^ z+Ivt-SlbS?jq23AQxyw#fVRL$z&oEjH8pKTEB71RX+D3A^=M7`oi2!#8#XuT|E#ck zGX3OlSCI4}^G6lo=JOWp5S@P|-Yu?PfBql2gxueTAbn?#)Rf=R{WbB*Jf82zmao1Z z2wjA&`#AC7-ynha-m`y!Hf3ect`a+X_ovXC*P-CLYe&$Z`+GN`@J4EL!-}B zvOefem%n7a$o5Uki|pLM)uZhjeUF^`9W(Tg#4rA<@iMXA-s@EEtLvE$AHTkmQSVrF zBYuL^TYV4y-`tmOEd%ZIv0eIh`=_rTu4L@Bw_Wpnx!Z5aONZ;&rg;BNefTw2N}Xxn zrjuW0t$*-K;?&f)ph3_3%jWqMa?jsyul5z(Q2yKc2vj$DpTBOsNS^bjk^KC#z1O-m z--+#ael>sQ`uhH()jlO(IYCJ#HqLV1@*VEKZ|?9tb-X~ke&Vg-r@!|;cYA#lRJtpE z1ubvix+(p``K@PvF(0+Pwf^KUE>OQM^ZcI;`x%~k{nf~O`1<2Lb45^7>~Qsd>ma$S z;A*+Z#<5VlTI;o~$o5a-hVpOhne8q_&$R#i=JmaLi?~z0*OqJMJ@nq!rwZy)%D>^h z+G`KqiDwT=y0hXXK>IEC&Ah(;Vm_p^X)+(w;<)t3=<_d|ZL6n%GUcg{psi<`Pm_1> z-p=Rz9eBt7;a<*6(8f>kZ{i%F9v}N>iP$~Cce?yv>VqQ0Xn(++X8v>avh|$ub54sM zV+QSC`&Hf*y>))kA1Ckzfzq12@}TX3{J(RjIo8B;KIHyrH>os?_5O+L`QkT@gFC?S zlmFVDKKxG(6d{j(mrr;5oja}lui1@tLHj0N2XXJpJzhU`ze?RamZz8gnSK21;GMO3 zpHm_C{XZwa?)YCJ^;?)vE)K2yXsus-Cq)c3#p&)e7U zSoZnd=l$}|64K&xvX`IF`*QZlWBcv%yQh7>eZRK$&)3J-`|Imf6t45En|r+eo3ZD= zPsjVeefIzO|NpOwsreGmD*5hz()(xfU1gu`yJr0(?+cjg*xU2_XMYTQYiaseWa=w{ z@{2{QY<2HU)i+6&FOB`0J-hJl=81>WAFit@zU;p9bIxC#J3Z?|erwhT-aq*H{I>jM zW%HJsJ?dK!f7>+Me5TtJ;~zSA*yE-5C(G6EdwPD|!H2gWr`4Q%lCrO5_Dy4fzekV6 zmh2At*_PIEPQ3o*F~(o=r@TL|{3gBq|BN^D#ojgN=bje$QB!?qYJOHt$hGrt{v|w2 ztGV)x`)v7*SH*vyE$i-+X4__~dxt%~YjsF<)DB7ctMkO(EqWWX>aWqhDcb`dFK?aw zQasl5-;JvJZFQXH+4gGl%YEewn@_*#EJ~|4C=B1XZD!J!yq7g%?@m3J-v95}iNEKM zoc%H5@4<544!+0B^Y5g;i2M2L>;3}2lae)J@0#_W9=zCkUGMUwAKyT>#p~R8di$K~ zF?Qka2cJL64^H^Kymj_R!^g`zXWyKBNB-Lm>;EdBdfno7f2!v_EAzC`_TH=={QFGg z7jK*2I{Rbb-^+*2zVUopFZOQH?Ww2CZ+(uQ&sMt0R`*U%|1AFqu;#Ny_mBLPKeh62 z{~=@AKBfYc{>hKKZSOhVQM`S5j{o90Qt>)>rmmk{DLnQ3q1q2izoul_Y%Vai%c_6> z<}crs*|+XnSJ!pF^?LfbNYD9Wsq44mUyk3p+an*H)~YvCJ7Eb*Bz^z(;ef2M6zziO|0M^^r#y>3jdKS=Uc{EC`np)9)z!GBqQ7SssTKfd(y z+YascplN5Gr|xyXDg4cL_g~bAIjf z0yR+jmX*HsqVd0+KCZFvNVh$Ax#M5vLp`s2kPjv0 zxBgvLqUUwH*yHu?JKr`Jn97^Vn-qrcyLe);M9t#4^Ia<^{+!>rdqvsPTbB>j-~A}~ zySa7s+moPRZhpT~XKsG~?$`V-)odqkhyLeIy|&)>&eZ(8JGa(-sYrWh_akAR@0Ih1 zuGU=nA^B^|yfwG@pM+G;+MykPo#%C(^6tMrci7`6{%r2t{rK@wf8p@kldbH){;Fx- z*tc7w($MZry`rq1(&xw>{QH!C^DEZhc z=g*w)xO>_s@w4VrPp?PvyUJ9pC@=`SJVz1Fl?Z&okU{RX0o9 zChFnccUO0s@V=;BrLuKJp8BWtNi|;gjOzQC-~Zf|*nQ^o!SX#qc2?$j()$|%4!55c zxX&*it`mE>eYbMWn$7p#erfg>cTU=Nng8Xtr6=ycKUX_D?0d}|4jXYZu_?hnuc>Z( zE5iQj`oTP@sppUM)@=6QEUh)aGy2>-vpmOo!I-!Dtv~jp{NJeWRVwvCc|!5eW1em1 zzpYmsu79aG|HRIk8+G5x1>Q(r%3SVjH*xx7=btY+UWVV!Q)#H?zklcStIof&S8hU7 zzII*oZFjdm`~8C((r@`%KM}T^y1sZrRZ=~B>9+bK>_uAh-!D%KO`iAVOZ%zoKkJyS zA2EYe6hvSD$Jbt24YzybPJ!Ou0s=xF{iml6Q^QBt# zXJYJxw=bx>XurMk!j=40S$|#5U47rNKBWG@$AvNfts~;Kw!|^K_O7b?{kZDdOxIiY zylrJ2SDb#R=X^)|&#R&zqTbh^eh6Osp=tN=$jfz#n|J;8bl(5yow!cy-MbU-#wPLg z)L*^pFZC;`#6I`st9R$7cD=iL_dSUCpZ`woQoWc@>Gw_V>JDDIdRO-PU2DyUVR!ew zIk}d5+PZh|PQ2qYKmIyo>x$j+8%j#c%kSM?f1_~!#wPaox_c)quf8bW9;>l>vFFWq zr3Wu36;R{CV@*a-F6uuWF8u+1IkVZ(_jD zUwX3K0lzdWHS6sztpA>Qd(RBp-zEQJw%?y{&+*YG&UJbAYVx;)zdBcH+Fjwl-G6es zo!Yc#8#8O`0*js*o(k04xjK2DM*1gTXRV@TeYOkcRK7WQ?Cg(8bGbkDzWw$>F5F%? z{Ig;IU)j&B$;O=r(;sHpt*c|N39d@%Sv|jV_0Mm==6Y^YpJ_QUXOGYEN%;Lx zw)V>G%4heE>Auicf3tIb%=~)JU56*!t7_9SxahNj&VB!4e4(W-eh zo0tkr=c~_KV)bOQut3aTpP151jb}jdm>IsV?o@o&&Cd?@H%u0Mnz>_Ee*Ss!^WqFe zbNhDieEj?JgsAuRmnT++?I@YFcvtnqwQsNM#@@ZV@oufzvHh>!sq@ypRdFvZe_pp< z-Ezs)FZCz6CKme_$$a!xejj1sWB2tD$BCKU%8xBfo&Qw4x7#i7M2hj$)18G(_wShB zFTQ2>nAvi&{*j5VJGtL((Wrc3HeKlhD|dNd(X#yy=1s6Uzvg?M%elL|EgwlUpSSP- z;%qtjeNWv+&CILw`F|$lcipN}TlZ|Tx$63Nt(--^{xNMo>g%eCj$SggwYvg@0 z=Tv@4YEa+hynCj`Jv}F8?{)Y3r^bciI$H5P{NHcYUwePlsJtQIvhZ}pee>tVY%KBh_uI;3 z`p0=k(8K$m?|B^%-%(iMY+1Z5|M9BD#vyjn;rn^ZxaDPdCy8H=UzMrCe~YPzw_ne> z#@;4wV+n8nyS@(=zcg(tmuJl>>5pgnsp%{o{@E~lmBWws$HKB69e5-1r2ft<`$Dl_ zf68N%Pn^I1_D#Cc{0C_@tyvn1@^fmIzDj?bWw-IO_rv@BnYB(6vVW9IDk=Vn-%!H) z|6Sh)es;aklLo5k_imXLn%>`ME&gEgQ3>b$!PB26DSiH9?6BhD;na@z?fu%*);&DD zvs(Rn)~4>8p$oUhl!h>uK!`~%Po%E5*QY? zxldQzCoi`?Vpp4cxqHPC&n_ADtCPi_g~`RmAC7*ck)9WOV@Fs2E-{NO_jb&U4cKo{ zcys;*t(EgzcQ3fdc7LVJsp#*wvMtIal@z1*CV;Zt&w@Wm%2$^D-F;`T-rL>xuixs6 z(W?)?$sTix&GM_z4@LRXT=s&)JkzInzf_;z8o%NBO1~@qw|luARy;hF+R;)_dhn8I z%uee=S6?i9yJ4|jWJ^&Rr-pF&=TheNZQMGR@}J&*wJx=|#k!JdvOw040?9|eA3p9{ zn*F1oyoGuli4P@AS%0&sqM;ES?Tb%dkTI!*xOvo zczyP2zTE7(-UI8F)Z04puW=0Uv9IU~x+(m0-%8@OmlWIM?(B*ZP$YcpTAE!^vc1KfBYf2@lNRk)vYH-`uC7d+ zB78cu9#m08%2rNMUnC-bDwTc3oVsu2F?$pBIZSPK@l2d;J8vr_BXQ{4^sQ^onxZj( z`z6o#qd#_8<|Ilz;n}xkW96Fo@|C|*Z|AnMGc0W52c=rObrHMT_{-gY97t~a)Yhi= z!J)Qdi@)o}((-A=T;aPn=cr$M7qiVeenUz9+jH;w-tmN6{k`IC7=442@u&Dy{_A#c z-v7{AE`Q>9`^4x^OS_!+?X6oL^h(e69W#e%%ub$(29-M#UP`UIqx+C+*YuL;tsl?5 zJ*T$r(d#=$sv}Pv3q6{%vc_zk-n`xMUCTZ&zFXAAX8bcj+i`07;psPLJiP|0GLP47 z*0PxVlcnDLlW*q#BoLF-$<8hW<){hCYezNPlJ~FQ33b+3>_m#`%gp8oWQ%?(UK77@*GphQjikRg0ic;%VB!AxL)$n@0a&Py|0(N57FLZd&gnMcUhkNPXY2LI1l%BuD;~0 zH-C@I()*2V?-TYh=RW>7&DMW!|CMvmVyxhp`1rS=^eCiM5KRl;@uT@>---P*HYc8F zD&4Ut?f8!nJ{#_J^G<1g*4d$Tp!KHcW`^li8HOfrUv>PvY@_r%?RdR=O~_xLn7eh? zx#|-6Lb>biPF;JgDSrR;59{+zK1>q+JWZw~`m2G$shLM#HGl7oPTvuHjJ-&2{taP& zvxT-Z)we&`vu)jXjZgQs-oAOEsm4y$;pw&MCWXrPA8en>tvA1O_ouVBz2v^n{95Nx zJ@eJfuLe2V*)ev)<(3)YZMH}AR@KL;-`L6)S0cB|Qp&$yHnRvV*MAMmrE2qMsPwLVqcVM#kHe?c_YD79-n83#K=xQ} z=a#bPo1!_zbz*mKF8;nw^&ofLF9qh$sp~VPF5Oo2h_I>SO0<6JtXtNXZC!Cz^-Ivx zw#opnsTq!cH@J8!{%t$XJLR~e`33(c{QKhV|FJ9H_tV8Pm}fM3N{6kqxq^X0kb(u6 zv;>oe1`x_{@|ligCPSmi2A!%*h9;BkEHpQoa9S`LZnm|kw`4Lj0}Tdlep0wz%+?TO zN`6unmyHc*U@$c=1;jBlRxnTiF>GwO^quqbN>cMmiWQ<23{4;wm_n$@r#n&@4JYe& zS_m3(>3e6UfYgAr1}PX$F6<0oG@N{})0EZJ(9FPS^6ySLC`+y@%+t`4m&*VS6wFLb zjZGEOAYz8bmZlbl3Se1h zOic~U4A9h>SsI#IqKR1;n_}2uX=wm9uin7G0Pau&6GLN6#~T}?S!`%vVr+_LiJ_r| zxe2;DV`CGrCCGLdTN)z=1~?=QjV;ZL4JIpgOEVfyw&|9THM9i9XmLqmQAtHnY8scJ Qv89E9374v>tG^o;05>o&ApigX delta 294 zcmaELoa6m8rU}N|FHL9UvY7nARC7Dq1;#MT$%WY(+gmxA){8NkPd_$|(RO;d0#n@d zYYI#jT!viw-kB-I3egJFNU!}+-2W6gBWD4`J Date: Wed, 17 Jan 2018 20:44:36 +0100 Subject: [PATCH 044/104] doxygen update --- .../html/_antenna_level_8h_source.html | 51 ++---- Doc/Doxygen/html/_application_8h_source.html | 67 +++---- Doc/Doxygen/html/_battery_8h_source.html | 51 ++---- Doc/Doxygen/html/_button_8h_source.html | 51 ++---- Doc/Doxygen/html/_buttons_8txt.html | 51 ++---- .../html/_chameleon-_mini_8h_source.html | 51 ++---- Doc/Doxygen/html/_codec_8h_source.html | 57 ++---- Doc/Doxygen/html/_command_line_8h_source.html | 51 ++---- Doc/Doxygen/html/_command_line_8txt.html | 51 ++---- Doc/Doxygen/html/_commands_8h_source.html | 51 ++---- Doc/Doxygen/html/_common_8h_source.html | 51 ++---- Doc/Doxygen/html/_configuration_8h.html | 51 ++---- .../html/_configuration_8h_source.html | 59 ++----- Doc/Doxygen/html/_configurations_8txt.html | 51 ++---- Doc/Doxygen/html/_crypto1_8h_source.html | 51 ++---- Doc/Doxygen/html/_getting_started_8txt.html | 51 ++---- .../html/_i_s_o14443-2_a_8h_source.html | 51 ++---- .../html/_i_s_o14443-3_a_8h_source.html | 51 ++---- Doc/Doxygen/html/_l_e_d_8h_source.html | 51 ++---- Doc/Doxygen/html/_l_e_d_8txt.html | 51 ++---- Doc/Doxygen/html/_l_e_d_hook_8h_source.html | 51 ++---- Doc/Doxygen/html/_l_e_ds_8txt.html | 51 ++---- Doc/Doxygen/html/_l_u_f_a_config_8h.html | 51 ++---- .../html/_l_u_f_a_config_8h_source.html | 51 ++---- Doc/Doxygen/html/_l_u_f_a_descriptors_8c.html | 75 ++++---- Doc/Doxygen/html/_l_u_f_a_descriptors_8h.html | 75 ++++---- .../html/_l_u_f_a_descriptors_8h_source.html | 51 ++---- Doc/Doxygen/html/_log_8h.html | 165 ++++++++---------- Doc/Doxygen/html/_log_8h_source.html | 51 ++---- Doc/Doxygen/html/_log_8txt.html | 51 ++---- Doc/Doxygen/html/_main_page_8txt.html | 51 ++---- Doc/Doxygen/html/_map_8h_source.html | 51 ++---- Doc/Doxygen/html/_memory_8h_source.html | 51 ++---- .../html/_mifare_classic_8h_source.html | 51 ++---- .../html/_mifare_ultralight_8h_source.html | 53 ++---- Doc/Doxygen/html/_random_8h_source.html | 51 ++---- .../html/_reader14443-2_a_8h_source.html | 51 ++---- .../html/_reader14443_a_8h_source.html | 51 ++---- Doc/Doxygen/html/_reader_8txt.html | 51 ++---- Doc/Doxygen/html/_settings_8h.html | 51 ++---- Doc/Doxygen/html/_settings_8h_source.html | 53 ++---- Doc/Doxygen/html/_settings_8txt.html | 51 ++---- Doc/Doxygen/html/_system_8h_source.html | 53 ++---- Doc/Doxygen/html/_terminal_8h_source.html | 51 ++---- .../html/_uploading_downloading_8txt.html | 51 ++---- Doc/Doxygen/html/_x_modem_8h_source.html | 51 ++---- Doc/Doxygen/html/annotated.html | 52 ++---- Doc/Doxygen/html/classes.html | 62 ++----- .../dir_5de29d499bb29a41092979d00d22c134.html | 55 ++---- .../dir_74b6a3b63f61c160c0f14b7a283a4c9b.html | 51 ++---- .../dir_8465ec698d237f801ae9966d4551fcfa.html | 51 ++---- .../dir_ddeffaa734f77525428b0dd4068da9cb.html | 55 ++---- .../dir_f5aab302412c0352d69464400cc5ee44.html | 55 ++---- Doc/Doxygen/html/doxygen.css | 139 ++++++++++++++- Doc/Doxygen/html/files.html | 51 ++---- Doc/Doxygen/html/functions.html | 58 ++---- Doc/Doxygen/html/functions_vars.html | 58 ++---- Doc/Doxygen/html/globals.html | 80 ++------- Doc/Doxygen/html/globals_defs.html | 61 ++----- Doc/Doxygen/html/globals_enum.html | 61 ++----- Doc/Doxygen/html/globals_eval.html | 61 ++----- Doc/Doxygen/html/globals_func.html | 61 ++----- Doc/Doxygen/html/globals_vars.html | 61 ++----- Doc/Doxygen/html/index.html | 63 +++---- Doc/Doxygen/html/jquery.js | 21 ++- Doc/Doxygen/html/pages.html | 47 ++--- Doc/Doxygen/html/search/all_0.html | 2 +- Doc/Doxygen/html/search/all_1.html | 2 +- Doc/Doxygen/html/search/all_1.js | 2 +- Doc/Doxygen/html/search/all_2.html | 2 +- Doc/Doxygen/html/search/all_2.js | 2 +- Doc/Doxygen/html/search/all_3.html | 2 +- Doc/Doxygen/html/search/all_4.html | 2 +- Doc/Doxygen/html/search/all_4.js | 2 +- Doc/Doxygen/html/search/all_5.html | 2 +- Doc/Doxygen/html/search/all_5.js | 2 +- Doc/Doxygen/html/search/all_6.html | 2 +- Doc/Doxygen/html/search/all_6.js | 6 +- Doc/Doxygen/html/search/all_7.html | 2 +- Doc/Doxygen/html/search/all_8.html | 2 +- Doc/Doxygen/html/search/all_9.html | 2 +- Doc/Doxygen/html/search/all_a.html | 2 +- Doc/Doxygen/html/search/all_a.js | 2 +- Doc/Doxygen/html/search/all_b.html | 2 +- Doc/Doxygen/html/search/all_b.js | 2 +- Doc/Doxygen/html/search/all_c.html | 2 +- Doc/Doxygen/html/search/all_c.js | 2 +- Doc/Doxygen/html/search/classes_0.html | 2 +- Doc/Doxygen/html/search/classes_1.html | 2 +- Doc/Doxygen/html/search/classes_2.html | 2 +- Doc/Doxygen/html/search/defines_0.html | 2 +- Doc/Doxygen/html/search/enums_0.html | 2 +- Doc/Doxygen/html/search/enumvalues_0.html | 2 +- Doc/Doxygen/html/search/files_0.html | 2 +- Doc/Doxygen/html/search/files_1.html | 2 +- Doc/Doxygen/html/search/files_2.html | 2 +- Doc/Doxygen/html/search/files_3.html | 2 +- Doc/Doxygen/html/search/files_4.html | 2 +- Doc/Doxygen/html/search/files_5.html | 2 +- Doc/Doxygen/html/search/files_6.html | 2 +- Doc/Doxygen/html/search/files_7.html | 2 +- Doc/Doxygen/html/search/functions_0.html | 2 +- Doc/Doxygen/html/search/pages_0.html | 2 +- Doc/Doxygen/html/search/pages_0.js | 2 +- Doc/Doxygen/html/search/pages_1.html | 2 +- Doc/Doxygen/html/search/pages_1.js | 2 +- Doc/Doxygen/html/search/pages_2.html | 2 +- Doc/Doxygen/html/search/pages_2.js | 2 +- Doc/Doxygen/html/search/pages_3.html | 2 +- Doc/Doxygen/html/search/pages_3.js | 2 +- Doc/Doxygen/html/search/pages_4.html | 2 +- Doc/Doxygen/html/search/pages_4.js | 6 +- Doc/Doxygen/html/search/pages_5.html | 2 +- Doc/Doxygen/html/search/pages_5.js | 2 +- Doc/Doxygen/html/search/pages_6.html | 2 +- Doc/Doxygen/html/search/pages_6.js | 2 +- Doc/Doxygen/html/search/pages_7.html | 2 +- Doc/Doxygen/html/search/pages_7.js | 2 +- Doc/Doxygen/html/search/search.css | 12 +- Doc/Doxygen/html/search/variables_0.html | 2 +- Doc/Doxygen/html/search/variables_1.html | 2 +- Doc/Doxygen/html/search/variables_2.html | 2 +- Doc/Doxygen/html/search/variables_3.html | 2 +- Doc/Doxygen/html/search/variables_4.html | 2 +- Doc/Doxygen/html/search/variables_5.html | 2 +- Doc/Doxygen/html/search/variables_6.html | 2 +- Doc/Doxygen/html/search/variables_7.html | 2 +- .../struct_configuration_type-members.html | 52 ++---- .../html/struct_configuration_type.html | 104 +++++------ .../struct_settings_entry_type-members.html | 52 ++---- .../html/struct_settings_entry_type.html | 62 ++----- ...descriptor___configuration__t-members.html | 52 ++---- ...u_s_b___descriptor___configuration__t.html | 52 ++---- Doc/Doxygen/html/tabs.css | 61 +------ Doc/DoxygenPages/CommandLine.txt | 3 +- Doc/DoxygenPages/GettingStarted.txt | 2 +- 136 files changed, 1385 insertions(+), 2942 deletions(-) diff --git a/Doc/Doxygen/html/_antenna_level_8h_source.html b/Doc/Doxygen/html/_antenna_level_8h_source.html index 6120257..fb7c863 100644 --- a/Doc/Doxygen/html/_antenna_level_8h_source.html +++ b/Doc/Doxygen/html/_antenna_level_8h_source.html @@ -3,7 +3,8 @@ - + + Chameleon-Mini: AntennaLevel.h Source File @@ -11,9 +12,6 @@ - @@ -31,40 +29,19 @@ - + -

    - + + + +
    1 /*
    2  * AntennaLevel.h
    3  *
    4  * Created on: 24.11.2013
    5  * Author: skuser
    6  */
    7 
    8 #ifndef ANTENNALEVEL_H_
    9 #define ANTENNALEVEL_H_
    10 
    11 #include "Common.h"
    12 
    13 #define ANTENNA_LEVEL_R1 47E3
    14 #define ANTENNA_LEVEL_R2 1E3
    15 #define ANTENNA_LEVEL_VREF 1.0
    16 #define ANTENNA_LEVEL_RES 4096
    17 #define ANTENNA_LEVEL_OFFSET 190 /* LSB */
    18 
    19 #define ANTENNA_LEVEL_MILLIVOLT 1E3
    20 #define ANTENNA_LEVEL_FACTOR (ANTENNA_LEVEL_VREF * (ANTENNA_LEVEL_R1 + ANTENNA_LEVEL_R2) / (ANTENNA_LEVEL_RES * ANTENNA_LEVEL_R2) )
    21 #define ANTENNA_LEVEL_SCALE ((uint32_t) 1<<16)
    22 #define ANTENNA_LEVEL_NUMERATOR ((uint32_t) (ANTENNA_LEVEL_MILLIVOLT * ANTENNA_LEVEL_FACTOR * ANTENNA_LEVEL_SCALE + .5))
    23 #define ANTENNA_LEVEL_DENOMINATOR (ANTENNA_LEVEL_SCALE)
    24 
    25 static inline
    26 void AntennaLevelInit(void)
    27 {
    28  ADCA.CTRLA = ADC_ENABLE_bm;
    29  ADCA.CTRLB = ADC_RESOLUTION_12BIT_gc;
    30  ADCA.REFCTRL = ADC_REFSEL_INT1V_gc | ADC_BANDGAP_bm;
    31  ADCA.PRESCALER = ADC_PRESCALER_DIV32_gc;
    32  ADCA.CH0.CTRL = ADC_CH_INPUTMODE_SINGLEENDED_gc;
    33  ADCA.CH0.MUXCTRL = ADC_CH_MUXPOS_PIN1_gc;
    34 
    35 }
    36 
    37 static inline
    38 uint16_t AntennaLevelGet(void)
    39 {
    40  ADCA.CH0.CTRL |= ADC_CH_START_bm;
    41  while( !(ADCA.CH0.INTFLAGS & ADC_CH_CHIF_bm) );
    42 
    43  ADCA.CH0.INTFLAGS = ADC_CH_CHIF_bm;
    44 
    45  int16_t Result = ADCA.CH0RES - ANTENNA_LEVEL_OFFSET;
    46  if (Result < 0) Result = 0;
    47 
    48  return (uint16_t) (((uint32_t) Result * ANTENNA_LEVEL_NUMERATOR) / ANTENNA_LEVEL_DENOMINATOR);
    49 }
    50 
    51 void AntennaLevelTick(void);
    52 void AntennaLevelResetMaxRssi(void);
    53 
    54 #endif /* ANTENNALEVEL_H_ */
    diff --git a/Doc/Doxygen/html/_application_8h_source.html b/Doc/Doxygen/html/_application_8h_source.html index d9c32ec..63b9895 100644 --- a/Doc/Doxygen/html/_application_8h_source.html +++ b/Doc/Doxygen/html/_application_8h_source.html @@ -3,7 +3,8 @@ - + + Chameleon-Mini: Application.h Source File @@ -11,9 +12,6 @@ - @@ -31,40 +29,19 @@ - + - - + + + +
    Application.h
    -
    1 /*
    2  * Application.h
    3  *
    4  * Created on: 18.02.2013
    5  * Author: skuser
    6  */
    7 
    8 #ifndef APPLICATION_H_
    9 #define APPLICATION_H_
    10 
    11 #include "../Common.h"
    12 #include "../Configuration.h"
    13 #include "../Log.h"
    14 
    15 /* Applications */
    16 #include "MifareUltralight.h"
    17 #include "MifareClassic.h"
    18 #include "Reader14443A.h"
    19 
    20 /* Function wrappers */
    21 INLINE void ApplicationInit(void) {
    22  ActiveConfiguration.ApplicationInitFunc();
    23 }
    24 
    25 INLINE void ApplicationTask(void) {
    26  ActiveConfiguration.ApplicationTaskFunc();
    27 }
    28 
    29 INLINE void ApplicationTick(void) {
    30  ActiveConfiguration.ApplicationTickFunc();
    31 }
    32 
    33 INLINE uint16_t ApplicationProcess(uint8_t* ByteBuffer, uint16_t ByteCount) {
    34  return ActiveConfiguration.ApplicationProcessFunc(ByteBuffer, ByteCount);
    35 }
    36 
    37 INLINE void ApplicationReset(void) {
    38  ActiveConfiguration.ApplicationResetFunc();
    39  //LogEntry(LOG_INFO_RESET_APP, NULL, 0);
    40 }
    41 
    42 INLINE void ApplicationGetUid(ConfigurationUidType Uid) {
    43  ActiveConfiguration.ApplicationGetUidFunc(Uid);
    44 }
    45 
    46 INLINE void ApplicationSetUid(ConfigurationUidType Uid) {
    47  ActiveConfiguration.ApplicationSetUidFunc(Uid);
    48  LogEntry(LOG_INFO_UID_SET, Uid, ActiveConfiguration.UidSize);
    49 }
    50 
    51 #endif /* APPLICATION_H_ */
    void(* ApplicationSetUidFunc)(ConfigurationUidType Uid)
    Definition: Configuration.h:103
    -
    uint16_t(* ApplicationProcessFunc)(uint8_t *ByteBuffer, uint16_t BitCount)
    Definition: Configuration.h:93
    -
    void(* ApplicationResetFunc)(void)
    Definition: Configuration.h:77
    +
    1 /*
    2  * Application.h
    3  *
    4  * Created on: 18.02.2013
    5  * Author: skuser
    6  */
    7 
    8 #ifndef APPLICATION_H_
    9 #define APPLICATION_H_
    10 
    11 #include "../Common.h"
    12 #include "../Configuration.h"
    13 #include "../Log.h"
    14 
    15 /* Applications */
    16 #include "MifareUltralight.h"
    17 #include "MifareClassic.h"
    18 #include "Reader14443A.h"
    19 
    20 /* Function wrappers */
    21 INLINE void ApplicationInit(void) {
    22  ActiveConfiguration.ApplicationInitFunc();
    23 }
    24 
    25 INLINE void ApplicationTask(void) {
    26  ActiveConfiguration.ApplicationTaskFunc();
    27 }
    28 
    29 INLINE void ApplicationTick(void) {
    30  ActiveConfiguration.ApplicationTickFunc();
    31 }
    32 
    33 INLINE uint16_t ApplicationProcess(uint8_t* ByteBuffer, uint16_t ByteCount) {
    34  return ActiveConfiguration.ApplicationProcessFunc(ByteBuffer, ByteCount);
    35 }
    36 
    37 INLINE void ApplicationReset(void) {
    38  ActiveConfiguration.ApplicationResetFunc();
    39  //LogEntry(LOG_INFO_RESET_APP, NULL, 0);
    40 }
    41 
    42 INLINE void ApplicationGetUid(ConfigurationUidType Uid) {
    43  ActiveConfiguration.ApplicationGetUidFunc(Uid);
    44 }
    45 
    46 INLINE void ApplicationSetUid(ConfigurationUidType Uid) {
    47  ActiveConfiguration.ApplicationSetUidFunc(Uid);
    48  LogEntry(LOG_INFO_UID_SET, Uid, ActiveConfiguration.UidSize);
    49 }
    50 
    51 #endif /* APPLICATION_H_ */
    void(* ApplicationSetUidFunc)(ConfigurationUidType Uid)
    Definition: Configuration.h:105
    +
    uint16_t(* ApplicationProcessFunc)(uint8_t *ByteBuffer, uint16_t BitCount)
    Definition: Configuration.h:95
    +
    void(* ApplicationResetFunc)(void)
    Definition: Configuration.h:79
    UID change.
    Definition: Log.h:17
    -
    void(* ApplicationGetUidFunc)(ConfigurationUidType Uid)
    Definition: Configuration.h:98
    -
    void(* ApplicationTickFunc)(void)
    Definition: Configuration.h:81
    -
    void(* ApplicationTaskFunc)(void)
    Definition: Configuration.h:79
    -
    void(* ApplicationInitFunc)(void)
    Definition: Configuration.h:75
    -
    uint8_t UidSize
    Definition: Configuration.h:120
    +
    void(* ApplicationGetUidFunc)(ConfigurationUidType Uid)
    Definition: Configuration.h:100
    +
    void(* ApplicationTickFunc)(void)
    Definition: Configuration.h:83
    +
    void(* ApplicationTaskFunc)(void)
    Definition: Configuration.h:81
    +
    void(* ApplicationInitFunc)(void)
    Definition: Configuration.h:77
    +
    uint8_t UidSize
    Definition: Configuration.h:122
    diff --git a/Doc/Doxygen/html/_battery_8h_source.html b/Doc/Doxygen/html/_battery_8h_source.html index 8bd2dd0..ce09dcf 100644 --- a/Doc/Doxygen/html/_battery_8h_source.html +++ b/Doc/Doxygen/html/_battery_8h_source.html @@ -3,7 +3,8 @@ - + + Chameleon-Mini: Battery.h Source File @@ -11,9 +12,6 @@ - @@ -31,40 +29,19 @@
    - + - - + + + +
    1 /*
    2  * Battery.h
    3  *
    4  * Created on: 20.08.2014
    5  * Author: sk
    6  */
    7 
    8 #ifndef BATTERY_H_
    9 #define BATTERY_H_
    10 
    11 #include "Common.h"
    12 
    13 #define BATTERY_PORT PORTD
    14 #define BATTERY_STAT_PIN PIN0_bm
    15 #define BATTERY_STAT_PINCTRL PIN0CTRL
    16 #define BATTERY_PORT_MASK (BATTERY_STAT_PIN)
    17 
    18 INLINE void BatteryInit(void) {
    19  BATTERY_PORT.DIRCLR = BATTERY_PORT_MASK;
    20  BATTERY_PORT.BATTERY_STAT_PINCTRL = PORT_OPC_PULLUP_gc;
    21 }
    22 
    23 INLINE bool BatteryIsCharging(void) {
    24  if (!(BATTERY_PORT.IN & BATTERY_STAT_PIN)) {
    25  return true;
    26  } else {
    27  return false;
    28  }
    29 }
    30 
    31 #endif /* BATTERY_H_ */
    diff --git a/Doc/Doxygen/html/_button_8h_source.html b/Doc/Doxygen/html/_button_8h_source.html index 4a862ce..3c4a665 100644 --- a/Doc/Doxygen/html/_button_8h_source.html +++ b/Doc/Doxygen/html/_button_8h_source.html @@ -3,7 +3,8 @@ - + + Chameleon-Mini: Button.h Source File @@ -11,9 +12,6 @@ - @@ -31,40 +29,19 @@ - + - - + + + +
    1 /*
    2  * Button.h
    3  *
    4  * Created on: 13.05.2013
    5  * Author: skuser
    6  */
    7 
    8 #ifndef BUTTON_H_
    9 #define BUTTON_H_
    10 
    11 #include "Common.h"
    12 
    13 typedef enum {
    14  BUTTON_R_PRESS_SHORT = 0,
    15  BUTTON_R_PRESS_LONG,
    16  BUTTON_L_PRESS_SHORT,
    17  BUTTON_L_PRESS_LONG,
    18 
    19  /* Must be last element */
    20  BUTTON_TYPE_COUNT
    21 } ButtonTypeEnum;
    22 
    23 typedef enum {
    24  BUTTON_ACTION_NONE,
    25  BUTTON_ACTION_UID_RANDOM,
    26  BUTTON_ACTION_UID_LEFT_INCREMENT,
    27  BUTTON_ACTION_UID_RIGHT_INCREMENT,
    28  BUTTON_ACTION_UID_LEFT_DECREMENT,
    29  BUTTON_ACTION_UID_RIGHT_DECREMENT,
    30  BUTTON_ACTION_CYCLE_SETTINGS,
    31  BUTTON_ACTION_STORE_MEM,
    32  BUTTON_ACTION_RECALL_MEM,
    33  BUTTON_ACTION_TOGGLE_FIELD,
    34  BUTTON_ACTION_STORE_LOG,
    35 
    36  /* This has to be last element */
    37  BUTTON_ACTION_COUNT
    38 } ButtonActionEnum;
    39 
    40 void ButtonInit(void);
    41 void ButtonTick(void);
    42 
    43 void ButtonGetActionList(char* List, uint16_t BufferSize);
    44 void ButtonSetActionById(ButtonTypeEnum Type, ButtonActionEnum Action);
    45 void ButtonGetActionByName(ButtonTypeEnum Type, char* Action, uint16_t BufferSize);
    46 bool ButtonSetActionByName(ButtonTypeEnum Type, const char* Action);
    47 
    48 #endif /* BUTTON_H_ */
    diff --git a/Doc/Doxygen/html/_buttons_8txt.html b/Doc/Doxygen/html/_buttons_8txt.html index 17894e7..a03c9c3 100644 --- a/Doc/Doxygen/html/_buttons_8txt.html +++ b/Doc/Doxygen/html/_buttons_8txt.html @@ -3,7 +3,8 @@ - + + Chameleon-Mini: Buttons.txt File Reference @@ -11,9 +12,6 @@ - @@ -31,40 +29,19 @@ - + - - + + + +
    diff --git a/Doc/Doxygen/html/_chameleon-_mini_8h_source.html b/Doc/Doxygen/html/_chameleon-_mini_8h_source.html index 85d0c5b..e61f2e0 100644 --- a/Doc/Doxygen/html/_chameleon-_mini_8h_source.html +++ b/Doc/Doxygen/html/_chameleon-_mini_8h_source.html @@ -3,7 +3,8 @@ - + + Chameleon-Mini: Chameleon-Mini.h Source File @@ -11,9 +12,6 @@ - @@ -31,40 +29,19 @@
    - + - - + + + +
    diff --git a/Doc/Doxygen/html/_codec_8h_source.html b/Doc/Doxygen/html/_codec_8h_source.html index 1dbc20e..dc15ff1 100644 --- a/Doc/Doxygen/html/_codec_8h_source.html +++ b/Doc/Doxygen/html/_codec_8h_source.html @@ -3,7 +3,8 @@ - + + Chameleon-Mini: Codec.h Source File @@ -11,9 +12,6 @@ - @@ -31,40 +29,19 @@ - + - - + + + +
    Codec.h
    -
    1 /*
    2  * CODEC.h
    3  *
    4  * Created on: 18.02.2013
    5  * Author: skuser
    6  */
    7 
    8 #ifndef CODEC_H_
    9 #define CODEC_H_
    10 
    11 #include <avr/io.h>
    12 #include <stdint.h>
    13 #include <stdbool.h>
    14 #include "../Common.h"
    15 #include "../Configuration.h"
    16 
    17 #include "ISO14443-2A.h"
    18 #include "Reader14443-2A.h"
    19 
    20 /* Timing definitions for ISO14443A */
    21 #define ISO14443A_SUBCARRIER_DIVIDER 16
    22 #define ISO14443A_BIT_GRID_CYCLES 128
    23 #define ISO14443A_BIT_RATE_CYCLES 128
    24 #define ISO14443A_FRAME_DELAY_PREV1 1236
    25 #define ISO14443A_FRAME_DELAY_PREV0 1172
    26 #define ISO14443A_RX_PENDING_TIMEOUT 1 // ms
    27 
    28 /* Peripheral definitions */
    29 #define CODEC_DEMOD_POWER_PORT PORTB
    30 #define CODEC_DEMOD_POWER_MASK PIN0_bm
    31 #define CODEC_DEMOD_IN_PORT PORTB
    32 #define CODEC_DEMOD_IN_MASK (CODEC_DEMOD_IN_MASK0 | CODEC_DEMOD_IN_MASK1)
    33 #define CODEC_DEMOD_IN_MASK0 PIN1_bm
    34 #define CODEC_DEMOD_IN_MASK1 PIN2_bm
    35 #define CODEC_DEMOD_IN_PINCTRL0 PIN1CTRL
    36 #define CODEC_DEMOD_IN_PINCTRL1 PIN2CTRL
    37 #define CODEC_DEMOD_IN_EVMUX0 EVSYS_CHMUX_PORTB_PIN1_gc
    38 #define CODEC_DEMOD_IN_EVMUX1 EVSYS_CHMUX_PORTB_PIN2_gc
    39 #define CODEC_DEMOD_IN_INT0_VECT PORTB_INT0_vect
    40 #define CODEC_LOADMOD_PORT PORTC
    41 #define CODEC_LOADMOD_MASK PIN6_bm
    42 #define CODEC_CARRIER_IN_PORT PORTC
    43 #define CODEC_CARRIER_IN_MASK PIN2_bm
    44 #define CODEC_CARRIER_IN_PINCTRL PIN2CTRL
    45 #define CODEC_CARRIER_IN_EVMUX EVSYS_CHMUX_PORTC_PIN2_gc
    46 #define CODEC_CARRIER_IN_DIV 2 /* external clock division factor */
    47 #define CODEC_SUBCARRIER_PORT PORTC
    48 #define CODEC_SUBCARRIER_MASK_PSK PIN4_bm
    49 #define CODEC_SUBCARRIER_MASK_OOK PIN5_bm
    50 #define CODEC_SUBCARRIER_MASK (CODEC_SUBCARRIER_MASK_PSK | CODEC_SUBCARRIER_MASK_OOK)
    51 #define CODEC_SUBCARRIER_TIMER TCC1
    52 #define CODEC_SUBCARRIER_CC_PSK CCA
    53 #define CODEC_SUBCARRIER_CC_OOK CCB
    54 #define CODEC_SUBCARRIER_CCEN_PSK TC1_CCAEN_bm
    55 #define CODEC_SUBCARRIER_CCEN_OOK TC1_CCBEN_bm
    56 #define CODEC_TIMER_SAMPLING TCD0
    57 #define CODEC_TIMER_SAMPLING_CCA_VECT TCD0_CCA_vect
    58 #define CODEC_TIMER_SAMPLING_CCB_VECT TCD0_CCB_vect
    59 #define CODEC_TIMER_LOADMOD TCE0
    60 #define CODEC_TIMER_LOADMOD_OVF_VECT TCE0_OVF_vect
    61 #define CODEC_TIMER_LOADMOD_CCA_VECT TCE0_CCA_vect
    62 #define CODEC_TIMER_LOADMOD_CCB_VECT TCE0_CCB_vect
    63 #define CODEC_TIMER_LOADMOD_CCC_VECT TCE0_CCC_vect
    64 #define CODEC_TIMER_MODSTART_EVSEL TC_EVSEL_CH0_gc
    65 #define CODEC_TIMER_MODEND_EVSEL TC_EVSEL_CH1_gc
    66 #define CODEC_TIMER_CARRIER_CLKSEL TC_CLKSEL_EVCH6_gc
    67 #define CODEC_READER_TIMER TCC0
    68 #define CODEC_READER_PORT PORTC
    69 #define CODEC_READER_MASK_LEFT PIN0_bm
    70 #define CODEC_READER_MASK_RIGHT PIN1_bm
    71 #define CODEC_READER_MASK (CODEC_READER_MASK_LEFT | CODEC_READER_MASK_RIGHT)
    72 #define CODEC_READER_PINCTRL_LEFT PIN0CTRL
    73 #define CODEC_READER_PINCTRL_RIGHT PIN1CTRL
    74 #define CODEC_AC_DEMOD_SETTINGS AC_HSMODE_bm | AC_HYSMODE_NO_gc
    75 #define CODEC_MAXIMUM_THRESHOLD 0xFFF // the maximum voltage can be calculated with ch0data * Vref / 0xFFF
    76 #define CODEC_THRESHOLD_CALIBRATE_MIN 128
    77 #define CODEC_THRESHOLD_CALIBRATE_MAX 1024
    78 #define CODEC_THRESHOLD_CALIBRATE_STEPS 8
    79 #define CODEC_TIMER_TIMESTAMPS TCD1
    80 #define CODEC_TIMER_TIMESTAMPS_CCA_VECT TCD1_CCA_vect
    81 
    82 #define CODEC_BUFFER_SIZE 256
    83 
    84 #define CODEC_CARRIER_FREQ 13560000
    85 
    86 #define Codec8Reg0 GPIOR0
    87 #define Codec8Reg1 GPIOR1
    88 #define Codec8Reg2 GPIOR2
    89 #define Codec8Reg3 GPIOR3
    90 #define CodecCount16Register1 (*((volatile uint16_t*) &GPIOR4)) /* GPIOR4 & GPIOR5 */
    91 #define CodecCount16Register2 (*((volatile uint16_t*) &GPIOR6)) /* GPIOR4 & GPIOR5 */
    92 #define CodecPtrRegister1 (*((volatile uint8_t**) &GPIOR8))
    93 #define CodecPtrRegister2 (*((volatile uint8_t**) &GPIORA))
    94 
    95 extern uint16_t ReaderThreshold;
    96 extern uint16_t Reader_FWT;
    97 
    98 #define FWI2FWT(x) ((uint32_t)(256 * 16 * ((uint32_t)1 << (x))) / (CODEC_CARRIER_FREQ / 1000) + 1)
    99 
    100 typedef enum {
    101  CODEC_SUBCARRIERMOD_OFF,
    102  CODEC_SUBCARRIERMOD_OOK
    103 } SubcarrierModType;
    104 
    105 extern uint8_t CodecBuffer[CODEC_BUFFER_SIZE];
    106 
    107 INLINE void CodecInit(void) {
    108  ActiveConfiguration.CodecInitFunc();
    109 }
    110 
    111 INLINE void CodecDeInit(void) {
    112  ActiveConfiguration.CodecDeInitFunc();
    113 }
    114 
    115 INLINE void CodecTask(void) {
    116  ActiveConfiguration.CodecTaskFunc();
    117 }
    118 
    119 /* Helper Functions for Codec implementations */
    120 INLINE void CodecInitCommon(void)
    121 {
    122  /* Configure CARRIER input pin and route it to EVSYS.
    123  * Multiply by 2 again by using both edges when externally
    124  * dividing by 2 */
    125 #if CODEC_CARRIER_IN_DIV == 2
    126  CODEC_CARRIER_IN_PORT.CODEC_CARRIER_IN_PINCTRL = PORT_ISC_BOTHEDGES_gc;
    127 #else
    128 #error Option not supported
    129 #endif
    130  CODEC_CARRIER_IN_PORT.DIRCLR = CODEC_CARRIER_IN_MASK;
    131  EVSYS.CH6MUX = CODEC_CARRIER_IN_EVMUX;
    132 
    133  /* Configure two DEMOD pins for input.
    134  * Configure event channel 0 for rising edge (begin of modulation pause)
    135  * Configure event channel 1 for falling edge (end of modulation pause) */
    136  CODEC_DEMOD_POWER_PORT.OUTCLR = CODEC_DEMOD_POWER_MASK;
    137  CODEC_DEMOD_POWER_PORT.DIRSET = CODEC_DEMOD_POWER_MASK;
    138  CODEC_DEMOD_IN_PORT.DIRCLR = CODEC_DEMOD_IN_MASK;
    139  CODEC_DEMOD_IN_PORT.CODEC_DEMOD_IN_PINCTRL0 = PORT_ISC_RISING_gc;
    140  CODEC_DEMOD_IN_PORT.CODEC_DEMOD_IN_PINCTRL1 = PORT_ISC_FALLING_gc;
    141  CODEC_DEMOD_IN_PORT.INT0MASK = 0;
    142  CODEC_DEMOD_IN_PORT.INTCTRL = PORT_INT0LVL_HI_gc;
    143  EVSYS.CH0MUX = CODEC_DEMOD_IN_EVMUX0;
    144  EVSYS.CH1MUX = CODEC_DEMOD_IN_EVMUX1;
    145 
    146  /* Configure loadmod pin configuration and use a virtual port configuration
    147  * for single instruction cycle access */
    148  CODEC_LOADMOD_PORT.DIRSET = CODEC_LOADMOD_MASK;
    149  CODEC_LOADMOD_PORT.OUTCLR = CODEC_LOADMOD_MASK;
    150  PORTCFG.VPCTRLA &= ~PORTCFG_VP0MAP_gm;
    151  PORTCFG.VPCTRLA |= PORTCFG_VP02MAP_PORTC_gc;
    152 
    153  /* Configure subcarrier pins for output */
    154  CODEC_SUBCARRIER_PORT.DIRSET = CODEC_SUBCARRIER_MASK;
    155  CODEC_SUBCARRIER_PORT.OUTCLR = CODEC_SUBCARRIER_MASK;
    156 
    157  /* Configure pins for reader field with the LEFT output being inverted
    158  * and all bridge outputs static high */
    159  CODEC_READER_PORT.CODEC_READER_PINCTRL_LEFT = PORT_INVEN_bm;
    160  CODEC_READER_PORT.OUTCLR = CODEC_READER_MASK_LEFT;
    161  CODEC_READER_PORT.OUTSET = CODEC_READER_MASK_RIGHT;
    162  CODEC_READER_PORT.DIRSET = CODEC_READER_MASK;
    163 
    164  /* Configure timer for generating reader field and configure AWEX for outputting pattern
    165  * with disabled outputs. */
    166  CODEC_READER_TIMER.CTRLB = TC0_CCAEN_bm | TC_WGMODE_SINGLESLOPE_gc;
    167  CODEC_READER_TIMER.PER = F_CPU / CODEC_CARRIER_FREQ - 1;
    168  CODEC_READER_TIMER.CCA = F_CPU / CODEC_CARRIER_FREQ / 2 ;
    169 
    170  AWEXC.OUTOVEN = 0x00;
    171  AWEXC.CTRL = AWEX_CWCM_bm | AWEX_DTICCAEN_bm | AWEX_DTICCBEN_bm;
    172 
    173  /* Configure DAC for the reference voltage */
    174  DACB.EVCTRL = 0;
    175  DACB.CTRLB = DAC_CHSEL_SINGLE_gc;
    176  DACB.CTRLC = DAC_REFSEL_AVCC_gc;
    177  DACB.CTRLA = DAC_IDOEN_bm | DAC_ENABLE_bm;
    178  DACB.CH0DATA = ReaderThreshold; // real threshold voltage can be calculated with ch0data * Vref / 0xFFF
    179 
    180  /* Configure Analog Comparator 0 to detect changes in demodulated reader field */
    181  ACA.AC0MUXCTRL = AC_MUXPOS_DAC_gc | AC_MUXNEG_PIN7_gc;
    182  ACA.AC0CTRL = CODEC_AC_DEMOD_SETTINGS;
    183 
    184  /* Configure Analog Comparator 1 to detect SOC */
    185  ACA.AC1MUXCTRL = AC_MUXPOS_DAC_gc | AC_MUXNEG_PIN7_gc;
    186  ACA.AC1CTRL = CODEC_AC_DEMOD_SETTINGS;
    187 }
    188 
    189 INLINE void CodecSetSubcarrier(SubcarrierModType ModType, uint16_t Divider)
    190 {
    191  if (ModType == CODEC_SUBCARRIERMOD_OFF) {
    192  CODEC_SUBCARRIER_TIMER.CTRLA = TC_CLKSEL_OFF_gc;
    193  CODEC_SUBCARRIER_TIMER.CTRLB = 0;
    194  } else if (ModType == CODEC_SUBCARRIERMOD_OOK) {
    195  /* Configure subcarrier generation with 50% DC output using OOK */
    196  CODEC_SUBCARRIER_TIMER.CNT = 0;
    197  CODEC_SUBCARRIER_TIMER.PER = Divider - 1;
    198  CODEC_SUBCARRIER_TIMER.CODEC_SUBCARRIER_CC_OOK = Divider/2;
    199  CODEC_SUBCARRIER_TIMER.CTRLB = CODEC_SUBCARRIER_CCEN_OOK | TC_WGMODE_SINGLESLOPE_gc;
    200  }
    201 }
    202 
    203 INLINE void CodecStartSubcarrier(void)
    204 {
    205  CODEC_SUBCARRIER_TIMER.CTRLA = CODEC_TIMER_CARRIER_CLKSEL;
    206 }
    207 
    208 INLINE void CodecSetDemodPower(bool bOnOff)
    209 {
    210  if (bOnOff) {
    211  CODEC_DEMOD_POWER_PORT.OUTSET = CODEC_DEMOD_POWER_MASK;
    212  } else {
    213  CODEC_DEMOD_POWER_PORT.OUTCLR = CODEC_DEMOD_POWER_MASK;
    214  }
    215 }
    216 
    217 INLINE bool CodecGetLoadmodState(void) {
    218  if (ACA.STATUS & AC_AC0STATE_bm) {
    219  return true;
    220  } else {
    221  return false;
    222  }
    223 }
    224 
    225 INLINE void CodecSetLoadmodState(bool bOnOff) {
    226  if (bOnOff) {
    227  VPORT0.OUT |= CODEC_LOADMOD_MASK;
    228  } else {
    229  VPORT0.OUT &= ~CODEC_LOADMOD_MASK;
    230  }
    231 }
    232 
    233 INLINE void CodecSetReaderField(bool bOnOff) { // this is the function for turning on/off the reader field dumbly; before using this function, please consider to use CodecReaderField{Start,Stop}
    234 
    235  if (bOnOff) {
    236  /* Start timer for field generation and unmask outputs */
    237  CODEC_READER_TIMER.CTRLA = TC_CLKSEL_DIV1_gc;
    238  AWEXC.OUTOVEN = CODEC_READER_MASK;
    239  } else {
    240  /* Disable outputs of AWEX and stop field generation */
    241  AWEXC.OUTOVEN = 0x00;
    242  CODEC_READER_TIMER.CTRLA = TC_CLKSEL_OFF_gc;
    243  }
    244 }
    245 
    246 INLINE bool CodecGetReaderField(void) {
    247  return (CODEC_READER_TIMER.CTRLA == TC_CLKSEL_DIV1_gc) && (AWEXC.OUTOVEN == CODEC_READER_MASK);
    248 }
    249 
    250 void CodecReaderFieldStart(void);
    251 void CodecReaderFieldStop(void);
    252 bool CodecIsReaderFieldReady(void);
    253 
    254 void CodecReaderFieldRestart(uint16_t delay);
    255 #define FIELD_RESTART() CodecReaderFieldRestart(100)
    256 bool CodecIsReaderToBeRestarted(void);
    257 
    258 void CodecThresholdSet(uint16_t th);
    259 uint16_t CodecThresholdIncrement(void);
    260 void CodecThresholdReset(void);
    261 #endif /* CODEC_H_ */
    void(* CodecInitFunc)(void)
    Definition: Configuration.h:57
    -
    void(* CodecTaskFunc)(void)
    Definition: Configuration.h:63
    -
    void(* CodecDeInitFunc)(void)
    Definition: Configuration.h:59
    +
    1 /*
    2  * CODEC.h
    3  *
    4  * Created on: 18.02.2013
    5  * Author: skuser
    6  */
    7 
    8 #ifndef CODEC_H_
    9 #define CODEC_H_
    10 
    11 #include <avr/io.h>
    12 #include <stdint.h>
    13 #include <stdbool.h>
    14 #include "../Common.h"
    15 #include "../Configuration.h"
    16 
    17 #include "ISO14443-2A.h"
    18 #include "Reader14443-2A.h"
    19 
    20 /* Timing definitions for ISO14443A */
    21 #define ISO14443A_SUBCARRIER_DIVIDER 16
    22 #define ISO14443A_BIT_GRID_CYCLES 128
    23 #define ISO14443A_BIT_RATE_CYCLES 128
    24 #define ISO14443A_FRAME_DELAY_PREV1 1236
    25 #define ISO14443A_FRAME_DELAY_PREV0 1172
    26 #define ISO14443A_RX_PENDING_TIMEOUT 1 // ms
    27 
    28 /* Peripheral definitions */
    29 #define CODEC_DEMOD_POWER_PORT PORTB
    30 #define CODEC_DEMOD_POWER_MASK PIN0_bm
    31 #define CODEC_DEMOD_IN_PORT PORTB
    32 #define CODEC_DEMOD_IN_MASK (CODEC_DEMOD_IN_MASK0 | CODEC_DEMOD_IN_MASK1)
    33 #define CODEC_DEMOD_IN_MASK0 PIN1_bm
    34 #define CODEC_DEMOD_IN_MASK1 PIN2_bm
    35 #define CODEC_DEMOD_IN_PINCTRL0 PIN1CTRL
    36 #define CODEC_DEMOD_IN_PINCTRL1 PIN2CTRL
    37 #define CODEC_DEMOD_IN_EVMUX0 EVSYS_CHMUX_PORTB_PIN1_gc
    38 #define CODEC_DEMOD_IN_EVMUX1 EVSYS_CHMUX_PORTB_PIN2_gc
    39 #define CODEC_DEMOD_IN_INT0_VECT PORTB_INT0_vect
    40 #define CODEC_LOADMOD_PORT PORTC
    41 #define CODEC_LOADMOD_MASK PIN6_bm
    42 #define CODEC_CARRIER_IN_PORT PORTC
    43 #define CODEC_CARRIER_IN_MASK PIN2_bm
    44 #define CODEC_CARRIER_IN_PINCTRL PIN2CTRL
    45 #define CODEC_CARRIER_IN_EVMUX EVSYS_CHMUX_PORTC_PIN2_gc
    46 #define CODEC_CARRIER_IN_DIV 2 /* external clock division factor */
    47 #define CODEC_SUBCARRIER_PORT PORTC
    48 #define CODEC_SUBCARRIER_MASK_PSK PIN4_bm
    49 #define CODEC_SUBCARRIER_MASK_OOK PIN5_bm
    50 #define CODEC_SUBCARRIER_MASK (CODEC_SUBCARRIER_MASK_PSK | CODEC_SUBCARRIER_MASK_OOK)
    51 #define CODEC_SUBCARRIER_TIMER TCC1
    52 #define CODEC_SUBCARRIER_CC_PSK CCA
    53 #define CODEC_SUBCARRIER_CC_OOK CCB
    54 #define CODEC_SUBCARRIER_CCEN_PSK TC1_CCAEN_bm
    55 #define CODEC_SUBCARRIER_CCEN_OOK TC1_CCBEN_bm
    56 #define CODEC_TIMER_SAMPLING TCD0
    57 #define CODEC_TIMER_SAMPLING_CCA_VECT TCD0_CCA_vect
    58 #define CODEC_TIMER_SAMPLING_CCB_VECT TCD0_CCB_vect
    59 #define CODEC_TIMER_LOADMOD TCE0
    60 #define CODEC_TIMER_LOADMOD_OVF_VECT TCE0_OVF_vect
    61 #define CODEC_TIMER_LOADMOD_CCA_VECT TCE0_CCA_vect
    62 #define CODEC_TIMER_LOADMOD_CCB_VECT TCE0_CCB_vect
    63 #define CODEC_TIMER_LOADMOD_CCC_VECT TCE0_CCC_vect
    64 #define CODEC_TIMER_MODSTART_EVSEL TC_EVSEL_CH0_gc
    65 #define CODEC_TIMER_MODEND_EVSEL TC_EVSEL_CH1_gc
    66 #define CODEC_TIMER_CARRIER_CLKSEL TC_CLKSEL_EVCH6_gc
    67 #define CODEC_READER_TIMER TCC0
    68 #define CODEC_READER_PORT PORTC
    69 #define CODEC_READER_MASK_LEFT PIN0_bm
    70 #define CODEC_READER_MASK_RIGHT PIN1_bm
    71 #define CODEC_READER_MASK (CODEC_READER_MASK_LEFT | CODEC_READER_MASK_RIGHT)
    72 #define CODEC_READER_PINCTRL_LEFT PIN0CTRL
    73 #define CODEC_READER_PINCTRL_RIGHT PIN1CTRL
    74 #define CODEC_AC_DEMOD_SETTINGS AC_HSMODE_bm | AC_HYSMODE_NO_gc
    75 #define CODEC_MAXIMUM_THRESHOLD 0xFFF // the maximum voltage can be calculated with ch0data * Vref / 0xFFF
    76 #define CODEC_THRESHOLD_CALIBRATE_MIN 128
    77 #define CODEC_THRESHOLD_CALIBRATE_MAX 1024
    78 #define CODEC_THRESHOLD_CALIBRATE_STEPS 8
    79 #define CODEC_TIMER_TIMESTAMPS TCD1
    80 #define CODEC_TIMER_TIMESTAMPS_CCA_VECT TCD1_CCA_vect
    81 
    82 #define CODEC_BUFFER_SIZE 256
    83 
    84 #define CODEC_CARRIER_FREQ 13560000
    85 
    86 #define Codec8Reg0 GPIOR0
    87 #define Codec8Reg1 GPIOR1
    88 #define Codec8Reg2 GPIOR2
    89 #define Codec8Reg3 GPIOR3
    90 #define CodecCount16Register1 (*((volatile uint16_t*) &GPIOR4)) /* GPIOR4 & GPIOR5 */
    91 #define CodecCount16Register2 (*((volatile uint16_t*) &GPIOR6)) /* GPIOR4 & GPIOR5 */
    92 #define CodecPtrRegister1 (*((volatile uint8_t**) &GPIOR8))
    93 #define CodecPtrRegister2 (*((volatile uint8_t**) &GPIORA))
    94 
    95 extern uint16_t ReaderThreshold;
    96 extern uint16_t Reader_FWT;
    97 
    98 #define FWI2FWT(x) ((uint32_t)(256 * 16 * ((uint32_t)1 << (x))) / (CODEC_CARRIER_FREQ / 1000) + 1)
    99 
    100 typedef enum {
    101  CODEC_SUBCARRIERMOD_OFF,
    102  CODEC_SUBCARRIERMOD_OOK
    103 } SubcarrierModType;
    104 
    105 extern uint8_t CodecBuffer[CODEC_BUFFER_SIZE];
    106 
    107 INLINE void CodecInit(void) {
    108  ActiveConfiguration.CodecInitFunc();
    109 }
    110 
    111 INLINE void CodecDeInit(void) {
    112  ActiveConfiguration.CodecDeInitFunc();
    113 }
    114 
    115 INLINE void CodecTask(void) {
    116  ActiveConfiguration.CodecTaskFunc();
    117 }
    118 
    119 /* Helper Functions for Codec implementations */
    120 INLINE void CodecInitCommon(void)
    121 {
    122  /* Configure CARRIER input pin and route it to EVSYS.
    123  * Multiply by 2 again by using both edges when externally
    124  * dividing by 2 */
    125 #if CODEC_CARRIER_IN_DIV == 2
    126  CODEC_CARRIER_IN_PORT.CODEC_CARRIER_IN_PINCTRL = PORT_ISC_BOTHEDGES_gc;
    127 #else
    128 #error Option not supported
    129 #endif
    130  CODEC_CARRIER_IN_PORT.DIRCLR = CODEC_CARRIER_IN_MASK;
    131  EVSYS.CH6MUX = CODEC_CARRIER_IN_EVMUX;
    132 
    133  /* Configure two DEMOD pins for input.
    134  * Configure event channel 0 for rising edge (begin of modulation pause)
    135  * Configure event channel 1 for falling edge (end of modulation pause) */
    136  CODEC_DEMOD_POWER_PORT.OUTCLR = CODEC_DEMOD_POWER_MASK;
    137  CODEC_DEMOD_POWER_PORT.DIRSET = CODEC_DEMOD_POWER_MASK;
    138  CODEC_DEMOD_IN_PORT.DIRCLR = CODEC_DEMOD_IN_MASK;
    139  CODEC_DEMOD_IN_PORT.CODEC_DEMOD_IN_PINCTRL0 = PORT_ISC_RISING_gc;
    140  CODEC_DEMOD_IN_PORT.CODEC_DEMOD_IN_PINCTRL1 = PORT_ISC_FALLING_gc;
    141  CODEC_DEMOD_IN_PORT.INT0MASK = 0;
    142  CODEC_DEMOD_IN_PORT.INTCTRL = PORT_INT0LVL_HI_gc;
    143  EVSYS.CH0MUX = CODEC_DEMOD_IN_EVMUX0;
    144  EVSYS.CH1MUX = CODEC_DEMOD_IN_EVMUX1;
    145 
    146  /* Configure loadmod pin configuration and use a virtual port configuration
    147  * for single instruction cycle access */
    148  CODEC_LOADMOD_PORT.DIRSET = CODEC_LOADMOD_MASK;
    149  CODEC_LOADMOD_PORT.OUTCLR = CODEC_LOADMOD_MASK;
    150  PORTCFG.VPCTRLA &= ~PORTCFG_VP0MAP_gm;
    151  PORTCFG.VPCTRLA |= PORTCFG_VP02MAP_PORTC_gc;
    152 
    153  /* Configure subcarrier pins for output */
    154  CODEC_SUBCARRIER_PORT.DIRSET = CODEC_SUBCARRIER_MASK;
    155  CODEC_SUBCARRIER_PORT.OUTCLR = CODEC_SUBCARRIER_MASK;
    156 
    157  /* Configure pins for reader field with the LEFT output being inverted
    158  * and all bridge outputs static high */
    159  CODEC_READER_PORT.CODEC_READER_PINCTRL_LEFT = PORT_INVEN_bm;
    160  CODEC_READER_PORT.OUTCLR = CODEC_READER_MASK_LEFT;
    161  CODEC_READER_PORT.OUTSET = CODEC_READER_MASK_RIGHT;
    162  CODEC_READER_PORT.DIRSET = CODEC_READER_MASK;
    163 
    164  /* Configure timer for generating reader field and configure AWEX for outputting pattern
    165  * with disabled outputs. */
    166  CODEC_READER_TIMER.CTRLB = TC0_CCAEN_bm | TC_WGMODE_SINGLESLOPE_gc;
    167  CODEC_READER_TIMER.PER = F_CPU / CODEC_CARRIER_FREQ - 1;
    168  CODEC_READER_TIMER.CCA = F_CPU / CODEC_CARRIER_FREQ / 2 ;
    169 
    170  AWEXC.OUTOVEN = 0x00;
    171  AWEXC.CTRL = AWEX_CWCM_bm | AWEX_DTICCAEN_bm | AWEX_DTICCBEN_bm;
    172 
    173  /* Configure DAC for the reference voltage */
    174  DACB.EVCTRL = 0;
    175  DACB.CTRLB = DAC_CHSEL_SINGLE_gc;
    176  DACB.CTRLC = DAC_REFSEL_AVCC_gc;
    177  DACB.CTRLA = DAC_IDOEN_bm | DAC_ENABLE_bm;
    178  DACB.CH0DATA = ReaderThreshold; // real threshold voltage can be calculated with ch0data * Vref / 0xFFF
    179 
    180  /* Configure Analog Comparator 0 to detect changes in demodulated reader field */
    181  ACA.AC0MUXCTRL = AC_MUXPOS_DAC_gc | AC_MUXNEG_PIN7_gc;
    182  ACA.AC0CTRL = CODEC_AC_DEMOD_SETTINGS;
    183 
    184  /* Configure Analog Comparator 1 to detect SOC */
    185  ACA.AC1MUXCTRL = AC_MUXPOS_DAC_gc | AC_MUXNEG_PIN7_gc;
    186  ACA.AC1CTRL = CODEC_AC_DEMOD_SETTINGS;
    187 }
    188 
    189 INLINE void CodecSetSubcarrier(SubcarrierModType ModType, uint16_t Divider)
    190 {
    191  if (ModType == CODEC_SUBCARRIERMOD_OFF) {
    192  CODEC_SUBCARRIER_TIMER.CTRLA = TC_CLKSEL_OFF_gc;
    193  CODEC_SUBCARRIER_TIMER.CTRLB = 0;
    194  } else if (ModType == CODEC_SUBCARRIERMOD_OOK) {
    195  /* Configure subcarrier generation with 50% DC output using OOK */
    196  CODEC_SUBCARRIER_TIMER.CNT = 0;
    197  CODEC_SUBCARRIER_TIMER.PER = Divider - 1;
    198  CODEC_SUBCARRIER_TIMER.CODEC_SUBCARRIER_CC_OOK = Divider/2;
    199  CODEC_SUBCARRIER_TIMER.CTRLB = CODEC_SUBCARRIER_CCEN_OOK | TC_WGMODE_SINGLESLOPE_gc;
    200  }
    201 }
    202 
    203 INLINE void CodecStartSubcarrier(void)
    204 {
    205  CODEC_SUBCARRIER_TIMER.CTRLA = CODEC_TIMER_CARRIER_CLKSEL;
    206 }
    207 
    208 INLINE void CodecSetDemodPower(bool bOnOff)
    209 {
    210  if (bOnOff) {
    211  CODEC_DEMOD_POWER_PORT.OUTSET = CODEC_DEMOD_POWER_MASK;
    212  } else {
    213  CODEC_DEMOD_POWER_PORT.OUTCLR = CODEC_DEMOD_POWER_MASK;
    214  }
    215 }
    216 
    217 INLINE bool CodecGetLoadmodState(void) {
    218  if (ACA.STATUS & AC_AC0STATE_bm) {
    219  return true;
    220  } else {
    221  return false;
    222  }
    223 }
    224 
    225 INLINE void CodecSetLoadmodState(bool bOnOff) {
    226  if (bOnOff) {
    227  VPORT0.OUT |= CODEC_LOADMOD_MASK;
    228  } else {
    229  VPORT0.OUT &= ~CODEC_LOADMOD_MASK;
    230  }
    231 }
    232 
    233 INLINE void CodecSetReaderField(bool bOnOff) { // this is the function for turning on/off the reader field dumbly; before using this function, please consider to use CodecReaderField{Start,Stop}
    234 
    235  if (bOnOff) {
    236  /* Start timer for field generation and unmask outputs */
    237  CODEC_READER_TIMER.CTRLA = TC_CLKSEL_DIV1_gc;
    238  AWEXC.OUTOVEN = CODEC_READER_MASK;
    239  } else {
    240  /* Disable outputs of AWEX and stop field generation */
    241  AWEXC.OUTOVEN = 0x00;
    242  CODEC_READER_TIMER.CTRLA = TC_CLKSEL_OFF_gc;
    243  }
    244 }
    245 
    246 INLINE bool CodecGetReaderField(void) {
    247  return (CODEC_READER_TIMER.CTRLA == TC_CLKSEL_DIV1_gc) && (AWEXC.OUTOVEN == CODEC_READER_MASK);
    248 }
    249 
    250 void CodecReaderFieldStart(void);
    251 void CodecReaderFieldStop(void);
    252 bool CodecIsReaderFieldReady(void);
    253 
    254 void CodecReaderFieldRestart(uint16_t delay);
    255 #define FIELD_RESTART() CodecReaderFieldRestart(100)
    256 bool CodecIsReaderToBeRestarted(void);
    257 
    258 void CodecThresholdSet(uint16_t th);
    259 uint16_t CodecThresholdIncrement(void);
    260 void CodecThresholdReset(void);
    261 #endif /* CODEC_H_ */
    void(* CodecInitFunc)(void)
    Definition: Configuration.h:59
    +
    void(* CodecTaskFunc)(void)
    Definition: Configuration.h:65
    +
    void(* CodecDeInitFunc)(void)
    Definition: Configuration.h:61
    diff --git a/Doc/Doxygen/html/_command_line_8h_source.html b/Doc/Doxygen/html/_command_line_8h_source.html index 8103e14..6ed33a0 100644 --- a/Doc/Doxygen/html/_command_line_8h_source.html +++ b/Doc/Doxygen/html/_command_line_8h_source.html @@ -3,7 +3,8 @@ - + + Chameleon-Mini: CommandLine.h Source File @@ -11,9 +12,6 @@ - @@ -31,40 +29,19 @@
    - + - - + + + +
    1 /*
    2  * CommandLine.h
    3  *
    4  * Created on: 04.05.2013
    5  * Author: skuser
    6  */
    7 
    8 #ifndef COMMANDLINE_H_
    9 #define COMMANDLINE_H_
    10 
    11 #include "Terminal.h"
    12 #include "Commands.h"
    13 
    14 void CommandLineInit(void);
    15 bool CommandLineProcessByte(uint8_t Byte);
    16 void CommandLineTick(void);
    17 
    18 void CommandLineAppendData(void const * const Buffer, uint16_t Bytes);
    19 
    20 /* Functions for timeout commands */
    21 void CommandLinePendingTaskFinished(CommandStatusIdType ReturnStatusID, char const * const OutMessage); // must be called, when the intended task is finished
    22 extern void (*CommandLinePendingTaskTimeout) (void); // gets called on timeout to end the pending task
    23 void CommandLinePendingTaskBreak(void); // this manually triggers a timeout
    24 
    25 #endif /* COMMANDLINE_H_ */
    diff --git a/Doc/Doxygen/html/_command_line_8txt.html b/Doc/Doxygen/html/_command_line_8txt.html index bb8b61f..27e78de 100644 --- a/Doc/Doxygen/html/_command_line_8txt.html +++ b/Doc/Doxygen/html/_command_line_8txt.html @@ -3,7 +3,8 @@ - + + Chameleon-Mini: CommandLine.txt File Reference @@ -11,9 +12,6 @@ - @@ -31,40 +29,19 @@ - + - - + + + +
    diff --git a/Doc/Doxygen/html/_commands_8h_source.html b/Doc/Doxygen/html/_commands_8h_source.html index 450438c..990c90f 100644 --- a/Doc/Doxygen/html/_commands_8h_source.html +++ b/Doc/Doxygen/html/_commands_8h_source.html @@ -3,7 +3,8 @@ - + + Chameleon-Mini: Commands.h Source File @@ -11,9 +12,6 @@ - @@ -31,40 +29,19 @@
    - + - - + + + +
    1 
    2 
    3 #ifndef COMMANDS_H_
    4 #define COMMANDS_H_
    5 
    6 #include "../Common.h"
    7 
    8 #define MAX_COMMAND_LENGTH 16
    9 #define MAX_STATUS_LENGTH 32
    10 
    11 
    12 #define COMMAND_INFO_OK_ID 100
    13 #define COMMAND_INFO_OK "OK"
    14 #define COMMAND_INFO_OK_WITH_TEXT_ID 101
    15 #define COMMAND_INFO_OK_WITH_TEXT "OK WITH TEXT"
    16 #define COMMAND_INFO_XMODEM_WAIT_ID 110
    17 #define COMMAND_INFO_XMODEM_WAIT "WAITING FOR XMODEM"
    18 #define COMMAND_INFO_FALSE_ID 120
    19 #define COMMAND_INFO_FALSE "FALSE"
    20 #define COMMAND_INFO_TRUE_ID 121
    21 #define COMMAND_INFO_TRUE "TRUE"
    22 #define COMMAND_ERR_UNKNOWN_CMD_ID 200
    23 #define COMMAND_ERR_UNKNOWN_CMD "UNKNOWN COMMAND"
    24 #define COMMAND_ERR_INVALID_USAGE_ID 201
    25 #define COMMAND_ERR_INVALID_USAGE "INVALID COMMAND USAGE"
    26 #define COMMAND_ERR_INVALID_PARAM_ID 202
    27 #define COMMAND_ERR_INVALID_PARAM "INVALID PARAMETER"
    28 #define COMMAND_ERR_TIMEOUT_ID 203
    29 #define COMMAND_ERR_TIMEOUT "TIMEOUT"
    30 #define TIMEOUT_COMMAND 255 // this is just for the CommandLine module to know that this is a timeout command
    31 
    32 
    33 #define COMMAND_CHAR_TRUE '1'
    34 #define COMMAND_CHAR_FALSE '0'
    35 #define COMMAND_CHAR_SUGGEST '?' /* <CMD>=? for help */
    36 
    37 #define COMMAND_UID_BUFSIZE 32
    38 
    39 #define COMMAND_IS_SUGGEST_STRING(x) ( ((x)[0] == COMMAND_CHAR_SUGGEST) && ((x)[1] == '\0') )
    40 
    41 typedef uint8_t CommandStatusIdType;
    42 typedef const char CommandStatusMessageType[MAX_STATUS_LENGTH];
    43 
    44 typedef CommandStatusIdType (*CommandExecFuncType) (char* OutMessage);
    45 typedef CommandStatusIdType (*CommandExecParamFuncType) (char* OutMessage, const char* InParams);
    46 typedef CommandStatusIdType (*CommandSetFuncType) (char* OutMessage, const char* InParam);
    47 typedef CommandStatusIdType (*CommandGetFuncType) (char* OutParam);
    48 
    49 typedef struct {
    50  char Command[MAX_COMMAND_LENGTH];
    51  CommandExecFuncType ExecFunc;
    52  CommandExecParamFuncType ExecParamFunc;
    53  CommandSetFuncType SetFunc;
    54  CommandGetFuncType GetFunc;
    55 } CommandEntryType;
    56 
    57 #define COMMAND_VERSION "VERSION"
    58 CommandStatusIdType CommandGetVersion(char* OutParam);
    59 
    60 #define COMMAND_CONFIG "CONFIG"
    61 CommandStatusIdType CommandGetConfig(char* OutParam);
    62 CommandStatusIdType CommandSetConfig(char* OutMessage, const char* InParam);
    63 
    64 #define COMMAND_UID "UID"
    65 #define COMMAND_UID_RANDOM "RANDOM"
    66 CommandStatusIdType CommandGetUid(char* OutParam);
    67 CommandStatusIdType CommandSetUid(char* OutMessage, const char* InParam);
    68 
    69 #define COMMAND_READONLY "READONLY"
    70 CommandStatusIdType CommandGetReadOnly(char* OutParam);
    71 CommandStatusIdType CommandSetReadOnly(char* OutMessage, const char* InParam);
    72 
    73 #define COMMAND_UPLOAD "UPLOAD"
    74 CommandStatusIdType CommandExecUpload(char* OutMessage);
    75 
    76 #define COMMAND_DOWNLOAD "DOWNLOAD"
    77 CommandStatusIdType CommandExecDownload(char* OutMessage);
    78 
    79 #define COMMAND_RESET "RESET"
    80 CommandStatusIdType CommandExecReset(char* OutMessage);
    81 
    82 #define COMMAND_UPGRADE "UPGRADE"
    83 CommandStatusIdType CommandExecUpgrade(char* OutMessage);
    84 
    85 #define COMMAND_MEMSIZE "MEMSIZE"
    86 CommandStatusIdType CommandGetMemSize(char* OutParam);
    87 
    88 #define COMMAND_UIDSIZE "UIDSIZE"
    89 CommandStatusIdType CommandGetUidSize(char* OutParam);
    90 
    91 #define COMMAND_RBUTTON "RBUTTON"
    92 CommandStatusIdType CommandGetRButton(char* OutParam);
    93 CommandStatusIdType CommandSetRButton(char* OutMessage, const char* InParam);
    94 
    95 #define COMMAND_RBUTTON_LONG "RBUTTON_LONG"
    96 CommandStatusIdType CommandGetRButtonLong(char* OutParam);
    97 CommandStatusIdType CommandSetRButtonLong(char* OutMessage, const char* InParam);
    98 
    99 #define COMMAND_LBUTTON "LBUTTON"
    100 CommandStatusIdType CommandGetLButton(char* OutParam);
    101 CommandStatusIdType CommandSetLButton(char* OutMessage, const char* InParam);
    102 
    103 #define COMMAND_LBUTTON_LONG "LBUTTON_LONG"
    104 CommandStatusIdType CommandGetLButtonLong(char* OutParam);
    105 CommandStatusIdType CommandSetLButtonLong(char* OutMessage, const char* InParam);
    106 
    107 
    108 #define COMMAND_LEDGREEN "LEDGREEN"
    109 CommandStatusIdType CommandGetLedGreen(char* OutParam);
    110 CommandStatusIdType CommandSetLedGreen(char* OutMessage, const char* InParam);
    111 
    112 #define COMMAND_LEDRED "LEDRED"
    113 CommandStatusIdType CommandGetLedRed(char* OutParam);
    114 CommandStatusIdType CommandSetLedRed(char* OutMessage, const char* InParam);
    115 
    116 #define COMMAND_LOGMODE "LOGMODE"
    117 CommandStatusIdType CommandGetLogMode(char* OutParam);
    118 CommandStatusIdType CommandSetLogMode(char* OutMessage, const char* InParam);
    119 
    120 #define COMMAND_LOGMEM "LOGMEM"
    121 CommandStatusIdType CommandGetLogMem(char* OutParam);
    122 
    123 #define COMMAND_LOGDOWNLOAD "LOGDOWNLOAD"
    124 CommandStatusIdType CommandExecLogDownload(char* OutMessage);
    125 
    126 #define COMMAND_STORELOG "LOGSTORE"
    127 CommandStatusIdType CommandExecStoreLog(char* OutMessage);
    128 
    129 #define COMMAND_LOGCLEAR "LOGCLEAR"
    130 CommandStatusIdType CommandExecLogClear(char* OutMessage);
    131 
    132 #define COMMAND_SETTING "SETTING"
    133 CommandStatusIdType CommandGetSetting(char* OutParam);
    134 CommandStatusIdType CommandSetSetting(char* OutMessage, const char* InParam);
    135 
    136 #define COMMAND_CLEAR "CLEAR"
    137 CommandStatusIdType CommandExecClear(char* OutMessage);
    138 
    139 #define COMMAND_STORE "STORE"
    140 CommandStatusIdType CommandExecStore(char* OutMessage);
    141 
    142 #define COMMAND_RECALL "RECALL"
    143 CommandStatusIdType CommandExecRecall(char* OutMessage);
    144 
    145 #define COMMAND_CHARGING "CHARGING"
    146 CommandStatusIdType CommandGetCharging(char* OutParam);
    147 
    148 #define COMMAND_HELP "HELP"
    149 CommandStatusIdType CommandExecHelp(char* OutMessage);
    150 
    151 #define COMMAND_RSSI "RSSI"
    152 CommandStatusIdType CommandGetRssi(char* OutParam);
    153 
    154 #define COMMAND_SYSTICK "SYSTICK"
    155 CommandStatusIdType CommandGetSysTick(char* OutParam);
    156 
    157 #define COMMAND_SEND_RAW "SEND_RAW"
    158 CommandStatusIdType CommandExecParamSendRaw(char* OutMessage, const char* InParams);
    159 
    160 #define COMMAND_SEND "SEND"
    161 CommandStatusIdType CommandExecParamSend(char* OutMessage, const char* InParams);
    162 
    163 #define COMMAND_GETUID "GETUID"
    164 CommandStatusIdType CommandExecGetUid(char* OutMessage);
    165 
    166 #define COMMAND_DUMP_MFU "DUMP_MFU"
    167 CommandStatusIdType CommandExecDumpMFU(char* OutMessage);
    168 
    169 #define COMMAND_IDENTIFY_CARD "IDENTIFY"
    170 CommandStatusIdType CommandExecIdentifyCard(char* OutMessage);
    171 
    172 #define COMMAND_TIMEOUT "TIMEOUT"
    173 CommandStatusIdType CommandGetTimeout(char* OutMessage);
    174 CommandStatusIdType CommandSetTimeout(char* OutMessage, const char* InParam);
    175 
    176 #define COMMAND_THRESHOLD "THRESHOLD"
    177 CommandStatusIdType CommandGetThreshold(char* OutParam);
    178 CommandStatusIdType CommandSetThreshold(char* OutMessage, const char* InParam);
    179 
    180 #define COMMAND_AUTOCALIBRATE "AUTOCALIBRATE"
    181 CommandStatusIdType CommandExecAutocalibrate(char* OutMessage);
    182 
    183 #define COMMAND_FIELD "FIELD"
    184 CommandStatusIdType CommandSetField(char* OutMessage, const char* InParam);
    185 CommandStatusIdType CommandGetField(char* OutMessage);
    186 
    187 #define COMMAND_LIST_END ""
    188 /* Defines the end of command list. This is no actual command */
    189 
    190 #endif /* COMMANDS_H_ */
    diff --git a/Doc/Doxygen/html/_common_8h_source.html b/Doc/Doxygen/html/_common_8h_source.html index c94e4c0..576f554 100644 --- a/Doc/Doxygen/html/_common_8h_source.html +++ b/Doc/Doxygen/html/_common_8h_source.html @@ -3,7 +3,8 @@ - + + Chameleon-Mini: Common.h Source File @@ -11,9 +12,6 @@ - @@ -31,40 +29,19 @@ - + - - + + + +
    1 /*
    2  * Common.h
    3  *
    4  * Created on: 20.03.2013
    5  * Author: skuser
    6  */
    7 
    8 #ifndef COMMON_H_
    9 #define COMMON_H_
    10 
    11 #include <stdio.h>
    12 #include <stdbool.h>
    13 #include <util/parity.h>
    14 #include <util/delay.h>
    15 #include <avr/pgmspace.h>
    16 #include <avr/io.h>
    17 
    18 #define ODD_PARITY(Value) OddParityBit(Value)//(parity_even_bit(Value) ? 0 : 1)
    19 
    20 #define INLINE \
    21  static inline __attribute__((always_inline))
    22 
    23 #define ARRAY_COUNT(x) \
    24  (sizeof(x) / sizeof(x[0]))
    25 
    26 #define NIBBLE_TO_HEXCHAR(x) ( (x) < 0x0A ? (x) + '0' : (x) + 'A' - 0x0A )
    27 #define HEXCHAR_TO_NIBBLE(x) ( (x) < 'A' ? (x) - '0' : (x) - 'A' + 0x0A )
    28 #define VALID_HEXCHAR(x) ( ( (x) >= '0' && (x) <= '9' ) || ( (x) >= 'A' && (x) <= 'F' ) )
    29 #define MIN(x,y) ( (x) < (y) ? (x) : (y) )
    30 #define MAX(x,y) ( (x) > (y) ? (x) : (y) )
    31 #define SYSTICK_DIFF(since) ((uint16_t) (SystemGetSysTick() - since))
    32 #define SYSTICK_DIFF_100MS(since) (SYSTICK_DIFF(since) / 100)
    33 
    34 #define BITS_PER_BYTE 8
    35 
    36 uint16_t BufferToHexString(char* HexOut, uint16_t MaxChars, const void* Buffer, uint16_t ByteCount);
    37 uint16_t HexStringToBuffer(void* Buffer, uint16_t MaxBytes, const char* HexIn);
    38 
    39 INLINE uint8_t BitReverseByte(uint8_t Byte)
    40 {
    41  extern const uint8_t PROGMEM BitReverseByteTable[];
    42 
    43  return pgm_read_byte(&BitReverseByteTable[Byte]);
    44 }
    45 
    46 INLINE uint8_t OddParityBit(uint8_t Byte)
    47 {
    48  extern const uint8_t PROGMEM OddParityByteTable[];
    49 
    50  return pgm_read_byte(&OddParityByteTable[Byte]);
    51 }
    52 
    53 INLINE uint8_t StringLength(const char* Str, uint8_t MaxLen)
    54 {
    55  uint8_t StrLen = 0;
    56 
    57  while(MaxLen > 0) {
    58  if (*Str++ == '\0')
    59  break;
    60 
    61  MaxLen--;
    62  StrLen++;
    63  }
    64 
    65  return StrLen;
    66 }
    67 
    68 #endif /* COMMON_H_ */
    diff --git a/Doc/Doxygen/html/_configuration_8h.html b/Doc/Doxygen/html/_configuration_8h.html index 9fd5290..7213cda 100644 --- a/Doc/Doxygen/html/_configuration_8h.html +++ b/Doc/Doxygen/html/_configuration_8h.html @@ -3,7 +3,8 @@ - + + Chameleon-Mini: Configuration.h File Reference @@ -11,9 +12,6 @@ - @@ -31,40 +29,19 @@ - + - - + + + +
    diff --git a/Doc/Doxygen/html/_configuration_8h_source.html b/Doc/Doxygen/html/_configuration_8h_source.html index 8826b97..62a17ce 100644 --- a/Doc/Doxygen/html/_configuration_8h_source.html +++ b/Doc/Doxygen/html/_configuration_8h_source.html @@ -3,7 +3,8 @@ - + + Chameleon-Mini: Configuration.h Source File @@ -11,9 +12,6 @@ - @@ -31,40 +29,19 @@ - + - - + + + +
    Configuration.h
    -Go to the documentation of this file.
    1 /*
    2  * Standards.h
    3  *
    4  * Created on: 15.02.2013
    5  * Author: skuser
    6  */
    8 #ifndef STANDARDS_H_
    9 #define STANDARDS_H_
    10 
    11 #include <stdint.h>
    12 #include <stdbool.h>
    13 
    14 #define CONFIGURATION_NAME_LENGTH_MAX 32
    15 #define CONFIGURATION_UID_SIZE_MAX 16
    16 
    17 typedef uint8_t ConfigurationUidType[CONFIGURATION_UID_SIZE_MAX];
    18 
    19 typedef enum {
    20  /* This HAS to be the first element */
    21  CONFIG_NONE = 0,
    22 
    23 #ifdef CONFIG_MF_ULTRALIGHT_SUPPORT
    24  CONFIG_MF_ULTRALIGHT,
    25 #endif
    26 #ifdef CONFIG_MF_CLASSIC_1K_SUPPORT
    27  CONFIG_MF_CLASSIC_1K,
    28 #endif
    29 #ifdef CONFIG_MF_CLASSIC_1K_7B_SUPPORT
    30  CONFIG_MF_CLASSIC_1K_7B,
    31 #endif
    32 #ifdef CONFIG_MF_CLASSIC_4K_SUPPORT
    33  CONFIG_MF_CLASSIC_4K,
    34 #endif
    35 #ifdef CONFIG_MF_CLASSIC_4K_7B_SUPPORT
    36  CONFIG_MF_CLASSIC_4K_7B,
    37 #endif
    38 #ifdef CONFIG_ISO14443A_SNIFF_SUPPORT
    39  CONFIG_ISO14443A_SNIFF,
    40 #endif
    41 #ifdef CONFIG_ISO14443A_READER_SUPPORT
    42  CONFIG_ISO14443A_READER,
    43 #endif
    44  /* This HAS to be the last element */
    45  CONFIG_COUNT
    46 } ConfigurationEnum;
    47 
    49 typedef struct {
    57  void (*CodecInitFunc) (void);
    59  void (*CodecDeInitFunc) (void);
    63  void (*CodecTaskFunc) (void);
    75  void (*ApplicationInitFunc) (void);
    77  void (*ApplicationResetFunc) (void);
    79  void (*ApplicationTaskFunc) (void);
    81  void (*ApplicationTickFunc) (void);
    93  uint16_t (*ApplicationProcessFunc) (uint8_t* ByteBuffer, uint16_t BitCount);
    98  void (*ApplicationGetUidFunc) (ConfigurationUidType Uid);
    103  void (*ApplicationSetUidFunc) (ConfigurationUidType Uid);
    114  uint16_t MemorySize;
    120  uint8_t UidSize;
    124  bool ReadOnly;
    125 
    127 
    128 extern ConfigurationType ActiveConfiguration;
    129 
    130 void ConfigurationInit(void);
    131 void ConfigurationSetById(ConfigurationEnum Configuration);
    132 void ConfigurationGetByName(char* Configuration, uint16_t BufferSize);
    133 bool ConfigurationSetByName(const char* Configuration);
    134 void ConfigurationGetList(char* ConfigurationList, uint16_t BufferSize);
    135 
    136 #endif /* STANDARDS_H_ */
    uint16_t MemorySize
    Definition: Configuration.h:114
    -
    Definition: Configuration.h:49
    -
    bool ReadOnly
    Definition: Configuration.h:124
    -
    uint8_t UidSize
    Definition: Configuration.h:120
    +Go to the documentation of this file.
    1 /*
    2  * Standards.h
    3  *
    4  * Created on: 15.02.2013
    5  * Author: skuser
    6  */
    8 #ifndef STANDARDS_H_
    9 #define STANDARDS_H_
    10 
    11 #include <stdint.h>
    12 #include <stdbool.h>
    13 
    14 #define CONFIGURATION_NAME_LENGTH_MAX 32
    15 #define CONFIGURATION_UID_SIZE_MAX 16
    16 
    17 typedef uint8_t ConfigurationUidType[CONFIGURATION_UID_SIZE_MAX];
    18 
    19 typedef enum {
    20  /* This HAS to be the first element */
    21  CONFIG_NONE = 0,
    22 
    23 #ifdef CONFIG_MF_ULTRALIGHT_SUPPORT
    24  CONFIG_MF_ULTRALIGHT,
    25  CONFIG_MF_ULTRALIGHT_EV1_80B,
    26  CONFIG_MF_ULTRALIGHT_EV1_164B,
    27 #endif
    28 #ifdef CONFIG_MF_CLASSIC_1K_SUPPORT
    29  CONFIG_MF_CLASSIC_1K,
    30 #endif
    31 #ifdef CONFIG_MF_CLASSIC_1K_7B_SUPPORT
    32  CONFIG_MF_CLASSIC_1K_7B,
    33 #endif
    34 #ifdef CONFIG_MF_CLASSIC_4K_SUPPORT
    35  CONFIG_MF_CLASSIC_4K,
    36 #endif
    37 #ifdef CONFIG_MF_CLASSIC_4K_7B_SUPPORT
    38  CONFIG_MF_CLASSIC_4K_7B,
    39 #endif
    40 #ifdef CONFIG_ISO14443A_SNIFF_SUPPORT
    41  CONFIG_ISO14443A_SNIFF,
    42 #endif
    43 #ifdef CONFIG_ISO14443A_READER_SUPPORT
    44  CONFIG_ISO14443A_READER,
    45 #endif
    46  /* This HAS to be the last element */
    47  CONFIG_COUNT
    48 } ConfigurationEnum;
    49 
    51 typedef struct {
    59  void (*CodecInitFunc) (void);
    61  void (*CodecDeInitFunc) (void);
    65  void (*CodecTaskFunc) (void);
    77  void (*ApplicationInitFunc) (void);
    79  void (*ApplicationResetFunc) (void);
    81  void (*ApplicationTaskFunc) (void);
    83  void (*ApplicationTickFunc) (void);
    95  uint16_t (*ApplicationProcessFunc) (uint8_t* ByteBuffer, uint16_t BitCount);
    100  void (*ApplicationGetUidFunc) (ConfigurationUidType Uid);
    105  void (*ApplicationSetUidFunc) (ConfigurationUidType Uid);
    116  uint16_t MemorySize;
    122  uint8_t UidSize;
    126  bool ReadOnly;
    127 
    129 
    130 extern ConfigurationType ActiveConfiguration;
    131 
    132 void ConfigurationInit(void);
    133 void ConfigurationSetById(ConfigurationEnum Configuration);
    134 void ConfigurationGetByName(char* Configuration, uint16_t BufferSize);
    135 bool ConfigurationSetByName(const char* Configuration);
    136 void ConfigurationGetList(char* ConfigurationList, uint16_t BufferSize);
    137 
    138 #endif /* STANDARDS_H_ */
    uint16_t MemorySize
    Definition: Configuration.h:116
    +
    Definition: Configuration.h:51
    +
    bool ReadOnly
    Definition: Configuration.h:126
    +
    uint8_t UidSize
    Definition: Configuration.h:122
    diff --git a/Doc/Doxygen/html/_configurations_8txt.html b/Doc/Doxygen/html/_configurations_8txt.html index 0ba4168..9ad4121 100644 --- a/Doc/Doxygen/html/_configurations_8txt.html +++ b/Doc/Doxygen/html/_configurations_8txt.html @@ -3,7 +3,8 @@ - + + Chameleon-Mini: Configurations.txt File Reference @@ -11,9 +12,6 @@ - @@ -31,40 +29,19 @@
    - + - - + + + +
    diff --git a/Doc/Doxygen/html/_crypto1_8h_source.html b/Doc/Doxygen/html/_crypto1_8h_source.html index ca9aca4..16d92f2 100644 --- a/Doc/Doxygen/html/_crypto1_8h_source.html +++ b/Doc/Doxygen/html/_crypto1_8h_source.html @@ -3,7 +3,8 @@ - + + Chameleon-Mini: Crypto1.h Source File @@ -11,9 +12,6 @@ - @@ -31,40 +29,19 @@
    - + - - + + + +
    1 #ifndef CRYPTO1_H
    2 #define CRYPTO1_H
    3 
    4 #include <stdint.h>
    5 #include <stdbool.h>
    6 
    7 void Crypto1GetState(uint8_t* pEven, uint8_t* pOdd);
    8 
    9 /* Gets the current keystream-bit, without shifting the internal LFSR */
    10 uint8_t Crypto1FilterOutput(void);
    11 
    12 /* Set up Crypto1 cipher using the given Key, Uid and CardNonce. Also encrypts
    13  * the CardNonce in-place while in non-linear mode. */
    14 void Crypto1Setup(uint8_t Key[6], uint8_t Uid[4], uint8_t CardNonce[4]);
    15 /* Same for nested auth. CardNonce[4]..[7] will contain the parity bits after return */
    16 void Crypto1SetupNested(uint8_t Key[6], uint8_t Uid[4], uint8_t CardNonce[8], bool Decrypt);
    17 
    18 /* Load the decrypted ReaderNonce into the Crypto1 state LFSR */
    19 void Crypto1Auth(uint8_t EncryptedReaderNonce[4]);
    20 
    21 /* Generate 8 Bits of key stream */
    22 uint8_t Crypto1Byte(void);
    23 
    24 /* Encrypt/Decrypt array */
    25 void Crypto1ByteArray(uint8_t* Buffer, uint8_t Count);
    26 void Crypto1ByteArrayWithParity(uint8_t* Buffer, uint8_t Count);
    27 
    28 /* Generate 4 Bits of key stream */
    29 uint8_t Crypto1Nibble(void);
    30 
    31 /* Execute 'ClockCount' cycles on the PRNG state 'State' */
    32 void Crypto1PRNG(uint8_t State[4], uint8_t ClockCount);
    33 
    34 /* Encrypts buffer with consideration of parity bits */
    35 void Crypto1EncryptWithParity(uint8_t * Buffer, uint8_t BitCount);
    36 
    37 /* Encrypts buffer with LFSR feedback within reader nonce and considers parity bits */
    38 void Crypto1ReaderAuthWithParity(uint8_t PlainReaderAnswerWithParityBits[9]);
    39 
    40 #endif //CRYPTO1_H
    diff --git a/Doc/Doxygen/html/_getting_started_8txt.html b/Doc/Doxygen/html/_getting_started_8txt.html index 51ee229..d6e2b3e 100644 --- a/Doc/Doxygen/html/_getting_started_8txt.html +++ b/Doc/Doxygen/html/_getting_started_8txt.html @@ -3,7 +3,8 @@ - + + Chameleon-Mini: GettingStarted.txt File Reference @@ -11,9 +12,6 @@ - @@ -31,40 +29,19 @@ - + - - + + + +
    diff --git a/Doc/Doxygen/html/_i_s_o14443-2_a_8h_source.html b/Doc/Doxygen/html/_i_s_o14443-2_a_8h_source.html index c9ba1c1..8caa098 100644 --- a/Doc/Doxygen/html/_i_s_o14443-2_a_8h_source.html +++ b/Doc/Doxygen/html/_i_s_o14443-2_a_8h_source.html @@ -3,7 +3,8 @@ - + + Chameleon-Mini: ISO14443-2A.h Source File @@ -11,9 +12,6 @@ - @@ -31,40 +29,19 @@
    - + - - + + + +
    1 /*
    2  * ISO14443-2A.h
    3  *
    4  * Created on: 18.02.2013
    5  * Author: skuser
    6  */
    7 
    8 #ifndef ISO14443_2A_H_
    9 #define ISO14443_2A_H_
    10 
    11 #include "Codec.h"
    12 
    13 #define ISO14443A_APP_NO_RESPONSE 0x0000
    14 #define ISO14443A_APP_CUSTOM_PARITY 0x1000
    15 
    16 #define ISO14443A_BUFFER_PARITY_OFFSET (CODEC_BUFFER_SIZE/2)
    17 
    18 /* Codec Interface */
    19 void ISO14443ACodecInit(void);
    20 void ISO14443ACodecDeInit(void);
    21 void ISO14443ACodecTask(void);
    22 
    23 
    24 
    25 #endif
    diff --git a/Doc/Doxygen/html/_i_s_o14443-3_a_8h_source.html b/Doc/Doxygen/html/_i_s_o14443-3_a_8h_source.html index 1a377a1..a33dc48 100644 --- a/Doc/Doxygen/html/_i_s_o14443-3_a_8h_source.html +++ b/Doc/Doxygen/html/_i_s_o14443-3_a_8h_source.html @@ -3,7 +3,8 @@ - + + Chameleon-Mini: ISO14443-3A.h Source File @@ -11,9 +12,6 @@ - @@ -31,40 +29,19 @@ - + - - + + + +
    1 /*
    2  * ISO14443-2A.h
    3  *
    4  * Created on: 19.03.2013
    5  * Author: skuser
    6  */
    7 
    8 #ifndef ISO14443_3A_H_
    9 #define ISO14443_3A_H_
    10 
    11 #include "../Common.h"
    12 #include <string.h>
    13 
    14 #define ISO14443A_UID_SIZE_SINGLE 4 /* bytes */
    15 #define ISO14443A_UID_SIZE_DOUBLE 7
    16 #define ISO14443A_UID_SIZE_TRIPLE 10
    17 
    18 #define ISO14443A_CMD_REQA 0x26
    19 #define ISO14443A_CMD_WUPA 0x52
    20 #define ISO14443A_CMD_SELECT_CL1 0x93
    21 #define ISO14443A_CMD_SELECT_CL2 0x95
    22 #define ISO14443A_CMD_SELECT_CL3 0x97
    23 #define ISO14443A_CMD_HLTA 0x50
    24 
    25 #define ISO14443A_NVB_AC_START 0x20
    26 #define ISO14443A_NVB_AC_END 0x70
    27 
    28 #define ISO14443A_CL_UID_OFFSET 0
    29 #define ISO14443A_CL_UID_SIZE 4
    30 #define ISO14443A_CL_BCC_OFFSET 4
    31 #define ISO14443A_CL_BCC_SIZE 1 /* Byte */
    32 #define ISO14443A_CL_FRAME_SIZE ((ISO14443A_CL_UID_SIZE + ISO14443A_CL_BCC_SIZE) * 8) /* UID[N...N+3] || BCCN */
    33 #define ISO14443A_SAK_INCOMPLETE 0x04
    34 #define ISO14443A_SAK_COMPLETE_COMPLIANT 0x20
    35 #define ISO14443A_SAK_COMPLETE_NOT_COMPLIANT 0x00
    36 
    37 #define ISO14443A_ATQA_FRAME_SIZE (2 * 8) /* Bit */
    38 #define ISO14443A_SAK_FRAME_SIZE (3 * 8) /* Bit */
    39 
    40 #define ISO14443A_UID0_RANDOM 0x08
    41 #define ISO14443A_UID0_CT 0x88
    42 
    43 #define ISO14443A_CRCA_SIZE 2
    44 
    45 #define ISO14443A_CALC_BCC(ByteBuffer) \
    46  ( ByteBuffer[0] ^ ByteBuffer[1] ^ ByteBuffer[2] ^ ByteBuffer[3] )
    47 
    48 void ISO14443AAppendCRCA(void* Buffer, uint16_t ByteCount);
    49 bool ISO14443ACheckCRCA(const void* Buffer, uint16_t ByteCount);
    50 
    51 INLINE bool ISO14443ASelect(void* Buffer, uint16_t* BitCount, uint8_t* UidCL, uint8_t SAKValue);
    52 INLINE bool ISO14443AWakeUp(void* Buffer, uint16_t* BitCount, uint16_t ATQAValue, bool FromHalt);
    53 
    54 INLINE
    55 bool ISO14443ASelect(void* Buffer, uint16_t* BitCount, uint8_t* UidCL, uint8_t SAKValue)
    56 {
    57  uint8_t* DataPtr = (uint8_t*) Buffer;
    58  uint8_t NVB = DataPtr[1];
    59  //uint8_t CollisionByteCount = (NVB >> 4) & 0x0F;
    60  //uint8_t CollisionBitCount = (NVB >> 0) & 0x0F;
    61 
    62  switch (NVB) {
    63  case ISO14443A_NVB_AC_START:
    64  /* Start of anticollision procedure.
    65  * Send whole UID CLn + BCC */
    66  DataPtr[0] = UidCL[0];
    67  DataPtr[1] = UidCL[1];
    68  DataPtr[2] = UidCL[2];
    69  DataPtr[3] = UidCL[3];
    70  DataPtr[4] = ISO14443A_CALC_BCC(DataPtr);
    71 
    72  *BitCount = ISO14443A_CL_FRAME_SIZE;
    73 
    74  return false;
    75 
    76  case ISO14443A_NVB_AC_END:
    77  /* End of anticollision procedure.
    78  * Send SAK CLn if we are selected. */
    79  if ( (DataPtr[2] == UidCL[0]) &&
    80  (DataPtr[3] == UidCL[1]) &&
    81  (DataPtr[4] == UidCL[2]) &&
    82  (DataPtr[5] == UidCL[3]) ) {
    83 
    84  DataPtr[0] = SAKValue;
    85  ISO14443AAppendCRCA(Buffer, 1);
    86 
    87  *BitCount = ISO14443A_SAK_FRAME_SIZE;
    88  return true;
    89  } else {
    90  /* We have not been selected. Don't send anything. */
    91  *BitCount = 0;
    92  return false;
    93  }
    94  default:
    95  {
    96  uint8_t CollisionByteCount = ((NVB >> 4) & 0x0f) - 2;
    97  uint8_t CollisionBitCount = (NVB >> 0) & 0x0f;
    98  uint8_t mask = 0xFF >> (8 - CollisionBitCount);
    99  // Since the UidCL does not contain the BCC, we have to distinguish here
    100  if (
    101  ((CollisionByteCount == 5 || (CollisionByteCount == 4 && CollisionBitCount > 0)) && memcmp(UidCL, &DataPtr[2], 4) == 0 && (ISO14443A_CALC_BCC(UidCL) & mask) == (DataPtr[6] & mask))
    102  ||
    103  (CollisionByteCount == 4 && CollisionBitCount == 0 && memcmp(UidCL, &DataPtr[2], 4) == 0)
    104  ||
    105  (CollisionByteCount < 4 && memcmp(UidCL, &DataPtr[2], CollisionByteCount) == 0 && (UidCL[CollisionByteCount] & mask) == (DataPtr[CollisionByteCount + 2] & mask))
    106  )
    107  {
    108  DataPtr[0] = UidCL[0];
    109  DataPtr[1] = UidCL[1];
    110  DataPtr[2] = UidCL[2];
    111  DataPtr[3] = UidCL[3];
    112  DataPtr[4] = ISO14443A_CALC_BCC(DataPtr);
    113 
    114  *BitCount = ISO14443A_CL_FRAME_SIZE;
    115  } else {
    116  *BitCount = 0;
    117  }
    118  return false;
    119  }
    120  /* TODO: No anticollision supported */
    121  *BitCount = 0;
    122  return false;
    123  }
    124 }
    125 
    126 INLINE
    127 bool ISO14443AWakeUp(void* Buffer, uint16_t* BitCount, uint16_t ATQAValue, bool FromHalt)
    128 {
    129  uint8_t* DataPtr = (uint8_t*) Buffer;
    130 
    131  if ( ((! FromHalt) && (DataPtr[0] == ISO14443A_CMD_REQA)) ||
    132  (DataPtr[0] == ISO14443A_CMD_WUPA) ){
    133  DataPtr[0] = (ATQAValue >> 0) & 0x00FF;
    134  DataPtr[1] = (ATQAValue >> 8) & 0x00FF;
    135 
    136  *BitCount = ISO14443A_ATQA_FRAME_SIZE;
    137 
    138  return true;
    139  } else {
    140  *BitCount = 0;
    141 
    142  return false;
    143  }
    144 }
    145 
    146 #endif
    diff --git a/Doc/Doxygen/html/_l_e_d_8h_source.html b/Doc/Doxygen/html/_l_e_d_8h_source.html index 91db7d8..84021ce 100644 --- a/Doc/Doxygen/html/_l_e_d_8h_source.html +++ b/Doc/Doxygen/html/_l_e_d_8h_source.html @@ -3,7 +3,8 @@ - + + Chameleon-Mini: LED.h Source File @@ -11,9 +12,6 @@ - @@ -31,40 +29,19 @@ - + - - + + + +
    1 /*
    2  * LED.h
    3  *
    4  * Created on: 10.02.2013
    5  * Author: skuser
    6  */
    7 
    8 #ifndef LED_H
    9 #define LED_H
    10 
    11 #include <avr/io.h>
    12 #include "Common.h"
    13 
    14 #define LED_PORT PORTA
    15 #define LED_GREEN PIN4_bm
    16 #define LED_RED PIN3_bm
    17 #define LED_MASK (LED_GREEN | LED_RED)
    18 
    19 typedef enum LEDFunctionEnum {
    20  LED_NO_FUNC = 0, /* Don't light up the LED */
    21  LED_POWERED, /* Light up the LED whenever the Chameleon is powered */
    22 
    23  LED_TERMINAL_CONN, /* A Terminal/USB connection has been established */
    24  LED_TERMINAL_RXTX, /* There is traffic on the terminal */
    25 
    26  LED_SETTING_CHANGE, /* Outputs a blink code that shows the current setting */
    27 
    28  LED_MEMORY_STORED, /* Blink once when memory has been stored to flash */
    29  LED_MEMORY_CHANGED, /* Switch LED on when card memory has changed compared to flash */
    30 
    31  LED_FIELD_DETECTED, /* Shows LED while a reader field is being detected or turned on by the chameleon itself */
    32 
    33  LED_CODEC_RX, /* Blink LED when receiving codec data */
    34  LED_CODEC_TX, /* Blink LED when transmitting codec data */
    35 
    36  LED_LOG_MEM_FULL, /* Light up if log memory is full. */
    37 
    38  //TODO: LED_APP_SELECTED, /* Show LED while the correct UID has been selected and the application is active */
    39  /* Has to be last element */
    40  LED_FUNC_COUNT
    41 } LEDHookEnum;
    42 
    43 typedef enum LEDActionEnum {
    44  LED_NO_ACTION = 0x00,
    45  LED_OFF = 0x10,
    46  LED_ON = 0x11,
    47  LED_TOGGLE = 0x12,
    48  LED_PULSE = 0x13,
    49  LED_BLINK = 0x20,
    50  LED_BLINK_1X = 0x20,
    51  LED_BLINK_2X, /* Have to be sequentially ordered */
    52  LED_BLINK_3X,
    53  LED_BLINK_4X,
    54  LED_BLINK_5X,
    55  LED_BLINK_6X,
    56  LED_BLINK_7X,
    57  LED_BLINK_8X,
    58 } LEDActionEnum;
    59 
    60 
    61 
    62 void LEDInit(void);
    63 void LEDTick(void);
    64 
    65 void LEDGetFuncList(char* List, uint16_t BufferSize);
    66 void LEDSetFuncById(uint8_t Mask, LEDHookEnum Func);
    67 void LEDGetFuncByName(uint8_t Mask, char* Function, uint16_t BufferSize);
    68 bool LEDSetFuncByName(uint8_t Mask, const char* Function);
    69 
    70 #endif /* LED_H */
    diff --git a/Doc/Doxygen/html/_l_e_d_8txt.html b/Doc/Doxygen/html/_l_e_d_8txt.html index 8a937d1..97c8396 100644 --- a/Doc/Doxygen/html/_l_e_d_8txt.html +++ b/Doc/Doxygen/html/_l_e_d_8txt.html @@ -3,7 +3,8 @@ - + + Chameleon-Mini: LED.txt File Reference @@ -11,9 +12,6 @@ - @@ -31,40 +29,19 @@ - + - - + + + +
    diff --git a/Doc/Doxygen/html/_l_e_d_hook_8h_source.html b/Doc/Doxygen/html/_l_e_d_hook_8h_source.html index 6beecb4..e8da0af 100644 --- a/Doc/Doxygen/html/_l_e_d_hook_8h_source.html +++ b/Doc/Doxygen/html/_l_e_d_hook_8h_source.html @@ -3,7 +3,8 @@ - + + Chameleon-Mini: LEDHook.h Source File @@ -11,9 +12,6 @@ - @@ -31,40 +29,19 @@
    - + - - + + + +
    diff --git a/Doc/Doxygen/html/_l_e_ds_8txt.html b/Doc/Doxygen/html/_l_e_ds_8txt.html index ad40217..a6c9c43 100644 --- a/Doc/Doxygen/html/_l_e_ds_8txt.html +++ b/Doc/Doxygen/html/_l_e_ds_8txt.html @@ -3,7 +3,8 @@ - + + Chameleon-Mini: LEDs.txt File Reference @@ -11,9 +12,6 @@ - @@ -31,40 +29,19 @@ - + - - + + + +
    diff --git a/Doc/Doxygen/html/_l_u_f_a_config_8h.html b/Doc/Doxygen/html/_l_u_f_a_config_8h.html index b05e7e7..d77c440 100644 --- a/Doc/Doxygen/html/_l_u_f_a_config_8h.html +++ b/Doc/Doxygen/html/_l_u_f_a_config_8h.html @@ -3,7 +3,8 @@ - + + Chameleon-Mini: LUFAConfig.h File Reference @@ -11,9 +12,6 @@ - @@ -31,40 +29,19 @@
    - + - - + + + +
    diff --git a/Doc/Doxygen/html/_l_u_f_a_config_8h_source.html b/Doc/Doxygen/html/_l_u_f_a_config_8h_source.html index 688bc81..f780dc6 100644 --- a/Doc/Doxygen/html/_l_u_f_a_config_8h_source.html +++ b/Doc/Doxygen/html/_l_u_f_a_config_8h_source.html @@ -3,7 +3,8 @@ - + + Chameleon-Mini: LUFAConfig.h Source File @@ -11,9 +12,6 @@ - @@ -31,40 +29,19 @@ - + - - + + + +
    Go to the documentation of this file.
    1 /*
    2  LUFA Library
    3  Copyright (C) Dean Camera, 2012.
    4 
    5  dean [at] fourwalledcubicle [dot] com
    6  www.lufa-lib.org
    7 */
    8 
    9 /*
    10  Copyright 2012 Dean Camera (dean [at] fourwalledcubicle [dot] com)
    11 
    12  Permission to use, copy, modify, distribute, and sell this
    13  software and its documentation for any purpose is hereby granted
    14  without fee, provided that the above copyright notice appear in
    15  all copies and that both that the copyright notice and this
    16  permission notice and warranty disclaimer appear in supporting
    17  documentation, and that the name of the author not be used in
    18  advertising or publicity pertaining to distribution of the
    19  software without specific, written prior permission.
    20 
    21  The author disclaim all warranties with regard to this
    22  software, including all implied warranties of merchantability
    23  and fitness. In no event shall the author be liable for any
    24  special, indirect or consequential damages or any damages
    25  whatsoever resulting from loss of use, data or profits, whether
    26  in an action of contract, negligence or other tortious action,
    27  arising out of or in connection with the use or performance of
    28  this software.
    29 */
    30 
    42 #ifndef _LUFA_CONFIG_H_
    43 #define _LUFA_CONFIG_H_
    44 
    45  /* Non-USB Related Configuration Tokens: */
    46 // #define DISABLE_TERMINAL_CODES
    47 
    48  /* USB Class Driver Related Tokens: */
    49 // #define HID_HOST_BOOT_PROTOCOL_ONLY
    50 // #define HID_STATETABLE_STACK_DEPTH {Insert Value Here}
    51 // #define HID_USAGE_STACK_DEPTH {Insert Value Here}
    52 // #define HID_MAX_COLLECTIONS {Insert Value Here}
    53 // #define HID_MAX_REPORTITEMS {Insert Value Here}
    54 // #define HID_MAX_REPORT_IDS {Insert Value Here}
    55 // #define NO_CLASS_DRIVER_AUTOFLUSH
    56 
    57  /* General USB Driver Related Tokens: */
    58  #define USE_STATIC_OPTIONS \
    59  (USB_OPT_BUSEVENT_PRIMED | USB_DEVICE_OPT_FULLSPEED | /*USB_OPT_PLLCLKSRC*/ USB_OPT_RC32MCLKSRC)
    60  #define USB_DEVICE_ONLY
    61 // #define USB_STREAM_TIMEOUT_MS {Insert Value Here}
    62 // #define NO_LIMITED_CONTROLLER_CONNECT
    63 // #define NO_SOF_EVENTS
    64 
    65  /* USB Device Mode Driver Related Tokens: */
    66 // #define USE_RAM_DESCRIPTORS
    67  #define USE_FLASH_DESCRIPTORS
    68 // #define USE_EEPROM_DESCRIPTORS
    69 // #define NO_INTERNAL_SERIAL
    70  #define FIXED_CONTROL_ENDPOINT_SIZE 8
    71 // #define DEVICE_STATE_AS_GPIOR {Insert Value Here}
    72  #define FIXED_NUM_CONFIGURATIONS 1
    73 // #define CONTROL_ONLY_DEVICE
    74  #define MAX_ENDPOINT_INDEX 5
    75 // #define NO_DEVICE_REMOTE_WAKEUP
    76 // #define NO_DEVICE_SELF_POWER
    77 
    78 #endif
    diff --git a/Doc/Doxygen/html/_l_u_f_a_descriptors_8c.html b/Doc/Doxygen/html/_l_u_f_a_descriptors_8c.html index 235c111..8e28502 100644 --- a/Doc/Doxygen/html/_l_u_f_a_descriptors_8c.html +++ b/Doc/Doxygen/html/_l_u_f_a_descriptors_8c.html @@ -3,7 +3,8 @@ - + + Chameleon-Mini: LUFADescriptors.c File Reference @@ -11,9 +12,6 @@ - @@ -31,40 +29,19 @@ - + - - + + + +

    Detailed Description

    USB Device Descriptors, for library use when in USB device mode. Descriptors are special computer-readable structures which the host requests upon device enumeration, to determine the device's capabilities and functions.

    Function Documentation

    - + +

    ◆ CALLBACK_USB_GetDescriptor()

    +
    @@ -150,7 +129,9 @@ Variables

    Variable Documentation

    - + +

    ◆ DeviceDescriptor

    +
    @@ -163,7 +144,9 @@ Variables - + +

    ◆ ConfigurationDescriptor

    +
    @@ -176,7 +159,9 @@ Variables - + +

    ◆ LanguageString

    +
    @@ -189,7 +174,9 @@ Variables - + +

    ◆ ManufacturerString

    +
    @@ -202,7 +189,9 @@ Variables - + +

    ◆ ProductString

    +
    @@ -218,9 +207,9 @@ Variables diff --git a/Doc/Doxygen/html/_l_u_f_a_descriptors_8h.html b/Doc/Doxygen/html/_l_u_f_a_descriptors_8h.html index 07e4ff7..9cca40b 100644 --- a/Doc/Doxygen/html/_l_u_f_a_descriptors_8h.html +++ b/Doc/Doxygen/html/_l_u_f_a_descriptors_8h.html @@ -3,7 +3,8 @@ - + +Chameleon-Mini: LUFADescriptors.h File Reference @@ -11,9 +12,6 @@ - @@ -31,40 +29,19 @@
    - + - - + + + +

    Detailed Description

    Header file for Descriptors.c.

    Macro Definition Documentation

    - + +

    ◆ CDC_NOTIFICATION_EPADDR

    +
    @@ -137,7 +116,9 @@ Functions - + +

    ◆ CDC_TX_EPADDR

    +
    @@ -150,7 +131,9 @@ Functions - + +

    ◆ CDC_RX_EPADDR

    +
    @@ -163,7 +146,9 @@ Functions - + +

    ◆ CDC_NOTIFICATION_EPSIZE

    +
    @@ -176,7 +161,9 @@ Functions - + +

    ◆ CDC_TXRX_EPSIZE

    +
    @@ -190,7 +177,9 @@ Functions

    Function Documentation

    - + +

    ◆ CALLBACK_USB_GetDescriptor()

    +
    @@ -226,9 +215,9 @@ Functions diff --git a/Doc/Doxygen/html/_l_u_f_a_descriptors_8h_source.html b/Doc/Doxygen/html/_l_u_f_a_descriptors_8h_source.html index 4d755de..7f20828 100644 --- a/Doc/Doxygen/html/_l_u_f_a_descriptors_8h_source.html +++ b/Doc/Doxygen/html/_l_u_f_a_descriptors_8h_source.html @@ -3,7 +3,8 @@ - + +Chameleon-Mini: LUFADescriptors.h Source File @@ -11,9 +12,6 @@ - @@ -31,40 +29,19 @@
    - + - - + + + +
    diff --git a/Doc/Doxygen/html/_log_8h.html b/Doc/Doxygen/html/_log_8h.html index 81dde6f..7da5bef 100644 --- a/Doc/Doxygen/html/_log_8h.html +++ b/Doc/Doxygen/html/_log_8h.html @@ -3,7 +3,8 @@ - + + Chameleon-Mini: Log.h File Reference @@ -11,9 +12,6 @@ - @@ -31,40 +29,19 @@
    - + - - + + + +

    Enumerations

    +enum  LogEntryEnum {
    +  LOG_INFO_GENERIC = 0x10, +LOG_INFO_CONFIG_SET = 0x11, +LOG_INFO_SETTING_SET = 0x12, +LOG_INFO_UID_SET = 0x13, +
    +  LOG_INFO_RESET_APP = 0x20, +LOG_INFO_CODEC_RX_DATA = 0x40, +LOG_INFO_CODEC_TX_DATA = 0x41, +LOG_INFO_CODEC_RX_DATA_W_PARITY = 0x42, +
    +  LOG_INFO_CODEC_TX_DATA_W_PARITY = 0x43, +LOG_INFO_APP_CMD_READ = 0x80, +LOG_INFO_APP_CMD_WRITE = 0x81, +LOG_INFO_APP_CMD_INC = 0x84, +
    +  LOG_INFO_APP_CMD_DEC = 0x85, +LOG_INFO_APP_CMD_TRANSFER = 0x86, +LOG_INFO_APP_CMD_RESTORE = 0x87, +LOG_INFO_APP_CMD_AUTH = 0x90, +
    +  LOG_INFO_APP_CMD_HALT = 0x91, +LOG_INFO_APP_CMD_UNKNOWN = 0x92, +LOG_INFO_APP_AUTHING = 0xA0, +LOG_INFO_APP_AUTHED = 0xA1, +
    +  LOG_ERR_APP_AUTH_FAIL = 0xC0, +LOG_ERR_APP_CHECKSUM_FAIL = 0xC1, +LOG_ERR_APP_NOT_AUTHED = 0xC2, +LOG_INFO_SYSTEM_BOOT = 0xFF, +
    +  LOG_EMPTY = 0x00 +
    + } + 

    Enumeration Type Documentation

    - + +

    ◆ LogEntryEnum

    +
    @@ -110,80 +124,55 @@ Enumerations

    Enum for log entry type.

    Note
    Every entry type has a specific integer value, which can be found in the source code.
    - - - - - - - - - - - - - - - - - - - - - - - - -
    Enumerator
    LOG_INFO_GENERIC  -

    Unspecific log entry.

    +
    Enumerator
    LOG_INFO_GENERIC 

    Unspecific log entry.

    LOG_INFO_CONFIG_SET  -

    Configuration change.

    +
    LOG_INFO_CONFIG_SET 

    Configuration change.

    LOG_INFO_SETTING_SET  -

    Setting change.

    +
    LOG_INFO_SETTING_SET 

    Setting change.

    LOG_INFO_UID_SET  -

    UID change.

    +
    LOG_INFO_UID_SET 

    UID change.

    LOG_INFO_RESET_APP  -

    Application reset.

    +
    LOG_INFO_RESET_APP 

    Application reset.

    LOG_INFO_CODEC_RX_DATA  -

    Currently active codec received data.

    +
    LOG_INFO_CODEC_RX_DATA 

    Currently active codec received data.

    LOG_INFO_CODEC_TX_DATA  -

    Currently active codec sent data.

    +
    LOG_INFO_CODEC_TX_DATA 

    Currently active codec sent data.

    LOG_INFO_CODEC_RX_DATA_W_PARITY  -

    Currently active codec received data.

    +
    LOG_INFO_CODEC_RX_DATA_W_PARITY 

    Currently active codec received data.

    LOG_INFO_CODEC_TX_DATA_W_PARITY  -

    Currently active codec sent data.

    +
    LOG_INFO_CODEC_TX_DATA_W_PARITY 

    Currently active codec sent data.

    LOG_INFO_APP_CMD_READ  -

    Application processed read command.

    +
    LOG_INFO_APP_CMD_READ 

    Application processed read command.

    LOG_INFO_APP_CMD_WRITE  -

    Application processed write command.

    +
    LOG_INFO_APP_CMD_WRITE 

    Application processed write command.

    LOG_INFO_APP_CMD_INC  -

    Application processed increment command.

    +
    LOG_INFO_APP_CMD_INC 

    Application processed increment command.

    LOG_INFO_APP_CMD_DEC  -

    Application processed decrement command.

    +
    LOG_INFO_APP_CMD_DEC 

    Application processed decrement command.

    LOG_INFO_APP_CMD_TRANSFER  -

    Application processed transfer command.

    +
    LOG_INFO_APP_CMD_TRANSFER 

    Application processed transfer command.

    LOG_INFO_APP_CMD_RESTORE  -

    Application processed restore command.

    +
    LOG_INFO_APP_CMD_RESTORE 

    Application processed restore command.

    LOG_INFO_APP_CMD_AUTH  -

    Application processed authentication command.

    +
    LOG_INFO_APP_CMD_AUTH 

    Application processed authentication command.

    LOG_INFO_APP_CMD_HALT  -

    Application processed halt command.

    +
    LOG_INFO_APP_CMD_HALT 

    Application processed halt command.

    LOG_INFO_APP_CMD_UNKNOWN  -

    Application processed an unknown command.

    +
    LOG_INFO_APP_CMD_UNKNOWN 

    Application processed an unknown command.

    LOG_INFO_APP_AUTHING  -

    Application is in authing state.

    +
    LOG_INFO_APP_AUTHING 

    Application is in authing state.

    LOG_INFO_APP_AUTHED  -

    Application is in auth state.

    +
    LOG_INFO_APP_AUTHED 

    Application is in auth state.

    LOG_ERR_APP_AUTH_FAIL  -

    Application authentication failed.

    +
    LOG_ERR_APP_AUTH_FAIL 

    Application authentication failed.

    LOG_ERR_APP_CHECKSUM_FAIL  -

    Application had a checksum fail.

    +
    LOG_ERR_APP_CHECKSUM_FAIL 

    Application had a checksum fail.

    LOG_ERR_APP_NOT_AUTHED  -

    Application is not authenticated.

    +
    LOG_ERR_APP_NOT_AUTHED 

    Application is not authenticated.

    LOG_INFO_SYSTEM_BOOT  -

    Chameleon boots.

    +
    LOG_INFO_SYSTEM_BOOT 

    Chameleon boots.

    LOG_EMPTY  -

    Empty Log Entry. This is not followed by a length byte nor the two systick bytes nor any data.

    +
    LOG_EMPTY 

    Empty Log Entry. This is not followed by a length byte nor the two systick bytes nor any data.

    @@ -192,9 +181,9 @@ Enumerations
    diff --git a/Doc/Doxygen/html/_log_8h_source.html b/Doc/Doxygen/html/_log_8h_source.html index 24b4da0..325a595 100644 --- a/Doc/Doxygen/html/_log_8h_source.html +++ b/Doc/Doxygen/html/_log_8h_source.html @@ -3,7 +3,8 @@ - + + Chameleon-Mini: Log.h Source File @@ -11,9 +12,6 @@ - @@ -31,40 +29,19 @@
    - + - - + + + +
    diff --git a/Doc/Doxygen/html/_log_8txt.html b/Doc/Doxygen/html/_log_8txt.html index 2163bf9..2b5cef1 100644 --- a/Doc/Doxygen/html/_log_8txt.html +++ b/Doc/Doxygen/html/_log_8txt.html @@ -3,7 +3,8 @@ - + + Chameleon-Mini: Log.txt File Reference @@ -11,9 +12,6 @@ - @@ -31,40 +29,19 @@
    - + - - + + + +
    diff --git a/Doc/Doxygen/html/_main_page_8txt.html b/Doc/Doxygen/html/_main_page_8txt.html index e4a6c97..cbf26b0 100644 --- a/Doc/Doxygen/html/_main_page_8txt.html +++ b/Doc/Doxygen/html/_main_page_8txt.html @@ -3,7 +3,8 @@ - + + Chameleon-Mini: MainPage.txt File Reference @@ -11,9 +12,6 @@ - @@ -31,40 +29,19 @@
    - + - - + + + +
    diff --git a/Doc/Doxygen/html/_map_8h_source.html b/Doc/Doxygen/html/_map_8h_source.html index ab4217f..5388d36 100644 --- a/Doc/Doxygen/html/_map_8h_source.html +++ b/Doc/Doxygen/html/_map_8h_source.html @@ -3,7 +3,8 @@ - + + Chameleon-Mini: Map.h Source File @@ -11,9 +12,6 @@ - @@ -31,40 +29,19 @@
    - + - - + + + +
    1 /*
    2  * Map.h
    3  *
    4  * Created on: 07.12.2014
    5  * Author: sk
    6  */
    7 
    8 #ifndef MAP_H_
    9 #define MAP_H_
    10 
    11 #include <stdint.h>
    12 #include <stdbool.h>
    13 #include <avr/pgmspace.h>
    14 
    15 #define MAP_TEXT_BUF_SIZE 32
    16 #define MAP_MAX_TEXT_SIZE (MAP_TEXT_BUF_SIZE - 1)
    17 
    18 typedef uint8_t MapIdType;
    19 typedef const char* MapTextPtrType;
    20 
    21 const typedef struct {
    22  MapIdType Id;
    23  const char Text[MAP_TEXT_BUF_SIZE];
    24 } MapEntryType;
    25 
    26 bool MapIdToText(const MapEntryType* MapPtr, uint8_t MapSize, MapIdType Id, char* Text, uint16_t MaxBufferSize);
    27 bool MapTextToId(const MapEntryType* MapPtr, uint8_t MapSize, MapTextPtrType Text, MapIdType* IdPtr);
    28 void MapToString(const MapEntryType* MapPtr, uint8_t MapSize, char* String, uint16_t MaxBufferSize);
    29 
    30 #endif /* MAP_H_ */
    diff --git a/Doc/Doxygen/html/_memory_8h_source.html b/Doc/Doxygen/html/_memory_8h_source.html index 9608c80..5e0d9a9 100644 --- a/Doc/Doxygen/html/_memory_8h_source.html +++ b/Doc/Doxygen/html/_memory_8h_source.html @@ -3,7 +3,8 @@ - + + Chameleon-Mini: Memory.h Source File @@ -11,9 +12,6 @@ - @@ -31,40 +29,19 @@
    - + - - + + + +
    1 /*
    2  * Flash.h
    3  *
    4  * Created on: 20.03.2013
    5  * Author: skuser
    6  */
    7 
    8 #ifndef MEMORY_H_
    9 #define MEMORY_H_
    10 
    11 #define MEMORY_SIZE (FLASH_DATA_SIZE) /* From makefile */
    12 #define MEMORY_INIT_VALUE 0x00
    13 #define MEMORY_SIZE_PER_SETTING 8192
    14 
    15 #ifndef __ASSEMBLER__
    16 #include "Common.h"
    17 
    18 void MemoryInit(void);
    19 void MemoryReadBlock(void* Buffer, uint16_t Address, uint16_t ByteCount);
    20 void MemoryWriteBlock(const void* Buffer, uint16_t Address, uint16_t ByteCount);
    21 void MemoryClear(void);
    22 
    23 
    24 void MemoryRecall(void);
    25 void MemoryStore(void);
    26 
    27 /* For use with XModem */
    28 bool MemoryUploadBlock(void* Buffer, uint32_t BlockAddress, uint16_t ByteCount);
    29 bool MemoryDownloadBlock(void* Buffer, uint32_t BlockAddress, uint16_t ByteCount);
    30 
    31 /* EEPROM functions */
    32 uint16_t WriteEEPBlock(uint16_t Address, const void *SrcPtr, uint16_t ByteCount);
    33 uint16_t ReadEEPBlock(uint16_t Address, void *DestPtr, uint16_t ByteCount);
    34 
    35 #endif /* __ASSEMBLER__ */
    36 
    37 #endif /* MEMORY_H_ */
    diff --git a/Doc/Doxygen/html/_mifare_classic_8h_source.html b/Doc/Doxygen/html/_mifare_classic_8h_source.html index 5107be0..b917c08 100644 --- a/Doc/Doxygen/html/_mifare_classic_8h_source.html +++ b/Doc/Doxygen/html/_mifare_classic_8h_source.html @@ -3,7 +3,8 @@ - + + Chameleon-Mini: MifareClassic.h Source File @@ -11,9 +12,6 @@ - @@ -31,40 +29,19 @@ - + - - + + + +
    1 /*
    2  * MifareClassic.h
    3  *
    4  * Created on: 13.05.2013
    5  * Author: skuser
    6  */
    7 
    8 #ifndef MIFARECLASSIC_H_
    9 #define MIFARECLASSIC_H_
    10 
    11 #include "Application.h"
    12 #include "ISO14443-3A.h"
    13 
    14 #define MIFARE_CLASSIC_UID_SIZE ISO14443A_UID_SIZE_SINGLE
    15 #define MIFARE_CLASSIC_1K_MEM_SIZE 1024
    16 #define MIFARE_CLASSIC_4K_MEM_SIZE 4096
    17 
    18 void MifareClassicAppInit1K(void);
    19 void MifareClassicAppInit1K7B(void);
    20 void MifareClassicAppInit4K(void);
    21 void MifareClassicAppReset(void);
    22 void MifareClassicAppTask(void);
    23 
    24 uint16_t MifareClassicAppProcess(uint8_t* Buffer, uint16_t BitCount);
    25 
    26 void MifareClassicGetUid(ConfigurationUidType Uid);
    27 void MifareClassicSetUid(ConfigurationUidType Uid);
    28 
    29 
    30 #endif /* MIFARECLASSIC_H_ */
    diff --git a/Doc/Doxygen/html/_mifare_ultralight_8h_source.html b/Doc/Doxygen/html/_mifare_ultralight_8h_source.html index 7220b07..c7655a2 100644 --- a/Doc/Doxygen/html/_mifare_ultralight_8h_source.html +++ b/Doc/Doxygen/html/_mifare_ultralight_8h_source.html @@ -3,7 +3,8 @@ - + + Chameleon-Mini: MifareUltralight.h Source File @@ -11,9 +12,6 @@ - @@ -31,40 +29,19 @@ - + - - + + + +
    MifareUltralight.h
    -
    1 /*
    2  * MifareUltralight.h
    3  *
    4  * Created on: 20.03.2013
    5  * Author: skuser
    6  */
    7 
    8 #ifndef MIFAREULTRALIGHT_H_
    9 #define MIFAREULTRALIGHT_H_
    10 
    11 #include "Application.h"
    12 #include "ISO14443-3A.h"
    13 
    14 #define MIFARE_ULTRALIGHT_UID_SIZE ISO14443A_UID_SIZE_DOUBLE
    15 #define MIFARE_ULTRALIGHT_MEM_SIZE 64
    16 
    17 void MifareUltralightAppInit(void);
    18 void MifareUltralightAppReset(void);
    19 void MifareUltralightAppTask(void);
    20 
    21 uint16_t MifareUltralightAppProcess(uint8_t* Buffer, uint16_t BitCount);
    22 
    23 void MifareUltralightGetUid(ConfigurationUidType Uid);
    24 void MifareUltralightSetUid(ConfigurationUidType Uid);
    25 
    26 
    27 
    28 #endif /* MIFAREULTRALIGHT_H_ */
    +
    1 /*
    2  * MifareUltralight.h
    3  *
    4  * Created on: 20.03.2013
    5  * Author: skuser
    6  */
    7 
    8 #ifndef MIFAREULTRALIGHT_H_
    9 #define MIFAREULTRALIGHT_H_
    10 
    11 #include "Application.h"
    12 #include "ISO14443-3A.h"
    13 
    14 #define MIFARE_ULTRALIGHT_UID_SIZE ISO14443A_UID_SIZE_DOUBLE
    15 #define MIFARE_ULTRALIGHT_PAGE_SIZE 4
    16 #define MIFARE_ULTRALIGHT_PAGES 16
    17 #define MIFARE_ULTRALIGHT_EV11_PAGES 20
    18 #define MIFARE_ULTRALIGHT_EV12_PAGES 41
    19 #define MIFARE_ULTRALIGHT_MEM_SIZE (MIFARE_ULTRALIGHT_PAGES * MIFARE_ULTRALIGHT_PAGE_SIZE)
    20 #define MIFARE_ULTRALIGHT_EV11_MEM_SIZE (MIFARE_ULTRALIGHT_EV11_PAGES * MIFARE_ULTRALIGHT_PAGE_SIZE)
    21 #define MIFARE_ULTRALIGHT_EV12_MEM_SIZE (MIFARE_ULTRALIGHT_EV12_PAGES * MIFARE_ULTRALIGHT_PAGE_SIZE)
    22 
    23 void MifareUltralightAppInit(void);
    24 void MifareUltralightEV11AppInit(void);
    25 void MifareUltralightEV12AppInit(void);
    26 void MifareUltralightAppReset(void);
    27 void MifareUltralightAppTask(void);
    28 
    29 uint16_t MifareUltralightAppProcess(uint8_t* Buffer, uint16_t BitCount);
    30 
    31 void MifareUltralightGetUid(ConfigurationUidType Uid);
    32 void MifareUltralightSetUid(ConfigurationUidType Uid);
    33 
    34 
    35 
    36 #endif /* MIFAREULTRALIGHT_H_ */
    diff --git a/Doc/Doxygen/html/_random_8h_source.html b/Doc/Doxygen/html/_random_8h_source.html index 3ea833b..2e9aa54 100644 --- a/Doc/Doxygen/html/_random_8h_source.html +++ b/Doc/Doxygen/html/_random_8h_source.html @@ -3,7 +3,8 @@ - + + Chameleon-Mini: Random.h Source File @@ -11,9 +12,6 @@ - @@ -31,40 +29,19 @@ - + - - + + + +
    1 /*
    2  * Random.h
    3  *
    4  * Created on: 22.03.2013
    5  * Author: skuser
    6  */
    7 
    8 #ifndef RANDOM_H_
    9 #define RANDOM_H_
    10 
    11 #include "Common.h"
    12 
    13 void RandomInit(void);
    14 uint8_t RandomGetByte(void);
    15 void RandomGetBuffer(void* Buffer, uint8_t ByteCount);
    16 void RandomTick(void);
    17 
    18 #endif /* RANDOM_H_ */
    diff --git a/Doc/Doxygen/html/_reader14443-2_a_8h_source.html b/Doc/Doxygen/html/_reader14443-2_a_8h_source.html index 76d3884..48df12f 100644 --- a/Doc/Doxygen/html/_reader14443-2_a_8h_source.html +++ b/Doc/Doxygen/html/_reader14443-2_a_8h_source.html @@ -3,7 +3,8 @@ - + + Chameleon-Mini: Reader14443-2A.h Source File @@ -11,9 +12,6 @@ - @@ -31,40 +29,19 @@ - + - - + + + +
    1 /*
    2  * Reader14443-2A.h
    3  *
    4  * Created on: 26.08.2014
    5  * Author: sk
    6  */
    7 
    8 #ifndef READER14443_2A_H_
    9 #define READER14443_2A_H_
    10 
    11 #include "Codec.h"
    12 #include "Terminal/CommandLine.h"
    13 
    14 /* Codec Interface */
    15 void Reader14443ACodecInit(void);
    16 void Reader14443ACodecDeInit(void);
    17 void Reader14443ACodecTask(void);
    18 
    19 /* Application Interface */
    20 void Reader14443ACodecStart(void);
    21 void Reader14443ACodecReset(void);
    22 
    23 #endif /* READER14443_2A_H_ */
    diff --git a/Doc/Doxygen/html/_reader14443_a_8h_source.html b/Doc/Doxygen/html/_reader14443_a_8h_source.html index f06b2c8..aa3df38 100644 --- a/Doc/Doxygen/html/_reader14443_a_8h_source.html +++ b/Doc/Doxygen/html/_reader14443_a_8h_source.html @@ -3,7 +3,8 @@ - + + Chameleon-Mini: Reader14443A.h Source File @@ -11,9 +12,6 @@ - @@ -31,40 +29,19 @@ - + - - + + + +
    1 #ifndef READER14443A_H
    2 #define READER14443A_H
    3 
    4 #include "Application.h"
    5 #include "Codec/Codec.h"
    6 
    7 #define CRC_INIT 0x6363
    8 
    9 uint8_t ReaderSendBuffer[CODEC_BUFFER_SIZE];
    10 uint16_t ReaderSendBitCount;
    11 
    12 void Reader14443AAppInit(void);
    13 void Reader14443AAppReset(void);
    14 void Reader14443AAppTask(void);
    15 void Reader14443AAppTick(void);
    16 void Reader14443AAppTimeout(void);
    17 
    18 uint16_t Reader14443AAppProcess(uint8_t* Buffer, uint16_t BitCount);
    19 
    20 uint16_t addParityBits(uint8_t * Buffer, uint16_t bits);
    21 uint16_t removeParityBits(uint8_t * Buffer, uint16_t BitCount);
    22 uint16_t removeSOC(uint8_t * Buffer, uint16_t BitCount);
    23 bool checkParityBits(uint8_t * Buffer, uint16_t BitCount);
    24 uint16_t ISO14443_CRCA(uint8_t * Buffer, uint8_t ByteCount);
    25 
    26 typedef enum {
    27  Reader14443_Do_Nothing,
    28  Reader14443_Send,
    29  Reader14443_Send_Raw,
    30  Reader14443_Get_UID,
    31  Reader14443_Autocalibrate,
    32  Reader14443_Read_MF_Ultralight,
    33  Reader14443_Identify
    34 } Reader14443Command;
    35 
    36 
    37 #endif //READER14443A_H
    diff --git a/Doc/Doxygen/html/_reader_8txt.html b/Doc/Doxygen/html/_reader_8txt.html index 5f83bf3..886ce76 100644 --- a/Doc/Doxygen/html/_reader_8txt.html +++ b/Doc/Doxygen/html/_reader_8txt.html @@ -3,7 +3,8 @@ - + + Chameleon-Mini: Reader.txt File Reference @@ -11,9 +12,6 @@ - @@ -31,40 +29,19 @@ - + - - + + + +
    diff --git a/Doc/Doxygen/html/_settings_8h.html b/Doc/Doxygen/html/_settings_8h.html index 26f3a3f..c4af6a0 100644 --- a/Doc/Doxygen/html/_settings_8h.html +++ b/Doc/Doxygen/html/_settings_8h.html @@ -3,7 +3,8 @@ - + + Chameleon-Mini: Settings.h File Reference @@ -11,9 +12,6 @@ - @@ -31,40 +29,19 @@
    - + - - + + + +
    diff --git a/Doc/Doxygen/html/_settings_8h_source.html b/Doc/Doxygen/html/_settings_8h_source.html index 4422112..e17bc15 100644 --- a/Doc/Doxygen/html/_settings_8h_source.html +++ b/Doc/Doxygen/html/_settings_8h_source.html @@ -3,7 +3,8 @@ - + + Chameleon-Mini: Settings.h Source File @@ -11,9 +12,6 @@ - @@ -31,40 +29,19 @@ - + - - + + + +
    Settings.h
    -Go to the documentation of this file.
    1 /*
    2  * Settings.h
    3  *
    4  * Created on: 21.12.2013
    5  * Author: skuser
    6  */
    8 #ifndef SETTINGS_H_
    9 #define SETTINGS_H_
    10 
    11 #include "Button.h"
    12 #include "Configuration.h"
    13 #include "Log.h"
    14 #include "LED.h"
    15 #include "Memory.h"
    16 
    17 #define SETTINGS_COUNT (MEMORY_SIZE / MEMORY_SIZE_PER_SETTING)
    18 #define SETTINGS_FIRST 1
    19 #define SETTINGS_LAST (SETTINGS_FIRST + SETTINGS_COUNT - 1)
    20 
    25 typedef struct {
    26  ButtonActionEnum ButtonActions[BUTTON_TYPE_COUNT];
    27  LogModeEnum LogMode;
    28  ConfigurationEnum Configuration;
    29  LEDHookEnum LEDRedFunction;
    30  LEDHookEnum LEDGreenFunction;
    31  uint16_t PendingTaskTimeout;
    33 
    34 typedef struct {
    35  uint8_t ActiveSettingIdx;
    36  SettingsEntryType* ActiveSettingPtr;
    37  SettingsEntryType Settings[SETTINGS_COUNT];
    38 } SettingsType;
    39 
    40 extern SettingsType GlobalSettings;
    41 
    42 void SettingsLoad(void);
    43 void SettingsSave(void);
    44 
    45 void SettingsCycle(void);
    46 bool SettingsSetActiveById(uint8_t Setting);
    47 uint8_t SettingsGetActiveById(void);
    48 void SettingsGetActiveByName(char* SettingOut, uint16_t BufferSize);
    49 bool SettingsSetActiveByName(const char* Setting);
    50 
    51 #endif /* SETTINGS_H_ */
    LogModeEnum LogMode
    Button actions for this setting.
    Definition: Settings.h:27
    +Go to the documentation of this file.
    1 /*
    2  * Settings.h
    3  *
    4  * Created on: 21.12.2013
    5  * Author: skuser
    6  */
    8 #ifndef SETTINGS_H_
    9 #define SETTINGS_H_
    10 
    11 #include "Button.h"
    12 #include "Configuration.h"
    13 #include "Log.h"
    14 #include "LED.h"
    15 #include "Memory.h"
    16 
    17 #define SETTINGS_COUNT (MEMORY_SIZE / MEMORY_SIZE_PER_SETTING)
    18 #define SETTINGS_FIRST 1
    19 #define SETTINGS_LAST (SETTINGS_FIRST + SETTINGS_COUNT - 1)
    20 
    25 typedef struct {
    26  ButtonActionEnum ButtonActions[BUTTON_TYPE_COUNT];
    27  LogModeEnum LogMode;
    28  ConfigurationEnum Configuration;
    29  LEDHookEnum LEDRedFunction;
    30  LEDHookEnum LEDGreenFunction;
    31  uint16_t PendingTaskTimeout;
    33 
    34 typedef struct {
    35  uint8_t ActiveSettingIdx;
    36  SettingsEntryType* ActiveSettingPtr;
    37  SettingsEntryType Settings[SETTINGS_COUNT];
    38 } SettingsType;
    39 
    40 extern SettingsType GlobalSettings;
    41 
    42 void SettingsLoad(void);
    43 void SettingsSave(void);
    44 void ActiveSettingNumberSave(void);
    45 
    46 void SettingsCycle(void);
    47 bool SettingsSetActiveById(uint8_t Setting);
    48 uint8_t SettingsGetActiveById(void);
    49 void SettingsGetActiveByName(char* SettingOut, uint16_t BufferSize);
    50 bool SettingsSetActiveByName(const char* Setting);
    51 
    52 #endif /* SETTINGS_H_ */
    LogModeEnum LogMode
    Button actions for this setting.
    Definition: Settings.h:27
    Definition: Settings.h:25
    LEDHookEnum LEDGreenFunction
    Red LED function for this setting.
    Definition: Settings.h:30
    @@ -100,9 +77,9 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    diff --git a/Doc/Doxygen/html/_settings_8txt.html b/Doc/Doxygen/html/_settings_8txt.html index 0d9e2d9..81c72af 100644 --- a/Doc/Doxygen/html/_settings_8txt.html +++ b/Doc/Doxygen/html/_settings_8txt.html @@ -3,7 +3,8 @@ - + + Chameleon-Mini: Settings.txt File Reference @@ -11,9 +12,6 @@ - @@ -31,40 +29,19 @@
    - + - - + + + +
    diff --git a/Doc/Doxygen/html/_system_8h_source.html b/Doc/Doxygen/html/_system_8h_source.html index dbaaaf6..0c488fa 100644 --- a/Doc/Doxygen/html/_system_8h_source.html +++ b/Doc/Doxygen/html/_system_8h_source.html @@ -3,7 +3,8 @@ - + + Chameleon-Mini: System.h Source File @@ -11,9 +12,6 @@ - @@ -31,40 +29,19 @@
    - + - - + + + +
    System.h
    -
    1 /*
    2  * System.h
    3  *
    4  * Created on: 10.02.2013
    5  * Author: skuser
    6  */
    7 
    8 #ifndef SYSTEM_H
    9 #define SYSTEM_H
    10 
    11 #include <avr/io.h>
    12 #include <avr/pgmspace.h>
    13 #include <avr/interrupt.h>
    14 #include <stddef.h>
    15 #include <stdbool.h>
    16 #include "Common.h"
    17 
    18 #define F_RTC 1000
    19 #define SYSTEM_MILLISECONDS_TO_RTC_CYCLES(x) \
    20  ( (uint16_t) ( (double) F_RTC * x / 1E3 + 0.5) )
    21 
    22 #define SYSTEM_TICK_WIDTH 7 /* Bits */
    23 #define SYSTEM_TICK_PERIOD (1<<7)
    24 #define SYSTEM_TICK_MS (SYSTEM_TICK_PERIOD)
    25 #define SYSTEM_TICK_FREQ (1000 / SYSTEM_TICK_PERIOD)
    26 
    27 #define SYSTEM_SMODE_PSAVE SLEEP_SMODE_PSAVE_gc
    28 #define SYSTEM_SMODE_IDLE SLEEP_SMODE_IDLE_gc
    29 
    30 /* Use GPIORE and GPIORF as global tick register */
    31 #define SYSTEM_TICK_REGISTER (*((volatile uint16_t*) &GPIORE))
    32 
    33 void SystemInit(void);
    34 void SystemReset(void);
    35 void SystemEnterBootloader(void);
    36 void SystemStartUSBClock(void);
    37 void SystemStopUSBClock(void);
    38 void SystemInterruptInit(void);
    39 INLINE bool SystemTick100ms(void);
    40 
    41 INLINE bool SystemTick100ms(void)
    42 {
    43  if (RTC.INTFLAGS & RTC_COMPIF_bm) {
    44  while(RTC.STATUS & RTC_SYNCBUSY_bm)
    45  ;
    46 
    47  RTC.INTFLAGS = RTC_COMPIF_bm;
    48  return true;
    49  }
    50 
    51  return false;
    52 }
    53 
    54 INLINE uint16_t SystemGetSysTick(void) {
    55  return SYSTEM_TICK_REGISTER | RTC.CNT;
    56 }
    57 
    58 #endif /* SYSTEM_H */
    +
    1 /*
    2  * System.h
    3  *
    4  * Created on: 10.02.2013
    5  * Author: skuser
    6  */
    7 
    8 #ifndef SYSTEM_H
    9 #define SYSTEM_H
    10 
    11 #include <avr/io.h>
    12 #include <avr/pgmspace.h>
    13 #include <avr/interrupt.h>
    14 #include <stddef.h>
    15 #include <stdbool.h>
    16 #include "Common.h"
    17 
    18 #define F_RTC 1000
    19 #define SYSTEM_MILLISECONDS_TO_RTC_CYCLES(x) \
    20  ( (uint16_t) ( (double) F_RTC * x / 1E3 + 0.5) )
    21 
    22 #define SYSTEM_TICK_WIDTH 7 /* Bits */
    23 #define SYSTEM_TICK_PERIOD (1<<7)
    24 #define SYSTEM_TICK_MS (SYSTEM_TICK_PERIOD)
    25 #define SYSTEM_TICK_FREQ (1000 / SYSTEM_TICK_PERIOD)
    26 
    27 #define SYSTEM_SMODE_PSAVE SLEEP_SMODE_PSAVE_gc
    28 #define SYSTEM_SMODE_IDLE SLEEP_SMODE_IDLE_gc
    29 
    30 /* Use GPIORE and GPIORF as global tick register */
    31 #define SYSTEM_TICK_REGISTER (*((volatile uint16_t*) &GPIORE))
    32 
    33 void SystemInit(void);
    34 void SystemReset(void);
    35 void SystemEnterBootloader(void);
    36 void SystemStartUSBClock(void);
    37 void SystemStopUSBClock(void);
    38 void SystemInterruptInit(void);
    39 INLINE bool SystemTick100ms(void);
    40 
    41 INLINE bool SystemTick100ms(void)
    42 {
    43  if (RTC.INTFLAGS & RTC_COMPIF_bm) {
    44  while(RTC.STATUS & RTC_SYNCBUSY_bm)
    45  ;
    46 
    47  RTC.INTFLAGS = RTC_COMPIF_bm;
    48  return true;
    49  }
    50 
    51  return false;
    52 }
    53 
    54 INLINE void SystemTickClearFlag(void)
    55 {
    56  while(RTC.STATUS & RTC_SYNCBUSY_bm)
    57  ;
    58 
    59  RTC.INTFLAGS = RTC_COMPIF_bm;
    60 }
    61 
    62 INLINE uint16_t SystemGetSysTick(void) {
    63  return SYSTEM_TICK_REGISTER | RTC.CNT;
    64 }
    65 
    66 #endif /* SYSTEM_H */
    diff --git a/Doc/Doxygen/html/_terminal_8h_source.html b/Doc/Doxygen/html/_terminal_8h_source.html index 9763df7..b73ba63 100644 --- a/Doc/Doxygen/html/_terminal_8h_source.html +++ b/Doc/Doxygen/html/_terminal_8h_source.html @@ -3,7 +3,8 @@ - + + Chameleon-Mini: Terminal.h Source File @@ -11,9 +12,6 @@ - @@ -31,40 +29,19 @@ - + - - + + + +
    1 /*
    2  * CommandLine.h
    3  *
    4  * Created on: 10.02.2013
    5  * Author: skuser
    6  */
    7 
    8 #ifndef TERMINAL_H_
    9 #define TERMINAL_H_
    10 
    11 #include "../Common.h"
    12 #include "../LUFA/Drivers/USB/USB.h"
    13 #include "XModem.h"
    14 #include "CommandLine.h"
    15 
    16 #define TERMINAL_VBUS_PORT PORTD
    17 #define TERMINAL_VBUS_MASK PIN5_bm
    18 
    19 #define TERMINAL_BUFFER_SIZE 512
    20 
    21 typedef enum {
    22  TERMINAL_UNINITIALIZED,
    23  TERMINAL_INITIALIZING,
    24  TERMINAL_INITIALIZED,
    25  TERMINAL_UNITIALIZING
    26 } TerminalStateEnum;
    27 
    28 extern uint8_t TerminalBuffer[TERMINAL_BUFFER_SIZE];
    29 extern USB_ClassInfo_CDC_Device_t TerminalHandle;
    30 extern TerminalStateEnum TerminalState;
    31 
    32 void TerminalInit(void);
    33 void TerminalTask(void);
    34 void TerminalTick(void);
    35 
    36 /*void TerminalSendHex(void* Buffer, uint16_t ByteCount);*/
    37 INLINE void TerminalSendByte(uint8_t Byte);
    38 void TerminalSendBlock(const void* Buffer, uint16_t ByteCount);
    39 
    40 INLINE void TerminalSendChar(char c);
    41 void TerminalSendString(const char* s);
    42 void TerminalSendStringP(const char* s);
    43 
    44 void EVENT_USB_Device_Connect(void);
    45 void EVENT_USB_Device_Disconnect(void);
    46 void EVENT_USB_Device_ConfigurationChanged(void);
    47 void EVENT_USB_Device_ControlRequest(void);
    48 
    49 INLINE void TerminalSendChar(char c) { CDC_Device_SendByte(&TerminalHandle, c); }
    50 INLINE void TerminalSendByte(uint8_t Byte) { CDC_Device_SendByte(&TerminalHandle, Byte); }
    51 
    52 #endif /* TERMINAL_H_ */
    diff --git a/Doc/Doxygen/html/_uploading_downloading_8txt.html b/Doc/Doxygen/html/_uploading_downloading_8txt.html index 90d0371..2c41d90 100644 --- a/Doc/Doxygen/html/_uploading_downloading_8txt.html +++ b/Doc/Doxygen/html/_uploading_downloading_8txt.html @@ -3,7 +3,8 @@ - + + Chameleon-Mini: UploadingDownloading.txt File Reference @@ -11,9 +12,6 @@ - @@ -31,40 +29,19 @@ - + - - + + + +
    diff --git a/Doc/Doxygen/html/_x_modem_8h_source.html b/Doc/Doxygen/html/_x_modem_8h_source.html index 44e54cb..5581a6f 100644 --- a/Doc/Doxygen/html/_x_modem_8h_source.html +++ b/Doc/Doxygen/html/_x_modem_8h_source.html @@ -3,7 +3,8 @@ - + + Chameleon-Mini: XModem.h Source File @@ -11,9 +12,6 @@ - @@ -31,40 +29,19 @@
    - + - - + + + +
    1 /*
    2  * TerminalXModem.h
    3  *
    4  * Created on: 22.03.2013
    5  * Author: skuser
    6  */
    7 
    8 #ifndef XMODEM_H_
    9 #define XMODEM_H_
    10 
    11 #include "../Common.h"
    12 
    13 typedef bool (*XModemCallbackType) (void* ByteBuffer, uint32_t BlockAddress, uint16_t ByteCount);
    14 
    15 void XModemReceive(XModemCallbackType CallbackFunc);
    16 void XModemSend(XModemCallbackType CallbackFunc);
    17 
    18 bool XModemProcessByte(uint8_t Byte);
    19 void XModemTick(void);
    20 
    21 #endif /* TERMINALXMODEM_H_ */
    diff --git a/Doc/Doxygen/html/annotated.html b/Doc/Doxygen/html/annotated.html index a98b171..41987d1 100644 --- a/Doc/Doxygen/html/annotated.html +++ b/Doc/Doxygen/html/annotated.html @@ -3,7 +3,8 @@ - + + Chameleon-Mini: Class List @@ -11,9 +12,6 @@ - @@ -31,41 +29,19 @@ - + - - + + + +
    diff --git a/Doc/Doxygen/html/classes.html b/Doc/Doxygen/html/classes.html index a5f2fb9..68f8f14 100644 --- a/Doc/Doxygen/html/classes.html +++ b/Doc/Doxygen/html/classes.html @@ -3,7 +3,8 @@ - + + Chameleon-Mini: Class Index @@ -11,9 +12,6 @@ - @@ -31,41 +29,19 @@
    - + - - + + + +
    Class Index
    -
    C | S | U
    +
    c | s | u
    -
      C  
    -
      S  
    -
      U  
    +
      c  
    +
      s  
    +
      u  
    ConfigurationType   SettingsEntryType   USB_Descriptor_Configuration_t   
    -
    C | S | U
    +
    c | s | u
    diff --git a/Doc/Doxygen/html/dir_5de29d499bb29a41092979d00d22c134.html b/Doc/Doxygen/html/dir_5de29d499bb29a41092979d00d22c134.html index 1af58d5..51f3226 100644 --- a/Doc/Doxygen/html/dir_5de29d499bb29a41092979d00d22c134.html +++ b/Doc/Doxygen/html/dir_5de29d499bb29a41092979d00d22c134.html @@ -3,7 +3,8 @@ - + + Chameleon-Mini: Application Directory Reference @@ -11,9 +12,6 @@ - @@ -31,40 +29,19 @@ - + - - + + + +
    Application Directory Reference
    - - -

    -Files

    diff --git a/Doc/Doxygen/html/dir_74b6a3b63f61c160c0f14b7a283a4c9b.html b/Doc/Doxygen/html/dir_74b6a3b63f61c160c0f14b7a283a4c9b.html index 38e1ef2..eff8cc6 100644 --- a/Doc/Doxygen/html/dir_74b6a3b63f61c160c0f14b7a283a4c9b.html +++ b/Doc/Doxygen/html/dir_74b6a3b63f61c160c0f14b7a283a4c9b.html @@ -3,7 +3,8 @@ - + + Chameleon-Mini: Firmware Directory Reference @@ -11,9 +12,6 @@ - @@ -31,40 +29,19 @@ - + - - + + + +
    diff --git a/Doc/Doxygen/html/dir_8465ec698d237f801ae9966d4551fcfa.html b/Doc/Doxygen/html/dir_8465ec698d237f801ae9966d4551fcfa.html index 5faf79b..8f2179b 100644 --- a/Doc/Doxygen/html/dir_8465ec698d237f801ae9966d4551fcfa.html +++ b/Doc/Doxygen/html/dir_8465ec698d237f801ae9966d4551fcfa.html @@ -3,7 +3,8 @@ - + + Chameleon-Mini: Chameleon-Mini Directory Reference @@ -11,9 +12,6 @@ - @@ -31,40 +29,19 @@ - + - - + + + +
    diff --git a/Doc/Doxygen/html/dir_ddeffaa734f77525428b0dd4068da9cb.html b/Doc/Doxygen/html/dir_ddeffaa734f77525428b0dd4068da9cb.html index 1ae71d0..294bded 100644 --- a/Doc/Doxygen/html/dir_ddeffaa734f77525428b0dd4068da9cb.html +++ b/Doc/Doxygen/html/dir_ddeffaa734f77525428b0dd4068da9cb.html @@ -3,7 +3,8 @@ - + + Chameleon-Mini: Terminal Directory Reference @@ -11,9 +12,6 @@ - @@ -31,40 +29,19 @@ - + - - + + + +
    Terminal Directory Reference
    - - -

    -Files

    diff --git a/Doc/Doxygen/html/dir_f5aab302412c0352d69464400cc5ee44.html b/Doc/Doxygen/html/dir_f5aab302412c0352d69464400cc5ee44.html index e9a95e3..4137dfb 100644 --- a/Doc/Doxygen/html/dir_f5aab302412c0352d69464400cc5ee44.html +++ b/Doc/Doxygen/html/dir_f5aab302412c0352d69464400cc5ee44.html @@ -3,7 +3,8 @@ - + + Chameleon-Mini: Codec Directory Reference @@ -11,9 +12,6 @@ - @@ -31,40 +29,19 @@ - + - - + + + +
    Codec Directory Reference
    - - -

    -Files

    diff --git a/Doc/Doxygen/html/doxygen.css b/Doc/Doxygen/html/doxygen.css index 1425ec5..4f1ab91 100644 --- a/Doc/Doxygen/html/doxygen.css +++ b/Doc/Doxygen/html/doxygen.css @@ -1,9 +1,13 @@ -/* The standard CSS for doxygen 1.8.11 */ +/* The standard CSS for doxygen 1.8.13 */ body, table, div, p, dl { font: 400 14px/22px Roboto,sans-serif; } +p.reference, p.definition { + font: 400 14px/22px Roboto,sans-serif; +} + /* @group Heading Levels */ h1.groupheader { @@ -173,7 +177,7 @@ pre.fragment { } div.fragment { - padding: 4px 6px; + padding: 0px; margin: 4px 8px 4px 2px; background-color: #FBFCFD; border: 1px solid #C4CFE5; @@ -232,6 +236,15 @@ span.lineno a:hover { background-color: #C8C8C8; } +.lineno { + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + div.ah, span.ah { background-color: black; font-weight: bold; @@ -501,6 +514,29 @@ table.memberdecls { /* Styles for detailed member documentation */ +.memtitle { + padding: 8px; + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: url('nav_f.png'); + background-repeat: repeat-x; + background-color: #E2E8F2; + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + .memtemplate { font-size: 80%; color: #4665A2; @@ -539,7 +575,7 @@ table.memberdecls { } .memname { - font-weight: bold; + font-weight: 400; margin-left: 6px; } @@ -555,24 +591,24 @@ table.memberdecls { color: #253555; font-weight: bold; text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); - background-image:url('nav_f.png'); - background-repeat:repeat-x; - background-color: #E2E8F2; + background-color: #DFE5F1; /* opera specific markup */ box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); border-top-right-radius: 4px; - border-top-left-radius: 4px; /* firefox specific markup */ -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; -moz-border-radius-topright: 4px; - -moz-border-radius-topleft: 4px; /* webkit specific markup */ -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); -webkit-border-top-right-radius: 4px; - -webkit-border-top-left-radius: 4px; } +.overload { + font-family: "courier new",courier,monospace; + font-size: 65%; +} + .memdoc, dl.reflist dd { border-bottom: 1px solid #A8B8D9; border-left: 1px solid #A8B8D9; @@ -914,6 +950,7 @@ table.fieldtable { padding-bottom: 4px; padding-top: 5px; text-align:left; + font-weight: 400; -moz-border-radius-topleft: 4px; -moz-border-radius-topright: 4px; -webkit-border-top-left-radius: 4px; @@ -1178,6 +1215,11 @@ dl.section dd { text-align: center; } +.plantumlgraph +{ + text-align: center; +} + .diagraph { text-align: center; @@ -1473,3 +1515,82 @@ tr.heading h2 { } } +/* @group Markdown */ + +/* +table.markdownTable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.markdownTable td, table.markdownTable th { + border: 1px solid #2D4068; + padding: 3px 7px 2px; +} + +table.markdownTableHead tr { +} + +table.markdownTableBodyLeft td, table.markdownTable th { + border: 1px solid #2D4068; + padding: 3px 7px 2px; +} + +th.markdownTableHeadLeft th.markdownTableHeadRight th.markdownTableHeadCenter th.markdownTableHeadNone { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +th.markdownTableHeadLeft { + text-align: left +} + +th.markdownTableHeadRight { + text-align: right +} + +th.markdownTableHeadCenter { + text-align: center +} +*/ + +table.markdownTable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.markdownTable td, table.markdownTable th { + border: 1px solid #2D4068; + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +th.markdownTableHeadLeft, td.markdownTableBodyLeft { + text-align: left +} + +th.markdownTableHeadRight, td.markdownTableBodyRight { + text-align: right +} + +th.markdownTableHeadCenter, td.markdownTableBodyCenter { + text-align: center +} + + +/* @end */ diff --git a/Doc/Doxygen/html/files.html b/Doc/Doxygen/html/files.html index d6ea409..df17c10 100644 --- a/Doc/Doxygen/html/files.html +++ b/Doc/Doxygen/html/files.html @@ -3,7 +3,8 @@ - + + Chameleon-Mini: File List @@ -11,9 +12,6 @@ - @@ -31,40 +29,19 @@ - + - - + + + +
    diff --git a/Doc/Doxygen/html/functions.html b/Doc/Doxygen/html/functions.html index f4fdd50..74852b0 100644 --- a/Doc/Doxygen/html/functions.html +++ b/Doc/Doxygen/html/functions.html @@ -3,7 +3,8 @@ - + + Chameleon-Mini: Class Members @@ -11,9 +12,6 @@ - @@ -31,47 +29,19 @@
    - + - - - + + + +
    diff --git a/Doc/Doxygen/html/functions_vars.html b/Doc/Doxygen/html/functions_vars.html index fd8a2eb..bb3c26e 100644 --- a/Doc/Doxygen/html/functions_vars.html +++ b/Doc/Doxygen/html/functions_vars.html @@ -3,7 +3,8 @@ - + + Chameleon-Mini: Class Members - Variables @@ -11,9 +12,6 @@ - @@ -31,47 +29,19 @@
    - + - - - + + + +
    diff --git a/Doc/Doxygen/html/globals.html b/Doc/Doxygen/html/globals.html index ec34d5f..6786d93 100644 --- a/Doc/Doxygen/html/globals.html +++ b/Doc/Doxygen/html/globals.html @@ -3,7 +3,8 @@ - + + Chameleon-Mini: File Members @@ -11,9 +12,6 @@ - @@ -31,59 +29,19 @@
    - + - - - - + + + +
    Here is a list of all documented file members with links to the documentation:
    -

    - c -

      +

      - c -

      -

      - d -

        +

        - d -

        -

        - l -

          +

          - l -

          • LanguageString : LUFADescriptors.c
          • @@ -220,14 +178,14 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
          -

          - m -

            +

            - m -

            -

            - p -

              +

              - p -

              • ProductString : LUFADescriptors.c
              • @@ -235,9 +193,9 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    diff --git a/Doc/Doxygen/html/globals_defs.html b/Doc/Doxygen/html/globals_defs.html index d0d3af3..0d71f96 100644 --- a/Doc/Doxygen/html/globals_defs.html +++ b/Doc/Doxygen/html/globals_defs.html @@ -3,7 +3,8 @@ - + + Chameleon-Mini: File Members @@ -11,9 +12,6 @@ - @@ -31,50 +29,19 @@ - + - - - + + + +
    diff --git a/Doc/Doxygen/html/globals_enum.html b/Doc/Doxygen/html/globals_enum.html index f157a12..89643a6 100644 --- a/Doc/Doxygen/html/globals_enum.html +++ b/Doc/Doxygen/html/globals_enum.html @@ -3,7 +3,8 @@ - + + Chameleon-Mini: File Members @@ -11,9 +12,6 @@ - @@ -31,50 +29,19 @@
    - + - - - + + + +
    diff --git a/Doc/Doxygen/html/globals_eval.html b/Doc/Doxygen/html/globals_eval.html index 49e85cf..3f07241 100644 --- a/Doc/Doxygen/html/globals_eval.html +++ b/Doc/Doxygen/html/globals_eval.html @@ -3,7 +3,8 @@ - + + Chameleon-Mini: File Members @@ -11,9 +12,6 @@ - @@ -31,50 +29,19 @@
    - + - - - + + + +
    diff --git a/Doc/Doxygen/html/globals_func.html b/Doc/Doxygen/html/globals_func.html index f36b85a..a06d29d 100644 --- a/Doc/Doxygen/html/globals_func.html +++ b/Doc/Doxygen/html/globals_func.html @@ -3,7 +3,8 @@ - + + Chameleon-Mini: File Members @@ -11,9 +12,6 @@ - @@ -31,50 +29,19 @@
    - + - - - + + + +
    diff --git a/Doc/Doxygen/html/globals_vars.html b/Doc/Doxygen/html/globals_vars.html index 64aebab..a4c5e63 100644 --- a/Doc/Doxygen/html/globals_vars.html +++ b/Doc/Doxygen/html/globals_vars.html @@ -3,7 +3,8 @@ - + + Chameleon-Mini: File Members @@ -11,9 +12,6 @@ - @@ -31,50 +29,19 @@
    - + - - - + + + +
    diff --git a/Doc/Doxygen/html/index.html b/Doc/Doxygen/html/index.html index 1b091e2..868f775 100644 --- a/Doc/Doxygen/html/index.html +++ b/Doc/Doxygen/html/index.html @@ -3,7 +3,8 @@ - + + Chameleon-Mini: Main Page @@ -11,9 +12,6 @@ - @@ -31,34 +29,19 @@
    - + - + + + +
    We appreciate all types of contributions (for example hardware mods, firmware upgrades, bug fixes, new supported card types, videos, pictures, example applications, reviews, instructions, documentation, translations, new findings, ANYTHING...) and are happy to upload the stuff for you into the github project. Please send your contribution to chame.nosp@m.leon.nosp@m.@kasp.nosp@m.er-o.nosp@m.swald.nosp@m..de and we will (if desired) give you credit in the github log of the upload. Likewise, we are looking forward to your feedback about bugs, problems, and desired future upgrades. Please use the issues button accordingly.

    Pages:

    diff --git a/Doc/Doxygen/html/jquery.js b/Doc/Doxygen/html/jquery.js index d52a1c7..3f1abfb 100644 --- a/Doc/Doxygen/html/jquery.js +++ b/Doc/Doxygen/html/jquery.js @@ -65,4 +65,23 @@ Released under MIT license. https://raw.github.com/stevenbenner/jquery-powertip/master/LICENSE.txt */ -(function(a){if(typeof define==="function"&&define.amd){define(["jquery"],a)}else{a(jQuery)}}(function(k){var A=k(document),s=k(window),w=k("body");var n="displayController",e="hasActiveHover",d="forcedOpen",u="hasMouseMove",f="mouseOnToPopup",g="originalTitle",y="powertip",o="powertipjq",l="powertiptarget",E=180/Math.PI;var c={isTipOpen:false,isFixedTipOpen:false,isClosing:false,tipOpenImminent:false,activeHover:null,currentX:0,currentY:0,previousX:0,previousY:0,desyncTimeout:null,mouseTrackingActive:false,delayInProgress:false,windowWidth:0,windowHeight:0,scrollTop:0,scrollLeft:0};var p={none:0,top:1,bottom:2,left:4,right:8};k.fn.powerTip=function(F,N){if(!this.length){return this}if(k.type(F)==="string"&&k.powerTip[F]){return k.powerTip[F].call(this,this,N)}var O=k.extend({},k.fn.powerTip.defaults,F),G=new x(O);h();this.each(function M(){var R=k(this),Q=R.data(y),P=R.data(o),T=R.data(l),S;if(R.data(n)){k.powerTip.destroy(R)}S=R.attr("title");if(!Q&&!T&&!P&&S){R.data(y,S);R.data(g,S);R.removeAttr("title")}R.data(n,new t(R,O,G))});if(!O.manual){this.on({"mouseenter.powertip":function J(P){k.powerTip.show(this,P)},"mouseleave.powertip":function L(){k.powerTip.hide(this)},"focus.powertip":function K(){k.powerTip.show(this)},"blur.powertip":function H(){k.powerTip.hide(this,true)},"keydown.powertip":function I(P){if(P.keyCode===27){k.powerTip.hide(this,true)}}})}return this};k.fn.powerTip.defaults={fadeInTime:200,fadeOutTime:100,followMouse:false,popupId:"powerTip",intentSensitivity:7,intentPollInterval:100,closeDelay:100,placement:"n",smartPlacement:false,offset:10,mouseOnToPopup:false,manual:false};k.fn.powerTip.smartPlacementLists={n:["n","ne","nw","s"],e:["e","ne","se","w","nw","sw","n","s","e"],s:["s","se","sw","n"],w:["w","nw","sw","e","ne","se","n","s","w"],nw:["nw","w","sw","n","s","se","nw"],ne:["ne","e","se","n","s","sw","ne"],sw:["sw","w","nw","s","n","ne","sw"],se:["se","e","ne","s","n","nw","se"],"nw-alt":["nw-alt","n","ne-alt","sw-alt","s","se-alt","w","e"],"ne-alt":["ne-alt","n","nw-alt","se-alt","s","sw-alt","e","w"],"sw-alt":["sw-alt","s","se-alt","nw-alt","n","ne-alt","w","e"],"se-alt":["se-alt","s","sw-alt","ne-alt","n","nw-alt","e","w"]};k.powerTip={show:function z(F,G){if(G){i(G);c.previousX=G.pageX;c.previousY=G.pageY;k(F).data(n).show()}else{k(F).first().data(n).show(true,true)}return F},reposition:function r(F){k(F).first().data(n).resetPosition();return F},hide:function D(G,F){if(G){k(G).first().data(n).hide(F)}else{if(c.activeHover){c.activeHover.data(n).hide(true)}}return G},destroy:function C(G){k(G).off(".powertip").each(function F(){var I=k(this),H=[g,n,e,d];if(I.data(g)){I.attr("title",I.data(g));H.push(y)}I.removeData(H)});return G}};k.powerTip.showTip=k.powerTip.show;k.powerTip.closeTip=k.powerTip.hide;function b(){var F=this;F.top="auto";F.left="auto";F.right="auto";F.bottom="auto";F.set=function(H,G){if(k.isNumeric(G)){F[H]=Math.round(G)}}}function t(K,N,F){var J=null;function L(P,Q){M();if(!K.data(e)){if(!P){c.tipOpenImminent=true;J=setTimeout(function O(){J=null;I()},N.intentPollInterval)}else{if(Q){K.data(d,true)}F.showTip(K)}}}function G(P){M();c.tipOpenImminent=false;if(K.data(e)){K.data(d,false);if(!P){c.delayInProgress=true;J=setTimeout(function O(){J=null;F.hideTip(K);c.delayInProgress=false},N.closeDelay)}else{F.hideTip(K)}}}function I(){var Q=Math.abs(c.previousX-c.currentX),O=Math.abs(c.previousY-c.currentY),P=Q+O;if(P",{id:Q.popupId});if(w.length===0){w=k("body")}w.append(O)}if(Q.followMouse){if(!O.data(u)){A.on("mousemove",M);s.on("scroll",M);O.data(u,true)}}if(Q.mouseOnToPopup){O.on({mouseenter:function L(){if(O.data(f)){if(c.activeHover){c.activeHover.data(n).cancel()}}},mouseleave:function N(){if(c.activeHover){c.activeHover.data(n).hide()}}})}function I(S){S.data(e,true);O.queue(function R(T){H(S);T()})}function H(S){var U;if(!S.data(e)){return}if(c.isTipOpen){if(!c.isClosing){K(c.activeHover)}O.delay(100).queue(function R(V){H(S);V()});return}S.trigger("powerTipPreRender");U=B(S);if(U){O.empty().append(U)}else{return}S.trigger("powerTipRender");c.activeHover=S;c.isTipOpen=true;O.data(f,Q.mouseOnToPopup);if(!Q.followMouse){G(S);c.isFixedTipOpen=true}else{M()}O.fadeIn(Q.fadeInTime,function T(){if(!c.desyncTimeout){c.desyncTimeout=setInterval(J,500)}S.trigger("powerTipOpen")})}function K(R){c.isClosing=true;c.activeHover=null;c.isTipOpen=false;c.desyncTimeout=clearInterval(c.desyncTimeout);R.data(e,false);R.data(d,false);O.fadeOut(Q.fadeOutTime,function S(){var T=new b();c.isClosing=false;c.isFixedTipOpen=false;O.removeClass();T.set("top",c.currentY+Q.offset);T.set("left",c.currentX+Q.offset);O.css(T);R.trigger("powerTipClose")})}function M(){if(!c.isFixedTipOpen&&(c.isTipOpen||(c.tipOpenImminent&&O.data(u)))){var R=O.outerWidth(),V=O.outerHeight(),U=new b(),S,T;U.set("top",c.currentY+Q.offset);U.set("left",c.currentX+Q.offset);S=m(U,R,V);if(S!==p.none){T=a(S);if(T===1){if(S===p.right){U.set("left",c.windowWidth-R)}else{if(S===p.bottom){U.set("top",c.scrollTop+c.windowHeight-V)}}}else{U.set("left",c.currentX-R-Q.offset);U.set("top",c.currentY-V-Q.offset)}}O.css(U)}}function G(S){var R,T;if(Q.smartPlacement){R=k.fn.powerTip.smartPlacementLists[Q.placement];k.each(R,function(U,W){var V=m(F(S,W),O.outerWidth(),O.outerHeight());T=W;if(V===p.none){return false}})}else{F(S,Q.placement);T=Q.placement}O.addClass(T)}function F(U,T){var R=0,S,W,V=new b();V.set("top",0);V.set("left",0);O.css(V);do{S=O.outerWidth();W=O.outerHeight();V=P.compute(U,T,S,W,Q.offset);O.css(V)}while(++R<=5&&(S!==O.outerWidth()||W!==O.outerHeight()));return V}function J(){var R=false;if(c.isTipOpen&&!c.isClosing&&!c.delayInProgress){if(c.activeHover.data(e)===false||c.activeHover.is(":disabled")){R=true}else{if(!v(c.activeHover)&&!c.activeHover.is(":focus")&&!c.activeHover.data(d)){if(O.data(f)){if(!v(O)){R=true}}else{R=true}}}if(R){K(c.activeHover)}}}this.showTip=I;this.hideTip=K;this.resetPosition=G}function q(F){return window.SVGElement&&F[0] instanceof SVGElement}function h(){if(!c.mouseTrackingActive){c.mouseTrackingActive=true;k(function H(){c.scrollLeft=s.scrollLeft();c.scrollTop=s.scrollTop();c.windowWidth=s.width();c.windowHeight=s.height()});A.on("mousemove",i);s.on({resize:function G(){c.windowWidth=s.width();c.windowHeight=s.height()},scroll:function F(){var I=s.scrollLeft(),J=s.scrollTop();if(I!==c.scrollLeft){c.currentX+=I-c.scrollLeft;c.scrollLeft=I}if(J!==c.scrollTop){c.currentY+=J-c.scrollTop;c.scrollTop=J}}})}}function i(F){c.currentX=F.pageX;c.currentY=F.pageY}function v(F){var H=F.offset(),J=F[0].getBoundingClientRect(),I=J.right-J.left,G=J.bottom-J.top;return c.currentX>=H.left&&c.currentX<=H.left+I&&c.currentY>=H.top&&c.currentY<=H.top+G}function B(I){var G=I.data(y),F=I.data(o),K=I.data(l),H,J;if(G){if(k.isFunction(G)){G=G.call(I[0])}J=G}else{if(F){if(k.isFunction(F)){F=F.call(I[0])}if(F.length>0){J=F.clone(true,true)}}else{if(K){H=k("#"+K);if(H.length>0){J=H.html()}}}}return J}function m(M,L,K){var G=c.scrollTop,J=c.scrollLeft,I=G+c.windowHeight,F=J+c.windowWidth,H=p.none;if(M.topI||Math.abs(M.bottom-c.windowHeight)>I){H|=p.bottom}if(M.leftF){H|=p.left}if(M.left+L>F||M.right",{id:Q.popupId});if(w.length===0){w=k("body")}w.append(O)}if(Q.followMouse){if(!O.data(u)){A.on("mousemove",M);s.on("scroll",M);O.data(u,true)}}if(Q.mouseOnToPopup){O.on({mouseenter:function L(){if(O.data(f)){if(c.activeHover){c.activeHover.data(n).cancel()}}},mouseleave:function N(){if(c.activeHover){c.activeHover.data(n).hide()}}})}function I(S){S.data(e,true);O.queue(function R(T){H(S);T()})}function H(S){var U;if(!S.data(e)){return}if(c.isTipOpen){if(!c.isClosing){K(c.activeHover)}O.delay(100).queue(function R(V){H(S);V()});return}S.trigger("powerTipPreRender");U=B(S);if(U){O.empty().append(U)}else{return}S.trigger("powerTipRender");c.activeHover=S;c.isTipOpen=true;O.data(f,Q.mouseOnToPopup);if(!Q.followMouse){G(S);c.isFixedTipOpen=true}else{M()}O.fadeIn(Q.fadeInTime,function T(){if(!c.desyncTimeout){c.desyncTimeout=setInterval(J,500)}S.trigger("powerTipOpen")})}function K(R){c.isClosing=true;c.activeHover=null;c.isTipOpen=false;c.desyncTimeout=clearInterval(c.desyncTimeout);R.data(e,false);R.data(d,false);O.fadeOut(Q.fadeOutTime,function S(){var T=new b();c.isClosing=false;c.isFixedTipOpen=false;O.removeClass();T.set("top",c.currentY+Q.offset);T.set("left",c.currentX+Q.offset);O.css(T);R.trigger("powerTipClose")})}function M(){if(!c.isFixedTipOpen&&(c.isTipOpen||(c.tipOpenImminent&&O.data(u)))){var R=O.outerWidth(),V=O.outerHeight(),U=new b(),S,T;U.set("top",c.currentY+Q.offset);U.set("left",c.currentX+Q.offset);S=m(U,R,V);if(S!==p.none){T=a(S);if(T===1){if(S===p.right){U.set("left",c.windowWidth-R)}else{if(S===p.bottom){U.set("top",c.scrollTop+c.windowHeight-V)}}}else{U.set("left",c.currentX-R-Q.offset);U.set("top",c.currentY-V-Q.offset)}}O.css(U)}}function G(S){var R,T;if(Q.smartPlacement){R=k.fn.powerTip.smartPlacementLists[Q.placement];k.each(R,function(U,W){var V=m(F(S,W),O.outerWidth(),O.outerHeight());T=W;if(V===p.none){return false}})}else{F(S,Q.placement);T=Q.placement}O.addClass(T)}function F(U,T){var R=0,S,W,V=new b();V.set("top",0);V.set("left",0);O.css(V);do{S=O.outerWidth();W=O.outerHeight();V=P.compute(U,T,S,W,Q.offset);O.css(V)}while(++R<=5&&(S!==O.outerWidth()||W!==O.outerHeight()));return V}function J(){var R=false;if(c.isTipOpen&&!c.isClosing&&!c.delayInProgress){if(c.activeHover.data(e)===false||c.activeHover.is(":disabled")){R=true}else{if(!v(c.activeHover)&&!c.activeHover.is(":focus")&&!c.activeHover.data(d)){if(O.data(f)){if(!v(O)){R=true}}else{R=true}}}if(R){K(c.activeHover)}}}this.showTip=I;this.hideTip=K;this.resetPosition=G}function q(F){return window.SVGElement&&F[0] instanceof SVGElement}function h(){if(!c.mouseTrackingActive){c.mouseTrackingActive=true;k(function H(){c.scrollLeft=s.scrollLeft();c.scrollTop=s.scrollTop();c.windowWidth=s.width();c.windowHeight=s.height()});A.on("mousemove",i);s.on({resize:function G(){c.windowWidth=s.width();c.windowHeight=s.height()},scroll:function F(){var I=s.scrollLeft(),J=s.scrollTop();if(I!==c.scrollLeft){c.currentX+=I-c.scrollLeft;c.scrollLeft=I}if(J!==c.scrollTop){c.currentY+=J-c.scrollTop;c.scrollTop=J}}})}}function i(F){c.currentX=F.pageX;c.currentY=F.pageY}function v(F){var H=F.offset(),J=F[0].getBoundingClientRect(),I=J.right-J.left,G=J.bottom-J.top;return c.currentX>=H.left&&c.currentX<=H.left+I&&c.currentY>=H.top&&c.currentY<=H.top+G}function B(I){var G=I.data(y),F=I.data(o),K=I.data(l),H,J;if(G){if(k.isFunction(G)){G=G.call(I[0])}J=G}else{if(F){if(k.isFunction(F)){F=F.call(I[0])}if(F.length>0){J=F.clone(true,true)}}else{if(K){H=k("#"+K);if(H.length>0){J=H.html()}}}}return J}function m(M,L,K){var G=c.scrollTop,J=c.scrollLeft,I=G+c.windowHeight,F=J+c.windowWidth,H=p.none;if(M.topI||Math.abs(M.bottom-c.windowHeight)>I){H|=p.bottom}if(M.leftF){H|=p.left}if(M.left+L>F||M.right1){return}h.preventDefault();var j=h.originalEvent.changedTouches[0],g=document.createEvent("MouseEvents");g.initMouseEvent(i,true,true,window,1,j.screenX,j.screenY,j.clientX,j.clientY,false,false,false,false,0,null);h.target.dispatchEvent(g)}d._touchStart=function(h){var g=this;if(a||!g._mouseCapture(h.originalEvent.changedTouches[0])){return}a=true;g._touchMoved=false;e(h,"mouseover");e(h,"mousemove");e(h,"mousedown")};d._touchMove=function(g){if(!a){return}this._touchMoved=true;e(g,"mousemove")};d._touchEnd=function(g){if(!a){return}e(g,"mouseup");e(g,"mouseout");if(!this._touchMoved){e(g,"click")}a=false};d._mouseInit=function(){var g=this;g.element.bind({touchstart:b.proxy(g,"_touchStart"),touchmove:b.proxy(g,"_touchMove"),touchend:b.proxy(g,"_touchEnd")});f.call(g)};d._mouseDestroy=function(){var g=this;g.element.unbind({touchstart:b.proxy(g,"_touchStart"),touchmove:b.proxy(g,"_touchMove"),touchend:b.proxy(g,"_touchEnd")});c.call(g)}})(jQuery);/* + * SmartMenus jQuery Plugin - v1.0.0 - January 27, 2016 + * http://www.smartmenus.org/ + * + * Copyright Vasil Dinkov, Vadikom Web Ltd. + * http://vadikom.com + * + * Licensed MIT + */ +(function(a){if(typeof define==="function"&&define.amd){define(["jquery"],a)}else{if(typeof module==="object"&&typeof module.exports==="object"){module.exports=a(require("jquery"))}else{a(jQuery)}}}(function(a){var b=[],e=!!window.createPopup,f=false,d="ontouchstart" in window,h=false,g=window.requestAnimationFrame||function(l){return setTimeout(l,1000/60)},c=window.cancelAnimationFrame||function(l){clearTimeout(l)};function k(m){var n=".smartmenus_mouse";if(!h&&!m){var o=true,l=null;a(document).bind(i([["mousemove",function(s){var t={x:s.pageX,y:s.pageY,timeStamp:new Date().getTime()};if(l){var q=Math.abs(l.x-t.x),p=Math.abs(l.y-t.y);if((q>0||p>0)&&q<=2&&p<=2&&t.timeStamp-l.timeStamp<=300){f=true;if(o){var r=a(s.target).closest("a");if(r.is("a")){a.each(b,function(){if(a.contains(this.$root[0],r[0])){this.itemEnter({currentTarget:r[0]});return false}})}o=false}}}l=t}],[d?"touchstart":"pointerover pointermove pointerout MSPointerOver MSPointerMove MSPointerOut",function(p){if(j(p.originalEvent)){f=false}}]],n));h=true}else{if(h&&m){a(document).unbind(n);h=false}}}function j(l){return !/^(4|mouse)$/.test(l.pointerType)}function i(l,n){if(!n){n=""}var m={};a.each(l,function(o,p){m[p[0].split(" ").join(n+" ")+n]=p[1]});return m}a.SmartMenus=function(m,l){this.$root=a(m);this.opts=l;this.rootId="";this.accessIdPrefix="";this.$subArrow=null;this.activatedItems=[];this.visibleSubMenus=[];this.showTimeout=0;this.hideTimeout=0;this.scrollTimeout=0;this.clickActivated=false;this.focusActivated=false;this.zIndexInc=0;this.idInc=0;this.$firstLink=null;this.$firstSub=null;this.disabled=false;this.$disableOverlay=null;this.$touchScrollingSub=null;this.cssTransforms3d="perspective" in m.style||"webkitPerspective" in m.style;this.wasCollapsible=false;this.init()};a.extend(a.SmartMenus,{hideAll:function(){a.each(b,function(){this.menuHideAll()})},destroy:function(){while(b.length){b[0].destroy()}k(true)},prototype:{init:function(n){var l=this;if(!n){b.push(this);this.rootId=(new Date().getTime()+Math.random()+"").replace(/\D/g,"");this.accessIdPrefix="sm-"+this.rootId+"-";if(this.$root.hasClass("sm-rtl")){this.opts.rightToLeftSubMenus=true}var r=".smartmenus";this.$root.data("smartmenus",this).attr("data-smartmenus-id",this.rootId).dataSM("level",1).bind(i([["mouseover focusin",a.proxy(this.rootOver,this)],["mouseout focusout",a.proxy(this.rootOut,this)],["keydown",a.proxy(this.rootKeyDown,this)]],r)).delegate("a",i([["mouseenter",a.proxy(this.itemEnter,this)],["mouseleave",a.proxy(this.itemLeave,this)],["mousedown",a.proxy(this.itemDown,this)],["focus",a.proxy(this.itemFocus,this)],["blur",a.proxy(this.itemBlur,this)],["click",a.proxy(this.itemClick,this)]],r));r+=this.rootId;if(this.opts.hideOnClick){a(document).bind(i([["touchstart",a.proxy(this.docTouchStart,this)],["touchmove",a.proxy(this.docTouchMove,this)],["touchend",a.proxy(this.docTouchEnd,this)],["click",a.proxy(this.docClick,this)]],r))}a(window).bind(i([["resize orientationchange",a.proxy(this.winResize,this)]],r));if(this.opts.subIndicators){this.$subArrow=a("").addClass("sub-arrow");if(this.opts.subIndicatorsText){this.$subArrow.html(this.opts.subIndicatorsText)}}k()}this.$firstSub=this.$root.find("ul").each(function(){l.menuInit(a(this))}).eq(0);this.$firstLink=this.$root.find("a").eq(0);if(this.opts.markCurrentItem){var p=/(index|default)\.[^#\?\/]*/i,m=/#.*/,q=window.location.href.replace(p,""),o=q.replace(m,"");this.$root.find("a").each(function(){var s=this.href.replace(p,""),t=a(this);if(s==q||s==o){t.addClass("current");if(l.opts.markCurrentTree){t.parentsUntil("[data-smartmenus-id]","ul").each(function(){a(this).dataSM("parent-a").addClass("current")})}}})}this.wasCollapsible=this.isCollapsible()},destroy:function(m){if(!m){var n=".smartmenus";this.$root.removeData("smartmenus").removeAttr("data-smartmenus-id").removeDataSM("level").unbind(n).undelegate(n);n+=this.rootId;a(document).unbind(n);a(window).unbind(n);if(this.opts.subIndicators){this.$subArrow=null}}this.menuHideAll();var l=this;this.$root.find("ul").each(function(){var o=a(this);if(o.dataSM("scroll-arrows")){o.dataSM("scroll-arrows").remove()}if(o.dataSM("shown-before")){if(l.opts.subMenusMinWidth||l.opts.subMenusMaxWidth){o.css({width:"",minWidth:"",maxWidth:""}).removeClass("sm-nowrap")}if(o.dataSM("scroll-arrows")){o.dataSM("scroll-arrows").remove()}o.css({zIndex:"",top:"",left:"",marginLeft:"",marginTop:"",display:""})}if((o.attr("id")||"").indexOf(l.accessIdPrefix)==0){o.removeAttr("id")}}).removeDataSM("in-mega").removeDataSM("shown-before").removeDataSM("ie-shim").removeDataSM("scroll-arrows").removeDataSM("parent-a").removeDataSM("level").removeDataSM("beforefirstshowfired").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeAttr("aria-expanded");this.$root.find("a.has-submenu").each(function(){var o=a(this);if(o.attr("id").indexOf(l.accessIdPrefix)==0){o.removeAttr("id")}}).removeClass("has-submenu").removeDataSM("sub").removeAttr("aria-haspopup").removeAttr("aria-controls").removeAttr("aria-expanded").closest("li").removeDataSM("sub");if(this.opts.subIndicators){this.$root.find("span.sub-arrow").remove()}if(this.opts.markCurrentItem){this.$root.find("a.current").removeClass("current")}if(!m){this.$root=null;this.$firstLink=null;this.$firstSub=null;if(this.$disableOverlay){this.$disableOverlay.remove();this.$disableOverlay=null}b.splice(a.inArray(this,b),1)}},disable:function(l){if(!this.disabled){this.menuHideAll();if(!l&&!this.opts.isPopup&&this.$root.is(":visible")){var m=this.$root.offset();this.$disableOverlay=a('
    ').css({position:"absolute",top:m.top,left:m.left,width:this.$root.outerWidth(),height:this.$root.outerHeight(),zIndex:this.getStartZIndex(true),opacity:0}).appendTo(document.body)}this.disabled=true}},docClick:function(l){if(this.$touchScrollingSub){this.$touchScrollingSub=null;return}if(this.visibleSubMenus.length&&!a.contains(this.$root[0],l.target)||a(l.target).is("a")){this.menuHideAll()}},docTouchEnd:function(m){if(!this.lastTouch){return}if(this.visibleSubMenus.length&&(this.lastTouch.x2===undefined||this.lastTouch.x1==this.lastTouch.x2)&&(this.lastTouch.y2===undefined||this.lastTouch.y1==this.lastTouch.y2)&&(!this.lastTouch.target||!a.contains(this.$root[0],this.lastTouch.target))){if(this.hideTimeout){clearTimeout(this.hideTimeout);this.hideTimeout=0}var l=this;this.hideTimeout=setTimeout(function(){l.menuHideAll()},350)}this.lastTouch=null},docTouchMove:function(m){if(!this.lastTouch){return}var l=m.originalEvent.touches[0];this.lastTouch.x2=l.pageX;this.lastTouch.y2=l.pageY},docTouchStart:function(m){var l=m.originalEvent.touches[0];this.lastTouch={x1:l.pageX,y1:l.pageY,target:l.target}},enable:function(){if(this.disabled){if(this.$disableOverlay){this.$disableOverlay.remove();this.$disableOverlay=null}this.disabled=false}},getClosestMenu:function(m){var l=a(m).closest("ul");while(l.dataSM("in-mega")){l=l.parent().closest("ul")}return l[0]||null},getHeight:function(l){return this.getOffset(l,true)},getOffset:function(n,l){var m;if(n.css("display")=="none"){m={position:n[0].style.position,visibility:n[0].style.visibility};n.css({position:"absolute",visibility:"hidden"}).show()}var o=n[0].getBoundingClientRect&&n[0].getBoundingClientRect(),p=o&&(l?o.height||o.bottom-o.top:o.width||o.right-o.left);if(!p&&p!==0){p=l?n[0].offsetHeight:n[0].offsetWidth}if(m){n.hide().css(m)}return p},getStartZIndex:function(l){var m=parseInt(this[l?"$root":"$firstSub"].css("z-index"));if(!l&&isNaN(m)){m=parseInt(this.$root.css("z-index"))}return !isNaN(m)?m:1},getTouchPoint:function(l){return l.touches&&l.touches[0]||l.changedTouches&&l.changedTouches[0]||l},getViewport:function(l){var m=l?"Height":"Width",o=document.documentElement["client"+m],n=window["inner"+m];if(n){o=Math.min(o,n)}return o},getViewportHeight:function(){return this.getViewport(true)},getViewportWidth:function(){return this.getViewport()},getWidth:function(l){return this.getOffset(l)},handleEvents:function(){return !this.disabled&&this.isCSSOn()},handleItemEvents:function(l){return this.handleEvents()&&!this.isLinkInMegaMenu(l)},isCollapsible:function(){return this.$firstSub.css("position")=="static"},isCSSOn:function(){return this.$firstLink.css("display")=="block"},isFixed:function(){var l=this.$root.css("position")=="fixed";if(!l){this.$root.parentsUntil("body").each(function(){if(a(this).css("position")=="fixed"){l=true;return false}})}return l},isLinkInMegaMenu:function(l){return a(this.getClosestMenu(l[0])).hasClass("mega-menu")},isTouchMode:function(){return !f||this.opts.noMouseOver||this.isCollapsible()},itemActivate:function(p,l){var n=p.closest("ul"),q=n.dataSM("level");if(q>1&&(!this.activatedItems[q-2]||this.activatedItems[q-2][0]!=n.dataSM("parent-a")[0])){var m=this;a(n.parentsUntil("[data-smartmenus-id]","ul").get().reverse()).add(n).each(function(){m.itemActivate(a(this).dataSM("parent-a"))})}if(!this.isCollapsible()||l){this.menuHideSubMenus(!this.activatedItems[q-1]||this.activatedItems[q-1][0]!=p[0]?q-1:q)}this.activatedItems[q-1]=p;if(this.$root.triggerHandler("activate.smapi",p[0])===false){return}var o=p.dataSM("sub");if(o&&(this.isTouchMode()||(!this.opts.showOnClick||this.clickActivated))){this.menuShow(o)}},itemBlur:function(m){var l=a(m.currentTarget);if(!this.handleItemEvents(l)){return}this.$root.triggerHandler("blur.smapi",l[0])},itemClick:function(o){var n=a(o.currentTarget);if(!this.handleItemEvents(n)){return}if(this.$touchScrollingSub&&this.$touchScrollingSub[0]==n.closest("ul")[0]){this.$touchScrollingSub=null;o.stopPropagation();return false}if(this.$root.triggerHandler("click.smapi",n[0])===false){return false}var p=a(o.target).is("span.sub-arrow"),m=n.dataSM("sub"),l=m?m.dataSM("level")==2:false;if(m&&!m.is(":visible")){if(this.opts.showOnClick&&l){this.clickActivated=true}this.itemActivate(n);if(m.is(":visible")){this.focusActivated=true;return false}}else{if(this.isCollapsible()&&p){this.itemActivate(n);this.menuHide(m);return false}}if(this.opts.showOnClick&&l||n.hasClass("disabled")||this.$root.triggerHandler("select.smapi",n[0])===false){return false}},itemDown:function(m){var l=a(m.currentTarget);if(!this.handleItemEvents(l)){return}l.dataSM("mousedown",true)},itemEnter:function(n){var m=a(n.currentTarget);if(!this.handleItemEvents(m)){return}if(!this.isTouchMode()){if(this.showTimeout){clearTimeout(this.showTimeout);this.showTimeout=0}var l=this;this.showTimeout=setTimeout(function(){l.itemActivate(m)},this.opts.showOnClick&&m.closest("ul").dataSM("level")==1?1:this.opts.showTimeout)}this.$root.triggerHandler("mouseenter.smapi",m[0])},itemFocus:function(m){var l=a(m.currentTarget);if(!this.handleItemEvents(l)){return}if(this.focusActivated&&(!this.isTouchMode()||!l.dataSM("mousedown"))&&(!this.activatedItems.length||this.activatedItems[this.activatedItems.length-1][0]!=l[0])){this.itemActivate(l,true)}this.$root.triggerHandler("focus.smapi",l[0])},itemLeave:function(m){var l=a(m.currentTarget);if(!this.handleItemEvents(l)){return}if(!this.isTouchMode()){l[0].blur();if(this.showTimeout){clearTimeout(this.showTimeout);this.showTimeout=0}}l.removeDataSM("mousedown");this.$root.triggerHandler("mouseleave.smapi",l[0])},menuHide:function(m){if(this.$root.triggerHandler("beforehide.smapi",m[0])===false){return}m.stop(true,true);if(m.css("display")!="none"){var l=function(){m.css("z-index","")};if(this.isCollapsible()){if(this.opts.collapsibleHideFunction){this.opts.collapsibleHideFunction.call(this,m,l)}else{m.hide(this.opts.collapsibleHideDuration,l)}}else{if(this.opts.hideFunction){this.opts.hideFunction.call(this,m,l)}else{m.hide(this.opts.hideDuration,l)}}if(m.dataSM("ie-shim")){m.dataSM("ie-shim").remove().css({"-webkit-transform":"",transform:""})}if(m.dataSM("scroll")){this.menuScrollStop(m);m.css({"touch-action":"","-ms-touch-action":"","-webkit-transform":"",transform:""}).unbind(".smartmenus_scroll").removeDataSM("scroll").dataSM("scroll-arrows").hide()}m.dataSM("parent-a").removeClass("highlighted").attr("aria-expanded","false");m.attr({"aria-expanded":"false","aria-hidden":"true"});var n=m.dataSM("level");this.activatedItems.splice(n-1,1);this.visibleSubMenus.splice(a.inArray(m,this.visibleSubMenus),1);this.$root.triggerHandler("hide.smapi",m[0])}},menuHideAll:function(){if(this.showTimeout){clearTimeout(this.showTimeout);this.showTimeout=0}var m=this.opts.isPopup?1:0;for(var l=this.visibleSubMenus.length-1;l>=m;l--){this.menuHide(this.visibleSubMenus[l])}if(this.opts.isPopup){this.$root.stop(true,true);if(this.$root.is(":visible")){if(this.opts.hideFunction){this.opts.hideFunction.call(this,this.$root)}else{this.$root.hide(this.opts.hideDuration)}if(this.$root.dataSM("ie-shim")){this.$root.dataSM("ie-shim").remove()}}}this.activatedItems=[];this.visibleSubMenus=[];this.clickActivated=false;this.focusActivated=false;this.zIndexInc=0;this.$root.triggerHandler("hideAll.smapi")},menuHideSubMenus:function(n){for(var l=this.activatedItems.length-1;l>=n;l--){var m=this.activatedItems[l].dataSM("sub");if(m){this.menuHide(m)}}},menuIframeShim:function(l){if(e&&this.opts.overlapControlsInIE&&!l.dataSM("ie-shim")){l.dataSM("ie-shim",a(" +
    + + + +
    +
    +
    ISO14443A Reader Functionality
    +
    +
    +

    The ChameleonMini is able to act as an ISO 14443A reader. This page describes how to use this configuration (See Configurations) correctly.

    +

    Supported Commands

    +

    Using the ISO 14443A reader configuration enables the usage of some commands that are only available within this configuration.

    +
    Note
    Technically, the SEND and SEND_RAW commands are also timeout commands, but they end successfully (either with NO DATA or the response) nearly immediately on every call.
    +
    +Each of the following commands returns INVALID COMMAND USAGE on a non-reader configuration.
    +
    Warning
    The reader field is only turned on if this is necessary. Some commands deactivate the reader field after they are done, some do not deactivate the reader field after finishing. Please be aware, that the reader field takes a massive amount of energy and thus the voltage of the battery can drop to a critical level fastly. If not mentioned differently, all of the commands below deactivate the reader field after work.
    +

    SEND <BYTEVALUE>

    +

    There are two cases what is done, depending on the parameter:

      +
    1. If the parameter is one byte, no parity bits are added, since this must be a short frame command. In this case the seven least significant bits are sent.
    2. +
    3. If the parameter consists of more than one byte, parity bits are added and afterwards the whole sequence is sent.
    4. +
    +

    After sending, the ChameleonMini waits for an answer and returns either

      +
    • NO DATA if no answer could be detected or
    • +
    • the received data with removed parity bits, a 2-byte big-endian value indicating the bit count and either the string PARITY OK or PARITY ERR indicating whether the parity check failed or not.
    • +
    +

    In each case, the ChameleonMini code 101:OK WITH TEXT is returned.

    +

    Examples

    +
      +
    • SEND 52 sends the WUPA command
    • +
    • SEND 9320 sends the ANTICOLLISION command
    • +
    • SEND AB2 returns INVALID PARAMETER since the parameter is no byte sequence
    • +
    +
    Warning
    This command does not deactivate the reader field after finishing in order to make it possible to keep up the conversation with the card.
    +

    SEND <2-BYTEVALUE> <BYTEVALUE>

    +

    Does the same like the command with only one parameter, but the first parameter indicates the to-be-sent bit count.

    +
    Warning
    If the bit count parameter is neither 7 or a multiple of 8, no parity bits will be appended, but the remaining functionality is the exact same!
    +

    Examples

    +
      +
    • SEND 0007 26 sends the REQA command
    • +
    • SEND 0010 9320 sends the ANTICOLLISION command
    • +
    • SEND 0012 13DE4A sends (on bit-processing-layer) SOC - 1100 1000 0111 1011 01 - EOC. The remaining bits are discarded. Note that the byte sequence is interpreted as little-endian and the bits are sent in reverse-order, just like defined in the ISO. Note also, that no parity bits are added, since 0x12 is neither 7 nor a multiple of 8.
    • +
    • SEND 0300 52 returns INVALID PARAMETER since the second parameter does not contain 768 bits.
    • +
    +
    Warning
    This command does not deactivate the reader field after finishing in order to make it possible to keep up the conversation with the card.
    +

    SEND_RAW <BYTEVALUE>

    +

    Sends the given byte sequence. The ChameleonMini assumes that the parameter has the parity bits already appended and thus calculates the bit count itself:

      +
    • If the parameter is one byte, the bit count is set to 7, since this seems to be a short frame.
    • +
    • If the parameter is n bytes long, the ChameleonMini sends floor(n * 16 / 9) bits.
    • +
    +

    After sending, the ChameleonMini waits for an answer and returns either

      +
    • NO DATA if no answer could be detected or
    • +
    • the raw received data (including parity bits) and a 2-byte big-endian value indicating the bit count
    • +
    +

    Examples

    +
      +
    • SEND_RAW 52 sends the WUPA command.
    • +
    • SEND_RAW 934100 sends the ANTICOLLISION command as the bit sequence SOC - 1100 1001 1 0000 0100 0 - EOC is sent, which is the same as 0x9320 with parity bits.
    • +
    • SEND_RAW AB2 returns INVALID PARAMETER since the parameter is no byte sequence
    • +
    +
    Warning
    This command does not deactivate the reader field after finishing in order to make it possible to keep up the conversation with the card.
    +

    SEND_RAW <2-BYTEVALUE> <BYTEVALUE>

    +

    Does the same like the command with only one parameter, but the first parameter indicates the to-be-sent bit count.

    +

    Examples

    +
      +
    • SEND_RAW 0007 26 sends the REQA command
    • +
    • SEND_RAW 0012 934100 sends the ANTICOLLISION command
    • +
    • SEND_RAW 0012 934100AB also sends the ANTICOLLISION command, since remaining bits are discarded
    • +
    • SEND_RAW 0300 52 returns INVALID PARAMETER since the second parameter does not contain 768 bits.
    • +
    +
    Warning
    This command does not deactivate the reader field after finishing in order to make it possible to keep up the conversation with the card.
    +

    GETUID

    +

    This is a timeout command. It tries to obtain the UID from a card that is in reader range and returns it.

    +

    If this command is called within the reader configuration, it either ends up returning 101:OK WITH TEXT and the UID or with a timeout (no matter if on setting/configuration change or on real timeout).

    +

    DUMP_MFU

    +

    This is a timeout command. It tries to read the whole content of a MiFare Ultralight card that is in reader range and returns the content.

    +

    If this command is called within the reader configuration, it either ends up returning 101:OK WITH TEXT and the card content in 4 lines (each line contains 16 bytes) or with a timeout (no matter if on setting/configuration change or on real timeout).

    +

    IDENTIFY

    +

    This is a timeout command. Tries to identify the type of a card in reader range and returns the type.

    +

    If this command is called within the reader configuration, it ends in one of three ways:

      +
    1. Return code 101:OK WITH TEXT, the card type and ATQA value, UID value and SAK value of the highest cascade level.
    2. +
    3. Return code 101:OK WITH TEXT, the information that this card type is unknown to the ChameleonMini ("Unknown card.") and ATQA value, UID value and SAK value of the highest cascade level.
    4. +
    5. Timeout (no matter if on setting/configuration change or on real timeout).
    6. +
    +

    AUTOCALIBRATE

    +

    This is a timeout command. Tries to select to a card with every threshold within a range with a specific step size and chooses the best threshold.

    +

    If this command is called within the reader configuration, it ends in one of the following ways:

      +
    1. Return code 101:OK WITH TEXT and a list of the tested thresholds with a + for every threshold where the select protocol was successful and a - if the select protocol was not successfully finished.
    2. +
    3. Timeout (no matter if on setting/configuration change or on real timeout).
    4. +
    +
    Note
    If no working threshold was found, the threshold is reset to the standard threshold.
    +
    + + + + diff --git a/Doc/Doxygen/html/_page__buttons.html b/Doc/Doxygen/html/_page__buttons.html new file mode 100644 index 0000000..6679675 --- /dev/null +++ b/Doc/Doxygen/html/_page__buttons.html @@ -0,0 +1,116 @@ + + + + + + + +Chameleon-Mini: Buttons + + + + + + + + + +
    +
    + + + + + + +
    +
    Chameleon-Mini +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    Buttons
    +
    +
    +

    For user interaction, ChameleonMini provides two configurable push buttons, i.e., LBUTTON on the left side and RBUTTON on the right side of Chameleon. Chameleon distinguishes between

      +
    1. a short (< ~1.28 s) press of the button and
    2. +
    3. a long (≥ ~1.28 s) press of the button.
    4. +
    +

    Thus, there are four different commands for configuring the buttons:

      +
    1. LBUTTON
    2. +
    3. RBUTTON
    4. +
    5. LBUTTON_LONG
    6. +
    7. RBUTTON_LONG
    8. +
    +

    Each of these commands can be used in the getting ("?"), setting ("=") and suggesting ("=?") version.

    +

    Supported Configurations

    +

    The following table describes all currently implemented options for the button configuration.

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Configuration name Description
    NONE No function, the button is disabled
    UID_RANDOM Sets a random UID for the current card slot.
    UID_LEFT_INCREMENT Increments the UID for the current card slot. The UID is interpreted as little-endian.
    UID_RIGHT_INCREMENTIncrements the UID for the current card slot. The UID is interpreted as big-endian.
    UID_LEFT_DECREMENT Decrements the UID for the current card slot. The UID is interpreted as little-endian.
    UID_RIGHT_DECREMENTDecrements the UID for the current card slot. The UID is interpreted as big-endian.
    CYCLE_SETTINGS Cycles through the slots/settings. If the configuration of a slot is set to NONE, this slot is skipped. When the last slot is reached, the next button press selects the first slot, again.
    STORE_MEM Stores the current setting into the permanent Flash memory. Equivalent to the STORE command.
    RECALL_MEM Recalls a setting from the permanent Flash memory. Equivalent to the RECALL command.
    TOGGLE_FIELD Activates the reader field if it was deactivated, deactivates the reader field if it was activated.
    STORE_LOG Writes the current log from SRAM to FRAM and clears the SRAM log. Equivalent to the STORE_LOG command.
    +

    Note the UID commands have no effect when the slot is configured as reader.

    +
    + + + + diff --git a/Doc/Doxygen/html/_page__command_line.html b/Doc/Doxygen/html/_page__command_line.html new file mode 100644 index 0000000..d1dfa6c --- /dev/null +++ b/Doc/Doxygen/html/_page__command_line.html @@ -0,0 +1,278 @@ + + + + + + + +Chameleon-Mini: The Chameleon Command Structure + + + + + + + + + +
    +
    + + + + + + +
    +
    Chameleon-Mini +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    The Chameleon Command Structure
    +
    +
    +

    After plugging in a USB cable, the ChameleonMini enumerates as a virtual serial interface. The settings of the serial interface, e.g. baudrate, stop and parity bits, are ignored by the Chameleon. For a high level of compatibility towards both humans and computers, Chameleon can be set up and controlled by means of a text-based command line interface, which can be accessed by using simple terminal software like hyper-terminal or teraterm. The command line is optimized to cooperate with script languages such as Python or TCL.

    +
    Note
    Before reading this page, you may also wish to have a look at the Chameleon Android App, which is an external contribution to this project. Development and maintenance can be found here (please also ask questions regarding the app there).
    +

    Chameleon Command Structure

    +

    For communicating with the Chameleon via USB, there exist four different syntax types:

      +
    • <COMMAND>=<VALUE> sets a parameter of the Chameleon ('set')
    • +
    • <COMMAND>=? lists all possible values for the parameter ('suggest')
    • +
    • <COMMAND>? returns the current value of a parameter ('get')
    • +
    • <COMMAND> Executes a function with an optional response ('execute')
    • +
    +

    For example, CONFIG=? lists the available types of virtualized cards and other options to configure a slot, while CONFIG=MF_CLASSIC_1K sets the current slot to Mifare Classic 1k emulation. In consequence, CONFIG? will return MF_CLASSIC_1K. Examples for commands executing a function are CLEAR, RESET or UPLOAD.

    +

    The responses of Chameleon indicate whether an action was successful or whether (and why) an error occurred. Examples: In case of an invalid command, the Chameleon replies with 200:UNKNOWN COMMAND. In case of a known command, but a wrong syntax, the Chameleon replies with 201:INVALID COMMAND USAGE.

    +

    Note: Each command has to be followed by a carriage return (CR, 0D hexadecimal). The backspace (08 hexadecimal) and escape (1B hexadecimal) keys are supported. All other control characters of the ASCII character set are ignored. The Chameleon commands are not case-sensitive. There is no echo of entered characters by the Chameleon, thus remember to switch on the 'local echo' in your terminal program.

    +

    Responses

    +

    Subsequent to any command sent, the Chameleon responds with a status number and a corresponding status message, separated by a colon and terminated with a carriage return and line feed (CR+LF, 0D+0A hexadecimal). Status numbers are of a three-digit decimal format with the first digit showing the severity of the answer. Status numbers beginning with a '1' denote an informational item and those beginning with a '2' denote an error.

    + + + + + + + + + + + + + + + + + + + + +
    Response Description
    100:OK The command has been successfully executed
    101:OK WITH TEXT The command has been successfully executed and this response is appended with an additional line of information, terminated with CR+LF
    110:WAITING FOR XMODEM The Chameleon is waiting for an XMODEM connection to be established
    120:FALSE The request is answered with false
    121:TRUE The request is answered with true
    200:UNKNOWN COMMAND This command is unknown to the Chameleon
    201:INVALID COMMAND USAGE This action is not supported by this command
    202:INVALID PARAMETER The format or value of the given parameter value is invalid
    203:TIMEOUT The timeout of the currently active command has expired
    +

    Chameleon Command Set

    +

    The current firmware supports the following global commands.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Command Description
    CHARGING? Returns if the battery is currently being charged (TRUE) or not (FALSE)
    HELP Returns a comma-separated list of all commands supported by the current firmware
    RESET Reboots the Chameleon, i.e., power down and subsequent power-up. Note: A reset usually requires a new Terminal session.
    RSSI? Returns the voltage measured at the antenna of the Chameleon, e.g., to detect the presence of an RF field or compare the field strength of different RFID readers.
    SYSTICK? Returns the system tick value in ms. Note: An overflow occurs every 65,536 ms.
    UPGRADE Sets the Chameleon into firmware upgrade mode (DFU). This command can be used instead of holding the RBUTTON while power-on to trigger the bootloader.
    VERSION? Requests version information of the current firmware
    Button CommandsSee also Buttons
    RBUTTON=? Returns a comma-separated list of supported actions for pressing the right button shortly.
    RBUTTON? Returns the currently set action for pressing the right button shortly. DEFAULT: SETTING_CHANGE
    RBUTTON=<NAME> Sets the action for pressing the right button shortly.
    LBUTTON=? Returns a comma-separated list of supported actions for pressing the left button shortly.
    LBUTTON? Returns the currently set action for pressing the left button shortly. DEFAULT: RECALL_MEM
    LBUTTON=<NAME> Sets the action for pressing the left button shortly.
    RBUTTON_LONG=? Returns a comma-separated list of supported actions for pressing the right button a long time.
    RBUTTON_LONG? Returns the currently set action for pressing the right button a long time. DEFAULT: SETTING_CHANGE
    RBUTTON_LONG=<NAME> Sets the action for pressing the right button a long time.
    LBUTTON_LONG=? Returns a comma-separated list of supported actions for pressing the left button a long time.
    LBUTTON_LONG? Returns the currently set action for pressing the left button a long time. DEFAULT: RECALL_MEM
    LBUTTON_LONG=<NAME> Sets the action for pressing the left button a long time.
    LED Commands See also LED functionality
    LEDGREEN=? Returns a comma-separated list of supported events for illuminating the green LED
    LEDGREEN? Returns the currently set event for lighting the green LED
    LEDGREEN=<NAME> Sets the event for which the green LED is lit. DEFAULT: POWERED
    LEDRED=? Returns a comma-separated list of supported events for illuminating the red LED
    LEDRED? Returns the currently set event for lighting the red LED
    LEDRED=<NAME> Sets the event for which the green LED is lit. DEFAULT: SETTING_CHANGE
    Log Commands See also Log functionality
    LOGMODE=? Returns a comma-separated list of supported log modes
    LOGMODE? Returns the current state of the log mode
    LOGMODE=<NAME> Sets the current log mode. DEFAULT = OFF
    LOGMEM? Returns the remaining free space for logging data to the SRAM (max. 2048 byte)
    LOGDOWNLOAD Waits for an XModem connection and then downloads the binary log - including any log data in FRAM.
    LOGCLEAR Clears the log memory (SRAM and FRAM)
    LOGSTORE Writes the current log from SRAM to FRAM and clears the SRAM log.
    Warning
    If the FRAM is full, currently no error message is shown. If calling LOGMEM? after executing this command returns any other value than the maximum SRAM log size, there was not sufficient space in the FRAM and nothing has been done.
    +
    +

    ChameleonMini provides eight 'slots' that can be configured to store different virtualized cards, or as active NFC reader, or as completely passive device for sniffing purposes. Each slot stores its configuration and, if applicable, card content. To select a particular slot, use the following command (or configure a button accordingly):

    + + + + + + +
    Command Description
    SETTING? Returns the currently activated slot
    SETTING=<NUMBER> Sets the active slot, where <NUMBER> is a number between 1 and 8 (see Settings)
    +

    The following commands have an effect on the currently selected slot only:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Command Description
    CONFIG=? Returns a comma-separated list of all supported configurations
    CONFIG? Returns the configuration of the current slot
    CONFIG=<NAME> Sets the configuration of the surrent slot to <NAME> (See Configurations)
    UIDSIZE? Returns the UID size of the currently selected card type in Byte
    UID? Returns the UID of a card in the current slot
    UID=<UID> Sets a new UID, passed in hexadecimal notation.
    READONLY? Returns the current state of the read-only mode
    READONLY=[0;1] Activates (1) or deactivates (0) the read-only mode (Any writing to the memory is silently ignored)
    MEMSIZE? Returns the memory size occupied by the current configuration in Byte
    UPLOAD Waits for an XModem connection in order to upload a new virtualized card into the currently selected slot, with a size up to the current memory size
    DOWNLOAD Waits for an XModem connection in order to download a virtualized card with the current memory size
    CLEAR Clears the content of the current slot
    STORE Stores the content of the current slot from FRAM into the Flash memory
    RECALL Recalls/restores the content of the current slot from the Flash memory into the FRAM
    TIMEOUT=? Returns the possible number range for timeouts. See also Timeout commands.
    TIMEOUT=<NUMBER> Sets the timeout for the current slot in multiples of 128 ms. If set to zero, there is no timeout. See also Timeout commands.
    TIMEOUT? Returns the timeout for the current slot. See also Timeout commands.
    Reader CommandsUsing these commands only makes sense, if the slot is configured as reader. See also ISO14443A Reader Functionality
    SEND <BYTEVALUE> Adds parity bits, sends the given byte string <BYTEVALUE>, and returns the cards answer
    SEND_RAW <BYTEVALUE>Does NOT add parity bits, sends the given byte string <BYTEVALUE> and returns the cards answer
    GETUID Obtains the UID of a card that is in the range of the antenna and returns it. This command is a Timeout command.
    DUMP_MFU Reads the whole content of a Mifare Ultralight card that is in the range of the antenna and returns it. This command is a Timeout command.
    IDENTIFY Identifies the type of a card in the range of the antenna and returns it. This command is a Timeout command.
    THRESHOLD=? Returns the possible number range for the reader threshold.
    THRESHOLD=<NUMBER> Globally sets the reader threshold. The <NUMBER> influences the reader function and range. Setting a wrong value may result in malfunctioning of the reader. DEFAULT: 400
    THRESHOLD? Returns the current reader threshold.
    AUTOCALIBRATE Automatically finds a good threshold for communicating with the card that currently is on top of the Chameleon. This command is a Timeout command.
    FIELD? Returns whether (1) or not (0) the reader field is active.
    FIELD=[0;1] Enables/disables the reader field.
    +

    Timeout Commands

    +

    Some commands start a process with an unpredictable termination time. In these cases, ChameleonMini waits with its response, until the result of this process is obtained. In order to prevent an infinite waiting time, an individual timeout value can be set for each slot, in multiples of roughly 100 ms up to 60,000 ms. When a timeout occurs or if a respective command is aborted by means of a setting change, the return code 203:TIMEOUT is sent and a command-specific shutdown function is called, which terminates the timeout process gracefully.

    +
    Warning
    Any terminal input is completely ignored during the waiting period.
    +
    +When setting the timeout to zero, there is no timeout and thus a process may continue forever. Such a process can only be terminated by changing the setting, if a button is configured accordingly, or by restarting the ChameleonMini (power off, power on).
    +

    Accessing the command-line using a terminal software

    +

    In order to have quick access to the Chameleon's command-line without using any complicated software, we suggest using the TeraTerm terminal emulation software available for windows based operating systems.

    +

    Connecting and setting up

    +

    For establishing a connection to the Chameleon's command line, select File -> New Connection, choose the virtual serial port of the Chameleon and hit the "OK" button. TeraTerm now tries to open the serial port and should succeed without any error.

    +

    For easier use of the command-line using a terminal software the local-echo functionality should be activated, to be able to see what is typed into the chameleon. When using TeraTerm, this can be achieved by selecting Setup -> Terminal and check "Local Echo".

    +

    Uploading and Downloading dump files

    +

    In some configurations of the Chameleon, it is necessary to upload a card dump before it can be accessed by a reader. For doing so, the relatively simple and widely known XMODEM protocol is used.

    +

    To upload a dump file using TeraTerm, follow these steps.

      +
    1. Enter UPLOAD and wait for the 110:WAITING FOR XMODEM response
    2. +
    3. Select File -> Transfer -> XMODEM -> Send
    4. +
    5. In the dialog choose the binary dumpfile to be uploaded and make sure the option "Checksum" is checked in the lower left corner
    6. +
    7. Hitting the "Open" button will start the transfer. If no error is given to the user, the file has been uploaded sucessfully.
    8. +
    +

    To download the Chameleon's memory again, follow the instructions above except for using DOWNLOAD instead of UPLOAD and the Receive function of TeraTerm

    +

    Note that there is a 10 second timeout after entering UPLOAD respectively DOWNLOAD after which the standard command-line is activated again. So try again if the timeout is already over when the XMODEM transfer is about to start.

    +
    + + + + diff --git a/Doc/Doxygen/html/_page__configurations.html b/Doc/Doxygen/html/_page__configurations.html new file mode 100644 index 0000000..55f921c --- /dev/null +++ b/Doc/Doxygen/html/_page__configurations.html @@ -0,0 +1,112 @@ + + + + + + + +Chameleon-Mini: Configurations + + + + + + + + + +
    +
    + + + + + + +
    +
    Chameleon-Mini +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    Configurations
    +
    +
    +

    Each setting of the Chameleon-Mini has an active configuration, which defines the behavior of the Chameleon-Mini. A detailed description of what defines a configuration can be found at ConfigurationType.

    +

    Supported Codecs

    +

    A Configuration basically is defined by the codec it uses and by the application functions that use this codec. Currently there are two different codecs implemented:

      +
    1. The ISO14443A codec for emulation.
    2. +
    3. The ISO14443A codec for the reader function.
    4. +
    +

    Supported Configurations

    +

    The following table shows which configurations are available currently.

    + + + + + + + + + + + + + + + + + + +
    Configuration name Codec Description
    NONE None No functionality, Chameleon-Mini does nothing, the current setting is skipped when cycling through the settings
    MF_ULTRALIGHT ISO14443A emulation Emulates a MiFare Ultralight card
    MF_CLASSIC_1K ISO14443A emulation Emulates a MiFare Classic 1k card
    MF_CLASSIC_4K ISO14443A emulation Emulates a MiFare Classic 4k card
    MF_CLASSIC_1K_7B ISO14443A emulation Emulates a MiFare Classic 1k card with 7-byte UID.
    MF_CLASSIC_4K_7B ISO14443A emulation Emulates a MiFare Classic 4k card with 7-byte UID.
    ISO14443A_SNIFF ISO14443A emulation Currently incomplete. Sniffs ISO14443A communication between a reader and a card.
    ISO14443A_READER ISO14443A reader The Chameleon-Mini works as a reader and can process different procedures in order to obtain a cards UID etc.
    +

    Configuration Changing procedure

    +

    When the configuration is changed, no matter whether by command line or during a setting change, the following steps are done:

      +
    1. The codec deinitialization function of the currently active configuration is called.
    2. +
    3. Possibly pending timeout commands are aborted.
    4. +
    5. The configuration struct (ConfigurationType) for the currently active configuration is overwritten with the new configuration struct.
    6. +
    7. The codec initialization function of the new configuration is called.
    8. +
    9. The application initialization function of the new configuration is called.
    10. +
    +
    + + + + diff --git a/Doc/Doxygen/html/_page__getting_started.html b/Doc/Doxygen/html/_page__getting_started.html new file mode 100644 index 0000000..1759cfe --- /dev/null +++ b/Doc/Doxygen/html/_page__getting_started.html @@ -0,0 +1,104 @@ + + + + + + + +Chameleon-Mini: Getting Started + + + + + + + + + +
    +
    + + + + + + +
    +
    Chameleon-Mini +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    Getting Started
    +
    +
    +

    Finally, you hold your brand-new ChameleonMini RevG in your hands! What to do now?! In the factory, a test firmware including a USB bootloader has been programmed into the microcontroller of the Chameleon. This page describes the next steps in order to upload the current firmware, as developed in this project, via the USB bootloader. After having done that, you may want to have a look at the The Chameleon Command Structure page or explore the Chameleon Android App, which is an external contribution to this project. Development and maintenance can be found here (please also ask questions regarding the app there).

    +

    Step 1: Trigger the USB Bootloader

    +

    The bootloader can be executed in two different ways:

      +
    1. Make sure the Chameleon is switched off (power switch on the side is in the position OFF). Now, hold down the right button (RBUTTON) and keep it pressed while connecting the Chameleon to a PC via a USB cable.
    2. +
    3. OR: Plug your Chameleon via USB to a PC and use your favorite terminal application to connect with the test firmware of the ChameleonMini. Type upgrade and hit Enter.
    4. +
    +

    In either way, the ChameleonMini now jumps to the bootloader and waits patiently for a firmware upgrade.

    +

    Step 2: Upgrade the Firmware

    +

    Once the ChameleonMini is in the bootloader, you can flash a new firmware, i.e., the files Chameleon-Mini.hex and the Chameleon-Mini.eep, into the microcontroller. The source code directory contains these files precompiled but you can of course also compile the code yourself. Create a new folder and copy the two files into it. The following depends on your operating system:

    +

    Upgrade Procedure for Linux Users

    +

    In order to upgrade the firmware under Linux you first have to install avrdude, e.g. under Ubuntu with the command sudo apt-get install avra avrdude. Then change to the directory where you have saved the hex and eep files and run sudo avrdude -c flip2 -p ATXMega128A4U -B 60 -P usb -U application:w:Chameleon-Mini.hex:i -U eeprom:w:Chameleon-Mini.eep:i.

    +

    You also can use sudo make program in the source code directory, which basically does the same.

    +

    After running this command you need to restart your Chameleon, e.g. by reattaching the Chameleon to the PC.

    +
    Note
    If you are using Ubuntu 14.04, avrdude may not support flip2. In this case, you can run add-apt-repository ppa:pmjdebruijn/avrdude-release, then apt-get update and finally apt-get install avrdude to upgrade to a version of avrdude that supports flip2.
    +

    Optionally copy Drivers/98-ChameleonMini.rules to /etc/udev/rules.d/, to allow non-root users to open the chameleon serial port at /dev/chameleon. sudo cp (Path to Chameleon Repo)/Drivers/98-ChameleonMini.rules /etc/udev/rules.d/ Remember to restart the udev daemon, or reboot to activate the rule. 'sudo udevadm control –reload'

    +

    Upgrade Procedure for Mac OS Users

    +

    When running Homebrew you can install avrdude with brew install avrdude. After this, change to the directory where you have saved the hex and eep files and run sudo avrdude -c flip2 -p ATXMega128A4U -B 60 -P usb -U application:w:Chameleon-Mini.hex:i -U eeprom:w:Chameleon-Mini.eep:i.

    +

    Upgrade Procedure for Windows Users

    +

    For upgrading the firmware under Windows please

      +
    1. download https://sourceforge.net/projects/dfu-programmer/files/dfu-programmer/0.7.2/dfu-programmer-win-0.7.2.zip/download and extract to an arbitrary directory. Make sure to use the DFU programmer Version 0.7.2!
    2. +
    3. Go to the extraction directory and then open the folder dfu-prog-usb-1.2.2. Install the atmel_usb_dfu.inf driver (right click -> install).
    4. +
    5. Copy dfu-programmer.exe from the extraction directory to the directory where you have saved the hex and eep files.
    6. +
    7. Save the ChameleonFirmwareUpgrade.bat in the same directory as the hex and eep files.
    8. +
    9. Run the ChameleonFirmwareUpgrade.bat as Administrator (right click -> run as Administrator) and wait for the firmware upgrade to terminate. Upon success, the green LED of the ChameleonMini should light up.
    10. +
    +

    Finally, install the driver for Chameleon: Download both ChameleonDriver.inf and ChameleonDriver.cat from the Drivers directory and install the INF file (right click -> install).

    Note
    If you have problems with the driver installation, try the instructions in sections 6.2.1 and 6.2.2 from this Atmel document.
    +

    Now, Chameleon should appear in the Windows device manager and you should be able to open a terminal program such as TeraTerm and connect to the Chameleon-Mini via the COM port shown in the device manager. On Mac or Linux you can use screen (screen /dev/tty.usbmodem1421, please replace your device path with the appropriate one) to communicate with your Chameleon. Further information about how to "talk" to the Chameleon can be found here: The Chameleon Command Structure.

    +
    + + + + diff --git a/Doc/Doxygen/html/_page__l_e_d.html b/Doc/Doxygen/html/_page__l_e_d.html new file mode 100644 index 0000000..6ed25e4 --- /dev/null +++ b/Doc/Doxygen/html/_page__l_e_d.html @@ -0,0 +1,100 @@ + + + + + + + +Chameleon-Mini: LED functionality + + + + + + + + + +
    +
    + + + + + + +
    +
    Chameleon-Mini +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    +
    +
    LED functionality
    +
    +
    +

    The Chameleon-Mini has two fully configurable LEDs: one red LED and one green LED. The configuration is done with the commands LEDRED and LEDGREEN, which both can be called as the getting ("?"), setting ("=") and suggesting ("=?") version.

    +

    The following table shows which LED functions are currently available.

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Function name Description
    NONE No function, the LED is deactivated.
    POWERED The LED lights up if the Chameleon-Mini is powered, regardless whether powered by USB or by battery.
    TERMINAL_CONN The LED is turned on when the Chameleon-Mini is connected via USB and is turned off when no USB connection is established.
    TERMINAL_RXTX The according LED blinks shortly when sending or receiving data via the USB interface.
    SETTING_CHANGE The LED blinks one time if the new setting is setting 1, two times for setting 2, ..., eight times for setting 8.
    MEMORY_STORED The LED flashes everytime when a setting is stored to the permanent flash. This is currently the case when calling the command STORE, the button event STORE_MEM occurs or the setting is changed.
    MEMORY_CHANGED The LED turns on when the FRAM is changed and is turned off when the currently active setting is written to the permanent flash. Thus, this function indicates when the current setting is changed.
    CODEC_RX The LED flashes when the currently active codec (e.g. ISO14443A emulation) receives data. Note that this is implemented on codec layer and the flashing is triggered before the received data are interpreted by the application.
    CODEC_TX The LED flashes when the currently active codec sends data. This function also is implemented on codec layer.
    FIELD_DETECTED The LED is turned on if and only if a reader field is detected, which is recognized by the RSSI module (when the RSSI value hits a hardcoded threshold, it is assumed that there is a reader field). It is irrelevant whether the field comes from another reader or from the Chameleon-Mini itself.
    LOGMEM_FULL Lights up the LED, if the SRAM log memory is full.
    +
    + + + + diff --git a/Doc/Doxygen/html/_page__l_e_ds.html b/Doc/Doxygen/html/_page__l_e_ds.html new file mode 100644 index 0000000..9f476e9 --- /dev/null +++ b/Doc/Doxygen/html/_page__l_e_ds.html @@ -0,0 +1,104 @@ + + + + + + + +Chameleon-Mini: LED functionality + + + + + + + + + +
    +
    + + + + + + +
    +
    Chameleon-Mini +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    LED functionality
    +
    +
    +

    For giving user feedback, ChameleonMini provides two LEDs that can be configured to indicate various conditions, events, or internal state changes of ChameleonMini: a red LED and a green LED. Their individual configuration is controlled with the commands LEDRED and LEDGREEN, which can be called in the getting ("?"), setting ("=") and suggesting ("=?") variants.

    +

    The following table shows the currently supported LED functions.

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Condition/Event Description
    NONE Nothing happens, the LED remains dark.
    POWERED The LED lights up, if the ChameleonMini is powered by USB or by battery.
    TERMINAL_CONN The LED is turned on when the ChameleonMini is connected via USB and is turned off when no USB connection is established.
    TERMINAL_RXTX The LED blinks shortly when sending or receiving data via the USB interface.
    SETTING_CHANGE The LED blinks one time if the new setting is setting 1, two times for setting 2, ..., eight times for setting 8.
    MEMORY_STORED The LED flashes everytime when a setting is stored to the permanent flash. This is currently the case when calling the command STORE, the button event STORE_MEM occurs or the setting is changed.
    MEMORY_CHANGED The LED turns on when the content of the FRAM has been modified and is turned off when the currently active setting is written to the permanent Flash memory. Thus, this function indicates when the current content has been changed.
    CODEC_RX The LED flashes when the currently active codec (e.g. ISO14443A emulation) receives data via the RFID interface. Note that this is implemented on the codec layer and the flashing is triggered before the received data is interpreted by the application.
    CODEC_TX The LED flashes when the currently active codec sends data via the RFID interface. This function is also implemented on the codec layer.
    FIELD_DETECTED The LED is turned on, if a reader field is detected via the RSSI module (when the RSSI value hits a hardcoded threshold, it is assumed that there is a reader field). It is irrelevant whether the field comes from another reader or from the ChameleonMini itself.
    LOGMEM_FULL Lights up the LED, if the SRAM log memory is full.
    +
    + + + + diff --git a/Doc/Doxygen/html/_page__log.html b/Doc/Doxygen/html/_page__log.html new file mode 100644 index 0000000..2423668 --- /dev/null +++ b/Doc/Doxygen/html/_page__log.html @@ -0,0 +1,103 @@ + + + + + + + +Chameleon-Mini: Log functionality + + + + + + + + + +
    +
    + + + + + + +
    +
    Chameleon-Mini +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    Log functionality
    +
    +
    +

    The ChameleonMini provides a configurable log functionality. This page describes how to use it.

    +

    Log Entry Format

    +

    The log entries use a TLV (Type Length Value)-like format:

    + + + + + + + + + + +
    Name Size Description
    Entry type 1 byte See LogEntryEnum
    Data length 1 byte This is the length of the appended data.
    Timestamp 2 bytes This is the current systick value.
    Data Data length bytes It is also possible that no data is appended, then the Data length field is zero.
    +

    Entry Types

    +

    See LogEntryEnum.

    +

    Log Modes

    +

    Currently there exist three log modes:

      +
    • OFF, which means that nothing is logged.
    • +
    • LIVE, which means that log events are written directly to the terminal (untested).
    • +
    • MEMORY, where the log events are written to SRAM.
    • +
    +
    Note
    If there is not enough log memory, the log mode is automatically set to OFF.
    +
    Warning
    Since the MEMORY log mode writes to SRAM, the log memory is cleared by power off or restarting the Chameleon.
    +

    Related Commands, Button event and LED functions

    +

    There are various commands to configure the log functionality. See Page Command Line. Equivalently to the LOGSTORE command, the buttons are configurable to STORE_LOG, which does the same. Also, there exists a LOGMEM_FULL function for the LEDs, which lights up the LED if the SRAM log memory is full. See also the Pages Buttons and LED functionality. The 'chamlog' Python script in the project (Software folder) automatizes the process of downloading the binary log data, e.g., sending the following command under Windows with a ChameleonMini connected on port COM6 results in downloading the binary log file, clearing the log memory, and setting the log mode to MEMORY: chamlog -p COM6 -c -m MEMORY -v. Repeatedly executing this command always outputs the recently logged commands in user-readable form. Make sure that no other program, e.g., terminal software, is blocking the serial port.

    +
    + + + + diff --git a/Doc/Doxygen/html/_page__settings.html b/Doc/Doxygen/html/_page__settings.html new file mode 100644 index 0000000..fca5b83 --- /dev/null +++ b/Doc/Doxygen/html/_page__settings.html @@ -0,0 +1,91 @@ + + + + + + + +Chameleon-Mini: Settings + + + + + + + + + +
    +
    + + + + + + +
    +
    Chameleon-Mini +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    Settings
    +
    +
    +

    The ChameleonMini can act in different ways, the behavior is defined by configurations. But also, the ChameleonMini has slots, which are a layer above the configurations. With the slots, it is possible to switch between different configurations and respective content, e.g., a card dump together with the configuration as Mifare Classic 1k card.

    +

    Properties

    +

    A slot is defined by settings: SettingsEntryType.

    +

    Slot Changing Procedure

    +

    When the current slot is changed, the following procedure is applied:

      +
    1. Break potentially pending timeout commands.
    2. +
    3. Store the memory of the setting to the Flash.
    4. +
    5. Set the slot number of the currently active slot to the number of the new slot.
    6. +
    7. Set the slot pointer of the currently active slot to the pointer of the new slot.
    8. +
    9. Since the slot also contains the configuration, apply the configuration changing procedure with the new configuration for the new slot.
    10. +
    11. Log the slot change.
    12. +
    13. Recall the new content of the slot from the permanent Flash.
    14. +
    15. Signalize the slot change with an LED, if an LED is configured to SETTING_CHANGE.
    16. +
    +
    + + + + diff --git a/Doc/Doxygen/html/_page__uploading_downloading.html b/Doc/Doxygen/html/_page__uploading_downloading.html new file mode 100644 index 0000000..9a72625 --- /dev/null +++ b/Doc/Doxygen/html/_page__uploading_downloading.html @@ -0,0 +1,82 @@ + + + + + + + +Chameleon-Mini: Uploading and Downloading Memory dumps + + + + + + + + + +
    +
    + + + + + + +
    +
    Chameleon-Mini +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    Uploading and Downloading Memory dumps
    +
    +
    +

    In order to be able to emulate different cards, one can upload or download the content used for the emulation.

    +

    The layout of the memory dump depends on the chosen configuration and is usually the same as the memory layout of the currently chosen card emulation. The size of the memory dump also depends on the currently chosen configuration and can be requested with a specific command on the command-line.

    +

    In order to upload or download a memory dump, the user has to send the corresponding command on the command-line first and the Chameleon responds with a status message indicating that it is waiting for an X-MODEM connection. Depending on whether upload or download is chosen, the Chameleon then waits for 10 seconds to initiate an X-MODEM receive or send connection.

    +

    When waiting for a receiving X-MODEM connection, the X-MODEM NAK byte is sent upto 20 times with a delay of 500ms in order to establish a standard 128 byte frame-size X-MODEM connection with the simple checksum scheme. Within this time, the user has to get his X-MODEM client ready and choose the binary file to be uploaded into the memory.

    +

    In case of waiting for an X-MODEM send connection to establish, a wait time of 10 seconds is performed to receive the X-MODEM NAK byte. Within this time, the user has to start the X-MODEM receiver and set it to the standard 128 byte frame using the simple checksum scheme in order to receive the binary memory dump.

    +
    + + + + From e53b0a067d6ba48906a973d984167b4844a4741a Mon Sep 17 00:00:00 2001 From: Georg Date: Wed, 17 Jan 2018 21:06:28 +0100 Subject: [PATCH 046/104] doxygen update --- Doc/Doxygen/html/Page_14443AReader.html | 175 ----------- Doc/Doxygen/html/Page_Buttons.html | 133 -------- Doc/Doxygen/html/Page_CommandLine.html | 294 ------------------ Doc/Doxygen/html/Page_Configurations.html | 129 -------- Doc/Doxygen/html/Page_GettingStarted.html | 121 ------- Doc/Doxygen/html/Page_LED.html | 117 ------- Doc/Doxygen/html/Page_LEDs.html | 121 ------- Doc/Doxygen/html/Page_Log.html | 120 ------- Doc/Doxygen/html/Page_Settings.html | 108 ------- .../html/Page_UploadingDownloading.html | 99 ------ .../html/_antenna_level_8h_source.html | 2 +- Doc/Doxygen/html/_application_8h_source.html | 2 +- Doc/Doxygen/html/_battery_8h_source.html | 2 +- Doc/Doxygen/html/_button_8h_source.html | 2 +- Doc/Doxygen/html/_buttons_8txt.html | 2 +- .../html/_chameleon-_mini_8h_source.html | 2 +- Doc/Doxygen/html/_codec_8h_source.html | 2 +- Doc/Doxygen/html/_command_line_8h_source.html | 2 +- Doc/Doxygen/html/_command_line_8txt.html | 2 +- Doc/Doxygen/html/_commands_8h_source.html | 2 +- Doc/Doxygen/html/_common_8h_source.html | 2 +- Doc/Doxygen/html/_configuration_8h.html | 2 +- .../html/_configuration_8h_source.html | 2 +- Doc/Doxygen/html/_configurations_8txt.html | 2 +- Doc/Doxygen/html/_crypto1_8h_source.html | 2 +- Doc/Doxygen/html/_getting_started_8txt.html | 2 +- .../html/_i_s_o14443-2_a_8h_source.html | 2 +- .../html/_i_s_o14443-3_a_8h_source.html | 2 +- Doc/Doxygen/html/_l_e_d_8h_source.html | 2 +- Doc/Doxygen/html/_l_e_d_8txt.html | 2 +- Doc/Doxygen/html/_l_e_d_hook_8h_source.html | 2 +- Doc/Doxygen/html/_l_e_ds_8txt.html | 2 +- Doc/Doxygen/html/_l_u_f_a_config_8h.html | 2 +- .../html/_l_u_f_a_config_8h_source.html | 2 +- Doc/Doxygen/html/_l_u_f_a_descriptors_8c.html | 2 +- Doc/Doxygen/html/_l_u_f_a_descriptors_8h.html | 2 +- .../html/_l_u_f_a_descriptors_8h_source.html | 2 +- Doc/Doxygen/html/_log_8h.html | 2 +- Doc/Doxygen/html/_log_8h_source.html | 2 +- Doc/Doxygen/html/_log_8txt.html | 2 +- Doc/Doxygen/html/_main_page_8txt.html | 2 +- Doc/Doxygen/html/_map_8h_source.html | 2 +- Doc/Doxygen/html/_memory_8h_source.html | 2 +- .../html/_mifare_classic_8h_source.html | 2 +- .../html/_mifare_ultralight_8h_source.html | 2 +- Doc/Doxygen/html/_page_14443_a_reader.html | 2 +- Doc/Doxygen/html/_page__buttons.html | 2 +- Doc/Doxygen/html/_page__command_line.html | 2 +- Doc/Doxygen/html/_page__configurations.html | 2 +- Doc/Doxygen/html/_page__getting_started.html | 2 +- Doc/Doxygen/html/_page__l_e_d.html | 2 +- Doc/Doxygen/html/_page__l_e_ds.html | 2 +- Doc/Doxygen/html/_page__log.html | 2 +- Doc/Doxygen/html/_page__settings.html | 2 +- .../html/_page__uploading_downloading.html | 2 +- Doc/Doxygen/html/_random_8h_source.html | 2 +- .../html/_reader14443-2_a_8h_source.html | 2 +- .../html/_reader14443_a_8h_source.html | 2 +- Doc/Doxygen/html/_reader_8txt.html | 2 +- Doc/Doxygen/html/_settings_8h.html | 2 +- Doc/Doxygen/html/_settings_8h_source.html | 2 +- Doc/Doxygen/html/_settings_8txt.html | 2 +- Doc/Doxygen/html/_system_8h_source.html | 2 +- Doc/Doxygen/html/_terminal_8h_source.html | 2 +- .../html/_uploading_downloading_8txt.html | 2 +- Doc/Doxygen/html/_x_modem_8h_source.html | 2 +- Doc/Doxygen/html/annotated.html | 2 +- Doc/Doxygen/html/arrowdown.png | Bin 246 -> 0 bytes Doc/Doxygen/html/arrowright.png | Bin 229 -> 0 bytes Doc/Doxygen/html/classes.html | 2 +- .../dir_5de29d499bb29a41092979d00d22c134.html | 2 +- .../dir_74b6a3b63f61c160c0f14b7a283a4c9b.html | 2 +- .../dir_8465ec698d237f801ae9966d4551fcfa.html | 2 +- .../dir_ddeffaa734f77525428b0dd4068da9cb.html | 2 +- .../dir_f5aab302412c0352d69464400cc5ee44.html | 2 +- Doc/Doxygen/html/files.html | 2 +- Doc/Doxygen/html/functions.html | 2 +- Doc/Doxygen/html/functions_vars.html | 2 +- Doc/Doxygen/html/globals.html | 2 +- Doc/Doxygen/html/globals_defs.html | 2 +- Doc/Doxygen/html/globals_enum.html | 2 +- Doc/Doxygen/html/globals_eval.html | 2 +- Doc/Doxygen/html/globals_func.html | 2 +- Doc/Doxygen/html/globals_vars.html | 2 +- Doc/Doxygen/html/index.html | 2 +- Doc/Doxygen/html/menu.js | 26 ++ Doc/Doxygen/html/menudata.js | 23 ++ Doc/Doxygen/html/pages.html | 2 +- .../struct_configuration_type-members.html | 2 +- .../html/struct_configuration_type.html | 2 +- .../struct_settings_entry_type-members.html | 2 +- .../html/struct_settings_entry_type.html | 2 +- ...descriptor___configuration__t-members.html | 2 +- ...u_s_b___descriptor___configuration__t.html | 2 +- 94 files changed, 129 insertions(+), 1497 deletions(-) delete mode 100644 Doc/Doxygen/html/Page_14443AReader.html delete mode 100644 Doc/Doxygen/html/Page_Buttons.html delete mode 100644 Doc/Doxygen/html/Page_CommandLine.html delete mode 100644 Doc/Doxygen/html/Page_Configurations.html delete mode 100644 Doc/Doxygen/html/Page_GettingStarted.html delete mode 100644 Doc/Doxygen/html/Page_LED.html delete mode 100644 Doc/Doxygen/html/Page_LEDs.html delete mode 100644 Doc/Doxygen/html/Page_Log.html delete mode 100644 Doc/Doxygen/html/Page_Settings.html delete mode 100644 Doc/Doxygen/html/Page_UploadingDownloading.html delete mode 100644 Doc/Doxygen/html/arrowdown.png delete mode 100644 Doc/Doxygen/html/arrowright.png create mode 100644 Doc/Doxygen/html/menu.js create mode 100644 Doc/Doxygen/html/menudata.js diff --git a/Doc/Doxygen/html/Page_14443AReader.html b/Doc/Doxygen/html/Page_14443AReader.html deleted file mode 100644 index 8152b5c..0000000 --- a/Doc/Doxygen/html/Page_14443AReader.html +++ /dev/null @@ -1,175 +0,0 @@ - - - - - - -Chameleon-Mini: ISO14443A Reader Functionality - - - - - - - - - - -
    -
    - - - - - - -
    -
    Chameleon-Mini -
    -
    -
    - - - - - -
    -
    - - -
    - -
    - - -
    -
    -
    -
    ISO14443A Reader Functionality
    -
    -
    -

    The ChameleonMini is able to act as an ISO 14443A reader. This page describes how to use this configuration (See Configurations) correctly.

    -

    Supported Commands

    -

    Using the ISO 14443A reader configuration enables the usage of some commands that are only available within this configuration.

    -
    Note
    Technically, the SEND and SEND_RAW commands are also timeout commands, but they end successfully (either with NO DATA or the response) nearly immediately on every call.
    -
    -Each of the following commands returns INVALID COMMAND USAGE on a non-reader configuration.
    -
    Warning
    The reader field is only turned on if this is necessary. Some commands deactivate the reader field after they are done, some do not deactivate the reader field after finishing. Please be aware, that the reader field takes a massive amount of energy and thus the voltage of the battery can drop to a critical level fastly. If not mentioned differently, all of the commands below deactivate the reader field after work.
    -

    SEND <BYTEVALUE>

    -

    There are two cases what is done, depending on the parameter:

      -
    1. If the parameter is one byte, no parity bits are added, since this must be a short frame command. In this case the seven least significant bits are sent.
    2. -
    3. If the parameter consists of more than one byte, parity bits are added and afterwards the whole sequence is sent.
    4. -
    -

    After sending, the ChameleonMini waits for an answer and returns either

      -
    • NO DATA if no answer could be detected or
    • -
    • the received data with removed parity bits, a 2-byte big-endian value indicating the bit count and either the string PARITY OK or PARITY ERR indicating whether the parity check failed or not.
    • -
    -

    In each case, the ChameleonMini code 101:OK WITH TEXT is returned.

    -

    Examples

    -
      -
    • SEND 52 sends the WUPA command
    • -
    • SEND 9320 sends the ANTICOLLISION command
    • -
    • SEND AB2 returns INVALID PARAMETER since the parameter is no byte sequence
    • -
    -
    Warning
    This command does not deactivate the reader field after finishing in order to make it possible to keep up the conversation with the card.
    -

    SEND <2-BYTEVALUE> <BYTEVALUE>

    -

    Does the same like the command with only one parameter, but the first parameter indicates the to-be-sent bit count.

    -
    Warning
    If the bit count parameter is neither 7 or a multiple of 8, no parity bits will be appended, but the remaining functionality is the exact same!
    -

    Examples

    -
      -
    • SEND 0007 26 sends the REQA command
    • -
    • SEND 0010 9320 sends the ANTICOLLISION command
    • -
    • SEND 0012 13DE4A sends (on bit-processing-layer) SOC - 1100 1000 0111 1011 01 - EOC. The remaining bits are discarded. Note that the byte sequence is interpreted as little-endian and the bits are sent in reverse-order, just like defined in the ISO. Note also, that no parity bits are added, since 0x12 is neither 7 nor a multiple of 8.
    • -
    • SEND 0300 52 returns INVALID PARAMETER since the second parameter does not contain 768 bits.
    • -
    -
    Warning
    This command does not deactivate the reader field after finishing in order to make it possible to keep up the conversation with the card.
    -

    SEND_RAW <BYTEVALUE>

    -

    Sends the given byte sequence. The ChameleonMini assumes that the parameter has the parity bits already appended and thus calculates the bit count itself:

      -
    • If the parameter is one byte, the bit count is set to 7, since this seems to be a short frame.
    • -
    • If the parameter is n bytes long, the ChameleonMini sends floor(n * 16 / 9) bits.
    • -
    -

    After sending, the ChameleonMini waits for an answer and returns either

      -
    • NO DATA if no answer could be detected or
    • -
    • the raw received data (including parity bits) and a 2-byte big-endian value indicating the bit count
    • -
    -

    Examples

    -
      -
    • SEND_RAW 52 sends the WUPA command.
    • -
    • SEND_RAW 934100 sends the ANTICOLLISION command as the bit sequence SOC - 1100 1001 1 0000 0100 0 - EOC is sent, which is the same as 0x9320 with parity bits.
    • -
    • SEND_RAW AB2 returns INVALID PARAMETER since the parameter is no byte sequence
    • -
    -
    Warning
    This command does not deactivate the reader field after finishing in order to make it possible to keep up the conversation with the card.
    -

    SEND_RAW <2-BYTEVALUE> <BYTEVALUE>

    -

    Does the same like the command with only one parameter, but the first parameter indicates the to-be-sent bit count.

    -

    Examples

    -
      -
    • SEND_RAW 0007 26 sends the REQA command
    • -
    • SEND_RAW 0012 934100 sends the ANTICOLLISION command
    • -
    • SEND_RAW 0012 934100AB also sends the ANTICOLLISION command, since remaining bits are discarded
    • -
    • SEND_RAW 0300 52 returns INVALID PARAMETER since the second parameter does not contain 768 bits.
    • -
    -
    Warning
    This command does not deactivate the reader field after finishing in order to make it possible to keep up the conversation with the card.
    -

    GETUID

    -

    This is a timeout command. It tries to obtain the UID from a card that is in reader range and returns it.

    -

    If this command is called within the reader configuration, it either ends up returning 101:OK WITH TEXT and the UID or with a timeout (no matter if on setting/configuration change or on real timeout).

    -

    DUMP_MFU

    -

    This is a timeout command. It tries to read the whole content of a MiFare Ultralight card that is in reader range and returns the content.

    -

    If this command is called within the reader configuration, it either ends up returning 101:OK WITH TEXT and the card content in 4 lines (each line contains 16 bytes) or with a timeout (no matter if on setting/configuration change or on real timeout).

    -

    IDENTIFY

    -

    This is a timeout command. Tries to identify the type of a card in reader range and returns the type.

    -

    If this command is called within the reader configuration, it ends in one of three ways:

      -
    1. Return code 101:OK WITH TEXT, the card type and ATQA value, UID value and SAK value of the highest cascade level.
    2. -
    3. Return code 101:OK WITH TEXT, the information that this card type is unknown to the ChameleonMini ("Unknown card.") and ATQA value, UID value and SAK value of the highest cascade level.
    4. -
    5. Timeout (no matter if on setting/configuration change or on real timeout).
    6. -
    -

    AUTOCALIBRATE

    -

    This is a timeout command. Tries to select to a card with every threshold within a range with a specific step size and chooses the best threshold.

    -

    If this command is called within the reader configuration, it ends in one of the following ways:

      -
    1. Return code 101:OK WITH TEXT and a list of the tested thresholds with a + for every threshold where the select protocol was successful and a - if the select protocol was not successfully finished.
    2. -
    3. Timeout (no matter if on setting/configuration change or on real timeout).
    4. -
    -
    Note
    If no working threshold was found, the threshold is reset to the standard threshold.
    -
    - - - - diff --git a/Doc/Doxygen/html/Page_Buttons.html b/Doc/Doxygen/html/Page_Buttons.html deleted file mode 100644 index 07ee3b8..0000000 --- a/Doc/Doxygen/html/Page_Buttons.html +++ /dev/null @@ -1,133 +0,0 @@ - - - - - - -Chameleon-Mini: Buttons - - - - - - - - - - -
    -
    - - - - - - -
    -
    Chameleon-Mini -
    -
    -
    - - - - - -
    -
    - - -
    - -
    - - -
    -
    -
    -
    Buttons
    -
    -
    -

    For user interaction, ChameleonMini provides two configurable push buttons, i.e., LBUTTON on the left side and RBUTTON on the right side of Chameleon. Chameleon distinguishes between

      -
    1. a short (< ~1.28 s) press of the button and
    2. -
    3. a long (≥ ~1.28 s) press of the button.
    4. -
    -

    Thus, there are four different commands for configuring the buttons:

      -
    1. LBUTTON
    2. -
    3. RBUTTON
    4. -
    5. LBUTTON_LONG
    6. -
    7. RBUTTON_LONG
    8. -
    -

    Each of these commands can be used in the getting ("?"), setting ("=") and suggesting ("=?") version.

    -

    Supported Configurations

    -

    The following table describes all currently implemented options for the button configuration.

    - - - - - - - - - - - - - - - - - - - - - - - - -
    Configuration name Description
    NONE No function, the button is disabled
    UID_RANDOM Sets a random UID for the current card slot.
    UID_LEFT_INCREMENT Increments the UID for the current card slot. The UID is interpreted as little-endian.
    UID_RIGHT_INCREMENTIncrements the UID for the current card slot. The UID is interpreted as big-endian.
    UID_LEFT_DECREMENT Decrements the UID for the current card slot. The UID is interpreted as little-endian.
    UID_RIGHT_DECREMENTDecrements the UID for the current card slot. The UID is interpreted as big-endian.
    CYCLE_SETTINGS Cycles through the slots/settings. If the configuration of a slot is set to NONE, this slot is skipped. When the last slot is reached, the next button press selects the first slot, again.
    STORE_MEM Stores the current setting into the permanent Flash memory. Equivalent to the STORE command.
    RECALL_MEM Recalls a setting from the permanent Flash memory. Equivalent to the RECALL command.
    TOGGLE_FIELD Activates the reader field if it was deactivated, deactivates the reader field if it was activated.
    STORE_LOG Writes the current log from SRAM to FRAM and clears the SRAM log. Equivalent to the STORE_LOG command.
    -

    Note the UID commands have no effect when the slot is configured as reader.

    -
    - - - - diff --git a/Doc/Doxygen/html/Page_CommandLine.html b/Doc/Doxygen/html/Page_CommandLine.html deleted file mode 100644 index c5547f0..0000000 --- a/Doc/Doxygen/html/Page_CommandLine.html +++ /dev/null @@ -1,294 +0,0 @@ - - - - - - -Chameleon-Mini: The Chameleon Command Structure - - - - - - - - - - -
    -
    - - - - - - -
    -
    Chameleon-Mini -
    -
    -
    - - - - - -
    -
    - - -
    - -
    - - -
    -
    -
    -
    The Chameleon Command Structure
    -
    -
    -

    After plugging in a USB cable, the ChameleonMini enumerates as a virtual serial interface. The settings of the serial interface, e.g. baudrate, stop and parity bits, are ignored by the Chameleon. For a high level of compatibility towards both humans and computers, Chameleon can be set up and controlled by means of a text-based command line interface, which can be accessed by using simple terminal software like hyper-terminal or teraterm. The command line is optimized to cooperate with script languages such as Python or TCL.

    -

    Chameleon Command Structure

    -

    For communicating with the Chameleon via USB, there exist four different syntax types:

      -
    • <COMMAND>=<VALUE> sets a parameter of the Chameleon ('set')
    • -
    • <COMMAND>=? lists all possible values for the parameter ('suggest')
    • -
    • <COMMAND>? returns the current value of a parameter ('get')
    • -
    • <COMMAND> Executes a function with an optional response ('execute')
    • -
    -

    For example, CONFIG=? lists the available types of virtualized cards and other options to configure a slot, while CONFIG=MF_CLASSIC_1K sets the current slot to Mifare Classic 1k emulation. In consequence, CONFIG? will return MF_CLASSIC_1K. Examples for commands executing a function are CLEAR, RESET or UPLOAD.

    -

    The responses of Chameleon indicate whether an action was successful or whether (and why) an error occurred. Examples: In case of an invalid command, the Chameleon replies with 200:UNKNOWN COMMAND. In case of a known command, but a wrong syntax, the Chameleon replies with 201:INVALID COMMAND USAGE.

    -

    Note: Each command has to be followed by a carriage return (CR, 0D hexadecimal). The backspace (08 hexadecimal) and escape (1B hexadecimal) keys are supported. All other control characters of the ASCII character set are ignored. The Chameleon commands are not case-sensitive. There is no echo of entered characters by the Chameleon, thus remember to switch on the 'local echo' in your terminal program.

    -

    Responses

    -

    Subsequent to any command sent, the Chameleon responds with a status number and a corresponding status message, separated by a colon and terminated with a carriage return and line feed (CR+LF, 0D+0A hexadecimal). Status numbers are of a three-digit decimal format with the first digit showing the severity of the answer. Status numbers beginning with a '1' denote an informational item and those beginning with a '2' denote an error.

    - - - - - - - - - - - - - - - - - - - - -
    Response Description
    100:OK The command has been successfully executed
    101:OK WITH TEXT The command has been successfully executed and this response is appended with an additional line of information, terminated with CR+LF
    110:WAITING FOR XMODEM The Chameleon is waiting for an XMODEM connection to be established
    120:FALSE The request is answered with false
    121:TRUE The request is answered with true
    200:UNKNOWN COMMAND This command is unknown to the Chameleon
    201:INVALID COMMAND USAGE This action is not supported by this command
    202:INVALID PARAMETER The format or value of the given parameter value is invalid
    203:TIMEOUT The timeout of the currently active command has expired
    -

    Chameleon Command Set

    -

    The current firmware supports the following global commands.

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Command Description
    CHARGING? Returns if the battery is currently being charged (TRUE) or not (FALSE)
    HELP Returns a comma-separated list of all commands supported by the current firmware
    RESET Reboots the Chameleon, i.e., power down and subsequent power-up. Note: A reset usually requires a new Terminal session.
    RSSI? Returns the voltage measured at the antenna of the Chameleon, e.g., to detect the presence of an RF field or compare the field strength of different RFID readers.
    SYSTICK? Returns the system tick value in ms. Note: An overflow occurs every 65,536 ms.
    UPGRADE Sets the Chameleon into firmware upgrade mode (DFU). This command can be used instead of holding the RBUTTON while power-on to trigger the bootloader.
    VERSION? Requests version information of the current firmware
    Button CommandsSee also Buttons
    RBUTTON=? Returns a comma-separated list of supported actions for pressing the right button shortly.
    RBUTTON? Returns the currently set action for pressing the right button shortly. DEFAULT: SETTING_CHANGE
    RBUTTON=<NAME> Sets the action for pressing the right button shortly.
    LBUTTON=? Returns a comma-separated list of supported actions for pressing the left button shortly.
    LBUTTON? Returns the currently set action for pressing the left button shortly. DEFAULT: RECALL_MEM
    LBUTTON=<NAME> Sets the action for pressing the left button shortly.
    RBUTTON_LONG=? Returns a comma-separated list of supported actions for pressing the right button a long time.
    RBUTTON_LONG? Returns the currently set action for pressing the right button a long time. DEFAULT: SETTING_CHANGE
    RBUTTON_LONG=<NAME> Sets the action for pressing the right button a long time.
    LBUTTON_LONG=? Returns a comma-separated list of supported actions for pressing the left button a long time.
    LBUTTON_LONG? Returns the currently set action for pressing the left button a long time. DEFAULT: RECALL_MEM
    LBUTTON_LONG=<NAME> Sets the action for pressing the left button a long time.
    LED Commands See also LED functionality
    LEDGREEN=? Returns a comma-separated list of supported events for illuminating the green LED
    LEDGREEN? Returns the currently set event for lighting the green LED
    LEDGREEN=<NAME> Sets the event for which the green LED is lit. DEFAULT: POWERED
    LEDRED=? Returns a comma-separated list of supported events for illuminating the red LED
    LEDRED? Returns the currently set event for lighting the red LED
    LEDRED=<NAME> Sets the event for which the green LED is lit. DEFAULT: SETTING_CHANGE
    Log Commands See also Log functionality
    LOGMODE=? Returns a comma-separated list of supported log modes
    LOGMODE? Returns the current state of the log mode
    LOGMODE=<NAME> Sets the current log mode. DEFAULT = OFF
    LOGMEM? Returns the remaining free space for logging data to the SRAM (max. 2048 byte)
    LOGDOWNLOAD Waits for an XModem connection and then downloads the binary log - including any log data in FRAM.
    LOGCLEAR Clears the log memory (SRAM and FRAM)
    LOGSTORE Writes the current log from SRAM to FRAM and clears the SRAM log.
    Warning
    If the FRAM is full, currently no error message is shown. If calling LOGMEM? after executing this command returns any other value than the maximum SRAM log size, there was not sufficient space in the FRAM and nothing has been done.
    -
    -

    ChameleonMini provides eight 'slots' that can be configured to store different virtualized cards, or as active NFC reader, or as completely passive device for sniffing purposes. Each slot stores its configuration and, if applicable, card content. To select a particular slot, use the following command (or configure a button accordingly):

    - - - - - - -
    Command Description
    SETTING? Returns the currently activated slot
    SETTING=<NUMBER> Sets the active slot, where <NUMBER> is a number between 1 and 8 (see Settings)
    -

    The following commands have an effect on the currently selected slot only:

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Command Description
    CONFIG=? Returns a comma-separated list of all supported configurations
    CONFIG? Returns the configuration of the current slot
    CONFIG=<NAME> Sets the configuration of the surrent slot to <NAME> (See Configurations)
    UIDSIZE? Returns the UID size of the currently selected card type in Byte
    UID? Returns the UID of a card in the current slot
    UID=<UID> Sets a new UID, passed in hexadecimal notation.
    READONLY? Returns the current state of the read-only mode
    READONLY=[0;1] Activates (1) or deactivates (0) the read-only mode (Any writing to the memory is silently ignored)
    MEMSIZE? Returns the memory size occupied by the current configuration in Byte
    UPLOAD Waits for an XModem connection in order to upload a new virtualized card into the currently selected slot, with a size up to the current memory size
    DOWNLOAD Waits for an XModem connection in order to download a virtualized card with the current memory size
    CLEAR Clears the content of the current slot
    STORE Stores the content of the current slot from FRAM into the Flash memory
    RECALL Recalls/restores the content of the current slot from the Flash memory into the FRAM
    TIMEOUT=? Returns the possible number range for timeouts. See also Timeout commands.
    TIMEOUT=<NUMBER> Sets the timeout for the current slot in multiples of 128 ms. If set to zero, there is no timeout. See also Timeout commands.
    TIMEOUT? Returns the timeout for the current slot. See also Timeout commands.
    Reader CommandsUsing these commands only makes sense, if the slot is configured as reader. See also ISO14443A Reader Functionality
    SEND <BYTEVALUE> Adds parity bits, sends the given byte string <BYTEVALUE>, and returns the cards answer
    SEND_RAW <BYTEVALUE>Does NOT add parity bits, sends the given byte string <BYTEVALUE> and returns the cards answer
    GETUID Obtains the UID of a card that is in the range of the antenna and returns it. This command is a Timeout command.
    DUMP_MFU Reads the whole content of a Mifare Ultralight card that is in the range of the antenna and returns it. This command is a Timeout command.
    IDENTIFY Identifies the type of a card in the range of the antenna and returns it. This command is a Timeout command.
    THRESHOLD=? Returns the possible number range for the reader threshold.
    THRESHOLD=<NUMBER> Globally sets the reader threshold. The <NUMBER> influences the reader function and range. Setting a wrong value may result in malfunctioning of the reader. DEFAULT: 400
    THRESHOLD? Returns the current reader threshold.
    AUTOCALIBRATE Automatically finds a good threshold for communicating with the card that currently is on top of the Chameleon. This command is a Timeout command.
    FIELD? Returns whether (1) or not (0) the reader field is active.
    FIELD=[0;1] Enables/disables the reader field.
    -

    Timeout Commands

    -

    Some commands start a process with an unpredictable termination time. In these cases, ChameleonMini waits with its response, until the result of this process is obtained. In order to prevent an infinite waiting time, an individual timeout value can be set for each slot, in multiples of roughly 100 ms up to 60,000 ms. When a timeout occurs or if a respective command is aborted by means of a setting change, the return code 203:TIMEOUT is sent and a command-specific shutdown function is called, which terminates the timeout process gracefully.

    -
    Warning
    Any terminal input is completely ignored during the waiting period.
    -
    -When setting the timeout to zero, there is no timeout and thus a process may continue forever. Such a process can only be terminated by changing the setting, if a button is configured accordingly, or by restarting the ChameleonMini (power off, power on).
    -

    Accessing the command-line using a terminal software

    -

    In order to have quick access to the Chameleon's command-line without using any complicated software, we suggest using the TeraTerm terminal emulation software available for windows based operating systems.

    -

    Connecting and setting up

    -

    For establishing a connection to the Chameleon's command line, select File -> New Connection, choose the virtual serial port of the Chameleon and hit the "OK" button. TeraTerm now tries to open the serial port and should succeed without any error.

    -

    For easier use of the command-line using a terminal software the local-echo functionality should be activated, to be able to see what is typed into the chameleon. When using TeraTerm, this can be achieved by selecting Setup -> Terminal and check "Local Echo".

    -

    Uploading and Downloading dump files

    -

    In some configurations of the Chameleon, it is necessary to upload a card dump before it can be accessed by a reader. For doing so, the relatively simple and widely known XMODEM protocol is used.

    -

    To upload a dump file using TeraTerm, follow these steps.

      -
    1. Enter UPLOAD and wait for the 110:WAITING FOR XMODEM response
    2. -
    3. Select File -> Transfer -> XMODEM -> Send
    4. -
    5. In the dialog choose the binary dumpfile to be uploaded and make sure the option "Checksum" is checked in the lower left corner
    6. -
    7. Hitting the "Open" button will start the transfer. If no error is given to the user, the file has been uploaded sucessfully.
    8. -
    -

    To download the Chameleon's memory again, follow the instructions above except for using DOWNLOAD instead of UPLOAD and the Receive function of TeraTerm

    -

    Note that there is a 10 second timeout after entering UPLOAD respectively DOWNLOAD after which the standard command-line is activated again. So try again if the timeout is already over when the XMODEM transfer is about to start.

    -
    - - - - diff --git a/Doc/Doxygen/html/Page_Configurations.html b/Doc/Doxygen/html/Page_Configurations.html deleted file mode 100644 index ac93e9b..0000000 --- a/Doc/Doxygen/html/Page_Configurations.html +++ /dev/null @@ -1,129 +0,0 @@ - - - - - - -Chameleon-Mini: Configurations - - - - - - - - - - -
    -
    - - - - - - -
    -
    Chameleon-Mini -
    -
    -
    - - - - - -
    -
    - - -
    - -
    - - -
    -
    -
    -
    Configurations
    -
    -
    -

    Each setting of the Chameleon-Mini has an active configuration, which defines the behavior of the Chameleon-Mini. A detailed description of what defines a configuration can be found at ConfigurationType.

    -

    Supported Codecs

    -

    A Configuration basically is defined by the codec it uses and by the application functions that use this codec. Currently there are two different codecs implemented:

      -
    1. The ISO14443A codec for emulation.
    2. -
    3. The ISO14443A codec for the reader function.
    4. -
    -

    Supported Configurations

    -

    The following table shows which configurations are available currently.

    - - - - - - - - - - - - - - - - - - -
    Configuration name Codec Description
    NONE None No functionality, Chameleon-Mini does nothing, the current setting is skipped when cycling through the settings
    MF_ULTRALIGHT ISO14443A emulation Emulates a MiFare Ultralight card
    MF_CLASSIC_1K ISO14443A emulation Emulates a MiFare Classic 1k card
    MF_CLASSIC_4K ISO14443A emulation Emulates a MiFare Classic 4k card
    MF_CLASSIC_1K_7B ISO14443A emulation Emulates a MiFare Classic 1k card with 7-byte UID.
    MF_CLASSIC_4K_7B ISO14443A emulation Emulates a MiFare Classic 4k card with 7-byte UID.
    ISO14443A_SNIFF ISO14443A emulation Currently incomplete. Sniffs ISO14443A communication between a reader and a card.
    ISO14443A_READER ISO14443A reader The Chameleon-Mini works as a reader and can process different procedures in order to obtain a cards UID etc.
    -

    Configuration Changing procedure

    -

    When the configuration is changed, no matter whether by command line or during a setting change, the following steps are done:

      -
    1. The codec deinitialization function of the currently active configuration is called.
    2. -
    3. Possibly pending timeout commands are aborted.
    4. -
    5. The configuration struct (ConfigurationType) for the currently active configuration is overwritten with the new configuration struct.
    6. -
    7. The codec initialization function of the new configuration is called.
    8. -
    9. The application initialization function of the new configuration is called.
    10. -
    -
    - - - - diff --git a/Doc/Doxygen/html/Page_GettingStarted.html b/Doc/Doxygen/html/Page_GettingStarted.html deleted file mode 100644 index 1911b43..0000000 --- a/Doc/Doxygen/html/Page_GettingStarted.html +++ /dev/null @@ -1,121 +0,0 @@ - - - - - - -Chameleon-Mini: Getting Started - - - - - - - - - - -
    -
    - - - - - - -
    -
    Chameleon-Mini -
    -
    -
    - - - - - -
    -
    - - -
    - -
    - - -
    -
    -
    -
    Getting Started
    -
    -
    -

    Finally, you hold your brand-new ChameleonMini RevG in your hands! What to do now?! In the factory, a test firmware including a USB bootloader has been programmed into the microcontroller of the Chameleon. This page describes the next steps in order to upload the current firmware, as developed in this project, via the USB bootloader.

    -

    Step 1: Trigger the USB Bootloader

    -

    The bootloader can be executed in two different ways:

      -
    1. Make sure the Chameleon is switched off (power switch on the side is in the position OFF). Now, hold down the right button (RBUTTON) and keep it pressed while connecting the Chameleon to a PC via a USB cable.
    2. -
    3. OR: Plug your Chameleon via USB to a PC and use your favorite terminal application to connect with the test firmware of the ChameleonMini. Type upgrade and hit Enter.
    4. -
    -

    In either way, the ChameleonMini now jumps to the bootloader and waits patiently for a firmware upgrade.

    -

    Step 2: Upgrade the Firmware

    -

    Once the ChameleonMini is in the bootloader, you can flash a new firmware, i.e., the files Chameleon-Mini.hex and the Chameleon-Mini.eep, into the microcontroller. The source code directory contains these files precompiled but you can of course also compile the code yourself. Create a new folder and copy the two files into it. The following depends on your operating system:

    -

    Upgrade Procedure for Linux Users

    -

    In order to upgrade the firmware under Linux you first have to install avrdude, e.g. under Ubuntu with the command sudo apt-get install avra avrdude. Then change to the directory where you have saved the hex and eep files and run sudo avrdude -c flip2 -p ATXMega128A4U -B 60 -P usb -U application:w:Chameleon-Mini.hex:i -U eeprom:w:Chameleon-Mini.eep:i.

    -

    You also can use sudo make program in the source code directory, which basically does the same.

    -

    After running this command you need to restart your Chameleon, e.g. by reattaching the Chameleon to the PC.

    -
    Note
    If you are using Ubuntu 14.04, avrdude may not support flip2. In this case, you can run add-apt-repository ppa:pmjdebruijn/avrdude-release, then apt-get update and finally apt-get install avrdude to upgrade to a version of avrdude that supports flip2.
    -

    Optionally copy Drivers/98-ChameleonMini.rules to /etc/udev/rules.d/, to allow non-root users to open the chameleon serial port at /dev/chameleon. sudo cp (Path to Chameleon Repo)/Drivers/98-ChameleonMini.rules /etc/udev/rules.d/ Remember to restart the udev daemon, or reboot to activate the rule. 'sudo udevadm control –reload'

    -

    Upgrade Procedure for Mac OS Users

    -

    When running Homebrew you can install avrdude with brew install avrdude. After this, change to the directory where you have saved the hex and eep files and run sudo avrdude -c flip2 -p ATXMega128A4U -B 60 -P usb -U application:w:Chameleon-Mini.hex:i -U eeprom:w:Chameleon-Mini.eep:i.

    -

    Upgrade Procedure for Windows Users

    -

    For upgrading the firmware under Windows please

      -
    1. download https://sourceforge.net/projects/dfu-programmer/files/dfu-programmer/0.7.2/dfu-programmer-win-0.7.2.zip/download and extract to an arbitrary directory. Make sure to use the DFU programmer Version 0.7.2!
    2. -
    3. Go to the extraction directory and then open the folder dfu-prog-usb-1.2.2. Install the atmel_usb_dfu.inf driver (right click -> install).
    4. -
    5. Copy dfu-programmer.exe from the extraction directory to the directory where you have saved the hex and eep files.
    6. -
    7. Save the ChameleonFirmwareUpgrade.bat in the same directory as the hex and eep files.
    8. -
    9. Run the ChameleonFirmwareUpgrade.bat as Administrator (right click -> run as Administrator) and wait for the firmware upgrade to terminate. Upon success, the green LED of the ChameleonMini should light up.
    10. -
    -

    Finally, install the driver for Chameleon: Download both ChameleonDriver.inf and ChameleonDriver.cat from the Drivers directory and install the INF file (right click -> install).

    Note
    If you have problems with the driver installation, try the instructions in sections 6.2.1 and 6.2.2 from this Atmel document.
    -

    Now, Chameleon should appear in the Windows device manager and you should be able to open a terminal program such as TeraTerm and connect to the Chameleon-Mini via the COM port shown in the device manager. On Mac or Linux you can use screen (screen /dev/tty.usbmodem1421, please replace your device path with the appropriate one) to communicate with your Chameleon. Further information about how to "talk" to the Chameleon can be found here: The Chameleon Command Structure.

    -
    - - - - diff --git a/Doc/Doxygen/html/Page_LED.html b/Doc/Doxygen/html/Page_LED.html deleted file mode 100644 index 3584e29..0000000 --- a/Doc/Doxygen/html/Page_LED.html +++ /dev/null @@ -1,117 +0,0 @@ - - - - - - -Chameleon-Mini: LED functionality - - - - - - - - - - -
    -
    - - - - - - -
    -
    Chameleon-Mini -
    -
    -
    - - - - - -
    -
    - - -
    - -
    - -
    -
    -
    -
    LED functionality
    -
    -
    -

    The Chameleon-Mini has two fully configurable LEDs: one red LED and one green LED. The configuration is done with the commands LEDRED and LEDGREEN, which both can be called as the getting ("?"), setting ("=") and suggesting ("=?") version.

    -

    The following table shows which LED functions are currently available.

    - - - - - - - - - - - - - - - - - - - - - - - - -
    Function name Description
    NONE No function, the LED is deactivated.
    POWERED The LED lights up if the Chameleon-Mini is powered, regardless whether powered by USB or by battery.
    TERMINAL_CONN The LED is turned on when the Chameleon-Mini is connected via USB and is turned off when no USB connection is established.
    TERMINAL_RXTX The according LED blinks shortly when sending or receiving data via the USB interface.
    SETTING_CHANGE The LED blinks one time if the new setting is setting 1, two times for setting 2, ..., eight times for setting 8.
    MEMORY_STORED The LED flashes everytime when a setting is stored to the permanent flash. This is currently the case when calling the command STORE, the button event STORE_MEM occurs or the setting is changed.
    MEMORY_CHANGED The LED turns on when the FRAM is changed and is turned off when the currently active setting is written to the permanent flash. Thus, this function indicates when the current setting is changed.
    CODEC_RX The LED flashes when the currently active codec (e.g. ISO14443A emulation) receives data. Note that this is implemented on codec layer and the flashing is triggered before the received data are interpreted by the application.
    CODEC_TX The LED flashes when the currently active codec sends data. This function also is implemented on codec layer.
    FIELD_DETECTED The LED is turned on if and only if a reader field is detected, which is recognized by the RSSI module (when the RSSI value hits a hardcoded threshold, it is assumed that there is a reader field). It is irrelevant whether the field comes from another reader or from the Chameleon-Mini itself.
    LOGMEM_FULL Lights up the LED, if the SRAM log memory is full.
    -
    - - - - diff --git a/Doc/Doxygen/html/Page_LEDs.html b/Doc/Doxygen/html/Page_LEDs.html deleted file mode 100644 index 8785cfa..0000000 --- a/Doc/Doxygen/html/Page_LEDs.html +++ /dev/null @@ -1,121 +0,0 @@ - - - - - - -Chameleon-Mini: LED functionality - - - - - - - - - - -
    -
    - - - - - - -
    -
    Chameleon-Mini -
    -
    -
    - - - - - -
    -
    - - -
    - -
    - - -
    -
    -
    -
    LED functionality
    -
    -
    -

    For giving user feedback, ChameleonMini provides two LEDs that can be configured to indicate various conditions, events, or internal state changes of ChameleonMini: a red LED and a green LED. Their individual configuration is controlled with the commands LEDRED and LEDGREEN, which can be called in the getting ("?"), setting ("=") and suggesting ("=?") variants.

    -

    The following table shows the currently supported LED functions.

    - - - - - - - - - - - - - - - - - - - - - - - - -
    Condition/Event Description
    NONE Nothing happens, the LED remains dark.
    POWERED The LED lights up, if the ChameleonMini is powered by USB or by battery.
    TERMINAL_CONN The LED is turned on when the ChameleonMini is connected via USB and is turned off when no USB connection is established.
    TERMINAL_RXTX The LED blinks shortly when sending or receiving data via the USB interface.
    SETTING_CHANGE The LED blinks one time if the new setting is setting 1, two times for setting 2, ..., eight times for setting 8.
    MEMORY_STORED The LED flashes everytime when a setting is stored to the permanent flash. This is currently the case when calling the command STORE, the button event STORE_MEM occurs or the setting is changed.
    MEMORY_CHANGED The LED turns on when the content of the FRAM has been modified and is turned off when the currently active setting is written to the permanent Flash memory. Thus, this function indicates when the current content has been changed.
    CODEC_RX The LED flashes when the currently active codec (e.g. ISO14443A emulation) receives data via the RFID interface. Note that this is implemented on the codec layer and the flashing is triggered before the received data is interpreted by the application.
    CODEC_TX The LED flashes when the currently active codec sends data via the RFID interface. This function is also implemented on the codec layer.
    FIELD_DETECTED The LED is turned on, if a reader field is detected via the RSSI module (when the RSSI value hits a hardcoded threshold, it is assumed that there is a reader field). It is irrelevant whether the field comes from another reader or from the ChameleonMini itself.
    LOGMEM_FULL Lights up the LED, if the SRAM log memory is full.
    -
    - - - - diff --git a/Doc/Doxygen/html/Page_Log.html b/Doc/Doxygen/html/Page_Log.html deleted file mode 100644 index 766b381..0000000 --- a/Doc/Doxygen/html/Page_Log.html +++ /dev/null @@ -1,120 +0,0 @@ - - - - - - -Chameleon-Mini: Log functionality - - - - - - - - - - -
    -
    - - - - - - -
    -
    Chameleon-Mini -
    -
    -
    - - - - - -
    -
    - - -
    - -
    - - -
    -
    -
    -
    Log functionality
    -
    -
    -

    The ChameleonMini provides a configurable log functionality. This page describes how to use it.

    -

    Log Entry Format

    -

    The log entries use a TLV (Type Length Value)-like format:

    - - - - - - - - - - -
    Name Size Description
    Entry type 1 byte See LogEntryEnum
    Data length 1 byte This is the length of the appended data.
    Timestamp 2 bytes This is the current systick value.
    Data Data length bytes It is also possible that no data is appended, then the Data length field is zero.
    -

    Entry Types

    -

    See LogEntryEnum.

    -

    Log Modes

    -

    Currently there exist three log modes:

      -
    • OFF, which means that nothing is logged.
    • -
    • LIVE, which means that log events are written directly to the terminal (untested).
    • -
    • MEMORY, where the log events are written to SRAM.
    • -
    -
    Note
    If there is not enough log memory, the log mode is automatically set to OFF.
    -
    Warning
    Since the MEMORY log mode writes to SRAM, the log memory is cleared by power off or restarting the Chameleon.
    -

    Related Commands, Button event and LED functions

    -

    There are various commands to configure the log functionality. See Page Command Line. Equivalently to the LOGSTORE command, the buttons are configurable to STORE_LOG, which does the same. Also, there exists a LOGMEM_FULL function for the LEDs, which lights up the LED if the SRAM log memory is full. See also the Pages Buttons and LED functionality. The 'chamlog' Python script in the project (Software folder) automatizes the process of downloading the binary log data, e.g., sending the following command under Windows with a ChameleonMini connected on port COM6 results in downloading the binary log file, clearing the log memory, and setting the log mode to MEMORY: chamlog -p COM6 -c -m MEMORY -v. Repeatedly executing this command always outputs the recently logged commands in user-readable form. Make sure that no other program, e.g., terminal software, is blocking the serial port.

    -
    - - - - diff --git a/Doc/Doxygen/html/Page_Settings.html b/Doc/Doxygen/html/Page_Settings.html deleted file mode 100644 index 960823a..0000000 --- a/Doc/Doxygen/html/Page_Settings.html +++ /dev/null @@ -1,108 +0,0 @@ - - - - - - -Chameleon-Mini: Settings - - - - - - - - - - -
    -
    - - - - - - -
    -
    Chameleon-Mini -
    -
    -
    - - - - - -
    -
    - - -
    - -
    - - -
    -
    -
    -
    Settings
    -
    -
    -

    The ChameleonMini can act in different ways, the behavior is defined by configurations. But also, the ChameleonMini has slots, which are a layer above the configurations. With the slots, it is possible to switch between different configurations and respective content, e.g., a card dump together with the configuration as Mifare Classic 1k card.

    -

    Properties

    -

    A slot is defined by settings: SettingsEntryType.

    -

    Slot Changing Procedure

    -

    When the current slot is changed, the following procedure is applied:

      -
    1. Break potentially pending timeout commands.
    2. -
    3. Store the memory of the setting to the Flash.
    4. -
    5. Set the slot number of the currently active slot to the number of the new slot.
    6. -
    7. Set the slot pointer of the currently active slot to the pointer of the new slot.
    8. -
    9. Since the slot also contains the configuration, apply the configuration changing procedure with the new configuration for the new slot.
    10. -
    11. Log the slot change.
    12. -
    13. Recall the new content of the slot from the permanent Flash.
    14. -
    15. Signalize the slot change with an LED, if an LED is configured to SETTING_CHANGE.
    16. -
    -
    - - - - diff --git a/Doc/Doxygen/html/Page_UploadingDownloading.html b/Doc/Doxygen/html/Page_UploadingDownloading.html deleted file mode 100644 index a68c00f..0000000 --- a/Doc/Doxygen/html/Page_UploadingDownloading.html +++ /dev/null @@ -1,99 +0,0 @@ - - - - - - -Chameleon-Mini: Uploading and Downloading Memory dumps - - - - - - - - - - -
    -
    - - - - - - -
    -
    Chameleon-Mini -
    -
    -
    - - - - - -
    -
    - - -
    - -
    - - -
    -
    -
    -
    Uploading and Downloading Memory dumps
    -
    -
    -

    In order to be able to emulate different cards, one can upload or download the content used for the emulation.

    -

    The layout of the memory dump depends on the chosen configuration and is usually the same as the memory layout of the currently chosen card emulation. The size of the memory dump also depends on the currently chosen configuration and can be requested with a specific command on the command-line.

    -

    In order to upload or download a memory dump, the user has to send the corresponding command on the command-line first and the Chameleon responds with a status message indicating that it is waiting for an X-MODEM connection. Depending on whether upload or download is chosen, the Chameleon then waits for 10 seconds to initiate an X-MODEM receive or send connection.

    -

    When waiting for a receiving X-MODEM connection, the X-MODEM NAK byte is sent upto 20 times with a delay of 500ms in order to establish a standard 128 byte frame-size X-MODEM connection with the simple checksum scheme. Within this time, the user has to get his X-MODEM client ready and choose the binary file to be uploaded into the memory.

    -

    In case of waiting for an X-MODEM send connection to establish, a wait time of 10 seconds is performed to receive the X-MODEM NAK byte. Within this time, the user has to start the X-MODEM receiver and set it to the standard 128 byte frame using the simple checksum scheme in order to receive the binary memory dump.

    -
    - - - - diff --git a/Doc/Doxygen/html/_antenna_level_8h_source.html b/Doc/Doxygen/html/_antenna_level_8h_source.html index fb7c863..cf2e680 100644 --- a/Doc/Doxygen/html/_antenna_level_8h_source.html +++ b/Doc/Doxygen/html/_antenna_level_8h_source.html @@ -69,7 +69,7 @@ $(function() {
    1 /*
    2  * AntennaLevel.h
    3  *
    4  * Created on: 24.11.2013
    5  * Author: skuser
    6  */
    7 
    8 #ifndef ANTENNALEVEL_H_
    9 #define ANTENNALEVEL_H_
    10 
    11 #include "Common.h"
    12 
    13 #define ANTENNA_LEVEL_R1 47E3
    14 #define ANTENNA_LEVEL_R2 1E3
    15 #define ANTENNA_LEVEL_VREF 1.0
    16 #define ANTENNA_LEVEL_RES 4096
    17 #define ANTENNA_LEVEL_OFFSET 190 /* LSB */
    18 
    19 #define ANTENNA_LEVEL_MILLIVOLT 1E3
    20 #define ANTENNA_LEVEL_FACTOR (ANTENNA_LEVEL_VREF * (ANTENNA_LEVEL_R1 + ANTENNA_LEVEL_R2) / (ANTENNA_LEVEL_RES * ANTENNA_LEVEL_R2) )
    21 #define ANTENNA_LEVEL_SCALE ((uint32_t) 1<<16)
    22 #define ANTENNA_LEVEL_NUMERATOR ((uint32_t) (ANTENNA_LEVEL_MILLIVOLT * ANTENNA_LEVEL_FACTOR * ANTENNA_LEVEL_SCALE + .5))
    23 #define ANTENNA_LEVEL_DENOMINATOR (ANTENNA_LEVEL_SCALE)
    24 
    25 static inline
    26 void AntennaLevelInit(void)
    27 {
    28  ADCA.CTRLA = ADC_ENABLE_bm;
    29  ADCA.CTRLB = ADC_RESOLUTION_12BIT_gc;
    30  ADCA.REFCTRL = ADC_REFSEL_INT1V_gc | ADC_BANDGAP_bm;
    31  ADCA.PRESCALER = ADC_PRESCALER_DIV32_gc;
    32  ADCA.CH0.CTRL = ADC_CH_INPUTMODE_SINGLEENDED_gc;
    33  ADCA.CH0.MUXCTRL = ADC_CH_MUXPOS_PIN1_gc;
    34 
    35 }
    36 
    37 static inline
    38 uint16_t AntennaLevelGet(void)
    39 {
    40  ADCA.CH0.CTRL |= ADC_CH_START_bm;
    41  while( !(ADCA.CH0.INTFLAGS & ADC_CH_CHIF_bm) );
    42 
    43  ADCA.CH0.INTFLAGS = ADC_CH_CHIF_bm;
    44 
    45  int16_t Result = ADCA.CH0RES - ANTENNA_LEVEL_OFFSET;
    46  if (Result < 0) Result = 0;
    47 
    48  return (uint16_t) (((uint32_t) Result * ANTENNA_LEVEL_NUMERATOR) / ANTENNA_LEVEL_DENOMINATOR);
    49 }
    50 
    51 void AntennaLevelTick(void);
    52 void AntennaLevelResetMaxRssi(void);
    53 
    54 #endif /* ANTENNALEVEL_H_ */
    diff --git a/Doc/Doxygen/html/_application_8h_source.html b/Doc/Doxygen/html/_application_8h_source.html index 63b9895..5661556 100644 --- a/Doc/Doxygen/html/_application_8h_source.html +++ b/Doc/Doxygen/html/_application_8h_source.html @@ -78,7 +78,7 @@ $(function() { diff --git a/Doc/Doxygen/html/_battery_8h_source.html b/Doc/Doxygen/html/_battery_8h_source.html index ce09dcf..38b4d57 100644 --- a/Doc/Doxygen/html/_battery_8h_source.html +++ b/Doc/Doxygen/html/_battery_8h_source.html @@ -69,7 +69,7 @@ $(function() {
    1 /*
    2  * Battery.h
    3  *
    4  * Created on: 20.08.2014
    5  * Author: sk
    6  */
    7 
    8 #ifndef BATTERY_H_
    9 #define BATTERY_H_
    10 
    11 #include "Common.h"
    12 
    13 #define BATTERY_PORT PORTD
    14 #define BATTERY_STAT_PIN PIN0_bm
    15 #define BATTERY_STAT_PINCTRL PIN0CTRL
    16 #define BATTERY_PORT_MASK (BATTERY_STAT_PIN)
    17 
    18 INLINE void BatteryInit(void) {
    19  BATTERY_PORT.DIRCLR = BATTERY_PORT_MASK;
    20  BATTERY_PORT.BATTERY_STAT_PINCTRL = PORT_OPC_PULLUP_gc;
    21 }
    22 
    23 INLINE bool BatteryIsCharging(void) {
    24  if (!(BATTERY_PORT.IN & BATTERY_STAT_PIN)) {
    25  return true;
    26  } else {
    27  return false;
    28  }
    29 }
    30 
    31 #endif /* BATTERY_H_ */
    diff --git a/Doc/Doxygen/html/_button_8h_source.html b/Doc/Doxygen/html/_button_8h_source.html index 3c4a665..5a2bc85 100644 --- a/Doc/Doxygen/html/_button_8h_source.html +++ b/Doc/Doxygen/html/_button_8h_source.html @@ -69,7 +69,7 @@ $(function() {
    1 /*
    2  * Button.h
    3  *
    4  * Created on: 13.05.2013
    5  * Author: skuser
    6  */
    7 
    8 #ifndef BUTTON_H_
    9 #define BUTTON_H_
    10 
    11 #include "Common.h"
    12 
    13 typedef enum {
    14  BUTTON_R_PRESS_SHORT = 0,
    15  BUTTON_R_PRESS_LONG,
    16  BUTTON_L_PRESS_SHORT,
    17  BUTTON_L_PRESS_LONG,
    18 
    19  /* Must be last element */
    20  BUTTON_TYPE_COUNT
    21 } ButtonTypeEnum;
    22 
    23 typedef enum {
    24  BUTTON_ACTION_NONE,
    25  BUTTON_ACTION_UID_RANDOM,
    26  BUTTON_ACTION_UID_LEFT_INCREMENT,
    27  BUTTON_ACTION_UID_RIGHT_INCREMENT,
    28  BUTTON_ACTION_UID_LEFT_DECREMENT,
    29  BUTTON_ACTION_UID_RIGHT_DECREMENT,
    30  BUTTON_ACTION_CYCLE_SETTINGS,
    31  BUTTON_ACTION_STORE_MEM,
    32  BUTTON_ACTION_RECALL_MEM,
    33  BUTTON_ACTION_TOGGLE_FIELD,
    34  BUTTON_ACTION_STORE_LOG,
    35 
    36  /* This has to be last element */
    37  BUTTON_ACTION_COUNT
    38 } ButtonActionEnum;
    39 
    40 void ButtonInit(void);
    41 void ButtonTick(void);
    42 
    43 void ButtonGetActionList(char* List, uint16_t BufferSize);
    44 void ButtonSetActionById(ButtonTypeEnum Type, ButtonActionEnum Action);
    45 void ButtonGetActionByName(ButtonTypeEnum Type, char* Action, uint16_t BufferSize);
    46 bool ButtonSetActionByName(ButtonTypeEnum Type, const char* Action);
    47 
    48 #endif /* BUTTON_H_ */
    diff --git a/Doc/Doxygen/html/_buttons_8txt.html b/Doc/Doxygen/html/_buttons_8txt.html index a03c9c3..853671f 100644 --- a/Doc/Doxygen/html/_buttons_8txt.html +++ b/Doc/Doxygen/html/_buttons_8txt.html @@ -65,7 +65,7 @@ $(function() { diff --git a/Doc/Doxygen/html/_chameleon-_mini_8h_source.html b/Doc/Doxygen/html/_chameleon-_mini_8h_source.html index e61f2e0..761462d 100644 --- a/Doc/Doxygen/html/_chameleon-_mini_8h_source.html +++ b/Doc/Doxygen/html/_chameleon-_mini_8h_source.html @@ -72,7 +72,7 @@ $(function() { diff --git a/Doc/Doxygen/html/_codec_8h_source.html b/Doc/Doxygen/html/_codec_8h_source.html index dc15ff1..cfcbc8e 100644 --- a/Doc/Doxygen/html/_codec_8h_source.html +++ b/Doc/Doxygen/html/_codec_8h_source.html @@ -72,7 +72,7 @@ $(function() { diff --git a/Doc/Doxygen/html/_command_line_8h_source.html b/Doc/Doxygen/html/_command_line_8h_source.html index 6ed33a0..f19cc6a 100644 --- a/Doc/Doxygen/html/_command_line_8h_source.html +++ b/Doc/Doxygen/html/_command_line_8h_source.html @@ -69,7 +69,7 @@ $(function() {
    1 /*
    2  * CommandLine.h
    3  *
    4  * Created on: 04.05.2013
    5  * Author: skuser
    6  */
    7 
    8 #ifndef COMMANDLINE_H_
    9 #define COMMANDLINE_H_
    10 
    11 #include "Terminal.h"
    12 #include "Commands.h"
    13 
    14 void CommandLineInit(void);
    15 bool CommandLineProcessByte(uint8_t Byte);
    16 void CommandLineTick(void);
    17 
    18 void CommandLineAppendData(void const * const Buffer, uint16_t Bytes);
    19 
    20 /* Functions for timeout commands */
    21 void CommandLinePendingTaskFinished(CommandStatusIdType ReturnStatusID, char const * const OutMessage); // must be called, when the intended task is finished
    22 extern void (*CommandLinePendingTaskTimeout) (void); // gets called on timeout to end the pending task
    23 void CommandLinePendingTaskBreak(void); // this manually triggers a timeout
    24 
    25 #endif /* COMMANDLINE_H_ */
    diff --git a/Doc/Doxygen/html/_command_line_8txt.html b/Doc/Doxygen/html/_command_line_8txt.html index 27e78de..f4c4aee 100644 --- a/Doc/Doxygen/html/_command_line_8txt.html +++ b/Doc/Doxygen/html/_command_line_8txt.html @@ -65,7 +65,7 @@ $(function() { diff --git a/Doc/Doxygen/html/_commands_8h_source.html b/Doc/Doxygen/html/_commands_8h_source.html index 990c90f..87432c4 100644 --- a/Doc/Doxygen/html/_commands_8h_source.html +++ b/Doc/Doxygen/html/_commands_8h_source.html @@ -69,7 +69,7 @@ $(function() {
    1 
    2 
    3 #ifndef COMMANDS_H_
    4 #define COMMANDS_H_
    5 
    6 #include "../Common.h"
    7 
    8 #define MAX_COMMAND_LENGTH 16
    9 #define MAX_STATUS_LENGTH 32
    10 
    11 
    12 #define COMMAND_INFO_OK_ID 100
    13 #define COMMAND_INFO_OK "OK"
    14 #define COMMAND_INFO_OK_WITH_TEXT_ID 101
    15 #define COMMAND_INFO_OK_WITH_TEXT "OK WITH TEXT"
    16 #define COMMAND_INFO_XMODEM_WAIT_ID 110
    17 #define COMMAND_INFO_XMODEM_WAIT "WAITING FOR XMODEM"
    18 #define COMMAND_INFO_FALSE_ID 120
    19 #define COMMAND_INFO_FALSE "FALSE"
    20 #define COMMAND_INFO_TRUE_ID 121
    21 #define COMMAND_INFO_TRUE "TRUE"
    22 #define COMMAND_ERR_UNKNOWN_CMD_ID 200
    23 #define COMMAND_ERR_UNKNOWN_CMD "UNKNOWN COMMAND"
    24 #define COMMAND_ERR_INVALID_USAGE_ID 201
    25 #define COMMAND_ERR_INVALID_USAGE "INVALID COMMAND USAGE"
    26 #define COMMAND_ERR_INVALID_PARAM_ID 202
    27 #define COMMAND_ERR_INVALID_PARAM "INVALID PARAMETER"
    28 #define COMMAND_ERR_TIMEOUT_ID 203
    29 #define COMMAND_ERR_TIMEOUT "TIMEOUT"
    30 #define TIMEOUT_COMMAND 255 // this is just for the CommandLine module to know that this is a timeout command
    31 
    32 
    33 #define COMMAND_CHAR_TRUE '1'
    34 #define COMMAND_CHAR_FALSE '0'
    35 #define COMMAND_CHAR_SUGGEST '?' /* <CMD>=? for help */
    36 
    37 #define COMMAND_UID_BUFSIZE 32
    38 
    39 #define COMMAND_IS_SUGGEST_STRING(x) ( ((x)[0] == COMMAND_CHAR_SUGGEST) && ((x)[1] == '\0') )
    40 
    41 typedef uint8_t CommandStatusIdType;
    42 typedef const char CommandStatusMessageType[MAX_STATUS_LENGTH];
    43 
    44 typedef CommandStatusIdType (*CommandExecFuncType) (char* OutMessage);
    45 typedef CommandStatusIdType (*CommandExecParamFuncType) (char* OutMessage, const char* InParams);
    46 typedef CommandStatusIdType (*CommandSetFuncType) (char* OutMessage, const char* InParam);
    47 typedef CommandStatusIdType (*CommandGetFuncType) (char* OutParam);
    48 
    49 typedef struct {
    50  char Command[MAX_COMMAND_LENGTH];
    51  CommandExecFuncType ExecFunc;
    52  CommandExecParamFuncType ExecParamFunc;
    53  CommandSetFuncType SetFunc;
    54  CommandGetFuncType GetFunc;
    55 } CommandEntryType;
    56 
    57 #define COMMAND_VERSION "VERSION"
    58 CommandStatusIdType CommandGetVersion(char* OutParam);
    59 
    60 #define COMMAND_CONFIG "CONFIG"
    61 CommandStatusIdType CommandGetConfig(char* OutParam);
    62 CommandStatusIdType CommandSetConfig(char* OutMessage, const char* InParam);
    63 
    64 #define COMMAND_UID "UID"
    65 #define COMMAND_UID_RANDOM "RANDOM"
    66 CommandStatusIdType CommandGetUid(char* OutParam);
    67 CommandStatusIdType CommandSetUid(char* OutMessage, const char* InParam);
    68 
    69 #define COMMAND_READONLY "READONLY"
    70 CommandStatusIdType CommandGetReadOnly(char* OutParam);
    71 CommandStatusIdType CommandSetReadOnly(char* OutMessage, const char* InParam);
    72 
    73 #define COMMAND_UPLOAD "UPLOAD"
    74 CommandStatusIdType CommandExecUpload(char* OutMessage);
    75 
    76 #define COMMAND_DOWNLOAD "DOWNLOAD"
    77 CommandStatusIdType CommandExecDownload(char* OutMessage);
    78 
    79 #define COMMAND_RESET "RESET"
    80 CommandStatusIdType CommandExecReset(char* OutMessage);
    81 
    82 #define COMMAND_UPGRADE "UPGRADE"
    83 CommandStatusIdType CommandExecUpgrade(char* OutMessage);
    84 
    85 #define COMMAND_MEMSIZE "MEMSIZE"
    86 CommandStatusIdType CommandGetMemSize(char* OutParam);
    87 
    88 #define COMMAND_UIDSIZE "UIDSIZE"
    89 CommandStatusIdType CommandGetUidSize(char* OutParam);
    90 
    91 #define COMMAND_RBUTTON "RBUTTON"
    92 CommandStatusIdType CommandGetRButton(char* OutParam);
    93 CommandStatusIdType CommandSetRButton(char* OutMessage, const char* InParam);
    94 
    95 #define COMMAND_RBUTTON_LONG "RBUTTON_LONG"
    96 CommandStatusIdType CommandGetRButtonLong(char* OutParam);
    97 CommandStatusIdType CommandSetRButtonLong(char* OutMessage, const char* InParam);
    98 
    99 #define COMMAND_LBUTTON "LBUTTON"
    100 CommandStatusIdType CommandGetLButton(char* OutParam);
    101 CommandStatusIdType CommandSetLButton(char* OutMessage, const char* InParam);
    102 
    103 #define COMMAND_LBUTTON_LONG "LBUTTON_LONG"
    104 CommandStatusIdType CommandGetLButtonLong(char* OutParam);
    105 CommandStatusIdType CommandSetLButtonLong(char* OutMessage, const char* InParam);
    106 
    107 
    108 #define COMMAND_LEDGREEN "LEDGREEN"
    109 CommandStatusIdType CommandGetLedGreen(char* OutParam);
    110 CommandStatusIdType CommandSetLedGreen(char* OutMessage, const char* InParam);
    111 
    112 #define COMMAND_LEDRED "LEDRED"
    113 CommandStatusIdType CommandGetLedRed(char* OutParam);
    114 CommandStatusIdType CommandSetLedRed(char* OutMessage, const char* InParam);
    115 
    116 #define COMMAND_LOGMODE "LOGMODE"
    117 CommandStatusIdType CommandGetLogMode(char* OutParam);
    118 CommandStatusIdType CommandSetLogMode(char* OutMessage, const char* InParam);
    119 
    120 #define COMMAND_LOGMEM "LOGMEM"
    121 CommandStatusIdType CommandGetLogMem(char* OutParam);
    122 
    123 #define COMMAND_LOGDOWNLOAD "LOGDOWNLOAD"
    124 CommandStatusIdType CommandExecLogDownload(char* OutMessage);
    125 
    126 #define COMMAND_STORELOG "LOGSTORE"
    127 CommandStatusIdType CommandExecStoreLog(char* OutMessage);
    128 
    129 #define COMMAND_LOGCLEAR "LOGCLEAR"
    130 CommandStatusIdType CommandExecLogClear(char* OutMessage);
    131 
    132 #define COMMAND_SETTING "SETTING"
    133 CommandStatusIdType CommandGetSetting(char* OutParam);
    134 CommandStatusIdType CommandSetSetting(char* OutMessage, const char* InParam);
    135 
    136 #define COMMAND_CLEAR "CLEAR"
    137 CommandStatusIdType CommandExecClear(char* OutMessage);
    138 
    139 #define COMMAND_STORE "STORE"
    140 CommandStatusIdType CommandExecStore(char* OutMessage);
    141 
    142 #define COMMAND_RECALL "RECALL"
    143 CommandStatusIdType CommandExecRecall(char* OutMessage);
    144 
    145 #define COMMAND_CHARGING "CHARGING"
    146 CommandStatusIdType CommandGetCharging(char* OutParam);
    147 
    148 #define COMMAND_HELP "HELP"
    149 CommandStatusIdType CommandExecHelp(char* OutMessage);
    150 
    151 #define COMMAND_RSSI "RSSI"
    152 CommandStatusIdType CommandGetRssi(char* OutParam);
    153 
    154 #define COMMAND_SYSTICK "SYSTICK"
    155 CommandStatusIdType CommandGetSysTick(char* OutParam);
    156 
    157 #define COMMAND_SEND_RAW "SEND_RAW"
    158 CommandStatusIdType CommandExecParamSendRaw(char* OutMessage, const char* InParams);
    159 
    160 #define COMMAND_SEND "SEND"
    161 CommandStatusIdType CommandExecParamSend(char* OutMessage, const char* InParams);
    162 
    163 #define COMMAND_GETUID "GETUID"
    164 CommandStatusIdType CommandExecGetUid(char* OutMessage);
    165 
    166 #define COMMAND_DUMP_MFU "DUMP_MFU"
    167 CommandStatusIdType CommandExecDumpMFU(char* OutMessage);
    168 
    169 #define COMMAND_IDENTIFY_CARD "IDENTIFY"
    170 CommandStatusIdType CommandExecIdentifyCard(char* OutMessage);
    171 
    172 #define COMMAND_TIMEOUT "TIMEOUT"
    173 CommandStatusIdType CommandGetTimeout(char* OutMessage);
    174 CommandStatusIdType CommandSetTimeout(char* OutMessage, const char* InParam);
    175 
    176 #define COMMAND_THRESHOLD "THRESHOLD"
    177 CommandStatusIdType CommandGetThreshold(char* OutParam);
    178 CommandStatusIdType CommandSetThreshold(char* OutMessage, const char* InParam);
    179 
    180 #define COMMAND_AUTOCALIBRATE "AUTOCALIBRATE"
    181 CommandStatusIdType CommandExecAutocalibrate(char* OutMessage);
    182 
    183 #define COMMAND_FIELD "FIELD"
    184 CommandStatusIdType CommandSetField(char* OutMessage, const char* InParam);
    185 CommandStatusIdType CommandGetField(char* OutMessage);
    186 
    187 #define COMMAND_LIST_END ""
    188 /* Defines the end of command list. This is no actual command */
    189 
    190 #endif /* COMMANDS_H_ */
    diff --git a/Doc/Doxygen/html/_common_8h_source.html b/Doc/Doxygen/html/_common_8h_source.html index 576f554..256980f 100644 --- a/Doc/Doxygen/html/_common_8h_source.html +++ b/Doc/Doxygen/html/_common_8h_source.html @@ -69,7 +69,7 @@ $(function() {
    1 /*
    2  * Common.h
    3  *
    4  * Created on: 20.03.2013
    5  * Author: skuser
    6  */
    7 
    8 #ifndef COMMON_H_
    9 #define COMMON_H_
    10 
    11 #include <stdio.h>
    12 #include <stdbool.h>
    13 #include <util/parity.h>
    14 #include <util/delay.h>
    15 #include <avr/pgmspace.h>
    16 #include <avr/io.h>
    17 
    18 #define ODD_PARITY(Value) OddParityBit(Value)//(parity_even_bit(Value) ? 0 : 1)
    19 
    20 #define INLINE \
    21  static inline __attribute__((always_inline))
    22 
    23 #define ARRAY_COUNT(x) \
    24  (sizeof(x) / sizeof(x[0]))
    25 
    26 #define NIBBLE_TO_HEXCHAR(x) ( (x) < 0x0A ? (x) + '0' : (x) + 'A' - 0x0A )
    27 #define HEXCHAR_TO_NIBBLE(x) ( (x) < 'A' ? (x) - '0' : (x) - 'A' + 0x0A )
    28 #define VALID_HEXCHAR(x) ( ( (x) >= '0' && (x) <= '9' ) || ( (x) >= 'A' && (x) <= 'F' ) )
    29 #define MIN(x,y) ( (x) < (y) ? (x) : (y) )
    30 #define MAX(x,y) ( (x) > (y) ? (x) : (y) )
    31 #define SYSTICK_DIFF(since) ((uint16_t) (SystemGetSysTick() - since))
    32 #define SYSTICK_DIFF_100MS(since) (SYSTICK_DIFF(since) / 100)
    33 
    34 #define BITS_PER_BYTE 8
    35 
    36 uint16_t BufferToHexString(char* HexOut, uint16_t MaxChars, const void* Buffer, uint16_t ByteCount);
    37 uint16_t HexStringToBuffer(void* Buffer, uint16_t MaxBytes, const char* HexIn);
    38 
    39 INLINE uint8_t BitReverseByte(uint8_t Byte)
    40 {
    41  extern const uint8_t PROGMEM BitReverseByteTable[];
    42 
    43  return pgm_read_byte(&BitReverseByteTable[Byte]);
    44 }
    45 
    46 INLINE uint8_t OddParityBit(uint8_t Byte)
    47 {
    48  extern const uint8_t PROGMEM OddParityByteTable[];
    49 
    50  return pgm_read_byte(&OddParityByteTable[Byte]);
    51 }
    52 
    53 INLINE uint8_t StringLength(const char* Str, uint8_t MaxLen)
    54 {
    55  uint8_t StrLen = 0;
    56 
    57  while(MaxLen > 0) {
    58  if (*Str++ == '\0')
    59  break;
    60 
    61  MaxLen--;
    62  StrLen++;
    63  }
    64 
    65  return StrLen;
    66 }
    67 
    68 #endif /* COMMON_H_ */
    diff --git a/Doc/Doxygen/html/_configuration_8h.html b/Doc/Doxygen/html/_configuration_8h.html index 7213cda..7c28061 100644 --- a/Doc/Doxygen/html/_configuration_8h.html +++ b/Doc/Doxygen/html/_configuration_8h.html @@ -81,7 +81,7 @@ Classes diff --git a/Doc/Doxygen/html/_configuration_8h_source.html b/Doc/Doxygen/html/_configuration_8h_source.html index 62a17ce..b2f3324 100644 --- a/Doc/Doxygen/html/_configuration_8h_source.html +++ b/Doc/Doxygen/html/_configuration_8h_source.html @@ -73,7 +73,7 @@ $(function() { diff --git a/Doc/Doxygen/html/_configurations_8txt.html b/Doc/Doxygen/html/_configurations_8txt.html index 9ad4121..28c6797 100644 --- a/Doc/Doxygen/html/_configurations_8txt.html +++ b/Doc/Doxygen/html/_configurations_8txt.html @@ -65,7 +65,7 @@ $(function() { diff --git a/Doc/Doxygen/html/_crypto1_8h_source.html b/Doc/Doxygen/html/_crypto1_8h_source.html index 16d92f2..bc6e784 100644 --- a/Doc/Doxygen/html/_crypto1_8h_source.html +++ b/Doc/Doxygen/html/_crypto1_8h_source.html @@ -69,7 +69,7 @@ $(function() {
    1 #ifndef CRYPTO1_H
    2 #define CRYPTO1_H
    3 
    4 #include <stdint.h>
    5 #include <stdbool.h>
    6 
    7 void Crypto1GetState(uint8_t* pEven, uint8_t* pOdd);
    8 
    9 /* Gets the current keystream-bit, without shifting the internal LFSR */
    10 uint8_t Crypto1FilterOutput(void);
    11 
    12 /* Set up Crypto1 cipher using the given Key, Uid and CardNonce. Also encrypts
    13  * the CardNonce in-place while in non-linear mode. */
    14 void Crypto1Setup(uint8_t Key[6], uint8_t Uid[4], uint8_t CardNonce[4]);
    15 /* Same for nested auth. CardNonce[4]..[7] will contain the parity bits after return */
    16 void Crypto1SetupNested(uint8_t Key[6], uint8_t Uid[4], uint8_t CardNonce[8], bool Decrypt);
    17 
    18 /* Load the decrypted ReaderNonce into the Crypto1 state LFSR */
    19 void Crypto1Auth(uint8_t EncryptedReaderNonce[4]);
    20 
    21 /* Generate 8 Bits of key stream */
    22 uint8_t Crypto1Byte(void);
    23 
    24 /* Encrypt/Decrypt array */
    25 void Crypto1ByteArray(uint8_t* Buffer, uint8_t Count);
    26 void Crypto1ByteArrayWithParity(uint8_t* Buffer, uint8_t Count);
    27 
    28 /* Generate 4 Bits of key stream */
    29 uint8_t Crypto1Nibble(void);
    30 
    31 /* Execute 'ClockCount' cycles on the PRNG state 'State' */
    32 void Crypto1PRNG(uint8_t State[4], uint8_t ClockCount);
    33 
    34 /* Encrypts buffer with consideration of parity bits */
    35 void Crypto1EncryptWithParity(uint8_t * Buffer, uint8_t BitCount);
    36 
    37 /* Encrypts buffer with LFSR feedback within reader nonce and considers parity bits */
    38 void Crypto1ReaderAuthWithParity(uint8_t PlainReaderAnswerWithParityBits[9]);
    39 
    40 #endif //CRYPTO1_H
    diff --git a/Doc/Doxygen/html/_getting_started_8txt.html b/Doc/Doxygen/html/_getting_started_8txt.html index d6e2b3e..2808d55 100644 --- a/Doc/Doxygen/html/_getting_started_8txt.html +++ b/Doc/Doxygen/html/_getting_started_8txt.html @@ -65,7 +65,7 @@ $(function() { diff --git a/Doc/Doxygen/html/_i_s_o14443-2_a_8h_source.html b/Doc/Doxygen/html/_i_s_o14443-2_a_8h_source.html index 8caa098..1388a14 100644 --- a/Doc/Doxygen/html/_i_s_o14443-2_a_8h_source.html +++ b/Doc/Doxygen/html/_i_s_o14443-2_a_8h_source.html @@ -69,7 +69,7 @@ $(function() {
    1 /*
    2  * ISO14443-2A.h
    3  *
    4  * Created on: 18.02.2013
    5  * Author: skuser
    6  */
    7 
    8 #ifndef ISO14443_2A_H_
    9 #define ISO14443_2A_H_
    10 
    11 #include "Codec.h"
    12 
    13 #define ISO14443A_APP_NO_RESPONSE 0x0000
    14 #define ISO14443A_APP_CUSTOM_PARITY 0x1000
    15 
    16 #define ISO14443A_BUFFER_PARITY_OFFSET (CODEC_BUFFER_SIZE/2)
    17 
    18 /* Codec Interface */
    19 void ISO14443ACodecInit(void);
    20 void ISO14443ACodecDeInit(void);
    21 void ISO14443ACodecTask(void);
    22 
    23 
    24 
    25 #endif
    diff --git a/Doc/Doxygen/html/_i_s_o14443-3_a_8h_source.html b/Doc/Doxygen/html/_i_s_o14443-3_a_8h_source.html index a33dc48..3f5d9e0 100644 --- a/Doc/Doxygen/html/_i_s_o14443-3_a_8h_source.html +++ b/Doc/Doxygen/html/_i_s_o14443-3_a_8h_source.html @@ -69,7 +69,7 @@ $(function() {
    1 /*
    2  * ISO14443-2A.h
    3  *
    4  * Created on: 19.03.2013
    5  * Author: skuser
    6  */
    7 
    8 #ifndef ISO14443_3A_H_
    9 #define ISO14443_3A_H_
    10 
    11 #include "../Common.h"
    12 #include <string.h>
    13 
    14 #define ISO14443A_UID_SIZE_SINGLE 4 /* bytes */
    15 #define ISO14443A_UID_SIZE_DOUBLE 7
    16 #define ISO14443A_UID_SIZE_TRIPLE 10
    17 
    18 #define ISO14443A_CMD_REQA 0x26
    19 #define ISO14443A_CMD_WUPA 0x52
    20 #define ISO14443A_CMD_SELECT_CL1 0x93
    21 #define ISO14443A_CMD_SELECT_CL2 0x95
    22 #define ISO14443A_CMD_SELECT_CL3 0x97
    23 #define ISO14443A_CMD_HLTA 0x50
    24 
    25 #define ISO14443A_NVB_AC_START 0x20
    26 #define ISO14443A_NVB_AC_END 0x70
    27 
    28 #define ISO14443A_CL_UID_OFFSET 0
    29 #define ISO14443A_CL_UID_SIZE 4
    30 #define ISO14443A_CL_BCC_OFFSET 4
    31 #define ISO14443A_CL_BCC_SIZE 1 /* Byte */
    32 #define ISO14443A_CL_FRAME_SIZE ((ISO14443A_CL_UID_SIZE + ISO14443A_CL_BCC_SIZE) * 8) /* UID[N...N+3] || BCCN */
    33 #define ISO14443A_SAK_INCOMPLETE 0x04
    34 #define ISO14443A_SAK_COMPLETE_COMPLIANT 0x20
    35 #define ISO14443A_SAK_COMPLETE_NOT_COMPLIANT 0x00
    36 
    37 #define ISO14443A_ATQA_FRAME_SIZE (2 * 8) /* Bit */
    38 #define ISO14443A_SAK_FRAME_SIZE (3 * 8) /* Bit */
    39 
    40 #define ISO14443A_UID0_RANDOM 0x08
    41 #define ISO14443A_UID0_CT 0x88
    42 
    43 #define ISO14443A_CRCA_SIZE 2
    44 
    45 #define ISO14443A_CALC_BCC(ByteBuffer) \
    46  ( ByteBuffer[0] ^ ByteBuffer[1] ^ ByteBuffer[2] ^ ByteBuffer[3] )
    47 
    48 void ISO14443AAppendCRCA(void* Buffer, uint16_t ByteCount);
    49 bool ISO14443ACheckCRCA(const void* Buffer, uint16_t ByteCount);
    50 
    51 INLINE bool ISO14443ASelect(void* Buffer, uint16_t* BitCount, uint8_t* UidCL, uint8_t SAKValue);
    52 INLINE bool ISO14443AWakeUp(void* Buffer, uint16_t* BitCount, uint16_t ATQAValue, bool FromHalt);
    53 
    54 INLINE
    55 bool ISO14443ASelect(void* Buffer, uint16_t* BitCount, uint8_t* UidCL, uint8_t SAKValue)
    56 {
    57  uint8_t* DataPtr = (uint8_t*) Buffer;
    58  uint8_t NVB = DataPtr[1];
    59  //uint8_t CollisionByteCount = (NVB >> 4) & 0x0F;
    60  //uint8_t CollisionBitCount = (NVB >> 0) & 0x0F;
    61 
    62  switch (NVB) {
    63  case ISO14443A_NVB_AC_START:
    64  /* Start of anticollision procedure.
    65  * Send whole UID CLn + BCC */
    66  DataPtr[0] = UidCL[0];
    67  DataPtr[1] = UidCL[1];
    68  DataPtr[2] = UidCL[2];
    69  DataPtr[3] = UidCL[3];
    70  DataPtr[4] = ISO14443A_CALC_BCC(DataPtr);
    71 
    72  *BitCount = ISO14443A_CL_FRAME_SIZE;
    73 
    74  return false;
    75 
    76  case ISO14443A_NVB_AC_END:
    77  /* End of anticollision procedure.
    78  * Send SAK CLn if we are selected. */
    79  if ( (DataPtr[2] == UidCL[0]) &&
    80  (DataPtr[3] == UidCL[1]) &&
    81  (DataPtr[4] == UidCL[2]) &&
    82  (DataPtr[5] == UidCL[3]) ) {
    83 
    84  DataPtr[0] = SAKValue;
    85  ISO14443AAppendCRCA(Buffer, 1);
    86 
    87  *BitCount = ISO14443A_SAK_FRAME_SIZE;
    88  return true;
    89  } else {
    90  /* We have not been selected. Don't send anything. */
    91  *BitCount = 0;
    92  return false;
    93  }
    94  default:
    95  {
    96  uint8_t CollisionByteCount = ((NVB >> 4) & 0x0f) - 2;
    97  uint8_t CollisionBitCount = (NVB >> 0) & 0x0f;
    98  uint8_t mask = 0xFF >> (8 - CollisionBitCount);
    99  // Since the UidCL does not contain the BCC, we have to distinguish here
    100  if (
    101  ((CollisionByteCount == 5 || (CollisionByteCount == 4 && CollisionBitCount > 0)) && memcmp(UidCL, &DataPtr[2], 4) == 0 && (ISO14443A_CALC_BCC(UidCL) & mask) == (DataPtr[6] & mask))
    102  ||
    103  (CollisionByteCount == 4 && CollisionBitCount == 0 && memcmp(UidCL, &DataPtr[2], 4) == 0)
    104  ||
    105  (CollisionByteCount < 4 && memcmp(UidCL, &DataPtr[2], CollisionByteCount) == 0 && (UidCL[CollisionByteCount] & mask) == (DataPtr[CollisionByteCount + 2] & mask))
    106  )
    107  {
    108  DataPtr[0] = UidCL[0];
    109  DataPtr[1] = UidCL[1];
    110  DataPtr[2] = UidCL[2];
    111  DataPtr[3] = UidCL[3];
    112  DataPtr[4] = ISO14443A_CALC_BCC(DataPtr);
    113 
    114  *BitCount = ISO14443A_CL_FRAME_SIZE;
    115  } else {
    116  *BitCount = 0;
    117  }
    118  return false;
    119  }
    120  /* TODO: No anticollision supported */
    121  *BitCount = 0;
    122  return false;
    123  }
    124 }
    125 
    126 INLINE
    127 bool ISO14443AWakeUp(void* Buffer, uint16_t* BitCount, uint16_t ATQAValue, bool FromHalt)
    128 {
    129  uint8_t* DataPtr = (uint8_t*) Buffer;
    130 
    131  if ( ((! FromHalt) && (DataPtr[0] == ISO14443A_CMD_REQA)) ||
    132  (DataPtr[0] == ISO14443A_CMD_WUPA) ){
    133  DataPtr[0] = (ATQAValue >> 0) & 0x00FF;
    134  DataPtr[1] = (ATQAValue >> 8) & 0x00FF;
    135 
    136  *BitCount = ISO14443A_ATQA_FRAME_SIZE;
    137 
    138  return true;
    139  } else {
    140  *BitCount = 0;
    141 
    142  return false;
    143  }
    144 }
    145 
    146 #endif
    diff --git a/Doc/Doxygen/html/_l_e_d_8h_source.html b/Doc/Doxygen/html/_l_e_d_8h_source.html index 84021ce..eb89707 100644 --- a/Doc/Doxygen/html/_l_e_d_8h_source.html +++ b/Doc/Doxygen/html/_l_e_d_8h_source.html @@ -69,7 +69,7 @@ $(function() {
    1 /*
    2  * LED.h
    3  *
    4  * Created on: 10.02.2013
    5  * Author: skuser
    6  */
    7 
    8 #ifndef LED_H
    9 #define LED_H
    10 
    11 #include <avr/io.h>
    12 #include "Common.h"
    13 
    14 #define LED_PORT PORTA
    15 #define LED_GREEN PIN4_bm
    16 #define LED_RED PIN3_bm
    17 #define LED_MASK (LED_GREEN | LED_RED)
    18 
    19 typedef enum LEDFunctionEnum {
    20  LED_NO_FUNC = 0, /* Don't light up the LED */
    21  LED_POWERED, /* Light up the LED whenever the Chameleon is powered */
    22 
    23  LED_TERMINAL_CONN, /* A Terminal/USB connection has been established */
    24  LED_TERMINAL_RXTX, /* There is traffic on the terminal */
    25 
    26  LED_SETTING_CHANGE, /* Outputs a blink code that shows the current setting */
    27 
    28  LED_MEMORY_STORED, /* Blink once when memory has been stored to flash */
    29  LED_MEMORY_CHANGED, /* Switch LED on when card memory has changed compared to flash */
    30 
    31  LED_FIELD_DETECTED, /* Shows LED while a reader field is being detected or turned on by the chameleon itself */
    32 
    33  LED_CODEC_RX, /* Blink LED when receiving codec data */
    34  LED_CODEC_TX, /* Blink LED when transmitting codec data */
    35 
    36  LED_LOG_MEM_FULL, /* Light up if log memory is full. */
    37 
    38  //TODO: LED_APP_SELECTED, /* Show LED while the correct UID has been selected and the application is active */
    39  /* Has to be last element */
    40  LED_FUNC_COUNT
    41 } LEDHookEnum;
    42 
    43 typedef enum LEDActionEnum {
    44  LED_NO_ACTION = 0x00,
    45  LED_OFF = 0x10,
    46  LED_ON = 0x11,
    47  LED_TOGGLE = 0x12,
    48  LED_PULSE = 0x13,
    49  LED_BLINK = 0x20,
    50  LED_BLINK_1X = 0x20,
    51  LED_BLINK_2X, /* Have to be sequentially ordered */
    52  LED_BLINK_3X,
    53  LED_BLINK_4X,
    54  LED_BLINK_5X,
    55  LED_BLINK_6X,
    56  LED_BLINK_7X,
    57  LED_BLINK_8X,
    58 } LEDActionEnum;
    59 
    60 
    61 
    62 void LEDInit(void);
    63 void LEDTick(void);
    64 
    65 void LEDGetFuncList(char* List, uint16_t BufferSize);
    66 void LEDSetFuncById(uint8_t Mask, LEDHookEnum Func);
    67 void LEDGetFuncByName(uint8_t Mask, char* Function, uint16_t BufferSize);
    68 bool LEDSetFuncByName(uint8_t Mask, const char* Function);
    69 
    70 #endif /* LED_H */
    diff --git a/Doc/Doxygen/html/_l_e_d_8txt.html b/Doc/Doxygen/html/_l_e_d_8txt.html index 97c8396..116a796 100644 --- a/Doc/Doxygen/html/_l_e_d_8txt.html +++ b/Doc/Doxygen/html/_l_e_d_8txt.html @@ -65,7 +65,7 @@ $(function() { diff --git a/Doc/Doxygen/html/_l_e_d_hook_8h_source.html b/Doc/Doxygen/html/_l_e_d_hook_8h_source.html index e8da0af..edc9398 100644 --- a/Doc/Doxygen/html/_l_e_d_hook_8h_source.html +++ b/Doc/Doxygen/html/_l_e_d_hook_8h_source.html @@ -70,7 +70,7 @@ $(function() { diff --git a/Doc/Doxygen/html/_l_e_ds_8txt.html b/Doc/Doxygen/html/_l_e_ds_8txt.html index a6c9c43..d99635b 100644 --- a/Doc/Doxygen/html/_l_e_ds_8txt.html +++ b/Doc/Doxygen/html/_l_e_ds_8txt.html @@ -65,7 +65,7 @@ $(function() { diff --git a/Doc/Doxygen/html/_l_u_f_a_config_8h.html b/Doc/Doxygen/html/_l_u_f_a_config_8h.html index d77c440..64b5296 100644 --- a/Doc/Doxygen/html/_l_u_f_a_config_8h.html +++ b/Doc/Doxygen/html/_l_u_f_a_config_8h.html @@ -78,7 +78,7 @@ $(function() { diff --git a/Doc/Doxygen/html/_l_u_f_a_config_8h_source.html b/Doc/Doxygen/html/_l_u_f_a_config_8h_source.html index f780dc6..6762736 100644 --- a/Doc/Doxygen/html/_l_u_f_a_config_8h_source.html +++ b/Doc/Doxygen/html/_l_u_f_a_config_8h_source.html @@ -69,7 +69,7 @@ $(function() { Go to the documentation of this file.
    1 /*
    2  LUFA Library
    3  Copyright (C) Dean Camera, 2012.
    4 
    5  dean [at] fourwalledcubicle [dot] com
    6  www.lufa-lib.org
    7 */
    8 
    9 /*
    10  Copyright 2012 Dean Camera (dean [at] fourwalledcubicle [dot] com)
    11 
    12  Permission to use, copy, modify, distribute, and sell this
    13  software and its documentation for any purpose is hereby granted
    14  without fee, provided that the above copyright notice appear in
    15  all copies and that both that the copyright notice and this
    16  permission notice and warranty disclaimer appear in supporting
    17  documentation, and that the name of the author not be used in
    18  advertising or publicity pertaining to distribution of the
    19  software without specific, written prior permission.
    20 
    21  The author disclaim all warranties with regard to this
    22  software, including all implied warranties of merchantability
    23  and fitness. In no event shall the author be liable for any
    24  special, indirect or consequential damages or any damages
    25  whatsoever resulting from loss of use, data or profits, whether
    26  in an action of contract, negligence or other tortious action,
    27  arising out of or in connection with the use or performance of
    28  this software.
    29 */
    30 
    42 #ifndef _LUFA_CONFIG_H_
    43 #define _LUFA_CONFIG_H_
    44 
    45  /* Non-USB Related Configuration Tokens: */
    46 // #define DISABLE_TERMINAL_CODES
    47 
    48  /* USB Class Driver Related Tokens: */
    49 // #define HID_HOST_BOOT_PROTOCOL_ONLY
    50 // #define HID_STATETABLE_STACK_DEPTH {Insert Value Here}
    51 // #define HID_USAGE_STACK_DEPTH {Insert Value Here}
    52 // #define HID_MAX_COLLECTIONS {Insert Value Here}
    53 // #define HID_MAX_REPORTITEMS {Insert Value Here}
    54 // #define HID_MAX_REPORT_IDS {Insert Value Here}
    55 // #define NO_CLASS_DRIVER_AUTOFLUSH
    56 
    57  /* General USB Driver Related Tokens: */
    58  #define USE_STATIC_OPTIONS \
    59  (USB_OPT_BUSEVENT_PRIMED | USB_DEVICE_OPT_FULLSPEED | /*USB_OPT_PLLCLKSRC*/ USB_OPT_RC32MCLKSRC)
    60  #define USB_DEVICE_ONLY
    61 // #define USB_STREAM_TIMEOUT_MS {Insert Value Here}
    62 // #define NO_LIMITED_CONTROLLER_CONNECT
    63 // #define NO_SOF_EVENTS
    64 
    65  /* USB Device Mode Driver Related Tokens: */
    66 // #define USE_RAM_DESCRIPTORS
    67  #define USE_FLASH_DESCRIPTORS
    68 // #define USE_EEPROM_DESCRIPTORS
    69 // #define NO_INTERNAL_SERIAL
    70  #define FIXED_CONTROL_ENDPOINT_SIZE 8
    71 // #define DEVICE_STATE_AS_GPIOR {Insert Value Here}
    72  #define FIXED_NUM_CONFIGURATIONS 1
    73 // #define CONTROL_ONLY_DEVICE
    74  #define MAX_ENDPOINT_INDEX 5
    75 // #define NO_DEVICE_REMOTE_WAKEUP
    76 // #define NO_DEVICE_SELF_POWER
    77 
    78 #endif
    diff --git a/Doc/Doxygen/html/_l_u_f_a_descriptors_8c.html b/Doc/Doxygen/html/_l_u_f_a_descriptors_8c.html index 8e28502..c3d0873 100644 --- a/Doc/Doxygen/html/_l_u_f_a_descriptors_8c.html +++ b/Doc/Doxygen/html/_l_u_f_a_descriptors_8c.html @@ -207,7 +207,7 @@ Variables diff --git a/Doc/Doxygen/html/_l_u_f_a_descriptors_8h.html b/Doc/Doxygen/html/_l_u_f_a_descriptors_8h.html index 9cca40b..f551717 100644 --- a/Doc/Doxygen/html/_l_u_f_a_descriptors_8h.html +++ b/Doc/Doxygen/html/_l_u_f_a_descriptors_8h.html @@ -215,7 +215,7 @@ Functions diff --git a/Doc/Doxygen/html/_l_u_f_a_descriptors_8h_source.html b/Doc/Doxygen/html/_l_u_f_a_descriptors_8h_source.html index 7f20828..d653292 100644 --- a/Doc/Doxygen/html/_l_u_f_a_descriptors_8h_source.html +++ b/Doc/Doxygen/html/_l_u_f_a_descriptors_8h_source.html @@ -71,7 +71,7 @@ $(function() { diff --git a/Doc/Doxygen/html/_log_8h.html b/Doc/Doxygen/html/_log_8h.html index 7da5bef..182fe4e 100644 --- a/Doc/Doxygen/html/_log_8h.html +++ b/Doc/Doxygen/html/_log_8h.html @@ -181,7 +181,7 @@ Enumerations diff --git a/Doc/Doxygen/html/_log_8h_source.html b/Doc/Doxygen/html/_log_8h_source.html index 325a595..d899e4b 100644 --- a/Doc/Doxygen/html/_log_8h_source.html +++ b/Doc/Doxygen/html/_log_8h_source.html @@ -95,7 +95,7 @@ $(function() { diff --git a/Doc/Doxygen/html/_log_8txt.html b/Doc/Doxygen/html/_log_8txt.html index 2b5cef1..a067ec5 100644 --- a/Doc/Doxygen/html/_log_8txt.html +++ b/Doc/Doxygen/html/_log_8txt.html @@ -65,7 +65,7 @@ $(function() { diff --git a/Doc/Doxygen/html/_main_page_8txt.html b/Doc/Doxygen/html/_main_page_8txt.html index cbf26b0..95e0ab0 100644 --- a/Doc/Doxygen/html/_main_page_8txt.html +++ b/Doc/Doxygen/html/_main_page_8txt.html @@ -65,7 +65,7 @@ $(function() { diff --git a/Doc/Doxygen/html/_map_8h_source.html b/Doc/Doxygen/html/_map_8h_source.html index 5388d36..f661ed3 100644 --- a/Doc/Doxygen/html/_map_8h_source.html +++ b/Doc/Doxygen/html/_map_8h_source.html @@ -69,7 +69,7 @@ $(function() {
    1 /*
    2  * Map.h
    3  *
    4  * Created on: 07.12.2014
    5  * Author: sk
    6  */
    7 
    8 #ifndef MAP_H_
    9 #define MAP_H_
    10 
    11 #include <stdint.h>
    12 #include <stdbool.h>
    13 #include <avr/pgmspace.h>
    14 
    15 #define MAP_TEXT_BUF_SIZE 32
    16 #define MAP_MAX_TEXT_SIZE (MAP_TEXT_BUF_SIZE - 1)
    17 
    18 typedef uint8_t MapIdType;
    19 typedef const char* MapTextPtrType;
    20 
    21 const typedef struct {
    22  MapIdType Id;
    23  const char Text[MAP_TEXT_BUF_SIZE];
    24 } MapEntryType;
    25 
    26 bool MapIdToText(const MapEntryType* MapPtr, uint8_t MapSize, MapIdType Id, char* Text, uint16_t MaxBufferSize);
    27 bool MapTextToId(const MapEntryType* MapPtr, uint8_t MapSize, MapTextPtrType Text, MapIdType* IdPtr);
    28 void MapToString(const MapEntryType* MapPtr, uint8_t MapSize, char* String, uint16_t MaxBufferSize);
    29 
    30 #endif /* MAP_H_ */
    diff --git a/Doc/Doxygen/html/_memory_8h_source.html b/Doc/Doxygen/html/_memory_8h_source.html index 5e0d9a9..462b713 100644 --- a/Doc/Doxygen/html/_memory_8h_source.html +++ b/Doc/Doxygen/html/_memory_8h_source.html @@ -69,7 +69,7 @@ $(function() {
    1 /*
    2  * Flash.h
    3  *
    4  * Created on: 20.03.2013
    5  * Author: skuser
    6  */
    7 
    8 #ifndef MEMORY_H_
    9 #define MEMORY_H_
    10 
    11 #define MEMORY_SIZE (FLASH_DATA_SIZE) /* From makefile */
    12 #define MEMORY_INIT_VALUE 0x00
    13 #define MEMORY_SIZE_PER_SETTING 8192
    14 
    15 #ifndef __ASSEMBLER__
    16 #include "Common.h"
    17 
    18 void MemoryInit(void);
    19 void MemoryReadBlock(void* Buffer, uint16_t Address, uint16_t ByteCount);
    20 void MemoryWriteBlock(const void* Buffer, uint16_t Address, uint16_t ByteCount);
    21 void MemoryClear(void);
    22 
    23 
    24 void MemoryRecall(void);
    25 void MemoryStore(void);
    26 
    27 /* For use with XModem */
    28 bool MemoryUploadBlock(void* Buffer, uint32_t BlockAddress, uint16_t ByteCount);
    29 bool MemoryDownloadBlock(void* Buffer, uint32_t BlockAddress, uint16_t ByteCount);
    30 
    31 /* EEPROM functions */
    32 uint16_t WriteEEPBlock(uint16_t Address, const void *SrcPtr, uint16_t ByteCount);
    33 uint16_t ReadEEPBlock(uint16_t Address, void *DestPtr, uint16_t ByteCount);
    34 
    35 #endif /* __ASSEMBLER__ */
    36 
    37 #endif /* MEMORY_H_ */
    diff --git a/Doc/Doxygen/html/_mifare_classic_8h_source.html b/Doc/Doxygen/html/_mifare_classic_8h_source.html index b917c08..2f272de 100644 --- a/Doc/Doxygen/html/_mifare_classic_8h_source.html +++ b/Doc/Doxygen/html/_mifare_classic_8h_source.html @@ -69,7 +69,7 @@ $(function() {
    1 /*
    2  * MifareClassic.h
    3  *
    4  * Created on: 13.05.2013
    5  * Author: skuser
    6  */
    7 
    8 #ifndef MIFARECLASSIC_H_
    9 #define MIFARECLASSIC_H_
    10 
    11 #include "Application.h"
    12 #include "ISO14443-3A.h"
    13 
    14 #define MIFARE_CLASSIC_UID_SIZE ISO14443A_UID_SIZE_SINGLE
    15 #define MIFARE_CLASSIC_1K_MEM_SIZE 1024
    16 #define MIFARE_CLASSIC_4K_MEM_SIZE 4096
    17 
    18 void MifareClassicAppInit1K(void);
    19 void MifareClassicAppInit1K7B(void);
    20 void MifareClassicAppInit4K(void);
    21 void MifareClassicAppReset(void);
    22 void MifareClassicAppTask(void);
    23 
    24 uint16_t MifareClassicAppProcess(uint8_t* Buffer, uint16_t BitCount);
    25 
    26 void MifareClassicGetUid(ConfigurationUidType Uid);
    27 void MifareClassicSetUid(ConfigurationUidType Uid);
    28 
    29 
    30 #endif /* MIFARECLASSIC_H_ */
    diff --git a/Doc/Doxygen/html/_mifare_ultralight_8h_source.html b/Doc/Doxygen/html/_mifare_ultralight_8h_source.html index c7655a2..de87b40 100644 --- a/Doc/Doxygen/html/_mifare_ultralight_8h_source.html +++ b/Doc/Doxygen/html/_mifare_ultralight_8h_source.html @@ -69,7 +69,7 @@ $(function() {
    1 /*
    2  * MifareUltralight.h
    3  *
    4  * Created on: 20.03.2013
    5  * Author: skuser
    6  */
    7 
    8 #ifndef MIFAREULTRALIGHT_H_
    9 #define MIFAREULTRALIGHT_H_
    10 
    11 #include "Application.h"
    12 #include "ISO14443-3A.h"
    13 
    14 #define MIFARE_ULTRALIGHT_UID_SIZE ISO14443A_UID_SIZE_DOUBLE
    15 #define MIFARE_ULTRALIGHT_PAGE_SIZE 4
    16 #define MIFARE_ULTRALIGHT_PAGES 16
    17 #define MIFARE_ULTRALIGHT_EV11_PAGES 20
    18 #define MIFARE_ULTRALIGHT_EV12_PAGES 41
    19 #define MIFARE_ULTRALIGHT_MEM_SIZE (MIFARE_ULTRALIGHT_PAGES * MIFARE_ULTRALIGHT_PAGE_SIZE)
    20 #define MIFARE_ULTRALIGHT_EV11_MEM_SIZE (MIFARE_ULTRALIGHT_EV11_PAGES * MIFARE_ULTRALIGHT_PAGE_SIZE)
    21 #define MIFARE_ULTRALIGHT_EV12_MEM_SIZE (MIFARE_ULTRALIGHT_EV12_PAGES * MIFARE_ULTRALIGHT_PAGE_SIZE)
    22 
    23 void MifareUltralightAppInit(void);
    24 void MifareUltralightEV11AppInit(void);
    25 void MifareUltralightEV12AppInit(void);
    26 void MifareUltralightAppReset(void);
    27 void MifareUltralightAppTask(void);
    28 
    29 uint16_t MifareUltralightAppProcess(uint8_t* Buffer, uint16_t BitCount);
    30 
    31 void MifareUltralightGetUid(ConfigurationUidType Uid);
    32 void MifareUltralightSetUid(ConfigurationUidType Uid);
    33 
    34 
    35 
    36 #endif /* MIFAREULTRALIGHT_H_ */
    diff --git a/Doc/Doxygen/html/_page_14443_a_reader.html b/Doc/Doxygen/html/_page_14443_a_reader.html index 3cb84e6..53637d8 100644 --- a/Doc/Doxygen/html/_page_14443_a_reader.html +++ b/Doc/Doxygen/html/_page_14443_a_reader.html @@ -150,7 +150,7 @@ Each of the following commands returns INVALID COMMAND USAGE on a n diff --git a/Doc/Doxygen/html/_page__buttons.html b/Doc/Doxygen/html/_page__buttons.html index 6679675..d426e87 100644 --- a/Doc/Doxygen/html/_page__buttons.html +++ b/Doc/Doxygen/html/_page__buttons.html @@ -108,7 +108,7 @@ $(function() { diff --git a/Doc/Doxygen/html/_page__command_line.html b/Doc/Doxygen/html/_page__command_line.html index d1dfa6c..f056095 100644 --- a/Doc/Doxygen/html/_page__command_line.html +++ b/Doc/Doxygen/html/_page__command_line.html @@ -270,7 +270,7 @@ When setting the timeout to zero, there is no timeout and thus a process may con diff --git a/Doc/Doxygen/html/_page__configurations.html b/Doc/Doxygen/html/_page__configurations.html index 55f921c..de77bb7 100644 --- a/Doc/Doxygen/html/_page__configurations.html +++ b/Doc/Doxygen/html/_page__configurations.html @@ -104,7 +104,7 @@ $(function() { diff --git a/Doc/Doxygen/html/_page__getting_started.html b/Doc/Doxygen/html/_page__getting_started.html index 1759cfe..f5205da 100644 --- a/Doc/Doxygen/html/_page__getting_started.html +++ b/Doc/Doxygen/html/_page__getting_started.html @@ -96,7 +96,7 @@ $(function() { diff --git a/Doc/Doxygen/html/_page__l_e_d.html b/Doc/Doxygen/html/_page__l_e_d.html index 6ed25e4..1976aa1 100644 --- a/Doc/Doxygen/html/_page__l_e_d.html +++ b/Doc/Doxygen/html/_page__l_e_d.html @@ -92,7 +92,7 @@ $(function() { diff --git a/Doc/Doxygen/html/_page__l_e_ds.html b/Doc/Doxygen/html/_page__l_e_ds.html index 9f476e9..8313091 100644 --- a/Doc/Doxygen/html/_page__l_e_ds.html +++ b/Doc/Doxygen/html/_page__l_e_ds.html @@ -96,7 +96,7 @@ $(function() { diff --git a/Doc/Doxygen/html/_page__log.html b/Doc/Doxygen/html/_page__log.html index 2423668..6d8ea57 100644 --- a/Doc/Doxygen/html/_page__log.html +++ b/Doc/Doxygen/html/_page__log.html @@ -95,7 +95,7 @@ $(function() { diff --git a/Doc/Doxygen/html/_page__settings.html b/Doc/Doxygen/html/_page__settings.html index fca5b83..b8c8ccb 100644 --- a/Doc/Doxygen/html/_page__settings.html +++ b/Doc/Doxygen/html/_page__settings.html @@ -83,7 +83,7 @@ $(function() { diff --git a/Doc/Doxygen/html/_page__uploading_downloading.html b/Doc/Doxygen/html/_page__uploading_downloading.html index 9a72625..ed3122f 100644 --- a/Doc/Doxygen/html/_page__uploading_downloading.html +++ b/Doc/Doxygen/html/_page__uploading_downloading.html @@ -74,7 +74,7 @@ $(function() { diff --git a/Doc/Doxygen/html/_random_8h_source.html b/Doc/Doxygen/html/_random_8h_source.html index 2e9aa54..2a1a662 100644 --- a/Doc/Doxygen/html/_random_8h_source.html +++ b/Doc/Doxygen/html/_random_8h_source.html @@ -69,7 +69,7 @@ $(function() {
    1 /*
    2  * Random.h
    3  *
    4  * Created on: 22.03.2013
    5  * Author: skuser
    6  */
    7 
    8 #ifndef RANDOM_H_
    9 #define RANDOM_H_
    10 
    11 #include "Common.h"
    12 
    13 void RandomInit(void);
    14 uint8_t RandomGetByte(void);
    15 void RandomGetBuffer(void* Buffer, uint8_t ByteCount);
    16 void RandomTick(void);
    17 
    18 #endif /* RANDOM_H_ */
    diff --git a/Doc/Doxygen/html/_reader14443-2_a_8h_source.html b/Doc/Doxygen/html/_reader14443-2_a_8h_source.html index 48df12f..36d8b7e 100644 --- a/Doc/Doxygen/html/_reader14443-2_a_8h_source.html +++ b/Doc/Doxygen/html/_reader14443-2_a_8h_source.html @@ -69,7 +69,7 @@ $(function() {
    1 /*
    2  * Reader14443-2A.h
    3  *
    4  * Created on: 26.08.2014
    5  * Author: sk
    6  */
    7 
    8 #ifndef READER14443_2A_H_
    9 #define READER14443_2A_H_
    10 
    11 #include "Codec.h"
    12 #include "Terminal/CommandLine.h"
    13 
    14 /* Codec Interface */
    15 void Reader14443ACodecInit(void);
    16 void Reader14443ACodecDeInit(void);
    17 void Reader14443ACodecTask(void);
    18 
    19 /* Application Interface */
    20 void Reader14443ACodecStart(void);
    21 void Reader14443ACodecReset(void);
    22 
    23 #endif /* READER14443_2A_H_ */
    diff --git a/Doc/Doxygen/html/_reader14443_a_8h_source.html b/Doc/Doxygen/html/_reader14443_a_8h_source.html index aa3df38..8becd68 100644 --- a/Doc/Doxygen/html/_reader14443_a_8h_source.html +++ b/Doc/Doxygen/html/_reader14443_a_8h_source.html @@ -69,7 +69,7 @@ $(function() {
    1 #ifndef READER14443A_H
    2 #define READER14443A_H
    3 
    4 #include "Application.h"
    5 #include "Codec/Codec.h"
    6 
    7 #define CRC_INIT 0x6363
    8 
    9 uint8_t ReaderSendBuffer[CODEC_BUFFER_SIZE];
    10 uint16_t ReaderSendBitCount;
    11 
    12 void Reader14443AAppInit(void);
    13 void Reader14443AAppReset(void);
    14 void Reader14443AAppTask(void);
    15 void Reader14443AAppTick(void);
    16 void Reader14443AAppTimeout(void);
    17 
    18 uint16_t Reader14443AAppProcess(uint8_t* Buffer, uint16_t BitCount);
    19 
    20 uint16_t addParityBits(uint8_t * Buffer, uint16_t bits);
    21 uint16_t removeParityBits(uint8_t * Buffer, uint16_t BitCount);
    22 uint16_t removeSOC(uint8_t * Buffer, uint16_t BitCount);
    23 bool checkParityBits(uint8_t * Buffer, uint16_t BitCount);
    24 uint16_t ISO14443_CRCA(uint8_t * Buffer, uint8_t ByteCount);
    25 
    26 typedef enum {
    27  Reader14443_Do_Nothing,
    28  Reader14443_Send,
    29  Reader14443_Send_Raw,
    30  Reader14443_Get_UID,
    31  Reader14443_Autocalibrate,
    32  Reader14443_Read_MF_Ultralight,
    33  Reader14443_Identify
    34 } Reader14443Command;
    35 
    36 
    37 #endif //READER14443A_H
    diff --git a/Doc/Doxygen/html/_reader_8txt.html b/Doc/Doxygen/html/_reader_8txt.html index 886ce76..503a4a1 100644 --- a/Doc/Doxygen/html/_reader_8txt.html +++ b/Doc/Doxygen/html/_reader_8txt.html @@ -65,7 +65,7 @@ $(function() { diff --git a/Doc/Doxygen/html/_settings_8h.html b/Doc/Doxygen/html/_settings_8h.html index c4af6a0..758d69f 100644 --- a/Doc/Doxygen/html/_settings_8h.html +++ b/Doc/Doxygen/html/_settings_8h.html @@ -84,7 +84,7 @@ Classes diff --git a/Doc/Doxygen/html/_settings_8h_source.html b/Doc/Doxygen/html/_settings_8h_source.html index e17bc15..37157ff 100644 --- a/Doc/Doxygen/html/_settings_8h_source.html +++ b/Doc/Doxygen/html/_settings_8h_source.html @@ -77,7 +77,7 @@ $(function() { diff --git a/Doc/Doxygen/html/_settings_8txt.html b/Doc/Doxygen/html/_settings_8txt.html index 81c72af..c1475fc 100644 --- a/Doc/Doxygen/html/_settings_8txt.html +++ b/Doc/Doxygen/html/_settings_8txt.html @@ -65,7 +65,7 @@ $(function() { diff --git a/Doc/Doxygen/html/_system_8h_source.html b/Doc/Doxygen/html/_system_8h_source.html index 0c488fa..7809790 100644 --- a/Doc/Doxygen/html/_system_8h_source.html +++ b/Doc/Doxygen/html/_system_8h_source.html @@ -69,7 +69,7 @@ $(function() {
    1 /*
    2  * System.h
    3  *
    4  * Created on: 10.02.2013
    5  * Author: skuser
    6  */
    7 
    8 #ifndef SYSTEM_H
    9 #define SYSTEM_H
    10 
    11 #include <avr/io.h>
    12 #include <avr/pgmspace.h>
    13 #include <avr/interrupt.h>
    14 #include <stddef.h>
    15 #include <stdbool.h>
    16 #include "Common.h"
    17 
    18 #define F_RTC 1000
    19 #define SYSTEM_MILLISECONDS_TO_RTC_CYCLES(x) \
    20  ( (uint16_t) ( (double) F_RTC * x / 1E3 + 0.5) )
    21 
    22 #define SYSTEM_TICK_WIDTH 7 /* Bits */
    23 #define SYSTEM_TICK_PERIOD (1<<7)
    24 #define SYSTEM_TICK_MS (SYSTEM_TICK_PERIOD)
    25 #define SYSTEM_TICK_FREQ (1000 / SYSTEM_TICK_PERIOD)
    26 
    27 #define SYSTEM_SMODE_PSAVE SLEEP_SMODE_PSAVE_gc
    28 #define SYSTEM_SMODE_IDLE SLEEP_SMODE_IDLE_gc
    29 
    30 /* Use GPIORE and GPIORF as global tick register */
    31 #define SYSTEM_TICK_REGISTER (*((volatile uint16_t*) &GPIORE))
    32 
    33 void SystemInit(void);
    34 void SystemReset(void);
    35 void SystemEnterBootloader(void);
    36 void SystemStartUSBClock(void);
    37 void SystemStopUSBClock(void);
    38 void SystemInterruptInit(void);
    39 INLINE bool SystemTick100ms(void);
    40 
    41 INLINE bool SystemTick100ms(void)
    42 {
    43  if (RTC.INTFLAGS & RTC_COMPIF_bm) {
    44  while(RTC.STATUS & RTC_SYNCBUSY_bm)
    45  ;
    46 
    47  RTC.INTFLAGS = RTC_COMPIF_bm;
    48  return true;
    49  }
    50 
    51  return false;
    52 }
    53 
    54 INLINE void SystemTickClearFlag(void)
    55 {
    56  while(RTC.STATUS & RTC_SYNCBUSY_bm)
    57  ;
    58 
    59  RTC.INTFLAGS = RTC_COMPIF_bm;
    60 }
    61 
    62 INLINE uint16_t SystemGetSysTick(void) {
    63  return SYSTEM_TICK_REGISTER | RTC.CNT;
    64 }
    65 
    66 #endif /* SYSTEM_H */
    diff --git a/Doc/Doxygen/html/_terminal_8h_source.html b/Doc/Doxygen/html/_terminal_8h_source.html index b73ba63..0197697 100644 --- a/Doc/Doxygen/html/_terminal_8h_source.html +++ b/Doc/Doxygen/html/_terminal_8h_source.html @@ -69,7 +69,7 @@ $(function() {
    1 /*
    2  * CommandLine.h
    3  *
    4  * Created on: 10.02.2013
    5  * Author: skuser
    6  */
    7 
    8 #ifndef TERMINAL_H_
    9 #define TERMINAL_H_
    10 
    11 #include "../Common.h"
    12 #include "../LUFA/Drivers/USB/USB.h"
    13 #include "XModem.h"
    14 #include "CommandLine.h"
    15 
    16 #define TERMINAL_VBUS_PORT PORTD
    17 #define TERMINAL_VBUS_MASK PIN5_bm
    18 
    19 #define TERMINAL_BUFFER_SIZE 512
    20 
    21 typedef enum {
    22  TERMINAL_UNINITIALIZED,
    23  TERMINAL_INITIALIZING,
    24  TERMINAL_INITIALIZED,
    25  TERMINAL_UNITIALIZING
    26 } TerminalStateEnum;
    27 
    28 extern uint8_t TerminalBuffer[TERMINAL_BUFFER_SIZE];
    29 extern USB_ClassInfo_CDC_Device_t TerminalHandle;
    30 extern TerminalStateEnum TerminalState;
    31 
    32 void TerminalInit(void);
    33 void TerminalTask(void);
    34 void TerminalTick(void);
    35 
    36 /*void TerminalSendHex(void* Buffer, uint16_t ByteCount);*/
    37 INLINE void TerminalSendByte(uint8_t Byte);
    38 void TerminalSendBlock(const void* Buffer, uint16_t ByteCount);
    39 
    40 INLINE void TerminalSendChar(char c);
    41 void TerminalSendString(const char* s);
    42 void TerminalSendStringP(const char* s);
    43 
    44 void EVENT_USB_Device_Connect(void);
    45 void EVENT_USB_Device_Disconnect(void);
    46 void EVENT_USB_Device_ConfigurationChanged(void);
    47 void EVENT_USB_Device_ControlRequest(void);
    48 
    49 INLINE void TerminalSendChar(char c) { CDC_Device_SendByte(&TerminalHandle, c); }
    50 INLINE void TerminalSendByte(uint8_t Byte) { CDC_Device_SendByte(&TerminalHandle, Byte); }
    51 
    52 #endif /* TERMINAL_H_ */
    diff --git a/Doc/Doxygen/html/_uploading_downloading_8txt.html b/Doc/Doxygen/html/_uploading_downloading_8txt.html index 2c41d90..b272b6a 100644 --- a/Doc/Doxygen/html/_uploading_downloading_8txt.html +++ b/Doc/Doxygen/html/_uploading_downloading_8txt.html @@ -65,7 +65,7 @@ $(function() { diff --git a/Doc/Doxygen/html/_x_modem_8h_source.html b/Doc/Doxygen/html/_x_modem_8h_source.html index 5581a6f..2a6c588 100644 --- a/Doc/Doxygen/html/_x_modem_8h_source.html +++ b/Doc/Doxygen/html/_x_modem_8h_source.html @@ -69,7 +69,7 @@ $(function() {
    1 /*
    2  * TerminalXModem.h
    3  *
    4  * Created on: 22.03.2013
    5  * Author: skuser
    6  */
    7 
    8 #ifndef XMODEM_H_
    9 #define XMODEM_H_
    10 
    11 #include "../Common.h"
    12 
    13 typedef bool (*XModemCallbackType) (void* ByteBuffer, uint32_t BlockAddress, uint16_t ByteCount);
    14 
    15 void XModemReceive(XModemCallbackType CallbackFunc);
    16 void XModemSend(XModemCallbackType CallbackFunc);
    17 
    18 bool XModemProcessByte(uint8_t Byte);
    19 void XModemTick(void);
    20 
    21 #endif /* TERMINALXMODEM_H_ */
    diff --git a/Doc/Doxygen/html/annotated.html b/Doc/Doxygen/html/annotated.html index 41987d1..49eca2c 100644 --- a/Doc/Doxygen/html/annotated.html +++ b/Doc/Doxygen/html/annotated.html @@ -72,7 +72,7 @@ $(function() { diff --git a/Doc/Doxygen/html/arrowdown.png b/Doc/Doxygen/html/arrowdown.png deleted file mode 100644 index 0b63f6d38c4b9ec907b820192ebe9724ed6eca22..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 246 zcmeAS@N?(olHy`uVBq!ia0y~yU=UznU=ZVAV_;x7xk{#nfq`MKr;B4q1>@Vhihj(F z5=TGEFKK_k5wqa?1D?=ahXjEurkR(76J85s@NhOUGq5u>9t}5-mE%lWepi;Uqf71m z{OS2=-_EA&i>$w5!uw}d@(=FzhI$T(E!{^y{WLCPvfUHg-?n_KaEwzcCzmLr=l*V6 zC-&_#>zx*^v);jxy=5y`_=dB74rP`7XD?ned3^snGwa;g6OSU_JYHVoTgx1KM+Mx1^?q-;~e(vK>ne<2)xN=7sOn7cwv~FnGH9xvX@VfwtS3% zB5wQ>Z?G+OS$!q@2%m^mr`yT^?;Fjw9AOU2uWshOY7y*F@$rm7Z&F@S(dVw}PkZ<8 zo20^d;Cu*UR{+<7Z+jxv_>138F?;of@zV#T4N{wew`}wmUFy`JvG744^GnTH+L4S$ zIyf(_IvsTKf?Ze%3&+Xgj$BKPSIjL>1m`TxZqju)v0V3#%4eP=&P&l5sl5BW3v|Em k$>cEAIRBLX?^wVdmdKI;Vst0IVihlK=n! diff --git a/Doc/Doxygen/html/classes.html b/Doc/Doxygen/html/classes.html index 68f8f14..7fa512f 100644 --- a/Doc/Doxygen/html/classes.html +++ b/Doc/Doxygen/html/classes.html @@ -76,7 +76,7 @@ $(function() { diff --git a/Doc/Doxygen/html/dir_5de29d499bb29a41092979d00d22c134.html b/Doc/Doxygen/html/dir_5de29d499bb29a41092979d00d22c134.html index 51f3226..7d47be0 100644 --- a/Doc/Doxygen/html/dir_5de29d499bb29a41092979d00d22c134.html +++ b/Doc/Doxygen/html/dir_5de29d499bb29a41092979d00d22c134.html @@ -69,7 +69,7 @@ $(function() { diff --git a/Doc/Doxygen/html/dir_74b6a3b63f61c160c0f14b7a283a4c9b.html b/Doc/Doxygen/html/dir_74b6a3b63f61c160c0f14b7a283a4c9b.html index eff8cc6..9e7057a 100644 --- a/Doc/Doxygen/html/dir_74b6a3b63f61c160c0f14b7a283a4c9b.html +++ b/Doc/Doxygen/html/dir_74b6a3b63f61c160c0f14b7a283a4c9b.html @@ -73,7 +73,7 @@ Directories diff --git a/Doc/Doxygen/html/dir_8465ec698d237f801ae9966d4551fcfa.html b/Doc/Doxygen/html/dir_8465ec698d237f801ae9966d4551fcfa.html index 8f2179b..07a5076 100644 --- a/Doc/Doxygen/html/dir_8465ec698d237f801ae9966d4551fcfa.html +++ b/Doc/Doxygen/html/dir_8465ec698d237f801ae9966d4551fcfa.html @@ -89,7 +89,7 @@ Files diff --git a/Doc/Doxygen/html/dir_ddeffaa734f77525428b0dd4068da9cb.html b/Doc/Doxygen/html/dir_ddeffaa734f77525428b0dd4068da9cb.html index 294bded..9c3c6b1 100644 --- a/Doc/Doxygen/html/dir_ddeffaa734f77525428b0dd4068da9cb.html +++ b/Doc/Doxygen/html/dir_ddeffaa734f77525428b0dd4068da9cb.html @@ -69,7 +69,7 @@ $(function() { diff --git a/Doc/Doxygen/html/dir_f5aab302412c0352d69464400cc5ee44.html b/Doc/Doxygen/html/dir_f5aab302412c0352d69464400cc5ee44.html index 4137dfb..26c9e5c 100644 --- a/Doc/Doxygen/html/dir_f5aab302412c0352d69464400cc5ee44.html +++ b/Doc/Doxygen/html/dir_f5aab302412c0352d69464400cc5ee44.html @@ -69,7 +69,7 @@ $(function() { diff --git a/Doc/Doxygen/html/files.html b/Doc/Doxygen/html/files.html index df17c10..55e67fe 100644 --- a/Doc/Doxygen/html/files.html +++ b/Doc/Doxygen/html/files.html @@ -99,7 +99,7 @@ $(function() { diff --git a/Doc/Doxygen/html/functions.html b/Doc/Doxygen/html/functions.html index 74852b0..b095711 100644 --- a/Doc/Doxygen/html/functions.html +++ b/Doc/Doxygen/html/functions.html @@ -117,7 +117,7 @@ $(function() { diff --git a/Doc/Doxygen/html/functions_vars.html b/Doc/Doxygen/html/functions_vars.html index bb3c26e..3143f9d 100644 --- a/Doc/Doxygen/html/functions_vars.html +++ b/Doc/Doxygen/html/functions_vars.html @@ -117,7 +117,7 @@ $(function() { diff --git a/Doc/Doxygen/html/globals.html b/Doc/Doxygen/html/globals.html index 6786d93..e7390b5 100644 --- a/Doc/Doxygen/html/globals.html +++ b/Doc/Doxygen/html/globals.html @@ -193,7 +193,7 @@ $(function() { diff --git a/Doc/Doxygen/html/globals_defs.html b/Doc/Doxygen/html/globals_defs.html index 0d71f96..5a6de24 100644 --- a/Doc/Doxygen/html/globals_defs.html +++ b/Doc/Doxygen/html/globals_defs.html @@ -78,7 +78,7 @@ $(function() { diff --git a/Doc/Doxygen/html/globals_enum.html b/Doc/Doxygen/html/globals_enum.html index 89643a6..31acbf0 100644 --- a/Doc/Doxygen/html/globals_enum.html +++ b/Doc/Doxygen/html/globals_enum.html @@ -66,7 +66,7 @@ $(function() { diff --git a/Doc/Doxygen/html/globals_eval.html b/Doc/Doxygen/html/globals_eval.html index 3f07241..9821a6b 100644 --- a/Doc/Doxygen/html/globals_eval.html +++ b/Doc/Doxygen/html/globals_eval.html @@ -138,7 +138,7 @@ $(function() { diff --git a/Doc/Doxygen/html/globals_func.html b/Doc/Doxygen/html/globals_func.html index a06d29d..df6ba38 100644 --- a/Doc/Doxygen/html/globals_func.html +++ b/Doc/Doxygen/html/globals_func.html @@ -67,7 +67,7 @@ $(function() { diff --git a/Doc/Doxygen/html/globals_vars.html b/Doc/Doxygen/html/globals_vars.html index a4c5e63..1f6f816 100644 --- a/Doc/Doxygen/html/globals_vars.html +++ b/Doc/Doxygen/html/globals_vars.html @@ -78,7 +78,7 @@ $(function() { diff --git a/Doc/Doxygen/html/index.html b/Doc/Doxygen/html/index.html index 868f775..84c4085 100644 --- a/Doc/Doxygen/html/index.html +++ b/Doc/Doxygen/html/index.html @@ -80,7 +80,7 @@ $(function() { diff --git a/Doc/Doxygen/html/menu.js b/Doc/Doxygen/html/menu.js new file mode 100644 index 0000000..97db4c2 --- /dev/null +++ b/Doc/Doxygen/html/menu.js @@ -0,0 +1,26 @@ +function initMenu(relPath,searchEnabled,serverSide,searchPage,search) { + function makeTree(data,relPath) { + var result=''; + if ('children' in data) { + result+=''; + } + return result; + } + + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchEnabled) { + if (serverSide) { + $('#main-menu').append('
  • '); + } else { + $('#main-menu').append('
  • '); + } + } + $('#main-menu').smartmenus(); +} diff --git a/Doc/Doxygen/html/menudata.js b/Doc/Doxygen/html/menudata.js new file mode 100644 index 0000000..5bb4701 --- /dev/null +++ b/Doc/Doxygen/html/menudata.js @@ -0,0 +1,23 @@ +var menudata={children:[ +{text:"Main Page",url:"index.html"}, +{text:"Related Pages",url:"pages.html"}, +{text:"Classes",url:"annotated.html",children:[ +{text:"Class List",url:"annotated.html"}, +{text:"Class Index",url:"classes.html"}, +{text:"Class Members",url:"functions.html",children:[ +{text:"All",url:"functions.html"}, +{text:"Variables",url:"functions_vars.html"}]}]}, +{text:"Files",url:"files.html",children:[ +{text:"File List",url:"files.html"}, +{text:"File Members",url:"globals.html",children:[ +{text:"All",url:"globals.html",children:[ +{text:"c",url:"globals.html#index_c"}, +{text:"d",url:"globals.html#index_d"}, +{text:"l",url:"globals.html#index_l"}, +{text:"m",url:"globals.html#index_m"}, +{text:"p",url:"globals.html#index_p"}]}, +{text:"Functions",url:"globals_func.html"}, +{text:"Variables",url:"globals_vars.html"}, +{text:"Enumerations",url:"globals_enum.html"}, +{text:"Enumerator",url:"globals_eval.html"}, +{text:"Macros",url:"globals_defs.html"}]}]}]} diff --git a/Doc/Doxygen/html/pages.html b/Doc/Doxygen/html/pages.html index 1a56a99..924e63a 100644 --- a/Doc/Doxygen/html/pages.html +++ b/Doc/Doxygen/html/pages.html @@ -70,7 +70,7 @@ $(function() { diff --git a/Doc/Doxygen/html/struct_configuration_type-members.html b/Doc/Doxygen/html/struct_configuration_type-members.html index 216df6a..e0d0ed6 100644 --- a/Doc/Doxygen/html/struct_configuration_type-members.html +++ b/Doc/Doxygen/html/struct_configuration_type-members.html @@ -81,7 +81,7 @@ $(function() { diff --git a/Doc/Doxygen/html/struct_configuration_type.html b/Doc/Doxygen/html/struct_configuration_type.html index e01e0e8..ab315a9 100644 --- a/Doc/Doxygen/html/struct_configuration_type.html +++ b/Doc/Doxygen/html/struct_configuration_type.html @@ -324,7 +324,7 @@ Public Attributes diff --git a/Doc/Doxygen/html/struct_settings_entry_type-members.html b/Doc/Doxygen/html/struct_settings_entry_type-members.html index f2bcecb..5ffe032 100644 --- a/Doc/Doxygen/html/struct_settings_entry_type-members.html +++ b/Doc/Doxygen/html/struct_settings_entry_type-members.html @@ -73,7 +73,7 @@ $(function() { diff --git a/Doc/Doxygen/html/struct_settings_entry_type.html b/Doc/Doxygen/html/struct_settings_entry_type.html index c0f8025..98fca90 100644 --- a/Doc/Doxygen/html/struct_settings_entry_type.html +++ b/Doc/Doxygen/html/struct_settings_entry_type.html @@ -97,7 +97,7 @@ uint16_t  diff --git a/Doc/Doxygen/html/struct_u_s_b___descriptor___configuration__t-members.html b/Doc/Doxygen/html/struct_u_s_b___descriptor___configuration__t-members.html index 3f8f176..4dabb3c 100644 --- a/Doc/Doxygen/html/struct_u_s_b___descriptor___configuration__t-members.html +++ b/Doc/Doxygen/html/struct_u_s_b___descriptor___configuration__t-members.html @@ -68,7 +68,7 @@ $(function() { diff --git a/Doc/Doxygen/html/struct_u_s_b___descriptor___configuration__t.html b/Doc/Doxygen/html/struct_u_s_b___descriptor___configuration__t.html index 17a0976..fede905 100644 --- a/Doc/Doxygen/html/struct_u_s_b___descriptor___configuration__t.html +++ b/Doc/Doxygen/html/struct_u_s_b___descriptor___configuration__t.html @@ -71,7 +71,7 @@ $(function() { From a5d0a8d216ce55df921470ba9acdf5a61c6b914e Mon Sep 17 00:00:00 2001 From: Georg Date: Mon, 22 Jan 2018 08:47:59 +0100 Subject: [PATCH 047/104] reader codec upgrade --- .../Chameleon-Mini/Application/Reader14443A.c | 197 ++++++++---- .../Chameleon-Mini/Application/Reader14443A.h | 1 - Firmware/Chameleon-Mini/Codec/Codec.h | 5 +- .../Chameleon-Mini/Codec/Reader14443-2A.c | 296 +++++++++--------- .../Chameleon-Mini/Codec/Reader14443-2A.h | 2 + .../Chameleon-Mini/Codec/Reader14443-ISR.S | 110 +++++++ Firmware/Chameleon-Mini/Makefile | 2 +- 7 files changed, 390 insertions(+), 223 deletions(-) create mode 100644 Firmware/Chameleon-Mini/Codec/Reader14443-ISR.S diff --git a/Firmware/Chameleon-Mini/Application/Reader14443A.c b/Firmware/Chameleon-Mini/Application/Reader14443A.c index 7c0aa9e..7cea928 100644 --- a/Firmware/Chameleon-Mini/Application/Reader14443A.c +++ b/Firmware/Chameleon-Mini/Application/Reader14443A.c @@ -10,6 +10,13 @@ #define CHECK_BCC(B) ((B[0] ^ B[1] ^ B[2] ^ B[3]) == B[4]) #define IS_CASCADE_BIT_SET(buf) (buf[0] & 0x04) #define IS_ISO14443A_4_COMPLIANT(buf) (buf[0] & 0x20) +#define MF_CLASSIC_READER_NONCE 0x00000000 + +#define TRYCOUNT_MAX 16 + +#define FLAGS_MASK 0x03 +#define FLAGS_PARITY_OK 0x01 +#define FLAGS_NO_DATA 0x02 // TODO replace remaining magic numbers @@ -197,15 +204,13 @@ void Reader14443AAppTick(void) INLINE uint16_t Reader14443A_Deselect(uint8_t* Buffer) // deselects the card because of an error, so we will continue to select the card afterwards { Buffer[0] = 0xC2; - uint16_t crc = ISO14443_CRCA(Buffer, 1); - Buffer[1] = crc; - Buffer[2] = crc >> 8; + ISO14443AAppendCRCA(Buffer, 1); ReaderState = STATE_DESELECT; Selected = false; return addParityBits(Buffer, 24); } -INLINE uint16_t Reader14443A_Select(uint8_t * Buffer, uint16_t BitCount) +static uint16_t Reader14443A_Select(uint8_t * Buffer, uint16_t BitCount) { if (Selected) { @@ -343,21 +348,17 @@ INLINE uint16_t Reader14443A_Halt(uint8_t* Buffer) { Buffer[0] = ISO14443A_CMD_HLTA; Buffer[1] = 0x00; - uint16_t crc = ISO14443_CRCA(Buffer, 2); - Buffer[2] = crc; - Buffer[3] = crc >> 8; + ISO14443AAppendCRCA(Buffer, 2); ReaderState = STATE_HALT; Selected = false; - return addParityBits(Buffer, 32); + return addParityBits(Buffer, 4 * BITS_PER_BYTE); } INLINE uint16_t Reader14443A_RATS(uint8_t* Buffer) { Buffer[0] = 0xE0; // RATS command Buffer[1] = 0x80; - uint16_t crc = ISO14443_CRCA(Buffer, 2); - Buffer[2] = crc; - Buffer[3] = crc >> 8; + ISO14443AAppendCRCA(Buffer, 2); ReaderState = STATE_ATS; return addParityBits(Buffer, 32); } @@ -457,77 +458,143 @@ uint16_t Reader14443AAppProcess(uint8_t* Buffer, uint16_t BitCount) RT_STATE_IDLE, RT_STATE_SEARCHING } RTState = RT_STATE_IDLE; - static uint8_t ErrorCount = 0; - static uint8_t Thresholds[(CODEC_THRESHOLD_CALIBRATE_MAX - CODEC_THRESHOLD_CALIBRATE_MIN) / CODEC_THRESHOLD_CALIBRATE_STEPS] = {0}; // todo this could be improved by using the bits and not the whole bytes + static uint8_t TryCount = 0; + static uint8_t Thresholds[(CODEC_THRESHOLD_CALIBRATE_MAX - CODEC_THRESHOLD_CALIBRATE_MIN) / CODEC_THRESHOLD_CALIBRATE_STEPS] = {0}; if (RTState == RT_STATE_IDLE) { CodecThresholdSet(CODEC_THRESHOLD_CALIBRATE_MIN); RTState = RT_STATE_SEARCHING; - ErrorCount = 0; - } else if (RTState == RT_STATE_SEARCHING && ReaderState <= STATE_HALT && ErrorCount++ == 8) { - if (CodecThresholdIncrement() >= CODEC_THRESHOLD_CALIBRATE_MAX) + TryCount = 0; + } else if (RTState == RT_STATE_SEARCHING && ReaderState <= STATE_HALT) { + if (++TryCount == TRYCOUNT_MAX) { - RTState = RT_STATE_IDLE; - - bool block = false; - uint16_t min = 0; - uint16_t max = 0; - uint16_t maxdiff = 0; - uint16_t maxdiffoffset = 0; - - CommandLinePendingTaskFinished(COMMAND_INFO_OK_WITH_TEXT_ID, NULL); - uint16_t i; - for (i = 0; i < (CODEC_THRESHOLD_CALIBRATE_MAX - CODEC_THRESHOLD_CALIBRATE_MIN) / CODEC_THRESHOLD_CALIBRATE_STEPS; i++) + uint16_t tmp_th = CodecThresholdIncrement(); + if ((tmp_th >= CODEC_THRESHOLD_CALIBRATE_MID && (tmp_th - CODEC_THRESHOLD_CALIBRATE_STEPS) < CODEC_THRESHOLD_CALIBRATE_MID) + || + tmp_th >= CODEC_THRESHOLD_CALIBRATE_MAX) { - char tmpBuf[10]; - snprintf(tmpBuf, 10, "%4" PRIu16 ": ", i*CODEC_THRESHOLD_CALIBRATE_STEPS + CODEC_THRESHOLD_CALIBRATE_MIN); - TerminalSendString(tmpBuf); - if (Thresholds[i]) + bool block = false, finished = false; + uint16_t min = 0; + uint16_t max = 0; + uint16_t maxdiff = 0; + uint16_t maxdiffoffset = 0; + uint16_t numworked; + uint16_t i; + + // first, search inside the usual search space + if (tmp_th >= CODEC_THRESHOLD_CALIBRATE_MID && (tmp_th - CODEC_THRESHOLD_CALIBRATE_STEPS) < CODEC_THRESHOLD_CALIBRATE_MID) { - TerminalSendStringP(PSTR("+\r\n")); - if (!block) + for (i = 0; i < (CODEC_THRESHOLD_CALIBRATE_MID - CODEC_THRESHOLD_CALIBRATE_MIN) / CODEC_THRESHOLD_CALIBRATE_STEPS; i++) { - block = true; - min = i; - } - } else { - TerminalSendStringP(PSTR("-\r\n")); - if (block) - { - block = false; - max = i; - if ((max - min) > maxdiff) + if (Thresholds[i] == TRYCOUNT_MAX) { - maxdiff = max - min; - maxdiffoffset = min; + if (!block) + { + block = true; + min = i; + } + } else { + if (block) + { + block = false; + max = i; + if ((max - min) >= maxdiff) + { + maxdiff = max - min; + maxdiffoffset = min; + } + } } } + if (maxdiff >= 4) // if we have found something with at least 5 consecutive working thresholds (only if these thresholds have worked for evers attempt), we are done + { + finished = true; + } + } else { // we have searched the whole space + for (numworked = TRYCOUNT_MAX; numworked > 0; numworked--) + { + for (i = 0; i < (CODEC_THRESHOLD_CALIBRATE_MAX - CODEC_THRESHOLD_CALIBRATE_MIN) / CODEC_THRESHOLD_CALIBRATE_STEPS; i++) + { + if (Thresholds[i] >= numworked) + { + if (!block) + { + block = true; + min = i; + } + } else { + if (block) + { + block = false; + max = i; + if ((max - min) >= maxdiff) + { + maxdiff = max - min; + maxdiffoffset = min; + } + } + } + } + if (maxdiff > 0) + { + break; + } + } + + finished = true; + } + + if (finished) + { + + RTState = RT_STATE_IDLE; + + if (maxdiff != 0) + CodecThresholdSet((maxdiffoffset + maxdiff / 2) * CODEC_THRESHOLD_CALIBRATE_STEPS + CODEC_THRESHOLD_CALIBRATE_MIN); + else + CodecThresholdReset(); + + CommandLinePendingTaskFinished(COMMAND_INFO_OK_WITH_TEXT_ID, NULL); + uint16_t i_max = (CODEC_THRESHOLD_CALIBRATE_MID - CODEC_THRESHOLD_CALIBRATE_MIN) / CODEC_THRESHOLD_CALIBRATE_STEPS; + if (tmp_th >= CODEC_THRESHOLD_CALIBRATE_MAX) + i_max = (CODEC_THRESHOLD_CALIBRATE_MAX - CODEC_THRESHOLD_CALIBRATE_MIN) / CODEC_THRESHOLD_CALIBRATE_STEPS; + for (i = 0; i < i_max; i++) + { + char tmpBuf[10]; + snprintf(tmpBuf, 10, "%4" PRIu16 ": ", i*CODEC_THRESHOLD_CALIBRATE_STEPS + CODEC_THRESHOLD_CALIBRATE_MIN); + TerminalSendString(tmpBuf); + if (Thresholds[i]) + { + snprintf(tmpBuf, 10, "%3" PRIu16, Thresholds[i]); + TerminalSendString(tmpBuf); + } else { + TerminalSendChar('-'); + } + TerminalSendStringP(PSTR("\r\n")); + Thresholds[i] = 0; // reset the threshold so the next run won't show old results + } + + + Selected = false; + Reader14443CurrentCommand = Reader14443_Do_Nothing; + Reader14443ACodecReset(); + return 0; } - Thresholds[i] = 0; // reset the threshold so the next run won't show old results } - - if (maxdiff != 0) - CodecThresholdSet((maxdiffoffset + maxdiff / 2) * CODEC_THRESHOLD_CALIBRATE_STEPS + CODEC_THRESHOLD_CALIBRATE_MIN); - else - CodecThresholdReset(); - - Selected = false; - Reader14443CurrentCommand = Reader14443_Do_Nothing; - CodecReaderFieldStop(); - return 0; + TryCount = 0; } - - Thresholds[(ReaderThreshold - CODEC_THRESHOLD_CALIBRATE_MIN) / CODEC_THRESHOLD_CALIBRATE_STEPS] = 0; - CodecThresholdIncrement(); - ErrorCount = 0; } uint16_t rVal = Reader14443A_Select(Buffer, BitCount); if (Selected) // we are done finding the threshold { - Thresholds[(ReaderThreshold - CODEC_THRESHOLD_CALIBRATE_MIN) / CODEC_THRESHOLD_CALIBRATE_STEPS] = 1; - CodecThresholdIncrement(); + Thresholds[(ReaderThreshold - CODEC_THRESHOLD_CALIBRATE_MIN) / CODEC_THRESHOLD_CALIBRATE_STEPS] += 1; + if (TryCount == TRYCOUNT_MAX) + { + CodecThresholdIncrement(); + TryCount = 0; + } ReaderState = STATE_IDLE; Reader14443ACodecStart(); return Reader14443A_Halt(Buffer); @@ -592,13 +659,11 @@ uint16_t Reader14443AAppProcess(uint8_t* Buffer, uint16_t BitCount) } Buffer[0] = 0x30; // MiFare Ultralight read command Buffer[1] = MFURead_CurrentAdress; - uint16_t crc = ISO14443_CRCA(Buffer, 2); - Buffer[2] = crc; - Buffer[3] = crc >> 8; + ISO14443AAppendCRCA(Buffer, 2); MFURead_CurrentAdress += 4; - return addParityBits(Buffer, 32); + return addParityBits(Buffer, 4 * BITS_PER_BYTE); } return rVal; } diff --git a/Firmware/Chameleon-Mini/Application/Reader14443A.h b/Firmware/Chameleon-Mini/Application/Reader14443A.h index e9519ed..edc83b2 100644 --- a/Firmware/Chameleon-Mini/Application/Reader14443A.h +++ b/Firmware/Chameleon-Mini/Application/Reader14443A.h @@ -19,7 +19,6 @@ uint16_t Reader14443AAppProcess(uint8_t* Buffer, uint16_t BitCount); uint16_t addParityBits(uint8_t * Buffer, uint16_t bits); uint16_t removeParityBits(uint8_t * Buffer, uint16_t BitCount); -uint16_t removeSOC(uint8_t * Buffer, uint16_t BitCount); bool checkParityBits(uint8_t * Buffer, uint16_t BitCount); uint16_t ISO14443_CRCA(uint8_t * Buffer, uint8_t ByteCount); diff --git a/Firmware/Chameleon-Mini/Codec/Codec.h b/Firmware/Chameleon-Mini/Codec/Codec.h index 38927dc..54f9e9d 100644 --- a/Firmware/Chameleon-Mini/Codec/Codec.h +++ b/Firmware/Chameleon-Mini/Codec/Codec.h @@ -74,8 +74,9 @@ #define CODEC_AC_DEMOD_SETTINGS AC_HSMODE_bm | AC_HYSMODE_NO_gc #define CODEC_MAXIMUM_THRESHOLD 0xFFF // the maximum voltage can be calculated with ch0data * Vref / 0xFFF #define CODEC_THRESHOLD_CALIBRATE_MIN 128 -#define CODEC_THRESHOLD_CALIBRATE_MAX 1024 -#define CODEC_THRESHOLD_CALIBRATE_STEPS 8 +#define CODEC_THRESHOLD_CALIBRATE_MID 768 +#define CODEC_THRESHOLD_CALIBRATE_MAX 2048 +#define CODEC_THRESHOLD_CALIBRATE_STEPS 16 #define CODEC_TIMER_TIMESTAMPS TCD1 #define CODEC_TIMER_TIMESTAMPS_CCA_VECT TCD1_CCA_vect diff --git a/Firmware/Chameleon-Mini/Codec/Reader14443-2A.c b/Firmware/Chameleon-Mini/Codec/Reader14443-2A.c index 26afb64..6a70968 100644 --- a/Firmware/Chameleon-Mini/Codec/Reader14443-2A.c +++ b/Firmware/Chameleon-Mini/Codec/Reader14443-2A.c @@ -28,12 +28,8 @@ static volatile uint16_t RxPendingSince; static volatile enum { STATE_IDLE, - STATE_MILLER_SOF0, - STATE_MILLER_SOF1, - STATE_MILLER_TX0, - STATE_MILLER_TX1, - STATE_MILLER_EOF0, - STATE_MILLER_EOF1, + STATE_MILLER_SEND, + STATE_MILLER_EOF, STATE_FDT } State; @@ -54,11 +50,13 @@ void Reader14443ACodecInit(void) { CodecInitCommon(); CodecSetDemodPower(true); - CODEC_TIMER_SAMPLING.PER = SAMPLE_RATE_SYSTEM_CYCLES/2 - 1; - CODEC_TIMER_SAMPLING.CCB = 1; + CODEC_TIMER_SAMPLING.PER = SAMPLE_RATE_SYSTEM_CYCLES - 1; + CODEC_TIMER_SAMPLING.CCB = 0; + CODEC_TIMER_SAMPLING.CCC = 0; CODEC_TIMER_SAMPLING.CTRLA = TC_CLKSEL_OFF_gc; CODEC_TIMER_SAMPLING.INTCTRLA = 0; - CODEC_TIMER_SAMPLING.INTCTRLB = TC_CCBINTLVL_HI_gc; + CODEC_TIMER_SAMPLING.INTCTRLB = TC_CCBINTLVL_OFF_gc; + CODEC_TIMER_SAMPLING.CTRLA = TC_CLKSEL_DIV1_gc; CODEC_TIMER_LOADMOD.CTRLA = 0; State = STATE_IDLE; @@ -80,6 +78,22 @@ void Reader14443ACodecDeInit(void) { Flags.Start = false; } +INLINE void Insert0(void) +{ + SampleRegister >>= 1; + if (++BitCount % 8) + return; + *CodecBufferPtr++ = SampleRegister; +} + +INLINE void Insert1(void) +{ + SampleRegister = (SampleRegister >> 1) | 0x80; + if (++BitCount % 8) + return; + *CodecBufferPtr++ = SampleRegister; +} + INLINE void Reader14443A_EOC(void) { CODEC_TIMER_LOADMOD.INTCTRLB = 0; @@ -88,6 +102,14 @@ INLINE void Reader14443A_EOC(void) CODEC_TIMER_TIMESTAMPS.CTRLA = TC_CLKSEL_OFF_gc; ACA.AC1CTRL &= ~AC_ENABLE_bm; + if (BitCount & 1) + { + if (SampleRegister & 0x80) + Insert0(); + else + Insert1(); + } + if (BitCount % 8) // copy the last byte, if there is an incomplete byte CodecBuffer[BitCount / 8] = SampleRegister >> (8 - (BitCount % 8)); Flags.RxDone = true; @@ -104,140 +126,96 @@ INLINE void Reader14443A_EOC(void) State = STATE_FDT; } -ISR(CODEC_TIMER_SAMPLING_CCB_VECT) +INLINE void BufferToSequence(void) { - static void * JumpTable[] = { - [STATE_IDLE] = &&STATE_IDLE_LABEL, - [STATE_MILLER_SOF0] = &&STATE_MILLER_SOF0_LABEL, - [STATE_MILLER_SOF1] = &&STATE_MILLER_SOF1_LABEL, - [STATE_MILLER_TX0] = &&STATE_MILLER_TX0_LABEL, - [STATE_MILLER_TX1] = &&STATE_MILLER_TX1_LABEL, - [STATE_MILLER_EOF0] = &&STATE_MILLER_EOF0_LABEL, - [STATE_MILLER_EOF1] = &&STATE_MILLER_EOF1_LABEL, - [STATE_FDT] = &&STATE_FDT_LABEL - }; - - goto *JumpTable[State]; - - STATE_MILLER_SOF0_LABEL: - /* Output a SOF */ - CodecSetReaderField(false); - _delay_us(2.5); - CodecSetReaderField(true); - - CodecBufferIdx = 0; - SampleRegister = CodecBuffer[0]; - BitCountUp = 0; - - State = STATE_MILLER_SOF1; + uint16_t count = BitCount; + if (count > BITS_PER_BYTE * CODEC_BUFFER_SIZE / 2) // todo is this correct? return; - STATE_MILLER_SOF1_LABEL: - State = STATE_MILLER_TX0; - return; + BitCount = 0; - STATE_MILLER_TX0_LABEL: - /* First half of bit-slot */ - if (SampleRegister & 0x01) { - /* Do Nothing */ + memcpy(CodecBuffer + CODEC_BUFFER_SIZE / 2, CodecBuffer, (count + 7) / 8); + uint8_t * Buffer = CodecBuffer + CODEC_BUFFER_SIZE / 2; + CodecBufferPtr = CodecBuffer; + + Insert1(); // SOC + Insert0(); + + uint16_t i; + uint8_t last = 0; + for (i = 1; i <= count; i++) + { + if ((*Buffer) & 1) + { + Insert0(); + Insert1(); + last = 1; } else { - if (LastBit == 0) { - CodecSetReaderField(false); - _delay_us(2.5); - CodecSetReaderField(true); + if (last) + { + Insert0(); + Insert0(); } else { - /* Do Nothing */ + Insert1(); + Insert0(); } + last = 0; } - - State = STATE_MILLER_TX1; - return; - - STATE_MILLER_TX1_LABEL: - /* Second half of bit-slot */ - if (SampleRegister & 0x01) { - CodecSetReaderField(false); - _delay_us(2.5); - CodecSetReaderField(true); - LastBit = 1; - } else { - /* No modulation pauses */ - LastBit = 0; - } - - SampleRegister >>= 1; - if (--BitCount == 0) { - State = STATE_MILLER_EOF0; - } else { - State = STATE_MILLER_TX0; - } - - if ((++BitCountUp % 8) == 0) - SampleRegister = CodecBuffer[++CodecBufferIdx]; - return; - - STATE_MILLER_EOF0_LABEL: - if (LastBit == 0) { - CodecSetReaderField(false); - _delay_us(2.5); - CodecSetReaderField(true); - } else { - /* Do Nothing */ - } - - State = STATE_MILLER_EOF1; - return; - - STATE_MILLER_EOF1_LABEL: - CODEC_TIMER_SAMPLING.CTRLA = TC_CLKSEL_OFF_gc; - _delay_us(50); // wait for DEMOD signal to stabilize - - /* Enable the AC interrupt, which either finds the SOC and then starts the pause-finding timer, - * or it is triggered before the SOC, which mostly isn't bad at all, since the first pause - * needs to be found. */ - ACA.STATUS = AC_AC1IF_bm; - ACA.AC1CTRL = AC_HSMODE_bm | AC_HYSMODE_NO_gc | AC_INTMODE_BOTHEDGES_gc | AC_INTLVL_HI_gc | AC_ENABLE_bm; - - CodecBufferPtr = CodecBuffer; // use GPIOR for faster access - BitCount = 1; // the first modulation of the SOC is "found" implicitly - SampleRegister = 0x80; - - RxPendingSince = SystemGetSysTick(); - Flags.RxPending = true; - - // reset for future use - CodecBufferIdx = 0; - BitCountUp = 0; - - State = STATE_IDLE; - return; - - STATE_IDLE_LABEL: - STATE_FDT_LABEL: - return; + *Buffer >>= 1; + if ((i % 8) == 0) + Buffer++; } + if (last == 0) // EOC + { + Insert1(); + Insert0(); + } + + if (BitCount % 8) + CodecBuffer[BitCount / 8] = SampleRegister >> (8 - (BitCount % 8)); +} + +ISR (TCD0_CCC_vect) +{ + CODEC_TIMER_SAMPLING.INTFLAGS = TC0_CCCIF_bm; + CODEC_TIMER_SAMPLING.INTCTRLB = TC_CCCINTLVL_OFF_gc; + + /* Enable the AC interrupt, which either finds the SOC and then starts the pause-finding timer, + * or it is triggered before the SOC, which mostly isn't bad at all, since the first pause + * needs to be found. */ + ACA.STATUS = AC_AC1IF_bm; + ACA.AC1CTRL = AC_HSMODE_bm | AC_HYSMODE_NO_gc | AC_INTMODE_FALLING_gc | AC_INTLVL_HI_gc | AC_ENABLE_bm; + + CodecBufferPtr = CodecBuffer; // use GPIOR for faster access + BitCount = 1; // FALSCH todo the first modulation of the SOC is "found" implicitly + SampleRegister = 0x00; + + RxPendingSince = SystemGetSysTick(); + Flags.RxPending = true; + + // reset for future use + CodecBufferIdx = 0; + BitCountUp = 0; + + State = STATE_IDLE; + PORTE.OUTTGL = PIN3_bm; +} + +void Reader14443AMillerEOC(void) +{ + CODEC_TIMER_SAMPLING.PER = 5*SAMPLE_RATE_SYSTEM_CYCLES - 1; + CODEC_TIMER_SAMPLING.INTFLAGS = TC0_CCBIF_bm | TC0_CCCIF_bm; + CODEC_TIMER_SAMPLING.INTCTRLB = TC_CCBINTLVL_OFF_gc | TC_CCCINTLVL_HI_gc; + CODEC_TIMER_SAMPLING.PERBUF = SAMPLE_RATE_SYSTEM_CYCLES - 1; + PORTE.OUTTGL = PIN3_bm; +} + ISR(CODEC_TIMER_TIMESTAMPS_CCA_VECT) // EOC found { Reader14443A_EOC(); } -INLINE void Insert0(void) -{ - SampleRegister >>= 1; - if (++BitCount % 8) - return; - *CodecBufferPtr++ = SampleRegister; -} - -INLINE void Insert1(void) -{ - SampleRegister = (SampleRegister >> 1) | 0x80; - if (++BitCount % 8) - return; - *CodecBufferPtr++ = SampleRegister; -} - ISR(ACA_AC1_vect) // this interrupt either finds the SOC or gets triggered before { ACA.AC1CTRL &= ~AC_INTLVL_HI_gc; // disable this interrupt @@ -253,27 +231,36 @@ ISR(CODEC_TIMER_LOADMOD_CCA_VECT) // pause found /* This needs to be done only on the first call, * but doing this only on a condition means wasting time, so we do it every time. */ - CODEC_TIMER_TIMESTAMPS.CTRLA = TC_CLKSEL_DIV2_gc; + CODEC_TIMER_TIMESTAMPS.CTRLA = TC_CLKSEL_DIV4_gc; switch (tmp) // decide how many half bit periods have been modulations { - case 0 ... 96: // 64 ticks is one half of a bit period - Insert0(); - // If one full bit period is over AND the last half bit period also was a pause, - // we have found the EOC. - if ((BitCount & 1) == 0 && (SampleRegister & 0x40) == 0) - Reader14443A_EOC(); + case 0 ... 48: // 32 ticks is one half of a bit period return; - case 97 ... 160: // 128 ticks is a full bit period + case 49 ... 80: // 64 ticks are a full bit period Insert1(); Insert0(); return; - default: // every value over 128 + 32 (tolerance) is considered to be 3 half bit periods + case 81 ... 112: // 96 ticks are 3 half bit periods + if (BitCount & 1) + { + Insert1(); + Insert1(); + Insert0(); + } else { + Insert1(); + Insert0(); + Insert0(); + } + return; + + default: // every value over 96 + 16 (tolerance) is considered to be 4 half bit periods Insert1(); Insert1(); Insert0(); + Insert0(); return; } return; @@ -283,6 +270,7 @@ void Reader14443ACodecTask(void) { if (Flags.RxPending && SYSTICK_DIFF(RxPendingSince) > Reader_FWT + 1) { + Reader14443A_EOC(); BitCount = 0; Flags.RxDone = true; Flags.RxPending = false; @@ -307,7 +295,7 @@ void Reader14443ACodecTask(void) BitCount = 0; bool breakflag = false; - TmpCodecBuffer[0] >>= 2; // with this (and BitCountTmp = 2), the SOC is ignored and thus it's not neccessary to remove it later + TmpCodecBuffer[0] >>= 2; // with this (and BitCountTmp = 2), the SOC is ignored while (!breakflag && BitCountTmp < TotalBitCount) { uint8_t Bit = TmpCodecBuffer[BitCountTmp / 8] & 0x03; @@ -315,18 +303,14 @@ void Reader14443ACodecTask(void) switch (Bit) { case 0b10: - Insert0(); - break; - - case 0b01: Insert1(); break; + case 0b01: + Insert0(); + break; + case 0b00: // EOC - if (BitCount % 8) // copy the last byte, if there is an incomplete byte - CodecBuffer[BitCount / 8] = SampleRegister >> (8 - (BitCount % 8)); - LEDHook(LED_CODEC_RX, LED_PULSE); - LogEntry(LOG_INFO_CODEC_RX_DATA_W_PARITY, CodecBuffer, (BitCount + 7) / 8); breakflag = true; break; @@ -336,6 +320,10 @@ void Reader14443ACodecTask(void) } BitCountTmp += 2; } + if (BitCount % 8) // copy the last byte, if there is an incomplete byte + CodecBuffer[BitCount / 8] = SampleRegister >> (8 - (BitCount % 8)); + LEDHook(LED_CODEC_RX, LED_PULSE); + LogEntry(LOG_INFO_CODEC_RX_DATA_W_PARITY, CodecBuffer, (BitCount + 7) / 8); } } Flags.Start = false; @@ -357,12 +345,12 @@ void Reader14443ACodecTask(void) */ /* Configure and enable the analog comparator for finding pauses in the DEMOD signal. */ - ACA.AC1CTRL = AC_HSMODE_bm | AC_HYSMODE_NO_gc | AC_INTMODE_BOTHEDGES_gc | AC_ENABLE_bm; + ACA.AC1CTRL = AC_HSMODE_bm | AC_HYSMODE_NO_gc | AC_INTMODE_FALLING_gc | AC_ENABLE_bm; /* This timer will be used to detect the pauses between the modulation sequences. */ CODEC_TIMER_LOADMOD.CTRLA = 0; CODEC_TIMER_LOADMOD.CNT = 0; - CODEC_TIMER_LOADMOD.PER = 127; // with 27.12 MHz this is exactly one half bit width + CODEC_TIMER_LOADMOD.PER = 0xFFFF; // with 27.12 MHz this is exactly one half bit width CODEC_TIMER_LOADMOD.CCA = 95; // with 27.12 MHz this is 3/4 of a half bit width CODEC_TIMER_LOADMOD.INTCTRLA = 0; CODEC_TIMER_LOADMOD.INTFLAGS = TC1_CCAIF_bm; @@ -371,7 +359,7 @@ void Reader14443ACodecTask(void) /* This timer will be used to find out how many bit halfs since the last pause have been passed. */ CODEC_TIMER_TIMESTAMPS.CNT = 0; CODEC_TIMER_TIMESTAMPS.PER = 0xFFFF; - CODEC_TIMER_TIMESTAMPS.CCA = 256; + CODEC_TIMER_TIMESTAMPS.CCA = 160; CODEC_TIMER_TIMESTAMPS.INTCTRLA = 0; CODEC_TIMER_TIMESTAMPS.INTFLAGS = TC1_CCAIF_bm; CODEC_TIMER_TIMESTAMPS.INTCTRLB = TC_CCAINTLVL_LO_gc; @@ -387,10 +375,12 @@ void Reader14443ACodecTask(void) LogEntry(LOG_INFO_CODEC_TX_DATA_W_PARITY, CodecBuffer, (BitCount + 7) / 8); /* Set state and start timer for Miller encoding. */ - State = STATE_MILLER_SOF0; - LastBit = 0; - CODEC_TIMER_SAMPLING.CNT = 0; - CODEC_TIMER_SAMPLING.CTRLA = TC_CLKSEL_DIV1_gc; + BufferToSequence(); + State = STATE_MILLER_SEND; + CodecBufferPtr = CodecBuffer; + CODEC_TIMER_SAMPLING.INTFLAGS = TC0_CCBIF_bm; + CODEC_TIMER_SAMPLING.INTCTRLB = TC_CCBINTLVL_HI_gc; + _delay_loop_1(85); } } } diff --git a/Firmware/Chameleon-Mini/Codec/Reader14443-2A.h b/Firmware/Chameleon-Mini/Codec/Reader14443-2A.h index 5abca80..ed6fec8 100644 --- a/Firmware/Chameleon-Mini/Codec/Reader14443-2A.h +++ b/Firmware/Chameleon-Mini/Codec/Reader14443-2A.h @@ -19,5 +19,7 @@ void Reader14443ACodecTask(void); /* Application Interface */ void Reader14443ACodecStart(void); void Reader14443ACodecReset(void); +bool Reader14443ACodecSendingOrReceiving(void); +void Reader14443AMillerEOC(void); #endif /* READER14443_2A_H_ */ diff --git a/Firmware/Chameleon-Mini/Codec/Reader14443-ISR.S b/Firmware/Chameleon-Mini/Codec/Reader14443-ISR.S new file mode 100644 index 0000000..f41b045 --- /dev/null +++ b/Firmware/Chameleon-Mini/Codec/Reader14443-ISR.S @@ -0,0 +1,110 @@ +#include + +#define Zero R0 +#define Tmp R16 +#define BitCountL R18 +#define BitCountH R19 +#define NewLoad R20 +#define SampleRegister R21 + +#define GPIORBitCountL 4 +#define GPIORBitCountH 5 +#define CodecBufferPtrL 10 +#define CodecBufferPtrH 11 + +#define AWEXC__OUTOVEN 0x088C +#define CODEC_READER_TIMER__CTRLA 0x0800 + +.global TCD0_CCB_vect, Reader14443AMillerEOC +TCD0_CCB_vect: +push Zero ; 1 +eor Zero, Zero ; 1 +push Tmp ; 1 +push BitCountL ; 1 +push BitCountH ; 1 +push NewLoad ; 1 +push SampleRegister ; 1 +in Tmp, 0x3f ; SREG ; 1 +push Tmp ; 1 +push ZL ; 1 +push ZH ; 1 + ; SUM: 8 +in ZL, CodecBufferPtrL +in ZH, CodecBufferPtrH +ld SampleRegister, Z+ +clr NewLoad + +in BitCountH, GPIORBitCountH +in BitCountL, GPIORBitCountL + + + +LOOP: +; POINT ZERO +lsr SampleRegister ; 1 +brcc NO_TURNOFF_COMPENSATION ; 1 / 2 + + sts AWEXC__OUTOVEN, Zero ; turn off field ; 2 + sts CODEC_READER_TIMER__CTRLA, Zero ; 2 + + ldi Tmp, 0x16 ; 1 + TURNOFF_LOOP: + dec Tmp ; 1 + brne TURNOFF_LOOP ; 1 / 2 ; sums up to 21 * 3 + 2 + rjmp .+0 ; double nop ; 2 + + ldi Tmp, 0x01 ; 1 + sts CODEC_READER_TIMER__CTRLA, Tmp ; turn on field ; 2 + ldi Tmp, 0x03 ; 1 + sts AWEXC__OUTOVEN, Tmp ; 2 + + rjmp NO_TURNOFF ; 2 + ; SUM: 82 until now + + +NO_TURNOFF_COMPENSATION: +ldi Tmp, 26 ; 1 +NO_TURNOFF_COMPENSATION_LOOP: + dec Tmp ; 1 + brne NO_TURNOFF_COMPENSATION_LOOP ; 1 / 2 sums up to 25 * 3 + 2 +nop ; 1 +NO_TURNOFF: ; 82 at this point +subi BitCountL, 1 ; decrement BitCount ; 1 +sbci BitCountH, 0 ; 1 +brne NO_EOC ; 1 / 2 + + ; EOC: + call Reader14443AMillerEOC + rjmp RETURN + +NO_EOC: ; 86 at this point +subi NewLoad, 0xFF ; 1 +andi NewLoad, 0x07 ; 1 +brne LOAD_COMPENSATION ; 1 / 2 + ; SUM: 4 + ld SampleRegister, Z+ ; 3 + rjmp NOP_LOOP_INIT ; 2 + +LOAD_COMPENSATION: ; 90 at this point +rjmp .+0 ; double nop ; 2 +rjmp .+0 ; double nop ; 2 +NOP_LOOP_INIT: +ldi Tmp, 10 ; 1 +NOP_LOOP: + dec Tmp ; 1 + brne NOP_LOOP ; 1 / 2 sums up to 9 * 3 + 2 +rjmp .+0 ; 2 +rjmp LOOP ; 2 + +RETURN: +pop ZH +pop ZL +pop Tmp +out 0x3f, Tmp ; SREG +pop SampleRegister +pop NewLoad +pop BitCountH +pop BitCountL +pop Tmp +pop Zero +reti ; 2 diff --git a/Firmware/Chameleon-Mini/Makefile b/Firmware/Chameleon-Mini/Makefile index 6ce0adc..9ac56db 100644 --- a/Firmware/Chameleon-Mini/Makefile +++ b/Firmware/Chameleon-Mini/Makefile @@ -90,7 +90,7 @@ TARGET = Chameleon-Mini OPTIMIZATION = s SRC += $(TARGET).c LUFADescriptors.c System.c Configuration.c Random.c Common.c Memory.c MemoryAsm.S Button.c Log.c Settings.c LED.c Map.c AntennaLevel.c SRC += Terminal/Terminal.c Terminal/Commands.c Terminal/XModem.c Terminal/CommandLine.c -SRC += Codec/Codec.c Codec/ISO14443-2A.c Codec/Reader14443-2A.c +SRC += Codec/Codec.c Codec/ISO14443-2A.c Codec/Reader14443-2A.c Codec/Reader14443-ISR.S SRC += Application/MifareUltralight.c Application/MifareClassic.c Application/ISO14443-3A.c Application/Crypto1.c Application/Reader14443A.c SRC += $(LUFA_SRC_USB) $(LUFA_SRC_USBCLASS) LUFA_PATH = ../LUFA From 7bd0ef1e60c64a0892d8db5dc456a2a03ad45531 Mon Sep 17 00:00:00 2001 From: Georg Date: Mon, 22 Jan 2018 08:53:14 +0100 Subject: [PATCH 048/104] removed project files --- Firmware/Chameleon-Mini/.cproject | 45 ------------------------------- Firmware/Chameleon-Mini/.project | 26 ------------------ 2 files changed, 71 deletions(-) delete mode 100644 Firmware/Chameleon-Mini/.cproject delete mode 100644 Firmware/Chameleon-Mini/.project diff --git a/Firmware/Chameleon-Mini/.cproject b/Firmware/Chameleon-Mini/.cproject deleted file mode 100644 index 2085963..0000000 --- a/Firmware/Chameleon-Mini/.cproject +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Firmware/Chameleon-Mini/.project b/Firmware/Chameleon-Mini/.project deleted file mode 100644 index bcb4b7c..0000000 --- a/Firmware/Chameleon-Mini/.project +++ /dev/null @@ -1,26 +0,0 @@ - - - ChamGH - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - clean,full,incremental, - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - org.eclipse.cdt.core.cnature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - - From 6c64bc39e044087b6a1a07b74e13b4cfd59af98d Mon Sep 17 00:00:00 2001 From: Georg Date: Mon, 22 Jan 2018 09:10:23 +0100 Subject: [PATCH 049/104] updated LATEST firmware --- .../Chameleon-Mini/Latest/Chameleon-Mini.eep | 2 +- .../Chameleon-Mini/Latest/Chameleon-Mini.hex | 6000 ++++++++--------- 2 files changed, 2981 insertions(+), 3021 deletions(-) diff --git a/Firmware/Chameleon-Mini/Latest/Chameleon-Mini.eep b/Firmware/Chameleon-Mini/Latest/Chameleon-Mini.eep index 239b5c4..393e2d1 100644 --- a/Firmware/Chameleon-Mini/Latest/Chameleon-Mini.eep +++ b/Firmware/Chameleon-Mini/Latest/Chameleon-Mini.eep @@ -1,4 +1,4 @@ -:1000000000006A2E060608080000040132000606F9 +:1000000000006B2E060608080000040132000606F8 :100010000808000004013200060608080000040178 :10002000320006060808000004013200060608082F :100030000000040132000606080800000401320036 diff --git a/Firmware/Chameleon-Mini/Latest/Chameleon-Mini.hex b/Firmware/Chameleon-Mini/Latest/Chameleon-Mini.hex index 29d6339..8b97510 100644 --- a/Firmware/Chameleon-Mini/Latest/Chameleon-Mini.hex +++ b/Firmware/Chameleon-Mini/Latest/Chameleon-Mini.hex @@ -1,3044 +1,3004 @@ -:100000000C94580B0C947D0B0C947D0B0C947D0B75 -:100010000C947D0B0C947D0B0C947D0B0C947D0B40 -:100020000C947D0B0C947D0B0C94AC0C0C947D0B00 -:100030000C947D0B0C947D0B0C947D0B0C947D0B20 -:100040000C947D0B0C947D0B0C947D0B0C947D0B10 -:100050000C947D0B0C947D0B0C947D0B0C947D0B00 -:100060000C947D0B0C947D0B0C947D0B0C947D0BF0 -:100070000C947D0B0C947D0B0C947D0B0C947D0BE0 -:100080000C947D0B0C947D0B0C947A230C947D0BBB -:100090000C947D0B0C947D0B0C947D0B0C947D0BC0 -:1000A0000C947D0B0C947D0B0C947D0B0C947D0BB0 -:1000B0000C947D0B0C947D0B0C947D0B0C944A24BA -:1000C0000C947D0B0C940C280C947D0B0C947D0BE4 -:1000D0000C947D0B0C947D0B0C947D0B0C947D0B80 -:1000E0000C947D0B0C947D0B0C947D0B0C947D0B70 -:1000F0000C947D0B0C947D0B0C947D0B0C947D0B60 -:100100000C947D0B0C947D0B0C947D0B0C947D0B4F -:100110000C947D0B0C94E7270C947D0B0C947D0BB9 -:100120000C947D0B0C947D0B0C947D0B0C947D0B2F -:100130000C947D0B0C947D0B0C947D0B0C94B223D2 -:100140000C94B2260C947D0B0C947D0B0C947D0BBF -:100150000C947D0B0C947C270C947D0B0C947D0BE4 -:100160000C947D0B0C947D0B0C947D0B0C947D0BEF -:100170000C947D0B0C947D0B0C947D0B0C947D0BDF -:100180000C947D0B0C947D0B0C947D0B0C947D0BCF -:100190000C947D0B0C947D0B0C947D0B0C947D0BBF -:1001A0000C947D0B0C947D0B0C947D0B0C947D0BAF -:1001B0000C947D0B0C947D0B0C947D0B0C947D0B9F -:1001C0000C947D0B0C947D0B0C947D0B0C947D0B8F -:1001D0000C947D0B0C947D0B0C947D0B0C947D0B7F -:1001E0000C947D0B0C947D0B0C947D0B0C947D0B6F -:1001F0000C947D0B0C94E9520C947D0B1E03430070 -:10020000680061006D0065006C0065006F006E00A5 -:100210002D004D0069006E00690000002A034B00AC -:10022000610073007000650072002000260020004D -:100230004F007300770061006C00640020004700ED -:100240006D006200480000000403090409023E003A -:10025000020100C03209040000010202010005246D -:10026000001001042402060524060001070582038C -:100270000800FF09040100020A000000070504024B -:10028000100005070583021000051201100102008D -:100290000008D016B20401000102DC01560D570D12 -:1002A000580D590D5A0D5B0D5C0D5D0D600D610D06 -:1002B000000000010B2577259625BC2AC22AC62AF4 -:1002C0005C0DC72A872C9A2C400007000B25772548 -:1002D0009625DA2C072D0B2D5C0D0C2D03341F34C5 -:1002E000000404000B2577259625E92C072D0B2DFE -:1002F0005C0D0C2D03341F34000407000B257725FB -:100300009625F82C072D0B2D5C0D0C2D03341F3476 -:10031000001004000B2577259625F82C072D0B2DB2 -:100320005C0D0C2D03341F34001007000B257725BE -:100330009625590D5A0D5B0D5C0D5D0D600D610D1F -:10034000000000012726A026DF2838433B4348430E -:1003500049436E43600D610D00000000004E4F4E9A -:100360004500000000000000000000000000000048 -:1003700000000000000000000000000000014D46E9 -:100380005F554C5452414C4947485400000000000E -:100390000000000000000000000000000000024D0E -:1003A000465F434C41535349435F314B00000000CB -:1003B000000000000000000000000000000000033A -:1003C0004D465F434C41535349435F314B5F374286 -:1003D000000000000000000000000000000000001D -:1003E000044D465F434C41535349435F344B000037 -:1003F00000000000000000000000000000000000FD -:1004000000054D465F434C41535349435F344B5FB6 -:100410003742000000000000000000000000000063 -:1004200000000649534F3134343433415F534E4951 -:100430004646000000000000000000000000000030 -:100440000000000749534F3134343433415F524583 -:100450004144455200000000000000000000000080 -:100460000000000001000001000101000001010086 -:100470000100000100010100010000010100000174 -:100480000001010000010100010000010100000164 -:100490000001010001000001000101000001010054 -:1004A0000100000100010100010000010100000144 -:1004B0000001010001000001000101000001010034 -:1004C0000100000101000001000101000001010024 -:1004D0000100000100010100010000010100000114 -:1004E0000001010000010100010000010100000104 -:1004F00000010100010000010001010000010100F4 -:1005000001000001010000010001010000010100E3 -:1005100001000001000101000100000101000001D3 -:1005200000010100010000010001010000010100C3 -:1005300001000001000101000100000101000001B3 -:1005400000010100000101000100000101000001A3 -:100550000001010001000001000101000001010093 -:1005600001000001008040C020A060E0109050D049 -:1005700030B070F0088848C828A868E8189858D89B -:1005800038B878F8048444C424A464E4149454D49B -:1005900034B474F40C8C4CCC2CAC6CEC1C9C5CDC3B -:1005A0003CBC7CFC028242C222A262E2129252D283 -:1005B00032B272F20A8A4ACA2AAA6AEA1A9A5ADA3B -:1005C0003ABA7AFA068646C626A666E6169656D63B -:1005D00036B676F60E8E4ECE2EAE6EEE1E9E5EDEDB -:1005E0003EBE7EFE018141C121A161E1119151D147 -:1005F00031B171F1098949C929A969E9199959D90B -:1006000039B979F9058545C525A565E5159555D50A -:1006100035B575F50D8D4DCD2DAD6DED1D9D5DDDAA -:100620003DBD7DFD038343C323A363E3139353D3F2 -:1006300033B373F30B8B4BCB2BAB6BEB1B9B5BDBAA -:100640003BBB7BFB078747C727A767E7179757D7AA -:1006500037B777F70F8F4FCF2FAF6FEF1F9F5FDF4A -:100660003FBF7FFF004E4F4E4500000000000000DE -:10067000000000000000000000000000000000007A -:100680000000000000015549445F52414E444F4D67 -:10069000000000000000000000000000000000005A -:1006A000000000000000025549445F4C4546545F7D -:1006B000494E4352454D454E540000000000000095 -:1006C00000000000000000035549445F52494748BC -:1006D000545F494E4352454D454E540000000000C2 -:1006E0000000000000000000045549445F4C4546EE -:1006F000545F44454352454D454E540000000000B0 -:10070000000000000000000000055549445F524908 -:100710004748545F44454352454D454E5400000000 -:1007200000000000000000000000064359434C4553 -:100730005F53455454494E475300000000000000E9 -:1007400000000000000000000000000753544F525A -:10075000455F4D454D000000000000000000000016 -:1007600000000000000000000000000008524543A7 -:10077000414C4C5F4D454D00000000000000000062 -:100780000000000000000000000000000009544FBD -:1007900047474C455F4649454C4400000000000077 -:1007A00000000000000000000000000000000A53EC -:1007B000544F52455F4C4F470000000000000000BE -:1007C0000000000000000000000000000000000029 -:1007D0004F4646000000000000000000000000003E -:1007E0000000000000000000000000000000000009 -:1007F000014D454D4F52590000000000000000001F -:1008000000000000000000000000000000000000E8 -:1008100000024C49564500000000000000000000A6 -:1008200000000000000000000000000000000000C8 -:100830000000004E4F4E4500000000000000000088 -:1008400000000000000000000000000000000000A8 -:1008500000000001504F5745524544000000000081 -:100860000000000000000000000000000000000088 -:1008700000000000025445524D494E414C5F434F29 -:100880004E4E0000000000000000000000000000CC -:100890000000000000035445524D494E414C5F5248 -:1008A0005854580000000000000000000000000044 -:1008B0000000000000000453455454494E475F4374 -:1008C00048414E47450000000000000000000000C5 -:1008D00000000000000000054D454D4F52595F5388 -:1008E000544F52454400000000000000000000008A -:1008F0000000000000000000064D454D4F52595FBA -:100900004348414E474544000000000000000000FD -:1009100000000000000000000008434F4445435F12 -:10092000525800000000000000000000000000001D -:100930000000000000000000000009434F44454350 -:100940005F5458000000000000000000000000009C -:100950000000000000000000000000074649454C70 -:10096000445F4445544543544544000000000000A2 -:100970000000000000000000000000000A4C4F478B -:100980004D454D5F46554C4C0000000000000000F6 -:100990000000000000000000000000000025632CA3 -:1009A00025630025356400416E7920696E746567A2 -:1009B00065722066726F6D203020746F2025752E51 -:1009C000205265666572656E636520766F6C746132 -:1009D00067652077696C6C20626520285643432048 -:1009E0002A205448524553484F4C44202F2034303D -:1009F000393529206D562E002575002535640030C7 -:100A0000203D206E6F2074696D656F75740D0A311D -:100A10002D363030203D20313030206D73202D2098 -:100A20003630303030206D732074696D656F7574A9 -:100A3000002575206D730025342E3458002535753A -:100A4000206D56002575202866726F6D20776869C5 -:100A50006368202575206E6F6E2D766F6C617469EA -:100A60006C65290025750025750025632C2563001C -:100A700052414E444F4D004E4F205549442E0043A5 -:100A800068616D656C656F6E4D696E692052657643 -:100A900047202553207573696E67204C55464120C9 -:100AA000255320636F6D70696C6564207769746885 -:100AB000204156522D4743432025532E2042617337 -:100AC0006564206F6E20746865206F70656E2D738D -:100AD0006F75726365204E464320746F6F6C2043C0 -:100AE00068616D656C656F6E4D696E692E20687406 -:100AF0007470733A2F2F6769746875622E636F6D17 -:100B00002F656D7365632F4368616D656C656F6EEE -:100B10004D696E6920636F6D6D69742025530031D6 -:100B200037313130370031353131313500342E39FC -:100B30002E320033336633353235000D0A000D0A8C -:100B4000000D0A000D0A000D0A000D0A0064313084 -:100B5000303A4F4B00000000000000000000000091 -:100B600000000000000000000000000000006531EF -:100B700030313A4F4B20574954482054455854007F -:100B80000000000000000000000000000000006EF7 -:100B90003131303A57414954494E4720464F52204F -:100BA000584D4F44454D000000000000000000007B -:100BB000C83230303A554E4B4E4F574E20434F4D72 -:100BC0004D414E4400000000000000000000000005 -:100BD00000C93230313A494E56414C494420434FC6 -:100BE0004D4D414E44205553414745000000000003 -:100BF0000000CA3230323A494E56414C49442050E6 -:100C00004152414D45544552000000000000000093 -:100C1000000000783132303A46414C534500000024 -:100C200000000000000000000000000000000000C4 -:100C300000000000793132313A545255450000002D -:100C400000000000000000000000000000000000A4 -:100C50000000000000CB3230333A54494D454F5527 -:100C60005400000000000000000000000000000030 -:100C700000000000000056455253494F4E0000004E -:100C80000000000000000000000000007A19434F3F -:100C90004E46494700000000000000000000000030 -:100CA0000000A2199C1955494400000000000000F2 -:100CB00000000000000000000000F819B9195245BA -:100CC00041444F4E4C59000000000000000000005D -:100CD0000000561A4A1A55504C4F4144000000007B -:100CE000000000000000831A000000000000444FD4 -:100CF000574E4C4F41440000000000000000881A8D -:100D00000000000000005245534554000000000060 -:100D10000000000000008D1A000000000000555087 -:100D20004752414445000000000000000000981AAE -:100D30000000000000004D454D53495A4500000099 -:100D4000000000000000000000000000A31A554948 -:100D50004453495A45000000000000000000000014 -:100D600000000000BB1A52425554544F4E00000080 -:100D700000000000000000000000D81AD11A524202 -:100D80005554544F4E5F4C4F4E470000000000003A -:100D90000000F41AED1A4C425554544F4E00000016 -:100DA00000000000000000000000101B091B4C4266 -:100DB0005554544F4E5F4C4F4E470000000000000A -:100DC00000002C1B251B4C4544475245454E000056 -:100DD00000000000000000000000481B411B4C45C3 -:100DE00044524544000000000000000000000000E4 -:100DF0000000641B5D1B4C4F474D4F4445000000F5 -:100E0000000000000000000000007E1B791B4C4F1A -:100E1000474D454D000000000000000000000000AC -:100E200000000000931B4C4F47444F574E4C4F411E -:100E3000440000000000B81B0000000000004C4F00 -:100E40004753544F52450000000000000000BD1BF6 -:100E50000000000000004C4F47434C454152000049 -:100E6000000000000000C01B00000000000053450F -:100E70005454494E470000000000000000000000EC -:100E80000000C81BC31B434C45415200000000003A -:100E9000000000000000D01B0000000000005354C0 -:100EA0004F52450000000000000000000000D41B6D -:100EB000000000000000524543414C4C000000007F -:100EC000000000000000D81B0000000000004348A4 -:100ED000415247494E47000000000000000000005A -:100EE00000000000DC1B48454C50000000000000E2 -:100EF000000000000000E41B00000000000052534E -:100F00005349000000000000000000000000000045 -:100F100000000000201C5359535449434B0000006B -:100F2000000000000000000000000000531C5345BA -:100F30004E445F52415700000000000000000000D6 -:100F4000F91C0000000053454E4400000000000062 -:100F500000000000000000006F1C0000000047457A -:100F60005455494400000000000000000000B51D79 -:100F700000000000000044554D505F4D46550000F4 -:100F8000000000000000981D00000000000049441F -:100F9000454E544946590000000000000000D21D93 -:100FA00000000000000054494D454F55540000001A -:100FB000000000000000000000000F1EEF1D54485C -:100FC000524553484F4C4400000000000000000010 -:100FD0000000731E5B1E4155544F43414C49425221 -:100FE000415445000000F91E000000000000464981 -:100FF000454C44000000000000000000000000001C -:101000000000BF1EE91E00000000000000000000FC -:10101000000000000000000000000000000053413C -:101020004B3A09005549443A0900415451413A09A3 -:10103000005468657265206973206174206C656175 -:101040007374206F6E65206D6F72652063617264CA -:1010500020747970652063616E6469646174652CC5 -:101060002062757420746865726520776173206EE4 -:101070006F7420656E6F756768207465726D696E38 -:10108000616C206275666665722073706163652E9F -:101090000D0A002D0D0A002B0D0A000400010901A4 -:1010A0000000000000000000000000000000000040 -:1010B00000004E585000000000000000000000003A -:1010C00000004D4946415245204D696E69000000BF -:1010D0000000000000000000000000000000000010 -:1010E0000000000000000000000000000000000000 -:1010F00000000000000000000000000000000000F0 -:1011000000000400010801000000000000000000D1 -:101110000000000000000000004E585000000000D9 -:101120000000000000000000004D494641524520EB -:10113000436C617373696320316B00000000000031 -:10114000000000000000000000000000000000009F +:100000000C948F0B0C94B40B0C94B40B0C94B40B99 +:100010000C94B40B0C94B40B0C94B40B0C94B40B64 +:100020000C94B40B0C94B40B0C94240D0C94B40BE2 +:100030000C94B40B0C94B40B0C94B40B0C94B40B44 +:100040000C94B40B0C94B40B0C94B40B0C94B40B34 +:100050000C94B40B0C94B40B0C94B40B0C94B40B24 +:100060000C94B40B0C94B40B0C94B40B0C94B40B14 +:100070000C94B40B0C94B40B0C94B40B0C94B40B04 +:100080000C94B40B0C94B40B0C94AA230C94B40BE6 +:100090000C94B40B0C94B40B0C94B40B0C94B40BE4 +:1000A0000C94B40B0C94B40B0C94B40B0C94B40BD4 +:1000B0000C94B40B0C94B40B0C94B40B0C947924E6 +:1000C0000C94B40B0C94ED270C94B40B0C94B40B5F +:1000D0000C94B40B0C94B40B0C94B40B0C94B40BA4 +:1000E0000C94B40B0C94B40B0C94B40B0C94B40B94 +:1000F0000C94B40B0C94B40B0C94B40B0C94B40B84 +:100100000C94B40B0C94B40B0C94B40B0C94B40B73 +:100110000C94B40B0C94C8270C94B40B0C94B40B33 +:100120000C94B40B0C94B40B0C94B40B0C94B40B53 +:100130000C94B40B0C94B40B0C94B40B0C94E223FD +:100140000C94ED0B0C94E3260C94B40B0C94B40BB0 +:100150000C94B40B0C943F270C94B40B0C94B40B7C +:100160000C94B40B0C94B40B0C94B40B0C94B40B13 +:100170000C94B40B0C94B40B0C94B40B0C94B40B03 +:100180000C94B40B0C94B40B0C94B40B0C94B40BF3 +:100190000C94B40B0C94B40B0C94B40B0C94B40BE3 +:1001A0000C94B40B0C94B40B0C94B40B0C94B40BD3 +:1001B0000C94B40B0C94B40B0C94B40B0C94B40BC3 +:1001C0000C94B40B0C94B40B0C94B40B0C94B40BB3 +:1001D0000C94B40B0C94B40B0C94B40B0C94B40BA3 +:1001E0000C94B40B0C94B40B0C94B40B0C94B40B93 +:1001F0000C94B40B0C9494510C94B40B6364696E1E +:100200006F70737578585B001E03430068006100CF +:100210006D0065006C0065006F006E002D004D00E4 +:1002200069006E00690000002A034B006100730042 +:100230007000650072002000260020004F0073004F +:10024000770061006C006400200047006D006200D0 +:10025000480000000403090409023E00020100C036 +:10026000320904000001020201000524001001040B +:100270002402060524060001070582030800FF0981 +:10028000040100020A00000007050402100005072F +:100290000583021000051201100102000008D016AB +:1002A000B20401000102DC01D40DD50DD60DD70D2D +:1002B000D80DD90DCE0DCF0DD30DD20D00000001FC +:1002C0003A25A625C525532C6F2C732CCE0D742CE6 +:1002D000922FA52F400007003A25A625C525672C9B +:1002E0006F2C732CCE0D742C922FA52F500007006D +:1002F0003A25A625C5256B2C6F2C732CCE0D742C9E +:10030000922FA52FA40007003A25A625C525E52F85 +:1003100012301630CE0D1730F836143700040400B2 +:100320003A25A625C525F42F12301630CE0D1730EC +:10033000F8361437000407003A25A625C5250330F2 +:1003400012301630CE0D1730F83614370010040076 +:100350003A25A625C525033012301630CE0D1730AC +:10036000F8361437001007003A25A625C525D70D05 +:10037000D80DD90DCE0DCF0DD30DD20D000000013B +:100380005626D1268928DA45DD45EA45EB45324730 +:10039000D30DD20D00000000004E4F4E450000006E +:1003A000000000000000000000000000000000004D +:1003B000000000000000000000014D465F554C5455 +:1003C00052414C4947485400000000000000000022 +:1003D00000000000000000000000024D465F554C88 +:1003E0005452414C494748545F4556315F3830427A +:1003F0000000000000000000000000034D465F55B3 +:100400004C5452414C494748545F4556315F313650 +:10041000344200000000000000000000044D465F70 +:10042000434C41535349435F314B000000000000EF +:1004300000000000000000000000000000054D4624 +:100440005F434C41535349435F314B5F3742000098 +:100450000000000000000000000000000000064D49 +:10046000465F434C41535349435F344B0000000007 +:100470000000000000000000000000000000000775 +:100480004D465F434C41535349435F344B5F3742C2 +:10049000000000000000000000000000000000005C +:1004A0000849534F3134343433415F534E49464643 +:1004B000000000000000000000000000000000003C +:1004C000000949534F3134343433415F524541447C +:1004D0004552000000000000000000000000000085 +:1004E0000000010000010001010000010100010005 +:1004F00000010001010001000001010000010001F4 +:1005000001000001010001000001010000010001E3 +:1005100001000100000100010100000101000100D3 +:1005200000010001010001000001010000010001C3 +:1005300001000100000100010100000101000100B3 +:1005400000010100000100010100000101000100A3 +:100550000001000101000100000101000001000193 +:100560000100000101000100000101000001000183 +:100570000100010000010001010000010100010073 +:100580000001010000010001010000010100010063 +:100590000001000101000100000101000001000153 +:1005A0000100010000010001010000010100010043 +:1005B0000001000101000100000101000001000133 +:1005C0000100000101000100000101000001000123 +:1005D0000100010000010001010000010100010013 +:1005E0000001008040C020A060E0109050D030B0EA +:1005F00070F0088848C828A868E8189858D838B80B +:1006000078F8048444C424A464E4149454D434B422 +:1006100074F40C8C4CCC2CAC6CEC1C9C5CDC3CBCAA +:100620007CFC028242C222A262E2129252D232B216 +:1006300072F20A8A4ACA2AAA6AEA1A9A5ADA3ABAAA +:100640007AFA068646C626A666E6169656D636B6C2 +:1006500076F60E8E4ECE2EAE6EEE1E9E5EDE3EBE4A +:100660007EFE018141C121A161E1119151D131B1E0 +:1006700071F1098949C929A969E9199959D939B97A +:1006800079F9058545C525A565E5159555D535B592 +:1006900075F50D8D4DCD2DAD6DED1D9D5DDD3DBD1A +:1006A0007DFD038343C323A363E3139353D333B386 +:1006B00073F30B8B4BCB2BAB6BEB1B9B5BDB3BBB1A +:1006C0007BFB078747C727A767E7179757D737B732 +:1006D00077F70F8F4FCF2FAF6FEF1F9F5FDF3FBFBA +:1006E0007FFF004E4F4E450000000000000000005C +:1006F00000000000000000000000000000000000FA +:10070000000000015549445F52414E444F4D0000E6 +:1007100000000000000000000000000000000000D9 +:1007200000000000025549445F4C4546545F494E65 +:100730004352454D454E54000000000000000000AB +:100740000000000000035549445F52494748545F88 +:10075000494E4352454D454E5400000000000000F4 +:10076000000000000000045549445F4C4546545FBA +:1007700044454352454D454E5400000000000000E2 +:1007800000000000000000055549445F52494748F9 +:10079000545F44454352454D454E5400000000000F +:1007A0000000000000000000064359434C455F5321 +:1007B000455454494E47530000000000000000001B +:1007C0000000000000000000000753544F52455F36 +:1007D0004D454D000000000000000000000000003A +:1007E0000000000000000000000008524543414C9A +:1007F0004C5F4D454D00000000000000000000006F +:10080000000000000000000000000009544F4747AE +:100810004C455F4649454C44000000000000000084 +:100820000000000000000000000000000A53544FC8 +:1008300052455F4C4F4700000000000000000000E0 +:1008400000000000000000000000000000004F4613 +:100850004600000000000000000000000000000052 +:100860000000000000000000000000000000014D3A +:10087000454D4F52590000000000000000000000EC +:100880000000000000000000000000000000000266 +:100890004C49564500000000000000000000000028 +:1008A0000000000000000000000000000000000048 +:1008B000004E4F4E45000000000000000000000008 +:1008C0000000000000000000000000000000000028 +:1008D0000001504F57455245440000000000000001 +:1008E0000000000000000000000000000000000008 +:1008F0000000025445524D494E414C5F434F4E4E0D +:1009000000000000000000000000000000000000E7 +:10091000000000035445524D494E414C5F5258541B +:10092000580000000000000000000000000000006F +:10093000000000000453455454494E475F4348416A +:100940004E474500000000000000000000000000CD +:100950000000000000054D454D4F52595F53544F64 +:1009600052454400000000000000000000000000AC +:10097000000000000000064D454D4F52595F4348AE +:10098000414E474544000000000000000000000008 +:100990000000000000000008434F4445435F5258E8 +:1009A0000000000000000000000000000000000047 +:1009B000000000000000000009434F4445435F541D +:1009C00058000000000000000000000000000000CF +:1009D000000000000000000000074649454C445F4D +:1009E00044455445435445440000000000000000C5 +:1009F000000000000000000000000A4C4F474D4579 +:100A00004D5F46554C4C0000000000000000000007 +:100A1000000000000000000000000025632C25639A +:100A20000025356400416E7920696E7465676572D2 +:100A30002066726F6D203020746F2025752E205235 +:100A400065666572656E636520766F6C7461676557 +:100A50002077696C6C2062652028564343202A2049 +:100A60005448524553484F4C44202F203430393598 +:100A700029206D562E002575002535640030203D57 +:100A8000206E6F2074696D656F75740D0A312D3697 +:100A90003030203D20313030206D73202D20363015 +:100AA000303030206D732074696D656F757400256A +:100AB00075206D730025342E345800253575206D52 +:100AC00056002575202866726F6D20776869636807 +:100AD000202575206E6F6E2D766F6C6174696C6564 +:100AE000290025750025750025632C2563005241DA +:100AF0004E444F4D004E4F205549442E00436861EF +:100B00006D656C656F6E4D696E6920526576472024 +:100B10002553207573696E67204C55464120255337 +:100B200020636F6D70696C6564207769746820411B +:100B300056522D4743432025532E2042617365644E +:100B4000206F6E20746865206F70656E2D736F75F1 +:100B5000726365204E464320746F6F6C204368615A +:100B60006D656C656F6E4D696E692E20687474706A +:100B7000733A2F2F6769746875622E636F6D2F65E6 +:100B80006D7365632F4368616D656C656F6E4D694C +:100B90006E6920636F6D6D697420255300313830A4 +:100BA0003132320031353131313500352E342E308D +:100BB0000037626430656631000D0A000D0A000DD1 +:100BC0000A000D0A000D0A000D0A00643130303AA7 +:100BD0004F4B00000000000000000000000000007B +:100BE000000000000000000000000000653130310E +:100BF0003A4F4B2057495448205445585400000060 +:100C0000000000000000000000000000006E313114 +:100C1000303A57414954494E4720464F5220584D8B +:100C20004F44454D00000000000000000000C832A5 +:100C300030303A554E4B4E4F574E20434F4D4D415D +:100C40004E4400000000000000000000000000C949 +:100C50003230313A494E56414C494420434F4D4D74 +:100C6000414E44205553414745000000000000001C +:100C7000CA3230323A494E56414C494420504152D2 +:100C8000414D4554455200000000000000000000A6 +:100C900000783132303A46414C53450000000000A4 +:100CA0000000000000000000000000000000000044 +:100CB0000000793132313A545255450000000000AD +:100CC0000000000000000000000000000000000024 +:100CD000000000CB3230333A54494D454F55540053 +:100CE0000000000000000000000000000000000004 +:100CF0000000000056455253494F4E0000000000CE +:100D000000000000000000000000AF19434F4E46F5 +:100D10004947000000000000000000000000000043 +:100D2000D719D11955494400000000000000000007 +:100D300000000000000000002D1AEE195245414449 +:100D40004F4E4C5900000000000000000000000061 +:100D50008B1A7F1A55504C4F414400000000000090 +:100D600000000000B81A000000000000444F574E79 +:100D70004C4F41440000000000000000BD1A00007C +:100D800000000000524553455400000000000000E0 +:100D900000000000C21A0000000000005550475239 +:100DA000414445000000000000000000CD1A000092 +:100DB000000000004D454D53495A45000000000019 +:100DC00000000000000000000000D81A55494453FC +:100DD000495A45000000000000000000000000002B +:100DE0000000F01A52425554544F4E0000000000CB +:100DF00000000000000000000D1B061B524255546D +:100E0000544F4E5F4C4F4E47000000000000000062 +:100E1000291B221B4C425554544F4E000000000029 +:100E20000000000000000000451B3E1B4C425554D2 +:100E3000544F4E5F4C4F4E47000000000000000032 +:100E4000611B5A1B4C4544475245454E000000006B +:100E500000000000000000007D1B761B4C45445242 +:100E600045440000000000000000000000000000F9 +:100E7000991B921B4C4F474D4F444500000000000A +:100E80000000000000000000B31BAE1B4C4F474D9C +:100E9000454D0000000000000000000000000000C0 +:100EA0000000C81B4C4F47444F574E4C4F41440025 +:100EB00000000000ED1B0000000000004C4F4753F5 +:100EC000544F52450000000000000000F21B0000DB +:100ED000000000004C4F47434C45415200000000C9 +:100EE00000000000F51B00000000000053455454B2 +:100EF000494E470000000000000000000000000014 +:100F0000FD1BF81B434C454152000000000000004F +:100F100000000000051C00000000000053544F5268 +:100F2000450000000000000000000000091C000057 +:100F300000000000524543414C4C000000000000FE +:100F4000000000000D1C000000000000434841525A +:100F500047494E470000000000000000000000006C +:100F60000000111C48454C5000000000000000002B +:100F700000000000191C00000000000052535349FB +:100F80000000000000000000000000000000000061 +:100F90000000551C5359535449434B0000000000B6 +:100FA00000000000000000000000881C53454E4473 +:100FB0005F524157000000000000000000002E1D9D +:100FC0000000000053454E440000000000000000F7 +:100FD000000000000000A41C00000000474554551C +:100FE000494400000000000000000000EA1D00006D +:100FF0000000000044554D505F4D46550000000074 +:1010000000000000CD1D0000000000004944454ED6 +:10101000544946590000000000000000071E00006F +:101020000000000054494D454F5554000000000099 +:101030000000000000000000441E241E54485245D9 +:1010400053484F4C44000000000000000000000026 +:10105000A81E901E4155544F43414C4942524154A1 +:1010600045000000321F0000000000004649454CCA +:10107000440000000000000000000000000000002C +:10108000F41E1E1F00000000000000000000000011 +:1010900000000000000000000000000053414B3A37 +:1010A00009005549443A0900415451413A09005454 +:1010B00068657265206973206174206C6561737462 +:1010C000206F6E65206D6F7265206361726420749D +:1010D0007970652063616E6469646174652C206257 +:1010E000757420746865726520776173206E6F7403 +:1010F00020656E6F756768207465726D696E616CCE +:10110000206275666665722073706163652E0D0AD4 +:10111000000D0A00040001090100000000000000A9 +:1011200000000000000000000000004E58500000C9 +:1011300000000000000000000000004D4946415240 +:1011400045204D696E6900000000000000000000AD :10115000000000000000000000000000000000008F -:101160000000000000000000000200011801000063 -:10117000000000000000000000000000000000006F -:101180004E58500000000000000000000000000069 -:101190004D494641524520436C6173736963203465 -:1011A0006B000000000000000000000000000000D4 -:1011B000000000000000000000000000000000002F +:10116000000000000000000000000000000000007F +:101170000000000000000000000000040001080161 +:10118000000000000000000000000000000000005F +:1011900000004E5850000000000000000000000059 +:1011A00000004D494641524520436C6173736963A9 +:1011B00020316B0000000000000000000000000073 :1011C000000000000000000000000000000000001F -:1011D00044000100010000000000000000000000C9 -:1011E000000000000000004E585000000000000009 -:1011F000000000000000004D494641524520556C5A -:101200007472616C6967687400000000000000007F -:1012100000000000000000000000000000000000CE +:1011D000000000000000000000000000000000000F +:1011E00000000200011801000000000000000000E3 +:1011F0000000000000000000004E585000000000F9 +:101200000000000000000000004D4946415245200A +:10121000436C617373696320346B0000000000004D :1012200000000000000000000000000000000000BE -:1012300000000000000000440301200175778102D6 -:1012400080000000000000000000000005004E5873 -:1012500050000000000000000000000000004D49A8 -:1012600046415245204445534669726500000000DE -:10127000000000000000000000000000000000006E -:10128000000000000000000000000000000000005E -:101290000000000000000000000000000000440307 -:1012A000012001757781028000000000000000002D -:1012B00000000005004E5850000000000000000033 -:1012C00000000000004D4946415245204445534628 -:1012D00069726520455631000000000000000000E2 -:1012E00000000000000000000000000000000000FE +:1012300000000000000000000000000000000000AE +:101240000000000000000000004400010001000058 +:10125000000000000000000000000000000000008E +:101260004E58500000000000000000000000000088 +:101270004D494641524520556C7472616C696768EE +:1012800074000000000000000000000000000000EA +:10129000000000000000000000000000000000004E +:1012A000000000000000000000000000000000003E +:1012B00044030120017577810280000000000000D6 +:1012C000000000000005004E585000000000000023 +:1012D000000000000000004D4946415245204445B1 +:1012E0005346697265000000000000000000000025 :1012F00000000000000000000000000000000000EE -:10130000000000000004030128013877B14A434F70 -:1013100050333100000000000000090149424D0037 -:101320000000000000000000000000004A434F5091 -:101330003331000000000000000000000000000049 -:10134000000000000000000000000000000000009D +:1013000000000000000000000000000000000000DD +:1013100000000000000000440301200175778102F5 +:1013200080000000000000000000000005004E5892 +:1013300050000000000000000000000000004D49C7 +:101340004641524520444553466972652045563111 :10135000000000000000000000000000000000008D -:101360000000000000000000000000004800012014 -:10137000017877B1024A434F507632343100000091 -:10138000000C0149424D0000000000000000000078 -:101390000000004A434F5033312076322E342E3134 -:1013A000000000000000000000000000000000003D +:10136000000000000000000000000000000000007D +:101370000000000000000000000000000000040366 +:101380000128013877B14A434F5033310000000043 +:10139000000000090149424D00000000000000006B +:1013A00000000000004A434F5033310000000000AD :1013B000000000000000000000000000000000002D :1013C000000000000000000000000000000000001D -:1013D00000000048000120013833B14A434F503427 -:1013E00031563232000000000C0149424D0000002D -:1013F000000000000000000000004A434F5034315C -:101400002076322E320000000000000000000000B4 -:1014100000000000000000000000000000000000CC +:1013D000000000000000000000000000000000000D +:1013E000000000000048000120017877B1024A4364 +:1013F0004F5076323431000000000C0149424D005C +:101400000000000000000000000000004A434F50B0 +:1014100033312076322E342E3100000000000000DF :1014200000000000000000000000000000000000BC -:101430000000000000000000000004000128013846 -:1014400033B14A434F503431563233310000000D2E -:101450000149424D000000000000000000000000B3 -:10146000004A434F5034312076322E332E31000063 -:10147000000000000000000000000000000000006C +:1014300000000000000000000000000000000000AC +:101440000000000000000000000000004800012033 +:10145000013833B14A434F50343156323200000024 +:10146000000C0149424D0000000000000000000097 +:101470000000004A434F5034312076322E320000B3 :10148000000000000000000000000000000000005C :10149000000000000000000000000000000000004C -:1014A00000040001880100000000000000000000AE -:1014B0000000000000000000496E66696E656F6EF6 -:1014C00000000000000000004D4946415245204305 -:1014D0006C617373696320316B00000000000000D1 -:1014E00000000000000000000000000000000000FC +:1014A000000000000000000000000000000000003C +:1014B00000000004000128013833B14A434F503482 +:1014C00031563233310000000D0149424D00000019 +:1014D000000000000000000000004A434F5034317B +:1014E0002076322E332E3100000000000000000074 :1014F00000000000000000000000000000000000EC -:10150000000000000000000002000198010000003F -:101510000000000000000000000000000000004784 -:10152000656D706C75730000000000000000004DD8 -:1015300050434F5300000000000000000000000076 -:10154000000000000000000000000000000000009B -:10155000000000000000000000000000000000008B +:1015000000000000000000000000000000000000DB +:10151000000000000000000000000400018801003D +:1015200000000000000000000000000000000000BB +:1015300000496E66696E656F6E0000000000000075 +:10154000004D494641524520436C617373696320E5 +:10155000316B0000000000000000000000000000EF :10156000000000000000000000000000000000007B -:101570000C0100000000000000000000000000005E -:10158000000000000000496E6E6F766973696F6E2F -:101590002052265400004A6577656C000000000068 -:1015A000000000000000000000000000000000003B +:10157000000000000000000000000000000000006B +:1015800000020001980100000000000000000000BF +:10159000000000000000000047656D706C7573006E +:1015A00000000000000000004D50434F53000000B9 :1015B000000000000000000000000000000000002B :1015C000000000000000000000000000000000001B -:1015D00000000000000002000138010000000000CF -:1015E000000000000000000000000000004E6F6BD3 -:1015F000696100000000000000000000004D494645 -:1016000041524520436C617373696320346B202D14 -:1016100020656D756C617465642028363231322026 -:10162000436C6173736963290000000000000000CF -:1016300000000000000000000000000000080001A1 -:101640003801000000000000000000000000000061 -:10165000000000004E6F6B69610000000000000098 -:10166000000000004D494641524520436C617373B0 -:10167000696320346B202D20656D756C6174656421 -:10168000202836313331204E464329000000000027 -:10169000000000000000000000000000000000004A -:1016A000000000006364696E6F70737578585B00AA -:1016B00011241FBECFEFCDBFDFE3DEBF00E00CBFC4 -:1016C00018BE19BE1ABE1BBE14E2A0E0B0E2E0EFE5 -:1016D000F9EB00E00BBF02C007900D92A631B107F5 -:1016E000D9F71BBE25E3A6E1B4E201C01D92A734E1 -:1016F000B207E1F73BD00C94F65C25C13BB78BBF3A -:10170000FB01879196913BBF08953BB78BBFCB01FF -:1017100042E20D94F00F3BB70B0143E20D94F00F42 -:101720003BB78BBFCB0145E20D94F00F3BB746E2D0 -:1017300008C02091CF0127FDFCCF22272093CA01AA -:1017400008954093CA0128ED31E02093340030938E -:10175000CB016091C4017091C5018091C6019927A8 -:101760000895FC014093CA01849108950ED10E940E -:10177000A2160E943317C2D21092520684E08093C0 -:10178000420682E680938601C1E0C0932606C0939C -:10179000210686E080932206C093310602E0009382 -:1017A000320610922A0613E01093290689E58093E9 -:1017B00080018AE58093810180E4809341068093D3 -:1017C00046069091B200907F9093B2009091B20043 -:1017D00092609093B20090E39093410690934606F6 -:1017E00080935006C0934606009345061093410629 -:1017F00083E18093010821E030E0209326083093B4 -:101800002708209328083093290810928C08809389 -:1018100080081092230310922103D8E0D093220372 -:1018200081E18093200380911E2090911F2080935E -:101830003803909339038CE380938203D093800321 -:1018400080938303D09381036FD10E94DE18C0D1AF -:101850003FD7C0930002109201020093020210933E -:101860000402C0932002D09321020E942D1519D1A9 -:10187000D2E0C1E18091030481FF25C08091010481 -:1018800080FDFCCFD09303040E943717B6D10E948D -:10189000101926D70E949D16E091592EF0915A2ECC -:1018A00019950E94ED210E947B18E091682EF0911D -:1018B000692E8781813011F4C0931F2C868181307D -:1018C00011F4C0931E2C0E94E218C8D7E091572E45 -:1018D000F091582E1995E091512EF091522E1995B4 -:1018E000C9CF292F33272230310559F02330310554 -:1018F00069F021303105F9F482E190E02AE832E024 -:101900001EC08EE390E02CE432E019C099278130AC -:10191000910541F08230910541F0892B61F4E8E4B2 -:10192000F2E005C0ECE1F2E002C0ECEFF1E08491FE -:1019300090E09F0104C080E090E020E030E0FA01F8 -:101940002083318308951F920F920FB60F921124B6 -:1019500008B60F9218BEFFCF1F920F920FB60F92CC -:10196000112408B60F9218BE8F939F938EB19FB12A -:1019700080589F4F8EB99FB99F918F910F9008BE4D -:101980000F900FBE0F901F9018958091780083FFE5 -:101990000AC088E08093780088ED84BF81E080935E -:1019A00080000D94FE008BEC8093520080915000DB -:1019B0008860809350008091510083FFFCCF82ECBF -:1019C00080935500809150008061809350008091F9 -:1019D000510084FFFCCF88ED84BF84E080934000F9 -:1019E0001EB81FB881E0809343002FE730E02093BA -:1019F0000A0430930B0420930C0430930D0480935D -:101A000000048093020480E880930001089588ED2B -:101A100084BF81E080937900089588ED84BF8BE1D5 -:101A200080938000089580915000826080935000E0 -:101A30008091510081FFFCCF82E08093CA01EDE1EB -:101A4000F0E0E491E0936200ECE1F0E0E491E093F7 -:101A500063001092CA0180E8809365008BEB80934D -:101A6000660080915600897F8093560080915600D1 -:101A70008460809356008091600081608093600054 -:101A80000895E0E4F0E084818E7F8483E0E6F0E076 -:101A900080818E7F8083E0E5F0E080818D7F808390 -:101AA000089587E08093A20078940895089508959A -:101AB0000895089508950895089580E090E00895A8 -:101AC000089508950F931F93CF93DF931F92CDB77F -:101AD000DEB70DE41EE2D8011296ED91FC9113974A -:101AE000898319950E942522E091682EF091692E34 -:101AF00089818583B8E18B9FB001112464567D4FA5 -:101B000048E150E0C8010E94CE55D801ED91FC910A -:101B10001995D8011696ED91FC9117970F90DF91CA -:101B2000CF911F910F91199448E150E06CE972E058 -:101B30008DE49EE20E94CE55E091682EF091692ED0 -:101B40008581C0CF0F931F93E091682EF091692E8D -:101B50008B019C01458168E08CE593E00E94181898 -:101B60001F910F910895FF920F931F93CF93DF93CF -:101B70001F92CDB7DEB78C019E012F5F3F4FAC01A6 -:101B800068E08CE593E00E943018F82E882389F0F5 -:101B9000898198DFF80140E08191882319F04F5F37 -:101BA0004F31D1F7E091652EF091662EB80181E1B9 -:101BB00019958F2D0F90DF91CF911F910F91FF906D -:101BC00008959B01AC0168E08CE593E00C945718F4 -:101BD00008950C94C05508951F93CF93DF93C82F99 -:101BE000D92F162F180F1C1721F00E94C05589936A -:101BF000FACFDF91CF911F9108950E94C0550E94A6 -:101C0000C0550E94C0550C94C055EF92FF920F939F -:101C10001F93CF93DF937C0161507109FA018A0110 -:101C2000020F131FDC0140E050E0E017F107F1F074 -:101C300062307105D8F09191392F32953F703A306A -:101C400010F4305D01C0395C3C939F709A3010F401 -:101C5000905D01C0995C9701240F351FE9019983BC -:101C60001296625071094E5F5F4FDFCF1C92CA011E -:101C7000DF91CF911F910F91FF90EF900895CF9337 -:101C8000DF93EC01DA01E0E0F0E04C91442391F1C4 -:101C900011969C911197992339F1E617F70721F1D5 -:101CA00080ED840F8A3020F08FEB840F8630D0F4E3 -:101CB00080ED890F8A3020F02FEB290F263090F429 -:101CC000242F30E0413410F0275331092295207F32 -:101CD000913410F4982F01C09753292B29933196F2 -:101CE0001296D3CF80E004C011968C91811102C06E -:101CF00090E001C0CF01DF91CF910895E0E6F6E0DA -:101D000080E1858382E0868388E085838AE1818320 -:101D1000E0EAF9E01682178280EC858388E184830B -:101D2000E0E0F1E0128A8BE6838B148A158A20EAC0 -:101D3000208F99E0918F128E148E158E168E84E06E -:101D4000808B12A23CE633A314A215A210A611A602 -:101D500012A624A795A716A680A30895411551059C -:101D600009F449C020E12093660623E02093A009EE -:101D70002091A10927FFFCCF2091A0097093A00911 -:101D80002091A10927FFFCCF2091A0096093A00911 -:101D90002091A10927FFFCCF2091A00921E02093E9 -:101DA000120180931C0190931D01409314015093E4 -:101DB00015011092220186E194E28093280190930C -:101DC00029014093240150932501809110018068DE -:101DD0008093100180912001806880932001809180 -:101DE000100187FDFCCF80E38093110180932101D6 -:101DF00080E18093650608954115510509F469C095 -:101E000020E12093660626E02093A0092091A109F5 -:101E100027FFFCCF2091A00920E120936506000058 -:101E200000002093660622E02093A0092091A109DA +:1015D000000000000000000000000000000000000B +:1015E0000000000000000000000C010000000000EE +:1015F00000000000000000000000000000000049A2 +:101600006E6E6F766973696F6E2052265400004AC1 +:101610006577656C0000000000000000000000001D +:1016200000000000000000000000000000000000BA +:1016300000000000000000000000000000000000AA +:101640000000000000000000000000000000000298 +:101650000001380100000000000000000000000050 +:101660000000000000004E6F6B6961000000000088 +:101670000000000000004D494641524520436C6186 +:101680007373696320346B202D20656D756C6174F4 +:10169000656420283632313220436C61737369638C +:1016A0002900000000000000000000000000000011 +:1016B00000000000000008000138010000000000E8 +:1016C000000000000000000000000000004E6F6BF2 +:1016D000696100000000000000000000004D494664 +:1016E00041524520436C617373696320346B202D34 +:1016F00020656D756C617465642028363133312046 +:101700004E464329000000000000000000000000D9 +:101710000000000000000000000000000000112494 +:101720001FBECFEFCDBFDFE3DEBF00E00CBF18BEB2 +:1017300019BE1ABE1BBE14E2A0E0B0E2E8E7F7EB68 +:1017400000E00BBF02C007900D92AA30B107D9F795 +:101750001BBE25E3AAE0B4E201C01D92A834B20783 +:10176000E1F77ED00C94BA5B66C13BB78BBFFB013F +:10177000879196913BBF08953BB78BBFCB0142E267 +:101780000D94F00F3BB70B0143E20D94F00F3BB704 +:101790008BBFCB0145E20D94F00F3BB746E208C08A +:1017A0002091CF0127FDFCCF22272093CA01089565 +:1017B0004093CA0128ED31E0209334003093CB01EF +:1017C0006091C4017091C5018091C6019927089567 +:1017D000FC014093CA01849108950F9200240F9355 +:1017E0002F933F934F935F930FB70F93EF93FF9315 +:1017F000EAB1FBB15191442735B124B1569578F443 +:1018000000928C080092000806E10A95F1F700C0EA +:1018100001E00093000803E000938C0804C00AE193 +:101820000A95F1F700002150304019F40E942D274D +:101830000CC04F5F477011F4519102C000C000C04E +:101840000AE00A95F1F700C0D9CFFF91EF910F910F +:101850000FBF5F914F913F912F910F910F9018956E +:101860000CD10E94E0160E947117A6D21092520667 +:1018700084E08093420682E680938601C1E0C093B3 +:101880002606C093210686E080932206C093310687 +:1018900002E00093320610922A0613E01093290604 +:1018A00089E5809380018AE58093810180E48093BB +:1018B0004106809346069091B200907F9093B200CB +:1018C0009091B20092609093B20090E390934106A1 +:1018D0009093460680935006C093460600934506B3 +:1018E0001093410683E18093010821E030E02093CA +:1018F000260830932708209328083093290810924F +:101900008C08809380081092230310922103D8E062 +:10191000D093220381E18093200380911E20909137 +:101920001F2080933803909339038CE380938203C4 +:10193000D093800380938303D093810366D10E9468 +:101940001319B7D10FD7C093000210920102009370 +:10195000020210930402C0932002D09321020E943D +:10196000731517D1D2E0C1E18091030481FF25C036 +:101970008091010480FDFCCFD09303040E94751771 +:10198000AED10E944519F6D60E94DB16E0915A2E80 +:10199000F0915B2E19950E9425220E94B218E091C9 +:1019A000692EF0916A2E8781813011F4C093132C37 +:1019B0008681813011F4C093122C0E94171994D79C +:1019C000E091582EF091592E1995E091522EF091F8 +:1019D000532E1995C9CF292F33272230310559F0BD +:1019E0002330310569F021303105E9F482E190E0DE +:1019F00026E932E01CC08EE390E028E532E017C013 +:101A000099278130910549F028F0029761F4E8E0C8 +:101A1000F2E005C0E4E5F2E002C0E8E2F2E0849121 +:101A200090E09F0104C080E090E020E030E0FA0107 +:101A30002083318308951F920F920FB60F921124C5 +:101A400008B60F9218BEFFCF1F920F920FB60F92DB +:101A5000112408B60F9218BE8F939F938EB19FB139 +:101A600080589F4F8EB99FB99F918F910F9008BE5C +:101A70000F900FBE0F901F9018958091780083FFF4 +:101A80000AC088E08093780088ED84BF81E080936D +:101A900080000D94FE008BEC8093520080915000EA +:101AA0008860809350008091510083FFFCCF82ECCE +:101AB0008093550080915000806180935000809108 +:101AC000510084FFFCCF88ED84BF84E08093400008 +:101AD0001EB81FB881E0809343002FE730E02093C9 +:101AE0000A0430930B0420930C0430930D0480936C +:101AF00000048093020480E880930001089588ED3B +:101B000084BF81E080937900089588ED84BF8BE1E4 +:101B100080938000089580915000826080935000EF +:101B20008091510081FFFCCF82E08093CA01EDE1FA +:101B3000F0E0E491E0936200ECE1F0E0E491E09306 +:101B400063001092CA0180E8809365008BEB80935C +:101B5000660080915600897F8093560080915600E0 +:101B60008460809356008091600081608093600063 +:101B70000895E0E4F0E084818E7F8483E0E6F0E085 +:101B800080818E7F8083E0E5F0E080818D7F80839F +:101B9000089587E08093A20078940895089580E0E6 +:101BA00090E008950895089508950895089508957A +:101BB000089508950F931F93CF93C82F0EE41EE24C +:101BC000D8011296ED91FC91139719950E945D2210 +:101BD000E091692EF0916A2EC583B8E1CB9FB001E8 +:101BE000112468557D4F48E150E0C8010E947D54A2 +:101BF000D801ED91FC911995D8011696ED91FC91C3 +:101C00001797CF911F910F91199448E150E068EA1E +:101C100072E08EE49EE20E947D54E091692EF09184 +:101C20006A2E8581C7CF0F931F93E091692EF091A3 +:101C30006A2E8B019C0145816AE088E993E00E944D +:101C40004E181F910F910895FF920F931F93CF93FA +:101C5000DF931F92CDB7DEB78C019E012F5F3F4F00 +:101C6000AC016AE088E993E00E946618F82E8823A8 +:101C700089F089819FDFF80140E08191882319F084 +:101C80004F5F4F31D1F7E091662EF091672EB8018A +:101C900081E119958F2D0F90DF91CF911F910F91B9 +:101CA000FF9008959B01AC016AE088E993E00C94F1 +:101CB0008D1808950C946F5408950F931F93CF932C +:101CC0008C01C62FCC2339F00E946F54F801819308 +:101CD0008F01C150F7CFCF911F910F9108950E94AE +:101CE0006F540E946F540E946F540C946F54CF93A2 +:101CF000DF93EC0161507109DA01420F531FFC01BF +:101D0000CF018C1B9D0BA417B50721F41082DF9126 +:101D1000CF91089562307105C8F39D91392F3295A6 +:101D20003F703A3010F4305D01C0395C30839F70F1 +:101D30009A3010F4905D01C0995C918332966250A4 +:101D40007109DECFCF93DF93EC01DA0120E030E0C0 +:101D50005C91552351F111969C911197992339F17A +:101D60002617370711F180ED850F8A3020F08FEBB1 +:101D7000850F8630E0F480ED890F8A3020F04FEB3C +:101D8000490F4630A0F4E52FF0E0513408F0F79702 +:101D9000E295E07F913410F4982F01C097539E2B69 +:101DA00099932F5F3F4F1296D3CFC90102C080E0B5 +:101DB00090E0DF91CF910895E0E6F6E080E1858341 +:101DC00082E0868388E085838AE18183E0EAF9E026 +:101DD0001682178280EC858388E18483E0E0F1E05D +:101DE000128A8BE6838B148A158A20EA208F99E069 +:101DF000918F128E148E158E168E84E0808B12A217 +:101E00003CE633A314A215A210A611A612A624A77D +:101E100095A716A680A308954115510509F449C058 +:101E200020E12093660623E02093A0092091A109D8 :101E300027FFFCCF2091A0097093A0092091A10950 :101E400027FFFCCF2091A0096093A0092091A10950 -:101E500027FFFCCF2091A0091092120126E134E265 -:101E600020931C0130931D014093140150931501E0 -:101E700020E120932201809328019093290140932F +:101E500027FFFCCF2091A00921E02093120180935D +:101E60001C0190931D014093140150931501109291 +:101E700022018AE094E28093280190932901409303 :101E800024015093250180911001806880931001F6 :101E9000809120018068809320018091100187FD4E :101EA000FCCF80E3809311018093210180E1809336 -:101EB0006506E091682EF091692E8781863019F4CD -:101EC00081E180931F2C8681863019F481E1809313 -:101ED0001E2C0895CF92DF92EF92FF92CF93DF9363 -:101EE000C090672ED12CE12CF12C8DE0CC0CDD1CA8 -:101EF000EE1CFF1C8A95D1F7C114D10481E0E806DD -:101F0000F10408F04EC080E18093660686E080937D -:101F1000A0098091A10987FFFCCF8091A00980E1F1 -:101F200080936506000000008093660682E080933F -:101F3000A0098091A10987FFFCCF8091A009109290 -:101F4000A0098091A10987FFFCCF8091A009109280 -:101F5000A0098091A10987FFFCCF8FEFE81AF80A4A -:101F60008091A009C0E0D0E1C701B601C7DB809332 -:101F7000A0098091A10987FFFCCF8091A0099093CF -:101F8000A0098091A10987FFFCCF8091A00982E080 -:101F9000C80ED11CE11CF11C219731F780E1809320 -:101FA00065068091010480FDFCCF82E080930304EC -:101FB000DF91CF91FF90EF90DF90CF900895CF9277 -:101FC000DF92EF92FF92CF93DF93C090672ED12CD8 -:101FD000E12CF12C8DE0CC0CDD1CEE1CFF1C8A9555 -:101FE000D1F7C114D10481E0E806F10438F0DF91A3 -:101FF000CF91FF90EF90DF90CF906CCF8FEFE81AEA -:10200000F80AC1E2D0E0219791F393DBC701B60152 -:102010007CDB8FDB8FEFD81AE80AF80AF4CFCF9277 -:10202000DF92EF92FF920F931F93CF93DF93C090B5 -:10203000672ED12CE12CF12C8DE0CC0CDD1CEE1C9C -:10204000FF1C8A95D1F7C114D10481E0E806F104A0 -:1020500008F04FC080E18093660683E08093A0097A -:102060008091A10987FFFCCF8091A0091092A0095F -:102070008091A10987FFFCCF8091A0091092A0094F -:102080008091A10987FFFCCF8FEFE81AF80A8091B1 -:10209000A009C1E2D0E0219749F14BDB47DB49DBE6 -:1020A00000E010E01092A0098091A10987FFFCCF09 -:1020B0006091A00970E01092A0098091A10987FFAA -:1020C000FCCF8091A009782BC80125DB32DB0E5FA5 -:1020D0001F4F011581E0180729F7C701B60120DB62 -:1020E00028DB8FEFD81AE80AF80AD5CF80E1809371 -:1020F0006506E091682EF091692E8781863019F48B -:1021000090E190931F2C9681963049F420E1209322 -:102110001E2C853059F483E180931F2C02C085303A -:10212000D1F3953019F483E180931E2C8091010442 -:1021300080FDFCCF82E080930304DF91CF911F915B -:102140000F91FF90EF90DF90CF900895CF92DF92A4 -:10215000EF92FF920F931F934115E0E25E07610536 -:10216000710508F06BC06901E12CF12C00E010E270 -:1021700020E030E0041B150B260B370BC016D106F0 -:10218000E206F30610F49701860120E1209366062B -:1021900026E02093A0092091A10927FFFCCF2091E0 -:1021A000A00920E120936506000000002093660648 -:1021B00022E02093A0092091A10927FFFCCF2091C4 -:1021C000A0095093A0092091A10927FFFCCF2091DD -:1021D000A0094093A0092091A10927FFFCCF2091DD -:1021E000A0091092120126E134E220931C013093E1 -:1021F0001D01009314011093150120E12093220189 -:1022000080932801909329010093240110932501C4 -:102210008091100180688093100180912001806876 -:10222000809320018091100187FDFCCF80E3809393 -:1022300011018093210180E18093650681E01F9167 -:102240000F91FF90EF90DF90CF900895CF92DF92A3 -:10225000EF92FF920F931F934115E0E25E07610535 -:10226000710508F05DC06901E12CF12C00E010E27D -:1022700020E030E0041B150B260B370BC016D106EF -:10228000E206F30610F49701860120E1209366062A -:1022900023E02093A0092091A10927FFFCCF2091E2 -:1022A000A0095093A0092091A10927FFFCCF2091FC -:1022B000A0094093A0092091A10927FFFCCF2091FC -:1022C000A00921E02093120180931C0190931D012D -:1022D00000931401109315011092220186E194E2FB -:1022E00080932801909329010093240110932501E4 -:1022F0008091100180688093100180912001806896 -:10230000809320018091100187FDFCCF80E38093B2 -:1023100011018093210180E18093650681E001C075 -:1023200080E01F910F91FF90EF90DF90CF90089584 -:102330008091CF0187FDFCCF0895FADF8091CF0116 -:1023400081FF0BC086E38093CA01EBECF1E021E052 -:1023500030E088ED90E084BF20830895EF92FF92F3 -:102360000F931F93CF93DF931F921F92CDB7DEB7CA -:102370007C018A011092C20169837A83D9DF698165 -:10238000A62F7A81B72FC701800F911F26E048ED55 -:1023900050E061E070E0EBECF1E0E816F90689F05E -:1023A000E092C0013F2D3F713093C1012093CA01DB -:1023B00044BF60833091C4013D933FEFE31AF30AB9 -:1023C000ECCFC8010F900F90DF91CF911F910F912B -:1023D000FF90EF9008952F923F924F925F926F92ED -:1023E0007F928F929F92AF92BF92CF92DF92EF92A5 -:1023F000FF920F931F93CF93DF9300D0CDB7DEB73B -:102400006A01282F2F711C01221A310829836A833F -:102410007B8393DF8DDF83E38093CA011092C10138 -:102420001092C2016A81E62E7B81F72E860185E338 -:10243000582E98ED892E912C66246394712C3BECD8 -:10244000A32EBB24B39443E3442E29810115110527 -:1024500009F12093C001F70181917F018093C401AC -:102460000150110919F02F5F203281F72092C0012D -:10247000832D8F718093C1015092CA01C401F5016F -:1024800084BF608290E2290E311C52DF4092CA0163 -:1024900020E0DCCFC6012396CDBFDEBFDF91CF9118 -:1024A0001F910F91FF90EF90DF90CF90BF90AF9072 -:1024B0009F908F907F906F905F904F903F902F9064 -:1024C00008951F93CF93DF93CDB7DEB7A097CDBF0D -:1024D000DEBF853009F4AEC078F4823081F128F493 -:1024E000813009F0EEC010E01BC0833009F453C006 -:1024F000843009F475C0E5C0883009F4D3C040F4D5 -:10250000863009F4CDC0873009F0DBC088DDD9C042 -:10251000893009F4C9C08A3009F0D3C080D3D1C052 -:102520008091632E181708F0A8C053DBE1E0F0E0BB -:10253000EC0FFD1FE10FF11D80831F5FF1CF11E054 -:102540008091632E873009F010E0E0915D2EF091CC -:102550005E2ECE01019619954091632E31E014173D -:1025600008F08BC03323A9F0812F90E0E1E0F0E088 -:10257000EC0FFD1FE80FF91F208131E02F3F09F01C -:1025800030E0E1E0F0E0EC0FFD1FE80FF91F2F5FF6 -:1025900020831F5FE4CFE0915D2EF0915E2ECE018F -:1025A000019619958091632E41E0815008F465C031 -:1025B0004423D9F3282F30E0E1E0F0E0EC0FFD1FD9 -:1025C000E20FF31F908141E09F3F09F040E0E1E01E -:1025D000F0E0EC0FFD1FE20FF31F9F5F9083E5CF4C -:1025E00011E08091632E873009F010E0E0915D2EBC -:1025F000F0915E2ECE01019619954091632E31E047 -:102600001417D8F53323A1F0812F90E0E1E0F0E03A -:10261000EC0FFD1FE80FF91F208131E0211130E0A0 -:10262000E1E0F0E0EC0FFD1FE80FF91F21502083DF -:102630001F5FE6CFE0915D2EF0915E2ECE010196F8 -:1026400019958091632E41E08150B8F04423E1F365 -:10265000282F30E0E1E0F0E0EC0FFD1FE20FF31F68 -:10266000908141E0911140E0E1E0F0E0EC0FFD1FCE -:10267000E20FF31F91509083E7CFE0915F2EF0912E -:10268000602ECE0101961995E091652EF091662E8F -:102690004091632EBE016F5F7F4F83E1199511C09A -:1026A000ACD30FC017DC0DC080910008813021F43D -:1026B00080918C08833019F00E94B12202C00E94E0 -:1026C000D622A096CDBFDEBFDF91CF911F91089596 -:1026D000E0E0F6E080E6828388E1868B858B0895D2 -:1026E000CF93C0910806C095C6FF12C080911824F0 -:1026F0008A3050F08A30E1F4E091682EF091692E32 -:102700008181DFDE809118248F5F8093182410C0B0 -:102710008C2F807669F48091182481508A3030F4AF -:10272000E091682EF091692E8081CBDE1092182402 -:10273000C5FF12C0809117248A3050F08A30D9F436 -:10274000E091682EF091692E8381BBDE8091172481 -:102750008F5F809317240FC0C07669F4809117248F -:1027600081508A3030F4E091682EF091692E828198 -:10277000A8DE10921724CF9108959B01AC016BE065 -:1027800084E696E094C420E030E090E0F901E80FA0 -:10279000F91FE959F14D6383265F3F4F203531051D -:1027A000A9F708950F931F939B01E091682EF09174 -:1027B000692EE80FF11D8A0140816BE084E696E006 -:1027C00037D41F910F9108950F931F93CF93DF93E9 -:1027D0001F92CDB7DEB7082FAB019E012F5F3F4F91 -:1027E0006BE084E696E03CD4182F882319F06981C9 -:1027F000802FC9DF812F0F90DF91CF911F910F9113 -:1028000008950895EF92FF920F931F93CF937B014A -:10281000C42F2EB13FB10091080410910904022B7E -:10282000132B682F83E090E20E94D4536C2F83E037 -:1028300090E20E94D453612F83E090E20E94D4532F -:10284000602F83E090E20E94D4536C2F70E0C701A8 -:10285000CF911F910F91FF90EF90AAC408953F92DE -:102860004F925F926F927F928F929F92AF92BF92A0 -:10287000CF92DF92EF92FF920F931F93CF93DF934C -:102880007C01E901C0900020D090012096012250E7 -:102890003843C901A0E0B0E0481759076A077B0731 -:1028A00008F05CC0E2E0CE1AE0E4DE0A2A013B0157 -:1028B0004C0E5D1E611C711C481659066A067B068B -:1028C00048F0241B350B8E01021B130BE901332446 -:1028D000339403C000E010E0312C4601A12CB12C50 -:1028E000481559056A057B0510F5CA018E5F9F4B97 -:1028F0002A013B014C0E5D1E611C711C48145904D9 -:102900006A047B0428F4AE01BC01C70127DA18C0B1 -:10291000C41AD50AA601BC01C70120DAAE014C19C0 -:102920005D096EE174E2C7018C0D9D1D07C04C1955 -:102930005D09BA01625E7B4DAE01C7010E94FC5584 -:10294000311002C081E00BC001501109D8F3F80129 -:10295000EC0FFD1FEE0DFF1D1082F6CF80E0DF9122 -:10296000CF911F910F91FF90EF90DF90CF90BF908C -:10297000AF909F908F907F906F905F904F903F901F -:10298000089520911A2430911B2480E098E0821B46 -:10299000930BEEE1F4E29F012E51344228173907E0 -:1029A00010F41192F8CF8EE194E280931C2490935E -:1029B0001D2480E098E080931A2490931B2482E0E9 -:1029C00090E4809300209093012042E050E060E08A -:1029D00070E480E090E210DAE091682EF091692EC8 -:1029E00087818A3019F480E180931F2C86818A3098 -:1029F00019F480E180931E2C089580911A249091FF -:102A00001B2490582091002030910120821B930BB1 -:102A1000089520E030E0F901E959F14D8783265F00 -:102A20003F4F20353105B9F7813049F018F0823039 -:102A300059F008951092192481E094E109C080931F -:102A4000192488E895E104C01092192482E094E1E9 -:102A50008093652E9093662E08950F931F93CF93C6 -:102A6000DF931F92CDB7DEB7E091682EF091692E0B -:102A70008481CFDF8EE194E280931C2490931D2407 -:102A800000E018E000931A2410931B2441E050E06A -:102A9000BE016F5F7F4F80E090E060DCE0911C241E -:102AA000F0911D24DF01C8011D920197E9F789818A -:102AB000882341F042E050E060E070E480E090E282 -:102AC0004DD917C082E090E48093002090930120BC -:102AD00042E050E060E070E480E090E28DD981E077 -:102AE000898341E050E0BE016F5F7F4F80E090E05E -:102AF00072DCE091652EF091662E40E060E070E0BF -:102B00008FEF19950F90DF91CF911F910F9108953D -:102B10000F931F93CF93DF93AEB1BFB1C091080461 -:102B2000D091090420911A2430911B24E42FF0E065 -:102B30008F010C5F1F4F2017310758F1CA2BDB2B79 -:102B4000245031092E1B3F0B20931A2430931B2451 -:102B5000A0911C24B0911D248C9311964C93119735 -:102B60001296DC931297CD01049680931C249093C7 -:102B70001D241396CC93DB01EC01415018F02D91EC -:102B80002993FBCFE80FF91FE0931C24F0931D2439 -:102B900012C080E03EDFE091682EF091692E8781BF -:102BA0008A3019F481E180931F2C86818A3019F4D0 -:102BB00081E180931E2CDF91CF911F910F91089599 -:102BC0001F93CF93DF931F92CDB7DEB79E012F5F88 -:102BD0003F4FAC0163E08FEC97E042D2182F88237F -:102BE00011F0898116DF812F0F90DF91CF911F9116 -:102BF00008950F931F93E091682EF091692E8B0139 -:102C00009C01448163E08FEC97E012D21F910F91F9 -:102C100008959B01AC0163E08FEC97E048C2EF920E -:102C2000FF920F931F93CF93DF9380911A2490917B -:102C30001B24811528E0920708F078C0009100203D -:102C400010910120C0E0D0E8C01BD10BE12C28E09E -:102C5000F22EA701481B590BC417D50760F1B80124 -:102C60008EE194E2C9D820911A2430911B248091DE -:102C7000002090910120985F821B930B809300208D -:102C800090930120E21AF30AEEE1F4E2CF018E51B3 -:102C900094428E159F0510F41192F8CF8EE194E2C4 -:102CA00080931C2490931D2480E098E080931A2444 -:102CB00090931B242EC02097C9F1AE01B8018EE17C -:102CC00094E29AD8A8015857BE01625E7B4D8EE10E -:102CD00094E20E94055680911C2490911D248C1B27 -:102CE0009D0B80931C2490931D2480911A24909115 -:102CF0001B248C0F9D1F80931A2490931B2480917A -:102D0000002090910120C80FD91FC0930020D093BC -:102D1000012042E050E060E070E480E090E2DF916A -:102D2000CF911F910F91FF90EF9066C8DF91CF91E7 -:102D30001F910F91FF90EF900895809119248111B8 -:102D40006ECF089543E550E067E67EE281E090E0D3 -:102D500005CB43E550E067E67EE281E090E03BCBC7 -:102D6000CF93DF93C7E6DEE2688181E090E00E94C6 -:102D7000885C69817A8182E090E0DF91CF910C9448 -:102D8000915CCF93DF93CFEFC80FC83080F5D82F79 -:102D90000E94252244D9C093672E8AE0C89F9001E3 -:102DA0001124C9018659914D8093682E9093692E04 -:102DB000F901E959F14D80850E94620DE091682E7C -:102DC000F091692E848125DE85D8CADF8FE18D0FD1 -:102DD000E091682EF091692E9781943011F48093E0 -:102DE0001F2C9681943029F480931E2C02C080E021 -:102DF00001C081E0DF91CF9108958091672E99E025 -:102E00004AE0915099F0282F30E02F5F3F4F277014 -:102E10003327822F429FF001439FF00D1124E9597F -:102E2000F14D2085222369F38F5FABCF0895FC011C -:102E30009091672E9F5C908311820895CF93FC013F -:102E4000C081818181110CC0BF01E091652EF0919C -:102E5000662E41E082E1199580ED8C0FCF9191CFE4 -:102E600080E0CF91089588E18093010608958091D4 -:102E70001E2C823191F030F48031B9F050F4882367 -:102E8000A9F132C0833169F090EE980F983088F044 -:102E90002BC088E08093050627C088E08093070652 -:102EA00023C08091040683FF12C088E08093060649 -:102EB0001BC09091202C9F5F913019F09093202C93 -:102EC00015C01092202C9091040693FD04C088E058 -:102ED000809305060BC098E090930606803221F09F -:102EE000815080931E2C02C010921E2C80911F2CAA -:102EF000823191F030F48031C1F050F48823A9F18F -:102F000032C0833169F090EE980F983088F02BC072 -:102F100080E18093050627C080E18093070623C0E7 -:102F20008091040684FF12C080E1809306061BC0D6 -:102F30009091212C9F5F913019F09093212C08954E -:102F40001092212C9091040694FD04C080E180939E -:102F50000506089590E190930606803221F0815095 -:102F600080931F2C089510921F2C08959B01AC0193 -:102F70006BE082E398E09BC020E030E0982F9071F6 -:102F80008870992321F0F901E959F14D628788236E -:102F900021F0F901E959F14D6187265F3F4F203556 -:102FA000310579F7992329F090E190930606109264 -:102FB0001F2C882329F088E08093060610921E2C8F -:102FC00008950F931F939B018A01803131F4E091A2 -:102FD000682EF091692E478107C0883049F4E0914E -:102FE000682EF091692E46816BE082E398E020D054 -:102FF0001F910F9108950F931F93CF93DF931F920B -:10300000CDB7DEB7082FAB019E012F5F3F4F6BE0BE -:1030100082E398E025D0182F882319F06981802F4A -:10302000ABDF812F0F90DF91CF911F910F9108950A -:103030000F931F93FC01662379F0949161509413D0 -:1030400009C0BF016F5F7F4FA801C9010E94E05511 -:1030500081E003C0B196EFCF80E01F910F910895FA -:10306000CF92DF92EF92FF921F93CF93DF93EC0109 -:103070007A016901162F112389F0BE016F5F7F4F1E -:10308000C7010E94D7551150892B31F4FE01C4911C -:10309000F601C08381E003C0A196EDCF80E0DF910F -:1030A000CF911F91FF90EF90DF90CF900895CF9335 -:1030B0000196CCE26623C9F0FC01DA01AD017491FE -:1030C000772341F021153105A1F07D9331962150F0 -:1030D0003109F4CF623030F02115310551F04F5FE6 -:1030E0005F4FCC9361508196E5CF232B11F0FA010D -:1030F0001082CF91089580912002806880932002F1 -:103100008091230280FFFCCF81E080932302A09175 -:103110001002B0911102AE5BB109B7FF02C0A0E08E -:10312000B0E020E038EB4BE050E00E945A55E091CF -:10313000682EF091692E61157105844F9140A8F4B5 -:103140008781873019F480E180931F2C8681873036 -:1031500019F480E180931E2C8091632E882389F0DE -:10316000E091552EF091562E19948781873019F4ED -:1031700081E180931F2C8681873019F481E180934F -:103180001E2C0895BC0183E090E20C948653CF93EB -:10319000DF93FC016491EC012196662331F083E01A -:1031A00090E20E94D453CE01F4CFDF91CF910895E5 -:1031B000AB01BC0183E090E20C94B05380E28093B9 -:1031C00062060895CF93DF938091222C823029F5F7 -:1031D00083E090E20E9439540E94084F83E090E21D -:1031E0000E945554EC0197FD18C0E091682EF091B3 -:1031F000692E8781833019F483E180931F2C8681A7 -:10320000833019F483E180931E2C8C2F40D68111DA -:1032100004C08C2FDF91CF91DEC7DF91CF9108954D -:103220008091222C813079F028F08230D9F08330DF -:1032300011F12EC08091680685FF2AC08FE080932F -:10324000022081E00CC080910220815080930220F6 -:1032500081111EC00E94130D0E94B35282E0809320 -:10326000222C16C08091680685FD12C08FE08093E5 -:10327000022083E0F4CF80910220815080930220CD -:10328000811106C00E9478520E94410D1092222C9A -:103290008091222C823019F44AD70C94ED210895A4 -:1032A000E091682EF091692E8781823019F481E1D6 -:1032B00080931F2C8681823019F481E180931E2C2B -:1032C0000895E091682EF091692E8781823019F47B -:1032D00080E180931F2C8681823019F480E18093F5 -:1032E0001E2C089583E090E20C94615383E090E2F9 -:1032F0000C94A85423E33BE03F932F932DE23BE053 -:103300003F932F9326E23BE03F932F932FE13BE047 -:103310003F932F932FE73AE03F932F9322E02F9391 -:103320001F929F938F930E9465568DB79EB70E96FE -:103330008DBF9EBF85E6089560E072E00E94A20DF9 -:1033400085E60895FB0120812F3349F42181211165 -:1033500006C060E072E00E94E10D85E60895CB01B1 -:103360000E94B30D882319F0F4DC84E608958AECFA -:103370000895EF92FF920F931F93CF93DF93CDB7F2 -:10338000DEB7A097CDBFDEBF7C010091632E10E0B9 -:103390000115110591F487E79AE09F938F9382E0DE -:1033A0008F931F92FF92EF920E9465560F900F909D -:1033B0000F900F900F900F9010C0E0915D2EF09144 -:1033C0005E2ECE01019619959801AE014F5F5F4FB9 -:1033D00060E072E0C7010E94050E85E6A096CDBFB1 -:1033E000DEBFDF91CF911F910F91FF90EF90089575 -:1033F000DF92EF92FF920F931F93CF93DF93CDB79E -:10340000DEB7A097CDBFDEBF7B010091632E10E039 -:1034100060E77AE0C7010E94D755892B29F5D12CA6 -:10342000ED2CF12CE016F10658F40E94E90DE1E0D4 -:10343000F0E0EC0FFD1FEE0DFF1D8083D394F0CF65 -:10344000E0915F2EF091602ECE0101961995E091EA -:10345000652EF091662E4091632EBE016F5F7F4F07 -:1034600083E1199584E60BC0A70160E270E0CE010C -:1034700001960E943F0E8017910711F38AECA096E7 -:10348000CDBFDEBFDF91CF911F910F91FF90EF90E5 -:10349000DF900895FC018091642E882311F081E370 -:1034A00001C080E38083118285E60895FB012181BC -:1034B000211127C02081213321F481E08093642EE3 -:1034C00004C0203321F41092642E84E608952F3333 -:1034D000C1F41F9220E32F931F9221E32F932AE63A -:1034E0003AE03F932F9322E02F931F929F938F9365 -:1034F0000E9465568DB79EB70A968DBF9EBF85E622 -:1035000008958AEC089586EA90E190D48EE60895B5 -:1035100086E291E1A6D48EE60895E0ECF4E08181A4 -:103520008E7F81830E9478520E94070D84E6089561 -:10353000E0ECF4E081818E7F81830E9478520E94CA -:103540000D0D84E60895EDE4FEE225892F9324898C -:103550002F9327E63AE03F932F9322E02F931F9279 -:103560009F938F930E9465568DB79EB708968DBF27 -:103570009EBF85E608952091632E1F922F9324E627 -:103580003AE03F932F9322E02F931F929F938F93C4 -:103590000E9465568DB79EB708968DBF9EBF85E683 -:1035A000089540E052E0BC0180E0FCD885E6089533 -:1035B000FB0120812F3341F42181211105C060E0FE -:1035C00072E0DBD885E6089580E0FED8882319F004 -:1035D000C0DB84E608958AEC089540E052E0BC0127 -:1035E00081E0E0D885E60895FB0120812F3341F486 -:1035F0002181211105C060E072E0BFD885E6089501 -:1036000081E0E2D8882319F0A4DB84E608958AECEF -:10361000089540E052E0BC0182E0C4D885E60895F8 -:10362000FB0120812F3341F42181211105C060E08D -:1036300072E0A3D885E6089582E0C6D8882319F001 -:1036400088DB84E608958AEC089540E052E0BC01EE -:1036500083E0A8D885E60895FB0120812F3341F44B -:103660002181211105C060E072E087D885E60895C8 -:1036700083E0AAD8882319F06CDB84E608958AECED -:10368000089540E052E0BC0180E19BDC85E60895AE -:10369000FB0120812F3341F42181211105C060E01D -:1036A00072E064DC85E6089580E1A5DC882319F0EA -:1036B00050DB84E608958AEC089540E052E0BC01B6 -:1036C00088E07FDC85E60895FB0120812F3341F4FB -:1036D0002181211105C060E072E048DC85E6089593 -:1036E00088E089DC882319F034DB84E608958AECCD -:1036F000089560E072E07DDA85E60895FB0120819F -:103700002F3341F42181211105C060E072E081DA9C -:1037100085E60895CB0154DA882319F01ADB84E694 -:1037200008958AEC0895CF93DF93EC0166D9813038 -:1037300028E0920718F09C01385002C020E030E0E9 -:103740003F932F939F938F9324E43AE03F932F93DB -:1037500082E08F931F92DF93CF930E9465568DB7BF -:103760009EB70A968DBF9EBF85E6DF91CF910895E3 -:103770008FE294E176D38EE6089551DA84E60895D7 -:1037800000D984E6089560E072E051DB85E6089593 -:10379000CB0154DB811102C08AEC089584E60895C0 -:1037A0000E94DF0F84E608950E940F1084E60895BA -:1037B0000E946A0F84E608958091680680FD02C029 -:1037C00089E7089588E70895DF92EF92FF920F93BB -:1037D0001F93CF93DF93EC010FEF11E086E7E82E04 -:1037E0008CE0F82E9CE2D92EB70181ED93E20E9485 -:1037F000D755892BD1F001151105B9F0DE01F7017C -:103800002491ED012196C8010197222341F0013056 -:10381000110529F02C93DE0131968C01F1CFDC9259 -:103820008C0188E1E80EF11CDFCF2197188285E634 -:10383000DF91CF911F910F91FF90EF90DF9008954E -:10384000FC01209120022068209320028091230215 -:1038500080FFFCCF81E080932302A0911002B09101 -:103860001102AE5BB109B7FF02C0A0E0B0E020E0FA -:1038700038EB4BE050E00E945A55AA27BB279F9394 -:103880008F932DE33AE03F932F9382E08F931F9223 -:10389000FF93EF930E9465568DB79EB708968DBF34 -:1038A0009EBF85E608952EB13FB140910804509126 -:1038B0000904242B352B3F932F9327E33AE03F93C2 -:1038C0002F9322E02F931F929F938F930E94655610 -:1038D0008DB79EB708968DBF9EBF85E608950F935E -:1038E0001F93CF93DF931F921F92CDB7DEB78B014B -:1038F000E091682EF091692E8581873009F06FC0C4 -:10390000E091552EF091562E199581E08093772CF9 -:1039100060E270E0C8010E941D560097F9F4F801BA -:1039200001900020E9F73197E01BF10BE0FD59C051 -:10393000F695E795E130F10539F487E090E0809362 -:103940004B2E90934C2E37C053E0EE0FFF1F5A952D -:10395000E1F7E0934B2EF0934C2E2DC098012C5F95 -:103960003F4F82179307E9F5A80162E070E0CE01AE -:1039700001960E943F0E898190E0982F88272A8126 -:10398000820F911D80934B2E90934C2E0B5F1F4FF7 -:10399000F80101900020E9F73197E01BF10BE0FD01 -:1039A00020C0F695E79533E0EE0FFF1F3A95E1F75B -:1039B000E817F907B0F060914B2E70914C2E695FBB -:1039C0007F4F83E0769567958A95E1F7A8018BE4B0 -:1039D0009DE20E943F0E0E94682A8FEF03C089EC8F -:1039E00001C08AEC0F900F90DF91CF911F910F9142 -:1039F0000895EF92FF920F931F93CF93DF931F923F -:103A00001F92CDB7DEB78B01E091682EF091692E41 -:103A10008581873009F080C0E091552EF091562EB7 -:103A2000199582E08093772C60E270E0C8010E94D3 -:103A30001D567C01892B31F5F80101900020E9F732 -:103A40003197E01BF10BE0FD69C0F695E795E13099 -:103A5000F10539F487E090E080934B2E90934C2E43 -:103A600047C063E0EE0FFF1F6A95E1F7CF0169E001 -:103A700070E00E944655E81BF90BE0934B2EF09343 -:103A80004C2E36C0C8010496E816F90609F046C067 -:103A9000A80162E070E0CE0101960E943F0E2981EC -:103AA00030E0322F22278A81280F311D20934B2EA0 -:103AB00030934C2E2730310529F0C90187709927A2 -:103AC000892B61F587010F5F1F4FF80101900020DE -:103AD000E9F73197E01BF10BE0FD20C0F695E79583 -:103AE00043E0EE0FFF1F4A95E1F7E217F307B0F04E -:103AF00060914B2E70914C2E695F7F4F83E07695DD -:103B000067958A95E1F7A8018BE49DE20E943F0E3C -:103B10000E94682A8FEF03C089EC01C08AEC0F90E5 -:103B20000F90DF91CF911F910F91FF90EF9008952B -:103B3000E091682EF091692E85818730A1F4E091A3 -:103B4000552EF091562E199585E08093772C0E9482 -:103B500038430E94682A82E493E48093322C909345 -:103B6000332C8FEF089589EC0895E091682EF09141 -:103B7000692E85818730A1F4E091552EF091562E63 -:103B8000199583E08093772C0E9438430E94682A1D -:103B900082E493E48093322C9093332C8FEF08953A -:103BA00089EC0895E091682EF091692E8581873027 -:103BB000A1F4E091552EF091562E199586E0809350 -:103BC000772C0E9438430E94682A82E493E4809311 -:103BD000322C9093332C8FEF089589EC0895E09167 -:103BE000682EF091692E4085518564E6649F9001AE -:103BF000659F300D11243F932F9321E33AE03F93CB -:103C00002F9322E02F931F929F938F930E946556CC -:103C10008DB79EB708968DBF9EBF85E60895CF935A -:103C2000DF931F921F92CDB7DEB7FB0120812F33A8 -:103C3000B1F42181211113C02FEF39E03F932F936D -:103C400022E02F931F929F938F930E9465560F90AF -:103C50000F900F900F900F900F9085E627C089E589 -:103C600092E089839A83CE0101969F938F938BEF85 -:103C700099E09F938F937F936F930E949B560F9031 -:103C80000F900F900F900F900F90892B71F08981FA -:103C90009A818935F2E09F0740F4E091682EF09117 -:103CA000692E8087918784E601C08AEC0F900F907F -:103CB000DF91CF91089520911F202F9320911E20F6 -:103CC0002F9328EF39E03F932F9322E02F931F92F9 -:103CD0009F938F930E9465568DB79EB708968DBFB0 -:103CE0009EBF85E60895CF93DF931F921F92CDB7B5 -:103CF000DEB7FB0120812F33B1F42181211113C0E4 -:103D00002FE02F932FEF2F9327EA39E03F932F9344 -:103D100022E02F931F929F938F930E946556CDBFF1 -:103D2000DEBF85E627C019821A82CE0101969F93D5 -:103D30008F9383EA99E09F938F937F936F930E9471 -:103D40009B560F900F900F900F900F900F90892B14 -:103D500081F089819A818115E0E19E0750F480937A -:103D600038039093390380931E2090931F2084E69C -:103D700001C08AEC0F900F90DF91CF910895FB0165 -:103D800020812F33D9F42181211121C01F9220E3FA -:103D90002F931F9221E32F932DE939E03F932F9327 -:103DA00022E02F931F929F938F930E9465568DB7A9 -:103DB0009EB70A968DBF9EBF85E60895213311F404 -:103DC000D0D303C0203319F4F1D384E608958AECEC -:103DD0000895FC0180910008813021F480918C08C5 -:103DE000833011F080E301C081E38083118285E696 -:103DF0000895E091682EF091692E85818730A1F4B5 -:103E0000E091552EF091562E199584E08093772CF1 -:103E10000E9438430E94682A82E493E48093322C03 -:103E20009093332C8FEF089589EC089521E020932F -:103E3000312C2093302C2CE320932D2C25E030E0E6 -:103E400020932B2C30932C2C1092252C1092262C66 -:103E50001092272C1092282C8093232C9093242CA2 -:103E6000089527E02093312C2CE231E020932B2C75 -:103E700030932C2C1092252C1092262C1092272C4B -:103E80001092282C8093232C9093242C0895CF9368 -:103E90009091312C9530E1F130F4933029F140F5D7 -:103EA000913068F440C1973009F4A7C008F445C0C8 -:103EB000983009F4AAC0993009F432C134C1813074 -:103EC00041F41092292C10922A2C10922E2C83E06F -:103ED000FBC0843011F466E08BC0883109F420C146 -:103EE0008B3109F0F3C01CC180932F2C84E0ECC00F -:103EF00090E040912F2C2FEF30E0241B31098217E6 -:103F0000930721F485E0E0C0981739F165E169C0B5 -:103F10002091292C30912A2CA9014F5F5F4F4093AB -:103F2000292C50932A2CF901E654F14D8083403816 -:103F3000510509F0CBC086E0C7C020912F2C90918D -:103F4000302C291346C0EAEBFEE290E02FE2EA3380 -:103F5000F207D1F22191920FF9CF4091252C509187 -:103F6000262C6091272C7091282CE091232CF09125 -:103F7000242C20E830E08AEB9EE21995C82F882394 -:103F800011F18091302C8F5F8093302C8091252C03 -:103F90009091262CA091272CB091282C80589F4FCF -:103FA000AF4FBF4F8093252C9093262CA093272CA6 -:103FB000B093282C66E083E090E20E94D45382E024 -:103FC0008093312CB1C068E183E090E20E94D45329 -:103FD0000EC030E0892F90E001972817390739F497 -:103FE00066E083E090E20E94D45382E06DC068E115 -:103FF00083E090E20E94D45393C0853119F410926B -:10400000302C09C08B3109F48BC0883109F463CF9F -:10401000863009F05DC08091302C8F5F8093302C0A -:104020004091252C5091262C6091272C7091282CA2 -:10403000E091232CF091242C20E830E08AEB9EE2E2 -:104040001995C82F8823D1F161E083E090E20E94A6 -:10405000D4536091302C83E090E20E94D45360915D -:10406000302C609583E090E20E94D45360E870E0C9 -:104070008AEB9EE29DD8EAEBFEE260E08FE2EA3353 -:10408000F80719F08191680FF9CF83E090E20E9460 -:10409000D4538091252C9091262CA091272CB0915F -:1040A000282C80589F4FAF4FBF4F8093252C909363 -:1040B000262CA093272CB093282C36C064E083E0F4 -:1040C00090E20E94D45389E08093312CC1E02CC04F -:1040D0008531E1F761E083E090E20E94D453609182 -:1040E000302C83E090E20E94D4536091302C609594 -:1040F00083E090E20E94D45360E870E08AEB9EE295 -:1041000057D8EAEBFEE260E02FE2EA33F20719F05B -:104110008191680FF9CF83E090E20E94D453D6CF0B -:104120001092312CD3CFC0E08C2FCF910895809185 -:10413000312C813019F0873029F1089580912B2C92 -:1041400090912C2C9C012150310920932B2C3093E1 -:104150002C2C892B31F580912D2C9FEF980F90936B -:104160002D2C882331F065E183E090E20E94D45346 -:1041700002C01092312C85E090E080932B2C90931C -:104180002C2C089580912B2C90912C2C9C0121504B -:10419000310920932B2C30932C2C892B11F4109265 -:1041A000312C0895EDE4FBE020E030E09491981389 -:1041B00009C041E2429FC001439F900D1124825BE0 -:1041C000944F08952F5F3F4FB1962930310571F715 -:1041D00080E090E00895CF92DF92EF92FF920F93EC -:1041E0001F93CF93982F9F7D91549A3160F090ED5B -:1041F000980F9A3040F08F3531F0982F9D7F9D3386 -:1042000011F08032D1F49FE9980F9A3108F480526E -:104210002091372C3091382C2F3F91E0390708F04E -:10422000D3C0A9014F5F5F4F4093372C5093382C78 -:10423000F901E654F14D8083C7C08D3009F095C077 -:10424000E091372CF091382CE654F14D1082109209 -:10425000372C1092382C8091362C8111B5C080916A -:10426000BA2E982F9F7D09F495C08D7F8D3309F468 -:1042700091C0EAEBFEE27F01C191CC2331F0CF3354 -:1042800021F0CD3311F0C032B1F7F701108286E78B -:10429000C82E8CE0D82E00E010E0B6018AEB9EE23A -:1042A0000E94D755892B09F056C01092BA2ECF33F1 -:1042B00049F488E1809FF001819FF00D1124E457BB -:1042C000F34F18C0B7016F5F7F4FCD3349F488E1DA -:1042D000809FF001819FF00D1124E657F34F20C01D -:1042E000C11113C088E1809FF001819FF00D11245E -:1042F000EA57F34F259134912115310509F44DC04A -:104300008AEB9EE2F901199514C0C03209F045C04C -:1043100088E1809FF001819FF00D1124E857F34F51 -:104320002591349121153105C1F18AEB9EE2F90105 -:1043300019958F3F99F581E08093362C8EB19FB10E -:104340002091080430910904822B932B8093342C04 -:104350009093352C39C00F5F1F4FF8E1CF0ED11C61 -:104360000732110509F099CF15C0883061F48091AA -:10437000372C9091382C009739F101978093372C86 -:104380009093382C21C08B31F9F41092372C109275 -:10439000382C1AC088ECC0E002C089ECC1E002DF12 -:1043A0000E94C7188AE49BE00E94C718CC2361F0E2 -:1043B0008091BA2E882341F08AEB9EE20E94C218B7 -:1043C00087E49BE00E94C71881E0CF911F910F9175 -:1043D000FF90EF90DF90CF9008958091362C882346 -:1043E00099F1E091682EF091692E20853185211593 -:1043F000310551F18EB19FB14091080450910904EB -:10440000842B952B4091342C5091352C841B950B8B -:1044100064E670E00E94465562177307A8F0109298 -:10442000362C8BECBFDE0E94C71884E49BE00E9410 -:10443000C718E091322CF091332C309729F0199560 -:104440001092322C1092332C08958091362C8823B0 -:10445000A9F01092362C8BECA5DE0E94C71884E4DC -:104460009BE00E94C718E091322CF091332C3097DA -:1044700029F019951092322C1092332C0895CF9375 -:10448000DF939091362C9923A9F0EB011092362CF2 -:1044900089DE0E94C71881E49BE00E94C71820971C -:1044A00049F0CE010E94C2188EE39BE0DF91CF91CC -:1044B0000C94C718DF91CF910895EF92FF920F935C -:1044C0001F93CF937C019B01613081E0780710F04E -:1044D00020E031E08B01021B130BA70160E072E0CA -:1044E0008AEB9EE20E94050E8AEB9EE20E94C218B1 -:1044F000C1E0013081E01807B0F01A956C2F70E030 -:10450000762F6627A701460F571F20E032E060E0B4 -:1045100072E08AEB9EE20E94050E8AEB9EE20E9408 -:10452000C218CF5FE6CF0115110591F0EC2FF0E036 -:10453000FE2FEE27A7014E0F5F1F980160E072E08B -:104540008AEB9EE20E94050E8AEB9EE20E94C21850 -:104550008BE39BE0CF911F910F91FF90EF900C9414 -:10456000C71880910008813029F480918C0883302D -:1045700009F4089580913B2C811117C081E080934C -:10458000000893E090938C088093392C10923A2C79 -:104590008EB19FB12091080430910904822B932B96 -:1045A0008093402C9093412C0895089510928C088C -:1045B00010920008E9E3FCE21082118208959091C4 -:1045C000392C9923F1F080913A2C811115C020915A -:1045D000392C2223B9F02EB13FB1409108045091FB -:1045E0000904242B352B4091402C5091412C241B45 -:1045F000350B2634310530F081E080933A2C892F39 -:10460000089581E00895CF93DF931F92CDB7DEB771 -:1046100080913B2C8823D1F02EB13FB1409108040A -:1046200050910904242B352B40913E2C50913F2C66 -:10463000241B350B40913C2C50913D2C2417350701 -:1046400028F010923B2C89838CDF89810F90DF91B9 -:10465000CF91089580931E2090931F20809338035C -:1046600090933903089580911E2090911F20089601 -:1046700080931E2090931F208093380390933903DA -:10468000089580E991E080931E2090931F208093ED -:104690003803909339030895A0E2B6E081E01596BF -:1046A0008C9315972AEB30E328B939B92AE331E323 -:1046B0002AB93BB910B813B812B816B817B811B860 -:1046C000E0E0F9E010A211A22FEF30E026A337A31B -:1046D0002FEF3FEF20A731A7808388E8838380E115 -:1046E000848783E087831C968C931C9782E01A96BC -:1046F0008C9308951F920F920FB60F92112408B653 -:104700000F9218BE0BB60F921BBE8F939F93EF9321 -:10471000FF93E0E0F9E013828FE790E086AB97AB80 -:1047200081E190E080AF91AFE0E0FAE010A211A249 -:104730008FEF9FEF86A397A389E88383168281E09A -:1047400084878EE0808310922A06FF91EF919F91DB -:104750008F910F900BBE0F9008BE0F900FBE0F9061 -:104760001F9018951F920F920FB60F92112408B642 -:104770000F9218BE0BB60F921BBE2F933F938F93D1 -:104780009F93EF93FF932091280693B1267081E0C9 -:1047900009F080E0990F892B83B982B1882309F44D -:1047A00064C012B883B18770873059F51092000940 -:1047B00080E180930C091092030A1B9B03C08CEAD2 -:1047C00094E002C08CE694E08093260A9093270A36 -:1047D00082E081B981E080930C0A83E08093060A2D -:1047E00086B197B1877049F090B18F5F893011F031 -:1047F0009695FBCFE8B1F9B1908381E08093422C8C -:1048000037C093B1892F8C7099F192FB992790F959 -:1048100081E0982781B181111BC080B186959111EB -:1048200090E8892B80B926B137B12F5F3F4F26B969 -:1048300037B927703327232BD9F4E8B1F9B19F0199 -:104840002F5F3F4F28B939B9808381E081B910C00B -:1048500081B1813069F4EAB1FBB19F012F5F3F4F15 -:104860002AB93BB9908311B803C082B1809582B94F -:1048700088E880930309FF91EF919F918F913F9179 -:104880002F910F900BBE0F9008BE0F900FBE0F9090 -:104890001F9018951F920F920FB60F92112408B611 -:1048A0000F9218BE0BB60F921BBE2F933F938F93A0 -:1048B0009F93EF93FF9381B1823008F49DC081B143 -:1048C0008D3008F099C0E1B1F0E0EE0FFF1FEA5D16 -:1048D000FF4D0190F081E02D19948FE790E08093D7 -:1048E000260A9093270A88C08E9A8EE0809340080B -:1048F0008FE390E08093260A9093270A85E06FC0AB -:104900008E9886E081B98FEF82B914B815B8E8B1F6 -:10491000F9B1808180B970C0009B05C08E9A82B1C8 -:10492000809582B901C08E9887E059C0009B02C073 -:104930008E9801C08E9A80B1869580B984B195B168 -:10494000019684B995B984B195B187709927892B5F -:1049500011F488E044C024B135B186B197B128176D -:104960003907B1F52BC0EAB1FBB1309711F0808166 -:1049700001C082B1882311F08E9A01C08E9889E01F -:104980002EC0EAB1FBB1309751F08081882311F03D -:104990008E9801C08E9A3196EAB9FBB908C082B1EF -:1049A000882311F08E9801C08E9A8FEF82B924B1BE -:1049B00035B186B197B12817390711F48AE00FC0D5 -:1049C000E8B1F9B1CF01019688B999B9818180B96F -:1049D00086E005C08E988BE002C08E988CE081B98D -:1049E0000BC01092000A1092060A10924008109212 -:1049F000410881E08093432CFF91EF919F918F912B -:104A00003F912F910F900BBE0F9008BE0F900FBEDD -:104A10000F901F901895CF93DF93E2E4FCE2108291 -:104A20001182E0E4F6E0128A84E08283C0E8D1E0FB -:104A300082E68E83A0E2B6E081E016968C9316970C -:104A400011968C93119796E012969C93129751961B -:104A50008C93519742E052964C9352971A961C921F -:104A60001A9733E019963C9399E598839AE59983D0 -:104A700090E491839683A0EBB0E012962C9112976C -:104A8000207F12962C93129712962C9112972260E7 -:104A900012962C9320E321832683908B8683458373 -:104AA0003183E0E0F8E083E1818321E030E026A378 -:104AB00037A320A731A7E0E8F8E014868083E0E27E -:104AC000F3E01382118288E0828391E19083209148 -:104AD0001E2030911F20208F318FE0E8F3E09CE30F -:104AE0009283808393838183DF91CF91D5CDA0E2A0 -:104AF000B6E01A961C921A97E2E4FCE21082118248 -:104B0000E0E0F9E010821382178280E18487E0E020 -:104B1000FAE010821382168281E08487E0E4F8E0F4 -:104B20001082118216968C938E980895CF93DF93FE -:104B30008091422C882309F47EC01092422CC6B189 -:104B4000D7B1C730D10508F471C0AE01495F5F4FDE -:104B500093E0569547959A95E1F7E091652EF0918F -:104B6000662E6AEB70E380E41995E091682EF0916F -:104B7000692E8781883019F483E180931F2C868108 -:104B8000883019F483E180931E2CE0915B2EF09124 -:104B90005C2EBE018AEB90E31995EC0194FF06C0F0 -:104BA000DF7E8AE391E38AB99BB902C01AB81BB8C9 -:104BB0002097E1F1AE01495F5F4F83E0569547953D -:104BC0008A95E1F7E091652EF091662E6AEB70E32D -:104BD00081E41995E091682EF091692E87818930E2 -:104BE00019F483E180931F2C8681893019F483E1C5 -:104BF00080931E2CC6B9D7B98AEB90E388B999B9CE -:104C000010926008109261088FE090E0809366082F -:104C10009093670888E090E080936A0890936B080F -:104C200083E28093410883E081B905C01092000AB5 -:104C30001092060A31DD8091432C882329F01092CE -:104C4000432CDF91CF9128CDDF91CF910895CF9361 -:104C5000DF93E0E4F6E0128A84E08283C0E8D1E0EA -:104C600082E68E83A0E2B6E081E016968C931697DA -:104C700011968C93119796E012969C9312975196E9 -:104C80008C93519742E052964C9352971A961C92ED -:104C90001A9733E019963C93199799E598839AE50A -:104CA000998390E491839683C0EBD0E02A81207FA2 -:104CB0002A832A8122602A8320E321832683908B02 -:104CC000868345833183E0E0F8E093E1918321E03E -:104CD00030E026A337A320A731A7E0E8F8E0148648 -:104CE0009083E0E2F3E01382118298E0928341E145 -:104CF000408340911E2050911F20408F518FE0E84B -:104D0000F3E04CE3428390834383918315968C9325 -:104D1000E0E0F9E08FE790E086A397A322A733A70E -:104D2000108216828CE087831092000A1092442C25 -:104D3000E7E4FCE2108212821182DF91CF910895A4 -:104D400081E08093260632DCE0E0F9E010821782F1 -:104D5000E0E0FAE010821782E7E4FCE211821282BE -:104D6000108208951F920F920FB60F92112408B669 -:104D70000F9218BE0BB60F921BBE2F933F938F93CB -:104D80009F93EF93FF93E091442CF0E0EE0FFF1F11 -:104D9000E05CFF4D0190F081E02D199410928C0899 -:104DA0001092000886E18A95F1F700C081E08093B7 -:104DB000000883E080938C0818B88091BA3086B9D7 -:104DC00017B882E001C083E08093442C86C03099FC -:104DD00011C082B181110EC010928C08109200088F -:104DE00096E19A95F1F700C081E08093000883E096 -:104DF00080938C0884E0E8CF309B10C010928C0820 -:104E00001092000886E18A95F1F700C081E0809356 -:104E1000000893E090938C0882B901C012B886B163 -:104E2000869586B984B195B1019784B995B9892BD6 -:104E300011F485E001C083E08093442C87B18F5F3B -:104E400087B9877009F049C0E8B1EF5FE8B9F0E0D1 -:104E5000E654FF4C808186B940C082B181110EC0FA -:104E600010928C081092000896E19A95F1F700C014 -:104E700081E08093000883E080938C0886E0A4CFD3 -:104E80001092000982E591E00197F1F700C000005F -:104E900082E08093870389E3809381038AEB90E328 -:104EA0008AB99BB981E090E084B995B980E886B968 -:104EB0008EB19FB12091080430910904822B932B6D -:104EC0008093452C9093462C81E08093492C18B810 -:104ED00017B81092442C01C000C0FF91EF919F9130 -:104EE0008F913F912F910F900BBE0F9008BE0F90A6 -:104EF0000FBE0F901F9018951F920F920FB60F9232 -:104F0000112408B60F9218BE0BB60F921BBE2F933A -:104F10003F934F935F938F939F93EF93FF931092E1 -:104F2000070A1092000A10924709109240098091D6 -:104F300081038E7F8093810384B195B18770992717 -:104F4000892BC9F0E4B1F5B186B144B155B193E014 -:104F5000F695E7959A95E1F7E654FF4C90E0477097 -:104F6000552728E030E0241B350B02C09595879526 -:104F70002A95E2F7808381E08093482C1092492C97 -:104F80008FEF9FEF8093260A9093270A1092200AB2 -:104F90001092210A1092060A1092070A1092030A30 -:104FA00084E08093000A87E08093442CFF91EF9186 -:104FB0009F918F915F914F913F912F910F900BBED9 -:104FC0000F9008BE0F900FBE0F901F9018951F9264 -:104FD0000F920FB60F92112408B60F9218BE0BB69F -:104FE0000F921BBE8F93EF93FF93E0E8F3E0818174 -:104FF0008F7C8183E0E0FAE088E8838381E080832E -:10500000FF91EF918F910F900BBE0F9008BE0F9004 -:105010000FBE0F901F9018951F920F920FB60F9210 -:10502000112408B60F9218BE0BB60F921BBE2F9319 -:105030003F934F935F938F939F93EF93FF93809151 -:105040006009109260091092610992E09093400902 -:10505000813620F0813A08F063C077C086B186952A -:1050600086B984B195B1019684B995B987709927AD -:10507000892B41F4EAB1FBB1CF0101968AB99BB902 -:1050800086B1808384B195B180FD88C0369986C091 -:105090001092070A1092000A1092470910924009D4 -:1050A000809181038E7F8093810384B195B1877055 -:1050B0009927892BC9F0E4B1F5B186B144B155B156 -:1050C00093E0F695E7959A95E1F7E654FF4C90E06A -:1050D0004770552728E030E0241B350B02C095951A -:1050E00087952A95E2F7808381E08093482C10927F -:1050F000492C8FEF9FEF8093260A9093270A1092F6 -:10510000200A1092210A1092060A1092070A1092A1 -:10511000030A84E08093000A87E08093442C3EC019 -:1051200086B18695806886B984B195B1019684B9B7 -:1051300095B987709927892B41F4EAB1FBB1CF016A -:1051400001968AB99BB986B1808386B186958068BD -:1051500086B984B195B1019684B995B987709927BC -:10516000892B41F4EAB1FBB1CF0101968AB99BB911 -:1051700086B1808386B1869586B984B195B1019652 -:1051800084B995B987709927892B41F4EAB1FBB1AD -:10519000CF0101968AB99BB986B18083FF91EF91C7 -:1051A0009F918F915F914F913F912F910F900BBEE7 -:1051B0000F9008BE0F900FBE0F901F901895BF92D2 -:1051C000CF92DF92EF92FF920F931F93CF93DF93D3 -:1051D000CDB7DEB7DA95CDBFDEBF8091492C8823ED -:1051E000F1F08EB19FB140910804509109042091D3 -:1051F000452C3091462C842B952B821B930B2091B0 -:105200002020309121202F5F3F4F2817390738F495 -:1052100014B815B881E08093482C1092492CF3D92A -:10522000811149C1CCD9882309F445C18091492C09 -:10523000811141C18091472C811105C08091482C7A -:10524000882309F438C18091442C873041F480913F -:10525000200A9091210A8532914008F42CC1809156 -:10526000482C882309F4ABC084B195B1892B09F48B -:10527000A6C084B195B1089718F414B815B89FC0AA -:1052800044B155B1495F5F4F63E0569547956A95C4 -:10529000E1F76AEB70E3CE0101960E94FC558AEBC0 -:1052A00090E38AB99BB904B115B114B815B88981D6 -:1052B00086958695898372E0C72ED12CE3E1BE2EB8 -:1052C000F8E0EF2EF12CC016D10608F078C0F601F8 -:1052D00053E0F695E7955A95E1F741E050E04C0F21 -:1052E0005D1FE40FF51F8081982F9695969590830A -:1052F0008370813039F0E8F0823009F059C086B10E -:10530000869503C086B18695806886B984B195B1CB -:10531000019684B995B987709927892B09F048C0FF -:10532000EAB1FBB1CF0101968AB99BB986B18083FE -:105330003FC084B195B187709927892BC1F0E4B142 -:10534000F5B186B124B135B143E0F695E7954A95BC -:10535000E1F7E654FF4C90E027703327A701421B8A -:10536000530B02C0959587954A95E2F78083E091AB -:10537000682EF091692E8781883011F4B0921F2C2D -:105380008681883011F4B0921E2C44B155B1495F2A -:105390005F4F93E0569547959A95E1F7E091652E1A -:1053A000F091662E6AEB70E382E4199581E001C00A -:1053B00080E052E0C50ED11C882309F484CF1092FE -:1053C000472C1092482C64B175B1E0915B2EF0919E -:1053D0005C2E8AEB90E3199584B995B984B195B1A7 -:1053E000892B09F468C089E0809381031092000A38 -:1053F0001092200A1092210A8FE790E08093260AEB -:105400009093270A8FE590E08093280A9093290AC9 -:105410001092060A80E180930C0A93E09093070AA9 -:1054200010926009109261092FEF3FEF20936609F7 -:105430003093670920E031E02093680930936909CF +:101EB000650608954115510509F469C020E1209394 +:101EC000660626E02093A0092091A10927FFFCCFF8 +:101ED0002091A00920E120936506000000002093D6 +:101EE000660622E02093A0092091A10927FFFCCFDC +:101EF0002091A0097093A0092091A10927FFFCCF90 +:101F00002091A0096093A0092091A10927FFFCCF8F +:101F10002091A009109212012AE034E220931C01C2 +:101F200030931D01409314015093150120E120933B +:101F3000220180932801909329014093240150931A +:101F4000250180911001806880931001809120010B +:101F50008068809320018091100187FDFCCF80E391 +:101F6000809311018093210180E180936506E091C7 +:101F7000692EF0916A2E8781863019F481E1809371 +:101F8000132C8681863019F481E18093122C0895F8 +:101F9000CF92DF92EF92FF92CF93DF93C090682EA3 +:101FA000D12CE12CF12C8DE0CC0CDD1CEE1CFF1CA7 +:101FB0008A95D1F7C114D10481E0E806F10408F054 +:101FC0004EC080E18093660686E08093A0098091F0 +:101FD000A10987FFFCCF8091A00980E1809365066D +:101FE000000000008093660682E08093A009809143 +:101FF000A10987FFFCCF8091A0091092A0098091D0 +:10200000A10987FFFCCF8091A0091092A0098091BF +:10201000A10987FFFCCF8FEFE81AF80A8091A00989 +:10202000C0E0D0E1C701B601A0DB8093A009809198 +:10203000A10987FFFCCF8091A0099093A00980910E +:10204000A10987FFFCCF8091A00982E0C80ED11CB6 +:10205000E11CF11C219731F780E1809365068091A6 +:10206000010480FDFCCF82E080930304DF91CF91D7 +:10207000FF90EF90DF90CF900895CF92DF92EF9294 +:10208000FF92CF93DF93C090682ED12CE12CF12CDE +:102090008DE0CC0CDD1CEE1CFF1C8A95D1F7C11421 +:1020A000D10481E0E806F10438F0DF91CF91FF9090 +:1020B000EF90DF90CF906CCF8FEFE81AF80AC1E273 +:1020C000D0E0219791F36CDBC701B60155DB68DBEB +:1020D0008FEFD81AE80AF80AF4CFCF92DF92EF9286 +:1020E000FF920F931F93CF93DF93C090682ED12C54 +:1020F000E12CF12C8DE0CC0CDD1CEE1CFF1C8A9534 +:10210000D1F7C114D10481E0E806F10408F04FC012 +:1021100080E18093660683E08093A0098091A10905 +:1021200087FFFCCF8091A0091092A0098091A1099E +:1021300087FFFCCF8091A0091092A0098091A1098E +:1021400087FFFCCF8FEFE81AF80A8091A00901E21F +:1021500010E00150110941F123DB1FDB21DBC0E05E +:10216000D0E01092A0098091A10987FFFCCF609177 +:10217000A00970E01092A0098091A10987FFFCCF0F +:102180008091A009782BCE01FDDA0ADB2296C115D9 +:1021900081E0D80731F7C701B601F9DA01DB8FEF2B +:1021A000D81AE80AF80AD5CF80E180936506E09155 +:1021B000692EF0916A2E8781863019F490E1909310 +:1021C000132C9681963049F420E12093122C85300F +:1021D00059F483E18093132C02C08530D1F39530FC +:1021E00019F483E18093122C8091010480FDFCCFCF +:1021F00082E080930304DF91CF911F910F91FF90B4 +:10220000EF90DF90CF900895CF92DF92EF92FF9200 +:102210000F931F934115E0E25E076105710508F019 +:102220006BC06901E12CF12C00E010E220E030E00D +:10223000041B150B260B370BC016D106E206F3065E +:1022400010F49701860120E12093660626E0209392 +:10225000A0092091A10927FFFCCF2091A00920E12E +:1022600020936506000000002093660622E020937C +:10227000A0092091A10927FFFCCF2091A00950932C +:10228000A0092091A10927FFFCCF2091A00940932C +:10229000A0092091A10927FFFCCF2091A00910924D +:1022A00012012AE034E220931C0130931D010093B7 +:1022B00014011093150120E120932201809328013D +:1022C000909329010093240110932501809110011E +:1022D00080688093100180912001806880932001A4 +:1022E0008091100187FDFCCF80E3809311018093E2 +:1022F000210180E18093650681E01F910F91FF909D +:10230000EF90DF90CF900895CF92DF92EF92FF92FF +:102310000F931F934115E0E25E076105710508F018 +:102320005DC06901E12CF12C00E010E220E030E01A +:10233000041B150B260B370BC016D106E206F3065D +:1023400010F49701860120E12093660623E0209394 +:10235000A0092091A10927FFFCCF2091A00950934B +:10236000A0092091A10927FFFCCF2091A00940934B +:10237000A0092091A10927FFFCCF2091A00921E00D +:102380002093120180931C0190931D01009314016E +:1023900010931501109222018AE094E280932801A3 +:1023A000909329010093240110932501809110013D +:1023B00080688093100180912001806880932001C3 +:1023C0008091100187FDFCCF80E380931101809301 +:1023D000210180E18093650681E001C080E01F91CA +:1023E0000F91FF90EF90DF90CF9008958091CF01F3 +:1023F00087FDFCCF0895FADF8091CF0181FF0BC0EC +:1024000086E38093CA01EBECF1E021E030E088ED57 +:1024100090E084BF20830895EF92FF920F931F9363 +:10242000CF93DF93EC017B018A011092C201DEDFC2 +:10243000D701CE01800F911F26E048ED50E061E00A +:1024400070E0EBECF1E0C817D90779F0C093C00158 +:102450003D2F3F713093C1012093CA0144BF608377 +:102460003091C4013D932196EECFC801DF91CF9109 +:102470001F910F91FF90EF9008953F924F925F92BE +:102480006F927F928F929F92AF92BF92CF92DF9284 +:10249000EF92FF920F931F93CF93DF938B01542EF4 +:1024A000652E282F2F71722EEC01C21BD109A3DFDC +:1024B0009DDF83E38093CA011092C1011092C20193 +:1024C0007801052D162D85E3482E98EDC92ED12CC7 +:1024D00088248394912C3BECA32EBB24B39443E338 +:1024E000342E0115110501F17092C001F70181919F +:1024F0007F018093C4010150110921F07394F0E22F +:102500007F12EFCFC093C0018D2F8F718093C101D7 +:102510004092CA01C601F50184BF8082A09666DFA1 +:102520003092CA01712CDDCF852D962DDF91CF9190 +:102530001F910F91FF90EF90DF90CF90BF90AF90E1 +:102540009F908F907F906F905F904F903F900895F5 +:102550001F93CF93DF93CDB7DEB7A097CDBFDEBF7C +:10256000853009F4AEC078F4823081F128F48130EE +:1025700009F0F1C010E01BC0833009F453C084306F +:1025800009F475C0E8C0883009F4D3C040F486303F +:1025900009F4CDC0873009F0DEC09FDDDCC0893092 +:1025A00009F4C9C08A3009F0D6C07FD3D4C0809165 +:1025B000642E181708F0A8C07DDBE1E0F0E0EC0F16 +:1025C000FD1FE10FF11D80831F5FF1CF11E08091AE +:1025D000642E873009F010E0E0915E2EF0915F2EBE +:1025E000CE01019619954091642E31E0141708F040 +:1025F0008BC03323A9F0812F90E0E1E0F0E0EC0FF5 +:10260000FD1FE80FF91F208131E02F3F09F030E076 +:10261000E1E0F0E0EC0FFD1FE80FF91F2F5F2083D2 +:102620001F5FE4CFE0915E2EF0915F2ECE01019608 +:1026300019958091642E41E0815008F465C04423CF +:10264000D9F3282F30E0E1E0F0E0EC0FFD1FE20FBE +:10265000F31F908141E09F3F09F040E0E1E0F0E0AE +:10266000EC0FFD1FE20FF31F9F5F9083E5CF11E09A +:102670008091642E873009F010E0E0915E2EF09199 +:102680005F2ECE01019619954091642E31E014170A +:10269000D8F53323A1F0812F90E0E1E0F0E0EC0FDA +:1026A000FD1FE80FF91F208131E0211130E0E1E04A +:1026B000F0E0EC0FFD1FE80FF91F215020831F5F92 +:1026C000E6CFE0915E2EF0915F2ECE010196199536 +:1026D0008091642E41E08150B8F04423E1F3282F2B +:1026E00030E0E1E0F0E0EC0FFD1FE20FF31F90811E +:1026F00041E0911140E0E1E0F0E0EC0FFD1FE20F5E +:10270000F31F91509083E7CFE091602EF091612EFE +:10271000CE0101961995E091662EF091672E4091B9 +:10272000642EBE016F5F7F4F83E1199514C0A3D360 +:1027300012C02EDC10C080910008813021F49091ED +:102740008C08933009F080E080FD03C00E94E722EE +:1027500002C00E940D23A096CDBFDEBFDF91CF91B6 +:102760001F910895E0E0F6E080E6828388E1868BA1 +:10277000858B0895CF93C0910806C095C6FF12C0FF +:1027800080910C248A3050F08A30E1F4E091692E77 +:10279000F0916A2E8181DCDE80910C248F5F809322 +:1027A0000C2410C08C2F807669F480910C24815009 +:1027B0008A3030F4E091692EF0916A2E8081C8DE73 +:1027C00010920C24C5FF12C080910B248A3050F067 +:1027D0008A30D9F4E091692EF0916A2E8381B8DEB7 +:1027E00080910B248F5F80930B240FC0C07669F417 +:1027F00080910B2481508A3030F4E091692EF09161 +:102800006A2E8281A5DE10920B24CF9108959B0140 +:10281000AC016BE082EE96E080C4E82FF0E0E8596E +:10282000F14D88E0638381503A968111FBCF089582 +:102830000F931F939B01E091692EF0916A2EE80F90 +:10284000F11D8A0140816BE082EE96E027D41F9152 +:102850000F9108950F931F93CF93DF931F92CDB7DE +:10286000DEB7082FAB019E012F5F3F4F6BE082EE7A +:1028700096E02CD4182F882319F06981802FCDDFA2 +:10288000812F0F90DF91CF911F910F91089508959F +:10289000EF92FF920F931F93CF937B01C42F0EB142 +:1028A0001FB12091080430910904022B132B682FCB +:1028B00083E090E20E947F526C2F83E090E20E94BE +:1028C0007F52612F83E090E20E947F52602F83E06D +:1028D00090E20E947F526C2F70E0C701CF911F9150 +:1028E0000F91FF90EF9099C408953F924F925F929D +:1028F0006F927F928F929F92AF92BF92CF92DF9210 +:10290000EF92FF920F931F93CF93DF937C01E90126 +:10291000C0900020D0900120960122503843C90178 +:10292000A0E0B0E0481759076A077B0708F05FC0CE +:10293000E2E0CE1AE0E4DE0A2A013B014C0E5D1E05 +:10294000611C711C481659066A067B0648F0241B58 +:10295000350B8E01021B130BE9013324339403C0A2 +:1029600000E010E0312C4601A12CB12C481559058E +:102970006A057B0510F5CA018E5F9F4B2A013B015A +:102980004C0E5D1E611C711C481459046A047B04C2 +:1029900028F4AE01BC01C7013FDA18C0C41AD50A39 +:1029A000A601BC01C70138DAAE014C195D0962E12C +:1029B00074E2C7018C0D9D1D07C04C195D09BA0159 +:1029C0006E5E7B4DAE01C7010E94AB54332041F0D7 +:1029D0000C0F1D1FF701E00FF11FCE0DDF1D02C010 +:1029E00081E006C0EC17FD07D9F31292FBCF80E01F +:1029F000DF91CF911F910F91FF90EF90DF90CF90DB +:102A0000BF90AF909F908F907F906F905F904F900E +:102A10003F90089520910E2430910F2480E098E09B +:102A2000821B930BE2E1F4E29F012251344228170A +:102A3000390710F41192F8CF82E194E280931024C8 +:102A40009093112480E098E080930E2490930F24BB +:102A500082E090E4809300209093012042E050E0D7 +:102A600060E070E480E090E225DAE091692EF09178 +:102A70006A2E87818A3019F480E18093132C868135 +:102A80008A3019F480E18093122C089580910E24ED +:102A900090910F2490582091002030910120821BAA +:102AA000930B0895E8E6FEE287833A969EE2E83BC0 +:102AB000F907D1F7813049F018F0823059F00895C4 +:102AC00010920D2487E494E109C080930D248EECCC +:102AD00095E104C010920D2488E494E18093662E61 +:102AE0009093672E08950F931F93CF93DF931F92B8 +:102AF000CDB7DEB7E091692EF0916A2E8481D2DFE6 +:102B000082E194E2809310249093112400E018E075 +:102B100000930E2410930F2441E050E0BE016F5F3C +:102B20007F4F80E090E078DCE0911024F091112458 +:102B3000DF01C8011D920197E9F78981882341F0DF +:102B400042E050E060E070E480E090E265D917C0B8 +:102B500082E090E4809300209093012042E050E0D6 +:102B600060E070E480E090E2A5D981E0898341E0F3 +:102B700050E0BE016F5F7F4F80E090E07EDCE0912F +:102B8000662EF091672E40E060E070E08FEF1995BF +:102B90000F90DF91CF911F910F9108950F931F9385 +:102BA000CF93DF93CEB1DFB1A0910804B0910904B7 +:102BB00020910E2430910F24E42FF0E08F010C5F60 +:102BC0001F4F2017310758F1CA2BDB2B2450310936 +:102BD0002E1B3F0B20930E2430930F24A091102422 +:102BE000B09111248C9311964C9311971296DC930B +:102BF0001297CD010496809310249093112413967C +:102C0000CC93DB01EC01415018F02D912993FBCFBF +:102C1000E80FF91FE0931024F093112412C080E014 +:102C200041DFE091692EF0916A2E87818A3019F494 +:102C300081E18093132C86818A3019F481E180939D +:102C4000122CDF91CF911F910F9108951F93CF9375 +:102C5000DF931F92CDB7DEB79E012F5F3F4FAC01D0 +:102C600063E08DE498E032D2182F882311F0898137 +:102C700019DF812F0F90DF91CF911F9108950F934E +:102C80001F93E091692EF0916A2E8B019C01448183 +:102C900063E08DE498E002D21F910F9108959B01AB +:102CA000AC0163E08DE498E038C20F931F93CF939B +:102CB000DF9380910E2490910F24811528E09207D4 +:102CC00008F074C06091002070910120C0E0D0E84D +:102CD000C61BD70B00E018E0A801481B590BC4170E +:102CE000D50758F182E194E2E5D820910E24309185 +:102CF0000F248091002090910120985F821B930BFC +:102D00008093002090930120021B130BE2E1F4E278 +:102D1000CF01825194428017910710F41192F8CF9D +:102D200082E194E2809310249093112480E098E053 +:102D300080930E2490930F242EC02097B9F1AE01FA +:102D400082E194E2B7D8A8014C1B5D0BBE016E5E18 +:102D50007B4D82E194E20E94B454809110249091C2 +:102D600011248C1B9D0B809310249093112480912F +:102D70000E2490910F248C0F9D1F80930E2490930E +:102D80000F248091002090910120C80FD91FC0937B +:102D90000020D093012042E050E060E070E480E049 +:102DA00090E2DF91CF911F910F9184C8DF91CF9175 +:102DB0001F910F91089580910D24811176CF089570 +:102DC00043E550E068E67EE281E090E025CB43E514 +:102DD00050E068E67EE281E090E04FCBCF93DF9356 +:102DE000C8E6DEE2688181E090E00E944C5B698188 +:102DF0007A8182E090E0DF91CF910C94555BCF9384 +:102E0000DF93CFEFC80FC83080F5D82F0E945D2226 +:102E100064D9C093682E8AE0C89F90011124C9012B +:102E20008559914D8093692E90936A2EF901E85946 +:102E3000F14D80850E94DA0DE091692EF0916A2EA5 +:102E4000848130DEA5D8CADF8FE18D0FE091692E35 +:102E5000F0916A2E9781943011F48093132C96810F +:102E6000943029F48093122C02C080E001C081E0EC +:102E7000DF91CF9108958091682E99E04AE09150BA +:102E800099F0282F30E02F5F3F4F27703327822F94 +:102E9000429FF001439FF00D1124E859F14D208528 +:102EA000222369F38F5FABCF0895FC019091682EC8 +:102EB0009F5C908311820895CF93FC0121812111A1 +:102EC0000DC0BC01C081E091662EF091672E41E0FB +:102ED00082E1199580ED8C0FCF9191CF80E0CF9159 +:102EE000089588E18093010608958091122C823123 +:102EF00091F030F48031B9F050F48823A9F132C058 +:102F0000833169F090EE980F983088F02BC088E0FC +:102F10008093050627C088E08093070623C0809130 +:102F2000040683FF12C088E0809306061BC09091C0 +:102F3000142C9F5F913019F09093142C15C01092AF +:102F4000142C9091040693FD04C088E0809305063C +:102F50000BC098E090930606803221F08150809358 +:102F6000122C02C01092122C8091132C823191F0FD +:102F700030F48031C1F050F48823A9F132C083319C +:102F800069F090EE980F983088F02BC080E1809324 +:102F9000050627C080E18093070623C080910406C0 +:102FA00084FF12C080E1809306061BC09091152C0F +:102FB0009F5F913019F09093152C08951092152C65 +:102FC0009091040694FD04C080E180930506089565 +:102FD00090E190930606803221F081508093132C6B +:102FE00008951092132C08959B01AC016BE080EBC7 +:102FF00098E093C0E8E6FEE298E0282F2071887000 +:10300000211162878111618791503A969111F8CF11 +:10301000222329F090E1909306061092132C882326 +:1030200029F088E0809306061092122C08950F93E1 +:103030001F939B018A01803131F4E091692EF09158 +:103040006A2E478107C0883049F4E091692EF091DB +:103050006A2E46816BE080EB98E020D01F910F91A3 +:1030600008950F931F93CF93DF931F92CDB7DEB7D1 +:10307000082FAB019E012F5F3F4F6BE080EB98E084 +:1030800025D0182F882319F06981802FB3DF812F75 +:103090000F90DF91CF911F910F9108950F931F9380 +:1030A000FC01662379F094916150941309C0BF012B +:1030B0006F5F7F4FA801C9010E948F5481E003C058 +:1030C000B196EFCF80E01F910F910895CF92DF92DC +:1030D000EF92FF921F93CF93DF93EC017A01690186 +:1030E000162F112389F0BE016F5F7F4FC7010E9429 +:1030F00086541150892B31F4FE01C491F601C0832E +:1031000081E003C0A196EDCF80E0DF91CF911F91C8 +:10311000FF90EF90DF90CF900895CF930196CCE28F +:103120006623D1F0FC01DA01AD017491772341F0FF +:1031300021153105A9F07D93319621503109F4CF45 +:10314000623038F02115310559F0FD01C0834F5F21 +:103150005F4F61508196E4CF232B11F0FA0110826A +:10316000CF91089580912002806880932002809101 +:10317000230280FFFCCF81E080932302A091100204 +:10318000B0911102AE5BB109B7FF02C0A0E0B0E0A0 +:1031900020E038EB4BE050E00E940954E091692EAA +:1031A000F0916A2E843F9140A8F48781873019F40A +:1031B00080E18093132C8681873019F480E180931D +:1031C000122C8091642E882389F0E091562EF09184 +:1031D000572E19948781873019F481E18093132C3D +:1031E0008681873019F481E18093122C0895BC0107 +:1031F00083E090E20C943152CF93DF93FC01649111 +:10320000EC012196662331F083E090E20E947F5228 +:10321000CE01F4CFDF91CF910895AB01BC0183E0E3 +:1032200090E20C945B5280E2809362060895CF9303 +:10323000DF938091162C823029F583E090E20E9482 +:10324000E8520E94C64D83E090E20E940453EC01D4 +:1032500097FD18C0E091692EF0916A2E8781833026 +:1032600019F483E18093132C8681833019F483E170 +:103270008093122C8C2F44D6811104C08C2FDF91A7 +:10328000CF91E1C7DF91CF9108958091162C8130C5 +:1032900079F028F08230C9F0833011F12EC080918E +:1032A000680685FF31C08FE08093022081E015C061 +:1032B00080910220815080930220811125C00E94BC +:1032C0008B0D0E945E5182E008C08091680685FDEA +:1032D00018C08FE08093022083E08093162C0DC0ED +:1032E0008091022081508093022081110DC00E94A4 +:1032F00023510E94B90D1092162C8091162C823009 +:1033000019F44DD70C9425220895E091692EF0917F +:103310006A2E8781823019F481E18093132C868193 +:10332000823019F481E18093122C0895E091692E86 +:10333000F0916A2E8781823019F480E18093132CFA +:103340008681823019F480E18093122C089583E005 +:1033500090E20C940C5283E090E20C94575321EBD2 +:103360003BE03F932F932BEA3BE03F932F9324EADC +:103370003BE03F932F932DE93BE03F932F932DEFBD +:103380003AE03F932F9322E02F931F929F938F93C6 +:103390000E9414558DB79EB70E968DBF9EBF85E6D1 +:1033A000089560E072E00E94130E85E60895FB0127 +:1033B00020812F3349F42181211106C060E072E0A1 +:1033C0000E94520E85E60895CB010E94240E8823A8 +:1033D00019F0FDDC84E608958AEC0895EF92FF92DF +:1033E0000F931F93CF93DF93CDB7DEB7A097CDBFD9 +:1033F000DEBF7C010091642E10E00115110591F4EF +:1034000085EF9AE09F938F9382E08F931F92FF92B4 +:10341000EF920E9414550F900F900F900F900F9005 +:103420000F9010C0E0915E2EF0915F2ECE010196BC +:1034300019959801AE014F5F5F4F60E072E0C701E0 +:103440000E94770E85E6A096CDBFDEBFDF91CF91BB +:103450001F910F91FF90EF900895DF92EF92FF92EE +:103460000F931F93CF93DF93CDB7DEB7A097CDBF58 +:10347000DEBF7B010091642E10E06EEE7AE0C701A2 +:103480000E948654892B29F5D12CED2CF12CE016C5 +:10349000F10658F40E945A0EE1E0F0E0EC0FFD1F37 +:1034A000EE0DFF1D8083D394F0CFE091602EF0915C +:1034B000612ECE0101961995E091662EF091672E4E +:1034C0004091642EBE016F5F7F4F83E1199584E6C2 +:1034D0000BC0A70160E270E0CE0101960E94A20E2F +:1034E0000817190711F38AECA096CDBFDEBFDF9154 +:1034F000CF911F910F91FF90EF90DF900895FC0105 +:103500008091652E882311F081E301C080E38083E0 +:10351000118285E60895FB012181211127C02081B8 +:10352000213321F481E08093652E04C0203321F4FF +:103530001092652E84E608952F33C1F41F9220E384 +:103540002F931F9221E32F9328EE3AE03F932F937E +:1035500022E02F931F929F938F930E9414558DB753 +:103560009EB70A968DBF9EBF85E608958AEC0895A2 +:1035700084E091E194D48EE6089584E891E1AAD4A0 +:103580008EE60895E0ECF4E081818E7F81830E94D5 +:1035900023510E947F0D84E60895E0ECF4E08181E0 +:1035A0008E7F81830E9423510E94850D84E60895B9 +:1035B000EEE4FEE225892F9324892F9325EE3AE04D +:1035C0003F932F9322E02F931F929F938F930E94FC +:1035D00014558DB79EB708968DBF9EBF85E608959A +:1035E0002091642E1F922F9322EE3AE03F932F9367 +:1035F00022E02F931F929F938F930E9414558DB7B3 +:103600009EB708968DBF9EBF85E6089540E052E0C4 +:10361000BC0180E00DD985E60895FB0120812F33A0 +:1036200041F42181211105C060E072E0F0D885E607 +:10363000089580E00FD9882319F0C9DB84E6089546 +:103640008AEC089540E052E0BC0181E0F1D885E6C3 +:103650000895FB0120812F3341F42181211105C000 +:1036600060E072E0D4D885E6089581E0F3D888233D +:1036700019F0ADDB84E608958AEC089540E052E04D +:10368000BC0182E0D5D885E60895FB0120812F3367 +:1036900041F42181211105C060E072E0B8D885E6CF +:1036A000089582E0D7D8882319F091DB84E6089545 +:1036B0008AEC089540E052E0BC0183E0B9D885E689 +:1036C0000895FB0120812F3341F42181211105C090 +:1036D00060E072E09CD885E6089583E0BBD888233B +:1036E00019F075DB84E608958AEC089540E052E015 +:1036F000BC0180E19CDC85E60895FB0120812F332D +:1037000041F42181211105C060E072E06DDC85E6A5 +:10371000089580E1A6DC882319F059DB84E608953A +:103720008AEC089540E052E0BC0188E080DC85E648 +:103730000895FB0120812F3341F42181211105C01F +:1037400060E072E051DC85E6089588E08ADC882339 +:1037500019F03DDB84E608958AEC089560E072E09C +:103760008EDA85E60895FB0120812F3341F4218113 +:10377000211105C060E072E092DA85E60895CB0180 +:1037800065DA882319F023DB84E608958AEC08952E +:10379000CF93DF93EC017AD9813028E0920718F0BB +:1037A0009C01385002C020E030E03F932F939F935C +:1037B0008F9382EC9AE09F938F9382E08F931F9276 +:1037C000DF93CF930E9414558DB79EB70A968DBF95 +:1037D0009EBF85E6DF91CF91089585E794E17AD386 +:1037E0008EE6089562DA84E6089514D984E6089591 +:1037F00060E072E05ADB85E60895CB015DDB811164 +:1038000002C08AEC089584E608950E943D1084E683 +:1038100008950E946D1084E608950E94C80F84E602 +:1038200008958091680680FD02C089E7089588E7C1 +:103830000895DF92EF92FF920F931F93CF93DF9340 +:10384000EC010FEF11E084EFE82E8CE0F82E9CE203 +:10385000D92EB70181EC93E20E948654892BD1F0D6 +:1038600001151105B9F0DE01F7012491ED01219652 +:10387000C8010197222341F00130110529F02C9352 +:10388000DE0131968C01F1CFDC928C0188E1E80EEB +:10389000F11CDFCF2197188285E6DF91CF911F9130 +:1038A0000F91FF90EF90DF900895FC01809120022E +:1038B0008068809320028091230280FFFCCF81E00A +:1038C00080932302A0911002B0911102AE5BB10966 +:1038D000B7FF02C0A0E0B0E020E038EB4BE050E0E2 +:1038E0000E940954AA27BB279F938F938BEB9AE0E2 +:1038F0009F938F9382E08F931F92FF93EF930E9489 +:1039000014558DB79EB708968DBF9EBF85E6089566 +:103910004EB15FB12091080430910904242B352B5E +:103920003F932F9325EB3AE03F932F9322E02F9381 +:103930001F929F938F930E9414558DB79EB7089640 +:103940008DBF9EBF85E608950F931F93CF93DF939E +:103950001F921F92CDB7DEB78B01E091692EF091D7 +:103960006A2E8581893009F06FC0E091562EF09162 +:10397000572E199581E08093702C60E270E0C801A9 +:103980000E94CC540097F9F4F80101900020E9F767 +:103990003197E01BF10BE0FD59C0F695E795E1305A +:1039A000F10539F487E090E080934C2E90934D2EF2 +:1039B00037C053E0EE0FFF1F5A95E1F7E0934C2E0E +:1039C000F0934D2E2DC098012C5F3F4F8217930727 +:1039D000E9F5A80162E070E0CE0101960E94A20E16 +:1039E000898190E0982F88272A81820F911D8093EA +:1039F0004C2E90934D2E0B5F1F4FF801019000202D +:103A0000E9F73197E01BF10BE0FD20C0F695E79553 +:103A100033E0EE0FFF1F3A95E1F7E817F907B0F032 +:103A200060914C2E70914D2E695F7F4F83E07695AB +:103A300067958A95E1F7A8018CE49DE20E94A20EA9 +:103A40000E94942B8FEF03C089EC01C08AEC0F9089 +:103A50000F90DF91CF911F910F910895EF92FF92F8 +:103A60000F931F93CF93DF931F921F92CDB7DEB7B3 +:103A70008B01E091692EF0916A2E8581893009F0E1 +:103A800080C0E091562EF091572E199582E08093D8 +:103A9000702C60E270E0C8010E94CC547C01892B3C +:103AA00031F5F80101900020E9F73197E01BF10BA7 +:103AB000E0FD69C0F695E795E130F10539F487E05E +:103AC00090E080934C2E90934D2E47C053E0EE0F24 +:103AD000FF1F5A95E1F7CF0169E070E00E94F553AE +:103AE000E81BF90BE0934C2EF0934D2E36C0C80125 +:103AF0000496E816F90609F046C0A80162E070E0F5 +:103B0000CE0101960E94A20E898190E0982F88270D +:103B10002A81820F911D80934C2E90934D2E8730D9 +:103B2000910529F09C0127703327232B61F587012C +:103B30000F5F1F4FF80101900020E9F73197E01B5C +:103B4000F10BE0FD20C0F695E79533E0EE0FFF1F87 +:103B50003A95E1F7E817F907B0F060914C2E7091B3 +:103B60004D2E695F7F4F83E0769567958A95E1F7E3 +:103B7000A8018CE49DE20E94A20E0E94942B8FEF7C +:103B800003C089EC01C08AEC0F900F90DF91CF91B8 +:103B90001F910F91FF90EF900895E091692EF091A1 +:103BA0006A2E85818930A1F4E091562EF091572E2E +:103BB000199585E08093702C0E94DA450E94942B21 +:103BC00084EE95E48093252C9093262C8FEF089516 +:103BD00089EC0895E091692EF0916A2E85818930F3 +:103BE000A1F4E091562EF091572E199583E0809321 +:103BF000702C0E94DA450E94942B84EE95E4809309 +:103C0000252C9093262C8FEF089589EC0895E09150 +:103C1000692EF0916A2E85818930A1F4E091562EAB +:103C2000F091572E199586E08093702C0E94DA450A +:103C30000E94942B84EE95E48093252C9093262C5F +:103C40008FEF089589EC0895E091692EF0916A2E26 +:103C50004085518564E6649F9001659F300D112475 +:103C60003F932F932FEA3AE03F932F9322E02F9335 +:103C70001F929F938F930E9414558DB79EB70896FD +:103C80008DBF9EBF85E60895CF93DF931F921F924D +:103C9000CDB7DEB7FB0120812F33B1F42181211193 +:103CA00013C02DE73AE03F932F9322E02F931F920A +:103CB0009F938F930E9414550F900F900F900F9029 +:103CC0000F900F9085E627C089E592E089839A835B +:103CD000CE0101969F938F9389E79AE09F938F93EC +:103CE0007F936F930E944A550F900F900F900F9003 +:103CF0000F900F90892B71F089819A818935F2E0BC +:103D00009F0740F4E091692EF0916A2E8087918799 +:103D100084E601C08AEC0F900F90DF91CF91089557 +:103D200020911F202F9320911E202F9326E73AE009 +:103D30003F932F9322E02F931F929F938F930E9484 +:103D400014558DB79EB708968DBF9EBF85E6089522 +:103D5000CF93DF931F921F92CDB7DEB7FB01208177 +:103D60002F33B1F42181211113C02FE02F932FEFB6 +:103D70002F9325E23AE03F932F9322E02F931F9257 +:103D80009F938F930E941455CDBFDEBF85E627C059 +:103D900019821A82CE0101969F938F9381E29AE055 +:103DA0009F938F937F936F930E944A550F900F902C +:103DB0000F900F900F900F90892B81F089819A813D +:103DC0008115E0E19E0750F4809338039093390306 +:103DD00080931E2090931F2084E601C08AEC0F90F0 +:103DE0000F90DF91CF910895FB0120812F33D9F4FB +:103DF0002181211121C01F9220E32F931F9221E3E3 +:103E00002F932BE13AE03F932F9322E02F931F92C1 +:103E10009F938F930E9414558DB79EB70A968DBFBE +:103E20009EBF85E60895213311F4D1D303C020331A +:103E300019F4F3D384E608958AEC0895FC01809187 +:103E40000008813029F480918C0891E0833009F0DA +:103E500090E090FF02C081E301C080E38083118283 +:103E600085E60895E091692EF0916A2E858189306A +:103E7000A1F4E091562EF091572E199584E080938D +:103E8000702C0E94DA450E94942B84EE95E4809376 +:103E9000252C9093262C8FEF089589EC089521E02E +:103EA0002093242C2093232C2CE32093212C25E0F9 +:103EB00030E020931F2C3093202C1092192C10925C +:103EC0001A2C10921B2C10921C2C8093172C909360 +:103ED000182C089527E02093242C2CE231E0209325 +:103EE0001F2C3093202C1092192C10921A2C109207 +:103EF0001B2C10921C2C8093172C9093182C089537 +:103F0000CF939091242C953009F441C030F4933034 +:103F100019F130F5913068F43EC1973009F4AAC028 +:103F200008F44AC0983009F4ACC0993009F495C03F +:103F300032C1813031F410921D2C10921E2C83E07E +:103F400023C0843011F466E084C0883109F485C050 +:103F50008B3109F084C081C08093222C84E014C08E +:103F600090E04091222C2FEF30E0241B3109821782 +:103F7000930721F485E008C0891779F165E183E0B2 +:103F800090E20E947F5282E08093242C68C02091AE +:103F90001D2C30911E2CA9014F5F5F4F40931D2CAB +:103FA00050931E2CF901E554F14D808340385105A2 +:103FB00009F055C086E0E8CF2091222C9091232C67 +:103FC00029134FC0EBEBFEE22BE33FE290E02E170C +:103FD0003F0791F24191940FFACF4091192C5091E3 +:103FE0001A2C60911B2C70911C2CE091172CF091D5 +:103FF000182C20E830E08BEB9EE21995C82F88231F +:1040000011F18091232C8F5F8093232C8091192CA8 +:1040100090911A2CA0911B2CB0911C2C80589F4F72 +:10402000AF4FBF4F8093192C90931A2CA0931B2C49 +:10403000B0931C2C66E083E090E20E947F5282E005 +:104040008093242CA9C068E183E090E20E947F5213 +:1040500068E183E090E20E947F521092242CC1E03C +:104060009BC030E0892F90E001972817390781F72E +:1040700066E085CF853119F41092232C08C08B316E +:1040800061F3883109F45FCF863009F05AC080911E +:10409000232C8F5F8093232C4091192C50911A2C44 +:1040A00060911B2C70911C2CE091172CF091182C16 +:1040B00020E830E08BEB9EE21995C82F8823D1F1E0 +:1040C00061E083E090E20E947F526091232C83E0C4 +:1040D00090E20E947F526091232C609583E090E2F1 +:1040E0000E947F5260E870E08BEB9EE296D8EBEB8B +:1040F000FEE260E08FE2EB33F80719F08191680F80 +:10410000F9CF83E090E20E947F528091192C909128 +:104110001A2CA0911B2CB0911C2C80589F4FAF4F94 +:10412000BF4F8093192C90931A2CA0931B2CB09303 +:104130001C2C32C064E083E090E20E947F5289E050 +:1041400023CF853109F08BCF61E083E090E20E94BC +:104150007F526091232C83E090E20E947F52609115 +:10416000232C609583E090E20E947F5260E870E02B +:104170008BEB9EE252D8EBEBFEE28BE39FE260E03A +:104180008E179F0719F02191620FFACF83E090E21A +:104190000E947F5264CFC0E08C2FCF910895809110 +:1041A000242C813019F0873029F1089580911F2C3B +:1041B0009091202C9C012150310920931F2C309389 +:1041C000202C892B31F58091212C9FEF980F909313 +:1041D000212C882331F065E183E090E20E947F5238 +:1041E00002C01092242C85E090E080931F2C9093C5 +:1041F000202C089580911F2C9091202C9C012150FF +:10420000310920931F2C3093202C892B11F410920C +:10421000242C0895EBECFBE020E030E0949198131F +:1042200009C041E2429FC001439F900D1124845375 +:10423000944F08952F5F3F4FB1962930310571F7A4 +:1042400080E090E00895CF92DF92EF92FF920F937B +:104250001F93CF93982F9F7D91549A3160F090EDEA +:10426000980F9A3040F08F3531F0982F9D7F9D3315 +:1042700011F08032D1F49FE9980F9A3108F48052FE +:1042800020912A2C30912B2C2F3F91E0390708F0F8 +:10429000D3C0A9014F5F5F4F40932A2C50932B2C22 +:1042A000F901E554F14D8083C7C08D3009F095C008 +:1042B000E0912A2CF0912B2CE554F14D10821092B4 +:1042C0002A2C10922B2C8091292C8111B5C0809121 +:1042D000BB2E982F9F7D09F495C08D7F8D3309F4F7 +:1042E00091C0EBEBFEE27F01C191CC2331F0CF33E3 +:1042F00021F0CD3311F0C032B1F7F701108284EF15 +:10430000C82E8CE0D82E00E010E0B6018BEB9EE2C8 +:104310000E948654892B09F056C01092BB2ECF33D1 +:1043200049F488E1809FF001819FF00D1124E65F40 +:10433000F24F18C0B7016F5F7F4FCD3349F488E16A +:10434000809FF001819FF00D1124E85FF24F20C0A3 +:10435000C11113C088E1809FF001819FF00D1124ED +:10436000EC5FF24F259134912115310509F44DC0D0 +:104370008BEB9EE2F901199514C0C03209F045C0DB +:1043800088E1809FF001819FF00D1124EA5FF24FD8 +:104390002591349121153105C1F18BEB9EE2F90194 +:1043A00019958F3F99F581E08093292C2EB13FB16B +:1043B0008091080490910904822B932B8093272CE1 +:1043C0009093282C39C00F5F1F4FF8E1CF0ED11CFE +:1043D0000732110509F099CF15C0883061F480913A +:1043E0002A2C90912B2C009739F1019780932A2C3D +:1043F00090932B2C21C08B31F9F410922A2C10921F +:104400002B2C1AC088ECC0E002C089ECC1E002DFAE +:104410000E94FC1888EC9BE00E94FC18CC2361F001 +:104420008091BB2E882341F08BEB9EE20E94F7180F +:1044300085EC9BE00E94FC1881E0CF911F910F91C9 +:10444000FF90EF90DF90CF9008958091292C8823E2 +:1044500099F1E091692EF0916A2E20853185211520 +:10446000310551F14EB15FB180910804909109047A +:10447000842B952B4091272C5091282C841B950B35 +:1044800064E670E00E94F55362177307A8F010927B +:10449000292C8BECBFDE0E94FC1882EC9BE00E9472 +:1044A000FC18E091252CF091262C309729F01995D5 +:1044B0001092252C1092262C08958091292C882367 +:1044C000A9F01092292C8BECA5DE0E94FC1882EC3E +:1044D0009BE00E94FC18E091252CF091262C30974F +:1044E00029F019951092252C1092262C0895CF931F +:1044F000DF939091292C9923A9F0EB011092292C9C +:1045000089DE0E94FC188FEB9BE00E94FC1820972C +:1045100049F0CE010E94F7188CEB9BE0DF91CF9120 +:104520000C94FC18DF91CF910895EF92FF920F93B6 +:104530001F93CF937C019B01613081E0780710F0DD +:1045400020E031E08B01021B130BA70160E072E059 +:104550008BEB9EE20E94770E8BEB9EE20E94F71897 +:10456000C1E0013081E01807A8F01A954C2F50E007 +:10457000542F44274E0D5F1D20E032E060E072E0D2 +:104580008BEB9EE20E94770E8BEB9EE20E94F71867 +:10459000CF5FE7CF0115110589F04C2F50E0542F64 +:1045A00044274E0D5F1D980160E072E08BEB9EE2A8 +:1045B0000E94770E8BEB9EE20E94F71889EB9BE03E +:1045C000CF911F910F91FF90EF900C94FC18809168 +:1045D0000008813021F490918C08933009F080E03C +:1045E00080FD1AC080912E2C811116C081E080932D +:1045F000000893E090938C0880932C2C10922D2C23 +:104600002EB13FB18091080490910904822B932B25 +:104610008093332C9093342C089510928C08109230 +:104620000008ECE2FCE210821182089590912C2C9B +:104630009923F1F080912D2C811115C020912C2C03 +:104640002223B9F04EB15FB12091080430910904E2 +:10465000242B352B4091332C5091342C241B350BBB +:104660002634310530F081E080932D2C892F089578 +:1046700081E00895CF93C0912E2CCC23C1F02EB1B0 +:104680003FB18091080490910904822B932B2091D3 +:10469000312C3091322C821B930B20912F2C309196 +:1046A000302C8217930718F010922E2C90DF8C2F4D +:1046B000CF91089580931E2090931F2080933803FC +:1046C00090933903089580911E2090911F20409669 +:1046D00080931E2090931F2080933803909339037A +:1046E000089580E991E080931E2090931F2080938D +:1046F0003803909339030895A0E2B6E081E015965F +:104700008C9315972BEB30E328B939B92BE331E3C0 +:104710002AB93BB910B813B812B816B817B811B8FF +:10472000E0E0F9E010A211A22FEF30E026A337A3BA +:104730002FEF3FEF20A731A7808388E8838380E1B4 +:10474000848783E087831C968C931C9782E01A965B +:104750008C9308951F920F920FB60F92112408B6F2 +:104760000F9218BE0BB60F921BBE8F939F93EF93C1 +:10477000FF93E0E0F9E013828FE790E086AB97AB20 +:1047800081E190E080AF91AFE0E0FAE010A211A2E9 +:104790008FEF9FEF86A397A389E88383168281E03A +:1047A00084878EE0808310922A06FF91EF919F917B +:1047B0008F910F900BBE0F9008BE0F900FBE0F9001 +:1047C0001F9018951F920F920FB60F92112408B6E2 +:1047D0000F9218BE0BB60F921BBE2F933F938F9371 +:1047E0009F93EF93FF932091280693B1267081E069 +:1047F00009F080E0990F892B83B982B1882309F4ED +:1048000063C012B883B18770873059F510920009E0 +:1048100080E180930C091092030A1B9B03C08CEA71 +:1048200094E002C08CE694E08093260A9093270AD5 +:1048300082E081B981E080930C0A83E08093060ACC +:1048400086B197B1877049F090B18F5F893011F0D0 +:104850009695FBCFE8B1F9B1908381E08093352C38 +:1048600036C083B1982F9C7091F1847091B19111F1 +:104870001CC020B12695882311F080E001C080E89B +:10488000282B20B986B197B1019686B997B9877060 +:104890009927892BE1F4E8B1F9B1CF01019688B9E4 +:1048A00099B9208381E081B912C091B1913079F436 +:1048B000EAB1FBB19F012F5F3F4F2AB93BB981118C +:1048C00090E0908311B803C082B1809582B988E8E6 +:1048D00080930309FF91EF919F918F913F912F91C9 +:1048E0000F900BBE0F9008BE0F900FBE0F901F9041 +:1048F00018951F920F920FB60F92112408B60F92BF +:1049000018BE0BB60F921BBE2F933F938F939F93AE +:10491000EF93FF9381B1823008F49DC081B18D3057 +:1049200008F099C0E1B1F0E0EE0FFF1FEA5DFF4D26 +:104930000190F081E02D19948FE790E08093260A92 +:104940009093270A88C08E9A8EE0809340088FE368 +:1049500090E08093260A9093270A85E06FC08E9896 +:1049600086E081B98FEF82B914B815B8E8B1F9B112 +:10497000808180B970C0009B05C08E9A82B18095FD +:1049800082B901C08E9887E059C0009B02C08E9802 +:1049900001C08E9A80B1869580B984B195B1019697 +:1049A00084B995B984B195B187709927892B11F491 +:1049B00088E044C024B135B186B197B128173907D2 +:1049C000B1F52BC0EAB1FBB1309711F0808101C085 +:1049D00082B1882311F08E9A01C08E9889E02EC092 +:1049E000EAB1FBB1309751F08081882311F08E98A5 +:1049F00001C08E9A3196EAB9FBB908C082B188230A +:104A000011F08E9801C08E9A8FEF82B924B135B122 +:104A100086B197B12817390711F48AE00FC0E8B1C1 +:104A2000F9B1CF01019688B999B9818180B986E041 +:104A300005C08E988BE002C08E988CE081B90BC0C7 +:104A40001092000A1092060A109240081092410833 +:104A500081E08093362CFF91EF919F918F913F9150 +:104A60002F910F900BBE0F9008BE0F900FBE0F90AE +:104A70001F901895CF93DF93E5E3FCE2108211823B +:104A8000E0E4F6E0128A84E08283C0E8D1E082E6C6 +:104A90008E83A0E2B6E081E016968C93169711966D +:104AA0008C93119796E012969C93129751968C9343 +:104AB000519742E052964C9352971A961C921A972D +:104AC00033E019963C9399E598839AE5998390E4AD +:104AD00091839683A0EBB0E012962C911297207FE1 +:104AE00012962C93129712962C911297226012967E +:104AF0002C9320E321832683908B86834583318307 +:104B0000E0E0F8E083E1818321E030E026A337A3F1 +:104B100020A731A7E0E8F8E014868083E0E2F3E024 +:104B20001382118288E0828391E1908320911E207C +:104B300030911F20208F318FE0E8F3E09CE39283D7 +:104B4000808393838183DF91CF91D6CDA0E2B6E0BD +:104B50001A961C921A97E5E3FCE210821182E0E0BB +:104B6000F9E010821382178280E18487E0E0FAE0A6 +:104B700010821382168281E08487E0E4F8E01082DC +:104B8000118216968C938E980895CF93DF9380911F +:104B9000352C882309F47EC01092352CC6B1D7B1CC +:104BA000C730D10508F471C0AE01495F5F4F93E093 +:104BB000569547959A95E1F7E091662EF091672E0C +:104BC0006BEB70E380E41995E091692EF0916A2E09 +:104BD0008781883019F483E18093132C8681883093 +:104BE00019F483E18093122CE0915C2EF0915D2EFC +:104BF000BE018BEB90E31995EC0194FF06C0DF7EBC +:104C00008BE391E38AB99BB902C01AB81BB820970D +:104C1000E1F1AE01495F5F4F83E0569547958A9574 +:104C2000E1F7E091662EF091672E6BEB70E381E483 +:104C30001995E091692EF0916A2E8781893019F4D7 +:104C400083E18093132C8681893019F483E180936A +:104C5000122CC6B9D7B98BEB90E388B999B91092E9 +:104C60006008109261088FE090E08093660890934E +:104C7000670888E090E080936A0890936B0883E26D +:104C80008093410883E081B905C01092000A109218 +:104C9000060A32DD8091362C882329F01092362CBA +:104CA000DF91CF9129CDDF91CF910895CF93DF93FD +:104CB000E0E4F6E0128A84E08283C0E8D1E082E694 +:104CC0008E83A0E2B6E081E016968C93169711963B +:104CD0008C93119796E012969C93129751968C9311 +:104CE000519742E052964C9352971A961C921A97FB +:104CF00033E019963C93199799E598839AE599833F +:104D000090E491839683C0EBD0E02A81207F2A83B0 +:104D10002A8122602A8320E321832683908B868345 +:104D200045833183E0E0F8E093E1918321E030E0D6 +:104D300026A337A320A731A7E0E8F8E014869083E4 +:104D4000E0E2F3E01382118298E0928321E1208374 +:104D500020911E2030911F20208F318FE0E8F3E05A +:104D60002CE3228390832383918315968C93E0E038 +:104D7000F9E02FEF30E026A337A312A613A614A65E +:104D800015A610821682178280831092000A109254 +:104D9000372CEAE3FCE2108212821182DF91CF917C +:104DA000089581E08093260638DCE0E0F9E0108287 +:104DB0001782E0E0FAE010821782EAE3FCE2118257 +:104DC0001282108208951F920F920FB60F92112433 +:104DD00008B60F9218BE0BB60F921BBE2F933F93CF +:104DE0008F939F93EF93FF93E0E0F9E080E4848753 +:104DF0001782E0E8F3E082E0878389EB81838BEB25 +:104E000090E38AB99BB981E090E084B995B916B86E +:104E10002EB13FB18091080490910904822B932B0D +:104E20008093382C9093392C81E080933C2C18B8D7 +:104E300017B81092372C88E080938706FF91EF9186 +:104E40009F918F913F912F910F900BBE0F9008BEB5 +:104E50000F900FBE0F901F901895E0E0F9E08FEFD4 +:104E600094E086A397A380E6848780E387838FEF0F +:104E700090E086AB97AB88E08093870608951F92F9 +:104E80000F920FB60F92112408B60F9218BE0BB6F0 +:104E90000F921BBE2F933F934F935F938F939F93DC +:104EA000EF93FF931092070A1092000A109247099D +:104EB00010924009809181038E7F8093810384B199 +:104EC00095B180FF1AC0379B03C086B1869503C099 +:104ED00086B18695806886B984B195B1019684B90A +:104EE00095B987709927892B41F4EAB1FBB1CF01BD +:104EF00001968AB99BB986B1808384B195B18770D8 +:104F00009927892BC9F0E4B1F5B186B144B155B107 +:104F100093E0F695E7959A95E1F7E554FF4C90E01C +:104F20004770552728E030E0241B350B02C09595CB +:104F300087952A95E2F7808381E080933B2C10923D +:104F40003C2C8FEF9FEF8093260A9093270A1092B4 +:104F5000200A1092210A1092060A1092070A109253 +:104F6000030A84E08093000A83E08093372CFF914A +:104F7000EF919F918F915F914F913F912F910F9062 +:104F80000BBE0F9008BE0F900FBE0F901F9018958C +:104F90001F920F920FB60F92112408B60F9218BEEF +:104FA0000BB60F921BBE8F93EF93FF93E0E8F3E0F5 +:104FB00081818F7C8183E0E0FAE088E8838381E06F +:104FC0008083FF91EF918F910F900BBE0F9008BEE1 +:104FD0000F900FBE0F901F9018951F920F920FB653 +:104FE0000F92112408B60F9218BE0BB60F921BBE7B +:104FF0008F939F93EF93FF938091600910926009C4 +:105000001092610993E090934009813520F4813337 +:1050100008F472C01BC08137E8F484B195B180FFF9 +:105020002EC086B18695806886B984B195B1019607 +:1050300084B995B987709927892B41F4EAB1FBB1FE +:10504000CF0101968AB99BB986B1808386B18695D6 +:1050500080682CC086B18695806886B984B195B188 +:10506000019684B995B987709927892B41F4EAB1E3 +:10507000FBB1CF0101968AB99BB986B1808386B115 +:105080008695806886B984B195B1019684B995B941 +:1050900087709927892B41F4EAB1FBB1CF010196C2 +:1050A0008AB99BB986B1808386B1869586B984B169 +:1050B00095B1019684B995B987709927892B41F4E8 +:1050C000EAB1FBB1CF0101968AB99BB986B1808361 +:1050D00086B1869586B984B195B1019684B995B9A2 +:1050E00087709927892B41F4EAB1FBB1CF01019672 +:1050F0008AB99BB986B18083FF91EF919F918F917F +:105100000F900BBE0F9008BE0F900FBE0F901F9018 +:1051100018950F931F93CF93DF93CDB7DEB7DA9532 +:10512000CDBFDEBF80913C2C882309F483C04EB1F3 +:105130005FB180910804909109042091382C30913E +:10514000392C842B952B821B930B2091202030919E +:1051500021202F5F3F4F2817390708F06BC01092AE +:10516000070A1092000A1092470910924009809194 +:1051700081038E7F8093810384B195B180FF1AC033 +:10518000379B03C086B1869503C086B1869580683B +:1051900086B984B195B1019684B995B9877099277C +:1051A000892B41F4EAB1FBB1CF0101968AB99BB9D1 +:1051B00086B1808384B195B187709927892BC9F016 +:1051C000E4B1F5B186B144B155B113E0F695E79578 +:1051D0001A95E1F7E554FF4C90E04770552728E019 +:1051E00030E0241B350B02C0959587952A95E2F790 +:1051F000808381E080933B2C10923C2C2FEF3FEF7B +:105200002093260A3093270A1092200A1092210A2E +:105210001092060A1092070A1092030A94E09093E3 +:10522000000A93E09093372C14B815B880933B2C68 +:1052300010923C2C1FDA81116FC2F8D9882309F42F +:105240006BC280913C2C811167C280913A2C8111F4 +:1052500005C080913B2C882309F45EC28091372CD5 +:10526000833041F48091200A9091210A8532914047 +:1052700008F452C280913B2C882309F4A2C084B167 +:1052800095B1892B09F49DC084B195B1089718F4A4 +:1052900014B815B896C044B155B1495F5F4FB3E03B +:1052A00056954795BA95E1F76BEB70E3CE01019601 +:1052B0000E94AB548BEB90E38AB99BB944B155B1D2 +:1052C00014B815B8898186958695898322E030E0E7 +:1052D00024173507B0F5F901A3E0F695E795AA95EF +:1052E000E1F781E090E08C0F9D1FE80FF91F8081AE +:1052F000982F9695969590838370813049F030F081 +:105300008230D1F486B18695806804C081E015C0F2 +:1053100086B1869586B984B195B1019684B995B95F +:1053200087709927892B41F4EAB1FBB1CF0101962F +:105330008AB99BB986B1808380E02E5F3F4F882376 +:1053400039F284B195B187709927892BC9F0E4B1FE +:10535000F5B186B144B155B173E0F695E7957A950C +:10536000E1F7E554FF4C90E04770552728E030E026 +:10537000241B350B02C0959587952A95E2F780830B +:10538000E091692EF0916A2E8781883019F483E1CB +:105390008093132C8681883019F483E18093122C3A +:1053A00044B155B1495F5F4F63E0569547956A95A3 +:1053B000E1F7E091662EF091672E6BEB70E382E4EB +:1053C000199510923A2C10923B2C64B175B1E09172 +:1053D0005C2EF0915D2E8BEB90E3199584B995B915 +:1053E00084B195B1892B09F497C189E88093810331 +:1053F0001092000A1092200A1092210A2FEF3FEF1C +:105400002093260A3093270A8FE590E08093280A9C +:105410009093290A1092060A80E180930C0A93E087 +:105420009093070A1092600910926109209366090F +:105430003093670920EA30E02093680930936909C6 :105440001092460980934C0981E08093470981E1DD :105450008093800110928801109280031092290697 -:10546000E091682EF091692E8781893019F483E1EB -:1054700080931F2C8681893019F483E180931E2C40 -:1054800044B155B1495F5F4F83E0569547958A9582 -:10549000E1F7E091652EF091662E6AEB70E383E40C -:1054A000199581E08093442C12B810922009109233 -:1054B000210980930009D395CDBFDEBFDF91CF9145 -:1054C0001F910F91FF90EF90DF90CF90BF900895C4 -:1054D00014B815B881E08093472C43C81092070A8E -:1054E0001092000A1092470910924009809181039E -:1054F0008E7F8093810384B195B187709927892B22 -:10550000C9F0E4B1F5B186B144B155B193E0F69577 -:10551000E7959A95E1F7E654FF4C90E047705527E0 -:1055200028E030E0241B350B02C0959587952A951D -:10553000E2F7808381E08093482C1092492C8FEF12 -:105540009FEF8093260A9093270A1092200A1092C8 -:10555000210A1092060A1092070A1092030A84E0A8 -:105560008093000A87E08093442C1092442C109280 -:10557000482C1092472C1AC881E080934C2C109232 -:105580004A2C089581E080934C2C08950895CF9281 -:10559000DF92EF92FF920F931F93CF93DF93CDB7DC -:1055A000DEB72597CDBFDEBF8C01FC0180819091D5 -:1055B0004C2C9230F1F038F0943079F120F19530A4 -:1055C00009F44AC049C121E09227292F2170209374 -:1055D0004A2C911102C0863219F0823509F03CC183 -:1055E00084E4F8018083118282E080934C2C80E176 -:1055F00034C190914A2C911102C08632B1F08235AB -:1056000009F04DC012C090914A2C911102C086320F -:1056100061F0823509F075C008C090914A2C911153 -:1056200002C0863211F0823539F484E4F8018083B7 -:10563000118281E089270DC0803309F41BC1823AB1 -:1056400009F434C1803A09F451C1803509F4F6C037 -:1056500081E080934C2C00C160E170E0C8010E94A1 -:1056600073348823A1F08091642E81110BC0609166 -:105670004B2CF4E06F9FB001112444E050E0C801CE -:105680000E94FC0E84E080934C2C8AE004C084E0ED -:1056900080934C2C81E0F801808384E0DEC0833964 -:1056A000B9F619821A821B821C8288E8898343E03A -:1056B00050E060E070E0CE0102960E94AE0EF8016C -:1056C0008181803209F4ABC0803709F048C0F8010D -:1056D000928189819813C0C093818A819813BCC03C -:1056E00094818B819813B8C095818C819813B4C034 -:1056F00084E0808361E070E0C8010E94483483E068 -:105700002AC0853909F0A4CF44E050E064E070E09D -:10571000CE0101960E94AE0EF8018181803209F41B -:105720007EC08037E1F4F80192818981981394C09A -:1057300093818A81981390C094818B8198138CC037 -:1057400095818C81981388C0108261E070E0C80157 -:105750000E94483484E080934C2C88E17EC0E82E7F -:10576000E2949FE0E9222EEF2E0D8F70F82E88E054 -:1057700090E08F1991094FEF50E06A0102C0D59473 -:10578000C7948A95E2F7253021F0243059F5FF209F -:10579000E9F044E050E0B8016E5F7F4FCE01019622 -:1057A0002D830E94EF552D81892B61F49A81898187 -:1057B00089279B8189279C818927F80196818927E0 -:1057C0008C2169F1243071F4F11046C044E050E0BE -:1057D000B8016E5F7F4FCE0101960E94EF55892B75 -:1057E000F1F03AC02430C0F5E22EF12CA701B80147 -:1057F0006E5F7F4FCE0101960E94EF55892B61F5B8 -:10580000D801AE0DBF1DE1E0F0E0EC0FFD1FEE0D85 -:10581000FF1D12969C9180818927C822E9F4298175 -:10582000F80120833A8131839B8192838C81838329 -:10583000232792278927848388E20FC0F80181817A -:10584000811142C062E070E0C8010E947334882375 -:1058500009F420CF10924C2C80E090E02596CDBF2B -:10586000DEBFDF91CF911F910F91FF90EF90DF90FE -:10587000CF900895F801F18062E070E0C8010E94C5 -:105880007334882309F406CFFFE0FF15E8F084E0C5 -:10589000F89EB001112440E150E0C8010E94AE0E14 -:1058A00060E170E0C801F4D780E9D7CFF801F1805A -:1058B00066E070E0C8010E947334882309F4EACEE0 -:1058C0008EEF8F0D8E3018F0F8011082E6CE8091A9 -:1058D000642E8111DACEF4E0FF9EB001112444E081 -:1058E00050E0C80102960E94FC0ECFCEF801F18074 -:1058F00062E070E0C801F7D7882309F4CBCE8EEFC1 -:105900008F0D8E3008F7F0924B2C85E0BCCECF93F4 -:10591000DF93EC0143E050E060E070E00E94AE0EE7 -:1059200044E050E064E070E0CE010396DF91CF9157 -:105930000C94AE0E0F931F93CF93DF931F921F9281 -:10594000CDB7DEB78C01FC0190818181892798E871 -:105950008927928189278A839481838189279581E8 -:10596000892796818927898343E050E060E070E0D1 -:10597000C8010E94FC0E41E050E063E070E0CE01FF -:1059800002960E94FC0E44E050E064E070E0C80122 -:1059900003960E94FC0E41E050E068E070E0CE010A -:1059A00001960E94FC0E0F900F90DF91CF911F91F6 -:1059B0000F91089581E08093702C84E090E08093B3 -:1059C0004F2C9093502C88E080934E2C10924D2CAD -:1059D000089581E08093702C84E490E080934F2CB4 -:1059E0009093502C88E080934E2C10924D2C08956B -:1059F00081E08093702C82E090E080934F2C909314 -:105A0000502C88E180934E2C10924D2C089581E00B -:105A10008093702C089508958F929F92AF92BF92B9 -:105A2000CF92DF92EF92FF920F931F93CF93DF936A -:105A3000CDB7DEB76397CDBFDEBF8C015B01809130 -:105A4000702C6730710501F5F8019081882311F001 -:105A5000963211F09235C1F421E0811120E02093BB -:105A60004D2C40914F2C3091502C211102C0963278 -:105A700011F0923539F4F801408331838FEF809330 -:105A8000512C38C0A12CB12C853009F49CC050F4A5 -:105A90008230A9F1C8F0833009F469C0843009F478 -:105AA00082C0C2C5883009F425C138F4863009F4B3 -:105AB0009AC0873009F4D3C0B7C5893009F44FC301 -:105AC0008D3008F471C3B0C591E08927982F91708B -:105AD00090934D2C30914F2C2091502CF8019081B7 -:105AE000811102C0963219F0923509F019C4F801FB -:105AF0003083218384E08093702C80E196C5F80187 -:105B00008081982F9D7F913419F48AE0808367C348 -:105B10008033C1F462E070E0C801E5D6882309F45F -:105B20009CC0F8016181F0E16F9FB001112440E158 -:105B300050E0C8010E94AE0E60E170E0C801A8D636 -:105B400080E973C5803A79F462E070E0C801CBD691 -:105B5000882309F482C0F80181818093672C83E057 -:105B60008093702CD2CF803509F05EC552C060E1C1 -:105B700070E0C801B8D6882389F08091642E811125 -:105B80000BC06091672CF0E16F9FB001112440E1E0 -:105B900050E0C8010E94FC0E8AE001C081E0F801DB -:105BA000808382E01AC390914D2C30914F2C20912C -:105BB000502CF8018081911102C0863211F182359A -:105BC00009F0B6C31EC090914D2C30914F2C2091FE -:105BD000502CF8018081911102C0863291F08235FB -:105BE00009F053C40EC090914D2C30914F2C209150 -:105BF000502CF8018081911102C0863211F082355B -:105C000031F4F8013083218381E0892786C3803510 -:105C1000C9F4F8018181882319F0F8011082DFC2EC -:105C200062E070E0C8015FD68823B9F0E091652E8C -:105C3000F091662E40E060E070E081E919951092E5 -:105C4000702CF2C490EA980F923008F0C1C462E060 -:105C500070E0C80148D68111EAC481E054C2C8018D -:105C60000E94463A64E07801F4E0EF0EF11CC701AF -:105C70000E945D3DE091652EF091662E44E0B701F3 -:105C800080EA1995F80194818091682C981329C0B5 -:105C900095818091692C981324C0968180916A2CFB -:105CA00098131FC0978180916B2C98131AC0809114 -:105CB0006C2C808380916D2C818380916E2C8283EB -:105CC00080916F2C838364E0C8010E944F3FE09174 -:105CD000652EF091662E44E0B80181EA199588E0BE -:105CE00009C2E091652EF091662E44E068E67CE200 -:105CF00080EC32C2F8018081803551F481818111BC -:105D000007C08281873521F483818D3C09F40AC262 -:105D100064E0C8010E945D3DF8018081803309F094 -:105D2000C2C062E070E0C801DED5882309F4ACC0CF -:105D3000F801618167FD04C0862F8370833029F0EC -:105D4000862F8F708F3009F084C06093672C80910C -:105D5000522C9091532C3091542C282F2295209521 -:105D6000422F4927407F09F043C023272F7009F0B5 -:105D70003FC0929590959327907FD1F5262F67FD90 -:105D800002C0237003C02F7009F023E0982F909574 -:105D9000432F42954F702223C1F0892F90E0022EAD -:105DA00002C0959587950A94E2F7982FE32FF0E0CB -:105DB000022E02C0F595E7950A94E2F73E2F50E0D7 -:105DC00002C0559547952A95E2F740FBCC24C0F8D0 -:105DD000D12CCC0CDD1CCC0CDD1C30FBEE24E0F80F -:105DE000F12CEE0CFF1CEC28892F81708E2901C04C -:105DF00087E02091662C30E0280F311D280F311DDF -:105E0000F901E05BFF4D8081F8019801205F3F4F71 -:105E10001192E217F307E1F79091552CF801918761 -:105E200082FF09C09091522C96839091532C9783B6 -:105E30009091542C908784FF15C06360F0E16F9FB0 -:105E4000B0011124665F7F4F46E050E0C8010A961A -:105E500007C080E1689FB001112440E150E0C80113 -:105E60000E94AE0E60E170E0C80112D5E091652E8F -:105E7000F091662E42E1B80180E8199562E1C8010F -:105E80000E944F3F80E939C10E94683C91E0892718 -:105E9000F8018083E091652EF091662E44E0B80110 -:105EA00081EC19959CC1803A61F462E070E0C80110 -:105EB0001AD58823D9F1F80181818093672C89E074 -:105EC0000DC0803C89F462E070E0C8010CD58823E5 -:105ED00069F1F80181818093672C8BE08093702CAD -:105EE0000E94683C9AE00EC1813C91F462E070E04F -:105EF000C801F9D48823D1F0F80181818093672CFF -:105F00004AE0F42EF092702C0E94683C8F25FBC072 -:105F1000823C99F462E070E0C801E5D4882331F056 -:105F2000F80181818093672C8CE0D8CFE091652EB9 -:105F3000F091662E44E0B80121C0803B11F562E08B -:105F400070E0C801D0D4E091652EF091662E44E057 -:105F5000B801882399F086E819958091642E811103 -:105F6000BFCFF8016181F0E16F9FB001112440E1E2 -:105F700050E086E59CE20E94FC0EB2CF81EC1995C0 -:105F8000BEC090EA980F923008F0BFC062E070E0A7 -:105F9000C801A9D4882309F4B2C0F80180818036F1 -:105FA00021F03AE3C32ED12C03C020E3C22ED12C22 -:105FB000F801818187FF0CC0807FF0E18F9F700125 -:105FC000112480ECC80ED11C96EFA92EB12C08C06C -:105FD0008C7F90E1899F7001112486E3A82EB12C5B -:105FE000E091652EF091662E42E0B80180E91995A6 -:105FF000F801808181708093662CC701B4E096958A -:106000008795BA95E1F78093672C9091512C98175A -:1060100069F0B7016A0D7B1D44E050E082E59CE227 -:106020000E94AE0E8091672C8093512C68E0CE01C7 -:1060300001960E94EC0D8091632E44E050E0873081 -:1060400019F463E070E002C060E070E0CE010F96EA -:106050000E94AE0EB7016C0D7D1D46E050E0CE01F2 -:1060600009960E94AE0E89818093682C8A81809364 -:10607000692C8B8180936A2C8C8180936B2C60E4DB -:1060800088E69CE20E9495418091682C80936C2C5C -:106090008091692C80936D2C80916A2C80936E2C5A -:1060A00080916B2C80936F2C60E28CE69CE20E94C6 -:1060B000954120E0AE014F5F5F4FBE01615F7F4FB2 -:1060C000CE010996F7D68981F80180838A81818380 -:1060D0008B8182838C818383E058FF4F8D81808305 -:1060E00031968E81808331968F8180833196888529 -:1060F000808387E08093702C80E290E174C30E94DB -:10610000683C91E08927F80101CD8035B9F4F801A8 -:106110008181811182CD62E070E0C801E4D38823DF -:1061200009F49BCD1092702CE091652EF091662EB3 -:1061300040E060E070E081E9199576C2A501495F11 -:106140005F4FA3E056954795AA95E1F7E091652E3C -:10615000F091662EB80182E9199581E0DEC062E116 -:10616000C8010E945D3D60E170E0C801BCD3E091D0 -:10617000652EF091662E882329F142E1B80181E86D -:1061800019958091642E81110BC06091672CF0E10C -:106190006F9FB001112440E150E0C8010E94FC0E45 -:1061A0000E94683C9AE015C066E0C8010E945D3D0F -:1061B00064E070E0C80197D3811113C0E091652EAF -:1061C000F091662E44E0B80181EC19950E94683C7C -:1061D00091E08927F801808388E08093702C84E027 -:1061E00024C26091672CF0E16F9FB001112440E15F -:1061F00050E086E59CE20E94AE0E9091562C809174 -:106200005A2C80959813EBC280915E2C9813E7C2AC -:106210002091572C80915B2C80952813E0C28091AF -:106220005F2C2813DCC2C090582C80915C2C809588 -:10623000C812D5C28091602CC812D1C28091592C4D -:1062400030915D2C30958313CAC23091612C831339 -:10625000C6C24091622C3091632C30954313BFC26B -:106260003091642C4313BBC23091652C309543139D -:10627000B6C2F801308141818280912CA12CB12CD1 -:10628000540199248824942A832A3381B32AD12C57 -:10629000E12CF12C7601DD24CC24D22AC92AF82A5B -:1062A0008091702C8B3009F07FC2E091652EF091C7 -:1062B000662E46E0B80185E81995C818D908EA089D -:1062C000FB08C092562C33272F2D1E2D0D2D009329 -:1062D000572CA701662777274093582C8F2D992795 -:1062E000AA27BB278093592CEC2DE095E0935A2CDC -:1062F000E02FE095E0935B2CE42FE095E0935C2C9D -:10630000E82FE095E0935D2CC0925E2C00935F2C0B -:106310004093602C8093612C88E08093702C84C122 -:10632000903409F081C182E08093702C8AE0EBCE3A -:10633000833909F084CC8091632E873009F0A0C0A6 -:1063400043E050E060E070E0CE0102960E94AE0EA5 -:1063500088E88983F8019181903219F0903761F0D3 -:1063600024C0F80180833A8131832B8122839C8170 -:1063700093832327822728C1F8018281883809F076 -:1063800053C193818A8198134FC194818B81981353 -:106390004BC195818C81981347C184E0808361E073 -:1063A00070E0C80175D285E09EC0E92EE2942FE02E -:1063B000E2222EEF2E0D9F70F92E88E090E08F19CB -:1063C00091094FEF50E06A0102C0D594C7948A95B5 -:1063D000E2F7253021F0243059F5FF20E9F044E0C0 -:1063E00050E0B8016E5F7F4FCE0101962B8B0E946B -:1063F000EF552B89892B61F49A818B81892798E845 -:1064000089279C818927F801968189278C2181F130 -:10641000243071F4F11008C144E050E0B8016E5F1F -:106420007F4FCE0101960E94EF55892B09F1FCC0E8 -:10643000243008F0F9C0E22EF12CA701B8016E5FFC -:106440007F4FCE0101960E94EF55892B09F0ECC0D9 -:10645000D801AE0DBF1DE1E0F0E0EC0FFD1FEE0D29 -:10646000FF1D12969C9180818927C82209F0DCC00B -:1064700098E8F80190833A8131832B812283A0C070 -:1064800044E050E060E070E007C0853909F0D7CB08 -:1064900044E050E063E070E0CE0101960E94AE0E51 -:1064A00090914E2CF8018181803209F482C08037AE -:1064B000F1F4F801228189812813B6C023818A81F1 -:1064C0002813B2C024818B812813AEC025818C8112 -:1064D0002813AAC0908361E070E0C801D9D18FEF82 -:1064E0008093512C86E08093702C88E19EC0E82E2A -:1064F000E2949FE0E9222EEF2E0D8F70F82E88E0B7 -:1065000090E08F1991094FEF50E06A0102C0D594D5 -:10651000C7948A95E2F7253021F0243059F5FF2001 -:10652000E9F044E050E0B8016E5F7F4FCE01019684 -:106530002B8B0E94EF552B89892B61F49A818981DD -:1065400089279B8189279C818927F8019681892742 -:106550008C2179F1243071F4F11066C044E050E0F0 -:10656000B8016E5F7F4FCE0101960E94EF55892BD7 -:1065700001F15AC0243008F057C0E22EF12CA701D7 -:10658000B8016E5F7F4FCE0101960E94EF55892BB7 -:1065900009F04AC0D801AE0DBF1DE1E0F0E0EC0FFC -:1065A000FD1FEE0DFF1D12969C9180818927C82248 -:1065B000D9F52981F80120833A8131839B81928327 -:1065C0008C818383232792278927848388E22DC0A7 -:1065D000823C09F0CBC0F8019181903E09F0C8C01F -:1065E0009281943B09F0C4C046E050E06AEA74E04E -:1065F000CE0101960E94AE0E89818B3409F02DCB1D -:106600008A81893709F029CB8B818B3109F025CB21 -:106610008C818A3E09F021CB8D818B3709F01DCB0F -:106620008E818C3C09F019CB80E090E0DCC0F80151 -:106630008081803621F08AE3C82ED12C03C0B0E3DC -:10664000CB2ED12CF801818187FF0CC0807FF0E137 -:106650008F9F7001112480ECC80ED11CA6EFAA2ECA -:10666000B12C08C08C7F90E1899F70011124F6E362 -:10667000AF2EB12CE091652EF091662E42E0B8016C -:1066800080E91995F801808181708093662CC7019B -:10669000E4E096958795EA95E1F78093672CB7013A -:1066A0006A0D7B1D44E050E082E59CE20E94AE0E44 -:1066B0008091672C8093512C68E0CE0101960E9456 -:1066C000EC0D8091632E44E050E0873019F463E0D4 -:1066D00070E002C060E070E0CE010F960E94AE0E46 -:1066E000B7016C0D7D1D46E050E0CE0109960E9479 -:1066F000AE0E89818093682C8A818093692C8B816E -:1067000080936A2C8C8180936B2C60E488E69CE2F9 -:106710000E9495418091682C80936C2C8091692C0B -:1067200080936D2C80916A2C80936E2C80916B2CC1 -:1067300080936F2C60E28CE69CE20E94954187E09A -:106740008093702C8981F80180838A8181838B8179 -:1067500082838C818383AE014F5F5F4FBE01615F97 -:106760007F4FCE010996F0D080E25FCF803339F0C1 -:10677000982F9F7E903A19F0805C833078F481E006 -:106780008093702C84E0F8018083E091652EF09175 -:10679000662E40E060E070E082EC83CBE091652EF5 -:1067A000F091662E40E0D6CC8A3069F4E091652EF7 -:1067B000F091662E46E0B80184E81995C80CD91C02 -:1067C000EA1CFB1C7ECD8C3009F07BCDE091652E60 -:1067D000F091662E46E0B80187E8199572CD0E94C7 -:1067E000683C96E0F6CC6396CDBFDEBFDF91CF91DB -:1067F0001F910F91FF90EF90DF90CF90BF90AF90DF -:106800009F908F900895CF93DF932091632E273030 -:1068100071F4EC0143E050E060E070E00E94AE0EE5 -:1068200044E050E063E070E0CE01039604C044E031 -:1068300050E060E070E0DF91CF910C94AE0ECF930A -:10684000DF931F92CDB7DEB72091632E273029F456 -:1068500047E050E060E070E015C0FC01318120812C -:1068600023273281232733812327298344E050E0E3 -:1068700060E070E00E94FC0E41E050E064E070E0F7 -:10688000CE0101960E94FC0E0F90DF91CF910895EA -:1068900020E42093D00026EC2093D5002093D40050 -:1068A00021E02093D000DC01680F791FA617B707FD -:1068B00041F0ED91F0E0EC59FA4FE491E093D30010 -:1068C000F5CFE091D500F0E0EC59FA4FE491EC936C -:1068D000E091D400F0E0EC59FA4FE4911196EC937A -:1068E0001092D000089520E42093D00026EC20934D -:1068F000D5002093D40021E02093D000DC01680F64 -:10690000791FA617B70741F0ED91F0E0EC59FA4F67 -:10691000E491E093D300F5CFE091D500F0E0EC599D -:10692000FA4FE4918C918E130AC0E091D400F0E00C -:10693000EC59FA4FE49181E011969C919E1380E00E -:106940001092D000817008958F929F92AF92BF9263 -:10695000CF92DF92EF92FF920F931F93CF93DF932B -:10696000DC018C9110E0E0E0869517958695E7951F -:10697000869517958695E795869517958695E7955B -:10698000869517958695E79511968C911197869522 -:1069900017958695E795869517958695E79586953B -:1069A00017958695E795869517958695E79512969E -:1069B0008C911297F0E030E08695F79586953795A3 -:1069C0008695F795869537958695F79586953795AB -:1069D0008695F7958695379513968C91139786959E -:1069E000F795869537958695F7958695379586958B -:1069F000F795869537958695F795869537951496EC -:106A00008C91149790E020E0869597958695279530 -:106A1000869597958695279586959795869527953A -:106A2000869597958695279515968C918695979539 -:106A3000869527958695979586952795869597951A -:106A40008695279586959795869527955B01DA011A -:106A50004A0144E0840E911C6C91E50179915E013C -:106A60007627C32ED12CA60140545E4DEE2EF12C7C -:106A7000E701C054DF4D7E01EA01D880E7010881BB -:106A8000ED2CE02AC22ED12CA60140545D4DEA0126 -:106A90000881E02AF12CA70140565F4DEA010881E8 -:106AA00006958795DF2FD071FD2E012F017EF026F0 -:106AB000092F0072F0260E2F0479F026032F03779A -:106AC000F026022F0A73F0260F2D0295F0260F2DC7 -:106AD00006950695F0260F2D0727F6940F250695A7 -:106AE0009795F79517957695CF2ED12CA601405402 -:106AF0005E4DE12EF12CE701C054DF4D7E01EA012D -:106B0000D880E7010881ED2CE02AC92ED12CA601FE -:106B100040545D4DEA010881E02AF12CA70140565E -:106B20005F4DEA01088106958795D32FD071FD2E20 -:106B30000E2F017EF026022F0072F026012F04791D -:106B4000F0260F2F0377F026092F0A73F0260F2D5A -:106B50000295F0260F2D06950695F0260F2D072796 -:106B6000F6940F25069527953795E7957695C32ECC -:106B7000D12CA60140545E4DEE2EF12CE701C054FD -:106B8000DF4D7E01EA01D880E7010881ED2CE02A83 -:106B9000C22ED12CA60140545D4DEA010881E02AA5 -:106BA000F12CA70140565F4DEA01088106958795B3 -:106BB000DF2FD071FD2E012F017EF026092F0072EC -:106BC000F0260E2F0479F026032F0377F026022FEC -:106BD0000A730F25F02EF2940F25F02EF694F694FA -:106BE0000F25F02EF72606950F25D12E102F16957E -:106BF0009795F795D79476950F2F10E0A8014054FC -:106C00005E4D0D2D10E000541F4DEA01F880E801A3 -:106C100018810F2D012BE92EF12CA70140545D4D59 -:106C2000EA011881012B10E000561F4DE801188180 -:106C300016958795032F00711E2F117E0127122FA5 -:106C4000107201271D2D147901271F2F137701279B -:106C5000192F1A730127102F12950127102F16953F -:106C600016950127102F172706951027169527959B -:106C70003795E7957695032F10E0A80140545E4DB7 -:106C80000E2F10E000541F4DEA01F880E801188132 -:106C90000F2D012BE22EF12CA70140545D4DEA018E -:106CA0001881012B10E000561F4DE8011881169540 -:106CB00087950F2F00711D2D117E0127192F10723E -:106CC00001271E2F14790127132F13770127122F65 -:106CD0001A730127102F12950127102F169516955C -:106CE0000127102F172706950127102F1695979526 -:106CF000F795D79476950F2F10E0A80140545E4D7C -:106D00000D2D10E000541F4DEA01F880E8011881B4 -:106D10000F2D012BE92EF12CA70140545D4DEA0106 -:106D20001881012B10E000561F4DE80118811695BF -:106D30008795032F00711E2F117E0127122F1072CD -:106D400001271D2D147901271F2F13770127192FD4 -:106D50001A730127102F12950127102F16951695DB -:106D60000127102F17270695102716952795379579 -:106D7000E7957695032F10E0A80140545E4D0E2F45 -:106D800010E000541F4DEA01F880E80118810F2D32 -:106D9000012BE22EF12CA70140545D4DEA01188130 -:106DA000012B10E000561F4DE801188116958795BC -:106DB0000F2F00711D2D117E1027092F0072102733 -:106DC0000E2F04791027032F03771027022F0A7341 -:106DD0001027012F02951027012F069506951027E1 -:106DE000012F0727169501271D2D06959795F795D5 -:106DF0001795CF2ED12CA60140545E4DE12EF12CDB -:106E0000E701C054DF4D7E01EA01D880E701088127 -:106E1000ED2CE02AC92ED12CA60140545D4DEA018B -:106E20000881E02AF12CA70140565F4DEA01088154 -:106E300006958795D32FD071FD2E0E2F017EF0265B -:106E4000022F0072F026012F0479F0260F2F03770E -:106E5000F026092F0A730F25F02EF2940F25F02E3D -:106E6000F694F6940F2576957027069570277695FB -:106E700027953795E79568276D93A815B90509F00B -:106E8000EBCD1093712CF093722C9093732CE093B4 -:106E9000742C3093752C2093762CDF91CF911F9119 -:106EA0000F91FF90EF90DF90CF90BF90AF909F90A9 -:106EB0008F9008954F925F926F927F929F92AF92C0 -:106EC000BF92CF92DF92EF92FF920F931F93CF93D7 -:106ED000DF93DC018C9110E0B12CEB2D8695E795CA -:106EE000869517958695E795869517958695E795E6 -:106EF000869517958695E7958695179511968C91A9 -:106F00001197BE2E8695B794869517958695B7945A -:106F1000869517958695B794869517958695B79417 -:106F20008695179512969C91129730E080E0969581 -:106F300087959695379596958795969537959695D5 -:106F40008795969537959695879596953795139647 -:106F50009C911397969587959695379596958795D5 -:106F600096953795969587959695379596958795A5 -:106F7000969537951496EC91149790E000E0E6957D -:106F80000795E6959795E6950795E6959795E69585 -:106F90000795E6959795E6950795E6959795159645 -:106FA000DC90D6940795D6949795D6940795D69469 -:106FB0009795D6940795D6949795D6940795D69499 -:106FC0009795E32FF0E0E054FE4DA12FB0E0A054E0 -:106FD000BF4DF081EC91EF2BA92FB0E0A054BD4D37 -:106FE000FC91EF2BF0E0E056FF4DE0802B01BA0161 -:106FF0006C5F7F4FDA013B01AC90E201C9902E013A -:10700000CA24FD2DE694F795D82FD071FD2EEB2DD7 -:10701000E17EFE26E02FE072FE26E12FE479FE26D7 -:10702000E32FE377FE26E92FEA73EF25FE2EF29495 -:10703000EF25FE2EF694F694EF25FE2EFC24E69521 -:10704000FE26EB2D20FDFE24F69407958795E79507 -:10705000BC2CB694C82ED12CA60140545E4DEE2E09 -:10706000F12CE701C054DF4D7E01EA01D880E70131 -:10707000F880ED2CEF28C02ED12CA60140545D4D98 -:10708000EA01F880EF28F12CA70140565F4DEA0194 -:10709000D880D694F795D32FD071ED2E412F417E15 -:1070A000E426592F5072E526CE2FC479EC26D82F2E -:1070B000D377ED26402F4A73E426FE2CF294EF247A -:1070C000FE2CF694F694EF24FE2CFB24E694FE248A -:1070D00020FDFD24F694979537951795B694C32E09 -:1070E000D12CE601C054DE4DE12EF12CA701405415 -:1070F0005F4DD880EA01F880ED2CEF28C92ED12C05 -:10710000A60140545D4DEA01F880EF28F12CA7015B -:1071100040565F4DEA01D880D694F795D82FD071AC -:10712000ED2E4E2F417EE426502F5072E526C12FC2 -:10713000C479EC26D32FD377ED26492F4A73E42662 -:10714000FE2CF294EF24FE2CF694F694EF24FE2C01 -:10715000FB24E694FE2420FDFD24F69407958795F4 -:10716000E795B694C82ED12CE601C054DE4DEE2E24 -:10717000F12CA70140545F4DD880EA01F880ED2C36 -:10718000EF28C02ED12CA60140545D4DEA01F880B5 -:10719000EF28F12CA70140565F4DEA01D880D69424 -:1071A000F795D32FD071ED2E412F417EE426592F34 -:1071B0005072E526CE2FC479EC26D82FD377ED2652 -:1071C000402F4A73E426FE2CF294EF24FE2CF69412 -:1071D000F694EF24FE2CFB24E694FE2420FDFD24EF -:1071E000F694979537951795B694C32ED12CE60152 -:1071F000C054DE4DE12EF12CA70140545F4DD880E4 -:10720000EA01F880ED2CEF28C92ED12CA6014054BC -:107210005D4DEA01F880EF28F12CA70140565F4D43 -:10722000EA01D880D694F795D82FD071ED2E4E2F45 -:10723000417EE426502F5072E526C12FC479EC26FA -:10724000D32FD377ED26492F4A73E426FE2CF294F0 -:10725000EF24FE2CF694F694EF24FE2CFB24E69407 -:10726000FE2420FDFD24F69407958795E795B694B6 -:10727000C82ED12CE601C054DE4DEE2EF12CA70114 -:1072800040545F4DD880EA01F880ED2CEF28C02EE5 -:10729000D12CA60140545D4DEA01F880EF28F12C75 -:1072A000A70140565F4DEA01D880D694F795D32FB9 -:1072B000D071ED2E412F417EE426592F5072E526E4 -:1072C000CE2FC479EC26D82FD377ED26402F4A73E2 -:1072D000E426FE2CF294EF24FE2CF694F694EF2490 -:1072E000FE2CFB24E694FE2420FDFD24F6949795C5 -:1072F000379517959B2C9694C32ED12CE601C0543C -:10730000DE4DE12EF12CA70140545F4DD880EA01FB -:10731000F880ED2CEF28C92ED12CA60140545D4DEC -:10732000EA01F880EF28F12CA70140565F4DEA01F1 -:10733000D880D694F795D82FD0714E2F417EF42E59 -:10734000FD26502F5072F526C12FC479FC26D32F6D -:10735000D377FD26492F4A73F426EF2CE294FE24BE -:10736000EF2CE694E694FE24EF2CE924F694FE2418 -:10737000BE2EEF2D20FDED25E69507958795B79458 -:10738000C82ED12CE601C054DE4DEB2CF12CA70108 -:1073900040545F4DD880EA01E881ED2CEE2AC02EE2 -:1073A000D12CA60140545D4DEA01E881EE2AF12C72 -:1073B000A70140565F4DEA01F880DF2EF694D7947E -:1073C000F32FF071E12FE17EEF27F92FF072EF2715 -:1073D000FB2DF479EF27F82FF377EF27F02FFA73CF -:1073E000EF27FE2FF295EF27FE2FF695F695EF2764 -:1073F00096949E26E6959E2620FD9F24969497952A -:1074000037951795E32FF0E0AF0140545E4DE12F23 -:10741000F0E0E054FF4DEA01F880E081EF29E92E29 -:10742000F12CA70140545D4DEA01F881EF2BF0E00B -:10743000E056FF4DE080EA2DF0E0EC59FB4FE4917F -:10744000EE25E301E9933E01AD24AD92A617B707FF -:1074500009F0D2CDB092712C8093722C0093732CD2 -:107460001093742C3093752C9093762CDF91CF91E0 -:107470001F910F91FF90EF90DF90CF90BF90AF9052 -:107480009F907F906F905F904F900895AF92BF92C2 -:10749000CF92DF92EF92FF920F931F93CF93DF93E0 -:1074A0006091712C5091722C2091732C4091742C0E -:1074B0003091752CD091762CFC015C0104E0A00E7B -:1074C000B11C8191C52FC071962F917EC927922F33 -:1074D0009072C927942F9479C927932F9377C9273E -:1074E0009D2F9A73C9277C2F7295C7277C2F76957D -:1074F0007695C727A32FB0E08D0100541E4D68017B -:10750000A42FB0E08D0100541F4D7801D6010C91DD -:10751000D7019C91092BED2EF12CD701A054BD4D24 -:107520009C91092B10E000561F4DD8017C917827C3 -:107530007C27C6957C2786957695279557956795E0 -:10754000C32FC071942F917EC9279D2F9072C92798 -:10755000962F9479C927952F9377C927922F9A73DD -:10756000C9277C2F7295C7277C2F76957695C727DC -:10757000052F10E0D801A054BE4D6D01062F10E07C -:10758000D801A054BF4D7D01D6010C91D7019C912B -:10759000092BE22EF12CD701A054BD4D9C91092B53 -:1075A00010E000561F4DD8017C9178277C27C695A6 -:1075B0007C2786959D2F7695979537954795C52F6E -:1075C000C071762F717EC727722F7072C727742FF4 -:1075D0007479C727732F7377C727792F7A73C727D3 -:1075E0007C2F7295C7277C2F76957695C727032F1A -:1075F00010E0D801A054BE4D6D01042F10E0D80159 -:10760000A054BF4D7D01D6010C91D7017C91072B71 -:10761000E92EF12CD701A054BD4D7C91072B10E031 -:1076200000561F4DD8017C9178277C27C6957C2772 -:1076300086957695279557956795C32FC071742FBA -:10764000717EC727792F7072C727762F7479C72765 -:10765000752F7377C727722F7A73C7277C2F729580 -:10766000C7277C2F76957695C727052F10E0D80180 -:10767000A054BE4D6D01062F10E0D801A054BF4D9F -:107680007D01D6010C91D7017C91072BE22EF12CC4 -:10769000D701A054BD4D7C91072B10E000561F4D23 -:1076A000D8017C9178277C27C6957C27869576958E -:1076B000979537954795C52FC071762F717EC7274F -:1076C000722F7072C727742F7479C727732F73773F -:1076D000C727792F7A73C7277C2F7295C7277C2FEE -:1076E00076957695C727032F10E0D801A054BE4D9C -:1076F0006D01042F10E0D801A054BF4D7D01D601CB -:107700000C91D7017C91072BE92EF12CD701A054C5 -:10771000BD4D7C91072B10E000561F4DD8017C9188 -:1077200078277C27C6957C2786957695279557954B -:107730006795C32FC071742F717EC727792F707220 -:10774000C727762F7479C727752F7377C727722FAE -:107750007A73C7277C2F7295C7277C2F76957695ED -:10776000C727052F10E0D801A054BE4D6D01062F8C -:1077700010E0D801A054BF4D7D01D6010C91D70176 -:107780007C91072BE22EF12CD701A054BD4D7C91AA -:10779000072B10E000561F4DD8017C9178277C27DD -:1077A000C6957C2786957695979537954795C52FED -:1077B000C071762F717EC727722F7072C727742F02 -:1077C0007479C727732F7377C727792F7A73C727E1 -:1077D0007C2F7295C7277C2F76957695C727032F28 -:1077E00010E0D801A054BE4D6D01042F10E0D80167 -:1077F000A054BF4D7D01D6010C91D7017C91072B80 -:10780000E92EF12CD701A054BD4D7C91072B10E03F -:1078100000561F4DD8017C9178277C27C6957C2780 -:107820007695279557956795C32FC071742F717EF4 -:107830007C27C92FC0727C27C62FC4797C27C52F0F -:10784000C3777C27C22FCA737C27C72FC2957C279A -:10785000C72FC695C6957C278695C52FD0E0C05406 -:10786000DE4D062F10E000541F4DD881D801CC9179 -:10787000CD2B022F10E000541D4DD801DC91CD2BF3 -:10788000D0E0C056DF4DC8818C27872776958727A3 -:10789000D92F8695D79537954795EA15FB0509F0B9 -:1078A00010CE6093712C5093722C2093732C4093C4 -:1078B000742C3093752CD093762CDF91CF911F913F -:1078C0000F91FF90EF90DF90CF90BF90AF90089511 -:1078D000CF93DF93E1E7FCE2A08171816281338184 -:1078E00024819581472F40718A2F817E8427462FDE -:1078F00040728427432F44798427422F437784277B -:10790000492F4A738427482F42958427482F46954C -:1079100046958427482F46958427869567957795C1 -:10792000A795C22FD0E0C054DE4D432F50E0405405 -:107930005F4DB881EA018881B82B492F50E040544F -:107940005D4DEA018881CB2FC82BD0E0C05ADF4DB6 -:1079500088818695522F5071432F417E4527592F9C -:10796000507245275A2F54794527572F537745276B -:10797000562F5A734527542F52954527542F569505 -:1079800056954527542F5695452746959795279503 -:107990003795C72FD0E0C054DE4D4A2F50E04054F9 -:1079A0005F4DB881EA014881B42B462F50E0405426 -:1079B0005D4DEA014881CB2FC42BD0E0C05ADF4D8A -:1079C0004881842B8695572F50714A2F417E452739 -:1079D000562F50724527532F54794527522F5377EE -:1079E0004527592F5A734527542F52954527542F11 -:1079F000569556954527542F569545274695679594 -:107A00007795A795C22FD0E0C054DE4D432F50E0AC -:107A100040545F4DB881EA014881B42B492F50E0B2 -:107A200040545D4DEA014881CB2FC42BD0E0C05AB1 -:107A3000DF4D4881842B8695C72FD0E0C054DE4DA2 -:107A40004A2F50E040545F4DB881EA014881B42B81 -:107A5000462F50E040545D4DEA014881CB2FC42BA6 -:107A6000D0E0C05ADF4D4881842B522F5071432FF4 -:107A7000417E4527592F507245275A2F5479452763 -:107A8000572F53774527562F5A734527542F529512 -:107A90004527542F569556954527542F56954527DB -:107AA0004695979527953795A08371836283338395 -:107AB00024839583DF91CF9108950F931F93CF93E4 -:107AC000DF93A091712C7091722C2091732C5091A6 -:107AD000742C4091752C3091762CFC01615008F487 -:107AE000CDC1972F90718A2F817E8927922F907216 -:107AF0008927952F94798927942F93778927932F16 -:107B00009A738927982F92958927982F96959695FD -:107B10008927982F96958927869527957795A795F4 -:107B2000C42FD0E0C054DE4D852F90E080549F4D8F -:107B3000B881EC018881B82B832F90E080549D4D53 -:107B4000EC018881CB2FC82BD0E0C058DF4DB88125 -:107B5000B695942F9071852F817E8927932F9072EF -:107B600089279A2F94798927972F93778927922F9E -:107B70009A738927982F92958927982F969596958D -:107B80008927982F969589278695379547955795F4 -:107B9000C72FD0E0C054DE4D8A2F90E080549F4D17 -:107BA0001881EC018881182B822F90E080549D4D24 -:107BB000EC018881C12FC82BD0E0C058DF4D8881EF -:107BC000B82BB695972F90718A2F817E8927922F97 -:107BD00090728927952F94798927942F93778927F5 -:107BE000932F9A738927982F92958927982F969586 -:107BF00096958927982F9695892786952795779525 -:107C0000A795C42FD0E0C054DE4D852F90E080545E -:107C10009F4D1881EC018881182B832F90E08054B0 -:107C20009D4DEC018881C12FC82BD0E0C058DF4D9D -:107C30008881B82BB695942F9071852F817E8927E6 -:107C4000932F907289279A2F94798927972F93776A -:107C50008927922F9A738927982F92958927982F91 -:107C6000969596958927982F969589278695379585 -:107C700047955795C72FD0E0C054DE4D8A2F90E02E -:107C800080549F4D1881EC018881182B822F90E041 -:107C900080549D4DEC018881C12FC82BD0E0C05885 -:107CA000DF4D8881B82BB695972F90718A2F817EF2 -:107CB0008927922F90728927952F94798927942F5D -:107CC00093778927932F9A738927982F92958927DD -:107CD000982F969596958927982F9695892786951A -:107CE00027957795A795C42FD0E0C054DE4D852FFA -:107CF00090E080549F4D1881EC018881182B832FD0 -:107D000090E080549D4DEC018881C12FC82BD0E0BC -:107D1000C058DF4D8881B82BB695942F9071852F70 -:107D2000817E9827832F807298278A2F84799827BD -:107D3000872F83779827822F8A739827892F829598 -:107D40009827892F869586959827892F8695982735 -:107D5000832F9695879547955795C72FD0E0C054A8 -:107D6000DE4D0A2F10E000541F4D3881E801988144 -:107D7000392B022F10E000541D4DE8019881C32FCC -:107D8000C92BD0E0C058DF4D3881B32BB695372FC3 -:107D900030719A2F917E9327322F30729327352F8F -:107DA00034799327342F33779327382F3A739327D7 -:107DB000392F32959327392F369536959327392FBA -:107DC00036959327969527957795A795C42FD0E05C -:107DD000C054DE4D052F10E000541F4D3881E801DE -:107DE0009881392B082F10E000541D4DE80198812F -:107DF000C32FC92BD0E0C058DF4D98813B2F392BC2 -:107E00003695C72FD0E0C054DE4D0A2F10E0005445 -:107E10001F4DB881E8019881B92B022F10E0005462 -:107E20001D4DE8019881CB2FC92BD0E0C058DF4D04 -:107E3000B881B32B342F3071952F917E9327382F33 -:107E4000307293273A2F34799327372F337793273C -:107E5000322F3A739327392F32959327392F36953E -:107E600036959327392F36959327382F9695379542 -:107E70004795579580818B27819330CEA093712CA5 -:107E80007093722C2093732C5093742C4093752C08 -:107E90003093762CDF91CF911F910F910895CF925F -:107EA000DF92EF92FF921F93CF93DF931091712C8B -:107EB000D091722CC091732C7091742C4091752CC0 -:107EC0002091762CE42FF0E0E054FE4DA72FB0E097 -:107ED000A054BF4DE0813C91E32BA22FB0E0A05411 -:107EE000BD4D3C91E32BF0E0E056FF4D3081DC01CD -:107EF00080E0615008F405C2582F369557959D2FA4 -:107F00009071812F817E89279C2F90728927972FCE -:107F100094798927942F93778927322F3A7383276F -:107F2000982F92958927982F969596958927982F1F -:107F3000969589279C2F86959795D7951795569551 -:107F4000342F3071872F817E8327322F3072832721 -:107F5000312F347983273D2F33778327392F3A7395 -:107F60008327382F32958327382F369536958327E8 -:107F7000382F369583278695279547957795CD2E6B -:107F8000D12CF601E054FE4D6F01E12EF12CF701EA -:107F9000E054FF4D7F01F6013081F7018081832B92 -:107FA000E92EF12CF701E054FD4D3081E82FE32B51 -:107FB000F0E0E058FF4D8081582B56953D2F3071F1 -:107FC000812F817E8327392F30728327372F347991 -:107FD0008327342F33778327322F3A738327382F21 -:107FE00032958327382F369536958327382F369547 -:107FF000832786959795D7951795C42ED12CF60192 -:10800000E054FE4D6F01E72EF12CF701E054FF4DD7 -:108010007F01F6013081F7018081832BE22EF12C64 -:10802000F701E054FD4D3081E82FE32BF0E0E058FC -:10803000FF4DC0815C2B5695342F3071872F817E88 -:108040008327322F30728327312F347983273D2FB6 -:1080500033778327392F3A738327382F3295832735 -:10806000382F369536958327382F36958327869572 -:10807000279547957795CD2ED12CF601E054FE4DEE -:108080006F01E12EF12CF701E054FF4D7F01F60165 -:108090003081F7018081832BE92EF12CF701E05428 -:1080A000FD4D3081E82FE32BF0E0E058FF4DC0811B -:1080B000C52BC6953D2F3071812F817E8327392FA7 -:1080C00030728327372F34798327342F33778327F0 -:1080D000322F3A738327382F32958327382F3695DE -:1080E00036958327382F3695832786959795D7958C -:1080F0001795C42ED12CF601E054FE4D6F01E72EEA -:10810000F12CF701E054FF4D7F01F6013081F701BA -:108110008081382BE22EF12CF701E054FD4D808157 -:10812000E32FE82BF0E0E058FF4D8081C82BC69587 -:10813000342F3071872F817E8327322F307283272F -:10814000312F347983273D2F33778327392F3A73A3 -:108150008327382F32958327382F369536958327F6 -:10816000382F36958327542F8695279557957795E1 -:10817000CD2ED12CF601E054FE4D6F01E12EF12CF5 -:10818000F701E054FF4D7F01F6013081F701808156 -:10819000832BE92EF12CF701E054FD4D3081E82FBF -:1081A000E32BF0E0E058FF4D80818C2B482F469563 -:1081B0003D2F3071812F817E3827892F807238279B -:1081C000872F84793827852F83773827822F8A73E2 -:1081D0003827832F82953827832F869586953827D1 -:1081E000832F86953827C92F3695C795D79517952C -:1081F000E52FF0E0E054FE4D872F90E080549F4D36 -:108200003081FC018081382B822F90E080549D4D7D -:10821000FC019081E32FE92BF0E0E058FF4D9081C5 -:10822000842F892B382F3695ED2FF0E0CF01805425 -:108230009E4D6C01E12FF0E0CF0180549F4DF6017F -:108240004081FC019081492BEC2EF12CC701805418 -:108250009D4DFC019081E42FE92BF0E0E058FF4DAB -:108260009081832F892B352F3071972F917E39275D -:10827000922F90723927912F947939279D2F9377D8 -:1082800039274C2F4A733427932F92953927932FF0 -:10829000969596953927932F96953927452F36959C -:1082A000279547957795C42ED12CF601E054FE4DC5 -:1082B0006F01E72EF12CF701E054FF4D7F01F6012D -:1082C0003081F7019081392BE22EF12CF701E05437 -:1082D000FD4D9081E32FE92BF0E0E056FF4D30811A -:1082E0009C91E92FF0E0EC59FB4FE4917D01F0E81F -:1082F000EF0EF11C5E2F5327F701508398279D93B3 -:10830000F8CD1093712CD093722CC093732C709372 -:10831000742C4093752C2093762CDF91CF911F9174 -:10832000FF90EF90DF90CF9008950F931F93FC0183 -:10833000862F90812181428150E060E070E0BA0197 -:1083400055274427522B492B9381792B8B012227C8 -:108350003327803208F471C0D80123E0B695A79581 -:108360002A95E1F70A271B27980136952795369518 -:108370002795BBE07695679557954795BA95D1F7C0 -:108380000227132720E030E095E1000F111F221F84 -:10839000331F9A95D1F7402B512B622B732B8B01F6 -:1083A00022273327D80133E0B695A7953A95E1F710 -:1083B0000A271B2798013695279536952795BBE008 -:1083C0007695679557954795BA95D1F70227132764 -:1083D00020E030E095E1000F111F221F331F9A9516 -:1083E000D1F7402B512B622B732B8B012227332784 -:1083F000D80133E0B695A7953A95E1F70A271B27F0 -:1084000098013695279536952795BAE07695679524 -:1084100057954795BA95D1F70227132720E030E00A -:1084200096E1000F111F221F331F9A95D1F7402BA1 -:10843000512B622B732B805289CF4083518302834F -:1084400073831F910F910895AF92BF92CF92DF92E5 -:10845000EF92FF920F931F93CF93DF9367307105D5 -:1084600009F451C09B0127703327232B09F04EC01C -:10847000EB016C015B0183E0B694A7948A95E1F768 -:108480007B0196E0F694E7949A95E1F7EA0CFB1CE1 -:10849000EC0CFD1C8501015011090C0D1D1DA701DF -:1084A000401B510B60E070E0C80101960E94165617 -:1084B0000C151D0520F1D801EC91F0E0EC59FB4FB3 -:1084C00044919701D7010A171B0768F48C91982FE4 -:1084D000990FF90182919F01881F8827881F892B96 -:1084E0008C931197F0CF11968C9111978E7FE42F7A -:1084F000E170E82B1196EC9301501109D9CFC50119 -:108500008C0F9D1F04C087E090E001C0CB01DF917C -:10851000CF911F910F91FF90EF90DF90CF90BF9080 -:10852000AF900895EF92FF920F931F93CF93DF9335 -:10853000EC01CB0167307105D1F169E070E00E9478 -:108540004655DE0120E030E088E090E0261737074E -:1085500039F1F90143E0F695E7954A95E1F7E20F25 -:10856000F31FEC0FFD1F408150E0890107701127B8 -:10857000002E02C0559547950A94E2F74C930115D9 -:10858000110551F0E1817C01E01AF10A01C0EE0F02 -:10859000EA94EAF74E2B4C932F5F3F4F1196D6CFBC -:1085A000C90123E0880F991F2A95E1F702C087E0EF -:1085B00090E0DF91CF911F910F91FF90EF90089580 -:1085C000EF92FF920F931F93CF93DF93EC01CB01B8 -:1085D0006730710509F442C069E070E00E944655B9 -:1085E00020E030E088E090E026173707B9F1D901A4 -:1085F00043E0B695A7954A95E1F7A20FB31FA901ED -:1086000047705527AC0FBD1FEC91F0E0042E02C05F -:10861000F595E7950A94E2F74115510559F0119641 -:108620000C9111977C01E41AF50A01C0000FEA943D -:10863000EAF7E02BF0E0EC59FB4FE4911196AC9196 -:10864000B0E08D0102C0159507954A95E2F7A801A3 -:108650004E2740FD05C02F5F3F4FC6CF81E001C0D0 -:1086600080E0DF91CF911F910F91FF90EF900895DF -:108670001092492D08951092492D1092772C109246 -:108680004A2D0895F8DF0E946E2A1092492D089510 -:1086900008950895DC0123E633E66150E8F04D913A -:1086A000942F922780E1989FA00111244927E42F5D -:1086B000F0E042954F70232F3327C9018427AC0186 -:1086C0003E2F22272427352743E0EE0FFF1F4A9530 -:1086D000E1F72E273F27E1CFC90108952F923F925E -:1086E0004F925F926F927F928F929F92AF92BF92C2 -:1086F000CF92DF92EF92FF920F931F93CF93DF936E -:10870000CDB7DEB7C154D240CDBFDEBF8C017B01F7 -:108710008091772C833009F442C138F4813079F0AC -:10872000823009F4B4C00C94CD4D853009F4C2C434 -:1087300008F49CC2863009F4D1C60C94CD4DC0908B -:108740004B2ED0904C2EC114D104C1F0A601495F2C -:108750005F4F23E0569547952A95E1F76BE47DE25C -:10876000C8010E94FC5560914B2E70914C2EC8019F -:108770006BDE10924B2E10924C2E9AC4611571052F -:1087800009F4A8C0C8011CDFB82EB701C801CADEB1 -:108790007C019C01295F3F4FA901440F551F93E0C5 -:1087A000569547959A95E1F74A5F5F4F41385105D5 -:1087B00038F060EC73E2CE0101960E94285693C017 -:1087C000A3E036952795AA95E1F7A80160E870E047 -:1087D000CE0101960E94050E8C01CF5FDD4FF8821D -:1087E000C150D240CE5FDD4FE882C250D2408FEC04 -:1087F00093E29F938F93B0E8EB2EF12CC701801B7F -:10880000910B9F938F9381E090E08C0F9D1F800FC1 -:10881000911F9F938F930E942F56080F191FB70126 -:10882000601B710B22E030E0AE014F5F5D4F81E0D5 -:1088300090E08C0F9D1F800F911F0E94050E9801E4 -:10884000280F391F0F900F900F900F900F900F90DF -:10885000C701821B930B41E050E04C0F5D1F240FBA -:10886000351FB11003C042ED53E202C041EE53E2A6 -:108870005F934F939F938F933F932F930E942F5615 -:108880000F900F900F900F900F900F902CC0C090F2 -:108890004B2ED0904C2EC114D104C9F0A601495FD3 -:1088A0005F4FF3E056954795FA95E1F76BE47DE26B -:1088B000C8010E94FC5590914B2E80914C2E109235 -:1088C0004B2E10924C2EC92ED82E0C94CF4D6115E4 -:1088D000710599F488E0EDE0F4E2DE011196019073 -:1088E0000D928A95E1F71092772CBE016F5F7F4F52 -:1088F00085E60E943F220C94CF4D9B01295F3F4F9C -:1089000073E0369527957A95E1F7A80160E870E065 -:10891000CE0101960E94050E8C01CF5FDD4FF882DB -:10892000C150D240CE5FDD4FE882C250D2408FECC2 -:1089300093E29F938F93E0E8EE2EF12CC701801B0A -:10894000910B9F938F9381E090E08C0F9D1F800F80 -:10895000911F9F938F930E942F56800F911FB701F5 -:10896000681B790B22E030E0AE014F5F5D4FA1E064 -:10897000B0E0AC0FBD1F8A0F9B1F0E94050E109226 -:10898000772CBE016F5F7F4F85E60E943F220F90DC -:108990000F900F900F900F900F900C94CF4D8091EF -:1089A0004A2DB090492D882331F0B1E0BB1508F471 -:1089B00044C110924A2DE5E0EB15B0F0F3E0BF168C -:1089C000E0F521E02B15C8F081E090E080932020B5 -:1089D0009093212082E5D8018C9382E08093492DE9 -:1089E00067E0C62ED12C2BC138E03B1508F0A0C0A3 -:1089F0004AE0B41609F4E9C020C1B2E1EB16F10473 -:108A000008F4ADC0B701C801DBDD8823F9F0B70178 -:108A1000C80188DDF801818190E0982F88272081A6 -:108A2000822B80933B2D90933C2D83E9808380E2C1 -:108A3000818383E08093492DB4C0B701C801C0DDB4 -:108A4000882321F0F8E0EF16F10488F41092492D04 -:108A5000C701089667E070E00E944655462FE091F6 -:108A6000652EF091662EB80181EC1995B4C0B7015E -:108A7000C80158DDD8012C9111968C91119782274D -:108A800012969C911297892713969C911397892788 -:108A900014969C911497891362C08B2D90E00397D4 -:108AA000283881F49C01220F331F820F931FFC0191 -:108AB000E25CF24D11962D913D914C9120833183D2 -:108AC000428312C0FC01EE0FFF1F8E0F9F1F9C01FF -:108AD000225C324DF80180819181A281B381F9013C -:108AE00080839183A283B38345E050E0B801C8013D -:108AF00002960E940556F3E0BF1629F024E0B21654 -:108B000021F087E903C083E901C085E9D8018C938E -:108B100080E711968C9367E0C801BCDDF80187837C -:108B2000908783E08B0D8093492D68E470E081C0CD -:108B3000FBE1EF16F10498F0B701C80141DD8111A6 -:108B400011C0C701089667E070E00E944655462FA5 -:108B5000E091652EF091662EB80181EC1995109286 -:108B6000492D39C0B701C801DDDC63E0C80192DDE1 -:108B70006C01892BA1F7D8018C9182FF15C0B8E058 -:108B8000BB1691F0E6E0BE1611F087E901C085E959 -:108B9000D8018C9380E211968C93BA94BA94B092D7 -:108BA000492D60E170E045C081E080934A2D8B2D16 -:108BB00090E00697B82EBB0C8B0D8C5F8093482DF0 -:108BC000F801808180933D2D3AC0E114F10431F425 -:108BD00081E08093492D0E94682A2FC0B701C80107 -:108BE000EFDC81110FC0C701089667E070E00E94BA -:108BF0004655462FE091652EF091662EB80181EC26 -:108C0000199508C0B701C8018DDC63E0C80142DDD9 -:108C1000892BF1F282ECD8018C9361E0C8013ADD36 -:108C2000F80181839283B092492D10924A2D68E118 -:108C300070E0C80109DC6C0102C0C12CD12C80910C -:108C40004A2D882309F4ABC72091482D30E04EE32C -:108C50005DE264E170E0CE0101960E94050EBE0166 -:108C60006F5F7F4F85E60E943F228EC080912A2D44 -:108C7000811108C080E890E00E942A2381E080935F -:108C80002A2D99C0813009F098C08091492D8230F9 -:108C900008F093C08091292D91E0980F9093292D91 -:108CA000883009F08AC00E9433238115944008F46B -:108CB00072C010922A2D60E070E085E60E943F228B -:108CC00079EB472E7CE2572EE0E8CE2ED12C612C9A -:108CD000712CE12CF12C00E010E0A12CB12C312CF6 -:108CE000FAE02F2E9E012F5F3F4F4901DF92CF9276 -:108CF000ADEEB3E2BF93AF931F922F929F928F92EC -:108D00000E942F56C4010E94C218CDBFDEBFD201FF -:108D10008C91882351F087E990E10E94C7183110A7 -:108D200013C05301332433940FC083E990E10E94B0 -:108D3000C718332049F0C3018A199B09081719077E -:108D400010F475018C01312CF20111922F01FFEF0B -:108D50006F1A7F0A28E0C20ED11C30E76316710437 -:108D600029F60115110571F0C70140961695079572 -:108D7000800F911F63E0880F991F6A95E1F70E94A9 -:108D80002A2302C00E94412310924A2D1092772C70 -:108D90000E94D62202C7E0911E20F0911F20E058C9 -:108DA000F10943E0F695E7954A95E1F7E754F34D6D -:108DB00010820E9433231092292D80914A2DB09069 -:108DC000492D882331F041E04B1508F441C1109240 -:108DD0004A2D55E05B15B8F083E0B81608F03FC0A7 -:108DE00091E09B15C8F081E090E080932020909363 -:108DF000212082E5F801808382E08093492D37E0CD -:108E0000C32ED12C27C1A8E0AB1508F09CC0BAE056 -:108E1000BB1609F4E5C01CC1F2E1EF16F10408F439 -:108E2000A9C0B701C801CCDB882311F1B701C80183 -:108E300079DBD80111968C91119790E0982F8827B3 -:108E40002C91822B80933B2D90933C2D83E98C9326 -:108E500080E211968C9383E08093492DADC0B701D9 -:108E6000C801AEDB882321F0B8E0EB16F10488F4EA -:108E70001092492DC701089667E070E00E944655A0 -:108E8000462FE091652EF091662EB80181EC199580 -:108E9000ADC0B701C80146DBF8012081818182277E -:108EA00092818927938189279481891363C08B2DAF -:108EB00090E00397283889F49C01220F331F820F1A -:108EC000931FFC01E25CF24DD80111962D913D916A -:108ED0004C9120833183428312C0FC01EE0FFF1FAF -:108EE0008E0F9F1F9C01225C324DF8018081918181 -:108EF000A281B381F90180839183A283B38345E08A -:108F000050E0B801C80102960E940556F3E0BF1672 -:108F100029F024E0B21621F087E903C083E901C0FB -:108F200085E9D8018C9380E711968C9367E0C8019E -:108F3000B1DBF8018783908783E08B0D8093492D07 -:108F400068E470E081C0FBE1EF16F10498F0B7012E -:108F5000C80136DB811111C0C701089667E070E0D7 -:108F60000E944655462FE091652EF091662EB8017D -:108F700081EC19951092492D39C0B701C801D2DA98 -:108F800063E0C80187DB6C01892BA1F7D8018C91C4 -:108F900082FF15C0B8E0BB1691F0E6E0BE1611F0F6 -:108FA00087E901C085E9D8018C9380E211968C9302 -:108FB000BA94BA94B092492D60E170E045C081E066 -:108FC00080934A2D8B2D90E00697B82EBB0C8B0D0D -:108FD0008C5F8093482DF801808180933D2D3AC0AD -:108FE000E114F10431F481E08093492D0E94682A54 -:108FF0002FC0B701C801E4DA81110FC0C70108967C -:1090000067E070E00E944655462FE091652EF09192 -:10901000662EB80181EC199508C0B701C80182DA43 -:1090200063E0C80137DB892BF1F282ECD8018C9325 -:1090300061E0C8012FDBF80181839283B092492D52 -:1090400010924A2D68E170E0C801FED96C0102C09F -:10905000C12CD12C80914A2D882309F4A0C5E09120 -:109060001E20F0911F20E058F10973E0F695E79576 -:109070007A95E1F7E754F34DFF24F394F0820E94D0 -:1090800033231092492D0E94682A80E5D8018C93E1 -:1090900011961C9262E0C801FDDAF8018283938385 -:1090A000F092492D10924A2D60E270E0C801CCD9AF -:1090B0006C0175C580914A2DB090492D882331F0FF -:1090C000F1E0FB1508F444C110924A2D25E02B1560 -:1090D000B0F033E0B316E0F541E04B15C8F081E0A5 -:1090E00090E0809320209093212082E5D8018C93FA -:1090F00082E08093492D67E0C62ED12C2BC158E029 -:109100005B1508F0A0C08AE0B81609F4E9C020C1D8 -:10911000B2E1EB16F10408F4ADC0B701C80150DAB2 -:109120008823F9F0B701C801FDD9F801818190E0E9 -:10913000982F88272081822B80933B2D90933C2D64 -:1091400083E9808380E2818383E08093492DB4C0EA -:10915000B701C80135DA882321F0F8E0EF16F104F1 -:1091600088F41092492DC701089667E070E00E94CC -:109170004655462FE091652EF091662EB80181ECA0 -:109180001995B4C0B701C801CDD9D8012C91119659 -:109190008C911197822712969C911297892713968A -:1091A0009C911397892714969C911497891362C0F8 -:1091B0008B2D90E00397283881F49C01220F331FF8 -:1091C000820F931FFC01E25CF24D11962D913D91AF -:1091D0004C9120833183428312C0FC01EE0FFF1FAC -:1091E0008E0F9F1F9C01225C324DF801808191817E -:1091F000A281B381F90180839183A283B38345E087 -:1092000050E0B801C80102960E940556F3E0BF166F -:1092100029F024E0B21621F087E903C083E901C0F8 -:1092200085E9D8018C9380E711968C9367E0C8019B -:1092300031DAF8018783908783E08B0D8093492D85 -:1092400068E470E081C0FBE1EF16F10498F0B7012B -:10925000C801B6D9811111C0C701089667E070E056 -:109260000E944655462FE091652EF091662EB8017A -:1092700081EC19951092492D39C0B701C80152D916 -:1092800063E0C80107DA6C01892BA1F7D8018C9142 -:1092900082FF15C0B8E0BB1691F0E6E0BE1611F0F3 -:1092A00087E901C085E9D8018C9380E211968C93FF -:1092B000BA94BA94B092492D60E170E045C081E063 -:1092C00080934A2D8B2D90E00697B82EBB0C8B0D0A -:1092D0008C5F8093482DF801808180933D2D3AC0AA -:1092E000E114F10431F481E08093492D0E94682A51 -:1092F0002FC0B701C80164D981110FC0C7010896FA -:1093000067E070E00E944655462FE091652EF0918F -:10931000662EB80181EC199508C0B701C80102D9C1 -:1093200063E0C801B7D9892BF1F282ECD8018C93A4 -:1093300061E0C801AFD9F80181839283B092492DD1 -:1093400010924A2D68E170E0C8017ED86C0102C01D -:10935000C12CD12C80914A2D882309F420C4D090AF -:10936000B82CDD2099F1E114F10429F41092B82C05 -:1093700010924A2D43C0F2EAEF16F10440F0B70113 -:10938000C8011ED991E08927A82EB12C03C0AA24B8 -:10939000A394B12CB701C801C5D8AB2829F462E168 -:1093A000C80178D9892B29F0ACEFAD0DA093B82C6A -:1093B0002AC024E0D29ED0011124A859B34D80E1E7 -:1093C000F80101900D928A95E1F71DC042E050E04E -:1093D00060ED71E1CE0101960E94CE55E3EDF1E121 -:1093E000E49120913B2D30913C2D89819A81281761 -:1093F000390721F480913D2D8E1729F01092492DC7 -:109400000E94682ACAC32091B82C203109F04DC0AF -:1094100010924A2D1092B82C1092772C20E130E057 -:1094200048E75CE267E870E0CE0101960E94050E15 -:109430006FEC73E2CE0181960E94285620E130E065 -:1094400048E85CE265E670E0CE0183960E94050E76 -:109450006FEC73E2CE018D5B9F4F0E94285620E196 -:1094600030E048E95CE263E470E0CE018B5B9F4F43 -:109470000E94050E6FEC73E2CE018B599F4F0E9444 -:10948000285620E130E048EA5CE261E270E0CE017B -:1094900089599F4F0E94050E0E94D622BE016F5F20 -:1094A0007F4F85E60E943F2278C380E3D8018C93EA -:1094B00011962C9362E0C801CF5BDD4F2883C15425 -:1094C000D240E8D8F80182839383CF5BDD4F2881B7 -:1094D000C154D2402C5F2093B82CE6CD80914A2D08 -:1094E000B090492D882331F0F1E0FB1508F44EC10E -:1094F00010924A2D25E02B15B0F033E0B316E8F5B5 -:1095000041E04B15C8F081E090E0809320209093DB -:10951000212082E5D8018C9382E08093492D67E079 -:10952000C62ED12C35C158E05B1508F0A2C08AE0E8 -:10953000B81609F4EEC02AC1B2E1EB16F10408F442 -:10954000B0C0B701C8013CD8882301F1B701C801F8 -:109550000E949242F801818190E0982F8827208113 -:10956000822B80933B2D90933C2D83E9808380E276 -:10957000818383E08093492DB8C0B701C80120D80A -:10958000882321F0F8E0EF16F10488F41092492DB9 -:10959000C701089667E070E00E944655462FE091AB -:1095A000652EF091662EB80181EC1995B8C0B7010F -:1095B000C8010E949242D8012C9111968C9111976A -:1095C000822712969C911297892713969C91139744 -:1095D000892714969C911497891363C08B2D90E072 -:1095E0000397283881F49C01220F331F820F931FA9 -:1095F000FC01E25CF24D11962D913D914C9120833E -:109600003183428312C0FC01EE0FFF1F8E0F9F1F9C -:109610009C01225C324DF80180819181A281B3814D -:10962000F90180839183A283B38345E050E0B801C0 -:10963000C80102960E940556F3E0BF1629F024E007 -:10964000B21621F087E903C083E901C085E9D8019A -:109650008C9380E711968C9367E0C8011BD8F801C2 -:109660008783908783E08B0D8093492D68E470E0B9 -:1096700088C0FBE1EF16F104A0F0B701C8010E9419 -:10968000E042811111C0C701089667E070E00E94B6 -:109690004655462FE091652EF091662EB80181EC7B -:1096A00019951092492D3BC0B701C8010E94924202 -:1096B00063E0C8010E944A436C01892B91F7D801ED -:1096C0008C9182FF15C0B8E0BB1691F0E6E0BE16A3 -:1096D00011F087E901C085E9D8018C9380E21196E9 -:1096E0008C93BA94BA94B092492D60E170E049C06D -:1096F00081E080934A2D8B2D90E00697B82EBB0C0D -:109700008B0D8C5F8093482DF801808180933D2DD7 -:109710003FC0E114F10431F481E08093492D0E94AF -:10972000682A34C0B701C8010E94E04281110FC00D -:10973000C701089667E070E00E944655462FE09109 -:10974000652EF091662EB80181EC19950AC0B7011B -:10975000C8010E94924263E0C8010E944A43892BDB -:10976000D9F282ECD8018C9361E0C8010E944A438F -:10977000F80181839283B092492D10924A2D68E1BD -:1097800070E0C8010E9424426C0102C0C12CD12C9F -:1097900080914A2D882309F402C28091492D9AEFC5 -:1097A000980F933008F04FC0D801DC90D5FADD2433 -:1097B000D0F810922B2DEBE9AE2EE0E1BE2EC12C9D -:1097C00047E650E0B501CE0101960E94CE558B814F -:1097D000882349F029813A8180913B2D90913C2D3D -:1097E00028173907B9F48D81882329F09C8180914D -:1097F0003D2D98130FC08F89882311F0DD2051F083 -:10980000E0912B2D81E08E0F80932B2DF0E0E45D15 -:10981000F24DC082C394B7E6AB0EB11CEFE0CE129E -:10982000CFCFDD2009F494C080EED8018C9380E87E -:1098300011968C9362E0C8010E944A43F80182832A -:10984000938389E0A7C0893009F082C0B701C801BD -:109850000E94E04281110FC0C701089667E070E0E6 -:109860000E944655462FE091652EF091662EB80174 -:1098700081EC1995BFC0B701C8010E9492427C01DA -:10988000D8016C91262F30E073E0969587957A95F4 -:10989000E1F702972817390731F46E5FC8010E947B -:1098A0004A43892B71F082ECF801808361E0C801A2 -:1098B0000E944A43D80111968C93119712969C935B -:1098C000A3C0D12C67E6C62E5801FFEFAF1ABF0A1E -:1098D00080912B2DD816E0F5ED2DF0E0E45DF24DF2 -:1098E0006081C69EB001112465567F4E47E650E068 -:1098F000CE0101960E94CE558F89882339F14E8979 -:1099000050E0F801808190E001974817590739F439 -:10991000B501CE0106960E94EF55892BB9F0209132 -:109920002B2D422F50E0415051093D2D832F90E0C7 -:10993000841795073CF4FC01E45DF24D818180833E -:109940003F5FF4CF215020932B2DDA94D394C0CFD6 -:109950008091492D9AEF980F9430F8F490912B2D27 -:109960002CE23DE2F9018E2F821B891708F068C0B6 -:10997000819184508230B8F782E0D8018C9380E6E0 -:1099800011968C9362E0C8010E944A43F8018283D9 -:1099900093838BE08093492D87CB8B3009F050C0A7 -:1099A000E114F10409F44AC0B701C8010E94E04281 -:1099B00081110FC0C701089667E070E00E9446550C -:1099C000462FE091652EF091662EB80181EC199535 -:1099D0000FC0B701C8010E94924253E09695879547 -:1099E0005A95E1F7682FC8010E944A43892BA1F0DC -:1099F00010922B2D82ECD8018C9361E0C8010E945B -:109A00004A43F801818392838AE08093492D109222 -:109A10004A2D68E170E04ACBD80115968C918823D5 -:109A200031F0813059F480932B2D85E004C081E022 -:109A300080932B2D84E080932C2D02C010922B2D2F -:109A400080912B2D811103C063EF73E213C081302D -:109A5000A9F460912C2DB7E66B9FB00111246E53D1 -:109A60007F4E40E450E0CE0101960E94CE55BE01EB -:109A70006F5F7F4F85E60E943F2268C0912C80E097 -:109A800090E000E010E027E6822E7E013FEFE31A2F -:109A90003DEFF30A36E0C32E34E2D32EA12C42E090 -:109AA000B42E20912B2D921680F50130E2E01E0796 -:109AB00020F0081B190BF12C2EC0E92DF0E0E45D1D -:109AC000F24D6081869EB00111246E537F4E40E4BA -:109AD00050E0C7010E94CE55FF92EF92DF92CF92E5 -:109AE000C501801B910B9F938F9381E090E08C0FB9 -:109AF0009D1F800F911F9F938F930E942F56080FD9 -:109B0000191F9394CDBFDEBFCCCF013042E01407C4 -:109B100080F6FF24F394EDEFFFEFEC0FFD1FE00F55 -:109B2000F11F8EE28083EEEFFFEFEC0FFD1FE00FE1 -:109B3000F11F1082BE016F5F7F4F85E60E943F22BA -:109B4000F11004C081E390E10E94C7188AE290E11D -:109B50000E94C71862E070E08BE39DE20E945D22E4 -:109B600084E290E10E94C7186091482D70E08EE376 -:109B70009DE20E945D228EE190E10E94C71861E0A3 -:109B800070E08DE39DE20E945D221092772C10928E -:109B90002B2D0E94D62210924A2DC12CD12CC60109 -:109BA000CF5BDD4FCDBFDEBFDF91CF911F910F9116 -:109BB000FF90EF90DF90CF90BF90AF909F908F90ED -:109BC0007F906F905F904F903F902F900895FF92FD -:109BD0000F931F93CF93DF93CDB7DEB7EA97CDBF37 -:109BE000DEBF0FEB11E388E0F82EF00E91D2F80102 -:109BF00081938F01FE12FACF0E94761904D3882335 -:109C000009F4F7C08091BF319091C031953009F4CB -:109C10006FC030F4913069F168F0933051F1E9C0D0 -:109C2000983009F4C2C0993009F4C8C0963009F0E0 -:109C3000E0C072C0803891F0823809F0DAC08091BB -:109C4000C3318F7085D2E091C931F091CA31118151 -:109C500012FB112710F980E07BD206C01091BB31B6 -:109C60008091BC3181111260E8D2812F61D280E0F5 -:109C7000A1C0282F2D7F09F0BCC0882319F08230A5 -:109C800061F0B7C08091C131813009F0B2C093302A -:109C900009F080E08093BC3127C08091C1318111EF -:109CA00023C0E091C3311E2F1F7009F4A2C0812F81 -:109CB0004FD28091C031833011F4EBD215C0E091C6 -:109CC000C931F091CA3181818B7F818324E8129F51 -:109CD000F0011124E35FFD4C1082E091C931F09155 -:109CE000CA3180818E7F808380E032D2A6D264C068 -:109CF00081117FC01091C1311F779FD2A1D35DD256 -:109D00008823E9F31093C304111102C082E001C05B -:109D100083E08093BE316DC08058823008F069C006 -:109D20008091C1319091C2318C3DE3E09E0761F595 -:109D300083E08A838AE389834FB7F894DE01139620 -:109D400020E038E052E05093CA01E32FF0E0E491C4 -:109D50001092CA0120FF03C0E295EF703F5FEF70E1 -:109D60008E2F90E0EA3010F0C79601C0C0968D9318 -:109D70009D932F5F2C3139F74FBF5FD26AE370E0BC -:109D8000CE010196A3D00FC0AE014F5F5F4F60912F -:109D9000C3310E94710C8C01892B59F14ED2B8014C -:109DA00089819A810FD1A5D124C0803811F545D27F -:109DB0008091BA31BDD184D143D31BC0811119C068 -:109DC0008091C1318230A8F438D28091C131809322 -:109DD000BA3136D38091BA31811106C08091C30463 -:109DE000811102C081E001C084E08093BE310E94F5 -:109DF000721909D2882311F020D24BD2EA96CDBF36 -:109E0000DEBFDF91CF911F910F91FF9008950895CC -:109E1000CF938091BE31882351F0C091CB3180E047 -:109E200097D1F1D18111D3DE8C2FCF9191C1CF91F8 -:109E30000895CF92DF92EF92FF920F931F93CF93EB -:109E4000DF93EC018B017A0111D3811136C0E1144B -:109E5000F10439F0F70180819181081B190BC80FBB -:109E6000D91FC12CD12C0115110531F18091C731B9 -:109E70009091C831FC01EF5BFF4F208131978081C9 -:109E8000281790F01DD1C4DFE114F10449F0F70167 -:109E900080819181C80ED91EC082D18285E00DC01B -:109EA000E5D2882301F309C0899142D101501109FB -:109EB000FFEFCF1ADF0AD7CF80E0DF91CF911F915C -:109EC0000F91FF90EF90DF90CF900895DF92EF9287 -:109ED000FF920F931F93CF93DF93D82FC92F8B013E -:109EE0008091CB31806834D12091C5313091C63119 -:109EF0002017310728F00115110519F4E1D001C030 -:109F00008901ED2EFC2ED12C0115110509F440C05C -:109F10008091BE31811102C082E04CC0853011F4C5 -:109F200083E048C070D1882311F081E043C051D153 -:109F300081113CC042D1882339F32091CB318091EB -:109F4000C7319091C831FC0127FF05C0EF5BFF4F7F -:109F5000C081D0E013C0E05CFF4FC08131968081AA -:109F6000D0E0C81BD1090AC0C830D10550F4F701B0 -:109F700081917F01DDD00150110921960115110554 -:109F800099F7DD24D394289709F0D12C99D0BCCF30 -:109F9000D110BECF0BC08091BE31882309F4BCCF55 -:109FA000853009F4BDCF2FD18111BFCF12D18823C5 -:109FB00091F380E0DF91CF911F910F91FF90EF908F -:109FC000DF900895DF92EF92FF920F931F93CF934C -:109FD000DF93D82FC92F8B018091CB318068B8D007 -:109FE0002091C5313091C6312017310728F0011575 -:109FF000110519F465D001C08901ED2EFC2ED12C7C -:10A000000115110509F442C08091BE31811102C0D1 -:10A0100082E04EC0853011F483E04AC0F4D088233A -:10A0200011F081E045C0D5D081113EC0C6D0882353 -:10A0300039F32091CB318091C7319091C831FC0127 -:10A0400027FF05C0EF5BFF4FC081D0E015C0E05C8B -:10A05000FF4FC08131968081D0E0C81BD1090CC070 -:10A06000C830D10560F4F701849162D0FFEFEF1A98 -:10A07000FF0A0150110921960115110589F7DD2408 -:10A08000D394289709F0D12C1BD0BACFD110BCCFD4 -:10A090000BC08091BE31882309F4BACF853009F412 -:10A0A000BBCFB1D08111BDCF94D0882391F380E094 -:10A0B000DF91CF911F910F91FF90EF90DF90089566 -:10A0C000E091C931F091CA31A091C731B091C83146 -:10A0D000AF5BBF4F8C9190E08283938380818D79B9 -:10A0E0008083E091C731F091C831EF5BFF4F108260 -:10A0F0000895E091C931F091CA3180818D798083D2 -:10A10000E091C731F091C831EF5BFF4F10820895A5 -:10A110008091C7319091C831FC01EF5BFF4F2081E6 -:10A1200031E0320F3083FC01E20FF11D8081089590 -:10A130002091C7313091C831F901EF5BFF4F908119 -:10A1400041E0490F4083F901E90FF11D8083089533 -:10A150008093CB31482F4F7050E06091C6047091CE -:10A16000C7049A0194E0220F331F9A95E1F7E4E8BF -:10A1700087FF11C0E49FC001E59F900D1124825F0D -:10A180009D4C8093C7319093C831C90108969B01BB -:10A19000280F391F0DC0E49FC001E59F900D1124C9 -:10A1A00084539E4C8093C7319093C831260F371F3C -:10A1B0002093C9313093CA3108958091CB318068A2 -:10A1C000C7DFE091C931F091CA31808186958170F5 -:10A1D00008958091CB318F77BBDFA091C931B091C9 -:10A1E000CA318C9185FF0DC0E091C731F091C83123 -:10A1F00012968D919C911397E05CFF4F808381E0D4 -:10A20000089580E008958091CB318F77A1DFA091F0 -:10A21000C931B091CA318C9184FF0DC0E091C73132 -:10A22000F091C83112968D919C911397E05CFF4F8D -:10A23000808381E0089580E008958091CB318F770D -:10A2400087DFE091C931F091CA3180818D788083B8 -:10A25000E091C931F091CA31808181608083E091C1 -:10A26000C731F091C831EF5BFF4F10828091CB3145 -:10A2700080686EDFE091C931F091CA3180818160E0 -:10A280008083E091C731F091C831EF5BFF4F1082BE -:10A290000895E091C931F091CA3181818460818350 -:10A2A000E091C931F091CA318181807C803459F4C8 -:10A2B0008091CB3180584CDFE091C931F091CA31A7 -:10A2C00081818460818308951F93CF93DF931F92D0 -:10A2D0001F92CDB7DEB7182F4A83698339DFE0912B -:10A2E000C931F091CA311182E091C931F091CA317E -:10A2F000812F881F8827881F880F8083E091C931AC -:10A30000F091CA3169816183E091C931F091CA311C -:10A31000128213822091C7313091C8312483358352 -:10A32000110F110B4A814123F901E05CFF4F40837B -:10A330003196108281E00F900F90DF91CF911F91A5 -:10A340000895AF92BF92CF92DF92EF92FF920F9358 -:10A350001F93CF93DF93A62E8C017C0184E0E80E3F -:10A36000F11CB12CBA1409F443C0F801D081DD23EB -:10A37000C1F1C180D280F70131978081F7019081CE -:10A38000923010F498E001C098E128E030E0C0E09D -:10A390002C153D0520F4CF5F220F331FF9CFC92BB9 -:10A3A0009D2F9F70963010F080E023C0CF7EF1E4A7 -:10A3B000CF16D104C8F7882321F0813021F4C06C76 -:10A3C0000AC0C06403C0C068811105C04C2D6C2F49 -:10A3D00080E88D0F79DF4C2D6C2F8D2F75DF882352 -:10A3E00019F3B3940B5F1F4F85E0E80EF11CBACF51 -:10A3F00081E0DF91CF911F910F91FF90EF90DF905F -:10A40000CF90BF90AF90089580E090E0E091C604B7 -:10A41000F091C7049C0144E0220F331F4A95E1F7F5 -:10A42000E20FF31F11864091C6045091C704FA0150 -:10A43000E20FF31F118201968630910539F70895D6 -:10A440008091BF3187FF0DC0C4DE811105C08091AE -:10A45000BE318111F9CF09C04CCE8091BE31882325 -:10A4600021F0ABDE8823C9F32BCE08950F931F9301 -:10A47000CF93E091C604F091C704E05AFF4F0081EA -:10A480001181C4E68091CB3187FF0AC096DE81112D -:10A4900005C08091BE31811105C021C080E024C07B -:10A4A00098DEF5CF8530E9F0E091C931F091CA31FD -:10A4B000818182FD18C0E091C604F091C704E05A82 -:10A4C000FF4F8081918180179107E1F22FEF2C0FD0 -:10A4D000CC2319F08C01C22FD5CF84E005C082E0D7 -:10A4E00003C083E001C081E0CF911F910F910895D7 -:10A4F00063D069D0E0ECF4E081818E7F818380813C -:10A500008F7780831092BD310895CF93DF93E0E47D -:10A51000F0E014828481836084834ED054D0C0ECF8 -:10A52000D4E088818F7788838881806888831092BF -:10A53000BE311092BA311092BC311092BB31888179 -:10A540008064888348E068E480E8BEDE48E068E430 -:10A5500080E0BADE8885806488878981816089830C -:10A56000DF91CF910895CF93DF933FB7F894C0EC7C -:10A57000D1E022E02A87EAE1F0E0E491A0ECB4E047 -:10A58000DA96EC93DA97EBE1F0E0E491DB96EC936A -:10A59000DB971A8685EE94E38E7F16968D939C93B7 -:10A5A000179785E18C9318962C933FBF81E0809399 -:10A5B000BD31DF91CF91A9CFE0ECF4E080858370CD -:10A5C000808711860895E0ECF4E08FEF828784871E -:10A5D00008951F920F920FB60F92112408B60F9292 -:10A5E00018BE09B60F9219BE0BB60F921BBE2F9361 -:10A5F0003F934F935F936F937F938F939F93AF930B -:10A60000BF93EF93FF938091CA0487FF08C08091A6 -:10A61000C80487FF04C080E88093CA04F8DB8091F7 -:10A62000CA0486FF07C080E48093CA041092BE313A -:10A630000E9461198091CA0485FF14C080E2809352 -:10A64000CA048091BA31882311F084E007C0809158 -:10A65000C304811102C081E001C083E08093BE3158 -:10A660000E9450198091CA0484FF14C080E1809335 -:10A67000CA0482E08093BE311092BA311092C304B2 -:10A68000C3DE48E068E480E81FDE48E068E480E07C -:10A690001BDEBDDBFF91EF91BF91AF919F918F9139 -:10A6A0007F916F915F914F913F912F910F900BBED2 -:10A6B0000F9009BE0F9008BE0F900FBE0F901F9015 -:10A6C0001895CF93DF93EC01FC0170968BE0DF01CE -:10A6D0001D928A95E9F782E08C83898783E08E87D3 -:10A6E00061E0CE0101962DDE882361F061E0CE01AC -:10A6F000069627DE882331F061E0CE010B96DF91CC -:10A70000CF911FCE80E0DF91CF9108950F931F93DB -:10A71000CF93DF932091BE312430E1F4FC01048912 -:10A72000158926893789012B022B032B99F0EB0120 -:10A7300081810EDDFE0101900020E9F73197BF0114 -:10A740006C1B7D0B40E050E0CE01DF91CF911F915B -:10A750000F916FCB82E0DF91CF911F910F91089500 -:10A760000F931F93CF93DF93FC018091BE31843010 -:10A77000A9F484899589A689B789892B8A2B8B2B83 -:10A7800069F08A01EB018181E3DC40E050E0B8012F -:10A79000CE01DF91CF911F910F914BCB82E0DF91E2 -:10A7A000CF911F910F910895CF93FC018091BE31FD -:10A7B000843001F584899589A689B789892B8A2BEC -:10A7C0008B2BC1F0C62F8181C3DC2091C731309122 -:10A7D000C831F901EF5BFF4F908131978081981765 -:10A7E00020F48C2FA5DC80E006C06ADC3FDE8823E5 -:10A7F000C1F301C082E0CF910895CF93DF93209100 -:10A80000BE31243091F5FC014489558966897789E8 -:10A81000452B462B472B49F181819ADC8091CB3126 -:10A820002091C7313091C831F90187FF05C0EF5B36 -:10A83000FF4F808190E008C0E05CFF4F808131963F -:10A84000408190E0841B9109892B69F0F901EF5B4D -:10A85000FF4FD0813197C08133DCDC1720F006DE5A -:10A86000811104C02DDC80E001C082E0DF91CF9136 -:10A870000895CF93DF932091BE31243099F4FC01E9 -:10A880004489558966897789452B462B472B51F09A -:10A89000EC0181815DDC91DC882321F0CE01DF9128 -:10A8A000CF91ABCFDF91CF910895CF93DF932091DC -:10A8B000BE31243019F08FEF9FEF46C0FC01448970 -:10A8C000558966897789452B462B472BA1F38681CD -:10A8D0003FDC7FDC882379F38091CB312091C73135 -:10A8E0003091C831F90187FF05C0EF5BFF4F8081D0 -:10A8F00090E008C0E05CFF4F80813196208190E0BD -:10A90000821B9109892B21F003DCC82FD0E002C003 -:10A91000CFEFDFEF2091CB318091C7319091C831DB -:10A92000FC0127FF05C0EF5BFF4F208130E008C02E -:10A93000E05CFF4F20813196808130E0281B310997 -:10A94000232B09F4D6DBCE01DF91CF910895089532 -:10A95000FF920F931F93CF93DF93EC0154DC882376 -:10A9600009F48EC0888190E02091C3313091C431C8 -:10A970002817390709F084C08091C031813259F01D -:10A9800018F4803249F17CC0823209F457C0833216 -:10A9900009F467C075C08091BF31813A09F070C079 -:10A9A0004CDC0BDC8823E9F38C89FD880E891F8938 -:10A9B000BFDB8F2DBDDB802FBBDB812FB9DB888D0B -:10A9C000B7DB898DB5DB8A8DB3DB7ADBDF91CF9185 -:10A9D0001F910F91FF9034CD8091BF31813209F0EA -:10A9E0004FC02BDCF6DB811105C08091BE31811197 -:10A9F000F9CF46C08DDB082F8BDB182F89DBF82EB3 -:10AA000087DB4F2D50E060E070E0BA015527442706 -:10AA1000782B402B512B4C8B5D8B6E8B7F8B78DB97 -:10AA2000888F76DB898F74DB8A8F63DB09DDCE014B -:10AA3000DF91CF911F910F91FF9089CF8091BF310E -:10AA40008132F1F4FADBFCDC8091C1319091C231AA -:10AA5000888B998BCE01DF91CF911F910F91FF9041 -:10AA600076CF8091BF31813259F4E7DBE9DC609128 -:10AA7000C131CE01DF91CF911F910F91FF9067CF30 -:10AA8000DF91CF911F910F91FF900895AA1BBB1BDF -:10AA900051E107C0AA1FBB1FA617B70710F0A61BDE -:10AAA000B70B881F991F5A95A9F780959095BC01FF -:10AAB000CD010895B7FF04C003D0821B930B089506 -:10AAC00009D0A59F900DB49F900DA49F800D911D5E -:10AAD00011240895A29FB001B39FC001A39F700DE0 -:10AAE000811D1124911DB29F700D811D1124911D96 -:10AAF00008958F929F92AF92BF92CF92DF92EF9282 -:10AB0000FF92CF93DF93EC01688179818A819B81E9 -:10AB1000611571058105910521F464E279ED8BE5FC -:10AB200097E02DE133EF41E050E022D749015A018F -:10AB30009B01AC01A7EAB1E4C3DF6B017C01ACEE81 -:10AB4000B4EFA5019401B8DFDC01CB018C0D9D1D94 -:10AB5000AE1DBF1DB7FF03C00197A109B048888390 -:10AB60009983AA83BB839F77DF91CF91FF90EF906A -:10AB7000DF90CF90BF90AF909F908F900895B9CF06 -:10AB800082E290E2B6CFA0E0B0E0809322209093E2 -:10AB90002320A0932420B09325200895FB01DC01FD -:10ABA00002C005900D9241505040D8F70895FB0126 -:10ABB000DC018D91059080190110D9F3990B08954E -:10ABC000FB01DC014150504048F005900D920020FF -:10ABD000C9F701C01D9241505040E0F70895FB01B4 -:10ABE000DC0104C08D910190801921F44150504046 -:10ABF000C8F7881B990B0895FB01DC0102C0019086 -:10AC00000D9241505040D8F708956817790768F4BD -:10AC1000FB01DC01E40FF51FA40FB51F02C0029079 -:10AC20000E9241505040D8F70895E6CFDC0101C0A4 -:10AC30006D9341505040E0F70895FC0181918617D3 -:10AC400021F08823D9F7992708953197CF010895E6 -:10AC5000FB01DC0101900D920020E1F708950F93B4 -:10AC60001F93CF93DF93CDB7DEB72E97CDBFDEBF57 -:10AC70000E891F89888D998D26E02C8309831A837C -:10AC800097FF02C080E090E801978D839E83AE011C -:10AC9000445E5F4F6A8D7B8DCE01019667D04D81FA -:10ACA0005E8157FD0AC02F813885421753070CF487 -:10ACB0009A01F801E20FF31F10822E96CDBFDEBF7E -:10ACC000DF91CF911F910F9108950F931F93CF9311 -:10ACD000DF93CDB7DEB72E97CDBFDEBF0E891F89BC -:10ACE000888D998D2EE02C8309831A8397FF02C0EB -:10ACF00080E090E801978D839E83AE01445E5F4FB4 -:10AD00006A8D7B8DCE01019631D04D815E8157FDDC -:10AD10000AC02F813885421753070CF49A01F801B5 -:10AD2000E20FF31F10822E96CDBFDEBFDF91CF91D1 -:10AD30001F910F910895CF93DF93CDB7DEB72E9774 -:10AD4000CDBFDEBF8DE08C838C899D8989839A83FA -:10AD5000AE01485E5F4F6E897F89CE0101968FD329 -:10AD60002E96CDBFDEBFDF91CF9108952F923F92F7 -:10AD70004F925F926F927F928F929F92AF92BF920B -:10AD8000CF92DF92EF92FF920F931F93CF93DF93B7 -:10AD9000CDB7DEB72C97CDBFDEBF7C016B018A013A -:10ADA000FC0116821782838181FFB0C1CE0101961A -:10ADB0004C01F7019381F60193FD859193FF8191F9 -:10ADC0006F01882309F49EC1853239F493FD859182 -:10ADD00093FF81916F01853221F4B70190E0D6D4C1 -:10ADE000E8CF512C312C20E02032A0F48B3269F0D6 -:10ADF00030F4803259F0833269F420612CC08D32F6 -:10AE000039F0803339F4216026C02260246023C0E9 -:10AE1000286021C027FD27C030ED380F3A3078F484 -:10AE200026FF06C0FAE05F9E300D1124532E13C09A -:10AE30008AE0389E300D1124332E20620CC08E32F1 -:10AE400021F426FD5FC1206406C08C3611F4206811 -:10AE500002C0883641F4F60193FD859193FF8191FC -:10AE60006F018111C1CF982F9F7D9554933028F4A5 -:10AE70000C5F1F4FFFE3F9830DC0833631F083373A -:10AE800071F0833509F057C021C0F80180818983B2 -:10AE90000E5F1F4F44244394512C540114C03801B9 -:10AEA000F2E06F0E711CF801A080B18026FF03C094 -:10AEB000652D70E002C06FEF7FEFC5012C871DD4B8 -:10AEC0002C0183012C852F77222E16C03801F2E049 -:10AED0006F0E711CF801A080B18026FF03C0652DA4 -:10AEE00070E002C06FEF7FEFC5012C87FBD32C0110 -:10AEF0002C852068222E830123FC19C0832D90E02D -:10AF000048165906A0F4B70180E290E03FD43A9485 -:10AF1000F5CFF50127FC859127FE81915F01B701EF -:10AF200090E034D431103A94F1E04F1A51084114B2 -:10AF3000510479F7DEC0843611F0893631F5F80115 -:10AF400027FF07C060817181828193810C5F1F4F51 -:10AF500008C060817181072E000C880B990B0E5F71 -:10AF60001F4F2F76722E97FF09C090958095709590 -:10AF700061957F4F8F4F9F4F2068722E2AE030E0FF -:10AF8000A40155D4A82EA81843C0853729F42F7ED4 -:10AF9000B22E2AE030E025C0F22FF97FBF2E8F3687 -:10AFA000C1F018F4883579F0ADC0803719F08837D2 -:10AFB00021F0A8C02F2F2061B22EB4FE0DC08B2D22 -:10AFC0008460B82E09C024FF0AC09F2F9660B92E56 -:10AFD00006C028E030E005C020E130E002C020E1FA -:10AFE00032E0F801B7FE07C06081718182819381F0 -:10AFF0000C5F1F4F06C06081718180E090E00E5FA2 -:10B000001F4FA40114D4A82EA818FB2DFF777F2E64 -:10B0100076FE0BC0372D3E7FA51450F474FE0AC097 -:10B0200072FC08C0372D3E7E05C0BA2C372D03C0F8 -:10B03000BA2C01C0B52C34FF0DC0FE01EA0DF11D84 -:10B040008081803311F4397E09C032FF06C0B39489 -:10B05000B39404C0832F867809F0B39433FD12C0F3 -:10B0600030FF06C05A2CB31418F4530C5B18B32CE1 -:10B07000B31460F4B70180E290E03C8787D3B394C7 -:10B080003C85F6CFB31410F43B1801C0312C34FFCB -:10B0900011C0B70180E390E03C8778D33C8532FF54 -:10B0A00016C031FD03C088E790E002C088E590E05B -:10B0B000B7010CC0832F867851F031FF02C08BE2BC -:10B0C00001C080E237FD8DE2B70190E05FD3A514A7 -:10B0D00030F4B70180E390E059D35A94F8CFAA94A2 -:10B0E000F401EA0DF11D8081B70190E04FD3A1106A -:10B0F000F6CF332009F45DCEB70180E290E046D36D -:10B100003A94F7CFF7018681978102C08FEF9FEFC6 -:10B110002C96CDBFDEBFDF91CF911F910F91FF9095 -:10B12000EF90DF90CF90BF90AF909F908F907F90E7 -:10B130006F905F904F903F902F90089520FD09C031 -:10B14000FC0123FD05C022FF02C07383628351838B -:10B150004083089544FD10C046FD10C0DB01FC0192 -:10B16000AA0FBB1FEE1FFF1F1094D1F76A0F7B1FA2 -:10B170008E1F9F1F31E003C033E001C034E0660F33 -:10B18000771F881F991F3150D1F7620F711D811DE4 -:10B19000911D08950F931F93CF93DF938C01C801E6 -:10B1A000B7D2EC0197FD06C08AD2892BC1F7B8014E -:10B1B000CE0124D3CE01DF91CF911F910F9108953D -:10B1C0008F929F92AF92BF92CF92DF92EF92FF92B7 -:10B1D0000F931F93CF93DF931F92CDB7DEB78C01F0 -:10B1E000C62E7A01298394D2AC01552729814B328E -:10B1F000510521F04D32510561F42068CA94C11007 -:10B2000002C080E06FC0C801298382D2298197FDE6 -:10B21000F8CF322F3D7FD32E322F307339F5803364 -:10B2200029F5BB24BA94BC0C09F449C0C801298390 -:10B230006FD2298197FD43C0382F3F7D383561F4A7 -:10B240008D2D8264D82ECA94CA94CC20C1F1C80135 -:10B250005FD297FF0BC033C026FF04C02D2D2260A4 -:10B26000D22E03C03D2D3261D32ECB2C812C912CBC -:10B27000540120ED280F283078F0D4FE03C0B80127 -:10B28000BDD21AC02A3040F0D6FEF9CF2F7D3FEE56 -:10B29000320F3630A0F727504D2DC501B4015ADFCB -:10B2A0004B015C018D2D8260D82ECA94CC2051F0C8 -:10B2B000C8012ED297FFDDCFD1FC04C0A2CF812CD4 -:10B2C000912C5401D7FE08C0B094A094909480941F -:10B2D000811C911CA11CB11C2D2DB501A401C7011D -:10B2E0002DDF81E00F90DF91CF911F910F91FF90A3 -:10B2F000EF90DF90CF90BF90AF909F908F90089588 -:10B300006F927F928F929F92AF92BF92CF92DF9275 -:10B31000EF92FF920F931F93CF93DF93CDB7DEB7DA -:10B32000A197CDBFDEBF5C017A01CE0101966C0111 -:10B3300080E2F60111928A95E9F7F501838040E0F9 -:10B3400050E0912C712C70E0A1E0B0E0F90183FC99 -:10B35000859183FE81918F01982F9F01811103C0F8 -:10B3600080E090E07AC08E3519F44115510549F11D -:10B37000E72FF0E0E417F5073CF48D3559F18D32F5 -:10B3800019F4772001F103C0711001C0982E892FA4 -:10B390008695869586958601080F111D892F8770E1 -:10B3A0003D0101C0660C8A95EAF7F8018081862983 -:10B3B0008083991559F0991510F49F5FE8CF91504B -:10B3C000E6CF71E004C07724739401C0712C4F5F05 -:10B3D0005F4FBCCF772019F08E8180628E83711110 -:10B3E00003C09924939416C0F6019E012F5D3F4F30 -:10B3F000808180958193E217F307D1F7F2CFE114B2 -:10B40000F10429F0F7018083C70101967C016150A6 -:10B41000912CE9F0C50169A37BD169A197FD15C005 -:10B42000282F269526952695F601E20FF11D2081FD -:10B4300030E0AC014770552702C0359527954A95F5 -:10B44000E2F720FDDCCFB501D9D1911089CFE1140D -:10B45000F10411F0F7011082C801A196CDBFDEBF43 -:10B46000DF91CF911F910F91FF90EF90DF90CF90E0 -:10B47000BF90AF909F908F907F906F9008954F9264 -:10B480005F927F928F929F92AF92BF92CF92DF9204 -:10B49000EF92FF920F931F93CF93DF931F92CDB73D -:10B4A000DEB76C012B015A01FC0116821782712C48 -:10B4B000F601F380F201F3FC8591F3FE8191382FC0 -:10B4C0002F01882309F4E5C090E03983F8D0398151 -:10B4D000892B19F0C6015EDEEBCF353241F4F20163 -:10B4E000F3FC3591F3FE31912F01353259F4C60149 -:10B4F00039830ED1398197FDCAC03817C9F2B60118 -:10B500007DD1C7C03A3239F4F3FC3591F3FE319165 -:10B510002F0151E001C050E0420110E020ED230F67 -:10B520002A3088F45260612F70E080E090E040E2C1 -:10B53000598310DE162FF401F3FC3591F3FE31919F -:10B540004F015981EBCF052F232F240151FF03C059 -:10B55000111102C09EC01FEF383619F03C3659F069 -:10B5600011C0F401F3FC2591F3FE21912F0128363F -:10B5700049F4052F08600460F201F3FC2591F3FE05 -:10B5800021912F01222309F484C0622F70E084EA04 -:10B5900096E129839CD02981892B09F47AC000FD8A -:10B5A00007C0F501E080F180C50102965C0102C090 -:10B5B000E12CF12C2E3649F4F6014681578160E0EA -:10B5C00070E0202FC701BADD73CF233689F401FF65 -:10B5D00011E0C6019DD097FD5AC0E114F10429F095 -:10B5E000F7018083C70101967C01115091F74BC090 -:10B5F0002B3551F49201A701612FC60181DE2C0188 -:10B60000892B09F040C03AC0C6012983C3DD2981D6 -:10B6100097FD3DC02F3641F128F4243619F1293623 -:10B6200031F124C0233769F02537E1F01FC0E11460 -:10B63000F10429F0F7018082C70101967C011150C5 -:10B6400059F0C60165D04C0197FD06C038D0892B52 -:10B6500071F3B601C401D2D0E114F104A1F0F701F5 -:10B66000108211C0006203C0006101C00064202F7D -:10B67000A701612FC601A4DD811105C0F6018381F8 -:10B68000807329F406C000FD13CF739411CF772087 -:10B6900019F0872D90E002C08FEF9FEF0F90DF91A0 -:10B6A000CF911F910F91FF90EF90DF90CF90BF90BF -:10B6B000AF909F908F907F905F904F9008959111E1 -:10B6C00014C1803219F089508550D0F70895FC01DB -:10B6D0000590061621F00020D9F7C0010895319792 -:10B6E000CF010895FC010590615070400110D8F71A -:10B6F000809590958E0F9F1F0895FC0161507040BA -:10B7000001900110D8F7809590958E0F9F1F089596 -:10B71000CF93DF93EC012B8120FF33C026FF0AC0BB -:10B720002F7B2B838E819F8101968E839F838A81BD -:10B7300090E029C022FF0FC0E881F9818081082EA6 -:10B74000000C990B009719F420622B831AC03196D4 -:10B75000E883F9830EC0EA85FB85199597FF09C038 -:10B760002B81019611F080E201C080E1822B8B8356 -:10B7700008C02E813F812F5F3F4F2E833F83992743 -:10B7800002C08FEF9FEFDF91CF9108950F931F932A -:10B79000CF93DF93FB01238121FD03C08FEF9FEF48 -:10B7A00028C022FF16C04681578124813581421767 -:10B7B000530744F4A081B1819D012F5F3F4F208347 -:10B7C00031838C93268137812F5F3F4F26833783C8 -:10B7D00010C0EB01092F182F0084F185E02D199579 -:10B7E000892BE1F68E819F8101968E839F83812F25 -:10B7F000902FDF91CF911F910F910895FB0123812D -:10B8000020FF12C026FD10C08F3F3FEF930761F06D -:10B8100082832F7D20642383268137812150310943 -:10B8200026833783992708958FEF9FEF0895FA01B4 -:10B83000AA27283051F1203181F1E8946F936E7F6F -:10B840006E5F7F4F8F4F9F4FAF4FB1E03ED0B4E060 -:10B850003CD0670F781F891F9A1FA11D680F791FA1 -:10B860008A1F911DA11D6A0F711D811D911DA11DB2 -:10B8700020D009F468943F912AE0269F11243019C2 -:10B88000305D3193DEF6CF010895462F4770405D5D -:10B890004193B3E00FD0C9F7F6CF462F4F70405D0C -:10B8A0004A3318F0495D31FD4052419302D0A9F767 -:10B8B000EACFB4E0A6959795879577956795BA9561 -:10B8C000C9F700976105710508959B01AC010A2E27 -:10B8D00006945795479537952795BA95C9F7620FFE -:10B8E000731F841F951FA01D089599278827089509 -:10B8F00003D0808199270895E0ECF1E0378537FD8A -:10B90000FDCF348538603487FC01E050F04F089556 -:10B91000262FF2DF0080021611F008D00197019760 -:10B9200008950196272FF5DFF3CF262FE0ECF1E005 -:10B93000378537FDFDCF3485377F3487378531FF35 -:10B9400009C036E3328738ED34BF31E033873785BD -:10B9500037FDFDCF33E332878083918312822483C6 -:10B9600025E3228728ED31E024BF3387019608952F -:10B97000052E97FB16F400940FD057FD05D014D078 -:10B9800007FC02D046F408C05095409530952195AB -:10B990003F4F4F4F5F4F08959095809570956195FB -:10B9A0007F4F8F4F9F4F0895A1E21A2EAA1BBB1BFA -:10B9B000FD010DC0AA1FBB1FEE1FFF1FA217B3077B -:10B9C000E407F50720F0A21BB30BE40BF50B661F91 -:10B9D000771F881F991F1A9469F760957095809555 -:10B9E00090959B01AC01BD01CF010895F894FFCF64 -:10B9F00002400F00831000000104100000018208C3 -:10BA000000000100000000000000000000009001A4 -:10BA1000010001000000000000006D247424742463 -:10BA200080248C249624B324C124EA24ED24F12418 -:10BA30006C27CE26E326E726FC262D2740276D27F8 -:10BA40003E000426140004043E00042E040C0404EA -:10BA500000080008000000000000000800080808B6 -:10BA60000808080008000800000008080008080886 -:10BA700000800080000000000000008000808080C6 -:10BA800080808000800080000000808000808080B6 -:10BA900000010001000000000000000100010101A0 -:10BAA000010101000100010000000101000101018C -:10BAB0000000000000000000000000000000000086 -:10BAC0000101010101010101010101010101010166 -:10BAD0000101010101010101010101010101010156 -:10BAE0000101010101010101010101010101010146 -:10BAF0000000000000000000000000000000000046 -:10BB00000000000000000000000000000000000035 -:10BB10000000000000000000000000000000000025 -:10BB20000101010101010101010101010101010105 -:10BB30000000000000000000000000000000000005 -:10BB400000000000000000000000000000000000F5 -:10BB500001010101010101010101010101010101D5 -:10BB600000000000000000000000000000000000D5 -:10BB700001010101010101010101010101010101B5 -:10BB800001010101010101010101010101010101A5 -:10BB900000000000000000000000000000000000A5 -:10BBA0000101010101010101010101010101010185 -:10BBB0000000000202000002000202020200000275 -:10BBC0000000000202000002000202020200000265 -:10BBD0000000000202000002000202020200000255 -:10BBE0000404040606040406040606060604040605 -:10BBF00004040406060404060406060606040406F5 -:10BC00000000000202000002000202020200000224 -:10BC10000000000202000002000202020200000214 -:10BC200004040406060404060406060606040406C4 -:10BC300000000002020000020002020202000002F4 -:10BC400004040406060404060406060606040406A4 -:10BC50000404040606040406040606060604040694 -:10BC60000404040606040406040606060604040684 -:10BC70000404040606040406040606060604040674 -:10BC800000000002020000020002020202000002A4 -:10BC90000000000202000002000202020200000294 -:10BCA0000404040606040406040606060604040644 -:10BCB0000008080800000008000008000808000844 -:10BCC0000008080800000008000008000808000834 -:10BCD0000008080800000008000008000808000824 -:10BCE0001018181810101018101018101818101814 -:10BCF0001018181810101018101018101818101804 -:10BD000000080808000000080000080008080008F3 -:10BD100000080808000000080000080008080008E3 -:10BD200010181818101010181010181018181018D3 -:10BD300000080808000000080000080008080008C3 -:10BD400010181818101010181010181018181018B3 -:10BD500010181818101010181010181018181018A3 -:10BD60001018181810101018101018101818101893 -:10BD70001018181810101018101018101818101883 -:10BD80000008080800000008000008000808000873 -:10BD90000008080800000008000008000808000863 -:10BDA0001018181810101018101018101818101853 -:10BDB000546F6F206D616E7920646174612E000D87 -:10BDC0000A000D0A504152495459204552524F52CF -:10BDD000000D0A504152495459204F4B00253475EB -:10BDE0003A2000556E6B6E6F776E2063617264202F -:10BDF000747970652E002573206F7220004E4F20DD -:06BE000044415441000022 +:10546000E091692EF0916A2E8781893019F483E1E9 +:105470008093132C8681893019F483E18093122C58 +:1054800044B155B1495F5F4F33E0569547953A9522 +:10549000E1F7E091662EF091672E6BEB70E383E409 +:1054A000199504B115B1013094E0190708F024C131 +:1054B00014B815B8A801495F5F4F23E0569547958A +:1054C0002A95E1F76BEB70E38BE391E30E94AB5419 +:1054D0008BEB90E38AB99BB986B18695806886B9D3 +:1054E00084B195B1019684B995B987709927892BB4 +:1054F00039F48CEB90E38AB99BB986B18093BB30C9 +:1055000086B1869586B984B195B1019684B995B96D +:1055100087709927892B41F4EAB1FBB1CF0101963D +:105520008AB99BB986B1808380E041E050E0EBE32B +:10553000F1E30417150708F495C0908190FF2BC084 +:1055400086B1869586B984B195B1019684B995B92D +:1055500087709927892B41F4AAB1BBB1CD0101967F +:105560008AB99BB986B18C9386B18695806886B9D5 +:1055700084B195B1019684B995B987709927892B23 +:1055800009F063C0AAB1BBB1CD0101968AB99BB93C +:1055900086B18C935AC0882351F186B1869586B91D +:1055A00084B195B1019684B995B987709927892BF3 +:1055B00041F4AAB1BBB1CD0101968AB99BB986B1BC +:1055C0008C9386B1869586B984B195B1019684B9DC +:1055D00095B987709927892B41F4AAB1BBB1CD0148 +:1055E00001968AB99BB986B18C9380E02FC096B1A1 +:1055F0009695906896B924B135B12F5F3F4F24B985 +:1056000035B927703327232B49F4AAB1BBB19D01CB +:105610002F5F3F4F2AB93BB996B19C9396B19695AF +:1056200096B924B135B12F5F3F4F24B935B92770F2 +:105630003327232BD1F6AAB1BBB19D012F5F3F4F7A +:105640002AB93BB996B19C9301C081E090819695AF +:1056500090839A0127703327232B09F431964F5FEB +:105660005F4F67CF811129C086B18695806886B962 +:1056700084B195B1019684B995B987709927892B22 +:1056800041F4EAB1FBB1CF0101968AB99BB986B169 +:10569000808386B1869586B984B195B1019684B927 +:1056A00095B987709927892B41F4EAB1FBB1CF01F5 +:1056B00001968AB99BB986B1808384B195B1877010 +:1056C0009927892BC9F0E4B1F5B186B144B155B140 +:1056D00093E0F695E7959A95E1F7E554FF4C90E055 +:1056E0004770552728E030E0241B350B02C0959504 +:1056F00087952A95E2F7808381E08093372C8BEBA6 +:1057000090E38AB99BB980E280930C098CE0809386 +:10571000070985E58A95F1F7D395CDBFDEBFDF9107 +:10572000CF911F910F91089514B815B881E080931F +:105730003A2C0C94E7221092070A1092000A109259 +:10574000470910924009809181038E7F80938103E5 +:1057500084B195B180FF1AC0379B03C086B186958E +:1057600003C086B18695806886B984B195B10196EB +:1057700084B995B987709927892B41F4EAB1FBB1B7 +:10578000CF0101968AB99BB986B1808384B195B166 +:1057900087709927892BC9F0E4B1F5B186B144B17E +:1057A00055B193E0F695E7959A95E1F7E554FF4CEE +:1057B00090E04770552728E030E0241B350B02C0ED +:1057C000959587952A95E2F7808381E080933B2C1D +:1057D00010923C2C8FEF9FEF8093260A9093270A1C +:1057E0001092200A1092210A1092060A1092070ABB +:1057F0001092030A84E08093000A83E08093372CA0 +:105800001092372C10923B2C10923A2C0C940D23B2 +:10581000982F8091452C882359F080913F2C81113D +:1058200008C081E020913E2C921718F080E0089586 +:1058300081E00895FF920F931F93CF93DF931F9200 +:10584000CDB7DEB70091422C000F000F0051FF24AE +:10585000F394F092452C10E0B8016D5F7F4F41E06A +:1058600050E08EE39CE20E940C0FB8016C5F7F4F0A +:1058700041E050E0CE0101960E940C0F8981881F03 +:105880008827881F80933D2CF092442C1092432C43 +:1058900010923F2C1092412C0F90DF91CF911F91CD +:1058A0000F91FF9008951092452C80E18093422C37 +:1058B0008FEF80933E2C10923D2C81E08093442CFE +:1058C0001092432C10923F2C1092412C089584E1A9 +:1058D0008093422CAFCF89E28093422CABCF81E002 +:1058E0008093442C089508958F929F92AF92BF9217 +:1058F000CF92DF92EF92FF920F931F93CF93DF939C +:1059000000D01F92CDB7DEB78C01FC018081909151 +:10591000442C9230E1F028F0933011F1943051F1A1 +:105920004EC0292F209521702093432C992311F0EC +:10593000863219F0823509F042C084E4F801808390 +:10594000118282E08093442C80E190E0DBC2909150 +:10595000432C911102C08632B1F0823599F513C003 +:105960009091432C911102C0863269F0823509F082 +:105970005BC009C09091432C911102C0863219F08E +:10598000823509F0F3C084E4F8018083118281E05C +:10599000892713C08091412C8111FCC0F8018081BE +:1059A000803509F476C108F006C1803309F409C1D5 +:1059B0009091452C911174C181E08093442C80E03A +:1059C00090E0A0C28339C1F719821A821B821C821F +:1059D00088E8898343E050E060E070E0CE01029601 +:1059E0000E940C0FF8018181803209F4ABC080372E +:1059F00009F047C0F801928189819813B2C0938160 +:105A00008A819813AEC094818B819813AAC0958126 +:105A10008C819813A6C084E0808361E070E0C801A7 +:105A20000E943D3783E029C0853931F644E050E0DB +:105A300064E070E0CE0101960E940C0FF8018181B4 +:105A4000803209F47FC08037E1F4F80192818981C6 +:105A5000981387C093818A81981383C094818B8126 +:105A600098137FC095818C8198137BC0108261E070 +:105A700070E0C8010E943D3784E08093442C38E1F7 +:105A800071C0E82EE294AFE0EA22EA94EA948F70C3 +:105A9000F82E88E090E08F1991092FEF30E069012E +:105AA00002C0D594C7948A95E2F7F5E0EF1629F085 +:105AB00024E0E2122AC0FF20E1F044E050E0B80107 +:105AC0006E5F7F4FCE0101960E949E54892B61F438 +:105AD00099818A8189279B8189279C818927F8015F +:105AE000968189278C2171F1F4E0EF120EC0F1103C +:105AF00038C044E050E0B8016E5F7F4FCE010196A0 +:105B00000E949E54892BF1F02CC023E02E1548F101 +:105B1000F12CA701B8016E5F7F4FCE0101960E9464 +:105B20009E54892BF1F4D801AE0DBF1DE1E0F0E0E9 +:105B3000EC0FFD1FEE0DFF1D12969C9180818927B1 +:105B4000C82279F43981F80130832A8121839B812D +:105B500092838C818383232792278927848338E249 +:105B600001C030E020E0832F922FCCC1695F7F4FCE +:105B700083E0769567958A95E1F76330710508F4BF +:105B80001BCF62507109C8010E946837811102CF92 +:105B900081E092C11092412C8091652E81118BC1C0 +:105BA0006091402CF4E06F9FB001112444E050E07C +:105BB000C80102967EC1803A09F455C0823AC1F10B +:105BC000F7CEF801F1808091452C882359F080911F +:105BD0003D2C882339F080913F2C811103C0E09047 +:105BE0003E2C02C0E090422CFE1410F0F80131C1AE +:105BF000C12CD12CF4E0FF9EB001112444E050E010 +:105C0000C8018C0D9D1D0E940C0FF394EF1001C074 +:105C1000F12C24E0C20ED11C80E1C816D10451F74A +:105C200060E170E0C8010E943D3780E990E06AC100 +:105C3000F801F180F1E0FF15C8F68091422CF816CA +:105C4000A8F68F2DE5DD882309F4C2C0C8010296AD +:105C50002091652E21112FC1F4E0FF9EB001112487 +:105C600044E050E026C1F801F180F1E0FF1508F0B2 +:105C7000BDCF8091422CF81608F0B8CF8F2DC8DD2B +:105C8000882309F4A5C0F092402C81E08093412C38 +:105C900012C1F80181818111A9CF1092442C8FCEBD +:105CA0008C3309F40EC148F4893309F4A6C08A3351 +:105CB00091F18B3109F080CE6AC08B3409F40FC1A9 +:105CC00038F48E3309F078CE8DEBF801808314C15F +:105CD000803621F0853A09F4ABC06ECEF80110820F +:105CE00084E0818383E0828381E0838384831582DF +:105CF0008091422C843111F08EE001C08BE0F801DC +:105D0000868383E0878368E070E0C8010E943D37A6 +:105D100080E590E0F7C0F801D180E280ED1408F44E +:105D200065CF8091422CD81608F060CFE81608F0B5 +:105D30005DCF80913D2C882351F08D2D69DD882326 +:105D400009F446C08E2D64DD882309F441C0F12C8E +:105D50006D2D70E0E61AF70AFFEFEF1AFF0AEE0C5E +:105D6000FF1CEE0CFF1C660F771F660F771FA70145 +:105D7000C8010E940C0FB701C8010E943D37C7013E +:105D80000296F3E0880F991FFA95E1F7BBC0609186 +:105D9000422C660F660F6051E62EF12CB701685F4A +:105DA0007F4F44E050E0CE0101960E940C0F998194 +:105DB000F801818198130CC09A818281981308C0E0 +:105DC0009B818381981304C09C818481981711F072 +:105DD00086E072C081E080933F2CB701645F7F4F03 +:105DE00042E050E0C8010E940C0F62E070E0C80180 +:105DF0000E943D3780E290E085C0F8016181633008 +:105E000008F0F4CE8091422C70E0680F711D660F8F +:105E1000771F660F771F43E050E0C8010E940C0F08 +:105E200063E070E0C8010E943D3788E290E06AC0FC +:105E3000F8012181E22EF12C9E2D8827856A092EFA +:105E4000000CAA0BBB0B32814C015D01A32A23304D +:105E500010F0108233C08091422CB701680F711D81 +:105E6000660F771F660F771F44E050E0CE01019662 +:105E70000E940C0F89819A81AB81BC81880D991D8C +:105E8000AA1DBB1D89839A83AB83BC830097A105A0 +:105E9000B14010F084E010C08091422CB701680F2F +:105EA000711D660F771F660F771F44E050E0CE012B +:105EB00001960E945A0F8AE0F801808384E090E006 +:105EC00021C040E250E06AEC70E0C8010E94C55475 +:105ED00060E270E0C801D1D780E191E013C0609129 +:105EE000422C660F660F605170E06B5F7F4F41E0A0 +:105EF00050E0C8010E940C0F61E070E0C801BDD7FE +:105F000088E190E02496CDBFDEBFDF91CF911F9155 +:105F10000F91FF90EF90DF90CF90BF90AF909F9048 +:105F20008F900895CF93DF93EC0143E050E060E061 +:105F300070E00E940C0F44E050E064E070E0CE019D +:105F40000396DF91CF910C940C0F0F931F93CF9377 +:105F5000DF931F921F92CDB7DEB78C01FC019081B9 +:105F60008181892798E88927928189278A8393816B +:105F7000848189279581892796818927898343E0B0 +:105F800050E060E070E0C8010E945A0F41E050E02C +:105F900063E070E0CE0102960E945A0F44E050E0A8 +:105FA00064E070E0C80103960E945A0F41E050E09F +:105FB00068E070E0CE0101960E945A0F0F900F909A +:105FC000DF91CF911F910F91089581E08093692C0B +:105FD00084E090E08093482C9093492C88E0809353 +:105FE000472C1092462C089581E08093692C84E41C +:105FF00090E08093482C9093492C88E08093472C24 +:106000001092462C089581E08093692C82E090E004 +:106010008093482C9093492C88E18093472C1092D0 +:10602000462C089581E08093692C089508958F92FD +:106030009F92AF92BF92CF92DF92EF92FF920F9317 +:106040001F93CF93DF93CDB7DEB76297CDBFDEBF8F +:106050008C015B018091692C6730710501F5F801B5 +:106060009081882311F0963211F09235C1F421E02D +:10607000811120E02093462C882311F0963211F0F4 +:10608000923559F49091482C8091492CF8019083D5 +:1060900081838FEF80934A2C37C0A12CB12C85309F +:1060A00009F497C050F48230A1F1C8F0833009F4AC +:1060B00068C0843009F481C0ACC5883009F41CC1C3 +:1060C00038F4863009F491C0873009F4CAC0A1C5FC +:1060D000893009F441C38D3008F463C39AC5982F01 +:1060E000909591709093462CF8019081882311F03F +:1060F000963219F0923509F006C49091482C80919F +:10610000492CF8019083818384E08093692C80E19D +:1061100081C5F8018081982F9D7F913419F48AE020 +:1061200080835AC38033C1F462E070E0C801D0D6E6 +:10613000882309F494C0F8016181F0E16F9FB001F8 +:10614000112440E150E0C8010E940C0F60E170E0B2 +:10615000C80193D680E95EC5803A79F462E070E0C8 +:10616000C801B6D6882309F47AC0F80181818093EA +:10617000602C83E08093692CD2CF803509F049C52B +:106180004AC060E170E0C801A3D6882389F08091FD +:10619000652E81110BC06091602CF0E16F9FB00102 +:1061A000112440E150E0C8010E945A0F8AE001C06A +:1061B00081E0F801808382E00DC39091462CF801C4 +:1061C0008081911102C08632D1F0823509F0A3C3DB +:1061D00016C09091462CF8018081911102C0863240 +:1061E00071F0823509F045C40AC09091462CF8013F +:1061F0008081911102C0863211F0823551F42091D4 +:10620000482C8091492CF8012083818381E08927E3 +:1062100077C38035C9F4F8018181882319F0F8012A +:106220001082DAC262E070E0C80152D68823B9F069 +:10623000E091662EF091672E40E060E070E081E929 +:1062400019951092692CE5C490EA980F923008F0E5 +:10625000B4C462E070E0C8013BD68111DDC481E0C6 +:106260004FC2C8010E94F13C64E07801F4E0EF0EF7 +:10627000F11CC7010E940D40E091662EF091672E3F +:1062800044E0B70180EA1995F80194818091612C6E +:10629000981329C095818091622C981324C096810F +:1062A0008091632C98131FC097818091642C981360 +:1062B0001AC08091652C80838091662C81838091A7 +:1062C000672C82838091682C838364E0C8010E94DC +:1062D0002642E091662EF091672E44E0B80181EAF3 +:1062E000199588E004C2E091662EF091672E44E093 +:1062F00061E67CE280EC2DC2F8018081803551F4AA +:106300008181811107C08281873521F483818D3C91 +:1063100009F405C264E0C8010E940D40F8018081C3 +:10632000803309F0BDC062E070E0C801D1D5882398 +:1063300009F4A7C0F801618167FD04C0862F83704E +:10634000833029F0862F8F708F3009F07FC06093E3 +:10635000602C80914B2C90914C2C30914D2C282FFF +:1063600022952095492F4227407F09F03FC02327DF +:106370002F70E1F5929590959327907FB9F5262F90 +:1063800067FD02C0237003C02F7009F023E08095E1 +:10639000432F42954F702223B1F090E0022E02C0AD +:1063A000959587950A94E2F7E32FF0E0022E02C05C +:1063B000F595E7950A94E2F73E2F50E002C0559517 +:1063C00047952A95E2F740FBCC24C0F8D12CF60182 +:1063D000EE0FFF1FEE0FFF1F30FBEE24E0F8F12C55 +:1063E000EE0CFF1CEE298170E82B01C0E7E0F0E025 +:1063F00080915F2CEE0FFF1FE05CFF4DE80FF11D59 +:106400008081F8019801205F3F4F11922E173F07BE +:10641000E1F790914E2CF801918782FF09C090918D +:106420004B2C968390914C2C978390914D2C908778 +:1064300084FF15C06360F0E16F9FB0011124665FB7 +:106440007F4F46E050E0C8010A9607C080E1689F90 +:10645000B001112440E150E0C8010E940C0F60E13E +:1064600070E0C8010AD5E091662EF091672E42E1F6 +:10647000B80180E8199562E1C8010E94264280E9CE +:1064800039C10E94183F91E08927F8018083E0918B +:10649000662EF091672E44E0B80181EC19959CC1FD +:1064A000803A61F462E070E0C80112D58823D9F126 +:1064B000F80181818093602C89E00DC0803C89F4D3 +:1064C00062E070E0C80104D5882369F1F801818198 +:1064D0008093602C8BE08093692C0E94183F9AE097 +:1064E0000EC1813C91F462E070E0C801F1D48823D0 +:1064F000D1F0F80181818093602CFAE0FF2EF092B8 +:10650000692C0E94183F8F25FBC0823C99F462E001 +:1065100070E0C801DDD4882331F0F80181818093D7 +:10652000602C8CE0D8CFE091662EF091672E44E08D +:10653000B80121C0803B11F562E070E0C801C8D409 +:10654000E091662EF091672E44E0B801882399F01F +:1065500086E819958091652E8111BFCFF801618180 +:10656000F0E16F9FB001112440E150E08FE49CE224 +:106570000E945A0FB2CF81EC1995BEC090EA980FD5 +:10658000923008F0BFC062E070E0C801A1D4882357 +:1065900009F4B2C0F8018081803621F0EAE3CE2E02 +:1065A000D12C03C070E3C72ED12CF801818187FF65 +:1065B0000CC0807FF0E18F9F7001112480ECC80E29 +:1065C000D11C66EFA62EB12C08C08C7F90E1899F6C +:1065D0007001112456E3A52EB12CE091662EF091A6 +:1065E000672E42E0B80180E91995F8018081817039 +:1065F00080935F2CC70144E0969587954A95E1F713 +:106600008093602C90914A2C981769F0B5016E0D1B +:106610007F1D44E050E08BE49CE20E940C0F8091CF +:10662000602C80934A2C68E0CE0101960E945D0E9A +:106630008091642E44E050E0873019F463E070E00C +:1066400002C060E070E0CE010F960E940C0FB60110 +:106650006E0D7F1D46E050E0CE0109960E940C0FA2 +:1066600089818093612C8A818093622C8B818093B5 +:10667000632C8C818093642C60E481E69CE20E9410 +:1066800040448091612C8093652C8091622C809392 +:10669000662C8091632C8093672C8091642C80936E +:1066A000682C60E285E69CE20E94404420E0AE0156 +:1066B0004F5F5F4FBE01615F7F4FCE010996E6D607 +:1066C0008981F80180838A8181838B8182838C8197 +:1066D0008383E058FF4F8D81808331968E81808344 +:1066E00031968F81808331968885808387E080937F +:1066F000692C80E290E16CC30E94183F91E08927E9 +:10670000F8010ECD8035B9F4F8018181811187CD72 +:1067100062E070E0C801DCD3882309F4A0CD1092B8 +:10672000692CE091662EF091672E40E060E070E009 +:1067300081E919956EC2A501495F5F4F33E0569517 +:1067400047953A95E1F7E091662EF091672EB801F2 +:1067500082E9199581E0D4C062E1C8010E940D4030 +:1067600060E170E0C801B4D3E091662EF091672E2D +:10677000882329F142E1B80181E819958091652EBD +:1067800081110BC06091602CF0E16F9FB00111246A +:1067900040E150E0C8010E945A0F0E94183F9AE061 +:1067A00015C066E0C8010E940D4064E070E0C801B9 +:1067B0008FD3811113C0E091662EF091672E44E0D3 +:1067C000B80181EC19950E94183F91E08927F801E2 +:1067D000808388E08093692C84E01CC26091602CE7 +:1067E000F0E16F9FB001112440E150E08FE49CE2A2 +:1067F0000E940C0F90914F2C8091532C80959813F0 +:10680000E3C28091572C9813DFC29091502C809155 +:10681000542C80959813D8C28091582C9813D4C2C8 +:106820009091512C8091552C80959813CDC28091D8 +:10683000592C9813C9C29091522C8091562C809556 +:106840009813C2C280915A2C9813BEC290915B2CAF +:1068500080915C2C80959813B7C280915D2C981321 +:10686000B3C280915E2C80959813AEC2C0904F2C1D +:10687000D090502CE090512CF090522CF801808058 +:106880009180A280B3808091692C8B3009F081C205 +:10689000E091662EF091672E46E0B80185E81995E3 +:1068A000C818D908EA08FB08C0924F2C33272F2DAF +:1068B0001E2D0D2D0093502CA7016627772740939E +:1068C000512C8F2D9927AA27BB278093522CEC2D72 +:1068D000E095E093532CE02FE095E093542CE42FC7 +:1068E000E095E093552CE82FE095E093562CC0926C +:1068F000572C0093582C4093592C80935A2C88E0A5 +:106900008093692C86C1903409F083C182E0809322 +:10691000692C8AE0F5CE833909F093CC8091642EFE +:10692000873009F0A1C043E050E060E070E0CE01A4 +:1069300002960E940C0F88E88983F80191819032B9 +:1069400019F0903761F024C0F80180833A813183D7 +:106950002B8122839C819383232782272AC1F801DC +:106960008281883809F055C193818A81981351C179 +:1069700094818B8198134DC195818C81981349C165 +:1069800084E0808361E070E0C80177D285E09FC039 +:10699000E92EE294EFE0EE22EA94EA949F70F92E59 +:1069A00088E090E08F1991092FEF30E0690102C073 +:1069B000D594C7948A95E2F7F5E0EF1629F084E0C4 +:1069C000E8122AC0FF20E1F044E050E0B8016E5F19 +:1069D0007F4FCE0101960E949E54892B61F49A81CB +:1069E0008B81892798E889279C818927F8019681DE +:1069F00089278C2189F1F4E0EF120EC0F11009C152 +:106A000044E050E0B8016E5F7F4FCE0101960E94D6 +:106A10009E54892B09F1FDC083E08E1508F4F9C05E +:106A2000F12CA701B8016E5F7F4FCE0101960E9445 +:106A30009E54892B09F0EDC0D801AE0DBF1DE1E0D9 +:106A4000F0E0EC0FFD1FEE0DFF1D12969C91808172 +:106A50008927C82209F0DDC098E8F80190833A81BF +:106A600031832B812283A1C044E050E060E070E0DC +:106A700007C0853909F0E5CB44E050E063E070E001 +:106A8000CE0101960E940C0FF8018181803209F439 +:106A900085C0803701F5F801928189819813B9C0CA +:106AA00093818A819813B5C094818B819813B1C06A +:106AB00095818C819813ADC08091472C808361E0D3 +:106AC00070E0C801DAD18FEF80934A2C86E0809382 +:106AD000692C88E19FC0E82EE2947FE0E722EA94E7 +:106AE000EA948F70F82E88E090E08F1991092FEFCB +:106AF00030E0690102C0D594C7948A95E2F7F5E0C9 +:106B0000EF1629F084E0E8122AC0FF20E1F044E00B +:106B100050E0B8016E5F7F4FCE0101960E949E54F7 +:106B2000892B61F499818A8189279B8189279C819E +:106B30008927F801968189278C2181F1F4E0EF12F1 +:106B40000EC0F11066C044E050E0B8016E5F7F4FA8 +:106B5000CE0101960E949E54892B01F15AC083E018 +:106B60008E1508F456C0F12CA701B8016E5F7F4F57 +:106B7000CE0101960E949E54892B09F04AC0D8018B +:106B8000AE0DBF1DE1E0F0E0EC0FFD1FEE0DFF1DAF +:106B900012969C9180818927C822D9F53981F80104 +:106BA00030832A8121839B8192838C818383232755 +:106BB00092278927848388E22DC0823C09F0CBC0CC +:106BC000F8018181803E09F0CFC08281843B09F0C9 +:106BD000CBC046E050E06AEA74E0CE0101960E9424 +:106BE0000C0F89818B3409F03ACB8A81893709F0FF +:106BF00036CB8B818B3109F032CB8C818A3E09F008 +:106C00002ECB8D818B3709F02ACB8E818C3C09F0FD +:106C100026CB80E090E0DCC0F8018081803621F056 +:106C20006AE3C62ED12C03C050E3C52ED12CF80147 +:106C3000818187FF0CC0807FF0E18F9F700111245C +:106C400080ECC80ED11C46EFA42EB12C08C08C7F5E +:106C500090E1899F7001112436E3A32EB12CE091BD +:106C6000662EF091672E42E0B80180E91995F8018F +:106C70008081817080935F2CC70124E09695879571 +:106C80002A95E1F78093602CB5016E0D7F1D44E0DD +:106C900050E08BE49CE20E940C0F8091602C80936A +:106CA0004A2C68E0CE0101960E945D0E8091642E10 +:106CB00044E050E0873019F463E070E002C060E027 +:106CC00070E0CE010F960E940C0FB6016E0D7F1D75 +:106CD00046E050E0CE0109960E940C0F8981809316 +:106CE000612C8A818093622C8B818093632C8C81B0 +:106CF0008093642C60E481E69CE20E944044809191 +:106D0000612C8093652C8091622C8093662C8091FD +:106D1000632C8093672C8091642C8093682C60E2B4 +:106D200085E69CE20E94404487E08093692C89813B +:106D3000F80180838A8181838B8182838C81838324 +:106D4000AE014F5F5F4FBE01615F7F4FCE0109967D +:106D5000F0D080E25FCF982F9F77903329F0803A70 +:106D600019F0805C833078F481E08093692C84E0B2 +:106D7000F8018083E091662EF091672E40E060E09C +:106D800070E082EC8BCBE091662EF091672E40E0B4 +:106D9000DECC8A3069F4E091662EF091672E46E0F1 +:106DA000B80184E81995C80CD91CEA1CFB1C7CCDE1 +:106DB0008C3009F079CDE091662EF091672E46E097 +:106DC000B80187E8199570CD0E94183F96E0FECC77 +:106DD0006296CDBFDEBFDF91CF911F910F91FF90E3 +:106DE000EF90DF90CF90BF90AF909F908F900895DD +:106DF000CF93DF932091642E273071F4EC0143E0B0 +:106E000050E060E070E00E940C0F44E050E063E06E +:106E100070E0CE01039604C044E050E060E070E012 +:106E2000DF91CF910C940C0FCF93DF931F92CDB7CE +:106E3000DEB72091642E273029F447E050E060E06F +:106E400070E015C0FC013081218123273281232786 +:106E500033812327298344E050E060E070E00E9402 +:106E60005A0F41E050E064E070E0CE0101960E94CC +:106E70005A0F0F90DF91CF91089520E42093D00016 +:106E800026EC2093D5002093D40021E02093D0005D +:106E9000DC01680F791FA617B70741F0ED91F0E00C +:106EA000EE51FA4FE491E093D300F5CFE091D50095 +:106EB000F0E0EE51FA4FE491EC93E091D400F0E071 +:106EC000EE51FA4FE4911196EC931092D000089590 +:106ED00020E42093D00026EC2093D5002093D4000A +:106EE00021E02093D000DC01680F791FA617B707B7 +:106EF00041F0ED91F0E0EE51FA4FE491E093D300D0 +:106F0000F5CFE091D500F0E0EE51FA4FE4918C918D +:106F10008E130AC0E091D400F0E0EE51FA4FE491F4 +:106F200081E011969C919E1380E01092D0008170B8 +:106F300008958F929F92BF92CF92DF92EF92FF922D +:106F40000F931F93CF93DF93DC018C91D12C30E012 +:106F50008695D794869537958695D7948695379557 +:106F60008695D794869537958695D7948695379547 +:106F700011968C9111978695D7948695379586951D +:106F8000D794869537958695D79486953795869527 +:106F9000D7948695379512968C911297F0E010E071 +:106FA0008695F795869517958695F7958695179505 +:106FB0008695F795869517958695F79586951795F5 +:106FC00013968C9113978695F795869517958695C8 +:106FD000F795869517958695F795869517958695D5 +:106FE000F7958695179514968C91149790E020E06C +:106FF0008695979586952795869597958695279555 +:107000008695979586952795869597958695279544 +:107010001596EC91E6959795E6952795E6959795C3 +:10702000E6952795E6959795E6952795E6959795A4 +:10703000E69527954B01DA014C5F5F4F0C91E40117 +:10704000B9904E01B026C32FD0E0BE0160557F4DF0 +:107050007B01612F70E060557E4DE701F880EB0108 +:1070600088816F2D682BE22EF12CE701C055DD4D94 +:107070008881682B70E060577F4DEB018881869591 +:10708000E7956F2F60718D2D817E6827892F807223 +:107090006827832F84796827812F83776827822F39 +:1070A0008A736827F62EF2946F25762F769576955B +:1070B0006727FB2CF6266695F6267D2D6F2F892FE8 +:1070C000F694879567957795B694C72ED12CE601EF +:1070D000C055DF4D6E01E62EF12CE701C055DE4DA7 +:1070E0007E01E601F881E7019881EF2EE92AC82E9A +:1070F000D12CE601C055DD4D9881E92AF12CE7013C +:10710000C057DF4D98819695E795F12FF071932F39 +:10711000917EEF2EE926922F9072E926972F94798F +:10712000E926962F9377E926982F9A73E926FE2C65 +:10713000F294EF24CE2CC694C694EC24FB2CFE24AF +:10714000E694FE24F694279517953795B694C32EAA +:10715000D12CE601C055DF4D6E01E12EF12CE70187 +:10716000C055DE4D7E01E601F881E7019881EF2EE2 +:10717000E92AC22ED12CE601C055DD4D9881E92ABD +:10718000F12CE701C057DF4D98819695E795F62FD2 +:10719000F071972F917EEF2EE926982F9072E926B5 +:1071A000932F9479E926912F9377E926922F9A735A +:1071B000E926FE2CF294EF24CE2CC694C694EC243F +:1071C000FB2CFE24E694FE24F82FF694F7956795A1 +:1071D0007795B694872F90E0EC01C055DF4D862F50 +:1071E00090E080559E4DF880EC0188818F29EF2E2C +:1071F000F12CE701C055DD4D9881892B90E0805737 +:107200009F4DEC0188818695E795912F9071832F92 +:10721000817EE92EE826822F8072E826872F8479E6 +:10722000E826862F8377E8268F2F8A73E826FE2CA0 +:10723000F294EF24CE2CC694C694EC24FB2CFE24AE +:10724000E694FE24F694279517953795B694832FE8 +:1072500090E0EC01C055DF4D812F90E080559E4DB0 +:10726000F880EC0188818F29E22EF12CE701C055CE +:10727000DD4D9881892B90E080579F4DEC018881EE +:107280008695E795962F9071872F817EF92EF826A7 +:107290008F2F8072F826832F8479F826812F8377A9 +:1072A000F826822F8A73F8269F2D9295F926EF2CC7 +:1072B000E694E694FE249B2D9F25F6949F258F2F20 +:1072C0009695879567957795B694C72ED12CE6014C +:1072D000C055DF4D6E01E62EF12CE701C055DE4DA5 +:1072E0007E01E601F881E7019881EF2EE92AC82E98 +:1072F000D12CE601C055DD4D9881E92AF12CE7013A +:10730000C057DF4D98819695E795F12FF071932F37 +:10731000917EF927922F9072F927972F9479F92768 +:10732000962F9377F927982F9A73F9279F2F929585 +:10733000F927FF2EF694F694FF259B2D9F27F695AF +:107340009F279695279517953795B694C32ED12CE0 +:10735000E601C055DF4D6E01E12EF12CE701C0556D +:10736000DE4D7E01E601F881E7019881EF2EE92AE2 +:10737000C22ED12CE601C055DD4D9881E92AF12CB1 +:10738000E701C057DF4D98819695E795F62FF0718C +:10739000972F917E9F27F82FF0729F27F32FF47974 +:1073A0009F27F12FF3779F27F22FFA739F27F92F4B +:1073B000F2959F27F92FF695F6959F27FB2DF92734 +:1073C0009695F927982F8F2F86959795679577959E +:1073D000D72EF62F672F70E0EB01C055DF4D6F2FD2 +:1073E00070E060557E4DF880EB0188816F2D682B31 +:1073F000E92EF12CE701C055DD4D8881682B70E046 +:1074000060577F4DEB0188818695E795632F617EFC +:10741000812F80718627622F607286276D2D647997 +:1074200086276F2F63778627692F6A738627682FD1 +:1074300062958627682F669566958627B694B82646 +:107440008695B826812FB694279587953795182F5E +:107450000E270D934A175B0709F0F0CDD0926A2CE6 +:10746000F0936B2C90936C2C30936D2C80936E2C3E +:1074700020936F2CDF91CF911F910F91FF90EF9090 +:10748000DF90CF90BF909F908F9008958F929F92A2 +:10749000AF92BF92CF92DF92EF92FF920F931F9322 +:1074A000CF93DF93FC01C62FF42EB52F8081A0E08F +:1074B00050E0869557958695A7958695579586951C +:1074C000A795869557958695A79586955795869500 +:1074D000A7958181869557958695A7958695579509 +:1074E0008695A795869557958695A79586955795E0 +:1074F0008695A795828130E040E0869547958695F0 +:1075000037958695479586953795869547958695BF +:1075100037958695479586953795838186954795C6 +:10752000869537958695479586953795869547959F +:10753000869537958695479586953795648190E031 +:1075400080E066958795669597956695879566958B +:1075500097956695879566959795669587956695AF +:107560009795B5806B2D66958795669597956695E9 +:10757000879566959795669587956695979566958F +:10758000879566959795B62EEA2FF0E0E055FF4D6A +:10759000032F10E000551E4DD081F8016081D62BDD +:1075A000092F10E000551D4DF8016081ED2FE62BED +:1075B000F0E0E057FF4DC0800C2F172FCF2DDB2FB1 +:1075C0007E01F4E0EF0EF11C7881F801B1918F019A +:1075D000B7276B2DC6946795F42FF071E52FE17EE8 +:1075E000FE27E82FE072FE27EA2FE479FE27E32F3B +:1075F000E377FE27E92FEA73FE27EF2FE295FE27B8 +:10760000DF2ED694D694FD25EB2FEF27F695EF27A6 +:1076100020FDEC25E695879547955795B695C52E9F +:10762000D12CF601E055FF4D6F01A42EB12CF501D0 +:10763000E055FE4D5F01F601D080F501C080DC28E9 +:10764000E82FF0E0E055FD4DF081ED2DEF2BF0E05F +:10765000E057FF4DC080C6946795F32FF071EA2F75 +:10766000E17EFE27E92FE072FE27E52FE479FE2771 +:10767000E42FE377FE27E82FEA73FE27EF2FE2954A +:10768000FE27DF2ED694D694FD25EB2FEF27F69517 +:10769000EF27DA2E20FDEC25E69597953795D794C0 +:1076A000CB2EC694AD2DB0E0A055BF4DE32FF0E03A +:1076B000E055FE4DAC91E081EA2BA92FB0E0A0553A +:1076C000BD4DFC91EF2BF0E0E057FF4DB081B6953A +:1076D0006795F42FF071E52FE17EFE27E82FE07229 +:1076E000FE27ED2DE479FE27E32FE377FE27E92F30 +:1076F000EA73FE27EF2FE295FE27AF2FA695A695FA +:10770000FA27EC2DEF27F695EF2720FDEB27E695DE +:10771000879547955795C694A52FB0E0A055BF4DC6 +:10772000E42FF0E0E055FE4DAC91E081EA2BA82F6C +:10773000B0E0A055BD4DFC91EF2BF0E0E057FF4DC0 +:10774000B081B6956795F32FF071ED2DE17EFE27A0 +:10775000E92FE072FE27E52FE479FE27E42FE37797 +:10776000FE27E82FEA73FE27EF2FE295FE27AF2FC3 +:10777000A695A695FA27EC2DEF27F695EF2720FD85 +:10778000EB27E69597953795D794C694AD2DB0E045 +:10779000A055BF4DE32FF0E0E055FE4DAC91E081E8 +:1077A000EA2BA92FB0E0A055BD4DFC91EF2BF0E0E6 +:1077B000E057FF4DB081B6956795F42FF071E52F36 +:1077C000E17EFE27E82FE072FE27ED2DE479FE270B +:1077D000E32FE377FE27E92FEA73FE27EF2FE295E9 +:1077E000FE27AF2FA695A695FA27EC2DEF27F69545 +:1077F000EF2720FDEB27E695879547955795C6948B +:10780000A52FB0E0A055BF4DE42FF0E0E055FE4DB0 +:10781000AC91E081EA2BA82FB0E0A055BD4DFC91C2 +:10782000EF2BF0E0E057FF4DB081B6956795F32F51 +:10783000F071ED2DE17EFE27E92FE072FE27E52FA6 +:10784000E479FE27E42FE377FE27E82FEA73FE278B +:10785000EF2FE295FE27AF2FA695A695FA27EC2DE0 +:10786000EF27F695EF2720FDEB27E69597953795BF +:10787000D794C694ED2DF0E0E055FF4DA32FB0E076 +:10788000A055BE4DF081EC91EF2BA92FB0E0A05593 +:10789000BD4DFC91EF2BF0E0E057FF4DB081B69568 +:1078A0006795F42FF071E52FE17EFE27E82FE07257 +:1078B000FE27ED2DE479FE27E32FE377FE27E92F5E +:1078C000EA73FE27EF2FE295FE27AF2FA695A69528 +:1078D000FA27EC2DEF27F695EF2720FDEB27E6950D +:1078E000879547955795A52FB0E0A055BF4DE42F3C +:1078F000F0E0E055FE4DAC91E081EA2BA82FB0E01E +:10790000A055BD4DFC91EF2BF0E0E057FF4DF0810D +:10791000F6956795B62EED2DE17E632F60716E278B +:10792000E92FE0726E27E52FE4796E27E42FE377E5 +:107930006E27E82FEA736E27E62FE2956E27E62F73 +:10794000E695E6956E27C694C6266695C62620FD62 +:10795000CF26C69497953795D794AD2DCD2CD12CA5 +:10796000F601E055FF4D6F01832E912CF401E05597 +:10797000FE4D4F01F601B081F4016081B62BC92E96 +:10798000D12CF601E055FD4D6081EB2FE62BF0E0A8 +:10799000E057FF4DC080E72FF0E0EE51FB4FE49140 +:1079A000EC25EC837B257993EC16FD0609F00CCED3 +:1079B00050936A2C40936B2C80936C2CA0936D2C6D +:1079C00030936E2C90936F2CDF91CF911F910F917C +:1079D000FF90EF90DF90CF90BF90AF909F908F90EF +:1079E0000895BF92CF92DF92EF92FF920F931F9371 +:1079F000CF93DF93A0916A2C50916B2C10916C2C3B +:107A000040916D2C30916E2C20916F2CFC01BC01AB +:107A10006C5F7F4F0191952F90718A2F817E9827FF +:107A2000812F80729827842F84799827832F8377DA +:107A30009827822F8A739827892F82959827892FD4 +:107A4000869586959827C42ED12CE601C055DF4D2A +:107A50006E01E32EF12CE701C055DE4D7E01E601FB +:107A6000B881E7018881B82BE22EF12CE701C055DF +:107A7000DD4D8881CB2FC82BD0E0C057DF4DB881BA +:107A8000B027B92796959B270695812F96958795C0 +:107A90005795A795B32FB071942F917EB927922F48 +:107AA0009072B9279A2F9479B927952F9377B92790 +:107AB000982F9A73B9279B2F9295B9279B2F96954C +:107AC0009695B927CA2ED12CE601C055DF4D6E011F +:107AD000E52EF12CE701C055DE4D7E01E60118814F +:107AE000E7019881192BE82EF12CE701C055DD4DF7 +:107AF0009881C12FC92BD0E0C057DF4D98819027C6 +:107B00009B27B695B927B02EB694922FB695979528 +:107B100037954795B52FB0712A2F217EB227282F90 +:107B20002072B227242F2479B227232F2377B2275C +:107B3000292F2A73B2272B2F2295B2272B2F269578 +:107B40002695B227C42FD0E08E0100551F4D680145 +:107B5000C32FD0E08E0100551E4D7801E60108814B +:107B6000E7012881022BE92EF12CE701C055DD4DFC +:107B70002881022B10E000571F4DE8012881C22FF9 +:107B8000CB25CB27B695BC272B2D2695B69587956B +:107B90005795A795C32FC071B42FB17EBC27C92FAD +:107BA000C072BC27CA2FC479BC27C52FC377BC2796 +:107BB000C82FCA73BC27CB2FC295BC27CB2FC69525 +:107BC000C695BC27CA2FD0E0C055DF4D052F10E069 +:107BD00000551E4DF880E8011881F12A082F10E0A9 +:107BE00000551D4DE8011881CF2DC12BD0E0C057A5 +:107BF000DF4DC881C227CB27B695BC272695B69501 +:107C0000979537954795C52FC071BA2FB17EBC2780 +:107C1000C82FC072BC27C42FC479BC27C32FC37719 +:107C2000BC27C92FCA73BC27CB2FC295BC27CB2F2B +:107C3000C695C695BC27C42FD0E0C055DF4D032F95 +:107C400010E000551E4DF880E8011881F12A092F37 +:107C500010E000551D4DE8011881CF2DC12BD0E05B +:107C6000C057DF4DC881C227CB27B695BC272695C4 +:107C7000B69587955795A795D32FD071B42FB17E20 +:107C8000DB27B92FB072DB27BA2FB479DB27B52FEA +:107C9000B377DB27B82FBA73DB27BD2FB295DB276D +:107CA0001D2F169516951D27CA2ED12CE601C055FD +:107CB000DF4D6E01E52EF12CE701C055DE4D7E0152 +:107CC000E6010881E701B8810B2BE82EF12CE701D2 +:107CD000C055DD4DB881C02FCB2BD0E0C057DF4D54 +:107CE000B881B227B127D12FD695DB27B22EB69413 +:107CF000D695979537954795D52FD0712A2F217E08 +:107D0000D227282F2072D227242F2479D227232F5D +:107D10002377D227292F2A73D2272D2F2295D227D6 +:107D20002D2F26952695BD2FB227C42FD0E08E018A +:107D300000551F4D6801C32FD0E08E0100551E4D28 +:107D40007801E6010881E7012881022BE92EF12C58 +:107D5000E701C055DD4D2881022B10E000571F4D73 +:107D6000E80118811B251B27DB2FD695D127D69537 +:107D700087955795A795182F242F217E832F8071E3 +:107D80002827892F807228278A2F84792827852FF2 +:107D900083772827812F8A732827B22FB2952B2724 +:107DA000B22FB695B6952B27EA2EF12CE701C055D8 +:107DB000DF4D7E01C52ED12CE601C055DE4D6E0192 +:107DC000E701E880E6018881E82AC12ED12CE6018E +:107DD000C055DD4D8881E82AF12CE701C057DF4D01 +:107DE000B6948881CB2DC827C2272695B22FBC27F1 +:107DF0002B2F2695979537954795292F6E177F0737 +:107E000009F008CEA0936A2C50936B2C10936C2C25 +:107E100040936D2C30936E2C90936F2CDF91CF910B +:107E20001F910F91FF90EF90DF90CF90BF9008953A +:107E3000CF93DF93EAE6FCE2A08171816281338116 +:107E400024819581472F40718A2F817E8427462F78 +:107E500040728427432F44798427422F4377842715 +:107E6000492F4A738427482F42958427482F4695E7 +:107E700046958427482F469584278695679577955C +:107E8000A795C32FD0E0C055DF4D422F50E040559D +:107E90005E4DB881EA018881B82B492F50E04055EA +:107EA0005D4DEA018881CB2FC82BD0E0C05BDF4D50 +:107EB00088818695522F5071432F417E4527592F37 +:107EC000507245275A2F54794527572F5377452706 +:107ED000562F5A734527542F52954527542F5695A0 +:107EE00056954527542F569545274695979527959E +:107EF0003795CA2FD0E0C055DF4D472F50E0405591 +:107F00005E4DB881EA014881B42B462F50E04055C0 +:107F10005D4DEA014881CB2FC42BD0E0C05BDF4D23 +:107F20004881842B8695572F50714A2F417E4527D3 +:107F3000562F50724527532F54794527522F537788 +:107F40004527592F5A734527542F52954527542FAB +:107F5000569556954527542F56954527469567952E +:107F60007795A795C32FD0E0C055DF4D422F50E045 +:107F700040555E4DB881EA014881B42B492F50E04D +:107F800040555D4DEA014881CB2FC42BD0E0C05B4A +:107F9000DF4D4881842B8695CA2FD0E0C055DF4D38 +:107FA000472F50E040555E4DB881EA014881B42B1F +:107FB000462F50E040555D4DEA014881CB2FC42B40 +:107FC000D0E0C05BDF4D4881842B532F517E422F80 +:107FD00040714527592F507245275A2F547945270C +:107FE000572F53774527562F5A734527542F5295AD +:107FF0004527542F569556954527542F5695452776 +:108000004695979527953795A0837183628333832F +:1080100024839583DF91CF910895BF92CF92DF9211 +:10802000EF92FF920F931F93CF93DF9350916A2C9F +:10803000C0916B2CB0906C2C40916D2C30916E2CBB +:1080400020916F2CFC01615008F4EAC19C2F9071C3 +:10805000852F817E98278B2D80729827842F847995 +:108060009827832F83779827822F8A739827892FC1 +:1080700082959827792F769576959727892F8695DB +:108080009827AC2F8B2D96958795A7955795C42F3C +:10809000D0E0C055DF4D032F10E000551E4D788114 +:1080A000E8019881792B022F10E000551D4DE80161 +:1080B0009881C72FC92BD0E0C059DF4D1881169584 +:1080C000732F7071942F917E9727722F707297275C +:1080D000752F747997277A2F73779727782F7A736C +:1080E0009727792F72959727792F769576959727E9 +:1080F000792F76957927922F272F26959795379563 +:108100004795C52ED12CE601C055DF4D6E01EA2EF4 +:10811000F12CE701C055DE4D7E01E6017881E701D3 +:108120002881722BE82EF12CE701C055DD4D288106 +:10813000C72FC22BD0E0C059DF4D2881122B1695D6 +:108140007A2F7071252F217E2727782F707227278D +:10815000742F74792727732F73772727792F7A73D2 +:108160002727722F72952727722F769576952727C6 +:10817000722F76952727BA2F26958795B79557950D +:10818000C42ED12CE601C055DF4D6E01E32EF12C3B +:10819000E701C055DE4D7E01E6017881E7012881C7 +:1081A000722BE92EF12CE701C055DD4D2881C72F38 +:1081B000C22BD0E0C059DF4DA881A12BA695732F0B +:1081C0007071242F217E2727792F70722727752F12 +:1081D000747927277B2F73772727782F7A732727A0 +:1081E000722F72952727722F769576952727722FF3 +:1081F00076957227232F372F369597952795479594 +:10820000C52FD0E0C055DF4D0B2F10E000551E4D9F +:108210007881E8013881732B082F10E000551D4D3F +:10822000E8013881C72FC32BD0E0C059DF4DD8817A +:10823000AD2BA6957B2F7071352F317E3727782F88 +:1082400070723727742F74793727722F7377372717 +:10825000792F7A733727732F72953727732F769577 +:1082600076953727732F7695372736958795B79567 +:108270005795C42FD0E0C055DF4D022F10E00055B8 +:108280001E4D7881E8013881732B092F10E00055CD +:108290001D4DE8013881C72FC32BD0E0C059DF4DF9 +:1082A000D881AD2BA695722F7071342F317E732734 +:1082B000392F30727327352F347973273B2F33775B +:1082C0007327382F3A737327372F32957327372F39 +:1082D000369536957327372F36957327342F769535 +:1082E000979527953795C52FD0E0C055DF4D0B2FBB +:1082F00010E000551E4D7881E8014881742B082F4D +:1083000010E000551D4DE8014881C72FC42BD0E077 +:10831000C059DF4DD881DA2BD6957B2F7071452F50 +:10832000417E7427482F40727427432F4479742765 +:10833000422F43777427492F4A737427472F42955A +:108340007427A72FA695A6957A27472F46957427B9 +:108350004B2F7695879547955795C42FB82EA32F09 +:10836000B0E08D0100551F4D6801A22FB0E08D01D6 +:1083700000551E4D7801D6010C91D7018C91082B28 +:10838000E92EF12CD701A055BD4D8C91082B10E0A2 +:1083900000591F4DD8018C91D82BD695732F717E23 +:1083A000822F80717827892F80727827852F847992 +:1083B0007827842F837778278B2D8A737827872FC8 +:1083C00082957827A72FA695A6957A27872F869539 +:1083D0007827432F322F272F269597953795479546 +:1083E000292F852F90E080559F4D0C2F10E00055D0 +:1083F0001E4DDC019C91D8018C91892B0B2D10E036 +:1084000000551D4DD8019C91892B90E080599F4DBE +:10841000DC019C918D2F892B90818927819313CE2C +:1084200050936A2CC0936B2CB0926C2C40936D2CA3 +:1084300030936E2C20936F2CDF91CF911F910F9171 +:10844000FF90EF90DF90CF90BF900895EF92FF9252 +:108450000F931F93CF93DF9370916A2C50916B2CE5 +:1084600020916C2C40916D2C30916E2CC0916F2C12 +:10847000E42FF0E0E055FF4DA32FB0E0A055BE4D36 +:10848000F081EC91EF2BAC2FB0E0A055BD4DFC91ED +:10849000EF2BF0E0E057FF4D1081DC01D0E06150A0 +:1084A00008F4DBC11695D795952F9071872F817EA3 +:1084B0008927922F90728927942F94798927932F57 +:1084C000937789279C2F9A738927982F92958927CC +:1084D000E82FE695E6958E27982F9695892786951D +:1084E000279557957795D695932F9071842F817EF8 +:1084F00089279C2F90728927972F94798927952F08 +:1085000093778927922F9A738927982F9295892795 +:10851000E82FE695E6958E27982F969589279C2F2C +:108520008695979537954795E72FF0E0E055FF4DF5 +:10853000052F10E000551E4DC081F8018081C82B29 +:10854000022F10E000551D4DF8018081EC2FE82B23 +:10855000F0E0E059FF4D8081D82BD695E52FE071F2 +:10856000872F817E8E27E22FE0728E27E42FE47919 +:108570008E27E32FE3778E27E92FEA738E27E82FE4 +:10858000E2958E27E82FE695E6958E27E82FE6956B +:108590008E278695279557957795E42FF0E0E0553F +:1085A000FF4D032F10E000551E4DC081F801808162 +:1085B000C82B092F10E000551D4DF8018081EC2FCC +:1085C000E82BF0E0E059FF4D8081D82BD695E32FC2 +:1085D000E071842F817E8E27E92FE0728E27E72FAE +:1085E000E4798E27E52FE3778E27E22FEA738E2733 +:1085F000E82FE2958E27E82FE695E6958E27E82F5F +:10860000E6958E278695979537954795E72FF0E065 +:10861000E055FF4D052F10E000551E4DC081F801BB +:108620008081C82B022F10E000551D4DF80180817C +:10863000EC2FE82BF0E0E059FF4D8081D82BD69548 +:10864000E52FE071872F817E8E27E22FE0728E2743 +:10865000E42FE4798E27E32FE3778E27E92FEA735F +:108660008E27E82FE2958E27E82FE695E6958E2750 +:10867000E82FE6958E278695279557957795E42FD1 +:10868000F0E0E055FF4D032F10E000551E4DC08176 +:10869000F8018081C82B092F10E000551D4DF8010D +:1086A0008081EC2FE82BF0E0E059FF4D8081D82B42 +:1086B000D695E32FE071842F817E8E27E92FE0721B +:1086C0008E27E72FE4798E27E52FE3778E27E22F99 +:1086D000EA738E27E82FE2958E27E82FE695E69538 +:1086E0008E27E82FE6958E2786959795379547959F +:1086F000E72FF0E0E055FF4D052F10E000551E4D2F +:10870000C081F8018081C82B022F10E000551D4D5B +:10871000F8018081EC2FE82BF0E0E059FF4D8081DB +:10872000D82BD695E52FE071872F817E8E27E22FFB +:10873000E0728E27E42FE4798E27E32FE3778E27EC +:10874000E92FEA738E27E82FE2958E27E82FE6952A +:10875000E6958E27E82FE6958E27869527955795DF +:108760007795E42FF0E0E055FF4D032F10E0005522 +:108770001E4DC081F8018081C82B092F10E00055E3 +:108780001D4DF8018081EC2FE82BF0E0E059FF4D02 +:108790008081D82BD695E72FF0E0E055FF4D052FCF +:1087A00010E000551E4DC081F8018081C82B022FBA +:1087B00010E000551D4DF8018081EC2FE82BF0E012 +:1087C000E059FF4D8081D82BE42FE17E832F80710B +:1087D000E827892F8072E827872F8479E827852F5B +:1087E0008377E827822F8A73E8278E2F8295E827E0 +:1087F0008E2F86958695E8278E2F8695E827E69515 +:10880000979537954795C92FE42FF0E0E055FF4D38 +:10881000832F90E080559E4D1081FC018081182BA4 +:108820008C2F90E080559D4DFC018081E12FE82B3D +:10883000F0E0E057FF4D10818C91E82FF0E0EE5111 +:10884000FB4FE4917D01F0E8EF0EF11C9E2F912784 +:10885000F70190838D278D9322CE70936A2C5093CD +:108860006B2C20936C2C40936D2C30936E2CC0930A +:108870006F2CDF91CF911F910F91FF90EF90089592 +:108880000F931F93FC01862F408151816281738178 +:108890008B0122273327803208F471C0D80123E0EE +:1088A000B695A7952A95E1F70A271B2798013695D3 +:1088B000279536952795BBE076956795579547950B +:1088C000BA95D1F70227132720E030E095E1000F99 +:1088D000111F221F331F9A95D1F7402B512B622B6A +:1088E000732B8B0122273327D80133E0B695A79548 +:1088F0003A95E1F70A271B27980136952795369573 +:108900002795BBE07695679557954795BA95D1F72A +:108910000227132720E030E095E1000F111F221FEE +:10892000331F9A95D1F7402B512B622B732B8B0160 +:1089300022273327D80133E0B695A7953A95E1F77A +:108940000A271B2798013695279536952795BAE073 +:108950007695679557954795BA95D1F702271327CE +:1089600020E030E096E1000F111F221F331F9A957F +:10897000D1F7402B512B622B732B805289CF408330 +:108980005183028373831F910F910895AF92BF9219 +:10899000CF92DF92EF92FF920F931F93CF93DF93CB +:1089A0006730710509F451C09B0127703327232BD1 +:1089B00009F04EC05B016C01EB0183E0D695C795D1 +:1089C0008A95E1F77B0196E0F694E7949A95E1F7B2 +:1089D000EC0EFD1EEC0CFD1C8E01015011090C0D5E +:1089E0001D1DA701401B510B60E070E0C8010196FE +:1089F0000E94C5540C151D0520F1D801EC91F0E042 +:108A0000EE51FB4F2491D701CD010A171B0768F4E3 +:108A1000FC018081982F990F8E91881F8827881FCD +:108A2000892B11968C931197EFCF11968C911197FA +:108A30008E7FE22FE170E82B1196EC930150110923 +:108A4000D9CFC5018C0F9D1F04C087E090E001C005 +:108A5000CB01DF91CF911F910F91FF90EF90DF90AD +:108A6000CF90BF90AF900895EF92FF920F931F9316 +:108A7000CF93DF93EC01CB0167307105E1F169E041 +:108A800070E00E94F553DE0180E090E008E010E025 +:108A90008617970751F1FC0133E0F695E7953A9573 +:108AA000E1F7E80FF91FAC0147705527EC0FFD1FE8 +:108AB000208130E0042E02C0359527950A94E2F714 +:108AC0002C934115510571F0E181F0E07801E41A31 +:108AD000F50AA7017F0102C0EE0CFF1C4A95E2F7E0 +:108AE0002E292C9301961196D3CF23E0880F991F3E +:108AF0002A95E1F702C087E090E0DF91CF911F91C6 +:108B00000F91FF90EF900895EF92FF920F931F93B4 +:108B1000CF93DF939C01CB016730710509F440C00E +:108B200069E070E00E94F55380E090E048E050E09A +:108B300086179707A9F1DC01E3E0B695A795EA95BA +:108B4000E1F7A80FB91FEC01C770DD27A20FB31F13 +:108B5000EC91F0E00C2E02C0F595E7950A94E2F74F +:108B6000209759F011960C9111977A01EC1AFD0A91 +:108B700001C0000FEA94EAF7E02BF0E0EE51FB4F62 +:108B8000E4911196AC91B0E002C0B595A795CA9555 +:108B9000E2F7ED01CE27FE01E0FD04C00196C8CF4B +:108BA00081E001C080E0DF91CF911F910F91FF9094 +:108BB000EF90089510924A2D089510924A2D109228 +:108BC000702C10924B2D0895F8DF0E949B2B109271 +:108BD0004A2D089508950895DC0123E633E6615097 +:108BE000E8F04D91942F922780E1989FA0011124E5 +:108BF0004927E42FF0E0232F332742954F70C90116 +:108C00008427AC013E2F22272427352743E0EE0F8F +:108C1000FF1F4A95E1F72E273F27E1CFC9010895AD +:108C2000EF92FF921F93CF93DF9320914B2D1091E2 +:108C30004A2D222329F0123008F00CC110924B2D3E +:108C40007B01EC01163090F4133080F51230A8F45B +:108C500081E090E0809320209093212082E588831A +:108C600082E080934A2D87E090E0F6C0193008F446 +:108C700076C01A3009F4B9C0EDC06231710508F44C +:108C800083C0CE0141DF8823C1F0B701CE01ECDE05 +:108C90008881998180933C2D90933D2D83E9888331 +:108CA00080E2898383E080934A2D8BC02DDF882367 +:108CB00021F088E0E816F10488F410924A2DC701EB +:108CC000089667E070E00E94F553462FE091662E0B +:108CD000F091672EBE0181EC199558C0B701CE0105 +:108CE000C3DE2881898182279A8189279B818927F0 +:108CF0009C81891349C0A12FB0E01397CD01880F43 +:108D0000991FA80FB91FA15CB24D283821F483E048 +:108D1000FE01319602C084E0FE0101900D928A9519 +:108D2000E1F745E050E0BE01CE0102960E94B45446 +:108D3000133021F0143021F485E903C083E901C028 +:108D400087E9888380E7898367E0CE0145DF8F83E9 +:108D500098871D5F10934A2D68E470E074C06B31F2 +:108D6000710590F0CE01D0DE811113C0C7010896C5 +:108D700067E070E00E94F553462FE091662EF09177 +:108D8000672EBE0181EC199510924A2D0E94942BFA +:108D900061C0B701CE0168DE63E0CE011DDF009740 +:108DA00099F7288122FF10C0183071F0163011F4A5 +:108DB00085E901C087E9888380E289831250109396 +:108DC0004A2D60E170E03FC021E020934B2D212F20 +:108DD00030E026503109122F110F210F2C5F209304 +:108DE000492D288120933E2D37C06115710521F44E +:108DF00081E080934A2DCACF87DE81110FC0C70161 +:108E0000089667E070E00E94F553462FE091662EC9 +:108E1000F091672EBE0181EC199508C0B701CE0113 +:108E200023DE63E0CE01D8DE892B11F382EC888348 +:108E300061E070E0CE010E943D3710934A2D109200 +:108E40004B2D68E170E0CE01DF91CF911F91FF9033 +:108E5000EF909CCD80E090E0DF91CF911F91FF904B +:108E6000EF9008955F926F927F928F929F92AF9250 +:108E7000BF92CF92DF92EF92FF920F931F93CF9307 +:108E8000DF93CDB7DEB7C054D240CDBFDEBF8C017B +:108E90006B018091702C833009F43BC130F4813038 +:108EA00069F0823009F4B8C0C2C4853009F40CC23C +:108EB00008F44EC1863009F4C3C2B9C4E0904C2E08 +:108EC000F0904D2EE114F104C1F0A701495F5F4F0E +:108ED00063E0569547956A95E1F76CE47DE2C80139 +:108EE0000E94AB5460914C2E70914D2EC8014EDD06 +:108EF00010924C2E10924D2EE5C16115710509F4AA +:108F0000ADC0C80101DEB82EB601C801ADDD6C01EF +:108F10009C01295F3F4FC901880F991F53E0969527 +:108F200087955A95E1F706968138910578F060EBC0 +:108F300073E2CE0101960E94D7541092702CBE01AC +:108F40006F5F7F4F85E60E947722EAC4B3E03695D3 +:108F50002795BA95E1F7A80160E870E0CE01019687 +:108F60000E94770E8C01CF5FDD4FD882C150D24076 +:108F7000CE5FDD4FC882C250D2408FEB93E29F9309 +:108F80008F9380E8C82ED12CC601801B910B9F9334 +:108F90008F9381E090E08C0F9D1F800F911F9F9316 +:108FA0008F930E94DE54080F191FB601601B710BCE +:108FB00022E030E0AE014F5F5D4F81E090E08C0F2A +:108FC0009D1F800F911F0E94770E800F911F0F90A1 +:108FD0000F900F900F900F900F909601281B390B58 +:108FE00041E050E04C0F5D1F840F951FB11003C08E +:108FF00042EC53E202C041ED53E25F934F933F9343 +:109000002F939F938F930E94DE540F900F900F9099 +:109010000F900F900F9091CFE0904C2EF0904D2E2E +:10902000E114F104C1F0A701495F5F4FA3E0569539 +:109030004795AA95E1F76CE47DE2C8010E94AB5424 +:1090400090914C2E80914D2E10924C2E10924D2EC0 +:10905000E92EF82E65C46115710551F488E0E1E050 +:10906000F4E2DE01119601900D928A95E1F765CF49 +:109070009B01295F3F4FE3E036952795EA95E1F79D +:10908000A80160E870E0CE0101960E94770E8C0185 +:10909000CF5FDD4FD882C150D240CE5FDD4FC88256 +:1090A000C250D2408FEB93E29F938F93F0E8CF2E84 +:1090B000D12CC601801B910B9F938F9381E090E090 +:1090C0008C0F9D1F800F911F9F938F930E94DE54E2 +:1090D000800F911FB601681B790B22E030E0AE01D2 +:1090E0004F5F5D4FA1E0B0E0AC0FBD1F8A0F9B1F2B +:1090F0000E94770E1092702CBE016F5F7F4F85E645 +:109100000E9477220F900F900F900F900F900F906A +:1091100007C4C80185DD20914B2D222309F48AC3A1 +:109120002091492D30E04FE35DE264E170E0CE0133 +:1091300001960E94770EBE016F5F7F4F85E60E9409 +:10914000772210924B2D1092702C0E940D236FC32A +:1091500080912B2D811108C080E890E00E945A2355 +:1091600081E080932B2D76C0813009F075C080910D +:109170004A2D823008F070C080912A2D8F5F809335 +:109180002A2D803109F068C00E9463237C0193502E +:10919000409768F0E114B8E0FB0608F45BC0E0E13A +:1091A000F0E020E030E0A12CB12C60E03EC0A2EB6A +:1091B000BCE240E050E020E030E080E090E0E0E021 +:1091C000F0E060E07D91703129F461110EC0FA0188 +:1091D00061E00BC0662349F0BA016E1B7F0B681774 +:1091E000790710F09F01CB0160E04F5F5F4F48327D +:1091F000510541F78430910508F01EC32BC0D601FC +:109200000D916D0110E00E171F07C0F0611102C033 +:109210005A0161E04F5F5F4F4837510581F7009772 +:1092200009F00AC3319709F407C372EBC72E7CE239 +:10923000D72E40E050E080E090E0E1CF662351F38C +:10924000BA016A197B096817790710F09501CB01FB +:1092500060E0E0CF10922A2DB601C801E1DC209138 +:109260004B2D222309F4E6C2E0911E20F0911F202D +:10927000E058F109A4E0F695E795AA95E1F7EE54D8 +:10928000F34D80818F5F808380912A2D803121F47E +:109290000E94632310922A2D10924A2D0E94942B33 +:1092A00080E5F8018083118262E070E0C8010E94CD +:1092B0003D3781E080934A2D10924B2D60E270E0A3 +:1092C000C80164DB7C012CC3C801AADC20914B2DB2 +:1092D000222309F4AFC2F090B12CFF2091F1C11408 +:1092E000D10429F41092B12C10924B2D42C0F2EA15 +:1092F000CF16D10438F0B601C80106DC91E0892709 +:10930000A82E03C0AA24A394B12CB601C801ACDBDB +:10931000A0FC05C062E1C8015FDC892B29F0ACEF3D +:10932000AF0DA093B12C2AC024E0F29ED0011124ED +:10933000AF59B34D80E1F80101900D928A95E1F7A4 +:109340001DC042E050E069E472E1CE0101960E9446 +:109350007D54ECE4F2E1E49120913C2D30913D2DDF +:1093600089819A812817390721F480913E2DE817C9 +:1093700029F010924A2D0E94942B59C28091B12C51 +:10938000803109F04DC010924B2D1092B12C1092EB +:10939000702C20E130E041E75CE267E870E0CE014C +:1093A00001960E94770E6FEB73E2CE0181960E94C8 +:1093B000D75420E130E041E85CE265E670E0CE01A0 +:1093C00083960E94770E6FEB73E2CE018D5B9F4F09 +:1093D0000E94D75420E130E041E95CE263E470E0B0 +:1093E000CE018B5B9F4F0E94770E6FEB73E2CE0135 +:1093F0008B599F4F0E94D75420E130E041EA5CE254 +:1094000061E270E0CE0189599F4F0E94770E0E9461 +:109410000D23BE016F5F7F4F85E60E94772207C252 +:1094200090E3D8019C9311968C9362E070E0C801A0 +:109430000E943D378091B12C8C5F8093B12C3ECF40 +:10944000C801EEDB20914B2D222309F4F3C180915A +:109450004A2D9AEF980F933008F04CC0F8018081A4 +:109460008072B82E10922C2DE4E1EE2EE1E1FE2E5A +:10947000A12C47E650E0B701CE0101960E947D5431 +:109480008B81882349F029813A8180913C2D9091EC +:109490003D2D28173907B9F48D81882329F09C8147 +:1094A00080913E2D98130FC08F89882311F0BB2027 +:1094B00051F0E0912C2D81E08E0F80932C2DF0E067 +:1094C000E35DF24DA082A394F7E6EF0EF11C2FE0CE +:1094D000A212CFCFBB2009F485C080EED8018C93B7 +:1094E00080E811968C9362E070E0C8010E943D37DD +:1094F00089E09BC0893009F075C0B601C80104DB62 +:1095000081110FC0C601089667E070E00E94F55314 +:10951000462FE091662EF091672EB80181EC1995E7 +:10952000A3C0B601C801A0DA6C01D8016C91262F46 +:1095300030E073E0969587957A95E1F702972817C2 +:10954000390709F091C06E5FC80146DB892B09F02D +:109550008BC0F12C67E6E62E5801BFEFAB1ABB0AB1 +:1095600080912C2DF816F0F5EF2DF0E0E35DF24D33 +:109570006081E69EB00111246C5E7E4E47E650E0AD +:10958000CE0101960E947D548F89882349F14E892E +:1095900050E0D8018C9190E001974817590741F0AD +:1095A00020912C2D422F50E0415051093F2D08C0F1 +:1095B000B501CE0106960E949E54892B89F710C0F2 +:1095C000832F90E0841795073CF4FC01E35DF24D96 +:1095D000818180833F5FF4CF215020932C2DFA941A +:1095E000F394BECF80914A2D9AEF980F943000F5F6 +:1095F00020912C2DEDE2FDE280E001C08F5F82170B +:1096000009F468C0919194509230C0F782E0F8015B +:10961000808380E6818362E0C801DEDAD801129699 +:109620008C93129713969C938BE080934A2D46CE91 +:109630008B3009F04FC0C114D10409F449C0B60100 +:10964000C80162DA811114C0C601089667E070E0B3 +:109650000E94F553462FE091662EF091672EB801D7 +:1096600081EC199510922C2D82ECF801808312C0A8 +:10967000B601C801F9D953E0969587955A95E1F757 +:10968000682FC801A9DA892B91F010922C2D82EC59 +:10969000D8018C9361E070E0C8010E943D378AE0F8 +:1096A00080934A2D10924B2D68E170E009CEF801AD +:1096B0008581882331F0813059F480932C2D85E009 +:1096C00004C081E080932C2D84E080932D2D02C076 +:1096D00010922C2D80912C2D811103C067EE73E226 +:1096E00027C08130A1F0912C80E090E000E010E0F4 +:1096F00027E6822E7E01FFEFEF1AFDEFFF0A3AEF19 +:10970000C32E33E2D32EA12C42E0B42E40C0609190 +:109710002D2D27E6629FB0011124655C7E4E40E44A +:1097200050E0CE0101960E947D54BE016F5F7F4FD5 +:1097300085E60E94772254C0013032E0130778F5A5 +:10974000E92DF0E0E35DF24D6081869EB0011124C9 +:10975000655C7E4E40E450E0C7010E947D54FF925C +:10976000EF92DF92CF92C501801B910B9F938F9355 +:1097700081E090E08C0F9D1F800F911F9F938F932E +:109780000E94DE54080F191F9394CDBFDEBF2091B5 +:109790002C2D921688F2013052E0150720F0081B9C +:1097A000190BF12C02C0FF24F394EDEFFFEFEC0F47 +:1097B000FD1FE00FF11F8EE28083EEEFFFEFEC0F55 +:1097C000FD1FE00FF11F1082BE016F5F7F4F85E626 +:1097D0000E947722F11004C08FEA90E10E94FC18E9 +:1097E00088EA90E10E94FC1862E070E08CE39DE260 +:1097F0000E94952282EA90E10E94FC186091492D16 +:1098000070E08FE39DE20E9495228CE990E10E9436 +:10981000FC1861E070E08EE39DE20E9495221092B8 +:10982000702C10922C2D0E940D2310924B2DE12CA8 +:10983000F12C76C07C0174C010922B2D009771F032 +:1098400096958795285F3F4F820F931F64E0880F9E +:10985000991F6A95E1F70E945A2302C00E94712362 +:1098600060E070E085E60E947722E114B8E0FB0634 +:1098700020F448E2A42EB12C03C038E7A32EB12C6B +:1098800002EB1CE2B0E8EB2EF12C8DED682E83E2AA +:10989000782E9AE0592EFE0131966F0123EE822E2A +:1098A00023E2922EFF92EF927F926F921F925F922D +:1098B000DF92CF920E94DE54C6010E94F718D801B1 +:1098C0008C91CDBFDEBF882381F01F928F939F9232 +:1098D0008F921F925F92DF92CF920E94DE54C60158 +:1098E0000E94F718CDBFDEBF04C06DE283E090E2B6 +:1098F00006D681E191E10E94FC18D8011D928D01EC +:10990000B0E1EB0EF11CC801825B9C428A159B05FD +:1099100048F210924B2D1092702C0E949B2B87CFF7 +:10992000C701C05CDD4FCDBFDEBFDF91CF911F917E +:109930000F91FF90EF90DF90CF90BF90AF909F90EE +:109940008F907F906F905F9008950F931F93CF93A8 +:10995000DF93CDB7DEB7EA97CDBFDEBF00EC11E3F2 +:1099600095D2F80181938F01F1E3083C1F07C1F7FD +:109970000E94AB1906D3882309F4FAC08091C03144 +:109980009091C131953009F46FC030F4913069F194 +:1099900068F0933051F1ECC0983009F4C2C09930AE +:1099A00009F4C8C0963009F0E3C072C0803891F065 +:1099B000823809F0DDC08091C4318F7087D2E09188 +:1099C000CA31F091CB31118112FB112710F980E0DF +:1099D0007DD206C01091BC318091BD3181111260E1 +:1099E000EAD2812F63D280E0A1C0282F2D7F09F019 +:1099F000BFC0882319F0823061F0BAC08091C231B3 +:109A0000813009F0B5C0933009F080E08093BD311A +:109A100027C08091C231811123C0E091C4311E2F33 +:109A20001F7009F4A5C0812F51D28091C1318330BC +:109A300011F4EDD215C0E091CA31F091CB318181A2 +:109A40008B7F818324E8129FF0011124E25FFD4C9B +:109A50001082E091CA31F091CB3180818E7F80837A +:109A600080E034D2A8D264C0811182C01091C2318A +:109A70001F77A1D28FD35FD28823E9F31093C30459 +:109A8000111102C082E001C083E08093BF3170C039 +:109A90008058823008F06CC08091C2319091C331FF +:109AA0008C3DE3E09E0761F583E08A838AE3898346 +:109AB0004FB7F894DE01139620E038E052E050935F +:109AC000CA01E32FF0E0E4911092CA0120FF03C025 +:109AD000E295EF703F5FEF708E2F90E0EA3010F06C +:109AE000C79601C0C0968D939D932F5F2C3139F797 +:109AF0004FBF61D26AE370E0CE010196A5D00FC0DE +:109B0000AE014F5F5F4F6091C4310E94EB0C8C013E +:109B1000892B71F150D2B80189819A8111D1A7D1D5 +:109B200027C0803829F547D28091BB31BFD186D17B +:109B300031D31EC081111CC08091C2319091C331BC +:109B400099270297ACF437D28091C2318093BB3110 +:109B500021D38091BB31811106C08091C304811152 +:109B600002C081E001C084E08093BF310E94A71948 +:109B700008D2882311F01FD24AD2EA96CDBFDEBFA9 +:109B8000DF91CF911F910F9108950895CF93809108 +:109B9000BF31882351F0C091CC3180E097D1F1D111 +:109BA0008111D3DE8C2FCF9191C1CF910895CF92A7 +:109BB000DF92EF92FF920F931F93CF93DF93EC010D +:109BC0008B017A01FDD2811136C0E114F10439F024 +:109BD000F70180819181081B190BC80FD91FC12C77 +:109BE000D12C0115110531F18091C8319091C93105 +:109BF000FC01EF5BFF4F208131978081281790F0A7 +:109C00001DD1C4DFE114F10449F0F7018081918195 +:109C1000C80ED91EC082D18285E00DC0D1D2882362 +:109C200001F309C0899142D101501109FFEFCF1A08 +:109C3000DF0AD7CF80E0DF91CF911F910F91FF9086 +:109C4000EF90DF90CF900895DF92EF92FF920F9305 +:109C50001F93CF93DF93D82FC92F8B018091CC31E5 +:109C6000806834D18091C6319091C73180179107B7 +:109C700028F00115110519F4E1D001C08C01ED2E79 +:109C8000FC2ED12C0115110509F440C08091BF3183 +:109C9000811102C082E04CC0853011F483E048C0DD +:109CA00070D1882311F081E043C051D181113CC0B3 +:109CB00042D1882339F32091CC318091C8319091E1 +:109CC000C931FC0127FF05C0EF5BFF4FC081D0E029 +:109CD00013C0E05CFF4FC08131968081D0E0C81B8B +:109CE000D1090AC0C830D10550F4F70181917F0134 +:109CF000DDD00150110921960115110599F7DD24D8 +:109D0000D394289709F0D12C99D0BCCFD110BECFD5 +:109D10000BC08091BF31882309F4BCCF853009F492 +:109D2000BDCF2FD18111BFCF12D1882391F380E015 +:109D3000DF91CF911F910F91FF90EF90DF900895E9 +:109D4000DF92EF92FF920F931F93CF93DF93D82F61 +:109D5000C92F8B018091CC318068B8D08091C631F9 +:109D60009091C7318017910728F00115110519F45A +:109D700065D001C08C01ED2EFC2ED12C01151105F2 +:109D800009F442C08091BF31811102C082E04EC00F +:109D9000853011F483E04AC0F4D0882311F081E0CB +:109DA00045C0D5D081113EC0C6D0882339F320915B +:109DB000CC318091C8319091C931FC0127FF05C099 +:109DC000EF5BFF4FC081D0E015C0E05CFF4FC0816A +:109DD00031968081D0E0C81BD1090CC0C830D105B4 +:109DE00060F4F701849162D0FFEFEF1AFF0A01508F +:109DF000110921960115110589F7DD24D3942897BF +:109E000009F0D12C1BD0BACFD110BCCF0BC08091A0 +:109E1000BF31882309F4BACF853009F4BBCFB1D064 +:109E20008111BDCF94D0882391F380E0DF91CF9151 +:109E30001F910F91FF90EF90DF900895E091CA314C +:109E4000F091CB31A091C831B091C931AF5BBF4F18 +:109E50008C9190E08283938380818D798083E091DF +:109E6000C831F091C931EF5BFF4F10820895E09146 +:109E7000CA31F091CB3180818D798083E091C831F6 +:109E8000F091C931EF5BFF4F108208958091C83186 +:109E90009091C931FC01EF5BFF4F208131E0320F1F +:109EA0003083FC01E20FF11D808108952091C831BB +:109EB0003091C931F901EF5BFF4F908141E0490FCB +:109EC0004083F901E90FF11D808308958093CC311F +:109ED000482F4F7050E06091C6047091C7049A01FA +:109EE00094E0220F331F9A95E1F7E4E887FF11C051 +:109EF000E49FC001E59F900D1124815F9D4C8093EC +:109F0000C8319093C931C90108969B01280F391FA8 +:109F10000DC0E49FC001E59F900D112483539E4C1A +:109F20008093C8319093C931260F371F2093CA31CF +:109F30003093CB3108958091CC318068C7DFE091B8 +:109F4000CA31F091CB3180818695817008958091DE +:109F5000CC318F77BBDFA091CA31B091CB318C91DE +:109F600085FF0DC0E091C831F091C93112968D91F5 +:109F70009C911397E05CFF4F808381E0089580E01F +:109F800008958091CC318F77A1DFA091CA31B09133 +:109F9000CB318C9184FF0DC0E091C831F091C93173 +:109FA00012968D919C911397E05CFF4F808381E026 +:109FB000089580E008958091CC318F7787DFE0911C +:109FC000CA31F091CB3180818D788083E091CA31A4 +:109FD000F091CB31808181608083E091C831F09134 +:109FE000C931EF5BFF4F10828091CC3180686EDF0A +:109FF000E091CA31F091CB31808181608083E09122 +:10A00000C831F091C931EF5BFF4F10820895E091A4 +:10A01000CA31F091CB31818184608183E091CA3172 +:10A02000F091CB318181807C803459F48091CC31A6 +:10A0300080584CDFE091CA31F091CB31818184604E +:10A04000818308951F93CF93DF93C82F162FD42FAA +:10A050003DDFE091CA31F091CB311182E091CA31FC +:10A06000F091CB318C2F881F8827881F880F808321 +:10A07000E091CA31F091CB311183E091CA31F09176 +:10A08000CB31128213822091C8313091C93124839F +:10A090003583CC0FCC0BCD23F901E05CFF4FC0839F +:10A0A0003196108281E0DF91CF911F910895CF9278 +:10A0B000DF92EF92FF920F931F93CF93DF93C62E01 +:10A0C0008C01D12CDC1409F43FC0F801D081D111EE +:10A0D00004C0D3940B5F1F4FF5CFF801E180F280ED +:10A0E00093818481823010F488E001C088E128E007 +:10A0F00030E0C0E02E153F0520F4CF5F220F331F64 +:10A10000F9CFC82B8D2F8F70863010F080E01DC0E6 +:10A11000CF7EF1E4EF16F104C8F7992321F09130D6 +:10A1200021F4C06C0AC0C06403C0C068911105C0AE +:10A130004E2D6C2F80E88D0F85DF4E2D6C2F8D2FCF +:10A1400081DF8111C6CFE2CF81E0DF91CF911F91F6 +:10A150000F91FF90EF90DF90CF90089580E090E016 +:10A16000E091C604F091C7049C0144E0220F331F24 +:10A170004A95E1F7E20FF31F11864091C604509112 +:10A18000C704FA01E20FF31F118201968630910590 +:10A1900039F708958091C03187FF0DC0D8DE811155 +:10A1A00005C08091BF318111F9CF09C060CE809187 +:10A1B000BF31882321F0BFDE8823C9F33FCE089545 +:10A1C0000F931F93CF93E091C604F091C704E05A18 +:10A1D000FF4F00811181C4E68091CC3187FF0AC016 +:10A1E000AADE811105C08091BF31811105C022C056 +:10A1F00080E025C0ACDEF5CF8530F1F0E091CA31CA +:10A20000F091CB31818182FD19C0E091C604F091BB +:10A21000C704E05AFF4F808191810817190711F494 +:10A220008C01DACF2FEF2C0FCC2311F0C22FF8CFF7 +:10A2300084E005C082E003C083E001C081E0CF91EB +:10A240001F910F91089563D069D0E0ECF4E0818113 +:10A250008E7F818380818F7780831092BE310895B5 +:10A26000CF93DF93E0E4F0E0148284818360848301 +:10A270004ED054D0C0ECD4E088818F778883888119 +:10A28000806888831092BF311092BB311092BD312B +:10A290001092BC3188818064888348E068E480E85B +:10A2A000D1DE48E068E480E0CDDE88858064888780 +:10A2B000898181608983DF91CF910895CF93DF9366 +:10A2C0003FB7F894C0ECD1E022E02A87EAE1F0E061 +:10A2D000E491A0ECB4E0DA96EC93DA97EBE1F0E0ED +:10A2E000E491DB96EC93DB971A8686EE94E38E7FFF +:10A2F00016968D939C93179785E18C9318962C93C3 +:10A300003FBF81E08093BE31DF91CF91A9CFE0ECD8 +:10A31000F4E080858370808711860895E0ECF4E096 +:10A320008FEF8287848708951F920F920FB60F9246 +:10A33000112408B60F9218BE09B60F9219BE0BB6BB +:10A340000F921BBE2F933F934F935F936F937F9317 +:10A350008F939F93AF93BF93EF93FF938091CA0422 +:10A3600087FF08C08091C80487FF04C080E88093FD +:10A37000CA040BDC8091CA0486FF07C080E4809386 +:10A38000CA041092BF310E9496198091CA0485FFB9 +:10A3900014C080E28093CA048091BB31882311F0FD +:10A3A00084E007C08091C304811102C081E001C034 +:10A3B00083E08093BF310E9485198091CA0484FF95 +:10A3C00014C080E18093CA0482E08093BF31109270 +:10A3D000BB311092C304C2DE48E068E480E832DE9C +:10A3E00048E068E480E02EDED0DBFF91EF91BF9182 +:10A3F000AF919F918F917F916F915F914F913F911D +:10A400002F910F900BBE0F9009BE0F9008BE0F90BA +:10A410000FBE0F901F901895CF93DF93EC01FC01B6 +:10A4200070968BE0DF011D928A95E9F782E08C83BC +:10A43000898783E08E8761E0CE01019638DE88232C +:10A4400061F061E0CE01069632DE882331F061E0F2 +:10A45000CE010B96DF91CF912ACE80E0DF91CF9194 +:10A4600008950F931F93CF93DF932091BF31243032 +:10A47000E1F4FC010489158926893789012B022B17 +:10A48000032B99F0EB01818121DDFE010190002079 +:10A49000E9F73197BF016C1B7D0B40E050E0CE0126 +:10A4A000DF91CF911F910F9182CB82E0DF91CF910D +:10A4B0001F910F9108950F931F93CF93DF932091D6 +:10A4C000BF312430B1F4FC0104891589268937890C +:10A4D000012B022B032B69F08A01EB018181F6DC51 +:10A4E00040E050E0B801CE01DF91CF911F910F9174 +:10A4F0005ECB82E0DF91CF911F910F9108950F9372 +:10A500001F93CF932091BF31243009F5FC010489BA +:10A51000158926893789012B022B032BC1F0C62F01 +:10A520008181D4DC8091C8319091C931FC01EF5B0D +:10A53000FF4F208131978081281720F48C2FB6DCC3 +:10A5400080E006C07BDC3CDE8823C1F301C082E0F2 +:10A55000CF911F910F910895CF93DF932091BF3139 +:10A56000243091F5FC014489558966897789452B0A +:10A57000462B472B49F18181A9DC8091CC31209178 +:10A58000C8313091C931F90187FF05C0EF5BFF4F3A +:10A59000808190E008C0E05CFF4F8081319640816F +:10A5A00090E0841B9109892B69F0F901EF5BFF4F63 +:10A5B000D0813197C08142DCDC1720F001DE8111AF +:10A5C00004C03CDC80E001C082E0DF91CF910895BF +:10A5D000CF93DF932091BF31243099F4FC0144895B +:10A5E000558966897789452B462B472B51F0EC011D +:10A5F00081816CDCA0DC882321F0CE01DF91CF913A +:10A60000ABCFDF91CF910895CF93DF932091BF31EE +:10A61000243019F08FEF9FEF46C0FC014489558923 +:10A6200066897789452B462B472BA1F386814EDC23 +:10A630008EDC882379F38091CC312091C831309120 +:10A64000C931F90187FF05C0EF5BFF4F808190E0C2 +:10A6500008C0E05CFF4F80813196208190E0821B32 +:10A660009109892B21F012DCC82FD0E002C0CFEF76 +:10A67000DFEF2091CC318091C8319091C931FC013C +:10A6800027FF05C0EF5BFF4F208130E008C0E05C92 +:10A69000FF4F20813196808130E0281B3109232B28 +:10A6A00009F4E5DBCE01DF91CF9108950895FF9283 +:10A6B0000F931F93CF93DF93EC0163DC882309F49E +:10A6C0008EC0888190E02091C4313091C531281727 +:10A6D000390709F084C08091C131813259F018F4F2 +:10A6E000803249F17CC0823209F457C0833209F4C8 +:10A6F00067C075C08091C031813A09F070C05BDCE1 +:10A700001ADC8823E9F38C89FD880E891F89CEDB4A +:10A710008F2DCCDB802FCADB812FC8DB888DC6DB79 +:10A72000898DC4DB8A8DC2DB89DBDF91CF911F91DC +:10A730000F91FF902FCD8091C031813209F04FC031 +:10A740003ADC05DC811105C08091BF318111F9CF60 +:10A7500046C09CDBF82E9ADB182F98DB082F96DB7F +:10A76000402F50E060E070E0BA0155274427782B75 +:10A770004F29512B4C8B5D8B6E8B7F8B87DB888FAA +:10A7800085DB898F83DB8A8F72DB04DDCE01DF916D +:10A79000CF911F910F91FF9089CF8091C03181326D +:10A7A000F1F409DCF7DC8091C2319091C331888BE0 +:10A7B000998BCE01DF91CF911F910F91FF9076CFB2 +:10A7C0008091C031813259F4F6DBE4DC6091C23112 +:10A7D000CE01DF91CF911F910F91FF9067CFDF9155 +:10A7E000CF911F910F91FF900895AA1BBB1B51E1C0 +:10A7F00007C0AA1FBB1FA617B70710F0A61BB70BF1 +:10A80000881F991F5A95A9F780959095BC01CD0195 +:10A810000895B7FF04C003D0821B930B089509D09D +:10A82000A59F900DB49F900DA49F800D911D1124A4 +:10A830000895A29FB001B39FC001A39F700D811D19 +:10A840001124911DB29F700D811D1124911D089539 +:10A850008F929F92AF92BF92CF92DF92EF92FF9230 +:10A86000CF93DF93EC01688179818A819B816115A7 +:10A8700071058105910521F464E279ED8BE597E09E +:10A880002DE133EF41E050E037D749015A019B01F8 +:10A89000AC01A7EAB1E4C3DF6B017C01ACEEB4EF1D +:10A8A000A5019401B8DFDC01CB018C0D9D1DAE1D0F +:10A8B000BF1DB7FF03C00197A109B04888839983E2 +:10A8C000AA83BB839F77DF91CF91FF90EF90DF90BA +:10A8D000CF90BF90AF909F908F900895B9CF82E2B4 +:10A8E00090E2B6CFA0E0B0E08093222090932320A6 +:10A8F000A0932420B09325200895FB01DC0102C021 +:10A9000005900D9241505040D8F70895FB01DC01AD +:10A910008D91059080190110D9F3990B0895FB01D1 +:10A92000DC014150504048F005900D920020C9F7DD +:10A9300001C01D9241505040E0F70895FB01DC0139 +:10A9400004C08D910190801921F441505040C8F706 +:10A95000881B990B0895FB01DC0102C001900D9248 +:10A9600041505040D8F708956817790768F4FB0103 +:10A97000DC01E40FF51FA40FB51F02C002900E9278 +:10A9800041505040D8F70895E6CFDC0101C06D93E7 +:10A9900041505040E0F70895FC018191861721F065 +:10A9A0008823D9F7992708953197CF010895FB019E +:10A9B000DC0101900D920020E1F708950F931F93A1 +:10A9C000CF93DF93CDB7DEB72E97CDBFDEBF0E8915 +:10A9D0001F89888D998D26E02C8309831A8397FF20 +:10A9E00002C080E090E801978D839E83AE01445EB3 +:10A9F0005F4F6A8D7B8DCE01019667D04D815E8160 +:10AA000057FD0AC02F813885421753070CF49A016D +:10AA1000F801E20FF31F10822E96CDBFDEBFDF914B +:10AA2000CF911F910F9108950F931F93CF93DF93B1 +:10AA3000CDB7DEB72E97CDBFDEBF0E891F89888DBB +:10AA4000998D2EE02C8309831A8397FF02C080E042 +:10AA500090E801978D839E83AE01445E5F4F6A8DBF +:10AA60007B8DCE01019631D04D815E8157FD0AC0AC +:10AA70002F813885421753070CF49A01F801E20F31 +:10AA8000F31F10822E96CDBFDEBFDF91CF911F91B5 +:10AA90000F910895CF93DF93CDB7DEB72E97CDBF3B +:10AAA000DEBF8DE08C838C899D8989839A83AE017A +:10AAB000485E5F4F6E897F89CE010196A9D32E969D +:10AAC000CDBFDEBFDF91CF9108952F923F924F927D +:10AAD0005F926F927F928F929F92AF92BF92CF922E +:10AAE000DF92EF92FF920F931F93CF93DF93CDB737 +:10AAF000DEB72B97CDBFDEBF6C017B018A01FC0165 +:10AB000016821782838181FFBFC1CE0101963C016D +:10AB1000F6019381F70193FD859193FF81917F0168 +:10AB2000882309F4ADC1853239F493FD859193FFF3 +:10AB300081917F01853221F4B60190E0E7D4E8CF1E +:10AB4000912C212C312CFFE1F315D8F08B3279F0C8 +:10AB500038F4803279F08332A1F4232D20611DC0B6 +:10AB60008D3261F0803369F4232D216016C0832D6E +:10AB70008260382EE32DE4603E2E2AC0F32DF8606B +:10AB80001DC037FC2DC020ED280F2A3040F08E323A +:10AB9000B9F436FC75C1232D2064322E19C036FE5F +:10ABA00006C08AE0989E200D1124922E11C0EAE082 +:10ABB0002E9E200D1124222EF32DF0623F2E08C070 +:10ABC0008C3621F4832D8068382E02C0883641F4FB +:10ABD000F70193FD859193FF81917F018111B3CF9F +:10ABE000982F9F7D9554933028F40C5F1F4F9FE35F +:10ABF00099830DC0833631F0833771F0833509F0C6 +:10AC000055C020C0F801808189830E5F1F4F8824C2 +:10AC10008394912C530112C02801F2E04F0E511C75 +:10AC2000F801A080B18036FE03C0692D70E002C03B +:10AC30006FEF7FEFC50121D44C018201F32DFF7727 +:10AC40003F2E15C0280122E0420E511CF801A080C1 +:10AC5000B18036FE03C0692D70E002C06FEF7FEF58 +:10AC6000C50100D44C01F32DF0683F2E820133FC66 +:10AC700019C0822D90E088169906A0F4B60180E2F2 +:10AC800090E044D42A94F5CFF50137FC859137FE46 +:10AC900081915F01B60190E039D421102A9421E01E +:10ACA000821A91088114910479F7E1C0843611F079 +:10ACB000893639F5F80137FE07C0608171818281DC +:10ACC00093810C5F1F4F08C060817181072E000CBB +:10ACD000880B990B0E5F1F4FF32DFF763F2E97FFCA +:10ACE00009C090958095709561957F4F8F4F9F4FCC +:10ACF000F0683F2E2AE030E0A3015DD4882E86184C +:10AD000044C0853731F4232D2F7EB22E2AE030E067 +:10AD100025C0932D997FB92E8F36C1F018F4883550 +:10AD200079F0AEC0803719F0883721F0A9C0E92F3B +:10AD3000E061BE2EB4FE0DC0FB2DF460BF2E09C035 +:10AD400034FE0AC0292F2660B22E06C028E030E06B +:10AD500005C020E130E002C020E132E0F801B7FE9A +:10AD600007C060817181828193810C5F1F4F06C093 +:10AD70006081718180E090E00E5F1F4FA3011BD4C2 +:10AD8000882E8618FB2DFF773F2E36FE0DC0232D13 +:10AD90002E7FA22E891458F434FE0BC032FC09C059 +:10ADA000832D8E7EA82E05C0B82CA32C03C0B82CF2 +:10ADB00001C0B92CA4FE0FC0FE01E80DF11D808179 +:10ADC000803321F49A2D997EA92E09C0A2FE06C0D7 +:10ADD000B394B39404C08A2D867809F0B394A3FC8D +:10ADE00010C0A0FE06C0B21480F4280C922C9B1850 +:10ADF0000DC0B21458F4B60180E290E087D3B3944A +:10AE0000F8CFB21418F42B1802C0982C212CA4FEF1 +:10AE10000FC0B60180E390E079D3A2FE16C0A1FC7A +:10AE200003C088E790E002C088E590E0B6010CC05E +:10AE30008A2D867851F0A1FE02C08BE201C080E22B +:10AE4000A7FC8DE2B60190E061D3891430F4B6011D +:10AE500080E390E05BD39A94F8CF8A94F301E80DF5 +:10AE6000F11D8081B60190E051D38110F6CF2220F0 +:10AE700009F44ECEB60180E290E048D32A94F7CF91 +:10AE8000F6018681978102C08FEF9FEF2B96CDBF91 +:10AE9000DEBFDF91CF911F910F91FF90EF90DF9078 +:10AEA000CF90BF90AF909F908F907F906F905F906A +:10AEB0004F903F902F90089520FD09C0FC0123FD85 +:10AEC00005C022FF02C073836283518340830895CB +:10AED00044FD17C046FD17C0AB01BC01DA01FB0100 +:10AEE000AA0FBB1FEE1FFF1F1094D1F74A0F5B1F65 +:10AEF0006E1F7F1FCB01BA01660F771F881F991F36 +:10AF000009C033E001C034E0660F771F881F991F26 +:10AF10003150D1F7620F711D811D911D08950F935E +:10AF20001F93CF93DF938C01C801B2D2EC0197FD40 +:10AF300006C085D2892BC1F7B801CE0123D3CE013B +:10AF4000DF91CF911F910F9108958F929F92AF92B1 +:10AF5000BF92EF92FF920F931F93CF93DF938C01D9 +:10AF6000D62F7A01B22E94D29C0133272B32310591 +:10AF700031F02D32310559F48B2D8068B82ED15027 +:10AF800011F480E061C0C80183D297FDFACFCB2DC8 +:10AF9000CD7F2B2D2073F9F48033E9F4AA24AA94F1 +:10AFA000AD0E09F43EC0C80173D297FD3AC09C01B2 +:10AFB0002F7D33272835310541F4C264D25089F101 +:10AFC000C80166D297FF07C02CC0B6FE02C0C2609F +:10AFD00001C0C261DA2D812C912C540120ED280F83 +:10AFE000283078F0C4FF03C0B801CCD217C02A3093 +:10AFF00040F0C6FFF9CF2F7D3FEE320F3630A0F77D +:10B0000027504C2FC501B40163DF4B015C01C260C6 +:10B01000D15051F0C8013CD297FFE0CFC1FD04C030 +:10B02000B0CF812C912C5401C7FF08C0B094A094DC +:10B0300090948094811C911CA11CB11C2C2FB501F3 +:10B04000A401C70139DF81E0DF91CF911F910F91FA +:10B05000FF90EF90BF90AF909F908F9008955F9278 +:10B060006F927F928F929F92AF92BF92CF92DF9218 +:10B07000EF92FF920F931F93CF93DF93CDB7DEB77D +:10B08000A097CDBFDEBF5C01962E7A01F9018E013B +:10B090000F5F1F4F680180E2D8011D928A95E9F782 +:10B0A000D50113968C9080E090E0612C712C30E0FB +:10B0B00061E070E083FC259183FE21918F01522E87 +:10B0C000211103C080E090E090C02E3511F400976C +:10B0D00051F1432F50E0481759073CF42D3559F1F1 +:10B0E0002D3219F4772009F103C0772009F468C0E4 +:10B0F000452D469546954695D601A40FB11D452D83 +:10B1000047708B0102C0000F111F4A95E2F7A8019A +:10B110005C91452B4C93651459F0561410F45394DC +:10B12000E7CF5A94E5CF31E004C07724739401C08F +:10B13000712C0196BFCF772019F08E8180628E83AB +:10B14000311103C08824839417C0F6019E012F5D3E +:10B150003F4F8081809581932E173F07D1F7F2CF23 +:10B16000E114F10429F0D7018C93F70131967F01A6 +:10B170009A94812C9920E9F0C5018AD197FD17C0D6 +:10B18000FC01FF2723E0F595E7952A95E1F7EC0D03 +:10B19000FD1D208130E0AC014770552702C0359578 +:10B1A00027954A95E2F720FDDBCFB501EBD1811061 +:10B1B00089CFE114F10411F0D7011C92C80115C028 +:10B1C000422F469546954695D601A40FB11D422FB4 +:10B1D00047708B0102C0000F111F4A95E2F7A801CA +:10B1E0005C91452B4C93622EA4CFA096CDBFDEBFC1 +:10B1F000DF91CF911F910F91FF90EF90DF90CF9053 +:10B20000BF90AF909F908F907F906F905F900895C8 +:10B210005F926F927F928F929F92AF92BF92CF92E6 +:10B22000DF92EF92FF920F931F93CF93DF936C0106 +:10B23000EB015A01FC0116821782512CF601E380C2 +:10B24000FE01E3FC8591E3FE8191182FEF01882335 +:10B2500009F4E0C090E0F3D0892B19F0C6015FDE5D +:10B26000EDCF153241F4FE01E3FC1591E3FE11919F +:10B27000EF01153271F4C6010BD197FDC9C0412F02 +:10B2800050E09C01332724173507C1F2B6017AD16B +:10B29000C1C01A3239F4E3FC1591E3FE1191EF01BC +:10B2A00001E001C000E0F12C20ED210F2A3078F4FC +:10B2B00002606F2D70E080E090E040E209DEF62E43 +:10B2C000FE01E3FC1591E3FE1191EF01EDCF01FFCB +:10B2D00003C0F11003C09EC0FF24FA94183619F081 +:10B2E0001C3651F010C0FE01E3FC1591E3FE1191F4 +:10B2F000EF01183641F408600460FE01E3FC15918B +:10B30000E3FE1191EF01112309F484C0612F70E075 +:10B310008CEF91E09CD0892B09F47CC000FD07C024 +:10B32000F50180809180C50102965C0102C0812CEC +:10B33000912C1E3649F4F6014681578160E070E099 +:10B34000202FC401B9DD7ACF1336A1F401FD02C06C +:10B35000FF24F394C6019CD097FD5AC08114910438 +:10B3600029F0F4018083C40101964C01FA94F11094 +:10B37000F1CF4AC01B3551F49E01A4016F2DC601C7 +:10B380006EDEEC01892B09F03FC039C0C601C7DD74 +:10B3900097FD3EC01F3649F128F4143621F11936C5 +:10B3A00039F125C0133771F01537E9F020C0811449 +:10B3B000910429F0F4016082C40101964C01FA94D1 +:10B3C000FF2059F0C60164D03C0197FD06C037D07C +:10B3D000892B69F3B601C301D5D081149104A1F082 +:10B3E000F401108211C0006203C0006101C000645A +:10B3F000202FA4016F2DC601A8DD811105C0F60123 +:10B400008381807329F406C000FD18CF539416CFB2 +:10B41000552019F0852D90E002C08FEF9FEFDF914E +:10B42000CF911F910F91FF90EF90DF90CF90BF9041 +:10B43000AF909F908F907F906F905F900895911143 +:10B4400018C1803219F089508550D0F70895FC0159 +:10B450000590061621F00020D9F7C0010895319714 +:10B46000CF010895FC010590615070400110D8F79C +:10B47000809590958E0F9F1F0895FC01615070403C +:10B4800001900110D8F7809590958E0F9F1F089519 +:10B49000CF93DF93EC012B8120FF33C026FF0AC03E +:10B4A0002F7B2B838E819F8101968E839F838A8140 +:10B4B00090E029C022FF0FC0E881F9818081082E29 +:10B4C000000C990B009719F420622B831AC0319657 +:10B4D000E883F9830EC0EA85FB85199597FF09C0BB +:10B4E0002B81019611F080E201C080E1822B8B83D9 +:10B4F00008C02E813F812F5F3F4F2E833F839927C6 +:10B5000002C08FEF9FEFDF91CF9108950F931F93AC +:10B51000CF93DF93FB01238121FD03C08FEF9FEFCA +:10B520002CC022FF16C046815781248135814217E5 +:10B53000530744F4A081B1819D012F5F3F4F2083C9 +:10B5400031838C93268137812F5F3F4F268337834A +:10B5500014C08B01EC01FB010084F185E02D1995ED +:10B56000892BE1F6D80116968D919C91179701963B +:10B5700016968D939C931797CE01DF91CF911F91D3 +:10B580000F910895FB01238120FF12C026FD10C0FA +:10B590008F3F3FEF930761F082832F7D20642383E9 +:10B5A00026813781215031092683378399270895D1 +:10B5B0008FEF9FEF0895FA01AA27283051F120312B +:10B5C00081F1E8946F936E7F6E5F7F4F8F4F9F4F37 +:10B5D000AF4FB1E03ED0B4E03CD0670F781F891F79 +:10B5E0009A1FA11D680F791F8A1F911DA11D6A0F47 +:10B5F000711D811D911DA11D20D009F468943F91FA +:10B600002AE0269F11243019305D3193DEF6CF01F8 +:10B610000895462F4770405D4193B3E00FD0C9F7BE +:10B62000F6CF462F4F70405D4A3318F0495D31FD2B +:10B630004052419302D0A9F7EACFB4E0A69597957E +:10B64000879577956795BA95C9F700976105710554 +:10B6500008959B01AC010A2E06945795479537959E +:10B660002795BA95C9F7620F731F841F951FA01DF8 +:10B67000089599278827089503D0808199270895F0 +:10B68000E0ECF1E0378537FDFDCF34853860348755 +:10B69000FC01E050F04F0895262FF2DF00800216E3 +:10B6A00011F008D00197019708950196272FF5DF33 +:10B6B000F3CF262FE0ECF1E0378537FDFDCF348561 +:10B6C000377F3487378531FF09C036E3328738ED5D +:10B6D00034BF31E03387378537FDFDCF33E3328721 +:10B6E000808391831282248325E3228728ED31E031 +:10B6F00024BF338701960895052E97FB16F4009416 +:10B700000FD057FD05D014D007FC02D046F408C076 +:10B7100050954095309521953F4F4F4F5F4F08957D +:10B7200090958095709561957F4F8F4F9F4F0895AD +:10B73000A1E21A2EAA1BBB1BFD010DC0AA1FBB1F35 +:10B74000EE1FFF1FA217B307E407F50720F0A21BA7 +:10B75000B30BE40BF50B661F771F881F991F1A9414 +:10B7600069F760957095809590959B01AC01BD013E +:08B77000CF010895F894FFCF0A +:10B7780002400F008310000001041000000182083D +:10B78800000001000000000000000000000090011F +:10B79800010001000000000000009C24A324A32451 +:10B7A800AF24BB24C524E224F02419251C25202518 +:10B7B8003E000426140004043E00042E040C040475 +:10B7C8000008000800000000000000080008080841 +:10B7D8000808080008000800000008080008080811 +:10B7E8000080008000000000000000800080808051 +:10B7F8008080800080008000000080800080808041 +:10B80800000100010000000000000001000101012A +:10B818000101010001000100000001010001010116 +:10B828000000000000000000000000000000000010 +:10B8380001010101010101010101010101010101F0 +:10B8480001010101010101010101010101010101E0 +:10B8580001010101010101010101010101010101D0 +:10B8680000000000000000000000000000000000D0 +:10B8780000000000000000000000000000000000C0 +:10B8880000000000000000000000000000000000B0 +:10B898000101010101010101010101010101010190 +:10B8A8000000000000000000000000000000000090 +:10B8B8000000000000000000000000000000000080 +:10B8C8000101010101010101010101010101010160 +:10B8D8000000000000000000000000000000000060 +:10B8E8000101010101010101010101010101010140 +:10B8F8000101010101010101010101010101010130 +:10B90800000000000000000000000000000000002F +:10B91800010101010101010101010101010101010F +:10B9280000000002020000020002020202000002FF +:10B9380000000002020000020002020202000002EF +:10B9480000000002020000020002020202000002DF +:10B95800040404060604040604060606060404068F +:10B96800040404060604040604060606060404067F +:10B9780000000002020000020002020202000002AF +:10B98800000000020200000200020202020000029F +:10B99800040404060604040604060606060404064F +:10B9A800000000020200000200020202020000027F +:10B9B800040404060604040604060606060404062F +:10B9C800040404060604040604060606060404061F +:10B9D800040404060604040604060606060404060F +:10B9E80004040406060404060406060606040406FF +:10B9F800000000020200000200020202020000022F +:10BA0800000000020200000200020202020000021E +:10BA180004040406060404060406060606040406CE +:10BA280000080808000000080000080008080008CE +:10BA380000080808000000080000080008080008BE +:10BA480000080808000000080000080008080008AE +:10BA5800101818181010101810101810181810189E +:10BA6800101818181010101810101810181810188E +:10BA7800000808080000000800000800080800087E +:10BA8800000808080000000800000800080800086E +:10BA9800101818181010101810101810181810185E +:10BAA800000808080000000800000800080800084E +:10BAB800101818181010101810101810181810183E +:10BAC800101818181010101810101810181810182E +:10BAD800101818181010101810101810181810181E +:10BAE800101818181010101810101810181810180E +:10BAF80000080808000000080000080008080008FE +:10BB080000080808000000080000080008080008ED +:10BB180010181818101010181010181018181018DD +:10BB2800546F6F206D616E7920646174612E000D11 +:10BB38000A000D0A504152495459204552524F5259 +:10BB4800000D0A504152495459204F4B0025347575 +:10BB58003A200025337500556E6B6E6F776E206343 +:10BB680061726420747970652E002573206F7220CD +:0ABB7800004E4F20444154410000EC :020000021000EC :1000000000000000000000000000000000000000F0 :1000100000000000000000000000000000000000E0 From 7c188b1f71b55e458cf658ad38218b800cc5b55d Mon Sep 17 00:00:00 2001 From: Georg Date: Mon, 22 Jan 2018 11:21:57 +0100 Subject: [PATCH 050/104] remove debug function --- Firmware/Chameleon-Mini/Codec/Reader14443-2A.h | 1 - 1 file changed, 1 deletion(-) diff --git a/Firmware/Chameleon-Mini/Codec/Reader14443-2A.h b/Firmware/Chameleon-Mini/Codec/Reader14443-2A.h index ed6fec8..e9a2c1e 100644 --- a/Firmware/Chameleon-Mini/Codec/Reader14443-2A.h +++ b/Firmware/Chameleon-Mini/Codec/Reader14443-2A.h @@ -19,7 +19,6 @@ void Reader14443ACodecTask(void); /* Application Interface */ void Reader14443ACodecStart(void); void Reader14443ACodecReset(void); -bool Reader14443ACodecSendingOrReceiving(void); void Reader14443AMillerEOC(void); #endif /* READER14443_2A_H_ */ From be67058675da159d5e690e67d2ab333cf61d7eff Mon Sep 17 00:00:00 2001 From: Georg Date: Wed, 24 Jan 2018 15:38:10 +0100 Subject: [PATCH 051/104] added function for storing single setting data to eeprom, added reader threshold being stored in eeprom --- .../Chameleon-Mini/Application/Reader14443A.c | 7 +--- Firmware/Chameleon-Mini/Codec/Codec.c | 19 +++++----- Firmware/Chameleon-Mini/Codec/Codec.h | 4 +- Firmware/Chameleon-Mini/Makefile | 2 + Firmware/Chameleon-Mini/Settings.c | 37 +++++++++---------- Firmware/Chameleon-Mini/Settings.h | 28 +++++++++++++- Firmware/Chameleon-Mini/Terminal/Commands.c | 8 ++-- 7 files changed, 62 insertions(+), 43 deletions(-) diff --git a/Firmware/Chameleon-Mini/Application/Reader14443A.c b/Firmware/Chameleon-Mini/Application/Reader14443A.c index 7cea928..36b8e6e 100644 --- a/Firmware/Chameleon-Mini/Application/Reader14443A.c +++ b/Firmware/Chameleon-Mini/Application/Reader14443A.c @@ -10,14 +10,9 @@ #define CHECK_BCC(B) ((B[0] ^ B[1] ^ B[2] ^ B[3]) == B[4]) #define IS_CASCADE_BIT_SET(buf) (buf[0] & 0x04) #define IS_ISO14443A_4_COMPLIANT(buf) (buf[0] & 0x20) -#define MF_CLASSIC_READER_NONCE 0x00000000 #define TRYCOUNT_MAX 16 -#define FLAGS_MASK 0x03 -#define FLAGS_PARITY_OK 0x01 -#define FLAGS_NO_DATA 0x02 - // TODO replace remaining magic numbers static bool Selected = false; @@ -589,7 +584,7 @@ uint16_t Reader14443AAppProcess(uint8_t* Buffer, uint16_t BitCount) uint16_t rVal = Reader14443A_Select(Buffer, BitCount); if (Selected) // we are done finding the threshold { - Thresholds[(ReaderThreshold - CODEC_THRESHOLD_CALIBRATE_MIN) / CODEC_THRESHOLD_CALIBRATE_STEPS] += 1; + Thresholds[(GlobalSettings.ActiveSettingPtr->ReaderThreshold - CODEC_THRESHOLD_CALIBRATE_MIN) / CODEC_THRESHOLD_CALIBRATE_STEPS] += 1; if (TryCount == TRYCOUNT_MAX) { CodecThresholdIncrement(); diff --git a/Firmware/Chameleon-Mini/Codec/Codec.c b/Firmware/Chameleon-Mini/Codec/Codec.c index f9ac2fa..56f2774 100644 --- a/Firmware/Chameleon-Mini/Codec/Codec.c +++ b/Firmware/Chameleon-Mini/Codec/Codec.c @@ -23,7 +23,6 @@ static volatile struct { } ReaderFieldFlags = { false }; uint8_t CodecBuffer[CODEC_BUFFER_SIZE]; -uint16_t ReaderThreshold = 400; // standard value // the following three functions prevent sending data directly after turning on the reader field void CodecReaderFieldStart(void) // DO NOT CALL THIS FUNCTION INSIDE APPLICATION! @@ -82,22 +81,22 @@ bool CodecIsReaderToBeRestarted(void) return false; } -void CodecThresholdSet(uint16_t th) +void CodecThresholdSet(uint16_t th) // threshold has to be saved back to eeprom by the caller, if wanted { - ReaderThreshold = th; + GlobalSettings.ActiveSettingPtr->ReaderThreshold = th; DACB.CH0DATA = th; } -uint16_t CodecThresholdIncrement(void) +uint16_t CodecThresholdIncrement(void) // threshold has to be saved back to eeprom by the caller, if wanted { - ReaderThreshold += CODEC_THRESHOLD_CALIBRATE_STEPS; - DACB.CH0DATA = ReaderThreshold; - return ReaderThreshold; + GlobalSettings.ActiveSettingPtr->ReaderThreshold += CODEC_THRESHOLD_CALIBRATE_STEPS; + DACB.CH0DATA = GlobalSettings.ActiveSettingPtr->ReaderThreshold; + return GlobalSettings.ActiveSettingPtr->ReaderThreshold; } -void CodecThresholdReset(void) +void CodecThresholdReset(void) // threshold has to be saved back to eeprom by the caller, if wanted { - ReaderThreshold = 400; - DACB.CH0DATA = ReaderThreshold; + GlobalSettings.ActiveSettingPtr->ReaderThreshold = DEFAULT_READER_THRESHOLD; + DACB.CH0DATA = GlobalSettings.ActiveSettingPtr->ReaderThreshold; } diff --git a/Firmware/Chameleon-Mini/Codec/Codec.h b/Firmware/Chameleon-Mini/Codec/Codec.h index 54f9e9d..cf9d67d 100644 --- a/Firmware/Chameleon-Mini/Codec/Codec.h +++ b/Firmware/Chameleon-Mini/Codec/Codec.h @@ -13,6 +13,7 @@ #include #include "../Common.h" #include "../Configuration.h" +#include "../Settings.h" #include "ISO14443-2A.h" #include "Reader14443-2A.h" @@ -93,7 +94,6 @@ #define CodecPtrRegister1 (*((volatile uint8_t**) &GPIOR8)) #define CodecPtrRegister2 (*((volatile uint8_t**) &GPIORA)) -extern uint16_t ReaderThreshold; extern uint16_t Reader_FWT; #define FWI2FWT(x) ((uint32_t)(256 * 16 * ((uint32_t)1 << (x))) / (CODEC_CARRIER_FREQ / 1000) + 1) @@ -176,7 +176,7 @@ INLINE void CodecInitCommon(void) DACB.CTRLB = DAC_CHSEL_SINGLE_gc; DACB.CTRLC = DAC_REFSEL_AVCC_gc; DACB.CTRLA = DAC_IDOEN_bm | DAC_ENABLE_bm; - DACB.CH0DATA = ReaderThreshold; // real threshold voltage can be calculated with ch0data * Vref / 0xFFF + DACB.CH0DATA = GlobalSettings.ActiveSettingPtr->ReaderThreshold; // real threshold voltage can be calculated with ch0data * Vref / 0xFFF /* Configure Analog Comparator 0 to detect changes in demodulated reader field */ ACA.AC0MUXCTRL = AC_MUXPOS_DAC_gc | AC_MUXNEG_PIN7_gc; diff --git a/Firmware/Chameleon-Mini/Makefile b/Firmware/Chameleon-Mini/Makefile index 9ac56db..9d3175f 100644 --- a/Firmware/Chameleon-Mini/Makefile +++ b/Firmware/Chameleon-Mini/Makefile @@ -63,6 +63,8 @@ SETTINGS += -DDEFAULT_SETTING=SETTINGS_FIRST #Default pending task timeout SETTINGS += -DDEFAULT_PENDING_TASK_TIMEOUT=50 #* 100ms +#Default reader threshold +SETTINGS += -DDEFAULT_READER_THRESHOLD=400 #Use EEPROM to store settings SETTINGS += -DENABLE_EEPROM_SETTINGS diff --git a/Firmware/Chameleon-Mini/Settings.c b/Firmware/Chameleon-Mini/Settings.c index 6ef2d33..5ea9174 100644 --- a/Firmware/Chameleon-Mini/Settings.c +++ b/Firmware/Chameleon-Mini/Settings.c @@ -25,7 +25,8 @@ SettingsType EEMEM StoredSettings = { .LogMode = DEFAULT_LOG_MODE, .LEDRedFunction = DEFAULT_RED_LED_ACTION, .LEDGreenFunction = DEFAULT_GREEN_LED_ACTION, - .PendingTaskTimeout = DEFAULT_PENDING_TASK_TIMEOUT + .PendingTaskTimeout = DEFAULT_PENDING_TASK_TIMEOUT, + .ReaderThreshold = DEFAULT_READER_THRESHOLD }} }; @@ -39,13 +40,6 @@ void SettingsSave(void) { #endif } -void ActiveSettingNumberSave(void) { -#if ENABLE_EEPROM_SETTINGS - eeprom_update_byte(&StoredSettings.ActiveSettingIdx, GlobalSettings.ActiveSettingIdx); - eeprom_update_word((uint16_t*)&StoredSettings.ActiveSettingPtr, (uint16_t)GlobalSettings.ActiveSettingPtr); -#endif -} - void SettingsCycle(void) { uint8_t i = SETTINGS_COUNT; uint8_t SettingIdx = GlobalSettings.ActiveSettingIdx; @@ -69,22 +63,25 @@ bool SettingsSetActiveById(uint8_t Setting) { /* Break potentially pending timeout task (manual timeout) */ CommandLinePendingTaskBreak(); - /* Store current memory contents permanently */ - MemoryStore(); + if (SettingIdx != GlobalSettings.ActiveSettingIdx) + { + /* Store current memory contents permanently */ + MemoryStore(); - GlobalSettings.ActiveSettingIdx = SettingIdx; - GlobalSettings.ActiveSettingPtr = - &GlobalSettings.Settings[SettingIdx]; + GlobalSettings.ActiveSettingIdx = SettingIdx; + GlobalSettings.ActiveSettingPtr = + &GlobalSettings.Settings[SettingIdx]; - /* Settings have changed. Progress changes through system */ - ConfigurationSetById(GlobalSettings.ActiveSettingPtr->Configuration); - LogSetModeById(GlobalSettings.ActiveSettingPtr->LogMode); + /* Settings have changed. Progress changes through system */ + ConfigurationSetById(GlobalSettings.ActiveSettingPtr->Configuration); + LogSetModeById(GlobalSettings.ActiveSettingPtr->LogMode); - /* Recall new memory contents */ - MemoryRecall(); + /* Recall new memory contents */ + MemoryRecall(); - /* Store new setting number. */ - ActiveSettingNumberSave(); + SETTING_UPDATE(GlobalSettings.ActiveSettingIdx); + SETTING_UPDATE(GlobalSettings.ActiveSettingPtr); + } /* Notify LED. blink according to current setting */ LEDHook(LED_SETTING_CHANGE, LED_BLINK + SettingIdx); diff --git a/Firmware/Chameleon-Mini/Settings.h b/Firmware/Chameleon-Mini/Settings.h index 4d5bd3d..d7bd8de 100644 --- a/Firmware/Chameleon-Mini/Settings.h +++ b/Firmware/Chameleon-Mini/Settings.h @@ -13,6 +13,7 @@ #include "Log.h" #include "LED.h" #include "Memory.h" +#include #define SETTINGS_COUNT (MEMORY_SIZE / MEMORY_SIZE_PER_SETTING) #define SETTINGS_FIRST 1 @@ -29,6 +30,7 @@ typedef struct { LEDHookEnum LEDRedFunction; /// Red LED function for this setting. LEDHookEnum LEDGreenFunction; /// Green LED function for this setting. uint16_t PendingTaskTimeout; /// Timeout for timeout commands for this setting, in multiples of 100 ms. + uint16_t ReaderThreshold; /// Reader threshold } SettingsEntryType; typedef struct { @@ -37,11 +39,33 @@ typedef struct { SettingsEntryType Settings[SETTINGS_COUNT]; } SettingsType; -extern SettingsType GlobalSettings; +extern SettingsType GlobalSettings, StoredSettings; + +INLINE void SettingUpdate(const void * addr, uint16_t size) +{ +#if ENABLE_EEPROM_SETTINGS + uintptr_t EEAddr = (uintptr_t)addr - (uintptr_t)&GlobalSettings + (uintptr_t)&StoredSettings; + switch (size) + { + case 1: + eeprom_update_byte((uint8_t *)EEAddr, *(uint8_t*)addr); + break; + + case 2: + eeprom_update_word((uint16_t *)EEAddr, *(uint16_t*)addr); + break; + + default: + eeprom_update_block((uint8_t*)addr, (uint8_t*)EEAddr, size); + } + +#endif +} + +#define SETTING_UPDATE(x) SettingUpdate(&(x), sizeof(x)) void SettingsLoad(void); void SettingsSave(void); -void ActiveSettingNumberSave(void); void SettingsCycle(void); bool SettingsSetActiveById(uint8_t Setting); diff --git a/Firmware/Chameleon-Mini/Terminal/Commands.c b/Firmware/Chameleon-Mini/Terminal/Commands.c index 5eb60b6..82453ec 100644 --- a/Firmware/Chameleon-Mini/Terminal/Commands.c +++ b/Firmware/Chameleon-Mini/Terminal/Commands.c @@ -42,7 +42,7 @@ CommandStatusIdType CommandSetConfig(char* OutMessage, const char* InParam) ConfigurationGetList(OutMessage, TERMINAL_BUFFER_SIZE); return COMMAND_INFO_OK_WITH_TEXT_ID; } else if (ConfigurationSetByName(InParam)) { - SettingsSave(); + SETTING_UPDATE(GlobalSettings.ActiveSettingPtr->Configuration); return COMMAND_INFO_OK_ID; } else { return COMMAND_ERR_INVALID_PARAM_ID; @@ -572,12 +572,13 @@ CommandStatusIdType CommandSetTimeout(char* OutMessage, const char* InParam) if (!sscanf_P(InParam, PSTR("%5d"), &tmp) || tmp > 600) return COMMAND_ERR_INVALID_PARAM_ID; GlobalSettings.ActiveSettingPtr->PendingTaskTimeout = tmp; + SETTING_UPDATE(GlobalSettings.ActiveSettingPtr->PendingTaskTimeout); return COMMAND_INFO_OK_ID; } CommandStatusIdType CommandGetThreshold(char* OutParam) { - snprintf_P(OutParam, TERMINAL_BUFFER_SIZE, PSTR("%u"), ReaderThreshold); + snprintf_P(OutParam, TERMINAL_BUFFER_SIZE, PSTR("%u"), GlobalSettings.ActiveSettingPtr->ReaderThreshold); return COMMAND_INFO_OK_WITH_TEXT_ID; } @@ -592,7 +593,8 @@ CommandStatusIdType CommandSetThreshold(char* OutMessage, const char* InParam) if (!sscanf_P(InParam, PSTR("%5d"), &tmp) || tmp > CODEC_MAXIMUM_THRESHOLD) return COMMAND_ERR_INVALID_PARAM_ID; DACB.CH0DATA = tmp; - ReaderThreshold = tmp; + GlobalSettings.ActiveSettingPtr->ReaderThreshold = tmp; + SETTING_UPDATE(GlobalSettings.ActiveSettingPtr->ReaderThreshold); return COMMAND_INFO_OK_ID; } From 254a6eb688d76c11c27b3a40eeb812e5e4b8db5b Mon Sep 17 00:00:00 2001 From: Georg Date: Thu, 25 Jan 2018 10:33:03 +0100 Subject: [PATCH 052/104] removed UL C and UL EV1 identification as it breaks the clone process for MFU --- Firmware/Chameleon-Mini/Application/Reader14443A.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Firmware/Chameleon-Mini/Application/Reader14443A.c b/Firmware/Chameleon-Mini/Application/Reader14443A.c index b105c92..e3531f6 100644 --- a/Firmware/Chameleon-Mini/Application/Reader14443A.c +++ b/Firmware/Chameleon-Mini/Application/Reader14443A.c @@ -57,8 +57,8 @@ typedef enum { CardType_NXP_MIFARE_Classic_1k, CardType_NXP_MIFARE_Classic_4k, CardType_NXP_MIFARE_Ultralight, - CardType_NXP_MIFARE_Ultralight_C, - CardType_NXP_MIFARE_Ultralight_EV1, +// CardType_NXP_MIFARE_Ultralight_C, +// CardType_NXP_MIFARE_Ultralight_EV1, CardType_NXP_MIFARE_DESFire, CardType_NXP_MIFARE_DESFire_EV1, CardType_IBM_JCOP31, @@ -92,8 +92,8 @@ static const CardIdentificationType PROGMEM CardIdentificationList[] = { [CardType_NXP_MIFARE_Classic_1k] = { .ATQA=0x0004, .ATQARelevant=true, .SAK=0x08, .SAKRelevant=true, .ATSRelevant=false, .Manufacturer="NXP", .Type="MIFARE Classic 1k" }, [CardType_NXP_MIFARE_Classic_4k] = { .ATQA=0x0002, .ATQARelevant=true, .SAK=0x18, .SAKRelevant=true, .ATSRelevant=false, .Manufacturer="NXP", .Type="MIFARE Classic 4k" }, [CardType_NXP_MIFARE_Ultralight] = { .ATQA=0x0044, .ATQARelevant=true, .SAK=0x00, .SAKRelevant=true, .ATSRelevant=false, .Manufacturer="NXP", .Type="MIFARE Ultralight" }, - [CardType_NXP_MIFARE_Ultralight_C] = { .ATQA=0x0044, .ATQARelevant=true, .SAK=0x00, .SAKRelevant=true, .ATSRelevant=false, .Manufacturer="NXP", .Type="MIFARE Ultralight C" }, - [CardType_NXP_MIFARE_Ultralight_EV1] = { .ATQA=0x0044, .ATQARelevant=true, .SAK=0x00, .SAKRelevant=false, .ATSRelevant=false, .Manufacturer="NXP", .Type="MIFARE Ultralight EV1" }, +// [CardType_NXP_MIFARE_Ultralight_C] = { .ATQA=0x0044, .ATQARelevant=true, .SAK=0x00, .SAKRelevant=true, .ATSRelevant=false, .Manufacturer="NXP", .Type="MIFARE Ultralight C" }, +// [CardType_NXP_MIFARE_Ultralight_EV1] = { .ATQA=0x0044, .ATQARelevant=true, .SAK=0x00, .SAKRelevant=false, .ATSRelevant=false, .Manufacturer="NXP", .Type="MIFARE Ultralight EV1" }, // for the following two, setting ATSRelevant to true would cause checking the ATS value, but the NXP paper for distinguishing cards does not recommend this [CardType_NXP_MIFARE_DESFire] = { .ATQA=0x0344, .ATQARelevant=true, .SAK=0x20, .SAKRelevant=true, .ATSRelevant=false, .ATSSize= 5, .ATS={0x75, 0x77, 0x81, 0x02, 0x80}, .Manufacturer="NXP", .Type="MIFARE DESFire" }, [CardType_NXP_MIFARE_DESFire_EV1] = { .ATQA=0x0344, .ATQARelevant=true, .SAK=0x20, .SAKRelevant=true, .ATSRelevant=false, .ATSSize= 5, .ATS={0x75, 0x77, 0x81, 0x02, 0x80}, .Manufacturer="NXP", .Type="MIFARE DESFire EV1" }, @@ -485,7 +485,7 @@ static bool Identify(uint8_t *Buffer, uint16_t *BitCount) CardCandidatesIdx = 0; } break; - +#if 0 case STATE_UL_C_AUTH: if (*BitCount == 0) { @@ -509,7 +509,7 @@ static bool Identify(uint8_t *Buffer, uint16_t *BitCount) CardCandidatesIdx = 1; CardCandidates[0] = CardType_NXP_MIFARE_Ultralight_EV1; break; - +#endif default: break; } From c6d296862852b9230aebb6f553d71db89764db77 Mon Sep 17 00:00:00 2001 From: Georg Date: Thu, 25 Jan 2018 11:42:44 +0100 Subject: [PATCH 053/104] added clone being permanent --- Firmware/Chameleon-Mini/Application/Reader14443A.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Firmware/Chameleon-Mini/Application/Reader14443A.c b/Firmware/Chameleon-Mini/Application/Reader14443A.c index e3531f6..b865df8 100644 --- a/Firmware/Chameleon-Mini/Application/Reader14443A.c +++ b/Firmware/Chameleon-Mini/Application/Reader14443A.c @@ -932,10 +932,11 @@ uint16_t Reader14443AAppProcess(uint8_t* Buffer, uint16_t BitCount) if (cfgid > -1) { CommandLinePendingTaskFinished(COMMAND_INFO_OK_WITH_TEXT_ID, "Cloned OK!"); - ConfigurationSetById(cfgid); ApplicationReset(); ApplicationSetUid(CardCharacteristics.UID); + MemoryStore(); + SettingsSave(); } else { CommandLinePendingTaskFinished(COMMAND_INFO_OK_WITH_TEXT_ID, "Clone unsupported!"); } From a9ab6c0340130d5731941c92c3675a5e88a5174c Mon Sep 17 00:00:00 2001 From: Georg Date: Thu, 25 Jan 2018 11:48:36 +0100 Subject: [PATCH 054/104] updated LATEST firmware --- .../Chameleon-Mini/Latest/Chameleon-Mini.eep | 13 +- .../Chameleon-Mini/Latest/Chameleon-Mini.hex | 5864 +++++++++-------- 2 files changed, 2965 insertions(+), 2912 deletions(-) diff --git a/Firmware/Chameleon-Mini/Latest/Chameleon-Mini.eep b/Firmware/Chameleon-Mini/Latest/Chameleon-Mini.eep index 393e2d1..a43b2b0 100644 --- a/Firmware/Chameleon-Mini/Latest/Chameleon-Mini.eep +++ b/Firmware/Chameleon-Mini/Latest/Chameleon-Mini.eep @@ -1,7 +1,8 @@ -:1000000000006B2E060608080000040132000606F8 -:100010000808000004013200060608080000040178 -:10002000320006060808000004013200060608082F -:100030000000040132000606080800000401320036 -:100040000606080800000401320006060808000041 -:040050000401320075 +:100000000000B32E0606080800000401320090012B +:1000100006060808000004013200900106060808E0 +:1000200000000401320090010606080800000401E7 +:100030003200900106060808000004013200900119 +:1000400006060808000004013200900106060808B0 +:1000500000000401320090010606080800000401B7 +:0400600032009001D9 :00000001FF diff --git a/Firmware/Chameleon-Mini/Latest/Chameleon-Mini.hex b/Firmware/Chameleon-Mini/Latest/Chameleon-Mini.hex index 8b97510..14f5720 100644 --- a/Firmware/Chameleon-Mini/Latest/Chameleon-Mini.hex +++ b/Firmware/Chameleon-Mini/Latest/Chameleon-Mini.hex @@ -1,35 +1,35 @@ -:100000000C948F0B0C94B40B0C94B40B0C94B40B99 -:100010000C94B40B0C94B40B0C94B40B0C94B40B64 -:100020000C94B40B0C94B40B0C94240D0C94B40BE2 -:100030000C94B40B0C94B40B0C94B40B0C94B40B44 -:100040000C94B40B0C94B40B0C94B40B0C94B40B34 -:100050000C94B40B0C94B40B0C94B40B0C94B40B24 -:100060000C94B40B0C94B40B0C94B40B0C94B40B14 -:100070000C94B40B0C94B40B0C94B40B0C94B40B04 -:100080000C94B40B0C94B40B0C94AA230C94B40BE6 -:100090000C94B40B0C94B40B0C94B40B0C94B40BE4 -:1000A0000C94B40B0C94B40B0C94B40B0C94B40BD4 -:1000B0000C94B40B0C94B40B0C94B40B0C947924E6 -:1000C0000C94B40B0C94ED270C94B40B0C94B40B5F -:1000D0000C94B40B0C94B40B0C94B40B0C94B40BA4 -:1000E0000C94B40B0C94B40B0C94B40B0C94B40B94 -:1000F0000C94B40B0C94B40B0C94B40B0C94B40B84 -:100100000C94B40B0C94B40B0C94B40B0C94B40B73 -:100110000C94B40B0C94C8270C94B40B0C94B40B33 -:100120000C94B40B0C94B40B0C94B40B0C94B40B53 -:100130000C94B40B0C94B40B0C94B40B0C94E223FD -:100140000C94ED0B0C94E3260C94B40B0C94B40BB0 -:100150000C94B40B0C943F270C94B40B0C94B40B7C -:100160000C94B40B0C94B40B0C94B40B0C94B40B13 -:100170000C94B40B0C94B40B0C94B40B0C94B40B03 -:100180000C94B40B0C94B40B0C94B40B0C94B40BF3 -:100190000C94B40B0C94B40B0C94B40B0C94B40BE3 -:1001A0000C94B40B0C94B40B0C94B40B0C94B40BD3 -:1001B0000C94B40B0C94B40B0C94B40B0C94B40BC3 -:1001C0000C94B40B0C94B40B0C94B40B0C94B40BB3 -:1001D0000C94B40B0C94B40B0C94B40B0C94B40BA3 -:1001E0000C94B40B0C94B40B0C94B40B0C94B40B93 -:1001F0000C94B40B0C9494510C94B40B6364696E1E +:100000000C94AB0B0C94D00B0C94D00B0C94D00B29 +:100010000C94D00B0C94D00B0C94D00B0C94D00BF4 +:100020000C94D00B0C94D00B0C94420D0C94D00B70 +:100030000C94D00B0C94D00B0C94D00B0C94D00BD4 +:100040000C94D00B0C94D00B0C94D00B0C94D00BC4 +:100050000C94D00B0C94D00B0C94D00B0C94D00BB4 +:100060000C94D00B0C94D00B0C94D00B0C94D00BA4 +:100070000C94D00B0C94D00B0C94D00B0C94D00B94 +:100080000C94D00B0C94D00B0C9417240C94D00B24 +:100090000C94D00B0C94D00B0C94D00B0C94D00B74 +:1000A0000C94D00B0C94D00B0C94D00B0C94D00B64 +:1000B0000C94D00B0C94D00B0C94D00B0C94E62425 +:1000C0000C94D00B0C9460280C94D00B0C94D00B97 +:1000D0000C94D00B0C94D00B0C94D00B0C94D00B34 +:1000E0000C94D00B0C94D00B0C94D00B0C94D00B24 +:1000F0000C94D00B0C94D00B0C94D00B0C94D00B14 +:100100000C94D00B0C94D00B0C94D00B0C94D00B03 +:100110000C94D00B0C943B280C94D00B0C94D00B6B +:100120000C94D00B0C94D00B0C94D00B0C94D00BE3 +:100130000C94D00B0C94D00B0C94D00B0C944F243B +:100140000C94090C0C9456270C94D00B0C94D00BE7 +:100150000C94D00B0C94B2270C94D00B0C94D00BB5 +:100160000C94D00B0C94D00B0C94D00B0C94D00BA3 +:100170000C94D00B0C94D00B0C94D00B0C94D00B93 +:100180000C94D00B0C94D00B0C94D00B0C94D00B83 +:100190000C94D00B0C94D00B0C94D00B0C94D00B73 +:1001A0000C94D00B0C94D00B0C94D00B0C94D00B63 +:1001B0000C94D00B0C94D00B0C94D00B0C94D00B53 +:1001C0000C94D00B0C94D00B0C94D00B0C94D00B43 +:1001D0000C94D00B0C94D00B0C94D00B0C94D00B33 +:1001E0000C94D00B0C94D00B0C94D00B0C94D00B23 +:1001F0000C94D00B0C940C530C94D00B6364696E6C :100200006F70737578585B001E03430068006100CF :100210006D0065006C0065006F006E002D004D00E4 :1002200069006E00690000002A034B006100730042 @@ -40,22 +40,22 @@ :100270002402060524060001070582030800FF0981 :10028000040100020A00000007050402100005072F :100290000583021000051201100102000008D016AB -:1002A000B20401000102DC01D40DD50DD60DD70D2D -:1002B000D80DD90DCE0DCF0DD30DD20D00000001FC -:1002C0003A25A625C525532C6F2C732CCE0D742CE6 -:1002D000922FA52F400007003A25A625C525672C9B -:1002E0006F2C732CCE0D742C922FA52F500007006D -:1002F0003A25A625C5256B2C6F2C732CCE0D742C9E -:10030000922FA52FA40007003A25A625C525E52F85 -:1003100012301630CE0D1730F836143700040400B2 -:100320003A25A625C525F42F12301630CE0D1730EC -:10033000F8361437000407003A25A625C5250330F2 -:1003400012301630CE0D1730F83614370010040076 -:100350003A25A625C525033012301630CE0D1730AC -:10036000F8361437001007003A25A625C525D70D05 -:10037000D80DD90DCE0DCF0DD30DD20D000000013B -:100380005626D1268928DA45DD45EA45EB45324730 -:10039000D30DD20D00000000004E4F4E450000006E +:1002A000B20401000102DC01F20DF30DF40DF50DB5 +:1002B000F60DF70DEC0DED0DF10DF00D0000000148 +:1002C000A72517263626C62CE22CE62CEC0DE72CAB +:1002D0000530183040000700A72517263626DA2CEF +:1002E000E22CE62CEC0DE72C05301830500007000E +:1002F000A72517263626DE2CE22CE62CEC0DE72C63 +:1003000005301830A4000700A725172636265830D8 +:1003100085308930EC0D8A306B3787370004040054 +:10032000A72517263626673085308930EC0D8A30B0 +:100330006B37873700040700A72517263626763047 +:1003400085308930EC0D8A306B3787370010040018 +:10035000A72517263626763085308930EC0D8A3071 +:100360006B37873700100700A72517263626F50DAF +:10037000F60DF70DEC0DED0DF10DF00D0000000187 +:10038000C7264427FC2862466546724673461249D2 +:10039000F10DF00D00000000004E4F4E4500000032 :1003A000000000000000000000000000000000004D :1003B000000000000000000000014D465F554C5455 :1003C00052414C4947485400000000000000000022 @@ -130,2875 +130,2927 @@ :100810004C455F4649454C44000000000000000084 :100820000000000000000000000000000A53544FC8 :1008300052455F4C4F4700000000000000000000E0 -:1008400000000000000000000000000000004F4613 -:100850004600000000000000000000000000000052 -:100860000000000000000000000000000000014D3A -:10087000454D4F52590000000000000000000000EC -:100880000000000000000000000000000000000266 -:100890004C49564500000000000000000000000028 +:10084000000000000000000000000000000B434C0E +:100850004F4E4500000000000000000000000000B6 +:100860000000000000000000000000000000004F39 +:1008700046460000000000000000000000000000EC +:100880000000000000000000000000000000000167 +:100890004D454D4F5259000000000000000000007F :1008A0000000000000000000000000000000000048 -:1008B000004E4F4E45000000000000000000000008 +:1008B000024C495645000000000000000000000006 :1008C0000000000000000000000000000000000028 -:1008D0000001504F57455245440000000000000001 +:1008D00000004E4F4E4500000000000000000000E8 :1008E0000000000000000000000000000000000008 -:1008F0000000025445524D494E414C5F434F4E4E0D +:1008F000000001504F5745524544000000000000E1 :1009000000000000000000000000000000000000E7 -:10091000000000035445524D494E414C5F5258541B -:10092000580000000000000000000000000000006F -:10093000000000000453455454494E475F4348416A -:100940004E474500000000000000000000000000CD -:100950000000000000054D454D4F52595F53544F64 -:1009600052454400000000000000000000000000AC -:10097000000000000000064D454D4F52595F4348AE -:10098000414E474544000000000000000000000008 -:100990000000000000000008434F4445435F5258E8 -:1009A0000000000000000000000000000000000047 -:1009B000000000000000000009434F4445435F541D +:10091000000000025445524D494E414C5F434F4E3A +:100920004E00000000000000000000000000000079 +:1009300000000000035445524D494E414C5F52584F +:1009400054580000000000000000000000000000FB +:1009500000000000000453455454494E475F43488B +:10096000414E47450000000000000000000000006C +:10097000000000000000054D454D4F52595F535493 +:100980004F5245440000000000000000000000003D +:1009900000000000000000064D454D4F52595F43D6 +:1009A00048414E47454400000000000000000000A0 +:1009B000000000000000000008434F4445435F5220 :1009C00058000000000000000000000000000000CF -:1009D000000000000000000000074649454C445F4D -:1009E00044455445435445440000000000000000C5 -:1009F000000000000000000000000A4C4F474D4579 -:100A00004D5F46554C4C0000000000000000000007 -:100A1000000000000000000000000025632C25639A -:100A20000025356400416E7920696E7465676572D2 -:100A30002066726F6D203020746F2025752E205235 -:100A400065666572656E636520766F6C7461676557 -:100A50002077696C6C2062652028564343202A2049 -:100A60005448524553484F4C44202F203430393598 -:100A700029206D562E002575002535640030203D57 -:100A8000206E6F2074696D656F75740D0A312D3697 -:100A90003030203D20313030206D73202D20363015 -:100AA000303030206D732074696D656F757400256A -:100AB00075206D730025342E345800253575206D52 -:100AC00056002575202866726F6D20776869636807 -:100AD000202575206E6F6E2D766F6C6174696C6564 -:100AE000290025750025750025632C2563005241DA -:100AF0004E444F4D004E4F205549442E00436861EF -:100B00006D656C656F6E4D696E6920526576472024 -:100B10002553207573696E67204C55464120255337 -:100B200020636F6D70696C6564207769746820411B -:100B300056522D4743432025532E2042617365644E -:100B4000206F6E20746865206F70656E2D736F75F1 -:100B5000726365204E464320746F6F6C204368615A -:100B60006D656C656F6E4D696E692E20687474706A -:100B7000733A2F2F6769746875622E636F6D2F65E6 -:100B80006D7365632F4368616D656C656F6E4D694C -:100B90006E6920636F6D6D697420255300313830A4 -:100BA0003132320031353131313500352E342E308D -:100BB0000037626430656631000D0A000D0A000DD1 -:100BC0000A000D0A000D0A000D0A00643130303AA7 -:100BD0004F4B00000000000000000000000000007B -:100BE000000000000000000000000000653130310E -:100BF0003A4F4B2057495448205445585400000060 -:100C0000000000000000000000000000006E313114 -:100C1000303A57414954494E4720464F5220584D8B -:100C20004F44454D00000000000000000000C832A5 -:100C300030303A554E4B4E4F574E20434F4D4D415D -:100C40004E4400000000000000000000000000C949 -:100C50003230313A494E56414C494420434F4D4D74 -:100C6000414E44205553414745000000000000001C -:100C7000CA3230323A494E56414C494420504152D2 -:100C8000414D4554455200000000000000000000A6 -:100C900000783132303A46414C53450000000000A4 -:100CA0000000000000000000000000000000000044 -:100CB0000000793132313A545255450000000000AD +:1009D00000000000000000000009434F4445435F51 +:1009E000545800000000000000000000000000005B +:1009F00000000000000000000000074649454C448C +:100A00005F44455445435445440000000000000045 +:100A100000000000000000000000000A4C4F474D9D +:100A2000454D5F46554C4C000000000000000000A2 +:100A300000000000000000000000000025632C25DD +:100A4000630025356400416E7920696E74656765C1 +:100A5000722066726F6D203020746F2025752E20F5 +:100A60005265666572656E636520766F6C7461674A +:100A7000652077696C6C2062652028564343202AE4 +:100A8000205448524553484F4C44202F203430398D +:100A90003529206D562E002575002535640030203F +:100AA0003D206E6F2074696D656F75740D0A312D70 +:100AB000363030203D20313030206D73202D2036EF +:100AC00030303030206D732074696D656F7574003F +:100AD0002575206D730025342E345800253575207A +:100AE0006D56002575202866726F6D2077686963E2 +:100AF00068202575206E6F6E2D766F6C6174696C41 +:100B000065290025750025750025632C2563005295 +:100B1000414E444F4D004E4F205549442E004368EE +:100B2000616D656C656F6E4D696E692052657647C3 +:100B3000202553207573696E67204C55464120254A +:100B40005320636F6D70696C6564207769746820E9 +:100B50004156522D4743432025532E204261736551 +:100B600064206F6E20746865206F70656E2D736FE2 +:100B700075726365204E464320746F6F6C20436826 +:100B8000616D656C656F6E4D696E692E2068747459 +:100B900070733A2F2F6769746875622E636F6D2FBB +:100BA000656D7365632F4368616D656C656F6E4D30 +:100BB000696E6920636F6D6D69742025530031384B +:100BC000303132350031353131313500352E342E6A +:100BD000300063366432393638000D0A000D0A00E1 +:100BE0000D0A000D0A000D0A000D0A0064313030B4 +:100BF0003A4F4B0000000000000000000000000021 +:100C0000000000000000000000000000006531301E +:100C1000313A4F4B2057495448205445585400000E +:100C200000000000000000000000000000006E3125 +:100C300031303A57414954494E4720464F52205887 +:100C40004D4F44454D00000000000000000000C86A +:100C50003230303A554E4B4E4F574E20434F4D4D4C +:100C6000414E4400000000000000000000000000B1 +:100C7000C93230313A494E56414C494420434F4DD8 +:100C80004D414E44205553414745000000000000AF +:100C900000CA3230323A494E56414C494420504104 +:100CA00052414D4554455200000000000000000034 +:100CB0000000783132303A46414C53450000000084 :100CC0000000000000000000000000000000000024 -:100CD000000000CB3230333A54494D454F55540053 +:100CD000000000793132313A54525545000000008D :100CE0000000000000000000000000000000000004 -:100CF0000000000056455253494F4E0000000000CE -:100D000000000000000000000000AF19434F4E46F5 -:100D10004947000000000000000000000000000043 -:100D2000D719D11955494400000000000000000007 -:100D300000000000000000002D1AEE195245414449 -:100D40004F4E4C5900000000000000000000000061 -:100D50008B1A7F1A55504C4F414400000000000090 -:100D600000000000B81A000000000000444F574E79 -:100D70004C4F41440000000000000000BD1A00007C -:100D800000000000524553455400000000000000E0 -:100D900000000000C21A0000000000005550475239 -:100DA000414445000000000000000000CD1A000092 -:100DB000000000004D454D53495A45000000000019 -:100DC00000000000000000000000D81A55494453FC -:100DD000495A45000000000000000000000000002B -:100DE0000000F01A52425554544F4E0000000000CB -:100DF00000000000000000000D1B061B524255546D -:100E0000544F4E5F4C4F4E47000000000000000062 -:100E1000291B221B4C425554544F4E000000000029 -:100E20000000000000000000451B3E1B4C425554D2 -:100E3000544F4E5F4C4F4E47000000000000000032 -:100E4000611B5A1B4C4544475245454E000000006B -:100E500000000000000000007D1B761B4C45445242 -:100E600045440000000000000000000000000000F9 -:100E7000991B921B4C4F474D4F444500000000000A -:100E80000000000000000000B31BAE1B4C4F474D9C -:100E9000454D0000000000000000000000000000C0 -:100EA0000000C81B4C4F47444F574E4C4F41440025 -:100EB00000000000ED1B0000000000004C4F4753F5 -:100EC000544F52450000000000000000F21B0000DB -:100ED000000000004C4F47434C45415200000000C9 -:100EE00000000000F51B00000000000053455454B2 -:100EF000494E470000000000000000000000000014 -:100F0000FD1BF81B434C454152000000000000004F -:100F100000000000051C00000000000053544F5268 -:100F2000450000000000000000000000091C000057 -:100F300000000000524543414C4C000000000000FE -:100F4000000000000D1C000000000000434841525A -:100F500047494E470000000000000000000000006C -:100F60000000111C48454C5000000000000000002B -:100F700000000000191C00000000000052535349FB -:100F80000000000000000000000000000000000061 -:100F90000000551C5359535449434B0000000000B6 -:100FA00000000000000000000000881C53454E4473 -:100FB0005F524157000000000000000000002E1D9D -:100FC0000000000053454E440000000000000000F7 -:100FD000000000000000A41C00000000474554551C -:100FE000494400000000000000000000EA1D00006D -:100FF0000000000044554D505F4D46550000000074 -:1010000000000000CD1D0000000000004944454ED6 -:10101000544946590000000000000000071E00006F -:101020000000000054494D454F5554000000000099 -:101030000000000000000000441E241E54485245D9 -:1010400053484F4C44000000000000000000000026 -:10105000A81E901E4155544F43414C4942524154A1 -:1010600045000000321F0000000000004649454CCA -:10107000440000000000000000000000000000002C -:10108000F41E1E1F00000000000000000000000011 -:1010900000000000000000000000000053414B3A37 -:1010A00009005549443A0900415451413A09005454 -:1010B00068657265206973206174206C6561737462 -:1010C000206F6E65206D6F7265206361726420749D -:1010D0007970652063616E6469646174652C206257 -:1010E000757420746865726520776173206E6F7403 -:1010F00020656E6F756768207465726D696E616CCE -:10110000206275666665722073706163652E0D0AD4 -:10111000000D0A00040001090100000000000000A9 -:1011200000000000000000000000004E58500000C9 -:1011300000000000000000000000004D4946415240 -:1011400045204D696E6900000000000000000000AD -:10115000000000000000000000000000000000008F -:10116000000000000000000000000000000000007F -:101170000000000000000000000000040001080161 +:100CF00000000000CB3230333A54494D454F555433 +:100D000000000000000000000000000000000000E3 +:100D1000000000000056455253494F4E00000000AD +:100D20000000000000000000000000E119434F4EE9 +:100D300046494700000000000000000000000000DD +:100D400000091A031A554944000000000000000081 +:100D50000000000000000000006A1A2B1A524541F2 +:100D6000444F4E4C590000000000000000000000FD +:100D700000C81ABC1A55504C4F41440000000000F6 +:100D80000000000000F51A000000000000444F576A +:100D90004E4C4F41440000000000000000FA1A00D1 +:100DA00000000000005245534554000000000000C0 +:100DB0000000000000FF1A0000000000005550472E +:100DC000524144450000000000000000000A1B00E2 +:100DD00000000000004D454D53495A4500000000F9 +:100DE0000000000000000000000000151B554944F1 +:100DF00053495A45000000000000000000000000B8 +:100E00000000002D1B52425554544F4E000000006C +:100E10000000000000000000004A1B431B52425526 +:100E200054544F4E5F4C4F4E4700000000000000EE +:100E300000661B5F1B4C425554544F4E000000008F +:100E4000000000000000000000821B7B1B4C42558C +:100E500054544F4E5F4C4F4E4700000000000000BE +:100E6000009E1B971B4C4544475245454E000000D1 +:100E7000000000000000000000BA1BB31B4C4544FA +:100E80005245440000000000000000000000000087 +:100E900000D61BCF1B4C4F474D4F44450000000070 +:100EA000000000000000000000F01BEB1B4C4F474F +:100EB0004D454D0000000000000000000000000053 +:100EC000000000051C4C4F47444F574E4C4F4144C7 +:100ED00000000000002A1C0000000000004C4F47EA +:100EE00053544F524500000000000000002F1C002A +:100EF00000000000004C4F47434C454152000000A9 +:100F00000000000000321C000000000000534554A7 +:100F100054494E470000000000000000000000009F +:100F2000003A1C351C434C454152000000000000B3 +:100F30000000000000421C00000000000053544F5D +:100F400052450000000000000000000000461C00A8 +:100F50000000000000524543414C4C0000000000DE +:100F600000000000004A1C0000000000004348414F +:100F70005247494E470000000000000000000000FA +:100F80000000004E1C48454C5000000000000000CE +:100F90000000000000561C000000000000525353E7 +:100FA00049000000000000000000000000000000F8 +:100FB000000000921C5359535449434B0000000059 +:100FC0000000000000000000000000C51C53454E5A +:100FD000445F524157000000000000000000006B19 +:100FE0001D0000000053454E4400000000000000BA +:100FF00000000000000000E11C0000000047455414 +:1010000055494400000000000000000000271E00B9 +:10101000000000000044554D505F4D465500000053 +:1010200000000000000A1E000000000000494445C6 +:101030004E544946590000000000000000441E00C4 +:10104000000000000054494D454F55540000000079 +:10105000000000000000000000811E611E54485284 +:101060004553484F4C4400000000000000000000C1 +:1010700000EE1ED41E4155544F43414C494252414B +:101080005445000000811F00000000000046494553 +:101090004C440000000000000000000000000000C0 +:1010A00000431F6D1F434C4F4E45000000000000E1 +:1010B00000000000009E1F00000000000000000073 +:1010C0000000000000000000000000000000000020 +:1010D000000000000053414B3A09005549443A09C9 +:1010E00000415451413A09005468657265206973A2 +:1010F000206174206C65617374206F6E65206D6F64 +:101100007265206361726420747970652063616E1A +:101110006469646174652C206275742074686572FA +:101120006520776173206E6F7420656E6F756768D8 +:10113000207465726D696E616C2062756666657299 +:101140002073706163652E0D0A000D0A0004000112 +:101150000901000000000000000000000000000085 +:10116000000000004E585000000000000000000089 +:10117000000000004D4946415245204D696E69000E :10118000000000000000000000000000000000005F -:1011900000004E5850000000000000000000000059 -:1011A00000004D494641524520436C6173736963A9 -:1011B00020316B0000000000000000000000000073 -:1011C000000000000000000000000000000000001F -:1011D000000000000000000000000000000000000F -:1011E00000000200011801000000000000000000E3 -:1011F0000000000000000000004E585000000000F9 -:101200000000000000000000004D4946415245200A -:10121000436C617373696320346B0000000000004D +:10119000000000000000000000000000000000004F +:1011A000000000000000000000000000000000003F +:1011B0000000000004000108010000000000000021 +:1011C00000000000000000000000004E5850000029 +:1011D00000000000000000000000004D49464152A0 +:1011E0004520436C617373696320316B000000001C +:1011F00000000000000000000000000000000000EF +:1012000000000000000000000000000000000000DE +:1012100000000000000000000000000200011801B2 :1012200000000000000000000000000000000000BE -:1012300000000000000000000000000000000000AE -:101240000000000000000000004400010001000058 -:10125000000000000000000000000000000000008E -:101260004E58500000000000000000000000000088 -:101270004D494641524520556C7472616C696768EE -:1012800074000000000000000000000000000000EA -:10129000000000000000000000000000000000004E -:1012A000000000000000000000000000000000003E -:1012B00044030120017577810280000000000000D6 -:1012C000000000000005004E585000000000000023 -:1012D000000000000000004D4946415245204445B1 -:1012E0005346697265000000000000000000000025 -:1012F00000000000000000000000000000000000EE -:1013000000000000000000000000000000000000DD -:1013100000000000000000440301200175778102F5 -:1013200080000000000000000000000005004E5892 -:1013300050000000000000000000000000004D49C7 -:101340004641524520444553466972652045563111 -:10135000000000000000000000000000000000008D -:10136000000000000000000000000000000000007D -:101370000000000000000000000000000000040366 -:101380000128013877B14A434F5033310000000043 -:10139000000000090149424D00000000000000006B -:1013A00000000000004A434F5033310000000000AD -:1013B000000000000000000000000000000000002D -:1013C000000000000000000000000000000000001D -:1013D000000000000000000000000000000000000D -:1013E000000000000048000120017877B1024A4364 -:1013F0004F5076323431000000000C0149424D005C -:101400000000000000000000000000004A434F50B0 -:1014100033312076322E342E3100000000000000DF -:1014200000000000000000000000000000000000BC -:1014300000000000000000000000000000000000AC -:101440000000000000000000000000004800012033 -:10145000013833B14A434F50343156323200000024 -:10146000000C0149424D0000000000000000000097 -:101470000000004A434F5034312076322E320000B3 -:10148000000000000000000000000000000000005C -:10149000000000000000000000000000000000004C -:1014A000000000000000000000000000000000003C -:1014B00000000004000128013833B14A434F503482 -:1014C00031563233310000000D0149424D00000019 -:1014D000000000000000000000004A434F5034317B -:1014E0002076322E332E3100000000000000000074 -:1014F00000000000000000000000000000000000EC -:1015000000000000000000000000000000000000DB -:10151000000000000000000000000400018801003D +:1012300000004E58500000000000000000000000B8 +:1012400000004D494641524520436C617373696308 +:1012500020346B00000000000000000000000000CF +:10126000000000000000000000000000000000007E +:10127000000000000000000000000000000000006E +:101280000000440001000100000000000000000018 +:101290000000000000000000004E58500000000058 +:1012A0000000000000000000004D4946415245206A +:1012B000556C7472616C696768740000000000000E +:1012C000000000000000000000000000000000001E +:1012D000000000000000000000000000000000000E +:1012E00000000000000000000044030120017577A9 +:1012F00081028000000000000000000000000500E6 +:101300004E585000000000000000000000000000E7 +:101310004D49464152452044455346697265000097 +:1013200000000000000000000000000000000000BD +:1013300000000000000000000000000000000000AD +:10134000000000000000000000000000000000009D +:101350004403012001757781028000000000000035 +:10136000000000000005004E585000000000000082 +:10137000000000000000004D494641524520444510 +:101380005346697265204556310000000000000098 +:10139000000000000000000000000000000000004D +:1013A000000000000000000000000000000000003D +:1013B0000000000000000004030128013877B14A52 +:1013C000434F503331000000000000000901494242 +:1013D0004D000000000000000000000000004A4333 +:1013E0004F503331000000000000000000000000FA +:1013F00000000000000000000000000000000000ED +:1014000000000000000000000000000000000000DC +:101410000000000000000000000000000000480084 +:101420000120017877B1024A434F507632343100BF +:101430000000000C0149424D0000000000000000C7 +:1014400000000000004A434F5033312076322E34E2 +:101450002E3100000000000000000000000000002D +:10146000000000000000000000000000000000007C +:10147000000000000000000000000000000000006C +:10148000000000000048000120013833B14A434FFA +:10149000503431563232000000000C0149424D00F8 +:1014A0000000000000000000000000004A434F5010 +:1014B00034312076322E320000000000000000009F +:1014C000000000000000000000000000000000001C +:1014D000000000000000000000000000000000000C +:1014E00000000000000000000000000004000128CF +:1014F000013833B14A434F50343156323331000052 +:10150000000D0149424D00000000000000000000F5 +:101510000000004A434F5034312076322E332E31B2 :1015200000000000000000000000000000000000BB -:1015300000496E66696E656F6E0000000000000075 -:10154000004D494641524520436C617373696320E5 -:10155000316B0000000000000000000000000000EF -:10156000000000000000000000000000000000007B -:10157000000000000000000000000000000000006B -:1015800000020001980100000000000000000000BF -:10159000000000000000000047656D706C7573006E -:1015A00000000000000000004D50434F53000000B9 -:1015B000000000000000000000000000000000002B +:1015300000000000000000000000000000000000AB +:10154000000000000000000000000000000000009B +:1015500000000004000188010000000000000000FD +:1015600000000000000000000000496E66696E6522 +:101570006F6E00000000000000004D4946415245DA +:1015800020436C617373696320316B0000000000BD +:10159000000000000000000000000000000000004B +:1015A000000000000000000000000000000000003B +:1015B000000000000000000000000200019801008F :1015C000000000000000000000000000000000001B -:1015D000000000000000000000000000000000000B -:1015E0000000000000000000000C010000000000EE -:1015F00000000000000000000000000000000049A2 -:101600006E6E6F766973696F6E2052265400004AC1 -:101610006577656C0000000000000000000000001D -:1016200000000000000000000000000000000000BA -:1016300000000000000000000000000000000000AA -:101640000000000000000000000000000000000298 -:101650000001380100000000000000000000000050 -:101660000000000000004E6F6B6961000000000088 -:101670000000000000004D494641524520436C6186 -:101680007373696320346B202D20656D756C6174F4 -:10169000656420283632313220436C61737369638C -:1016A0002900000000000000000000000000000011 -:1016B00000000000000008000138010000000000E8 -:1016C000000000000000000000000000004E6F6BF2 -:1016D000696100000000000000000000004D494664 -:1016E00041524520436C617373696320346B202D34 -:1016F00020656D756C617465642028363133312046 -:101700004E464329000000000000000000000000D9 -:101710000000000000000000000000000000112494 -:101720001FBECFEFCDBFDFE3DEBF00E00CBF18BEB2 -:1017300019BE1ABE1BBE14E2A0E0B0E2E8E7F7EB68 -:1017400000E00BBF02C007900D92AA30B107D9F795 -:101750001BBE25E3AAE0B4E201C01D92A834B20783 -:10176000E1F77ED00C94BA5B66C13BB78BBFFB013F -:10177000879196913BBF08953BB78BBFCB0142E267 -:101780000D94F00F3BB70B0143E20D94F00F3BB704 -:101790008BBFCB0145E20D94F00F3BB746E208C08A -:1017A0002091CF0127FDFCCF22272093CA01089565 -:1017B0004093CA0128ED31E0209334003093CB01EF -:1017C0006091C4017091C5018091C6019927089567 -:1017D000FC014093CA01849108950F9200240F9355 -:1017E0002F933F934F935F930FB70F93EF93FF9315 -:1017F000EAB1FBB15191442735B124B1569578F443 -:1018000000928C080092000806E10A95F1F700C0EA -:1018100001E00093000803E000938C0804C00AE193 -:101820000A95F1F700002150304019F40E942D274D -:101830000CC04F5F477011F4519102C000C000C04E -:101840000AE00A95F1F700C0D9CFFF91EF910F910F -:101850000FBF5F914F913F912F910F910F9018956E -:101860000CD10E94E0160E947117A6D21092520667 -:1018700084E08093420682E680938601C1E0C093B3 -:101880002606C093210686E080932206C093310687 -:1018900002E00093320610922A0613E01093290604 -:1018A00089E5809380018AE58093810180E48093BB -:1018B0004106809346069091B200907F9093B200CB -:1018C0009091B20092609093B20090E390934106A1 -:1018D0009093460680935006C093460600934506B3 -:1018E0001093410683E18093010821E030E02093CA -:1018F000260830932708209328083093290810924F -:101900008C08809380081092230310922103D8E062 -:10191000D093220381E18093200380911E20909137 -:101920001F2080933803909339038CE380938203C4 -:10193000D093800380938303D093810366D10E9468 -:101940001319B7D10FD7C093000210920102009370 -:10195000020210930402C0932002D09321020E943D -:10196000731517D1D2E0C1E18091030481FF25C036 -:101970008091010480FDFCCFD09303040E94751771 -:10198000AED10E944519F6D60E94DB16E0915A2E80 -:10199000F0915B2E19950E9425220E94B218E091C9 -:1019A000692EF0916A2E8781813011F4C093132C37 -:1019B0008681813011F4C093122C0E94171994D79C -:1019C000E091582EF091592E1995E091522EF091F8 -:1019D000532E1995C9CF292F33272230310559F0BD -:1019E0002330310569F021303105E9F482E190E0DE -:1019F00026E932E01CC08EE390E028E532E017C013 -:101A000099278130910549F028F0029761F4E8E0C8 -:101A1000F2E005C0E4E5F2E002C0E8E2F2E0849121 -:101A200090E09F0104C080E090E020E030E0FA0107 -:101A30002083318308951F920F920FB60F921124C5 -:101A400008B60F9218BEFFCF1F920F920FB60F92DB -:101A5000112408B60F9218BE8F939F938EB19FB139 -:101A600080589F4F8EB99FB99F918F910F9008BE5C -:101A70000F900FBE0F901F9018958091780083FFF4 -:101A80000AC088E08093780088ED84BF81E080936D -:101A900080000D94FE008BEC8093520080915000EA -:101AA0008860809350008091510083FFFCCF82ECCE -:101AB0008093550080915000806180935000809108 -:101AC000510084FFFCCF88ED84BF84E08093400008 -:101AD0001EB81FB881E0809343002FE730E02093C9 -:101AE0000A0430930B0420930C0430930D0480936C -:101AF00000048093020480E880930001089588ED3B -:101B000084BF81E080937900089588ED84BF8BE1E4 -:101B100080938000089580915000826080935000EF -:101B20008091510081FFFCCF82E08093CA01EDE1FA -:101B3000F0E0E491E0936200ECE1F0E0E491E09306 -:101B400063001092CA0180E8809365008BEB80935C -:101B5000660080915600897F8093560080915600E0 -:101B60008460809356008091600081608093600063 -:101B70000895E0E4F0E084818E7F8483E0E6F0E085 -:101B800080818E7F8083E0E5F0E080818D7F80839F -:101B9000089587E08093A20078940895089580E0E6 -:101BA00090E008950895089508950895089508957A -:101BB000089508950F931F93CF93C82F0EE41EE24C -:101BC000D8011296ED91FC91139719950E945D2210 -:101BD000E091692EF0916A2EC583B8E1CB9FB001E8 -:101BE000112468557D4F48E150E0C8010E947D54A2 -:101BF000D801ED91FC911995D8011696ED91FC91C3 -:101C00001797CF911F910F91199448E150E068EA1E -:101C100072E08EE49EE20E947D54E091692EF09184 -:101C20006A2E8581C7CF0F931F93E091692EF091A3 -:101C30006A2E8B019C0145816AE088E993E00E944D -:101C40004E181F910F910895FF920F931F93CF93FA -:101C5000DF931F92CDB7DEB78C019E012F5F3F4F00 -:101C6000AC016AE088E993E00E946618F82E8823A8 -:101C700089F089819FDFF80140E08191882319F084 -:101C80004F5F4F31D1F7E091662EF091672EB8018A -:101C900081E119958F2D0F90DF91CF911F910F91B9 -:101CA000FF9008959B01AC016AE088E993E00C94F1 -:101CB0008D1808950C946F5408950F931F93CF932C -:101CC0008C01C62FCC2339F00E946F54F801819308 -:101CD0008F01C150F7CFCF911F910F9108950E94AE -:101CE0006F540E946F540E946F540C946F54CF93A2 -:101CF000DF93EC0161507109DA01420F531FFC01BF -:101D0000CF018C1B9D0BA417B50721F41082DF9126 -:101D1000CF91089562307105C8F39D91392F3295A6 -:101D20003F703A3010F4305D01C0395C30839F70F1 -:101D30009A3010F4905D01C0995C918332966250A4 -:101D40007109DECFCF93DF93EC01DA0120E030E0C0 -:101D50005C91552351F111969C911197992339F17A -:101D60002617370711F180ED850F8A3020F08FEBB1 -:101D7000850F8630E0F480ED890F8A3020F04FEB3C -:101D8000490F4630A0F4E52FF0E0513408F0F79702 -:101D9000E295E07F913410F4982F01C097539E2B69 -:101DA00099932F5F3F4F1296D3CFC90102C080E0B5 -:101DB00090E0DF91CF910895E0E6F6E080E1858341 -:101DC00082E0868388E085838AE18183E0EAF9E026 -:101DD0001682178280EC858388E18483E0E0F1E05D -:101DE000128A8BE6838B148A158A20EA208F99E069 -:101DF000918F128E148E158E168E84E0808B12A217 -:101E00003CE633A314A215A210A611A612A624A77D -:101E100095A716A680A308954115510509F449C058 -:101E200020E12093660623E02093A0092091A109D8 -:101E300027FFFCCF2091A0097093A0092091A10950 -:101E400027FFFCCF2091A0096093A0092091A10950 -:101E500027FFFCCF2091A00921E02093120180935D -:101E60001C0190931D014093140150931501109291 -:101E700022018AE094E28093280190932901409303 -:101E800024015093250180911001806880931001F6 -:101E9000809120018068809320018091100187FD4E -:101EA000FCCF80E3809311018093210180E1809336 -:101EB000650608954115510509F469C020E1209394 -:101EC000660626E02093A0092091A10927FFFCCFF8 -:101ED0002091A00920E120936506000000002093D6 -:101EE000660622E02093A0092091A10927FFFCCFDC -:101EF0002091A0097093A0092091A10927FFFCCF90 -:101F00002091A0096093A0092091A10927FFFCCF8F -:101F10002091A009109212012AE034E220931C01C2 -:101F200030931D01409314015093150120E120933B -:101F3000220180932801909329014093240150931A -:101F4000250180911001806880931001809120010B -:101F50008068809320018091100187FDFCCF80E391 -:101F6000809311018093210180E180936506E091C7 -:101F7000692EF0916A2E8781863019F481E1809371 -:101F8000132C8681863019F481E18093122C0895F8 -:101F9000CF92DF92EF92FF92CF93DF93C090682EA3 -:101FA000D12CE12CF12C8DE0CC0CDD1CEE1CFF1CA7 -:101FB0008A95D1F7C114D10481E0E806F10408F054 -:101FC0004EC080E18093660686E08093A0098091F0 -:101FD000A10987FFFCCF8091A00980E1809365066D -:101FE000000000008093660682E08093A009809143 -:101FF000A10987FFFCCF8091A0091092A0098091D0 -:10200000A10987FFFCCF8091A0091092A0098091BF -:10201000A10987FFFCCF8FEFE81AF80A8091A00989 -:10202000C0E0D0E1C701B601A0DB8093A009809198 -:10203000A10987FFFCCF8091A0099093A00980910E -:10204000A10987FFFCCF8091A00982E0C80ED11CB6 -:10205000E11CF11C219731F780E1809365068091A6 -:10206000010480FDFCCF82E080930304DF91CF91D7 -:10207000FF90EF90DF90CF900895CF92DF92EF9294 -:10208000FF92CF93DF93C090682ED12CE12CF12CDE -:102090008DE0CC0CDD1CEE1CFF1C8A95D1F7C11421 -:1020A000D10481E0E806F10438F0DF91CF91FF9090 -:1020B000EF90DF90CF906CCF8FEFE81AF80AC1E273 -:1020C000D0E0219791F36CDBC701B60155DB68DBEB -:1020D0008FEFD81AE80AF80AF4CFCF92DF92EF9286 -:1020E000FF920F931F93CF93DF93C090682ED12C54 -:1020F000E12CF12C8DE0CC0CDD1CEE1CFF1C8A9534 -:10210000D1F7C114D10481E0E806F10408F04FC012 -:1021100080E18093660683E08093A0098091A10905 -:1021200087FFFCCF8091A0091092A0098091A1099E -:1021300087FFFCCF8091A0091092A0098091A1098E -:1021400087FFFCCF8FEFE81AF80A8091A00901E21F -:1021500010E00150110941F123DB1FDB21DBC0E05E -:10216000D0E01092A0098091A10987FFFCCF609177 -:10217000A00970E01092A0098091A10987FFFCCF0F -:102180008091A009782BCE01FDDA0ADB2296C115D9 -:1021900081E0D80731F7C701B601F9DA01DB8FEF2B -:1021A000D81AE80AF80AD5CF80E180936506E09155 -:1021B000692EF0916A2E8781863019F490E1909310 -:1021C000132C9681963049F420E12093122C85300F -:1021D00059F483E18093132C02C08530D1F39530FC -:1021E00019F483E18093122C8091010480FDFCCFCF -:1021F00082E080930304DF91CF911F910F91FF90B4 -:10220000EF90DF90CF900895CF92DF92EF92FF9200 -:102210000F931F934115E0E25E076105710508F019 -:102220006BC06901E12CF12C00E010E220E030E00D -:10223000041B150B260B370BC016D106E206F3065E -:1022400010F49701860120E12093660626E0209392 -:10225000A0092091A10927FFFCCF2091A00920E12E -:1022600020936506000000002093660622E020937C -:10227000A0092091A10927FFFCCF2091A00950932C -:10228000A0092091A10927FFFCCF2091A00940932C -:10229000A0092091A10927FFFCCF2091A00910924D -:1022A00012012AE034E220931C0130931D010093B7 -:1022B00014011093150120E120932201809328013D -:1022C000909329010093240110932501809110011E -:1022D00080688093100180912001806880932001A4 -:1022E0008091100187FDFCCF80E3809311018093E2 -:1022F000210180E18093650681E01F910F91FF909D -:10230000EF90DF90CF900895CF92DF92EF92FF92FF -:102310000F931F934115E0E25E076105710508F018 -:102320005DC06901E12CF12C00E010E220E030E01A -:10233000041B150B260B370BC016D106E206F3065D -:1023400010F49701860120E12093660623E0209394 -:10235000A0092091A10927FFFCCF2091A00950934B -:10236000A0092091A10927FFFCCF2091A00940934B -:10237000A0092091A10927FFFCCF2091A00921E00D -:102380002093120180931C0190931D01009314016E -:1023900010931501109222018AE094E280932801A3 -:1023A000909329010093240110932501809110013D -:1023B00080688093100180912001806880932001C3 -:1023C0008091100187FDFCCF80E380931101809301 -:1023D000210180E18093650681E001C080E01F91CA -:1023E0000F91FF90EF90DF90CF9008958091CF01F3 -:1023F00087FDFCCF0895FADF8091CF0181FF0BC0EC -:1024000086E38093CA01EBECF1E021E030E088ED57 -:1024100090E084BF20830895EF92FF920F931F9363 -:10242000CF93DF93EC017B018A011092C201DEDFC2 -:10243000D701CE01800F911F26E048ED50E061E00A -:1024400070E0EBECF1E0C817D90779F0C093C00158 -:102450003D2F3F713093C1012093CA0144BF608377 -:102460003091C4013D932196EECFC801DF91CF9109 -:102470001F910F91FF90EF9008953F924F925F92BE -:102480006F927F928F929F92AF92BF92CF92DF9284 -:10249000EF92FF920F931F93CF93DF938B01542EF4 -:1024A000652E282F2F71722EEC01C21BD109A3DFDC -:1024B0009DDF83E38093CA011092C1011092C20193 -:1024C0007801052D162D85E3482E98EDC92ED12CC7 -:1024D00088248394912C3BECA32EBB24B39443E338 -:1024E000342E0115110501F17092C001F70181919F -:1024F0007F018093C4010150110921F07394F0E22F -:102500007F12EFCFC093C0018D2F8F718093C101D7 -:102510004092CA01C601F50184BF8082A09666DFA1 -:102520003092CA01712CDDCF852D962DDF91CF9190 -:102530001F910F91FF90EF90DF90CF90BF90AF90E1 -:102540009F908F907F906F905F904F903F900895F5 -:102550001F93CF93DF93CDB7DEB7A097CDBFDEBF7C -:10256000853009F4AEC078F4823081F128F48130EE -:1025700009F0F1C010E01BC0833009F453C084306F -:1025800009F475C0E8C0883009F4D3C040F486303F -:1025900009F4CDC0873009F0DEC09FDDDCC0893092 -:1025A00009F4C9C08A3009F0D6C07FD3D4C0809165 -:1025B000642E181708F0A8C07DDBE1E0F0E0EC0F16 -:1025C000FD1FE10FF11D80831F5FF1CF11E08091AE -:1025D000642E873009F010E0E0915E2EF0915F2EBE -:1025E000CE01019619954091642E31E0141708F040 -:1025F0008BC03323A9F0812F90E0E1E0F0E0EC0FF5 -:10260000FD1FE80FF91F208131E02F3F09F030E076 -:10261000E1E0F0E0EC0FFD1FE80FF91F2F5F2083D2 -:102620001F5FE4CFE0915E2EF0915F2ECE01019608 -:1026300019958091642E41E0815008F465C04423CF -:10264000D9F3282F30E0E1E0F0E0EC0FFD1FE20FBE -:10265000F31F908141E09F3F09F040E0E1E0F0E0AE -:10266000EC0FFD1FE20FF31F9F5F9083E5CF11E09A -:102670008091642E873009F010E0E0915E2EF09199 -:102680005F2ECE01019619954091642E31E014170A -:10269000D8F53323A1F0812F90E0E1E0F0E0EC0FDA -:1026A000FD1FE80FF91F208131E0211130E0E1E04A -:1026B000F0E0EC0FFD1FE80FF91F215020831F5F92 -:1026C000E6CFE0915E2EF0915F2ECE010196199536 -:1026D0008091642E41E08150B8F04423E1F3282F2B -:1026E00030E0E1E0F0E0EC0FFD1FE20FF31F90811E -:1026F00041E0911140E0E1E0F0E0EC0FFD1FE20F5E -:10270000F31F91509083E7CFE091602EF091612EFE -:10271000CE0101961995E091662EF091672E4091B9 -:10272000642EBE016F5F7F4F83E1199514C0A3D360 -:1027300012C02EDC10C080910008813021F49091ED -:102740008C08933009F080E080FD03C00E94E722EE -:1027500002C00E940D23A096CDBFDEBFDF91CF91B6 -:102760001F910895E0E0F6E080E6828388E1868BA1 -:10277000858B0895CF93C0910806C095C6FF12C0FF -:1027800080910C248A3050F08A30E1F4E091692E77 -:10279000F0916A2E8181DCDE80910C248F5F809322 -:1027A0000C2410C08C2F807669F480910C24815009 -:1027B0008A3030F4E091692EF0916A2E8081C8DE73 -:1027C00010920C24C5FF12C080910B248A3050F067 -:1027D0008A30D9F4E091692EF0916A2E8381B8DEB7 -:1027E00080910B248F5F80930B240FC0C07669F417 -:1027F00080910B2481508A3030F4E091692EF09161 -:102800006A2E8281A5DE10920B24CF9108959B0140 -:10281000AC016BE082EE96E080C4E82FF0E0E8596E -:10282000F14D88E0638381503A968111FBCF089582 -:102830000F931F939B01E091692EF0916A2EE80F90 -:10284000F11D8A0140816BE082EE96E027D41F9152 -:102850000F9108950F931F93CF93DF931F92CDB7DE -:10286000DEB7082FAB019E012F5F3F4F6BE082EE7A -:1028700096E02CD4182F882319F06981802FCDDFA2 -:10288000812F0F90DF91CF911F910F91089508959F -:10289000EF92FF920F931F93CF937B01C42F0EB142 -:1028A0001FB12091080430910904022B132B682FCB -:1028B00083E090E20E947F526C2F83E090E20E94BE -:1028C0007F52612F83E090E20E947F52602F83E06D -:1028D00090E20E947F526C2F70E0C701CF911F9150 -:1028E0000F91FF90EF9099C408953F924F925F929D -:1028F0006F927F928F929F92AF92BF92CF92DF9210 -:10290000EF92FF920F931F93CF93DF937C01E90126 -:10291000C0900020D0900120960122503843C90178 -:10292000A0E0B0E0481759076A077B0708F05FC0CE -:10293000E2E0CE1AE0E4DE0A2A013B014C0E5D1E05 -:10294000611C711C481659066A067B0648F0241B58 -:10295000350B8E01021B130BE9013324339403C0A2 -:1029600000E010E0312C4601A12CB12C481559058E -:102970006A057B0510F5CA018E5F9F4B2A013B015A -:102980004C0E5D1E611C711C481459046A047B04C2 -:1029900028F4AE01BC01C7013FDA18C0C41AD50A39 -:1029A000A601BC01C70138DAAE014C195D0962E12C -:1029B00074E2C7018C0D9D1D07C04C195D09BA0159 -:1029C0006E5E7B4DAE01C7010E94AB54332041F0D7 -:1029D0000C0F1D1FF701E00FF11FCE0DDF1D02C010 -:1029E00081E006C0EC17FD07D9F31292FBCF80E01F -:1029F000DF91CF911F910F91FF90EF90DF90CF90DB -:102A0000BF90AF909F908F907F906F905F904F900E -:102A10003F90089520910E2430910F2480E098E09B -:102A2000821B930BE2E1F4E29F012251344228170A -:102A3000390710F41192F8CF82E194E280931024C8 -:102A40009093112480E098E080930E2490930F24BB -:102A500082E090E4809300209093012042E050E0D7 -:102A600060E070E480E090E225DAE091692EF09178 -:102A70006A2E87818A3019F480E18093132C868135 -:102A80008A3019F480E18093122C089580910E24ED -:102A900090910F2490582091002030910120821BAA -:102AA000930B0895E8E6FEE287833A969EE2E83BC0 -:102AB000F907D1F7813049F018F0823059F00895C4 -:102AC00010920D2487E494E109C080930D248EECCC -:102AD00095E104C010920D2488E494E18093662E61 -:102AE0009093672E08950F931F93CF93DF931F92B8 -:102AF000CDB7DEB7E091692EF0916A2E8481D2DFE6 -:102B000082E194E2809310249093112400E018E075 -:102B100000930E2410930F2441E050E0BE016F5F3C -:102B20007F4F80E090E078DCE0911024F091112458 -:102B3000DF01C8011D920197E9F78981882341F0DF -:102B400042E050E060E070E480E090E265D917C0B8 -:102B500082E090E4809300209093012042E050E0D6 -:102B600060E070E480E090E2A5D981E0898341E0F3 -:102B700050E0BE016F5F7F4F80E090E07EDCE0912F -:102B8000662EF091672E40E060E070E08FEF1995BF -:102B90000F90DF91CF911F910F9108950F931F9385 -:102BA000CF93DF93CEB1DFB1A0910804B0910904B7 -:102BB00020910E2430910F24E42FF0E08F010C5F60 -:102BC0001F4F2017310758F1CA2BDB2B2450310936 -:102BD0002E1B3F0B20930E2430930F24A091102422 -:102BE000B09111248C9311964C9311971296DC930B -:102BF0001297CD010496809310249093112413967C -:102C0000CC93DB01EC01415018F02D912993FBCFBF -:102C1000E80FF91FE0931024F093112412C080E014 -:102C200041DFE091692EF0916A2E87818A3019F494 -:102C300081E18093132C86818A3019F481E180939D -:102C4000122CDF91CF911F910F9108951F93CF9375 -:102C5000DF931F92CDB7DEB79E012F5F3F4FAC01D0 -:102C600063E08DE498E032D2182F882311F0898137 -:102C700019DF812F0F90DF91CF911F9108950F934E -:102C80001F93E091692EF0916A2E8B019C01448183 -:102C900063E08DE498E002D21F910F9108959B01AB -:102CA000AC0163E08DE498E038C20F931F93CF939B -:102CB000DF9380910E2490910F24811528E09207D4 -:102CC00008F074C06091002070910120C0E0D0E84D -:102CD000C61BD70B00E018E0A801481B590BC4170E -:102CE000D50758F182E194E2E5D820910E24309185 -:102CF0000F248091002090910120985F821B930BFC -:102D00008093002090930120021B130BE2E1F4E278 -:102D1000CF01825194428017910710F41192F8CF9D -:102D200082E194E2809310249093112480E098E053 -:102D300080930E2490930F242EC02097B9F1AE01FA -:102D400082E194E2B7D8A8014C1B5D0BBE016E5E18 -:102D50007B4D82E194E20E94B454809110249091C2 -:102D600011248C1B9D0B809310249093112480912F -:102D70000E2490910F248C0F9D1F80930E2490930E -:102D80000F248091002090910120C80FD91FC0937B -:102D90000020D093012042E050E060E070E480E049 -:102DA00090E2DF91CF911F910F9184C8DF91CF9175 -:102DB0001F910F91089580910D24811176CF089570 -:102DC00043E550E068E67EE281E090E025CB43E514 -:102DD00050E068E67EE281E090E04FCBCF93DF9356 -:102DE000C8E6DEE2688181E090E00E944C5B698188 -:102DF0007A8182E090E0DF91CF910C94555BCF9384 -:102E0000DF93CFEFC80FC83080F5D82F0E945D2226 -:102E100064D9C093682E8AE0C89F90011124C9012B -:102E20008559914D8093692E90936A2EF901E85946 -:102E3000F14D80850E94DA0DE091692EF0916A2EA5 -:102E4000848130DEA5D8CADF8FE18D0FE091692E35 -:102E5000F0916A2E9781943011F48093132C96810F -:102E6000943029F48093122C02C080E001C081E0EC -:102E7000DF91CF9108958091682E99E04AE09150BA -:102E800099F0282F30E02F5F3F4F27703327822F94 -:102E9000429FF001439FF00D1124E859F14D208528 -:102EA000222369F38F5FABCF0895FC019091682EC8 -:102EB0009F5C908311820895CF93FC0121812111A1 -:102EC0000DC0BC01C081E091662EF091672E41E0FB -:102ED00082E1199580ED8C0FCF9191CF80E0CF9159 -:102EE000089588E18093010608958091122C823123 -:102EF00091F030F48031B9F050F48823A9F132C058 -:102F0000833169F090EE980F983088F02BC088E0FC -:102F10008093050627C088E08093070623C0809130 -:102F2000040683FF12C088E0809306061BC09091C0 -:102F3000142C9F5F913019F09093142C15C01092AF -:102F4000142C9091040693FD04C088E0809305063C -:102F50000BC098E090930606803221F08150809358 -:102F6000122C02C01092122C8091132C823191F0FD -:102F700030F48031C1F050F48823A9F132C083319C -:102F800069F090EE980F983088F02BC080E1809324 -:102F9000050627C080E18093070623C080910406C0 -:102FA00084FF12C080E1809306061BC09091152C0F -:102FB0009F5F913019F09093152C08951092152C65 -:102FC0009091040694FD04C080E180930506089565 -:102FD00090E190930606803221F081508093132C6B -:102FE00008951092132C08959B01AC016BE080EBC7 -:102FF00098E093C0E8E6FEE298E0282F2071887000 -:10300000211162878111618791503A969111F8CF11 -:10301000222329F090E1909306061092132C882326 -:1030200029F088E0809306061092122C08950F93E1 -:103030001F939B018A01803131F4E091692EF09158 -:103040006A2E478107C0883049F4E091692EF091DB -:103050006A2E46816BE080EB98E020D01F910F91A3 -:1030600008950F931F93CF93DF931F92CDB7DEB7D1 -:10307000082FAB019E012F5F3F4F6BE080EB98E084 -:1030800025D0182F882319F06981802FB3DF812F75 -:103090000F90DF91CF911F910F9108950F931F9380 -:1030A000FC01662379F094916150941309C0BF012B -:1030B0006F5F7F4FA801C9010E948F5481E003C058 -:1030C000B196EFCF80E01F910F910895CF92DF92DC -:1030D000EF92FF921F93CF93DF93EC017A01690186 -:1030E000162F112389F0BE016F5F7F4FC7010E9429 -:1030F00086541150892B31F4FE01C491F601C0832E -:1031000081E003C0A196EDCF80E0DF91CF911F91C8 -:10311000FF90EF90DF90CF900895CF930196CCE28F -:103120006623D1F0FC01DA01AD017491772341F0FF -:1031300021153105A9F07D93319621503109F4CF45 -:10314000623038F02115310559F0FD01C0834F5F21 -:103150005F4F61508196E4CF232B11F0FA0110826A -:10316000CF91089580912002806880932002809101 -:10317000230280FFFCCF81E080932302A091100204 -:10318000B0911102AE5BB109B7FF02C0A0E0B0E0A0 -:1031900020E038EB4BE050E00E940954E091692EAA -:1031A000F0916A2E843F9140A8F48781873019F40A -:1031B00080E18093132C8681873019F480E180931D -:1031C000122C8091642E882389F0E091562EF09184 -:1031D000572E19948781873019F481E18093132C3D -:1031E0008681873019F481E18093122C0895BC0107 -:1031F00083E090E20C943152CF93DF93FC01649111 -:10320000EC012196662331F083E090E20E947F5228 -:10321000CE01F4CFDF91CF910895AB01BC0183E0E3 -:1032200090E20C945B5280E2809362060895CF9303 -:10323000DF938091162C823029F583E090E20E9482 -:10324000E8520E94C64D83E090E20E940453EC01D4 -:1032500097FD18C0E091692EF0916A2E8781833026 -:1032600019F483E18093132C8681833019F483E170 -:103270008093122C8C2F44D6811104C08C2FDF91A7 -:10328000CF91E1C7DF91CF9108958091162C8130C5 -:1032900079F028F08230C9F0833011F12EC080918E -:1032A000680685FF31C08FE08093022081E015C061 -:1032B00080910220815080930220811125C00E94BC -:1032C0008B0D0E945E5182E008C08091680685FDEA -:1032D00018C08FE08093022083E08093162C0DC0ED -:1032E0008091022081508093022081110DC00E94A4 -:1032F00023510E94B90D1092162C8091162C823009 -:1033000019F44DD70C9425220895E091692EF0917F -:103310006A2E8781823019F481E18093132C868193 -:10332000823019F481E18093122C0895E091692E86 -:10333000F0916A2E8781823019F480E18093132CFA -:103340008681823019F480E18093122C089583E005 -:1033500090E20C940C5283E090E20C94575321EBD2 -:103360003BE03F932F932BEA3BE03F932F9324EADC -:103370003BE03F932F932DE93BE03F932F932DEFBD -:103380003AE03F932F9322E02F931F929F938F93C6 -:103390000E9414558DB79EB70E968DBF9EBF85E6D1 -:1033A000089560E072E00E94130E85E60895FB0127 -:1033B00020812F3349F42181211106C060E072E0A1 -:1033C0000E94520E85E60895CB010E94240E8823A8 -:1033D00019F0FDDC84E608958AEC0895EF92FF92DF -:1033E0000F931F93CF93DF93CDB7DEB7A097CDBFD9 -:1033F000DEBF7C010091642E10E00115110591F4EF -:1034000085EF9AE09F938F9382E08F931F92FF92B4 -:10341000EF920E9414550F900F900F900F900F9005 -:103420000F9010C0E0915E2EF0915F2ECE010196BC -:1034300019959801AE014F5F5F4F60E072E0C701E0 -:103440000E94770E85E6A096CDBFDEBFDF91CF91BB -:103450001F910F91FF90EF900895DF92EF92FF92EE -:103460000F931F93CF93DF93CDB7DEB7A097CDBF58 -:10347000DEBF7B010091642E10E06EEE7AE0C701A2 -:103480000E948654892B29F5D12CED2CF12CE016C5 -:10349000F10658F40E945A0EE1E0F0E0EC0FFD1F37 -:1034A000EE0DFF1D8083D394F0CFE091602EF0915C -:1034B000612ECE0101961995E091662EF091672E4E -:1034C0004091642EBE016F5F7F4F83E1199584E6C2 -:1034D0000BC0A70160E270E0CE0101960E94A20E2F -:1034E0000817190711F38AECA096CDBFDEBFDF9154 -:1034F000CF911F910F91FF90EF90DF900895FC0105 -:103500008091652E882311F081E301C080E38083E0 -:10351000118285E60895FB012181211127C02081B8 -:10352000213321F481E08093652E04C0203321F4FF -:103530001092652E84E608952F33C1F41F9220E384 -:103540002F931F9221E32F9328EE3AE03F932F937E -:1035500022E02F931F929F938F930E9414558DB753 -:103560009EB70A968DBF9EBF85E608958AEC0895A2 -:1035700084E091E194D48EE6089584E891E1AAD4A0 -:103580008EE60895E0ECF4E081818E7F81830E94D5 -:1035900023510E947F0D84E60895E0ECF4E08181E0 -:1035A0008E7F81830E9423510E94850D84E60895B9 -:1035B000EEE4FEE225892F9324892F9325EE3AE04D -:1035C0003F932F9322E02F931F929F938F930E94FC -:1035D00014558DB79EB708968DBF9EBF85E608959A -:1035E0002091642E1F922F9322EE3AE03F932F9367 -:1035F00022E02F931F929F938F930E9414558DB7B3 -:103600009EB708968DBF9EBF85E6089540E052E0C4 -:10361000BC0180E00DD985E60895FB0120812F33A0 -:1036200041F42181211105C060E072E0F0D885E607 -:10363000089580E00FD9882319F0C9DB84E6089546 -:103640008AEC089540E052E0BC0181E0F1D885E6C3 -:103650000895FB0120812F3341F42181211105C000 -:1036600060E072E0D4D885E6089581E0F3D888233D -:1036700019F0ADDB84E608958AEC089540E052E04D -:10368000BC0182E0D5D885E60895FB0120812F3367 -:1036900041F42181211105C060E072E0B8D885E6CF -:1036A000089582E0D7D8882319F091DB84E6089545 -:1036B0008AEC089540E052E0BC0183E0B9D885E689 -:1036C0000895FB0120812F3341F42181211105C090 -:1036D00060E072E09CD885E6089583E0BBD888233B -:1036E00019F075DB84E608958AEC089540E052E015 -:1036F000BC0180E19CDC85E60895FB0120812F332D -:1037000041F42181211105C060E072E06DDC85E6A5 -:10371000089580E1A6DC882319F059DB84E608953A -:103720008AEC089540E052E0BC0188E080DC85E648 -:103730000895FB0120812F3341F42181211105C01F -:1037400060E072E051DC85E6089588E08ADC882339 -:1037500019F03DDB84E608958AEC089560E072E09C -:103760008EDA85E60895FB0120812F3341F4218113 -:10377000211105C060E072E092DA85E60895CB0180 -:1037800065DA882319F023DB84E608958AEC08952E -:10379000CF93DF93EC017AD9813028E0920718F0BB -:1037A0009C01385002C020E030E03F932F939F935C -:1037B0008F9382EC9AE09F938F9382E08F931F9276 -:1037C000DF93CF930E9414558DB79EB70A968DBF95 -:1037D0009EBF85E6DF91CF91089585E794E17AD386 -:1037E0008EE6089562DA84E6089514D984E6089591 -:1037F00060E072E05ADB85E60895CB015DDB811164 -:1038000002C08AEC089584E608950E943D1084E683 -:1038100008950E946D1084E608950E94C80F84E602 -:1038200008958091680680FD02C089E7089588E7C1 -:103830000895DF92EF92FF920F931F93CF93DF9340 -:10384000EC010FEF11E084EFE82E8CE0F82E9CE203 -:10385000D92EB70181EC93E20E948654892BD1F0D6 -:1038600001151105B9F0DE01F7012491ED01219652 -:10387000C8010197222341F00130110529F02C9352 -:10388000DE0131968C01F1CFDC928C0188E1E80EEB -:10389000F11CDFCF2197188285E6DF91CF911F9130 -:1038A0000F91FF90EF90DF900895FC01809120022E -:1038B0008068809320028091230280FFFCCF81E00A -:1038C00080932302A0911002B0911102AE5BB10966 -:1038D000B7FF02C0A0E0B0E020E038EB4BE050E0E2 -:1038E0000E940954AA27BB279F938F938BEB9AE0E2 -:1038F0009F938F9382E08F931F92FF93EF930E9489 -:1039000014558DB79EB708968DBF9EBF85E6089566 -:103910004EB15FB12091080430910904242B352B5E -:103920003F932F9325EB3AE03F932F9322E02F9381 -:103930001F929F938F930E9414558DB79EB7089640 -:103940008DBF9EBF85E608950F931F93CF93DF939E -:103950001F921F92CDB7DEB78B01E091692EF091D7 -:103960006A2E8581893009F06FC0E091562EF09162 -:10397000572E199581E08093702C60E270E0C801A9 -:103980000E94CC540097F9F4F80101900020E9F767 -:103990003197E01BF10BE0FD59C0F695E795E1305A -:1039A000F10539F487E090E080934C2E90934D2EF2 -:1039B00037C053E0EE0FFF1F5A95E1F7E0934C2E0E -:1039C000F0934D2E2DC098012C5F3F4F8217930727 -:1039D000E9F5A80162E070E0CE0101960E94A20E16 -:1039E000898190E0982F88272A81820F911D8093EA -:1039F0004C2E90934D2E0B5F1F4FF801019000202D -:103A0000E9F73197E01BF10BE0FD20C0F695E79553 -:103A100033E0EE0FFF1F3A95E1F7E817F907B0F032 -:103A200060914C2E70914D2E695F7F4F83E07695AB -:103A300067958A95E1F7A8018CE49DE20E94A20EA9 -:103A40000E94942B8FEF03C089EC01C08AEC0F9089 -:103A50000F90DF91CF911F910F910895EF92FF92F8 -:103A60000F931F93CF93DF931F921F92CDB7DEB7B3 -:103A70008B01E091692EF0916A2E8581893009F0E1 -:103A800080C0E091562EF091572E199582E08093D8 -:103A9000702C60E270E0C8010E94CC547C01892B3C -:103AA00031F5F80101900020E9F73197E01BF10BA7 -:103AB000E0FD69C0F695E795E130F10539F487E05E -:103AC00090E080934C2E90934D2E47C053E0EE0F24 -:103AD000FF1F5A95E1F7CF0169E070E00E94F553AE -:103AE000E81BF90BE0934C2EF0934D2E36C0C80125 -:103AF0000496E816F90609F046C0A80162E070E0F5 -:103B0000CE0101960E94A20E898190E0982F88270D -:103B10002A81820F911D80934C2E90934D2E8730D9 -:103B2000910529F09C0127703327232B61F587012C -:103B30000F5F1F4FF80101900020E9F73197E01B5C -:103B4000F10BE0FD20C0F695E79533E0EE0FFF1F87 -:103B50003A95E1F7E817F907B0F060914C2E7091B3 -:103B60004D2E695F7F4F83E0769567958A95E1F7E3 -:103B7000A8018CE49DE20E94A20E0E94942B8FEF7C -:103B800003C089EC01C08AEC0F900F90DF91CF91B8 -:103B90001F910F91FF90EF900895E091692EF091A1 -:103BA0006A2E85818930A1F4E091562EF091572E2E -:103BB000199585E08093702C0E94DA450E94942B21 -:103BC00084EE95E48093252C9093262C8FEF089516 -:103BD00089EC0895E091692EF0916A2E85818930F3 -:103BE000A1F4E091562EF091572E199583E0809321 -:103BF000702C0E94DA450E94942B84EE95E4809309 -:103C0000252C9093262C8FEF089589EC0895E09150 -:103C1000692EF0916A2E85818930A1F4E091562EAB -:103C2000F091572E199586E08093702C0E94DA450A -:103C30000E94942B84EE95E48093252C9093262C5F -:103C40008FEF089589EC0895E091692EF0916A2E26 -:103C50004085518564E6649F9001659F300D112475 -:103C60003F932F932FEA3AE03F932F9322E02F9335 -:103C70001F929F938F930E9414558DB79EB70896FD -:103C80008DBF9EBF85E60895CF93DF931F921F924D -:103C9000CDB7DEB7FB0120812F33B1F42181211193 -:103CA00013C02DE73AE03F932F9322E02F931F920A -:103CB0009F938F930E9414550F900F900F900F9029 -:103CC0000F900F9085E627C089E592E089839A835B -:103CD000CE0101969F938F9389E79AE09F938F93EC -:103CE0007F936F930E944A550F900F900F900F9003 -:103CF0000F900F90892B71F089819A818935F2E0BC -:103D00009F0740F4E091692EF0916A2E8087918799 -:103D100084E601C08AEC0F900F90DF91CF91089557 -:103D200020911F202F9320911E202F9326E73AE009 -:103D30003F932F9322E02F931F929F938F930E9484 -:103D400014558DB79EB708968DBF9EBF85E6089522 -:103D5000CF93DF931F921F92CDB7DEB7FB01208177 -:103D60002F33B1F42181211113C02FE02F932FEFB6 -:103D70002F9325E23AE03F932F9322E02F931F9257 -:103D80009F938F930E941455CDBFDEBF85E627C059 -:103D900019821A82CE0101969F938F9381E29AE055 -:103DA0009F938F937F936F930E944A550F900F902C -:103DB0000F900F900F900F90892B81F089819A813D -:103DC0008115E0E19E0750F4809338039093390306 -:103DD00080931E2090931F2084E601C08AEC0F90F0 -:103DE0000F90DF91CF910895FB0120812F33D9F4FB -:103DF0002181211121C01F9220E32F931F9221E3E3 -:103E00002F932BE13AE03F932F9322E02F931F92C1 -:103E10009F938F930E9414558DB79EB70A968DBFBE -:103E20009EBF85E60895213311F4D1D303C020331A -:103E300019F4F3D384E608958AEC0895FC01809187 -:103E40000008813029F480918C0891E0833009F0DA -:103E500090E090FF02C081E301C080E38083118283 -:103E600085E60895E091692EF0916A2E858189306A -:103E7000A1F4E091562EF091572E199584E080938D -:103E8000702C0E94DA450E94942B84EE95E4809376 -:103E9000252C9093262C8FEF089589EC089521E02E -:103EA0002093242C2093232C2CE32093212C25E0F9 -:103EB00030E020931F2C3093202C1092192C10925C -:103EC0001A2C10921B2C10921C2C8093172C909360 -:103ED000182C089527E02093242C2CE231E0209325 -:103EE0001F2C3093202C1092192C10921A2C109207 -:103EF0001B2C10921C2C8093172C9093182C089537 -:103F0000CF939091242C953009F441C030F4933034 -:103F100019F130F5913068F43EC1973009F4AAC028 -:103F200008F44AC0983009F4ACC0993009F495C03F -:103F300032C1813031F410921D2C10921E2C83E07E -:103F400023C0843011F466E084C0883109F485C050 -:103F50008B3109F084C081C08093222C84E014C08E -:103F600090E04091222C2FEF30E0241B3109821782 -:103F7000930721F485E008C0891779F165E183E0B2 -:103F800090E20E947F5282E08093242C68C02091AE -:103F90001D2C30911E2CA9014F5F5F4F40931D2CAB -:103FA00050931E2CF901E554F14D808340385105A2 -:103FB00009F055C086E0E8CF2091222C9091232C67 -:103FC00029134FC0EBEBFEE22BE33FE290E02E170C -:103FD0003F0791F24191940FFACF4091192C5091E3 -:103FE0001A2C60911B2C70911C2CE091172CF091D5 -:103FF000182C20E830E08BEB9EE21995C82F88231F -:1040000011F18091232C8F5F8093232C8091192CA8 -:1040100090911A2CA0911B2CB0911C2C80589F4F72 -:10402000AF4FBF4F8093192C90931A2CA0931B2C49 -:10403000B0931C2C66E083E090E20E947F5282E005 -:104040008093242CA9C068E183E090E20E947F5213 -:1040500068E183E090E20E947F521092242CC1E03C -:104060009BC030E0892F90E001972817390781F72E -:1040700066E085CF853119F41092232C08C08B316E -:1040800061F3883109F45FCF863009F05AC080911E -:10409000232C8F5F8093232C4091192C50911A2C44 -:1040A00060911B2C70911C2CE091172CF091182C16 -:1040B00020E830E08BEB9EE21995C82F8823D1F1E0 -:1040C00061E083E090E20E947F526091232C83E0C4 -:1040D00090E20E947F526091232C609583E090E2F1 -:1040E0000E947F5260E870E08BEB9EE296D8EBEB8B -:1040F000FEE260E08FE2EB33F80719F08191680F80 -:10410000F9CF83E090E20E947F528091192C909128 -:104110001A2CA0911B2CB0911C2C80589F4FAF4F94 -:10412000BF4F8093192C90931A2CA0931B2CB09303 -:104130001C2C32C064E083E090E20E947F5289E050 -:1041400023CF853109F08BCF61E083E090E20E94BC -:104150007F526091232C83E090E20E947F52609115 -:10416000232C609583E090E20E947F5260E870E02B -:104170008BEB9EE252D8EBEBFEE28BE39FE260E03A -:104180008E179F0719F02191620FFACF83E090E21A -:104190000E947F5264CFC0E08C2FCF910895809110 -:1041A000242C813019F0873029F1089580911F2C3B -:1041B0009091202C9C012150310920931F2C309389 -:1041C000202C892B31F58091212C9FEF980F909313 -:1041D000212C882331F065E183E090E20E947F5238 -:1041E00002C01092242C85E090E080931F2C9093C5 -:1041F000202C089580911F2C9091202C9C012150FF -:10420000310920931F2C3093202C892B11F410920C -:10421000242C0895EBECFBE020E030E0949198131F -:1042200009C041E2429FC001439F900D1124845375 -:10423000944F08952F5F3F4FB1962930310571F7A4 -:1042400080E090E00895CF92DF92EF92FF920F937B -:104250001F93CF93982F9F7D91549A3160F090EDEA -:10426000980F9A3040F08F3531F0982F9D7F9D3315 -:1042700011F08032D1F49FE9980F9A3108F48052FE -:1042800020912A2C30912B2C2F3F91E0390708F0F8 -:10429000D3C0A9014F5F5F4F40932A2C50932B2C22 -:1042A000F901E554F14D8083C7C08D3009F095C008 -:1042B000E0912A2CF0912B2CE554F14D10821092B4 -:1042C0002A2C10922B2C8091292C8111B5C0809121 -:1042D000BB2E982F9F7D09F495C08D7F8D3309F4F7 -:1042E00091C0EBEBFEE27F01C191CC2331F0CF33E3 -:1042F00021F0CD3311F0C032B1F7F701108284EF15 -:10430000C82E8CE0D82E00E010E0B6018BEB9EE2C8 -:104310000E948654892B09F056C01092BB2ECF33D1 -:1043200049F488E1809FF001819FF00D1124E65F40 -:10433000F24F18C0B7016F5F7F4FCD3349F488E16A -:10434000809FF001819FF00D1124E85FF24F20C0A3 -:10435000C11113C088E1809FF001819FF00D1124ED -:10436000EC5FF24F259134912115310509F44DC0D0 -:104370008BEB9EE2F901199514C0C03209F045C0DB -:1043800088E1809FF001819FF00D1124EA5FF24FD8 -:104390002591349121153105C1F18BEB9EE2F90194 -:1043A00019958F3F99F581E08093292C2EB13FB16B -:1043B0008091080490910904822B932B8093272CE1 -:1043C0009093282C39C00F5F1F4FF8E1CF0ED11CFE -:1043D0000732110509F099CF15C0883061F480913A -:1043E0002A2C90912B2C009739F1019780932A2C3D -:1043F00090932B2C21C08B31F9F410922A2C10921F -:104400002B2C1AC088ECC0E002C089ECC1E002DFAE -:104410000E94FC1888EC9BE00E94FC18CC2361F001 -:104420008091BB2E882341F08BEB9EE20E94F7180F -:1044300085EC9BE00E94FC1881E0CF911F910F91C9 -:10444000FF90EF90DF90CF9008958091292C8823E2 -:1044500099F1E091692EF0916A2E20853185211520 -:10446000310551F14EB15FB180910804909109047A -:10447000842B952B4091272C5091282C841B950B35 -:1044800064E670E00E94F55362177307A8F010927B -:10449000292C8BECBFDE0E94FC1882EC9BE00E9472 -:1044A000FC18E091252CF091262C309729F01995D5 -:1044B0001092252C1092262C08958091292C882367 -:1044C000A9F01092292C8BECA5DE0E94FC1882EC3E -:1044D0009BE00E94FC18E091252CF091262C30974F -:1044E00029F019951092252C1092262C0895CF931F -:1044F000DF939091292C9923A9F0EB011092292C9C -:1045000089DE0E94FC188FEB9BE00E94FC1820972C -:1045100049F0CE010E94F7188CEB9BE0DF91CF9120 -:104520000C94FC18DF91CF910895EF92FF920F93B6 -:104530001F93CF937C019B01613081E0780710F0DD -:1045400020E031E08B01021B130BA70160E072E059 -:104550008BEB9EE20E94770E8BEB9EE20E94F71897 -:10456000C1E0013081E01807A8F01A954C2F50E007 -:10457000542F44274E0D5F1D20E032E060E072E0D2 -:104580008BEB9EE20E94770E8BEB9EE20E94F71867 -:10459000CF5FE7CF0115110589F04C2F50E0542F64 -:1045A00044274E0D5F1D980160E072E08BEB9EE2A8 -:1045B0000E94770E8BEB9EE20E94F71889EB9BE03E -:1045C000CF911F910F91FF90EF900C94FC18809168 -:1045D0000008813021F490918C08933009F080E03C -:1045E00080FD1AC080912E2C811116C081E080932D -:1045F000000893E090938C0880932C2C10922D2C23 -:104600002EB13FB18091080490910904822B932B25 -:104610008093332C9093342C089510928C08109230 -:104620000008ECE2FCE210821182089590912C2C9B -:104630009923F1F080912D2C811115C020912C2C03 -:104640002223B9F04EB15FB12091080430910904E2 -:10465000242B352B4091332C5091342C241B350BBB -:104660002634310530F081E080932D2C892F089578 -:1046700081E00895CF93C0912E2CCC23C1F02EB1B0 -:104680003FB18091080490910904822B932B2091D3 -:10469000312C3091322C821B930B20912F2C309196 -:1046A000302C8217930718F010922E2C90DF8C2F4D -:1046B000CF91089580931E2090931F2080933803FC -:1046C00090933903089580911E2090911F20409669 -:1046D00080931E2090931F2080933803909339037A -:1046E000089580E991E080931E2090931F2080938D -:1046F0003803909339030895A0E2B6E081E015965F -:104700008C9315972BEB30E328B939B92BE331E3C0 -:104710002AB93BB910B813B812B816B817B811B8FF -:10472000E0E0F9E010A211A22FEF30E026A337A3BA -:104730002FEF3FEF20A731A7808388E8838380E1B4 -:10474000848783E087831C968C931C9782E01A965B -:104750008C9308951F920F920FB60F92112408B6F2 -:104760000F9218BE0BB60F921BBE8F939F93EF93C1 -:10477000FF93E0E0F9E013828FE790E086AB97AB20 -:1047800081E190E080AF91AFE0E0FAE010A211A2E9 -:104790008FEF9FEF86A397A389E88383168281E03A -:1047A00084878EE0808310922A06FF91EF919F917B -:1047B0008F910F900BBE0F9008BE0F900FBE0F9001 -:1047C0001F9018951F920F920FB60F92112408B6E2 -:1047D0000F9218BE0BB60F921BBE2F933F938F9371 -:1047E0009F93EF93FF932091280693B1267081E069 -:1047F00009F080E0990F892B83B982B1882309F4ED -:1048000063C012B883B18770873059F510920009E0 -:1048100080E180930C091092030A1B9B03C08CEA71 -:1048200094E002C08CE694E08093260A9093270AD5 -:1048300082E081B981E080930C0A83E08093060ACC -:1048400086B197B1877049F090B18F5F893011F0D0 -:104850009695FBCFE8B1F9B1908381E08093352C38 -:1048600036C083B1982F9C7091F1847091B19111F1 -:104870001CC020B12695882311F080E001C080E89B -:10488000282B20B986B197B1019686B997B9877060 -:104890009927892BE1F4E8B1F9B1CF01019688B9E4 -:1048A00099B9208381E081B912C091B1913079F436 -:1048B000EAB1FBB19F012F5F3F4F2AB93BB981118C -:1048C00090E0908311B803C082B1809582B988E8E6 -:1048D00080930309FF91EF919F918F913F912F91C9 -:1048E0000F900BBE0F9008BE0F900FBE0F901F9041 -:1048F00018951F920F920FB60F92112408B60F92BF -:1049000018BE0BB60F921BBE2F933F938F939F93AE -:10491000EF93FF9381B1823008F49DC081B18D3057 -:1049200008F099C0E1B1F0E0EE0FFF1FEA5DFF4D26 -:104930000190F081E02D19948FE790E08093260A92 -:104940009093270A88C08E9A8EE0809340088FE368 -:1049500090E08093260A9093270A85E06FC08E9896 -:1049600086E081B98FEF82B914B815B8E8B1F9B112 -:10497000808180B970C0009B05C08E9A82B18095FD -:1049800082B901C08E9887E059C0009B02C08E9802 -:1049900001C08E9A80B1869580B984B195B1019697 -:1049A00084B995B984B195B187709927892B11F491 -:1049B00088E044C024B135B186B197B128173907D2 -:1049C000B1F52BC0EAB1FBB1309711F0808101C085 -:1049D00082B1882311F08E9A01C08E9889E02EC092 -:1049E000EAB1FBB1309751F08081882311F08E98A5 -:1049F00001C08E9A3196EAB9FBB908C082B188230A -:104A000011F08E9801C08E9A8FEF82B924B135B122 -:104A100086B197B12817390711F48AE00FC0E8B1C1 -:104A2000F9B1CF01019688B999B9818180B986E041 -:104A300005C08E988BE002C08E988CE081B90BC0C7 -:104A40001092000A1092060A109240081092410833 -:104A500081E08093362CFF91EF919F918F913F9150 -:104A60002F910F900BBE0F9008BE0F900FBE0F90AE -:104A70001F901895CF93DF93E5E3FCE2108211823B -:104A8000E0E4F6E0128A84E08283C0E8D1E082E6C6 -:104A90008E83A0E2B6E081E016968C93169711966D -:104AA0008C93119796E012969C93129751968C9343 -:104AB000519742E052964C9352971A961C921A972D -:104AC00033E019963C9399E598839AE5998390E4AD -:104AD00091839683A0EBB0E012962C911297207FE1 -:104AE00012962C93129712962C911297226012967E -:104AF0002C9320E321832683908B86834583318307 -:104B0000E0E0F8E083E1818321E030E026A337A3F1 -:104B100020A731A7E0E8F8E014868083E0E2F3E024 -:104B20001382118288E0828391E1908320911E207C -:104B300030911F20208F318FE0E8F3E09CE39283D7 -:104B4000808393838183DF91CF91D6CDA0E2B6E0BD -:104B50001A961C921A97E5E3FCE210821182E0E0BB -:104B6000F9E010821382178280E18487E0E0FAE0A6 -:104B700010821382168281E08487E0E4F8E01082DC -:104B8000118216968C938E980895CF93DF9380911F -:104B9000352C882309F47EC01092352CC6B1D7B1CC -:104BA000C730D10508F471C0AE01495F5F4F93E093 -:104BB000569547959A95E1F7E091662EF091672E0C -:104BC0006BEB70E380E41995E091692EF0916A2E09 -:104BD0008781883019F483E18093132C8681883093 -:104BE00019F483E18093122CE0915C2EF0915D2EFC -:104BF000BE018BEB90E31995EC0194FF06C0DF7EBC -:104C00008BE391E38AB99BB902C01AB81BB820970D -:104C1000E1F1AE01495F5F4F83E0569547958A9574 -:104C2000E1F7E091662EF091672E6BEB70E381E483 -:104C30001995E091692EF0916A2E8781893019F4D7 -:104C400083E18093132C8681893019F483E180936A -:104C5000122CC6B9D7B98BEB90E388B999B91092E9 -:104C60006008109261088FE090E08093660890934E -:104C7000670888E090E080936A0890936B0883E26D -:104C80008093410883E081B905C01092000A109218 -:104C9000060A32DD8091362C882329F01092362CBA -:104CA000DF91CF9129CDDF91CF910895CF93DF93FD -:104CB000E0E4F6E0128A84E08283C0E8D1E082E694 -:104CC0008E83A0E2B6E081E016968C93169711963B -:104CD0008C93119796E012969C93129751968C9311 -:104CE000519742E052964C9352971A961C921A97FB -:104CF00033E019963C93199799E598839AE599833F -:104D000090E491839683C0EBD0E02A81207F2A83B0 -:104D10002A8122602A8320E321832683908B868345 -:104D200045833183E0E0F8E093E1918321E030E0D6 -:104D300026A337A320A731A7E0E8F8E014869083E4 -:104D4000E0E2F3E01382118298E0928321E1208374 -:104D500020911E2030911F20208F318FE0E8F3E05A -:104D60002CE3228390832383918315968C93E0E038 -:104D7000F9E02FEF30E026A337A312A613A614A65E -:104D800015A610821682178280831092000A109254 -:104D9000372CEAE3FCE2108212821182DF91CF917C -:104DA000089581E08093260638DCE0E0F9E0108287 -:104DB0001782E0E0FAE010821782EAE3FCE2118257 -:104DC0001282108208951F920F920FB60F92112433 -:104DD00008B60F9218BE0BB60F921BBE2F933F93CF -:104DE0008F939F93EF93FF93E0E0F9E080E4848753 -:104DF0001782E0E8F3E082E0878389EB81838BEB25 -:104E000090E38AB99BB981E090E084B995B916B86E -:104E10002EB13FB18091080490910904822B932B0D -:104E20008093382C9093392C81E080933C2C18B8D7 -:104E300017B81092372C88E080938706FF91EF9186 -:104E40009F918F913F912F910F900BBE0F9008BEB5 -:104E50000F900FBE0F901F901895E0E0F9E08FEFD4 -:104E600094E086A397A380E6848780E387838FEF0F -:104E700090E086AB97AB88E08093870608951F92F9 -:104E80000F920FB60F92112408B60F9218BE0BB6F0 -:104E90000F921BBE2F933F934F935F938F939F93DC -:104EA000EF93FF931092070A1092000A109247099D -:104EB00010924009809181038E7F8093810384B199 -:104EC00095B180FF1AC0379B03C086B1869503C099 -:104ED00086B18695806886B984B195B1019684B90A -:104EE00095B987709927892B41F4EAB1FBB1CF01BD -:104EF00001968AB99BB986B1808384B195B18770D8 -:104F00009927892BC9F0E4B1F5B186B144B155B107 -:104F100093E0F695E7959A95E1F7E554FF4C90E01C -:104F20004770552728E030E0241B350B02C09595CB -:104F300087952A95E2F7808381E080933B2C10923D -:104F40003C2C8FEF9FEF8093260A9093270A1092B4 -:104F5000200A1092210A1092060A1092070A109253 -:104F6000030A84E08093000A83E08093372CFF914A -:104F7000EF919F918F915F914F913F912F910F9062 -:104F80000BBE0F9008BE0F900FBE0F901F9018958C -:104F90001F920F920FB60F92112408B60F9218BEEF -:104FA0000BB60F921BBE8F93EF93FF93E0E8F3E0F5 -:104FB00081818F7C8183E0E0FAE088E8838381E06F -:104FC0008083FF91EF918F910F900BBE0F9008BEE1 -:104FD0000F900FBE0F901F9018951F920F920FB653 -:104FE0000F92112408B60F9218BE0BB60F921BBE7B -:104FF0008F939F93EF93FF938091600910926009C4 -:105000001092610993E090934009813520F4813337 -:1050100008F472C01BC08137E8F484B195B180FFF9 -:105020002EC086B18695806886B984B195B1019607 -:1050300084B995B987709927892B41F4EAB1FBB1FE -:10504000CF0101968AB99BB986B1808386B18695D6 -:1050500080682CC086B18695806886B984B195B188 -:10506000019684B995B987709927892B41F4EAB1E3 -:10507000FBB1CF0101968AB99BB986B1808386B115 -:105080008695806886B984B195B1019684B995B941 -:1050900087709927892B41F4EAB1FBB1CF010196C2 -:1050A0008AB99BB986B1808386B1869586B984B169 -:1050B00095B1019684B995B987709927892B41F4E8 -:1050C000EAB1FBB1CF0101968AB99BB986B1808361 -:1050D00086B1869586B984B195B1019684B995B9A2 -:1050E00087709927892B41F4EAB1FBB1CF01019672 -:1050F0008AB99BB986B18083FF91EF919F918F917F -:105100000F900BBE0F9008BE0F900FBE0F901F9018 -:1051100018950F931F93CF93DF93CDB7DEB7DA9532 -:10512000CDBFDEBF80913C2C882309F483C04EB1F3 -:105130005FB180910804909109042091382C30913E -:10514000392C842B952B821B930B2091202030919E -:1051500021202F5F3F4F2817390708F06BC01092AE -:10516000070A1092000A1092470910924009809194 -:1051700081038E7F8093810384B195B180FF1AC033 -:10518000379B03C086B1869503C086B1869580683B -:1051900086B984B195B1019684B995B9877099277C -:1051A000892B41F4EAB1FBB1CF0101968AB99BB9D1 -:1051B00086B1808384B195B187709927892BC9F016 -:1051C000E4B1F5B186B144B155B113E0F695E79578 -:1051D0001A95E1F7E554FF4C90E04770552728E019 -:1051E00030E0241B350B02C0959587952A95E2F790 -:1051F000808381E080933B2C10923C2C2FEF3FEF7B -:105200002093260A3093270A1092200A1092210A2E -:105210001092060A1092070A1092030A94E09093E3 -:10522000000A93E09093372C14B815B880933B2C68 -:1052300010923C2C1FDA81116FC2F8D9882309F42F -:105240006BC280913C2C811167C280913A2C8111F4 -:1052500005C080913B2C882309F45EC28091372CD5 -:10526000833041F48091200A9091210A8532914047 -:1052700008F452C280913B2C882309F4A2C084B167 -:1052800095B1892B09F49DC084B195B1089718F4A4 -:1052900014B815B896C044B155B1495F5F4FB3E03B -:1052A00056954795BA95E1F76BEB70E3CE01019601 -:1052B0000E94AB548BEB90E38AB99BB944B155B1D2 -:1052C00014B815B8898186958695898322E030E0E7 -:1052D00024173507B0F5F901A3E0F695E795AA95EF -:1052E000E1F781E090E08C0F9D1FE80FF91F8081AE -:1052F000982F9695969590838370813049F030F081 -:105300008230D1F486B18695806804C081E015C0F2 -:1053100086B1869586B984B195B1019684B995B95F -:1053200087709927892B41F4EAB1FBB1CF0101962F -:105330008AB99BB986B1808380E02E5F3F4F882376 -:1053400039F284B195B187709927892BC9F0E4B1FE -:10535000F5B186B144B155B173E0F695E7957A950C -:10536000E1F7E554FF4C90E04770552728E030E026 -:10537000241B350B02C0959587952A95E2F780830B -:10538000E091692EF0916A2E8781883019F483E1CB -:105390008093132C8681883019F483E18093122C3A -:1053A00044B155B1495F5F4F63E0569547956A95A3 -:1053B000E1F7E091662EF091672E6BEB70E382E4EB -:1053C000199510923A2C10923B2C64B175B1E09172 -:1053D0005C2EF0915D2E8BEB90E3199584B995B915 -:1053E00084B195B1892B09F497C189E88093810331 -:1053F0001092000A1092200A1092210A2FEF3FEF1C -:105400002093260A3093270A8FE590E08093280A9C -:105410009093290A1092060A80E180930C0A93E087 -:105420009093070A1092600910926109209366090F -:105430003093670920EA30E02093680930936909C6 -:105440001092460980934C0981E08093470981E1DD -:105450008093800110928801109280031092290697 -:10546000E091692EF0916A2E8781893019F483E1E9 -:105470008093132C8681893019F483E18093122C58 -:1054800044B155B1495F5F4F33E0569547953A9522 -:10549000E1F7E091662EF091672E6BEB70E383E409 -:1054A000199504B115B1013094E0190708F024C131 -:1054B00014B815B8A801495F5F4F23E0569547958A -:1054C0002A95E1F76BEB70E38BE391E30E94AB5419 -:1054D0008BEB90E38AB99BB986B18695806886B9D3 -:1054E00084B195B1019684B995B987709927892BB4 -:1054F00039F48CEB90E38AB99BB986B18093BB30C9 -:1055000086B1869586B984B195B1019684B995B96D -:1055100087709927892B41F4EAB1FBB1CF0101963D -:105520008AB99BB986B1808380E041E050E0EBE32B -:10553000F1E30417150708F495C0908190FF2BC084 -:1055400086B1869586B984B195B1019684B995B92D -:1055500087709927892B41F4AAB1BBB1CD0101967F -:105560008AB99BB986B18C9386B18695806886B9D5 -:1055700084B195B1019684B995B987709927892B23 -:1055800009F063C0AAB1BBB1CD0101968AB99BB93C -:1055900086B18C935AC0882351F186B1869586B91D -:1055A00084B195B1019684B995B987709927892BF3 -:1055B00041F4AAB1BBB1CD0101968AB99BB986B1BC -:1055C0008C9386B1869586B984B195B1019684B9DC -:1055D00095B987709927892B41F4AAB1BBB1CD0148 -:1055E00001968AB99BB986B18C9380E02FC096B1A1 -:1055F0009695906896B924B135B12F5F3F4F24B985 -:1056000035B927703327232B49F4AAB1BBB19D01CB -:105610002F5F3F4F2AB93BB996B19C9396B19695AF -:1056200096B924B135B12F5F3F4F24B935B92770F2 -:105630003327232BD1F6AAB1BBB19D012F5F3F4F7A -:105640002AB93BB996B19C9301C081E090819695AF -:1056500090839A0127703327232B09F431964F5FEB -:105660005F4F67CF811129C086B18695806886B962 -:1056700084B195B1019684B995B987709927892B22 -:1056800041F4EAB1FBB1CF0101968AB99BB986B169 -:10569000808386B1869586B984B195B1019684B927 -:1056A00095B987709927892B41F4EAB1FBB1CF01F5 -:1056B00001968AB99BB986B1808384B195B1877010 -:1056C0009927892BC9F0E4B1F5B186B144B155B140 -:1056D00093E0F695E7959A95E1F7E554FF4C90E055 -:1056E0004770552728E030E0241B350B02C0959504 -:1056F00087952A95E2F7808381E08093372C8BEBA6 -:1057000090E38AB99BB980E280930C098CE0809386 -:10571000070985E58A95F1F7D395CDBFDEBFDF9107 -:10572000CF911F910F91089514B815B881E080931F -:105730003A2C0C94E7221092070A1092000A109259 -:10574000470910924009809181038E7F80938103E5 -:1057500084B195B180FF1AC0379B03C086B186958E -:1057600003C086B18695806886B984B195B10196EB -:1057700084B995B987709927892B41F4EAB1FBB1B7 -:10578000CF0101968AB99BB986B1808384B195B166 -:1057900087709927892BC9F0E4B1F5B186B144B17E -:1057A00055B193E0F695E7959A95E1F7E554FF4CEE -:1057B00090E04770552728E030E0241B350B02C0ED -:1057C000959587952A95E2F7808381E080933B2C1D -:1057D00010923C2C8FEF9FEF8093260A9093270A1C -:1057E0001092200A1092210A1092060A1092070ABB -:1057F0001092030A84E08093000A83E08093372CA0 -:105800001092372C10923B2C10923A2C0C940D23B2 -:10581000982F8091452C882359F080913F2C81113D -:1058200008C081E020913E2C921718F080E0089586 -:1058300081E00895FF920F931F93CF93DF931F9200 -:10584000CDB7DEB70091422C000F000F0051FF24AE -:10585000F394F092452C10E0B8016D5F7F4F41E06A -:1058600050E08EE39CE20E940C0FB8016C5F7F4F0A -:1058700041E050E0CE0101960E940C0F8981881F03 -:105880008827881F80933D2CF092442C1092432C43 -:1058900010923F2C1092412C0F90DF91CF911F91CD -:1058A0000F91FF9008951092452C80E18093422C37 -:1058B0008FEF80933E2C10923D2C81E08093442CFE -:1058C0001092432C10923F2C1092412C089584E1A9 -:1058D0008093422CAFCF89E28093422CABCF81E002 -:1058E0008093442C089508958F929F92AF92BF9217 -:1058F000CF92DF92EF92FF920F931F93CF93DF939C -:1059000000D01F92CDB7DEB78C01FC018081909151 -:10591000442C9230E1F028F0933011F1943051F1A1 -:105920004EC0292F209521702093432C992311F0EC -:10593000863219F0823509F042C084E4F801808390 -:10594000118282E08093442C80E190E0DBC2909150 -:10595000432C911102C08632B1F0823599F513C003 -:105960009091432C911102C0863269F0823509F082 -:105970005BC009C09091432C911102C0863219F08E -:10598000823509F0F3C084E4F8018083118281E05C -:10599000892713C08091412C8111FCC0F8018081BE -:1059A000803509F476C108F006C1803309F409C1D5 -:1059B0009091452C911174C181E08093442C80E03A -:1059C00090E0A0C28339C1F719821A821B821C821F -:1059D00088E8898343E050E060E070E0CE01029601 -:1059E0000E940C0FF8018181803209F4ABC080372E -:1059F00009F047C0F801928189819813B2C0938160 -:105A00008A819813AEC094818B819813AAC0958126 -:105A10008C819813A6C084E0808361E070E0C801A7 -:105A20000E943D3783E029C0853931F644E050E0DB -:105A300064E070E0CE0101960E940C0FF8018181B4 -:105A4000803209F47FC08037E1F4F80192818981C6 -:105A5000981387C093818A81981383C094818B8126 -:105A600098137FC095818C8198137BC0108261E070 -:105A700070E0C8010E943D3784E08093442C38E1F7 -:105A800071C0E82EE294AFE0EA22EA94EA948F70C3 -:105A9000F82E88E090E08F1991092FEF30E069012E -:105AA00002C0D594C7948A95E2F7F5E0EF1629F085 -:105AB00024E0E2122AC0FF20E1F044E050E0B80107 -:105AC0006E5F7F4FCE0101960E949E54892B61F438 -:105AD00099818A8189279B8189279C818927F8015F -:105AE000968189278C2171F1F4E0EF120EC0F1103C -:105AF00038C044E050E0B8016E5F7F4FCE010196A0 -:105B00000E949E54892BF1F02CC023E02E1548F101 -:105B1000F12CA701B8016E5F7F4FCE0101960E9464 -:105B20009E54892BF1F4D801AE0DBF1DE1E0F0E0E9 -:105B3000EC0FFD1FEE0DFF1D12969C9180818927B1 -:105B4000C82279F43981F80130832A8121839B812D -:105B500092838C818383232792278927848338E249 -:105B600001C030E020E0832F922FCCC1695F7F4FCE -:105B700083E0769567958A95E1F76330710508F4BF -:105B80001BCF62507109C8010E946837811102CF92 -:105B900081E092C11092412C8091652E81118BC1C0 -:105BA0006091402CF4E06F9FB001112444E050E07C -:105BB000C80102967EC1803A09F455C0823AC1F10B -:105BC000F7CEF801F1808091452C882359F080911F -:105BD0003D2C882339F080913F2C811103C0E09047 -:105BE0003E2C02C0E090422CFE1410F0F80131C1AE -:105BF000C12CD12CF4E0FF9EB001112444E050E010 -:105C0000C8018C0D9D1D0E940C0FF394EF1001C074 -:105C1000F12C24E0C20ED11C80E1C816D10451F74A -:105C200060E170E0C8010E943D3780E990E06AC100 -:105C3000F801F180F1E0FF15C8F68091422CF816CA -:105C4000A8F68F2DE5DD882309F4C2C0C8010296AD -:105C50002091652E21112FC1F4E0FF9EB001112487 -:105C600044E050E026C1F801F180F1E0FF1508F0B2 -:105C7000BDCF8091422CF81608F0B8CF8F2DC8DD2B -:105C8000882309F4A5C0F092402C81E08093412C38 -:105C900012C1F80181818111A9CF1092442C8FCEBD -:105CA0008C3309F40EC148F4893309F4A6C08A3351 -:105CB00091F18B3109F080CE6AC08B3409F40FC1A9 -:105CC00038F48E3309F078CE8DEBF801808314C15F -:105CD000803621F0853A09F4ABC06ECEF80110820F -:105CE00084E0818383E0828381E0838384831582DF -:105CF0008091422C843111F08EE001C08BE0F801DC -:105D0000868383E0878368E070E0C8010E943D37A6 -:105D100080E590E0F7C0F801D180E280ED1408F44E -:105D200065CF8091422CD81608F060CFE81608F0B5 -:105D30005DCF80913D2C882351F08D2D69DD882326 -:105D400009F446C08E2D64DD882309F441C0F12C8E -:105D50006D2D70E0E61AF70AFFEFEF1AFF0AEE0C5E -:105D6000FF1CEE0CFF1C660F771F660F771FA70145 -:105D7000C8010E940C0FB701C8010E943D37C7013E -:105D80000296F3E0880F991FFA95E1F7BBC0609186 -:105D9000422C660F660F6051E62EF12CB701685F4A -:105DA0007F4F44E050E0CE0101960E940C0F998194 -:105DB000F801818198130CC09A818281981308C0E0 -:105DC0009B818381981304C09C818481981711F072 -:105DD00086E072C081E080933F2CB701645F7F4F03 -:105DE00042E050E0C8010E940C0F62E070E0C80180 -:105DF0000E943D3780E290E085C0F8016181633008 -:105E000008F0F4CE8091422C70E0680F711D660F8F -:105E1000771F660F771F43E050E0C8010E940C0F08 -:105E200063E070E0C8010E943D3788E290E06AC0FC -:105E3000F8012181E22EF12C9E2D8827856A092EFA -:105E4000000CAA0BBB0B32814C015D01A32A23304D -:105E500010F0108233C08091422CB701680F711D81 -:105E6000660F771F660F771F44E050E0CE01019662 -:105E70000E940C0F89819A81AB81BC81880D991D8C -:105E8000AA1DBB1D89839A83AB83BC830097A105A0 -:105E9000B14010F084E010C08091422CB701680F2F -:105EA000711D660F771F660F771F44E050E0CE012B -:105EB00001960E945A0F8AE0F801808384E090E006 -:105EC00021C040E250E06AEC70E0C8010E94C55475 -:105ED00060E270E0C801D1D780E191E013C0609129 -:105EE000422C660F660F605170E06B5F7F4F41E0A0 -:105EF00050E0C8010E940C0F61E070E0C801BDD7FE -:105F000088E190E02496CDBFDEBFDF91CF911F9155 -:105F10000F91FF90EF90DF90CF90BF90AF909F9048 -:105F20008F900895CF93DF93EC0143E050E060E061 -:105F300070E00E940C0F44E050E064E070E0CE019D -:105F40000396DF91CF910C940C0F0F931F93CF9377 -:105F5000DF931F921F92CDB7DEB78C01FC019081B9 -:105F60008181892798E88927928189278A8393816B -:105F7000848189279581892796818927898343E0B0 -:105F800050E060E070E0C8010E945A0F41E050E02C -:105F900063E070E0CE0102960E945A0F44E050E0A8 -:105FA00064E070E0C80103960E945A0F41E050E09F -:105FB00068E070E0CE0101960E945A0F0F900F909A -:105FC000DF91CF911F910F91089581E08093692C0B -:105FD00084E090E08093482C9093492C88E0809353 -:105FE000472C1092462C089581E08093692C84E41C -:105FF00090E08093482C9093492C88E08093472C24 -:106000001092462C089581E08093692C82E090E004 -:106010008093482C9093492C88E18093472C1092D0 -:10602000462C089581E08093692C089508958F92FD -:106030009F92AF92BF92CF92DF92EF92FF920F9317 -:106040001F93CF93DF93CDB7DEB76297CDBFDEBF8F -:106050008C015B018091692C6730710501F5F801B5 -:106060009081882311F0963211F09235C1F421E02D -:10607000811120E02093462C882311F0963211F0F4 -:10608000923559F49091482C8091492CF8019083D5 -:1060900081838FEF80934A2C37C0A12CB12C85309F -:1060A00009F497C050F48230A1F1C8F0833009F4AC -:1060B00068C0843009F481C0ACC5883009F41CC1C3 -:1060C00038F4863009F491C0873009F4CAC0A1C5FC -:1060D000893009F441C38D3008F463C39AC5982F01 -:1060E000909591709093462CF8019081882311F03F -:1060F000963219F0923509F006C49091482C80919F -:10610000492CF8019083818384E08093692C80E19D -:1061100081C5F8018081982F9D7F913419F48AE020 -:1061200080835AC38033C1F462E070E0C801D0D6E6 -:10613000882309F494C0F8016181F0E16F9FB001F8 -:10614000112440E150E0C8010E940C0F60E170E0B2 -:10615000C80193D680E95EC5803A79F462E070E0C8 -:10616000C801B6D6882309F47AC0F80181818093EA -:10617000602C83E08093692CD2CF803509F049C52B -:106180004AC060E170E0C801A3D6882389F08091FD -:10619000652E81110BC06091602CF0E16F9FB00102 -:1061A000112440E150E0C8010E945A0F8AE001C06A -:1061B00081E0F801808382E00DC39091462CF801C4 -:1061C0008081911102C08632D1F0823509F0A3C3DB -:1061D00016C09091462CF8018081911102C0863240 -:1061E00071F0823509F045C40AC09091462CF8013F -:1061F0008081911102C0863211F0823551F42091D4 -:10620000482C8091492CF8012083818381E08927E3 -:1062100077C38035C9F4F8018181882319F0F8012A -:106220001082DAC262E070E0C80152D68823B9F069 -:10623000E091662EF091672E40E060E070E081E929 -:1062400019951092692CE5C490EA980F923008F0E5 -:10625000B4C462E070E0C8013BD68111DDC481E0C6 -:106260004FC2C8010E94F13C64E07801F4E0EF0EF7 -:10627000F11CC7010E940D40E091662EF091672E3F -:1062800044E0B70180EA1995F80194818091612C6E -:10629000981329C095818091622C981324C096810F -:1062A0008091632C98131FC097818091642C981360 -:1062B0001AC08091652C80838091662C81838091A7 -:1062C000672C82838091682C838364E0C8010E94DC -:1062D0002642E091662EF091672E44E0B80181EAF3 -:1062E000199588E004C2E091662EF091672E44E093 -:1062F00061E67CE280EC2DC2F8018081803551F4AA -:106300008181811107C08281873521F483818D3C91 -:1063100009F405C264E0C8010E940D40F8018081C3 -:10632000803309F0BDC062E070E0C801D1D5882398 -:1063300009F4A7C0F801618167FD04C0862F83704E -:10634000833029F0862F8F708F3009F07FC06093E3 -:10635000602C80914B2C90914C2C30914D2C282FFF -:1063600022952095492F4227407F09F03FC02327DF -:106370002F70E1F5929590959327907FB9F5262F90 -:1063800067FD02C0237003C02F7009F023E08095E1 -:10639000432F42954F702223B1F090E0022E02C0AD -:1063A000959587950A94E2F7E32FF0E0022E02C05C -:1063B000F595E7950A94E2F73E2F50E002C0559517 -:1063C00047952A95E2F740FBCC24C0F8D12CF60182 -:1063D000EE0FFF1FEE0FFF1F30FBEE24E0F8F12C55 -:1063E000EE0CFF1CEE298170E82B01C0E7E0F0E025 -:1063F00080915F2CEE0FFF1FE05CFF4DE80FF11D59 -:106400008081F8019801205F3F4F11922E173F07BE -:10641000E1F790914E2CF801918782FF09C090918D -:106420004B2C968390914C2C978390914D2C908778 -:1064300084FF15C06360F0E16F9FB0011124665FB7 -:106440007F4F46E050E0C8010A9607C080E1689F90 -:10645000B001112440E150E0C8010E940C0F60E13E -:1064600070E0C8010AD5E091662EF091672E42E1F6 -:10647000B80180E8199562E1C8010E94264280E9CE -:1064800039C10E94183F91E08927F8018083E0918B -:10649000662EF091672E44E0B80181EC19959CC1FD -:1064A000803A61F462E070E0C80112D58823D9F126 -:1064B000F80181818093602C89E00DC0803C89F4D3 -:1064C00062E070E0C80104D5882369F1F801818198 -:1064D0008093602C8BE08093692C0E94183F9AE097 -:1064E0000EC1813C91F462E070E0C801F1D48823D0 -:1064F000D1F0F80181818093602CFAE0FF2EF092B8 -:10650000692C0E94183F8F25FBC0823C99F462E001 -:1065100070E0C801DDD4882331F0F80181818093D7 -:10652000602C8CE0D8CFE091662EF091672E44E08D -:10653000B80121C0803B11F562E070E0C801C8D409 -:10654000E091662EF091672E44E0B801882399F01F -:1065500086E819958091652E8111BFCFF801618180 -:10656000F0E16F9FB001112440E150E08FE49CE224 -:106570000E945A0FB2CF81EC1995BEC090EA980FD5 -:10658000923008F0BFC062E070E0C801A1D4882357 -:1065900009F4B2C0F8018081803621F0EAE3CE2E02 -:1065A000D12C03C070E3C72ED12CF801818187FF65 -:1065B0000CC0807FF0E18F9F7001112480ECC80E29 -:1065C000D11C66EFA62EB12C08C08C7F90E1899F6C -:1065D0007001112456E3A52EB12CE091662EF091A6 -:1065E000672E42E0B80180E91995F8018081817039 -:1065F00080935F2CC70144E0969587954A95E1F713 -:106600008093602C90914A2C981769F0B5016E0D1B -:106610007F1D44E050E08BE49CE20E940C0F8091CF -:10662000602C80934A2C68E0CE0101960E945D0E9A -:106630008091642E44E050E0873019F463E070E00C -:1066400002C060E070E0CE010F960E940C0FB60110 -:106650006E0D7F1D46E050E0CE0109960E940C0FA2 -:1066600089818093612C8A818093622C8B818093B5 -:10667000632C8C818093642C60E481E69CE20E9410 -:1066800040448091612C8093652C8091622C809392 -:10669000662C8091632C8093672C8091642C80936E -:1066A000682C60E285E69CE20E94404420E0AE0156 -:1066B0004F5F5F4FBE01615F7F4FCE010996E6D607 -:1066C0008981F80180838A8181838B8182838C8197 -:1066D0008383E058FF4F8D81808331968E81808344 -:1066E00031968F81808331968885808387E080937F -:1066F000692C80E290E16CC30E94183F91E08927E9 -:10670000F8010ECD8035B9F4F8018181811187CD72 -:1067100062E070E0C801DCD3882309F4A0CD1092B8 -:10672000692CE091662EF091672E40E060E070E009 -:1067300081E919956EC2A501495F5F4F33E0569517 -:1067400047953A95E1F7E091662EF091672EB801F2 -:1067500082E9199581E0D4C062E1C8010E940D4030 -:1067600060E170E0C801B4D3E091662EF091672E2D -:10677000882329F142E1B80181E819958091652EBD -:1067800081110BC06091602CF0E16F9FB00111246A -:1067900040E150E0C8010E945A0F0E94183F9AE061 -:1067A00015C066E0C8010E940D4064E070E0C801B9 -:1067B0008FD3811113C0E091662EF091672E44E0D3 -:1067C000B80181EC19950E94183F91E08927F801E2 -:1067D000808388E08093692C84E01CC26091602CE7 -:1067E000F0E16F9FB001112440E150E08FE49CE2A2 -:1067F0000E940C0F90914F2C8091532C80959813F0 -:10680000E3C28091572C9813DFC29091502C809155 -:10681000542C80959813D8C28091582C9813D4C2C8 -:106820009091512C8091552C80959813CDC28091D8 -:10683000592C9813C9C29091522C8091562C809556 -:106840009813C2C280915A2C9813BEC290915B2CAF -:1068500080915C2C80959813B7C280915D2C981321 -:10686000B3C280915E2C80959813AEC2C0904F2C1D -:10687000D090502CE090512CF090522CF801808058 -:106880009180A280B3808091692C8B3009F081C205 -:10689000E091662EF091672E46E0B80185E81995E3 -:1068A000C818D908EA08FB08C0924F2C33272F2DAF -:1068B0001E2D0D2D0093502CA7016627772740939E -:1068C000512C8F2D9927AA27BB278093522CEC2D72 -:1068D000E095E093532CE02FE095E093542CE42FC7 -:1068E000E095E093552CE82FE095E093562CC0926C -:1068F000572C0093582C4093592C80935A2C88E0A5 -:106900008093692C86C1903409F083C182E0809322 -:10691000692C8AE0F5CE833909F093CC8091642EFE -:10692000873009F0A1C043E050E060E070E0CE01A4 -:1069300002960E940C0F88E88983F80191819032B9 -:1069400019F0903761F024C0F80180833A813183D7 -:106950002B8122839C819383232782272AC1F801DC -:106960008281883809F055C193818A81981351C179 -:1069700094818B8198134DC195818C81981349C165 -:1069800084E0808361E070E0C80177D285E09FC039 -:10699000E92EE294EFE0EE22EA94EA949F70F92E59 -:1069A00088E090E08F1991092FEF30E0690102C073 -:1069B000D594C7948A95E2F7F5E0EF1629F084E0C4 -:1069C000E8122AC0FF20E1F044E050E0B8016E5F19 -:1069D0007F4FCE0101960E949E54892B61F49A81CB -:1069E0008B81892798E889279C818927F8019681DE -:1069F00089278C2189F1F4E0EF120EC0F11009C152 -:106A000044E050E0B8016E5F7F4FCE0101960E94D6 -:106A10009E54892B09F1FDC083E08E1508F4F9C05E -:106A2000F12CA701B8016E5F7F4FCE0101960E9445 -:106A30009E54892B09F0EDC0D801AE0DBF1DE1E0D9 -:106A4000F0E0EC0FFD1FEE0DFF1D12969C91808172 -:106A50008927C82209F0DDC098E8F80190833A81BF -:106A600031832B812283A1C044E050E060E070E0DC -:106A700007C0853909F0E5CB44E050E063E070E001 -:106A8000CE0101960E940C0FF8018181803209F439 -:106A900085C0803701F5F801928189819813B9C0CA -:106AA00093818A819813B5C094818B819813B1C06A -:106AB00095818C819813ADC08091472C808361E0D3 -:106AC00070E0C801DAD18FEF80934A2C86E0809382 -:106AD000692C88E19FC0E82EE2947FE0E722EA94E7 -:106AE000EA948F70F82E88E090E08F1991092FEFCB -:106AF00030E0690102C0D594C7948A95E2F7F5E0C9 -:106B0000EF1629F084E0E8122AC0FF20E1F044E00B -:106B100050E0B8016E5F7F4FCE0101960E949E54F7 -:106B2000892B61F499818A8189279B8189279C819E -:106B30008927F801968189278C2181F1F4E0EF12F1 -:106B40000EC0F11066C044E050E0B8016E5F7F4FA8 -:106B5000CE0101960E949E54892B01F15AC083E018 -:106B60008E1508F456C0F12CA701B8016E5F7F4F57 -:106B7000CE0101960E949E54892B09F04AC0D8018B -:106B8000AE0DBF1DE1E0F0E0EC0FFD1FEE0DFF1DAF -:106B900012969C9180818927C822D9F53981F80104 -:106BA00030832A8121839B8192838C818383232755 -:106BB00092278927848388E22DC0823C09F0CBC0CC -:106BC000F8018181803E09F0CFC08281843B09F0C9 -:106BD000CBC046E050E06AEA74E0CE0101960E9424 -:106BE0000C0F89818B3409F03ACB8A81893709F0FF -:106BF00036CB8B818B3109F032CB8C818A3E09F008 -:106C00002ECB8D818B3709F02ACB8E818C3C09F0FD -:106C100026CB80E090E0DCC0F8018081803621F056 -:106C20006AE3C62ED12C03C050E3C52ED12CF80147 -:106C3000818187FF0CC0807FF0E18F9F700111245C -:106C400080ECC80ED11C46EFA42EB12C08C08C7F5E -:106C500090E1899F7001112436E3A32EB12CE091BD -:106C6000662EF091672E42E0B80180E91995F8018F -:106C70008081817080935F2CC70124E09695879571 -:106C80002A95E1F78093602CB5016E0D7F1D44E0DD -:106C900050E08BE49CE20E940C0F8091602C80936A -:106CA0004A2C68E0CE0101960E945D0E8091642E10 -:106CB00044E050E0873019F463E070E002C060E027 -:106CC00070E0CE010F960E940C0FB6016E0D7F1D75 -:106CD00046E050E0CE0109960E940C0F8981809316 -:106CE000612C8A818093622C8B818093632C8C81B0 -:106CF0008093642C60E481E69CE20E944044809191 -:106D0000612C8093652C8091622C8093662C8091FD -:106D1000632C8093672C8091642C8093682C60E2B4 -:106D200085E69CE20E94404487E08093692C89813B -:106D3000F80180838A8181838B8182838C81838324 -:106D4000AE014F5F5F4FBE01615F7F4FCE0109967D -:106D5000F0D080E25FCF982F9F77903329F0803A70 -:106D600019F0805C833078F481E08093692C84E0B2 -:106D7000F8018083E091662EF091672E40E060E09C -:106D800070E082EC8BCBE091662EF091672E40E0B4 -:106D9000DECC8A3069F4E091662EF091672E46E0F1 -:106DA000B80184E81995C80CD91CEA1CFB1C7CCDE1 -:106DB0008C3009F079CDE091662EF091672E46E097 -:106DC000B80187E8199570CD0E94183F96E0FECC77 -:106DD0006296CDBFDEBFDF91CF911F910F91FF90E3 -:106DE000EF90DF90CF90BF90AF909F908F900895DD -:106DF000CF93DF932091642E273071F4EC0143E0B0 -:106E000050E060E070E00E940C0F44E050E063E06E -:106E100070E0CE01039604C044E050E060E070E012 -:106E2000DF91CF910C940C0FCF93DF931F92CDB7CE -:106E3000DEB72091642E273029F447E050E060E06F -:106E400070E015C0FC013081218123273281232786 -:106E500033812327298344E050E060E070E00E9402 -:106E60005A0F41E050E064E070E0CE0101960E94CC -:106E70005A0F0F90DF91CF91089520E42093D00016 -:106E800026EC2093D5002093D40021E02093D0005D -:106E9000DC01680F791FA617B70741F0ED91F0E00C -:106EA000EE51FA4FE491E093D300F5CFE091D50095 -:106EB000F0E0EE51FA4FE491EC93E091D400F0E071 -:106EC000EE51FA4FE4911196EC931092D000089590 -:106ED00020E42093D00026EC2093D5002093D4000A -:106EE00021E02093D000DC01680F791FA617B707B7 -:106EF00041F0ED91F0E0EE51FA4FE491E093D300D0 -:106F0000F5CFE091D500F0E0EE51FA4FE4918C918D -:106F10008E130AC0E091D400F0E0EE51FA4FE491F4 -:106F200081E011969C919E1380E01092D0008170B8 -:106F300008958F929F92BF92CF92DF92EF92FF922D -:106F40000F931F93CF93DF93DC018C91D12C30E012 -:106F50008695D794869537958695D7948695379557 -:106F60008695D794869537958695D7948695379547 -:106F700011968C9111978695D7948695379586951D -:106F8000D794869537958695D79486953795869527 -:106F9000D7948695379512968C911297F0E010E071 -:106FA0008695F795869517958695F7958695179505 -:106FB0008695F795869517958695F79586951795F5 -:106FC00013968C9113978695F795869517958695C8 -:106FD000F795869517958695F795869517958695D5 -:106FE000F7958695179514968C91149790E020E06C -:106FF0008695979586952795869597958695279555 -:107000008695979586952795869597958695279544 -:107010001596EC91E6959795E6952795E6959795C3 -:10702000E6952795E6959795E6952795E6959795A4 -:10703000E69527954B01DA014C5F5F4F0C91E40117 -:10704000B9904E01B026C32FD0E0BE0160557F4DF0 -:107050007B01612F70E060557E4DE701F880EB0108 -:1070600088816F2D682BE22EF12CE701C055DD4D94 -:107070008881682B70E060577F4DEB018881869591 -:10708000E7956F2F60718D2D817E6827892F807223 -:107090006827832F84796827812F83776827822F39 -:1070A0008A736827F62EF2946F25762F769576955B -:1070B0006727FB2CF6266695F6267D2D6F2F892FE8 -:1070C000F694879567957795B694C72ED12CE601EF -:1070D000C055DF4D6E01E62EF12CE701C055DE4DA7 -:1070E0007E01E601F881E7019881EF2EE92AC82E9A -:1070F000D12CE601C055DD4D9881E92AF12CE7013C -:10710000C057DF4D98819695E795F12FF071932F39 -:10711000917EEF2EE926922F9072E926972F94798F -:10712000E926962F9377E926982F9A73E926FE2C65 -:10713000F294EF24CE2CC694C694EC24FB2CFE24AF -:10714000E694FE24F694279517953795B694C32EAA -:10715000D12CE601C055DF4D6E01E12EF12CE70187 -:10716000C055DE4D7E01E601F881E7019881EF2EE2 -:10717000E92AC22ED12CE601C055DD4D9881E92ABD -:10718000F12CE701C057DF4D98819695E795F62FD2 -:10719000F071972F917EEF2EE926982F9072E926B5 -:1071A000932F9479E926912F9377E926922F9A735A -:1071B000E926FE2CF294EF24CE2CC694C694EC243F -:1071C000FB2CFE24E694FE24F82FF694F7956795A1 -:1071D0007795B694872F90E0EC01C055DF4D862F50 -:1071E00090E080559E4DF880EC0188818F29EF2E2C -:1071F000F12CE701C055DD4D9881892B90E0805737 -:107200009F4DEC0188818695E795912F9071832F92 -:10721000817EE92EE826822F8072E826872F8479E6 -:10722000E826862F8377E8268F2F8A73E826FE2CA0 -:10723000F294EF24CE2CC694C694EC24FB2CFE24AE -:10724000E694FE24F694279517953795B694832FE8 -:1072500090E0EC01C055DF4D812F90E080559E4DB0 -:10726000F880EC0188818F29E22EF12CE701C055CE -:10727000DD4D9881892B90E080579F4DEC018881EE -:107280008695E795962F9071872F817EF92EF826A7 -:107290008F2F8072F826832F8479F826812F8377A9 -:1072A000F826822F8A73F8269F2D9295F926EF2CC7 -:1072B000E694E694FE249B2D9F25F6949F258F2F20 -:1072C0009695879567957795B694C72ED12CE6014C -:1072D000C055DF4D6E01E62EF12CE701C055DE4DA5 -:1072E0007E01E601F881E7019881EF2EE92AC82E98 -:1072F000D12CE601C055DD4D9881E92AF12CE7013A -:10730000C057DF4D98819695E795F12FF071932F37 -:10731000917EF927922F9072F927972F9479F92768 -:10732000962F9377F927982F9A73F9279F2F929585 -:10733000F927FF2EF694F694FF259B2D9F27F695AF -:107340009F279695279517953795B694C32ED12CE0 -:10735000E601C055DF4D6E01E12EF12CE701C0556D -:10736000DE4D7E01E601F881E7019881EF2EE92AE2 -:10737000C22ED12CE601C055DD4D9881E92AF12CB1 -:10738000E701C057DF4D98819695E795F62FF0718C -:10739000972F917E9F27F82FF0729F27F32FF47974 -:1073A0009F27F12FF3779F27F22FFA739F27F92F4B -:1073B000F2959F27F92FF695F6959F27FB2DF92734 -:1073C0009695F927982F8F2F86959795679577959E -:1073D000D72EF62F672F70E0EB01C055DF4D6F2FD2 -:1073E00070E060557E4DF880EB0188816F2D682B31 -:1073F000E92EF12CE701C055DD4D8881682B70E046 -:1074000060577F4DEB0188818695E795632F617EFC -:10741000812F80718627622F607286276D2D647997 -:1074200086276F2F63778627692F6A738627682FD1 -:1074300062958627682F669566958627B694B82646 -:107440008695B826812FB694279587953795182F5E -:107450000E270D934A175B0709F0F0CDD0926A2CE6 -:10746000F0936B2C90936C2C30936D2C80936E2C3E -:1074700020936F2CDF91CF911F910F91FF90EF9090 -:10748000DF90CF90BF909F908F9008958F929F92A2 -:10749000AF92BF92CF92DF92EF92FF920F931F9322 -:1074A000CF93DF93FC01C62FF42EB52F8081A0E08F -:1074B00050E0869557958695A7958695579586951C -:1074C000A795869557958695A79586955795869500 -:1074D000A7958181869557958695A7958695579509 -:1074E0008695A795869557958695A79586955795E0 -:1074F0008695A795828130E040E0869547958695F0 -:1075000037958695479586953795869547958695BF -:1075100037958695479586953795838186954795C6 -:10752000869537958695479586953795869547959F -:10753000869537958695479586953795648190E031 -:1075400080E066958795669597956695879566958B -:1075500097956695879566959795669587956695AF -:107560009795B5806B2D66958795669597956695E9 -:10757000879566959795669587956695979566958F -:10758000879566959795B62EEA2FF0E0E055FF4D6A -:10759000032F10E000551E4DD081F8016081D62BDD -:1075A000092F10E000551D4DF8016081ED2FE62BED -:1075B000F0E0E057FF4DC0800C2F172FCF2DDB2FB1 -:1075C0007E01F4E0EF0EF11C7881F801B1918F019A -:1075D000B7276B2DC6946795F42FF071E52FE17EE8 -:1075E000FE27E82FE072FE27EA2FE479FE27E32F3B -:1075F000E377FE27E92FEA73FE27EF2FE295FE27B8 -:10760000DF2ED694D694FD25EB2FEF27F695EF27A6 -:1076100020FDEC25E695879547955795B695C52E9F -:10762000D12CF601E055FF4D6F01A42EB12CF501D0 -:10763000E055FE4D5F01F601D080F501C080DC28E9 -:10764000E82FF0E0E055FD4DF081ED2DEF2BF0E05F -:10765000E057FF4DC080C6946795F32FF071EA2F75 -:10766000E17EFE27E92FE072FE27E52FE479FE2771 -:10767000E42FE377FE27E82FEA73FE27EF2FE2954A -:10768000FE27DF2ED694D694FD25EB2FEF27F69517 -:10769000EF27DA2E20FDEC25E69597953795D794C0 -:1076A000CB2EC694AD2DB0E0A055BF4DE32FF0E03A -:1076B000E055FE4DAC91E081EA2BA92FB0E0A0553A -:1076C000BD4DFC91EF2BF0E0E057FF4DB081B6953A -:1076D0006795F42FF071E52FE17EFE27E82FE07229 -:1076E000FE27ED2DE479FE27E32FE377FE27E92F30 -:1076F000EA73FE27EF2FE295FE27AF2FA695A695FA -:10770000FA27EC2DEF27F695EF2720FDEB27E695DE -:10771000879547955795C694A52FB0E0A055BF4DC6 -:10772000E42FF0E0E055FE4DAC91E081EA2BA82F6C -:10773000B0E0A055BD4DFC91EF2BF0E0E057FF4DC0 -:10774000B081B6956795F32FF071ED2DE17EFE27A0 -:10775000E92FE072FE27E52FE479FE27E42FE37797 -:10776000FE27E82FEA73FE27EF2FE295FE27AF2FC3 -:10777000A695A695FA27EC2DEF27F695EF2720FD85 -:10778000EB27E69597953795D794C694AD2DB0E045 -:10779000A055BF4DE32FF0E0E055FE4DAC91E081E8 -:1077A000EA2BA92FB0E0A055BD4DFC91EF2BF0E0E6 -:1077B000E057FF4DB081B6956795F42FF071E52F36 -:1077C000E17EFE27E82FE072FE27ED2DE479FE270B -:1077D000E32FE377FE27E92FEA73FE27EF2FE295E9 -:1077E000FE27AF2FA695A695FA27EC2DEF27F69545 -:1077F000EF2720FDEB27E695879547955795C6948B -:10780000A52FB0E0A055BF4DE42FF0E0E055FE4DB0 -:10781000AC91E081EA2BA82FB0E0A055BD4DFC91C2 -:10782000EF2BF0E0E057FF4DB081B6956795F32F51 -:10783000F071ED2DE17EFE27E92FE072FE27E52FA6 -:10784000E479FE27E42FE377FE27E82FEA73FE278B -:10785000EF2FE295FE27AF2FA695A695FA27EC2DE0 -:10786000EF27F695EF2720FDEB27E69597953795BF -:10787000D794C694ED2DF0E0E055FF4DA32FB0E076 -:10788000A055BE4DF081EC91EF2BA92FB0E0A05593 -:10789000BD4DFC91EF2BF0E0E057FF4DB081B69568 -:1078A0006795F42FF071E52FE17EFE27E82FE07257 -:1078B000FE27ED2DE479FE27E32FE377FE27E92F5E -:1078C000EA73FE27EF2FE295FE27AF2FA695A69528 -:1078D000FA27EC2DEF27F695EF2720FDEB27E6950D -:1078E000879547955795A52FB0E0A055BF4DE42F3C -:1078F000F0E0E055FE4DAC91E081EA2BA82FB0E01E -:10790000A055BD4DFC91EF2BF0E0E057FF4DF0810D -:10791000F6956795B62EED2DE17E632F60716E278B -:10792000E92FE0726E27E52FE4796E27E42FE377E5 -:107930006E27E82FEA736E27E62FE2956E27E62F73 -:10794000E695E6956E27C694C6266695C62620FD62 -:10795000CF26C69497953795D794AD2DCD2CD12CA5 -:10796000F601E055FF4D6F01832E912CF401E05597 -:10797000FE4D4F01F601B081F4016081B62BC92E96 -:10798000D12CF601E055FD4D6081EB2FE62BF0E0A8 -:10799000E057FF4DC080E72FF0E0EE51FB4FE49140 -:1079A000EC25EC837B257993EC16FD0609F00CCED3 -:1079B00050936A2C40936B2C80936C2CA0936D2C6D -:1079C00030936E2C90936F2CDF91CF911F910F917C -:1079D000FF90EF90DF90CF90BF90AF909F908F90EF -:1079E0000895BF92CF92DF92EF92FF920F931F9371 -:1079F000CF93DF93A0916A2C50916B2C10916C2C3B -:107A000040916D2C30916E2C20916F2CFC01BC01AB -:107A10006C5F7F4F0191952F90718A2F817E9827FF -:107A2000812F80729827842F84799827832F8377DA -:107A30009827822F8A739827892F82959827892FD4 -:107A4000869586959827C42ED12CE601C055DF4D2A -:107A50006E01E32EF12CE701C055DE4D7E01E601FB -:107A6000B881E7018881B82BE22EF12CE701C055DF -:107A7000DD4D8881CB2FC82BD0E0C057DF4DB881BA -:107A8000B027B92796959B270695812F96958795C0 -:107A90005795A795B32FB071942F917EB927922F48 -:107AA0009072B9279A2F9479B927952F9377B92790 -:107AB000982F9A73B9279B2F9295B9279B2F96954C -:107AC0009695B927CA2ED12CE601C055DF4D6E011F -:107AD000E52EF12CE701C055DE4D7E01E60118814F -:107AE000E7019881192BE82EF12CE701C055DD4DF7 -:107AF0009881C12FC92BD0E0C057DF4D98819027C6 -:107B00009B27B695B927B02EB694922FB695979528 -:107B100037954795B52FB0712A2F217EB227282F90 -:107B20002072B227242F2479B227232F2377B2275C -:107B3000292F2A73B2272B2F2295B2272B2F269578 -:107B40002695B227C42FD0E08E0100551F4D680145 -:107B5000C32FD0E08E0100551E4D7801E60108814B -:107B6000E7012881022BE92EF12CE701C055DD4DFC -:107B70002881022B10E000571F4DE8012881C22FF9 -:107B8000CB25CB27B695BC272B2D2695B69587956B -:107B90005795A795C32FC071B42FB17EBC27C92FAD -:107BA000C072BC27CA2FC479BC27C52FC377BC2796 -:107BB000C82FCA73BC27CB2FC295BC27CB2FC69525 -:107BC000C695BC27CA2FD0E0C055DF4D052F10E069 -:107BD00000551E4DF880E8011881F12A082F10E0A9 -:107BE00000551D4DE8011881CF2DC12BD0E0C057A5 -:107BF000DF4DC881C227CB27B695BC272695B69501 -:107C0000979537954795C52FC071BA2FB17EBC2780 -:107C1000C82FC072BC27C42FC479BC27C32FC37719 -:107C2000BC27C92FCA73BC27CB2FC295BC27CB2F2B -:107C3000C695C695BC27C42FD0E0C055DF4D032F95 -:107C400010E000551E4DF880E8011881F12A092F37 -:107C500010E000551D4DE8011881CF2DC12BD0E05B -:107C6000C057DF4DC881C227CB27B695BC272695C4 -:107C7000B69587955795A795D32FD071B42FB17E20 -:107C8000DB27B92FB072DB27BA2FB479DB27B52FEA -:107C9000B377DB27B82FBA73DB27BD2FB295DB276D -:107CA0001D2F169516951D27CA2ED12CE601C055FD -:107CB000DF4D6E01E52EF12CE701C055DE4D7E0152 -:107CC000E6010881E701B8810B2BE82EF12CE701D2 -:107CD000C055DD4DB881C02FCB2BD0E0C057DF4D54 -:107CE000B881B227B127D12FD695DB27B22EB69413 -:107CF000D695979537954795D52FD0712A2F217E08 -:107D0000D227282F2072D227242F2479D227232F5D -:107D10002377D227292F2A73D2272D2F2295D227D6 -:107D20002D2F26952695BD2FB227C42FD0E08E018A -:107D300000551F4D6801C32FD0E08E0100551E4D28 -:107D40007801E6010881E7012881022BE92EF12C58 -:107D5000E701C055DD4D2881022B10E000571F4D73 -:107D6000E80118811B251B27DB2FD695D127D69537 -:107D700087955795A795182F242F217E832F8071E3 -:107D80002827892F807228278A2F84792827852FF2 -:107D900083772827812F8A732827B22FB2952B2724 -:107DA000B22FB695B6952B27EA2EF12CE701C055D8 -:107DB000DF4D7E01C52ED12CE601C055DE4D6E0192 -:107DC000E701E880E6018881E82AC12ED12CE6018E -:107DD000C055DD4D8881E82AF12CE701C057DF4D01 -:107DE000B6948881CB2DC827C2272695B22FBC27F1 -:107DF0002B2F2695979537954795292F6E177F0737 -:107E000009F008CEA0936A2C50936B2C10936C2C25 -:107E100040936D2C30936E2C90936F2CDF91CF910B -:107E20001F910F91FF90EF90DF90CF90BF9008953A -:107E3000CF93DF93EAE6FCE2A08171816281338116 -:107E400024819581472F40718A2F817E8427462F78 -:107E500040728427432F44798427422F4377842715 -:107E6000492F4A738427482F42958427482F4695E7 -:107E700046958427482F469584278695679577955C -:107E8000A795C32FD0E0C055DF4D422F50E040559D -:107E90005E4DB881EA018881B82B492F50E04055EA -:107EA0005D4DEA018881CB2FC82BD0E0C05BDF4D50 -:107EB00088818695522F5071432F417E4527592F37 -:107EC000507245275A2F54794527572F5377452706 -:107ED000562F5A734527542F52954527542F5695A0 -:107EE00056954527542F569545274695979527959E -:107EF0003795CA2FD0E0C055DF4D472F50E0405591 -:107F00005E4DB881EA014881B42B462F50E04055C0 -:107F10005D4DEA014881CB2FC42BD0E0C05BDF4D23 -:107F20004881842B8695572F50714A2F417E4527D3 -:107F3000562F50724527532F54794527522F537788 -:107F40004527592F5A734527542F52954527542FAB -:107F5000569556954527542F56954527469567952E -:107F60007795A795C32FD0E0C055DF4D422F50E045 -:107F700040555E4DB881EA014881B42B492F50E04D -:107F800040555D4DEA014881CB2FC42BD0E0C05B4A -:107F9000DF4D4881842B8695CA2FD0E0C055DF4D38 -:107FA000472F50E040555E4DB881EA014881B42B1F -:107FB000462F50E040555D4DEA014881CB2FC42B40 -:107FC000D0E0C05BDF4D4881842B532F517E422F80 -:107FD00040714527592F507245275A2F547945270C -:107FE000572F53774527562F5A734527542F5295AD -:107FF0004527542F569556954527542F5695452776 -:108000004695979527953795A0837183628333832F -:1080100024839583DF91CF910895BF92CF92DF9211 -:10802000EF92FF920F931F93CF93DF9350916A2C9F -:10803000C0916B2CB0906C2C40916D2C30916E2CBB -:1080400020916F2CFC01615008F4EAC19C2F9071C3 -:10805000852F817E98278B2D80729827842F847995 -:108060009827832F83779827822F8A739827892FC1 -:1080700082959827792F769576959727892F8695DB -:108080009827AC2F8B2D96958795A7955795C42F3C -:10809000D0E0C055DF4D032F10E000551E4D788114 -:1080A000E8019881792B022F10E000551D4DE80161 -:1080B0009881C72FC92BD0E0C059DF4D1881169584 -:1080C000732F7071942F917E9727722F707297275C -:1080D000752F747997277A2F73779727782F7A736C -:1080E0009727792F72959727792F769576959727E9 -:1080F000792F76957927922F272F26959795379563 -:108100004795C52ED12CE601C055DF4D6E01EA2EF4 -:10811000F12CE701C055DE4D7E01E6017881E701D3 -:108120002881722BE82EF12CE701C055DD4D288106 -:10813000C72FC22BD0E0C059DF4D2881122B1695D6 -:108140007A2F7071252F217E2727782F707227278D -:10815000742F74792727732F73772727792F7A73D2 -:108160002727722F72952727722F769576952727C6 -:10817000722F76952727BA2F26958795B79557950D -:10818000C42ED12CE601C055DF4D6E01E32EF12C3B -:10819000E701C055DE4D7E01E6017881E7012881C7 -:1081A000722BE92EF12CE701C055DD4D2881C72F38 -:1081B000C22BD0E0C059DF4DA881A12BA695732F0B -:1081C0007071242F217E2727792F70722727752F12 -:1081D000747927277B2F73772727782F7A732727A0 -:1081E000722F72952727722F769576952727722FF3 -:1081F00076957227232F372F369597952795479594 -:10820000C52FD0E0C055DF4D0B2F10E000551E4D9F -:108210007881E8013881732B082F10E000551D4D3F -:10822000E8013881C72FC32BD0E0C059DF4DD8817A -:10823000AD2BA6957B2F7071352F317E3727782F88 -:1082400070723727742F74793727722F7377372717 -:10825000792F7A733727732F72953727732F769577 -:1082600076953727732F7695372736958795B79567 -:108270005795C42FD0E0C055DF4D022F10E00055B8 -:108280001E4D7881E8013881732B092F10E00055CD -:108290001D4DE8013881C72FC32BD0E0C059DF4DF9 -:1082A000D881AD2BA695722F7071342F317E732734 -:1082B000392F30727327352F347973273B2F33775B -:1082C0007327382F3A737327372F32957327372F39 -:1082D000369536957327372F36957327342F769535 -:1082E000979527953795C52FD0E0C055DF4D0B2FBB -:1082F00010E000551E4D7881E8014881742B082F4D -:1083000010E000551D4DE8014881C72FC42BD0E077 -:10831000C059DF4DD881DA2BD6957B2F7071452F50 -:10832000417E7427482F40727427432F4479742765 -:10833000422F43777427492F4A737427472F42955A -:108340007427A72FA695A6957A27472F46957427B9 -:108350004B2F7695879547955795C42FB82EA32F09 -:10836000B0E08D0100551F4D6801A22FB0E08D01D6 -:1083700000551E4D7801D6010C91D7018C91082B28 -:10838000E92EF12CD701A055BD4D8C91082B10E0A2 -:1083900000591F4DD8018C91D82BD695732F717E23 -:1083A000822F80717827892F80727827852F847992 -:1083B0007827842F837778278B2D8A737827872FC8 -:1083C00082957827A72FA695A6957A27872F869539 -:1083D0007827432F322F272F269597953795479546 -:1083E000292F852F90E080559F4D0C2F10E00055D0 -:1083F0001E4DDC019C91D8018C91892B0B2D10E036 -:1084000000551D4DD8019C91892B90E080599F4DBE -:10841000DC019C918D2F892B90818927819313CE2C -:1084200050936A2CC0936B2CB0926C2C40936D2CA3 -:1084300030936E2C20936F2CDF91CF911F910F9171 -:10844000FF90EF90DF90CF90BF900895EF92FF9252 -:108450000F931F93CF93DF9370916A2C50916B2CE5 -:1084600020916C2C40916D2C30916E2CC0916F2C12 -:10847000E42FF0E0E055FF4DA32FB0E0A055BE4D36 -:10848000F081EC91EF2BAC2FB0E0A055BD4DFC91ED -:10849000EF2BF0E0E057FF4D1081DC01D0E06150A0 -:1084A00008F4DBC11695D795952F9071872F817EA3 -:1084B0008927922F90728927942F94798927932F57 -:1084C000937789279C2F9A738927982F92958927CC -:1084D000E82FE695E6958E27982F9695892786951D -:1084E000279557957795D695932F9071842F817EF8 -:1084F00089279C2F90728927972F94798927952F08 -:1085000093778927922F9A738927982F9295892795 -:10851000E82FE695E6958E27982F969589279C2F2C -:108520008695979537954795E72FF0E0E055FF4DF5 -:10853000052F10E000551E4DC081F8018081C82B29 -:10854000022F10E000551D4DF8018081EC2FE82B23 -:10855000F0E0E059FF4D8081D82BD695E52FE071F2 -:10856000872F817E8E27E22FE0728E27E42FE47919 -:108570008E27E32FE3778E27E92FEA738E27E82FE4 -:10858000E2958E27E82FE695E6958E27E82FE6956B -:108590008E278695279557957795E42FF0E0E0553F -:1085A000FF4D032F10E000551E4DC081F801808162 -:1085B000C82B092F10E000551D4DF8018081EC2FCC -:1085C000E82BF0E0E059FF4D8081D82BD695E32FC2 -:1085D000E071842F817E8E27E92FE0728E27E72FAE -:1085E000E4798E27E52FE3778E27E22FEA738E2733 -:1085F000E82FE2958E27E82FE695E6958E27E82F5F -:10860000E6958E278695979537954795E72FF0E065 -:10861000E055FF4D052F10E000551E4DC081F801BB -:108620008081C82B022F10E000551D4DF80180817C -:10863000EC2FE82BF0E0E059FF4D8081D82BD69548 -:10864000E52FE071872F817E8E27E22FE0728E2743 -:10865000E42FE4798E27E32FE3778E27E92FEA735F -:108660008E27E82FE2958E27E82FE695E6958E2750 -:10867000E82FE6958E278695279557957795E42FD1 -:10868000F0E0E055FF4D032F10E000551E4DC08176 -:10869000F8018081C82B092F10E000551D4DF8010D -:1086A0008081EC2FE82BF0E0E059FF4D8081D82B42 -:1086B000D695E32FE071842F817E8E27E92FE0721B -:1086C0008E27E72FE4798E27E52FE3778E27E22F99 -:1086D000EA738E27E82FE2958E27E82FE695E69538 -:1086E0008E27E82FE6958E2786959795379547959F -:1086F000E72FF0E0E055FF4D052F10E000551E4D2F -:10870000C081F8018081C82B022F10E000551D4D5B -:10871000F8018081EC2FE82BF0E0E059FF4D8081DB -:10872000D82BD695E52FE071872F817E8E27E22FFB -:10873000E0728E27E42FE4798E27E32FE3778E27EC -:10874000E92FEA738E27E82FE2958E27E82FE6952A -:10875000E6958E27E82FE6958E27869527955795DF -:108760007795E42FF0E0E055FF4D032F10E0005522 -:108770001E4DC081F8018081C82B092F10E00055E3 -:108780001D4DF8018081EC2FE82BF0E0E059FF4D02 -:108790008081D82BD695E72FF0E0E055FF4D052FCF -:1087A00010E000551E4DC081F8018081C82B022FBA -:1087B00010E000551D4DF8018081EC2FE82BF0E012 -:1087C000E059FF4D8081D82BE42FE17E832F80710B -:1087D000E827892F8072E827872F8479E827852F5B -:1087E0008377E827822F8A73E8278E2F8295E827E0 -:1087F0008E2F86958695E8278E2F8695E827E69515 -:10880000979537954795C92FE42FF0E0E055FF4D38 -:10881000832F90E080559E4D1081FC018081182BA4 -:108820008C2F90E080559D4DFC018081E12FE82B3D -:10883000F0E0E057FF4D10818C91E82FF0E0EE5111 -:10884000FB4FE4917D01F0E8EF0EF11C9E2F912784 -:10885000F70190838D278D9322CE70936A2C5093CD -:108860006B2C20936C2C40936D2C30936E2CC0930A -:108870006F2CDF91CF911F910F91FF90EF90089592 -:108880000F931F93FC01862F408151816281738178 -:108890008B0122273327803208F471C0D80123E0EE -:1088A000B695A7952A95E1F70A271B2798013695D3 -:1088B000279536952795BBE076956795579547950B -:1088C000BA95D1F70227132720E030E095E1000F99 -:1088D000111F221F331F9A95D1F7402B512B622B6A -:1088E000732B8B0122273327D80133E0B695A79548 -:1088F0003A95E1F70A271B27980136952795369573 -:108900002795BBE07695679557954795BA95D1F72A -:108910000227132720E030E095E1000F111F221FEE -:10892000331F9A95D1F7402B512B622B732B8B0160 -:1089300022273327D80133E0B695A7953A95E1F77A -:108940000A271B2798013695279536952795BAE073 -:108950007695679557954795BA95D1F702271327CE -:1089600020E030E096E1000F111F221F331F9A957F -:10897000D1F7402B512B622B732B805289CF408330 -:108980005183028373831F910F910895AF92BF9219 -:10899000CF92DF92EF92FF920F931F93CF93DF93CB -:1089A0006730710509F451C09B0127703327232BD1 -:1089B00009F04EC05B016C01EB0183E0D695C795D1 -:1089C0008A95E1F77B0196E0F694E7949A95E1F7B2 -:1089D000EC0EFD1EEC0CFD1C8E01015011090C0D5E -:1089E0001D1DA701401B510B60E070E0C8010196FE -:1089F0000E94C5540C151D0520F1D801EC91F0E042 -:108A0000EE51FB4F2491D701CD010A171B0768F4E3 -:108A1000FC018081982F990F8E91881F8827881FCD -:108A2000892B11968C931197EFCF11968C911197FA -:108A30008E7FE22FE170E82B1196EC930150110923 -:108A4000D9CFC5018C0F9D1F04C087E090E001C005 -:108A5000CB01DF91CF911F910F91FF90EF90DF90AD -:108A6000CF90BF90AF900895EF92FF920F931F9316 -:108A7000CF93DF93EC01CB0167307105E1F169E041 -:108A800070E00E94F553DE0180E090E008E010E025 -:108A90008617970751F1FC0133E0F695E7953A9573 -:108AA000E1F7E80FF91FAC0147705527EC0FFD1FE8 -:108AB000208130E0042E02C0359527950A94E2F714 -:108AC0002C934115510571F0E181F0E07801E41A31 -:108AD000F50AA7017F0102C0EE0CFF1C4A95E2F7E0 -:108AE0002E292C9301961196D3CF23E0880F991F3E -:108AF0002A95E1F702C087E090E0DF91CF911F91C6 -:108B00000F91FF90EF900895EF92FF920F931F93B4 -:108B1000CF93DF939C01CB016730710509F440C00E -:108B200069E070E00E94F55380E090E048E050E09A -:108B300086179707A9F1DC01E3E0B695A795EA95BA -:108B4000E1F7A80FB91FEC01C770DD27A20FB31F13 -:108B5000EC91F0E00C2E02C0F595E7950A94E2F74F -:108B6000209759F011960C9111977A01EC1AFD0A91 -:108B700001C0000FEA94EAF7E02BF0E0EE51FB4F62 -:108B8000E4911196AC91B0E002C0B595A795CA9555 -:108B9000E2F7ED01CE27FE01E0FD04C00196C8CF4B -:108BA00081E001C080E0DF91CF911F910F91FF9094 -:108BB000EF90089510924A2D089510924A2D109228 -:108BC000702C10924B2D0895F8DF0E949B2B109271 -:108BD0004A2D089508950895DC0123E633E6615097 -:108BE000E8F04D91942F922780E1989FA0011124E5 -:108BF0004927E42FF0E0232F332742954F70C90116 -:108C00008427AC013E2F22272427352743E0EE0F8F -:108C1000FF1F4A95E1F72E273F27E1CFC9010895AD -:108C2000EF92FF921F93CF93DF9320914B2D1091E2 -:108C30004A2D222329F0123008F00CC110924B2D3E -:108C40007B01EC01163090F4133080F51230A8F45B -:108C500081E090E0809320209093212082E588831A -:108C600082E080934A2D87E090E0F6C0193008F446 -:108C700076C01A3009F4B9C0EDC06231710508F44C -:108C800083C0CE0141DF8823C1F0B701CE01ECDE05 -:108C90008881998180933C2D90933D2D83E9888331 -:108CA00080E2898383E080934A2D8BC02DDF882367 -:108CB00021F088E0E816F10488F410924A2DC701EB -:108CC000089667E070E00E94F553462FE091662E0B -:108CD000F091672EBE0181EC199558C0B701CE0105 -:108CE000C3DE2881898182279A8189279B818927F0 -:108CF0009C81891349C0A12FB0E01397CD01880F43 -:108D0000991FA80FB91FA15CB24D283821F483E048 -:108D1000FE01319602C084E0FE0101900D928A9519 -:108D2000E1F745E050E0BE01CE0102960E94B45446 -:108D3000133021F0143021F485E903C083E901C028 -:108D400087E9888380E7898367E0CE0145DF8F83E9 -:108D500098871D5F10934A2D68E470E074C06B31F2 -:108D6000710590F0CE01D0DE811113C0C7010896C5 -:108D700067E070E00E94F553462FE091662EF09177 -:108D8000672EBE0181EC199510924A2D0E94942BFA -:108D900061C0B701CE0168DE63E0CE011DDF009740 -:108DA00099F7288122FF10C0183071F0163011F4A5 -:108DB00085E901C087E9888380E289831250109396 -:108DC0004A2D60E170E03FC021E020934B2D212F20 -:108DD00030E026503109122F110F210F2C5F209304 -:108DE000492D288120933E2D37C06115710521F44E -:108DF00081E080934A2DCACF87DE81110FC0C70161 -:108E0000089667E070E00E94F553462FE091662EC9 -:108E1000F091672EBE0181EC199508C0B701CE0113 -:108E200023DE63E0CE01D8DE892B11F382EC888348 -:108E300061E070E0CE010E943D3710934A2D109200 -:108E40004B2D68E170E0CE01DF91CF911F91FF9033 -:108E5000EF909CCD80E090E0DF91CF911F91FF904B -:108E6000EF9008955F926F927F928F929F92AF9250 -:108E7000BF92CF92DF92EF92FF920F931F93CF9307 -:108E8000DF93CDB7DEB7C054D240CDBFDEBF8C017B -:108E90006B018091702C833009F43BC130F4813038 -:108EA00069F0823009F4B8C0C2C4853009F40CC23C -:108EB00008F44EC1863009F4C3C2B9C4E0904C2E08 -:108EC000F0904D2EE114F104C1F0A701495F5F4F0E -:108ED00063E0569547956A95E1F76CE47DE2C80139 -:108EE0000E94AB5460914C2E70914D2EC8014EDD06 -:108EF00010924C2E10924D2EE5C16115710509F4AA -:108F0000ADC0C80101DEB82EB601C801ADDD6C01EF -:108F10009C01295F3F4FC901880F991F53E0969527 -:108F200087955A95E1F706968138910578F060EBC0 -:108F300073E2CE0101960E94D7541092702CBE01AC -:108F40006F5F7F4F85E60E947722EAC4B3E03695D3 -:108F50002795BA95E1F7A80160E870E0CE01019687 -:108F60000E94770E8C01CF5FDD4FD882C150D24076 -:108F7000CE5FDD4FC882C250D2408FEB93E29F9309 -:108F80008F9380E8C82ED12CC601801B910B9F9334 -:108F90008F9381E090E08C0F9D1F800F911F9F9316 -:108FA0008F930E94DE54080F191FB601601B710BCE -:108FB00022E030E0AE014F5F5D4F81E090E08C0F2A -:108FC0009D1F800F911F0E94770E800F911F0F90A1 -:108FD0000F900F900F900F900F909601281B390B58 -:108FE00041E050E04C0F5D1F840F951FB11003C08E -:108FF00042EC53E202C041ED53E25F934F933F9343 -:109000002F939F938F930E94DE540F900F900F9099 -:109010000F900F900F9091CFE0904C2EF0904D2E2E -:10902000E114F104C1F0A701495F5F4FA3E0569539 -:109030004795AA95E1F76CE47DE2C8010E94AB5424 -:1090400090914C2E80914D2E10924C2E10924D2EC0 -:10905000E92EF82E65C46115710551F488E0E1E050 -:10906000F4E2DE01119601900D928A95E1F765CF49 -:109070009B01295F3F4FE3E036952795EA95E1F79D -:10908000A80160E870E0CE0101960E94770E8C0185 -:10909000CF5FDD4FD882C150D240CE5FDD4FC88256 -:1090A000C250D2408FEB93E29F938F93F0E8CF2E84 -:1090B000D12CC601801B910B9F938F9381E090E090 -:1090C0008C0F9D1F800F911F9F938F930E94DE54E2 -:1090D000800F911FB601681B790B22E030E0AE01D2 -:1090E0004F5F5D4FA1E0B0E0AC0FBD1F8A0F9B1F2B -:1090F0000E94770E1092702CBE016F5F7F4F85E645 -:109100000E9477220F900F900F900F900F900F906A -:1091100007C4C80185DD20914B2D222309F48AC3A1 -:109120002091492D30E04FE35DE264E170E0CE0133 -:1091300001960E94770EBE016F5F7F4F85E60E9409 -:10914000772210924B2D1092702C0E940D236FC32A -:1091500080912B2D811108C080E890E00E945A2355 -:1091600081E080932B2D76C0813009F075C080910D -:109170004A2D823008F070C080912A2D8F5F809335 -:109180002A2D803109F068C00E9463237C0193502E -:10919000409768F0E114B8E0FB0608F45BC0E0E13A -:1091A000F0E020E030E0A12CB12C60E03EC0A2EB6A -:1091B000BCE240E050E020E030E080E090E0E0E021 -:1091C000F0E060E07D91703129F461110EC0FA0188 -:1091D00061E00BC0662349F0BA016E1B7F0B681774 -:1091E000790710F09F01CB0160E04F5F5F4F48327D -:1091F000510541F78430910508F01EC32BC0D601FC -:109200000D916D0110E00E171F07C0F0611102C033 -:109210005A0161E04F5F5F4F4837510581F7009772 -:1092200009F00AC3319709F407C372EBC72E7CE239 -:10923000D72E40E050E080E090E0E1CF662351F38C -:10924000BA016A197B096817790710F09501CB01FB -:1092500060E0E0CF10922A2DB601C801E1DC209138 -:109260004B2D222309F4E6C2E0911E20F0911F202D -:10927000E058F109A4E0F695E795AA95E1F7EE54D8 -:10928000F34D80818F5F808380912A2D803121F47E -:109290000E94632310922A2D10924A2D0E94942B33 -:1092A00080E5F8018083118262E070E0C8010E94CD -:1092B0003D3781E080934A2D10924B2D60E270E0A3 -:1092C000C80164DB7C012CC3C801AADC20914B2DB2 -:1092D000222309F4AFC2F090B12CFF2091F1C11408 -:1092E000D10429F41092B12C10924B2D42C0F2EA15 -:1092F000CF16D10438F0B601C80106DC91E0892709 -:10930000A82E03C0AA24A394B12CB601C801ACDBDB -:10931000A0FC05C062E1C8015FDC892B29F0ACEF3D -:10932000AF0DA093B12C2AC024E0F29ED0011124ED -:10933000AF59B34D80E1F80101900D928A95E1F7A4 -:109340001DC042E050E069E472E1CE0101960E9446 -:109350007D54ECE4F2E1E49120913C2D30913D2DDF -:1093600089819A812817390721F480913E2DE817C9 -:1093700029F010924A2D0E94942B59C28091B12C51 -:10938000803109F04DC010924B2D1092B12C1092EB -:10939000702C20E130E041E75CE267E870E0CE014C -:1093A00001960E94770E6FEB73E2CE0181960E94C8 -:1093B000D75420E130E041E85CE265E670E0CE01A0 -:1093C00083960E94770E6FEB73E2CE018D5B9F4F09 -:1093D0000E94D75420E130E041E95CE263E470E0B0 -:1093E000CE018B5B9F4F0E94770E6FEB73E2CE0135 -:1093F0008B599F4F0E94D75420E130E041EA5CE254 -:1094000061E270E0CE0189599F4F0E94770E0E9461 -:109410000D23BE016F5F7F4F85E60E94772207C252 -:1094200090E3D8019C9311968C9362E070E0C801A0 -:109430000E943D378091B12C8C5F8093B12C3ECF40 -:10944000C801EEDB20914B2D222309F4F3C180915A -:109450004A2D9AEF980F933008F04CC0F8018081A4 -:109460008072B82E10922C2DE4E1EE2EE1E1FE2E5A -:10947000A12C47E650E0B701CE0101960E947D5431 -:109480008B81882349F029813A8180913C2D9091EC -:109490003D2D28173907B9F48D81882329F09C8147 -:1094A00080913E2D98130FC08F89882311F0BB2027 -:1094B00051F0E0912C2D81E08E0F80932C2DF0E067 -:1094C000E35DF24DA082A394F7E6EF0EF11C2FE0CE -:1094D000A212CFCFBB2009F485C080EED8018C93B7 -:1094E00080E811968C9362E070E0C8010E943D37DD -:1094F00089E09BC0893009F075C0B601C80104DB62 -:1095000081110FC0C601089667E070E00E94F55314 -:10951000462FE091662EF091672EB80181EC1995E7 -:10952000A3C0B601C801A0DA6C01D8016C91262F46 -:1095300030E073E0969587957A95E1F702972817C2 -:10954000390709F091C06E5FC80146DB892B09F02D -:109550008BC0F12C67E6E62E5801BFEFAB1ABB0AB1 -:1095600080912C2DF816F0F5EF2DF0E0E35DF24D33 -:109570006081E69EB00111246C5E7E4E47E650E0AD -:10958000CE0101960E947D548F89882349F14E892E -:1095900050E0D8018C9190E001974817590741F0AD -:1095A00020912C2D422F50E0415051093F2D08C0F1 -:1095B000B501CE0106960E949E54892B89F710C0F2 -:1095C000832F90E0841795073CF4FC01E35DF24D96 -:1095D000818180833F5FF4CF215020932C2DFA941A -:1095E000F394BECF80914A2D9AEF980F943000F5F6 -:1095F00020912C2DEDE2FDE280E001C08F5F82170B -:1096000009F468C0919194509230C0F782E0F8015B -:10961000808380E6818362E0C801DEDAD801129699 -:109620008C93129713969C938BE080934A2D46CE91 -:109630008B3009F04FC0C114D10409F449C0B60100 -:10964000C80162DA811114C0C601089667E070E0B3 -:109650000E94F553462FE091662EF091672EB801D7 -:1096600081EC199510922C2D82ECF801808312C0A8 -:10967000B601C801F9D953E0969587955A95E1F757 -:10968000682FC801A9DA892B91F010922C2D82EC59 -:10969000D8018C9361E070E0C8010E943D378AE0F8 -:1096A00080934A2D10924B2D68E170E009CEF801AD -:1096B0008581882331F0813059F480932C2D85E009 -:1096C00004C081E080932C2D84E080932D2D02C076 -:1096D00010922C2D80912C2D811103C067EE73E226 -:1096E00027C08130A1F0912C80E090E000E010E0F4 -:1096F00027E6822E7E01FFEFEF1AFDEFFF0A3AEF19 -:10970000C32E33E2D32EA12C42E0B42E40C0609190 -:109710002D2D27E6629FB0011124655C7E4E40E44A -:1097200050E0CE0101960E947D54BE016F5F7F4FD5 -:1097300085E60E94772254C0013032E0130778F5A5 -:10974000E92DF0E0E35DF24D6081869EB0011124C9 -:10975000655C7E4E40E450E0C7010E947D54FF925C -:10976000EF92DF92CF92C501801B910B9F938F9355 -:1097700081E090E08C0F9D1F800F911F9F938F932E -:109780000E94DE54080F191F9394CDBFDEBF2091B5 -:109790002C2D921688F2013052E0150720F0081B9C -:1097A000190BF12C02C0FF24F394EDEFFFEFEC0F47 -:1097B000FD1FE00FF11F8EE28083EEEFFFEFEC0F55 -:1097C000FD1FE00FF11F1082BE016F5F7F4F85E626 -:1097D0000E947722F11004C08FEA90E10E94FC18E9 -:1097E00088EA90E10E94FC1862E070E08CE39DE260 -:1097F0000E94952282EA90E10E94FC186091492D16 -:1098000070E08FE39DE20E9495228CE990E10E9436 -:10981000FC1861E070E08EE39DE20E9495221092B8 -:10982000702C10922C2D0E940D2310924B2DE12CA8 -:10983000F12C76C07C0174C010922B2D009771F032 -:1098400096958795285F3F4F820F931F64E0880F9E -:10985000991F6A95E1F70E945A2302C00E94712362 -:1098600060E070E085E60E947722E114B8E0FB0634 -:1098700020F448E2A42EB12C03C038E7A32EB12C6B -:1098800002EB1CE2B0E8EB2EF12C8DED682E83E2AA -:10989000782E9AE0592EFE0131966F0123EE822E2A -:1098A00023E2922EFF92EF927F926F921F925F922D -:1098B000DF92CF920E94DE54C6010E94F718D801B1 -:1098C0008C91CDBFDEBF882381F01F928F939F9232 -:1098D0008F921F925F92DF92CF920E94DE54C60158 -:1098E0000E94F718CDBFDEBF04C06DE283E090E2B6 -:1098F00006D681E191E10E94FC18D8011D928D01EC -:10990000B0E1EB0EF11CC801825B9C428A159B05FD -:1099100048F210924B2D1092702C0E949B2B87CFF7 -:10992000C701C05CDD4FCDBFDEBFDF91CF911F917E -:109930000F91FF90EF90DF90CF90BF90AF909F90EE -:109940008F907F906F905F9008950F931F93CF93A8 -:10995000DF93CDB7DEB7EA97CDBFDEBF00EC11E3F2 -:1099600095D2F80181938F01F1E3083C1F07C1F7FD -:109970000E94AB1906D3882309F4FAC08091C03144 -:109980009091C131953009F46FC030F4913069F194 -:1099900068F0933051F1ECC0983009F4C2C09930AE -:1099A00009F4C8C0963009F0E3C072C0803891F065 -:1099B000823809F0DDC08091C4318F7087D2E09188 -:1099C000CA31F091CB31118112FB112710F980E0DF -:1099D0007DD206C01091BC318091BD3181111260E1 -:1099E000EAD2812F63D280E0A1C0282F2D7F09F019 -:1099F000BFC0882319F0823061F0BAC08091C231B3 -:109A0000813009F0B5C0933009F080E08093BD311A -:109A100027C08091C231811123C0E091C4311E2F33 -:109A20001F7009F4A5C0812F51D28091C1318330BC -:109A300011F4EDD215C0E091CA31F091CB318181A2 -:109A40008B7F818324E8129FF0011124E25FFD4C9B -:109A50001082E091CA31F091CB3180818E7F80837A -:109A600080E034D2A8D264C0811182C01091C2318A -:109A70001F77A1D28FD35FD28823E9F31093C30459 -:109A8000111102C082E001C083E08093BF3170C039 -:109A90008058823008F06CC08091C2319091C331FF -:109AA0008C3DE3E09E0761F583E08A838AE3898346 -:109AB0004FB7F894DE01139620E038E052E050935F -:109AC000CA01E32FF0E0E4911092CA0120FF03C025 -:109AD000E295EF703F5FEF708E2F90E0EA3010F06C -:109AE000C79601C0C0968D939D932F5F2C3139F797 -:109AF0004FBF61D26AE370E0CE010196A5D00FC0DE -:109B0000AE014F5F5F4F6091C4310E94EB0C8C013E -:109B1000892B71F150D2B80189819A8111D1A7D1D5 -:109B200027C0803829F547D28091BB31BFD186D17B -:109B300031D31EC081111CC08091C2319091C331BC -:109B400099270297ACF437D28091C2318093BB3110 -:109B500021D38091BB31811106C08091C304811152 -:109B600002C081E001C084E08093BF310E94A71948 -:109B700008D2882311F01FD24AD2EA96CDBFDEBFA9 -:109B8000DF91CF911F910F9108950895CF93809108 -:109B9000BF31882351F0C091CC3180E097D1F1D111 -:109BA0008111D3DE8C2FCF9191C1CF910895CF92A7 -:109BB000DF92EF92FF920F931F93CF93DF93EC010D -:109BC0008B017A01FDD2811136C0E114F10439F024 -:109BD000F70180819181081B190BC80FD91FC12C77 -:109BE000D12C0115110531F18091C8319091C93105 -:109BF000FC01EF5BFF4F208131978081281790F0A7 -:109C00001DD1C4DFE114F10449F0F7018081918195 -:109C1000C80ED91EC082D18285E00DC0D1D2882362 -:109C200001F309C0899142D101501109FFEFCF1A08 -:109C3000DF0AD7CF80E0DF91CF911F910F91FF9086 -:109C4000EF90DF90CF900895DF92EF92FF920F9305 -:109C50001F93CF93DF93D82FC92F8B018091CC31E5 -:109C6000806834D18091C6319091C73180179107B7 -:109C700028F00115110519F4E1D001C08C01ED2E79 -:109C8000FC2ED12C0115110509F440C08091BF3183 -:109C9000811102C082E04CC0853011F483E048C0DD -:109CA00070D1882311F081E043C051D181113CC0B3 -:109CB00042D1882339F32091CC318091C8319091E1 -:109CC000C931FC0127FF05C0EF5BFF4FC081D0E029 -:109CD00013C0E05CFF4FC08131968081D0E0C81B8B -:109CE000D1090AC0C830D10550F4F70181917F0134 -:109CF000DDD00150110921960115110599F7DD24D8 -:109D0000D394289709F0D12C99D0BCCFD110BECFD5 -:109D10000BC08091BF31882309F4BCCF853009F492 -:109D2000BDCF2FD18111BFCF12D1882391F380E015 -:109D3000DF91CF911F910F91FF90EF90DF900895E9 -:109D4000DF92EF92FF920F931F93CF93DF93D82F61 -:109D5000C92F8B018091CC318068B8D08091C631F9 -:109D60009091C7318017910728F00115110519F45A -:109D700065D001C08C01ED2EFC2ED12C01151105F2 -:109D800009F442C08091BF31811102C082E04EC00F -:109D9000853011F483E04AC0F4D0882311F081E0CB -:109DA00045C0D5D081113EC0C6D0882339F320915B -:109DB000CC318091C8319091C931FC0127FF05C099 -:109DC000EF5BFF4FC081D0E015C0E05CFF4FC0816A -:109DD00031968081D0E0C81BD1090CC0C830D105B4 -:109DE00060F4F701849162D0FFEFEF1AFF0A01508F -:109DF000110921960115110589F7DD24D3942897BF -:109E000009F0D12C1BD0BACFD110BCCF0BC08091A0 -:109E1000BF31882309F4BACF853009F4BBCFB1D064 -:109E20008111BDCF94D0882391F380E0DF91CF9151 -:109E30001F910F91FF90EF90DF900895E091CA314C -:109E4000F091CB31A091C831B091C931AF5BBF4F18 -:109E50008C9190E08283938380818D798083E091DF -:109E6000C831F091C931EF5BFF4F10820895E09146 -:109E7000CA31F091CB3180818D798083E091C831F6 -:109E8000F091C931EF5BFF4F108208958091C83186 -:109E90009091C931FC01EF5BFF4F208131E0320F1F -:109EA0003083FC01E20FF11D808108952091C831BB -:109EB0003091C931F901EF5BFF4F908141E0490FCB -:109EC0004083F901E90FF11D808308958093CC311F -:109ED000482F4F7050E06091C6047091C7049A01FA -:109EE00094E0220F331F9A95E1F7E4E887FF11C051 -:109EF000E49FC001E59F900D1124815F9D4C8093EC -:109F0000C8319093C931C90108969B01280F391FA8 -:109F10000DC0E49FC001E59F900D112483539E4C1A -:109F20008093C8319093C931260F371F2093CA31CF -:109F30003093CB3108958091CC318068C7DFE091B8 -:109F4000CA31F091CB3180818695817008958091DE -:109F5000CC318F77BBDFA091CA31B091CB318C91DE -:109F600085FF0DC0E091C831F091C93112968D91F5 -:109F70009C911397E05CFF4F808381E0089580E01F -:109F800008958091CC318F77A1DFA091CA31B09133 -:109F9000CB318C9184FF0DC0E091C831F091C93173 -:109FA00012968D919C911397E05CFF4F808381E026 -:109FB000089580E008958091CC318F7787DFE0911C -:109FC000CA31F091CB3180818D788083E091CA31A4 -:109FD000F091CB31808181608083E091C831F09134 -:109FE000C931EF5BFF4F10828091CC3180686EDF0A -:109FF000E091CA31F091CB31808181608083E09122 -:10A00000C831F091C931EF5BFF4F10820895E091A4 -:10A01000CA31F091CB31818184608183E091CA3172 -:10A02000F091CB318181807C803459F48091CC31A6 -:10A0300080584CDFE091CA31F091CB31818184604E -:10A04000818308951F93CF93DF93C82F162FD42FAA -:10A050003DDFE091CA31F091CB311182E091CA31FC -:10A06000F091CB318C2F881F8827881F880F808321 -:10A07000E091CA31F091CB311183E091CA31F09176 -:10A08000CB31128213822091C8313091C93124839F -:10A090003583CC0FCC0BCD23F901E05CFF4FC0839F -:10A0A0003196108281E0DF91CF911F910895CF9278 -:10A0B000DF92EF92FF920F931F93CF93DF93C62E01 -:10A0C0008C01D12CDC1409F43FC0F801D081D111EE -:10A0D00004C0D3940B5F1F4FF5CFF801E180F280ED -:10A0E00093818481823010F488E001C088E128E007 -:10A0F00030E0C0E02E153F0520F4CF5F220F331F64 -:10A10000F9CFC82B8D2F8F70863010F080E01DC0E6 -:10A11000CF7EF1E4EF16F104C8F7992321F09130D6 -:10A1200021F4C06C0AC0C06403C0C068911105C0AE -:10A130004E2D6C2F80E88D0F85DF4E2D6C2F8D2FCF -:10A1400081DF8111C6CFE2CF81E0DF91CF911F91F6 -:10A150000F91FF90EF90DF90CF90089580E090E016 -:10A16000E091C604F091C7049C0144E0220F331F24 -:10A170004A95E1F7E20FF31F11864091C604509112 -:10A18000C704FA01E20FF31F118201968630910590 -:10A1900039F708958091C03187FF0DC0D8DE811155 -:10A1A00005C08091BF318111F9CF09C060CE809187 -:10A1B000BF31882321F0BFDE8823C9F33FCE089545 -:10A1C0000F931F93CF93E091C604F091C704E05A18 -:10A1D000FF4F00811181C4E68091CC3187FF0AC016 -:10A1E000AADE811105C08091BF31811105C022C056 -:10A1F00080E025C0ACDEF5CF8530F1F0E091CA31CA -:10A20000F091CB31818182FD19C0E091C604F091BB -:10A21000C704E05AFF4F808191810817190711F494 -:10A220008C01DACF2FEF2C0FCC2311F0C22FF8CFF7 -:10A2300084E005C082E003C083E001C081E0CF91EB -:10A240001F910F91089563D069D0E0ECF4E0818113 -:10A250008E7F818380818F7780831092BE310895B5 -:10A26000CF93DF93E0E4F0E0148284818360848301 -:10A270004ED054D0C0ECD4E088818F778883888119 -:10A28000806888831092BF311092BB311092BD312B -:10A290001092BC3188818064888348E068E480E85B -:10A2A000D1DE48E068E480E0CDDE88858064888780 -:10A2B000898181608983DF91CF910895CF93DF9366 -:10A2C0003FB7F894C0ECD1E022E02A87EAE1F0E061 -:10A2D000E491A0ECB4E0DA96EC93DA97EBE1F0E0ED -:10A2E000E491DB96EC93DB971A8686EE94E38E7FFF -:10A2F00016968D939C93179785E18C9318962C93C3 -:10A300003FBF81E08093BE31DF91CF91A9CFE0ECD8 -:10A31000F4E080858370808711860895E0ECF4E096 -:10A320008FEF8287848708951F920F920FB60F9246 -:10A33000112408B60F9218BE09B60F9219BE0BB6BB -:10A340000F921BBE2F933F934F935F936F937F9317 -:10A350008F939F93AF93BF93EF93FF938091CA0422 -:10A3600087FF08C08091C80487FF04C080E88093FD -:10A37000CA040BDC8091CA0486FF07C080E4809386 -:10A38000CA041092BF310E9496198091CA0485FFB9 -:10A3900014C080E28093CA048091BB31882311F0FD -:10A3A00084E007C08091C304811102C081E001C034 -:10A3B00083E08093BF310E9485198091CA0484FF95 -:10A3C00014C080E18093CA0482E08093BF31109270 -:10A3D000BB311092C304C2DE48E068E480E832DE9C -:10A3E00048E068E480E02EDED0DBFF91EF91BF9182 -:10A3F000AF919F918F917F916F915F914F913F911D -:10A400002F910F900BBE0F9009BE0F9008BE0F90BA -:10A410000FBE0F901F901895CF93DF93EC01FC01B6 -:10A4200070968BE0DF011D928A95E9F782E08C83BC -:10A43000898783E08E8761E0CE01019638DE88232C -:10A4400061F061E0CE01069632DE882331F061E0F2 -:10A45000CE010B96DF91CF912ACE80E0DF91CF9194 -:10A4600008950F931F93CF93DF932091BF31243032 -:10A47000E1F4FC010489158926893789012B022B17 -:10A48000032B99F0EB01818121DDFE010190002079 -:10A49000E9F73197BF016C1B7D0B40E050E0CE0126 -:10A4A000DF91CF911F910F9182CB82E0DF91CF910D -:10A4B0001F910F9108950F931F93CF93DF932091D6 -:10A4C000BF312430B1F4FC0104891589268937890C -:10A4D000012B022B032B69F08A01EB018181F6DC51 -:10A4E00040E050E0B801CE01DF91CF911F910F9174 -:10A4F0005ECB82E0DF91CF911F910F9108950F9372 -:10A500001F93CF932091BF31243009F5FC010489BA -:10A51000158926893789012B022B032BC1F0C62F01 -:10A520008181D4DC8091C8319091C931FC01EF5B0D -:10A53000FF4F208131978081281720F48C2FB6DCC3 -:10A5400080E006C07BDC3CDE8823C1F301C082E0F2 -:10A55000CF911F910F910895CF93DF932091BF3139 -:10A56000243091F5FC014489558966897789452B0A -:10A57000462B472B49F18181A9DC8091CC31209178 -:10A58000C8313091C931F90187FF05C0EF5BFF4F3A -:10A59000808190E008C0E05CFF4F8081319640816F -:10A5A00090E0841B9109892B69F0F901EF5BFF4F63 -:10A5B000D0813197C08142DCDC1720F001DE8111AF -:10A5C00004C03CDC80E001C082E0DF91CF910895BF -:10A5D000CF93DF932091BF31243099F4FC0144895B -:10A5E000558966897789452B462B472B51F0EC011D -:10A5F00081816CDCA0DC882321F0CE01DF91CF913A -:10A60000ABCFDF91CF910895CF93DF932091BF31EE -:10A61000243019F08FEF9FEF46C0FC014489558923 -:10A6200066897789452B462B472BA1F386814EDC23 -:10A630008EDC882379F38091CC312091C831309120 -:10A64000C931F90187FF05C0EF5BFF4F808190E0C2 -:10A6500008C0E05CFF4F80813196208190E0821B32 -:10A660009109892B21F012DCC82FD0E002C0CFEF76 -:10A67000DFEF2091CC318091C8319091C931FC013C -:10A6800027FF05C0EF5BFF4F208130E008C0E05C92 -:10A69000FF4F20813196808130E0281B3109232B28 -:10A6A00009F4E5DBCE01DF91CF9108950895FF9283 -:10A6B0000F931F93CF93DF93EC0163DC882309F49E -:10A6C0008EC0888190E02091C4313091C531281727 -:10A6D000390709F084C08091C131813259F018F4F2 -:10A6E000803249F17CC0823209F457C0833209F4C8 -:10A6F00067C075C08091C031813A09F070C05BDCE1 -:10A700001ADC8823E9F38C89FD880E891F89CEDB4A -:10A710008F2DCCDB802FCADB812FC8DB888DC6DB79 -:10A72000898DC4DB8A8DC2DB89DBDF91CF911F91DC -:10A730000F91FF902FCD8091C031813209F04FC031 -:10A740003ADC05DC811105C08091BF318111F9CF60 -:10A7500046C09CDBF82E9ADB182F98DB082F96DB7F -:10A76000402F50E060E070E0BA0155274427782B75 -:10A770004F29512B4C8B5D8B6E8B7F8B87DB888FAA -:10A7800085DB898F83DB8A8F72DB04DDCE01DF916D -:10A79000CF911F910F91FF9089CF8091C03181326D -:10A7A000F1F409DCF7DC8091C2319091C331888BE0 -:10A7B000998BCE01DF91CF911F910F91FF9076CFB2 -:10A7C0008091C031813259F4F6DBE4DC6091C23112 -:10A7D000CE01DF91CF911F910F91FF9067CFDF9155 -:10A7E000CF911F910F91FF900895AA1BBB1B51E1C0 -:10A7F00007C0AA1FBB1FA617B70710F0A61BB70BF1 -:10A80000881F991F5A95A9F780959095BC01CD0195 -:10A810000895B7FF04C003D0821B930B089509D09D -:10A82000A59F900DB49F900DA49F800D911D1124A4 -:10A830000895A29FB001B39FC001A39F700D811D19 -:10A840001124911DB29F700D811D1124911D089539 -:10A850008F929F92AF92BF92CF92DF92EF92FF9230 -:10A86000CF93DF93EC01688179818A819B816115A7 -:10A8700071058105910521F464E279ED8BE597E09E -:10A880002DE133EF41E050E037D749015A019B01F8 -:10A89000AC01A7EAB1E4C3DF6B017C01ACEEB4EF1D -:10A8A000A5019401B8DFDC01CB018C0D9D1DAE1D0F -:10A8B000BF1DB7FF03C00197A109B04888839983E2 -:10A8C000AA83BB839F77DF91CF91FF90EF90DF90BA -:10A8D000CF90BF90AF909F908F900895B9CF82E2B4 -:10A8E00090E2B6CFA0E0B0E08093222090932320A6 -:10A8F000A0932420B09325200895FB01DC0102C021 -:10A9000005900D9241505040D8F70895FB01DC01AD -:10A910008D91059080190110D9F3990B0895FB01D1 -:10A92000DC014150504048F005900D920020C9F7DD -:10A9300001C01D9241505040E0F70895FB01DC0139 -:10A9400004C08D910190801921F441505040C8F706 -:10A95000881B990B0895FB01DC0102C001900D9248 -:10A9600041505040D8F708956817790768F4FB0103 -:10A97000DC01E40FF51FA40FB51F02C002900E9278 -:10A9800041505040D8F70895E6CFDC0101C06D93E7 -:10A9900041505040E0F70895FC018191861721F065 -:10A9A0008823D9F7992708953197CF010895FB019E -:10A9B000DC0101900D920020E1F708950F931F93A1 -:10A9C000CF93DF93CDB7DEB72E97CDBFDEBF0E8915 -:10A9D0001F89888D998D26E02C8309831A8397FF20 -:10A9E00002C080E090E801978D839E83AE01445EB3 -:10A9F0005F4F6A8D7B8DCE01019667D04D815E8160 -:10AA000057FD0AC02F813885421753070CF49A016D -:10AA1000F801E20FF31F10822E96CDBFDEBFDF914B -:10AA2000CF911F910F9108950F931F93CF93DF93B1 -:10AA3000CDB7DEB72E97CDBFDEBF0E891F89888DBB -:10AA4000998D2EE02C8309831A8397FF02C080E042 -:10AA500090E801978D839E83AE01445E5F4F6A8DBF -:10AA60007B8DCE01019631D04D815E8157FD0AC0AC -:10AA70002F813885421753070CF49A01F801E20F31 -:10AA8000F31F10822E96CDBFDEBFDF91CF911F91B5 -:10AA90000F910895CF93DF93CDB7DEB72E97CDBF3B -:10AAA000DEBF8DE08C838C899D8989839A83AE017A -:10AAB000485E5F4F6E897F89CE010196A9D32E969D -:10AAC000CDBFDEBFDF91CF9108952F923F924F927D -:10AAD0005F926F927F928F929F92AF92BF92CF922E -:10AAE000DF92EF92FF920F931F93CF93DF93CDB737 -:10AAF000DEB72B97CDBFDEBF6C017B018A01FC0165 -:10AB000016821782838181FFBFC1CE0101963C016D -:10AB1000F6019381F70193FD859193FF81917F0168 -:10AB2000882309F4ADC1853239F493FD859193FFF3 -:10AB300081917F01853221F4B60190E0E7D4E8CF1E -:10AB4000912C212C312CFFE1F315D8F08B3279F0C8 -:10AB500038F4803279F08332A1F4232D20611DC0B6 -:10AB60008D3261F0803369F4232D216016C0832D6E -:10AB70008260382EE32DE4603E2E2AC0F32DF8606B -:10AB80001DC037FC2DC020ED280F2A3040F08E323A -:10AB9000B9F436FC75C1232D2064322E19C036FE5F -:10ABA00006C08AE0989E200D1124922E11C0EAE082 -:10ABB0002E9E200D1124222EF32DF0623F2E08C070 -:10ABC0008C3621F4832D8068382E02C0883641F4FB -:10ABD000F70193FD859193FF81917F018111B3CF9F -:10ABE000982F9F7D9554933028F40C5F1F4F9FE35F -:10ABF00099830DC0833631F0833771F0833509F0C6 -:10AC000055C020C0F801808189830E5F1F4F8824C2 -:10AC10008394912C530112C02801F2E04F0E511C75 -:10AC2000F801A080B18036FE03C0692D70E002C03B -:10AC30006FEF7FEFC50121D44C018201F32DFF7727 -:10AC40003F2E15C0280122E0420E511CF801A080C1 -:10AC5000B18036FE03C0692D70E002C06FEF7FEF58 -:10AC6000C50100D44C01F32DF0683F2E820133FC66 -:10AC700019C0822D90E088169906A0F4B60180E2F2 -:10AC800090E044D42A94F5CFF50137FC859137FE46 -:10AC900081915F01B60190E039D421102A9421E01E -:10ACA000821A91088114910479F7E1C0843611F079 -:10ACB000893639F5F80137FE07C0608171818281DC -:10ACC00093810C5F1F4F08C060817181072E000CBB -:10ACD000880B990B0E5F1F4FF32DFF763F2E97FFCA -:10ACE00009C090958095709561957F4F8F4F9F4FCC -:10ACF000F0683F2E2AE030E0A3015DD4882E86184C -:10AD000044C0853731F4232D2F7EB22E2AE030E067 -:10AD100025C0932D997FB92E8F36C1F018F4883550 -:10AD200079F0AEC0803719F0883721F0A9C0E92F3B -:10AD3000E061BE2EB4FE0DC0FB2DF460BF2E09C035 -:10AD400034FE0AC0292F2660B22E06C028E030E06B -:10AD500005C020E130E002C020E132E0F801B7FE9A -:10AD600007C060817181828193810C5F1F4F06C093 -:10AD70006081718180E090E00E5F1F4FA3011BD4C2 -:10AD8000882E8618FB2DFF773F2E36FE0DC0232D13 -:10AD90002E7FA22E891458F434FE0BC032FC09C059 -:10ADA000832D8E7EA82E05C0B82CA32C03C0B82CF2 -:10ADB00001C0B92CA4FE0FC0FE01E80DF11D808179 -:10ADC000803321F49A2D997EA92E09C0A2FE06C0D7 -:10ADD000B394B39404C08A2D867809F0B394A3FC8D -:10ADE00010C0A0FE06C0B21480F4280C922C9B1850 -:10ADF0000DC0B21458F4B60180E290E087D3B3944A -:10AE0000F8CFB21418F42B1802C0982C212CA4FEF1 -:10AE10000FC0B60180E390E079D3A2FE16C0A1FC7A -:10AE200003C088E790E002C088E590E0B6010CC05E -:10AE30008A2D867851F0A1FE02C08BE201C080E22B -:10AE4000A7FC8DE2B60190E061D3891430F4B6011D -:10AE500080E390E05BD39A94F8CF8A94F301E80DF5 -:10AE6000F11D8081B60190E051D38110F6CF2220F0 -:10AE700009F44ECEB60180E290E048D32A94F7CF91 -:10AE8000F6018681978102C08FEF9FEF2B96CDBF91 -:10AE9000DEBFDF91CF911F910F91FF90EF90DF9078 -:10AEA000CF90BF90AF909F908F907F906F905F906A -:10AEB0004F903F902F90089520FD09C0FC0123FD85 -:10AEC00005C022FF02C073836283518340830895CB -:10AED00044FD17C046FD17C0AB01BC01DA01FB0100 -:10AEE000AA0FBB1FEE1FFF1F1094D1F74A0F5B1F65 -:10AEF0006E1F7F1FCB01BA01660F771F881F991F36 -:10AF000009C033E001C034E0660F771F881F991F26 -:10AF10003150D1F7620F711D811D911D08950F935E -:10AF20001F93CF93DF938C01C801B2D2EC0197FD40 -:10AF300006C085D2892BC1F7B801CE0123D3CE013B -:10AF4000DF91CF911F910F9108958F929F92AF92B1 -:10AF5000BF92EF92FF920F931F93CF93DF938C01D9 -:10AF6000D62F7A01B22E94D29C0133272B32310591 -:10AF700031F02D32310559F48B2D8068B82ED15027 -:10AF800011F480E061C0C80183D297FDFACFCB2DC8 -:10AF9000CD7F2B2D2073F9F48033E9F4AA24AA94F1 -:10AFA000AD0E09F43EC0C80173D297FD3AC09C01B2 -:10AFB0002F7D33272835310541F4C264D25089F101 -:10AFC000C80166D297FF07C02CC0B6FE02C0C2609F -:10AFD00001C0C261DA2D812C912C540120ED280F83 -:10AFE000283078F0C4FF03C0B801CCD217C02A3093 -:10AFF00040F0C6FFF9CF2F7D3FEE320F3630A0F77D -:10B0000027504C2FC501B40163DF4B015C01C260C6 -:10B01000D15051F0C8013CD297FFE0CFC1FD04C030 -:10B02000B0CF812C912C5401C7FF08C0B094A094DC -:10B0300090948094811C911CA11CB11C2C2FB501F3 -:10B04000A401C70139DF81E0DF91CF911F910F91FA -:10B05000FF90EF90BF90AF909F908F9008955F9278 -:10B060006F927F928F929F92AF92BF92CF92DF9218 -:10B07000EF92FF920F931F93CF93DF93CDB7DEB77D -:10B08000A097CDBFDEBF5C01962E7A01F9018E013B -:10B090000F5F1F4F680180E2D8011D928A95E9F782 -:10B0A000D50113968C9080E090E0612C712C30E0FB -:10B0B00061E070E083FC259183FE21918F01522E87 -:10B0C000211103C080E090E090C02E3511F400976C -:10B0D00051F1432F50E0481759073CF42D3559F1F1 -:10B0E0002D3219F4772009F103C0772009F468C0E4 -:10B0F000452D469546954695D601A40FB11D452D83 -:10B1000047708B0102C0000F111F4A95E2F7A8019A -:10B110005C91452B4C93651459F0561410F45394DC -:10B12000E7CF5A94E5CF31E004C07724739401C08F -:10B13000712C0196BFCF772019F08E8180628E83AB -:10B14000311103C08824839417C0F6019E012F5D3E -:10B150003F4F8081809581932E173F07D1F7F2CF23 -:10B16000E114F10429F0D7018C93F70131967F01A6 -:10B170009A94812C9920E9F0C5018AD197FD17C0D6 -:10B18000FC01FF2723E0F595E7952A95E1F7EC0D03 -:10B19000FD1D208130E0AC014770552702C0359578 -:10B1A00027954A95E2F720FDDBCFB501EBD1811061 -:10B1B00089CFE114F10411F0D7011C92C80115C028 -:10B1C000422F469546954695D601A40FB11D422FB4 -:10B1D00047708B0102C0000F111F4A95E2F7A801CA -:10B1E0005C91452B4C93622EA4CFA096CDBFDEBFC1 -:10B1F000DF91CF911F910F91FF90EF90DF90CF9053 -:10B20000BF90AF909F908F907F906F905F900895C8 -:10B210005F926F927F928F929F92AF92BF92CF92E6 -:10B22000DF92EF92FF920F931F93CF93DF936C0106 -:10B23000EB015A01FC0116821782512CF601E380C2 -:10B24000FE01E3FC8591E3FE8191182FEF01882335 -:10B2500009F4E0C090E0F3D0892B19F0C6015FDE5D -:10B26000EDCF153241F4FE01E3FC1591E3FE11919F -:10B27000EF01153271F4C6010BD197FDC9C0412F02 -:10B2800050E09C01332724173507C1F2B6017AD16B -:10B29000C1C01A3239F4E3FC1591E3FE1191EF01BC -:10B2A00001E001C000E0F12C20ED210F2A3078F4FC -:10B2B00002606F2D70E080E090E040E209DEF62E43 -:10B2C000FE01E3FC1591E3FE1191EF01EDCF01FFCB -:10B2D00003C0F11003C09EC0FF24FA94183619F081 -:10B2E0001C3651F010C0FE01E3FC1591E3FE1191F4 -:10B2F000EF01183641F408600460FE01E3FC15918B -:10B30000E3FE1191EF01112309F484C0612F70E075 -:10B310008CEF91E09CD0892B09F47CC000FD07C024 -:10B32000F50180809180C50102965C0102C0812CEC -:10B33000912C1E3649F4F6014681578160E070E099 -:10B34000202FC401B9DD7ACF1336A1F401FD02C06C -:10B35000FF24F394C6019CD097FD5AC08114910438 -:10B3600029F0F4018083C40101964C01FA94F11094 -:10B37000F1CF4AC01B3551F49E01A4016F2DC601C7 -:10B380006EDEEC01892B09F03FC039C0C601C7DD74 -:10B3900097FD3EC01F3649F128F4143621F11936C5 -:10B3A00039F125C0133771F01537E9F020C0811449 -:10B3B000910429F0F4016082C40101964C01FA94D1 -:10B3C000FF2059F0C60164D03C0197FD06C037D07C -:10B3D000892B69F3B601C301D5D081149104A1F082 -:10B3E000F401108211C0006203C0006101C000645A -:10B3F000202FA4016F2DC601A8DD811105C0F60123 -:10B400008381807329F406C000FD18CF539416CFB2 -:10B41000552019F0852D90E002C08FEF9FEFDF914E -:10B42000CF911F910F91FF90EF90DF90CF90BF9041 -:10B43000AF909F908F907F906F905F900895911143 -:10B4400018C1803219F089508550D0F70895FC0159 -:10B450000590061621F00020D9F7C0010895319714 -:10B46000CF010895FC010590615070400110D8F79C -:10B47000809590958E0F9F1F0895FC01615070403C -:10B4800001900110D8F7809590958E0F9F1F089519 -:10B49000CF93DF93EC012B8120FF33C026FF0AC03E -:10B4A0002F7B2B838E819F8101968E839F838A8140 -:10B4B00090E029C022FF0FC0E881F9818081082E29 -:10B4C000000C990B009719F420622B831AC0319657 -:10B4D000E883F9830EC0EA85FB85199597FF09C0BB -:10B4E0002B81019611F080E201C080E1822B8B83D9 -:10B4F00008C02E813F812F5F3F4F2E833F839927C6 -:10B5000002C08FEF9FEFDF91CF9108950F931F93AC -:10B51000CF93DF93FB01238121FD03C08FEF9FEFCA -:10B520002CC022FF16C046815781248135814217E5 -:10B53000530744F4A081B1819D012F5F3F4F2083C9 -:10B5400031838C93268137812F5F3F4F268337834A -:10B5500014C08B01EC01FB010084F185E02D1995ED -:10B56000892BE1F6D80116968D919C91179701963B -:10B5700016968D939C931797CE01DF91CF911F91D3 -:10B580000F910895FB01238120FF12C026FD10C0FA -:10B590008F3F3FEF930761F082832F7D20642383E9 -:10B5A00026813781215031092683378399270895D1 -:10B5B0008FEF9FEF0895FA01AA27283051F120312B -:10B5C00081F1E8946F936E7F6E5F7F4F8F4F9F4F37 -:10B5D000AF4FB1E03ED0B4E03CD0670F781F891F79 -:10B5E0009A1FA11D680F791F8A1F911DA11D6A0F47 -:10B5F000711D811D911DA11D20D009F468943F91FA -:10B600002AE0269F11243019305D3193DEF6CF01F8 -:10B610000895462F4770405D4193B3E00FD0C9F7BE -:10B62000F6CF462F4F70405D4A3318F0495D31FD2B -:10B630004052419302D0A9F7EACFB4E0A69597957E -:10B64000879577956795BA95C9F700976105710554 -:10B6500008959B01AC010A2E06945795479537959E -:10B660002795BA95C9F7620F731F841F951FA01DF8 -:10B67000089599278827089503D0808199270895F0 -:10B68000E0ECF1E0378537FDFDCF34853860348755 -:10B69000FC01E050F04F0895262FF2DF00800216E3 -:10B6A00011F008D00197019708950196272FF5DF33 -:10B6B000F3CF262FE0ECF1E0378537FDFDCF348561 -:10B6C000377F3487378531FF09C036E3328738ED5D -:10B6D00034BF31E03387378537FDFDCF33E3328721 -:10B6E000808391831282248325E3228728ED31E031 -:10B6F00024BF338701960895052E97FB16F4009416 -:10B700000FD057FD05D014D007FC02D046F408C076 -:10B7100050954095309521953F4F4F4F5F4F08957D -:10B7200090958095709561957F4F8F4F9F4F0895AD -:10B73000A1E21A2EAA1BBB1BFD010DC0AA1FBB1F35 -:10B74000EE1FFF1FA217B307E407F50720F0A21BA7 -:10B75000B30BE40BF50B661F771F881F991F1A9414 -:10B7600069F760957095809590959B01AC01BD013E -:08B77000CF010895F894FFCF0A -:10B7780002400F008310000001041000000182083D -:10B78800000001000000000000000000000090011F -:10B79800010001000000000000009C24A324A32451 -:10B7A800AF24BB24C524E224F02419251C25202518 -:10B7B8003E000426140004043E00042E040C040475 -:10B7C8000008000800000000000000080008080841 -:10B7D8000808080008000800000008080008080811 -:10B7E8000080008000000000000000800080808051 -:10B7F8008080800080008000000080800080808041 -:10B80800000100010000000000000001000101012A -:10B818000101010001000100000001010001010116 -:10B828000000000000000000000000000000000010 -:10B8380001010101010101010101010101010101F0 -:10B8480001010101010101010101010101010101E0 -:10B8580001010101010101010101010101010101D0 -:10B8680000000000000000000000000000000000D0 -:10B8780000000000000000000000000000000000C0 -:10B8880000000000000000000000000000000000B0 -:10B898000101010101010101010101010101010190 -:10B8A8000000000000000000000000000000000090 -:10B8B8000000000000000000000000000000000080 -:10B8C8000101010101010101010101010101010160 -:10B8D8000000000000000000000000000000000060 -:10B8E8000101010101010101010101010101010140 -:10B8F8000101010101010101010101010101010130 -:10B90800000000000000000000000000000000002F -:10B91800010101010101010101010101010101010F -:10B9280000000002020000020002020202000002FF -:10B9380000000002020000020002020202000002EF -:10B9480000000002020000020002020202000002DF -:10B95800040404060604040604060606060404068F -:10B96800040404060604040604060606060404067F -:10B9780000000002020000020002020202000002AF -:10B98800000000020200000200020202020000029F -:10B99800040404060604040604060606060404064F -:10B9A800000000020200000200020202020000027F -:10B9B800040404060604040604060606060404062F -:10B9C800040404060604040604060606060404061F -:10B9D800040404060604040604060606060404060F -:10B9E80004040406060404060406060606040406FF -:10B9F800000000020200000200020202020000022F -:10BA0800000000020200000200020202020000021E -:10BA180004040406060404060406060606040406CE -:10BA280000080808000000080000080008080008CE -:10BA380000080808000000080000080008080008BE -:10BA480000080808000000080000080008080008AE -:10BA5800101818181010101810101810181810189E -:10BA6800101818181010101810101810181810188E -:10BA7800000808080000000800000800080800087E -:10BA8800000808080000000800000800080800086E -:10BA9800101818181010101810101810181810185E -:10BAA800000808080000000800000800080800084E -:10BAB800101818181010101810101810181810183E -:10BAC800101818181010101810101810181810182E -:10BAD800101818181010101810101810181810181E -:10BAE800101818181010101810101810181810180E -:10BAF80000080808000000080000080008080008FE -:10BB080000080808000000080000080008080008ED -:10BB180010181818101010181010181018181018DD -:10BB2800546F6F206D616E7920646174612E000D11 -:10BB38000A000D0A504152495459204552524F5259 -:10BB4800000D0A504152495459204F4B0025347575 -:10BB58003A200025337500556E6B6E6F776E206343 -:10BB680061726420747970652E002573206F7220CD -:0ABB7800004E4F20444154410000EC +:1015D0000047656D706C757300000000000000002E +:1015E000004D50434F530000000000000000000079 +:1015F00000000000000000000000000000000000EB +:1016000000000000000000000000000000000000DA +:1016100000000000000000000000000000000000CA +:1016200000000C01000000000000000000000000AD +:101630000000000000000000496E6E6F766973695B +:101640006F6E2052265400004A6577656C000000DA +:10165000000000000000000000000000000000008A +:10166000000000000000000000000000000000007A +:10167000000000000000000000000000000000006A +:10168000000000000000000002000138010000001E +:101690000000000000000000000000000000004EFC +:1016A0006F6B696100000000000000000000004D49 +:1016B000494641524520436C617373696320346B22 +:1016C000202D20656D756C6174656420283632317B +:1016D0003220436C617373696329000000000000CD +:1016E00000000000000000000000000000000008F2 +:1016F00000013801000000000000000000000000B0 +:101700000000000000004E6F6B69610000000000E7 +:101710000000000000004D494641524520436C61E5 +:101720007373696320346B202D20656D756C617453 +:101730006564202836313331204E464329000000AD +:101740000000000000000000000000000000000099 +:1017500000000000000011241FBECFEFCDBFDFE36B +:10176000DEBF00E00CBF18BE19BE1ABE1BBE14E2DD +:10177000A0E0B0E2E8E6FAEB00E00BBF02C00790A1 +:101780000D92A235B107D9F71BBE25E3A2E5B4E25D +:1017900001C01D92A03AB207E1F77ED00C94325DF1 +:1017A00068C13BB78BBFFB01879196913BBF089502 +:1017B0003BB78BBFCB0142E20D94F00F3BB70B015F +:1017C00043E20D94F00F3BB78BBFCB0145E20D9484 +:1017D000F00F3BB746E208C02091CF0127FDFCCFB8 +:1017E00022272093CA0108954093CA0128ED31E0D1 +:1017F000209334003093CB016091C4017091C501F6 +:101800008091C60199270895FC014093CA018491F3 +:1018100008950F9200240F932F933F934F935F935C +:101820000FB70F93EF93FF93EAB1FBB151914427A8 +:1018300035B124B1569578F400928C0800920008D6 +:1018400006E10A95F1F700C001E00093000803E00B +:1018500000938C0804C00AE10A95F1F700002150BA +:10186000304019F40E94A0270CC04F5F477011F45C +:10187000519102C000C000C00AE00A95F1F700C013 +:10188000D9CFFF91EF910F910FBF5F914F913F9192 +:101890002F910F910F9018950ED10E9406170E945C +:1018A000A217A8D21092520684E08093420682E6E4 +:1018B00080938601C1E0C0932606C093210686E08E +:1018C00080932206C093310602E000933206109204 +:1018D0002A0613E01093290689E5809380018AE5A2 +:1018E0008093810180E48093410680934606909125 +:1018F000B200907F9093B2009091B200926090936A +:10190000B20090E390934106909346068093500670 +:10191000C0934606009345061093410683E18093E9 +:10192000010821E030E02093260830932708209317 +:1019300028083093290810928C0880938008109210 +:10194000230310922103D8E0D093220381E18093F6 +:101950002003E091B12EF091B22E82859385809381 +:101960003803909339038CE380938203D0938003F0 +:1019700080938303D093810366D10E944419B7D129 +:1019800017D7C09300021092010200930202109335 +:101990000402C0932002D09321020E94991517D10E +:1019A000D2E0C1E18091030481FF25C08091010450 +:1019B00080FDFCCFD09303040E94A617AED10E94F5 +:1019C0007719FED60E940117E091A22EF091A32E66 +:1019D00019950E948C220E94E318E091B12EF0919B +:1019E000B22E8781813011F4C0935B2C86818130C7 +:1019F00011F4C0935A2C0E9448199CD7E091A02E54 +:101A0000F091A12E1995E0919A2EF0919B2E1995A7 +:101A1000C9CF292F33272230310559F02330310522 +:101A200069F021303105E9F482E190E026E932E005 +:101A30001CC08EE390E028E532E017C09927813082 +:101A4000910549F028F0029761F4E8E0F2E005C062 +:101A5000E4E5F2E002C0E8E2F2E0849190E09F0168 +:101A600004C080E090E020E030E0FA012083318380 +:101A700008951F920F920FB60F92112408B60F927D +:101A800018BEFFCF1F920F920FB60F92112408B607 +:101A90000F9218BE8F939F938EB19FB180589F4F26 +:101AA0008EB99FB99F918F910F9008BE0F900FBE76 +:101AB0000F901F9018958091780083FF0AC088E0EE +:101AC0008093780088ED84BF81E0809380000D943E +:101AD000FE008BEC809352008091500088608093D0 +:101AE00050008091510083FFFCCF82EC8093550021 +:101AF000809150008061809350008091510084FF5C +:101B0000FCCF88ED84BF84E0809340001EB81FB8EE +:101B100081E0809343002FE730E020930A04309364 +:101B20000B0420930C0430930D04809300048093E5 +:101B3000020480E880930001089588ED84BF81E06D +:101B400080937900089588ED84BF8BE180938000B5 +:101B500008958091500082608093500080915100E0 +:101B600081FFFCCF82E08093CA01EDE1F0E0E491D7 +:101B7000E0936200ECE1F0E0E491E0936300109206 +:101B8000CA0180E8809365008BEB809366008091AA +:101B90005600897F80935600809156008460809320 +:101BA0005600809160008160809360000895E0E4B9 +:101BB000F0E084818E7F8483E0E6F0E080818E7F98 +:101BC0008083E0E5F0E080818D7F8083089587E069 +:101BD0008093A20078940895089580E090E008959D +:101BE000089508950895089508950895089508950D +:101BF0000F931F93CF93C82F06E91EE2D8011296C8 +:101C0000ED91FC91139719950E94C422E091B12E99 +:101C1000F091B22EC583B8E1CB9FB0011124685575 +:101C20007D4F48E150E0C8010E94F555D801ED9183 +:101C3000FC911995D8011696ED91FC911797CF91CB +:101C40001F910F91199448E150E068EA72E086E92B +:101C50009EE20E94F555E091B12EF091B22E858161 +:101C6000C7CF0F931F93E091B12EF091B22E8B014D +:101C70009C0145816AE088E993E00E947F181F91EA +:101C80000F910895FF920F931F93CF93DF931F92AD +:101C9000CDB7DEB78C019E012F5F3F4FAC016AE0EC +:101CA00088E993E00E949718F82E882389F08981AB +:101CB0009FDFF80140E08191882319F04F5F4F3199 +:101CC000D1F7E091AE2EF091AF2EB80181E11995D8 +:101CD0008F2D0F90DF91CF911F910F91FF9008955D +:101CE0009B01AC016AE088E993E00C94BE1808956A +:101CF0000C94E75508950F931F93CF938C01C62F33 +:101D0000CC2339F00E94E755F80181938F01C1502F +:101D1000F7CFCF911F910F9108950E94E7550E9430 +:101D2000E7550E94E7550C94E755CF93DF93EC01FC +:101D300061507109DA01420F531FFC01CF018C1B66 +:101D40009D0BA417B50721F41082DF91CF91089560 +:101D500062307105C8F39D91392F32953F703A304A +:101D600010F4305D01C0395C30839F709A3010F4FC +:101D7000905D01C0995C9183329662507109DECF0B +:101D8000CF93DF93EC01DA0120E030E05C91552342 +:101D900051F111969C911197992339F12617370724 +:101DA00011F180ED850F8A3020F08FEB850F8630A2 +:101DB000E0F480ED890F8A3020F04FEB490F463078 +:101DC000A0F4E52FF0E0513408F0F797E295E07FBA +:101DD000913410F4982F01C097539E2B99932F5F45 +:101DE0003F4F1296D3CFC90102C080E090E0DF914F +:101DF000CF910895E0E6F6E080E1858382E0868376 +:101E000088E085838AE18183E0EAF9E0168217821F +:101E100080EC858388E18483E0E0F1E0128A8BE640 +:101E2000838B148A158A20EA208F99E0918F128E75 +:101E3000148E158E168E84E0808B12A23CE633A39E +:101E400014A215A210A611A612A624A795A716A63D +:101E500080A308954115510509F449C020E120935C +:101E6000660623E02093A0092091A10927FFFCCF5B +:101E70002091A0097093A0092091A10927FFFCCF10 +:101E80002091A0096093A0092091A10927FFFCCF10 +:101E90002091A00921E02093120180931C019093CE +:101EA0001D0140931401509315011092220182E507 +:101EB00094E2809328019093290140932401509348 +:101EC000250180911001806880931001809120018C +:101ED0008068809320018091100187FDFCCF80E312 +:101EE000809311018093210180E18093650608951C +:101EF0004115510509F469C020E12093660626E0EA +:101F00002093A0092091A10927FFFCCF2091A009CF +:101F100020E120936506000000002093660622E081 +:101F20002093A0092091A10927FFFCCF2091A009AF +:101F30007093A0092091A10927FFFCCF2091A0094F +:101F40006093A0092091A10927FFFCCF2091A0094F +:101F50001092120122E534E220931C0130931D01FE +:101F6000409314015093150120E1209322018093A6 +:101F700028019093290140932401509325018091D9 +:101F80001001806880931001809120018068809307 +:101F900020018091100187FDFCCF80E38093110127 +:101FA0008093210180E180936506E091B12EF0914C +:101FB000B22E8781863019F481E180935B2C868173 +:101FC000863019F481E180935A2C0895CF92DF92E4 +:101FD000EF92FF92CF93DF93C090B02ED12CE12CE3 +:101FE000F12C8DE0CC0CDD1CEE1CFF1C8A95D1F78A +:101FF000C114D10481E0E806F10408F04EC080E18C +:102000008093660686E08093A0098091A10987FFEE +:10201000FCCF8091A00980E180936506000000005C +:102020008093660682E08093A0098091A10987FFD2 +:10203000FCCF8091A0091092A0098091A10987FF8F +:10204000FCCF8091A0091092A0098091A10987FF7F +:10205000FCCF8FEFE81AF80A8091A009C0E0D0E128 +:10206000C701B6019EDB8093A0098091A10987FF7B +:10207000FCCF8091A0099093A0098091A10987FFCE +:10208000FCCF8091A00982E0C80ED11CE11CF11C9C +:10209000219731F780E1809365068091010480FDEE +:1020A000FCCF82E080930304DF91CF91FF90EF900B +:1020B000DF90CF900895CF92DF92EF92FF92CF936F +:1020C000DF93C090B02ED12CE12CF12C8DE0CC0C04 +:1020D000DD1CEE1CFF1C8A95D1F7C114D10481E0F0 +:1020E000E806F10438F0DF91CF91FF90EF90DF9098 +:1020F000CF906CCF8FEFE81AF80AC1E2D0E02197B9 +:1021000091F36ADBC701B60153DB66DB8FEFD81AA8 +:10211000E80AF80AF4CFCF92DF92EF92FF920F9382 +:102120001F93CF93DF93C090B02ED12CE12CF12CD4 +:102130008DE0CC0CDD1CEE1CFF1C8A95D1F7C11480 +:10214000D10481E0E806F10408F04FC080E18093FB +:10215000660683E08093A0098091A10987FFFCCFE8 +:102160008091A0091092A0098091A10987FFFCCF5E +:102170008091A0091092A0098091A10987FFFCCF4E +:102180008FEFE81AF80A8091A00901E210E00150EF +:10219000110941F121DB1DDB1FDBC0E0D0E0109213 +:1021A000A0098091A10987FFFCCF6091A00970E090 +:1021B0001092A0098091A10987FFFCCF8091A0090E +:1021C000782BCE01FBDA08DB2296C11581E0D80717 +:1021D00031F7C701B601F7DAFFDA8FEFD81AE80A4C +:1021E000F80AD5CF80E180936506E091B12EF09199 +:1021F000B22E8781863019F490E190935B2C968102 +:10220000963049F420E120935A2C853059F483E12B +:1022100080935B2C02C08530D1F3953019F483E1B3 +:1022200080935A2C8091010480FDFCCF82E0809342 +:102230000304DF91CF911F910F91FF90EF90DF90FA +:10224000CF900895CF92DF92EF92FF920F931F935A +:102250004115E0E25E076105710508F06BC0690198 +:10226000E12CF12C00E010E220E030E0041B150B23 +:10227000260B370BC016D106E206F30610F49701C1 +:10228000860120E12093660626E02093A009209194 +:10229000A10927FFFCCF2091A00920E1209365062A +:1022A000000000002093660622E02093A009209100 +:1022B000A10927FFFCCF2091A0095093A0092091EC +:1022C000A10927FFFCCF2091A0094093A0092091EC +:1022D000A10927FFFCCF2091A0091092120122E54D +:1022E00034E220931C0130931D01009314011093DC +:1022F000150120E120932201809328019093290168 +:10230000009324011093250180911001806880932F +:10231000100180912001806880932001809110013C +:1023200087FDFCCF80E3809311018093210180E140 +:102330008093650681E01F910F91FF90EF90DF90F1 +:10234000CF900895CF92DF92EF92FF920F931F9359 +:102350004115E0E25E076105710508F05DC06901A5 +:10236000E12CF12C00E010E220E030E0041B150B22 +:10237000260B370BC016D106E206F30610F49701C0 +:10238000860120E12093660623E02093A009209196 +:10239000A10927FFFCCF2091A0095093A00920910B +:1023A000A10927FFFCCF2091A0094093A00920910B +:1023B000A10927FFFCCF2091A00921E02093120161 +:1023C00080931C0190931D0100931401109315013B +:1023D0001092220182E594E28093280190932901D2 +:1023E000009324011093250180911001806880934F +:1023F000100180912001806880932001809110015C +:1024000087FDFCCF80E3809311018093210180E15F +:102410008093650681E001C080E01F910F91FF90DD +:10242000EF90DF90CF9008958091CF0187FDFCCF92 +:102430000895FADF8091CF0181FF0BC086E380937E +:10244000CA01EBECF1E021E030E088ED90E084BFE0 +:1024500020830895EF92FF920F931F93CF93DF9302 +:10246000EC017B018A011092C201DEDFD701CE01AF +:10247000800F911F26E048ED50E061E070E0EBEC4A +:10248000F1E0C817D90779F0C093C0013D2F3F7123 +:102490003093C1012093CA0144BF60833091C401CD +:1024A0003D932196EECFC801DF91CF911F910F91FF +:1024B000FF90EF9008953F924F925F926F927F92BC +:1024C0008F929F92AF92BF92CF92DF92EF92FF9244 +:1024D0000F931F93CF93DF938B01542E652E282FDC +:1024E0002F71722EEC01C21BD109A3DF9DDF83E3A4 +:1024F0008093CA011092C1011092C2017801052D8A +:10250000162D85E3482E98EDC92ED12C882483946E +:10251000912C3BECA32EBB24B39443E3342E011542 +:10252000110501F17092C001F70181917F01809343 +:10253000C4010150110921F07394F0E27F12EFCF32 +:10254000C093C0018D2F8F718093C1014092CA0149 +:10255000C601F50184BF8082A09666DF3092CA0171 +:10256000712CDDCF852D962DDF91CF911F910F918D +:10257000FF90EF90DF90CF90BF90AF909F908F90A3 +:102580007F906F905F904F903F9008951F93CF93EF +:10259000DF93CDB7DEB7A097CDBFDEBF863009F49D +:1025A000EAC0D0F4833009F46AC028F4813059F1CC +:1025B0008230C9F1F6C0843009F486C0853009F054 +:1025C000F0C0E091A62EF091A72ECE0101961995AC +:1025D0008091AC2E41E0A4C0893009F4D0C040F411 +:1025E000873009F4CAC0883009F0DBC0EFDCD9C0FD +:1025F0008A3009F4D5C08B3009F0D3C08EEA93E25B +:102600000E94C221CEC010E08091AC2E181708F0B5 +:102610009FC06EDBE1E0F0E0EC0FFD1FE10FF11D6C +:1026200080831F5FF1CF11E08091AC2E873009F0DD +:1026300010E0E091A62EF091A72ECE0101961995FB +:102640004091AC2E31E0141708F082C03323A9F07A +:10265000812F90E0E1E0F0E0EC0FFD1FE80FF91FA3 +:10266000208131E02F3F09F030E0E1E0F0E0EC0FB5 +:10267000FD1FE80FF91F2F5F20831F5FE4CFE0915C +:10268000A62EF091A72ECE01019619958091AC2E21 +:1026900041E0815008F45CC04423D9F3282F30E096 +:1026A000E1E0F0E0EC0FFD1FE20FF31F908141E04D +:1026B0009F3F09F040E0E1E0F0E0EC0FFD1FE20F8A +:1026C000F31F9F5F9083E5CF11E08091AC2E8730A0 +:1026D00009F010E0E091A62EF091A72ECE01019610 +:1026E00019954091AC2E31E0141790F53323A1F0E9 +:1026F000812F90E0E1E0F0E0EC0FFD1FE80FF91F03 +:10270000208131E0211130E0E1E0F0E0EC0FFD1F2D +:10271000E80FF91F215020831F5FE6CF411103C04E +:102720008150E0F715C0282F30E0E1E0F0E0EC0F39 +:10273000FD1FE20FF31F908141E0911140E0E1E0C5 +:10274000F0E0EC0FFD1FE20FF31F91509083E8CFF4 +:10275000E091A82EF091A92ECE0101961995E09155 +:10276000AE2EF091AF2E4091AC2EBE016F5F7F4F29 +:1027700083E1199516C0B0D314C0CDDC12C080918E +:102780000008813021F490918C08933009F080E0AA +:1027900080FD03C00E944E2304C00E94742301C028 +:1027A000AAD2A096CDBFDEBFDF91CF911F91089531 +:1027B000E0E0F6E080E6828388E1868B858B0895F1 +:1027C000CF93C0910806C095C6FF12C080915424D3 +:1027D0008A3050F08A30E1F4E091B12EF091B22EBF +:1027E0008181D4DE809154248F5F8093542410C063 +:1027F0008C2F807669F48091542481508A3030F493 +:10280000E091B12EF091B22E8081C0DE109254245E +:10281000C5FF12C0809153248A3050F08A30D9F419 +:10282000E091B12EF091B22E8381B0DE80915324DD +:102830008F5F809353240FC0C07669F48091532436 +:1028400081508A3030F4E091B12EF091B22E828125 +:102850009DDE10925324CF9108959B01AC016CE052 +:1028600082EE96E08BC4E82FF0E0E055F14D88E071 +:10287000638381503C968111FBCF08950F931F9382 +:102880009B01E091B12EF091B22EE80FF11D8A016B +:1028900040816CE082EE96E032D41F910F91089552 +:1028A0000F931F93CF93DF931F92CDB7DEB7082FFF +:1028B000AB019E012F5F3F4F6CE082EE96E037D474 +:1028C000182F882319F06981802FCDDF812F0F9079 +:1028D000DF91CF911F910F9108950895EF92FF928C +:1028E0000F931F93CF937B01C42F0EB11FB1209183 +:1028F000080430910904022B132B682F83E090E227 +:102900000E94F7536C2F83E090E20E94F753612FEF +:1029100083E090E20E94F753602F83E090E20E94F0 +:10292000F7536C2F70E0C701CF911F910F91FF906B +:10293000EF90A4C408953F924F925F926F927F925E +:102940008F929F92AF92BF92CF92DF92EF92FF92BF +:102950000F931F93CF93DF937C01E901C090002078 +:10296000D0900120960122503843C901A0E0B0E088 +:10297000481759076A077B0708F05FC0E2E0CE1AE4 +:10298000E0E4DE0A2A013B014C0E5D1E611C711C55 +:10299000481659066A067B0648F0241B350B8E0143 +:1029A000021B130BE9013324339403C000E010E051 +:1029B000312C4601A12CB12C481559056A057B051F +:1029C00010F5CA018E5F9F4B2A013B014C0E5D1E24 +:1029D000611C711C481459046A047B0428F4AE017C +:1029E000BC01C70137DA18C0C41AD50AA601BC0158 +:1029F000C70130DAAE014C195D096AE574E2C7011E +:102A00008C0D9D1D07C04C195D09BA01665A7B4D9E +:102A1000AE01C7010E942356332041F00C0F1D1F49 +:102A2000F701E00FF11FCE0DDF1D02C081E006C0EF +:102A3000EC17FD07D9F31292FBCF80E0DF91CF9125 +:102A40001F910F91FF90EF90DF90CF90BF90AF90CC +:102A50009F908F907F906F905F904F903F900895E0 +:102A6000209156243091572480E098E0821B930BEC +:102A7000EAE5F4E29F012A5534422817390710F499 +:102A80001192F8CF8AE594E28093582490935924C8 +:102A900080E098E0809356249093572482E090E45D +:102AA000809300209093012042E050E060E070E4C9 +:102AB00080E090E21DDAE091B12EF091B22E878194 +:102AC0008A3019F480E180935B2C86818A3019F476 +:102AD00080E180935A2C0895809156249091572438 +:102AE00090582091002030910120821B930B089573 +:102AF000E0EBFEE287833C969FE2E031F907D1F7F5 +:102B0000813049F018F0823059F008951092552420 +:102B10008DE694E109C08093552484EF95E104C0CB +:102B2000109255248EE694E18093AE2E9093AF2EB2 +:102B300008950F931F93CF93DF931F92CDB7DEB706 +:102B4000E091B12EF091B22E8481D2DF8AE594E239 +:102B5000809358249093592400E018E00093562461 +:102B60001093572441E050E0BE016F5F7F4F80E03B +:102B700090E070DCE0915824F0915924DF01C80105 +:102B80001D920197E9F78981882341F042E050E0E6 +:102B900060E070E480E090E25DD917C082E090E4EC +:102BA000809300209093012042E050E060E070E4C8 +:102BB00080E090E29DD981E0898341E050E0BE0150 +:102BC0006F5F7F4F80E090E076DCE091AE2EF09179 +:102BD000AF2E40E060E070E08FEF19950F90DF912D +:102BE000CF911F910F9108950F931F93CF93DF9370 +:102BF000CEB1DFB1A0910804B09109042091562410 +:102C000030915724E42FF0E08F010C5F1F4F201705 +:102C1000310758F1CA2BDB2B245031092E1B3F0BF7 +:102C20002093562430935724A0915824B0915924CE +:102C30008C9311964C9311971296DC931297CD01B9 +:102C4000049680935824909359241396CC93DB01D7 +:102C5000EC01415018F02D912993FBCFE80FF91F9B +:102C6000E0935824F093592412C080E041DFE091B2 +:102C7000B12EF091B22E87818A3019F481E18093D0 +:102C80005B2C86818A3019F481E180935A2CDF9184 +:102C9000CF911F910F9108951F93CF93DF931F92B0 +:102CA000CDB7DEB79E012F5F3F4FAC0163E08EE6EC +:102CB00098E03DD2182F882311F0898119DF812FE8 +:102CC0000F90DF91CF911F9108950F931F93E09183 +:102CD000B12EF091B22E8B019C01448163E08EE60F +:102CE00098E00DD21F910F9108959B01AC0163E014 +:102CF0008EE698E043C20F931F93CF93DF938091AA +:102D0000562490915724811528E0920708F074C04A +:102D10006091002070910120C0E0D0E8C61BD70B65 +:102D200000E018E0A801481B590BC417D50758F15B +:102D30008AE594E2DDD82091562430915724809181 +:102D4000002090910120985F821B930B80930020BC +:102D500090930120021B130BEAE5F4E2CF018A55A0 +:102D600094428017910710F41192F8CF8AE594E20B +:102D7000809358249093592480E098E080935624BF +:102D8000909357242EC02097B9F1AE018AE594E2C2 +:102D9000AFD8A8014C1B5D0BBE01665A7B4D8AE57E +:102DA00094E20E942C5680915824909159248C1BB7 +:102DB0009D0B809358249093592480915624909190 +:102DC00057248C0F9D1F80935624909357248091F5 +:102DD000002090910120C80FD91FC0930020D093EC +:102DE000012042E050E060E070E480E090E2DF919A +:102DF000CF911F910F917CC8DF91CF911F910F91BF +:102E0000089580915524811176CF089543E650E0CE +:102E100060EB7EE281E090E01DCB43E650E060EBAA +:102E20007EE281E090E047CB0F931F93CF93DF9337 +:102E3000CFEFC80FC83008F047C0D82F0E94C42277 +:102E40008091B02EC81779F166D9C093B02E8CE06E +:102E5000C89F90011124C9018D54914D8093B12ECA +:102E60009093B22EF901E055F14D80850E94F80D46 +:102E7000E091B12EF091B22E84813ADEA7D801E024 +:102E800010E0005B1E426091B02EC8018055914D4C +:102E90000E94C45C6091B12E7091B22EC8018F5413 +:102EA000914D0E94CD5C8FE18D0FE091B12EF0919C +:102EB000B22E9781943011F480935B2C96819430DC +:102EC00029F480935A2C02C080E001C081E0DF9198 +:102ED000CF911F910F9108958091B02E99E04CE011 +:102EE000915099F0282F30E02F5F3F4F2770332704 +:102EF000822F429FF001439FF00D1124E055F14DC8 +:102F00002085222369F38F5F8FCF0895FC01909174 +:102F1000B02E9F5C908311820895CF93FC01218194 +:102F200021110DC0BC01C081E091AE2EF091AF2EF9 +:102F300041E082E1199580ED8C0FCF9175CF80E053 +:102F4000CF91089588E180930106089580915A2CCD +:102F5000823191F030F48031B9F050F48823A9F136 +:102F600032C0833169F090EE980F983088F02BC012 +:102F700088E08093050627C088E08093070623C079 +:102F80008091040683FF12C088E0809306061BC070 +:102F900090915C2C9F5F913019F090935C2C15C040 +:102FA00010925C2C9091040693FD04C088E08093FD +:102FB00005060BC098E090930606803221F0815000 +:102FC00080935A2C02C010925A2C80915B2C823133 +:102FD00091F030F48031C1F050F48823A9F132C06F +:102FE000833169F090EE980F983088F02BC080E123 +:102FF0008093050627C080E18093070623C0809157 +:10300000040684FF12C080E1809306061BC09091E5 +:103010005D2C9F5F913019F090935D2C0895109274 +:103020005D2C9091040694FD04C080E18093050618 +:10303000089590E190930606803221F081508093AC +:103040005B2C089510925B2C08959B01AC016BE002 +:1030500081ED98E093C0E0EBFEE298E0282F20712C +:103060008870211162878111618791503C9691117E +:10307000F8CF222329F090E19093060610925B2C62 +:10308000882329F088E08093060610925A2C089530 +:103090000F931F939B018A01803131F4E091B12E8F +:1030A000F091B22E478107C0883049F4E091B12EEB +:1030B000F091B22E46816BE081ED98E020D01F9117 +:1030C0000F9108950F931F93CF93DF931F92CDB766 +:1030D000DEB7082FAB019E012F5F3F4F6BE081ED04 +:1030E00098E025D0182F882319F06981802FB3DF4D +:1030F000812F0F90DF91CF911F910F9108950F9322 +:103100001F93FC01662379F094916150941309C0D8 +:10311000BF016F5F7F4FA801C9010E94075681E080 +:1031200003C0B196EFCF80E01F910F910895CF9229 +:10313000DF92EF92FF921F93CF93DF93EC017A011E +:103140006901162F112389F0BE016F5F7F4FC70100 +:103150000E94FE551150892B31F4FE01C491F601F5 +:10316000C08381E003C0A196EDCF80E0DF91CF91D5 +:103170001F91FF90EF90DF90CF900895CF9301962D +:10318000CCE26623D1F0FC01DA01AD017491772322 +:1031900041F021153105A9F07D9331962150310977 +:1031A000F4CF623038F02115310559F0FD01C083AC +:1031B0004F5F5F4F61508196E4CF232B11F0FA01EE +:1031C0001082CF9108958091200280688093200220 +:1031D0008091230280FFFCCF81E080932302A091A5 +:1031E0001002B0911102AE5BB109B7FF02C0A0E0BE +:1031F000B0E020E038EB4BE050E00E948155E091D8 +:10320000B12EF091B22E843F9140A8F4878187308F +:1032100019F480E180935B2C8681873019F480E17A +:1032200080935A2C8091AC2E882389F0E0919E2EB9 +:10323000F0919F2E19948781873019F481E1809352 +:103240005B2C8681873019F481E180935A2C089594 +:10325000BC0183E090E20C94A953CF93DF93FC016F +:103260006491EC012196662331F083E090E20E94A4 +:10327000F753CE01F4CFDF91CF910895AB01BC019C +:1032800083E090E20C94D35380E280936206089529 +:10329000CF93DF9380915E2C823031F583E090E212 +:1032A0000E9460540E943E4F83E090E20E947C5452 +:1032B000EC0197FD19C0E091B12EF091B22E8781FB +:1032C000833019F483E180935B2C8681833019F479 +:1032D00083E180935A2C8C2F79D6811105C08C2FD5 +:1032E000DF91CF910C94E221DF91CF9108958091ED +:1032F0005E2C813079F028F08230C9F0833011F1F2 +:103300002EC08091680685FF31C08FE08093022037 +:1033100081E015C0809102208150809302208111AC +:1033200025C00E94A90D0E94D65282E008C080915B +:10333000680685FD18C08FE08093022083E08093AB +:103340005E2C0DC08091022081508093022081115B +:103350000DC00E949B520E94D70D10925E2C80914E +:103360005E2C823019F481D70C948C220895E09160 +:10337000B12EF091B22E8781823019F481E18093D1 +:103380005B2C8681823019F481E180935A2C089558 +:10339000E091B12EF091B22E8781823019F480E154 +:1033A00080935B2C8681823019F480E180935A2CC3 +:1033B000089583E090E20C94845383E090E20C94AF +:1033C000CF5422ED3BE03F932F932CEC3BE03F9317 +:1033D0002F9325EC3BE03F932F932EEB3BE03F9365 +:1033E0002F932EE13BE03F932F9322E02F931F92E8 +:1033F0009F938F930E948C568DB79EB70E968DBF6C +:103400009EBF85E6089560E072E00E94310E85E679 +:103410000895FB0120812F3349F42181211106C039 +:1034200060E072E00E94700E85E60895CB010E9474 +:10343000420E882371F0E091B12EF091B22ECF01AF +:103440008B5A9E4265818F5F9F4F0E94C45C84E6C9 +:1034500008958AEC0895EF92FF920F931F93CF93F4 +:10346000DF93CDB7DEB7A097CDBFDEBF7C01009163 +:10347000AC2E10E00115110591F486E19BE09F93BD +:103480008F9382E08F931F92FF92EF920E948C564F +:103490000F900F900F900F900F900F9010C0E09131 +:1034A000A62EF091A72ECE01019619959801AE0196 +:1034B0004F5F5F4F60E072E0C7010E94950E85E6A6 +:1034C000A096CDBFDEBFDF91CF911F910F91FF90EE +:1034D000EF900895DF92EF92FF920F931F93CF9397 +:1034E000DF93CDB7DEB7A097CDBFDEBF7B010091E4 +:1034F000AC2E10E06FE07BE0C7010E94FE55892BE7 +:1035000029F5D12CED2CF12CE016F10658F40E948F +:10351000780EE1E0F0E0EC0FFD1FEE0DFF1D808363 +:10352000D394F0CFE091A82EF091A92ECE01019670 +:103530001995E091AE2EF091AF2E4091AC2EBE01C8 +:103540006F5F7F4F83E1199584E60BC0A70160E2AE +:1035500070E0CE0101960E94C00E0817190711F302 +:103560008AECA096CDBFDEBFDF91CF911F910F9166 +:10357000FF90EF90DF900895FC018091AD2E88239D +:1035800011F081E301C080E38083118285E6089514 +:10359000FB012181211127C02081213321F481E009 +:1035A0008093AD2E04C0203321F41092AD2E84E61A +:1035B00008952F33C1F41F9220E32F931F9221E32C +:1035C0002F9329E03BE03F932F9322E02F931F920C +:1035D0009F938F930E948C568DB79EB70A968DBF8E +:1035E0009EBF85E608958AEC089582E291E1BDD4FC +:1035F0008EE6089582EA91E1D3D48EE60895E0EC58 +:10360000F4E081818E7F81830E949B520E949D0DF8 +:1036100084E60895E0ECF4E081818E7F81830E944E +:103620009B520E94A30D84E60895E6E9FEE22589F7 +:103630002F9324892F9326E03BE03F932F9322E0A2 +:103640002F931F929F938F930E948C568DB79EB796 +:1036500008968DBF9EBF85E608952091AC2E1F92DF +:103660002F9323E03BE03F932F9322E02F931F9271 +:103670009F938F930E948C568DB79EB708968DBFEF +:103680009EBF85E6089540E052E0BC0180E0F6D898 +:1036900085E60895FB0120812F3341F4218121111A +:1036A00005C060E072E0D9D885E6089580E0F8D8DA +:1036B000882319F0B2DB84E608958AEC089540E08F +:1036C00052E0BC0181E0DAD885E60895FB01208153 +:1036D0002F3341F42181211105C060E072E0BDD893 +:1036E00085E6089581E0DCD8882319F096DB84E62E +:1036F00008958AEC089540E052E0BC0182E0BED813 +:1037000085E60895FB0120812F3341F421812111A9 +:1037100005C060E072E0A1D885E6089582E0C0D8D7 +:10372000882319F07ADB84E608958AEC089540E056 +:1037300052E0BC0183E0A2D885E60895FB01208118 +:103740002F3341F42181211105C060E072E085D85A +:1037500085E6089583E0A4D8882319F05EDB84E62B +:1037600008958AEC089540E052E0BC0180E190DCCD +:1037700085E60895FB0120812F3341F42181211139 +:1037800005C060E072E061DC85E6089580E19ADCC6 +:10379000882319F042DB84E608958AEC089540E01E +:1037A00052E0BC0188E074DC85E60895FB012081CD +:1037B0002F3341F42181211105C060E072E045DC26 +:1037C00085E6089588E07EDC882319F026DB84E610 +:1037D00008958AEC089560E072E077DA85E608954E +:1037E000FB0120812F3341F42181211105C060E0CC +:1037F00072E07BDA85E60895CB014EDA882319F072 +:103800000CDB84E608958AEC0895CF93DF93EC01F6 +:1038100063D9813028E0920718F09C01385002C02B +:1038200020E030E03F932F939F938F9383EE9AE0B5 +:103830009F938F9382E08F931F92DF93CF930E9489 +:103840008C568DB79EB70A968DBF9EBF85E6DF91D9 +:10385000CF9108958BE994E1A3D38EE608954BDAD6 +:1038600084E60895FDD884E6089560E072E04EDBBA +:1038700085E60895CB0151DB811102C08AEC0895E1 +:1038800084E608950E945B1084E608950E948B10E0 +:1038900084E608950E94E60F84E608958091680604 +:1038A00080FD02C089E7089588E70895DF92EF92CE +:1038B000FF920F931F93CF93DF93EC010FEF11E073 +:1038C00085E1E82E8DE0F82E9CE2D92EB70185EC3B +:1038D00093E20E94FE55892BD1F001151105B9F034 +:1038E000DE01F7012491ED012196C8010197222301 +:1038F00041F00130110529F02C93DE0131968C0145 +:10390000F1CFDC928C0188E1E80EF11CDFCF21972A +:10391000188285E6DF91CF911F910F91FF90EF9074 +:10392000DF900895FC01809120028068809320023E +:103930008091230280FFFCCF81E080932302A0913D +:103940001002B0911102AE5BB109B7FF02C0A0E056 +:10395000B0E020E038EB4BE050E00E948155AA2710 +:10396000BB279F938F938CED9AE09F938F9382E078 +:103970008F931F92FF93EF930E948C568DB79EB743 +:1039800008968DBF9EBF85E608954EB15FB1209128 +:10399000080430910904242B352B3F932F9326EDF7 +:1039A0003AE03F932F9322E02F931F929F938F93A0 +:1039B0000E948C568DB79EB708968DBF9EBF85E638 +:1039C00008950F931F93CF93DF931F921F92CDB74C +:1039D000DEB78B01E091B12EF091B22E8581893056 +:1039E00009F06FC0E0919E2EF0919F2E199581E015 +:1039F0008093B82C60E270E0C8010E9444560097A2 +:103A0000F9F4F80101900020E9F73197E01BF10B80 +:103A1000E0FD59C0F695E795E130F10539F487E00E +:103A200090E08093942E9093952E37C053E0EE0F44 +:103A3000FF1F5A95E1F7E093942EF093952E2DC039 +:103A400098012C5F3F4F82179307E9F5A80162E0C8 +:103A500070E0CE0101960E94C00E898190E0982FFF +:103A600088272A81820F911D8093942E9093952E02 +:103A70000B5F1F4FF80101900020E9F73197E01B21 +:103A8000F10BE0FD20C0F695E79533E0EE0FFF1F48 +:103A90003A95E1F7E817F907B0F06091942E70912C +:103AA000952E695F7F4F83E0769567958A95E1F75C +:103AB000A80184E99DE20E94C00E0E94072C8FEFAE +:103AC00003C089EC01C08AEC0F900F90DF91CF9179 +:103AD0001F910F910895EF92FF920F931F93CF9331 +:103AE000DF931F921F92CDB7DEB78B01E091B12E0D +:103AF000F091B22E8581893009F080C0E0919E2E30 +:103B0000F0919F2E199582E08093B82C60E270E0CE +:103B1000C8010E9444567C01892B31F5F8010190BF +:103B20000020E9F73197E01BF10BE0FD69C0F69545 +:103B3000E795E130F10539F487E090E08093942E29 +:103B40009093952E47C053E0EE0FFF1F5A95E1F773 +:103B5000CF0169E070E00E946D55E81BF90BE0931E +:103B6000942EF093952E36C0C8010496E816F906F7 +:103B700009F046C0A80162E070E0CE0101960E9403 +:103B8000C00E898190E0982F88272A81820F911D8D +:103B90008093942E9093952E8730910529F09C0167 +:103BA00027703327232B61F587010F5F1F4FF80123 +:103BB00001900020E9F73197E01BF10BE0FD20C0F8 +:103BC000F695E79533E0EE0FFF1F3A95E1F7E8171A +:103BD000F907B0F06091942E7091952E695F7F4F38 +:103BE00083E0769567958A95E1F7A80184E99DE2DF +:103BF0000E94C00E0E94072C8FEF03C089EC01C009 +:103C00008AEC0F900F90DF91CF911F910F91FF9051 +:103C1000EF900895E091B12EF091B22E8581893018 +:103C2000A1F4E0919E2EF0919F2E199585E080934E +:103C3000B82C0E9462460E94072C8CE696E4809382 +:103C40006D2C90936E2C8FEF089589EC0895E09180 +:103C5000B12EF091B22E85818930A1F4E0919E2E93 +:103C6000F0919F2E199583E08093B82C0E946246B4 +:103C70000E94072C8CE696E480936D2C90936E2C1A +:103C80008FEF089589EC0895E091B12EF091B22E56 +:103C900085818930A1F4E0919E2EF0919F2E199597 +:103CA00086E08093B82C0E9462460E94072C8CE626 +:103CB00096E480936D2C90936E2C8FEF089589EC91 +:103CC0000895E091B12EF091B22E4085518564E6C1 +:103CD000649F9001659F300D11243F932F9320ED39 +:103CE0003AE03F932F9322E02F931F929F938F935D +:103CF0000E948C568DB79EB708968DBF9EBF85E6F5 +:103D00000895CF93DF931F921F92CDB7DEB7FB01CB +:103D100020812F33B1F42181211113C02EE93AE023 +:103D20003F932F9322E02F931F929F938F930E9494 +:103D30008C560F900F900F900F900F900F9085E67C +:103D40002EC089E592E089839A83CE0101969F93E4 +:103D50008F938AE99AE09F938F937F936F930E944A +:103D6000C2560F900F900F900F900F900F90892BCD +:103D7000A9F069817A816935F2E07F0778F4E091F2 +:103D8000B12EF091B22E60877187CF01885A9E4282 +:103D90008F5F9F4F0E94CD5C84E601C08AEC0F903C +:103DA0000F90DF91CF910895E091B12EF091B22E56 +:103DB00023852F9322852F9327E93AE03F932F9372 +:103DC00022E02F931F929F938F930E948C568DB762 +:103DD0009EB708968DBF9EBF85E60895CF93DF936B +:103DE0001F921F92CDB7DEB7FB0120812F33B1F4B4 +:103DF0002181211113C02FE02F932FEF2F9326E461 +:103E00003AE03F932F9322E02F931F929F938F933B +:103E10000E948C56CDBFDEBF85E630C019821A8263 +:103E2000CE0101969F938F9382E49AE09F938F93A4 +:103E30007F936F930E94C2560F900F900F900F9038 +:103E40000F900F90892BC9F069817A81611590E1FB +:103E5000790798F46093380370933903E091B12E99 +:103E6000F091B22E62877387CF01865A9E428F5F90 +:103E70009F4F0E94CD5C84E601C08AEC0F900F90AA +:103E8000DF91CF910895FB0120812F33D9F4218157 +:103E9000211121C01F9220E32F931F9221E32F9322 +:103EA0002CE33AE03F932F9322E02F931F929F93AE +:103EB0008F930E948C568DB79EB70A968DBF9EBF7A +:103EC00085E60895213311F4E9D303C0203319F4B2 +:103ED0000BD484E608958AEC0895FC0180910008D3 +:103EE000813029F480918C0891E0833009F090E0D2 +:103EF00090FF02C081E301C080E38083118285E6E8 +:103F00000895E091B12EF091B22E85818930A1F40F +:103F1000E0919E2EF0919F2E199584E08093B82C0D +:103F20000E9462460E94072C8CE696E480936D2CDA +:103F300090936E2C8FEF089589EC089589E00E948C +:103F4000F80DE0919E2EF0919F2E199587E08093B9 +:103F5000B82C0E9462460E94072C8CE696E480935F +:103F60006D2C90936E2C8FEF089521E020936C2C94 +:103F700020936B2C2CE32093692C25E030E02093D8 +:103F8000672C3093682C1092612C1092622C109246 +:103F9000632C1092642C80935F2C9093602C089576 +:103FA00027E020936C2C2CE231E02093672C309397 +:103FB000682C1092612C1092622C1092632C10923B +:103FC000642C80935F2C9093602C0895CF939091F4 +:103FD0006C2C953009F441C030F4933019F130F570 +:103FE000913068F43EC1973009F4AAC008F44AC081 +:103FF000983009F4ACC0993009F495C032C18130D1 +:1040000031F41092652C1092662C83E023C084302A +:1040100011F466E084C0883109F485C08B3109F061 +:1040200084C081C080936A2C84E014C090E04091E9 +:104030006A2C2FEF30E0241B31098217930721F4FB +:1040400085E008C0891779F165E183E090E20E947C +:10405000F75382E080936C2C68C02091652C3091DE +:10406000662CA9014F5F5F4F4093652C5093662CDF +:10407000F901ED5EF04D80834038510509F055C0DF +:1040800086E0E8CF20916A2C90916B2C29134FC0C9 +:10409000E3E1FFE223E93FE290E02E173F0791F2D0 +:1040A0004191940FFACF4091612C5091622C609114 +:1040B000632C7091642CE0915F2CF091602C20E8CF +:1040C00030E083E19FE21995C82F882311F1809198 +:1040D0006B2C8F5F80936B2C8091612C9091622C64 +:1040E000A091632CB091642C80589F4FAF4FBF4F6D +:1040F0008093612C9093622CA093632CB093642CDA +:1041000066E083E090E20E94F75382E080936C2C9B +:10411000A9C068E183E090E20E94F75368E183E080 +:1041200090E20E94F75310926C2CC1E09BC030E0EB +:10413000892F90E001972817390781F766E085CF2E +:10414000853119F410926B2C08C08B3161F38831E2 +:1041500009F45FCF863009F05AC080916B2C8F5FD5 +:1041600080936B2C4091612C5091622C6091632C58 +:104170007091642CE0915F2CF091602C20E830E08D +:1041800083E19FE21995C82F8823D1F161E083E094 +:1041900090E20E94F75360916B2C83E090E20E94C2 +:1041A000F75360916B2C609583E090E20E94F75387 +:1041B00060E870E083E19FE261D8E3E1FFE260E064 +:1041C0008FE2E339F80719F08191680FF9CF83E0A6 +:1041D00090E20E94F7538091612C9091622CA09103 +:1041E000632CB091642C80589F4FAF4FBF4F80938A +:1041F000612C9093622CA093632CB093642C32C0FA +:1042000064E083E090E20E94F75389E023CF853198 +:1042100009F08BCF61E083E090E20E94F753609158 +:104220006B2C83E090E20E94F75360916B2C6095B9 +:1042300083E090E20E94F75360E870E083E19FE240 +:104240001DD8E3E1FFE283E99FE260E08E179F075C +:1042500019F02191620FFACF83E090E20E94F753A8 +:1042600064CFC0E08C2FCF91089580916C2C813069 +:1042700019F0873029F108958091672C9091682C6E +:104280009C01215031092093672C3093682C892B95 +:1042900031F58091692C9FEF980F9093692C8823BA +:1042A00031F065E183E090E20E94F75302C0109282 +:1042B0006C2C85E090E08093672C9093682C089597 +:1042C0008091672C9091682C9C012150310920939A +:1042D000672C3093682C892B11F410926C2C089564 +:1042E000ECEEFBE020E030E09491981309C041E24D +:1042F000429FC001439F900D11248351944F089514 +:104300002F5F3F4FB1962930310571F780E090E083 +:104310000895262FBA012F3311F4469607C02D3386 +:1043200011F4449611C021110CC04096FC01259156 +:1043300034912115310521F183E19FE2F9011995AD +:104340000DC02032E9F44296FC01259134912115EB +:104350003105B1F083E19FE2F90119958F3F89F4AE +:1043600091E09093712C4EB15FB12091080430918F +:104370000904242B352B20936F2C3093702C089537 +:1043800089EC08950F931F93CF93DF938C01C5E1C0 +:10439000DDE0BE01C8010E94FE55892B49F440E0D2 +:1043A00050E060E0CE01DF91CF911F910F91B1CF2E +:1043B000689680E1C53DD80761F7DF91CF911F91E5 +:1043C0000F910895EF92FF921F93CF93DF93982F51 +:1043D0009F7D91549A3160F090ED980F9A3040F0A3 +:1043E0008F3531F0982F9D7F9D3311F08032D1F4BD +:1043F0009FE9980F9A3108F480522091722C3091E5 +:10440000732C2F3F91E0390708F07FC0A9014F5F5F +:104410005F4F4093722C5093732CF901ED5EF04D79 +:10442000808373C08D3009F040C0E091722CF09110 +:10443000732CED5EF04D10821092722C1092732C42 +:104440008091712C811161C08091132F982F9F7DD5 +:1044500009F440C08D7F8D33E9F1E3E1FFE27F0194 +:104460001191112331F01F3321F01D3311F010325F +:10447000B1F7F7011082C5E1DDE0BE0183E19FE203 +:104480000E94FE55892B59F41092132FA7014F5FFC +:104490005F4F612FCE013DDF8F3FB9F124C0689699 +:1044A000F0E1C53DDF0749F715C0883061F4809120 +:1044B000722C9091732C009741F101978093722C8C +:1044C0009093732C22C08B3101F51092722C1092B4 +:1044D000732C1BC088EC04DF0E942D1989EE9BE031 +:1044E0000E942D1912C0FCDE0E942D1989EE9BE05E +:1044F0000E942D198091132F882339F083E19FE2C8 +:104500000E94281986EE9BE0EBCF81E0DF91CF91EE +:104510001F91FF90EF9008958091712C882399F15D +:10452000E091B12EF091B22E208531852115310513 +:1045300051F14EB15FB18091080490910904842B30 +:10454000952B40916F2C5091702C841B950B64E639 +:1045500070E00E946D5562177307A8F01092712CDD +:104560008BECBEDE0E942D1983EE9BE00E942D197C +:10457000E0916D2CF0916E2C309729F019951092E6 +:104580006D2C10926E2C08958091712C8823A9F0C7 +:104590001092712C8BECA4DE0E942D1983EE9BE00F +:1045A0000E942D19E0916D2CF0916E2C309729F01E +:1045B000199510926D2C10926E2C0895CF93DF9365 +:1045C0009091712C9923A9F0EB011092712C88DE47 +:1045D0000E942D1980EE9BE00E942D19209749F032 +:1045E000CE010E9428198DED9BE0DF91CF910C94B4 +:1045F0002D19DF91CF910895EF92FF920F931F93A2 +:10460000CF937C019B01613081E0780710F020E0BE +:1046100031E08B01021B130BA70160E072E083E124 +:104620009FE20E94950E83E19FE20E942819C1E05B +:10463000013081E01807A8F01A954C2F50E0542F54 +:1046400044274E0D5F1D20E032E060E072E083E120 +:104650009FE20E94950E83E19FE20E942819CF5F9E +:10466000E7CF0115110589F04C2F50E0542F442756 +:104670004E0D5F1D980160E072E083E19FE20E94B1 +:10468000950E83E19FE20E9428198AED9BE0CF916D +:104690001F910F91FF90EF900C942D1980910008BD +:1046A000813021F490918C08933009F080E080FDF6 +:1046B0001AC08091762C811116C081E08093000889 +:1046C00093E090938C088093742C1092752C2EB1EB +:1046D0003FB18091080490910904822B932B809321 +:1046E0007B2C90937C2C089510928C0810920008DB +:1046F000E4E7FCE21082118208959091742C9923D2 +:10470000F1F08091752C811115C02091742C222319 +:10471000B9F04EB15FB12091080430910904242B07 +:10472000352B40917B2C50917C2C241B350B26344F +:10473000310530F081E08093752C892F089581E058 +:104740000895CF93C091762CCC23C1F02EB13FB108 +:104750008091080490910904822B932B2091792C4D +:1047600030917A2C821B930B2091772C3091782CEE +:104770008217930718F01092762C90DF8C2FCF9130 +:104780000895E091B12EF091B22E828793878093A5 +:104790003803909339030895E091B12EF091B22E31 +:1047A0008285938540968287938780933803909380 +:1047B0003903828593850895E091B12EF091B22E50 +:1047C00080E991E08287938780933803909339033F +:1047D0000895A0E2B6E081E015968C93159723E149 +:1047E00031E328B939B923E931E32AB93BB910B823 +:1047F00013B812B816B817B811B8E0E0F9E010A273 +:1048000011A22FEF30E026A337A32FEF3FEF20A711 +:1048100031A7808388E8838380E1848783E087836E +:104820001C968C931C9782E01A968C9308951F9285 +:104830000F920FB60F92112408B60F9218BE0BB646 +:104840000F921BBE8F939F93EF93FF93E0E0F9E0ED +:1048500013828FE790E086AB97AB81E190E080AF69 +:1048600091AFE0E0FAE010A211A28FEF9FEF86A3D4 +:1048700097A389E88383168281E084878EE0808312 +:1048800010922A06FF91EF919F918F910F900BBE8E +:104890000F9008BE0F900FBE0F901F9018951F929B +:1048A0000F920FB60F92112408B60F9218BE0BB6D6 +:1048B0000F921BBE2F933F938F939F93EF93FF9382 +:1048C0002091280693B1267081E009F080E0990FCD +:1048D000892B83B982B1882309F463C012B883B1EC +:1048E0008770873059F51092000980E180930C0998 +:1048F0001092030A1B9B03C08CEA94E002C08CE672 +:1049000094E08093260A9093270A82E081B981E09F +:1049100080930C0A83E08093060A86B197B1877072 +:1049200049F090B18F5F893011F09695FBCFE8B1D7 +:10493000F9B1908381E080937D2C36C083B1982FAC +:104940009C7091F1847091B191111CC020B1269599 +:10495000882311F080E001C080E8282B20B986B1BF +:1049600097B1019686B997B987709927892BE1F499 +:10497000E8B1F9B1CF01019688B999B9208381E0F6 +:1049800081B912C091B1913079F4EAB1FBB19F01C4 +:104990002F5F3F4F2AB93BB9811190E0908311B846 +:1049A00003C082B1809582B988E880930309FF91A2 +:1049B000EF919F918F913F912F910F900BBE0F9090 +:1049C00008BE0F900FBE0F901F9018951F920F9268 +:1049D0000FB60F92112408B60F9218BE0BB60F92A5 +:1049E0001BBE2F933F938F939F93EF93FF9381B1C0 +:1049F000823008F49DC081B18D3008F099C0E1B1DA +:104A0000F0E0EE0FFF1FEC5DFF4D0190F081E02D17 +:104A100019948FE790E08093260A9093270A88C024 +:104A20008E9A8EE0809340088FE390E08093260A70 +:104A30009093270A85E06FC08E9886E081B98FEF4A +:104A400082B914B815B8E8B1F9B1808180B970C0E5 +:104A5000009B05C08E9A82B1809582B901C08E9864 +:104A600087E059C0009B02C08E9801C08E9A80B129 +:104A7000869580B984B195B1019684B995B984B110 +:104A800095B187709927892B11F488E044C024B12F +:104A900035B186B197B128173907B1F52BC0EAB106 +:104AA000FBB1309711F0808101C082B1882311F0F1 +:104AB0008E9A01C08E9889E02EC0EAB1FBB1309782 +:104AC00051F08081882311F08E9801C08E9A319622 +:104AD000EAB9FBB908C082B1882311F08E9801C0F1 +:104AE0008E9A8FEF82B924B135B186B197B128176C +:104AF000390711F48AE00FC0E8B1F9B1CF0101968E +:104B000088B999B9818180B986E005C08E988BE01B +:104B100002C08E988CE081B90BC01092000A1092EE +:104B2000060A109240081092410881E080937E2C82 +:104B3000FF91EF919F918F913F912F910F900BBE1D +:104B40000F9008BE0F900FBE0F901F901895CF9337 +:104B5000DF93EDE7FCE210821182E0E4F6E0128AD6 +:104B600084E08283C0E8D1E082E68E83A0E2B6E0F2 +:104B700081E016968C93169711968C93119796E078 +:104B800012969C93129751968C93519742E05296AD +:104B90004C9352971A961C921A9733E019963C93AD +:104BA00099E598839AE5998390E491839683A0EBA5 +:104BB000B0E012962C911297207F12962C931297A8 +:104BC00012962C911297226012962C9320E3218347 +:104BD0002683908B868345833183E0E0F8E083E190 +:104BE000818321E030E026A337A320A731A7E0E8A6 +:104BF000F8E014868083E0E2F3E01382118288E01B +:104C0000828391E19083A091B12EB091B22E1A9639 +:104C10002D913C911B97208F318FE0E8F3E09CE3CE +:104C20009283808393838183DF91CF91D2CDA0E261 +:104C3000B6E01A961C921A97EDE7FCE210821182F8 +:104C4000E0E0F9E010821382178280E18487E0E0DF +:104C5000FAE010821382168281E08487E0E4F8E0B3 +:104C60001082118216968C938E980895CF93DF93BD +:104C700080917D2C882309F47EC010927D2CC6B1D2 +:104C8000D7B1C730D10508F471C0AE01495F5F4F9D +:104C900093E0569547959A95E1F7E091AE2EF09105 +:104CA000AF2E63E171E380E41995E091B12EF091AC +:104CB000B22E8781883019F483E180935B2C868142 +:104CC000883019F483E180935A2CE091A42EF0915E +:104CD000A52EBE0183E191E31995EC0194FF06C076 +:104CE000DF7E83E991E38AB99BB902C01AB81BB889 +:104CF0002097E1F1AE01495F5F4F83E056954795FC +:104D00008A95E1F7E091AE2EF091AF2E63E171E369 +:104D100081E41995E091B12EF091B22E878189300E +:104D200019F483E180935B2C8681893019F483E147 +:104D300080935A2CC6B9D7B983E191E388B999B960 +:104D400010926008109261088FE090E080936608EE +:104D50009093670888E090E080936A0890936B08CE +:104D600083E28093410883E081B905C01092000A74 +:104D70001092060A2EDD80917E2C882329F0109255 +:104D80007E2CDF91CF9125CDDF91CF910895CF93E8 +:104D9000DF93E0E4F6E0128A84E08283C0E8D1E0A9 +:104DA00082E68E83A0E2B6E081E016968C93169799 +:104DB00011968C93119796E012969C9312975196A8 +:104DC0008C93519742E052964C9352971A961C92AC +:104DD0001A9733E019963C93199799E598839AE5C9 +:104DE000998390E491839683C0EBD0E02A81207F61 +:104DF0002A832A8122602A8320E321832683908BC1 +:104E0000868345833183E0E0F8E093E1918321E0FC +:104E100030E026A337A320A731A7E0E8F8E0148606 +:104E20009083E0E2F3E01382118298E0928321E123 +:104E30002083C091B12ED091B22E2A853B85208F40 +:104E4000318FE0E8F3E02CE3228390832383918386 +:104E500015968C93E0E0F9E02FEF30E026A337A31E +:104E600012A613A614A615A6108216821782808396 +:104E70001092000A10927F2CE2E8FCE2108212826B +:104E80001182DF91CF91089581E0809326062CDC7A +:104E9000E0E0F9E010821782E0E0FAE01082178289 +:104EA000E2E8FCE211821282108208951F920F92B2 +:104EB0000FB60F92112408B60F9218BE0BB60F92C0 +:104EC0001BBE2F933F938F939F93EF93FF93E0E04D +:104ED000F9E080E484871782E0E8F3E082E08783EA +:104EE00089EB818383E191E38AB99BB981E090E00A +:104EF00084B995B916B82EB13FB18091080490914C +:104F00000904822B932B8093802C9093812C81E039 +:104F10008093842C18B817B810927F2C88E0809367 +:104F20008706FF91EF919F918F913F912F910F9065 +:104F30000BBE0F9008BE0F900FBE0F901F901895DC +:104F4000E0E0F9E08FEF94E086A397A380E6848702 +:104F500080E387838FEF90E086AB97AB88E0809308 +:104F6000870608951F920F920FB60F92112408B66C +:104F70000F9218BE0BB60F921BBE2F933F934F9309 +:104F80005F938F939F93EF93FF931092070A109272 +:104F9000000A1092470910924009809181038E7F88 +:104FA0008093810384B195B180FF1AC0379B03C001 +:104FB00086B1869503C086B18695806886B984B12E +:104FC00095B1019684B995B987709927892B41F4D9 +:104FD000EAB1FBB1CF0101968AB99BB986B1808352 +:104FE00084B195B187709927892BC9F0E4B1F5B1E7 +:104FF00086B144B155B193E0F695E7959A95E1F7FE +:10500000ED5EFE4C90E04770552728E030E0241B11 +:10501000350B02C0959587952A95E2F7808381E04C +:105020008093832C1092842C8FEF9FEF8093260A1D +:105030009093270A1092200A1092210A1092060AD1 +:105040001092070A1092030A84E08093000A83E01A +:1050500080937F2CFF91EF919F918F915F914F9162 +:105060003F912F910F900BBE0F9008BE0F900FBE77 +:105070000F901F9018951F920F920FB60F92112448 +:1050800008B60F9218BE0BB60F921BBE8F93EF930C +:10509000FF93E0E8F3E081818F7C8183E0E0FAE038 +:1050A00088E8838381E08083FF91EF918F910F9057 +:1050B0000BBE0F9008BE0F900FBE0F901F9018955B +:1050C0001F920F920FB60F92112408B60F9218BEBE +:1050D0000BB60F921BBE8F939F93EF93FF9380911C +:1050E0006009109260091092610993E09093400961 +:1050F000813520F4813308F472C01BC08137E8F495 +:1051000084B195B180FF2EC086B18695806886B93E +:1051100084B195B1019684B995B987709927892B87 +:1051200041F4EAB1FBB1CF0101968AB99BB986B1CE +:10513000808386B1869580682CC086B1869580680C +:1051400086B984B195B1019684B995B987709927CC +:10515000892B41F4EAB1FBB1CF0101968AB99BB921 +:1051600086B1808386B18695806886B984B195B111 +:10517000019684B995B987709927892B41F4EAB1D2 +:10518000FBB1CF0101968AB99BB986B1808386B104 +:10519000869586B984B195B1019684B995B9877021 +:1051A0009927892B41F4EAB1FBB1CF0101968AB965 +:1051B0009BB986B1808386B1869586B984B195B155 +:1051C000019684B995B987709927892B41F4EAB182 +:1051D000FBB1CF0101968AB99BB986B18083FF915B +:1051E000EF919F918F910F900BBE0F9008BE0F9083 +:1051F0000FBE0F901F9018950F931F93CF93DF93BF +:10520000CDB7DEB7DA95CDBFDEBF8091842C882381 +:1052100009F483C04EB15FB18091080490910904F4 +:105220002091802C3091812C842B952B821B930B09 +:1052300020911E2030911F202F5F3F4F28173907E4 +:1052400008F06BC01092070A1092000A10924709EA +:1052500010924009809181038E7F8093810384B1F5 +:1052600095B180FF1AC0379B03C086B1869503C0F5 +:1052700086B18695806886B984B195B1019684B966 +:1052800095B987709927892B41F4EAB1FBB1CF0119 +:1052900001968AB99BB986B1808384B195B1877034 +:1052A0009927892BC9F0E4B1F5B186B144B155B164 +:1052B00013E0F695E7951A95E1F7ED5EFE4C90E068 +:1052C0004770552728E030E0241B350B02C0959528 +:1052D00087952A95E2F7808381E08093832C109252 +:1052E000842C2FEF3FEF2093260A3093270A109249 +:1052F000200A1092210A1092060A1092070A1092B0 +:10530000030A94E09093000A93E090937F2C14B8E2 +:1053100015B88093832C1092842C13DA81116FC2FC +:10532000ECD9882309F46BC28091842C811167C267 +:105330008091822C811105C08091832C882309F4EF +:105340005EC280917F2C833041F48091200A90913D +:10535000210A8532914008F452C28091832C88231F +:1053600009F4A2C084B195B1892B09F49DC084B120 +:1053700095B1089718F414B815B896C044B155B152 +:10538000495F5F4FB3E056954795BA95E1F763E102 +:1053900071E3CE0101960E94235683E191E38AB91D +:1053A0009BB944B155B114B815B8898186958695D5 +:1053B000898322E030E024173507B0F5F901A3E036 +:1053C000F695E795AA95E1F781E090E08C0F9D1F97 +:1053D000E80FF91F8081982F96959695908383709A +:1053E000813049F030F08230D1F486B18695806802 +:1053F00004C081E015C086B1869586B984B195B1A7 +:10540000019684B995B987709927892B41F4EAB13F +:10541000FBB1CF0101968AB99BB986B1808380E048 +:105420002E5F3F4F882339F284B195B18770992759 +:10543000892BC9F0E4B1F5B186B144B155B173E03F +:10544000F695E7957A95E1F7ED5EFE4C90E04770B2 +:10545000552728E030E0241B350B02C09595879531 +:105460002A95E2F78083E091B12EF091B22E8781E8 +:10547000883019F483E180935B2C8681883019F49D +:1054800083E180935A2C44B155B1495F5F4F63E08B +:10549000569547956A95E1F7E091AE2EF091AF2EC3 +:1054A00063E171E382E419951092822C1092832CAF +:1054B00064B175B1E091A42EF091A52E83E191E342 +:1054C000199584B995B984B195B1892B09F497C11F +:1054D00089E8809381031092000A1092200A1092AA +:1054E000210A2FEF3FEF2093260A3093270A8FE5FA +:1054F00090E08093280A9093290A1092060A80E18E +:1055000080930C0A93E09093070A1092600910921E +:105510006109209366093093670920EA30E02093FF +:105520006809309369091092460980934C0981E01B +:105530008093470981E18093800110928801109245 +:10554000800310922906E091B12EF091B22E87814E +:10555000893019F483E180935B2C8681893019F4BA +:1055600083E180935A2C44B155B1495F5F4F33E0DA +:10557000569547953A95E1F7E091AE2EF091AF2E12 +:1055800063E171E383E4199504B115B1013094E04E +:10559000190708F024C114B815B8A801495F5F4F76 +:1055A00023E0569547952A95E1F763E171E383E996 +:1055B00091E30E94235683E191E38AB99BB986B1B6 +:1055C0008695806886B984B195B1019684B995B9FC +:1055D00087709927892B39F484E191E38AB99BB9C3 +:1055E00086B18093133186B1869586B984B195B121 +:1055F000019684B995B987709927892B41F4EAB14E +:10560000FBB1CF0101968AB99BB986B1808380E056 +:1056100041E050E0E3E9F1E30417150708F495C011 +:10562000908190FF2BC086B1869586B984B195B1E3 +:10563000019684B995B987709927892B41F4AAB14D +:10564000BBB1CD0101968AB99BB986B18C9386B165 +:105650008695806886B984B195B1019684B995B96B +:1056600087709927892B09F063C0AAB1BBB1CD011E +:1056700001968AB99BB986B18C935AC0882351F19F +:1056800086B1869586B984B195B1019684B995B9EC +:1056900087709927892B41F4AAB1BBB1CD0101963E +:1056A0008AB99BB986B18C9386B1869586B984B147 +:1056B00095B1019684B995B987709927892B41F4E2 +:1056C000AAB1BBB1CD0101968AB99BB986B18C93C1 +:1056D00080E02FC096B19695906896B924B135B107 +:1056E0002F5F3F4F24B935B927703327232B49F457 +:1056F000AAB1BBB19D012F5F3F4F2AB93BB996B10B +:105700009C9396B1969596B924B135B12F5F3F4FD2 +:1057100024B935B927703327232BD1F6AAB1BBB1F1 +:105720009D012F5F3F4F2AB93BB996B19C9301C0B1 +:1057300081E09081969590839A0127703327232BDF +:1057400009F431964F5F5F4F67CF811129C086B151 +:105750008695806886B984B195B1019684B995B96A +:1057600087709927892B41F4EAB1FBB1CF010196EB +:105770008AB99BB986B1808386B1869586B984B192 +:1057800095B1019684B995B987709927892B41F411 +:10579000EAB1FBB1CF0101968AB99BB986B180838A +:1057A00084B195B187709927892BC9F0E4B1F5B11F +:1057B00086B144B155B193E0F695E7959A95E1F736 +:1057C000ED5EFE4C90E04770552728E030E0241B4A +:1057D000350B02C0959587952A95E2F7808381E085 +:1057E00080937F2C83E191E38AB99BB980E2809317 +:1057F0000C098CE08093070985E58A95F1F7D3952C +:10580000CDBFDEBFDF91CF911F910F91089514B8E6 +:1058100015B881E08093822C0C944E231092070AD5 +:105820001092000A1092470910924009809181035A +:105830008E7F8093810384B195B180FF1AC0379B1E +:1058400003C086B1869503C086B18695806886B907 +:1058500084B195B1019684B995B987709927892B40 +:1058600041F4EAB1FBB1CF0101968AB99BB986B187 +:10587000808384B195B187709927892BC9F0E4B1F1 +:10588000F5B186B144B155B193E0F695E7959A9597 +:10589000E1F7ED5EFE4C90E04770552728E030E0E0 +:1058A000241B350B02C0959587952A95E2F78083D6 +:1058B00081E08093832C1092842C8FEF9FEF809354 +:1058C000260A9093270A1092200A1092210A109219 +:1058D000060A1092070A1092030A84E08093000AD5 +:1058E00083E080937F2C10927F2C1092832C109257 +:1058F000822C0C947423982F80918D2C882359F03E +:105900008091872C811108C081E02091862C92170C +:1059100018F080E0089581E00895FF920F931F939F +:10592000CF93DF931F92CDB7DEB700918A2C000F83 +:10593000000F0051FF24F394F0928D2C10E0B80179 +:105940006D5F7F4F41E050E086E89CE20E942A0FA5 +:10595000B8016C5F7F4F41E050E0CE0101960E949C +:105960002A0F8981881F8827881F8093852CF092B1 +:105970008C2C10928B2C1092872C1092892C0F90CB +:10598000DF91CF911F910F91FF90089510928D2C70 +:1059900080E180938A2C8FEF8093862C1092852C47 +:1059A00081E080938C2C10928B2C1092872C10927B +:1059B000892C089584E180938A2CAFCF89E280936B +:1059C0008A2CABCF81E080938C2C089508958F9220 +:1059D0009F92AF92BF92CF92DF92EF92FF920F937E +:1059E0001F93CF93DF9300D01F92CDB7DEB78C010A +:1059F000FC01808190918C2C9230E1F028F0933062 +:105A000011F1943051F14EC0292F2095217020932F +:105A10008B2C992311F0863219F0823509F042C09F +:105A200084E4F8018083118282E080938C2C80E1F1 +:105A300090E0DBC290918B2C911102C08632B1F0C4 +:105A4000823599F513C090918B2C911102C086324A +:105A500069F0823509F05BC009C090918B2C9111DF +:105A600002C0863219F0823509F0F3C084E4F801EF +:105A70008083118281E0892713C08091892C811154 +:105A8000FCC0F8018081803509F476C108F006C1B8 +:105A9000803309F409C190918D2C911174C181E07A +:105AA00080938C2C80E090E0A0C28339C1F71982EA +:105AB0001A821B821C8288E8898343E050E060E000 +:105AC00070E0CE0102960E942A0FF8018181803297 +:105AD00009F4ABC0803709F047C0F8019281898191 +:105AE0009813B2C093818A819813AEC094818B8140 +:105AF0009813AAC095818C819813A6C084E08083F6 +:105B000061E070E0C8010E94B03783E029C08539A8 +:105B100031F644E050E064E070E0CE0101960E946E +:105B20002A0FF8018181803209F47FC08037E1F4C7 +:105B3000F80192818981981387C093818A81981393 +:105B400083C094818B8198137FC095818C81981339 +:105B50007BC0108261E070E0C8010E94B03784E031 +:105B600080938C2C38E171C0E82EE294AFE0EA22F9 +:105B7000EA94EA948F70F82E88E090E08F199109EA +:105B80002FEF30E0690102C0D594C7948A95E2F7FF +:105B9000F5E0EF1629F024E0E2122AC0FF20E1F040 +:105BA00044E050E0B8016E5F7F4FCE0101960E9445 +:105BB0001656892B61F499818A8189279B818927CF +:105BC0009C818927F801968189278C2171F1F4E065 +:105BD000EF120EC0F11038C044E050E0B8016E5F23 +:105BE0007F4FCE0101960E941656892BF1F02CC0F2 +:105BF00023E02E1548F1F12CA701B8016E5F7F4F0D +:105C0000CE0101960E941656892BF1F4D801AE0DF3 +:105C1000BF1DE1E0F0E0EC0FFD1FEE0DFF1D129641 +:105C20009C9180818927C82279F43981F8013083D9 +:105C30002A8121839B8192838C81838323279227CE +:105C40008927848338E201C030E020E0832F922F3F +:105C5000CCC1695F7F4F83E0769567958A95E1F7C0 +:105C60006330710508F41BCF62507109C8010E94AE +:105C7000DB37811102CF81E092C11092892C809193 +:105C8000AD2E81118BC16091882CF4E06F9FB00123 +:105C9000112444E050E0C80102967EC1803A09F424 +:105CA00055C0823AC1F1F7CEF801F18080918D2C78 +:105CB000882359F08091852C882339F08091872C96 +:105CC000811103C0E090862C02C0E0908A2CFE1463 +:105CD00010F0F80131C1C12CD12CF4E0FF9EB001CD +:105CE000112444E050E0C8018C0D9D1D0E942A0F34 +:105CF000F394EF1001C0F12C24E0C20ED11C80E11E +:105D0000C816D10451F760E170E0C8010E94B037B5 +:105D100080E990E06AC1F801F180F1E0FF15C8F672 +:105D200080918A2CF816A8F68F2DE5DD882309F4DA +:105D3000C2C0C80102962091AD2E21112FC1F4E0FE +:105D4000FF9EB001112444E050E026C1F801F1802B +:105D5000F1E0FF1508F0BDCF80918A2CF81608F00D +:105D6000B8CF8F2DC8DD882309F4A5C0F092882C08 +:105D700081E08093892C12C1F80181818111A9CF22 +:105D800010928C2C8FCE8C3309F40EC148F48933D9 +:105D900009F4A6C08A3391F18B3109F080CE6AC034 +:105DA0008B3409F40FC138F48E3309F078CE8DEBC3 +:105DB000F801808314C1803621F0853A09F4ABC024 +:105DC0006ECEF801108284E0818383E0828381E0DB +:105DD00083838483158280918A2C843111F08EE034 +:105DE00001C08BE0F801868383E0878368E070E080 +:105DF000C8010E94B03780E590E0F7C0F801D1807B +:105E0000E280ED1408F465CF80918A2CD81608F052 +:105E100060CFE81608F05DCF8091852C882351F083 +:105E20008D2D69DD882309F446C08E2D64DD88231D +:105E300009F441C0F12C6D2D70E0E61AF70AFFEF6E +:105E4000EF1AFF0AEE0CFF1CEE0CFF1C660F771F0B +:105E5000660F771FA701C8010E942A0FB701C8016A +:105E60000E94B037C7010296F3E0880F991FFA9598 +:105E7000E1F7BBC060918A2C660F660F6051E62E79 +:105E8000F12CB701685F7F4F44E050E0CE010196EE +:105E90000E942A0F9981F801818198130CC09A8180 +:105EA0008281981308C09B818381981304C09C81D0 +:105EB0008481981711F086E072C081E08093872C6E +:105EC000B701645F7F4F42E050E0C8010E942A0F93 +:105ED00062E070E0C8010E94B03780E290E085C0C7 +:105EE000F8016181633008F0F4CE80918A2C70E073 +:105EF000680F711D660F771F660F771F43E050E034 +:105F0000C8010E942A0F63E070E0C8010E94B03708 +:105F100088E290E06AC0F8012181E22EF12C9E2DEA +:105F20008827856A092E000CAA0BBB0B32814C0115 +:105F30005D01A32A233010F0108233C080918A2C97 +:105F4000B701680F711D660F771F660F771F44E05A +:105F500050E0CE0101960E942A0F89819A81AB817F +:105F6000BC81880D991DAA1DBB1D89839A83AB83B3 +:105F7000BC830097A105B14010F084E010C080916F +:105F80008A2CB701680F711D660F771F660F771F88 +:105F900044E050E0CE0101960E94780F8AE0F801BB +:105FA000808384E090E021C040E250E06AEC70E041 +:105FB000C8010E943D5660E270E0C801D1D780E17F +:105FC00091E013C060918A2C660F660F605170E0FB +:105FD0006B5F7F4F41E050E0C8010E942A0F61E0F3 +:105FE00070E0C801BDD788E190E02496CDBFDEBF48 +:105FF000DF91CF911F910F91FF90EF90DF90CF90A5 +:10600000BF90AF909F908F900895CF93DF93EC0156 +:1060100043E050E060E070E00E942A0F44E050E06E +:1060200064E070E0CE010396DF91CF910C942A0FCB +:106030000F931F93CF93DF931F921F92CDB7DEB7BD +:106040008C01FC0190818181892798E889279281C0 +:1060500089278A83938184818927958189279681DD +:106060008927898343E050E060E070E0C8010E9426 +:10607000780F41E050E063E070E0CE0102960E94AC +:10608000780F44E050E064E070E0C80103960E949D +:10609000780F41E050E068E070E0CE0101960E9488 +:1060A000780F0F900F90DF91CF911F910F9108956E +:1060B00081E08093B12C84E090E08093902C9093C9 +:1060C000912C88E080938F2C10928E2C089581E083 +:1060D0008093B12C84E490E08093902C9093912C49 +:1060E00088E080938F2C10928E2C089581E080930D +:1060F000B12C82E090E08093902C9093912C88E1D9 +:1061000080938F2C10928E2C089581E08093B12C77 +:10611000089508958F929F92AF92BF92CF92DF928F +:10612000EF92FF920F931F93CF93DF93CDB7DEB71C +:106130006297CDBFDEBF8C015B018091B12C6730CF +:10614000710501F5F8019081882311F0963211F064 +:106150009235C1F421E0811120E020938E2C882318 +:1061600011F0963211F0923559F49091902C809163 +:10617000912CF801908381838FEF8093922C37C00C +:10618000A12CB12C853009F497C050F48230A1F1D4 +:10619000C8F0833009F468C0843009F481C0ACC50C +:1061A000883009F41CC138F4863009F491C0873076 +:1061B00009F4CAC0A1C5893009F441C38D3008F47F +:1061C00063C39AC5982F9095917090938E2CF80187 +:1061D0009081882311F0963219F0923509F006C4A7 +:1061E0009091902C8091912CF8019083818384E090 +:1061F0008093B12C80E181C5F8018081982F9D7F2B +:10620000913419F48AE080835AC38033C1F462E088 +:1062100070E0C801D0D6882309F494C0F8016181E8 +:10622000F0E16F9FB001112440E150E0C8010E94ED +:106230002A0F60E170E0C80193D680E95EC5803A1C +:1062400079F462E070E0C801B6D6882309F47AC018 +:10625000F80181818093A82C83E08093B12CD2CF68 +:10626000803509F049C54AC060E170E0C801A3D695 +:10627000882389F08091AD2E81110BC06091A82CEC +:10628000F0E16F9FB001112440E150E0C8010E948D +:10629000780F8AE001C081E0F801808382E00DC3BD +:1062A00090918E2CF8018081911102C08632D1F03C +:1062B000823509F0A3C316C090918E2CF80180811D +:1062C000911102C0863271F0823509F045C40AC0CE +:1062D00090918E2CF8018081911102C0863211F0CC +:1062E000823551F42091902C8091912CF8012083DB +:1062F000818381E0892777C38035C9F4F8018181E2 +:10630000882319F0F8011082DAC262E070E0C80157 +:1063100052D68823B9F0E091AE2EF091AF2E40E036 +:1063200060E070E081E919951092B12CE5C490EA23 +:10633000980F923008F0B4C462E070E0C8013BD618 +:106340008111DDC481E04FC2C8010E94643D64E058 +:106350007801F4E0EF0EF11CC7010E948040E0914B +:10636000AE2EF091AF2E44E0B70180EA1995F80106 +:1063700094818091A92C981329C095818091AA2C91 +:10638000981324C096818091AB2C98131FC09781DD +:106390008091AC2C98131AC08091AD2C8083809191 +:1063A000AE2C81838091AF2C82838091B02C83832B +:1063B00064E0C8010E949942E091AE2EF091AF2EA8 +:1063C00044E0B80181EA199588E004C2E091AE2E5C +:1063D000F091AF2E44E069EA7CE280EC2DC2F80136 +:1063E0008081803551F48181811107C08281873598 +:1063F00021F483818D3C09F405C264E0C8010E9448 +:106400008040F8018081803309F0BDC062E070E017 +:10641000C801D1D5882309F4A7C0F801618167FDBF +:1064200004C0862F8370833029F0862F8F708F30C1 +:1064300009F07FC06093A82C8091932C9091942CAC +:106440003091952C282F22952095492F4227407F67 +:1064500009F03FC023272F70E1F59295909593277F +:10646000907FB9F5262F67FD02C0237003C02F70FF +:1064700009F023E08095432F42954F702223B1F01D +:1064800090E0022E02C0959587950A94E2F7E32FDB +:10649000F0E0022E02C0F595E7950A94E2F73E2F50 +:1064A00050E002C0559547952A95E2F740FBCC2471 +:1064B000C0F8D12CF601EE0FFF1FEE0FFF1F30FBCF +:1064C000EE24E0F8F12CEE0CFF1CEE298170E82B95 +:1064D00001C0E7E0F0E08091A72CEE0FFF1FE25C27 +:1064E000FF4DE80FF11D8081F8019801205F3F4FBB +:1064F00011922E173F07E1F79091962CF8019187A2 +:1065000082FF09C09091932C96839091942C97834D +:106510009091952C908784FF15C06360F0E16F9F88 +:10652000B0011124665F7F4F46E050E0C8010A9633 +:1065300007C080E1689FB001112440E150E0C8012C +:106540000E942A0F60E170E0C8010AD5E091AE2EEA +:10655000F091AF2E42E1B80180E8199562E1C801DF +:106560000E94994280E939C10E948B3F91E08927BE +:10657000F8018083E091AE2EF091AF2E44E0B80197 +:1065800081EC19959CC1803A61F462E070E0C80129 +:1065900012D58823D9F1F80181818093A82C89E054 +:1065A0000DC0803C89F462E070E0C80104D5882306 +:1065B00069F1F80181818093A82C8BE08093B12C44 +:1065C0000E948B3F9AE00EC1813C91F462E070E042 +:1065D000C801F1D48823D1F0F80181818093A82CDF +:1065E000FAE0FF2EF092B12C0E948B3F8F25FBC06A +:1065F000823C99F462E070E0C801DDD4882331F078 +:10660000F80181818093A82C8CE0D8CFE091AE2E48 +:10661000F091AF2E44E0B80121C0803B11F562E05B +:1066200070E0C801C8D4E091AE2EF091AF2E44E0E6 +:10663000B801882399F086E819958091AD2E8111D3 +:10664000BFCFF8016181F0E16F9FB001112440E1FB +:1066500050E087E99CE20E94780FB2CF81EC199557 +:10666000BEC090EA980F923008F0BFC062E070E0C0 +:10667000C801A1D4882309F4B2C0F8018081803612 +:1066800021F0EAE3CE2ED12C03C070E3C72ED12C2B +:10669000F801818187FF0CC0807FF0E18F9F70013E +:1066A000112480ECC80ED11C66EFA62EB12C08C0B8 +:1066B0008C7F90E1899F7001112456E3A52EB12CA7 +:1066C000E091AE2EF091AF2E42E0B80180E919952D +:1066D000F801808181708093A72CC70144E09695D2 +:1066E00087954A95E1F78093A82C9091922C981762 +:1066F00069F0B5016E0D7F1D44E050E083E99CE236 +:106700000E942A0F8091A82C8093922C68E0CE01E1 +:1067100001960E947B0E8091AC2E44E050E08730C1 +:1067200019F463E070E002C060E070E0CE010F9603 +:106730000E942A0FB6016E0D7F1D46E050E0CE018B +:1067400009960E942A0F89818093A92C8A818093BF +:10675000AA2C8B818093AB2C8C818093AC2C60E431 +:1067600089EA9CE20E94B3448091A92C8093AD2CCD +:106770008091AA2C8093AE2C8091AB2C8093AF2C6F +:106780008091AC2C8093B02C60E28DEA9CE20E9458 +:10679000B34420E0AE014F5F5F4FBE01615F7F4FAA +:1067A000CE010996E6D68981F80180838A818183AA +:1067B0008B8182838C818383E058FF4F8D8180831E +:1067C00031968E81808331968F8180833196888542 +:1067D000808387E08093B12C80E290E16CC30E94BB +:1067E0008B3F91E08927F8010ECD8035B9F4F8018F +:1067F0008181811187CD62E070E0C801DCD38823FC +:1068000009F4A0CD1092B12CE091AE2EF091AF2EF4 +:1068100040E060E070E081E919956EC2A501495F32 +:106820005F4F33E0569547953A95E1F7E091AE2EEC +:10683000F091AF2EB80182E9199581E0D4C062E1F0 +:10684000C8010E94804060E170E0C801B4D3E091CB +:10685000AE2EF091AF2E882329F142E1B80181E8F4 +:1068600019958091AD2E81110BC06091A82CF0E19B +:106870006F9FB001112440E150E0C8010E94780FE1 +:106880000E948B3F9AE015C066E0C8010E948040DC +:1068900064E070E0C8018FD3811113C0E091AE2E87 +:1068A000F091AF2E44E0B80181EC19950E948B3F26 +:1068B00091E08927F801808388E08093B12C84E0FF +:1068C0001CC26091A82CF0E16F9FB001112440E13F +:1068D00050E087E99CE20E942A0F9091972C8091CA +:1068E0009B2C80959813E3C280919F2C9813DFC254 +:1068F0009091982C80919C2C80959813D8C280916F +:10690000A02C9813D4C29091992C80919D2C8095A5 +:106910009813CDC28091A12C9813C9C290919A2C42 +:1069200080919E2C80959813C2C28091A22C9813BE +:10693000BEC29091A32C8091A42C80959813B7C2CD +:106940008091A52C9813B3C28091A62C80959813A2 +:10695000AEC2C090972CD090982CE090992CF090DB +:106960009A2CF80180809180A280B3808091B12C14 +:106970008B3009F081C2E091AE2EF091AF2E46E04F +:10698000B80185E81995C818D908EA08FB08C0922B +:10699000972C33272F2D1E2D0D2D0093982CA701FA +:1069A000662777274093992C8F2D9927AA27BB27F5 +:1069B00080939A2CEC2DE095E0939B2CE02FE095B2 +:1069C000E0939C2CE42FE095E0939D2CE82FE0953C +:1069D000E0939E2CC0929F2C0093A02C4093A12C5E +:1069E0008093A22C88E08093B12C86C1903409F06A +:1069F00083C182E08093B12C8AE0F5CE833909F01F +:106A000093CC8091AC2E873009F0A1C043E050E0D8 +:106A100060E070E0CE0102960E942A0F88E8898328 +:106A2000F8019181903219F0903761F024C0F8019B +:106A300080833A8131832B8122839C819383232716 +:106A400082272AC1F8018281883809F055C19381D3 +:106A50008A81981351C194818B8198134DC195817E +:106A60008C81981349C184E0808361E070E0C801A3 +:106A700077D285E09FC0E92EE294EFE0EE22EA941F +:106A8000EA949F70F92E88E090E08F1991092FEF1A +:106A900030E0690102C0D594C7948A95E2F7F5E029 +:106AA000EF1629F084E0E8122AC0FF20E1F044E06C +:106AB00050E0B8016E5F7F4FCE0101960E941656DE +:106AC000892B61F49A818B81892798E889279C8199 +:106AD0008927F801968189278C2189F1F4E0EF124A +:106AE0000EC0F11009C144E050E0B8016E5F7F4F65 +:106AF000CE0101960E941656892B09F1FDC083E054 +:106B00008E1508F4F9C0F12CA701B8016E5F7F4F14 +:106B1000CE0101960E941656892B09F0EDC0D801CE +:106B2000AE0DBF1DE1E0F0E0EC0FFD1FEE0DFF1D0F +:106B300012969C9180818927C82209F0DDC098E8CF +:106B4000F80190833A8131832B812283A1C044E0F4 +:106B500050E060E070E007C0853909F0E5CB44E023 +:106B600050E063E070E0CE0101960E942A0FF80128 +:106B70008181803209F485C0803701F5F801928166 +:106B800089819813B9C093818A819813B5C0948183 +:106B90008B819813B1C095818C819813ADC0809181 +:106BA0008F2C808361E070E0C801DAD18FEF809391 +:106BB000922C86E08093B12C88E19FC0E82EE2946D +:106BC0007FE0E722EA94EA948F70F82E88E090E064 +:106BD0008F1991092FEF30E0690102C0D594C79455 +:106BE0008A95E2F7F5E0EF1629F084E0E8122AC072 +:106BF000FF20E1F044E050E0B8016E5F7F4FCE012E +:106C000001960E941656892B61F499818A81892701 +:106C10009B8189279C818927F801968189278C216E +:106C200081F1F4E0EF120EC0F11066C044E050E0D4 +:106C3000B8016E5F7F4FCE0101960E941656892BD8 +:106C400001F15AC083E08E1508F456C0F12CA7015B +:106C5000B8016E5F7F4FCE0101960E941656892BB8 +:106C600009F04AC0D801AE0DBF1DE1E0F0E0EC0F25 +:106C7000FD1FEE0DFF1D12969C9180818927C82271 +:106C8000D9F53981F80130832A8121839B81928350 +:106C90008C818383232792278927848388E22DC0D0 +:106CA000823C09F0CBC0F8018181803E09F0CFC061 +:106CB0008281843B09F0CBC046E050E06AEA74E090 +:106CC000CE0101960E942A0F89818B3409F03ACBBC +:106CD0008A81893709F036CB8B818B3109F032CB31 +:106CE0008C818A3E09F02ECB8D818B3709F02ACB1F +:106CF0008E818C3C09F026CB80E090E0DCC0F8016E +:106D00008081803621F06AE3C62ED12C03C050E387 +:106D1000C52ED12CF801818187FF0CC0807FF0E166 +:106D20008F9F7001112480ECC80ED11C46EFA42E59 +:106D3000B12C08C08C7F90E1899F7001112436E34B +:106D4000A32EB12CE091AE2EF091AF2E42E0B8010F +:106D500080E91995F801808181708093A72CC70183 +:106D600024E0969587952A95E1F78093A82CB501A4 +:106D70006E0D7F1D44E050E083E99CE20E942A0FE3 +:106D80008091A82C8093922C68E0CE0101960E94FD +:106D90007B0E8091AC2E44E050E0873019F463E024 +:106DA00070E002C060E070E0CE010F960E942A0FF2 +:106DB000B6016E0D7F1D46E050E0CE0109960E949F +:106DC0002A0F89818093A92C8A818093AA2C8B8198 +:106DD0008093AB2C8C818093AC2C60E489EA9CE29C +:106DE0000E94B3448091A92C8093AD2C8091AA2C51 +:106DF0008093AE2C8091AB2C8093AF2C8091AC2CE7 +:106E00008093B02C60E28DEA9CE20E94B34487E05C +:106E10008093B12C8981F80180838A8181838B8161 +:106E200082838C818383AE014F5F5F4FBE01615FC0 +:106E30007F4FCE010996F0D080E25FCF982F9F77E9 +:106E4000903329F0803A19F0805C833078F481E047 +:106E50008093B12C84E0F8018083E091AE2EF09114 +:106E6000AF2E40E060E070E082EC8BCBE091AE2E84 +:106E7000F091AF2E40E0DECC8A3069F4E091AE2E86 +:106E8000F091AF2E46E0B80184E81995C80CD91CE2 +:106E9000EA1CFB1C7CCD8C3009F079CDE091AE2E44 +:106EA000F091AF2E46E0B80187E8199570CD0E94A9 +:106EB0008B3F96E0FECC6296CDBFDEBFDF91CF91D7 +:106EC0001F910F91FF90EF90DF90CF90BF90AF9008 +:106ED0009F908F900895CF93DF932091AC2E273011 +:106EE00071F4EC0143E050E060E070E00E942A0F92 +:106EF00044E050E063E070E0CE01039604C044E05B +:106F000050E060E070E0DF91CF910C942A0FCF93B6 +:106F1000DF931F92CDB7DEB72091AC2E273029F436 +:106F200047E050E060E070E015C0FC013081218155 +:106F300023273281232733812327298344E050E00C +:106F400060E070E00E94780F41E050E064E070E0A3 +:106F5000CE0101960E94780F0F90DF91CF91089596 +:106F600020E42093D00026EC2093D5002093D40079 +:106F700021E02093D000DC01680F791FA617B70726 +:106F800041F0ED91F0E0EE51FA4FE491E093D3003F +:106F9000F5CFE091D500F0E0EE51FA4FE491EC939B +:106FA000E091D400F0E0EE51FA4FE4911196EC93A9 +:106FB0001092D000089520E42093D00026EC209376 +:106FC000D5002093D40021E02093D000DC01680F8D +:106FD000791FA617B70741F0ED91F0E0EE51FA4F97 +:106FE000E491E093D300F5CFE091D500F0E0EE51CD +:106FF000FA4FE4918C918E130AC0E091D400F0E036 +:10700000EE51FA4FE49181E011969C919E1380E03D +:107010001092D000817008958F929F92BF92CF926C +:10702000DF92EF92FF920F931F93CF93DF93DC01D8 +:107030008C91D12C30E08695D7948695379586959E +:10704000D794869537958695D79486953795869566 +:10705000D7948695379511968C9111978695D794EC +:10706000869537958695D794869537958695D79446 +:10707000869537958695D7948695379512968C91F7 +:107080001297F0E010E08695F7958695179586950E +:10709000F795869517958695F79586951795869514 +:1070A000F7958695179513968C9113978695F79576 +:1070B000869517958695F795869517958695F795F4 +:1070C000869517958695F7958695179514968C91C4 +:1070D000149790E020E0869597958695279586955C +:1070E0009795869527958695979586952795869564 +:1070F0009795869527951596EC91E6959795E69543 +:107100002795E6959795E6952795E6959795E695C3 +:107110002795E6959795E69527954B01DA014C5F03 +:107120005F4F0C91E401B9904E01B026C32FD0E01F +:10713000BE0162557F4D7B01612F70E062557E4D2F +:10714000E701F880EB0188816F2D682BE22EF12C8E +:10715000E701C255DD4D8881682B70E062577F4D95 +:10716000EB0188818695E7956F2F60718D2D817E6B +:107170006827892F80726827832F84796827812F59 +:1071800083776827822F8A736827F62EF2946F25FB +:10719000762F769576956727FB2CF6266695F6264C +:1071A0007D2D6F2F892FF694879567957795B694E7 +:1071B000C72ED12CE601C255DF4D6E01E62EF12C13 +:1071C000E701C255DE4D7E01E601F881E7019881B5 +:1071D000EF2EE92AC82ED12CE601C255DD4D98814B +:1071E000E92AF12CE701C257DF4D98819695E79582 +:1071F000F12FF071932F917EEF2EE926922F90724E +:10720000E926972F9479E926962F9377E926982FE8 +:107210009A73E926FE2CF294EF24CE2CC694C694E1 +:10722000EC24FB2CFE24E694FE24F6942795179577 +:107230003795B694C32ED12CE601C255DF4D6E01B1 +:10724000E12EF12CE701C255DE4D7E01E601F88109 +:10725000E7019881EF2EE92AC22ED12CE601C25512 +:10726000DD4D9881E92AF12CE701C257DF4D988165 +:107270009695E795F62FF071972F917EEF2EE926E0 +:10728000982F9072E926932F9479E926912F93777E +:10729000E926922F9A73E926FE2CF294EF24CE2C45 +:1072A000C694C694EC24FB2CFE24E694FE24F82F0E +:1072B000F694F79567957795B694872F90E0EC0153 +:1072C000C255DF4D862F90E082559E4DF880EC012F +:1072D00088818F29EF2EF12CE701C255DD4D988171 +:1072E000892B90E082579F4DEC0188818695E79528 +:1072F000912F9071832F817EE92EE826822F807254 +:10730000E826872F8479E826862F8377E8268F2F33 +:107310008A73E826FE2CF294EF24CE2CC694C694F1 +:10732000EC24FB2CFE24E694FE24F6942795179576 +:107330003795B694832F90E0EC01C255DF4D812F35 +:1073400090E082559E4DF880EC0188818F29E22ED5 +:10735000F12CE701C255DD4D9881892B90E08257D1 +:107360009F4DEC0188818695E795962F9071872F28 +:10737000817EF92EF8268F2F8072F826832F84794C +:10738000F826812F8377F826822F8A73F8269F2D7F +:107390009295F926EF2CE694E694FE249B2D9F25EA +:1073A000F6949F258F2F9695879567957795B69438 +:1073B000C72ED12CE601C255DF4D6E01E62EF12C11 +:1073C000E701C255DE4D7E01E601F881E7019881B3 +:1073D000EF2EE92AC82ED12CE601C255DD4D988149 +:1073E000E92AF12CE701C257DF4D98819695E79580 +:1073F000F12FF071932F917EF927922F9072F92738 +:10740000972F9479F927962F9377F927982F9A73C6 +:10741000F9279F2F9295F927FF2EF694F694FF25D2 +:107420009B2D9F27F6959F2796952795179537951E +:10743000B694C32ED12CE601C255DF4D6E01E12E6C +:10744000F12CE701C255DE4D7E01E601F881E7012E +:107450009881EF2EE92AC22ED12CE601C255DD4DCE +:107460009881E92AF12CE701C257DF4D9881969562 +:10747000E795F62FF071972F917E9F27F82FF072E6 +:107480009F27F32FF4799F27F12FF3779F27F22F70 +:10749000FA739F27F92FF2959F27F92FF695F69506 +:1074A0009F27FB2DF9279695F927982F8F2F8695E3 +:1074B000979567957795D72EF62F672F70E0EB019C +:1074C000C255DF4D6F2F70E062557E4DF880EB01A5 +:1074D00088816F2D682BE92EF12CE701C255DD4D17 +:1074E0008881682B70E062577F4DEB01888186951B +:1074F000E795632F617E812F80718627622F6072EE +:1075000086276D2D647986276F2F63778627692FED +:107510006A738627682F62958627682F6695669519 +:107520008627B694B8268695B826812FB6942795D7 +:1075300087953795182F0E270D934A175B0709F08B +:10754000F0CDD092B22CF093B32C9093B42C309316 +:10755000B52C8093B62C2093B72CDF91CF911F913F +:107560000F91FF90EF90DF90CF90BF909F908F9002 +:1075700008958F929F92AF92BF92CF92DF92EF9237 +:10758000FF920F931F93CF93DF93FC01C62FF42E2E +:10759000B52F8081A0E050E0869557958695A795F8 +:1075A000869557958695A795869557958695A7951F +:1075B000869557958695A795818186955795869549 +:1075C000A795869557958695A795869557958695FF +:1075D000A795869557958695A795828130E040E0DE +:1075E00086954795869537958695479586953795DF +:1075F00086954795869537958695479586953795CF +:107600008381869547958695379586954795869586 +:1076100037958695479586953795869547958695AE +:107620003795648190E080E066958795669597959B +:1076300066958795669597956695879566959795CE +:107640006695879566959795B5806B2D6695879518 +:1076500066959795669587956695979566958795AE +:10766000669597956695879566959795B62EEA2FB8 +:10767000F0E0E255FF4D032F10E002551E4DD08182 +:10768000F8016081D62B092F10E002551D4DF8013D +:107690006081ED2FE62BF0E0E257FF4DC0800C2F0C +:1076A000172FCF2DDB2F7E01F4E0EF0EF11C788138 +:1076B000F801B1918F01B7276B2DC6946795F42F10 +:1076C000F071E52FE17EFE27E82FE072FE27EA2F1A +:1076D000E479FE27E32FE377FE27E92FEA73FE27FD +:1076E000EF2FE295FE27DF2ED694D694FD25EB2FC3 +:1076F000EF27F695EF2720FDEC25E6958795479532 +:107700005795B695C52ED12CF601E255FF4D6F0168 +:10771000A42EB12CF501E255FE4D5F01F601D0809B +:10772000F501C080DC28E82FF0E0E255FD4DF08146 +:10773000ED2DEF2BF0E0E257FF4DC080C69467952A +:10774000F32FF071EA2FE17EFE27E92FE072FE278A +:10775000E52FE479FE27E42FE377FE27E82FEA738D +:10776000FE27EF2FE295FE27DF2ED694D694FD2537 +:10777000EB2FEF27F695EF27DA2E20FDEC25E69587 +:1077800097953795D794CB2EC694AD2DB0E0A255E2 +:10779000BF4DE32FF0E0E255FE4DAC91E081EA2BC6 +:1077A000A92FB0E0A255BD4DFC91EF2BF0E0E257C0 +:1077B000FF4DB081B6956795F42FF071E52FE17E0E +:1077C000FE27E82FE072FE27ED2DE479FE27E32F58 +:1077D000E377FE27E92FEA73FE27EF2FE295FE27D6 +:1077E000AF2FA695A695FA27EC2DEF27F695EF2754 +:1077F00020FDEB27E695879547955795C694A52FCD +:10780000B0E0A255BF4DE42FF0E0E255FE4DAC9143 +:10781000E081EA2BA82FB0E0A255BD4DFC91EF2BE3 +:10782000F0E0E257FF4DB081B6956795F32FF07108 +:10783000ED2DE17EFE27E92FE072FE27E52FE479AA +:10784000FE27E42FE377FE27E82FEA73FE27EF2FCA +:10785000E295FE27AF2FA695A695FA27EC2DEF27E8 +:10786000F695EF2720FDEB27E69597953795D7946A +:10787000C694AD2DB0E0A255BF4DE32FF0E0E25528 +:10788000FE4DAC91E081EA2BA92FB0E0A255BD4D91 +:10789000FC91EF2BF0E0E257FF4DB081B695679574 +:1078A000F42FF071E52FE17EFE27E82FE072FE272E +:1078B000ED2DE479FE27E32FE377FE27E92FEA7326 +:1078C000FE27EF2FE295FE27AF2FA695A695FA2764 +:1078D000EC2DEF27F695EF2720FDEB27E695879512 +:1078E00047955795C694A52FB0E0A255BF4DE42FFC +:1078F000F0E0E255FE4DAC91E081EA2BA82FB0E01C +:10790000A255BD4DFC91EF2BF0E0E257FF4DB08149 +:10791000B6956795F32FF071ED2DE17EFE27E92FE7 +:10792000E072FE27E52FE479FE27E42FE377FE27B8 +:10793000E82FEA73FE27EF2FE295FE27AF2FA695DB +:10794000A695FA27EC2DEF27F695EF2720FDEB27DC +:10795000E69597953795D794C694ED2DF0E0E255CE +:10796000FF4DA32FB0E0A255BE4DF081EC91EF2B5F +:10797000A92FB0E0A255BD4DFC91EF2BF0E0E257EE +:10798000FF4DB081B6956795F42FF071E52FE17E3C +:10799000FE27E82FE072FE27ED2DE479FE27E32F86 +:1079A000E377FE27E92FEA73FE27EF2FE295FE2704 +:1079B000AF2FA695A695FA27EC2DEF27F695EF2782 +:1079C00020FDEB27E695879547955795A52FB0E0C5 +:1079D000A255BF4DE42FF0E0E255FE4DAC91E081A1 +:1079E000EA2BA82FB0E0A255BD4DFC91EF2BF0E0A3 +:1079F000E257FF4DF081F6956795B62EED2DE17EAD +:107A0000632F60716E27E92FE0726E27E52FE4790E +:107A10006E27E42FE3776E27E82FEA736E27E62FB1 +:107A2000E2956E27E62FE695E6956E27C694C62664 +:107A30006695C62620FDCF26C69497953795D79490 +:107A4000AD2DCD2CD12CF601E255FF4D6F01832ECB +:107A5000912CF401E255FE4D4F01F601B081F40185 +:107A60006081B62BC92ED12CF601E255FD4D608107 +:107A7000EB2FE62BF0E0E257FF4DC080E72FF0E060 +:107A8000EE51FB4FE491EC25EC837B257993EC16CA +:107A9000FD0609F00CCE5093B22C4093B32C80938A +:107AA000B42CA093B52C3093B62C9093B72CDF91C7 +:107AB000CF911F910F91FF90EF90DF90CF90BF90EB +:107AC000AF909F908F900895BF92CF92DF92EF92E8 +:107AD000FF920F931F93CF93DF93A091B22C5091FD +:107AE000B32C1091B42C4091B52C3091B62C209130 +:107AF000B72CFC01BC016C5F7F4F0191952F9071F9 +:107B00008A2F817E9827812F80729827842F8479ED +:107B10009827832F83779827822F8A739827892F16 +:107B200082959827892F869586959827C42ED12CE3 +:107B3000E601C255DF4D6E01E32EF12CE701C2557F +:107B4000DE4D7E01E601B881E7018881B82BE22E87 +:107B5000F12CE701C255DD4D8881CB2FC82BD0E039 +:107B6000C257DF4DB881B027B92796959B27069558 +:107B7000812F969587955795A795B32FB071942F20 +:107B8000917EB927922F9072B9279A2F9479B927AD +:107B9000952F9377B927982F9A73B9279B2F929592 +:107BA000B9279B2F96959695B927CA2ED12CE60119 +:107BB000C255DF4D6E01E52EF12CE701C255DE4DB9 +:107BC0007E01E6011881E7019881192BE82EF12C3E +:107BD000E701C255DD4D9881C12FC92BD0E0C257B6 +:107BE000DF4D988190279B27B695B927B02EB69484 +:107BF000922FB695979537954795B52FB0712A2F47 +:107C0000217EB227282F2072B227242F2479B22771 +:107C1000232F2377B227292F2A73B2272B2F2295C0 +:107C2000B2272B2F26952695B227C42FD0E08E01A0 +:107C300002551F4D6801C32FD0E08E0102551E4D25 +:107C40007801E6010881E7012881022BE92EF12C59 +:107C5000E701C255DD4D2881022B10E002571F4D70 +:107C6000E8012881C22FCB25CB27B695BC272B2D29 +:107C70002695B69587955795A795C32FC071B42FB4 +:107C8000B17EBC27C92FC072BC27CA2FC479BC27BC +:107C9000C52FC377BC27C82FCA73BC27CB2FC2956B +:107CA000BC27CB2FC695C695BC27CA2FD0E0C2559E +:107CB000DF4D052F10E002551E4DF880E8011881B8 +:107CC000F12A082F10E002551D4DE8011881CF2D33 +:107CD000C12BD0E0C257DF4DC881C227CB27B69554 +:107CE000BC272695B695979537954795C52FC071B2 +:107CF000BA2FB17EBC27C82FC072BC27C42FC4794D +:107D0000BC27C32FC377BC27C92FCA73BC27CB2F6F +:107D1000C295BC27CB2FC695C695BC27C42FD0E0F3 +:107D2000C255DF4D032F10E002551E4DF880E801CB +:107D30001881F12A092F10E002551D4DE801188124 +:107D4000CF2DC12BD0E0C257DF4DC881C227CB2732 +:107D5000B695BC272695B69587955795A795D32FA9 +:107D6000D071B42FB17EDB27B92FB072DB27BA2FC9 +:107D7000B479DB27B52FB377DB27B82FBA73DB27AE +:107D8000BD2FB295DB271D2F169516951D27CA2EE0 +:107D9000D12CE601C255DF4D6E01E52EF12CE70135 +:107DA000C255DE4D7E01E6010881E701B8810B2B4B +:107DB000E82EF12CE701C255DD4DB881C02FCB2B49 +:107DC000D0E0C257DF4DB881B227B127D12FD69569 +:107DD000DB27B22EB694D695979537954795D52F34 +:107DE000D0712A2F217ED227282F2072D227242F2C +:107DF0002479D227232F2377D227292F2A73D2271A +:107E00002D2F2295D2272D2F26952695BD2FB227CF +:107E1000C42FD0E08E0102551F4D6801C32FD0E062 +:107E20008E0102551E4D7801E6010881E701288187 +:107E3000022BE92EF12CE701C255DD4D2881022BE2 +:107E400010E002571F4DE80118811B251B27DB2F6F +:107E5000D695D127D69587955795A795182F242F76 +:107E6000217E832F80712827892F807228278A2FCF +:107E700084792827852F83772827812F8A732827BD +:107E8000B22FB2952B27B22FB695B6952B27EA2E97 +:107E9000F12CE701C255DF4D7E01C52ED12CE60144 +:107EA000C255DE4D6E01E701E880E6018881E82ACF +:107EB000C12ED12CE601C255DD4D8881E82AF12C76 +:107EC000E701C257DF4DB6948881CB2DC827C22762 +:107ED0002695B22FBC272B2F26959795379547953A +:107EE000292F6E177F0709F008CEA093B22C50936C +:107EF000B32C1093B42C4093B52C3093B62C9093A4 +:107F0000B72CDF91CF911F910F91FF90EF90DF90F1 +:107F1000CF90BF900895CF93DF93E2EBFCE2A08176 +:107F200071816281338124819581472F40718A2F2D +:107F3000817E8427462F40728427432F44798427EB +:107F4000422F43778427492F4A738427482F42952D +:107F50008427482F469546958427482F46958427A1 +:107F6000869567957795A795C32FD0E0C255DF4DCD +:107F7000422F50E042555E4DB881EA018881B82B0E +:107F8000492F50E042555D4DEA018881CB2FC82B27 +:107F9000D0E0C25BDF4D88818695522F5071432F10 +:107FA000417E4527592F507245275A2F547945272E +:107FB000572F53774527562F5A734527542F5295DD +:107FC0004527542F569556954527542F56954527A6 +:107FD0004695979527953795CA2FD0E0C255DF4D26 +:107FE000472F50E042555E4DB881EA014881B42BDD +:107FF000462F50E042555D4DEA014881CB2FC42BFE +:10800000D0E0C25BDF4D4881842B8695572F50719D +:108010004A2F417E4527562F50724527532F5479BA +:108020004527522F53774527592F5A734527542FE9 +:1080300052954527542F569556954527542F5695BA +:108040004527469567957795A795C32FD0E0C255EC +:10805000DF4D422F50E042555E4DB881EA01488124 +:10806000B42B492F50E042555D4DEA014881CB2F9A +:10807000C42BD0E0C25BDF4D4881842B8695CA2F8C +:10808000D0E0C255DF4D472F50E042555E4DB881DC +:10809000EA014881B42B462F50E042555D4DEA017C +:1080A0004881CB2FC42BD0E0C25BDF4D4881842BAD +:1080B000532F517E422F40714527592F507245272B +:1080C0005A2F54794527572F53774527562F5A73E0 +:1080D0004527542F52954527542F56955695452799 +:1080E000542F569545274695979527953795A08304 +:1080F00071836283338324839583DF91CF910895C5 +:10810000BF92CF92DF92EF92FF920F931F93CF9384 +:10811000DF935091B22CC091B32CB090B42C40910D +:10812000B52C3091B62C2091B72CFC01615008F48D +:10813000EAC19C2F9071852F817E98278B2D8072AC +:108140009827842F84799827832F83779827822FE5 +:108150008A739827892F82959827792F7695769517 +:108160009727892F86959827AC2F8B2D96958795E5 +:10817000A7955795C42FD0E0C255DF4D032F10E0CF +:1081800002551E4D7881E8019881792B022F10E06D +:1081900002551D4DE8019881C72FC92BD0E0C25967 +:1081A000DF4D18811695732F7071942F917E97274C +:1081B000722F70729727752F747997277A2F73779C +:1081C0009727782F7A739727792F72959727792F8A +:1081D000769576959727792F76957927922F272F61 +:1081E0002695979537954795C52ED12CE601C25512 +:1081F000DF4D6E01EA2EF12CE701C255DE4D7E0106 +:10820000E6017881E7012881722BE82EF12CE70145 +:10821000C255DD4D2881C72FC22BD0E0C259DF4D9A +:108220002881122B16957A2F7071252F217E2727F2 +:10823000782F70722727742F74792727732F7377FD +:108240002727792F7A732727722F72952727722F66 +:10825000769576952727722F76952727BA2F26951C +:108260008795B7955795C42ED12CE601C255DF4DA1 +:108270006E01E32EF12CE701C255DE4D7E01E601D1 +:108280007881E7012881722BE92EF12CE701C25594 +:10829000DD4D2881C72FC22BD0E0C259DF4DA88108 +:1082A000A12BA695732F7071242F217E2727792F5C +:1082B00070722727752F747927277B2F73772727CD +:1082C000782F7A732727722F72952727722F76952A +:1082D00076952727722F76957227232F372F36957D +:1082E000979527954795C52FD0E0C255DF4D0B2FA9 +:1082F00010E002551E4D7881E8013881732B082F5C +:1083000010E002551D4DE8013881C72FC32BD0E086 +:10831000C259DF4DD881AD2BA6957B2F7071352FBB +:10832000317E3727782F70723727742F747937276B +:10833000722F73773727792F7A733727732F7295B8 +:108340003727732F769576953727732F76953727AE +:1083500036958795B7955795C42FD0E0C255DF4D18 +:10836000022F10E002551E4D7881E8013881732BF1 +:10837000092F10E002551D4DE8013881C72FC32B8E +:10838000D0E0C259DF4DD881AD2BA695722F707108 +:10839000342F317E7327392F30727327352F34797C +:1083A00073273B2F33777327382F3A737327372F71 +:1083B00032957327372F369536957327372F369595 +:1083C0007327342F7695979527953795C52FD0E04D +:1083D000C255DF4D0B2F10E002551E4D7881E8018C +:1083E0004881742B082F10E002551D4DE80148818B +:1083F000C72FC42BD0E0C259DF4DD881DA2BD695D8 +:108400007B2F7071452F417E7427482F407274274F +:10841000432F44797427422F43777427492F4A7397 +:108420007427472F42957427A72FA695A6957A27DC +:10843000472F469574274B2F7695879547955795E7 +:10844000C42FB82EA32FB0E08D0102551F4D680137 +:10845000A22FB0E08D0102551E4D7801D6010C917E +:10846000D7018C91082BE92EF12CD701A255BD4DD7 +:108470008C91082B10E002591F4DD8018C91D82BFC +:10848000D695732F717E822F80717827892F807205 +:108490007827852F84797827842F837778278B2DE9 +:1084A0008A737827872F82957827A72FA695A69578 +:1084B0007A27872F86957827432F322F272F2695C7 +:1084C000979537954795292F852F90E082559F4D99 +:1084D0000C2F10E002551E4DDC019C91D8018C91AF +:1084E000892B0B2D10E002551D4DD8019C91892B35 +:1084F00090E082599F4DDC019C918D2F892B9081BA +:108500008927819313CE5093B22CC093B32CB09291 +:10851000B42C4093B52C3093B62C2093B72CDF911C +:10852000CF911F910F91FF90EF90DF90CF90BF9070 +:108530000895EF92FF920F931F93CF93DF93709163 +:10854000B22C5091B32C2091B42C4091B52C309189 +:10855000B62CC091B72CE42FF0E0E255FF4DA32FCD +:10856000B0E0A255BE4DF081EC91EF2BAC2FB0E006 +:10857000A255BD4DFC91EF2BF0E0E257FF4D10816D +:10858000DC01D0E0615008F4DBC11695D795952F3A +:108590009071872F817E8927922F90728927942F3F +:1085A00094798927932F937789279C2F9A7389270A +:1085B000982F92958927E82FE695E6958E27982F94 +:1085C000969589278695279557957795D695932FD4 +:1085D0009071842F817E89279C2F90728927972FF5 +:1085E00094798927952F93778927922F9A738927D2 +:1085F000982F92958927E82FE695E6958E27982F54 +:10860000969589279C2F8695979537954795E72FBF +:10861000F0E0E255FF4D052F10E002551E4DC081E0 +:10862000F8018081C82B022F10E002551D4DF80182 +:108630008081EC2FE82BF0E0E259FF4D8081D82BB0 +:10864000D695E52FE071872F817E8E27E22FE0728D +:108650008E27E42FE4798E27E32FE3778E27E92F07 +:10866000EA738E27E82FE2958E27E82FE695E695A8 +:108670008E27E82FE6958E2786952795579577952F +:10868000E42FF0E0E255FF4D032F10E002551E4DA0 +:10869000C081F8018081C82B092F10E002551D4DC3 +:1086A000F8018081EC2FE82BF0E0E259FF4D80814A +:1086B000D82BD695E32FE071842F817E8E27E92F6A +:1086C000E0728E27E72FE4798E27E52FE3778E2758 +:1086D000E22FEA738E27E82FE2958E27E82FE695A2 +:1086E000E6958E27E82FE6958E2786959795379500 +:1086F0004795E72FF0E0E255FF4D052F10E00255BA +:108700001E4DC081F8018081C82B022F10E0025558 +:108710001D4DF8018081EC2FE82BF0E0E259FF4D70 +:108720008081D82BD695E52FE071872F817E8E270B +:10873000E22FE0728E27E42FE4798E27E32FE37790 +:108740008E27E92FEA738E27E82FE2958E27E82FF0 +:10875000E695E6958E27E82FE6958E278695279550 +:1087600057957795E42FF0E0E255FF4D032F10E089 +:1087700002551E4DC081F8018081C82B092F10E0E1 +:1087800002551D4DF8018081EC2FE82BF0E0E259F5 +:10879000FF4D8081D82BD695E32FE071842F817E09 +:1087A0008E27E92FE0728E27E72FE4798E27E52FB9 +:1087B000E3778E27E22FEA738E27E82FE2958E2744 +:1087C000E82FE695E6958E27E82FE6958E27869585 +:1087D000979537954795E72FF0E0E255FF4D052F28 +:1087E00010E002551E4DC081F8018081C82B022F78 +:1087F00010E002551D4DF8018081EC2FE82BF0E0D0 +:10880000E259FF4D8081D82BD695E52FE071872F57 +:10881000817E8E27E22FE0728E27E42FE4798E2767 +:10882000E32FE3778E27E92FEA738E27E82FE2956F +:108830008E27E82FE695E6958E27E82FE6958E277A +:108840008695279557957795E42FF0E0E255FF4DF3 +:10885000032F10E002551E4DC081F8018081C82B06 +:10886000092F10E002551D4DF8018081EC2FE82BF7 +:10887000F0E0E259FF4D8081D82BD695E72FF0E04C +:10888000E255FF4D052F10E002551E4DC081F80145 +:108890008081C82B022F10E002551D4DF801808108 +:1088A000EC2FE82BF0E0E259FF4D8081D82BE42F2C +:1088B000E17E832F8071E827892F8072E827872F38 +:1088C0008479E827852F8377E827822F8A73E82722 +:1088D0008E2F8295E8278E2F86958695E8278E2FF6 +:1088E0008695E827E695979537954795C92FE42F04 +:1088F000F0E0E255FF4D832F90E082559E4D1081B0 +:10890000FC018081182B8C2F90E082559D4DFC013D +:108910008081E12FE82BF0E0E257FF4D10818C9130 +:10892000E82FF0E0EE51FB4FE4917D01F0E8EF0E0F +:10893000F11C9E2F9127F70190838D278D9322CED6 +:108940007093B22C5093B32C2093B42C4093B52C3D +:108950003093B62CC093B72CDF91CF911F910F911C +:10896000FF90EF9008950F931F93FC01862F408195 +:108970005181628173818B0122273327803208F471 +:1089800071C0D80123E0B695A7952A95E1F70A278B +:108990001B2798013695279536952795BBE0769548 +:1089A000679557954795BA95D1F70227132720E089 +:1089B00030E095E1000F111F221F331F9A95D1F768 +:1089C000402B512B622B732B8B0122273327D8018D +:1089D00033E0B695A7953A95E1F70A271B2798014A +:1089E0003695279536952795BBE0769567955795EB +:1089F0004795BA95D1F70227132720E030E095E19B +:108A0000000F111F221F331F9A95D1F7402B512BB6 +:108A1000622B732B8B0122273327D80133E0B695C5 +:108A2000A7953A95E1F70A271B27980136952795D0 +:108A300036952795BAE07695679557954795BA95F7 +:108A4000D1F70227132720E030E096E1000F111F35 +:108A5000221F331F9A95D1F7402B512B622B732B7A +:108A6000805289CF40835183028373831F910F917A +:108A70000895AF92BF92CF92DF92EF92FF920F9341 +:108A80001F93CF93DF936730710509F451C09B01A9 +:108A900027703327232B09F04EC05B016C01EB01DB +:108AA00083E0D695C7958A95E1F77B0196E0F69429 +:108AB000E7949A95E1F7EC0EFD1EEC0CFD1C8E017F +:108AC000015011090C0D1D1DA701401B510B60E049 +:108AD00070E0C80101960E943D560C151D0520F15D +:108AE000D801EC91F0E0EE51FB4F2491D701CD017C +:108AF0000A171B0768F4FC018081982F990F8E914B +:108B0000881F8827881F892B11968C931197EFCF88 +:108B100011968C9111978E7FE22FE170E82B1196C0 +:108B2000EC9301501109D9CFC5018C0F9D1F04C0D2 +:108B300087E090E001C0CB01DF91CF911F910F91B1 +:108B4000FF90EF90DF90CF90BF90AF900895CF93BC +:108B5000DF93EC0182EC888361E070E0CE010E943B +:108B6000B0378AE08093922D1092932D68E170E0E7 +:108B7000CE01DF91CF917DCFEF92FF920F931F93A4 +:108B8000CF93DF93EC01CB0167307105E1F169E030 +:108B900070E00E946D55DE0180E090E008E010E09A +:108BA0008617970751F1FC0133E0F695E7953A9562 +:108BB000E1F7E80FF91FAC0147705527EC0FFD1FD7 +:108BC000208130E0042E02C0359527950A94E2F703 +:108BD0002C934115510571F0E181F0E07801E41A20 +:108BE000F50AA7017F0102C0EE0CFF1C4A95E2F7CF +:108BF0002E292C9301961196D3CF23E0880F991F2D +:108C00002A95E1F702C087E090E0DF91CF911F91B4 +:108C10000F91FF90EF900895EF92FF920F931F93A3 +:108C2000CF93DF939C01CB016730710509F440C0FD +:108C300069E070E00E946D5580E090E048E050E00F +:108C400086179707A9F1DC01E3E0B695A795EA95A9 +:108C5000E1F7A80FB91FEC01C770DD27A20FB31F02 +:108C6000EC91F0E00C2E02C0F595E7950A94E2F73E +:108C7000209759F011960C9111977A01EC1AFD0A80 +:108C800001C0000FEA94EAF7E02BF0E0EE51FB4F51 +:108C9000E4911196AC91B0E002C0B595A795CA9544 +:108CA000E2F7ED01CE27FE01E0FD04C00196C8CF3A +:108CB00081E001C080E0DF91CF911F910F91FF9083 +:108CC000EF9008951092922D08951092922D109287 +:108CD000B82C1092932D0895F8DF0E940E2C10925C +:108CE000922D089508950895DC0123E633E661503E +:108CF000E8F04D91942F922780E1989FA0011124D4 +:108D00004927E42FF0E0232F332742954F70C90104 +:108D10008427AC013E2F22272427352743E0EE0F7E +:108D2000FF1F4A95E1F72E273F27E1CFC90108959C +:108D3000EF92FF921F93CF93DF93EC017B01809121 +:108D4000932D882339F08091922D823008F0DBC07A +:108D50001092932DE114F10461F0B701CE015CDFB4 +:108D6000882309F4D3C0B701CE0106DF7C0181E07E +:108D700001C082E01091922D163090F4133070F5FE +:108D80001230A8F484E090E080931E2090931F207E +:108D900082E5888382E08093922D87E090E0C7C0CF +:108DA000193008F467C01A3009F496C0ACC090E1DD +:108DB000E916F10411F480FD03C01092922D92C0C7 +:108DC000888199818093842D9093852D83E9888370 +:108DD00080E2898383E08093922D6AC080FFEDCF8B +:108DE00088E2E816F10448F32881898182279A8174 +:108DF00089279B8189279C818913DFCFA12FB0E030 +:108E00001397CD01880F991FA80FB91FA957B24D0D +:108E1000283821F483E0FE01319602C084E0FE018F +:108E200001900D928A95E1F745E050E0BE01CE0138 +:108E300002960E942C56133021F0143021F485E95B +:108E400003C083E901C087E9888380E7898367E0FD +:108E500070E0CE010E94B0378091922D8D5F80939B +:108E6000922D68E470E0CE01DF91CF911F91FF90C9 +:108E7000EF90FFCD80FFA1CF98E1E916F10409F052 +:108E80009CCF63E0CE0130DF009709F096CF2881B8 +:108E900022FF11C0183079F0163011F485E901C0B5 +:108EA00087E9888380E289832EEF210F2093922D1A +:108EB00060E170E0D8CF21E02093932D212F30E0A6 +:108EC00026503109322F330F230F2C5F2093912D21 +:108ED00028812093862D2BC0982F927031F081E04D +:108EE0008093922D0E94072C0EC080FF05C063E086 +:108EF000CE01FADE892B99F3CE01DF91CF911F913C +:108F0000FF90EF9024CE80E090E011C0A701495F70 +:108F10005F4F83E0569547958A95E1F7E091AE2E35 +:108F2000F091AF2EBE0181EC199580E023CFDF9147 +:108F3000CF911F91FF90EF9008959F92AF92BF92B3 +:108F4000CF92DF92EF92FF920F931F93CF93DF9315 +:108F5000CDB7DEB7C756D109CDBFDEBF8C017B01CF +:108F6000FB0160817181E4DED090932DDD2009F456 +:108F700045C18091922D9AEF980F933008F057C019 +:108F8000F80180818072C82E1092742D5DE4A52EA8 +:108F900051E1B52E912C47E650E0B501CE01019686 +:108FA0000E94F5558B81882349F029813A8180916F +:108FB000842D9091852D28173907B9F48D81882348 +:108FC00029F09C818091862D98130FC08F8988236A +:108FD00011F0CC2051F0E091742D81E08E0F809340 +:108FE000742DF0E0EB58F24D90829394F7E6AF0EBB +:108FF000B11C8FE09812CFCFC1100DC08091922D7F +:109000009AEF980F943008F0AEC02091742DE5E7E8 +:10901000FDE280E08FC080EEF801808380E88183EC +:1090200062E070E0C8010E94B03789E095C08930E5 +:1090300029F7F70160817181C801EEDDF7016081D8 +:109040007181811115C0CB01089667E070E00E9424 +:109050006D55462FE091AE2EF091AF2EB80181EC08 +:109060001995C80174DDF70180839183D12CC9C0A3 +:10907000C80182DDF70180839183F8016081262F8A +:1090800030E043E0969587954A95E1F702972817D7 +:10909000390739F76E5FC80127DE892B11F7C12C1C +:1090A00097E6992E5801FFEFAF1ABF0A8091742DF1 +:1090B000C81608F0A3CFEC2DF0E0EB58F24D60811C +:1090C000969EB0011124635B7E4E47E650E0CE01D0 +:1090D00001960E94F5558F89882349F14E8950E009 +:1090E000F801808190E001974817590741F02091DD +:1090F000742D422F50E0415051093C2D08C0B5015C +:10910000CE0106960E941656892B89F710C0832F30 +:1091100090E0841795073CF4FC01EB58F24D8181F7 +:1091200080833F5FF4CF21502093742DCA94C39461 +:10913000BDCF8F5F821709F464C091919450923033 +:10914000C0F782E0F801808380E6818362E070E00E +:10915000C8010E94B0378BE08093922D60E270E0EE +:10916000C80187DC80CF8B3009F04BC0F7016081EC +:1091700071816115710509F43EC0C8014DDDD82E1D +:10918000F70160817181811113C0CB01089667E0FE +:1091900070E00E946D55462FE091AE2EF091AF2EFB +:1091A000B80181EC19951092742DC801D0DC26C04D +:1091B000C801E2DCF70180839183BC0183E07695EE +:1091C00067958A95E1F7C8018FDD892B19F0109218 +:1091D000742D47CFF8018581882331F0813059F40F +:1091E0008093742D85E004C081E08093742D84E029 +:1091F0008093752D06C01092742D03C0F7018083F3 +:1092000091838D2DC959DF4FCDBFDEBFDF91CF9147 +:109210001F910F91FF90EF90DF90CF90BF90AF9094 +:109220009F9008955F926F927F928F929F92AF92DC +:10923000BF92CF92DF92EF92FF920F931F93CF9343 +:10924000DF93CDB7DEB7C254D240CDBFDEBF7C01C5 +:10925000CF5BDD4F68837983C154D2408091B82CB5 +:10926000843009F48BC140F4823009F4D6C008F090 +:1092700060C1813051F08CC4863009F41EC308F4FB +:1092800046C2873009F4C8C383C40091942E10915C +:10929000952E01151105C1F0A801495F5F4F63E0EC +:1092A000569547956A95E1F764E97DE2C7010E940A +:1092B00023566091942E7091952EC701DADB10929F +:1092C000942E1092952E21C2CF5BDD4F688179815B +:1092D000C154D2406115710509F4C7C0C7019CDCB7 +:1092E000D82ECF5BDD4F68817981C154D240C70150 +:1092F00043DCCF5BDD4F88839983C154D2409C010E +:10930000295F3F4FC901880F991F53E096958795B4 +:109310005A95E1F706968138910578F064EB73E28F +:10932000CE0101960E944F561092B82CBE016F5F7D +:109330007F4F85E60E94DE226BC4B3E03695279509 +:10934000BA95E1F7A70160E870E0CE0101960E94AE +:10935000950E7C01CF5BDD4F8881C154D240CE5B3E +:10936000DD4F9881C254D240CF5FDD4F9883C1500A +:10937000D240CE5FDD4F8883C250D24083EC93E26F +:109380009F938F9380E8A82EB12CC5018E199F0959 +:109390009F938F9381E090E08C0F9D1F8E0D9F1DFA +:1093A0009F938F930E945656E80EF91EB5016E19D1 +:1093B0007F0922E030E0AE014F5F5D4F81E090E039 +:1093C0008C0F9D1F8E0D9F1D0E94950E8E0D9F1D53 +:1093D0000F900F900F900F900F900F909501281BFA +:1093E000390B41E050E04C0F5D1F840F951FD110E9 +:1093F00003C046EC53E202C045ED53E25F934F9346 +:109400003F932F939F938F930E9456560F900F90E8 +:109410000F900F900F900F9087CF0091942E109186 +:10942000952E01151105C1F0A801495F5F4FA3E01A +:1094300056954795AA95E1F764E97DE2C7010E9438 +:1094400023569091942E8091952E1092942E1092E6 +:10945000952E092F182FDCC3CF5BDD4F2881398172 +:10946000C154D2402115310551F488E0E9E4F4E219 +:10947000DE01119601900D928A95E1F755CF295F93 +:109480003F4FE3E036952795EA95E1F7A70160E8BD +:1094900070E0CE0101960E94950E7C01CF5BDD4FFE +:1094A0008881C154D240CE5BDD4F9881C254D240F6 +:1094B000CF5FDD4F9883C150D240CE5FDD4F8883B0 +:1094C000C250D24083EC93E29F938F93F0E8CF2E6B +:1094D000D12CC6018E199F099F938F9381E090E054 +:1094E0008C0F9D1F8E0D9F1D9F938F930E9456562C +:1094F0008E0D9F1DB601681B790B22E030E0AE0196 +:109500004F5F5D4FA1E0B0E0AC0FBD1F8A0F9B1F06 +:109510000E94950E1092B82CBE016F5F7F4F85E6BA +:109520000E94DE220F900F900F900F900F900F90DF +:109530006FC3CF5BDD4F68817981C154D240C701D1 +:10954000F7DB2091932D222309F425C32091912D3F +:1095500030E047E85DE264E170E0CE0101960E94F0 +:10956000950EBE016F5F7F4F85E60E94DE2210924E +:10957000932D1092B82C0E9474230AC38091732DEE +:10958000811108C080E890E00E94C12381E08093AF +:10959000732D7BC0813009F07AC08091922D82308A +:1095A00008F075C08091722D8F5F8093722D80318D +:1095B00009F06DC00E94CC238C019350409768F055 +:1095C0000115B8E01B0708F460C0E0E1F0E020E01E +:1095D00030E0A12CB12C60E040C0AAEFBCE240E03A +:1095E00050E020E030E080E090E0E0E0F0E060E09B +:1095F0007D91703149F44732510509F405C3611179 +:109600000EC0FA0161E00BC0662349F0BA016E1B7F +:109610007F0B6817790710F09F01CB0160E04F5F67 +:109620005F4F4832510521F78430910508F03BC265 +:109630002CC0D601ED906D01F12CEE16FF06B0F4B2 +:10964000611119C04F5F5F4F4837510591F700977F +:1096500009F029C2319709F426C27AEFC72E7CE2BD +:10966000D72E40E050E080E090E0E3CF6111EACFF8 +:109670005A0161E0E7CFBA016A197B0968177907D7 +:1096800010F09501CB0160E0DDCF1092722DCF5B21 +:10969000DD4F68817981C154D240C70149DB2091F7 +:1096A000932D222309F477C2E091B12EF091B22ECE +:1096B0000284F385E02DE058F10954E0F695E79532 +:1096C0005A95E1F7E650F34D80818F5F808380915A +:1096D000722D803121F40E94CC231092722D1092B1 +:1096E000922D0E94072C80E5F7018083118262E0B1 +:1096F00070E0C7010E94B03781E08093922D1092F4 +:10970000932D60E270E0C701B4D98C0181C2CF5BB8 +:10971000DD4F68817981C154D240C70109DB2091B6 +:10972000932D222309F437C2D090F92CDD2009F4BF +:1097300045C0CF5BDD4F08811981C154D24001156E +:10974000110549F41092F92C1092932D1092922D3C +:109750000E94072C5DC2023A110538F0B801C7011A +:109760005BDA01E08027082F02C001E010E0CF5B48 +:10977000DD4F68817981C154D240C701FDD9CF5BEB +:10978000DD4F88839983C154D24000FD05C062E15A +:10979000C701AADA892B29F0ACEFAD0DA093F92C03 +:1097A0002AC0F4E0DF9ED0011124A755B34D80E11B +:1097B000F70101900D928A95E1F71DC042E050E05B +:1097C00062E872E1CE0101960E94F555E5E8F2E10A +:1097D000E4912091842D3091852D89819A812817DB +:1097E000390721F48091862DE81729F01092922DE7 +:1097F0000E94072CCDC18091F92C803109F04DC019 +:109800001092932D1092F92C1092B82C20E130E098 +:1098100049EB5CE267E870E0CE0101960E94950E8C +:1098200063EC73E2CE0181960E944F5620E130E056 +:1098300049EC5CE265E670E0CE0183960E94950EED +:1098400063EC73E2CE018D5B9F4F0E944F5620E187 +:1098500030E049ED5CE263E470E0CE018B5B9F4F4A +:109860000E94950E63EC73E2CE018B599F4F0E94CC +:109870004F5620E130E049EE5CE261E270E0CE015B +:1098800089599F4F0E94950E0E947423BE016F5FFD +:109890007F4F85E60E94DE227BC190E3D7019C9337 +:1098A00011968C9362E070E0C7010E94B0378091FE +:1098B000F92C8C5F8093F92C24CFBE016F5B7D4F18 +:1098C000C7013BDB882309F4E7C08091742D811127 +:1098D00003C06BEE73E227C08130A1F0912C80E0D1 +:1098E00090E000E010E027E6822E7E01BFEFEB1A49 +:1098F000BDEFFB0A3EEFC32E33E2D32EA12C42E094 +:10990000B42E40C06091752DE7E66E9FB001112422 +:109910006C587E4E40E450E0CE0101960E94F55511 +:10992000BE016F5F7F4F85E60E94DE2255C0013089 +:10993000F2E01F0760F5E92DF0E0EB58F24D608191 +:10994000869EB00111246C587E4E40E450E0C70161 +:109950000E94F555FF92EF92DF92CF92C501801BD6 +:10996000910B9F938F9381E090E08C0F9D1F800F50 +:10997000911F9F938F930E945656080F191F93941F +:10998000CDBFDEBF2091742D921688F204C0081B53 +:10999000190BF12C06C0013032E01307C0F7FF2489 +:1099A000F394EDEFFFEFEC0FFD1FE00FF11F8EE2E0 +:1099B0008083EEEFFFEFEC0FFD1FE00FF11F108231 +:1099C000BE016F5F7F4F85E60E94DE22F11004C06A +:1099D00088EE90E10E942D1981EE90E10E942D19F0 +:1099E00062E070E084E89DE20E94FC228BED90E151 +:1099F0000E942D196091912D70E087E89DE20E94F0 +:109A0000FC2285ED90E10E942D1961E070E086E86E +:109A10009DE20E94FC2237C0BE016F5B7D4FC701F3 +:109A20008CDA8823C9F18091742D813039F58091C9 +:109A3000752D833009F4BDC028F4813059F082308F +:109A400099F0DFC08A3031F008F4DBC08D508230ED +:109A500058F0D7C08091912D843009F4ACC0873084 +:109A600009F0CFC015E0AAC08091912D843009F48F +:109A7000A4C0873009F0C5C017E0A0C065E074E25B +:109A800085E60E94DE221092B82C1092742D0E945E +:109A900074231092932D7CC0CF5BDD4F0881198118 +:109AA000C154D240B5C01092732D009709F475C00F +:109AB00096958795285F3F4F820F931F54E0880F3C +:109AC000991F5A95E1F70E94C123E091B12EF091C0 +:109AD000B22E62857385CF01865A9E428F5F9F4F5B +:109AE0000E94CD5C60E070E085E60E94DE220115F8 +:109AF000184008F455C0B8E7AB2EB12C0AEF1CE2B1 +:109B000060E8E62EF12C71EE672E73E2772EEAE024 +:109B10005E2EFE0131966F01F7EE8F2EF3E29F2E3F +:109B2000FF92EF927F926F921F925F92DF92CF929D +:109B30000E945656C6010E942819D8018C91CDBFAB +:109B4000DEBF882389F11F928F939F928F921F927D +:109B50005F92DF92CF920E945656C6010E9428194A +:109B6000CDBFDEBF8AE491E10E942D19D8011D927C +:109B70008D01B0E1EB0EF11CC8018A5F9C428A1591 +:109B80009B0570F21092932D1092B82C0E940E2C0F +:109B900000E010E03DC08C013BC00E94DC2395CF6B +:109BA000A8E2AA2EB12CAACF6DE283E090E21FD6E4 +:109BB000D9CF11E003C014E001C016E06BE274E2FB +:109BC00085E60E94DE22812F0E94F80DE0919E2EF4 +:109BD000F0919F2E1995E091A82EF091A92E87E87B +:109BE0009DE21995E091AE2EF091AF2E4091AC2EF2 +:109BF00067E87DE283E119950E948B100E940D17A2 +:109C000042CF66E374E23CCF662309F40DCDFECC6F +:109C1000C801CE5BDD4FCDBFDEBFDF91CF911F917D +:109C20000F91FF90EF90DF90CF90BF90AF909F90FB +:109C30008F907F906F905F9008950F931F93CF93B5 +:109C4000DF93CDB7DEB7EA97CDBFDEBF08E112E301 +:109C500095D2F80181938F01F2E300321F07C1F71B +:109C60000E94DD1906D3882309F4FAC080911832C6 +:109C700090911932953009F46FC030F4913069F148 +:109C800068F0933051F1ECC0983009F4C2C09930BB +:109C900009F4C8C0963009F0E3C072C0803891F072 +:109CA000823809F0DDC080911C328F7087D2E0913C +:109CB0002232F0912332118112FB112710F980E03A +:109CC0007DD206C01091143280911532811112603C +:109CD000EAD2812F63D280E0A1C0282F2D7F09F026 +:109CE000BFC0882319F0823061F0BAC080911A3267 +:109CF000813009F0B5C0933009F080E080931532CF +:109D000027C080911A32811123C0E0911C321E2F8E +:109D10001F7009F4A5C0812F51D280911932833070 +:109D200011F4EDD215C0E0912232F09123328181FD +:109D30008B7F818324E8129FF0011124EA59FD4CA6 +:109D40001082E0912232F091233280818E7F8083D5 +:109D500080E034D2A8D264C0811182C010911A323E +:109D60001F77A1D28FD35FD28823E9F31093C30466 +:109D7000111102C082E001C083E08093173270C0ED +:109D80008058823008F06CC080911A3290911B325A +:109D90008C3DE3E09E0761F583E08A838AE3898353 +:109DA0004FB7F894DE01139620E038E052E050936C +:109DB000CA01E32FF0E0E4911092CA0120FF03C032 +:109DC000E295EF703F5FEF708E2F90E0EA3010F079 +:109DD000C79601C0C0968D939D932F5F2C3139F7A4 +:109DE0004FBF61D26AE370E0CE010196A5D00FC0EB +:109DF000AE014F5F5F4F60911C320E94090D8C01D4 +:109E0000892B71F150D2B80189819A8111D1A7D1E2 +:109E100027C0803829F547D280911332BFD186D12F +:109E200031D31EC081111CC080911A3290911B3217 +:109E300099270297ACF437D280911A32809313326B +:109E400021D380911332811106C08091C304811106 +:109E500002C081E001C084E0809317320E94D919CA +:109E600008D2882311F01FD24AD2EA96CDBFDEBFB6 +:109E7000DF91CF911F910F9108950895CF93809115 +:109E80001732882351F0C091243280E097D1F1D16C +:109E90008111D3DE8C2FCF9191C1CF910895CF92B4 +:109EA000DF92EF92FF920F931F93CF93DF93EC011A +:109EB0008B017A01FDD2811136C0E114F10439F031 +:109EC000F70180819181081B190BC80FD91FC12C84 +:109ED000D12C0115110531F1809120329091213260 +:109EE000FC01EF5BFF4F208131978081281790F0B4 +:109EF0001DD1C4DFE114F10449F0F70180819181A3 +:109F0000C80ED91EC082D18285E00DC0D1D288236F +:109F100001F309C0899142D101501109FFEFCF1A15 +:109F2000DF0AD7CF80E0DF91CF911F910F91FF9093 +:109F3000EF90DF90CF900895DF92EF92FF920F9312 +:109F40001F93CF93DF93D82FC92F8B018091243299 +:109F5000806834D180911E3290911F328017910712 +:109F600028F00115110519F4E1D001C08C01ED2E86 +:109F7000FC2ED12C0115110509F440C08091173237 +:109F8000811102C082E04CC0853011F483E048C0EA +:109F900070D1882311F081E043C051D181113CC0C0 +:109FA00042D1882339F3209124328091203290913C +:109FB0002132FC0127FF05C0EF5BFF4FC081D0E0DD +:109FC00013C0E05CFF4FC08131968081D0E0C81B98 +:109FD000D1090AC0C830D10550F4F70181917F0141 +:109FE000DDD00150110921960115110599F7DD24E5 +:109FF000D394289709F0D12C99D0BCCFD110BECFE3 +:10A000000BC080911732882309F4BCCF853009F446 +:10A01000BDCF2FD18111BFCF12D1882391F380E022 +:10A02000DF91CF911F910F91FF90EF90DF900895F6 +:10A03000DF92EF92FF920F931F93CF93DF93D82F6E +:10A04000C92F8B01809124328068B8D080911E3254 +:10A0500090911F328017910728F00115110519F40E +:10A0600065D001C08C01ED2EFC2ED12C01151105FF +:10A0700009F442C080911732811102C082E04EC0C3 +:10A08000853011F483E04AC0F4D0882311F081E0D8 +:10A0900045C0D5D081113EC0C6D0882339F3209168 +:10A0A00024328091203290912132FC0127FF05C09B +:10A0B000EF5BFF4FC081D0E015C0E05CFF4FC08177 +:10A0C00031968081D0E0C81BD1090CC0C830D105C1 +:10A0D00060F4F701849162D0FFEFEF1AFF0A01509C +:10A0E000110921960115110589F7DD24D3942897CC +:10A0F00009F0D12C1BD0BACFD110BCCF0BC08091AE +:10A100001732882309F4BACF853009F4BBCFB1D018 +:10A110008111BDCF94D0882391F380E0DF91CF915E +:10A120001F910F91FF90EF90DF900895E091223200 +:10A13000F0912332A0912032B0912132AF5BBF4F1A +:10A140008C9190E08283938380818D798083E091EC +:10A150002032F0912132EF5BFF4F10820895E091A1 +:10A160002232F091233280818D798083E0912032F8 +:10A17000F0912132EF5BFF4F1082089580912032E1 +:10A1800090912132FC01EF5BFF4F208131E0320FD3 +:10A190003083FC01E20FF11D80810895209120326F +:10A1A00030912132F901EF5BFF4F908141E0490F7F +:10A1B0004083F901E90FF11D8083089580932432D3 +:10A1C000482F4F7050E06091C6047091C7049A0107 +:10A1D00094E0220F331F9A95E1F7E4E887FF11C05E +:10A1E000E49FC001E59F900D112489599D4C8093F7 +:10A1F000203290932132C90108969B01280F391F04 +:10A200000DC0E49FC001E59F900D11248B5D9D4C16 +:10A210008093203290932132260F371F20932232D1 +:10A22000309323320895809124328068C7DFE09113 +:10A230002232F09123328081869581700895809139 +:10A2400024328F77BBDFA0912232B09123328C91E0 +:10A2500085FF0DC0E0912032F091213212968D9150 +:10A260009C911397E05CFF4F808381E0089580E02C +:10A270000895809124328F77A1DFA0912232B0918E +:10A2800023328C9184FF0DC0E0912032F091213275 +:10A2900012968D919C911397E05CFF4F808381E033 +:10A2A000089580E00895809124328F7787DFE091D0 +:10A2B0002232F091233280818D788083E0912232A6 +:10A2C000F0912332808181608083E0912032F0918F +:10A2D0002132EF5BFF4F10828091243280686EDF65 +:10A2E000E0912232F0912332808181608083E0917D +:10A2F0002032F0912132EF5BFF4F10820895E09100 +:10A300002232F0912332818184608183E091223274 +:10A31000F09123328181807C803459F48091243201 +:10A3200080584CDFE0912232F091233281818460A9 +:10A33000818308951F93CF93DF93C82F162FD42FB7 +:10A340003DDFE0912232F09123321182E0912232FE +:10A35000F09123328C2F881F8827881F880F8083D5 +:10A36000E0912232F09123321183E0912232F09178 +:10A3700023321282138220912032309121322483A1 +:10A380003583CC0FCC0BCD23F901E05CFF4FC083AC +:10A390003196108281E0DF91CF911F910895CF9285 +:10A3A000DF92EF92FF920F931F93CF93DF93C62E0E +:10A3B0008C01D12CDC1409F43FC0F801D081D111FB +:10A3C00004C0D3940B5F1F4FF5CFF801E180F280FA +:10A3D00093818481823010F488E001C088E128E014 +:10A3E00030E0C0E02E153F0520F4CF5F220F331F71 +:10A3F000F9CFC82B8D2F8F70863010F080E01DC0F4 +:10A40000CF7EF1E4EF16F104C8F7992321F09130E3 +:10A4100021F4C06C0AC0C06403C0C068911105C0BB +:10A420004E2D6C2F80E88D0F85DF4E2D6C2F8D2FDC +:10A4300081DF8111C6CFE2CF81E0DF91CF911F9103 +:10A440000F91FF90EF90DF90CF90089580E090E023 +:10A45000E091C604F091C7049C0144E0220F331F31 +:10A460004A95E1F7E20FF31F11864091C60450911F +:10A47000C704FA01E20FF31F11820196863091059D +:10A4800039F708958091183287FF0DC0D8DE811109 +:10A4900005C0809117328111F9CF09C060CE80913B +:10A4A0001732882321F0BFDE8823C9F33FCE0895F9 +:10A4B0000F931F93CF93E091C604F091C704E05A25 +:10A4C000FF4F00811181C4E68091243287FF0AC0CA +:10A4D000AADE811105C080911732811105C022C00A +:10A4E00080E025C0ACDEF5CF8530F1F0E09122327E +:10A4F000F0912332818182FD19C0E091C604F09170 +:10A50000C704E05AFF4F808191810817190711F4A1 +:10A510008C01DACF2FEF2C0FCC2311F0C22FF8CF04 +:10A5200084E005C082E003C083E001C081E0CF91F8 +:10A530001F910F91089563D069D0E0ECF4E0818120 +:10A540008E7F818380818F77808310921632089569 +:10A55000CF93DF93E0E4F0E014828481836084830E +:10A560004ED054D0C0ECD4E088818F778883888126 +:10A57000806888831092173210921332109215322D +:10A580001092143288818064888348E068E480E80F +:10A59000D1DE48E068E480E0CDDE8885806488878D +:10A5A000898181608983DF91CF910895CF93DF9373 +:10A5B0003FB7F894C0ECD1E022E02A87EAE1F0E06E +:10A5C000E491A0ECB4E0DA96EC93DA97EBE1F0E0FA +:10A5D000E491DB96EC93DB971A868EE395E38E7F0E +:10A5E00016968D939C93179785E18C9318962C93D0 +:10A5F0003FBF81E080931632DF91CF91A9CFE0EC8D +:10A60000F4E080858370808711860895E0ECF4E0A3 +:10A610008FEF8287848708951F920F920FB60F9253 +:10A62000112408B60F9218BE09B60F9219BE0BB6C8 +:10A630000F921BBE2F933F934F935F936F937F9324 +:10A640008F939F93AF93BF93EF93FF938091CA042F +:10A6500087FF08C08091C80487FF04C080E880930A +:10A66000CA040BDC8091CA0486FF07C080E4809393 +:10A67000CA04109217320E94C8198091CA0485FF3B +:10A6800014C080E28093CA0480911332882311F0B1 +:10A6900084E007C08091C304811102C081E001C041 +:10A6A00083E0809317320E94B7198091CA0484FF17 +:10A6B00014C080E18093CA0482E080931732109224 +:10A6C00013321092C304C2DE48E068E480E832DE50 +:10A6D00048E068E480E02EDED0DBFF91EF91BF918F +:10A6E000AF919F918F917F916F915F914F913F912A +:10A6F0002F910F900BBE0F9009BE0F9008BE0F90C8 +:10A700000FBE0F901F901895CF93DF93EC01FC01C3 +:10A7100070968BE0DF011D928A95E9F782E08C83C9 +:10A72000898783E08E8761E0CE01019638DE882339 +:10A7300061F061E0CE01069632DE882331F061E0FF +:10A74000CE010B96DF91CF912ACE80E0DF91CF91A1 +:10A7500008950F931F93CF93DF93209117322430E6 +:10A76000E1F4FC010489158926893789012B022B24 +:10A77000032B99F0EB01818121DDFE010190002086 +:10A78000E9F73197BF016C1B7D0B40E050E0CE0133 +:10A79000DF91CF911F910F9182CB82E0DF91CF911A +:10A7A0001F910F9108950F931F93CF93DF932091E3 +:10A7B00017322430B1F4FC010489158926893789C0 +:10A7C000012B022B032B69F08A01EB018181F6DC5E +:10A7D00040E050E0B801CE01DF91CF911F910F9181 +:10A7E0005ECB82E0DF91CF911F910F9108950F937F +:10A7F0001F93CF9320911732243009F5FC0104896F +:10A80000158926893789012B022B032BC1F0C62F0E +:10A810008181D4DC8091203290912132FC01EF5B68 +:10A82000FF4F208131978081281720F48C2FB6DCD0 +:10A8300080E006C07BDC3CDE8823C1F301C082E0FF +:10A84000CF911F910F910895CF93DF9320911732ED +:10A85000243091F5FC014489558966897789452B17 +:10A86000462B472B49F18181A9DC8091243220912C +:10A87000203230912132F90187FF05C0EF5BFF4F95 +:10A88000808190E008C0E05CFF4F8081319640817C +:10A8900090E0841B9109892B69F0F901EF5BFF4F70 +:10A8A000D0813197C08142DCDC1720F001DE8111BC +:10A8B00004C03CDC80E001C082E0DF91CF910895CC +:10A8C000CF93DF9320911732243099F4FC0144890F +:10A8D000558966897789452B462B472B51F0EC012A +:10A8E00081816CDCA0DC882321F0CE01DF91CF9147 +:10A8F000ABCFDF91CF910895CF93DF9320911732A3 +:10A90000243019F08FEF9FEF46C0FC014489558930 +:10A9100066897789452B462B472BA1F386814EDC30 +:10A920008EDC882379F3809124322091203230917B +:10A930002132F90187FF05C0EF5BFF4F808190E076 +:10A9400008C0E05CFF4F80813196208190E0821B3F +:10A950009109892B21F012DCC82FD0E002C0CFEF83 +:10A96000DFEF209124328091203290912132FC013E +:10A9700027FF05C0EF5BFF4F208130E008C0E05C9F +:10A98000FF4F20813196808130E0281B3109232B35 +:10A9900009F4E5DBCE01DF91CF9108950895FF9290 +:10A9A0000F931F93CF93DF93EC0163DC882309F4AB +:10A9B0008EC0888190E020911C3230911D32281782 +:10A9C000390709F084C080911932813259F018F4A6 +:10A9D000803249F17CC0823209F457C0833209F4D5 +:10A9E00067C075C080911832813A09F070C05BDC95 +:10A9F0001ADC8823E9F38C89FD880E891F89CEDB58 +:10AA00008F2DCCDB802FCADB812FC8DB888DC6DB86 +:10AA1000898DC4DB8A8DC2DB89DBDF91CF911F91E9 +:10AA20000F91FF902FCD80911832813209F04FC0E5 +:10AA30003ADC05DC811105C0809117328111F9CF14 +:10AA400046C09CDBF82E9ADB182F98DB082F96DB8C +:10AA5000402F50E060E070E0BA0155274427782B82 +:10AA60004F29512B4C8B5D8B6E8B7F8B87DB888FB7 +:10AA700085DB898F83DB8A8F72DB04DDCE01DF917A +:10AA8000CF911F910F91FF9089CF80911832813221 +:10AA9000F1F409DCF7DC80911A3290911B32888B3B +:10AAA000998BCE01DF91CF911F910F91FF9076CFBF +:10AAB00080911832813259F4F6DBE4DC60911A326D +:10AAC000CE01DF91CF911F910F91FF9067CFDF9162 +:10AAD000CF911F910F91FF900895AA1BBB1B51E1CD +:10AAE00007C0AA1FBB1FA617B70710F0A61BB70BFE +:10AAF000881F991F5A95A9F780959095BC01CD01A3 +:10AB00000895B7FF04C003D0821B930B089509D0AA +:10AB1000A59F900DB49F900DA49F800D911D1124B1 +:10AB20000895A29FB001B39FC001A39F700D811D26 +:10AB30001124911DB29F700D811D1124911D089546 +:10AB40008F929F92AF92BF92CF92DF92EF92FF923D +:10AB5000CF93DF93EC01688179818A819B816115B4 +:10AB600071058105910521F464E279ED8BE597E0AB +:10AB70002DE133EF41E050E037D749015A019B0105 +:10AB8000AC01A7EAB1E4C3DF6B017C01ACEEB4EF2A +:10AB9000A5019401B8DFDC01CB018C0D9D1DAE1D1C +:10ABA000BF1DB7FF03C00197A109B04888839983EF +:10ABB000AA83BB839F77DF91CF91FF90EF90DF90C7 +:10ABC000CF90BF90AF909F908F900895B9CF80E2C3 +:10ABD00090E2B6CFA0E0B0E08093202090932120B7 +:10ABE000A0932220B09323200895FB01DC0102C032 +:10ABF00005900D9241505040D8F70895FB01DC01BB +:10AC00008D91059080190110D9F3990B0895FB01DE +:10AC1000DC014150504048F005900D920020C9F7EA +:10AC200001C01D9241505040E0F70895FB01DC0146 +:10AC300004C08D910190801921F441505040C8F713 +:10AC4000881B990B0895FB01DC0102C001900D9255 +:10AC500041505040D8F708956817790768F4FB0110 +:10AC6000DC01E40FF51FA40FB51F02C002900E9285 +:10AC700041505040D8F70895E6CFDC0101C06D93F4 +:10AC800041505040E0F70895FC018191861721F072 +:10AC90008823D9F7992708953197CF010895FB01AB +:10ACA000DC0101900D920020E1F708950F931F93AE +:10ACB000CF93DF93CDB7DEB72E97CDBFDEBF0E8922 +:10ACC0001F89888D998D26E02C8309831A8397FF2D +:10ACD00002C080E090E801978D839E83AE01445EC0 +:10ACE0005F4F6A8D7B8DCE01019667D04D815E816D +:10ACF00057FD0AC02F813885421753070CF49A017B +:10AD0000F801E20FF31F10822E96CDBFDEBFDF9158 +:10AD1000CF911F910F9108950F931F93CF93DF93BE +:10AD2000CDB7DEB72E97CDBFDEBF0E891F89888DC8 +:10AD3000998D2EE02C8309831A8397FF02C080E04F +:10AD400090E801978D839E83AE01445E5F4F6A8DCC +:10AD50007B8DCE01019631D04D815E8157FD0AC0B9 +:10AD60002F813885421753070CF49A01F801E20F3E +:10AD7000F31F10822E96CDBFDEBFDF91CF911F91C2 +:10AD80000F910895CF93DF93CDB7DEB72E97CDBF48 +:10AD9000DEBF8DE08C838C899D8989839A83AE0187 +:10ADA000485E5F4F6E897F89CE010196A9D32E96AA +:10ADB000CDBFDEBFDF91CF9108952F923F924F928A +:10ADC0005F926F927F928F929F92AF92BF92CF923B +:10ADD000DF92EF92FF920F931F93CF93DF93CDB744 +:10ADE000DEB72B97CDBFDEBF6C017B018A01FC0172 +:10ADF00016821782838181FFBFC1CE0101963C017B +:10AE0000F6019381F70193FD859193FF81917F0175 +:10AE1000882309F4ADC1853239F493FD859193FF00 +:10AE200081917F01853221F4B60190E0E7D4E8CF2B +:10AE3000912C212C312CFFE1F315D8F08B3279F0D5 +:10AE400038F4803279F08332A1F4232D20611DC0C3 +:10AE50008D3261F0803369F4232D216016C0832D7B +:10AE60008260382EE32DE4603E2E2AC0F32DF86078 +:10AE70001DC037FC2DC020ED280F2A3040F08E3247 +:10AE8000B9F436FC75C1232D2064322E19C036FE6C +:10AE900006C08AE0989E200D1124922E11C0EAE08F +:10AEA0002E9E200D1124222EF32DF0623F2E08C07D +:10AEB0008C3621F4832D8068382E02C0883641F408 +:10AEC000F70193FD859193FF81917F018111B3CFAC +:10AED000982F9F7D9554933028F40C5F1F4F9FE36C +:10AEE00099830DC0833631F0833771F0833509F0D3 +:10AEF00055C020C0F801808189830E5F1F4F8824D0 +:10AF00008394912C530112C02801F2E04F0E511C82 +:10AF1000F801A080B18036FE03C0692D70E002C048 +:10AF20006FEF7FEFC50121D44C018201F32DFF7734 +:10AF30003F2E15C0280122E0420E511CF801A080CE +:10AF4000B18036FE03C0692D70E002C06FEF7FEF65 +:10AF5000C50100D44C01F32DF0683F2E820133FC73 +:10AF600019C0822D90E088169906A0F4B60180E2FF +:10AF700090E044D42A94F5CFF50137FC859137FE53 +:10AF800081915F01B60190E039D421102A9421E02B +:10AF9000821A91088114910479F7E1C0843611F086 +:10AFA000893639F5F80137FE07C0608171818281E9 +:10AFB00093810C5F1F4F08C060817181072E000CC8 +:10AFC000880B990B0E5F1F4FF32DFF763F2E97FFD7 +:10AFD00009C090958095709561957F4F8F4F9F4FD9 +:10AFE000F0683F2E2AE030E0A3015DD4882E861859 +:10AFF00044C0853731F4232D2F7EB22E2AE030E075 +:10B0000025C0932D997FB92E8F36C1F018F488355D +:10B0100079F0AEC0803719F0883721F0A9C0E92F48 +:10B02000E061BE2EB4FE0DC0FB2DF460BF2E09C042 +:10B0300034FE0AC0292F2660B22E06C028E030E078 +:10B0400005C020E130E002C020E132E0F801B7FEA7 +:10B0500007C060817181828193810C5F1F4F06C0A0 +:10B060006081718180E090E00E5F1F4FA3011BD4CF +:10B07000882E8618FB2DFF773F2E36FE0DC0232D20 +:10B080002E7FA22E891458F434FE0BC032FC09C066 +:10B09000832D8E7EA82E05C0B82CA32C03C0B82CFF +:10B0A00001C0B92CA4FE0FC0FE01E80DF11D808186 +:10B0B000803321F49A2D997EA92E09C0A2FE06C0E4 +:10B0C000B394B39404C08A2D867809F0B394A3FC9A +:10B0D00010C0A0FE06C0B21480F4280C922C9B185D +:10B0E0000DC0B21458F4B60180E290E087D3B39457 +:10B0F000F8CFB21418F42B1802C0982C212CA4FEFF +:10B100000FC0B60180E390E079D3A2FE16C0A1FC87 +:10B1100003C088E790E002C088E590E0B6010CC06B +:10B120008A2D867851F0A1FE02C08BE201C080E238 +:10B13000A7FC8DE2B60190E061D3891430F4B6012A +:10B1400080E390E05BD39A94F8CF8A94F301E80D02 +:10B15000F11D8081B60190E051D38110F6CF2220FD +:10B1600009F44ECEB60180E290E048D32A94F7CF9E +:10B17000F6018681978102C08FEF9FEF2B96CDBF9E +:10B18000DEBFDF91CF911F910F91FF90EF90DF9085 +:10B19000CF90BF90AF909F908F907F906F905F9077 +:10B1A0004F903F902F90089520FD09C0FC0123FD92 +:10B1B00005C022FF02C073836283518340830895D8 +:10B1C00044FD17C046FD17C0AB01BC01DA01FB010D +:10B1D000AA0FBB1FEE1FFF1F1094D1F74A0F5B1F72 +:10B1E0006E1F7F1FCB01BA01660F771F881F991F43 +:10B1F00009C033E001C034E0660F771F881F991F34 +:10B200003150D1F7620F711D811D911D08950F936B +:10B210001F93CF93DF938C01C801B2D2EC0197FD4D +:10B2200006C085D2892BC1F7B801CE0123D3CE0148 +:10B23000DF91CF911F910F9108958F929F92AF92BE +:10B24000BF92EF92FF920F931F93CF93DF938C01E6 +:10B25000D62F7A01B22E94D29C0133272B3231059E +:10B2600031F02D32310559F48B2D8068B82ED15034 +:10B2700011F480E061C0C80183D297FDFACFCB2DD5 +:10B28000CD7F2B2D2073F9F48033E9F4AA24AA94FE +:10B29000AD0E09F43EC0C80173D297FD3AC09C01BF +:10B2A0002F7D33272835310541F4C264D25089F10E +:10B2B000C80166D297FF07C02CC0B6FE02C0C260AC +:10B2C00001C0C261DA2D812C912C540120ED280F90 +:10B2D000283078F0C4FF03C0B801CCD217C02A30A0 +:10B2E00040F0C6FFF9CF2F7D3FEE320F3630A0F78A +:10B2F00027504C2FC501B40163DF4B015C01C260D4 +:10B30000D15051F0C8013CD297FFE0CFC1FD04C03D +:10B31000B0CF812C912C5401C7FF08C0B094A094E9 +:10B3200090948094811C911CA11CB11C2C2FB50100 +:10B33000A401C70139DF81E0DF91CF911F910F9107 +:10B34000FF90EF90BF90AF909F908F9008955F9285 +:10B350006F927F928F929F92AF92BF92CF92DF9225 +:10B36000EF92FF920F931F93CF93DF93CDB7DEB78A +:10B37000A097CDBFDEBF5C01962E7A01F9018E0148 +:10B380000F5F1F4F680180E2D8011D928A95E9F78F +:10B39000D50113968C9080E090E0612C712C30E008 +:10B3A00061E070E083FC259183FE21918F01522E94 +:10B3B000211103C080E090E090C02E3511F4009779 +:10B3C00051F1432F50E0481759073CF42D3559F1FE +:10B3D0002D3219F4772009F103C0772009F468C0F1 +:10B3E000452D469546954695D601A40FB11D452D90 +:10B3F00047708B0102C0000F111F4A95E2F7A801A8 +:10B400005C91452B4C93651459F0561410F45394E9 +:10B41000E7CF5A94E5CF31E004C07724739401C09C +:10B42000712C0196BFCF772019F08E8180628E83B8 +:10B43000311103C08824839417C0F6019E012F5D4B +:10B440003F4F8081809581932E173F07D1F7F2CF30 +:10B45000E114F10429F0D7018C93F70131967F01B3 +:10B460009A94812C9920E9F0C5018AD197FD17C0E3 +:10B47000FC01FF2723E0F595E7952A95E1F7EC0D10 +:10B48000FD1D208130E0AC014770552702C0359585 +:10B4900027954A95E2F720FDDBCFB501EBD181106E +:10B4A00089CFE114F10411F0D7011C92C80115C035 +:10B4B000422F469546954695D601A40FB11D422FC1 +:10B4C00047708B0102C0000F111F4A95E2F7A801D7 +:10B4D0005C91452B4C93622EA4CFA096CDBFDEBFCE +:10B4E000DF91CF911F910F91FF90EF90DF90CF9060 +:10B4F000BF90AF909F908F907F906F905F900895D6 +:10B500005F926F927F928F929F92AF92BF92CF92F3 +:10B51000DF92EF92FF920F931F93CF93DF936C0113 +:10B52000EB015A01FC0116821782512CF601E380CF +:10B53000FE01E3FC8591E3FE8191182FEF01882342 +:10B5400009F4E0C090E0F3D0892B19F0C6015FDE6A +:10B55000EDCF153241F4FE01E3FC1591E3FE1191AC +:10B56000EF01153271F4C6010BD197FDC9C0412F0F +:10B5700050E09C01332724173507C1F2B6017AD178 +:10B58000C1C01A3239F4E3FC1591E3FE1191EF01C9 +:10B5900001E001C000E0F12C20ED210F2A3078F409 +:10B5A00002606F2D70E080E090E040E209DEF62E50 +:10B5B000FE01E3FC1591E3FE1191EF01EDCF01FFD8 +:10B5C00003C0F11003C09EC0FF24FA94183619F08E +:10B5D0001C3651F010C0FE01E3FC1591E3FE119101 +:10B5E000EF01183641F408600460FE01E3FC159198 +:10B5F000E3FE1191EF01112309F484C0612F70E083 +:10B600008CEF91E09CD0892B09F47CC000FD07C031 +:10B61000F50180809180C50102965C0102C0812CF9 +:10B62000912C1E3649F4F6014681578160E070E0A6 +:10B63000202FC401B9DD7ACF1336A1F401FD02C079 +:10B64000FF24F394C6019CD097FD5AC08114910445 +:10B6500029F0F4018083C40101964C01FA94F110A1 +:10B66000F1CF4AC01B3551F49E01A4016F2DC601D4 +:10B670006EDEEC01892B09F03FC039C0C601C7DD81 +:10B6800097FD3EC01F3649F128F4143621F11936D2 +:10B6900039F125C0133771F01537E9F020C0811456 +:10B6A000910429F0F4016082C40101964C01FA94DE +:10B6B000FF2059F0C60164D03C0197FD06C037D089 +:10B6C000892B69F3B601C301D5D081149104A1F08F +:10B6D000F401108211C0006203C0006101C0006467 +:10B6E000202FA4016F2DC601A8DD811105C0F60130 +:10B6F0008381807329F406C000FD18CF539416CFC0 +:10B70000552019F0852D90E002C08FEF9FEFDF915B +:10B71000CF911F910F91FF90EF90DF90CF90BF904E +:10B72000AF909F908F907F906F905F900895911150 +:10B7300018C1803219F089508550D0F70895FC0166 +:10B740000590061621F00020D9F7C0010895319721 +:10B75000CF010895FC010590615070400110D8F7A9 +:10B76000809590958E0F9F1F0895FC016150704049 +:10B7700001900110D8F7809590958E0F9F1F089526 +:10B78000CF93DF93EC012B8120FF33C026FF0AC04B +:10B790002F7B2B838E819F8101968E839F838A814D +:10B7A00090E029C022FF0FC0E881F9818081082E36 +:10B7B000000C990B009719F420622B831AC0319664 +:10B7C000E883F9830EC0EA85FB85199597FF09C0C8 +:10B7D0002B81019611F080E201C080E1822B8B83E6 +:10B7E00008C02E813F812F5F3F4F2E833F839927D3 +:10B7F00002C08FEF9FEFDF91CF9108950F931F93BA +:10B80000CF93DF93FB01238121FD03C08FEF9FEFD7 +:10B810002CC022FF16C046815781248135814217F2 +:10B82000530744F4A081B1819D012F5F3F4F2083D6 +:10B8300031838C93268137812F5F3F4F2683378357 +:10B8400014C08B01EC01FB010084F185E02D1995FA +:10B85000892BE1F6D80116968D919C911797019648 +:10B8600016968D939C931797CE01DF91CF911F91E0 +:10B870000F910895FB01238120FF12C026FD10C007 +:10B880008F3F3FEF930761F082832F7D20642383F6 +:10B8900026813781215031092683378399270895DE +:10B8A0008FEF9FEF0895FA01AA27283051F1203138 +:10B8B00081F1E8946F936E7F6E5F7F4F8F4F9F4F44 +:10B8C000AF4FB1E03ED0B4E03CD0670F781F891F86 +:10B8D0009A1FA11D680F791F8A1F911DA11D6A0F54 +:10B8E000711D811D911DA11D20D009F468943F9107 +:10B8F0002AE0269F11243019305D3193DEF6CF0106 +:10B900000895462F4770405D4193B3E00FD0C9F7CB +:10B91000F6CF462F4F70405D4A3318F0495D31FD38 +:10B920004052419302D0A9F7EACFB4E0A69597958B +:10B93000879577956795BA95C9F700976105710561 +:10B9400008959B01AC010A2E0694579547953795AB +:10B950002795BA95C9F7620F731F841F951FA01D05 +:10B96000089599278827089503D0808199270895FD +:10B97000E0ECF1E0378537FDFDCF34853860348762 +:10B98000FC01E050F04F0895262FF2DF00800216F0 +:10B9900011F008D00197019708950196272FF5DF40 +:10B9A000F3CF262FE0ECF1E0378537FDFDCF34856E +:10B9B000377F3487378531FF09C036E3328738ED6A +:10B9C00034BF31E03387378537FDFDCF33E332872E +:10B9D000808391831282248325E3228728ED31E03E +:10B9E00024BF338701960895052E97FB16F4009423 +:10B9F0000FD057FD05D014D007FC02D046F408C084 +:10BA000050954095309521953F4F4F4F5F4F08958A +:10BA100090958095709561957F4F8F4F9F4F0895BA +:10BA2000A1E21A2EAA1BBB1BFD010DC0AA1FBB1F42 +:10BA3000EE1FFF1FA217B307E407F50720F0A21BB4 +:10BA4000B30BE40BF50B661F771F881F991F1A9421 +:10BA500069F760957095809590959B01AC01BD014B +:08BA6000CF010895F894FFCF17 +:10BA680002400F008310000001041000000182084A +:10BA780000000100000000000000000000000100BC +:10BA880001000000000000000925102510251C25D4 +:10BA9800282532254F255D25862589258D253E00BB +:10BAA8000426140004043E00042E040C04040008B8 +:10BAB8000008000000000000000800080808080846 +:10BAC80008000800080000000808000808080080AE +:10BAD80000800000000000000080008080808080DE +:10BAE800800080008000000080800080808000014D +:10BAF8000001000000000000000100010101010137 +:10BB08000100010001000000010100010101000025 +:10BB1800000000000000000000000000000001011B +:10BB280001010101010101010101010101010101FD +:10BB380001010101010101010101010101010101ED +:10BB480001010101010101010101010101010000DF +:10BB580000000000000000000000000000000000DD +:10BB680000000000000000000000000000000000CD +:10BB780000000000000000000000000000000101BB +:10BB8800010101010101010101010101010100009F +:10BB9800000000000000000000000000000000009D +:10BBA800000000000000000000000000000001018B +:10BBB800010101010101010101010101010100006F +:10BBC800000000000000000000000000000001016B +:10BBD800010101010101010101010101010101014D +:10BBE800010101010101010101010101010100003F +:10BBF800000000000000000000000000000001013B +:10BC0800010101010101010101010101010100001E +:10BC1800000202000002000202020200000200000C +:10BC280000020200000200020202020000020000FC +:10BC380000020200000200020202020000020404E4 +:10BC4800040606040406040606060604040604049C +:10BC58000406060404060406060606040406000094 +:10BC680000020200000200020202020000020000BC +:10BC780000020200000200020202020000020404A4 +:10BC88000406060404060406060606040406000064 +:10BC98000002020000020002020202000002040484 +:10BCA800040606040406040606060604040604043C +:10BCB800040606040406040606060604040604042C +:10BCC800040606040406040606060604040604041C +:10BCD8000406060404060406060606040406000014 +:10BCE800000202000002000202020200000200003C +:10BCF8000002020000020002020202000002040424 +:10BD080004060604040604060606060404060008DB +:10BD180008080000000800000800080800080008DB +:10BD280008080000000800000800080800080008CB +:10BD3800080800000008000008000808000810189B +:10BD480018181010101810101810181810181018AB +:10BD580018181010101810101810181810180008BB +:10BD6800080800000008000008000808000800088B +:10BD7800080800000008000008000808000810185B +:10BD8800181810101018101018101818101800088B +:10BD9800080800000008000008000808000810183B +:10BDA800181810101018101018101818101810184B +:10BDB800181810101018101018101818101810183B +:10BDC800181810101018101018101818101810182B +:10BDD800181810101018101018101818101800083B +:10BDE800080800000008000008000808000800080B +:10BDF80008080000000800000800080800081018DB +:10BE08001818101010181010181018181018434C83 +:10BE18004F4E4500546F6F206D616E7920646174D8 +:10BE2800612E000D0A000D0A50415249545920450F +:10BE380052524F52000D0A504152495459204F4B0B +:10BE4800002534753A200025337500556E6B6E6FEA +:10BE5800776E206361726420747970652E00257393 +:10BE6800206F7220004D756C7469706C6520706F5E +:10BE780073736962696C69746965732C206E6F7479 +:10BE880020636C6F6E61626C652100436C6F6E6538 +:10BE980064204F4B2100436C6F6E6520756E73757F +:10BEA80070706F7274656421004E4F204441544194 +:02BEB800000088 :020000021000EC :1000000000000000000000000000000000000000F0 :1000100000000000000000000000000000000000E0 From 392d5d71d63d95cc176dfa7aedc4b3008fb7e51e Mon Sep 17 00:00:00 2001 From: Georg Land Date: Thu, 1 Feb 2018 08:12:17 +0100 Subject: [PATCH 055/104] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 581a0ac..2c77101 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ Note to the manufacturers: Some of the third-party ChameleonMini are violating t First Steps ----------- -To upgrade the firmware of your ChameleonMini, please visit the [Getting Started page](http://rawgit.com/emsec/ChameleonMini/master/Doc/Doxygen/html/Page_GettingStarted.html) from the [doxygen documentation](http://rawgit.com/emsec/ChameleonMini/master/Doc/Doxygen/html/index.html). +To upgrade the firmware of your ChameleonMini, please visit the [Getting Started page](https://rawgit.com/emsec/ChameleonMini/master/Doc/Doxygen/html/_page__getting_started.html) from the [doxygen documentation](http://rawgit.com/emsec/ChameleonMini/master/Doc/Doxygen/html/index.html). Supported Cards and Codecs -------------------------- From 7ab8d3b185cf9e58dbd48c8d312670d73060ca19 Mon Sep 17 00:00:00 2001 From: Georg Date: Wed, 28 Feb 2018 16:20:05 +0100 Subject: [PATCH 056/104] added mf classic 4k 7b init function to config --- Firmware/Chameleon-Mini/Application/MifareClassic.h | 3 ++- Firmware/Chameleon-Mini/Configuration.c | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Firmware/Chameleon-Mini/Application/MifareClassic.h b/Firmware/Chameleon-Mini/Application/MifareClassic.h index 618ae64..204efbc 100644 --- a/Firmware/Chameleon-Mini/Application/MifareClassic.h +++ b/Firmware/Chameleon-Mini/Application/MifareClassic.h @@ -16,8 +16,9 @@ #define MIFARE_CLASSIC_4K_MEM_SIZE 4096 void MifareClassicAppInit1K(void); -void MifareClassicAppInit1K7B(void); void MifareClassicAppInit4K(void); +void MifareClassicAppInit1K7B(void); +void MifareClassicAppInit4K7B(void); void MifareClassicAppReset(void); void MifareClassicAppTask(void); diff --git a/Firmware/Chameleon-Mini/Configuration.c b/Firmware/Chameleon-Mini/Configuration.c index 8beba51..72ffce1 100644 --- a/Firmware/Chameleon-Mini/Configuration.c +++ b/Firmware/Chameleon-Mini/Configuration.c @@ -174,7 +174,7 @@ static const PROGMEM ConfigurationType ConfigurationTable[] = { .CodecInitFunc = ISO14443ACodecInit, .CodecDeInitFunc = ISO14443ACodecDeInit, .CodecTaskFunc = ISO14443ACodecTask, - .ApplicationInitFunc = MifareClassicAppInit4K, + .ApplicationInitFunc = MifareClassicAppInit4K7B, .ApplicationResetFunc = MifareClassicAppReset, .ApplicationTaskFunc = MifareClassicAppTask, .ApplicationTickFunc = ApplicationTickDummy, From 691b8b2fd14613081574126962ad18e85c3509e4 Mon Sep 17 00:00:00 2001 From: Georg Date: Wed, 28 Feb 2018 16:45:40 +0100 Subject: [PATCH 057/104] updated LATEST firmware --- .../Chameleon-Mini/Latest/Chameleon-Mini.hex | 3196 +++++++++-------- 1 file changed, 1599 insertions(+), 1597 deletions(-) diff --git a/Firmware/Chameleon-Mini/Latest/Chameleon-Mini.hex b/Firmware/Chameleon-Mini/Latest/Chameleon-Mini.hex index 14f5720..d24c39d 100644 --- a/Firmware/Chameleon-Mini/Latest/Chameleon-Mini.hex +++ b/Firmware/Chameleon-Mini/Latest/Chameleon-Mini.hex @@ -29,7 +29,7 @@ :1001C0000C94D00B0C94D00B0C94D00B0C94D00B43 :1001D0000C94D00B0C94D00B0C94D00B0C94D00B33 :1001E0000C94D00B0C94D00B0C94D00B0C94D00B23 -:1001F0000C94D00B0C940C530C94D00B6364696E6C +:1001F0000C94D00B0C941B530C94D00B6364696E5D :100200006F70737578585B001E03430068006100CF :100210006D0065006C0065006F006E002D004D00E4 :1002200069006E00690000002A034B006100730042 @@ -47,14 +47,14 @@ :1002E000E22CE62CEC0DE72C05301830500007000E :1002F000A72517263626DE2CE22CE62CEC0DE72C63 :1003000005301830A4000700A725172636265830D8 -:1003100085308930EC0D8A306B3787370004040054 -:10032000A72517263626673085308930EC0D8A30B0 -:100330006B37873700040700A72517263626763047 -:1003400085308930EC0D8A306B3787370010040018 -:10035000A72517263626763085308930EC0D8A3071 -:100360006B37873700100700A72517263626F50DAF +:1003100094309830EC0D99307A3796370004040009 +:10032000A72517263626673094309830EC0D993083 +:100330007A37963700040700A72517263626763029 +:1003400094309830EC0D99307A37963700100400CD +:10035000A72517263626853094309830EC0D993035 +:100360007A37963700100700A72517263626F50D91 :10037000F60DF70DEC0DED0DF10DF00D0000000187 -:10038000C7264427FC2862466546724673461249D2 +:10038000C7264427FC287146744681468246214987 :10039000F10DF00D00000000004E4F4E4500000032 :1003A000000000000000000000000000000000004D :1003B000000000000000000000014D465F554C5455 @@ -186,8 +186,8 @@ :100B900070733A2F2F6769746875622E636F6D2FBB :100BA000656D7365632F4368616D656C656F6E4D30 :100BB000696E6920636F6D6D69742025530031384B -:100BC000303132350031353131313500352E342E6A -:100BD000300063366432393638000D0A000D0A00E1 +:100BC000303232380031353131313500352E342E66 +:100BD000300037616238643362000D0A000D0A008C :100BE0000D0A000D0A000D0A000D0A0064313030B4 :100BF0003A4F4B0000000000000000000000000021 :100C0000000000000000000000000000006531301E @@ -373,9 +373,9 @@ :101740000000000000000000000000000000000099 :1017500000000000000011241FBECFEFCDBFDFE36B :10176000DEBF00E00CBF18BE19BE1ABE1BBE14E2DD -:10177000A0E0B0E2E8E6FAEB00E00BBF02C00790A1 +:10177000A0E0B0E2E6E8FAEB00E00BBF02C00790A1 :101780000D92A235B107D9F71BBE25E3A2E5B4E25D -:1017900001C01D92A03AB207E1F77ED00C94325DF1 +:1017900001C01D92A03AB207E1F77ED00C94415DE2 :1017A00068C13BB78BBFFB01879196913BBF089502 :1017B0003BB78BBFCB0142E20D94F00F3BB70B015F :1017C00043E20D94F00F3BB78BBFCB0145E20D9484 @@ -448,10 +448,10 @@ :101BF0000F931F93CF93C82F06E91EE2D8011296C8 :101C0000ED91FC91139719950E94C422E091B12E99 :101C1000F091B22EC583B8E1CB9FB0011124685575 -:101C20007D4F48E150E0C8010E94F555D801ED9183 +:101C20007D4F48E150E0C8010E940456D801ED9173 :101C3000FC911995D8011696ED91FC911797CF91CB :101C40001F910F91199448E150E068EA72E086E92B -:101C50009EE20E94F555E091B12EF091B22E858161 +:101C50009EE20E940456E091B12EF091B22E858151 :101C6000C7CF0F931F93E091B12EF091B22E8B014D :101C70009C0145816AE088E993E00E947F181F91EA :101C80000F910895FF920F931F93CF93DF931F92AD @@ -461,10 +461,10 @@ :101CC000D1F7E091AE2EF091AF2EB80181E11995D8 :101CD0008F2D0F90DF91CF911F910F91FF9008955D :101CE0009B01AC016AE088E993E00C94BE1808956A -:101CF0000C94E75508950F931F93CF938C01C62F33 -:101D0000CC2339F00E94E755F80181938F01C1502F -:101D1000F7CFCF911F910F9108950E94E7550E9430 -:101D2000E7550E94E7550C94E755CF93DF93EC01FC +:101CF0000C94F65508950F931F93CF938C01C62F24 +:101D0000CC2339F00E94F655F80181938F01C15020 +:101D1000F7CFCF911F910F9108950E94F6550E9421 +:101D2000F6550E94F6550C94F655CF93DF93EC01CF :101D300061507109DA01420F531FFC01CF018C1B66 :101D40009D0BA417B50721F41082DF91CF91089560 :101D500062307105C8F39D91392F32953F703A304A @@ -654,9 +654,9 @@ :1028D000DF91CF911F910F9108950895EF92FF928C :1028E0000F931F93CF937B01C42F0EB11FB1209183 :1028F000080430910904022B132B682F83E090E227 -:102900000E94F7536C2F83E090E20E94F753612FEF -:1029100083E090E20E94F753602F83E090E20E94F0 -:10292000F7536C2F70E0C701CF911F910F91FF906B +:102900000E9406546C2F83E090E20E940654612FCF +:1029100083E090E20E940654602F83E090E20E94E0 +:1029200006546C2F70E0C701CF911F910F91FF905B :10293000EF90A4C408953F924F925F926F927F925E :102940008F929F92AF92BF92CF92DF92EF92FF92BF :102950000F931F93CF93DF937C01E901C090002078 @@ -671,7 +671,7 @@ :1029E000BC01C70137DA18C0C41AD50AA601BC0158 :1029F000C70130DAAE014C195D096AE574E2C7011E :102A00008C0D9D1D07C04C195D09BA01665A7B4D9E -:102A1000AE01C7010E942356332041F00C0F1D1F49 +:102A1000AE01C7010E943256332041F00C0F1D1F3A :102A2000F701E00FF11FCE0DDF1D02C081E006C0EF :102A3000EC17FD07D9F31292FBCF80E0DF91CF9125 :102A40001F910F91FF90EF90DF90CF90BF90AF90CC @@ -728,7 +728,7 @@ :102D7000809358249093592480E098E080935624BF :102D8000909357242EC02097B9F1AE018AE594E2C2 :102D9000AFD8A8014C1B5D0BBE01665A7B4D8AE57E -:102DA00094E20E942C5680915824909159248C1BB7 +:102DA00094E20E943B5680915824909159248C1BA8 :102DB0009D0B809358249093592480915624909190 :102DC00057248C0F9D1F80935624909357248091F5 :102DD000002090910120C80FD91FC0930020D093EC @@ -743,8 +743,8 @@ :102E60009093B22EF901E055F14D80850E94F80D46 :102E7000E091B12EF091B22E84813ADEA7D801E024 :102E800010E0005B1E426091B02EC8018055914D4C -:102E90000E94C45C6091B12E7091B22EC8018F5413 -:102EA000914D0E94CD5C8FE18D0FE091B12EF0919C +:102E90000E94D35C6091B12E7091B22EC8018F5404 +:102EA000914D0E94DC5C8FE18D0FE091B12EF0918D :102EB000B22E9781943011F480935B2C96819430DC :102EC00029F480935A2C02C080E001C081E0DF9198 :102ED000CF911F910F9108958091B02E99E04CE011 @@ -783,11 +783,11 @@ :1030E00098E025D0182F882319F06981802FB3DF4D :1030F000812F0F90DF91CF911F910F9108950F9322 :103100001F93FC01662379F094916150941309C0D8 -:10311000BF016F5F7F4FA801C9010E94075681E080 +:10311000BF016F5F7F4FA801C9010E94165681E071 :1031200003C0B196EFCF80E01F910F910895CF9229 :10313000DF92EF92FF921F93CF93DF93EC017A011E :103140006901162F112389F0BE016F5F7F4FC70100 -:103150000E94FE551150892B31F4FE01C491F601F5 +:103150000E940D561150892B31F4FE01C491F601E5 :10316000C08381E003C0A196EDCF80E0DF91CF91D5 :103170001F91FF90EF90DF90CF900895CF9301962D :10318000CCE26623D1F0FC01DA01AD017491772322 @@ -797,18 +797,18 @@ :1031C0001082CF9108958091200280688093200220 :1031D0008091230280FFFCCF81E080932302A091A5 :1031E0001002B0911102AE5BB109B7FF02C0A0E0BE -:1031F000B0E020E038EB4BE050E00E948155E091D8 +:1031F000B0E020E038EB4BE050E00E949055E091C9 :10320000B12EF091B22E843F9140A8F4878187308F :1032100019F480E180935B2C8681873019F480E17A :1032200080935A2C8091AC2E882389F0E0919E2EB9 :10323000F0919F2E19948781873019F481E1809352 :103240005B2C8681873019F481E180935A2C089594 -:10325000BC0183E090E20C94A953CF93DF93FC016F +:10325000BC0183E090E20C94B853CF93DF93FC0160 :103260006491EC012196662331F083E090E20E94A4 -:10327000F753CE01F4CFDF91CF910895AB01BC019C -:1032800083E090E20C94D35380E280936206089529 +:103270000654CE01F4CFDF91CF910895AB01BC018C +:1032800083E090E20C94E25380E28093620608951A :10329000CF93DF9380915E2C823031F583E090E212 -:1032A0000E9460540E943E4F83E090E20E947C5452 +:1032A0000E946F540E944D4F83E090E20E948B5425 :1032B000EC0197FD19C0E091B12EF091B22E8781FB :1032C000833019F483E180935B2C8681833019F479 :1032D00083E180935A2C8C2F79D6811105C08C2FD5 @@ -816,36 +816,36 @@ :1032F0005E2C813079F028F08230C9F0833011F1F2 :103300002EC08091680685FF31C08FE08093022037 :1033100081E015C0809102208150809302208111AC -:1033200025C00E94A90D0E94D65282E008C080915B +:1033200025C00E94A90D0E94E55282E008C080914C :10333000680685FD18C08FE08093022083E08093AB :103340005E2C0DC08091022081508093022081115B -:103350000DC00E949B520E94D70D10925E2C80914E +:103350000DC00E94AA520E94D70D10925E2C80913F :103360005E2C823019F481D70C948C220895E09160 :10337000B12EF091B22E8781823019F481E18093D1 :103380005B2C8681823019F481E180935A2C089558 :10339000E091B12EF091B22E8781823019F480E154 :1033A00080935B2C8681823019F480E180935A2CC3 -:1033B000089583E090E20C94845383E090E20C94AF -:1033C000CF5422ED3BE03F932F932CEC3BE03F9317 +:1033B000089583E090E20C94935383E090E20C94A0 +:1033C000DE5422ED3BE03F932F932CEC3BE03F9308 :1033D0002F9325EC3BE03F932F932EEB3BE03F9365 :1033E0002F932EE13BE03F932F9322E02F931F92E8 -:1033F0009F938F930E948C568DB79EB70E968DBF6C +:1033F0009F938F930E949B568DB79EB70E968DBF5D :103400009EBF85E6089560E072E00E94310E85E679 :103410000895FB0120812F3349F42181211106C039 :1034200060E072E00E94700E85E60895CB010E9474 :10343000420E882371F0E091B12EF091B22ECF01AF -:103440008B5A9E4265818F5F9F4F0E94C45C84E6C9 +:103440008B5A9E4265818F5F9F4F0E94D35C84E6BA :1034500008958AEC0895EF92FF920F931F93CF93F4 :10346000DF93CDB7DEB7A097CDBFDEBF7C01009163 :10347000AC2E10E00115110591F486E19BE09F93BD -:103480008F9382E08F931F92FF92EF920E948C564F +:103480008F9382E08F931F92FF92EF920E949B5640 :103490000F900F900F900F900F900F9010C0E09131 :1034A000A62EF091A72ECE01019619959801AE0196 :1034B0004F5F5F4F60E072E0C7010E94950E85E6A6 :1034C000A096CDBFDEBFDF91CF911F910F91FF90EE :1034D000EF900895DF92EF92FF920F931F93CF9397 :1034E000DF93CDB7DEB7A097CDBFDEBF7B010091E4 -:1034F000AC2E10E06FE07BE0C7010E94FE55892BE7 +:1034F000AC2E10E06FE07BE0C7010E940D56892BD7 :1035000029F5D12CED2CF12CE016F10658F40E948F :10351000780EE1E0F0E0EC0FFD1FEE0DFF1D808363 :10352000D394F0CFE091A82EF091A92ECE01019670 @@ -859,17 +859,17 @@ :1035A0008093AD2E04C0203321F41092AD2E84E61A :1035B00008952F33C1F41F9220E32F931F9221E32C :1035C0002F9329E03BE03F932F9322E02F931F920C -:1035D0009F938F930E948C568DB79EB70A968DBF8E +:1035D0009F938F930E949B568DB79EB70A968DBF7F :1035E0009EBF85E608958AEC089582E291E1BDD4FC :1035F0008EE6089582EA91E1D3D48EE60895E0EC58 -:10360000F4E081818E7F81830E949B520E949D0DF8 +:10360000F4E081818E7F81830E94AA520E949D0DE9 :1036100084E60895E0ECF4E081818E7F81830E944E -:103620009B520E94A30D84E60895E6E9FEE22589F7 +:10362000AA520E94A30D84E60895E6E9FEE22589E8 :103630002F9324892F9326E03BE03F932F9322E0A2 -:103640002F931F929F938F930E948C568DB79EB796 +:103640002F931F929F938F930E949B568DB79EB787 :1036500008968DBF9EBF85E608952091AC2E1F92DF :103660002F9323E03BE03F932F9322E02F931F9271 -:103670009F938F930E948C568DB79EB708968DBFEF +:103670009F938F930E949B568DB79EB708968DBFE0 :103680009EBF85E6089540E052E0BC0180E0F6D898 :1036900085E60895FB0120812F3341F4218121111A :1036A00005C060E072E0D9D885E6089580E0F8D8DA @@ -898,7 +898,7 @@ :1038100063D9813028E0920718F09C01385002C02B :1038200020E030E03F932F939F938F9383EE9AE0B5 :103830009F938F9382E08F931F92DF93CF930E9489 -:103840008C568DB79EB70A968DBF9EBF85E6DF91D9 +:103840009B568DB79EB70A968DBF9EBF85E6DF91CA :10385000CF9108958BE994E1A3D38EE608954BDAD6 :1038600084E60895FDD884E6089560E072E04EDBBA :1038700085E60895CB0151DB811102C08AEC0895E1 @@ -907,7 +907,7 @@ :1038A00080FD02C089E7089588E70895DF92EF92CE :1038B000FF920F931F93CF93DF93EC010FEF11E073 :1038C00085E1E82E8DE0F82E9CE2D92EB70185EC3B -:1038D00093E20E94FE55892BD1F001151105B9F034 +:1038D00093E20E940D56892BD1F001151105B9F024 :1038E000DE01F7012491ED012196C8010197222301 :1038F00041F00130110529F02C93DE0131968C0145 :10390000F1CFDC928C0188E1E80EF11CDFCF21972A @@ -915,17 +915,17 @@ :10392000DF900895FC01809120028068809320023E :103930008091230280FFFCCF81E080932302A0913D :103940001002B0911102AE5BB109B7FF02C0A0E056 -:10395000B0E020E038EB4BE050E00E948155AA2710 +:10395000B0E020E038EB4BE050E00E949055AA2701 :10396000BB279F938F938CED9AE09F938F9382E078 -:103970008F931F92FF93EF930E948C568DB79EB743 +:103970008F931F92FF93EF930E949B568DB79EB734 :1039800008968DBF9EBF85E608954EB15FB1209128 :10399000080430910904242B352B3F932F9326EDF7 :1039A0003AE03F932F9322E02F931F929F938F93A0 -:1039B0000E948C568DB79EB708968DBF9EBF85E638 +:1039B0000E949B568DB79EB708968DBF9EBF85E629 :1039C00008950F931F93CF93DF931F921F92CDB74C :1039D000DEB78B01E091B12EF091B22E8581893056 :1039E00009F06FC0E0919E2EF0919F2E199581E015 -:1039F0008093B82C60E270E0C8010E9444560097A2 +:1039F0008093B82C60E270E0C8010E945356009793 :103A0000F9F4F80101900020E9F73197E01BF10B80 :103A1000E0FD59C0F695E795E130F10539F487E00E :103A200090E08093942E9093952E37C053E0EE0F44 @@ -943,11 +943,11 @@ :103AE000DF931F921F92CDB7DEB78B01E091B12E0D :103AF000F091B22E8581893009F080C0E0919E2E30 :103B0000F0919F2E199582E08093B82C60E270E0CE -:103B1000C8010E9444567C01892B31F5F8010190BF +:103B1000C8010E9453567C01892B31F5F8010190B0 :103B20000020E9F73197E01BF10BE0FD69C0F69545 :103B3000E795E130F10539F487E090E08093942E29 :103B40009093952E47C053E0EE0FFF1F5A95E1F773 -:103B5000CF0169E070E00E946D55E81BF90BE0931E +:103B5000CF0169E070E00E947C55E81BF90BE0930F :103B6000942EF093952E36C0C8010496E816F906F7 :103B700009F046C0A80162E070E0CE0101960E9403 :103B8000C00E898190E0982F88272A81820F911D8D @@ -961,57 +961,57 @@ :103C00008AEC0F900F90DF91CF911F910F91FF9051 :103C1000EF900895E091B12EF091B22E8581893018 :103C2000A1F4E0919E2EF0919F2E199585E080934E -:103C3000B82C0E9462460E94072C8CE696E4809382 +:103C3000B82C0E9471460E94072C8BE796E4809373 :103C40006D2C90936E2C8FEF089589EC0895E09180 :103C5000B12EF091B22E85818930A1F4E0919E2E93 -:103C6000F0919F2E199583E08093B82C0E946246B4 -:103C70000E94072C8CE696E480936D2C90936E2C1A +:103C6000F0919F2E199583E08093B82C0E947146A5 +:103C70000E94072C8BE796E480936D2C90936E2C1A :103C80008FEF089589EC0895E091B12EF091B22E56 :103C900085818930A1F4E0919E2EF0919F2E199597 -:103CA00086E08093B82C0E9462460E94072C8CE626 +:103CA00086E08093B82C0E9471460E94072C8BE717 :103CB00096E480936D2C90936E2C8FEF089589EC91 :103CC0000895E091B12EF091B22E4085518564E6C1 :103CD000649F9001659F300D11243F932F9320ED39 :103CE0003AE03F932F9322E02F931F929F938F935D -:103CF0000E948C568DB79EB708968DBF9EBF85E6F5 +:103CF0000E949B568DB79EB708968DBF9EBF85E6E6 :103D00000895CF93DF931F921F92CDB7DEB7FB01CB :103D100020812F33B1F42181211113C02EE93AE023 :103D20003F932F9322E02F931F929F938F930E9494 -:103D30008C560F900F900F900F900F900F9085E67C +:103D30009B560F900F900F900F900F900F9085E66D :103D40002EC089E592E089839A83CE0101969F93E4 :103D50008F938AE99AE09F938F937F936F930E944A -:103D6000C2560F900F900F900F900F900F90892BCD +:103D6000D1560F900F900F900F900F900F90892BBE :103D7000A9F069817A816935F2E07F0778F4E091F2 :103D8000B12EF091B22E60877187CF01885A9E4282 -:103D90008F5F9F4F0E94CD5C84E601C08AEC0F903C +:103D90008F5F9F4F0E94DC5C84E601C08AEC0F902D :103DA0000F90DF91CF910895E091B12EF091B22E56 :103DB00023852F9322852F9327E93AE03F932F9372 -:103DC00022E02F931F929F938F930E948C568DB762 +:103DC00022E02F931F929F938F930E949B568DB753 :103DD0009EB708968DBF9EBF85E60895CF93DF936B :103DE0001F921F92CDB7DEB7FB0120812F33B1F4B4 :103DF0002181211113C02FE02F932FEF2F9326E461 :103E00003AE03F932F9322E02F931F929F938F933B -:103E10000E948C56CDBFDEBF85E630C019821A8263 +:103E10000E949B56CDBFDEBF85E630C019821A8254 :103E2000CE0101969F938F9382E49AE09F938F93A4 -:103E30007F936F930E94C2560F900F900F900F9038 +:103E30007F936F930E94D1560F900F900F900F9029 :103E40000F900F90892BC9F069817A81611590E1FB :103E5000790798F46093380370933903E091B12E99 :103E6000F091B22E62877387CF01865A9E428F5F90 -:103E70009F4F0E94CD5C84E601C08AEC0F900F90AA +:103E70009F4F0E94DC5C84E601C08AEC0F900F909B :103E8000DF91CF910895FB0120812F33D9F4218157 :103E9000211121C01F9220E32F931F9221E32F9322 :103EA0002CE33AE03F932F9322E02F931F929F93AE -:103EB0008F930E948C568DB79EB70A968DBF9EBF7A +:103EB0008F930E949B568DB79EB70A968DBF9EBF6B :103EC00085E60895213311F4E9D303C0203319F4B2 :103ED0000BD484E608958AEC0895FC0180910008D3 :103EE000813029F480918C0891E0833009F090E0D2 :103EF00090FF02C081E301C080E38083118285E6E8 :103F00000895E091B12EF091B22E85818930A1F40F :103F1000E0919E2EF0919F2E199584E08093B82C0D -:103F20000E9462460E94072C8CE696E480936D2CDA +:103F20000E9471460E94072C8BE796E480936D2CCB :103F300090936E2C8FEF089589EC089589E00E948C :103F4000F80DE0919E2EF0919F2E199587E08093B9 -:103F5000B82C0E9462460E94072C8CE696E480935F +:103F5000B82C0E9471460E94072C8BE796E4809350 :103F60006D2C90936E2C8FEF089521E020936C2C94 :103F700020936B2C2CE32093692C25E030E02093D8 :103F8000672C3093682C1092612C1092622C109246 @@ -1027,7 +1027,7 @@ :1040200084C081C080936A2C84E014C090E04091E9 :104030006A2C2FEF30E0241B31098217930721F4FB :1040400085E008C0891779F165E183E090E20E947C -:10405000F75382E080936C2C68C02091652C3091DE +:10405000065482E080936C2C68C02091652C3091CE :10406000662CA9014F5F5F4F4093652C5093662CDF :10407000F901ED5EF04D80834038510509F055C0DF :1040800086E0E8CF20916A2C90916B2C29134FC0C9 @@ -1038,33 +1038,33 @@ :1040D0006B2C8F5F80936B2C8091612C9091622C64 :1040E000A091632CB091642C80589F4FAF4FBF4F6D :1040F0008093612C9093622CA093632CB093642CDA -:1041000066E083E090E20E94F75382E080936C2C9B -:10411000A9C068E183E090E20E94F75368E183E080 -:1041200090E20E94F75310926C2CC1E09BC030E0EB +:1041000066E083E090E20E94065482E080936C2C8B +:10411000A9C068E183E090E20E94065468E183E070 +:1041200090E20E94065410926C2CC1E09BC030E0DB :10413000892F90E001972817390781F766E085CF2E :10414000853119F410926B2C08C08B3161F38831E2 :1041500009F45FCF863009F05AC080916B2C8F5FD5 :1041600080936B2C4091612C5091622C6091632C58 :104170007091642CE0915F2CF091602C20E830E08D :1041800083E19FE21995C82F8823D1F161E083E094 -:1041900090E20E94F75360916B2C83E090E20E94C2 -:1041A000F75360916B2C609583E090E20E94F75387 +:1041900090E20E94065460916B2C83E090E20E94B2 +:1041A000065460916B2C609583E090E20E94065467 :1041B00060E870E083E19FE261D8E3E1FFE260E064 :1041C0008FE2E339F80719F08191680FF9CF83E0A6 -:1041D00090E20E94F7538091612C9091622CA09103 +:1041D00090E20E9406548091612C9091622CA091F3 :1041E000632CB091642C80589F4FAF4FBF4F80938A :1041F000612C9093622CA093632CB093642C32C0FA -:1042000064E083E090E20E94F75389E023CF853198 -:1042100009F08BCF61E083E090E20E94F753609158 -:104220006B2C83E090E20E94F75360916B2C6095B9 -:1042300083E090E20E94F75360E870E083E19FE240 +:1042000064E083E090E20E94065489E023CF853188 +:1042100009F08BCF61E083E090E20E940654609148 +:104220006B2C83E090E20E94065460916B2C6095A9 +:1042300083E090E20E94065460E870E083E19FE230 :104240001DD8E3E1FFE283E99FE260E08E179F075C -:1042500019F02191620FFACF83E090E20E94F753A8 +:1042500019F02191620FFACF83E090E20E94065498 :1042600064CFC0E08C2FCF91089580916C2C813069 :1042700019F0873029F108958091672C9091682C6E :104280009C01215031092093672C3093682C892B95 :1042900031F58091692C9FEF980F9093692C8823BA -:1042A00031F065E183E090E20E94F75302C0109282 +:1042A00031F065E183E090E20E94065402C0109272 :1042B0006C2C85E090E08093672C9093682C089597 :1042C0008091672C9091682C9C012150310920939A :1042D000672C3093682C892B11F410926C2C089564 @@ -1079,7 +1079,7 @@ :1043600091E09093712C4EB15FB12091080430918F :104370000904242B352B20936F2C3093702C089537 :1043800089EC08950F931F93CF93DF938C01C5E1C0 -:10439000DDE0BE01C8010E94FE55892B49F440E0D2 +:10439000DDE0BE01C8010E940D56892B49F440E0C2 :1043A00050E060E0CE01DF91CF911F910F91B1CF2E :1043B000689680E1C53DD80761F7DF91CF911F91E5 :1043C0000F910895EF92FF921F93CF93DF93982F51 @@ -1094,7 +1094,7 @@ :1044500009F440C08D7F8D33E9F1E3E1FFE27F0194 :104460001191112331F01F3321F01D3311F010325F :10447000B1F7F7011082C5E1DDE0BE0183E19FE203 -:104480000E94FE55892B59F41092132FA7014F5FFC +:104480000E940D56892B59F41092132FA7014F5FEC :104490005F4F612FCE013DDF8F3FB9F124C0689699 :1044A000F0E1C53DDF0749F715C0883061F4809120 :1044B000722C9091732C009741F101978093722C8C @@ -1107,7 +1107,7 @@ :10452000E091B12EF091B22E208531852115310513 :1045300051F14EB15FB18091080490910904842B30 :10454000952B40916F2C5091702C841B950B64E639 -:1045500070E00E946D5562177307A8F01092712CDD +:1045500070E00E947C5562177307A8F01092712CCE :104560008BECBEDE0E942D1983EE9BE00E942D197C :10457000E0916D2CF0916E2C309729F019951092E6 :104580006D2C10926E2C08958091712C8823A9F0C7 @@ -1335,7 +1335,7 @@ :1053600009F4A2C084B195B1892B09F49DC084B120 :1053700095B1089718F414B815B896C044B155B152 :10538000495F5F4FB3E056954795BA95E1F763E102 -:1053900071E3CE0101960E94235683E191E38AB91D +:1053900071E3CE0101960E94325683E191E38AB90E :1053A0009BB944B155B114B815B8898186958695D5 :1053B000898322E030E024173507B0F5F901A3E036 :1053C000F695E795AA95E1F781E090E08C0F9D1F97 @@ -1369,7 +1369,7 @@ :1055800063E171E383E4199504B115B1013094E04E :10559000190708F024C114B815B8A801495F5F4F76 :1055A00023E0569547952A95E1F763E171E383E996 -:1055B00091E30E94235683E191E38AB99BB986B1B6 +:1055B00091E30E94325683E191E38AB99BB986B1A7 :1055C0008695806886B984B195B1019684B995B9FC :1055D00087709927892B39F484E191E38AB99BB9C3 :1055E00086B18093133186B1869586B984B195B121 @@ -1454,30 +1454,30 @@ :105AD00009F4ABC0803709F047C0F8019281898191 :105AE0009813B2C093818A819813AEC094818B8140 :105AF0009813AAC095818C819813A6C084E08083F6 -:105B000061E070E0C8010E94B03783E029C08539A8 +:105B000061E070E0C8010E94BF3783E029C0853999 :105B100031F644E050E064E070E0CE0101960E946E :105B20002A0FF8018181803209F47FC08037E1F4C7 :105B3000F80192818981981387C093818A81981393 :105B400083C094818B8198137FC095818C81981339 -:105B50007BC0108261E070E0C8010E94B03784E031 +:105B50007BC0108261E070E0C8010E94BF3784E022 :105B600080938C2C38E171C0E82EE294AFE0EA22F9 :105B7000EA94EA948F70F82E88E090E08F199109EA :105B80002FEF30E0690102C0D594C7948A95E2F7FF :105B9000F5E0EF1629F024E0E2122AC0FF20E1F040 :105BA00044E050E0B8016E5F7F4FCE0101960E9445 -:105BB0001656892B61F499818A8189279B818927CF +:105BB0002556892B61F499818A8189279B818927C0 :105BC0009C818927F801968189278C2171F1F4E065 :105BD000EF120EC0F11038C044E050E0B8016E5F23 -:105BE0007F4FCE0101960E941656892BF1F02CC0F2 +:105BE0007F4FCE0101960E942556892BF1F02CC0E3 :105BF00023E02E1548F1F12CA701B8016E5F7F4F0D -:105C0000CE0101960E941656892BF1F4D801AE0DF3 +:105C0000CE0101960E942556892BF1F4D801AE0DE4 :105C1000BF1DE1E0F0E0EC0FFD1FEE0DFF1D129641 :105C20009C9180818927C82279F43981F8013083D9 :105C30002A8121839B8192838C81838323279227CE :105C40008927848338E201C030E020E0832F922F3F :105C5000CCC1695F7F4F83E0769567958A95E1F7C0 :105C60006330710508F41BCF62507109C8010E94AE -:105C7000DB37811102CF81E092C11092892C809193 +:105C7000EA37811102CF81E092C11092892C809184 :105C8000AD2E81118BC16091882CF4E06F9FB00123 :105C9000112444E050E0C80102967EC1803A09F424 :105CA00055C0823AC1F1F7CEF801F18080918D2C78 @@ -1486,7 +1486,7 @@ :105CD00010F0F80131C1C12CD12CF4E0FF9EB001CD :105CE000112444E050E0C8018C0D9D1D0E942A0F34 :105CF000F394EF1001C0F12C24E0C20ED11C80E11E -:105D0000C816D10451F760E170E0C8010E94B037B5 +:105D0000C816D10451F760E170E0C8010E94BF37A6 :105D100080E990E06AC1F801F180F1E0FF15C8F672 :105D200080918A2CF816A8F68F2DE5DD882309F4DA :105D3000C2C0C80102962091AD2E21112FC1F4E0FE @@ -1501,24 +1501,24 @@ :105DC0006ECEF801108284E0818383E0828381E0DB :105DD00083838483158280918A2C843111F08EE034 :105DE00001C08BE0F801868383E0878368E070E080 -:105DF000C8010E94B03780E590E0F7C0F801D1807B +:105DF000C8010E94BF3780E590E0F7C0F801D1806C :105E0000E280ED1408F465CF80918A2CD81608F052 :105E100060CFE81608F05DCF8091852C882351F083 :105E20008D2D69DD882309F446C08E2D64DD88231D :105E300009F441C0F12C6D2D70E0E61AF70AFFEF6E :105E4000EF1AFF0AEE0CFF1CEE0CFF1C660F771F0B :105E5000660F771FA701C8010E942A0FB701C8016A -:105E60000E94B037C7010296F3E0880F991FFA9598 +:105E60000E94BF37C7010296F3E0880F991FFA9589 :105E7000E1F7BBC060918A2C660F660F6051E62E79 :105E8000F12CB701685F7F4F44E050E0CE010196EE :105E90000E942A0F9981F801818198130CC09A8180 :105EA0008281981308C09B818381981304C09C81D0 :105EB0008481981711F086E072C081E08093872C6E :105EC000B701645F7F4F42E050E0C8010E942A0F93 -:105ED00062E070E0C8010E94B03780E290E085C0C7 +:105ED00062E070E0C8010E94BF3780E290E085C0B8 :105EE000F8016181633008F0F4CE80918A2C70E073 :105EF000680F711D660F771F660F771F43E050E034 -:105F0000C8010E942A0F63E070E0C8010E94B03708 +:105F0000C8010E942A0F63E070E0C8010E94BF37F9 :105F100088E290E06AC0F8012181E22EF12C9E2DEA :105F20008827856A092E000CAA0BBB0B32814C0115 :105F30005D01A32A233010F0108233C080918A2C97 @@ -1529,10 +1529,10 @@ :105F80008A2CB701680F711D660F771F660F771F88 :105F900044E050E0CE0101960E94780F8AE0F801BB :105FA000808384E090E021C040E250E06AEC70E041 -:105FB000C8010E943D5660E270E0C801D1D780E17F +:105FB000C8010E944C5660E270E0C801E0D780E161 :105FC00091E013C060918A2C660F660F605170E0FB :105FD0006B5F7F4F41E050E0C8010E942A0F61E0F3 -:105FE00070E0C801BDD788E190E02496CDBFDEBF48 +:105FE00070E0C801CCD788E190E02496CDBFDEBF39 :105FF000DF91CF911F910F91FF90EF90DF90CF90A5 :10600000BF90AF909F908F900895CF93DF93EC0156 :1060100043E050E060E070E00E942A0F44E050E06E @@ -1551,1506 +1551,1508 @@ :1060E00088E080938F2C10928E2C089581E080930D :1060F000B12C82E090E08093902C9093912C88E1D9 :1061000080938F2C10928E2C089581E08093B12C77 -:10611000089508958F929F92AF92BF92CF92DF928F -:10612000EF92FF920F931F93CF93DF93CDB7DEB71C -:106130006297CDBFDEBF8C015B018091B12C6730CF -:10614000710501F5F8019081882311F0963211F064 -:106150009235C1F421E0811120E020938E2C882318 -:1061600011F0963211F0923559F49091902C809163 -:10617000912CF801908381838FEF8093922C37C00C -:10618000A12CB12C853009F497C050F48230A1F1D4 -:10619000C8F0833009F468C0843009F481C0ACC50C -:1061A000883009F41CC138F4863009F491C0873076 -:1061B00009F4CAC0A1C5893009F441C38D3008F47F -:1061C00063C39AC5982F9095917090938E2CF80187 -:1061D0009081882311F0963219F0923509F006C4A7 -:1061E0009091902C8091912CF8019083818384E090 -:1061F0008093B12C80E181C5F8018081982F9D7F2B -:10620000913419F48AE080835AC38033C1F462E088 -:1062100070E0C801D0D6882309F494C0F8016181E8 -:10622000F0E16F9FB001112440E150E0C8010E94ED -:106230002A0F60E170E0C80193D680E95EC5803A1C -:1062400079F462E070E0C801B6D6882309F47AC018 -:10625000F80181818093A82C83E08093B12CD2CF68 -:10626000803509F049C54AC060E170E0C801A3D695 -:10627000882389F08091AD2E81110BC06091A82CEC -:10628000F0E16F9FB001112440E150E0C8010E948D -:10629000780F8AE001C081E0F801808382E00DC3BD -:1062A00090918E2CF8018081911102C08632D1F03C -:1062B000823509F0A3C316C090918E2CF80180811D -:1062C000911102C0863271F0823509F045C40AC0CE -:1062D00090918E2CF8018081911102C0863211F0CC -:1062E000823551F42091902C8091912CF8012083DB -:1062F000818381E0892777C38035C9F4F8018181E2 -:10630000882319F0F8011082DAC262E070E0C80157 -:1063100052D68823B9F0E091AE2EF091AF2E40E036 -:1063200060E070E081E919951092B12CE5C490EA23 -:10633000980F923008F0B4C462E070E0C8013BD618 -:106340008111DDC481E04FC2C8010E94643D64E058 -:106350007801F4E0EF0EF11CC7010E948040E0914B -:10636000AE2EF091AF2E44E0B70180EA1995F80106 -:1063700094818091A92C981329C095818091AA2C91 -:10638000981324C096818091AB2C98131FC09781DD -:106390008091AC2C98131AC08091AD2C8083809191 -:1063A000AE2C81838091AF2C82838091B02C83832B -:1063B00064E0C8010E949942E091AE2EF091AF2EA8 -:1063C00044E0B80181EA199588E004C2E091AE2E5C -:1063D000F091AF2E44E069EA7CE280EC2DC2F80136 -:1063E0008081803551F48181811107C08281873598 -:1063F00021F483818D3C09F405C264E0C8010E9448 -:106400008040F8018081803309F0BDC062E070E017 -:10641000C801D1D5882309F4A7C0F801618167FDBF -:1064200004C0862F8370833029F0862F8F708F30C1 -:1064300009F07FC06093A82C8091932C9091942CAC -:106440003091952C282F22952095492F4227407F67 -:1064500009F03FC023272F70E1F59295909593277F -:10646000907FB9F5262F67FD02C0237003C02F70FF -:1064700009F023E08095432F42954F702223B1F01D -:1064800090E0022E02C0959587950A94E2F7E32FDB -:10649000F0E0022E02C0F595E7950A94E2F73E2F50 -:1064A00050E002C0559547952A95E2F740FBCC2471 -:1064B000C0F8D12CF601EE0FFF1FEE0FFF1F30FBCF -:1064C000EE24E0F8F12CEE0CFF1CEE298170E82B95 -:1064D00001C0E7E0F0E08091A72CEE0FFF1FE25C27 -:1064E000FF4DE80FF11D8081F8019801205F3F4FBB -:1064F00011922E173F07E1F79091962CF8019187A2 -:1065000082FF09C09091932C96839091942C97834D -:106510009091952C908784FF15C06360F0E16F9F88 -:10652000B0011124665F7F4F46E050E0C8010A9633 -:1065300007C080E1689FB001112440E150E0C8012C -:106540000E942A0F60E170E0C8010AD5E091AE2EEA -:10655000F091AF2E42E1B80180E8199562E1C801DF -:106560000E94994280E939C10E948B3F91E08927BE -:10657000F8018083E091AE2EF091AF2E44E0B80197 -:1065800081EC19959CC1803A61F462E070E0C80129 -:1065900012D58823D9F1F80181818093A82C89E054 -:1065A0000DC0803C89F462E070E0C80104D5882306 -:1065B00069F1F80181818093A82C8BE08093B12C44 -:1065C0000E948B3F9AE00EC1813C91F462E070E042 -:1065D000C801F1D48823D1F0F80181818093A82CDF -:1065E000FAE0FF2EF092B12C0E948B3F8F25FBC06A -:1065F000823C99F462E070E0C801DDD4882331F078 -:10660000F80181818093A82C8CE0D8CFE091AE2E48 -:10661000F091AF2E44E0B80121C0803B11F562E05B -:1066200070E0C801C8D4E091AE2EF091AF2E44E0E6 -:10663000B801882399F086E819958091AD2E8111D3 -:10664000BFCFF8016181F0E16F9FB001112440E1FB -:1066500050E087E99CE20E94780FB2CF81EC199557 -:10666000BEC090EA980F923008F0BFC062E070E0C0 -:10667000C801A1D4882309F4B2C0F8018081803612 -:1066800021F0EAE3CE2ED12C03C070E3C72ED12C2B -:10669000F801818187FF0CC0807FF0E18F9F70013E -:1066A000112480ECC80ED11C66EFA62EB12C08C0B8 -:1066B0008C7F90E1899F7001112456E3A52EB12CA7 -:1066C000E091AE2EF091AF2E42E0B80180E919952D -:1066D000F801808181708093A72CC70144E09695D2 -:1066E00087954A95E1F78093A82C9091922C981762 -:1066F00069F0B5016E0D7F1D44E050E083E99CE236 -:106700000E942A0F8091A82C8093922C68E0CE01E1 -:1067100001960E947B0E8091AC2E44E050E08730C1 -:1067200019F463E070E002C060E070E0CE010F9603 -:106730000E942A0FB6016E0D7F1D46E050E0CE018B -:1067400009960E942A0F89818093A92C8A818093BF -:10675000AA2C8B818093AB2C8C818093AC2C60E431 -:1067600089EA9CE20E94B3448091A92C8093AD2CCD -:106770008091AA2C8093AE2C8091AB2C8093AF2C6F -:106780008091AC2C8093B02C60E28DEA9CE20E9458 -:10679000B34420E0AE014F5F5F4FBE01615F7F4FAA -:1067A000CE010996E6D68981F80180838A818183AA -:1067B0008B8182838C818383E058FF4F8D8180831E -:1067C00031968E81808331968F8180833196888542 -:1067D000808387E08093B12C80E290E16CC30E94BB -:1067E0008B3F91E08927F8010ECD8035B9F4F8018F -:1067F0008181811187CD62E070E0C801DCD38823FC -:1068000009F4A0CD1092B12CE091AE2EF091AF2EF4 -:1068100040E060E070E081E919956EC2A501495F32 -:106820005F4F33E0569547953A95E1F7E091AE2EEC -:10683000F091AF2EB80182E9199581E0D4C062E1F0 -:10684000C8010E94804060E170E0C801B4D3E091CB -:10685000AE2EF091AF2E882329F142E1B80181E8F4 -:1068600019958091AD2E81110BC06091A82CF0E19B -:106870006F9FB001112440E150E0C8010E94780FE1 -:106880000E948B3F9AE015C066E0C8010E948040DC -:1068900064E070E0C8018FD3811113C0E091AE2E87 -:1068A000F091AF2E44E0B80181EC19950E948B3F26 -:1068B00091E08927F801808388E08093B12C84E0FF -:1068C0001CC26091A82CF0E16F9FB001112440E13F -:1068D00050E087E99CE20E942A0F9091972C8091CA -:1068E0009B2C80959813E3C280919F2C9813DFC254 -:1068F0009091982C80919C2C80959813D8C280916F -:10690000A02C9813D4C29091992C80919D2C8095A5 -:106910009813CDC28091A12C9813C9C290919A2C42 -:1069200080919E2C80959813C2C28091A22C9813BE -:10693000BEC29091A32C8091A42C80959813B7C2CD -:106940008091A52C9813B3C28091A62C80959813A2 -:10695000AEC2C090972CD090982CE090992CF090DB -:106960009A2CF80180809180A280B3808091B12C14 -:106970008B3009F081C2E091AE2EF091AF2E46E04F -:10698000B80185E81995C818D908EA08FB08C0922B -:10699000972C33272F2D1E2D0D2D0093982CA701FA -:1069A000662777274093992C8F2D9927AA27BB27F5 -:1069B00080939A2CEC2DE095E0939B2CE02FE095B2 -:1069C000E0939C2CE42FE095E0939D2CE82FE0953C -:1069D000E0939E2CC0929F2C0093A02C4093A12C5E -:1069E0008093A22C88E08093B12C86C1903409F06A -:1069F00083C182E08093B12C8AE0F5CE833909F01F -:106A000093CC8091AC2E873009F0A1C043E050E0D8 -:106A100060E070E0CE0102960E942A0F88E8898328 -:106A2000F8019181903219F0903761F024C0F8019B -:106A300080833A8131832B8122839C819383232716 -:106A400082272AC1F8018281883809F055C19381D3 -:106A50008A81981351C194818B8198134DC195817E -:106A60008C81981349C184E0808361E070E0C801A3 -:106A700077D285E09FC0E92EE294EFE0EE22EA941F -:106A8000EA949F70F92E88E090E08F1991092FEF1A -:106A900030E0690102C0D594C7948A95E2F7F5E029 -:106AA000EF1629F084E0E8122AC0FF20E1F044E06C -:106AB00050E0B8016E5F7F4FCE0101960E941656DE -:106AC000892B61F49A818B81892798E889279C8199 -:106AD0008927F801968189278C2189F1F4E0EF124A -:106AE0000EC0F11009C144E050E0B8016E5F7F4F65 -:106AF000CE0101960E941656892B09F1FDC083E054 -:106B00008E1508F4F9C0F12CA701B8016E5F7F4F14 -:106B1000CE0101960E941656892B09F0EDC0D801CE -:106B2000AE0DBF1DE1E0F0E0EC0FFD1FEE0DFF1D0F -:106B300012969C9180818927C82209F0DDC098E8CF -:106B4000F80190833A8131832B812283A1C044E0F4 -:106B500050E060E070E007C0853909F0E5CB44E023 -:106B600050E063E070E0CE0101960E942A0FF80128 -:106B70008181803209F485C0803701F5F801928166 -:106B800089819813B9C093818A819813B5C0948183 -:106B90008B819813B1C095818C819813ADC0809181 -:106BA0008F2C808361E070E0C801DAD18FEF809391 -:106BB000922C86E08093B12C88E19FC0E82EE2946D -:106BC0007FE0E722EA94EA948F70F82E88E090E064 -:106BD0008F1991092FEF30E0690102C0D594C79455 -:106BE0008A95E2F7F5E0EF1629F084E0E8122AC072 -:106BF000FF20E1F044E050E0B8016E5F7F4FCE012E -:106C000001960E941656892B61F499818A81892701 -:106C10009B8189279C818927F801968189278C216E -:106C200081F1F4E0EF120EC0F11066C044E050E0D4 -:106C3000B8016E5F7F4FCE0101960E941656892BD8 -:106C400001F15AC083E08E1508F456C0F12CA7015B -:106C5000B8016E5F7F4FCE0101960E941656892BB8 -:106C600009F04AC0D801AE0DBF1DE1E0F0E0EC0F25 -:106C7000FD1FEE0DFF1D12969C9180818927C82271 -:106C8000D9F53981F80130832A8121839B81928350 -:106C90008C818383232792278927848388E22DC0D0 -:106CA000823C09F0CBC0F8018181803E09F0CFC061 -:106CB0008281843B09F0CBC046E050E06AEA74E090 -:106CC000CE0101960E942A0F89818B3409F03ACBBC -:106CD0008A81893709F036CB8B818B3109F032CB31 -:106CE0008C818A3E09F02ECB8D818B3709F02ACB1F -:106CF0008E818C3C09F026CB80E090E0DCC0F8016E -:106D00008081803621F06AE3C62ED12C03C050E387 -:106D1000C52ED12CF801818187FF0CC0807FF0E166 -:106D20008F9F7001112480ECC80ED11C46EFA42E59 -:106D3000B12C08C08C7F90E1899F7001112436E34B -:106D4000A32EB12CE091AE2EF091AF2E42E0B8010F -:106D500080E91995F801808181708093A72CC70183 -:106D600024E0969587952A95E1F78093A82CB501A4 -:106D70006E0D7F1D44E050E083E99CE20E942A0FE3 -:106D80008091A82C8093922C68E0CE0101960E94FD -:106D90007B0E8091AC2E44E050E0873019F463E024 -:106DA00070E002C060E070E0CE010F960E942A0FF2 -:106DB000B6016E0D7F1D46E050E0CE0109960E949F -:106DC0002A0F89818093A92C8A818093AA2C8B8198 -:106DD0008093AB2C8C818093AC2C60E489EA9CE29C -:106DE0000E94B3448091A92C8093AD2C8091AA2C51 -:106DF0008093AE2C8091AB2C8093AF2C8091AC2CE7 -:106E00008093B02C60E28DEA9CE20E94B34487E05C -:106E10008093B12C8981F80180838A8181838B8161 -:106E200082838C818383AE014F5F5F4FBE01615FC0 -:106E30007F4FCE010996F0D080E25FCF982F9F77E9 -:106E4000903329F0803A19F0805C833078F481E047 -:106E50008093B12C84E0F8018083E091AE2EF09114 -:106E6000AF2E40E060E070E082EC8BCBE091AE2E84 -:106E7000F091AF2E40E0DECC8A3069F4E091AE2E86 -:106E8000F091AF2E46E0B80184E81995C80CD91CE2 -:106E9000EA1CFB1C7CCD8C3009F079CDE091AE2E44 -:106EA000F091AF2E46E0B80187E8199570CD0E94A9 -:106EB0008B3F96E0FECC6296CDBFDEBFDF91CF91D7 -:106EC0001F910F91FF90EF90DF90CF90BF90AF9008 -:106ED0009F908F900895CF93DF932091AC2E273011 -:106EE00071F4EC0143E050E060E070E00E942A0F92 -:106EF00044E050E063E070E0CE01039604C044E05B -:106F000050E060E070E0DF91CF910C942A0FCF93B6 -:106F1000DF931F92CDB7DEB72091AC2E273029F436 -:106F200047E050E060E070E015C0FC013081218155 -:106F300023273281232733812327298344E050E00C -:106F400060E070E00E94780F41E050E064E070E0A3 -:106F5000CE0101960E94780F0F90DF91CF91089596 -:106F600020E42093D00026EC2093D5002093D40079 -:106F700021E02093D000DC01680F791FA617B70726 -:106F800041F0ED91F0E0EE51FA4FE491E093D3003F -:106F9000F5CFE091D500F0E0EE51FA4FE491EC939B -:106FA000E091D400F0E0EE51FA4FE4911196EC93A9 -:106FB0001092D000089520E42093D00026EC209376 -:106FC000D5002093D40021E02093D000DC01680F8D -:106FD000791FA617B70741F0ED91F0E0EE51FA4F97 -:106FE000E491E093D300F5CFE091D500F0E0EE51CD -:106FF000FA4FE4918C918E130AC0E091D400F0E036 -:10700000EE51FA4FE49181E011969C919E1380E03D -:107010001092D000817008958F929F92BF92CF926C -:10702000DF92EF92FF920F931F93CF93DF93DC01D8 -:107030008C91D12C30E08695D7948695379586959E -:10704000D794869537958695D79486953795869566 -:10705000D7948695379511968C9111978695D794EC +:1061100082E490E08093902C9093912C88E180937E +:106120008F2C10928E2C089581E08093B12C0895CD +:1061300008958F929F92AF92BF92CF92DF92EF928B +:10614000FF920F931F93CF93DF93CDB7DEB7629784 +:10615000CDBFDEBF8C015B018091B12C6730710532 +:1061600001F5F8019081882311F0963211F09235F3 +:10617000C1F421E0811120E020938E2C882311F0BE +:10618000963211F0923559F49091902C8091912C87 +:10619000F801908381838FEF8093922C37C0A12CDC +:1061A000B12C853009F497C050F48230A1F1C8F0C9 +:1061B000833009F468C0843009F481C0ACC58830EC +:1061C00009F41CC138F4863009F491C0873009F411 +:1061D000CAC0A1C5893009F441C38D3008F463C336 +:1061E0009AC5982F9095917090938E2CF80190817C +:1061F000882311F0963219F0923509F006C4909177 +:10620000902C8091912CF8019083818384E080937D +:10621000B12C80E181C5F8018081982F9D7F913458 +:1062200019F48AE080835AC38033C1F462E070E0DD +:10623000C801D0D6882309F494C0F8016181F0E147 +:106240006F9FB001112440E150E0C8010E942A0F65 +:1062500060E170E0C80193D680E95EC5803A79F4C8 +:1062600062E070E0C801B6D6882309F47AC0F8016C +:1062700081818093A82C83E08093B12CD2CF80358C +:1062800009F049C54AC060E170E0C801A3D688237F +:1062900089F08091AD2E81110BC06091A82CF0E1A6 +:1062A0006F9FB001112440E150E0C8010E94780FB7 +:1062B0008AE001C081E0F801808382E00DC3909103 +:1062C0008E2CF8018081911102C08632D1F0823586 +:1062D00009F0A3C316C090918E2CF8018081911112 +:1062E00002C0863271F0823509F045C40AC090912F +:1062F0008E2CF8018081911102C0863211F0823516 +:1063000051F42091902C8091912CF801208381836D +:1063100081E0892777C38035C9F4F801818188231A +:1063200019F0F8011082DAC262E070E0C80152D6BA +:106330008823B9F0E091AE2EF091AF2E40E060E0FE +:1063400070E081E919951092B12CE5C490EA980F9C +:10635000923008F0B4C462E070E0C8013BD681110D +:10636000DDC481E04FC2C8010E94733D64E0780142 +:10637000F4E0EF0EF11CC7010E948F40E091AE2EB9 +:10638000F091AF2E44E0B70180EA1995F8019481AD +:106390008091A92C981329C095818091AA2C9813DB +:1063A00024C096818091AB2C98131FC09781809157 +:1063B000AC2C98131AC08091AD2C80838091AE2CA8 +:1063C00081838091AF2C82838091B02C838364E0A1 +:1063D000C8010E94A842E091AE2EF091AF2E44E099 +:1063E000B80181EA199588E004C2E091AE2EF091DF +:1063F000AF2E44E069EA7CE280EC2DC2F801808196 +:10640000803551F48181811107C08281873521F463 +:1064100083818D3C09F405C264E0C8010E948F406D +:10642000F8018081803309F0BDC062E070E0C801EE +:10643000D1D5882309F4A7C0F801618167FD04C0A4 +:10644000862F8370833029F0862F8F708F3009F06C +:106450007FC06093A82C8091932C9091942C3091C4 +:10646000952C282F22952095492F4227407F09F00F +:106470003FC023272F70E1F5929590959327907F49 +:10648000B9F5262F67FD02C0237003C02F7009F0F5 +:1064900023E08095432F42954F702223B1F090E086 +:1064A000022E02C0959587950A94E2F7E32FF0E05B +:1064B000022E02C0F595E7950A94E2F73E2F50E0D0 +:1064C00002C0559547952A95E2F740FBCC24C0F8C9 +:1064D000D12CF601EE0FFF1FEE0FFF1F30FBEE2455 +:1064E000E0F8F12CEE0CFF1CEE298170E82B01C0C6 +:1064F000E7E0F0E08091A72CEE0FFF1FE25CFF4D7C +:10650000E80FF11D8081F8019801205F3F4F119243 +:106510002E173F07E1F79091962CF801918782FFA3 +:1065200009C09091932C96839091942C978390918D +:10653000952C908784FF15C06360F0E16F9FB001D8 +:106540001124665F7F4F46E050E0C8010A9607C0FD +:1065500080E1689FB001112440E150E0C8010E9431 +:106560002A0F60E170E0C8010AD5E091AE2EF091EB +:10657000AF2E42E1B80180E8199562E1C8010E949E +:10658000A84280E939C10E949A3F91E08927F80129 +:106590008083E091AE2EF091AF2E44E0B80181EC03 +:1065A00019959CC1803A61F462E070E0C80112D58F +:1065B0008823D9F1F80181818093A82C89E00DC04E +:1065C000803C89F462E070E0C80104D5882369F159 +:1065D000F80181818093A82C8BE08093B12C0E94DC +:1065E0009A3F9AE00EC1813C91F462E070E0C801EC +:1065F000F1D48823D1F0F80181818093A82CFAE0AE +:10660000FF2EF092B12C0E949A3F8F25FBC0823C56 +:1066100099F462E070E0C801DDD4882331F0F8011C +:1066200081818093A82C8CE0D8CFE091AE2EF091A0 +:10663000AF2E44E0B80121C0803B11F562E070E06C +:10664000C801C8D4E091AE2EF091AF2E44E0B8015D +:10665000882399F086E819958091AD2E8111BFCFDE +:10666000F8016181F0E16F9FB001112440E150E039 +:1066700087E99CE20E94780FB2CF81EC1995BEC0E9 +:1066800090EA980F923008F0BFC062E070E0C80155 +:10669000A1D4882309F4B2C0F8018081803621F0AA +:1066A000EAE3CE2ED12C03C070E3C72ED12CF80123 +:1066B000818187FF0CC0807FF0E18F9F70011124E2 +:1066C00080ECC80ED11C66EFA62EB12C08C08C7FC2 +:1066D00090E1899F7001112456E3A52EB12CE09121 +:1066E000AE2EF091AF2E42E0B80180E91995F80185 +:1066F000808181708093A72CC70144E0969587958F +:106700004A95E1F78093A82C9091922C981769F004 +:10671000B5016E0D7F1D44E050E083E99CE20E94CC +:106720002A0F8091A82C8093922C68E0CE010196CC +:106730000E947B0E8091AC2E44E050E0873019F42B +:1067400063E070E002C060E070E0CE010F960E944E +:106750002A0FB6016E0D7F1D46E050E0CE0109966E +:106760000E942A0F89818093A92C8A818093AA2C68 +:106770008B818093AB2C8C818093AC2C60E489EA74 +:106780009CE20E94C2448091A92C8093AD2C809100 +:10679000AA2C8093AE2C8091AB2C8093AF2C80914F +:1067A000AC2C8093B02C60E28DEA9CE20E94C24443 +:1067B00020E0AE014F5F5F4FBE01615F7F4FCE01B2 +:1067C0000996E6D68981F80180838A8181838B814D +:1067D00082838C818383E058FF4F8D818083319643 +:1067E0008E81808331968F818083319688858083E6 +:1067F00087E08093B12C80E290E16CC30E949A3FC5 +:1068000091E08927F8010ECD8035B9F4F801818136 +:10681000811187CD62E070E0C801DCD3882309F4E0 +:10682000A0CD1092B12CE091AE2EF091AF2E40E0B1 +:1068300060E070E081E919956EC2A501495F5F4F84 +:1068400033E0569547953A95E1F7E091AE2EF091F9 +:10685000AF2EB80182E9199581E0D4C062E1C80188 +:106860000E948F4060E170E0C801B4D3E091AE2E89 +:10687000F091AF2E882329F142E1B80181E8199502 +:106880008091AD2E81110BC06091A82CF0E16F9F1B +:10689000B001112440E150E0C8010E94780F0E942D +:1068A0009A3F9AE015C066E0C8010E948F4064E0FC +:1068B00070E0C8018FD3811113C0E091AE2EF0912A +:1068C000AF2E44E0B80181EC19950E949A3F91E007 +:1068D0008927F801808388E08093B12C84E01CC272 +:1068E0006091A82CF0E16F9FB001112440E150E0CD +:1068F00087E99CE20E942A0F9091972C80919B2C13 +:1069000080959813E3C280919F2C9813DFC29091D9 +:10691000982C80919C2C80959813D8C28091A02CA3 +:106920009813D4C29091992C80919D2C80959813A6 +:10693000CDC28091A12C9813C9C290919A2C8091BC +:106940009E2C80959813C2C28091A22C9813BEC22F +:106950009091A32C8091A42C80959813B7C280911C +:10696000A52C9813B3C28091A62C80959813AEC223 +:10697000C090972CD090982CE090992CF0909A2C65 +:10698000F80180809180A280B3808091B12C8B30FF +:1069900009F081C2E091AE2EF091AF2E46E0B80131 +:1069A00085E81995C818D908EA08FB08C092972C01 +:1069B00033272F2D1E2D0D2D0093982CA701662710 +:1069C00077274093992C8F2D9927AA27BB2780934F +:1069D0009A2CEC2DE095E0939B2CE02FE095E09332 +:1069E0009C2CE42FE095E0939D2CE82FE095E0931C +:1069F0009E2CC0929F2C0093A02C4093A12C80939E +:106A0000A22C88E08093B12C86C1903409F083C118 +:106A100082E08093B12C8AE0F5CE833909F093CCE3 +:106A20008091AC2E873009F0A1C043E050E060E0D7 +:106A300070E0CE0102960E942A0F88E88983F8014F +:106A40009181903219F0903761F024C0F801808371 +:106A50003A8131832B8122839C8193832327822750 +:106A60002AC1F8018281883809F055C193818A8151 +:106A7000981351C194818B8198134DC195818C815C +:106A8000981349C184E0808361E070E0C80177D247 +:106A900085E09FC0E92EE294EFE0EE22EA94EA94CA +:106AA0009F70F92E88E090E08F1991092FEF30E068 +:106AB000690102C0D594C7948A95E2F7F5E0EF1614 +:106AC00029F084E0E8122AC0FF20E1F044E050E021 +:106AD000B8016E5F7F4FCE0101960E942556892B2B +:106AE00061F49A818B81892798E889279C8189277D +:106AF000F801968189278C2189F1F4E0EF120EC00C +:106B0000F11009C144E050E0B8016E5F7F4FCE0143 +:106B100001960E942556892B09F1FDC083E08E1550 +:106B200008F4F9C0F12CA701B8016E5F7F4FCE01C8 +:106B300001960E942556892B09F0EDC0D801AE0DB3 +:106B4000BF1DE1E0F0E0EC0FFD1FEE0DFF1D129602 +:106B50009C9180818927C82209F0DDC098E8F8015E +:106B600090833A8131832B812283A1C044E050E09D +:106B700060E070E007C0853909F0E5CB44E050E003 +:106B800063E070E0CE0101960E942A0FF801818136 +:106B9000803209F485C0803701F5F801928189813E +:106BA0009813B9C093818A819813B5C094818B8161 +:106BB0009813B1C095818C819813ADC080918F2CB2 +:106BC000808361E070E0C801DAD18FEF8093922C6E +:106BD00086E08093B12C88E19FC0E82EE2947FE0AC +:106BE000E722EA94EA948F70F82E88E090E08F19FB +:106BF00091092FEF30E0690102C0D594C7948A95BE +:106C0000E2F7F5E0EF1629F084E0E8122AC0FF2051 +:106C1000E1F044E050E0B8016E5F7F4FCE01019695 +:106C20000E942556892B61F499818A8189279B814D +:106C300089279C818927F801968189278C2181F1F8 +:106C4000F4E0EF120EC0F11066C044E050E0B8016D +:106C50006E5F7F4FCE0101960E942556892B01F170 +:106C60005AC083E08E1508F456C0F12CA701B80174 +:106C70006E5F7F4FCE0101960E942556892B09F049 +:106C80004AC0D801AE0DBF1DE1E0F0E0EC0FFD1FE2 +:106C9000EE0DFF1D12969C9180818927C822D9F59F +:106CA0003981F80130832A8121839B8192838C81F1 +:106CB0008383232792278927848388E22DC0823CFF +:106CC00009F0CBC0F8018181803E09F0CFC08281FC +:106CD000843B09F0CBC046E050E06AEA74E0CE01A4 +:106CE00001960E942A0F89818B3409F03ACB8A8160 +:106CF000893709F036CB8B818B3109F032CB8C810F +:106D00008A3E09F02ECB8D818B3709F02ACB8E81FC +:106D10008C3C09F026CB80E090E0DCC0F80180815B +:106D2000803621F06AE3C62ED12C03C050E3C52E75 +:106D3000D12CF801818187FF0CC0807FF0E18F9F0B +:106D40007001112480ECC80ED11C46EFA42EB12C8A +:106D500008C08C7F90E1899F7001112436E3A32E37 +:106D6000B12CE091AE2EF091AF2E42E0B80180E957 +:106D70001995F801808181708093A72CC70124E0C8 +:106D8000969587952A95E1F78093A82CB5016E0D0D +:106D90007F1D44E050E083E99CE20E942A0F80912D +:106DA000A82C8093922C68E0CE0101960E947B0E65 +:106DB0008091AC2E44E050E0873019F463E070E03D +:106DC00002C060E070E0CE010F960E942A0FB6016B +:106DD0006E0D7F1D46E050E0CE0109960E942A0FFD +:106DE00089818093A92C8A818093AA2C8B8180939E +:106DF000AB2C8C818093AC2C60E489EA9CE20E94ED +:106E0000C2448091A92C8093AD2C8091AA2C8093B0 +:106E1000AE2C8091AB2C8093AF2C8091AC2C8093C6 +:106E2000B02C60E28DEA9CE20E94C24487E080932D +:106E3000B12C8981F80180838A8181838B8182834F +:106E40008C818383AE014F5F5F4FBE01615F7F4FD7 +:106E5000CE010996F0D080E25FCF982F9F779033D4 +:106E600029F0803A19F0805C833078F481E08093D7 +:106E7000B12C84E0F8018083E091AE2EF091AF2E2A +:106E800040E060E070E082EC8BCBE091AE2EF091C0 +:106E9000AF2E40E0DECC8A3069F4E091AE2EF09166 +:106EA000AF2E46E0B80184E81995C80CD91CEA1C3D +:106EB000FB1C7CCD8C3009F079CDE091AE2EF091A9 +:106EC000AF2E46E0B80187E8199570CD0E949A3F31 +:106ED00096E0FECC6296CDBFDEBFDF91CF911F91D1 +:106EE0000F91FF90EF90DF90CF90BF90AF909F9069 +:106EF0008F900895CF93DF932091AC2E273071F4BB +:106F0000EC0143E050E060E070E00E942A0F44E0B2 +:106F100050E063E070E0CE01039604C044E050E02E +:106F200060E070E0DF91CF910C942A0FCF93DF9354 +:106F30001F92CDB7DEB72091AC2E273029F447E061 +:106F400050E060E070E015C0FC0130812181232712 +:106F50003281232733812327298344E050E060E0F6 +:106F600070E00E94780F41E050E064E070E0CE01F4 +:106F700001960E94780F0F90DF91CF91089520E441 +:106F80002093D00026EC2093D5002093D40021E05C +:106F90002093D000DC01680F791FA617B70741F0D6 +:106FA000ED91F0E0EE51FA4FE491E093D300F5CF8C +:106FB000E091D500F0E0EE51FA4FE491EC93E091CE +:106FC000D400F0E0EE51FA4FE4911196EC93109258 +:106FD000D000089520E42093D00026EC2093D50023 +:106FE0002093D40021E02093D000DC01680F791FAA +:106FF000A617B70741F0ED91F0E0EE51FA4FE4919A +:10700000E093D300F5CFE091D500F0E0EE51FA4FD8 +:10701000E4918C918E130AC0E091D400F0E0EE511F +:10702000FA4FE49181E011969C919E1380E01092BA +:10703000D000817008958F929F92BF92CF92DF927D +:10704000EF92FF920F931F93CF93DF93DC018C910C +:10705000D12C30E08695D794869537958695D79430 :10706000869537958695D794869537958695D79446 -:10707000869537958695D7948695379512968C91F7 -:107080001297F0E010E08695F7958695179586950E -:10709000F795869517958695F79586951795869514 -:1070A000F7958695179513968C9113978695F79576 +:107070008695379511968C9111978695D79486951C +:1070800037958695D794869537958695D794869526 +:1070900037958695D7948695379512968C91129749 +:1070A000F0E010E08695F795869517958695F7950B :1070B000869517958695F795869517958695F795F4 -:1070C000869517958695F7958695179514968C91C4 -:1070D000149790E020E0869597958695279586955C -:1070E0009795869527958695979586952795869564 -:1070F0009795869527951596EC91E6959795E69543 -:107100002795E6959795E6952795E6959795E695C3 -:107110002795E6959795E69527954B01DA014C5F03 -:107120005F4F0C91E401B9904E01B026C32FD0E01F -:10713000BE0162557F4D7B01612F70E062557E4D2F -:10714000E701F880EB0188816F2D682BE22EF12C8E -:10715000E701C255DD4D8881682B70E062577F4D95 -:10716000EB0188818695E7956F2F60718D2D817E6B -:107170006827892F80726827832F84796827812F59 -:1071800083776827822F8A736827F62EF2946F25FB -:10719000762F769576956727FB2CF6266695F6264C -:1071A0007D2D6F2F892FF694879567957795B694E7 -:1071B000C72ED12CE601C255DF4D6E01E62EF12C13 -:1071C000E701C255DE4D7E01E601F881E7019881B5 -:1071D000EF2EE92AC82ED12CE601C255DD4D98814B -:1071E000E92AF12CE701C257DF4D98819695E79582 -:1071F000F12FF071932F917EEF2EE926922F90724E -:10720000E926972F9479E926962F9377E926982FE8 -:107210009A73E926FE2CF294EF24CE2CC694C694E1 -:10722000EC24FB2CFE24E694FE24F6942795179577 -:107230003795B694C32ED12CE601C255DF4D6E01B1 -:10724000E12EF12CE701C255DE4D7E01E601F88109 -:10725000E7019881EF2EE92AC22ED12CE601C25512 -:10726000DD4D9881E92AF12CE701C257DF4D988165 -:107270009695E795F62FF071972F917EEF2EE926E0 -:10728000982F9072E926932F9479E926912F93777E -:10729000E926922F9A73E926FE2CF294EF24CE2C45 -:1072A000C694C694EC24FB2CFE24E694FE24F82F0E -:1072B000F694F79567957795B694872F90E0EC0153 -:1072C000C255DF4D862F90E082559E4DF880EC012F -:1072D00088818F29EF2EF12CE701C255DD4D988171 -:1072E000892B90E082579F4DEC0188818695E79528 -:1072F000912F9071832F817EE92EE826822F807254 -:10730000E826872F8479E826862F8377E8268F2F33 -:107310008A73E826FE2CF294EF24CE2CC694C694F1 -:10732000EC24FB2CFE24E694FE24F6942795179576 -:107330003795B694832F90E0EC01C255DF4D812F35 -:1073400090E082559E4DF880EC0188818F29E22ED5 -:10735000F12CE701C255DD4D9881892B90E08257D1 -:107360009F4DEC0188818695E795962F9071872F28 -:10737000817EF92EF8268F2F8072F826832F84794C -:10738000F826812F8377F826822F8A73F8269F2D7F -:107390009295F926EF2CE694E694FE249B2D9F25EA -:1073A000F6949F258F2F9695879567957795B69438 -:1073B000C72ED12CE601C255DF4D6E01E62EF12C11 -:1073C000E701C255DE4D7E01E601F881E7019881B3 -:1073D000EF2EE92AC82ED12CE601C255DD4D988149 -:1073E000E92AF12CE701C257DF4D98819695E79580 -:1073F000F12FF071932F917EF927922F9072F92738 -:10740000972F9479F927962F9377F927982F9A73C6 -:10741000F9279F2F9295F927FF2EF694F694FF25D2 -:107420009B2D9F27F6959F2796952795179537951E -:10743000B694C32ED12CE601C255DF4D6E01E12E6C -:10744000F12CE701C255DE4D7E01E601F881E7012E -:107450009881EF2EE92AC22ED12CE601C255DD4DCE -:107460009881E92AF12CE701C257DF4D9881969562 -:10747000E795F62FF071972F917E9F27F82FF072E6 -:107480009F27F32FF4799F27F12FF3779F27F22F70 -:10749000FA739F27F92FF2959F27F92FF695F69506 -:1074A0009F27FB2DF9279695F927982F8F2F8695E3 -:1074B000979567957795D72EF62F672F70E0EB019C -:1074C000C255DF4D6F2F70E062557E4DF880EB01A5 -:1074D00088816F2D682BE92EF12CE701C255DD4D17 -:1074E0008881682B70E062577F4DEB01888186951B -:1074F000E795632F617E812F80718627622F6072EE -:1075000086276D2D647986276F2F63778627692FED -:107510006A738627682F62958627682F6695669519 -:107520008627B694B8268695B826812FB6942795D7 -:1075300087953795182F0E270D934A175B0709F08B -:10754000F0CDD092B22CF093B32C9093B42C309316 -:10755000B52C8093B62C2093B72CDF91CF911F913F -:107560000F91FF90EF90DF90CF90BF909F908F9002 -:1075700008958F929F92AF92BF92CF92DF92EF9237 -:10758000FF920F931F93CF93DF93FC01C62FF42E2E -:10759000B52F8081A0E050E0869557958695A795F8 -:1075A000869557958695A795869557958695A7951F -:1075B000869557958695A795818186955795869549 -:1075C000A795869557958695A795869557958695FF -:1075D000A795869557958695A795828130E040E0DE -:1075E00086954795869537958695479586953795DF -:1075F00086954795869537958695479586953795CF -:107600008381869547958695379586954795869586 -:1076100037958695479586953795869547958695AE -:107620003795648190E080E066958795669597959B -:1076300066958795669597956695879566959795CE -:107640006695879566959795B5806B2D6695879518 -:1076500066959795669587956695979566958795AE -:10766000669597956695879566959795B62EEA2FB8 -:10767000F0E0E255FF4D032F10E002551E4DD08182 -:10768000F8016081D62B092F10E002551D4DF8013D -:107690006081ED2FE62BF0E0E257FF4DC0800C2F0C -:1076A000172FCF2DDB2F7E01F4E0EF0EF11C788138 -:1076B000F801B1918F01B7276B2DC6946795F42F10 -:1076C000F071E52FE17EFE27E82FE072FE27EA2F1A -:1076D000E479FE27E32FE377FE27E92FEA73FE27FD -:1076E000EF2FE295FE27DF2ED694D694FD25EB2FC3 -:1076F000EF27F695EF2720FDEC25E6958795479532 -:107700005795B695C52ED12CF601E255FF4D6F0168 -:10771000A42EB12CF501E255FE4D5F01F601D0809B -:10772000F501C080DC28E82FF0E0E255FD4DF08146 -:10773000ED2DEF2BF0E0E257FF4DC080C69467952A -:10774000F32FF071EA2FE17EFE27E92FE072FE278A -:10775000E52FE479FE27E42FE377FE27E82FEA738D -:10776000FE27EF2FE295FE27DF2ED694D694FD2537 -:10777000EB2FEF27F695EF27DA2E20FDEC25E69587 -:1077800097953795D794CB2EC694AD2DB0E0A255E2 -:10779000BF4DE32FF0E0E255FE4DAC91E081EA2BC6 -:1077A000A92FB0E0A255BD4DFC91EF2BF0E0E257C0 -:1077B000FF4DB081B6956795F42FF071E52FE17E0E -:1077C000FE27E82FE072FE27ED2DE479FE27E32F58 -:1077D000E377FE27E92FEA73FE27EF2FE295FE27D6 -:1077E000AF2FA695A695FA27EC2DEF27F695EF2754 -:1077F00020FDEB27E695879547955795C694A52FCD -:10780000B0E0A255BF4DE42FF0E0E255FE4DAC9143 -:10781000E081EA2BA82FB0E0A255BD4DFC91EF2BE3 -:10782000F0E0E257FF4DB081B6956795F32FF07108 -:10783000ED2DE17EFE27E92FE072FE27E52FE479AA -:10784000FE27E42FE377FE27E82FEA73FE27EF2FCA -:10785000E295FE27AF2FA695A695FA27EC2DEF27E8 -:10786000F695EF2720FDEB27E69597953795D7946A -:10787000C694AD2DB0E0A255BF4DE32FF0E0E25528 -:10788000FE4DAC91E081EA2BA92FB0E0A255BD4D91 -:10789000FC91EF2BF0E0E257FF4DB081B695679574 -:1078A000F42FF071E52FE17EFE27E82FE072FE272E -:1078B000ED2DE479FE27E32FE377FE27E92FEA7326 -:1078C000FE27EF2FE295FE27AF2FA695A695FA2764 -:1078D000EC2DEF27F695EF2720FDEB27E695879512 -:1078E00047955795C694A52FB0E0A255BF4DE42FFC -:1078F000F0E0E255FE4DAC91E081EA2BA82FB0E01C -:10790000A255BD4DFC91EF2BF0E0E257FF4DB08149 -:10791000B6956795F32FF071ED2DE17EFE27E92FE7 -:10792000E072FE27E52FE479FE27E42FE377FE27B8 -:10793000E82FEA73FE27EF2FE295FE27AF2FA695DB -:10794000A695FA27EC2DEF27F695EF2720FDEB27DC -:10795000E69597953795D794C694ED2DF0E0E255CE -:10796000FF4DA32FB0E0A255BE4DF081EC91EF2B5F -:10797000A92FB0E0A255BD4DFC91EF2BF0E0E257EE -:10798000FF4DB081B6956795F42FF071E52FE17E3C -:10799000FE27E82FE072FE27ED2DE479FE27E32F86 -:1079A000E377FE27E92FEA73FE27EF2FE295FE2704 -:1079B000AF2FA695A695FA27EC2DEF27F695EF2782 -:1079C00020FDEB27E695879547955795A52FB0E0C5 -:1079D000A255BF4DE42FF0E0E255FE4DAC91E081A1 -:1079E000EA2BA82FB0E0A255BD4DFC91EF2BF0E0A3 -:1079F000E257FF4DF081F6956795B62EED2DE17EAD -:107A0000632F60716E27E92FE0726E27E52FE4790E -:107A10006E27E42FE3776E27E82FEA736E27E62FB1 -:107A2000E2956E27E62FE695E6956E27C694C62664 -:107A30006695C62620FDCF26C69497953795D79490 -:107A4000AD2DCD2CD12CF601E255FF4D6F01832ECB -:107A5000912CF401E255FE4D4F01F601B081F40185 -:107A60006081B62BC92ED12CF601E255FD4D608107 -:107A7000EB2FE62BF0E0E257FF4DC080E72FF0E060 -:107A8000EE51FB4FE491EC25EC837B257993EC16CA -:107A9000FD0609F00CCE5093B22C4093B32C80938A -:107AA000B42CA093B52C3093B62C9093B72CDF91C7 -:107AB000CF911F910F91FF90EF90DF90CF90BF90EB -:107AC000AF909F908F900895BF92CF92DF92EF92E8 -:107AD000FF920F931F93CF93DF93A091B22C5091FD -:107AE000B32C1091B42C4091B52C3091B62C209130 -:107AF000B72CFC01BC016C5F7F4F0191952F9071F9 -:107B00008A2F817E9827812F80729827842F8479ED -:107B10009827832F83779827822F8A739827892F16 -:107B200082959827892F869586959827C42ED12CE3 -:107B3000E601C255DF4D6E01E32EF12CE701C2557F -:107B4000DE4D7E01E601B881E7018881B82BE22E87 -:107B5000F12CE701C255DD4D8881CB2FC82BD0E039 -:107B6000C257DF4DB881B027B92796959B27069558 -:107B7000812F969587955795A795B32FB071942F20 -:107B8000917EB927922F9072B9279A2F9479B927AD -:107B9000952F9377B927982F9A73B9279B2F929592 -:107BA000B9279B2F96959695B927CA2ED12CE60119 -:107BB000C255DF4D6E01E52EF12CE701C255DE4DB9 -:107BC0007E01E6011881E7019881192BE82EF12C3E -:107BD000E701C255DD4D9881C12FC92BD0E0C257B6 -:107BE000DF4D988190279B27B695B927B02EB69484 -:107BF000922FB695979537954795B52FB0712A2F47 -:107C0000217EB227282F2072B227242F2479B22771 -:107C1000232F2377B227292F2A73B2272B2F2295C0 -:107C2000B2272B2F26952695B227C42FD0E08E01A0 -:107C300002551F4D6801C32FD0E08E0102551E4D25 -:107C40007801E6010881E7012881022BE92EF12C59 -:107C5000E701C255DD4D2881022B10E002571F4D70 -:107C6000E8012881C22FCB25CB27B695BC272B2D29 -:107C70002695B69587955795A795C32FC071B42FB4 -:107C8000B17EBC27C92FC072BC27CA2FC479BC27BC -:107C9000C52FC377BC27C82FCA73BC27CB2FC2956B -:107CA000BC27CB2FC695C695BC27CA2FD0E0C2559E -:107CB000DF4D052F10E002551E4DF880E8011881B8 -:107CC000F12A082F10E002551D4DE8011881CF2D33 -:107CD000C12BD0E0C257DF4DC881C227CB27B69554 -:107CE000BC272695B695979537954795C52FC071B2 -:107CF000BA2FB17EBC27C82FC072BC27C42FC4794D -:107D0000BC27C32FC377BC27C92FCA73BC27CB2F6F -:107D1000C295BC27CB2FC695C695BC27C42FD0E0F3 -:107D2000C255DF4D032F10E002551E4DF880E801CB -:107D30001881F12A092F10E002551D4DE801188124 -:107D4000CF2DC12BD0E0C257DF4DC881C227CB2732 -:107D5000B695BC272695B69587955795A795D32FA9 -:107D6000D071B42FB17EDB27B92FB072DB27BA2FC9 -:107D7000B479DB27B52FB377DB27B82FBA73DB27AE -:107D8000BD2FB295DB271D2F169516951D27CA2EE0 -:107D9000D12CE601C255DF4D6E01E52EF12CE70135 -:107DA000C255DE4D7E01E6010881E701B8810B2B4B -:107DB000E82EF12CE701C255DD4DB881C02FCB2B49 -:107DC000D0E0C257DF4DB881B227B127D12FD69569 -:107DD000DB27B22EB694D695979537954795D52F34 -:107DE000D0712A2F217ED227282F2072D227242F2C -:107DF0002479D227232F2377D227292F2A73D2271A -:107E00002D2F2295D2272D2F26952695BD2FB227CF -:107E1000C42FD0E08E0102551F4D6801C32FD0E062 -:107E20008E0102551E4D7801E6010881E701288187 -:107E3000022BE92EF12CE701C255DD4D2881022BE2 -:107E400010E002571F4DE80118811B251B27DB2F6F -:107E5000D695D127D69587955795A795182F242F76 -:107E6000217E832F80712827892F807228278A2FCF -:107E700084792827852F83772827812F8A732827BD -:107E8000B22FB2952B27B22FB695B6952B27EA2E97 -:107E9000F12CE701C255DF4D7E01C52ED12CE60144 -:107EA000C255DE4D6E01E701E880E6018881E82ACF -:107EB000C12ED12CE601C255DD4D8881E82AF12C76 -:107EC000E701C257DF4DB6948881CB2DC827C22762 -:107ED0002695B22FBC272B2F26959795379547953A -:107EE000292F6E177F0709F008CEA093B22C50936C -:107EF000B32C1093B42C4093B52C3093B62C9093A4 -:107F0000B72CDF91CF911F910F91FF90EF90DF90F1 -:107F1000CF90BF900895CF93DF93E2EBFCE2A08176 -:107F200071816281338124819581472F40718A2F2D -:107F3000817E8427462F40728427432F44798427EB -:107F4000422F43778427492F4A738427482F42952D -:107F50008427482F469546958427482F46958427A1 -:107F6000869567957795A795C32FD0E0C255DF4DCD -:107F7000422F50E042555E4DB881EA018881B82B0E -:107F8000492F50E042555D4DEA018881CB2FC82B27 -:107F9000D0E0C25BDF4D88818695522F5071432F10 -:107FA000417E4527592F507245275A2F547945272E -:107FB000572F53774527562F5A734527542F5295DD -:107FC0004527542F569556954527542F56954527A6 -:107FD0004695979527953795CA2FD0E0C255DF4D26 -:107FE000472F50E042555E4DB881EA014881B42BDD -:107FF000462F50E042555D4DEA014881CB2FC42BFE -:10800000D0E0C25BDF4D4881842B8695572F50719D -:108010004A2F417E4527562F50724527532F5479BA -:108020004527522F53774527592F5A734527542FE9 -:1080300052954527542F569556954527542F5695BA -:108040004527469567957795A795C32FD0E0C255EC -:10805000DF4D422F50E042555E4DB881EA01488124 -:10806000B42B492F50E042555D4DEA014881CB2F9A -:10807000C42BD0E0C25BDF4D4881842B8695CA2F8C -:10808000D0E0C255DF4D472F50E042555E4DB881DC -:10809000EA014881B42B462F50E042555D4DEA017C -:1080A0004881CB2FC42BD0E0C25BDF4D4881842BAD -:1080B000532F517E422F40714527592F507245272B -:1080C0005A2F54794527572F53774527562F5A73E0 -:1080D0004527542F52954527542F56955695452799 -:1080E000542F569545274695979527953795A08304 -:1080F00071836283338324839583DF91CF910895C5 -:10810000BF92CF92DF92EF92FF920F931F93CF9384 -:10811000DF935091B22CC091B32CB090B42C40910D -:10812000B52C3091B62C2091B72CFC01615008F48D -:10813000EAC19C2F9071852F817E98278B2D8072AC -:108140009827842F84799827832F83779827822FE5 -:108150008A739827892F82959827792F7695769517 -:108160009727892F86959827AC2F8B2D96958795E5 -:10817000A7955795C42FD0E0C255DF4D032F10E0CF -:1081800002551E4D7881E8019881792B022F10E06D -:1081900002551D4DE8019881C72FC92BD0E0C25967 -:1081A000DF4D18811695732F7071942F917E97274C -:1081B000722F70729727752F747997277A2F73779C -:1081C0009727782F7A739727792F72959727792F8A -:1081D000769576959727792F76957927922F272F61 -:1081E0002695979537954795C52ED12CE601C25512 -:1081F000DF4D6E01EA2EF12CE701C255DE4D7E0106 -:10820000E6017881E7012881722BE82EF12CE70145 -:10821000C255DD4D2881C72FC22BD0E0C259DF4D9A -:108220002881122B16957A2F7071252F217E2727F2 -:10823000782F70722727742F74792727732F7377FD -:108240002727792F7A732727722F72952727722F66 -:10825000769576952727722F76952727BA2F26951C -:108260008795B7955795C42ED12CE601C255DF4DA1 -:108270006E01E32EF12CE701C255DE4D7E01E601D1 -:108280007881E7012881722BE92EF12CE701C25594 -:10829000DD4D2881C72FC22BD0E0C259DF4DA88108 -:1082A000A12BA695732F7071242F217E2727792F5C -:1082B00070722727752F747927277B2F73772727CD -:1082C000782F7A732727722F72952727722F76952A -:1082D00076952727722F76957227232F372F36957D -:1082E000979527954795C52FD0E0C255DF4D0B2FA9 -:1082F00010E002551E4D7881E8013881732B082F5C -:1083000010E002551D4DE8013881C72FC32BD0E086 -:10831000C259DF4DD881AD2BA6957B2F7071352FBB -:10832000317E3727782F70723727742F747937276B -:10833000722F73773727792F7A733727732F7295B8 -:108340003727732F769576953727732F76953727AE -:1083500036958795B7955795C42FD0E0C255DF4D18 -:10836000022F10E002551E4D7881E8013881732BF1 -:10837000092F10E002551D4DE8013881C72FC32B8E -:10838000D0E0C259DF4DD881AD2BA695722F707108 -:10839000342F317E7327392F30727327352F34797C -:1083A00073273B2F33777327382F3A737327372F71 -:1083B00032957327372F369536957327372F369595 -:1083C0007327342F7695979527953795C52FD0E04D -:1083D000C255DF4D0B2F10E002551E4D7881E8018C -:1083E0004881742B082F10E002551D4DE80148818B -:1083F000C72FC42BD0E0C259DF4DD881DA2BD695D8 -:108400007B2F7071452F417E7427482F407274274F -:10841000432F44797427422F43777427492F4A7397 -:108420007427472F42957427A72FA695A6957A27DC -:10843000472F469574274B2F7695879547955795E7 -:10844000C42FB82EA32FB0E08D0102551F4D680137 -:10845000A22FB0E08D0102551E4D7801D6010C917E -:10846000D7018C91082BE92EF12CD701A255BD4DD7 -:108470008C91082B10E002591F4DD8018C91D82BFC -:10848000D695732F717E822F80717827892F807205 -:108490007827852F84797827842F837778278B2DE9 -:1084A0008A737827872F82957827A72FA695A69578 -:1084B0007A27872F86957827432F322F272F2695C7 -:1084C000979537954795292F852F90E082559F4D99 -:1084D0000C2F10E002551E4DDC019C91D8018C91AF -:1084E000892B0B2D10E002551D4DD8019C91892B35 -:1084F00090E082599F4DDC019C918D2F892B9081BA -:108500008927819313CE5093B22CC093B32CB09291 -:10851000B42C4093B52C3093B62C2093B72CDF911C -:10852000CF911F910F91FF90EF90DF90CF90BF9070 -:108530000895EF92FF920F931F93CF93DF93709163 -:10854000B22C5091B32C2091B42C4091B52C309189 -:10855000B62CC091B72CE42FF0E0E255FF4DA32FCD -:10856000B0E0A255BE4DF081EC91EF2BAC2FB0E006 -:10857000A255BD4DFC91EF2BF0E0E257FF4D10816D -:10858000DC01D0E0615008F4DBC11695D795952F3A -:108590009071872F817E8927922F90728927942F3F -:1085A00094798927932F937789279C2F9A7389270A -:1085B000982F92958927E82FE695E6958E27982F94 -:1085C000969589278695279557957795D695932FD4 -:1085D0009071842F817E89279C2F90728927972FF5 -:1085E00094798927952F93778927922F9A738927D2 -:1085F000982F92958927E82FE695E6958E27982F54 -:10860000969589279C2F8695979537954795E72FBF -:10861000F0E0E255FF4D052F10E002551E4DC081E0 -:10862000F8018081C82B022F10E002551D4DF80182 -:108630008081EC2FE82BF0E0E259FF4D8081D82BB0 -:10864000D695E52FE071872F817E8E27E22FE0728D -:108650008E27E42FE4798E27E32FE3778E27E92F07 -:10866000EA738E27E82FE2958E27E82FE695E695A8 -:108670008E27E82FE6958E2786952795579577952F -:10868000E42FF0E0E255FF4D032F10E002551E4DA0 -:10869000C081F8018081C82B092F10E002551D4DC3 -:1086A000F8018081EC2FE82BF0E0E259FF4D80814A -:1086B000D82BD695E32FE071842F817E8E27E92F6A -:1086C000E0728E27E72FE4798E27E52FE3778E2758 -:1086D000E22FEA738E27E82FE2958E27E82FE695A2 -:1086E000E6958E27E82FE6958E2786959795379500 -:1086F0004795E72FF0E0E255FF4D052F10E00255BA -:108700001E4DC081F8018081C82B022F10E0025558 -:108710001D4DF8018081EC2FE82BF0E0E259FF4D70 -:108720008081D82BD695E52FE071872F817E8E270B -:10873000E22FE0728E27E42FE4798E27E32FE37790 -:108740008E27E92FEA738E27E82FE2958E27E82FF0 -:10875000E695E6958E27E82FE6958E278695279550 -:1087600057957795E42FF0E0E255FF4D032F10E089 -:1087700002551E4DC081F8018081C82B092F10E0E1 -:1087800002551D4DF8018081EC2FE82BF0E0E259F5 -:10879000FF4D8081D82BD695E32FE071842F817E09 -:1087A0008E27E92FE0728E27E72FE4798E27E52FB9 -:1087B000E3778E27E22FEA738E27E82FE2958E2744 -:1087C000E82FE695E6958E27E82FE6958E27869585 -:1087D000979537954795E72FF0E0E255FF4D052F28 -:1087E00010E002551E4DC081F8018081C82B022F78 -:1087F00010E002551D4DF8018081EC2FE82BF0E0D0 -:10880000E259FF4D8081D82BD695E52FE071872F57 -:10881000817E8E27E22FE0728E27E42FE4798E2767 -:10882000E32FE3778E27E92FEA738E27E82FE2956F -:108830008E27E82FE695E6958E27E82FE6958E277A -:108840008695279557957795E42FF0E0E255FF4DF3 -:10885000032F10E002551E4DC081F8018081C82B06 -:10886000092F10E002551D4DF8018081EC2FE82BF7 -:10887000F0E0E259FF4D8081D82BD695E72FF0E04C -:10888000E255FF4D052F10E002551E4DC081F80145 -:108890008081C82B022F10E002551D4DF801808108 -:1088A000EC2FE82BF0E0E259FF4D8081D82BE42F2C -:1088B000E17E832F8071E827892F8072E827872F38 -:1088C0008479E827852F8377E827822F8A73E82722 -:1088D0008E2F8295E8278E2F86958695E8278E2FF6 -:1088E0008695E827E695979537954795C92FE42F04 -:1088F000F0E0E255FF4D832F90E082559E4D1081B0 -:10890000FC018081182B8C2F90E082559D4DFC013D -:108910008081E12FE82BF0E0E257FF4D10818C9130 -:10892000E82FF0E0EE51FB4FE4917D01F0E8EF0E0F -:10893000F11C9E2F9127F70190838D278D9322CED6 -:108940007093B22C5093B32C2093B42C4093B52C3D -:108950003093B62CC093B72CDF91CF911F910F911C -:10896000FF90EF9008950F931F93FC01862F408195 -:108970005181628173818B0122273327803208F471 -:1089800071C0D80123E0B695A7952A95E1F70A278B -:108990001B2798013695279536952795BBE0769548 -:1089A000679557954795BA95D1F70227132720E089 -:1089B00030E095E1000F111F221F331F9A95D1F768 -:1089C000402B512B622B732B8B0122273327D8018D -:1089D00033E0B695A7953A95E1F70A271B2798014A -:1089E0003695279536952795BBE0769567955795EB -:1089F0004795BA95D1F70227132720E030E095E19B -:108A0000000F111F221F331F9A95D1F7402B512BB6 -:108A1000622B732B8B0122273327D80133E0B695C5 -:108A2000A7953A95E1F70A271B27980136952795D0 -:108A300036952795BAE07695679557954795BA95F7 -:108A4000D1F70227132720E030E096E1000F111F35 -:108A5000221F331F9A95D1F7402B512B622B732B7A -:108A6000805289CF40835183028373831F910F917A -:108A70000895AF92BF92CF92DF92EF92FF920F9341 -:108A80001F93CF93DF936730710509F451C09B01A9 -:108A900027703327232B09F04EC05B016C01EB01DB -:108AA00083E0D695C7958A95E1F77B0196E0F69429 -:108AB000E7949A95E1F7EC0EFD1EEC0CFD1C8E017F -:108AC000015011090C0D1D1DA701401B510B60E049 -:108AD00070E0C80101960E943D560C151D0520F15D -:108AE000D801EC91F0E0EE51FB4F2491D701CD017C -:108AF0000A171B0768F4FC018081982F990F8E914B -:108B0000881F8827881F892B11968C931197EFCF88 -:108B100011968C9111978E7FE22FE170E82B1196C0 -:108B2000EC9301501109D9CFC5018C0F9D1F04C0D2 -:108B300087E090E001C0CB01DF91CF911F910F91B1 -:108B4000FF90EF90DF90CF90BF90AF900895CF93BC -:108B5000DF93EC0182EC888361E070E0CE010E943B -:108B6000B0378AE08093922D1092932D68E170E0E7 -:108B7000CE01DF91CF917DCFEF92FF920F931F93A4 -:108B8000CF93DF93EC01CB0167307105E1F169E030 -:108B900070E00E946D55DE0180E090E008E010E09A -:108BA0008617970751F1FC0133E0F695E7953A9562 -:108BB000E1F7E80FF91FAC0147705527EC0FFD1FD7 -:108BC000208130E0042E02C0359527950A94E2F703 -:108BD0002C934115510571F0E181F0E07801E41A20 -:108BE000F50AA7017F0102C0EE0CFF1C4A95E2F7CF -:108BF0002E292C9301961196D3CF23E0880F991F2D -:108C00002A95E1F702C087E090E0DF91CF911F91B4 -:108C10000F91FF90EF900895EF92FF920F931F93A3 -:108C2000CF93DF939C01CB016730710509F440C0FD -:108C300069E070E00E946D5580E090E048E050E00F -:108C400086179707A9F1DC01E3E0B695A795EA95A9 -:108C5000E1F7A80FB91FEC01C770DD27A20FB31F02 -:108C6000EC91F0E00C2E02C0F595E7950A94E2F73E -:108C7000209759F011960C9111977A01EC1AFD0A80 -:108C800001C0000FEA94EAF7E02BF0E0EE51FB4F51 -:108C9000E4911196AC91B0E002C0B595A795CA9544 -:108CA000E2F7ED01CE27FE01E0FD04C00196C8CF3A -:108CB00081E001C080E0DF91CF911F910F91FF9083 -:108CC000EF9008951092922D08951092922D109287 -:108CD000B82C1092932D0895F8DF0E940E2C10925C -:108CE000922D089508950895DC0123E633E661503E -:108CF000E8F04D91942F922780E1989FA0011124D4 -:108D00004927E42FF0E0232F332742954F70C90104 -:108D10008427AC013E2F22272427352743E0EE0F7E -:108D2000FF1F4A95E1F72E273F27E1CFC90108959C -:108D3000EF92FF921F93CF93DF93EC017B01809121 -:108D4000932D882339F08091922D823008F0DBC07A -:108D50001092932DE114F10461F0B701CE015CDFB4 -:108D6000882309F4D3C0B701CE0106DF7C0181E07E -:108D700001C082E01091922D163090F4133070F5FE -:108D80001230A8F484E090E080931E2090931F207E -:108D900082E5888382E08093922D87E090E0C7C0CF -:108DA000193008F467C01A3009F496C0ACC090E1DD -:108DB000E916F10411F480FD03C01092922D92C0C7 -:108DC000888199818093842D9093852D83E9888370 -:108DD00080E2898383E08093922D6AC080FFEDCF8B -:108DE00088E2E816F10448F32881898182279A8174 -:108DF00089279B8189279C818913DFCFA12FB0E030 -:108E00001397CD01880F991FA80FB91FA957B24D0D -:108E1000283821F483E0FE01319602C084E0FE018F -:108E200001900D928A95E1F745E050E0BE01CE0138 -:108E300002960E942C56133021F0143021F485E95B -:108E400003C083E901C087E9888380E7898367E0FD -:108E500070E0CE010E94B0378091922D8D5F80939B -:108E6000922D68E470E0CE01DF91CF911F91FF90C9 -:108E7000EF90FFCD80FFA1CF98E1E916F10409F052 -:108E80009CCF63E0CE0130DF009709F096CF2881B8 -:108E900022FF11C0183079F0163011F485E901C0B5 -:108EA00087E9888380E289832EEF210F2093922D1A -:108EB00060E170E0D8CF21E02093932D212F30E0A6 -:108EC00026503109322F330F230F2C5F2093912D21 -:108ED00028812093862D2BC0982F927031F081E04D -:108EE0008093922D0E94072C0EC080FF05C063E086 -:108EF000CE01FADE892B99F3CE01DF91CF911F913C -:108F0000FF90EF9024CE80E090E011C0A701495F70 -:108F10005F4F83E0569547958A95E1F7E091AE2E35 -:108F2000F091AF2EBE0181EC199580E023CFDF9147 -:108F3000CF911F91FF90EF9008959F92AF92BF92B3 -:108F4000CF92DF92EF92FF920F931F93CF93DF9315 -:108F5000CDB7DEB7C756D109CDBFDEBF8C017B01CF -:108F6000FB0160817181E4DED090932DDD2009F456 -:108F700045C18091922D9AEF980F933008F057C019 -:108F8000F80180818072C82E1092742D5DE4A52EA8 -:108F900051E1B52E912C47E650E0B501CE01019686 -:108FA0000E94F5558B81882349F029813A8180916F -:108FB000842D9091852D28173907B9F48D81882348 -:108FC00029F09C818091862D98130FC08F8988236A -:108FD00011F0CC2051F0E091742D81E08E0F809340 -:108FE000742DF0E0EB58F24D90829394F7E6AF0EBB -:108FF000B11C8FE09812CFCFC1100DC08091922D7F -:109000009AEF980F943008F0AEC02091742DE5E7E8 -:10901000FDE280E08FC080EEF801808380E88183EC -:1090200062E070E0C8010E94B03789E095C08930E5 -:1090300029F7F70160817181C801EEDDF7016081D8 -:109040007181811115C0CB01089667E070E00E9424 -:109050006D55462FE091AE2EF091AF2EB80181EC08 -:109060001995C80174DDF70180839183D12CC9C0A3 -:10907000C80182DDF70180839183F8016081262F8A -:1090800030E043E0969587954A95E1F702972817D7 -:10909000390739F76E5FC80127DE892B11F7C12C1C -:1090A00097E6992E5801FFEFAF1ABF0A8091742DF1 -:1090B000C81608F0A3CFEC2DF0E0EB58F24D60811C -:1090C000969EB0011124635B7E4E47E650E0CE01D0 -:1090D00001960E94F5558F89882349F14E8950E009 -:1090E000F801808190E001974817590741F02091DD -:1090F000742D422F50E0415051093C2D08C0B5015C -:10910000CE0106960E941656892B89F710C0832F30 -:1091100090E0841795073CF4FC01EB58F24D8181F7 -:1091200080833F5FF4CF21502093742DCA94C39461 -:10913000BDCF8F5F821709F464C091919450923033 -:10914000C0F782E0F801808380E6818362E070E00E -:10915000C8010E94B0378BE08093922D60E270E0EE -:10916000C80187DC80CF8B3009F04BC0F7016081EC -:1091700071816115710509F43EC0C8014DDDD82E1D -:10918000F70160817181811113C0CB01089667E0FE -:1091900070E00E946D55462FE091AE2EF091AF2EFB -:1091A000B80181EC19951092742DC801D0DC26C04D -:1091B000C801E2DCF70180839183BC0183E07695EE -:1091C00067958A95E1F7C8018FDD892B19F0109218 -:1091D000742D47CFF8018581882331F0813059F40F -:1091E0008093742D85E004C081E08093742D84E029 -:1091F0008093752D06C01092742D03C0F7018083F3 -:1092000091838D2DC959DF4FCDBFDEBFDF91CF9147 -:109210001F910F91FF90EF90DF90CF90BF90AF9094 -:109220009F9008955F926F927F928F929F92AF92DC -:10923000BF92CF92DF92EF92FF920F931F93CF9343 -:10924000DF93CDB7DEB7C254D240CDBFDEBF7C01C5 -:10925000CF5BDD4F68837983C154D2408091B82CB5 -:10926000843009F48BC140F4823009F4D6C008F090 -:1092700060C1813051F08CC4863009F41EC308F4FB -:1092800046C2873009F4C8C383C40091942E10915C -:10929000952E01151105C1F0A801495F5F4F63E0EC -:1092A000569547956A95E1F764E97DE2C7010E940A -:1092B00023566091942E7091952EC701DADB10929F -:1092C000942E1092952E21C2CF5BDD4F688179815B -:1092D000C154D2406115710509F4C7C0C7019CDCB7 -:1092E000D82ECF5BDD4F68817981C154D240C70150 -:1092F00043DCCF5BDD4F88839983C154D2409C010E -:10930000295F3F4FC901880F991F53E096958795B4 -:109310005A95E1F706968138910578F064EB73E28F -:10932000CE0101960E944F561092B82CBE016F5F7D -:109330007F4F85E60E94DE226BC4B3E03695279509 -:10934000BA95E1F7A70160E870E0CE0101960E94AE -:10935000950E7C01CF5BDD4F8881C154D240CE5B3E -:10936000DD4F9881C254D240CF5FDD4F9883C1500A -:10937000D240CE5FDD4F8883C250D24083EC93E26F -:109380009F938F9380E8A82EB12CC5018E199F0959 -:109390009F938F9381E090E08C0F9D1F8E0D9F1DFA -:1093A0009F938F930E945656E80EF91EB5016E19D1 -:1093B0007F0922E030E0AE014F5F5D4F81E090E039 -:1093C0008C0F9D1F8E0D9F1D0E94950E8E0D9F1D53 -:1093D0000F900F900F900F900F900F909501281BFA -:1093E000390B41E050E04C0F5D1F840F951FD110E9 -:1093F00003C046EC53E202C045ED53E25F934F9346 -:109400003F932F939F938F930E9456560F900F90E8 -:109410000F900F900F900F9087CF0091942E109186 -:10942000952E01151105C1F0A801495F5F4FA3E01A -:1094300056954795AA95E1F764E97DE2C7010E9438 -:1094400023569091942E8091952E1092942E1092E6 -:10945000952E092F182FDCC3CF5BDD4F2881398172 -:10946000C154D2402115310551F488E0E9E4F4E219 -:10947000DE01119601900D928A95E1F755CF295F93 -:109480003F4FE3E036952795EA95E1F7A70160E8BD -:1094900070E0CE0101960E94950E7C01CF5BDD4FFE -:1094A0008881C154D240CE5BDD4F9881C254D240F6 -:1094B000CF5FDD4F9883C150D240CE5FDD4F8883B0 -:1094C000C250D24083EC93E29F938F93F0E8CF2E6B -:1094D000D12CC6018E199F099F938F9381E090E054 -:1094E0008C0F9D1F8E0D9F1D9F938F930E9456562C -:1094F0008E0D9F1DB601681B790B22E030E0AE0196 -:109500004F5F5D4FA1E0B0E0AC0FBD1F8A0F9B1F06 -:109510000E94950E1092B82CBE016F5F7F4F85E6BA -:109520000E94DE220F900F900F900F900F900F90DF -:109530006FC3CF5BDD4F68817981C154D240C701D1 -:10954000F7DB2091932D222309F425C32091912D3F -:1095500030E047E85DE264E170E0CE0101960E94F0 -:10956000950EBE016F5F7F4F85E60E94DE2210924E -:10957000932D1092B82C0E9474230AC38091732DEE -:10958000811108C080E890E00E94C12381E08093AF -:10959000732D7BC0813009F07AC08091922D82308A -:1095A00008F075C08091722D8F5F8093722D80318D -:1095B00009F06DC00E94CC238C019350409768F055 -:1095C0000115B8E01B0708F460C0E0E1F0E020E01E -:1095D00030E0A12CB12C60E040C0AAEFBCE240E03A -:1095E00050E020E030E080E090E0E0E0F0E060E09B -:1095F0007D91703149F44732510509F405C3611179 -:109600000EC0FA0161E00BC0662349F0BA016E1B7F -:109610007F0B6817790710F09F01CB0160E04F5F67 -:109620005F4F4832510521F78430910508F03BC265 -:109630002CC0D601ED906D01F12CEE16FF06B0F4B2 -:10964000611119C04F5F5F4F4837510591F700977F -:1096500009F029C2319709F426C27AEFC72E7CE2BD -:10966000D72E40E050E080E090E0E3CF6111EACFF8 -:109670005A0161E0E7CFBA016A197B0968177907D7 -:1096800010F09501CB0160E0DDCF1092722DCF5B21 -:10969000DD4F68817981C154D240C70149DB2091F7 -:1096A000932D222309F477C2E091B12EF091B22ECE -:1096B0000284F385E02DE058F10954E0F695E79532 -:1096C0005A95E1F7E650F34D80818F5F808380915A -:1096D000722D803121F40E94CC231092722D1092B1 -:1096E000922D0E94072C80E5F7018083118262E0B1 -:1096F00070E0C7010E94B03781E08093922D1092F4 -:10970000932D60E270E0C701B4D98C0181C2CF5BB8 -:10971000DD4F68817981C154D240C70109DB2091B6 -:10972000932D222309F437C2D090F92CDD2009F4BF -:1097300045C0CF5BDD4F08811981C154D24001156E -:10974000110549F41092F92C1092932D1092922D3C -:109750000E94072C5DC2023A110538F0B801C7011A -:109760005BDA01E08027082F02C001E010E0CF5B48 -:10977000DD4F68817981C154D240C701FDD9CF5BEB -:10978000DD4F88839983C154D24000FD05C062E15A -:10979000C701AADA892B29F0ACEFAD0DA093F92C03 -:1097A0002AC0F4E0DF9ED0011124A755B34D80E11B -:1097B000F70101900D928A95E1F71DC042E050E05B -:1097C00062E872E1CE0101960E94F555E5E8F2E10A -:1097D000E4912091842D3091852D89819A812817DB -:1097E000390721F48091862DE81729F01092922DE7 -:1097F0000E94072CCDC18091F92C803109F04DC019 -:109800001092932D1092F92C1092B82C20E130E098 -:1098100049EB5CE267E870E0CE0101960E94950E8C -:1098200063EC73E2CE0181960E944F5620E130E056 -:1098300049EC5CE265E670E0CE0183960E94950EED -:1098400063EC73E2CE018D5B9F4F0E944F5620E187 -:1098500030E049ED5CE263E470E0CE018B5B9F4F4A -:109860000E94950E63EC73E2CE018B599F4F0E94CC -:109870004F5620E130E049EE5CE261E270E0CE015B -:1098800089599F4F0E94950E0E947423BE016F5FFD -:109890007F4F85E60E94DE227BC190E3D7019C9337 -:1098A00011968C9362E070E0C7010E94B0378091FE -:1098B000F92C8C5F8093F92C24CFBE016F5B7D4F18 -:1098C000C7013BDB882309F4E7C08091742D811127 -:1098D00003C06BEE73E227C08130A1F0912C80E0D1 -:1098E00090E000E010E027E6822E7E01BFEFEB1A49 -:1098F000BDEFFB0A3EEFC32E33E2D32EA12C42E094 -:10990000B42E40C06091752DE7E66E9FB001112422 -:109910006C587E4E40E450E0CE0101960E94F55511 -:10992000BE016F5F7F4F85E60E94DE2255C0013089 -:10993000F2E01F0760F5E92DF0E0EB58F24D608191 -:10994000869EB00111246C587E4E40E450E0C70161 -:109950000E94F555FF92EF92DF92CF92C501801BD6 -:10996000910B9F938F9381E090E08C0F9D1F800F50 -:10997000911F9F938F930E945656080F191F93941F -:10998000CDBFDEBF2091742D921688F204C0081B53 -:10999000190BF12C06C0013032E01307C0F7FF2489 -:1099A000F394EDEFFFEFEC0FFD1FE00FF11F8EE2E0 -:1099B0008083EEEFFFEFEC0FFD1FE00FF11F108231 -:1099C000BE016F5F7F4F85E60E94DE22F11004C06A -:1099D00088EE90E10E942D1981EE90E10E942D19F0 -:1099E00062E070E084E89DE20E94FC228BED90E151 -:1099F0000E942D196091912D70E087E89DE20E94F0 -:109A0000FC2285ED90E10E942D1961E070E086E86E -:109A10009DE20E94FC2237C0BE016F5B7D4FC701F3 -:109A20008CDA8823C9F18091742D813039F58091C9 -:109A3000752D833009F4BDC028F4813059F082308F -:109A400099F0DFC08A3031F008F4DBC08D508230ED -:109A500058F0D7C08091912D843009F4ACC0873084 -:109A600009F0CFC015E0AAC08091912D843009F48F -:109A7000A4C0873009F0C5C017E0A0C065E074E25B -:109A800085E60E94DE221092B82C1092742D0E945E -:109A900074231092932D7CC0CF5BDD4F0881198118 -:109AA000C154D240B5C01092732D009709F475C00F -:109AB00096958795285F3F4F820F931F54E0880F3C -:109AC000991F5A95E1F70E94C123E091B12EF091C0 -:109AD000B22E62857385CF01865A9E428F5F9F4F5B -:109AE0000E94CD5C60E070E085E60E94DE220115F8 -:109AF000184008F455C0B8E7AB2EB12C0AEF1CE2B1 -:109B000060E8E62EF12C71EE672E73E2772EEAE024 -:109B10005E2EFE0131966F01F7EE8F2EF3E29F2E3F -:109B2000FF92EF927F926F921F925F92DF92CF929D -:109B30000E945656C6010E942819D8018C91CDBFAB -:109B4000DEBF882389F11F928F939F928F921F927D -:109B50005F92DF92CF920E945656C6010E9428194A -:109B6000CDBFDEBF8AE491E10E942D19D8011D927C -:109B70008D01B0E1EB0EF11CC8018A5F9C428A1591 -:109B80009B0570F21092932D1092B82C0E940E2C0F -:109B900000E010E03DC08C013BC00E94DC2395CF6B -:109BA000A8E2AA2EB12CAACF6DE283E090E21FD6E4 -:109BB000D9CF11E003C014E001C016E06BE274E2FB -:109BC00085E60E94DE22812F0E94F80DE0919E2EF4 -:109BD000F0919F2E1995E091A82EF091A92E87E87B -:109BE0009DE21995E091AE2EF091AF2E4091AC2EF2 -:109BF00067E87DE283E119950E948B100E940D17A2 -:109C000042CF66E374E23CCF662309F40DCDFECC6F -:109C1000C801CE5BDD4FCDBFDEBFDF91CF911F917D -:109C20000F91FF90EF90DF90CF90BF90AF909F90FB -:109C30008F907F906F905F9008950F931F93CF93B5 -:109C4000DF93CDB7DEB7EA97CDBFDEBF08E112E301 -:109C500095D2F80181938F01F2E300321F07C1F71B -:109C60000E94DD1906D3882309F4FAC080911832C6 -:109C700090911932953009F46FC030F4913069F148 -:109C800068F0933051F1ECC0983009F4C2C09930BB -:109C900009F4C8C0963009F0E3C072C0803891F072 -:109CA000823809F0DDC080911C328F7087D2E0913C -:109CB0002232F0912332118112FB112710F980E03A -:109CC0007DD206C01091143280911532811112603C -:109CD000EAD2812F63D280E0A1C0282F2D7F09F026 -:109CE000BFC0882319F0823061F0BAC080911A3267 -:109CF000813009F0B5C0933009F080E080931532CF -:109D000027C080911A32811123C0E0911C321E2F8E -:109D10001F7009F4A5C0812F51D280911932833070 -:109D200011F4EDD215C0E0912232F09123328181FD -:109D30008B7F818324E8129FF0011124EA59FD4CA6 -:109D40001082E0912232F091233280818E7F8083D5 -:109D500080E034D2A8D264C0811182C010911A323E -:109D60001F77A1D28FD35FD28823E9F31093C30466 -:109D7000111102C082E001C083E08093173270C0ED -:109D80008058823008F06CC080911A3290911B325A -:109D90008C3DE3E09E0761F583E08A838AE3898353 -:109DA0004FB7F894DE01139620E038E052E050936C -:109DB000CA01E32FF0E0E4911092CA0120FF03C032 -:109DC000E295EF703F5FEF708E2F90E0EA3010F079 -:109DD000C79601C0C0968D939D932F5F2C3139F7A4 -:109DE0004FBF61D26AE370E0CE010196A5D00FC0EB -:109DF000AE014F5F5F4F60911C320E94090D8C01D4 -:109E0000892B71F150D2B80189819A8111D1A7D1E2 -:109E100027C0803829F547D280911332BFD186D12F -:109E200031D31EC081111CC080911A3290911B3217 -:109E300099270297ACF437D280911A32809313326B -:109E400021D380911332811106C08091C304811106 -:109E500002C081E001C084E0809317320E94D919CA -:109E600008D2882311F01FD24AD2EA96CDBFDEBFB6 -:109E7000DF91CF911F910F9108950895CF93809115 -:109E80001732882351F0C091243280E097D1F1D16C -:109E90008111D3DE8C2FCF9191C1CF910895CF92B4 -:109EA000DF92EF92FF920F931F93CF93DF93EC011A -:109EB0008B017A01FDD2811136C0E114F10439F031 -:109EC000F70180819181081B190BC80FD91FC12C84 -:109ED000D12C0115110531F1809120329091213260 -:109EE000FC01EF5BFF4F208131978081281790F0B4 -:109EF0001DD1C4DFE114F10449F0F70180819181A3 -:109F0000C80ED91EC082D18285E00DC0D1D288236F -:109F100001F309C0899142D101501109FFEFCF1A15 -:109F2000DF0AD7CF80E0DF91CF911F910F91FF9093 -:109F3000EF90DF90CF900895DF92EF92FF920F9312 -:109F40001F93CF93DF93D82FC92F8B018091243299 -:109F5000806834D180911E3290911F328017910712 -:109F600028F00115110519F4E1D001C08C01ED2E86 -:109F7000FC2ED12C0115110509F440C08091173237 -:109F8000811102C082E04CC0853011F483E048C0EA -:109F900070D1882311F081E043C051D181113CC0C0 -:109FA00042D1882339F3209124328091203290913C -:109FB0002132FC0127FF05C0EF5BFF4FC081D0E0DD -:109FC00013C0E05CFF4FC08131968081D0E0C81B98 -:109FD000D1090AC0C830D10550F4F70181917F0141 -:109FE000DDD00150110921960115110599F7DD24E5 -:109FF000D394289709F0D12C99D0BCCFD110BECFE3 -:10A000000BC080911732882309F4BCCF853009F446 -:10A01000BDCF2FD18111BFCF12D1882391F380E022 -:10A02000DF91CF911F910F91FF90EF90DF900895F6 -:10A03000DF92EF92FF920F931F93CF93DF93D82F6E -:10A04000C92F8B01809124328068B8D080911E3254 -:10A0500090911F328017910728F00115110519F40E -:10A0600065D001C08C01ED2EFC2ED12C01151105FF -:10A0700009F442C080911732811102C082E04EC0C3 -:10A08000853011F483E04AC0F4D0882311F081E0D8 -:10A0900045C0D5D081113EC0C6D0882339F3209168 -:10A0A00024328091203290912132FC0127FF05C09B -:10A0B000EF5BFF4FC081D0E015C0E05CFF4FC08177 -:10A0C00031968081D0E0C81BD1090CC0C830D105C1 -:10A0D00060F4F701849162D0FFEFEF1AFF0A01509C -:10A0E000110921960115110589F7DD24D3942897CC -:10A0F00009F0D12C1BD0BACFD110BCCF0BC08091AE -:10A100001732882309F4BACF853009F4BBCFB1D018 -:10A110008111BDCF94D0882391F380E0DF91CF915E -:10A120001F910F91FF90EF90DF900895E091223200 -:10A13000F0912332A0912032B0912132AF5BBF4F1A -:10A140008C9190E08283938380818D798083E091EC -:10A150002032F0912132EF5BFF4F10820895E091A1 -:10A160002232F091233280818D798083E0912032F8 -:10A17000F0912132EF5BFF4F1082089580912032E1 -:10A1800090912132FC01EF5BFF4F208131E0320FD3 -:10A190003083FC01E20FF11D80810895209120326F -:10A1A00030912132F901EF5BFF4F908141E0490F7F -:10A1B0004083F901E90FF11D8083089580932432D3 -:10A1C000482F4F7050E06091C6047091C7049A0107 -:10A1D00094E0220F331F9A95E1F7E4E887FF11C05E -:10A1E000E49FC001E59F900D112489599D4C8093F7 -:10A1F000203290932132C90108969B01280F391F04 -:10A200000DC0E49FC001E59F900D11248B5D9D4C16 -:10A210008093203290932132260F371F20932232D1 -:10A22000309323320895809124328068C7DFE09113 -:10A230002232F09123328081869581700895809139 -:10A2400024328F77BBDFA0912232B09123328C91E0 -:10A2500085FF0DC0E0912032F091213212968D9150 -:10A260009C911397E05CFF4F808381E0089580E02C -:10A270000895809124328F77A1DFA0912232B0918E -:10A2800023328C9184FF0DC0E0912032F091213275 -:10A2900012968D919C911397E05CFF4F808381E033 -:10A2A000089580E00895809124328F7787DFE091D0 -:10A2B0002232F091233280818D788083E0912232A6 -:10A2C000F0912332808181608083E0912032F0918F -:10A2D0002132EF5BFF4F10828091243280686EDF65 -:10A2E000E0912232F0912332808181608083E0917D -:10A2F0002032F0912132EF5BFF4F10820895E09100 -:10A300002232F0912332818184608183E091223274 -:10A31000F09123328181807C803459F48091243201 -:10A3200080584CDFE0912232F091233281818460A9 -:10A33000818308951F93CF93DF93C82F162FD42FB7 -:10A340003DDFE0912232F09123321182E0912232FE -:10A35000F09123328C2F881F8827881F880F8083D5 -:10A36000E0912232F09123321183E0912232F09178 -:10A3700023321282138220912032309121322483A1 -:10A380003583CC0FCC0BCD23F901E05CFF4FC083AC -:10A390003196108281E0DF91CF911F910895CF9285 -:10A3A000DF92EF92FF920F931F93CF93DF93C62E0E -:10A3B0008C01D12CDC1409F43FC0F801D081D111FB -:10A3C00004C0D3940B5F1F4FF5CFF801E180F280FA -:10A3D00093818481823010F488E001C088E128E014 -:10A3E00030E0C0E02E153F0520F4CF5F220F331F71 -:10A3F000F9CFC82B8D2F8F70863010F080E01DC0F4 -:10A40000CF7EF1E4EF16F104C8F7992321F09130E3 -:10A4100021F4C06C0AC0C06403C0C068911105C0BB -:10A420004E2D6C2F80E88D0F85DF4E2D6C2F8D2FDC -:10A4300081DF8111C6CFE2CF81E0DF91CF911F9103 -:10A440000F91FF90EF90DF90CF90089580E090E023 -:10A45000E091C604F091C7049C0144E0220F331F31 -:10A460004A95E1F7E20FF31F11864091C60450911F -:10A47000C704FA01E20FF31F11820196863091059D -:10A4800039F708958091183287FF0DC0D8DE811109 -:10A4900005C0809117328111F9CF09C060CE80913B -:10A4A0001732882321F0BFDE8823C9F33FCE0895F9 -:10A4B0000F931F93CF93E091C604F091C704E05A25 -:10A4C000FF4F00811181C4E68091243287FF0AC0CA -:10A4D000AADE811105C080911732811105C022C00A -:10A4E00080E025C0ACDEF5CF8530F1F0E09122327E -:10A4F000F0912332818182FD19C0E091C604F09170 -:10A50000C704E05AFF4F808191810817190711F4A1 -:10A510008C01DACF2FEF2C0FCC2311F0C22FF8CF04 -:10A5200084E005C082E003C083E001C081E0CF91F8 -:10A530001F910F91089563D069D0E0ECF4E0818120 -:10A540008E7F818380818F77808310921632089569 -:10A55000CF93DF93E0E4F0E014828481836084830E -:10A560004ED054D0C0ECD4E088818F778883888126 -:10A57000806888831092173210921332109215322D -:10A580001092143288818064888348E068E480E80F -:10A59000D1DE48E068E480E0CDDE8885806488878D -:10A5A000898181608983DF91CF910895CF93DF9373 -:10A5B0003FB7F894C0ECD1E022E02A87EAE1F0E06E -:10A5C000E491A0ECB4E0DA96EC93DA97EBE1F0E0FA -:10A5D000E491DB96EC93DB971A868EE395E38E7F0E -:10A5E00016968D939C93179785E18C9318962C93D0 -:10A5F0003FBF81E080931632DF91CF91A9CFE0EC8D -:10A60000F4E080858370808711860895E0ECF4E0A3 -:10A610008FEF8287848708951F920F920FB60F9253 -:10A62000112408B60F9218BE09B60F9219BE0BB6C8 -:10A630000F921BBE2F933F934F935F936F937F9324 -:10A640008F939F93AF93BF93EF93FF938091CA042F -:10A6500087FF08C08091C80487FF04C080E880930A -:10A66000CA040BDC8091CA0486FF07C080E4809393 -:10A67000CA04109217320E94C8198091CA0485FF3B -:10A6800014C080E28093CA0480911332882311F0B1 -:10A6900084E007C08091C304811102C081E001C041 -:10A6A00083E0809317320E94B7198091CA0484FF17 -:10A6B00014C080E18093CA0482E080931732109224 -:10A6C00013321092C304C2DE48E068E480E832DE50 -:10A6D00048E068E480E02EDED0DBFF91EF91BF918F -:10A6E000AF919F918F917F916F915F914F913F912A -:10A6F0002F910F900BBE0F9009BE0F9008BE0F90C8 -:10A700000FBE0F901F901895CF93DF93EC01FC01C3 -:10A7100070968BE0DF011D928A95E9F782E08C83C9 -:10A72000898783E08E8761E0CE01019638DE882339 -:10A7300061F061E0CE01069632DE882331F061E0FF -:10A74000CE010B96DF91CF912ACE80E0DF91CF91A1 -:10A7500008950F931F93CF93DF93209117322430E6 -:10A76000E1F4FC010489158926893789012B022B24 -:10A77000032B99F0EB01818121DDFE010190002086 -:10A78000E9F73197BF016C1B7D0B40E050E0CE0133 -:10A79000DF91CF911F910F9182CB82E0DF91CF911A -:10A7A0001F910F9108950F931F93CF93DF932091E3 -:10A7B00017322430B1F4FC010489158926893789C0 -:10A7C000012B022B032B69F08A01EB018181F6DC5E -:10A7D00040E050E0B801CE01DF91CF911F910F9181 -:10A7E0005ECB82E0DF91CF911F910F9108950F937F -:10A7F0001F93CF9320911732243009F5FC0104896F -:10A80000158926893789012B022B032BC1F0C62F0E -:10A810008181D4DC8091203290912132FC01EF5B68 -:10A82000FF4F208131978081281720F48C2FB6DCD0 -:10A8300080E006C07BDC3CDE8823C1F301C082E0FF -:10A84000CF911F910F910895CF93DF9320911732ED -:10A85000243091F5FC014489558966897789452B17 -:10A86000462B472B49F18181A9DC8091243220912C -:10A87000203230912132F90187FF05C0EF5BFF4F95 -:10A88000808190E008C0E05CFF4F8081319640817C -:10A8900090E0841B9109892B69F0F901EF5BFF4F70 -:10A8A000D0813197C08142DCDC1720F001DE8111BC -:10A8B00004C03CDC80E001C082E0DF91CF910895CC -:10A8C000CF93DF9320911732243099F4FC0144890F -:10A8D000558966897789452B462B472B51F0EC012A -:10A8E00081816CDCA0DC882321F0CE01DF91CF9147 -:10A8F000ABCFDF91CF910895CF93DF9320911732A3 -:10A90000243019F08FEF9FEF46C0FC014489558930 -:10A9100066897789452B462B472BA1F386814EDC30 -:10A920008EDC882379F3809124322091203230917B -:10A930002132F90187FF05C0EF5BFF4F808190E076 -:10A9400008C0E05CFF4F80813196208190E0821B3F -:10A950009109892B21F012DCC82FD0E002C0CFEF83 -:10A96000DFEF209124328091203290912132FC013E -:10A9700027FF05C0EF5BFF4F208130E008C0E05C9F -:10A98000FF4F20813196808130E0281B3109232B35 -:10A9900009F4E5DBCE01DF91CF9108950895FF9290 -:10A9A0000F931F93CF93DF93EC0163DC882309F4AB -:10A9B0008EC0888190E020911C3230911D32281782 -:10A9C000390709F084C080911932813259F018F4A6 -:10A9D000803249F17CC0823209F457C0833209F4D5 -:10A9E00067C075C080911832813A09F070C05BDC95 -:10A9F0001ADC8823E9F38C89FD880E891F89CEDB58 -:10AA00008F2DCCDB802FCADB812FC8DB888DC6DB86 -:10AA1000898DC4DB8A8DC2DB89DBDF91CF911F91E9 -:10AA20000F91FF902FCD80911832813209F04FC0E5 -:10AA30003ADC05DC811105C0809117328111F9CF14 -:10AA400046C09CDBF82E9ADB182F98DB082F96DB8C -:10AA5000402F50E060E070E0BA0155274427782B82 -:10AA60004F29512B4C8B5D8B6E8B7F8B87DB888FB7 -:10AA700085DB898F83DB8A8F72DB04DDCE01DF917A -:10AA8000CF911F910F91FF9089CF80911832813221 -:10AA9000F1F409DCF7DC80911A3290911B32888B3B -:10AAA000998BCE01DF91CF911F910F91FF9076CFBF -:10AAB00080911832813259F4F6DBE4DC60911A326D -:10AAC000CE01DF91CF911F910F91FF9067CFDF9162 -:10AAD000CF911F910F91FF900895AA1BBB1B51E1CD -:10AAE00007C0AA1FBB1FA617B70710F0A61BB70BFE -:10AAF000881F991F5A95A9F780959095BC01CD01A3 -:10AB00000895B7FF04C003D0821B930B089509D0AA -:10AB1000A59F900DB49F900DA49F800D911D1124B1 -:10AB20000895A29FB001B39FC001A39F700D811D26 -:10AB30001124911DB29F700D811D1124911D089546 -:10AB40008F929F92AF92BF92CF92DF92EF92FF923D -:10AB5000CF93DF93EC01688179818A819B816115B4 -:10AB600071058105910521F464E279ED8BE597E0AB -:10AB70002DE133EF41E050E037D749015A019B0105 -:10AB8000AC01A7EAB1E4C3DF6B017C01ACEEB4EF2A -:10AB9000A5019401B8DFDC01CB018C0D9D1DAE1D1C -:10ABA000BF1DB7FF03C00197A109B04888839983EF -:10ABB000AA83BB839F77DF91CF91FF90EF90DF90C7 -:10ABC000CF90BF90AF909F908F900895B9CF80E2C3 -:10ABD00090E2B6CFA0E0B0E08093202090932120B7 -:10ABE000A0932220B09323200895FB01DC0102C032 -:10ABF00005900D9241505040D8F70895FB01DC01BB -:10AC00008D91059080190110D9F3990B0895FB01DE -:10AC1000DC014150504048F005900D920020C9F7EA -:10AC200001C01D9241505040E0F70895FB01DC0146 -:10AC300004C08D910190801921F441505040C8F713 -:10AC4000881B990B0895FB01DC0102C001900D9255 -:10AC500041505040D8F708956817790768F4FB0110 -:10AC6000DC01E40FF51FA40FB51F02C002900E9285 -:10AC700041505040D8F70895E6CFDC0101C06D93F4 -:10AC800041505040E0F70895FC018191861721F072 -:10AC90008823D9F7992708953197CF010895FB01AB -:10ACA000DC0101900D920020E1F708950F931F93AE -:10ACB000CF93DF93CDB7DEB72E97CDBFDEBF0E8922 -:10ACC0001F89888D998D26E02C8309831A8397FF2D -:10ACD00002C080E090E801978D839E83AE01445EC0 -:10ACE0005F4F6A8D7B8DCE01019667D04D815E816D -:10ACF00057FD0AC02F813885421753070CF49A017B -:10AD0000F801E20FF31F10822E96CDBFDEBFDF9158 -:10AD1000CF911F910F9108950F931F93CF93DF93BE -:10AD2000CDB7DEB72E97CDBFDEBF0E891F89888DC8 -:10AD3000998D2EE02C8309831A8397FF02C080E04F -:10AD400090E801978D839E83AE01445E5F4F6A8DCC -:10AD50007B8DCE01019631D04D815E8157FD0AC0B9 -:10AD60002F813885421753070CF49A01F801E20F3E -:10AD7000F31F10822E96CDBFDEBFDF91CF911F91C2 -:10AD80000F910895CF93DF93CDB7DEB72E97CDBF48 -:10AD9000DEBF8DE08C838C899D8989839A83AE0187 -:10ADA000485E5F4F6E897F89CE010196A9D32E96AA -:10ADB000CDBFDEBFDF91CF9108952F923F924F928A -:10ADC0005F926F927F928F929F92AF92BF92CF923B -:10ADD000DF92EF92FF920F931F93CF93DF93CDB744 -:10ADE000DEB72B97CDBFDEBF6C017B018A01FC0172 -:10ADF00016821782838181FFBFC1CE0101963C017B -:10AE0000F6019381F70193FD859193FF81917F0175 -:10AE1000882309F4ADC1853239F493FD859193FF00 -:10AE200081917F01853221F4B60190E0E7D4E8CF2B -:10AE3000912C212C312CFFE1F315D8F08B3279F0D5 -:10AE400038F4803279F08332A1F4232D20611DC0C3 -:10AE50008D3261F0803369F4232D216016C0832D7B -:10AE60008260382EE32DE4603E2E2AC0F32DF86078 -:10AE70001DC037FC2DC020ED280F2A3040F08E3247 -:10AE8000B9F436FC75C1232D2064322E19C036FE6C -:10AE900006C08AE0989E200D1124922E11C0EAE08F -:10AEA0002E9E200D1124222EF32DF0623F2E08C07D -:10AEB0008C3621F4832D8068382E02C0883641F408 -:10AEC000F70193FD859193FF81917F018111B3CFAC -:10AED000982F9F7D9554933028F40C5F1F4F9FE36C -:10AEE00099830DC0833631F0833771F0833509F0D3 -:10AEF00055C020C0F801808189830E5F1F4F8824D0 -:10AF00008394912C530112C02801F2E04F0E511C82 -:10AF1000F801A080B18036FE03C0692D70E002C048 -:10AF20006FEF7FEFC50121D44C018201F32DFF7734 -:10AF30003F2E15C0280122E0420E511CF801A080CE -:10AF4000B18036FE03C0692D70E002C06FEF7FEF65 -:10AF5000C50100D44C01F32DF0683F2E820133FC73 -:10AF600019C0822D90E088169906A0F4B60180E2FF -:10AF700090E044D42A94F5CFF50137FC859137FE53 -:10AF800081915F01B60190E039D421102A9421E02B -:10AF9000821A91088114910479F7E1C0843611F086 -:10AFA000893639F5F80137FE07C0608171818281E9 -:10AFB00093810C5F1F4F08C060817181072E000CC8 -:10AFC000880B990B0E5F1F4FF32DFF763F2E97FFD7 -:10AFD00009C090958095709561957F4F8F4F9F4FD9 -:10AFE000F0683F2E2AE030E0A3015DD4882E861859 -:10AFF00044C0853731F4232D2F7EB22E2AE030E075 -:10B0000025C0932D997FB92E8F36C1F018F488355D -:10B0100079F0AEC0803719F0883721F0A9C0E92F48 -:10B02000E061BE2EB4FE0DC0FB2DF460BF2E09C042 -:10B0300034FE0AC0292F2660B22E06C028E030E078 -:10B0400005C020E130E002C020E132E0F801B7FEA7 -:10B0500007C060817181828193810C5F1F4F06C0A0 -:10B060006081718180E090E00E5F1F4FA3011BD4CF -:10B07000882E8618FB2DFF773F2E36FE0DC0232D20 -:10B080002E7FA22E891458F434FE0BC032FC09C066 -:10B09000832D8E7EA82E05C0B82CA32C03C0B82CFF -:10B0A00001C0B92CA4FE0FC0FE01E80DF11D808186 -:10B0B000803321F49A2D997EA92E09C0A2FE06C0E4 -:10B0C000B394B39404C08A2D867809F0B394A3FC9A -:10B0D00010C0A0FE06C0B21480F4280C922C9B185D -:10B0E0000DC0B21458F4B60180E290E087D3B39457 -:10B0F000F8CFB21418F42B1802C0982C212CA4FEFF -:10B100000FC0B60180E390E079D3A2FE16C0A1FC87 -:10B1100003C088E790E002C088E590E0B6010CC06B -:10B120008A2D867851F0A1FE02C08BE201C080E238 -:10B13000A7FC8DE2B60190E061D3891430F4B6012A -:10B1400080E390E05BD39A94F8CF8A94F301E80D02 -:10B15000F11D8081B60190E051D38110F6CF2220FD -:10B1600009F44ECEB60180E290E048D32A94F7CF9E -:10B17000F6018681978102C08FEF9FEF2B96CDBF9E -:10B18000DEBFDF91CF911F910F91FF90EF90DF9085 -:10B19000CF90BF90AF909F908F907F906F905F9077 -:10B1A0004F903F902F90089520FD09C0FC0123FD92 -:10B1B00005C022FF02C073836283518340830895D8 -:10B1C00044FD17C046FD17C0AB01BC01DA01FB010D -:10B1D000AA0FBB1FEE1FFF1F1094D1F74A0F5B1F72 -:10B1E0006E1F7F1FCB01BA01660F771F881F991F43 -:10B1F00009C033E001C034E0660F771F881F991F34 -:10B200003150D1F7620F711D811D911D08950F936B -:10B210001F93CF93DF938C01C801B2D2EC0197FD4D -:10B2200006C085D2892BC1F7B801CE0123D3CE0148 -:10B23000DF91CF911F910F9108958F929F92AF92BE -:10B24000BF92EF92FF920F931F93CF93DF938C01E6 -:10B25000D62F7A01B22E94D29C0133272B3231059E -:10B2600031F02D32310559F48B2D8068B82ED15034 -:10B2700011F480E061C0C80183D297FDFACFCB2DD5 -:10B28000CD7F2B2D2073F9F48033E9F4AA24AA94FE -:10B29000AD0E09F43EC0C80173D297FD3AC09C01BF -:10B2A0002F7D33272835310541F4C264D25089F10E -:10B2B000C80166D297FF07C02CC0B6FE02C0C260AC -:10B2C00001C0C261DA2D812C912C540120ED280F90 -:10B2D000283078F0C4FF03C0B801CCD217C02A30A0 -:10B2E00040F0C6FFF9CF2F7D3FEE320F3630A0F78A -:10B2F00027504C2FC501B40163DF4B015C01C260D4 -:10B30000D15051F0C8013CD297FFE0CFC1FD04C03D -:10B31000B0CF812C912C5401C7FF08C0B094A094E9 -:10B3200090948094811C911CA11CB11C2C2FB50100 -:10B33000A401C70139DF81E0DF91CF911F910F9107 -:10B34000FF90EF90BF90AF909F908F9008955F9285 -:10B350006F927F928F929F92AF92BF92CF92DF9225 -:10B36000EF92FF920F931F93CF93DF93CDB7DEB78A -:10B37000A097CDBFDEBF5C01962E7A01F9018E0148 -:10B380000F5F1F4F680180E2D8011D928A95E9F78F -:10B39000D50113968C9080E090E0612C712C30E008 -:10B3A00061E070E083FC259183FE21918F01522E94 -:10B3B000211103C080E090E090C02E3511F4009779 -:10B3C00051F1432F50E0481759073CF42D3559F1FE -:10B3D0002D3219F4772009F103C0772009F468C0F1 -:10B3E000452D469546954695D601A40FB11D452D90 -:10B3F00047708B0102C0000F111F4A95E2F7A801A8 -:10B400005C91452B4C93651459F0561410F45394E9 -:10B41000E7CF5A94E5CF31E004C07724739401C09C -:10B42000712C0196BFCF772019F08E8180628E83B8 -:10B43000311103C08824839417C0F6019E012F5D4B -:10B440003F4F8081809581932E173F07D1F7F2CF30 -:10B45000E114F10429F0D7018C93F70131967F01B3 -:10B460009A94812C9920E9F0C5018AD197FD17C0E3 -:10B47000FC01FF2723E0F595E7952A95E1F7EC0D10 -:10B48000FD1D208130E0AC014770552702C0359585 -:10B4900027954A95E2F720FDDBCFB501EBD181106E -:10B4A00089CFE114F10411F0D7011C92C80115C035 -:10B4B000422F469546954695D601A40FB11D422FC1 -:10B4C00047708B0102C0000F111F4A95E2F7A801D7 -:10B4D0005C91452B4C93622EA4CFA096CDBFDEBFCE -:10B4E000DF91CF911F910F91FF90EF90DF90CF9060 -:10B4F000BF90AF909F908F907F906F905F900895D6 -:10B500005F926F927F928F929F92AF92BF92CF92F3 -:10B51000DF92EF92FF920F931F93CF93DF936C0113 -:10B52000EB015A01FC0116821782512CF601E380CF -:10B53000FE01E3FC8591E3FE8191182FEF01882342 -:10B5400009F4E0C090E0F3D0892B19F0C6015FDE6A -:10B55000EDCF153241F4FE01E3FC1591E3FE1191AC -:10B56000EF01153271F4C6010BD197FDC9C0412F0F -:10B5700050E09C01332724173507C1F2B6017AD178 -:10B58000C1C01A3239F4E3FC1591E3FE1191EF01C9 -:10B5900001E001C000E0F12C20ED210F2A3078F409 -:10B5A00002606F2D70E080E090E040E209DEF62E50 -:10B5B000FE01E3FC1591E3FE1191EF01EDCF01FFD8 -:10B5C00003C0F11003C09EC0FF24FA94183619F08E -:10B5D0001C3651F010C0FE01E3FC1591E3FE119101 -:10B5E000EF01183641F408600460FE01E3FC159198 -:10B5F000E3FE1191EF01112309F484C0612F70E083 -:10B600008CEF91E09CD0892B09F47CC000FD07C031 -:10B61000F50180809180C50102965C0102C0812CF9 -:10B62000912C1E3649F4F6014681578160E070E0A6 -:10B63000202FC401B9DD7ACF1336A1F401FD02C079 -:10B64000FF24F394C6019CD097FD5AC08114910445 -:10B6500029F0F4018083C40101964C01FA94F110A1 -:10B66000F1CF4AC01B3551F49E01A4016F2DC601D4 -:10B670006EDEEC01892B09F03FC039C0C601C7DD81 -:10B6800097FD3EC01F3649F128F4143621F11936D2 -:10B6900039F125C0133771F01537E9F020C0811456 -:10B6A000910429F0F4016082C40101964C01FA94DE -:10B6B000FF2059F0C60164D03C0197FD06C037D089 -:10B6C000892B69F3B601C301D5D081149104A1F08F -:10B6D000F401108211C0006203C0006101C0006467 -:10B6E000202FA4016F2DC601A8DD811105C0F60130 -:10B6F0008381807329F406C000FD18CF539416CFC0 -:10B70000552019F0852D90E002C08FEF9FEFDF915B -:10B71000CF911F910F91FF90EF90DF90CF90BF904E -:10B72000AF909F908F907F906F905F900895911150 -:10B7300018C1803219F089508550D0F70895FC0166 -:10B740000590061621F00020D9F7C0010895319721 -:10B75000CF010895FC010590615070400110D8F7A9 -:10B76000809590958E0F9F1F0895FC016150704049 -:10B7700001900110D8F7809590958E0F9F1F089526 -:10B78000CF93DF93EC012B8120FF33C026FF0AC04B -:10B790002F7B2B838E819F8101968E839F838A814D -:10B7A00090E029C022FF0FC0E881F9818081082E36 -:10B7B000000C990B009719F420622B831AC0319664 -:10B7C000E883F9830EC0EA85FB85199597FF09C0C8 -:10B7D0002B81019611F080E201C080E1822B8B83E6 -:10B7E00008C02E813F812F5F3F4F2E833F839927D3 -:10B7F00002C08FEF9FEFDF91CF9108950F931F93BA -:10B80000CF93DF93FB01238121FD03C08FEF9FEFD7 -:10B810002CC022FF16C046815781248135814217F2 -:10B82000530744F4A081B1819D012F5F3F4F2083D6 -:10B8300031838C93268137812F5F3F4F2683378357 -:10B8400014C08B01EC01FB010084F185E02D1995FA -:10B85000892BE1F6D80116968D919C911797019648 -:10B8600016968D939C931797CE01DF91CF911F91E0 -:10B870000F910895FB01238120FF12C026FD10C007 -:10B880008F3F3FEF930761F082832F7D20642383F6 -:10B8900026813781215031092683378399270895DE -:10B8A0008FEF9FEF0895FA01AA27283051F1203138 -:10B8B00081F1E8946F936E7F6E5F7F4F8F4F9F4F44 -:10B8C000AF4FB1E03ED0B4E03CD0670F781F891F86 -:10B8D0009A1FA11D680F791F8A1F911DA11D6A0F54 -:10B8E000711D811D911DA11D20D009F468943F9107 -:10B8F0002AE0269F11243019305D3193DEF6CF0106 -:10B900000895462F4770405D4193B3E00FD0C9F7CB -:10B91000F6CF462F4F70405D4A3318F0495D31FD38 -:10B920004052419302D0A9F7EACFB4E0A69597958B -:10B93000879577956795BA95C9F700976105710561 -:10B9400008959B01AC010A2E0694579547953795AB -:10B950002795BA95C9F7620F731F841F951FA01D05 -:10B96000089599278827089503D0808199270895FD -:10B97000E0ECF1E0378537FDFDCF34853860348762 -:10B98000FC01E050F04F0895262FF2DF00800216F0 -:10B9900011F008D00197019708950196272FF5DF40 -:10B9A000F3CF262FE0ECF1E0378537FDFDCF34856E -:10B9B000377F3487378531FF09C036E3328738ED6A -:10B9C00034BF31E03387378537FDFDCF33E332872E -:10B9D000808391831282248325E3228728ED31E03E -:10B9E00024BF338701960895052E97FB16F4009423 -:10B9F0000FD057FD05D014D007FC02D046F408C084 -:10BA000050954095309521953F4F4F4F5F4F08958A -:10BA100090958095709561957F4F8F4F9F4F0895BA -:10BA2000A1E21A2EAA1BBB1BFD010DC0AA1FBB1F42 -:10BA3000EE1FFF1FA217B307E407F50720F0A21BB4 -:10BA4000B30BE40BF50B661F771F881F991F1A9421 -:10BA500069F760957095809590959B01AC01BD014B -:08BA6000CF010895F894FFCF17 -:10BA680002400F008310000001041000000182084A -:10BA780000000100000000000000000000000100BC -:10BA880001000000000000000925102510251C25D4 -:10BA9800282532254F255D25862589258D253E00BB -:10BAA8000426140004043E00042E040C04040008B8 -:10BAB8000008000000000000000800080808080846 -:10BAC80008000800080000000808000808080080AE -:10BAD80000800000000000000080008080808080DE -:10BAE800800080008000000080800080808000014D -:10BAF8000001000000000000000100010101010137 -:10BB08000100010001000000010100010101000025 -:10BB1800000000000000000000000000000001011B -:10BB280001010101010101010101010101010101FD -:10BB380001010101010101010101010101010101ED -:10BB480001010101010101010101010101010000DF -:10BB580000000000000000000000000000000000DD -:10BB680000000000000000000000000000000000CD -:10BB780000000000000000000000000000000101BB -:10BB8800010101010101010101010101010100009F -:10BB9800000000000000000000000000000000009D -:10BBA800000000000000000000000000000001018B -:10BBB800010101010101010101010101010100006F -:10BBC800000000000000000000000000000001016B -:10BBD800010101010101010101010101010101014D -:10BBE800010101010101010101010101010100003F -:10BBF800000000000000000000000000000001013B -:10BC0800010101010101010101010101010100001E -:10BC1800000202000002000202020200000200000C -:10BC280000020200000200020202020000020000FC -:10BC380000020200000200020202020000020404E4 -:10BC4800040606040406040606060604040604049C -:10BC58000406060404060406060606040406000094 -:10BC680000020200000200020202020000020000BC -:10BC780000020200000200020202020000020404A4 -:10BC88000406060404060406060606040406000064 -:10BC98000002020000020002020202000002040484 -:10BCA800040606040406040606060604040604043C -:10BCB800040606040406040606060604040604042C -:10BCC800040606040406040606060604040604041C -:10BCD8000406060404060406060606040406000014 -:10BCE800000202000002000202020200000200003C -:10BCF8000002020000020002020202000002040424 -:10BD080004060604040604060606060404060008DB -:10BD180008080000000800000800080800080008DB -:10BD280008080000000800000800080800080008CB -:10BD3800080800000008000008000808000810189B -:10BD480018181010101810101810181810181018AB -:10BD580018181010101810101810181810180008BB -:10BD6800080800000008000008000808000800088B -:10BD7800080800000008000008000808000810185B -:10BD8800181810101018101018101818101800088B -:10BD9800080800000008000008000808000810183B -:10BDA800181810101018101018101818101810184B -:10BDB800181810101018101018101818101810183B -:10BDC800181810101018101018101818101810182B -:10BDD800181810101018101018101818101800083B -:10BDE800080800000008000008000808000800080B -:10BDF80008080000000800000800080800081018DB -:10BE08001818101010181010181018181018434C83 -:10BE18004F4E4500546F6F206D616E7920646174D8 -:10BE2800612E000D0A000D0A50415249545920450F -:10BE380052524F52000D0A504152495459204F4B0B -:10BE4800002534753A200025337500556E6B6E6FEA -:10BE5800776E206361726420747970652E00257393 -:10BE6800206F7220004D756C7469706C6520706F5E -:10BE780073736962696C69746965732C206E6F7479 -:10BE880020636C6F6E61626C652100436C6F6E6538 -:10BE980064204F4B2100436C6F6E6520756E73757F -:10BEA80070706F7274656421004E4F204441544194 -:02BEB800000088 +:1070C0008695179513968C9113978695F7958695C7 +:1070D00017958695F795869517958695F7958695D4 +:1070E00017958695F7958695179514968C91149714 +:1070F00090E020E0869597958695279586959795BB +:107100008695279586959795869527958695979543 +:10711000869527951596EC91E6959795E695279592 +:10712000E6959795E6952795E6959795E6952795A3 +:10713000E6959795E69527954B01DA014C5F5F4FF1 +:107140000C91E401B9904E01B026C32FD0E0BE01EE +:1071500062557F4D7B01612F70E062557E4DE701E6 +:10716000F880EB0188816F2D682BE22EF12CE7016E +:10717000C255DD4D8881682B70E062577F4DEB0171 +:1071800088818695E7956F2F60718D2D817E6827A8 +:10719000892F80726827832F84796827812F8377CE +:1071A0006827822F8A736827F62EF2946F25762F30 +:1071B000769576956727FB2CF6266695F6267D2D27 +:1071C0006F2F892FF694879567957795B694C72E7C +:1071D000D12CE601C255DF4D6E01E62EF12CE70100 +:1071E000C255DE4D7E01E601F881E7019881EF2E60 +:1071F000E92AC82ED12CE601C255DD4D9881E92A35 +:10720000F12CE701C257DF4D98819695E795F12F54 +:10721000F071932F917EEF2EE926922F9072E9263E +:10722000972F9479E926962F9377E926982F9A73CA +:10723000E926FE2CF294EF24CE2CC694C694EC24BE +:10724000FB2CFE24E694FE24F6942795179537959B +:10725000B694C32ED12CE601C255DF4D6E01E12E4E +:10726000F12CE701C255DE4D7E01E601F881E70110 +:107270009881EF2EE92AC22ED12CE601C255DD4DB0 +:107280009881E92AF12CE701C257DF4D9881969544 +:10729000E795F62FF071972F917EEF2EE926982F24 +:1072A0009072E926932F9479E926912F9377E92616 +:1072B000922F9A73E926FE2CF294EF24CE2CC694DA +:1072C000C694EC24FB2CFE24E694FE24F82FF694BE +:1072D000F79567957795B694872F90E0EC01C255A6 +:1072E000DF4D862F90E082559E4DF880EC0188811D +:1072F0008F29EF2EF12CE701C255DD4D9881892BA6 +:1073000090E082579F4DEC0188818695E795912FFB +:107310009071832F817EE92EE826822F8072E826E5 +:10732000872F8479E826862F8377E8268F2F8A7324 +:10733000E826FE2CF294EF24CE2CC694C694EC24BE +:10734000FB2CFE24E694FE24F6942795179537959A +:10735000B694832F90E0EC01C255DF4D812F90E071 +:1073600082559E4DF880EC0188818F29E22EF12C08 +:10737000E701C255DD4D9881892B90E082579F4DE2 +:10738000EC0188818695E795962F9071872F817EF5 +:10739000F92EF8268F2F8072F826832F8479F8260D +:1073A000812F8377F826822F8A73F8269F2D929556 +:1073B000F926EF2CE694E694FE249B2D9F25F69467 +:1073C0009F258F2F9695879567957795B694C72EAD +:1073D000D12CE601C255DF4D6E01E62EF12CE701FE +:1073E000C255DE4D7E01E601F881E7019881EF2E5E +:1073F000E92AC82ED12CE601C255DD4D9881E92A33 +:10740000F12CE701C257DF4D98819695E795F12F52 +:10741000F071932F917EF927922F9072F927972F71 +:107420009479F927962F9377F927982F9A73F9274C +:107430009F2F9295F927FF2EF694F694FF259B2D0A +:107440009F27F6959F279695279517953795B6947C +:10745000C32ED12CE601C255DF4D6E01E12EF12C79 +:10746000E701C255DE4D7E01E601F881E701988112 +:10747000EF2EE92AC22ED12CE601C255DD4D9881AE +:10748000E92AF12CE701C257DF4D98819695E795DF +:10749000F62FF071972F917E9F27F82FF0729F277C +:1074A000F32FF4799F27F12FF3779F27F22FFA73A9 +:1074B0009F27F92FF2959F27F92FF695F6959F278D +:1074C000FB2DF9279695F927982F8F2F869597955D +:1074D00067957795D72EF62F672F70E0EB01C25591 +:1074E000DF4D6F2F70E062557E4DF880EB01888193 +:1074F0006F2D682BE92EF12CE701C255DD4D8881F7 +:10750000682B70E062577F4DEB0188818695E79587 +:10751000632F617E812F80718627622F607286279C +:107520006D2D647986276F2F63778627692F6A739D +:107530008627682F62958627682F66956695862729 +:10754000B694B8268695B826812FB6942795879548 +:107550003795182F0E270D934A175B0709F0F0CDCA +:10756000D092B22CF093B32C9093B42C3093B52CD2 +:107570008093B62C2093B72CDF91CF911F910F9160 +:10758000FF90EF90DF90CF90BF909F908F900895E5 +:107590008F929F92AF92BF92CF92DF92EF92FF9223 +:1075A0000F931F93CF93DF93FC01C62FF42EB52FBB +:1075B0008081A0E050E0869557958695A7958695A1 +:1075C00057958695A795869557958695A7958695FF +:1075D00057958695A7958181869557958695A79508 +:1075E000869557958695A795869557958695A795DF +:1075F000869557958695A795828130E040E08695DF +:1076000047958695379586954795869537958695BE +:1076100047958695379586954795869537958381C5 +:10762000869547958695379586954795869537959E +:10763000869547958695379586954795869537958E +:10764000648190E080E0669587956695979566954C +:1076500087956695979566958795669597956695AE +:10766000879566959795B5806B2D669587956695F8 +:10767000979566958795669597956695879566958E +:1076800097956695879566959795B62EEA2FF0E0C3 +:10769000E255FF4D032F10E002551E4DD081F80139 +:1076A0006081D62B092F10E002551D4DF801608135 +:1076B000ED2FE62BF0E0E257FF4DC0800C2F172F87 +:1076C000CF2DDB2F7E01F4E0EF0EF11C7881F80165 +:1076D000B1918F01B7276B2DC6946795F42FF07188 +:1076E000E52FE17EFE27E82FE072FE27EA2FE479FE +:1076F000FE27E32FE377FE27E92FEA73FE27EF2F1C +:10770000E295FE27DF2ED694D694FD25EB2FEF27AA +:10771000F695EF2720FDEC25E6958795479557953B +:10772000B695C52ED12CF601E255FF4D6F01A42E62 +:10773000B12CF501E255FE4D5F01F601D080F50157 +:10774000C080DC28E82FF0E0E255FD4DF081ED2D02 +:10775000EF2BF0E0E257FF4DC080C6946795F32F02 +:10776000F071EA2FE17EFE27E92FE072FE27E52F78 +:10777000E479FE27E42FE377FE27E82FEA73FE275C +:10778000EF2FE295FE27DF2ED694D694FD25EB2F22 +:10779000EF27F695EF27DA2E20FDEC25E695979555 +:1077A0003795D794CB2EC694AD2DB0E0A255BF4DE2 +:1077B000E32FF0E0E255FE4DAC91E081EA2BA92FDA +:1077C000B0E0A255BD4DFC91EF2BF0E0E257FF4D2C +:1077D000B081B6956795F42FF071E52FE17EFE2715 +:1077E000E82FE072FE27ED2DE479FE27E32FE37703 +:1077F000FE27E92FEA73FE27EF2FE295FE27AF2F32 +:10780000A695A695FA27EC2DEF27F695EF2720FDF4 +:10781000EB27E695879547955795C694A52FB0E039 +:10782000A255BF4DE42FF0E0E255FE4DAC91E08152 +:10783000EA2BA82FB0E0A255BD4DFC91EF2BF0E054 +:10784000E257FF4DB081B6956795F32FF071ED2D9E +:10785000E17EFE27E92FE072FE27E52FE479FE277F +:10786000E42FE377FE27E82FEA73FE27EF2FE29558 +:10787000FE27AF2FA695A695FA27EC2DEF27F695B4 +:10788000EF2720FDEB27E69597953795D794C6947B +:10789000AD2DB0E0A255BF4DE32FF0E0E255FE4D17 +:1078A000AC91E081EA2BA92FB0E0A255BD4DFC912F +:1078B000EF2BF0E0E257FF4DB081B6956795F42FBE +:1078C000F071E52FE17EFE27E82FE072FE27ED2D17 +:1078D000E479FE27E32FE377FE27E92FEA73FE27FB +:1078E000EF2FE295FE27AF2FA695A695FA27EC2D50 +:1078F000EF27F695EF2720FDEB27E695879547952F +:107900005795C694A52FB0E0A255BF4DE42FF0E0E7 +:10791000E255FE4DAC91E081EA2BA82FB0E0A255D4 +:10792000BD4DFC91EF2BF0E0E257FF4DB081B695D5 +:107930006795F32FF071ED2DE17EFE27E92FE072C0 +:10794000FE27E52FE479FE27E42FE377FE27E82FD3 +:10795000EA73FE27EF2FE295FE27AF2FA695A69597 +:10796000FA27EC2DEF27F695EF2720FDEB27E6957C +:1079700097953795D794C694ED2DF0E0E255FF4DDD +:10798000A32FB0E0A255BE4DF081EC91EF2BA92FB3 +:10799000B0E0A255BD4DFC91EF2BF0E0E257FF4D5A +:1079A000B081B6956795F42FF071E52FE17EFE2743 +:1079B000E82FE072FE27ED2DE479FE27E32FE37731 +:1079C000FE27E92FEA73FE27EF2FE295FE27AF2F60 +:1079D000A695A695FA27EC2DEF27F695EF2720FD23 +:1079E000EB27E695879547955795A52FB0E0A255CB +:1079F000BF4DE42FF0E0E255FE4DAC91E081EA2B63 +:107A0000A82FB0E0A255BD4DFC91EF2BF0E0E2575E +:107A1000FF4DF081F6956795B62EED2DE17E632F33 +:107A200060716E27E92FE0726E27E52FE4796E27EB +:107A3000E42FE3776E27E82FEA736E27E62FE295AF +:107A40006E27E62FE695E6956E27C694C6266695C0 +:107A5000C62620FDCF26C69497953795D794AD2D91 +:107A6000CD2CD12CF601E255FF4D6F01832E912CC8 +:107A7000F401E255FE4D4F01F601B081F401608141 +:107A8000B62BC92ED12CF601E255FD4D6081EB2FAE +:107A9000E62BF0E0E257FF4DC080E72FF0E0EE511B +:107AA000FB4FE491EC25EC837B257993EC16FD06E6 +:107AB00009F00CCE5093B22C4093B32C8093B42C8D +:107AC000A093B52C3093B62C9093B72CDF91CF9127 +:107AD0001F910F91FF90EF90DF90CF90BF90AF90EC +:107AE0009F908F900895BF92CF92DF92EF92FF9276 +:107AF0000F931F93CF93DF93A091B22C5091B32C8F +:107B00001091B42C4091B52C3091B62C2091B72C0B +:107B1000FC01BC016C5F7F4F0191952F90718A2F02 +:107B2000817E9827812F80729827842F84799827C7 +:107B3000832F83779827822F8A739827892F82959E +:107B40009827892F869586959827C42ED12CE601F3 +:107B5000C255DF4D6E01E32EF12CE701C255DE4D1B +:107B60007E01E601B881E7018881B82BE22EF12C75 +:107B7000E701C255DD4D8881CB2FC82BD0E0C2571D +:107B8000DF4DB881B027B92796959B270695812FA1 +:107B9000969587955795A795B32FB071942F917EA1 +:107BA000B927922F9072B9279A2F9479B927952FD8 +:107BB0009377B927982F9A73B9279B2F9295B92756 +:107BC0009B2F96959695B927CA2ED12CE601C255C2 +:107BD000DF4D6E01E52EF12CE701C255DE4D7E0131 +:107BE000E6011881E7019881192BE82EF12CE701B5 +:107BF000C255DD4D9881C12FC92BD0E0C257DF4D52 +:107C0000988190279B27B695B927B02EB694922FCE +:107C1000B695979537954795B52FB0712A2F217E48 +:107C2000B227282F2072B227242F2479B227232F9E +:107C30002377B227292F2A73B2272B2F2295B22719 +:107C40002B2F26952695B227C42FD0E08E01025502 +:107C50001F4D6801C32FD0E08E0102551E4D7801E3 +:107C6000E6010881E7012881022BE92EF12CE701CA +:107C7000C255DD4D2881022B10E002571F4DE8014F +:107C80002881C22FCB25CB27B695BC272B2D269537 +:107C9000B69587955795A795C32FC071B42FB17E20 +:107CA000BC27C92FC072BC27CA2FC479BC27C52FD7 +:107CB000C377BC27C82FCA73BC27CB2FC295BC275C +:107CC000CB2FC695C695BC27CA2FD0E0C255DF4D35 +:107CD000052F10E002551E4DF880E8011881F12AA9 +:107CE000082F10E002551D4DE8011881CF2DC12B42 +:107CF000D0E0C257DF4DC881C227CB27B695BC273D +:107D00002695B695979537954795C52FC071BA2F8B +:107D1000B17EBC27C82FC072BC27C42FC479BC2732 +:107D2000C32FC377BC27C92FCA73BC27CB2FC295DB +:107D3000BC27CB2FC695C695BC27C42FD0E0C25513 +:107D4000DF4D032F10E002551E4DF880E801188129 +:107D5000F12A092F10E002551D4DE8011881CF2DA1 +:107D6000C12BD0E0C257DF4DC881C227CB27B695C3 +:107D7000BC272695B69587955795A795D32FD07193 +:107D8000B42FB17EDB27B92FB072DB27BA2FB479BD +:107D9000DB27B52FB377DB27B82FBA73DB27BD2FCF +:107DA000B295DB271D2F169516951D27CA2ED12CAF +:107DB000E601C255DF4D6E01E52EF12CE701C255FB +:107DC000DE4D7E01E6010881E701B8810B2BE82E2C +:107DD000F12CE701C255DD4DB881C02FCB2BD0E08F +:107DE000C257DF4DB881B227B127D12FD695DB27F7 +:107DF000B22EB694D695979537954795D52FD071D5 +:107E00002A2F217ED227282F2072D227242F2479AF +:107E1000D227232F2377D227292F2A73D2272D2F3A +:107E20002295D2272D2F26952695BD2FB227C42F18 +:107E3000D0E08E0102551F4D6801C32FD0E08E01A6 +:107E400002551E4D7801E6010881E7012881022BC9 +:107E5000E92EF12CE701C255DD4D2881022B10E0FF +:107E600002571F4DE80118811B251B27DB2FD695D4 +:107E7000D127D69587955795A795182F242F217E22 +:107E8000832F80712827892F807228278A2F847951 +:107E90002827852F83772827812F8A732827B22FB9 +:107EA000B2952B27B22FB695B6952B27EA2EF12C3B +:107EB000E701C255DF4D7E01C52ED12CE601C2552A +:107EC000DE4D6E01E701E880E6018881E82AC12ED7 +:107ED000D12CE601C255DD4D8881E82AF12CE7015D +:107EE000C257DF4DB6948881CB2DC827C22726956F +:107EF000B22FBC272B2F2695979537954795292F7D +:107F00006E177F0709F008CEA093B22C5093B32CC4 +:107F10001093B42C4093B52C3093B62C9093B72C7F +:107F2000DF91CF911F910F91FF90EF90DF90CF9055 +:107F3000BF900895CF93DF93E2EBFCE2A0817181C3 +:107F40006281338124819581472F40718A2F817E00 +:107F50008427462F40728427432F44798427422F59 +:107F600043778427492F4A738427482F42958427D3 +:107F7000482F469546958427482F46958427869511 +:107F800067957795A795C32FD0E0C255DF4D422F57 +:107F900050E042555E4DB881EA018881B82B492FE7 +:107FA00050E042555D4DEA018881CB2FC82BD0E0CF +:107FB000C25BDF4D88818695522F5071432F417EE1 +:107FC0004527592F507245275A2F54794527572F47 +:107FD00053774527562F5A734527542F52954527D7 +:107FE000542F569556954527542F56954527469517 +:107FF000979527953795CA2FD0E0C255DF4D472F6B +:1080000050E042555E4DB881EA014881B42B462FBD +:1080100050E042555D4DEA014881CB2FC42BD0E0A2 +:10802000C25BDF4D4881842B8695572F50714A2FB4 +:10803000417E4527562F50724527532F54794527A7 +:10804000522F53774527592F5A734527542F52954E +:108050004527542F569556954527542F5695452715 +:10806000469567957795A795C32FD0E0C255DF4D0C +:10807000422F50E042555E4DB881EA014881B42B51 +:10808000492F50E042555D4DEA014881CB2FC42B6A +:10809000D0E0C25BDF4D4881842B8695CA2FD0E0AB +:1080A000C255DF4D472F50E042555E4DB881EA0181 +:1080B0004881B42B462F50E042555D4DEA0148817E +:1080C000CB2FC42BD0E0C25BDF4D4881842B532FD4 +:1080D000517E422F40714527592F507245275A2F04 +:1080E00054794527572F53774527562F5A734527DD +:1080F000542F52954527542F569556954527542F62 +:10810000569545274695979527953795A083718372 +:108110006283338324839583DF91CF910895BF9247 +:10812000CF92DF92EF92FF920F931F93CF93DF9343 +:108130005091B22CC091B32CB090B42C4091B52C7E +:108140003091B62C2091B72CFC01615008F4EAC1A3 +:108150009C2F9071852F817E98278B2D8072982778 +:10816000842F84799827832F83779827822F8A7387 +:108170009827892F82959827792F76957695972736 +:10818000892F86959827AC2F8B2D96958795A79547 +:108190005795C42FD0E0C255DF4D032F10E0025594 +:1081A0001E4D7881E8019881792B022F10E002554D +:1081B0001D4DE8019881C72FC92BD0E0C259DF4D72 +:1081C00018811695732F7071942F917E9727722FB7 +:1081D00070729727752F747997277A2F737797275F +:1081E000782F7A739727792F72959727792F76951D +:1081F00076959727792F76957927922F272F269591 +:10820000979537954795C52ED12CE601C255DF4D80 +:108210006E01EA2EF12CE701C255DE4D7E01E6012A +:108220007881E7012881722BE82EF12CE701C255F5 +:10823000DD4D2881C72FC22BD0E0C259DF4D2881E8 +:10824000122B16957A2F7071252F217E2727782FD4 +:1082500070722727742F74792727732F7377272736 +:10826000792F7A732727722F72952727722F769589 +:1082700076952727722F76952727BA2F26958795EB +:10828000B7955795C42ED12CE601C255DF4D6E012E +:10829000E32EF12CE701C255DE4D7E01E601788127 +:1082A000E7012881722BE92EF12CE701C255DD4D43 +:1082B0002881C72FC22BD0E0C259DF4DA881A12B46 +:1082C000A695732F7071242F217E2727792F707226 +:1082D0002727752F747927277B2F73772727782FE8 +:1082E0007A732727722F72952727722F76957695A6 +:1082F0002727722F76957227232F372F369597953C +:1083000027954795C52FD0E0C255DF4D0B2F10E0C4 +:1083100002551E4D7881E8013881732B082F10E03B +:1083200002551D4DE8013881C72FC32BD0E0C2593B +:10833000DF4DD881AD2BA6957B2F7071352F317E07 +:108340003727782F70723727742F74793727722F59 +:1083500073773727792F7A733727732F72953727DB +:10836000732F769576953727732F76953727369521 +:108370008795B7955795C42FD0E0C255DF4D022F92 +:1083800010E002551E4D7881E8013881732B092FCA +:1083900010E002551D4DE8013881C72FC32BD0E0F6 +:1083A000C259DF4DD881AD2BA695722F7071342F35 +:1083B000317E7327392F30727327352F3479732725 +:1083C0003B2F33777327382F3A737327372F329524 +:1083D0007327372F369536957327372F36957327A2 +:1083E000342F7695979527953795C52FD0E0C255B0 +:1083F000DF4D0B2F10E002551E4D7881E8014881BA +:10840000742B082F10E002551D4DE8014881C72F3D +:10841000C42BD0E0C259DF4DD881DA2BD6957B2F03 +:108420007071452F417E7427482F40727427432F67 +:1084300044797427422F43777427492F4A7374274E +:10844000472F42957427A72FA695A6957A27472FE1 +:10845000469574274B2F7695879547955795C42F4A +:10846000B82EA32FB0E08D0102551F4D6801A22F39 +:10847000B0E08D0102551E4D7801D6010C91D70157 +:108480008C91082BE92EF12CD701A255BD4D8C9172 +:10849000082B10E002591F4DD8018C91D82BD6958E +:1084A000732F717E822F80717827892F80727827B1 +:1084B000852F84797827842F837778278B2D8A736B +:1084C0007827872F82957827A72FA695A6957A27B4 +:1084D000872F86957827432F322F272F269597951C +:1084E00037954795292F852F90E082559F4D0C2F6A +:1084F00010E002551E4DDC019C91D8018C91892B16 +:108500000B2D10E002551D4DD8019C91892B90E058 +:1085100082599F4DDC019C918D2F892B9081892759 +:10852000819313CE5093B22CC093B32CB092B42C41 +:108530004093B52C3093B62C2093B72CDF91CF917C +:108540001F910F91FF90EF90DF90CF90BF90089513 +:10855000EF92FF920F931F93CF93DF937091B22C02 +:108560005091B32C2091B42C4091B52C3091B62C65 +:10857000C091B72CE42FF0E0E255FF4DA32FB0E0FF +:10858000A255BE4DF081EC91EF2BAC2FB0E0A2557F +:10859000BD4DFC91EF2BF0E0E257FF4D1081DC0167 +:1085A000D0E0615008F4DBC11695D795952F9071F6 +:1085B000872F817E8927922F90728927942F947913 +:1085C0008927932F937789279C2F9A738927982F30 +:1085D00092958927E82FE695E6958E27982F969510 +:1085E00089278695279557957795D695932F9071DE +:1085F000842F817E89279C2F90728927972F9479C9 +:108600008927952F93778927922F9A738927982FF7 +:1086100092958927E82FE695E6958E27982F9695CF +:1086200089279C2F8695979537954795E72FF0E0FA +:10863000E255FF4D052F10E002551E4DC081F80197 +:108640008081C82B022F10E002551D4DF80180815A +:10865000EC2FE82BF0E0E259FF4D8081D82BD69526 +:10866000E52FE071872F817E8E27E22FE0728E2723 +:10867000E42FE4798E27E32FE3778E27E92FEA733F +:108680008E27E82FE2958E27E82FE695E6958E2730 +:10869000E82FE6958E278695279557957795E42FB1 +:1086A000F0E0E255FF4D032F10E002551E4DC08152 +:1086B000F8018081C82B092F10E002551D4DF801EB +:1086C0008081EC2FE82BF0E0E259FF4D8081D82B20 +:1086D000D695E32FE071842F817E8E27E92FE072FB +:1086E0008E27E72FE4798E27E52FE3778E27E22F79 +:1086F000EA738E27E82FE2958E27E82FE695E69518 +:108700008E27E82FE6958E2786959795379547957E +:10871000E72FF0E0E255FF4D052F10E002551E4D0A +:10872000C081F8018081C82B022F10E002551D4D39 +:10873000F8018081EC2FE82BF0E0E259FF4D8081B9 +:10874000D82BD695E52FE071872F817E8E27E22FDB +:10875000E0728E27E42FE4798E27E32FE3778E27CC +:10876000E92FEA738E27E82FE2958E27E82FE6950A +:10877000E6958E27E82FE6958E27869527955795BF +:108780007795E42FF0E0E255FF4D032F10E00255FE +:108790001E4DC081F8018081C82B092F10E00255C1 +:1087A0001D4DF8018081EC2FE82BF0E0E259FF4DE0 +:1087B0008081D82BD695E32FE071842F817E8E2780 +:1087C000E92FE0728E27E72FE4798E27E52FE377F4 +:1087D0008E27E22FEA738E27E82FE2958E27E82F67 +:1087E000E695E6958E27E82FE6958E278695979550 +:1087F00037954795E72FF0E0E255FF4D052F10E044 +:1088000002551E4DC081F8018081C82B022F10E057 +:1088100002551D4DF8018081EC2FE82BF0E0E25964 +:10882000FF4D8081D82BD695E52FE071872F817E73 +:108830008E27E22FE0728E27E42FE4798E27E32F34 +:10884000E3778E27E92FEA738E27E82FE2958E27AC +:10885000E82FE695E6958E27E82FE6958E278695F4 +:10886000279557957795E42FF0E0E255FF4D032FBC +:1088700010E002551E4DC081F8018081C82B092FE0 +:1088800010E002551D4DF8018081EC2FE82BF0E03F +:10889000E259FF4D8081D82BD695E72FF0E0E255C5 +:1088A000FF4D052F10E002551E4DC081F80180815B +:1088B000C82B022F10E002551D4DF8018081EC2FCE +:1088C000E82BF0E0E259FF4D8081D82BE42FE17EC8 +:1088D000832F8071E827892F8072E827872F84797A +:1088E000E827852F8377E827822F8A73E8278E2F42 +:1088F0008295E8278E2F86958695E8278E2F869578 +:10890000E827E695979537954795C92FE42FF0E02E +:10891000E255FF4D832F90E082559E4D1081FC0162 +:108920008081182B8C2F90E082559D4DFC01808119 +:10893000E12FE82BF0E0E257FF4D10818C91E82FFA +:10894000F0E0EE51FB4FE4917D01F0E8EF0EF11CF9 +:108950009E2F9127F70190838D278D9322CE7093C0 +:10896000B22C5093B32C2093B42C4093B52C30935D +:10897000B62CC093B72CDF91CF911F910F91FF9030 +:10898000EF9008950F931F93FC01862F4081518132 +:10899000628173818B0122273327803208F471C0F2 +:1089A000D80123E0B695A7952A95E1F70A271B275A +:1089B00098013695279536952795BBE0769567956E +:1089C00057954795BA95D1F70227132720E030E055 +:1089D00095E1000F111F221F331F9A95D1F7402BED +:1089E000512B622B732B8B0122273327D80133E0C5 +:1089F000B695A7953A95E1F70A271B279801369572 +:108A0000279536952795BBE07695679557954795B9 +:108A1000BA95D1F70227132720E030E095E1000F47 +:108A2000111F221F331F9A95D1F7402B512B622B18 +:108A3000732B8B0122273327D80133E0B695A795F6 +:108A40003A95E1F70A271B27980136952795369521 +:108A50002795BAE07695679557954795BA95D1F7DA +:108A60000227132720E030E096E1000F111F221F9C +:108A7000331F9A95D1F7402B512B622B732B8052C9 +:108A800089CF40835183028373831F910F9108958F +:108A9000AF92BF92CF92DF92EF92FF920F931F930C +:108AA000CF93DF936730710509F451C09B012770A4 +:108AB0003327232B09F04EC05B016C01EB0183E0EF +:108AC000D695C7958A95E1F77B0196E0F694E794F1 +:108AD0009A95E1F7EC0EFD1EEC0CFD1C8E01015089 +:108AE00011090C0D1D1DA701401B510B60E070E02A +:108AF000C80101960E944C560C151D0520F1D801A5 +:108B0000EC91F0E0EE51FB4F2491D701CD010A1713 +:108B10001B0768F4FC018081982F990F8E91881FA4 +:108B20008827881F892B11968C931197EFCF119668 +:108B30008C9111978E7FE22FE170E82B1196EC93C8 +:108B400001501109D9CFC5018C0F9D1F04C087E0CA +:108B500090E001C0CB01DF91CF911F910F91FF9069 +:108B6000EF90DF90CF90BF90AF900895CF93DF93B9 +:108B7000EC0182EC888361E070E0CE010E94BF3797 +:108B80008AE08093922D1092932D68E170E0CE01DF +:108B9000DF91CF917DCFEF92FF920F931F93CF93F1 +:108BA000DF93EC01CB0167307105E1F169E070E022 +:108BB0000E947C55DE0180E090E008E010E086171E +:108BC000970751F1FC0133E0F695E7953A95E1F707 +:108BD000E80FF91FAC0147705527EC0FFD1F2081EE +:108BE00030E0042E02C0359527950A94E2F72C93C5 +:108BF0004115510571F0E181F0E07801E41AF50AC0 +:108C0000A7017F0102C0EE0CFF1C4A95E2F72E2956 +:108C10002C9301961196D3CF23E0880F991F2A95A4 +:108C2000E1F702C087E090E0DF91CF911F910F91B3 +:108C3000FF90EF900895EF92FF920F931F93CF93C1 +:108C4000DF939C01CB016730710509F440C069E0F6 +:108C500070E00E947C5580E090E048E050E086178C +:108C60009707A9F1DC01E3E0B695A795EA95E1F74E +:108C7000A80FB91FEC01C770DD27A20FB31FEC913D +:108C8000F0E00C2E02C0F595E7950A94E2F72097E4 +:108C900059F011960C9111977A01EC1AFD0A01C056 +:108CA000000FEA94EAF7E02BF0E0EE51FB4FE4917D +:108CB0001196AC91B0E002C0B595A795CA95E2F7C0 +:108CC000ED01CE27FE01E0FD04C00196C8CF81E092 +:108CD00001C080E0DF91CF911F910F91FF90EF9045 +:108CE00008951092922D08951092922D1092B82C02 +:108CF0001092932D0895F8DF0E940E2C1092922D61 +:108D0000089508950895DC0123E633E66150E8F004 +:108D10004D91942F922780E1989FA001112449271B +:108D2000E42FF0E0232F332742954F70C9018427A9 +:108D3000AC013E2F22272427352743E0EE0FFF1FEB +:108D40004A95E1F72E273F27E1CFC9010895EF9219 +:108D5000FF921F93CF93DF93EC017B018091932DC2 +:108D6000882339F08091922D823008F0DBC0109278 +:108D7000932DE114F10461F0B701CE015CDF88238B +:108D800009F4D3C0B701CE0106DF7C0181E001C048 +:108D900082E01091922D163090F4133070F512305D +:108DA000A8F484E090E080931E2090931F2082E539 +:108DB000888382E08093922D87E090E0C7C01930CD +:108DC00008F467C01A3009F496C0ACC090E1E91607 +:108DD000F10411F480FD03C01092922D92C088819D +:108DE00099818093842D9093852D83E9888380E2F7 +:108DF000898383E08093922D6AC080FFEDCF88E263 +:108E0000E816F10448F32881898182279A8189270D +:108E10009B8189279C818913DFCFA12FB0E0139715 +:108E2000CD01880F991FA80FB91FA957B24D283837 +:108E300021F483E0FE01319602C084E0FE0101903E +:108E40000D928A95E1F745E050E0BE01CE01029611 +:108E50000E943B56133021F0143021F485E903C001 +:108E600083E901C087E9888380E7898367E070E050 +:108E7000CE010E94BF378091922D8D5F8093922DFD +:108E800068E470E0CE01DF91CF911F91FF90EF90E9 +:108E9000FFCD80FFA1CF98E1E916F10409F09CCF46 +:108EA00063E0CE0130DF009709F096CF288122FFE2 +:108EB00011C0183079F0163011F485E901C087E946 +:108EC000888380E289832EEF210F2093922D60E129 +:108ED00070E0D8CF21E02093932D212F30E0265051 +:108EE0003109322F330F230F2C5F2093912D2881CE +:108EF0002093862D2BC0982F927031F081E08093C3 +:108F0000922D0E94072C0EC080FF05C063E0CE01A9 +:108F1000FADE892B99F3CE01DF91CF911F91FF905B +:108F2000EF9024CE80E090E011C0A701495F5F4F31 +:108F300083E0569547958A95E1F7E091AE2EF09142 +:108F4000AF2EBE0181EC199580E023CFDF91CF9148 +:108F50001F91FF90EF9008959F92AF92BF92CF9292 +:108F6000DF92EF92FF920F931F93CF93DF93CDB7D2 +:108F7000DEB7C756D109CDBFDEBF8C017B01FB0137 +:108F800060817181E4DED090932DDD2009F445C12C +:108F90008091922D9AEF980F933008F057C0F80106 +:108FA00080818072C82E1092742D5DE4A52E51E14F +:108FB000B52E912C47E650E0B501CE0101960E94F6 +:108FC00004568B81882349F029813A818091842D30 +:108FD0009091852D28173907B9F48D81882329F0C0 +:108FE0009C818091862D98130FC08F89882311F062 +:108FF000CC2051F0E091742D81E08E0F8093742D80 +:10900000F0E0EB58F24D90829394F7E6AF0EB11C6E +:109010008FE09812CFCFC1100DC08091922D9AEFA2 +:10902000980F943008F0AEC02091742DE5E7FDE272 +:1090300080E08FC080EEF801808380E8818362E069 +:1090400070E0C8010E94BF3789E095C0893029F7D8 +:10905000F70160817181C801EEDDF70160817181E6 +:10906000811115C0CB01089667E070E00E947C5525 +:10907000462FE091AE2EF091AF2EB80181EC1995FC +:10908000C80174DDF70180839183D12CC9C0C80168 +:1090900082DDF70180839183F8016081262F30E023 +:1090A00043E0969587954A95E1F702972817390787 +:1090B00039F76E5FC80127DE892B11F7C12C97E6BF +:1090C000992E5801FFEFAF1ABF0A8091742DC81670 +:1090D00008F0A3CFEC2DF0E0EB58F24D6081969EA6 +:1090E000B0011124635B7E4E47E650E0CE0101964D +:1090F0000E9404568F89882349F14E8950E0F80177 +:10910000808190E001974817590741F02091742D14 +:10911000422F50E0415051093C2D08C0B501CE010D +:1091200006960E942556892B89F710C0832F90E060 +:10913000841795073CF4FC01EB58F24D8181808344 +:109140003F5FF4CF21502093742DCA94C394BDCFB8 +:109150008F5F821709F464C0919194509230C0F7E8 +:1091600082E0F801808380E6818362E070E0C801DC +:109170000E94BF378BE08093922D60E270E0C801BF +:1091800087DC80CF8B3009F04BC0F70160817181A3 +:109190006115710509F43EC0C8014DDDD82EF701F7 +:1091A00060817181811113C0CB01089667E070E086 +:1091B0000E947C55462FE091AE2EF091AF2EB80163 +:1091C00081EC19951092742DC801D0DC26C0C8011D +:1091D000E2DCF70180839183BC0183E0769567959B +:1091E0008A95E1F7C8018FDD892B19F01092742D53 +:1091F00047CFF8018581882331F0813059F480937D +:10920000742D85E004C081E08093742D84E0809308 +:10921000752D06C01092742D03C0F70180839183D1 +:109220008D2DC959DF4FCDBFDEBFDF91CF911F918B +:109230000F91FF90EF90DF90CF90BF90AF909F90F5 +:1092400008955F926F927F928F929F92AF92BF929A +:10925000CF92DF92EF92FF920F931F93CF93DF9302 +:10926000CDB7DEB7C254D240CDBFDEBF7C01CF5BED +:10927000DD4F68837983C154D2408091B82C84300B +:1092800009F48BC140F4823009F4D6C008F060C103 +:10929000813051F08CC4863009F41EC308F446C2F4 +:1092A000873009F4C8C383C40091942E1091952E81 +:1092B00001151105C1F0A801495F5F4F63E05695A4 +:1092C00047956A95E1F764E97DE2C7010E9432564D +:1092D0006091942E7091952EC701DADB1092942E36 +:1092E0001092952E21C2CF5BDD4F68817981C154E8 +:1092F000D2406115710509F4C7C0C7019CDCD82EA6 +:10930000CF5BDD4F68817981C154D240C70143DC16 +:10931000CF5BDD4F88839983C154D2409C01295F84 +:109320003F4FC901880F991F53E0969587955A952D +:10933000E1F706968138910578F064EB73E2CE018F +:1093400001960E945E561092B82CBE016F5F7F4F4F +:1093500085E60E94DE226BC4B3E036952795BA9568 +:10936000E1F7A70160E870E0CE0101960E94950E3A +:109370007C01CF5BDD4F8881C154D240CE5BDD4F95 +:109380009881C254D240CF5FDD4F9883C150D24004 +:10939000CE5FDD4F8883C250D24083EC93E29F932F +:1093A0008F9380E8A82EB12CC5018E199F099F9339 +:1093B0008F9381E090E08C0F9D1F8E0D9F1D9F93DA +:1093C0008F930E946556E80EF91EB5016E197F094C +:1093D00022E030E0AE014F5F5D4F81E090E08C0F06 +:1093E0009D1F8E0D9F1D0E94950E8E0D9F1D0F902F +:1093F0000F900F900F900F900F909501281B390B35 +:1094000041E050E04C0F5D1F840F951FD11003C049 +:1094100046EC53E202C045ED53E25F934F933F9316 +:109420002F939F938F930E9465560F900F900F90EC +:109430000F900F900F9087CF0091942E1091952E42 +:1094400001151105C1F0A801495F5F4FA3E05695D2 +:109450004795AA95E1F764E97DE2C7010E9432567B +:109460009091942E8091952E1092942E1092952E7C +:10947000092F182FDCC3CF5BDD4F28813981C15400 +:10948000D2402115310551F488E0E9E4F4E2DE012F +:10949000119601900D928A95E1F755CF295F3F4FC4 +:1094A000E3E036952795EA95E1F7A70160E870E0DB +:1094B000CE0101960E94950E7C01CF5BDD4F888125 +:1094C000C154D240CE5BDD4F9881C254D240CF5FB1 +:1094D000DD4F9883C150D240CE5FDD4F8883C250AC +:1094E000D24083EC93E29F938F93F0E8CF2ED12C60 +:1094F000C6018E199F099F938F9381E090E08C0F96 +:109500009D1F8E0D9F1D9F938F930E9465568E0DFC +:109510009F1DB601681B790B22E030E0AE014F5F62 +:109520005D4FA1E0B0E0AC0FBD1F8A0F9B1F0E94F2 +:10953000950E1092B82CBE016F5F7F4F85E60E949A +:10954000DE220F900F900F900F900F900F906FC32F +:10955000CF5BDD4F68817981C154D240C701F7DB11 +:109560002091932D222309F425C32091912D30E0E1 +:1095700047E85DE264E170E0CE0101960E94950E3D +:10958000BE016F5F7F4F85E60E94DE221092932D11 +:109590001092B82C0E9474230AC38091732D8111FC +:1095A00008C080E890E00E94C12381E08093732D81 +:1095B0007BC0813009F07AC08091922D823008F012 +:1095C00075C08091722D8F5F8093722D803109F06C +:1095D0006DC00E94CC238C019350409768F0011518 +:1095E000B8E01B0708F460C0E0E1F0E020E030E004 +:1095F000A12CB12C60E040C0AAEFBCE240E050E0FA +:1096000020E030E080E090E0E0E0F0E060E07D919C +:10961000703149F44732510509F405C361110EC098 +:10962000FA0161E00BC0662349F0BA016E1B7F0BA3 +:109630006817790710F09F01CB0160E04F5F5F4F23 +:109640004832510521F78430910508F03BC22CC007 +:10965000D601ED906D01F12CEE16FF06B0F461110C +:1096600019C04F5F5F4F4837510591F7009709F0D8 +:1096700029C2319709F426C27AEFC72E7CE2D72E91 +:1096800040E050E080E090E0E3CF6111EACF5A0182 +:1096900061E0E7CFBA016A197B096817790710F012 +:1096A0009501CB0160E0DDCF1092722DCF5BDD4FD5 +:1096B00068817981C154D240C70149DB2091932D43 +:1096C000222309F477C2E091B12EF091B22E0284E8 +:1096D000F385E02DE058F10954E0F695E7955A95A9 +:1096E000E1F7E650F34D80818F5F80838091722D8A +:1096F000803121F40E94CC231092722D1092922D71 +:109700000E94072C80E5F7018083118262E070E0FF +:10971000C7010E94BF3781E08093922D1092932D54 +:1097200060E270E0C701B4D98C0181C2CF5BDD4F2C +:1097300068817981C154D240C70109DB2091932D02 +:10974000222309F437C2D090F92CDD2009F445C05A +:10975000CF5BDD4F08811981C154D240011511053D +:1097600049F41092F92C1092932D1092922D0E9490 +:10977000072C5DC2023A110538F0B801C7015BDA67 +:1097800001E08027082F02C001E010E0CF5BDD4F31 +:1097900068817981C154D240C701FDD9CF5BDD4FCB +:1097A00088839983C154D24000FD05C062E1C7019E +:1097B000AADA892B29F0ACEFAD0DA093F92C2AC0C1 +:1097C000F4E0DF9ED0011124A755B34D80E1F701ED +:1097D00001900D928A95E1F71DC042E050E062E8E9 +:1097E00072E1CE0101960E940456E5E8F2E1E491AF +:1097F0002091842D3091852D89819A8128173907F0 +:1098000021F48091862DE81729F01092922D0E9464 +:10981000072CCDC18091F92C803109F04DC01092F8 +:10982000932D1092F92C1092B82C20E130E049EBE6 +:109830005CE267E870E0CE0101960E94950E63EC51 +:1098400073E2CE0181960E945E5620E130E049EC41 +:109850005CE265E670E0CE0183960E94950E63ECB3 +:1098600073E2CE018D5B9F4F0E945E5620E130E097 +:1098700049ED5CE263E470E0CE018B5B9F4F0E9498 +:10988000950E63EC73E2CE018B599F4F0E945E569A +:1098900020E130E049EE5CE261E270E0CE018959FE +:1098A0009F4F0E94950E0E947423BE016F5F7F4FF1 +:1098B00085E60E94DE227BC190E3D7019C9311963E +:1098C0008C9362E070E0C7010E94BF378091F92C51 +:1098D0008C5F8093F92C24CFBE016F5B7D4FC70155 +:1098E0003BDB882309F4E7C08091742D811103C00C +:1098F0006BEE73E227C08130A1F0912C80E090E004 +:1099000000E010E027E6822E7E01BFEFEB1ABDEFEC +:10991000FB0A3EEFC32E33E2D32EA12C42E0B42E3D +:1099200040C06091752DE7E66E9FB00111246C5820 +:109930007E4E40E450E0CE0101960E940456BE01E6 +:109940006F5F7F4F85E60E94DE2255C00130F2E056 +:109950001F0760F5E92DF0E0EB58F24D6081869E1F +:10996000B00111246C587E4E40E450E0C7010E94C3 +:109970000456FF92EF92DF92CF92C501801B910BAC +:109980009F938F9381E090E08C0F9D1F800F911F1C +:109990009F938F930E946556080F191F9394CDBF14 +:1099A000DEBF2091742D921688F204C0081B190B9B +:1099B000F12C06C0013032E01307C0F7FF24F39406 +:1099C000EDEFFFEFEC0FFD1FE00FF11F8EE2808344 +:1099D000EEEFFFEFEC0FFD1FE00FF11F1082BE0155 +:1099E0006F5F7F4F85E60E94DE22F11004C088EE93 +:1099F00090E10E942D1981EE90E10E942D1962E004 +:109A000070E084E89DE20E94FC228BED90E10E94D0 +:109A10002D196091912D70E087E89DE20E94FC2253 +:109A200085ED90E10E942D1961E070E086E89DE2ED +:109A30000E94FC2237C0BE016F5B7D4FC7018CDAEC +:109A40008823C9F18091742D813039F58091752D6D +:109A5000833009F4BDC028F4813059F0823099F088 +:109A6000DFC08A3031F008F4DBC08D50823058F00E +:109A7000D7C08091912D843009F4ACC0873009F0B3 +:109A8000CFC015E0AAC08091912D843009F4A4C004 +:109A9000873009F0C5C017E0A0C065E074E285E634 +:109AA0000E94DE221092B82C1092742D0E94742312 +:109AB0001092932D7CC0CF5BDD4F08811981C1547A +:109AC000D240B5C01092732D009709F475C09695D9 +:109AD0008795285F3F4F820F931F54E0880F991F8F +:109AE0005A95E1F70E94C123E091B12EF091B22E78 +:109AF00062857385CF01865A9E428F5F9F4F0E9479 +:109B0000DC5C60E070E085E60E94DE220115184012 +:109B100008F455C0B8E7AB2EB12C0AEF1CE260E8A0 +:109B2000E62EF12C71EE672E73E2772EEAE05E2EC0 +:109B3000FE0131966F01F7EE8F2EF3E29F2EFF921A +:109B4000EF927F926F921F925F92DF92CF920E946C +:109B50006556C6010E942819D8018C91CDBFDEBF81 +:109B6000882389F11F928F939F928F921F925F9209 +:109B7000DF92CF920E946556C6010E942819CDBF80 +:109B8000DEBF8AE491E10E942D19D8011D928D015A +:109B9000B0E1EB0EF11CC8018A5F9C428A159B055F +:109BA00070F21092932D1092B82C0E940E2C00E0AF +:109BB00010E03DC08C013BC00E94DC2395CFA8E2A1 +:109BC000AA2EB12CAACF6DE283E090E21FD6D9CFA6 +:109BD00011E003C014E001C016E06BE274E285E618 +:109BE0000E94DE22812F0E94F80DE0919E2EF091BE +:109BF0009F2E1995E091A82EF091A92E87E89DE25D +:109C00001995E091AE2EF091AF2E4091AC2E67E801 +:109C10007DE283E119950E948B100E940D1742CFBF +:109C200066E374E23CCF662309F40DCDFECCC80197 +:109C3000CE5BDD4FCDBFDEBFDF91CF911F910F9186 +:109C4000FF90EF90DF90CF90BF90AF909F908F905C +:109C50007F906F905F9008950F931F93CF93DF9342 +:109C6000CDB7DEB7EA97CDBFDEBF08E112E395D2EC +:109C7000F80181938F01F2E300321F07C1F70E94C0 +:109C8000DD1906D3882309F4FAC080911832909127 +:109C90001932953009F46FC030F4913069F168F0F1 +:109CA000933051F1ECC0983009F4C2C0993009F4F6 +:109CB000C8C0963009F0E3C072C0803891F0823895 +:109CC00009F0DDC080911C328F7087D2E091223282 +:109CD000F0912332118112FB112710F980E07DD21F +:109CE00006C0109114328091153281111260EAD2AF +:109CF000812F63D280E0A1C0282F2D7F09F0BFC043 +:109D0000882319F0823061F0BAC080911A32813014 +:109D100009F0B5C0933009F080E08093153227C078 +:109D200080911A32811123C0E0911C321E2F1F70C6 +:109D300009F4A5C0812F51D280911932833011F4DA +:109D4000EDD215C0E0912232F091233281818B7FD8 +:109D5000818324E8129FF0011124EA59FD4C1082FE +:109D6000E0912232F091233280818E7F808380E0E7 +:109D700034D2A8D264C0811182C010911A321F77E8 +:109D8000A1D28FD35FD28823E9F31093C3041111BA +:109D900002C082E001C083E08093173270C0805817 +:109DA000823008F06CC080911A3290911B328C3D49 +:109DB000E3E09E0761F583E08A838AE389834FB7F6 +:109DC000F894DE01139620E038E052E05093CA0187 +:109DD000E32FF0E0E4911092CA0120FF03C0E29566 +:109DE000EF703F5FEF708E2F90E0EA3010F0C79673 +:109DF00001C0C0968D939D932F5F2C3139F74FBFD3 +:109E000061D26AE370E0CE010196A5D00FC0AE0129 +:109E10004F5F5F4F60911C320E94090D8C01892BAE +:109E200071F150D2B80189819A8111D1A7D127C08F +:109E3000803829F547D280911332BFD186D131D3F2 +:109E40001EC081111CC080911A3290911B3299273B +:109E50000297ACF437D280911A328093133221D317 +:109E600080911332811106C08091C304811102C018 +:109E700081E001C084E0809317320E94D91908D292 +:109E8000882311F01FD24AD2EA96CDBFDEBFDF9100 +:109E9000CF911F910F9108950895CF93809117321C +:109EA000882351F0C091243280E097D1F1D1811103 +:109EB000D3DE8C2FCF9191C1CF910895CF92DF92B5 +:109EC000EF92FF920F931F93CF93DF93EC018B01DF +:109ED0007A01FDD2811136C0E114F10439F0F701A5 +:109EE00080819181081B190BC80FD91FC12CD12C5F +:109EF0000115110531F18091203290912132FC0140 +:109F0000EF5BFF4F208131978081281790F01DD1A2 +:109F1000C4DFE114F10449F0F70180819181C80E9A +:109F2000D91EC082D18285E00DC0D1D2882301F331 +:109F300009C0899142D101501109FFEFCF1ADF0A00 +:109F4000D7CF80E0DF91CF911F910F91FF90EF90DD +:109F5000DF90CF900895DF92EF92FF920F931F93BF +:109F6000CF93DF93D82FC92F8B0180912432806843 +:109F700034D180911E3290911F328017910728F0C2 +:109F80000115110519F4E1D001C08C01ED2EFC2E54 +:109F9000D12C0115110509F440C0809117328111AF +:109FA00002C082E04CC0853011F483E048C070D11B +:109FB000882311F081E043C051D181113CC042D1CE +:109FC000882339F3209124328091203290912132DC +:109FD000FC0127FF05C0EF5BFF4FC081D0E013C03D +:109FE000E05CFF4FC08131968081D0E0C81BD10971 +:109FF0000AC0C830D10550F4F70181917F01DDD04E +:10A000000150110921960115110599F7DD24D3940A +:10A01000289709F0D12C99D0BCCFD110BECF0BC05E +:10A0200080911732882309F4BCCF853009F4BDCF65 +:10A030002FD18111BFCF12D1882391F380E0DF911E +:10A04000CF911F910F91FF90EF90DF900895DF92D5 +:10A05000EF92FF920F931F93CF93DF93D82FC92FC7 +:10A060008B01809124328068B8D080911E3290910B +:10A070001F328017910728F00115110519F465D0DA +:10A0800001C08C01ED2EFC2ED12C0115110509F417 +:10A0900042C080911732811102C082E04EC08530EB +:10A0A00011F483E04AC0F4D0882311F081E045C068 +:10A0B000D5D081113EC0C6D0882339F320912432F7 +:10A0C0008091203290912132FC0127FF05C0EF5B87 +:10A0D000FF4FC081D0E015C0E05CFF4FC0813196DA +:10A0E0008081D0E0C81BD1090CC0C830D10560F414 +:10A0F000F701849162D0FFEFEF1AFF0A01501109B6 +:10A1000021960115110589F7DD24D394289709F0CC +:10A11000D12C1BD0BACFD110BCCF0BC0809117323D +:10A12000882309F4BACF853009F4BBCFB1D08111AF +:10A13000BDCF94D0882391F380E0DF91CF911F9120 +:10A140000F91FF90EF90DF900895E0912232F0910F +:10A150002332A0912032B0912132AF5BBF4F8C915E +:10A1600090E08283938380818D798083E091203297 +:10A17000F0912132EF5BFF4F10820895E09122327F +:10A18000F091233280818D798083E0912032F091AB +:10A190002132EF5BFF4F1082089580912032909121 +:10A1A0002132FC01EF5BFF4F208131E0320F308321 +:10A1B000FC01E20FF11D8081089520912032309141 +:10A1C0002132F901EF5BFF4F908141E0490F40835D +:10A1D000F901E90FF11D8083089580932432482FFF +:10A1E0004F7050E06091C6047091C7049A0194E0EA +:10A1F000220F331F9A95E1F7E4E887FF11C0E49F2F +:10A20000C001E59F900D112489599D4C8093203207 +:10A2100090932132C90108969B01280F391F0DC068 +:10A22000E49FC001E59F900D11248B5D9D4C8093B0 +:10A23000203290932132260F371F20932232309301 +:10A2400023320895809124328068C7DFE091223262 +:10A25000F091233280818695817008958091243217 +:10A260008F77BBDFA0912232B09123328C9185FF92 +:10A270000DC0E0912032F091213212968D919C9187 +:10A280001397E05CFF4F808381E0089580E008959C +:10A29000809124328F77A1DFA0912232B0912332B6 +:10A2A0008C9184FF0DC0E0912032F0912132129602 +:10A2B0008D919C911397E05CFF4F808381E008951E +:10A2C00080E00895809124328F7787DFE0912232F9 +:10A2D000F091233280818D788083E0912232F09159 +:10A2E0002332808181608083E0912032F09121329D +:10A2F000EF5BFF4F10828091243280686EDFE09127 +:10A300002232F0912332808181608083E09120327B +:10A31000F0912132EF5BFF4F10820895E0912232DD +:10A32000F0912332818184608183E0912232F09127 +:10A3300023328181807C803459F48091243280588A +:10A340004CDFE0912232F09123328181846081835D +:10A3500008951F93CF93DF93C82F162FD42F3DDF7F +:10A36000E0912232F09123321182E0912232F09179 +:10A3700023328C2F881F8827881F880F8083E091C5 +:10A380002232F09123321183E0912232F091233274 +:10A39000128213822091203230912132248335831E +:10A3A000CC0FCC0BCD23F901E05CFF4FC08331967D +:10A3B000108281E0DF91CF911F910895CF92DF92BB +:10A3C000EF92FF920F931F93CF93DF93C62E8C01D2 +:10A3D000D12CDC1409F43FC0F801D081D11104C0A4 +:10A3E000D3940B5F1F4FF5CFF801E180F28093818A +:10A3F0008481823010F488E001C088E128E030E0F8 +:10A40000C0E02E153F0520F4CF5F220F331FF9CF98 +:10A41000C82B8D2F8F70863010F080E01DC0CF7E4E +:10A42000F1E4EF16F104C8F7992321F0913021F4FB +:10A43000C06C0AC0C06403C0C068911105C04E2D35 +:10A440006C2F80E88D0F85DF4E2D6C2F8D2F81DFD7 +:10A450008111C6CFE2CF81E0DF91CF911F910F91A3 +:10A46000FF90EF90DF90CF90089580E090E0E09132 +:10A47000C604F091C7049C0144E0220F331F4A95A3 +:10A48000E1F7E20FF31F11864091C6045091C70413 +:10A49000FA01E20FF31F118201968630910539F718 +:10A4A00008958091183287FF0DC0D8DE811105C054 +:10A4B000809117328111F9CF09C060CE8091173297 +:10A4C000882321F0BFDE8823C9F33FCE08950F9380 +:10A4D0001F93CF93E091C604F091C704E05AFF4F59 +:10A4E00000811181C4E68091243287FF0AC0AADE70 +:10A4F000811105C080911732811105C022C080E012 +:10A5000025C0ACDEF5CF8530F1F0E0912232F0913C +:10A510002332818182FD19C0E091C604F091C70405 +:10A52000E05AFF4F808191810817190711F48C01BF +:10A53000DACF2FEF2C0FCC2311F0C22FF8CF84E00D +:10A5400005C082E003C083E001C081E0CF911F918C +:10A550000F91089563D069D0E0ECF4E081818E7FA3 +:10A56000818380818F778083109216320895CF93F4 +:10A57000DF93E0E4F0E014828481836084834ED032 +:10A5800054D0C0ECD4E088818F778883888180683C +:10A590008883109217321092133210921532109253 +:10A5A000143288818064888348E068E480E8D1DEE2 +:10A5B00048E068E480E0CDDE888580648887898112 +:10A5C00081608983DF91CF910895CF93DF933FB767 +:10A5D000F894C0ECD1E022E02A87EAE1F0E0E491CF +:10A5E000A0ECB4E0DA96EC93DA97EBE1F0E0E491DA +:10A5F000DB96EC93DB971A868EE395E38E7F1696B7 +:10A600008D939C93179785E18C9318962C933FBF5D +:10A6100081E080931632DF91CF91A9CFE0ECF4E096 +:10A6200080858370808711860895E0ECF4E08FEFD9 +:10A630008287848708951F920F920FB60F9211247C +:10A6400008B60F9218BE09B60F9219BE0BB60F923C +:10A650001BBE2F933F934F935F936F937F938F9383 +:10A660009F93AF93BF93EF93FF938091CA0487FFAB +:10A6700008C08091C80487FF04C080E88093CA04A2 +:10A680000BDC8091CA0486FF07C080E48093CA0473 +:10A69000109217320E94C8198091CA0485FF14C015 +:10A6A00080E28093CA0480911332882311F084E001 +:10A6B00007C08091C304811102C081E001C083E022 +:10A6C000809317320E94B7198091CA0484FF14C086 +:10A6D00080E18093CA0482E0809317321092133293 +:10A6E0001092C304C2DE48E068E480E832DE48E04D +:10A6F00068E480E02EDED0DBFF91EF91BF91AF9157 +:10A700009F918F917F916F915F914F913F912F9189 +:10A710000F900BBE0F9009BE0F9008BE0F900FBE9A +:10A720000F901F901895CF93DF93EC01FC0170966A +:10A730008BE0DF011D928A95E9F782E08C8389879F +:10A7400083E08E8761E0CE01019638DE882361F0D8 +:10A7500061E0CE01069632DE882331F061E0CE0161 +:10A760000B96DF91CF912ACE80E0DF91CF910895B3 +:10A770000F931F93CF93DF93209117322430E1F48E +:10A78000FC010489158926893789012B022B032BAB +:10A7900099F0EB01818121DDFE0101900020E9F7B4 +:10A7A0003197BF016C1B7D0B40E050E0CE01DF9183 +:10A7B000CF911F910F9182CB82E0DF91CF911F91BA +:10A7C0000F9108950F931F93CF93DF93209117322A +:10A7D0002430B1F4FC010489158926893789012BBD +:10A7E000022B032B69F08A01EB018181F6DC40E04A +:10A7F00050E0B801CE01DF91CF911F910F915ECB58 +:10A8000082E0DF91CF911F910F9108950F931F93D5 +:10A81000CF9320911732243009F5FC010489158962 +:10A8200026893789012B022B032BC1F0C62F81818A +:10A83000D4DC8091203290912132FC01EF5BFF4FFC +:10A84000208131978081281720F48C2FB6DC80E09E +:10A8500006C07BDC3CDE8823C1F301C082E0CF91DF +:10A860001F910F910895CF93DF93209117322430D9 +:10A8700091F5FC014489558966897789452B462BDA +:10A88000472B49F18181A9DC80912432209120322B +:10A8900030912132F90187FF05C0EF5BFF4F8081C6 +:10A8A00090E008C0E05CFF4F80813196408190E0ED +:10A8B000841B9109892B69F0F901EF5BFF4FD0816F +:10A8C0003197C08142DCDC1720F001DE811104C029 +:10A8D0003CDC80E001C082E0DF91CF910895CF930E +:10A8E000DF9320911732243099F4FC014489558973 +:10A8F00066897789452B462B472B51F0EC018181E6 +:10A900006CDCA0DC882321F0CE01DF91CF91ABCFAE +:10A91000DF91CF910895CF93DF93209117322430A8 +:10A9200019F08FEF9FEF46C0FC0144895589668975 +:10A930007789452B462B472BA1F386814EDC8EDC95 +:10A94000882379F380912432209120323091213272 +:10A95000F90187FF05C0EF5BFF4F808190E008C0E1 +:10A96000E05CFF4F80813196208190E0821B91094D +:10A97000892B21F012DCC82FD0E002C0CFEFDFEF2F +:10A98000209124328091203290912132FC0127FFC6 +:10A9900005C0EF5BFF4F208130E008C0E05CFF4F57 +:10A9A00020813196808130E0281B3109232B09F466 +:10A9B000E5DBCE01DF91CF9108950895FF920F93CB +:10A9C0001F93CF93DF93EC0163DC882309F48EC0DF +:10A9D000888190E020911C3230911D322817390770 +:10A9E00009F084C080911932813259F018F4803214 +:10A9F00049F17CC0823209F457C0833209F467C040 +:10AA000075C080911832813A09F070C05BDC1ADCA5 +:10AA10008823E9F38C89FD880E891F89CEDB8F2D71 +:10AA2000CCDB802FCADB812FC8DB888DC6DB898D0C +:10AA3000C4DB8A8DC2DB89DBDF91CF911F910F913F +:10AA4000FF902FCD80911832813209F04FC03ADC4F +:10AA500005DC811105C0809117328111F9CF46C004 +:10AA60009CDBF82E9ADB182F98DB082F96DB402F03 +:10AA700050E060E070E0BA0155274427782B4F2959 +:10AA8000512B4C8B5D8B6E8B7F8B87DB888F85DBAF +:10AA9000898F83DB8A8F72DB04DDCE01DF91CF915A +:10AAA0001F910F91FF9089CF809118328132F1F47C +:10AAB00009DCF7DC80911A3290911B32888B998BDC +:10AAC000CE01DF91CF911F910F91FF9076CF8091B2 +:10AAD0001832813259F4F6DBE4DC60911A32CE018F +:10AAE000DF91CF911F910F91FF9067CFDF91CF91B1 +:10AAF0001F910F91FF900895AA1BBB1B51E107C046 +:10AB0000AA1FBB1FA617B70710F0A61BB70B881FFD +:10AB1000991F5A95A9F780959095BC01CD0108958C +:10AB2000B7FF04C003D0821B930B089509D0A59FE3 +:10AB3000900DB49F900DA49F800D911D1124089538 +:10AB4000A29FB001B39FC001A39F700D811D11246E +:10AB5000911DB29F700D811D1124911D08958F923A +:10AB60009F92AF92BF92CF92DF92EF92FF92CF93DC +:10AB7000DF93EC01688179818A819B816115710580 +:10AB80008105910521F464E279ED8BE597E02DE1F3 +:10AB900033EF41E050E037D749015A019B01AC0146 +:10ABA000A7EAB1E4C3DF6B017C01ACEEB4EFA50111 +:10ABB0009401B8DFDC01CB018C0D9D1DAE1DBF1DC6 +:10ABC000B7FF03C00197A109B04888839983AA837E +:10ABD000BB839F77DF91CF91FF90EF90DF90CF9075 +:10ABE000BF90AF909F908F900895B9CF80E290E290 +:10ABF000B6CFA0E0B0E08093202090932120A093D6 +:10AC00002220B09323200895FB01DC0102C00590AF +:10AC10000D9241505040D8F70895FB01DC018D9111 +:10AC2000059080190110D9F3990B0895FB01DC01FF +:10AC30004150504048F005900D920020C9F701C0E6 +:10AC40001D9241505040E0F70895FB01DC0104C023 +:10AC50008D910190801921F441505040C8F7881B14 +:10AC6000990B0895FB01DC0102C001900D92415047 +:10AC70005040D8F708956817790768F4FB01DC01A4 +:10AC8000E40FF51FA40FB51F02C002900E924150B1 +:10AC90005040D8F70895E6CFDC0101C06D934150D4 +:10ACA0005040E0F70895FC018191861721F0882338 +:10ACB000D9F7992708953197CF010895FB01DC0159 +:10ACC00001900D920020E1F708950F931F93CF9309 +:10ACD000DF93CDB7DEB72E97CDBFDEBF0E891F89BC +:10ACE000888D998D26E02C8309831A8397FF02C0F3 +:10ACF00080E090E801978D839E83AE01445E5F4FB4 +:10AD00006A8D7B8DCE01019667D04D815E8157FDA6 +:10AD10000AC02F813885421753070CF49A01F801B5 +:10AD2000E20FF31F10822E96CDBFDEBFDF91CF91D1 +:10AD30001F910F9108950F931F93CF93DF93CDB77A +:10AD4000DEB72E97CDBFDEBF0E891F89888D998D06 +:10AD50002EE02C8309831A8397FF02C080E090E8DD +:10AD600001978D839E83AE01445E5F4F6A8D7B8D1C +:10AD7000CE01019631D04D815E8157FD0AC02F81F1 +:10AD80003885421753070CF49A01F801E20FF31FBC +:10AD900010822E96CDBFDEBFDF91CF911F910F9114 +:10ADA0000895CF93DF93CDB7DEB72E97CDBFDEBF2B +:10ADB0008DE08C838C899D8989839A83AE01485E5E +:10ADC0005F4F6E897F89CE010196A9D32E96CDBFA4 +:10ADD000DEBFDF91CF9108952F923F924F925F9205 +:10ADE0006F927F928F929F92AF92BF92CF92DF929B +:10ADF000EF92FF920F931F93CF93DF93CDB7DEB700 +:10AE00002B97CDBFDEBF6C017B018A01FC0116824E +:10AE10001782838181FFBFC1CE0101963C01F601FB +:10AE20009381F70193FD859193FF81917F018823A1 +:10AE300009F4ADC1853239F493FD859193FF819179 +:10AE40007F01853221F4B60190E0E7D4E8CF912C60 +:10AE5000212C312CFFE1F315D8F08B3279F038F446 +:10AE6000803279F08332A1F4232D20611DC08D3210 +:10AE700061F0803369F4232D216016C0832D826038 +:10AE8000382EE32DE4603E2E2AC0F32DF8601DC05D +:10AE900037FC2DC020ED280F2A3040F08E32B9F457 +:10AEA00036FC75C1232D2064322E19C036FE06C033 +:10AEB0008AE0989E200D1124922E11C0EAE02E9E69 +:10AEC000200D1124222EF32DF0623F2E08C08C3667 +:10AED00021F4832D8068382E02C0883641F4F701B2 +:10AEE00093FD859193FF81917F018111B3CF982FBD +:10AEF0009F7D9554933028F40C5F1F4F9FE39983F7 +:10AF00000DC0833631F0833771F0833509F055C0B9 +:10AF100020C0F801808189830E5F1F4F88248394AD +:10AF2000912C530112C02801F2E04F0E511CF80180 +:10AF3000A080B18036FE03C0692D70E002C06FEFC3 +:10AF40007FEFC50121D44C018201F32DFF773F2E05 +:10AF500015C0280122E0420E511CF801A080B180EA +:10AF600036FE03C0692D70E002C06FEF7FEFC501B0 +:10AF700000D44C01F32DF0683F2E820133FC19C040 +:10AF8000822D90E088169906A0F4B60180E290E048 +:10AF900044D42A94F5CFF50137FC859137FE819191 +:10AFA0005F01B60190E039D421102A9421E0821A81 +:10AFB00091088114910479F7E1C0843611F0893643 +:10AFC00039F5F80137FE07C0608171818281938174 +:10AFD0000C5F1F4F08C060817181072E000C880B29 +:10AFE000990B0E5F1F4FF32DFF763F2E97FF09C081 +:10AFF00090958095709561957F4F8F4F9F4FF0682A +:10B000003F2E2AE030E0A3015DD4882E861844C08C +:10B01000853731F4232D2F7EB22E2AE030E025C073 +:10B02000932D997FB92E8F36C1F018F4883579F0B9 +:10B03000AEC0803719F0883721F0A9C0E92FE06150 +:10B04000BE2EB4FE0DC0FB2DF460BF2E09C034FE31 +:10B050000AC0292F2660B22E06C028E030E005C0C5 +:10B0600020E130E002C020E132E0F801B7FE07C085 +:10B0700060817181828193810C5F1F4F06C0608166 +:10B08000718180E090E00E5F1F4FA3011BD4882EDA +:10B090008618FB2DFF773F2E36FE0DC0232D2E7F09 +:10B0A000A22E891458F434FE0BC032FC09C0832D43 +:10B0B0008E7EA82E05C0B82CA32C03C0B82C01C0CE +:10B0C000B92CA4FE0FC0FE01E80DF11D8081803374 +:10B0D00021F49A2D997EA92E09C0A2FE06C0B39430 +:10B0E000B39404C08A2D867809F0B394A3FC10C0F1 +:10B0F000A0FE06C0B21480F4280C922C9B180DC040 +:10B10000B21458F4B60180E290E087D3B394F8CF3C +:10B11000B21418F42B1802C0982C212CA4FE0FC0D6 +:10B12000B60180E390E079D3A2FE16C0A1FC03C073 +:10B1300088E790E002C088E590E0B6010CC08A2D57 +:10B14000867851F0A1FE02C08BE201C080E2A7FC2C +:10B150008DE2B60190E061D3891430F4B60180E34A +:10B1600090E05BD39A94F8CF8A94F301E80DF11D37 +:10B170008081B60190E051D38110F6CF222009F4EE +:10B180004ECEB60180E290E048D32A94F7CFF60184 +:10B190008681978102C08FEF9FEF2B96CDBFDEBFD8 +:10B1A000DF91CF911F910F91FF90EF90DF90CF90A3 +:10B1B000BF90AF909F908F907F906F905F904F90D7 +:10B1C0003F902F90089520FD09C0FC0123FD05C08C +:10B1D00022FF02C07383628351834083089544FD3C +:10B1E00017C046FD17C0AB01BC01DA01FB01AA0F75 +:10B1F000BB1FEE1FFF1F1094D1F74A0F5B1F6E1F7E +:10B200007F1FCB01BA01660F771F881F991F09C0E6 +:10B2100033E001C034E0660F771F881F991F31505B +:10B22000D1F7620F711D811D911D08950F931F931A +:10B23000CF93DF938C01C801B2D2EC0197FD06C019 +:10B2400085D2892BC1F7B801CE0123D3CE01DF917E +:10B25000CF911F910F9108958F929F92AF92BF92BD +:10B26000EF92FF920F931F93CF93DF938C01D62F12 +:10B270007A01B22E94D29C0133272B32310531F062 +:10B280002D32310559F48B2D8068B82ED15011F430 +:10B2900080E061C0C80183D297FDFACFCB2DCD7F6E +:10B2A0002B2D2073F9F48033E9F4AA24AA94AD0E6F +:10B2B00009F43EC0C80173D297FD3AC09C012F7DAE +:10B2C00033272835310541F4C264D25089F1C801D1 +:10B2D00066D297FF07C02CC0B6FE02C0C26001C094 +:10B2E000C261DA2D812C912C540120ED280F2830D9 +:10B2F00078F0C4FF03C0B801CCD217C02A3040F0A8 +:10B30000C6FFF9CF2F7D3FEE320F3630A0F7275022 +:10B310004C2FC501B40163DF4B015C01C260D15009 +:10B3200051F0C8013CD297FFE0CFC1FD04C0B0CFBF +:10B33000812C912C5401C7FF08C0B094A094909424 +:10B340008094811C911CA11CB11C2C2FB501A4015F +:10B35000C70139DF81E0DF91CF911F910F91FF90FD +:10B36000EF90BF90AF909F908F9008955F926F92F3 +:10B370007F928F929F92AF92BF92CF92DF92EF9285 +:10B38000FF920F931F93CF93DF93CDB7DEB7A097B4 +:10B39000CDBFDEBF5C01962E7A01F9018E010F5FF1 +:10B3A0001F4F680180E2D8011D928A95E9F7D50107 +:10B3B00013968C9080E090E0612C712C30E061E07D +:10B3C00070E083FC259183FE21918F01522E211183 +:10B3D00003C080E090E090C02E3511F4009751F149 +:10B3E000432F50E0481759073CF42D3559F12D32C1 +:10B3F00019F4772009F103C0772009F468C0452DBE +:10B40000469546954695D601A40FB11D452D47702A +:10B410008B0102C0000F111F4A95E2F7A8015C9151 +:10B42000452B4C93651459F0561410F45394E7CF00 +:10B430005A94E5CF31E004C07724739401C0712C95 +:10B440000196BFCF772019F08E8180628E833111F3 +:10B4500003C08824839417C0F6019E012F5D3F4FDF +:10B460008081809581932E173F07D1F7F2CFE114A9 +:10B47000F10429F0D7018C93F70131967F019A945A +:10B48000812C9920E9F0C5018AD197FD17C0FC01F4 +:10B49000FF2723E0F595E7952A95E1F7EC0DFD1DD3 +:10B4A000208130E0AC014770552702C035952795C3 +:10B4B0004A95E2F720FDDBCFB501EBD1811089CFB2 +:10B4C000E114F10411F0D7011C92C80115C0422FFC +:10B4D000469546954695D601A40FB11D422F47705B +:10B4E0008B0102C0000F111F4A95E2F7A8015C9181 +:10B4F000452B4C93622EA4CFA096CDBFDEBFDF912B +:10B50000CF911F910F91FF90EF90DF90CF90BF9060 +:10B51000AF909F908F907F906F905F9008955F9213 +:10B520006F927F928F929F92AF92BF92CF92DF9253 +:10B53000EF92FF920F931F93CF93DF936C01EB0178 +:10B540005A01FC0116821782512CF601E380FE019C +:10B55000E3FC8591E3FE8191182FEF01882309F424 +:10B56000E0C090E0F3D0892B19F0C6015FDEEDCF8B +:10B57000153241F4FE01E3FC1591E3FE1191EF0158 +:10B58000153271F4C6010BD197FDC9C0412F50E0AF +:10B590009C01332724173507C1F2B6017AD1C1C007 +:10B5A0001A3239F4E3FC1591E3FE1191EF0101E049 +:10B5B00001C000E0F12C20ED210F2A3078F4026068 +:10B5C0006F2D70E080E090E040E209DEF62EFE0193 +:10B5D000E3FC1591E3FE1191EF01EDCF01FF03C0F4 +:10B5E000F11003C09EC0FF24FA94183619F01C36DF +:10B5F00051F010C0FE01E3FC1591E3FE1191EF0143 +:10B60000183641F408600460FE01E3FC1591E3FE86 +:10B610001191EF01112309F484C0612F70E08CEFC8 +:10B6200091E09CD0892B09F47CC000FD07C0F50196 +:10B6300080809180C50102965C0102C0812C912C12 +:10B640001E3649F4F6014681578160E070E0202FF4 +:10B65000C401B9DD7ACF1336A1F401FD02C0FF2485 +:10B66000F394C6019CD097FD5AC08114910429F02F +:10B67000F4018083C40101964C01FA94F110F1CFDA +:10B680004AC01B3551F49E01A4016F2DC6016EDE28 +:10B69000EC01892B09F03FC039C0C601C7DD97FD19 +:10B6A0003EC01F3649F128F4143621F1193639F11C +:10B6B00025C0133771F01537E9F020C081149104CB +:10B6C00029F0F4016082C40101964C01FA94FF2034 +:10B6D00059F0C60164D03C0197FD06C037D0892BD4 +:10B6E00069F3B601C301D5D081149104A1F0F4012E +:10B6F000108211C0006203C0006101C00064202FED +:10B70000A4016F2DC601A8DD811105C0F60183815A +:10B71000807329F406C000FD18CF539416CF55202E +:10B7200019F0852D90E002C08FEF9FEFDF91CF9150 +:10B730001F910F91FF90EF90DF90CF90BF90AF904F +:10B740009F908F907F906F905F900895911118C196 +:10B75000803219F089508550D0F70895FC0105908A +:10B76000061621F00020D9F7C00108953197CF01C6 +:10B770000895FC010590615070400110D8F7809544 +:10B7800090958E0F9F1F0895FC01615070400190AD +:10B790000110D8F7809590958E0F9F1F0895CF9335 +:10B7A000DF93EC012B8120FF33C026FF0AC02F7BE3 +:10B7B0002B838E819F8101968E839F838A8190E067 +:10B7C00029C022FF0FC0E881F9818081082E000C7A +:10B7D000990B009719F420622B831AC03196E883E5 +:10B7E000F9830EC0EA85FB85199597FF09C02B8167 +:10B7F000019611F080E201C080E1822B8B8308C0AA +:10B800002E813F812F5F3F4F2E833F83992702C0B8 +:10B810008FEF9FEFDF91CF9108950F931F93CF93F9 +:10B82000DF93FB01238121FD03C08FEF9FEF2CC02D +:10B8300022FF16C046815781248135814217530764 +:10B8400044F4A081B1819D012F5F3F4F208331835C +:10B850008C93268137812F5F3F4F2683378314C017 +:10B860008B01EC01FB010084F185E02D1995892BFA +:10B87000E1F6D80116968D919C9117970196169630 +:10B880008D939C931797CE01DF91CF911F910F91CC +:10B890000895FB01238120FF12C026FD10C08F3FB9 +:10B8A0003FEF930761F082832F7D206423832681FD +:10B8B00037812150310926833783992708958FEFE7 +:10B8C0009FEF0895FA01AA27283051F1203181F124 +:10B8D000E8946F936E7F6E5F7F4F8F4F9F4FAF4F98 +:10B8E000B1E03ED0B4E03CD0670F781F891F9A1FAB +:10B8F000A11D680F791F8A1F911DA11D6A0F711D5F +:10B90000811D911DA11D20D009F468943F912AE06A +:10B91000269F11243019305D3193DEF6CF01089552 +:10B92000462F4770405D4193B3E00FD0C9F7F6CF83 +:10B93000462F4F70405D4A3318F0495D31FD40524B +:10B94000419302D0A9F7EACFB4E0A69597958795E1 +:10B9500077956795BA95C9F70097610571050895C0 +:10B960009B01AC010A2E069457954795379527956C +:10B97000BA95C9F7620F731F841F951FA01D089504 +:10B9800099278827089503D0808199270895E0ECAE +:10B99000F1E0378537FDFDCF348538603487FC0111 +:10B9A000E050F04F0895262FF2DF0080021611F0CC +:10B9B00008D00197019708950196272FF5DFF3CF5F +:10B9C000262FE0ECF1E0378537FDFDCF3485377F5A +:10B9D0003487378531FF09C036E3328738ED34BF0D +:10B9E00031E03387378537FDFDCF33E332878083FE +:10B9F00091831282248325E3228728ED31E024BF3E +:10BA0000338701960895052E97FB16F400940FD006 +:10BA100057FD05D014D007FC02D046F408C050955D +:10BA20004095309521953F4F4F4F5F4F089590952A +:10BA30008095709561957F4F8F4F9F4F0895A1E23C +:10BA40001A2EAA1BBB1BFD010DC0AA1FBB1FEE1F98 +:10BA5000FF1FA217B307E407F50720F0A21BB30BE3 +:10BA6000E40BF50B661F771F881F991F1A9469F75F +:10BA700060957095809590959B01AC01BD01CF01BB +:06BA80000895F894FFCFC9 +:10BA860002400F008310000001041000000182082C +:10BA9600000001000000000000000000000001009E +:10BAA60001000000000000000925102510251C25B6 +:10BAB600282532254F255D25862589258D253E009D +:10BAC6000426140004043E00042E040C040400089A +:10BAD6000008000000000000000800080808080828 +:10BAE6000800080008000000080800080808008090 +:10BAF60000800000000000000080008080808080C0 +:10BB0600800080008000000080800080808000012E +:10BB16000001000000000000000100010101010118 +:10BB26000100010001000000010100010101000007 +:10BB360000000000000000000000000000000101FD +:10BB460001010101010101010101010101010101DF +:10BB560001010101010101010101010101010101CF +:10BB660001010101010101010101010101010000C1 +:10BB760000000000000000000000000000000000BF +:10BB860000000000000000000000000000000000AF +:10BB9600000000000000000000000000000001019D +:10BBA6000101010101010101010101010101000081 +:10BBB600000000000000000000000000000000007F +:10BBC600000000000000000000000000000001016D +:10BBD6000101010101010101010101010101000051 +:10BBE600000000000000000000000000000001014D +:10BBF600010101010101010101010101010101012F +:10BC06000101010101010101010101010101000020 +:10BC1600000000000000000000000000000001011C +:10BC26000101010101010101010101010101000000 +:10BC360000020200000200020202020000020000EE +:10BC460000020200000200020202020000020000DE +:10BC560000020200000200020202020000020404C6 +:10BC6600040606040406040606060604040604047E +:10BC76000406060404060406060606040406000076 +:10BC8600000202000002000202020200000200009E +:10BC96000002020000020002020202000002040486 +:10BCA6000406060404060406060606040406000046 +:10BCB6000002020000020002020202000002040466 +:10BCC600040606040406040606060604040604041E +:10BCD600040606040406040606060604040604040E +:10BCE60004060604040604060606060404060404FE +:10BCF60004060604040604060606060404060000F6 +:10BD0600000202000002000202020200000200001D +:10BD16000002020000020002020202000002040405 +:10BD260004060604040604060606060404060008BD +:10BD360008080000000800000800080800080008BD +:10BD460008080000000800000800080800080008AD +:10BD5600080800000008000008000808000810187D +:10BD6600181810101018101018101818101810188D +:10BD7600181810101018101018101818101800089D +:10BD8600080800000008000008000808000800086D +:10BD9600080800000008000008000808000810183D +:10BDA600181810101018101018101818101800086D +:10BDB600080800000008000008000808000810181D +:10BDC600181810101018101018101818101810182D +:10BDD600181810101018101018101818101810181D +:10BDE600181810101018101018101818101810180D +:10BDF600181810101018101018101818101800081D +:10BE060008080000000800000800080800080008EC +:10BE160008080000000800000800080800081018BC +:10BE26001818101010181010181018181018434C65 +:10BE36004F4E4500546F6F206D616E7920646174BA +:10BE4600612E000D0A000D0A5041524954592045F1 +:10BE560052524F52000D0A504152495459204F4BED +:10BE6600002534753A200025337500556E6B6E6FCC +:10BE7600776E206361726420747970652E00257375 +:10BE8600206F7220004D756C7469706C6520706F40 +:10BE960073736962696C69746965732C206E6F745B +:10BEA60020636C6F6E61626C652100436C6F6E651A +:10BEB60064204F4B2100436C6F6E6520756E737561 +:10BEC60070706F7274656421004E4F204441544176 +:02BED60000006A :020000021000EC :1000000000000000000000000000000000000000F0 :1000100000000000000000000000000000000000E0 From 5b46650edded2d8119c384bbde475593b24e3598 Mon Sep 17 00:00:00 2001 From: chenzitai Date: Tue, 26 Jun 2018 23:46:36 +0100 Subject: [PATCH 058/104] Set up framework for sniffing (cherry picked from commit 8a0b331) --- Firmware/Chameleon-Mini/Codec/Codec.h | 3 +++ .../Chameleon-Mini/Codec/SniffISO14443-2A.c | 25 +++++++++++++++++++ .../Chameleon-Mini/Codec/SniffISO14443-2A.h | 19 ++++++++++++++ 3 files changed, 47 insertions(+) create mode 100644 Firmware/Chameleon-Mini/Codec/SniffISO14443-2A.c create mode 100644 Firmware/Chameleon-Mini/Codec/SniffISO14443-2A.h diff --git a/Firmware/Chameleon-Mini/Codec/Codec.h b/Firmware/Chameleon-Mini/Codec/Codec.h index cf9d67d..0a74d25 100644 --- a/Firmware/Chameleon-Mini/Codec/Codec.h +++ b/Firmware/Chameleon-Mini/Codec/Codec.h @@ -17,6 +17,7 @@ #include "ISO14443-2A.h" #include "Reader14443-2A.h" +#include "SniffISO14443-2A.h" /* Timing definitions for ISO14443A */ #define ISO14443A_SUBCARRIER_DIVIDER 16 @@ -231,6 +232,7 @@ INLINE void CodecSetLoadmodState(bool bOnOff) { } } +// Turn on and off the codec Reader field INLINE void CodecSetReaderField(bool bOnOff) { // this is the function for turning on/off the reader field dumbly; before using this function, please consider to use CodecReaderField{Start,Stop} if (bOnOff) { @@ -244,6 +246,7 @@ INLINE void CodecSetReaderField(bool bOnOff) { // this is the function for turni } } +// Get the status of the reader field INLINE bool CodecGetReaderField(void) { return (CODEC_READER_TIMER.CTRLA == TC_CLKSEL_DIV1_gc) && (AWEXC.OUTOVEN == CODEC_READER_MASK); } diff --git a/Firmware/Chameleon-Mini/Codec/SniffISO14443-2A.c b/Firmware/Chameleon-Mini/Codec/SniffISO14443-2A.c new file mode 100644 index 0000000..9e98f0d --- /dev/null +++ b/Firmware/Chameleon-Mini/Codec/SniffISO14443-2A.c @@ -0,0 +1,25 @@ +// +// Created by Zitai Chen on 05/07/2018. +// + +#include "SniffISO14443-2A.h" + +#include "Reader14443-2A.h" +#include "Codec.h" +#include "../System.h" +#include "../Application/Application.h" +#include "LEDHook.h" +#include "Terminal/Terminal.h" +#include + + +void Sniff14443ACodecInit(void){ + +} + +void Sniff14443ACodecDeInit(void) { + +} +void Sniff14443ACodecTask(void) +{ +} \ No newline at end of file diff --git a/Firmware/Chameleon-Mini/Codec/SniffISO14443-2A.h b/Firmware/Chameleon-Mini/Codec/SniffISO14443-2A.h new file mode 100644 index 0000000..eb0317a --- /dev/null +++ b/Firmware/Chameleon-Mini/Codec/SniffISO14443-2A.h @@ -0,0 +1,19 @@ +// +// Created by 陈子泰 on 05/07/2018. +// + +#ifndef CHAMELEON_MINI_SNIFFISO14443_2A_H +#define CHAMELEON_MINI_SNIFFISO14443_2A_H + + +#include "Codec.h" +#include "Terminal/CommandLine.h" + +/* Codec Interface */ +void Sniff14443ACodecInit(void); +void Sniff14443ACodecDeInit(void); +void Sniff14443ACodecTask(void); + + + +#endif //CHAMELEON_MINI_SNIFFISO14443_2A_H From 38b7ea459a83b78578383710616c1f0686b59b5c Mon Sep 17 00:00:00 2001 From: chenzitai Date: Tue, 26 Jun 2018 23:56:25 +0100 Subject: [PATCH 059/104] Add some comments for better understanding (cherry picked from commit df39123) --- Firmware/Chameleon-Mini/Application/Reader14443A.c | 1 + Firmware/Chameleon-Mini/Codec/ISO14443-2A.c | 8 ++++++-- Firmware/Chameleon-Mini/Codec/Reader14443-ISR.S | 1 + 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/Firmware/Chameleon-Mini/Application/Reader14443A.c b/Firmware/Chameleon-Mini/Application/Reader14443A.c index b865df8..471dc30 100644 --- a/Firmware/Chameleon-Mini/Application/Reader14443A.c +++ b/Firmware/Chameleon-Mini/Application/Reader14443A.c @@ -141,6 +141,7 @@ uint16_t addParityBits(uint8_t * Buffer, uint16_t BitCount) uint16_t removeParityBits(uint8_t * Buffer, uint16_t BitCount) { + // Short frame, no parity bit is added if (BitCount == 7) return 7; diff --git a/Firmware/Chameleon-Mini/Codec/ISO14443-2A.c b/Firmware/Chameleon-Mini/Codec/ISO14443-2A.c index e43ea61..ebf565b 100644 --- a/Firmware/Chameleon-Mini/Codec/ISO14443-2A.c +++ b/Firmware/Chameleon-Mini/Codec/ISO14443-2A.c @@ -66,8 +66,8 @@ static void StartDemod(void) { StateRegister = DEMOD_DATA_BIT; /* Configure sampling-timer free running and sync to first modulation-pause. */ - CODEC_TIMER_SAMPLING.CNT = 0; - CODEC_TIMER_SAMPLING.PER = SAMPLE_RATE_SYSTEM_CYCLES - 1; + CODEC_TIMER_SAMPLING.CNT = 0; // Reset the timer count + CODEC_TIMER_SAMPLING.PER = SAMPLE_RATE_SYSTEM_CYCLES - 1; // Set Period regisiter CODEC_TIMER_SAMPLING.CCA = 0xFFFF; /* CCA Interrupt is not active! */ CODEC_TIMER_SAMPLING.CTRLA = TC_CLKSEL_DIV1_gc; CODEC_TIMER_SAMPLING.CTRLD = TC_EVACT_RESTART_gc | CODEC_TIMER_MODSTART_EVSEL; @@ -79,6 +79,7 @@ static void StartDemod(void) { CODEC_DEMOD_IN_PORT.INT0MASK = CODEC_DEMOD_IN_MASK0; } +// Find first pause and start sampling ISR(CODEC_DEMOD_IN_INT0_VECT) { /* This is the first edge of the first modulation-pause after StartDemod. * Now we have time to start @@ -112,6 +113,7 @@ ISR(CODEC_DEMOD_IN_INT0_VECT) { CODEC_DEMOD_IN_PORT.INT0MASK = 0; } +// Sampling with timer and demod ISR(CODEC_TIMER_SAMPLING_CCA_VECT) { /* This interrupt gets called twice for every bit to sample it. */ uint8_t SamplePin = CODEC_DEMOD_IN_PORT.IN & CODEC_DEMOD_IN_MASK; @@ -220,6 +222,7 @@ ISR(CODEC_TIMER_SAMPLING_CCA_VECT) { CODEC_TIMER_SAMPLING.CTRLD = TC_EVACT_RESTART_gc | CODEC_TIMER_MODSTART_EVSEL; } +// Enumulate as a card to send card responds ISR(CODEC_TIMER_LOADMOD_OVF_VECT) { /* Bit rate timer. Output a half bit on the output. */ @@ -418,6 +421,7 @@ void ISO14443ACodecTask(void) { uint16_t AnswerBitCount = ISO14443A_APP_NO_RESPONSE; if (DemodBitCount >= ISO14443A_MIN_BITS_PER_FRAME) { + // For logging data LogEntry(LOG_INFO_CODEC_RX_DATA, CodecBuffer, (DemodBitCount+7)/8); LEDHook(LED_CODEC_RX, LED_PULSE); diff --git a/Firmware/Chameleon-Mini/Codec/Reader14443-ISR.S b/Firmware/Chameleon-Mini/Codec/Reader14443-ISR.S index f41b045..82ba110 100644 --- a/Firmware/Chameleon-Mini/Codec/Reader14443-ISR.S +++ b/Firmware/Chameleon-Mini/Codec/Reader14443-ISR.S @@ -15,6 +15,7 @@ #define AWEXC__OUTOVEN 0x088C #define CODEC_READER_TIMER__CTRLA 0x0800 +; For sending reader bits to cards .global TCD0_CCB_vect, Reader14443AMillerEOC TCD0_CCB_vect: push Zero ; 1 From fd57c63ba85d9f0de9c72f42e2810e218ddd9ada Mon Sep 17 00:00:00 2001 From: chenzitai Date: Sat, 7 Jul 2018 00:16:18 +0100 Subject: [PATCH 060/104] Work in Card->Reader direction only, WIP (cherry picked from commit 9ce138c) --- .../Chameleon-Mini/Codec/Reader14443-2A.c | 198 +++++++++++++----- .../Chameleon-Mini/Codec/Reader14443-2A.h | 1 + .../Chameleon-Mini/Codec/SniffISO14443-2A.c | 9 +- Firmware/Chameleon-Mini/Configuration.c | 6 +- Firmware/Chameleon-Mini/Makefile | 2 +- 5 files changed, 156 insertions(+), 60 deletions(-) diff --git a/Firmware/Chameleon-Mini/Codec/Reader14443-2A.c b/Firmware/Chameleon-Mini/Codec/Reader14443-2A.c index 6a70968..9192c1f 100644 --- a/Firmware/Chameleon-Mini/Codec/Reader14443-2A.c +++ b/Firmware/Chameleon-Mini/Codec/Reader14443-2A.c @@ -50,6 +50,7 @@ void Reader14443ACodecInit(void) { CodecInitCommon(); CodecSetDemodPower(true); + CODEC_TIMER_SAMPLING.PER = SAMPLE_RATE_SYSTEM_CYCLES - 1; CODEC_TIMER_SAMPLING.CCB = 0; CODEC_TIMER_SAMPLING.CCC = 0; @@ -66,9 +67,11 @@ void Reader14443ACodecInit(void) { Flags.RxDone = false; } + + void Reader14443ACodecDeInit(void) { CodecSetDemodPower(false); - CodecReaderFieldStop(); + // CodecReaderFieldStop(); CODEC_TIMER_SAMPLING.CTRLA = 0; CODEC_TIMER_SAMPLING.INTCTRLB = 0; CODEC_TIMER_LOADMOD.CTRLA = 0; @@ -94,8 +97,11 @@ INLINE void Insert1(void) *CodecBufferPtr++ = SampleRegister; } + +// End of Card-> reader communication and enter frame delay time INLINE void Reader14443A_EOC(void) { + CODEC_TIMER_LOADMOD.INTCTRLB = 0; CODEC_TIMER_LOADMOD.CTRLA = TC_CLKSEL_OFF_gc; CODEC_TIMER_TIMESTAMPS.INTCTRLB = 0; @@ -128,6 +134,7 @@ INLINE void Reader14443A_EOC(void) INLINE void BufferToSequence(void) { + uint16_t count = BitCount; if (count > BITS_PER_BYTE * CODEC_BUFFER_SIZE / 2) // todo is this correct? return; @@ -138,6 +145,7 @@ INLINE void BufferToSequence(void) uint8_t * Buffer = CodecBuffer + CODEC_BUFFER_SIZE / 2; CodecBufferPtr = CodecBuffer; + // Modified Miller Coding ISO14443-2 8.1.3 Insert1(); // SOC Insert0(); @@ -175,12 +183,14 @@ INLINE void BufferToSequence(void) if (BitCount % 8) CodecBuffer[BitCount / 8] = SampleRegister >> (8 - (BitCount % 8)); } - +// Frame Delay Time PCD to PICC ends ISR (TCD0_CCC_vect) { + CODEC_TIMER_SAMPLING.INTFLAGS = TC0_CCCIF_bm; CODEC_TIMER_SAMPLING.INTCTRLB = TC_CCCINTLVL_OFF_gc; + /* Enable the AC interrupt, which either finds the SOC and then starts the pause-finding timer, * or it is triggered before the SOC, which mostly isn't bad at all, since the first pause * needs to be found. */ @@ -192,6 +202,7 @@ ISR (TCD0_CCC_vect) SampleRegister = 0x00; RxPendingSince = SystemGetSysTick(); + Flags.RxPending = true; // reset for future use @@ -202,8 +213,11 @@ ISR (TCD0_CCC_vect) PORTE.OUTTGL = PIN3_bm; } +// Reader -> card send bits finished +// Start Frame delay time PCD to PICC void Reader14443AMillerEOC(void) { + CODEC_TIMER_SAMPLING.PER = 5*SAMPLE_RATE_SYSTEM_CYCLES - 1; CODEC_TIMER_SAMPLING.INTFLAGS = TC0_CCBIF_bm | TC0_CCCIF_bm; CODEC_TIMER_SAMPLING.INTCTRLB = TC_CCBINTLVL_OFF_gc | TC_CCCINTLVL_HI_gc; @@ -211,21 +225,32 @@ void Reader14443AMillerEOC(void) PORTE.OUTTGL = PIN3_bm; } +// EOC of Card->Reader found ISR(CODEC_TIMER_TIMESTAMPS_CCA_VECT) // EOC found { Reader14443A_EOC(); } +// This interrupt find Card -> Reader SOC ISR(ACA_AC1_vect) // this interrupt either finds the SOC or gets triggered before { + LED_PORT.OUTSET=LED_RED; + ACA.AC1CTRL &= ~AC_INTLVL_HI_gc; // disable this interrupt // enable the pause-finding timer CODEC_TIMER_LOADMOD.CTRLD = TC_EVACT_RESTART_gc | TC_EVSEL_CH0_gc; CODEC_TIMER_LOADMOD.CTRLA = TC_CLKSEL_DIV1_gc; + } +// Decode the Card -> Reader signal +// according to the pause and modulated period +// if the half bit duration is modulated, then add 1 to buffer +// if the half bit duration is not modulated, then add 0 to buffer ISR(CODEC_TIMER_LOADMOD_CCA_VECT) // pause found { + + uint8_t tmp = CODEC_TIMER_TIMESTAMPS.CNTL; CODEC_TIMER_TIMESTAMPS.CNT = 0; @@ -266,23 +291,72 @@ ISR(CODEC_TIMER_LOADMOD_CCA_VECT) // pause found return; } +static void StartDemod(void){ + LED_PORT.OUTCLR = LED_RED; + + + /* + * Prepare for Manchester decoding. + * The basic idea is to use two timers. The first one will be reset everytime the DEMOD signal + * passes a (configurable) threshold. This is realized with the event system and an analog + * comparator. + * Once this timer reaches 3/4 of a bit half (this means it has not been reset this long), we + * assume there is a pause. Now we read the second timers count value and can decide how many + * bit halves had modulations since the last pause. + */ + + // Comparator ADC + /* Configure and enable the analog comparator for finding pauses in the DEMOD signal. */ + ACA.AC1CTRL = AC_HSMODE_bm | AC_HYSMODE_NO_gc | AC_INTMODE_FALLING_gc | AC_ENABLE_bm; + + /* This timer will be used to detect the pauses between the modulation sequences. */ + CODEC_TIMER_LOADMOD.CTRLA = 0; + CODEC_TIMER_LOADMOD.CNT = 0; + CODEC_TIMER_LOADMOD.PER = 0xFFFF; // with 27.12 MHz this is exactly one half bit width + CODEC_TIMER_LOADMOD.CCA = 95; // with 27.12 MHz this is 3/4 of a half bit width + CODEC_TIMER_LOADMOD.INTCTRLA = 0; + CODEC_TIMER_LOADMOD.INTFLAGS = TC1_CCAIF_bm; + CODEC_TIMER_LOADMOD.INTCTRLB = TC_CCAINTLVL_HI_gc; + + /* This timer will be used to find out how many bit halfs since the last pause have been passed. */ + CODEC_TIMER_TIMESTAMPS.CNT = 0; // Reset timer + CODEC_TIMER_TIMESTAMPS.PER = 0xFFFF; + CODEC_TIMER_TIMESTAMPS.CCA = 160; + CODEC_TIMER_TIMESTAMPS.INTCTRLA = 0; + CODEC_TIMER_TIMESTAMPS.INTFLAGS = TC1_CCAIF_bm; // Clear interrupt flag + CODEC_TIMER_TIMESTAMPS.INTCTRLB = TC_CCAINTLVL_LO_gc; + + /* Use the event system for resetting the pause-detecting timer. */ + EVSYS.CH0MUX = EVSYS_CHMUX_ACA_CH1_gc; // on every ACA_AC1 INT + EVSYS.CH0CTRL = EVSYS_DIGFILT_1SAMPLE_gc; + + ACA.AC0CTRL = 0; + CODEC_DEMOD_IN_PORT.INTCTRL = 0; + +} void Reader14443ACodecTask(void) { - if (Flags.RxPending && SYSTICK_DIFF(RxPendingSince) > Reader_FWT + 1) - { - Reader14443A_EOC(); - BitCount = 0; - Flags.RxDone = true; - Flags.RxPending = false; - } - if (CodecIsReaderToBeRestarted() || !CodecIsReaderFieldReady()) - return; + + // Waiting for response time out +// if (Flags.RxPending && SYSTICK_DIFF(RxPendingSince) > Reader_FWT + 1) +// { +// Reader14443A_EOC(); +// BitCount = 0; +// Flags.RxDone = true; +// Flags.RxPending = false; +// } +// if (CodecIsReaderToBeRestarted() || !CodecIsReaderFieldReady()) +// return; if (!Flags.RxPending && (Flags.Start || Flags.RxDone)) { - if (State == STATE_FDT && CODEC_TIMER_LOADMOD.CNT < ISO14443A_PICC_TO_PCD_MIN_FDT) // we are in frame delay time, so we can return later - return; + +// if (State == STATE_FDT && CODEC_TIMER_LOADMOD.CNT < ISO14443A_PICC_TO_PCD_MIN_FDT) { // we are in frame delay time, so we can return later +// return; +// } + if (Flags.RxDone && BitCount > 0) // decode the raw received data { + if (BitCount < ISO14443A_RX_MINIMUM_BITCOUNT * 2) { BitCount = 0; @@ -296,6 +370,8 @@ void Reader14443ACodecTask(void) bool breakflag = false; TmpCodecBuffer[0] >>= 2; // with this (and BitCountTmp = 2), the SOC is ignored + + // Manchester Code ISO14443-2 8.2.5 while (!breakflag && BitCountTmp < TotalBitCount) { uint8_t Bit = TmpCodecBuffer[BitCountTmp / 8] & 0x03; @@ -322,9 +398,11 @@ void Reader14443ACodecTask(void) } if (BitCount % 8) // copy the last byte, if there is an incomplete byte CodecBuffer[BitCount / 8] = SampleRegister >> (8 - (BitCount % 8)); - LEDHook(LED_CODEC_RX, LED_PULSE); LogEntry(LOG_INFO_CODEC_RX_DATA_W_PARITY, CodecBuffer, (BitCount + 7) / 8); + + Flags.RxPending=true; } + } Flags.Start = false; Flags.RxDone = false; @@ -332,55 +410,31 @@ void Reader14443ACodecTask(void) /* Call application with received data */ BitCount = ApplicationProcess(CodecBuffer, BitCount); - if (BitCount > 0) + // Application have data to be sent + if (false)//BitCount > 0) { - /* - * Prepare for Manchester decoding. - * The basic idea is to use two timers. The first one will be reset everytime the DEMOD signal - * passes a (configurable) threshold. This is realized with the event system and an analog - * comparator. - * Once this timer reaches 3/4 of a bit half (this means it has not been reset this long), we - * assume there is a pause. Now we read the second timers count value and can decide how many - * bit halves had modulations since the last pause. - */ - /* Configure and enable the analog comparator for finding pauses in the DEMOD signal. */ - ACA.AC1CTRL = AC_HSMODE_bm | AC_HYSMODE_NO_gc | AC_INTMODE_FALLING_gc | AC_ENABLE_bm; - - /* This timer will be used to detect the pauses between the modulation sequences. */ - CODEC_TIMER_LOADMOD.CTRLA = 0; - CODEC_TIMER_LOADMOD.CNT = 0; - CODEC_TIMER_LOADMOD.PER = 0xFFFF; // with 27.12 MHz this is exactly one half bit width - CODEC_TIMER_LOADMOD.CCA = 95; // with 27.12 MHz this is 3/4 of a half bit width - CODEC_TIMER_LOADMOD.INTCTRLA = 0; - CODEC_TIMER_LOADMOD.INTFLAGS = TC1_CCAIF_bm; - CODEC_TIMER_LOADMOD.INTCTRLB = TC_CCAINTLVL_HI_gc; - - /* This timer will be used to find out how many bit halfs since the last pause have been passed. */ - CODEC_TIMER_TIMESTAMPS.CNT = 0; - CODEC_TIMER_TIMESTAMPS.PER = 0xFFFF; - CODEC_TIMER_TIMESTAMPS.CCA = 160; - CODEC_TIMER_TIMESTAMPS.INTCTRLA = 0; - CODEC_TIMER_TIMESTAMPS.INTFLAGS = TC1_CCAIF_bm; - CODEC_TIMER_TIMESTAMPS.INTCTRLB = TC_CCAINTLVL_LO_gc; - - /* Use the event system for resetting the pause-detecting timer. */ - EVSYS.CH0MUX = EVSYS_CHMUX_ACA_CH1_gc; // on every ACA_AC1 INT - EVSYS.CH0CTRL = EVSYS_DIGFILT_1SAMPLE_gc; - - ACA.AC0CTRL = 0; - CODEC_DEMOD_IN_PORT.INTCTRL = 0; + StartDemod(); LEDHook(LED_CODEC_TX, LED_PULSE); LogEntry(LOG_INFO_CODEC_TX_DATA_W_PARITY, CodecBuffer, (BitCount + 7) / 8); /* Set state and start timer for Miller encoding. */ + // Send bits to card using TCD0_CCB interrupt (See Reader14443-ISR.S) BufferToSequence(); State = STATE_MILLER_SEND; CodecBufferPtr = CodecBuffer; CODEC_TIMER_SAMPLING.INTFLAGS = TC0_CCBIF_bm; CODEC_TIMER_SAMPLING.INTCTRLB = TC_CCBINTLVL_HI_gc; - _delay_loop_1(85); + _delay_loop_1(85); // Wait for sending to finish + + + }else{ // No data need to be send or in SNIFFING mode + // TODO: add another sniff flag, in case of no Application data need to be send (Non sniffing mode) + StartDemod(); + Reader14443AMillerEOC(); + + // Sniffing mode, enable sampling interrupt only } } } @@ -391,7 +445,7 @@ void Reader14443ACodecStart(void) BitCount = 0; Flags.Start = true; - CodecReaderFieldStart(); +// CodecReaderFieldStart(); } void Reader14443ACodecReset(void) @@ -400,5 +454,43 @@ void Reader14443ACodecReset(void) State = STATE_IDLE; Flags.RxDone = false; Flags.Start = false; - CodecReaderFieldStop(); + //CodecReaderFieldStop(); } + +void TestSniff14443ACodecInit(void){ + + //////////////////////////// + // Same as reader init + /* Initialize common peripherals and start listening + * for incoming data. */ + + + CodecInitCommon(); + + CodecSetDemodPower(true); + + CODEC_TIMER_SAMPLING.PER = SAMPLE_RATE_SYSTEM_CYCLES - 1; + CODEC_TIMER_SAMPLING.CCB = 0; + CODEC_TIMER_SAMPLING.CCC = 0; + CODEC_TIMER_SAMPLING.CTRLA = TC_CLKSEL_OFF_gc; + CODEC_TIMER_SAMPLING.INTCTRLA = 0; + CODEC_TIMER_SAMPLING.INTCTRLB = TC_CCBINTLVL_OFF_gc; + CODEC_TIMER_SAMPLING.CTRLA = TC_CLKSEL_DIV1_gc; + + CODEC_TIMER_LOADMOD.CTRLA = 0; + State = STATE_IDLE; + + BitCount = 0; + Flags.Start = false; + Flags.RxPending = false; + Flags.RxDone = false; + /////////////////////////// + + Flags.Start = true; +// Flags.RxPending = true; + + //LogEntry(LOG_INFO_CODEC_TX_DATA_W_PARITY, "Codec Sniff Start", 18); + //Reader14443A_EOC(); + + +} \ No newline at end of file diff --git a/Firmware/Chameleon-Mini/Codec/Reader14443-2A.h b/Firmware/Chameleon-Mini/Codec/Reader14443-2A.h index e9a2c1e..a96fff2 100644 --- a/Firmware/Chameleon-Mini/Codec/Reader14443-2A.h +++ b/Firmware/Chameleon-Mini/Codec/Reader14443-2A.h @@ -15,6 +15,7 @@ void Reader14443ACodecInit(void); void Reader14443ACodecDeInit(void); void Reader14443ACodecTask(void); +void TestSniff14443ACodecInit(void); /* Application Interface */ void Reader14443ACodecStart(void); diff --git a/Firmware/Chameleon-Mini/Codec/SniffISO14443-2A.c b/Firmware/Chameleon-Mini/Codec/SniffISO14443-2A.c index 9e98f0d..48f3ee8 100644 --- a/Firmware/Chameleon-Mini/Codec/SniffISO14443-2A.c +++ b/Firmware/Chameleon-Mini/Codec/SniffISO14443-2A.c @@ -13,13 +13,16 @@ #include -void Sniff14443ACodecInit(void){ +void Sniff14443ACodecInit(void) +{ } -void Sniff14443ACodecDeInit(void) { - +void Sniff14443ACodecDeInit(void) +{ + Reader14443ACodecDeInit(); } void Sniff14443ACodecTask(void) { + Reader14443ACodecTask(); } \ No newline at end of file diff --git a/Firmware/Chameleon-Mini/Configuration.c b/Firmware/Chameleon-Mini/Configuration.c index 72ffce1..22eaf3b 100644 --- a/Firmware/Chameleon-Mini/Configuration.c +++ b/Firmware/Chameleon-Mini/Configuration.c @@ -188,9 +188,9 @@ static const PROGMEM ConfigurationType ConfigurationTable[] = { #endif #ifdef CONFIG_ISO14443A_SNIFF_SUPPORT [CONFIG_ISO14443A_SNIFF] = { - .CodecInitFunc = ISO14443ACodecInit, - .CodecDeInitFunc = ISO14443ACodecDeInit, - .CodecTaskFunc = ISO14443ACodecTask, + .CodecInitFunc = TestSniff14443ACodecInit, + .CodecDeInitFunc = Reader14443ACodecDeInit, + .CodecTaskFunc = Reader14443ACodecTask, .ApplicationInitFunc = ApplicationInitDummy, .ApplicationResetFunc = ApplicationResetDummy, .ApplicationTaskFunc = ApplicationTaskDummy, diff --git a/Firmware/Chameleon-Mini/Makefile b/Firmware/Chameleon-Mini/Makefile index 9d3175f..5870a2b 100644 --- a/Firmware/Chameleon-Mini/Makefile +++ b/Firmware/Chameleon-Mini/Makefile @@ -92,7 +92,7 @@ TARGET = Chameleon-Mini OPTIMIZATION = s SRC += $(TARGET).c LUFADescriptors.c System.c Configuration.c Random.c Common.c Memory.c MemoryAsm.S Button.c Log.c Settings.c LED.c Map.c AntennaLevel.c SRC += Terminal/Terminal.c Terminal/Commands.c Terminal/XModem.c Terminal/CommandLine.c -SRC += Codec/Codec.c Codec/ISO14443-2A.c Codec/Reader14443-2A.c Codec/Reader14443-ISR.S +SRC += Codec/Codec.c Codec/ISO14443-2A.c Codec/Reader14443-2A.c Codec/SniffISO14443-2A.c Codec/Reader14443-ISR.S SRC += Application/MifareUltralight.c Application/MifareClassic.c Application/ISO14443-3A.c Application/Crypto1.c Application/Reader14443A.c SRC += $(LUFA_SRC_USB) $(LUFA_SRC_USBCLASS) LUFA_PATH = ../LUFA From 64534c8912f956a2703a769b78be52bb14a63a21 Mon Sep 17 00:00:00 2001 From: chenzitai Date: Sun, 8 Jul 2018 01:27:05 +0100 Subject: [PATCH 061/104] Works for one round of traffic (cherry picked from commit 800f72a) --- Firmware/Chameleon-Mini/Codec/ISO14443-2A.c | 13 +++++ .../Chameleon-Mini/Codec/Reader14443-2A.c | 50 +++++++++++++++++-- .../Chameleon-Mini/Codec/SniffISO14443-2A.c | 23 ++++++++- .../Chameleon-Mini/Codec/SniffISO14443-2A.h | 4 +- Firmware/Chameleon-Mini/Configuration.c | 6 +-- 5 files changed, 86 insertions(+), 10 deletions(-) diff --git a/Firmware/Chameleon-Mini/Codec/ISO14443-2A.c b/Firmware/Chameleon-Mini/Codec/ISO14443-2A.c index ebf565b..5d367ef 100644 --- a/Firmware/Chameleon-Mini/Codec/ISO14443-2A.c +++ b/Firmware/Chameleon-Mini/Codec/ISO14443-2A.c @@ -425,6 +425,18 @@ void ISO14443ACodecTask(void) { LogEntry(LOG_INFO_CODEC_RX_DATA, CodecBuffer, (DemodBitCount+7)/8); LEDHook(LED_CODEC_RX, LED_PULSE); + + if(SniffEnable == true){ + // TODO: Start interrupt for finding Card -> Reader direction traffic + + ISO14443ACodecDeInit(); + + TrafficSource = TRAFFIC_CARD; + TestSniff14443ACodecInit(); + return; + + } + /* Call application if we received data */ AnswerBitCount = ApplicationProcess(CodecBuffer, DemodBitCount); @@ -437,6 +449,7 @@ void ISO14443ACodecTask(void) { /* We have to generate the parity bits ourself */ ParityBufferPtr = 0; } + } if (AnswerBitCount != ISO14443A_APP_NO_RESPONSE) { diff --git a/Firmware/Chameleon-Mini/Codec/Reader14443-2A.c b/Firmware/Chameleon-Mini/Codec/Reader14443-2A.c index 9192c1f..84a3a4a 100644 --- a/Firmware/Chameleon-Mini/Codec/Reader14443-2A.c +++ b/Firmware/Chameleon-Mini/Codec/Reader14443-2A.c @@ -130,6 +130,8 @@ INLINE void Reader14443A_EOC(void) CODEC_TIMER_LOADMOD.CTRLA = ISO14443A_PICC_TO_PCD_FDT_PRESCALER; State = STATE_FDT; + + } INLINE void BufferToSequence(void) @@ -292,7 +294,6 @@ ISR(CODEC_TIMER_LOADMOD_CCA_VECT) // pause found } static void StartDemod(void){ - LED_PORT.OUTCLR = LED_RED; /* @@ -401,6 +402,17 @@ void Reader14443ACodecTask(void) LogEntry(LOG_INFO_CODEC_RX_DATA_W_PARITY, CodecBuffer, (BitCount + 7) / 8); Flags.RxPending=true; + + + if (SniffEnable) + { + + Reader14443ACodecDeInit(); + ISO14443ACodecInit(); + TrafficSource = TRAFFIC_CARD; + + return; + } } } @@ -431,8 +443,8 @@ void Reader14443ACodecTask(void) }else{ // No data need to be send or in SNIFFING mode // TODO: add another sniff flag, in case of no Application data need to be send (Non sniffing mode) - StartDemod(); - Reader14443AMillerEOC(); +// StartDemod(); +// Reader14443AMillerEOC(); // Sniffing mode, enable sampling interrupt only } @@ -487,10 +499,38 @@ void TestSniff14443ACodecInit(void){ /////////////////////////// Flags.Start = true; -// Flags.RxPending = true; + + StartDemod(); + + // CODEC_TIMER_SAMPLING_CCC_vect + CODEC_TIMER_SAMPLING.INTFLAGS = TC0_CCCIF_bm; + CODEC_TIMER_SAMPLING.INTCTRLB = TC_CCCINTLVL_OFF_gc; + + + /* Enable the AC interrupt, which either finds the SOC and then starts the pause-finding timer, + * or it is triggered before the SOC, which mostly isn't bad at all, since the first pause + * needs to be found. */ + ACA.STATUS = AC_AC1IF_bm; + ACA.AC1CTRL = AC_HSMODE_bm | AC_HYSMODE_NO_gc | AC_INTMODE_FALLING_gc | AC_INTLVL_HI_gc | AC_ENABLE_bm; + + CodecBufferPtr = CodecBuffer; // use GPIOR for faster access + BitCount = 1; // FALSCH todo the first modulation of the SOC is "found" implicitly + SampleRegister = 0x00; + + RxPendingSince = SystemGetSysTick(); + + Flags.RxPending = true; + + // reset for future use + CodecBufferIdx = 0; + BitCountUp = 0; + + State = STATE_IDLE; + PORTE.OUTTGL = PIN3_bm; + + //Flags.RxPending = true; //LogEntry(LOG_INFO_CODEC_TX_DATA_W_PARITY, "Codec Sniff Start", 18); //Reader14443A_EOC(); - } \ No newline at end of file diff --git a/Firmware/Chameleon-Mini/Codec/SniffISO14443-2A.c b/Firmware/Chameleon-Mini/Codec/SniffISO14443-2A.c index 48f3ee8..6a20493 100644 --- a/Firmware/Chameleon-Mini/Codec/SniffISO14443-2A.c +++ b/Firmware/Chameleon-Mini/Codec/SniffISO14443-2A.c @@ -13,16 +13,37 @@ #include +bool SniffEnable; +enum RCTraffic TrafficSource; + void Sniff14443ACodecInit(void) { + SniffEnable = true; + TrafficSource = TRAFFIC_READER; + // Start with sniffing Reader->Card direction traffic + // Card -> Reader traffic sniffing interrupt will be enbaled + // when Reader-> Card direction sniffing finished + // See ISO14443-2A.c ISO14443ACodecTask() + ISO14443ACodecInit(); + + // Also configure Interrupt settings for Reader function +// Reader14443ACodecInit(); + } void Sniff14443ACodecDeInit(void) { + ISO14443ACodecDeInit(); Reader14443ACodecDeInit(); } void Sniff14443ACodecTask(void) { - Reader14443ACodecTask(); + if (TrafficSource == TRAFFIC_READER){ + ISO14443ACodecTask(); + } else{ + Reader14443ACodecTask(); + } +// ISO14443ACodecDeInit(); +// Reader14443ACodecTask(); } \ No newline at end of file diff --git a/Firmware/Chameleon-Mini/Codec/SniffISO14443-2A.h b/Firmware/Chameleon-Mini/Codec/SniffISO14443-2A.h index eb0317a..44d50c8 100644 --- a/Firmware/Chameleon-Mini/Codec/SniffISO14443-2A.h +++ b/Firmware/Chameleon-Mini/Codec/SniffISO14443-2A.h @@ -1,5 +1,5 @@ // -// Created by 陈子泰 on 05/07/2018. +// Created by Zitai Chen on 05/07/2018. // #ifndef CHAMELEON_MINI_SNIFFISO14443_2A_H @@ -9,6 +9,8 @@ #include "Codec.h" #include "Terminal/CommandLine.h" +extern bool SniffEnable; +extern enum RCTraffic {TRAFFIC_READER, TRAFFIC_CARD} TrafficSource; /* Codec Interface */ void Sniff14443ACodecInit(void); void Sniff14443ACodecDeInit(void); diff --git a/Firmware/Chameleon-Mini/Configuration.c b/Firmware/Chameleon-Mini/Configuration.c index 22eaf3b..5fda354 100644 --- a/Firmware/Chameleon-Mini/Configuration.c +++ b/Firmware/Chameleon-Mini/Configuration.c @@ -188,9 +188,9 @@ static const PROGMEM ConfigurationType ConfigurationTable[] = { #endif #ifdef CONFIG_ISO14443A_SNIFF_SUPPORT [CONFIG_ISO14443A_SNIFF] = { - .CodecInitFunc = TestSniff14443ACodecInit, - .CodecDeInitFunc = Reader14443ACodecDeInit, - .CodecTaskFunc = Reader14443ACodecTask, + .CodecInitFunc = Sniff14443ACodecInit, + .CodecDeInitFunc = Sniff14443ACodecDeInit, + .CodecTaskFunc = Sniff14443ACodecTask, .ApplicationInitFunc = ApplicationInitDummy, .ApplicationResetFunc = ApplicationResetDummy, .ApplicationTaskFunc = ApplicationTaskDummy, From 288ae733089ebccf73fc5f0a30769daf95b6fdfe Mon Sep 17 00:00:00 2001 From: chenzitai Date: Mon, 9 Jul 2018 19:47:03 +0100 Subject: [PATCH 062/104] Remove repeately called function: CodecInitCommon and keep demod power on (cherry picked from commit 8eb0d58) --- Firmware/Chameleon-Mini/Codec/ISO14443-2A.c | 6 ++-- .../Chameleon-Mini/Codec/Reader14443-2A.c | 28 ++++++++++++------- 2 files changed, 22 insertions(+), 12 deletions(-) diff --git a/Firmware/Chameleon-Mini/Codec/ISO14443-2A.c b/Firmware/Chameleon-Mini/Codec/ISO14443-2A.c index 5d367ef..b0db926 100644 --- a/Firmware/Chameleon-Mini/Codec/ISO14443-2A.c +++ b/Firmware/Chameleon-Mini/Codec/ISO14443-2A.c @@ -408,7 +408,9 @@ void ISO14443ACodecDeInit(void) CODEC_TIMER_LOADMOD.INTFLAGS = TC0_OVFIF_bm; CodecSetSubcarrier(CODEC_SUBCARRIERMOD_OFF, 0); - CodecSetDemodPower(false); + if (!SniffEnable) { + CodecSetDemodPower(false); + } CodecSetLoadmodState(false); } @@ -431,8 +433,8 @@ void ISO14443ACodecTask(void) { ISO14443ACodecDeInit(); - TrafficSource = TRAFFIC_CARD; TestSniff14443ACodecInit(); + TrafficSource = TRAFFIC_CARD; return; } diff --git a/Firmware/Chameleon-Mini/Codec/Reader14443-2A.c b/Firmware/Chameleon-Mini/Codec/Reader14443-2A.c index 84a3a4a..9a0719c 100644 --- a/Firmware/Chameleon-Mini/Codec/Reader14443-2A.c +++ b/Firmware/Chameleon-Mini/Codec/Reader14443-2A.c @@ -70,7 +70,7 @@ void Reader14443ACodecInit(void) { void Reader14443ACodecDeInit(void) { - CodecSetDemodPower(false); +// CodecSetDemodPower(false); // CodecReaderFieldStop(); CODEC_TIMER_SAMPLING.CTRLA = 0; CODEC_TIMER_SAMPLING.INTCTRLB = 0; @@ -399,6 +399,9 @@ void Reader14443ACodecTask(void) } if (BitCount % 8) // copy the last byte, if there is an incomplete byte CodecBuffer[BitCount / 8] = SampleRegister >> (8 - (BitCount % 8)); + +// BitCount = removeParityBits(CodecBuffer, BitCount); + LogEntry(LOG_INFO_CODEC_RX_DATA_W_PARITY, CodecBuffer, (BitCount + 7) / 8); Flags.RxPending=true; @@ -407,9 +410,10 @@ void Reader14443ACodecTask(void) if (SniffEnable) { + LED_PORT.OUTCLR = LED_RED; Reader14443ACodecDeInit(); ISO14443ACodecInit(); - TrafficSource = TRAFFIC_CARD; + TrafficSource = TRAFFIC_READER; return; } @@ -477,9 +481,9 @@ void TestSniff14443ACodecInit(void){ * for incoming data. */ - CodecInitCommon(); +// CodecInitCommon(); - CodecSetDemodPower(true); +// CodecSetDemodPower(true); CODEC_TIMER_SAMPLING.PER = SAMPLE_RATE_SYSTEM_CYCLES - 1; CODEC_TIMER_SAMPLING.CCB = 0; @@ -493,8 +497,8 @@ void TestSniff14443ACodecInit(void){ State = STATE_IDLE; BitCount = 0; - Flags.Start = false; - Flags.RxPending = false; +// Flags.Start = false; +// Flags.RxPending = false; Flags.RxDone = false; /////////////////////////// @@ -502,9 +506,13 @@ void TestSniff14443ACodecInit(void){ StartDemod(); +// CODEC_TIMER_SAMPLING.PER = 5*SAMPLE_RATE_SYSTEM_CYCLES - 1; +// CODEC_TIMER_SAMPLING.INTFLAGS = TC0_CCCIF_bm; +// CODEC_TIMER_SAMPLING.INTCTRLB = TC_CCCINTLVL_OFF_gc; +// CODEC_TIMER_SAMPLING.PERBUF = SAMPLE_RATE_SYSTEM_CYCLES - 1; + PORTE.OUTTGL = PIN3_bm; + // CODEC_TIMER_SAMPLING_CCC_vect - CODEC_TIMER_SAMPLING.INTFLAGS = TC0_CCCIF_bm; - CODEC_TIMER_SAMPLING.INTCTRLB = TC_CCCINTLVL_OFF_gc; /* Enable the AC interrupt, which either finds the SOC and then starts the pause-finding timer, @@ -525,8 +533,8 @@ void TestSniff14443ACodecInit(void){ CodecBufferIdx = 0; BitCountUp = 0; - State = STATE_IDLE; - PORTE.OUTTGL = PIN3_bm; +// State = STATE_IDLE; +// PORTE.OUTTGL = PIN3_bm; //Flags.RxPending = true; From 43ebccbb53ee29def916c82eeda67f1865f3ff6a Mon Sep 17 00:00:00 2001 From: chenzitai Date: Tue, 10 Jul 2018 01:48:17 +0100 Subject: [PATCH 063/104] Remove redundancy code, disable sniff flag when deInit the siniff mode (cherry picked from commit 58df0cd) --- .../Chameleon-Mini/Codec/Reader14443-2A.c | 22 +++++++++---------- .../Chameleon-Mini/Codec/SniffISO14443-2A.c | 3 +-- 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/Firmware/Chameleon-Mini/Codec/Reader14443-2A.c b/Firmware/Chameleon-Mini/Codec/Reader14443-2A.c index 9a0719c..0e2b794 100644 --- a/Firmware/Chameleon-Mini/Codec/Reader14443-2A.c +++ b/Firmware/Chameleon-Mini/Codec/Reader14443-2A.c @@ -496,13 +496,22 @@ void TestSniff14443ACodecInit(void){ CODEC_TIMER_LOADMOD.CTRLA = 0; State = STATE_IDLE; - BitCount = 0; +// BitCount = 0; + CodecBufferPtr = CodecBuffer; // use GPIOR for faster access + BitCount = 1; // FALSCH todo the first modulation of the SOC is "found" implicitly + SampleRegister = 0x00; + // Flags.Start = false; // Flags.RxPending = false; Flags.RxDone = false; /////////////////////////// Flags.Start = true; + // reset for future use +// CodecBufferIdx = 0; +// BitCountUp = 0; + + Flags.RxPending = true; StartDemod(); @@ -510,7 +519,7 @@ void TestSniff14443ACodecInit(void){ // CODEC_TIMER_SAMPLING.INTFLAGS = TC0_CCCIF_bm; // CODEC_TIMER_SAMPLING.INTCTRLB = TC_CCCINTLVL_OFF_gc; // CODEC_TIMER_SAMPLING.PERBUF = SAMPLE_RATE_SYSTEM_CYCLES - 1; - PORTE.OUTTGL = PIN3_bm; +// PORTE.OUTTGL = PIN3_bm; // CODEC_TIMER_SAMPLING_CCC_vect @@ -521,17 +530,8 @@ void TestSniff14443ACodecInit(void){ ACA.STATUS = AC_AC1IF_bm; ACA.AC1CTRL = AC_HSMODE_bm | AC_HYSMODE_NO_gc | AC_INTMODE_FALLING_gc | AC_INTLVL_HI_gc | AC_ENABLE_bm; - CodecBufferPtr = CodecBuffer; // use GPIOR for faster access - BitCount = 1; // FALSCH todo the first modulation of the SOC is "found" implicitly - SampleRegister = 0x00; - RxPendingSince = SystemGetSysTick(); - Flags.RxPending = true; - - // reset for future use - CodecBufferIdx = 0; - BitCountUp = 0; // State = STATE_IDLE; // PORTE.OUTTGL = PIN3_bm; diff --git a/Firmware/Chameleon-Mini/Codec/SniffISO14443-2A.c b/Firmware/Chameleon-Mini/Codec/SniffISO14443-2A.c index 6a20493..6371a2e 100644 --- a/Firmware/Chameleon-Mini/Codec/SniffISO14443-2A.c +++ b/Firmware/Chameleon-Mini/Codec/SniffISO14443-2A.c @@ -28,12 +28,11 @@ void Sniff14443ACodecInit(void) // Also configure Interrupt settings for Reader function // Reader14443ACodecInit(); - - } void Sniff14443ACodecDeInit(void) { + SniffEnable = false; ISO14443ACodecDeInit(); Reader14443ACodecDeInit(); } From 4b23bc379bf10740c4ae0cb7fcf58540bc9ccec9 Mon Sep 17 00:00:00 2001 From: chenzitai Date: Tue, 10 Jul 2018 02:16:41 +0100 Subject: [PATCH 064/104] Refactor SniffISO14443-2A code structure for further modification (cherry picked from commit cd07c68) --- .../Chameleon-Mini/Codec/SniffISO14443-2A.c | 34 ++++++++++++++++--- 1 file changed, 30 insertions(+), 4 deletions(-) diff --git a/Firmware/Chameleon-Mini/Codec/SniffISO14443-2A.c b/Firmware/Chameleon-Mini/Codec/SniffISO14443-2A.c index 6371a2e..0813e6a 100644 --- a/Firmware/Chameleon-Mini/Codec/SniffISO14443-2A.c +++ b/Firmware/Chameleon-Mini/Codec/SniffISO14443-2A.c @@ -16,6 +16,29 @@ bool SniffEnable; enum RCTraffic TrafficSource; +// Card->Reader Direction Traffic +INLINE void CardSniffInit(void) +{ + +} + +INLINE void CardSniffDeinit(void) +{ + Reader14443ACodecDeInit(); +} + +// Reader->Card Direction Traffic +INLINE void ReaderSniffInit(void) +{ + ISO14443ACodecInit(); +} + +INLINE void ReaderSniffDeInit(void) +{ + ISO14443ACodecDeInit(); +} + + void Sniff14443ACodecInit(void) { SniffEnable = true; @@ -24,7 +47,7 @@ void Sniff14443ACodecInit(void) // Card -> Reader traffic sniffing interrupt will be enbaled // when Reader-> Card direction sniffing finished // See ISO14443-2A.c ISO14443ACodecTask() - ISO14443ACodecInit(); + ReaderSniffInit(); // Also configure Interrupt settings for Reader function // Reader14443ACodecInit(); @@ -33,8 +56,9 @@ void Sniff14443ACodecInit(void) void Sniff14443ACodecDeInit(void) { SniffEnable = false; - ISO14443ACodecDeInit(); - Reader14443ACodecDeInit(); + CardSniffDeinit(); + ReaderSniffDeInit(); + } void Sniff14443ACodecTask(void) { @@ -45,4 +69,6 @@ void Sniff14443ACodecTask(void) } // ISO14443ACodecDeInit(); // Reader14443ACodecTask(); -} \ No newline at end of file +} + + From 08404604c21c951dde317ed40b165d87ee77f54c Mon Sep 17 00:00:00 2001 From: chenzitai Date: Tue, 10 Jul 2018 18:42:29 +0100 Subject: [PATCH 065/104] Separate Reader->Card sniffing from the ISO14443-2A code Use PORTB INT1, TCD0 CCD for sampling The card->reader sniffing of this commint may be buggy (cherry picked from commit 73b6c51) --- Firmware/Chameleon-Mini/Codec/Codec.h | 3 +- Firmware/Chameleon-Mini/Codec/ISO14443-2A.c | 19 +- .../Chameleon-Mini/Codec/Reader14443-2A.c | 3 +- .../Chameleon-Mini/Codec/SniffISO14443-2A.c | 310 +++++++++++++++++- 4 files changed, 303 insertions(+), 32 deletions(-) diff --git a/Firmware/Chameleon-Mini/Codec/Codec.h b/Firmware/Chameleon-Mini/Codec/Codec.h index 0a74d25..1e530bc 100644 --- a/Firmware/Chameleon-Mini/Codec/Codec.h +++ b/Firmware/Chameleon-Mini/Codec/Codec.h @@ -141,7 +141,8 @@ INLINE void CodecInitCommon(void) CODEC_DEMOD_IN_PORT.CODEC_DEMOD_IN_PINCTRL0 = PORT_ISC_RISING_gc; CODEC_DEMOD_IN_PORT.CODEC_DEMOD_IN_PINCTRL1 = PORT_ISC_FALLING_gc; CODEC_DEMOD_IN_PORT.INT0MASK = 0; - CODEC_DEMOD_IN_PORT.INTCTRL = PORT_INT0LVL_HI_gc; + CODEC_DEMOD_IN_PORT.INT1MASK = 0; + CODEC_DEMOD_IN_PORT.INTCTRL = PORT_INT0LVL_HI_gc | PORT_INT1LVL_HI_gc; EVSYS.CH0MUX = CODEC_DEMOD_IN_EVMUX0; EVSYS.CH1MUX = CODEC_DEMOD_IN_EVMUX1; diff --git a/Firmware/Chameleon-Mini/Codec/ISO14443-2A.c b/Firmware/Chameleon-Mini/Codec/ISO14443-2A.c index b0db926..1f9d965 100644 --- a/Firmware/Chameleon-Mini/Codec/ISO14443-2A.c +++ b/Firmware/Chameleon-Mini/Codec/ISO14443-2A.c @@ -75,7 +75,7 @@ static void StartDemod(void) { CODEC_TIMER_SAMPLING.INTCTRLB = TC_CCAINTLVL_HI_gc; /* Start looking out for modulation pause via interrupt. */ - CODEC_DEMOD_IN_PORT.INTFLAGS = 0x03; + CODEC_DEMOD_IN_PORT.INTFLAGS = PORT_INT0IF_bm; CODEC_DEMOD_IN_PORT.INT0MASK = CODEC_DEMOD_IN_MASK0; } @@ -408,9 +408,7 @@ void ISO14443ACodecDeInit(void) CODEC_TIMER_LOADMOD.INTFLAGS = TC0_OVFIF_bm; CodecSetSubcarrier(CODEC_SUBCARRIERMOD_OFF, 0); - if (!SniffEnable) { - CodecSetDemodPower(false); - } + CodecSetDemodPower(false); CodecSetLoadmodState(false); } @@ -427,18 +425,6 @@ void ISO14443ACodecTask(void) { LogEntry(LOG_INFO_CODEC_RX_DATA, CodecBuffer, (DemodBitCount+7)/8); LEDHook(LED_CODEC_RX, LED_PULSE); - - if(SniffEnable == true){ - // TODO: Start interrupt for finding Card -> Reader direction traffic - - ISO14443ACodecDeInit(); - - TestSniff14443ACodecInit(); - TrafficSource = TRAFFIC_CARD; - return; - - } - /* Call application if we received data */ AnswerBitCount = ApplicationProcess(CodecBuffer, DemodBitCount); @@ -451,7 +437,6 @@ void ISO14443ACodecTask(void) { /* We have to generate the parity bits ourself */ ParityBufferPtr = 0; } - } if (AnswerBitCount != ISO14443A_APP_NO_RESPONSE) { diff --git a/Firmware/Chameleon-Mini/Codec/Reader14443-2A.c b/Firmware/Chameleon-Mini/Codec/Reader14443-2A.c index 0e2b794..cb52073 100644 --- a/Firmware/Chameleon-Mini/Codec/Reader14443-2A.c +++ b/Firmware/Chameleon-Mini/Codec/Reader14443-2A.c @@ -412,7 +412,8 @@ void Reader14443ACodecTask(void) LED_PORT.OUTCLR = LED_RED; Reader14443ACodecDeInit(); - ISO14443ACodecInit(); + Sniff14443ACodecInit(); +// ISO14443ACodecInit(); TrafficSource = TRAFFIC_READER; return; diff --git a/Firmware/Chameleon-Mini/Codec/SniffISO14443-2A.c b/Firmware/Chameleon-Mini/Codec/SniffISO14443-2A.c index 0813e6a..0ab899c 100644 --- a/Firmware/Chameleon-Mini/Codec/SniffISO14443-2A.c +++ b/Firmware/Chameleon-Mini/Codec/SniffISO14443-2A.c @@ -1,5 +1,7 @@ // // Created by Zitai Chen on 05/07/2018. +// Some interrupt handling vect +// modified form ISO14443-2A.c and Reader14443-2A.c // #include "SniffISO14443-2A.h" @@ -12,14 +14,262 @@ #include "Terminal/Terminal.h" #include +/* Sampling is done using internal clock, synchronized to the field modulation. + * For that we need to convert the bit rate for the internal clock. */ +#define SAMPLE_RATE_SYSTEM_CYCLES ((uint16_t) (((uint64_t) F_CPU * ISO14443A_BIT_RATE_CYCLES) / CODEC_CARRIER_FREQ) ) + +#define ISO14443A_MIN_BITS_PER_FRAME 7 + + +/* Define pseudo variables to use fast register access. This is useful for global vars */ +#define DataRegister Codec8Reg0 +#define StateRegister Codec8Reg1 +#define ParityRegister Codec8Reg2 +#define SampleIdxRegister Codec8Reg2 +#define SampleRegister Codec8Reg3 +#define BitSent CodecCount16Register1 +#define BitCount CodecCount16Register2 +#define CodecBufferPtr CodecPtrRegister1 +#define ParityBufferPtr CodecPtrRegister2 bool SniffEnable; enum RCTraffic TrafficSource; +static volatile struct { + volatile bool DemodFinished; +// volatile bool LoadmodFinished; +} Flags = { 0 }; + +typedef enum { + /* Demod */ + DEMOD_DATA_BIT, + DEMOD_PARITY_BIT, + LOADMOD_FDT, + +} StateType; + +///////////////////////////////////////////////// +// Reader->Card Direction Traffic +///////////////////////////////////////////////// + +void ReaderSniffInit(void) +{ + /* Initialize some global vars and start looking out for reader commands */ + Flags.DemodFinished = 0; + +// ReaderStartDemod(); + + CodecBufferPtr = CodecBuffer; + ParityBufferPtr = &CodecBuffer[ISO14443A_BUFFER_PARITY_OFFSET]; + DataRegister = 0; + SampleRegister = 0; + SampleIdxRegister = 0; + BitCount = 0; + StateRegister = DEMOD_DATA_BIT; + + + /* Configure sampling-timer free running and sync to first modulation-pause. */ + CODEC_TIMER_SAMPLING.CNT = 0; // Reset the timer count + CODEC_TIMER_SAMPLING.PER = SAMPLE_RATE_SYSTEM_CYCLES - 1; // Set Period regisiter + CODEC_TIMER_SAMPLING.CCD = 0xFFFF; /* CCD Interrupt is not active! */ + CODEC_TIMER_SAMPLING.CTRLA = TC_CLKSEL_DIV1_gc; + CODEC_TIMER_SAMPLING.CTRLD = TC_EVACT_RESTART_gc | CODEC_TIMER_MODSTART_EVSEL; + CODEC_TIMER_SAMPLING.INTFLAGS = TC0_CCDIF_bm; + CODEC_TIMER_SAMPLING.INTCTRLB = TC_CCDINTLVL_HI_gc; + + /* Start looking out for modulation pause via interrupt. */ + CODEC_DEMOD_IN_PORT.INTFLAGS = PORT_INT1IF_bm; + CODEC_DEMOD_IN_PORT.INT1MASK = CODEC_DEMOD_IN_MASK0; + +// ISO14443ACodecInit(); +} + + +// Find first pause and start sampling +ISR(PORTB_INT1_vect) { +// LED_PORT.OUTSET = LED_RED; + /* This is the first edge of the first modulation-pause after StartDemod. + * Now we have time to start + * demodulating beginning from one bit-width after this edge. */ + + /* Sampling timer has been preset to sample-rate and has automatically synced + * to THIS first modulation pause. Thus after exactly one bit-width from here, + * an OVF is generated. We want to start sampling with the next bit and use the + * XYZBUF mechanism of the xmega to automatically double the sampling rate on the + * next overflow. For this we have to temporarily deactivate the automatical alignment + * in order to catch next overflow event for updating the BUF registers. + * We want to sample the demodulated data stream in the first quarter of the half-bit + * where the pulsed miller encoded is located. */ + CODEC_TIMER_SAMPLING.CTRLD = TC_EVACT_OFF_gc; + CODEC_TIMER_SAMPLING.PERBUF = SAMPLE_RATE_SYSTEM_CYCLES/2 - 1; /* Half bit width */ + CODEC_TIMER_SAMPLING.CCDBUF = SAMPLE_RATE_SYSTEM_CYCLES/8 - 14 - 1; /* Compensate for DIGFILT and ISR prolog */ + + /* Setup Frame Delay Timer and wire to EVSYS. Frame delay time is + * measured from last change in RF field, therefore we use + * the event channel 1 (end of modulation pause) as the restart event. + * The preliminary frame delay time chosen here is irrelevant, because + * the correct FDT gets set automatically after demodulation. */ + +// CODEC_TIMER_LOADMOD.CNT = 0; +// CODEC_TIMER_LOADMOD.PER = 0xFFFF; +//// CODEC_TIMER_LOADMOD.CTRLD = TC_EVACT_RESTART_gc | CODEC_TIMER_MODEND_EVSEL; +//// CODEC_TIMER_LOADMOD.INTCTRLA = TC_OVFINTLVL_OFF_gc; +//// CODEC_TIMER_LOADMOD.INTFLAGS = TC0_OVFIF_bm; +//// CODEC_TIMER_LOADMOD.CTRLA = CODEC_TIMER_CARRIER_CLKSEL; +// +// CODEC_TIMER_LOADMOD.CTRLA = TC_CLKSEL_OFF_gc; +// CODEC_TIMER_LOADMOD.INTCTRLA = 0; + + /* Disable this interrupt */ + CODEC_DEMOD_IN_PORT.INT1MASK = 0; +} + +// Sampling with timer and demod +ISR(TCD0_CCD_vect) { + /* This interrupt gets called twice for every bit to sample it. */ + uint8_t SamplePin = CODEC_DEMOD_IN_PORT.IN & CODEC_DEMOD_IN_MASK; + + /* Shift sampled bit into sampling register */ + SampleRegister = (SampleRegister << 1) | (!SamplePin ? 0x01 : 0x00); + + if (SampleIdxRegister) { + SampleIdxRegister = 0; + /* Analyze the sampling register after 2 samples. */ + if ((SampleRegister & 0x07) == 0x07) { + /* No carrier modulation for 3 sample points. EOC! */ + CODEC_TIMER_SAMPLING.CTRLA = TC_CLKSEL_OFF_gc; + CODEC_TIMER_SAMPLING.INTFLAGS = TC0_CCDIF_bm; + + /* By this time, the FDT timer is aligned to the last modulation + * edge of the reader. So we disable the auto-synchronization and + * let it count the frame delay time in the background, and generate + * an interrupt once it has reached the FDT. */ + // Do not activate loadmod +// CODEC_TIMER_LOADMOD.CTRLD = TC_EVACT_OFF_gc; +// CODEC_TIMER_LOADMOD.CTRLA = TC_CLKSEL_OFF_gc; +// CODEC_TIMER_LOADMOD.INTCTRLA = 0; + +// if (SampleRegister & 0x08) { +// CODEC_TIMER_LOADMOD.PER = ISO14443A_FRAME_DELAY_PREV1 - 40; /* compensate for ISR prolog */ +// } else { +// CODEC_TIMER_LOADMOD.PER = ISO14443A_FRAME_DELAY_PREV0 - 40; /* compensate for ISR prolog */ +// } + + StateRegister = LOADMOD_FDT; + +// CODEC_TIMER_LOADMOD.INTFLAGS = TC0_OVFIF_bm; +// CODEC_TIMER_LOADMOD.INTCTRLA = TC_OVFINTLVL_HI_gc; + + /* Determine if we did not receive a multiple of 8 bits. + * If this is the case, right-align the remaining data and + * store it into the buffer. */ + uint8_t RemainingBits = BitCount % 8; + if (RemainingBits != 0) { + uint8_t NewDataRegister = DataRegister; + + while (RemainingBits++ < 8) { + /* Pad with zeroes to right-align. */ + NewDataRegister >>= 1; + } + + /* TODO: Prevent buffer overflow */ + *CodecBufferPtr = NewDataRegister; + } + + /* Signal, that we have finished sampling */ + Flags.DemodFinished = 1; + } else { + /* Otherwise, we check the two sample bits from the bit before. */ + uint8_t BitSample = SampleRegister & 0xC; + uint8_t Bit = 0; + + if (BitSample != (0x0 << 2)) { + /* We have a valid bit. decode and process it. */ + if (BitSample & (0x1 << 2)) { + /* 01 sequence or 11 sequence -> This is a zero bit */ + Bit = 0; + } else { + /* 10 sequence -> This is a one bit */ + Bit = 1; + } + + if (StateRegister == DEMOD_DATA_BIT) { + /* This is a data bit, so shift it into the data register and + * hold a local copy of it. */ + uint8_t NewDataRegister = DataRegister >> 1; + NewDataRegister |= (Bit ? 0x80 : 0x00); + DataRegister = NewDataRegister; + + /* Update bitcount */ + uint16_t NewBitCount = ++BitCount; + if ((NewBitCount & 0x07) == 0) { + /* We have reached a byte boundary! Store the data register. */ + /* TODO: Prevent buffer overflow */ + *CodecBufferPtr++ = NewDataRegister; + + /* Store bit for determining FDT at EOC and enable parity + * handling on next bit. */ + StateRegister = DEMOD_PARITY_BIT; + } + + } else if (StateRegister == DEMOD_PARITY_BIT) { + /* This is a parity bit. Store it */ + *ParityBufferPtr++ = Bit; + StateRegister = DEMOD_DATA_BIT; + } else { + /* Should never Happen (TM) */ + } + } else { + /* 00 sequence. -> No valid data yet. This also occurs if we just started + * sampling and have sampled less than 2 bits yet. Thus ignore. */ + } + } + } else { + /* On odd sample position just sample. */ + SampleIdxRegister = ~SampleIdxRegister; + } + + /* Make sure the sampling timer gets automatically aligned to the + * modulation pauses by using the RESTART event. + * This can be understood as a "poor mans PLL" and makes sure that we are + * never too far out the bit-grid while sampling. */ + CODEC_TIMER_SAMPLING.CTRLD = TC_EVACT_RESTART_gc | CODEC_TIMER_MODSTART_EVSEL; +} + + + + +INLINE void ReaderSniffDeInit(void) +{ + /* Gracefully shutdown codec */ + CODEC_DEMOD_IN_PORT.INT1MASK = 0; + + Flags.DemodFinished = 0; + + CODEC_TIMER_SAMPLING.CTRLA = TC_CLKSEL_OFF_gc; + CODEC_TIMER_SAMPLING.CTRLD = TC_EVACT_OFF_gc; + CODEC_TIMER_SAMPLING.INTCTRLB = TC_CCDINTLVL_OFF_gc; + CODEC_TIMER_SAMPLING.INTFLAGS = TC0_CCDIF_bm; + + +// CODEC_TIMER_LOADMOD.CTRLA = TC_CLKSEL_OFF_gc; +// CODEC_TIMER_LOADMOD.CTRLD = TC_EVACT_OFF_gc; +// CODEC_TIMER_LOADMOD.INTCTRLA = TC_OVFINTLVL_OFF_gc; +// CODEC_TIMER_LOADMOD.INTFLAGS = TC0_OVFIF_bm; + +} + + + + + +///////////////////////////////////////////////// // Card->Reader Direction Traffic +///////////////////////////////////////////////// + INLINE void CardSniffInit(void) { - + TestSniff14443ACodecInit(); } INLINE void CardSniffDeinit(void) @@ -27,22 +277,20 @@ INLINE void CardSniffDeinit(void) Reader14443ACodecDeInit(); } -// Reader->Card Direction Traffic -INLINE void ReaderSniffInit(void) -{ - ISO14443ACodecInit(); -} - -INLINE void ReaderSniffDeInit(void) -{ - ISO14443ACodecDeInit(); -} void Sniff14443ACodecInit(void) { + Flags.DemodFinished = 0; + SniffEnable = true; TrafficSource = TRAFFIC_READER; + + // Common Codec Register settings + CodecInitCommon(); + // Enable demodulator power + CodecSetDemodPower(true); + // Start with sniffing Reader->Card direction traffic // Card -> Reader traffic sniffing interrupt will be enbaled // when Reader-> Card direction sniffing finished @@ -58,12 +306,47 @@ void Sniff14443ACodecDeInit(void) SniffEnable = false; CardSniffDeinit(); ReaderSniffDeInit(); - } + + void Sniff14443ACodecTask(void) { + if (TrafficSource == TRAFFIC_READER){ - ISO14443ACodecTask(); + if (Flags.DemodFinished) { + Flags.DemodFinished = 0; + /* Reception finished. Process the received bytes */ + uint16_t DemodBitCount = BitCount; + + if (DemodBitCount >= ISO14443A_MIN_BITS_PER_FRAME) { + // For logging data + LogEntry(LOG_INFO_CODEC_RX_DATA, CodecBuffer, (DemodBitCount+7)/8); + LEDHook(LED_CODEC_RX, LED_PULSE); + + if(SniffEnable == true){ + // TODO: Start interrupt for finding Card -> Reader direction traffic + + ReaderSniffDeInit(); + CardSniffInit(); + +// ISO14443ACodecDeInit(); + +// TestSniff14443ACodecInit(); + TrafficSource = TRAFFIC_CARD; + return; + } + } +// +// /* No data to be processed. Disable loadmodding and start listening again */ +// CODEC_TIMER_LOADMOD.CTRLA = TC_CLKSEL_OFF_gc; +// CODEC_TIMER_LOADMOD.INTCTRLA = 0; + + ReaderSniffInit(); + + } + + + } else{ Reader14443ACodecTask(); } @@ -72,3 +355,4 @@ void Sniff14443ACodecTask(void) } + From c526ab3035c86cbbcb2ee583f81f62cfd4ad73ad Mon Sep 17 00:00:00 2001 From: chenzitai Date: Wed, 11 Jul 2018 02:36:02 +0100 Subject: [PATCH 066/104] Separate Card->Reader code, works for only one round of traffic Buggy commit. Maybe fix the event channel and reinit the timer when switching (cherry picked from commit a43869a) --- .../Chameleon-Mini/Codec/SniffISO14443-2A.c | 397 +++++++++++++++++- 1 file changed, 392 insertions(+), 5 deletions(-) diff --git a/Firmware/Chameleon-Mini/Codec/SniffISO14443-2A.c b/Firmware/Chameleon-Mini/Codec/SniffISO14443-2A.c index 0ab899c..d8617ef 100644 --- a/Firmware/Chameleon-Mini/Codec/SniffISO14443-2A.c +++ b/Firmware/Chameleon-Mini/Codec/SniffISO14443-2A.c @@ -20,6 +20,10 @@ #define ISO14443A_MIN_BITS_PER_FRAME 7 +// Card to reader +#define ISO14443A_PICC_TO_PCD_FDT_PRESCALER TC_CLKSEL_DIV8_gc // please change ISO14443A_PICC_TO_PCD_MIN_FDT when changing this +#define ISO14443A_RX_MINIMUM_BITCOUNT 4 + /* Define pseudo variables to use fast register access. This is useful for global vars */ #define DataRegister Codec8Reg0 @@ -32,13 +36,23 @@ #define CodecBufferPtr CodecPtrRegister1 #define ParityBufferPtr CodecPtrRegister2 + +#define BitCountUp GPIOR7 +#define CodecBufferIdx GPIOR8 + bool SniffEnable; enum RCTraffic TrafficSource; static volatile struct { volatile bool DemodFinished; // volatile bool LoadmodFinished; + volatile bool Start; + volatile bool RxDone; + volatile bool RxPending; + } Flags = { 0 }; +static volatile uint16_t RxPendingSince; + typedef enum { /* Demod */ @@ -48,6 +62,14 @@ typedef enum { } StateType; + +static volatile enum { + STATE_IDLE, + STATE_MILLER_SEND, + STATE_MILLER_EOF, + STATE_FDT +} State; + ///////////////////////////////////////////////// // Reader->Card Direction Traffic ///////////////////////////////////////////////// @@ -267,17 +289,262 @@ INLINE void ReaderSniffDeInit(void) // Card->Reader Direction Traffic ///////////////////////////////////////////////// +INLINE void Insert0(void) +{ + SampleRegister >>= 1; + if (++BitCount % 8) + return; + *CodecBufferPtr++ = SampleRegister; +} + +INLINE void Insert1(void) +{ + SampleRegister = (SampleRegister >> 1) | 0x80; + if (++BitCount % 8) + return; + *CodecBufferPtr++ = SampleRegister; +} + +// This interrupt find Card -> Reader SOC +ISR(ACA_AC0_vect) // this interrupt either finds the SOC or gets triggered before +{ +// LED_PORT.OUTSET=LED_RED; + + ACA.AC0CTRL &= ~AC_INTLVL_HI_gc; // disable this interrupt + // enable the pause-finding timer + CODEC_TIMER_LOADMOD.CTRLD = TC_EVACT_RESTART_gc | TC_EVSEL_CH2_gc; + CODEC_TIMER_LOADMOD.CTRLA = TC_CLKSEL_DIV1_gc; + +} +// Decode the Card -> Reader signal +// according to the pause and modulated period +// if the half bit duration is modulated, then add 1 to buffer +// if the half bit duration is not modulated, then add 0 to buffer +ISR(CODEC_TIMER_LOADMOD_CCB_VECT) // pause found +{ + + + uint8_t tmp = CODEC_TIMER_TIMESTAMPS.CNTL; + CODEC_TIMER_TIMESTAMPS.CNT = 0; + + /* This needs to be done only on the first call, + * but doing this only on a condition means wasting time, so we do it every time. */ + CODEC_TIMER_TIMESTAMPS.CTRLA = TC_CLKSEL_DIV4_gc; + + switch (tmp) // decide how many half bit periods have been modulations + { + case 0 ... 48: // 32 ticks is one half of a bit period + return; + + case 49 ... 80: // 64 ticks are a full bit period + Insert1(); + Insert0(); + return; + + case 81 ... 112: // 96 ticks are 3 half bit periods + if (BitCount & 1) + { + Insert1(); + Insert1(); + Insert0(); + } else { + Insert1(); + Insert0(); + Insert0(); + } + return; + + default: // every value over 96 + 16 (tolerance) is considered to be 4 half bit periods + Insert1(); + Insert1(); + Insert0(); + Insert0(); + return; + } + return; +} +// EOC of Card->Reader found +ISR(TCD1_CCB_vect) // EOC found +{ +// Reader14443A_EOC(); + + CODEC_TIMER_LOADMOD.INTCTRLB = 0; + CODEC_TIMER_LOADMOD.CTRLA = TC_CLKSEL_OFF_gc; + CODEC_TIMER_TIMESTAMPS.INTCTRLB = 0; + CODEC_TIMER_TIMESTAMPS.CTRLA = TC_CLKSEL_OFF_gc; + ACA.AC0CTRL &= ~AC_ENABLE_bm; + + if (BitCount & 1) + { + if (SampleRegister & 0x80) + Insert0(); + else + Insert1(); + } + + if (BitCount % 8) // copy the last byte, if there is an incomplete byte + CodecBuffer[BitCount / 8] = SampleRegister >> (8 - (BitCount % 8)); + Flags.RxDone = true; + Flags.RxPending = false; + + // set up timer that forces the minimum frame delay time from PICC to PCD + CODEC_TIMER_LOADMOD.PER = 0xFFFF; + CODEC_TIMER_LOADMOD.CNT = 0; + CODEC_TIMER_LOADMOD.INTCTRLA = 0; + CODEC_TIMER_LOADMOD.INTCTRLB = 0; + CODEC_TIMER_LOADMOD.CTRLD = 0; + CODEC_TIMER_LOADMOD.CTRLA = ISO14443A_PICC_TO_PCD_FDT_PRESCALER; + + State = STATE_FDT; + +} +//// End of Card-> reader communication and enter frame delay time +//void Reader14443A_EOC(void) +//{ +// +// +//} + + INLINE void CardSniffInit(void) { - TestSniff14443ACodecInit(); + + //////////////////////////// + // Same as reader init + /* Initialize common peripherals and start listening + * for incoming data. */ + + +// CodecInitCommon(); + + +// CodecSetDemodPower(true); + +// CODEC_TIMER_SAMPLING.PER = SAMPLE_RATE_SYSTEM_CYCLES - 1; +// CODEC_TIMER_SAMPLING.CCB = 0; +// CODEC_TIMER_SAMPLING.CCC = 0; + CODEC_TIMER_SAMPLING.CTRLA = TC_CLKSEL_OFF_gc; + CODEC_TIMER_SAMPLING.INTCTRLA = 0; + CODEC_TIMER_SAMPLING.INTCTRLB = TC_CCBINTLVL_OFF_gc; +// CODEC_TIMER_SAMPLING.CTRLA = TC_CLKSEL_DIV1_gc; + + CODEC_TIMER_LOADMOD.CTRLA = 0; + State = STATE_IDLE; + +// BitCount = 0; + CodecBufferPtr = CodecBuffer; // use GPIOR for faster access + BitCount = 1; // FALSCH todo the first modulation of the SOC is "found" implicitly + SampleRegister = 0x00; + +// Flags.Start = false; +// Flags.RxPending = false; + Flags.RxDone = false; + /////////////////////////// + + Flags.Start = true; + // reset for future use +// CodecBufferIdx = 0; +// BitCountUp = 0; + + Flags.RxPending = true; + +// StartDemod(); + + /* + * Prepare for Manchester decoding. + * The basic idea is to use two timers. The first one will be reset everytime the DEMOD signal + * passes a (configurable) threshold. This is realized with the event system and an analog + * comparator. + * Once this timer reaches 3/4 of a bit half (this means it has not been reset this long), we + * assume there is a pause. Now we read the second timers count value and can decide how many + * bit halves had modulations since the last pause. + */ + + // Comparator ADC + /* Configure and enable the analog comparator for finding pauses in the DEMOD signal. */ + ACA.AC0CTRL = AC_HSMODE_bm | AC_HYSMODE_NO_gc | AC_INTMODE_FALLING_gc | AC_ENABLE_bm; + + /* This timer will be used to detect the pauses between the modulation sequences. */ + CODEC_TIMER_LOADMOD.CTRLA = 0; + CODEC_TIMER_LOADMOD.CNT = 0; + CODEC_TIMER_LOADMOD.PER = 0xFFFF; // with 27.12 MHz this is exactly one half bit width + CODEC_TIMER_LOADMOD.CCB = 95; // with 27.12 MHz this is 3/4 of a half bit width + CODEC_TIMER_LOADMOD.INTCTRLA = 0; + CODEC_TIMER_LOADMOD.INTFLAGS = TC1_CCBIF_bm; + CODEC_TIMER_LOADMOD.INTCTRLB = TC_CCBINTLVL_HI_gc; + + /* This timer will be used to find out how many bit halfs since the last pause have been passed. */ + CODEC_TIMER_TIMESTAMPS.CNT = 0; // Reset timer + CODEC_TIMER_TIMESTAMPS.PER = 0xFFFF; + CODEC_TIMER_TIMESTAMPS.CCB = 160; + CODEC_TIMER_TIMESTAMPS.INTCTRLA = 0; + CODEC_TIMER_TIMESTAMPS.INTFLAGS = TC1_CCBIF_bm; // Clear interrupt flag + CODEC_TIMER_TIMESTAMPS.INTCTRLB = TC_CCBINTLVL_LO_gc; + + /* Use the event system for resetting the pause-detecting timer. */ + EVSYS.CH2MUX = EVSYS_CHMUX_ACA_CH0_gc; // on every ACA_AC1 INT + EVSYS.CH2CTRL = EVSYS_DIGFILT_1SAMPLE_gc; + + CODEC_DEMOD_IN_PORT.INTCTRL = 0; + + +// CODEC_TIMER_SAMPLING.PER = 5*SAMPLE_RATE_SYSTEM_CYCLES - 1; +// CODEC_TIMER_SAMPLING.INTFLAGS = TC0_CCCIF_bm; +// CODEC_TIMER_SAMPLING.INTCTRLB = TC_CCCINTLVL_OFF_gc; +// CODEC_TIMER_SAMPLING.PERBUF = SAMPLE_RATE_SYSTEM_CYCLES - 1; +// PORTE.OUTTGL = PIN3_bm; + + // CODEC_TIMER_SAMPLING_CCC_vect + + + /* Enable the AC interrupt, which either finds the SOC and then starts the pause-finding timer, + * or it is triggered before the SOC, which mostly isn't bad at all, since the first pause + * needs to be found. */ + ACA.AC1CTRL = 0; + ACA.STATUS = AC_AC0IF_bm; + ACA.AC0CTRL = AC_HSMODE_bm | AC_HYSMODE_NO_gc | AC_INTMODE_FALLING_gc | AC_INTLVL_HI_gc | AC_ENABLE_bm; + +// RxPendingSince = SystemGetSysTick(); + + +// State = STATE_IDLE; +// PORTE.OUTTGL = PIN3_bm; + + //Flags.RxPending = true; + + //LogEntry(LOG_INFO_CODEC_TX_DATA_W_PARITY, "Codec Sniff Start", 18); + //Reader14443A_EOC(); + } INLINE void CardSniffDeinit(void) { - Reader14443ACodecDeInit(); + // CodecSetDemodPower(false); + // CodecReaderFieldStop(); + CODEC_TIMER_SAMPLING.CTRLA = 0; + CODEC_TIMER_SAMPLING.INTCTRLB = 0; + CODEC_TIMER_LOADMOD.CTRLA = 0; + CODEC_TIMER_LOADMOD.INTCTRLB = 0; + + + + EVSYS.CH2MUX = 0; // on every ACA_AC1 INT + EVSYS.CH2CTRL = 0; + ACA.AC0CTRL = CODEC_AC_DEMOD_SETTINGS; + + + + Flags.RxDone = false; + Flags.RxPending = false; + Flags.Start = false; + +// Reader14443ACodecDeInit(); } +///////////////////////////////////////////////// +// Init and deInit, task, functions for this codec +///////////////////////////////////////////////// void Sniff14443ACodecInit(void) { @@ -342,13 +609,133 @@ void Sniff14443ACodecTask(void) // CODEC_TIMER_LOADMOD.INTCTRLA = 0; ReaderSniffInit(); - } + } + + else // Card->Reader Task + { + + // Waiting for response time out +// if (Flags.RxPending && SYSTICK_DIFF(RxPendingSince) > Reader_FWT + 1) +// { +// Reader14443A_EOC(); +// BitCount = 0; +// Flags.RxDone = true; +// Flags.RxPending = false; +// } +// if (CodecIsReaderToBeRestarted() || !CodecIsReaderFieldReady()) +// return; + if (!Flags.RxPending && (Flags.Start || Flags.RxDone)) + { + +// if (State == STATE_FDT && CODEC_TIMER_LOADMOD.CNT < ISO14443A_PICC_TO_PCD_MIN_FDT) { // we are in frame delay time, so we can return later +// return; +// } + + if (Flags.RxDone && BitCount > 0) // decode the raw received data + { + + if (BitCount < ISO14443A_RX_MINIMUM_BITCOUNT * 2) + { + BitCount = 0; + } else { + uint8_t TmpCodecBuffer[CODEC_BUFFER_SIZE]; + memcpy(TmpCodecBuffer, CodecBuffer, (BitCount + 7) / 8); + + CodecBufferPtr = CodecBuffer; + uint16_t BitCountTmp = 2, TotalBitCount = BitCount; + BitCount = 0; + + bool breakflag = false; + TmpCodecBuffer[0] >>= 2; // with this (and BitCountTmp = 2), the SOC is ignored + + // Manchester Code ISO14443-2 8.2.5 + while (!breakflag && BitCountTmp < TotalBitCount) + { + uint8_t Bit = TmpCodecBuffer[BitCountTmp / 8] & 0x03; + TmpCodecBuffer[BitCountTmp / 8] >>= 2; + switch (Bit) + { + case 0b10: + Insert1(); + break; + + case 0b01: + Insert0(); + break; + + case 0b00: // EOC + breakflag = true; + break; + + default: + // error, should not happen, TODO handle this + break; + } + BitCountTmp += 2; + } + if (BitCount % 8) // copy the last byte, if there is an incomplete byte + CodecBuffer[BitCount / 8] = SampleRegister >> (8 - (BitCount % 8)); + +// BitCount = removeParityBits(CodecBuffer, BitCount); + + LogEntry(LOG_INFO_CODEC_RX_DATA_W_PARITY, CodecBuffer, (BitCount + 7) / 8); + + Flags.RxPending=true; + + +// if (SniffEnable) +// { + +// LED_PORT.OUTCLR = LED_RED; + CardSniffDeinit(); + ReaderSniffInit(); +// Reader14443ACodecDeInit(); +// ISO14443ACodecInit(); + TrafficSource = TRAFFIC_READER; + + return; +// } + } + + } + Flags.Start = false; + Flags.RxDone = false; + + /* Call application with received data */ + BitCount = ApplicationProcess(CodecBuffer, BitCount); + + // Application have data to be sent +// if (false)//BitCount > 0) +// { + +// StartDemod(); +// +// LEDHook(LED_CODEC_TX, LED_PULSE); +// LogEntry(LOG_INFO_CODEC_TX_DATA_W_PARITY, CodecBuffer, (BitCount + 7) / 8); +// +// /* Set state and start timer for Miller encoding. */ +// // Send bits to card using TCD0_CCB interrupt (See Reader14443-ISR.S) +// BufferToSequence(); +// State = STATE_MILLER_SEND; +// CodecBufferPtr = CodecBuffer; +// CODEC_TIMER_SAMPLING.INTFLAGS = TC0_CCBIF_bm; +// CODEC_TIMER_SAMPLING.INTCTRLB = TC_CCBINTLVL_HI_gc; +// _delay_loop_1(85); // Wait for sending to finish + + +// }else{ // No data need to be send or in SNIFFING mode + // TODO: add another sniff flag, in case of no Application data need to be send (Non sniffing mode) +// StartDemod(); +// Reader14443AMillerEOC(); + + // Sniffing mode, enable sampling interrupt only +// } + } +// Reader14443ACodecTask(); - } else{ - Reader14443ACodecTask(); } // ISO14443ACodecDeInit(); // Reader14443ACodecTask(); From cd321aff3d48b6244fc9204ee6722622470f4f2e Mon Sep 17 00:00:00 2001 From: chenzitai Date: Wed, 11 Jul 2018 10:59:43 +0100 Subject: [PATCH 067/104] Event Channel and PORTB int1 bug fix: 1. Use event CH2 for timer resetting 2. Can not sniff the second round of traffic due to the PORTB int1 was disabled in CardSniffInit(). This is reenabled in ReaderSniffInit (cherry picked from commit 24b87e2) --- Firmware/Chameleon-Mini/Codec/Codec.h | 5 +++ .../Chameleon-Mini/Codec/SniffISO14443-2A.c | 43 +++++++++++++------ 2 files changed, 36 insertions(+), 12 deletions(-) diff --git a/Firmware/Chameleon-Mini/Codec/Codec.h b/Firmware/Chameleon-Mini/Codec/Codec.h index 1e530bc..29daa91 100644 --- a/Firmware/Chameleon-Mini/Codec/Codec.h +++ b/Firmware/Chameleon-Mini/Codec/Codec.h @@ -146,6 +146,9 @@ INLINE void CodecInitCommon(void) EVSYS.CH0MUX = CODEC_DEMOD_IN_EVMUX0; EVSYS.CH1MUX = CODEC_DEMOD_IN_EVMUX1; + EVSYS.CH2MUX = CODEC_DEMOD_IN_EVMUX0; + + /* Configure loadmod pin configuration and use a virtual port configuration * for single instruction cycle access */ CODEC_LOADMOD_PORT.DIRSET = CODEC_LOADMOD_MASK; @@ -187,6 +190,8 @@ INLINE void CodecInitCommon(void) /* Configure Analog Comparator 1 to detect SOC */ ACA.AC1MUXCTRL = AC_MUXPOS_DAC_gc | AC_MUXNEG_PIN7_gc; ACA.AC1CTRL = CODEC_AC_DEMOD_SETTINGS; + + } INLINE void CodecSetSubcarrier(SubcarrierModType ModType, uint16_t Divider) diff --git a/Firmware/Chameleon-Mini/Codec/SniffISO14443-2A.c b/Firmware/Chameleon-Mini/Codec/SniffISO14443-2A.c index d8617ef..22fd65e 100644 --- a/Firmware/Chameleon-Mini/Codec/SniffISO14443-2A.c +++ b/Firmware/Chameleon-Mini/Codec/SniffISO14443-2A.c @@ -76,6 +76,22 @@ static volatile enum { void ReaderSniffInit(void) { + + // Common Codec Register settings +// CodecInitCommon(); + + + // Configure interrupt for demod + // This was disabled in CardSniffInit() + CODEC_DEMOD_IN_PORT.INTCTRL = PORT_INT1LVL_HI_gc; + + + // Enable demodulator power +// CodecSetDemodPower(true); + + + TrafficSource = TRAFFIC_READER; + /* Initialize some global vars and start looking out for reader commands */ Flags.DemodFinished = 0; @@ -408,6 +424,7 @@ ISR(TCD1_CCB_vect) // EOC found INLINE void CardSniffInit(void) { + TrafficSource = TRAFFIC_CARD; //////////////////////////// // Same as reader init @@ -530,6 +547,7 @@ INLINE void CardSniffDeinit(void) EVSYS.CH2MUX = 0; // on every ACA_AC1 INT EVSYS.CH2CTRL = 0; + ACA.AC0MUXCTRL = AC_MUXPOS_DAC_gc | AC_MUXNEG_PIN7_gc; ACA.AC0CTRL = CODEC_AC_DEMOD_SETTINGS; @@ -548,10 +566,9 @@ INLINE void CardSniffDeinit(void) void Sniff14443ACodecInit(void) { - Flags.DemodFinished = 0; +// Flags.DemodFinished = 0; - SniffEnable = true; - TrafficSource = TRAFFIC_READER; +// SniffEnable = true; // Common Codec Register settings CodecInitCommon(); @@ -570,9 +587,10 @@ void Sniff14443ACodecInit(void) void Sniff14443ACodecDeInit(void) { - SniffEnable = false; +// SniffEnable = false; CardSniffDeinit(); ReaderSniffDeInit(); + CodecSetDemodPower(false); } @@ -590,18 +608,17 @@ void Sniff14443ACodecTask(void) LogEntry(LOG_INFO_CODEC_RX_DATA, CodecBuffer, (DemodBitCount+7)/8); LEDHook(LED_CODEC_RX, LED_PULSE); - if(SniffEnable == true){ - // TODO: Start interrupt for finding Card -> Reader direction traffic +// if(SniffEnable == true){ + // TODO: Start interrupt for finding Card -> Reader direction traffic - ReaderSniffDeInit(); - CardSniffInit(); + ReaderSniffDeInit(); + CardSniffInit(); // ISO14443ACodecDeInit(); // TestSniff14443ACodecInit(); - TrafficSource = TRAFFIC_CARD; - return; - } + return; +// } } // // /* No data to be processed. Disable loadmodding and start listening again */ @@ -691,10 +708,12 @@ void Sniff14443ACodecTask(void) // LED_PORT.OUTCLR = LED_RED; CardSniffDeinit(); +// TrafficSource = TRAFFIC_READER; ReaderSniffInit(); +// Sniff14443ACodecInit(); +// ReaderSniffInit(); // Reader14443ACodecDeInit(); // ISO14443ACodecInit(); - TrafficSource = TRAFFIC_READER; return; // } From 686691f30ce7675236c0ffb86c4ed9e27d89b90a Mon Sep 17 00:00:00 2001 From: chenzitai Date: Fri, 13 Jul 2018 02:01:53 +0100 Subject: [PATCH 068/104] Remove experimental code in Reader14443-2A.c, make sniffing code independent form Reader14443-2A.c and ISO14443-2A.c (cherry picked from commit 16f4fb1) --- Firmware/Chameleon-Mini/Codec/Codec.h | 2 - .../Chameleon-Mini/Codec/Reader14443-2A.c | 233 ++++-------------- .../Chameleon-Mini/Codec/Reader14443-2A.h | 1 - .../Chameleon-Mini/Codec/SniffISO14443-2A.c | 1 - 4 files changed, 53 insertions(+), 184 deletions(-) diff --git a/Firmware/Chameleon-Mini/Codec/Codec.h b/Firmware/Chameleon-Mini/Codec/Codec.h index 29daa91..34b8e34 100644 --- a/Firmware/Chameleon-Mini/Codec/Codec.h +++ b/Firmware/Chameleon-Mini/Codec/Codec.h @@ -190,8 +190,6 @@ INLINE void CodecInitCommon(void) /* Configure Analog Comparator 1 to detect SOC */ ACA.AC1MUXCTRL = AC_MUXPOS_DAC_gc | AC_MUXNEG_PIN7_gc; ACA.AC1CTRL = CODEC_AC_DEMOD_SETTINGS; - - } INLINE void CodecSetSubcarrier(SubcarrierModType ModType, uint16_t Divider) diff --git a/Firmware/Chameleon-Mini/Codec/Reader14443-2A.c b/Firmware/Chameleon-Mini/Codec/Reader14443-2A.c index cb52073..d9cabbe 100644 --- a/Firmware/Chameleon-Mini/Codec/Reader14443-2A.c +++ b/Firmware/Chameleon-Mini/Codec/Reader14443-2A.c @@ -50,7 +50,6 @@ void Reader14443ACodecInit(void) { CodecInitCommon(); CodecSetDemodPower(true); - CODEC_TIMER_SAMPLING.PER = SAMPLE_RATE_SYSTEM_CYCLES - 1; CODEC_TIMER_SAMPLING.CCB = 0; CODEC_TIMER_SAMPLING.CCC = 0; @@ -67,11 +66,9 @@ void Reader14443ACodecInit(void) { Flags.RxDone = false; } - - void Reader14443ACodecDeInit(void) { -// CodecSetDemodPower(false); - // CodecReaderFieldStop(); + CodecSetDemodPower(false); + CodecReaderFieldStop(); CODEC_TIMER_SAMPLING.CTRLA = 0; CODEC_TIMER_SAMPLING.INTCTRLB = 0; CODEC_TIMER_LOADMOD.CTRLA = 0; @@ -101,7 +98,6 @@ INLINE void Insert1(void) // End of Card-> reader communication and enter frame delay time INLINE void Reader14443A_EOC(void) { - CODEC_TIMER_LOADMOD.INTCTRLB = 0; CODEC_TIMER_LOADMOD.CTRLA = TC_CLKSEL_OFF_gc; CODEC_TIMER_TIMESTAMPS.INTCTRLB = 0; @@ -130,13 +126,10 @@ INLINE void Reader14443A_EOC(void) CODEC_TIMER_LOADMOD.CTRLA = ISO14443A_PICC_TO_PCD_FDT_PRESCALER; State = STATE_FDT; - - } INLINE void BufferToSequence(void) { - uint16_t count = BitCount; if (count > BITS_PER_BYTE * CODEC_BUFFER_SIZE / 2) // todo is this correct? return; @@ -188,11 +181,9 @@ INLINE void BufferToSequence(void) // Frame Delay Time PCD to PICC ends ISR (TCD0_CCC_vect) { - CODEC_TIMER_SAMPLING.INTFLAGS = TC0_CCCIF_bm; CODEC_TIMER_SAMPLING.INTCTRLB = TC_CCCINTLVL_OFF_gc; - /* Enable the AC interrupt, which either finds the SOC and then starts the pause-finding timer, * or it is triggered before the SOC, which mostly isn't bad at all, since the first pause * needs to be found. */ @@ -204,7 +195,6 @@ ISR (TCD0_CCC_vect) SampleRegister = 0x00; RxPendingSince = SystemGetSysTick(); - Flags.RxPending = true; // reset for future use @@ -219,7 +209,6 @@ ISR (TCD0_CCC_vect) // Start Frame delay time PCD to PICC void Reader14443AMillerEOC(void) { - CODEC_TIMER_SAMPLING.PER = 5*SAMPLE_RATE_SYSTEM_CYCLES - 1; CODEC_TIMER_SAMPLING.INTFLAGS = TC0_CCBIF_bm | TC0_CCCIF_bm; CODEC_TIMER_SAMPLING.INTCTRLB = TC_CCBINTLVL_OFF_gc | TC_CCCINTLVL_HI_gc; @@ -236,13 +225,10 @@ ISR(CODEC_TIMER_TIMESTAMPS_CCA_VECT) // EOC found // This interrupt find Card -> Reader SOC ISR(ACA_AC1_vect) // this interrupt either finds the SOC or gets triggered before { - LED_PORT.OUTSET=LED_RED; - ACA.AC1CTRL &= ~AC_INTLVL_HI_gc; // disable this interrupt // enable the pause-finding timer CODEC_TIMER_LOADMOD.CTRLD = TC_EVACT_RESTART_gc | TC_EVSEL_CH0_gc; CODEC_TIMER_LOADMOD.CTRLA = TC_CLKSEL_DIV1_gc; - } // Decode the Card -> Reader signal @@ -251,8 +237,6 @@ ISR(ACA_AC1_vect) // this interrupt either finds the SOC or gets triggered befor // if the half bit duration is not modulated, then add 0 to buffer ISR(CODEC_TIMER_LOADMOD_CCA_VECT) // pause found { - - uint8_t tmp = CODEC_TIMER_TIMESTAMPS.CNTL; CODEC_TIMER_TIMESTAMPS.CNT = 0; @@ -293,71 +277,23 @@ ISR(CODEC_TIMER_LOADMOD_CCA_VECT) // pause found return; } -static void StartDemod(void){ - - - /* - * Prepare for Manchester decoding. - * The basic idea is to use two timers. The first one will be reset everytime the DEMOD signal - * passes a (configurable) threshold. This is realized with the event system and an analog - * comparator. - * Once this timer reaches 3/4 of a bit half (this means it has not been reset this long), we - * assume there is a pause. Now we read the second timers count value and can decide how many - * bit halves had modulations since the last pause. - */ - - // Comparator ADC - /* Configure and enable the analog comparator for finding pauses in the DEMOD signal. */ - ACA.AC1CTRL = AC_HSMODE_bm | AC_HYSMODE_NO_gc | AC_INTMODE_FALLING_gc | AC_ENABLE_bm; - - /* This timer will be used to detect the pauses between the modulation sequences. */ - CODEC_TIMER_LOADMOD.CTRLA = 0; - CODEC_TIMER_LOADMOD.CNT = 0; - CODEC_TIMER_LOADMOD.PER = 0xFFFF; // with 27.12 MHz this is exactly one half bit width - CODEC_TIMER_LOADMOD.CCA = 95; // with 27.12 MHz this is 3/4 of a half bit width - CODEC_TIMER_LOADMOD.INTCTRLA = 0; - CODEC_TIMER_LOADMOD.INTFLAGS = TC1_CCAIF_bm; - CODEC_TIMER_LOADMOD.INTCTRLB = TC_CCAINTLVL_HI_gc; - - /* This timer will be used to find out how many bit halfs since the last pause have been passed. */ - CODEC_TIMER_TIMESTAMPS.CNT = 0; // Reset timer - CODEC_TIMER_TIMESTAMPS.PER = 0xFFFF; - CODEC_TIMER_TIMESTAMPS.CCA = 160; - CODEC_TIMER_TIMESTAMPS.INTCTRLA = 0; - CODEC_TIMER_TIMESTAMPS.INTFLAGS = TC1_CCAIF_bm; // Clear interrupt flag - CODEC_TIMER_TIMESTAMPS.INTCTRLB = TC_CCAINTLVL_LO_gc; - - /* Use the event system for resetting the pause-detecting timer. */ - EVSYS.CH0MUX = EVSYS_CHMUX_ACA_CH1_gc; // on every ACA_AC1 INT - EVSYS.CH0CTRL = EVSYS_DIGFILT_1SAMPLE_gc; - - ACA.AC0CTRL = 0; - CODEC_DEMOD_IN_PORT.INTCTRL = 0; - -} void Reader14443ACodecTask(void) { - - // Waiting for response time out -// if (Flags.RxPending && SYSTICK_DIFF(RxPendingSince) > Reader_FWT + 1) -// { -// Reader14443A_EOC(); -// BitCount = 0; -// Flags.RxDone = true; -// Flags.RxPending = false; -// } -// if (CodecIsReaderToBeRestarted() || !CodecIsReaderFieldReady()) -// return; + if (Flags.RxPending && SYSTICK_DIFF(RxPendingSince) > Reader_FWT + 1) + { + Reader14443A_EOC(); + BitCount = 0; + Flags.RxDone = true; + Flags.RxPending = false; + } + if (CodecIsReaderToBeRestarted() || !CodecIsReaderFieldReady()) + return; if (!Flags.RxPending && (Flags.Start || Flags.RxDone)) { - -// if (State == STATE_FDT && CODEC_TIMER_LOADMOD.CNT < ISO14443A_PICC_TO_PCD_MIN_FDT) { // we are in frame delay time, so we can return later -// return; -// } - + if (State == STATE_FDT && CODEC_TIMER_LOADMOD.CNT < ISO14443A_PICC_TO_PCD_MIN_FDT) // we are in frame delay time, so we can return later + return; if (Flags.RxDone && BitCount > 0) // decode the raw received data { - if (BitCount < ISO14443A_RX_MINIMUM_BITCOUNT * 2) { BitCount = 0; @@ -399,27 +335,9 @@ void Reader14443ACodecTask(void) } if (BitCount % 8) // copy the last byte, if there is an incomplete byte CodecBuffer[BitCount / 8] = SampleRegister >> (8 - (BitCount % 8)); - -// BitCount = removeParityBits(CodecBuffer, BitCount); - + LEDHook(LED_CODEC_RX, LED_PULSE); LogEntry(LOG_INFO_CODEC_RX_DATA_W_PARITY, CodecBuffer, (BitCount + 7) / 8); - - Flags.RxPending=true; - - - if (SniffEnable) - { - - LED_PORT.OUTCLR = LED_RED; - Reader14443ACodecDeInit(); - Sniff14443ACodecInit(); -// ISO14443ACodecInit(); - TrafficSource = TRAFFIC_READER; - - return; - } } - } Flags.Start = false; Flags.RxDone = false; @@ -427,11 +345,44 @@ void Reader14443ACodecTask(void) /* Call application with received data */ BitCount = ApplicationProcess(CodecBuffer, BitCount); - // Application have data to be sent - if (false)//BitCount > 0) + if (BitCount > 0) { + /* + * Prepare for Manchester decoding. + * The basic idea is to use two timers. The first one will be reset everytime the DEMOD signal + * passes a (configurable) threshold. This is realized with the event system and an analog + * comparator. + * Once this timer reaches 3/4 of a bit half (this means it has not been reset this long), we + * assume there is a pause. Now we read the second timers count value and can decide how many + * bit halves had modulations since the last pause. + */ - StartDemod(); + /* Configure and enable the analog comparator for finding pauses in the DEMOD signal. */ + ACA.AC1CTRL = AC_HSMODE_bm | AC_HYSMODE_NO_gc | AC_INTMODE_FALLING_gc | AC_ENABLE_bm; + + /* This timer will be used to detect the pauses between the modulation sequences. */ + CODEC_TIMER_LOADMOD.CTRLA = 0; + CODEC_TIMER_LOADMOD.CNT = 0; + CODEC_TIMER_LOADMOD.PER = 0xFFFF; // with 27.12 MHz this is exactly one half bit width + CODEC_TIMER_LOADMOD.CCA = 95; // with 27.12 MHz this is 3/4 of a half bit width + CODEC_TIMER_LOADMOD.INTCTRLA = 0; + CODEC_TIMER_LOADMOD.INTFLAGS = TC1_CCAIF_bm; + CODEC_TIMER_LOADMOD.INTCTRLB = TC_CCAINTLVL_HI_gc; + + /* This timer will be used to find out how many bit halfs since the last pause have been passed. */ + CODEC_TIMER_TIMESTAMPS.CNT = 0; + CODEC_TIMER_TIMESTAMPS.PER = 0xFFFF; + CODEC_TIMER_TIMESTAMPS.CCA = 160; + CODEC_TIMER_TIMESTAMPS.INTCTRLA = 0; + CODEC_TIMER_TIMESTAMPS.INTFLAGS = TC1_CCAIF_bm; + CODEC_TIMER_TIMESTAMPS.INTCTRLB = TC_CCAINTLVL_LO_gc; + + /* Use the event system for resetting the pause-detecting timer. */ + EVSYS.CH0MUX = EVSYS_CHMUX_ACA_CH1_gc; // on every ACA_AC1 INT + EVSYS.CH0CTRL = EVSYS_DIGFILT_1SAMPLE_gc; + + ACA.AC0CTRL = 0; + CODEC_DEMOD_IN_PORT.INTCTRL = 0; LEDHook(LED_CODEC_TX, LED_PULSE); LogEntry(LOG_INFO_CODEC_TX_DATA_W_PARITY, CodecBuffer, (BitCount + 7) / 8); @@ -443,15 +394,7 @@ void Reader14443ACodecTask(void) CodecBufferPtr = CodecBuffer; CODEC_TIMER_SAMPLING.INTFLAGS = TC0_CCBIF_bm; CODEC_TIMER_SAMPLING.INTCTRLB = TC_CCBINTLVL_HI_gc; - _delay_loop_1(85); // Wait for sending to finish - - - }else{ // No data need to be send or in SNIFFING mode - // TODO: add another sniff flag, in case of no Application data need to be send (Non sniffing mode) -// StartDemod(); -// Reader14443AMillerEOC(); - - // Sniffing mode, enable sampling interrupt only + _delay_loop_1(85); } } } @@ -462,7 +405,7 @@ void Reader14443ACodecStart(void) BitCount = 0; Flags.Start = true; -// CodecReaderFieldStart(); + CodecReaderFieldStart(); } void Reader14443ACodecReset(void) @@ -471,75 +414,5 @@ void Reader14443ACodecReset(void) State = STATE_IDLE; Flags.RxDone = false; Flags.Start = false; - //CodecReaderFieldStop(); + CodecReaderFieldStop(); } - -void TestSniff14443ACodecInit(void){ - - //////////////////////////// - // Same as reader init - /* Initialize common peripherals and start listening - * for incoming data. */ - - -// CodecInitCommon(); - -// CodecSetDemodPower(true); - - CODEC_TIMER_SAMPLING.PER = SAMPLE_RATE_SYSTEM_CYCLES - 1; - CODEC_TIMER_SAMPLING.CCB = 0; - CODEC_TIMER_SAMPLING.CCC = 0; - CODEC_TIMER_SAMPLING.CTRLA = TC_CLKSEL_OFF_gc; - CODEC_TIMER_SAMPLING.INTCTRLA = 0; - CODEC_TIMER_SAMPLING.INTCTRLB = TC_CCBINTLVL_OFF_gc; - CODEC_TIMER_SAMPLING.CTRLA = TC_CLKSEL_DIV1_gc; - - CODEC_TIMER_LOADMOD.CTRLA = 0; - State = STATE_IDLE; - -// BitCount = 0; - CodecBufferPtr = CodecBuffer; // use GPIOR for faster access - BitCount = 1; // FALSCH todo the first modulation of the SOC is "found" implicitly - SampleRegister = 0x00; - -// Flags.Start = false; -// Flags.RxPending = false; - Flags.RxDone = false; - /////////////////////////// - - Flags.Start = true; - // reset for future use -// CodecBufferIdx = 0; -// BitCountUp = 0; - - Flags.RxPending = true; - - StartDemod(); - -// CODEC_TIMER_SAMPLING.PER = 5*SAMPLE_RATE_SYSTEM_CYCLES - 1; -// CODEC_TIMER_SAMPLING.INTFLAGS = TC0_CCCIF_bm; -// CODEC_TIMER_SAMPLING.INTCTRLB = TC_CCCINTLVL_OFF_gc; -// CODEC_TIMER_SAMPLING.PERBUF = SAMPLE_RATE_SYSTEM_CYCLES - 1; -// PORTE.OUTTGL = PIN3_bm; - - // CODEC_TIMER_SAMPLING_CCC_vect - - - /* Enable the AC interrupt, which either finds the SOC and then starts the pause-finding timer, - * or it is triggered before the SOC, which mostly isn't bad at all, since the first pause - * needs to be found. */ - ACA.STATUS = AC_AC1IF_bm; - ACA.AC1CTRL = AC_HSMODE_bm | AC_HYSMODE_NO_gc | AC_INTMODE_FALLING_gc | AC_INTLVL_HI_gc | AC_ENABLE_bm; - - RxPendingSince = SystemGetSysTick(); - - -// State = STATE_IDLE; -// PORTE.OUTTGL = PIN3_bm; - - //Flags.RxPending = true; - - //LogEntry(LOG_INFO_CODEC_TX_DATA_W_PARITY, "Codec Sniff Start", 18); - //Reader14443A_EOC(); - -} \ No newline at end of file diff --git a/Firmware/Chameleon-Mini/Codec/Reader14443-2A.h b/Firmware/Chameleon-Mini/Codec/Reader14443-2A.h index a96fff2..e9a2c1e 100644 --- a/Firmware/Chameleon-Mini/Codec/Reader14443-2A.h +++ b/Firmware/Chameleon-Mini/Codec/Reader14443-2A.h @@ -15,7 +15,6 @@ void Reader14443ACodecInit(void); void Reader14443ACodecDeInit(void); void Reader14443ACodecTask(void); -void TestSniff14443ACodecInit(void); /* Application Interface */ void Reader14443ACodecStart(void); diff --git a/Firmware/Chameleon-Mini/Codec/SniffISO14443-2A.c b/Firmware/Chameleon-Mini/Codec/SniffISO14443-2A.c index 22fd65e..23b04d1 100644 --- a/Firmware/Chameleon-Mini/Codec/SniffISO14443-2A.c +++ b/Firmware/Chameleon-Mini/Codec/SniffISO14443-2A.c @@ -40,7 +40,6 @@ #define BitCountUp GPIOR7 #define CodecBufferIdx GPIOR8 -bool SniffEnable; enum RCTraffic TrafficSource; static volatile struct { From 56d5525beb5a0a690d9520846093d918ae232dcd Mon Sep 17 00:00:00 2001 From: chenzitai Date: Fri, 13 Jul 2018 02:11:03 +0100 Subject: [PATCH 069/104] Remove redundancy comments in SniffISO14443-2A.c (cherry picked from commit b95dfda) --- .../Chameleon-Mini/Codec/SniffISO14443-2A.c | 174 +----------------- 1 file changed, 7 insertions(+), 167 deletions(-) diff --git a/Firmware/Chameleon-Mini/Codec/SniffISO14443-2A.c b/Firmware/Chameleon-Mini/Codec/SniffISO14443-2A.c index 23b04d1..dd1e573 100644 --- a/Firmware/Chameleon-Mini/Codec/SniffISO14443-2A.c +++ b/Firmware/Chameleon-Mini/Codec/SniffISO14443-2A.c @@ -4,6 +4,7 @@ // modified form ISO14443-2A.c and Reader14443-2A.c // +// TODO: implement pending since to automatically reset the sniffing after a period of no traffic #include "SniffISO14443-2A.h" #include "Reader14443-2A.h" @@ -76,26 +77,15 @@ static volatile enum { void ReaderSniffInit(void) { - // Common Codec Register settings -// CodecInitCommon(); - - // Configure interrupt for demod // This was disabled in CardSniffInit() CODEC_DEMOD_IN_PORT.INTCTRL = PORT_INT1LVL_HI_gc; - - // Enable demodulator power -// CodecSetDemodPower(true); - - TrafficSource = TRAFFIC_READER; /* Initialize some global vars and start looking out for reader commands */ Flags.DemodFinished = 0; -// ReaderStartDemod(); - CodecBufferPtr = CodecBuffer; ParityBufferPtr = &CodecBuffer[ISO14443A_BUFFER_PARITY_OFFSET]; DataRegister = 0; @@ -124,7 +114,6 @@ void ReaderSniffInit(void) // Find first pause and start sampling ISR(PORTB_INT1_vect) { -// LED_PORT.OUTSET = LED_RED; /* This is the first edge of the first modulation-pause after StartDemod. * Now we have time to start * demodulating beginning from one bit-width after this edge. */ @@ -141,22 +130,6 @@ ISR(PORTB_INT1_vect) { CODEC_TIMER_SAMPLING.PERBUF = SAMPLE_RATE_SYSTEM_CYCLES/2 - 1; /* Half bit width */ CODEC_TIMER_SAMPLING.CCDBUF = SAMPLE_RATE_SYSTEM_CYCLES/8 - 14 - 1; /* Compensate for DIGFILT and ISR prolog */ - /* Setup Frame Delay Timer and wire to EVSYS. Frame delay time is - * measured from last change in RF field, therefore we use - * the event channel 1 (end of modulation pause) as the restart event. - * The preliminary frame delay time chosen here is irrelevant, because - * the correct FDT gets set automatically after demodulation. */ - -// CODEC_TIMER_LOADMOD.CNT = 0; -// CODEC_TIMER_LOADMOD.PER = 0xFFFF; -//// CODEC_TIMER_LOADMOD.CTRLD = TC_EVACT_RESTART_gc | CODEC_TIMER_MODEND_EVSEL; -//// CODEC_TIMER_LOADMOD.INTCTRLA = TC_OVFINTLVL_OFF_gc; -//// CODEC_TIMER_LOADMOD.INTFLAGS = TC0_OVFIF_bm; -//// CODEC_TIMER_LOADMOD.CTRLA = CODEC_TIMER_CARRIER_CLKSEL; -// -// CODEC_TIMER_LOADMOD.CTRLA = TC_CLKSEL_OFF_gc; -// CODEC_TIMER_LOADMOD.INTCTRLA = 0; - /* Disable this interrupt */ CODEC_DEMOD_IN_PORT.INT1MASK = 0; } @@ -177,26 +150,10 @@ ISR(TCD0_CCD_vect) { CODEC_TIMER_SAMPLING.CTRLA = TC_CLKSEL_OFF_gc; CODEC_TIMER_SAMPLING.INTFLAGS = TC0_CCDIF_bm; - /* By this time, the FDT timer is aligned to the last modulation - * edge of the reader. So we disable the auto-synchronization and - * let it count the frame delay time in the background, and generate - * an interrupt once it has reached the FDT. */ - // Do not activate loadmod -// CODEC_TIMER_LOADMOD.CTRLD = TC_EVACT_OFF_gc; -// CODEC_TIMER_LOADMOD.CTRLA = TC_CLKSEL_OFF_gc; -// CODEC_TIMER_LOADMOD.INTCTRLA = 0; - -// if (SampleRegister & 0x08) { -// CODEC_TIMER_LOADMOD.PER = ISO14443A_FRAME_DELAY_PREV1 - 40; /* compensate for ISR prolog */ -// } else { -// CODEC_TIMER_LOADMOD.PER = ISO14443A_FRAME_DELAY_PREV0 - 40; /* compensate for ISR prolog */ -// } + // FDT timer (CODEC_TIMER_LOADMOD) is diabled StateRegister = LOADMOD_FDT; -// CODEC_TIMER_LOADMOD.INTFLAGS = TC0_OVFIF_bm; -// CODEC_TIMER_LOADMOD.INTCTRLA = TC_OVFINTLVL_HI_gc; - /* Determine if we did not receive a multiple of 8 bits. * If this is the case, right-align the remaining data and * store it into the buffer. */ @@ -287,19 +244,10 @@ INLINE void ReaderSniffDeInit(void) CODEC_TIMER_SAMPLING.CTRLD = TC_EVACT_OFF_gc; CODEC_TIMER_SAMPLING.INTCTRLB = TC_CCDINTLVL_OFF_gc; CODEC_TIMER_SAMPLING.INTFLAGS = TC0_CCDIF_bm; - - -// CODEC_TIMER_LOADMOD.CTRLA = TC_CLKSEL_OFF_gc; -// CODEC_TIMER_LOADMOD.CTRLD = TC_EVACT_OFF_gc; -// CODEC_TIMER_LOADMOD.INTCTRLA = TC_OVFINTLVL_OFF_gc; -// CODEC_TIMER_LOADMOD.INTFLAGS = TC0_OVFIF_bm; - } - - ///////////////////////////////////////////////// // Card->Reader Direction Traffic ///////////////////////////////////////////////// @@ -337,8 +285,6 @@ ISR(ACA_AC0_vect) // this interrupt either finds the SOC or gets triggered befor // if the half bit duration is not modulated, then add 0 to buffer ISR(CODEC_TIMER_LOADMOD_CCB_VECT) // pause found { - - uint8_t tmp = CODEC_TIMER_TIMESTAMPS.CNTL; CODEC_TIMER_TIMESTAMPS.CNT = 0; @@ -376,13 +322,10 @@ ISR(CODEC_TIMER_LOADMOD_CCB_VECT) // pause found Insert0(); return; } - return; } // EOC of Card->Reader found ISR(TCD1_CCB_vect) // EOC found { -// Reader14443A_EOC(); - CODEC_TIMER_LOADMOD.INTCTRLB = 0; CODEC_TIMER_LOADMOD.CTRLA = TC_CLKSEL_OFF_gc; CODEC_TIMER_TIMESTAMPS.INTCTRLB = 0; @@ -413,50 +356,29 @@ ISR(TCD1_CCB_vect) // EOC found State = STATE_FDT; } -//// End of Card-> reader communication and enter frame delay time -//void Reader14443A_EOC(void) -//{ -// -// -//} INLINE void CardSniffInit(void) { TrafficSource = TRAFFIC_CARD; - //////////////////////////// - // Same as reader init /* Initialize common peripherals and start listening - * for incoming data. */ + * for incoming data. */ -// CodecInitCommon(); - - -// CodecSetDemodPower(true); - -// CODEC_TIMER_SAMPLING.PER = SAMPLE_RATE_SYSTEM_CYCLES - 1; -// CODEC_TIMER_SAMPLING.CCB = 0; -// CODEC_TIMER_SAMPLING.CCC = 0; + // No need to implement FDT, timer disabled CODEC_TIMER_SAMPLING.CTRLA = TC_CLKSEL_OFF_gc; CODEC_TIMER_SAMPLING.INTCTRLA = 0; CODEC_TIMER_SAMPLING.INTCTRLB = TC_CCBINTLVL_OFF_gc; -// CODEC_TIMER_SAMPLING.CTRLA = TC_CLKSEL_DIV1_gc; CODEC_TIMER_LOADMOD.CTRLA = 0; State = STATE_IDLE; -// BitCount = 0; CodecBufferPtr = CodecBuffer; // use GPIOR for faster access BitCount = 1; // FALSCH todo the first modulation of the SOC is "found" implicitly SampleRegister = 0x00; -// Flags.Start = false; -// Flags.RxPending = false; Flags.RxDone = false; - /////////////////////////// - Flags.Start = true; // reset for future use // CodecBufferIdx = 0; @@ -464,8 +386,6 @@ INLINE void CardSniffInit(void) Flags.RxPending = true; -// StartDemod(); - /* * Prepare for Manchester decoding. * The basic idea is to use two timers. The first one will be reset everytime the DEMOD signal @@ -503,16 +423,6 @@ INLINE void CardSniffInit(void) CODEC_DEMOD_IN_PORT.INTCTRL = 0; - -// CODEC_TIMER_SAMPLING.PER = 5*SAMPLE_RATE_SYSTEM_CYCLES - 1; -// CODEC_TIMER_SAMPLING.INTFLAGS = TC0_CCCIF_bm; -// CODEC_TIMER_SAMPLING.INTCTRLB = TC_CCCINTLVL_OFF_gc; -// CODEC_TIMER_SAMPLING.PERBUF = SAMPLE_RATE_SYSTEM_CYCLES - 1; -// PORTE.OUTTGL = PIN3_bm; - - // CODEC_TIMER_SAMPLING_CCC_vect - - /* Enable the AC interrupt, which either finds the SOC and then starts the pause-finding timer, * or it is triggered before the SOC, which mostly isn't bad at all, since the first pause * needs to be found. */ @@ -521,16 +431,6 @@ INLINE void CardSniffInit(void) ACA.AC0CTRL = AC_HSMODE_bm | AC_HYSMODE_NO_gc | AC_INTMODE_FALLING_gc | AC_INTLVL_HI_gc | AC_ENABLE_bm; // RxPendingSince = SystemGetSysTick(); - - -// State = STATE_IDLE; -// PORTE.OUTTGL = PIN3_bm; - - //Flags.RxPending = true; - - //LogEntry(LOG_INFO_CODEC_TX_DATA_W_PARITY, "Codec Sniff Start", 18); - //Reader14443A_EOC(); - } INLINE void CardSniffDeinit(void) @@ -565,23 +465,14 @@ INLINE void CardSniffDeinit(void) void Sniff14443ACodecInit(void) { -// Flags.DemodFinished = 0; - -// SniffEnable = true; - // Common Codec Register settings CodecInitCommon(); // Enable demodulator power CodecSetDemodPower(true); // Start with sniffing Reader->Card direction traffic - // Card -> Reader traffic sniffing interrupt will be enbaled - // when Reader-> Card direction sniffing finished - // See ISO14443-2A.c ISO14443ACodecTask() ReaderSniffInit(); - // Also configure Interrupt settings for Reader function -// Reader14443ACodecInit(); } void Sniff14443ACodecDeInit(void) @@ -607,24 +498,13 @@ void Sniff14443ACodecTask(void) LogEntry(LOG_INFO_CODEC_RX_DATA, CodecBuffer, (DemodBitCount+7)/8); LEDHook(LED_CODEC_RX, LED_PULSE); -// if(SniffEnable == true){ - // TODO: Start interrupt for finding Card -> Reader direction traffic - ReaderSniffDeInit(); CardSniffInit(); -// ISO14443ACodecDeInit(); - -// TestSniff14443ACodecInit(); return; -// } } -// -// /* No data to be processed. Disable loadmodding and start listening again */ -// CODEC_TIMER_LOADMOD.CTRLA = TC_CLKSEL_OFF_gc; -// CODEC_TIMER_LOADMOD.INTCTRLA = 0; - - ReaderSniffInit(); + // Get nothing, Start sniff again + ReaderSniffInit(); } @@ -701,21 +581,11 @@ void Sniff14443ACodecTask(void) Flags.RxPending=true; - -// if (SniffEnable) -// { - -// LED_PORT.OUTCLR = LED_RED; + // Disable card sniffing and enable reader sniffing CardSniffDeinit(); -// TrafficSource = TRAFFIC_READER; ReaderSniffInit(); -// Sniff14443ACodecInit(); -// ReaderSniffInit(); -// Reader14443ACodecDeInit(); -// ISO14443ACodecInit(); return; -// } } } @@ -725,38 +595,8 @@ void Sniff14443ACodecTask(void) /* Call application with received data */ BitCount = ApplicationProcess(CodecBuffer, BitCount); - // Application have data to be sent -// if (false)//BitCount > 0) -// { - -// StartDemod(); -// -// LEDHook(LED_CODEC_TX, LED_PULSE); -// LogEntry(LOG_INFO_CODEC_TX_DATA_W_PARITY, CodecBuffer, (BitCount + 7) / 8); -// -// /* Set state and start timer for Miller encoding. */ -// // Send bits to card using TCD0_CCB interrupt (See Reader14443-ISR.S) -// BufferToSequence(); -// State = STATE_MILLER_SEND; -// CodecBufferPtr = CodecBuffer; -// CODEC_TIMER_SAMPLING.INTFLAGS = TC0_CCBIF_bm; -// CODEC_TIMER_SAMPLING.INTCTRLB = TC_CCBINTLVL_HI_gc; -// _delay_loop_1(85); // Wait for sending to finish - - -// }else{ // No data need to be send or in SNIFFING mode - // TODO: add another sniff flag, in case of no Application data need to be send (Non sniffing mode) -// StartDemod(); -// Reader14443AMillerEOC(); - - // Sniffing mode, enable sampling interrupt only -// } } -// Reader14443ACodecTask(); - } -// ISO14443ACodecDeInit(); -// Reader14443ACodecTask(); } From 2fa4a94fb9cd09372921cf9d062e4d83522ec841 Mon Sep 17 00:00:00 2001 From: chenzitai Date: Fri, 13 Jul 2018 13:45:46 +0100 Subject: [PATCH 070/104] name Interrupt vectors (cherry picked from commit 8d15036) --- Firmware/Chameleon-Mini/Codec/Codec.h | 5 +++++ Firmware/Chameleon-Mini/Codec/Reader14443-2A.c | 2 +- Firmware/Chameleon-Mini/Codec/SniffISO14443-2A.c | 6 +++--- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/Firmware/Chameleon-Mini/Codec/Codec.h b/Firmware/Chameleon-Mini/Codec/Codec.h index 34b8e34..09dee73 100644 --- a/Firmware/Chameleon-Mini/Codec/Codec.h +++ b/Firmware/Chameleon-Mini/Codec/Codec.h @@ -39,6 +39,7 @@ #define CODEC_DEMOD_IN_EVMUX0 EVSYS_CHMUX_PORTB_PIN1_gc #define CODEC_DEMOD_IN_EVMUX1 EVSYS_CHMUX_PORTB_PIN2_gc #define CODEC_DEMOD_IN_INT0_VECT PORTB_INT0_vect +#define CODEC_DEMOD_IN_INT1_VECT PORTB_INT1_vect #define CODEC_LOADMOD_PORT PORTC #define CODEC_LOADMOD_MASK PIN6_bm #define CODEC_CARRIER_IN_PORT PORTC @@ -58,6 +59,8 @@ #define CODEC_TIMER_SAMPLING TCD0 #define CODEC_TIMER_SAMPLING_CCA_VECT TCD0_CCA_vect #define CODEC_TIMER_SAMPLING_CCB_VECT TCD0_CCB_vect +#define CODEC_TIMER_SAMPLING_CCC_VECT TCD0_CCC_vect +#define CODEC_TIMER_SAMPLING_CCD_VECT TCD0_CCD_vect #define CODEC_TIMER_LOADMOD TCE0 #define CODEC_TIMER_LOADMOD_OVF_VECT TCE0_OVF_vect #define CODEC_TIMER_LOADMOD_CCA_VECT TCE0_CCA_vect @@ -81,6 +84,8 @@ #define CODEC_THRESHOLD_CALIBRATE_STEPS 16 #define CODEC_TIMER_TIMESTAMPS TCD1 #define CODEC_TIMER_TIMESTAMPS_CCA_VECT TCD1_CCA_vect +#define CODEC_TIMER_TIMESTAMPS_CCB_VECT TCD1_CCB_vect + #define CODEC_BUFFER_SIZE 256 diff --git a/Firmware/Chameleon-Mini/Codec/Reader14443-2A.c b/Firmware/Chameleon-Mini/Codec/Reader14443-2A.c index d9cabbe..1bea53b 100644 --- a/Firmware/Chameleon-Mini/Codec/Reader14443-2A.c +++ b/Firmware/Chameleon-Mini/Codec/Reader14443-2A.c @@ -179,7 +179,7 @@ INLINE void BufferToSequence(void) CodecBuffer[BitCount / 8] = SampleRegister >> (8 - (BitCount % 8)); } // Frame Delay Time PCD to PICC ends -ISR (TCD0_CCC_vect) +ISR (CODEC_TIMER_SAMPLING_CCC_VECT) { CODEC_TIMER_SAMPLING.INTFLAGS = TC0_CCCIF_bm; CODEC_TIMER_SAMPLING.INTCTRLB = TC_CCCINTLVL_OFF_gc; diff --git a/Firmware/Chameleon-Mini/Codec/SniffISO14443-2A.c b/Firmware/Chameleon-Mini/Codec/SniffISO14443-2A.c index dd1e573..b7200a9 100644 --- a/Firmware/Chameleon-Mini/Codec/SniffISO14443-2A.c +++ b/Firmware/Chameleon-Mini/Codec/SniffISO14443-2A.c @@ -113,7 +113,7 @@ void ReaderSniffInit(void) // Find first pause and start sampling -ISR(PORTB_INT1_vect) { +ISR(CODEC_DEMOD_IN_INT1_VECT) { /* This is the first edge of the first modulation-pause after StartDemod. * Now we have time to start * demodulating beginning from one bit-width after this edge. */ @@ -135,7 +135,7 @@ ISR(PORTB_INT1_vect) { } // Sampling with timer and demod -ISR(TCD0_CCD_vect) { +ISR(CODEC_TIMER_SAMPLING_CCD_VECT) { /* This interrupt gets called twice for every bit to sample it. */ uint8_t SamplePin = CODEC_DEMOD_IN_PORT.IN & CODEC_DEMOD_IN_MASK; @@ -324,7 +324,7 @@ ISR(CODEC_TIMER_LOADMOD_CCB_VECT) // pause found } } // EOC of Card->Reader found -ISR(TCD1_CCB_vect) // EOC found +ISR(CODEC_TIMER_TIMESTAMPS_CCB_VECT) // EOC found { CODEC_TIMER_LOADMOD.INTCTRLB = 0; CODEC_TIMER_LOADMOD.CTRLA = TC_CLKSEL_OFF_gc; From 6f020e492fc3002420e4f7aa021a1dd134e6dfa3 Mon Sep 17 00:00:00 2001 From: chenzitai Date: Fri, 13 Jul 2018 17:30:06 +0100 Subject: [PATCH 071/104] Remove unused flags Add timeout for resetting to Reader->Card sniffing when no data get from Card->Reader sniffing (cherry picked from commit 6e88ae7) --- .../Chameleon-Mini/Codec/SniffISO14443-2A.c | 104 ++++++++---------- 1 file changed, 43 insertions(+), 61 deletions(-) diff --git a/Firmware/Chameleon-Mini/Codec/SniffISO14443-2A.c b/Firmware/Chameleon-Mini/Codec/SniffISO14443-2A.c index b7200a9..a6883f6 100644 --- a/Firmware/Chameleon-Mini/Codec/SniffISO14443-2A.c +++ b/Firmware/Chameleon-Mini/Codec/SniffISO14443-2A.c @@ -45,11 +45,7 @@ enum RCTraffic TrafficSource; static volatile struct { volatile bool DemodFinished; -// volatile bool LoadmodFinished; - volatile bool Start; volatile bool RxDone; - volatile bool RxPending; - } Flags = { 0 }; static volatile uint16_t RxPendingSince; @@ -77,6 +73,7 @@ static volatile enum { void ReaderSniffInit(void) { + LED_PORT.OUTCLR = LED_RED; // Configure interrupt for demod // This was disabled in CardSniffInit() CODEC_DEMOD_IN_PORT.INTCTRL = PORT_INT1LVL_HI_gc; @@ -172,7 +169,8 @@ ISR(CODEC_TIMER_SAMPLING_CCD_VECT) { /* Signal, that we have finished sampling */ Flags.DemodFinished = 1; - } else { + } + else { /* Otherwise, we check the two sample bits from the bit before. */ uint8_t BitSample = SampleRegister & 0xC; uint8_t Bit = 0; @@ -182,7 +180,8 @@ ISR(CODEC_TIMER_SAMPLING_CCD_VECT) { if (BitSample & (0x1 << 2)) { /* 01 sequence or 11 sequence -> This is a zero bit */ Bit = 0; - } else { + } + else { /* 10 sequence -> This is a one bit */ Bit = 1; } @@ -206,19 +205,23 @@ ISR(CODEC_TIMER_SAMPLING_CCD_VECT) { StateRegister = DEMOD_PARITY_BIT; } - } else if (StateRegister == DEMOD_PARITY_BIT) { + } + else if (StateRegister == DEMOD_PARITY_BIT) { /* This is a parity bit. Store it */ *ParityBufferPtr++ = Bit; StateRegister = DEMOD_DATA_BIT; - } else { + } + else { /* Should never Happen (TM) */ } - } else { + } + else { /* 00 sequence. -> No valid data yet. This also occurs if we just started * sampling and have sampled less than 2 bits yet. Thus ignore. */ } } - } else { + } + else { /* On odd sample position just sample. */ SampleIdxRegister = ~SampleIdxRegister; } @@ -271,8 +274,6 @@ INLINE void Insert1(void) // This interrupt find Card -> Reader SOC ISR(ACA_AC0_vect) // this interrupt either finds the SOC or gets triggered before { -// LED_PORT.OUTSET=LED_RED; - ACA.AC0CTRL &= ~AC_INTLVL_HI_gc; // disable this interrupt // enable the pause-finding timer CODEC_TIMER_LOADMOD.CTRLD = TC_EVACT_RESTART_gc | TC_EVSEL_CH2_gc; @@ -303,8 +304,7 @@ ISR(CODEC_TIMER_LOADMOD_CCB_VECT) // pause found return; case 81 ... 112: // 96 ticks are 3 half bit periods - if (BitCount & 1) - { + if (BitCount & 1) { Insert1(); Insert1(); Insert0(); @@ -332,8 +332,7 @@ ISR(CODEC_TIMER_TIMESTAMPS_CCB_VECT) // EOC found CODEC_TIMER_TIMESTAMPS.CTRLA = TC_CLKSEL_OFF_gc; ACA.AC0CTRL &= ~AC_ENABLE_bm; - if (BitCount & 1) - { + if (BitCount & 1) { if (SampleRegister & 0x80) Insert0(); else @@ -343,7 +342,6 @@ ISR(CODEC_TIMER_TIMESTAMPS_CCB_VECT) // EOC found if (BitCount % 8) // copy the last byte, if there is an incomplete byte CodecBuffer[BitCount / 8] = SampleRegister >> (8 - (BitCount % 8)); Flags.RxDone = true; - Flags.RxPending = false; // set up timer that forces the minimum frame delay time from PICC to PCD CODEC_TIMER_LOADMOD.PER = 0xFFFF; @@ -379,13 +377,10 @@ INLINE void CardSniffInit(void) SampleRegister = 0x00; Flags.RxDone = false; - Flags.Start = true; // reset for future use // CodecBufferIdx = 0; // BitCountUp = 0; - Flags.RxPending = true; - /* * Prepare for Manchester decoding. * The basic idea is to use two timers. The first one will be reset everytime the DEMOD signal @@ -418,7 +413,7 @@ INLINE void CardSniffInit(void) CODEC_TIMER_TIMESTAMPS.INTCTRLB = TC_CCBINTLVL_LO_gc; /* Use the event system for resetting the pause-detecting timer. */ - EVSYS.CH2MUX = EVSYS_CHMUX_ACA_CH0_gc; // on every ACA_AC1 INT + EVSYS.CH2MUX = EVSYS_CHMUX_ACA_CH0_gc; // on every ACA_AC0 INT EVSYS.CH2CTRL = EVSYS_DIGFILT_1SAMPLE_gc; CODEC_DEMOD_IN_PORT.INTCTRL = 0; @@ -430,13 +425,12 @@ INLINE void CardSniffInit(void) ACA.STATUS = AC_AC0IF_bm; ACA.AC0CTRL = AC_HSMODE_bm | AC_HYSMODE_NO_gc | AC_INTMODE_FALLING_gc | AC_INTLVL_HI_gc | AC_ENABLE_bm; -// RxPendingSince = SystemGetSysTick(); + RxPendingSince = SystemGetSysTick(); } INLINE void CardSniffDeinit(void) { - // CodecSetDemodPower(false); - // CodecReaderFieldStop(); + CODEC_TIMER_SAMPLING.CTRLA = 0; CODEC_TIMER_SAMPLING.INTCTRLB = 0; CODEC_TIMER_LOADMOD.CTRLA = 0; @@ -444,18 +438,14 @@ INLINE void CardSniffDeinit(void) - EVSYS.CH2MUX = 0; // on every ACA_AC1 INT + EVSYS.CH2MUX = 0; // on every ACA_AC0 INT EVSYS.CH2CTRL = 0; ACA.AC0MUXCTRL = AC_MUXPOS_DAC_gc | AC_MUXNEG_PIN7_gc; ACA.AC0CTRL = CODEC_AC_DEMOD_SETTINGS; - - Flags.RxDone = false; - Flags.RxPending = false; - Flags.Start = false; - -// Reader14443ACodecDeInit(); +// Flags.RxPending = false; +// Flags.Start = false; } @@ -486,8 +476,8 @@ void Sniff14443ACodecDeInit(void) void Sniff14443ACodecTask(void) { - - if (TrafficSource == TRAFFIC_READER){ + // Reader->Card Task + if (TrafficSource == TRAFFIC_READER) { if (Flags.DemodFinished) { Flags.DemodFinished = 0; /* Reception finished. Process the received bytes */ @@ -506,26 +496,14 @@ void Sniff14443ACodecTask(void) // Get nothing, Start sniff again ReaderSniffInit(); } - - } - - else // Card->Reader Task + // Card->Reader Task + else { - - // Waiting for response time out -// if (Flags.RxPending && SYSTICK_DIFF(RxPendingSince) > Reader_FWT + 1) -// { -// Reader14443A_EOC(); -// BitCount = 0; -// Flags.RxDone = true; -// Flags.RxPending = false; -// } // if (CodecIsReaderToBeRestarted() || !CodecIsReaderFieldReady()) // return; - if (!Flags.RxPending && (Flags.Start || Flags.RxDone)) - { - + // Receive finished + if (Flags.RxDone) { // if (State == STATE_FDT && CODEC_TIMER_LOADMOD.CNT < ISO14443A_PICC_TO_PCD_MIN_FDT) { // we are in frame delay time, so we can return later // return; // } @@ -533,10 +511,10 @@ void Sniff14443ACodecTask(void) if (Flags.RxDone && BitCount > 0) // decode the raw received data { - if (BitCount < ISO14443A_RX_MINIMUM_BITCOUNT * 2) - { + if (BitCount < ISO14443A_RX_MINIMUM_BITCOUNT * 2) { BitCount = 0; - } else { + } + else { uint8_t TmpCodecBuffer[CODEC_BUFFER_SIZE]; memcpy(TmpCodecBuffer, CodecBuffer, (BitCount + 7) / 8); @@ -548,12 +526,10 @@ void Sniff14443ACodecTask(void) TmpCodecBuffer[0] >>= 2; // with this (and BitCountTmp = 2), the SOC is ignored // Manchester Code ISO14443-2 8.2.5 - while (!breakflag && BitCountTmp < TotalBitCount) - { + while (!breakflag && BitCountTmp < TotalBitCount) { uint8_t Bit = TmpCodecBuffer[BitCountTmp / 8] & 0x03; TmpCodecBuffer[BitCountTmp / 8] >>= 2; - switch (Bit) - { + switch (Bit) { case 0b10: Insert1(); break; @@ -579,22 +555,28 @@ void Sniff14443ACodecTask(void) LogEntry(LOG_INFO_CODEC_RX_DATA_W_PARITY, CodecBuffer, (BitCount + 7) / 8); - Flags.RxPending=true; - // Disable card sniffing and enable reader sniffing CardSniffDeinit(); ReaderSniffInit(); return; } - } - Flags.Start = false; Flags.RxDone = false; /* Call application with received data */ BitCount = ApplicationProcess(CodecBuffer, BitCount); - + } + else // Receive not finished yet, Continue waiting + { + // If Waiting for response time out + // Reset to reader sniffing + if ((SYSTICK_DIFF(RxPendingSince) > Reader_FWT + 1) ) { + Flags.RxDone = true; + // Disable card sniffing and enable reader sniffing + CardSniffDeinit(); + ReaderSniffInit(); + } } } } From cb49799de1d1d06fa93be590c74049603cadf6f6 Mon Sep 17 00:00:00 2001 From: chenzitai Date: Sat, 14 Jul 2018 18:52:48 +0100 Subject: [PATCH 072/104] Fix bug: ACA interrupt start after the card->Reader traffic start, so sometimes get not complete trace Another buffer used for store card->reader traffic is added, so that card->reader traffic sniffing can start right after the reader->Card trafic sniffing finished. (cherry picked from commit e074fcc) --- Firmware/Chameleon-Mini/Codec/Codec.c | 2 +- Firmware/Chameleon-Mini/Codec/Codec.h | 3 + .../Chameleon-Mini/Codec/SniffISO14443-2A.c | 283 ++++++++++-------- 3 files changed, 162 insertions(+), 126 deletions(-) diff --git a/Firmware/Chameleon-Mini/Codec/Codec.c b/Firmware/Chameleon-Mini/Codec/Codec.c index 56f2774..adfb60d 100644 --- a/Firmware/Chameleon-Mini/Codec/Codec.c +++ b/Firmware/Chameleon-Mini/Codec/Codec.c @@ -23,7 +23,7 @@ static volatile struct { } ReaderFieldFlags = { false }; uint8_t CodecBuffer[CODEC_BUFFER_SIZE]; - +uint8_t CodecBuffer2[CODEC_BUFFER_SIZE]; // the following three functions prevent sending data directly after turning on the reader field void CodecReaderFieldStart(void) // DO NOT CALL THIS FUNCTION INSIDE APPLICATION! { diff --git a/Firmware/Chameleon-Mini/Codec/Codec.h b/Firmware/Chameleon-Mini/Codec/Codec.h index 09dee73..cdc82cd 100644 --- a/Firmware/Chameleon-Mini/Codec/Codec.h +++ b/Firmware/Chameleon-Mini/Codec/Codec.h @@ -99,6 +99,8 @@ #define CodecCount16Register2 (*((volatile uint16_t*) &GPIOR6)) /* GPIOR4 & GPIOR5 */ #define CodecPtrRegister1 (*((volatile uint8_t**) &GPIOR8)) #define CodecPtrRegister2 (*((volatile uint8_t**) &GPIORA)) +#define CodecPtrRegister3 (*((volatile uint8_t**) &GPIORC)) + extern uint16_t Reader_FWT; @@ -110,6 +112,7 @@ typedef enum { } SubcarrierModType; extern uint8_t CodecBuffer[CODEC_BUFFER_SIZE]; +extern uint8_t CodecBuffer2[CODEC_BUFFER_SIZE]; INLINE void CodecInit(void) { ActiveConfiguration.CodecInitFunc(); diff --git a/Firmware/Chameleon-Mini/Codec/SniffISO14443-2A.c b/Firmware/Chameleon-Mini/Codec/SniffISO14443-2A.c index a6883f6..ddd4146 100644 --- a/Firmware/Chameleon-Mini/Codec/SniffISO14443-2A.c +++ b/Firmware/Chameleon-Mini/Codec/SniffISO14443-2A.c @@ -30,16 +30,20 @@ #define DataRegister Codec8Reg0 #define StateRegister Codec8Reg1 #define ParityRegister Codec8Reg2 -#define SampleIdxRegister Codec8Reg2 + +#define SampleIdxRegister GPIO4 #define SampleRegister Codec8Reg3 -#define BitSent CodecCount16Register1 +#define SampleRegister2 GPIO5 +//#define BitSent CodecCount16Register1 #define BitCount CodecCount16Register2 #define CodecBufferPtr CodecPtrRegister1 #define ParityBufferPtr CodecPtrRegister2 +#define CodecBufferPtr2 CodecPtrRegister3 -#define BitCountUp GPIOR7 -#define CodecBufferIdx GPIOR8 + +//#define BitCountUp GPIOR7 +//#define CodecBufferIdx GPIOR8 enum RCTraffic TrafficSource; @@ -65,12 +69,12 @@ static volatile enum { STATE_MILLER_EOF, STATE_FDT } State; - +uint16_t DemodBitCount; ///////////////////////////////////////////////// // Reader->Card Direction Traffic ///////////////////////////////////////////////// -void ReaderSniffInit(void) +INLINE void ReaderSniffInit(void) { LED_PORT.OUTCLR = LED_RED; @@ -78,8 +82,6 @@ void ReaderSniffInit(void) // This was disabled in CardSniffInit() CODEC_DEMOD_IN_PORT.INTCTRL = PORT_INT1LVL_HI_gc; - TrafficSource = TRAFFIC_READER; - /* Initialize some global vars and start looking out for reader commands */ Flags.DemodFinished = 0; @@ -107,6 +109,116 @@ void ReaderSniffInit(void) // ISO14443ACodecInit(); } +INLINE void ReaderSniffDeInit(void) +{ + /* Gracefully shutdown codec */ + CODEC_DEMOD_IN_PORT.INT1MASK = 0; + + Flags.DemodFinished = 0; + + CODEC_TIMER_SAMPLING.CTRLA = TC_CLKSEL_OFF_gc; + CODEC_TIMER_SAMPLING.CTRLD = TC_EVACT_OFF_gc; + CODEC_TIMER_SAMPLING.INTCTRLB = TC_CCDINTLVL_OFF_gc; + CODEC_TIMER_SAMPLING.INTFLAGS = TC0_CCDIF_bm; +} + +INLINE void CardSniffInit(void) +{ + /* Initialize common peripherals and start listening + * for incoming data. */ + + + // No need to implement FDT, timer disabled + CODEC_TIMER_SAMPLING.CTRLA = TC_CLKSEL_OFF_gc; + CODEC_TIMER_SAMPLING.INTCTRLA = 0; + CODEC_TIMER_SAMPLING.INTCTRLB = TC_CCBINTLVL_OFF_gc; + + CODEC_TIMER_LOADMOD.CTRLA = 0; + State = STATE_IDLE; + + CodecBufferPtr2 = CodecBuffer2; // use GPIOR for faster access + BitCount = 1; // FALSCH todo the first modulation of the SOC is "found" implicitly + SampleRegister2 = 0x00; + + Flags.RxDone = false; + // reset for future use +// CodecBufferIdx = 0; +// BitCountUp = 0; + + /* + * Prepare for Manchester decoding. + * The basic idea is to use two timers. The first one will be reset everytime the DEMOD signal + * passes a (configurable) threshold. This is realized with the event system and an analog + * comparator. + * Once this timer reaches 3/4 of a bit half (this means it has not been reset this long), we + * assume there is a pause. Now we read the second timers count value and can decide how many + * bit halves had modulations since the last pause. + */ + + // Comparator ADC + /* Configure and enable the analog comparator for finding pauses in the DEMOD signal. */ + ACA.AC0CTRL = AC_HSMODE_bm | AC_HYSMODE_NO_gc | AC_INTMODE_FALLING_gc | AC_ENABLE_bm; + + /* This timer will be used to detect the pauses between the modulation sequences. */ + CODEC_TIMER_LOADMOD.CTRLA = 0; + CODEC_TIMER_LOADMOD.CNT = 0; + CODEC_TIMER_LOADMOD.PER = 0xFFFF; // with 27.12 MHz this is exactly one half bit width + CODEC_TIMER_LOADMOD.CCB = 95; // with 27.12 MHz this is 3/4 of a half bit width + CODEC_TIMER_LOADMOD.INTCTRLA = 0; + CODEC_TIMER_LOADMOD.INTFLAGS = TC1_CCBIF_bm; + CODEC_TIMER_LOADMOD.INTCTRLB = TC_CCBINTLVL_HI_gc; + + /* This timer will be used to find out how many bit halfs since the last pause have been passed. */ + CODEC_TIMER_TIMESTAMPS.CNT = 0; // Reset timer + CODEC_TIMER_TIMESTAMPS.PER = 0xFFFF; + CODEC_TIMER_TIMESTAMPS.CCB = 160; + CODEC_TIMER_TIMESTAMPS.INTCTRLA = 0; + CODEC_TIMER_TIMESTAMPS.INTFLAGS = TC1_CCBIF_bm; // Clear interrupt flag + CODEC_TIMER_TIMESTAMPS.INTCTRLB = TC_CCBINTLVL_LO_gc; + + /* Use the event system for resetting the pause-detecting timer. */ + EVSYS.CH2MUX = EVSYS_CHMUX_ACA_CH0_gc; // on every ACA_AC0 INT + EVSYS.CH2CTRL = EVSYS_DIGFILT_1SAMPLE_gc; + + CODEC_DEMOD_IN_PORT.INTCTRL = 0; + + /* Enable the AC interrupt, which either finds the SOC and then starts the pause-finding timer, + * or it is triggered before the SOC, which mostly isn't bad at all, since the first pause + * needs to be found. */ + ACA.AC1CTRL = 0; + ACA.STATUS = AC_AC0IF_bm; + ACA.AC0CTRL = AC_HSMODE_bm | AC_HYSMODE_NO_gc | AC_INTMODE_FALLING_gc | AC_INTLVL_HI_gc | AC_ENABLE_bm; + + RxPendingSince = SystemGetSysTick(); + PORTE.OUTSET = PIN3_bm; + + +} + +INLINE void CardSniffDeinit(void) +{ + PORTE.OUTCLR = PIN3_bm; + + + CODEC_TIMER_SAMPLING.CTRLA = 0; + CODEC_TIMER_SAMPLING.INTCTRLB = 0; + CODEC_TIMER_LOADMOD.CTRLA = 0; + CODEC_TIMER_LOADMOD.INTCTRLB = 0; + + + + EVSYS.CH2MUX = 0; // on every ACA_AC0 INT + EVSYS.CH2CTRL = 0; + ACA.AC0MUXCTRL = AC_MUXPOS_DAC_gc | AC_MUXNEG_PIN7_gc; + ACA.AC0CTRL = CODEC_AC_DEMOD_SETTINGS; + + Flags.RxDone = false; +// Flags.RxPending = false; +// Flags.Start = false; + + +} + // Find first pause and start sampling @@ -169,6 +281,23 @@ ISR(CODEC_TIMER_SAMPLING_CCD_VECT) { /* Signal, that we have finished sampling */ Flags.DemodFinished = 1; + DemodBitCount = BitCount; + + /* Gracefully shutdown codec */ + CODEC_DEMOD_IN_PORT.INT1MASK = 0; + +// Flags.DemodFinished = 0; + + CODEC_TIMER_SAMPLING.CTRLA = TC_CLKSEL_OFF_gc; + CODEC_TIMER_SAMPLING.CTRLD = TC_EVACT_OFF_gc; + CODEC_TIMER_SAMPLING.INTCTRLB = TC_CCDINTLVL_OFF_gc; + CODEC_TIMER_SAMPLING.INTFLAGS = TC0_CCDIF_bm; + + +// ReaderSniffDeInit(); + CardSniffInit(); + return; + } else { /* Otherwise, we check the two sample bits from the bit before. */ @@ -236,18 +365,7 @@ ISR(CODEC_TIMER_SAMPLING_CCD_VECT) { -INLINE void ReaderSniffDeInit(void) -{ - /* Gracefully shutdown codec */ - CODEC_DEMOD_IN_PORT.INT1MASK = 0; - Flags.DemodFinished = 0; - - CODEC_TIMER_SAMPLING.CTRLA = TC_CLKSEL_OFF_gc; - CODEC_TIMER_SAMPLING.CTRLD = TC_EVACT_OFF_gc; - CODEC_TIMER_SAMPLING.INTCTRLB = TC_CCDINTLVL_OFF_gc; - CODEC_TIMER_SAMPLING.INTFLAGS = TC0_CCDIF_bm; -} @@ -257,18 +375,18 @@ INLINE void ReaderSniffDeInit(void) INLINE void Insert0(void) { - SampleRegister >>= 1; + SampleRegister2 >>= 1; if (++BitCount % 8) return; - *CodecBufferPtr++ = SampleRegister; + *CodecBufferPtr2++ = SampleRegister2; } INLINE void Insert1(void) { - SampleRegister = (SampleRegister >> 1) | 0x80; + SampleRegister2 = (SampleRegister2 >> 1) | 0x80; if (++BitCount % 8) return; - *CodecBufferPtr++ = SampleRegister; + *CodecBufferPtr2++ = SampleRegister2; } // This interrupt find Card -> Reader SOC @@ -333,14 +451,14 @@ ISR(CODEC_TIMER_TIMESTAMPS_CCB_VECT) // EOC found ACA.AC0CTRL &= ~AC_ENABLE_bm; if (BitCount & 1) { - if (SampleRegister & 0x80) + if (SampleRegister2 & 0x80) Insert0(); else Insert1(); } if (BitCount % 8) // copy the last byte, if there is an incomplete byte - CodecBuffer[BitCount / 8] = SampleRegister >> (8 - (BitCount % 8)); + CodecBuffer2[BitCount / 8] = SampleRegister2 >> (8 - (BitCount % 8)); Flags.RxDone = true; // set up timer that forces the minimum frame delay time from PICC to PCD @@ -356,97 +474,6 @@ ISR(CODEC_TIMER_TIMESTAMPS_CCB_VECT) // EOC found } -INLINE void CardSniffInit(void) -{ - TrafficSource = TRAFFIC_CARD; - - /* Initialize common peripherals and start listening - * for incoming data. */ - - - // No need to implement FDT, timer disabled - CODEC_TIMER_SAMPLING.CTRLA = TC_CLKSEL_OFF_gc; - CODEC_TIMER_SAMPLING.INTCTRLA = 0; - CODEC_TIMER_SAMPLING.INTCTRLB = TC_CCBINTLVL_OFF_gc; - - CODEC_TIMER_LOADMOD.CTRLA = 0; - State = STATE_IDLE; - - CodecBufferPtr = CodecBuffer; // use GPIOR for faster access - BitCount = 1; // FALSCH todo the first modulation of the SOC is "found" implicitly - SampleRegister = 0x00; - - Flags.RxDone = false; - // reset for future use -// CodecBufferIdx = 0; -// BitCountUp = 0; - - /* - * Prepare for Manchester decoding. - * The basic idea is to use two timers. The first one will be reset everytime the DEMOD signal - * passes a (configurable) threshold. This is realized with the event system and an analog - * comparator. - * Once this timer reaches 3/4 of a bit half (this means it has not been reset this long), we - * assume there is a pause. Now we read the second timers count value and can decide how many - * bit halves had modulations since the last pause. - */ - - // Comparator ADC - /* Configure and enable the analog comparator for finding pauses in the DEMOD signal. */ - ACA.AC0CTRL = AC_HSMODE_bm | AC_HYSMODE_NO_gc | AC_INTMODE_FALLING_gc | AC_ENABLE_bm; - - /* This timer will be used to detect the pauses between the modulation sequences. */ - CODEC_TIMER_LOADMOD.CTRLA = 0; - CODEC_TIMER_LOADMOD.CNT = 0; - CODEC_TIMER_LOADMOD.PER = 0xFFFF; // with 27.12 MHz this is exactly one half bit width - CODEC_TIMER_LOADMOD.CCB = 95; // with 27.12 MHz this is 3/4 of a half bit width - CODEC_TIMER_LOADMOD.INTCTRLA = 0; - CODEC_TIMER_LOADMOD.INTFLAGS = TC1_CCBIF_bm; - CODEC_TIMER_LOADMOD.INTCTRLB = TC_CCBINTLVL_HI_gc; - - /* This timer will be used to find out how many bit halfs since the last pause have been passed. */ - CODEC_TIMER_TIMESTAMPS.CNT = 0; // Reset timer - CODEC_TIMER_TIMESTAMPS.PER = 0xFFFF; - CODEC_TIMER_TIMESTAMPS.CCB = 160; - CODEC_TIMER_TIMESTAMPS.INTCTRLA = 0; - CODEC_TIMER_TIMESTAMPS.INTFLAGS = TC1_CCBIF_bm; // Clear interrupt flag - CODEC_TIMER_TIMESTAMPS.INTCTRLB = TC_CCBINTLVL_LO_gc; - - /* Use the event system for resetting the pause-detecting timer. */ - EVSYS.CH2MUX = EVSYS_CHMUX_ACA_CH0_gc; // on every ACA_AC0 INT - EVSYS.CH2CTRL = EVSYS_DIGFILT_1SAMPLE_gc; - - CODEC_DEMOD_IN_PORT.INTCTRL = 0; - - /* Enable the AC interrupt, which either finds the SOC and then starts the pause-finding timer, - * or it is triggered before the SOC, which mostly isn't bad at all, since the first pause - * needs to be found. */ - ACA.AC1CTRL = 0; - ACA.STATUS = AC_AC0IF_bm; - ACA.AC0CTRL = AC_HSMODE_bm | AC_HYSMODE_NO_gc | AC_INTMODE_FALLING_gc | AC_INTLVL_HI_gc | AC_ENABLE_bm; - - RxPendingSince = SystemGetSysTick(); -} - -INLINE void CardSniffDeinit(void) -{ - - CODEC_TIMER_SAMPLING.CTRLA = 0; - CODEC_TIMER_SAMPLING.INTCTRLB = 0; - CODEC_TIMER_LOADMOD.CTRLA = 0; - CODEC_TIMER_LOADMOD.INTCTRLB = 0; - - - - EVSYS.CH2MUX = 0; // on every ACA_AC0 INT - EVSYS.CH2CTRL = 0; - ACA.AC0MUXCTRL = AC_MUXPOS_DAC_gc | AC_MUXNEG_PIN7_gc; - ACA.AC0CTRL = CODEC_AC_DEMOD_SETTINGS; - - Flags.RxDone = false; -// Flags.RxPending = false; -// Flags.Start = false; -} ///////////////////////////////////////////////// @@ -455,12 +482,14 @@ INLINE void CardSniffDeinit(void) void Sniff14443ACodecInit(void) { + PORTE.DIRSET= PIN3_bm; // Common Codec Register settings CodecInitCommon(); // Enable demodulator power CodecSetDemodPower(true); // Start with sniffing Reader->Card direction traffic + TrafficSource = TRAFFIC_READER; ReaderSniffInit(); } @@ -476,24 +505,25 @@ void Sniff14443ACodecDeInit(void) void Sniff14443ACodecTask(void) { + // Reader->Card Task if (TrafficSource == TRAFFIC_READER) { if (Flags.DemodFinished) { Flags.DemodFinished = 0; /* Reception finished. Process the received bytes */ - uint16_t DemodBitCount = BitCount; +// uint16_t DemodBitCount = BitCount; if (DemodBitCount >= ISO14443A_MIN_BITS_PER_FRAME) { // For logging data LogEntry(LOG_INFO_CODEC_RX_DATA, CodecBuffer, (DemodBitCount+7)/8); LEDHook(LED_CODEC_RX, LED_PULSE); - ReaderSniffDeInit(); - CardSniffInit(); + TrafficSource = TRAFFIC_CARD; return; } // Get nothing, Start sniff again + TrafficSource = TRAFFIC_READER; ReaderSniffInit(); } } @@ -503,7 +533,7 @@ void Sniff14443ACodecTask(void) // if (CodecIsReaderToBeRestarted() || !CodecIsReaderFieldReady()) // return; // Receive finished - if (Flags.RxDone) { + if (Flags.RxDone ) { // if (State == STATE_FDT && CODEC_TIMER_LOADMOD.CNT < ISO14443A_PICC_TO_PCD_MIN_FDT) { // we are in frame delay time, so we can return later // return; // } @@ -516,9 +546,9 @@ void Sniff14443ACodecTask(void) } else { uint8_t TmpCodecBuffer[CODEC_BUFFER_SIZE]; - memcpy(TmpCodecBuffer, CodecBuffer, (BitCount + 7) / 8); + memcpy(TmpCodecBuffer, CodecBuffer2, (BitCount + 7) / 8); - CodecBufferPtr = CodecBuffer; + CodecBufferPtr2 = CodecBuffer2; uint16_t BitCountTmp = 2, TotalBitCount = BitCount; BitCount = 0; @@ -549,14 +579,15 @@ void Sniff14443ACodecTask(void) BitCountTmp += 2; } if (BitCount % 8) // copy the last byte, if there is an incomplete byte - CodecBuffer[BitCount / 8] = SampleRegister >> (8 - (BitCount % 8)); + CodecBuffer2[BitCount / 8] = SampleRegister2 >> (8 - (BitCount % 8)); // BitCount = removeParityBits(CodecBuffer, BitCount); - LogEntry(LOG_INFO_CODEC_RX_DATA_W_PARITY, CodecBuffer, (BitCount + 7) / 8); + LogEntry(LOG_INFO_CODEC_RX_DATA_W_PARITY, CodecBuffer2, (BitCount + 7) / 8); // Disable card sniffing and enable reader sniffing CardSniffDeinit(); + TrafficSource = TRAFFIC_READER; ReaderSniffInit(); return; @@ -565,7 +596,7 @@ void Sniff14443ACodecTask(void) Flags.RxDone = false; /* Call application with received data */ - BitCount = ApplicationProcess(CodecBuffer, BitCount); + BitCount = ApplicationProcess(CodecBuffer2, BitCount); } else // Receive not finished yet, Continue waiting { @@ -575,10 +606,12 @@ void Sniff14443ACodecTask(void) Flags.RxDone = true; // Disable card sniffing and enable reader sniffing CardSniffDeinit(); + TrafficSource = TRAFFIC_READER; ReaderSniffInit(); } } } + } From bf41815dbd042f65f3c1ffe610e1e499802c4135 Mon Sep 17 00:00:00 2001 From: chenzitai Date: Mon, 16 Jul 2018 17:35:57 +0100 Subject: [PATCH 073/104] Sniffing Code Optimization Remove code related to FDT in sniffing mode Remove some redundant variables (cherry picked from commit 7254eb2) --- .../Chameleon-Mini/Codec/SniffISO14443-2A.c | 320 +++++++----------- .../Chameleon-Mini/Codec/SniffISO14443-2A.h | 1 - 2 files changed, 125 insertions(+), 196 deletions(-) diff --git a/Firmware/Chameleon-Mini/Codec/SniffISO14443-2A.c b/Firmware/Chameleon-Mini/Codec/SniffISO14443-2A.c index ddd4146..ca3ab4b 100644 --- a/Firmware/Chameleon-Mini/Codec/SniffISO14443-2A.c +++ b/Firmware/Chameleon-Mini/Codec/SniffISO14443-2A.c @@ -1,10 +1,10 @@ // // Created by Zitai Chen on 05/07/2018. -// Some interrupt handling vect -// modified form ISO14443-2A.c and Reader14443-2A.c +// Sniffing Function of ISO14443-2A cards +// Wors in both direction: PCD->PICC, PICC->PCD, +// modified from ISO14443-2A.c and Reader14443-2A.c // -// TODO: implement pending since to automatically reset the sniffing after a period of no traffic #include "SniffISO14443-2A.h" #include "Reader14443-2A.h" @@ -17,34 +17,27 @@ /* Sampling is done using internal clock, synchronized to the field modulation. * For that we need to convert the bit rate for the internal clock. */ -#define SAMPLE_RATE_SYSTEM_CYCLES ((uint16_t) (((uint64_t) F_CPU * ISO14443A_BIT_RATE_CYCLES) / CODEC_CARRIER_FREQ) ) - +#define SAMPLE_RATE_SYSTEM_CYCLES ((uint16_t) (((uint64_t) F_CPU * ISO14443A_BIT_RATE_CYCLES) / CODEC_CARRIER_FREQ) ) #define ISO14443A_MIN_BITS_PER_FRAME 7 // Card to reader #define ISO14443A_PICC_TO_PCD_FDT_PRESCALER TC_CLKSEL_DIV8_gc // please change ISO14443A_PICC_TO_PCD_MIN_FDT when changing this -#define ISO14443A_RX_MINIMUM_BITCOUNT 4 - +#define ISO14443A_RX_MINIMUM_BITCOUNT 4 /* Define pseudo variables to use fast register access. This is useful for global vars */ #define DataRegister Codec8Reg0 #define StateRegister Codec8Reg1 #define ParityRegister Codec8Reg2 -#define SampleIdxRegister GPIO4 -#define SampleRegister Codec8Reg3 -#define SampleRegister2 GPIO5 -//#define BitSent CodecCount16Register1 +#define SampleIdxRegister Codec8Reg3 +#define ReaderSampleR GPIOR4 +#define CardSampleR GPIOR5 #define BitCount CodecCount16Register2 -#define CodecBufferPtr CodecPtrRegister1 +#define ReaderBufferPtr CodecPtrRegister1 #define ParityBufferPtr CodecPtrRegister2 -#define CodecBufferPtr2 CodecPtrRegister3 +#define CardBufferPtr CodecPtrRegister3 - -//#define BitCountUp GPIOR7 -//#define CodecBufferIdx GPIOR8 - enum RCTraffic TrafficSource; static volatile struct { @@ -53,23 +46,16 @@ static volatile struct { } Flags = { 0 }; static volatile uint16_t RxPendingSince; - typedef enum { - /* Demod */ - DEMOD_DATA_BIT, + DEMOD_DATA_BIT, /* Demod */ DEMOD_PARITY_BIT, - LOADMOD_FDT, - } StateType; - -static volatile enum { - STATE_IDLE, - STATE_MILLER_SEND, - STATE_MILLER_EOF, - STATE_FDT -} State; uint16_t DemodBitCount; + +INLINE void CardSniffInit(void); +INLINE void CardSniffDeinit(void); + ///////////////////////////////////////////////// // Reader->Card Direction Traffic ///////////////////////////////////////////////// @@ -79,16 +65,15 @@ INLINE void ReaderSniffInit(void) LED_PORT.OUTCLR = LED_RED; // Configure interrupt for demod - // This was disabled in CardSniffInit() CODEC_DEMOD_IN_PORT.INTCTRL = PORT_INT1LVL_HI_gc; /* Initialize some global vars and start looking out for reader commands */ Flags.DemodFinished = 0; - CodecBufferPtr = CodecBuffer; + ReaderBufferPtr = CodecBuffer; ParityBufferPtr = &CodecBuffer[ISO14443A_BUFFER_PARITY_OFFSET]; DataRegister = 0; - SampleRegister = 0; + ReaderSampleR = 0; SampleIdxRegister = 0; BitCount = 0; StateRegister = DEMOD_DATA_BIT; @@ -106,13 +91,12 @@ INLINE void ReaderSniffInit(void) /* Start looking out for modulation pause via interrupt. */ CODEC_DEMOD_IN_PORT.INTFLAGS = PORT_INT1IF_bm; CODEC_DEMOD_IN_PORT.INT1MASK = CODEC_DEMOD_IN_MASK0; - -// ISO14443ACodecInit(); } INLINE void ReaderSniffDeInit(void) { /* Gracefully shutdown codec */ CODEC_DEMOD_IN_PORT.INT1MASK = 0; + CODEC_DEMOD_IN_PORT.INTCTRL = 0; Flags.DemodFinished = 0; @@ -122,104 +106,6 @@ INLINE void ReaderSniffDeInit(void) CODEC_TIMER_SAMPLING.INTFLAGS = TC0_CCDIF_bm; } -INLINE void CardSniffInit(void) -{ - /* Initialize common peripherals and start listening - * for incoming data. */ - - - // No need to implement FDT, timer disabled - CODEC_TIMER_SAMPLING.CTRLA = TC_CLKSEL_OFF_gc; - CODEC_TIMER_SAMPLING.INTCTRLA = 0; - CODEC_TIMER_SAMPLING.INTCTRLB = TC_CCBINTLVL_OFF_gc; - - CODEC_TIMER_LOADMOD.CTRLA = 0; - State = STATE_IDLE; - - CodecBufferPtr2 = CodecBuffer2; // use GPIOR for faster access - BitCount = 1; // FALSCH todo the first modulation of the SOC is "found" implicitly - SampleRegister2 = 0x00; - - Flags.RxDone = false; - // reset for future use -// CodecBufferIdx = 0; -// BitCountUp = 0; - - /* - * Prepare for Manchester decoding. - * The basic idea is to use two timers. The first one will be reset everytime the DEMOD signal - * passes a (configurable) threshold. This is realized with the event system and an analog - * comparator. - * Once this timer reaches 3/4 of a bit half (this means it has not been reset this long), we - * assume there is a pause. Now we read the second timers count value and can decide how many - * bit halves had modulations since the last pause. - */ - - // Comparator ADC - /* Configure and enable the analog comparator for finding pauses in the DEMOD signal. */ - ACA.AC0CTRL = AC_HSMODE_bm | AC_HYSMODE_NO_gc | AC_INTMODE_FALLING_gc | AC_ENABLE_bm; - - /* This timer will be used to detect the pauses between the modulation sequences. */ - CODEC_TIMER_LOADMOD.CTRLA = 0; - CODEC_TIMER_LOADMOD.CNT = 0; - CODEC_TIMER_LOADMOD.PER = 0xFFFF; // with 27.12 MHz this is exactly one half bit width - CODEC_TIMER_LOADMOD.CCB = 95; // with 27.12 MHz this is 3/4 of a half bit width - CODEC_TIMER_LOADMOD.INTCTRLA = 0; - CODEC_TIMER_LOADMOD.INTFLAGS = TC1_CCBIF_bm; - CODEC_TIMER_LOADMOD.INTCTRLB = TC_CCBINTLVL_HI_gc; - - /* This timer will be used to find out how many bit halfs since the last pause have been passed. */ - CODEC_TIMER_TIMESTAMPS.CNT = 0; // Reset timer - CODEC_TIMER_TIMESTAMPS.PER = 0xFFFF; - CODEC_TIMER_TIMESTAMPS.CCB = 160; - CODEC_TIMER_TIMESTAMPS.INTCTRLA = 0; - CODEC_TIMER_TIMESTAMPS.INTFLAGS = TC1_CCBIF_bm; // Clear interrupt flag - CODEC_TIMER_TIMESTAMPS.INTCTRLB = TC_CCBINTLVL_LO_gc; - - /* Use the event system for resetting the pause-detecting timer. */ - EVSYS.CH2MUX = EVSYS_CHMUX_ACA_CH0_gc; // on every ACA_AC0 INT - EVSYS.CH2CTRL = EVSYS_DIGFILT_1SAMPLE_gc; - - CODEC_DEMOD_IN_PORT.INTCTRL = 0; - - /* Enable the AC interrupt, which either finds the SOC and then starts the pause-finding timer, - * or it is triggered before the SOC, which mostly isn't bad at all, since the first pause - * needs to be found. */ - ACA.AC1CTRL = 0; - ACA.STATUS = AC_AC0IF_bm; - ACA.AC0CTRL = AC_HSMODE_bm | AC_HYSMODE_NO_gc | AC_INTMODE_FALLING_gc | AC_INTLVL_HI_gc | AC_ENABLE_bm; - - RxPendingSince = SystemGetSysTick(); - PORTE.OUTSET = PIN3_bm; - - -} - -INLINE void CardSniffDeinit(void) -{ - PORTE.OUTCLR = PIN3_bm; - - - CODEC_TIMER_SAMPLING.CTRLA = 0; - CODEC_TIMER_SAMPLING.INTCTRLB = 0; - CODEC_TIMER_LOADMOD.CTRLA = 0; - CODEC_TIMER_LOADMOD.INTCTRLB = 0; - - - - EVSYS.CH2MUX = 0; // on every ACA_AC0 INT - EVSYS.CH2CTRL = 0; - ACA.AC0MUXCTRL = AC_MUXPOS_DAC_gc | AC_MUXNEG_PIN7_gc; - ACA.AC0CTRL = CODEC_AC_DEMOD_SETTINGS; - - Flags.RxDone = false; -// Flags.RxPending = false; -// Flags.Start = false; - - -} - - // Find first pause and start sampling ISR(CODEC_DEMOD_IN_INT1_VECT) { @@ -249,19 +135,23 @@ ISR(CODEC_TIMER_SAMPLING_CCD_VECT) { uint8_t SamplePin = CODEC_DEMOD_IN_PORT.IN & CODEC_DEMOD_IN_MASK; /* Shift sampled bit into sampling register */ - SampleRegister = (SampleRegister << 1) | (!SamplePin ? 0x01 : 0x00); + ReaderSampleR = (ReaderSampleR << 1) | (!SamplePin ? 0x01 : 0x00); if (SampleIdxRegister) { SampleIdxRegister = 0; /* Analyze the sampling register after 2 samples. */ - if ((SampleRegister & 0x07) == 0x07) { + if ((ReaderSampleR & 0x07) == 0x07) { /* No carrier modulation for 3 sample points. EOC! */ + + // Shutdown the Reader->Card Sniffing, + // disable the sampling timer + CODEC_TIMER_SAMPLING.CTRLA = TC_CLKSEL_OFF_gc; CODEC_TIMER_SAMPLING.INTFLAGS = TC0_CCDIF_bm; - - // FDT timer (CODEC_TIMER_LOADMOD) is diabled - - StateRegister = LOADMOD_FDT; + CODEC_TIMER_SAMPLING.INTCTRLB = TC_CCDINTLVL_OFF_gc; + CODEC_DEMOD_IN_PORT.INTCTRL = 0; // Disable CODEC_DEMOD_IN_PORT interrupt + // CTRLD already disabled in CODEC_DEMOD_IN_INT1_VECT, + // so no need to disable it again it here /* Determine if we did not receive a multiple of 8 bits. * If this is the case, right-align the remaining data and @@ -276,32 +166,22 @@ ISR(CODEC_TIMER_SAMPLING_CCD_VECT) { } /* TODO: Prevent buffer overflow */ - *CodecBufferPtr = NewDataRegister; + *ReaderBufferPtr = NewDataRegister; } /* Signal, that we have finished sampling */ Flags.DemodFinished = 1; DemodBitCount = BitCount; - /* Gracefully shutdown codec */ - CODEC_DEMOD_IN_PORT.INT1MASK = 0; - -// Flags.DemodFinished = 0; - - CODEC_TIMER_SAMPLING.CTRLA = TC_CLKSEL_OFF_gc; - CODEC_TIMER_SAMPLING.CTRLD = TC_EVACT_OFF_gc; - CODEC_TIMER_SAMPLING.INTCTRLB = TC_CCDINTLVL_OFF_gc; - CODEC_TIMER_SAMPLING.INTFLAGS = TC0_CCDIF_bm; - - -// ReaderSniffDeInit(); + // Start Card->Reader Sniffing without waiting for the complete of CodecTask + // Otherwise some bit will not be captured CardSniffInit(); return; } else { /* Otherwise, we check the two sample bits from the bit before. */ - uint8_t BitSample = SampleRegister & 0xC; + uint8_t BitSample = ReaderSampleR & 0xC; uint8_t Bit = 0; if (BitSample != (0x0 << 2)) { @@ -327,7 +207,7 @@ ISR(CODEC_TIMER_SAMPLING_CCD_VECT) { if ((NewBitCount & 0x07) == 0) { /* We have reached a byte boundary! Store the data register. */ /* TODO: Prevent buffer overflow */ - *CodecBufferPtr++ = NewDataRegister; + *ReaderBufferPtr++ = NewDataRegister; /* Store bit for determining FDT at EOC and enable parity * handling on next bit. */ @@ -362,31 +242,102 @@ ISR(CODEC_TIMER_SAMPLING_CCD_VECT) { CODEC_TIMER_SAMPLING.CTRLD = TC_EVACT_RESTART_gc | CODEC_TIMER_MODSTART_EVSEL; } - - - - - - - ///////////////////////////////////////////////// // Card->Reader Direction Traffic ///////////////////////////////////////////////// +INLINE void CardSniffInit(void) +{ + /* Initialize common peripherals and start listening + * for incoming data. */ + + CardBufferPtr = CodecBuffer2; // use GPIOR for faster access + BitCount = 1; // FALSCH todo the first modulation of the SOC is "found" implicitly + CardSampleR = 0x00; + + Flags.RxDone = false; + + /* + * Prepare for Manchester decoding. + * The basic idea is to use two timers. The first one will be reset everytime the DEMOD signal + * passes a (configurable) threshold. This is realized with the event system and an analog + * comparator. + * Once this timer reaches 3/4 of a bit half (this means it has not been reset this long), we + * assume there is a pause. Now we read the second timers count value and can decide how many + * bit halves had modulations since the last pause. + */ + + // Comparator ADC + /* Configure and enable the analog comparator for finding pauses in the DEMOD signal. */ + ACA.AC0CTRL = AC_HSMODE_bm | AC_HYSMODE_NO_gc | AC_INTMODE_FALLING_gc | AC_ENABLE_bm; + + /* This timer will be used to detect the pauses between the modulation sequences. */ + CODEC_TIMER_LOADMOD.CTRLA = 0; + CODEC_TIMER_LOADMOD.CNT = 0; + CODEC_TIMER_LOADMOD.PER = 0xFFFF; // with 27.12 MHz this is exactly one half bit width + CODEC_TIMER_LOADMOD.CCB = 95; // with 27.12 MHz this is 3/4 of a half bit width + CODEC_TIMER_LOADMOD.INTCTRLA = 0; + CODEC_TIMER_LOADMOD.INTFLAGS = TC1_CCBIF_bm; + CODEC_TIMER_LOADMOD.INTCTRLB = TC_CCBINTLVL_HI_gc; + + /* This timer will be used to find out how many bit halfs since the last pause have been passed. */ + CODEC_TIMER_TIMESTAMPS.CNT = 0; // Reset timer + CODEC_TIMER_TIMESTAMPS.PER = 0xFFFF; + CODEC_TIMER_TIMESTAMPS.CCB = 160; + CODEC_TIMER_TIMESTAMPS.INTCTRLA = 0; + CODEC_TIMER_TIMESTAMPS.INTFLAGS = TC1_CCBIF_bm; // Clear interrupt flag + CODEC_TIMER_TIMESTAMPS.INTCTRLB = TC_CCBINTLVL_LO_gc; + + /* Use the event system for resetting the pause-detecting timer. */ + EVSYS.CH2MUX = EVSYS_CHMUX_ACA_CH0_gc; // on every ACA_AC0 INT + EVSYS.CH2CTRL = EVSYS_DIGFILT_1SAMPLE_gc; + + /* Enable the AC interrupt, which either finds the SOC and then starts the pause-finding timer, + * or it is triggered before the SOC, which mostly isn't bad at all, since the first pause + * needs to be found. */ + ACA.AC1CTRL = 0; + ACA.STATUS = AC_AC0IF_bm; + ACA.AC0CTRL = AC_HSMODE_bm | AC_HYSMODE_NO_gc | AC_INTMODE_FALLING_gc | AC_INTLVL_HI_gc | AC_ENABLE_bm; + + RxPendingSince = SystemGetSysTick(); + PORTE.OUTSET = PIN3_bm; + + +} + +INLINE void CardSniffDeinit(void) +{ + PORTE.OUTCLR = PIN3_bm; + + CODEC_TIMER_LOADMOD.CTRLA = 0; + CODEC_TIMER_LOADMOD.INTCTRLB = 0; + + // Disable event system CH2 + EVSYS.CH2MUX = 0; + EVSYS.CH2CTRL = 0; + // Reset ACA AC0 to default setting + ACA.AC0MUXCTRL = AC_MUXPOS_DAC_gc | AC_MUXNEG_PIN7_gc; + ACA.AC0CTRL = CODEC_AC_DEMOD_SETTINGS; + + Flags.RxDone = false; +} + + + INLINE void Insert0(void) { - SampleRegister2 >>= 1; + CardSampleR >>= 1; if (++BitCount % 8) return; - *CodecBufferPtr2++ = SampleRegister2; + *CardBufferPtr++ = CardSampleR; } INLINE void Insert1(void) { - SampleRegister2 = (SampleRegister2 >> 1) | 0x80; + CardSampleR = (CardSampleR >> 1) | 0x80; if (++BitCount % 8) return; - *CodecBufferPtr2++ = SampleRegister2; + *CardBufferPtr++ = CardSampleR; } // This interrupt find Card -> Reader SOC @@ -444,38 +395,28 @@ ISR(CODEC_TIMER_LOADMOD_CCB_VECT) // pause found // EOC of Card->Reader found ISR(CODEC_TIMER_TIMESTAMPS_CCB_VECT) // EOC found { - CODEC_TIMER_LOADMOD.INTCTRLB = 0; - CODEC_TIMER_LOADMOD.CTRLA = TC_CLKSEL_OFF_gc; + // Disable LOADMOD Timer + CODEC_TIMER_LOADMOD.INTCTRLB = 0; // Disable Interrupt + CODEC_TIMER_LOADMOD.CTRLA = TC_CLKSEL_OFF_gc; // Disable Clock + CODEC_TIMER_LOADMOD.CTRLD = 0; // Disable connection to event channel + CODEC_TIMER_TIMESTAMPS.INTCTRLB = 0; CODEC_TIMER_TIMESTAMPS.CTRLA = TC_CLKSEL_OFF_gc; ACA.AC0CTRL &= ~AC_ENABLE_bm; if (BitCount & 1) { - if (SampleRegister2 & 0x80) + if (CardSampleR & 0x80) Insert0(); else Insert1(); } if (BitCount % 8) // copy the last byte, if there is an incomplete byte - CodecBuffer2[BitCount / 8] = SampleRegister2 >> (8 - (BitCount % 8)); + CodecBuffer2[BitCount / 8] = CardSampleR >> (8 - (BitCount % 8)); Flags.RxDone = true; - // set up timer that forces the minimum frame delay time from PICC to PCD - CODEC_TIMER_LOADMOD.PER = 0xFFFF; - CODEC_TIMER_LOADMOD.CNT = 0; - CODEC_TIMER_LOADMOD.INTCTRLA = 0; - CODEC_TIMER_LOADMOD.INTCTRLB = 0; - CODEC_TIMER_LOADMOD.CTRLD = 0; - CODEC_TIMER_LOADMOD.CTRLA = ISO14443A_PICC_TO_PCD_FDT_PRESCALER; - - State = STATE_FDT; - } - - - ///////////////////////////////////////////////// // Init and deInit, task, functions for this codec ///////////////////////////////////////////////// @@ -505,13 +446,11 @@ void Sniff14443ACodecDeInit(void) void Sniff14443ACodecTask(void) { - // Reader->Card Task if (TrafficSource == TRAFFIC_READER) { if (Flags.DemodFinished) { Flags.DemodFinished = 0; /* Reception finished. Process the received bytes */ -// uint16_t DemodBitCount = BitCount; if (DemodBitCount >= ISO14443A_MIN_BITS_PER_FRAME) { // For logging data @@ -530,14 +469,8 @@ void Sniff14443ACodecTask(void) // Card->Reader Task else { -// if (CodecIsReaderToBeRestarted() || !CodecIsReaderFieldReady()) -// return; // Receive finished - if (Flags.RxDone ) { -// if (State == STATE_FDT && CODEC_TIMER_LOADMOD.CNT < ISO14443A_PICC_TO_PCD_MIN_FDT) { // we are in frame delay time, so we can return later -// return; -// } - + if (Flags.RxDone) { if (Flags.RxDone && BitCount > 0) // decode the raw received data { @@ -548,7 +481,7 @@ void Sniff14443ACodecTask(void) uint8_t TmpCodecBuffer[CODEC_BUFFER_SIZE]; memcpy(TmpCodecBuffer, CodecBuffer2, (BitCount + 7) / 8); - CodecBufferPtr2 = CodecBuffer2; + CardBufferPtr = CodecBuffer2; uint16_t BitCountTmp = 2, TotalBitCount = BitCount; BitCount = 0; @@ -579,7 +512,7 @@ void Sniff14443ACodecTask(void) BitCountTmp += 2; } if (BitCount % 8) // copy the last byte, if there is an incomplete byte - CodecBuffer2[BitCount / 8] = SampleRegister2 >> (8 - (BitCount % 8)); + CodecBuffer2[BitCount / 8] = CardSampleR >> (8 - (BitCount % 8)); // BitCount = removeParityBits(CodecBuffer, BitCount); @@ -613,6 +546,3 @@ void Sniff14443ACodecTask(void) } } - - - diff --git a/Firmware/Chameleon-Mini/Codec/SniffISO14443-2A.h b/Firmware/Chameleon-Mini/Codec/SniffISO14443-2A.h index 44d50c8..b8616b0 100644 --- a/Firmware/Chameleon-Mini/Codec/SniffISO14443-2A.h +++ b/Firmware/Chameleon-Mini/Codec/SniffISO14443-2A.h @@ -9,7 +9,6 @@ #include "Codec.h" #include "Terminal/CommandLine.h" -extern bool SniffEnable; extern enum RCTraffic {TRAFFIC_READER, TRAFFIC_CARD} TrafficSource; /* Codec Interface */ void Sniff14443ACodecInit(void); From 2a3b5c51ef2871bf5cb2af93ae6bca5f1f4abce2 Mon Sep 17 00:00:00 2001 From: chenzitai Date: Mon, 16 Jul 2018 18:27:16 +0100 Subject: [PATCH 074/104] Add new log type for sniffing log (cherry picked from commit e63396e) --- Firmware/Chameleon-Mini/Codec/SniffISO14443-2A.c | 6 +++--- Firmware/Chameleon-Mini/Log.h | 8 ++++++++ Software/Chameleon/Log.py | 6 ++++++ Software/chamlog.py | 2 +- 4 files changed, 18 insertions(+), 4 deletions(-) diff --git a/Firmware/Chameleon-Mini/Codec/SniffISO14443-2A.c b/Firmware/Chameleon-Mini/Codec/SniffISO14443-2A.c index ca3ab4b..6d4b996 100644 --- a/Firmware/Chameleon-Mini/Codec/SniffISO14443-2A.c +++ b/Firmware/Chameleon-Mini/Codec/SniffISO14443-2A.c @@ -454,7 +454,7 @@ void Sniff14443ACodecTask(void) if (DemodBitCount >= ISO14443A_MIN_BITS_PER_FRAME) { // For logging data - LogEntry(LOG_INFO_CODEC_RX_DATA, CodecBuffer, (DemodBitCount+7)/8); + LogEntry(LOG_INFO_CODEC_SNI_READER_DATA, CodecBuffer, (DemodBitCount+7)/8); LEDHook(LED_CODEC_RX, LED_PULSE); TrafficSource = TRAFFIC_CARD; @@ -515,8 +515,8 @@ void Sniff14443ACodecTask(void) CodecBuffer2[BitCount / 8] = CardSampleR >> (8 - (BitCount % 8)); // BitCount = removeParityBits(CodecBuffer, BitCount); - - LogEntry(LOG_INFO_CODEC_RX_DATA_W_PARITY, CodecBuffer2, (BitCount + 7) / 8); + LEDHook(LED_CODEC_RX, LED_PULSE); + LogEntry(LOG_INFO_CODEC_SNI_CARD_DATA_W_PARITY, CodecBuffer2, (BitCount + 7) / 8); // Disable card sniffing and enable reader sniffing CardSniffDeinit(); diff --git a/Firmware/Chameleon-Mini/Log.h b/Firmware/Chameleon-Mini/Log.h index ce0bbfd..3fd3a31 100644 --- a/Firmware/Chameleon-Mini/Log.h +++ b/Firmware/Chameleon-Mini/Log.h @@ -23,6 +23,14 @@ typedef enum { LOG_INFO_CODEC_RX_DATA_W_PARITY = 0x42, ///< Currently active codec received data. LOG_INFO_CODEC_TX_DATA_W_PARITY = 0x43, ///< Currently active codec sent data. + LOG_INFO_CODEC_SNI_READER_DATA = 0x44, //< Sniffing codec receive data from reader + LOG_INFO_CODEC_SNI_READER_DATA_W_PARITY = 0x45, //< Sniffing codec receive data from reader + + LOG_INFO_CODEC_SNI_CARD_DATA = 0x46, //< Sniffing codec receive data from card + LOG_INFO_CODEC_SNI_CARD_DATA_W_PARITY = 0x47, //< Sniffing codec receive data from card + + + /* App */ LOG_INFO_APP_CMD_READ = 0x80, ///< Application processed read command. LOG_INFO_APP_CMD_WRITE = 0x81, ///< Application processed write command. diff --git a/Software/Chameleon/Log.py b/Software/Chameleon/Log.py index bcf7a24..0614e1b 100644 --- a/Software/Chameleon/Log.py +++ b/Software/Chameleon/Log.py @@ -25,6 +25,12 @@ eventTypes = { 0x42: { 'name': 'CODEC RX W/PARITY', 'decoder': binaryDecoder }, 0x43: { 'name': 'CODEC TX W/PARITY', 'decoder': binaryDecoder }, + 0x44: { 'name': 'CODEC RX SNI READER', 'decoder': binaryDecoder }, + 0x45: { 'name': 'CODEC RX SNI READER W/PARITY', 'decoder': binaryDecoder }, + 0x46: { 'name': 'CODEC RX SNI CARD', 'decoder': binaryDecoder }, + 0x47: { 'name': 'CODEC RX SNI CARD W/PARITY', 'decoder': binaryDecoder }, + + 0x80: { 'name': 'APP READ', 'decoder': binaryDecoder }, 0x81: { 'name': 'APP WRITE', 'decoder': binaryDecoder }, 0x84: { 'name': 'APP INC', 'decoder': binaryDecoder }, diff --git a/Software/chamlog.py b/Software/chamlog.py index e73d503..76dd87e 100755 --- a/Software/chamlog.py +++ b/Software/chamlog.py @@ -19,7 +19,7 @@ def verboseLog(text): def formatText(log): formatString = '{timestamp:0>5d} ms <{deltaTimestamp:>+6d} ms>:' - formatString += '{eventName:<16} ({dataLength:<3} bytes) [{data}]\n' + formatString += '{eventName:<28} ({dataLength:<3} bytes)\t[{data}]\n' text = '' for logEntry in log: From 14a6bc3c74e2eda48ec327fe7ab98bf997507e01 Mon Sep 17 00:00:00 2001 From: chenzitai Date: Tue, 17 Jul 2018 05:01:35 +0100 Subject: [PATCH 075/104] Fix bug, card traffic is not right when using logmode=memory Print log after a round finished Otherwise it will take too much cpu cycles then the card traffic sniffing may not start in time (cherry picked from commit 48c89f5) --- Firmware/Chameleon-Mini/Codec/SniffISO14443-2A.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/Firmware/Chameleon-Mini/Codec/SniffISO14443-2A.c b/Firmware/Chameleon-Mini/Codec/SniffISO14443-2A.c index 6d4b996..feb110c 100644 --- a/Firmware/Chameleon-Mini/Codec/SniffISO14443-2A.c +++ b/Firmware/Chameleon-Mini/Codec/SniffISO14443-2A.c @@ -43,6 +43,7 @@ enum RCTraffic TrafficSource; static volatile struct { volatile bool DemodFinished; volatile bool RxDone; + } Flags = { 0 }; static volatile uint16_t RxPendingSince; @@ -453,12 +454,9 @@ void Sniff14443ACodecTask(void) /* Reception finished. Process the received bytes */ if (DemodBitCount >= ISO14443A_MIN_BITS_PER_FRAME) { - // For logging data - LogEntry(LOG_INFO_CODEC_SNI_READER_DATA, CodecBuffer, (DemodBitCount+7)/8); LEDHook(LED_CODEC_RX, LED_PULSE); TrafficSource = TRAFFIC_CARD; - return; } // Get nothing, Start sniff again @@ -516,6 +514,10 @@ void Sniff14443ACodecTask(void) // BitCount = removeParityBits(CodecBuffer, BitCount); LEDHook(LED_CODEC_RX, LED_PULSE); + // Print log after a round finished + // Otherwise it will take too much cpu cycles + // then the card traffic sniffing may not start in time + LogEntry(LOG_INFO_CODEC_SNI_READER_DATA, CodecBuffer, (DemodBitCount+7)/8); LogEntry(LOG_INFO_CODEC_SNI_CARD_DATA_W_PARITY, CodecBuffer2, (BitCount + 7) / 8); // Disable card sniffing and enable reader sniffing @@ -537,6 +539,10 @@ void Sniff14443ACodecTask(void) // Reset to reader sniffing if ((SYSTICK_DIFF(RxPendingSince) > Reader_FWT + 1) ) { Flags.RxDone = true; + + // If Card sniffing started but no data get + // Then the codec must have sniffed some reader raffic + LogEntry(LOG_INFO_CODEC_SNI_READER_DATA, CodecBuffer, (DemodBitCount+7)/8); // Disable card sniffing and enable reader sniffing CardSniffDeinit(); TrafficSource = TRAFFIC_READER; From 7af4cc5ee138fafb34fa643255f1f0ccbeaee5ae Mon Sep 17 00:00:00 2001 From: chenzitai Date: Thu, 19 Jul 2018 14:08:57 +0100 Subject: [PATCH 076/104] Longer reader pending timeout according to ISO-14443-4 5.5 (cherry picked from commit 4347afc) --- Firmware/Chameleon-Mini/Codec/Codec.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Firmware/Chameleon-Mini/Codec/Codec.h b/Firmware/Chameleon-Mini/Codec/Codec.h index cdc82cd..3833f1b 100644 --- a/Firmware/Chameleon-Mini/Codec/Codec.h +++ b/Firmware/Chameleon-Mini/Codec/Codec.h @@ -25,7 +25,7 @@ #define ISO14443A_BIT_RATE_CYCLES 128 #define ISO14443A_FRAME_DELAY_PREV1 1236 #define ISO14443A_FRAME_DELAY_PREV0 1172 -#define ISO14443A_RX_PENDING_TIMEOUT 1 // ms +#define ISO14443A_RX_PENDING_TIMEOUT 4 // ms /* Peripheral definitions */ #define CODEC_DEMOD_POWER_PORT PORTB From 396cc21be196782e2bed8263118668c5718486b8 Mon Sep 17 00:00:00 2001 From: chenzitai Date: Sun, 22 Jul 2018 00:08:11 +0100 Subject: [PATCH 077/104] Start reader sniffing right after card sniffing finished. This fix the bug that the sniffing get wrong data when the time gap between card signal and reader signal is too small (cherry picked from commit 573cb49) --- Firmware/Chameleon-Mini/Codec/Codec.h | 2 +- .../Chameleon-Mini/Codec/SniffISO14443-2A.c | 120 ++++++++++++------ 2 files changed, 85 insertions(+), 37 deletions(-) diff --git a/Firmware/Chameleon-Mini/Codec/Codec.h b/Firmware/Chameleon-Mini/Codec/Codec.h index 3833f1b..23e39e9 100644 --- a/Firmware/Chameleon-Mini/Codec/Codec.h +++ b/Firmware/Chameleon-Mini/Codec/Codec.h @@ -96,7 +96,7 @@ #define Codec8Reg2 GPIOR2 #define Codec8Reg3 GPIOR3 #define CodecCount16Register1 (*((volatile uint16_t*) &GPIOR4)) /* GPIOR4 & GPIOR5 */ -#define CodecCount16Register2 (*((volatile uint16_t*) &GPIOR6)) /* GPIOR4 & GPIOR5 */ +#define CodecCount16Register2 (*((volatile uint16_t*) &GPIOR6)) /* GPIOR6 & GPIOR7 */ #define CodecPtrRegister1 (*((volatile uint8_t**) &GPIOR8)) #define CodecPtrRegister2 (*((volatile uint8_t**) &GPIORA)) #define CodecPtrRegister3 (*((volatile uint8_t**) &GPIORC)) diff --git a/Firmware/Chameleon-Mini/Codec/SniffISO14443-2A.c b/Firmware/Chameleon-Mini/Codec/SniffISO14443-2A.c index feb110c..2bb6e2d 100644 --- a/Firmware/Chameleon-Mini/Codec/SniffISO14443-2A.c +++ b/Firmware/Chameleon-Mini/Codec/SniffISO14443-2A.c @@ -43,6 +43,7 @@ enum RCTraffic TrafficSource; static volatile struct { volatile bool DemodFinished; volatile bool RxDone; + volatile bool CardStarted; // If card have send the first bit } Flags = { 0 }; static volatile uint16_t RxPendingSince; @@ -52,7 +53,8 @@ typedef enum { DEMOD_PARITY_BIT, } StateType; -uint16_t DemodBitCount; +uint16_t ReaderBitCount; +uint16_t CardBitCount; INLINE void CardSniffInit(void); INLINE void CardSniffDeinit(void); @@ -63,8 +65,8 @@ INLINE void CardSniffDeinit(void); INLINE void ReaderSniffInit(void) { +// PORTE.OUTSET = PIN3_bm; - LED_PORT.OUTCLR = LED_RED; // Configure interrupt for demod CODEC_DEMOD_IN_PORT.INTCTRL = PORT_INT1LVL_HI_gc; @@ -95,6 +97,8 @@ INLINE void ReaderSniffInit(void) } INLINE void ReaderSniffDeInit(void) { +// PORTE.OUTCLR = PIN3_bm; + /* Gracefully shutdown codec */ CODEC_DEMOD_IN_PORT.INT1MASK = 0; CODEC_DEMOD_IN_PORT.INTCTRL = 0; @@ -147,6 +151,8 @@ ISR(CODEC_TIMER_SAMPLING_CCD_VECT) { // Shutdown the Reader->Card Sniffing, // disable the sampling timer + PORTE.OUTSET = PIN3_bm; + CODEC_TIMER_SAMPLING.CTRLA = TC_CLKSEL_OFF_gc; CODEC_TIMER_SAMPLING.INTFLAGS = TC0_CCDIF_bm; CODEC_TIMER_SAMPLING.INTCTRLB = TC_CCDINTLVL_OFF_gc; @@ -172,11 +178,18 @@ ISR(CODEC_TIMER_SAMPLING_CCD_VECT) { /* Signal, that we have finished sampling */ Flags.DemodFinished = 1; - DemodBitCount = BitCount; + ReaderBitCount = BitCount; + // If we are have got data // Start Card->Reader Sniffing without waiting for the complete of CodecTask // Otherwise some bit will not be captured - CardSniffInit(); + if (ReaderBitCount >= ISO14443A_MIN_BITS_PER_FRAME) { + CardSniffInit(); + } else{ + ReaderSniffInit(); + } + PORTE.OUTCLR = PIN3_bm; + return; } @@ -249,6 +262,10 @@ ISR(CODEC_TIMER_SAMPLING_CCD_VECT) { INLINE void CardSniffInit(void) { + LED_PORT.OUTSET = LED_RED; + PORTE.OUTSET = PIN2_bm; + + /* Initialize common peripherals and start listening * for incoming data. */ @@ -268,6 +285,8 @@ INLINE void CardSniffInit(void) * bit halves had modulations since the last pause. */ + DACB.CH0DATA = GlobalSettings.ActiveSettingPtr->ReaderThreshold; // real threshold voltage can be calculated with ch0data * Vref / 0xFFF + // Comparator ADC /* Configure and enable the analog comparator for finding pauses in the DEMOD signal. */ ACA.AC0CTRL = AC_HSMODE_bm | AC_HYSMODE_NO_gc | AC_INTMODE_FALLING_gc | AC_ENABLE_bm; @@ -301,14 +320,16 @@ INLINE void CardSniffInit(void) ACA.AC0CTRL = AC_HSMODE_bm | AC_HYSMODE_NO_gc | AC_INTMODE_FALLING_gc | AC_INTLVL_HI_gc | AC_ENABLE_bm; RxPendingSince = SystemGetSysTick(); - PORTE.OUTSET = PIN3_bm; + Flags.CardStarted = false; } INLINE void CardSniffDeinit(void) { - PORTE.OUTCLR = PIN3_bm; + PORTE.OUTCLR = PIN2_bm; + LED_PORT.OUTCLR = LED_RED; + CODEC_TIMER_LOADMOD.CTRLA = 0; CODEC_TIMER_LOADMOD.INTCTRLB = 0; @@ -320,7 +341,8 @@ INLINE void CardSniffDeinit(void) ACA.AC0MUXCTRL = AC_MUXPOS_DAC_gc | AC_MUXNEG_PIN7_gc; ACA.AC0CTRL = CODEC_AC_DEMOD_SETTINGS; - Flags.RxDone = false; +// Flags.RxDone = false; +// Flags.CardStarted = false; } @@ -341,6 +363,22 @@ INLINE void Insert1(void) *CardBufferPtr++ = CardSampleR; } +INLINE void TaskInsert0(void) +{ + CardSampleR >>= 1; + if (++CardBitCount % 8) + return; + *CardBufferPtr++ = CardSampleR; +} + +INLINE void TaskInsert1(void) +{ + CardSampleR = (CardSampleR >> 1) | 0x80; + if (++CardBitCount % 8) + return; + *CardBufferPtr++ = CardSampleR; +} + // This interrupt find Card -> Reader SOC ISR(ACA_AC0_vect) // this interrupt either finds the SOC or gets triggered before { @@ -348,7 +386,7 @@ ISR(ACA_AC0_vect) // this interrupt either finds the SOC or gets triggered befor // enable the pause-finding timer CODEC_TIMER_LOADMOD.CTRLD = TC_EVACT_RESTART_gc | TC_EVSEL_CH2_gc; CODEC_TIMER_LOADMOD.CTRLA = TC_CLKSEL_DIV1_gc; - + Flags.CardStarted = true; } // Decode the Card -> Reader signal // according to the pause and modulated period @@ -414,7 +452,13 @@ ISR(CODEC_TIMER_TIMESTAMPS_CCB_VECT) // EOC found if (BitCount % 8) // copy the last byte, if there is an incomplete byte CodecBuffer2[BitCount / 8] = CardSampleR >> (8 - (BitCount % 8)); + + CardBitCount = BitCount; Flags.RxDone = true; + Flags.CardStarted = false; + + CardSniffDeinit(); + ReaderSniffInit(); } @@ -424,7 +468,7 @@ ISR(CODEC_TIMER_TIMESTAMPS_CCB_VECT) // EOC found void Sniff14443ACodecInit(void) { - PORTE.DIRSET= PIN3_bm; + PORTE.DIRSET= PIN3_bm | PIN2_bm; // Common Codec Register settings CodecInitCommon(); // Enable demodulator power @@ -433,6 +477,7 @@ void Sniff14443ACodecInit(void) // Start with sniffing Reader->Card direction traffic TrafficSource = TRAFFIC_READER; ReaderSniffInit(); + Flags.RxDone = false; } @@ -453,15 +498,15 @@ void Sniff14443ACodecTask(void) Flags.DemodFinished = 0; /* Reception finished. Process the received bytes */ - if (DemodBitCount >= ISO14443A_MIN_BITS_PER_FRAME) { - LEDHook(LED_CODEC_RX, LED_PULSE); + if (ReaderBitCount >= ISO14443A_MIN_BITS_PER_FRAME) { +// LEDHook(LED_CODEC_RX, LED_PULSE); TrafficSource = TRAFFIC_CARD; return; } // Get nothing, Start sniff again TrafficSource = TRAFFIC_READER; - ReaderSniffInit(); +// ReaderSniffInit(); } } // Card->Reader Task @@ -469,19 +514,19 @@ void Sniff14443ACodecTask(void) { // Receive finished if (Flags.RxDone) { - if (Flags.RxDone && BitCount > 0) // decode the raw received data + if (Flags.RxDone && CardBitCount > 0) // decode the raw received data { - if (BitCount < ISO14443A_RX_MINIMUM_BITCOUNT * 2) { - BitCount = 0; + if (CardBitCount < ISO14443A_RX_MINIMUM_BITCOUNT * 2) { + CardBitCount = 0; } else { uint8_t TmpCodecBuffer[CODEC_BUFFER_SIZE]; - memcpy(TmpCodecBuffer, CodecBuffer2, (BitCount + 7) / 8); + memcpy(TmpCodecBuffer, CodecBuffer2, (CardBitCount + 7) / 8); CardBufferPtr = CodecBuffer2; - uint16_t BitCountTmp = 2, TotalBitCount = BitCount; - BitCount = 0; + uint16_t BitCountTmp = 2, TotalBitCount = CardBitCount; + CardBitCount = 0; bool breakflag = false; TmpCodecBuffer[0] >>= 2; // with this (and BitCountTmp = 2), the SOC is ignored @@ -492,11 +537,11 @@ void Sniff14443ACodecTask(void) TmpCodecBuffer[BitCountTmp / 8] >>= 2; switch (Bit) { case 0b10: - Insert1(); + TaskInsert1(); break; case 0b01: - Insert0(); + TaskInsert0(); break; case 0b00: // EOC @@ -509,40 +554,43 @@ void Sniff14443ACodecTask(void) } BitCountTmp += 2; } - if (BitCount % 8) // copy the last byte, if there is an incomplete byte - CodecBuffer2[BitCount / 8] = CardSampleR >> (8 - (BitCount % 8)); + if (CardBitCount % 8) // copy the last byte, if there is an incomplete byte + CodecBuffer2[CardBitCount / 8] = CardSampleR >> (8 - (CardBitCount % 8)); -// BitCount = removeParityBits(CodecBuffer, BitCount); - LEDHook(LED_CODEC_RX, LED_PULSE); +// BitCount = removeParityBits(CodecBuffer, CardBitCount); +// LEDHook(LED_CODEC_RX, LED_PULSE); // Print log after a round finished // Otherwise it will take too much cpu cycles // then the card traffic sniffing may not start in time - LogEntry(LOG_INFO_CODEC_SNI_READER_DATA, CodecBuffer, (DemodBitCount+7)/8); - LogEntry(LOG_INFO_CODEC_SNI_CARD_DATA_W_PARITY, CodecBuffer2, (BitCount + 7) / 8); + LogEntry(LOG_INFO_CODEC_SNI_READER_DATA, CodecBuffer, (ReaderBitCount+7)/8); + LogEntry(LOG_INFO_CODEC_SNI_CARD_DATA_W_PARITY, CodecBuffer2, (CardBitCount + 7) / 8); - // Disable card sniffing and enable reader sniffing - CardSniffDeinit(); - TrafficSource = TRAFFIC_READER; - ReaderSniffInit(); - - return; +// return; } } + + // Once Rx Finished, Switch to Reader sniffing, + // No matter if getting data or not +// CardSniffDeinit(); + // Disable card sniffing and enable reader sniffing + TrafficSource = TRAFFIC_READER; +// ReaderSniffInit(); + Flags.RxDone = false; /* Call application with received data */ - BitCount = ApplicationProcess(CodecBuffer2, BitCount); + CardBitCount = ApplicationProcess(CodecBuffer2, CardBitCount); } else // Receive not finished yet, Continue waiting { // If Waiting for response time out // Reset to reader sniffing - if ((SYSTICK_DIFF(RxPendingSince) > Reader_FWT + 1) ) { - Flags.RxDone = true; + if ((SYSTICK_DIFF(RxPendingSince) > Reader_FWT) && !Flags.CardStarted) { + Flags.RxDone = false; // If Card sniffing started but no data get // Then the codec must have sniffed some reader raffic - LogEntry(LOG_INFO_CODEC_SNI_READER_DATA, CodecBuffer, (DemodBitCount+7)/8); + LogEntry(LOG_INFO_CODEC_SNI_READER_DATA, CodecBuffer, (ReaderBitCount+7)/8); // Disable card sniffing and enable reader sniffing CardSniffDeinit(); TrafficSource = TRAFFIC_READER; From 59d8e1739dc41604945f40be167e6eb2eebeecd3 Mon Sep 17 00:00:00 2001 From: chenzitai Date: Mon, 23 Jul 2018 16:29:04 +0100 Subject: [PATCH 078/104] Refactor state and flags in SniffISO14443-2A.c (cherry picked from commit f3dd397) --- .../Chameleon-Mini/Codec/SniffISO14443-2A.c | 194 +++++++----------- 1 file changed, 79 insertions(+), 115 deletions(-) diff --git a/Firmware/Chameleon-Mini/Codec/SniffISO14443-2A.c b/Firmware/Chameleon-Mini/Codec/SniffISO14443-2A.c index 2bb6e2d..2a20cf7 100644 --- a/Firmware/Chameleon-Mini/Codec/SniffISO14443-2A.c +++ b/Firmware/Chameleon-Mini/Codec/SniffISO14443-2A.c @@ -41,9 +41,11 @@ enum RCTraffic TrafficSource; static volatile struct { - volatile bool DemodFinished; - volatile bool RxDone; - volatile bool CardStarted; // If card have send the first bit + volatile bool ReaderDataAvaliable; + volatile bool CardDataAvaliable; +// volatile bool DemodFinished; +// volatile bool RxDone; +// volatile bool CardStarted; // If card have send the first bit } Flags = { 0 }; static volatile uint16_t RxPendingSince; @@ -51,10 +53,13 @@ static volatile uint16_t RxPendingSince; typedef enum { DEMOD_DATA_BIT, /* Demod */ DEMOD_PARITY_BIT, + PCD_PICC_FDT, + PICC_FRAME, + } StateType; -uint16_t ReaderBitCount; -uint16_t CardBitCount; +static volatile uint16_t ReaderBitCount; +static volatile uint16_t CardBitCount; INLINE void CardSniffInit(void); INLINE void CardSniffDeinit(void); @@ -71,7 +76,6 @@ INLINE void ReaderSniffInit(void) CODEC_DEMOD_IN_PORT.INTCTRL = PORT_INT1LVL_HI_gc; /* Initialize some global vars and start looking out for reader commands */ - Flags.DemodFinished = 0; ReaderBufferPtr = CodecBuffer; ParityBufferPtr = &CodecBuffer[ISO14443A_BUFFER_PARITY_OFFSET]; @@ -103,8 +107,6 @@ INLINE void ReaderSniffDeInit(void) CODEC_DEMOD_IN_PORT.INT1MASK = 0; CODEC_DEMOD_IN_PORT.INTCTRL = 0; - Flags.DemodFinished = 0; - CODEC_TIMER_SAMPLING.CTRLA = TC_CLKSEL_OFF_gc; CODEC_TIMER_SAMPLING.CTRLD = TC_EVACT_OFF_gc; CODEC_TIMER_SAMPLING.INTCTRLB = TC_CCDINTLVL_OFF_gc; @@ -114,6 +116,8 @@ INLINE void ReaderSniffDeInit(void) // Find first pause and start sampling ISR(CODEC_DEMOD_IN_INT1_VECT) { + PORTE.OUTSET = PIN2_bm; + /* This is the first edge of the first modulation-pause after StartDemod. * Now we have time to start * demodulating beginning from one bit-width after this edge. */ @@ -150,8 +154,9 @@ ISR(CODEC_TIMER_SAMPLING_CCD_VECT) { // Shutdown the Reader->Card Sniffing, // disable the sampling timer + PORTE.OUTCLR = PIN2_bm; + - PORTE.OUTSET = PIN3_bm; CODEC_TIMER_SAMPLING.CTRLA = TC_CLKSEL_OFF_gc; CODEC_TIMER_SAMPLING.INTFLAGS = TC0_CCDIF_bm; @@ -177,18 +182,17 @@ ISR(CODEC_TIMER_SAMPLING_CCD_VECT) { } /* Signal, that we have finished sampling */ - Flags.DemodFinished = 1; ReaderBitCount = BitCount; // If we are have got data // Start Card->Reader Sniffing without waiting for the complete of CodecTask // Otherwise some bit will not be captured if (ReaderBitCount >= ISO14443A_MIN_BITS_PER_FRAME) { + Flags.ReaderDataAvaliable = true; CardSniffInit(); } else{ ReaderSniffInit(); } - PORTE.OUTCLR = PIN3_bm; return; @@ -231,7 +235,7 @@ ISR(CODEC_TIMER_SAMPLING_CCD_VECT) { } else if (StateRegister == DEMOD_PARITY_BIT) { /* This is a parity bit. Store it */ - *ParityBufferPtr++ = Bit; +// *ParityBufferPtr++ = Bit; StateRegister = DEMOD_DATA_BIT; } else { @@ -263,7 +267,6 @@ ISR(CODEC_TIMER_SAMPLING_CCD_VECT) { INLINE void CardSniffInit(void) { LED_PORT.OUTSET = LED_RED; - PORTE.OUTSET = PIN2_bm; /* Initialize common peripherals and start listening @@ -273,7 +276,6 @@ INLINE void CardSniffInit(void) BitCount = 1; // FALSCH todo the first modulation of the SOC is "found" implicitly CardSampleR = 0x00; - Flags.RxDone = false; /* * Prepare for Manchester decoding. @@ -306,7 +308,8 @@ INLINE void CardSniffInit(void) CODEC_TIMER_TIMESTAMPS.CCB = 160; CODEC_TIMER_TIMESTAMPS.INTCTRLA = 0; CODEC_TIMER_TIMESTAMPS.INTFLAGS = TC1_CCBIF_bm; // Clear interrupt flag - CODEC_TIMER_TIMESTAMPS.INTCTRLB = TC_CCBINTLVL_LO_gc; +// CODEC_TIMER_TIMESTAMPS.INTCTRLB = TC_CCBINTLVL_LO_gc; + CODEC_TIMER_TIMESTAMPS.INTCTRLB = TC_CCBINTLVL_HI_gc; /* Use the event system for resetting the pause-detecting timer. */ EVSYS.CH2MUX = EVSYS_CHMUX_ACA_CH0_gc; // on every ACA_AC0 INT @@ -320,14 +323,13 @@ INLINE void CardSniffInit(void) ACA.AC0CTRL = AC_HSMODE_bm | AC_HYSMODE_NO_gc | AC_INTMODE_FALLING_gc | AC_INTLVL_HI_gc | AC_ENABLE_bm; RxPendingSince = SystemGetSysTick(); - Flags.CardStarted = false; + StateRegister = PCD_PICC_FDT; } INLINE void CardSniffDeinit(void) { - PORTE.OUTCLR = PIN2_bm; LED_PORT.OUTCLR = LED_RED; @@ -341,8 +343,6 @@ INLINE void CardSniffDeinit(void) ACA.AC0MUXCTRL = AC_MUXPOS_DAC_gc | AC_MUXNEG_PIN7_gc; ACA.AC0CTRL = CODEC_AC_DEMOD_SETTINGS; -// Flags.RxDone = false; -// Flags.CardStarted = false; } @@ -382,11 +382,12 @@ INLINE void TaskInsert1(void) // This interrupt find Card -> Reader SOC ISR(ACA_AC0_vect) // this interrupt either finds the SOC or gets triggered before { + ACA.AC0CTRL &= ~AC_INTLVL_HI_gc; // disable this interrupt // enable the pause-finding timer CODEC_TIMER_LOADMOD.CTRLD = TC_EVACT_RESTART_gc | TC_EVSEL_CH2_gc; CODEC_TIMER_LOADMOD.CTRLA = TC_CLKSEL_DIV1_gc; - Flags.CardStarted = true; + StateRegister = PICC_FRAME; } // Decode the Card -> Reader signal // according to the pause and modulated period @@ -407,6 +408,7 @@ ISR(CODEC_TIMER_LOADMOD_CCB_VECT) // pause found return; case 49 ... 80: // 64 ticks are a full bit period + // Insert 0 Insert1(); Insert0(); return; @@ -434,6 +436,7 @@ ISR(CODEC_TIMER_LOADMOD_CCB_VECT) // pause found // EOC of Card->Reader found ISR(CODEC_TIMER_TIMESTAMPS_CCB_VECT) // EOC found { + // Disable LOADMOD Timer CODEC_TIMER_LOADMOD.INTCTRLB = 0; // Disable Interrupt CODEC_TIMER_LOADMOD.CTRLA = TC_CLKSEL_OFF_gc; // Disable Clock @@ -450,12 +453,14 @@ ISR(CODEC_TIMER_TIMESTAMPS_CCB_VECT) // EOC found Insert1(); } + if (BitCount % 8) // copy the last byte, if there is an incomplete byte CodecBuffer2[BitCount / 8] = CardSampleR >> (8 - (BitCount % 8)); CardBitCount = BitCount; - Flags.RxDone = true; - Flags.CardStarted = false; + if (BitCount >= ISO14443A_RX_MINIMUM_BITCOUNT * 2) { + Flags.CardDataAvaliable = true; + } CardSniffDeinit(); ReaderSniffInit(); @@ -468,6 +473,7 @@ ISR(CODEC_TIMER_TIMESTAMPS_CCB_VECT) // EOC found void Sniff14443ACodecInit(void) { + PORTE.DIRSET= PIN3_bm | PIN2_bm; // Common Codec Register settings CodecInitCommon(); @@ -477,7 +483,8 @@ void Sniff14443ACodecInit(void) // Start with sniffing Reader->Card direction traffic TrafficSource = TRAFFIC_READER; ReaderSniffInit(); - Flags.RxDone = false; + Flags.ReaderDataAvaliable = false; + Flags.CardDataAvaliable = false; } @@ -492,111 +499,68 @@ void Sniff14443ACodecDeInit(void) void Sniff14443ACodecTask(void) { - // Reader->Card Task - if (TrafficSource == TRAFFIC_READER) { - if (Flags.DemodFinished) { - Flags.DemodFinished = 0; - /* Reception finished. Process the received bytes */ - - if (ReaderBitCount >= ISO14443A_MIN_BITS_PER_FRAME) { -// LEDHook(LED_CODEC_RX, LED_PULSE); - - TrafficSource = TRAFFIC_CARD; - return; - } - // Get nothing, Start sniff again - TrafficSource = TRAFFIC_READER; -// ReaderSniffInit(); - } + PORTE.OUTSET = PIN3_bm; + if(Flags.ReaderDataAvaliable){ + Flags.ReaderDataAvaliable = false; + LogEntry(LOG_INFO_CODEC_SNI_READER_DATA, CodecBuffer, (ReaderBitCount+7)/8); + ReaderBitCount = 0; } - // Card->Reader Task - else - { - // Receive finished - if (Flags.RxDone) { - if (Flags.RxDone && CardBitCount > 0) // decode the raw received data - { - if (CardBitCount < ISO14443A_RX_MINIMUM_BITCOUNT * 2) { - CardBitCount = 0; - } - else { - uint8_t TmpCodecBuffer[CODEC_BUFFER_SIZE]; - memcpy(TmpCodecBuffer, CodecBuffer2, (CardBitCount + 7) / 8); + if (Flags.CardDataAvaliable){ + Flags.CardDataAvaliable = false; - CardBufferPtr = CodecBuffer2; - uint16_t BitCountTmp = 2, TotalBitCount = CardBitCount; - CardBitCount = 0; + uint8_t TmpCodecBuffer[CODEC_BUFFER_SIZE]; + memcpy(TmpCodecBuffer, CodecBuffer2, (CardBitCount + 7) / 8); - bool breakflag = false; - TmpCodecBuffer[0] >>= 2; // with this (and BitCountTmp = 2), the SOC is ignored + CardBufferPtr = CodecBuffer2; + uint16_t BitCountTmp = 2, TotalBitCount = CardBitCount; + CardBitCount = 0; - // Manchester Code ISO14443-2 8.2.5 - while (!breakflag && BitCountTmp < TotalBitCount) { - uint8_t Bit = TmpCodecBuffer[BitCountTmp / 8] & 0x03; - TmpCodecBuffer[BitCountTmp / 8] >>= 2; - switch (Bit) { - case 0b10: - TaskInsert1(); - break; + bool breakflag = false; + TmpCodecBuffer[0] >>= 2; // with this (and BitCountTmp = 2), the SOC is ignored - case 0b01: - TaskInsert0(); - break; + // Manchester Code ISO14443-2 8.2.5 + while (!breakflag && BitCountTmp < TotalBitCount) { + uint8_t Bit = TmpCodecBuffer[BitCountTmp / 8] & 0x03; + TmpCodecBuffer[BitCountTmp / 8] >>= 2; + switch (Bit) { + case 0b10: + TaskInsert1(); + break; - case 0b00: // EOC - breakflag = true; - break; + case 0b01: + TaskInsert0(); + break; - default: - // error, should not happen, TODO handle this - break; - } - BitCountTmp += 2; - } - if (CardBitCount % 8) // copy the last byte, if there is an incomplete byte - CodecBuffer2[CardBitCount / 8] = CardSampleR >> (8 - (CardBitCount % 8)); + case 0b00: // EOC + breakflag = true; + break; + + default: + // error, should not happen, TODO handle this + break; + } + BitCountTmp += 2; + } + if (CardBitCount % 8) // copy the last byte, if there is an incomplete byte + CodecBuffer2[CardBitCount / 8] = CardSampleR >> (8 - (CardBitCount % 8)); // BitCount = removeParityBits(CodecBuffer, CardBitCount); // LEDHook(LED_CODEC_RX, LED_PULSE); - // Print log after a round finished - // Otherwise it will take too much cpu cycles - // then the card traffic sniffing may not start in time - LogEntry(LOG_INFO_CODEC_SNI_READER_DATA, CodecBuffer, (ReaderBitCount+7)/8); - LogEntry(LOG_INFO_CODEC_SNI_CARD_DATA_W_PARITY, CodecBuffer2, (CardBitCount + 7) / 8); + // Print log after a round finished + // Otherwise it will take too much cpu cycles + // then the card traffic sniffing may not start in time + LogEntry(LOG_INFO_CODEC_SNI_CARD_DATA_W_PARITY, CodecBuffer2, (CardBitCount + 7) / 8); // return; - } - } - - // Once Rx Finished, Switch to Reader sniffing, - // No matter if getting data or not -// CardSniffDeinit(); - // Disable card sniffing and enable reader sniffing - TrafficSource = TRAFFIC_READER; -// ReaderSniffInit(); - - Flags.RxDone = false; - - /* Call application with received data */ - CardBitCount = ApplicationProcess(CodecBuffer2, CardBitCount); - } - else // Receive not finished yet, Continue waiting - { - // If Waiting for response time out - // Reset to reader sniffing - if ((SYSTICK_DIFF(RxPendingSince) > Reader_FWT) && !Flags.CardStarted) { - Flags.RxDone = false; - - // If Card sniffing started but no data get - // Then the codec must have sniffed some reader raffic - LogEntry(LOG_INFO_CODEC_SNI_READER_DATA, CodecBuffer, (ReaderBitCount+7)/8); - // Disable card sniffing and enable reader sniffing - CardSniffDeinit(); - TrafficSource = TRAFFIC_READER; - ReaderSniffInit(); - } - } } + + if(StateRegister == PCD_PICC_FDT && (SYSTICK_DIFF(RxPendingSince) > Reader_FWT)){ + CardSniffDeinit(); + ReaderSniffInit(); + } + PORTE.OUTCLR = PIN3_bm; + + } From 14e17381533e89cb599f8b42f588856d1c18c8cb Mon Sep 17 00:00:00 2001 From: chenzitai Date: Tue, 24 Jul 2018 00:43:06 +0100 Subject: [PATCH 079/104] Optimise the Card->Reader Manchester decoder in Sniffing to make it faster It now decode and sample in the same time, so the decode half bit sampling to Manchester in the CodecTask can be removed. This optimisation may also fix the bug that the CodecTask not finished after start of Reader->Card Sampling and make the reader->Card sampling not in perfect timing and cause the Reader ->Card Sniffed data to be wrong. Trace from oscilloscope for the Problem: ReaderSniffing Enable __________ _________ __| |____________________| |_________ CardSniffing Enable _____________ _______ ________________| |______________| Task __ ___---- _|__|__|__|___| |__|__|__|__|__|_| |__|__|__|__| "-" indicate the problem (cherry picked from commit a246b98) --- .../Chameleon-Mini/Codec/SniffISO14443-2A.c | 149 ++++++++---------- 1 file changed, 63 insertions(+), 86 deletions(-) diff --git a/Firmware/Chameleon-Mini/Codec/SniffISO14443-2A.c b/Firmware/Chameleon-Mini/Codec/SniffISO14443-2A.c index 2a20cf7..2552a8d 100644 --- a/Firmware/Chameleon-Mini/Codec/SniffISO14443-2A.c +++ b/Firmware/Chameleon-Mini/Codec/SniffISO14443-2A.c @@ -37,15 +37,9 @@ #define ParityBufferPtr CodecPtrRegister2 #define CardBufferPtr CodecPtrRegister3 - -enum RCTraffic TrafficSource; - static volatile struct { volatile bool ReaderDataAvaliable; volatile bool CardDataAvaliable; -// volatile bool DemodFinished; -// volatile bool RxDone; -// volatile bool CardStarted; // If card have send the first bit } Flags = { 0 }; static volatile uint16_t RxPendingSince; @@ -60,6 +54,7 @@ typedef enum { static volatile uint16_t ReaderBitCount; static volatile uint16_t CardBitCount; +static volatile uint16_t rawBitCount; INLINE void CardSniffInit(void); INLINE void CardSniffDeinit(void); @@ -273,7 +268,8 @@ INLINE void CardSniffInit(void) * for incoming data. */ CardBufferPtr = CodecBuffer2; // use GPIOR for faster access - BitCount = 1; // FALSCH todo the first modulation of the SOC is "found" implicitly + rawBitCount = 1; // FALSCH todo the first modulation of the SOC is "found" implicitly + BitCount = 0; CardSampleR = 0x00; @@ -363,22 +359,6 @@ INLINE void Insert1(void) *CardBufferPtr++ = CardSampleR; } -INLINE void TaskInsert0(void) -{ - CardSampleR >>= 1; - if (++CardBitCount % 8) - return; - *CardBufferPtr++ = CardSampleR; -} - -INLINE void TaskInsert1(void) -{ - CardSampleR = (CardSampleR >> 1) | 0x80; - if (++CardBitCount % 8) - return; - *CardBufferPtr++ = CardSampleR; -} - // This interrupt find Card -> Reader SOC ISR(ACA_AC0_vect) // this interrupt either finds the SOC or gets triggered before { @@ -402,34 +382,68 @@ ISR(CODEC_TIMER_LOADMOD_CCB_VECT) // pause found * but doing this only on a condition means wasting time, so we do it every time. */ CODEC_TIMER_TIMESTAMPS.CTRLA = TC_CLKSEL_DIV4_gc; + // Remember, LSB is send first + // If current raw bit count is odd, then the previous raw bit must be 0 switch (tmp) // decide how many half bit periods have been modulations { case 0 ... 48: // 32 ticks is one half of a bit period return; case 49 ... 80: // 64 ticks are a full bit period - // Insert 0 - Insert1(); - Insert0(); + // Got 01 + if(rawBitCount & 1){ + // 01 + 0 -> 0 10 + // 10 -> 1, last 0 is ignored + if(rawBitCount > 1) { + // Ignore SOC + Insert1(); + } + } else{ + // Current sampled bit count is even, decode directly + // 01 -> 0 + Insert0(); + } + rawBitCount += 2; return; case 81 ... 112: // 96 ticks are 3 half bit periods - if (BitCount & 1) { - Insert1(); - Insert1(); + if (rawBitCount & 1) { + // Current sampled bit count is odd + // Got 011 + // 011 + 0 -> 01 10 -> 01 + if(rawBitCount > 1) { + // Ignore SOC + Insert1(); + } Insert0(); } else { - Insert1(); - Insert0(); + // Even bit count + // Got 001 + // 001 -> 0 01, The last 0 is ignored + // 01 -> 0 Insert0(); } + rawBitCount += 3; + return; default: // every value over 96 + 16 (tolerance) is considered to be 4 half bit periods - Insert1(); - Insert1(); - Insert0(); - Insert0(); + // Got 00 11 + if(rawBitCount & 1){ + // 00 11 + 0 -> 0 01 10 + // 01 -> 0, 10 -> 1, Ignore last 0 + if(rawBitCount > 1) { + // Ignore SOC + Insert1(); + } + Insert0(); + } else { + // Should not happen + // If modulation is correct, + // there should not be a full bit period modulation in even bit count + } + rawBitCount += 4; + return; } } @@ -446,19 +460,21 @@ ISR(CODEC_TIMER_TIMESTAMPS_CCB_VECT) // EOC found CODEC_TIMER_TIMESTAMPS.CTRLA = TC_CLKSEL_OFF_gc; ACA.AC0CTRL &= ~AC_ENABLE_bm; - if (BitCount & 1) { - if (CardSampleR & 0x80) - Insert0(); - else - Insert1(); + // If finished in odd sample count + // There must been an incomplete decoded bit + // Since only EOC is no modulation in full bit period, and previous raw bit must be 0 + // so the last not modulated bit must be 1 + if (rawBitCount & 1) { + // The previous raw bit must be 0 + // 1 + 0 -> 10 -> 1 + Insert1(); } - if (BitCount % 8) // copy the last byte, if there is an incomplete byte CodecBuffer2[BitCount / 8] = CardSampleR >> (8 - (BitCount % 8)); CardBitCount = BitCount; - if (BitCount >= ISO14443A_RX_MINIMUM_BITCOUNT * 2) { + if (BitCount >= ISO14443A_RX_MINIMUM_BITCOUNT) { Flags.CardDataAvaliable = true; } @@ -481,11 +497,10 @@ void Sniff14443ACodecInit(void) CodecSetDemodPower(true); // Start with sniffing Reader->Card direction traffic - TrafficSource = TRAFFIC_READER; - ReaderSniffInit(); Flags.ReaderDataAvaliable = false; Flags.CardDataAvaliable = false; + ReaderSniffInit(); } void Sniff14443ACodecDeInit(void) @@ -503,56 +518,18 @@ void Sniff14443ACodecTask(void) if(Flags.ReaderDataAvaliable){ Flags.ReaderDataAvaliable = false; LogEntry(LOG_INFO_CODEC_SNI_READER_DATA, CodecBuffer, (ReaderBitCount+7)/8); - ReaderBitCount = 0; +// ReaderBitCount = 0; } + if (Flags.CardDataAvaliable){ Flags.CardDataAvaliable = false; - uint8_t TmpCodecBuffer[CODEC_BUFFER_SIZE]; - memcpy(TmpCodecBuffer, CodecBuffer2, (CardBitCount + 7) / 8); +// CardBitCount = removeParityBits(CodecBuffer2,CardBitCount ); +// LEDHook(LED_CODEC_RX, LED_PULSE); - CardBufferPtr = CodecBuffer2; - uint16_t BitCountTmp = 2, TotalBitCount = CardBitCount; - CardBitCount = 0; - - bool breakflag = false; - TmpCodecBuffer[0] >>= 2; // with this (and BitCountTmp = 2), the SOC is ignored - - // Manchester Code ISO14443-2 8.2.5 - while (!breakflag && BitCountTmp < TotalBitCount) { - uint8_t Bit = TmpCodecBuffer[BitCountTmp / 8] & 0x03; - TmpCodecBuffer[BitCountTmp / 8] >>= 2; - switch (Bit) { - case 0b10: - TaskInsert1(); - break; - - case 0b01: - TaskInsert0(); - break; - - case 0b00: // EOC - breakflag = true; - break; - - default: - // error, should not happen, TODO handle this - break; - } - BitCountTmp += 2; - } - if (CardBitCount % 8) // copy the last byte, if there is an incomplete byte - CodecBuffer2[CardBitCount / 8] = CardSampleR >> (8 - (CardBitCount % 8)); - -// BitCount = removeParityBits(CodecBuffer, CardBitCount); -// LEDHook(LED_CODEC_RX, LED_PULSE); - // Print log after a round finished - // Otherwise it will take too much cpu cycles - // then the card traffic sniffing may not start in time LogEntry(LOG_INFO_CODEC_SNI_CARD_DATA_W_PARITY, CodecBuffer2, (CardBitCount + 7) / 8); -// return; } From 823602c721ca859a2671ac38c149ae8eb0d1884f Mon Sep 17 00:00:00 2001 From: chenzitai Date: Wed, 25 Jul 2018 17:40:46 +0100 Subject: [PATCH 080/104] Add Framework for autocalibrate of Sniffing Mode (cherry picked from commit c8606be) --- .../Chameleon-Mini/Application/Application.h | 1 + .../Chameleon-Mini/Application/Sniff14443A.c | 48 +++++++++++++++++++ .../Chameleon-Mini/Application/Sniff14443A.h | 24 ++++++++++ .../Chameleon-Mini/Codec/SniffISO14443-2A.c | 13 ++--- Firmware/Chameleon-Mini/Configuration.c | 10 ++-- Firmware/Chameleon-Mini/Makefile | 2 +- Firmware/Chameleon-Mini/Terminal/Commands.c | 28 ++++++++--- 7 files changed, 104 insertions(+), 22 deletions(-) create mode 100644 Firmware/Chameleon-Mini/Application/Sniff14443A.c create mode 100644 Firmware/Chameleon-Mini/Application/Sniff14443A.h diff --git a/Firmware/Chameleon-Mini/Application/Application.h b/Firmware/Chameleon-Mini/Application/Application.h index 0b94960..1002d31 100644 --- a/Firmware/Chameleon-Mini/Application/Application.h +++ b/Firmware/Chameleon-Mini/Application/Application.h @@ -16,6 +16,7 @@ #include "MifareUltralight.h" #include "MifareClassic.h" #include "Reader14443A.h" +#include "Sniff14443A.h" /* Function wrappers */ INLINE void ApplicationInit(void) { diff --git a/Firmware/Chameleon-Mini/Application/Sniff14443A.c b/Firmware/Chameleon-Mini/Application/Sniff14443A.c new file mode 100644 index 0000000..68512a7 --- /dev/null +++ b/Firmware/Chameleon-Mini/Application/Sniff14443A.c @@ -0,0 +1,48 @@ +// +// Created by Zitai Chen on 25/07/2018. +// Application layer for sniffing +// Currently only support Autocalibrate +// + +#include +#include +#include "Sniff14443A.h" +Sniff14443Command Sniff14443CurrentCommand = Sniff14443_Do_Nothing; + +extern bool checkParityBits(uint8_t * Buffer, uint16_t BitCount); + static enum { + STATE_IDLE, + STATE_READER_DATA, + STATE_CARD_DATA +} SniffState = STATE_IDLE; + +void Sniff14443AAppInit(void){ + SniffState = STATE_IDLE; +} + +void Sniff14443AAppReset(void){ + SniffState = STATE_IDLE; + Sniff14443CurrentCommand = Sniff14443_Do_Nothing; +} +// Currently APPTask and AppTick is not being used +void Sniff14443AAppTask(void){/* Empty */} +void Sniff14443AAppTick(void){/* Empty */} + +void Sniff14443AAppTimeout(void){ + Sniff14443AAppReset(); +} + +uint16_t Sniff14443AAppProcess(uint8_t* Buffer, uint16_t BitCount){ + switch (Sniff14443CurrentCommand){ + case Sniff14443_Do_Nothing: + return 0; + case Sniff14443_Autocalibrate: + // If received Reader WUPA + if(Buffer[0] == 0x26 || Buffer[0] == 0x54){ + LED_PORT.OUTSET = LED_RED; + } + break; + default: + return 0; + } +} \ No newline at end of file diff --git a/Firmware/Chameleon-Mini/Application/Sniff14443A.h b/Firmware/Chameleon-Mini/Application/Sniff14443A.h new file mode 100644 index 0000000..60f1c85 --- /dev/null +++ b/Firmware/Chameleon-Mini/Application/Sniff14443A.h @@ -0,0 +1,24 @@ +// +// Created by Zitai Chen on 25/07/2018. +// + +#ifndef CHAMELEON_MINI_SNIFF14443A_H +#define CHAMELEON_MINI_SNIFF14443A_H + +#include + +void Sniff14443AAppInit(void); +void Sniff14443AAppReset(void); +void Sniff14443AAppTask(void); +void Sniff14443AAppTick(void); +void Sniff14443AAppTimeout(void); + +uint16_t Sniff14443AAppProcess(uint8_t* Buffer, uint16_t BitCount); + +typedef enum { + Sniff14443_Do_Nothing, + Sniff14443_Autocalibrate, +} Sniff14443Command; + +#endif //CHAMELEON_MINI_SNIFF14443A_H + diff --git a/Firmware/Chameleon-Mini/Codec/SniffISO14443-2A.c b/Firmware/Chameleon-Mini/Codec/SniffISO14443-2A.c index 2552a8d..fb2a51a 100644 --- a/Firmware/Chameleon-Mini/Codec/SniffISO14443-2A.c +++ b/Firmware/Chameleon-Mini/Codec/SniffISO14443-2A.c @@ -261,8 +261,6 @@ ISR(CODEC_TIMER_SAMPLING_CCD_VECT) { INLINE void CardSniffInit(void) { - LED_PORT.OUTSET = LED_RED; - /* Initialize common peripherals and start listening * for incoming data. */ @@ -326,8 +324,6 @@ INLINE void CardSniffInit(void) INLINE void CardSniffDeinit(void) { - LED_PORT.OUTCLR = LED_RED; - CODEC_TIMER_LOADMOD.CTRLA = 0; CODEC_TIMER_LOADMOD.INTCTRLB = 0; @@ -518,18 +514,17 @@ void Sniff14443ACodecTask(void) if(Flags.ReaderDataAvaliable){ Flags.ReaderDataAvaliable = false; LogEntry(LOG_INFO_CODEC_SNI_READER_DATA, CodecBuffer, (ReaderBitCount+7)/8); -// ReaderBitCount = 0; + ApplicationProcess(CodecBuffer, (ReaderBitCount+7)/8); + LEDHook(LED_CODEC_RX, LED_PULSE); } if (Flags.CardDataAvaliable){ Flags.CardDataAvaliable = false; - // CardBitCount = removeParityBits(CodecBuffer2,CardBitCount ); -// LEDHook(LED_CODEC_RX, LED_PULSE); - LogEntry(LOG_INFO_CODEC_SNI_CARD_DATA_W_PARITY, CodecBuffer2, (CardBitCount + 7) / 8); - + LEDHook(LED_CODEC_RX, LED_PULSE); + ApplicationProcess(CodecBuffer2, (CardBitCount+7)/8); } diff --git a/Firmware/Chameleon-Mini/Configuration.c b/Firmware/Chameleon-Mini/Configuration.c index 5fda354..1fffdd0 100644 --- a/Firmware/Chameleon-Mini/Configuration.c +++ b/Firmware/Chameleon-Mini/Configuration.c @@ -191,11 +191,11 @@ static const PROGMEM ConfigurationType ConfigurationTable[] = { .CodecInitFunc = Sniff14443ACodecInit, .CodecDeInitFunc = Sniff14443ACodecDeInit, .CodecTaskFunc = Sniff14443ACodecTask, - .ApplicationInitFunc = ApplicationInitDummy, - .ApplicationResetFunc = ApplicationResetDummy, - .ApplicationTaskFunc = ApplicationTaskDummy, - .ApplicationTickFunc = ApplicationTickDummy, - .ApplicationProcessFunc = ApplicationProcessDummy, + .ApplicationInitFunc = Sniff14443AAppInit, + .ApplicationResetFunc = Sniff14443AAppReset, + .ApplicationTaskFunc = Sniff14443AAppTask, + .ApplicationTickFunc = Sniff14443AAppTick, + .ApplicationProcessFunc = Sniff14443AAppProcess, .ApplicationGetUidFunc = ApplicationGetUidDummy, .ApplicationSetUidFunc = ApplicationSetUidDummy, .UidSize = 0, diff --git a/Firmware/Chameleon-Mini/Makefile b/Firmware/Chameleon-Mini/Makefile index 5870a2b..3824633 100644 --- a/Firmware/Chameleon-Mini/Makefile +++ b/Firmware/Chameleon-Mini/Makefile @@ -93,7 +93,7 @@ OPTIMIZATION = s SRC += $(TARGET).c LUFADescriptors.c System.c Configuration.c Random.c Common.c Memory.c MemoryAsm.S Button.c Log.c Settings.c LED.c Map.c AntennaLevel.c SRC += Terminal/Terminal.c Terminal/Commands.c Terminal/XModem.c Terminal/CommandLine.c SRC += Codec/Codec.c Codec/ISO14443-2A.c Codec/Reader14443-2A.c Codec/SniffISO14443-2A.c Codec/Reader14443-ISR.S -SRC += Application/MifareUltralight.c Application/MifareClassic.c Application/ISO14443-3A.c Application/Crypto1.c Application/Reader14443A.c +SRC += Application/MifareUltralight.c Application/MifareClassic.c Application/ISO14443-3A.c Application/Crypto1.c Application/Reader14443A.c Application/Sniff14443A.c SRC += $(LUFA_SRC_USB) $(LUFA_SRC_USBCLASS) LUFA_PATH = ../LUFA CC_FLAGS = -DUSE_LUFA_CONFIG_HEADER -DFLASH_DATA_ADDR=$(FLASH_DATA_ADDR) -DFLASH_DATA_SIZE=$(FLASH_DATA_SIZE) -DSPM_HELPER_ADDR=$(SPM_HELPER_ADDR) -DBUILD_DATE=$(BUILD_DATE) -DCOMMIT_ID=\"$(COMMIT_ID)\" $(SETTINGS) diff --git a/Firmware/Chameleon-Mini/Terminal/Commands.c b/Firmware/Chameleon-Mini/Terminal/Commands.c index d4b26e9..c6307a8 100644 --- a/Firmware/Chameleon-Mini/Terminal/Commands.c +++ b/Firmware/Chameleon-Mini/Terminal/Commands.c @@ -2,6 +2,7 @@ #include "Commands.h" #include #include +#include #include "XModem.h" #include "../Settings.h" #include "../Chameleon-Mini.h" @@ -16,6 +17,7 @@ #include "../Codec/Codec.h" extern Reader14443Command Reader14443CurrentCommand; +extern Sniff14443Command Sniff14443CurrentCommand; extern const PROGMEM CommandEntryType CommandTable[]; @@ -629,15 +631,27 @@ CommandStatusIdType CommandGetField(char* OutMessage) CommandStatusIdType CommandExecAutocalibrate(char* OutMessage) { - if (GlobalSettings.ActiveSettingPtr->Configuration != CONFIG_ISO14443A_READER) + if (GlobalSettings.ActiveSettingPtr->Configuration == CONFIG_ISO14443A_READER){ + ApplicationReset(); + + Reader14443CurrentCommand = Reader14443_Autocalibrate; + Reader14443AAppInit(); + Reader14443ACodecStart(); + CommandLinePendingTaskTimeout = &Reader14443AAppTimeout; + return TIMEOUT_COMMAND; + } + else if (GlobalSettings.ActiveSettingPtr->Configuration == CONFIG_ISO14443A_SNIFF){ + ApplicationReset(); + + Sniff14443CurrentCommand = Sniff14443_Autocalibrate; + Sniff14443AAppInit(); + CommandLinePendingTaskTimeout = &Sniff14443AAppTimeout; + return TIMEOUT_COMMAND; + } + else { return COMMAND_ERR_INVALID_USAGE_ID; - ApplicationReset(); + } - Reader14443CurrentCommand = Reader14443_Autocalibrate; - Reader14443AAppInit(); - Reader14443ACodecStart(); - CommandLinePendingTaskTimeout = &Reader14443AAppTimeout; - return TIMEOUT_COMMAND; } CommandStatusIdType CommandExecClone(char *OutMessage) From 9c37cf758bd520d779e187229ceab35301a2dbf3 Mon Sep 17 00:00:00 2001 From: chenzitai Date: Thu, 26 Jul 2018 02:28:03 +0100 Subject: [PATCH 081/104] Trace the Reader and card status in sniffing mode This will prepare for the autocalibrate of threshold If card selection fully detected, then the threshold is good, Otherwise it is not good. (cherry picked from commit f5c8485) --- .../Chameleon-Mini/Application/Sniff14443A.c | 127 ++++++++++++++++-- .../Chameleon-Mini/Codec/SniffISO14443-2A.c | 12 +- .../Chameleon-Mini/Codec/SniffISO14443-2A.h | 2 +- 3 files changed, 129 insertions(+), 12 deletions(-) diff --git a/Firmware/Chameleon-Mini/Application/Sniff14443A.c b/Firmware/Chameleon-Mini/Application/Sniff14443A.c index 68512a7..e652834 100644 --- a/Firmware/Chameleon-Mini/Application/Sniff14443A.c +++ b/Firmware/Chameleon-Mini/Application/Sniff14443A.c @@ -7,22 +7,31 @@ #include #include #include "Sniff14443A.h" -Sniff14443Command Sniff14443CurrentCommand = Sniff14443_Do_Nothing; - +#include "Codec/SniffISO14443-2A.h" extern bool checkParityBits(uint8_t * Buffer, uint16_t BitCount); - static enum { + +Sniff14443Command Sniff14443CurrentCommand = Sniff14443_Do_Nothing; +bool selected = false; +static enum { STATE_IDLE, - STATE_READER_DATA, - STATE_CARD_DATA + STATE_REQA, + STATE_ATQA, + STATE_ANTICOLLI, + STATE_SELECT, + STATE_UID, + STATE_SAK, } SniffState = STATE_IDLE; + void Sniff14443AAppInit(void){ - SniffState = STATE_IDLE; + SniffState = STATE_REQA; + selected = false; } void Sniff14443AAppReset(void){ SniffState = STATE_IDLE; Sniff14443CurrentCommand = Sniff14443_Do_Nothing; + selected = false; } // Currently APPTask and AppTick is not being used void Sniff14443AAppTask(void){/* Empty */} @@ -32,16 +41,116 @@ void Sniff14443AAppTimeout(void){ Sniff14443AAppReset(); } +void reset2REQA(void){ + SniffState = STATE_REQA; + LED_PORT.OUTCLR = LED_RED; + selected = false; + // TODO: Mark the current threshold as fail and continue + +} uint16_t Sniff14443AAppProcess(uint8_t* Buffer, uint16_t BitCount){ switch (Sniff14443CurrentCommand){ case Sniff14443_Do_Nothing: return 0; case Sniff14443_Autocalibrate: - // If received Reader WUPA - if(Buffer[0] == 0x26 || Buffer[0] == 0x54){ - LED_PORT.OUTSET = LED_RED; + switch (SniffState){ + case STATE_REQA: + // If received Reader REQA or WUPA + if (TrafficSource == TRAFFIC_READER && + (Buffer[0] == 0x26 || Buffer[0] == 0x54)) + { + SniffState = STATE_ATQA; + } else { + // Stay in this state, do noting + } + break; + case STATE_ATQA: + // ATQA: P RRRR XXXX P XXRX XXXX + if (TrafficSource == TRAFFIC_CARD && + BitCount == 2*9 && + (Buffer[0] & 0x20) == 0x00 && // Bit6 RFU shall be 0 + (Buffer[1] & 0xE0) == 0x00 && // bit13-16 RFU shall be 0 + (Buffer[2] & 0x01) == 0x00 && + checkParityBits(Buffer, BitCount)) + { + // Assume this is a good ATQA + SniffState = STATE_ANTICOLLI; + } else { + // If not ATQA, but REQA, then stay on this state, + // Reset to REQA, save the counter and reset the counter + if (TrafficSource == TRAFFIC_READER && + (Buffer[0] == 0x26 || Buffer[0] == 0x54)) { + } else { + // If not ATQA and not REQA then reset to REQA + reset2REQA(); + } + } + break; + case STATE_ANTICOLLI: + LED_PORT.OUTSET = LED_RED; + // SEL: 93/95/97 + if(TrafficSource == TRAFFIC_READER && + BitCount == 2*8 && + (Buffer[0] & 0xf0) == 0x90 && + (Buffer[0] & 0x09) == 0x01) + { + SniffState = STATE_UID; + } else{ + reset2REQA(); + } + break; + case STATE_UID: + if(TrafficSource == TRAFFIC_CARD && + BitCount == 5*9 && + checkParityBits(Buffer, BitCount)) + { + SniffState = STATE_SELECT; + } else { + reset2REQA(); + } + break; + case STATE_SELECT: + + // SELECT: 9 bytes, SEL = 93/95/97, NVB=70 + if (TrafficSource == TRAFFIC_READER && + BitCount == 9*8 && + (Buffer[0] & 0xf0) == 0x90 && + (Buffer[0] & 0x09) == 0x01 && + Buffer[1] == 0x70) + { + SniffState = STATE_SAK; + } else{ + // Not valid, reset + reset2REQA(); + } + break; + case STATE_SAK: + // SAK: 1Byte SAK + CRC + if(TrafficSource == TRAFFIC_CARD && + BitCount == 3*9 && + checkParityBits(Buffer, BitCount)) + { + if((Buffer[0] & 0x04) == 0x00){ + // UID complete, success SELECTED, + // TODO: Mark the current threshold as success and continue + // reset + SniffState = STATE_REQA; + selected = true; + LED_PORT.OUTCLR = LED_RED; + + } else { + // UID not complete, goto ANTICOLLI + SniffState = STATE_ANTICOLLI; + } + } else{ + reset2REQA(); + } + break; + default: + break; } break; + default: return 0; } diff --git a/Firmware/Chameleon-Mini/Codec/SniffISO14443-2A.c b/Firmware/Chameleon-Mini/Codec/SniffISO14443-2A.c index fb2a51a..b58cc16 100644 --- a/Firmware/Chameleon-Mini/Codec/SniffISO14443-2A.c +++ b/Firmware/Chameleon-Mini/Codec/SniffISO14443-2A.c @@ -513,18 +513,26 @@ void Sniff14443ACodecTask(void) PORTE.OUTSET = PIN3_bm; if(Flags.ReaderDataAvaliable){ Flags.ReaderDataAvaliable = false; + LogEntry(LOG_INFO_CODEC_SNI_READER_DATA, CodecBuffer, (ReaderBitCount+7)/8); - ApplicationProcess(CodecBuffer, (ReaderBitCount+7)/8); + // Let the Application layer know where this data comes from LEDHook(LED_CODEC_RX, LED_PULSE); + + TrafficSource = TRAFFIC_READER; + ApplicationProcess(CodecBuffer, ReaderBitCount); } if (Flags.CardDataAvaliable){ Flags.CardDataAvaliable = false; + // CardBitCount = removeParityBits(CodecBuffer2,CardBitCount ); LogEntry(LOG_INFO_CODEC_SNI_CARD_DATA_W_PARITY, CodecBuffer2, (CardBitCount + 7) / 8); LEDHook(LED_CODEC_RX, LED_PULSE); - ApplicationProcess(CodecBuffer2, (CardBitCount+7)/8); + + // Let the Application layer know where this data comes from + TrafficSource = TRAFFIC_CARD; + ApplicationProcess(CodecBuffer2, CardBitCount); } diff --git a/Firmware/Chameleon-Mini/Codec/SniffISO14443-2A.h b/Firmware/Chameleon-Mini/Codec/SniffISO14443-2A.h index b8616b0..0e22d46 100644 --- a/Firmware/Chameleon-Mini/Codec/SniffISO14443-2A.h +++ b/Firmware/Chameleon-Mini/Codec/SniffISO14443-2A.h @@ -9,7 +9,7 @@ #include "Codec.h" #include "Terminal/CommandLine.h" -extern enum RCTraffic {TRAFFIC_READER, TRAFFIC_CARD} TrafficSource; +enum RCTraffic {TRAFFIC_READER, TRAFFIC_CARD} TrafficSource; /* Codec Interface */ void Sniff14443ACodecInit(void); void Sniff14443ACodecDeInit(void); From 86d47110a97f18ebbffd3ac8d7ed79e1ce3bacc1 Mon Sep 17 00:00:00 2001 From: chenzitai Date: Fri, 27 Jul 2018 01:46:12 +0100 Subject: [PATCH 082/104] Basic auto calibrate for sniffing mode. Started from the smallest threshold and when the first good threshold is obtained, stop. May also need to extend the TIMEOUT to make this work. Need the reader reading all the timing when sniffing in order to auto calibrate (cherry picked from commit 2c3d5f5) --- .../Chameleon-Mini/Application/Sniff14443A.c | 102 ++++++++++-------- .../Chameleon-Mini/Codec/SniffISO14443-2A.c | 2 - 2 files changed, 57 insertions(+), 47 deletions(-) diff --git a/Firmware/Chameleon-Mini/Application/Sniff14443A.c b/Firmware/Chameleon-Mini/Application/Sniff14443A.c index e652834..59f3ed7 100644 --- a/Firmware/Chameleon-Mini/Application/Sniff14443A.c +++ b/Firmware/Chameleon-Mini/Application/Sniff14443A.c @@ -11,7 +11,7 @@ extern bool checkParityBits(uint8_t * Buffer, uint16_t BitCount); Sniff14443Command Sniff14443CurrentCommand = Sniff14443_Do_Nothing; -bool selected = false; +//bool selected = false; static enum { STATE_IDLE, STATE_REQA, @@ -22,16 +22,21 @@ static enum { STATE_SAK, } SniffState = STATE_IDLE; +static uint16_t tmp_th = CODEC_THRESHOLD_CALIBRATE_MIN; +static uint8_t Thresholds[(CODEC_THRESHOLD_CALIBRATE_MAX - CODEC_THRESHOLD_CALIBRATE_MIN) / + CODEC_THRESHOLD_CALIBRATE_STEPS] = {0}; void Sniff14443AAppInit(void){ SniffState = STATE_REQA; - selected = false; + + tmp_th = CODEC_THRESHOLD_CALIBRATE_MIN; + CodecThresholdSet(tmp_th); } void Sniff14443AAppReset(void){ SniffState = STATE_IDLE; + Sniff14443CurrentCommand = Sniff14443_Do_Nothing; - selected = false; } // Currently APPTask and AppTick is not being used void Sniff14443AAppTask(void){/* Empty */} @@ -41,24 +46,31 @@ void Sniff14443AAppTimeout(void){ Sniff14443AAppReset(); } -void reset2REQA(void){ +INLINE void reset2REQA(void){ SniffState = STATE_REQA; LED_PORT.OUTCLR = LED_RED; - selected = false; - // TODO: Mark the current threshold as fail and continue + // Mark the current threshold as fail and continue + if(tmp_th < CODEC_THRESHOLD_CALIBRATE_MAX){ + Thresholds[(tmp_th - CODEC_THRESHOLD_CALIBRATE_MIN) / CODEC_THRESHOLD_CALIBRATE_STEPS] = 0; + tmp_th = CodecThresholdIncrement(); + } else{ + // mark finish + } } uint16_t Sniff14443AAppProcess(uint8_t* Buffer, uint16_t BitCount){ switch (Sniff14443CurrentCommand){ - case Sniff14443_Do_Nothing: + case Sniff14443_Do_Nothing: { return 0; - case Sniff14443_Autocalibrate: - switch (SniffState){ + } + case Sniff14443_Autocalibrate: { + + switch (SniffState) { case STATE_REQA: + LED_PORT.OUTCLR = LED_RED; // If received Reader REQA or WUPA if (TrafficSource == TRAFFIC_READER && - (Buffer[0] == 0x26 || Buffer[0] == 0x54)) - { + (Buffer[0] == 0x26 || Buffer[0] == 0x52)) { SniffState = STATE_ATQA; } else { // Stay in this state, do noting @@ -67,19 +79,18 @@ uint16_t Sniff14443AAppProcess(uint8_t* Buffer, uint16_t BitCount){ case STATE_ATQA: // ATQA: P RRRR XXXX P XXRX XXXX if (TrafficSource == TRAFFIC_CARD && - BitCount == 2*9 && - (Buffer[0] & 0x20) == 0x00 && // Bit6 RFU shall be 0 - (Buffer[1] & 0xE0) == 0x00 && // bit13-16 RFU shall be 0 - (Buffer[2] & 0x01) == 0x00 && - checkParityBits(Buffer, BitCount)) - { + BitCount == 2 * 9 && + (Buffer[0] & 0x20) == 0x00 && // Bit6 RFU shall be 0 + (Buffer[1] & 0xE0) == 0x00 && // bit13-16 RFU shall be 0 + (Buffer[2] & 0x01) == 0x00 && + checkParityBits(Buffer, BitCount)) { // Assume this is a good ATQA SniffState = STATE_ANTICOLLI; } else { // If not ATQA, but REQA, then stay on this state, // Reset to REQA, save the counter and reset the counter if (TrafficSource == TRAFFIC_READER && - (Buffer[0] == 0x26 || Buffer[0] == 0x54)) { + (Buffer[0] == 0x26 || Buffer[0] == 0x52)) { } else { // If not ATQA and not REQA then reset to REQA reset2REQA(); @@ -87,23 +98,21 @@ uint16_t Sniff14443AAppProcess(uint8_t* Buffer, uint16_t BitCount){ } break; case STATE_ANTICOLLI: - LED_PORT.OUTSET = LED_RED; // SEL: 93/95/97 - if(TrafficSource == TRAFFIC_READER && - BitCount == 2*8 && - (Buffer[0] & 0xf0) == 0x90 && - (Buffer[0] & 0x09) == 0x01) - { + if (TrafficSource == TRAFFIC_READER && + BitCount == 2 * 8 && + (Buffer[0] & 0xf0) == 0x90 && + (Buffer[0] & 0x09) == 0x01) { SniffState = STATE_UID; - } else{ + + } else { reset2REQA(); } break; case STATE_UID: - if(TrafficSource == TRAFFIC_CARD && - BitCount == 5*9 && - checkParityBits(Buffer, BitCount)) - { + if (TrafficSource == TRAFFIC_CARD && + BitCount == 5 * 9 && + checkParityBits(Buffer, BitCount)) { SniffState = STATE_SELECT; } else { reset2REQA(); @@ -113,36 +122,39 @@ uint16_t Sniff14443AAppProcess(uint8_t* Buffer, uint16_t BitCount){ // SELECT: 9 bytes, SEL = 93/95/97, NVB=70 if (TrafficSource == TRAFFIC_READER && - BitCount == 9*8 && - (Buffer[0] & 0xf0) == 0x90 && - (Buffer[0] & 0x09) == 0x01 && - Buffer[1] == 0x70) - { + BitCount == 9 * 8 && + (Buffer[0] & 0xf0) == 0x90 && + (Buffer[0] & 0x09) == 0x01 && + Buffer[1] == 0x70) { SniffState = STATE_SAK; - } else{ + } else { // Not valid, reset reset2REQA(); } break; case STATE_SAK: // SAK: 1Byte SAK + CRC - if(TrafficSource == TRAFFIC_CARD && - BitCount == 3*9 && - checkParityBits(Buffer, BitCount)) - { - if((Buffer[0] & 0x04) == 0x00){ + if (TrafficSource == TRAFFIC_CARD && + BitCount == 3 * 9 && + checkParityBits(Buffer, BitCount)) { + if ((Buffer[0] & 0x04) == 0x00) { // UID complete, success SELECTED, - // TODO: Mark the current threshold as success and continue + // Mark the current threshold as ok and finish // reset SniffState = STATE_REQA; - selected = true; - LED_PORT.OUTCLR = LED_RED; + LED_PORT.OUTSET = LED_RED; + Thresholds[(tmp_th - CODEC_THRESHOLD_CALIBRATE_MIN) / CODEC_THRESHOLD_CALIBRATE_STEPS] += 1; + CommandLinePendingTaskFinished(COMMAND_INFO_OK_WITH_TEXT_ID, NULL); + char tmpBuf[10]; + snprintf(tmpBuf, 10, "%4" PRIu16 ": ", tmp_th); + TerminalSendString(tmpBuf); + Sniff14443AAppReset(); } else { // UID not complete, goto ANTICOLLI SniffState = STATE_ANTICOLLI; } - } else{ + } else { reset2REQA(); } break; @@ -150,7 +162,7 @@ uint16_t Sniff14443AAppProcess(uint8_t* Buffer, uint16_t BitCount){ break; } break; - + } default: return 0; } diff --git a/Firmware/Chameleon-Mini/Codec/SniffISO14443-2A.c b/Firmware/Chameleon-Mini/Codec/SniffISO14443-2A.c index b58cc16..628eead 100644 --- a/Firmware/Chameleon-Mini/Codec/SniffISO14443-2A.c +++ b/Firmware/Chameleon-Mini/Codec/SniffISO14443-2A.c @@ -281,8 +281,6 @@ INLINE void CardSniffInit(void) * bit halves had modulations since the last pause. */ - DACB.CH0DATA = GlobalSettings.ActiveSettingPtr->ReaderThreshold; // real threshold voltage can be calculated with ch0data * Vref / 0xFFF - // Comparator ADC /* Configure and enable the analog comparator for finding pauses in the DEMOD signal. */ ACA.AC0CTRL = AC_HSMODE_bm | AC_HYSMODE_NO_gc | AC_INTMODE_FALLING_gc | AC_ENABLE_bm; From daf51f28d77936d7a24c2d3a5eafd8786689443f Mon Sep 17 00:00:00 2001 From: chenzitai Date: Fri, 27 Jul 2018 17:12:53 +0100 Subject: [PATCH 083/104] Continue threshold searching from the last searched value or the current configured value (cherry picked from commit f3aa7b2) --- Firmware/Chameleon-Mini/Application/Sniff14443A.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/Firmware/Chameleon-Mini/Application/Sniff14443A.c b/Firmware/Chameleon-Mini/Application/Sniff14443A.c index 59f3ed7..bea898c 100644 --- a/Firmware/Chameleon-Mini/Application/Sniff14443A.c +++ b/Firmware/Chameleon-Mini/Application/Sniff14443A.c @@ -28,9 +28,8 @@ static uint8_t Thresholds[(CODEC_THRESHOLD_CALIBRATE_MAX - CODEC_THRESHOLD_CALIB void Sniff14443AAppInit(void){ SniffState = STATE_REQA; - - tmp_th = CODEC_THRESHOLD_CALIBRATE_MIN; - CodecThresholdSet(tmp_th); + // Get current threshold and continue searching from here + tmp_th = GlobalSettings.ActiveSettingPtr->ReaderThreshold; } void Sniff14443AAppReset(void){ @@ -56,6 +55,7 @@ INLINE void reset2REQA(void){ tmp_th = CodecThresholdIncrement(); } else{ // mark finish + CommandLinePendingTaskFinished(COMMAND_INFO_FALSE, NULL); } } uint16_t Sniff14443AAppProcess(uint8_t* Buffer, uint16_t BitCount){ @@ -145,10 +145,14 @@ uint16_t Sniff14443AAppProcess(uint8_t* Buffer, uint16_t BitCount){ LED_PORT.OUTSET = LED_RED; Thresholds[(tmp_th - CODEC_THRESHOLD_CALIBRATE_MIN) / CODEC_THRESHOLD_CALIBRATE_STEPS] += 1; CommandLinePendingTaskFinished(COMMAND_INFO_OK_WITH_TEXT_ID, NULL); + // Send this threshold to terminal char tmpBuf[10]; snprintf(tmpBuf, 10, "%4" PRIu16 ": ", tmp_th); TerminalSendString(tmpBuf); + // Save value to EEPROM + SETTING_UPDATE(GlobalSettings.ActiveSettingPtr->ReaderThreshold); + Sniff14443AAppReset(); } else { // UID not complete, goto ANTICOLLI From eea78c8f5661faddaa55a9fda1500ccb541535a9 Mon Sep 17 00:00:00 2001 From: chenzitai Date: Tue, 17 Jul 2018 15:43:09 +0100 Subject: [PATCH 084/104] Decode sniffing data with parityBit in Python Software If parity bit check failed, ! is appended to the data and raw data is diaplayed Currently Software layer parity bit check and removal is only enabled in sniffing mode (cherry picked from commit 2cfd54a) --- Software/Chameleon/Log.py | 47 +++++++++++++++++++++++++++++++++++++++ Software/chamlog.py | 1 + 2 files changed, 48 insertions(+) diff --git a/Software/Chameleon/Log.py b/Software/Chameleon/Log.py index bcf7a24..168704c 100644 --- a/Software/Chameleon/Log.py +++ b/Software/Chameleon/Log.py @@ -2,6 +2,40 @@ import struct import binascii +import math + +def checkParityBit(data): + byteCount = len(data) + # Short frame, no parityBit + if (byteCount == 1): + return (True, data) + + # 9 bit is a group, validate bit count is calculated below + bitCount = int((byteCount*8)/9) * 9 + parsedData = bytearray(int(bitCount/9)) + + oneCounter = 0 # Counter for count ones in a byte + for i in range(0, bitCount): + # Get bit i in data + byteIndex = math.floor(i/8) + bitIndex = i % 8 + bit = (data[byteIndex] >> bitIndex) & 0x01 + + # Check parityBit + # Current bit is parityBit + if(i % 9 == 8): + # Even number of ones in current byte + if(oneCounter % 2 and bit == 1): + return (False, data) + # Odd number of ones in current byte + elif((not oneCounter % 2) and bit == 0): + return (False, data) + oneCounter = 0 + # Current bit is normal bit + else: + oneCounter += bit + parsedData[int(i/9)] |= bit << (i%9) + return (True, parsedData) def noDecoder(data): return "" @@ -12,6 +46,13 @@ def textDecoder(data): def binaryDecoder(data): return binascii.hexlify(data).decode() +def binaryParityDecoder(data): + isValid, checkedData = checkParityBit(data) + if(isValid): + return binascii.hexlify(checkedData).decode() + else: + return binascii.hexlify(checkedData).decode()+"!" + eventTypes = { 0x00: { 'name': 'EMPTY', 'decoder': noDecoder }, 0x10: { 'name': 'GENERIC', 'decoder': textDecoder }, @@ -25,6 +66,12 @@ eventTypes = { 0x42: { 'name': 'CODEC RX W/PARITY', 'decoder': binaryDecoder }, 0x43: { 'name': 'CODEC TX W/PARITY', 'decoder': binaryDecoder }, + 0x44: { 'name': 'CODEC RX SNI READER', 'decoder': binaryDecoder }, + 0x45: { 'name': 'CODEC RX SNI READER W/PARITY', 'decoder': binaryParityDecoder }, + 0x46: { 'name': 'CODEC RX SNI CARD', 'decoder': binaryDecoder }, + 0x47: { 'name': 'CODEC RX SNI CARD W/PARITY', 'decoder': binaryParityDecoder }, + + 0x80: { 'name': 'APP READ', 'decoder': binaryDecoder }, 0x81: { 'name': 'APP WRITE', 'decoder': binaryDecoder }, 0x84: { 'name': 'APP INC', 'decoder': binaryDecoder }, diff --git a/Software/chamlog.py b/Software/chamlog.py index e73d503..f644379 100755 --- a/Software/chamlog.py +++ b/Software/chamlog.py @@ -58,6 +58,7 @@ def main(): else: verboseFunc = None + print("\nNote: If parityBit check failed, '!' is appended to the decoded data and raw data with parity bit is displayed.\n") if (args.live): # Live logging mode if (args.port is not None): From 74010123cde6c99bcaeac64b5ab8b83a657f0c5c Mon Sep 17 00:00:00 2001 From: chenzitai Date: Thu, 19 Jul 2018 13:49:35 +0100 Subject: [PATCH 085/104] Add basic ISO14443 log data parser for Reader side traffic Can parse: SELECT, HALE, RATS, PPS, DESELECT (cherry picked from commit aa46598) --- Software/Chameleon/ISO14443.py | 87 ++++++++++++++++++++++++++++++++++ Software/Chameleon/Log.py | 12 ++++- Software/chamlog.py | 8 ++-- 3 files changed, 102 insertions(+), 5 deletions(-) create mode 100644 Software/Chameleon/ISO14443.py diff --git a/Software/Chameleon/ISO14443.py b/Software/Chameleon/ISO14443.py new file mode 100644 index 0000000..a04d253 --- /dev/null +++ b/Software/Chameleon/ISO14443.py @@ -0,0 +1,87 @@ +import binascii + +ReaderTrafficTypes = { + "SEL":{ + 0x93: "SEL_CL1 ", + 0x95: "SEL_CL2 ", + 0x97: "SEL_CL3 ", + }, + # 1 byte commands + "SHORTFRAME": { + 0x26: "REQA", + 0x52: "WUPA", + 0x35: "Optional Timeslot Method", + # 40 - 4F Proprietary + # 78 - 7F proprietary + # Other RFU + }, + "FSDI":{ + 0x0: "FSD:16 ", + 0x1: "FSD:24 ", + 0x2: "FSD:32 ", + 0x3: "FSD:40 ", + 0x4: "FSD:48 ", + 0x5: "FSD:64 ", + 0x6: "FSD:96 ", + 0x7: "FSD:128 ", + 0x8: "FSD:256 " + }, +} + +CardTrafficTypes = { + +} +def parseReader(data): + byteCount = len(data) + note = "" + + # short frame commands + if (byteCount == 1 and data[0] in ReaderTrafficTypes["SHORTFRAME"]): + note += ReaderTrafficTypes["SHORTFRAME"][data[0]] + + # ANTICOLLISION command + elif (byteCount<9 and byteCount > 1 and data[0] in ReaderTrafficTypes["SEL"] and data[1] & 0x88 == 0 ): + note += "ATCOLI - " + note += ReaderTrafficTypes["SEL"][data[0]] + # note += "UID_CLn:" + binascii.hexlify(data[2:7]).decode() + " " + # note += str((data[1] >> 4) & 0x0f) + "bytes + " + str(data[1] & 0x0f) + "bits " + + # SELECT Command + elif (byteCount== 9 and data[0] in ReaderTrafficTypes["SEL"] and data[1] == 0x70): + note += "SELECT - " + note += ReaderTrafficTypes["SEL"][data[0]] + note += "UID_CLn:" + binascii.hexlify(data[2:7]).decode() + " " + # note += "7bytes + 0bits " + # note += "CRC_A:"+data[8] + # HALT Command + elif (byteCount == 4 and data[0] == 0x50 and data[1] == 0x00): + note += "HALT" + # RATS + elif (byteCount == 4 and data[0] == 0xe0 and ((data[1] & 0x0f) < 15) and ((data[1] & 0xf0 >> 8) in ReaderTrafficTypes["FSDI"])): + note += "RATS - " + note += ReaderTrafficTypes["FSDI"][data[1]>>8] + note += "CID:" + str(data[1]&0x0f) + " " + # PPS Protocol and parameter selection request + # PSS0 only + elif (byteCount == 4 and (data[0]&0xf0 == 0xd0) and (data[1] == 0x01)): + note += "PSS0 - " + note += "CID:"+str(data[1]&0x0f) + " " + # PSS0+1 + elif (byteCount == 5 and (data[0]&0xf0 == 0xd0) and (data[1] == 0x11) and (data[2]&0xf0 == 0x00)): + note += "PSS0+1 - " + note += "CID:"+str(data[1]&0x0f) + " " + note += "DSI:"+str(pow(2,(data[2]>>2)&0x03)) + " " + note += "DRI:"+str(pow(2,data[2]&0x03)) + " " + # BLOCK S-block PCB DESELECT + # Without CID + elif (byteCount == 3 and data[0] == 0xc2): + note += "DESEL" + # With CID + elif (byteCount == 4 and data[0] == 0xca and data[1]&0x30 == 0x00): + note += "DESEL - " + note += "CID:"+ str(data[1]&0x0f) + " " + + return note + +def parseCard(data): + pass \ No newline at end of file diff --git a/Software/Chameleon/Log.py b/Software/Chameleon/Log.py index 168704c..61d2098 100644 --- a/Software/Chameleon/Log.py +++ b/Software/Chameleon/Log.py @@ -3,6 +3,7 @@ import struct import binascii import math +import Chameleon.ISO14443 as iso14443_3 def checkParityBit(data): byteCount = len(data) @@ -96,7 +97,7 @@ eventTypes = { TIMESTAMP_MAX = 65536 eventTypes = { i : ({'name': 'UNKNOWN', 'decoder': binaryDecoder} if i not in eventTypes.keys() else eventTypes[i]) for i in range(256) } -def parseBinary(binaryStream): +def parseBinary(binaryStream, decode=False): log = [] # Completely read file contents and process them byte by byte @@ -135,13 +136,20 @@ def parseBinary(binaryStream): if (deltaTimestamp < 0): deltaTimestamp += TIMESTAMP_MAX; + note = "" + # If we need to decode the data + if (decode): + # Decode the data from Reader + if(event == 0x44 or event == 0x45): + note = iso14443_3.parseReader(binascii.a2b_hex(logData)) # Create log entry as dict and append it to event list logEntry = { 'eventName': eventTypes[event]['name'], 'dataLength': dataLength, 'timestamp': timestamp, 'deltaTimestamp': deltaTimestamp, - 'data': logData + 'data': logData, + 'note': note } log.append(logEntry) diff --git a/Software/chamlog.py b/Software/chamlog.py index f644379..da4281a 100755 --- a/Software/chamlog.py +++ b/Software/chamlog.py @@ -19,10 +19,11 @@ def verboseLog(text): def formatText(log): formatString = '{timestamp:0>5d} ms <{deltaTimestamp:>+6d} ms>:' - formatString += '{eventName:<16} ({dataLength:<3} bytes) [{data}]\n' + formatString += '{eventName:<28} ({dataLength:<3} bytes)\t[{data:<20}]\t{note}\n' text = '' for logEntry in log: + text += formatString.format(**logEntry) return text @@ -46,6 +47,7 @@ def main(): argParser.add_argument("-t", "--type", choices=outputTypes.keys(), default='text', help="specifies output type") + argParser.add_argument("-d", "--decode", dest="decode", action='store_true', default=False) argParser.add_argument("-l", "--live", dest="live", action='store_true', help="Use live logging capabilities of Chameleon") argParser.add_argument("-c", "--clear", dest="clear", action='store_true', help="Clear Chameleon's log memory when using -p") argParser.add_argument("-m", "--mode", dest="mode", metavar="LOGMODE", help="Additionally set Chameleon's log mode after reading it's memory") @@ -69,7 +71,7 @@ def main(): while True: stream = io.BytesIO(chameleon.read()) - log = Chameleon.Log.parseBinary(stream) + log = Chameleon.Log.parseBinary(stream, args.decode) if (len(log) > 0): print(outputTypes[args.type](log)) @@ -95,7 +97,7 @@ def main(): sys.exit(2) # Parse actual logfile - log = Chameleon.Log.parseBinary(handle) + log = Chameleon.Log.parseBinary(handle, args.decode) # Print to console using chosen output type print(outputTypes[args.type](log)) From 7cc3793033f135858926c121b24bee476f26d0e9 Mon Sep 17 00:00:00 2001 From: chenzitai Date: Sun, 22 Jul 2018 00:09:10 +0100 Subject: [PATCH 086/104] Add commands for setting threshold and upgrade (cherry picked from commit d43975e) --- Software/Chameleon/Device.py | 14 +++++++++++++- Software/chamtool.py | 21 ++++++++++++++++++++- 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/Software/Chameleon/Device.py b/Software/Chameleon/Device.py index 57169c7..1852cf0 100644 --- a/Software/Chameleon/Device.py +++ b/Software/Chameleon/Device.py @@ -21,7 +21,10 @@ class Device: COMMAND_RBUTTON = "RBUTTON" COMMAND_GREEN_LED = "LEDGREEN" COMMAND_RED_LED = "LEDRED" - + COMMAND_THRESHOLD = "THRESHOLD" + COMMAND_UPGRADE = "upgrade" + + STATUS_CODE_OK = 100 STATUS_CODE_OK_WITH_TEXT = 101 STATUS_CODE_WAITING_FOR_XMODEM = 110 @@ -240,3 +243,12 @@ class Device: return self.getCmdSuggestions(self.COMMAND_RED_LED) else: return self.getSetCmd(self.COMMAND_RED_LED, newFunction) + + def cmdThreshold(self, value): + if(value == self.SUGGEST_CHAR): + return self.getCmdSuggestions(self.COMMAND_THRESHOLD) + else: + return self.getSetCmd(self.COMMAND_THRESHOLD, value) + + def cmdUpgrade(self): + return self.execCmd(self.COMMAND_UPGRADE) \ No newline at end of file diff --git a/Software/chamtool.py b/Software/chamtool.py index 6f97a96..0e964ee 100755 --- a/Software/chamtool.py +++ b/Software/chamtool.py @@ -119,7 +119,21 @@ def cmdRedLED(chameleon, arg): return "Red LED function has been set to {}".format(chameleon.cmdRedLED()['response']) else: return "Setting red LED function to {} failed: {}".format(arg, result['statusText']) - + +def cmdThreshold(chameleon, arg): + result = chameleon.cmdThreshold(arg) + + if (arg is None): + return "Current threshold is: {}".format(result['response']) + else: + if (result['statusCode'] in chameleon.STATUS_CODES_SUCCESS): + return "Threshold have been set to {}".format(arg) + else: + return "Setting threshold faled: {}".format(arg, result['statusText']) + +def cmdUpgrade(chameleon, arg): + result = chameleon.cmdUpgrade() + return "" # Custom class for argparse class CmdListAction(argparse.Action): def __init__(self, option_strings, dest, default=False, required=False, @@ -154,6 +168,9 @@ def main(): cmdArgGroup.add_argument("-rb", "--rbutton", dest="rbutton", action=CmdListAction, metavar="ACTION", nargs='?', help="retrieve or set the current right button action") cmdArgGroup.add_argument("-gl", "--gled", dest="gled", action=CmdListAction, metavar="FUNCTION", nargs='?', help="retrieve or set the current green led function") cmdArgGroup.add_argument("-rl", "--rled", dest="rled", action=CmdListAction, metavar="FUNCTION", nargs='?', help="retrieve or set the current red led function") + cmdArgGroup.add_argument("-th", "--threshold", dest="threshold", action=CmdListAction, nargs='?', help="retrieve or set the threshold") + cmdArgGroup.add_argument("-ug", "--upgrade", dest="upgrade", action=CmdListAction, nargs=0, help="set the micro Controller to upgrade mode") + args = argParser.parse_args() if (args.verbose): @@ -179,6 +196,8 @@ def main(): "rbutton" : cmdRButton, "gled" : cmdGreenLED, "rled" : cmdRedLED, + "threshold" : cmdThreshold, + "upgrade" : cmdUpgrade, } if hasattr(args, "cmdList"): From c145976f3fcadcd185caeb46e3b938b177f18bcf Mon Sep 17 00:00:00 2001 From: chenzitai Date: Wed, 25 Jul 2018 00:51:40 +0100 Subject: [PATCH 087/104] Add CRC_A check function for Decode Reader SELECT and RATS command (cherry picked from commit 4eec449) --- Software/Chameleon/ISO14443.py | 29 ++++++++++++++++++++++++++++- Software/requirements.txt | 1 + 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/Software/Chameleon/ISO14443.py b/Software/Chameleon/ISO14443.py index a04d253..4956232 100644 --- a/Software/Chameleon/ISO14443.py +++ b/Software/Chameleon/ISO14443.py @@ -1,4 +1,10 @@ import binascii +import crcmod + +# Parameters for CRC_A +CRC_INIT = 0x6363 +POLY = 0x11021 +CRC_A_func = crcmod.mkCrcFun(POLY, initCrc=CRC_INIT, xorOut=0) ReaderTrafficTypes = { "SEL":{ @@ -31,6 +37,22 @@ ReaderTrafficTypes = { CardTrafficTypes = { } + +def CRC_A(data): + return CRC_A_func(data) + +def CRC_A_check(data): + datalen = len(data) + # Short frame or no space for CRC skip check + if(datalen < 4 ): + return + + crc = CRC_A(bytearray(data[0:datalen-2])).to_bytes(2,'little') + if (data[datalen-2:datalen] == crc): + return True + else: + return False + def parseReader(data): byteCount = len(data) note = "" @@ -51,8 +73,11 @@ def parseReader(data): note += "SELECT - " note += ReaderTrafficTypes["SEL"][data[0]] note += "UID_CLn:" + binascii.hexlify(data[2:7]).decode() + " " + # Check CRC for SELECT + if(not CRC_A_check(data)): + note+=" WRONG CRC " # note += "7bytes + 0bits " - # note += "CRC_A:"+data[8] + # note += "CRC_A:"+data[7:9] # HALT Command elif (byteCount == 4 and data[0] == 0x50 and data[1] == 0x00): note += "HALT" @@ -61,6 +86,8 @@ def parseReader(data): note += "RATS - " note += ReaderTrafficTypes["FSDI"][data[1]>>8] note += "CID:" + str(data[1]&0x0f) + " " + if(not CRC_A_check(data)): + note+=" WRONG CRC " # PPS Protocol and parameter selection request # PSS0 only elif (byteCount == 4 and (data[0]&0xf0 == 0xd0) and (data[1] == 0x01)): diff --git a/Software/requirements.txt b/Software/requirements.txt index f6c1a1f..5900a94 100644 --- a/Software/requirements.txt +++ b/Software/requirements.txt @@ -1 +1,2 @@ pyserial +crcmod \ No newline at end of file From 686cbf011e8f42f21297f7d9c7b148fe1c03ac8a Mon Sep 17 00:00:00 2001 From: chenzitai Date: Sat, 28 Jul 2018 01:28:55 +0100 Subject: [PATCH 088/104] Add decode functions for card response in anti collision phase (cherry picked from commit b4ca798) --- Software/Chameleon/ISO14443.py | 36 +++++++++++++++++++++++++++++----- Software/Chameleon/Log.py | 2 ++ 2 files changed, 33 insertions(+), 5 deletions(-) diff --git a/Software/Chameleon/ISO14443.py b/Software/Chameleon/ISO14443.py index 4956232..e5242b8 100644 --- a/Software/Chameleon/ISO14443.py +++ b/Software/Chameleon/ISO14443.py @@ -32,10 +32,15 @@ ReaderTrafficTypes = { 0x7: "FSD:128 ", 0x8: "FSD:256 " }, + } CardTrafficTypes = { - + "SAK":{ + 0x04: "UID NOT Complete ", + 0x20: "UID complete, PICC compliant with 14443-4 ", + 0x00: "UID complete, PICC NOT compliant with 14443-4" + } } def CRC_A(data): @@ -43,9 +48,9 @@ def CRC_A(data): def CRC_A_check(data): datalen = len(data) - # Short frame or no space for CRC skip check - if(datalen < 4 ): - return + # Short frame/SAK or no space for CRC skip check + if(datalen < 3 ): + return True crc = CRC_A(bytearray(data[0:datalen-2])).to_bytes(2,'little') if (data[datalen-2:datalen] == crc): @@ -70,9 +75,10 @@ def parseReader(data): # SELECT Command elif (byteCount== 9 and data[0] in ReaderTrafficTypes["SEL"] and data[1] == 0x70): + # TODO: distinguish CT+uid012+BCC and uid0123+BCC note += "SELECT - " note += ReaderTrafficTypes["SEL"][data[0]] - note += "UID_CLn:" + binascii.hexlify(data[2:7]).decode() + " " + note += "UID_CLn:" + binascii.hexlify(data[2:6]).decode() + " " # Check CRC for SELECT if(not CRC_A_check(data)): note+=" WRONG CRC " @@ -111,4 +117,24 @@ def parseReader(data): return note def parseCard(data): + + byteCount = len(data) + note = "" + + # ATQA: RRRR XXXX XXRX XXXX + if(byteCount == 2 and (data[0] & 0x20 == 0x00) and (data[1] & 0xf0 == 0x00)): + note += "ATQA - " + note += binascii.hexlify(data).decode() + # SAK + elif (byteCount == 3 and (data[0] & (~0x24)) == 0x00): + note += "SAK - " + note += CardTrafficTypes["SAK"][(data[2] & 0x24)] + if not CRC_A_check(data): + note += " WRONG CRC " + # UID + elif (byteCount == 5 and (data[0] ^ data[1] ^ data[2] ^ data[3]) == data[4] ): + note += "UID Resp - CLn " + + return note + pass \ No newline at end of file diff --git a/Software/Chameleon/Log.py b/Software/Chameleon/Log.py index 61d2098..aa0d7a9 100644 --- a/Software/Chameleon/Log.py +++ b/Software/Chameleon/Log.py @@ -142,6 +142,8 @@ def parseBinary(binaryStream, decode=False): # Decode the data from Reader if(event == 0x44 or event == 0x45): note = iso14443_3.parseReader(binascii.a2b_hex(logData)) + elif (event == 0x46 or event == 0x47): + note = iso14443_3.parseCard(binascii.a2b_hex(logData)) # Create log entry as dict and append it to event list logEntry = { 'eventName': eventTypes[event]['name'], From 56b17302dff67f1bafd666ddcb26676162b06b32 Mon Sep 17 00:00:00 2001 From: chenzitai Date: Sun, 29 Jul 2018 15:38:07 +0100 Subject: [PATCH 089/104] Add decoding ATS in sniffing mode (cherry picked from commit 1ef1af2) --- Software/Chameleon/ISO14443.py | 133 ++++++++++++++++++++++++++------- Software/Chameleon/Log.py | 5 +- 2 files changed, 110 insertions(+), 28 deletions(-) diff --git a/Software/Chameleon/ISO14443.py b/Software/Chameleon/ISO14443.py index e5242b8..94c60fa 100644 --- a/Software/Chameleon/ISO14443.py +++ b/Software/Chameleon/ISO14443.py @@ -1,11 +1,19 @@ import binascii import crcmod - +from enum import Enum # Parameters for CRC_A CRC_INIT = 0x6363 POLY = 0x11021 CRC_A_func = crcmod.mkCrcFun(POLY, initCrc=CRC_INIT, xorOut=0) + +class ReaderCMD(Enum): + NONE = 0 + RATS = 1 + PPS = 2 + +readerCMD = ReaderCMD.NONE + ReaderTrafficTypes = { "SEL":{ 0x93: "SEL_CL1 ", @@ -38,8 +46,20 @@ ReaderTrafficTypes = { CardTrafficTypes = { "SAK":{ 0x04: "UID NOT Complete ", + 0x24: "UID NOT Complete, PICC compliant with 14443-4", 0x20: "UID complete, PICC compliant with 14443-4 ", 0x00: "UID complete, PICC NOT compliant with 14443-4" + }, + "FSCI": { + 0x0: "FSCC:16 ", + 0x1: "FSC:24 ", + 0x2: "FSC:32 ", + 0x3: "FSC:40 ", + 0x4: "FSC:48 ", + 0x5: "FSC:64 ", + 0x6: "FSC:96 ", + 0x7: "FSC:128 ", + 0x8: "FSC:256 " } } @@ -58,66 +78,77 @@ def CRC_A_check(data): else: return False -def parseReader(data): +def parseReader_3(data): byteCount = len(data) note = "" # short frame commands if (byteCount == 1 and data[0] in ReaderTrafficTypes["SHORTFRAME"]): - note += ReaderTrafficTypes["SHORTFRAME"][data[0]] + note += ReaderTrafficTypes["SHORTFRAME"][data[0]] # ANTICOLLISION command - elif (byteCount<9 and byteCount > 1 and data[0] in ReaderTrafficTypes["SEL"] and data[1] & 0x88 == 0 ): + elif (byteCount < 9 and byteCount > 1 and data[0] in ReaderTrafficTypes["SEL"] and data[1] & 0x88 == 0): note += "ATCOLI - " note += ReaderTrafficTypes["SEL"][data[0]] # note += "UID_CLn:" + binascii.hexlify(data[2:7]).decode() + " " # note += str((data[1] >> 4) & 0x0f) + "bytes + " + str(data[1] & 0x0f) + "bits " # SELECT Command - elif (byteCount== 9 and data[0] in ReaderTrafficTypes["SEL"] and data[1] == 0x70): + elif (byteCount == 9 and data[0] in ReaderTrafficTypes["SEL"] and data[1] == 0x70): # TODO: distinguish CT+uid012+BCC and uid0123+BCC note += "SELECT - " note += ReaderTrafficTypes["SEL"][data[0]] note += "UID_CLn:" + binascii.hexlify(data[2:6]).decode() + " " # Check CRC for SELECT - if(not CRC_A_check(data)): - note+=" WRONG CRC " + if (not CRC_A_check(data)): + note += " WRONG CRC " # note += "7bytes + 0bits " # note += "CRC_A:"+data[7:9] # HALT Command elif (byteCount == 4 and data[0] == 0x50 and data[1] == 0x00): note += "HALT" + + return note + +def parseReader_4(data): + byteCount = len(data) + note = "" + # RATS - elif (byteCount == 4 and data[0] == 0xe0 and ((data[1] & 0x0f) < 15) and ((data[1] & 0xf0 >> 8) in ReaderTrafficTypes["FSDI"])): + if (byteCount == 4 and data[0] == 0xe0 and ((data[1] & 0x0f) < 15) and ( + (data[1] & 0xf0 >> 8) in ReaderTrafficTypes["FSDI"])): note += "RATS - " - note += ReaderTrafficTypes["FSDI"][data[1]>>8] - note += "CID:" + str(data[1]&0x0f) + " " - if(not CRC_A_check(data)): - note+=" WRONG CRC " + note += ReaderTrafficTypes["FSDI"][data[1] >> 8] + note += "CID:" + str(data[1] & 0x0f) + " " + if (not CRC_A_check(data)): + note += " WRONG CRC " + else: + readerCMD = ReaderCMD.RATS + # PPS Protocol and parameter selection request # PSS0 only - elif (byteCount == 4 and (data[0]&0xf0 == 0xd0) and (data[1] == 0x01)): + elif (byteCount == 4 and (data[0] & 0xf0 == 0xd0) and (data[1] == 0x01)): note += "PSS0 - " - note += "CID:"+str(data[1]&0x0f) + " " + note += "CID:" + str(data[1] & 0x0f) + " " + readerCMD = ReaderCMD.PPS # PSS0+1 - elif (byteCount == 5 and (data[0]&0xf0 == 0xd0) and (data[1] == 0x11) and (data[2]&0xf0 == 0x00)): + elif (byteCount == 5 and (data[0] & 0xf0 == 0xd0) and (data[1] == 0x11) and (data[2] & 0xf0 == 0x00)): note += "PSS0+1 - " - note += "CID:"+str(data[1]&0x0f) + " " - note += "DSI:"+str(pow(2,(data[2]>>2)&0x03)) + " " - note += "DRI:"+str(pow(2,data[2]&0x03)) + " " - # BLOCK S-block PCB DESELECT + note += "CID:" + str(data[1] & 0x0f) + " " + note += "DSI:" + str(pow(2, (data[2] >> 2) & 0x03)) + " " + note += "DRI:" + str(pow(2, data[2] & 0x03)) + " " + # BLOCK S-block PCB DESELECT # Without CID elif (byteCount == 3 and data[0] == 0xc2): note += "DESEL" # With CID - elif (byteCount == 4 and data[0] == 0xca and data[1]&0x30 == 0x00): + elif (byteCount == 4 and data[0] == 0xca and data[1] & 0x30 == 0x00): note += "DESEL - " - note += "CID:"+ str(data[1]&0x0f) + " " - + note += "CID:" + str(data[1] & 0x0f) + " " + return note -def parseCard(data): - +def parseCard_3(data): byteCount = len(data) note = "" @@ -126,7 +157,7 @@ def parseCard(data): note += "ATQA - " note += binascii.hexlify(data).decode() # SAK - elif (byteCount == 3 and (data[0] & (~0x24)) == 0x00): + elif (byteCount == 3 and ((data[0] & (0x24)) in CardTrafficTypes["SAK"])): note += "SAK - " note += CardTrafficTypes["SAK"][(data[2] & 0x24)] if not CRC_A_check(data): @@ -137,4 +168,54 @@ def parseCard(data): return note - pass \ No newline at end of file +def parseCard_4(data): + byteCount = len(data) + note = "" + + # ATS + # TL + T0 + TA + TB + TC + T1 ... + CRC + # TL: length without CRC + # ATS without data + if(byteCount == 3 and data[0] == (byteCount-2)): + note += "ATS - NO DATA" + # ATS with data mush have T0, T0 b8=0 + elif (byteCount > 3 and data[0] == (byteCount-2) + and data[1] & 0x80 == 0x00 + and data[1] & 0x0f in CardTrafficTypes["FSCI"]): + # Decode T0 + hasTA = data[1] & 0x10 + hasTB = data[1] & 0x20 + hasTC = data[1] & 0x40 + note += CardTrafficTypes["FSCI"][data[1] & 0x0f] + + # Which byte to decode next + byteNext = 2 # T0 Decoded, next is TA/TB/TC + # TA b4=0 + if (hasTA and data[byteNext] & 0x08 == 0x00): + note += "TA:" + hex(data[byteNext]) + " " + byteNext += 1 + + if (hasTB): + note += "TB:" + hex(data[byteNext]) + " " + byteNext += 1 + + # TC b3-8=0 + if (hasTC and data[byteNext] & 0xFC == 0x00): + note += "TC:" + hex(data[byteNext]) + " " + byteNext += 1 + + # TODO: decode historical bytes + + # Check CRC_A + if not CRC_A_check(data): + note += " WRONG CRC " + + elif (): + pass + return note + +def parseReader(data): + return parseReader_3(data) + parseReader_4(data) + +def parseCard(data): + return parseCard_3(data) + parseCard_4(data) diff --git a/Software/Chameleon/Log.py b/Software/Chameleon/Log.py index aa0d7a9..c10fd5f 100644 --- a/Software/Chameleon/Log.py +++ b/Software/Chameleon/Log.py @@ -137,13 +137,14 @@ def parseBinary(binaryStream, decode=False): deltaTimestamp += TIMESTAMP_MAX; note = "" - # If we need to decode the data - if (decode): + # If we need to decode the data and paritybit check success + if (decode and logData[-1] != '!'): # Decode the data from Reader if(event == 0x44 or event == 0x45): note = iso14443_3.parseReader(binascii.a2b_hex(logData)) elif (event == 0x46 or event == 0x47): note = iso14443_3.parseCard(binascii.a2b_hex(logData)) + # Create log entry as dict and append it to event list logEntry = { 'eventName': eventTypes[event]['name'], From 13e87a0b65e4310ae68dde5e344984e63e91d581 Mon Sep 17 00:00:00 2001 From: chenzitai Date: Mon, 30 Jul 2018 04:40:21 +0100 Subject: [PATCH 090/104] Decode Basic I-Block and MF DESFire Ev1 APP Data in SniffingMode EV1: AuthAES, Select APP, GetAPPIDs, ReadData and decode I-Block (cherry picked from commit 5a14e1b) --- Software/Chameleon/ISO14443.py | 108 ++++++++++++++++++++++++++---- Software/Chameleon/MFDESFire.py | 113 ++++++++++++++++++++++++++++++++ Software/Chameleon/utils.py | 5 ++ 3 files changed, 214 insertions(+), 12 deletions(-) create mode 100644 Software/Chameleon/MFDESFire.py create mode 100644 Software/Chameleon/utils.py diff --git a/Software/Chameleon/ISO14443.py b/Software/Chameleon/ISO14443.py index 94c60fa..04fd6f6 100644 --- a/Software/Chameleon/ISO14443.py +++ b/Software/Chameleon/ISO14443.py @@ -1,6 +1,10 @@ import binascii import crcmod from enum import Enum + +from Chameleon.MFDESFire import MFDESFireDecode +from Chameleon.utils import TrafficSource + # Parameters for CRC_A CRC_INIT = 0x6363 POLY = 0x11021 @@ -12,6 +16,76 @@ class ReaderCMD(Enum): RATS = 1 PPS = 2 + + +class BlockData: + @staticmethod + def isBlockData(byteCount, data): + if(byteCount >= 3 and (data[0]& 0xE6) in ReaderTrafficTypes["PCB"]): + return True + else: + return False + + def __init__(self, byteCount, data, source): + self.byteCount = byteCount + self.data = data + self.PCB = data[0] + self.type = ReaderTrafficTypes["PCB"][self.PCB & 0xE6] + self.CID = None + self.NAD = None + self.INF = None + self.source = source + self.CRCChecked = CRC_A_check(data) + self.CardApplicationDecoder = MFDESFireDecode + + if self.CRCChecked: + + hasCID = self.PCB & 0x08 # PCB b4 indicate CID + hasNAD = 0 + + if (self.type == "IBlock"): + hasNAD = self.PCB & 0x04 # IBlock PCB b2 indicate NAD + + byteNext = 1 + # CID + if (hasCID): + self.CID = self.data[byteNext] + byteNext += 1 + + # NAD + if (hasNAD): + self.NAD = self.data[byteNext] + byteNext += 1 + + # INF field not empty + if(byteNext < byteCount -2): + self.INF = self.data[byteNext: byteCount-2] + + + def decode(self): + note = "" + # Prologue + # PCB + note += self.type + " " + + # CID + if (self.CID != None): + note += "CID:" + hex(self.CID) + " " + + # NAD + if (self.NAD != None): + note += "NAD:" + hex(self.NAD) + " " + + # INF + if (self.INF != None): + note += self.CardApplicationDecoder(self.INF, self.source) + # EDC CRC check + if not self.CRCChecked: + note += " WRONG CRC " + + + return note + readerCMD = ReaderCMD.NONE ReaderTrafficTypes = { @@ -40,7 +114,16 @@ ReaderTrafficTypes = { 0x7: "FSD:128 ", 0x8: "FSD:256 " }, - + "PCB":{ + # IBlock 000X XX1X + 0x02: "IBlock", # 000X X01X + 0x08: "IBlock", # 000X X11X + # RBlock 101X X01X + 0xA2: "RBlock", # 101X X01X + # SBlock 11XX X010 + 0xC2: "SBlock", # 110X X010 + 0xE2: "SBlock" # 111X X010 + } } CardTrafficTypes = { @@ -119,7 +202,7 @@ def parseReader_4(data): (data[1] & 0xf0 >> 8) in ReaderTrafficTypes["FSDI"])): note += "RATS - " note += ReaderTrafficTypes["FSDI"][data[1] >> 8] - note += "CID:" + str(data[1] & 0x0f) + " " + note += "CID:" + hex(data[1] & 0x0f) + " " if (not CRC_A_check(data)): note += " WRONG CRC " else: @@ -137,14 +220,12 @@ def parseReader_4(data): note += "CID:" + str(data[1] & 0x0f) + " " note += "DSI:" + str(pow(2, (data[2] >> 2) & 0x03)) + " " note += "DRI:" + str(pow(2, data[2] & 0x03)) + " " - # BLOCK S-block PCB DESELECT - # Without CID - elif (byteCount == 3 and data[0] == 0xc2): - note += "DESEL" - # With CID - elif (byteCount == 4 and data[0] == 0xca and data[1] & 0x30 == 0x00): - note += "DESEL - " - note += "CID:" + str(data[1] & 0x0f) + " " + + # Half-duplex block transmission + # PCB bit mask: 0b11100110 + elif (BlockData.isBlockData(byteCount, data)): + blockData = BlockData(byteCount,data, TrafficSource.Reader) + note = blockData.decode() return note @@ -209,9 +290,12 @@ def parseCard_4(data): # Check CRC_A if not CRC_A_check(data): note += " WRONG CRC " + # Application Data + elif (BlockData.isBlockData(byteCount, data)): + blockData = BlockData(byteCount,data, TrafficSource.Card) + note = blockData.decode() + - elif (): - pass return note def parseReader(data): diff --git a/Software/Chameleon/MFDESFire.py b/Software/Chameleon/MFDESFire.py new file mode 100644 index 0000000..9e94556 --- /dev/null +++ b/Software/Chameleon/MFDESFire.py @@ -0,0 +1,113 @@ +from Chameleon.utils import TrafficSource +from binascii import hexlify + +lastCMD = 0x00 + +StatusCode = { + 0x00 : "OPERATION_OK", + 0x0C : "NO_CHANGES", + 0x0E : "ERR_OUT_OF_EEPROM", + 0x1C : "ILLEGAL_CMD_CODE", + 0x1E : "ERR_INTEGRITY", + 0x40 : "NO_SUCH_KEY", + 0x7E : "ERR_LENGTH", + 0x9D : "PERMISSION_DENIED", + 0x9E : "ERR_PARAMETER", + 0xA0 : "APP_NOT_FOUND", + 0xA1 : "ERR_APP_INTEGRITY", + 0xAE : "ERR_AUTH", + 0xAF : "ADDITIONAL_FRAME", + 0xBE : "ERR_BOUNDARY", + 0xC1 : "ERR_PICC_INTEGRITY", + 0xCA : "CMD_ABORTED", + 0xCD : "ERR_PICC_DISABLED", + 0xCE : "ERR_COUNT", + 0xDE : "ERR_DUPLICATE", + 0xEE : "ERR_EEPROM", + 0xF0 : "FILE_NOT_FOUND", + 0xF1 : "ERR_FILE_INTEGRITY" +} + + +def decodeSelectAPP(data): + if len(data) == 4: + return "AID: 0x"+ hexlify(data[1:4]).decode() + else: + return "Decode Fail" + +def decodeGetAPPID(data): + if len(data) == 1: + return "" + else: + return "Decode Fail" + +def decodeRespGetAPPID (data): + note = "APPIDs: |" + dataLen = len(data) + + for i in range (0,int((dataLen-1)/3)): + note += "0x"+hexlify(data[3*i: 3*(i+1)]).decode()+"|" + + return note + + +def decodeAuthAES(data): + if len(data) == 2: + return "KeyNo:"+hex(data[1]) + else: + return "Decode Fail" + +def decodeRespAuthAES(data): + return "" + + +def decodeReadData(data): + if len(data) == 8: + fileNo = data[1] + offSet = data[2:5] + length = data[5:8] + return "FileNo:"+hex(fileNo) + " OffSet:0x"+hexlify(offSet).decode() + " len:0x"+hexlify(length).decode() + else: + return "Decode Fail" + +def decodeRespReadData(data): + return "Data:0x"+hexlify(data[1:]).decode() + +def decodeAdiFrame(data): + return "" + +def decodeRespAdiFrame(data): + return "" + +def decodeDummy(data): + return "" + +MFDESFireCMDTypes = { + 0x5A : {"name": "SelectApp ", "CMDdecoder":decodeSelectAPP, "RespDecoder": decodeDummy}, + 0x6A : {"name": "GetAPPID ", "CMDdecoder":decodeGetAPPID, "RespDecoder": decodeRespGetAPPID}, + 0xAA : {"name": "AuthAES ", "CMDdecoder":decodeAuthAES, "RespDecoder": decodeRespAuthAES}, + 0xBD : {"name": "ReadData ", "CMDdecoder":decodeReadData, "RespDecoder": decodeRespReadData}, + 0xAF : {"name": "AdditionalFrame", "CMDdecoder":decodeAdiFrame, "RespDecoder": decodeRespAdiFrame} +} + + +def MFDESFireDecode(data, source): + note = "" + global lastCMD + if (source == TrafficSource.Reader): + cmd = data[0] + if cmd in MFDESFireCMDTypes : + lastCMD = cmd + note += "CMD:" + MFDESFireCMDTypes[cmd]["name"] + note += MFDESFireCMDTypes[cmd]["CMDdecoder"](data) + + elif (source == TrafficSource.Card): + status = data[0] + # Decode status code + if status in StatusCode: + note += StatusCode[status] + " " + # If status Ok, decode data + if status == 0x00 and lastCMD in MFDESFireCMDTypes: + note += MFDESFireCMDTypes[lastCMD]["RespDecoder"](data) + + return note \ No newline at end of file diff --git a/Software/Chameleon/utils.py b/Software/Chameleon/utils.py new file mode 100644 index 0000000..af4a5ab --- /dev/null +++ b/Software/Chameleon/utils.py @@ -0,0 +1,5 @@ +from enum import Enum + +class TrafficSource(Enum): + Reader = 0 + Card = 1 From 9bfcb942dccfcd062ee20537c8981aa53cea543f Mon Sep 17 00:00:00 2001 From: chenzitai Date: Mon, 30 Jul 2018 16:34:53 +0100 Subject: [PATCH 091/104] Add Color to Note (cherry picked from commit 2ef5769) --- Software/chamlog.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/Software/chamlog.py b/Software/chamlog.py index da4281a..5bece7a 100755 --- a/Software/chamlog.py +++ b/Software/chamlog.py @@ -19,11 +19,12 @@ def verboseLog(text): def formatText(log): formatString = '{timestamp:0>5d} ms <{deltaTimestamp:>+6d} ms>:' - formatString += '{eventName:<28} ({dataLength:<3} bytes)\t[{data:<20}]\t{note}\n' - text = '' - - for logEntry in log: + formatString += '{eventName:<28} ({dataLength:<3} bytes) [{data:<20}] ' \ + '\033[94m {note} \x1b[0m \n' + text = '' + + for logEntry in log: text += formatString.format(**logEntry) return text From 0e26656eb4fc78dc904911f0420a72cd59173403 Mon Sep 17 00:00:00 2001 From: chenzitai Date: Tue, 31 Jul 2018 04:02:32 +0100 Subject: [PATCH 092/104] Full implement decoding security related CMD in MFDESFire Sniffing (cherry picked from commit 210fd9f) --- Software/Chameleon/MFDESFire.py | 135 +++++++++++++++++++++++++++----- 1 file changed, 117 insertions(+), 18 deletions(-) diff --git a/Software/Chameleon/MFDESFire.py b/Software/Chameleon/MFDESFire.py index 9e94556..6f64ebb 100644 --- a/Software/Chameleon/MFDESFire.py +++ b/Software/Chameleon/MFDESFire.py @@ -2,7 +2,7 @@ from Chameleon.utils import TrafficSource from binascii import hexlify lastCMD = 0x00 - +strFail = "Decode Fail" StatusCode = { 0x00 : "OPERATION_OK", 0x0C : "NO_CHANGES", @@ -33,13 +33,14 @@ def decodeSelectAPP(data): if len(data) == 4: return "AID: 0x"+ hexlify(data[1:4]).decode() else: - return "Decode Fail" + return strFail +# Get APP ID CMD def decodeGetAPPID(data): if len(data) == 1: return "" else: - return "Decode Fail" + return strFail def decodeRespGetAPPID (data): note = "APPIDs: |" @@ -49,18 +50,89 @@ def decodeRespGetAPPID (data): note += "0x"+hexlify(data[3*i: 3*(i+1)]).decode()+"|" return note - - +############################## +# Security Related Commands +############################## +# Authenticate AES CMD def decodeAuthAES(data): if len(data) == 2: return "KeyNo:"+hex(data[1]) else: - return "Decode Fail" + return strFail def decodeRespAuthAES(data): - return "" + if len(data) == 17: + return "ekNo(RndB):0x" + hexlify(data[1:]).decode() + else: + return strFail +def decodeAuthAESAF (data): + if len(data) == 33: + return "ekNo(RndA+RndB'):0x" + hexlify(data[1:]).decode() + else: + return strFail +def decodeCardAuthAESAF (data): + if len(data) == 17: + return "ekNo(RndA'):0x" + hexlify(data[1:]).decode() + else: + return strFail + +# Authenticate 3DES CMD +def decodeAuth3DES(data): + if len(data) == 2: + return "KeyNo:"+hex(data[1]) + else: + return strFail + +def decodeRespAuth3DES(data): + if len(data) == 9: + return "ekNo(RndB):0x" + hexlify(data[1:]).decode() + else: + return strFail + +def decodeAuth3DESAF(data): + if len(data) == 17: + return "dkNo(RndA+RndB'):0x" + hexlify(data[1:]).decode() + else: + return strFail + +def decodeCardAuth3DESAF (data): + if len(data) == 9: + return "ekNo(RndA'):0x" + hexlify(data[1:]).decode() + else: + return strFail + +# ChangeKeySettings CMD +def decodeChangeKeySettings(data): + if len(data) == 9: + return "KeySettings:0x" + hexlify(data[1:]).decode() + else: + return strFail +# GetKeySettings CMD +def decodeRespGetKeySettings(data): + if len(data) == 3: + return "KeySettings:" + hex(data[1]) + " MaxNoKeys:" + hex(data[2]) + else: + return strFail + +# ChangeKey CMD +def decodeChangeKey(data): + if len(data) == 26: + return "KeyNo:" + hex(data[1]) + " decipheredKeyData:0x"+hexlify(data[2:]).decode() + else: + return strFail + +# GetKeyVersion CMD +def decodeGetKeyVersion(data): + if len(data) == 2: + return "KeyNo:" + hex(data[1]) + else: + return strFail +def decodeRespGetKeyVersion(data): + return "KeyVersion" + hex(data[1]) if len(data) == 2 else strFail + +# Read Data def decodeReadData(data): if len(data) == 8: fileNo = data[1] @@ -68,28 +140,43 @@ def decodeReadData(data): length = data[5:8] return "FileNo:"+hex(fileNo) + " OffSet:0x"+hexlify(offSet).decode() + " len:0x"+hexlify(length).decode() else: - return "Decode Fail" + return strFail def decodeRespReadData(data): - return "Data:0x"+hexlify(data[1:]).decode() + return "Data:0x"+hexlify(data[1:]).decode() if len(data) >1 else strFail def decodeAdiFrame(data): - return "" + return "Data:0x"+hexlify(data[1:]).decode() if len(data) >1 else strFail def decodeRespAdiFrame(data): - return "" + return "Data:0x"+hexlify(data[1:]).decode() if len(data) >1 else strFail def decodeDummy(data): return "" + + MFDESFireCMDTypes = { 0x5A : {"name": "SelectApp ", "CMDdecoder":decodeSelectAPP, "RespDecoder": decodeDummy}, 0x6A : {"name": "GetAPPID ", "CMDdecoder":decodeGetAPPID, "RespDecoder": decodeRespGetAPPID}, - 0xAA : {"name": "AuthAES ", "CMDdecoder":decodeAuthAES, "RespDecoder": decodeRespAuthAES}, 0xBD : {"name": "ReadData ", "CMDdecoder":decodeReadData, "RespDecoder": decodeRespReadData}, - 0xAF : {"name": "AdditionalFrame", "CMDdecoder":decodeAdiFrame, "RespDecoder": decodeRespAdiFrame} + 0xAF : {"name": "AdditionalFrame ", "CMDdecoder":decodeAdiFrame, "RespDecoder": decodeRespAdiFrame}, + # Security Related CMD + 0xAA : {"name": "AuthAES ", "CMDdecoder": decodeAuthAES, "RespDecoder": decodeRespAuthAES}, + 0x0A : {"name": "Auth3DES", "CMDdecoder": decodeAuth3DES, "RespDecoder": decodeRespAuth3DES}, + 0x54 : {"name": "ChangeKeySettings ","CMDdecoder":decodeChangeKeySettings,"respDecoder": decodeDummy}, + 0x45 : {"name": "GetKeySettings ", "CMDdecoder":decodeDummy, "RespDecoder": decodeRespGetKeySettings}, + 0xC4 : {"name": "ChangeKey ", "CMDdecoder":decodeChangeKey, "RespDecoder": decodeDummy}, + 0x64 : {"name": "GetKeyVersion ", "CMDdecoder":decodeGetKeyVersion, "RespDecoder": decodeRespGetKeyVersion} + } +# Commands need to use additional frame +MFDESFireAFCMD = { + 0xAA : {"name": "AuthAES", "AFReaderDecoder":decodeAuthAESAF, "AFCardDecoder": decodeCardAuthAESAF}, + 0x0A : {"name": "Auth3DES", "AFReaderDecoder":decodeAuth3DESAF, "AFCardDecoder": decodeCardAuth3DESAF}, + +} def MFDESFireDecode(data, source): note = "" @@ -97,9 +184,17 @@ def MFDESFireDecode(data, source): if (source == TrafficSource.Reader): cmd = data[0] if cmd in MFDESFireCMDTypes : - lastCMD = cmd - note += "CMD:" + MFDESFireCMDTypes[cmd]["name"] - note += MFDESFireCMDTypes[cmd]["CMDdecoder"](data) + # If current frame is Additional Frame + # And the previous cmd need Additional Frame + if lastCMD in MFDESFireAFCMD and cmd == 0xAF: + note += "CMD:AdditionalFrame " + note += MFDESFireAFCMD[lastCMD]["AFReaderDecoder"](data) + # Current command not need Additional Frame + # or last cmd doesn't need AF + else: + lastCMD = cmd + note += "CMD:" + MFDESFireCMDTypes[cmd]["name"] + note += MFDESFireCMDTypes[cmd]["CMDdecoder"](data) elif (source == TrafficSource.Card): status = data[0] @@ -107,7 +202,11 @@ def MFDESFireDecode(data, source): if status in StatusCode: note += StatusCode[status] + " " # If status Ok, decode data - if status == 0x00 and lastCMD in MFDESFireCMDTypes: - note += MFDESFireCMDTypes[lastCMD]["RespDecoder"](data) + if (status == 0x00 or status == 0xAF) and lastCMD in MFDESFireCMDTypes: + # If last cmd need additional frame and this is the last frame + if status == 0x00 and lastCMD in MFDESFireAFCMD: + note += MFDESFireAFCMD[lastCMD]["AFCardDecoder"](data) + else: + note += MFDESFireCMDTypes[lastCMD]["RespDecoder"](data) return note \ No newline at end of file From abff0402f6bc1e89bb690d316e5e4b8d5cfda0cf Mon Sep 17 00:00:00 2001 From: chenzitai Date: Tue, 31 Jul 2018 04:25:52 +0100 Subject: [PATCH 093/104] Full implement decoding half-Duplex Data Trans Protocol in iso14443-4 (Show PCB Block infos) (cherry picked from commit 9f469be) --- Software/Chameleon/ISO14443.py | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/Software/Chameleon/ISO14443.py b/Software/Chameleon/ISO14443.py index 04fd6f6..1ee4596 100644 --- a/Software/Chameleon/ISO14443.py +++ b/Software/Chameleon/ISO14443.py @@ -68,6 +68,28 @@ class BlockData: # PCB note += self.type + " " + # Block number + if ((self.type == "IBlock" or self.type == "RBlock") and self.PCB & 0x01): + note += "BlkNo:1 " + + # Chaining? + if (self.type == "IBlock" and self.PCB & 0x10): + note += "Chaining " + + # ACK/NAK? for R-Block + if (self.type == "RBlock"): + if (self.PCB & 0x10): + note += "NAK " + else: + note += "ACK " + + # DESEL/WTX for SBlock + if (self.type == "SBlock"): + if (self.PCB & 0x30 == 0x00): + note += "DESEL " + elif (self.PCB & 0x30 == 0x30): + note += "WTX" + # CID if (self.CID != None): note += "CID:" + hex(self.CID) + " " From 89b29415aaf969ef4c6f415d70ff755d3f65d5ad Mon Sep 17 00:00:00 2001 From: chenzitai Date: Tue, 31 Jul 2018 16:27:10 +0100 Subject: [PATCH 094/104] Fix bug: parsing SAK and ATS wrong because of non-stateful (cherry picked from commit 32b2e88) --- Software/Chameleon/ISO14443.py | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/Software/Chameleon/ISO14443.py b/Software/Chameleon/ISO14443.py index 1ee4596..e574819 100644 --- a/Software/Chameleon/ISO14443.py +++ b/Software/Chameleon/ISO14443.py @@ -13,10 +13,13 @@ CRC_A_func = crcmod.mkCrcFun(POLY, initCrc=CRC_INIT, xorOut=0) class ReaderCMD(Enum): NONE = 0 - RATS = 1 - PPS = 2 + SELECT = 1 + RATS = 2 + PPS = 3 +readerCMD = ReaderCMD.NONE + class BlockData: @staticmethod @@ -108,7 +111,6 @@ class BlockData: return note -readerCMD = ReaderCMD.NONE ReaderTrafficTypes = { "SEL":{ @@ -156,7 +158,7 @@ CardTrafficTypes = { 0x00: "UID complete, PICC NOT compliant with 14443-4" }, "FSCI": { - 0x0: "FSCC:16 ", + 0x0: "FSC:16 ", 0x1: "FSC:24 ", 0x2: "FSC:32 ", 0x3: "FSC:40 ", @@ -184,6 +186,7 @@ def CRC_A_check(data): return False def parseReader_3(data): + global readerCMD byteCount = len(data) note = "" @@ -201,6 +204,7 @@ def parseReader_3(data): # SELECT Command elif (byteCount == 9 and data[0] in ReaderTrafficTypes["SEL"] and data[1] == 0x70): # TODO: distinguish CT+uid012+BCC and uid0123+BCC + readerCMD = ReaderCMD.SELECT note += "SELECT - " note += ReaderTrafficTypes["SEL"][data[0]] note += "UID_CLn:" + binascii.hexlify(data[2:6]).decode() + " " @@ -216,6 +220,7 @@ def parseReader_3(data): return note def parseReader_4(data): + global readerCMD byteCount = len(data) note = "" @@ -260,7 +265,7 @@ def parseCard_3(data): note += "ATQA - " note += binascii.hexlify(data).decode() # SAK - elif (byteCount == 3 and ((data[0] & (0x24)) in CardTrafficTypes["SAK"])): + elif (byteCount == 3 and readerCMD == ReaderCMD.SELECT and ((data[0] & (0x24)) in CardTrafficTypes["SAK"])): note += "SAK - " note += CardTrafficTypes["SAK"][(data[2] & 0x24)] if not CRC_A_check(data): @@ -272,6 +277,7 @@ def parseCard_3(data): return note def parseCard_4(data): + global readerCMD byteCount = len(data) note = "" @@ -279,12 +285,13 @@ def parseCard_4(data): # TL + T0 + TA + TB + TC + T1 ... + CRC # TL: length without CRC # ATS without data - if(byteCount == 3 and data[0] == (byteCount-2)): + if(byteCount == 3 and readerCMD == ReaderCMD.RATS and data[0] == (byteCount-2)): note += "ATS - NO DATA" # ATS with data mush have T0, T0 b8=0 - elif (byteCount > 3 and data[0] == (byteCount-2) + elif (byteCount > 3 and readerCMD == ReaderCMD.RATS and data[0] == (byteCount-2) and data[1] & 0x80 == 0x00 and data[1] & 0x0f in CardTrafficTypes["FSCI"]): + note += "ATS - " # Decode T0 hasTA = data[1] & 0x10 hasTB = data[1] & 0x20 @@ -317,6 +324,7 @@ def parseCard_4(data): blockData = BlockData(byteCount,data, TrafficSource.Card) note = blockData.decode() + readerCMD = ReaderCMD.NONE return note From f57207d2f19ab6b86b7288f9c7d34fc43d78e1a4 Mon Sep 17 00:00:00 2001 From: chenzitai Date: Tue, 31 Jul 2018 17:07:03 +0100 Subject: [PATCH 095/104] Finish decoding PICC level commands of MFDESFire (cherry picked from commit 84f636a) --- Software/Chameleon/MFDESFire.py | 29 ++++++++++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/Software/Chameleon/MFDESFire.py b/Software/Chameleon/MFDESFire.py index 6f64ebb..e30e4a2 100644 --- a/Software/Chameleon/MFDESFire.py +++ b/Software/Chameleon/MFDESFire.py @@ -27,11 +27,26 @@ StatusCode = { 0xF0 : "FILE_NOT_FOUND", 0xF1 : "ERR_FILE_INTEGRITY" } +# Create APP CMD +def decodeCreateAPP(data): + note = "" + if len(data) == 6: + note += "AID:0x"+hexlify(data[1:4]).decode() + " " + note += "KeySett:"+hex(data[4]) + " " + note += "NumOfKeys:"+hex(data[5]) + " " + else: + note += strFail + return note +def decodeDelAPP(data): + if len(data) == 4: + return "AID:0x"+hexlify(data[1:]).decode() + else: + return strFail def decodeSelectAPP(data): if len(data) == 4: - return "AID: 0x"+ hexlify(data[1:4]).decode() + return "AID:0x"+ hexlify(data[1:4]).decode() else: return strFail @@ -157,17 +172,25 @@ def decodeDummy(data): MFDESFireCMDTypes = { + # PICC Level Commands, GetVersion not decoded, please refer to datasheet for the meaning of resp + 0xCA : {"name": "CreateApp", "CMDdecoder":decodeCreateAPP, "RespDecoder": decodeDummy}, + 0xDA : {"name": "DelApp", "CMDdecoder":decodeDelAPP, "RespDecoder": decodeDummy}, 0x5A : {"name": "SelectApp ", "CMDdecoder":decodeSelectAPP, "RespDecoder": decodeDummy}, 0x6A : {"name": "GetAPPID ", "CMDdecoder":decodeGetAPPID, "RespDecoder": decodeRespGetAPPID}, + 0xFC : {"name": "FormatPICC", "CMDdecoder":decodeDummy, "RespDecoder": decodeDummy}, + 0x60 : {"name": "GetVersion", "CMDdecoder":decodeDummy, "RespDecoder": decodeDummy}, + # Data Manipulation Commands 0xBD : {"name": "ReadData ", "CMDdecoder":decodeReadData, "RespDecoder": decodeRespReadData}, - 0xAF : {"name": "AdditionalFrame ", "CMDdecoder":decodeAdiFrame, "RespDecoder": decodeRespAdiFrame}, # Security Related CMD 0xAA : {"name": "AuthAES ", "CMDdecoder": decodeAuthAES, "RespDecoder": decodeRespAuthAES}, 0x0A : {"name": "Auth3DES", "CMDdecoder": decodeAuth3DES, "RespDecoder": decodeRespAuth3DES}, 0x54 : {"name": "ChangeKeySettings ","CMDdecoder":decodeChangeKeySettings,"respDecoder": decodeDummy}, 0x45 : {"name": "GetKeySettings ", "CMDdecoder":decodeDummy, "RespDecoder": decodeRespGetKeySettings}, 0xC4 : {"name": "ChangeKey ", "CMDdecoder":decodeChangeKey, "RespDecoder": decodeDummy}, - 0x64 : {"name": "GetKeyVersion ", "CMDdecoder":decodeGetKeyVersion, "RespDecoder": decodeRespGetKeyVersion} + 0x64 : {"name": "GetKeyVersion ", "CMDdecoder":decodeGetKeyVersion, "RespDecoder": decodeRespGetKeyVersion}, + + # Additional Frame + 0xAF: {"name": "AdditionalFrame ", "CMDdecoder": decodeAdiFrame, "RespDecoder": decodeRespAdiFrame}, } From f2d78eeb2572893273978470b69f16292a2e770d Mon Sep 17 00:00:00 2001 From: chenzitai Date: Wed, 1 Aug 2018 18:04:50 +0100 Subject: [PATCH 096/104] Finish decoding Data Manipulation Commands commands of MFDESFire (cherry picked from commit 502d951) --- Software/Chameleon/MFDESFire.py | 71 +++++++++++++++++++++++++++------ 1 file changed, 58 insertions(+), 13 deletions(-) diff --git a/Software/Chameleon/MFDESFire.py b/Software/Chameleon/MFDESFire.py index e30e4a2..96307d8 100644 --- a/Software/Chameleon/MFDESFire.py +++ b/Software/Chameleon/MFDESFire.py @@ -27,6 +27,9 @@ StatusCode = { 0xF0 : "FILE_NOT_FOUND", 0xF1 : "ERR_FILE_INTEGRITY" } +######################### +# PICC Level Commands +######################### # Create APP CMD def decodeCreateAPP(data): note = "" @@ -147,8 +150,11 @@ def decodeGetKeyVersion(data): def decodeRespGetKeyVersion(data): return "KeyVersion" + hex(data[1]) if len(data) == 2 else strFail +############################## +# Data Manipulation Commands +############################## # Read Data -def decodeReadData(data): +def decodeFileNoOffsetLen(data): if len(data) == 8: fileNo = data[1] offSet = data[2:5] @@ -156,8 +162,32 @@ def decodeReadData(data): return "FileNo:"+hex(fileNo) + " OffSet:0x"+hexlify(offSet).decode() + " len:0x"+hexlify(length).decode() else: return strFail +# Write Data +def decodeFileNoOffsetLenData(data): + if len(data) > 8: + fileNo = data[1] + offSet = data[2:5] + length = data[5:8] + dataWrite = data[8:] + return "FileNo:"+hex(fileNo) + " OffSet:0x"+hexlify(offSet).decode() + " len:0x"+hexlify(length).decode() + \ + " Data:0x" + hexlify(dataWrite).decode() + else: + return strFail -def decodeRespReadData(data): +# Get Value +def decodeFileNo(data): + if len(data) == 2: + return "FileNo:"+hex(data[1]) + else: + return strFail +# Credit +def decodeFileNoData(data): + if len(data) >2: + return "FileNo:" + hex(data[1]) + " Data:0x" + hexlify(data[2:]).decode() + else: + return strFail + +def decodeData(data): return "Data:0x"+hexlify(data[1:]).decode() if len(data) >1 else strFail def decodeAdiFrame(data): @@ -173,31 +203,46 @@ def decodeDummy(data): MFDESFireCMDTypes = { # PICC Level Commands, GetVersion not decoded, please refer to datasheet for the meaning of resp - 0xCA : {"name": "CreateApp", "CMDdecoder":decodeCreateAPP, "RespDecoder": decodeDummy}, - 0xDA : {"name": "DelApp", "CMDdecoder":decodeDelAPP, "RespDecoder": decodeDummy}, + 0xCA : {"name": "CreateApp ", "CMDdecoder":decodeCreateAPP, "RespDecoder": decodeDummy}, + 0xDA : {"name": "DelApp ", "CMDdecoder":decodeDelAPP, "RespDecoder": decodeDummy}, 0x5A : {"name": "SelectApp ", "CMDdecoder":decodeSelectAPP, "RespDecoder": decodeDummy}, 0x6A : {"name": "GetAPPID ", "CMDdecoder":decodeGetAPPID, "RespDecoder": decodeRespGetAPPID}, - 0xFC : {"name": "FormatPICC", "CMDdecoder":decodeDummy, "RespDecoder": decodeDummy}, - 0x60 : {"name": "GetVersion", "CMDdecoder":decodeDummy, "RespDecoder": decodeDummy}, + 0xFC : {"name": "FormatPICC ", "CMDdecoder":decodeDummy, "RespDecoder": decodeDummy}, + 0x60 : {"name": "GetVersion ", "CMDdecoder":decodeDummy, "RespDecoder": decodeDummy}, # Data Manipulation Commands - 0xBD : {"name": "ReadData ", "CMDdecoder":decodeReadData, "RespDecoder": decodeRespReadData}, + 0xBD : {"name": "ReadData ", "CMDdecoder":decodeFileNoOffsetLen, "RespDecoder": decodeData}, + 0x3D : {"name": "WriteData ", "CMDdecoder":decodeFileNoOffsetLenData, "RespDecoder": decodeDummy}, + 0x6C : {"name": "GetValue ", "CMDdecoder":decodeFileNo, "RespDecoder": decodeData}, + 0x0C : {"name": "Credit ", "CMDdecoder":decodeFileNoData, "RespDecoder": decodeDummy}, + 0xDC : {"name": "Debit ", "CMDdecoder":decodeFileNoData, "RespDecoder": decodeDummy}, + 0x1C : {"name": "LimitedCredit ", "CMDdecoder":decodeFileNoData, "RespDecoder": decodeDummy}, + 0x3B : {"name": "WriteRecord ", "CMDdecoder":decodeFileNoOffsetLenData, "RespDecoder": decodeDummy}, + 0xBB : {"name": "ReadRecord ", "CMDdecoder":decodeFileNoOffsetLen, "RespDecoder": decodeData}, + 0xEB : {"name": "ClearRecordFile ", "CMDdecoder":decodeFileNo, "RespDecoder": decodeDummy}, + 0xC7 : {"name": "CommitTransaction ","CMDdecoder":decodeDummy, "RespDecoder": decodeDummy}, + 0xA7 : {"name": "AbortTransaction ","CMDdecoder":decodeDummy, "RespDecoder": decodeDummy}, # Security Related CMD - 0xAA : {"name": "AuthAES ", "CMDdecoder": decodeAuthAES, "RespDecoder": decodeRespAuthAES}, - 0x0A : {"name": "Auth3DES", "CMDdecoder": decodeAuth3DES, "RespDecoder": decodeRespAuth3DES}, - 0x54 : {"name": "ChangeKeySettings ","CMDdecoder":decodeChangeKeySettings,"respDecoder": decodeDummy}, + 0xAA : {"name": "AuthAES ", "CMDdecoder": decodeAuthAES, "RespDecoder": decodeRespAuthAES}, + 0x0A : {"name": "Auth3DES ", "CMDdecoder": decodeAuth3DES, "RespDecoder": decodeRespAuth3DES}, + 0x54 : {"name": "ChangeKeySettings ","CMDdecoder":decodeChangeKeySettings,"RespDecoder": decodeDummy}, 0x45 : {"name": "GetKeySettings ", "CMDdecoder":decodeDummy, "RespDecoder": decodeRespGetKeySettings}, 0xC4 : {"name": "ChangeKey ", "CMDdecoder":decodeChangeKey, "RespDecoder": decodeDummy}, 0x64 : {"name": "GetKeyVersion ", "CMDdecoder":decodeGetKeyVersion, "RespDecoder": decodeRespGetKeyVersion}, # Additional Frame - 0xAF: {"name": "AdditionalFrame ", "CMDdecoder": decodeAdiFrame, "RespDecoder": decodeRespAdiFrame}, + 0xAF: {"name": "AdditionalFrame ", "CMDdecoder": decodeAdiFrame, "RespDecoder": decodeRespAdiFrame}, } # Commands need to use additional frame MFDESFireAFCMD = { - 0xAA : {"name": "AuthAES", "AFReaderDecoder":decodeAuthAESAF, "AFCardDecoder": decodeCardAuthAESAF}, - 0x0A : {"name": "Auth3DES", "AFReaderDecoder":decodeAuth3DESAF, "AFCardDecoder": decodeCardAuth3DESAF}, + 0xAA : {"name": "AuthAES ", "AFReaderDecoder":decodeAuthAESAF, "AFCardDecoder": decodeCardAuthAESAF}, + 0x0A : {"name": "Auth3DES ", "AFReaderDecoder":decodeAuth3DESAF, "AFCardDecoder": decodeCardAuth3DESAF}, + + 0x3D : {"name": "WriteData ", "AFReaderDecoder":decodeData, "AFCardDecoder": decodeDummy}, + 0xBB : {"name": "ReadRecord ", "AFReaderDecoder":decodeDummy, "AFCardDecoder": decodeData}, + + 0x3B: {"name": "WriteRecord ", "AFReaderDecoder": decodeData, "AFCardDecoder": decodeDummy} } From bc75cb982f843c9c4b85d9a940e66e1483519cd5 Mon Sep 17 00:00:00 2001 From: chenzitai Date: Thu, 2 Aug 2018 01:15:17 +0100 Subject: [PATCH 097/104] Finish decoding # Application Level Commands commands of MFDESFire (cherry picked from commit c0e0607) --- Software/Chameleon/ISO14443.py | 3 -- Software/Chameleon/MFDESFire.py | 95 ++++++++++++++++++++++++++++++++- 2 files changed, 93 insertions(+), 5 deletions(-) diff --git a/Software/Chameleon/ISO14443.py b/Software/Chameleon/ISO14443.py index e574819..3306485 100644 --- a/Software/Chameleon/ISO14443.py +++ b/Software/Chameleon/ISO14443.py @@ -203,7 +203,6 @@ def parseReader_3(data): # SELECT Command elif (byteCount == 9 and data[0] in ReaderTrafficTypes["SEL"] and data[1] == 0x70): - # TODO: distinguish CT+uid012+BCC and uid0123+BCC readerCMD = ReaderCMD.SELECT note += "SELECT - " note += ReaderTrafficTypes["SEL"][data[0]] @@ -314,8 +313,6 @@ def parseCard_4(data): note += "TC:" + hex(data[byteNext]) + " " byteNext += 1 - # TODO: decode historical bytes - # Check CRC_A if not CRC_A_check(data): note += " WRONG CRC " diff --git a/Software/Chameleon/MFDESFire.py b/Software/Chameleon/MFDESFire.py index 96307d8..f66eee6 100644 --- a/Software/Chameleon/MFDESFire.py +++ b/Software/Chameleon/MFDESFire.py @@ -190,6 +190,84 @@ def decodeFileNoData(data): def decodeData(data): return "Data:0x"+hexlify(data[1:]).decode() if len(data) >1 else strFail +########################### +# Application Level Commands +########################### +def decodeRespGetFileIDs(data): + if len(data) == 4: + return "FIDs:0x"+hexlify(data[1:]).decode() + else: + return strFail + +def decodeRespGetFileSettings(data): + lenData = len(data) + note = "" + if lenData >5: + note += "FileType:"+hex(data[1])+" ComSett:"+hex(data[2]) + "AccessRight:0x"+hexlify(data[3:5]).decode() + " " + if lenData == 8: + note += "FileSize:0x"+hexlify(data[5:]).decode() + elif lenData == 18: + note += "LowLimit:0x"+hexlify(data[5:9]).decode() + " " + note += "UpLimit:0x" + hexlify(data[9:13]).decode() + " " + note += "LimitedCreditVal:0x"+hexlify(data[13:17]).decode() + " " + note += "LimitedCreditEn:" + hex(data[17]) + elif lenData == 14: + note += "RecordSize:0x"+ hexlify(data[5:8]).decode() + " " + note += "MaxNumRecords:0x"+hexlify(data[8:11]).decode() + " " + note += "CurrentNumRecords:0x"+hexlify(data[11:]).decode() + return note + else: + return strFail + +def decodeFNComSetAccessRightsFileSize(data): + if len(data) == 8: + note = "FileNo:" + hex(data[1]) + " ComSet:" + hex(data[2]) + "AccessRight:0x" + hexlify( + data[3:5]).decode() + " " + note += "FileSize:0x" + hexlify(data[5:]).decode() + return note + else: + return strFail + +def decodeChangeFileSettings(data): + lenData = len(data) + note ="" + if lenData > 2: + note += "FileNo:"+hex(data[1]) + " " + if lenData == 5: + note += "ComSet:"+hex(data[2]) + " " + note += "AccessRights:0x"+hexlify(data[3:]).decode() + elif lenData == 10: + note += "NewSettings:0x"+hexlify(data[2:]).decode() + return note + else: + return strFail + +def decodeCreateValueFile(data): + if len(data) == 18: + note = "FileNo:"+hex(data[1])+" ComSet:"+hex(data[2]) + "AccessRight:0x"+hexlify(data[3:5]).decode() + " " + note += "LowLimit:0x"+hexlify(data[5:9]).decode() + " " + note += "UpLimit:0x" + hexlify(data[9:13]).decode() + " " + note += "Val:0x"+hexlify(data[13:17]).decode() + " " + note += "LimitedCreditEn:" + hex(data[17]) + return note + else: + return strFail + +def decodeCreateRecordFile(data): + if len(data) == 11: + note = "FileNo:"+hex(data[1])+" ComSet:"+hex(data[2]) + "AccessRight:0x"+hexlify(data[3:5]).decode() + " " + note += "RecordSize:0x"+hexlify(data[5:8]).decode()+" " + note += "MaxNumRecords:0x"+hexlify(data[8:]).decode() + return note + else: + return strFail + +def decodeDelFile(data): + if len(data) == 2: + return "FileNo:"+hex(data[1]) + else: + return strFail + def decodeAdiFrame(data): return "Data:0x"+hexlify(data[1:]).decode() if len(data) >1 else strFail @@ -201,7 +279,20 @@ def decodeDummy(data): + + MFDESFireCMDTypes = { + # Application Level Commands + 0x6F : {"name": "GetFileIDs", "CMDdecoder":decodeDummy, "RespDecoder": decodeRespGetFileIDs}, + 0xF5 : {"name": "GetFileSettings", "CMDdecoder":decodeFileNo, "RespDecoder": decodeRespGetFileSettings}, + 0x5F : {"name": "ChangeFileSettings", "CMDdecoder":decodeChangeFileSettings, "RespDecoder": decodeDummy}, + 0xCD : {"name": "CreateStdDataFile", "CMDdecoder":decodeFNComSetAccessRightsFileSize,"RespDecoder": decodeDummy}, + 0xCB : {"name": "CreateBackupDataFile", "CMDdecoder":decodeFNComSetAccessRightsFileSize,"RespDecoder": decodeDummy}, + 0xCC : {"name": "CreateValueFile", "CMDdecoder":decodeCreateValueFile, "RespDecoder": decodeDummy}, + 0xC1 : {"name": "CreateLinearRecordFile","CMDdecoder":decodeCreateRecordFile, "RespDecoder": decodeDummy}, + 0xC0 : {"name": "CreateCyclicRecordFile","CMDdecoder":decodeCreateRecordFile, "RespDecoder": decodeDummy}, + 0xDF: {"name": "DelFile", "CMDdecoder":decodeDelFile, "RespDecoder": decodeDummy}, + # PICC Level Commands, GetVersion not decoded, please refer to datasheet for the meaning of resp 0xCA : {"name": "CreateApp ", "CMDdecoder":decodeCreateAPP, "RespDecoder": decodeDummy}, 0xDA : {"name": "DelApp ", "CMDdecoder":decodeDelAPP, "RespDecoder": decodeDummy}, @@ -222,8 +313,8 @@ MFDESFireCMDTypes = { 0xC7 : {"name": "CommitTransaction ","CMDdecoder":decodeDummy, "RespDecoder": decodeDummy}, 0xA7 : {"name": "AbortTransaction ","CMDdecoder":decodeDummy, "RespDecoder": decodeDummy}, # Security Related CMD - 0xAA : {"name": "AuthAES ", "CMDdecoder": decodeAuthAES, "RespDecoder": decodeRespAuthAES}, - 0x0A : {"name": "Auth3DES ", "CMDdecoder": decodeAuth3DES, "RespDecoder": decodeRespAuth3DES}, + 0xAA : {"name": "AuthAES ", "CMDdecoder": decodeAuthAES, "RespDecoder": decodeRespAuthAES}, + 0x0A : {"name": "Auth3DES ", "CMDdecoder": decodeAuth3DES, "RespDecoder": decodeRespAuth3DES}, 0x54 : {"name": "ChangeKeySettings ","CMDdecoder":decodeChangeKeySettings,"RespDecoder": decodeDummy}, 0x45 : {"name": "GetKeySettings ", "CMDdecoder":decodeDummy, "RespDecoder": decodeRespGetKeySettings}, 0xC4 : {"name": "ChangeKey ", "CMDdecoder":decodeChangeKey, "RespDecoder": decodeDummy}, From 1d2847cdec3adbddef4ae995fdd831a59021bb72 Mon Sep 17 00:00:00 2001 From: chenzitai Date: Fri, 3 Aug 2018 18:32:01 +0100 Subject: [PATCH 098/104] Add decoder selection parameter -d MFDESFire/None for different cards (cherry picked from commit 93635d9) --- Software/Chameleon/ISO14443.py | 31 +++++++++++++++++++++---------- Software/Chameleon/Log.py | 8 ++++---- Software/chamlog.py | 3 ++- 3 files changed, 27 insertions(+), 15 deletions(-) diff --git a/Software/Chameleon/ISO14443.py b/Software/Chameleon/ISO14443.py index 3306485..55565e9 100644 --- a/Software/Chameleon/ISO14443.py +++ b/Software/Chameleon/ISO14443.py @@ -20,6 +20,16 @@ class ReaderCMD(Enum): readerCMD = ReaderCMD.NONE +# Map card types string to decoder +def DummyCardDecoder(data, source): + return "" + +CardTypesMap = { + "None": {"ApplicationDecoder": DummyCardDecoder}, + "MFDESFire": {"ApplicationDecoder": MFDESFireDecode}, + +} + class BlockData: @staticmethod @@ -29,7 +39,8 @@ class BlockData: else: return False - def __init__(self, byteCount, data, source): + + def __init__(self, byteCount, data, source, Cardtype): self.byteCount = byteCount self.data = data self.PCB = data[0] @@ -39,7 +50,7 @@ class BlockData: self.INF = None self.source = source self.CRCChecked = CRC_A_check(data) - self.CardApplicationDecoder = MFDESFireDecode + self.CardApplicationDecoder = CardTypesMap[Cardtype]["ApplicationDecoder"] if self.CRCChecked: @@ -218,7 +229,7 @@ def parseReader_3(data): return note -def parseReader_4(data): +def parseReader_4(data, Cardtype): global readerCMD byteCount = len(data) note = "" @@ -250,7 +261,7 @@ def parseReader_4(data): # Half-duplex block transmission # PCB bit mask: 0b11100110 elif (BlockData.isBlockData(byteCount, data)): - blockData = BlockData(byteCount,data, TrafficSource.Reader) + blockData = BlockData(byteCount,data, TrafficSource.Reader, Cardtype) note = blockData.decode() return note @@ -275,7 +286,7 @@ def parseCard_3(data): return note -def parseCard_4(data): +def parseCard_4(data, Cardtype): global readerCMD byteCount = len(data) note = "" @@ -318,15 +329,15 @@ def parseCard_4(data): note += " WRONG CRC " # Application Data elif (BlockData.isBlockData(byteCount, data)): - blockData = BlockData(byteCount,data, TrafficSource.Card) + blockData = BlockData(byteCount,data, TrafficSource.Card, Cardtype) note = blockData.decode() readerCMD = ReaderCMD.NONE return note -def parseReader(data): - return parseReader_3(data) + parseReader_4(data) +def parseReader(data, Cardtype): + return parseReader_3(data) + parseReader_4(data, Cardtype) -def parseCard(data): - return parseCard_3(data) + parseCard_4(data) +def parseCard(data, Cardtype): + return parseCard_3(data) + parseCard_4(data, Cardtype) diff --git a/Software/Chameleon/Log.py b/Software/Chameleon/Log.py index c10fd5f..da32bc8 100644 --- a/Software/Chameleon/Log.py +++ b/Software/Chameleon/Log.py @@ -97,7 +97,7 @@ eventTypes = { TIMESTAMP_MAX = 65536 eventTypes = { i : ({'name': 'UNKNOWN', 'decoder': binaryDecoder} if i not in eventTypes.keys() else eventTypes[i]) for i in range(256) } -def parseBinary(binaryStream, decode=False): +def parseBinary(binaryStream, decoder=None): log = [] # Completely read file contents and process them byte by byte @@ -138,12 +138,12 @@ def parseBinary(binaryStream, decode=False): note = "" # If we need to decode the data and paritybit check success - if (decode and logData[-1] != '!'): + if (decoder!=None and logData[-1] != '!'): # Decode the data from Reader if(event == 0x44 or event == 0x45): - note = iso14443_3.parseReader(binascii.a2b_hex(logData)) + note = iso14443_3.parseReader(binascii.a2b_hex(logData), decoder) elif (event == 0x46 or event == 0x47): - note = iso14443_3.parseCard(binascii.a2b_hex(logData)) + note = iso14443_3.parseCard(binascii.a2b_hex(logData), decoder) # Create log entry as dict and append it to event list logEntry = { diff --git a/Software/chamlog.py b/Software/chamlog.py index 5bece7a..d12e3d3 100755 --- a/Software/chamlog.py +++ b/Software/chamlog.py @@ -11,6 +11,7 @@ import json import Chameleon import io import datetime +from Chameleon.ISO14443 import CardTypesMap def verboseLog(text): formatString = "[{}] {}" @@ -48,7 +49,7 @@ def main(): argParser.add_argument("-t", "--type", choices=outputTypes.keys(), default='text', help="specifies output type") - argParser.add_argument("-d", "--decode", dest="decode", action='store_true', default=False) + argParser.add_argument("-d", "--decode", dest="decode", choices=CardTypesMap.keys(), default=None, help="Decode the sniffed traffic and application data with a decoder") argParser.add_argument("-l", "--live", dest="live", action='store_true', help="Use live logging capabilities of Chameleon") argParser.add_argument("-c", "--clear", dest="clear", action='store_true', help="Clear Chameleon's log memory when using -p") argParser.add_argument("-m", "--mode", dest="mode", metavar="LOGMODE", help="Additionally set Chameleon's log mode after reading it's memory") From 336a32d1e7aa3528497a4ff74d713605f262750f Mon Sep 17 00:00:00 2001 From: chenzitai Date: Fri, 3 Aug 2018 18:42:31 +0100 Subject: [PATCH 099/104] Add a parameter for setting logmode in chamtool (cherry picked from commit 4fb21fa) --- Software/chamtool.py | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/Software/chamtool.py b/Software/chamtool.py index 0e964ee..8d7febc 100755 --- a/Software/chamtool.py +++ b/Software/chamtool.py @@ -68,6 +68,17 @@ def cmdLog(chameleon, arg): bytesReceived = chameleon.cmdDownloadLog(fileHandle) return "{} Bytes successfully written to {}".format(bytesReceived, arg) +def cmdLogMode(chameleon, arg): + result = chameleon.cmdLogMode(arg) + + if (arg is None): + return "Current logmode is: {}".format(result['response']) + else: + if (result['statusCode'] in chameleon.STATUS_CODES_SUCCESS): + return "logmode have been set to {}".format(arg) + else: + return "Setting logmode failed: {}".format(arg, result['statusText']) + def cmdLButton(chameleon, arg): result = chameleon.cmdLButton(arg) @@ -129,7 +140,7 @@ def cmdThreshold(chameleon, arg): if (result['statusCode'] in chameleon.STATUS_CODES_SUCCESS): return "Threshold have been set to {}".format(arg) else: - return "Setting threshold faled: {}".format(arg, result['statusText']) + return "Setting threshold failed: {}".format(arg, result['statusText']) def cmdUpgrade(chameleon, arg): result = chameleon.cmdUpgrade() @@ -164,6 +175,7 @@ def main(): cmdArgGroup.add_argument("-s", "--setting", dest="setting", action=CmdListAction, nargs='?', type=int, choices=Chameleon.VALID_SETTINGS, help="retrieve or set the current setting") cmdArgGroup.add_argument("-U", "--uid", dest="uid", action=CmdListAction, nargs='?', help="retrieve or set the current UID") cmdArgGroup.add_argument("-c", "--config", dest="config", action=CmdListAction, metavar="CFGNAME", nargs='?', help="retrieve or set the current configuration") + cmdArgGroup.add_argument("-lm", "--logmode", dest="logmode", action=CmdListAction, metavar="LOGMODE", nargs='?', help="retrieve or set the current log mode") cmdArgGroup.add_argument("-lb", "--lbutton", dest="lbutton", action=CmdListAction, metavar="ACTION", nargs='?', help="retrieve or set the current left button action") cmdArgGroup.add_argument("-rb", "--rbutton", dest="rbutton", action=CmdListAction, metavar="ACTION", nargs='?', help="retrieve or set the current right button action") cmdArgGroup.add_argument("-gl", "--gled", dest="gled", action=CmdListAction, metavar="FUNCTION", nargs='?', help="retrieve or set the current green led function") @@ -192,6 +204,7 @@ def main(): "upload" : cmdUpload, "download" : cmdDownload, "log" : cmdLog, + "logmode" : cmdLogMode, "lbutton" : cmdLButton, "rbutton" : cmdRButton, "gled" : cmdGreenLED, From 070ed1556b990ff9101c95959ffd5dbb8f0cba3f Mon Sep 17 00:00:00 2001 From: chenzitai Date: Sun, 5 Aug 2018 03:04:45 +0100 Subject: [PATCH 100/104] Fix bug(lengthCheck,decodeAPPIDs) (cherry picked from commit d6ea321) --- Software/Chameleon/Log.py | 2 +- Software/Chameleon/MFDESFire.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Software/Chameleon/Log.py b/Software/Chameleon/Log.py index da32bc8..524ecab 100644 --- a/Software/Chameleon/Log.py +++ b/Software/Chameleon/Log.py @@ -138,7 +138,7 @@ def parseBinary(binaryStream, decoder=None): note = "" # If we need to decode the data and paritybit check success - if (decoder!=None and logData[-1] != '!'): + if (decoder!=None and len(logData) >0 and logData[-1] != '!'): # Decode the data from Reader if(event == 0x44 or event == 0x45): note = iso14443_3.parseReader(binascii.a2b_hex(logData), decoder) diff --git a/Software/Chameleon/MFDESFire.py b/Software/Chameleon/MFDESFire.py index f66eee6..8237970 100644 --- a/Software/Chameleon/MFDESFire.py +++ b/Software/Chameleon/MFDESFire.py @@ -65,7 +65,7 @@ def decodeRespGetAPPID (data): dataLen = len(data) for i in range (0,int((dataLen-1)/3)): - note += "0x"+hexlify(data[3*i: 3*(i+1)]).decode()+"|" + note += "0x"+hexlify(data[1+3*i: 1+3*(i+1)]).decode()+"|" return note ############################## @@ -368,4 +368,4 @@ def MFDESFireDecode(data, source): else: note += MFDESFireCMDTypes[lastCMD]["RespDecoder"](data) - return note \ No newline at end of file + return note From 9e89f1935301c8eb28e20e55acc2bf05f15f414c Mon Sep 17 00:00:00 2001 From: chenzitai Date: Sun, 5 Aug 2018 03:22:26 +0100 Subject: [PATCH 101/104] Fix bug: number of returnd FileIDs (cherry picked from commit e1761af) --- Software/Chameleon/MFDESFire.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Software/Chameleon/MFDESFire.py b/Software/Chameleon/MFDESFire.py index 8237970..41186c5 100644 --- a/Software/Chameleon/MFDESFire.py +++ b/Software/Chameleon/MFDESFire.py @@ -194,7 +194,7 @@ def decodeData(data): # Application Level Commands ########################### def decodeRespGetFileIDs(data): - if len(data) == 4: + if len(data) > 0: return "FIDs:0x"+hexlify(data[1:]).decode() else: return strFail From 2be9b9e76ea01d357683d86fbd5965cfebb62ab5 Mon Sep 17 00:00:00 2001 From: chenzitai Date: Wed, 8 Aug 2018 23:32:14 +0100 Subject: [PATCH 102/104] Fix chamtool: upgrade command gives exception (cherry picked from commit 592b851) --- Software/Chameleon/Device.py | 5 ++++- Software/chamtool.py | 6 ++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/Software/Chameleon/Device.py b/Software/Chameleon/Device.py index 1852cf0..bfe2267 100644 --- a/Software/Chameleon/Device.py +++ b/Software/Chameleon/Device.py @@ -251,4 +251,7 @@ class Device: return self.getSetCmd(self.COMMAND_THRESHOLD, value) def cmdUpgrade(self): - return self.execCmd(self.COMMAND_UPGRADE) \ No newline at end of file + # Execute command + cmdLine = self.COMMAND_UPGRADE + self.LINE_ENDING + self.serial.write(cmdLine.encode('ascii')) + return 0 diff --git a/Software/chamtool.py b/Software/chamtool.py index 8d7febc..aff659c 100755 --- a/Software/chamtool.py +++ b/Software/chamtool.py @@ -143,8 +143,10 @@ def cmdThreshold(chameleon, arg): return "Setting threshold failed: {}".format(arg, result['statusText']) def cmdUpgrade(chameleon, arg): - result = chameleon.cmdUpgrade() - return "" + if(chameleon.cmdUpgrade() == 0): + print ("Device changed into Upgrade Mode") + exit(0) + # Custom class for argparse class CmdListAction(argparse.Action): def __init__(self, option_strings, dest, default=False, required=False, From 2af62ab8f8ed2c29e8cb2cce029a25dfbaffe3e4 Mon Sep 17 00:00:00 2001 From: chenzitai Date: Sun, 19 Aug 2018 15:32:59 +0100 Subject: [PATCH 103/104] Add decode additional frame for readdata command --- Software/Chameleon/MFDESFire.py | 1 + 1 file changed, 1 insertion(+) diff --git a/Software/Chameleon/MFDESFire.py b/Software/Chameleon/MFDESFire.py index 41186c5..07577ef 100644 --- a/Software/Chameleon/MFDESFire.py +++ b/Software/Chameleon/MFDESFire.py @@ -327,6 +327,7 @@ MFDESFireCMDTypes = { # Commands need to use additional frame MFDESFireAFCMD = { + 0xBD : {"name": "ReadData ", "AFReaderDecoder": decodeDummy, "AFCardDecoder": decodeData}, 0xAA : {"name": "AuthAES ", "AFReaderDecoder":decodeAuthAESAF, "AFCardDecoder": decodeCardAuthAESAF}, 0x0A : {"name": "Auth3DES ", "AFReaderDecoder":decodeAuth3DESAF, "AFCardDecoder": decodeCardAuth3DESAF}, From e8500b5db7539ea05cb113dfc9941db6f7f8826e Mon Sep 17 00:00:00 2001 From: Georg Date: Wed, 12 Sep 2018 14:55:36 +0200 Subject: [PATCH 104/104] added LATEST firmware --- .../Chameleon-Mini/Latest/Chameleon-Mini.eep | 2 +- .../Chameleon-Mini/Latest/Chameleon-Mini.hex | 5658 +++++++++-------- 2 files changed, 2927 insertions(+), 2733 deletions(-) diff --git a/Firmware/Chameleon-Mini/Latest/Chameleon-Mini.eep b/Firmware/Chameleon-Mini/Latest/Chameleon-Mini.eep index a43b2b0..9b80dbb 100644 --- a/Firmware/Chameleon-Mini/Latest/Chameleon-Mini.eep +++ b/Firmware/Chameleon-Mini/Latest/Chameleon-Mini.eep @@ -1,4 +1,4 @@ -:100000000000B32E0606080800000401320090012B +:100000000000402F0606080800000401320090019D :1000100006060808000004013200900106060808E0 :1000200000000401320090010606080800000401E7 :100030003200900106060808000004013200900119 diff --git a/Firmware/Chameleon-Mini/Latest/Chameleon-Mini.hex b/Firmware/Chameleon-Mini/Latest/Chameleon-Mini.hex index d24c39d..05d727f 100644 --- a/Firmware/Chameleon-Mini/Latest/Chameleon-Mini.hex +++ b/Firmware/Chameleon-Mini/Latest/Chameleon-Mini.hex @@ -1,25 +1,25 @@ :100000000C94AB0B0C94D00B0C94D00B0C94D00B29 :100010000C94D00B0C94D00B0C94D00B0C94D00BF4 -:100020000C94D00B0C94D00B0C94420D0C94D00B70 +:100020000C94D00B0C94D00B0C94470D0C94D00B6B :100030000C94D00B0C94D00B0C94D00B0C94D00BD4 :100040000C94D00B0C94D00B0C94D00B0C94D00BC4 :100050000C94D00B0C94D00B0C94D00B0C94D00BB4 :100060000C94D00B0C94D00B0C94D00B0C94D00BA4 :100070000C94D00B0C94D00B0C94D00B0C94D00B94 -:100080000C94D00B0C94D00B0C9417240C94D00B24 +:100080000C94D00B0C94D00B0C942B240C94992C26 :100090000C94D00B0C94D00B0C94D00B0C94D00B74 :1000A0000C94D00B0C94D00B0C94D00B0C94D00B64 -:1000B0000C94D00B0C94D00B0C94D00B0C94E62425 -:1000C0000C94D00B0C9460280C94D00B0C94D00B97 +:1000B0000C94D00B0C94D00B0C94D00B0C94FA2411 +:1000C0000C94D00B0C947E280C94072E0C94D00B1F :1000D0000C94D00B0C94D00B0C94D00B0C94D00B34 :1000E0000C94D00B0C94D00B0C94D00B0C94D00B24 :1000F0000C94D00B0C94D00B0C94D00B0C94D00B14 :100100000C94D00B0C94D00B0C94D00B0C94D00B03 -:100110000C94D00B0C943B280C94D00B0C94D00B6B +:100110000C94E02D0C9459280C94D00B0C94D00B1B :100120000C94D00B0C94D00B0C94D00B0C94D00BE3 -:100130000C94D00B0C94D00B0C94D00B0C944F243B -:100140000C94090C0C9456270C94D00B0C94D00BE7 -:100150000C94D00B0C94B2270C94D00B0C94D00BB5 +:100130000C94D00B0C94D00B0C94D00B0C94632427 +:100140000C94090C0C9474270C94C52C0C94D00BB3 +:100150000C94D00B0C94D0270C94D82E0C94D00B6C :100160000C94D00B0C94D00B0C94D00B0C94D00BA3 :100170000C94D00B0C94D00B0C94D00B0C94D00B93 :100180000C94D00B0C94D00B0C94D00B0C94D00B83 @@ -29,7 +29,7 @@ :1001C0000C94D00B0C94D00B0C94D00B0C94D00B43 :1001D0000C94D00B0C94D00B0C94D00B0C94D00B33 :1001E0000C94D00B0C94D00B0C94D00B0C94D00B23 -:1001F0000C94D00B0C941B530C94D00B6364696E5D +:1001F0000C94D00B0C942D590C94D00B6364696E45 :100200006F70737578585B001E03430068006100CF :100210006D0065006C0065006F006E002D004D00E4 :1002200069006E00690000002A034B006100730042 @@ -40,22 +40,22 @@ :100270002402060524060001070582030800FF0981 :10028000040100020A00000007050402100005072F :100290000583021000051201100102000008D016AB -:1002A000B20401000102DC01F20DF30DF40DF50DB5 -:1002B000F60DF70DEC0DED0DF10DF00D0000000148 -:1002C000A72517263626C62CE22CE62CEC0DE72CAB -:1002D0000530183040000700A72517263626DA2CEF -:1002E000E22CE62CEC0DE72C05301830500007000E -:1002F000A72517263626DE2CE22CE62CEC0DE72C63 -:1003000005301830A4000700A725172636265830D8 -:1003100094309830EC0D99307A3796370004040009 -:10032000A72517263626673094309830EC0D993083 -:100330007A37963700040700A72517263626763029 -:1003400094309830EC0D99307A37963700100400CD -:10035000A72517263626853094309830EC0D993035 -:100360007A37963700100700A72517263626F50D91 -:10037000F60DF70DEC0DED0DF10DF00D0000000187 -:10038000C7264427FC287146744681468246214987 -:10039000F10DF00D00000000004E4F4E4500000032 +:1002A000B20401000102DC01F70DF80DF90DFA0DA1 +:1002B000FB0DFC0DF10DF20DF60DF50D000000012A +:1002C000BB2530264F268431A031A431F10DA53154 +:1002D000C334D63440000700BB2530264F26983162 +:1002E000A031A431F10DA531C334D634500007003C +:1002F000BB2530264F269C31A031A431F10DA5310C +:10030000C334D634A4000700BB2530264F2616354B +:1003100052355635F10D5735383C543C0004040035 +:10032000BB2530264F26253552355635F10D57352C +:10033000383C543C00040700BB2530264F2634359A +:1003400052355635F10D5735383C543C00100400F9 +:10035000BB2530264F26433552355635F10D5735DE +:10036000383C543C00100700922F4B306C30EA525E +:10037000F852FD52FE520053F60DF50D000000013B +:10038000E02662271A292F4B324B3F4B404BDF4D63 +:10039000F60DF50D00000000004E4F4E4500000028 :1003A000000000000000000000000000000000004D :1003B000000000000000000000014D465F554C5455 :1003C00052414C4947485400000000000000000022 @@ -186,8 +186,8 @@ :100B900070733A2F2F6769746875622E636F6D2FBB :100BA000656D7365632F4368616D656C656F6E4D30 :100BB000696E6920636F6D6D69742025530031384B -:100BC000303232380031353131313500352E342E66 -:100BD000300037616238643362000D0A000D0A008C +:100BC000303931320031353131313500352E342E66 +:100BD000300031303134346631000D0A000D0A0026 :100BE0000D0A000D0A000D0A000D0A0064313030B4 :100BF0003A4F4B0000000000000000000000000021 :100C0000000000000000000000000000006531301E @@ -208,64 +208,64 @@ :100CF00000000000CB3230333A54494D454F555433 :100D000000000000000000000000000000000000E3 :100D1000000000000056455253494F4E00000000AD -:100D20000000000000000000000000E119434F4EE9 +:100D20000000000000000000000000E619434F4EE4 :100D300046494700000000000000000000000000DD -:100D400000091A031A554944000000000000000081 -:100D50000000000000000000006A1A2B1A524541F2 +:100D4000000E1A081A554944000000000000000077 +:100D50000000000000000000006F1A301A524541E8 :100D6000444F4E4C590000000000000000000000FD -:100D700000C81ABC1A55504C4F41440000000000F6 -:100D80000000000000F51A000000000000444F576A -:100D90004E4C4F41440000000000000000FA1A00D1 +:100D700000CD1AC11A55504C4F41440000000000EC +:100D80000000000000FA1A000000000000444F5765 +:100D90004E4C4F41440000000000000000FF1A00CC :100DA00000000000005245534554000000000000C0 -:100DB0000000000000FF1A0000000000005550472E -:100DC000524144450000000000000000000A1B00E2 +:100DB0000000000000041B00000000000055504728 +:100DC000524144450000000000000000000F1B00DD :100DD00000000000004D454D53495A4500000000F9 -:100DE0000000000000000000000000151B554944F1 +:100DE00000000000000000000000001A1B554944EC :100DF00053495A45000000000000000000000000B8 -:100E00000000002D1B52425554544F4E000000006C -:100E10000000000000000000004A1B431B52425526 +:100E0000000000321B52425554544F4E0000000067 +:100E10000000000000000000004F1B481B5242551C :100E200054544F4E5F4C4F4E4700000000000000EE -:100E300000661B5F1B4C425554544F4E000000008F -:100E4000000000000000000000821B7B1B4C42558C +:100E3000006B1B641B4C425554544F4E0000000085 +:100E4000000000000000000000871B801B4C425582 :100E500054544F4E5F4C4F4E4700000000000000BE -:100E6000009E1B971B4C4544475245454E000000D1 -:100E7000000000000000000000BA1BB31B4C4544FA +:100E600000A31B9C1B4C4544475245454E000000C7 +:100E7000000000000000000000BF1BB81B4C4544F0 :100E80005245440000000000000000000000000087 -:100E900000D61BCF1B4C4F474D4F44450000000070 -:100EA000000000000000000000F01BEB1B4C4F474F +:100E900000DB1BD41B4C4F474D4F44450000000066 +:100EA000000000000000000000F51BF01B4C4F4745 :100EB0004D454D0000000000000000000000000053 -:100EC000000000051C4C4F47444F574E4C4F4144C7 -:100ED00000000000002A1C0000000000004C4F47EA -:100EE00053544F524500000000000000002F1C002A +:100EC0000000000A1C4C4F47444F574E4C4F4144C2 +:100ED00000000000002F1C0000000000004C4F47E5 +:100EE00053544F52450000000000000000341C0025 :100EF00000000000004C4F47434C454152000000A9 -:100F00000000000000321C000000000000534554A7 +:100F00000000000000371C000000000000534554A2 :100F100054494E470000000000000000000000009F -:100F2000003A1C351C434C454152000000000000B3 -:100F30000000000000421C00000000000053544F5D -:100F400052450000000000000000000000461C00A8 +:100F2000003F1C3A1C434C454152000000000000A9 +:100F30000000000000471C00000000000053544F58 +:100F4000524500000000000000000000004B1C00A3 :100F50000000000000524543414C4C0000000000DE -:100F600000000000004A1C0000000000004348414F +:100F600000000000004F1C0000000000004348414A :100F70005247494E470000000000000000000000FA -:100F80000000004E1C48454C5000000000000000CE -:100F90000000000000561C000000000000525353E7 +:100F8000000000531C48454C5000000000000000C9 +:100F900000000000005B1C000000000000525353E2 :100FA00049000000000000000000000000000000F8 -:100FB000000000921C5359535449434B0000000059 -:100FC0000000000000000000000000C51C53454E5A -:100FD000445F524157000000000000000000006B19 +:100FB000000000971C5359535449434B0000000054 +:100FC0000000000000000000000000CA1C53454E55 +:100FD000445F524157000000000000000000007014 :100FE0001D0000000053454E4400000000000000BA -:100FF00000000000000000E11C0000000047455414 -:1010000055494400000000000000000000271E00B9 +:100FF00000000000000000E61C000000004745540F +:10100000554944000000000000000000002C1E00B4 :10101000000000000044554D505F4D465500000053 -:1010200000000000000A1E000000000000494445C6 -:101030004E544946590000000000000000441E00C4 +:1010200000000000000F1E000000000000494445C1 +:101030004E544946590000000000000000491E00BF :10104000000000000054494D454F55540000000079 -:10105000000000000000000000811E611E54485284 +:10105000000000000000000000861E661E5448527A :101060004553484F4C4400000000000000000000C1 -:1010700000EE1ED41E4155544F43414C494252414B -:101080005445000000811F00000000000046494553 +:1010700000F31ED91E4155544F43414C4942524141 +:101080005445000000861F0000000000004649454E :101090004C440000000000000000000000000000C0 -:1010A00000431F6D1F434C4F4E45000000000000E1 -:1010B00000000000009E1F00000000000000000073 +:1010A00000481F721F434C4F4E45000000000000D7 +:1010B0000000000000B21F0000000000000000005F :1010C0000000000000000000000000000000000020 :1010D000000000000053414B3A09005549443A09C9 :1010E00000415451413A09005468657265206973A2 @@ -373,10 +373,10 @@ :101740000000000000000000000000000000000099 :1017500000000000000011241FBECFEFCDBFDFE36B :10176000DEBF00E00CBF18BE19BE1ABE1BBE14E2DD -:10177000A0E0B0E2E6E8FAEB00E00BBF02C00790A1 -:101780000D92A235B107D9F71BBE25E3A2E5B4E25D -:1017900001C01D92A03AB207E1F77ED00C94415DE2 -:1017A00068C13BB78BBFFB01879196913BBF089502 +:10177000A0E0B0E2EAEAF6EC00E00BBF02C007909E +:101780000D92AA35B107D9F71BBE27E3AAE5B4E24B +:1017900001C01D92AD32B207E1F77ED00C945363C5 +:1017A0006DC13BB78BBFFB01879196913BBF0895FD :1017B0003BB78BBFCB0142E20D94F00F3BB70B015F :1017C00043E20D94F00F3BB78BBFCB0145E20D9484 :1017D000F00F3BB746E208C02091CF0127FDFCCFB8 @@ -388,2671 +388,2865 @@ :1018300035B124B1569578F400928C0800920008D6 :1018400006E10A95F1F700C001E00093000803E00B :1018500000938C0804C00AE10A95F1F700002150BA -:10186000304019F40E94A0270CC04F5F477011F45C +:10186000304019F40E94BE270CC04F5F477011F43E :10187000519102C000C000C00AE00A95F1F700C013 :10188000D9CFFF91EF910F910FBF5F914F913F9192 -:101890002F910F910F9018950ED10E9406170E945C -:1018A000A217A8D21092520684E08093420682E6E4 +:101890002F910F910F90189513D10E940B170E9452 +:1018A000A717ADD21092520684E08093420682E6DA :1018B00080938601C1E0C0932606C093210686E08E -:1018C00080932206C093310602E000933206109204 -:1018D0002A0613E01093290689E5809380018AE5A2 -:1018E0008093810180E48093410680934606909125 -:1018F000B200907F9093B2009091B200926090936A -:10190000B20090E390934106909346068093500670 -:10191000C0934606009345061093410683E18093E9 -:10192000010821E030E02093260830932708209317 -:1019300028083093290810928C0880938008109210 -:10194000230310922103D8E0D093220381E18093F6 -:101950002003E091B12EF091B22E82859385809381 -:101960003803909339038CE380938203D0938003F0 -:1019700080938303D093810366D10E944419B7D129 -:1019800017D7C09300021092010200930202109335 -:101990000402C0932002D09321020E94991517D10E -:1019A000D2E0C1E18091030481FF25C08091010450 -:1019B00080FDFCCFD09303040E94A617AED10E94F5 -:1019C0007719FED60E940117E091A22EF091A32E66 -:1019D00019950E948C220E94E318E091B12EF0919B -:1019E000B22E8781813011F4C0935B2C86818130C7 -:1019F00011F4C0935A2C0E9448199CD7E091A02E54 -:101A0000F091A12E1995E0919A2EF0919B2E1995A7 -:101A1000C9CF292F33272230310559F02330310522 -:101A200069F021303105E9F482E190E026E932E005 -:101A30001CC08EE390E028E532E017C09927813082 -:101A4000910549F028F0029761F4E8E0F2E005C062 -:101A5000E4E5F2E002C0E8E2F2E0849190E09F0168 -:101A600004C080E090E020E030E0FA012083318380 -:101A700008951F920F920FB60F92112408B60F927D -:101A800018BEFFCF1F920F920FB60F92112408B607 -:101A90000F9218BE8F939F938EB19FB180589F4F26 -:101AA0008EB99FB99F918F910F9008BE0F900FBE76 -:101AB0000F901F9018958091780083FF0AC088E0EE -:101AC0008093780088ED84BF81E0809380000D943E -:101AD000FE008BEC809352008091500088608093D0 -:101AE00050008091510083FFFCCF82EC8093550021 -:101AF000809150008061809350008091510084FF5C -:101B0000FCCF88ED84BF84E0809340001EB81FB8EE -:101B100081E0809343002FE730E020930A04309364 -:101B20000B0420930C0430930D04809300048093E5 -:101B3000020480E880930001089588ED84BF81E06D -:101B400080937900089588ED84BF8BE180938000B5 -:101B500008958091500082608093500080915100E0 -:101B600081FFFCCF82E08093CA01EDE1F0E0E491D7 -:101B7000E0936200ECE1F0E0E491E0936300109206 -:101B8000CA0180E8809365008BEB809366008091AA -:101B90005600897F80935600809156008460809320 -:101BA0005600809160008160809360000895E0E4B9 -:101BB000F0E084818E7F8483E0E6F0E080818E7F98 -:101BC0008083E0E5F0E080818D7F8083089587E069 -:101BD0008093A20078940895089580E090E008959D -:101BE000089508950895089508950895089508950D -:101BF0000F931F93CF93C82F06E91EE2D8011296C8 -:101C0000ED91FC91139719950E94C422E091B12E99 -:101C1000F091B22EC583B8E1CB9FB0011124685575 -:101C20007D4F48E150E0C8010E940456D801ED9173 -:101C3000FC911995D8011696ED91FC911797CF91CB -:101C40001F910F91199448E150E068EA72E086E92B -:101C50009EE20E940456E091B12EF091B22E858151 -:101C6000C7CF0F931F93E091B12EF091B22E8B014D -:101C70009C0145816AE088E993E00E947F181F91EA -:101C80000F910895FF920F931F93CF93DF931F92AD -:101C9000CDB7DEB78C019E012F5F3F4FAC016AE0EC -:101CA00088E993E00E949718F82E882389F08981AB -:101CB0009FDFF80140E08191882319F04F5F4F3199 -:101CC000D1F7E091AE2EF091AF2EB80181E11995D8 -:101CD0008F2D0F90DF91CF911F910F91FF9008955D -:101CE0009B01AC016AE088E993E00C94BE1808956A -:101CF0000C94F65508950F931F93CF938C01C62F24 -:101D0000CC2339F00E94F655F80181938F01C15020 -:101D1000F7CFCF911F910F9108950E94F6550E9421 -:101D2000F6550E94F6550C94F655CF93DF93EC01CF -:101D300061507109DA01420F531FFC01CF018C1B66 -:101D40009D0BA417B50721F41082DF91CF91089560 -:101D500062307105C8F39D91392F32953F703A304A -:101D600010F4305D01C0395C30839F709A3010F4FC -:101D7000905D01C0995C9183329662507109DECF0B -:101D8000CF93DF93EC01DA0120E030E05C91552342 -:101D900051F111969C911197992339F12617370724 -:101DA00011F180ED850F8A3020F08FEB850F8630A2 -:101DB000E0F480ED890F8A3020F04FEB490F463078 -:101DC000A0F4E52FF0E0513408F0F797E295E07FBA -:101DD000913410F4982F01C097539E2B99932F5F45 -:101DE0003F4F1296D3CFC90102C080E090E0DF914F -:101DF000CF910895E0E6F6E080E1858382E0868376 -:101E000088E085838AE18183E0EAF9E0168217821F -:101E100080EC858388E18483E0E0F1E0128A8BE640 -:101E2000838B148A158A20EA208F99E0918F128E75 -:101E3000148E158E168E84E0808B12A23CE633A39E -:101E400014A215A210A611A612A624A795A716A63D -:101E500080A308954115510509F449C020E120935C -:101E6000660623E02093A0092091A10927FFFCCF5B -:101E70002091A0097093A0092091A10927FFFCCF10 -:101E80002091A0096093A0092091A10927FFFCCF10 -:101E90002091A00921E02093120180931C019093CE -:101EA0001D0140931401509315011092220182E507 -:101EB00094E2809328019093290140932401509348 -:101EC000250180911001806880931001809120018C -:101ED0008068809320018091100187FDFCCF80E312 -:101EE000809311018093210180E18093650608951C -:101EF0004115510509F469C020E12093660626E0EA -:101F00002093A0092091A10927FFFCCF2091A009CF -:101F100020E120936506000000002093660622E081 -:101F20002093A0092091A10927FFFCCF2091A009AF -:101F30007093A0092091A10927FFFCCF2091A0094F -:101F40006093A0092091A10927FFFCCF2091A0094F -:101F50001092120122E534E220931C0130931D01FE -:101F6000409314015093150120E1209322018093A6 -:101F700028019093290140932401509325018091D9 -:101F80001001806880931001809120018068809307 -:101F900020018091100187FDFCCF80E38093110127 -:101FA0008093210180E180936506E091B12EF0914C -:101FB000B22E8781863019F481E180935B2C868173 -:101FC000863019F481E180935A2C0895CF92DF92E4 -:101FD000EF92FF92CF93DF93C090B02ED12CE12CE3 -:101FE000F12C8DE0CC0CDD1CEE1CFF1C8A95D1F78A -:101FF000C114D10481E0E806F10408F04EC080E18C -:102000008093660686E08093A0098091A10987FFEE -:10201000FCCF8091A00980E180936506000000005C -:102020008093660682E08093A0098091A10987FFD2 -:10203000FCCF8091A0091092A0098091A10987FF8F -:10204000FCCF8091A0091092A0098091A10987FF7F -:10205000FCCF8FEFE81AF80A8091A009C0E0D0E128 -:10206000C701B6019EDB8093A0098091A10987FF7B -:10207000FCCF8091A0099093A0098091A10987FFCE -:10208000FCCF8091A00982E0C80ED11CE11CF11C9C -:10209000219731F780E1809365068091010480FDEE -:1020A000FCCF82E080930304DF91CF91FF90EF900B -:1020B000DF90CF900895CF92DF92EF92FF92CF936F -:1020C000DF93C090B02ED12CE12CF12C8DE0CC0C04 -:1020D000DD1CEE1CFF1C8A95D1F7C114D10481E0F0 -:1020E000E806F10438F0DF91CF91FF90EF90DF9098 -:1020F000CF906CCF8FEFE81AF80AC1E2D0E02197B9 -:1021000091F36ADBC701B60153DB66DB8FEFD81AA8 -:10211000E80AF80AF4CFCF92DF92EF92FF920F9382 -:102120001F93CF93DF93C090B02ED12CE12CF12CD4 -:102130008DE0CC0CDD1CEE1CFF1C8A95D1F7C11480 -:10214000D10481E0E806F10408F04FC080E18093FB -:10215000660683E08093A0098091A10987FFFCCFE8 -:102160008091A0091092A0098091A10987FFFCCF5E -:102170008091A0091092A0098091A10987FFFCCF4E -:102180008FEFE81AF80A8091A00901E210E00150EF -:10219000110941F121DB1DDB1FDBC0E0D0E0109213 -:1021A000A0098091A10987FFFCCF6091A00970E090 -:1021B0001092A0098091A10987FFFCCF8091A0090E -:1021C000782BCE01FBDA08DB2296C11581E0D80717 -:1021D00031F7C701B601F7DAFFDA8FEFD81AE80A4C -:1021E000F80AD5CF80E180936506E091B12EF09199 -:1021F000B22E8781863019F490E190935B2C968102 -:10220000963049F420E120935A2C853059F483E12B -:1022100080935B2C02C08530D1F3953019F483E1B3 -:1022200080935A2C8091010480FDFCCF82E0809342 -:102230000304DF91CF911F910F91FF90EF90DF90FA -:10224000CF900895CF92DF92EF92FF920F931F935A -:102250004115E0E25E076105710508F06BC0690198 -:10226000E12CF12C00E010E220E030E0041B150B23 -:10227000260B370BC016D106E206F30610F49701C1 -:10228000860120E12093660626E02093A009209194 -:10229000A10927FFFCCF2091A00920E1209365062A -:1022A000000000002093660622E02093A009209100 -:1022B000A10927FFFCCF2091A0095093A0092091EC -:1022C000A10927FFFCCF2091A0094093A0092091EC -:1022D000A10927FFFCCF2091A0091092120122E54D -:1022E00034E220931C0130931D01009314011093DC -:1022F000150120E120932201809328019093290168 -:10230000009324011093250180911001806880932F -:10231000100180912001806880932001809110013C -:1023200087FDFCCF80E3809311018093210180E140 -:102330008093650681E01F910F91FF90EF90DF90F1 -:10234000CF900895CF92DF92EF92FF920F931F9359 -:102350004115E0E25E076105710508F05DC06901A5 -:10236000E12CF12C00E010E220E030E0041B150B22 -:10237000260B370BC016D106E206F30610F49701C0 -:10238000860120E12093660623E02093A009209196 -:10239000A10927FFFCCF2091A0095093A00920910B -:1023A000A10927FFFCCF2091A0094093A00920910B -:1023B000A10927FFFCCF2091A00921E02093120161 -:1023C00080931C0190931D0100931401109315013B -:1023D0001092220182E594E28093280190932901D2 -:1023E000009324011093250180911001806880934F -:1023F000100180912001806880932001809110015C -:1024000087FDFCCF80E3809311018093210180E15F -:102410008093650681E001C080E01F910F91FF90DD -:10242000EF90DF90CF9008958091CF0187FDFCCF92 -:102430000895FADF8091CF0181FF0BC086E380937E -:10244000CA01EBECF1E021E030E088ED90E084BFE0 -:1024500020830895EF92FF920F931F93CF93DF9302 -:10246000EC017B018A011092C201DEDFD701CE01AF -:10247000800F911F26E048ED50E061E070E0EBEC4A -:10248000F1E0C817D90779F0C093C0013D2F3F7123 -:102490003093C1012093CA0144BF60833091C401CD -:1024A0003D932196EECFC801DF91CF911F910F91FF -:1024B000FF90EF9008953F924F925F926F927F92BC -:1024C0008F929F92AF92BF92CF92DF92EF92FF9244 -:1024D0000F931F93CF93DF938B01542E652E282FDC -:1024E0002F71722EEC01C21BD109A3DF9DDF83E3A4 -:1024F0008093CA011092C1011092C2017801052D8A -:10250000162D85E3482E98EDC92ED12C882483946E -:10251000912C3BECA32EBB24B39443E3342E011542 -:10252000110501F17092C001F70181917F01809343 -:10253000C4010150110921F07394F0E27F12EFCF32 -:10254000C093C0018D2F8F718093C1014092CA0149 -:10255000C601F50184BF8082A09666DF3092CA0171 -:10256000712CDDCF852D962DDF91CF911F910F918D -:10257000FF90EF90DF90CF90BF90AF909F908F90A3 -:102580007F906F905F904F903F9008951F93CF93EF -:10259000DF93CDB7DEB7A097CDBFDEBF863009F49D -:1025A000EAC0D0F4833009F46AC028F4813059F1CC -:1025B0008230C9F1F6C0843009F486C0853009F054 -:1025C000F0C0E091A62EF091A72ECE0101961995AC -:1025D0008091AC2E41E0A4C0893009F4D0C040F411 -:1025E000873009F4CAC0883009F0DBC0EFDCD9C0FD -:1025F0008A3009F4D5C08B3009F0D3C08EEA93E25B -:102600000E94C221CEC010E08091AC2E181708F0B5 -:102610009FC06EDBE1E0F0E0EC0FFD1FE10FF11D6C -:1026200080831F5FF1CF11E08091AC2E873009F0DD -:1026300010E0E091A62EF091A72ECE0101961995FB -:102640004091AC2E31E0141708F082C03323A9F07A -:10265000812F90E0E1E0F0E0EC0FFD1FE80FF91FA3 -:10266000208131E02F3F09F030E0E1E0F0E0EC0FB5 -:10267000FD1FE80FF91F2F5F20831F5FE4CFE0915C -:10268000A62EF091A72ECE01019619958091AC2E21 -:1026900041E0815008F45CC04423D9F3282F30E096 -:1026A000E1E0F0E0EC0FFD1FE20FF31F908141E04D -:1026B0009F3F09F040E0E1E0F0E0EC0FFD1FE20F8A -:1026C000F31F9F5F9083E5CF11E08091AC2E8730A0 -:1026D00009F010E0E091A62EF091A72ECE01019610 -:1026E00019954091AC2E31E0141790F53323A1F0E9 -:1026F000812F90E0E1E0F0E0EC0FFD1FE80FF91F03 -:10270000208131E0211130E0E1E0F0E0EC0FFD1F2D -:10271000E80FF91F215020831F5FE6CF411103C04E -:102720008150E0F715C0282F30E0E1E0F0E0EC0F39 -:10273000FD1FE20FF31F908141E0911140E0E1E0C5 -:10274000F0E0EC0FFD1FE20FF31F91509083E8CFF4 -:10275000E091A82EF091A92ECE0101961995E09155 -:10276000AE2EF091AF2E4091AC2EBE016F5F7F4F29 -:1027700083E1199516C0B0D314C0CDDC12C080918E -:102780000008813021F490918C08933009F080E0AA -:1027900080FD03C00E944E2304C00E94742301C028 -:1027A000AAD2A096CDBFDEBFDF91CF911F91089531 -:1027B000E0E0F6E080E6828388E1868B858B0895F1 -:1027C000CF93C0910806C095C6FF12C080915424D3 -:1027D0008A3050F08A30E1F4E091B12EF091B22EBF -:1027E0008181D4DE809154248F5F8093542410C063 -:1027F0008C2F807669F48091542481508A3030F493 -:10280000E091B12EF091B22E8081C0DE109254245E -:10281000C5FF12C0809153248A3050F08A30D9F419 -:10282000E091B12EF091B22E8381B0DE80915324DD -:102830008F5F809353240FC0C07669F48091532436 -:1028400081508A3030F4E091B12EF091B22E828125 -:102850009DDE10925324CF9108959B01AC016CE052 -:1028600082EE96E08BC4E82FF0E0E055F14D88E071 -:10287000638381503C968111FBCF08950F931F9382 -:102880009B01E091B12EF091B22EE80FF11D8A016B -:1028900040816CE082EE96E032D41F910F91089552 -:1028A0000F931F93CF93DF931F92CDB7DEB7082FFF -:1028B000AB019E012F5F3F4F6CE082EE96E037D474 -:1028C000182F882319F06981802FCDDF812F0F9079 -:1028D000DF91CF911F910F9108950895EF92FF928C -:1028E0000F931F93CF937B01C42F0EB11FB1209183 -:1028F000080430910904022B132B682F83E090E227 -:102900000E9406546C2F83E090E20E940654612FCF -:1029100083E090E20E940654602F83E090E20E94E0 -:1029200006546C2F70E0C701CF911F910F91FF905B -:10293000EF90A4C408953F924F925F926F927F925E -:102940008F929F92AF92BF92CF92DF92EF92FF92BF -:102950000F931F93CF93DF937C01E901C090002078 -:10296000D0900120960122503843C901A0E0B0E088 -:10297000481759076A077B0708F05FC0E2E0CE1AE4 -:10298000E0E4DE0A2A013B014C0E5D1E611C711C55 -:10299000481659066A067B0648F0241B350B8E0143 -:1029A000021B130BE9013324339403C000E010E051 -:1029B000312C4601A12CB12C481559056A057B051F -:1029C00010F5CA018E5F9F4B2A013B014C0E5D1E24 -:1029D000611C711C481459046A047B0428F4AE017C -:1029E000BC01C70137DA18C0C41AD50AA601BC0158 -:1029F000C70130DAAE014C195D096AE574E2C7011E -:102A00008C0D9D1D07C04C195D09BA01665A7B4D9E -:102A1000AE01C7010E943256332041F00C0F1D1F3A -:102A2000F701E00FF11FCE0DDF1D02C081E006C0EF -:102A3000EC17FD07D9F31292FBCF80E0DF91CF9125 -:102A40001F910F91FF90EF90DF90CF90BF90AF90CC -:102A50009F908F907F906F905F904F903F900895E0 -:102A6000209156243091572480E098E0821B930BEC -:102A7000EAE5F4E29F012A5534422817390710F499 -:102A80001192F8CF8AE594E28093582490935924C8 -:102A900080E098E0809356249093572482E090E45D -:102AA000809300209093012042E050E060E070E4C9 -:102AB00080E090E21DDAE091B12EF091B22E878194 -:102AC0008A3019F480E180935B2C86818A3019F476 -:102AD00080E180935A2C0895809156249091572438 -:102AE00090582091002030910120821B930B089573 -:102AF000E0EBFEE287833C969FE2E031F907D1F7F5 -:102B0000813049F018F0823059F008951092552420 -:102B10008DE694E109C08093552484EF95E104C0CB -:102B2000109255248EE694E18093AE2E9093AF2EB2 -:102B300008950F931F93CF93DF931F92CDB7DEB706 -:102B4000E091B12EF091B22E8481D2DF8AE594E239 -:102B5000809358249093592400E018E00093562461 -:102B60001093572441E050E0BE016F5F7F4F80E03B -:102B700090E070DCE0915824F0915924DF01C80105 -:102B80001D920197E9F78981882341F042E050E0E6 -:102B900060E070E480E090E25DD917C082E090E4EC -:102BA000809300209093012042E050E060E070E4C8 -:102BB00080E090E29DD981E0898341E050E0BE0150 -:102BC0006F5F7F4F80E090E076DCE091AE2EF09179 -:102BD000AF2E40E060E070E08FEF19950F90DF912D -:102BE000CF911F910F9108950F931F93CF93DF9370 -:102BF000CEB1DFB1A0910804B09109042091562410 -:102C000030915724E42FF0E08F010C5F1F4F201705 -:102C1000310758F1CA2BDB2B245031092E1B3F0BF7 -:102C20002093562430935724A0915824B0915924CE -:102C30008C9311964C9311971296DC931297CD01B9 -:102C4000049680935824909359241396CC93DB01D7 -:102C5000EC01415018F02D912993FBCFE80FF91F9B -:102C6000E0935824F093592412C080E041DFE091B2 -:102C7000B12EF091B22E87818A3019F481E18093D0 -:102C80005B2C86818A3019F481E180935A2CDF9184 -:102C9000CF911F910F9108951F93CF93DF931F92B0 -:102CA000CDB7DEB79E012F5F3F4FAC0163E08EE6EC -:102CB00098E03DD2182F882311F0898119DF812FE8 -:102CC0000F90DF91CF911F9108950F931F93E09183 -:102CD000B12EF091B22E8B019C01448163E08EE60F -:102CE00098E00DD21F910F9108959B01AC0163E014 -:102CF0008EE698E043C20F931F93CF93DF938091AA -:102D0000562490915724811528E0920708F074C04A -:102D10006091002070910120C0E0D0E8C61BD70B65 -:102D200000E018E0A801481B590BC417D50758F15B -:102D30008AE594E2DDD82091562430915724809181 -:102D4000002090910120985F821B930B80930020BC -:102D500090930120021B130BEAE5F4E2CF018A55A0 -:102D600094428017910710F41192F8CF8AE594E20B -:102D7000809358249093592480E098E080935624BF -:102D8000909357242EC02097B9F1AE018AE594E2C2 -:102D9000AFD8A8014C1B5D0BBE01665A7B4D8AE57E -:102DA00094E20E943B5680915824909159248C1BA8 -:102DB0009D0B809358249093592480915624909190 -:102DC00057248C0F9D1F80935624909357248091F5 -:102DD000002090910120C80FD91FC0930020D093EC -:102DE000012042E050E060E070E480E090E2DF919A -:102DF000CF911F910F917CC8DF91CF911F910F91BF -:102E0000089580915524811176CF089543E650E0CE -:102E100060EB7EE281E090E01DCB43E650E060EBAA -:102E20007EE281E090E047CB0F931F93CF93DF9337 -:102E3000CFEFC80FC83008F047C0D82F0E94C42277 -:102E40008091B02EC81779F166D9C093B02E8CE06E -:102E5000C89F90011124C9018D54914D8093B12ECA -:102E60009093B22EF901E055F14D80850E94F80D46 -:102E7000E091B12EF091B22E84813ADEA7D801E024 -:102E800010E0005B1E426091B02EC8018055914D4C -:102E90000E94D35C6091B12E7091B22EC8018F5404 -:102EA000914D0E94DC5C8FE18D0FE091B12EF0918D -:102EB000B22E9781943011F480935B2C96819430DC -:102EC00029F480935A2C02C080E001C081E0DF9198 -:102ED000CF911F910F9108958091B02E99E04CE011 -:102EE000915099F0282F30E02F5F3F4F2770332704 -:102EF000822F429FF001439FF00D1124E055F14DC8 -:102F00002085222369F38F5F8FCF0895FC01909174 -:102F1000B02E9F5C908311820895CF93FC01218194 -:102F200021110DC0BC01C081E091AE2EF091AF2EF9 -:102F300041E082E1199580ED8C0FCF9175CF80E053 -:102F4000CF91089588E180930106089580915A2CCD -:102F5000823191F030F48031B9F050F48823A9F136 -:102F600032C0833169F090EE980F983088F02BC012 -:102F700088E08093050627C088E08093070623C079 -:102F80008091040683FF12C088E0809306061BC070 -:102F900090915C2C9F5F913019F090935C2C15C040 -:102FA00010925C2C9091040693FD04C088E08093FD -:102FB00005060BC098E090930606803221F0815000 -:102FC00080935A2C02C010925A2C80915B2C823133 -:102FD00091F030F48031C1F050F48823A9F132C06F -:102FE000833169F090EE980F983088F02BC080E123 -:102FF0008093050627C080E18093070623C0809157 -:10300000040684FF12C080E1809306061BC09091E5 -:103010005D2C9F5F913019F090935D2C0895109274 -:103020005D2C9091040694FD04C080E18093050618 -:10303000089590E190930606803221F081508093AC -:103040005B2C089510925B2C08959B01AC016BE002 -:1030500081ED98E093C0E0EBFEE298E0282F20712C -:103060008870211162878111618791503C9691117E -:10307000F8CF222329F090E19093060610925B2C62 -:10308000882329F088E08093060610925A2C089530 -:103090000F931F939B018A01803131F4E091B12E8F -:1030A000F091B22E478107C0883049F4E091B12EEB -:1030B000F091B22E46816BE081ED98E020D01F9117 -:1030C0000F9108950F931F93CF93DF931F92CDB766 -:1030D000DEB7082FAB019E012F5F3F4F6BE081ED04 -:1030E00098E025D0182F882319F06981802FB3DF4D -:1030F000812F0F90DF91CF911F910F9108950F9322 -:103100001F93FC01662379F094916150941309C0D8 -:10311000BF016F5F7F4FA801C9010E94165681E071 -:1031200003C0B196EFCF80E01F910F910895CF9229 -:10313000DF92EF92FF921F93CF93DF93EC017A011E -:103140006901162F112389F0BE016F5F7F4FC70100 -:103150000E940D561150892B31F4FE01C491F601E5 -:10316000C08381E003C0A196EDCF80E0DF91CF91D5 -:103170001F91FF90EF90DF90CF900895CF9301962D -:10318000CCE26623D1F0FC01DA01AD017491772322 -:1031900041F021153105A9F07D9331962150310977 -:1031A000F4CF623038F02115310559F0FD01C083AC -:1031B0004F5F5F4F61508196E4CF232B11F0FA01EE -:1031C0001082CF9108958091200280688093200220 -:1031D0008091230280FFFCCF81E080932302A091A5 -:1031E0001002B0911102AE5BB109B7FF02C0A0E0BE -:1031F000B0E020E038EB4BE050E00E949055E091C9 -:10320000B12EF091B22E843F9140A8F4878187308F -:1032100019F480E180935B2C8681873019F480E17A -:1032200080935A2C8091AC2E882389F0E0919E2EB9 -:10323000F0919F2E19948781873019F481E1809352 -:103240005B2C8681873019F481E180935A2C089594 -:10325000BC0183E090E20C94B853CF93DF93FC0160 -:103260006491EC012196662331F083E090E20E94A4 -:103270000654CE01F4CFDF91CF910895AB01BC018C -:1032800083E090E20C94E25380E28093620608951A -:10329000CF93DF9380915E2C823031F583E090E212 -:1032A0000E946F540E944D4F83E090E20E948B5425 -:1032B000EC0197FD19C0E091B12EF091B22E8781FB -:1032C000833019F483E180935B2C8681833019F479 -:1032D00083E180935A2C8C2F79D6811105C08C2FD5 -:1032E000DF91CF910C94E221DF91CF9108958091ED -:1032F0005E2C813079F028F08230C9F0833011F1F2 -:103300002EC08091680685FF31C08FE08093022037 -:1033100081E015C0809102208150809302208111AC -:1033200025C00E94A90D0E94E55282E008C080914C -:10333000680685FD18C08FE08093022083E08093AB -:103340005E2C0DC08091022081508093022081115B -:103350000DC00E94AA520E94D70D10925E2C80913F -:103360005E2C823019F481D70C948C220895E09160 -:10337000B12EF091B22E8781823019F481E18093D1 -:103380005B2C8681823019F481E180935A2C089558 -:10339000E091B12EF091B22E8781823019F480E154 -:1033A00080935B2C8681823019F480E180935A2CC3 -:1033B000089583E090E20C94935383E090E20C94A0 -:1033C000DE5422ED3BE03F932F932CEC3BE03F9308 -:1033D0002F9325EC3BE03F932F932EEB3BE03F9365 -:1033E0002F932EE13BE03F932F9322E02F931F92E8 -:1033F0009F938F930E949B568DB79EB70E968DBF5D -:103400009EBF85E6089560E072E00E94310E85E679 -:103410000895FB0120812F3349F42181211106C039 -:1034200060E072E00E94700E85E60895CB010E9474 -:10343000420E882371F0E091B12EF091B22ECF01AF -:103440008B5A9E4265818F5F9F4F0E94D35C84E6BA -:1034500008958AEC0895EF92FF920F931F93CF93F4 -:10346000DF93CDB7DEB7A097CDBFDEBF7C01009163 -:10347000AC2E10E00115110591F486E19BE09F93BD -:103480008F9382E08F931F92FF92EF920E949B5640 -:103490000F900F900F900F900F900F9010C0E09131 -:1034A000A62EF091A72ECE01019619959801AE0196 -:1034B0004F5F5F4F60E072E0C7010E94950E85E6A6 -:1034C000A096CDBFDEBFDF91CF911F910F91FF90EE -:1034D000EF900895DF92EF92FF920F931F93CF9397 -:1034E000DF93CDB7DEB7A097CDBFDEBF7B010091E4 -:1034F000AC2E10E06FE07BE0C7010E940D56892BD7 -:1035000029F5D12CED2CF12CE016F10658F40E948F -:10351000780EE1E0F0E0EC0FFD1FEE0DFF1D808363 -:10352000D394F0CFE091A82EF091A92ECE01019670 -:103530001995E091AE2EF091AF2E4091AC2EBE01C8 -:103540006F5F7F4F83E1199584E60BC0A70160E2AE -:1035500070E0CE0101960E94C00E0817190711F302 -:103560008AECA096CDBFDEBFDF91CF911F910F9166 -:10357000FF90EF90DF900895FC018091AD2E88239D -:1035800011F081E301C080E38083118285E6089514 -:10359000FB012181211127C02081213321F481E009 -:1035A0008093AD2E04C0203321F41092AD2E84E61A -:1035B00008952F33C1F41F9220E32F931F9221E32C -:1035C0002F9329E03BE03F932F9322E02F931F920C -:1035D0009F938F930E949B568DB79EB70A968DBF7F -:1035E0009EBF85E608958AEC089582E291E1BDD4FC -:1035F0008EE6089582EA91E1D3D48EE60895E0EC58 -:10360000F4E081818E7F81830E94AA520E949D0DE9 -:1036100084E60895E0ECF4E081818E7F81830E944E -:10362000AA520E94A30D84E60895E6E9FEE22589E8 -:103630002F9324892F9326E03BE03F932F9322E0A2 -:103640002F931F929F938F930E949B568DB79EB787 -:1036500008968DBF9EBF85E608952091AC2E1F92DF -:103660002F9323E03BE03F932F9322E02F931F9271 -:103670009F938F930E949B568DB79EB708968DBFE0 -:103680009EBF85E6089540E052E0BC0180E0F6D898 -:1036900085E60895FB0120812F3341F4218121111A -:1036A00005C060E072E0D9D885E6089580E0F8D8DA -:1036B000882319F0B2DB84E608958AEC089540E08F -:1036C00052E0BC0181E0DAD885E60895FB01208153 -:1036D0002F3341F42181211105C060E072E0BDD893 -:1036E00085E6089581E0DCD8882319F096DB84E62E -:1036F00008958AEC089540E052E0BC0182E0BED813 -:1037000085E60895FB0120812F3341F421812111A9 -:1037100005C060E072E0A1D885E6089582E0C0D8D7 -:10372000882319F07ADB84E608958AEC089540E056 -:1037300052E0BC0183E0A2D885E60895FB01208118 -:103740002F3341F42181211105C060E072E085D85A -:1037500085E6089583E0A4D8882319F05EDB84E62B -:1037600008958AEC089540E052E0BC0180E190DCCD -:1037700085E60895FB0120812F3341F42181211139 -:1037800005C060E072E061DC85E6089580E19ADCC6 -:10379000882319F042DB84E608958AEC089540E01E -:1037A00052E0BC0188E074DC85E60895FB012081CD -:1037B0002F3341F42181211105C060E072E045DC26 -:1037C00085E6089588E07EDC882319F026DB84E610 -:1037D00008958AEC089560E072E077DA85E608954E -:1037E000FB0120812F3341F42181211105C060E0CC -:1037F00072E07BDA85E60895CB014EDA882319F072 -:103800000CDB84E608958AEC0895CF93DF93EC01F6 -:1038100063D9813028E0920718F09C01385002C02B -:1038200020E030E03F932F939F938F9383EE9AE0B5 -:103830009F938F9382E08F931F92DF93CF930E9489 -:103840009B568DB79EB70A968DBF9EBF85E6DF91CA -:10385000CF9108958BE994E1A3D38EE608954BDAD6 -:1038600084E60895FDD884E6089560E072E04EDBBA -:1038700085E60895CB0151DB811102C08AEC0895E1 -:1038800084E608950E945B1084E608950E948B10E0 -:1038900084E608950E94E60F84E608958091680604 -:1038A00080FD02C089E7089588E70895DF92EF92CE -:1038B000FF920F931F93CF93DF93EC010FEF11E073 -:1038C00085E1E82E8DE0F82E9CE2D92EB70185EC3B -:1038D00093E20E940D56892BD1F001151105B9F024 -:1038E000DE01F7012491ED012196C8010197222301 -:1038F00041F00130110529F02C93DE0131968C0145 -:10390000F1CFDC928C0188E1E80EF11CDFCF21972A -:10391000188285E6DF91CF911F910F91FF90EF9074 -:10392000DF900895FC01809120028068809320023E -:103930008091230280FFFCCF81E080932302A0913D -:103940001002B0911102AE5BB109B7FF02C0A0E056 -:10395000B0E020E038EB4BE050E00E949055AA2701 -:10396000BB279F938F938CED9AE09F938F9382E078 -:103970008F931F92FF93EF930E949B568DB79EB734 -:1039800008968DBF9EBF85E608954EB15FB1209128 -:10399000080430910904242B352B3F932F9326EDF7 -:1039A0003AE03F932F9322E02F931F929F938F93A0 -:1039B0000E949B568DB79EB708968DBF9EBF85E629 -:1039C00008950F931F93CF93DF931F921F92CDB74C -:1039D000DEB78B01E091B12EF091B22E8581893056 -:1039E00009F06FC0E0919E2EF0919F2E199581E015 -:1039F0008093B82C60E270E0C8010E945356009793 -:103A0000F9F4F80101900020E9F73197E01BF10B80 -:103A1000E0FD59C0F695E795E130F10539F487E00E -:103A200090E08093942E9093952E37C053E0EE0F44 -:103A3000FF1F5A95E1F7E093942EF093952E2DC039 -:103A400098012C5F3F4F82179307E9F5A80162E0C8 -:103A500070E0CE0101960E94C00E898190E0982FFF -:103A600088272A81820F911D8093942E9093952E02 -:103A70000B5F1F4FF80101900020E9F73197E01B21 -:103A8000F10BE0FD20C0F695E79533E0EE0FFF1F48 -:103A90003A95E1F7E817F907B0F06091942E70912C -:103AA000952E695F7F4F83E0769567958A95E1F75C -:103AB000A80184E99DE20E94C00E0E94072C8FEFAE -:103AC00003C089EC01C08AEC0F900F90DF91CF9179 -:103AD0001F910F910895EF92FF920F931F93CF9331 -:103AE000DF931F921F92CDB7DEB78B01E091B12E0D -:103AF000F091B22E8581893009F080C0E0919E2E30 -:103B0000F0919F2E199582E08093B82C60E270E0CE -:103B1000C8010E9453567C01892B31F5F8010190B0 -:103B20000020E9F73197E01BF10BE0FD69C0F69545 -:103B3000E795E130F10539F487E090E08093942E29 -:103B40009093952E47C053E0EE0FFF1F5A95E1F773 -:103B5000CF0169E070E00E947C55E81BF90BE0930F -:103B6000942EF093952E36C0C8010496E816F906F7 -:103B700009F046C0A80162E070E0CE0101960E9403 -:103B8000C00E898190E0982F88272A81820F911D8D -:103B90008093942E9093952E8730910529F09C0167 -:103BA00027703327232B61F587010F5F1F4FF80123 -:103BB00001900020E9F73197E01BF10BE0FD20C0F8 -:103BC000F695E79533E0EE0FFF1F3A95E1F7E8171A -:103BD000F907B0F06091942E7091952E695F7F4F38 -:103BE00083E0769567958A95E1F7A80184E99DE2DF -:103BF0000E94C00E0E94072C8FEF03C089EC01C009 -:103C00008AEC0F900F90DF91CF911F910F91FF9051 -:103C1000EF900895E091B12EF091B22E8581893018 -:103C2000A1F4E0919E2EF0919F2E199585E080934E -:103C3000B82C0E9471460E94072C8BE796E4809373 -:103C40006D2C90936E2C8FEF089589EC0895E09180 -:103C5000B12EF091B22E85818930A1F4E0919E2E93 -:103C6000F0919F2E199583E08093B82C0E947146A5 -:103C70000E94072C8BE796E480936D2C90936E2C1A -:103C80008FEF089589EC0895E091B12EF091B22E56 -:103C900085818930A1F4E0919E2EF0919F2E199597 -:103CA00086E08093B82C0E9471460E94072C8BE717 -:103CB00096E480936D2C90936E2C8FEF089589EC91 -:103CC0000895E091B12EF091B22E4085518564E6C1 -:103CD000649F9001659F300D11243F932F9320ED39 -:103CE0003AE03F932F9322E02F931F929F938F935D -:103CF0000E949B568DB79EB708968DBF9EBF85E6E6 -:103D00000895CF93DF931F921F92CDB7DEB7FB01CB -:103D100020812F33B1F42181211113C02EE93AE023 -:103D20003F932F9322E02F931F929F938F930E9494 -:103D30009B560F900F900F900F900F900F9085E66D -:103D40002EC089E592E089839A83CE0101969F93E4 -:103D50008F938AE99AE09F938F937F936F930E944A -:103D6000D1560F900F900F900F900F900F90892BBE -:103D7000A9F069817A816935F2E07F0778F4E091F2 -:103D8000B12EF091B22E60877187CF01885A9E4282 -:103D90008F5F9F4F0E94DC5C84E601C08AEC0F902D -:103DA0000F90DF91CF910895E091B12EF091B22E56 -:103DB00023852F9322852F9327E93AE03F932F9372 -:103DC00022E02F931F929F938F930E949B568DB753 -:103DD0009EB708968DBF9EBF85E60895CF93DF936B -:103DE0001F921F92CDB7DEB7FB0120812F33B1F4B4 -:103DF0002181211113C02FE02F932FEF2F9326E461 -:103E00003AE03F932F9322E02F931F929F938F933B -:103E10000E949B56CDBFDEBF85E630C019821A8254 -:103E2000CE0101969F938F9382E49AE09F938F93A4 -:103E30007F936F930E94D1560F900F900F900F9029 -:103E40000F900F90892BC9F069817A81611590E1FB -:103E5000790798F46093380370933903E091B12E99 -:103E6000F091B22E62877387CF01865A9E428F5F90 -:103E70009F4F0E94DC5C84E601C08AEC0F900F909B -:103E8000DF91CF910895FB0120812F33D9F4218157 -:103E9000211121C01F9220E32F931F9221E32F9322 -:103EA0002CE33AE03F932F9322E02F931F929F93AE -:103EB0008F930E949B568DB79EB70A968DBF9EBF6B -:103EC00085E60895213311F4E9D303C0203319F4B2 -:103ED0000BD484E608958AEC0895FC0180910008D3 -:103EE000813029F480918C0891E0833009F090E0D2 -:103EF00090FF02C081E301C080E38083118285E6E8 -:103F00000895E091B12EF091B22E85818930A1F40F -:103F1000E0919E2EF0919F2E199584E08093B82C0D -:103F20000E9471460E94072C8BE796E480936D2CCB -:103F300090936E2C8FEF089589EC089589E00E948C -:103F4000F80DE0919E2EF0919F2E199587E08093B9 -:103F5000B82C0E9471460E94072C8BE796E4809350 -:103F60006D2C90936E2C8FEF089521E020936C2C94 -:103F700020936B2C2CE32093692C25E030E02093D8 -:103F8000672C3093682C1092612C1092622C109246 -:103F9000632C1092642C80935F2C9093602C089576 -:103FA00027E020936C2C2CE231E02093672C309397 -:103FB000682C1092612C1092622C1092632C10923B -:103FC000642C80935F2C9093602C0895CF939091F4 -:103FD0006C2C953009F441C030F4933019F130F570 -:103FE000913068F43EC1973009F4AAC008F44AC081 -:103FF000983009F4ACC0993009F495C032C18130D1 -:1040000031F41092652C1092662C83E023C084302A -:1040100011F466E084C0883109F485C08B3109F061 -:1040200084C081C080936A2C84E014C090E04091E9 -:104030006A2C2FEF30E0241B31098217930721F4FB -:1040400085E008C0891779F165E183E090E20E947C -:10405000065482E080936C2C68C02091652C3091CE -:10406000662CA9014F5F5F4F4093652C5093662CDF -:10407000F901ED5EF04D80834038510509F055C0DF -:1040800086E0E8CF20916A2C90916B2C29134FC0C9 -:10409000E3E1FFE223E93FE290E02E173F0791F2D0 -:1040A0004191940FFACF4091612C5091622C609114 -:1040B000632C7091642CE0915F2CF091602C20E8CF -:1040C00030E083E19FE21995C82F882311F1809198 -:1040D0006B2C8F5F80936B2C8091612C9091622C64 -:1040E000A091632CB091642C80589F4FAF4FBF4F6D -:1040F0008093612C9093622CA093632CB093642CDA -:1041000066E083E090E20E94065482E080936C2C8B -:10411000A9C068E183E090E20E94065468E183E070 -:1041200090E20E94065410926C2CC1E09BC030E0DB -:10413000892F90E001972817390781F766E085CF2E -:10414000853119F410926B2C08C08B3161F38831E2 -:1041500009F45FCF863009F05AC080916B2C8F5FD5 -:1041600080936B2C4091612C5091622C6091632C58 -:104170007091642CE0915F2CF091602C20E830E08D -:1041800083E19FE21995C82F8823D1F161E083E094 -:1041900090E20E94065460916B2C83E090E20E94B2 -:1041A000065460916B2C609583E090E20E94065467 -:1041B00060E870E083E19FE261D8E3E1FFE260E064 -:1041C0008FE2E339F80719F08191680FF9CF83E0A6 -:1041D00090E20E9406548091612C9091622CA091F3 -:1041E000632CB091642C80589F4FAF4FBF4F80938A -:1041F000612C9093622CA093632CB093642C32C0FA -:1042000064E083E090E20E94065489E023CF853188 -:1042100009F08BCF61E083E090E20E940654609148 -:104220006B2C83E090E20E94065460916B2C6095A9 -:1042300083E090E20E94065460E870E083E19FE230 -:104240001DD8E3E1FFE283E99FE260E08E179F075C -:1042500019F02191620FFACF83E090E20E94065498 -:1042600064CFC0E08C2FCF91089580916C2C813069 -:1042700019F0873029F108958091672C9091682C6E -:104280009C01215031092093672C3093682C892B95 -:1042900031F58091692C9FEF980F9093692C8823BA -:1042A00031F065E183E090E20E94065402C0109272 -:1042B0006C2C85E090E08093672C9093682C089597 -:1042C0008091672C9091682C9C012150310920939A -:1042D000672C3093682C892B11F410926C2C089564 -:1042E000ECEEFBE020E030E09491981309C041E24D -:1042F000429FC001439F900D11248351944F089514 -:104300002F5F3F4FB1962930310571F780E090E083 -:104310000895262FBA012F3311F4469607C02D3386 -:1043200011F4449611C021110CC04096FC01259156 -:1043300034912115310521F183E19FE2F9011995AD -:104340000DC02032E9F44296FC01259134912115EB -:104350003105B1F083E19FE2F90119958F3F89F4AE -:1043600091E09093712C4EB15FB12091080430918F -:104370000904242B352B20936F2C3093702C089537 -:1043800089EC08950F931F93CF93DF938C01C5E1C0 -:10439000DDE0BE01C8010E940D56892B49F440E0C2 -:1043A00050E060E0CE01DF91CF911F910F91B1CF2E -:1043B000689680E1C53DD80761F7DF91CF911F91E5 -:1043C0000F910895EF92FF921F93CF93DF93982F51 -:1043D0009F7D91549A3160F090ED980F9A3040F0A3 -:1043E0008F3531F0982F9D7F9D3311F08032D1F4BD -:1043F0009FE9980F9A3108F480522091722C3091E5 -:10440000732C2F3F91E0390708F07FC0A9014F5F5F -:104410005F4F4093722C5093732CF901ED5EF04D79 -:10442000808373C08D3009F040C0E091722CF09110 -:10443000732CED5EF04D10821092722C1092732C42 -:104440008091712C811161C08091132F982F9F7DD5 -:1044500009F440C08D7F8D33E9F1E3E1FFE27F0194 -:104460001191112331F01F3321F01D3311F010325F -:10447000B1F7F7011082C5E1DDE0BE0183E19FE203 -:104480000E940D56892B59F41092132FA7014F5FEC -:104490005F4F612FCE013DDF8F3FB9F124C0689699 -:1044A000F0E1C53DDF0749F715C0883061F4809120 -:1044B000722C9091732C009741F101978093722C8C -:1044C0009093732C22C08B3101F51092722C1092B4 -:1044D000732C1BC088EC04DF0E942D1989EE9BE031 -:1044E0000E942D1912C0FCDE0E942D1989EE9BE05E -:1044F0000E942D198091132F882339F083E19FE2C8 -:104500000E94281986EE9BE0EBCF81E0DF91CF91EE -:104510001F91FF90EF9008958091712C882399F15D -:10452000E091B12EF091B22E208531852115310513 -:1045300051F14EB15FB18091080490910904842B30 -:10454000952B40916F2C5091702C841B950B64E639 -:1045500070E00E947C5562177307A8F01092712CCE -:104560008BECBEDE0E942D1983EE9BE00E942D197C -:10457000E0916D2CF0916E2C309729F019951092E6 -:104580006D2C10926E2C08958091712C8823A9F0C7 -:104590001092712C8BECA4DE0E942D1983EE9BE00F -:1045A0000E942D19E0916D2CF0916E2C309729F01E -:1045B000199510926D2C10926E2C0895CF93DF9365 -:1045C0009091712C9923A9F0EB011092712C88DE47 -:1045D0000E942D1980EE9BE00E942D19209749F032 -:1045E000CE010E9428198DED9BE0DF91CF910C94B4 -:1045F0002D19DF91CF910895EF92FF920F931F93A2 -:10460000CF937C019B01613081E0780710F020E0BE -:1046100031E08B01021B130BA70160E072E083E124 -:104620009FE20E94950E83E19FE20E942819C1E05B -:10463000013081E01807A8F01A954C2F50E0542F54 -:1046400044274E0D5F1D20E032E060E072E083E120 -:104650009FE20E94950E83E19FE20E942819CF5F9E -:10466000E7CF0115110589F04C2F50E0542F442756 -:104670004E0D5F1D980160E072E083E19FE20E94B1 -:10468000950E83E19FE20E9428198AED9BE0CF916D -:104690001F910F91FF90EF900C942D1980910008BD -:1046A000813021F490918C08933009F080E080FDF6 -:1046B0001AC08091762C811116C081E08093000889 -:1046C00093E090938C088093742C1092752C2EB1EB -:1046D0003FB18091080490910904822B932B809321 -:1046E0007B2C90937C2C089510928C0810920008DB -:1046F000E4E7FCE21082118208959091742C9923D2 -:10470000F1F08091752C811115C02091742C222319 -:10471000B9F04EB15FB12091080430910904242B07 -:10472000352B40917B2C50917C2C241B350B26344F -:10473000310530F081E08093752C892F089581E058 -:104740000895CF93C091762CCC23C1F02EB13FB108 -:104750008091080490910904822B932B2091792C4D -:1047600030917A2C821B930B2091772C3091782CEE -:104770008217930718F01092762C90DF8C2FCF9130 -:104780000895E091B12EF091B22E828793878093A5 -:104790003803909339030895E091B12EF091B22E31 -:1047A0008285938540968287938780933803909380 -:1047B0003903828593850895E091B12EF091B22E50 -:1047C00080E991E08287938780933803909339033F -:1047D0000895A0E2B6E081E015968C93159723E149 -:1047E00031E328B939B923E931E32AB93BB910B823 -:1047F00013B812B816B817B811B8E0E0F9E010A273 -:1048000011A22FEF30E026A337A32FEF3FEF20A711 -:1048100031A7808388E8838380E1848783E087836E -:104820001C968C931C9782E01A968C9308951F9285 -:104830000F920FB60F92112408B60F9218BE0BB646 -:104840000F921BBE8F939F93EF93FF93E0E0F9E0ED -:1048500013828FE790E086AB97AB81E190E080AF69 -:1048600091AFE0E0FAE010A211A28FEF9FEF86A3D4 -:1048700097A389E88383168281E084878EE0808312 -:1048800010922A06FF91EF919F918F910F900BBE8E -:104890000F9008BE0F900FBE0F901F9018951F929B -:1048A0000F920FB60F92112408B60F9218BE0BB6D6 -:1048B0000F921BBE2F933F938F939F93EF93FF9382 -:1048C0002091280693B1267081E009F080E0990FCD -:1048D000892B83B982B1882309F463C012B883B1EC -:1048E0008770873059F51092000980E180930C0998 -:1048F0001092030A1B9B03C08CEA94E002C08CE672 -:1049000094E08093260A9093270A82E081B981E09F -:1049100080930C0A83E08093060A86B197B1877072 -:1049200049F090B18F5F893011F09695FBCFE8B1D7 -:10493000F9B1908381E080937D2C36C083B1982FAC -:104940009C7091F1847091B191111CC020B1269599 -:10495000882311F080E001C080E8282B20B986B1BF -:1049600097B1019686B997B987709927892BE1F499 -:10497000E8B1F9B1CF01019688B999B9208381E0F6 -:1049800081B912C091B1913079F4EAB1FBB19F01C4 -:104990002F5F3F4F2AB93BB9811190E0908311B846 -:1049A00003C082B1809582B988E880930309FF91A2 -:1049B000EF919F918F913F912F910F900BBE0F9090 -:1049C00008BE0F900FBE0F901F9018951F920F9268 -:1049D0000FB60F92112408B60F9218BE0BB60F92A5 -:1049E0001BBE2F933F938F939F93EF93FF9381B1C0 -:1049F000823008F49DC081B18D3008F099C0E1B1DA -:104A0000F0E0EE0FFF1FEC5DFF4D0190F081E02D17 -:104A100019948FE790E08093260A9093270A88C024 -:104A20008E9A8EE0809340088FE390E08093260A70 -:104A30009093270A85E06FC08E9886E081B98FEF4A -:104A400082B914B815B8E8B1F9B1808180B970C0E5 -:104A5000009B05C08E9A82B1809582B901C08E9864 -:104A600087E059C0009B02C08E9801C08E9A80B129 -:104A7000869580B984B195B1019684B995B984B110 -:104A800095B187709927892B11F488E044C024B12F -:104A900035B186B197B128173907B1F52BC0EAB106 -:104AA000FBB1309711F0808101C082B1882311F0F1 -:104AB0008E9A01C08E9889E02EC0EAB1FBB1309782 -:104AC00051F08081882311F08E9801C08E9A319622 -:104AD000EAB9FBB908C082B1882311F08E9801C0F1 -:104AE0008E9A8FEF82B924B135B186B197B128176C -:104AF000390711F48AE00FC0E8B1F9B1CF0101968E -:104B000088B999B9818180B986E005C08E988BE01B -:104B100002C08E988CE081B90BC01092000A1092EE -:104B2000060A109240081092410881E080937E2C82 -:104B3000FF91EF919F918F913F912F910F900BBE1D -:104B40000F9008BE0F900FBE0F901F901895CF9337 -:104B5000DF93EDE7FCE210821182E0E4F6E0128AD6 -:104B600084E08283C0E8D1E082E68E83A0E2B6E0F2 -:104B700081E016968C93169711968C93119796E078 -:104B800012969C93129751968C93519742E05296AD -:104B90004C9352971A961C921A9733E019963C93AD -:104BA00099E598839AE5998390E491839683A0EBA5 -:104BB000B0E012962C911297207F12962C931297A8 -:104BC00012962C911297226012962C9320E3218347 -:104BD0002683908B868345833183E0E0F8E083E190 -:104BE000818321E030E026A337A320A731A7E0E8A6 -:104BF000F8E014868083E0E2F3E01382118288E01B -:104C0000828391E19083A091B12EB091B22E1A9639 -:104C10002D913C911B97208F318FE0E8F3E09CE3CE -:104C20009283808393838183DF91CF91D2CDA0E261 -:104C3000B6E01A961C921A97EDE7FCE210821182F8 -:104C4000E0E0F9E010821382178280E18487E0E0DF -:104C5000FAE010821382168281E08487E0E4F8E0B3 -:104C60001082118216968C938E980895CF93DF93BD -:104C700080917D2C882309F47EC010927D2CC6B1D2 -:104C8000D7B1C730D10508F471C0AE01495F5F4F9D -:104C900093E0569547959A95E1F7E091AE2EF09105 -:104CA000AF2E63E171E380E41995E091B12EF091AC -:104CB000B22E8781883019F483E180935B2C868142 -:104CC000883019F483E180935A2CE091A42EF0915E -:104CD000A52EBE0183E191E31995EC0194FF06C076 -:104CE000DF7E83E991E38AB99BB902C01AB81BB889 -:104CF0002097E1F1AE01495F5F4F83E056954795FC -:104D00008A95E1F7E091AE2EF091AF2E63E171E369 -:104D100081E41995E091B12EF091B22E878189300E -:104D200019F483E180935B2C8681893019F483E147 -:104D300080935A2CC6B9D7B983E191E388B999B960 -:104D400010926008109261088FE090E080936608EE -:104D50009093670888E090E080936A0890936B08CE -:104D600083E28093410883E081B905C01092000A74 -:104D70001092060A2EDD80917E2C882329F0109255 -:104D80007E2CDF91CF9125CDDF91CF910895CF93E8 -:104D9000DF93E0E4F6E0128A84E08283C0E8D1E0A9 -:104DA00082E68E83A0E2B6E081E016968C93169799 -:104DB00011968C93119796E012969C9312975196A8 -:104DC0008C93519742E052964C9352971A961C92AC -:104DD0001A9733E019963C93199799E598839AE5C9 -:104DE000998390E491839683C0EBD0E02A81207F61 -:104DF0002A832A8122602A8320E321832683908BC1 -:104E0000868345833183E0E0F8E093E1918321E0FC -:104E100030E026A337A320A731A7E0E8F8E0148606 -:104E20009083E0E2F3E01382118298E0928321E123 -:104E30002083C091B12ED091B22E2A853B85208F40 -:104E4000318FE0E8F3E02CE3228390832383918386 -:104E500015968C93E0E0F9E02FEF30E026A337A31E -:104E600012A613A614A615A6108216821782808396 -:104E70001092000A10927F2CE2E8FCE2108212826B -:104E80001182DF91CF91089581E0809326062CDC7A -:104E9000E0E0F9E010821782E0E0FAE01082178289 -:104EA000E2E8FCE211821282108208951F920F92B2 -:104EB0000FB60F92112408B60F9218BE0BB60F92C0 -:104EC0001BBE2F933F938F939F93EF93FF93E0E04D -:104ED000F9E080E484871782E0E8F3E082E08783EA -:104EE00089EB818383E191E38AB99BB981E090E00A -:104EF00084B995B916B82EB13FB18091080490914C -:104F00000904822B932B8093802C9093812C81E039 -:104F10008093842C18B817B810927F2C88E0809367 -:104F20008706FF91EF919F918F913F912F910F9065 -:104F30000BBE0F9008BE0F900FBE0F901F901895DC -:104F4000E0E0F9E08FEF94E086A397A380E6848702 -:104F500080E387838FEF90E086AB97AB88E0809308 -:104F6000870608951F920F920FB60F92112408B66C -:104F70000F9218BE0BB60F921BBE2F933F934F9309 -:104F80005F938F939F93EF93FF931092070A109272 -:104F9000000A1092470910924009809181038E7F88 -:104FA0008093810384B195B180FF1AC0379B03C001 -:104FB00086B1869503C086B18695806886B984B12E -:104FC00095B1019684B995B987709927892B41F4D9 -:104FD000EAB1FBB1CF0101968AB99BB986B1808352 -:104FE00084B195B187709927892BC9F0E4B1F5B1E7 -:104FF00086B144B155B193E0F695E7959A95E1F7FE -:10500000ED5EFE4C90E04770552728E030E0241B11 -:10501000350B02C0959587952A95E2F7808381E04C -:105020008093832C1092842C8FEF9FEF8093260A1D -:105030009093270A1092200A1092210A1092060AD1 -:105040001092070A1092030A84E08093000A83E01A -:1050500080937F2CFF91EF919F918F915F914F9162 -:105060003F912F910F900BBE0F9008BE0F900FBE77 -:105070000F901F9018951F920F920FB60F92112448 -:1050800008B60F9218BE0BB60F921BBE8F93EF930C -:10509000FF93E0E8F3E081818F7C8183E0E0FAE038 -:1050A00088E8838381E08083FF91EF918F910F9057 -:1050B0000BBE0F9008BE0F900FBE0F901F9018955B -:1050C0001F920F920FB60F92112408B60F9218BEBE -:1050D0000BB60F921BBE8F939F93EF93FF9380911C -:1050E0006009109260091092610993E09093400961 -:1050F000813520F4813308F472C01BC08137E8F495 -:1051000084B195B180FF2EC086B18695806886B93E -:1051100084B195B1019684B995B987709927892B87 -:1051200041F4EAB1FBB1CF0101968AB99BB986B1CE -:10513000808386B1869580682CC086B1869580680C -:1051400086B984B195B1019684B995B987709927CC -:10515000892B41F4EAB1FBB1CF0101968AB99BB921 -:1051600086B1808386B18695806886B984B195B111 -:10517000019684B995B987709927892B41F4EAB1D2 -:10518000FBB1CF0101968AB99BB986B1808386B104 -:10519000869586B984B195B1019684B995B9877021 -:1051A0009927892B41F4EAB1FBB1CF0101968AB965 -:1051B0009BB986B1808386B1869586B984B195B155 -:1051C000019684B995B987709927892B41F4EAB182 -:1051D000FBB1CF0101968AB99BB986B18083FF915B -:1051E000EF919F918F910F900BBE0F9008BE0F9083 -:1051F0000FBE0F901F9018950F931F93CF93DF93BF -:10520000CDB7DEB7DA95CDBFDEBF8091842C882381 -:1052100009F483C04EB15FB18091080490910904F4 -:105220002091802C3091812C842B952B821B930B09 -:1052300020911E2030911F202F5F3F4F28173907E4 -:1052400008F06BC01092070A1092000A10924709EA -:1052500010924009809181038E7F8093810384B1F5 -:1052600095B180FF1AC0379B03C086B1869503C0F5 -:1052700086B18695806886B984B195B1019684B966 -:1052800095B987709927892B41F4EAB1FBB1CF0119 -:1052900001968AB99BB986B1808384B195B1877034 -:1052A0009927892BC9F0E4B1F5B186B144B155B164 -:1052B00013E0F695E7951A95E1F7ED5EFE4C90E068 -:1052C0004770552728E030E0241B350B02C0959528 -:1052D00087952A95E2F7808381E08093832C109252 -:1052E000842C2FEF3FEF2093260A3093270A109249 -:1052F000200A1092210A1092060A1092070A1092B0 -:10530000030A94E09093000A93E090937F2C14B8E2 -:1053100015B88093832C1092842C13DA81116FC2FC -:10532000ECD9882309F46BC28091842C811167C267 -:105330008091822C811105C08091832C882309F4EF -:105340005EC280917F2C833041F48091200A90913D -:10535000210A8532914008F452C28091832C88231F -:1053600009F4A2C084B195B1892B09F49DC084B120 -:1053700095B1089718F414B815B896C044B155B152 -:10538000495F5F4FB3E056954795BA95E1F763E102 -:1053900071E3CE0101960E94325683E191E38AB90E -:1053A0009BB944B155B114B815B8898186958695D5 -:1053B000898322E030E024173507B0F5F901A3E036 -:1053C000F695E795AA95E1F781E090E08C0F9D1F97 -:1053D000E80FF91F8081982F96959695908383709A -:1053E000813049F030F08230D1F486B18695806802 -:1053F00004C081E015C086B1869586B984B195B1A7 -:10540000019684B995B987709927892B41F4EAB13F -:10541000FBB1CF0101968AB99BB986B1808380E048 -:105420002E5F3F4F882339F284B195B18770992759 -:10543000892BC9F0E4B1F5B186B144B155B173E03F -:10544000F695E7957A95E1F7ED5EFE4C90E04770B2 -:10545000552728E030E0241B350B02C09595879531 -:105460002A95E2F78083E091B12EF091B22E8781E8 -:10547000883019F483E180935B2C8681883019F49D -:1054800083E180935A2C44B155B1495F5F4F63E08B -:10549000569547956A95E1F7E091AE2EF091AF2EC3 -:1054A00063E171E382E419951092822C1092832CAF -:1054B00064B175B1E091A42EF091A52E83E191E342 -:1054C000199584B995B984B195B1892B09F497C11F -:1054D00089E8809381031092000A1092200A1092AA -:1054E000210A2FEF3FEF2093260A3093270A8FE5FA -:1054F00090E08093280A9093290A1092060A80E18E -:1055000080930C0A93E09093070A1092600910921E -:105510006109209366093093670920EA30E02093FF -:105520006809309369091092460980934C0981E01B -:105530008093470981E18093800110928801109245 -:10554000800310922906E091B12EF091B22E87814E -:10555000893019F483E180935B2C8681893019F4BA -:1055600083E180935A2C44B155B1495F5F4F33E0DA -:10557000569547953A95E1F7E091AE2EF091AF2E12 -:1055800063E171E383E4199504B115B1013094E04E -:10559000190708F024C114B815B8A801495F5F4F76 -:1055A00023E0569547952A95E1F763E171E383E996 -:1055B00091E30E94325683E191E38AB99BB986B1A7 -:1055C0008695806886B984B195B1019684B995B9FC -:1055D00087709927892B39F484E191E38AB99BB9C3 -:1055E00086B18093133186B1869586B984B195B121 -:1055F000019684B995B987709927892B41F4EAB14E -:10560000FBB1CF0101968AB99BB986B1808380E056 -:1056100041E050E0E3E9F1E30417150708F495C011 -:10562000908190FF2BC086B1869586B984B195B1E3 -:10563000019684B995B987709927892B41F4AAB14D -:10564000BBB1CD0101968AB99BB986B18C9386B165 -:105650008695806886B984B195B1019684B995B96B -:1056600087709927892B09F063C0AAB1BBB1CD011E -:1056700001968AB99BB986B18C935AC0882351F19F -:1056800086B1869586B984B195B1019684B995B9EC -:1056900087709927892B41F4AAB1BBB1CD0101963E -:1056A0008AB99BB986B18C9386B1869586B984B147 -:1056B00095B1019684B995B987709927892B41F4E2 -:1056C000AAB1BBB1CD0101968AB99BB986B18C93C1 -:1056D00080E02FC096B19695906896B924B135B107 -:1056E0002F5F3F4F24B935B927703327232B49F457 -:1056F000AAB1BBB19D012F5F3F4F2AB93BB996B10B -:105700009C9396B1969596B924B135B12F5F3F4FD2 -:1057100024B935B927703327232BD1F6AAB1BBB1F1 -:105720009D012F5F3F4F2AB93BB996B19C9301C0B1 -:1057300081E09081969590839A0127703327232BDF -:1057400009F431964F5F5F4F67CF811129C086B151 -:105750008695806886B984B195B1019684B995B96A -:1057600087709927892B41F4EAB1FBB1CF010196EB -:105770008AB99BB986B1808386B1869586B984B192 -:1057800095B1019684B995B987709927892B41F411 -:10579000EAB1FBB1CF0101968AB99BB986B180838A -:1057A00084B195B187709927892BC9F0E4B1F5B11F -:1057B00086B144B155B193E0F695E7959A95E1F736 -:1057C000ED5EFE4C90E04770552728E030E0241B4A -:1057D000350B02C0959587952A95E2F7808381E085 -:1057E00080937F2C83E191E38AB99BB980E2809317 -:1057F0000C098CE08093070985E58A95F1F7D3952C -:10580000CDBFDEBFDF91CF911F910F91089514B8E6 -:1058100015B881E08093822C0C944E231092070AD5 -:105820001092000A1092470910924009809181035A -:105830008E7F8093810384B195B180FF1AC0379B1E -:1058400003C086B1869503C086B18695806886B907 -:1058500084B195B1019684B995B987709927892B40 -:1058600041F4EAB1FBB1CF0101968AB99BB986B187 -:10587000808384B195B187709927892BC9F0E4B1F1 -:10588000F5B186B144B155B193E0F695E7959A9597 -:10589000E1F7ED5EFE4C90E04770552728E030E0E0 -:1058A000241B350B02C0959587952A95E2F78083D6 -:1058B00081E08093832C1092842C8FEF9FEF809354 -:1058C000260A9093270A1092200A1092210A109219 -:1058D000060A1092070A1092030A84E08093000AD5 -:1058E00083E080937F2C10927F2C1092832C109257 -:1058F000822C0C947423982F80918D2C882359F03E -:105900008091872C811108C081E02091862C92170C -:1059100018F080E0089581E00895FF920F931F939F -:10592000CF93DF931F92CDB7DEB700918A2C000F83 -:10593000000F0051FF24F394F0928D2C10E0B80179 -:105940006D5F7F4F41E050E086E89CE20E942A0FA5 -:10595000B8016C5F7F4F41E050E0CE0101960E949C -:105960002A0F8981881F8827881F8093852CF092B1 -:105970008C2C10928B2C1092872C1092892C0F90CB -:10598000DF91CF911F910F91FF90089510928D2C70 -:1059900080E180938A2C8FEF8093862C1092852C47 -:1059A00081E080938C2C10928B2C1092872C10927B -:1059B000892C089584E180938A2CAFCF89E280936B -:1059C0008A2CABCF81E080938C2C089508958F9220 -:1059D0009F92AF92BF92CF92DF92EF92FF920F937E -:1059E0001F93CF93DF9300D01F92CDB7DEB78C010A -:1059F000FC01808190918C2C9230E1F028F0933062 -:105A000011F1943051F14EC0292F2095217020932F -:105A10008B2C992311F0863219F0823509F042C09F -:105A200084E4F8018083118282E080938C2C80E1F1 -:105A300090E0DBC290918B2C911102C08632B1F0C4 -:105A4000823599F513C090918B2C911102C086324A -:105A500069F0823509F05BC009C090918B2C9111DF -:105A600002C0863219F0823509F0F3C084E4F801EF -:105A70008083118281E0892713C08091892C811154 -:105A8000FCC0F8018081803509F476C108F006C1B8 -:105A9000803309F409C190918D2C911174C181E07A -:105AA00080938C2C80E090E0A0C28339C1F71982EA -:105AB0001A821B821C8288E8898343E050E060E000 -:105AC00070E0CE0102960E942A0FF8018181803297 -:105AD00009F4ABC0803709F047C0F8019281898191 -:105AE0009813B2C093818A819813AEC094818B8140 -:105AF0009813AAC095818C819813A6C084E08083F6 -:105B000061E070E0C8010E94BF3783E029C0853999 -:105B100031F644E050E064E070E0CE0101960E946E -:105B20002A0FF8018181803209F47FC08037E1F4C7 -:105B3000F80192818981981387C093818A81981393 -:105B400083C094818B8198137FC095818C81981339 -:105B50007BC0108261E070E0C8010E94BF3784E022 -:105B600080938C2C38E171C0E82EE294AFE0EA22F9 -:105B7000EA94EA948F70F82E88E090E08F199109EA -:105B80002FEF30E0690102C0D594C7948A95E2F7FF -:105B9000F5E0EF1629F024E0E2122AC0FF20E1F040 -:105BA00044E050E0B8016E5F7F4FCE0101960E9445 -:105BB0002556892B61F499818A8189279B818927C0 -:105BC0009C818927F801968189278C2171F1F4E065 -:105BD000EF120EC0F11038C044E050E0B8016E5F23 -:105BE0007F4FCE0101960E942556892BF1F02CC0E3 -:105BF00023E02E1548F1F12CA701B8016E5F7F4F0D -:105C0000CE0101960E942556892BF1F4D801AE0DE4 -:105C1000BF1DE1E0F0E0EC0FFD1FEE0DFF1D129641 -:105C20009C9180818927C82279F43981F8013083D9 -:105C30002A8121839B8192838C81838323279227CE -:105C40008927848338E201C030E020E0832F922F3F -:105C5000CCC1695F7F4F83E0769567958A95E1F7C0 -:105C60006330710508F41BCF62507109C8010E94AE -:105C7000EA37811102CF81E092C11092892C809184 -:105C8000AD2E81118BC16091882CF4E06F9FB00123 -:105C9000112444E050E0C80102967EC1803A09F424 -:105CA00055C0823AC1F1F7CEF801F18080918D2C78 -:105CB000882359F08091852C882339F08091872C96 -:105CC000811103C0E090862C02C0E0908A2CFE1463 -:105CD00010F0F80131C1C12CD12CF4E0FF9EB001CD -:105CE000112444E050E0C8018C0D9D1D0E942A0F34 -:105CF000F394EF1001C0F12C24E0C20ED11C80E11E -:105D0000C816D10451F760E170E0C8010E94BF37A6 -:105D100080E990E06AC1F801F180F1E0FF15C8F672 -:105D200080918A2CF816A8F68F2DE5DD882309F4DA -:105D3000C2C0C80102962091AD2E21112FC1F4E0FE -:105D4000FF9EB001112444E050E026C1F801F1802B -:105D5000F1E0FF1508F0BDCF80918A2CF81608F00D -:105D6000B8CF8F2DC8DD882309F4A5C0F092882C08 -:105D700081E08093892C12C1F80181818111A9CF22 -:105D800010928C2C8FCE8C3309F40EC148F48933D9 -:105D900009F4A6C08A3391F18B3109F080CE6AC034 -:105DA0008B3409F40FC138F48E3309F078CE8DEBC3 -:105DB000F801808314C1803621F0853A09F4ABC024 -:105DC0006ECEF801108284E0818383E0828381E0DB -:105DD00083838483158280918A2C843111F08EE034 -:105DE00001C08BE0F801868383E0878368E070E080 -:105DF000C8010E94BF3780E590E0F7C0F801D1806C -:105E0000E280ED1408F465CF80918A2CD81608F052 -:105E100060CFE81608F05DCF8091852C882351F083 -:105E20008D2D69DD882309F446C08E2D64DD88231D -:105E300009F441C0F12C6D2D70E0E61AF70AFFEF6E -:105E4000EF1AFF0AEE0CFF1CEE0CFF1C660F771F0B -:105E5000660F771FA701C8010E942A0FB701C8016A -:105E60000E94BF37C7010296F3E0880F991FFA9589 -:105E7000E1F7BBC060918A2C660F660F6051E62E79 -:105E8000F12CB701685F7F4F44E050E0CE010196EE -:105E90000E942A0F9981F801818198130CC09A8180 -:105EA0008281981308C09B818381981304C09C81D0 -:105EB0008481981711F086E072C081E08093872C6E -:105EC000B701645F7F4F42E050E0C8010E942A0F93 -:105ED00062E070E0C8010E94BF3780E290E085C0B8 -:105EE000F8016181633008F0F4CE80918A2C70E073 -:105EF000680F711D660F771F660F771F43E050E034 -:105F0000C8010E942A0F63E070E0C8010E94BF37F9 -:105F100088E290E06AC0F8012181E22EF12C9E2DEA -:105F20008827856A092E000CAA0BBB0B32814C0115 -:105F30005D01A32A233010F0108233C080918A2C97 -:105F4000B701680F711D660F771F660F771F44E05A -:105F500050E0CE0101960E942A0F89819A81AB817F -:105F6000BC81880D991DAA1DBB1D89839A83AB83B3 -:105F7000BC830097A105B14010F084E010C080916F -:105F80008A2CB701680F711D660F771F660F771F88 -:105F900044E050E0CE0101960E94780F8AE0F801BB -:105FA000808384E090E021C040E250E06AEC70E041 -:105FB000C8010E944C5660E270E0C801E0D780E161 -:105FC00091E013C060918A2C660F660F605170E0FB -:105FD0006B5F7F4F41E050E0C8010E942A0F61E0F3 -:105FE00070E0C801CCD788E190E02496CDBFDEBF39 -:105FF000DF91CF911F910F91FF90EF90DF90CF90A5 -:10600000BF90AF909F908F900895CF93DF93EC0156 -:1060100043E050E060E070E00E942A0F44E050E06E -:1060200064E070E0CE010396DF91CF910C942A0FCB -:106030000F931F93CF93DF931F921F92CDB7DEB7BD -:106040008C01FC0190818181892798E889279281C0 -:1060500089278A83938184818927958189279681DD -:106060008927898343E050E060E070E0C8010E9426 -:10607000780F41E050E063E070E0CE0102960E94AC -:10608000780F44E050E064E070E0C80103960E949D -:10609000780F41E050E068E070E0CE0101960E9488 -:1060A000780F0F900F90DF91CF911F910F9108956E -:1060B00081E08093B12C84E090E08093902C9093C9 -:1060C000912C88E080938F2C10928E2C089581E083 -:1060D0008093B12C84E490E08093902C9093912C49 -:1060E00088E080938F2C10928E2C089581E080930D -:1060F000B12C82E090E08093902C9093912C88E1D9 -:1061000080938F2C10928E2C089581E08093B12C77 -:1061100082E490E08093902C9093912C88E180937E -:106120008F2C10928E2C089581E08093B12C0895CD -:1061300008958F929F92AF92BF92CF92DF92EF928B -:10614000FF920F931F93CF93DF93CDB7DEB7629784 -:10615000CDBFDEBF8C015B018091B12C6730710532 -:1061600001F5F8019081882311F0963211F09235F3 -:10617000C1F421E0811120E020938E2C882311F0BE -:10618000963211F0923559F49091902C8091912C87 -:10619000F801908381838FEF8093922C37C0A12CDC -:1061A000B12C853009F497C050F48230A1F1C8F0C9 -:1061B000833009F468C0843009F481C0ACC58830EC -:1061C00009F41CC138F4863009F491C0873009F411 -:1061D000CAC0A1C5893009F441C38D3008F463C336 -:1061E0009AC5982F9095917090938E2CF80190817C -:1061F000882311F0963219F0923509F006C4909177 -:10620000902C8091912CF8019083818384E080937D -:10621000B12C80E181C5F8018081982F9D7F913458 -:1062200019F48AE080835AC38033C1F462E070E0DD -:10623000C801D0D6882309F494C0F8016181F0E147 -:106240006F9FB001112440E150E0C8010E942A0F65 -:1062500060E170E0C80193D680E95EC5803A79F4C8 -:1062600062E070E0C801B6D6882309F47AC0F8016C -:1062700081818093A82C83E08093B12CD2CF80358C -:1062800009F049C54AC060E170E0C801A3D688237F -:1062900089F08091AD2E81110BC06091A82CF0E1A6 -:1062A0006F9FB001112440E150E0C8010E94780FB7 -:1062B0008AE001C081E0F801808382E00DC3909103 -:1062C0008E2CF8018081911102C08632D1F0823586 -:1062D00009F0A3C316C090918E2CF8018081911112 -:1062E00002C0863271F0823509F045C40AC090912F -:1062F0008E2CF8018081911102C0863211F0823516 -:1063000051F42091902C8091912CF801208381836D -:1063100081E0892777C38035C9F4F801818188231A -:1063200019F0F8011082DAC262E070E0C80152D6BA -:106330008823B9F0E091AE2EF091AF2E40E060E0FE -:1063400070E081E919951092B12CE5C490EA980F9C -:10635000923008F0B4C462E070E0C8013BD681110D -:10636000DDC481E04FC2C8010E94733D64E0780142 -:10637000F4E0EF0EF11CC7010E948F40E091AE2EB9 -:10638000F091AF2E44E0B70180EA1995F8019481AD -:106390008091A92C981329C095818091AA2C9813DB -:1063A00024C096818091AB2C98131FC09781809157 -:1063B000AC2C98131AC08091AD2C80838091AE2CA8 -:1063C00081838091AF2C82838091B02C838364E0A1 -:1063D000C8010E94A842E091AE2EF091AF2E44E099 -:1063E000B80181EA199588E004C2E091AE2EF091DF -:1063F000AF2E44E069EA7CE280EC2DC2F801808196 -:10640000803551F48181811107C08281873521F463 -:1064100083818D3C09F405C264E0C8010E948F406D -:10642000F8018081803309F0BDC062E070E0C801EE -:10643000D1D5882309F4A7C0F801618167FD04C0A4 -:10644000862F8370833029F0862F8F708F3009F06C -:106450007FC06093A82C8091932C9091942C3091C4 -:10646000952C282F22952095492F4227407F09F00F -:106470003FC023272F70E1F5929590959327907F49 -:10648000B9F5262F67FD02C0237003C02F7009F0F5 -:1064900023E08095432F42954F702223B1F090E086 -:1064A000022E02C0959587950A94E2F7E32FF0E05B -:1064B000022E02C0F595E7950A94E2F73E2F50E0D0 -:1064C00002C0559547952A95E2F740FBCC24C0F8C9 -:1064D000D12CF601EE0FFF1FEE0FFF1F30FBEE2455 -:1064E000E0F8F12CEE0CFF1CEE298170E82B01C0C6 -:1064F000E7E0F0E08091A72CEE0FFF1FE25CFF4D7C -:10650000E80FF11D8081F8019801205F3F4F119243 -:106510002E173F07E1F79091962CF801918782FFA3 -:1065200009C09091932C96839091942C978390918D -:10653000952C908784FF15C06360F0E16F9FB001D8 -:106540001124665F7F4F46E050E0C8010A9607C0FD -:1065500080E1689FB001112440E150E0C8010E9431 -:106560002A0F60E170E0C8010AD5E091AE2EF091EB -:10657000AF2E42E1B80180E8199562E1C8010E949E -:10658000A84280E939C10E949A3F91E08927F80129 -:106590008083E091AE2EF091AF2E44E0B80181EC03 -:1065A00019959CC1803A61F462E070E0C80112D58F -:1065B0008823D9F1F80181818093A82C89E00DC04E -:1065C000803C89F462E070E0C80104D5882369F159 -:1065D000F80181818093A82C8BE08093B12C0E94DC -:1065E0009A3F9AE00EC1813C91F462E070E0C801EC -:1065F000F1D48823D1F0F80181818093A82CFAE0AE -:10660000FF2EF092B12C0E949A3F8F25FBC0823C56 -:1066100099F462E070E0C801DDD4882331F0F8011C -:1066200081818093A82C8CE0D8CFE091AE2EF091A0 -:10663000AF2E44E0B80121C0803B11F562E070E06C -:10664000C801C8D4E091AE2EF091AF2E44E0B8015D -:10665000882399F086E819958091AD2E8111BFCFDE -:10666000F8016181F0E16F9FB001112440E150E039 -:1066700087E99CE20E94780FB2CF81EC1995BEC0E9 -:1066800090EA980F923008F0BFC062E070E0C80155 -:10669000A1D4882309F4B2C0F8018081803621F0AA -:1066A000EAE3CE2ED12C03C070E3C72ED12CF80123 -:1066B000818187FF0CC0807FF0E18F9F70011124E2 -:1066C00080ECC80ED11C66EFA62EB12C08C08C7FC2 -:1066D00090E1899F7001112456E3A52EB12CE09121 -:1066E000AE2EF091AF2E42E0B80180E91995F80185 -:1066F000808181708093A72CC70144E0969587958F -:106700004A95E1F78093A82C9091922C981769F004 -:10671000B5016E0D7F1D44E050E083E99CE20E94CC -:106720002A0F8091A82C8093922C68E0CE010196CC -:106730000E947B0E8091AC2E44E050E0873019F42B -:1067400063E070E002C060E070E0CE010F960E944E -:106750002A0FB6016E0D7F1D46E050E0CE0109966E -:106760000E942A0F89818093A92C8A818093AA2C68 -:106770008B818093AB2C8C818093AC2C60E489EA74 -:106780009CE20E94C2448091A92C8093AD2C809100 -:10679000AA2C8093AE2C8091AB2C8093AF2C80914F -:1067A000AC2C8093B02C60E28DEA9CE20E94C24443 -:1067B00020E0AE014F5F5F4FBE01615F7F4FCE01B2 -:1067C0000996E6D68981F80180838A8181838B814D -:1067D00082838C818383E058FF4F8D818083319643 -:1067E0008E81808331968F818083319688858083E6 -:1067F00087E08093B12C80E290E16CC30E949A3FC5 -:1068000091E08927F8010ECD8035B9F4F801818136 -:10681000811187CD62E070E0C801DCD3882309F4E0 -:10682000A0CD1092B12CE091AE2EF091AF2E40E0B1 -:1068300060E070E081E919956EC2A501495F5F4F84 -:1068400033E0569547953A95E1F7E091AE2EF091F9 -:10685000AF2EB80182E9199581E0D4C062E1C80188 -:106860000E948F4060E170E0C801B4D3E091AE2E89 -:10687000F091AF2E882329F142E1B80181E8199502 -:106880008091AD2E81110BC06091A82CF0E16F9F1B -:10689000B001112440E150E0C8010E94780F0E942D -:1068A0009A3F9AE015C066E0C8010E948F4064E0FC -:1068B00070E0C8018FD3811113C0E091AE2EF0912A -:1068C000AF2E44E0B80181EC19950E949A3F91E007 -:1068D0008927F801808388E08093B12C84E01CC272 -:1068E0006091A82CF0E16F9FB001112440E150E0CD -:1068F00087E99CE20E942A0F9091972C80919B2C13 -:1069000080959813E3C280919F2C9813DFC29091D9 -:10691000982C80919C2C80959813D8C28091A02CA3 -:106920009813D4C29091992C80919D2C80959813A6 -:10693000CDC28091A12C9813C9C290919A2C8091BC -:106940009E2C80959813C2C28091A22C9813BEC22F -:106950009091A32C8091A42C80959813B7C280911C -:10696000A52C9813B3C28091A62C80959813AEC223 -:10697000C090972CD090982CE090992CF0909A2C65 -:10698000F80180809180A280B3808091B12C8B30FF -:1069900009F081C2E091AE2EF091AF2E46E0B80131 -:1069A00085E81995C818D908EA08FB08C092972C01 -:1069B00033272F2D1E2D0D2D0093982CA701662710 -:1069C00077274093992C8F2D9927AA27BB2780934F -:1069D0009A2CEC2DE095E0939B2CE02FE095E09332 -:1069E0009C2CE42FE095E0939D2CE82FE095E0931C -:1069F0009E2CC0929F2C0093A02C4093A12C80939E -:106A0000A22C88E08093B12C86C1903409F083C118 -:106A100082E08093B12C8AE0F5CE833909F093CCE3 -:106A20008091AC2E873009F0A1C043E050E060E0D7 -:106A300070E0CE0102960E942A0F88E88983F8014F -:106A40009181903219F0903761F024C0F801808371 -:106A50003A8131832B8122839C8193832327822750 -:106A60002AC1F8018281883809F055C193818A8151 -:106A7000981351C194818B8198134DC195818C815C -:106A8000981349C184E0808361E070E0C80177D247 -:106A900085E09FC0E92EE294EFE0EE22EA94EA94CA -:106AA0009F70F92E88E090E08F1991092FEF30E068 -:106AB000690102C0D594C7948A95E2F7F5E0EF1614 -:106AC00029F084E0E8122AC0FF20E1F044E050E021 -:106AD000B8016E5F7F4FCE0101960E942556892B2B -:106AE00061F49A818B81892798E889279C8189277D -:106AF000F801968189278C2189F1F4E0EF120EC00C -:106B0000F11009C144E050E0B8016E5F7F4FCE0143 -:106B100001960E942556892B09F1FDC083E08E1550 -:106B200008F4F9C0F12CA701B8016E5F7F4FCE01C8 -:106B300001960E942556892B09F0EDC0D801AE0DB3 -:106B4000BF1DE1E0F0E0EC0FFD1FEE0DFF1D129602 -:106B50009C9180818927C82209F0DDC098E8F8015E -:106B600090833A8131832B812283A1C044E050E09D -:106B700060E070E007C0853909F0E5CB44E050E003 -:106B800063E070E0CE0101960E942A0FF801818136 -:106B9000803209F485C0803701F5F801928189813E -:106BA0009813B9C093818A819813B5C094818B8161 -:106BB0009813B1C095818C819813ADC080918F2CB2 -:106BC000808361E070E0C801DAD18FEF8093922C6E -:106BD00086E08093B12C88E19FC0E82EE2947FE0AC -:106BE000E722EA94EA948F70F82E88E090E08F19FB -:106BF00091092FEF30E0690102C0D594C7948A95BE -:106C0000E2F7F5E0EF1629F084E0E8122AC0FF2051 -:106C1000E1F044E050E0B8016E5F7F4FCE01019695 -:106C20000E942556892B61F499818A8189279B814D -:106C300089279C818927F801968189278C2181F1F8 -:106C4000F4E0EF120EC0F11066C044E050E0B8016D -:106C50006E5F7F4FCE0101960E942556892B01F170 -:106C60005AC083E08E1508F456C0F12CA701B80174 -:106C70006E5F7F4FCE0101960E942556892B09F049 -:106C80004AC0D801AE0DBF1DE1E0F0E0EC0FFD1FE2 -:106C9000EE0DFF1D12969C9180818927C822D9F59F -:106CA0003981F80130832A8121839B8192838C81F1 -:106CB0008383232792278927848388E22DC0823CFF -:106CC00009F0CBC0F8018181803E09F0CFC08281FC -:106CD000843B09F0CBC046E050E06AEA74E0CE01A4 -:106CE00001960E942A0F89818B3409F03ACB8A8160 -:106CF000893709F036CB8B818B3109F032CB8C810F -:106D00008A3E09F02ECB8D818B3709F02ACB8E81FC -:106D10008C3C09F026CB80E090E0DCC0F80180815B -:106D2000803621F06AE3C62ED12C03C050E3C52E75 -:106D3000D12CF801818187FF0CC0807FF0E18F9F0B -:106D40007001112480ECC80ED11C46EFA42EB12C8A -:106D500008C08C7F90E1899F7001112436E3A32E37 -:106D6000B12CE091AE2EF091AF2E42E0B80180E957 -:106D70001995F801808181708093A72CC70124E0C8 -:106D8000969587952A95E1F78093A82CB5016E0D0D -:106D90007F1D44E050E083E99CE20E942A0F80912D -:106DA000A82C8093922C68E0CE0101960E947B0E65 -:106DB0008091AC2E44E050E0873019F463E070E03D -:106DC00002C060E070E0CE010F960E942A0FB6016B -:106DD0006E0D7F1D46E050E0CE0109960E942A0FFD -:106DE00089818093A92C8A818093AA2C8B8180939E -:106DF000AB2C8C818093AC2C60E489EA9CE20E94ED -:106E0000C2448091A92C8093AD2C8091AA2C8093B0 -:106E1000AE2C8091AB2C8093AF2C8091AC2C8093C6 -:106E2000B02C60E28DEA9CE20E94C24487E080932D -:106E3000B12C8981F80180838A8181838B8182834F -:106E40008C818383AE014F5F5F4FBE01615F7F4FD7 -:106E5000CE010996F0D080E25FCF982F9F779033D4 -:106E600029F0803A19F0805C833078F481E08093D7 -:106E7000B12C84E0F8018083E091AE2EF091AF2E2A -:106E800040E060E070E082EC8BCBE091AE2EF091C0 -:106E9000AF2E40E0DECC8A3069F4E091AE2EF09166 -:106EA000AF2E46E0B80184E81995C80CD91CEA1C3D -:106EB000FB1C7CCD8C3009F079CDE091AE2EF091A9 -:106EC000AF2E46E0B80187E8199570CD0E949A3F31 -:106ED00096E0FECC6296CDBFDEBFDF91CF911F91D1 -:106EE0000F91FF90EF90DF90CF90BF90AF909F9069 -:106EF0008F900895CF93DF932091AC2E273071F4BB -:106F0000EC0143E050E060E070E00E942A0F44E0B2 -:106F100050E063E070E0CE01039604C044E050E02E -:106F200060E070E0DF91CF910C942A0FCF93DF9354 -:106F30001F92CDB7DEB72091AC2E273029F447E061 -:106F400050E060E070E015C0FC0130812181232712 -:106F50003281232733812327298344E050E060E0F6 -:106F600070E00E94780F41E050E064E070E0CE01F4 -:106F700001960E94780F0F90DF91CF91089520E441 -:106F80002093D00026EC2093D5002093D40021E05C -:106F90002093D000DC01680F791FA617B70741F0D6 -:106FA000ED91F0E0EE51FA4FE491E093D300F5CF8C -:106FB000E091D500F0E0EE51FA4FE491EC93E091CE -:106FC000D400F0E0EE51FA4FE4911196EC93109258 -:106FD000D000089520E42093D00026EC2093D50023 -:106FE0002093D40021E02093D000DC01680F791FAA -:106FF000A617B70741F0ED91F0E0EE51FA4FE4919A -:10700000E093D300F5CFE091D500F0E0EE51FA4FD8 -:10701000E4918C918E130AC0E091D400F0E0EE511F -:10702000FA4FE49181E011969C919E1380E01092BA -:10703000D000817008958F929F92BF92CF92DF927D -:10704000EF92FF920F931F93CF93DF93DC018C910C -:10705000D12C30E08695D794869537958695D79430 -:10706000869537958695D794869537958695D79446 -:107070008695379511968C9111978695D79486951C -:1070800037958695D794869537958695D794869526 -:1070900037958695D7948695379512968C91129749 -:1070A000F0E010E08695F795869517958695F7950B -:1070B000869517958695F795869517958695F795F4 -:1070C0008695179513968C9113978695F7958695C7 -:1070D00017958695F795869517958695F7958695D4 -:1070E00017958695F7958695179514968C91149714 -:1070F00090E020E0869597958695279586959795BB -:107100008695279586959795869527958695979543 -:10711000869527951596EC91E6959795E695279592 -:10712000E6959795E6952795E6959795E6952795A3 -:10713000E6959795E69527954B01DA014C5F5F4FF1 -:107140000C91E401B9904E01B026C32FD0E0BE01EE -:1071500062557F4D7B01612F70E062557E4DE701E6 -:10716000F880EB0188816F2D682BE22EF12CE7016E -:10717000C255DD4D8881682B70E062577F4DEB0171 -:1071800088818695E7956F2F60718D2D817E6827A8 -:10719000892F80726827832F84796827812F8377CE -:1071A0006827822F8A736827F62EF2946F25762F30 -:1071B000769576956727FB2CF6266695F6267D2D27 -:1071C0006F2F892FF694879567957795B694C72E7C -:1071D000D12CE601C255DF4D6E01E62EF12CE70100 -:1071E000C255DE4D7E01E601F881E7019881EF2E60 -:1071F000E92AC82ED12CE601C255DD4D9881E92A35 -:10720000F12CE701C257DF4D98819695E795F12F54 -:10721000F071932F917EEF2EE926922F9072E9263E -:10722000972F9479E926962F9377E926982F9A73CA -:10723000E926FE2CF294EF24CE2CC694C694EC24BE -:10724000FB2CFE24E694FE24F6942795179537959B -:10725000B694C32ED12CE601C255DF4D6E01E12E4E -:10726000F12CE701C255DE4D7E01E601F881E70110 -:107270009881EF2EE92AC22ED12CE601C255DD4DB0 -:107280009881E92AF12CE701C257DF4D9881969544 -:10729000E795F62FF071972F917EEF2EE926982F24 -:1072A0009072E926932F9479E926912F9377E92616 -:1072B000922F9A73E926FE2CF294EF24CE2CC694DA -:1072C000C694EC24FB2CFE24E694FE24F82FF694BE -:1072D000F79567957795B694872F90E0EC01C255A6 -:1072E000DF4D862F90E082559E4DF880EC0188811D -:1072F0008F29EF2EF12CE701C255DD4D9881892BA6 -:1073000090E082579F4DEC0188818695E795912FFB -:107310009071832F817EE92EE826822F8072E826E5 -:10732000872F8479E826862F8377E8268F2F8A7324 -:10733000E826FE2CF294EF24CE2CC694C694EC24BE -:10734000FB2CFE24E694FE24F6942795179537959A -:10735000B694832F90E0EC01C255DF4D812F90E071 -:1073600082559E4DF880EC0188818F29E22EF12C08 -:10737000E701C255DD4D9881892B90E082579F4DE2 -:10738000EC0188818695E795962F9071872F817EF5 -:10739000F92EF8268F2F8072F826832F8479F8260D -:1073A000812F8377F826822F8A73F8269F2D929556 -:1073B000F926EF2CE694E694FE249B2D9F25F69467 -:1073C0009F258F2F9695879567957795B694C72EAD -:1073D000D12CE601C255DF4D6E01E62EF12CE701FE -:1073E000C255DE4D7E01E601F881E7019881EF2E5E -:1073F000E92AC82ED12CE601C255DD4D9881E92A33 -:10740000F12CE701C257DF4D98819695E795F12F52 -:10741000F071932F917EF927922F9072F927972F71 -:107420009479F927962F9377F927982F9A73F9274C -:107430009F2F9295F927FF2EF694F694FF259B2D0A -:107440009F27F6959F279695279517953795B6947C -:10745000C32ED12CE601C255DF4D6E01E12EF12C79 -:10746000E701C255DE4D7E01E601F881E701988112 -:10747000EF2EE92AC22ED12CE601C255DD4D9881AE -:10748000E92AF12CE701C257DF4D98819695E795DF -:10749000F62FF071972F917E9F27F82FF0729F277C -:1074A000F32FF4799F27F12FF3779F27F22FFA73A9 -:1074B0009F27F92FF2959F27F92FF695F6959F278D -:1074C000FB2DF9279695F927982F8F2F869597955D -:1074D00067957795D72EF62F672F70E0EB01C25591 -:1074E000DF4D6F2F70E062557E4DF880EB01888193 -:1074F0006F2D682BE92EF12CE701C255DD4D8881F7 -:10750000682B70E062577F4DEB0188818695E79587 -:10751000632F617E812F80718627622F607286279C -:107520006D2D647986276F2F63778627692F6A739D -:107530008627682F62958627682F66956695862729 -:10754000B694B8268695B826812FB6942795879548 -:107550003795182F0E270D934A175B0709F0F0CDCA -:10756000D092B22CF093B32C9093B42C3093B52CD2 -:107570008093B62C2093B72CDF91CF911F910F9160 -:10758000FF90EF90DF90CF90BF909F908F900895E5 -:107590008F929F92AF92BF92CF92DF92EF92FF9223 -:1075A0000F931F93CF93DF93FC01C62FF42EB52FBB -:1075B0008081A0E050E0869557958695A7958695A1 -:1075C00057958695A795869557958695A7958695FF -:1075D00057958695A7958181869557958695A79508 -:1075E000869557958695A795869557958695A795DF -:1075F000869557958695A795828130E040E08695DF -:1076000047958695379586954795869537958695BE -:1076100047958695379586954795869537958381C5 -:10762000869547958695379586954795869537959E -:10763000869547958695379586954795869537958E -:10764000648190E080E0669587956695979566954C -:1076500087956695979566958795669597956695AE -:10766000879566959795B5806B2D669587956695F8 -:10767000979566958795669597956695879566958E -:1076800097956695879566959795B62EEA2FF0E0C3 -:10769000E255FF4D032F10E002551E4DD081F80139 -:1076A0006081D62B092F10E002551D4DF801608135 -:1076B000ED2FE62BF0E0E257FF4DC0800C2F172F87 -:1076C000CF2DDB2F7E01F4E0EF0EF11C7881F80165 -:1076D000B1918F01B7276B2DC6946795F42FF07188 -:1076E000E52FE17EFE27E82FE072FE27EA2FE479FE -:1076F000FE27E32FE377FE27E92FEA73FE27EF2F1C -:10770000E295FE27DF2ED694D694FD25EB2FEF27AA -:10771000F695EF2720FDEC25E6958795479557953B -:10772000B695C52ED12CF601E255FF4D6F01A42E62 -:10773000B12CF501E255FE4D5F01F601D080F50157 -:10774000C080DC28E82FF0E0E255FD4DF081ED2D02 -:10775000EF2BF0E0E257FF4DC080C6946795F32F02 -:10776000F071EA2FE17EFE27E92FE072FE27E52F78 -:10777000E479FE27E42FE377FE27E82FEA73FE275C -:10778000EF2FE295FE27DF2ED694D694FD25EB2F22 -:10779000EF27F695EF27DA2E20FDEC25E695979555 -:1077A0003795D794CB2EC694AD2DB0E0A255BF4DE2 -:1077B000E32FF0E0E255FE4DAC91E081EA2BA92FDA -:1077C000B0E0A255BD4DFC91EF2BF0E0E257FF4D2C -:1077D000B081B6956795F42FF071E52FE17EFE2715 -:1077E000E82FE072FE27ED2DE479FE27E32FE37703 -:1077F000FE27E92FEA73FE27EF2FE295FE27AF2F32 -:10780000A695A695FA27EC2DEF27F695EF2720FDF4 -:10781000EB27E695879547955795C694A52FB0E039 -:10782000A255BF4DE42FF0E0E255FE4DAC91E08152 -:10783000EA2BA82FB0E0A255BD4DFC91EF2BF0E054 -:10784000E257FF4DB081B6956795F32FF071ED2D9E -:10785000E17EFE27E92FE072FE27E52FE479FE277F -:10786000E42FE377FE27E82FEA73FE27EF2FE29558 -:10787000FE27AF2FA695A695FA27EC2DEF27F695B4 -:10788000EF2720FDEB27E69597953795D794C6947B -:10789000AD2DB0E0A255BF4DE32FF0E0E255FE4D17 -:1078A000AC91E081EA2BA92FB0E0A255BD4DFC912F -:1078B000EF2BF0E0E257FF4DB081B6956795F42FBE -:1078C000F071E52FE17EFE27E82FE072FE27ED2D17 -:1078D000E479FE27E32FE377FE27E92FEA73FE27FB -:1078E000EF2FE295FE27AF2FA695A695FA27EC2D50 -:1078F000EF27F695EF2720FDEB27E695879547952F -:107900005795C694A52FB0E0A255BF4DE42FF0E0E7 -:10791000E255FE4DAC91E081EA2BA82FB0E0A255D4 -:10792000BD4DFC91EF2BF0E0E257FF4DB081B695D5 -:107930006795F32FF071ED2DE17EFE27E92FE072C0 -:10794000FE27E52FE479FE27E42FE377FE27E82FD3 -:10795000EA73FE27EF2FE295FE27AF2FA695A69597 -:10796000FA27EC2DEF27F695EF2720FDEB27E6957C -:1079700097953795D794C694ED2DF0E0E255FF4DDD -:10798000A32FB0E0A255BE4DF081EC91EF2BA92FB3 -:10799000B0E0A255BD4DFC91EF2BF0E0E257FF4D5A -:1079A000B081B6956795F42FF071E52FE17EFE2743 -:1079B000E82FE072FE27ED2DE479FE27E32FE37731 -:1079C000FE27E92FEA73FE27EF2FE295FE27AF2F60 -:1079D000A695A695FA27EC2DEF27F695EF2720FD23 -:1079E000EB27E695879547955795A52FB0E0A255CB -:1079F000BF4DE42FF0E0E255FE4DAC91E081EA2B63 -:107A0000A82FB0E0A255BD4DFC91EF2BF0E0E2575E -:107A1000FF4DF081F6956795B62EED2DE17E632F33 -:107A200060716E27E92FE0726E27E52FE4796E27EB -:107A3000E42FE3776E27E82FEA736E27E62FE295AF -:107A40006E27E62FE695E6956E27C694C6266695C0 -:107A5000C62620FDCF26C69497953795D794AD2D91 -:107A6000CD2CD12CF601E255FF4D6F01832E912CC8 -:107A7000F401E255FE4D4F01F601B081F401608141 -:107A8000B62BC92ED12CF601E255FD4D6081EB2FAE -:107A9000E62BF0E0E257FF4DC080E72FF0E0EE511B -:107AA000FB4FE491EC25EC837B257993EC16FD06E6 -:107AB00009F00CCE5093B22C4093B32C8093B42C8D -:107AC000A093B52C3093B62C9093B72CDF91CF9127 -:107AD0001F910F91FF90EF90DF90CF90BF90AF90EC -:107AE0009F908F900895BF92CF92DF92EF92FF9276 -:107AF0000F931F93CF93DF93A091B22C5091B32C8F -:107B00001091B42C4091B52C3091B62C2091B72C0B -:107B1000FC01BC016C5F7F4F0191952F90718A2F02 -:107B2000817E9827812F80729827842F84799827C7 -:107B3000832F83779827822F8A739827892F82959E -:107B40009827892F869586959827C42ED12CE601F3 -:107B5000C255DF4D6E01E32EF12CE701C255DE4D1B -:107B60007E01E601B881E7018881B82BE22EF12C75 -:107B7000E701C255DD4D8881CB2FC82BD0E0C2571D -:107B8000DF4DB881B027B92796959B270695812FA1 -:107B9000969587955795A795B32FB071942F917EA1 -:107BA000B927922F9072B9279A2F9479B927952FD8 -:107BB0009377B927982F9A73B9279B2F9295B92756 -:107BC0009B2F96959695B927CA2ED12CE601C255C2 -:107BD000DF4D6E01E52EF12CE701C255DE4D7E0131 -:107BE000E6011881E7019881192BE82EF12CE701B5 -:107BF000C255DD4D9881C12FC92BD0E0C257DF4D52 -:107C0000988190279B27B695B927B02EB694922FCE -:107C1000B695979537954795B52FB0712A2F217E48 -:107C2000B227282F2072B227242F2479B227232F9E -:107C30002377B227292F2A73B2272B2F2295B22719 -:107C40002B2F26952695B227C42FD0E08E01025502 -:107C50001F4D6801C32FD0E08E0102551E4D7801E3 -:107C6000E6010881E7012881022BE92EF12CE701CA -:107C7000C255DD4D2881022B10E002571F4DE8014F -:107C80002881C22FCB25CB27B695BC272B2D269537 -:107C9000B69587955795A795C32FC071B42FB17E20 -:107CA000BC27C92FC072BC27CA2FC479BC27C52FD7 -:107CB000C377BC27C82FCA73BC27CB2FC295BC275C -:107CC000CB2FC695C695BC27CA2FD0E0C255DF4D35 -:107CD000052F10E002551E4DF880E8011881F12AA9 -:107CE000082F10E002551D4DE8011881CF2DC12B42 -:107CF000D0E0C257DF4DC881C227CB27B695BC273D -:107D00002695B695979537954795C52FC071BA2F8B -:107D1000B17EBC27C82FC072BC27C42FC479BC2732 -:107D2000C32FC377BC27C92FCA73BC27CB2FC295DB -:107D3000BC27CB2FC695C695BC27C42FD0E0C25513 -:107D4000DF4D032F10E002551E4DF880E801188129 -:107D5000F12A092F10E002551D4DE8011881CF2DA1 -:107D6000C12BD0E0C257DF4DC881C227CB27B695C3 -:107D7000BC272695B69587955795A795D32FD07193 -:107D8000B42FB17EDB27B92FB072DB27BA2FB479BD -:107D9000DB27B52FB377DB27B82FBA73DB27BD2FCF -:107DA000B295DB271D2F169516951D27CA2ED12CAF -:107DB000E601C255DF4D6E01E52EF12CE701C255FB -:107DC000DE4D7E01E6010881E701B8810B2BE82E2C -:107DD000F12CE701C255DD4DB881C02FCB2BD0E08F -:107DE000C257DF4DB881B227B127D12FD695DB27F7 -:107DF000B22EB694D695979537954795D52FD071D5 -:107E00002A2F217ED227282F2072D227242F2479AF -:107E1000D227232F2377D227292F2A73D2272D2F3A -:107E20002295D2272D2F26952695BD2FB227C42F18 -:107E3000D0E08E0102551F4D6801C32FD0E08E01A6 -:107E400002551E4D7801E6010881E7012881022BC9 -:107E5000E92EF12CE701C255DD4D2881022B10E0FF -:107E600002571F4DE80118811B251B27DB2FD695D4 -:107E7000D127D69587955795A795182F242F217E22 -:107E8000832F80712827892F807228278A2F847951 -:107E90002827852F83772827812F8A732827B22FB9 -:107EA000B2952B27B22FB695B6952B27EA2EF12C3B -:107EB000E701C255DF4D7E01C52ED12CE601C2552A -:107EC000DE4D6E01E701E880E6018881E82AC12ED7 -:107ED000D12CE601C255DD4D8881E82AF12CE7015D -:107EE000C257DF4DB6948881CB2DC827C22726956F -:107EF000B22FBC272B2F2695979537954795292F7D -:107F00006E177F0709F008CEA093B22C5093B32CC4 -:107F10001093B42C4093B52C3093B62C9093B72C7F -:107F2000DF91CF911F910F91FF90EF90DF90CF9055 -:107F3000BF900895CF93DF93E2EBFCE2A0817181C3 -:107F40006281338124819581472F40718A2F817E00 -:107F50008427462F40728427432F44798427422F59 -:107F600043778427492F4A738427482F42958427D3 -:107F7000482F469546958427482F46958427869511 -:107F800067957795A795C32FD0E0C255DF4D422F57 -:107F900050E042555E4DB881EA018881B82B492FE7 -:107FA00050E042555D4DEA018881CB2FC82BD0E0CF -:107FB000C25BDF4D88818695522F5071432F417EE1 -:107FC0004527592F507245275A2F54794527572F47 -:107FD00053774527562F5A734527542F52954527D7 -:107FE000542F569556954527542F56954527469517 -:107FF000979527953795CA2FD0E0C255DF4D472F6B -:1080000050E042555E4DB881EA014881B42B462FBD -:1080100050E042555D4DEA014881CB2FC42BD0E0A2 -:10802000C25BDF4D4881842B8695572F50714A2FB4 -:10803000417E4527562F50724527532F54794527A7 -:10804000522F53774527592F5A734527542F52954E -:108050004527542F569556954527542F5695452715 -:10806000469567957795A795C32FD0E0C255DF4D0C -:10807000422F50E042555E4DB881EA014881B42B51 -:10808000492F50E042555D4DEA014881CB2FC42B6A -:10809000D0E0C25BDF4D4881842B8695CA2FD0E0AB -:1080A000C255DF4D472F50E042555E4DB881EA0181 -:1080B0004881B42B462F50E042555D4DEA0148817E -:1080C000CB2FC42BD0E0C25BDF4D4881842B532FD4 -:1080D000517E422F40714527592F507245275A2F04 -:1080E00054794527572F53774527562F5A734527DD -:1080F000542F52954527542F569556954527542F62 -:10810000569545274695979527953795A083718372 -:108110006283338324839583DF91CF910895BF9247 -:10812000CF92DF92EF92FF920F931F93CF93DF9343 -:108130005091B22CC091B32CB090B42C4091B52C7E -:108140003091B62C2091B72CFC01615008F4EAC1A3 -:108150009C2F9071852F817E98278B2D8072982778 -:10816000842F84799827832F83779827822F8A7387 -:108170009827892F82959827792F76957695972736 -:10818000892F86959827AC2F8B2D96958795A79547 -:108190005795C42FD0E0C255DF4D032F10E0025594 -:1081A0001E4D7881E8019881792B022F10E002554D -:1081B0001D4DE8019881C72FC92BD0E0C259DF4D72 -:1081C00018811695732F7071942F917E9727722FB7 -:1081D00070729727752F747997277A2F737797275F -:1081E000782F7A739727792F72959727792F76951D -:1081F00076959727792F76957927922F272F269591 -:10820000979537954795C52ED12CE601C255DF4D80 -:108210006E01EA2EF12CE701C255DE4D7E01E6012A -:108220007881E7012881722BE82EF12CE701C255F5 -:10823000DD4D2881C72FC22BD0E0C259DF4D2881E8 -:10824000122B16957A2F7071252F217E2727782FD4 -:1082500070722727742F74792727732F7377272736 -:10826000792F7A732727722F72952727722F769589 -:1082700076952727722F76952727BA2F26958795EB -:10828000B7955795C42ED12CE601C255DF4D6E012E -:10829000E32EF12CE701C255DE4D7E01E601788127 -:1082A000E7012881722BE92EF12CE701C255DD4D43 -:1082B0002881C72FC22BD0E0C259DF4DA881A12B46 -:1082C000A695732F7071242F217E2727792F707226 -:1082D0002727752F747927277B2F73772727782FE8 -:1082E0007A732727722F72952727722F76957695A6 -:1082F0002727722F76957227232F372F369597953C -:1083000027954795C52FD0E0C255DF4D0B2F10E0C4 -:1083100002551E4D7881E8013881732B082F10E03B -:1083200002551D4DE8013881C72FC32BD0E0C2593B -:10833000DF4DD881AD2BA6957B2F7071352F317E07 -:108340003727782F70723727742F74793727722F59 -:1083500073773727792F7A733727732F72953727DB -:10836000732F769576953727732F76953727369521 -:108370008795B7955795C42FD0E0C255DF4D022F92 -:1083800010E002551E4D7881E8013881732B092FCA -:1083900010E002551D4DE8013881C72FC32BD0E0F6 -:1083A000C259DF4DD881AD2BA695722F7071342F35 -:1083B000317E7327392F30727327352F3479732725 -:1083C0003B2F33777327382F3A737327372F329524 -:1083D0007327372F369536957327372F36957327A2 -:1083E000342F7695979527953795C52FD0E0C255B0 -:1083F000DF4D0B2F10E002551E4D7881E8014881BA -:10840000742B082F10E002551D4DE8014881C72F3D -:10841000C42BD0E0C259DF4DD881DA2BD6957B2F03 -:108420007071452F417E7427482F40727427432F67 -:1084300044797427422F43777427492F4A7374274E -:10844000472F42957427A72FA695A6957A27472FE1 -:10845000469574274B2F7695879547955795C42F4A -:10846000B82EA32FB0E08D0102551F4D6801A22F39 -:10847000B0E08D0102551E4D7801D6010C91D70157 -:108480008C91082BE92EF12CD701A255BD4D8C9172 -:10849000082B10E002591F4DD8018C91D82BD6958E -:1084A000732F717E822F80717827892F80727827B1 -:1084B000852F84797827842F837778278B2D8A736B -:1084C0007827872F82957827A72FA695A6957A27B4 -:1084D000872F86957827432F322F272F269597951C -:1084E00037954795292F852F90E082559F4D0C2F6A -:1084F00010E002551E4DDC019C91D8018C91892B16 -:108500000B2D10E002551D4DD8019C91892B90E058 -:1085100082599F4DDC019C918D2F892B9081892759 -:10852000819313CE5093B22CC093B32CB092B42C41 -:108530004093B52C3093B62C2093B72CDF91CF917C -:108540001F910F91FF90EF90DF90CF90BF90089513 -:10855000EF92FF920F931F93CF93DF937091B22C02 -:108560005091B32C2091B42C4091B52C3091B62C65 -:10857000C091B72CE42FF0E0E255FF4DA32FB0E0FF -:10858000A255BE4DF081EC91EF2BAC2FB0E0A2557F -:10859000BD4DFC91EF2BF0E0E257FF4D1081DC0167 -:1085A000D0E0615008F4DBC11695D795952F9071F6 -:1085B000872F817E8927922F90728927942F947913 -:1085C0008927932F937789279C2F9A738927982F30 -:1085D00092958927E82FE695E6958E27982F969510 -:1085E00089278695279557957795D695932F9071DE -:1085F000842F817E89279C2F90728927972F9479C9 -:108600008927952F93778927922F9A738927982FF7 -:1086100092958927E82FE695E6958E27982F9695CF -:1086200089279C2F8695979537954795E72FF0E0FA -:10863000E255FF4D052F10E002551E4DC081F80197 -:108640008081C82B022F10E002551D4DF80180815A -:10865000EC2FE82BF0E0E259FF4D8081D82BD69526 -:10866000E52FE071872F817E8E27E22FE0728E2723 -:10867000E42FE4798E27E32FE3778E27E92FEA733F -:108680008E27E82FE2958E27E82FE695E6958E2730 -:10869000E82FE6958E278695279557957795E42FB1 -:1086A000F0E0E255FF4D032F10E002551E4DC08152 -:1086B000F8018081C82B092F10E002551D4DF801EB -:1086C0008081EC2FE82BF0E0E259FF4D8081D82B20 -:1086D000D695E32FE071842F817E8E27E92FE072FB -:1086E0008E27E72FE4798E27E52FE3778E27E22F79 -:1086F000EA738E27E82FE2958E27E82FE695E69518 -:108700008E27E82FE6958E2786959795379547957E -:10871000E72FF0E0E255FF4D052F10E002551E4D0A -:10872000C081F8018081C82B022F10E002551D4D39 -:10873000F8018081EC2FE82BF0E0E259FF4D8081B9 -:10874000D82BD695E52FE071872F817E8E27E22FDB -:10875000E0728E27E42FE4798E27E32FE3778E27CC -:10876000E92FEA738E27E82FE2958E27E82FE6950A -:10877000E6958E27E82FE6958E27869527955795BF -:108780007795E42FF0E0E255FF4D032F10E00255FE -:108790001E4DC081F8018081C82B092F10E00255C1 -:1087A0001D4DF8018081EC2FE82BF0E0E259FF4DE0 -:1087B0008081D82BD695E32FE071842F817E8E2780 -:1087C000E92FE0728E27E72FE4798E27E52FE377F4 -:1087D0008E27E22FEA738E27E82FE2958E27E82F67 -:1087E000E695E6958E27E82FE6958E278695979550 -:1087F00037954795E72FF0E0E255FF4D052F10E044 -:1088000002551E4DC081F8018081C82B022F10E057 -:1088100002551D4DF8018081EC2FE82BF0E0E25964 -:10882000FF4D8081D82BD695E52FE071872F817E73 -:108830008E27E22FE0728E27E42FE4798E27E32F34 -:10884000E3778E27E92FEA738E27E82FE2958E27AC -:10885000E82FE695E6958E27E82FE6958E278695F4 -:10886000279557957795E42FF0E0E255FF4D032FBC -:1088700010E002551E4DC081F8018081C82B092FE0 -:1088800010E002551D4DF8018081EC2FE82BF0E03F -:10889000E259FF4D8081D82BD695E72FF0E0E255C5 -:1088A000FF4D052F10E002551E4DC081F80180815B -:1088B000C82B022F10E002551D4DF8018081EC2FCE -:1088C000E82BF0E0E259FF4D8081D82BE42FE17EC8 -:1088D000832F8071E827892F8072E827872F84797A -:1088E000E827852F8377E827822F8A73E8278E2F42 -:1088F0008295E8278E2F86958695E8278E2F869578 -:10890000E827E695979537954795C92FE42FF0E02E -:10891000E255FF4D832F90E082559E4D1081FC0162 -:108920008081182B8C2F90E082559D4DFC01808119 -:10893000E12FE82BF0E0E257FF4D10818C91E82FFA -:10894000F0E0EE51FB4FE4917D01F0E8EF0EF11CF9 -:108950009E2F9127F70190838D278D9322CE7093C0 -:10896000B22C5093B32C2093B42C4093B52C30935D -:10897000B62CC093B72CDF91CF911F910F91FF9030 -:10898000EF9008950F931F93FC01862F4081518132 -:10899000628173818B0122273327803208F471C0F2 -:1089A000D80123E0B695A7952A95E1F70A271B275A -:1089B00098013695279536952795BBE0769567956E -:1089C00057954795BA95D1F70227132720E030E055 -:1089D00095E1000F111F221F331F9A95D1F7402BED -:1089E000512B622B732B8B0122273327D80133E0C5 -:1089F000B695A7953A95E1F70A271B279801369572 -:108A0000279536952795BBE07695679557954795B9 -:108A1000BA95D1F70227132720E030E095E1000F47 -:108A2000111F221F331F9A95D1F7402B512B622B18 -:108A3000732B8B0122273327D80133E0B695A795F6 -:108A40003A95E1F70A271B27980136952795369521 -:108A50002795BAE07695679557954795BA95D1F7DA -:108A60000227132720E030E096E1000F111F221F9C -:108A7000331F9A95D1F7402B512B622B732B8052C9 -:108A800089CF40835183028373831F910F9108958F -:108A9000AF92BF92CF92DF92EF92FF920F931F930C -:108AA000CF93DF936730710509F451C09B012770A4 -:108AB0003327232B09F04EC05B016C01EB0183E0EF -:108AC000D695C7958A95E1F77B0196E0F694E794F1 -:108AD0009A95E1F7EC0EFD1EEC0CFD1C8E01015089 -:108AE00011090C0D1D1DA701401B510B60E070E02A -:108AF000C80101960E944C560C151D0520F1D801A5 -:108B0000EC91F0E0EE51FB4F2491D701CD010A1713 -:108B10001B0768F4FC018081982F990F8E91881FA4 -:108B20008827881F892B11968C931197EFCF119668 -:108B30008C9111978E7FE22FE170E82B1196EC93C8 -:108B400001501109D9CFC5018C0F9D1F04C087E0CA -:108B500090E001C0CB01DF91CF911F910F91FF9069 -:108B6000EF90DF90CF90BF90AF900895CF93DF93B9 -:108B7000EC0182EC888361E070E0CE010E94BF3797 -:108B80008AE08093922D1092932D68E170E0CE01DF -:108B9000DF91CF917DCFEF92FF920F931F93CF93F1 -:108BA000DF93EC01CB0167307105E1F169E070E022 -:108BB0000E947C55DE0180E090E008E010E086171E -:108BC000970751F1FC0133E0F695E7953A95E1F707 -:108BD000E80FF91FAC0147705527EC0FFD1F2081EE -:108BE00030E0042E02C0359527950A94E2F72C93C5 -:108BF0004115510571F0E181F0E07801E41AF50AC0 -:108C0000A7017F0102C0EE0CFF1C4A95E2F72E2956 -:108C10002C9301961196D3CF23E0880F991F2A95A4 -:108C2000E1F702C087E090E0DF91CF911F910F91B3 -:108C3000FF90EF900895EF92FF920F931F93CF93C1 -:108C4000DF939C01CB016730710509F440C069E0F6 -:108C500070E00E947C5580E090E048E050E086178C -:108C60009707A9F1DC01E3E0B695A795EA95E1F74E -:108C7000A80FB91FEC01C770DD27A20FB31FEC913D -:108C8000F0E00C2E02C0F595E7950A94E2F72097E4 -:108C900059F011960C9111977A01EC1AFD0A01C056 -:108CA000000FEA94EAF7E02BF0E0EE51FB4FE4917D -:108CB0001196AC91B0E002C0B595A795CA95E2F7C0 -:108CC000ED01CE27FE01E0FD04C00196C8CF81E092 -:108CD00001C080E0DF91CF911F910F91FF90EF9045 -:108CE00008951092922D08951092922D1092B82C02 -:108CF0001092932D0895F8DF0E940E2C1092922D61 -:108D0000089508950895DC0123E633E66150E8F004 -:108D10004D91942F922780E1989FA001112449271B -:108D2000E42FF0E0232F332742954F70C9018427A9 -:108D3000AC013E2F22272427352743E0EE0FFF1FEB -:108D40004A95E1F72E273F27E1CFC9010895EF9219 -:108D5000FF921F93CF93DF93EC017B018091932DC2 -:108D6000882339F08091922D823008F0DBC0109278 -:108D7000932DE114F10461F0B701CE015CDF88238B -:108D800009F4D3C0B701CE0106DF7C0181E001C048 -:108D900082E01091922D163090F4133070F512305D -:108DA000A8F484E090E080931E2090931F2082E539 -:108DB000888382E08093922D87E090E0C7C01930CD -:108DC00008F467C01A3009F496C0ACC090E1E91607 -:108DD000F10411F480FD03C01092922D92C088819D -:108DE00099818093842D9093852D83E9888380E2F7 -:108DF000898383E08093922D6AC080FFEDCF88E263 -:108E0000E816F10448F32881898182279A8189270D -:108E10009B8189279C818913DFCFA12FB0E0139715 -:108E2000CD01880F991FA80FB91FA957B24D283837 -:108E300021F483E0FE01319602C084E0FE0101903E -:108E40000D928A95E1F745E050E0BE01CE01029611 -:108E50000E943B56133021F0143021F485E903C001 -:108E600083E901C087E9888380E7898367E070E050 -:108E7000CE010E94BF378091922D8D5F8093922DFD -:108E800068E470E0CE01DF91CF911F91FF90EF90E9 -:108E9000FFCD80FFA1CF98E1E916F10409F09CCF46 -:108EA00063E0CE0130DF009709F096CF288122FFE2 -:108EB00011C0183079F0163011F485E901C087E946 -:108EC000888380E289832EEF210F2093922D60E129 -:108ED00070E0D8CF21E02093932D212F30E0265051 -:108EE0003109322F330F230F2C5F2093912D2881CE -:108EF0002093862D2BC0982F927031F081E08093C3 -:108F0000922D0E94072C0EC080FF05C063E0CE01A9 -:108F1000FADE892B99F3CE01DF91CF911F91FF905B -:108F2000EF9024CE80E090E011C0A701495F5F4F31 -:108F300083E0569547958A95E1F7E091AE2EF09142 -:108F4000AF2EBE0181EC199580E023CFDF91CF9148 -:108F50001F91FF90EF9008959F92AF92BF92CF9292 -:108F6000DF92EF92FF920F931F93CF93DF93CDB7D2 -:108F7000DEB7C756D109CDBFDEBF8C017B01FB0137 -:108F800060817181E4DED090932DDD2009F445C12C -:108F90008091922D9AEF980F933008F057C0F80106 -:108FA00080818072C82E1092742D5DE4A52E51E14F -:108FB000B52E912C47E650E0B501CE0101960E94F6 -:108FC00004568B81882349F029813A818091842D30 -:108FD0009091852D28173907B9F48D81882329F0C0 -:108FE0009C818091862D98130FC08F89882311F062 -:108FF000CC2051F0E091742D81E08E0F8093742D80 -:10900000F0E0EB58F24D90829394F7E6AF0EB11C6E -:109010008FE09812CFCFC1100DC08091922D9AEFA2 -:10902000980F943008F0AEC02091742DE5E7FDE272 -:1090300080E08FC080EEF801808380E8818362E069 -:1090400070E0C8010E94BF3789E095C0893029F7D8 -:10905000F70160817181C801EEDDF70160817181E6 -:10906000811115C0CB01089667E070E00E947C5525 -:10907000462FE091AE2EF091AF2EB80181EC1995FC -:10908000C80174DDF70180839183D12CC9C0C80168 -:1090900082DDF70180839183F8016081262F30E023 -:1090A00043E0969587954A95E1F702972817390787 -:1090B00039F76E5FC80127DE892B11F7C12C97E6BF -:1090C000992E5801FFEFAF1ABF0A8091742DC81670 -:1090D00008F0A3CFEC2DF0E0EB58F24D6081969EA6 -:1090E000B0011124635B7E4E47E650E0CE0101964D -:1090F0000E9404568F89882349F14E8950E0F80177 -:10910000808190E001974817590741F02091742D14 -:10911000422F50E0415051093C2D08C0B501CE010D -:1091200006960E942556892B89F710C0832F90E060 -:10913000841795073CF4FC01EB58F24D8181808344 -:109140003F5FF4CF21502093742DCA94C394BDCFB8 -:109150008F5F821709F464C0919194509230C0F7E8 -:1091600082E0F801808380E6818362E070E0C801DC -:109170000E94BF378BE08093922D60E270E0C801BF -:1091800087DC80CF8B3009F04BC0F70160817181A3 -:109190006115710509F43EC0C8014DDDD82EF701F7 -:1091A00060817181811113C0CB01089667E070E086 -:1091B0000E947C55462FE091AE2EF091AF2EB80163 -:1091C00081EC19951092742DC801D0DC26C0C8011D -:1091D000E2DCF70180839183BC0183E0769567959B -:1091E0008A95E1F7C8018FDD892B19F01092742D53 -:1091F00047CFF8018581882331F0813059F480937D -:10920000742D85E004C081E08093742D84E0809308 -:10921000752D06C01092742D03C0F70180839183D1 -:109220008D2DC959DF4FCDBFDEBFDF91CF911F918B -:109230000F91FF90EF90DF90CF90BF90AF909F90F5 -:1092400008955F926F927F928F929F92AF92BF929A -:10925000CF92DF92EF92FF920F931F93CF93DF9302 -:10926000CDB7DEB7C254D240CDBFDEBF7C01CF5BED -:10927000DD4F68837983C154D2408091B82C84300B -:1092800009F48BC140F4823009F4D6C008F060C103 -:10929000813051F08CC4863009F41EC308F446C2F4 -:1092A000873009F4C8C383C40091942E1091952E81 -:1092B00001151105C1F0A801495F5F4F63E05695A4 -:1092C00047956A95E1F764E97DE2C7010E9432564D -:1092D0006091942E7091952EC701DADB1092942E36 -:1092E0001092952E21C2CF5BDD4F68817981C154E8 -:1092F000D2406115710509F4C7C0C7019CDCD82EA6 -:10930000CF5BDD4F68817981C154D240C70143DC16 -:10931000CF5BDD4F88839983C154D2409C01295F84 -:109320003F4FC901880F991F53E0969587955A952D -:10933000E1F706968138910578F064EB73E2CE018F -:1093400001960E945E561092B82CBE016F5F7F4F4F -:1093500085E60E94DE226BC4B3E036952795BA9568 -:10936000E1F7A70160E870E0CE0101960E94950E3A -:109370007C01CF5BDD4F8881C154D240CE5BDD4F95 -:109380009881C254D240CF5FDD4F9883C150D24004 -:10939000CE5FDD4F8883C250D24083EC93E29F932F -:1093A0008F9380E8A82EB12CC5018E199F099F9339 -:1093B0008F9381E090E08C0F9D1F8E0D9F1D9F93DA -:1093C0008F930E946556E80EF91EB5016E197F094C -:1093D00022E030E0AE014F5F5D4F81E090E08C0F06 -:1093E0009D1F8E0D9F1D0E94950E8E0D9F1D0F902F -:1093F0000F900F900F900F900F909501281B390B35 -:1094000041E050E04C0F5D1F840F951FD11003C049 -:1094100046EC53E202C045ED53E25F934F933F9316 -:109420002F939F938F930E9465560F900F900F90EC -:109430000F900F900F9087CF0091942E1091952E42 -:1094400001151105C1F0A801495F5F4FA3E05695D2 -:109450004795AA95E1F764E97DE2C7010E9432567B -:109460009091942E8091952E1092942E1092952E7C -:10947000092F182FDCC3CF5BDD4F28813981C15400 -:10948000D2402115310551F488E0E9E4F4E2DE012F -:10949000119601900D928A95E1F755CF295F3F4FC4 -:1094A000E3E036952795EA95E1F7A70160E870E0DB -:1094B000CE0101960E94950E7C01CF5BDD4F888125 -:1094C000C154D240CE5BDD4F9881C254D240CF5FB1 -:1094D000DD4F9883C150D240CE5FDD4F8883C250AC -:1094E000D24083EC93E29F938F93F0E8CF2ED12C60 -:1094F000C6018E199F099F938F9381E090E08C0F96 -:109500009D1F8E0D9F1D9F938F930E9465568E0DFC -:109510009F1DB601681B790B22E030E0AE014F5F62 -:109520005D4FA1E0B0E0AC0FBD1F8A0F9B1F0E94F2 -:10953000950E1092B82CBE016F5F7F4F85E60E949A -:10954000DE220F900F900F900F900F900F906FC32F -:10955000CF5BDD4F68817981C154D240C701F7DB11 -:109560002091932D222309F425C32091912D30E0E1 -:1095700047E85DE264E170E0CE0101960E94950E3D -:10958000BE016F5F7F4F85E60E94DE221092932D11 -:109590001092B82C0E9474230AC38091732D8111FC -:1095A00008C080E890E00E94C12381E08093732D81 -:1095B0007BC0813009F07AC08091922D823008F012 -:1095C00075C08091722D8F5F8093722D803109F06C -:1095D0006DC00E94CC238C019350409768F0011518 -:1095E000B8E01B0708F460C0E0E1F0E020E030E004 -:1095F000A12CB12C60E040C0AAEFBCE240E050E0FA -:1096000020E030E080E090E0E0E0F0E060E07D919C -:10961000703149F44732510509F405C361110EC098 -:10962000FA0161E00BC0662349F0BA016E1B7F0BA3 -:109630006817790710F09F01CB0160E04F5F5F4F23 -:109640004832510521F78430910508F03BC22CC007 -:10965000D601ED906D01F12CEE16FF06B0F461110C -:1096600019C04F5F5F4F4837510591F7009709F0D8 -:1096700029C2319709F426C27AEFC72E7CE2D72E91 -:1096800040E050E080E090E0E3CF6111EACF5A0182 -:1096900061E0E7CFBA016A197B096817790710F012 -:1096A0009501CB0160E0DDCF1092722DCF5BDD4FD5 -:1096B00068817981C154D240C70149DB2091932D43 -:1096C000222309F477C2E091B12EF091B22E0284E8 -:1096D000F385E02DE058F10954E0F695E7955A95A9 -:1096E000E1F7E650F34D80818F5F80838091722D8A -:1096F000803121F40E94CC231092722D1092922D71 -:109700000E94072C80E5F7018083118262E070E0FF -:10971000C7010E94BF3781E08093922D1092932D54 -:1097200060E270E0C701B4D98C0181C2CF5BDD4F2C -:1097300068817981C154D240C70109DB2091932D02 -:10974000222309F437C2D090F92CDD2009F445C05A -:10975000CF5BDD4F08811981C154D240011511053D -:1097600049F41092F92C1092932D1092922D0E9490 -:10977000072C5DC2023A110538F0B801C7015BDA67 -:1097800001E08027082F02C001E010E0CF5BDD4F31 -:1097900068817981C154D240C701FDD9CF5BDD4FCB -:1097A00088839983C154D24000FD05C062E1C7019E -:1097B000AADA892B29F0ACEFAD0DA093F92C2AC0C1 -:1097C000F4E0DF9ED0011124A755B34D80E1F701ED -:1097D00001900D928A95E1F71DC042E050E062E8E9 -:1097E00072E1CE0101960E940456E5E8F2E1E491AF -:1097F0002091842D3091852D89819A8128173907F0 -:1098000021F48091862DE81729F01092922D0E9464 -:10981000072CCDC18091F92C803109F04DC01092F8 -:10982000932D1092F92C1092B82C20E130E049EBE6 -:109830005CE267E870E0CE0101960E94950E63EC51 -:1098400073E2CE0181960E945E5620E130E049EC41 -:109850005CE265E670E0CE0183960E94950E63ECB3 -:1098600073E2CE018D5B9F4F0E945E5620E130E097 -:1098700049ED5CE263E470E0CE018B5B9F4F0E9498 -:10988000950E63EC73E2CE018B599F4F0E945E569A -:1098900020E130E049EE5CE261E270E0CE018959FE -:1098A0009F4F0E94950E0E947423BE016F5F7F4FF1 -:1098B00085E60E94DE227BC190E3D7019C9311963E -:1098C0008C9362E070E0C7010E94BF378091F92C51 -:1098D0008C5F8093F92C24CFBE016F5B7D4FC70155 -:1098E0003BDB882309F4E7C08091742D811103C00C -:1098F0006BEE73E227C08130A1F0912C80E090E004 -:1099000000E010E027E6822E7E01BFEFEB1ABDEFEC -:10991000FB0A3EEFC32E33E2D32EA12C42E0B42E3D -:1099200040C06091752DE7E66E9FB00111246C5820 -:109930007E4E40E450E0CE0101960E940456BE01E6 -:109940006F5F7F4F85E60E94DE2255C00130F2E056 -:109950001F0760F5E92DF0E0EB58F24D6081869E1F -:10996000B00111246C587E4E40E450E0C7010E94C3 -:109970000456FF92EF92DF92CF92C501801B910BAC -:109980009F938F9381E090E08C0F9D1F800F911F1C -:109990009F938F930E946556080F191F9394CDBF14 -:1099A000DEBF2091742D921688F204C0081B190B9B -:1099B000F12C06C0013032E01307C0F7FF24F39406 -:1099C000EDEFFFEFEC0FFD1FE00FF11F8EE2808344 -:1099D000EEEFFFEFEC0FFD1FE00FF11F1082BE0155 -:1099E0006F5F7F4F85E60E94DE22F11004C088EE93 -:1099F00090E10E942D1981EE90E10E942D1962E004 -:109A000070E084E89DE20E94FC228BED90E10E94D0 -:109A10002D196091912D70E087E89DE20E94FC2253 -:109A200085ED90E10E942D1961E070E086E89DE2ED -:109A30000E94FC2237C0BE016F5B7D4FC7018CDAEC -:109A40008823C9F18091742D813039F58091752D6D -:109A5000833009F4BDC028F4813059F0823099F088 -:109A6000DFC08A3031F008F4DBC08D50823058F00E -:109A7000D7C08091912D843009F4ACC0873009F0B3 -:109A8000CFC015E0AAC08091912D843009F4A4C004 -:109A9000873009F0C5C017E0A0C065E074E285E634 -:109AA0000E94DE221092B82C1092742D0E94742312 -:109AB0001092932D7CC0CF5BDD4F08811981C1547A -:109AC000D240B5C01092732D009709F475C09695D9 -:109AD0008795285F3F4F820F931F54E0880F991F8F -:109AE0005A95E1F70E94C123E091B12EF091B22E78 -:109AF00062857385CF01865A9E428F5F9F4F0E9479 -:109B0000DC5C60E070E085E60E94DE220115184012 -:109B100008F455C0B8E7AB2EB12C0AEF1CE260E8A0 -:109B2000E62EF12C71EE672E73E2772EEAE05E2EC0 -:109B3000FE0131966F01F7EE8F2EF3E29F2EFF921A -:109B4000EF927F926F921F925F92DF92CF920E946C -:109B50006556C6010E942819D8018C91CDBFDEBF81 -:109B6000882389F11F928F939F928F921F925F9209 -:109B7000DF92CF920E946556C6010E942819CDBF80 -:109B8000DEBF8AE491E10E942D19D8011D928D015A -:109B9000B0E1EB0EF11CC8018A5F9C428A159B055F -:109BA00070F21092932D1092B82C0E940E2C00E0AF -:109BB00010E03DC08C013BC00E94DC2395CFA8E2A1 -:109BC000AA2EB12CAACF6DE283E090E21FD6D9CFA6 -:109BD00011E003C014E001C016E06BE274E285E618 -:109BE0000E94DE22812F0E94F80DE0919E2EF091BE -:109BF0009F2E1995E091A82EF091A92E87E89DE25D -:109C00001995E091AE2EF091AF2E4091AC2E67E801 -:109C10007DE283E119950E948B100E940D1742CFBF -:109C200066E374E23CCF662309F40DCDFECCC80197 -:109C3000CE5BDD4FCDBFDEBFDF91CF911F910F9186 -:109C4000FF90EF90DF90CF90BF90AF909F908F905C -:109C50007F906F905F9008950F931F93CF93DF9342 -:109C6000CDB7DEB7EA97CDBFDEBF08E112E395D2EC -:109C7000F80181938F01F2E300321F07C1F70E94C0 -:109C8000DD1906D3882309F4FAC080911832909127 -:109C90001932953009F46FC030F4913069F168F0F1 -:109CA000933051F1ECC0983009F4C2C0993009F4F6 -:109CB000C8C0963009F0E3C072C0803891F0823895 -:109CC00009F0DDC080911C328F7087D2E091223282 -:109CD000F0912332118112FB112710F980E07DD21F -:109CE00006C0109114328091153281111260EAD2AF -:109CF000812F63D280E0A1C0282F2D7F09F0BFC043 -:109D0000882319F0823061F0BAC080911A32813014 -:109D100009F0B5C0933009F080E08093153227C078 -:109D200080911A32811123C0E0911C321E2F1F70C6 -:109D300009F4A5C0812F51D280911932833011F4DA -:109D4000EDD215C0E0912232F091233281818B7FD8 -:109D5000818324E8129FF0011124EA59FD4C1082FE -:109D6000E0912232F091233280818E7F808380E0E7 -:109D700034D2A8D264C0811182C010911A321F77E8 -:109D8000A1D28FD35FD28823E9F31093C3041111BA -:109D900002C082E001C083E08093173270C0805817 -:109DA000823008F06CC080911A3290911B328C3D49 -:109DB000E3E09E0761F583E08A838AE389834FB7F6 -:109DC000F894DE01139620E038E052E05093CA0187 -:109DD000E32FF0E0E4911092CA0120FF03C0E29566 -:109DE000EF703F5FEF708E2F90E0EA3010F0C79673 -:109DF00001C0C0968D939D932F5F2C3139F74FBFD3 -:109E000061D26AE370E0CE010196A5D00FC0AE0129 -:109E10004F5F5F4F60911C320E94090D8C01892BAE -:109E200071F150D2B80189819A8111D1A7D127C08F -:109E3000803829F547D280911332BFD186D131D3F2 -:109E40001EC081111CC080911A3290911B3299273B -:109E50000297ACF437D280911A328093133221D317 -:109E600080911332811106C08091C304811102C018 -:109E700081E001C084E0809317320E94D91908D292 -:109E8000882311F01FD24AD2EA96CDBFDEBFDF9100 -:109E9000CF911F910F9108950895CF93809117321C -:109EA000882351F0C091243280E097D1F1D1811103 -:109EB000D3DE8C2FCF9191C1CF910895CF92DF92B5 -:109EC000EF92FF920F931F93CF93DF93EC018B01DF -:109ED0007A01FDD2811136C0E114F10439F0F701A5 -:109EE00080819181081B190BC80FD91FC12CD12C5F -:109EF0000115110531F18091203290912132FC0140 -:109F0000EF5BFF4F208131978081281790F01DD1A2 -:109F1000C4DFE114F10449F0F70180819181C80E9A -:109F2000D91EC082D18285E00DC0D1D2882301F331 -:109F300009C0899142D101501109FFEFCF1ADF0A00 -:109F4000D7CF80E0DF91CF911F910F91FF90EF90DD -:109F5000DF90CF900895DF92EF92FF920F931F93BF -:109F6000CF93DF93D82FC92F8B0180912432806843 -:109F700034D180911E3290911F328017910728F0C2 -:109F80000115110519F4E1D001C08C01ED2EFC2E54 -:109F9000D12C0115110509F440C0809117328111AF -:109FA00002C082E04CC0853011F483E048C070D11B -:109FB000882311F081E043C051D181113CC042D1CE -:109FC000882339F3209124328091203290912132DC -:109FD000FC0127FF05C0EF5BFF4FC081D0E013C03D -:109FE000E05CFF4FC08131968081D0E0C81BD10971 -:109FF0000AC0C830D10550F4F70181917F01DDD04E -:10A000000150110921960115110599F7DD24D3940A -:10A01000289709F0D12C99D0BCCFD110BECF0BC05E -:10A0200080911732882309F4BCCF853009F4BDCF65 -:10A030002FD18111BFCF12D1882391F380E0DF911E -:10A04000CF911F910F91FF90EF90DF900895DF92D5 -:10A05000EF92FF920F931F93CF93DF93D82FC92FC7 -:10A060008B01809124328068B8D080911E3290910B -:10A070001F328017910728F00115110519F465D0DA -:10A0800001C08C01ED2EFC2ED12C0115110509F417 -:10A0900042C080911732811102C082E04EC08530EB -:10A0A00011F483E04AC0F4D0882311F081E045C068 -:10A0B000D5D081113EC0C6D0882339F320912432F7 -:10A0C0008091203290912132FC0127FF05C0EF5B87 -:10A0D000FF4FC081D0E015C0E05CFF4FC0813196DA -:10A0E0008081D0E0C81BD1090CC0C830D10560F414 -:10A0F000F701849162D0FFEFEF1AFF0A01501109B6 -:10A1000021960115110589F7DD24D394289709F0CC -:10A11000D12C1BD0BACFD110BCCF0BC0809117323D -:10A12000882309F4BACF853009F4BBCFB1D08111AF -:10A13000BDCF94D0882391F380E0DF91CF911F9120 -:10A140000F91FF90EF90DF900895E0912232F0910F -:10A150002332A0912032B0912132AF5BBF4F8C915E -:10A1600090E08283938380818D798083E091203297 -:10A17000F0912132EF5BFF4F10820895E09122327F -:10A18000F091233280818D798083E0912032F091AB -:10A190002132EF5BFF4F1082089580912032909121 -:10A1A0002132FC01EF5BFF4F208131E0320F308321 -:10A1B000FC01E20FF11D8081089520912032309141 -:10A1C0002132F901EF5BFF4F908141E0490F40835D -:10A1D000F901E90FF11D8083089580932432482FFF -:10A1E0004F7050E06091C6047091C7049A0194E0EA -:10A1F000220F331F9A95E1F7E4E887FF11C0E49F2F -:10A20000C001E59F900D112489599D4C8093203207 -:10A2100090932132C90108969B01280F391F0DC068 -:10A22000E49FC001E59F900D11248B5D9D4C8093B0 -:10A23000203290932132260F371F20932232309301 -:10A2400023320895809124328068C7DFE091223262 -:10A25000F091233280818695817008958091243217 -:10A260008F77BBDFA0912232B09123328C9185FF92 -:10A270000DC0E0912032F091213212968D919C9187 -:10A280001397E05CFF4F808381E0089580E008959C -:10A29000809124328F77A1DFA0912232B0912332B6 -:10A2A0008C9184FF0DC0E0912032F0912132129602 -:10A2B0008D919C911397E05CFF4F808381E008951E -:10A2C00080E00895809124328F7787DFE0912232F9 -:10A2D000F091233280818D788083E0912232F09159 -:10A2E0002332808181608083E0912032F09121329D -:10A2F000EF5BFF4F10828091243280686EDFE09127 -:10A300002232F0912332808181608083E09120327B -:10A31000F0912132EF5BFF4F10820895E0912232DD -:10A32000F0912332818184608183E0912232F09127 -:10A3300023328181807C803459F48091243280588A -:10A340004CDFE0912232F09123328181846081835D -:10A3500008951F93CF93DF93C82F162FD42F3DDF7F -:10A36000E0912232F09123321182E0912232F09179 -:10A3700023328C2F881F8827881F880F8083E091C5 -:10A380002232F09123321183E0912232F091233274 -:10A39000128213822091203230912132248335831E -:10A3A000CC0FCC0BCD23F901E05CFF4FC08331967D -:10A3B000108281E0DF91CF911F910895CF92DF92BB -:10A3C000EF92FF920F931F93CF93DF93C62E8C01D2 -:10A3D000D12CDC1409F43FC0F801D081D11104C0A4 -:10A3E000D3940B5F1F4FF5CFF801E180F28093818A -:10A3F0008481823010F488E001C088E128E030E0F8 -:10A40000C0E02E153F0520F4CF5F220F331FF9CF98 -:10A41000C82B8D2F8F70863010F080E01DC0CF7E4E -:10A42000F1E4EF16F104C8F7992321F0913021F4FB -:10A43000C06C0AC0C06403C0C068911105C04E2D35 -:10A440006C2F80E88D0F85DF4E2D6C2F8D2F81DFD7 -:10A450008111C6CFE2CF81E0DF91CF911F910F91A3 -:10A46000FF90EF90DF90CF90089580E090E0E09132 -:10A47000C604F091C7049C0144E0220F331F4A95A3 -:10A48000E1F7E20FF31F11864091C6045091C70413 -:10A49000FA01E20FF31F118201968630910539F718 -:10A4A00008958091183287FF0DC0D8DE811105C054 -:10A4B000809117328111F9CF09C060CE8091173297 -:10A4C000882321F0BFDE8823C9F33FCE08950F9380 -:10A4D0001F93CF93E091C604F091C704E05AFF4F59 -:10A4E00000811181C4E68091243287FF0AC0AADE70 -:10A4F000811105C080911732811105C022C080E012 -:10A5000025C0ACDEF5CF8530F1F0E0912232F0913C -:10A510002332818182FD19C0E091C604F091C70405 -:10A52000E05AFF4F808191810817190711F48C01BF -:10A53000DACF2FEF2C0FCC2311F0C22FF8CF84E00D -:10A5400005C082E003C083E001C081E0CF911F918C -:10A550000F91089563D069D0E0ECF4E081818E7FA3 -:10A56000818380818F778083109216320895CF93F4 -:10A57000DF93E0E4F0E014828481836084834ED032 -:10A5800054D0C0ECD4E088818F778883888180683C -:10A590008883109217321092133210921532109253 -:10A5A000143288818064888348E068E480E8D1DEE2 -:10A5B00048E068E480E0CDDE888580648887898112 -:10A5C00081608983DF91CF910895CF93DF933FB767 -:10A5D000F894C0ECD1E022E02A87EAE1F0E0E491CF -:10A5E000A0ECB4E0DA96EC93DA97EBE1F0E0E491DA -:10A5F000DB96EC93DB971A868EE395E38E7F1696B7 -:10A600008D939C93179785E18C9318962C933FBF5D -:10A6100081E080931632DF91CF91A9CFE0ECF4E096 -:10A6200080858370808711860895E0ECF4E08FEFD9 -:10A630008287848708951F920F920FB60F9211247C -:10A6400008B60F9218BE09B60F9219BE0BB60F923C -:10A650001BBE2F933F934F935F936F937F938F9383 -:10A660009F93AF93BF93EF93FF938091CA0487FFAB -:10A6700008C08091C80487FF04C080E88093CA04A2 -:10A680000BDC8091CA0486FF07C080E48093CA0473 -:10A69000109217320E94C8198091CA0485FF14C015 -:10A6A00080E28093CA0480911332882311F084E001 -:10A6B00007C08091C304811102C081E001C083E022 -:10A6C000809317320E94B7198091CA0484FF14C086 -:10A6D00080E18093CA0482E0809317321092133293 -:10A6E0001092C304C2DE48E068E480E832DE48E04D -:10A6F00068E480E02EDED0DBFF91EF91BF91AF9157 -:10A700009F918F917F916F915F914F913F912F9189 -:10A710000F900BBE0F9009BE0F9008BE0F900FBE9A -:10A720000F901F901895CF93DF93EC01FC0170966A -:10A730008BE0DF011D928A95E9F782E08C8389879F -:10A7400083E08E8761E0CE01019638DE882361F0D8 -:10A7500061E0CE01069632DE882331F061E0CE0161 -:10A760000B96DF91CF912ACE80E0DF91CF910895B3 -:10A770000F931F93CF93DF93209117322430E1F48E -:10A78000FC010489158926893789012B022B032BAB -:10A7900099F0EB01818121DDFE0101900020E9F7B4 -:10A7A0003197BF016C1B7D0B40E050E0CE01DF9183 -:10A7B000CF911F910F9182CB82E0DF91CF911F91BA -:10A7C0000F9108950F931F93CF93DF93209117322A -:10A7D0002430B1F4FC010489158926893789012BBD -:10A7E000022B032B69F08A01EB018181F6DC40E04A -:10A7F00050E0B801CE01DF91CF911F910F915ECB58 -:10A8000082E0DF91CF911F910F9108950F931F93D5 -:10A81000CF9320911732243009F5FC010489158962 -:10A8200026893789012B022B032BC1F0C62F81818A -:10A83000D4DC8091203290912132FC01EF5BFF4FFC -:10A84000208131978081281720F48C2FB6DC80E09E -:10A8500006C07BDC3CDE8823C1F301C082E0CF91DF -:10A860001F910F910895CF93DF93209117322430D9 -:10A8700091F5FC014489558966897789452B462BDA -:10A88000472B49F18181A9DC80912432209120322B -:10A8900030912132F90187FF05C0EF5BFF4F8081C6 -:10A8A00090E008C0E05CFF4F80813196408190E0ED -:10A8B000841B9109892B69F0F901EF5BFF4FD0816F -:10A8C0003197C08142DCDC1720F001DE811104C029 -:10A8D0003CDC80E001C082E0DF91CF910895CF930E -:10A8E000DF9320911732243099F4FC014489558973 -:10A8F00066897789452B462B472B51F0EC018181E6 -:10A900006CDCA0DC882321F0CE01DF91CF91ABCFAE -:10A91000DF91CF910895CF93DF93209117322430A8 -:10A9200019F08FEF9FEF46C0FC0144895589668975 -:10A930007789452B462B472BA1F386814EDC8EDC95 -:10A94000882379F380912432209120323091213272 -:10A95000F90187FF05C0EF5BFF4F808190E008C0E1 -:10A96000E05CFF4F80813196208190E0821B91094D -:10A97000892B21F012DCC82FD0E002C0CFEFDFEF2F -:10A98000209124328091203290912132FC0127FFC6 -:10A9900005C0EF5BFF4F208130E008C0E05CFF4F57 -:10A9A00020813196808130E0281B3109232B09F466 -:10A9B000E5DBCE01DF91CF9108950895FF920F93CB -:10A9C0001F93CF93DF93EC0163DC882309F48EC0DF -:10A9D000888190E020911C3230911D322817390770 -:10A9E00009F084C080911932813259F018F4803214 -:10A9F00049F17CC0823209F457C0833209F467C040 -:10AA000075C080911832813A09F070C05BDC1ADCA5 -:10AA10008823E9F38C89FD880E891F89CEDB8F2D71 -:10AA2000CCDB802FCADB812FC8DB888DC6DB898D0C -:10AA3000C4DB8A8DC2DB89DBDF91CF911F910F913F -:10AA4000FF902FCD80911832813209F04FC03ADC4F -:10AA500005DC811105C0809117328111F9CF46C004 -:10AA60009CDBF82E9ADB182F98DB082F96DB402F03 -:10AA700050E060E070E0BA0155274427782B4F2959 -:10AA8000512B4C8B5D8B6E8B7F8B87DB888F85DBAF -:10AA9000898F83DB8A8F72DB04DDCE01DF91CF915A -:10AAA0001F910F91FF9089CF809118328132F1F47C -:10AAB00009DCF7DC80911A3290911B32888B998BDC -:10AAC000CE01DF91CF911F910F91FF9076CF8091B2 -:10AAD0001832813259F4F6DBE4DC60911A32CE018F -:10AAE000DF91CF911F910F91FF9067CFDF91CF91B1 -:10AAF0001F910F91FF900895AA1BBB1B51E107C046 -:10AB0000AA1FBB1FA617B70710F0A61BB70B881FFD -:10AB1000991F5A95A9F780959095BC01CD0108958C -:10AB2000B7FF04C003D0821B930B089509D0A59FE3 -:10AB3000900DB49F900DA49F800D911D1124089538 -:10AB4000A29FB001B39FC001A39F700D811D11246E -:10AB5000911DB29F700D811D1124911D08958F923A -:10AB60009F92AF92BF92CF92DF92EF92FF92CF93DC -:10AB7000DF93EC01688179818A819B816115710580 -:10AB80008105910521F464E279ED8BE597E02DE1F3 -:10AB900033EF41E050E037D749015A019B01AC0146 -:10ABA000A7EAB1E4C3DF6B017C01ACEEB4EFA50111 -:10ABB0009401B8DFDC01CB018C0D9D1DAE1DBF1DC6 -:10ABC000B7FF03C00197A109B04888839983AA837E -:10ABD000BB839F77DF91CF91FF90EF90DF90CF9075 -:10ABE000BF90AF909F908F900895B9CF80E290E290 -:10ABF000B6CFA0E0B0E08093202090932120A093D6 -:10AC00002220B09323200895FB01DC0102C00590AF -:10AC10000D9241505040D8F70895FB01DC018D9111 -:10AC2000059080190110D9F3990B0895FB01DC01FF -:10AC30004150504048F005900D920020C9F701C0E6 -:10AC40001D9241505040E0F70895FB01DC0104C023 -:10AC50008D910190801921F441505040C8F7881B14 -:10AC6000990B0895FB01DC0102C001900D92415047 -:10AC70005040D8F708956817790768F4FB01DC01A4 -:10AC8000E40FF51FA40FB51F02C002900E924150B1 -:10AC90005040D8F70895E6CFDC0101C06D934150D4 -:10ACA0005040E0F70895FC018191861721F0882338 -:10ACB000D9F7992708953197CF010895FB01DC0159 -:10ACC00001900D920020E1F708950F931F93CF9309 -:10ACD000DF93CDB7DEB72E97CDBFDEBF0E891F89BC -:10ACE000888D998D26E02C8309831A8397FF02C0F3 -:10ACF00080E090E801978D839E83AE01445E5F4FB4 -:10AD00006A8D7B8DCE01019667D04D815E8157FDA6 -:10AD10000AC02F813885421753070CF49A01F801B5 -:10AD2000E20FF31F10822E96CDBFDEBFDF91CF91D1 -:10AD30001F910F9108950F931F93CF93DF93CDB77A -:10AD4000DEB72E97CDBFDEBF0E891F89888D998D06 -:10AD50002EE02C8309831A8397FF02C080E090E8DD -:10AD600001978D839E83AE01445E5F4F6A8D7B8D1C -:10AD7000CE01019631D04D815E8157FD0AC02F81F1 -:10AD80003885421753070CF49A01F801E20FF31FBC -:10AD900010822E96CDBFDEBFDF91CF911F910F9114 -:10ADA0000895CF93DF93CDB7DEB72E97CDBFDEBF2B -:10ADB0008DE08C838C899D8989839A83AE01485E5E -:10ADC0005F4F6E897F89CE010196A9D32E96CDBFA4 -:10ADD000DEBFDF91CF9108952F923F924F925F9205 -:10ADE0006F927F928F929F92AF92BF92CF92DF929B -:10ADF000EF92FF920F931F93CF93DF93CDB7DEB700 -:10AE00002B97CDBFDEBF6C017B018A01FC0116824E -:10AE10001782838181FFBFC1CE0101963C01F601FB -:10AE20009381F70193FD859193FF81917F018823A1 -:10AE300009F4ADC1853239F493FD859193FF819179 -:10AE40007F01853221F4B60190E0E7D4E8CF912C60 -:10AE5000212C312CFFE1F315D8F08B3279F038F446 -:10AE6000803279F08332A1F4232D20611DC08D3210 -:10AE700061F0803369F4232D216016C0832D826038 -:10AE8000382EE32DE4603E2E2AC0F32DF8601DC05D -:10AE900037FC2DC020ED280F2A3040F08E32B9F457 -:10AEA00036FC75C1232D2064322E19C036FE06C033 -:10AEB0008AE0989E200D1124922E11C0EAE02E9E69 -:10AEC000200D1124222EF32DF0623F2E08C08C3667 -:10AED00021F4832D8068382E02C0883641F4F701B2 -:10AEE00093FD859193FF81917F018111B3CF982FBD -:10AEF0009F7D9554933028F40C5F1F4F9FE39983F7 -:10AF00000DC0833631F0833771F0833509F055C0B9 -:10AF100020C0F801808189830E5F1F4F88248394AD -:10AF2000912C530112C02801F2E04F0E511CF80180 -:10AF3000A080B18036FE03C0692D70E002C06FEFC3 -:10AF40007FEFC50121D44C018201F32DFF773F2E05 -:10AF500015C0280122E0420E511CF801A080B180EA -:10AF600036FE03C0692D70E002C06FEF7FEFC501B0 -:10AF700000D44C01F32DF0683F2E820133FC19C040 -:10AF8000822D90E088169906A0F4B60180E290E048 -:10AF900044D42A94F5CFF50137FC859137FE819191 -:10AFA0005F01B60190E039D421102A9421E0821A81 -:10AFB00091088114910479F7E1C0843611F0893643 -:10AFC00039F5F80137FE07C0608171818281938174 -:10AFD0000C5F1F4F08C060817181072E000C880B29 -:10AFE000990B0E5F1F4FF32DFF763F2E97FF09C081 -:10AFF00090958095709561957F4F8F4F9F4FF0682A -:10B000003F2E2AE030E0A3015DD4882E861844C08C -:10B01000853731F4232D2F7EB22E2AE030E025C073 -:10B02000932D997FB92E8F36C1F018F4883579F0B9 -:10B03000AEC0803719F0883721F0A9C0E92FE06150 -:10B04000BE2EB4FE0DC0FB2DF460BF2E09C034FE31 -:10B050000AC0292F2660B22E06C028E030E005C0C5 -:10B0600020E130E002C020E132E0F801B7FE07C085 -:10B0700060817181828193810C5F1F4F06C0608166 -:10B08000718180E090E00E5F1F4FA3011BD4882EDA -:10B090008618FB2DFF773F2E36FE0DC0232D2E7F09 -:10B0A000A22E891458F434FE0BC032FC09C0832D43 -:10B0B0008E7EA82E05C0B82CA32C03C0B82C01C0CE -:10B0C000B92CA4FE0FC0FE01E80DF11D8081803374 -:10B0D00021F49A2D997EA92E09C0A2FE06C0B39430 -:10B0E000B39404C08A2D867809F0B394A3FC10C0F1 -:10B0F000A0FE06C0B21480F4280C922C9B180DC040 -:10B10000B21458F4B60180E290E087D3B394F8CF3C -:10B11000B21418F42B1802C0982C212CA4FE0FC0D6 -:10B12000B60180E390E079D3A2FE16C0A1FC03C073 -:10B1300088E790E002C088E590E0B6010CC08A2D57 -:10B14000867851F0A1FE02C08BE201C080E2A7FC2C -:10B150008DE2B60190E061D3891430F4B60180E34A -:10B1600090E05BD39A94F8CF8A94F301E80DF11D37 -:10B170008081B60190E051D38110F6CF222009F4EE -:10B180004ECEB60180E290E048D32A94F7CFF60184 -:10B190008681978102C08FEF9FEF2B96CDBFDEBFD8 -:10B1A000DF91CF911F910F91FF90EF90DF90CF90A3 -:10B1B000BF90AF909F908F907F906F905F904F90D7 -:10B1C0003F902F90089520FD09C0FC0123FD05C08C -:10B1D00022FF02C07383628351834083089544FD3C -:10B1E00017C046FD17C0AB01BC01DA01FB01AA0F75 -:10B1F000BB1FEE1FFF1F1094D1F74A0F5B1F6E1F7E -:10B200007F1FCB01BA01660F771F881F991F09C0E6 -:10B2100033E001C034E0660F771F881F991F31505B -:10B22000D1F7620F711D811D911D08950F931F931A -:10B23000CF93DF938C01C801B2D2EC0197FD06C019 -:10B2400085D2892BC1F7B801CE0123D3CE01DF917E -:10B25000CF911F910F9108958F929F92AF92BF92BD -:10B26000EF92FF920F931F93CF93DF938C01D62F12 -:10B270007A01B22E94D29C0133272B32310531F062 -:10B280002D32310559F48B2D8068B82ED15011F430 -:10B2900080E061C0C80183D297FDFACFCB2DCD7F6E -:10B2A0002B2D2073F9F48033E9F4AA24AA94AD0E6F -:10B2B00009F43EC0C80173D297FD3AC09C012F7DAE -:10B2C00033272835310541F4C264D25089F1C801D1 -:10B2D00066D297FF07C02CC0B6FE02C0C26001C094 -:10B2E000C261DA2D812C912C540120ED280F2830D9 -:10B2F00078F0C4FF03C0B801CCD217C02A3040F0A8 -:10B30000C6FFF9CF2F7D3FEE320F3630A0F7275022 -:10B310004C2FC501B40163DF4B015C01C260D15009 -:10B3200051F0C8013CD297FFE0CFC1FD04C0B0CFBF -:10B33000812C912C5401C7FF08C0B094A094909424 -:10B340008094811C911CA11CB11C2C2FB501A4015F -:10B35000C70139DF81E0DF91CF911F910F91FF90FD -:10B36000EF90BF90AF909F908F9008955F926F92F3 -:10B370007F928F929F92AF92BF92CF92DF92EF9285 -:10B38000FF920F931F93CF93DF93CDB7DEB7A097B4 -:10B39000CDBFDEBF5C01962E7A01F9018E010F5FF1 -:10B3A0001F4F680180E2D8011D928A95E9F7D50107 -:10B3B00013968C9080E090E0612C712C30E061E07D -:10B3C00070E083FC259183FE21918F01522E211183 -:10B3D00003C080E090E090C02E3511F4009751F149 -:10B3E000432F50E0481759073CF42D3559F12D32C1 -:10B3F00019F4772009F103C0772009F468C0452DBE -:10B40000469546954695D601A40FB11D452D47702A -:10B410008B0102C0000F111F4A95E2F7A8015C9151 -:10B42000452B4C93651459F0561410F45394E7CF00 -:10B430005A94E5CF31E004C07724739401C0712C95 -:10B440000196BFCF772019F08E8180628E833111F3 -:10B4500003C08824839417C0F6019E012F5D3F4FDF -:10B460008081809581932E173F07D1F7F2CFE114A9 -:10B47000F10429F0D7018C93F70131967F019A945A -:10B48000812C9920E9F0C5018AD197FD17C0FC01F4 -:10B49000FF2723E0F595E7952A95E1F7EC0DFD1DD3 -:10B4A000208130E0AC014770552702C035952795C3 -:10B4B0004A95E2F720FDDBCFB501EBD1811089CFB2 -:10B4C000E114F10411F0D7011C92C80115C0422FFC -:10B4D000469546954695D601A40FB11D422F47705B -:10B4E0008B0102C0000F111F4A95E2F7A8015C9181 -:10B4F000452B4C93622EA4CFA096CDBFDEBFDF912B -:10B50000CF911F910F91FF90EF90DF90CF90BF9060 -:10B51000AF909F908F907F906F905F9008955F9213 -:10B520006F927F928F929F92AF92BF92CF92DF9253 -:10B53000EF92FF920F931F93CF93DF936C01EB0178 -:10B540005A01FC0116821782512CF601E380FE019C -:10B55000E3FC8591E3FE8191182FEF01882309F424 -:10B56000E0C090E0F3D0892B19F0C6015FDEEDCF8B -:10B57000153241F4FE01E3FC1591E3FE1191EF0158 -:10B58000153271F4C6010BD197FDC9C0412F50E0AF -:10B590009C01332724173507C1F2B6017AD1C1C007 -:10B5A0001A3239F4E3FC1591E3FE1191EF0101E049 -:10B5B00001C000E0F12C20ED210F2A3078F4026068 -:10B5C0006F2D70E080E090E040E209DEF62EFE0193 -:10B5D000E3FC1591E3FE1191EF01EDCF01FF03C0F4 -:10B5E000F11003C09EC0FF24FA94183619F01C36DF -:10B5F00051F010C0FE01E3FC1591E3FE1191EF0143 -:10B60000183641F408600460FE01E3FC1591E3FE86 -:10B610001191EF01112309F484C0612F70E08CEFC8 -:10B6200091E09CD0892B09F47CC000FD07C0F50196 -:10B6300080809180C50102965C0102C0812C912C12 -:10B640001E3649F4F6014681578160E070E0202FF4 -:10B65000C401B9DD7ACF1336A1F401FD02C0FF2485 -:10B66000F394C6019CD097FD5AC08114910429F02F -:10B67000F4018083C40101964C01FA94F110F1CFDA -:10B680004AC01B3551F49E01A4016F2DC6016EDE28 -:10B69000EC01892B09F03FC039C0C601C7DD97FD19 -:10B6A0003EC01F3649F128F4143621F1193639F11C -:10B6B00025C0133771F01537E9F020C081149104CB -:10B6C00029F0F4016082C40101964C01FA94FF2034 -:10B6D00059F0C60164D03C0197FD06C037D0892BD4 -:10B6E00069F3B601C301D5D081149104A1F0F4012E -:10B6F000108211C0006203C0006101C00064202FED -:10B70000A4016F2DC601A8DD811105C0F60183815A -:10B71000807329F406C000FD18CF539416CF55202E -:10B7200019F0852D90E002C08FEF9FEFDF91CF9150 -:10B730001F910F91FF90EF90DF90CF90BF90AF904F -:10B740009F908F907F906F905F900895911118C196 -:10B75000803219F089508550D0F70895FC0105908A -:10B76000061621F00020D9F7C00108953197CF01C6 -:10B770000895FC010590615070400110D8F7809544 -:10B7800090958E0F9F1F0895FC01615070400190AD -:10B790000110D8F7809590958E0F9F1F0895CF9335 -:10B7A000DF93EC012B8120FF33C026FF0AC02F7BE3 -:10B7B0002B838E819F8101968E839F838A8190E067 -:10B7C00029C022FF0FC0E881F9818081082E000C7A -:10B7D000990B009719F420622B831AC03196E883E5 -:10B7E000F9830EC0EA85FB85199597FF09C02B8167 -:10B7F000019611F080E201C080E1822B8B8308C0AA -:10B800002E813F812F5F3F4F2E833F83992702C0B8 -:10B810008FEF9FEFDF91CF9108950F931F93CF93F9 -:10B82000DF93FB01238121FD03C08FEF9FEF2CC02D -:10B8300022FF16C046815781248135814217530764 -:10B8400044F4A081B1819D012F5F3F4F208331835C -:10B850008C93268137812F5F3F4F2683378314C017 -:10B860008B01EC01FB010084F185E02D1995892BFA -:10B87000E1F6D80116968D919C9117970196169630 -:10B880008D939C931797CE01DF91CF911F910F91CC -:10B890000895FB01238120FF12C026FD10C08F3FB9 -:10B8A0003FEF930761F082832F7D206423832681FD -:10B8B00037812150310926833783992708958FEFE7 -:10B8C0009FEF0895FA01AA27283051F1203181F124 -:10B8D000E8946F936E7F6E5F7F4F8F4F9F4FAF4F98 -:10B8E000B1E03ED0B4E03CD0670F781F891F9A1FAB -:10B8F000A11D680F791F8A1F911DA11D6A0F711D5F -:10B90000811D911DA11D20D009F468943F912AE06A -:10B91000269F11243019305D3193DEF6CF01089552 -:10B92000462F4770405D4193B3E00FD0C9F7F6CF83 -:10B93000462F4F70405D4A3318F0495D31FD40524B -:10B94000419302D0A9F7EACFB4E0A69597958795E1 -:10B9500077956795BA95C9F70097610571050895C0 -:10B960009B01AC010A2E069457954795379527956C -:10B97000BA95C9F7620F731F841F951FA01D089504 -:10B9800099278827089503D0808199270895E0ECAE -:10B99000F1E0378537FDFDCF348538603487FC0111 -:10B9A000E050F04F0895262FF2DF0080021611F0CC -:10B9B00008D00197019708950196272FF5DFF3CF5F -:10B9C000262FE0ECF1E0378537FDFDCF3485377F5A -:10B9D0003487378531FF09C036E3328738ED34BF0D -:10B9E00031E03387378537FDFDCF33E332878083FE -:10B9F00091831282248325E3228728ED31E024BF3E -:10BA0000338701960895052E97FB16F400940FD006 -:10BA100057FD05D014D007FC02D046F408C050955D -:10BA20004095309521953F4F4F4F5F4F089590952A -:10BA30008095709561957F4F8F4F9F4F0895A1E23C -:10BA40001A2EAA1BBB1BFD010DC0AA1FBB1FEE1F98 -:10BA5000FF1FA217B307E407F50720F0A21BB30BE3 -:10BA6000E40BF50B661F771F881F991F1A9469F75F -:10BA700060957095809590959B01AC01BD01CF01BB -:06BA80000895F894FFCFC9 -:10BA860002400F008310000001041000000182082C -:10BA9600000001000000000000000000000001009E -:10BAA60001000000000000000925102510251C25B6 -:10BAB600282532254F255D25862589258D253E009D -:10BAC6000426140004043E00042E040C040400089A -:10BAD6000008000000000000000800080808080828 -:10BAE6000800080008000000080800080808008090 -:10BAF60000800000000000000080008080808080C0 -:10BB0600800080008000000080800080808000012E -:10BB16000001000000000000000100010101010118 -:10BB26000100010001000000010100010101000007 -:10BB360000000000000000000000000000000101FD -:10BB460001010101010101010101010101010101DF -:10BB560001010101010101010101010101010101CF -:10BB660001010101010101010101010101010000C1 -:10BB760000000000000000000000000000000000BF -:10BB860000000000000000000000000000000000AF -:10BB9600000000000000000000000000000001019D -:10BBA6000101010101010101010101010101000081 -:10BBB600000000000000000000000000000000007F -:10BBC600000000000000000000000000000001016D -:10BBD6000101010101010101010101010101000051 -:10BBE600000000000000000000000000000001014D -:10BBF600010101010101010101010101010101012F -:10BC06000101010101010101010101010101000020 -:10BC1600000000000000000000000000000001011C -:10BC26000101010101010101010101010101000000 -:10BC360000020200000200020202020000020000EE -:10BC460000020200000200020202020000020000DE -:10BC560000020200000200020202020000020404C6 -:10BC6600040606040406040606060604040604047E -:10BC76000406060404060406060606040406000076 -:10BC8600000202000002000202020200000200009E -:10BC96000002020000020002020202000002040486 -:10BCA6000406060404060406060606040406000046 -:10BCB6000002020000020002020202000002040466 -:10BCC600040606040406040606060604040604041E -:10BCD600040606040406040606060604040604040E -:10BCE60004060604040604060606060404060404FE -:10BCF60004060604040604060606060404060000F6 -:10BD0600000202000002000202020200000200001D -:10BD16000002020000020002020202000002040405 -:10BD260004060604040604060606060404060008BD -:10BD360008080000000800000800080800080008BD -:10BD460008080000000800000800080800080008AD -:10BD5600080800000008000008000808000810187D -:10BD6600181810101018101018101818101810188D -:10BD7600181810101018101018101818101800089D -:10BD8600080800000008000008000808000800086D -:10BD9600080800000008000008000808000810183D -:10BDA600181810101018101018101818101800086D -:10BDB600080800000008000008000808000810181D -:10BDC600181810101018101018101818101810182D -:10BDD600181810101018101018101818101810181D -:10BDE600181810101018101018101818101810180D -:10BDF600181810101018101018101818101800081D -:10BE060008080000000800000800080800080008EC -:10BE160008080000000800000800080800081018BC -:10BE26001818101010181010181018181018434C65 -:10BE36004F4E4500546F6F206D616E7920646174BA -:10BE4600612E000D0A000D0A5041524954592045F1 -:10BE560052524F52000D0A504152495459204F4BED -:10BE6600002534753A200025337500556E6B6E6FCC -:10BE7600776E206361726420747970652E00257375 -:10BE8600206F7220004D756C7469706C6520706F40 -:10BE960073736962696C69746965732C206E6F745B -:10BEA60020636C6F6E61626C652100436C6F6E651A -:10BEB60064204F4B2100436C6F6E6520756E737561 -:10BEC60070706F7274656421004E4F204441544176 -:02BED60000006A +:1018C00080932206C093310612E0109332061092E4 +:1018D0002A0610922B068FE08093290689E58093D3 +:1018E00080019AE5909381018093820180E4809346 +:1018F0004106809346069091B200907F9093B2008B +:101900009091B20092609093B20090E39093410660 +:101910009093460680935006C09346061093450662 +:1019200003E00093410683E18093010821E030E069 +:1019300020932608309327082093280830932908FD +:1019400010928C0880938008109223031092210338 +:10195000D8E0D093220381E180932003E0913E2FD1 +:10196000F0913F2F828593858093380390933903BC +:101970008CE380938203D093800380938303D0937E +:10198000810366D10E944919B7D117D7C0930002CD +:10199000109201021093020200930402C0932002ED +:1019A000D09321020E949E1517D1D2E0C1E180910F +:1019B000030481FF25C08091010480FDFCCFD093FA +:1019C00003040E94AB17AED10E947C19FED60E9480 +:1019D0000617E0912F2FF091302F19950E94A02229 +:1019E0000E94E818E0913E2FF0913F2F87818130CF +:1019F00011F4C093632C8681813011F4C093622C62 +:101A00000E944D199CD7E0912D2FF0912E2F199502 +:101A1000E091272FF091282F1995C9CF292F33272F +:101A20002230310559F02330310569F0213031057C +:101A3000E9F482E190E026E932E01CC08EE390E018 +:101A400028E532E017C099278130910549F028F048 +:101A5000029761F4E8E0F2E005C0E4E5F2E002C0DC +:101A6000E8E2F2E0849190E09F0104C080E090E021 +:101A700020E030E0FA012083318308951F920F9215 +:101A80000FB60F92112408B60F9218BEFFCF1F9207 +:101A90000F920FB60F92112408B60F9218BE8F93B3 +:101AA0009F938EB19FB180589F4F8EB99FB99F91E0 +:101AB0008F910F9008BE0F900FBE0F901F9018953A +:101AC0008091780083FF0AC088E08093780088EDD9 +:101AD00084BF81E0809380000D94FE008BEC8093A6 +:101AE0005200809150008860809350008091510096 +:101AF00083FFFCCF82EC8093550080915000806181 +:101B0000809350008091510084FFFCCF88ED84BF0A +:101B100084E0809340001EB81FB881E080934300AA +:101B20002FE730E020930A0430930B0420930C0439 +:101B300030930D04809300048093020480E8809326 +:101B40000001089588ED84BF81E0809379000895B5 +:101B500088ED84BF8BE180938000089580915000D0 +:101B60008260809350008091510081FFFCCF82E021 +:101B70008093CA01EDE1F0E0E491E0936200ECE1D2 +:101B8000F0E0E491E09363001092CA0180E8809352 +:101B900065008BEB8093660080915600897F80936F +:101BA00056008091560084608093560080916000BA +:101BB0008160809360000895E0E4F0E084818E7F8E +:101BC0008483E0E6F0E080818E7F8083E0E5F0E0D2 +:101BD00080818D7F8083089587E08093A200789430 +:101BE0000895089580E090E0089508950895089577 +:101BF000089508950895089508950F931F93CF931E +:101C0000C82F03E21FE2D8011296ED91FC911397C1 +:101C100019950E94D822E0913E2FF0913F2FC58365 +:101C2000B8E1CB9FB001112468557D4F48E150E0E9 +:101C3000C8010E94165CD801ED91FC911995D8015C +:101C40001696ED91FC911797CF911F910F911994D2 +:101C500048E150E068EA72E083E29FE20E94165C8D +:101C6000E0913E2FF0913F2F8581C7CF0F931F93B7 +:101C7000E0913E2FF0913F2F8B019C0145816AE05E +:101C800088E993E00E9484181F910F910895FF92B4 +:101C90000F931F93CF93DF931F92CDB7DEB78C01C5 +:101CA0009E012F5F3F4FAC016AE088E993E00E94FC +:101CB0009C18F82E882389F089819FDFF80140E085 +:101CC0008191882319F04F5F4F31D1F7E0913B2F7D +:101CD000F0913C2FB80181E119958F2D0F90DF9184 +:101CE000CF911F910F91FF9008959B01AC016AE085 +:101CF00088E993E00C94C31808950C94085C089547 +:101D00000F931F93CF938C01C62FCC2339F00E94E1 +:101D1000085CF80181938F01C150F7CFCF911F91DB +:101D20000F9108950E94085C0E94085C0E94085C64 +:101D30000C94085CCF93DF93EC0161507109DA01D8 +:101D4000420F531FFC01CF018C1B9D0BA417B5073D +:101D500021F41082DF91CF91089562307105C8F3AC +:101D60009D91392F32953F703A3010F4305D01C0AB +:101D7000395C30839F709A3010F4905D01C0995C9B +:101D80009183329662507109DECFCF93DF93EC01DD +:101D9000DA0120E030E05C91552351F111969C91DD +:101DA0001197992339F12617370711F180ED850F27 +:101DB0008A3020F08FEB850F8630E0F480ED890FBC +:101DC0008A3020F04FEB490F4630A0F4E52FF0E0C9 +:101DD000513408F0F797E295E07F913410F4982F92 +:101DE00001C097539E2B99932F5F3F4F1296D3CFED +:101DF000C90102C080E090E0DF91CF910895E0E654 +:101E0000F6E080E1858382E0868388E085838AE14D +:101E10008183E0EAF9E01682178280EC858388E10D +:101E20008483E0E0F1E0128A8BE6838B148A158AC2 +:101E300020EA208F99E0918F128E148E158E168EC7 +:101E400084E0808B12A23CE633A314A215A210A654 +:101E500011A612A624A795A716A680A3089541153A +:101E6000510509F449C020E12093660623E0209340 +:101E7000A0092091A10927FFFCCF2091A009709310 +:101E8000A0092091A10927FFFCCF2091A009609310 +:101E9000A0092091A10927FFFCCF2091A00921E0F2 +:101EA0002093120180931C0190931D014093140113 +:101EB00050931501109222018AE594E28093280143 +:101EC00090932901409324015093250180911001A2 +:101ED00080688093100180912001806880932001A8 +:101EE0008091100187FDFCCF80E3809311018093E6 +:101EF000210180E18093650608954115510509F49B +:101F000069C020E12093660626E02093A009209175 +:101F1000A10927FFFCCF2091A00920E120936506AD +:101F2000000000002093660622E02093A009209183 +:101F3000A10927FFFCCF2091A0097093A00920914F +:101F4000A10927FFFCCF2091A0096093A00920914F +:101F5000A10927FFFCCF2091A009109212012AE5C8 +:101F600034E220931C0130931D01409314015093DF +:101F7000150120E1209322018093280190932901EB +:101F80004093240150932501809110018068809333 +:101F900010018091200180688093200180911001C0 +:101FA00087FDFCCF80E3809311018093210180E1C4 +:101FB00080936506E0913E2FF0913F2F8781863018 +:101FC00019F481E18093632C8681863019F481E1D4 +:101FD0008093622C0895CF92DF92EF92FF92CF937D +:101FE000DF93C0903D2FD12CE12CF12C8DE0CC0C57 +:101FF000DD1CEE1CFF1C8A95D1F7C114D10481E0D1 +:10200000E806F10408F04EC080E18093660686E0A1 +:102010008093A0098091A10987FFFCCF8091A0093E +:1020200080E180936506000000008093660682E0F0 +:102030008093A0098091A10987FFFCCF8091A0091E +:102040001092A0098091A10987FFFCCF8091A0097F +:102050001092A0098091A10987FFFCCF8FEFE81AA9 +:10206000F80A8091A009C0E0D0E1C701B60199DB70 +:102070008093A0098091A10987FFFCCF8091A009DE +:102080009093A0098091A10987FFFCCF8091A009BE +:1020900082E0C80ED11CE11CF11C219731F780E1D0 +:1020A000809365068091010480FDFCCF82E08093DF +:1020B0000304DF91CF91FF90EF90DF90CF900895D0 +:1020C000CF92DF92EF92FF92CF93DF93C0903D2F9C +:1020D000D12CE12CF12C8DE0CC0CDD1CEE1CFF1C76 +:1020E0008A95D1F7C114D10481E0E806F10438F0F3 +:1020F000DF91CF91FF90EF90DF90CF906CCF8FEF7B +:10210000E81AF80AC1E2D0E0219791F365DBC70134 +:10211000B6014EDB61DB8FEFD81AE80AF80AF4CF7C +:10212000CF92DF92EF92FF920F931F93CF93DF93A3 +:10213000C0903D2FD12CE12CF12C8DE0CC0CDD1C7E +:10214000EE1CFF1C8A95D1F7C114D10481E0E8068A +:10215000F10408F04FC080E18093660683E080932D +:10216000A0098091A10987FFFCCF8091A00910925E +:10217000A0098091A10987FFFCCF8091A00910924E +:10218000A0098091A10987FFFCCF8FEFE81AF80A18 +:102190008091A00901E210E00150110941F11CDB1E +:1021A00018DB1ADBC0E0D0E01092A0098091A109F1 +:1021B00087FFFCCF6091A00970E01092A009809188 +:1021C000A10987FFFCCF8091A009782BCE01F6DA18 +:1021D00003DB2296C11581E0D80731F7C701B601AC +:1021E000F2DAFADA8FEFD81AE80AF80AD5CF80E1E6 +:1021F00080936506E0913E2FF0913F2F87818630D6 +:1022000019F490E19093632C9681963049F420E183 +:102210002093622C853059F483E18093632C02C0B3 +:102220008530D1F3953019F483E18093622C80914D +:10223000010480FDFCCF82E080930304DF91CF9105 +:102240001F910F91FF90EF90DF90CF900895CF9264 +:10225000DF92EF92FF920F931F934115E0E25E072A +:102260006105710508F06BC06901E12CF12C00E0FB +:1022700010E220E030E0041B150B260B370BC016D4 +:10228000D106E206F30610F49701860120E12093BF +:10229000660626E02093A0092091A10927FFFCCF24 +:1022A0002091A00920E12093650600000000209302 +:1022B000660622E02093A0092091A10927FFFCCF08 +:1022C0002091A0095093A0092091A10927FFFCCFDC +:1022D0002091A0094093A0092091A10927FFFCCFDC +:1022E0002091A009109212012AE534E220931C01EA +:1022F00030931D01009314011093150120E12093E8 +:1023000022018093280190932901009324011093C6 +:102310002501809110018068809310018091200137 +:102320008068809320018091100187FDFCCF80E3BD +:10233000809311018093210180E18093650681E003 +:102340001F910F91FF90EF90DF90CF900895CF9263 +:10235000DF92EF92FF920F931F934115E0E25E0729 +:102360006105710508F05DC06901E12CF12C00E008 +:1023700010E220E030E0041B150B260B370BC016D3 +:10238000D106E206F30610F49701860120E12093BE +:10239000660623E02093A0092091A10927FFFCCF26 +:1023A0002091A0095093A0092091A10927FFFCCFFB +:1023B0002091A0094093A0092091A10927FFFCCFFB +:1023C0002091A00921E02093120180931C01909399 +:1023D0001D010093140110931501109222018AE54A +:1023E00094E2809328019093290100932401109393 +:1023F0002501809110018068809310018091200157 +:102400008068809320018091100187FDFCCF80E3DC +:10241000809311018093210180E18093650681E022 +:1024200001C080E01F910F91FF90EF90DF90CF905F +:1024300008958091CF0187FDFCCF0895FADF809148 +:10244000CF0181FF0BC086E38093CA01EBECF1E082 +:1024500021E030E088ED90E084BF20830895EF9282 +:10246000FF920F931F93CF93DF93EC017B018A01BF +:102470001092C201DEDFD701CE01800F911F26E04E +:1024800048ED50E061E070E0EBECF1E0C817D907EF +:1024900079F0C093C0013D2F3F713093C10120936B +:1024A000CA0144BF60833091C4013D932196EECFB1 +:1024B000C801DF91CF911F910F91FF90EF90089588 +:1024C0003F924F925F926F927F928F929F92AF92C4 +:1024D000BF92CF92DF92EF92FF920F931F93CF9311 +:1024E000DF938B01542E652E282F2F71722EEC0155 +:1024F000C21BD109A3DF9DDF83E38093CA01109241 +:10250000C1011092C2017801052D162D85E3482ED8 +:1025100098EDC92ED12C88248394912C3BECA32ECA +:10252000BB24B39443E3342E0115110501F17092DD +:10253000C001F70181917F018093C401015011090D +:1025400021F07394F0E27F12EFCFC093C0018D2F82 +:102550008F718093C1014092CA01C601F50184BF09 +:102560008082A09666DF3092CA01712CDDCF852D66 +:10257000962DDF91CF911F910F91FF90EF90DF90FB +:10258000CF90BF90AF909F908F907F906F905F9013 +:102590004F903F9008951F93CF93DF93CDB7DEB751 +:1025A000A097CDBFDEBF863009F4EAC0D0F48330F7 +:1025B00009F46AC028F4813059F18230C9F1F6C0BB +:1025C000843009F486C0853009F0F0C0E091332FE3 +:1025D000F091342FCE01019619958091392F41E069 +:1025E000A4C0893009F4D0C040F4873009F4CAC0CF +:1025F000883009F0DBC0EFDCD9C08A3009F4D5C0DF +:102600008B3009F0D3C080EB93E20E94D621CEC07C +:1026100010E08091392F181708F09FC06EDBE1E0C1 +:10262000F0E0EC0FFD1FE10FF11D80831F5FF1CF84 +:1026300011E08091392F873009F010E0E091332FBD +:10264000F091342FCE01019619954091392F31E048 +:10265000141708F082C03323A9F0812F90E0E1E045 +:10266000F0E0EC0FFD1FE80FF91F208131E02F3F54 +:1026700009F030E0E1E0F0E0EC0FFD1FE80FF91F9A +:102680002F5F20831F5FE4CFE091332FF091342F31 +:10269000CE01019619958091392F41E0815008F4BF +:1026A0005CC04423D9F3282F30E0E1E0F0E0EC0FE8 +:1026B000FD1FE20FF31F908141E09F3F09F040E0D2 +:1026C000E1E0F0E0EC0FFD1FE20FF31F9F5F90834E +:1026D000E5CF11E08091392F873009F010E0E091CB +:1026E000332FF091342FCE01019619954091392F57 +:1026F00031E0141790F53323A1F0812F90E0E1E051 +:10270000F0E0EC0FFD1FE80FF91F208131E02111EF +:1027100030E0E1E0F0E0EC0FFD1FE80FF91F215081 +:1027200020831F5FE6CF411103C08150E0F715C041 +:10273000282F30E0E1E0F0E0EC0FFD1FE20FF31F87 +:10274000908141E0911140E0E1E0F0E0EC0FFD1FED +:10275000E20FF31F91509083E8CFE091352FF09175 +:10276000362FCE0101961995E0913B2FF0913C2F29 +:102770004091392FBE016F5F7F4F83E1199516C0DD +:10278000B0D314C0CDDC12C080910008813021F498 +:1027900090918C08933009F080E080FD03C00E9486 +:1027A000622304C00E94882301C0AAD2A096CDBF94 +:1027B000DEBFDF91CF911F910895E0E0F6E080E663 +:1027C000828388E1868B858B0895CF93C09108061C +:1027D000C095C6FF12C080915C248A3050F08A30C8 +:1027E000E1F4E0913E2FF0913F2F8181D4DE809182 +:1027F0005C248F5F80935C2410C08C2F807669F4FA +:1028000080915C2481508A3030F4E0913E2FF09129 +:102810003F2F8081C0DE10925C24C5FF12C08091E2 +:102820005B248A3050F08A30D9F4E0913E2FF09149 +:102830003F2F8381B0DE80915B248F5F80935B2488 +:102840000FC0C07669F480915B2481508A3030F4E7 +:10285000E0913E2FF0913F2F82819DDE10925B240C +:10286000CF9108959B01AC016CE082EE96E08BC4A1 +:10287000E82FF0E0E35CF04D88E0638381503C9604 +:102880008111FBCF08950F931F939B01E0913E2F81 +:10289000F0913F2FE80FF11D8A0140816CE082EE3C +:1028A00096E032D41F910F9108950F931F93CF9309 +:1028B000DF931F92CDB7DEB7082FAB019E012F5FCC +:1028C0003F4F6CE082EE96E037D4182F882319F042 +:1028D0006981802FCDDF812F0F90DF91CF911F91E4 +:1028E0000F9108950895EF92FF920F931F93CF9346 +:1028F0007B01C42F0EB11FB120910804309109044F +:10290000022B132B682F83E090E20E94185A6C2F41 +:1029100083E090E20E94185A612F83E090E20E94C7 +:10292000185A602F83E090E20E94185A6C2F70E0D2 +:10293000C701CF911F910F91FF90EF90A4C408950C +:102940003F924F925F926F927F928F929F92AF923F +:10295000BF92CF92DF92EF92FF920F931F93CF938C +:10296000DF937C01E901C0900020D0900120960106 +:1029700022503843C901A0E0B0E0481759076A0760 +:102980007B0708F05FC0E2E0CE1AE0E4DE0A2A012D +:102990003B014C0E5D1E611C711C481659066A06EF +:1029A0007B0648F0241B350B8E01021B130BE9013B +:1029B0003324339403C000E010E0312C4601A12CF5 +:1029C000B12C481559056A057B0510F5CA018E5FC3 +:1029D0009F4B2A013B014C0E5D1E611C711C48146B +:1029E00059046A047B0428F4AE01BC01C70137DA3C +:1029F00018C0C41AD50AA601BC01C70130DAAE015D +:102A00004C195D0962E674E2C7018C0D9D1D07C07B +:102A10004C195D09BA016E597B4DAE01C7010E9488 +:102A2000445C332041F00C0F1D1FF701E00FF11F34 +:102A3000CE0DDF1D02C081E006C0EC17FD07D9F303 +:102A40001292FBCF80E0DF91CF911F910F91FF9009 +:102A5000EF90DF90CF90BF90AF909F908F907F903E +:102A60006F905F904F903F90089520915E24309139 +:102A70005F2480E098E0821B930BE2E6F4E29F0182 +:102A8000225634422817390710F41192F8CF82E603 +:102A900094E2809360249093612480E098E0809396 +:102AA0005E2490935F2482E090E4809300209093D2 +:102AB000012042E050E060E070E480E090E21DDA46 +:102AC000E0913E2FF0913F2F87818A3019F480E109 +:102AD0008093632C86818A3019F480E18093622C84 +:102AE000089580915E2490915F2490582091002059 +:102AF00030910120821B930B0895EDE3FFE2878361 +:102B00003C969FE2ED39F907D1F7813049F018F092 +:102B1000823059F0089510925D2482E794E109C053 +:102B200080935D2489EF95E104C010925D2483E7D2 +:102B300094E180933B2F90933C2F08950F931F9324 +:102B4000CF93DF931F92CDB7DEB7E0913E2FF09188 +:102B50003F2F8481D2DF82E694E2809360249093B9 +:102B6000612400E018E000935E2410935F2441E0AC +:102B700050E0BE016F5F7F4F80E090E070DCE0913D +:102B80006024F0916124DF01C8011D920197E9F7EB +:102B90008981882341F042E050E060E070E480E009 +:102BA00090E25DD917C082E090E48093002090937A +:102BB000012042E050E060E070E480E090E29DD9C6 +:102BC00081E0898341E050E0BE016F5F7F4F80E08C +:102BD00090E076DCE0913B2FF0913C2F40E060E00C +:102BE00070E08FEF19950F90DF91CF911F910F91AA +:102BF00008950F931F93CF93DF93CEB1DFB1A091D0 +:102C00000804B091090420915E2430915F24E42FE0 +:102C1000F0E08F010C5F1F4F2017310758F1CA2BCE +:102C2000DB2B245031092E1B3F0B20935E24309365 +:102C30005F24A0916024B09161248C9311964C93F1 +:102C400011971296DC931297CD010496809360241D +:102C5000909361241396CC93DB01EC01415018F062 +:102C60002D912993FBCFE80FF91FE0936024F09397 +:102C7000612412C080E041DFE0913E2FF0913F2FB0 +:102C800087818A3019F481E18093632C86818A30B0 +:102C900019F481E18093622CDF91CF911F910F9104 +:102CA00008951F93CF93DF931F92CDB7DEB79E0198 +:102CB0002F5F3F4FAC0163E08EE698E03DD2182FC6 +:102CC000882311F0898119DF812F0F90DF91CF9137 +:102CD0001F9108950F931F93E0913E2FF0913F2F86 +:102CE0008B019C01448163E08EE698E00DD21F9138 +:102CF0000F9108959B01AC0163E08EE698E043C21A +:102D00000F931F93CF93DF9380915E2490915F2464 +:102D1000811528E0920708F074C06091002070913E +:102D20000120C0E0D0E8C61BD70B00E018E0A801E6 +:102D3000481B590BC417D50758F182E694E2DDD839 +:102D400020915E2430915F24809100209091012099 +:102D5000985F821B930B8093002090930120021BAD +:102D6000130BE2E6F4E2CF018256944280179107FA +:102D700010F41192F8CF82E694E28093602490934D +:102D8000612480E098E080935E2490935F242EC0BD +:102D90002097B9F1AE0182E694E2AFD8A8014C1BAE +:102DA0005D0BBE016E597B4D82E694E20E944D5C44 +:102DB00080916024909161248C1B9D0B80936024F2 +:102DC0009093612480915E2490915F248C0F9D1FCD +:102DD00080935E2490935F24809100209091012045 +:102DE000C80FD91FC0930020D093012042E050E0CB +:102DF00060E070E480E090E2DF91CF911F910F914D +:102E00007CC8DF91CF911F910F91089580915D242F +:102E1000811176CF089543E650E06DE37FE281E0D3 +:102E200090E01DCB43E650E06DE37FE281E090E06F +:102E300047CB0F931F93CF93DF93CFEFC80FC830CB +:102E400008F047C0D82F0E94D82280913D2FC81784 +:102E500079F166D9C0933D2F8CE0C89F9001112471 +:102E6000C901805C904D80933E2F90933F2FF901D4 +:102E7000E35CF04D80850E94FD0DE0913E2FF091C6 +:102E80003F2F84813ADEA7D801E010E00D531F42A6 +:102E900060913D2FC801835C904D0E94E562609176 +:102EA0003E2F70913F2FC801825C904D0E94EE62D0 +:102EB0008FE18D0FE0913E2FF0913F2F978194305D +:102EC00011F48093632C9681943029F48093622CC2 +:102ED00002C080E001C081E0DF91CF911F910F918E +:102EE000089580913D2F99E04CE0915099F0282F62 +:102EF00030E02F5F3F4F27703327822F429FF00132 +:102F0000439FF00D1124E35CF04D2085222369F3EB +:102F10008F5F8FCF0895FC0190913D2F9F5C908330 +:102F200011820895CF93FC01218121110DC0BC01B4 +:102F3000C081E0913B2FF0913C2F41E082E1199557 +:102F400080ED8C0FCF9175CF80E0CF91089588E10F +:102F50008093010608958091622C823191F030F4C3 +:102F60008031B9F050F48823A9F132C0833169F07F +:102F700090EE980F983088F02BC088E0809305067B +:102F800027C088E08093070623C08091040683FF52 +:102F900012C088E0809306061BC09091642C9F5F4E +:102FA000913019F09093642C15C01092642C90917C +:102FB000040693FD04C088E0809305060BC098E0EA +:102FC00090930606803221F081508093622C02C0DB +:102FD0001092622C8091632C823191F030F4803118 +:102FE000C1F050F48823A9F132C0833169F090EE2A +:102FF000980F983088F02BC080E18093050627C099 +:1030000080E18093070623C08091040684FF12C0EC +:1030100080E1809306061BC09091652C9F5F9130E4 +:1030200019F09093652C08951092652C90910406E8 +:1030300094FD04C080E180930506089590E190938B +:103040000606803221F081508093632C08951092FF +:10305000632C08959B01AC016BE081ED98E093C077 +:10306000EDE3FFE298E0282F20718870211162873C +:103070008111618791503C969111F8CF222329F05C +:1030800090E1909306061092632C882329F088E043 +:10309000809306061092622C08950F931F939B0154 +:1030A0008A01803131F4E0913E2FF0913F2F47812A +:1030B00007C0883049F4E0913E2FF0913F2F4681C0 +:1030C0006BE081ED98E020D01F910F9108950F9350 +:1030D0001F93CF93DF931F92CDB7DEB7082FAB01BD +:1030E0009E012F5F3F4F6BE081ED98E025D0182FB8 +:1030F000882319F06981802FB3DF812F0F90DF9132 +:10310000CF911F910F9108950F931F93FC01662398 +:1031100079F094916150941309C0BF016F5F7F4FA4 +:10312000A801C9010E94285C81E003C0B196EFCFDD +:1031300080E01F910F910895CF92DF92EF92FF925E +:103140001F93CF93DF93EC017A016901162F1123AE +:1031500089F0BE016F5F7F4FC7010E941F5C115055 +:10316000892B31F4FE01C491F601C08381E003C0D4 +:10317000A196EDCF80E0DF91CF911F91FF90EF906E +:10318000DF90CF900895CF930196CCE26623D1F0E3 +:10319000FC01DA01AD017491772341F0211531056D +:1031A000A9F07D93319621503109F4CF623038F087 +:1031B0002115310559F0FD01C0834F5F5F4F61500C +:1031C0008196E4CF232B11F0FA011082CF9108955C +:1031D000809120028068809320028091230280FFEA +:1031E000FCCF81E080932302A0911002B0911102E4 +:1031F000AE5BB109B7FF02C0A0E0B0E020E038EB61 +:103200004BE050E00E94A25BE0913E2FF0913F2FF7 +:10321000843F9140A8F48781873019F480E180933E +:10322000632C8681873019F480E18093622C809131 +:10323000392F882389F0E0912B2FF0912C2F1994AE +:103240008781873019F481E18093632C86818730F0 +:1032500019F481E18093622C0895BC0183E090E22F +:103260000C94CA59CF93DF93FC016491EC01219631 +:10327000662331F083E090E20E94185ACE01F4CF29 +:10328000DF91CF910895AB01BC0183E090E20C94F3 +:10329000F45980E2809362060895CF93DF93809182 +:1032A000662C823031F583E090E20E94815A0E94C0 +:1032B0005F5583E090E20E949D5AEC0197FD19C092 +:1032C000E0913E2FF0913F2F8781833019F483E105 +:1032D0008093632C8681833019F483E18093622C80 +:1032E0008C2F88D6811105C08C2FDF91CF910C9443 +:1032F000F621DF91CF9108958091662C813079F08D +:1033000028F08230C9F0833011F12EC08091680618 +:1033100085FF31C08FE08093022081E015C080914D +:103320000220815080930220811125C00E94AE0DA1 +:103330000E94F75882E008C08091680685FD18C099 +:103340008FE08093022083E08093662C0DC08091F3 +:10335000022081508093022081110DC00E94BC5830 +:103360000E94DC0D1092662C8091662C823019F43C +:1033700090D70C94A0220895E0913E2FF0913F2F1A +:103380008781823019F481E18093632C86818230B9 +:1033900019F481E18093622C0895E0913E2FF09121 +:1033A0003F2F8781823019F480E18093632C8681DE +:1033B000823019F480E18093622C089583E090E2DA +:1033C0000C94A55983E090E20C94F05A22ED3BE076 +:1033D0003F932F932CEC3BE03F932F9325EC3BE066 +:1033E0003F932F932EEB3BE03F932F932EE13BE057 +:1033F0003F932F9322E02F931F929F938F930E94CE +:10340000AD5C8DB79EB70E968DBF9EBF85E60895C5 +:1034100060E072E00E94360E85E60895FB0120818F +:103420002F3349F42181211106C060E072E00E942F +:10343000750E85E60895CB010E94470E882371F032 +:10344000E0913E2FF0913F2FCF0188539F4265813D +:103450008F5F9F4F0E94E56284E608958AEC08958D +:10346000EF92FF920F931F93CF93DF93CDB7DEB709 +:10347000A097CDBFDEBF7C010091392F10E0011570 +:10348000110591F486E19BE09F938F9382E08F93E7 +:103490001F92FF92EF920E94AD5C0F900F900F90E1 +:1034A0000F900F900F9010C0E091332FF091342FB8 +:1034B000CE01019619959801AE014F5F5F4F60E014 +:1034C00072E0C7010E949A0E85E6A096CDBFDEBFCE +:1034D000DF91CF911F910F91FF90EF900895DF92B0 +:1034E000EF92FF920F931F93CF93DF93CDB7DEB789 +:1034F000A097CDBFDEBF7B010091392F10E06FE0B8 +:103500007BE0C7010E941F5C892B29F5D12CED2C93 +:10351000F12CE016F10658F40E947D0EE1E0F0E097 +:10352000EC0FFD1FEE0DFF1D8083D394F0CFE091D3 +:10353000352FF091362FCE0101961995E0913B2F52 +:10354000F0913C2F4091392FBE016F5F7F4F83E197 +:10355000199584E60BC0A70160E270E0CE010196E8 +:103560000E94C50E0817190711F38AECA096CDBF6B +:10357000DEBFDF91CF911F910F91FF90EF90DF9011 +:103580000895FC0180913A2F882311F081E301C056 +:1035900080E38083118285E60895FB01218121115A +:1035A00027C02081213321F481E080933A2F04C089 +:1035B000203321F410923A2F84E608952F33C1F47A +:1035C0001F9220E32F931F9221E32F9329E03BE0EA +:1035D0003F932F9322E02F931F929F938F930E94EC +:1035E000AD5C8DB79EB70A968DBF9EBF85E60895E8 +:1035F0008AEC089587E291E1CCD48EE6089587EABB +:1036000091E1E2D48EE60895E0ECF4E081818E7FD2 +:1036100081830E94BC580E94A20D84E60895E0ECCC +:10362000F4E081818E7F81830E94BC580E94A80DA6 +:1036300084E60895E3E2FFE225892F9324892F93FE +:1036400026E03BE03F932F9322E02F931F929F931E +:103650008F930E94AD5C8DB79EB708968DBF9EBFBD +:1036600085E608952091392F1F922F9323E03BE0A8 +:103670003F932F9322E02F931F929F938F930E944B +:10368000AD5C8DB79EB708968DBF9EBF85E6089549 +:1036900040E052E0BC0180E0F6D885E60895FB01E9 +:1036A00020812F3341F42181211105C060E072E0B7 +:1036B000D9D885E6089580E0F8D8882319F0B2DBE0 +:1036C00084E608958AEC089540E052E0BC0181E070 +:1036D000DAD885E60895FB0120812F3341F421815A +:1036E000211105C060E072E0BDD885E6089581E053 +:1036F000DCD8882319F096DB84E608958AEC0895D7 +:1037000040E052E0BC0182E0BED885E60895FB01AE +:1037100020812F3341F42181211105C060E072E046 +:10372000A1D885E6089582E0C0D8882319F07ADB15 +:1037300084E608958AEC089540E052E0BC0183E0FD +:10374000A2D885E60895FB0120812F3341F4218121 +:10375000211105C060E072E085D885E6089583E018 +:10376000A4D8882319F05EDB84E608958AEC0895D6 +:1037700040E052E0BC0180E190DC85E60895FB0169 +:1037800020812F3341F42181211105C060E072E0D6 +:1037900061DC85E6089580E19ADC882319F042DB3C +:1037A00084E608958AEC089540E052E0BC0188E088 +:1037B00074DC85E60895FB0120812F3341F42181DB +:1037C000211105C060E072E045DC85E6089588E0DF +:1037D0007EDC882319F026DB84E608958AEC0895C0 +:1037E00060E072E077DA85E60895FB0120812F33EF +:1037F00041F42181211105C060E072E07BDA85E6A9 +:103800000895CB014EDA882319F00CDB84E6089585 +:103810008AEC0895CF93DF93EC0163D9813028E0DF +:10382000920718F09C01385002C020E030E03F932E +:103830002F939F938F9383EE9AE09F938F9382E0D1 +:103840008F931F92DF93CF930E94AD5C8DB79EB78D +:103850000A968DBF9EBF85E6DF91CF91089580EADD +:1038600094E1B2D38EE608954BDA84E60895FDD84C +:1038700084E6089560E072E04EDB85E60895CB01B2 +:1038800051DB811102C08AEC089584E608950E94FC +:10389000601084E608950E94901084E608950E94C6 +:1038A000EB0F84E608958091680680FD02C089E7E9 +:1038B000089588E70895DF92EF92FF920F931F9388 +:1038C000CF93DF93EC010FEF11E085E1E82E8DE05F +:1038D000F82E9CE2D92EB70187EC93E20E941F5C80 +:1038E000892BD1F001151105B9F0DE01F701249102 +:1038F000ED012196C8010197222341F00130110505 +:1039000029F02C93DE0131968C01F1CFDC928C01F1 +:1039100088E1E80EF11CDFCF2197188285E6DF9160 +:10392000CF911F910F91FF90EF90DF900895FC01D0 +:10393000809120028068809320028091230280FF82 +:10394000FCCF81E080932302A0911002B09111027C +:10395000AE5BB109B7FF02C0A0E0B0E020E038EBF9 +:103960004BE050E00E94A25BAA27BB279F938F9356 +:103970008CED9AE09F938F9382E08F931F92FF9339 +:10398000EF930E94AD5C8DB79EB708968DBF9EBF2A +:1039900085E608954EB15FB1209108043091090485 +:1039A000242B352B3F932F9326ED3AE03F932F9313 +:1039B00022E02F931F929F938F930E94AD5C8DB74F +:1039C0009EB708968DBF9EBF85E608950F931F93FF +:1039D000CF93DF931F921F92CDB7DEB78B01E0919B +:1039E0003E2FF0913F2F8581893009F06FC0E09123 +:1039F0002B2FF0912C2F199581E08093CA2C60E237 +:103A000070E0C8010E94655C0097F9F4F80101902C +:103A10000020E9F73197E01BF10BE0FD59C0F69566 +:103A2000E795E130F10539F487E090E08093212FAC +:103A30009093222F37C053E0EE0FFF1F5A95E1F706 +:103A4000E093212FF093222F2DC098012C5F3F4F40 +:103A500082179307E9F5A80162E070E0CE010196B4 +:103A60000E94C50E898190E0982F88272A81820FB5 +:103A7000911D8093212F9093222F0B5F1F4FF801F0 +:103A800001900020E9F73197E01BF10BE0FD20C029 +:103A9000F695E79533E0EE0FFF1F3A95E1F7E8174B +:103AA000F907B0F06091212F7091222F695F7F4F4D +:103AB00083E0769567958A95E1F7A80181E29EE219 +:103AC0000E94C50E0E94252C8FEF03C089EC01C017 +:103AD0008AEC0F900F90DF91CF911F910F91089575 +:103AE000EF92FF920F931F93CF93DF931F921F923A +:103AF000CDB7DEB78B01E0913E2FF0913F2F85814E +:103B0000893009F080C0E0912B2FF0912C2F19956E +:103B100082E08093CA2C60E270E0C8010E94655C7C +:103B20007C01892B31F5F80101900020E9F73197EC +:103B3000E01BF10BE0FD69C0F695E795E130F1057A +:103B400039F487E090E08093212F9093222F47C093 +:103B500053E0EE0FFF1F5A95E1F7CF0169E070E0E7 +:103B60000E948E5BE81BF90BE093212FF093222F2C +:103B700036C0C8010496E816F90609F046C0A80147 +:103B800062E070E0CE0101960E94C50E898190E04E +:103B9000982F88272A81820F911D8093212F90933F +:103BA000222F8730910529F09C0127703327232B82 +:103BB00061F587010F5F1F4FF80101900020E9F7C1 +:103BC0003197E01BF10BE0FD20C0F695E79533E05F +:103BD000EE0FFF1F3A95E1F7E817F907B0F0609193 +:103BE000212F7091222F695F7F4F83E07695679533 +:103BF0008A95E1F7A80181E29EE20E94C50E0E942B +:103C0000252C8FEF03C089EC01C08AEC0F900F9038 +:103C1000DF91CF911F910F91FF90EF900895E09168 +:103C20003E2FF0913F2F85818930A1F4E0912B2F19 +:103C3000F0912C2F199585E08093CA2C0E942F4B70 +:103C40000E94252C89E39BE48093752C9093762C1D +:103C50008FEF089589EC0895E0913E2FF0913F2F6A +:103C600085818930A1F4E0912B2FF0912C2F1995AB +:103C700083E08093CA2C0E942F4B0E94252C89E35D +:103C80009BE48093752C9093762C8FEF089589ECAC +:103C90000895E0913E2FF0913F2F85818930A1F466 +:103CA000E0912B2FF0912C2F199586E08093CA2C50 +:103CB0000E942F4B0E94252C89E39BE48093752C56 +:103CC0009093762C8FEF089589EC0895E0913E2F24 +:103CD000F0913F2F4085518564E6649F9001659F78 +:103CE000300D11243F932F9320ED3AE03F932F9313 +:103CF00022E02F931F929F938F930E94AD5C8DB70C +:103D00009EB708968DBF9EBF85E60895CF93DF933B +:103D10001F921F92CDB7DEB7FB0120812F33B1F484 +:103D20002181211113C02EE93AE03F932F9322E025 +:103D30002F931F929F938F930E94AD5C0F900F90D3 +:103D40000F900F900F900F9085E62EC089E592E0BE +:103D500089839A83CE0101969F938F938AE99AE093 +:103D60009F938F937F936F930E94E35C0F900F90CC +:103D70000F900F900F900F90892BA9F069817A8195 +:103D80006935F2E07F0778F4E0913E2FF0913F2F04 +:103D900060877187CF0185539F428F5F9F4F0E943D +:103DA000EE6284E601C08AEC0F900F90DF91CF9114 +:103DB0000895E0913E2FF0913F2F23852F93228588 +:103DC0002F9327E93AE03F932F9322E02F931F92FE +:103DD0009F938F930E94AD5C8DB79EB708968DBF61 +:103DE0009EBF85E60895CF93DF931F921F92CDB7B4 +:103DF000DEB7FB0120812F33B1F42181211113C0E3 +:103E00002FE02F932FEF2F9326E43AE03F932F9349 +:103E100022E02F931F929F938F930E94AD5CCDBFA2 +:103E2000DEBF85E630C019821A82CE0101969F93CB +:103E30008F9382E49AE09F938F937F936F930E9476 +:103E4000E35C0F900F900F900F900F900F90892BC5 +:103E5000C9F069817A81611590E1790798F46093DE +:103E6000380370933903E0913E2FF0913F2F628722 +:103E70007387CF0183539F428F5F9F4F0E94EE62F3 +:103E800084E601C08AEC0F900F90DF91CF910895E6 +:103E9000FB0120812F33D9F42181211121C01F92F0 +:103EA00020E32F931F9221E32F932CE33AE03F93DB +:103EB0002F9322E02F931F929F938F930E94AD5CCC +:103EC0008DB79EB70A968DBF9EBF85E608952133B4 +:103ED00011F4F8D303C0203319F41AD484E60895FA +:103EE0008AEC0895FC0180910008813029F48091CA +:103EF0008C0891E0833009F090E090FF02C081E3EC +:103F000001C080E38083118285E60895E0913E2F11 +:103F1000F0913F2F8581893079F4E0912B2FF0913A +:103F20002C2F199584E08093CA2C0E942F4B0E945D +:103F3000252C89E39BE40EC0883091F4E0912B2F6F +:103F4000F0912C2F199581E08093A62D0E94EA52C2 +:103F50008FEF92E58093752C9093762C8FEF0895D8 +:103F600089EC089589E00E94FD0DE0912B2FF091DE +:103F70002C2F199587E08093CA2C0E942F4B0E940A +:103F8000252C89E39BE48093752C9093762C8FEFFE +:103F9000089521E02093742C2093732C2CE320931C +:103FA000712C25E030E020936F2C3093702C109210 +:103FB000692C10926A2C10926B2C10926C2C8093AE +:103FC000672C9093682C089527E02093742C2CE2A2 +:103FD00031E020936F2C3093702C1092692C10924A +:103FE0006A2C10926B2C10926C2C8093672C9093FF +:103FF000682C0895CF939091742C953009F441C0AA +:1040000030F4933019F130F5913068F43EC19730B7 +:1040100009F4AAC008F44AC0983009F4ACC0993039 +:1040200009F495C032C1813031F410926D2C109298 +:104030006E2C83E023C0843011F466E084C08831A4 +:1040400009F485C08B3109F084C081C08093722C43 +:1040500084E014C090E04091722C2FEF30E0241BDC +:1040600031098217930721F485E008C0891779F197 +:1040700065E183E090E20E94185A82E08093742CFC +:1040800068C020916D2C30916E2CA9014F5F5F4F5D +:1040900040936D2C50936E2CF901E056F04D8083C7 +:1040A0004038510509F055C086E0E8CF2091722CC8 +:1040B0009091732C29134FC0E0EAFFE220E230E335 +:1040C00090E02E173F0791F24191940FFACF409163 +:1040D000692C50916A2C60916B2C70916C2CE09142 +:1040E000672CF091682C20E830E080EA9FE2199577 +:1040F000C82F882311F18091732C8F5F8093732CCC +:104100008091692C90916A2CA0916B2CB0916C2CB1 +:1041100080589F4FAF4FBF4F8093692C90936A2C6C +:10412000A0936B2CB0936C2C66E083E090E20E942D +:10413000185A82E08093742CA9C068E183E090E271 +:104140000E94185A68E183E090E20E94185A109287 +:10415000742CC1E09BC030E0892F90E001972817B4 +:10416000390781F766E085CF853119F41092732CF9 +:1041700008C08B3161F3883109F45FCF863009F0D4 +:104180005AC08091732C8F5F8093732C4091692C5F +:1041900050916A2C60916B2C70916C2CE091672C83 +:1041A000F091682C20E830E080EA9FE21995C82F52 +:1041B0008823D1F161E083E090E20E94185A609177 +:1041C000732C83E090E20E94185A6091732C6095E2 +:1041D00083E090E20E94185A60E870E080EA9FE273 +:1041E00052D8E0EAFFE260E080E3E032F80719F03D +:1041F0008191680FF9CF83E090E20E94185A809174 +:10420000692C90916A2CA0916B2CB0916C2C8058E9 +:104210009F4FAF4FBF4F8093692C90936A2CA09310 +:104220006B2CB0936C2C32C064E083E090E20E946F +:10423000185A89E023CF853109F08BCF61E083E004 +:1042400090E20E94185A6091732C83E090E20E94E1 +:10425000185A6091732C609583E090E20E94185A7E +:1042600060E870E080EA9FE20ED8E0EAFFE280E2D8 +:1042700090E360E08E179F0719F02191620FFACF4B +:1042800083E090E20E94185A64CFC0E08C2FCF9157 +:1042900008958091742C813019F0873029F10895A8 +:1042A00080916F2C9091702C9C01215031092093AA +:1042B0006F2C3093702C892B31F58091712C9FEFEE +:1042C000980F9093712C882331F065E183E090E2A0 +:1042D0000E94185A02C01092742C85E090E08093DE +:1042E0006F2C9093702C089580916F2C9091702C6E +:1042F0009C012150310920936F2C3093702C892B15 +:1043000011F41092742C0895ECEEFBE020E030E004 +:104310009491981309C041E2429FC001439F900DC0 +:1043200011248351944F08952F5F3F4FB196293048 +:10433000310571F780E090E00895262FBA012F3300 +:1043400011F4469607C02D3311F4449611C0211183 +:104350000CC04096FC01259134912115310521F1C5 +:1043600080EA9FE2F90119950DC02032E9F44296E6 +:10437000FC012591349121153105B1F080EA9FE2CD +:10438000F90119958F3F89F491E09093792C4EB102 +:104390005FB12091080430910904242B352B209320 +:1043A000772C3093782C089589EC08950F931F9300 +:1043B000CF93DF938C01C5E1DDE0BE01C8010E940F +:1043C0001F5C892B49F440E050E060E0CE01DF91B2 +:1043D000CF911F910F91B1CF689680E1C53DD8076D +:1043E00061F7DF91CF911F910F910895EF92FF92A6 +:1043F0001F93CF93DF93982F9F7D91549A3160F054 +:1044000090ED980F9A3040F08F3531F0982F9D7FC6 +:104410009D3311F08032D1F49FE9980F9A3108F45E +:10442000805220917A2C30917B2C2F3F91E03907DC +:1044300008F07FC0A9014F5F5F4F40937A2C5093E3 +:104440007B2CF901E056F04D808373C08D3009F06C +:1044500040C0E0917A2CF0917B2CE056F04D108218 +:1044600010927A2C10927B2C8091792C811161C052 +:104470008091A02F982F9F7D09F440C08D7F8D33B0 +:10448000E9F1E0EAFFE27F011191112331F01F33DE +:1044900021F01D3311F01032B1F7F7011082C5E1A0 +:1044A000DDE0BE0180EA9FE20E941F5C892B59F487 +:1044B0001092A02FA7014F5F5F4F612FCE013DDF0C +:1044C0008F3FB9F124C06896F0E1C53DDF0749F799 +:1044D00015C0883061F480917A2C90917B2C0097E4 +:1044E00041F1019780937A2C90937B2C22C08B31E1 +:1044F00001F510927A2C10927B2C1BC088EC04DF03 +:104500000E94321989EE9BE00E94321912C0FCDE33 +:104510000E94321989EE9BE00E9432198091A02FEF +:10452000882339F080EA9FE20E942D1986EE9BE0F5 +:10453000EBCF81E0DF91CF911F91FF90EF90089535 +:104540008091792C882399F1E0913E2FF0913F2FB3 +:10455000208531852115310551F14EB15FB1809132 +:10456000080490910904842B952B4091772C50914D +:10457000782C841B950B64E670E00E948E5B6217BA +:104580007307A8F01092792C8BECBEDE0E943219D2 +:1045900083EE9BE00E943219E091752CF091762C0D +:1045A000309729F019951092752C1092762C089559 +:1045B0008091792C8823A9F01092792C8BECA4DEC1 +:1045C0000E94321983EE9BE00E943219E091752C13 +:1045D000F091762C309729F019951092752C109245 +:1045E000762C0895CF93DF939091792C9923A9F09D +:1045F000EB011092792C88DE0E94321980EE9BE04C +:104600000E943219209749F0CE010E942D198DED9C +:104610009BE0DF91CF910C943219DF91CF910895F7 +:10462000EF92FF920F931F93CF937C019B01613018 +:1046300081E0780710F020E031E08B01021B130BC2 +:10464000A70160E072E080EA9FE20E949A0E80EA91 +:104650009FE20E942D19C1E0013081E01807A8F007 +:104660001A954C2F50E0542F44274E0D5F1D20E02B +:1046700032E060E072E080EA9FE20E949A0E80EAF7 +:104680009FE20E942D19CF5FE7CF0115110589F038 +:104690004C2F50E0542F44274E0D5F1D980160E0D1 +:1046A00072E080EA9FE20E949A0E80EA9FE20E94F6 +:1046B0002D198AED9BE0CF911F910F91FF90EF9004 +:1046C0000C94321980910008813021F490918C086B +:1046D000933009F080E080FD1AC080917E2C81111A +:1046E00016C081E08093000893E090938C0880933B +:1046F0007C2C10927D2C2EB13FB1809108049091BA +:104700000904822B932B8093832C9093842C0895FF +:1047100010928C0810920008ECE7FCE210821182E3 +:10472000089590917C2C9923F1F080917D2C81113A +:1047300015C020917C2C2223B9F04EB15FB120919D +:10474000080430910904242B352B4091832C50917F +:10475000842C241B350B2634310530F081E0809306 +:104760007D2C892F089581E00895CF93C0917E2CF0 +:10477000CC23C1F02EB13FB180910804909109047F +:10478000822B932B2091812C3091822C821B930BB6 +:1047900020917F2C3091802C8217930718F0109273 +:1047A0007E2C90DF8C2FCF910895E0913E2FF091D9 +:1047B0003F2F82879387809338039093390308951E +:1047C000E0913E2FF0913F2F82859385409682871E +:1047D0009387809338039093390382859385089556 +:1047E000E0913E2FF0913F2F80E991E082879387FF +:1047F00080933803909339030895A0E2B6E081E0F6 +:1048000015968C93159720EA31E328B939B920E23F +:1048100032E32AB93BB910B813B812B816B817B8B2 +:1048200011B8E0E0F9E010A211A22FEF30E026A3CA +:1048300037A32FEF3FEF20A731A7808398E893831A +:1048400090E1948793E097831C968C931C9782E069 +:104850001A968C9308951F920F920FB60F921124FF +:1048600008B60F9218BE0BB60F921BBE8F939F9384 +:10487000EF93FF93E0E0F9E013828FE790E086ABDF +:1048800097AB81E190E080AF91AFE0E0FAE010A259 +:1048900011A28FEF9FEF86A397A389E883831682E7 +:1048A00081E084878EE0808310922A06FF91EF9149 +:1048B0009F918F910F900BBE0F9008BE0F900FBE6F +:1048C0000F901F9018951F920F920FB60F92112400 +:1048D00008B60F9218BE0BB60F921BBE2F933F93D4 +:1048E0008F939F93EF93FF932091280693B12670A7 +:1048F00081E009F080E0990F892B83B982B1882388 +:1049000009F463C012B883B18770873059F51092EB +:10491000000980E180930C091092030A1B9B03C0DD +:104920008CEA94E002C08CE694E08093260A90938F +:10493000270A82E081B981E080930C0A83E08093AA +:10494000060A86B197B1877049F090B18F5F8930C0 +:1049500011F09695FBCFE8B1F9B1908381E0809397 +:10496000852C36C083B1982F9C7091F1847091B1E1 +:1049700091111CC020B12695882311F080E001C060 +:1049800080E8282B20B986B197B1019686B997B9EE +:1049900087709927892BE1F4E8B1F9B1CF0101962D +:1049A00088B999B9208381E081B912C091B1913061 +:1049B00079F4EAB1FBB19F012F5F3F4F2AB93BB9B0 +:1049C000811190E0908311B803C082B1809582B9C3 +:1049D00088E880930309FF91EF919F918F913F9118 +:1049E0002F910F900BBE0F9008BE0F900FBE0F902F +:1049F0001F9018951F920F920FB60F92112408B6B0 +:104A00000F9218BE0BB60F921BBE2F933F938F933E +:104A10009F93EF93FF9381B1823008F49DC081B1E1 +:104A20008D3008F099C0E1B1F0E0EE0FFF1FEA5DB4 +:104A3000FF4D0190F081E02D19948FE790E0809375 +:104A4000260A9093270A88C08E9A8EE080934008A9 +:104A50008FE390E08093260A9093270A85E06FC049 +:104A60008E9886E081B98FEF82B914B815B8E8B195 +:104A7000F9B1808180B970C0009B05C08E9A82B167 +:104A8000809582B901C08E9887E059C0009B02C012 +:104A90008E9801C08E9A80B1869580B984B195B107 +:104AA000019684B995B984B195B187709927892BFE +:104AB00011F488E044C024B135B186B197B128170C +:104AC0003907B1F52BC0EAB1FBB1309711F0808105 +:104AD00001C082B1882311F08E9A01C08E9889E0BE +:104AE0002EC0EAB1FBB1309751F08081882311F0DC +:104AF0008E9801C08E9A3196EAB9FBB908C082B18E +:104B0000882311F08E9801C08E9A8FEF82B924B15C +:104B100035B186B197B12817390711F48AE00FC073 +:104B2000E8B1F9B1CF01019688B999B9818180B90D +:104B300086E005C08E988BE002C08E988CE081B92B +:104B40000BC01092000A1092060A109240081092B0 +:104B5000410881E08093862CFF91EF919F918F9186 +:104B60003F912F910F900BBE0F9008BE0F900FBE7C +:104B70000F901F901895CF93DF93E5E8FCE2108229 +:104B80001182E0E4F6E0128A84E08283C0E8D1E09A +:104B900082E68E83A0E2B6E081E016968C931697AB +:104BA00011968C93119796E012969C9312975196BA +:104BB0008C93519732E052963C9352971A961C92DE +:104BC0001A971B961C921B979FE019969C9399E548 +:104BD00098832AE529839A8390E491839683A0EBB6 +:104BE000B0E012962C911297207F12962C93129778 +:104BF00012962C911297226012962C9320E3218317 +:104C00002683908B8683358383E08183E0E0F8E020 +:104C100083E1818321E030E026A337A320A731A7D9 +:104C2000E0E8F8E014868083E0E2F3E0138211828A +:104C300088E0828391E19083A0913E2FB0913F2F35 +:104C40001A962D913C911B97208F318FE0E8F3E06D +:104C50009CE39283808393838183DF91CF91CDCD39 +:104C6000A0E2B6E01A961C921A97E5E8FCE21082E0 +:104C70001182E0E0F9E010821382178280E18487DC +:104C8000E0E0FAE010821382168281E08487E0E49B +:104C9000F8E01082118216968C938E980895CF9327 +:104CA000DF938091852C882309F47EC01092852C97 +:104CB000C6B1D7B1C730D10508F471C0AE01495FA4 +:104CC0005F4F93E0569547959A95E1F7E0913B2F1A +:104CD000F0913C2F60EA71E380E41995E0913E2F5A +:104CE000F0913F2F8781883019F483E18093632C02 +:104CF0008681883019F483E18093622CE091312F12 +:104D0000F091322FBE0180EA91E31995EC0194FFF6 +:104D100006C0DF7E80E292E38AB99BB902C01AB86E +:104D20001BB82097E1F1AE01495F5F4F83E05695D4 +:104D300047958A95E1F7E0913B2FF0913C2F60EA8F +:104D400071E381E41995E0913E2FF0913F2F878127 +:104D5000893019F483E18093632C8681893019F4BA +:104D600083E18093622CC6B9D7B980EA91E388B910 +:104D700099B910926008109261088FE090E08093DA +:104D800066089093670888E090E080936A089093A3 +:104D90006B0883E28093410883E081B905C01092DB +:104DA000000A1092060A29DD8091862C882329F0BA +:104DB0001092862CDF91CF9120CDDF91CF91089575 +:104DC000CF93DF93E0E4F6E0128A84E08283C0E8C8 +:104DD000D1E082E68E83A0E2B6E081E016968C9365 +:104DE000169711968C93119796E012969C931297B2 +:104DF00051968C93519732E052963C9352971A9663 +:104E00001C921A971B961C921B979FE019969C93D5 +:104E1000199799E598832AE529839A8390E49183E9 +:104E20009683C0EBD0E02A81207F2A832A812260EA +:104E30002A8320E321832683908B8683358393E026 +:104E40009183E0E0F8E093E1918321E030E026A354 +:104E500037A320A731A7E0E8F8E014869083E0E2CA +:104E6000F3E01382118298E0928321E12083C091C4 +:104E70003E2FD0913F2F2A853B85208F318FE0E850 +:104E8000F3E02CE3228390832383918315968C9304 +:104E9000E0E0F9E02FEF30E026A337A312A613A637 +:104EA00014A615A610821682178280831092000A1B +:104EB0001092872CEAE8FCE2108212821182DF91C4 +:104EC000CF91089581E08093260622DCE0E0F9E0AE +:104ED00010821782E0E0FAE010821782EAE8FCE232 +:104EE00011821282108208951F920F920FB60F92B4 +:104EF000112408B60F9218BE0BB60F921BBE2F934B +:104F00003F938F939F93EF93FF93E0E0F9E080E46A +:104F100084871782E0E8F3E082E0878389EB81836E +:104F200080EA91E38AB99BB981E090E084B995B9B0 +:104F300016B82EB13FB18091080490910904822BDC +:104F4000932B8093882C9093892C81E080938C2CD8 +:104F500018B817B81092872C88E080938706FF91C5 +:104F6000EF919F918F913F912F910F900BBE0F90DA +:104F700008BE0F900FBE0F901F901895E0E0F9E06B +:104F80008FEF94E086A397A380E6848780E38783EE +:104F90008FEF90E086AB97AB88E08093870608950B +:104FA0001F920F920FB60F92112408B60F9218BEDF +:104FB0000BB60F921BBE2F933F934F935F938F932C +:104FC0009F93EF93FF931092070A1092000A10929A +:104FD000470910924009809181038E7F809381035D +:104FE00084B195B180FF1AC0379B03C086B1869506 +:104FF00003C086B18695806886B984B195B1019663 +:1050000084B995B987709927892B41F4EAB1FBB12E +:10501000CF0101968AB99BB986B1808384B195B1DD +:1050200087709927892BC9F0E4B1F5B186B144B1F5 +:1050300055B193E0F695E7959A95E1F7E056FE4C69 +:1050400090E04770552728E030E0241B350B02C064 +:10505000959587952A95E2F7808381E080938B2C44 +:1050600010928C2C8FEF9FEF8093260A9093270A43 +:105070001092200A1092210A1092060A1092070A32 +:105080001092030A84E08093000A83E08093872CC7 +:10509000FF91EF919F918F915F914F913F912F9150 +:1050A0000F900BBE0F9008BE0F900FBE0F901F9079 +:1050B00018951F920F920FB60F92112408B60F92F7 +:1050C00018BE0BB60F921BBE8F93EF93FF93E0E8D1 +:1050D000F3E081818F7C8183E0E0FAE088E88383DC +:1050E00081E08083FF91EF918F910F900BBE0F9025 +:1050F00008BE0F900FBE0F901F9018951F920F9231 +:105100000FB60F92112408B60F9218BE0BB60F926D +:105110001BBE8F939F93EF93FF9380916009109232 +:1051200060091092610993E090934009813520F461 +:10513000813308F472C01BC08137E8F484B195B1A3 +:1051400080FF2EC086B18695806886B984B195B1FE +:10515000019684B995B987709927892B41F4EAB1F2 +:10516000FBB1CF0101968AB99BB986B1808386B124 +:10517000869580682CC086B18695806886B984B192 +:1051800095B1019684B995B987709927892B41F417 +:10519000EAB1FBB1CF0101968AB99BB986B1808390 +:1051A00086B18695806886B984B195B1019684B937 +:1051B00095B987709927892B41F4EAB1FBB1CF01EA +:1051C00001968AB99BB986B1808386B1869586B9E6 +:1051D00084B195B1019684B995B987709927892BC7 +:1051E00041F4EAB1FBB1CF0101968AB99BB986B10E +:1051F000808386B1869586B984B195B1019684B9CC +:1052000095B987709927892B41F4EAB1FBB1CF0199 +:1052100001968AB99BB986B18083FF91EF919F91E6 +:105220008F910F900BBE0F9008BE0F900FBE0F9086 +:105230001F9018950F931F93CF93DF93CDB7DEB7D1 +:10524000DA95CDBFDEBF80918C2C882309F483C012 +:105250004EB15FB180910804909109042091882C8F +:105260003091892C842B952B821B930B20911E202F +:1052700030911F202F5F3F4F2817390708F06BC070 +:105280001092070A1092000A1092470910924009E2 +:10529000809181038E7F8093810384B195B180FFDB +:1052A0001AC0379B03C086B1869503C086B1869528 +:1052B000806886B984B195B1019684B995B9877033 +:1052C0009927892B41F4EAB1FBB1CF0101968AB944 +:1052D0009BB986B1808384B195B187709927892B5A +:1052E000C9F0E4B1F5B186B144B155B113E0F6951A +:1052F000E7951A95E1F7E056FE4C90E04770552788 +:1053000028E030E0241B350B02C0959587952A953F +:10531000E2F7808381E080938B2C10928C2C2FEF0E +:105320003FEF2093260A3093270A1092200A10920A +:10533000210A1092060A1092070A1092030A94E0BA +:105340009093000A93E09093872C14B815B880933B +:105350008B2C10928C2C09DA81116FC2E2D9882330 +:1053600009F46BC280918C2C811167C280918A2CC8 +:10537000811105C080918B2C882309F45EC2809135 +:10538000872C833041F48091200A9091210A853244 +:10539000914008F452C280918B2C882309F4A2C05A +:1053A00084B195B1892B09F49DC084B195B108975A +:1053B00018F414B815B896C044B155B1495F5F4FA1 +:1053C000B3E056954795BA95E1F760EA71E3CE01EF +:1053D00001960E94445C80EA91E38AB99BB944B18A +:1053E00055B114B815B8898186958695898322E0D0 +:1053F00030E024173507B0F5F901A3E0F695E795FD +:10540000AA95E1F781E090E08C0F9D1FE80FF91F4E +:105410008081982F9695969590838370813049F07E +:1054200030F08230D1F486B18695806804C081E086 +:1054300015C086B1869586B984B195B1019684B9B7 +:1054400095B987709927892B41F4EAB1FBB1CF0157 +:1054500001968AB99BB986B1808380E02E5F3F4F69 +:10546000882339F284B195B187709927892BC9F0C7 +:10547000E4B1F5B186B144B155B173E0F695E79565 +:105480007A95E1F7E056FE4C90E04770552728E00A +:1054900030E0241B350B02C0959587952A95E2F7DD +:1054A0008083E0913E2FF0913F2F8781883019F45F +:1054B00083E18093632C8681883019F483E18093A3 +:1054C000622C44B155B1495F5F4F63E056954795F3 +:1054D0006A95E1F7E0913B2FF0913C2F60EA71E390 +:1054E00082E4199510928A2C10928B2C64B175B1BC +:1054F000E091312FF091322F80EA91E3199584B930 +:1055000095B984B195B1892B09F497C189E8809345 +:1055100081031092000A1092200A1092210A2FEFA4 +:105520003FEF2093260A3093270A8FE590E080937F +:10553000280A9093290A1092060A80E180930C0AA7 +:1055400093E09093070A10926009109261092093EA +:1055500066093093670920EA30E0209368093093A8 +:1055600069091092460980934C0981E080934709AC +:1055700081E1809380011092880110928003109243 +:105580002906E0913E2FF0913F2F8781893019F451 +:1055900083E18093632C8681893019F483E18093C1 +:1055A000622C44B155B1495F5F4F33E05695479542 +:1055B0003A95E1F7E0913B2FF0913C2F60EA71E3DF +:1055C00083E4199504B115B1013094E0190708F08E +:1055D00024C114B815B8A801495F5F4F23E0569560 +:1055E00047952A95E1F760EA71E380E292E30E9431 +:1055F000445C80EA91E38AB99BB986B1869580685C +:1056000086B984B195B1019684B995B98770992707 +:10561000892B39F481EA91E38AB99BB986B18093E9 +:10562000A03186B1869586B984B195B1019684B9C9 +:1056300095B987709927892B41F4EAB1FBB1CF0165 +:1056400001968AB99BB986B1808380E041E050E041 +:10565000E0E2F2E30417150708F495C0908190FF8B +:105660002BC086B1869586B984B195B1019684B96F +:1056700095B987709927892B41F4AAB1BBB1CD01A7 +:1056800001968AB99BB986B18C9386B1869580685C +:1056900086B984B195B1019684B995B98770992777 +:1056A000892B09F063C0AAB1BBB1CD0101968AB9BB +:1056B0009BB986B18C935AC0882351F186B18695E7 +:1056C00086B984B195B1019684B995B98770992747 +:1056D000892B41F4AAB1BBB1CD0101968AB99BB91E +:1056E00086B18C9386B1869586B984B195B10196C1 +:1056F00084B995B987709927892B41F4AAB1BBB1B8 +:10570000CD0101968AB99BB986B18C9380E02FC0F8 +:1057100096B19695906896B924B135B12F5F3F4FF9 +:1057200024B935B927703327232B49F4AAB1BBB16B +:105730009D012F5F3F4F2AB93BB996B19C9396B11B +:10574000969596B924B135B12F5F3F4F24B935B93D +:1057500027703327232BD1F6AAB1BBB19D012F5F50 +:105760003F4F2AB93BB996B19C9301C081E090812B +:10577000969590839A0127703327232B09F431964D +:105780004F5F5F4F67CF811129C086B186958068D2 +:1057900086B984B195B1019684B995B98770992776 +:1057A000892B41F4EAB1FBB1CF0101968AB99BB9CB +:1057B00086B1808386B1869586B984B195B101960C +:1057C00084B995B987709927892B41F4EAB1FBB167 +:1057D000CF0101968AB99BB986B1808384B195B116 +:1057E00087709927892BC9F0E4B1F5B186B144B12E +:1057F00055B193E0F695E7959A95E1F7E056FE4CA2 +:1058000090E04770552728E030E0241B350B02C09C +:10581000959587952A95E2F7808381E08093872C80 +:1058200080EA91E38AB99BB980E280930C098CE00D +:105830008093070985E58A95F1F7D395CDBFDEBF43 +:10584000DF91CF911F910F91089514B815B881E0A1 +:1058500080938A2C0C9462231092070A1092000AFB +:105860001092470910924009809181038E7F8093A6 +:10587000810384B195B180FF1AC0379B03C086B104 +:10588000869503C086B18695806886B984B195B146 +:10589000019684B995B987709927892B41F4EAB1AB +:1058A000FBB1CF0101968AB99BB986B1808384B1DF +:1058B00095B187709927892BC9F0E4B1F5B186B10C +:1058C00044B155B193E0F695E7959A95E1F7E05626 +:1058D000FE4C90E04770552728E030E0241B350B44 +:1058E00002C0959587952A95E2F7808381E08093A1 +:1058F0008B2C10928C2C8FEF9FEF8093260A909325 +:10590000270A1092200A1092210A1092060A109279 +:10591000070A1092030A84E08093000A83E08093D0 +:10592000872C1092872C10928B2C10928A2C0C941E +:1059300088231F920F920FB60F92112408B60F9270 +:1059400018BE0BB60F921BBE8F939F93EF93FF93DE +:1059500084E080938506E0E0F9E013828FE790E031 +:1059600086AB97AB81E190E086AF97AF10922B06A4 +:10597000FF91EF919F918F910F900BBE0F9008BEFA +:105980000F900FBE0F901F9018951F920F920FB699 +:105990000F92112408B60F9218BE0BB60F921BBEC1 +:1059A0002F933F934F935F938F939F93EF93FF9327 +:1059B0002091280694B1267081E009F080E0990FCB +:1059C000892B84B983B1882309F4E3C013B884B167 +:1059D0008770873009F0B5C084E080938606109206 +:1059E000000980E880930C0910920709109229069B +:1059F00086B197B1877049F090B18F5F893011F00F +:105A00009695FBCFE8B1F9B1908386B197B18093B9 +:105A1000912C9093922C8091912C9091922C07979D +:105A200008F45CC081E08093952C20EA32E32CB925 +:105A30003DB921E030E020938D2C30938E2C16B8A8 +:105A400017B815B899E8909380031092000A109245 +:105A5000200A1092210A4FEF5FEF4093260A5093DD +:105A6000270A2FE530E020932A0A30932B0A109260 +:105A7000060A20E220930C0A9CE09093070A1092F9 +:105A8000600910926109409366095093670940EAE2 +:105A900050E040936A0950936B0910924609209395 +:105AA0004C099093470990E19093820110928A01EA +:105AB000109281038093870389EB809380032EB13A +:105AC0003FB18091080490910904822B932B80931D +:105AD000932C9093942C82E081B961C08CE08093E8 +:105AE000290680EA91E388B999B980E292E38AB9FC +:105AF0009BB910B814B813B816B817B811B81092EB +:105B00002009109221098FEF90E08093260990934D +:105B100027098FEF9FEF80932E0990932F0981E043 +:105B20008093000988E88093030980E880930C093A +:105B300080EC8093070982E080932C0680932B06EB +:105B40002EC084B1982F9C7039F191B191111CC075 +:105B500020B1269582FF02C080E001C080E8282B9A +:105B600020B986B197B1019686B997B98770992700 +:105B7000892B91F4E8B1F9B1CF01019688B999B9AF +:105B8000208381E081B908C081B1813029F411B846 +:105B900003C083B1809583B988E880930309FF919E +:105BA000EF919F918F915F914F913F912F910F9026 +:105BB0000BBE0F9008BE0F900FBE0F901F90189550 +:105BC0001F920F920FB60F92112408B60F9218BEB3 +:105BD0000BB60F921BBE8F93EF93FF93E0E8F3E0B9 +:105BE00080818F7C8083E0E0FAE08AE8838381E033 +:105BF000808383E081B9FF91EF918F910F900BBE6D +:105C00000F9008BE0F900FBE0F901F9018951F9217 +:105C10000F920FB60F92112408B60F9218BE0BB652 +:105C20000F921BBE8F939F93EF93FF938091600918 +:105C3000109260091092610993E0909340098135B8 +:105C400020F4813308F4A7C003C0813758F165C040 +:105C500080918D2C90918E2C80FF0AC080918D2C8C +:105C600090918E2C0297C0F085B18695806802C015 +:105C700085B1869585B986B197B1019686B997B9F0 +:105C800087709927892B41F4ECB1FDB1CF010196C2 +:105C90008CB99DB985B1808380918D2C90918E2C8B +:105CA000029675C080918D2C90918E2C80FF1BC028 +:105CB00080918D2C90918E2C0297A8F085B18695BD +:105CC000806885B986B197B1019686B997B9877012 +:105CD0009927892B41F4ECB1FDB1CF0101968CB924 +:105CE0009DB985B1808385B1869585B986B197B117 +:105CF000019686B997B987709927892B41F4ECB141 +:105D0000FDB1CF0101968CB99DB985B18083809199 +:105D10008D2C90918E2C03963AC080918D2C909171 +:105D20008E2C80FF2FC080918D2C90918E2C02970D +:105D3000A8F085B18695806885B986B197B101963E +:105D400086B997B987709927892B41F4ECB1FDB1D9 +:105D5000CF0101968CB99DB985B1808385B18695B7 +:105D600085B986B197B1019686B997B98770992799 +:105D7000892B41F4ECB1FDB1CF0101968CB99DB9ED +:105D800085B1808380918D2C90918E2C0496809388 +:105D90008D2C90938E2CFF91EF919F918F910F906E +:105DA0000BBE0F9008BE0F900FBE0F901F9018955E +:105DB0001F920F920FB60F92112408B60F9218BEC1 +:105DC0000BB60F921BBE2F933F934F935F938F930E +:105DD0009F93EF93FF931092070A1092000A10927C +:105DE000030A1092470910924009809180038E7F28 +:105DF0008093800380918D2C90918E2C80FF15C014 +:105E000085B18695806885B986B197B1019686B9C6 +:105E100097B987709927892B41F4ECB1FDB1CF0177 +:105E200001968CB99DB985B1808386B197B1877091 +:105E30009927892BC9F0E6B1F7B185B146B157B1C1 +:105E400093E0F695E7959A95E1F7E056FD4C90E0E2 +:105E50004770552728E030E0241B350B02C095958C +:105E600087952A95E2F7808386B197B180938F2C2E +:105E70009093902C86B197B1049718F081E08093AD +:105E8000962C1092000A1092070A1092820110922A +:105E90008A018CE38093820388E0809380038CE006 +:105EA0008093290680EA91E388B999B980E292E368 +:105EB0008AB99BB910B814B813B816B817B811B886 +:105EC00010922009109221098FEF90E0809326090B +:105ED000909327098FEF9FEF80932E0990932F09BE +:105EE00081E08093000988E88093030980E880932B +:105EF0000C0980EC8093070982E080932C06809344 +:105F00002B06FF91EF919F918F915F914F913F9160 +:105F10002F910F900BBE0F9008BE0F900FBE0F90E9 +:105F20001F901895CF93DF934CE040938106A0E437 +:105F3000B6E052961C92529784E012968C93129778 +:105F4000C0E8D1E082E68E83E0E2F6E081E086837D +:105F5000818396E09283818B92E0928B12861386E6 +:105F60002FE0218729E528833AE539832A8320E435 +:105F700011962C93119716962C931697C0EBD0E0A0 +:105F80003A81307F3A833A8132603A8330E3119626 +:105F90003C93119716963C93169750962C935097D6 +:105FA00016968C93169715969C93159723E0119649 +:105FB0002C93A0E0B8E023E111962C93119761E0B7 +:105FC00070E096966D937C93979798966D937C93DB +:105FD0009997A0E8B8E01C961C921C972C93A0E21D +:105FE000B3E013961C92139711961C92119728E018 +:105FF00012962C93129731E13C93C0913E2FD09191 +:106000003F2F6A857B8558966D937C935997A0E8BE +:10601000B3E03CE312963C9312972C9313963C9377 +:10602000139711962C938583A5E9BCE21C921196D7 +:106030001C92418720EA31E328B939B920E232E3E2 +:106040002AB93BB910B814B813B816B817B811B8B4 +:10605000A0E0B9E090961D921C9291972FEF30E04E +:1060600096962D933C9397972FEF3FEF9E962D9307 +:106070003C939F978C9388E813968C93139780E8B2 +:106080001C968C931C9780EC17968C93948793871F +:10609000DF91CF910895E0E0FAE010821782E0E806 +:1060A000F1E012821286E0E8F3E08CE3828388E07C +:1060B0008083A0E2B6E01B961C921B9719961C9257 +:1060C0001997E0E0F9E010821382178280E8848754 +:1060D00081E016968C93089588E0809385068091E0 +:1060E000952C882391F11092952C4091912C5091F0 +:1060F000922C495F5F4F93E0569547959A95E1F74B +:10610000E0913B2FF0913C2F60EA71E384E4199514 +:10611000E0913E2FF0913F2F8781883019F483E181 +:106120008093632C8681883019F483E18093622CFC +:106130001092202E6091912C7091922CE091312F31 +:10614000F091322F80EA91E319958091962C882363 +:1061500099F11092962C40918F2C5091902C495F80 +:106160005F4F83E0569547958A95E1F7E0913B2F85 +:10617000F0913C2F60EA72E387E41995E0913E2F9D +:10618000F0913F2F8781883019F483E18093632C4D +:106190008681883019F483E18093622C81E08093BA +:1061A000202E60918F2C7091902CE091312FF091E6 +:1061B000322F80EA92E3199521B1223009F055C0BF +:1061C0006EB17FB180910804909109044091932CA5 +:1061D0005091942C862B972B841B950B40911E205D +:1061E00050911F204817590708F03FC01092000A2D +:1061F0001092070A1092820110928A018CE3809318 +:10620000820388E0809380038CE08093290680EAF3 +:1062100091E388B999B980E292E38AB99BB910B841 +:1062200014B813B816B817B811B810922009109204 +:1062300021098FEF90E080932609909327098FEF33 +:106240009FEF80932E0990932F0981E0809300099E +:1062500088E88093030980E880930C0980EC8093A0 +:10626000070920932C0620932B0688E0809386064E +:106270000895982F80919F2C882359F08091992C14 +:10628000811108C081E02091982C921718F080E0CD +:10629000089581E00895FF920F931F93CF93DF93AA +:1062A0001F92CDB7DEB700919C2C000F000F00515C +:1062B000FF24F394F0929F2C10E0B8016D5F7F4FA4 +:1062C00041E050E088E99CE20E942F0FB8016C5F2A +:1062D0007F4F41E050E0CE0101960E942F0F89814F +:1062E000881F8827881F8093972CF0929E2C1092ED +:1062F0009D2C1092992C10929B2C0F90DF91CF9196 +:106300001F910F91FF90089510929F2C80E1809330 +:106310009C2C8FEF8093982C1092972C81E0809387 +:106320009E2C10929D2C1092992C10929B2C0895CB +:1063300084E180939C2CAFCF89E280939C2CABCFDF +:1063400081E080939E2C089508958F929F92AF9242 +:10635000BF92CF92DF92EF92FF920F931F93CF9352 +:10636000DF9300D01F92CDB7DEB78C01FC01808196 +:1063700090919E2C9230E1F028F0933011F19430FE +:1063800051F14EC0292F2095217020939D2C9923E7 +:1063900011F0863219F0823509F042C084E4F80128 +:1063A0008083118282E080939E2C80E190E0DBC2AA +:1063B00090919D2C911102C08632B1F0823599F5F1 +:1063C00013C090919D2C911102C0863269F08235E4 +:1063D00009F05BC009C090919D2C911102C08632DA +:1063E00019F0823509F0F3C084E4F801808311824A +:1063F00081E0892713C080919B2C8111FCC0F8019A +:106400008081803509F476C108F006C1803309F433 +:1064100009C190919F2C911174C181E080939E2CB1 +:1064200080E090E0A0C28339C1F719821A821B82F2 +:106430001C8288E8898343E050E060E070E0CE0190 +:1064400002960E942F0FF8018181803209F4ABC0BF +:10645000803709F047C0F801928189819813B2C052 +:1064600093818A819813AEC094818B819813AAC0BE +:1064700095818C819813A6C084E0808361E070E0F0 +:10648000C8010E947D3C83E029C0853931F644E093 +:1064900050E064E070E0CE0101960E942F0FF801F9 +:1064A0008181803209F47FC08037E1F4F801928164 +:1064B0008981981387C093818A81981383C09481BE +:1064C0008B8198137FC095818C8198137BC010823B +:1064D00061E070E0C8010E947D3C84E080939E2CC6 +:1064E00038E171C0E82EE294AFE0EA22EA94EA943F +:1064F0008F70F82E88E090E08F1991092FEF30E02F +:10650000690102C0D594C7948A95E2F7F5E0EF16C9 +:1065100029F024E0E2122AC0FF20E1F044E050E03C +:10652000B8016E5F7F4FCE0101960E94375C892BC8 +:1065300061F499818A8189279B8189279C81892798 +:10654000F801968189278C2171F1F4E0EF120EC0D9 +:10655000F11038C044E050E0B8016E5F7F4FCE01CB +:1065600001960E94375C892BF1F02CC023E02E1598 +:1065700048F1F12CA701B8016E5F7F4FCE01019663 +:106580000E94375C892BF1F4D801AE0DBF1DE1E00C +:10659000F0E0EC0FFD1FEE0DFF1D12969C91808127 +:1065A0008927C82279F43981F80130832A8121832F +:1065B0009B8192838C8183832327922789278483DD +:1065C00038E201C030E020E0832F922FCCC1695F18 +:1065D0007F4F83E0769567958A95E1F76330710583 +:1065E00008F41BCF62507109C8010E94A83C8111B8 +:1065F00002CF81E092C110929B2C80913A2F8111A1 +:106600008BC160919A2CF4E06F9FB001112444E09B +:1066100050E0C80102967EC1803A09F455C0823A22 +:10662000C1F1F7CEF801F18080919F2C882359F0B9 +:106630008091972C882339F08091992C811103C087 +:10664000E090982C02C0E0909C2CFE1410F0F80111 +:1066500031C1C12CD12CF4E0FF9EB001112444E0E3 +:1066600050E0C8018C0D9D1D0E942F0FF394EF1078 +:1066700001C0F12C24E0C20ED11C80E1C816D10467 +:1066800051F760E170E0C8010E947D3C80E990E034 +:106690006AC1F801F180F1E0FF15C8F680919C2CE9 +:1066A000F816A8F68F2DE5DD882309F4C2C0C801CD +:1066B000029620913A2F21112FC1F4E0FF9EB001E4 +:1066C000112444E050E026C1F801F180F1E0FF150B +:1066D00008F0BDCF80919C2CF81608F0B8CF8F2D14 +:1066E000C8DD882309F4A5C0F0929A2C81E080933C +:1066F0009B2C12C1F80181818111A9CF10929E2C8F +:106700008FCE8C3309F40EC148F4893309F4A6C046 +:106710008A3391F18B3109F080CE6AC08B3409F451 +:106720000FC138F48E3309F078CE8DEBF8018083F9 +:1067300014C1803621F0853A09F4ABC06ECEF80161 +:10674000108284E0818383E0828381E08383848379 +:10675000158280919C2C843111F08EE001C08BE079 +:10676000F801868383E0878368E070E0C8010E94B7 +:106770007D3C80E590E0F7C0F801D180E280ED1427 +:1067800008F465CF80919C2CD81608F060CFE816ED +:1067900008F05DCF8091972C882351F08D2D69DD15 +:1067A000882309F446C08E2D64DD882309F441C096 +:1067B000F12C6D2D70E0E61AF70AFFEFEF1AFF0AD1 +:1067C000EE0CFF1CEE0CFF1C660F771F660F771F89 +:1067D000A701C8010E942F0FB701C8010E947D3C8C +:1067E000C7010296F3E0880F991FFA95E1F7BBC045 +:1067F00060919C2C660F660F6051E62EF12CB7015C +:10680000685F7F4F44E050E0CE0101960E942F0F59 +:106810009981F801818198130CC09A818281981323 +:1068200008C09B818381981304C09C818481981740 +:1068300011F086E072C081E08093992CB701645F0B +:106840007F4F42E050E0C8010E942F0F62E070E0ED +:10685000C8010E947D3C80E290E085C0F801618122 +:10686000633008F0F4CE80919C2C70E0680F711DAD +:10687000660F771F660F771F43E050E0C8010E9444 +:106880002F0F63E070E0C8010E947D3C88E290E039 +:106890006AC0F8012181E22EF12C9E2D8827856A9D +:1068A000092E000CAA0BBB0B32814C015D01A32AFF +:1068B000233010F0108233C080919C2CB701680FF8 +:1068C000711D660F771F660F771F44E050E0CE0101 +:1068D00001960E942F0F89819A81AB81BC81880D1E +:1068E000991DAA1DBB1D89839A83AB83BC83009726 +:1068F000A105B14010F084E010C080919C2CB7013C +:10690000680F711D660F771F660F771F44E050E018 +:10691000CE0101960E947D0F8AE0F801808384E019 +:1069200090E021C040E250E06AEC70E0C8010E94B3 +:106930005E5C60E270E0C801E0D780E191E013C0E6 +:1069400060919C2C660F660F605170E06B5F7F4F0B +:1069500041E050E0C8010E942F0F61E070E0C801E3 +:10696000CCD788E190E02496CDBFDEBFDF91CF91F8 +:106970001F910F91FF90EF90DF90CF90BF90AF905D +:106980009F908F900895CF93DF93EC0143E050E008 +:1069900060E070E00E942F0F44E050E064E070E09F +:1069A000CE010396DF91CF910C942F0F0F931F937D +:1069B000CF93DF931F921F92CDB7DEB78C01FC01FE +:1069C00090818181892798E88927928189278A8304 +:1069D0009381848189279581892796818927898355 +:1069E00043E050E060E070E0C8010E947D0F41E0AC +:1069F00050E063E070E0CE0102960E947D0F44E01B +:106A000050E064E070E0C80103960E947D0F41E011 +:106A100050E068E070E0CE0101960E947D0F0F907B +:106A20000F90DF91CF911F910F91089581E0809396 +:106A3000C32C84E090E08093A22C9093A32C88E058 +:106A40008093A12C1092A02C089581E08093C32CF8 +:106A500084E490E08093A22C9093A32C88E0809310 +:106A6000A12C1092A02C089581E08093C32C82E089 +:106A700090E08093A22C9093A32C88E18093A12C8A +:106A80001092A02C089581E08093C32C82E490E0C2 +:106A90008093A22C9093A32C88E18093A12C109238 +:106AA000A02C089581E08093C32C089508958F92BF +:106AB0009F92AF92BF92CF92DF92EF92FF920F938D +:106AC0001F93CF93DF93CDB7DEB76297CDBFDEBF05 +:106AD0008C015B018091C32C6730710501F5F801D1 +:106AE0009081882311F0963211F09235C1F421E0A3 +:106AF000811120E02093A02C882311F0963211F010 +:106B0000923559F49091A22C8091A32CF801908396 +:106B100081838FEF8093A42C37C0A12CB12C8530BA +:106B200009F497C050F48230A1F1C8F0833009F421 +:106B300068C0843009F481C0ACC5883009F41CC138 +:106B400038F4863009F491C0873009F4CAC0A1C571 +:106B5000893009F441C38D3008F463C39AC5982F76 +:106B6000909591709093A02CF8019081882311F05A +:106B7000963219F0923509F006C49091A22C8091BA +:106B8000A32CF8019083818384E08093C32C80E15F +:106B900081C5F8018081982F9D7F913419F48AE096 +:106BA00080835AC38033C1F462E070E0C801D0D65C +:106BB000882309F494C0F8016181F0E16F9FB0016E +:106BC000112440E150E0C8010E942F0F60E170E005 +:106BD000C80193D680E95EC5803A79F462E070E03E +:106BE000C801B6D6882309F47AC0F8018181809360 +:106BF000BA2C83E08093C32CD2CF803509F049C5ED +:106C00004AC060E170E0C801A3D6882389F0809172 +:106C10003A2F81110BC06091BA2CF0E16F9FB00147 +:106C2000112440E150E0C8010E947D0F8AE001C0BC +:106C300081E0F801808382E00DC39091A02CF801DF +:106C40008081911102C08632D1F0823509F0A3C350 +:106C500016C09091A02CF8018081911102C086325B +:106C600071F0823509F045C40AC09091A02CF8015A +:106C70008081911102C0863211F0823551F4209149 +:106C8000A22C8091A32CF8012083818381E08927A5 +:106C900077C38035C9F4F8018181882319F0F801A0 +:106CA0001082DAC262E070E0C80152D68823B9F0DF +:106CB000E0913B2FF0913C2F40E060E070E081E9F3 +:106CC00019951092C32CE5C490EA980F923008F001 +:106CD000B4C462E070E0C8013BD68111DDC481E03C +:106CE0004FC2C8010E94314264E07801F4E0EF0E27 +:106CF000F11CC7010E944D45E0913B2FF0913C2FC4 +:106D000044E0B70180EA1995F80194818091BB2C89 +:106D1000981329C095818091BC2C981324C096812A +:106D20008091BD2C98131FC097818091BE2C981321 +:106D30001AC08091BF2C80838091C02C8183809168 +:106D4000C12C82838091C22C838364E0C8010E949D +:106D50006647E0913B2FF0913C2F44E0B80181EA77 +:106D6000199588E004C2E0913B2FF0913C2F44E05C +:106D70006BEB7CE280EC2DC2F8018081803551F410 +:106D80008181811107C08281873521F483818D3C07 +:106D900009F405C264E0C8010E944D45F8018081F4 +:106DA000803309F0BDC062E070E0C801D1D588230E +:106DB00009F4A7C0F801618167FD04C0862F8370C4 +:106DC000833029F0862F8F708F3009F07FC0609359 +:106DD000BA2C8091A52C9091A62C3091A72C282F0D +:106DE00022952095492F4227407F09F03FC0232755 +:106DF0002F70E1F5929590959327907FB9F5262F06 +:106E000067FD02C0237003C02F7009F023E0809556 +:106E1000432F42954F702223B1F090E0022E02C022 +:106E2000959587950A94E2F7E32FF0E0022E02C0D1 +:106E3000F595E7950A94E2F73E2F50E002C055958C +:106E400047952A95E2F740FBCC24C0F8D12CF601F7 +:106E5000EE0FFF1FEE0FFF1F30FBEE24E0F8F12CCA +:106E6000EE0CFF1CEE298170E82B01C0E7E0F0E09A +:106E70008091B92CEE0FFF1FE05CFF4DE80FF11D74 +:106E80008081F8019801205F3F4F11922E173F0734 +:106E9000E1F79091A82CF801918782FF09C09091A9 +:106EA000A52C96839091A62C97839091A72C9087E0 +:106EB00084FF15C06360F0E16F9FB0011124665F2D +:106EC0007F4F46E050E0C8010A9607C080E1689F06 +:106ED000B001112440E150E0C8010E942F0F60E191 +:106EE00070E0C8010AD5E0913B2FF0913C2F42E1C0 +:106EF000B80180E8199562E1C8010E94664780E9FF +:106F000039C10E94584491E08927F8018083E091BB +:106F10003B2FF0913C2F44E0B80181EC19959CC1C6 +:106F2000803A61F462E070E0C80112D58823D9F19B +:106F3000F80181818093BA2C89E00DC0803C89F4EE +:106F400062E070E0C80104D5882369F1F80181810D +:106F50008093BA2C8BE08093C32C0E9458449AE013 +:106F60000EC1813C91F462E070E0C801F1D4882345 +:106F7000D1F0F80181818093BA2CFAE0FF2EF092D3 +:106F8000C32C0E9458448F25FBC0823C99F462E0D8 +:106F900070E0C801DDD4882331F0F801818180934D +:106FA000BA2C8CE0D8CFE0913B2FF0913C2F44E0FD +:106FB000B80121C0803B11F562E070E0C801C8D47F +:106FC000E0913B2FF0913C2F44E0B801882399F0E9 +:106FD00086E8199580913A2F8111BFCFF801618120 +:106FE000F0E16F9FB001112440E150E089EA9CE29A +:106FF0000E947D0FB2CF81EC1995BEC090EA980F28 +:10700000923008F0BFC062E070E0C801A1D48823CC +:1070100009F4B2C0F8018081803621F0EAE3CE2E77 +:10702000D12C03C070E3C72ED12CF801818187FFDA +:107030000CC0807FF0E18F9F7001112480ECC80E9E +:10704000D11C66EFA62EB12C08C08C7F90E1899FE1 +:107050007001112456E3A52EB12CE0913B2FF09145 +:107060003C2F42E0B80180E91995F80180818170D8 +:107070008093B92CC70144E0969587954A95E1F72E +:107080008093BA2C9091A42C981769F0B5016E0DDD +:107090007F1D44E050E085EA9CE20E942F0F809122 +:1070A000BA2C8093A42C68E0CE0101960E94800E39 +:1070B0008091392F44E050E0873019F463E070E0AC +:1070C00002C060E070E0CE010F960E942F0FB60163 +:1070D0006E0D7F1D46E050E0CE0109960E942F0FF5 +:1070E00089818093BB2C8A818093BC2C8B81809377 +:1070F000BD2C8C818093BE2C60E48BEB9CE20E94C3 +:1071000080498091BB2C8093BF2C8091BC2C8093B4 +:10711000C02C8091BD2C8093C12C8091BE2C80937B +:10712000C22C60E28FEB9CE20E94804920E0AE011D +:107130004F5F5F4FBE01615F7F4FCE010996E6D67C +:107140008981F80180838A8181838B8182838C810C +:107150008383E058FF4F8D81808331968E818083B9 +:1071600031968F81808331968885808387E08093F4 +:10717000C32C80E290E16CC30E94584491E08927BF +:10718000F8010ECD8035B9F4F8018181811187CDE8 +:1071900062E070E0C801DCD3882309F4A0CD10922E +:1071A000C32CE0913B2FF0913C2F40E060E070E079 +:1071B00081E919956EC2A501495F5F4F33E056958D +:1071C00047953A95E1F7E0913B2FF0913C2FB801BC +:1071D00082E9199581E0D4C062E1C8010E944D4561 +:1071E00060E170E0C801B4D3E0913B2FF0913C2FF7 +:1071F000882329F142E1B80181E8199580913A2F5D +:1072000081110BC06091BA2CF0E16F9FB001112485 +:1072100040E150E0C8010E947D0F0E9458449AE06E +:1072200015C066E0C8010E944D4564E070E0C801E9 +:107230008FD3811113C0E0913B2FF0913C2F44E09C +:10724000B80181EC19950E94584491E08927F80112 +:10725000808388E08093C32C84E01CC26091BA2CA8 +:10726000F0E16F9FB001112440E150E089EA9CE217 +:107270000E942F0F9091A92C8091AD2C809598138E +:10728000E3C28091B12C9813DFC29091AA2C809117 +:10729000AE2C80959813D8C28091B22C9813D4C28A +:1072A0009091AB2C8091AF2C80959813CDC280919A +:1072B000B32C9813C9C29091AC2C8091B02C8095BE +:1072C0009813C2C28091B42C9813BEC29091B52C71 +:1072D0008091B62C80959813B7C28091B72C9813E3 +:1072E000B3C28091B82C80959813AEC2C090A92CDF +:1072F000D090AA2CE090AB2CF090AC2CF8018080C0 +:107300009180A280B3808091C32C8B3009F081C220 +:10731000E0913B2FF0913C2F46E0B80185E81995AC +:10732000C818D908EA08FB08C092A92C33272F2DCA +:107330001E2D0D2D0093AA2CA701662777274093B9 +:10734000AB2C8F2D9927AA27BB278093AC2CEC2D33 +:10735000E095E093AD2CE02FE095E093AE2CE42F88 +:10736000E095E093AF2CE82FE095E093B02CC0922D +:10737000B12C0093B22C4093B32C8093B42C88E0B2 +:107380008093C32C86C1903409F083C182E080933E +:10739000C32C8AE0F5CE833909F093CC8091392F44 +:1073A000873009F0A1C043E050E060E070E0CE011A +:1073B00002960E942F0F88E88983F801918190320C +:1073C00019F0903761F024C0F80180833A8131834D +:1073D0002B8122839C819383232782272AC1F80152 +:1073E0008281883809F055C193818A81981351C1EF +:1073F00094818B8198134DC195818C81981349C1DB +:1074000084E0808361E070E0C80177D285E09FC0AE +:10741000E92EE294EFE0EE22EA94EA949F70F92ECE +:1074200088E090E08F1991092FEF30E0690102C0E8 +:10743000D594C7948A95E2F7F5E0EF1629F084E039 +:10744000E8122AC0FF20E1F044E050E0B8016E5F8E +:107450007F4FCE0101960E94375C892B61F49A819F +:107460008B81892798E889279C818927F801968153 +:1074700089278C2189F1F4E0EF120EC0F11009C1C7 +:1074800044E050E0B8016E5F7F4FCE0101960E944C +:10749000375C892B09F1FDC083E08E1508F4F9C033 +:1074A000F12CA701B8016E5F7F4FCE0101960E94BB +:1074B000375C892B09F0EDC0D801AE0DBF1DE1E0AE +:1074C000F0E0EC0FFD1FEE0DFF1D12969C918081E8 +:1074D0008927C82209F0DDC098E8F80190833A8135 +:1074E00031832B812283A1C044E050E060E070E052 +:1074F00007C0853909F0E5CB44E050E063E070E077 +:10750000CE0101960E942F0FF8018181803209F48B +:1075100085C0803701F5F801928189819813B9C03F +:1075200093818A819813B5C094818B819813B1C0DF +:1075300095818C819813ADC08091A12C808361E0EE +:1075400070E0C801DAD18FEF8093A42C86E080939D +:10755000C32C88E19FC0E82EE2947FE0E722EA9402 +:10756000EA948F70F82E88E090E08F1991092FEF40 +:1075700030E0690102C0D594C7948A95E2F7F5E03E +:10758000EF1629F084E0E8122AC0FF20E1F044E081 +:1075900050E0B8016E5F7F4FCE0101960E94375CCC +:1075A000892B61F499818A8189279B8189279C8114 +:1075B0008927F801968189278C2181F1F4E0EF1267 +:1075C0000EC0F11066C044E050E0B8016E5F7F4F1E +:1075D000CE0101960E94375C892B01F15AC083E0ED +:1075E0008E1508F456C0F12CA701B8016E5F7F4FCD +:1075F000CE0101960E94375C892B09F04AC0D80160 +:10760000AE0DBF1DE1E0F0E0EC0FFD1FEE0DFF1D24 +:1076100012969C9180818927C822D9F53981F80179 +:1076200030832A8121839B8192838C8183832327CA +:1076300092278927848388E22DC0823C09F0CBC041 +:10764000F8018181803E09F0CFC08281843B09F03E +:10765000CBC046E050E06AEA74E0CE0101960E9499 +:107660002F0F89818B3409F03ACB8A81893709F051 +:1076700036CB8B818B3109F032CB8C818A3E09F07D +:107680002ECB8D818B3709F02ACB8E818C3C09F073 +:1076900026CB80E090E0DCC0F8018081803621F0CC +:1076A0006AE3C62ED12C03C050E3C52ED12CF801BD +:1076B000818187FF0CC0807FF0E18F9F70011124D2 +:1076C00080ECC80ED11C46EFA42EB12C08C08C7FD4 +:1076D00090E1899F7001112436E3A32EB12CE09133 +:1076E0003B2FF0913C2F42E0B80180E91995F80159 +:1076F000808181708093B92CC70124E0969587958D +:107700002A95E1F78093BA2CB5016E0D7F1D44E0F8 +:1077100050E085EA9CE20E942F0F8091BA2C809362 +:10772000A42C68E0CE0101960E94800E8091392F32 +:1077300044E050E0873019F463E070E002C060E09C +:1077400070E0CE010F960E942F0FB6016E0D7F1DC7 +:1077500046E050E0CE0109960E942F0F8981809368 +:10776000BB2C8A818093BC2C8B818093BD2C8C8117 +:107770008093BE2C60E48BEB9CE20E948049809158 +:10778000BB2C8093BF2C8091BC2C8093C02C80910B +:10779000BD2C8093C12C8091BE2C8093C22C60E2C2 +:1077A0008FEB9CE20E94804987E08093C32C898103 +:1077B000F80180838A8181838B8182838C8183839A +:1077C000AE014F5F5F4FBE01615F7F4FCE010996F3 +:1077D000F0D080E25FCF982F9F77903329F0803AE6 +:1077E00019F0805C833078F481E08093C32C84E0CE +:1077F000F8018083E0913B2FF0913C2F40E060E066 +:1078000070E082EC8BCBE0913B2FF0913C2F40E07D +:10781000DECC8A3069F4E0913B2FF0913C2F46E0BA +:10782000B80184E81995C80CD91CEA1CFB1C7CCD56 +:107830008C3009F079CDE0913B2FF0913C2F46E060 +:10784000B80187E8199570CD0E94584496E0FECCA7 +:107850006296CDBFDEBFDF91CF911F910F91FF9058 +:10786000EF90DF90CF90BF90AF909F908F90089552 +:10787000CF93DF932091392F273071F4EC0143E04F +:1078800050E060E070E00E942F0F44E050E063E0C1 +:1078900070E0CE01039604C044E050E060E070E088 +:1078A000DF91CF910C942F0FCF93DF931F92CDB721 +:1078B000DEB72091392F273029F447E050E060E00F +:1078C00070E015C0FC0130812181232732812327FC +:1078D00033812327298344E050E060E070E00E9478 +:1078E0007D0F41E050E064E070E0CE0101960E941F +:1078F0007D0F0F90DF91CF91089520E42093D00069 +:1079000026EC2093D5002093D40021E02093D000D2 +:10791000DC01680F791FA617B70741F0ED91F0E081 +:10792000EE51FA4FE491E093D300F5CFE091D5000A +:10793000F0E0EE51FA4FE491EC93E091D400F0E0E6 +:10794000EE51FA4FE4911196EC931092D000089505 +:1079500020E42093D00026EC2093D5002093D4007F +:1079600021E02093D000DC01680F791FA617B7072C +:1079700041F0ED91F0E0EE51FA4FE491E093D30045 +:10798000F5CFE091D500F0E0EE51FA4FE4918C9103 +:107990008E130AC0E091D400F0E0EE51FA4FE4916A +:1079A00081E011969C919E1380E01092D00081702E +:1079B00008958F929F92BF92CF92DF92EF92FF92A3 +:1079C0000F931F93CF93DF93DC018C91D12C30E088 +:1079D0008695D794869537958695D79486953795CD +:1079E0008695D794869537958695D79486953795BD +:1079F00011968C9111978695D79486953795869593 +:107A0000D794869537958695D7948695379586959C +:107A1000D7948695379512968C911297F0E010E0E6 +:107A20008695F795869517958695F795869517957A +:107A30008695F795869517958695F795869517956A +:107A400013968C9113978695F7958695179586953D +:107A5000F795869517958695F7958695179586954A +:107A6000F7958695179514968C91149790E020E0E1 +:107A700086959795869527958695979586952795CA +:107A800086959795869527958695979586952795BA +:107A90001596EC91E6959795E6952795E695979539 +:107AA000E6952795E6959795E6952795E69597951A +:107AB000E69527954B01DA014C5F5F4F0C91E4018D +:107AC000B9904E01B026C32FD0E0BE0160557F4D66 +:107AD0007B01612F70E060557E4DE701F880EB017E +:107AE00088816F2D682BE22EF12CE701C055DD4D0A +:107AF0008881682B70E060577F4DEB018881869507 +:107B0000E7956F2F60718D2D817E6827892F807298 +:107B10006827832F84796827812F83776827822FAE +:107B20008A736827F62EF2946F25762F76957695D0 +:107B30006727FB2CF6266695F6267D2D6F2F892F5D +:107B4000F694879567957795B694C72ED12CE60164 +:107B5000C055DF4D6E01E62EF12CE701C055DE4D1C +:107B60007E01E601F881E7019881EF2EE92AC82E0F +:107B7000D12CE601C055DD4D9881E92AF12CE701B1 +:107B8000C057DF4D98819695E795F12FF071932FAF +:107B9000917EEF2EE926922F9072E926972F947905 +:107BA000E926962F9377E926982F9A73E926FE2CDB +:107BB000F294EF24CE2CC694C694EC24FB2CFE2425 +:107BC000E694FE24F694279517953795B694C32E20 +:107BD000D12CE601C055DF4D6E01E12EF12CE701FD +:107BE000C055DE4D7E01E601F881E7019881EF2E58 +:107BF000E92AC22ED12CE601C055DD4D9881E92A33 +:107C0000F12CE701C057DF4D98819695E795F62F47 +:107C1000F071972F917EEF2EE926982F9072E9262A +:107C2000932F9479E926912F9377E926922F9A73CF +:107C3000E926FE2CF294EF24CE2CC694C694EC24B4 +:107C4000FB2CFE24E694FE24F82FF694F795679516 +:107C50007795B694872F90E0EC01C055DF4D862FC5 +:107C600090E080559E4DF880EC0188818F29EF2EA1 +:107C7000F12CE701C055DD4D9881892B90E08057AC +:107C80009F4DEC0188818695E795912F9071832F08 +:107C9000817EE92EE826822F8072E826872F84795C +:107CA000E826862F8377E8268F2F8A73E826FE2C16 +:107CB000F294EF24CE2CC694C694EC24FB2CFE2424 +:107CC000E694FE24F694279517953795B694832F5E +:107CD00090E0EC01C055DF4D812F90E080559E4D26 +:107CE000F880EC0188818F29E22EF12CE701C05544 +:107CF000DD4D9881892B90E080579F4DEC01888164 +:107D00008695E795962F9071872F817EF92EF8261C +:107D10008F2F8072F826832F8479F826812F83771E +:107D2000F826822F8A73F8269F2D9295F926EF2C3C +:107D3000E694E694FE249B2D9F25F6949F258F2F95 +:107D40009695879567957795B694C72ED12CE601C1 +:107D5000C055DF4D6E01E62EF12CE701C055DE4D1A +:107D60007E01E601F881E7019881EF2EE92AC82E0D +:107D7000D12CE601C055DD4D9881E92AF12CE701AF +:107D8000C057DF4D98819695E795F12FF071932FAD +:107D9000917EF927922F9072F927972F9479F927DE +:107DA000962F9377F927982F9A73F9279F2F9295FB +:107DB000F927FF2EF694F694FF259B2D9F27F69525 +:107DC0009F279695279517953795B694C32ED12C56 +:107DD000E601C055DF4D6E01E12EF12CE701C055E3 +:107DE000DE4D7E01E601F881E7019881EF2EE92A58 +:107DF000C22ED12CE601C055DD4D9881E92AF12C27 +:107E0000E701C057DF4D98819695E795F62FF07101 +:107E1000972F917E9F27F82FF0729F27F32FF479E9 +:107E20009F27F12FF3779F27F22FFA739F27F92FC0 +:107E3000F2959F27F92FF695F6959F27FB2DF927A9 +:107E40009695F927982F8F2F869597956795779513 +:107E5000D72EF62F672F70E0EB01C055DF4D6F2F47 +:107E600070E060557E4DF880EB0188816F2D682BA6 +:107E7000E92EF12CE701C055DD4D8881682B70E0BB +:107E800060577F4DEB0188818695E795632F617E72 +:107E9000812F80718627622F607286276D2D64790D +:107EA00086276F2F63778627692F6A738627682F47 +:107EB00062958627682F669566958627B694B826BC +:107EC0008695B826812FB694279587953795182FD4 +:107ED0000E270D934A175B0709F0F0CDD092C42C02 +:107EE000F093C52C9093C62C3093C72C8093C82C4C +:107EF0002093C92CDF91CF911F910F91FF90EF90AC +:107F0000DF90CF90BF909F908F9008958F929F9217 +:107F1000AF92BF92CF92DF92EF92FF920F931F9397 +:107F2000CF93DF93FC01C62FF42EB52F8081A0E004 +:107F300050E0869557958695A79586955795869591 +:107F4000A795869557958695A79586955795869575 +:107F5000A7958181869557958695A795869557957E +:107F60008695A795869557958695A7958695579555 +:107F70008695A795828130E040E086954795869565 +:107F80003795869547958695379586954795869535 +:107F9000379586954795869537958381869547953C +:107FA0008695379586954795869537958695479515 +:107FB000869537958695479586953795648190E0A7 +:107FC00080E0669587956695979566958795669501 +:107FD0009795669587956695979566958795669525 +:107FE0009795B5806B2D669587956695979566955F +:107FF0008795669597956695879566959795669505 +:10800000879566959795B62EEA2FF0E0E055FF4DDF +:10801000032F10E000551E4DD081F8016081D62B52 +:10802000092F10E000551D4DF8016081ED2FE62B62 +:10803000F0E0E057FF4DC0800C2F172FCF2DDB2F26 +:108040007E01F4E0EF0EF11C7881F801B1918F010F +:10805000B7276B2DC6946795F42FF071E52FE17E5D +:10806000FE27E82FE072FE27EA2FE479FE27E32FB0 +:10807000E377FE27E92FEA73FE27EF2FE295FE272D +:10808000DF2ED694D694FD25EB2FEF27F695EF271C +:1080900020FDEC25E695879547955795B695C52E15 +:1080A000D12CF601E055FF4D6F01A42EB12CF50146 +:1080B000E055FE4D5F01F601D080F501C080DC285F +:1080C000E82FF0E0E055FD4DF081ED2DEF2BF0E0D5 +:1080D000E057FF4DC080C6946795F32FF071EA2FEB +:1080E000E17EFE27E92FE072FE27E52FE479FE27E7 +:1080F000E42FE377FE27E82FEA73FE27EF2FE295C0 +:10810000FE27DF2ED694D694FD25EB2FEF27F6958C +:10811000EF27DA2E20FDEC25E69597953795D79435 +:10812000CB2EC694AD2DB0E0A055BF4DE32FF0E0AF +:10813000E055FE4DAC91E081EA2BA92FB0E0A055AF +:10814000BD4DFC91EF2BF0E0E057FF4DB081B695AF +:108150006795F42FF071E52FE17EFE27E82FE0729E +:10816000FE27ED2DE479FE27E32FE377FE27E92FA5 +:10817000EA73FE27EF2FE295FE27AF2FA695A6956F +:10818000FA27EC2DEF27F695EF2720FDEB27E69554 +:10819000879547955795C694A52FB0E0A055BF4D3C +:1081A000E42FF0E0E055FE4DAC91E081EA2BA82FE2 +:1081B000B0E0A055BD4DFC91EF2BF0E0E057FF4D36 +:1081C000B081B6956795F32FF071ED2DE17EFE2716 +:1081D000E92FE072FE27E52FE479FE27E42FE3770D +:1081E000FE27E82FEA73FE27EF2FE295FE27AF2F39 +:1081F000A695A695FA27EC2DEF27F695EF2720FDFB +:10820000EB27E69597953795D794C694AD2DB0E0BA +:10821000A055BF4DE32FF0E0E055FE4DAC91E0815D +:10822000EA2BA92FB0E0A055BD4DFC91EF2BF0E05B +:10823000E057FF4DB081B6956795F42FF071E52FAB +:10824000E17EFE27E82FE072FE27ED2DE479FE2780 +:10825000E32FE377FE27E92FEA73FE27EF2FE2955E +:10826000FE27AF2FA695A695FA27EC2DEF27F695BA +:10827000EF2720FDEB27E695879547955795C69400 +:10828000A52FB0E0A055BF4DE42FF0E0E055FE4D26 +:10829000AC91E081EA2BA82FB0E0A055BD4DFC9138 +:1082A000EF2BF0E0E057FF4DB081B6956795F32FC7 +:1082B000F071ED2DE17EFE27E92FE072FE27E52F1C +:1082C000E479FE27E42FE377FE27E82FEA73FE2701 +:1082D000EF2FE295FE27AF2FA695A695FA27EC2D56 +:1082E000EF27F695EF2720FDEB27E6959795379535 +:1082F000D794C694ED2DF0E0E055FF4DA32FB0E0EC +:10830000A055BE4DF081EC91EF2BA92FB0E0A05508 +:10831000BD4DFC91EF2BF0E0E057FF4DB081B695DD +:108320006795F42FF071E52FE17EFE27E82FE072CC +:10833000FE27ED2DE479FE27E32FE377FE27E92FD3 +:10834000EA73FE27EF2FE295FE27AF2FA695A6959D +:10835000FA27EC2DEF27F695EF2720FDEB27E69582 +:10836000879547955795A52FB0E0A055BF4DE42FB1 +:10837000F0E0E055FE4DAC91E081EA2BA82FB0E093 +:10838000A055BD4DFC91EF2BF0E0E057FF4DF08183 +:10839000F6956795B62EED2DE17E632F60716E2701 +:1083A000E92FE0726E27E52FE4796E27E42FE3775B +:1083B0006E27E82FEA736E27E62FE2956E27E62FE9 +:1083C000E695E6956E27C694C6266695C62620FDD8 +:1083D000CF26C69497953795D794AD2DCD2CD12C1B +:1083E000F601E055FF4D6F01832E912CF401E0550D +:1083F000FE4D4F01F601B081F4016081B62BC92E0C +:10840000D12CF601E055FD4D6081EB2FE62BF0E01D +:10841000E057FF4DC080E72FF0E0EE51FB4FE491B5 +:10842000EC25EC837B257993EC16FD0609F00CCE48 +:108430005093C42C4093C52C8093C62CA093C72C7A +:108440003093C82C9093C92CDF91CF911F910F913D +:10845000FF90EF90DF90CF90BF90AF909F908F9064 +:108460000895BF92CF92DF92EF92FF920F931F93E6 +:10847000CF93DF93A091C42C5091C52C1091C62CA2 +:108480004091C72C3091C82C2091C92CFC01BC0113 +:108490006C5F7F4F0191952F90718A2F817E982775 +:1084A000812F80729827842F84799827832F837750 +:1084B0009827822F8A739827892F82959827892F4A +:1084C000869586959827C42ED12CE601C055DF4DA0 +:1084D0006E01E32EF12CE701C055DE4D7E01E60171 +:1084E000B881E7018881B82BE22EF12CE701C05555 +:1084F000DD4D8881CB2FC82BD0E0C057DF4DB88130 +:10850000B027B92796959B270695812F9695879535 +:108510005795A795B32FB071942F917EB927922FBD +:108520009072B9279A2F9479B927952F9377B92705 +:10853000982F9A73B9279B2F9295B9279B2F9695C1 +:108540009695B927CA2ED12CE601C055DF4D6E0194 +:10855000E52EF12CE701C055DE4D7E01E6011881C4 +:10856000E7019881192BE82EF12CE701C055DD4D6C +:108570009881C12FC92BD0E0C057DF4D988190273B +:108580009B27B695B927B02EB694922FB69597959E +:1085900037954795B52FB0712A2F217EB227282F06 +:1085A0002072B227242F2479B227232F2377B227D2 +:1085B000292F2A73B2272B2F2295B2272B2F2695EE +:1085C0002695B227C42FD0E08E0100551F4D6801BB +:1085D000C32FD0E08E0100551E4D7801E6010881C1 +:1085E000E7012881022BE92EF12CE701C055DD4D72 +:1085F0002881022B10E000571F4DE8012881C22F6F +:10860000CB25CB27B695BC272B2D2695B6958795E0 +:108610005795A795C32FC071B42FB17EBC27C92F22 +:10862000C072BC27CA2FC479BC27C52FC377BC270B +:10863000C82FCA73BC27CB2FC295BC27CB2FC6959A +:10864000C695BC27CA2FD0E0C055DF4D052F10E0DE +:1086500000551E4DF880E8011881F12A082F10E01E +:1086600000551D4DE8011881CF2DC12BD0E0C0571A +:10867000DF4DC881C227CB27B695BC272695B69576 +:10868000979537954795C52FC071BA2FB17EBC27F6 +:10869000C82FC072BC27C42FC479BC27C32FC3778F +:1086A000BC27C92FCA73BC27CB2FC295BC27CB2FA1 +:1086B000C695C695BC27C42FD0E0C055DF4D032F0B +:1086C00010E000551E4DF880E8011881F12A092FAD +:1086D00010E000551D4DE8011881CF2DC12BD0E0D1 +:1086E000C057DF4DC881C227CB27B695BC2726953A +:1086F000B69587955795A795D32FD071B42FB17E96 +:10870000DB27B92FB072DB27BA2FB479DB27B52F5F +:10871000B377DB27B82FBA73DB27BD2FB295DB27E2 +:108720001D2F169516951D27CA2ED12CE601C05572 +:10873000DF4D6E01E52EF12CE701C055DE4D7E01C7 +:10874000E6010881E701B8810B2BE82EF12CE70147 +:10875000C055DD4DB881C02FCB2BD0E0C057DF4DC9 +:10876000B881B227B127D12FD695DB27B22EB69488 +:10877000D695979537954795D52FD0712A2F217E7D +:10878000D227282F2072D227242F2479D227232FD3 +:108790002377D227292F2A73D2272D2F2295D2274C +:1087A0002D2F26952695BD2FB227C42FD0E08E0100 +:1087B00000551F4D6801C32FD0E08E0100551E4D9E +:1087C0007801E6010881E7012881022BE92EF12CCE +:1087D000E701C055DD4D2881022B10E000571F4DE9 +:1087E000E80118811B251B27DB2FD695D127D695AD +:1087F00087955795A795182F242F217E832F807159 +:108800002827892F807228278A2F84792827852F67 +:1088100083772827812F8A732827B22FB2952B2799 +:10882000B22FB695B6952B27EA2EF12CE701C0554D +:10883000DF4D7E01C52ED12CE601C055DE4D6E0107 +:10884000E701E880E6018881E82AC12ED12CE60103 +:10885000C055DD4D8881E82AF12CE701C057DF4D76 +:10886000B6948881CB2DC827C2272695B22FBC2766 +:108870002B2F2695979537954795292F6E177F07AC +:1088800009F008CEA093C42C5093C52C1093C62C8D +:108890004093C72C3093C82C9093C92CDF91CF9173 +:1088A0001F910F91FF90EF90DF90CF90BF900895B0 +:1088B000CF93DF93E4ECFCE2A0817181628133818C +:1088C00024819581472F40718A2F817E8427462FEE +:1088D00040728427432F44798427422F437784278B +:1088E000492F4A738427482F42958427482F46955D +:1088F00046958427482F46958427869567957795D2 +:10890000A795C32FD0E0C055DF4D422F50E0405512 +:108910005E4DB881EA018881B82B492F50E040555F +:108920005D4DEA018881CB2FC82BD0E0C05BDF4DC5 +:1089300088818695522F5071432F417E4527592FAC +:10894000507245275A2F54794527572F537745277B +:10895000562F5A734527542F52954527542F569515 +:1089600056954527542F5695452746959795279513 +:108970003795CA2FD0E0C055DF4D472F50E0405506 +:108980005E4DB881EA014881B42B462F50E0405536 +:108990005D4DEA014881CB2FC42BD0E0C05BDF4D99 +:1089A0004881842B8695572F50714A2F417E452749 +:1089B000562F50724527532F54794527522F5377FE +:1089C0004527592F5A734527542F52954527542F21 +:1089D000569556954527542F5695452746956795A4 +:1089E0007795A795C32FD0E0C055DF4D422F50E0BB +:1089F00040555E4DB881EA014881B42B492F50E0C3 +:108A000040555D4DEA014881CB2FC42BD0E0C05BBF +:108A1000DF4D4881842B8695CA2FD0E0C055DF4DAD +:108A2000472F50E040555E4DB881EA014881B42B94 +:108A3000462F50E040555D4DEA014881CB2FC42BB5 +:108A4000D0E0C05BDF4D4881842B532F517E422FF5 +:108A500040714527592F507245275A2F5479452781 +:108A6000572F53774527562F5A734527542F529522 +:108A70004527542F569556954527542F56954527EB +:108A80004695979527953795A083718362833383A5 +:108A900024839583DF91CF910895BF92CF92DF9287 +:108AA000EF92FF920F931F93CF93DF935091C42CBB +:108AB000C091C52CB090C62C4091C72C3091C82CC9 +:108AC0002091C92CFC01615008F4EAC19C2F9071DF +:108AD000852F817E98278B2D80729827842F84790B +:108AE0009827832F83779827822F8A739827892F37 +:108AF00082959827792F769576959727892F869551 +:108B00009827AC2F8B2D96958795A7955795C42FB1 +:108B1000D0E0C055DF4D032F10E000551E4D788189 +:108B2000E8019881792B022F10E000551D4DE801D6 +:108B30009881C72FC92BD0E0C059DF4D18811695F9 +:108B4000732F7071942F917E9727722F70729727D1 +:108B5000752F747997277A2F73779727782F7A73E1 +:108B60009727792F72959727792F7695769597275E +:108B7000792F76957927922F272F269597953795D8 +:108B80004795C52ED12CE601C055DF4D6E01EA2E6A +:108B9000F12CE701C055DE4D7E01E6017881E70149 +:108BA0002881722BE82EF12CE701C055DD4D28817C +:108BB000C72FC22BD0E0C059DF4D2881122B16954C +:108BC0007A2F7071252F217E2727782F7072272703 +:108BD000742F74792727732F73772727792F7A7348 +:108BE0002727722F72952727722F7695769527273C +:108BF000722F76952727BA2F26958795B795579583 +:108C0000C42ED12CE601C055DF4D6E01E32EF12CB0 +:108C1000E701C055DE4D7E01E6017881E70128813C +:108C2000722BE92EF12CE701C055DD4D2881C72FAD +:108C3000C22BD0E0C059DF4DA881A12BA695732F80 +:108C40007071242F217E2727792F70722727752F87 +:108C5000747927277B2F73772727782F7A73272715 +:108C6000722F72952727722F769576952727722F68 +:108C700076957227232F372F369597952795479509 +:108C8000C52FD0E0C055DF4D0B2F10E000551E4D15 +:108C90007881E8013881732B082F10E000551D4DB5 +:108CA000E8013881C72FC32BD0E0C059DF4DD881F0 +:108CB000AD2BA6957B2F7071352F317E3727782FFE +:108CC00070723727742F74793727722F737737278D +:108CD000792F7A733727732F72953727732F7695ED +:108CE00076953727732F7695372736958795B795DD +:108CF0005795C42FD0E0C055DF4D022F10E000552E +:108D00001E4D7881E8013881732B092F10E0005542 +:108D10001D4DE8013881C72FC32BD0E0C059DF4D6E +:108D2000D881AD2BA695722F7071342F317E7327A9 +:108D3000392F30727327352F347973273B2F3377D0 +:108D40007327382F3A737327372F32957327372FAE +:108D5000369536957327372F36957327342F7695AA +:108D6000979527953795C52FD0E0C055DF4D0B2F30 +:108D700010E000551E4D7881E8014881742B082FC2 +:108D800010E000551D4DE8014881C72FC42BD0E0ED +:108D9000C059DF4DD881DA2BD6957B2F7071452FC6 +:108DA000417E7427482F40727427432F44797427DB +:108DB000422F43777427492F4A737427472F4295D0 +:108DC0007427A72FA695A6957A27472F469574272F +:108DD0004B2F7695879547955795C42FB82EA32F7F +:108DE000B0E08D0100551F4D6801A22FB0E08D014C +:108DF00000551E4D7801D6010C91D7018C91082B9E +:108E0000E92EF12CD701A055BD4D8C91082B10E017 +:108E100000591F4DD8018C91D82BD695732F717E98 +:108E2000822F80717827892F80727827852F847907 +:108E30007827842F837778278B2D8A737827872F3D +:108E400082957827A72FA695A6957A27872F8695AE +:108E50007827432F322F272F2695979537954795BB +:108E6000292F852F90E080559F4D0C2F10E0005545 +:108E70001E4DDC019C91D8018C91892B0B2D10E0AB +:108E800000551D4DD8019C91892B90E080599F4D34 +:108E9000DC019C918D2F892B90818927819313CEA2 +:108EA0005093C42CC093C52CB092C62C4093C72CB1 +:108EB0003093C82C2093C92CDF91CF911F910F9133 +:108EC000FF90EF90DF90CF90BF900895EF92FF92C8 +:108ED0000F931F93CF93DF937091C42C5091C52CA7 +:108EE0002091C62C4091C72C3091C82CC091C92C20 +:108EF000E42FF0E0E055FF4DA32FB0E0A055BE4DAC +:108F0000F081EC91EF2BAC2FB0E0A055BD4DFC9162 +:108F1000EF2BF0E0E057FF4D1081DC01D0E0615015 +:108F200008F4DBC11695D795952F9071872F817E18 +:108F30008927922F90728927942F94798927932FCC +:108F4000937789279C2F9A738927982F9295892741 +:108F5000E82FE695E6958E27982F96958927869592 +:108F6000279557957795D695932F9071842F817E6D +:108F700089279C2F90728927972F94798927952F7D +:108F800093778927922F9A738927982F929589270B +:108F9000E82FE695E6958E27982F969589279C2FA2 +:108FA0008695979537954795E72FF0E0E055FF4D6B +:108FB000052F10E000551E4DC081F8018081C82B9F +:108FC000022F10E000551D4DF8018081EC2FE82B99 +:108FD000F0E0E059FF4D8081D82BD695E52FE07168 +:108FE000872F817E8E27E22FE0728E27E42FE4798F +:108FF0008E27E32FE3778E27E92FEA738E27E82F5A +:10900000E2958E27E82FE695E6958E27E82FE695E0 +:109010008E278695279557957795E42FF0E0E055B4 +:10902000FF4D032F10E000551E4DC081F8018081D7 +:10903000C82B092F10E000551D4DF8018081EC2F41 +:10904000E82BF0E0E059FF4D8081D82BD695E32F37 +:10905000E071842F817E8E27E92FE0728E27E72F23 +:10906000E4798E27E52FE3778E27E22FEA738E27A8 +:10907000E82FE2958E27E82FE695E6958E27E82FD4 +:10908000E6958E278695979537954795E72FF0E0DB +:10909000E055FF4D052F10E000551E4DC081F80131 +:1090A0008081C82B022F10E000551D4DF8018081F2 +:1090B000EC2FE82BF0E0E059FF4D8081D82BD695BE +:1090C000E52FE071872F817E8E27E22FE0728E27B9 +:1090D000E42FE4798E27E32FE3778E27E92FEA73D5 +:1090E0008E27E82FE2958E27E82FE695E6958E27C6 +:1090F000E82FE6958E278695279557957795E42F47 +:10910000F0E0E055FF4D032F10E000551E4DC081EB +:10911000F8018081C82B092F10E000551D4DF80182 +:109120008081EC2FE82BF0E0E059FF4D8081D82BB7 +:10913000D695E32FE071842F817E8E27E92FE07290 +:109140008E27E72FE4798E27E52FE3778E27E22F0E +:10915000EA738E27E82FE2958E27E82FE695E695AD +:109160008E27E82FE6958E27869597953795479514 +:10917000E72FF0E0E055FF4D052F10E000551E4DA4 +:10918000C081F8018081C82B022F10E000551D4DD1 +:10919000F8018081EC2FE82BF0E0E059FF4D808151 +:1091A000D82BD695E52FE071872F817E8E27E22F71 +:1091B000E0728E27E42FE4798E27E32FE3778E2762 +:1091C000E92FEA738E27E82FE2958E27E82FE695A0 +:1091D000E6958E27E82FE6958E2786952795579555 +:1091E0007795E42FF0E0E055FF4D032F10E0005598 +:1091F0001E4DC081F8018081C82B092F10E0005559 +:109200001D4DF8018081EC2FE82BF0E0E059FF4D77 +:109210008081D82BD695E72FF0E0E055FF4D052F44 +:1092200010E000551E4DC081F8018081C82B022F2F +:1092300010E000551D4DF8018081EC2FE82BF0E087 +:10924000E059FF4D8081D82BE42FE17E832F807180 +:10925000E827892F8072E827872F8479E827852FD0 +:109260008377E827822F8A73E8278E2F8295E82755 +:109270008E2F86958695E8278E2F8695E827E6958A +:10928000979537954795C92FE42FF0E0E055FF4DAE +:10929000832F90E080559E4D1081FC018081182B1A +:1092A0008C2F90E080559D4DFC018081E12FE82BB3 +:1092B000F0E0E057FF4D10818C91E82FF0E0EE5187 +:1092C000FB4FE4917D01F0E8EF0EF11C9E2F9127FA +:1092D000F70190838D278D9322CE7093C42C5093E9 +:1092E000C52C2093C62C4093C72C3093C82CC09318 +:1092F000C92CDF91CF911F910F91FF90EF900895AE +:109300000F931F93FC01862F4081518162817381ED +:109310008B0122273327803208F471C0D80123E063 +:10932000B695A7952A95E1F70A271B279801369548 +:10933000279536952795BBE0769567955795479580 +:10934000BA95D1F70227132720E030E095E1000F0E +:10935000111F221F331F9A95D1F7402B512B622BDF +:10936000732B8B0122273327D80133E0B695A795BD +:109370003A95E1F70A271B279801369527953695E8 +:109380002795BBE07695679557954795BA95D1F7A0 +:109390000227132720E030E095E1000F111F221F64 +:1093A000331F9A95D1F7402B512B622B732B8B01D6 +:1093B00022273327D80133E0B695A7953A95E1F7F0 +:1093C0000A271B2798013695279536952795BAE0E9 +:1093D0007695679557954795BA95D1F70227132744 +:1093E00020E030E096E1000F111F221F331F9A95F5 +:1093F000D1F7402B512B622B732B805289CF4083A6 +:109400005183028373831F910F910895AF92BF928E +:10941000CF92DF92EF92FF920F931F93CF93DF9340 +:109420006730710509F451C09B0127703327232B46 +:1094300009F04EC05B016C01EB0183E0D695C79546 +:109440008A95E1F77B0196E0F694E7949A95E1F727 +:10945000EC0EFD1EEC0CFD1C8E01015011090C0DD3 +:109460001D1DA701401B510B60E070E0C801019673 +:109470000E945E5C0C151D0520F1D801EC91F0E016 +:10948000EE51FB4F2491D701CD010A171B0768F459 +:10949000FC018081982F990F8E91881F8827881F43 +:1094A000892B11968C931197EFCF11968C91119770 +:1094B0008E7FE22FE170E82B1196EC930150110999 +:1094C000D9CFC5018C0F9D1F04C087E090E001C07B +:1094D000CB01DF91CF911F910F91FF90EF90DF9023 +:1094E000CF90BF90AF900895CF93DF93EC0182ECC3 +:1094F000888361E070E0CE010E947D3C8AE0809329 +:10950000A42D1092A52D68E170E0CE01DF91CF91DE +:109510007DCFEF92FF920F931F93CF93DF93EC01D8 +:10952000CB0167307105E1F169E070E00E948E5B6C +:10953000DE0180E090E008E010E08617970751F127 +:10954000FC0133E0F695E7953A95E1F7E80FF91F4E +:10955000AC0147705527EC0FFD1F208130E0042E31 +:1095600002C0359527950A94E2F72C9341155105D1 +:1095700071F0E181F0E07801E41AF50AA7017F01BA +:1095800002C0EE0CFF1C4A95E2F72E292C9301969F +:109590001196D3CF23E0880F991F2A95E1F702C0D7 +:1095A00087E090E0DF91CF911F910F91FF90EF90B6 +:1095B0000895EF92FF920F931F93CF93DF939C0137 +:1095C000CB016730710509F440C069E070E00E948A +:1095D0008E5B80E090E048E050E086179707A9F1A5 +:1095E000DC01E3E0B695A795EA95E1F7A80FB91F6E +:1095F000EC01C770DD27A20FB31FEC91F0E00C2E39 +:1096000002C0F595E7950A94E2F7209759F0119674 +:109610000C9111977A01EC1AFD0A01C0000FEA942F +:10962000EAF7E02BF0E0EE51FB4FE4911196AC919C +:10963000B0E002C0B595A795CA95E2F7ED01CE2737 +:10964000FE01E0FD04C00196C8CF81E001C080E0CA +:10965000DF91CF911F910F91FF90EF90089510929D +:10966000A42D08951092A42D1092CA2C1092A52D0D +:109670000895F8DF0E942C2C1092A42D08950895CF +:109680000895DC0123E633E66150E8F04D91942F14 +:10969000922780E1989FA00111244927E42FF0E050 +:1096A000232F332742954F70C9018427AC013E2FE9 +:1096B00022272427352743E0EE0FFF1F4A95E1F7C5 +:1096C0002E273F27E1CFC9010895EF92FF921F9304 +:1096D000CF93DF93EC017B018091A52D882339F096 +:1096E0008091A42D823008F0DBC01092A52DE114EA +:1096F000F10461F0B701CE015CDF882309F4D3C027 +:10970000B701CE0106DF7C0181E001C082E010914B +:10971000A42D163090F4133070F51230A8F484E0C4 +:1097200090E080931E2090931F2082E5888382E042 +:109730008093A42D87E090E0C7C0193008F467C07B +:109740001A3009F496C0ACC090E1E916F10411F4A6 +:1097500080FD03C01092A42D92C0888199818093CE +:10976000962D9093972D83E9888380E2898383E007 +:109770008093A42D6AC080FFEDCF88E2E816F10443 +:1097800048F32881898182279A8189279B818927AB +:109790009C818913DFCFA12FB0E01397CD01880FF3 +:1097A000991FA80FB91FA756B24D283821F483E09E +:1097B000FE01319602C084E0FE0101900D928A956F +:1097C000E1F745E050E0BE01CE0102960E944D5CFB +:1097D000133021F0143021F485E903C083E901C07E +:1097E00087E9888380E7898367E070E0CE010E9483 +:1097F0007D3C8091A42D8D5F8093A42D68E470E062 +:10980000CE01DF91CF911F91FF90EF90FFCD80FFB0 +:10981000A1CF98E1E916F10409F09CCF63E0CE01F5 +:1098200030DF009709F096CF288122FF11C0183051 +:1098300079F0163011F485E901C087E9888380E268 +:1098400089832EEF210F2093A42D60E170E0D8CF03 +:1098500021E02093A52D212F30E026503109322F11 +:10986000330F230F2C5F2093A32D28812093982D55 +:109870002BC0982F927031F081E08093A42D0E942C +:10988000252C0EC080FF05C063E0CE01FADE892BD7 +:1098900099F3CE01DF91CF911F91FF90EF9024CEED +:1098A00080E090E011C0A701495F5F4F83E05695CB +:1098B00047958A95E1F7E0913B2FF0913C2FBE014F +:1098C00081EC199580E023CFDF91CF911F91FF901C +:1098D000EF9008959F92AF92BF92CF92DF92EF9256 +:1098E000FF920F931F93CF93DF93CDB7DEB7C75689 +:1098F000D109CDBFDEBF8C017B01FB01608171818D +:10990000E4DED090A52DDD2009F445C18091A42D81 +:109910009AEF980F933008F057C0F8018081807259 +:10992000C82E1092862D5DE4A52E51E1B52E912C06 +:1099300047E650E0B501CE0101960E94165C8B818E +:10994000882349F029813A818091962D9091972D15 +:1099500028173907B9F48D81882329F09C818091DB +:10996000982D98130FC08F89882311F0CC2051F0C7 +:10997000E091862D81E08E0F8093862DF0E0E957EF +:10998000F24D90829394F7E6AF0EB11C8FE09812DF +:10999000CFCFC1100DC08091A42D9AEF980F9430B5 +:1099A00008F0AEC02091862DE7E8FDE280E08FC090 +:1099B00080EEF801808380E8818362E070E0C80176 +:1099C0000E947D3C89E095C0893029F7F7016081CC +:1099D0007181C801EEDDF70160817181811115C0CF +:1099E000CB01089667E070E00E948E5B462FE09105 +:1099F0003B2FF0913C2FB80181EC1995C80174DD23 +:109A0000F70180839183D12CC9C0C80182DDF701A1 +:109A100080839183F8016081262F30E043E09695A2 +:109A200087954A95E1F702972817390739F76E5F4E +:109A3000C80127DE892B11F7C12C97E6992E580112 +:109A4000FFEFAF1ABF0A8091862DC81608F0A3CF8A +:109A5000EC2DF0E0E957F24D6081969EB0011124A3 +:109A6000635B7E4E47E650E0CE0101960E94165C95 +:109A70008F89882349F14E8950E0F801808190E078 +:109A800001974817590741F02091862D422F50E049 +:109A9000415051093C2D08C0B501CE0106960E94E7 +:109AA000375C892B89F710C0832F90E084179507C6 +:109AB0003CF4FC01E957F24D818180833F5FF4CF94 +:109AC00021502093862DCA94C394BDCF8F5F8217F7 +:109AD00009F464C0919194509230C0F782E0F8018B +:109AE000808380E6818362E070E0C8010E947D3C53 +:109AF0008BE08093A42D60E270E0C80187DC80CF0A +:109B00008B3009F04BC0F7016081718161157105DF +:109B100009F43EC0C8014DDDD82EF7016081718186 +:109B2000811113C0CB01089667E070E00E948E5B44 +:109B3000462FE0913B2FF0913C2FB80181EC199515 +:109B40001092862DC801D0DC26C0C801E2DCF701E6 +:109B500080839183BC0183E0769567958A95E1F7D0 +:109B6000C8018FDD892B19F01092862D47CFF8019F +:109B70008581882331F0813059F48093862D85E0EA +:109B800004C081E08093862D84E08093872D06C0F9 +:109B90001092862D03C0F701808391838D2DC959C2 +:109BA000DF4FCDBFDEBFDF91CF911F910F91FF90AF +:109BB000EF90DF90CF90BF90AF909F9008955F920D +:109BC0006F927F928F929F92AF92BF92CF92DF92CD +:109BD000EF92FF920F931F93CF93DF93CDB7DEB732 +:109BE000C254D240CDBFDEBF7C01CF5BDD4F688366 +:109BF0007983C154D2408091CA2C843009F48BC13E +:109C000040F4823009F4D6C008F060C1813051F0D0 +:109C10008CC4863009F41EC308F446C2873009F4A8 +:109C2000C8C383C40091212F1091222F0115110563 +:109C3000C1F0A801495F5F4F63E0569547956A956B +:109C4000E1F761E27EE2C7010E94445C6091212F4E +:109C50007091222FC701DADB1092212F1092222F50 +:109C600021C2CF5BDD4F68817981C154D24061153B +:109C7000710509F4C7C0C7019CDCD82ECF5BDD4F4E +:109C800068817981C154D240C70143DCCF5BDD4F8D +:109C900088839983C154D2409C01295F3F4FC901F9 +:109CA000880F991F53E0969587955A95E1F7069688 +:109CB0008138910578F066EB73E2CE0101960E943F +:109CC000705C1092CA2CBE016F5F7F4F85E60E94C8 +:109CD000F2226BC4B3E036952795BA95E1F7A70158 +:109CE00060E870E0CE0101960E949A0E7C01CF5B85 +:109CF000DD4F8881C154D240CE5BDD4F9881C25484 +:109D0000D240CF5FDD4F9883C150D240CE5FDD4F50 +:109D10008883C250D24085EC93E29F938F9380E872 +:109D2000A82EB12CC5018E199F099F938F9381E0B6 +:109D300090E08C0F9D1F8E0D9F1D9F938F930E940F +:109D4000775CE80EF91EB5016E197F0922E030E05C +:109D5000AE014F5F5D4F81E090E08C0F9D1F8E0D37 +:109D60009F1D0E949A0E8E0D9F1D0F900F900F90B9 +:109D70000F900F900F909501281B390B41E050E098 +:109D80004C0F5D1F840F951FD11003C048EC53E2A8 +:109D900002C047ED53E25F934F933F932F939F93FE +:109DA0008F930E94775C0F900F900F900F900F9001 +:109DB0000F9087CF0091212F1091222F01151105AF +:109DC000C1F0A801495F5F4FA3E056954795AA955A +:109DD000E1F761E27EE2C7010E94445C9091212F8D +:109DE0008091222F1092212F1092222F092F182FAD +:109DF000DCC3CF5BDD4F28813981C154D2402115AE +:109E0000310551F488E0EBE4F4E2DE0111960190B3 +:109E10000D928A95E1F755CF295F3F4FE3E03695E4 +:109E20002795EA95E1F7A70160E870E0CE01019679 +:109E30000E949A0E7C01CF5BDD4F8881C154D240D5 +:109E4000CE5BDD4F9881C254D240CF5FDD4F988307 +:109E5000C150D240CE5FDD4F8883C250D24085ECE6 +:109E600093E29F938F93F0E8CF2ED12CC6018E19E9 +:109E70009F099F938F9381E090E08C0F9D1F8E0D23 +:109E80009F1D9F938F930E94775C8E0D9F1DB6013F +:109E9000681B790B22E030E0AE014F5F5D4FA1E01F +:109EA000B0E0AC0FBD1F8A0F9B1F0E949A0E10924C +:109EB000CA2CBE016F5F7F4F85E60E94F2220F9091 +:109EC0000F900F900F900F900F906FC3CF5BDD4FEF +:109ED00068817981C154D240C701F7DB2091A52D5B +:109EE000222309F425C32091A32D30E049E95DE246 +:109EF00064E170E0CE0101960E949A0EBE016F5F90 +:109F00007F4F85E60E94F2221092A52D1092CA2C56 +:109F10000E9488230AC38091852D811108C080E8A2 +:109F200090E00E94D52381E08093852D7BC0813015 +:109F300009F07AC08091A42D823008F075C080911C +:109F4000842D8F5F8093842D803109F06DC00E9435 +:109F5000E0238C019350409768F00115B8E01B078F +:109F600008F460C0E0E1F0E020E030E0A12CB12C8A +:109F700060E040C0ACE0BDE240E050E020E030E016 +:109F800080E090E0E0E0F0E060E07D91703149F445 +:109F90004732510509F405C361110EC0FA0161E0B1 +:109FA0000BC0662349F0BA016E1B7F0B6817790757 +:109FB00010F09F01CB0160E04F5F5F4F48325105C9 +:109FC00021F78430910508F03BC22CC0D601ED90FA +:109FD0006D01F12CEE16FF06B0F4611119C04F5F50 +:109FE0005F4F4837510591F7009709F029C2319723 +:109FF00009F426C27CE0C72E7DE2D72E40E050E077 +:10A0000080E090E0E3CF6111EACF5A0161E0E7CF51 +:10A01000BA016A197B096817790710F09501CB011D +:10A0200060E0DDCF1092842DCF5BDD4F68817981B8 +:10A03000C154D240C70149DB2091A52D222309F448 +:10A0400077C2E0913E2FF0913F2F0284F385E02DFF +:10A05000E058F10954E0F695E7955A95E1F7E45F89 +:10A06000F24D80818F5F80838091842D803121F437 +:10A070000E94E0231092842D1092A42D0E94252C82 +:10A0800080E5F7018083118262E070E0C7010E94E1 +:10A090007D3C81E08093A42D1092A52D60E270E0BC +:10A0A000C701B4D98C0181C2CF5BDD4F6881798152 +:10A0B000C154D240C70109DB2091A52D222309F408 +:10A0C00037C2D0900B2DDD2009F445C0CF5BDD4FAA +:10A0D00008811981C154D2400115110549F410922B +:10A0E0000B2D1092A52D1092A42D0E94252C5DC23F +:10A0F000023A110538F0B801C7015BDA01E08027A8 +:10A10000082F02C001E010E0CF5BDD4F688179814C +:10A11000C154D240C701FDD9CF5BDD4F88839983FD +:10A12000C154D24000FD05C062E1C701AADA892B03 +:10A1300029F0ACEFAD0DA0930B2D2AC0F4E0DF9E0B +:10A14000D0011124A554B34D80E1F70101900D9287 +:10A150008A95E1F71DC042E050E062E872E1CE016D +:10A1600001960E94165CE5E8F2E1E4912091962DBB +:10A170003091972D89819A812817390721F4809190 +:10A18000982DE81729F01092A42D0E94252CCDC1FE +:10A1900080910B2D803109F04DC01092A52D1092A9 +:10A1A0000B2D1092CA2C20E130E04BEC5CE267E80A +:10A1B00070E0CE0101960E949A0E65EC73E2CE012A +:10A1C00081960E94705C20E130E04BED5CE265E638 +:10A1D00070E0CE0183960E949A0E65EC73E2CE0188 +:10A1E0008D5B9F4F0E94705C20E130E04BEE5CE2A3 +:10A1F00063E470E0CE018B5B9F4F0E949A0E65EC8A +:10A2000073E2CE018B599F4F0E94705C20E130E0D9 +:10A210004BEF5CE261E270E0CE0189599F4F0E94F2 +:10A220009A0E0E948823BE016F5F7F4F85E60E94D1 +:10A23000F2227BC190E3D7019C9311968C9362E04C +:10A2400070E0C7010E947D3C80910B2D8C5F809354 +:10A250000B2D24CFBE016F5B7D4FC7013BDB8823F5 +:10A2600009F4E7C08091862D811103C06DEE73E281 +:10A2700027C08130A1F0912C80E090E000E010E058 +:10A2800027E6822E7E01BFEFEB1ABDEFFB0A30E01E +:10A29000C32E34E2D32EA12C42E0B42E40C06091F4 +:10A2A000872DE7E66E9FB00111246C587E4E40E486 +:10A2B00050E0CE0101960E94165CBE016F5F7F4F99 +:10A2C00085E60E94F22255C00130F2E01F0760F5DA +:10A2D000E92DF0E0E957F24D6081869EB00111242E +:10A2E0006C587E4E40E450E0C7010E94165CFF921D +:10A2F000EF92DF92CF92C501801B910B9F938F93BA +:10A3000081E090E08C0F9D1F800F911F9F938F9392 +:10A310000E94775C080F191F9394CDBFDEBF209178 +:10A32000862D921688F204C0081B190BF12C06C06A +:10A33000013032E01307C0F7FF24F394EDEFFFEF95 +:10A34000EC0FFD1FE00FF11F8EE28083EEEFFFEFB9 +:10A35000EC0FFD1FE00FF11F1082BE016F5F7F4FFA +:10A3600085E60E94F222F11004C088EE90E10E947E +:10A37000321981EE90E10E94321962E070E086E9C4 +:10A380009DE20E9410238BED90E10E9432196091B2 +:10A39000A32D70E089E99DE20E94102385ED90E1F4 +:10A3A0000E94321961E070E088E99DE20E9410236A +:10A3B00037C0BE016F5B7D4FC7018CDA8823C9F1BE +:10A3C0008091862D813039F58091872D833009F475 +:10A3D000BDC028F4813059F0823099F0DFC08A3056 +:10A3E00031F008F4DBC08D50823058F0D7C0809136 +:10A3F000A32D843009F4ACC0873009F0CFC015E03C +:10A40000AAC08091A32D843009F4A4C0873009F03C +:10A41000C5C017E0A0C067E074E285E60E94F222A2 +:10A420001092CA2C1092862D0E9488231092A52D7E +:10A430007CC0CF5BDD4F08811981C154D240B5C0CB +:10A440001092852D009709F475C096958795285F21 +:10A450003F4F820F931F54E0880F991F5A95E1F7E1 +:10A460000E94D523E0913E2FF0913F2F62857385A6 +:10A47000CF0183539F428F5F9F4F0E94EE6260E047 +:10A4800070E085E60E94F2220115184008F455C0DC +:10A49000B8E7AB2EB12C0CE01DE260E8E62EF12C03 +:10A4A00073EE672E73E2772EEAE05E2EFE013196A0 +:10A4B0006F01F9EE8F2EF3E29F2EFF92EF927F92C3 +:10A4C0006F921F925F92DF92CF920E94775CC601DB +:10A4D0000E942D19D8018C91CDBFDEBF882389F150 +:10A4E0001F928F939F928F921F925F92DF92CF92D3 +:10A4F0000E94775CC6010E942D19CDBFDEBF8AE4A1 +:10A5000091E10E943219D8011D928D01B0E1EB0E4C +:10A51000F11CC8018C509D428A159B0570F2109267 +:10A52000A52D1092CA2C0E942C2C00E010E03DC0FA +:10A530008C013BC00E94F02395CFA8E2AA2EB12C3B +:10A54000AACF6DE283E090E273D7D9CF11E003C0C8 +:10A5500014E001C016E06DE274E285E60E94F2228A +:10A56000812F0E94FD0DE0912B2FF0912C2F19953A +:10A57000E091352FF091362F89E99DE21995E09110 +:10A580003B2FF0913C2F4091392F69E97DE283E127 +:10A5900019950E9490100E94121742CF68E374E24E +:10A5A0003CCF662309F40DCDFECCC801CE5BDD4F58 +:10A5B000CDBFDEBFDF91CF911F910F91FF90EF9044 +:10A5C000DF90CF90BF90AF909F908F907F906F90D3 +:10A5D0005F90089581E080931F2EE0913E2FF091CF +:10A5E0003F2F82859385809320209093212008958A +:10A5F00010921F2E1092A62D089508950895F8CF59 +:10A600000F931F93CF93DF93CDB7DEB72A97CDBFBC +:10A61000DEBF2091A62D213009F026C18C0180914A +:10A620001F2E833009F446C028F4813061F0823057 +:10A63000D1F019C1853009F452C008F476C08630D3 +:10A6400009F499C010C188E0809306068091202EFD +:10A65000811109C1F8018081863219F0823509F033 +:10A6600002C182E076C08091202E8130B1F4623147 +:10A67000710599F4F801808185FD0FC08181807E8C +:10A6800061F4828180FD09C062E170E0C8010E942E +:10A69000D94A882311F083E05CC08091202E81117B +:10A6A0005BC0F8018081863209F4DDC0823509F093 +:10A6B00053C0D9C08091202E81114EC060317105E8 +:10A6C00009F04AC0F8018081982F907F903909F0F5 +:10A6D00043C08970813009F03FC085E03AC0809165 +:10A6E000202E813061F46D32710549F46DE270E025 +:10A6F000C8010E94D94A882311F084E02AC081E071 +:10A7000080931F2E88E080930606809120209091F0 +:10A710002120811528E0920708F494C060E070E0E1 +:10A7200083E594E20E94F2229EC08091202E811146 +:10A7300013C06834710581F4F8018081982F907FEF +:10A74000903951F48970813039F48181803721F456 +:10A7500086E080931F2E87C081E080931F2E88E0C3 +:10A760008093060680912020909121208115F8E0A9 +:10A770009F07A0F667C08091202E813009F053C05A +:10A780006B31710509F04FC06BE170E0C8010E94A8 +:10A79000D94A882309F447C0F801808182FD7BCF24 +:10A7A00081E080931F2E88E080930506E0912020B1 +:10A7B000F0912120E058F10994E0F695E7959A95FB +:10A7C000E1F7E955F24D80818F5F808360E070E0B2 +:10A7D00085E60E94F222809121208F938091202093 +:10A7E0008F9383EE93E29F938F931F928AE08F93D0 +:10A7F0008E010F5F1F4F1F930F930E94775CC8015C +:10A800000E942D19E0913E2FF0913F2F62857385B4 +:10A81000CF0183539F428F5F9F4F0E94EE62E8DE1D +:10A82000CDBFDEBF20C081E080931F2E88E08093E3 +:10A83000060680912020909121208115E8E09E0756 +:10A8400008F06CCFFC01E058F10984E0F695E7953B +:10A850008A95E1F7E955F24D10820E94E02380933A +:10A8600020209093212002C080E090E02A96CDBF66 +:10A87000DEBFDF91CF911F910F9108950F931F932A +:10A88000CF93DF93CDB7DEB7EA97CDBFDEBF05EA42 +:10A8900013E395D2F80181938F01F3E30D3A1F077B +:10A8A000C1F70E94E21906D3882309F4FAC0809107 +:10A8B000A5339091A633953009F46FC030F49130F0 +:10A8C00069F168F0933051F1ECC0983009F4C2C0DE +:10A8D000993009F4C8C0963009F0E3C072C08038DE +:10A8E00091F0823809F0DDC08091A9338F7087D252 +:10A8F000E091AF33F091B033118112FB112710F9C1 +:10A9000080E07DD206C01091A1338091A2338111E5 +:10A910001260EAD2812F63D280E0A1C0282F2D7F60 +:10A9200009F0BFC0882319F0823061F0BAC080916D +:10A93000A733813009F0B5C0933009F080E08093EF +:10A94000A23327C08091A733811123C0E091A9339E +:10A950001E2F1F7009F4A5C0812F51D28091A633FC +:10A96000833011F4EDD215C0E091AF33F091B033E4 +:10A9700081818B7F818324E8129FF0011124ED50A7 +:10A98000FC4C1082E091AF33F091B03380818E7F28 +:10A99000808380E034D2A8D264C0811182C010913B +:10A9A000A7331F77A1D28FD35FD28823E9F3109307 +:10A9B000C304111102C082E001C083E08093A4337C +:10A9C00070C08058823008F06CC08091A73390919D +:10A9D000A8338C3DE3E09E0761F583E08A838AE338 +:10A9E00089834FB7F894DE01139620E038E052E0F7 +:10A9F0005093CA01E32FF0E0E4911092CA0120FFC6 +:10AA000003C0E295EF703F5FEF708E2F90E0EA3069 +:10AA100010F0C79601C0C0968D939D932F5F2C3187 +:10AA200039F74FBF61D26AE370E0CE010196A5D03D +:10AA30000FC0AE014F5F5F4F6091A9330E940E0DB2 +:10AA40008C01892B71F150D2B80189819A8111D181 +:10AA5000A7D127C0803829F547D28091A033BFD134 +:10AA600086D131D31EC081111CC08091A733909133 +:10AA7000A83399270297ACF437D28091A7338093FB +:10AA8000A03321D38091A033811106C08091C304EB +:10AA9000811102C081E001C084E08093A4330E9450 +:10AAA000DE1908D2882311F01FD24AD2EA96CDBF10 +:10AAB000DEBFDF91CF911F910F9108950895CF933D +:10AAC0008091A433882351F0C091B13380E097D1B5 +:10AAD000F1D18111D3DE8C2FCF9191C1CF91089507 +:10AAE000CF92DF92EF92FF920F931F93CF93DF935A +:10AAF000EC018B017A01FDD2811136C0E114F10421 +:10AB000039F0F70180819181081B190BC80FD91FFB +:10AB1000C12CD12C0115110531F18091AD339091EB +:10AB2000AE33FC01EF5BFF4F208131978081281706 +:10AB300090F01DD1C4DFE114F10449F0F7018081E8 +:10AB40009181C80ED91EC082D18285E00DC0D1D2BC +:10AB5000882301F309C0899142D101501109FFEF07 +:10AB6000CF1ADF0AD7CF80E0DF91CF911F910F91ED +:10AB7000FF90EF90DF90CF900895DF92EF92FF92D9 +:10AB80000F931F93CF93DF93D82FC92F8B01809101 +:10AB9000B133806834D18091AB339091AC3380175E +:10ABA000910728F00115110519F4E1D001C08C01BD +:10ABB000ED2EFC2ED12C0115110509F440C0809119 +:10ABC000A433811102C082E04CC0853011F483E0CF +:10ABD00048C070D1882311F081E043C051D1811168 +:10ABE0003CC042D1882339F32091B1338091AD33F9 +:10ABF0009091AE33FC0127FF05C0EF5BFF4FC08192 +:10AC0000D0E013C0E05CFF4FC08131968081D0E07E +:10AC1000C81BD1090AC0C830D10550F4F701819191 +:10AC20007F01DDD00150110921960115110599F719 +:10AC3000DD24D394289709F0D12C99D0BCCFD11022 +:10AC4000BECF0BC08091A433882309F4BCCF8530DC +:10AC500009F4BDCF2FD18111BFCF12D1882391F339 +:10AC600080E0DF91CF911F910F91FF90EF90DF90E7 +:10AC70000895DF92EF92FF920F931F93CF93DF938C +:10AC8000D82FC92F8B018091B1338068B8D08091C3 +:10AC9000AB339091AC338017910728F00115110563 +:10ACA00019F465D001C08C01ED2EFC2ED12C0115BC +:10ACB000110509F442C08091A433811102C082E0E1 +:10ACC0004EC0853011F483E04AC0F4D0882311F0DF +:10ACD00081E045C0D5D081113EC0C6D0882339F36C +:10ACE0002091B1338091AD339091AE33FC0127FFB9 +:10ACF00005C0EF5BFF4FC081D0E015C0E05CFF4FA7 +:10AD0000C08131968081D0E0C81BD1090CC0C83009 +:10AD1000D10560F4F701849162D0FFEFEF1AFF0ACA +:10AD20000150110921960115110589F7DD24D394ED +:10AD3000289709F0D12C1BD0BACFD110BCCF0BC0B3 +:10AD40008091A433882309F4BACF853009F4BBCFAE +:10AD5000B1D08111BDCF94D0882391F380E0DF91F1 +:10AD6000CF911F910F91FF90EF90DF900895E091A8 +:10AD7000AF33F091B033A091AD33B091AE33AF5B50 +:10AD8000BF4F8C9190E08283938380818D79808303 +:10AD9000E091AD33F091AE33EF5BFF4F1082089539 +:10ADA000E091AF33F091B03380818D798083E09171 +:10ADB000AD33F091AE33EF5BFF4F10820895809179 +:10ADC000AD339091AE33FC01EF5BFF4F208131E05A +:10ADD000320F3083FC01E20FF11D80810895209134 +:10ADE000AD333091AE33F901EF5BFF4F908141E01D +:10ADF000490F4083F901E90FF11D80830895809385 +:10AE0000B133482F4F7050E06091C6047091C70471 +:10AE10009A0194E0220F331F9A95E1F7E4E887FF47 +:10AE200011C0E49FC001E59F900D11248C509C4CF3 +:10AE30008093AD339093AE33C90108969B01280FE0 +:10AE4000391F0DC0E49FC001E59F900D11248E5461 +:10AE50009C4C8093AD339093AE33260F371F2093D5 +:10AE6000AF333093B03308958091B1338068C7DF3A +:10AE7000E091AF33F091B033808186958170089571 +:10AE80008091B1338F77BBDFA091AF33B091B033F6 +:10AE90008C9185FF0DC0E091AD33F091AE331296E9 +:10AEA0008D919C911397E05CFF4F808381E0089522 +:10AEB00080E008958091B1338F77A1DFA091AF3307 +:10AEC000B091B0338C9184FF0DC0E091AD33F0911F +:10AED000AE3312968D919C911397E05CFF4F808367 +:10AEE00081E0089580E008958091B1338F7787DF06 +:10AEF000E091AF33F091B03380818D788083E09121 +:10AF0000AF33F091B033808181608083E091AD33C5 +:10AF1000F091AE33EF5BFF4F10828091B1338068C8 +:10AF20006EDFE091AF33F091B03380818160808338 +:10AF3000E091AD33F091AE33EF5BFF4F1082089597 +:10AF4000E091AF33F091B033818184608183E091EF +:10AF5000AF33F091B0338181807C803459F480919B +:10AF6000B13380584CDFE091AF33F091B033818141 +:10AF70008460818308951F93CF93DF93C82F162F8A +:10AF8000D42F3DDFE091AF33F091B0331182E091E7 +:10AF9000AF33F091B0338C2F881F8827881F880F1C +:10AFA0008083E091AF33F091B0331183E091AF3300 +:10AFB000F091B033128213822091AD333091AE33D1 +:10AFC00024833583CC0FCC0BCD23F901E05CFF4FFC +:10AFD000C0833196108281E0DF91CF911F91089557 +:10AFE000CF92DF92EF92FF920F931F93CF93DF9355 +:10AFF000C62E8C01D12CDC1409F43FC0F801D0819D +:10B00000D11104C0D3940B5F1F4FF5CFF801E1803D +:10B01000F28093818481823010F488E001C088E15D +:10B0200028E030E0C0E02E153F0520F4CF5F220F6E +:10B03000331FF9CFC82B8D2F8F70863010F080E032 +:10B040001DC0CF7EF1E4EF16F104C8F7992321F07B +:10B05000913021F4C06C0AC0C06403C0C068911173 +:10B0600005C04E2D6C2F80E88D0F85DF4E2D6C2F87 +:10B070008D2F81DF8111C6CFE2CF81E0DF91CF91AB +:10B080001F910F91FF90EF90DF90CF90089580E097 +:10B0900090E0E091C604F091C7049C0144E0220FC7 +:10B0A000331F4A95E1F7E20FF31F11864091C60462 +:10B0B0005091C704FA01E20FF31F11820196863006 +:10B0C000910539F708958091A53387FF0DC0D8DE2B +:10B0D000811105C08091A4338111F9CF09C060CEE0 +:10B0E0008091A433882321F0BFDE8823C9F33FCEAB +:10B0F00008950F931F93CF93E091C604F091C70476 +:10B10000E05AFF4F00811181C4E68091B13387FF7F +:10B110000AC0AADE811105C08091A433811105C047 +:10B1200022C080E025C0ACDEF5CF8530F1F0E091A3 +:10B13000AF33F091B033818182FD19C0E091C60434 +:10B14000F091C704E05AFF4F8081918108171907D9 +:10B1500011F48C01DACF2FEF2C0FCC2311F0C22F7A +:10B16000F8CF84E005C082E003C083E001C081E045 +:10B17000CF911F910F91089563D069D0E0ECF4E076 +:10B1800081818E7F818380818F7780831092A3332A +:10B190000895CF93DF93E0E4F0E01482848183602C +:10B1A00084834ED054D0C0ECD4E088818F778883DC +:10B1B0008881806888831092A4331092A033109203 +:10B1C000A2331092A13388818064888348E068E4C8 +:10B1D00080E8D1DE48E068E480E0CDDE88858064E8 +:10B1E0008887898181608983DF91CF910895CF938A +:10B1F000DF933FB7F894C0ECD1E022E02A87EAE180 +:10B20000F0E0E491A0ECB4E0DA96EC93DA97EBE1AD +:10B21000F0E0E491DB96EC93DB971A868BEC96E3F7 +:10B220008E7F16968D939C93179785E18C93189635 +:10B230002C933FBF81E08093A333DF91CF91A9CFBF +:10B24000E0ECF4E080858370808711860895E0EC5F +:10B25000F4E08FEF8287848708951F920F920FB6D4 +:10B260000F92112408B60F9218BE09B60F9219BE9C +:10B270000BB60F921BBE2F933F934F935F936F9329 +:10B280007F938F939F93AF93BF93EF93FF9380919F +:10B29000CA0487FF08C08091C80487FF04C080E803 +:10B2A0008093CA040BDC8091CA0486FF07C080E447 +:10B2B0008093CA041092A4330E94CD198091CA04CD +:10B2C00085FF14C080E28093CA048091A033882354 +:10B2D00011F084E007C08091C304811102C081E0B5 +:10B2E00001C083E08093A4330E94BC198091CA04FA +:10B2F00084FF14C080E18093CA0482E08093A43369 +:10B300001092A0331092C304C2DE48E068E480E8E3 +:10B3100032DE48E068E480E02EDED0DBFF91EF9182 +:10B32000BF91AF919F918F917F916F915F914F915D +:10B330003F912F910F900BBE0F9009BE0F9008BE4A +:10B340000F900FBE0F901F901895CF93DF93EC01D5 +:10B35000FC0170968BE0DF011D928A95E9F782E08F +:10B360008C83898783E08E8761E0CE01019638DE89 +:10B37000882361F061E0CE01069632DE882331F049 +:10B3800061E0CE010B96DF91CF912ACE80E0DF9174 +:10B39000CF9108950F931F93CF93DF932091A43300 +:10B3A0002430E1F4FC010489158926893789012BB1 +:10B3B000022B032B99F0EB01818121DDFE0101902D +:10B3C0000020E9F73197BF016C1B7D0B40E050E096 +:10B3D000CE01DF91CF911F910F9182CB82E0DF915F +:10B3E000CF911F910F9108950F931F93CF93DF93E8 +:10B3F0002091A4332430B1F4FC01048915892689F5 +:10B400003789012B022B032B69F08A01EB01818123 +:10B41000F6DC40E050E0B801CE01DF91CF911F9102 +:10B420000F915ECB82E0DF91CF911F910F91089534 +:10B430000F931F93CF932091A433243009F5FC017F +:10B440000489158926893789012B022B032BC1F02A +:10B45000C62F8181D4DC8091AD339091AE33FC0155 +:10B46000EF5BFF4F208131978081281720F48C2FCC +:10B47000B6DC80E006C07BDC3CDE8823C1F301C083 +:10B4800082E0CF911F910F910895CF93DF93209188 +:10B49000A433243091F5FC01448955896689778964 +:10B4A000452B462B472B49F18181A9DC8091B13393 +:10B4B0002091AD333091AE33F90187FF05C0EF5BCA +:10B4C000FF4F808190E008C0E05CFF4F80813196A3 +:10B4D000408190E0841B9109892B69F0F901EF5BB1 +:10B4E000FF4FD0813197C08142DCDC1720F001DEB4 +:10B4F000811104C03CDC80E001C082E0DF91CF918B +:10B500000895CF93DF932091A433243099F4FC0164 +:10B510004489558966897789452B462B472B51F0FD +:10B52000EC0181816CDCA0DC882321F0CE01DF916D +:10B53000CF91ABCFDF91CF910895CF93DF9320913F +:10B54000A433243019F08FEF9FEF46C0FC014489EB +:10B55000558966897789452B462B472BA1F3868130 +:10B560004EDC8EDC882379F38091B1332091AD33AA +:10B570003091AE33F90187FF05C0EF5BFF4F80814B +:10B5800090E008C0E05CFF4F80813196208190E020 +:10B59000821B9109892B21F012DCC82FD0E002C058 +:10B5A000CFEFDFEF2091B1338091AD339091AE3387 +:10B5B000FC0127FF05C0EF5BFF4F208130E008C092 +:10B5C000E05CFF4F20813196808130E0281B3109FB +:10B5D000232B09F4E5DBCE01DF91CF910895089587 +:10B5E000FF920F931F93CF93DF93EC0163DC8823CB +:10B5F00009F48EC0888190E02091A9333091AA335C +:10B600002817390709F084C08091A633813259F098 +:10B6100018F4803249F17CC0823209F457C0833279 +:10B6200009F467C075C08091A533813A09F070C0F4 +:10B630005BDC1ADC8823E9F38C89FD880E891F897D +:10B64000CEDB8F2DCCDB802FCADB812FC8DB888D32 +:10B65000C6DB898DC4DB8A8DC2DB89DBDF91CF91AC +:10B660001F910F91FF902FCD8091A533813209F06A +:10B670004FC03ADC05DC811105C08091A4338111F3 +:10B68000F9CF46C09CDBF82E9ADB182F98DB082FE9 +:10B6900096DB402F50E060E070E0BA015527442768 +:10B6A000782B4F29512B4C8B5D8B6E8B7F8B87DBDF +:10B6B000888F85DB898F83DB8A8F72DB04DDCE0187 +:10B6C000DF91CF911F910F91FF9089CF8091A5338A +:10B6D0008132F1F409DCF7DC8091A7339091A83333 +:10B6E000888B998BCE01DF91CF911F910F91FF90A5 +:10B6F00076CF8091A533813259F4F6DBE4DC60919A +:10B70000A733CE01DF91CF911F910F91FF9067CFAB +:10B71000DF91CF911F910F91FF900895AA1BBB1B42 +:10B7200051E107C0AA1FBB1FA617B70710F0A61B41 +:10B73000B70B881F991F5A95A9F780959095BC0162 +:10B74000CD010895B7FF04C003D0821B930B089569 +:10B7500009D0A59F900DB49F900DA49F800D911DC1 +:10B7600011240895A29FB001B39FC001A39F700D43 +:10B77000811D1124911DB29F700D811D1124911DF9 +:10B7800008958F929F92AF92BF92CF92DF92EF92E5 +:10B79000FF92CF93DF93EC01688179818A819B814D +:10B7A000611571058105910521F464E279ED8BE560 +:10B7B00097E02DE133EF41E050E037D749015A01DE +:10B7C0009B01AC01A7EAB1E4C3DF6B017C01ACEEE5 +:10B7D000B4EFA5019401B8DFDC01CB018C0D9D1DF8 +:10B7E000AE1DBF1DB7FF03C00197A109B0488883F4 +:10B7F0009983AA83BB839F77DF91CF91FF90EF90CE +:10B80000DF90CF90BF90AF909F908F900895B9CF69 +:10B8100082E290E2B6CFA0E0B0E080932220909345 +:10B820002320A0932420B09325200895FB01DC0160 +:10B8300002C005900D9241505040D8F70895FB0189 +:10B84000DC018D91059080190110D9F3990B0895B1 +:10B85000FB01DC014150504048F005900D92002062 +:10B86000C9F701C01D9241505040E0F70895FB0117 +:10B87000DC0104C08D910190801921F441505040A9 +:10B88000C8F7881B990B0895FB01DC0102C00190E9 +:10B890000D9241505040D8F708956817790768F421 +:10B8A000FB01DC01E40FF51FA40FB51F02C00290DD +:10B8B0000E9241505040D8F70895E6CFDC0101C008 +:10B8C0006D9341505040E0F70895FC018191861737 +:10B8D00021F08823D9F7992708953197CF0108954A +:10B8E000FB01DC0101900D920020E1F708950F9318 +:10B8F0001F93CF93DF93CDB7DEB72E97CDBFDEBFBB +:10B900000E891F89888D998D26E02C8309831A83DF +:10B9100097FF02C080E090E801978D839E83AE017F +:10B92000445E5F4F6A8D7B8DCE01019667D04D815D +:10B930005E8157FD0AC02F813885421753070CF4EA +:10B940009A01F801E20FF31F10822E96CDBFDEBFE1 +:10B95000DF91CF911F910F9108950F931F93CF9374 +:10B96000DF93CDB7DEB72E97CDBFDEBF0E891F891F +:10B97000888D998D2EE02C8309831A8397FF02C04E +:10B9800080E090E801978D839E83AE01445E5F4F17 +:10B990006A8D7B8DCE01019631D04D815E8157FD40 +:10B9A0000AC02F813885421753070CF49A01F80119 +:10B9B000E20FF31F10822E96CDBFDEBFDF91CF9135 +:10B9C0001F910F910895CF93DF93CDB7DEB72E97D8 +:10B9D000CDBFDEBF8DE08C838C899D8989839A835E +:10B9E000AE01485E5F4F6E897F89CE010196A9D373 +:10B9F0002E96CDBFDEBFDF91CF9108952F923F925B +:10BA00004F925F926F927F928F929F92AF92BF926E +:10BA1000CF92DF92EF92FF920F931F93CF93DF931A +:10BA2000CDB7DEB72B97CDBFDEBF6C017B018A019E +:10BA3000FC0116821782838181FFBFC1CE0101966E +:10BA40003C01F6019381F70193FD859193FF81916C +:10BA50007F01882309F4ADC1853239F493FD8591C6 +:10BA600093FF81917F01853221F4B60190E0E7D404 +:10BA7000E8CF912C212C312CFFE1F315D8F08B323B +:10BA800079F038F4803279F08332A1F4232D2061EB +:10BA90001DC08D3261F0803369F4232D216016C002 +:10BAA000832D8260382EE32DE4603E2E2AC0F32DD4 +:10BAB000F8601DC037FC2DC020ED280F2A3040F063 +:10BAC0008E32B9F436FC75C1232D2064322E19C094 +:10BAD00036FE06C08AE0989E200D1124922E11C0D9 +:10BAE000EAE02E9E200D1124222EF32DF0623F2E2F +:10BAF00008C08C3621F4832D8068382E02C0883629 +:10BB000041F4F70193FD859193FF81917F018111AC +:10BB1000B3CF982F9F7D9554933028F40C5F1F4F1F +:10BB20009FE399830DC0833631F0833771F08335FD +:10BB300009F055C020C0F801808189830E5F1F4F36 +:10BB400088248394912C530112C02801F2E04F0EF7 +:10BB5000511CF801A080B18036FE03C0692D70E051 +:10BB600002C06FEF7FEFC50121D44C018201F32D9C +:10BB7000FF773F2E15C0280122E0420E511CF8012C +:10BB8000A080B18036FE03C0692D70E002C06FEF67 +:10BB90007FEFC50100D44C01F32DF0683F2E8201E8 +:10BBA00033FC19C0822D90E088169906A0F4B601E6 +:10BBB00080E290E044D42A94F5CFF50137FC8591DA +:10BBC00037FE81915F01B60190E039D421102A94AB +:10BBD00021E0821A91088114910479F7E1C084363A +:10BBE00011F0893639F5F80137FE07C0608171819F +:10BBF000828193810C5F1F4F08C060817181072E85 +:10BC0000000C880B990B0E5F1F4FF32DFF763F2E14 +:10BC100097FF09C090958095709561957F4F8F4FE4 +:10BC20009F4FF0683F2E2AE030E0A3015DD4882EBC +:10BC3000861844C0853731F4232D2F7EB22E2AE09A +:10BC400030E025C0932D997FB92E8F36C1F018F4BE +:10BC5000883579F0AEC0803719F0883721F0A9C057 +:10BC6000E92FE061BE2EB4FE0DC0FB2DF460BF2EA7 +:10BC700009C034FE0AC0292F2660B22E06C028E073 +:10BC800030E005C020E130E002C020E132E0F80100 +:10BC9000B7FE07C060817181828193810C5F1F4F65 +:10BCA00006C06081718180E090E00E5F1F4FA301AC +:10BCB0001BD4882E8618FB2DFF773F2E36FE0DC035 +:10BCC000232D2E7FA22E891458F434FE0BC032FC93 +:10BCD00009C0832D8E7EA82E05C0B82CA32C03C0CE +:10BCE000B82C01C0B92CA4FE0FC0FE01E80DF11D57 +:10BCF0008081803321F49A2D997EA92E09C0A2FE5D +:10BD000006C0B394B39404C08A2D867809F0B39426 +:10BD1000A3FC10C0A0FE06C0B21480F4280C922C24 +:10BD20009B180DC0B21458F4B60180E290E087D39E +:10BD3000B394F8CFB21418F42B1802C0982C212C0D +:10BD4000A4FE0FC0B60180E390E079D3A2FE16C036 +:10BD5000A1FC03C088E790E002C088E590E0B6014E +:10BD60000CC08A2D867851F0A1FE02C08BE201C082 +:10BD700080E2A7FC8DE2B60190E061D3891430F433 +:10BD8000B60180E390E05BD39A94F8CF8A94F301F4 +:10BD9000E80DF11D8081B60190E051D38110F6CFFE +:10BDA000222009F44ECEB60180E290E048D32A94D6 +:10BDB000F7CFF6018681978102C08FEF9FEF2B9618 +:10BDC000CDBFDEBFDF91CF911F910F91FF90EF901C +:10BDD000DF90CF90BF90AF909F908F907F906F90AB +:10BDE0005F904F903F902F90089520FD09C0FC0177 +:10BDF00023FD05C022FF02C0738362835183408309 +:10BE0000089544FD17C046FD17C0AB01BC01DA011F +:10BE1000FB01AA0FBB1FEE1FFF1F1094D1F74A0FA3 +:10BE20005B1F6E1F7F1FCB01BA01660F771F881F34 +:10BE3000991F09C033E001C034E0660F771F881FE7 +:10BE4000991F3150D1F7620F711D811D911D089509 +:10BE50000F931F93CF93DF938C01C801B2D2EC01F3 +:10BE600097FD06C085D2892BC1F7B801CE0123D337 +:10BE7000CE01DF91CF911F910F9108958F929F92E4 +:10BE8000AF92BF92EF92FF920F931F93CF93DF93E6 +:10BE90008C01D62F7A01B22E94D29C0133272B32FB +:10BEA000310531F02D32310559F48B2D8068B82ED3 +:10BEB000D15011F480E061C0C80183D297FDFACF60 +:10BEC000CB2DCD7F2B2D2073F9F48033E9F4AA24F8 +:10BED000AA94AD0E09F43EC0C80173D297FD3AC0D2 +:10BEE0009C012F7D33272835310541F4C264D2509F +:10BEF00089F1C80166D297FF07C02CC0B6FE02C008 +:10BF0000C26001C0C261DA2D812C912C540120ED58 +:10BF1000280F283078F0C4FF03C0B801CCD217C076 +:10BF20002A3040F0C6FFF9CF2F7D3FEE320F36307A +:10BF3000A0F727504C2FC501B40163DF4B015C0112 +:10BF4000C260D15051F0C8013CD297FFE0CFC1FD93 +:10BF500004C0B0CF812C912C5401C7FF08C0B0940D +:10BF6000A09490948094811C911CA11CB11C2C2F36 +:10BF7000B501A401C70139DF81E0DF91CF911F91A5 +:10BF80000F91FF90EF90BF90AF909F908F9008958A +:10BF90005F926F927F928F929F92AF92BF92CF9259 +:10BFA000DF92EF92FF920F931F93CF93DF93CDB762 +:10BFB000DEB7A097CDBFDEBF5C01962E7A01F901F6 +:10BFC0008E010F5F1F4F680180E2D8011D928A9594 +:10BFD000E9F7D50113968C9080E090E0612C712CEC +:10BFE00030E061E070E083FC259183FE21918F01B8 +:10BFF000522E211103C080E090E090C02E3511F444 +:10C00000009751F1432F50E0481759073CF42D3564 +:10C0100059F12D3219F4772009F103C0772009F482 +:10C0200068C0452D469546954695D601A40FB11D8D +:10C03000452D47708B0102C0000F111F4A95E2F792 +:10C04000A8015C91452B4C93651459F0561410F4DB +:10C050005394E7CF5A94E5CF31E004C0772473942A +:10C0600001C0712C0196BFCF772019F08E818062BC +:10C070008E83311103C08824839417C0F6019E017A +:10C080002F5D3F4F8081809581932E173F07D1F719 +:10C09000F2CFE114F10429F0D7018C93F701319626 +:10C0A0007F019A94812C9920E9F0C5018AD197FDEE +:10C0B00017C0FC01FF2723E0F595E7952A95E1F7E6 +:10C0C000EC0DFD1D208130E0AC014770552702C00A +:10C0D000359527954A95E2F720FDDBCFB501EBD1E9 +:10C0E000811089CFE114F10411F0D7011C92C8012D +:10C0F00015C0422F469546954695D601A40FB11D11 +:10C10000422F47708B0102C0000F111F4A95E2F7C2 +:10C11000A8015C91452B4C93622EA4CFA096CDBF75 +:10C12000DEBFDF91CF911F910F91FF90EF90DF90D5 +:10C13000CF90BF90AF909F908F907F906F905F90C7 +:10C1400008955F926F927F928F929F92AF92BF926B +:10C15000CF92DF92EF92FF920F931F93CF93DF93D3 +:10C160006C01EB015A01FC0116821782512CF60179 +:10C17000E380FE01E3FC8591E3FE8191182FEF013E +:10C18000882309F4E0C090E0F3D0892B19F0C601B0 +:10C190005FDEEDCF153241F4FE01E3FC1591E3FEC5 +:10C1A0001191EF01153271F4C6010BD197FDC9C091 +:10C1B000412F50E09C01332724173507C1F2B60107 +:10C1C0007AD1C1C01A3239F4E3FC1591E3FE119122 +:10C1D000EF0101E001C000E0F12C20ED210F2A3039 +:10C1E00078F402606F2D70E080E090E040E209DEBC +:10C1F000F62EFE01E3FC1591E3FE1191EF01EDCF68 +:10C2000001FF03C0F11003C09EC0FF24FA9418364A +:10C2100019F01C3651F010C0FE01E3FC1591E3FE4D +:10C220001191EF01183641F408600460FE01E3FC4F +:10C230001591E3FE1191EF01112309F484C0612FE0 +:10C2400070E08CEF91E09CD0892B09F47CC000FD5C +:10C2500007C0F50180809180C50102965C0102C093 +:10C26000812C912C1E3649F4F6014681578160E0FD +:10C2700070E0202FC401B9DD7ACF1336A1F401FD9F +:10C2800002C0FF24F394C6019CD097FD5AC08114CC +:10C29000910429F0F4018083C40101964C01FA94C1 +:10C2A000F110F1CF4AC01B3551F49E01A4016F2D4E +:10C2B000C6016EDEEC01892B09F03FC039C0C60112 +:10C2C000C7DD97FD3EC01F3649F128F4143621F131 +:10C2D000193639F125C0133771F01537E9F020C050 +:10C2E0008114910429F0F4016082C40101964C018B +:10C2F000FA94FF2059F0C60164D03C0197FD06C0B6 +:10C3000037D0892B69F3B601C301D5D081149104CC +:10C31000A1F0F401108211C0006203C0006101C0ED +:10C320000064202FA4016F2DC601A8DD811105C076 +:10C33000F6018381807329F406C000FD18CF539461 +:10C3400016CF552019F0852D90E002C08FEF9FEF9A +:10C35000DF91CF911F910F91FF90EF90DF90CF90E1 +:10C36000BF90AF909F908F907F906F905F90089557 +:10C37000911118C1803219F089508550D0F7089575 +:10C38000FC010590061621F00020D9F7C0010895A0 +:10C390003197CF010895FC01059061507040011064 +:10C3A000D8F7809590958E0F9F1F0895FC016150DE +:10C3B000704001900110D8F7809590958E0F9F1FC7 +:10C3C0000895CF93DF93EC012B8120FF33C026FF2C +:10C3D0000AC02F7B2B838E819F8101968E839F8342 +:10C3E0008A8190E029C022FF0FC0E881F981808115 +:10C3F000082E000C990B009719F420622B831AC0A9 +:10C400003196E883F9830EC0EA85FB85199597FF7D +:10C4100009C02B81019611F080E201C080E1822BDE +:10C420008B8308C02E813F812F5F3F4F2E833F8338 +:10C43000992702C08FEF9FEFDF91CF9108950F935F +:10C440001F93CF93DF93FB01238121FD03C08FEF67 +:10C450009FEF2CC022FF16C0468157812481358171 +:10C460004217530744F4A081B1819D012F5F3F4FD4 +:10C47000208331838C93268137812F5F3F4F268322 +:10C48000378314C08B01EC01FB010084F185E02DA2 +:10C490001995892BE1F6D80116968D919C911797E5 +:10C4A000019616968D939C931797CE01DF91CF91AD +:10C4B0001F910F910895FB01238120FF12C026FDDB +:10C4C00010C08F3F3FEF930761F082832F7D206480 +:10C4D0002383268137812150310926833783992789 +:10C4E00008958FEF9FEF0895FA01AA27283051F1A0 +:10C4F000203181F1E8946F936E7F6E5F7F4F8F4F95 +:10C500009F4FAF4FB1E03ED0B4E03CD0670F781FF3 +:10C51000891F9A1FA11D680F791F8A1F911DA11DD8 +:10C520006A0F711D811D911DA11D20D009F4689411 +:10C530003F912AE0269F11243019305D3193DEF6B9 +:10C54000CF010895462F4770405D4193B3E00FD06F +:10C55000C9F7F6CF462F4F70405D4A3318F0495D5A +:10C5600031FD4052419302D0A9F7EACFB4E0A6953D +:10C570009795879577956795BA95C9F7009761055F +:10C58000710508959B01AC010A2E069457954795B5 +:10C5900037952795BA95C9F7620F731F841F951FAA +:10C5A000A01D089599278827089503D08081992791 +:10C5B0000895E0ECF1E0378537FDFDCF3485386034 +:10C5C0003487FC01E050F04F0895262FF2DF008001 +:10C5D000021611F008D00197019708950196272FB0 +:10C5E000F5DFF3CF262FE0ECF1E0378537FDFDCF07 +:10C5F0003485377F3487378531FF09C036E332878A +:10C6000038ED34BF31E03387378537FDFDCF33E375 +:10C610003287808391831282248325E3228728ED49 +:10C6200031E024BF338701960895052E97FB16F459 +:10C6300000940FD057FD05D014D007FC02D046F46B +:10C6400008C050954095309521953F4F4F4F5F4F13 +:10C65000089590958095709561957F4F8F4F9F4F6E +:10C660000895A1E21A2EAA1BBB1BFD010DC0AA1F33 +:10C67000BB1FEE1FFF1FA217B307E407F50720F04B +:10C68000A21BB30BE40BF50B661F771F881F991FC6 +:10C690001A9469F760957095809590959B01AC010F +:0AC6A000BD01CF010895F894FFCF0B +:10C6AA0002400F00831000000104100000018208FC +:10C6BA00000001000000000000000000000004006B +:10C6CA00800001000000000000001D25242524250B +:10C6DA0030253C254625632571259A259D25A125CA +:10C6EA003E000426140004043E00042E040C040434 +:10C6FA000008000800000000000000080008080800 +:10C70A0008080800080008000000080800080808CF +:10C71A00008000800000000000000080008080800F +:10C72A0080808000800080000000808000808080FF +:10C73A0000010001000000000000000100010101E9 +:10C74A0001010100010001000000010100010101D5 +:10C75A0000000000000000000000000000000000CF +:10C76A0001010101010101010101010101010101AF +:10C77A00010101010101010101010101010101019F +:10C78A00010101010101010101010101010101018F +:10C79A00000000000000000000000000000000008F +:10C7AA00000000000000000000000000000000007F +:10C7BA00000000000000000000000000000000006F +:10C7CA00010101010101010101010101010101014F +:10C7DA00000000000000000000000000000000004F +:10C7EA00000000000000000000000000000000003F +:10C7FA00010101010101010101010101010101011F +:10C80A00000000000000000000000000000000001E +:10C81A0001010101010101010101010101010101FE +:10C82A0001010101010101010101010101010101EE +:10C83A0000000000000000000000000000000000EE +:10C84A0001010101010101010101010101010101CE +:10C85A0000000002020000020002020202000002BE +:10C86A0000000002020000020002020202000002AE +:10C87A00000000020200000200020202020000029E +:10C88A00040404060604040604060606060404064E +:10C89A00040404060604040604060606060404063E +:10C8AA00000000020200000200020202020000026E +:10C8BA00000000020200000200020202020000025E +:10C8CA00040404060604040604060606060404060E +:10C8DA00000000020200000200020202020000023E +:10C8EA0004040406060404060406060606040406EE +:10C8FA0004040406060404060406060606040406DE +:10C90A0004040406060404060406060606040406CD +:10C91A0004040406060404060406060606040406BD +:10C92A0000000002020000020002020202000002ED +:10C93A0000000002020000020002020202000002DD +:10C94A00040404060604040604060606060404068D +:10C95A00000808080000000800000800080800088D +:10C96A00000808080000000800000800080800087D +:10C97A00000808080000000800000800080800086D +:10C98A00101818181010101810101810181810185D +:10C99A00101818181010101810101810181810184D +:10C9AA00000808080000000800000800080800083D +:10C9BA00000808080000000800000800080800082D +:10C9CA00101818181010101810101810181810181D +:10C9DA00000808080000000800000800080800080D +:10C9EA0010181818101010181010181018181018FD +:10C9FA0010181818101010181010181018181018ED +:10CA0A0010181818101010181010181018181018DC +:10CA1A0010181818101010181010181018181018CC +:10CA2A0000080808000000080000080008080008BC +:10CA3A0000080808000000080000080008080008AC +:10CA4A00101818181010101810101810181810189C +:10CA5A00434C4F4E4500546F6F206D616E792064D0 +:10CA6A006174612E000D0A000D0A50415249545951 +:10CA7A00204552524F52000D0A50415249545920F2 +:10CA8A004F4B002534753A200025337500556E6BDF +:10CA9A006E6F776E206361726420747970652E0000 +:10CAAA002573206F7220004D756C7469706C652057 +:10CABA00706F73736962696C69746965732C206E2F +:10CACA006F7420636C6F6E61626C652100436C6FDA +:10CADA006E6564204F4B2100436C6F6E6520756E46 +:10CAEA00737570706F7274656421004E4F204441F3 +:0ACAFA0054410046414C5345000032 :020000021000EC :1000000000000000000000000000000000000000F0 :1000100000000000000000000000000000000000E0