diff options
| -rw-r--r-- | common.mk | 4 | ||||
| -rw-r--r-- | keyboard/atomic/extended_keymaps/extended_keymap_default.c | 2 | ||||
| -rwxr-xr-x | keyboard/atomic/flash-pcb.sh | 2 | ||||
| -rw-r--r-- | keyboard/planck/Makefile | 22 | ||||
| -rw-r--r-- | keyboard/planck/config.h | 71 | ||||
| -rw-r--r-- | keyboard/planck/keymap_midi.c | 44 | ||||
| -rw-r--r-- | keyboard/planck/keymaps/keymap_lock.c | 41 | ||||
| -rwxr-xr-x | keyboard/planck/planck_with_bootloader.hex | 1796 | ||||
| -rw-r--r-- | keyboard/preonic/Makefile | 3 | ||||
| -rw-r--r-- | keyboard/preonic/beeps.c | 386 | ||||
| -rw-r--r-- | keyboard/preonic/beeps.h | 5 | ||||
| -rw-r--r-- | keyboard/preonic/extended_keymaps/extended_keymap_lock.c | 2 | ||||
| -rw-r--r-- | keyboard/preonic/keymap_midi.c | 82 | ||||
| -rw-r--r-- | keyboard/preonic/keymap_midi.h | 6 | ||||
| -rw-r--r-- | protocol/bluefruit.mk | 2 | ||||
| -rw-r--r-- | protocol/bluefruit/bluefruit.c | 15 | ||||
| -rw-r--r-- | protocol/bluefruit/bluefruit.h | 5 | ||||
| -rw-r--r-- | protocol/bluefruit/main.c | 100 | ||||
| -rw-r--r-- | protocol/lufa/descriptor.c | 2 | ||||
| -rw-r--r-- | protocol/lufa/lufa.c | 4 | 
20 files changed, 2302 insertions, 292 deletions
@@ -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 <http://www.gnu.org/licenses/>.      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<<UDRE1)) +    #define SERIAL_UART_INIT()     do { \ +        UBRR1L = (uint8_t) SERIAL_UART_UBRR;       /* baud rate */ \ +        UBRR1H = (uint8_t) (SERIAL_UART_UBRR>>8);  /* baud rate */ \ +        UCSR1B = (1<<TXEN1);                /* TX: enable */ \ +        UCSR1C = (0<<UPM11) | (0<<UPM10) | /* parity: none(00), even(01), odd(11) */ \ +                 (0<<UCSZ12) | (1<<UCSZ11) | (1<<UCSZ10); /* data-8bit(011) */ \ +		sei(); \ +    } while(0) +#else +#   error "USART configuration is needed." +#endif + + +// I'm fairly sure these aren't needed, but oh well - Jack + +/* + * PS/2 Interrupt configuration + */ +#ifdef PS2_USE_INT +/* uses INT1 for clock line(ATMega32U4) */ +#define PS2_CLOCK_PORT  PORTD +#define PS2_CLOCK_PIN   PIND +#define PS2_CLOCK_DDR   DDRD +#define PS2_CLOCK_BIT   1 + +#define PS2_DATA_PORT   PORTD +#define PS2_DATA_PIN    PIND +#define PS2_DATA_DDR    DDRD +#define PS2_DATA_BIT    0 + +#define PS2_INT_INIT()  do {    \ +    EICRA |= ((1<<ISC11) |      \ +              (0<<ISC10));      \ +} while (0) +#define PS2_INT_ON()  do {      \ +    EIMSK |= (1<<INT1);         \ +} while (0) +#define PS2_INT_OFF() do {      \ +    EIMSK &= ~(1<<INT1);        \ +} while (0) +#define PS2_INT_VECT    INT1_vect +#endif + +/* + * PS/2 Busywait configuration + */ +#ifdef PS2_USE_BUSYWAIT +#define PS2_CLOCK_PORT  PORTD +#define PS2_CLOCK_PIN   PIND +#define PS2_CLOCK_DDR   DDRD +#define PS2_CLOCK_BIT   1 + +#define PS2_DATA_PORT   PORTD +#define PS2_DATA_PIN    PIND +#define PS2_DATA_DDR    DDRD +#define PS2_DATA_BIT    0 +#endif + +#endif +  /*   * Feature disable options   *  These options are also useful to firmware size reduction.   */  /* disable debug print */ -#define NO_DEBUG +// #define NO_DEBUG  /* disable print */ -#define NO_PRINT +// #define NO_PRINT  /* disable action features */  //#define NO_ACTION_LAYER diff --git a/keyboard/planck/keymap_midi.c b/keyboard/planck/keymap_midi.c index 748ca4d56..b7eba3ab7 100644 --- a/keyboard/planck/keymap_midi.c +++ b/keyboard/planck/keymap_midi.c @@ -35,7 +35,7 @@ void action_function(keyrecord_t *record, uint8_t id, uint8_t opt)      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); +            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 <avr/boot.h>  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 <avr/io.h>  #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<<WGM31 | 0<<WGM30;  CTC mode, reset on match  +    // // TCCR3B = 0<<CS32 | 1<<CS31 | 0<<CS30; /* clk, /8 prescaler */ +    // TCCR3A = (1 << COM3A1) | (0 << COM3A0) | (1 << WGM31) | (0 << WGM30); +    // TCCR3B = (0 << WGM33) | (0 << WGM32) | (0 << CS32) | (0 << CS31) | (1 << CS30); +    // TCCR1A = (1 << COM1A1) | (0 << COM1A0) | (1 << WGM11) | (0 << WGM10); +    // TCCR1B = (1 << WGM12) | (0 << CS12) | (0 << CS11) | (1 << CS10); +    // // SPCR = 0x50; +    // // SPSR = 0x01; +    // DDRC |= (1<<6); +    // // ICR3 = 0xFFFF;  +    // // OCR3A=80; +    // PORTC |= (1<<6); -	cli(); +    // sei(); +} + +// #define highByte(c) ((c >> 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<<SPIF))); -    sample = 0; -    sei(); +//     // SPDR = lowByte(sample); +//     // while (!(SPSR & (1<<SPIF))); + +//     // PORTC |= (1<<6);  } -void note(int x, float length) { -    DDRB |= (1<<1); -	int t = (int)(440*pow(2,-x/12.0)); // starting note -    for (int y = 0; y < length*1000/t; y++) { // note length -        PORTB |= (1<<1); -        delay_us(t); -        PORTB &= ~(1<<1); -        delay_us(t); +void play_note(double freq, int vol) { + +    if (freq > 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 <http://www.gnu.org/licenses/>.  #include <lufa.h>  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 <http://www.gnu.org/licenses/>.  #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 <wakojun@gmail.com> -  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 <http://www.gnu.org/licenses/>. -  */  #include <stdint.h> @@ -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 <wakojun@gmail.com> -  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 <http://www.gnu.org/licenses/>.  */ @@ -25,4 +22,4 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.  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 <http://www.gnu.org/licenses/>.  #include <avr/wdt.h>  #include <avr/sleep.h>  #include <util/delay.h> -#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 <http://www.gnu.org/licenses/>.  #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 */  | 
