summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--common.mk4
-rw-r--r--keyboard/atomic/extended_keymaps/extended_keymap_default.c2
-rwxr-xr-xkeyboard/atomic/flash-pcb.sh2
-rw-r--r--keyboard/planck/Makefile22
-rw-r--r--keyboard/planck/config.h71
-rw-r--r--keyboard/planck/keymap_midi.c44
-rw-r--r--keyboard/planck/keymaps/keymap_lock.c41
-rwxr-xr-xkeyboard/planck/planck_with_bootloader.hex1796
-rw-r--r--keyboard/preonic/Makefile3
-rw-r--r--keyboard/preonic/beeps.c386
-rw-r--r--keyboard/preonic/beeps.h5
-rw-r--r--keyboard/preonic/extended_keymaps/extended_keymap_lock.c2
-rw-r--r--keyboard/preonic/keymap_midi.c82
-rw-r--r--keyboard/preonic/keymap_midi.h6
-rw-r--r--protocol/bluefruit.mk2
-rw-r--r--protocol/bluefruit/bluefruit.c15
-rw-r--r--protocol/bluefruit/bluefruit.h5
-rw-r--r--protocol/bluefruit/main.c100
-rw-r--r--protocol/lufa/descriptor.c2
-rw-r--r--protocol/lufa/lufa.c4
20 files changed, 2302 insertions, 292 deletions
diff --git a/common.mk b/common.mk
index e61ae69e5e..3237e539a6 100644
--- a/common.mk
+++ b/common.mk
@@ -68,6 +68,10 @@ ifdef BACKLIGHT_ENABLE
OPT_DEFS += -DBACKLIGHT_ENABLE
endif
+ifdef BLUETOOTH_ENABLE
+ OPT_DEFS += -DBLUETOOTH_ENABLE
+endif
+
ifdef KEYMAP_SECTION_ENABLE
OPT_DEFS += -DKEYMAP_SECTION_ENABLE
EXTRALDFLAGS = -Wl,-L$(TOP_DIR),-Tldscript_keymap_avr5.x
diff --git a/keyboard/atomic/extended_keymaps/extended_keymap_default.c b/keyboard/atomic/extended_keymaps/extended_keymap_default.c
index e662c91889..ab08bb6d25 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 2ae15458c0..46abc6982a 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 2f0ba5ba9d..d9e8ce7889 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 e970127703..0a1a6a9357 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 748ca4d563..b7eba3ab76 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 4fe2e0a2bf..b844d1cdab 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 0000000000..c61dfb743a
--- /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