From c966e7982c4fa42d7dae6b4f4dca6966b695a973 Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Thu, 22 Oct 2015 13:37:45 -0400 Subject: bluetooth --- common.mk | 4 + .../extended_keymaps/extended_keymap_default.c | 2 +- keyboard/atomic/flash-pcb.sh | 2 +- keyboard/planck/Makefile | 22 +- keyboard/planck/config.h | 71 +- keyboard/planck/keymap_midi.c | 44 +- keyboard/planck/keymaps/keymap_lock.c | 41 +- keyboard/planck/planck_with_bootloader.hex | 1796 ++++++++++++++++++++ keyboard/preonic/Makefile | 3 +- keyboard/preonic/beeps.c | 386 +++-- keyboard/preonic/beeps.h | 5 +- .../extended_keymaps/extended_keymap_lock.c | 2 +- keyboard/preonic/keymap_midi.c | 82 +- keyboard/preonic/keymap_midi.h | 6 +- protocol/bluefruit.mk | 2 +- protocol/bluefruit/bluefruit.c | 15 +- protocol/bluefruit/bluefruit.h | 5 +- protocol/bluefruit/main.c | 100 +- protocol/lufa/descriptor.c | 2 +- protocol/lufa/lufa.c | 4 +- 20 files changed, 2302 insertions(+), 292 deletions(-) create mode 100755 keyboard/planck/planck_with_bootloader.hex diff --git a/common.mk b/common.mk index e61ae69e5..3237e539a 100644 --- a/common.mk +++ b/common.mk @@ -68,6 +68,10 @@ ifdef BACKLIGHT_ENABLE OPT_DEFS += -DBACKLIGHT_ENABLE endif +ifdef BLUETOOTH_ENABLE + OPT_DEFS += -DBLUETOOTH_ENABLE +endif + ifdef KEYMAP_SECTION_ENABLE OPT_DEFS += -DKEYMAP_SECTION_ENABLE EXTRALDFLAGS = -Wl,-L$(TOP_DIR),-Tldscript_keymap_avr5.x diff --git a/keyboard/atomic/extended_keymaps/extended_keymap_default.c b/keyboard/atomic/extended_keymaps/extended_keymap_default.c index e662c9188..ab08bb6d2 100644 --- a/keyboard/atomic/extended_keymaps/extended_keymap_default.c +++ b/keyboard/atomic/extended_keymaps/extended_keymap_default.c @@ -39,7 +39,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { // ┌─ 2u ────────────┐ // │ X │ // └─────────────────┘ - { KC_LCTL, KC_LGUI, KC_LALT, KC_LGUI, KC_LCTL, KC_SPC, KC_SPC, KC_RALT, KC_RGUI, KC_RALT, KC_RGUI, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT }, + { BL_STEP, KC_LCTL, KC_LALT, KC_LGUI, KC_LGUI, KC_SPC, KC_SPC, KC_RGUI, KC_RGUI, KC_RALT, KC_RCTL, BL_STEP, KC_LEFT, KC_DOWN, KC_RGHT }, // ┌────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┐ // │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ // └────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┘ diff --git a/keyboard/atomic/flash-pcb.sh b/keyboard/atomic/flash-pcb.sh index 2ae15458c..46abc6982 100755 --- a/keyboard/atomic/flash-pcb.sh +++ b/keyboard/atomic/flash-pcb.sh @@ -1,3 +1,3 @@ dfu-programmer atmega32u4 erase --force -dfu-programmer atmega32u4 flash planck_pcb.hex +dfu-programmer atmega32u4 flash atomic_pcb.hex dfu-programmer atmega32u4 reset \ No newline at end of file diff --git a/keyboard/planck/Makefile b/keyboard/planck/Makefile index 2f0ba5ba9..d9e8ce788 100644 --- a/keyboard/planck/Makefile +++ b/keyboard/planck/Makefile @@ -121,15 +121,16 @@ EXTRAKEY_ENABLE = yes # Audio control and System control(+450) CONSOLE_ENABLE = yes # Console for debug(+400) COMMAND_ENABLE = yes # Commands for debug and configuration # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE -#SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend +# SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend # NKRO_ENABLE = yes # USB Nkey Rollover - not yet supported in LUFA BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality -MIDI_ENABLE = YES # MIDI controls +# MIDI_ENABLE = YES # MIDI controls # UNICODE_ENABLE = YES # Unicode +# BLUETOOTH_ENABLE = yes # Enable Bluetooth with the Adafruit EZ-Key HID ifdef MIDI_ENABLE - SRC += keymap_midi.c \ - beeps.c + SRC += keymap_midi.c + # beeps.c endif ifdef UNICODE_ENABLE @@ -143,7 +144,18 @@ endif VPATH += $(TARGET_DIR) VPATH += $(TOP_DIR) -include $(TOP_DIR)/protocol/lufa.mk + + +ifdef BLUETOOTH_ENABLE + BLUEFRUIT_TRACE_SERIAL=true + + include $(TOP_DIR)/protocol.mk + include $(TOP_DIR)/protocol/bluefruit.mk + include $(TOP_DIR)/protocol.mk +else + include $(TOP_DIR)/protocol/lufa.mk +endif + include $(TOP_DIR)/common.mk include $(TOP_DIR)/rules.mk diff --git a/keyboard/planck/config.h b/keyboard/planck/config.h index e97012770..0a1a6a935 100644 --- a/keyboard/planck/config.h +++ b/keyboard/planck/config.h @@ -58,16 +58,83 @@ along with this program. If not, see . keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ ) +#ifdef BLUETOOTH_ENABLE +#ifdef __AVR_ATmega32U4__ + #define SERIAL_UART_BAUD 9600 + #define SERIAL_UART_DATA UDR1 + #define SERIAL_UART_UBRR ((F_CPU/(16UL*SERIAL_UART_BAUD))-1) + #define SERIAL_UART_RXD_VECT USART1_RX_vect + #define SERIAL_UART_TXD_READY (UCSR1A&(1<>8); /* baud rate */ \ + UCSR1B = (1<event.key.col == (MATRIX_COLS - 1) && record->event.key.row == (MATRIX_ROWS - 1)) { if (record->event.pressed) { starting_note++; - // play_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[0 + offset])/12.0+(MATRIX_ROWS - 1)), 0xC); + play_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[0 + offset])/12.0+(MATRIX_ROWS - 1)), 0xC); midi_send_cc(&midi_device, 0, 0x7B, 0); midi_send_cc(&midi_device, 1, 0x7B, 0); midi_send_cc(&midi_device, 2, 0x7B, 0); @@ -43,15 +43,15 @@ void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) midi_send_cc(&midi_device, 4, 0x7B, 0); return; } else { - // stop_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[0 + offset])/12.0+(MATRIX_ROWS - 1))); - // stop_all_notes(); + stop_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[0 + offset])/12.0+(MATRIX_ROWS - 1))); + stop_all_notes(); return; } } if (record->event.key.col == (MATRIX_COLS - 2) && record->event.key.row == (MATRIX_ROWS - 1)) { if (record->event.pressed) { starting_note--; - // play_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[0 + offset])/12.0+(MATRIX_ROWS - 1)), 0xC); + play_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[0 + offset])/12.0+(MATRIX_ROWS - 1)), 0xC); midi_send_cc(&midi_device, 0, 0x7B, 0); midi_send_cc(&midi_device, 1, 0x7B, 0); midi_send_cc(&midi_device, 2, 0x7B, 0); @@ -59,8 +59,8 @@ void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) midi_send_cc(&midi_device, 4, 0x7B, 0); return; } else { - // stop_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[0 + offset])/12.0+(MATRIX_ROWS - 1))); - // stop_all_notes(); + stop_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[0 + offset])/12.0+(MATRIX_ROWS - 1))); + stop_all_notes(); return; } } @@ -72,13 +72,13 @@ void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) midi_send_cc(&midi_device, 2, 0x7B, 0); midi_send_cc(&midi_device, 3, 0x7B, 0); midi_send_cc(&midi_device, 4, 0x7B, 0); - // stop_all_notes(); - // for (int i = 0; i <= 7; i++) { - // play_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[i + offset])/12.0+(MATRIX_ROWS - 1)), 0xC); - // _delay_us(80000); - // stop_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[i + offset])/12.0+(MATRIX_ROWS - 1))); - // _delay_us(8000); - // } + stop_all_notes(); + for (int i = 0; i <= 7; i++) { + play_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[i + offset])/12.0+(MATRIX_ROWS - 1)), 0xC); + _delay_us(80000); + stop_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[i + offset])/12.0+(MATRIX_ROWS - 1))); + _delay_us(8000); + } return; } if (record->event.key.col == (MATRIX_COLS - 4) && record->event.key.row == (MATRIX_ROWS - 1) && record->event.pressed) { @@ -88,23 +88,23 @@ void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) midi_send_cc(&midi_device, 2, 0x7B, 0); midi_send_cc(&midi_device, 3, 0x7B, 0); midi_send_cc(&midi_device, 4, 0x7B, 0); - // stop_all_notes(); - // for (int i = 0; i <= 7; i++) { - // play_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[i + offset])/12.0+(MATRIX_ROWS - 1)), 0xC); - // _delay_us(80000); - // stop_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[i + offset])/12.0+(MATRIX_ROWS - 1))); - // _delay_us(8000); - // } + stop_all_notes(); + for (int i = 0; i <= 7; i++) { + play_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[i + offset])/12.0+(MATRIX_ROWS - 1)), 0xC); + _delay_us(80000); + stop_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[i + offset])/12.0+(MATRIX_ROWS - 1))); + _delay_us(8000); + } return; } if (record->event.pressed) { // midi_send_noteon(&midi_device, record->event.key.row, starting_note + SCALE[record->event.key.col], 127); midi_send_noteon(&midi_device, 0, (starting_note + SCALE[record->event.key.col + offset])+12*(MATRIX_ROWS - record->event.key.row), 127); - // play_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[record->event.key.col + offset])/12.0+(MATRIX_ROWS - record->event.key.row)), 0xF); + play_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[record->event.key.col + offset])/12.0+(MATRIX_ROWS - record->event.key.row)), 0xF); } else { // midi_send_noteoff(&midi_device, record->event.key.row, starting_note + SCALE[record->event.key.col], 127); midi_send_noteoff(&midi_device, 0, (starting_note + SCALE[record->event.key.col + offset])+12*(MATRIX_ROWS - record->event.key.row), 127); - // stop_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[record->event.key.col + offset])/12.0+(MATRIX_ROWS - record->event.key.row))); + stop_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[record->event.key.col + offset])/12.0+(MATRIX_ROWS - record->event.key.row))); } } \ No newline at end of file diff --git a/keyboard/planck/keymaps/keymap_lock.c b/keyboard/planck/keymaps/keymap_lock.c index 4fe2e0a2b..b844d1cda 100644 --- a/keyboard/planck/keymaps/keymap_lock.c +++ b/keyboard/planck/keymaps/keymap_lock.c @@ -2,7 +2,7 @@ #include "backlight.h" #include "action_layer.h" #include "keymap_midi.h" -#include "beeps.h" +#include const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [0] = { /* Qwerty */ @@ -53,6 +53,16 @@ const uint16_t PROGMEM fn_actions[] = { }; +uint16_t hextokeycode(int hex) { + if (hex == 0x0) { + return KC_0; + } else if (hex < 0xA) { + return KC_1 + (hex - 0x1); + } else { + return KC_A + (hex - 0xA); + } +} + const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) { // MACRODOWN only works in this function @@ -64,6 +74,35 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) backlight_set(BACKLIGHT_LEVELS); default_layer_and(0); default_layer_or((1<<5)); + + uint8_t low = boot_lock_fuse_bits_get(0x0000); + uint8_t high = boot_lock_fuse_bits_get(0x0003); + uint8_t ext = boot_lock_fuse_bits_get(0x0002); + uint8_t lock = boot_lock_fuse_bits_get(0x0001); + + register_code(hextokeycode((low & 0xF0) >> 4)); + unregister_code(hextokeycode((low & 0xF0) >> 4)); + register_code(hextokeycode((low & 0x0F))); + unregister_code(hextokeycode((low & 0x0F))); + + + register_code(hextokeycode((high & 0xF0) >> 4)); + unregister_code(hextokeycode((high & 0xF0) >> 4)); + register_code(hextokeycode((high & 0x0F))); + unregister_code(hextokeycode((high & 0x0F))); + + + register_code(hextokeycode((ext & 0xF0) >> 4)); + unregister_code(hextokeycode((ext & 0xF0) >> 4)); + register_code(hextokeycode((ext & 0x0F))); + unregister_code(hextokeycode((ext & 0x0F))); + + + register_code(hextokeycode((lock & 0xF0) >> 4)); + unregister_code(hextokeycode((lock & 0xF0) >> 4)); + register_code(hextokeycode((lock & 0x0F))); + unregister_code(hextokeycode((lock & 0x0F))); + // note(0+12, 20); // note(0+24, 20); } else { diff --git a/keyboard/planck/planck_with_bootloader.hex b/keyboard/planck/planck_with_bootloader.hex new file mode 100755 index 000000000..c61dfb743 --- /dev/null +++ b/keyboard/planck/planck_with_bootloader.hex @@ -0,0 +1,1796 @@ +:020000020000FC +:047000000C948D3E21 +:047028000C94B73DD0 +:10702F0012010002FF010020EB03F42F0000010208 +:10703F00030109021200010100803209040000005F +:10704F00000000000C03410054004D0045004C00AF +:10705F001603410054006D00330032005500340018 +:10706F004400460055000C0331002E0030002E0066 +:10707F0030000403090416010C0100000C0000018C +:02708F006C7F14 +:1070920012BD01BDF89A00B5089501E00895F9996D +:1070A200FECF12BD01BD20BDFA9AF99AF6CFF99929 +:1070B200FECF0C944938F80104910895F8013491F7 +:1070C20031962491890108950091610000930C0189 +:1070D20000E80093610001E00093610005BF02E057 +:1070E20005BF0C9486380091D70001600093D70049 +:1070F200A89507EF04BF0091600000610093600053 +:1071020000E00093600001E008950E94AA3D0E9401 +:10711200B53DFDCF0CD00F7708D0006806D00061D6 +:1071220004D0016028D0789408950093D80000918B +:10713200D8000895FCDF00621ED04CD009B500FFD4 +:10714200FDCFF5DF0F7D17D00091E0000E7F009399 +:10715200E0000091E000077F0093E0000091E20070 +:1071620001600093E2000091E20008600093E200F7 +:1071720078940C94743B0093D800089500910D010B +:10718200002359F40091D90000FF07C0D0DF006846 +:10719200F2DF01E000930D01CDDFE0E2F2E00081D9 +:1071A200018100FF0DC0008111811E7F11830083C8 +:1071B20001E00093EA0000E00093EA0000931E025F +:1071C20000E00093E9000091E80003FF02C00E9482 +:1071D200F23B0895A89539D000E40093600000E0E6 +:1071E200009381000093800010E0009385000093DB +:1071F200840001E006BB00918100036000938100DE +:107202000091600007FFFCCF00E80093600010933C +:107212008100A89507EF04BF18D010936000209159 +:1072220084003091850010938100109380001093A8 +:1072320085001093840001E006BB2D3D354010F01F +:1072420002E101C002E009BD089500916000006101 +:107252000093600008950E94AD3E239741D100E063 +:1072620000930901B5D104811581012B51F437D165 +:1072720000910701002309F4B9C000E0009307015F +:10728200B5C058D102FFFDCF37D1068335D1009367 +:107292000F0132D1009310012FD1009311012CD193 +:1072A2000093120129D10093130102852091130149 +:1072B20030911201409111015091100116811A95DD +:1072C20041F01250A9F01A9599F11A9509F473C078 +:1072D2008BC010910F01113011F411E001C010E0C8 +:1072E200138799D00C3F11F414D17FC077D17DC0A0 +:1072F20092D010910F01112329F01A9549F01A9595 +:10730200A9F073C010E013870C3F09F06EC0ECCFF8 +:1073120056D103C04CD109F468C00D911C9144D1DF +:107322000F3FC1F305E0009309015FC011E0EBCF0D +:10733200D2D029F00250E1F10A9541F056C0FDD0B9 +:107342000E94A33F0FEF00930A014FC0552319F08B +:107352005A9579F04AC04ED00DEF04BF74D0EAD0EE +:1073620003FFFDCF67D051D04AD008E00093600000 +:10737200FFCF40D068D0DED003FFFDCF5BD03FD03F +:1073820044D00FEF1FE004C009811A810150104060 +:1073920009831A8309811A81012BB1F700E800934E +:1073A200610000910C01009361000C940000FFCF7A +:1073B20001E003871AC08FD019F00A9539F015C081 +:1073C200535098F4BAD002E000870FC0505339F0FE +:1073D2005A9541F05F52B1F35A95A1F306C002E00B +:1073E2000883F0CF01E0FCCFA8D079D02396E4E067 +:1073F2000C94BA3E01E005BF00E005BF089500917C +:10740200D8000F770093D800089509B50D7F09BD04 +:1074120000E009BD08955183408333832283109194 +:10742200E8001B7F1093E8001091E8001F7710938B +:10743200E80008955DD053D0F8940091E000016017 +:107442000093E000089579D04AC0219749D0009175 +:107452000601035019F00250B9F00BC03CD021F0E4 +:107462000A9559F00A9529F400910A010C3F19F482 +:1074720050D02196089567D0FCCF0091010100936E +:10748200F100009100010AC01091100124D019F0FE +:107492000A9549F0EECF135018F400E00093F10082 +:1074A2001ED044D0E6CF105339F01A9539F01F524E +:1074B20041F01A9541F0F4CF08E5F0CF00E006D094 +:1074C200EDCF02E0FCCF04E001D0E8CF10E020E0F5 +:1074D20030E00C94113F00910F010023089521C068 +:1074E2000BD008D007D00093040106D00093050109 +:1074F20021D00BC000D008830091F10008950091C3 +:10750200EB0000620093EB0015D0077F0093E800C8 +:107512000895F5DF02E00093080103E000930901FA +:10752200089559D007D000FFFDCF089503D002FF80 +:10753200FDCF03C00091E8000895FCDF0B7FE6DF7A +:10754200F9DF0F77E3CF0E94AC3E42D038D006C0BD +:107552002BD00093F1002BD059F43DD0082F092BEA +:10756200A9F0E8DF02FD12C0E5DF00FFFDCF4424F1 +:10757200042D4394003289F300910B0100230D91F5 +:107582001C9131F311970E945838E3CFD3DF00FFEB +:10759200FDCF21D0CFDF00FFFDCFCCDF02FFFDCF3B +:1075A200CCDFE5E00C94B93E11970C945C380D9158 +:1075B2001C910F5F1F4F1C930E93019708958281B8 +:1075C200938100811181801B910B0196DF01089547 +:1075D200E0E0F1E00895AEDF0E7F98CF0E94A93E71 +:1075E200F7DF80819181A081B181AF710481158122 +:1075F20000521040048315830AC000910B0100233E +:1076020031F4A301920103E911E00E943B3F47D00C +:10761200B8F1662477242C0111C06EDFF301ED5618 +:10762200FE4F008301E0600E00E0701E01960091A3 +:10763200F200002311F033D0B8F47FDF30D0E8F24B +:10764200F301B096E238F040C0F674DF02FFFDCFDE +:107652000091F200BDDF24813581201B304024835C +:107662003583E5CF49DFAA95AA23E1F700910B0103 +:10767200013099F62091F1008C010E945038D6CF4A +:1076820004811581012B21F055DF02FFFDCF55DF6B +:10769200A2DF50DF00FFFDCFE8E00C94B63EE0E051 +:1076A200F1E0028113810817190708952091EB0078 +:1076B20021602093EB000093EC000091ED0002703A +:1076C200012B0093ED000091ED0002600093ED00AC +:1076D2001091EE00012F000F00E0001F0895412FCE +:1076E2000093E900089500E009D000FD05C000E024 +:1076F200F7DF10E202E0DACF00E00895F1DF009157 +:10770200EB0008950F770132A9F5112369F11A955B +:1077120059F01A9561F01A9569F01A95F9F01A95CF +:10772200C1F01A95D9F024C00E942C3920C00E94C1 +:10773200263A1DC029D00091090123D001E01FD0B3 +:1077420020D0009108011BD00E94923A0E94973AE1 +:107752000EC01AD00091080114D007C002E00093B5 +:10776200080100E0009309010FD00E94923A03C081 +:107772000E94803A02C001E0089500E0089501D01D +:1077820000E00093F10008950091E800077F009364 +:10779200E800089508950350F9F4112339F01A9579 +:1077A20051F01A9581F01A9599F016C004E016D09E +:1077B20001E810E703C011D003E510E7E7E1F2E0CA +:1077C20000831183D8CF06E109D00FE510E7F6CF89 +:1077D20004D005E710E7F2CFD0CF0CE000931A02F5 +:1077E200089527D120D100931D02E1D0212F11232A +:1077F20029F12A95E9F02250F1F0225099F02A95C8 +:1078020049F0225061F02A9581F02A95E1F02A95FB +:10781200E9F023C0003809F44FC00C94833B0038D0 +:10782200E1F7C8C00023C9F71EC00023B1F72DC07D +:10783200033098F744C1033080F70BC1003868F376 +:10784200033858F7C9C0013841F77BC1013051F400 +:10785200FCD0BFD000FD06C0FCCF0E94833B0023BA +:1078620009F41ED008951091E3001078DCD00F7750 +:10787200012B0093E300E9D0ACD000FFFDCF0091D3 +:10788200E30000680093E300089591D0123040F4C1 +:107892000FD010931E02DAD000911E020C94CB3B43 +:1078A2000091EB0001D004C000620093EB00089548 +:1078B2000091E800077FC0C0BA93AA93229700E024 +:1078C2000093190274D0AFD0202F2A9519F02A956F +:1078D200E9F022C002E100931A020FE210E7E7E1A9 +:1078E200F2E0008311839DD008839DD00983E0DFFD +:1078F20000911A0210E02881398102171307A8F4B7 +:107902000F7181F401E00093190211C002E10093AA +:107912001A0201E410E7E3CF0E94CC3B002319F7DF +:107922008ED040C01093190202C020931A027ED05A +:10793200A7E1B2E001C08AD000911A02002309F146 +:1079420048D004FD1EC045D000FD03C042D004FF54 +:10795200FACF10E0012F1395003281F0ED91FC91E6 +:107962001197049133D02D913C912F5F3F4F3C935F +:107972002E93FD0103810A95038361F72AD004FF48 +:10798200DACF00911902013039F423D004FD04C08A +:1079920020D000FFFDCF5AD01CD004FFFDCF46D02F +:1079A20018D00B7F49D02296A991B99108951091D0 +:1079B200F10008957DDF00911E0208D047D009D062 +:1079C2000F773AD006D002FFFDCFBFC00093F1007F +:1079D20008950091E800089524D010911D021058D6 +:1079E20029F01A9589F01A9591F019C061DF00917A +:1079F2001C02ECDF00E0EADF29D0EBDF02FFFDCF63 +:107A020018D0E7DF0F770CC053DF00E0F2CF51D080 +:107A12000F7710E0F801E55EFD4F0081EACF0FD04D +:107A22000BC001D000D00091F1000895D2DF0F7E8B +:107A320003C00091E8000B7F0093E80008950091D5 +:107A4200EB0032DFC6DF077F089532DFC2DF0E7F31 +:107A5200F3CF00911D02002329F00A9509F10A953E +:107A620031F01EC0E0DF0A9561D0D9F41AC061D0AE +:107A7200B9F4D9DF0F7711F416D01BD00093E900C7 +:107A82001091EB0010FF0BC00ED010E01093E90034 +:107A920021E0F801E55EFD4F20834FD003C042D0C4 +:107AA20045D0CFDFC9CF1091EB0010621093EB00ED +:107AB20008951091E800177F1093E800089500914F +:107AC2001D02002311F4AFDF02C0013011F4B7DF51 +:107AD200B3CF023031F52DD019F52091F1002F7777 +:107AE2002093E90023D000FF19C081F01FD000616C +:107AF200DCDE01E010E0422F0E949F3E0093EA008C +:107B020000E00093EA0012D00860CFDE0BD030E034 +:107B1200F901E55EFD4F008310D0DACF03D0D7CF55 +:107B2200BFDE089500E00093E90008950091EB00A4 +:107B3200089579DF3CDF00230895BADE4ADF0E7F25 +:107B4200089583DF46DF02FFFDCF73DF42DF0F7749 +:107B520073CF0091D70001600093D7000E948B3849 +:107B620000E000931F0208950C94BF388A93FA93A1 +:107B7200EA933A922A921A920A927A936A935A93BF +:107B82004A933A932A931A930A938FB70091DA0091 +:107B920000FF24C00091D80000FF20C00EEF009328 +:107BA200DA000091D90000FF11C001E000930D013D +:107BB200ABD0026096D09AD00860A2D00E949B38C7 +:107BC2000091E0000E7F0093E00008C000E0009307 +:107BD2000D0100931E0298D0046083D07FD002FF73 +:107BE20005C084D002FF02C00BEF75D077D000FF32 +:107BF2001BC07CD000FF18C001E000930E016AD0C8 +:107C020083D000626ED00EEF6FD0006179D06ED05B +:107C12000F7D76D00091D80000620093D80009B59C +:107C22000D7F09BD00E009BD59D004FF20C05ED020 +:107C320004FF1DC009B500FD05C00E94EB3809B55F +:107C420000FFFDCF0091D8000F7D0093D80042D0F5 +:107C520000910E01002359F04CD00FEE45D00F7E5B +:107C620052D000643ED042D001604AD042D036D0D9 +:107C720005FF0FC03BD005FF0CC000E000930E01D2 +:107C820035D00F7E3DD00FED2FD00F7D3CD0006858 +:107C920028D024D003FF0DC029D003FF0AC000E082 +:107CA20000931F0207EF17D00E94743B2DD0116082 +:107CB20018D08FBF09911991299139914991599100 +:107CC200699179910990199029903990E991F991E6 +:107CD200899118950FEE0093E10008950091E1005B +:107CE20008951183008308950093E1000091E2005A +:107CF20008950091E200006203D00091E200086062 +:107D02000093E2000895FCDFE0E2F2E000811181DD +:107D1200089500008895FECF01E60DBF02E00EBF78 +:107D2200C2EED2E00E947438002311F00E94D33ECA +:107D32000E9465380E948A3E0C948A3E4A951AF047 +:107D4200000F111FFBCF0895BA92AA929A928A92BB +:107D52007A926A925A924A92BA93AA939A938A937D +:107D62000895BB84AA84998488847F806E805D8014 +:107D72004C80BB81AA8199818881F0E00FB6F8948A +:107D8200CE0FDF1F0FBE089520E006D0E9F7089559 +:107D9200259102D0E9F708952D9301501040202F2C +:107DA200212B089585E890E7FC0105911491FC01CF +:107DB2003296A591B491FC01349625913491422FCB +:107DC200432B19F0F901E4DF01C0DEDF069610E76C +:107DD2008139910748F308952F930CD02F9101D048 +:107DE20008953CD0F12FE02F45E047BFE89536D00B +:107DF20012D0089533D0F12FE02F43E047BFE8952A +:107E02002DD008952BD0F12FE02F43E047BFE89506 +:107E120025D001D0089522D041E147BFE8951EC088 +:107E22001DD0F12FE02F41E247BFC895002D16C0AB +:107E320015D0F12FE02F49E047BFC895002D0EC0A5 +:107E4200F32FE22F012E102E41E047BFE89506C026 +:107E520005D0002E29E027BFE89500C0022E27B7E3 +:107E620020FDFCCF202D0895022E27B726FDFCCF42 +:107E7200202D08950E94A53E22974801C901DA01EA +:107E820010C05BD001E0A00E00E0B01E00E4A0161E +:107E920000E0B00608F440C0830120E030E00E9418 +:107EA200F23E0A2F0B2B09F440C0082F0F7710E087 +:107EB2002C01401A510A320100E4A02E03C00A2FFD +:107EC2000B2BE1F04816590680F0F40101914F01A5 +:107ED2000983119729F001914F010883119711C06D +:107EE200F2013196049108830CC0F20104910983D6 +:107EF2003196E817F907A1F7F401EDCF1BD00883FB +:107F020019839201088119810E94213F16D0AA94F7 +:107F1200B1F62301AA24BB240DD0312F0F3F3F4FCE +:107F220009F4AFCF83011DD0B7CF01E02296ECE078 +:107F32000C94B23E82010C945F3802E0400E00E0E5 +:107F4200501E08959A938A9380E090E08C0109D0A4 +:107F520080589F4F8F3F0FE69007C0F38991999108 +:107F6200089520E030E00C94FB3E00000000000089 +:067F720000000000FC000D +:107FE4000C94ED3E0C94113F0C94193F0C94213FDA +:0C7FF4000C94F23E0C94033F0C94293FC7 +:040000030000700089 +:100000000C949D020C94E1020C94E1020C94E10228 +:100010000C94E1020C94E1020C94E1020C94E102D4 +:100020000C94E1020C94E1020C941C120C94EE125C +:100030000C948D240C94E1020C94E1020C94E102E6 +:100040000C94E1020C94E1020C94E1020C94E102A4 +:100050000C94E1020C94FA240C94E1020C94E10259 +:100060000C94E1020C94E1020C94E1020C94E10284 +:100070000C94E1020C94E1020C94E1020C94E10274 +:100080000C94860A0C94E1020C94E1020C94E102B7 +:100090000C94E1020C94E1020C94E1020C94E10254 +:1000A0000C94E1020C94E1020C94E10207634236E5 +:1000B000B79BD8A71A39685618AEBAAB558C1D3CF9 +:1000C000B7CC5763BD6DEDFD753EF6177231BF00BD +:1000D0000000803F08000000BE922449123EABAAF7 +:1000E000AA2ABECDCCCC4C3E00000080BEABAAAA52 +:1000F000AA3E00000000BF000000803F000000009A +:1001000000084178D3BB4387D1133D190E3CC3BDD2 +:100110004282AD2B3E68EC8276BED98FE1A93E4C7F +:1001200080EFFFBE01C4FF7F3F0000000000000021 +:10013000F1A4F1A3018C028C048C2B0014001A0092 +:100140000800150017001C0018000C001200130016 +:100150002A00290004001600070009000A000B000D +:100160000D000E000F0033003400E1001D001B00E5 +:100170000600190005001100100036003700380095 +:1001800028000030E000E200E30002202C002C00F8 +:1001900001205000510052004F002B0014001A00A3 +:1001A000090013000A000D000F0018001C003300A6 +:1001B0002A002900040015001600170007000B0094 +:1001C000110008000C0012003400E1001D001B00AB +:1001D0000600190005000E00100036003700380038 +:1001E00028000030E000E200E30002202C002C0098 +:1001F00001205000510052004F002B003400360007 +:10020000370013001C0009000A00060015000F004B +:100210002A00290004001200080018000C00070042 +:100220000B001700110016003800E1003300140025 +:100230000D000E001B00050010001A0019001D0023 +:1002400028000030E000E200E30002202C002C0037 +:1002500001205000510052004F0035021E021F02C3 +:100260002002210222022302240225022602270262 +:100270002A0001003A003B003C003D003E003F00E8 +:100280002D022E022F0230023102010040004100F7 +:100290004200430044004500032004200520005094 +:1002A0000100010001000100010002200100010025 +:1002B0000100AB00AA00A900AE0035001E001F001F +:1002C0002000210022002300240025002600270012 +:1002D0002A0001003A003B003C003D003E003F0088 +:1002E0002D002E002F0030003100010040004100A1 +:1002F0004200430044004500032004200520005034 +:1003000001000100010001000100010001000100E5 +:100310000120AB00AA00A900AE0028035400680029 +:100320006500200050006C0061006E0063006B00EF +:1003300020004B006500790062006F0061007200D0 +:10034000640000002C034F007200740068006F000E +:100350006C0069006E0065006100720020004B00B7 +:100360006500790062006F00610072006400730034 +:100370000000040309040902D000060100A03209AC +:100380000400000103010100092111010001223FC5 +:10039000000705810308000A0904010001030102A6 +:1003A00000092111010001224D0007058203080008 +:1003B0000A090402000103000000092111010001E3 +:1003C0002236000705830308000A0904030002031C +:1003D000000000092111010001222000070584030B +:1003E00020000107050403200001090404000001A6 +:1003F00001000009240100010900010509040500AC +:10040000020103000007240100014100062402014B +:100410000100062402020200092403010301020173 +:10042000000924030204010101000905060240003D +:1004300005000005250101010905850240000500B0 +:100440000005250101031201100100000008EDFE66 +:1004500060600100010200010631FF0974A1010979 +:1004600075150025FF952075088102097615002570 +:10047000FF952075089102C005010980A101850240 +:1004800016010026B7001A01002AB7007510950161 +:100490008100C0050C0901A1018503160100269CFD +:1004A000021A01002A9C02751095018100C0050105 +:1004B0000902A1010901A100050919012905150079 +:1004C00025019505750181029501750381010501DD +:1004D000093009311581257F950275088106093893 +:1004E0001581257F950175088106050C0A380215CE +:1004F00081257F950175088106C0C005010906A107 +:1005000001050719E029E715002501950875018106 +:1005100002950175088101050819012905950575E0 +:100520000191029501750391010507190029FF1535 +:100530000025FF950675088100C011241FBECFEF6E +:10054000DAE0DEBFCDBF04B603FE24C0809178039D +:1005500090917903A0917A03B0917B038730904BFF +:10056000A740B04BB9F4109278031092790310921F +:100570007A0310927B0314BE84B7877F84BF88E11F +:100580000FB6F89480936000109260000FBEE0E018 +:10059000F8E3099511E0A0E0B1E0E2EAFFE502C06E +:1005A00005900D92A63BB107D9F713E0A6EBB1E099 +:1005B00001C01D92A837B107E1F70E94F90E0C9413 +:1005C000CF2F0C9400000895089561110DC0FC0117 +:1005D0008281882331F085EE0E949D190E94B62BFE +:1005E00003C085EE0E94651A80E090E008958B3B81 +:1005F000910568F4883A910530F5853A9105C0F483 +:100600008430910598F4019709F06FC071C0803E65 +:10061000910508F46AC0883E910540F09C01205F76 +:1006200031092031310508F060C05CC09C01A1C0D7 +:10063000853A910509F45FC0863A910509F45EC0D8 +:1006400023E830E496C0883A910509F45AC0893A03 +:10065000910509F459C08A3A910509F458C08B3ABA +:10066000910509F457C08C3A910509F456C08D3AAA +:10067000910509F455C0803B910509F454C08E3AA8 +:10068000910509F453C08F3A910509F452C0813B9A +:10069000910509F451C0823B910509F450C0833B98 +:1006A000910509F44FC0843B910509F44EC0853B88 +:1006B000910509F44DC0863B910509F44CC0873B78 +:1006C000910509F44BC0883B910509F44AC0893B68 +:1006D000910509F449C08A3B910509F048C02AE216 +:1006E00036E447C09C01306544C020E030E041C0A2 +:1006F00021E030E03EC021E830E43BC022E830E4B5 +:1007000038C022EE34E435C029EE34E432C02AEE9B +:1007100034E42FC025EB34E42CC026EB34E429C0AC +:1007200027EB34E426C02CEC34E423C02DEC34E475 +:1007300020C023E835E41DC02AE835E41AC022E9C8 +:1007400035E417C024E935E414C021E236E411C0D1 +:1007500023E236E40EC024E236E40BC025E236E4A0 +:1007600008C026E236E405C027E236E402C020E0F5 +:1007700034E4C90108959CE0799FF001112490E3CD +:10078000899FE00DF11D1124E60FF11DEE0FFF1FF3 +:10079000E65CFE4F25913491C9010895880F991F99 +:1007A00082559040FC0125913491C9010895880F2C +:1007B000991F825D9E4FFC0125913491C9010895D6 +:1007C0000E94BB039C013A9521153F4108F4DFC00C +:1007D0009C0130522115304120F49F700E94D703B4 +:1007E00008959C0130532115304118F49927906CDD +:1007F00008959C0130542031310520F48F709927E1 +:10080000946D0895803120E4920719F480E091ED11 +:100810000895813140E4940719F480E090ED089543 +:10082000823120E4920719F480E092ED089583313B +:1008300040E4940719F480E093ED0895811520E5D4 +:10084000920711F40C941F25813040E5940731F490 +:100850008091680281608093680208959C013056FF +:100860002115304108F402C097FF02C0906F08952F +:10087000803E9105E0F4803C910568F58133910557 +:1008800009F474C048F48932910509F46AC08A32C7 +:10089000910509F07AC074C089339105F9F0823866 +:1008A0009105E1F08533910509F06FC050C0833E9A +:1008B0009105A9F140F4803E9105C9F0823E910571 +:1008C00009F063C01BC0863E910571F1873E91051A +:1008D00009F05BC037C00E94CE03089520917B02CF +:1008E00020FD02C021FF51C080EE90E04EC08091FB +:1008F0007B0280FFF9CF89E390E047C080917B02C3 +:1009000082FF0AC080917B0284FF03C080E090E0F8 +:100910003CC083EE90E039C082EE90E036C080911A +:100920007B0282FFEFCFF8CF80917B0283FF07C06D +:1009300080917B0284FDEACF87EE90E026C086EEB0 +:1009400090E023C080917B0283FFF2CFF8CF8091AB +:100950007B0285FF03C089E290E017C085E390E049 +:1009600014C080917B0285FDF9CFF5CF80917B0289 +:1009700086FF03C08AE290E008C081E390E005C0F2 +:1009800080917B0286FDF9CFF5CF0E94F702089592 +:100990005F926F927F928F929F92AF92BF92CF920F +:1009A000DF92EF92FF920F931F93CF93DF93CDB718 +:1009B000DEB728970FB6F894DEBF0FBECDBF9E01FD +:1009C0002F5F3F4F4E0189E0880E911C60E070E080 +:1009D00000E010E0E12CF12CC12CD12CA12CB12C89 +:1009E00088E0782E622E532E41E050E0E3E2F1E001 +:1009F000A62DB52D872D01900D928A95E1F7F9016D +:100A0000819191919F01FC01E07FFF27E032F10588 +:100A100059F48F709927FA0102C0EE0FFF1F8A95D3 +:100A2000E2F7AE2ABF2A37C0E033F10559F48F70E0 +:100A30009927FA0102C0EE0FFF1F8A95E2F7CE2A2E +:100A4000DF2A29C0E034F10559F48F709927FA01A3 +:100A500002C0EE0FFF1F8A95E2F7EE2AFF2A1BC0A5 +:100A6000E035F10559F48F709927FA0102C0EE0FB5 +:100A7000FF1F8A95E2F70E2B1F2B0DC0E036F10504 +:100A800051F48F709927FA0102C0EE0FFF1F8A956B +:100A9000E2F76E2B7F2B2815390509F0A7CF94B10B +:100AA0008A2D8095892384B985B18A2985B997B122 +:100AB0008C2D8095892387B988B18C2988B99AB102 +:100AC0008E2D809589238AB98BB18E298BB99DB1E2 +:100AD000802F809589238DB98EB1802B8EB990B3EC +:100AE000862F8095892380BB81B3862B81BB289676 +:100AF0000FB6F894DEBF0FBECDBFDF91CF911F912F +:100B00000F91FF90EF90DF90CF90BF90AF909F90AC +:100B10008F907F906F905F9008955F926F927F9219 +:100B20008F929F92AF92BF92CF92DF92EF92FF92FD +:100B30000F931F93CF93DF93CDB7DEB768970FB6B0 +:100B4000F894DEBF0FBECDBF85B7806885BF85B77F +:100B5000806885BF0E94CF076E9A769A0E94C8046B +:100B60009E012F5F3F4F4E0189E1880E911C60E08E +:100B700070E000E010E0E12CF12CC12CD12CA12C74 +:100B8000B12C98E1792E622E532E41E050E0EBE239 +:100B9000F1E0A62DB52D872D01900D928A95E1F7F4 +:100BA000F901819191919F01FC01E07FFF27E032E3 +:100BB000F10559F48F709927FA0102C0EE0FFF1F5B +:100BC0008A95E2F7AE2ABF2A37C0E033F10559F41F +:100BD0008F709927FA0102C0EE0FFF1F8A95E2F786 +:100BE000CE2ADF2A29C0E034F10559F48F70992705 +:100BF000FA0102C0EE0FFF1F8A95E2F7EE2AFF2AE4 +:100C00001BC0E035F10559F48F709927FA0102C035 +:100C1000EE0FFF1F8A95E2F70E2B1F2B0DC0E0365B +:100C2000F10551F48F709927FA0102C0EE0FFF1FF2 +:100C30008A95E2F76E2B7F2B2815390509F0A7CF8F +:100C400094B18A2D8095892384B985B18A2985B983 +:100C500097B18C2D8095892387B988B18C2988B963 +:100C60009AB18E2D809589238AB98BB18E298BB943 +:100C70009DB1802F809589238DB98EB1802B8EB93F +:100C800090B3862F8095892380BB81B3862B81BB4F +:100C90001092B7011092B6011092BF011092BE01DE +:100CA0001092B9011092B8011092C1011092C001C6 +:100CB0001092BB011092BA011092C3011092C201AE +:100CC0001092BD011092BC011092C5011092C40196 +:100CD00068960FB6F894DEBF0FBECDBFDF91CF91FF +:100CE0001F910F91FF90EF90DF90CF90BF90AF904A +:100CF0009F908F907F906F905F9008955F926F921A +:100D00007F928F929F92AF92BF92CF92DF92EF929B +:100D1000FF920F931F93CF93DF93CDB7DEB7A097CA +:100D20000FB6F894DEBF0FBECDBF7E0149E1E40EE1 +:100D3000F11C2EEBC22E21E0D22E5E0151E2A50E57 +:100D4000B11C38E0532E470101E010E048E1642E69 +:100D500055E0752EE3E2F1E0D401852D01900D926E +:100D60008A95E1F7F701819191917F019C01207FA4 +:100D700033272032310589F424B18F709927A801D7 +:100D800002C0440F551F8A95E2F7CA01242B24B9EB +:100D900095B18095892385B94FC02033310589F4F9 +:100DA00027B18F709927F80102C0EE0FFF1F8A95B7 +:100DB000E2F7CF012E2B27B998B18095892388B906 +:100DC0003BC02034310589F42AB18F709927A801DE +:100DD00002C0440F551F8A95E2F7CA01242B2AB995 +:100DE0009BB1809589238BB927C02035310589F4C3 +:100DF0002DB18F709927F80102C0EE0FFF1F8A9561 +:100E0000E2F7CF012E2B2DB99EB1809589238EB9A3 +:100E100013C02036310581F420B38F709927A801C3 +:100E200002C0440F551F8A95E2F7CA01242B20BB4C +:100E300091B38095892381BB50EA5A95F1F7BE01A1 +:100E40006F5F7F4F80E090E020E030E0EBE2F1E088 +:100E5000DE011196462D01900D924A95E1F7FB01B6 +:100E600041915191BF01FA01E07FFF27E032F10586 +:100E700011F4E3B113C0E033F10511F4E6B10EC093 +:100E8000E034F10511F4E9B109C0E035F10511F4E0 +:100E9000ECB104C0E036F105B9F4EFB1F0E04F7009 +:100EA000552702C0F595E7954A95E2F7E0FD08C0A1 +:100EB000A801022E02C0440F551F0A94E2F702C097 +:100EC00040E050E0842B952B2F5F3F4F2C303105B5 +:100ED00009F0BCCFF601208131812817390721F0B4 +:100EE00091838083709200010E94C804F2E0CF0ECB +:100EF000D11CEA14FB0409F02DCF80910001882356 +:100F000061F1815080930001811121C08091BE0167 +:100F10009091BF019093B7018093B6018091C00179 +:100F20009091C1019093B9018093B8018091C20161 +:100F30009091C3019093BB018093BA018091C40149 +:100F40009091C5019093BD018093BC0106C08FE9CB +:100F50009FE00197F1F700C0000081E0A0960FB676 +:100F6000F894DEBF0FBECDBFDF91CF911F910F91DF +:100F7000FF90EF90DF90CF90BF90AF909F908F90B9 +:100F80007F906F905F900895E82FF0E0EE0FFF1FC5 +:100F9000EA54FE4F80819181089508950895279A1B +:100FA0002F988FEF9FEF90938700809386008AE0C1 +:100FB0008093800089E1809381000C945F2B8111E4 +:100FC0000BC080918000877F8093800010928D00FD +:100FD00010928C002F9808952F98833041F48091BF +:100FE00080008860809380008FEF9FEF12C0909107 +:100FF000800098609093800023E030E0281B310946 +:10100000220F331F8FEF9FEF02C0969587952A9589 +:10101000E2F790938D0080938C0008950F931F93B7 +:10102000CF93DF93CDB7DEB7CC58D1090FB6F89484 +:10103000DEBF0FBECDBF8C01862F642F882379F0D1 +:10104000F80192812FE7482F992329F08DE792E04C +:101050000E94F81404C08DE792E00E940815F80180 +:1010600080818B3061F49181933009F068C0828176 +:10107000882309F4CDC0809103018F5F0EC08A30B0 +:10108000E1F5F8019181933009F059C082818823FC +:1010900009F4BEC08091030181508093030120E0D8 +:1010A0004BE760E08DE792E00E94E81420E04BE718 +:1010B00061E08DE792E00E94E81420E04BE762E0F7 +:1010C0008DE792E00E94E81420E04BE763E08DE7B3 +:1010D00092E00E94E81420E04BE764E08DE792E0A4 +:1010E000C457DF4F0FB6F894DEBF0FBECDBFDF9100 +:1010F000CF911F910F910C94E814893069F4F80195 +:1011000091819330E1F492819923C9F0809101019A +:101110009091020101960EC0883089F4F801918106 +:10112000933069F49281992351F08091010190915B +:10113000020101979093020180930101B0CFF80161 +:10114000928140910301992391F196E4E3E4F1E067 +:10115000DE01A95BBF4F01900D929A95E1F7405DCA +:10116000F8019181FCE09F9F40191124E091010159 +:10117000F0910201E80FF11DEE0FFF1F87E490E0F0 +:101180008C0F9D1FE80FF91F8081480F2FE760E04B +:101190008DE792E0C457DF4F0FB6F894DEBF0FBE65 +:1011A000CDBFDF91CF911F910F910C94F81496E46D +:1011B000E3E4F1E0DE01119601900D929A95E1F7DA +:1011C000405DF8019181FCE09F9F40191124E0915E +:1011D0000101F0910201E80FF11DEE0FFF1F81E008 +:1011E00090E08C0F9D1FE80FF91F8081480F2FE7BB +:1011F00060E08DE792E0C457DF4F0FB6F894DEBF92 +:101200000FBECDBFDF91CF911F910F910C940815A8 +:10121000C457DF4F0FB6F894DEBF0FBECDBFDF91CE +:10122000CF911F910F910895CF93DF93EA019B0116 +:10123000AC0160E074E284E79BE40E945F2C0E94B2 +:10124000C72C709397006093960020E130E02C1B30 +:101250003D0B02C0759567952A95E2F7709399004A +:1012600060939800DF91CF9108951092020210923E +:10127000010210929000109291001092FD011092C4 +:10128000FE011092FF01109200021092FC011092D8 +:10129000FB01E9EDF1E0A9ECB1E01192119211929C +:1012A00011921D921D9281E0E93FF807B1F7089570 +:1012B000AF92BF92CF92DF92EF92FF920F931F9364 +:1012C000CF93DF936B017C0109EF11E047EDA42E72 +:1012D00041E0B42EC7E0D0E0A7019601F801929159 +:1012E0008291729162918F010E945B2C882349F058 +:1012F0002197F2E0AF1AB108CF3F8FEFD80761F71F +:1013000034C0F8011082118212821382F501118219 +:101310001082FE01EE0FFF1FEE0FFF1FE752FE4F80 +:10132000DE01AA0FBB1FA753BE4FCE011AC0019604 +:1013300044815581668177814083518362837383C1 +:10134000148215821682178212962D913C91139762 +:1013500011963C932E9313961C921E9212973496DC +:1013600012968730910519F7C3CF809101029091B1 +:101370000202019797FD05C090930202809301023B +:1013800004C01092020210920102E0910102F09159 +:101390000202309789F410929000109291001092FE +:1013A000FD011092FE011092FF01109200021092B6 +:1013B000FC011092FB019EC03197DF01AA0FBB1FF9 +:1013C000AA0FBB1FA752BE4FCD90DD90ED90FC90B1 +:1013D000EE0FFF1FE753FE4FC081D181A090FD01AA +:1013E000B090FE010091FF0110910002A70196014B +:1013F0006A2D7B2D802F912F0E945B2C87FF2FC0A1 +:1014000081E08093C801AE016A2D7B2D802F912F42 +:101410000E9414092091FD013091FE014091FF01CD +:1014200050910002C701B6010E94F62B20E030E087 +:101430004AEF53E40E945F2C9B01AC016A2D7B2D87 +:10144000802F912F0E94F72B5B018C01A701960141 +:101450007B2D912F0E945B2C1816ACF638C0A7018B +:1014600096016A2D7B2D802F912F0E94AA2D181690 +:1014700084F581E08093C801AE016A2D7B2D802F19 +:10148000912F0E941409A70196016091FD017091AE +:10149000FE018091FF01909100020E94F62B20E056 +:1014A00030E04AEF53E40E945F2C9B01AC016A2DAF +:1014B0007B2D802F912F0E94F62B5B018C01A701C1 +:1014C00096017B2D912F0E94AA2D87FFD5CF1092D8 +:1014D000C801AE01C701B6010E941409C092FD0106 +:1014E000D092FE01E092FF01F0920002D093FC0145 +:1014F000C093FB01DF91CF911F910F91FF90EF906F +:10150000DF90CF90BF90AF90089508951F920F92F3 +:101510000FB60F9211242F933F934F935F936F93C6 +:101520007F938F939F93AF93BF93EF93FF9380919C +:10153000960090919700892B09F455C08091C801BD +:10154000811151C08091F9019091FA01813091058A +:1015500071F082309105C1F0892BC1F52091FD0118 +:101560003091FE014091FF01509100021DC0609139 +:10157000FD017091FE018091FF01909100029B019D +:10158000AC010E94F72B0EC020E030E040E450E4B4 +:101590006091FD017091FE018091FF019091000228 +:1015A0000E94AE2D9B01AC0160E074E284E79BE4F5 +:1015B0000E945F2C0E94C72C709397006093960046 +:1015C0007595679570939900609398008091F901E3 +:1015D0009091FA01019663E070E00E948A2F909347 +:1015E000FA018093F901FF91EF91BF91AF919F9123 +:1015F0008F917F916F915F914F913F912F910F90BC +:101600000FBE0F901F901895AF92BF92CF92DF92AE +:10161000EF92FF920F931F93CF93DF936B017C01A7 +:10162000EA0120E030E0A9010E94AA2D18160CF072 +:10163000B4C03E9A82E8809390008AE18093910042 +:10164000A090FD01B090FE010091FF0110910002F9 +:1016500020E030E0A9016A2D7B2D802F912F0E9480 +:101660005B2C81112DC0AE01C701B6010E94140987 +:10167000C092FD01D092FE01E092FF01F0920002C3 +:10168000D093FC01C093FB01809101029091020272 +:10169000FC01EE0FFF1FEE0FFF1FE752FE4FC0824F +:1016A000D182E282F382FC01EE0FFF1FE753FE4F6F +:1016B000D183C083019690930202809301026DC092 +:1016C000A70196016A2D7B2D802F912F0E945B2C04 +:1016D00087FF2CC0AE016A2D7B2D802F912F0E9499 +:1016E00014092091FD013091FE014091FF015091BC +:1016F0000002C701B6010E94F62B20E030E04AEF5D +:1017000053E40E945F2C9B01AC016A2D7B2D802F3E +:10171000912F0E94F72B5B018C01A70196017B2D75 +:10172000912F0E945B2C1816ACF69DCFA701960155 +:101730006A2D7B2D802F912F0E94AA2D18160CF058 +:1017400092CFAE016A2D7B2D802F912F0E9414091C +:10175000A70196016091FD017091FE018091FF014A +:10176000909100020E94F62B20E030E04AEF53E413 +:101770000E945F2C9B01AC016A2D7B2D802F912F45 +:101780000E94F62B5B018C01A70196017B2D912F06 +:101790000E94AA2D87FFD5CF66CFDF91CF911F91F1 +:1017A0000F91FF90EF90DF90CF90BF90AF90089592 +:1017B00080910C020895CF93DF9300D01F92CDB794 +:1017C000DEB720916E03243021F523E029839B832B +:1017D0008A832093E9008FEF06C095ED9A95F1F783 +:1017E0000000882329F09091E800815095FFF5CF03 +:1017F0008091E80085FF0DC040E050E063E070E0BC +:10180000CE0101960E94BA0F8091E8008E778093F6 +:10181000E8000F900F900F90DF91CF910895CF9334 +:10182000DF9300D01F92CDB7DEB720916E03243036 +:1018300029F522E029839B838A8383E08093E90052 +:101840008FEF06C095ED9A95F1F70000882329F0F7 +:101850009091E800815095FFF5CF8091E80085FFD9 +:101860000DC040E050E063E070E0CE0101960E94C0 +:10187000BA0F8091E8008E778093E8000F900F9068 +:101880000F90DF91CF91089520916E032430F9F4E9 +:1018900022E02093E9002FEF06C035ED3A95F1F7ED +:1018A0000000222329F03091E800215035FFF5CFC8 +:1018B0002091E80025FF0BC040E050E065E070E0BB +:1018C0000E94BA0F8091E8008E778093E800089517 +:1018D000CF93DF93EC0180916E03843041F581E07A +:1018E0008093E9008FEF06C095ED9A95F1F700001F +:1018F000882329F09091E800815095FFF5CF8091E1 +:10190000E80085FF14C040E050E068E070E0CE01E0 +:101910000E94BA0F8091E8008E778093E80088E0FB +:10192000FE01A4E0B2E001900D928A95E1F7DF910B +:10193000CF910895BF92CF92DF92EF92FF920F93D3 +:101940001F93CF93DF937C01B62EE90100E010E0F6 +:10195000C42ED12C0BC04991202F2B0D2F774F7700 +:101960006FE0C7010E94E8140F5F1F4F0C151D05A3 +:1019700094F3DF91CF911F910F91FF90EF90DF9043 +:10198000CF90BF90089570E06F5F7F4F6F707727A3 +:101990000C94E8140F931F93CF93C42F63307105F9 +:1019A00009F04AC0842F807F803849F1803909F0DE +:1019B00043C0622F6F7770E080E090E00E94FA2CC5 +:1019C00020E030E040E451E40E945F2C9B01AC0138 +:1019D00060E070E080E090E40E94112E0F7710E04C +:1019E00023E0159507952A95E1F72DEC3CEC42E0B4 +:1019F00053E40E94AE2DA8010E94040B1DC0622F6B +:101A00006F7770E080E090E00E94FA2C20E030E0F8 +:101A100040E451E40E945F2C9B01AC0160E070E067 +:101A200080E090E40E94112E2DEC3CEC42E053E467 +:101A30000E94AE2D0E945809CC3F29F4CF911F91EE +:101A40000F910C943509CF911F910F9108950F9329 +:101A50001F93CF93DF93CDB7DEB727970FB6F894D8 +:101A6000DEBF0FBECDBF8C0114C08A810E94C2149C +:101A70009A819D839B819E839C819F8381111EC03F +:101A800089818430B1F08730A1F08630A1F08530B3 +:101A9000A1F0BE016F5F7F4F84E091E00E942F189C +:101AA0008111E3CF84E091E00E9420180E949B14F2 +:101AB0000DC083E003C082E001C081E0AE014B5F56 +:101AC0005F4F682FC8010E945515E3CF27960FB6C8 +:101AD000F894DEBF0FBECDBFDF91CF911F910F9164 +:101AE0000895EF92FF920F93CF93DF9300D000D031 +:101AF00000D0CDB7DEB77B014A832B830C83842FC4 +:101B00002E834D830E94C2142E814D8181111BC0F2 +:101B100082E0E816F10479F083E0E816F10421F0A0 +:101B2000EA94EF2821F50BC0073F11F487E001C0CC +:101B300084E089830BC0273FD9F786E0FACF473F7F +:101B4000B9F785E0F6CF42954F704983BE016F5FCC +:101B50007F4F84E091E00E94E51784E091E00E94CD +:101B6000031884E091E00E9420180E949B1426969E +:101B70000FB6F894DEBF0FBECDBFDF91CF910F91AE +:101B8000FF90EF90089580916D03811109C00E942C +:101B9000A1110E94FE118091E20084608093E20016 +:101BA000089510926D03089508950C94E4020C9426 +:101BB000892480916E03843049F58091E9008F700B +:101BC0009091EC0090FF02C090E801C090E0982B4B +:101BD00084E08093E9008091EB0080FF14C0809145 +:101BE000EE0087FD03C00FC01092F1008091E80065 +:101BF00085FDFACF8091E80080FF05C08091E80064 +:101C00008E778093E8009F709093E900089542E0FA +:101C100061EC81E00E94171142E061EC82E00E94D9 +:101C2000171142E061EC83E00E94171146E261EC7B +:101C300084E00E94171142E361E885E00E941711D9 +:101C400042E360E886E00C941711809170038330C2 +:101C500009F454C030F4813071F0823009F0AAC028 +:101C600091C08A3009F47EC08B3009F45FC089309E +:101C700009F0A0C020C080916F03813A09F09AC09A +:101C80008091E800877F8093E800809173039091B2 +:101C90007403892B21F060E080E090E003C068E0ED +:101CA00084E092E070E00E9458108091E8008B7709 +:101CB0008093E800089580916F03813209F07AC023 +:101CC0008091730390917403892B09F073C0809104 +:101CD000E800877F8093E80005C080916E03882329 +:101CE00009F468C08091E80082FFF7CF8091F1008D +:101CF00080930C028091E8008B7758C080916F032D +:101D0000813A09F057C08091730390917403892B35 +:101D100009F050C08091E800877F8093E8008091AF +:101D2000E80080FFFCCF80911A013BC080916F03D7 +:101D3000813209F03FC08091730390917403892B25 +:101D4000C9F58091E800877F8093E8000E944E11DA +:101D50009091710381E0911101C080E080931A019C +:101D60000C948C1E80916F03813221F58091E800E4 +:101D7000877F8093E8000E944E11809172038093C8 +:101D80000302089580916F03813AA1F48091E800E5 +:101D9000877F8093E8008091E80080FFFCCF8091EE +:101DA00003028093F1008091E8008E778093E80031 +:101DB0000C944E11089584B7877F84BF88E10FB6D5 +:101DC000F89480936000109260000FBE90E080E86D +:101DD0000FB6F89480936100909361000FBE0E944B +:101DE000A1110E94FE11E2EEF0E080818460808308 +:101DF00008958DE792E00E94241561E77DE08DE76C +:101E000092E00E947A1567E27DE08DE792E00E9401 +:101E10007E150E94DB0E78946AEC7CE08DE792E000 +:101E20000E94201563EC7CE08DE792E00E9418157B +:101E30006AE97CE08DE792E00E941C150E94850A09 +:101E40000E949B140E94AC1880E191E00E945418FB +:101E50000BC00E944E2480916C03882329F00E94BD +:101E6000742481110E94A40F80916E03853089F340 +:101E70008DE792E00E942D170E94B618F5CF292F0A +:101E8000332723303105B1F04CF42130310509F40A +:101E90004DC02230310509F04EC007C02132310556 +:101EA00041F12232310591F146C0E0EDF0E086E7E4 +:101EB00093E045C099278130910569F08230910502 +:101EC00089F0892B09F037C0E2E7F3E0E491F0E014 +:101ED00082E793E034C0E4E4F3E0E491F0E084E4EA +:101EE00093E02DC0EAE1F3E0E491F0E08AE193E0D1 +:101EF00026C0643000F5E62FF0E0EE0FFF1FE75735 +:101F0000FE4F80819181E9E0F0E019C0643098F4DF +:101F1000E62FF0E0DF01AA0FBB1FAF56BE4F8D9139 +:101F20009C91E756FE4FE081F0E009C0E2E1F0E06D +:101F300086E494E004C0E0E0F0E080E090E0DA01C4 +:101F40008D939C93CF01089580E189BD82E189BD85 +:101F500009B400FEFDCF8091D8008F7D8093D8001A +:101F60008091E00082608093E0008091E00081FD3C +:101F7000FCCF0895BF92CF92DF92EF92FF920F9322 +:101F80001F93CF93DF937C018B01EA010E946F11B5 +:101F9000B82E811133C0209731F028813981021B7E +:101FA000130BE20EF31EC12CD12C23C08091E8004C +:101FB00085FD15C08091E8008E778093E80020971A +:101FC00049F0888199818C0D9D1D9983888325E036 +:101FD000B22E14C00E946F11882359F00EC0F70171 +:101FE00081917F018093F10001501109FFEFCF1A19 +:101FF000DF0A01151105D1F601C0B82E8B2DDF9136 +:10200000CF911F910F91FF90EF90DF90CF90BF90F5 +:102010000895BF92CF92DF92EF92FF920F931F939A +:10202000CF93DF937C018B01EA010E946F11B82EE0 +:10203000811133C0209731F028813981021B130BA5 +:10204000E20EF31EC12CD12C23C08091E80085FD47 +:1020500015C08091E8008B778093E800209749F0C5 +:10206000888199818C0D9D1D9983888345E0B42ECC +:1020700014C00E946F11882359F00EC08091F100A6 +:10208000F70181937F0101501109FFEFCF1ADF0A99 +:1020900001151105D1F601C0B82E8B2DDF91CF911E +:1020A0001F910F91FF90EF90DF90CF90BF90089518 +:1020B00040917503509176034617570748F0611514 +:1020C000710539F44091E8004E774093E80001C073 +:1020D000BA01FC0140E033C080916E03882309F40B +:1020E00042C0853009F441C08091E80083FD39C0C9 +:1020F0008091E80082FD2FC08091E80080FF1FC022 +:102100009091F3008091F200392F20E0A901482B33 +:10211000CA0106C041914093F100615071090196D6 +:102120006115710519F088309105A0F341E0089719 +:1021300009F040E08091E8008E778093E800611517 +:10214000710551F64111C8CF06C080916E038823F6 +:1021500051F0853051F08091E80082FFF6CF80E0A9 +:10216000089581E0089582E0089583E00895409104 +:102170007503509176034617570748F061157105AE +:1021800039F44091E8004E774093E80001C0BA016D +:10219000FC0140E034C080916E03882309F443C001 +:1021A000853009F442C08091E80083FD3AC08091F7 +:1021B000E80082FD30C08091E80080FF20C090914F +:1021C000F3008091F200392F20E0A901482BCA01C9 +:1021D00007C044914093F100319661507109019616 +:1021E0006115710519F08830910598F341E0089761 +:1021F00009F040E08091E8008E778093E800611557 +:10220000710549F64111C7CF06C080916E0388233E +:1022100051F0853051F08091E80082FFF6CF80E0E8 +:10222000089581E0089582E0089583E00895982F4D +:102230002CC09093E900981739F07091EC00209130 +:10224000ED005091F00003C0242F762F50E021FDC7 +:1022500002C09F5F1AC03091EB003E7F3093EB00CD +:102260003091ED003D7F3093ED003091EB00316017 +:102270003093EB007093EC002093ED005093F0004E +:102280002091EE0027FDE5CF07C0973090F28F70C8 +:102290008093E90081E0089580E0089580916F03C4 +:1022A00087FD05C08091E80080FF0EC012C08091BC +:1022B000E80082FD05C080916E038111F8CF08957A +:1022C0008091E8008B7708C080916E038111EACF7E +:1022D00008958091E8008E778093E80008958091BA +:1022E000E4009091E50045E62091EC0020FD1FC040 +:1022F00023C020916E03222391F0253091F020918C +:10230000EB0025FD10C02091E4003091E500281776 +:10231000390751F34150C90139F784E0089582E04B +:10232000089583E0089581E0089580E00895209164 +:10233000E80020FFDECFF9CF2091E80022FFD9CFBF +:10234000F4CF0E940F120E941712E0EEF0E080819D +:1023500081608083E8EDF0E080818F77808319BC15 +:10236000A7EDB0E08C918E7F8C9380818F7E8083EF +:1023700010926D0308950F931F93CF93DF930E94E4 +:102380000F120E941712C8EDD0E088818F778883E2 +:1023900088818068888388818F7D888319BC1092AA +:1023A0006E0310926A0310926C0310926B0300EE9E +:1023B00010E0F80180818B7F808388818160888331 +:1023C00042E060E080E00E941711E1EEF0E08081E1 +:1023D0008E7F8083E2EEF0E0808181608083808167 +:1023E00088608083F80180818E7F8083888180610E +:1023F0008883DF91CF911F910F910895E8EDF0E070 +:1024000080818F7E8083E7EDF0E080818160808332 +:1024100084E082BF81E080936D030C94BB11E8EDF2 +:10242000F0E080818E7F80831092E2000895109208 +:10243000DA001092E10008951F920F920FB60F92EA +:1024400011242F933F934F935F936F937F938F93B9 +:102450009F93AF93BF93EF93FF938091E10082FF2F +:102460000BC08091E20082FF07C08091E1008B7F6A +:102470008093E1000E94D90D8091DA0080FF1FC097 +:102480008091D80080FF1BC08091DA008E7F8093FE +:10249000DA008091D90080FF0DC080E189BD82E122 +:1024A00089BD09B400FEFDCF81E080936E030E94D8 +:1024B000C30D05C019BC10926E030E94D10D80910E +:1024C000E10080FF19C08091E20080FF15C080917B +:1024D000E2008E7F8093E2008091E2008061809331 +:1024E000E2008091D80080628093D80019BC85E01A +:1024F00080936E030E94D50D8091E10084FF30C06F +:102500008091E20084FF2CC080E189BD82E189BD19 +:1025100009B400FEFDCF8091D8008F7D8093D80054 +:102520008091E1008F7E8093E1008091E2008F7EB8 +:102530008093E2008091E20081608093E2008091CC +:102540006A03882311F084E007C08091E30087FFCD +:1025500002C083E001C081E080936E030E94D70D2A +:102560008091E10083FF29C08091E20083FF25C0B4 +:102570008091E100877F8093E10082E080936E0389 +:1025800010926A038091E1008E7F8093E100809138 +:10259000E2008E7F8093E2008091E2008061809370 +:1025A000E20042E060E080E00E9417118091F000BC +:1025B00088608093F0000E94D40DFF91EF91BF914D +:1025C000AF919F918F917F916F915F914F913F91CB +:1025D0002F910F900FBE0F901F9018951F920F9282 +:1025E0000FB60F9211242F933F934F935F936F93E6 +:1025F0007F938F939F93AF93BF93CF93EF93FF936B +:102600008091E9008F709091EC0090FF02C090E8FB +:1026100001C090E0C92FC82B1092E9008091F00012 +:10262000877F8093F00078940E9432131092E90023 +:102630008091F00088608093F000CF70C093E90033 +:10264000FF91EF91CF91BF91AF919F918F917F912A +:102650006F915F914F913F912F910F900FBE0F900F +:102660001F9018951F93CF93DF93CDB7DEB7AC972C +:102670000FB6F894DEBF0FBECDBFEFE6F3E080915A +:10268000F100819323E0E737F207C9F70E94250E96 +:102690008091E80083FF37C180916F0390917003B0 +:1026A000953009F488C038F49130B1F170F093306E +:1026B00009F029C131C0983009F4F8C0993009F403 +:1026C00004C1963009F01FC19DC0803821F08238C6 +:1026D00009F019C108C080916B0390916C03992394 +:1026E00089F082600FC080917303909174038F70A2 +:1026F00099278093E9008091EB0085FB882780F97A +:102700001092E9009091E800977F9093E800809301 +:10271000F1001092F100D5C0882319F0823009F041 +:10272000F2C08F7121F0823009F0EDC00BC08091B2 +:102730007103813009F0E7C0933009F080E08093A5 +:102740006C032FC08091710381112BC080917303A2 +:10275000909174038F709927009709F4D4C08093E7 +:10276000E9002091EB0020FF1CC020917003233072 +:1027700021F48091EB00806212C09091EB00906197 +:102780009093EB0021E030E001C0220F8A95EAF738 +:102790002093EA001092EA008091EB008860809319 +:1027A000EB001092E9008091E800877F8093E800B9 +:1027B0000E944E11A8C08111A6C080917103909112 +:1027C00072038F779927182F9091E3009078982BB8 +:1027D0009093E3008091E800877F8093E8000E9457 +:1027E0004E118091E80080FFFCCF8091E30080686B +:1027F0008093E300112311F083E001C082E0809315 +:102800006E0381C08058823008F07DC080917103D2 +:10281000909172038C3D23E0920779F583E08A83DF +:102820008AE289834FB7F894DE01139620E03EE0F8 +:1028300051E2E32FF0E050935700E49120FF03C0F2 +:10284000E295EF703F5FEF708E2F90E0EA3010F06E +:10285000C79601C0C0968D939D932F5F243149F791 +:102860004FBF8091E800877F8093E8006AE270E0C4 +:10287000CE0101960E94581013C0AE01455D5F4F16 +:10288000609173030E943F0F0097E9F12091E800E7 +:10289000277F2093E800BC018BA59CA50E94B71060 +:1028A0008091E8008B778093E8002DC0803859F53F +:1028B0008091E800877F8093E80080916A0380938D +:1028C000F1008091E8008E7771CF81111CC090914A +:1028D00071039230C0F48091E800877F8093E80014 +:1028E00090936A030E944E1180916A03811104C083 +:1028F0008091E30087FF02C084E001C081E0809303 +:102900006E030E94070E8091E80083FF0AC0809149 +:10291000E800877F8093E8008091EB0080628093DD +:10292000EB00AC960FB6F894DEBF0FBECDBFDF91C3 +:10293000CF911F910895CF9380916E038823B1F0BA +:102940008091E9008F709091EC0090FF02C090E8B8 +:1029500001C090E0C92FC82B1092E9008091E800D7 +:1029600083FD0E943213CF70C093E900CF91089588 +:10297000881F8827881F089591E0883F08F490E019 +:10298000892F0895982F907F903B99F038F49039D3 +:1029900081F0903A71F09038C9F40BC0903DA1F0ED +:1029A00018F4903C99F410C0903E19F0903F71F4E7 +:1029B00002C083E00895E82FE15FEF3038F4F0E0E3 +:1029C000E356FE4F8081089582E0089580E00895E7 +:1029D0000F932F774F776F70606BDC01ED91FC9157 +:1029E000022F242F462F63E070E009950F91089580 +:1029F0000F932F774F776F706069DC01ED91FC9139 +:102A0000022F242F462F63E070E009950F9108955F +:102A10000F932F774F776F706068DC01ED91FC9119 +:102A2000022F242F462F63E070E009950F9108953F +:102A3000FC01738362830895FC01738F628F089594 +:102A4000FC01758F648F0895CF93DF93EC011DA275 +:102A50001FA21EA2BC01685D7F4F40EC88519F4FB2 +:102A60000E9461171B821A821D821C821F821E8295 +:102A7000198618861B861A861D861C861F861E864A +:102A8000198A188A1B8A1A8A1D8A1C8A1F8A1E8A1A +:102A9000198E188E1B8E1A8E1D8E1C8E1F8E1E8EEA +:102AA00019A218A2DF91CF910895CF92DF92FF92E1 +:102AB0000F931F93CF93DF931F92CDB7DEB7F62E00 +:102AC0006A018C0108511F4F08C0F60161916F0126 +:102AD000C80149830E94681749818C2D841B8F157A +:102AE000A0F30F90DF91CF911F910F91FF90DF9096 +:102AF000CF900895FC01718360830895FC0171A358 +:102B000060A30895AF92BF92CF92DF92EF92FF92AF +:102B10000F931F93CF93DF9300D01F92CDB7DEB7F3 +:102B20007C016B01142FB22EA02EDC0195968C91A6 +:102B300095978430F1F45A96ED91FC915B9730971C +:102B400009F4D8C0CB01019763E070E00E94762FB2 +:102B5000DB01AA0FBB1FA60FB71F49832A830B8374 +:102B60004C2D4A1B9E012F5F3F4FBD01C7010995A8 +:102B7000B1C06230710509F453C06330710529F0AA +:102B80006130710509F09CC083C0842F807F803A3A +:102B900001F130F48038B9F0803909F0ABC00DC0D4 +:102BA000803EE9F0803F09F1803B09F0A3C0D701E6 +:102BB0001296ED91FC91139723C0D7011496ED91D5 +:102BC000FC9115971DC0D7011696ED91FC911797B2 +:102BD00017C0D7011896ED91FC91199711C0D70134 +:102BE0001A96ED91FC911B970BC0423F09F082C0F1 +:102BF000D7011C96ED91FC911D97309731F47AC066 +:102C0000309709F477C0123F21F42A2D4B2D62EF43 +:102C100004C0612F6F702A2D4B2DC70109955AC032 +:102C2000842F807F803D59F0803F79F0803C09F00F +:102C300061C0D7011E96ED91FC911F9719C0D70175 +:102C40005096ED91FC91519713C0433F31F4D70159 +:102C50005296ED91FC91539708C0413F09F04AC04C +:102C6000D7015496ED91FC915597309741F442C0AD +:102C7000309709F43FC0133F11F0113F19F44B2D69 +:102C8000612F03C0612F6F704B2DC701099522C0C2 +:102C9000842F0E94BC14882331F0D7015696ED9101 +:102CA000FC91579707C0163F29F5D7015896ED912B +:102CB000FC9159973097F1F0612FC70109950AC02F +:102CC00064307105A8F416C00A2D2B2D412FB601D2 +:102CD000C7010995D7015E96ED91FC915F973097FA +:102CE00089F00A2D2B2D412FB601C70109950AC085 +:102CF000C12CD12CD7015C96ED91FC915D9730975A +:102D000019F7E8CF0F900F900F90DF91CF911F919F +:102D10000F91FF90EF90DF90CF90BF90AF9008950C +:102D2000EF92FF920F931F93CF93DF93EC01162F37 +:102D3000862F0E94BC14882369F0FDA081E08DA33A +:102D400000E020E0412F61E070E0CE010E9482159A +:102D5000FDA27CC0812F0E94B8144DA1882309F4E4 +:102D600040C0443029F01AA321E030E03FA32EA355 +:102D7000812F0E94C214813031F070F0823051F006 +:102D8000833059F507C08DA300E020E0412F61E0BA +:102D900070E01EC08DA35AC0103F19F0173FE9F430 +:102DA00004C084E08DA31AA33FC02EA13FA1C90196 +:102DB00063E070E00E94762F8C0F9D1FFC0112A330 +:102DC000B9016F5F7F4F7FA36EA30CA12BA14AA116 +:102DD000CE010E9482151DA239C01DA21FA21EA2F3 +:102DE00035C0442399F12EA13FA1C90163E070E0F1 +:102DF0000E94762F7C01FE01E80FF91F12A3B90192 +:102E00006F5F7F4F7FA36EA38130910591F082E0C9 +:102E1000E816F104D9F40CA12BA14AA1CE010E941D +:102E200082158DA1843091F081E090E09FA38EA364 +:102E30000DC0423059F400E02BA14AA1CE010E94FE +:102E400082158DA1843011F0FFA2EEA2DF91CF9107 +:102E50001F910F91FF90EF900895CF92DF92EF9224 +:102E6000FF920F931F93CF93DF93EC01E8A1F9A199 +:102E7000309709F009958E0108511F4FC8010E9433 +:102E80009A17E12CF12CC82ED12C0FC060E0C8019C +:102E90000E94AE17682FCE010E94901661E0C80113 +:102EA0000E94BF178FEFE81AF80AEC14FD0470F3C4 +:102EB000DF91CF911F910F91FF90EF90DF90CF9016 +:102EC0000895FC0142837483638311821082089504 +:102ED0000F931F93CF93DF93EC01062F0E94E0170F +:102EE000182F298130E0C90101966A8170E00E94A3 +:102EF0008A2F488150E08417950729F4812F0E947A +:102F0000E31780E012C0EB81FC81E20FF31F008326 +:102F10002981822F90E001966A8170E00E948A2FB9 +:102F20008983812F0E94E31781E0DF91CF911F9168 +:102F30000F910895CF93DF93EC010E94E017298150 +:102F40009881291710F0C22F02C0CA81C20FC91B75 +:102F50000E94E3178C2FDF91CF910895FC0120810F +:102F6000862F90E0820F911D628170E00E948A2F6F +:102F70000380F481E02DE80FF91F808108950F93FD +:102F80001F93CF93DF931F92CDB7DEB78C01698378 +:102F90000E94E017482FF80180816981262F30E0D8 +:102FA000280F311D6281C90170E00E948A2F808341 +:102FB000842F0F90DF91CF911F910F910C94E31705 +:102FC0008FB7F89408958FBF0895FC01CB0120912D +:102FD0006E032430B1F421812F702093E90040E08A +:102FE00050E064E070E00E94BA0F81110BC0909134 +:102FF000E80095FD07C09091E8009E779093E80067 +:10300000089582E0089520916E032430A9F4FC0114 +:1030100081818F708093E9003091F3002091F2005C +:10302000932F80E0822B892B49F08091E8008E77E6 +:103030008093E8000C946F1182E0089580E0089579 +:1030400020916E03243051F4FC0121812F702093D4 +:10305000E9002091E80020FD0C9403180895FC017C +:10306000CB0120916E03243011F080E00895268179 +:103070002F702093E9002091E80022FFF6CF2091E5 +:10308000E80025FFF2CF40E050E064E070E00E94ED +:1030900009108091E80085FD05C08091E8008B77DC +:1030A0008093E80081E0089590930F0280930E02D0 +:1030B000089580910E0290910F020895E0910E0202 +:1030C000F0910F02309721F00190F081E02D0994EA +:1030D00080E00895E0910E02F0910F02309721F008 +:1030E0000280F381E02D09940895E0910E02F091A1 +:1030F0000F02309721F00480F581E02D09940895A6 +:1031000020911002309111028217930771F0909371 +:10311000110280931002E0910E02F0910F0230979D +:1031200021F00680F781E02D099408952091120284 +:10313000309113028217930771F0909313028093DA +:103140001202E0910E02F0910F02309721F00084FC +:10315000F185E02D099408950E94B6240E948D0502 +:103160000E948A250C945F2B0C94CE075F926F927D +:103170007F928F929F92AF92BF92CF92DF92EF9207 +:10318000FF920F931F93CF93DF93CDB7DEB72A97AC +:103190000FB6F894DEBF0FBECDBF0E947E0694E14D +:1031A000C92E92E0D92E00E010E0AA24A394B12CFD +:1031B000502E802F0E94C4073C01F601E190F1904F +:1031C0006F01E826F926E114F10431F40F5F1F4F77 +:1031D0000430110569F73AC08091680281FD0E94B0 +:1031E000CD0720E030E04501022E02C0880C991C7A +:1031F0000A94E2F7C4018E219F21892B09F12E83C5 +:103200005F826820792081E0672809F480E0888760 +:103210000E94BF248160782F9A8789874E815F81C1 +:1032200068858A850E946F19F801EE0FFF1FEC5E1A +:10323000FD4F80819181882599259183808316C0D7 +:103240002F5F3F4F2C30310571F6C0CF8FEF898350 +:103250008A831B820E94BF248160782F9D838C8388 +:1032600049815A816B818D810E946F190E94772854 +:1032700010911C020E945E181817D9F00E945E1867 +:1032800080931C022A960FB6F894DEBF0FBECDBF06 +:10329000DF91CF911F910F91FF90EF90DF90CF9032 +:1032A000BF90AF909F908F907F906F905F900C94A5 +:1032B000B4182A960FB6F894DEBF0FBECDBFDF91CB +:1032C000CF911F910F91FF90EF90DF90CF90BF9023 +:1032D000AF909F908F907F906F905F900895CF9365 +:1032E000DF93CDB7DEB72B970FB6F894DEBF0FBED6 +:1032F000CDBF4F83588769877A878B87DE01119608 +:1033000086E0FD0111928A95E9F785E0FE01379686 +:1033100001900D928A95E1F749815A816B817C81F8 +:103320008D819E810E9447212B960FB6F894DEBFB7 +:103330000FBECDBFDF91CF910895CF93C82F8823C3 +:1033400009F4C1C0823859F40E945E1881FDBBC0E7 +:1033500089E30E94AC230E94282489E30CC08338AF +:1033600079F40E945E1880FDAEC083E50E94AC2314 +:103370000E94282483E50E94CE23CF910C94282418 +:10338000843859F40E945E1882FD9DC087E40E9433 +:10339000AC230E94282487E4EECF8450813A48F47D +:1033A0008C2F0E94C72A81118EC08C2F0E94AC23C3 +:1033B000E4CF8C2F805E883050F4C77081E090E0BD +:1033C00001C0880FCA95EAF70E94EF23D6CF8C2F51 +:1033D000855A833078F4C53A29F0C63A31F482E848 +:1033E00090E005C081E890E002C083E890E0CF91D2 +:1033F0000C9480188C2F885A833108F064C0C83A26 +:1034000039F1C93A41F1CA3A49F1CB3A51F1CC3AD2 +:1034100059F1CD3A61F1C03B69F1CE3A71F1CF3A41 +:1034200079F1C13B81F1C23B89F1C33B91F1C43BCE +:1034300099F1C53BA1F1C63BA9F1C73BB1F1C83B2E +:10344000B9F1C93BC1F1CA3BC9F58AE292E038C083 +:1034500082EE90E035C089EE90E032C08AEE90E0D6 +:103460002FC085EB90E02CC086EB90E029C087EB65 +:1034700090E026C08CEC90E023C08DEC90E020C062 +:1034800083E891E01DC08AE891E01AC082E991E0EA +:1034900017C084E991E014C081E292E011C083E298 +:1034A00092E00EC084E292E00BC085E292E008C098 +:1034B00086E292E005C087E292E002C080E090E000 +:1034C000CF910C949618CF910895882309F44DC09C +:1034D000823859F40E945E1881FF47C089E30E9438 +:1034E000AC230E94282489E30CC0833871F40E9425 +:1034F0005E1880FF3AC083E50E94AC230E94282416 +:1035000083E50E94CE230C942824843859F40E9429 +:103510005E1882FF2AC087E40E94AC230E94282400 +:1035200087E4EFCF982F9450913A08F4EACF982F80 +:10353000905E983058F4282F277081E090E001C009 +:10354000880F2A95EAF70E94F523DDCF982F955A28 +:10355000933020F480E090E00C948018885A8331F6 +:1035600020F480E090E00C9496180895882321F0D0 +:103570000E94EF230C9428240895882321F00E94B0 +:10358000F5230C9428240895BF92CF92DF92EF92F6 +:10359000FF920F931F93CF93DF93CDB7DEB727979B +:1035A0000FB6F894DEBF0FBECDBF8C0185E0F801E9 +:1035B000DE01119601900D928A95E1F7F8013081B4 +:1035C0002181F280558152955F7083819481892B8E +:1035D00039F02F3F41F481E090E03F3F31F003C0EC +:1035E00081E090E002C080E090E080FD73C3398309 +:1035F0002A8389819A815E830E946923B92E8F83F1 +:103600000E9468230E9490222B2D22952F7030E07B +:103610005E816F812530310509F4E6C06CF42430F9 +:1036200031050CF0A2C04B2D407F8B2D8F702230C6 +:1036300031050CF045C017C02C3031054CF42A3050 +:1036400031050CF0E7C12830310509F043C3E5C06E +:103650002D30310509F4BAC20CF4A2C22F30310565 +:1036600009F038C323C3182F411101C002C01295BD +:10367000107FFF2059F0112309F46BC2812F6F8353 +:103680000E94FF230E9428246F8163C2862F0E941C +:10369000651A112309F41EC3812F0E940524279661 +:1036A0000FB6F894DEBF0FBECDBFDF91CF911F9153 +:1036B0000F91FF90EF90DF90CF90BF900C94282453 +:1036C000403211F08295807F662319F0613071F5E8 +:1036D00023C0FF20B1F0511101C032C0513081F53B +:1036E00027960FB6F894DEBF0FBECDBFDF91CF9106 +:1036F0001F910F91FF90EF90DF90CF90BF900C94AF +:103700000F24511101C003C0513009F4E3C28E836C +:103710000E9412248E819AC1FF2021F0563008F0B9 +:10372000D9C20EC0553008F0D5C290C1FF20C9F0F3 +:10373000552331F0F801958190FF0BC29F7095835E +:1037400027960FB6F894DEBF0FBECDBFDF91CF91A5 +:103750001F910F91FF90EF90DF90CF90BF900C944E +:10376000B61A552309F472C109C22B2D2695269548 +:10377000237030E02115310529F02130310509F0A1 +:10378000A9C219C0FF2021F0862F9B2D937002C083 +:1037900080E090E027960FB6F894DEBF0FBECDBF55 +:1037A000DF91CF911F910F91FF90EF90DF90CF901D +:1037B000BF900C948018FF2021F0862F9B2D9370D2 +:1037C00002C080E090E027960FB6F894DEBF0FBEEF +:1037D000CDBFDF91CF911F910F91FF90EF90DF90C0 +:1037E000CF90BF900C949618862FFF2019F00E945E +:1037F0007D2702C00E94E52727960FB6F894DEBF0A +:103800000FBECDBFDF91CF911F910F91FF90EF9031 +:10381000DF90CF90BF900C946C288B2D837009F0B3 +:1038200079C0F11057C2262F229526952770220FB6 +:10383000220F862F8F70C82ED12CE12CF12C022E56 +:1038400004C0CC0CDD1CEE1CFF1C0A94D2F764FFF4 +:1038500010C06FE070E080E090E004C0660F771F5A +:10386000881F991F2A95D2F760957095809590953D +:1038700003C060E070E0CB012B2D269526952370C8 +:10388000422F50E042305105D9F04330510569F1E3 +:103890006C297D298E299F294130510551F12796A8 +:1038A0000FB6F894DEBF0FBECDBFDF91CF911F9151 +:1038B0000F91FF90EF90DF90CF90BF900C94A522D6 +:1038C0006C297D298E299F2927960FB6F894DEBF93 +:1038D0000FBECDBFDF91CF911F910F91FF90EF9061 +:1038E000DF90CF90BF900C94B7220E94A522C70111 +:1038F000B60127960FB6F894DEBF0FBECDBFDF919D +:10390000CF911F910F91FF90EF90DF90CF90BF90DC +:103910000C949322FF2019F08B2D817001C08695A5 +:10392000882309F4D7C1262F229526952770220FC8 +:10393000220F862F8F70C82ED12CE12CF12C022E55 +:1039400004C0CC0CDD1CEE1CFF1C0A94D2F764FFF3 +:1039500010C06FE070E080E090E004C0660F771F59 +:10396000881F991F2A95D2F760957095809590953C +:1039700003C060E070E0CB012B2D269526952370C7 +:10398000422F50E042305105D9F04330510569F1E2 +:103990006C297D298E299F294130510551F12796A7 +:1039A0000FB6F894DEBF0FBECDBFDF91CF911F9150 +:1039B0000F91FF90EF90DF90CF90BF900C94442335 +:1039C0006C297D298E299F2927960FB6F894DEBF92 +:1039D0000FBECDBFDF91CF911F910F91FF90EF9060 +:1039E000DF90CF90BF900C9456230E944423C701D0 +:1039F000B60127960FB6F894DEBF0FBECDBFDF919C +:103A0000CF911F910F91FF90EF90DF90CF90BF90DB +:103A10000C943223603F59F120F4603E08F494C0C6 +:103A200008C0623F09F467C0F0F1633F09F08CC041 +:103A300065C0162F1F708B2D8F71FF2021F00E9403 +:103A4000DD22812F7DCE0E94F822812F27960FB68E +:103A5000F894DEBF0FBECDBFDF91CF911F910F91C4 +:103A6000FF90EF90DF90CF90BF900C94BD1AFF2095 +:103A7000B1F0553008F02EC18B2D8F7127960FB6FF +:103A8000F894DEBF0FBECDBFDF91CF911F910F9194 +:103A9000FF90EF90DF90CF90BF900C94172356309B +:103AA00008F018C1E9CFFF2099F08B2D8F71279670 +:103AB0000FB6F894DEBF0FBECDBFDF91CF911F913F +:103AC0000F91FF90EF90DF90CF90BF900C94DD228C +:103AD0008B2D8F7127960FB6F894DEBF0FBECDBF2A +:103AE000DF91CF911F910F91FF90EF90DF90CF90DA +:103AF000BF900C94F822F110EBCFD7CFFF2099F0B4 +:103B00008B2D8F7127960FB6F894DEBF0FBECDBFF9 +:103B1000DF91CF911F910F91FF90EF90DF90CF90A9 +:103B2000BF900C94CE2227960FB6F894DEBF0FBE3E +:103B3000CDBFDF91CF911F910F91FF90EF90DF905C +:103B4000CF90BF900C94C922FF20A9F0552309F40F +:103B5000ACCF862F27960FB6F894DEBF0FBECDBF31 +:103B6000DF91CF911F910F91FF90EF90DF90CF9059 +:103B7000BF900C949D19552309F4AACF862F279640 +:103B80000FB6F894DEBF0FBECDBFDF91CF911F916E +:103B90000F91FF90EF90DF90CF90BF900C94651A3B +:103BA0004B2D4F70C8010E94E50227960FB6F8947E +:103BB000DEBF0FBECDBFDF91CF911F910F91FF9060 +:103BC000EF90DF90CF90BF900C94FD21F11082C058 +:103BD0009B2D9F70492F50E04230510599F144F4DC +:103BE0004115510569F04130510509F073C019C004 +:103BF00043305105C1F14430510509F06BC044C058 +:103C000027960FB6F894DEBF0FBECDBFDF91CF91E0 +:103C10001F910F91FF90EF90DF90CF90BF900C9489 +:103C2000702B27960FB6F894DEBF0FBECDBFDF9185 +:103C3000CF911F910F91FF90EF90DF90CF90BF90A9 +:103C40000C94872B27960FB6F894DEBF0FBECDBF1E +:103C5000DF91CF911F910F91FF90EF90DF90CF9068 +:103C6000BF900C94A32B27960FB6F894DEBF0FBE1F +:103C7000CDBFDF91CF911F910F91FF90EF90DF901B +:103C8000CF90BF900C94B62B862F27960FB6F89442 +:103C9000DEBF0FBECDBFDF91CF911F910F91FF907F +:103CA000EF90DF90CF90BF900C94DA2B4B2D4F709C +:103CB000C80127960FB6F894DEBF0FBECDBFDF91C7 +:103CC000CF911F910F91FF90EF90DF90CF90BF9019 +:103CD0000C940E0827960FB6F894DEBF0FBECDBF2A +:103CE000DF91CF911F910F91FF90EF90DF90CF90D8 +:103CF000BF9008950E940C240E94E1230E94282472 +:103D00000E9418290E946C2880E090E00E94801890 +:103D100080E090E00C9496180E94FC230C947A1E8C +:103D20000E946923292F22952F7030E02C30310515 +:103D30004CF42A3031056CF422503109223031051F +:103D400070F407C02C30310531F02F30310539F4D3 +:103D500002C081E0089593FB882780F9089580E0F0 +:103D60000895CF93DF9300D000D01F92CDB7DEB778 +:103D70000F900F900F900F900F90DF91CF910895BB +:103D8000CF93DF9300D000D000D0CDB7DEB726961A +:103D90000FB6F894DEBF0FBECDBFDF91CF9108956F +:103DA0001F93CF93DF93C091530216E012C0D0E06F +:103DB0001C9FF0011D9FF00D1124ED5DFD4F408112 +:103DC000518162817381848195810E94C01E2196F8 +:103DD000C77080915402C813EACFDF91CF911F9131 +:103DE000089540911D0250911E0260911F02709132 +:103DF000200280912102909122020C94C01E0F9308 +:103E00001F93CF93DF938091220282958F7009F0E8 +:103E100069C080911F02882309F464C0A0915302F5 +:103E2000D0915402B0911D02C0911E0280912002D7 +:103E30009091210221E030E0BF3F11F020E030E01E +:103E4000122FBC016095709506E04AC0009721F0E2 +:103E5000CF3F29F4212F05C021E030E002C020E04F +:103E600030E020FD3BC04A2F50E0049FF001059F49 +:103E7000F00D1124ED5DFD4F2181C2132FC0208173 +:103E8000B2132CC02281211129C02381348128172B +:103E9000390718F0281B390B02C0260F371F283CA2 +:103EA0003105E0F4809122028F70806180932202BC +:103EB00086E0849FF001859FF00D1124E85DFD4FA1 +:103EC00080818F70806180838DE192E00E94C41AAE +:103ED000DF91CF911F910F910C94D01EAF5FA7700F +:103EE000AD13B4CFDF91CF911F910F910895EF9251 +:103EF000FF920F931F93CF93DF93CDB7DEB76297F7 +:103F00000FB6F894DEBF0FBECDBF8C0185E0F8017F +:103F1000DE011D9601900D928A95E1F7D8014C9132 +:103F200011965C91119712966C9112971396ED90E1 +:103F3000FC90149770911D02E0911E028091200266 +:103F400090912102009739F0EF3F41F421E030E0F9 +:103F50007F3F31F003C021E030E002C020E030E0DC +:103F600020FD5CC120911F02222309F4F1C0E81654 +:103F7000F90628F09701281B390BC90104C0809568 +:103F800090958E0D9F1D883C910508F098C08091FA +:103F90002202982F907F09F064C0E51314C07413B7 +:103FA00012C0611110C08F708061809322020E9444 +:103FB000F11E8DE192E00E94C41A80912202D80184 +:103FC00015968C9343C1EF2839F05F3F41F481E0AF +:103FD00090E04F3F31F003C081E090E002C080E00C +:103FE00090E080FD03C081E0862702C080E090E081 +:103FF00080FF2EC0809153022091540236E013C0FE +:1040000090E0389FF001399FF00D1124ED5DFD4FD8 +:104010007181571306C07081471303C07281671303 +:1040200017C0019687708213EBCF12C19F7059F0B1 +:10403000882309F40BC107C09F7029F0F80195810E +:10404000907F09F403C1805E883008F4FFC0D2C0BD +:10405000662309F4FBC080912202816080932202D2 +:10406000F5C0E51308C0741306C0611104C0D8017F +:1040700015968C939DC04D875E878D859E856A8B36 +:104080000E94901E6A89882309F4B4C0662309F44B +:10409000B1C020912202822F82958F7090E002970A +:1040A0000CF4C6C080911D0290911E0298878F83E8 +:1040B0001986FB86EA862C87CE01079646C080913A +:1040C0002202982F907F59F47E2DF98AE88A8989F7 +:1040D0000E94B11E8DE192E00E94C41A95C0E513C2 +:1040E00011C074130FC061110DC0F8018583C801A0 +:1040F0000E94C41AEDE1F2E086E0DF011D928A958C +:10410000E9F7A2C04D875E878D859E856A8B0E94E8 +:10411000901E6A89882309F46DC0662309F46AC079 +:1041200020912202822F82958F7090E002970CF4EA +:104130007FC080911D0290911E029A8389831B8209 +:10414000FD82EC822E83CE0101960E94C41A70C0BB +:10415000E816F90628F09701281B390BC90104C09D +:10416000809590958E0D9F1D883C910508F046C066 +:10417000662309F43FC0E51330C074132EC02091AC +:10418000220220FD21C0322F32953F70832F90E014 +:104190000097D1F0D80115962C9315970F9741F001 +:1041A000832F8F5F8295807F2F70282B15962C93FD +:1041B000C8010E94C41A86E0F801ADE1B2E00190A6 +:1041C0000D928A95E1F73EC086E0F801ADE1B2E0DC +:1041D00001900D928A95E1F737C04D875E878D85F6 +:1041E0009E850E94901E811123C0809122028160D1 +:1041F00080932202C8010E94C41A26C07E2DF98A2B +:10420000E88A89890E94B11EEDE1F2E086E0DF01D3 +:104210001D928A95E9F70E94F11E18C0662351F39A +:104220004D875E878D859E850E94901E882311F3A1 +:1042300086E0F801ADE1B2E001900D928A95E1F7D8 +:104240000E94FF1E0E94F11E81E014C080E012C097 +:104250004D875E878D859E850E946923292F229533 +:104260002F7030E0223031050CF4E0CE24303105DF +:104270000CF6E2CE62960FB6F894DEBF0FBECDBF4D +:10428000DF91CF911F910F91FF90EF9008951F93B1 +:10429000CF93DF93CDB7DEB72C970FB6F894DEBF80 +:1042A0000FBECDBF4F83588769877A878B879C87DE +:1042B000CE0107960E94771F8823D9F02F81388579 +:1042C0008A859B85892B39F03F3F19F080E090E08B +:1042D00004C02F3FD9F781E090E0892B09F06DC031 +:1042E0004F81588569857A858B859C850E94C01E83 +:1042F00064C086E0FE013796DE01119601900D92B2 +:104300008A95E1F7FF81E8854A855B85411551056E +:1043100039F0EF3F41F481E090E0FF3F31F003C01E +:1043200081E090E002C080E090E080FD46C02091F6 +:10433000540230E0C90101968770992760915302B9 +:1043400070E08617970709F440C0F983EA835D831C +:104350004C8396E0929FD001939FB00D1124AD5DE8 +:10436000BD4FFE01319601900D929A95E1F7809331 +:1043700054020E94D01E21C0189FC00111248D5DDF +:104380009D4F0E94771F882371F1E09153021E9F79 +:10439000F0011124ED5DFD4F4081518162817381F7 +:1043A000848195810E94C01E8091530290E0019605 +:1043B000877099278093530201C016E080915302C1 +:1043C000909154028913D8CF0EC00E948C1E109277 +:1043D000540210925302EDE1F2E086E0DF011D92FB +:1043E0008A95E9F7EACF2C960FB6F894DEBF0FBE98 +:1043F000CDBFDF91CF911F910895DF92EF92FF9291 +:104400000F931F93CF93DF93EC01009709F46CC0D7 +:10441000D12CEE24E394F12C8E010F5F1F4FFE018F +:104420008491843748F4843008F04AC0813071F0B8 +:10443000823009F059C01EC0853709F43DC070F1C3 +:10444000982F9458903708F04FC03DC02296F8013D +:104450008491982F905E983050F48770FE2D01C0A3 +:10446000FF0F8A95EAF78F2F0E94FF2330C00E942A +:104470009D192DC02296F8018491982F905E983056 +:1044800050F48770FE2D01C0FF0F8A95EAF78F2F39 +:104490000E9405241CC00E94651A19C02296F801CA +:1044A000049107C08FE99FE00197F1F700C0000079 +:1044B00001500111F7CF0BC02296F801D49007C02C +:1044C0000E949D1903C08F770E94651AE8018D2D07 +:1044D00007C08150EFE9FFE03197F1F700C000001D +:1044E000882309F499CFF5CFDF91CF911F910F91D8 +:1044F000FF90EF90DF9008956093590270935A02F5 +:1045000080935B0290935C020C947A1E6093550238 +:104510007093560280935702909358020C947A1E1F +:1045200008950C947C220F931F93009159021091CF +:104530005A0220915B0230915C02602B712B822B1E +:10454000932B1F910F910C947C220F931F9300913A +:10455000590210915A0220915B0230915C02602353 +:104560007123822393231F910F910C947C220F932C +:104570001F930091590210915A0220915B023091D1 +:104580005C0260277127822793271F910F910C945B +:104590007C2260E070E0CB010C94862241E050E088 +:1045A00060E070E004C0440F551F661F771F8A95B6 +:1045B000D2F7CB01BA010C94862241E050E060E0D2 +:1045C00070E004C0440F551F661F771F8A95D2F70D +:1045D0008091550290915602A0915702B0915802D5 +:1045E000482B592B6A2B7B2BCB01BA010C948622CA +:1045F00041E050E060E070E004C0440F551F661FCA +:10460000771F8A95D2F74095509560957095809167 +:10461000550290915602A0915702B091580248233A +:1046200059236A237B23CB01BA010C94862241E0F3 +:1046300050E060E070E004C0440F551F661F771F14 +:104640008A95D2F78091550290915602A091570217 +:10465000B0915802482759276A277B27CB01BA0116 +:104660000C9486220F931F930091550210915602CD +:104670002091570230915802602B712B822B932B83 +:104680001F910F910C9486220F931F930091550256 +:1046900010915602209157023091580260237123E5 +:1046A000822393231F910F910C9486220F931F93C3 +:1046B00000915502109156022091570230915802F4 +:1046C00060277127822793271F910F910C948622D0 +:1046D0000895CF92DF92EF92FF920F931F93CF93A3 +:1046E000DF93EC01C0905902D0905A02E0905B0237 +:1046F000F0905C028091550290915602A091570271 +:10470000B0915802C82AD92AEA2AFB2A0FE110E000 +:10471000B701A601002E04C0769567955795479579 +:104720000A94D2F740FF08C0BE01802F0E94E00328 +:104730008130910509F007C00150110948F7BE0109 +:1047400080E00E94E003DF91CF911F910F91FF90D5 +:10475000EF90DF90CF90089540911B0150911C0184 +:1047600020E030E09FEFFA01E20FF31F628168174B +:10477000A1F09F3F19F4611101C0922F2F5F3F4FAD +:104780002630310581F707C0FA01E90FF11D97FDC9 +:10479000FA95828308959F3FB9F7089540911B01D0 +:1047A00050911C0120E030E0FA01E20FF31F9281EA +:1047B000981301C012822F5F3F4F26303105A1F7B9 +:1047C000089581E090E0E0911B01F0911C01E80F59 +:1047D000F91F1082019688309105A9F708959091EC +:1047E0005D02982B90935D020895809590915D02F3 +:1047F000982390935D02089510925D020895909120 +:104800005E02982B90935E020895809590915E02CF +:10481000982390935E02089510925E02089580930B +:104820005F02089510925F02089540911B0150911C +:104830001C0120E030E080E0FA01E20FF31F9181DB +:1048400091118F5F2F5F3F4F27303105A9F70895F2 +:10485000E0911B01F0911C0180915D028083E09149 +:104860001B01F0911C01808190915E02892B808355 +:1048700090915F02992361F0E0911B01F0911C017E +:104880008081892B80830E94152481110E9412242B +:1048900080911B0190911C010C946A1880916E0309 +:1048A000843009F11092690220E488E190E00FB6AB +:1048B000F894A895809360000FBE2093600083B7A2 +:1048C000817F846083BF83B7816083BF789488953C +:1048D00083B78E7F83BF88E10FB6F8948093600022 +:1048E000109260000FBE0895CF930E94E3020E94D1 +:1048F0007E060E94E402C0E08C2F0E94C407892B30 +:1049000029F4CF5FC430C1F780E001C081E0CF91CE +:1049100008950E948C1E0C945F2B1F920F920FB66D +:104920000F9211248F939F93AF93BF93809169024D +:10493000811113C080916A0290916B02A0916C0268 +:10494000B0916D024196A11DB11D80936A029093B2 +:104950006B02A0936C02B0936D02BF91AF919F91D7 +:104960008F910F900FBE0F901F90189582E084BD1D +:1049700093E095BD9AEF97BD80936E0008958FB731 +:10498000F89440916A0250916B0260916C027091B0 +:104990006D028FBFCA010895CF92DF92EF92FF920E +:1049A0000F931F932FB7F89440916A0250916B02B6 +:1049B00060916C0270916D022FBF6A017B01EE2441 +:1049C000FF248C0120E030E0C016D106E206F30699 +:1049D00020F09A01281B390B05C09C0120953095C9 +:1049E000240F351FC9011F910F91FF90EF90DF90A9 +:1049F000CF9008951F920F920FB60F9211248F93AC +:104A00009F93AF93BF9380916A0290916B02A091A4 +:104A10006C02B0916D020196A11DB11D80936A02D6 +:104A200090936B02A0936C02B0936D02BF91AF9113 +:104A30009F918F910F900FBE0F901F9018950E941D +:104A4000A111F8942FEF87EA91E621508040904021 +:104A5000E1F700C0000087E090EBDC018093780371 +:104A600090937903A0937A03B0937B032CE088E1C1 +:104A700090E00FB6F894A895809360000FBE209345 +:104A80006000FFCFCF92DF92EF92FF920F931F93C0 +:104A9000CF93DF93C82ED12C01E010E08D2D0E9422 +:104AA000C4077C01C0E0D0E098010C2E02C0220FA8 +:104AB000331F0A94E2F72E213F21232B29F421965C +:104AC000CC30D10589F708C06C2F7D2D80E00E9485 +:104AD000BB03C812F4CF06C0D39484E0D812DECF53 +:104AE00080E001C081E0DF91CF911F910F91FF9095 +:104AF000EF90DF90CF900895CF93C82F8CE20E9463 +:104B00004225882321F08C2FCF910C94422580E000 +:104B1000CF910895CF930E94CD26811102C00E94AB +:104B2000AE26C5E608C00E947E068FE39CE9019789 +:104B3000F1F700C00000C150B1F789E20E947C2566 +:104B400081110AC18AE20E947C2581110E94AE2651 +:104B500085E00E947C2581110E941F250E94D82695 +:104B60008093680287E00E947C25882399F18BE17D +:104B70000E947C25882351F09091680291FB882740 +:104B800080F921E0822780FB91F922C08EE00E940B +:104B90007C25882351F09091680292FB882780F948 +:104BA00021E0822780FB92F913C080E10E947C25DE +:104BB00090916802882341F093FB882780F921E0D7 +:104BC000822780FB93F904C0892F809580FB90F9A0 +:104BD00090936802809168020E94DC260E94EA2677 +:104BE00080937B0280EE0E947C25882341F0809197 +:104BF0007B02982F909590FB80F980937B0289E34C +:104C00000E947C25882359F090917B0291FB882794 +:104C100080F921E0822780FB91F990937B0282EE5C +:104C20000E947C25882359F090917B0292FB882773 +:104C300080F921E0822780FB92F990937B0286EE37 +:104C40000E947C25882359F090917B0293FB882752 +:104C500080F921E0822780FB93F990937B0283EE19 +:104C60000E947C25882359F090917B0294FB882731 +:104C700080F921E0822780FB94F990937B0285E301 +:104C80000E947C25882359F090917B0295FB882710 +:104C900080F921E0822780FB95F990937B0281E3E4 +:104CA0000E947C25882359F090917B0296FB8827EF +:104CB00080F921E0822780FB96F990937B0281E1C5 +:104CC0000E947C25882359F090917B0297FB8827CE +:104CD00080F921E0822780FB97F990937B028091F5 +:104CE0007B020E94EE2687E20E947C25C82F8EE17F +:104CF0000E947C258111C2608FE10E947C25811178 +:104D0000C46080E20E947C258111C86081E20E941B +:104D10007C258111C06182E20E947C258111C062E4 +:104D200083E20E947C258111C06484E20E947C257C +:104D3000882311F0C06802C0CC2329F08C2F0E9478 +:104D4000E5266C2F03C00E94E126682F70E080E00A +:104D500090E0CF910C949122CF9108956DEE7EEF6B +:104D600080E090E00E94BA2F60E082E090E00E9434 +:104D7000AC2F60E083E090E00E94AC2F60E084E024 +:104D800090E00E94AC2F60E085E090E00E94AC2FA4 +:104D900060E086E090E00C94AC2F80E090E00E9410 +:104DA000A62F21E08D3E9E4F09F020E0822F08952E +:104DB00082E090E00C949E2F682F82E090E00C94AB +:104DC000AC2F83E090E00C949E2F682F83E090E05E +:104DD0000C94AC2F84E090E00C949E2F682F84E01C +:104DE00090E00C94AC2F86E090E00C949E2F682FFE +:104DF00086E090E00C94AC2F8091760280FF0BC08F +:104E00006091200185E0689FB00111247595679538 +:104E1000759567952AC081FF09C06091200185E0E2 +:104E2000689FB0011124759567951FC082FF07C068 +:104E30006091200185E0689FB001112416C0409167 +:104E400070024423C9F060911F01461788F7209132 +:104E5000200185E0289F90011124429FC001439FBB +:104E6000900D112470E00E948A2F6038710540F483 +:104E70006115710539F002C065E070E0862F089574 +:104E80008FE7089581E008958091760280FF08C041 +:104E900060911E0170E0759567957595679521C0C5 +:104EA00081FF06C060911E0170E07595679519C07D +:104EB00082FF04C060911E0170E010C080917002FA +:104EC0008823C1F060911D018617A0F790911E0103 +:104ED000989FC001112470E00E948A2F60387105EC +:104EE00028F46115710521F0862F08958FE7089544 +:104EF00081E0089561E070E0F4CF803F21F40E94EA +:104F0000FC26819504C0813F29F40E94FC268093F1 +:104F100073020895823F21F40E94FC26819504C00B +:104F2000833F29F40E94FC26809372020895893FF2 +:104F300019F40E94442705C08A3F31F40E94442797 +:104F400081958093740208958B3F21F40E94442739 +:104F5000819504C08C3F29F40E94442780937502F8 +:104F60000895843F21F480917102816017C0853FCC +:104F700021F480917102826011C0863F21F48091FA +:104F8000710284600BC0873F21F4809171028860B8 +:104F900005C0883F31F48091710280618093710275 +:104FA00008958D3F21F48091760281600BC08E3F81 +:104FB00021F480917602826005C08F3F29F48091B0 +:104FC00076028460809376020895803F29F4809170 +:104FD000730287FF6EC007C0813F41F48091730266 +:104FE00018160CF066C01092730263C090917202A2 +:104FF000823F19F497FF5DC005C0833F31F4191655 +:105000000CF057C01092720254C0893F31F4809165 +:10501000740218160CF04DC006C08A3F39F4809116 +:10502000740287FF46C01092740243C08B3F29F47C +:105030008091750287FF3DC006C08C3F39F4809196 +:1050400075021816B4F51092750233C0843F21F42E +:10505000809171028E7F05C0853F31F4809171028D +:105060008D7F8093710225C0863F21F4809171026B +:105070008B7FF7CF873F21F480917102877FF1CF3B +:10508000883F21F4809171028F7EEBCF8D3F21F418 +:10509000809176028E7F0BC08E3F21F48091760244 +:1050A0008D7F05C08F3F29F4809176028B7F80939E +:1050B00076028091720281110EC08091730281117B +:1050C0000AC080917402811106C08091750281111D +:1050D00002C010927002089581E792E00E94751854 +:1050E0000E94BF2490936F0280936E020895CF9325 +:1050F00080916E0290916F020E94CC2440917002C8 +:10510000442321F02091210130E006C020912201AA +:105110005AE0259F900111248217930708F486C056 +:105120008091720281110DC090917302911109C09A +:1051300090917402911105C090917502992309F420 +:1051400075C04F3F19F04F5F40937002181624F45A +:105150000E94FC26809372028091720287FF05C034 +:105160000E94FC268195809372028091730218162A +:1051700024F40E94FC26809373028091730287FFBF +:1051800005C00E94FC268195809373026091720293 +:10519000662339F1C0917302CC2319F1772767FD9B +:1051A0007095872F972F0E94FA2C23E333E343E374 +:1051B0005FE30E94AE2D0E94C72C609372026C2F99 +:1051C000772767FD7095872F972F0E94FA2C23E38E +:1051D00033E343E35FE30E94AE2D0E94C72C60934C +:1051E000730280917402181624F40E94442780935D +:1051F00074028091740287FF05C00E944427819544 +:105200008093740280917502181624F40E9444273A +:10521000809375028091750287FF05C00E94442724 +:10522000819580937502CF910C946C28CF9108954D +:10523000E1E7F2E085E0DF011D928A95E9F710923F +:105240007002109276020895833089F130F4813033 +:1052500061F0823009F06EC019C0853009F449C090 +:10526000B8F1863009F066C055C020912201862F22 +:1052700090E0820F911D8F3F910520F4620F6093A3 +:10528000220108958FEF809322010895209121013A +:10529000862F90E0820F911D8F3F910520F4620FC1 +:1052A0006093210108958FEF80932101089520914B +:1052B0002001862F90E0820F911D8F3F910520F4F1 +:1052C000620F6093200108958FEF8093200108956D +:1052D00020911F01862F90E0820F911D8F3F910535 +:1052E00020F4620F60931F0108958FEF80931F01D8 +:1052F000089520911E01862F90E0820F911D8F3F0F +:10530000910520F4620F60931E0108958FEF809342 +:105310001E01089520911D01862F90E0820F911D9E +:105320008F3F910520F4620F60931D0108958FEF68 +:1053300080931D010895833021F130F4813059F0BC +:10534000823009F049C012C0853089F128F18630D9 +:1053500009F042C037C080912201681720F4861BF3 +:1053600080932201089510922201089580912101D5 +:10537000681720F4861B8093210108951092210163 +:10538000089580912001681720F4861B80932001E6 +:10539000089510922001089580911F01681720F44C +:1053A000861B80931F01089510921F01089580911C +:1053B0001E01681720F4861B80931E010895109229 +:1053C0001E01089580911D01681720F4861B8093AB +:1053D0001D01089510921D01089541E050E060E024 +:1053E00070E004C0440F551F661F771F8A95D2F7DF +:1053F000CB01BA010E9491220C948C1E873208F5D1 +:105400008E3108F0B9C08E3009F47EC060F4873068 +:1054100009F465C018F4863059F549C0883051F157 +:105420008B3031F5AEC0883130F4863108F0A9C038 +:105430008031F1F473C0893109F4A3C08B31C1F418 +:1054400059C08933F1F068F4893209F493C018F433 +:10545000873271F48FC0853309F48CC0883341F4EE +:1054600090C0863409F46BC008F488C0883449F1D0 +:1054700080E008950E94D8260E94EA260E94F32622 +:1054800080C00E945918892B59F00E945918909396 +:105490007902809378020E948C1E80E090E004C024 +:1054A00080917802909179020E9454186AC080918C +:1054B0006802817F8E7F8093680281E0809377020B +:1054C00008950E948C1E2FEF83ED90E321508040C1 +:1054D0009040E1F700C000000E941F2552C080915B +:1054E000680280FF03C0817F8E7F01C0816080934E +:1054F000680247C09091680291FB882780F921E0FB +:10550000822780FB91F913C09091680292FB882753 +:1055100080F921E0822780FB92F909C0909168020E +:1055200093FB882780F921E0822780FB93F99093F1 +:105530006802882331F191609093680222C081E86B +:1055400090E00E9480182FEF81EE94E0215080407F +:105550009040E1F700C0000080E090E00E948018D9 +:105560002FEF89E698E1215080409040E1F700C09C +:10557000000007C080E003C08D5101C089530E9424 +:10558000ED2981E0089580E0089580E00895CF93AB +:10559000C82F80917702813071F020F0823009F0BD +:1055A00083C037C0A0911B01B0911C018C91823245 +:1055B00009F07CC007C0A0911B01B0911C018C9127 +:1055C000823249F48C2F0E94C32A81111EC08C2F75 +:1055D0000E94FE291CC08C2F0E94C52A811115C073 +:1055E000C43169F030F4CB3081F0C03109F062C0D1 +:1055F00009C0C93221F0C83309F05CC006C010925E +:10560000770258C082E08093770281E090E0817059 +:1056100054C0C932C1F060F4C431A9F020F4C730DD +:1056200009F046C02EC0CE51CA3008F041C011C0AA +:10563000CE3409F118F4CB34D9F517C0C13599F03F +:10564000C235B1F50EC010927A0281E080937702E4 +:1056500034C0EC2FF0E0E455FE4F808180937A0255 +:1056600027C061E003C061E007C06AE080917A0270 +:105670000E9424291DC06AE080917A020E949B2921 +:1056800017C08EE18093220182E3809321018AE09A +:105690008093200184E180931F0188E080931E01A4 +:1056A00088E280931D0104C01092770280E005C05B +:1056B00081E003C080E090E0AACFCF9108950E94DE +:1056C000CD26811102C00E94AE260E94F32680934F +:1056D000770380FF02C0869501C080E00C94DF074D +:1056E00080917703982F9695292F30E0233031054C +:1056F0004CF49F5F990F8170892B816080937703B1 +:105700000E94F7268091770386950C94DF0780919D +:105710007703982F969591F09158990F8170892B66 +:10572000809377038E7F91E009F490E08091770376 +:1057300090FB80F9809377030E94F726809177038E +:1057400086950C94DF0780917703982F909590FBB6 +:1057500080F9809377030E94F7268091770380FF7A +:1057600002C0869501C080E00C94DF07309177037A +:10577000232F26952F5F2F77822F90E0317004978B +:105780002CF4220F232B2093770302C0309377034E +:1057900080917703282F2E7F91E009F490E090FB11 +:1057A00080F9809377030E94F7268091770386958E +:1057B0000C94DF0720917703922F96959827990FE5 +:1057C000822F8170892B809377038E7F91E009F47B +:1057D00090E08091770390FB80F9809377030E949B +:1057E000F7268091770386950C94DF075058BB27E6 +:1057F000AA270ED075C166D130F06BD120F031F4FC +:105800009F3F11F41EF45BC10EF4E095E7FB51C11C +:10581000E92F77D180F3BA176207730784079507DA +:1058200018F071F49EF58FC10EF4E0950B2EBA2F8F +:10583000A02D0B01B90190010C01CA01A001112496 +:10584000FF27591B99F0593F50F4503E68F11A1642 +:10585000F040A22F232F342F4427585FF3CF4695D3 +:1058600037952795A795F0405395C9F77EF41F16F5 +:10587000BA0B620B730B840BBAF09150A1F0FF0FBF +:10588000BB1F661F771F881FC2F70EC0BA0F621FAB +:10589000731F841F48F4879577956795B795F7959B +:1058A0009E3F08F0B3CF9395880F08F09927EE0F2D +:1058B000979587950895D9D008F481E008950CD084 +:1058C0000FC107D140F0FED030F021F45F3F19F056 +:1058D000F0C0511139C1F3C014D198F39923C9F321 +:1058E0005523B1F3951B550BBB27AA2762177307E6 +:1058F000840738F09F5F5F4F220F331F441FAA1F9A +:10590000A9F333D00E2E3AF0E0E830D09150504059 +:10591000E695001CCAF729D0FE2F27D0660F771F07 +:10592000881FBB1F261737074807AB07B0E809F0E9 +:10593000BB0B802DBF01FF2793585F4F2AF09E3F7E +:10594000510568F0B6C000C15F3FECF3983EDCF350 +:10595000869577956795B795F7959F5FC9F7880FF7 +:10596000911D9695879597F90895E1E0660F771F49 +:10597000881FBB1F621773078407BA0720F0621BDA +:10598000730B840BBA0BEE1F88F7E095089504D0D3 +:105990006894B111D9C00895BCD088F09F5790F099 +:1059A000B92F9927B751A0F0D1F0660F771F881F44 +:1059B000991F1AF0BA95C9F712C0B13081F0C3D05F +:1059C000B1E00895C0C0672F782F8827B85F39F0FD +:1059D000B93FCCF3869577956795B395D9F73EF4A3 +:1059E00090958095709561957F4F8F4F9F4F08954B +:1059F000E89409C097FB3EF4909580957095619569 +:105A00007F4F8F4F9F4F9923A9F0F92F96E9BB271E +:105A10009395F695879577956795B795F111F8CF9A +:105A2000FAF4BB0F11F460FF1BC06F5F7F4F8F4F05 +:105A30009F4F16C0882311F096E911C0772321F0FB +:105A40009EE8872F762F05C0662371F096E8862F93 +:105A500070E060E02AF09A95660F771F881FDAF7EA +:105A6000880F9695879597F90895990F0008550F17 +:105A7000AA0BE0E8FEEF16161706E807F907C0F0D4 +:105A800012161306E407F50798F0621B730B840BDC +:105A9000950B39F40A2661F0232B242B252B21F4B6 +:105AA00008950A2609F4A140A6958FEF811D811D56 +:105AB000089597F99F6780E870E060E008959FEF90 +:105AC00080EC089500240A94161617061806090695 +:105AD000089500240A941216130614060506089564 +:105AE000092E0394000C11F4882352F0BB0F40F4EC +:105AF000BF2B11F460FF04C06F5F7F4F8F4F9F4F2C +:105B0000089557FD9058440F551F59F05F3F71F0AD +:105B10004795880F97FB991F61F09F3F79F0879514 +:105B20000895121613061406551FF2CF4695F1DF9D +:105B300008C0161617061806991FF1CF869571052D +:105B4000610508940895E894BB2766277727CB0161 +:105B500097F908958ADF08F48FEF08950BD0C0CF2E +:105B6000B1DF28F0B6DF18F0952309F0A2CFA7CF58 +:105B70001124EACFC6DFA0F3959FD1F3950F50E033 +:105B8000551F629FF001729FBB27F00DB11D639FEF +:105B9000AA27F00DB11DAA1F649F6627B00DA11D95 +:105BA000661F829F2227B00DA11D621F739FB00D3B +:105BB000A11D621F839FA00D611D221F749F3327AB +:105BC000A00D611D231F849F600D211D822F762F44 +:105BD0006A2F11249F5750408AF0E1F088234AF041 +:105BE000EE0FFF1FBB1F661F771F881F915050408D +:105BF000A9F79E3F510570F05CCFA6CF5F3FECF355 +:105C0000983EDCF3869577956795B795F795E79578 +:105C10009F5FC1F7FE2B880F911D9695879597F989 +:105C20000895FA01EE0FFF1F30962105310599F115 +:105C30006115710561F48038BFE39B0749F16894F1 +:105C40009038810561F08038BFEF9B0741F09923C0 +:105C500042F5FF3FE1053105210511F1E894089473 +:105C6000E795D901AA2329F4AB2FBE2FF85FD0F313 +:105C700010C0FF5F70F4A695E0F7F73950F019F007 +:105C8000FF3A38F49F779F930CD00F9007FC905801 +:105C900008953EF014CF60E070E080E89FE308953F +:105CA0004FE79F775F934F933F932F939ED02F9112 +:105CB0003F914F915F9152DF05C019F40EF0F9CE7C +:105CC00042CFFDCE26DFC8F39638C0F707F80F9213 +:105CD000E8942BE33AEA48EB5FE74EDF0F920F922E +:105CE0000F924DB75EB70F92C0D0ECEAF0E016D03D +:105CF0004F915F91EF91FF91E595EE1FFF1F49F0E6 +:105D0000FE57E0684427EE0F441FFA95E1F74195EE +:105D1000550B32D00F9007FE26C00895DF93CF9326 +:105D20001F930F93FF92EF92DF927B018C01689497 +:105D300005C0DA2EEF011EDFFE01E894A591259142 +:105D4000359145915591AEF3EF0162DDFE0197016A +:105D5000A801DA9479F7DF90EF90FF900F911F91EF +:105D6000CF91DF9108959B01AC0160E070E080E885 +:105D70009FE3A5CD9ECEACC0CCDEE8F39923D9F34A +:105D8000940F511DBBF39150504094F059F088236B +:105D900032F0660F771F881F91505040C1F79E3F29 +:105DA000510544F7880F911D9695879597F90895A9 +:105DB0005F3FACF0983E9CF0BB2786957795679542 +:105DC000B79508F4B1609395C1F7BB0F58F711F47C +:105DD00060FFE8CF6F5F7F4F8F4F9F4FE3CFB4CE11 +:105DE0000EF076C06CCE689464CE93DEC8F399232F +:105DF000D1F3C6F3DF93CF931F930F93FF92C92F75 +:105E0000DD2788232AF02197660F771F881FDAF78E +:105E100020E030E040E85FEB9FE3883920F0803EEF +:105E200030F021968F77E3DCE4EDF0E003C0DFDCB7 +:105E3000E1E0F1E073DF8B01BE01EC01FB2E6F5757 +:105E400071097595771F880B990BD4DD28E132E72E +:105E500041E35FE38FDEAF2D9801AE01FF900F911C +:105E60001F91CF91DF91D4DC3BCEFA01DC01AA0F68 +:105E7000BB1F9B01AC01BF5728F4222733274427BF +:105E800050781FC0B75188F4AB2F00244695379542 +:105E90002795011CA395D2F3002069F0220F331F30 +:105EA000441FB395DAF30DD0A1CC61307105A0E8A1 +:105EB0008A07B94630F49B01AC016627772788270B +:105EC0009078309621F02083318342835383089564 +:105ED0009F3F31F0915020F4879577956795B7955E +:105EE000880F911D9695879597F90895AA1BBB1B5E +:105EF00051E107C0AA1FBB1FA617B70710F0A61BCA +:105F0000B70B881F991F5A95A9F780959095BC01EA +:105F1000CD01089597FB072E16F4009407D077FD66 +:105F200009D00E94762F07FC05D03EF4909581950C +:105F30009F4F0895709561957F4F0895F999FECF11 +:105F400092BD81BDF89A992780B50895A8E1B0E087 +:105F500042E050E00C94C12F262FF999FECF1FBAD2 +:105F600092BD81BD20BD0FB6F894FA9AF99A0FBE82 +:105F7000019608950E94AC2F272F0C94AD2FDC01C1 +:105F8000CB01FC01F999FECF06C0F2BDE1BDF89A44 +:105F9000319600B40D9241505040B8F70895F894EE +:025FA000FFCF31 +:105FA2000507000C058540000001064000000100C5 +:105FB200D80B680C440C0F0CDB0B01600228081490 +:105FC2000A321E40004500250026006100600020C4 +:105FD2000037006400650066006700440046002444 +:105FE2000047000000020004000500070009000B42 +:105FF200000C000E0010001100130015001700180D +:10600200001A001C001D001F00210023002400268E +:1060120000280029002B002D002F00300032003410 +:10602200003500370039003B008803A103BA03D3CF +:1060320003FB04AE04780458043F4D3620020302E9 +:10604200000001000101010101000101010203043C +:0660520005060708090025 +:00000001FF diff --git a/keyboard/preonic/Makefile b/keyboard/preonic/Makefile index 40bd36aec..0145e44bc 100644 --- a/keyboard/preonic/Makefile +++ b/keyboard/preonic/Makefile @@ -127,7 +127,8 @@ MIDI_ENABLE = yes # MIDI controls BACKLIGHT_ENABLE = yes ifdef MIDI_ENABLE - SRC += keymap_midi.c + SRC += keymap_midi.c \ + beeps.c endif # Optimize size but this may cause error "relocation truncated to fit" diff --git a/keyboard/preonic/beeps.c b/keyboard/preonic/beeps.c index 13e46e1da..8ffd70f41 100644 --- a/keyboard/preonic/beeps.c +++ b/keyboard/preonic/beeps.c @@ -5,31 +5,6 @@ #include #define PI 3.14159265 -#define CHANNEL OCR1C - -volatile uint16_t sample; -uint16_t lastSample; - -const int sounddata_length=200; - -const unsigned char sounddata_data[] PROGMEM = {128, -128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, -128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, -128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, -128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, -128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, -128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, -128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, -128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, -128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, -128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 129, 127, 129, 128, 127, 133, -117, 109, 125, 121, 116, 132, 140, 126, 114, 114, 116, 120, 114, 93, 73, 66, 76, 116, 142, 129, -128, 129, 120, 119, 118, 104, 87, 123, 181, 194, 196, 198, 189, 176, 160, 162, 172, 164, 164, 183, -197, 188, 168, 167, 170, 165, 185, 209, 206, 196, 196, 199, 185, 162, 156, 167, 176, 173, 170, 166, -151, 142, 140, 134, 130, 127, 113, 86, 67, 66, 69, 75, 73, 75, 86, 90, 91, 84, 65, 48, -41, 30, 26, 56, 91, 88, 72, 70, 73, 82, 89, 73, 57, 60, 74, 89, 92, 77, 63, 60, -53, 47, 56, 64, 63, 61, 56, 54, 52, 36, 16, 22, 51, 66, 67, 70, 76, 88, 99, 92, -77, 74, 85, 100, 106, 97, 83, 85, 96, 108, 133, 160, 164}; void delay_us(int count) { while(count--) { @@ -37,202 +12,235 @@ void delay_us(int count) { } } -void beeps() { - // DDRB |= (1<<7); - // PORTB &= ~(1<<7); - - // // Use full 16-bit resolution. - // ICR1 = 0xFFFF; - - // // I could write a wall of text here to explain... but TL;DW - // // Go read the ATmega32u4 datasheet. - // // And this: http://blog.saikoled.com/post/43165849837/secret-konami-cheat-code-to-high-resolution-pwm-on - - // // Pin PB7 = OCR1C (Timer 1, Channel C) - // // Compare Output Mode = Clear on compare match, Channel C = COM1C1=1 COM1C0=0 - // // (i.e. start high, go low when counter matches.) - // // WGM Mode 14 (Fast PWM) = WGM13=1 WGM12=1 WGM11=1 WGM10=0 - // // Clock Select = clk/1 (no prescaling) = CS12=0 CS11=0 CS10=1 - - // TCCR1A = _BV(COM1C1) | _BV(WGM11); // = 0b00001010; - // TCCR1B = _BV(WGM13) | _BV(WGM12) | _BV(CS10); // = 0b00011001; - - - // // Turn off PWM control on PB7, revert to output low. - // // TCCR1A &= ~(_BV(COM1C1)); - // // CHANNEL = ((1 << level) - 1); - - // // Turn on PWM control of PB7 - // TCCR1A |= _BV(COM1C1); - // // CHANNEL = level << OFFSET | 0x0FFF; - // // CHANNEL = 0b1010101010101010; - - // float x = 12; - // float y = 24; - // float length = 50; - // float scale = 1; - - // // int f1 = 1000000/440; - // // int f2 = 1000000/880; - // // for (uint32_t i = 0; i < length * 1000; i++) { - // // // int frequency = 1/((sin(PI*2*i*scale*pow(2, x/12.0))*.5+1 + sin(PI*2*i*scale*pow(2, y/12.0))*.5+1) / 2); - - // // ICR1 = f1; // Set max to the period - // // OCR1C = f1 >> 1; // Set compare to half the period - // // // _delay_us(10); - // // } - // int frequency = 1000000/440; - // ICR1 = frequency; // Set max to the period - // OCR1C = frequency >> 1; // Set compare to half the period - // _delay_us(500000); - - // TCCR1A &= ~(_BV(COM1C1)); - // CHANNEL = 0; -play_notes(); - - - // play_note(55*pow(2, 0/12.0), 1); - // play_note(55*pow(2, 12/12.0), 1); - // play_note(55*pow(2, 24/12.0), 1); - // play_note(55*pow(2, 0/12.0), 1); - // play_note(55*pow(2, 12/12.0), 1); - // play_note(55*pow(2, 24/12.0), 1); - - // play_note(0, 4); - - // play_note(55*pow(2, 0/12.0), 8); - // play_note(55*pow(2, 12/12.0), 4); - // play_note(55*pow(2, 10/12.0), 4); - // play_note(55*pow(2, 12/12.0), 8); - // play_note(55*pow(2, 10/12.0), 4); - // play_note(55*pow(2, 7/12.0), 2); - // play_note(55*pow(2, 8/12.0), 2); - // play_note(55*pow(2, 7/12.0), 16); - // play_note(0, 4); - // play_note(55*pow(2, 3/12.0), 8); - // play_note(55*pow(2, 5/12.0), 4); - // play_note(55*pow(2, 7/12.0), 4); - // play_note(55*pow(2, 7/12.0), 8); - // play_note(55*pow(2, 5/12.0), 4); - // play_note(55*pow(2, 3/12.0), 4); - // play_note(55*pow(2, 2/12.0), 16); +int voices = 0; +double frequency = 0; +int volume = 0; +int position = 0; + +double frequencies[8] = {0, 0, 0, 0, 0, 0, 0, 0}; +int volumes[8] = {0, 0, 0, 0, 0, 0, 0, 0}; +bool sliding = false; +#define RANGE 1000 +volatile int i=0; //elements of the wave +void beeps() { + play_notes(); } -void play_note(float freq, int length) { - DDRB |= (1<<7); - PORTB &= ~(1<<7); +void send_freq(double freq, int vol) { + int duty = (((double)F_CPU) / freq); + ICR3 = duty; // Set max to the period + OCR3A = duty >> (0x10 - vol); // Set compare to half the period +} - if (freq > 0) { - int frequency = 1000000/freq; - ICR1 = frequency; // Set max to the period - OCR1C = frequency >> 1; // Set compare to half the period +void stop_all_notes() { + voices = 0; + TCCR3A = 0; + TCCR3B = 0; + frequency = 0; + volume = 0; - TCCR1A = _BV(COM1C1) | _BV(WGM11); // = 0b00001010; - TCCR1B = _BV(WGM13) | _BV(WGM12) | _BV(CS10); // = 0b00011001; + for (int i = 0; i < 8; i++) { + frequencies[i] = 0; + volumes[i] = 0; } - - for (int i = 0; i < length; i++) { - _delay_us(50000); - } - - TCCR1A &= ~(_BV(COM1C1)); } -// This is called at 8000 Hz to load the next sample. -ISR(TIMER1_COMPA_vect) { - if (sample >= sounddata_length) { - if (sample == sounddata_length + lastSample) { - TIMSK1 &= ~_BV(OCIE1A); - - // Disable the per-sample timer completely. - TCCR1B &= ~_BV(CS10); - } - else { - OCR1C = sounddata_length + lastSample - sample; +void stop_note(double freq) { + for (int i = 7; i >= 0; i--) { + if (frequencies[i] == freq) { + frequencies[i] = 0; + volumes[i] = 0; + for (int j = i; (j < 7); j++) { + frequencies[j] = frequencies[j+1]; + frequencies[j+1] = 0; + volumes[j] = volumes[j+1]; + volumes[j+1] = 0; + } } } - else { - OCR1C = pgm_read_byte(&sounddata_data[sample]); + voices--; + if (voices < 0) + voices = 0; + if (voices == 0) { + TCCR3A = 0; + TCCR3B = 0; + frequency = 0; + volume = 0; + } else { + double freq = frequencies[voices - 1]; + int vol = volumes[voices - 1]; + if (frequency < freq) { + sliding = true; + for (double f = frequency; f <= freq; f += ((freq - frequency) / 500.0)) { + send_freq(f, vol); + } + sliding = false; + } else if (frequency > freq) { + sliding = true; + for (double f = frequency; f >= freq; f -= ((frequency - freq) / 500.0)) { + send_freq(f, vol); + } + sliding = false; + } + send_freq(freq, vol); + frequency = freq; + volume = vol; } - - ++sample; } -void play_notes() { +void init_notes() { + // TCCR1A = (1 << COM1A1) | (0 << COM1A0) | (1 << WGM11) | (1 << WGM10); + // TCCR1B = (1 << COM1B1) | (0 << COM1A0) | (1 << WGM13) | (1 << WGM12) | (0 << CS12) | (0 << CS11) | (1 << CS10); + // DDRC |= (1<<6); - // Set up Timer 2 to do pulse width modulation on the speaker - // pin. + // TCCR3A = (1 << COM3A1) | (0 << COM3A0) | (1 << WGM31) | (0 << WGM30); + // TCCR3B = (1 << WGM33) | (1 << WGM32) | (0 << CS32) | (0 << CS31) | (1 << CS30); - DDRB |= (1<<7); - PORTB &= ~(1<<7); + // ICR3 = 0xFFFF; + // OCR3A = (int)((float)wave[i]*ICR3/RANGE); //go to next array element - // Use internal clock (datasheet p.160) - // ASSR &= ~(_BV(EXCLK) | _BV(AS2)); - // Set fast PWM mode (p.157) - TCCR1A |= _BV(WGM21) | _BV(WGM20); - TCCR1B &= ~_BV(WGM22); + // cli(); - // Do non-inverting PWM on pin OC2A (p.155) - // On the Arduino this is pin 11. - TCCR1A = (TCCR2A | _BV(COM2A1)) & ~_BV(COM2A0); - TCCR1A &= ~(_BV(COM2B1) | _BV(COM2B0)); - // No prescaler (p.158) - TCCR1B = (TCCR1B & ~(_BV(CS12) | _BV(CS11))) | _BV(CS10); + // /* Enable interrupt on timer2 == 127, with clk/8 prescaler. At 16MHz, + // this gives a timer interrupt at 15625Hz. */ + // TIMSK3 = (1 << OCIE3A); - // Set initial pulse width to the first sample. - OCR1A = pgm_read_byte(&sounddata_data[0]); + // /* clear/reset timer on match */ + // // TCCR3A = 1<> 8) & 0x00FF) +// #define lowByte(c) (c & 0x00FF) + +ISR(TIMER3_COMPA_vect) { + + if (ICR3 > 0 && !sliding) { + switch (position) { + case 0: { + int duty = (((double)F_CPU) / (frequency)); + ICR3 = duty; // Set max to the period + OCR3A = duty >> 1; // Set compare to half the period + break; + } + case 1: { + int duty = (((double)F_CPU) / (frequency*2)); + ICR3 = duty; // Set max to the period + OCR3A = duty >> 1; // Set compare to half the period + break; + } + case 2: { + int duty = (((double)F_CPU) / (frequency*3)); + ICR3 = duty; // Set max to the period + OCR3A = duty >> 1; // Set compare to half the period + break; + } + } + position = (position + 1) % 3; + } +// /* OCR2A has been cleared, per TCCR2A above */ +// // OCR3A = 127; + +// // pos1 += incr1; +// // pos2 += incr2; +// // pos3 += incr3; + +// // sample = sinewave[highByte(pos1)] + sinewave[highByte(pos2)] + sinewave[highByte(pos3)]; - // Set CTC mode (Clear Timer on Compare Match) (p.133) - // Have to set OCR1A *after*, otherwise it gets reset to 0! - TCCR2B = (TCCR2B & ~_BV(WGM13)) | _BV(WGM12); - TCCR2A = TCCR2A & ~(_BV(WGM11) | _BV(WGM10)); +// // OCR3A = sample; - // No prescaler (p.134) - TCCR2B = (TCCR2B & ~(_BV(CS12) | _BV(CS11))) | _BV(CS10); - // Set the compare register (OCR1A). - // OCR1A is a 16-bit register, so we have to do this with - // interrupts disabled to be safe. - // OCR2A = F_CPU / SAMPLE_RATE; // 16e6 / 8000 = 2000 - OCR2A = 2000; +// OCR3A=pgm_read_byte(&sinewave[pos1]); +// pos1++; +// // PORTC &= ~(1<<6); - // Enable interrupt when TCNT1 == OCR1A (p.136) - TIMSK1 |= _BV(OCIE2A); +// /* buffered, 1x gain, active mode */ +// // SPDR = highByte(sample) | 0x70; +// // while (!(SPSR & (1< 0) { + DDRC |= (1<<6); + + TCCR3A = (1 << COM3A1) | (0 << COM3A0) | (1 << WGM31) | (0 << WGM30); + TCCR3B = (1 << WGM33) | (1 << WGM32) | (0 << CS32) | (1 << CS31) | (0 << CS30); + + if (frequency != 0) { + if (frequency < freq) { + for (double f = frequency; f <= freq; f += ((freq - frequency) / 500.0)) { + send_freq(f, vol); + } + } else if (frequency > freq) { + for (double f = frequency; f >= freq; f -= ((frequency - freq) / 500.0)) { + send_freq(f, vol); + } + } + } + send_freq(freq, vol); + frequency = freq; + volume = vol; + + frequencies[voices] = frequency; + volumes[voices] = volume; + voices++; } - PORTB &= ~(1<<1); + // ICR3 = 0xFFFF; + // for (int i = 0; i < 10000; i++) { + // OCR3A = round((sin(i*freq)*.5)+.5)*0xFFFF; + // // _delay_us(50); + // } + + // TCCR3A = 0; + // TCCR3B = 0; } -void true_note(float x, float y, float length) { - for (uint32_t i = 0; i < length * 50; i++) { - uint32_t v = (uint32_t) (round(sin(PI*2*i*640000*pow(2, x/12.0))*.5+1 + sin(PI*2*i*640000*pow(2, y/12.0))*.5+1) / 2 * pow(2, 8)); - for (int u = 0; u < 8; u++) { - if (v & (1 << u) && !(PORTB&(1<<1))) - PORTB |= (1<<1); - else if (PORTB&(1<<1)) - PORTB &= ~(1<<1); - } - } - PORTB &= ~(1<<1); -} \ No newline at end of file +// void note(int x, float length) { +// DDRC |= (1<<6); +// int t = (int)(440*pow(2,-x/12.0)); // starting note +// for (int y = 0; y < length*1000/t; y++) { // note length +// PORTC |= (1<<6); +// delay_us(t); +// PORTC &= ~(1<<6); +// delay_us(t); +// } +// PORTC &= ~(1<<6); +// } + +// void true_note(float x, float y, float length) { +// for (uint32_t i = 0; i < length * 50; i++) { +// uint32_t v = (uint32_t) (round(sin(PI*2*i*640000*pow(2, x/12.0))*.5+1 + sin(PI*2*i*640000*pow(2, y/12.0))*.5+1) / 2 * pow(2, 8)); +// for (int u = 0; u < 8; u++) { +// if (v & (1 << u) && !(PORTC&(1<<6))) +// PORTC |= (1<<6); +// else if (PORTC&(1<<6)) +// PORTC &= ~(1<<6); +// } +// } +// PORTC &= ~(1<<6); +// } \ No newline at end of file diff --git a/keyboard/preonic/beeps.h b/keyboard/preonic/beeps.h index 3e3c634ff..378983c60 100644 --- a/keyboard/preonic/beeps.h +++ b/keyboard/preonic/beeps.h @@ -6,4 +6,7 @@ void note(int x, float length); void beeps(); void true_note(float x, float y, float length); -void play_note(float freq, int length); \ No newline at end of file +void play_note(double freq, int vol); +void stop_note(double freq); +void stop_all_notes(); +void init_notes(); \ No newline at end of file diff --git a/keyboard/preonic/extended_keymaps/extended_keymap_lock.c b/keyboard/preonic/extended_keymaps/extended_keymap_lock.c index 8edf8a283..ec7bc776a 100644 --- a/keyboard/preonic/extended_keymaps/extended_keymap_lock.c +++ b/keyboard/preonic/extended_keymaps/extended_keymap_lock.c @@ -1,8 +1,8 @@ #include "extended_keymap_common.h" #include "backlight.h" #include "action_layer.h" -#include "lufa.h" #include "keymap_midi.h" +#include "beeps.h" const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [0] = { /* Qwerty */ diff --git a/keyboard/preonic/keymap_midi.c b/keyboard/preonic/keymap_midi.c index c7937bb9b..a0fa59990 100644 --- a/keyboard/preonic/keymap_midi.c +++ b/keyboard/preonic/keymap_midi.c @@ -20,37 +20,91 @@ along with this program. If not, see . #include uint8_t starting_note = 0x0C; +int offset = 7; void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { - if (id != 0) { - if (record->event.pressed) { - midi_send_noteon(&midi_device, opt, (id & 0xFF), 127); - } else { - midi_send_noteoff(&midi_device, opt, (id & 0xFF), 127); - } - } - - if (record->event.key.col == 11 && record->event.key.row == 4 && record->event.pressed) { - starting_note++; + if (id != 0) { + if (record->event.pressed) { + midi_send_noteon(&midi_device, opt, (id & 0xFF), 127); + } else { + midi_send_noteoff(&midi_device, opt, (id & 0xFF), 127); + } + } + + if (record->event.key.col == (MATRIX_COLS - 1) && record->event.key.row == (MATRIX_ROWS - 1)) { + if (record->event.pressed) { + starting_note++; + play_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[0 + offset])/12.0+(MATRIX_ROWS - 1)), 0xC); + midi_send_cc(&midi_device, 0, 0x7B, 0); + midi_send_cc(&midi_device, 1, 0x7B, 0); + midi_send_cc(&midi_device, 2, 0x7B, 0); + midi_send_cc(&midi_device, 3, 0x7B, 0); + midi_send_cc(&midi_device, 4, 0x7B, 0); + return; + } else { + stop_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[0 + offset])/12.0+(MATRIX_ROWS - 1))); + stop_all_notes(); + return; + } + } + if (record->event.key.col == (MATRIX_COLS - 2) && record->event.key.row == (MATRIX_ROWS - 1)) { + if (record->event.pressed) { + starting_note--; + play_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[0 + offset])/12.0+(MATRIX_ROWS - 1)), 0xC); + midi_send_cc(&midi_device, 0, 0x7B, 0); + midi_send_cc(&midi_device, 1, 0x7B, 0); + midi_send_cc(&midi_device, 2, 0x7B, 0); + midi_send_cc(&midi_device, 3, 0x7B, 0); + midi_send_cc(&midi_device, 4, 0x7B, 0); + return; + } else { + stop_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[0 + offset])/12.0+(MATRIX_ROWS - 1))); + stop_all_notes(); + return; + } + } + + if (record->event.key.col == (MATRIX_COLS - 3) && record->event.key.row == (MATRIX_ROWS - 1) && record->event.pressed) { + offset++; midi_send_cc(&midi_device, 0, 0x7B, 0); midi_send_cc(&midi_device, 1, 0x7B, 0); midi_send_cc(&midi_device, 2, 0x7B, 0); midi_send_cc(&midi_device, 3, 0x7B, 0); midi_send_cc(&midi_device, 4, 0x7B, 0); + stop_all_notes(); + for (int i = 0; i <= 7; i++) { + play_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[i + offset])/12.0+(MATRIX_ROWS - 1)), 0xC); + _delay_us(80000); + stop_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[i + offset])/12.0+(MATRIX_ROWS - 1))); + _delay_us(8000); + } + return; } - if (record->event.key.col == 8 && record->event.key.row == 4 && record->event.pressed) { - starting_note--; + if (record->event.key.col == (MATRIX_COLS - 4) && record->event.key.row == (MATRIX_ROWS - 1) && record->event.pressed) { + offset--; midi_send_cc(&midi_device, 0, 0x7B, 0); midi_send_cc(&midi_device, 1, 0x7B, 0); midi_send_cc(&midi_device, 2, 0x7B, 0); midi_send_cc(&midi_device, 3, 0x7B, 0); midi_send_cc(&midi_device, 4, 0x7B, 0); + stop_all_notes(); + for (int i = 0; i <= 7; i++) { + play_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[i + offset])/12.0+(MATRIX_ROWS - 1)), 0xC); + _delay_us(80000); + stop_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[i + offset])/12.0+(MATRIX_ROWS - 1))); + _delay_us(8000); + } + return; } if (record->event.pressed) { - midi_send_noteon(&midi_device, record->event.key.row, starting_note + SCALE[record->event.key.col], 127); + // midi_send_noteon(&midi_device, record->event.key.row, starting_note + SCALE[record->event.key.col], 127); + midi_send_noteon(&midi_device, 0, (starting_note + SCALE[record->event.key.col + offset])+12*(MATRIX_ROWS - record->event.key.row), 127); + play_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[record->event.key.col + offset])/12.0+(MATRIX_ROWS - record->event.key.row)), 0xF); } else { - midi_send_noteoff(&midi_device, record->event.key.row, starting_note + SCALE[record->event.key.col], 127); + // midi_send_noteoff(&midi_device, record->event.key.row, starting_note + SCALE[record->event.key.col], 127); + midi_send_noteoff(&midi_device, 0, (starting_note + SCALE[record->event.key.col + offset])+12*(MATRIX_ROWS - record->event.key.row), 127); + stop_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[record->event.key.col + offset])/12.0+(MATRIX_ROWS - record->event.key.row))); } } \ No newline at end of file diff --git a/keyboard/preonic/keymap_midi.h b/keyboard/preonic/keymap_midi.h index 02bf35c24..c5917f884 100644 --- a/keyboard/preonic/keymap_midi.h +++ b/keyboard/preonic/keymap_midi.h @@ -23,7 +23,11 @@ along with this program. If not, see . #define CHNL(note, channel) (note + (channel << 8)) -#define SCALE (int []){ 0, 2, 4, 5, 7, 9, 11, 12, 14, 16, 17, 19, 21, 23, 24, 26, 28, 29, 31, 33, 35, 36} +#define SCALE (int []){ 0 + (12*0), 2 + (12*0), 4 + (12*0), 5 + (12*0), 7 + (12*0), 9 + (12*0), 11 + (12*0), \ + 0 + (12*1), 2 + (12*1), 4 + (12*1), 5 + (12*1), 7 + (12*1), 9 + (12*1), 11 + (12*1), \ + 0 + (12*2), 2 + (12*2), 4 + (12*2), 5 + (12*2), 7 + (12*2), 9 + (12*2), 11 + (12*2), \ + 0 + (12*3), 2 + (12*3), 4 + (12*3), 5 + (12*3), 7 + (12*3), 9 + (12*3), 11 + (12*3), \ + 0 + (12*4), 2 + (12*4), 4 + (12*4), 5 + (12*4), 7 + (12*4), 9 + (12*4), 11 + (12*4), } #define N_CN1 (0x600C + (12 * -1) + 0 ) #define N_CN1S (0x600C + (12 * -1) + 1 ) diff --git a/protocol/bluefruit.mk b/protocol/bluefruit.mk index 7e6328f6c..473d73e01 100644 --- a/protocol/bluefruit.mk +++ b/protocol/bluefruit.mk @@ -3,7 +3,7 @@ PJRC_DIR = protocol/pjrc SRC += $(BLUEFRUIT_DIR)/main.c \ $(BLUEFRUIT_DIR)/bluefruit.c \ - serial_uart.c \ + ../serial_uart.c \ $(PJRC_DIR)/pjrc.c \ $(PJRC_DIR)/usb_keyboard.c \ $(PJRC_DIR)/usb_debug.c \ diff --git a/protocol/bluefruit/bluefruit.c b/protocol/bluefruit/bluefruit.c index cf26b83df..47c63555c 100644 --- a/protocol/bluefruit/bluefruit.c +++ b/protocol/bluefruit/bluefruit.c @@ -2,20 +2,16 @@ Bluefruit Protocol for TMK firmware Author: Benjamin Gould, 2013 Based on code Copyright 2011 Jun Wako - This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. - This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - You should have received a copy of the GNU General Public License along with this program. If not, see . - */ #include @@ -76,6 +72,13 @@ static void send_mouse(report_mouse_t *report); static void send_system(uint16_t data); static void send_consumer(uint16_t data); + +void sendString(char string[], int length) { + for(int i = 0; i < length; i++) { + serial_send(string[i]); + } +} + static host_driver_t driver = { keyboard_leds, send_keyboard, @@ -100,6 +103,7 @@ static void send_keyboard(report_keyboard_t *report) #endif bluefruit_serial_send(0xFD); for (uint8_t i = 0; i < KEYBOARD_REPORT_SIZE; i++) { + bluefruit_serial_send(report->raw[i]); } #ifdef BLUEFRUIT_TRACE_SERIAL @@ -198,5 +202,4 @@ static void send_consumer(uint16_t data) #ifdef BLUEFRUIT_TRACE_SERIAL bluefruit_trace_footer(); #endif -} - +} \ No newline at end of file diff --git a/protocol/bluefruit/bluefruit.h b/protocol/bluefruit/bluefruit.h index 4f9b58836..ceacc4a36 100644 --- a/protocol/bluefruit/bluefruit.h +++ b/protocol/bluefruit/bluefruit.h @@ -2,17 +2,14 @@ Bluefruit Protocol for TMK firmware Author: Benjamin Gould, 2013 Based on code Copyright 2011 Jun Wako - This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. - This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - You should have received a copy of the GNU General Public License along with this program. If not, see . */ @@ -25,4 +22,4 @@ along with this program. If not, see . host_driver_t *bluefruit_driver(void); -#endif +#endif \ No newline at end of file diff --git a/protocol/bluefruit/main.c b/protocol/bluefruit/main.c index 871062ab1..0dbb637e2 100644 --- a/protocol/bluefruit/main.c +++ b/protocol/bluefruit/main.c @@ -22,7 +22,7 @@ along with this program. If not, see . #include #include #include -#include "serial.h" +#include "../serial.h" #include "keyboard.h" #include "usb.h" #include "host.h" @@ -40,23 +40,26 @@ along with this program. If not, see . #define BLUEFRUIT_HOST_DRIVER 1 #define PJRC_HOST_DRIVER 2 + int main(void) { CPU_PRESCALE(0); - DDRD = _BV(PD5); - DDRB = _BV(PB0); + // DDRD = _BV(PD5); + // DDRB = _BV(PB0); - PORTD = _BV(PD5); - PORTB = _BV(PB0); + // PORTD = _BV(PD5); + // PORTB = _BV(PB0); print_set_sendchar(sendchar); - usb_init(); - _delay_ms(2000); + // usb_init(); + // _delay_ms(2000); // while (!usb_configured()) /* wait */ + + dprintf("Initializing keyboard...\n"); keyboard_init(); @@ -64,53 +67,72 @@ int main(void) // is not configured, choose the Bluefruit, otherwise use USB // Definitely would prefer to have this driven by an input pin and make // it switch dynamically - BCG - if (!usb_configured()) { + // if (!usb_configured()) { - // Send power to Bluefruit... Adafruit says it takes 27 mA, I think - // the pins should provide 40 mA, but just in case I switch the - // Bluefruit using a transistor - BCG - DDRB = _BV(PB6); - PORTB |= _BV(PB6); + // // Send power to Bluefruit... Adafruit says it takes 27 mA, I think + // // the pins should provide 40 mA, but just in case I switch the + // // Bluefruit using a transistor - BCG + // DDRB = _BV(PB6); + // PORTB |= _BV(PB6); dprintf("Setting host driver to bluefruit...\n"); host_set_driver(bluefruit_driver()); dprintf("Initializing serial...\n"); serial_init(); - - // wait an extra second for the PC's operating system - // to load drivers and do whatever it does to actually - // be ready for input - _delay_ms(1000); - PORTD = ~_BV(PD5); - dprintf("Starting main loop"); - while (1) { - keyboard_task(); - } - } else { + // char swpa[] = "+++\r\n"; + // for (int i = 0; i < 5; i++) { + // serial_send(swpa[i]); + // } + + // char ble_enable[] = "AT+BLEKEYBOARDEN=1\r\n"; + // for (int i = 0; i < 20; i++) { + // serial_send(ble_enable[i]); + // } + + // char reset[] = "ATZ\r\n"; + // for (int i = 0; i < 5; i++) { + // serial_send(reset[i]); + // } + + // for (int i = 0; i < 5; i++) { + // serial_send(swpa[i]); + // } - // I'm not smart enough to get this done with LUFA - BCG - dprintf("Setting host driver to PJRC...\n"); - host_set_driver(pjrc_driver()); -#ifdef SLEEP_LED_ENABLE - sleep_led_init(); -#endif // wait an extra second for the PC's operating system // to load drivers and do whatever it does to actually // be ready for input _delay_ms(1000); - PORTB = ~_BV(PB0); + // PORTD = ~_BV(PD5); dprintf("Starting main loop"); while (1) { - while (suspend) { - suspend_power_down(); - if (remote_wakeup && suspend_wakeup_condition()) { - usb_remote_wakeup(); - } - } - keyboard_task(); + keyboard_task(); } - } + +// } else { + +// // I'm not smart enough to get this done with LUFA - BCG +// dprintf("Setting host driver to PJRC...\n"); +// host_set_driver(pjrc_driver()); +// #ifdef SLEEP_LED_ENABLE +// sleep_led_init(); +// #endif +// // wait an extra second for the PC's operating system +// // to load drivers and do whatever it does to actually +// // be ready for input +// _delay_ms(1000); +// PORTB = ~_BV(PB0); +// dprintf("Starting main loop"); +// while (1) { +// while (suspend) { +// suspend_power_down(); +// if (remote_wakeup && suspend_wakeup_condition()) { +// usb_remote_wakeup(); +// } +// } +// keyboard_task(); +// } +// } } diff --git a/protocol/lufa/descriptor.c b/protocol/lufa/descriptor.c index 5454926b1..b345da27b 100644 --- a/protocol/lufa/descriptor.c +++ b/protocol/lufa/descriptor.c @@ -266,7 +266,7 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor = .ConfigAttributes = (USB_CONFIG_ATTR_RESERVED | USB_CONFIG_ATTR_REMOTEWAKEUP), - .MaxPowerConsumption = USB_CONFIG_POWER_MA(100) + .MaxPowerConsumption = USB_CONFIG_POWER_MA(500) }, /* diff --git a/protocol/lufa/lufa.c b/protocol/lufa/lufa.c index b31f3031e..85c7bf712 100644 --- a/protocol/lufa/lufa.c +++ b/protocol/lufa/lufa.c @@ -840,13 +840,13 @@ int main(void) /* wait for USB startup & debug output */ - // while (USB_DeviceState != DEVICE_STATE_Configured) { + while (USB_DeviceState != DEVICE_STATE_Configured) { // #if defined(INTERRUPT_CONTROL_ENDPOINT) // ; // #else USB_USBTask(); // #endif - // } + } print("USB configured.\n"); /* init modules */ -- cgit v1.2.3