From 577971ab07a49405e1dcd8e5f75b3ecb87e710b9 Mon Sep 17 00:00:00 2001 From: IBNobody Date: Mon, 28 Mar 2016 00:03:21 -0500 Subject: Magic Key Overrides / Keyboard Lock / Forced NKRO Added Magic Key Overrides / Magic Key Cleanup / Added Keyboard Lock option to template / Added forced NKRO option to template (disabled by default) --- quantum/template/Makefile | 23 ++++++++++++----------- quantum/template/config.h | 47 ++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 58 insertions(+), 12 deletions(-) (limited to 'quantum') diff --git a/quantum/template/Makefile b/quantum/template/Makefile index 2efa69138..4fa195468 100644 --- a/quantum/template/Makefile +++ b/quantum/template/Makefile @@ -113,18 +113,19 @@ OPT_DEFS += -DBOOTLOADER_SIZE=512 # Build Options # comment out to disable the options. # -BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000) -MOUSEKEY_ENABLE = yes # Mouse keys(+4700) -EXTRAKEY_ENABLE = yes # Audio control and System control(+450) -CONSOLE_ENABLE = yes # Console for debug(+400) -COMMAND_ENABLE = yes # Commands for debug and configuration +BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = yes # Console for debug(+400) +COMMAND_ENABLE = yes # Commands for debug and configuration +KEYBOARD_LOCK_ENABLE = yes # Allow locking of keyboard via magic key # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE -# SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend -# NKRO_ENABLE = yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work -# BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality -# MIDI_ENABLE = YES # MIDI controls -# UNICODE_ENABLE = YES # Unicode -# BLUETOOTH_ENABLE = yes # Enable Bluetooth with the Adafruit EZ-Key HID +# SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend +#NKRO_ENABLE = yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +# BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality +# MIDI_ENABLE = YES # MIDI controls +# UNICODE_ENABLE = YES # Unicode +# BLUETOOTH_ENABLE = yes # Enable Bluetooth with the Adafruit EZ-Key HID # Optimize size but this may cause error "relocation truncated to fit" diff --git a/quantum/template/config.h b/quantum/template/config.h index 7d6149f43..dae4b6313 100644 --- a/quantum/template/config.h +++ b/quantum/template/config.h @@ -55,11 +55,56 @@ along with this program. If not, see . /* Locking resynchronize hack */ #define LOCKING_RESYNC_ENABLE -/* key combination for command */ +/* Force NKRO Mode - If forced on, must be disabled via magic key (default = LShift+RShift+N) */ +//#define FORCE_NKRO + +/* + * Magic key options + * These options allow the magic key functionality to be changed. This is useful + * if your keyboard/keypad is missing keys and you want magic key support. + */ + +/* key combination for magic key command */ #define IS_COMMAND() ( \ keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ ) +/* control how magic key switches layers */ +//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS true +//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS true +//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM false + +/* override magic key keymap */ +//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS +//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS +//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM +//#define MAGIC_KEY_HELP1 H +//#define MAGIC_KEY_HELP2 SLASH +//#define MAGIC_KEY_DEBUG D +//#define MAGIC_KEY_DEBUG_MATRIX X +//#define MAGIC_KEY_DEBUG_KBD K +//#define MAGIC_KEY_DEBUG_MOUSE M +//#define MAGIC_KEY_VERSION V +//#define MAGIC_KEY_STATUS S +//#define MAGIC_KEY_CONSOLE C +//#define MAGIC_KEY_LAYER0_ALT1 ESC +//#define MAGIC_KEY_LAYER0_ALT2 GRAVE +//#define MAGIC_KEY_LAYER0 0 +//#define MAGIC_KEY_LAYER1 1 +//#define MAGIC_KEY_LAYER2 2 +//#define MAGIC_KEY_LAYER3 3 +//#define MAGIC_KEY_LAYER4 4 +//#define MAGIC_KEY_LAYER5 5 +//#define MAGIC_KEY_LAYER6 6 +//#define MAGIC_KEY_LAYER7 7 +//#define MAGIC_KEY_LAYER8 8 +//#define MAGIC_KEY_LAYER9 9 +//#define MAGIC_KEY_BOOTLOADER PAUSE +//#define MAGIC_KEY_LOCK CAPS +//#define MAGIC_KEY_EEPROM E +//#define MAGIC_KEY_NKRO N +//#define MAGIC_KEY_SLEEP_LED Z + /* * Feature disable options * These options are also useful to firmware size reduction. -- cgit v1.2.3-70-g09d2 From 2181be029e01d9cf46ae3cadcdf25f5bca02c631 Mon Sep 17 00:00:00 2001 From: Damien Pollet Date: Mon, 28 Mar 2016 16:13:37 +0200 Subject: Add action-preprocessing hook to keyboard template --- quantum/template/template.c | 20 ++++++++++++++++---- quantum/template/template.h | 5 +++-- 2 files changed, 19 insertions(+), 6 deletions(-) (limited to 'quantum') diff --git a/quantum/template/template.c b/quantum/template/template.c index 58e73cb09..cc52e496f 100644 --- a/quantum/template/template.c +++ b/quantum/template/template.c @@ -10,6 +10,11 @@ void matrix_scan_user(void) { // leave this function blank - it can be defined in a keymap file } +__attribute__ ((weak)) +void process_action_user(keyrecord_t *record) { + // leave this function blank - it can be defined in a keymap file +} + __attribute__ ((weak)) void led_set_user(uint8_t usb_led) { // leave this function blank - it can be defined in a keymap file @@ -18,19 +23,26 @@ void led_set_user(uint8_t usb_led) { void matrix_init_kb(void) { // put your keyboard start-up code here // runs once when the firmware starts up - + matrix_init_user(); } void matrix_scan_kb(void) { - // put your looping keyboard code here - // runs every cycle (a lot) + // put your looping keyboard code here + // runs every cycle (a lot) matrix_scan_user(); } +void process_action_kb(keyrecord_t *record) { + // put your per-action keyboard code here + // runs for every action, just before processing by the firmware + + process_action_user(record); +} + void led_set_kb(uint8_t usb_led) { // put your keyboard LED indicator (ex: Caps Lock LED) toggling code here led_set_user(usb_led); -} \ No newline at end of file +} diff --git a/quantum/template/template.h b/quantum/template/template.h index ba91abac3..b1c34d3cb 100644 --- a/quantum/template/template.h +++ b/quantum/template/template.h @@ -17,10 +17,11 @@ { \ { k00, k01, k02 }, \ { k10, KC_NO, k11 }, \ -} +} void matrix_init_user(void); void matrix_scan_user(void); +void process_action_user(keyrecord_t *record); void led_set_user(uint8_t usb_led); -#endif \ No newline at end of file +#endif -- cgit v1.2.3-70-g09d2 From 1d13aa933bbb57bf0c1fe0196981b81233c3df97 Mon Sep 17 00:00:00 2001 From: IBNobody Date: Mon, 28 Mar 2016 19:45:20 -0500 Subject: Minor Tweaks and Documentation Fixed compiler warning by including bootloader.h in keymap_common.c. Changed FORCE_NKRO to only be applied if NKRO_ENABLE is defined. Added extra documentation to the template config.h --- quantum/keymap_common.c | 1 + quantum/template/config.h | 53 ++++++++++++++++++++++++++++++++++++---------- tmk_core/common/keyboard.c | 2 +- 3 files changed, 44 insertions(+), 12 deletions(-) (limited to 'quantum') diff --git a/quantum/keymap_common.c b/quantum/keymap_common.c index 7068ca4f3..2eef4f15a 100644 --- a/quantum/keymap_common.c +++ b/quantum/keymap_common.c @@ -25,6 +25,7 @@ along with this program. If not, see . #include "debug.h" #include "backlight.h" #include "keymap_midi.h" +#include "bootloader.h" #include #include diff --git a/quantum/template/config.h b/quantum/template/config.h index dae4b6313..e6fb7866c 100644 --- a/quantum/template/config.h +++ b/quantum/template/config.h @@ -32,36 +32,67 @@ along with this program. If not, see . #define MATRIX_ROWS 2 #define MATRIX_COLS 3 -// Planck PCB default pin-out -// Change this to how you wired your keyboard -// COLS: Left to right, ROWS: Top to bottom +/* + * Keyboard Matrix Assignments + * + * Change this to how you wired your keyboard + * COLS: AVR pins used for columns, left to right + * ROWS: AVR pins used for rows, top to bottom + * DIODE_DIRECTION: COL2ROW = COL = Anode (+), ROW = Cathode (-, marked on diode) + * ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode) + * +*/ #define COLS (int []){ F1, F0, B0 } #define ROWS (int []){ D0, D5 } /* COL2ROW or ROW2COL */ #define DIODE_DIRECTION COL2ROW -/* define if matrix has ghost */ +/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ +#define DEBOUNCE 5 + +/* define if matrix has ghost (lacks anti-ghosting diodes) */ //#define MATRIX_HAS_GHOST /* number of backlight levels */ #define BACKLIGHT_LEVELS 3 -/* Set 0 if debouncing isn't needed */ -#define DEBOUNCE 5 - /* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */ #define LOCKING_SUPPORT_ENABLE /* Locking resynchronize hack */ #define LOCKING_RESYNC_ENABLE -/* Force NKRO Mode - If forced on, must be disabled via magic key (default = LShift+RShift+N) */ +/* + * Force NKRO + * + * Force NKRO (nKey Rollover) to be enabled by default, regardless of the saved + * state in the bootmagic EEPROM settings. (Note that NKRO must be enabled in the + * makefile for this to work.) + * + * If forced on, NKRO can be disabled via magic key (default = LShift+RShift+N) + * until the next keyboard reset. + * + * NKRO may prevent your keystrokes from being detected in the BIOS, but it is + * fully operational during normal computer usage. + * + * For a less heavy-handed approach, enable NKRO via magic key (LShift+RShift+N) + * or via bootmagic (hold SPACE+N while plugging in the keyboard). Once set by + * bootmagic, NKRO mode will always be enabled until it is toggled again during a + * power-up. + * + */ //#define FORCE_NKRO /* - * Magic key options - * These options allow the magic key functionality to be changed. This is useful - * if your keyboard/keypad is missing keys and you want magic key support. + * Magic Key Options + * + * Magic keys are hotkey commands that allow control over firmware functions of + * the keyboard. They are best used in combination with the HID Listen program, + * found here: https://www.pjrc.com/teensy/hid_listen.html + * + * The options below allow the magic key functionality to be changed. This is + * useful if your keyboard/keypad is missing keys and you want magic key support. + * */ /* key combination for magic key command */ diff --git a/tmk_core/common/keyboard.c b/tmk_core/common/keyboard.c index e66808485..302b3ec87 100644 --- a/tmk_core/common/keyboard.c +++ b/tmk_core/common/keyboard.c @@ -92,7 +92,7 @@ void keyboard_init(void) backlight_init(); #endif -#ifdef FORCE_NKRO +#if defined(NKRO_ENABLE) && defined(FORCE_NKRO) keyboard_nkro = true; #endif -- cgit v1.2.3-70-g09d2 From 95fba250ef2029ccdedb34500c5d1e96f6d065cf Mon Sep 17 00:00:00 2001 From: Noah Andrews Date: Tue, 29 Mar 2016 21:53:36 -0400 Subject: Updated several keyboard folders to use new keymap naming scheme --- BUILD_GUIDE.md | 5 +- keyboard/alps64/Makefile | 4 +- keyboard/alps64/keymap_hasu.c | 151 ----------- keyboard/alps64/keymap_plain.c | 12 - keyboard/alps64/keymaps/default.c | 12 + keyboard/alps64/keymaps/hasu.c | 151 +++++++++++ keyboard/atomic/Makefile | 4 +- keyboard/atomic/README.md | 4 +- keyboard/atomic/keymaps/abienz.c | 36 +++ keyboard/atomic/keymaps/default.c | 79 ++++++ keyboard/atomic/keymaps/keymap_abienz.c | 36 --- keyboard/atomic/keymaps/keymap_default.c | 79 ------ keyboard/atomic/keymaps/keymap_michelle.c | 183 ------------- keyboard/atomic/keymaps/michelle.c | 183 +++++++++++++ keyboard/atreus/Makefile | 4 +- keyboard/atreus/README.md | 4 +- keyboard/atreus/keymaps/default.c | 51 ++++ keyboard/atreus/keymaps/gerb.c | 66 +++++ keyboard/atreus/keymaps/keymap_default.c | 51 ---- keyboard/atreus/keymaps/keymap_gerb.c | 66 ----- keyboard/gh60/Makefile | 4 +- keyboard/gh60/Makefile.pjrc | 4 +- keyboard/gh60/README.md | 14 +- keyboard/gh60/keymap_hasu.c | 145 ----------- keyboard/gh60/keymap_hhkb.c | 52 ---- keyboard/gh60/keymap_plain.c | 11 - keyboard/gh60/keymap_poker.c | 104 -------- keyboard/gh60/keymap_poker_bit.c | 50 ---- keyboard/gh60/keymap_poker_set.c | 82 ------ keyboard/gh60/keymap_spacefn.c | 55 ---- keyboard/gh60/keymaps/hasu.c | 145 +++++++++++ keyboard/gh60/keymaps/hhkb.c | 52 ++++ keyboard/gh60/keymaps/plain.c | 11 + keyboard/gh60/keymaps/poker.c | 104 ++++++++ keyboard/gh60/keymaps/poker_bit.c | 50 ++++ keyboard/gh60/keymaps/poker_set.c | 82 ++++++ keyboard/gh60/keymaps/spacefn.c | 55 ++++ keyboard/hhkb/Makefile | 8 +- keyboard/hhkb/Makefile.pjrc | 4 +- keyboard/hhkb/Makefile.rn42 | 8 +- keyboard/hhkb/README.md | 2 +- keyboard/hhkb/keymap_hasu.c | 282 --------------------- keyboard/hhkb/keymap_hhkb.c | 95 ------- keyboard/hhkb/keymap_jp.c | 50 ---- keyboard/hhkb/keymap_spacefn.c | 116 --------- keyboard/hhkb/keymaps/hasu.c | 282 +++++++++++++++++++++ keyboard/hhkb/keymaps/hhkb.c | 95 +++++++ keyboard/hhkb/keymaps/jp.c | 50 ++++ keyboard/hhkb/keymaps/spacefn.c | 116 +++++++++ keyboard/hhkb_qmk/Makefile | 4 +- keyboard/hhkb_qmk/README.md | 4 +- keyboard/hhkb_qmk/keymaps/default.c | 78 ++++++ keyboard/hhkb_qmk/keymaps/keymap_default.c | 78 ------ keyboard/hhkb_qmk/keymaps/keymap_lxol.c | 208 --------------- keyboard/hhkb_qmk/keymaps/lxol.c | 208 +++++++++++++++ keyboard/jd45/Makefile | 4 +- keyboard/jd45/keymaps/default.c | 31 +++ keyboard/jd45/keymaps/justin.c | 101 ++++++++ keyboard/jd45/keymaps/keymap_default.c | 31 --- keyboard/jd45/keymaps/keymap_justin.c | 101 -------- keyboard/planck/README.md | 4 +- keyboard/planck/common_keymaps/keymap_mitch.c | 49 ---- .../old_keymap_files/common_keymaps/keymap_mitch.c | 49 ++++ quantum/template/README.md | 2 +- 64 files changed, 2132 insertions(+), 2129 deletions(-) delete mode 100644 keyboard/alps64/keymap_hasu.c delete mode 100644 keyboard/alps64/keymap_plain.c create mode 100644 keyboard/alps64/keymaps/default.c create mode 100644 keyboard/alps64/keymaps/hasu.c create mode 100644 keyboard/atomic/keymaps/abienz.c create mode 100644 keyboard/atomic/keymaps/default.c delete mode 100644 keyboard/atomic/keymaps/keymap_abienz.c delete mode 100644 keyboard/atomic/keymaps/keymap_default.c delete mode 100644 keyboard/atomic/keymaps/keymap_michelle.c create mode 100644 keyboard/atomic/keymaps/michelle.c create mode 100644 keyboard/atreus/keymaps/default.c create mode 100644 keyboard/atreus/keymaps/gerb.c delete mode 100644 keyboard/atreus/keymaps/keymap_default.c delete mode 100644 keyboard/atreus/keymaps/keymap_gerb.c delete mode 100644 keyboard/gh60/keymap_hasu.c delete mode 100644 keyboard/gh60/keymap_hhkb.c delete mode 100644 keyboard/gh60/keymap_plain.c delete mode 100644 keyboard/gh60/keymap_poker.c delete mode 100644 keyboard/gh60/keymap_poker_bit.c delete mode 100644 keyboard/gh60/keymap_poker_set.c delete mode 100644 keyboard/gh60/keymap_spacefn.c create mode 100644 keyboard/gh60/keymaps/hasu.c create mode 100644 keyboard/gh60/keymaps/hhkb.c create mode 100644 keyboard/gh60/keymaps/plain.c create mode 100644 keyboard/gh60/keymaps/poker.c create mode 100644 keyboard/gh60/keymaps/poker_bit.c create mode 100644 keyboard/gh60/keymaps/poker_set.c create mode 100644 keyboard/gh60/keymaps/spacefn.c delete mode 100644 keyboard/hhkb/keymap_hasu.c delete mode 100644 keyboard/hhkb/keymap_hhkb.c delete mode 100644 keyboard/hhkb/keymap_jp.c delete mode 100644 keyboard/hhkb/keymap_spacefn.c create mode 100644 keyboard/hhkb/keymaps/hasu.c create mode 100644 keyboard/hhkb/keymaps/hhkb.c create mode 100644 keyboard/hhkb/keymaps/jp.c create mode 100644 keyboard/hhkb/keymaps/spacefn.c create mode 100644 keyboard/hhkb_qmk/keymaps/default.c delete mode 100644 keyboard/hhkb_qmk/keymaps/keymap_default.c delete mode 100644 keyboard/hhkb_qmk/keymaps/keymap_lxol.c create mode 100644 keyboard/hhkb_qmk/keymaps/lxol.c create mode 100644 keyboard/jd45/keymaps/default.c create mode 100644 keyboard/jd45/keymaps/justin.c delete mode 100644 keyboard/jd45/keymaps/keymap_default.c delete mode 100644 keyboard/jd45/keymaps/keymap_justin.c delete mode 100644 keyboard/planck/common_keymaps/keymap_mitch.c create mode 100644 keyboard/planck/old_keymap_files/common_keymaps/keymap_mitch.c (limited to 'quantum') diff --git a/BUILD_GUIDE.md b/BUILD_GUIDE.md index 22df53c30..f7a57d2fc 100644 --- a/BUILD_GUIDE.md +++ b/BUILD_GUIDE.md @@ -44,7 +44,10 @@ If you have any problems building the firmware, you can try using a tool called 4. Once you're in the correct keyboard-specific folder, run the `make` command. This should output a lot of information about the build process. ## Customizing, Building, and Deploying Your Firmware -1. Running the `make` command from your keyboard's folder will generate a .hex file based on the default keymap. All keymaps for a particular keyboard live in the `keymaps` folder in that keyboard's folder. To create your own keymap, copy `keymaps/default/keymap.c` to the `keymaps` folder, and rename it with your name, for example jack.c. Or, if you don't care about the ability to share your keymap with the community via GitHub, you can just modify the default keymap itself. Details on how to program keymap files can be found in other guides. + +Note: Some keyboard folders have non-standard organizations, and may not even support specifying alternate keymaps. Until these get reorganized, you will need to edit their default keymaps directly. + +1. Running the `make` command from your keyboard's folder will generate a .hex file based on the default keymap. All keymaps for a particular keyboard live in the `keymaps` folder in that keyboard's folder. To create your own keymap, copy `keymaps/default/keymap.c` to the `keymaps` folder, and rename it with your name, for example jack.c. Or, if you don't care about the ability to share your keymap with the community via GitHub, you can just modify the default keymap itself. Details on how to program keymap files can be found in other guides. 2. To build a keymap other than the default, type `KEYMAP=` after `make`. So if I've named my keymap jack.c, the full command would be `make KEYMAP=jack`. 3. How you deploy the firmware will depend on whether you are using a PCB or a Teensy. In both cases, you'll need to put the keyboard in bootloader mode, either by pressing a button on the PCB/Teensy or pressing the key with the `RESET` keycode. Then, if you're using a PCB, just run `make KEYMAP= dfu` to both build and deploy the firmware. If you're using a Teensy, you'll probably need to take the .hex file that make produces in the keyboard's folder, and deploy it using the [Teensy Loader.](https://www.pjrc.com/teensy/loader.html) diff --git a/keyboard/alps64/Makefile b/keyboard/alps64/Makefile index e90dcedb6..7634c4280 100644 --- a/keyboard/alps64/Makefile +++ b/keyboard/alps64/Makefile @@ -53,9 +53,9 @@ SRC = keymap_common.c \ led.c ifdef KEYMAP - SRC := keymap_$(KEYMAP).c $(SRC) + SRC := keymaps/$(KEYMAP).c $(SRC) else - SRC := keymap_plain.c $(SRC) + SRC := keymaps/default.c $(SRC) endif CONFIG_H = config.h diff --git a/keyboard/alps64/keymap_hasu.c b/keyboard/alps64/keymap_hasu.c deleted file mode 100644 index d297d72fe..000000000 --- a/keyboard/alps64/keymap_hasu.c +++ /dev/null @@ -1,151 +0,0 @@ -#include "keymap_common.h" - -/* - * Hasu - */ -const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - /* Default Layer - * ,-----------------------------------------------------------. - * |Esc| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| \ | - * |-----------------------------------------------------------| - * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]|Bspc | - * |-----------------------------------------------------------| - * |Ctrl | A| S| D| F| G| H| J| K| L|Fn3| '|FN1 | - * |-----------------------------------------------------------| - * |Shift | Z| X| C| V| B| N| M| ,| .|Fn2|Shift | - * |-----------------------------------------------------------| - * |Ctrl |Gui |Alt | Space |Alt |Fn5 |Ctrl | - * `-----------------------------------------------------------' - */ - [0] = KEYMAP_AEK( \ - ESC, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSLS, \ - TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC,BSPC, \ - LCTL,A, S, D, F, G, H, J, K, L, FN3, QUOT,FN1, \ - LSFT,Z, X, C, V, B, N, M, COMM,DOT, FN2, RSFT, \ - LCTL,LGUI,LALT, FN4, RALT,FN5, FN0), - - /* HHKB mode[HHKB Fn] - * ,-----------------------------------------------------------. - * |Esc| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12| ` | - * |-----------------------------------------------------------| - * |Caps | | | | | | | |Psc|Slk|Pus|Up | |Del | - * |-----------------------------------------------------------| - * |Contro|VoD|VoU|Mut| | | *| /|Hom|PgU|Lef|Rig|Enter | - * |-----------------------------------------------------------| - * |Shift | | | | | | +| -|End|PgD|Dow|Shift | - * |-----------------------------------------------------------| - * |Ctrl |Gui |Alt | Space |Alt |Fn5 |Ctrl | - * `-----------------------------------------------------------' - */ - [1] = KEYMAP_AEK( \ - GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, GRV, \ - CAPS,NO, NO, NO, NO, NO, NO, NO, PSCR,SLCK,PAUS,UP, NO, DEL, \ - LCTL,VOLD,VOLU,MUTE,NO, NO, PAST,PSLS,HOME,PGUP,LEFT,RGHT,TRNS, \ - LSFT,NO, NO, NO, NO, NO, PPLS,PMNS,END, PGDN,DOWN,RSFT, \ - LCTL,LGUI,LALT, TRNS, RALT,RGUI,TRNS), - - /* Vi mode[Slash] - * ,-----------------------------------------------------------. - * |Esc| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Del | - * |-----------------------------------------------------------| - * |Tab |Hom|PgD|Up |PgU|End|Hom|PgD|PgUlEnd| | | |Backs| - * |-----------------------------------------------------------| - * |Contro| |Lef|Dow|Rig| |Lef|Dow|Up |Rig| | |Return | - * |-----------------------------------------------------------| - * |Shift | | | | | |Hom|PgD|PgUlEnd|Fn0|Shift | - * |-----------------------------------------------------------| - * |Ctrl |Gui |Alt | Space |Alt |Fn5 |Ctrl | - * `-----------------------------------------------------------' - */ - [2] = KEYMAP_AEK( \ - GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, GRV, \ - TAB, HOME,PGDN,UP, PGUP,END, HOME,PGDN,PGUP,END, NO, NO, NO, DEL, \ - LCTL,NO, LEFT,DOWN,RGHT,NO, LEFT,DOWN,UP, RGHT,NO, NO, ENT, \ - LSFT,NO, NO, NO, NO, NO, HOME,PGDN,PGUP,END, FN2, RSFT, \ - LCTL,LGUI,LALT, SPC, RALT,RGUI,RCTL), - - /* Mouse mode(IJKL)[Semicolon] - * ,-----------------------------------------------------------. - * |Esc| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Ins|Del| - * |-----------------------------------------------------------| - * |Tab | | | | | |MwL|MwD|McU|MwU|MwR|Wbk|Wfr|Alt-T| - * |-----------------------------------------------------------| - * |Contro| | | | | |Mb2|McL|McD|McR|Fn | |Return | - * |-----------------------------------------------------------| - * |Shift | | | | |Mb3|Mb2|Mb1|Mb4|Mb5| |Shift | | - * |-----------------------------------------------------------| - * |Ctrl |Gui |Alt | Space |Alt |Fn5 |Ctrl | - * `-----------------------------------------------------------' - * Mc: Mouse Cursor / Mb: Mouse Button / Mw: Mouse Wheel - */ - [3] = KEYMAP_AEK( \ - GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, GRV, \ - FN8, NO, NO, NO, NO, NO, NO, WH_D,MS_U,WH_U,RGHT,FN9, FN10,FN8, \ - LCTL,ACL0,ACL1,ACL2,ACL2,NO, NO, MS_L,MS_D,MS_R,TRNS,NO, ENT, \ - LSFT,NO, NO, NO, NO, BTN3,BTN2,BTN1,FN9, FN10,NO, RSFT, \ - LCTL,LGUI,LALT, BTN1, TRNS,TRNS,TRNS), - - /* Layer 4: Mouse mode(IJKL)[Space] - * ,-----------------------------------------------------------. - * |Esc| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Ins|Del| - * |-----------------------------------------------------------| - * |Tab | | | | | |MwL|MwD|McU|MwU|MwR|Wbk|Wfr|Alt-T| - * |-----------------------------------------------------------| - * |Contro| | | | | |Mb2|McL|McD|McR|Mb1| |Return | - * |-----------------------------------------------------------| - * |Shift | | | | |Mb3|Mb2|Mb1|Mb4|Mb5| |Shift | | - * |-----------------------------------------------------------| - * |Ctrl |Gui |Alt | Space |Alt |Fn5 |Ctrl | - * `-----------------------------------------------------------' - * Mc: Mouse Cursor / Mb: Mouse Button / Mw: Mouse Wheel - */ - [4] = KEYMAP_AEK( \ - GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, GRV, \ - FN8, NO, NO, NO, NO, NO, NO, WH_D,MS_U,WH_U,RGHT,FN9, FN10,FN8, \ - LCTL,VOLD,VOLU,MUTE,NO, NO, NO, MS_L,MS_D,MS_R,BTN1,NO, ENT, \ - LSFT,NO, NO, NO, NO, BTN3,BTN2,BTN1,FN9, FN10,NO, RSFT, \ - LCTL,LGUI,LALT, TRNS, TRNS,TRNS,TRNS), -}; - - -/* id for user defined function/macro */ -enum function_id { - NONE, -}; - -enum macro_id { - ALT_TAB, -}; - - -/* - * Fn action definition - */ -const uint16_t PROGMEM fn_actions[] = { - [0] = ACTION_LAYER_MOMENTARY(1), // HHKB layer - [1] = ACTION_LAYER_TAP_KEY(1, KC_ENTER), // HHKB layer - [2] = ACTION_LAYER_TAP_KEY(2, KC_SLASH), // Cursor layer with Slash* - [3] = ACTION_LAYER_TAP_KEY(3, KC_SCLN), // Mousekey layer with Semicolon* - [4] = ACTION_LAYER_TAP_KEY(4, KC_SPC), // Mousekey layer with Space - [5] = ACTION_LAYER_MOMENTARY(3), // Mousekey layer(IJKL) - [6] = ACTION_LAYER_TAP_KEY(MOD_RCTL, KC_ENT), // RControl with tap Enter - [7] = ACTION_MODS_ONESHOT(MOD_LSFT), // Oneshot Shift - [8] = ACTION_MACRO(ALT_TAB), // Application switching - [9] = ACTION_MODS_KEY(MOD_LALT, KC_LEFT), - [10] = ACTION_MODS_KEY(MOD_LALT, KC_RIGHT), -}; - - -/* - * Macro definition - */ -const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) -{ - switch (id) { - case ALT_TAB: - return (record->event.pressed ? - MACRO( D(LALT), D(TAB), END ) : - MACRO( U(TAB), END )); - } - return MACRO_NONE; -} diff --git a/keyboard/alps64/keymap_plain.c b/keyboard/alps64/keymap_plain.c deleted file mode 100644 index a54899196..000000000 --- a/keyboard/alps64/keymap_plain.c +++ /dev/null @@ -1,12 +0,0 @@ -#include "keymap_common.h" - -const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - /* 0: qwerty */ - KEYMAP( \ - GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, NUHS, BSPC, \ - TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC,BSLS, \ - CAPS,A, S, D, F, G, H, J, K, L, SCLN,QUOT,ENT, \ - LSFT,NUBS,Z, X, C, V, B, N, M, COMM,DOT, SLSH,RSFT,ESC, \ - LCTL,LGUI,LALT, SPC, APP, RALT,RGUI,RCTL), -}; -const uint16_t PROGMEM fn_actions[] = {}; diff --git a/keyboard/alps64/keymaps/default.c b/keyboard/alps64/keymaps/default.c new file mode 100644 index 000000000..a54899196 --- /dev/null +++ b/keyboard/alps64/keymaps/default.c @@ -0,0 +1,12 @@ +#include "keymap_common.h" + +const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* 0: qwerty */ + KEYMAP( \ + GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, NUHS, BSPC, \ + TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC,BSLS, \ + CAPS,A, S, D, F, G, H, J, K, L, SCLN,QUOT,ENT, \ + LSFT,NUBS,Z, X, C, V, B, N, M, COMM,DOT, SLSH,RSFT,ESC, \ + LCTL,LGUI,LALT, SPC, APP, RALT,RGUI,RCTL), +}; +const uint16_t PROGMEM fn_actions[] = {}; diff --git a/keyboard/alps64/keymaps/hasu.c b/keyboard/alps64/keymaps/hasu.c new file mode 100644 index 000000000..d297d72fe --- /dev/null +++ b/keyboard/alps64/keymaps/hasu.c @@ -0,0 +1,151 @@ +#include "keymap_common.h" + +/* + * Hasu + */ +const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* Default Layer + * ,-----------------------------------------------------------. + * |Esc| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| \ | + * |-----------------------------------------------------------| + * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]|Bspc | + * |-----------------------------------------------------------| + * |Ctrl | A| S| D| F| G| H| J| K| L|Fn3| '|FN1 | + * |-----------------------------------------------------------| + * |Shift | Z| X| C| V| B| N| M| ,| .|Fn2|Shift | + * |-----------------------------------------------------------| + * |Ctrl |Gui |Alt | Space |Alt |Fn5 |Ctrl | + * `-----------------------------------------------------------' + */ + [0] = KEYMAP_AEK( \ + ESC, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSLS, \ + TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC,BSPC, \ + LCTL,A, S, D, F, G, H, J, K, L, FN3, QUOT,FN1, \ + LSFT,Z, X, C, V, B, N, M, COMM,DOT, FN2, RSFT, \ + LCTL,LGUI,LALT, FN4, RALT,FN5, FN0), + + /* HHKB mode[HHKB Fn] + * ,-----------------------------------------------------------. + * |Esc| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12| ` | + * |-----------------------------------------------------------| + * |Caps | | | | | | | |Psc|Slk|Pus|Up | |Del | + * |-----------------------------------------------------------| + * |Contro|VoD|VoU|Mut| | | *| /|Hom|PgU|Lef|Rig|Enter | + * |-----------------------------------------------------------| + * |Shift | | | | | | +| -|End|PgD|Dow|Shift | + * |-----------------------------------------------------------| + * |Ctrl |Gui |Alt | Space |Alt |Fn5 |Ctrl | + * `-----------------------------------------------------------' + */ + [1] = KEYMAP_AEK( \ + GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, GRV, \ + CAPS,NO, NO, NO, NO, NO, NO, NO, PSCR,SLCK,PAUS,UP, NO, DEL, \ + LCTL,VOLD,VOLU,MUTE,NO, NO, PAST,PSLS,HOME,PGUP,LEFT,RGHT,TRNS, \ + LSFT,NO, NO, NO, NO, NO, PPLS,PMNS,END, PGDN,DOWN,RSFT, \ + LCTL,LGUI,LALT, TRNS, RALT,RGUI,TRNS), + + /* Vi mode[Slash] + * ,-----------------------------------------------------------. + * |Esc| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Del | + * |-----------------------------------------------------------| + * |Tab |Hom|PgD|Up |PgU|End|Hom|PgD|PgUlEnd| | | |Backs| + * |-----------------------------------------------------------| + * |Contro| |Lef|Dow|Rig| |Lef|Dow|Up |Rig| | |Return | + * |-----------------------------------------------------------| + * |Shift | | | | | |Hom|PgD|PgUlEnd|Fn0|Shift | + * |-----------------------------------------------------------| + * |Ctrl |Gui |Alt | Space |Alt |Fn5 |Ctrl | + * `-----------------------------------------------------------' + */ + [2] = KEYMAP_AEK( \ + GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, GRV, \ + TAB, HOME,PGDN,UP, PGUP,END, HOME,PGDN,PGUP,END, NO, NO, NO, DEL, \ + LCTL,NO, LEFT,DOWN,RGHT,NO, LEFT,DOWN,UP, RGHT,NO, NO, ENT, \ + LSFT,NO, NO, NO, NO, NO, HOME,PGDN,PGUP,END, FN2, RSFT, \ + LCTL,LGUI,LALT, SPC, RALT,RGUI,RCTL), + + /* Mouse mode(IJKL)[Semicolon] + * ,-----------------------------------------------------------. + * |Esc| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Ins|Del| + * |-----------------------------------------------------------| + * |Tab | | | | | |MwL|MwD|McU|MwU|MwR|Wbk|Wfr|Alt-T| + * |-----------------------------------------------------------| + * |Contro| | | | | |Mb2|McL|McD|McR|Fn | |Return | + * |-----------------------------------------------------------| + * |Shift | | | | |Mb3|Mb2|Mb1|Mb4|Mb5| |Shift | | + * |-----------------------------------------------------------| + * |Ctrl |Gui |Alt | Space |Alt |Fn5 |Ctrl | + * `-----------------------------------------------------------' + * Mc: Mouse Cursor / Mb: Mouse Button / Mw: Mouse Wheel + */ + [3] = KEYMAP_AEK( \ + GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, GRV, \ + FN8, NO, NO, NO, NO, NO, NO, WH_D,MS_U,WH_U,RGHT,FN9, FN10,FN8, \ + LCTL,ACL0,ACL1,ACL2,ACL2,NO, NO, MS_L,MS_D,MS_R,TRNS,NO, ENT, \ + LSFT,NO, NO, NO, NO, BTN3,BTN2,BTN1,FN9, FN10,NO, RSFT, \ + LCTL,LGUI,LALT, BTN1, TRNS,TRNS,TRNS), + + /* Layer 4: Mouse mode(IJKL)[Space] + * ,-----------------------------------------------------------. + * |Esc| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Ins|Del| + * |-----------------------------------------------------------| + * |Tab | | | | | |MwL|MwD|McU|MwU|MwR|Wbk|Wfr|Alt-T| + * |-----------------------------------------------------------| + * |Contro| | | | | |Mb2|McL|McD|McR|Mb1| |Return | + * |-----------------------------------------------------------| + * |Shift | | | | |Mb3|Mb2|Mb1|Mb4|Mb5| |Shift | | + * |-----------------------------------------------------------| + * |Ctrl |Gui |Alt | Space |Alt |Fn5 |Ctrl | + * `-----------------------------------------------------------' + * Mc: Mouse Cursor / Mb: Mouse Button / Mw: Mouse Wheel + */ + [4] = KEYMAP_AEK( \ + GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, GRV, \ + FN8, NO, NO, NO, NO, NO, NO, WH_D,MS_U,WH_U,RGHT,FN9, FN10,FN8, \ + LCTL,VOLD,VOLU,MUTE,NO, NO, NO, MS_L,MS_D,MS_R,BTN1,NO, ENT, \ + LSFT,NO, NO, NO, NO, BTN3,BTN2,BTN1,FN9, FN10,NO, RSFT, \ + LCTL,LGUI,LALT, TRNS, TRNS,TRNS,TRNS), +}; + + +/* id for user defined function/macro */ +enum function_id { + NONE, +}; + +enum macro_id { + ALT_TAB, +}; + + +/* + * Fn action definition + */ +const uint16_t PROGMEM fn_actions[] = { + [0] = ACTION_LAYER_MOMENTARY(1), // HHKB layer + [1] = ACTION_LAYER_TAP_KEY(1, KC_ENTER), // HHKB layer + [2] = ACTION_LAYER_TAP_KEY(2, KC_SLASH), // Cursor layer with Slash* + [3] = ACTION_LAYER_TAP_KEY(3, KC_SCLN), // Mousekey layer with Semicolon* + [4] = ACTION_LAYER_TAP_KEY(4, KC_SPC), // Mousekey layer with Space + [5] = ACTION_LAYER_MOMENTARY(3), // Mousekey layer(IJKL) + [6] = ACTION_LAYER_TAP_KEY(MOD_RCTL, KC_ENT), // RControl with tap Enter + [7] = ACTION_MODS_ONESHOT(MOD_LSFT), // Oneshot Shift + [8] = ACTION_MACRO(ALT_TAB), // Application switching + [9] = ACTION_MODS_KEY(MOD_LALT, KC_LEFT), + [10] = ACTION_MODS_KEY(MOD_LALT, KC_RIGHT), +}; + + +/* + * Macro definition + */ +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) +{ + switch (id) { + case ALT_TAB: + return (record->event.pressed ? + MACRO( D(LALT), D(TAB), END ) : + MACRO( U(TAB), END )); + } + return MACRO_NONE; +} diff --git a/keyboard/atomic/Makefile b/keyboard/atomic/Makefile index e678b4efa..da6d0ac60 100644 --- a/keyboard/atomic/Makefile +++ b/keyboard/atomic/Makefile @@ -54,9 +54,9 @@ SRC = atomic.c \ backlight.c ifdef KEYMAP - SRC := keymaps/keymap_$(KEYMAP).c $(SRC) + SRC := keymaps/$(KEYMAP).c $(SRC) else - SRC := keymaps/keymap_default.c $(SRC) + SRC := keymaps/default.c $(SRC) endif CONFIG_H = config.h diff --git a/keyboard/atomic/README.md b/keyboard/atomic/README.md index c8e83cf55..0e42370ba 100644 --- a/keyboard/atomic/README.md +++ b/keyboard/atomic/README.md @@ -16,10 +16,10 @@ Depending on which keymap you would like to use, you will have to compile slight To build with the default keymap, simply run `make`. ### Other Keymaps -Several version of keymap are available in advance but you are recommended to define your favorite layout yourself. To define your own keymap create file named `keymap_.c` and see keymap document (you can find in top README.md) and existent keymap files. +Several version of keymap are available in advance but you are recommended to define your favorite layout yourself. To define your own keymap create a file in the keymaps folder named `.c` and see keymap document (you can find in top README.md) and existent keymap files. To build the firmware binary hex file with a keymap just do `make` with `KEYMAP` option like: ``` $ make KEYMAP=[default|jack|] ``` -Keymaps follow the format **__keymap\_\.c__** and are stored in the `keymaps` folder. +Keymaps follow the format **__\.c__** and are stored in the `keymaps` folder. diff --git a/keyboard/atomic/keymaps/abienz.c b/keyboard/atomic/keymaps/abienz.c new file mode 100644 index 000000000..589a64dc4 --- /dev/null +++ b/keyboard/atomic/keymaps/abienz.c @@ -0,0 +1,36 @@ +#include "atomic.h" + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = { /* Colemak */ + { KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_NO }, + { KC_TAB, CM_Q, CM_W, CM_F, CM_P, CM_G, CM_J, CM_L, CM_U, CM_Y, CM_SCLN, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL }, + { KC_BSPC, CM_A, CM_R, CM_S, CM_T, CM_D, CM_H, CM_N, CM_E, CM_I, CM_O, KC_QUOT, KC_ENT, KC_NO, KC_PGUP }, + { KC_LSFT, CM_Z, CM_X, CM_C, CM_V, CM_B, CM_K, CM_M, CM_COMM, CM_DOT, CM_SLSH, KC_RSFT, KC_NO, KC_UP, KC_PGDN }, + { KC_LCTL, KC_LGUI, KC_NO, KC_LALT, FUNC(1), KC_SPC, KC_NO, KC_RALT, FUNC(2), KC_RGUI, KC_NO, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT }, + }, + [1] = { /* function */ + { KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_BSPC, KC_NO }, + { KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS }, + { KC_TRNS, KC_TRNS, KC_TRNS, KC_SLEP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS }, + { KC_TRNS, KC_TRNS, KC_TRNS, KC_CALC, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_VOLU, KC_MPLY }, + { KC_TRNS, KC_TRNS, KC_NO, KC_TRNS, FUNC(1), KC_TRNS, KC_NO, KC_TRNS, FUNC(2), KC_TRNS, KC_NO, KC_TRNS, KC_MPRV, KC_VOLD, KC_MNXT }, + } +}; + +const uint16_t PROGMEM fn_actions[] = { + [1] = ACTION_LAYER_MOMENTARY(1), + [2] = ACTION_LAYER_MOMENTARY(1), + +}; + +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) +{ + // MACRODOWN only works in this function + switch(id) { + case 0: + return MACRODOWN(TYPE(KC_T), END); + break; + } + return MACRO_NONE; +}; + diff --git a/keyboard/atomic/keymaps/default.c b/keyboard/atomic/keymaps/default.c new file mode 100644 index 000000000..f37d9d9a5 --- /dev/null +++ b/keyboard/atomic/keymaps/default.c @@ -0,0 +1,79 @@ +#include "atomic.h" + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = { /* Qwerty */ + { KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_DEL }, +// ┌────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┐ +// │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ +// └────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┘ +// ┌─ 2u ────────────┐ +// │ X │ +// └─────────────────┘ + { KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL }, +// ┌────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┐ +// │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ +// └────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┘ +// ┌─ 2u ────────────┐ ┌─ 2u ────────────┐ +// │ X │ │ X │ +// └─────────────────┘ └─────────────────┘ + { KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_ENT, KC_PGUP }, +// ┌────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┐ +// │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ +// └────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┘ +// ┌─ 2u ────────────┐ ┌─ 2u ────────────┐ +// │ X │ │ X │ +// └─────────────────┘ └─────────────────┘ +// ┌─ 2u ────────────┐ +// │ X │ +// └─────────────────┘ + { KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_RSFT, KC_UP, KC_PGDN }, +// ┌────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┐ +// │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ +// └────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┘ +// ┌─ 2u ────────────┐ +// │ X │ +// └─────────────────┘ +// ┌─ 2u ────────────┐ ┌─ 2u ────────────┐ +// │ X │ │ X │ +// └─────────────────┘ └─────────────────┘ +// ┌─ 2u ────────────┐ +// │ X │ +// └─────────────────┘ + { 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 }, +// ┌────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┐ +// │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ +// └────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┘ +// ┌─ 1.25u ──┬ 1.25u ───┬─── 1.25u ┬─── 1.25u ─┬─ 2u ────────────┬─ 1.25u ──┬─ 1.25u ──┬─── 1.25u ┬──── 1.25u ┐ +// │ X │ X │ X │ X │ X │ X │ X │ X │ X │ +// └──────────┴──────────┴──────────┴───────────┴─────────────────┴──────────┴──────────┴──────────┴───────────┘ +// ┌─ 2u ────────────┐ +// │ X │ +// └─────────────────┘ +// ┌───────────────────── 6.25u ────────────────────────────┐ +// │ X │ +// └────────────────────────────────────────────────────────┘ +// ┌─────────────────────── 6.25u ──────────────────────────┬─ 1.25u ──┬─ 1.25u ──┬─ 1.25u ──┬─── 1.25u ┬── 1.25u ──┐ +// │ X │ X │ X │ X │ X │ X │ +// └────────────────────────────────────────────────────────┴──────────┴──────────┴──────────┴──────────┴───────────┘ + } +}; + +const uint16_t PROGMEM fn_actions[] = { + [1] = ACTION_LAYER_MOMENTARY(2), // to RAISE + [2] = ACTION_LAYER_MOMENTARY(3), // to LOWER + + [3] = ACTION_DEFAULT_LAYER_SET(0), + [4] = ACTION_DEFAULT_LAYER_SET(1), + +}; + +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) +{ + // MACRODOWN only works in this function + switch(id) { + case 0: + return MACRODOWN(TYPE(KC_T), END); + break; + } + return MACRO_NONE; +}; diff --git a/keyboard/atomic/keymaps/keymap_abienz.c b/keyboard/atomic/keymaps/keymap_abienz.c deleted file mode 100644 index 589a64dc4..000000000 --- a/keyboard/atomic/keymaps/keymap_abienz.c +++ /dev/null @@ -1,36 +0,0 @@ -#include "atomic.h" - -const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - [0] = { /* Colemak */ - { KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_NO }, - { KC_TAB, CM_Q, CM_W, CM_F, CM_P, CM_G, CM_J, CM_L, CM_U, CM_Y, CM_SCLN, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL }, - { KC_BSPC, CM_A, CM_R, CM_S, CM_T, CM_D, CM_H, CM_N, CM_E, CM_I, CM_O, KC_QUOT, KC_ENT, KC_NO, KC_PGUP }, - { KC_LSFT, CM_Z, CM_X, CM_C, CM_V, CM_B, CM_K, CM_M, CM_COMM, CM_DOT, CM_SLSH, KC_RSFT, KC_NO, KC_UP, KC_PGDN }, - { KC_LCTL, KC_LGUI, KC_NO, KC_LALT, FUNC(1), KC_SPC, KC_NO, KC_RALT, FUNC(2), KC_RGUI, KC_NO, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT }, - }, - [1] = { /* function */ - { KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_BSPC, KC_NO }, - { KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS }, - { KC_TRNS, KC_TRNS, KC_TRNS, KC_SLEP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS }, - { KC_TRNS, KC_TRNS, KC_TRNS, KC_CALC, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_VOLU, KC_MPLY }, - { KC_TRNS, KC_TRNS, KC_NO, KC_TRNS, FUNC(1), KC_TRNS, KC_NO, KC_TRNS, FUNC(2), KC_TRNS, KC_NO, KC_TRNS, KC_MPRV, KC_VOLD, KC_MNXT }, - } -}; - -const uint16_t PROGMEM fn_actions[] = { - [1] = ACTION_LAYER_MOMENTARY(1), - [2] = ACTION_LAYER_MOMENTARY(1), - -}; - -const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) -{ - // MACRODOWN only works in this function - switch(id) { - case 0: - return MACRODOWN(TYPE(KC_T), END); - break; - } - return MACRO_NONE; -}; - diff --git a/keyboard/atomic/keymaps/keymap_default.c b/keyboard/atomic/keymaps/keymap_default.c deleted file mode 100644 index f37d9d9a5..000000000 --- a/keyboard/atomic/keymaps/keymap_default.c +++ /dev/null @@ -1,79 +0,0 @@ -#include "atomic.h" - -const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - [0] = { /* Qwerty */ - { KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_DEL }, -// ┌────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┐ -// │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -// └────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┘ -// ┌─ 2u ────────────┐ -// │ X │ -// └─────────────────┘ - { KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL }, -// ┌────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┐ -// │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -// └────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┘ -// ┌─ 2u ────────────┐ ┌─ 2u ────────────┐ -// │ X │ │ X │ -// └─────────────────┘ └─────────────────┘ - { KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_ENT, KC_PGUP }, -// ┌────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┐ -// │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -// └────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┘ -// ┌─ 2u ────────────┐ ┌─ 2u ────────────┐ -// │ X │ │ X │ -// └─────────────────┘ └─────────────────┘ -// ┌─ 2u ────────────┐ -// │ X │ -// └─────────────────┘ - { KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_RSFT, KC_UP, KC_PGDN }, -// ┌────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┐ -// │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -// └────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┘ -// ┌─ 2u ────────────┐ -// │ X │ -// └─────────────────┘ -// ┌─ 2u ────────────┐ ┌─ 2u ────────────┐ -// │ X │ │ X │ -// └─────────────────┘ └─────────────────┘ -// ┌─ 2u ────────────┐ -// │ X │ -// └─────────────────┘ - { 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 }, -// ┌────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┐ -// │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -// └────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┘ -// ┌─ 1.25u ──┬ 1.25u ───┬─── 1.25u ┬─── 1.25u ─┬─ 2u ────────────┬─ 1.25u ──┬─ 1.25u ──┬─── 1.25u ┬──── 1.25u ┐ -// │ X │ X │ X │ X │ X │ X │ X │ X │ X │ -// └──────────┴──────────┴──────────┴───────────┴─────────────────┴──────────┴──────────┴──────────┴───────────┘ -// ┌─ 2u ────────────┐ -// │ X │ -// └─────────────────┘ -// ┌───────────────────── 6.25u ────────────────────────────┐ -// │ X │ -// └────────────────────────────────────────────────────────┘ -// ┌─────────────────────── 6.25u ──────────────────────────┬─ 1.25u ──┬─ 1.25u ──┬─ 1.25u ──┬─── 1.25u ┬── 1.25u ──┐ -// │ X │ X │ X │ X │ X │ X │ -// └────────────────────────────────────────────────────────┴──────────┴──────────┴──────────┴──────────┴───────────┘ - } -}; - -const uint16_t PROGMEM fn_actions[] = { - [1] = ACTION_LAYER_MOMENTARY(2), // to RAISE - [2] = ACTION_LAYER_MOMENTARY(3), // to LOWER - - [3] = ACTION_DEFAULT_LAYER_SET(0), - [4] = ACTION_DEFAULT_LAYER_SET(1), - -}; - -const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) -{ - // MACRODOWN only works in this function - switch(id) { - case 0: - return MACRODOWN(TYPE(KC_T), END); - break; - } - return MACRO_NONE; -}; diff --git a/keyboard/atomic/keymaps/keymap_michelle.c b/keyboard/atomic/keymaps/keymap_michelle.c deleted file mode 100644 index 2364c46a1..000000000 --- a/keyboard/atomic/keymaps/keymap_michelle.c +++ /dev/null @@ -1,183 +0,0 @@ -#include "atomic.h" - -const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - [0] = { /* Dvorak */ - { KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_LBRC, KC_RBRC, KC_BSPC, KC_NO }, -// ┌────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┐ -// │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -// └────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┘ -// ┌─ 2u ────────────┐ -// │ X │ -// └─────────────────┘ - { KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_SLSH, KC_EQL, KC_INS, KC_DEL }, -// ┌────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┐ -// │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -// └────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┘ -// ┌─ 2u ────────────┐ ┌─ 2u ────────────┐ -// │ X │ │ X │ -// └─────────────────┘ └─────────────────┘ - { KC_CAPS, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_MINS, KC_ENT, KC_NO, KC_PGUP }, -// ┌────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┐ -// │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -// └────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┘ -// ┌─ 2u ────────────┐ ┌─ 2u ────────────┐ -// │ X │ │ X │ -// └─────────────────┘ └─────────────────┘ -// ┌─ 2u ────────────┐ -// │ X │ -// └─────────────────┘ - { KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_RSFT, KC_NO, KC_UP, KC_PGDN }, -// ┌────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┐ -// │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -// └────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┘ -// ┌─ 2u ────────────┐ -// │ X │ -// └─────────────────┘ -// ┌─ 2u ────────────┐ ┌─ 2u ────────────┐ -// │ X │ │ X │ -// └─────────────────┘ └─────────────────┘ -// ┌─ 2u ────────────┐ -// │ X │ -// └─────────────────┘ - { KC_LCTL, MO(1), KC_NO, KC_LALT, KC_NO, KC_NO, KC_SPC, KC_NO, KC_NO, KC_NO, KC_LGUI, MO(2), KC_LEFT, KC_DOWN, KC_RGHT }, -// ┌────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┐ -// │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -// └────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┘ -// ┌─ 1.25u ──┬ 1.25u ───┬─── 1.25u ┬─── 1.25u ─┬─ 2u ────────────┬─ 1.25u ──┬─ 1.25u ──┬─── 1.25u ┬──── 1.25u ┐ -// │ X │ X │ X │ X │ X │ X │ X │ X │ X │ -// └──────────┴──────────┴──────────┴───────────┴─────────────────┴──────────┴──────────┴──────────┴───────────┘ -// ┌─ 2u ────────────┐ -// │ X │ -// └─────────────────┘ -// ┌───────────────────── 6.25u ────────────────────────────┐ -// │ X │ -// └────────────────────────────────────────────────────────┘ -// ┌─────────────────────── 6.25u ──────────────────────────┬─ 1.25u ──┬─ 1.25u ──┬─ 1.25u ──┬─── 1.25u ┬── 1.25u ──┐ -// │ X │ X │ X │ X │ X │ X │ -// └────────────────────────────────────────────────────────┴──────────┴──────────┴──────────┴──────────┴───────────┘ - }, - [1] = { /* Qwerty + F keys */ - { KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_BSPC, KC_NO }, -// ┌────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┐ -// │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -// └────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┘ -// ┌─ 2u ────────────┐ -// │ X │ -// └─────────────────┘ - { KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_INS, KC_DEL }, -// ┌────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┐ -// │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -// └────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┘ -// ┌─ 2u ────────────┐ ┌─ 2u ────────────┐ -// │ X │ │ X │ -// └─────────────────┘ └─────────────────┘ - { KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_NO, KC_PGUP }, -// ┌────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┐ -// │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -// └────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┘ -// ┌─ 2u ────────────┐ ┌─ 2u ────────────┐ -// │ X │ │ X │ -// └─────────────────┘ └─────────────────┘ -// ┌─ 2u ────────────┐ -// │ X │ -// └─────────────────┘ - { KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_NO, KC_UP, KC_PGDN }, -// ┌────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┐ -// │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -// └────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┘ -// ┌─ 2u ────────────┐ -// │ X │ -// └─────────────────┘ -// ┌─ 2u ────────────┐ ┌─ 2u ────────────┐ -// │ X │ │ X │ -// └─────────────────┘ └─────────────────┘ -// ┌─ 2u ────────────┐ -// │ X │ -// └─────────────────┘ - { KC_LCTL, KC_TRNS, KC_NO, KC_LALT, KC_NO, KC_NO, KC_SPC, KC_NO, KC_NO, KC_NO, KC_LGUI, KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT }, -// ┌────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┐ -// │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -// └────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┘ -// ┌─ 1.25u ──┬ 1.25u ───┬─── 1.25u ┬─── 1.25u ─┬─ 2u ────────────┬─ 1.25u ──┬─ 1.25u ──┬─── 1.25u ┬──── 1.25u ┐ -// │ X │ X │ X │ X │ X │ X │ X │ X │ X │ -// └──────────┴──────────┴──────────┴───────────┴─────────────────┴──────────┴──────────┴──────────┴───────────┘ -// ┌─ 2u ────────────┐ -// │ X │ -// └─────────────────┘ -// ┌───────────────────── 6.25u ────────────────────────────┐ -// │ X │ -// └────────────────────────────────────────────────────────┘ -// ┌─────────────────────── 6.25u ──────────────────────────┬─ 1.25u ──┬─ 1.25u ──┬─ 1.25u ──┬─── 1.25u ┬── 1.25u ──┐ -// │ X │ X │ X │ X │ X │ X │ -// └────────────────────────────────────────────────────────┴──────────┴──────────┴──────────┴──────────┴───────────┘ - }, - [2] = { /* Numpad + qwerty shortcut keys */ - { KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_P7, KC_P8, KC_P9, KC_0, KC_LBRC, KC_RBRC, KC_BSPC, KC_NO }, -// ┌────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┐ -// │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -// └────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┘ -// ┌─ 2u ────────────┐ -// │ X │ -// └─────────────────┘ - { KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_P4, KC_P5, KC_P6, KC_L, KC_SLSH, KC_EQL, KC_INS, KC_DEL }, -// ┌────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┐ -// │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -// └────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┘ -// ┌─ 2u ────────────┐ ┌─ 2u ────────────┐ -// │ X │ │ X │ -// └─────────────────┘ └─────────────────┘ - { KC_CAPS, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_P1, KC_P2, KC_P3, KC_S, KC_MINS, KC_ENT, KC_NO, KC_PGUP }, -// ┌────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┐ -// │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -// └────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┘ -// ┌─ 2u ────────────┐ ┌─ 2u ────────────┐ -// │ X │ │ X │ -// └─────────────────┘ └─────────────────┘ -// ┌─ 2u ────────────┐ -// │ X │ -// └─────────────────┘ - { KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_X, KC_B, KC_P0, KC_P0, KC_PENT, KC_Z, KC_RSFT, KC_NO, KC_UP, KC_PGDN }, -// ┌────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┐ -// │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -// └────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┘ -// ┌─ 2u ────────────┐ -// │ X │ -// └─────────────────┘ -// ┌─ 2u ────────────┐ ┌─ 2u ────────────┐ -// │ X │ │ X │ -// └─────────────────┘ └─────────────────┘ -// ┌─ 2u ────────────┐ -// │ X │ -// └─────────────────┘ - { KC_LCTL, KC_TRNS, KC_NO, KC_LALT, KC_NO, KC_NO, KC_SPC, KC_NO, KC_NO, KC_NO, KC_LGUI, KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT }, -// ┌────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┐ -// │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -// └────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┘ -// ┌─ 1.25u ──┬ 1.25u ───┬─── 1.25u ┬─── 1.25u ─┬─ 2u ────────────┬─ 1.25u ──┬─ 1.25u ──┬─── 1.25u ┬──── 1.25u ┐ -// │ X │ X │ X │ X │ X │ X │ X │ X │ X │ -// └──────────┴──────────┴──────────┴───────────┴─────────────────┴──────────┴──────────┴──────────┴───────────┘ -// ┌─ 2u ────────────┐ -// │ X │ -// └─────────────────┘ -// ┌───────────────────── 6.25u ────────────────────────────┐ -// │ X │ -// └────────────────────────────────────────────────────────┘ -// ┌─────────────────────── 6.25u ──────────────────────────┬─ 1.25u ──┬─ 1.25u ──┬─ 1.25u ──┬─── 1.25u ┬── 1.25u ──┐ -// │ X │ X │ X │ X │ X │ X │ -// └────────────────────────────────────────────────────────┴──────────┴──────────┴──────────┴──────────┴───────────┘ - }, -}; - -const uint16_t PROGMEM fn_actions[] = { -}; - -const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) -{ - // MACRODOWN only works in this function - switch(id) { - case 0: - return MACRODOWN(TYPE(KC_T), END); - break; - } - return MACRO_NONE; -}; diff --git a/keyboard/atomic/keymaps/michelle.c b/keyboard/atomic/keymaps/michelle.c new file mode 100644 index 000000000..2364c46a1 --- /dev/null +++ b/keyboard/atomic/keymaps/michelle.c @@ -0,0 +1,183 @@ +#include "atomic.h" + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = { /* Dvorak */ + { KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_LBRC, KC_RBRC, KC_BSPC, KC_NO }, +// ┌────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┐ +// │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ +// └────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┘ +// ┌─ 2u ────────────┐ +// │ X │ +// └─────────────────┘ + { KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_SLSH, KC_EQL, KC_INS, KC_DEL }, +// ┌────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┐ +// │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ +// └────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┘ +// ┌─ 2u ────────────┐ ┌─ 2u ────────────┐ +// │ X │ │ X │ +// └─────────────────┘ └─────────────────┘ + { KC_CAPS, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_MINS, KC_ENT, KC_NO, KC_PGUP }, +// ┌────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┐ +// │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ +// └────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┘ +// ┌─ 2u ────────────┐ ┌─ 2u ────────────┐ +// │ X │ │ X │ +// └─────────────────┘ └─────────────────┘ +// ┌─ 2u ────────────┐ +// │ X │ +// └─────────────────┘ + { KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_RSFT, KC_NO, KC_UP, KC_PGDN }, +// ┌────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┐ +// │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ +// └────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┘ +// ┌─ 2u ────────────┐ +// │ X │ +// └─────────────────┘ +// ┌─ 2u ────────────┐ ┌─ 2u ────────────┐ +// │ X │ │ X │ +// └─────────────────┘ └─────────────────┘ +// ┌─ 2u ────────────┐ +// │ X │ +// └─────────────────┘ + { KC_LCTL, MO(1), KC_NO, KC_LALT, KC_NO, KC_NO, KC_SPC, KC_NO, KC_NO, KC_NO, KC_LGUI, MO(2), KC_LEFT, KC_DOWN, KC_RGHT }, +// ┌────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┐ +// │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ +// └────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┘ +// ┌─ 1.25u ──┬ 1.25u ───┬─── 1.25u ┬─── 1.25u ─┬─ 2u ────────────┬─ 1.25u ──┬─ 1.25u ──┬─── 1.25u ┬──── 1.25u ┐ +// │ X │ X │ X │ X │ X │ X │ X │ X │ X │ +// └──────────┴──────────┴──────────┴───────────┴─────────────────┴──────────┴──────────┴──────────┴───────────┘ +// ┌─ 2u ────────────┐ +// │ X │ +// └─────────────────┘ +// ┌───────────────────── 6.25u ────────────────────────────┐ +// │ X │ +// └────────────────────────────────────────────────────────┘ +// ┌─────────────────────── 6.25u ──────────────────────────┬─ 1.25u ──┬─ 1.25u ──┬─ 1.25u ──┬─── 1.25u ┬── 1.25u ──┐ +// │ X │ X │ X │ X │ X │ X │ +// └────────────────────────────────────────────────────────┴──────────┴──────────┴──────────┴──────────┴───────────┘ + }, + [1] = { /* Qwerty + F keys */ + { KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_BSPC, KC_NO }, +// ┌────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┐ +// │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ +// └────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┘ +// ┌─ 2u ────────────┐ +// │ X │ +// └─────────────────┘ + { KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_INS, KC_DEL }, +// ┌────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┐ +// │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ +// └────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┘ +// ┌─ 2u ────────────┐ ┌─ 2u ────────────┐ +// │ X │ │ X │ +// └─────────────────┘ └─────────────────┘ + { KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_NO, KC_PGUP }, +// ┌────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┐ +// │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ +// └────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┘ +// ┌─ 2u ────────────┐ ┌─ 2u ────────────┐ +// │ X │ │ X │ +// └─────────────────┘ └─────────────────┘ +// ┌─ 2u ────────────┐ +// │ X │ +// └─────────────────┘ + { KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_NO, KC_UP, KC_PGDN }, +// ┌────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┐ +// │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ +// └────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┘ +// ┌─ 2u ────────────┐ +// │ X │ +// └─────────────────┘ +// ┌─ 2u ────────────┐ ┌─ 2u ────────────┐ +// │ X │ │ X │ +// └─────────────────┘ └─────────────────┘ +// ┌─ 2u ────────────┐ +// │ X │ +// └─────────────────┘ + { KC_LCTL, KC_TRNS, KC_NO, KC_LALT, KC_NO, KC_NO, KC_SPC, KC_NO, KC_NO, KC_NO, KC_LGUI, KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT }, +// ┌────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┐ +// │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ +// └────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┘ +// ┌─ 1.25u ──┬ 1.25u ───┬─── 1.25u ┬─── 1.25u ─┬─ 2u ────────────┬─ 1.25u ──┬─ 1.25u ──┬─── 1.25u ┬──── 1.25u ┐ +// │ X │ X │ X │ X │ X │ X │ X │ X │ X │ +// └──────────┴──────────┴──────────┴───────────┴─────────────────┴──────────┴──────────┴──────────┴───────────┘ +// ┌─ 2u ────────────┐ +// │ X │ +// └─────────────────┘ +// ┌───────────────────── 6.25u ────────────────────────────┐ +// │ X │ +// └────────────────────────────────────────────────────────┘ +// ┌─────────────────────── 6.25u ──────────────────────────┬─ 1.25u ──┬─ 1.25u ──┬─ 1.25u ──┬─── 1.25u ┬── 1.25u ──┐ +// │ X │ X │ X │ X │ X │ X │ +// └────────────────────────────────────────────────────────┴──────────┴──────────┴──────────┴──────────┴───────────┘ + }, + [2] = { /* Numpad + qwerty shortcut keys */ + { KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_P7, KC_P8, KC_P9, KC_0, KC_LBRC, KC_RBRC, KC_BSPC, KC_NO }, +// ┌────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┐ +// │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ +// └────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┘ +// ┌─ 2u ────────────┐ +// │ X │ +// └─────────────────┘ + { KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_P4, KC_P5, KC_P6, KC_L, KC_SLSH, KC_EQL, KC_INS, KC_DEL }, +// ┌────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┐ +// │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ +// └────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┘ +// ┌─ 2u ────────────┐ ┌─ 2u ────────────┐ +// │ X │ │ X │ +// └─────────────────┘ └─────────────────┘ + { KC_CAPS, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_P1, KC_P2, KC_P3, KC_S, KC_MINS, KC_ENT, KC_NO, KC_PGUP }, +// ┌────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┐ +// │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ +// └────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┘ +// ┌─ 2u ────────────┐ ┌─ 2u ────────────┐ +// │ X │ │ X │ +// └─────────────────┘ └─────────────────┘ +// ┌─ 2u ────────────┐ +// │ X │ +// └─────────────────┘ + { KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_X, KC_B, KC_P0, KC_P0, KC_PENT, KC_Z, KC_RSFT, KC_NO, KC_UP, KC_PGDN }, +// ┌────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┐ +// │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ +// └────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┘ +// ┌─ 2u ────────────┐ +// │ X │ +// └─────────────────┘ +// ┌─ 2u ────────────┐ ┌─ 2u ────────────┐ +// │ X │ │ X │ +// └─────────────────┘ └─────────────────┘ +// ┌─ 2u ────────────┐ +// │ X │ +// └─────────────────┘ + { KC_LCTL, KC_TRNS, KC_NO, KC_LALT, KC_NO, KC_NO, KC_SPC, KC_NO, KC_NO, KC_NO, KC_LGUI, KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT }, +// ┌────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┐ +// │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ +// └────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┘ +// ┌─ 1.25u ──┬ 1.25u ───┬─── 1.25u ┬─── 1.25u ─┬─ 2u ────────────┬─ 1.25u ──┬─ 1.25u ──┬─── 1.25u ┬──── 1.25u ┐ +// │ X │ X │ X │ X │ X │ X │ X │ X │ X │ +// └──────────┴──────────┴──────────┴───────────┴─────────────────┴──────────┴──────────┴──────────┴───────────┘ +// ┌─ 2u ────────────┐ +// │ X │ +// └─────────────────┘ +// ┌───────────────────── 6.25u ────────────────────────────┐ +// │ X │ +// └────────────────────────────────────────────────────────┘ +// ┌─────────────────────── 6.25u ──────────────────────────┬─ 1.25u ──┬─ 1.25u ──┬─ 1.25u ──┬─── 1.25u ┬── 1.25u ──┐ +// │ X │ X │ X │ X │ X │ X │ +// └────────────────────────────────────────────────────────┴──────────┴──────────┴──────────┴──────────┴───────────┘ + }, +}; + +const uint16_t PROGMEM fn_actions[] = { +}; + +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) +{ + // MACRODOWN only works in this function + switch(id) { + case 0: + return MACRODOWN(TYPE(KC_T), END); + break; + } + return MACRO_NONE; +}; diff --git a/keyboard/atreus/Makefile b/keyboard/atreus/Makefile index 2e542d62e..a6fddd70d 100644 --- a/keyboard/atreus/Makefile +++ b/keyboard/atreus/Makefile @@ -53,9 +53,9 @@ TARGET_DIR = . SRC = atreus.c ifdef KEYMAP - SRC := keymaps/keymap_$(KEYMAP).c $(SRC) + SRC := keymaps/$(KEYMAP).c $(SRC) else - SRC := keymaps/keymap_default.c $(SRC) + SRC := keymaps/default.c $(SRC) endif ifdef TEENSY2 diff --git a/keyboard/atreus/README.md b/keyboard/atreus/README.md index 4db7ac120..aacf2841f 100644 --- a/keyboard/atreus/README.md +++ b/keyboard/atreus/README.md @@ -177,10 +177,10 @@ Depending on which keymap you would like to use, you will have to compile slight To build with the default keymap, simply run `make`. ### Other Keymaps -Several version of keymap are available in advance but you are recommended to define your favorite layout yourself. To define your own keymap create file named `keymap_.c` and see keymap document (you can find in top README.md) and existent keymap files. +Several version of keymap are available in advance but you are recommended to define your favorite layout yourself. To define your own keymap create file named `.c` and see keymap document (you can find in top README.md) and existent keymap files. To build the firmware binary hex file with a keymap just do `make` with `KEYMAP` option like: ``` $ make KEYMAP=[default|jack|] ``` -Keymaps follow the format **__keymap\_\.c__** and are stored in the `keymaps` folder. +Keymaps follow the format **__\.c__** and are stored in the `keymaps` folder. diff --git a/keyboard/atreus/keymaps/default.c b/keyboard/atreus/keymaps/default.c new file mode 100644 index 000000000..1c4280ff5 --- /dev/null +++ b/keyboard/atreus/keymaps/default.c @@ -0,0 +1,51 @@ +// this is the style you want to emulate. +// This is the canonical layout file for the Quantum project. If you want to add another keyboard, + +#include "atreus.h" + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +#define _QW 0 +#define _RS 1 +#define _LW 2 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +[_QW] = { /* Qwerty */ + {KC_Q, KC_W, KC_E, KC_R, KC_T, KC_TRNS, KC_Y, KC_U, KC_I, KC_O, KC_P }, + {KC_A, KC_S, KC_D, KC_F, KC_G, KC_TRNS, KC_H, KC_J, KC_K, KC_L, KC_SCLN }, + {KC_Z, KC_X, KC_C, KC_V, KC_B, KC_LALT, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH }, + {KC_ESC, KC_TAB, KC_LGUI, KC_LSFT, KC_BSPC, KC_LCTL, KC_SPC, MO(_RS), KC_MINS, KC_QUOT, KC_ENT } +}, +[_RS] = { /* [> RAISE <] */ + {KC_EXLM, KC_AT, KC_LCBR, KC_RCBR, KC_PIPE, KC_TRNS, KC_PGUP, KC_7, KC_8, KC_9, KC_ASTR}, + {KC_HASH, KC_DLR, KC_LPRN, KC_RPRN, KC_GRV, KC_TRNS, KC_PGDN, KC_4, KC_5, KC_6, KC_PLUS}, + {KC_PERC, KC_CIRC, KC_LBRC, KC_RBRC, KC_TILD, KC_LALT, KC_AMPR, KC_1, KC_2, KC_3, KC_BSLS}, + {TG(_LW), KC_INS, KC_LGUI, KC_LSFT, KC_BSPC, KC_LCTL, KC_SPC, KC_TRNS, KC_DOT, KC_0, KC_EQL} +}, +[_LW] = { /* [> LOWER <] */ + {KC_INS, KC_HOME, KC_UP, KC_END, KC_PGUP, KC_TRNS, KC_UP, KC_F7, KC_F8, KC_F9, KC_F10}, + {KC_DELT, KC_LEFT, KC_DOWN, KC_RGHT, KC_DOWN, KC_TRNS, KC_DOWN, KC_F4, KC_F5, KC_F6, KC_F11}, + {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_LALT, KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F12}, + {KC_TRNS, KC_TRNS, KC_LGUI, KC_LSFT, KC_BSPC, KC_LCTL, KC_SPC, DF(_QW), KC_TRNS, KC_TRNS, RESET} +}}; + +const uint16_t PROGMEM fn_actions[] = { + +}; + +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) +{ + // MACRODOWN only works in this function + switch(id) { + case 0: + if (record->event.pressed) { + register_code(KC_RSFT); + } else { + unregister_code(KC_RSFT); + } + break; + } + return MACRO_NONE; +}; diff --git a/keyboard/atreus/keymaps/gerb.c b/keyboard/atreus/keymaps/gerb.c new file mode 100644 index 000000000..1ba3942e3 --- /dev/null +++ b/keyboard/atreus/keymaps/gerb.c @@ -0,0 +1,66 @@ +// This is the personal keymap of Chris Gerber (@gerbercj). I haven't worked out the kinks +// with the Colemak and Dvorak support yet, but everything else works nicely. + +#include "atreus.h" + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +#define _QW 0 +#define _CM 1 +#define _DV 2 +#define _L1 3 +#define _L2 4 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [_QW] = { /* Qwerty */ + {KC_Q, KC_W, KC_E, KC_R, KC_T, KC_NO, KC_Y, KC_U, KC_I, KC_O, KC_P }, + {KC_A, KC_S, KC_D, KC_F, KC_G, KC_NO, KC_H, KC_J, KC_K, KC_L, KC_SCLN}, + {KC_Z, KC_X, KC_C, KC_V, KC_B, KC_LALT, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH}, + {KC_ESC, KC_TAB, KC_LGUI, KC_LSFT, KC_BSPC, KC_RCTL, KC_SPC, MO(_L1), KC_MINS, KC_QUOT, KC_ENT } + }, + [_CM] = { /* Colemak */ + {KC_Q, KC_W, KC_F, KC_P, KC_G, KC_NO, KC_J, KC_L, KC_U, KC_Y, KC_SCLN}, + {KC_A, KC_R, KC_S, KC_T, KC_D, KC_NO, KC_H, KC_N, KC_E, KC_I, KC_O }, + {KC_Z, KC_X, KC_C, KC_V, KC_B, KC_LALT, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH}, + {KC_ESC, KC_TAB, KC_LGUI, KC_LSFT, KC_BSPC, KC_RCTL, KC_SPC, MO(_L1), KC_MINS, KC_QUOT, KC_ENT } + }, + [_DV] = { /* Dvorak */ + {KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_NO, KC_F, KC_G, KC_C, KC_R, KC_L }, + {KC_A, KC_O, KC_E, KC_U, KC_I, KC_NO, KC_D, KC_H, KC_T, KC_N, KC_S }, + {KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_LALT, KC_B, KC_M, KC_W, KC_V, KC_Z }, + {KC_ESC, KC_TAB, KC_LGUI, KC_LSFT, KC_BSPC, KC_RCTL, KC_SPC, MO(_L1), KC_MINS, KC_SLSH, KC_ENT } + }, + [_L1] = { /* LAYER 1 */ + {KC_INS, KC_HOME, KC_UP, KC_END, KC_PGUP, KC_NO, KC_VOLU, KC_7, KC_8, KC_9, KC_LBRC}, + {KC_DEL, KC_LEFT, KC_DOWN, KC_RGHT, KC_PGDN, KC_NO, KC_VOLD, KC_4, KC_5, KC_6, KC_RBRC}, + {KC_GRV, KC_MPRV, KC_MPLY, KC_MNXT, KC_MINS, KC_LALT, KC_MUTE, KC_1, KC_2, KC_3, KC_BSLS}, + {TG(_L2), KC_APP, KC_LGUI, KC_LSFT, KC_BSPC, KC_RCTL, KC_SPC, KC_TRNS, KC_DOT, KC_0, KC_EQL } + }, + [_L2] = { /* LAYER 2 */ + {KC_TRNS, KC_WH_L, KC_MS_U, KC_WH_R, KC_WH_U, KC_NO, DF(_QW), KC_F7, KC_F8, KC_F9, KC_F10 }, + {KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R, KC_WH_D, KC_NO, DF(_CM), KC_F6, KC_F5, KC_F6, KC_F11 }, + {KC_BTN4, KC_BTN1, KC_BTN2, KC_BTN3, KC_BTN4, KC_LALT, DF(_DV), KC_F1, KC_F2, KC_F3, KC_F12 }, + {KC_TRNS, KC_TRNS, KC_LGUI, KC_LSFT, KC_BSPC, KC_RCTL, KC_SPC, KC_TRNS, KC_TRNS, KC_TRNS, RESET } + } +}; + +const uint16_t PROGMEM fn_actions[] = { + +}; + +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) +{ + // MACRODOWN only works in this function + switch(id) { + case 0: + if (record->event.pressed) { + register_code(KC_RSFT); + } else { + unregister_code(KC_RSFT); + } + break; + } + return MACRO_NONE; +}; diff --git a/keyboard/atreus/keymaps/keymap_default.c b/keyboard/atreus/keymaps/keymap_default.c deleted file mode 100644 index 1c4280ff5..000000000 --- a/keyboard/atreus/keymaps/keymap_default.c +++ /dev/null @@ -1,51 +0,0 @@ -// this is the style you want to emulate. -// This is the canonical layout file for the Quantum project. If you want to add another keyboard, - -#include "atreus.h" - -// Each layer gets a name for readability, which is then used in the keymap matrix below. -// The underscores don't mean anything - you can have a layer called STUFF or any other name. -// Layer names don't all need to be of the same length, obviously, and you can also skip them -// entirely and just use numbers. -#define _QW 0 -#define _RS 1 -#define _LW 2 - -const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { -[_QW] = { /* Qwerty */ - {KC_Q, KC_W, KC_E, KC_R, KC_T, KC_TRNS, KC_Y, KC_U, KC_I, KC_O, KC_P }, - {KC_A, KC_S, KC_D, KC_F, KC_G, KC_TRNS, KC_H, KC_J, KC_K, KC_L, KC_SCLN }, - {KC_Z, KC_X, KC_C, KC_V, KC_B, KC_LALT, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH }, - {KC_ESC, KC_TAB, KC_LGUI, KC_LSFT, KC_BSPC, KC_LCTL, KC_SPC, MO(_RS), KC_MINS, KC_QUOT, KC_ENT } -}, -[_RS] = { /* [> RAISE <] */ - {KC_EXLM, KC_AT, KC_LCBR, KC_RCBR, KC_PIPE, KC_TRNS, KC_PGUP, KC_7, KC_8, KC_9, KC_ASTR}, - {KC_HASH, KC_DLR, KC_LPRN, KC_RPRN, KC_GRV, KC_TRNS, KC_PGDN, KC_4, KC_5, KC_6, KC_PLUS}, - {KC_PERC, KC_CIRC, KC_LBRC, KC_RBRC, KC_TILD, KC_LALT, KC_AMPR, KC_1, KC_2, KC_3, KC_BSLS}, - {TG(_LW), KC_INS, KC_LGUI, KC_LSFT, KC_BSPC, KC_LCTL, KC_SPC, KC_TRNS, KC_DOT, KC_0, KC_EQL} -}, -[_LW] = { /* [> LOWER <] */ - {KC_INS, KC_HOME, KC_UP, KC_END, KC_PGUP, KC_TRNS, KC_UP, KC_F7, KC_F8, KC_F9, KC_F10}, - {KC_DELT, KC_LEFT, KC_DOWN, KC_RGHT, KC_DOWN, KC_TRNS, KC_DOWN, KC_F4, KC_F5, KC_F6, KC_F11}, - {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_LALT, KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F12}, - {KC_TRNS, KC_TRNS, KC_LGUI, KC_LSFT, KC_BSPC, KC_LCTL, KC_SPC, DF(_QW), KC_TRNS, KC_TRNS, RESET} -}}; - -const uint16_t PROGMEM fn_actions[] = { - -}; - -const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) -{ - // MACRODOWN only works in this function - switch(id) { - case 0: - if (record->event.pressed) { - register_code(KC_RSFT); - } else { - unregister_code(KC_RSFT); - } - break; - } - return MACRO_NONE; -}; diff --git a/keyboard/atreus/keymaps/keymap_gerb.c b/keyboard/atreus/keymaps/keymap_gerb.c deleted file mode 100644 index 1ba3942e3..000000000 --- a/keyboard/atreus/keymaps/keymap_gerb.c +++ /dev/null @@ -1,66 +0,0 @@ -// This is the personal keymap of Chris Gerber (@gerbercj). I haven't worked out the kinks -// with the Colemak and Dvorak support yet, but everything else works nicely. - -#include "atreus.h" - -// Each layer gets a name for readability, which is then used in the keymap matrix below. -// The underscores don't mean anything - you can have a layer called STUFF or any other name. -// Layer names don't all need to be of the same length, obviously, and you can also skip them -// entirely and just use numbers. -#define _QW 0 -#define _CM 1 -#define _DV 2 -#define _L1 3 -#define _L2 4 - -const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - [_QW] = { /* Qwerty */ - {KC_Q, KC_W, KC_E, KC_R, KC_T, KC_NO, KC_Y, KC_U, KC_I, KC_O, KC_P }, - {KC_A, KC_S, KC_D, KC_F, KC_G, KC_NO, KC_H, KC_J, KC_K, KC_L, KC_SCLN}, - {KC_Z, KC_X, KC_C, KC_V, KC_B, KC_LALT, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH}, - {KC_ESC, KC_TAB, KC_LGUI, KC_LSFT, KC_BSPC, KC_RCTL, KC_SPC, MO(_L1), KC_MINS, KC_QUOT, KC_ENT } - }, - [_CM] = { /* Colemak */ - {KC_Q, KC_W, KC_F, KC_P, KC_G, KC_NO, KC_J, KC_L, KC_U, KC_Y, KC_SCLN}, - {KC_A, KC_R, KC_S, KC_T, KC_D, KC_NO, KC_H, KC_N, KC_E, KC_I, KC_O }, - {KC_Z, KC_X, KC_C, KC_V, KC_B, KC_LALT, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH}, - {KC_ESC, KC_TAB, KC_LGUI, KC_LSFT, KC_BSPC, KC_RCTL, KC_SPC, MO(_L1), KC_MINS, KC_QUOT, KC_ENT } - }, - [_DV] = { /* Dvorak */ - {KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_NO, KC_F, KC_G, KC_C, KC_R, KC_L }, - {KC_A, KC_O, KC_E, KC_U, KC_I, KC_NO, KC_D, KC_H, KC_T, KC_N, KC_S }, - {KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_LALT, KC_B, KC_M, KC_W, KC_V, KC_Z }, - {KC_ESC, KC_TAB, KC_LGUI, KC_LSFT, KC_BSPC, KC_RCTL, KC_SPC, MO(_L1), KC_MINS, KC_SLSH, KC_ENT } - }, - [_L1] = { /* LAYER 1 */ - {KC_INS, KC_HOME, KC_UP, KC_END, KC_PGUP, KC_NO, KC_VOLU, KC_7, KC_8, KC_9, KC_LBRC}, - {KC_DEL, KC_LEFT, KC_DOWN, KC_RGHT, KC_PGDN, KC_NO, KC_VOLD, KC_4, KC_5, KC_6, KC_RBRC}, - {KC_GRV, KC_MPRV, KC_MPLY, KC_MNXT, KC_MINS, KC_LALT, KC_MUTE, KC_1, KC_2, KC_3, KC_BSLS}, - {TG(_L2), KC_APP, KC_LGUI, KC_LSFT, KC_BSPC, KC_RCTL, KC_SPC, KC_TRNS, KC_DOT, KC_0, KC_EQL } - }, - [_L2] = { /* LAYER 2 */ - {KC_TRNS, KC_WH_L, KC_MS_U, KC_WH_R, KC_WH_U, KC_NO, DF(_QW), KC_F7, KC_F8, KC_F9, KC_F10 }, - {KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R, KC_WH_D, KC_NO, DF(_CM), KC_F6, KC_F5, KC_F6, KC_F11 }, - {KC_BTN4, KC_BTN1, KC_BTN2, KC_BTN3, KC_BTN4, KC_LALT, DF(_DV), KC_F1, KC_F2, KC_F3, KC_F12 }, - {KC_TRNS, KC_TRNS, KC_LGUI, KC_LSFT, KC_BSPC, KC_RCTL, KC_SPC, KC_TRNS, KC_TRNS, KC_TRNS, RESET } - } -}; - -const uint16_t PROGMEM fn_actions[] = { - -}; - -const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) -{ - // MACRODOWN only works in this function - switch(id) { - case 0: - if (record->event.pressed) { - register_code(KC_RSFT); - } else { - unregister_code(KC_RSFT); - } - break; - } - return MACRO_NONE; -}; diff --git a/keyboard/gh60/Makefile b/keyboard/gh60/Makefile index daba0f644..4c8f9dc8a 100644 --- a/keyboard/gh60/Makefile +++ b/keyboard/gh60/Makefile @@ -53,9 +53,9 @@ SRC = keymap_common.c \ led.c ifdef KEYMAP - SRC := keymap_$(KEYMAP).c $(SRC) + SRC := keymaps/$(KEYMAP).c $(SRC) else - SRC := keymap_poker.c $(SRC) + SRC := keymaps/poker.c $(SRC) endif CONFIG_H = config.h diff --git a/keyboard/gh60/Makefile.pjrc b/keyboard/gh60/Makefile.pjrc index 11bd3b784..8ed73a248 100644 --- a/keyboard/gh60/Makefile.pjrc +++ b/keyboard/gh60/Makefile.pjrc @@ -53,9 +53,9 @@ SRC = keymap_common.c \ led.c ifdef KEYMAP - SRC := keymap_$(KEYMAP).c $(SRC) + SRC := keymaps/$(KEYMAP).c $(SRC) else - SRC := keymap_poker.c $(SRC) + SRC := keymaps/poker.c $(SRC) endif CONFIG_H = config.h diff --git a/keyboard/gh60/README.md b/keyboard/gh60/README.md index 510cb5c8b..41a757ea3 100644 --- a/keyboard/gh60/README.md +++ b/keyboard/gh60/README.md @@ -21,7 +21,7 @@ Use `make -f Makefile.pjrc` if you want to use PJRC stack but I find no reason t ## Keymap -Several version of keymap are available in advance but you are recommended to define your favorite layout yourself. To define your own keymap create file named `keymap_.c` and see keymap document(you can find in top README.md) and existent keymap files. +Several version of keymap are available in advance but you are recommended to define your favorite layout yourself. To define your own keymap create file named `.c` in the keymaps folder, and see keymap document(you can find in top README.md) and existent keymap files. To build firmware binary hex file with a certain keymap just do `make` with `KEYMAP` option like: @@ -29,8 +29,8 @@ To build firmware binary hex file with a certain keymap just do `make` with `KEY ### 1 Poker -[keymap_poker.c](keymap_poker.c) emulates original Poker layers -while both [keymap_poker_bit.c](keymap_poker_bit.c) and [keymap_poker_set.c](keymap_poker_set.c) implements same layout in different way and they fix a minor issue of original Poker and enhance arrow keys. +[poker.c](keymaps/poker.c) emulates original Poker layers +while both [poker_bit.c](keymaps/poker_bit.c) and [poker_set.c](keymaps/poker_set.c) implement the same layout in different ways and they fix a minor issue of original Poker and enhance arrow keys. Fn + Esc = ` Fn + {left, down, up, right} = {home, pgdown, pgup, end} @@ -63,7 +63,7 @@ while both [keymap_poker_bit.c](keymap_poker_bit.c) and [keymap_poker_set.c](key ### 2. Plain Without any Fn layer this will be useful if you want to use key remapping tool like AHK on host. -See [keymap_plain.c](keymap_plain.c) for detail. +See [plain.c](keymaps/plain.c) for detail. #### 1.0 Plain Default layer ,-----------------------------------------------------------. @@ -80,11 +80,11 @@ See [keymap_plain.c](keymap_plain.c) for detail. ### 3. Hasu -This is my favorite keymap with HHKB Fn, Vi cursor and Mousekey layer. See [keymap_hasu.c](keymap_hasu.c) for detail. +This is my favorite keymap with HHKB Fn, Vi cursor and Mousekey layer. See [hasu.c](keymaps/hasu.c) for detail. ### 4. SpaceFN -This layout proposed by spiceBar uses space bar to change layer with using Dual role key technique. See [keymap_spacefn.c](keymap_spacefn.c) and [SpaceFN discussion](http://geekhack.org/index.php?topic=51069.0). +This layout proposed by spiceBar uses space bar to change layer with using Dual role key technique. See [spacefn.c](keymaps/spacefn.c) and [SpaceFN discussion](http://geekhack.org/index.php?topic=51069.0). #### 4.0 Default layer ,-----------------------------------------------------------. @@ -113,7 +113,7 @@ This layout proposed by spiceBar uses space bar to change layer with using Dual ### 5. HHKB -[keymap_hhkb.c](keymap_hhkb.c) emulates original HHKB layers. +[hhkb.c](keymaps/hhkb.c) emulates original HHKB layers. #### 5.0: Default layer ,-----------------------------------------------------------. |Esc| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| \| `| diff --git a/keyboard/gh60/keymap_hasu.c b/keyboard/gh60/keymap_hasu.c deleted file mode 100644 index e6af28585..000000000 --- a/keyboard/gh60/keymap_hasu.c +++ /dev/null @@ -1,145 +0,0 @@ -#include "keymap_common.h" - -/* - * Hasu - */ -const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - /* Keymap 0: Default Layer - * ,-----------------------------------------------------------. - * |Esc| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backsp | - * |-----------------------------------------------------------| - * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \| - * |-----------------------------------------------------------| - * |Caps | A| S| D| F| G| H| J| K| L|Fn3| '|Return | - * |-----------------------------------------------------------| - * |Shift | Z| X| C| V| B| N| M| ,| .|Fn2|Shift | - * |-----------------------------------------------------------| - * |Ctrl|Gui |Alt | Space |Alt |Fn4 |Fn4 |Fn1 | - * `-----------------------------------------------------------' - */ - KEYMAP_ANSI( - ESC, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSPC, \ - TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC,BSLS, \ - LCTL,A, S, D, F, G, H, J, K, L, FN2, QUOT, ENT, \ - LSFT,Z, X, C, V, B, N, M, COMM,DOT, FN1, FN9, \ - LCTL,LGUI,LALT, SPC, RALT,FN3, FN3, FN0), - /* Keymap 1: colemak */ - KEYMAP_ANSI( - GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSPC, \ - TAB, Q, W, F, P, G, J, L, U, Y, SCLN,LBRC,RBRC,BSLS, \ - BSPC,A, R, S, T, D, H, N, E, I, O, QUOT, ENT, \ - LSFT,Z, X, C, V, B, K, M, COMM,DOT, SLSH, RSFT, \ - LCTL,LGUI,LALT, SPC, RALT,RGUI,APP, FN0), - /* Keymap 2: dvorak */ - KEYMAP_ANSI( - GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, LBRC,RBRC,BSPC, \ - TAB, QUOT,COMM,DOT, P, Y, F, G, C, R, L, SLSH,EQL, BSLS, \ - CAPS,A, O, E, U, I, D, H, T, N, S, MINS, ENT, \ - LSFT,SCLN,Q, J, K, X, B, M, W, V, Z, RSFT, \ - LCTL,LGUI,LALT, SPC, RALT,RGUI,APP, FN0), - /* Keymap 3: workman */ - KEYMAP_ANSI( - GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSPC, \ - TAB, Q, D, R, W, B, J, F, U, P, SCLN,LBRC,RBRC,BSLS, \ - BSPC,A, S, H, T, G, Y, N, E, O, I, QUOT, ENT, \ - LSFT,Z, X, M, C, V, K, L, COMM,DOT, SLSH, RSFT, \ - LCTL,LGUI,LALT, SPC, RALT,RGUI,APP, FN0), - - /* Overlay 4: HHKB mode - * ,-----------------------------------------------------------. - * |Esc| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Delete | - * |-----------------------------------------------------------| - * |Caps | | | | | | | |Psc|Slk|Pus|Up | |Inser| - * |-----------------------------------------------------------| - * |Contro|VoD|VoU|Mut| | | *| /|Hom|PgU|Lef|Rig|Enter | - * |-----------------------------------------------------------| - * |Shift | | | | | | +| -|End|PgD|Dow|Shift | - * |-----------------------------------------------------------| - * |Ctrl|Gui |Alt | Space |Alt |Gui |App | | - * `-----------------------------------------------------------' - */ - KEYMAP_ANSI( - GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, DEL, \ - CAPS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,PSCR,SLCK,PAUS,UP, TRNS,INS, \ - LCTL,VOLD,VOLU,MUTE,TRNS,TRNS,PAST,PSLS,HOME,PGUP,LEFT,RGHT, ENT, \ - LSFT,TRNS,TRNS,TRNS,TRNS,TRNS,PPLS,PMNS,END, PGDN,DOWN, RSFT, \ - LCTL,LGUI,LALT, SPC, RALT,RGUI,FN4, TRNS), - /* Overlay 5: Vi mode (Slash) - * ,-----------------------------------------------------------. - * | `| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Backsp | - * |-----------------------------------------------------------| - * |Tab |Hom|PgD|Up |PgU|End|Hom|PgD|PgU|End| | | | | - * |-----------------------------------------------------------| - * |Contro| |Lef|Dow|Rig| |Lef|Dow|Up |Rig| | |Return | - * |-----------------------------------------------------------| - * |Shift | | | | | |Hom|PgD|PgU|End| |Shift | - * |-----------------------------------------------------------| - * |Ctrl|Gui |Alt | Space |Alt |Gui |App |Ctrl| - * `-----------------------------------------------------------' - */ - KEYMAP_ANSI( - GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, BSPC, \ - TAB, HOME,PGDN,UP, PGUP,END, HOME,PGDN,PGUP,END, TRNS,TRNS,TRNS,TRNS, \ - LCTL,TRNS,LEFT,DOWN,RGHT,TRNS,LEFT,DOWN,UP, RGHT,TRNS,TRNS, ENT, \ - LSFT,TRNS,TRNS,TRNS,TRNS,TRNS,HOME,PGDN,PGUP,END, TRNS, RSFT, \ - LCTL,LGUI,LALT, SPC, RALT,RGUI,APP, RCTL), - /* Overlay 6: Mouse mode (Semicolon/App) - * ,-----------------------------------------------------------. - * | `| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Backsp | - * |-----------------------------------------------------------| - * |Tab | | | | | |MwL|MwD|MwU|MwR| | | | | - * |-----------------------------------------------------------| - * |Contro| |Ac0|Ac1|Ac1| |McL|McD|McU|McR| | |Return | - * |-----------------------------------------------------------| - * |Shift | | | | |Mb3|Mb2|Mb1|Mb4|Mb5| |Shift | - * |-----------------------------------------------------------| - * |Ctrl|Gui |Alt | Space | | | | | - * `-----------------------------------------------------------' - * Mc: Mouse Cursor / Mb: Mouse Button / Mw: Mouse Wheel - */ - KEYMAP_ANSI( - GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, BSPC, \ - TAB, TRNS,TRNS,TRNS,TRNS,TRNS,WH_L,WH_D,WH_U,WH_R,TRNS,TRNS,TRNS,TRNS, \ - LCTL,TRNS,ACL0,ACL1,ACL2,TRNS,MS_L,MS_D,MS_U,MS_R,TRNS,TRNS, ENT, \ - LSFT,TRNS,TRNS,TRNS,TRNS,BTN3,BTN2,BTN1,BTN4,BTN5,TRNS, RSFT, \ - LCTL,LGUI,LALT, BTN1, TRNS,TRNS,TRNS,RCTL), - /* Overlay 7: Layout selector - * ,-----------------------------------------------------------. - * | Lq| Lc| Ld| Lw| | | | | | | | | | | - * |-----------------------------------------------------------| - * | |Lq |Lw | | | | | | | | | | | | - * |-----------------------------------------------------------| - * | | | |Ld | | | | | | | | | | - * |-----------------------------------------------------------| - * | | | |Lc | | | | | | | | | - * |-----------------------------------------------------------| - * | | | | | | | | | - * `-----------------------------------------------------------' - * Lq: set Qwerty layout - * Lc: set Colemak layout - * Ld: set Dvorak layout - * Lw: set Workman layout - */ - KEYMAP_ANSI( - FN5, FN6, FN7, FN8, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \ - TRNS,FN5, FN8, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \ - TRNS,TRNS,TRNS,FN7, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS, \ - TRNS,TRNS,TRNS,FN6, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS, \ - TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS,TRNS), -}; - -/* - * Fn action definition - */ -const uint16_t PROGMEM fn_actions[] = { - [0] = ACTION_LAYER_MOMENTARY(4), - [1] = ACTION_LAYER_TAP_KEY(5, KC_SLASH), - [2] = ACTION_LAYER_TAP_KEY(6, KC_SCLN), - [3] = ACTION_LAYER_MOMENTARY(6), - [4] = ACTION_LAYER_MOMENTARY(7), // to Layout selector - [5] = ACTION_DEFAULT_LAYER_SET(0), // set qwerty layout - [6] = ACTION_DEFAULT_LAYER_SET(1), // set colemak layout - [7] = ACTION_DEFAULT_LAYER_SET(2), // set dvorak layout - [8] = ACTION_DEFAULT_LAYER_SET(3), // set workman layout - [9] = ACTION_MODS_TAP_KEY(MOD_RSFT, KC_GRV), -}; diff --git a/keyboard/gh60/keymap_hhkb.c b/keyboard/gh60/keymap_hhkb.c deleted file mode 100644 index ce1b816ec..000000000 --- a/keyboard/gh60/keymap_hhkb.c +++ /dev/null @@ -1,52 +0,0 @@ -#include "keymap_common.h" - -/* - * HHKB Layout - */ -const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - /* 0: Default layer - * ,-----------------------------------------------------------. - * |Esc| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| \| `| - * |-----------------------------------------------------------| - * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]|Bspc | - * |-----------------------------------------------------------| - * |Ctrl | A| S| D| F| G| H| J| K| L|Fn3| '|Return | - * |-----------------------------------------------------------| - * |Shift | Z| X| C| V| B| N| M| ,| .| /|Shift |Fn | - * |-----------------------------------------------------------| - * | |Gui |Alt | Space | |Alt |Gui | | - * `-----------------------------------------------------------' - */ - KEYMAP_HHKB( - ESC, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSLS, GRV, \ - TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC,BSPC, \ - LCTL,A, S, D, F, G, H, J, K, L, SCLN,QUOT, ENT, \ - LSFT,Z, X, C, V, B, N, M, COMM,DOT, SLSH, RSFT,FN0, \ - NO, LGUI,LALT, SPC, NO, RALT,RGUI,NO), - /* 1: HHKB Fn layer - * ,-----------------------------------------------------------. - * |Pwr| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Ins|Del| - * |-----------------------------------------------------------| - * |Caps | | | | | | | |Psc|Slk|Pus|Up | | | - * |-----------------------------------------------------------| - * | |VoD|VoU|Mut|Ejc| | *| /|Hom|PgU|Lef|Rig|Enter | - * |-----------------------------------------------------------| - * | | | | | | | +| -|End|PgD|Dow| | | - * |-----------------------------------------------------------| - * | | | | | | | | | - * `-----------------------------------------------------------' - */ - KEYMAP_HHKB( - PWR, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, \ - CAPS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,PSCR,SLCK,PAUS,UP, TRNS,TRNS, \ - TRNS,VOLD,VOLU,MUTE,EJCT,TRNS,PAST,PSLS,HOME,PGUP,LEFT,RGHT, PENT, \ - TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,PPLS,PMNS,END, PGDN,DOWN, TRNS,TRNS, \ - TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS,TRNS), -}; - -/* - * Fn action definition - */ -const uint16_t PROGMEM fn_actions[] = { - [0] = ACTION_LAYER_MOMENTARY(1), -}; diff --git a/keyboard/gh60/keymap_plain.c b/keyboard/gh60/keymap_plain.c deleted file mode 100644 index 3138c1807..000000000 --- a/keyboard/gh60/keymap_plain.c +++ /dev/null @@ -1,11 +0,0 @@ -#include "keymap_common.h" - -const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - /* 0: qwerty */ - KEYMAP(ESC, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSPC, \ - TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC,BSLS, \ - CAPS,A, S, D, F, G, H, J, K, L, SCLN,QUOT,NO, ENT, \ - LSFT,NO, Z, X, C, V, B, N, M, COMM,DOT, SLSH,NO, RSFT, \ - LCTL,LGUI,LALT, SPC, RALT,RGUI,APP, RCTL), -}; -const uint16_t PROGMEM fn_actions[] = {}; diff --git a/keyboard/gh60/keymap_poker.c b/keyboard/gh60/keymap_poker.c deleted file mode 100644 index 7a612ee44..000000000 --- a/keyboard/gh60/keymap_poker.c +++ /dev/null @@ -1,104 +0,0 @@ -#include "keymap_common.h" - -const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - /* 0: qwerty */ - KEYMAP_ANSI( - GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSPC, \ - TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC,BSLS, \ - CAPS,A, S, D, F, G, H, J, K, L, SCLN,QUOT, ENT, \ - LSFT,Z, X, C, V, B, N, M, COMM,DOT, SLSH, RSFT, \ - LCTL,LGUI,LALT, SPC, FN0, RGUI,APP, RCTL), - /* 1: colemak */ - KEYMAP_ANSI( - GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSPC, \ - TAB, Q, W, F, P, G, J, L, U, Y, SCLN,LBRC,RBRC,BSLS, \ - BSPC,A, R, S, T, D, H, N, E, I, O, QUOT, ENT, \ - LSFT,Z, X, C, V, B, K, M, COMM,DOT, SLSH, RSFT, \ - LCTL,LGUI,LALT, SPC, FN0, RGUI,APP, RCTL), - /* 2: dvorak */ - KEYMAP_ANSI( - GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, LBRC,RBRC,BSPC, \ - TAB, QUOT,COMM,DOT, P, Y, F, G, C, R, L, SLSH,EQL, BSLS, \ - CAPS,A, O, E, U, I, D, H, T, N, S, MINS, ENT, \ - LSFT,SCLN,Q, J, K, X, B, M, W, V, Z, RSFT, \ - LCTL,LGUI,LALT, SPC, FN0, RGUI,APP, RCTL), - /* 3: workman */ - KEYMAP_ANSI( - GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSPC, \ - TAB, Q, D, R, W, B, J, F, U, P, SCLN,LBRC,RBRC,BSLS, \ - BSPC,A, S, H, T, G, Y, N, E, O, I, QUOT, ENT, \ - LSFT,Z, X, M, C, V, K, L, COMM,DOT, SLSH, RSFT, \ - LCTL,LGUI,LALT, SPC, FN0, RGUI,APP, RCTL), - /* 4: Poker with Arrow */ - KEYMAP_ANSI( - TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \ - TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \ - TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS, \ - TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, UP, \ - TRNS,TRNS,TRNS, TRNS, TRNS,LEFT,DOWN,RGHT), - /* 5: Poker with Esc */ - KEYMAP_ANSI( - ESC, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \ - TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \ - TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS, \ - TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS, \ - TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS,TRNS), - /* 6: Poker Fn - * ,-----------------------------------------------------------. - * |Esc| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12| | - * |-----------------------------------------------------------| - * | |FnQ| Up| | | | | | |Cal| |Hom|Ins|FnL | - * |-----------------------------------------------------------| - * | |Lef|Dow|Rig| | |Psc|Slk|Pau| |Tsk|End| | - * |-----------------------------------------------------------| - * | |Del| |Web|Mut|VoU|VoD| |PgU|PgD|Del| | - * |-----------------------------------------------------------| - * | | | | FnS | | | | | - * `-----------------------------------------------------------' - * Fn: to Fn overlay - * FnL: to Layout selector overaly - * FnQ: toggle Esc overlay - * FnS: toggle Arrow overlay - */ - KEYMAP_ANSI( - ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, TRNS, \ - TRNS,FN2, UP, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,CALC,TRNS,HOME,INS, FN4, \ - TRNS,LEFT,DOWN,RGHT,TRNS,TRNS,PSCR,SLCK,PAUS,TRNS,FN3, END, TRNS, \ - TRNS,DEL, TRNS,WHOM,MUTE,VOLU,VOLD,TRNS,PGUP,PGDN,DEL, TRNS, \ - TRNS,TRNS,TRNS, FN1, TRNS,TRNS,TRNS,TRNS), - /* 7: Layout selector - * ,-----------------------------------------------------------. - * | Lq| Lc| Ld| Lw| | | | | | | | | | | - * |-----------------------------------------------------------| - * | |Lq |Lw | | | | | | | | | | | | - * |-----------------------------------------------------------| - * | | | |Ld | | | | | | | | | | - * |-----------------------------------------------------------| - * | | | |Lc | | | | | | | | | - * |-----------------------------------------------------------| - * | | | | | | | | | - * `-----------------------------------------------------------' - * Lq: set Qwerty layout - * Lc: set Colemak layout - * Ld: set Dvorak layout - * Lw: set Workman layout - */ - KEYMAP_ANSI( - FN5, FN6, FN7, FN8, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \ - TRNS,FN5, FN8, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \ - TRNS,TRNS,TRNS,FN7, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS, \ - TRNS,TRNS,TRNS,FN6, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS, \ - TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS,TRNS), -}; -const uint16_t PROGMEM fn_actions[] = { - /* Poker Layout */ - [0] = ACTION_LAYER_MOMENTARY(6), // to Fn overlay - [1] = ACTION_LAYER_TOGGLE(4), // toggle arrow overlay - [2] = ACTION_LAYER_TOGGLE(5), // toggle Esc overlay - [3] = ACTION_MODS_KEY(MOD_RCTL|MOD_RSFT, KC_ESC), // Task(RControl,RShift+Esc) - [4] = ACTION_LAYER_MOMENTARY(7), // to Layout selector - [5] = ACTION_DEFAULT_LAYER_SET(0), // set qwerty layout - [6] = ACTION_DEFAULT_LAYER_SET(1), // set colemak layout - [7] = ACTION_DEFAULT_LAYER_SET(2), // set dvorak layout - [8] = ACTION_DEFAULT_LAYER_SET(3), // set workman layout -}; diff --git a/keyboard/gh60/keymap_poker_bit.c b/keyboard/gh60/keymap_poker_bit.c deleted file mode 100644 index b8870fdd8..000000000 --- a/keyboard/gh60/keymap_poker_bit.c +++ /dev/null @@ -1,50 +0,0 @@ -#include "keymap_common.h" - -// Poker fix with toggle and bit operation -// Fn + Esc = ` -// Fn + {left, down, up, right} = {home, pgdown, pgup, end} -const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - /* 0: qwerty */ - KEYMAP_ANSI( - GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSPC, \ - TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC,BSLS, \ - LCTL,A, S, D, F, G, H, J, K, L, SCLN,QUOT, ENT, \ - LSFT,Z, X, C, V, B, N, M, COMM,DOT, SLSH, RSFT, \ - LCTL,LGUI,LALT, SPC, FN0, RGUI,APP, RCTL), - /* 4: Poker Default + Fn'd */ - [4] = KEYMAP_ANSI( - TRNS,F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, TRNS, \ - CAPS,FN2, UP, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,CALC,TRNS,HOME,INS, TRNS, \ - TRNS,LEFT,DOWN,RGHT,TRNS,TRNS,PSCR,SLCK,PAUS,TRNS,FN4, END, TRNS, \ - TRNS,DEL, TRNS,WHOM,MUTE,VOLU,VOLD,TRNS,PGUP,PGDN,DEL, TRNS, \ - TRNS,TRNS,TRNS, FN1, TRNS,TRNS,TRNS,TRNS), - /* 5: Poker with Arrow */ - KEYMAP_ANSI( - TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \ - TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \ - TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS, \ - TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, PGUP, \ - TRNS,TRNS,TRNS, TRNS, FN3, HOME,PGDN,END), - /* 6: Poker with Esc */ - KEYMAP_ANSI( - ESC, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \ - TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \ - TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS, \ - TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS, \ - TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS,TRNS), - /* 7: Poker with Arrow + Fn'd */ - KEYMAP_ANSI( - TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \ - TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \ - TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS, \ - TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, UP, \ - TRNS,TRNS,TRNS, TRNS, TRNS,LEFT,DOWN,RGHT), -}; -const uint16_t PROGMEM fn_actions[] = { - /* Poker Layout */ - [0] = ACTION_LAYER_BIT_XOR(1, 0b0101, ON_BOTH), // Poker Fn(with fix for Esc) - [1] = ACTION_LAYER_TOGGLE(5), // Poker Arrow toggle - [2] = ACTION_LAYER_TOGGLE(6), // Poker Esc toggle - [3] = ACTION_LAYER_BIT_XOR(1, 0b1101, ON_BOTH), // Poker Fn(with fix for Arrow) - [4] = ACTION_MODS_KEY(MOD_RCTL|MOD_RSFT, KC_ESC), // FN3 Task(RControl,RShift+Esc) -}; diff --git a/keyboard/gh60/keymap_poker_set.c b/keyboard/gh60/keymap_poker_set.c deleted file mode 100644 index aaa31fc57..000000000 --- a/keyboard/gh60/keymap_poker_set.c +++ /dev/null @@ -1,82 +0,0 @@ -#include "keymap_common.h" - -// Poker fix with set(state transition) -// Fn + Esc = ` -// Fn + {left, down, up, right} = {home, pgdown, pgup, end} -const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - /* 0: qwerty */ - KEYMAP_ANSI( - GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSPC, \ - TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC,BSLS, \ - LCTL,A, S, D, F, G, H, J, K, L, SCLN,QUOT, ENT, \ - LSFT,Z, X, C, V, B, N, M, COMM,DOT, SLSH, RSFT, \ - LCTL,LGUI,LALT, SPC, FN0, RGUI,APP, RCTL), - /* 1: Poker with Arrow */ - KEYMAP_ANSI( - TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \ - TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \ - TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS, \ - TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, UP, \ - TRNS,TRNS,TRNS, TRNS, FN1, LEFT,DOWN,RGHT), - /* 2: Poker with Esc */ - KEYMAP_ANSI( - ESC, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \ - TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \ - TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS, \ - TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS, \ - TRNS,TRNS,TRNS, TRNS, FN2, TRNS,TRNS,TRNS), - /* 3: Poker with Arrow and Esc */ - KEYMAP_ANSI( - ESC, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \ - TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \ - TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS, \ - TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, UP, \ - TRNS,TRNS,TRNS, TRNS, FN3, LEFT,DOWN,RGHT), - /* 4: Poker Fn'd */ - KEYMAP_ANSI( - ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, TRNS, \ - TRNS,FN6, UP, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,CALC,TRNS,HOME,INS, TRNS, \ - TRNS,LEFT,DOWN,RGHT,TRNS,TRNS,PSCR,SLCK,PAUS,TRNS,FN8, END, TRNS, \ - TRNS,DEL, TRNS,WHOM,MUTE,VOLU,VOLD,TRNS,PGUP,PGDN,DEL, TRNS, \ - TRNS,TRNS,TRNS, FN5, FN4, TRNS,TRNS,TRNS), - /* 5: Poker Fn'd arrow */ - KEYMAP_ANSI( - ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, TRNS, \ - TRNS,FN7, UP, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,CALC,TRNS,HOME,INS, TRNS, \ - TRNS,LEFT,DOWN,RGHT,TRNS,TRNS,PSCR,SLCK,PAUS,TRNS,FN8, END, TRNS, \ - TRNS,DEL, TRNS,WHOM,MUTE,VOLU,VOLD,TRNS,PGUP,PGDN,DEL, PGUP, \ - TRNS,TRNS,TRNS, FN4, FN5, HOME,PGDN,END), - /* 6: Poker Fn'd Esc */ - KEYMAP_ANSI( - GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, TRNS, \ - TRNS,FN4, UP, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,CALC,TRNS,HOME,INS, TRNS, \ - TRNS,LEFT,DOWN,RGHT,TRNS,TRNS,PSCR,SLCK,PAUS,TRNS,FN8, END, TRNS, \ - TRNS,DEL, TRNS,WHOM,MUTE,VOLU,VOLD,TRNS,PGUP,PGDN,DEL, TRNS, \ - TRNS,TRNS,TRNS, FN7, FN6, TRNS,TRNS,TRNS), - /* 7: Poker Fn'd Arrow + Esc */ - KEYMAP_ANSI( - GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, TRNS, \ - TRNS,FN5, UP, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,CALC,TRNS,HOME,INS, TRNS, \ - TRNS,LEFT,DOWN,RGHT,TRNS,TRNS,PSCR,SLCK,PAUS,TRNS,FN8, END, TRNS, \ - TRNS,DEL, TRNS,WHOM,MUTE,VOLU,VOLD,TRNS,PGUP,PGDN,DEL, PGUP, \ - TRNS,TRNS,TRNS, FN6, FN7, HOME,PGDN,END), -}; - -/* - * Fn action definition - */ -const uint16_t PROGMEM fn_actions[] = { - /* Poker Layout */ - [0] = ACTION_LAYER_SET(4, ON_PRESS), // FN0 move to Fn'd when press - [1] = ACTION_LAYER_SET(5, ON_PRESS), // FN1 move to Fn'd arrow when press - [2] = ACTION_LAYER_SET(6, ON_PRESS), // FN2 move to Fn'd Esc when press - [3] = ACTION_LAYER_SET(7, ON_PRESS), // FN3 move to Fn'd arrow + Esc when press - - //[4] = ACTION_LAYER_CLEAR(ON_RELEASE), // FN4 clear overlay when release - [4] = ACTION_LAYER_SET(0, ON_RELEASE), // FN4 clear overlay when release - [5] = ACTION_LAYER_SET(1, ON_RELEASE), // FN5 move to arrow when release - [6] = ACTION_LAYER_SET(2, ON_RELEASE), // FN6 move to Esc when release - [7] = ACTION_LAYER_SET(3, ON_RELEASE), // FN7 move to arrow + Esc when release - - [8] = ACTION_MODS_KEY(MOD_RCTL|MOD_RSFT, KC_ESC), // FN8 Task(RControl,RShift+Esc) -}; diff --git a/keyboard/gh60/keymap_spacefn.c b/keyboard/gh60/keymap_spacefn.c deleted file mode 100644 index 8077dcee7..000000000 --- a/keyboard/gh60/keymap_spacefn.c +++ /dev/null @@ -1,55 +0,0 @@ -#include "keymap_common.h" - -/* - * SpaceFN - * http://geekhack.org/index.php?topic=51069.0 - */ -const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - /* Keymap 0: Default Layer - * ,-----------------------------------------------------------. - * |Esc| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backsp | - * |-----------------------------------------------------------| - * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \| - * |-----------------------------------------------------------| - * |Caps | A| S| D| F| G| H| J| K| L| ;| '|Return | - * |-----------------------------------------------------------| - * |Shift | Z| X| C| V| B| N| M| ,| .| /|Shift | - * |-----------------------------------------------------------| - * |Ctrl|Gui |Alt | Space |Alt |Gui |App |Ctrl| - * `-----------------------------------------------------------' - */ - KEYMAP_ANSI( - ESC, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSPC, \ - TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC,BSLS, \ - CAPS,A, S, D, F, G, H, J, K, L, SCLN,QUOT, ENT, \ - LSFT,Z, X, C, V, B, N, M, COMM,DOT, SLSH, RSFT, \ - LCTL,LGUI,LALT, FN0, RALT,RGUI,APP, RCTL), - - /* Overlay 1: SpaceFN - * ,-----------------------------------------------------------. - * |` | F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Delete | - * |-----------------------------------------------------------| - * | | | | | | | |Hom|Up |End|Psc|Slk|Pau|Ins | - * |-----------------------------------------------------------| - * | | | | | | |PgU|Lef|Dow|Rig| | | | - * |-----------------------------------------------------------| - * | | | | | |Spc|PgD|` |~ | | | | - * |-----------------------------------------------------------| - * | | | | | | | | | - * `-----------------------------------------------------------' - */ - KEYMAP_ANSI( - GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, DEL, \ - TRNS,TRNS,TRNS,ESC, TRNS,TRNS,TRNS,HOME,UP, END, PSCR,SLCK,PAUS,INS, \ - TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,PGUP,LEFT,DOWN,RGHT,TRNS,TRNS, TRNS, \ - TRNS,TRNS,TRNS,TRNS,TRNS,SPC, PGDN,GRV, FN1, TRNS,TRNS, TRNS, \ - TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS,TRNS), -}; - -/* - * Fn action definition - */ -const uint16_t PROGMEM fn_actions[] = { - [0] = ACTION_LAYER_TAP_KEY(1, KC_SPACE), - [1] = ACTION_MODS_KEY(MOD_LSFT, KC_GRV), // tilde -}; diff --git a/keyboard/gh60/keymaps/hasu.c b/keyboard/gh60/keymaps/hasu.c new file mode 100644 index 000000000..e6af28585 --- /dev/null +++ b/keyboard/gh60/keymaps/hasu.c @@ -0,0 +1,145 @@ +#include "keymap_common.h" + +/* + * Hasu + */ +const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* Keymap 0: Default Layer + * ,-----------------------------------------------------------. + * |Esc| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backsp | + * |-----------------------------------------------------------| + * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \| + * |-----------------------------------------------------------| + * |Caps | A| S| D| F| G| H| J| K| L|Fn3| '|Return | + * |-----------------------------------------------------------| + * |Shift | Z| X| C| V| B| N| M| ,| .|Fn2|Shift | + * |-----------------------------------------------------------| + * |Ctrl|Gui |Alt | Space |Alt |Fn4 |Fn4 |Fn1 | + * `-----------------------------------------------------------' + */ + KEYMAP_ANSI( + ESC, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSPC, \ + TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC,BSLS, \ + LCTL,A, S, D, F, G, H, J, K, L, FN2, QUOT, ENT, \ + LSFT,Z, X, C, V, B, N, M, COMM,DOT, FN1, FN9, \ + LCTL,LGUI,LALT, SPC, RALT,FN3, FN3, FN0), + /* Keymap 1: colemak */ + KEYMAP_ANSI( + GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSPC, \ + TAB, Q, W, F, P, G, J, L, U, Y, SCLN,LBRC,RBRC,BSLS, \ + BSPC,A, R, S, T, D, H, N, E, I, O, QUOT, ENT, \ + LSFT,Z, X, C, V, B, K, M, COMM,DOT, SLSH, RSFT, \ + LCTL,LGUI,LALT, SPC, RALT,RGUI,APP, FN0), + /* Keymap 2: dvorak */ + KEYMAP_ANSI( + GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, LBRC,RBRC,BSPC, \ + TAB, QUOT,COMM,DOT, P, Y, F, G, C, R, L, SLSH,EQL, BSLS, \ + CAPS,A, O, E, U, I, D, H, T, N, S, MINS, ENT, \ + LSFT,SCLN,Q, J, K, X, B, M, W, V, Z, RSFT, \ + LCTL,LGUI,LALT, SPC, RALT,RGUI,APP, FN0), + /* Keymap 3: workman */ + KEYMAP_ANSI( + GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSPC, \ + TAB, Q, D, R, W, B, J, F, U, P, SCLN,LBRC,RBRC,BSLS, \ + BSPC,A, S, H, T, G, Y, N, E, O, I, QUOT, ENT, \ + LSFT,Z, X, M, C, V, K, L, COMM,DOT, SLSH, RSFT, \ + LCTL,LGUI,LALT, SPC, RALT,RGUI,APP, FN0), + + /* Overlay 4: HHKB mode + * ,-----------------------------------------------------------. + * |Esc| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Delete | + * |-----------------------------------------------------------| + * |Caps | | | | | | | |Psc|Slk|Pus|Up | |Inser| + * |-----------------------------------------------------------| + * |Contro|VoD|VoU|Mut| | | *| /|Hom|PgU|Lef|Rig|Enter | + * |-----------------------------------------------------------| + * |Shift | | | | | | +| -|End|PgD|Dow|Shift | + * |-----------------------------------------------------------| + * |Ctrl|Gui |Alt | Space |Alt |Gui |App | | + * `-----------------------------------------------------------' + */ + KEYMAP_ANSI( + GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, DEL, \ + CAPS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,PSCR,SLCK,PAUS,UP, TRNS,INS, \ + LCTL,VOLD,VOLU,MUTE,TRNS,TRNS,PAST,PSLS,HOME,PGUP,LEFT,RGHT, ENT, \ + LSFT,TRNS,TRNS,TRNS,TRNS,TRNS,PPLS,PMNS,END, PGDN,DOWN, RSFT, \ + LCTL,LGUI,LALT, SPC, RALT,RGUI,FN4, TRNS), + /* Overlay 5: Vi mode (Slash) + * ,-----------------------------------------------------------. + * | `| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Backsp | + * |-----------------------------------------------------------| + * |Tab |Hom|PgD|Up |PgU|End|Hom|PgD|PgU|End| | | | | + * |-----------------------------------------------------------| + * |Contro| |Lef|Dow|Rig| |Lef|Dow|Up |Rig| | |Return | + * |-----------------------------------------------------------| + * |Shift | | | | | |Hom|PgD|PgU|End| |Shift | + * |-----------------------------------------------------------| + * |Ctrl|Gui |Alt | Space |Alt |Gui |App |Ctrl| + * `-----------------------------------------------------------' + */ + KEYMAP_ANSI( + GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, BSPC, \ + TAB, HOME,PGDN,UP, PGUP,END, HOME,PGDN,PGUP,END, TRNS,TRNS,TRNS,TRNS, \ + LCTL,TRNS,LEFT,DOWN,RGHT,TRNS,LEFT,DOWN,UP, RGHT,TRNS,TRNS, ENT, \ + LSFT,TRNS,TRNS,TRNS,TRNS,TRNS,HOME,PGDN,PGUP,END, TRNS, RSFT, \ + LCTL,LGUI,LALT, SPC, RALT,RGUI,APP, RCTL), + /* Overlay 6: Mouse mode (Semicolon/App) + * ,-----------------------------------------------------------. + * | `| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Backsp | + * |-----------------------------------------------------------| + * |Tab | | | | | |MwL|MwD|MwU|MwR| | | | | + * |-----------------------------------------------------------| + * |Contro| |Ac0|Ac1|Ac1| |McL|McD|McU|McR| | |Return | + * |-----------------------------------------------------------| + * |Shift | | | | |Mb3|Mb2|Mb1|Mb4|Mb5| |Shift | + * |-----------------------------------------------------------| + * |Ctrl|Gui |Alt | Space | | | | | + * `-----------------------------------------------------------' + * Mc: Mouse Cursor / Mb: Mouse Button / Mw: Mouse Wheel + */ + KEYMAP_ANSI( + GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, BSPC, \ + TAB, TRNS,TRNS,TRNS,TRNS,TRNS,WH_L,WH_D,WH_U,WH_R,TRNS,TRNS,TRNS,TRNS, \ + LCTL,TRNS,ACL0,ACL1,ACL2,TRNS,MS_L,MS_D,MS_U,MS_R,TRNS,TRNS, ENT, \ + LSFT,TRNS,TRNS,TRNS,TRNS,BTN3,BTN2,BTN1,BTN4,BTN5,TRNS, RSFT, \ + LCTL,LGUI,LALT, BTN1, TRNS,TRNS,TRNS,RCTL), + /* Overlay 7: Layout selector + * ,-----------------------------------------------------------. + * | Lq| Lc| Ld| Lw| | | | | | | | | | | + * |-----------------------------------------------------------| + * | |Lq |Lw | | | | | | | | | | | | + * |-----------------------------------------------------------| + * | | | |Ld | | | | | | | | | | + * |-----------------------------------------------------------| + * | | | |Lc | | | | | | | | | + * |-----------------------------------------------------------| + * | | | | | | | | | + * `-----------------------------------------------------------' + * Lq: set Qwerty layout + * Lc: set Colemak layout + * Ld: set Dvorak layout + * Lw: set Workman layout + */ + KEYMAP_ANSI( + FN5, FN6, FN7, FN8, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \ + TRNS,FN5, FN8, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \ + TRNS,TRNS,TRNS,FN7, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS, \ + TRNS,TRNS,TRNS,FN6, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS, \ + TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS,TRNS), +}; + +/* + * Fn action definition + */ +const uint16_t PROGMEM fn_actions[] = { + [0] = ACTION_LAYER_MOMENTARY(4), + [1] = ACTION_LAYER_TAP_KEY(5, KC_SLASH), + [2] = ACTION_LAYER_TAP_KEY(6, KC_SCLN), + [3] = ACTION_LAYER_MOMENTARY(6), + [4] = ACTION_LAYER_MOMENTARY(7), // to Layout selector + [5] = ACTION_DEFAULT_LAYER_SET(0), // set qwerty layout + [6] = ACTION_DEFAULT_LAYER_SET(1), // set colemak layout + [7] = ACTION_DEFAULT_LAYER_SET(2), // set dvorak layout + [8] = ACTION_DEFAULT_LAYER_SET(3), // set workman layout + [9] = ACTION_MODS_TAP_KEY(MOD_RSFT, KC_GRV), +}; diff --git a/keyboard/gh60/keymaps/hhkb.c b/keyboard/gh60/keymaps/hhkb.c new file mode 100644 index 000000000..ce1b816ec --- /dev/null +++ b/keyboard/gh60/keymaps/hhkb.c @@ -0,0 +1,52 @@ +#include "keymap_common.h" + +/* + * HHKB Layout + */ +const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* 0: Default layer + * ,-----------------------------------------------------------. + * |Esc| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| \| `| + * |-----------------------------------------------------------| + * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]|Bspc | + * |-----------------------------------------------------------| + * |Ctrl | A| S| D| F| G| H| J| K| L|Fn3| '|Return | + * |-----------------------------------------------------------| + * |Shift | Z| X| C| V| B| N| M| ,| .| /|Shift |Fn | + * |-----------------------------------------------------------| + * | |Gui |Alt | Space | |Alt |Gui | | + * `-----------------------------------------------------------' + */ + KEYMAP_HHKB( + ESC, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSLS, GRV, \ + TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC,BSPC, \ + LCTL,A, S, D, F, G, H, J, K, L, SCLN,QUOT, ENT, \ + LSFT,Z, X, C, V, B, N, M, COMM,DOT, SLSH, RSFT,FN0, \ + NO, LGUI,LALT, SPC, NO, RALT,RGUI,NO), + /* 1: HHKB Fn layer + * ,-----------------------------------------------------------. + * |Pwr| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Ins|Del| + * |-----------------------------------------------------------| + * |Caps | | | | | | | |Psc|Slk|Pus|Up | | | + * |-----------------------------------------------------------| + * | |VoD|VoU|Mut|Ejc| | *| /|Hom|PgU|Lef|Rig|Enter | + * |-----------------------------------------------------------| + * | | | | | | | +| -|End|PgD|Dow| | | + * |-----------------------------------------------------------| + * | | | | | | | | | + * `-----------------------------------------------------------' + */ + KEYMAP_HHKB( + PWR, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, \ + CAPS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,PSCR,SLCK,PAUS,UP, TRNS,TRNS, \ + TRNS,VOLD,VOLU,MUTE,EJCT,TRNS,PAST,PSLS,HOME,PGUP,LEFT,RGHT, PENT, \ + TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,PPLS,PMNS,END, PGDN,DOWN, TRNS,TRNS, \ + TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS,TRNS), +}; + +/* + * Fn action definition + */ +const uint16_t PROGMEM fn_actions[] = { + [0] = ACTION_LAYER_MOMENTARY(1), +}; diff --git a/keyboard/gh60/keymaps/plain.c b/keyboard/gh60/keymaps/plain.c new file mode 100644 index 000000000..3138c1807 --- /dev/null +++ b/keyboard/gh60/keymaps/plain.c @@ -0,0 +1,11 @@ +#include "keymap_common.h" + +const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* 0: qwerty */ + KEYMAP(ESC, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSPC, \ + TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC,BSLS, \ + CAPS,A, S, D, F, G, H, J, K, L, SCLN,QUOT,NO, ENT, \ + LSFT,NO, Z, X, C, V, B, N, M, COMM,DOT, SLSH,NO, RSFT, \ + LCTL,LGUI,LALT, SPC, RALT,RGUI,APP, RCTL), +}; +const uint16_t PROGMEM fn_actions[] = {}; diff --git a/keyboard/gh60/keymaps/poker.c b/keyboard/gh60/keymaps/poker.c new file mode 100644 index 000000000..7a612ee44 --- /dev/null +++ b/keyboard/gh60/keymaps/poker.c @@ -0,0 +1,104 @@ +#include "keymap_common.h" + +const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* 0: qwerty */ + KEYMAP_ANSI( + GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSPC, \ + TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC,BSLS, \ + CAPS,A, S, D, F, G, H, J, K, L, SCLN,QUOT, ENT, \ + LSFT,Z, X, C, V, B, N, M, COMM,DOT, SLSH, RSFT, \ + LCTL,LGUI,LALT, SPC, FN0, RGUI,APP, RCTL), + /* 1: colemak */ + KEYMAP_ANSI( + GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSPC, \ + TAB, Q, W, F, P, G, J, L, U, Y, SCLN,LBRC,RBRC,BSLS, \ + BSPC,A, R, S, T, D, H, N, E, I, O, QUOT, ENT, \ + LSFT,Z, X, C, V, B, K, M, COMM,DOT, SLSH, RSFT, \ + LCTL,LGUI,LALT, SPC, FN0, RGUI,APP, RCTL), + /* 2: dvorak */ + KEYMAP_ANSI( + GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, LBRC,RBRC,BSPC, \ + TAB, QUOT,COMM,DOT, P, Y, F, G, C, R, L, SLSH,EQL, BSLS, \ + CAPS,A, O, E, U, I, D, H, T, N, S, MINS, ENT, \ + LSFT,SCLN,Q, J, K, X, B, M, W, V, Z, RSFT, \ + LCTL,LGUI,LALT, SPC, FN0, RGUI,APP, RCTL), + /* 3: workman */ + KEYMAP_ANSI( + GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSPC, \ + TAB, Q, D, R, W, B, J, F, U, P, SCLN,LBRC,RBRC,BSLS, \ + BSPC,A, S, H, T, G, Y, N, E, O, I, QUOT, ENT, \ + LSFT,Z, X, M, C, V, K, L, COMM,DOT, SLSH, RSFT, \ + LCTL,LGUI,LALT, SPC, FN0, RGUI,APP, RCTL), + /* 4: Poker with Arrow */ + KEYMAP_ANSI( + TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \ + TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \ + TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS, \ + TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, UP, \ + TRNS,TRNS,TRNS, TRNS, TRNS,LEFT,DOWN,RGHT), + /* 5: Poker with Esc */ + KEYMAP_ANSI( + ESC, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \ + TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \ + TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS, \ + TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS, \ + TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS,TRNS), + /* 6: Poker Fn + * ,-----------------------------------------------------------. + * |Esc| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12| | + * |-----------------------------------------------------------| + * | |FnQ| Up| | | | | | |Cal| |Hom|Ins|FnL | + * |-----------------------------------------------------------| + * | |Lef|Dow|Rig| | |Psc|Slk|Pau| |Tsk|End| | + * |-----------------------------------------------------------| + * | |Del| |Web|Mut|VoU|VoD| |PgU|PgD|Del| | + * |-----------------------------------------------------------| + * | | | | FnS | | | | | + * `-----------------------------------------------------------' + * Fn: to Fn overlay + * FnL: to Layout selector overaly + * FnQ: toggle Esc overlay + * FnS: toggle Arrow overlay + */ + KEYMAP_ANSI( + ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, TRNS, \ + TRNS,FN2, UP, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,CALC,TRNS,HOME,INS, FN4, \ + TRNS,LEFT,DOWN,RGHT,TRNS,TRNS,PSCR,SLCK,PAUS,TRNS,FN3, END, TRNS, \ + TRNS,DEL, TRNS,WHOM,MUTE,VOLU,VOLD,TRNS,PGUP,PGDN,DEL, TRNS, \ + TRNS,TRNS,TRNS, FN1, TRNS,TRNS,TRNS,TRNS), + /* 7: Layout selector + * ,-----------------------------------------------------------. + * | Lq| Lc| Ld| Lw| | | | | | | | | | | + * |-----------------------------------------------------------| + * | |Lq |Lw | | | | | | | | | | | | + * |-----------------------------------------------------------| + * | | | |Ld | | | | | | | | | | + * |-----------------------------------------------------------| + * | | | |Lc | | | | | | | | | + * |-----------------------------------------------------------| + * | | | | | | | | | + * `-----------------------------------------------------------' + * Lq: set Qwerty layout + * Lc: set Colemak layout + * Ld: set Dvorak layout + * Lw: set Workman layout + */ + KEYMAP_ANSI( + FN5, FN6, FN7, FN8, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \ + TRNS,FN5, FN8, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \ + TRNS,TRNS,TRNS,FN7, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS, \ + TRNS,TRNS,TRNS,FN6, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS, \ + TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS,TRNS), +}; +const uint16_t PROGMEM fn_actions[] = { + /* Poker Layout */ + [0] = ACTION_LAYER_MOMENTARY(6), // to Fn overlay + [1] = ACTION_LAYER_TOGGLE(4), // toggle arrow overlay + [2] = ACTION_LAYER_TOGGLE(5), // toggle Esc overlay + [3] = ACTION_MODS_KEY(MOD_RCTL|MOD_RSFT, KC_ESC), // Task(RControl,RShift+Esc) + [4] = ACTION_LAYER_MOMENTARY(7), // to Layout selector + [5] = ACTION_DEFAULT_LAYER_SET(0), // set qwerty layout + [6] = ACTION_DEFAULT_LAYER_SET(1), // set colemak layout + [7] = ACTION_DEFAULT_LAYER_SET(2), // set dvorak layout + [8] = ACTION_DEFAULT_LAYER_SET(3), // set workman layout +}; diff --git a/keyboard/gh60/keymaps/poker_bit.c b/keyboard/gh60/keymaps/poker_bit.c new file mode 100644 index 000000000..b8870fdd8 --- /dev/null +++ b/keyboard/gh60/keymaps/poker_bit.c @@ -0,0 +1,50 @@ +#include "keymap_common.h" + +// Poker fix with toggle and bit operation +// Fn + Esc = ` +// Fn + {left, down, up, right} = {home, pgdown, pgup, end} +const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* 0: qwerty */ + KEYMAP_ANSI( + GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSPC, \ + TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC,BSLS, \ + LCTL,A, S, D, F, G, H, J, K, L, SCLN,QUOT, ENT, \ + LSFT,Z, X, C, V, B, N, M, COMM,DOT, SLSH, RSFT, \ + LCTL,LGUI,LALT, SPC, FN0, RGUI,APP, RCTL), + /* 4: Poker Default + Fn'd */ + [4] = KEYMAP_ANSI( + TRNS,F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, TRNS, \ + CAPS,FN2, UP, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,CALC,TRNS,HOME,INS, TRNS, \ + TRNS,LEFT,DOWN,RGHT,TRNS,TRNS,PSCR,SLCK,PAUS,TRNS,FN4, END, TRNS, \ + TRNS,DEL, TRNS,WHOM,MUTE,VOLU,VOLD,TRNS,PGUP,PGDN,DEL, TRNS, \ + TRNS,TRNS,TRNS, FN1, TRNS,TRNS,TRNS,TRNS), + /* 5: Poker with Arrow */ + KEYMAP_ANSI( + TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \ + TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \ + TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS, \ + TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, PGUP, \ + TRNS,TRNS,TRNS, TRNS, FN3, HOME,PGDN,END), + /* 6: Poker with Esc */ + KEYMAP_ANSI( + ESC, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \ + TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \ + TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS, \ + TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS, \ + TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS,TRNS), + /* 7: Poker with Arrow + Fn'd */ + KEYMAP_ANSI( + TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \ + TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \ + TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS, \ + TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, UP, \ + TRNS,TRNS,TRNS, TRNS, TRNS,LEFT,DOWN,RGHT), +}; +const uint16_t PROGMEM fn_actions[] = { + /* Poker Layout */ + [0] = ACTION_LAYER_BIT_XOR(1, 0b0101, ON_BOTH), // Poker Fn(with fix for Esc) + [1] = ACTION_LAYER_TOGGLE(5), // Poker Arrow toggle + [2] = ACTION_LAYER_TOGGLE(6), // Poker Esc toggle + [3] = ACTION_LAYER_BIT_XOR(1, 0b1101, ON_BOTH), // Poker Fn(with fix for Arrow) + [4] = ACTION_MODS_KEY(MOD_RCTL|MOD_RSFT, KC_ESC), // FN3 Task(RControl,RShift+Esc) +}; diff --git a/keyboard/gh60/keymaps/poker_set.c b/keyboard/gh60/keymaps/poker_set.c new file mode 100644 index 000000000..aaa31fc57 --- /dev/null +++ b/keyboard/gh60/keymaps/poker_set.c @@ -0,0 +1,82 @@ +#include "keymap_common.h" + +// Poker fix with set(state transition) +// Fn + Esc = ` +// Fn + {left, down, up, right} = {home, pgdown, pgup, end} +const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* 0: qwerty */ + KEYMAP_ANSI( + GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSPC, \ + TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC,BSLS, \ + LCTL,A, S, D, F, G, H, J, K, L, SCLN,QUOT, ENT, \ + LSFT,Z, X, C, V, B, N, M, COMM,DOT, SLSH, RSFT, \ + LCTL,LGUI,LALT, SPC, FN0, RGUI,APP, RCTL), + /* 1: Poker with Arrow */ + KEYMAP_ANSI( + TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \ + TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \ + TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS, \ + TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, UP, \ + TRNS,TRNS,TRNS, TRNS, FN1, LEFT,DOWN,RGHT), + /* 2: Poker with Esc */ + KEYMAP_ANSI( + ESC, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \ + TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \ + TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS, \ + TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS, \ + TRNS,TRNS,TRNS, TRNS, FN2, TRNS,TRNS,TRNS), + /* 3: Poker with Arrow and Esc */ + KEYMAP_ANSI( + ESC, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \ + TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \ + TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS, \ + TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, UP, \ + TRNS,TRNS,TRNS, TRNS, FN3, LEFT,DOWN,RGHT), + /* 4: Poker Fn'd */ + KEYMAP_ANSI( + ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, TRNS, \ + TRNS,FN6, UP, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,CALC,TRNS,HOME,INS, TRNS, \ + TRNS,LEFT,DOWN,RGHT,TRNS,TRNS,PSCR,SLCK,PAUS,TRNS,FN8, END, TRNS, \ + TRNS,DEL, TRNS,WHOM,MUTE,VOLU,VOLD,TRNS,PGUP,PGDN,DEL, TRNS, \ + TRNS,TRNS,TRNS, FN5, FN4, TRNS,TRNS,TRNS), + /* 5: Poker Fn'd arrow */ + KEYMAP_ANSI( + ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, TRNS, \ + TRNS,FN7, UP, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,CALC,TRNS,HOME,INS, TRNS, \ + TRNS,LEFT,DOWN,RGHT,TRNS,TRNS,PSCR,SLCK,PAUS,TRNS,FN8, END, TRNS, \ + TRNS,DEL, TRNS,WHOM,MUTE,VOLU,VOLD,TRNS,PGUP,PGDN,DEL, PGUP, \ + TRNS,TRNS,TRNS, FN4, FN5, HOME,PGDN,END), + /* 6: Poker Fn'd Esc */ + KEYMAP_ANSI( + GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, TRNS, \ + TRNS,FN4, UP, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,CALC,TRNS,HOME,INS, TRNS, \ + TRNS,LEFT,DOWN,RGHT,TRNS,TRNS,PSCR,SLCK,PAUS,TRNS,FN8, END, TRNS, \ + TRNS,DEL, TRNS,WHOM,MUTE,VOLU,VOLD,TRNS,PGUP,PGDN,DEL, TRNS, \ + TRNS,TRNS,TRNS, FN7, FN6, TRNS,TRNS,TRNS), + /* 7: Poker Fn'd Arrow + Esc */ + KEYMAP_ANSI( + GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, TRNS, \ + TRNS,FN5, UP, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,CALC,TRNS,HOME,INS, TRNS, \ + TRNS,LEFT,DOWN,RGHT,TRNS,TRNS,PSCR,SLCK,PAUS,TRNS,FN8, END, TRNS, \ + TRNS,DEL, TRNS,WHOM,MUTE,VOLU,VOLD,TRNS,PGUP,PGDN,DEL, PGUP, \ + TRNS,TRNS,TRNS, FN6, FN7, HOME,PGDN,END), +}; + +/* + * Fn action definition + */ +const uint16_t PROGMEM fn_actions[] = { + /* Poker Layout */ + [0] = ACTION_LAYER_SET(4, ON_PRESS), // FN0 move to Fn'd when press + [1] = ACTION_LAYER_SET(5, ON_PRESS), // FN1 move to Fn'd arrow when press + [2] = ACTION_LAYER_SET(6, ON_PRESS), // FN2 move to Fn'd Esc when press + [3] = ACTION_LAYER_SET(7, ON_PRESS), // FN3 move to Fn'd arrow + Esc when press + + //[4] = ACTION_LAYER_CLEAR(ON_RELEASE), // FN4 clear overlay when release + [4] = ACTION_LAYER_SET(0, ON_RELEASE), // FN4 clear overlay when release + [5] = ACTION_LAYER_SET(1, ON_RELEASE), // FN5 move to arrow when release + [6] = ACTION_LAYER_SET(2, ON_RELEASE), // FN6 move to Esc when release + [7] = ACTION_LAYER_SET(3, ON_RELEASE), // FN7 move to arrow + Esc when release + + [8] = ACTION_MODS_KEY(MOD_RCTL|MOD_RSFT, KC_ESC), // FN8 Task(RControl,RShift+Esc) +}; diff --git a/keyboard/gh60/keymaps/spacefn.c b/keyboard/gh60/keymaps/spacefn.c new file mode 100644 index 000000000..8077dcee7 --- /dev/null +++ b/keyboard/gh60/keymaps/spacefn.c @@ -0,0 +1,55 @@ +#include "keymap_common.h" + +/* + * SpaceFN + * http://geekhack.org/index.php?topic=51069.0 + */ +const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* Keymap 0: Default Layer + * ,-----------------------------------------------------------. + * |Esc| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backsp | + * |-----------------------------------------------------------| + * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \| + * |-----------------------------------------------------------| + * |Caps | A| S| D| F| G| H| J| K| L| ;| '|Return | + * |-----------------------------------------------------------| + * |Shift | Z| X| C| V| B| N| M| ,| .| /|Shift | + * |-----------------------------------------------------------| + * |Ctrl|Gui |Alt | Space |Alt |Gui |App |Ctrl| + * `-----------------------------------------------------------' + */ + KEYMAP_ANSI( + ESC, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSPC, \ + TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC,BSLS, \ + CAPS,A, S, D, F, G, H, J, K, L, SCLN,QUOT, ENT, \ + LSFT,Z, X, C, V, B, N, M, COMM,DOT, SLSH, RSFT, \ + LCTL,LGUI,LALT, FN0, RALT,RGUI,APP, RCTL), + + /* Overlay 1: SpaceFN + * ,-----------------------------------------------------------. + * |` | F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Delete | + * |-----------------------------------------------------------| + * | | | | | | | |Hom|Up |End|Psc|Slk|Pau|Ins | + * |-----------------------------------------------------------| + * | | | | | | |PgU|Lef|Dow|Rig| | | | + * |-----------------------------------------------------------| + * | | | | | |Spc|PgD|` |~ | | | | + * |-----------------------------------------------------------| + * | | | | | | | | | + * `-----------------------------------------------------------' + */ + KEYMAP_ANSI( + GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, DEL, \ + TRNS,TRNS,TRNS,ESC, TRNS,TRNS,TRNS,HOME,UP, END, PSCR,SLCK,PAUS,INS, \ + TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,PGUP,LEFT,DOWN,RGHT,TRNS,TRNS, TRNS, \ + TRNS,TRNS,TRNS,TRNS,TRNS,SPC, PGDN,GRV, FN1, TRNS,TRNS, TRNS, \ + TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS,TRNS), +}; + +/* + * Fn action definition + */ +const uint16_t PROGMEM fn_actions[] = { + [0] = ACTION_LAYER_TAP_KEY(1, KC_SPACE), + [1] = ACTION_MODS_KEY(MOD_LSFT, KC_GRV), // tilde +}; diff --git a/keyboard/hhkb/Makefile b/keyboard/hhkb/Makefile index 5a179bd24..d434246ce 100644 --- a/keyboard/hhkb/Makefile +++ b/keyboard/hhkb/Makefile @@ -129,17 +129,17 @@ NKRO_ENABLE = yes # USB Nkey Rollover # Keymap file # ifdef KEYMAP - SRC := keymap_$(KEYMAP).c $(SRC) + SRC := keymaps/$(KEYMAP).c $(SRC) else ifdef HHKB_JP - SRC := keymap_jp.c $(SRC) + SRC := keymaps/jp.c $(SRC) else - SRC := keymap_hhkb.c $(SRC) + SRC := keymaps/hhkb.c $(SRC) endif endif -ifneq (, $(or $(findstring keymap_jp.c, $(SRC)), $(findstring yes, $(HHKB_JP)))) +ifneq (, $(or $(findstring jp.c, $(SRC)), $(findstring yes, $(HHKB_JP)))) OPT_DEFS += -DHHKB_JP endif diff --git a/keyboard/hhkb/Makefile.pjrc b/keyboard/hhkb/Makefile.pjrc index 7d0f8c3a9..403a8ec60 100644 --- a/keyboard/hhkb/Makefile.pjrc +++ b/keyboard/hhkb/Makefile.pjrc @@ -18,9 +18,9 @@ SRC = keymap_common.c \ led.c ifdef KEYMAP - SRC := keymap_$(KEYMAP).c $(SRC) + SRC := keymaps/$(KEYMAP).c $(SRC) else - SRC := keymap_hasu.c $(SRC) + SRC := keymaps/hasu.c $(SRC) endif CONFIG_H = config.h diff --git a/keyboard/hhkb/Makefile.rn42 b/keyboard/hhkb/Makefile.rn42 index cbb2b744c..a730442af 100644 --- a/keyboard/hhkb/Makefile.rn42 +++ b/keyboard/hhkb/Makefile.rn42 @@ -122,17 +122,17 @@ COMMAND_ENABLE = yes # Commands for debug and configuration # Keymap file # ifdef KEYMAP - SRC := keymap_$(KEYMAP).c $(SRC) + SRC := keymaps/$(KEYMAP).c $(SRC) else ifdef HHKB_JP - SRC := keymap_jp.c $(SRC) + SRC := keymaps/jp.c $(SRC) else - SRC := keymap_hhkb.c $(SRC) + SRC := keymaps/hhkb.c $(SRC) endif endif -ifneq (, $(or $(findstring keymap_jp.c, $(SRC)), $(findstring yes, $(HHKB_JP)))) +ifneq (, $(or $(findstring jp.c, $(SRC)), $(findstring yes, $(HHKB_JP)))) OPT_DEFS += -DHHKB_JP endif diff --git a/keyboard/hhkb/README.md b/keyboard/hhkb/README.md index fcd72e194..e20c23d82 100644 --- a/keyboard/hhkb/README.md +++ b/keyboard/hhkb/README.md @@ -76,7 +76,7 @@ Use [Teensy Loader] if your controller is Teensy/Teensy++. ##Keymap -To define your own keymap create file named `keymap_.c` and see [keymap document](../../doc/keymap.md) and existent keymap files. +To define your own keymap create a file in the keymaps folder named `.c` and see keymap document (you can find in top README.md) and existent keymap files. ##Hardware diff --git a/keyboard/hhkb/keymap_hasu.c b/keyboard/hhkb/keymap_hasu.c deleted file mode 100644 index a5602ded3..000000000 --- a/keyboard/hhkb/keymap_hasu.c +++ /dev/null @@ -1,282 +0,0 @@ -/* - * Hasu: my personal keymap - */ -#include "keymap_common.h" - - -#ifdef KEYMAP_SECTION_ENABLE -const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS] __attribute__ ((section (".keymap.keymaps"))) = { -#else -const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS] PROGMEM = { -#endif - /* Layer 0: Default Layer - * ,-----------------------------------------------------------. - * |Esc| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| \| `| - * |-----------------------------------------------------------| - * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]|Backs| - * |-----------------------------------------------------------| - * |Contro| A| S| D| F| G| H| J| K| L|Fn3| '|Fn6 | - * |-----------------------------------------------------------| - * |Fn7 | Z| X| C| V| B| N| M| ,| .|Fn2|Shift |Fn1| - * `-----------------------------------------------------------' - * |Gui|Alt | Fn4 |Fn5 |Gui| - * `-------------------------------------------' - */ - [0] = \ - KEYMAP(ESC, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSLS,GRV, \ - TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC,BSPC, \ - LCTL,A, S, D, F, G, H, J, K, L, FN3, QUOT,FN6, \ - FN7, Z, X, C, V, B, N, M, COMM,DOT, FN2, RSFT,FN1, \ - LGUI,LALT, FN4, FN5, RGUI), - - /* Layer 1: HHKB mode[HHKB Fn] - * ,-----------------------------------------------------------. - * |Esc| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Ins|Del| - * |-----------------------------------------------------------| - * |Caps | | | | | | | |Psc|Slk|Pus|Up | |Backs| - * |-----------------------------------------------------------| - * |Contro|VoD|VoU|Mut| | | *| /|Hom|PgU|Lef|Rig|Enter | - * |-----------------------------------------------------------| - * |Shift | | | | | | +| -|End|PgD|Dow|Shift | | - * `-----------------------------------------------------------' - * |Gui|Alt | Space |Alt |Gui| - * `-------------------------------------------' - */ - [1] = \ - KEYMAP(GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, \ - CAPS,NO, NO, NO, NO, NO, NO, NO, PSCR,SLCK,PAUS, UP, NO, BSPC, \ - LCTL,VOLD,VOLU,MUTE,NO, NO, PAST,PSLS,HOME,PGUP,LEFT,RGHT,ENT, \ - LSFT,NO, NO, NO, NO, NO, PPLS,PMNS,END, PGDN,DOWN,RSFT,TRNS, \ - LGUI,LALT, TRNS, RALT,RGUI), - - /* Layer 2: Vi mode[Slash] - * ,-----------------------------------------------------------. - * |Esc| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Ins|Del| - * |-----------------------------------------------------------| - * |Tab |Hom|PgD|Up |PgU|End|Hom|PgD|PgUlEnd| | | |Backs| - * |-----------------------------------------------------------| - * |Contro| |Lef|Dow|Rig| |Lef|Dow|Up |Rig| | |Return | - * |-----------------------------------------------------------| - * |Shift | | | | | |Hom|PgD|PgUlEnd|Fn0|Shift | | - * `-----------------------------------------------------------' - * |Gui|Alt | Space |Alt |Gui| - * `-------------------------------------------' - */ - [2] = \ - KEYMAP(GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, \ - TAB, HOME,PGDN,UP, PGUP,END, HOME,PGDN,PGUP,END, NO, NO, NO, BSPC, \ - LCTL,NO, LEFT,DOWN,RGHT,NO, LEFT,DOWN,UP, RGHT,NO, NO, ENT, \ - LSFT,NO, NO, NO, NO, NO, HOME,PGDN,PGUP,END, FN2, RSFT,TRNS, \ - LGUI,LALT, SPC, RALT,RGUI), - - /* Layer 3: Mouse mode(IJKL)[Semicolon] - * ,-----------------------------------------------------------. - * |Esc| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Ins|Del| - * |-----------------------------------------------------------| - * |Tab | | | | | |MwL|MwD|McU|MwU|MwR|Wbk|Wfr|Alt-T| - * |-----------------------------------------------------------| - * |Contro| | | | | |Mb2|McL|McD|McR|Fn | |Return | - * |-----------------------------------------------------------| - * |Shift | | | | |Mb3|Mb2|Mb1|Mb4|Mb5| |Shift | | - * `-----------------------------------------------------------' - * |Gui |Alt | Mb1 |Fn |Fn | - * `--------------------------------------------' - * Mc: Mouse Cursor / Mb: Mouse Button / Mw: Mouse Wheel - */ - [3] = \ - KEYMAP(GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, \ - FN8, NO, NO, NO, NO, NO, WH_L,WH_D,MS_U,WH_U,WH_R,FN9, FN10,FN8, \ - LCTL,ACL0,ACL1,ACL2,ACL2,NO, NO, MS_L,MS_D,MS_R,FN3, NO, ENT, \ - LSFT,NO, NO, NO, NO, BTN3,BTN2,BTN1,FN9, FN10,NO, RSFT,TRNS, \ - LGUI,LALT, BTN1, TRNS,TRNS), - - /* Layer 4: Mouse mode(IJKL)[Space] - * ,-----------------------------------------------------------. - * |Esc| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Ins|Del| - * |-----------------------------------------------------------| - * |Tab | | | | | |MwL|MwD|McU|MwU|MwR|Wbk|Wfr|Alt-T| - * |-----------------------------------------------------------| - * |Contro| | | | | |Mb2|McL|McD|McR|Mb1| |Return | - * |-----------------------------------------------------------| - * |Shift | | | | |Mb3|Mb2|Mb1|Mb4|Mb5| |Shift | | - * `-----------------------------------------------------------' - * |Gui |Alt | Mb1 |Fn |Fn | - * `--------------------------------------------' - * Mc: Mouse Cursor / Mb: Mouse Button / Mw: Mouse Wheel - */ - [4] = \ - KEYMAP(GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, \ - FN8, NO, NO, NO, NO, NO, WH_L,WH_D,MS_U,WH_U,WH_R,BTN4,BTN5,FN8, \ - LCTL,VOLD,VOLU,MUTE,NO, NO, NO, MS_L,MS_D,MS_R,BTN1,NO, ENT, \ - LSFT,NO, NO, NO, NO, BTN3,BTN2,BTN1,FN9, FN10,NO, RSFT,TRNS, \ - LGUI,LALT, TRNS, TRNS,TRNS), - -#if 0 - /* Layer 3: Mouse mode(HJKL)[Semicolon] - * ,-----------------------------------------------------------. - * |Esc| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Ins|Del| - * |-----------------------------------------------------------| - * |Tab | | | | | |MwL|MwD|MwU|MwR| | | |Backs| - * |-----------------------------------------------------------| - * |Contro| | | | | |McL|McD|McU|McR|Fn0| |Return | - * |-----------------------------------------------------------| - * |Shift | | | | |Mb3|Mb2|Mb1|Mb4|Mb5| |Shift | | - * `-----------------------------------------------------------' - * |Gui |Alt | Mb1 |Alt |Fn0| - * `--------------------------------------------' - * Mc: Mouse Cursor / Mb: Mouse Button / Mw: Mouse Wheel - */ - KEYMAP(GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, \ - TAB, NO, NO, NO, NO, NO, NO, WH_D,WH_U,RGHT,NO, NO, NO, BSPC, \ - LCTL,NO, ACL0,ACL1,ACL2,NO, MS_L,MS_D,MS_U,MS_R,TRNS,QUOT,ENT, \ - LSFT,NO, NO, NO, NO, BTN3,BTN2,BTN1,FN9, FN10,SLSH,RSFT,NO, \ - LGUI,LALT, BTN1, RALT,TRNS), - - /* Layer4: Mouse mode(HJKL)[Space] - * ,-----------------------------------------------------------. - * |Esc| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Ins|Del| - * |-----------------------------------------------------------| - * |Tab | | | | | |MwL|MwD|MwU|MwR| |Wbk|Wfr|Alt-T| - * |-----------------------------------------------------------| - * |Contro| | | | | |McL|McD|McU|McR|Fn0| |Return | - * |-----------------------------------------------------------| - * |Shift | | | | |Mb3|Mb2|Mb1|Mb4|Mb5| |Shift | | - * `-----------------------------------------------------------' - * |Gui |Alt | Fn0 |Alt |Fn0| - * `--------------------------------------------' - * Mc: Mouse Cursor / Mb: Mouse Button / Mw: Mouse Wheel - */ - KEYMAP(GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, \ - FN8, NO, NO, NO, NO, NO, NO, WH_D,WH_U,RGHT,NO, FN9, FN10,FN8, \ - LCTL,NO, ACL0,ACL1,ACL2,NO, MS_L,MS_D,MS_U,MS_R,BTN1,NO, ENT, \ - LSFT,NO, NO, NO, NO, BTN3,BTN2,BTN1,FN9, FN10,NO, RSFT,NO, \ - LGUI,LALT, TRNS, RALT,RGUI), -#endif -#if 0 - /* Layer x: Matias half-qwerty keyboard style[Space] - * ,-----------------------------------------------------------. - * | -| 0| 9| 8| 7| 6| 5| 4| 3| 2| 1| | | |Esc| - * |-----------------------------------------------------------| - * |Backs| P| O| I| U| Y| T| R| E| W| Q| | |Tab | - * |-----------------------------------------------------------| - * |Contro| ;| L| K| J| H| G| F| D| S| A|Con|Control | - * |-----------------------------------------------------------| - * |Shift | /| .| ,| M| N| B| V| C| X| Z|Shift | | - * `-----------------------------------------------------------' - * |Gui |Alt | Fn0 |Alt |Gui| - * `--------------------------------------------' - */ - KEYMAP(MINS,0, 9, 8, 7, 6, 5, 4, 3, 2, 1, NO, NO, NO, ESC, \ - BSPC,P, O, I, U, Y, T, R, E, W, Q, NO, NO, TAB, \ - LCTL,SCLN,L, K, J, H, G, F, D, S, A, RCTL,RCTL, \ - LSFT,SLSH,DOT, COMM,M, N, B, V, C, X, Z, RSFT,NO, \ - LGUI,LALT, TRNS, RALT,RGUI), -#endif -}; - - - -/* id for user defined functions */ -enum function_id { - LSHIFT_LPAREN, -}; - -enum macro_id { - HELLO, - VOLUP, - ALT_TAB, -}; - - -/* - * Fn action definition - */ -#ifdef KEYMAP_SECTION_ENABLE -const uint16_t fn_actions[] __attribute__ ((section (".keymap.fn_actions"))) = { -#else -const uint16_t fn_actions[] PROGMEM = { -#endif - [0] = ACTION_DEFAULT_LAYER_SET(0), // Default layer(not used) - [1] = ACTION_LAYER_TAP_TOGGLE(1), // HHKB layer(toggle with 5 taps) - [2] = ACTION_LAYER_TAP_KEY(2, KC_SLASH), // Cursor layer with Slash* - [3] = ACTION_LAYER_TAP_KEY(3, KC_SCLN), // Mousekey layer with Semicolon* - [4] = ACTION_LAYER_TAP_KEY(4, KC_SPC), // Mousekey layer with Space - [5] = ACTION_LAYER_MOMENTARY(4), // Mousekey layer(IJKL) - [6] = ACTION_MODS_TAP_KEY(MOD_RCTL, KC_ENT), // RControl with tap Enter - [7] = ACTION_MODS_ONESHOT(MOD_LSFT), // Oneshot Shift - [8] = ACTION_MACRO(ALT_TAB), // Application switching - [9] = ACTION_MODS_KEY(MOD_LALT, KC_LEFT), - [10] = ACTION_MODS_KEY(MOD_LALT, KC_RIGHT), - -// [x] = ACTION_LMOD_TAP_KEY(KC_LCTL, KC_BSPC), // LControl with tap Backspace -// [x] = ACTION_LMOD_TAP_KEY(KC_LCTL, KC_ESC), // LControl with tap Esc -// [x] = ACTION_FUNCTION_TAP(LSHIFT_LPAREN), // Function: LShift with tap '(' -// [x] = ACTION_MACRO(HELLO), // Macro: say hello -// [x] = ACTION_MACRO(VOLUP), // Macro: media key -}; - - -/* - * Macro definition - */ -const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) -{ - switch (id) { - case HELLO: - return (record->event.pressed ? - MACRO( I(0), T(H), T(E), T(L), T(L), W(255), T(O), END ) : - MACRO_NONE ); - case VOLUP: - return (record->event.pressed ? - MACRO( D(VOLU), U(VOLU), END ) : - MACRO_NONE ); - case ALT_TAB: - return (record->event.pressed ? - MACRO( D(LALT), D(TAB), END ) : - MACRO( U(TAB), END )); - } - return MACRO_NONE; -} - - - -/* - * user defined action function - */ -void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) -{ - if (record->event.pressed) dprint("P"); else dprint("R"); - dprintf("%d", record->tap.count); - if (record->tap.interrupted) dprint("i"); - dprint("\n"); - - switch (id) { - case LSHIFT_LPAREN: - // Shift parentheses example: LShft + tap '(' - // http://stevelosh.com/blog/2012/10/a-modern-space-cadet/#shift-parentheses - // http://geekhack.org/index.php?topic=41989.msg1304899#msg1304899 - if (record->event.pressed) { - if (record->tap.count > 0 && !record->tap.interrupted) { - if (record->tap.interrupted) { - dprint("tap interrupted\n"); - register_mods(MOD_BIT(KC_LSHIFT)); - } - } else { - register_mods(MOD_BIT(KC_LSHIFT)); - } - } else { - if (record->tap.count > 0 && !(record->tap.interrupted)) { - add_weak_mods(MOD_BIT(KC_LSHIFT)); - send_keyboard_report(); - register_code(KC_9); - unregister_code(KC_9); - del_weak_mods(MOD_BIT(KC_LSHIFT)); - send_keyboard_report(); - record->tap.count = 0; // ad hoc: cancel tap - } else { - unregister_mods(MOD_BIT(KC_LSHIFT)); - } - } - break; - } -} diff --git a/keyboard/hhkb/keymap_hhkb.c b/keyboard/hhkb/keymap_hhkb.c deleted file mode 100644 index 86ad0f5ee..000000000 --- a/keyboard/hhkb/keymap_hhkb.c +++ /dev/null @@ -1,95 +0,0 @@ -/* - * HHKB Layout - */ -#include "keymap_common.h" - - -#ifdef KEYMAP_SECTION_ENABLE -const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS] __attribute__ ((section (".keymap.keymaps"))) = { -#else -const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS] PROGMEM = { -#endif - /* Layer 0: Default Layer - * ,-----------------------------------------------------------. - * |Esc| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| \| `| - * |-----------------------------------------------------------| - * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]|Backs| - * |-----------------------------------------------------------| - * |Contro| A| S| D| F| G| H| J| K| L| ;| '|Enter | - * |-----------------------------------------------------------| - * |Shift | Z| X| C| V| B| N| M| ,| .| /|Shift |Fn0| - * `-----------------------------------------------------------' - * |Alt|Gui | Space |Gui |Alt| - * `-------------------------------------------' - */ - KEYMAP(ESC, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSLS,GRV, \ - TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC,BSPC, \ - LCTL,A, S, D, F, G, H, J, K, L, SCLN,QUOT,ENT, \ - LSFT,Z, X, C, V, B, N, M, COMM,DOT, SLSH,RSFT,FN0, \ - LALT,LGUI, SPC, RGUI,RALT), - - /* Layer 1: HHKB mode (HHKB Fn) - * ,-----------------------------------------------------------. - * |Pwr| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Ins|Del| - * |-----------------------------------------------------------| - * |Caps | | | | | | | |Psc|Slk|Pus|Up | |Backs| - * |-----------------------------------------------------------| - * | |VoD|VoU|Mut| | | *| /|Hom|PgU|Lef|Rig|Enter | - * |-----------------------------------------------------------| - * | | | | | | | +| -|End|PgD|Dow| | | - * `-----------------------------------------------------------' - * | | | | | | - * `-------------------------------------------' - */ - KEYMAP(PWR, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, \ - CAPS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,PSCR,SLCK,PAUS, UP, TRNS, BSPC, \ - TRNS,VOLD,VOLU,MUTE,TRNS,TRNS,PAST,PSLS,HOME,PGUP,LEFT,RGHT,PENT, \ - TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,PPLS,PMNS,END, PGDN,DOWN,TRNS,TRNS, \ - TRNS,TRNS, TRNS, TRNS,TRNS), -}; - - - -/* - * Fn action definition - */ -#ifdef KEYMAP_SECTION_ENABLE -const uint16_t fn_actions[] __attribute__ ((section (".keymap.fn_actions"))) = { - [0] = ACTION_LAYER_MOMENTARY(1), - [1] = ACTION_LAYER_MOMENTARY(2), - [2] = ACTION_LAYER_MOMENTARY(3), - [3] = ACTION_LAYER_MOMENTARY(4), - [4] = ACTION_LAYER_MOMENTARY(5), - [5] = ACTION_LAYER_MOMENTARY(6), - [6] = ACTION_LAYER_MOMENTARY(7), - [7] = ACTION_LAYER_TOGGLE(1), - [8] = ACTION_LAYER_TOGGLE(2), - [9] = ACTION_LAYER_TOGGLE(3), - [10] = ACTION_LAYER_TAP_TOGGLE(1), - [11] = ACTION_LAYER_TAP_TOGGLE(2), - [12] = ACTION_LAYER_TAP_TOGGLE(3), - [13] = ACTION_LAYER_TAP_KEY(1, KC_A), - [14] = ACTION_LAYER_TAP_KEY(2, KC_F), - [15] = ACTION_LAYER_TAP_KEY(3, KC_J), - [16] = ACTION_LAYER_TAP_KEY(4, KC_SPACE), - [17] = ACTION_LAYER_TAP_KEY(5, KC_SCOLON), - [18] = ACTION_LAYER_TAP_KEY(6, KC_QUOTE), - [19] = ACTION_LAYER_TAP_KEY(7, KC_SLASH), - [20] = ACTION_MODS_TAP_KEY(MOD_LSFT, KC_SPACE), - [21] = ACTION_MODS_TAP_KEY(MOD_LCTL, KC_SPACE), - [22] = ACTION_MODS_TAP_KEY(MOD_RCTL, KC_QUOTE), - [23] = ACTION_MODS_TAP_KEY(MOD_RCTL, KC_ENTER), - [24] = ACTION_MODS_TAP_KEY(MOD_LCTL, KC_ESC), - [25] = ACTION_MODS_TAP_KEY(MOD_LCTL, KC_BSPACE), - [26] = ACTION_MODS_ONESHOT(MOD_LCTL), - [27] = ACTION_MODS_TAP_KEY(MOD_LSFT, KC_ESC), - [28] = ACTION_MODS_TAP_KEY(MOD_LSFT, KC_BSPACE), - [29] = ACTION_MODS_ONESHOT(MOD_LSFT), - [30] = ACTION_MODS_TAP_KEY(MOD_RSFT, KC_ESC), - [31] = ACTION_MODS_TAP_KEY(MOD_RSFT, KC_BSPACE), -}; -#else -const uint16_t fn_actions[] PROGMEM = { - [0] = ACTION_LAYER_MOMENTARY(1), -}; -#endif diff --git a/keyboard/hhkb/keymap_jp.c b/keyboard/hhkb/keymap_jp.c deleted file mode 100644 index 48d0ee70b..000000000 --- a/keyboard/hhkb/keymap_jp.c +++ /dev/null @@ -1,50 +0,0 @@ -/* - * HHKB JP Layout - */ -#include "keymap_common.h" - - -#ifdef KEYMAP_SECTION_ENABLE -const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS] __attribute__ ((section (".keymap.keymaps"))) = { -#else -const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS] PROGMEM = { -#endif - /* Layer 0: Default Layer */ - KEYMAP_JP(ESC, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, JYEN,BSPC, \ - TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC, \ - LCTL,A, S, D, F, G, H, J, K, L, SCLN,QUOT,BSLS,ENT, \ - LSFT,Z, X, C, V, B, N, M, COMM,DOT, SLSH,RO, UP, RSFT, \ - FN0, ZKHK,LGUI,LALT,MHEN, SPC, HENK,KANA,RALT,FN0, LEFT,DOWN,RGHT), - - /* Layer 1: HHKB mode (HHKB Fn) - * ,-----------------------------------------------------------. - * |Pwr| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Ins|Del| - * |-----------------------------------------------------------| - * |Caps | | | | | | | |Psc|Slk|Pus|Up | | | - * |------------------------------------------------------` | - * | |VoD|VoU|Mut| | | *| /|Hom|PgU|Lef|Rig| | | - * |-----------------------------------------------------------| - * | | | | | | | +| -|End|PgD|Dow| | | | - * |-----------------------------------------------------------| - * | || | | | | | | | | || | | | - * `-----------------------------------------------------------' - */ - KEYMAP_JP(PWR, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, \ - CAPS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,PSCR,SLCK,PAUS, UP, TRNS, \ - TRNS,VOLD,VOLU,MUTE,TRNS,TRNS,PAST,PSLS,HOME,PGUP,LEFT,RGHT,TRNS,PENT, \ - TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,PPLS,PMNS,END, PGDN,DOWN,TRNS,TRNS,TRNS, \ - TRNS,TRNS,TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS), -}; - - - -/* - * Fn action definition - */ -#ifdef KEYMAP_SECTION_ENABLE -const uint16_t fn_actions[] __attribute__ ((section (".keymap.fn_actions"))) = { -#else -const uint16_t fn_actions[] PROGMEM = { -#endif - [0] = ACTION_LAYER_MOMENTARY(1), -}; diff --git a/keyboard/hhkb/keymap_spacefn.c b/keyboard/hhkb/keymap_spacefn.c deleted file mode 100644 index deff920ae..000000000 --- a/keyboard/hhkb/keymap_spacefn.c +++ /dev/null @@ -1,116 +0,0 @@ -/* - * SpaceFN - * http://geekhack.org/index.php?topic=51069.0 - */ -#include "keymap_common.h" - - -const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - /* Layer 0: Default Layer - * ,-----------------------------------------------------------. - * |Esc| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| `|BSp| - * |-----------------------------------------------------------| - * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \| - * |-----------------------------------------------------------| - * |Contro| A| S| D| F| G| H| J| K| L| ;| '|Enter | - * |-----------------------------------------------------------| - * |Shift | Z| X| C| V| B| N| M| ,| .| /|Shift |Fn0| - * `-----------------------------------------------------------' - * |Gui|Alt | SpaceFN |Alt |Gui| - * `-------------------------------------------' - */ - KEYMAP(ESC, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, GRV, BSPC, \ - TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC,BSLS, \ - LCTL,A, S, D, F, G, H, J, K, L, SCLN,QUOT,ENT, \ - LSFT,Z, X, C, V, B, N, M, COMM,DOT, SLSH,RSFT,FN0, \ - LGUI,LALT, FN1, RALT,RGUI), - - /* Layer 1: HHKB mode (HHKB Fn) - * ,-----------------------------------------------------------. - * |Pwr| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Ins|Del| - * |-----------------------------------------------------------| - * |Caps | | | | | | | |Psc|Slk|Pus|Up | |Backs| - * |-----------------------------------------------------------| - * | |VoD|VoU|Mut| | | *| /|Hom|PgU|Lef|Rig|Enter | - * |-----------------------------------------------------------| - * | | | | | | | +| -|End|PgD|Dow| | | - * `-----------------------------------------------------------' - * | | | | | | - * `-------------------------------------------' - */ - KEYMAP(PWR, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, \ - CAPS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,PSCR,SLCK,PAUS, UP, TRNS, BSPC, \ - TRNS,VOLD,VOLU,MUTE,TRNS,TRNS,PAST,PSLS,HOME,PGUP,LEFT,RGHT,PENT, \ - TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,PPLS,PMNS,END, PGDN,DOWN,TRNS,TRNS, \ - TRNS,TRNS, SPC, TRNS,TRNS), - - /* Layer 2: SpaceFN - * ,-----------------------------------------------------------. - * |` | F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12| |Del| - * |-----------------------------------------------------------| - * | | | |Esc| | | |Hom|Up |End|Psc|Slk|Pau|Ins | - * |-----------------------------------------------------------| - * | | | | | | |PgU|Lef|Dow|Rig| | | | - * |-----------------------------------------------------------| - * | | | | | |Spc|PgD|` |~ | | | | | - * `-----------------------------------------------------------' - * | | | | | | - * `-------------------------------------------' - */ - KEYMAP(GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, TRNS,DEL, \ - TRNS,TRNS,TRNS,ESC, TRNS,TRNS,TRNS,HOME,FN3, END, PSCR,SLCK,PAUS,INS, \ - TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,PGUP,LEFT,DOWN,RGHT,TRNS,TRNS,TRNS, \ - TRNS,TRNS,TRNS,TRNS,TRNS,SPC, PGDN,GRV, FN2, TRNS,TRNS,TRNS,NO, \ - TRNS,TRNS, TRNS, TRNS,TRNS), -}; - - -/* - * user defined action function - */ -enum function_id { - CTRL_SPACE_I, // Ctrl + Up(SpaceFN) -> PgUp -}; - -void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) -{ -# define MODS_CTRL_MASK (MOD_BIT(KC_LCTRL)|MOD_BIT(KC_RCTRL)) - static uint8_t ctrl_space_i_prev_ctrl; - - switch (id) { - // Ctrl + Up(SpaceFN) -> PgUp - case CTRL_SPACE_I: - ctrl_space_i_prev_ctrl = get_mods()&MODS_CTRL_MASK; - if (record->event.pressed) { - if (ctrl_space_i_prev_ctrl) { - del_mods(ctrl_space_i_prev_ctrl); // remove Ctrl - add_key(KC_PGUP); - send_keyboard_report(); // send PgUp without Ctrl - add_mods(ctrl_space_i_prev_ctrl); // return Ctrl but not sent - } else { - add_key(KC_UP); - send_keyboard_report(); - } - } else { - if (ctrl_space_i_prev_ctrl) { - del_key(KC_PGUP); - send_keyboard_report(); - } else { - del_key(KC_UP); - send_keyboard_report(); - } - } - break; - } -} - - -/* - * Fn action definition - */ -const uint16_t PROGMEM fn_actions[] = { - [0] = ACTION_LAYER_MOMENTARY(1), - [1] = ACTION_LAYER_TAP_KEY(2, KC_SPACE), - [2] = ACTION_MODS_KEY(MOD_LSFT, KC_GRV), // tilde - [3] = ACTION_FUNCTION(CTRL_SPACE_I), // Ctrl + Up(SpaceFN) -> PgUp -}; diff --git a/keyboard/hhkb/keymaps/hasu.c b/keyboard/hhkb/keymaps/hasu.c new file mode 100644 index 000000000..a5602ded3 --- /dev/null +++ b/keyboard/hhkb/keymaps/hasu.c @@ -0,0 +1,282 @@ +/* + * Hasu: my personal keymap + */ +#include "keymap_common.h" + + +#ifdef KEYMAP_SECTION_ENABLE +const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS] __attribute__ ((section (".keymap.keymaps"))) = { +#else +const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS] PROGMEM = { +#endif + /* Layer 0: Default Layer + * ,-----------------------------------------------------------. + * |Esc| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| \| `| + * |-----------------------------------------------------------| + * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]|Backs| + * |-----------------------------------------------------------| + * |Contro| A| S| D| F| G| H| J| K| L|Fn3| '|Fn6 | + * |-----------------------------------------------------------| + * |Fn7 | Z| X| C| V| B| N| M| ,| .|Fn2|Shift |Fn1| + * `-----------------------------------------------------------' + * |Gui|Alt | Fn4 |Fn5 |Gui| + * `-------------------------------------------' + */ + [0] = \ + KEYMAP(ESC, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSLS,GRV, \ + TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC,BSPC, \ + LCTL,A, S, D, F, G, H, J, K, L, FN3, QUOT,FN6, \ + FN7, Z, X, C, V, B, N, M, COMM,DOT, FN2, RSFT,FN1, \ + LGUI,LALT, FN4, FN5, RGUI), + + /* Layer 1: HHKB mode[HHKB Fn] + * ,-----------------------------------------------------------. + * |Esc| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Ins|Del| + * |-----------------------------------------------------------| + * |Caps | | | | | | | |Psc|Slk|Pus|Up | |Backs| + * |-----------------------------------------------------------| + * |Contro|VoD|VoU|Mut| | | *| /|Hom|PgU|Lef|Rig|Enter | + * |-----------------------------------------------------------| + * |Shift | | | | | | +| -|End|PgD|Dow|Shift | | + * `-----------------------------------------------------------' + * |Gui|Alt | Space |Alt |Gui| + * `-------------------------------------------' + */ + [1] = \ + KEYMAP(GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, \ + CAPS,NO, NO, NO, NO, NO, NO, NO, PSCR,SLCK,PAUS, UP, NO, BSPC, \ + LCTL,VOLD,VOLU,MUTE,NO, NO, PAST,PSLS,HOME,PGUP,LEFT,RGHT,ENT, \ + LSFT,NO, NO, NO, NO, NO, PPLS,PMNS,END, PGDN,DOWN,RSFT,TRNS, \ + LGUI,LALT, TRNS, RALT,RGUI), + + /* Layer 2: Vi mode[Slash] + * ,-----------------------------------------------------------. + * |Esc| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Ins|Del| + * |-----------------------------------------------------------| + * |Tab |Hom|PgD|Up |PgU|End|Hom|PgD|PgUlEnd| | | |Backs| + * |-----------------------------------------------------------| + * |Contro| |Lef|Dow|Rig| |Lef|Dow|Up |Rig| | |Return | + * |-----------------------------------------------------------| + * |Shift | | | | | |Hom|PgD|PgUlEnd|Fn0|Shift | | + * `-----------------------------------------------------------' + * |Gui|Alt | Space |Alt |Gui| + * `-------------------------------------------' + */ + [2] = \ + KEYMAP(GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, \ + TAB, HOME,PGDN,UP, PGUP,END, HOME,PGDN,PGUP,END, NO, NO, NO, BSPC, \ + LCTL,NO, LEFT,DOWN,RGHT,NO, LEFT,DOWN,UP, RGHT,NO, NO, ENT, \ + LSFT,NO, NO, NO, NO, NO, HOME,PGDN,PGUP,END, FN2, RSFT,TRNS, \ + LGUI,LALT, SPC, RALT,RGUI), + + /* Layer 3: Mouse mode(IJKL)[Semicolon] + * ,-----------------------------------------------------------. + * |Esc| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Ins|Del| + * |-----------------------------------------------------------| + * |Tab | | | | | |MwL|MwD|McU|MwU|MwR|Wbk|Wfr|Alt-T| + * |-----------------------------------------------------------| + * |Contro| | | | | |Mb2|McL|McD|McR|Fn | |Return | + * |-----------------------------------------------------------| + * |Shift | | | | |Mb3|Mb2|Mb1|Mb4|Mb5| |Shift | | + * `-----------------------------------------------------------' + * |Gui |Alt | Mb1 |Fn |Fn | + * `--------------------------------------------' + * Mc: Mouse Cursor / Mb: Mouse Button / Mw: Mouse Wheel + */ + [3] = \ + KEYMAP(GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, \ + FN8, NO, NO, NO, NO, NO, WH_L,WH_D,MS_U,WH_U,WH_R,FN9, FN10,FN8, \ + LCTL,ACL0,ACL1,ACL2,ACL2,NO, NO, MS_L,MS_D,MS_R,FN3, NO, ENT, \ + LSFT,NO, NO, NO, NO, BTN3,BTN2,BTN1,FN9, FN10,NO, RSFT,TRNS, \ + LGUI,LALT, BTN1, TRNS,TRNS), + + /* Layer 4: Mouse mode(IJKL)[Space] + * ,-----------------------------------------------------------. + * |Esc| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Ins|Del| + * |-----------------------------------------------------------| + * |Tab | | | | | |MwL|MwD|McU|MwU|MwR|Wbk|Wfr|Alt-T| + * |-----------------------------------------------------------| + * |Contro| | | | | |Mb2|McL|McD|McR|Mb1| |Return | + * |-----------------------------------------------------------| + * |Shift | | | | |Mb3|Mb2|Mb1|Mb4|Mb5| |Shift | | + * `-----------------------------------------------------------' + * |Gui |Alt | Mb1 |Fn |Fn | + * `--------------------------------------------' + * Mc: Mouse Cursor / Mb: Mouse Button / Mw: Mouse Wheel + */ + [4] = \ + KEYMAP(GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, \ + FN8, NO, NO, NO, NO, NO, WH_L,WH_D,MS_U,WH_U,WH_R,BTN4,BTN5,FN8, \ + LCTL,VOLD,VOLU,MUTE,NO, NO, NO, MS_L,MS_D,MS_R,BTN1,NO, ENT, \ + LSFT,NO, NO, NO, NO, BTN3,BTN2,BTN1,FN9, FN10,NO, RSFT,TRNS, \ + LGUI,LALT, TRNS, TRNS,TRNS), + +#if 0 + /* Layer 3: Mouse mode(HJKL)[Semicolon] + * ,-----------------------------------------------------------. + * |Esc| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Ins|Del| + * |-----------------------------------------------------------| + * |Tab | | | | | |MwL|MwD|MwU|MwR| | | |Backs| + * |-----------------------------------------------------------| + * |Contro| | | | | |McL|McD|McU|McR|Fn0| |Return | + * |-----------------------------------------------------------| + * |Shift | | | | |Mb3|Mb2|Mb1|Mb4|Mb5| |Shift | | + * `-----------------------------------------------------------' + * |Gui |Alt | Mb1 |Alt |Fn0| + * `--------------------------------------------' + * Mc: Mouse Cursor / Mb: Mouse Button / Mw: Mouse Wheel + */ + KEYMAP(GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, \ + TAB, NO, NO, NO, NO, NO, NO, WH_D,WH_U,RGHT,NO, NO, NO, BSPC, \ + LCTL,NO, ACL0,ACL1,ACL2,NO, MS_L,MS_D,MS_U,MS_R,TRNS,QUOT,ENT, \ + LSFT,NO, NO, NO, NO, BTN3,BTN2,BTN1,FN9, FN10,SLSH,RSFT,NO, \ + LGUI,LALT, BTN1, RALT,TRNS), + + /* Layer4: Mouse mode(HJKL)[Space] + * ,-----------------------------------------------------------. + * |Esc| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Ins|Del| + * |-----------------------------------------------------------| + * |Tab | | | | | |MwL|MwD|MwU|MwR| |Wbk|Wfr|Alt-T| + * |-----------------------------------------------------------| + * |Contro| | | | | |McL|McD|McU|McR|Fn0| |Return | + * |-----------------------------------------------------------| + * |Shift | | | | |Mb3|Mb2|Mb1|Mb4|Mb5| |Shift | | + * `-----------------------------------------------------------' + * |Gui |Alt | Fn0 |Alt |Fn0| + * `--------------------------------------------' + * Mc: Mouse Cursor / Mb: Mouse Button / Mw: Mouse Wheel + */ + KEYMAP(GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, \ + FN8, NO, NO, NO, NO, NO, NO, WH_D,WH_U,RGHT,NO, FN9, FN10,FN8, \ + LCTL,NO, ACL0,ACL1,ACL2,NO, MS_L,MS_D,MS_U,MS_R,BTN1,NO, ENT, \ + LSFT,NO, NO, NO, NO, BTN3,BTN2,BTN1,FN9, FN10,NO, RSFT,NO, \ + LGUI,LALT, TRNS, RALT,RGUI), +#endif +#if 0 + /* Layer x: Matias half-qwerty keyboard style[Space] + * ,-----------------------------------------------------------. + * | -| 0| 9| 8| 7| 6| 5| 4| 3| 2| 1| | | |Esc| + * |-----------------------------------------------------------| + * |Backs| P| O| I| U| Y| T| R| E| W| Q| | |Tab | + * |-----------------------------------------------------------| + * |Contro| ;| L| K| J| H| G| F| D| S| A|Con|Control | + * |-----------------------------------------------------------| + * |Shift | /| .| ,| M| N| B| V| C| X| Z|Shift | | + * `-----------------------------------------------------------' + * |Gui |Alt | Fn0 |Alt |Gui| + * `--------------------------------------------' + */ + KEYMAP(MINS,0, 9, 8, 7, 6, 5, 4, 3, 2, 1, NO, NO, NO, ESC, \ + BSPC,P, O, I, U, Y, T, R, E, W, Q, NO, NO, TAB, \ + LCTL,SCLN,L, K, J, H, G, F, D, S, A, RCTL,RCTL, \ + LSFT,SLSH,DOT, COMM,M, N, B, V, C, X, Z, RSFT,NO, \ + LGUI,LALT, TRNS, RALT,RGUI), +#endif +}; + + + +/* id for user defined functions */ +enum function_id { + LSHIFT_LPAREN, +}; + +enum macro_id { + HELLO, + VOLUP, + ALT_TAB, +}; + + +/* + * Fn action definition + */ +#ifdef KEYMAP_SECTION_ENABLE +const uint16_t fn_actions[] __attribute__ ((section (".keymap.fn_actions"))) = { +#else +const uint16_t fn_actions[] PROGMEM = { +#endif + [0] = ACTION_DEFAULT_LAYER_SET(0), // Default layer(not used) + [1] = ACTION_LAYER_TAP_TOGGLE(1), // HHKB layer(toggle with 5 taps) + [2] = ACTION_LAYER_TAP_KEY(2, KC_SLASH), // Cursor layer with Slash* + [3] = ACTION_LAYER_TAP_KEY(3, KC_SCLN), // Mousekey layer with Semicolon* + [4] = ACTION_LAYER_TAP_KEY(4, KC_SPC), // Mousekey layer with Space + [5] = ACTION_LAYER_MOMENTARY(4), // Mousekey layer(IJKL) + [6] = ACTION_MODS_TAP_KEY(MOD_RCTL, KC_ENT), // RControl with tap Enter + [7] = ACTION_MODS_ONESHOT(MOD_LSFT), // Oneshot Shift + [8] = ACTION_MACRO(ALT_TAB), // Application switching + [9] = ACTION_MODS_KEY(MOD_LALT, KC_LEFT), + [10] = ACTION_MODS_KEY(MOD_LALT, KC_RIGHT), + +// [x] = ACTION_LMOD_TAP_KEY(KC_LCTL, KC_BSPC), // LControl with tap Backspace +// [x] = ACTION_LMOD_TAP_KEY(KC_LCTL, KC_ESC), // LControl with tap Esc +// [x] = ACTION_FUNCTION_TAP(LSHIFT_LPAREN), // Function: LShift with tap '(' +// [x] = ACTION_MACRO(HELLO), // Macro: say hello +// [x] = ACTION_MACRO(VOLUP), // Macro: media key +}; + + +/* + * Macro definition + */ +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) +{ + switch (id) { + case HELLO: + return (record->event.pressed ? + MACRO( I(0), T(H), T(E), T(L), T(L), W(255), T(O), END ) : + MACRO_NONE ); + case VOLUP: + return (record->event.pressed ? + MACRO( D(VOLU), U(VOLU), END ) : + MACRO_NONE ); + case ALT_TAB: + return (record->event.pressed ? + MACRO( D(LALT), D(TAB), END ) : + MACRO( U(TAB), END )); + } + return MACRO_NONE; +} + + + +/* + * user defined action function + */ +void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) +{ + if (record->event.pressed) dprint("P"); else dprint("R"); + dprintf("%d", record->tap.count); + if (record->tap.interrupted) dprint("i"); + dprint("\n"); + + switch (id) { + case LSHIFT_LPAREN: + // Shift parentheses example: LShft + tap '(' + // http://stevelosh.com/blog/2012/10/a-modern-space-cadet/#shift-parentheses + // http://geekhack.org/index.php?topic=41989.msg1304899#msg1304899 + if (record->event.pressed) { + if (record->tap.count > 0 && !record->tap.interrupted) { + if (record->tap.interrupted) { + dprint("tap interrupted\n"); + register_mods(MOD_BIT(KC_LSHIFT)); + } + } else { + register_mods(MOD_BIT(KC_LSHIFT)); + } + } else { + if (record->tap.count > 0 && !(record->tap.interrupted)) { + add_weak_mods(MOD_BIT(KC_LSHIFT)); + send_keyboard_report(); + register_code(KC_9); + unregister_code(KC_9); + del_weak_mods(MOD_BIT(KC_LSHIFT)); + send_keyboard_report(); + record->tap.count = 0; // ad hoc: cancel tap + } else { + unregister_mods(MOD_BIT(KC_LSHIFT)); + } + } + break; + } +} diff --git a/keyboard/hhkb/keymaps/hhkb.c b/keyboard/hhkb/keymaps/hhkb.c new file mode 100644 index 000000000..86ad0f5ee --- /dev/null +++ b/keyboard/hhkb/keymaps/hhkb.c @@ -0,0 +1,95 @@ +/* + * HHKB Layout + */ +#include "keymap_common.h" + + +#ifdef KEYMAP_SECTION_ENABLE +const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS] __attribute__ ((section (".keymap.keymaps"))) = { +#else +const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS] PROGMEM = { +#endif + /* Layer 0: Default Layer + * ,-----------------------------------------------------------. + * |Esc| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| \| `| + * |-----------------------------------------------------------| + * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]|Backs| + * |-----------------------------------------------------------| + * |Contro| A| S| D| F| G| H| J| K| L| ;| '|Enter | + * |-----------------------------------------------------------| + * |Shift | Z| X| C| V| B| N| M| ,| .| /|Shift |Fn0| + * `-----------------------------------------------------------' + * |Alt|Gui | Space |Gui |Alt| + * `-------------------------------------------' + */ + KEYMAP(ESC, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSLS,GRV, \ + TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC,BSPC, \ + LCTL,A, S, D, F, G, H, J, K, L, SCLN,QUOT,ENT, \ + LSFT,Z, X, C, V, B, N, M, COMM,DOT, SLSH,RSFT,FN0, \ + LALT,LGUI, SPC, RGUI,RALT), + + /* Layer 1: HHKB mode (HHKB Fn) + * ,-----------------------------------------------------------. + * |Pwr| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Ins|Del| + * |-----------------------------------------------------------| + * |Caps | | | | | | | |Psc|Slk|Pus|Up | |Backs| + * |-----------------------------------------------------------| + * | |VoD|VoU|Mut| | | *| /|Hom|PgU|Lef|Rig|Enter | + * |-----------------------------------------------------------| + * | | | | | | | +| -|End|PgD|Dow| | | + * `-----------------------------------------------------------' + * | | | | | | + * `-------------------------------------------' + */ + KEYMAP(PWR, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, \ + CAPS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,PSCR,SLCK,PAUS, UP, TRNS, BSPC, \ + TRNS,VOLD,VOLU,MUTE,TRNS,TRNS,PAST,PSLS,HOME,PGUP,LEFT,RGHT,PENT, \ + TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,PPLS,PMNS,END, PGDN,DOWN,TRNS,TRNS, \ + TRNS,TRNS, TRNS, TRNS,TRNS), +}; + + + +/* + * Fn action definition + */ +#ifdef KEYMAP_SECTION_ENABLE +const uint16_t fn_actions[] __attribute__ ((section (".keymap.fn_actions"))) = { + [0] = ACTION_LAYER_MOMENTARY(1), + [1] = ACTION_LAYER_MOMENTARY(2), + [2] = ACTION_LAYER_MOMENTARY(3), + [3] = ACTION_LAYER_MOMENTARY(4), + [4] = ACTION_LAYER_MOMENTARY(5), + [5] = ACTION_LAYER_MOMENTARY(6), + [6] = ACTION_LAYER_MOMENTARY(7), + [7] = ACTION_LAYER_TOGGLE(1), + [8] = ACTION_LAYER_TOGGLE(2), + [9] = ACTION_LAYER_TOGGLE(3), + [10] = ACTION_LAYER_TAP_TOGGLE(1), + [11] = ACTION_LAYER_TAP_TOGGLE(2), + [12] = ACTION_LAYER_TAP_TOGGLE(3), + [13] = ACTION_LAYER_TAP_KEY(1, KC_A), + [14] = ACTION_LAYER_TAP_KEY(2, KC_F), + [15] = ACTION_LAYER_TAP_KEY(3, KC_J), + [16] = ACTION_LAYER_TAP_KEY(4, KC_SPACE), + [17] = ACTION_LAYER_TAP_KEY(5, KC_SCOLON), + [18] = ACTION_LAYER_TAP_KEY(6, KC_QUOTE), + [19] = ACTION_LAYER_TAP_KEY(7, KC_SLASH), + [20] = ACTION_MODS_TAP_KEY(MOD_LSFT, KC_SPACE), + [21] = ACTION_MODS_TAP_KEY(MOD_LCTL, KC_SPACE), + [22] = ACTION_MODS_TAP_KEY(MOD_RCTL, KC_QUOTE), + [23] = ACTION_MODS_TAP_KEY(MOD_RCTL, KC_ENTER), + [24] = ACTION_MODS_TAP_KEY(MOD_LCTL, KC_ESC), + [25] = ACTION_MODS_TAP_KEY(MOD_LCTL, KC_BSPACE), + [26] = ACTION_MODS_ONESHOT(MOD_LCTL), + [27] = ACTION_MODS_TAP_KEY(MOD_LSFT, KC_ESC), + [28] = ACTION_MODS_TAP_KEY(MOD_LSFT, KC_BSPACE), + [29] = ACTION_MODS_ONESHOT(MOD_LSFT), + [30] = ACTION_MODS_TAP_KEY(MOD_RSFT, KC_ESC), + [31] = ACTION_MODS_TAP_KEY(MOD_RSFT, KC_BSPACE), +}; +#else +const uint16_t fn_actions[] PROGMEM = { + [0] = ACTION_LAYER_MOMENTARY(1), +}; +#endif diff --git a/keyboard/hhkb/keymaps/jp.c b/keyboard/hhkb/keymaps/jp.c new file mode 100644 index 000000000..48d0ee70b --- /dev/null +++ b/keyboard/hhkb/keymaps/jp.c @@ -0,0 +1,50 @@ +/* + * HHKB JP Layout + */ +#include "keymap_common.h" + + +#ifdef KEYMAP_SECTION_ENABLE +const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS] __attribute__ ((section (".keymap.keymaps"))) = { +#else +const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS] PROGMEM = { +#endif + /* Layer 0: Default Layer */ + KEYMAP_JP(ESC, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, JYEN,BSPC, \ + TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC, \ + LCTL,A, S, D, F, G, H, J, K, L, SCLN,QUOT,BSLS,ENT, \ + LSFT,Z, X, C, V, B, N, M, COMM,DOT, SLSH,RO, UP, RSFT, \ + FN0, ZKHK,LGUI,LALT,MHEN, SPC, HENK,KANA,RALT,FN0, LEFT,DOWN,RGHT), + + /* Layer 1: HHKB mode (HHKB Fn) + * ,-----------------------------------------------------------. + * |Pwr| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Ins|Del| + * |-----------------------------------------------------------| + * |Caps | | | | | | | |Psc|Slk|Pus|Up | | | + * |------------------------------------------------------` | + * | |VoD|VoU|Mut| | | *| /|Hom|PgU|Lef|Rig| | | + * |-----------------------------------------------------------| + * | | | | | | | +| -|End|PgD|Dow| | | | + * |-----------------------------------------------------------| + * | || | | | | | | | | || | | | + * `-----------------------------------------------------------' + */ + KEYMAP_JP(PWR, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, \ + CAPS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,PSCR,SLCK,PAUS, UP, TRNS, \ + TRNS,VOLD,VOLU,MUTE,TRNS,TRNS,PAST,PSLS,HOME,PGUP,LEFT,RGHT,TRNS,PENT, \ + TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,PPLS,PMNS,END, PGDN,DOWN,TRNS,TRNS,TRNS, \ + TRNS,TRNS,TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS), +}; + + + +/* + * Fn action definition + */ +#ifdef KEYMAP_SECTION_ENABLE +const uint16_t fn_actions[] __attribute__ ((section (".keymap.fn_actions"))) = { +#else +const uint16_t fn_actions[] PROGMEM = { +#endif + [0] = ACTION_LAYER_MOMENTARY(1), +}; diff --git a/keyboard/hhkb/keymaps/spacefn.c b/keyboard/hhkb/keymaps/spacefn.c new file mode 100644 index 000000000..deff920ae --- /dev/null +++ b/keyboard/hhkb/keymaps/spacefn.c @@ -0,0 +1,116 @@ +/* + * SpaceFN + * http://geekhack.org/index.php?topic=51069.0 + */ +#include "keymap_common.h" + + +const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* Layer 0: Default Layer + * ,-----------------------------------------------------------. + * |Esc| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| `|BSp| + * |-----------------------------------------------------------| + * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \| + * |-----------------------------------------------------------| + * |Contro| A| S| D| F| G| H| J| K| L| ;| '|Enter | + * |-----------------------------------------------------------| + * |Shift | Z| X| C| V| B| N| M| ,| .| /|Shift |Fn0| + * `-----------------------------------------------------------' + * |Gui|Alt | SpaceFN |Alt |Gui| + * `-------------------------------------------' + */ + KEYMAP(ESC, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, GRV, BSPC, \ + TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC,BSLS, \ + LCTL,A, S, D, F, G, H, J, K, L, SCLN,QUOT,ENT, \ + LSFT,Z, X, C, V, B, N, M, COMM,DOT, SLSH,RSFT,FN0, \ + LGUI,LALT, FN1, RALT,RGUI), + + /* Layer 1: HHKB mode (HHKB Fn) + * ,-----------------------------------------------------------. + * |Pwr| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Ins|Del| + * |-----------------------------------------------------------| + * |Caps | | | | | | | |Psc|Slk|Pus|Up | |Backs| + * |-----------------------------------------------------------| + * | |VoD|VoU|Mut| | | *| /|Hom|PgU|Lef|Rig|Enter | + * |-----------------------------------------------------------| + * | | | | | | | +| -|End|PgD|Dow| | | + * `-----------------------------------------------------------' + * | | | | | | + * `-------------------------------------------' + */ + KEYMAP(PWR, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, \ + CAPS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,PSCR,SLCK,PAUS, UP, TRNS, BSPC, \ + TRNS,VOLD,VOLU,MUTE,TRNS,TRNS,PAST,PSLS,HOME,PGUP,LEFT,RGHT,PENT, \ + TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,PPLS,PMNS,END, PGDN,DOWN,TRNS,TRNS, \ + TRNS,TRNS, SPC, TRNS,TRNS), + + /* Layer 2: SpaceFN + * ,-----------------------------------------------------------. + * |` | F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12| |Del| + * |-----------------------------------------------------------| + * | | | |Esc| | | |Hom|Up |End|Psc|Slk|Pau|Ins | + * |-----------------------------------------------------------| + * | | | | | | |PgU|Lef|Dow|Rig| | | | + * |-----------------------------------------------------------| + * | | | | | |Spc|PgD|` |~ | | | | | + * `-----------------------------------------------------------' + * | | | | | | + * `-------------------------------------------' + */ + KEYMAP(GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, TRNS,DEL, \ + TRNS,TRNS,TRNS,ESC, TRNS,TRNS,TRNS,HOME,FN3, END, PSCR,SLCK,PAUS,INS, \ + TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,PGUP,LEFT,DOWN,RGHT,TRNS,TRNS,TRNS, \ + TRNS,TRNS,TRNS,TRNS,TRNS,SPC, PGDN,GRV, FN2, TRNS,TRNS,TRNS,NO, \ + TRNS,TRNS, TRNS, TRNS,TRNS), +}; + + +/* + * user defined action function + */ +enum function_id { + CTRL_SPACE_I, // Ctrl + Up(SpaceFN) -> PgUp +}; + +void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) +{ +# define MODS_CTRL_MASK (MOD_BIT(KC_LCTRL)|MOD_BIT(KC_RCTRL)) + static uint8_t ctrl_space_i_prev_ctrl; + + switch (id) { + // Ctrl + Up(SpaceFN) -> PgUp + case CTRL_SPACE_I: + ctrl_space_i_prev_ctrl = get_mods()&MODS_CTRL_MASK; + if (record->event.pressed) { + if (ctrl_space_i_prev_ctrl) { + del_mods(ctrl_space_i_prev_ctrl); // remove Ctrl + add_key(KC_PGUP); + send_keyboard_report(); // send PgUp without Ctrl + add_mods(ctrl_space_i_prev_ctrl); // return Ctrl but not sent + } else { + add_key(KC_UP); + send_keyboard_report(); + } + } else { + if (ctrl_space_i_prev_ctrl) { + del_key(KC_PGUP); + send_keyboard_report(); + } else { + del_key(KC_UP); + send_keyboard_report(); + } + } + break; + } +} + + +/* + * Fn action definition + */ +const uint16_t PROGMEM fn_actions[] = { + [0] = ACTION_LAYER_MOMENTARY(1), + [1] = ACTION_LAYER_TAP_KEY(2, KC_SPACE), + [2] = ACTION_MODS_KEY(MOD_LSFT, KC_GRV), // tilde + [3] = ACTION_FUNCTION(CTRL_SPACE_I), // Ctrl + Up(SpaceFN) -> PgUp +}; diff --git a/keyboard/hhkb_qmk/Makefile b/keyboard/hhkb_qmk/Makefile index 8bd44100b..21ba261a2 100644 --- a/keyboard/hhkb_qmk/Makefile +++ b/keyboard/hhkb_qmk/Makefile @@ -54,9 +54,9 @@ SRC = hhkb_qmk.c \ matrix.c ifdef KEYMAP - SRC := keymaps/keymap_$(KEYMAP).c $(SRC) + SRC := keymaps/keymaps/$(KEYMAP).c $(SRC) else - SRC := keymaps/keymap_default.c $(SRC) + SRC := keymaps/keymaps/default.c $(SRC) endif CONFIG_H = config.h diff --git a/keyboard/hhkb_qmk/README.md b/keyboard/hhkb_qmk/README.md index 606025c41..389407b3a 100644 --- a/keyboard/hhkb_qmk/README.md +++ b/keyboard/hhkb_qmk/README.md @@ -171,10 +171,10 @@ Depending on which keymap you would like to use, you will have to compile slight To build with the default keymap, simply run `make`. ### Other Keymaps -Several version of keymap are available in advance but you are recommended to define your favorite layout yourself. To define your own keymap create file named `keymap_.c` and see keymap document (you can find in top README.md) and existent keymap files. +Several version of keymap are available in advance but you are recommended to define your favorite layout yourself. To define your own keymap create a file in the keymaps folder named `.c` and see keymap document (you can find in top README.md) and existent keymap files. To build the firmware binary hex file with a keymap just do `make` with `KEYMAP` option like: ``` $ make KEYMAP=[default|jack|] ``` -Keymaps follow the format **__keymap\_\.c__** and are stored in the `keymaps` folder. +Keymaps follow the format **__\.c__** and are stored in the `keymaps` folder. diff --git a/keyboard/hhkb_qmk/keymaps/default.c b/keyboard/hhkb_qmk/keymaps/default.c new file mode 100644 index 000000000..bcd8ead37 --- /dev/null +++ b/keyboard/hhkb_qmk/keymaps/default.c @@ -0,0 +1,78 @@ +/* -*- eval: (turn-on-orgtbl); -*- + * default HHKB Layout + */ +#include "hhkb_qmk.h" + +#define BASE 0 +#define HHKB 1 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + /* BASE Level: Default Layer + |-------+---+---+---+---+---+---+---+---+---+---+-------+-----+-------+---| + | Esc | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | \ | ` | + |-------+---+---+---+---+---+---+---+---+---+---+-------+-----+-------+---| + | Tab | Q | W | E | R | T | Y | U | I | O | P | [ | ] | Backs | | + |-------+---+---+---+---+---+---+---+---+---+---+-------+-----+-------+---| + | Cont | A | S | D | F | G | H | J | K | L | ; | ' | Ent | | | + |-------+---+---+---+---+---+---+---+---+---+---+-------+-----+-------+---| + | Shift | Z | X | C | V | B | N | M | , | . | / | Shift | Fn0 | | | + |-------+---+---+---+---+---+---+---+---+---+---+-------+-----+-------+---| + + |------+------+-----------------------+------+------| + | LAlt | LGUI | ******* Space ******* | RGUI | RAlt | + |------+------+-----------------------+------+------| + */ + + [BASE] = KEYMAP( // default layer + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSLS, KC_GRV, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSPC, \ + KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, MO(HHKB), \ + KC_LALT, KC_LGUI, /* */ KC_SPC, KC_RGUI, KC_RALT), + + + + /* Layer HHKB: HHKB mode (HHKB Fn) + |------+-----+-----+-----+----+----+----+----+-----+-----+-----+-----+-------+-------+-----| + | Pwr | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | Ins | Del | + |------+-----+-----+-----+----+----+----+----+-----+-----+-----+-----+-------+-------+-----| + | Caps | | | | | | | | Psc | Slk | Pus | Up | | Backs | | + |------+-----+-----+-----+----+----+----+----+-----+-----+-----+-----+-------+-------+-----| + | | VoD | VoU | Mut | | | * | / | Hom | PgU | Lef | Rig | Enter | | | + |------+-----+-----+-----+----+----+----+----+-----+-----+-----+-----+-------+-------+-----| + | | | | | | | + | - | End | PgD | Dow | | | | | + |------+-----+-----+-----+----+----+----+----+-----+-----+-----+-----+-------+-------+-----| + + |------+------+----------------------+------+------+ + | **** | **** | ******************** | **** | **** | + |------+------+----------------------+------+------+ + + */ + + [HHKB] = KEYMAP( + KC_PWR, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_INS, KC_DEL, \ + KC_CAPS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PSCR, KC_SLCK, KC_PAUS, KC_UP, KC_TRNS, KC_BSPC, \ + KC_TRNS, KC_VOLD, KC_VOLU, KC_MUTE, KC_TRNS, KC_TRNS, KC_PAST, KC_PSLS, KC_HOME, KC_PGUP, KC_LEFT, KC_RGHT, KC_PENT, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PPLS, KC_PMNS, KC_END, KC_PGDN, KC_DOWN, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS)}; + + +const uint16_t PROGMEM fn_actions[] = { + +}; + +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) +{ + // MACRODOWN only works in this function + switch(id) { + case 0: + if (record->event.pressed) { + register_code(KC_RSFT); + } else { + unregister_code(KC_RSFT); + } + break; + } + return MACRO_NONE; +}; diff --git a/keyboard/hhkb_qmk/keymaps/keymap_default.c b/keyboard/hhkb_qmk/keymaps/keymap_default.c deleted file mode 100644 index bcd8ead37..000000000 --- a/keyboard/hhkb_qmk/keymaps/keymap_default.c +++ /dev/null @@ -1,78 +0,0 @@ -/* -*- eval: (turn-on-orgtbl); -*- - * default HHKB Layout - */ -#include "hhkb_qmk.h" - -#define BASE 0 -#define HHKB 1 - -const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - - /* BASE Level: Default Layer - |-------+---+---+---+---+---+---+---+---+---+---+-------+-----+-------+---| - | Esc | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | \ | ` | - |-------+---+---+---+---+---+---+---+---+---+---+-------+-----+-------+---| - | Tab | Q | W | E | R | T | Y | U | I | O | P | [ | ] | Backs | | - |-------+---+---+---+---+---+---+---+---+---+---+-------+-----+-------+---| - | Cont | A | S | D | F | G | H | J | K | L | ; | ' | Ent | | | - |-------+---+---+---+---+---+---+---+---+---+---+-------+-----+-------+---| - | Shift | Z | X | C | V | B | N | M | , | . | / | Shift | Fn0 | | | - |-------+---+---+---+---+---+---+---+---+---+---+-------+-----+-------+---| - - |------+------+-----------------------+------+------| - | LAlt | LGUI | ******* Space ******* | RGUI | RAlt | - |------+------+-----------------------+------+------| - */ - - [BASE] = KEYMAP( // default layer - KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSLS, KC_GRV, \ - KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSPC, \ - KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, \ - KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, MO(HHKB), \ - KC_LALT, KC_LGUI, /* */ KC_SPC, KC_RGUI, KC_RALT), - - - - /* Layer HHKB: HHKB mode (HHKB Fn) - |------+-----+-----+-----+----+----+----+----+-----+-----+-----+-----+-------+-------+-----| - | Pwr | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | Ins | Del | - |------+-----+-----+-----+----+----+----+----+-----+-----+-----+-----+-------+-------+-----| - | Caps | | | | | | | | Psc | Slk | Pus | Up | | Backs | | - |------+-----+-----+-----+----+----+----+----+-----+-----+-----+-----+-------+-------+-----| - | | VoD | VoU | Mut | | | * | / | Hom | PgU | Lef | Rig | Enter | | | - |------+-----+-----+-----+----+----+----+----+-----+-----+-----+-----+-------+-------+-----| - | | | | | | | + | - | End | PgD | Dow | | | | | - |------+-----+-----+-----+----+----+----+----+-----+-----+-----+-----+-------+-------+-----| - - |------+------+----------------------+------+------+ - | **** | **** | ******************** | **** | **** | - |------+------+----------------------+------+------+ - - */ - - [HHKB] = KEYMAP( - KC_PWR, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_INS, KC_DEL, \ - KC_CAPS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PSCR, KC_SLCK, KC_PAUS, KC_UP, KC_TRNS, KC_BSPC, \ - KC_TRNS, KC_VOLD, KC_VOLU, KC_MUTE, KC_TRNS, KC_TRNS, KC_PAST, KC_PSLS, KC_HOME, KC_PGUP, KC_LEFT, KC_RGHT, KC_PENT, \ - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PPLS, KC_PMNS, KC_END, KC_PGDN, KC_DOWN, KC_TRNS, KC_TRNS, \ - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS)}; - - -const uint16_t PROGMEM fn_actions[] = { - -}; - -const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) -{ - // MACRODOWN only works in this function - switch(id) { - case 0: - if (record->event.pressed) { - register_code(KC_RSFT); - } else { - unregister_code(KC_RSFT); - } - break; - } - return MACRO_NONE; -}; diff --git a/keyboard/hhkb_qmk/keymaps/keymap_lxol.c b/keyboard/hhkb_qmk/keymaps/keymap_lxol.c deleted file mode 100644 index 3256fda51..000000000 --- a/keyboard/hhkb_qmk/keymaps/keymap_lxol.c +++ /dev/null @@ -1,208 +0,0 @@ -/* -*- eval: (turn-on-orgtbl); -*- - * lxol HHKB Layout - */ -#include "hhkb_qmk.h" - -#define BASE 0 -#define WIN 1 -#define HHKB 2 -#define RGUILEV 3 -#define LGUILEV 4 -#define RALTLEV 5 -#define LALTLEV 6 - - -const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - - /* Layer 0: Default Layer - |--------+---+---+---+---+---+---+---+---+---+-----+-------+----------+-------+---| - | Esc | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | \ | ` | - |--------+---+---+---+---+---+---+---+---+---+-----+-------+----------+-------+---| - | Tab | Q | W | E | R | T | Y | U | I | O | P | [ | ] | Backs | | - |--------+---+---+---+---+---+---+---+---+---+-----+-------+----------+-------+---| - | Contro | A | S | D | F | G | H | J | K | L | ; | ' | RCtl/Ent | | | - |--------+---+---+---+---+---+---+---+---+---+-----+-------+----------+-------+---| - | Shift | Z | X | C | V | B | N | M | , | . | Fn2 | Shift | Fn0 | | | - |--------+---+---+---+---+---+---+---+---+---+-----+-------+----------+-------+---| - - |------+------+-------+------+------| - | LAlt | LGUI | Space | RGUI | RAlt | - |------+------+-------+------+------| - */ - - [BASE] = KEYMAP( // layer 0 : default - - - KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSLS, KC_GRV, \ - KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSPC, \ - KC_LCTL, LT(LALTLEV,KC_A), LT(LGUILEV,KC_S), KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, LT(RGUILEV,KC_L), LT(RALTLEV,KC_SCLN), KC_QUOT, KC_FN0, \ - KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, MO(HHKB), \ - KC_LALT, KC_LGUI, KC_SPC, KC_RGUI, KC_RALT), - - - - /* Layer 1: HHKB mode (HHKB Fn) - |------+-----+-----+-----+----+----+----+----+-----+-----+-----+-----+-------+-------+-----| - | Pwr | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | Ins | Del | - |------+-----+-----+-----+----+----+----+----+-----+-----+-----+-----+-------+-------+-----| - | Caps | | | | | | | | Psc | Slk | Pus | Up | | Backs | | - |------+-----+-----+-----+----+----+----+----+-----+-----+-----+-----+-------+-------+-----| - | | VoD | VoU | Mut | | | * | / | Hom | PgU | Lef | Rig | Enter | | | - |------+-----+-----+-----+----+----+----+----+-----+-----+-----+-----+-------+-------+-----| - | | | | | | | + | - | End | PgD | Dow | | | | | - |------+-----+-----+-----+----+----+----+----+-----+-----+-----+-----+-------+-------+-----| - - |---+---+---+---+---| - | | | | | | - |---+---+---+---+---| - */ - - [HHKB] = KEYMAP( - KC_PWR, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_INS, KC_DEL, \ - KC_CAPS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PSCR, KC_SLCK, KC_PAUS, KC_UP, KC_TRNS, KC_BSPC, \ - KC_TRNS, KC_VOLD, KC_VOLU, KC_MUTE, KC_TRNS, KC_TRNS, KC_PAST, KC_PSLS, KC_HOME, KC_PGUP, KC_LEFT, KC_RGHT, KC_PENT, \ - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PPLS, KC_PMNS, KC_END, KC_PGDN, KC_DOWN, KC_TRNS, KC_TRNS, \ - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), - - - /* Layer LGUI: All keys with RGUI modifier - |--------+---+---+---+---+---+---+---+---+---+-----+-------+----------+-------+---| - | Esc | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | \ | ` | - |--------+---+---+---+---+---+---+---+---+---+-----+-------+----------+-------+---| - | Tab | Q | W | E | R | T | Y | U | I | O | P | [ | ] | Backs | | - |--------+---+---+---+---+---+---+---+---+---+-----+-------+----------+-------+---| - | Contro | A | S | D | F | G | H | J | K | | ; | ' | RCtl/Ent | | | - |--------+---+---+---+---+---+---+---+---+---+-----+-------+----------+-------+---| - | Shift | Z | X | C | V | B | N | M | , | . | Fn2 | Shift | Fn0 | | | - |--------+---+---+---+---+---+---+---+---+---+-----+-------+----------+-------+---| - - |------+------+-------+------+------| - | LAlt | LGUI | Space | RGUI | RAlt | - |------+------+-------+------+------| - */ - - [RGUILEV] = KEYMAP( // Right GUI layer by KC_L - - RGUI(KC_ESC), RGUI(KC_1), RGUI(KC_2), RGUI(KC_3), RGUI(KC_4), RGUI(KC_5), RGUI(KC_6), RGUI(KC_7), RGUI(KC_8), RGUI(KC_9), RGUI(KC_0), RGUI(KC_MINS), RGUI(KC_EQL), RGUI(KC_BSLS), RGUI(KC_GRV), \ - RGUI(KC_TAB), RGUI(KC_Q), RGUI(KC_W), RGUI(KC_E), RGUI(KC_R), RGUI(KC_T), RGUI(KC_Y), RGUI(KC_U), RGUI(KC_I), RGUI(KC_O), RGUI(KC_P), RGUI(KC_LBRC), RGUI(KC_RBRC), RGUI(KC_BSPC), \ - RGUI(KC_LCTL), RGUI(KC_A), RGUI(KC_S), RGUI(KC_D), RGUI(KC_F), RGUI(KC_G), RGUI(KC_H), RGUI(KC_J), RGUI(KC_K), KC_TRNS, KC_TRNS, RGUI(KC_QUOT), KC_FN0, \ - RGUI(KC_LSFT), RGUI(KC_Z), RGUI(KC_X), RGUI(KC_C), RGUI(KC_V), RGUI(KC_B), RGUI(KC_N), RGUI(KC_M), RGUI(KC_COMM), RGUI(KC_DOT), RGUI(KC_SLSH), RGUI(KC_RSFT), KC_TRNS, \ - KC_LALT, KC_LGUI, RGUI(KC_SPC), KC_RGUI, KC_RALT), - - /* Layer LGUI: All keys with LGUI modifier - |--------+---+---+---+---+---+---+---+---+---+-----+-------+----------+-------+---| - | Esc | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | \ | ` | - |--------+---+---+---+---+---+---+---+---+---+-----+-------+----------+-------+---| - | Tab | Q | W | E | R | T | Y | U | I | O | P | [ | ] | Backs | | - |--------+---+---+---+---+---+---+---+---+---+-----+-------+----------+-------+---| - | Contro | A | S | D | F | G | H | J | K | | ; | ' | RCtl/Ent | | | - |--------+---+---+---+---+---+---+---+---+---+-----+-------+----------+-------+---| - | Shift | Z | X | C | V | B | N | M | , | . | Fn2 | Shift | Fn0 | | | - |--------+---+---+---+---+---+---+---+---+---+-----+-------+----------+-------+---| - - |------+------+-------+------+------| - | LAlt | LGUI | Space | LGUI | RAlt | - |------+------+-------+------+------| - */ - - [LGUILEV] = KEYMAP( // Right GUI layer by KC_L - - LGUI(KC_ESC), LGUI(KC_1), LGUI(KC_2), LGUI(KC_3), LGUI(KC_4), LGUI(KC_5), LGUI(KC_6), LGUI(KC_7), LGUI(KC_8), LGUI(KC_9), LGUI(KC_0), LGUI(KC_MINS), LGUI(KC_EQL), LGUI(KC_BSLS), LGUI(KC_GRV), \ - LGUI(KC_TAB), LGUI(KC_Q), LGUI(KC_W), LGUI(KC_E), LGUI(KC_R), LGUI(KC_T), LGUI(KC_Y), LGUI(KC_U), LGUI(KC_I), LGUI(KC_O), LGUI(KC_P), LGUI(KC_LBRC), LGUI(KC_RBRC), LGUI(KC_BSPC), \ - LGUI(KC_LCTL), KC_TRNS, KC_TRNS, LGUI(KC_D), LGUI(KC_F), LGUI(KC_G), LGUI(KC_H), LGUI(KC_J), LGUI(KC_K), LGUI(KC_L), LGUI(KC_SCLN), LGUI(KC_QUOT), KC_FN0, \ - KC_LSFT, LGUI(KC_Z), LGUI(KC_X), LGUI(KC_C), LGUI(KC_V), LGUI(KC_B), LGUI(KC_N), LGUI(KC_M), LGUI(KC_COMM), LGUI(KC_DOT), LGUI(KC_SLSH), KC_RSFT, KC_TRNS, \ - KC_LALT, KC_LGUI, LGUI(KC_SPC), KC_LGUI, KC_RALT), - - /* Layer LALT: All keys with RALT modifier - |--------+---+---+---+---+---+---+---+---+---+-----+-------+----------+-------+---| - | Esc | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | \ | ` | - |--------+---+---+---+---+---+---+---+---+---+-----+-------+----------+-------+---| - | Tab | Q | W | E | R | T | Y | U | I | O | P | [ | ] | Backs | | - |--------+---+---+---+---+---+---+---+---+---+-----+-------+----------+-------+---| - | Contro | A | S | D | F | G | H | J | K | | ; | ' | RCtl/Ent | | | - |--------+---+---+---+---+---+---+---+---+---+-----+-------+----------+-------+---| - | Shift | Z | X | C | V | B | N | M | , | . | Fn2 | Shift | Fn0 | | | - |--------+---+---+---+---+---+---+---+---+---+-----+-------+----------+-------+---| - - |------+------+-------+------+------| - | LAlt | LGUI | Space | RGUI | RAlt | - |------+------+-------+------+------| - */ - - [RALTLEV] = KEYMAP( // Right ALT layer by KC_L - - RALT(KC_ESC), RALT(KC_1), RALT(KC_2), RALT(KC_3), RALT(KC_4), RALT(KC_5), RALT(KC_6), RALT(KC_7), RALT(KC_8), RALT(KC_9), RALT(KC_0), RALT(KC_MINS), RALT(KC_EQL), RALT(KC_BSLS), RALT(KC_GRV), \ - RALT(KC_TAB), RALT(KC_Q), RALT(KC_W), RALT(KC_E), RALT(KC_R), RALT(KC_T), RALT(KC_Y), RALT(KC_U), RALT(KC_I), RALT(KC_O), RALT(KC_P), RALT(KC_LBRC), RALT(KC_RBRC), RALT(KC_BSPC), \ - RALT(KC_LCTL), RALT(KC_A), RALT(KC_S), RALT(KC_D), RALT(KC_F), RALT(KC_G), RALT(KC_H), RALT(KC_J), RALT(KC_K), KC_TRNS, KC_TRNS, RALT(KC_QUOT), KC_FN0, \ - RALT(KC_LSFT), RALT(KC_Z), RALT(KC_X), RALT(KC_C), RALT(KC_V), RALT(KC_B), RALT(KC_N), RALT(KC_M), RALT(KC_COMM), RALT(KC_DOT), RALT(KC_SLSH), RALT(KC_RSFT), KC_TRNS, \ - KC_LALT, KC_LGUI, RALT(KC_SPC), KC_RGUI, KC_RALT), - - /* Layer LALT: All keys with LALT modifier - |--------+---+---+---+---+---+---+---+---+---+-----+-------+----------+-------+---| - | Esc | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | \ | ` | - |--------+---+---+---+---+---+---+---+---+---+-----+-------+----------+-------+---| - | Tab | Q | W | E | R | T | Y | U | I | O | P | [ | ] | Backs | | - |--------+---+---+---+---+---+---+---+---+---+-----+-------+----------+-------+---| - | Contro | A | S | D | F | G | H | J | K | | ; | ' | RCtl/Ent | | | - |--------+---+---+---+---+---+---+---+---+---+-----+-------+----------+-------+---| - | Shift | Z | X | C | V | B | N | M | , | . | Fn2 | Shift | Fn0 | | | - |--------+---+---+---+---+---+---+---+---+---+-----+-------+----------+-------+---| - - |------+------+-------+------+------| - | LAlt | LGUI | Space | LGUI | RAlt | - |------+------+-------+------+------| - */ - - [LALTLEV] = KEYMAP( // Right ALT layer by KC_L - - LALT(KC_ESC), LALT(KC_1), LALT(KC_2), LALT(KC_3), LALT(KC_4), LALT(KC_5), LALT(KC_6), LALT(KC_7), LALT(KC_8), LALT(KC_9), LALT(KC_0), LALT(KC_MINS), LALT(KC_EQL), LALT(KC_BSLS), LALT(KC_GRV), \ - LALT(KC_TAB), LALT(KC_Q), LALT(KC_W), LALT(KC_E), LALT(KC_R), LALT(KC_T), LALT(KC_Y), LALT(KC_U), LALT(KC_I), LALT(KC_O), LALT(KC_P), LALT(KC_LBRC), LALT(KC_RBRC), LALT(KC_BSPC), \ - LALT(KC_LCTL), KC_TRNS, KC_TRNS, LALT(KC_D), LALT(KC_F), LALT(KC_G), LALT(KC_H), LALT(KC_J), LALT(KC_K), LALT(KC_L), LALT(KC_SCLN), LALT(KC_QUOT), KC_FN0, \ - KC_LSFT, LALT(KC_Z), LALT(KC_X), LALT(KC_C), LALT(KC_V), LALT(KC_B), LALT(KC_N), LALT(KC_M), LALT(KC_COMM), LALT(KC_DOT), LALT(KC_SLSH), KC_RSFT, KC_TRNS, \ - KC_LALT, KC_LGUI, LALT(KC_SPC), KC_LGUI, KC_RALT), - - - /* Layer WIN: Win layer - |--------+---+---+---+---+---+---+---+---+---+---+-------+----------+-------+---| - | Esc | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | \ | ` | - |--------+---+---+---+---+---+---+---+---+---+---+-------+----------+-------+---| - | Tab | Q | W | E | R | T | Y | U | I | O | P | [ | ] | Backs | | - |--------+---+---+---+---+---+---+---+---+---+---+-------+----------+-------+---| - | Contro | A | S | D | F | G | H | J | K | L | ; | ' | RCtl/Ent | | | - |--------+---+---+---+---+---+---+---+---+---+---+-------+----------+-------+---| - | Shift | Z | X | C | V | B | N | M | , | . | / | Shift | Fn0 | | | - |--------+---+---+---+---+---+---+---+---+---+---+-------+----------+-------+---| - - |------+------+-------+------+------| - | LGui | LAlt | Space | RGui | Ralt | - |------+------+-------+------+------| - */ - - [WIN] = KEYMAP( // BASE level with swapped GUI/ALT - - - KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSLS, KC_GRV, \ - KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSPC, \ - KC_LCTL, LT(LGUILEV,KC_A), LT(LALTLEV,KC_S), KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, LT(RALTLEV,KC_L), LT(RGUILEV,KC_SCLN), KC_QUOT, KC_FN0, \ - KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, MO(HHKB), \ - KC_RGUI, KC_RALT, KC_SPC, KC_RALT, KC_RGUI)}; - - -const uint16_t PROGMEM fn_actions[] = { - [0] = ACTION_MODS_TAP_KEY(MOD_RCTL, KC_ENT) // RControl with tap Enter* -}; - -const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) -{ - // MACRODOWN only works in this function - switch(id) { - case 0: - if (record->event.pressed) { - register_code(KC_RSFT); - } else { - unregister_code(KC_RSFT); - } - break; - } - return MACRO_NONE; -}; diff --git a/keyboard/hhkb_qmk/keymaps/lxol.c b/keyboard/hhkb_qmk/keymaps/lxol.c new file mode 100644 index 000000000..3256fda51 --- /dev/null +++ b/keyboard/hhkb_qmk/keymaps/lxol.c @@ -0,0 +1,208 @@ +/* -*- eval: (turn-on-orgtbl); -*- + * lxol HHKB Layout + */ +#include "hhkb_qmk.h" + +#define BASE 0 +#define WIN 1 +#define HHKB 2 +#define RGUILEV 3 +#define LGUILEV 4 +#define RALTLEV 5 +#define LALTLEV 6 + + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + /* Layer 0: Default Layer + |--------+---+---+---+---+---+---+---+---+---+-----+-------+----------+-------+---| + | Esc | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | \ | ` | + |--------+---+---+---+---+---+---+---+---+---+-----+-------+----------+-------+---| + | Tab | Q | W | E | R | T | Y | U | I | O | P | [ | ] | Backs | | + |--------+---+---+---+---+---+---+---+---+---+-----+-------+----------+-------+---| + | Contro | A | S | D | F | G | H | J | K | L | ; | ' | RCtl/Ent | | | + |--------+---+---+---+---+---+---+---+---+---+-----+-------+----------+-------+---| + | Shift | Z | X | C | V | B | N | M | , | . | Fn2 | Shift | Fn0 | | | + |--------+---+---+---+---+---+---+---+---+---+-----+-------+----------+-------+---| + + |------+------+-------+------+------| + | LAlt | LGUI | Space | RGUI | RAlt | + |------+------+-------+------+------| + */ + + [BASE] = KEYMAP( // layer 0 : default + + + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSLS, KC_GRV, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSPC, \ + KC_LCTL, LT(LALTLEV,KC_A), LT(LGUILEV,KC_S), KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, LT(RGUILEV,KC_L), LT(RALTLEV,KC_SCLN), KC_QUOT, KC_FN0, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, MO(HHKB), \ + KC_LALT, KC_LGUI, KC_SPC, KC_RGUI, KC_RALT), + + + + /* Layer 1: HHKB mode (HHKB Fn) + |------+-----+-----+-----+----+----+----+----+-----+-----+-----+-----+-------+-------+-----| + | Pwr | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | Ins | Del | + |------+-----+-----+-----+----+----+----+----+-----+-----+-----+-----+-------+-------+-----| + | Caps | | | | | | | | Psc | Slk | Pus | Up | | Backs | | + |------+-----+-----+-----+----+----+----+----+-----+-----+-----+-----+-------+-------+-----| + | | VoD | VoU | Mut | | | * | / | Hom | PgU | Lef | Rig | Enter | | | + |------+-----+-----+-----+----+----+----+----+-----+-----+-----+-----+-------+-------+-----| + | | | | | | | + | - | End | PgD | Dow | | | | | + |------+-----+-----+-----+----+----+----+----+-----+-----+-----+-----+-------+-------+-----| + + |---+---+---+---+---| + | | | | | | + |---+---+---+---+---| + */ + + [HHKB] = KEYMAP( + KC_PWR, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_INS, KC_DEL, \ + KC_CAPS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PSCR, KC_SLCK, KC_PAUS, KC_UP, KC_TRNS, KC_BSPC, \ + KC_TRNS, KC_VOLD, KC_VOLU, KC_MUTE, KC_TRNS, KC_TRNS, KC_PAST, KC_PSLS, KC_HOME, KC_PGUP, KC_LEFT, KC_RGHT, KC_PENT, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PPLS, KC_PMNS, KC_END, KC_PGDN, KC_DOWN, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + + + /* Layer LGUI: All keys with RGUI modifier + |--------+---+---+---+---+---+---+---+---+---+-----+-------+----------+-------+---| + | Esc | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | \ | ` | + |--------+---+---+---+---+---+---+---+---+---+-----+-------+----------+-------+---| + | Tab | Q | W | E | R | T | Y | U | I | O | P | [ | ] | Backs | | + |--------+---+---+---+---+---+---+---+---+---+-----+-------+----------+-------+---| + | Contro | A | S | D | F | G | H | J | K | | ; | ' | RCtl/Ent | | | + |--------+---+---+---+---+---+---+---+---+---+-----+-------+----------+-------+---| + | Shift | Z | X | C | V | B | N | M | , | . | Fn2 | Shift | Fn0 | | | + |--------+---+---+---+---+---+---+---+---+---+-----+-------+----------+-------+---| + + |------+------+-------+------+------| + | LAlt | LGUI | Space | RGUI | RAlt | + |------+------+-------+------+------| + */ + + [RGUILEV] = KEYMAP( // Right GUI layer by KC_L + + RGUI(KC_ESC), RGUI(KC_1), RGUI(KC_2), RGUI(KC_3), RGUI(KC_4), RGUI(KC_5), RGUI(KC_6), RGUI(KC_7), RGUI(KC_8), RGUI(KC_9), RGUI(KC_0), RGUI(KC_MINS), RGUI(KC_EQL), RGUI(KC_BSLS), RGUI(KC_GRV), \ + RGUI(KC_TAB), RGUI(KC_Q), RGUI(KC_W), RGUI(KC_E), RGUI(KC_R), RGUI(KC_T), RGUI(KC_Y), RGUI(KC_U), RGUI(KC_I), RGUI(KC_O), RGUI(KC_P), RGUI(KC_LBRC), RGUI(KC_RBRC), RGUI(KC_BSPC), \ + RGUI(KC_LCTL), RGUI(KC_A), RGUI(KC_S), RGUI(KC_D), RGUI(KC_F), RGUI(KC_G), RGUI(KC_H), RGUI(KC_J), RGUI(KC_K), KC_TRNS, KC_TRNS, RGUI(KC_QUOT), KC_FN0, \ + RGUI(KC_LSFT), RGUI(KC_Z), RGUI(KC_X), RGUI(KC_C), RGUI(KC_V), RGUI(KC_B), RGUI(KC_N), RGUI(KC_M), RGUI(KC_COMM), RGUI(KC_DOT), RGUI(KC_SLSH), RGUI(KC_RSFT), KC_TRNS, \ + KC_LALT, KC_LGUI, RGUI(KC_SPC), KC_RGUI, KC_RALT), + + /* Layer LGUI: All keys with LGUI modifier + |--------+---+---+---+---+---+---+---+---+---+-----+-------+----------+-------+---| + | Esc | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | \ | ` | + |--------+---+---+---+---+---+---+---+---+---+-----+-------+----------+-------+---| + | Tab | Q | W | E | R | T | Y | U | I | O | P | [ | ] | Backs | | + |--------+---+---+---+---+---+---+---+---+---+-----+-------+----------+-------+---| + | Contro | A | S | D | F | G | H | J | K | | ; | ' | RCtl/Ent | | | + |--------+---+---+---+---+---+---+---+---+---+-----+-------+----------+-------+---| + | Shift | Z | X | C | V | B | N | M | , | . | Fn2 | Shift | Fn0 | | | + |--------+---+---+---+---+---+---+---+---+---+-----+-------+----------+-------+---| + + |------+------+-------+------+------| + | LAlt | LGUI | Space | LGUI | RAlt | + |------+------+-------+------+------| + */ + + [LGUILEV] = KEYMAP( // Right GUI layer by KC_L + + LGUI(KC_ESC), LGUI(KC_1), LGUI(KC_2), LGUI(KC_3), LGUI(KC_4), LGUI(KC_5), LGUI(KC_6), LGUI(KC_7), LGUI(KC_8), LGUI(KC_9), LGUI(KC_0), LGUI(KC_MINS), LGUI(KC_EQL), LGUI(KC_BSLS), LGUI(KC_GRV), \ + LGUI(KC_TAB), LGUI(KC_Q), LGUI(KC_W), LGUI(KC_E), LGUI(KC_R), LGUI(KC_T), LGUI(KC_Y), LGUI(KC_U), LGUI(KC_I), LGUI(KC_O), LGUI(KC_P), LGUI(KC_LBRC), LGUI(KC_RBRC), LGUI(KC_BSPC), \ + LGUI(KC_LCTL), KC_TRNS, KC_TRNS, LGUI(KC_D), LGUI(KC_F), LGUI(KC_G), LGUI(KC_H), LGUI(KC_J), LGUI(KC_K), LGUI(KC_L), LGUI(KC_SCLN), LGUI(KC_QUOT), KC_FN0, \ + KC_LSFT, LGUI(KC_Z), LGUI(KC_X), LGUI(KC_C), LGUI(KC_V), LGUI(KC_B), LGUI(KC_N), LGUI(KC_M), LGUI(KC_COMM), LGUI(KC_DOT), LGUI(KC_SLSH), KC_RSFT, KC_TRNS, \ + KC_LALT, KC_LGUI, LGUI(KC_SPC), KC_LGUI, KC_RALT), + + /* Layer LALT: All keys with RALT modifier + |--------+---+---+---+---+---+---+---+---+---+-----+-------+----------+-------+---| + | Esc | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | \ | ` | + |--------+---+---+---+---+---+---+---+---+---+-----+-------+----------+-------+---| + | Tab | Q | W | E | R | T | Y | U | I | O | P | [ | ] | Backs | | + |--------+---+---+---+---+---+---+---+---+---+-----+-------+----------+-------+---| + | Contro | A | S | D | F | G | H | J | K | | ; | ' | RCtl/Ent | | | + |--------+---+---+---+---+---+---+---+---+---+-----+-------+----------+-------+---| + | Shift | Z | X | C | V | B | N | M | , | . | Fn2 | Shift | Fn0 | | | + |--------+---+---+---+---+---+---+---+---+---+-----+-------+----------+-------+---| + + |------+------+-------+------+------| + | LAlt | LGUI | Space | RGUI | RAlt | + |------+------+-------+------+------| + */ + + [RALTLEV] = KEYMAP( // Right ALT layer by KC_L + + RALT(KC_ESC), RALT(KC_1), RALT(KC_2), RALT(KC_3), RALT(KC_4), RALT(KC_5), RALT(KC_6), RALT(KC_7), RALT(KC_8), RALT(KC_9), RALT(KC_0), RALT(KC_MINS), RALT(KC_EQL), RALT(KC_BSLS), RALT(KC_GRV), \ + RALT(KC_TAB), RALT(KC_Q), RALT(KC_W), RALT(KC_E), RALT(KC_R), RALT(KC_T), RALT(KC_Y), RALT(KC_U), RALT(KC_I), RALT(KC_O), RALT(KC_P), RALT(KC_LBRC), RALT(KC_RBRC), RALT(KC_BSPC), \ + RALT(KC_LCTL), RALT(KC_A), RALT(KC_S), RALT(KC_D), RALT(KC_F), RALT(KC_G), RALT(KC_H), RALT(KC_J), RALT(KC_K), KC_TRNS, KC_TRNS, RALT(KC_QUOT), KC_FN0, \ + RALT(KC_LSFT), RALT(KC_Z), RALT(KC_X), RALT(KC_C), RALT(KC_V), RALT(KC_B), RALT(KC_N), RALT(KC_M), RALT(KC_COMM), RALT(KC_DOT), RALT(KC_SLSH), RALT(KC_RSFT), KC_TRNS, \ + KC_LALT, KC_LGUI, RALT(KC_SPC), KC_RGUI, KC_RALT), + + /* Layer LALT: All keys with LALT modifier + |--------+---+---+---+---+---+---+---+---+---+-----+-------+----------+-------+---| + | Esc | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | \ | ` | + |--------+---+---+---+---+---+---+---+---+---+-----+-------+----------+-------+---| + | Tab | Q | W | E | R | T | Y | U | I | O | P | [ | ] | Backs | | + |--------+---+---+---+---+---+---+---+---+---+-----+-------+----------+-------+---| + | Contro | A | S | D | F | G | H | J | K | | ; | ' | RCtl/Ent | | | + |--------+---+---+---+---+---+---+---+---+---+-----+-------+----------+-------+---| + | Shift | Z | X | C | V | B | N | M | , | . | Fn2 | Shift | Fn0 | | | + |--------+---+---+---+---+---+---+---+---+---+-----+-------+----------+-------+---| + + |------+------+-------+------+------| + | LAlt | LGUI | Space | LGUI | RAlt | + |------+------+-------+------+------| + */ + + [LALTLEV] = KEYMAP( // Right ALT layer by KC_L + + LALT(KC_ESC), LALT(KC_1), LALT(KC_2), LALT(KC_3), LALT(KC_4), LALT(KC_5), LALT(KC_6), LALT(KC_7), LALT(KC_8), LALT(KC_9), LALT(KC_0), LALT(KC_MINS), LALT(KC_EQL), LALT(KC_BSLS), LALT(KC_GRV), \ + LALT(KC_TAB), LALT(KC_Q), LALT(KC_W), LALT(KC_E), LALT(KC_R), LALT(KC_T), LALT(KC_Y), LALT(KC_U), LALT(KC_I), LALT(KC_O), LALT(KC_P), LALT(KC_LBRC), LALT(KC_RBRC), LALT(KC_BSPC), \ + LALT(KC_LCTL), KC_TRNS, KC_TRNS, LALT(KC_D), LALT(KC_F), LALT(KC_G), LALT(KC_H), LALT(KC_J), LALT(KC_K), LALT(KC_L), LALT(KC_SCLN), LALT(KC_QUOT), KC_FN0, \ + KC_LSFT, LALT(KC_Z), LALT(KC_X), LALT(KC_C), LALT(KC_V), LALT(KC_B), LALT(KC_N), LALT(KC_M), LALT(KC_COMM), LALT(KC_DOT), LALT(KC_SLSH), KC_RSFT, KC_TRNS, \ + KC_LALT, KC_LGUI, LALT(KC_SPC), KC_LGUI, KC_RALT), + + + /* Layer WIN: Win layer + |--------+---+---+---+---+---+---+---+---+---+---+-------+----------+-------+---| + | Esc | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | \ | ` | + |--------+---+---+---+---+---+---+---+---+---+---+-------+----------+-------+---| + | Tab | Q | W | E | R | T | Y | U | I | O | P | [ | ] | Backs | | + |--------+---+---+---+---+---+---+---+---+---+---+-------+----------+-------+---| + | Contro | A | S | D | F | G | H | J | K | L | ; | ' | RCtl/Ent | | | + |--------+---+---+---+---+---+---+---+---+---+---+-------+----------+-------+---| + | Shift | Z | X | C | V | B | N | M | , | . | / | Shift | Fn0 | | | + |--------+---+---+---+---+---+---+---+---+---+---+-------+----------+-------+---| + + |------+------+-------+------+------| + | LGui | LAlt | Space | RGui | Ralt | + |------+------+-------+------+------| + */ + + [WIN] = KEYMAP( // BASE level with swapped GUI/ALT + + + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSLS, KC_GRV, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSPC, \ + KC_LCTL, LT(LGUILEV,KC_A), LT(LALTLEV,KC_S), KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, LT(RALTLEV,KC_L), LT(RGUILEV,KC_SCLN), KC_QUOT, KC_FN0, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, MO(HHKB), \ + KC_RGUI, KC_RALT, KC_SPC, KC_RALT, KC_RGUI)}; + + +const uint16_t PROGMEM fn_actions[] = { + [0] = ACTION_MODS_TAP_KEY(MOD_RCTL, KC_ENT) // RControl with tap Enter* +}; + +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) +{ + // MACRODOWN only works in this function + switch(id) { + case 0: + if (record->event.pressed) { + register_code(KC_RSFT); + } else { + unregister_code(KC_RSFT); + } + break; + } + return MACRO_NONE; +}; diff --git a/keyboard/jd45/Makefile b/keyboard/jd45/Makefile index 076dced82..f6a8d10c5 100644 --- a/keyboard/jd45/Makefile +++ b/keyboard/jd45/Makefile @@ -54,9 +54,9 @@ SRC = jd45.c \ backlight.c ifdef KEYMAP - SRC := keymaps/keymap_$(KEYMAP).c $(SRC) + SRC := keymaps/keymaps/(KEYMAP).c $(SRC) else - SRC := keymaps/keymap_default.c $(SRC) + SRC := keymaps/keymaps/default.c $(SRC) endif CONFIG_H = config.h diff --git a/keyboard/jd45/keymaps/default.c b/keyboard/jd45/keymaps/default.c new file mode 100644 index 000000000..05dd46e79 --- /dev/null +++ b/keyboard/jd45/keymaps/default.c @@ -0,0 +1,31 @@ +#include "jd45.h" +#include "backlight.h" + +/* this keymap is to provide a basic keyboard layout for testing the matrix + * for more practical and complicated keymap refer to other keymaps in the same folder + */ +/* JD45 keymap definition macro + */ +#define KEYMAP( \ + K01, K02, K03, K04, K05, K06, K07, K08, K09, K10, K11, K12, K13, \ + K14, K15, K16, K17, K18, K19, K20, K21, K22, K23, K24, K25, \ + K26, K27, K28, K29, K30, K31, K32, K33, K34, K35, K36, K37, \ + K38, K39, K40, K41, K42, K43, K44, K45, K46, K47 \ +) { \ + { KC_##K01, KC_##K02, KC_##K03, KC_##K04, KC_##K05, KC_##K06, KC_##K07, KC_##K08, KC_##K09, KC_##K10, KC_##K11, KC_##K12, KC_##K13 }, \ + { KC_##K14, KC_##K15, KC_##K16, KC_##K17, KC_##K18, KC_##K19, KC_##K20, KC_##K21, KC_##K22, KC_##K23, KC_##K24, KC_##K25, KC_NO }, \ + { KC_##K26, KC_##K27, KC_##K28, KC_##K29, KC_##K30, KC_##K31, KC_##K32, KC_##K33, KC_##K34, KC_##K35, KC_##K36, KC_##K37, KC_NO }, \ + { KC_##K38, KC_##K39, KC_##K40, KC_##K41, KC_##K42, KC_NO, KC_##K43, KC_NO, KC_##K44, KC_##K45, KC_##K46, KC_##K47, KC_NO } \ +} + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +[0] = KEYMAP( + ESC, Q, W, E, R, T, Y, U, I, O, P, QUOT, BSPC, + TAB, A, S, D, F, G, H, J, K, L, SCLN, ENT, + LSFT, Z, X, C, V, B, N, M, COMM, DOT, SLSH, RSFT, + PAUSE, LCTL, LALT, DEL, SPC, DEL, LEFT, UP, DOWN, RIGHT ), +}; + +const uint16_t PROGMEM fn_actions[] = { + +}; diff --git a/keyboard/jd45/keymaps/justin.c b/keyboard/jd45/keymaps/justin.c new file mode 100644 index 000000000..f261b5463 --- /dev/null +++ b/keyboard/jd45/keymaps/justin.c @@ -0,0 +1,101 @@ +#include "jd45.h" +#include "backlight.h" + +/* JD45 keymap definition macro + */ +#define KEYMAP( \ + K01, K02, K03, K04, K05, K06, K07, K08, K09, K10, K11, K12, K13, \ + K14, K15, K16, K17, K18, K19, K20, K21, K22, K23, K24, K25, \ + K26, K27, K28, K29, K30, K31, K32, K33, K34, K35, K36, K37, \ + K38, K39, K40, K41, K42, K43, K44, K45, K46, K47 \ +) { \ + { KC_##K01, KC_##K02, KC_##K03, KC_##K04, KC_##K05, KC_##K06, KC_##K07, KC_##K08, KC_##K09, KC_##K10, KC_##K11, KC_##K12, KC_##K13 }, \ + { KC_##K14, KC_##K15, KC_##K16, KC_##K17, KC_##K18, KC_##K19, KC_##K20, KC_##K21, KC_##K22, KC_##K23, KC_##K24, KC_##K25, KC_NO }, \ + { KC_##K26, KC_##K27, KC_##K28, KC_##K29, KC_##K30, KC_##K31, KC_##K32, KC_##K33, KC_##K34, KC_##K35, KC_##K36, KC_##K37, KC_NO }, \ + { KC_##K38, KC_##K39, KC_##K40, KC_##K41, KC_##K42, KC_NO, KC_##K43, KC_NO, KC_##K44, KC_##K45, KC_##K46, KC_##K47, KC_NO } \ +} + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +[0] = KEYMAP( + ESC, Q, W, F, P, G, J, L, U, Y, SCLN, QUOT, BSPC, + FN8, A, R, S, T, D, H, N, E, I, O, ENT, + LSFT, Z, X, C, V, B, K, M, COMM, DOT, SLSH, FN6, + FN4, LGUI, FN7, FN2, FN1, SPC, FN5, RALT, FN3, FN0 ), +[1] = KEYMAP( + TRNS, FN10, FN11, FN12, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, UP, DEL, + TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, HOME, PGUP, LEFT, RGHT, + TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, END, PGDN, DOWN, TRNS, + TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS ), +[2] = KEYMAP( + TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, 7, 8, 9, 0, TRNS, TRNS, + TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, LBRC, 4, 5, 6, DOT, TRNS, + TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, RBRC, 1, 2, 3, BSLS, TRNS, + TRNS,FN29, TRNS, TRNS, TRNS, PAUSE, EQL, MINS, TRNS, TRNS ), +[3] = KEYMAP( + TRNS, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, + TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, + TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, + TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS ), +[4] = KEYMAP( + TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, 7, 8, 9, 0, TRNS, TRNS, + TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, LBRC, 4, 5, 6, DOT, TRNS, + TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, RBRC, 1, 2, 3, BSLS, TRNS, + TRNS,FN29, TRNS, TRNS, TRNS, PAUSE, EQL, MINS, TRNS, TRNS ), +}; + +enum macro_id { + PSWD1, + PSWD2, + PSWD3, +}; + +const uint16_t PROGMEM fn_actions[] = { + [0] = ACTION_MODS_TAP_KEY(MOD_LCTL, KC_MINS), + [1] = ACTION_LAYER_MOMENTARY(1), // FN1 + [2] = ACTION_LAYER_MOMENTARY(2), // FN2 + [3] = ACTION_LAYER_MOMENTARY(3), // FN3 + [4] = ACTION_MODS_TAP_KEY(MOD_LSFT, KC_GRV), + [5] = ACTION_MODS_TAP_KEY(MOD_RSFT, KC_RGUI), + [6] = ACTION_MODS_TAP_KEY(MOD_RSFT, KC_CAPS), + [7] = ACTION_LAYER_MODS(4, MOD_LSFT), // FN4 + [8] = ACTION_MODS_TAP_KEY(MOD_LCTL, KC_TAB), + + [10] = ACTION_MACRO(PSWD1), + [11] = ACTION_MACRO(PSWD2), + [12] = ACTION_MACRO(PSWD3), + + [29] = ACTION_BACKLIGHT_TOGGLE(), + [30] = ACTION_BACKLIGHT_INCREASE(), + [31] = ACTION_BACKLIGHT_DECREASE() + +}; + +/* + * Macro definition + */ +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) +{ + switch (id) { + case PSWD1: + return (record->event.pressed ? + MACRO( I(0), T(1), T(2), T(3), T(4), T(5), T(6), T(7), T(8), T(ENT), END ) : + MACRO_NONE ); + case PSWD2: + return (record->event.pressed ? + MACRO( I(0), T(1), T(2), T(3), T(4), T(5), T(6), T(7), T(8), T(ENT), END ) : + MACRO_NONE ); + case PSWD3: + return (record->event.pressed ? + MACRO( I(0), T(1), T(2), T(3), T(4), T(5), T(6), T(7), T(8), T(ENT), END ) : + MACRO_NONE ); + //case VOLUP: + // return (record->event.pressed ? + // MACRO( D(VOLU), U(VOLU), END ) : + // MACRO_NONE ); + //case ALT_TAB: + // return (record->event.pressed ? + // MACRO( D(LALT), D(TAB), END ) : + // MACRO( U(TAB), END )); + } + return MACRO_NONE; +} diff --git a/keyboard/jd45/keymaps/keymap_default.c b/keyboard/jd45/keymaps/keymap_default.c deleted file mode 100644 index 05dd46e79..000000000 --- a/keyboard/jd45/keymaps/keymap_default.c +++ /dev/null @@ -1,31 +0,0 @@ -#include "jd45.h" -#include "backlight.h" - -/* this keymap is to provide a basic keyboard layout for testing the matrix - * for more practical and complicated keymap refer to other keymaps in the same folder - */ -/* JD45 keymap definition macro - */ -#define KEYMAP( \ - K01, K02, K03, K04, K05, K06, K07, K08, K09, K10, K11, K12, K13, \ - K14, K15, K16, K17, K18, K19, K20, K21, K22, K23, K24, K25, \ - K26, K27, K28, K29, K30, K31, K32, K33, K34, K35, K36, K37, \ - K38, K39, K40, K41, K42, K43, K44, K45, K46, K47 \ -) { \ - { KC_##K01, KC_##K02, KC_##K03, KC_##K04, KC_##K05, KC_##K06, KC_##K07, KC_##K08, KC_##K09, KC_##K10, KC_##K11, KC_##K12, KC_##K13 }, \ - { KC_##K14, KC_##K15, KC_##K16, KC_##K17, KC_##K18, KC_##K19, KC_##K20, KC_##K21, KC_##K22, KC_##K23, KC_##K24, KC_##K25, KC_NO }, \ - { KC_##K26, KC_##K27, KC_##K28, KC_##K29, KC_##K30, KC_##K31, KC_##K32, KC_##K33, KC_##K34, KC_##K35, KC_##K36, KC_##K37, KC_NO }, \ - { KC_##K38, KC_##K39, KC_##K40, KC_##K41, KC_##K42, KC_NO, KC_##K43, KC_NO, KC_##K44, KC_##K45, KC_##K46, KC_##K47, KC_NO } \ -} - -const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { -[0] = KEYMAP( - ESC, Q, W, E, R, T, Y, U, I, O, P, QUOT, BSPC, - TAB, A, S, D, F, G, H, J, K, L, SCLN, ENT, - LSFT, Z, X, C, V, B, N, M, COMM, DOT, SLSH, RSFT, - PAUSE, LCTL, LALT, DEL, SPC, DEL, LEFT, UP, DOWN, RIGHT ), -}; - -const uint16_t PROGMEM fn_actions[] = { - -}; diff --git a/keyboard/jd45/keymaps/keymap_justin.c b/keyboard/jd45/keymaps/keymap_justin.c deleted file mode 100644 index f261b5463..000000000 --- a/keyboard/jd45/keymaps/keymap_justin.c +++ /dev/null @@ -1,101 +0,0 @@ -#include "jd45.h" -#include "backlight.h" - -/* JD45 keymap definition macro - */ -#define KEYMAP( \ - K01, K02, K03, K04, K05, K06, K07, K08, K09, K10, K11, K12, K13, \ - K14, K15, K16, K17, K18, K19, K20, K21, K22, K23, K24, K25, \ - K26, K27, K28, K29, K30, K31, K32, K33, K34, K35, K36, K37, \ - K38, K39, K40, K41, K42, K43, K44, K45, K46, K47 \ -) { \ - { KC_##K01, KC_##K02, KC_##K03, KC_##K04, KC_##K05, KC_##K06, KC_##K07, KC_##K08, KC_##K09, KC_##K10, KC_##K11, KC_##K12, KC_##K13 }, \ - { KC_##K14, KC_##K15, KC_##K16, KC_##K17, KC_##K18, KC_##K19, KC_##K20, KC_##K21, KC_##K22, KC_##K23, KC_##K24, KC_##K25, KC_NO }, \ - { KC_##K26, KC_##K27, KC_##K28, KC_##K29, KC_##K30, KC_##K31, KC_##K32, KC_##K33, KC_##K34, KC_##K35, KC_##K36, KC_##K37, KC_NO }, \ - { KC_##K38, KC_##K39, KC_##K40, KC_##K41, KC_##K42, KC_NO, KC_##K43, KC_NO, KC_##K44, KC_##K45, KC_##K46, KC_##K47, KC_NO } \ -} - -const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { -[0] = KEYMAP( - ESC, Q, W, F, P, G, J, L, U, Y, SCLN, QUOT, BSPC, - FN8, A, R, S, T, D, H, N, E, I, O, ENT, - LSFT, Z, X, C, V, B, K, M, COMM, DOT, SLSH, FN6, - FN4, LGUI, FN7, FN2, FN1, SPC, FN5, RALT, FN3, FN0 ), -[1] = KEYMAP( - TRNS, FN10, FN11, FN12, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, UP, DEL, - TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, HOME, PGUP, LEFT, RGHT, - TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, END, PGDN, DOWN, TRNS, - TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS ), -[2] = KEYMAP( - TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, 7, 8, 9, 0, TRNS, TRNS, - TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, LBRC, 4, 5, 6, DOT, TRNS, - TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, RBRC, 1, 2, 3, BSLS, TRNS, - TRNS,FN29, TRNS, TRNS, TRNS, PAUSE, EQL, MINS, TRNS, TRNS ), -[3] = KEYMAP( - TRNS, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, - TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, - TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, - TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS ), -[4] = KEYMAP( - TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, 7, 8, 9, 0, TRNS, TRNS, - TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, LBRC, 4, 5, 6, DOT, TRNS, - TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, RBRC, 1, 2, 3, BSLS, TRNS, - TRNS,FN29, TRNS, TRNS, TRNS, PAUSE, EQL, MINS, TRNS, TRNS ), -}; - -enum macro_id { - PSWD1, - PSWD2, - PSWD3, -}; - -const uint16_t PROGMEM fn_actions[] = { - [0] = ACTION_MODS_TAP_KEY(MOD_LCTL, KC_MINS), - [1] = ACTION_LAYER_MOMENTARY(1), // FN1 - [2] = ACTION_LAYER_MOMENTARY(2), // FN2 - [3] = ACTION_LAYER_MOMENTARY(3), // FN3 - [4] = ACTION_MODS_TAP_KEY(MOD_LSFT, KC_GRV), - [5] = ACTION_MODS_TAP_KEY(MOD_RSFT, KC_RGUI), - [6] = ACTION_MODS_TAP_KEY(MOD_RSFT, KC_CAPS), - [7] = ACTION_LAYER_MODS(4, MOD_LSFT), // FN4 - [8] = ACTION_MODS_TAP_KEY(MOD_LCTL, KC_TAB), - - [10] = ACTION_MACRO(PSWD1), - [11] = ACTION_MACRO(PSWD2), - [12] = ACTION_MACRO(PSWD3), - - [29] = ACTION_BACKLIGHT_TOGGLE(), - [30] = ACTION_BACKLIGHT_INCREASE(), - [31] = ACTION_BACKLIGHT_DECREASE() - -}; - -/* - * Macro definition - */ -const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) -{ - switch (id) { - case PSWD1: - return (record->event.pressed ? - MACRO( I(0), T(1), T(2), T(3), T(4), T(5), T(6), T(7), T(8), T(ENT), END ) : - MACRO_NONE ); - case PSWD2: - return (record->event.pressed ? - MACRO( I(0), T(1), T(2), T(3), T(4), T(5), T(6), T(7), T(8), T(ENT), END ) : - MACRO_NONE ); - case PSWD3: - return (record->event.pressed ? - MACRO( I(0), T(1), T(2), T(3), T(4), T(5), T(6), T(7), T(8), T(ENT), END ) : - MACRO_NONE ); - //case VOLUP: - // return (record->event.pressed ? - // MACRO( D(VOLU), U(VOLU), END ) : - // MACRO_NONE ); - //case ALT_TAB: - // return (record->event.pressed ? - // MACRO( D(LALT), D(TAB), END ) : - // MACRO( U(TAB), END )); - } - return MACRO_NONE; -} diff --git a/keyboard/planck/README.md b/keyboard/planck/README.md index 3ba0cc152..d9a1e3bee 100644 --- a/keyboard/planck/README.md +++ b/keyboard/planck/README.md @@ -16,13 +16,13 @@ Depending on which keymap you would like to use, you will have to compile slight To build with the default keymap, simply run `make`. ### Other Keymaps -Several version of keymap are available in advance but you are recommended to define your favorite layout yourself. To define your own keymap create file named `.c` and see keymap document (you can find in top README.md) and existent keymap files. +Several version of keymap are available in advance but you are recommended to define your favorite layout yourself. To define your own keymap create file named `.c` in the keymaps folder, and see keymap document (you can find in top README.md) and existent keymap files. To build the firmware binary hex file with a keymap just do `make` with `KEYMAP` option like: ``` $ make KEYMAP=[default|jack|] ``` -Keymaps follow the format **__.c__** and are stored in the `keymaps` folder. +Keymaps follow the format **__\.c__** and are stored in the `keymaps` folder. ### Notable forks (which some of the keymap files are from) - [Shane's Fork](https://github.com/shanecelis/tmk_keyboard/tree/master/keyboard/planck) diff --git a/keyboard/planck/common_keymaps/keymap_mitch.c b/keyboard/planck/common_keymaps/keymap_mitch.c deleted file mode 100644 index f7df7bbba..000000000 --- a/keyboard/planck/common_keymaps/keymap_mitch.c +++ /dev/null @@ -1,49 +0,0 @@ -#include "keymap_common.h" - -const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { -[0] = KEYMAP( - TAB, Q, W, E, R, T, Y, U, I, O, P, BSPC, - LCTL, A, S, D, F, G, H, J, K, L, SCLN, QUOT, - LSFT, Z, X, C, V, B, N, M, COMM, DOT, SLSH, FN3, - ESC, DEL, LALT, LGUI, FN2, SPC, FN1, LEFT, DOWN, UP, RGHT), -[1] = KEYMAP( - GRV, GRV, FN22, FN19, FN10, TRNS, TRNS, 7, 8, 9, 0, BSPC, - TRNS, LBRC, RBRC, FN23, FN24, TRNS, TRNS, 4, 5, 6, TRNS, BSLS, - TRNS, MINS, FN20, EQL, FN21, TRNS, TRNS, 1, 2, 3, TRNS, ENT, - TRNS, TRNS, TRNS, TRNS, TRNS, SPC, FN1, TRNS, PGDN, PGUP, TRNS), -[2] = KEYMAP( - FN26, FN10, FN11, FN12, FN13, FN14, FN15, FN17, FN18, FN19, FN10, DEL, - TRNS, TRNS, MUTE, VOLD, VOLU, TRNS, BSPC, FN14, FN15, FN16, TRNS, FN25, - TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, FN11, FN12, FN13, TRNS, ENT, - TRNS, TRNS, TRNS, TRNS, FN2, ENT, TRNS, TRNS, PGDN, PGUP, TRNS), -}; - -const uint16_t PROGMEM fn_actions[] = { - [1] = ACTION_LAYER_MOMENTARY(1), // Switch layer raise - [2] = ACTION_LAYER_MOMENTARY(2), // Switch layer lower - - [3] = ACTION_MODS_TAP_KEY(MOD_RSFT, KC_ENT), // Right shift serves as Enter on tap - - // Numeric shift modifiers - [10] = ACTION_MODS_KEY(MOD_LSFT, KC_0), - [11] = ACTION_MODS_KEY(MOD_LSFT, KC_1), - [12] = ACTION_MODS_KEY(MOD_LSFT, KC_2), - [13] = ACTION_MODS_KEY(MOD_LSFT, KC_3), - [14] = ACTION_MODS_KEY(MOD_LSFT, KC_4), - [15] = ACTION_MODS_KEY(MOD_LSFT, KC_5), - [16] = ACTION_MODS_KEY(MOD_LSFT, KC_6), - [17] = ACTION_MODS_KEY(MOD_LSFT, KC_7), - [18] = ACTION_MODS_KEY(MOD_LSFT, KC_8), - [19] = ACTION_MODS_KEY(MOD_LSFT, KC_9), - - // Other shift modifiers - [20] = ACTION_MODS_KEY(MOD_LSFT, KC_MINS), // _ - [21] = ACTION_MODS_KEY(MOD_LSFT, KC_EQL), // + - [22] = ACTION_MODS_KEY(MOD_LSFT, KC_GRV), // ~ - [23] = ACTION_MODS_KEY(MOD_LSFT, KC_LBRC), // { - [24] = ACTION_MODS_KEY(MOD_LSFT, KC_RBRC), // } - [25] = ACTION_MODS_KEY(MOD_LSFT, KC_BSLS), // | - - // Switch windows in app - [26] = ACTION_MODS_KEY(MOD_LGUI, KC_GRV), -}; diff --git a/keyboard/planck/old_keymap_files/common_keymaps/keymap_mitch.c b/keyboard/planck/old_keymap_files/common_keymaps/keymap_mitch.c new file mode 100644 index 000000000..f7df7bbba --- /dev/null +++ b/keyboard/planck/old_keymap_files/common_keymaps/keymap_mitch.c @@ -0,0 +1,49 @@ +#include "keymap_common.h" + +const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +[0] = KEYMAP( + TAB, Q, W, E, R, T, Y, U, I, O, P, BSPC, + LCTL, A, S, D, F, G, H, J, K, L, SCLN, QUOT, + LSFT, Z, X, C, V, B, N, M, COMM, DOT, SLSH, FN3, + ESC, DEL, LALT, LGUI, FN2, SPC, FN1, LEFT, DOWN, UP, RGHT), +[1] = KEYMAP( + GRV, GRV, FN22, FN19, FN10, TRNS, TRNS, 7, 8, 9, 0, BSPC, + TRNS, LBRC, RBRC, FN23, FN24, TRNS, TRNS, 4, 5, 6, TRNS, BSLS, + TRNS, MINS, FN20, EQL, FN21, TRNS, TRNS, 1, 2, 3, TRNS, ENT, + TRNS, TRNS, TRNS, TRNS, TRNS, SPC, FN1, TRNS, PGDN, PGUP, TRNS), +[2] = KEYMAP( + FN26, FN10, FN11, FN12, FN13, FN14, FN15, FN17, FN18, FN19, FN10, DEL, + TRNS, TRNS, MUTE, VOLD, VOLU, TRNS, BSPC, FN14, FN15, FN16, TRNS, FN25, + TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, FN11, FN12, FN13, TRNS, ENT, + TRNS, TRNS, TRNS, TRNS, FN2, ENT, TRNS, TRNS, PGDN, PGUP, TRNS), +}; + +const uint16_t PROGMEM fn_actions[] = { + [1] = ACTION_LAYER_MOMENTARY(1), // Switch layer raise + [2] = ACTION_LAYER_MOMENTARY(2), // Switch layer lower + + [3] = ACTION_MODS_TAP_KEY(MOD_RSFT, KC_ENT), // Right shift serves as Enter on tap + + // Numeric shift modifiers + [10] = ACTION_MODS_KEY(MOD_LSFT, KC_0), + [11] = ACTION_MODS_KEY(MOD_LSFT, KC_1), + [12] = ACTION_MODS_KEY(MOD_LSFT, KC_2), + [13] = ACTION_MODS_KEY(MOD_LSFT, KC_3), + [14] = ACTION_MODS_KEY(MOD_LSFT, KC_4), + [15] = ACTION_MODS_KEY(MOD_LSFT, KC_5), + [16] = ACTION_MODS_KEY(MOD_LSFT, KC_6), + [17] = ACTION_MODS_KEY(MOD_LSFT, KC_7), + [18] = ACTION_MODS_KEY(MOD_LSFT, KC_8), + [19] = ACTION_MODS_KEY(MOD_LSFT, KC_9), + + // Other shift modifiers + [20] = ACTION_MODS_KEY(MOD_LSFT, KC_MINS), // _ + [21] = ACTION_MODS_KEY(MOD_LSFT, KC_EQL), // + + [22] = ACTION_MODS_KEY(MOD_LSFT, KC_GRV), // ~ + [23] = ACTION_MODS_KEY(MOD_LSFT, KC_LBRC), // { + [24] = ACTION_MODS_KEY(MOD_LSFT, KC_RBRC), // } + [25] = ACTION_MODS_KEY(MOD_LSFT, KC_BSLS), // | + + // Switch windows in app + [26] = ACTION_MODS_KEY(MOD_LGUI, KC_GRV), +}; diff --git a/quantum/template/README.md b/quantum/template/README.md index dc163a2f4..39f9f59d1 100644 --- a/quantum/template/README.md +++ b/quantum/template/README.md @@ -15,7 +15,7 @@ Depending on which keymap you would like to use, you will have to compile slight To build with the default keymap, simply run `make`. ### Other Keymaps -Several version of keymap are available in advance but you are recommended to define your favorite layout yourself. To define your own keymap create file named `.c` and see keymap document (you can find in top README.md) and existent keymap files. +Several version of keymap are available in advance but you are recommended to define your favorite layout yourself. To define your own keymap create file named `.c` in the keymaps folder, and see keymap document (you can find in top README.md) and existent keymap files. To build the firmware binary hex file with a keymap just do `make` with `KEYMAP` option like: ``` -- cgit v1.2.3-70-g09d2 From ac0729787ff0e8d1bd1202a28f5edf9125c00b0c Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Wed, 30 Mar 2016 00:43:07 -0400 Subject: preonic update --- keyboard/preonic/Makefile | 56 +++-- keyboard/preonic/Makefile.pjrc | 116 ---------- keyboard/preonic/PCB_GUIDE.md | 116 ---------- keyboard/preonic/README.md | 49 +--- keyboard/preonic/__avr_gdbinit | 6 - keyboard/preonic/analog.c | 53 ----- keyboard/preonic/analog.h | 36 --- keyboard/preonic/beeps.c | 246 --------------------- keyboard/preonic/beeps.h | 12 - keyboard/preonic/config.h | 18 +- keyboard/preonic/config_definitions.h | 50 ----- keyboard/preonic/extended_keymap_common.c | 216 ------------------ keyboard/preonic/extended_keymap_common.h | 181 --------------- .../extended_keymaps/extended_keymap_default.c | 70 ------ .../extended_keymaps/extended_keymap_lock.c | 81 ------- keyboard/preonic/keymap_midi.c | 110 --------- keyboard/preonic/keymap_midi.h | 220 ------------------ keyboard/preonic/led.c | 38 ---- keyboard/preonic/matrix.c | 234 -------------------- quantum/keymap_midi.c | 4 +- 20 files changed, 66 insertions(+), 1846 deletions(-) delete mode 100644 keyboard/preonic/Makefile.pjrc delete mode 100644 keyboard/preonic/PCB_GUIDE.md delete mode 100644 keyboard/preonic/__avr_gdbinit delete mode 100644 keyboard/preonic/analog.c delete mode 100644 keyboard/preonic/analog.h delete mode 100644 keyboard/preonic/beeps.c delete mode 100644 keyboard/preonic/beeps.h delete mode 100644 keyboard/preonic/config_definitions.h delete mode 100644 keyboard/preonic/extended_keymap_common.c delete mode 100644 keyboard/preonic/extended_keymap_common.h delete mode 100644 keyboard/preonic/extended_keymaps/extended_keymap_default.c delete mode 100644 keyboard/preonic/extended_keymaps/extended_keymap_lock.c delete mode 100644 keyboard/preonic/keymap_midi.c delete mode 100644 keyboard/preonic/keymap_midi.h delete mode 100644 keyboard/preonic/led.c delete mode 100644 keyboard/preonic/matrix.c (limited to 'quantum') diff --git a/keyboard/preonic/Makefile b/keyboard/preonic/Makefile index 0145e44bc..664aff732 100644 --- a/keyboard/preonic/Makefile +++ b/keyboard/preonic/Makefile @@ -27,7 +27,7 @@ # make flip-ee = Download the eeprom file to the device, using Atmel FLIP # (must have Atmel FLIP installed). # -# make debug = Start either simulavr or avarice as specified for debugging, +# make debug = Start either simulavr or avarice as specified for debugging, # with avr-gdb or avr-insight as the front end for debugging. # # make filename.s = Just compile filename.c into the assembler code only. @@ -39,25 +39,41 @@ #---------------------------------------------------------------------------- # Target file name (without extension). -TARGET = preonic_lufa +TARGET = preonic + # Directory common source filess exist TOP_DIR = ../.. +TMK_DIR = ../../tmk_core # Directory keyboard dependent files exist TARGET_DIR = . # # project specific files -SRC = extended_keymap_common.c \ - matrix.c \ - led.c \ - backlight.c +SRC = preonic.c + +ifdef keymap + KEYMAP = $(keymap) +endif ifdef KEYMAP - SRC := extended_keymaps/extended_keymap_$(KEYMAP).c $(SRC) +ifneq ("$(wildcard keymaps/$(KEYMAP).c)","") + KEYMAP_FILE = keymaps/$(KEYMAP).c else - SRC := extended_keymaps/extended_keymap_default.c $(SRC) +ifneq ("$(wildcard keymaps/$(KEYMAP)/keymap.c)","") + KEYMAP_FILE = keymaps/$(KEYMAP)/keymap.c +else +$(error Keymap file does not exist) +endif endif +else +ifneq ("$(wildcard keymaps/default.c)","") + KEYMAP_FILE = keymaps/default.c +else + KEYMAP_FILE = keymaps/default/keymap.c +endif +endif +SRC := $(KEYMAP_FILE) $(SRC) CONFIG_H = config.h @@ -120,24 +136,26 @@ 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 -NKRO_ENABLE = yes # USB Nkey Rollover - not yet supported in LUFA +# SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend +# NKRO_ENABLE = yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality -MIDI_ENABLE = yes # MIDI controls -BACKLIGHT_ENABLE = yes - -ifdef MIDI_ENABLE - SRC += keymap_midi.c \ - beeps.c +MIDI_ENABLE = YES # MIDI controls +AUDIO_ENABLE = YES # Audio output on port C6 +# UNICODE_ENABLE = YES # Unicode +# BLUETOOTH_ENABLE = yes # Enable Bluetooth with the Adafruit EZ-Key HID +# RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with MIDI at the same time. + +ifdef BACKLIGHT_ENABLE + SRC += backlight.c endif + # Optimize size but this may cause error "relocation truncated to fit" #EXTRALDFLAGS = -Wl,--relax # Search Path VPATH += $(TARGET_DIR) VPATH += $(TOP_DIR) +VPATH += $(TMK_DIR) -include $(TOP_DIR)/protocol/lufa.mk -include $(TOP_DIR)/common.mk -include $(TOP_DIR)/rules.mk +include $(TOP_DIR)/quantum/quantum.mk diff --git a/keyboard/preonic/Makefile.pjrc b/keyboard/preonic/Makefile.pjrc deleted file mode 100644 index be83ba18b..000000000 --- a/keyboard/preonic/Makefile.pjrc +++ /dev/null @@ -1,116 +0,0 @@ -#---------------------------------------------------------------------------- -# On command line: -# -# make all = Make software. -# -# make clean = Clean out built project files. -# -# make coff = Convert ELF to AVR COFF. -# -# make extcoff = Convert ELF to AVR Extended COFF. -# -# make program = Download the hex file to the device. -# Please customize your programmer settings(PROGRAM_CMD) -# -# make teensy = Download the hex file to the device, using teensy_loader_cli. -# (must have teensy_loader_cli installed). -# -# make dfu = Download the hex file to the device, using dfu-programmer (must -# have dfu-programmer installed). -# -# make flip = Download the hex file to the device, using Atmel FLIP (must -# have Atmel FLIP installed). -# -# make dfu-ee = Download the eeprom file to the device, using dfu-programmer -# (must have dfu-programmer installed). -# -# make flip-ee = Download the eeprom file to the device, using Atmel FLIP -# (must have Atmel FLIP installed). -# -# make debug = Start either simulavr or avarice as specified for debugging, -# with avr-gdb or avr-insight as the front end for debugging. -# -# make filename.s = Just compile filename.c into the assembler code only. -# -# make filename.i = Create a preprocessed source file for use in submitting -# bug reports to the GCC project. -# -# To rebuild project do "make clean" then "make all". -#---------------------------------------------------------------------------- - -# Target file name (without extension). -TARGET = gh60_pjrc - -# Directory common source filess exist -TOP_DIR = ../.. - -# Directory keyboard dependent files exist -TARGET_DIR = . - -# project specific files -SRC = keymap_common.c \ - matrix.c \ - led.c - -ifdef KEYMAP - SRC := keymap_$(KEYMAP).c $(SRC) -else - SRC := keymap_jack.c $(SRC) -endif - -CONFIG_H = config.h - - -# MCU name, you MUST set this to match the board you are using -# type "make clean" after changing this, so all files will be rebuilt -MCU = atmega32u4 -#MCU = at90usb1286 - - -# Processor frequency. -# Normally the first thing your program should do is set the clock prescaler, -# so your program will run at the correct speed. You should also set this -# variable to same clock speed. The _delay_ms() macro uses this, and many -# examples use this variable to calculate timings. Do not add a "UL" here. -F_CPU = 16000000 - - -# Boot Section Size in *bytes* -# Teensy halfKay 512 -# Atmel DFU loader 4096 -# LUFA bootloader 4096 -OPT_DEFS += -DBOOTLOADER_SIZE=4096 - - -# Build Options -# comment out to disable the options. -# -BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000) -MOUSEKEY_ENABLE = yes # Mouse keys(+5000) -EXTRAKEY_ENABLE = yes # Audio control and System control(+600) -CONSOLE_ENABLE = yes # Console for debug -COMMAND_ENABLE = yes # Commands for debug and configuration -SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend -NKRO_ENABLE = yes # USB Nkey Rollover(+500) -#PS2_MOUSE_ENABLE = yes # PS/2 mouse(TrackPoint) support - - -# Search Path -VPATH += $(TARGET_DIR) -VPATH += $(TOP_DIR) - -include $(TOP_DIR)/protocol/pjrc.mk -include $(TOP_DIR)/common.mk -include $(TOP_DIR)/rules.mk - -plain: OPT_DEFS += -DKEYMAP_PLAIN -plain: all - -poker: OPT_DEFS += -DKEYMAP_POKER -poker: all - -poker_set: OPT_DEFS += -DKEYMAP_POKER_SET -poker_set: all - -poker_bit: OPT_DEFS += -DKEYMAP_POKER_BIT -poker_bit: all diff --git a/keyboard/preonic/PCB_GUIDE.md b/keyboard/preonic/PCB_GUIDE.md deleted file mode 100644 index c3004c75a..000000000 --- a/keyboard/preonic/PCB_GUIDE.md +++ /dev/null @@ -1,116 +0,0 @@ -# Planck Firmware Guide - -## Setting up the environment - -### Windows -1. Install [WinAVR Tools](http://sourceforge.net/projects/winavr/) for AVR GCC compiler. -2. Install [DFU-Programmer][dfu-prog] (the -win one). -3. Start DFU bootloader on the chip first time you will see 'Found New Hardware Wizard' to install driver. If you install device driver properly you can find chip name like 'ATmega32U4' under 'LibUSB-Win32 Devices' tree on 'Device Manager'. If not you will need to update its driver on 'Device Manager' to the `dfu-programmer` driver. - -### Mac -1. Install [CrossPack](http://www.obdev.at/products/crosspack/index.html) or install Xcode from the App Store and install the Command Line Tools from `Xcode->Preferences->Downloads`. -2. Install [DFU-Programmer][dfu-prog]. - -### Linux -1. Install AVR GCC with your favorite package manager. -2. Install [DFU-Programmer][dfu-prog]. - -##Verify Your Installation -1. Clone the following repository: https://github.com/jackhumbert/tmk_keyboard -2. Open a Terminal and `cd` into `tmk_keyboard/keyboard/planck` -3. Run `make`. This should output a lot of information about the build process. - -## Using the built-in functions - -Here is a list of some of the functions available from the command line: - -* `make clean`: clean the environment - may be required in-between builds -* `make`: compile the code -* `make COMMON=true`: compile with the common (non-extended) keymap -* `make MATRIX=`: compile with the referenced matrix file. Default if unspecified is `matrix_pcb.c`. For handwired boards, use `matrix_handwired.c`. -* `make KEYMAP=`: compile with the extended keymap file `extended_keymaps/extended_keymap_.c` -* `make COMMON=true KEYMAP=`: compile with the common keymap file `common_keymaps/keymap_.c` -* `make dfu`: build and flash the layout to the PCB -* `make dfu-force`: build and force-flash the layout to the PCB (may be require for first flash) - -Generally, the instructions to flash the PCB are as follows: - -1. Make changes to the appropriate keymap file -2. Save the file -3. `make clean` -4. Press the reset button on the PCB/press the key with the `RESET` keycode -5. `make dfu` - use the necessary `KEYMAP=` and/or `COMMON=true` arguments here. - -## Extended keymap - -### Keymap - -Unlike the common keymap, prefixing the keycodes with `KC_` is required. A full list of the keycodes is available [here](https://github.com/jackhumbert/tmk_keyboard/blob/master/doc/keycode.txt). For the keycodes available only in the extended keymap, see this [header file](https://github.com/jackhumbert/tmk_keyboard/blob/master/keyboard/planck/extended_keymap_common.h). - -You can use modifiers with keycodes like this: - - LCTL(KC_C) - -Which will generate Ctrl+c. These are daisy-chainable, meaning you can do things like: - - LCTL(LALT(KC_C)) - -That will generate Ctrl+Alt+c. The entire list of these functions is here: - -* `LCTL()`: Left control -* `LSFT()` / `S()`: Left shift -* `LALT()`: Left alt/opt -* `LGUI()`: Left win/cmd -* `RCTL()`: Right control -* `RSFT()`: Right shift -* `RALT()`: Right alt/opt -* `RGUI()`: Right win/cmd - -`S(KC_1)`-like entries are useful in writing keymaps for the Planck. - -### Other keycodes - -A number of other keycodes have been added that you may find useful: - -* `CM_`: the Colemak equivalent of a key (in place of `KC_`), when using Colemak in software (`CM_O` generates `KC_SCLN`) -* `RESET`: jump to bootloader for flashing (same as press the reset button) -* `BL_STEP`: step through the backlight brightnesses -* `BL_<0-15>`: set backlight brightness to 0-15 -* `BL_DEC`: lower the backlight brightness -* `BL_INC`: raise the backlight brightness -* `BL_TOGG`: toggle the backlight on/off - -### Function layers - -The extended keymap extends the number of function layers from 32 to the near-infinite value of 256. Rather than using `FN` notation (still available, but limited to `FN0`-`FN31`), you can use the `FUNC()` notation. `F()` is a shortcut for this. - -The function actions are unchanged, and you can see the full list of them [here](https://github.com/jackhumbert/tmk_keyboard/blob/master/common/action_code.h). They are explained in detail [here](https://github.com/jackhumbert/tmk_keyboard/blob/master/doc/keymap.md#2-action). - -### Macros - -Macros have been setup in the `extended_keymaps/extended_keymaps_default.c` file so that you can use `M()` to access a macro in the `action_get_macro` section on your keymap. The switch/case structure you see here is required, and is setup for `M(0)` - you'll need to copy and paste the code to look like this (e.g. to support `M(3)`): - - switch(id) { - case 0: - return MACRODOWN(TYPE(KC_A), END); - break; - case 1: - return MACRODOWN(TYPE(KC_B), END); - break; - case 2: - return MACRODOWN(TYPE(KC_C), END); - break; - case 3: - return MACRODOWN(TYPE(KC_D), END); - break; - } - return MACRO_NONE; - -`MACRODOWN()` is a shortcut for `(record->event.pressed ? MACRO(__VA_ARGS__) : MACRO_NONE)` which tells the macro to execute when the key is pressed. Without this, the macro will be executed on both the down and up stroke. - -[cygwin]: https://www.cygwin.com/ -[mingw]: http://www.mingw.org/ -[mhv]: https://infernoembedded.com/products/avr-tools -[winavr]: http://winavr.sourceforge.net/ -[crosspack]: http://www.obdev.at/products/crosspack/index.html -[dfu-prog]: http://dfu-programmer.sourceforge.net/ diff --git a/keyboard/preonic/README.md b/keyboard/preonic/README.md index ee824d26e..3ba0cc152 100644 --- a/keyboard/preonic/README.md +++ b/keyboard/preonic/README.md @@ -2,54 +2,29 @@ Planck keyboard firmware ====================== DIY/Assembled compact ortholinear 40% keyboard by [Ortholinear Keyboards](http://ortholinearkeyboards.com). -## Extended Keymap -If you include extended_keymap_common.h instead of keymap_common.h at the top of your file, you'll have access to a bunch of goodies: +## Quantum MK Firmware -- Use `LSFT()`, `LCTL()`, et. al. (listed in extended_keymap_common.h) as modifiers for keys (daisy-chain-able) -- Use `FUNC(1)` instead of `FN1` (etc.) to access the function layers beyond the 32 function layer limit -- Use `CM_F` instead of `KC_F` to get the ColeMak equivilent for shortcuts (maps backwards) -- Use `MACRODOWN()` instead of `MACRO()` to easily make a keydown macro (`CM_*` works here too) +For the full Quantum feature list, see [the parent README.md](/README.md). -### Some notes on usage: +## Building -- The `KEYMAP()` macro is unable to be used due to the bitwise modifications that take place - refer to extended_keymap_jack.c to see how to set things up with the `KC_` prefix -- Keep an eye on the Makefile - this needs to include the correct files to work -- Don't forget to use `const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {` instead of the 8bit equivilent - -## Build - -Follow [this guide](http://deskthority.net/workshop-f7/how-to-build-your-very-own-keyboard-firmware-t7177.html) to setup your development environment before anything else. Abbreviated instructions are provide at the [bottom of this document](https://github.com/rswiernik/tmk_keyboard/tree/rswiernik_dev/keyboard/planck#environment-setup) - -Download the whole firmware [here](https://github.com/jackhumbert/tmk_keyboard/archive/master.zip) and navigate to the keyboard/planck folder. Once your dev env is setup, you'll be able to type `make` to generate your .hex that you can load with the Teensy app onto your Planck (once you've hit reset/shorted GND & RST). +Download or clone the whole firmware and navigate to the keyboard/planck folder. Once your dev env is setup, you'll be able to type `make` to generate your .hex - you can then use `make dfu` to program your PCB once you hit the reset button. Depending on which keymap you would like to use, you will have to compile slightly differently. -####Default -To build with the default keymap, simply move to the tmk\_keyboard/keyboard/planck/ and run `make` as follows: -``` -$ make -``` - -## Keymap -Several version of keymap are available in advance but you are recommended to define your favorite layout yourself. To define your own keymap create file named `keymap_.c` and see keymap document (you can find in top README.md) and existent keymap files. - -####**Extended Keymaps** - -To build the firmware binary hex file with an extended keymap just do `make` with `KEYMAP` option like: -``` -$ make KEYMAP=[common|jack|] -``` -_The only applicable keymaps will work with this option._ Extended keymaps follow the format **__extended\_keymap\_\.c__** +### Default +To build with the default keymap, simply run `make`. -####**Common Keymaps** +### Other Keymaps +Several version of keymap are available in advance but you are recommended to define your favorite layout yourself. To define your own keymap create file named `.c` and see keymap document (you can find in top README.md) and existent keymap files. -Building with a common keymap is as simple as adding the COMMON option. Note that only +To build the firmware binary hex file with a keymap just do `make` with `KEYMAP` option like: ``` -$ make KEYMAP=[common|jack|] COMMON=true +$ make KEYMAP=[default|jack|] ``` -_The only applicable keymaps will work with this option._ Common keymaps follow the format **__keymap\_\.c__** +Keymaps follow the format **__.c__** and are stored in the `keymaps` folder. -## Notable TMK forks (which some of the keymap files are from) +### Notable forks (which some of the keymap files are from) - [Shane's Fork](https://github.com/shanecelis/tmk_keyboard/tree/master/keyboard/planck) - [Pierre's Fork](https://github.com/pcarrier/tmk_keyboard/blob/pcarrier/planck/keyboard/gh60/keymap_planck.c) - [Nathan's Fork](https://github.com/nathanrosspowell/tmk_keyboard/tree/planck-jack/keyboard/planck) diff --git a/keyboard/preonic/__avr_gdbinit b/keyboard/preonic/__avr_gdbinit deleted file mode 100644 index afc51e6d1..000000000 --- a/keyboard/preonic/__avr_gdbinit +++ /dev/null @@ -1,6 +0,0 @@ -define reset -SIGNAL SIGHUP -end -file planck_lufa.elf -target remote localhost:4242 -break main diff --git a/keyboard/preonic/analog.c b/keyboard/preonic/analog.c deleted file mode 100644 index 49b84ee0e..000000000 --- a/keyboard/preonic/analog.c +++ /dev/null @@ -1,53 +0,0 @@ -// Simple analog to digitial conversion - -#include -#include -#include -#include "analog.h" - - -static uint8_t aref = (1<= 12) return 0; - return adc_read(pgm_read_byte(pin_to_mux + pin)); -#elif defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB1286__) - if (pin >= 8) return 0; - return adc_read(pin); -#else - return 0; -#endif -} - -// Mux input -int16_t adc_read(uint8_t mux) -{ -#if defined(__AVR_AT90USB162__) - return 0; -#else - uint8_t low; - - ADCSRA = (1< - -void analogReference(uint8_t mode); -int16_t analogRead(uint8_t pin); -int16_t adc_read(uint8_t mux); - -#define ADC_REF_POWER (1< -#include -#include -#include - -#define PI 3.14159265 - -void delay_us(int count) { - while(count--) { - _delay_us(1); - } -} - -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 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 -} - -void stop_all_notes() { - voices = 0; - TCCR3A = 0; - TCCR3B = 0; - frequency = 0; - volume = 0; - - for (int i = 0; i < 8; i++) { - frequencies[i] = 0; - volumes[i] = 0; - } -} - -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; - } - } - } - 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; - } -} - -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); - - // TCCR3A = (1 << COM3A1) | (0 << COM3A0) | (1 << WGM31) | (0 << WGM30); - // TCCR3B = (1 << WGM33) | (1 << WGM32) | (0 << CS32) | (0 << CS31) | (1 << CS30); - - // ICR3 = 0xFFFF; - // OCR3A = (int)((float)wave[i]*ICR3/RANGE); //go to next array element - - - // cli(); - - // /* Enable interrupt on timer2 == 127, with clk/8 prescaler. At 16MHz, - // this gives a timer interrupt at 15625Hz. */ - // TIMSK3 = (1 << OCIE3A); - - // /* clear/reset timer on match */ - // // TCCR3A = 1<> 8) & 0x00FF) -// #define lowByte(c) (c & 0x00FF) - -ISR(TIMER3_COMPA_vect) { - - if (ICR3 > 0 && !sliding) { - switch (position) { - case 0: { - int duty = (((double)F_CPU) / (frequency)); - ICR3 = duty; // Set max to the period - OCR3A = duty >> 1; // Set compare to half the period - break; - } - case 1: { - int duty = (((double)F_CPU) / (frequency*2)); - ICR3 = duty; // Set max to the period - OCR3A = duty >> 1; // Set compare to half the period - break; - } - case 2: { - int duty = (((double)F_CPU) / (frequency*3)); - ICR3 = duty; // Set max to the period - OCR3A = duty >> 1; // Set compare to half the period - break; - } - } - position = (position + 1) % 3; - } -// /* OCR2A has been cleared, per TCCR2A above */ -// // OCR3A = 127; - -// // pos1 += incr1; -// // pos2 += incr2; -// // pos3 += incr3; - -// // sample = sinewave[highByte(pos1)] + sinewave[highByte(pos2)] + sinewave[highByte(pos3)]; - -// // OCR3A = sample; - - -// OCR3A=pgm_read_byte(&sinewave[pos1]); -// pos1++; -// // PORTC &= ~(1<<6); - -// /* buffered, 1x gain, active mode */ -// // SPDR = highByte(sample) | 0x70; -// // while (!(SPSR & (1< 0) { - DDRC |= (1<<6); - - TCCR3A = (1 << COM3A1) | (0 << COM3A0) | (1 << WGM31) | (0 << WGM30); - TCCR3B = (1 << WGM33) | (1 << WGM32) | (0 << CS32) | (1 << CS31) | (0 << CS30); - - if (frequency != 0) { - if (frequency < freq) { - for (double f = frequency; f <= freq; f += ((freq - frequency) / 500.0)) { - send_freq(f, vol); - } - } else if (frequency > freq) { - for (double f = frequency; f >= freq; f -= ((frequency - freq) / 500.0)) { - send_freq(f, vol); - } - } - } - send_freq(freq, vol); - frequency = freq; - volume = vol; - - frequencies[voices] = frequency; - volumes[voices] = volume; - voices++; - } - // 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 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 deleted file mode 100644 index 378983c60..000000000 --- a/keyboard/preonic/beeps.h +++ /dev/null @@ -1,12 +0,0 @@ -#include -#include -#include -#include - -void note(int x, float length); -void beeps(); -void true_note(float x, float y, float length); -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/config.h b/keyboard/preonic/config.h index cad269c9d..5528667fa 100644 --- a/keyboard/preonic/config.h +++ b/keyboard/preonic/config.h @@ -18,11 +18,11 @@ along with this program. If not, see . #ifndef CONFIG_H #define CONFIG_H -#include "config_definitions.h" +#include "config_common.h" /* USB Device descriptor parameter */ #define VENDOR_ID 0xFEED -#define PRODUCT_ID 0x6062 +#define PRODUCT_ID 0x6061 #define DEVICE_VER 0x0001 #define MANUFACTURER Ortholinear Keyboards #define PRODUCT The Preonic Keyboard @@ -34,7 +34,10 @@ along with this program. If not, see . /* Planck PCB default pin-out */ #define COLS (int []){ F1, F0, B0, C7, F4, F5, F6, F7, D4, D6, B4, D7 } -#define ROWS (int []){ D1, D0, D5, B5, B6 } +#define ROWS (int []){ D2, D5, B5, B6, D3 } + +/* COL2ROW or ROW2COL */ +#define DIODE_DIRECTION COL2ROW /* define if matrix has ghost */ //#define MATRIX_HAS_GHOST @@ -55,6 +58,15 @@ along with this program. If not, see . keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ ) +/* ws2812 RGB LED */ +#define ws2812_PORTREG PORTD +#define ws2812_DDRREG DDRD +#define ws2812_pin PD1 +#define RGBLED_NUM 28 // Number of LEDs +#define RGBLIGHT_HUE_STEP 10 +#define RGBLIGHT_SAT_STEP 17 +#define RGBLIGHT_VAL_STEP 17 + /* * Feature disable options * These options are also useful to firmware size reduction. diff --git a/keyboard/preonic/config_definitions.h b/keyboard/preonic/config_definitions.h deleted file mode 100644 index fd138b884..000000000 --- a/keyboard/preonic/config_definitions.h +++ /dev/null @@ -1,50 +0,0 @@ -#ifndef CONFIG_DEFINITIONS_H -#define CONFIG_DEFINITIONS_H - -#define B0 0x20 -#define B1 0x21 -#define B2 0x22 -#define B3 0x23 -#define B4 0x24 -#define B5 0x25 -#define B6 0x26 -#define B7 0x27 -#define C0 0x30 -#define C1 0x31 -#define C2 0x32 -#define C3 0x33 -#define C4 0x34 -#define C5 0x35 -#define C6 0x36 -#define C7 0x37 -#define D0 0x40 -#define D1 0x41 -#define D2 0x42 -#define D3 0x43 -#define D4 0x44 -#define D5 0x45 -#define D6 0x46 -#define D7 0x47 -#define E0 0x50 -#define E1 0x51 -#define E2 0x52 -#define E3 0x53 -#define E4 0x54 -#define E5 0x55 -#define E6 0x56 -#define E7 0x57 -#define F0 0x60 -#define F1 0x61 -#define F2 0x62 -#define F3 0x63 -#define F4 0x64 -#define F5 0x65 -#define F6 0x66 -#define F7 0x67 - - - - - -#endif - diff --git a/keyboard/preonic/extended_keymap_common.c b/keyboard/preonic/extended_keymap_common.c deleted file mode 100644 index 4fa80de7c..000000000 --- a/keyboard/preonic/extended_keymap_common.c +++ /dev/null @@ -1,216 +0,0 @@ -/* -Copyright 2012,2013 Jun Wako - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ - -#include "extended_keymap_common.h" -#include "report.h" -#include "keycode.h" -#include "action_layer.h" -#include "action.h" -#include "action_macro.h" -#include "debug.h" -#include "backlight.h" -#include "keymap_midi.h" -#include - -static action_t keycode_to_action(uint16_t keycode); - -/* converts key to action */ -action_t action_for_key(uint8_t layer, keypos_t key) -{ - // 16bit keycodes - important - uint16_t keycode = keymap_key_to_keycode(layer, key); - - if (keycode >= 0x0100 && keycode < 0x2000) { - // Has a modifier - action_t action; - // Split it up - action.code = ACTION_MODS_KEY(keycode >> 8, keycode & 0xFF); - return action; - } else if (keycode >= 0x2000 && keycode < 0x3000) { - // Is a shortcut for function layer, pull last 12bits - return keymap_func_to_action(keycode & 0xFFF); - } else if (keycode >= 0x3000 && keycode < 0x4000) { - action_t action; - action.code = ACTION_MACRO(keycode & 0xFF); - return action; - } else if (keycode >= BL_0 & keycode <= BL_15) { - action_t action; - action.code = ACTION_BACKLIGHT_LEVEL(keycode & 0x000F); - return action; - } else if (keycode == BL_DEC) { - action_t action; - action.code = ACTION_BACKLIGHT_DECREASE(); - return action; - } else if (keycode == BL_INC) { - action_t action; - action.code = ACTION_BACKLIGHT_INCREASE(); - return action; - } else if (keycode == BL_TOGG) { - action_t action; - action.code = ACTION_BACKLIGHT_TOGGLE(); - return action; - } else if (keycode == BL_STEP) { - action_t action; - action.code = ACTION_BACKLIGHT_STEP(); - return action; - } else if (keycode == RESET) { - bootloader_jump(); - return; - } else if (keycode == DEBUG) { - print("\nDEBUG: enabled.\n"); - debug_enable = true; - return; - } else if (keycode >= 0x6000 && keycode < 0x7000) { - action_t action; - action.code = ACTION_FUNCTION_OPT(keycode & 0xFF, (keycode & 0x0F00) >> 8); - return action; - } - - switch (keycode) { - case KC_FN0 ... KC_FN31: - return keymap_fn_to_action(keycode); -#ifdef BOOTMAGIC_ENABLE - case KC_CAPSLOCK: - case KC_LOCKING_CAPS: - if (keymap_config.swap_control_capslock || keymap_config.capslock_to_control) { - return keycode_to_action(KC_LCTL); - } - return keycode_to_action(keycode); - case KC_LCTL: - if (keymap_config.swap_control_capslock) { - return keycode_to_action(KC_CAPSLOCK); - } - return keycode_to_action(KC_LCTL); - case KC_LALT: - if (keymap_config.swap_lalt_lgui) { - if (keymap_config.no_gui) { - return keycode_to_action(ACTION_NO); - } - return keycode_to_action(KC_LGUI); - } - return keycode_to_action(KC_LALT); - case KC_LGUI: - if (keymap_config.swap_lalt_lgui) { - return keycode_to_action(KC_LALT); - } - if (keymap_config.no_gui) { - return keycode_to_action(ACTION_NO); - } - return keycode_to_action(KC_LGUI); - case KC_RALT: - if (keymap_config.swap_ralt_rgui) { - if (keymap_config.no_gui) { - return keycode_to_action(ACTION_NO); - } - return keycode_to_action(KC_RGUI); - } - return keycode_to_action(KC_RALT); - case KC_RGUI: - if (keymap_config.swap_ralt_rgui) { - return keycode_to_action(KC_RALT); - } - if (keymap_config.no_gui) { - return keycode_to_action(ACTION_NO); - } - return keycode_to_action(KC_RGUI); - case KC_GRAVE: - if (keymap_config.swap_grave_esc) { - return keycode_to_action(KC_ESC); - } - return keycode_to_action(KC_GRAVE); - case KC_ESC: - if (keymap_config.swap_grave_esc) { - return keycode_to_action(KC_GRAVE); - } - return keycode_to_action(KC_ESC); - case KC_BSLASH: - if (keymap_config.swap_backslash_backspace) { - return keycode_to_action(KC_BSPACE); - } - return keycode_to_action(KC_BSLASH); - case KC_BSPACE: - if (keymap_config.swap_backslash_backspace) { - return keycode_to_action(KC_BSLASH); - } - return keycode_to_action(KC_BSPACE); -#endif - default: - return keycode_to_action(keycode); - } -} - - -/* Macro */ -__attribute__ ((weak)) -const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) -{ - return MACRO_NONE; -} - -/* Function */ -__attribute__ ((weak)) -void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) -{ -} - -/* translates keycode to action */ -static action_t keycode_to_action(uint16_t keycode) -{ - action_t action; - switch (keycode) { - case KC_A ... KC_EXSEL: - case KC_LCTRL ... KC_RGUI: - action.code = ACTION_KEY(keycode); - break; - case KC_SYSTEM_POWER ... KC_SYSTEM_WAKE: - action.code = ACTION_USAGE_SYSTEM(KEYCODE2SYSTEM(keycode)); - break; - case KC_AUDIO_MUTE ... KC_WWW_FAVORITES: - action.code = ACTION_USAGE_CONSUMER(KEYCODE2CONSUMER(keycode)); - break; - case KC_MS_UP ... KC_MS_ACCEL2: - action.code = ACTION_MOUSEKEY(keycode); - break; - case KC_TRNS: - action.code = ACTION_TRANSPARENT; - break; - default: - action.code = ACTION_NO; - break; - } - return action; -} - - -/* translates key to keycode */ -uint16_t keymap_key_to_keycode(uint8_t layer, keypos_t key) -{ - // Read entire word (16bits) - return pgm_read_word(&keymaps[(layer)][(key.row)][(key.col)]); -} - -/* translates Fn keycode to action */ -action_t keymap_fn_to_action(uint16_t keycode) -{ - return (action_t){ .code = pgm_read_word(&fn_actions[FN_INDEX(keycode)]) }; -} - -action_t keymap_func_to_action(uint16_t keycode) -{ - // For FUNC without 8bit limit - return (action_t){ .code = pgm_read_word(&fn_actions[(int)keycode]) }; -} diff --git a/keyboard/preonic/extended_keymap_common.h b/keyboard/preonic/extended_keymap_common.h deleted file mode 100644 index 7ccfa1b03..000000000 --- a/keyboard/preonic/extended_keymap_common.h +++ /dev/null @@ -1,181 +0,0 @@ -/* -Copyright 2012,2013 Jun Wako - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ - -#ifndef KEYMAP_H -#define KEYMAP_H - -#include -#include -#include "action.h" -#include -#include "keycode.h" -#include "keymap.h" -#include "action_macro.h" -#include "report.h" -#include "host.h" -// #include "print.h" -#include "debug.h" - -#ifdef BOOTMAGIC_ENABLE -/* NOTE: Not portable. Bit field order depends on implementation */ -typedef union { - uint16_t raw; - struct { - bool swap_control_capslock:1; - bool capslock_to_control:1; - bool swap_lalt_lgui:1; - bool swap_ralt_rgui:1; - bool no_gui:1; - bool swap_grave_esc:1; - bool swap_backslash_backspace:1; - bool nkro:1; - }; -} keymap_config_t; -keymap_config_t keymap_config; -#endif - - -/* translates key to keycode */ -uint16_t keymap_key_to_keycode(uint8_t layer, keypos_t key); - -/* translates Fn keycode to action */ -action_t keymap_fn_to_action(uint16_t keycode); - -/* translates Fn keycode to action */ -action_t keymap_func_to_action(uint16_t keycode); - -extern const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS]; -extern const uint16_t fn_actions[]; - -// Ability to use mods in layouts -#define LCTL(kc) kc | 0x0100 -#define LSFT(kc) kc | 0x0200 -#define LALT(kc) kc | 0x0400 -#define LGUI(kc) kc | 0x0800 -#define RCTL(kc) kc | 0x1100 -#define RSFT(kc) kc | 0x1200 -#define RALT(kc) kc | 0x1400 -#define RGUI(kc) kc | 0x1800 - -// Alias for function layers than expand past FN31 -#define FUNC(kc) kc | 0x2000 - -// Aliases -#define S(kc) LSFT(kc) -#define F(kc) FUNC(kc) - -// For software implementation of colemak -#define CM_Q KC_Q -#define CM_W KC_W -#define CM_F KC_E -#define CM_P KC_R -#define CM_G KC_T -#define CM_J KC_Y -#define CM_L KC_U -#define CM_U KC_I -#define CM_Y KC_O -#define CM_SCLN KC_P - -#define CM_A KC_A -#define CM_R KC_S -#define CM_S KC_D -#define CM_T KC_F -#define CM_D KC_G -#define CM_H KC_H -#define CM_N KC_J -#define CM_E KC_K -#define CM_I KC_L -#define CM_O KC_SCLN - -#define CM_Z KC_Z -#define CM_X KC_X -#define CM_C KC_C -#define CM_V KC_V -#define CM_B KC_B -#define CM_K KC_N -#define CM_M KC_M -#define CM_COMM KC_COMM -#define CM_DOT KC_DOT -#define CM_SLSH KC_SLSH - -// Make it easy to support these in macros -#define KC_CM_Q CM_Q -#define KC_CM_W CM_W -#define KC_CM_F CM_F -#define KC_CM_P CM_P -#define KC_CM_G CM_G -#define KC_CM_J CM_J -#define KC_CM_L CM_L -#define KC_CM_U CM_U -#define KC_CM_Y CM_Y -#define KC_CM_SCLN CM_SCLN - -#define KC_CM_A CM_A -#define KC_CM_R CM_R -#define KC_CM_S CM_S -#define KC_CM_T CM_T -#define KC_CM_D CM_D -#define KC_CM_H CM_H -#define KC_CM_N CM_N -#define KC_CM_E CM_E -#define KC_CM_I CM_I -#define KC_CM_O CM_O - -#define KC_CM_Z CM_Z -#define KC_CM_X CM_X -#define KC_CM_C CM_C -#define KC_CM_V CM_V -#define KC_CM_B CM_B -#define KC_CM_K CM_K -#define KC_CM_M CM_M -#define KC_CM_COMM CM_COMM -#define KC_CM_DOT CM_DOT -#define KC_CM_SLSH CM_SLSH - -#define M(kc) kc | 0x3000 - -#define MACRODOWN(...) (record->event.pressed ? MACRO(__VA_ARGS__) : MACRO_NONE) - -#define BL_ON 0x4009 -#define BL_OFF 0x4000 -#define BL_0 0x4000 -#define BL_1 0x4001 -#define BL_2 0x4002 -#define BL_3 0x4003 -#define BL_4 0x4004 -#define BL_5 0x4005 -#define BL_6 0x4006 -#define BL_7 0x4007 -#define BL_8 0x4008 -#define BL_9 0x4009 -#define BL_10 0x400A -#define BL_11 0x400B -#define BL_12 0x400C -#define BL_13 0x400D -#define BL_14 0x400E -#define BL_15 0x400F -#define BL_DEC 0x4010 -#define BL_INC 0x4011 -#define BL_TOGG 0x4012 -#define BL_STEP 0x4013 - -#define RESET 0x5000 -#define DEBUG 0x5001 - -#define MIDI(n) n | 0x6000 - -#endif diff --git a/keyboard/preonic/extended_keymaps/extended_keymap_default.c b/keyboard/preonic/extended_keymaps/extended_keymap_default.c deleted file mode 100644 index b52f60fd0..000000000 --- a/keyboard/preonic/extended_keymaps/extended_keymap_default.c +++ /dev/null @@ -1,70 +0,0 @@ -#include "extended_keymap_common.h" -#include "backlight.h" -#include "lufa.h" -#include "debug.h" - -const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { -[0] = { /* Qwerty */ - {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL}, - {KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC}, - {KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT}, - {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT}, - {M(0), KC_LCTL, KC_LALT, KC_LGUI, FUNC(2), KC_SPC, KC_SPC, FUNC(1), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} - // Space is repeated to accommadate for both spacebar wiring positions -}, -[1] = { /* Colemak */ - {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL}, - {KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC}, - {KC_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT}, - {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT}, - {KC_FN3, KC_LCTL, KC_LALT, KC_LGUI, FUNC(2), KC_SPC, KC_SPC, FUNC(1), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} -}, -[2] = { /* RAISE */ - {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL}, - {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC}, - {KC_TRNS, FUNC(3), FUNC(4), RESET, KC_TRNS, KC_TRNS, KC_TRNS, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS}, - {KC_TRNS, KC_F11, KC_F12, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS}, - {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, FUNC(1), KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY} -}, -[3] = { /* LOWER */ - {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL}, - {S(KC_GRV), S(KC_1), S(KC_2), S(KC_3), S(KC_4), S(KC_5), S(KC_6), S(KC_7), S(KC_8), S(KC_9), S(KC_0), KC_BSPC}, - {KC_TRNS, FUNC(3), FUNC(4), RESET, KC_TRNS, KC_TRNS, KC_TRNS, S(KC_MINS), S(KC_EQL), S(KC_LBRC), S(KC_RBRC), S(KC_BSLS)}, - {KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_TRNS}, - {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, FUNC(2), KC_TRNS, KC_TRNS, KC_TRNS, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY} -}, -[4] = { /* TENKEY */ - {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL}, - {KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_KP_7, KC_KP_8, KC_KP_9, KC_P, KC_BSPC}, - {KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_KP_4, KC_KP_5, KC_KP_6, KC_SCLN, KC_QUOT}, - {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_KP_1, KC_KP_2, KC_KP_3, KC_SLSH, KC_ENT}, - {KC_TRNS, KC_LCTL, KC_LALT, KC_LGUI, KC_TRNS, KC_SPC, KC_SPC, KC_KP_0, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} -} -}; - -const uint16_t PROGMEM fn_actions[] = { - [1] = ACTION_LAYER_MOMENTARY(2), // to RAISE - [2] = ACTION_LAYER_MOMENTARY(3), // to LOWER - - [3] = ACTION_DEFAULT_LAYER_SET(0), - [4] = ACTION_DEFAULT_LAYER_SET(1), - -}; - -const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) -{ - // MACRODOWN only works in this function - switch(id) { - case 0: - if (record->event.pressed) { - register_code(KC_RSFT); - midi_send_noteon(&midi_device, 1, 64, 127); - backlight_step(); - } else { - unregister_code(KC_RSFT); - midi_send_noteoff(&midi_device, 1, 64, 127); - } - break; - } - return MACRO_NONE; -}; diff --git a/keyboard/preonic/extended_keymaps/extended_keymap_lock.c b/keyboard/preonic/extended_keymaps/extended_keymap_lock.c deleted file mode 100644 index ec7bc776a..000000000 --- a/keyboard/preonic/extended_keymaps/extended_keymap_lock.c +++ /dev/null @@ -1,81 +0,0 @@ -#include "extended_keymap_common.h" -#include "backlight.h" -#include "action_layer.h" -#include "keymap_midi.h" -#include "beeps.h" - -const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { -[0] = { /* Qwerty */ - {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC}, - {KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC}, - {KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT}, - {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT}, - {M(0), KC_LCTL, KC_LALT, KC_LGUI, FUNC(2), KC_SPC, KC_SPC, FUNC(1), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} - // Space is repeated to accommadate for both spacebar wiring positions -}, -[1] = { /* Colemak */ - {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC}, - {KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC}, - {KC_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT}, - {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT}, - {KC_FN3, KC_LCTL, KC_LALT, KC_LGUI, FUNC(2), KC_SPC, KC_SPC, FUNC(1), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} -}, -[2] = { /* RAISE */ - {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC}, - {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC}, - {KC_TRNS, FUNC(3), FUNC(4), RESET, KC_TRNS, KC_TRNS, KC_TRNS, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS}, - {KC_TRNS, KC_F11, KC_F12, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS}, - {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, FUNC(1), KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY} -}, -[3] = { /* LOWER */ - {KC_GRV, S(KC_1), S(KC_2), S(KC_3), S(KC_4), S(KC_5), S(KC_6), S(KC_7), S(KC_8), S(KC_9), S(KC_0), KC_BSPC}, - {S(KC_GRV), S(KC_1), S(KC_2), S(KC_3), S(KC_4), S(KC_5), S(KC_6), S(KC_7), S(KC_8), S(KC_9), S(KC_0), KC_BSPC}, - {KC_TRNS, FUNC(3), FUNC(4), RESET, KC_TRNS, KC_TRNS, KC_TRNS, S(KC_MINS), S(KC_EQL), S(KC_LBRC), S(KC_RBRC), S(KC_BSLS)}, - {KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_TRNS}, - {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, FUNC(2), KC_TRNS, KC_TRNS, KC_TRNS, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY} -}, -[4] = { /* TENKEY */ - {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC}, - {KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_KP_7, KC_KP_8, KC_KP_9, KC_P, KC_BSPC}, - {KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_KP_4, KC_KP_5, KC_KP_6, KC_SCLN, KC_QUOT}, - {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_KP_1, KC_KP_2, KC_KP_3, KC_SLSH, KC_ENT}, - {KC_TRNS, KC_LCTL, KC_LALT, KC_LGUI, KC_TRNS, KC_SPC, KC_SPC, KC_KP_0, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} -}, -[5] = { - { MIDI12 }, - { MIDI12 }, - { MIDI12 }, - { MIDI12 }, - {M(0), KC_LCTL, KC_LALT, KC_LGUI, FUNC(2), KC_SPC, KC_SPC, FUNC(1), MIDI, MIDI, MIDI, MIDI} -} - -}; - -const uint16_t PROGMEM fn_actions[] = { - [1] = ACTION_LAYER_MOMENTARY(2), // to RAISE - [2] = ACTION_LAYER_MOMENTARY(3), // to LOWER - - [3] = ACTION_DEFAULT_LAYER_SET(0), - [4] = ACTION_DEFAULT_LAYER_SET(1), - -}; - -const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) -{ - switch(id) { - case 0: - if (record->event.pressed) { - // register_code(KC_RSFT); - backlight_set(BACKLIGHT_LEVELS); - default_layer_and(0); - default_layer_or((1<<5)); - } else { - // unregister_code(KC_RSFT); - backlight_set(0); - default_layer_and(0); - default_layer_or(0); - } - break; - } - return MACRO_NONE; -}; diff --git a/keyboard/preonic/keymap_midi.c b/keyboard/preonic/keymap_midi.c deleted file mode 100644 index a0fa59990..000000000 --- a/keyboard/preonic/keymap_midi.c +++ /dev/null @@ -1,110 +0,0 @@ -/* -Copyright 2015 Jack Humbert - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ - -#include "extended_keymap_common.h" -#include "keymap_midi.h" -#include - -uint8_t starting_note = 0x0C; -int offset = 7; - -void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) -{ - if (id != 0) { - if (record->event.pressed) { - midi_send_noteon(&midi_device, opt, (id & 0xFF), 127); - } else { - midi_send_noteoff(&midi_device, opt, (id & 0xFF), 127); - } - } - - if (record->event.key.col == (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 == (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, 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, 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 deleted file mode 100644 index c5917f884..000000000 --- a/keyboard/preonic/keymap_midi.h +++ /dev/null @@ -1,220 +0,0 @@ -/* -Copyright 2015 Jack Humbert - -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 . -*/ - -#ifndef KEYMAP_MIDI_H -#define KEYMAP_MIDI_H - -#define MIDI 0x6000 -#define MIDI12 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000 - -#define CHNL(note, channel) (note + (channel << 8)) - -#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 ) -#define N_DN1F (0x600C + (12 * -1) + 1 ) -#define N_DN1 (0x600C + (12 * -1) + 2 ) -#define N_DN1S (0x600C + (12 * -1) + 3 ) -#define N_EN1F (0x600C + (12 * -1) + 3 ) -#define N_EN1 (0x600C + (12 * -1) + 4 ) -#define N_FN1 (0x600C + (12 * -1) + 5 ) -#define N_FN1S (0x600C + (12 * -1) + 6 ) -#define N_GN1F (0x600C + (12 * -1) + 6 ) -#define N_GN1 (0x600C + (12 * -1) + 7 ) -#define N_GN1S (0x600C + (12 * -1) + 8 ) -#define N_AN1F (0x600C + (12 * -1) + 8 ) -#define N_AN1 (0x600C + (12 * -1) + 9 ) -#define N_AN1S (0x600C + (12 * -1) + 10) -#define N_BN1F (0x600C + (12 * -1) + 10) -#define N_BN1 (0x600C + (12 * -1) + 11) -#define N_C0 (0x600C + (12 * 0) + 0 ) -#define N_C0S (0x600C + (12 * 0) + 1 ) -#define N_D0F (0x600C + (12 * 0) + 1 ) -#define N_D0 (0x600C + (12 * 0) + 2 ) -#define N_D0S (0x600C + (12 * 0) + 3 ) -#define N_E0F (0x600C + (12 * 0) + 3 ) -#define N_E0 (0x600C + (12 * 0) + 4 ) -#define N_F0 (0x600C + (12 * 0) + 5 ) -#define N_F0S (0x600C + (12 * 0) + 6 ) -#define N_G0F (0x600C + (12 * 0) + 6 ) -#define N_G0 (0x600C + (12 * 0) + 7 ) -#define N_G0S (0x600C + (12 * 0) + 8 ) -#define N_A0F (0x600C + (12 * 0) + 8 ) -#define N_A0 (0x600C + (12 * 0) + 9 ) -#define N_A0S (0x600C + (12 * 0) + 10) -#define N_B0F (0x600C + (12 * 0) + 10) -#define N_B0 (0x600C + (12 * 0) + 11) -#define N_C1 (0x600C + (12 * 1) + 0 ) -#define N_C1S (0x600C + (12 * 1) + 1 ) -#define N_D1F (0x600C + (12 * 1) + 1 ) -#define N_D1 (0x600C + (12 * 1) + 2 ) -#define N_D1S (0x600C + (12 * 1) + 3 ) -#define N_E1F (0x600C + (12 * 1) + 3 ) -#define N_E1 (0x600C + (12 * 1) + 4 ) -#define N_F1 (0x600C + (12 * 1) + 5 ) -#define N_F1S (0x600C + (12 * 1) + 6 ) -#define N_G1F (0x600C + (12 * 1) + 6 ) -#define N_G1 (0x600C + (12 * 1) + 7 ) -#define N_G1S (0x600C + (12 * 1) + 8 ) -#define N_A1F (0x600C + (12 * 1) + 8 ) -#define N_A1 (0x600C + (12 * 1) + 9 ) -#define N_A1S (0x600C + (12 * 1) + 10) -#define N_B1F (0x600C + (12 * 1) + 10) -#define N_B1 (0x600C + (12 * 1) + 11) -#define N_C2 (0x600C + (12 * 2) + 0 ) -#define N_C2S (0x600C + (12 * 2) + 1 ) -#define N_D2F (0x600C + (12 * 2) + 1 ) -#define N_D2 (0x600C + (12 * 2) + 2 ) -#define N_D2S (0x600C + (12 * 2) + 3 ) -#define N_E2F (0x600C + (12 * 2) + 3 ) -#define N_E2 (0x600C + (12 * 2) + 4 ) -#define N_F2 (0x600C + (12 * 2) + 5 ) -#define N_F2S (0x600C + (12 * 2) + 6 ) -#define N_G2F (0x600C + (12 * 2) + 6 ) -#define N_G2 (0x600C + (12 * 2) + 7 ) -#define N_G2S (0x600C + (12 * 2) + 8 ) -#define N_A2F (0x600C + (12 * 2) + 8 ) -#define N_A2 (0x600C + (12 * 2) + 9 ) -#define N_A2S (0x600C + (12 * 2) + 10) -#define N_B2F (0x600C + (12 * 2) + 10) -#define N_B2 (0x600C + (12 * 2) + 11) -#define N_C3 (0x600C + (12 * 3) + 0 ) -#define N_C3S (0x600C + (12 * 3) + 1 ) -#define N_D3F (0x600C + (12 * 3) + 1 ) -#define N_D3 (0x600C + (12 * 3) + 2 ) -#define N_D3S (0x600C + (12 * 3) + 3 ) -#define N_E3F (0x600C + (12 * 3) + 3 ) -#define N_E3 (0x600C + (12 * 3) + 4 ) -#define N_F3 (0x600C + (12 * 3) + 5 ) -#define N_F3S (0x600C + (12 * 3) + 6 ) -#define N_G3F (0x600C + (12 * 3) + 6 ) -#define N_G3 (0x600C + (12 * 3) + 7 ) -#define N_G3S (0x600C + (12 * 3) + 8 ) -#define N_A3F (0x600C + (12 * 3) + 8 ) -#define N_A3 (0x600C + (12 * 3) + 9 ) -#define N_A3S (0x600C + (12 * 3) + 10) -#define N_B3F (0x600C + (12 * 3) + 10) -#define N_B3 (0x600C + (12 * 3) + 11) -#define N_C4 (0x600C + (12 * 4) + 0 ) -#define N_C4S (0x600C + (12 * 4) + 1 ) -#define N_D4F (0x600C + (12 * 4) + 1 ) -#define N_D4 (0x600C + (12 * 4) + 2 ) -#define N_D4S (0x600C + (12 * 4) + 3 ) -#define N_E4F (0x600C + (12 * 4) + 3 ) -#define N_E4 (0x600C + (12 * 4) + 4 ) -#define N_F4 (0x600C + (12 * 4) + 5 ) -#define N_F4S (0x600C + (12 * 4) + 6 ) -#define N_G4F (0x600C + (12 * 4) + 6 ) -#define N_G4 (0x600C + (12 * 4) + 7 ) -#define N_G4S (0x600C + (12 * 4) + 8 ) -#define N_A4F (0x600C + (12 * 4) + 8 ) -#define N_A4 (0x600C + (12 * 4) + 9 ) -#define N_A4S (0x600C + (12 * 4) + 10) -#define N_B4F (0x600C + (12 * 4) + 10) -#define N_B4 (0x600C + (12 * 4) + 11) -#define N_C5 (0x600C + (12 * 5) + 0 ) -#define N_C5S (0x600C + (12 * 5) + 1 ) -#define N_D5F (0x600C + (12 * 5) + 1 ) -#define N_D5 (0x600C + (12 * 5) + 2 ) -#define N_D5S (0x600C + (12 * 5) + 3 ) -#define N_E5F (0x600C + (12 * 5) + 3 ) -#define N_E5 (0x600C + (12 * 5) + 4 ) -#define N_F5 (0x600C + (12 * 5) + 5 ) -#define N_F5S (0x600C + (12 * 5) + 6 ) -#define N_G5F (0x600C + (12 * 5) + 6 ) -#define N_G5 (0x600C + (12 * 5) + 7 ) -#define N_G5S (0x600C + (12 * 5) + 8 ) -#define N_A5F (0x600C + (12 * 5) + 8 ) -#define N_A5 (0x600C + (12 * 5) + 9 ) -#define N_A5S (0x600C + (12 * 5) + 10) -#define N_B5F (0x600C + (12 * 5) + 10) -#define N_B5 (0x600C + (12 * 5) + 11) -#define N_C6 (0x600C + (12 * 6) + 0 ) -#define N_C6S (0x600C + (12 * 6) + 1 ) -#define N_D6F (0x600C + (12 * 6) + 1 ) -#define N_D6 (0x600C + (12 * 6) + 2 ) -#define N_D6S (0x600C + (12 * 6) + 3 ) -#define N_E6F (0x600C + (12 * 6) + 3 ) -#define N_E6 (0x600C + (12 * 6) + 4 ) -#define N_F6 (0x600C + (12 * 6) + 5 ) -#define N_F6S (0x600C + (12 * 6) + 6 ) -#define N_G6F (0x600C + (12 * 6) + 6 ) -#define N_G6 (0x600C + (12 * 6) + 7 ) -#define N_G6S (0x600C + (12 * 6) + 8 ) -#define N_A6F (0x600C + (12 * 6) + 8 ) -#define N_A6 (0x600C + (12 * 6) + 9 ) -#define N_A6S (0x600C + (12 * 6) + 10) -#define N_B6F (0x600C + (12 * 6) + 10) -#define N_B6 (0x600C + (12 * 6) + 11) -#define N_C7 (0x600C + (12 * 7) + 0 ) -#define N_C7S (0x600C + (12 * 7) + 1 ) -#define N_D7F (0x600C + (12 * 7) + 1 ) -#define N_D7 (0x600C + (12 * 7) + 2 ) -#define N_D7S (0x600C + (12 * 7) + 3 ) -#define N_E7F (0x600C + (12 * 7) + 3 ) -#define N_E7 (0x600C + (12 * 7) + 4 ) -#define N_F7 (0x600C + (12 * 7) + 5 ) -#define N_F7S (0x600C + (12 * 7) + 6 ) -#define N_G7F (0x600C + (12 * 7) + 6 ) -#define N_G7 (0x600C + (12 * 7) + 7 ) -#define N_G7S (0x600C + (12 * 7) + 8 ) -#define N_A7F (0x600C + (12 * 7) + 8 ) -#define N_A7 (0x600C + (12 * 7) + 9 ) -#define N_A7S (0x600C + (12 * 7) + 10) -#define N_B7F (0x600C + (12 * 7) + 10) -#define N_B7 (0x600C + (12 * 7) + 11) -#define N_C8 (0x600C + (12 * 8) + 0 ) -#define N_C8S (0x600C + (12 * 8) + 1 ) -#define N_D8F (0x600C + (12 * 8) + 1 ) -#define N_D8 (0x600C + (12 * 8) + 2 ) -#define N_D8S (0x600C + (12 * 8) + 3 ) -#define N_E8F (0x600C + (12 * 8) + 3 ) -#define N_E8 (0x600C + (12 * 8) + 4 ) -#define N_F8 (0x600C + (12 * 8) + 5 ) -#define N_F8S (0x600C + (12 * 8) + 6 ) -#define N_G8F (0x600C + (12 * 8) + 6 ) -#define N_G8 (0x600C + (12 * 8) + 7 ) -#define N_G8S (0x600C + (12 * 8) + 8 ) -#define N_A8F (0x600C + (12 * 8) + 8 ) -#define N_A8 (0x600C + (12 * 8) + 9 ) -#define N_A8S (0x600C + (12 * 8) + 10) -#define N_B8F (0x600C + (12 * 8) + 10) -#define N_B8 (0x600C + (12 * 8) + 11) -#define N_C8 (0x600C + (12 * 8) + 0 ) -#define N_C8S (0x600C + (12 * 8) + 1 ) -#define N_D8F (0x600C + (12 * 8) + 1 ) -#define N_D8 (0x600C + (12 * 8) + 2 ) -#define N_D8S (0x600C + (12 * 8) + 3 ) -#define N_E8F (0x600C + (12 * 8) + 3 ) -#define N_E8 (0x600C + (12 * 8) + 4 ) -#define N_F8 (0x600C + (12 * 8) + 5 ) -#define N_F8S (0x600C + (12 * 8) + 6 ) -#define N_G8F (0x600C + (12 * 8) + 6 ) -#define N_G8 (0x600C + (12 * 8) + 7 ) -#define N_G8S (0x600C + (12 * 8) + 8 ) -#define N_A8F (0x600C + (12 * 8) + 8 ) -#define N_A8 (0x600C + (12 * 8) + 9 ) -#define N_A8S (0x600C + (12 * 8) + 10) -#define N_B8F (0x600C + (12 * 8) + 10) -#define N_B8 (0x600C + (12 * 8) + 11) - -#endif \ No newline at end of file diff --git a/keyboard/preonic/led.c b/keyboard/preonic/led.c deleted file mode 100644 index 2c0574660..000000000 --- a/keyboard/preonic/led.c +++ /dev/null @@ -1,38 +0,0 @@ -/* -Copyright 2012 Jun Wako - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ - -#include -#include "stdint.h" -#include "led.h" - - -void led_set(uint8_t usb_led) -{ - // // Using PE6 Caps Lock LED - // if (usb_led & (1<. -*/ - -/* - * scan matrix - */ -#include -#include -#include -#include -#include "print.h" -#include "debug.h" -#include "util.h" -#include "matrix.h" - -#ifndef DEBOUNCE -# define DEBOUNCE 10 -#endif -static uint8_t debouncing = DEBOUNCE; - -/* matrix state(1:on, 0:off) */ -static matrix_row_t matrix[MATRIX_ROWS]; -static matrix_row_t matrix_debouncing[MATRIX_ROWS]; - -static matrix_row_t read_cols(void); -static void init_cols(void); -static void unselect_rows(void); -static void select_row(uint8_t row); - -inline -uint8_t matrix_rows(void) -{ - return MATRIX_ROWS; -} - -inline -uint8_t matrix_cols(void) -{ - return MATRIX_COLS; -} - -void matrix_init(void) -{ - // To use PORTF disable JTAG with writing JTD bit twice within four cycles. - MCUCR |= (1<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); + // 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.626)*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); + // 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.626)*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 -- cgit v1.2.3-70-g09d2 From dbd4ab3457dd001ab4bbcec14315047b815f7dfe Mon Sep 17 00:00:00 2001 From: Stephan Bösebeck Date: Thu, 31 Mar 2016 23:15:59 +0200 Subject: fixed de_osx prefix in keymap include to avoid conflicts --- keyboard/ergodox_ez/keymaps/osx_de/keymap.c | 50 ++++----- quantum/keymap_extras/keymap_german_osx.h | 156 ++++++++++++++-------------- 2 files changed, 103 insertions(+), 103 deletions(-) (limited to 'quantum') diff --git a/keyboard/ergodox_ez/keymaps/osx_de/keymap.c b/keyboard/ergodox_ez/keymaps/osx_de/keymap.c index df8d99650..5d1296419 100644 --- a/keyboard/ergodox_ez/keymaps/osx_de/keymap.c +++ b/keyboard/ergodox_ez/keymaps/osx_de/keymap.c @@ -13,8 +13,8 @@ #define M_CTRL_CMDV 1 #define M_CTRL_CMDC 2 #define M_MEH_SH_ACUT 3 -#define M_DE_PLUS_CTRLALT 12 -#define M_DE_CIRC_CTRLCMD 13 +#define M_DE_OSX_PLUS_CTRLALT 12 +#define M_DE_OSX_CIRC_CTRLCMD 13 #define M_TOGGLE_5 14 #define M_CTL_SFT_HASH 15 @@ -54,21 +54,21 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { // Otherwise, it needs KC_* [BASE] = KEYMAP( // layer 0 : default // left hand - KC_ESC, DE_1, DE_2, DE_3, DE_4, DE_5, M(M_CTL_SFT_HASH), - KC_TAB, DE_Q, DE_W, DE_E, DE_R, DE_T, KC_LGUI, - KC_LALT, DE_A, DE_S, DE_D, DE_F, DE_G, - KC_LSFT, CTL_T(DE_Y), DE_X, DE_C, DE_V, DE_B, KC_LALT, - LT(SYMB,DE_LESS), M(M_DE_CIRC_CTRLCMD), M(M_DE_PLUS_CTRLALT), KC_UP, KC_DOWN, + KC_ESC, DE_OSX_1, DE_OSX_2, DE_OSX_3, DE_OSX_4, DE_OSX_5, M(M_CTL_SFT_HASH), + KC_TAB, DE_OSX_Q, DE_OSX_W, DE_OSX_E, DE_OSX_R, DE_OSX_T, KC_LGUI, + KC_LALT, DE_OSX_A, DE_OSX_S, DE_OSX_D, DE_OSX_F, DE_OSX_G, + KC_LSFT, CTL_T(DE_OSX_Y), DE_OSX_X, DE_OSX_C, DE_OSX_V, DE_OSX_B, KC_LALT, + LT(SYMB,DE_OSX_LESS), M(M_DE_OSX_CIRC_CTRLCMD), M(M_DE_OSX_PLUS_CTRLALT), KC_UP, KC_DOWN, M(M_MEH_SH_ACUT), TG(2), KC_HOME, KC_BSPC,KC_DEL, LT(SMLY,KC_END), // right hand - M(M_CTL_SFT_HASH), DE_6, DE_7, DE_8, DE_9, DE_0, DE_SS, - KC_RGUI, DE_Z, DE_U, DE_I, DE_O, DE_P, DE_UE, - DE_H, DE_J, DE_K, DE_L, DE_OE, ALT_T(DE_AE), - KC_RALT, DE_N, DE_M, DE_COMM,DE_DOT, CTL_T(DE_MINS), KC_RSFT, - KC_LEFT, KC_RIGHT,LGUI(KC_LSFT),LALT(KC_LSFT), LT(SYMB,DE_PLUS), - TG(4), ALL_T(DE_ACUT), + M(M_CTL_SFT_HASH), DE_OSX_6, DE_OSX_7, DE_OSX_8, DE_OSX_9, DE_OSX_0, DE_OSX_SS, + KC_RGUI, DE_OSX_Z, DE_OSX_U, DE_OSX_I, DE_OSX_O, DE_OSX_P, DE_OSX_UE, + DE_OSX_H, DE_OSX_J, DE_OSX_K, DE_OSX_L, DE_OSX_OE, ALT_T(DE_OSX_AE), + KC_RALT, DE_OSX_N, DE_OSX_M, DE_OSX_COMM,DE_OSX_DOT, CTL_T(DE_OSX_MINS), KC_RSFT, + KC_LEFT, KC_RIGHT,LGUI(KC_LSFT),LALT(KC_LSFT), LT(SYMB,DE_OSX_PLUS), + TG(4), ALL_T(DE_OSX_ACUT), KC_PGUP, KC_PGDN,KC_ENT, KC_SPC ), @@ -97,19 +97,19 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [SYMB] = KEYMAP( // left hand KC_TRNS,KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TRNS, - KC_TRNS,DE_LESS,DE_MORE,DE_EXLM,DE_QST, KC_TRNS,KC_TRNS, - KC_TRNS,DE_HASH,DE_DLR, DE_BSLS,DE_SLSH,KC_DOT, - KC_TRNS,KC_TRNS,DE_LESS,DE_PERC,DE_PIPE,DE_TILD,KC_TRNS, + KC_TRNS,DE_OSX_LESS,DE_OSX_MORE,DE_OSX_EXLM,DE_OSX_QST, KC_TRNS,KC_TRNS, + KC_TRNS,DE_OSX_HASH,DE_OSX_DLR, DE_OSX_BSLS,DE_OSX_SLSH,KC_DOT, + KC_TRNS,KC_TRNS,DE_OSX_LESS,DE_OSX_PERC,DE_OSX_PIPE,DE_OSX_TILD,KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS,KC_DEL,KC_TRNS, // right hand M(M_TOGGLE_5), KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, - KC_TRNS, LALT(LSFT(KC_7)), LALT(KC_5), LALT(KC_6), DE_LESS, DE_MORE, DE_EXLM, - DE_SLSH, DE_LPRN, DE_RPRN, LALT(KC_8), LALT(KC_9), DE_HASH, - KC_TRNS, DE_PIPE, DE_TILD, DE_CIRC, KC_UP, DE_MINS, LSFT(KC_4), - DE_QUOT, KC_LEFT, KC_DOWN, KC_RIGHT, KC_TRNS, + KC_TRNS, LALT(LSFT(KC_7)), LALT(KC_5), LALT(KC_6), DE_OSX_LESS, DE_OSX_MORE, DE_OSX_EXLM, + DE_OSX_SLSH, DE_OSX_LPRN, DE_OSX_RPRN, LALT(KC_8), LALT(KC_9), DE_OSX_HASH, + KC_TRNS, DE_OSX_PIPE, DE_OSX_TILD, DE_OSX_CIRC, KC_UP, DE_OSX_MINS, LSFT(KC_4), + DE_OSX_QUOT, KC_LEFT, KC_DOWN, KC_RIGHT, KC_TRNS, KC_F13, KC_F12, KC_F14, KC_F15, KC_TRNS, KC_TRNS @@ -210,9 +210,9 @@ KEYMAP( // right hand KC_TRNS, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_TRNS, KC_UP, KC_7, KC_8, KC_9, LSFT(KC_RBRC), KC_F12, - KC_DOWN, KC_4, KC_5, KC_6, KC_RBRC, DE_MINS, + KC_DOWN, KC_4, KC_5, KC_6, KC_RBRC, DE_OSX_MINS, KC_TRNS, LSFT(KC_6), KC_1, KC_2, KC_3, LSFT(KC_7), KC_TRNS, - KC_0,KC_DOT, KC_COMM, DE_EQL, KC_TRNS, + KC_0,KC_DOT, KC_COMM, DE_OSX_EQL, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS @@ -309,7 +309,7 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) if (timer_elapsed(start) > 150){ return MACRO(U(LCTRL),U(LSFT),U(LALT),END); } else { - return MACRO(U(LCTRL),U(LALT),T(EQL),U(LSFT),END); //cannot use DE_ACUT here, as macro needs KC_ prefix + return MACRO(U(LCTRL),U(LALT),T(EQL),U(LSFT),END); //cannot use DE_OSX_ACUT here, as macro needs KC_ prefix } } break; @@ -325,7 +325,7 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) } } break; - case M_DE_CIRC_CTRLCMD: + case M_DE_OSX_CIRC_CTRLCMD: if (record->event.pressed) { start = timer_read(); return MACRO(D(LCTRL),D(LGUI),END); @@ -337,7 +337,7 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) } } break; - case M_DE_PLUS_CTRLALT: + case M_DE_OSX_PLUS_CTRLALT: if (record->event.pressed) { start = timer_read(); return MACRO(D(LCTRL),D(LALT),END); diff --git a/quantum/keymap_extras/keymap_german_osx.h b/quantum/keymap_extras/keymap_german_osx.h index da91b4bf4..d0b77fb80 100644 --- a/quantum/keymap_extras/keymap_german_osx.h +++ b/quantum/keymap_extras/keymap_german_osx.h @@ -9,92 +9,92 @@ // Alt gr // normal characters -#define DE_Z KC_Y -#define DE_Y KC_Z +#define DE_OSX_Z KC_Y +#define DE_OSX_Y KC_Z -#define DE_A KC_A -#define DE_B KC_B -#define DE_C KC_C -#define DE_D KC_D -#define DE_E KC_E -#define DE_F KC_F -#define DE_G KC_G -#define DE_H KC_H -#define DE_I KC_I -#define DE_J KC_J -#define DE_K KC_K -#define DE_L KC_L -#define DE_M KC_M -#define DE_N KC_N -#define DE_O KC_O -#define DE_P KC_P -#define DE_Q KC_Q -#define DE_R KC_R -#define DE_S KC_S -#define DE_T KC_T -#define DE_U KC_U -#define DE_V KC_V -#define DE_W KC_W -#define DE_X KC_X +#define DE_OSX_A KC_A +#define DE_OSX_B KC_B +#define DE_OSX_C KC_C +#define DE_OSX_D KC_D +#define DE_OSX_E KC_E +#define DE_OSX_F KC_F +#define DE_OSX_G KC_G +#define DE_OSX_H KC_H +#define DE_OSX_I KC_I +#define DE_OSX_J KC_J +#define DE_OSX_K KC_K +#define DE_OSX_L KC_L +#define DE_OSX_M KC_M +#define DE_OSX_N KC_N +#define DE_OSX_O KC_O +#define DE_OSX_P KC_P +#define DE_OSX_Q KC_Q +#define DE_OSX_R KC_R +#define DE_OSX_S KC_S +#define DE_OSX_T KC_T +#define DE_OSX_U KC_U +#define DE_OSX_V KC_V +#define DE_OSX_W KC_W +#define DE_OSX_X KC_X -#define DE_0 KC_0 -#define DE_1 KC_1 -#define DE_2 KC_2 -#define DE_3 KC_3 -#define DE_4 KC_4 -#define DE_5 KC_5 -#define DE_6 KC_6 -#define DE_7 KC_7 -#define DE_8 KC_8 -#define DE_9 KC_9 +#define DE_OSX_0 KC_0 +#define DE_OSX_1 KC_1 +#define DE_OSX_2 KC_2 +#define DE_OSX_3 KC_3 +#define DE_OSX_4 KC_4 +#define DE_OSX_5 KC_5 +#define DE_OSX_6 KC_6 +#define DE_OSX_7 KC_7 +#define DE_OSX_8 KC_8 +#define DE_OSX_9 KC_9 -#define DE_DOT KC_DOT -#define DE_COMM KC_COMM +#define DE_OSX_DOT KC_DOT +#define DE_OSX_COMM KC_COMM -#define DE_SS KC_MINS -#define DE_AE KC_QUOT -#define DE_UE KC_LBRC -#define DE_OE KC_SCLN +#define DE_OSX_SS KC_MINS +#define DE_OSX_AE KC_QUOT +#define DE_OSX_UE KC_LBRC +#define DE_OSX_OE KC_SCLN -#define DE_CIRC KC_NUBS // accent circumflex ^ and ring ° -#define DE_ACUT KC_EQL // accent acute ´ and grave ` -#define DE_PLUS KC_RBRC // + and * and ~ -#define DE_HASH KC_BSLS // # and ' -#define DE_LESS KC_GRV // < and > and | -#define DE_MINS KC_SLSH // - and _ +#define DE_OSX_CIRC KC_NUBS // accent circumflex ^ and ring ° +#define DE_OSX_ACUT KC_EQL // accent acute ´ and grave ` +#define DE_OSX_PLUS KC_RBRC // + and * and ~ +#define DE_OSX_HASH KC_BSLS // # and ' +#define DE_OSX_LESS KC_GRV // < and > and | +#define DE_OSX_MINS KC_SLSH // - and _ // shifted characters -#define DE_RING LSFT(DE_CIRC) // ° -#define DE_EXLM LSFT(KC_1) // ! -#define DE_DQOT LSFT(KC_2) // " -#define DE_PARA LSFT(KC_3) // § -#define DE_DLR LSFT(KC_4) // $ -#define DE_PERC LSFT(KC_5) // % -#define DE_AMPR LSFT(KC_6) // & -#define DE_SLSH LSFT(KC_7) // / -#define DE_LPRN LSFT(KC_8) // ( -#define DE_RPRN LSFT(KC_9) // ) -#define DE_EQL LSFT(KC_0) // = -#define DE_QST LSFT(DE_SS) // ? -#define DE_GRV LSFT(DE_ACUT) // ` -#define DE_ASTR LSFT(DE_PLUS) // * -#define DE_QUOT LSFT(DE_HASH) // ' -#define DE_MORE LSFT(DE_LESS) // > -#define DE_COLN LSFT(KC_DOT) // : -#define DE_SCLN LSFT(KC_COMM) // ; -#define DE_UNDS LSFT(DE_MINS) // _ +#define DE_OSX_RING LSFT(DE_OSX_CIRC) // ° +#define DE_OSX_EXLM LSFT(KC_1) // ! +#define DE_OSX_DQOT LSFT(KC_2) // " +#define DE_OSX_PARA LSFT(KC_3) // § +#define DE_OSX_DLR LSFT(KC_4) // $ +#define DE_OSX_PERC LSFT(KC_5) // % +#define DE_OSX_AMPR LSFT(KC_6) // & +#define DE_OSX_SLSH LSFT(KC_7) // / +#define DE_OSX_LPRN LSFT(KC_8) // ( +#define DE_OSX_RPRN LSFT(KC_9) // ) +#define DE_OSX_EQL LSFT(KC_0) // = +#define DE_OSX_QST LSFT(DE_OSX_SS) // ? +#define DE_OSX_GRV LSFT(DE_OSX_ACUT) // ` +#define DE_OSX_ASTR LSFT(DE_OSX_PLUS) // * +#define DE_OSX_QUOT LSFT(DE_OSX_HASH) // ' +#define DE_OSX_MORE LSFT(DE_OSX_LESS) // > +#define DE_OSX_COLN LSFT(KC_DOT) // : +#define DE_OSX_SCLN LSFT(KC_COMM) // ; +#define DE_OSX_UNDS LSFT(DE_OSX_MINS) // _ // Alt-ed characters -#define DE_SQ2 LALT(KC_2) // ² -#define DE_SQ3 LALT(KC_3) // ³ -#define DE_LCBR LALT(KC_8) // { -#define DE_LBRC LALT(KC_5) // [ -#define DE_RBRC LALT(KC_6) // ] -#define DE_RCBR LALT(KC_9) // } -#define DE_BSLS LALT(LSFT(KC_7)) // backslash -#define DE_AT LALT(DE_L) // @ -#define DE_EURO LALT(KC_E) // € -#define DE_TILD LALT(DE_N) // ~ -#define DE_PIPE LALT(DE_7) // | +#define DE_OSX_SQ2 LALT(KC_2) // ² +#define DE_OSX_SQ3 LALT(KC_3) // ³ +#define DE_OSX_LCBR LALT(KC_8) // { +#define DE_OSX_LBRC LALT(KC_5) // [ +#define DE_OSX_RBRC LALT(KC_6) // ] +#define DE_OSX_RCBR LALT(KC_9) // } +#define DE_OSX_BSLS LALT(LSFT(KC_7)) // backslash +#define DE_OSX_AT LALT(DE_OSX_L) // @ +#define DE_OSX_EURO LALT(KC_E) // € +#define DE_OSX_TILD LALT(DE_OSX_N) // ~ +#define DE_OSX_PIPE LALT(DE_OSX_7) // | #endif -- cgit v1.2.3-70-g09d2 From 976d0a327b563ff83d0f7bcee41b2360877bface Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Tue, 5 Apr 2016 09:21:44 -0400 Subject: add silent notes --- quantum/audio.c | 3 +++ 1 file changed, 3 insertions(+) (limited to 'quantum') diff --git a/quantum/audio.c b/quantum/audio.c index 3a3a1a491..f29d941d7 100644 --- a/quantum/audio.c +++ b/quantum/audio.c @@ -247,6 +247,9 @@ ISR(TIMER3_COMPA_vect) { if (note_frequency > 0) { ICR3 = (int)(((double)F_CPU) / note_frequency); // Set max to the period OCR3A = (int)(((double)F_CPU) / note_frequency) >> 1; // Set compare to half the period + } else { + ICR3 = 0; + OCR3A = 0; } #endif -- cgit v1.2.3-70-g09d2 From 9cfc74c35b940884618b0fe1e6fd25c570e1c974 Mon Sep 17 00:00:00 2001 From: Erez Zukerman Date: Thu, 7 Apr 2016 15:21:06 +0300 Subject: [Erez & Jack] Makes tri-layer available across Quantum --- keyboard/planck/keymaps/default/keymap.c | 9 --------- quantum/keymap_common.c | 8 ++++++++ quantum/keymap_common.h | 4 ++++ 3 files changed, 12 insertions(+), 9 deletions(-) (limited to 'quantum') diff --git a/keyboard/planck/keymaps/default/keymap.c b/keyboard/planck/keymaps/default/keymap.c index dee2840f2..56092d04f 100644 --- a/keyboard/planck/keymaps/default/keymap.c +++ b/keyboard/planck/keymaps/default/keymap.c @@ -174,16 +174,7 @@ float tone_dv[][2] = { }; #endif -#define IS_LAYER_ON(layer) ((layer_state) & (1<<(layer))) -#define IS_LAYER_OFF(layer) ((!layer_state) & (1<<(layer))) -void update_tri_layer(uint8_t layer1, uint8_t layer2, uint8_t layer3) { - if (IS_LAYER_ON(layer1) && IS_LAYER_ON(layer2)) { - layer_on(layer3); - } else { - layer_off(layer3); - } -} const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) { // MACRODOWN only works in this function diff --git a/quantum/keymap_common.c b/quantum/keymap_common.c index e3030a886..3a00d36f0 100644 --- a/quantum/keymap_common.c +++ b/quantum/keymap_common.c @@ -291,3 +291,11 @@ action_t keymap_func_to_action(uint16_t keycode) // For FUNC without 8bit limit return (action_t){ .code = pgm_read_word(&fn_actions[(int)keycode]) }; } + +void update_tri_layer(uint8_t layer1, uint8_t layer2, uint8_t layer3) { + if (IS_LAYER_ON(layer1) && IS_LAYER_ON(layer2)) { + layer_on(layer3); + } else { + layer_off(layer3); + } +} diff --git a/quantum/keymap_common.h b/quantum/keymap_common.h index 4a877d2a7..7452a1ff3 100644 --- a/quantum/keymap_common.h +++ b/quantum/keymap_common.h @@ -208,5 +208,9 @@ extern const uint16_t fn_actions[]; #define UNICODE(n) (n | 0x8000) #define UC(n) UNICODE(n) +// For tri-layer +void update_tri_layer(uint8_t layer1, uint8_t layer2, uint8_t layer3); +#define IS_LAYER_ON(layer) ((layer_state) & (1UL<<(layer))) +#define IS_LAYER_OFF(layer) ((!layer_state) & (1UL<<(layer))) #endif -- cgit v1.2.3-70-g09d2 From 97f8f378761506914b69d4fd2d5661bfcae28295 Mon Sep 17 00:00:00 2001 From: skullY Date: Sun, 10 Apr 2016 21:16:49 -0700 Subject: Fixup RGBLIGHT support for clueboard2 --- keyboard/clueboard2/keymaps/keymap_default.c | 11 +++++------ quantum/rgblight.c | 6 +++--- 2 files changed, 8 insertions(+), 9 deletions(-) (limited to 'quantum') diff --git a/keyboard/clueboard2/keymaps/keymap_default.c b/keyboard/clueboard2/keymaps/keymap_default.c index 10fff7b9a..73179f94c 100644 --- a/keyboard/clueboard2/keymaps/keymap_default.c +++ b/keyboard/clueboard2/keymaps/keymap_default.c @@ -1,6 +1,6 @@ #include "clueboard2.h" -#ifdef ENABLE_RGBLIGHT +#ifdef RGBLIGHT_ENABLE #include "rgblight.h" #endif @@ -70,7 +70,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `----------------------------------------------------------------------------------' */ [_RS] = KEYMAP( - #ifdef ENABLE_RGBLIGHT + #ifdef RGBLIGHT_ENABLE KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, F(1), F(7), \ KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,RESET, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, F(8), \ KC_TRNS, KC_TRNS, MO(_RS),KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ @@ -87,7 +87,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { enum function_id { SHIFT_ESC, - #ifdef ENABLE_RGBLIGHT + #ifdef RGBLIGHT_ENABLE RGBLED_TOGGLE, RGBLED_STEP_MODE, RGBLED_INCREASE_HUE, @@ -101,7 +101,7 @@ enum function_id { const uint16_t PROGMEM fn_actions[] = { [0] = ACTION_FUNCTION(SHIFT_ESC), - #ifdef ENABLE_RGBLIGHT + #ifdef RGBLIGHT_ENABLE [1] = ACTION_FUNCTION(RGBLED_TOGGLE), [2] = ACTION_FUNCTION(RGBLED_STEP_MODE), [3] = ACTION_FUNCTION(RGBLED_INCREASE_HUE), @@ -137,12 +137,11 @@ void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { } break; //led operations - #ifdef ENABLE_RGBLIGHT + #ifdef RGBLIGHT_ENABLE case RGBLED_TOGGLE: if (record->event.pressed) { rgblight_toggle(); } - break; case RGBLED_INCREASE_HUE: if (record->event.pressed) { diff --git a/quantum/rgblight.c b/quantum/rgblight.c index 2215cf5cd..6adc9e278 100644 --- a/quantum/rgblight.c +++ b/quantum/rgblight.c @@ -190,7 +190,7 @@ void rgblight_mode(uint8_t mode) { rgblight_config.mode = mode; } eeconfig_write_rgblight(rgblight_config.raw); - dprintf("rgblight mode: %u\n", rgblight_config.mode); + xprintf("rgblight mode: %u\n", rgblight_config.mode); if (rgblight_config.mode == 1) { rgblight_timer_disable(); } else if (rgblight_config.mode >=2 && rgblight_config.mode <=23) { @@ -207,7 +207,7 @@ void rgblight_mode(uint8_t mode) { void rgblight_toggle(void) { rgblight_config.enable ^= 1; eeconfig_write_rgblight(rgblight_config.raw); - dprintf("rgblight toggle: rgblight_config.enable = %u\n", rgblight_config.enable); + xprintf("rgblight toggle: rgblight_config.enable = %u\n", rgblight_config.enable); if (rgblight_config.enable) { rgblight_mode(rgblight_config.mode); } else { @@ -300,7 +300,7 @@ void rgblight_sethsv(uint16_t hue, uint8_t sat, uint8_t val){ rgblight_config.sat = sat; rgblight_config.val = val; eeconfig_write_rgblight(rgblight_config.raw); - dprintf("rgblight set hsv [EEPROM]: %u,%u,%u\n", rgblight_config.hue, rgblight_config.sat, rgblight_config.val); + xprintf("rgblight set hsv [EEPROM]: %u,%u,%u\n", rgblight_config.hue, rgblight_config.sat, rgblight_config.val); } } -- cgit v1.2.3-70-g09d2 From 3755ef5ddbdad9f25a53fee951c3eb78035b52c3 Mon Sep 17 00:00:00 2001 From: IBNobody Date: Wed, 13 Apr 2016 20:57:51 -0500 Subject: Compiler Warnings / Atomic TLC Corrected compiler warnings for a number of issues. Gave Atomic some TLC. --- keyboard/atomic/Makefile | 4 +- keyboard/atomic/atomic.h | 3 ++ keyboard/atomic/backlight.c | 2 + keyboard/atomic/config.h | 95 ++++++++++++++++++++++++++++++++----- keyboard/atomic/keymaps/default.c | 26 +++++----- keyboard/atomic/keymaps/pc_atomic.c | 3 +- quantum/keymap_common.c | 6 ++- quantum/keymap_common.h | 2 - quantum/keymap_midi.h | 2 +- tmk_core/common/action_code.h | 2 +- tmk_core/common/keymap.c | 3 +- 11 files changed, 113 insertions(+), 35 deletions(-) (limited to 'quantum') diff --git a/keyboard/atomic/Makefile b/keyboard/atomic/Makefile index 17baeaf53..2b017446d 100644 --- a/keyboard/atomic/Makefile +++ b/keyboard/atomic/Makefile @@ -120,13 +120,13 @@ EXTRAKEY_ENABLE = yes # Audio control and System control(+450) CONSOLE_ENABLE = yes # Console for debug(+400) COMMAND_ENABLE = yes # Commands for debug and configuration #NKRO_ENABLE = yes # USB Nkey Rollover - not yet supported in LUFA -#BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality +BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality #MIDI_ENABLE = yes # MIDI controls #UNICODE_ENABLE = yes # Unicode #BLUETOOTH_ENABLE = yes # Enable Bluetooth with the Adafruit EZ-Key HID # 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 # Optimize size but this may cause error "relocation truncated to fit" #EXTRALDFLAGS = -Wl,--relax diff --git a/keyboard/atomic/atomic.h b/keyboard/atomic/atomic.h index d8574efa9..d5461e424 100644 --- a/keyboard/atomic/atomic.h +++ b/keyboard/atomic/atomic.h @@ -26,5 +26,8 @@ void matrix_init_user(void); void matrix_scan_user(void); +void process_action_user(keyrecord_t *record); +void led_set_user(uint8_t usb_led); +void backlight_init_ports(void); #endif \ No newline at end of file diff --git a/keyboard/atomic/backlight.c b/keyboard/atomic/backlight.c index f69364b2a..647b57e71 100644 --- a/keyboard/atomic/backlight.c +++ b/keyboard/atomic/backlight.c @@ -1,6 +1,8 @@ #include #include "backlight.h" +#include "atomic.h" + #define CHANNEL OCR1C diff --git a/keyboard/atomic/config.h b/keyboard/atomic/config.h index 11c0e848e..f30a9e6cc 100644 --- a/keyboard/atomic/config.h +++ b/keyboard/atomic/config.h @@ -32,36 +32,109 @@ along with this program. If not, see . #define MATRIX_ROWS 5 #define MATRIX_COLS 15 -// Planck PCB default pin-out -// Change this to how you wired your keyboard -// COLS: Left to right, ROWS: Top to bottom +/* + * Keyboard Matrix Assignments + * + * Change this to how you wired your keyboard + * COLS: AVR pins used for columns, left to right + * ROWS: AVR pins used for rows, top to bottom + * DIODE_DIRECTION: COL2ROW = COL = Anode (+), ROW = Cathode (-, marked on diode) + * ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode) + * +*/ #define COLS (int []){ F1, F0, B0, C7, F4, F5, F6, F7, D4, D6, B4, D7, D3, D2, D1 } #define ROWS (int []){ D0, D5, B5, B6, C6 } /* COL2ROW or ROW2COL */ #define DIODE_DIRECTION COL2ROW -/* define if matrix has ghost */ +/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ +#define DEBOUNCE 5 + +/* define if matrix has ghost (lacks anti-ghosting diodes) */ //#define MATRIX_HAS_GHOST /* number of backlight levels */ -/* NOTE: this is the max value of 0..BACKLIGHT_LEVELS so really 16 levels. */ #define BACKLIGHT_LEVELS 3 -/* Set 0 if debouncing isn't needed */ -#define DEBOUNCE 5 - /* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */ #define LOCKING_SUPPORT_ENABLE /* Locking resynchronize hack */ #define LOCKING_RESYNC_ENABLE -/* key combination for command */ +/* + * Force NKRO + * + * Force NKRO (nKey Rollover) to be enabled by default, regardless of the saved + * state in the bootmagic EEPROM settings. (Note that NKRO must be enabled in the + * makefile for this to work.) + * + * If forced on, NKRO can be disabled via magic key (default = LShift+RShift+N) + * until the next keyboard reset. + * + * NKRO may prevent your keystrokes from being detected in the BIOS, but it is + * fully operational during normal computer usage. + * + * For a less heavy-handed approach, enable NKRO via magic key (LShift+RShift+N) + * or via bootmagic (hold SPACE+N while plugging in the keyboard). Once set by + * bootmagic, NKRO mode will always be enabled until it is toggled again during a + * power-up. + * + */ +//#define FORCE_NKRO + +/* + * Magic Key Options + * + * Magic keys are hotkey commands that allow control over firmware functions of + * the keyboard. They are best used in combination with the HID Listen program, + * found here: https://www.pjrc.com/teensy/hid_listen.html + * + * The options below allow the magic key functionality to be changed. This is + * useful if your keyboard/keypad is missing keys and you want magic key support. + * + */ + +/* key combination for magic key command */ #define IS_COMMAND() ( \ keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ ) - +/* control how magic key switches layers */ +//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS true +//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS true +//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM false + +/* override magic key keymap */ +//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS +//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS +//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM +//#define MAGIC_KEY_HELP1 H +//#define MAGIC_KEY_HELP2 SLASH +//#define MAGIC_KEY_DEBUG D +//#define MAGIC_KEY_DEBUG_MATRIX X +//#define MAGIC_KEY_DEBUG_KBD K +//#define MAGIC_KEY_DEBUG_MOUSE M +//#define MAGIC_KEY_VERSION V +//#define MAGIC_KEY_STATUS S +//#define MAGIC_KEY_CONSOLE C +//#define MAGIC_KEY_LAYER0_ALT1 ESC +//#define MAGIC_KEY_LAYER0_ALT2 GRAVE +//#define MAGIC_KEY_LAYER0 0 +//#define MAGIC_KEY_LAYER1 1 +//#define MAGIC_KEY_LAYER2 2 +//#define MAGIC_KEY_LAYER3 3 +//#define MAGIC_KEY_LAYER4 4 +//#define MAGIC_KEY_LAYER5 5 +//#define MAGIC_KEY_LAYER6 6 +//#define MAGIC_KEY_LAYER7 7 +//#define MAGIC_KEY_LAYER8 8 +//#define MAGIC_KEY_LAYER9 9 +//#define MAGIC_KEY_BOOTLOADER PAUSE +//#define MAGIC_KEY_LOCK CAPS +//#define MAGIC_KEY_EEPROM E +//#define MAGIC_KEY_NKRO N +//#define MAGIC_KEY_SLEEP_LED Z /* * Feature disable options @@ -81,6 +154,4 @@ along with this program. If not, see . //#define NO_ACTION_MACRO //#define NO_ACTION_FUNCTION -#define MAGIC_KEY_BOOTLOADER B - #endif diff --git a/keyboard/atomic/keymaps/default.c b/keyboard/atomic/keymaps/default.c index 4ed8a71f1..0ede363a1 100644 --- a/keyboard/atomic/keymaps/default.c +++ b/keyboard/atomic/keymaps/default.c @@ -11,7 +11,7 @@ #define _DV 2 #define _LW 3 #define _RS 4 -#define _FN 4 +#define _FN 5 /* ROW 1 OPTIONS * .--------------------------------------------------------------------------------------------------------------------------------------. @@ -148,11 +148,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * .---------------------------------------------------------------------------------------------------------------------- 2u ------------. * | | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | XXXXXX . | * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------| - * | | | | | | | | | | | | | | | INS | + * | | ! | @ | # | $ | % | ^ | & | * | ( | ) | | | | INS | * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+- 2u ------------+--------| - * | | | | | | | | | | | | | XXXXXX . | | + * | | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | { | } | | | XXXXXX . | | * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+- 2u ---------------------+--------| - * | | | | | | | | | | | | XXXXXX . | | | + * | | F7 | F8 | F9 | F10 | F11 | F12 | | | | | XXXXXX . | | | * |--------+--------+--------+--------+--------+- 2u ------------+--------+--------+--------+--------+-----------------+--------+--------| * | | | | | | XXXXXX . | | | | | | | | | * '--------------------------------------------------------------------------------------------------------------------------------------' @@ -160,9 +160,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_LW] = { /* LOWERED */ { _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, ___T___, ___T___ }, - { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_INS }, - { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, ___T___, ___T___, _______ }, - { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, ___T___, ___T___, _______, _______ }, + { _______, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, _______, _______, _______, KC_INS }, + { _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, ___T___, ___T___, _______ }, + { _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, _______, _______, ___T___, ___T___, _______, _______ }, { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ }, }, @@ -170,11 +170,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * .---------------------------------------------------------------------------------------------------------------------- 2u ------------. * | | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | XXXXXX . | * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------| - * | | | | | | | | | | | | | | | INS | + * | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | | | | INS | * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+- 2u ------------+--------| - * | | | | | | | | | | | | | XXXXXX . | | + * | | F1 | F2 | F3 | F4 | F5 | F6 | - | = | [ | ] | \ | XXXXXX . | | * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+- 2u ---------------------+--------| - * | | | | | | | | | | | | XXXXXX . | | | + * | | F7 | F8 | F9 | F10 | F11 | F12 | | | | | XXXXXX . | | | * |--------+--------+--------+--------+--------+- 2u ------------+--------+--------+--------+--------+-----------------+--------+--------| * | | | | | | XXXXXX . | | | | | | | | | * '--------------------------------------------------------------------------------------------------------------------------------------' @@ -182,9 +182,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_RS] = { /* RAISED */ { _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, ___T___, ___T___ }, - { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_INS }, - { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, ___T___, ___T___, _______ }, - { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, ___T___, ___T___, _______, _______ }, + { _______, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, _______, _______, _______, KC_INS }, + { _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, ___T___, ___T___, _______ }, + { _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, _______, _______, ___T___, ___T___, _______, _______ }, { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ }, }, diff --git a/keyboard/atomic/keymaps/pc_atomic.c b/keyboard/atomic/keymaps/pc_atomic.c index 1c0425a76..bdf575046 100644 --- a/keyboard/atomic/keymaps/pc_atomic.c +++ b/keyboard/atomic/keymaps/pc_atomic.c @@ -6,6 +6,7 @@ #define _FN 3 #define _______ KC_TRNS +#define ___T___ KC_TRNS #define XXXXXXX KC_NO /* @@ -48,7 +49,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { { KC_NLCK, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, ___T___, ___T___ }, { KC_SLCK, KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_F21, KC_F22, KC_F23, KC_F24, KC_PAUS, KC_PSCR }, { KC_CAPS, KC_BTN5, KC_BTN4, KC_BTN3, KC_BTN2, KC_ACL0, KC_ACL2, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY, _______, ___T___, ___T___, KC_WH_U }, - { _______, _______, _______, DF(_CM), DF(_DV), _______, _______, _______, _______, _______, _______, ___T___, ___T___, KC_MS_U, KC_WH_D }, + { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, ___T___, ___T___, KC_MS_U, KC_WH_D }, { _______, _______, _______, _______, _______, KC_BTN1, KC_BTN1, _______, _______, _______, _______, _______, KC_MS_L, KC_MS_D, KC_MS_R }, }, }; diff --git a/quantum/keymap_common.c b/quantum/keymap_common.c index 2eef4f15a..ae6cddb34 100644 --- a/quantum/keymap_common.c +++ b/quantum/keymap_common.c @@ -87,6 +87,7 @@ action_t action_for_key(uint8_t layer, keypos_t key) return action; #endif } else if (keycode == RESET) { // RESET is 0x5000, which is why this is here + action_t action; clear_keyboard(); #ifdef AUDIO_ENABLE play_notes(&goodbye, 5, false); @@ -96,12 +97,13 @@ action_t action_for_key(uint8_t layer, keypos_t key) *(uint16_t *)0x0800 = 0x7777; // these two are a-star-specific #endif bootloader_jump(); - return; + return action; } else if (keycode == DEBUG) { // DEBUG is 0x5001 // TODO: Does this actually work? + action_t action; print("\nDEBUG: enabled.\n"); debug_enable = true; - return; + return action; } else if (keycode >= 0x5000 && keycode < 0x6000) { // Layer movement shortcuts // See .h to see constraints/usage diff --git a/quantum/keymap_common.h b/quantum/keymap_common.h index 3db40772e..4a877d2a7 100644 --- a/quantum/keymap_common.h +++ b/quantum/keymap_common.h @@ -184,8 +184,6 @@ extern const uint16_t fn_actions[]; // Toggle to layer - 256 layer max #define TG(layer) (layer | 0x5400) -#define MIDI(n) (n | 0x6000) - // M-od, T-ap - 256 keycode max #define MT(mod, kc) (kc | 0x7000 | ((mod & 0xF) << 8)) #define CTL_T(kc) MT(0x1, kc) diff --git a/quantum/keymap_midi.h b/quantum/keymap_midi.h index a89420ce2..436fb2eb5 100644 --- a/quantum/keymap_midi.h +++ b/quantum/keymap_midi.h @@ -20,7 +20,7 @@ along with this program. If not, see . #include -#define MIDI 0x6000 +#define MIDI(n) (n | 0x6000) #define MIDI12 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000 #define CHNL(note, channel) (note + (channel << 8)) diff --git a/tmk_core/common/action_code.h b/tmk_core/common/action_code.h index 4fe9c1d58..2b0b0b077 100644 --- a/tmk_core/common/action_code.h +++ b/tmk_core/common/action_code.h @@ -301,7 +301,7 @@ enum backlight_opt { #define ACTION_BACKLIGHT_DECREASE() ACTION(ACT_BACKLIGHT, BACKLIGHT_DECREASE << 8) #define ACTION_BACKLIGHT_TOGGLE() ACTION(ACT_BACKLIGHT, BACKLIGHT_TOGGLE << 8) #define ACTION_BACKLIGHT_STEP() ACTION(ACT_BACKLIGHT, BACKLIGHT_STEP << 8) -#define ACTION_BACKLIGHT_LEVEL(level) ACTION(ACT_BACKLIGHT, BACKLIGHT_LEVEL << 8 | level) +#define ACTION_BACKLIGHT_LEVEL(level) ACTION(ACT_BACKLIGHT, BACKLIGHT_LEVEL << 8 | (level)) /* Command */ #define ACTION_COMMAND(id, opt) ACTION(ACT_COMMAND, (opt)<<8 | (addr)) /* Function */ diff --git a/tmk_core/common/keymap.c b/tmk_core/common/keymap.c index 11f4aa8aa..8955fc710 100644 --- a/tmk_core/common/keymap.c +++ b/tmk_core/common/keymap.c @@ -22,7 +22,7 @@ along with this program. If not, see . #include "action_macro.h" #include "wait.h" #include "debug.h" - +#include "bootloader.h" static action_t keycode_to_action(uint8_t keycode); @@ -143,6 +143,7 @@ static action_t keycode_to_action(uint8_t keycode) action.code = ACTION_TRANSPARENT; break; case KC_BOOTLOADER: + action.code = ACTION_NO; clear_keyboard(); wait_ms(50); bootloader_jump(); // not return -- cgit v1.2.3-70-g09d2 From 2900b4884598b06ed59371c48ecea9d3f0bff5ac Mon Sep 17 00:00:00 2001 From: IBNobody Date: Wed, 13 Apr 2016 22:04:44 -0500 Subject: Added parenthesis to midi macro. --- quantum/keymap_midi.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'quantum') diff --git a/quantum/keymap_midi.h b/quantum/keymap_midi.h index 436fb2eb5..795f26380 100644 --- a/quantum/keymap_midi.h +++ b/quantum/keymap_midi.h @@ -20,7 +20,7 @@ along with this program. If not, see . #include -#define MIDI(n) (n | 0x6000) +#define MIDI(n) ((n) | 0x6000) #define MIDI12 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000 #define CHNL(note, channel) (note + (channel << 8)) -- cgit v1.2.3-70-g09d2 From 63462bf8c12cea1c13ca1bd1f105fe53f556806e Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Thu, 14 Apr 2016 20:42:14 -0400 Subject: changing up the makefile a bit --- keyboard/planck/Makefile | 56 +++++++++++++++++------------ keyboard/planck/keymaps/default/keymap.c | 49 +++++++++++++++---------- keyboard/planck/keymaps/default/makefile.mk | 1 + quantum/quantum.mk | 8 ++--- tmk_core/common.mk | 26 +++++++------- tmk_core/protocol/lufa.mk | 4 +-- 6 files changed, 84 insertions(+), 60 deletions(-) create mode 100644 keyboard/planck/keymaps/default/makefile.mk (limited to 'quantum') diff --git a/keyboard/planck/Makefile b/keyboard/planck/Makefile index ee1c60fed..dc6e46df2 100644 --- a/keyboard/planck/Makefile +++ b/keyboard/planck/Makefile @@ -38,6 +38,27 @@ # To rebuild project do "make clean" then "make all". #---------------------------------------------------------------------------- +# Build Options +# change to "no" to disable the options, or define them in the makefile.mk in +# the appropriate keymap folder that will get included automatically +# +BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = yes # Console for debug(+400) +COMMAND_ENABLE = yes # Commands for debug and configuration +NKRO_ENABLE = no # USB Nkey Rollover - if this doesn't work, see here: + # https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality +MIDI_ENABLE = no # MIDI controls +AUDIO_ENABLE = no # Audio output on port C6 +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. + +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend + # Target file name (without extension). TARGET = planck @@ -62,17 +83,28 @@ ifneq ("$(wildcard keymaps/$(KEYMAP).c)","") else ifneq ("$(wildcard keymaps/$(KEYMAP)/keymap.c)","") KEYMAP_FILE = keymaps/$(KEYMAP)/keymap.c +ifneq ("$(wildcard keymaps/$(KEYMAP)/makefile.mk)","") + include keymaps/$(KEYMAP)/makefile.mk +endif else $(error Keymap file does not exist) +endif endif -endif + else + ifneq ("$(wildcard keymaps/default.c)","") KEYMAP_FILE = keymaps/default.c else KEYMAP_FILE = keymaps/default/keymap.c endif + +ifneq ("$(wildcard keymaps/default/makefile.mk)","") + include keymaps/default/makefile.mk endif + +endif + SRC := $(KEYMAP_FILE) $(SRC) CONFIG_H = config.h @@ -127,27 +159,7 @@ OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT OPT_DEFS += -DBOOTLOADER_SIZE=4096 -# Build Options -# comment out to disable the options. -# -BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000) -MOUSEKEY_ENABLE = yes # Mouse keys(+4700) -EXTRAKEY_ENABLE = yes # Audio control and System control(+450) -CONSOLE_ENABLE = yes # Console for debug(+400) -COMMAND_ENABLE = yes # Commands for debug and configuration -# NKRO_ENABLE = yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work -BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality -# MIDI_ENABLE = yes # MIDI controls -AUDIO_ENABLE = yes # Audio output on port C6 -# UNICODE_ENABLE = yes # Unicode -# BLUETOOTH_ENABLE = ye # Enable Bluetooth with the Adafruit EZ-Key HID -# RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. - -# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE -#SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend - - -ifdef BACKLIGHT_ENABLE +ifeq ($(BACKLIGHT_ENABLE), yes) SRC += backlight.c endif diff --git a/keyboard/planck/keymaps/default/keymap.c b/keyboard/planck/keymaps/default/keymap.c index e06567339..97ba5d285 100644 --- a/keyboard/planck/keymaps/default/keymap.c +++ b/keyboard/planck/keymaps/default/keymap.c @@ -89,38 +89,38 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { {M(M_BL), KC_LCTL, KC_LALT, KC_LGUI, M(M_LW), KC_SPC, KC_SPC, M(M_RS), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} }, -/* Raise +/* Lower * ,-----------------------------------------------------------------------------------. - * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp | + * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Bksp | * |------+------+------+------+------+-------------+------+------+------+------+------| - * | Del | F1 | F2 | F3 | F4 | F5 | F6 | - | = | [ | ] | \ | + * | Del | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | { | } | | | * |------+------+------+------+------+------|------+------+------+------+------+------| * | | F7 | F8 | F9 | F10 | F11 | F12 | | | | |Enter | * |------+------+------+------+------+------+------+------+------+------+------+------| * | | | | | | | | Next | Vol- | Vol+ | Play | * `-----------------------------------------------------------------------------------' */ -[_RS] = { - {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC}, - {KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS}, +[_LW] = { + {KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC}, + {KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE}, {_______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, _______, _______, _______}, {_______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY} }, -/* Lower +/* Raise * ,-----------------------------------------------------------------------------------. - * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Bksp | + * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp | * |------+------+------+------+------+-------------+------+------+------+------+------| - * | Del | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | { | } | | | + * | Del | F1 | F2 | F3 | F4 | F5 | F6 | - | = | [ | ] | \ | * |------+------+------+------+------+------|------+------+------+------+------+------| * | | F7 | F8 | F9 | F10 | F11 | F12 | | | | |Enter | * |------+------+------+------+------+------+------+------+------+------+------+------| * | | | | | | | | Next | Vol- | Vol+ | Play | * `-----------------------------------------------------------------------------------' */ -[_LW] = { - {KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC}, - {KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE}, +[_RS] = { + {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC}, + {KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS}, {_______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, _______, _______, _______}, {_______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY} }, @@ -148,17 +148,18 @@ const uint16_t PROGMEM fn_actions[] = { }; +#ifdef AUDIO_ENABLE float tone_qw[][2] = { {440.0*pow(2.0,(67)/12.0), 400}, {440.0*pow(2.0,(60)/12.0), 400}, - {0, 400}, + {0, 800}, {440.0*pow(2.0,(67)/12.0), 1600} }; float tone_cm[][2] = { {440.0*pow(2.0,(67)/12.0), 400}, {440.0*pow(2.0,(60)/12.0), 400}, - {0, 400}, + {0, 800}, {440.0*pow(2.0,(67)/12.0), 1000}, {0, 200}, {440.0*pow(2.0,(67)/12.0), 1000} @@ -167,14 +168,14 @@ float tone_cm[][2] = { float tone_dv[][2] = { {440.0*pow(2.0,(67)/12.0), 400}, {440.0*pow(2.0,(60)/12.0), 400}, - {0, 400}, + {0, 800}, {440.0*pow(2.0,(67)/12.0), 800}, {0, 200}, {440.0*pow(2.0,(67)/12.0), 800}, {0, 200}, {440.0*pow(2.0,(67)/12.0), 800} }; - +#endif #define IS_LAYER_ON(layer) ((layer_state) & (1<<(layer))) #define IS_LAYER_OFF(layer) ((!layer_state) & (1<<(layer))) @@ -192,19 +193,25 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) switch(id) { case M_QW: if (record->event.pressed) { - play_notes(&tone_qw, 4, false); + #ifdef AUDIO_ENABLE + play_notes(&tone_qw, 4, false); + #endif default_layer_set(1UL<<_QW); } break; case M_CM: if (record->event.pressed) { - play_notes(&tone_cm, 6, false); + #ifdef AUDIO_ENABLE + play_notes(&tone_cm, 6, false); + #endif default_layer_set(1UL<<_CM); } break; case M_DV: if (record->event.pressed) { - play_notes(&tone_dv, 8, false); + #ifdef AUDIO_ENABLE + play_notes(&tone_dv, 8, false); + #endif default_layer_set(1UL<<_DV); } break; @@ -240,6 +247,7 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) return MACRO_NONE; }; +#ifdef AUDIO_ENABLE float start_up[][2] = { {440.0*pow(2.0,(67)/12.0), 650}, {440.0*pow(2.0,(64)/12.0), 450}, @@ -247,8 +255,11 @@ float start_up[][2] = { {440.0*pow(2.0,(60)/12.0), 450}, {440.0*pow(2.0,(64)/12.0), 1000} }; +#endif void matrix_init_user(void) { + #ifdef AUDIO_ENABLE init_notes(); play_notes(&start_up, 5, false); + #endif } diff --git a/keyboard/planck/keymaps/default/makefile.mk b/keyboard/planck/keymaps/default/makefile.mk new file mode 100644 index 000000000..628167ff6 --- /dev/null +++ b/keyboard/planck/keymaps/default/makefile.mk @@ -0,0 +1 @@ +AUDIO_ENABLE = yes \ No newline at end of file diff --git a/quantum/quantum.mk b/quantum/quantum.mk index de93af7e8..3069f582c 100644 --- a/quantum/quantum.mk +++ b/quantum/quantum.mk @@ -23,19 +23,19 @@ ifndef CUSTOM_MATRIX SRC += $(QUANTUM_DIR)/matrix.c endif -ifdef MIDI_ENABLE +ifeq ($(MIDI_ENABLE), yes) SRC += $(QUANTUM_DIR)/keymap_midi.c endif -ifdef AUDIO_ENABLE +ifeq ($(AUDIO_ENABLE), yes) SRC += $(QUANTUM_DIR)/audio.c endif -ifdef UNICODE_ENABLE +ifeq ($(UNICODE_ENABLE), yes) SRC += $(QUANTUM_DIR)/keymap_unicode.c endif -ifdef RGBLIGHT_ENABLE +ifeq ($(RGBLIGHT_ENABLE), yes) SRC += $(QUANTUM_DIR)/light_ws2812.c SRC += $(QUANTUM_DIR)/rgblight.c OPT_DEFS += -DRGBLIGHT_ENABLE diff --git a/tmk_core/common.mk b/tmk_core/common.mk index 89c366f55..8d028d52a 100644 --- a/tmk_core/common.mk +++ b/tmk_core/common.mk @@ -17,66 +17,66 @@ SRC += $(COMMON_DIR)/host.c \ # Option modules -ifdef BOOTMAGIC_ENABLE +ifeq ($(BOOTMAGIC_ENABLE), yes) SRC += $(COMMON_DIR)/bootmagic.c SRC += $(COMMON_DIR)/avr/eeconfig.c OPT_DEFS += -DBOOTMAGIC_ENABLE endif -ifdef MOUSEKEY_ENABLE +ifeq ($(MOUSEKEY_ENABLE), yes) SRC += $(COMMON_DIR)/mousekey.c OPT_DEFS += -DMOUSEKEY_ENABLE OPT_DEFS += -DMOUSE_ENABLE endif -ifdef EXTRAKEY_ENABLE +ifeq ($(EXTRAKEY_ENABLE), yes) OPT_DEFS += -DEXTRAKEY_ENABLE endif -ifdef CONSOLE_ENABLE +ifeq ($(CONSOLE_ENABLE), yes) OPT_DEFS += -DCONSOLE_ENABLE else OPT_DEFS += -DNO_PRINT OPT_DEFS += -DNO_DEBUG endif -ifdef COMMAND_ENABLE +ifeq ($(COMMAND_ENABLE), yes) SRC += $(COMMON_DIR)/command.c OPT_DEFS += -DCOMMAND_ENABLE endif -ifdef NKRO_ENABLE +ifeq ($(NKRO_ENABLE), yes) OPT_DEFS += -DNKRO_ENABLE endif -ifdef MIDI_ENABLE +ifeq ($(MIDI_ENABLE), yes) OPT_DEFS += -DMIDI_ENABLE endif -ifdef AUDIO_ENABLE +ifeq ($(AUDIO_ENABLE), yes) OPT_DEFS += -DAUDIO_ENABLE endif -ifdef USB_6KRO_ENABLE +ifeq ($(USB_6KRO_ENABLE), yes) OPT_DEFS += -DUSB_6KRO_ENABLE endif -ifdef SLEEP_LED_ENABLE +ifeq ($(SLEEP_LED_ENABLE), yes) SRC += $(COMMON_DIR)/sleep_led.c OPT_DEFS += -DSLEEP_LED_ENABLE OPT_DEFS += -DNO_SUSPEND_POWER_DOWN endif -ifdef BACKLIGHT_ENABLE +ifeq ($(BACKLIGHT_ENABLE), yes) SRC += $(COMMON_DIR)/backlight.c OPT_DEFS += -DBACKLIGHT_ENABLE endif -ifdef BLUETOOTH_ENABLE +ifeq ($(BLUETOOTH_ENABLE), yes) OPT_DEFS += -DBLUETOOTH_ENABLE endif -ifdef KEYMAP_SECTION_ENABLE +ifeq ($(KEYMAP_SECTION_ENABLE), yes) OPT_DEFS += -DKEYMAP_SECTION_ENABLE ifeq ($(strip $(MCU)),atmega32u2) diff --git a/tmk_core/protocol/lufa.mk b/tmk_core/protocol/lufa.mk index 4905760bb..f3209c227 100644 --- a/tmk_core/protocol/lufa.mk +++ b/tmk_core/protocol/lufa.mk @@ -17,7 +17,7 @@ LUFA_SRC = $(LUFA_DIR)/lufa.c \ $(LUFA_DIR)/descriptor.c \ $(LUFA_SRC_USB) -ifdef MIDI_ENABLE +ifeq ($(MIDI_ENABLE), yes) LUFA_SRC += $(LUFA_DIR)/midi/midi.c \ $(LUFA_DIR)/midi/midi_device.c \ $(LUFA_DIR)/midi/bytequeue/bytequeue.c \ @@ -25,7 +25,7 @@ ifdef MIDI_ENABLE $(LUFA_SRC_USBCLASS) endif -ifdef BLUETOOTH_ENABLE +ifeq ($(BLUETOOTH_ENABLE), yes) LUFA_SRC += $(LUFA_DIR)/bluetooth.c \ $(TMK_DIR)/protocol/serial_uart.c endif -- cgit v1.2.3-70-g09d2 From bb0836c62016f482f517771a9f5a8dbc68bd0a1c Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Fri, 15 Apr 2016 00:26:22 -0400 Subject: the spacessss --- keyboard/planck/Makefile | 66 +++++++++++++++++------------ keyboard/planck/keymaps/default/makefile.mk | 3 +- quantum/quantum.mk | 8 ++-- tmk_core/common.mk | 26 ++++++------ tmk_core/protocol/lufa.mk | 4 +- 5 files changed, 60 insertions(+), 47 deletions(-) (limited to 'quantum') diff --git a/keyboard/planck/Makefile b/keyboard/planck/Makefile index 693e9c8aa..8d4e7787a 100644 --- a/keyboard/planck/Makefile +++ b/keyboard/planck/Makefile @@ -38,31 +38,9 @@ # To rebuild project do "make clean" then "make all". #---------------------------------------------------------------------------- -# Build Options -# change to "no" to disable the options, or define them in the makefile.mk in -# the appropriate keymap folder that will get included automatically -# -BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000) -MOUSEKEY_ENABLE = yes # Mouse keys(+4700) -EXTRAKEY_ENABLE = yes # Audio control and System control(+450) -CONSOLE_ENABLE = yes # Console for debug(+400) -COMMAND_ENABLE = yes # Commands for debug and configuration -NKRO_ENABLE = no # USB Nkey Rollover - if this doesn't work, see here: - # https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work -BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality -MIDI_ENABLE = no # MIDI controls -AUDIO_ENABLE = no # Audio output on port C6 -UNICODE_ENABLE = no # Unicode -BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. - -# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE -SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend - # Target file name (without extension). TARGET = planck - # Directory common source filess exist TOP_DIR = ../.. TMK_DIR = ../../tmk_core @@ -107,10 +85,6 @@ endif SRC := $(KEYMAP_FILE) $(SRC) -ifeq ($(BACKLIGHT_ENABLE), yes) - SRC := backlight.c $(SRC) -endif - CONFIG_H = config.h # MCU name @@ -161,6 +135,46 @@ OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT # USBaspLoader 2048 OPT_DEFS += -DBOOTLOADER_SIZE=4096 +# Build Options +# change to "no" to disable the options, or define them in the makefile.mk in +# the appropriate keymap folder that will get included automatically +# +BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = yes # Console for debug(+400) +COMMAND_ENABLE = yes # Commands for debug and configuration +NKRO_ENABLE = no # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality +MIDI_ENABLE = no # MIDI controls +AUDIO_ENABLE = no # Audio output on port C6 +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. + +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend + +ifdef KEYMAP + +ifeq ("$(wildcard keymaps/$(KEYMAP).c)","") +ifneq ("$(wildcard keymaps/$(KEYMAP)/makefile.mk)","") + include keymaps/$(KEYMAP)/makefile.mk +endif +endif + +else + +ifneq ("$(wildcard keymaps/default/makefile.mk)","") + include keymaps/default/makefile.mk +endif + +endif + +ifeq ($(strip $(BACKLIGHT_ENABLE)), yes) + SRC := backlight.c $(SRC) +endif + # Optimize size but this may cause error "relocation truncated to fit" #EXTRALDFLAGS = -Wl,--relax diff --git a/keyboard/planck/keymaps/default/makefile.mk b/keyboard/planck/keymaps/default/makefile.mk index e1c5bd2e8..8cbec4a1f 100644 --- a/keyboard/planck/keymaps/default/makefile.mk +++ b/keyboard/planck/keymaps/default/makefile.mk @@ -1,2 +1 @@ -AUDIO_ENABLE = yes -BACKLIGHT_ENABLE = yes \ No newline at end of file +AUDIO_ENABLE = yes \ No newline at end of file diff --git a/quantum/quantum.mk b/quantum/quantum.mk index 3069f582c..17bb50171 100644 --- a/quantum/quantum.mk +++ b/quantum/quantum.mk @@ -23,19 +23,19 @@ ifndef CUSTOM_MATRIX SRC += $(QUANTUM_DIR)/matrix.c endif -ifeq ($(MIDI_ENABLE), yes) +ifeq ($(strip $(MIDI_ENABLE)), yes) SRC += $(QUANTUM_DIR)/keymap_midi.c endif -ifeq ($(AUDIO_ENABLE), yes) +ifeq ($(strip $(AUDIO_ENABLE)), yes) SRC += $(QUANTUM_DIR)/audio.c endif -ifeq ($(UNICODE_ENABLE), yes) +ifeq ($(strip $(UNICODE_ENABLE)), yes) SRC += $(QUANTUM_DIR)/keymap_unicode.c endif -ifeq ($(RGBLIGHT_ENABLE), yes) +ifeq ($(strip $(RGBLIGHT_ENABLE)), yes) SRC += $(QUANTUM_DIR)/light_ws2812.c SRC += $(QUANTUM_DIR)/rgblight.c OPT_DEFS += -DRGBLIGHT_ENABLE diff --git a/tmk_core/common.mk b/tmk_core/common.mk index 030767cc3..f8006c670 100644 --- a/tmk_core/common.mk +++ b/tmk_core/common.mk @@ -17,67 +17,67 @@ SRC += $(COMMON_DIR)/host.c \ # Option modules -ifeq ($(BOOTMAGIC_ENABLE), yes) +ifeq ($(strip $(BOOTMAGIC_ENABLE)), yes) SRC += $(COMMON_DIR)/bootmagic.c SRC += $(COMMON_DIR)/avr/eeconfig.c OPT_DEFS += -DBOOTMAGIC_ENABLE endif -ifeq ($(MOUSEKEY_ENABLE), yes) +ifeq ($(strip $(MOUSEKEY_ENABLE)), yes) SRC += $(COMMON_DIR)/mousekey.c OPT_DEFS += -DMOUSEKEY_ENABLE OPT_DEFS += -DMOUSE_ENABLE endif -ifeq ($(EXTRAKEY_ENABLE), yes) +ifeq ($(strip $(EXTRAKEY_ENABLE)), yes) OPT_DEFS += -DEXTRAKEY_ENABLE endif -ifeq ($(CONSOLE_ENABLE), yes) +ifeq ($(strip $(CONSOLE_ENABLE)), yes) OPT_DEFS += -DCONSOLE_ENABLE else OPT_DEFS += -DNO_PRINT OPT_DEFS += -DNO_DEBUG endif -ifeq ($(COMMAND_ENABLE), yes) +ifeq ($(strip $(COMMAND_ENABLE)), yes) SRC += $(COMMON_DIR)/command.c OPT_DEFS += -DCOMMAND_ENABLE endif -ifeq ($(NKRO_ENABLE), yes) +ifeq ($(strip $(NKRO_ENABLE)), yes) OPT_DEFS += -DNKRO_ENABLE endif -ifeq ($(MIDI_ENABLE), yes) +ifeq ($(strip $(MIDI_ENABLE)), yes) OPT_DEFS += -DMIDI_ENABLE endif -ifeq ($(AUDIO_ENABLE), yes) +ifeq ($(strip $(AUDIO_ENABLE)), yes) OPT_DEFS += -DAUDIO_ENABLE endif -ifeq ($(USB_6KRO_ENABLE), yes) +ifeq ($(strip $(USB_6KRO_ENABLE)), yes) OPT_DEFS += -DUSB_6KRO_ENABLE endif -ifeq ($(SLEEP_LED_ENABLE), yes) +ifeq ($(strip $(SLEEP_LED_ENABLE)), yes) SRC += $(COMMON_DIR)/sleep_led.c OPT_DEFS += -DSLEEP_LED_ENABLE OPT_DEFS += -DNO_SUSPEND_POWER_DOWN endif -ifeq ($(BACKLIGHT_ENABLE), yes) +ifeq ($(strip $(BACKLIGHT_ENABLE)), yes) SRC += $(COMMON_DIR)/backlight.c SRC += $(COMMON_DIR)/avr/eeconfig.c OPT_DEFS += -DBACKLIGHT_ENABLE endif -ifeq ($(BLUETOOTH_ENABLE), yes) +ifeq ($(strip $(BLUETOOTH_ENABLE)), yes) OPT_DEFS += -DBLUETOOTH_ENABLE endif -ifeq ($(KEYMAP_SECTION_ENABLE), yes) +ifeq ($(strip $(KEYMAP_SECTION_ENABLE)), yes) OPT_DEFS += -DKEYMAP_SECTION_ENABLE ifeq ($(strip $(MCU)),atmega32u2) diff --git a/tmk_core/protocol/lufa.mk b/tmk_core/protocol/lufa.mk index f3209c227..9ac6298f1 100644 --- a/tmk_core/protocol/lufa.mk +++ b/tmk_core/protocol/lufa.mk @@ -17,7 +17,7 @@ LUFA_SRC = $(LUFA_DIR)/lufa.c \ $(LUFA_DIR)/descriptor.c \ $(LUFA_SRC_USB) -ifeq ($(MIDI_ENABLE), yes) +ifeq ($(strip $(MIDI_ENABLE)), yes) LUFA_SRC += $(LUFA_DIR)/midi/midi.c \ $(LUFA_DIR)/midi/midi_device.c \ $(LUFA_DIR)/midi/bytequeue/bytequeue.c \ @@ -25,7 +25,7 @@ ifeq ($(MIDI_ENABLE), yes) $(LUFA_SRC_USBCLASS) endif -ifeq ($(BLUETOOTH_ENABLE), yes) +ifeq ($(strip $(BLUETOOTH_ENABLE)), yes) LUFA_SRC += $(LUFA_DIR)/bluetooth.c \ $(TMK_DIR)/protocol/serial_uart.c endif -- cgit v1.2.3-70-g09d2 From ee2ee7f4f049dda385a9db7dddd8e7e91681315b Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Fri, 15 Apr 2016 13:44:07 -0400 Subject: audio note length fixes --- keyboard/planck/keymaps/default/keymap.c | 46 ++++++++++++++++---------------- quantum/audio.c | 7 ++++- quantum/keymap_common.c | 10 +++---- 3 files changed, 33 insertions(+), 30 deletions(-) (limited to 'quantum') diff --git a/keyboard/planck/keymaps/default/keymap.c b/keyboard/planck/keymaps/default/keymap.c index 151a6b4f4..dee2840f2 100644 --- a/keyboard/planck/keymaps/default/keymap.c +++ b/keyboard/planck/keymaps/default/keymap.c @@ -147,30 +147,30 @@ const uint16_t PROGMEM fn_actions[] = { #ifdef AUDIO_ENABLE float tone_qw[][2] = { - {440.0*pow(2.0,(67)/12.0), 400}, - {440.0*pow(2.0,(60)/12.0), 400}, - {0, 800}, - {440.0*pow(2.0,(67)/12.0), 1600} + {440.0*pow(2.0,(59)/12.0), 8}, + {440.0*pow(2.0,(60)/12.0), 8}, + {0, 4}, + {440.0*pow(2.0,(67)/12.0), 16} }; float tone_cm[][2] = { - {440.0*pow(2.0,(67)/12.0), 400}, - {440.0*pow(2.0,(60)/12.0), 400}, - {0, 800}, - {440.0*pow(2.0,(67)/12.0), 1000}, - {0, 200}, - {440.0*pow(2.0,(67)/12.0), 1000} + {440.0*pow(2.0,(59)/12.0), 8}, + {440.0*pow(2.0,(60)/12.0), 8}, + {0, 4}, + {440.0*pow(2.0,(67)/12.0), 16}, + {0, 4}, + {440.0*pow(2.0,(71)/12.0), 16} }; float tone_dv[][2] = { - {440.0*pow(2.0,(67)/12.0), 400}, - {440.0*pow(2.0,(60)/12.0), 400}, - {0, 800}, - {440.0*pow(2.0,(67)/12.0), 800}, - {0, 200}, - {440.0*pow(2.0,(67)/12.0), 800}, - {0, 200}, - {440.0*pow(2.0,(67)/12.0), 800} + {440.0*pow(2.0,(59)/12.0), 8}, + {440.0*pow(2.0,(60)/12.0), 8}, + {0, 4}, + {440.0*pow(2.0,(67)/12.0), 16}, + {0, 4}, + {440.0*pow(2.0,(69)/12.0), 16}, + {0, 4}, + {440.0*pow(2.0,(67)/12.0), 16} }; #endif @@ -246,11 +246,11 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) #ifdef AUDIO_ENABLE float start_up[][2] = { - {440.0*pow(2.0,(67)/12.0), 650}, - {440.0*pow(2.0,(64)/12.0), 450}, - {440.0*pow(2.0,(55)/12.0), 450}, - {440.0*pow(2.0,(60)/12.0), 450}, - {440.0*pow(2.0,(64)/12.0), 1000} + {440.0*pow(2.0,(67)/12.0), 12}, + {440.0*pow(2.0,(64)/12.0), 8}, + {440.0*pow(2.0,(55)/12.0), 8}, + {440.0*pow(2.0,(60)/12.0), 8}, + {440.0*pow(2.0,(64)/12.0), 20} }; #endif diff --git a/quantum/audio.c b/quantum/audio.c index f29d941d7..50e5505fe 100644 --- a/quantum/audio.c +++ b/quantum/audio.c @@ -255,7 +255,12 @@ ISR(TIMER3_COMPA_vect) { note_position++; - if (note_position >= note_length) { + bool end_of_note = false; + if (ICR3 > 0) + end_of_note = (note_position >= (note_length / ICR3 * 0xFFFF)); + else + end_of_note = (note_position >= (note_length * 0x7FF)); + if (end_of_note) { current_note++; if (current_note >= notes_length) { if (notes_repeat) { diff --git a/quantum/keymap_common.c b/quantum/keymap_common.c index ae6cddb34..e3030a886 100644 --- a/quantum/keymap_common.c +++ b/quantum/keymap_common.c @@ -33,11 +33,9 @@ along with this program. If not, see . #include "audio.h" float goodbye[][2] = { - {440.0*pow(2.0,(67)/12.0), 400}, - {0, 50}, - {440.0*pow(2.0,(60)/12.0), 400}, - {0, 50}, - {440.0*pow(2.0,(55)/12.0), 600}, + {440.0*pow(2.0,(67)/12.0), 8}, + {440.0*pow(2.0,(60)/12.0), 8}, + {440.0*pow(2.0,(55)/12.0), 12}, }; #endif @@ -90,7 +88,7 @@ action_t action_for_key(uint8_t layer, keypos_t key) action_t action; clear_keyboard(); #ifdef AUDIO_ENABLE - play_notes(&goodbye, 5, false); + play_notes(&goodbye, 3, false); #endif _delay_ms(250); #ifdef ATREUS_ASTAR -- cgit v1.2.3-70-g09d2 From 8f85117aa9e060371177e3b523bc89dc7aad19e8 Mon Sep 17 00:00:00 2001 From: IBNobody Date: Fri, 15 Apr 2016 14:42:50 -0500 Subject: Added Audio to my Atomic --- keyboard/atomic/Makefile | 67 ++++++---- keyboard/atomic/keymaps/pvc/config.h | 157 ++++++++++++++++++++++ keyboard/atomic/keymaps/pvc/keymap.c | 202 ++++++++++++++++++++++++++++ keyboard/atomic/keymaps/pvc/makefile.mk | 6 +- keyboard/atomic/keymaps/pvc/pvc_atomic.c | 221 ------------------------------- keyboard/planck/Makefile | 31 +---- quantum/audio.h | 4 +- 7 files changed, 405 insertions(+), 283 deletions(-) create mode 100644 keyboard/atomic/keymaps/pvc/config.h create mode 100644 keyboard/atomic/keymaps/pvc/keymap.c delete mode 100644 keyboard/atomic/keymaps/pvc/pvc_atomic.c (limited to 'quantum') diff --git a/keyboard/atomic/Makefile b/keyboard/atomic/Makefile index 364efa3fa..1203cf6a3 100644 --- a/keyboard/atomic/Makefile +++ b/keyboard/atomic/Makefile @@ -38,31 +38,9 @@ # To rebuild project do "make clean" then "make all". #---------------------------------------------------------------------------- -# Build Options -# change to "no" to disable the options, or define them in the makefile.mk in -# the appropriate keymap folder that will get included automatically -# -BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000) -MOUSEKEY_ENABLE = yes # Mouse keys(+4700) -EXTRAKEY_ENABLE = yes # Audio control and System control(+450) -CONSOLE_ENABLE = yes # Console for debug(+400) -COMMAND_ENABLE = yes # Commands for debug and configuration -NKRO_ENABLE = no # USB Nkey Rollover - if this doesn't work, see here: - # https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work -BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality -MIDI_ENABLE = no # MIDI controls -AUDIO_ENABLE = no # Audio output on port C6 -UNICODE_ENABLE = no # Unicode -BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. - -# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE -SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend - # Target file name (without extension). TARGET = atomic - # Directory common source filess exist TOP_DIR = ../.. TMK_DIR = ../../tmk_core @@ -73,6 +51,8 @@ TARGET_DIR = . # # project specific files SRC = atomic.c +CONFIG_H = config.h + ifdef keymap KEYMAP = $(keymap) endif @@ -88,7 +68,7 @@ ifneq ("$(wildcard keymaps/$(KEYMAP)/makefile.mk)","") endif else $(error Keymap file does not exist) -endif +endif endif else @@ -107,8 +87,6 @@ endif SRC := $(KEYMAP_FILE) $(SRC) -CONFIG_H = config.h - # MCU name #MCU = at90usb1287 MCU = atmega32u4 @@ -126,7 +104,6 @@ MCU = atmega32u4 # software delays. F_CPU = 16000000 - # # LUFA specific # @@ -158,11 +135,45 @@ OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT # USBaspLoader 2048 OPT_DEFS += -DBOOTLOADER_SIZE=4096 +# Build Options +# change to "no" to disable the options, or define them in the makefile.mk in +# the appropriate keymap folder that will get included automatically +# +BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = yes # Console for debug(+400) +COMMAND_ENABLE = yes # Commands for debug and configuration +NKRO_ENABLE = no # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality +MIDI_ENABLE = no # MIDI controls +AUDIO_ENABLE = no # Audio output on port C6 +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. + +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend + +ifdef KEYMAP + +ifeq ("$(wildcard keymaps/$(KEYMAP).c)","") +ifneq ("$(wildcard keymaps/$(KEYMAP)/makefile.mk)","") + include keymaps/$(KEYMAP)/makefile.mk +endif +endif + +else + +ifneq ("$(wildcard keymaps/default/makefile.mk)","") + include keymaps/default/makefile.mk +endif -ifeq ($(BACKLIGHT_ENABLE), yes) - SRC += backlight.c endif +ifeq ($(strip $(BACKLIGHT_ENABLE)), yes) + SRC := backlight.c $(SRC) +endif # Optimize size but this may cause error "relocation truncated to fit" #EXTRALDFLAGS = -Wl,--relax diff --git a/keyboard/atomic/keymaps/pvc/config.h b/keyboard/atomic/keymaps/pvc/config.h new file mode 100644 index 000000000..8449fa06d --- /dev/null +++ b/keyboard/atomic/keymaps/pvc/config.h @@ -0,0 +1,157 @@ +/* +Copyright 2012 Jun Wako + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#ifndef CONFIG_H +#define CONFIG_H + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x6060 +#define DEVICE_VER 0x0001 +#define MANUFACTURER Ortholinear Keyboards +#define PRODUCT The Atomic Keyboard +#define DESCRIPTION A compact ortholinear keyboard + +/* key matrix size */ +#define MATRIX_ROWS 5 +#define MATRIX_COLS 15 + +/* + * Keyboard Matrix Assignments + * + * Change this to how you wired your keyboard + * COLS: AVR pins used for columns, left to right + * ROWS: AVR pins used for rows, top to bottom + * DIODE_DIRECTION: COL2ROW = COL = Anode (+), ROW = Cathode (-, marked on diode) + * ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode) + * +*/ +#define COLS (int []){ F1, F0, B0, C7, F4, F5, F6, F7, D4, D6, B4, D7, D3, D2, D1 } +#define ROWS (int []){ D0, D5, B5, B6, B3 } + +/* COL2ROW or ROW2COL */ +#define DIODE_DIRECTION COL2ROW + +/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ +#define DEBOUNCE 5 + +/* define if matrix has ghost (lacks anti-ghosting diodes) */ +//#define MATRIX_HAS_GHOST + +/* number of backlight levels */ +#define BACKLIGHT_LEVELS 3 + +/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */ +#define LOCKING_SUPPORT_ENABLE +/* Locking resynchronize hack */ +#define LOCKING_RESYNC_ENABLE + +/* + * Force NKRO + * + * Force NKRO (nKey Rollover) to be enabled by default, regardless of the saved + * state in the bootmagic EEPROM settings. (Note that NKRO must be enabled in the + * makefile for this to work.) + * + * If forced on, NKRO can be disabled via magic key (default = LShift+RShift+N) + * until the next keyboard reset. + * + * NKRO may prevent your keystrokes from being detected in the BIOS, but it is + * fully operational during normal computer usage. + * + * For a less heavy-handed approach, enable NKRO via magic key (LShift+RShift+N) + * or via bootmagic (hold SPACE+N while plugging in the keyboard). Once set by + * bootmagic, NKRO mode will always be enabled until it is toggled again during a + * power-up. + * + */ +//#define FORCE_NKRO + +/* + * Magic Key Options + * + * Magic keys are hotkey commands that allow control over firmware functions of + * the keyboard. They are best used in combination with the HID Listen program, + * found here: https://www.pjrc.com/teensy/hid_listen.html + * + * The options below allow the magic key functionality to be changed. This is + * useful if your keyboard/keypad is missing keys and you want magic key support. + * + */ + +/* key combination for magic key command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + +/* control how magic key switches layers */ +//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS true +//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS true +//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM false + +/* override magic key keymap */ +//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS +//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS +//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM +//#define MAGIC_KEY_HELP1 H +//#define MAGIC_KEY_HELP2 SLASH +//#define MAGIC_KEY_DEBUG D +//#define MAGIC_KEY_DEBUG_MATRIX X +//#define MAGIC_KEY_DEBUG_KBD K +//#define MAGIC_KEY_DEBUG_MOUSE M +//#define MAGIC_KEY_VERSION V +//#define MAGIC_KEY_STATUS S +//#define MAGIC_KEY_CONSOLE C +//#define MAGIC_KEY_LAYER0_ALT1 ESC +//#define MAGIC_KEY_LAYER0_ALT2 GRAVE +//#define MAGIC_KEY_LAYER0 0 +//#define MAGIC_KEY_LAYER1 1 +//#define MAGIC_KEY_LAYER2 2 +//#define MAGIC_KEY_LAYER3 3 +//#define MAGIC_KEY_LAYER4 4 +//#define MAGIC_KEY_LAYER5 5 +//#define MAGIC_KEY_LAYER6 6 +//#define MAGIC_KEY_LAYER7 7 +//#define MAGIC_KEY_LAYER8 8 +//#define MAGIC_KEY_LAYER9 9 +#define MAGIC_KEY_BOOTLOADER B +//#define MAGIC_KEY_LOCK CAPS +//#define MAGIC_KEY_EEPROM E +//#define MAGIC_KEY_NKRO N +//#define MAGIC_KEY_SLEEP_LED Z + +/* + * Feature disable options + * These options are also useful to firmware size reduction. + */ + +/* disable debug print */ +//#define NO_DEBUG + +/* disable print */ +//#define NO_PRINT + +/* disable action features */ +//#define NO_ACTION_LAYER +//#define NO_ACTION_TAPPING +//#define NO_ACTION_ONESHOT +//#define NO_ACTION_MACRO +//#define NO_ACTION_FUNCTION + +#endif diff --git a/keyboard/atomic/keymaps/pvc/keymap.c b/keyboard/atomic/keymaps/pvc/keymap.c new file mode 100644 index 000000000..627f57ff7 --- /dev/null +++ b/keyboard/atomic/keymaps/pvc/keymap.c @@ -0,0 +1,202 @@ +#include "atomic.h" +#include "action_layer.h" +#ifdef AUDIO_ENABLE + #include "audio.h" +#endif + +#define _QW 0 +#define _LW 1 +#define _RS 2 +#define _FN 3 + +#define M_QW 0 +#define M_LW 1 +#define M_RS 2 +#define M_FN 3 + + +#define _______ KC_TRNS +#define ___T___ KC_TRNS +#define XXXXXXX KC_NO + +/* + * .---------------------------------------------------------------------------------------------------------------------- 2u ------------. + * | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | XXXXXX . BACKSP | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------| + * | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ | DEL | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+- 2u ------------+--------| + * | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | XXXXXX . ENTER | PG UP | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+- 2u ---------------------+--------| + * | LSHIFT | Z | X | C | V | B | N | M | , | . | / | XXXXXX . RSHIFT | UP | PG DN | + * |--------+--------+--------+--------+--------+- 2u ------------+--------+--------+--------+--------+-----------------+--------+--------| + * | LCTRL | LWIN | FN | LALT | RAISED | XXXXXX . SPACE | LOWER | RALT | HOME | END | RCTRL | LEFT | DOWN | RIGHT | + * '--------------------------------------------------------------------------------------------------------------------------------------' + */ + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [_QW] = { /* QWERTY */ + { KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, XXXXXXX }, + { KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL }, + { KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, XXXXXXX, KC_PGUP }, + { KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, XXXXXXX, KC_UP, KC_PGDN }, + { KC_LCTL, KC_LGUI, M(M_FN), KC_LALT, M(M_RS), KC_SPC, XXXXXXX, M(M_LW), KC_RALT, KC_HOME, KC_END, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT }, + }, + [_LW] = { /* LOWERED */ + { KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, ___T___, ___T___ }, + { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_INS }, + { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, ___T___, ___T___, _______ }, + { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, ___T___, ___T___, _______, _______ }, + { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ }, + }, + [_RS] = { /* RAISED */ + { KC_TILD, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, ___T___, ___T___ }, + { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_INS }, + { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, ___T___, ___T___, _______ }, + { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, ___T___, ___T___, _______, _______ }, + { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ }, + }, + [_FN] = { /* FUNCTION */ + { KC_NLCK, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, ___T___, ___T___ }, + { KC_SLCK, KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_F21, KC_F22, KC_F23, KC_F24, KC_PAUS, KC_PSCR }, + { KC_CAPS, KC_BTN5, KC_BTN4, KC_BTN3, KC_BTN2, KC_ACL0, KC_ACL2, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY, _______, ___T___, ___T___, KC_WH_U }, + { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, ___T___, ___T___, KC_MS_U, KC_WH_D }, + { _______, _______, _______, _______, _______, KC_BTN1, KC_BTN1, _______, _______, _______, _______, _______, KC_MS_L, KC_MS_D, KC_MS_R }, + }, +}; + +#define IS_LAYER_ON(layer) ((layer_state) & (1<<(layer))) +#define IS_LAYER_OFF(layer) ((!layer_state) & (1<<(layer))) + + +#ifdef AUDIO_ENABLE +float tone_lw[][2] = { + {440.0*pow(2.0,(59)/12.0), 8}, + {440.0*pow(2.0,(60)/12.0), 8}, + {0, 4}, + {440.0*pow(2.0,(67)/12.0), 16} +}; + +float tone_rs[][2] = { + {440.0*pow(2.0,(59)/12.0), 8}, + {440.0*pow(2.0,(60)/12.0), 8}, + {0, 4}, + {440.0*pow(2.0,(67)/12.0), 16}, + {0, 4}, + {440.0*pow(2.0,(71)/12.0), 16} +}; + +float tone_fn[][2] = { + {440.0*pow(2.0,(59)/12.0), 8}, + {440.0*pow(2.0,(60)/12.0), 8}, + {0, 4}, + {440.0*pow(2.0,(67)/12.0), 16}, + {0, 4}, + {440.0*pow(2.0,(69)/12.0), 16}, + {0, 4}, + {440.0*pow(2.0,(67)/12.0), 16} +}; +#endif + + +void update_tri_layer(uint8_t layer1, uint8_t layer2, uint8_t layer3) +{ + if (IS_LAYER_ON(layer1) && IS_LAYER_ON(layer2)) + { + #ifdef AUDIO_ENABLE + println("PlayNotes FN"); + play_notes(&tone_fn, 8, false); + #endif + layer_on(layer3); + } + else + { + layer_off(layer3); + } +} + +void update_quad_layer(uint8_t layer1, uint8_t layer2, uint8_t layer3, uint8_t layer4, bool order) +{ + if (order) + { + if (IS_LAYER_ON(layer1) && IS_LAYER_ON(layer2)) + { + layer_on(layer3); + } + else + { + layer_off(layer3); + layer_off(layer4); + } + } + else + { + if (IS_LAYER_ON(layer1) && IS_LAYER_ON(layer2)) + { + layer_on(layer4); + } + else + { + layer_off(layer3); + layer_off(layer4); + } + } +} + + +const uint16_t PROGMEM fn_actions[] = { +}; + + +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) +{ + // MACRODOWN only works in this function + switch(id) { + case M_LW: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + println("PlayNotes LW"); + play_notes(&tone_lw, 4, false); + #endif + layer_on(_LW); + update_tri_layer(_LW, _RS, _FN); + } else { + layer_off(_LW); + update_tri_layer(_LW, _RS, _FN); + } + break; + case M_RS: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + println("PlayNotes RS"); + play_notes(&tone_rs, 6, false); + #endif + layer_on(_RS); + update_tri_layer(_LW, _RS, _FN); + } else { + layer_off(_RS); + update_tri_layer(_LW, _RS, _FN); + } + break; + default: + break; + } + return MACRO_NONE; +}; + +#ifdef AUDIO_ENABLE +float start_up[][2] = { + {440.0*pow(2.0,(67)/12.0), 12}, + {440.0*pow(2.0,(64)/12.0), 8}, + {440.0*pow(2.0,(55)/12.0), 8}, + {440.0*pow(2.0,(60)/12.0), 8}, + {440.0*pow(2.0,(64)/12.0), 20} +}; +#endif + +void matrix_init_user(void) { + #ifdef AUDIO_ENABLE + init_notes(); + play_notes(&start_up, 5, false); + println("Matrix Init"); + #endif +} diff --git a/keyboard/atomic/keymaps/pvc/makefile.mk b/keyboard/atomic/keymaps/pvc/makefile.mk index ff0a9c338..c41102f5d 100644 --- a/keyboard/atomic/keymaps/pvc/makefile.mk +++ b/keyboard/atomic/keymaps/pvc/makefile.mk @@ -1,16 +1,18 @@ BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000) MOUSEKEY_ENABLE = yes # Mouse keys(+4700) EXTRAKEY_ENABLE = yes # Audio control and System control(+450) -CONSOLE_ENABLE = no # Console for debug(+400) +CONSOLE_ENABLE = yes # Console for debug(+400) COMMAND_ENABLE = yes # Commands for debug and configuration NKRO_ENABLE = yes # USB Nkey Rollover - if this doesn't work, see here: # https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality MIDI_ENABLE = no # MIDI controls -AUDIO_ENABLE = no # Audio output on port C6 +AUDIO_ENABLE = yes # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend + +CONFIG_H = keymaps/$(KEYMAP)/config.h \ No newline at end of file diff --git a/keyboard/atomic/keymaps/pvc/pvc_atomic.c b/keyboard/atomic/keymaps/pvc/pvc_atomic.c deleted file mode 100644 index 3ddd3e329..000000000 --- a/keyboard/atomic/keymaps/pvc/pvc_atomic.c +++ /dev/null @@ -1,221 +0,0 @@ -#include "atomic.h" -#include "action_layer.h" - -#define _QW 0 -#define _LW 1 -#define _RS 2 -#define _FN 3 -#define _F1 4 -#define _F2 5 - -#define _______ KC_TRNS -#define ___T___ KC_TRNS -#define XXXXXXX KC_NO - -/* - * .---------------------------------------------------------------------------------------------------------------------- 2u ------------. - * | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | XXXXXX . BACKSP | - * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------| - * | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ | DEL | - * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+- 2u ------------+--------| - * | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | XXXXXX . ENTER | PG UP | - * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+- 2u ---------------------+--------| - * | LSHIFT | Z | X | C | V | B | N | M | , | . | / | XXXXXX . RSHIFT | UP | PG DN | - * |--------+--------+--------+--------+--------+- 2u ------------+--------+--------+--------+--------+-----------------+--------+--------| - * | LCTRL | LWIN | FN | LALT | RAISED | XXXXXX . SPACE | LOWER | RALT | HOME | END | RCTRL | LEFT | DOWN | RIGHT | - * '--------------------------------------------------------------------------------------------------------------------------------------' - */ - -const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - [_QW] = { /* QWERTY */ - { KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, XXXXXXX }, - { KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL }, - { KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, XXXXXXX, KC_PGUP }, - { KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, XXXXXXX, KC_UP, KC_PGDN }, - { KC_LCTL, KC_LGUI, M(_FN), KC_LALT, M(_RS), KC_SPC, XXXXXXX, M(_LW), KC_RALT, KC_HOME, KC_END, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT }, - }, - [_LW] = { /* LOWERED */ - { KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, ___T___, ___T___ }, - { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_INS }, - { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, ___T___, ___T___, _______ }, - { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, ___T___, ___T___, _______, _______ }, - { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ }, - }, - [_RS] = { /* RAISED */ - { KC_TILD, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, ___T___, ___T___ }, - { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_INS }, - { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, ___T___, ___T___, _______ }, - { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, ___T___, ___T___, _______, _______ }, - { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ }, - }, - [_FN] = { /* FUNCTION */ - { KC_NLCK, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, ___T___, ___T___ }, - { KC_SLCK, KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_F21, KC_F22, KC_F23, KC_F24, KC_PAUS, KC_PSCR }, - { KC_CAPS, KC_BTN5, KC_BTN4, KC_BTN3, KC_BTN2, KC_ACL0, KC_ACL2, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY, _______, ___T___, ___T___, KC_WH_U }, - { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, ___T___, ___T___, KC_MS_U, KC_WH_D }, - { _______, _______, _______, _______, _______, KC_BTN1, KC_BTN1, _______, _______, _______, _______, _______, KC_MS_L, KC_MS_D, KC_MS_R }, - }, - [_F1] = { /* FUNCTION */ - { KC_NLCK, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, ___T___, ___T___ }, - { KC_SLCK, KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_F21, KC_F22, KC_F23, KC_F24, KC_PAUS, KC_PSCR }, - { KC_CAPS, KC_BTN5, KC_BTN4, KC_BTN3, KC_BTN2, KC_ACL0, KC_ACL2, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY, _______, ___T___, ___T___, KC_WH_U }, - { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, ___T___, ___T___, KC_MS_U, KC_WH_D }, - { _______, _______, _______, _______, _______, KC_BTN1, KC_BTN1, _______, _______, _______, _______, _______, KC_MS_L, KC_MS_D, KC_MS_R }, - }, - [_F2] = { /* FUNCTION */ - { KC_NLCK, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, ___T___, ___T___ }, - { KC_SLCK, KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_F21, KC_F22, KC_F23, KC_F24, KC_PAUS, KC_PSCR }, - { KC_CAPS, KC_BTN5, KC_BTN4, KC_BTN3, KC_BTN2, KC_ACL0, KC_ACL2, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY, _______, ___T___, ___T___, KC_WH_U }, - { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, ___T___, ___T___, KC_MS_U, KC_WH_D }, - { _______, _______, _______, _______, _______, KC_BTN1, KC_BTN1, _______, _______, _______, _______, _______, KC_MS_L, KC_MS_D, KC_MS_R }, - }, -}; - -#define IS_LAYER_ON(layer) ((layer_state) & (1<<(layer))) -#define IS_LAYER_OFF(layer) ((!layer_state) & (1<<(layer))) - -void update_tri_layer(uint8_t layer1, uint8_t layer2, uint8_t layer3) -{ - if (IS_LAYER_ON(layer1) && IS_LAYER_ON(layer2)) - { - layer_on(layer3); - } - else - { - layer_off(layer3); - } -} - -void update_quad_layer(uint8_t layer1, uint8_t layer2, uint8_t layer3, uint8_t layer4, bool order) -{ - if (order) - { - if (IS_LAYER_ON(layer1) && IS_LAYER_ON(layer2)) - { - layer_on(layer3); - } - else - { - layer_off(layer3); - layer_off(layer4); - } - } - else - { - if (IS_LAYER_ON(layer1) && IS_LAYER_ON(layer2)) - { - layer_on(layer4); - } - else - { - layer_off(layer3); - layer_off(layer4); - } - } -} - -/* ignore me -void change_quad_layer(uint8_t focus_layer, bool desired_focus_layer_state, uint8_t pair_layer, uint8_t layer3, uint8_t layer4) -{ - - // If desired focus layer state == 1 and current focus layer state == 1 - if ((desired_focus_layer_state) && IS_LAYER_ON(layer1)) - { - // Do Nothing - } - // If desired focus layer state == 0 and current focus layer state == 1 - else if ((desired_focus_layer_state) && IS_LAYER_ON(layer1)) - { - // If - layer_off(layer3); - layer_off(layer4); - } - } - else - { - if (IS_LAYER_ON(layer1) && IS_LAYER_ON(layer2)) - { - layer_on(layer4); - } - else - { - layer_off(layer3); - layer_off(layer4); - } - } -} -*/ - -const uint16_t PROGMEM fn_actions[] = { -}; - - -const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) -{ - - // MACRODOWN only works in this function - switch(id) - { - case _FN: - if (record->event.pressed) { - print("FN_DN\n"); - print_val_bin32(layer_state); - layer_on(_FN); - print_val_bin32(layer_state); - } else { - print("FN_UP\n"); - print_val_bin32(layer_state); - layer_off(_FN); - print_val_bin32(layer_state); - } - break; - - case _RS: - if (record->event.pressed) { - print("RS_DN\n"); - print_val_bin32(layer_state); - layer_on(_RS); - //tri_layer++; - print_val_bin32(layer_state); - //update_tri_layer(_RS, _LW, _FN); - update_quad_layer(_RS, _LW, _F1, _F2, 0); - print_val_bin32(layer_state); - } else { - print("RS_UP\n"); - print_val_bin32(layer_state); - layer_off(_RS); - //tri_layer--; - print_val_bin32(layer_state); - //update_tri_layer(_RS, _LW, _FN); - update_quad_layer(_RS, _LW, _F1, _F2, 0); - print_val_bin32(layer_state); - } - break; - - case _LW: - if (record->event.pressed) { - print("LW_DN\n"); - print_val_bin32(layer_state); - layer_on(_LW); - //tri_layer++; - print_val_bin32(layer_state); - //update_tri_layer(_RS, _LW, _FN); - update_quad_layer(_RS, _LW, _F1, _F2, 1); - print_val_bin32(layer_state); - } else { - print("LW_UP\n"); - print_val_bin32(layer_state); - layer_off(_LW); - //tri_layer--; - print_val_bin32(layer_state); - //update_tri_layer(_RS, _LW, _FN); - update_quad_layer(_RS, _LW, _F1, _F2, 1); - print_val_bin32(layer_state); - } - break; - - default: - break; - } - return MACRO_NONE; -}; diff --git a/keyboard/planck/Makefile b/keyboard/planck/Makefile index c8517e756..83b8303b0 100644 --- a/keyboard/planck/Makefile +++ b/keyboard/planck/Makefile @@ -157,39 +157,10 @@ SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifdef KEYMAP -<<<<<<< HEAD -<<<<<<< HEAD -# Build Options -# comment out to disable the options. -# -BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000) -MOUSEKEY_ENABLE = yes # Mouse keys(+4700) -EXTRAKEY_ENABLE = yes # Audio control and System control(+450) -CONSOLE_ENABLE = yes # Console for debug(+400) -COMMAND_ENABLE = yes # Commands for debug and configuration -NKRO_ENABLE = yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work -# BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality -# MIDI_ENABLE = yes # MIDI controls -# AUDIO_ENABLE = yes # Audio output on port C6 -# UNICODE_ENABLE = yes # Unicode -# BLUETOOTH_ENABLE = ye # Enable Bluetooth with the Adafruit EZ-Key HID -# RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. - -# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE -#SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend - - -ifdef BACKLIGHT_ENABLE -======= -ifeq ($(BACKLIGHT_ENABLE), yes) ->>>>>>> master - SRC += backlight.c -======= ifeq ("$(wildcard keymaps/$(KEYMAP).c)","") ifneq ("$(wildcard keymaps/$(KEYMAP)/makefile.mk)","") include keymaps/$(KEYMAP)/makefile.mk endif ->>>>>>> remotes/jackhumbert/new_defaults endif else @@ -212,4 +183,4 @@ VPATH += $(TARGET_DIR) VPATH += $(TOP_DIR) VPATH += $(TMK_DIR) -include $(TOP_DIR)/quantum/quantum.mk +include $(TOP_DIR)/quantum/quantum.mk \ No newline at end of file diff --git a/quantum/audio.h b/quantum/audio.h index 99203cea7..31f9a3579 100644 --- a/quantum/audio.h +++ b/quantum/audio.h @@ -6,6 +6,6 @@ void play_sample(uint8_t * s, uint16_t l, bool r); void play_note(double freq, int vol); void stop_note(double freq); -void stop_all_notes(); -void init_notes(); +void stop_all_notes(void); +void init_notes(void); void play_notes(float (*np)[][2], uint8_t n_length, bool n_repeat); \ No newline at end of file -- cgit v1.2.3-70-g09d2 From 0faa18eab996c2cfcc5da0b60b702f52335c5854 Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Fri, 15 Apr 2016 23:38:21 -0400 Subject: audio enable stored in eeprom --- keyboard/planck/keymaps/default/keymap.c | 7 ++++- keyboard/preonic/Makefile | 4 +-- keyboard/preonic/keymaps/default/keymap.c | 12 ++++---- quantum/audio.c | 48 ++++++++++++++++++++++++++++++- quantum/audio.h | 14 ++++++++- tmk_core/common/avr/eeconfig.c | 8 ++++++ tmk_core/common/eeconfig.h | 6 ++++ 7 files changed, 89 insertions(+), 10 deletions(-) (limited to 'quantum') diff --git a/keyboard/planck/keymaps/default/keymap.c b/keyboard/planck/keymaps/default/keymap.c index 56092d04f..3f34ba412 100644 --- a/keyboard/planck/keymaps/default/keymap.c +++ b/keyboard/planck/keymaps/default/keymap.c @@ -135,7 +135,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ [_AD] = { {_______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL}, - {_______, _______, _______, _______, _______, _______, _______, M(M_QW), M(M_CM), M(M_DV), _______, _______}, + {_______, _______, _______, _______, M(6), _______, _______, M(M_QW), M(M_CM), M(M_DV), _______, _______}, {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}, {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______} } @@ -231,6 +231,11 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) unregister_code(KC_RSFT); } break; + case 6: + if (record->event.pressed) { + audio_toggle(); + } + break; } return MACRO_NONE; }; diff --git a/keyboard/preonic/Makefile b/keyboard/preonic/Makefile index 664aff732..e48052c82 100644 --- a/keyboard/preonic/Makefile +++ b/keyboard/preonic/Makefile @@ -139,8 +139,8 @@ COMMAND_ENABLE = yes # Commands for debug and configuration # SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend # NKRO_ENABLE = yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality -MIDI_ENABLE = YES # MIDI controls -AUDIO_ENABLE = YES # Audio output on port C6 +MIDI_ENABLE = yes # MIDI controls +AUDIO_ENABLE = yes # Audio output on port C6 # UNICODE_ENABLE = YES # Unicode # BLUETOOTH_ENABLE = yes # Enable Bluetooth with the Adafruit EZ-Key HID # RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with MIDI at the same time. diff --git a/keyboard/preonic/keymaps/default/keymap.c b/keyboard/preonic/keymaps/default/keymap.c index 784670784..3da69c215 100644 --- a/keyboard/preonic/keymaps/default/keymap.c +++ b/keyboard/preonic/keymaps/default/keymap.c @@ -59,11 +59,11 @@ const uint16_t PROGMEM fn_actions[] = { }; float start_up[][2] = { - {440.0*pow(2.0,(67)/12.0), 600}, - {440.0*pow(2.0,(64)/12.0), 400}, - {440.0*pow(2.0,(55)/12.0), 400}, - {440.0*pow(2.0,(60)/12.0), 400}, - {440.0*pow(2.0,(64)/12.0), 1000}, + {440.0*pow(2.0,(67)/12.0), 4}, + {440.0*pow(2.0,(64)/12.0), 8}, + {440.0*pow(2.0,(55)/12.0), 8}, + {440.0*pow(2.0,(60)/12.0), 8}, + {440.0*pow(2.0,(64)/12.0), 10}, }; const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) @@ -76,8 +76,10 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) #ifdef BACKLIGHT_ENABLE backlight_step(); #endif + audio_toggle(); } else { unregister_code(KC_RSFT); + play_notes(&start_up, 5, false); } break; } diff --git a/quantum/audio.c b/quantum/audio.c index 50e5505fe..73985479c 100644 --- a/quantum/audio.c +++ b/quantum/audio.c @@ -8,6 +8,8 @@ #include "audio.h" #include "keymap_common.h" +#include "eeconfig.h" + #define PI 3.14159265 // #define PWM_AUDIO @@ -57,6 +59,25 @@ uint8_t notes_length; bool notes_repeat; uint8_t current_note = 0; +audio_config_t audio_config; + + +void audio_toggle(void) { + audio_config.enable ^= 1; + eeconfig_write_audio(audio_config.raw); +} + +void audio_on(void) { + audio_config.enable = 1; + eeconfig_write_audio(audio_config.raw); +} + +void audio_off(void) { + audio_config.enable = 0; + eeconfig_write_audio(audio_config.raw); +} + + void stop_all_notes() { voices = 0; #ifdef PWM_AUDIO @@ -129,6 +150,12 @@ void stop_note(double freq) { void init_notes() { + /* check signature */ + if (!eeconfig_is_enabled()) { + eeconfig_init(); + } + audio_config.raw = eeconfig_read_audio(); + #ifdef PWM_AUDIO PLLFRQ = _BV(PDIV2); PLLCSR = _BV(PLLE); @@ -160,7 +187,6 @@ void init_notes() { ISR(TIMER3_COMPA_vect) { - if (note) { #ifdef PWM_AUDIO if (voices == 1) { @@ -288,9 +314,16 @@ ISR(TIMER3_COMPA_vect) { } + if (!audio_config.enable) { + notes = false; + note = false; + } } void play_notes(float (*np)[][2], uint8_t n_length, bool n_repeat) { + +if (audio_config.enable) { + if (note) stop_all_notes(); notes = true; @@ -319,7 +352,12 @@ void play_notes(float (*np)[][2], uint8_t n_length, bool n_repeat) { #endif } +} + void play_sample(uint8_t * s, uint16_t l, bool r) { + +if (audio_config.enable) { + stop_all_notes(); place_int = 0; sample = s; @@ -330,9 +368,15 @@ void play_sample(uint8_t * s, uint16_t l, bool r) { TIMSK3 |= _BV(OCIE3A); #else #endif + +} + } void play_note(double freq, int vol) { + +if (audio_config.enable) { + if (notes) stop_all_notes(); note = true; @@ -367,4 +411,6 @@ void play_note(double freq, int vol) { TCCR3A |= _BV(COM3A1); #endif +} + } \ No newline at end of file diff --git a/quantum/audio.h b/quantum/audio.h index 99203cea7..58270015d 100644 --- a/quantum/audio.h +++ b/quantum/audio.h @@ -3,9 +3,21 @@ #include #include +typedef union { + uint8_t raw; + struct { + bool enable :1; + uint8_t level :7; + }; +} audio_config_t; + +void audio_toggle(void); +void audio_on(void); +void audio_off(void); + void play_sample(uint8_t * s, uint16_t l, bool r); void play_note(double freq, int vol); void stop_note(double freq); void stop_all_notes(); void init_notes(); -void play_notes(float (*np)[][2], uint8_t n_length, bool n_repeat); \ No newline at end of file +void play_notes(float (*np)[][2], uint8_t n_length, bool n_repeat); diff --git a/tmk_core/common/avr/eeconfig.c b/tmk_core/common/avr/eeconfig.c index 5bd47dc6a..d0c3f4f57 100644 --- a/tmk_core/common/avr/eeconfig.c +++ b/tmk_core/common/avr/eeconfig.c @@ -13,6 +13,9 @@ void eeconfig_init(void) #ifdef BACKLIGHT_ENABLE eeprom_write_byte(EECONFIG_BACKLIGHT, 0); #endif +#ifdef AUDIO_ENABLE + eeprom_write_byte(EECONFIG_AUDIO, 0); +#endif } void eeconfig_enable(void) @@ -43,3 +46,8 @@ void eeconfig_write_keymap(uint8_t val) { eeprom_write_byte(EECONFIG_KEYMAP, val uint8_t eeconfig_read_backlight(void) { return eeprom_read_byte(EECONFIG_BACKLIGHT); } void eeconfig_write_backlight(uint8_t val) { eeprom_write_byte(EECONFIG_BACKLIGHT, val); } #endif + +#ifdef AUDIO_ENABLE +uint8_t eeconfig_read_audio(void) { return eeprom_read_byte(EECONFIG_AUDIO); } +void eeconfig_write_audio(uint8_t val) { eeprom_write_byte(EECONFIG_AUDIO, val); } +#endif \ No newline at end of file diff --git a/tmk_core/common/eeconfig.h b/tmk_core/common/eeconfig.h index 3cd1a174f..ddefca134 100644 --- a/tmk_core/common/eeconfig.h +++ b/tmk_core/common/eeconfig.h @@ -31,6 +31,7 @@ along with this program. If not, see . #define EECONFIG_KEYMAP (uint8_t *)4 #define EECONFIG_MOUSEKEY_ACCEL (uint8_t *)5 #define EECONFIG_BACKLIGHT (uint8_t *)6 +#define EECONFIG_AUDIO (uint8_t *)7 /* debug bit */ @@ -72,4 +73,9 @@ uint8_t eeconfig_read_backlight(void); void eeconfig_write_backlight(uint8_t val); #endif +#ifdef AUDIO_ENABLE +uint8_t eeconfig_read_audio(void); +void eeconfig_write_audio(uint8_t val); +#endif + #endif -- cgit v1.2.3-70-g09d2 From 0b0ec82427aff54481103559066213056b6d7598 Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Sat, 16 Apr 2016 00:01:22 -0400 Subject: eeprom reset tool --- quantum/tools/README.md | 6 ++++++ quantum/tools/eeprom_reset.hex | 9 +++++++++ 2 files changed, 15 insertions(+) create mode 100644 quantum/tools/README.md create mode 100644 quantum/tools/eeprom_reset.hex (limited to 'quantum') diff --git a/quantum/tools/README.md b/quantum/tools/README.md new file mode 100644 index 000000000..070214423 --- /dev/null +++ b/quantum/tools/README.md @@ -0,0 +1,6 @@ +`eeprom_reset.hex` is to reset the eeprom on the Atmega32u4, like this: + + dfu-programmer atmega32u4 erase + dfu-programmer atmega32u4 flash --eeprom eeprom-reset.bin + + You'll need to reflash afterwards, because DFU requires the flash to be erased before messing with the eeprom. \ No newline at end of file diff --git a/quantum/tools/eeprom_reset.hex b/quantum/tools/eeprom_reset.hex new file mode 100644 index 000000000..a8a75389f --- /dev/null +++ b/quantum/tools/eeprom_reset.hex @@ -0,0 +1,9 @@ +:10000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 +:10001000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0 +:10002000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 +:10003000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0 +:10004000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0 +:10005000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0 +:10006000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0 +:10007000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF90 +:00000001FF -- cgit v1.2.3-70-g09d2 From 142ce47698613bb8fb757f13c29928a572a4d9d9 Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Sat, 16 Apr 2016 01:23:08 -0400 Subject: added keymap_extras to path --- quantum/quantum.mk | 1 + 1 file changed, 1 insertion(+) (limited to 'quantum') diff --git a/quantum/quantum.mk b/quantum/quantum.mk index 17bb50171..1fe7390eb 100644 --- a/quantum/quantum.mk +++ b/quantum/quantum.mk @@ -46,6 +46,7 @@ endif # Search Path VPATH += $(TOP_DIR)/$(QUANTUM_DIR) +VPATH += $(TOP_DIR)/$(QUANTUM_DIR)/keymap_extras include $(TMK_DIR)/protocol/lufa.mk -- cgit v1.2.3-70-g09d2 From 86169833c597fa5f2b5226e1587c48a6692ec017 Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Sat, 16 Apr 2016 15:47:17 -0400 Subject: updates to preonic default, music mode integrated --- keyboard/preonic/keymaps/default/keymap.c | 160 ++++++++++++++++++++---------- quantum/audio.c | 100 ++++++++++--------- 2 files changed, 165 insertions(+), 95 deletions(-) (limited to 'quantum') diff --git a/keyboard/preonic/keymaps/default/keymap.c b/keyboard/preonic/keymaps/default/keymap.c index c52d8472f..6824f68b6 100644 --- a/keyboard/preonic/keymaps/default/keymap.c +++ b/keyboard/preonic/keymaps/default/keymap.c @@ -1,31 +1,40 @@ #include "preonic.h" #include "action_layer.h" +#include "eeconfig.h" #ifdef AUDIO_ENABLE #include "audio.h" + #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), } #endif // Each layer gets a name for readability, which is then used in the keymap matrix below. // The underscores don't mean anything - you can have a layer called STUFF or any other name. // Layer names don't all need to be of the same length, obviously, and you can also skip them // entirely and just use numbers. -#define _QW 0 -#define _CM 1 -#define _DV 2 -#define _LW 3 -#define _RS 4 -#define _AD 5 +#define _QWERTY 0 +#define _COLEMAK 1 +#define _DVORAK 2 +#define _LOWER 3 +#define _RAISE 4 +#define _ADJUST 5 +#define _MUSIC 6 // Macro name shortcuts -#define QWERTY M(_QW) -#define COLEMAK M(_CM) -#define DVORAK M(_DV) -#define LOWER M(_LW) -#define RAISE M(_RS) +#define QWERTY M(_QWERTY) +#define COLEMAK M(_COLEMAK) +#define DVORAK M(_DVORAK) +#define LOWER M(_LOWER) +#define RAISE M(_RAISE) #define M_BL 5 #ifdef AUDIO_ENABLE #define AUD_OFF M(6) #define AUD_ON M(7) #endif +#define MUS_OFF M(8) +#define MUS_ON M(9) // Fillers to make layering more clear #define _______ KC_TRNS @@ -46,7 +55,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | Brite| Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right | * `-----------------------------------------------------------------------------------' */ -[_QW] = { +[_QWERTY] = { {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC}, {KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_DEL}, {KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT}, @@ -67,7 +76,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | Brite| Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right | * `-----------------------------------------------------------------------------------' */ -[_CM] = { +[_COLEMAK] = { {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC}, {KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_DEL}, {KC_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT}, @@ -88,7 +97,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | Brite| Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right | * `-----------------------------------------------------------------------------------' */ -[_DV] = { +[_DVORAK] = { {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC}, {KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_DEL}, {KC_ESC, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_SLSH}, @@ -109,7 +118,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | | | | | | | Next | Vol- | Vol+ | Play | * `-----------------------------------------------------------------------------------' */ -[_LW] = { +[_LOWER] = { {KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC}, {KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_DEL}, {KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE}, @@ -130,7 +139,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | | | | | | | Next | Vol- | Vol+ | Play | * `-----------------------------------------------------------------------------------' */ -[_RS] = { +[_RAISE] = { {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC}, {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL}, {KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS}, @@ -151,10 +160,21 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | | | | | | | | | | | * `-----------------------------------------------------------------------------------' */ -[_AD] = { +[_ADJUST] = { {KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12}, {_______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL}, {_______, _______, _______, AUD_ON, AUD_OFF, _______, _______, QWERTY, COLEMAK, DVORAK, _______, _______}, + {_______, _______, _______, MUS_ON, MUS_OFF, _______, _______, _______, _______, _______, _______, _______}, + {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______} +}, + +/* Music (reserved for process_action_user) + * + */ +[_MUSIC] = { + {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}, + {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}, + {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}, {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}, {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______} } @@ -166,24 +186,20 @@ const uint16_t PROGMEM fn_actions[] = { #ifdef AUDIO_ENABLE float start_up[][2] = { - {440.0*pow(2.0,(55)/12.0), 12}, - {0, 2}, - {440.0*pow(2.0,(67)/12.0), 8}, - {440.0*pow(2.0,(64)/12.0), 8}, - {440.0*pow(2.0,(55)/12.0), 8}, - {440.0*pow(2.0,(67)/12.0), 12}, - {0, 2}, - {440.0*pow(2.0,(67)/12.0), 12} + {440.0*pow(2.0,(50)/12.0), 20}, + {440.0*pow(2.0,(62)/12.0), 8}, + {440.0*pow(2.0,(54)/12.0), 20}, + {440.0*pow(2.0,(62)/12.0), 8} }; -float tone_qw[][2] = { +float tone_qwerty[][2] = { {440.0*pow(2.0,(59)/12.0), 8}, {440.0*pow(2.0,(60)/12.0), 8}, {0, 4}, {440.0*pow(2.0,(67)/12.0), 16} }; -float tone_cm[][2] = { +float tone_colemak[][2] = { {440.0*pow(2.0,(59)/12.0), 8}, {440.0*pow(2.0,(60)/12.0), 8}, {0, 4}, @@ -192,7 +208,7 @@ float tone_cm[][2] = { {440.0*pow(2.0,(71)/12.0), 12} }; -float tone_dv[][2] = { +float tone_dvorak[][2] = { {440.0*pow(2.0,(59)/12.0), 8}, {440.0*pow(2.0,(60)/12.0), 8}, {0, 4}, @@ -202,53 +218,66 @@ float tone_dv[][2] = { {0, 4}, {440.0*pow(2.0,(67)/12.0), 8} }; + +float tone_music[][2] = { + {440.0*pow(2.0,(48)/12.0), 8}, + {440.0*pow(2.0,(50)/12.0), 8}, + {440.0*pow(2.0,(52)/12.0), 8}, + {440.0*pow(2.0,(53)/12.0), 8}, + {440.0*pow(2.0,(55)/12.0), 8}, + {440.0*pow(2.0,(57)/12.0), 8}, + {440.0*pow(2.0,(59)/12.0), 8}, + {440.0*pow(2.0,(60)/12.0), 8} +}; #endif const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) { - // MACRODOWN only works in this function switch(id) { - case _QW: + case _QWERTY: if (record->event.pressed) { #ifdef AUDIO_ENABLE - play_notes(&tone_qw, 4, false); + play_notes(&tone_qwerty, 4, false); #endif - default_layer_set(1UL<<_QW); + eeconfig_write_default_layer(1UL<<_QWERTY); + default_layer_set(1UL<<_QWERTY); } break; - case _CM: + case _COLEMAK: if (record->event.pressed) { #ifdef AUDIO_ENABLE - play_notes(&tone_cm, 6, false); + play_notes(&tone_colemak, 6, false); #endif - default_layer_set(1UL<<_CM); + eeconfig_write_default_layer(1UL<<_COLEMAK); + default_layer_set(1UL<<_COLEMAK); } break; - case _DV: + case _DVORAK: if (record->event.pressed) { #ifdef AUDIO_ENABLE - play_notes(&tone_dv, 8, false); + play_notes(&tone_dvorak, 8, false); #endif - default_layer_set(1UL<<_DV); + eeconfig_write_default_layer(1UL<<_DVORAK); + default_layer_set(1UL<<_DVORAK); } break; - case _LW: + case _LOWER: if (record->event.pressed) { - layer_on(_LW); - update_tri_layer(_LW, _RS, _AD); + layer_on(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); } else { - layer_off(_LW); - update_tri_layer(_LW, _RS, _AD); + layer_off(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); } break; - case _RS: + case _RAISE: if (record->event.pressed) { - layer_on(_RS); - update_tri_layer(_LW, _RS, _AD); + layer_on(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); } else { - layer_off(_RS); - update_tri_layer(_LW, _RS, _AD); + layer_off(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); } break; case M_BL: @@ -272,7 +301,23 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) if (record->event.pressed) { #ifdef AUDIO_ENABLE audio_on(); - play_notes(&start_up, 7, false); + play_notes(&start_up, 4, false); + #endif + } + break; + case 8: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + layer_off(_MUSIC); + stop_all_notes(); + #endif + } + break; + case 9: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + play_notes(&tone_music, 8, false); + layer_on(_MUSIC); #endif } break; @@ -280,9 +325,24 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) return MACRO_NONE; }; +uint8_t starting_note = 0x0C; +int offset = 7; + +void process_action_user(keyrecord_t *record) { + + if (IS_LAYER_ON(_MUSIC)) { + if (record->event.pressed) { + play_note(((double)261.626)*pow(2.0, -2.0)*pow(2.0,(starting_note + SCALE[record->event.key.col + offset])/12.0+(MATRIX_ROWS - record->event.key.row)), 0xF); + } else { + stop_note(((double)261.626)*pow(2.0, -2.0)*pow(2.0,(starting_note + SCALE[record->event.key.col + offset])/12.0+(MATRIX_ROWS - record->event.key.row))); + } + } + +} + void matrix_init_user(void) { #ifdef AUDIO_ENABLE init_notes(); - play_notes(&start_up, 7, false); + play_notes(&start_up, 4, false); #endif } diff --git a/quantum/audio.c b/quantum/audio.c index 73985479c..5edcccdbe 100644 --- a/quantum/audio.c +++ b/quantum/audio.c @@ -32,6 +32,8 @@ int voice_place = 0; double frequency = 0; int volume = 0; long position = 0; +int duty_place = 1; +int duty_counter = 0; double frequencies[8] = {0, 0, 0, 0, 0, 0, 0, 0}; int volumes[8] = {0, 0, 0, 0, 0, 0, 0, 0}; @@ -98,53 +100,55 @@ void stop_all_notes() { } void stop_note(double freq) { - #ifdef PWM_AUDIO - freq = freq / SAMPLE_RATE; - #endif - 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; - } - } - } - voices--; - if (voices < 0) - voices = 0; - if (voices == 0) { + if (note) { #ifdef PWM_AUDIO - TIMSK3 &= ~_BV(OCIE3A); - #else - TIMSK3 &= ~_BV(OCIE3A); - TCCR3A &= ~_BV(COM3A1); + freq = freq / SAMPLE_RATE; #endif - frequency = 0; - volume = 0; - note = false; - } else { - double freq = frequencies[voices - 1]; - int vol = volumes[voices - 1]; - double starting_f = frequency; - if (frequency < freq) { - sliding = true; - for (double f = starting_f; f <= freq; f += ((freq - starting_f) / 2000.0)) { - frequency = f; + 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; + } } - sliding = false; - } else if (frequency > freq) { - sliding = true; - for (double f = starting_f; f >= freq; f -= ((starting_f - freq) / 2000.0)) { - frequency = f; + } + voices--; + if (voices < 0) + voices = 0; + if (voices == 0) { + #ifdef PWM_AUDIO + TIMSK3 &= ~_BV(OCIE3A); + #else + TIMSK3 &= ~_BV(OCIE3A); + TCCR3A &= ~_BV(COM3A1); + #endif + frequency = 0; + volume = 0; + note = false; + } else { + double freq = frequencies[voices - 1]; + int vol = volumes[voices - 1]; + double starting_f = frequency; + if (frequency < freq) { + sliding = true; + for (double f = starting_f; f <= freq; f += ((freq - starting_f) / 2000.0)) { + frequency = f; + } + sliding = false; + } else if (frequency > freq) { + sliding = true; + for (double f = starting_f; f >= freq; f -= ((starting_f - freq) / 2000.0)) { + frequency = f; + } + sliding = false; } - sliding = false; + frequency = freq; + volume = vol; } - frequency = freq; - volume = vol; } } @@ -239,13 +243,19 @@ ISR(TIMER3_COMPA_vect) { if (frequency > 0) { // ICR3 = (int)(((double)F_CPU) / frequency); // Set max to the period // OCR3A = (int)(((double)F_CPU) / frequency) >> 1; // Set compare to half the period - if (place > 10) { + voice_place %= voices; + if (place > (frequencies[voice_place] / 500)) { voice_place = (voice_place + 1) % voices; place = 0.0; } ICR3 = (int)(((double)F_CPU) / frequencies[voice_place]); // Set max to the period - OCR3A = (int)(((double)F_CPU) / frequencies[voice_place]) >> 1; // Set compare to half the period + OCR3A = (int)(((double)F_CPU) / frequencies[voice_place]) >> 1 * duty_place; // Set compare to half the period place++; + // if (duty_counter > (frequencies[voice_place] / 500)) { + // duty_place = (duty_place % 3) + 1; + // duty_counter = 0; + // } + // duty_counter++; } #endif } @@ -375,7 +385,7 @@ if (audio_config.enable) { void play_note(double freq, int vol) { -if (audio_config.enable) { +if (audio_config.enable && voices < 8) { if (notes) stop_all_notes(); -- cgit v1.2.3-70-g09d2 From ab19ebd08a8b955775e6fa94cdf6b8d128d8b43c Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Sat, 16 Apr 2016 18:51:58 -0400 Subject: MAGIC functionality, AG swap in default layout --- keyboard/planck/keymaps/default/README.md | 32 ---- keyboard/preonic/Makefile | 2 +- keyboard/preonic/keymaps/default/keymap.c | 19 +-- quantum/keymap_common.c | 250 +++++++++++++++++------------- quantum/keymap_common.h | 28 +++- tmk_core/common.mk | 3 + tmk_core/common/keyboard.c | 8 +- tmk_core/common/keymap.h | 3 - tmk_core/common/magic.c | 36 +++++ tmk_core/common/magic.h | 6 + 10 files changed, 226 insertions(+), 161 deletions(-) create mode 100644 tmk_core/common/magic.c create mode 100644 tmk_core/common/magic.h (limited to 'quantum') diff --git a/keyboard/planck/keymaps/default/README.md b/keyboard/planck/keymaps/default/README.md index d2f43bbdb..de9680b49 100644 --- a/keyboard/planck/keymaps/default/README.md +++ b/keyboard/planck/keymaps/default/README.md @@ -1,34 +1,2 @@ # The Default Planck Layout - const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - [_QW] = { /* Qwerty */ - {KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC}, - {KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT}, - {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT }, - {M(0), KC_LCTL, KC_LALT, KC_LGUI, MO(_LW), KC_SPC, KC_SPC, MO(_RS), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} - }, - [_CM] = { /* Colemak */ - {KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC}, - {KC_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT}, - {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT }, - {M(0), KC_LCTL, KC_LALT, KC_LGUI, MO(_LW), KC_SPC, KC_SPC, MO(_RS), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} - }, - [_DV] = { /* Dvorak */ - {KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSPC}, - {KC_ESC, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_SLSH}, - {KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_ENT }, - {M(0), KC_LCTL, KC_LALT, KC_LGUI, MO(_LW), KC_SPC, KC_SPC, MO(_RS), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} - }, - [_RS] = { /* RAISE */ - {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC}, - {KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS}, - {KC_TRNS, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, DF(_QW), DF(_CM), DF(_DV), RESET, KC_TRNS}, - {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY} - }, - [_LW] = { /* LOWER */ - {KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC}, - {KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE}, - {KC_TRNS, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, DF(_QW), DF(_CM), DF(_DV), RESET, KC_TRNS}, - {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY} - } - }; \ No newline at end of file diff --git a/keyboard/preonic/Makefile b/keyboard/preonic/Makefile index eaf9ef927..9199968c3 100644 --- a/keyboard/preonic/Makefile +++ b/keyboard/preonic/Makefile @@ -130,7 +130,7 @@ OPT_DEFS += -DBOOTLOADER_SIZE=4096 # change to "no" to disable the options, or define them in the makefile.mk in # the appropriate keymap folder that will get included automatically # -BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000) +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) MOUSEKEY_ENABLE = yes # Mouse keys(+4700) EXTRAKEY_ENABLE = yes # Audio control and System control(+450) CONSOLE_ENABLE = yes # Console for debug(+400) diff --git a/keyboard/preonic/keymaps/default/keymap.c b/keyboard/preonic/keymaps/default/keymap.c index 6824f68b6..e1f9b6202 100644 --- a/keyboard/preonic/keymaps/default/keymap.c +++ b/keyboard/preonic/keymaps/default/keymap.c @@ -153,9 +153,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |------+------+------+------+------+------+------+------+------+------+------+------| * | | Reset| | | | | | | | | | Del | * |------+------+------+------+------+-------------+------+------+------+------+------| - * | | | |Audoff|Aud on| | |Qwerty|Colemk|Dvorak| | | + * | | | |Audoff|Aud on|AGnorm|AGswap|Qwerty|Colemk|Dvorak| | | * |------+------+------+------+------+------|------+------+------+------+------+------| - * | | | | | | | | | | | | | + * | | | |Musoff|Mus on| | | | | | | | * |------+------+------+------+------+------+------+------+------+------+------+------| * | | | | | | | | | | | | * `-----------------------------------------------------------------------------------' @@ -163,7 +163,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_ADJUST] = { {KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12}, {_______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL}, - {_______, _______, _______, AUD_ON, AUD_OFF, _______, _______, QWERTY, COLEMAK, DVORAK, _______, _______}, + {_______, _______, _______, AUD_ON, AUD_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, _______, _______}, {_______, _______, _______, MUS_ON, MUS_OFF, _______, _______, _______, _______, _______, _______, _______}, {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______} }, @@ -231,6 +231,10 @@ float tone_music[][2] = { }; #endif +void persistant_default_layer_set(uint16_t default_layer) { + eeconfig_write_default_layer(default_layer); + default_layer_set(default_layer); +} const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) { @@ -240,8 +244,7 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) #ifdef AUDIO_ENABLE play_notes(&tone_qwerty, 4, false); #endif - eeconfig_write_default_layer(1UL<<_QWERTY); - default_layer_set(1UL<<_QWERTY); + persistant_default_layer_set(1UL<<_QWERTY); } break; case _COLEMAK: @@ -249,8 +252,7 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) #ifdef AUDIO_ENABLE play_notes(&tone_colemak, 6, false); #endif - eeconfig_write_default_layer(1UL<<_COLEMAK); - default_layer_set(1UL<<_COLEMAK); + persistant_default_layer_set(1UL<<_COLEMAK); } break; case _DVORAK: @@ -258,8 +260,7 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) #ifdef AUDIO_ENABLE play_notes(&tone_dvorak, 8, false); #endif - eeconfig_write_default_layer(1UL<<_DVORAK); - default_layer_set(1UL<<_DVORAK); + persistant_default_layer_set(1UL<<_DVORAK); } break; case _LOWER: diff --git a/quantum/keymap_common.c b/quantum/keymap_common.c index 3a00d36f0..b91916685 100644 --- a/quantum/keymap_common.c +++ b/quantum/keymap_common.c @@ -27,6 +27,8 @@ along with this program. If not, see . #include "keymap_midi.h" #include "bootloader.h" +extern keymap_config_t keymap_config; + #include #include #ifdef AUDIO_ENABLE @@ -47,120 +49,9 @@ action_t action_for_key(uint8_t layer, keypos_t key) // 16bit keycodes - important uint16_t keycode = keymap_key_to_keycode(layer, key); - if (keycode >= 0x0100 && keycode < 0x2000) { - // Has a modifier - action_t action; - // Split it up - action.code = ACTION_MODS_KEY(keycode >> 8, keycode & 0xFF); // adds modifier to key - return action; - } else if (keycode >= 0x2000 && keycode < 0x3000) { - // Is a shortcut for function layer, pull last 12bits - // This means we have 4,096 FN macros at our disposal - return keymap_func_to_action(keycode & 0xFFF); - } else if (keycode >= 0x3000 && keycode < 0x4000) { - // When the code starts with 3, it's an action macro. - action_t action; - action.code = ACTION_MACRO(keycode & 0xFF); - return action; -#ifdef BACKLIGHT_ENABLE - } else if (keycode >= BL_0 && keycode <= BL_15) { - action_t action; - action.code = ACTION_BACKLIGHT_LEVEL(keycode & 0x000F); - return action; - } else if (keycode == BL_DEC) { - action_t action; - action.code = ACTION_BACKLIGHT_DECREASE(); - return action; - } else if (keycode == BL_INC) { - action_t action; - action.code = ACTION_BACKLIGHT_INCREASE(); - return action; - } else if (keycode == BL_TOGG) { - action_t action; - action.code = ACTION_BACKLIGHT_TOGGLE(); - return action; - } else if (keycode == BL_STEP) { - action_t action; - action.code = ACTION_BACKLIGHT_STEP(); - return action; -#endif - } else if (keycode == RESET) { // RESET is 0x5000, which is why this is here - action_t action; - clear_keyboard(); - #ifdef AUDIO_ENABLE - play_notes(&goodbye, 3, false); - #endif - _delay_ms(250); - #ifdef ATREUS_ASTAR - *(uint16_t *)0x0800 = 0x7777; // these two are a-star-specific - #endif - bootloader_jump(); - return action; - } else if (keycode == DEBUG) { // DEBUG is 0x5001 - // TODO: Does this actually work? - action_t action; - print("\nDEBUG: enabled.\n"); - debug_enable = true; - return action; - } else if (keycode >= 0x5000 && keycode < 0x6000) { - // Layer movement shortcuts - // See .h to see constraints/usage - int type = (keycode >> 0x8) & 0xF; - if (type == 0x1) { - // Layer set "GOTO" - int when = (keycode >> 0x4) & 0x3; - int layer = keycode & 0xF; - action_t action; - action.code = ACTION_LAYER_SET(layer, when); - return action; - } else if (type == 0x2) { - // Momentary layer - int layer = keycode & 0xFF; - action_t action; - action.code = ACTION_LAYER_MOMENTARY(layer); - return action; - } else if (type == 0x3) { - // Set default layer - int layer = keycode & 0xFF; - action_t action; - action.code = ACTION_DEFAULT_LAYER_SET(layer); - return action; - } else if (type == 0x4) { - // Set default layer - int layer = keycode & 0xFF; - action_t action; - action.code = ACTION_LAYER_TOGGLE(layer); - return action; - } -#ifdef MIDI_ENABLE - } else if (keycode >= 0x6000 && keycode < 0x7000) { - action_t action; - action.code = ACTION_FUNCTION_OPT(keycode & 0xFF, (keycode & 0x0F00) >> 8); - return action; -#endif - } else if (keycode >= 0x7000 && keycode < 0x8000) { - action_t action; - action.code = ACTION_MODS_TAP_KEY((keycode >> 0x8) & 0xF, keycode & 0xFF); - return action; - } else if (keycode >= 0x8000 && keycode < 0x9000) { - action_t action; - action.code = ACTION_LAYER_TAP_KEY((keycode >> 0x8) & 0xF, keycode & 0xFF); - return action; -#ifdef UNICODE_ENABLE - } else if (keycode >= 0x8000000) { - action_t action; - uint16_t unicode = keycode & ~(0x8000); - action.code = ACTION_FUNCTION_OPT(unicode & 0xFF, (unicode & 0xFF00) >> 8); - return action; -#endif - } else { - - } - switch (keycode) { case KC_FN0 ... KC_FN31: return keymap_fn_to_action(keycode); -#ifdef BOOTMAGIC_ENABLE case KC_CAPSLOCK: case KC_LOCKING_CAPS: if (keymap_config.swap_control_capslock || keymap_config.capslock_to_control) { @@ -224,7 +115,6 @@ action_t action_for_key(uint8_t layer, keypos_t key) return keycode_to_action(KC_BSLASH); } return keycode_to_action(KC_BSPACE); -#endif default: return keycode_to_action(keycode); } @@ -265,6 +155,142 @@ static action_t keycode_to_action(uint16_t keycode) case KC_TRNS: action.code = ACTION_TRANSPARENT; break; + case 0x0100 ... 0x1FFF: ; + // Has a modifier + // Split it up + action.code = ACTION_MODS_KEY(keycode >> 8, keycode & 0xFF); // adds modifier to key + break; + case 0x2000 ... 0x2FFF: + // Is a shortcut for function layer, pull last 12bits + // This means we have 4,096 FN macros at our disposal + return keymap_func_to_action(keycode & 0xFFF); + break; + case 0x3000 ... 0x3FFF: ; + // When the code starts with 3, it's an action macro. + action.code = ACTION_MACRO(keycode & 0xFF); + break; + #ifdef BACKLIGHT_ENABLE + case BL_0 ... BL_15: + action.code = ACTION_BACKLIGHT_LEVEL(keycode & 0x000F); + break; + case BL_DEC: + action.code = ACTION_BACKLIGHT_DECREASE(); + break; + case BL_INC: + action.code = ACTION_BACKLIGHT_INCREASE(); + break; + case BL_TOGG: + action.code = ACTION_BACKLIGHT_TOGGLE(); + break; + case BL_STEP: + action.code = ACTION_BACKLIGHT_STEP(); + break; + #endif + case RESET: ; // RESET is 0x5000, which is why this is here + clear_keyboard(); + #ifdef AUDIO_ENABLE + play_notes(&goodbye, 3, false); + #endif + _delay_ms(250); + #ifdef ATREUS_ASTAR + *(uint16_t *)0x0800 = 0x7777; // these two are a-star-specific + #endif + bootloader_jump(); + break; + case DEBUG: ; // DEBUG is 0x5001 + print("\nDEBUG: enabled.\n"); + debug_enable = true; + break; + case 0x5002 ... 0x50FF: + // MAGIC actions (BOOTMAGIC without the boot) + if (!eeconfig_is_enabled()) { + eeconfig_init(); + } + /* keymap config */ + keymap_config.raw = eeconfig_read_keymap(); + if (keycode == MAGIC_SWAP_CONTROL_CAPSLOCK) { + keymap_config.swap_control_capslock = 1; + } else if (keycode == MAGIC_CAPSLOCK_TO_CONTROL) { + keymap_config.capslock_to_control = 1; + } else if (keycode == MAGIC_SWAP_LALT_LGUI) { + keymap_config.swap_lalt_lgui = 1; + } else if (keycode == MAGIC_SWAP_RALT_RGUI) { + keymap_config.swap_ralt_rgui = 1; + } else if (keycode == MAGIC_NO_GUI) { + keymap_config.no_gui = 1; + } else if (keycode == MAGIC_SWAP_GRAVE_ESC) { + keymap_config.swap_grave_esc = 1; + } else if (keycode == MAGIC_SWAP_BACKSLASH_BACKSPACE) { + keymap_config.swap_backslash_backspace = 1; + } else if (keycode == MAGIC_HOST_NKRO) { + keymap_config.nkro = 1; + } else if (keycode == MAGIC_SWAP_ALT_GUI) { + keymap_config.swap_lalt_lgui = 1; + keymap_config.swap_ralt_rgui = 1; + } + /* UNs */ + else if (keycode == MAGIC_UNSWAP_CONTROL_CAPSLOCK) { + keymap_config.swap_control_capslock = 0; + } else if (keycode == MAGIC_UNCAPSLOCK_TO_CONTROL) { + keymap_config.capslock_to_control = 0; + } else if (keycode == MAGIC_UNSWAP_LALT_LGUI) { + keymap_config.swap_lalt_lgui = 0; + } else if (keycode == MAGIC_UNSWAP_RALT_RGUI) { + keymap_config.swap_ralt_rgui = 0; + } else if (keycode == MAGIC_UNNO_GUI) { + keymap_config.no_gui = 0; + } else if (keycode == MAGIC_UNSWAP_GRAVE_ESC) { + keymap_config.swap_grave_esc = 0; + } else if (keycode == MAGIC_UNSWAP_BACKSLASH_BACKSPACE) { + keymap_config.swap_backslash_backspace = 0; + } else if (keycode == MAGIC_UNHOST_NKRO) { + keymap_config.nkro = 0; + } else if (keycode == MAGIC_UNSWAP_ALT_GUI) { + keymap_config.swap_lalt_lgui = 0; + keymap_config.swap_ralt_rgui = 0; + } + eeconfig_write_keymap(keymap_config.raw); + break; + case 0x5100 ... 0x5FFF: ; + // Layer movement shortcuts + // See .h to see constraints/usage + int type = (keycode >> 0x8) & 0xF; + if (type == 0x1) { + // Layer set "GOTO" + int when = (keycode >> 0x4) & 0x3; + int layer = keycode & 0xF; + action.code = ACTION_LAYER_SET(layer, when); + } else if (type == 0x2) { + // Momentary layer + int layer = keycode & 0xFF; + action.code = ACTION_LAYER_MOMENTARY(layer); + } else if (type == 0x3) { + // Set default layer + int layer = keycode & 0xFF; + action.code = ACTION_DEFAULT_LAYER_SET(layer); + } else if (type == 0x4) { + // Set default layer + int layer = keycode & 0xFF; + action.code = ACTION_LAYER_TOGGLE(layer); + } + break; + #ifdef MIDI_ENABLE + case 0x6000 ... 0x6FFF: + action.code = ACTION_FUNCTION_OPT(keycode & 0xFF, (keycode & 0x0F00) >> 8); + break; + #endif + case 0x7000 ... 0x7FFF: + action.code = ACTION_MODS_TAP_KEY((keycode >> 0x8) & 0xF, keycode & 0xFF); + break; + case 0x8000 ... 0x8FFF: + action.code = ACTION_LAYER_TAP_KEY((keycode >> 0x8) & 0xF, keycode & 0xFF); + break; + #ifdef UNICODE_ENABLE + case 0x8000000 ... 0x8FFFFFF: + uint16_t unicode = keycode & ~(0x8000); + action.code = ACTION_FUNCTION_OPT(unicode & 0xFF, (unicode & 0xFF00) >> 8); + break; + #endif default: action.code = ACTION_NO; break; diff --git a/quantum/keymap_common.h b/quantum/keymap_common.h index 7452a1ff3..ce87e4770 100644 --- a/quantum/keymap_common.h +++ b/quantum/keymap_common.h @@ -30,7 +30,6 @@ along with this program. If not, see . // #include "print.h" #include "debug.h" -#ifdef BOOTMAGIC_ENABLE /* NOTE: Not portable. Bit field order depends on implementation */ typedef union { uint16_t raw; @@ -45,8 +44,6 @@ typedef union { bool nkro:1; }; } keymap_config_t; -keymap_config_t keymap_config; -#endif /* translates key to keycode */ @@ -168,6 +165,30 @@ extern const uint16_t fn_actions[]; #define RESET 0x5000 #define DEBUG 0x5001 +// MAGIC keycodes +#define MAGIC_SWAP_CONTROL_CAPSLOCK 0x5002 +#define MAGIC_UNSWAP_CONTROL_CAPSLOCK 0x5003 +#define MAGIC_CAPSLOCK_TO_CONTROL 0x5004 +#define MAGIC_UNCAPSLOCK_TO_CONTROL 0x5005 +#define MAGIC_SWAP_LALT_LGUI 0x5006 +#define MAGIC_UNSWAP_LALT_LGUI 0x5007 +#define MAGIC_SWAP_RALT_RGUI 0x5008 +#define MAGIC_UNSWAP_RALT_RGUI 0x5009 +#define MAGIC_NO_GUI 0x500a +#define MAGIC_UNNO_GUI 0x500b +#define MAGIC_SWAP_GRAVE_ESC 0x500c +#define MAGIC_UNSWAP_GRAVE_ESC 0x500d +#define MAGIC_SWAP_BACKSLASH_BACKSPACE 0x500e +#define MAGIC_UNSWAP_BACKSLASH_BACKSPACE 0x500f +#define MAGIC_HOST_NKRO 0x5010 +#define MAGIC_UNHOST_NKRO 0x5011 +#define MAGIC_SWAP_ALT_GUI 0x5012 +#define MAGIC_UNSWAP_ALT_GUI 0x5013 + +#define AG_SWAP MAGIC_SWAP_ALT_GUI +#define AG_NORM MAGIC_UNSWAP_ALT_GUI + + // GOTO layer - 16 layers max // when: // ON_PRESS = 1 @@ -213,4 +234,5 @@ void update_tri_layer(uint8_t layer1, uint8_t layer2, uint8_t layer3); #define IS_LAYER_ON(layer) ((layer_state) & (1UL<<(layer))) #define IS_LAYER_OFF(layer) ((!layer_state) & (1UL<<(layer))) + #endif diff --git a/tmk_core/common.mk b/tmk_core/common.mk index f8006c670..9cb2eb8ec 100644 --- a/tmk_core/common.mk +++ b/tmk_core/common.mk @@ -21,6 +21,9 @@ ifeq ($(strip $(BOOTMAGIC_ENABLE)), yes) SRC += $(COMMON_DIR)/bootmagic.c SRC += $(COMMON_DIR)/avr/eeconfig.c OPT_DEFS += -DBOOTMAGIC_ENABLE +else + SRC += $(COMMON_DIR)/magic.c + SRC += $(COMMON_DIR)/avr/eeconfig.c endif ifeq ($(strip $(MOUSEKEY_ENABLE)), yes) diff --git a/tmk_core/common/keyboard.c b/tmk_core/common/keyboard.c index 302b3ec87..1d9981848 100644 --- a/tmk_core/common/keyboard.c +++ b/tmk_core/common/keyboard.c @@ -27,7 +27,11 @@ along with this program. If not, see . #include "command.h" #include "util.h" #include "sendchar.h" -#include "bootmagic.h" +#ifdef BOOTMAGIC_ENABLE + #include "bootmagic.h" +#else + #include "magic.h" +#endif #include "eeconfig.h" #include "backlight.h" #ifdef MOUSEKEY_ENABLE @@ -86,6 +90,8 @@ void keyboard_init(void) #ifdef BOOTMAGIC_ENABLE bootmagic(); +#else + magic(); #endif #ifdef BACKLIGHT_ENABLE diff --git a/tmk_core/common/keymap.h b/tmk_core/common/keymap.h index e1a6f992e..abc9bdb32 100644 --- a/tmk_core/common/keymap.h +++ b/tmk_core/common/keymap.h @@ -22,8 +22,6 @@ along with this program. If not, see . #include #include "action.h" - -#ifdef BOOTMAGIC_ENABLE /* NOTE: Not portable. Bit field order depends on implementation */ typedef union { uint8_t raw; @@ -39,7 +37,6 @@ typedef union { }; } keymap_config_t; keymap_config_t keymap_config; -#endif /* translates key to keycode */ diff --git a/tmk_core/common/magic.c b/tmk_core/common/magic.c new file mode 100644 index 000000000..f21d1346c --- /dev/null +++ b/tmk_core/common/magic.c @@ -0,0 +1,36 @@ +#include +#include +#include +#include "matrix.h" +#include "bootloader.h" +#include "debug.h" +#include "keymap.h" +#include "host.h" +#include "action_layer.h" +#include "eeconfig.h" +#include "magic.h" + +keymap_config_t keymap_config; + +void magic(void) +{ + /* check signature */ + if (!eeconfig_is_enabled()) { + eeconfig_init(); + } + + /* debug enable */ + debug_config.raw = eeconfig_read_debug(); + + /* keymap config */ + keymap_config.raw = eeconfig_read_keymap(); + +#ifdef NKRO_ENABLE + keyboard_nkro = keymap_config.nkro; +#endif + + uint8_t default_layer = 0; + default_layer = eeconfig_read_default_layer(); + default_layer_set((uint32_t)default_layer); + +} \ No newline at end of file diff --git a/tmk_core/common/magic.h b/tmk_core/common/magic.h new file mode 100644 index 000000000..3fa2d8b81 --- /dev/null +++ b/tmk_core/common/magic.h @@ -0,0 +1,6 @@ +#ifndef MAGIC_H +#define MAGIC_H + +void magic(void); + +#endif -- cgit v1.2.3-70-g09d2 From c83aa16f1d614c1c10f7597a67ffb9f2ae871951 Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Sat, 16 Apr 2016 20:26:02 -0400 Subject: fixes audio prescaler to emit correct freq --- keyboard/preonic/keymaps/default/keymap.c | 52 +++++++++++++++---------------- quantum/audio.c | 12 ++++--- quantum/keymap_common.c | 6 ++-- 3 files changed, 36 insertions(+), 34 deletions(-) (limited to 'quantum') diff --git a/keyboard/preonic/keymaps/default/keymap.c b/keyboard/preonic/keymaps/default/keymap.c index e1f9b6202..6b6262318 100644 --- a/keyboard/preonic/keymaps/default/keymap.c +++ b/keyboard/preonic/keymaps/default/keymap.c @@ -186,48 +186,48 @@ const uint16_t PROGMEM fn_actions[] = { #ifdef AUDIO_ENABLE float start_up[][2] = { - {440.0*pow(2.0,(50)/12.0), 20}, - {440.0*pow(2.0,(62)/12.0), 8}, - {440.0*pow(2.0,(54)/12.0), 20}, - {440.0*pow(2.0,(62)/12.0), 8} + {440.0*pow(2.0,(14)/12.0), 20}, + {440.0*pow(2.0,(26)/12.0), 8}, + {440.0*pow(2.0,(18)/12.0), 20}, + {440.0*pow(2.0,(26)/12.0), 8} }; float tone_qwerty[][2] = { - {440.0*pow(2.0,(59)/12.0), 8}, - {440.0*pow(2.0,(60)/12.0), 8}, + {440.0*pow(2.0,(23)/12.0), 8}, + {440.0*pow(2.0,(24)/12.0), 8}, {0, 4}, - {440.0*pow(2.0,(67)/12.0), 16} + {440.0*pow(2.0,(31)/12.0), 16} }; float tone_colemak[][2] = { - {440.0*pow(2.0,(59)/12.0), 8}, - {440.0*pow(2.0,(60)/12.0), 8}, + {440.0*pow(2.0,(23)/12.0), 8}, + {440.0*pow(2.0,(24)/12.0), 8}, {0, 4}, - {440.0*pow(2.0,(67)/12.0), 12}, + {440.0*pow(2.0,(31)/12.0), 12}, {0, 4}, - {440.0*pow(2.0,(71)/12.0), 12} + {440.0*pow(2.0,(35)/12.0), 12} }; float tone_dvorak[][2] = { - {440.0*pow(2.0,(59)/12.0), 8}, - {440.0*pow(2.0,(60)/12.0), 8}, + {440.0*pow(2.0,(23)/12.0), 8}, + {440.0*pow(2.0,(24)/12.0), 8}, {0, 4}, - {440.0*pow(2.0,(67)/12.0), 8}, + {440.0*pow(2.0,(31)/12.0), 8}, {0, 4}, - {440.0*pow(2.0,(69)/12.0), 8}, + {440.0*pow(2.0,(33)/12.0), 8}, {0, 4}, - {440.0*pow(2.0,(67)/12.0), 8} + {440.0*pow(2.0,(31)/12.0), 8} }; float tone_music[][2] = { - {440.0*pow(2.0,(48)/12.0), 8}, - {440.0*pow(2.0,(50)/12.0), 8}, - {440.0*pow(2.0,(52)/12.0), 8}, - {440.0*pow(2.0,(53)/12.0), 8}, - {440.0*pow(2.0,(55)/12.0), 8}, - {440.0*pow(2.0,(57)/12.0), 8}, - {440.0*pow(2.0,(59)/12.0), 8}, - {440.0*pow(2.0,(60)/12.0), 8} + {440.0*pow(2.0,(12)/12.0), 8}, + {440.0*pow(2.0,(14)/12.0), 8}, + {440.0*pow(2.0,(16)/12.0), 8}, + {440.0*pow(2.0,(17)/12.0), 8}, + {440.0*pow(2.0,(19)/12.0), 8}, + {440.0*pow(2.0,(21)/12.0), 8}, + {440.0*pow(2.0,(23)/12.0), 8}, + {440.0*pow(2.0,(24)/12.0), 8} }; #endif @@ -333,9 +333,9 @@ void process_action_user(keyrecord_t *record) { if (IS_LAYER_ON(_MUSIC)) { if (record->event.pressed) { - play_note(((double)261.626)*pow(2.0, -2.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.626)*pow(2.0, -3.0)*pow(2.0,(starting_note + SCALE[record->event.key.col + offset])/12.0+(MATRIX_ROWS - record->event.key.row)), 0xF); } else { - stop_note(((double)261.626)*pow(2.0, -2.0)*pow(2.0,(starting_note + SCALE[record->event.key.col + offset])/12.0+(MATRIX_ROWS - record->event.key.row))); + stop_note(((double)261.626)*pow(2.0, -3.0)*pow(2.0,(starting_note + SCALE[record->event.key.col + offset])/12.0+(MATRIX_ROWS - record->event.key.row))); } } diff --git a/quantum/audio.c b/quantum/audio.c index 5edcccdbe..470dc8e0c 100644 --- a/quantum/audio.c +++ b/quantum/audio.c @@ -12,6 +12,8 @@ #define PI 3.14159265 +#define CPU_PRESCALER 8 + // #define PWM_AUDIO #ifdef PWM_AUDIO @@ -244,12 +246,12 @@ ISR(TIMER3_COMPA_vect) { // ICR3 = (int)(((double)F_CPU) / frequency); // Set max to the period // OCR3A = (int)(((double)F_CPU) / frequency) >> 1; // Set compare to half the period voice_place %= voices; - if (place > (frequencies[voice_place] / 500)) { + if (place > (frequencies[voice_place] / 50)) { voice_place = (voice_place + 1) % voices; place = 0.0; } - ICR3 = (int)(((double)F_CPU) / frequencies[voice_place]); // Set max to the period - OCR3A = (int)(((double)F_CPU) / frequencies[voice_place]) >> 1 * duty_place; // Set compare to half the period + ICR3 = (int)(((double)F_CPU) / (frequencies[voice_place] * CPU_PRESCALER)); // Set max to the period + OCR3A = (int)(((double)F_CPU) / (frequencies[voice_place] * CPU_PRESCALER)) >> 1 * duty_place; // Set compare to half the period place++; // if (duty_counter > (frequencies[voice_place] / 500)) { // duty_place = (duty_place % 3) + 1; @@ -281,8 +283,8 @@ ISR(TIMER3_COMPA_vect) { place -= SINE_LENGTH; #else if (note_frequency > 0) { - ICR3 = (int)(((double)F_CPU) / note_frequency); // Set max to the period - OCR3A = (int)(((double)F_CPU) / note_frequency) >> 1; // Set compare to half the period + ICR3 = (int)(((double)F_CPU) / (note_frequency * CPU_PRESCALER)); // Set max to the period + OCR3A = (int)(((double)F_CPU) / (note_frequency * CPU_PRESCALER)) >> 1; // Set compare to half the period } else { ICR3 = 0; OCR3A = 0; diff --git a/quantum/keymap_common.c b/quantum/keymap_common.c index b91916685..899437f44 100644 --- a/quantum/keymap_common.c +++ b/quantum/keymap_common.c @@ -35,9 +35,9 @@ extern keymap_config_t keymap_config; #include "audio.h" float goodbye[][2] = { - {440.0*pow(2.0,(67)/12.0), 8}, - {440.0*pow(2.0,(60)/12.0), 8}, - {440.0*pow(2.0,(55)/12.0), 12}, + {440.0*pow(2.0,(31)/12.0), 8}, + {440.0*pow(2.0,(24)/12.0), 8}, + {440.0*pow(2.0,(19)/12.0), 12}, }; #endif -- cgit v1.2.3-70-g09d2 From 41cc35425ab32c9a9492006da8b667d01d32dfa6 Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Sat, 16 Apr 2016 21:31:40 -0400 Subject: rests between notes as an argument --- keyboard/planck/keymaps/default/keymap.c | 10 +++++----- keyboard/preonic/keymaps/default/keymap.c | 16 ++++++++-------- quantum/audio.c | 29 +++++++++++++++++++++-------- quantum/audio.h | 3 ++- quantum/keymap_common.c | 2 +- 5 files changed, 37 insertions(+), 23 deletions(-) (limited to 'quantum') diff --git a/keyboard/planck/keymaps/default/keymap.c b/keyboard/planck/keymaps/default/keymap.c index ede08ad7f..a6edefefd 100644 --- a/keyboard/planck/keymaps/default/keymap.c +++ b/keyboard/planck/keymaps/default/keymap.c @@ -194,7 +194,7 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) case _QW: if (record->event.pressed) { #ifdef AUDIO_ENABLE - play_notes(&tone_qw, 4, false); + play_notes(&tone_qw, 4, false, 0); #endif default_layer_set(1UL<<_QW); } @@ -202,7 +202,7 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) case _CM: if (record->event.pressed) { #ifdef AUDIO_ENABLE - play_notes(&tone_cm, 6, false); + play_notes(&tone_cm, 6, false, 0); #endif default_layer_set(1UL<<_CM); } @@ -210,7 +210,7 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) case _DV: if (record->event.pressed) { #ifdef AUDIO_ENABLE - play_notes(&tone_dv, 8, false); + play_notes(&tone_dv, 8, false, 0); #endif default_layer_set(1UL<<_DV); } @@ -254,7 +254,7 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) if (record->event.pressed) { #ifdef AUDIO_ENABLE audio_on(); - play_notes(&start_up, 5, false); + play_notes(&start_up, 5, false, 0); #endif } break; @@ -265,6 +265,6 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) void matrix_init_user(void) { #ifdef AUDIO_ENABLE init_notes(); - play_notes(&start_up, 5, false); + play_notes(&start_up, 5, false, 0); #endif } diff --git a/keyboard/preonic/keymaps/default/keymap.c b/keyboard/preonic/keymaps/default/keymap.c index 6b6262318..1223793cf 100644 --- a/keyboard/preonic/keymaps/default/keymap.c +++ b/keyboard/preonic/keymaps/default/keymap.c @@ -242,7 +242,7 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) case _QWERTY: if (record->event.pressed) { #ifdef AUDIO_ENABLE - play_notes(&tone_qwerty, 4, false); + play_notes(&tone_qwerty, 4, false, 0); #endif persistant_default_layer_set(1UL<<_QWERTY); } @@ -250,7 +250,7 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) case _COLEMAK: if (record->event.pressed) { #ifdef AUDIO_ENABLE - play_notes(&tone_colemak, 6, false); + play_notes(&tone_colemak, 6, false, 1); #endif persistant_default_layer_set(1UL<<_COLEMAK); } @@ -258,7 +258,7 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) case _DVORAK: if (record->event.pressed) { #ifdef AUDIO_ENABLE - play_notes(&tone_dvorak, 8, false); + play_notes(&tone_dvorak, 8, false, 10); #endif persistant_default_layer_set(1UL<<_DVORAK); } @@ -302,7 +302,7 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) if (record->event.pressed) { #ifdef AUDIO_ENABLE audio_on(); - play_notes(&start_up, 4, false); + play_notes(&start_up, 4, false, 0); #endif } break; @@ -317,7 +317,7 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) case 9: if (record->event.pressed) { #ifdef AUDIO_ENABLE - play_notes(&tone_music, 8, false); + play_notes(&tone_music, 8, false, 0); layer_on(_MUSIC); #endif } @@ -333,9 +333,9 @@ void process_action_user(keyrecord_t *record) { if (IS_LAYER_ON(_MUSIC)) { if (record->event.pressed) { - play_note(((double)261.626)*pow(2.0, -3.0)*pow(2.0,(starting_note + SCALE[record->event.key.col + offset])/12.0+(MATRIX_ROWS - record->event.key.row)), 0xF); + play_note(((double)220.0)*pow(2.0, -4.0)*pow(2.0,(starting_note + SCALE[record->event.key.col + offset])/12.0+(MATRIX_ROWS - record->event.key.row)), 0xF); } else { - stop_note(((double)261.626)*pow(2.0, -3.0)*pow(2.0,(starting_note + SCALE[record->event.key.col + offset])/12.0+(MATRIX_ROWS - record->event.key.row))); + stop_note(((double)220.0)*pow(2.0, -4.0)*pow(2.0,(starting_note + SCALE[record->event.key.col + offset])/12.0+(MATRIX_ROWS - record->event.key.row))); } } @@ -344,6 +344,6 @@ void process_action_user(keyrecord_t *record) { void matrix_init_user(void) { #ifdef AUDIO_ENABLE init_notes(); - play_notes(&start_up, 4, false); + play_notes(&start_up, 4, false, 0); #endif } diff --git a/quantum/audio.c b/quantum/audio.c index 470dc8e0c..40d09d62f 100644 --- a/quantum/audio.c +++ b/quantum/audio.c @@ -61,7 +61,11 @@ uint16_t note_position = 0; float (* notes_pointer)[][2]; uint8_t notes_length; bool notes_repeat; +float notes_rest; +bool note_resting = false; + uint8_t current_note = 0; +uint8_t rest_counter = 0; audio_config_t audio_config; @@ -314,13 +318,21 @@ ISR(TIMER3_COMPA_vect) { return; } } - #ifdef PWM_AUDIO - note_frequency = (*notes_pointer)[current_note][0] / SAMPLE_RATE; - note_length = (*notes_pointer)[current_note][1]; - #else - note_frequency = (*notes_pointer)[current_note][0]; - note_length = (*notes_pointer)[current_note][1] / 4; - #endif + if (!note_resting && ((int)notes_rest != 0)) { + note_resting = true; + note_frequency = 0; + note_length = notes_rest; + current_note--; + } else { + note_resting = false; + #ifdef PWM_AUDIO + note_frequency = (*notes_pointer)[current_note][0] / SAMPLE_RATE; + note_length = (*notes_pointer)[current_note][1]; + #else + note_frequency = (*notes_pointer)[current_note][0]; + note_length = (*notes_pointer)[current_note][1] / 4; + #endif + } note_position = 0; } @@ -332,7 +344,7 @@ ISR(TIMER3_COMPA_vect) { } } -void play_notes(float (*np)[][2], uint8_t n_length, bool n_repeat) { +void play_notes(float (*np)[][2], uint8_t n_length, bool n_repeat, float n_rest) { if (audio_config.enable) { @@ -343,6 +355,7 @@ if (audio_config.enable) { notes_pointer = np; notes_length = n_length; notes_repeat = n_repeat; + notes_rest = n_rest; place = 0; current_note = 0; diff --git a/quantum/audio.h b/quantum/audio.h index 58270015d..65a6f9434 100644 --- a/quantum/audio.h +++ b/quantum/audio.h @@ -2,6 +2,7 @@ #include #include #include +#include "musical_notes.h" typedef union { uint8_t raw; @@ -20,4 +21,4 @@ void play_note(double freq, int vol); void stop_note(double freq); void stop_all_notes(); void init_notes(); -void play_notes(float (*np)[][2], uint8_t n_length, bool n_repeat); +void play_notes(float (*np)[][2], uint8_t n_length, bool n_repeat, float n_rest); diff --git a/quantum/keymap_common.c b/quantum/keymap_common.c index 899437f44..457f70a44 100644 --- a/quantum/keymap_common.c +++ b/quantum/keymap_common.c @@ -189,7 +189,7 @@ static action_t keycode_to_action(uint16_t keycode) case RESET: ; // RESET is 0x5000, which is why this is here clear_keyboard(); #ifdef AUDIO_ENABLE - play_notes(&goodbye, 3, false); + play_notes(&goodbye, 3, false, 0); #endif _delay_ms(250); #ifdef ATREUS_ASTAR -- cgit v1.2.3-70-g09d2 From 8bbd064cf52a76508589579f19595607a1f3af21 Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Sat, 16 Apr 2016 23:07:50 -0400 Subject: changes to play_notes, goodbye --- keyboard/planck/keymaps/default/keymap.c | 10 +++++----- keyboard/preonic/Makefile | 2 +- keyboard/preonic/config.h | 4 ++-- keyboard/preonic/keymaps/default/keymap.c | 12 ++++++------ quantum/audio.c | 2 +- quantum/keymap_common.c | 16 +++++++++------- 6 files changed, 24 insertions(+), 22 deletions(-) (limited to 'quantum') diff --git a/keyboard/planck/keymaps/default/keymap.c b/keyboard/planck/keymaps/default/keymap.c index a6edefefd..5591b337d 100644 --- a/keyboard/planck/keymaps/default/keymap.c +++ b/keyboard/planck/keymaps/default/keymap.c @@ -194,7 +194,7 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) case _QW: if (record->event.pressed) { #ifdef AUDIO_ENABLE - play_notes(&tone_qw, 4, false, 0); + play_notes(&tone_qw, false, 0); #endif default_layer_set(1UL<<_QW); } @@ -202,7 +202,7 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) case _CM: if (record->event.pressed) { #ifdef AUDIO_ENABLE - play_notes(&tone_cm, 6, false, 0); + play_notes(&tone_cm, false, 0); #endif default_layer_set(1UL<<_CM); } @@ -210,7 +210,7 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) case _DV: if (record->event.pressed) { #ifdef AUDIO_ENABLE - play_notes(&tone_dv, 8, false, 0); + play_notes(&tone_dv, false, 0); #endif default_layer_set(1UL<<_DV); } @@ -254,7 +254,7 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) if (record->event.pressed) { #ifdef AUDIO_ENABLE audio_on(); - play_notes(&start_up, 5, false, 0); + play_notes(&start_up, false, 0); #endif } break; @@ -265,6 +265,6 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) void matrix_init_user(void) { #ifdef AUDIO_ENABLE init_notes(); - play_notes(&start_up, 5, false, 0); + play_notes(&start_up, false, 0); #endif } diff --git a/keyboard/preonic/Makefile b/keyboard/preonic/Makefile index 9199968c3..3504e2720 100644 --- a/keyboard/preonic/Makefile +++ b/keyboard/preonic/Makefile @@ -133,7 +133,7 @@ OPT_DEFS += -DBOOTLOADER_SIZE=4096 BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) MOUSEKEY_ENABLE = yes # Mouse keys(+4700) EXTRAKEY_ENABLE = yes # Audio control and System control(+450) -CONSOLE_ENABLE = yes # Console for debug(+400) +CONSOLE_ENABLE = no # Console for debug(+400) COMMAND_ENABLE = yes # Commands for debug and configuration NKRO_ENABLE = no # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality diff --git a/keyboard/preonic/config.h b/keyboard/preonic/config.h index 5528667fa..bb9d29dab 100644 --- a/keyboard/preonic/config.h +++ b/keyboard/preonic/config.h @@ -73,10 +73,10 @@ along with this program. If not, see . */ /* 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/preonic/keymaps/default/keymap.c b/keyboard/preonic/keymaps/default/keymap.c index 1223793cf..c7b6b89f2 100644 --- a/keyboard/preonic/keymaps/default/keymap.c +++ b/keyboard/preonic/keymaps/default/keymap.c @@ -242,7 +242,7 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) case _QWERTY: if (record->event.pressed) { #ifdef AUDIO_ENABLE - play_notes(&tone_qwerty, 4, false, 0); + play_notes(&tone_qwerty, false, 0); #endif persistant_default_layer_set(1UL<<_QWERTY); } @@ -250,7 +250,7 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) case _COLEMAK: if (record->event.pressed) { #ifdef AUDIO_ENABLE - play_notes(&tone_colemak, 6, false, 1); + play_notes(&tone_colemak, false, 0); #endif persistant_default_layer_set(1UL<<_COLEMAK); } @@ -258,7 +258,7 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) case _DVORAK: if (record->event.pressed) { #ifdef AUDIO_ENABLE - play_notes(&tone_dvorak, 8, false, 10); + play_notes(&tone_dvorak, false, 0); #endif persistant_default_layer_set(1UL<<_DVORAK); } @@ -302,7 +302,7 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) if (record->event.pressed) { #ifdef AUDIO_ENABLE audio_on(); - play_notes(&start_up, 4, false, 0); + play_notes(&start_up, false, 0); #endif } break; @@ -317,7 +317,7 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) case 9: if (record->event.pressed) { #ifdef AUDIO_ENABLE - play_notes(&tone_music, 8, false, 0); + play_notes(&tone_music, false, 0); layer_on(_MUSIC); #endif } @@ -344,6 +344,6 @@ void process_action_user(keyrecord_t *record) { void matrix_init_user(void) { #ifdef AUDIO_ENABLE init_notes(); - play_notes(&start_up, 4, false, 0); + play_notes(&start_up, false, 0); #endif } diff --git a/quantum/audio.c b/quantum/audio.c index 40d09d62f..773edfd8e 100644 --- a/quantum/audio.c +++ b/quantum/audio.c @@ -318,7 +318,7 @@ ISR(TIMER3_COMPA_vect) { return; } } - if (!note_resting && ((int)notes_rest != 0)) { + if (!note_resting && (notes_rest > 0)) { note_resting = true; note_frequency = 0; note_length = notes_rest; diff --git a/quantum/keymap_common.c b/quantum/keymap_common.c index 457f70a44..8f35521a2 100644 --- a/quantum/keymap_common.c +++ b/quantum/keymap_common.c @@ -33,12 +33,14 @@ extern keymap_config_t keymap_config; #include #ifdef AUDIO_ENABLE #include "audio.h" - - float goodbye[][2] = { - {440.0*pow(2.0,(31)/12.0), 8}, - {440.0*pow(2.0,(24)/12.0), 8}, - {440.0*pow(2.0,(19)/12.0), 12}, - }; + #ifndef GOODBYE_TUNE + #define GOODBYE_TUNE { \ + {440.0*pow(2.0,(31)/12.0), 8}, \ + {440.0*pow(2.0,(24)/12.0), 8}, \ + {440.0*pow(2.0,(19)/12.0), 12}, \ + } + #endif + float goodbye_tune[][2] = GOODBYE_TUNE; #endif static action_t keycode_to_action(uint16_t keycode); @@ -189,7 +191,7 @@ static action_t keycode_to_action(uint16_t keycode) case RESET: ; // RESET is 0x5000, which is why this is here clear_keyboard(); #ifdef AUDIO_ENABLE - play_notes(&goodbye, 3, false, 0); + play_notes(&goodbye_tune, false, 0); #endif _delay_ms(250); #ifdef ATREUS_ASTAR -- cgit v1.2.3-70-g09d2 From 45f10b4c4b308226fa1568277654a13853a03ab4 Mon Sep 17 00:00:00 2001 From: IBNobody Date: Sat, 16 Apr 2016 22:10:18 -0500 Subject: Fixed how note arrays are used. --- keyboard/atomic/keymaps/pvc/keymap.c | 44 ++++++++---------------------------- quantum/audio.c | 14 ++++++------ quantum/audio.h | 17 ++++++++++++-- quantum/keymap_common.c | 4 ++-- quantum/musical_notes.h | 7 +++++- 5 files changed, 39 insertions(+), 47 deletions(-) (limited to 'quantum') diff --git a/keyboard/atomic/keymaps/pvc/keymap.c b/keyboard/atomic/keymaps/pvc/keymap.c index 229708344..c2081f525 100644 --- a/keyboard/atomic/keymaps/pvc/keymap.c +++ b/keyboard/atomic/keymaps/pvc/keymap.c @@ -75,8 +75,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { }, }; -#define IS_LAYER_ON(layer) (layer_state & (1UL << (layer))) -#define IS_LAYER_OFF(layer) (!IS_LAYER_ON(layer)) #ifdef AUDIO_ENABLE @@ -201,24 +199,14 @@ Q_NOTE(_B8 ) , }; float tone_rs[][2] = { -Q_NOTE(_F8 ) , -Q_NOTE(_G8 ) , -Q_NOTE(_GS8 ) , -Q_NOTE(_A8 ) , +Q_NOTE(_A4 ) , +Q_NOTE(_A4 ) , +Q_NOTE(_A4 ) , +Q_NOTE(_A4 ) , Q_NOTE(_AS8 ) , Q_NOTE(_B8 ) , }; -float tone_fn[][2] = { - {440.0*pow(2.0,(59)/12.0), 8}, - {440.0*pow(2.0,(60)/12.0), 8}, - {0, 4}, - {440.0*pow(2.0,(67)/12.0), 16}, - {0, 4}, - {440.0*pow(2.0,(69)/12.0), 16}, - {0, 4}, - {440.0*pow(2.0,(67)/12.0), 16} -}; #endif void update_quad_layer(uint8_t layer1, uint8_t layer2, uint8_t layer3, uint8_t layer4, bool order) @@ -253,18 +241,18 @@ void update_quad_layer(uint8_t layer1, uint8_t layer2, uint8_t layer3, uint8_t l const uint16_t PROGMEM fn_actions[] = { }; -#define ARRAY_SIZE(x) ((sizeof x) / (sizeof *x)) +//#define MUSIC_ARRAY_SIZE(x) (((int)(sizeof(x) / (sizeof(x[0][0])))) / 2) const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) { + // MACRODOWN only works in this function switch(id) { case M_LW: if (record->event.pressed) { #ifdef AUDIO_ENABLE println("PlayNotes LW"); - print_val_hex32(ARRAY_SIZE(tone_lw)); - play_notes(&tone_lw, 96, false); + PLAY_NOTE_ARRAY(tone_lw, false, STACCATO); #endif layer_on(_LW); update_tri_layer(_LW, _RS, _FN); @@ -277,7 +265,7 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) if (record->event.pressed) { #ifdef AUDIO_ENABLE println("PlayNotes RS"); - play_notes(&tone_rs, 6, false); + PLAY_NOTE_ARRAY(tone_rs, false, LEGATO); #endif layer_on(_RS); update_tri_layer(_LW, _RS, _FN); @@ -295,33 +283,19 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) #ifdef AUDIO_ENABLE float start_up[][2] = { Q_NOTE(_E4 ) , -{0,1} , Q_NOTE(_E4 ) , -{0,1} , Q_NOTE(_F4 ) , -{0,1} , Q_NOTE(_G4 ) , -{0,1} , Q_NOTE(_G4 ) , -{0,1} , Q_NOTE(_F4 ) , -{0,1} , Q_NOTE(_E4 ) , -{0,1} , Q_NOTE(_D4 ) , -{0,1} , Q_NOTE(_C4 ) , -{0,1} , Q_NOTE(_C4 ) , -{0,1} , Q_NOTE(_D4 ) , -{0,1} , Q_NOTE(_E4 ) , -{0,1} , H_NOTE(_E4 ) , -{0,1} , Q_NOTE(_D4 ) , -{0,1} , H_NOTE(_D4 ) , }; #endif @@ -329,7 +303,7 @@ H_NOTE(_D4 ) , void matrix_init_user(void) { #ifdef AUDIO_ENABLE init_notes(); - play_notes(&start_up, 29, false); + PLAY_NOTE_ARRAY(start_up, false, STACCATO); println("Matrix Init"); #endif } diff --git a/quantum/audio.c b/quantum/audio.c index 40d09d62f..90f3c5a13 100644 --- a/quantum/audio.c +++ b/quantum/audio.c @@ -181,7 +181,7 @@ void init_notes() { DDRC |= _BV(PORTC6); TIMSK3 &= ~_BV(OCIE3A); // Turn off 3A interputs - + TCCR3A = 0x0; // Options not needed TCCR3B = _BV(CS31) | _BV(CS30) | _BV(WGM32); // 64th prescaling and CTC OCR3A = SAMPLE_DIVIDER - 1; // Correct count/compare, related to sample playback @@ -202,14 +202,14 @@ ISR(TIMER3_COMPA_vect) { if (voices == 1) { // SINE OCR4A = pgm_read_byte(&sinewave[(uint16_t)place]) >> 2; - + // SQUARE // if (((int)place) >= 1024){ // OCR4A = 0xFF >> 2; // } else { // OCR4A = 0x00; // } - + // SAWTOOTH // OCR4A = (int)place / 4; @@ -298,9 +298,9 @@ ISR(TIMER3_COMPA_vect) { note_position++; bool end_of_note = false; - if (ICR3 > 0) + if (ICR3 > 0) end_of_note = (note_position >= (note_length / ICR3 * 0xFFFF)); - else + else end_of_note = (note_position >= (note_length * 0x7FF)); if (end_of_note) { current_note++; @@ -318,7 +318,7 @@ ISR(TIMER3_COMPA_vect) { return; } } - if (!note_resting && ((int)notes_rest != 0)) { + if (!note_resting && (notes_rest > 0)) { note_resting = true; note_frequency = 0; note_length = notes_rest; @@ -412,7 +412,7 @@ if (audio_config.enable && voices < 8) { if (frequency != 0) { double starting_f = frequency; if (frequency < freq) { - for (double f = starting_f; f <= freq; f += ((freq - starting_f) / 2000.0)) { + for (double f = starting_f; f <= freq; f += ((freq - starting_f) / 2000.0)) { frequency = f; } } else if (frequency > freq) { diff --git a/quantum/audio.h b/quantum/audio.h index 65a6f9434..762c98064 100644 --- a/quantum/audio.h +++ b/quantum/audio.h @@ -4,6 +4,9 @@ #include #include "musical_notes.h" +#ifndef AUDIO_H +#define AUDIO_H + typedef union { uint8_t raw; struct { @@ -19,6 +22,16 @@ void audio_off(void); void play_sample(uint8_t * s, uint16_t l, bool r); void play_note(double freq, int vol); void stop_note(double freq); -void stop_all_notes(); -void init_notes(); +void stop_all_notes(void); +void init_notes(void); void play_notes(float (*np)[][2], uint8_t n_length, bool n_repeat, float n_rest); + + +// These macros are used to allow play_notes to play an array of indeterminate +// length. This works around the limitation of C's sizeof operation on pointers. +// The global float array for the song must be used here. +#define NOTE_ARRAY_SIZE(x) ((int)(sizeof(x) / (sizeof(x[0])))) +#define PLAY_NOTE_ARRAY(note_array, note_repeat, note_rest_style) play_notes(¬e_array, NOTE_ARRAY_SIZE((note_array)), (note_repeat), (note_rest_style)); + + +#endif \ No newline at end of file diff --git a/quantum/keymap_common.c b/quantum/keymap_common.c index 457f70a44..61a51aedb 100644 --- a/quantum/keymap_common.c +++ b/quantum/keymap_common.c @@ -189,7 +189,7 @@ static action_t keycode_to_action(uint16_t keycode) case RESET: ; // RESET is 0x5000, which is why this is here clear_keyboard(); #ifdef AUDIO_ENABLE - play_notes(&goodbye, 3, false, 0); + PLAY_NOTE_ARRAY(goodbye, false, 0); #endif _delay_ms(250); #ifdef ATREUS_ASTAR @@ -202,7 +202,7 @@ static action_t keycode_to_action(uint16_t keycode) debug_enable = true; break; case 0x5002 ... 0x50FF: - // MAGIC actions (BOOTMAGIC without the boot) + // MAGIC actions (BOOTMAGIC without the boot) if (!eeconfig_is_enabled()) { eeconfig_init(); } diff --git a/quantum/musical_notes.h b/quantum/musical_notes.h index 79f04fd98..837f6a069 100644 --- a/quantum/musical_notes.h +++ b/quantum/musical_notes.h @@ -9,7 +9,7 @@ #define WHOLE_NOTE(note) {(NOTE##note), 64} #define HALF_NOTE(note) {(NOTE##note), 32} #define QUARTER_NOTE(note) {(NOTE##note), 16} -#define EIGTH_NOTE(note) {(NOTE##note), 8} +#define EIGHTH_NOTE(note) {(NOTE##note), 8} #define SIXTEENTH_NOTE(note) {(NOTE##note), 4} // Note Types Short @@ -19,6 +19,11 @@ #define E_NOTE(n) EIGTH_NOTE(n) #define S_NOTE(n) SIXTEENTH_NOTE(n) +// Note Styles +// Staccato makes sure there is a rest between each note. Think: TA TA TA +// Legato makes notes flow together. Think: TAAA +#define STACCATO 0.01 +#define LEGATO 0 // Notes - # = Octave #define NOTE_REST 0.00 -- cgit v1.2.3-70-g09d2 From a67d425f4d5278595e7ab785a0f246b83fb1a09f Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Sun, 17 Apr 2016 01:00:39 -0400 Subject: planck default layout updates --- keyboard/planck/Makefile | 4 +- keyboard/planck/keymaps/default/keymap.c | 183 ++++++++++++++++++++----------- quantum/audio.c | 5 +- quantum/keymap_common.c | 8 +- 4 files changed, 130 insertions(+), 70 deletions(-) (limited to 'quantum') diff --git a/keyboard/planck/Makefile b/keyboard/planck/Makefile index 83b8303b0..01d9e3ce9 100644 --- a/keyboard/planck/Makefile +++ b/keyboard/planck/Makefile @@ -139,10 +139,10 @@ OPT_DEFS += -DBOOTLOADER_SIZE=4096 # change to "no" to disable the options, or define them in the makefile.mk in # the appropriate keymap folder that will get included automatically # -BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000) +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) MOUSEKEY_ENABLE = yes # Mouse keys(+4700) EXTRAKEY_ENABLE = yes # Audio control and System control(+450) -CONSOLE_ENABLE = yes # Console for debug(+400) +CONSOLE_ENABLE = no # Console for debug(+400) COMMAND_ENABLE = yes # Commands for debug and configuration NKRO_ENABLE = no # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality diff --git a/keyboard/planck/keymaps/default/keymap.c b/keyboard/planck/keymaps/default/keymap.c index 207af2a1d..aecddec4a 100644 --- a/keyboard/planck/keymaps/default/keymap.c +++ b/keyboard/planck/keymaps/default/keymap.c @@ -11,24 +11,27 @@ // The underscores don't mean anything - you can have a layer called STUFF or any other name. // Layer names don't all need to be of the same length, obviously, and you can also skip them // entirely and just use numbers. -#define _QW 0 -#define _CM 1 -#define _DV 2 -#define _LW 3 -#define _RS 4 -#define _AD 5 +#define _QWERTY 0 +#define _COLEMAK 1 +#define _DVORAK 2 +#define _LOWER 3 +#define _RAISE 4 +#define _ADJUST 5 +#define _MUSIC 6 // Macro name shortcuts -#define QWERTY M(_QW) -#define COLEMAK M(_CM) -#define DVORAK M(_DV) -#define LOWER M(_LW) -#define RAISE M(_RS) +#define QWERTY M(_QWERTY) +#define COLEMAK M(_COLEMAK) +#define DVORAK M(_DVORAK) +#define LOWER M(_LOWER) +#define RAISE M(_RAISE) #define M_BL 5 #ifdef AUDIO_ENABLE #define AUD_OFF M(6) #define AUD_ON M(7) #endif +#define MUS_OFF M(8) +#define MUS_ON M(9) // Fillers to make layering more clear #define _______ KC_TRNS @@ -47,7 +50,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | Brite| Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right | * `-----------------------------------------------------------------------------------' */ -[_QW] = { +[_QWERTY] = { {KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC}, {KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT}, {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT }, @@ -65,7 +68,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | Brite| Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right | * `-----------------------------------------------------------------------------------' */ -[_CM] = { +[_COLEMAK] = { {KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC}, {KC_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT}, {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT }, @@ -83,7 +86,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | Brite| Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right | * `-----------------------------------------------------------------------------------' */ -[_DV] = { +[_DVORAK] = { {KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSPC}, {KC_ESC, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_SLSH}, {KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_ENT }, @@ -101,7 +104,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | | | | | | | Next | Vol- | Vol+ | Play | * `-----------------------------------------------------------------------------------' */ -[_LW] = { +[_LOWER] = { {KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC}, {KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE}, {_______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, _______, _______, _______}, @@ -119,7 +122,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | | | | | | | Next | Vol- | Vol+ | Play | * `-----------------------------------------------------------------------------------' */ -[_RS] = { +[_RAISE] = { {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC}, {KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS}, {_______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, _______, _______, _______}, @@ -130,16 +133,26 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * ,-----------------------------------------------------------------------------------. * | | Reset| | | | | | | | | | Del | * |------+------+------+------+------+-------------+------+------+------+------+------| - * | | | |Aud on|Audoff| | |Qwerty|Colemk|Dvorak| | | + * | | | |Aud on|Audoff|AGnorm|AGswap|Qwerty|Colemk|Dvorak| | | * |------+------+------+------+------+------|------+------+------+------+------+------| * | | | | | | | | | | | | | * |------+------+------+------+------+------+------+------+------+------+------+------| * | | | | | | | | | | | | * `-----------------------------------------------------------------------------------' */ -[_AD] = { +[_ADJUST] = { {_______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL}, - {_______, _______, _______, AUD_ON, AUD_OFF, _______, _______, QWERTY, COLEMAK, DVORAK, _______, _______}, + {_______, _______, _______, AUD_ON, AUD_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, _______, _______}, + {_______, _______, _______, MUS_ON, MUS_OFF, _______, _______, _______, _______, _______, _______, _______}, + {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______} +}, + +/* Music (reserved for process_action_user) + * + */ +[_MUSIC] = { + {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}, + {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}, {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}, {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______} } @@ -150,87 +163,102 @@ const uint16_t PROGMEM fn_actions[] = { }; #ifdef AUDIO_ENABLE -float start_up[][2] = { - {440.0*pow(2.0,(67)/12.0), 12}, - {440.0*pow(2.0,(64)/12.0), 8}, - {440.0*pow(2.0,(55)/12.0), 8}, - {440.0*pow(2.0,(60)/12.0), 8}, - {440.0*pow(2.0,(64)/12.0), 20} +float tone_startup[][2] = { + {440.0*pow(2.0,(31)/12.0), 12}, + {440.0*pow(2.0,(28)/12.0), 8}, + {440.0*pow(2.0,(19)/12.0), 8}, + {440.0*pow(2.0,(24)/12.0), 8}, + {440.0*pow(2.0,(28)/12.0), 20} }; -float tone_qw[][2] = { - {440.0*pow(2.0,(59)/12.0), 8}, - {440.0*pow(2.0,(60)/12.0), 8}, +float tone_qwerty[][2] = { + {440.0*pow(2.0,(23)/12.0), 8}, + {440.0*pow(2.0,(24)/12.0), 8}, {0, 4}, - {440.0*pow(2.0,(67)/12.0), 16} + {440.0*pow(2.0,(31)/12.0), 16} }; -float tone_cm[][2] = { - {440.0*pow(2.0,(59)/12.0), 8}, - {440.0*pow(2.0,(60)/12.0), 8}, +float tone_colemak[][2] = { + {440.0*pow(2.0,(23)/12.0), 8}, + {440.0*pow(2.0,(24)/12.0), 8}, {0, 4}, - {440.0*pow(2.0,(67)/12.0), 12}, + {440.0*pow(2.0,(31)/12.0), 12}, {0, 4}, - {440.0*pow(2.0,(71)/12.0), 12} + {440.0*pow(2.0,(35)/12.0), 12} }; -float tone_dv[][2] = { - {440.0*pow(2.0,(59)/12.0), 8}, - {440.0*pow(2.0,(60)/12.0), 8}, +float tone_dvorak[][2] = { + {440.0*pow(2.0,(23)/12.0), 8}, + {440.0*pow(2.0,(24)/12.0), 8}, {0, 4}, - {440.0*pow(2.0,(67)/12.0), 8}, + {440.0*pow(2.0,(31)/12.0), 8}, {0, 4}, - {440.0*pow(2.0,(69)/12.0), 8}, + {440.0*pow(2.0,(33)/12.0), 8}, {0, 4}, - {440.0*pow(2.0,(67)/12.0), 8} + {440.0*pow(2.0,(31)/12.0), 8} +}; + +float tone_music[][2] = { + {440.0*pow(2.0,(12)/12.0), 8}, + {440.0*pow(2.0,(14)/12.0), 8}, + {440.0*pow(2.0,(16)/12.0), 8}, + {440.0*pow(2.0,(17)/12.0), 8}, + {440.0*pow(2.0,(19)/12.0), 8}, + {440.0*pow(2.0,(21)/12.0), 8}, + {440.0*pow(2.0,(23)/12.0), 8}, + {440.0*pow(2.0,(24)/12.0), 8} }; #endif +void persistant_default_layer_set(uint16_t default_layer) { + eeconfig_write_default_layer(default_layer); + default_layer_set(default_layer); +} + const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) { - // MACRODOWN only works in this function switch(id) { - case _QW: + case _QWERTY: if (record->event.pressed) { #ifdef AUDIO_ENABLE - PLAY_NOTE_ARRAY(tone_qw, false, 0); + PLAY_NOTE_ARRAY(tone_qwerty, false, 0); #endif - default_layer_set(1UL<<_QW); + persistant_default_layer_set(1UL<<_QWERTY); } break; - case _CM: + case _COLEMAK: if (record->event.pressed) { #ifdef AUDIO_ENABLE - PLAY_NOTE_ARRAY(tone_cm, false, 0); + PLAY_NOTE_ARRAY(tone_colemak, false, 0); #endif - default_layer_set(1UL<<_CM); + persistant_default_layer_set(1UL<<_COLEMAK); } break; - case _DV: + case _DVORAK: if (record->event.pressed) { #ifdef AUDIO_ENABLE - PLAY_NOTE_ARRAY(tone_dv, false, 0); + PLAY_NOTE_ARRAY(tone_dvorak, false, 0); #endif - default_layer_set(1UL<<_DV); + persistant_default_layer_set(1UL<<_DVORAK); } break; - case _LW: + case _LOWER: if (record->event.pressed) { - layer_on(_LW); - update_tri_layer(_LW, _RS, _AD); + layer_on(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); } else { - layer_off(_LW); - update_tri_layer(_LW, _RS, _AD); + layer_off(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); } break; - case _RS: + case _RAISE: if (record->event.pressed) { - layer_on(_RS); - update_tri_layer(_LW, _RS, _AD); + layer_on(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); } else { - layer_off(_RS); - update_tri_layer(_LW, _RS, _AD); + layer_off(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); } break; case M_BL: @@ -254,7 +282,23 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) if (record->event.pressed) { #ifdef AUDIO_ENABLE audio_on(); - PLAY_NOTE_ARRAY(start_up, false, 0); + PLAY_NOTE_ARRAY(tone_startup, false, 0); + #endif + } + break; + case 8: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + layer_off(_MUSIC); + stop_all_notes(); + #endif + } + break; + case 9: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_NOTE_ARRAY(tone_music, false, 0); + layer_on(_MUSIC); #endif } break; @@ -262,9 +306,24 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) return MACRO_NONE; }; +uint8_t starting_note = 0x0C; +int offset = 7; + +void process_action_user(keyrecord_t *record) { + + if (IS_LAYER_ON(_MUSIC)) { + if (record->event.pressed) { + play_note(((double)220.0)*pow(2.0, -4.0)*pow(2.0,(starting_note + SCALE[record->event.key.col + offset])/12.0+(MATRIX_ROWS - record->event.key.row)), 0xF); + } else { + stop_note(((double)220.0)*pow(2.0, -4.0)*pow(2.0,(starting_note + SCALE[record->event.key.col + offset])/12.0+(MATRIX_ROWS - record->event.key.row))); + } + } + +} + void matrix_init_user(void) { #ifdef AUDIO_ENABLE init_notes(); - PLAY_NOTE_ARRAY(start_up, false, 0); + PLAY_NOTE_ARRAY(tone_startup, false, 0); #endif } diff --git a/quantum/audio.c b/quantum/audio.c index 90f3c5a13..6bd6532a3 100644 --- a/quantum/audio.c +++ b/quantum/audio.c @@ -350,7 +350,6 @@ if (audio_config.enable) { if (note) stop_all_notes(); - notes = true; notes_pointer = np; notes_length = n_length; @@ -375,6 +374,8 @@ if (audio_config.enable) { TIMSK3 |= _BV(OCIE3A); TCCR3A |= _BV(COM3A1); #endif + + notes = true; } } @@ -404,7 +405,6 @@ if (audio_config.enable && voices < 8) { if (notes) stop_all_notes(); - note = true; #ifdef PWM_AUDIO freq = freq / SAMPLE_RATE; #endif @@ -436,6 +436,7 @@ if (audio_config.enable && voices < 8) { TCCR3A |= _BV(COM3A1); #endif + note = true; } } \ No newline at end of file diff --git a/quantum/keymap_common.c b/quantum/keymap_common.c index 02d3c74be..d38e6fdb2 100644 --- a/quantum/keymap_common.c +++ b/quantum/keymap_common.c @@ -33,14 +33,14 @@ extern keymap_config_t keymap_config; #include #ifdef AUDIO_ENABLE #include "audio.h" - #ifndef GOODBYE_TUNE - #define GOODBYE_TUNE { \ + #ifndef TONE_GOODBYE + #define TONE_GOODBYE { \ {440.0*pow(2.0,(31)/12.0), 8}, \ {440.0*pow(2.0,(24)/12.0), 8}, \ {440.0*pow(2.0,(19)/12.0), 12}, \ } #endif - float goodbye_tune[][2] = GOODBYE_TUNE; + float tone_goodbye[][2] = TONE_GOODBYE; #endif static action_t keycode_to_action(uint16_t keycode); @@ -191,7 +191,7 @@ static action_t keycode_to_action(uint16_t keycode) case RESET: ; // RESET is 0x5000, which is why this is here clear_keyboard(); #ifdef AUDIO_ENABLE - PLAY_NOTE_ARRAY(goodbye_tune, false, 0); + PLAY_NOTE_ARRAY(tone_goodbye, false, 0); #endif _delay_ms(250); #ifdef ATREUS_ASTAR -- cgit v1.2.3-70-g09d2 From 943b5b770955be937a89016680052be56d874c4a Mon Sep 17 00:00:00 2001 From: IBNobody Date: Sun, 17 Apr 2016 00:24:58 -0500 Subject: Adding folding to #if, etc --- keyboard/atomic/keymaps/pvc/keymap.c | 291 ++++++++++++++++------------------- quantum/audio.c | 3 +- quantum/musical_notes.h | 38 +++-- quantum/song_list.h | 12 ++ 4 files changed, 174 insertions(+), 170 deletions(-) create mode 100644 quantum/song_list.h (limited to 'quantum') diff --git a/keyboard/atomic/keymaps/pvc/keymap.c b/keyboard/atomic/keymaps/pvc/keymap.c index c2081f525..9a2c57cb1 100644 --- a/keyboard/atomic/keymaps/pvc/keymap.c +++ b/keyboard/atomic/keymaps/pvc/keymap.c @@ -3,7 +3,7 @@ #ifdef AUDIO_ENABLE #include "audio.h" -#include "musical_notes.h" +#include "song_list.h" #endif @@ -75,140 +75,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { }, }; - -#ifdef AUDIO_ENABLE - - - - -float tone_lw[][2] = { -/* -Q_NOTE(_C1 ) , -Q_NOTE(_CS1 ) , -Q_NOTE(_D1 ) , -Q_NOTE(_DS1 ) , -Q_NOTE(_E1 ) , -Q_NOTE(_F1 ) , -Q_NOTE(_FS1 ) , -Q_NOTE(_G1 ) , -Q_NOTE(_GS1 ) , -Q_NOTE(_A1 ) , -Q_NOTE(_AS1 ) , -Q_NOTE(_B1 ) , -*/ - -Q_NOTE(_C4 ) , -Q_NOTE(_CS4 ) , -Q_NOTE(_D4 ) , -Q_NOTE(_DS4 ) , -Q_NOTE(_E4 ) , -Q_NOTE(_F4 ) , -Q_NOTE(_FS4 ) , -Q_NOTE(_G4 ) , -Q_NOTE(_GS4 ) , -Q_NOTE(_A4 ) , -Q_NOTE(_AS4 ) , -Q_NOTE(_B1 ) , - - -Q_NOTE(_C2 ) , -Q_NOTE(_CS2 ) , -Q_NOTE(_D2 ) , -Q_NOTE(_DS2 ) , -Q_NOTE(_E2 ) , -Q_NOTE(_F2 ) , -Q_NOTE(_FS2 ) , -Q_NOTE(_G2 ) , -Q_NOTE(_GS2 ) , -Q_NOTE(_A2 ) , -Q_NOTE(_AS2 ) , -Q_NOTE(_B2 ) , -Q_NOTE(_C3 ) , -Q_NOTE(_CS3 ) , -Q_NOTE(_D3 ) , -Q_NOTE(_DS3 ) , -Q_NOTE(_E3 ) , -Q_NOTE(_F3 ) , -Q_NOTE(_FS3 ) , -Q_NOTE(_G3 ) , -Q_NOTE(_GS3 ) , -Q_NOTE(_A3 ) , -Q_NOTE(_AS3 ) , -Q_NOTE(_B3 ) , -Q_NOTE(_C4 ) , -Q_NOTE(_CS4 ) , -Q_NOTE(_D4 ) , -Q_NOTE(_DS4 ) , -Q_NOTE(_E4 ) , -Q_NOTE(_F4 ) , -Q_NOTE(_FS4 ) , -Q_NOTE(_G4 ) , -Q_NOTE(_GS4 ) , -Q_NOTE(_A4 ) , -Q_NOTE(_AS4 ) , -Q_NOTE(_B4 ) , -Q_NOTE(_C5 ) , -Q_NOTE(_CS5 ) , -Q_NOTE(_D5 ) , -Q_NOTE(_DS5 ) , -Q_NOTE(_E5 ) , -Q_NOTE(_F5 ) , -Q_NOTE(_FS5 ) , -Q_NOTE(_G5 ) , -Q_NOTE(_GS5 ) , -Q_NOTE(_A5 ) , -Q_NOTE(_AS5 ) , -Q_NOTE(_B5 ) , -Q_NOTE(_C6 ) , -Q_NOTE(_CS6 ) , -Q_NOTE(_D6 ) , -Q_NOTE(_DS6 ) , -Q_NOTE(_E6 ) , -Q_NOTE(_F6 ) , -Q_NOTE(_FS6 ) , -Q_NOTE(_G6 ) , -Q_NOTE(_GS6 ) , -Q_NOTE(_A6 ) , -Q_NOTE(_AS6 ) , -Q_NOTE(_B6 ) , -Q_NOTE(_C7 ) , -Q_NOTE(_CS7 ) , -Q_NOTE(_D7 ) , -Q_NOTE(_DS7 ) , -Q_NOTE(_E7 ) , -Q_NOTE(_F7 ) , -Q_NOTE(_FS7 ) , -Q_NOTE(_G7 ) , -Q_NOTE(_GS7 ) , -Q_NOTE(_A7 ) , -Q_NOTE(_AS7 ) , -Q_NOTE(_B7 ) , -Q_NOTE(_C8 ) , -Q_NOTE(_CS8 ) , -Q_NOTE(_D8 ) , -Q_NOTE(_DS8 ) , -Q_NOTE(_E8 ) , -Q_NOTE(_F8 ) , -Q_NOTE(_FS8 ) , -Q_NOTE(_G8 ) , -Q_NOTE(_GS8 ) , -Q_NOTE(_A8 ) , -Q_NOTE(_AS8 ) , -Q_NOTE(_B8 ) , - -}; - -float tone_rs[][2] = { -Q_NOTE(_A4 ) , -Q_NOTE(_A4 ) , -Q_NOTE(_A4 ) , -Q_NOTE(_A4 ) , -Q_NOTE(_AS8 ) , -Q_NOTE(_B8 ) , -}; - -#endif - void update_quad_layer(uint8_t layer1, uint8_t layer2, uint8_t layer3, uint8_t layer4, bool order) { if (order) @@ -241,7 +107,6 @@ void update_quad_layer(uint8_t layer1, uint8_t layer2, uint8_t layer3, uint8_t l const uint16_t PROGMEM fn_actions[] = { }; -//#define MUSIC_ARRAY_SIZE(x) (((int)(sizeof(x) / (sizeof(x[0][0])))) / 2) const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) { @@ -280,30 +145,140 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) return MACRO_NONE; }; + + #ifdef AUDIO_ENABLE -float start_up[][2] = { -Q_NOTE(_E4 ) , -Q_NOTE(_E4 ) , -Q_NOTE(_F4 ) , -Q_NOTE(_G4 ) , -Q_NOTE(_G4 ) , -Q_NOTE(_F4 ) , -Q_NOTE(_E4 ) , -Q_NOTE(_D4 ) , -Q_NOTE(_C4 ) , -Q_NOTE(_C4 ) , -Q_NOTE(_D4 ) , -Q_NOTE(_E4 ) , -H_NOTE(_E4 ) , -Q_NOTE(_D4 ) , -H_NOTE(_D4 ) , + +float start_up[][2] = SONG(ODE_TO_JOY); + +float tone_lw[][2] = { + /* + Q__NOTE(_C1 ) , + Q__NOTE(_CS1 ) , + Q__NOTE(_D1 ) , + Q__NOTE(_DS1 ) , + Q__NOTE(_E1 ) , + Q__NOTE(_F1 ) , + Q__NOTE(_FS1 ) , + Q__NOTE(_G1 ) , + Q__NOTE(_GS1 ) , + Q__NOTE(_A1 ) , + Q__NOTE(_AS1 ) , + Q__NOTE(_B1 ) , + */ + + Q__NOTE(_C4 ) , + Q__NOTE(_CS4 ) , + Q__NOTE(_D4 ) , + Q__NOTE(_DS4 ) , + Q__NOTE(_E4 ) , + Q__NOTE(_F4 ) , + Q__NOTE(_FS4 ) , + Q__NOTE(_G4 ) , + Q__NOTE(_GS4 ) , + Q__NOTE(_A4 ) , + Q__NOTE(_AS4 ) , + Q__NOTE(_B1 ) , + + Q__NOTE(_C2 ) , + Q__NOTE(_CS2 ) , + Q__NOTE(_D2 ) , + Q__NOTE(_DS2 ) , + Q__NOTE(_E2 ) , + Q__NOTE(_F2 ) , + Q__NOTE(_FS2 ) , + Q__NOTE(_G2 ) , + Q__NOTE(_GS2 ) , + Q__NOTE(_A2 ) , + Q__NOTE(_AS2 ) , + Q__NOTE(_B2 ) , + Q__NOTE(_C3 ) , + Q__NOTE(_CS3 ) , + Q__NOTE(_D3 ) , + Q__NOTE(_DS3 ) , + Q__NOTE(_E3 ) , + Q__NOTE(_F3 ) , + Q__NOTE(_FS3 ) , + Q__NOTE(_G3 ) , + Q__NOTE(_GS3 ) , + Q__NOTE(_A3 ) , + Q__NOTE(_AS3 ) , + Q__NOTE(_B3 ) , + Q__NOTE(_C4 ) , + Q__NOTE(_CS4 ) , + Q__NOTE(_D4 ) , + Q__NOTE(_DS4 ) , + Q__NOTE(_E4 ) , + Q__NOTE(_F4 ) , + Q__NOTE(_FS4 ) , + Q__NOTE(_G4 ) , + Q__NOTE(_GS4 ) , + Q__NOTE(_A4 ) , + Q__NOTE(_AS4 ) , + Q__NOTE(_B4 ) , + Q__NOTE(_C5 ) , + Q__NOTE(_CS5 ) , + Q__NOTE(_D5 ) , + Q__NOTE(_DS5 ) , + Q__NOTE(_E5 ) , + Q__NOTE(_F5 ) , + Q__NOTE(_FS5 ) , + Q__NOTE(_G5 ) , + Q__NOTE(_GS5 ) , + Q__NOTE(_A5 ) , + Q__NOTE(_AS5 ) , + Q__NOTE(_B5 ) , + Q__NOTE(_C6 ) , + Q__NOTE(_CS6 ) , + Q__NOTE(_D6 ) , + Q__NOTE(_DS6 ) , + Q__NOTE(_E6 ) , + Q__NOTE(_F6 ) , + Q__NOTE(_FS6 ) , + Q__NOTE(_G6 ) , + Q__NOTE(_GS6 ) , + Q__NOTE(_A6 ) , + Q__NOTE(_AS6 ) , + Q__NOTE(_B6 ) , + Q__NOTE(_C7 ) , + Q__NOTE(_CS7 ) , + Q__NOTE(_D7 ) , + Q__NOTE(_DS7 ) , + Q__NOTE(_E7 ) , + Q__NOTE(_F7 ) , + Q__NOTE(_FS7 ) , + Q__NOTE(_G7 ) , + Q__NOTE(_GS7 ) , + Q__NOTE(_A7 ) , + Q__NOTE(_AS7 ) , + Q__NOTE(_B7 ) , + Q__NOTE(_C8 ) , + Q__NOTE(_CS8 ) , + Q__NOTE(_D8 ) , + Q__NOTE(_DS8 ) , + Q__NOTE(_E8 ) , + Q__NOTE(_F8 ) , + Q__NOTE(_FS8 ) , + Q__NOTE(_G8 ) , + Q__NOTE(_GS8 ) , + Q__NOTE(_A8 ) , + Q__NOTE(_AS8 ) , + Q__NOTE(_B8 ) , +}; + +float tone_rs[][2] = { + Q__NOTE(_A4 ) , + Q__NOTE(_A4 ) , + Q__NOTE(_A4 ) , + Q__NOTE(_A4 ) , + Q__NOTE(_AS8 ) , + Q__NOTE(_B8 ) , }; -#endif void matrix_init_user(void) { - #ifdef AUDIO_ENABLE - init_notes(); - PLAY_NOTE_ARRAY(start_up, false, STACCATO); - println("Matrix Init"); - #endif + init_notes(); + PLAY_NOTE_ARRAY(start_up, false, STACCATO); + println("Matrix Init"); } + +#endif diff --git a/quantum/audio.c b/quantum/audio.c index 90f3c5a13..119bd9229 100644 --- a/quantum/audio.c +++ b/quantum/audio.c @@ -288,7 +288,8 @@ ISR(TIMER3_COMPA_vect) { #else if (note_frequency > 0) { ICR3 = (int)(((double)F_CPU) / (note_frequency * CPU_PRESCALER)); // Set max to the period - OCR3A = (int)(((double)F_CPU) / (note_frequency * CPU_PRESCALER)) >> 1; // Set compare to half the period + //OCR3A = (int)(((double)F_CPU) / (note_frequency * CPU_PRESCALER)) >> 1; // Set compare to half the period + OCR3A = (int)(((double)F_CPU) / (note_frequency * CPU_PRESCALER)) >> 2; // Set compare to half the period } else { ICR3 = 0; OCR3A = 0; diff --git a/quantum/musical_notes.h b/quantum/musical_notes.h index 837f6a069..d2256a773 100644 --- a/quantum/musical_notes.h +++ b/quantum/musical_notes.h @@ -4,20 +4,36 @@ // Tempo Placeholder #define TEMPO 120 +#define SONG(notes...) { notes } + // Note Types -#define WHOLE_NOTE(note) {(NOTE##note), 64} -#define HALF_NOTE(note) {(NOTE##note), 32} -#define QUARTER_NOTE(note) {(NOTE##note), 16} -#define EIGHTH_NOTE(note) {(NOTE##note), 8} -#define SIXTEENTH_NOTE(note) {(NOTE##note), 4} +#define MUSICAL_NOTE(note, duration) {(NOTE##note), duration} +#define WHOLE_NOTE(note) MUSICAL_NOTE(note, 64) +#define HALF_NOTE(note) MUSICAL_NOTE(note, 32) +#define QUARTER_NOTE(note) MUSICAL_NOTE(note, 16) +#define EIGHTH_NOTE(note) MUSICAL_NOTE(note, 8) +#define SIXTEENTH_NOTE(note) MUSICAL_NOTE(note, 4) + +#define WHOLE_DOT_NOTE(note) MUSICAL_NOTE(note, 64+32) +#define HALF_DOT_NOTE(note) MUSICAL_NOTE(note, 32+16) +#define QUARTER_DOT_NOTE(note) MUSICAL_NOTE(note, 16+8) +#define EIGHTH_DOT_NOTE(note) MUSICAL_NOTE(note, 8+4) +#define SIXTEENTH_DOT_NOTE(note) MUSICAL_NOTE(note, 4+2) + -// Note Types Short -#define W_NOTE(n) WHOLE_NOTE(n) -#define H_NOTE(n) HALF_NOTE(n) -#define Q_NOTE(n) QUARTER_NOTE(n) -#define E_NOTE(n) EIGTH_NOTE(n) -#define S_NOTE(n) SIXTEENTH_NOTE(n) +// Note Type Shortcuts +#define M__NOTE(note, duration) MUSICAL_NOTE(note, duration) +#define W__NOTE(n) WHOLE_NOTE(n) +#define H__NOTE(n) HALF_NOTE(n) +#define Q__NOTE(n) QUARTER_NOTE(n) +#define E__NOTE(n) EIGHTH_NOTE(n) +#define S__NOTE(n) SIXTEENTH_NOTE(n) +#define WD_NOTE(n) WHOLE_DOT_NOTE(n) +#define HD_NOTE(n) HALF_DOT_NOTE(n) +#define QD_NOTE(n) QUARTER_DOT_NOTE(n) +#define ED_NOTE(n) EIGTH_DOT_NOTE(n) +#define SD_NOTE(n) SIXTEENTH_DOT_NOTE(n) // Note Styles // Staccato makes sure there is a rest between each note. Think: TA TA TA diff --git a/quantum/song_list.h b/quantum/song_list.h new file mode 100644 index 000000000..ef25eac35 --- /dev/null +++ b/quantum/song_list.h @@ -0,0 +1,12 @@ +#include "musical_notes.h" + +#ifndef SONG_LIST_H +#define SONG_LIST_H + +#define ODE_TO_JOY \ + Q__NOTE(_E4), Q__NOTE(_E4), Q__NOTE(_F4), Q__NOTE(_G4), \ + Q__NOTE(_G4), Q__NOTE(_F4), Q__NOTE(_E4), Q__NOTE(_D4), \ + Q__NOTE(_C4), Q__NOTE(_C4), Q__NOTE(_D4), Q__NOTE(_E4), \ + QD_NOTE(_E4), E__NOTE(_D4), H__NOTE(_D4), + +#endif \ No newline at end of file -- cgit v1.2.3-70-g09d2 From 29e495be2a57d1eb41699909b204c12ac6bc4c0e Mon Sep 17 00:00:00 2001 From: IBNobody Date: Sun, 17 Apr 2016 02:52:38 -0500 Subject: Added trimble and tempo adjustments! --- keyboard/atomic/keymaps/pvc/keymap.c | 216 ++++++++++++++++++-------------- keyboard/atomic/keymaps/pvc/makefile.mk | 2 +- quantum/audio.c | 56 +++++++-- quantum/audio.h | 6 +- quantum/musical_notes.h | 13 +- quantum/song_list.h | 6 + 6 files changed, 189 insertions(+), 110 deletions(-) (limited to 'quantum') diff --git a/keyboard/atomic/keymaps/pvc/keymap.c b/keyboard/atomic/keymaps/pvc/keymap.c index 9a2c57cb1..aaef6b041 100644 --- a/keyboard/atomic/keymaps/pvc/keymap.c +++ b/keyboard/atomic/keymaps/pvc/keymap.c @@ -17,6 +17,13 @@ #define M_LW 1 #define M_RS 2 #define M_FN 3 +#define M_T1 4 +#define M_T2 5 +#define M_T3 6 +#define M_T4 7 +#define M_TU 8 +#define M_TD 9 +#define M_DF 10 #define _______ KC_TRNS @@ -63,7 +70,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { { KC_NLCK, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, ___T___, ___T___ }, { KC_SLCK, KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_F21, KC_F22, KC_F23, KC_F24, KC_PAUS, KC_PSCR }, { KC_CAPS, KC_BTN5, KC_BTN4, KC_BTN3, KC_BTN2, KC_ACL0, KC_ACL2, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY, _______, ___T___, ___T___, KC_WH_U }, - { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, ___T___, ___T___, KC_MS_U, KC_WH_D }, + { _______, M(M_T1), M(M_T2), M(M_T3), M(M_T4), M(M_TU), M(M_TD), M(M_DF), _______, _______, _______, ___T___, ___T___, KC_MS_U, KC_WH_D }, { _______, _______, _______, _______, _______, KC_BTN1, KC_BTN1, _______, _______, _______, _______, _______, KC_MS_L, KC_MS_D, KC_MS_R }, }, [_AD] = { /* ADJUST */ @@ -75,76 +82,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { }, }; -void update_quad_layer(uint8_t layer1, uint8_t layer2, uint8_t layer3, uint8_t layer4, bool order) -{ - if (order) - { - if (IS_LAYER_ON(layer1) && IS_LAYER_ON(layer2)) - { - layer_on(layer3); - } - else - { - layer_off(layer3); - layer_off(layer4); - } - } - else - { - if (IS_LAYER_ON(layer1) && IS_LAYER_ON(layer2)) - { - layer_on(layer4); - } - else - { - layer_off(layer3); - layer_off(layer4); - } - } -} - - -const uint16_t PROGMEM fn_actions[] = { -}; - - -const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) -{ - - // MACRODOWN only works in this function - switch(id) { - case M_LW: - if (record->event.pressed) { - #ifdef AUDIO_ENABLE - println("PlayNotes LW"); - PLAY_NOTE_ARRAY(tone_lw, false, STACCATO); - #endif - layer_on(_LW); - update_tri_layer(_LW, _RS, _FN); - } else { - layer_off(_LW); - update_tri_layer(_LW, _RS, _FN); - } - break; - case M_RS: - if (record->event.pressed) { - #ifdef AUDIO_ENABLE - println("PlayNotes RS"); - PLAY_NOTE_ARRAY(tone_rs, false, LEGATO); - #endif - layer_on(_RS); - update_tri_layer(_LW, _RS, _FN); - } else { - layer_off(_RS); - update_tri_layer(_LW, _RS, _FN); - } - break; - default: - break; - } - return MACRO_NONE; -}; - #ifdef AUDIO_ENABLE @@ -152,20 +89,6 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) float start_up[][2] = SONG(ODE_TO_JOY); float tone_lw[][2] = { - /* - Q__NOTE(_C1 ) , - Q__NOTE(_CS1 ) , - Q__NOTE(_D1 ) , - Q__NOTE(_DS1 ) , - Q__NOTE(_E1 ) , - Q__NOTE(_F1 ) , - Q__NOTE(_FS1 ) , - Q__NOTE(_G1 ) , - Q__NOTE(_GS1 ) , - Q__NOTE(_A1 ) , - Q__NOTE(_AS1 ) , - Q__NOTE(_B1 ) , - */ Q__NOTE(_C4 ) , Q__NOTE(_CS4 ) , @@ -178,6 +101,7 @@ float tone_lw[][2] = { Q__NOTE(_GS4 ) , Q__NOTE(_A4 ) , Q__NOTE(_AS4 ) , + Q__NOTE(_B1 ) , Q__NOTE(_C2 ) , @@ -266,14 +190,7 @@ float tone_lw[][2] = { Q__NOTE(_B8 ) , }; -float tone_rs[][2] = { - Q__NOTE(_A4 ) , - Q__NOTE(_A4 ) , - Q__NOTE(_A4 ) , - Q__NOTE(_A4 ) , - Q__NOTE(_AS8 ) , - Q__NOTE(_B8 ) , -}; +float tone_rs[][2] = SONG(ROCK_A_BYE_BABY); void matrix_init_user(void) { init_notes(); @@ -282,3 +199,116 @@ void matrix_init_user(void) { } #endif + + +void update_quad_layer(uint8_t layer1, uint8_t layer2, uint8_t layer3, uint8_t layer4, bool order) +{ + if (order) + { + if (IS_LAYER_ON(layer1) && IS_LAYER_ON(layer2)) + { + layer_on(layer3); + } + else + { + layer_off(layer3); + layer_off(layer4); + } + } + else + { + if (IS_LAYER_ON(layer1) && IS_LAYER_ON(layer2)) + { + layer_on(layer4); + } + else + { + layer_off(layer3); + layer_off(layer4); + } + } +} + + +const uint16_t PROGMEM fn_actions[] = { +}; + + +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) +{ + + // MACRODOWN only works in this function + switch(id) + { + case M_LW: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_NOTE_ARRAY(tone_lw, false, STACCATO); + #endif + layer_on(_LW); + update_tri_layer(_LW, _RS, _AD); + } else { + layer_off(_LW); + update_tri_layer(_LW, _RS, _AD); + } + break; + case M_RS: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_NOTE_ARRAY(tone_rs, false, LEGATO); + #endif + layer_on(_RS); + update_tri_layer(_LW, _RS, _AD); + } else { + layer_off(_RS); + update_tri_layer(_LW, _RS, _AD); + } + break; + + case M_FN: + if (record->event.pressed) { + layer_on(_FN); + } else { + layer_off(_FN); + } + break; + + case M_T1: + if (record->event.pressed) set_timbre(TIMBRE_12); + break; + + case M_T2: + if (record->event.pressed) set_timbre(TIMBRE_25); + break; + + case M_T3: + if (record->event.pressed) set_timbre(TIMBRE_50); + break; + + case M_T4: + if (record->event.pressed) set_timbre(TIMBRE_75); + break; + + + case M_TU: + if (record->event.pressed) increase_tempo(10); + break; + + case M_TD: + if (record->event.pressed) decrease_tempo(10); + break; + + case M_DF: + if (record->event.pressed) + { + set_timbre(TIMBRE_DEFAULT); + set_tempo(TEMPO_DEFAULT); + } + break; + + default: + break; + + } + return MACRO_NONE; +}; \ No newline at end of file diff --git a/keyboard/atomic/keymaps/pvc/makefile.mk b/keyboard/atomic/keymaps/pvc/makefile.mk index d46996650..eefa42855 100644 --- a/keyboard/atomic/keymaps/pvc/makefile.mk +++ b/keyboard/atomic/keymaps/pvc/makefile.mk @@ -1,7 +1,7 @@ BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000) MOUSEKEY_ENABLE = yes # Mouse keys(+4700) EXTRAKEY_ENABLE = yes # Audio control and System control(+450) -CONSOLE_ENABLE = yes # Console for debug(+400) +CONSOLE_ENABLE = no # Console for debug(+400) COMMAND_ENABLE = yes # Commands for debug and configuration NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality diff --git a/quantum/audio.c b/quantum/audio.c index 119bd9229..9b9589f13 100644 --- a/quantum/audio.c +++ b/quantum/audio.c @@ -4,7 +4,7 @@ #include #include #include - +#include "print.h" #include "audio.h" #include "keymap_common.h" @@ -57,9 +57,11 @@ bool notes = false; bool note = false; float note_frequency = 0; float note_length = 0; +float note_tempo = TEMPO_DEFAULT; +float note_timbre = TIMBRE_DEFAULT; uint16_t note_position = 0; float (* notes_pointer)[][2]; -uint8_t notes_length; +uint8_t notes_count; bool notes_repeat; float notes_rest; bool note_resting = false; @@ -255,7 +257,8 @@ ISR(TIMER3_COMPA_vect) { place = 0.0; } ICR3 = (int)(((double)F_CPU) / (frequencies[voice_place] * CPU_PRESCALER)); // Set max to the period - OCR3A = (int)(((double)F_CPU) / (frequencies[voice_place] * CPU_PRESCALER)) >> 1 * duty_place; // Set compare to half the period + OCR3A = (int)((((double)F_CPU) / (note_frequency * CPU_PRESCALER)) * note_timbre); // Set compare to half the period + //OCR3A = (int)(((double)F_CPU) / (frequencies[voice_place] * CPU_PRESCALER)) >> 1 * duty_place; // Set compare to half the period place++; // if (duty_counter > (frequencies[voice_place] / 500)) { // duty_place = (duty_place % 3) + 1; @@ -288,8 +291,7 @@ ISR(TIMER3_COMPA_vect) { #else if (note_frequency > 0) { ICR3 = (int)(((double)F_CPU) / (note_frequency * CPU_PRESCALER)); // Set max to the period - //OCR3A = (int)(((double)F_CPU) / (note_frequency * CPU_PRESCALER)) >> 1; // Set compare to half the period - OCR3A = (int)(((double)F_CPU) / (note_frequency * CPU_PRESCALER)) >> 2; // Set compare to half the period + OCR3A = (int)((((double)F_CPU) / (note_frequency * CPU_PRESCALER)) * note_timbre); // Set compare to half the period } else { ICR3 = 0; OCR3A = 0; @@ -305,7 +307,7 @@ ISR(TIMER3_COMPA_vect) { end_of_note = (note_position >= (note_length * 0x7FF)); if (end_of_note) { current_note++; - if (current_note >= notes_length) { + if (current_note >= notes_count) { if (notes_repeat) { current_note = 0; } else { @@ -328,10 +330,10 @@ ISR(TIMER3_COMPA_vect) { note_resting = false; #ifdef PWM_AUDIO note_frequency = (*notes_pointer)[current_note][0] / SAMPLE_RATE; - note_length = (*notes_pointer)[current_note][1]; + note_length = (*notes_pointer)[current_note][1] * (note_tempo / 100); #else note_frequency = (*notes_pointer)[current_note][0]; - note_length = (*notes_pointer)[current_note][1] / 4; + note_length = ((*notes_pointer)[current_note][1] / 4) * (note_tempo / 100); #endif } note_position = 0; @@ -345,7 +347,7 @@ ISR(TIMER3_COMPA_vect) { } } -void play_notes(float (*np)[][2], uint8_t n_length, bool n_repeat, float n_rest) { +void play_notes(float (*np)[][2], uint8_t n_count, bool n_repeat, float n_rest) { if (audio_config.enable) { @@ -354,7 +356,7 @@ if (audio_config.enable) { notes = true; notes_pointer = np; - notes_length = n_length; + notes_count = n_count; notes_repeat = n_repeat; notes_rest = n_rest; @@ -362,10 +364,10 @@ if (audio_config.enable) { current_note = 0; #ifdef PWM_AUDIO note_frequency = (*notes_pointer)[current_note][0] / SAMPLE_RATE; - note_length = (*notes_pointer)[current_note][1]; + note_length = (*notes_pointer)[current_note][1] * (note_tempo / 100); #else note_frequency = (*notes_pointer)[current_note][0]; - note_length = (*notes_pointer)[current_note][1] / 4; + note_length = ((*notes_pointer)[current_note][1] / 4) * (note_tempo / 100); #endif note_position = 0; @@ -439,4 +441,32 @@ if (audio_config.enable && voices < 8) { } -} \ No newline at end of file +} + +void set_timbre(float timbre) +{ + note_timbre = timbre; +} + +void set_tempo(float tempo) +{ + note_tempo = tempo; +} + +void decrease_tempo(uint8_t tempo_change) +{ + note_tempo += (float) tempo_change; +} + +void increase_tempo(uint8_t tempo_change) +{ + if (note_tempo - (float) tempo_change < 10) + { + note_tempo = 10; + } + else + { + note_tempo -= (float) tempo_change; + } +} + diff --git a/quantum/audio.h b/quantum/audio.h index 762c98064..8012aa6bf 100644 --- a/quantum/audio.h +++ b/quantum/audio.h @@ -24,8 +24,12 @@ void play_note(double freq, int vol); void stop_note(double freq); void stop_all_notes(void); void init_notes(void); -void play_notes(float (*np)[][2], uint8_t n_length, bool n_repeat, float n_rest); +void play_notes(float (*np)[][2], uint8_t n_count, bool n_repeat, float n_rest); +void set_timbre(float timbre); +void set_tempo(float tempo); +void increase_tempo(uint8_t tempo_change); +void decrease_tempo(uint8_t tempo_change); // These macros are used to allow play_notes to play an array of indeterminate // length. This works around the limitation of C's sizeof operation on pointers. diff --git a/quantum/musical_notes.h b/quantum/musical_notes.h index d2256a773..2170f3f18 100644 --- a/quantum/musical_notes.h +++ b/quantum/musical_notes.h @@ -2,7 +2,8 @@ #define MUSICAL_NOTES_H // Tempo Placeholder -#define TEMPO 120 +#define TEMPO_DEFAULT 100 + #define SONG(notes...) { notes } @@ -21,7 +22,6 @@ #define EIGHTH_DOT_NOTE(note) MUSICAL_NOTE(note, 8+4) #define SIXTEENTH_DOT_NOTE(note) MUSICAL_NOTE(note, 4+2) - // Note Type Shortcuts #define M__NOTE(note, duration) MUSICAL_NOTE(note, duration) #define W__NOTE(n) WHOLE_NOTE(n) @@ -41,6 +41,15 @@ #define STACCATO 0.01 #define LEGATO 0 +// Note Timbre +// Changes how the notes sound +#define TIMBRE_12 0.125 +#define TIMBRE_25 0.250 +#define TIMBRE_50 0.500 +#define TIMBRE_75 0.750 +#define TIMBRE_DEFAULT TIMBRE_50 + + // Notes - # = Octave #define NOTE_REST 0.00 #define NOTE_C0 16.35 diff --git a/quantum/song_list.h b/quantum/song_list.h index ef25eac35..ef36a1cdd 100644 --- a/quantum/song_list.h +++ b/quantum/song_list.h @@ -9,4 +9,10 @@ Q__NOTE(_C4), Q__NOTE(_C4), Q__NOTE(_D4), Q__NOTE(_E4), \ QD_NOTE(_E4), E__NOTE(_D4), H__NOTE(_D4), +#define ROCK_A_BYE_BABY \ + QD_NOTE(_B4), E__NOTE(_D4), Q__NOTE(_B5), \ + H__NOTE(_A5), Q__NOTE(_G5), \ + QD_NOTE(_B4), E__NOTE(_D5), Q__NOTE(_G5), \ + H__NOTE(_FS5), + #endif \ No newline at end of file -- cgit v1.2.3-70-g09d2 From c940e87235c9fe26f5c7451464af54a493270a68 Mon Sep 17 00:00:00 2001 From: IBNobody Date: Sun, 17 Apr 2016 10:41:07 -0500 Subject: fixed single note play copy/paste bug --- quantum/audio.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'quantum') diff --git a/quantum/audio.c b/quantum/audio.c index 9b9589f13..58b9ab76b 100644 --- a/quantum/audio.c +++ b/quantum/audio.c @@ -257,7 +257,7 @@ ISR(TIMER3_COMPA_vect) { place = 0.0; } ICR3 = (int)(((double)F_CPU) / (frequencies[voice_place] * CPU_PRESCALER)); // Set max to the period - OCR3A = (int)((((double)F_CPU) / (note_frequency * CPU_PRESCALER)) * note_timbre); // Set compare to half the period + OCR3A = (int)((((double)F_CPU) /(frequencies[voice_place] * CPU_PRESCALER)) * note_timbre); // Set compare to half the period //OCR3A = (int)(((double)F_CPU) / (frequencies[voice_place] * CPU_PRESCALER)) >> 1 * duty_place; // Set compare to half the period place++; // if (duty_counter > (frequencies[voice_place] / 500)) { -- cgit v1.2.3-70-g09d2 From 90289aa53fe06a867c773d447c6d3a950575d69a Mon Sep 17 00:00:00 2001 From: a0-c Date: Sun, 17 Apr 2016 06:51:39 -1000 Subject: __attribute__ ((weak)) added to led_set __attribute__ ((weak)) added to led_set --- quantum/led.c | 1 + 1 file changed, 1 insertion(+) (limited to 'quantum') diff --git a/quantum/led.c b/quantum/led.c index 9cdb8a5c2..208e348f3 100644 --- a/quantum/led.c +++ b/quantum/led.c @@ -24,6 +24,7 @@ void led_set_kb(uint8_t usb_led) { } +__attribute__ ((weak)) void led_set(uint8_t usb_led) { -- cgit v1.2.3-70-g09d2 From d5b72e7bde5ede25f7d5699b50b7d9eb6f31ba92 Mon Sep 17 00:00:00 2001 From: IBNobody Date: Sun, 17 Apr 2016 12:54:32 -0500 Subject: Fixed many compiler warnings related to print being disabled --- quantum/keymap_common.c | 1 + tmk_core/common/action.c | 8 ++++---- tmk_core/common/action_layer.c | 12 ++++++------ tmk_core/common/action_macro.c | 8 ++++---- tmk_core/common/action_tapping.c | 11 ++++++----- tmk_core/common/command.c | 25 ++++++++++++++++--------- tmk_core/common/print.h | 12 ++++++------ tmk_core/protocol/lufa/lufa.c | 18 +++++++----------- 8 files changed, 50 insertions(+), 45 deletions(-) (limited to 'quantum') diff --git a/quantum/keymap_common.c b/quantum/keymap_common.c index 61a51aedb..ce1d007f3 100644 --- a/quantum/keymap_common.c +++ b/quantum/keymap_common.c @@ -26,6 +26,7 @@ along with this program. If not, see . #include "backlight.h" #include "keymap_midi.h" #include "bootloader.h" +#include "eeconfig.h" extern keymap_config_t keymap_config; diff --git a/tmk_core/common/action.c b/tmk_core/common/action.c index f9e6c17dc..0162fbd63 100644 --- a/tmk_core/common/action.c +++ b/tmk_core/common/action.c @@ -27,11 +27,11 @@ along with this program. If not, see . #include "action_util.h" #include "action.h" -#ifdef DEBUG_ACTION +//#ifdef DEBUG_ACTION #include "debug.h" -#else -#include "nodebug.h" -#endif +//#else +//#include "nodebug.h" +//#endif void action_exec(keyevent_t event) diff --git a/tmk_core/common/action_layer.c b/tmk_core/common/action_layer.c index e817c0d51..845fbbb21 100644 --- a/tmk_core/common/action_layer.c +++ b/tmk_core/common/action_layer.c @@ -4,14 +4,14 @@ #include "util.h" #include "action_layer.h" -#ifdef DEBUG_ACTION +//#ifdef DEBUG_ACTION #include "debug.h" -#else -#include "nodebug.h" -#endif +//#else +//#include "nodebug.h" +//#endif -/* +/* * Default Layer State */ uint32_t default_layer_state = 0; @@ -52,7 +52,7 @@ void default_layer_xor(uint32_t state) #ifndef NO_ACTION_LAYER -/* +/* * Keymap Layer State */ uint32_t layer_state = 0; diff --git a/tmk_core/common/action_macro.c b/tmk_core/common/action_macro.c index 7726b1190..cc78c8232 100644 --- a/tmk_core/common/action_macro.c +++ b/tmk_core/common/action_macro.c @@ -19,11 +19,11 @@ along with this program. If not, see . #include "action_macro.h" #include "wait.h" -#ifdef DEBUG_ACTION +//#ifdef DEBUG_ACTION #include "debug.h" -#else -#include "nodebug.h" -#endif +//#else +//#include "nodebug.h" +//#endif #ifndef NO_ACTION_MACRO diff --git a/tmk_core/common/action_tapping.c b/tmk_core/common/action_tapping.c index 826c23309..6b6fa1dfe 100644 --- a/tmk_core/common/action_tapping.c +++ b/tmk_core/common/action_tapping.c @@ -6,11 +6,11 @@ #include "keycode.h" #include "timer.h" -#ifdef DEBUG_ACTION +//#ifdef DEBUG_ACTION #include "debug.h" -#else -#include "nodebug.h" -#endif +//#else +//#include "nodebug.h" +//#endif #ifndef NO_ACTION_TAPPING @@ -139,7 +139,7 @@ bool process_tapping(keyrecord_t *keyp) if (event.pressed) { tapping_key.tap.interrupted = true; } - // enqueue + // enqueue return false; } } @@ -324,6 +324,7 @@ bool waiting_buffer_typed(keyevent_t event) return false; } +__attribute__((unused)) bool waiting_buffer_has_anykey_pressed(void) { for (uint8_t i = waiting_buffer_tail; i != waiting_buffer_head; i = (i + 1) % WAITING_BUFFER_SIZE) { diff --git a/tmk_core/common/command.c b/tmk_core/common/command.c index b4cd3ca56..7572b9597 100644 --- a/tmk_core/common/command.c +++ b/tmk_core/common/command.c @@ -122,7 +122,7 @@ static void command_common_help(void) STR(MAGIC_KEY_VERSION ) ": Version\n" STR(MAGIC_KEY_STATUS ) ": Status\n" STR(MAGIC_KEY_CONSOLE ) ": Activate Console Mode\n" - + #if MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM STR(MAGIC_KEY_LAYER0 ) ": Switch to Layer 0\n" STR(MAGIC_KEY_LAYER1 ) ": Switch to Layer 1\n" @@ -136,11 +136,11 @@ static void command_common_help(void) STR(MAGIC_KEY_LAYER9 ) ": Switch to Layer 9\n" #endif -#if MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS +#if MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS "F1-F10: Switch to Layer 0-9 (F10 = L0)\n" #endif -#if MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS +#if MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS "0-9: Switch to Layer 0-9\n" #endif @@ -251,6 +251,7 @@ static void print_status(void) #ifdef BOOTMAGIC_ENABLE static void print_eeconfig(void) { +#ifndef NO_PRINT print("default_layer: "); print_dec(eeconfig_read_default_layer()); print("\n"); debug_config_t dc; @@ -279,9 +280,12 @@ static void print_eeconfig(void) print("backlight_config.raw: "); print_hex8(bc.raw); print("\n"); print(".enable: "); print_dec(bc.enable); print("\n"); print(".level: "); print_dec(bc.level); print("\n"); -#endif +#endif /* BACKLIGHT_ENABLE */ + +#endif /* !NO_PRINT */ + } -#endif +#endif /* BOOTMAGIC_ENABLE */ static bool command_common(uint8_t code) { @@ -305,7 +309,7 @@ static bool command_common(uint8_t code) #ifdef BOOTMAGIC_ENABLE // print stored eeprom config - case MAGIC_KC(MAGIC_KEY_EEPROM): + case MAGIC_KC(MAGIC_KEY_EEPROM): print("eeconfig:\n"); print_eeconfig(); break; @@ -369,7 +373,7 @@ static bool command_common(uint8_t code) break; // debug matrix toggle - case MAGIC_KC(MAGIC_KEY_DEBUG_MATRIX): + case MAGIC_KC(MAGIC_KEY_DEBUG_MATRIX): debug_matrix = !debug_matrix; if (debug_matrix) { print("\nmatrix: on\n"); @@ -380,7 +384,7 @@ static bool command_common(uint8_t code) break; // debug keyboard toggle - case MAGIC_KC(MAGIC_KEY_DEBUG_KBD): + case MAGIC_KC(MAGIC_KEY_DEBUG_KBD): debug_keyboard = !debug_keyboard; if (debug_keyboard) { print("\nkeyboard: on\n"); @@ -551,6 +555,7 @@ static uint8_t mousekey_param = 0; static void mousekey_param_print(void) { +#ifndef NO_PRINT print("\n\t- Values -\n"); print("1: delay(*10ms): "); pdec(mk_delay); print("\n"); print("2: interval(ms): "); pdec(mk_interval); print("\n"); @@ -558,6 +563,8 @@ static void mousekey_param_print(void) print("4: time_to_max: "); pdec(mk_time_to_max); print("\n"); print("5: wheel_max_speed: "); pdec(mk_wheel_max_speed); print("\n"); print("6: wheel_time_to_max: "); pdec(mk_wheel_time_to_max); print("\n"); +#endif /* !NO_PRINT */ + } //#define PRINT_SET_VAL(v) print(#v " = "); print_dec(v); print("\n"); @@ -677,7 +684,7 @@ static void mousekey_console_help(void) "pgdown: -10\n" "\n" "speed = delta * max_speed * (repeat / time_to_max)\n"); - xprintf("where delta: cursor=%d, wheel=%d\n" + xprintf("where delta: cursor=%d, wheel=%d\n" "See http://en.wikipedia.org/wiki/Mouse_keys\n", MOUSEKEY_MOVE_DELTA, MOUSEKEY_WHEEL_DELTA); } diff --git a/tmk_core/common/print.h b/tmk_core/common/print.h index c0e9e1430..4f3dde65a 100644 --- a/tmk_core/common/print.h +++ b/tmk_core/common/print.h @@ -2,17 +2,17 @@ /* Very basic print functions, intended to be used with usb_debug_only.c * http://www.pjrc.com/teensy/ * Copyright (c) 2008 PJRC.COM, LLC - * + * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: - * + * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. - * + * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE @@ -91,9 +91,9 @@ void print_set_sendchar(int8_t (*print_sendchar_func)(uint8_t)); #else /* NO_PRINT */ -#define xprintf -#define print -#define println +#define xprintf(fmt, ...) +#define print(s) +#define println(s) #define print_set_sendchar(func) #define print_dec(data) #define print_decs(data) diff --git a/tmk_core/protocol/lufa/lufa.c b/tmk_core/protocol/lufa/lufa.c index 5d40dcf7b..f03f9a9b9 100644 --- a/tmk_core/protocol/lufa/lufa.c +++ b/tmk_core/protocol/lufa/lufa.c @@ -1,4 +1,4 @@ -/* +/* * Copyright 2012 Jun Wako * This file is based on: * LUFA-120219/Demos/Device/Lowlevel/KeyboardMouse @@ -152,10 +152,10 @@ static void Console_Task(void) { /* Create a temporary buffer to hold the read in report from the host */ uint8_t ConsoleData[CONSOLE_EPSIZE]; - + /* Read Console Report Data */ Endpoint_Read_Stream_LE(&ConsoleData, sizeof(ConsoleData), NULL); - + /* Process Console Report Data */ //ProcessConsoleHIDReport(ConsoleData); } @@ -183,10 +183,6 @@ static void Console_Task(void) Endpoint_SelectEndpoint(ep); } -#else -static void Console_Task(void) -{ -} #endif @@ -216,7 +212,7 @@ void EVENT_USB_Device_Disconnect(void) print("[D]"); /* For battery powered device */ USB_IsInitialized = false; -/* TODO: This doesn't work. After several plug in/outs can not be enumerated. +/* TODO: This doesn't work. After several plug in/outs can not be enumerated. if (USB_IsInitialized) { USB_Disable(); // Disable all interrupts USB_Controller_Enable(); @@ -313,7 +309,7 @@ void EVENT_USB_Device_ConfigurationChanged(void) #ifdef MIDI_ENABLE ConfigSuccess &= Endpoint_ConfigureEndpoint(MIDI_STREAM_IN_EPADDR, EP_TYPE_BULK, MIDI_STREAM_EPSIZE, ENDPOINT_BANK_SINGLE); - ConfigSuccess &= Endpoint_ConfigureEndpoint(MIDI_STREAM_OUT_EPADDR, EP_TYPE_BULK, MIDI_STREAM_EPSIZE, ENDPOINT_BANK_SINGLE); + ConfigSuccess &= Endpoint_ConfigureEndpoint(MIDI_STREAM_OUT_EPADDR, EP_TYPE_BULK, MIDI_STREAM_EPSIZE, ENDPOINT_BANK_SINGLE); #endif } @@ -439,7 +435,7 @@ void EVENT_USB_Device_ControlRequest(void) } /******************************************************************************* - * Host driver + * Host driver ******************************************************************************/ static uint8_t keyboard_leds(void) { @@ -563,7 +559,7 @@ static void send_consumer(uint16_t data) bluefruit_serial_send(0x00); bluefruit_serial_send(0x02); bluefruit_serial_send((bitmap>>8)&0xFF); - bluefruit_serial_send(bitmap&0xFF); + bluefruit_serial_send(bitmap&0xFF); bluefruit_serial_send(0x00); bluefruit_serial_send(0x00); bluefruit_serial_send(0x00); -- cgit v1.2.3-70-g09d2 From 23231fa577f7c6c585124226a83f21a7668e62dd Mon Sep 17 00:00:00 2001 From: IBNobody Date: Sun, 17 Apr 2016 14:16:03 -0500 Subject: Converted goodbye to notes, fixed eighth dotted note macro --- keyboard/atomic/keymaps/pvc/makefile.mk | 2 +- quantum/audio.h | 1 + quantum/keymap_common.c | 14 ++++++-------- quantum/musical_notes.h | 2 +- quantum/song_list.h | 7 ++++++- 5 files changed, 15 insertions(+), 11 deletions(-) (limited to 'quantum') diff --git a/keyboard/atomic/keymaps/pvc/makefile.mk b/keyboard/atomic/keymaps/pvc/makefile.mk index eefa42855..d46996650 100644 --- a/keyboard/atomic/keymaps/pvc/makefile.mk +++ b/keyboard/atomic/keymaps/pvc/makefile.mk @@ -1,7 +1,7 @@ BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000) MOUSEKEY_ENABLE = yes # Mouse keys(+4700) EXTRAKEY_ENABLE = yes # Audio control and System control(+450) -CONSOLE_ENABLE = no # Console for debug(+400) +CONSOLE_ENABLE = yes # Console for debug(+400) COMMAND_ENABLE = yes # Commands for debug and configuration NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality diff --git a/quantum/audio.h b/quantum/audio.h index 3aba8370a..05d314c94 100644 --- a/quantum/audio.h +++ b/quantum/audio.h @@ -3,6 +3,7 @@ #include #include #include "musical_notes.h" +#include "song_list.h" #ifndef AUDIO_H #define AUDIO_H diff --git a/quantum/keymap_common.c b/quantum/keymap_common.c index c705b7a73..2001438b9 100644 --- a/quantum/keymap_common.c +++ b/quantum/keymap_common.c @@ -34,15 +34,13 @@ extern keymap_config_t keymap_config; #include #ifdef AUDIO_ENABLE #include "audio.h" + #ifndef TONE_GOODBYE - #define TONE_GOODBYE { \ - {440.0*pow(2.0,(31)/12.0), 8}, \ - {440.0*pow(2.0,(24)/12.0), 8}, \ - {440.0*pow(2.0,(19)/12.0), 12}, \ - } - #endif - float tone_goodbye[][2] = TONE_GOODBYE; -#endif + #define TONE_GOODBYE OLKB_GOODBYE + #endif /*! TONE_GOODBYE */ + + float tone_goodbye[][2] = SONG(TONE_GOODBYE); +#endif /* AUDIO_ENABLE */ static action_t keycode_to_action(uint16_t keycode); diff --git a/quantum/musical_notes.h b/quantum/musical_notes.h index 2170f3f18..ccdc34f27 100644 --- a/quantum/musical_notes.h +++ b/quantum/musical_notes.h @@ -32,7 +32,7 @@ #define WD_NOTE(n) WHOLE_DOT_NOTE(n) #define HD_NOTE(n) HALF_DOT_NOTE(n) #define QD_NOTE(n) QUARTER_DOT_NOTE(n) -#define ED_NOTE(n) EIGTH_DOT_NOTE(n) +#define ED_NOTE(n) EIGHTH_DOT_NOTE(n) #define SD_NOTE(n) SIXTEENTH_DOT_NOTE(n) // Note Styles diff --git a/quantum/song_list.h b/quantum/song_list.h index ef36a1cdd..b626c3fa6 100644 --- a/quantum/song_list.h +++ b/quantum/song_list.h @@ -15,4 +15,9 @@ QD_NOTE(_B4), E__NOTE(_D5), Q__NOTE(_G5), \ H__NOTE(_FS5), -#endif \ No newline at end of file +#define OLKB_GOODBYE \ + E__NOTE(_E7), \ + E__NOTE(_A6), \ + ED_NOTE(_E6), + +#endif -- cgit v1.2.3-70-g09d2 From 6d40f7c5060f608068b0c4fc90871687c70b4f05 Mon Sep 17 00:00:00 2001 From: Stephan Bösebeck Date: Sun, 17 Apr 2016 22:19:47 +0200 Subject: added new experimental layout - works with ErgodoxLayoutGenerator --- keyboard/ergodox_ez/keymaps/osx_de/keymap.c | 703 +++++++++------------ .../ergodox_ez/keymaps/osx_de/osx_de_highres.png | Bin 263677 -> 189394 bytes .../keymaps/osx_de_experimental/keymap.c | 376 +++++++++++ .../osx_de_experimental_highres.png | Bin 0 -> 187629 bytes quantum/keymap_extras/keymap_german_osx.h | 4 +- 5 files changed, 689 insertions(+), 394 deletions(-) create mode 100644 keyboard/ergodox_ez/keymaps/osx_de_experimental/keymap.c create mode 100644 keyboard/ergodox_ez/keymaps/osx_de_experimental/osx_de_experimental_highres.png (limited to 'quantum') diff --git a/keyboard/ergodox_ez/keymaps/osx_de/keymap.c b/keyboard/ergodox_ez/keymaps/osx_de/keymap.c index dc47b8c1e..174f26cbe 100644 --- a/keyboard/ergodox_ez/keymaps/osx_de/keymap.c +++ b/keyboard/ergodox_ez/keymaps/osx_de/keymap.c @@ -1,417 +1,329 @@ #include "ergodox_ez.h" #include "debug.h" #include "action_layer.h" +#include "keymap_extras/keymap_french.h" +#include "keymap_extras/keymap_neo2.h" +#include "keymap_extras/keymap_uk.h" +#include "keymap_extras/keymap_colemak.h" +#include "keymap_extras/keymap_french_osx.h" +#include "keymap_extras/keymap_nordic.h" +#include "keymap_extras/keymap_dvorak.h" +#include "keymap_extras/keymap_german.h" +#include "keymap_extras/keymap_norwegian.c" +#include "keymap_extras/keymap_fr_ch.h" #include "keymap_extras/keymap_german_osx.h" +#include "keymap_extras/keymap_spanish.h" +#include "keymap_extras/keymap_bepo.h" -#define BASE 0 // default layer -#define SYMB 1 // symbols -#define MDIA 2 // media keys -#define SMLY 3 // media keys -#define NUMB 4 // number keys -#define EGOS 5 // Egoshooter layer - -#define M_CTRL_CMDV 1 -#define M_CTRL_CMDC 2 -#define M_MEH_SH_ACUT 3 -#define M_DE_OSX_PLUS_CTRLALT 12 -#define M_DE_OSX_CIRC_CTRLCMD 13 -#define M_TOGGLE_5 14 -#define M_CTL_SFT_HASH 15 -#define M_LGUI_SHFT 16 - -#define SM_SMILE 4 -#define SM_SMIRK 5 -#define SM_FROWN 6 -#define SM_CRY 7 -#define SM_KISS 8 -#define SM_HEART 9 -#define SM_LAUGH 10 -#define SM_SAD 11 +#define BASE 0 +#define SYMB 1 +#define MDIA 2 +#define SMLY 3 +#define NUMB 4 +#define EGOS 5 +#define M_CTRL_CMDV 0 +#define M_CTRL_CMDC 1 +#define M_MEH_SH_ACUT 2 +#define M_LGUI_SHFT 3 +#define M_CTL_SFT_HASH 4 +#define M_DE_OSX_CIRC_CTRLCMD 5 +#define M_DE_OSX_PLUS_CTRLALT 6 +#define SM_SMILE 7 +#define SM_SMIRK 8 +#define SM_CRY 9 +#define SM_SAD 10 +#define SM_HEART 11 +#define SM_LAUGH 12 +#define SM_KISS 13 +#define SM_FROWN 14 +#define M_TOGGLE_5 15 +//Layout keymap.c generated with ErgodoxLayoutGenerator V1.0BETA1 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { -/* Keymap 0: Basic layer - * - * ,-----------------------------------------------------. ,--------------------------------------------------. - * | ESC | 1 | 2 | 3 | 4 | 5 |CTL_SFT/#| |CTL_SFT/#| 6 | 7 | 8 | 9 | 0 | ß | - * |--------+------+------+------+------+----------------| |---------+------+------+------+------+------+--------| - * | TAB | Q | W | E | R | T | CMD | | CMD | Z | U | I | O | P | ü | - * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| - * | LALT | A | S | D | F | G |---------| |---------| H | J | K | L | ö | ä/RALT| - * |--------+------+------+------+------+------| LALT | | RALT |------+------+------+------+------+--------| - * | LShift |Y/Ctrl| X | C | V | B | | | | N | M | , | . |-/Ctrl| RShift | - * `--------+------+------+------+------+----------------' `-------------+------+------+------+------+--------' - * | | ! | ? | | | | | \ | [ | ] | < | > | ! | - * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| - * | | # | $ | \ | / | . |------| |------| / | ( | ) | { | } | # | - * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| - * | | | ^ | % | | | ~ | | | | | | ~ | ^ | UP | | $ | - * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' - * | | | | | | | ' | LEFT| DOWN | RIGHT | | - * `----------------------------------' `----------------------------------' - * ,-------------. ,-------------. - * | | | | F13 | F12 | - * ,------|------|------| |------+------+------. - * | | | | | F14 | | | - * | | |------| |------| | | - * | | | | | F15 | | | - * `--------------------' `--------------------' - */ -// SYMBOLS -[SYMB] = KEYMAP( - // left hand - KC_TRNS,KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TRNS, - KC_TRNS,DE_OSX_LESS,DE_OSX_MORE,DE_OSX_EXLM,DE_OSX_QST, KC_TRNS,KC_TRNS, - KC_TRNS,DE_OSX_HASH,DE_OSX_DLR, DE_OSX_BSLS,DE_OSX_SLSH,KC_DOT, - KC_TRNS,KC_TRNS,DE_OSX_LESS,DE_OSX_PERC,DE_OSX_PIPE,DE_OSX_TILD,KC_TRNS, - KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, - KC_TRNS,KC_TRNS, - KC_TRNS, - KC_TRNS,KC_DEL,KC_TRNS, - // right hand - M(M_TOGGLE_5), KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, - KC_TRNS, LALT(LSFT(KC_7)), LALT(KC_5), LALT(KC_6), DE_OSX_LESS, DE_OSX_MORE, DE_OSX_EXLM, - DE_OSX_SLSH, DE_OSX_LPRN, DE_OSX_RPRN, LALT(KC_8), LALT(KC_9), DE_OSX_HASH, - KC_TRNS, DE_OSX_PIPE, DE_OSX_TILD, DE_OSX_CIRC, KC_UP, DE_OSX_MINS, LSFT(KC_4), - DE_OSX_QUOT, KC_LEFT, KC_DOWN, KC_RIGHT, KC_TRNS, - KC_F13, KC_F12, - KC_F14, - KC_F15, KC_TRNS, KC_TRNS -), -/* Keymap 2: Media and mouse keys - * - * ,--------------------------------------------------. ,--------------------------------------------------. - * | | | | | | | | | Mute | | | | | | EGOS | - * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| - * | | | Lclk | MsUp | Rclk | WlUp | | | | | | | | | | - * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| - * | | |MsLeft|MsDown|MsRght| WlDw |------| |------|VolUp | | | | | | - * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| - * | | | | | | MClk | | | |VolDn | | Prev | Next | Up | | - * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' - * | | | | | | | | | Left | Down | Right | - * `----------------------------------' `----------------------------------' - * ,-------------. ,-------------. - * | | | | | | - * ,------|------|------| |------+------+------. - * | | | | | | |Brwser| - * | | |------| |------| |Back | - * | | | | | | | | - * `--------------------' `--------------------' - */ -// MEDIA AND MOUSE -[MDIA] = KEYMAP( - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_BTN1, KC_MS_U, KC_BTN2, KC_WH_U, KC_TRNS, - KC_TRNS, KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R, KC_WH_D, - KC_TRNS, KC_TRNS, KC_WH_L, KC_WH_D, KC_WH_R, KC_BTN3, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, - KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, - // right hand - KC_MUTE, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPLY, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_VOLU, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_VOLD, KC_TRNS, KC_MPRV, KC_MNXT, KC_UP, KC_TRNS, - KC_TRNS, KC_TRNS, KC_LEFT, KC_DOWN, KC_RIGHT, - KC_TRNS, KC_TRNS, - KC_TRNS, - KC_TRNS, KC_TRNS, KC_WBAK -), -/* Keymap 3: Smiley layer - * making it easier to type smileys... tipp: on osx you can easily replace those smileys with the UTF-8 character using - * keyboard short commands... - * - * ,--------------------------------------------------. ,--------------------------------------------------. - * | | | | | | | | | :-) | ;-) | :-D | | | | | - * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| - * | | | | | | | | | | :-{ | :-( | | | | | - * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| - * | | | | | | |------| |------| <3 | :-* | | | | | - * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| - * | | | | | | | | | | | | | | | | - * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' - * | | | | | | | | | | | r| - * `----------------------------------' `----------------------------------' - * ,-------------. ,-------------. - * | | | | | | - * ,------|------|------| |------+--------+------. - * | | | | | | | | - * | | |------| |------| | | - * | | | | | | | | - * `--------------------' `----------------------' - */ -[SMLY] = KEYMAP( - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, - KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, - // right hand - M(SM_SMILE), M(SM_SMIRK), M(SM_LAUGH), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, M(SM_FROWN), M(SM_SAD), M(SM_CRY), KC_TRNS, KC_TRNS, KC_TRNS, - M(SM_HEART), M(SM_KISS), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, - KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS -), -//number pad -[NUMB] = KEYMAP( - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_UP, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, - KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, - // right hand - KC_TRNS, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, - KC_TRNS, KC_UP, KC_7, KC_8, KC_9, LSFT(KC_RBRC), KC_F12, - KC_DOWN, KC_4, KC_5, KC_6, KC_RBRC, DE_OSX_MINS, - KC_TRNS, LSFT(KC_6), KC_1, KC_2, KC_3, LSFT(KC_7), KC_TRNS, - KC_0,KC_DOT, KC_COMM, DE_OSX_EQL, KC_TRNS, - KC_TRNS, KC_TRNS, - KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS -), - -/* Keymap 3: Egoshooter layer - * - * ,--------------------------------------------------. ,--------------------------------------------------. - * | | | | | | | | | L5 | | | | | | | - * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| - * | | | | | | | | | | | | | | | | - * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| - * | SHIFT | | | | | |------| |------| | | | | | | - * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| - * | | | | | | | | | | | | | | | | - * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' - * | CTRL | | | | | | | | | | | - * `----------------------------------' `----------------------------------' - * ,-------------. ,-------------. - * | F1 | F2 | | | | - * ,------|------|------| |------+--------+------. - * | | | F3 | | | | | - * | SPACE| CTRL|------| |------| | | - * | | | F4 | | | | | - * `--------------------' `----------------------' - */ -[EGOS] = KEYMAP( - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_LSFT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_LCTL, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_F1, KC_F2, - KC_F3, - KC_SPC, KC_LCTL, KC_F4, - // right hand - M(M_TOGGLE_5), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, - KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS -), +[BASE]=KEYMAP( +//left half + KC_ESC, DE_OSX_1, DE_OSX_2, DE_OSX_3, DE_OSX_4, DE_OSX_5, M(M_CTL_SFT_HASH), + KC_TAB, DE_OSX_Q, DE_OSX_W, DE_OSX_E, DE_OSX_R, DE_OSX_T, KC_LGUI, + KC_LALT, DE_OSX_A, DE_OSX_S, DE_OSX_D, DE_OSX_F, DE_OSX_G, + KC_LSFT, CTL_T(DE_OSX_Y), DE_OSX_X, DE_OSX_C, DE_OSX_V, DE_OSX_B, KC_LALT, + LT(SYMB,DE_OSX_LESS), M(M_DE_OSX_CIRC_CTRLCMD), M(M_DE_OSX_PLUS_CTRLALT), KC_UP, KC_DOWN, + M(M_MEH_SH_ACUT), TG(MDIA), + KC_HOME, + KC_BSPC, KC_DEL, LT(SMLY,KC_END), + //right half + M(M_CTL_SFT_HASH), DE_OSX_6, DE_OSX_7, DE_OSX_8, DE_OSX_9, DE_OSX_0, DE_OSX_SS, + KC_RGUI, DE_OSX_Z, DE_OSX_U, DE_OSX_I, DE_OSX_O, DE_OSX_P, DE_OSX_UE, + DE_OSX_H, DE_OSX_J, DE_OSX_K, DE_OSX_L, DE_OSX_OE, ALT_T(DE_OSX_AE), + KC_RALT, DE_OSX_N, DE_OSX_M, DE_OSX_COMM, DE_OSX_DOT, CTL_T(DE_OSX_MINS), KC_RSFT, + KC_LEFT, KC_RIGHT, LGUI(KC_LSFT), LALT(KC_LSFT), LT(SYMB,DE_OSX_PLUS), + TG(NUMB), ALL_T(DE_OSX_ACUT), + KC_PGUP, + KC_PGDN, KC_ENT, KC_SPC), +[SYMB]=KEYMAP( +//left half + KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TRNS, + KC_TRNS, DE_OSX_LESS, DE_OSX_MORE, DE_OSX_EXLM, DE_OSX_QST, KC_TRNS, KC_TRNS, + KC_TRNS, DE_OSX_HASH, DE_OSX_DLR, DE_OSX_BSLS, DE_OSX_SLSH, KC_DOT, + KC_TRNS, KC_TRNS, DE_OSX_LESS, DE_OSX_PERC, DE_OSX_PIPE, DE_OSX_TILD, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_DEL, KC_TRNS, + //right half + M(M_TOGGLE_5), KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, + KC_TRNS, LALT(LSFT(KC_7)), LALT(KC_5), LALT(KC_6), DE_OSX_LESS, DE_OSX_MORE, DE_OSX_EXLM, + DE_OSX_SLSH, DE_OSX_LPRN, DE_OSX_RPRN, LALT(KC_8), LALT(KC_9), DE_OSX_HASH, + KC_TRNS, DE_OSX_PIPE, DE_OSX_TILD, DE_OSX_CIRC, KC_UP, DE_OSX_MINS, LSFT(KC_4), + DE_OSX_QUOT, KC_LEFT, KC_DOWN, KC_RIGHT, KC_TRNS, + KC_F13, KC_F12, + KC_F14, + KC_F15, KC_TRNS, KC_TRNS), +[MDIA]=KEYMAP( +//left half + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_BTN1, KC_MS_U, KC_BTN2, KC_WH_U, KC_TRNS, + KC_TRNS, KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R, KC_WH_D, + KC_TRNS, KC_TRNS, KC_WH_L, KC_WH_D, KC_WH_R, KC_BTN3, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, + //right half + KC_MUTE, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPLY, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_VOLU, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_VOLD, KC_TRNS, KC_MPRV, KC_MNXT, KC_UP, KC_TRNS, + KC_TRNS, KC_TRNS, KC_LEFT, KC_DOWN, KC_RIGHT, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_WBAK), +[SMLY]=KEYMAP( +//left half + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, + //right half + M(SM_SMILE), M(SM_SMIRK), M(SM_LAUGH), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, M(SM_FROWN), M(SM_SAD), M(SM_CRY), KC_TRNS, KC_TRNS, KC_TRNS, + M(SM_HEART), M(SM_KISS), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS), +[NUMB]=KEYMAP( +//left half + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_UP, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, + //right half + KC_TRNS, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, + KC_TRNS, KC_UP, KC_7, KC_8, KC_9, LSFT(KC_RBRC), KC_F12, + KC_DOWN, KC_4, KC_5, KC_6, KC_RBRC, DE_OSX_MINS, + KC_TRNS, LSFT(KC_6), KC_1, KC_2, KC_3, LSFT(KC_7), KC_TRNS, + KC_0, KC_DOT, KC_COMM, DE_OSX_EQL, KC_TRNS, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS), +[EGOS]=KEYMAP( +//left half + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_LSFT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_LCTL, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_F1, KC_F2, + KC_F3, + KC_SPC, KC_LCTL, KC_F4, + //right half + M(M_TOGGLE_5), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS), }; const uint16_t PROGMEM fn_actions[] = { - [1] = ACTION_LAYER_TAP_TOGGLE(SYMB), // FN1 - Momentary Layer 1 (Symbols) - [2] = ACTION_LAYER_TAP_TOGGLE(SMLY) // FN2 - Momentary Layer 2 (Smiley) + }; const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) { - static uint16_t start; - // MACRODOWN only works in this function - switch(id) { - case M_CTRL_CMDV: - //Macro description: long press CTRL, type CMD-V - //Macro type: LT - if (record->event.pressed) { - start = timer_read(); - return MACRO(D(LCTRL), END); - } else { - if (timer_elapsed(start) > 150) { - return MACRO(U(LCTRL), END); - } else { - return MACRO(U(LCTRL), D(LGUI), T(V), U(LGUI), END); - } - } - break; - //End Macro - case M_CTRL_CMDC: - //Macro description: - //Macro type: LT - if (record->event.pressed) { +static uint16_t start; +switch(id) { +case M_TOGGLE_5: +//Macro: M_TOGGLE_5//----------------------- + if (record->event.pressed){ + layer_state ^= (1<<5); + layer_state &= (1<<5); + } + +break; +case M_CTRL_CMDC: +//Macro: M_CTRL_CMDC//----------------------- +if (record->event.pressed) { start = timer_read(); return MACRO(D(LCTRL),END); } else { - if (timer_elapsed(start) > 150){ + if (timer_elapsed(start) >150) { return MACRO(U(LCTRL),END); } else { return MACRO(U(LCTRL),D(LGUI),T(C),U(LGUI),END); } } - break; - case M_MEH_SH_ACUT: - if (record->event.pressed) { + +break; +case M_DE_OSX_PLUS_CTRLALT: +//Macro: M_DE_OSX_PLUS_CTRLALT//----------------------- +if (record->event.pressed) { start = timer_read(); - return MACRO(D(LCTRL),D(LSFT),D(LALT),END); + return MACRO(D(LCTRL),D(LALT),END); } else { - if (timer_elapsed(start) > 150){ - return MACRO(U(LCTRL),U(LSFT),U(LALT),END); + if (timer_elapsed(start) >150) { + return MACRO(U(LCTRL),U(LALT),END); } else { - return MACRO(U(LCTRL),U(LALT),T(EQL),U(LSFT),END); //cannot use DE_OSX_ACUT here, as macro needs KC_ prefix + return MACRO(U(LCTRL),U(LALT),T(RBRC),END); } } - break; - - case M_LGUI_SHFT: - if (record->event.pressed){ + +break; +case SM_KISS: +//Macro: SM_KISS//----------------------- +if (record->event.pressed) { + return MACRO(D(LSFT),T(DOT),U(LSFT),T(SLSH),D(LSFT),T(RBRC),U(LSFT),END); + } + +break; +case SM_FROWN: +//Macro: SM_FROWN//----------------------- +if (record->event.pressed) { + return MACRO(D(LSFT),T(DOT),U(LSFT),T(SLSH),D(LALT),T(8),U(LALT),END); + } + +break; +case SM_CRY: +//Macro: SM_CRY//----------------------- +if (record->event.pressed) { + return MACRO(D(LSFT),T(COMM),U(LSFT),T(SLSH),D(LSFT),T(8),U(LSFT),END); + } + +break; +case SM_SMILE: +//Macro: SM_SMILE//----------------------- +if (record->event.pressed) { + return MACRO(D(LSFT),T(DOT),U(LSFT),T(SLSH),D(LSFT),T(9),U(LSFT),END); + } + +break; +case SM_SMIRK: +//Macro: SM_SMIRK//----------------------- +if (record->event.pressed) { + return MACRO(D(LSFT),T(COMM),U(LSFT),T(SLSH),D(LSFT),T(9),U(LSFT),END); + } + +break; +case M_LGUI_SHFT: +//Macro: M_LGUI_SHFT//----------------------- +if (record->event.pressed){ return MACRO(D(LGUI),D(LSFT),END); }else{ return MACRO(U(LGUI),U(LSFT),END); } - break; - case M_CTL_SFT_HASH: - if (record->event.pressed) { - start=timer_read(); - return MACRO(D(LCTRL),D(LSFT),END); + +break; +case SM_HEART: +//Macro: SM_HEART//----------------------- +if (record->event.pressed) { + return MACRO(T(GRV),T(3),END); + } + +break; +case SM_LAUGH: +//Macro: SM_LAUGH//----------------------- +if (record->event.pressed) { + return MACRO(D(LSFT),T(DOT),U(LSFT),T(SLSH),D(LSFT),T(D),U(LSFT),END); + } + +break; +case M_CTL_SFT_HASH: +//Macro: M_CTL_SFT_HASH//----------------------- +if (record->event.pressed) { + start = timer_read(); + return MACRO(D(LCTRL),D(LSFT),END); } else { - if (timer_elapsed(start) > 150){ + if (timer_elapsed(start) >150) { return MACRO(U(LCTRL),U(LSFT),END); } else { return MACRO(U(LCTRL),U(LSFT),T(BSLS),END); } } - break; - case M_DE_OSX_CIRC_CTRLCMD: - if (record->event.pressed) { + +break; +case SM_SAD: +//Macro: SM_SAD//----------------------- +if (record->event.pressed) { + return MACRO(D(LSFT),T(DOT),U(LSFT),T(SLSH),D(LSFT),T(8),U(LSFT),END); + } + +break; +case M_DE_OSX_CIRC_CTRLCMD: +//Macro: M_DE_OSX_CIRC_CTRLCMD//----------------------- +if (record->event.pressed) { start = timer_read(); return MACRO(D(LCTRL),D(LGUI),END); } else { - if (timer_elapsed(start) > 150){ + if (timer_elapsed(start) >150) { return MACRO(U(LCTRL),U(LGUI),END); } else { - return MACRO(U(LCTRL),U(LGUI),T(NUBS),END); + return MACRO(U(LCTRL),U(LGUI),T(NUBS),END); } } - break; - case M_DE_OSX_PLUS_CTRLALT: - if (record->event.pressed) { + +break; +case M_CTRL_CMDV: +//Macro: M_CTRL_CMDV//----------------------- +if (record->event.pressed) { start = timer_read(); - return MACRO(D(LCTRL),D(LALT),END); + return MACRO(D(LCTRL),END); } else { - if (timer_elapsed(start) > 150){ - return MACRO(U(LCTRL),U(LALT),END); + if (timer_elapsed(start) >150) { + return MACRO(U(LCTRL),END); } else { - return MACRO(U(LCTRL),U(LALT),T(RBRC),END); + return MACRO(U(LCTRL),D(LGUI),T(V),U(LGUI),END); } } - break; - case SM_SMILE: - //MAcro description: :-) - //Macro type: MACRO - if (record->event.pressed) { - return MACRO(D(LSFT),T(DOT),U(LSFT),T(SLSH),D(LSFT),T(9),U(LSFT),END); - } - break; - case SM_SMIRK: - if (record->event.pressed) { - return MACRO(D(LSFT),T(COMM),U(LSFT),T(SLSH),D(LSFT),T(9),U(LSFT),END); - } - break; - case SM_CRY: - if (record->event.pressed) { - return MACRO(D(LSFT),T(COMM),U(LSFT),T(SLSH),D(LSFT),T(8),U(LSFT),END); - } - break; - - case SM_SAD: - if (record->event.pressed) { - return MACRO(D(LSFT),T(DOT),U(LSFT),T(SLSH),D(LSFT),T(8),U(LSFT),END); - } - break; - - case SM_HEART: - if (record->event.pressed) { - return MACRO(T(GRV),T(3),END); - } - break; - case SM_LAUGH: - if (record->event.pressed) { - return MACRO(D(LSFT),T(DOT),U(LSFT),T(SLSH),D(LSFT),T(D),U(LSFT),END); - } - break; - case SM_KISS: - if (record->event.pressed) { - return MACRO(D(LSFT),T(DOT),U(LSFT),T(SLSH),D(LSFT),T(RBRC),U(LSFT),END); - } - break; - case SM_FROWN: - if (record->event.pressed) { - return MACRO(D(LSFT),T(DOT),U(LSFT),T(SLSH),D(LALT),T(8),U(LALT),END); +break; +case M_MEH_SH_ACUT: +//Macro: M_MEH_SH_ACUT//----------------------- +if (record->event.pressed) { + start = timer_read(); + return MACRO(D(LCTRL),D(LSFT),D(LALT),END); + } else { + if (timer_elapsed(start) >150) { + return MACRO(U(LCTRL),U(LSFT),U(LALT),END); + } else { + return MACRO(U(LCTRL),U(LALT),T(EQL),U(LSFT),END); + } } - break; - case M_TOGGLE_5: - //Macro description: Toggle LAyer 5 (Egoshooter) - //Macro type: LToggle - if (record->event.pressed){ - layer_state ^= (1<<5); - layer_state &= (1<<5); - } - break; - //Macro End - } - return MACRO_NONE; + +break; +} +return MACRO_NONE; }; // Runs just one time when the keyboard initializes. @@ -422,36 +334,43 @@ void matrix_init_user(void) { // Runs constantly in the background, in a loop. void matrix_scan_user(void) { - uint8_t layer = biton32(layer_state); +uint8_t layer = biton32(layer_state); - ergodox_board_led_off(); - ergodox_right_led_1_off(); - ergodox_right_led_2_off(); - ergodox_right_led_3_off(); - switch (layer) { - // TODO: Make this relevant to the ErgoDox EZ. - case SYMB: - ergodox_right_led_1_on(); - break; - case MDIA: - ergodox_right_led_2_on(); - break; - case SMLY: - ergodox_right_led_3_on(); - break; - case NUMB: - ergodox_right_led_1_on(); - ergodox_right_led_3_on(); - //ergodox_board_led_on(); - break; - case EGOS: - ergodox_right_led_1_on(); - ergodox_right_led_2_on(); - ergodox_right_led_3_on(); - break; - default: - // none - break; - } +ergodox_board_led_off(); +ergodox_right_led_1_off(); +ergodox_right_led_2_off(); +ergodox_right_led_3_off(); +switch (layer) { + + case SYMB: + ergodox_right_led_1_on(); + + + break; + case MDIA: + + ergodox_right_led_2_on(); + + break; + case SMLY: + + + ergodox_right_led_3_on(); + break; + case NUMB: + ergodox_right_led_1_on(); + + ergodox_right_led_3_on(); + break; + case EGOS: + ergodox_right_led_1_on(); + ergodox_right_led_2_on(); + ergodox_right_led_3_on(); + break; +default: +// none +break; +} }; + diff --git a/keyboard/ergodox_ez/keymaps/osx_de/osx_de_highres.png b/keyboard/ergodox_ez/keymaps/osx_de/osx_de_highres.png index 30355c55a..9249f3d2d 100644 Binary files a/keyboard/ergodox_ez/keymaps/osx_de/osx_de_highres.png and b/keyboard/ergodox_ez/keymaps/osx_de/osx_de_highres.png differ diff --git a/keyboard/ergodox_ez/keymaps/osx_de_experimental/keymap.c b/keyboard/ergodox_ez/keymaps/osx_de_experimental/keymap.c new file mode 100644 index 000000000..dbc3eb990 --- /dev/null +++ b/keyboard/ergodox_ez/keymaps/osx_de_experimental/keymap.c @@ -0,0 +1,376 @@ +#include "ergodox_ez.h" +#include "debug.h" +#include "action_layer.h" +#include "keymap_extras/keymap_french.h" +#include "keymap_extras/keymap_neo2.h" +#include "keymap_extras/keymap_uk.h" +#include "keymap_extras/keymap_colemak.h" +#include "keymap_extras/keymap_french_osx.h" +#include "keymap_extras/keymap_nordic.h" +#include "keymap_extras/keymap_dvorak.h" +#include "keymap_extras/keymap_german.h" +#include "keymap_extras/keymap_norwegian.c" +#include "keymap_extras/keymap_fr_ch.h" +#include "keymap_extras/keymap_german_osx.h" +#include "keymap_extras/keymap_spanish.h" +#include "keymap_extras/keymap_bepo.h" + +#define BASE 0 +#define SYMB 1 +#define MDIA 2 +#define SMLY 3 +#define NUMB 4 +#define EGOS 5 + +#define M_TOGGLE_5 0 +#define M_CTRL_CMDC 1 +#define M_DE_OSX_PLUS_CTRLALT 2 +#define SM_KISS 3 +#define SM_FROWN 4 +#define SM_CRY 5 +#define SM_SMILE 6 +#define SM_SMIRK 7 +#define M_LGUI_SHFT 8 +#define SM_HEART 9 +#define SM_LAUGH 10 +#define M_CTL_SFT_HASH 11 +#define SM_SAD 12 +#define M_DE_OSX_CIRC_CTRLCMD 13 +#define M_CTRL_CMDV 14 +#define M_MEH_SH_ACUT 15 + +//Layout keymap.c generated with ErgodoxLayoutGenerator V1.0BETA1 +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +[BASE]=KEYMAP( +//left half + KC_ESC, DE_OSX_1, DE_OSX_2, DE_OSX_3, DE_OSX_4, DE_OSX_5, TG(NUMB), + KC_TAB, DE_OSX_Q, DE_OSX_W, DE_OSX_E, DE_OSX_R, DE_OSX_T, KC_LGUI, + KC_LALT, DE_OSX_A, DE_OSX_S, DE_OSX_D, DE_OSX_F, DE_OSX_G, + KC_LSFT, CTL_T(DE_OSX_Y), DE_OSX_X, DE_OSX_C, DE_OSX_V, DE_OSX_B, KC_LALT, + LT(SYMB,DE_OSX_LESS), M(M_DE_OSX_CIRC_CTRLCMD), M(M_DE_OSX_PLUS_CTRLALT), M(M_CTL_SFT_HASH), KC_LCTRL, + KC_HOME, KC_END, + KC_PGUP, + KC_BSPC, KC_DEL, KC_PGDN, + //right half + TG(MDIA), DE_OSX_6, DE_OSX_7, DE_OSX_8, DE_OSX_9, DE_OSX_0, DE_OSX_SS, + KC_RGUI, DE_OSX_Z, DE_OSX_U, DE_OSX_I, DE_OSX_O, DE_OSX_P, DE_OSX_UE, + DE_OSX_H, DE_OSX_J, DE_OSX_K, DE_OSX_L, DE_OSX_OE, ALT_T(DE_OSX_AE), + KC_RALT, DE_OSX_N, DE_OSX_M, DE_OSX_COMM, DE_OSX_DOT, CTL_T(DE_OSX_MINS), KC_RSFT, + M(M_MEH_SH_ACUT), ALL_T(DE_OSX_ACUT), LGUI(KC_LSFT), LALT(KC_LSFT), LT(SYMB,DE_OSX_PLUS), + KC_LEFT, KC_RIGHT, + KC_UP, + KC_DOWN, KC_ENT, KC_SPC), +[SYMB]=KEYMAP( +//left half + KC_APPLICATION, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F5, + KC_TRNS, DE_OSX_LESS, DE_OSX_MORE, DE_OSX_EXLM, DE_OSX_QST, KC_TRNS, KC_TRNS, + KC_TRNS, DE_OSX_HASH, DE_OSX_DLR, DE_OSX_BSLS, DE_OSX_SLSH, KC_DOT, + KC_TRNS, KC_TRNS, DE_OSX_LESS, DE_OSX_PERC, DE_OSX_PIPE, DE_OSX_TILD, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_DEL, KC_TRNS, + //right half + KC_F6, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, + KC_TRNS, DE_OSX_BSLS, DE_OSX_LBRC, DE_OSX_RBRC, DE_OSX_LESS, DE_OSX_MORE, DE_OSX_EXLM, + DE_OSX_SLSH, DE_OSX_LPRN, DE_OSX_RPRN, DE_OSX_LCBR, DE_OSX_RCBR, DE_OSX_HASH, + KC_TRNS, DE_OSX_PIPE, DE_OSX_TILD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + DE_OSX_QUOT, DE_OSX_DQOT, KC_TRNS, M(M_TOGGLE_5), KC_TRNS, + KC_F13, KC_F12, + KC_F14, + KC_F15, KC_TRNS, KC_TRNS), +[MDIA]=KEYMAP( +//left half + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_BTN1, KC_MS_U, KC_BTN2, KC_WH_U, KC_TRNS, + KC_TRNS, KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R, KC_WH_D, + KC_TRNS, KC_TRNS, KC_WH_L, KC_WH_D, KC_WH_R, KC_BTN3, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, + //right half + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPLY, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_VOLU, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_VOLD, KC_TRNS, KC_MPRV, KC_MNXT, KC_UP, KC_TRNS, + KC_MUTE, KC_TRNS, KC_LEFT, KC_DOWN, KC_RIGHT, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_WBAK), +[SMLY]=KEYMAP( +//left half + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, + //right half + M(SM_SMILE), M(SM_SMIRK), M(SM_LAUGH), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, M(SM_FROWN), M(SM_SAD), M(SM_CRY), KC_TRNS, KC_TRNS, KC_TRNS, + M(SM_HEART), M(SM_KISS), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS), +[NUMB]=KEYMAP( +//left half + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_UP, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, + //right half + KC_TRNS, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, + KC_TRNS, DE_OSX_SLSH, KC_7, KC_8, KC_9, DE_OSX_ASTR, KC_F12, + DE_OSX_SLSH, KC_4, KC_5, KC_6, DE_OSX_PLUS, DE_OSX_MINS, + KC_TRNS, DE_OSX_PERC, KC_1, KC_2, KC_3, KC_TRNS, KC_TRNS, + KC_0, KC_DOT, KC_COMM, DE_OSX_EQL, KC_TRNS, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS), +[EGOS]=KEYMAP( +//left half + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_LSFT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_LCTL, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_F1, KC_F2, + KC_F3, + KC_SPC, KC_LCTL, KC_F4, + //right half + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, M(M_TOGGLE_5), KC_TRNS, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS), +}; + +const uint16_t PROGMEM fn_actions[] = { + +}; + +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) +{ +static uint16_t start; +switch(id) { +case M_TOGGLE_5: +//Macro: M_TOGGLE_5//----------------------- + if (record->event.pressed){ + layer_state ^= (1<<5); + layer_state &= (1<<5); + } + +break; +case M_CTRL_CMDC: +//Macro: M_CTRL_CMDC//----------------------- +if (record->event.pressed) { + start = timer_read(); + return MACRO(D(LCTRL),END); + } else { + if (timer_elapsed(start) >150) { + return MACRO(U(LCTRL),END); + } else { + return MACRO(U(LCTRL),D(LGUI),T(C),U(LGUI),END); + } + } + +break; +case M_DE_OSX_PLUS_CTRLALT: +//Macro: M_DE_OSX_PLUS_CTRLALT//----------------------- +if (record->event.pressed) { + start = timer_read(); + return MACRO(D(LCTRL),D(LALT),END); + } else { + if (timer_elapsed(start) >150) { + return MACRO(U(LCTRL),U(LALT),END); + } else { + return MACRO(U(LCTRL),U(LALT),T(RBRC),END); + } + } + +break; +case SM_KISS: +//Macro: SM_KISS//----------------------- +if (record->event.pressed) { + return MACRO(D(LSFT),T(DOT),U(LSFT),T(SLSH),D(LSFT),T(RBRC),U(LSFT),END); + } + +break; +case SM_FROWN: +//Macro: SM_FROWN//----------------------- +if (record->event.pressed) { + return MACRO(D(LSFT),T(DOT),U(LSFT),T(SLSH),D(LALT),T(8),U(LALT),END); + } + +break; +case SM_CRY: +//Macro: SM_CRY//----------------------- +if (record->event.pressed) { + return MACRO(D(LSFT),T(COMM),U(LSFT),T(SLSH),D(LSFT),T(8),U(LSFT),END); + } + +break; +case SM_SMILE: +//Macro: SM_SMILE//----------------------- +if (record->event.pressed) { + return MACRO(D(LSFT),T(DOT),U(LSFT),T(SLSH),D(LSFT),T(9),U(LSFT),END); + } + +break; +case SM_SMIRK: +//Macro: SM_SMIRK//----------------------- +if (record->event.pressed) { + return MACRO(D(LSFT),T(COMM),U(LSFT),T(SLSH),D(LSFT),T(9),U(LSFT),END); + } + +break; +case M_LGUI_SHFT: +//Macro: M_LGUI_SHFT//----------------------- +if (record->event.pressed){ + return MACRO(D(LGUI),D(LSFT),END); + }else{ + return MACRO(U(LGUI),U(LSFT),U(LGUI),U(LSFT),U(LGUI),U(LSFT),U(LGUI),U(LSFT),U(LGUI),U(LSFT),U(LGUI),U(LSFT),U(LGUI),U(LSFT),END); + } + +break; +case SM_HEART: +//Macro: SM_HEART//----------------------- +if (record->event.pressed) { + return MACRO(T(GRV),T(3),END); + } + +break; +case SM_LAUGH: +//Macro: SM_LAUGH//----------------------- +if (record->event.pressed) { + return MACRO(D(LSFT),T(DOT),U(LSFT),T(SLSH),D(LSFT),T(D),U(LSFT),END); + } + +break; +case M_CTL_SFT_HASH: +//Macro: M_CTL_SFT_HASH//----------------------- +if (record->event.pressed) { + start = timer_read(); + return MACRO(D(LCTRL),D(LSFT),END); + } else { + if (timer_elapsed(start) >150) { + return MACRO(U(LCTRL),U(LSFT),END); + } else { + return MACRO(U(LCTRL),U(LSFT),T(BSLS),END); + } + } + +break; +case SM_SAD: +//Macro: SM_SAD//----------------------- +if (record->event.pressed) { + return MACRO(D(LSFT),T(DOT),U(LSFT),T(SLSH),D(LSFT),T(8),U(LSFT),END); + } + +break; +case M_DE_OSX_CIRC_CTRLCMD: +//Macro: M_DE_OSX_CIRC_CTRLCMD//----------------------- +if (record->event.pressed) { + start = timer_read(); + return MACRO(D(LCTRL),D(LGUI),END); + } else { + if (timer_elapsed(start) >150) { + return MACRO(U(LCTRL),U(LGUI),END); + } else { + return MACRO(U(LCTRL),U(LGUI),T(NUBS),END); + } + } + +break; +case M_CTRL_CMDV: +//Macro: M_CTRL_CMDV//----------------------- +if (record->event.pressed) { + start = timer_read(); + return MACRO(D(LCTRL),END); + } else { + if (timer_elapsed(start) >150) { + return MACRO(U(LCTRL),END); + } else { + return MACRO(U(LCTRL),D(LGUI),T(V),U(LGUI),END); + } + } + +break; +case M_MEH_SH_ACUT: +//Macro: M_MEH_SH_ACUT//----------------------- +if (record->event.pressed) { + start = timer_read(); + return MACRO(D(LCTRL),D(LSFT),D(LALT),END); + } else { + if (timer_elapsed(start) >150) { + return MACRO(U(LCTRL),U(LSFT),U(LALT),END); + } else { + return MACRO(U(LCTRL),U(LALT),T(EQL),U(LSFT),END); + } + } + +break; +} +return MACRO_NONE; +}; + +// Runs just one time when the keyboard initializes. +void matrix_init_user(void) { + +}; + +// Runs constantly in the background, in a loop. +void matrix_scan_user(void) { + +uint8_t layer = biton32(layer_state); + +ergodox_board_led_off(); +ergodox_right_led_1_off(); +ergodox_right_led_2_off(); +ergodox_right_led_3_off(); +switch (layer) { + + case SYMB: + ergodox_right_led_1_on(); + + + break; + case MDIA: + + ergodox_right_led_2_on(); + + break; + case SMLY: + + + ergodox_right_led_3_on(); + break; + case NUMB: + ergodox_right_led_1_on(); + + ergodox_right_led_3_on(); + break; + case EGOS: + ergodox_right_led_1_on(); + ergodox_right_led_2_on(); + ergodox_right_led_3_on(); + break; +default: +// none +break; +} + +}; + diff --git a/keyboard/ergodox_ez/keymaps/osx_de_experimental/osx_de_experimental_highres.png b/keyboard/ergodox_ez/keymaps/osx_de_experimental/osx_de_experimental_highres.png new file mode 100644 index 000000000..4ae517d8d Binary files /dev/null and b/keyboard/ergodox_ez/keymaps/osx_de_experimental/osx_de_experimental_highres.png differ diff --git a/quantum/keymap_extras/keymap_german_osx.h b/quantum/keymap_extras/keymap_german_osx.h index d0b77fb80..ee725bad5 100644 --- a/quantum/keymap_extras/keymap_german_osx.h +++ b/quantum/keymap_extras/keymap_german_osx.h @@ -85,8 +85,8 @@ #define DE_OSX_UNDS LSFT(DE_OSX_MINS) // _ // Alt-ed characters -#define DE_OSX_SQ2 LALT(KC_2) // ² -#define DE_OSX_SQ3 LALT(KC_3) // ³ +//#define DE_OSX_SQ2 LALT(KC_2) // ² +//#define DE_OSX_SQ3 LALT(KC_3) // ³ #define DE_OSX_LCBR LALT(KC_8) // { #define DE_OSX_LBRC LALT(KC_5) // [ #define DE_OSX_RBRC LALT(KC_6) // ] -- cgit v1.2.3-70-g09d2 From ce463ef424c5bd26b84ead7de5f31eab366f98eb Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Sun, 17 Apr 2016 18:14:42 -0400 Subject: audio fixes --- keyboard/preonic/keymaps/default/keymap.c | 7 +++++-- quantum/audio.c | 6 +++--- quantum/audio.h | 1 + 3 files changed, 9 insertions(+), 5 deletions(-) (limited to 'quantum') diff --git a/keyboard/preonic/keymaps/default/keymap.c b/keyboard/preonic/keymaps/default/keymap.c index 48bc72dab..2591af9f0 100644 --- a/keyboard/preonic/keymaps/default/keymap.c +++ b/keyboard/preonic/keymaps/default/keymap.c @@ -224,6 +224,7 @@ float tone_music[][2] = { {440.0*pow(2.0,(23)/12.0), 8}, {440.0*pow(2.0,(24)/12.0), 8} }; +float ode_to_joy[][2] = SONG(ODE_TO_JOY); #endif void persistant_default_layer_set(uint16_t default_layer) { @@ -312,7 +313,9 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) case 9: if (record->event.pressed) { #ifdef AUDIO_ENABLE - PLAY_NOTE_ARRAY(tone_music, false, 0); + init_notes(); + set_tempo(150); + PLAY_NOTE_ARRAY(ode_to_joy, false, .25); layer_on(_MUSIC); #endif } @@ -339,6 +342,6 @@ void process_action_user(keyrecord_t *record) { void matrix_init_user(void) { #ifdef AUDIO_ENABLE init_notes(); - play_notes(&start_up, false, 0); + PLAY_NOTE_ARRAY(start_up, false, 0); #endif } diff --git a/quantum/audio.c b/quantum/audio.c index 855e97361..e0413051a 100644 --- a/quantum/audio.c +++ b/quantum/audio.c @@ -257,7 +257,7 @@ ISR(TIMER3_COMPA_vect) { place = 0.0; } ICR3 = (int)(((double)F_CPU) / (frequencies[voice_place] * CPU_PRESCALER)); // Set max to the period - OCR3A = (int)((((double)F_CPU) / (note_frequency * CPU_PRESCALER)) * note_timbre); // Set compare to half the period + OCR3A = (int)((((double)F_CPU) / (frequencies[voice_place] * CPU_PRESCALER)) * note_timbre); // Set compare to half the period //OCR3A = (int)(((double)F_CPU) / (frequencies[voice_place] * CPU_PRESCALER)) >> 1 * duty_place; // Set compare to half the period place++; // if (duty_counter > (frequencies[voice_place] / 500)) { @@ -353,6 +353,7 @@ if (audio_config.enable) { if (note) stop_all_notes(); + notes = true; notes_pointer = np; notes_count = n_count; @@ -378,7 +379,6 @@ if (audio_config.enable) { TCCR3A |= _BV(COM3A1); #endif - notes = true; } } @@ -408,6 +408,7 @@ if (audio_config.enable && voices < 8) { if (notes) stop_all_notes(); + note = true; #ifdef PWM_AUDIO freq = freq / SAMPLE_RATE; #endif @@ -439,7 +440,6 @@ if (audio_config.enable && voices < 8) { TCCR3A |= _BV(COM3A1); #endif - note = true; } } diff --git a/quantum/audio.h b/quantum/audio.h index 3aba8370a..05d314c94 100644 --- a/quantum/audio.h +++ b/quantum/audio.h @@ -3,6 +3,7 @@ #include #include #include "musical_notes.h" +#include "song_list.h" #ifndef AUDIO_H #define AUDIO_H -- cgit v1.2.3-70-g09d2 From 5c98ad59606ee95b82c27bf2525383a9ec88542b Mon Sep 17 00:00:00 2001 From: IBNobody Date: Sun, 17 Apr 2016 20:14:37 -0500 Subject: Added extra songs, LED indicator notes --- keyboard/atomic/atomic.c | 31 +++- keyboard/atomic/keymaps/pvc/config.h | 10 +- keyboard/atomic/keymaps/pvc/keymap.c | 292 ++++++++++++++++++-------------- keyboard/atomic/keymaps/pvc/makefile.mk | 2 +- keyboard/planck/keymaps/pvc_planck.c | 24 +-- keyboard/retro_refit/retro_refit.c | 32 ++-- quantum/audio.c | 17 +- quantum/audio.h | 2 + quantum/keymap_common.c | 14 +- quantum/musical_notes.h | 5 + quantum/song_list.h | 104 ++++++++++-- tmk_core/common/command.c | 7 + 12 files changed, 346 insertions(+), 194 deletions(-) (limited to 'quantum') diff --git a/keyboard/atomic/atomic.c b/keyboard/atomic/atomic.c index 30e812289..5e31264e6 100644 --- a/keyboard/atomic/atomic.c +++ b/keyboard/atomic/atomic.c @@ -2,12 +2,22 @@ __attribute__ ((weak)) void matrix_init_user(void) { - // leave these blank -} + // leave this function blank - it can be defined in a keymap file +}; __attribute__ ((weak)) void matrix_scan_user(void) { - // leave these blank + // leave this function blank - it can be defined in a keymap file +} + +__attribute__ ((weak)) +void process_action_user(keyrecord_t *record) { + // leave this function blank - it can be defined in a keymap file +} + +__attribute__ ((weak)) +void led_set_user(uint8_t usb_led) { + // leave this function blank - it can be defined in a keymap file } void matrix_init_kb(void) { @@ -33,4 +43,17 @@ void matrix_scan_kb(void) { // runs every cycle (a lot) matrix_scan_user(); -} \ No newline at end of file +} + +void process_action_kb(keyrecord_t *record) { + // put your per-action keyboard code here + // runs for every action, just before processing by the firmware + + process_action_user(record); +} + +void led_set_kb(uint8_t usb_led) { + // put your keyboard LED indicator (ex: Caps Lock LED) toggling code here + + led_set_user(usb_led); +} diff --git a/keyboard/atomic/keymaps/pvc/config.h b/keyboard/atomic/keymaps/pvc/config.h index 8449fa06d..cb0b78e44 100644 --- a/keyboard/atomic/keymaps/pvc/config.h +++ b/keyboard/atomic/keymaps/pvc/config.h @@ -41,7 +41,7 @@ along with this program. If not, see . * DIODE_DIRECTION: COL2ROW = COL = Anode (+), ROW = Cathode (-, marked on diode) * ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode) * -*/ +*/ #define COLS (int []){ F1, F0, B0, C7, F4, F5, F6, F7, D4, D6, B4, D7, D3, D2, D1 } #define ROWS (int []){ D0, D5, B5, B6, B3 } @@ -62,17 +62,17 @@ along with this program. If not, see . /* Locking resynchronize hack */ #define LOCKING_RESYNC_ENABLE -/* +/* * Force NKRO * - * Force NKRO (nKey Rollover) to be enabled by default, regardless of the saved + * Force NKRO (nKey Rollover) to be enabled by default, regardless of the saved * state in the bootmagic EEPROM settings. (Note that NKRO must be enabled in the * makefile for this to work.) * * If forced on, NKRO can be disabled via magic key (default = LShift+RShift+N) * until the next keyboard reset. * - * NKRO may prevent your keystrokes from being detected in the BIOS, but it is + * NKRO may prevent your keystrokes from being detected in the BIOS, but it is * fully operational during normal computer usage. * * For a less heavy-handed approach, enable NKRO via magic key (LShift+RShift+N) @@ -90,7 +90,7 @@ along with this program. If not, see . * the keyboard. They are best used in combination with the HID Listen program, * found here: https://www.pjrc.com/teensy/hid_listen.html * - * The options below allow the magic key functionality to be changed. This is + * The options below allow the magic key functionality to be changed. This is * useful if your keyboard/keypad is missing keys and you want magic key support. * */ diff --git a/keyboard/atomic/keymaps/pvc/keymap.c b/keyboard/atomic/keymaps/pvc/keymap.c index aaef6b041..563519e4c 100644 --- a/keyboard/atomic/keymaps/pvc/keymap.c +++ b/keyboard/atomic/keymaps/pvc/keymap.c @@ -1,17 +1,18 @@ #include "atomic.h" #include "action_layer.h" +#include "led.h" #ifdef AUDIO_ENABLE #include "audio.h" #include "song_list.h" #endif - #define _QW 0 #define _LW 1 #define _RS 2 #define _AD 3 #define _FN 4 +#define _MUSIC 4 #define M_QW 0 #define M_LW 1 @@ -24,6 +25,24 @@ #define M_TU 8 #define M_TD 9 #define M_DF 10 +#define M_MUSIC_ON 11 +#define M_MUSIC_OFF 12 +#define M_AUDIO_ON 13 +#define M_AUDIO_OFF 14 + +#define TIMBR_1 M(M_T1) +#define TIMBR_2 M(M_T2) +#define TIMBR_3 M(M_T3) +#define TIMBR_4 M(M_T4) +#define TMPO_UP M(M_TU) +#define TMPO_DN M(M_TD) +#define TMPO_DF M(M_DF) + + +#define MUS_ON M(M_MUSIC_ON) +#define MUS_OFF M(M_MUSIC_OFF) +#define AUD_OFF M(M_AUDIO_OFF) +#define AUD_ON M(M_AUDIO_ON) #define _______ KC_TRNS @@ -70,135 +89,40 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { { KC_NLCK, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, ___T___, ___T___ }, { KC_SLCK, KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_F21, KC_F22, KC_F23, KC_F24, KC_PAUS, KC_PSCR }, { KC_CAPS, KC_BTN5, KC_BTN4, KC_BTN3, KC_BTN2, KC_ACL0, KC_ACL2, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY, _______, ___T___, ___T___, KC_WH_U }, - { _______, M(M_T1), M(M_T2), M(M_T3), M(M_T4), M(M_TU), M(M_TD), M(M_DF), _______, _______, _______, ___T___, ___T___, KC_MS_U, KC_WH_D }, + { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, ___T___, ___T___, KC_MS_U, KC_WH_D }, { _______, _______, _______, _______, _______, KC_BTN1, KC_BTN1, _______, _______, _______, _______, _______, KC_MS_L, KC_MS_D, KC_MS_R }, }, [_AD] = { /* ADJUST */ + { _______, TIMBR_1, TIMBR_2, TIMBR_3, TIMBR_4, TMPO_UP, TMPO_DN, TMPO_DF, _______, MUS_ON, MUS_OFF, AUD_ON, AUD_OFF, ___T___, ___T___ }, + { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ }, + { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, ___T___, ___T___, _______ }, + { _______, _______, _______, _______, _______, RESET, _______, _______, _______, _______, _______, ___T___, ___T___, _______, _______ }, + { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ }, + }, +[_MUSIC] = { { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, ___T___, ___T___ }, { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ }, { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, ___T___, ___T___, _______ }, { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, ___T___, ___T___, _______, _______ }, { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ }, - }, -}; - - - -#ifdef AUDIO_ENABLE +} -float start_up[][2] = SONG(ODE_TO_JOY); - -float tone_lw[][2] = { - - Q__NOTE(_C4 ) , - Q__NOTE(_CS4 ) , - Q__NOTE(_D4 ) , - Q__NOTE(_DS4 ) , - Q__NOTE(_E4 ) , - Q__NOTE(_F4 ) , - Q__NOTE(_FS4 ) , - Q__NOTE(_G4 ) , - Q__NOTE(_GS4 ) , - Q__NOTE(_A4 ) , - Q__NOTE(_AS4 ) , - - Q__NOTE(_B1 ) , - - Q__NOTE(_C2 ) , - Q__NOTE(_CS2 ) , - Q__NOTE(_D2 ) , - Q__NOTE(_DS2 ) , - Q__NOTE(_E2 ) , - Q__NOTE(_F2 ) , - Q__NOTE(_FS2 ) , - Q__NOTE(_G2 ) , - Q__NOTE(_GS2 ) , - Q__NOTE(_A2 ) , - Q__NOTE(_AS2 ) , - Q__NOTE(_B2 ) , - Q__NOTE(_C3 ) , - Q__NOTE(_CS3 ) , - Q__NOTE(_D3 ) , - Q__NOTE(_DS3 ) , - Q__NOTE(_E3 ) , - Q__NOTE(_F3 ) , - Q__NOTE(_FS3 ) , - Q__NOTE(_G3 ) , - Q__NOTE(_GS3 ) , - Q__NOTE(_A3 ) , - Q__NOTE(_AS3 ) , - Q__NOTE(_B3 ) , - Q__NOTE(_C4 ) , - Q__NOTE(_CS4 ) , - Q__NOTE(_D4 ) , - Q__NOTE(_DS4 ) , - Q__NOTE(_E4 ) , - Q__NOTE(_F4 ) , - Q__NOTE(_FS4 ) , - Q__NOTE(_G4 ) , - Q__NOTE(_GS4 ) , - Q__NOTE(_A4 ) , - Q__NOTE(_AS4 ) , - Q__NOTE(_B4 ) , - Q__NOTE(_C5 ) , - Q__NOTE(_CS5 ) , - Q__NOTE(_D5 ) , - Q__NOTE(_DS5 ) , - Q__NOTE(_E5 ) , - Q__NOTE(_F5 ) , - Q__NOTE(_FS5 ) , - Q__NOTE(_G5 ) , - Q__NOTE(_GS5 ) , - Q__NOTE(_A5 ) , - Q__NOTE(_AS5 ) , - Q__NOTE(_B5 ) , - Q__NOTE(_C6 ) , - Q__NOTE(_CS6 ) , - Q__NOTE(_D6 ) , - Q__NOTE(_DS6 ) , - Q__NOTE(_E6 ) , - Q__NOTE(_F6 ) , - Q__NOTE(_FS6 ) , - Q__NOTE(_G6 ) , - Q__NOTE(_GS6 ) , - Q__NOTE(_A6 ) , - Q__NOTE(_AS6 ) , - Q__NOTE(_B6 ) , - Q__NOTE(_C7 ) , - Q__NOTE(_CS7 ) , - Q__NOTE(_D7 ) , - Q__NOTE(_DS7 ) , - Q__NOTE(_E7 ) , - Q__NOTE(_F7 ) , - Q__NOTE(_FS7 ) , - Q__NOTE(_G7 ) , - Q__NOTE(_GS7 ) , - Q__NOTE(_A7 ) , - Q__NOTE(_AS7 ) , - Q__NOTE(_B7 ) , - Q__NOTE(_C8 ) , - Q__NOTE(_CS8 ) , - Q__NOTE(_D8 ) , - Q__NOTE(_DS8 ) , - Q__NOTE(_E8 ) , - Q__NOTE(_F8 ) , - Q__NOTE(_FS8 ) , - Q__NOTE(_G8 ) , - Q__NOTE(_GS8 ) , - Q__NOTE(_A8 ) , - Q__NOTE(_AS8 ) , - Q__NOTE(_B8 ) , }; -float tone_rs[][2] = SONG(ROCK_A_BYE_BABY); +#ifdef AUDIO_ENABLE -void matrix_init_user(void) { - init_notes(); - PLAY_NOTE_ARRAY(start_up, false, STACCATO); - println("Matrix Init"); -} +float tone_my_startup[][2] = SONG(ODE_TO_JOY); +float tone_my_goodbye[][2] = SONG(ROCK_A_BYE_BABY); +float tone_audio_on[][2] = SONG(CLOSE_ENCOUNTERS_5_NOTE); +float tone_music_on[][2] = SONG(DOE_A_DEER); +float tone_caps_on[][2] = SONG(CAPS_LOCK_ON_SOUND); +float tone_caps_off[][2] = SONG(CAPS_LOCK_OFF_SOUND); +float tone_numlk_on[][2] = SONG(NUM_LOCK_ON_SOUND); +float tone_numlk_off[][2] = SONG(NUM_LOCK_OFF_SOUND); +float tone_scroll_on[][2] = SONG(SCROLL_LOCK_ON_SOUND); +float tone_scroll_off[][2] = SONG(SCROLL_LOCK_OFF_SOUND); -#endif +#endif /* AUDIO_ENABLE */ void update_quad_layer(uint8_t layer1, uint8_t layer2, uint8_t layer3, uint8_t layer4, bool order) @@ -242,9 +166,6 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) { case M_LW: if (record->event.pressed) { - #ifdef AUDIO_ENABLE - PLAY_NOTE_ARRAY(tone_lw, false, STACCATO); - #endif layer_on(_LW); update_tri_layer(_LW, _RS, _AD); } else { @@ -254,9 +175,6 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) break; case M_RS: if (record->event.pressed) { - #ifdef AUDIO_ENABLE - PLAY_NOTE_ARRAY(tone_rs, false, LEGATO); - #endif layer_on(_RS); update_tri_layer(_LW, _RS, _AD); } else { @@ -306,9 +224,135 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) } break; + case M_AUDIO_OFF: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + audio_off(); + #endif + } + break; + + case M_AUDIO_ON: + if (record->event.pressed) + { + #ifdef AUDIO_ENABLE + audio_on(); + PLAY_NOTE_ARRAY(tone_audio_on, false, STACCATO); + #endif + } + break; + + case M_MUSIC_ON: + if (record->event.pressed) + { + #ifdef AUDIO_ENABLE + PLAY_NOTE_ARRAY(tone_music_on, false, STACCATO); + layer_on(_MUSIC); + #endif + } + break; + + case M_MUSIC_OFF: + if (record->event.pressed) + { + #ifdef AUDIO_ENABLE + layer_off(_MUSIC); + stop_all_notes(); + #endif + } + break; + default: break; } return MACRO_NONE; -}; \ No newline at end of file +}; + + +#ifdef AUDIO_ENABLE + +uint8_t starting_note = 0x0C; +int offset = 7; + + +void process_action_user(keyrecord_t *record) +{ + if (IS_LAYER_ON(_MUSIC)) + { + if (record->event.pressed) + { + play_note(((double)220.0)*pow(2.0, -4.0)*pow(2.0,(starting_note + SCALE[record->event.key.col + offset])/12.0+(MATRIX_ROWS - record->event.key.row)), 0xF); + } + else + { + stop_note(((double)220.0)*pow(2.0, -4.0)*pow(2.0,(starting_note + SCALE[record->event.key.col + offset])/12.0+(MATRIX_ROWS - record->event.key.row))); + } + } +} + + +void matrix_init_user(void) +{ + init_notes(); + play_startup_tone(); + println("Matrix Init"); +} + +void led_set_user(uint8_t usb_led) +{ + static uint8_t old_usb_led = 0; + static bool first_run = true; + + // Skip first execution to avoid beeps caused by LED states being detected on power-up + if (!first_run) + { + + if ((usb_led & (1< 1) { - layer_on(layer); - } else { - layer_off(layer); - } -} - - const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) { // MACRODOWN only works in this function @@ -161,13 +151,11 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) if (record->event.pressed) { print("RS_DN"); layer_on(_RS); - tri_layer++; - update_tri_layer(_FN); + update_tri_layer(_RS, _LW, _FN); } else { print("RS_UP"); layer_off(_RS); - tri_layer--; - update_tri_layer(_FN); + update_tri_layer(_RS, _LW, _FN); phex(layer_state); } break; @@ -176,13 +164,11 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) if (record->event.pressed) { print("LW_DN"); layer_on(_LW); - tri_layer++; - update_tri_layer(_FN); + update_tri_layer(_RS, _LW, _FN); } else { print("LW_UP"); layer_off(_LW); - tri_layer--; - update_tri_layer(_FN); + update_tri_layer(_RS, _LW, _FN); } break; diff --git a/keyboard/retro_refit/retro_refit.c b/keyboard/retro_refit/retro_refit.c index 0b13eb830..78b6edca7 100644 --- a/keyboard/retro_refit/retro_refit.c +++ b/keyboard/retro_refit/retro_refit.c @@ -2,39 +2,39 @@ __attribute__ ((weak)) void matrix_init_user(void) { - // leave this function blank - it can be defined in a keymap file + // leave this function blank - it can be defined in a keymap file }; __attribute__ ((weak)) void matrix_scan_user(void) { - // leave this function blank - it can be defined in a keymap file + // leave this function blank - it can be defined in a keymap file }; __attribute__ ((weak)) void led_set_user(uint8_t usb_led) { - // leave this function blank - it can be defined in a keymap file + // leave this function blank - it can be defined in a keymap file }; void matrix_init_kb(void) { - // put your keyboard start-up code here - // runs once when the firmware starts up - - // Disable status LED on KB, enable status LED on Teensy (KB_STATUS = !TEENSY_STATUS) - DDRD |= (1<<6); - PORTD |= (1<<6); - - matrix_init_user(); + // put your keyboard start-up code here + // runs once when the firmware starts up + + // Disable status LED on KB, enable status LED on Teensy (KB_STATUS = !TEENSY_STATUS) + DDRD |= (1<<6); + PORTD |= (1<<6); + + matrix_init_user(); }; void amatrix_scan_kb(void) { // put your looping keyboard code here // runs every cycle (a lot) - matrix_scan_user(); + matrix_scan_user(); }; void led_set_kb(uint8_t usb_led) { - // put your keyboard LED indicator (ex: Caps Lock LED) toggling code here + // put your keyboard LED indicator (ex: Caps Lock LED) toggling code here if (usb_led & (1< #ifdef AUDIO_ENABLE #include "audio.h" - - #ifndef TONE_GOODBYE - #define TONE_GOODBYE OLKB_GOODBYE - #endif /*! TONE_GOODBYE */ - - float tone_goodbye[][2] = SONG(TONE_GOODBYE); #endif /* AUDIO_ENABLE */ static action_t keycode_to_action(uint16_t keycode); @@ -47,7 +41,7 @@ static action_t keycode_to_action(uint16_t keycode); /* converts key to action */ action_t action_for_key(uint8_t layer, keypos_t key) { - // 16bit keycodes - important + // 16bit keycodes - important uint16_t keycode = keymap_key_to_keycode(layer, key); switch (keycode) { @@ -190,7 +184,7 @@ static action_t keycode_to_action(uint16_t keycode) case RESET: ; // RESET is 0x5000, which is why this is here clear_keyboard(); #ifdef AUDIO_ENABLE - PLAY_NOTE_ARRAY(tone_goodbye, false, 0); + play_goodbye_tone(); #endif _delay_ms(250); #ifdef ATREUS_ASTAR @@ -303,7 +297,7 @@ static action_t keycode_to_action(uint16_t keycode) /* translates key to keycode */ uint16_t keymap_key_to_keycode(uint8_t layer, keypos_t key) { - // Read entire word (16bits) + // Read entire word (16bits) return pgm_read_word(&keymaps[(layer)][(key.row)][(key.col)]); } @@ -315,7 +309,7 @@ action_t keymap_fn_to_action(uint16_t keycode) action_t keymap_func_to_action(uint16_t keycode) { - // For FUNC without 8bit limit + // For FUNC without 8bit limit return (action_t){ .code = pgm_read_word(&fn_actions[(int)keycode]) }; } diff --git a/quantum/musical_notes.h b/quantum/musical_notes.h index ccdc34f27..b08d16a6f 100644 --- a/quantum/musical_notes.h +++ b/quantum/musical_notes.h @@ -51,7 +51,10 @@ // Notes - # = Octave + #define NOTE_REST 0.00 + +/* These notes are currently bugged #define NOTE_C0 16.35 #define NOTE_CS0 17.32 #define NOTE_D0 18.35 @@ -75,6 +78,8 @@ #define NOTE_GS1 51.91 #define NOTE_A1 55.00 #define NOTE_AS1 58.27 +*/ + #define NOTE_B1 61.74 #define NOTE_C2 65.41 #define NOTE_CS2 69.30 diff --git a/quantum/song_list.h b/quantum/song_list.h index b626c3fa6..e992bd18a 100644 --- a/quantum/song_list.h +++ b/quantum/song_list.h @@ -4,20 +4,98 @@ #define SONG_LIST_H #define ODE_TO_JOY \ - Q__NOTE(_E4), Q__NOTE(_E4), Q__NOTE(_F4), Q__NOTE(_G4), \ - Q__NOTE(_G4), Q__NOTE(_F4), Q__NOTE(_E4), Q__NOTE(_D4), \ - Q__NOTE(_C4), Q__NOTE(_C4), Q__NOTE(_D4), Q__NOTE(_E4), \ - QD_NOTE(_E4), E__NOTE(_D4), H__NOTE(_D4), + Q__NOTE(_E4), Q__NOTE(_E4), Q__NOTE(_F4), Q__NOTE(_G4), \ + Q__NOTE(_G4), Q__NOTE(_F4), Q__NOTE(_E4), Q__NOTE(_D4), \ + Q__NOTE(_C4), Q__NOTE(_C4), Q__NOTE(_D4), Q__NOTE(_E4), \ + QD_NOTE(_E4), E__NOTE(_D4), H__NOTE(_D4), #define ROCK_A_BYE_BABY \ - QD_NOTE(_B4), E__NOTE(_D4), Q__NOTE(_B5), \ - H__NOTE(_A5), Q__NOTE(_G5), \ - QD_NOTE(_B4), E__NOTE(_D5), Q__NOTE(_G5), \ - H__NOTE(_FS5), - -#define OLKB_GOODBYE \ - E__NOTE(_E7), \ - E__NOTE(_A6), \ - ED_NOTE(_E6), + QD_NOTE(_B4), E__NOTE(_D4), Q__NOTE(_B5), \ + H__NOTE(_A5), Q__NOTE(_G5), \ + QD_NOTE(_B4), E__NOTE(_D5), Q__NOTE(_G5), \ + H__NOTE(_FS5), + +#define CLOSE_ENCOUNTERS_5_NOTE \ + Q__NOTE(_D5), \ + Q__NOTE(_E5), \ + Q__NOTE(_C5), \ + Q__NOTE(_C4), \ + Q__NOTE(_G4), + +#define DOE_A_DEER \ + QD_NOTE(_C4), E__NOTE(_D4), \ + QD_NOTE(_E4), E__NOTE(_C4), \ + Q__NOTE(_E4), Q__NOTE(_C4), \ + Q__NOTE(_E4), + +#define GOODBYE_SOUND \ + E__NOTE(_E7), \ + E__NOTE(_A6), \ + ED_NOTE(_E6), + +#define STARTUP_SOUND \ + ED_NOTE(_E7 ), \ + E__NOTE(_CS7), \ + E__NOTE(_E6 ), \ + E__NOTE(_A6 ), \ + M__NOTE(_CS7, 20), + +#define QWERTY_SOUND \ + E__NOTE(_GS6 ), \ + E__NOTE(_A6 ), \ + S__NOTE(_REST), \ + Q__NOTE(_E7 ), + +#define COLEMAK_SOUND \ + E__NOTE(_GS6 ), \ + E__NOTE(_A6 ), \ + S__NOTE(_REST), \ + ED_NOTE(_E7 ), \ + S__NOTE(_REST), \ + ED_NOTE(_GS7 ), + +#define DVORAK_SOUND \ + E__NOTE(_GS6 ), \ + E__NOTE(_A6 ), \ + S__NOTE(_REST), \ + E__NOTE(_E7 ), \ + S__NOTE(_REST), \ + E__NOTE(_FS7 ), \ + S__NOTE(_REST), \ + E__NOTE(_E7 ), + +#define MUSIC_SCALE_SOUND \ + E__NOTE(_A5 ), \ + E__NOTE(_B5 ), \ + E__NOTE(_CS6), \ + E__NOTE(_D6 ), \ + E__NOTE(_E6 ), \ + E__NOTE(_FS6), \ + E__NOTE(_GS6), \ + E__NOTE(_A6 ), + +#define CAPS_LOCK_ON_SOUND \ + E__NOTE(_A3), \ + E__NOTE(_B3), + +#define CAPS_LOCK_OFF_SOUND \ + E__NOTE(_B3), \ + E__NOTE(_A3), + +#define SCROLL_LOCK_ON_SOUND \ + E__NOTE(_D4), \ + E__NOTE(_E4), + +#define SCROLL_LOCK_OFF_SOUND \ + E__NOTE(_E4), \ + E__NOTE(_D4), + +#define NUM_LOCK_ON_SOUND \ + E__NOTE(_D5), \ + E__NOTE(_E5), + +#define NUM_LOCK_OFF_SOUND \ + E__NOTE(_E5), \ + E__NOTE(_D5), #endif diff --git a/tmk_core/common/command.c b/tmk_core/common/command.c index 7572b9597..f06abaf7f 100644 --- a/tmk_core/common/command.c +++ b/tmk_core/common/command.c @@ -49,6 +49,10 @@ along with this program. If not, see . # include "usbdrv.h" #endif +#ifdef AUDIO_ENABLE + #include "audio.h" +#endif /* AUDIO_ENABLE */ + static bool command_common(uint8_t code); static void command_common_help(void); @@ -352,6 +356,9 @@ static bool command_common(uint8_t code) case MAGIC_KC(MAGIC_KEY_BOOTLOADER): clear_keyboard(); // clear to prevent stuck keys print("\n\nJumping to bootloader... "); + #ifdef AUDIO_ENABLE + play_goodbye_tone(); + #endif _delay_ms(1000); bootloader_jump(); // not return break; -- cgit v1.2.3-70-g09d2 From 89a78f4a11a8f04777b3407c958dc989b4d7d884 Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Sun, 17 Apr 2016 21:26:06 -0400 Subject: audio fixes --- quantum/audio.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'quantum') diff --git a/quantum/audio.c b/quantum/audio.c index 5805da46c..69c58ca6c 100644 --- a/quantum/audio.c +++ b/quantum/audio.c @@ -351,7 +351,7 @@ void play_notes(float (*np)[][2], uint8_t n_count, bool n_repeat, float n_rest) if (audio_config.enable) { - if (note || notes) + if (note) stop_all_notes(); notes = true; @@ -406,7 +406,7 @@ void play_note(double freq, int vol) { if (audio_config.enable && voices < 8) { - if (note || notes) + if (notes) stop_all_notes(); note = true; #ifdef PWM_AUDIO -- cgit v1.2.3-70-g09d2 From ef73ab662812232f5e73c8098a059439dcb201fa Mon Sep 17 00:00:00 2001 From: IBNobody Date: Sun, 17 Apr 2016 22:08:05 -0500 Subject: Notes Bugfix --- keyboard/atomic/keymaps/pvc/keymap.c | 65 ++++++++++++++++-------------------- quantum/audio.c | 6 ++-- 2 files changed, 33 insertions(+), 38 deletions(-) (limited to 'quantum') diff --git a/keyboard/atomic/keymaps/pvc/keymap.c b/keyboard/atomic/keymaps/pvc/keymap.c index 563519e4c..f88d5117c 100644 --- a/keyboard/atomic/keymaps/pvc/keymap.c +++ b/keyboard/atomic/keymaps/pvc/keymap.c @@ -302,45 +302,38 @@ void matrix_init_user(void) void led_set_user(uint8_t usb_led) { static uint8_t old_usb_led = 0; - static bool first_run = true; - // Skip first execution to avoid beeps caused by LED states being detected on power-up - if (!first_run) + if ((usb_led & (1< Date: Mon, 18 Apr 2016 21:01:48 -0400 Subject: note sliding - on right now --- keyboard/preonic/keymaps/default/keymap.c | 26 +++++++++- quantum/audio.c | 81 +++++++++++++++---------------- quantum/keymap_common.c | 1 + 3 files changed, 63 insertions(+), 45 deletions(-) (limited to 'quantum') diff --git a/keyboard/preonic/keymaps/default/keymap.c b/keyboard/preonic/keymaps/default/keymap.c index 2591af9f0..2546d8f6c 100644 --- a/keyboard/preonic/keymaps/default/keymap.c +++ b/keyboard/preonic/keymaps/default/keymap.c @@ -14,8 +14,9 @@ #define _DVORAK 2 #define _LOWER 3 #define _RAISE 4 -#define _ADJUST 5 -#define _MUSIC 6 +#define _ADJUST 6 +#define _MUSIC 7 +#define _STOPPER 5 // Macro name shortcuts #define QWERTY M(_QWERTY) @@ -172,7 +173,19 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}, {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}, {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______} +}, + +/* Stopper + * + */ +[_STOPPER] = { + {XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX}, + {XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX}, + {XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX}, + {XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX}, + {XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, LOWER, XXXXXXX, RAISE, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX} } + }; const uint16_t PROGMEM fn_actions[] = { @@ -225,6 +238,7 @@ float tone_music[][2] = { {440.0*pow(2.0,(24)/12.0), 8} }; float ode_to_joy[][2] = SONG(ODE_TO_JOY); +float goodbye[][2] = SONG(GOODBYE_SOUND); #endif void persistant_default_layer_set(uint16_t default_layer) { @@ -306,6 +320,7 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) if (record->event.pressed) { #ifdef AUDIO_ENABLE layer_off(_MUSIC); + layer_off(_STOPPER); stop_all_notes(); #endif } @@ -317,6 +332,7 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) set_tempo(150); PLAY_NOTE_ARRAY(ode_to_joy, false, .25); layer_on(_MUSIC); + layer_on(_STOPPER); #endif } break; @@ -345,3 +361,9 @@ void matrix_init_user(void) { PLAY_NOTE_ARRAY(start_up, false, 0); #endif } + +void play_goodbye_tone() +{ + PLAY_NOTE_ARRAY(goodbye, false, 0); + _delay_ms(2000); +} \ No newline at end of file diff --git a/quantum/audio.c b/quantum/audio.c index 69c58ca6c..6a5d43013 100644 --- a/quantum/audio.c +++ b/quantum/audio.c @@ -65,6 +65,7 @@ uint8_t notes_count; bool notes_repeat; float notes_rest; bool note_resting = false; +int note_flipper = 0; uint8_t current_note = 0; uint8_t rest_counter = 0; @@ -127,6 +128,9 @@ void stop_note(double freq) { voices--; if (voices < 0) voices = 0; + if (voice_place >= voices) { + voice_place = 0; + } if (voices == 0) { #ifdef PWM_AUDIO TIMSK3 &= ~_BV(OCIE3A); @@ -137,25 +141,6 @@ void stop_note(double freq) { frequency = 0; volume = 0; note = false; - } else { - double freq = frequencies[voices - 1]; - int vol = volumes[voices - 1]; - double starting_f = frequency; - if (frequency < freq) { - sliding = true; - for (double f = starting_f; f <= freq; f += ((freq - starting_f) / 2000.0)) { - frequency = f; - } - sliding = false; - } else if (frequency > freq) { - sliding = true; - for (double f = starting_f; f >= freq; f -= ((starting_f - freq) / 2000.0)) { - frequency = f; - } - sliding = false; - } - frequency = freq; - volume = vol; } } } @@ -248,16 +233,41 @@ ISR(TIMER3_COMPA_vect) { OCR4A = sum; } #else - if (frequency > 0) { + if (frequencies[voice_place] > 0) { + // if (frequencies[voice_place] > 880.0) { + // if (note_flipper == 100) { + // note_flipper = 0; + // return; + // } + // note_flipper++; + // } else { + // note_flipper = 0; + // } // ICR3 = (int)(((double)F_CPU) / frequency); // Set max to the period // OCR3A = (int)(((double)F_CPU) / frequency) >> 1; // Set compare to half the period - voice_place %= voices; - if (place > (frequencies[voice_place] / 50)) { - voice_place = (voice_place + 1) % voices; - place = 0.0; + + double freq; + if (false) { + voice_place %= voices; + if (place > (frequencies[voice_place] / 50)) { + voice_place = (voice_place + 1) % voices; + place = 0.0; + } + freq = frequencies[voice_place]; + } else { + if (frequency != 0) { + if (frequency < frequencies[voices - 1]) { + frequency = frequency * 1.01454533494; + } else if (frequency > frequencies[voices - 1]) { + frequency = frequency * 0.98566319864; + } + } else { + frequency = frequencies[voices - 1]; + } + freq = frequency; } - ICR3 = (int)(((double)F_CPU) / (frequencies[voice_place] * CPU_PRESCALER)); // Set max to the period - OCR3A = (int)((((double)F_CPU) / (frequencies[voice_place] * CPU_PRESCALER)) * note_timbre); // Set compare to half the period + ICR3 = (int)(((double)F_CPU) / (freq * CPU_PRESCALER)); // Set max to the period + OCR3A = (int)((((double)F_CPU) / (freq * CPU_PRESCALER)) * note_timbre); // Set compare to half the period //OCR3A = (int)(((double)F_CPU) / (frequencies[voice_place] * CPU_PRESCALER)) >> 1 * duty_place; // Set compare to half the period place++; // if (duty_counter > (frequencies[voice_place] / 500)) { @@ -413,23 +423,8 @@ if (audio_config.enable && voices < 8) { freq = freq / SAMPLE_RATE; #endif if (freq > 0) { - if (frequency != 0) { - double starting_f = frequency; - if (frequency < freq) { - for (double f = starting_f; f <= freq; f += ((freq - starting_f) / 2000.0)) { - frequency = f; - } - } else if (frequency > freq) { - for (double f = starting_f; f >= freq; f -= ((starting_f - freq) / 2000.0)) { - frequency = f; - } - } - } - frequency = freq; - volume = vol; - - frequencies[voices] = frequency; - volumes[voices] = volume; + frequencies[voices] = freq; + volumes[voices] = vol; voices++; } diff --git a/quantum/keymap_common.c b/quantum/keymap_common.c index 4ee290ad0..43debf4ef 100644 --- a/quantum/keymap_common.c +++ b/quantum/keymap_common.c @@ -184,6 +184,7 @@ static action_t keycode_to_action(uint16_t keycode) case RESET: ; // RESET is 0x5000, which is why this is here clear_keyboard(); #ifdef AUDIO_ENABLE + stop_all_notes(); play_goodbye_tone(); #endif _delay_ms(250); -- cgit v1.2.3-70-g09d2 From a2f31c886ff13c5e7adeccccfe672698c1c7efb9 Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Tue, 19 Apr 2016 12:58:13 -0400 Subject: getting ready for getters and setters --- keyboard/preonic/keymaps/default/keymap.c | 28 ++------ quantum/audio.c | 81 ++++++++++++----------- quantum/audio.h | 104 ++++++++++++++++++++++++++++++ 3 files changed, 156 insertions(+), 57 deletions(-) (limited to 'quantum') diff --git a/keyboard/preonic/keymaps/default/keymap.c b/keyboard/preonic/keymaps/default/keymap.c index 2546d8f6c..144e9c308 100644 --- a/keyboard/preonic/keymaps/default/keymap.c +++ b/keyboard/preonic/keymaps/default/keymap.c @@ -14,9 +14,8 @@ #define _DVORAK 2 #define _LOWER 3 #define _RAISE 4 +#define _MUSIC 5 #define _ADJUST 6 -#define _MUSIC 7 -#define _STOPPER 5 // Macro name shortcuts #define QWERTY M(_QWERTY) @@ -159,7 +158,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_ADJUST] = { {KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12}, {_______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL}, - {_______, _______, _______, AUD_ON, AUD_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, _______, _______}, + {_______, _______, _______, AUD_ON, AUD_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, _______, _______}, {_______, _______, _______, MUS_ON, MUS_OFF, _______, _______, _______, _______, _______, _______, _______}, {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______} }, @@ -168,22 +167,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * */ [_MUSIC] = { - {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}, - {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}, - {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}, - {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}, - {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______} -}, - -/* Stopper - * - */ -[_STOPPER] = { {XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX}, {XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX}, {XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX}, {XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX}, - {XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, LOWER, XXXXXXX, RAISE, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX} + {XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, LOWER, XXXXXXX, XXXXXXX, RAISE, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX} } }; @@ -237,7 +225,7 @@ float tone_music[][2] = { {440.0*pow(2.0,(23)/12.0), 8}, {440.0*pow(2.0,(24)/12.0), 8} }; -float ode_to_joy[][2] = SONG(ODE_TO_JOY); +float music_scale[][2] = SONG(MUSIC_SCALE_SOUND); float goodbye[][2] = SONG(GOODBYE_SOUND); #endif @@ -320,7 +308,6 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) if (record->event.pressed) { #ifdef AUDIO_ENABLE layer_off(_MUSIC); - layer_off(_STOPPER); stop_all_notes(); #endif } @@ -329,10 +316,8 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) if (record->event.pressed) { #ifdef AUDIO_ENABLE init_notes(); - set_tempo(150); - PLAY_NOTE_ARRAY(ode_to_joy, false, .25); + PLAY_NOTE_ARRAY(music_scale, false, 0); layer_on(_MUSIC); - layer_on(_STOPPER); #endif } break; @@ -358,6 +343,7 @@ void process_action_user(keyrecord_t *record) { void matrix_init_user(void) { #ifdef AUDIO_ENABLE init_notes(); + _delay_ms(10); PLAY_NOTE_ARRAY(start_up, false, 0); #endif } @@ -365,5 +351,5 @@ void matrix_init_user(void) { void play_goodbye_tone() { PLAY_NOTE_ARRAY(goodbye, false, 0); - _delay_ms(2000); + _delay_ms(150); } \ No newline at end of file diff --git a/quantum/audio.c b/quantum/audio.c index d8768f160..c92cb5373 100644 --- a/quantum/audio.c +++ b/quantum/audio.c @@ -34,8 +34,6 @@ int voice_place = 0; double frequency = 0; int volume = 0; long position = 0; -int duty_place = 1; -int duty_counter = 0; double frequencies[8] = {0, 0, 0, 0, 0, 0, 0, 0}; int volumes[8] = {0, 0, 0, 0, 0, 0, 0, 0}; @@ -51,7 +49,7 @@ uint16_t place_int = 0; bool repeat = true; uint8_t * sample; uint16_t sample_length = 0; - +double freq = 0; bool notes = false; bool note = false; @@ -65,11 +63,15 @@ uint8_t notes_count; bool notes_repeat; float notes_rest; bool note_resting = false; -int note_flipper = 0; uint8_t current_note = 0; uint8_t rest_counter = 0; +uint8_t vibrato_counter = 0; +float vibrato_strength = 0; + +float polyphony_rate = 0; + audio_config_t audio_config; @@ -182,6 +184,11 @@ void init_notes() { #endif } +float mod(float a, int b) +{ + float r = fmod(a, b); + return r < 0 ? r + b : r; +} ISR(TIMER3_COMPA_vect) { if (note) { @@ -233,48 +240,41 @@ ISR(TIMER3_COMPA_vect) { OCR4A = sum; } #else - if (frequencies[voice_place] > 0) { - // if (frequencies[voice_place] > 880.0) { - // if (note_flipper == 100) { - // note_flipper = 0; - // return; - // } - // note_flipper++; - // } else { - // note_flipper = 0; - // } - // ICR3 = (int)(((double)F_CPU) / frequency); // Set max to the period - // OCR3A = (int)(((double)F_CPU) / frequency) >> 1; // Set compare to half the period - - double freq; - if (false) { - voice_place %= voices; - if (place > (frequencies[voice_place] / 50)) { - voice_place = (voice_place + 1) % voices; - place = 0.0; + if (voices > 0) { + if (false && polyphony_rate > 0) { + if (voices > 1) { + voice_place %= voices; + if (place++ > (frequencies[voice_place] / polyphony_rate / CPU_PRESCALER / voices)) { + voice_place = (voice_place + 1) % voices; + place = 0.0; + } } - freq = frequencies[voice_place]; + if (vibrato_strength > 0) { + freq = frequencies[voice_place] * pow(VIBRATO_LUT[(int)vibrato_counter], vibrato_strength); + vibrato_counter = mod((vibrato_counter + 1), VIBRATO_LUT_LENGTH); + } else { + freq = frequencies[voice_place]; + } } else { if (frequency != 0) { if (frequency < frequencies[voices - 1]) { - frequency = frequency * 1.01454533494; + frequency = frequency * pow(2, 440/frequencies[voices - 1]/12/4); } else if (frequency > frequencies[voices - 1]) { - frequency = frequency * 0.98566319864; + frequency = frequency * pow(2, -440/frequencies[voices - 1]/12/4); } } else { frequency = frequencies[voices - 1]; } - freq = frequency; + + if (false && vibrato_strength > 0) { + freq = frequency * pow(VIBRATO_LUT[(int)vibrato_counter], vibrato_strength); + vibrato_counter = mod((vibrato_counter + 1 + 440/frequencies[voices - 1]), VIBRATO_LUT_LENGTH); + } else { + freq = frequency; + } } ICR3 = (int)(((double)F_CPU) / (freq * CPU_PRESCALER)); // Set max to the period OCR3A = (int)((((double)F_CPU) / (freq * CPU_PRESCALER)) * note_timbre); // Set compare to half the period - //OCR3A = (int)(((double)F_CPU) / (frequencies[voice_place] * CPU_PRESCALER)) >> 1 * duty_place; // Set compare to half the period - place++; - // if (duty_counter > (frequencies[voice_place] / 500)) { - // duty_place = (duty_place % 3) + 1; - // duty_counter = 0; - // } - // duty_counter++; } #endif } @@ -300,8 +300,17 @@ ISR(TIMER3_COMPA_vect) { place -= SINE_LENGTH; #else if (note_frequency > 0) { - ICR3 = (int)(((double)F_CPU) / (note_frequency * CPU_PRESCALER)); // Set max to the period - OCR3A = (int)((((double)F_CPU) / (note_frequency * CPU_PRESCALER)) * note_timbre); // Set compare to half the period + float freq; + + if (false && vibrato_strength > 0) { + freq = note_frequency * pow(VIBRATO_LUT[(int)vibrato_counter], vibrato_strength); + vibrato_counter = mod((vibrato_counter + 1), VIBRATO_LUT_LENGTH); + } else { + freq = note_frequency; + } + + ICR3 = (int)(((double)F_CPU) / (freq * CPU_PRESCALER)); // Set max to the period + OCR3A = (int)((((double)F_CPU) / (freq * CPU_PRESCALER)) * note_timbre); // Set compare to half the period } else { ICR3 = 0; OCR3A = 0; diff --git a/quantum/audio.h b/quantum/audio.h index 44cafccd6..f705341d7 100644 --- a/quantum/audio.h +++ b/quantum/audio.h @@ -47,4 +47,108 @@ void decrease_tempo(uint8_t tempo_change); void play_goodbye_tone(void); void play_startup_tone(void); +#define VIBRATO_LUT (float []) { \ +1.00090714186239, \ +1.00181152169061, \ +1.00270955652027, \ +1.00359767896099, \ +1.00447235162891, \ +1.00533008160601, \ +1.00616743486158, \ +1.00698105056935, \ +1.00776765525194, \ +1.00852407668313, \ +1.0092472574777, \ +1.00993426829815, \ +1.01058232060837, \ +1.01118877890462, \ +1.01175117235612, \ +1.01226720578933, \ +1.01273476995269, \ +1.01315195100182, \ +1.0135170391489, \ +1.01382853642434, \ +1.01408516350345, \ +1.01428586555648, \ +1.0144298170856, \ +1.0145164257189, \ +1.01454533493752, \ +1.0145164257189, \ +1.0144298170856, \ +1.01428586555648, \ +1.01408516350345, \ +1.01382853642434, \ +1.0135170391489, \ +1.01315195100182, \ +1.01273476995269, \ +1.01226720578933, \ +1.01175117235612, \ +1.01118877890462, \ +1.01058232060837, \ +1.00993426829815, \ +1.0092472574777, \ +1.00852407668313, \ +1.00776765525194, \ +1.00698105056935, \ +1.00616743486158, \ +1.00533008160601, \ +1.00447235162891, \ +1.00359767896099, \ +1.00270955652027, \ +1.00181152169061, \ +1.00090714186239, \ +1, \ +0.999093680298157, \ +0.998191753986265, \ +0.997297765337276, \ +0.996415217934032, \ +0.995547561242821, \ +0.99469817754036, \ +0.993870369236874, \ +0.993067346634376, \ +0.992292216155724, \ +0.991547969076588, \ +0.990837470789065, \ +0.990163450622494, \ +0.989528492243954, \ +0.988935024658062, \ +0.988385313823004, \ +0.98788145489731, \ +0.987425365129624, \ +0.987018777401739, \ +0.986663234433381, \ +0.986360083655655, \ +0.986110472758728, \ +0.985915345918143, \ +0.985775440703176, \ +0.985691285669809, \ +0.985663198640188, \ +0.985691285669809, \ +0.985775440703176, \ +0.985915345918143, \ +0.986110472758728, \ +0.986360083655655, \ +0.986663234433381, \ +0.987018777401739, \ +0.987425365129624, \ +0.98788145489731, \ +0.988385313823004, \ +0.988935024658062, \ +0.989528492243954, \ +0.990163450622494, \ +0.990837470789065, \ +0.991547969076588, \ +0.992292216155724, \ +0.993067346634376, \ +0.993870369236874, \ +0.99469817754036, \ +0.99554756124282, \ +0.996415217934032, \ +0.997297765337276, \ +0.998191753986265, \ +0.999093680298157, \ +1, \ +} +#define VIBRATO_LUT_LENGTH NOTE_ARRAY_SIZE(VIBRATO_LUT) + #endif \ No newline at end of file -- cgit v1.2.3-70-g09d2 From fd49dfe5cb686f5966447c6b890800c9cd11d281 Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Tue, 19 Apr 2016 17:00:45 -0400 Subject: vibrato and polyphony paratmeters --- quantum/audio.c | 160 ++++++++++++++++++++++++++++++++++---------------- quantum/audio.h | 140 ++++++++++--------------------------------- quantum/vibrato_lut.h | 108 ++++++++++++++++++++++++++++++++++ 3 files changed, 249 insertions(+), 159 deletions(-) create mode 100644 quantum/vibrato_lut.h (limited to 'quantum') diff --git a/quantum/audio.c b/quantum/audio.c index c92cb5373..8ea1bf6ff 100644 --- a/quantum/audio.c +++ b/quantum/audio.c @@ -10,10 +10,13 @@ #include "eeconfig.h" +#include "vibrato_lut.h" + #define PI 3.14159265 #define CPU_PRESCALER 8 +// Largely untested PWM audio mode (doesn't sound as good) // #define PWM_AUDIO #ifdef PWM_AUDIO @@ -67,10 +70,11 @@ bool note_resting = false; uint8_t current_note = 0; uint8_t rest_counter = 0; -uint8_t vibrato_counter = 0; -float vibrato_strength = 0; +float vibrato_counter = 0; +float vibrato_strength = .5; +float vibrato_rate = 0.125; -float polyphony_rate = 0; +float polyphony_rate = .5; audio_config_t audio_config; @@ -90,6 +94,81 @@ void audio_off(void) { eeconfig_write_audio(audio_config.raw); } +// Vibrato rate functions + +void set_vibrato_rate(float rate) { + vibrato_rate = rate; +} + +void increase_vibrato_rate(float change) { + vibrato_rate *= change; +} + +void decrease_vibrato_rate(float change) { + vibrato_rate /= change; +} + +#ifdef VIBRATO_STRENGTH_ENABLE + +void set_vibrato_strength(float strength) { + vibrato_strength = strength; +} + +void increase_vibrato_strength(float change) { + vibrato_strength *= change; +} + +void decrease_vibrato_strength(float change) { + vibrato_strength /= change; +} + +#endif + +// Polyphony functions + +void set_polyphony_rate(float rate) { + polyphony_rate = rate; +} + +void enable_polyphony() { + polyphony_rate = 5; +} + +void disable_polyphony() { + polyphony_rate = 0; +} + +void increase_polyphony_rate(float change) { + polyphony_rate *= change; +} + +void decrease_polyphony_rate(float change) { + polyphony_rate /= change; +} + +// Timbre function + +void set_timbre(float timbre) { + note_timbre = timbre; +} + +// Tempo functions + +void set_tempo(float tempo) { + note_tempo = tempo; +} + +void decrease_tempo(uint8_t tempo_change) { + note_tempo += (float) tempo_change; +} + +void increase_tempo(uint8_t tempo_change) { + if (note_tempo - (float) tempo_change < 10) { + note_tempo = 10; + } else { + note_tempo -= (float) tempo_change; + } +} void stop_all_notes() { voices = 0; @@ -112,6 +191,7 @@ void stop_all_notes() { void stop_note(double freq) { if (note) { + cli(); #ifdef PWM_AUDIO freq = freq / SAMPLE_RATE; #endif @@ -125,6 +205,7 @@ void stop_note(double freq) { volumes[j] = volumes[j+1]; volumes[j+1] = 0; } + break; } } voices--; @@ -144,6 +225,7 @@ void stop_note(double freq) { volume = 0; note = false; } + sei(); } } @@ -190,6 +272,16 @@ float mod(float a, int b) return r < 0 ? r + b : r; } +float vibrato(float average_freq) { + #ifdef VIBRATO_STRENGTH_ENABLE + float vibrated_freq = average_freq * pow(VIBRATO_LUT[(int)vibrato_counter], vibrato_strength); + #else + float vibrated_freq = average_freq * VIBRATO_LUT[(int)vibrato_counter]; + #endif + vibrato_counter = mod((vibrato_counter + vibrato_rate * (1.0 + 440.0/average_freq)), VIBRATO_LUT_LENGTH); + return vibrated_freq; +} + ISR(TIMER3_COMPA_vect) { if (note) { #ifdef PWM_AUDIO @@ -241,34 +333,30 @@ ISR(TIMER3_COMPA_vect) { } #else if (voices > 0) { - if (false && polyphony_rate > 0) { + if (polyphony_rate > 0) { if (voices > 1) { voice_place %= voices; - if (place++ > (frequencies[voice_place] / polyphony_rate / CPU_PRESCALER / voices)) { + if (place++ > (frequencies[voice_place] / polyphony_rate / CPU_PRESCALER)) { voice_place = (voice_place + 1) % voices; place = 0.0; } } if (vibrato_strength > 0) { - freq = frequencies[voice_place] * pow(VIBRATO_LUT[(int)vibrato_counter], vibrato_strength); - vibrato_counter = mod((vibrato_counter + 1), VIBRATO_LUT_LENGTH); + freq = vibrato(frequencies[voice_place]); } else { freq = frequencies[voice_place]; } } else { - if (frequency != 0) { - if (frequency < frequencies[voices - 1]) { - frequency = frequency * pow(2, 440/frequencies[voices - 1]/12/4); - } else if (frequency > frequencies[voices - 1]) { - frequency = frequency * pow(2, -440/frequencies[voices - 1]/12/4); - } + if (frequency != 0 && frequency < frequencies[voices - 1] && frequency < frequencies[voices - 1] * pow(2, -440/frequencies[voices - 1]/12/2)) { + frequency = frequency * pow(2, 440/frequency/12/2); + } else if (frequency != 0 && frequency > frequencies[voices - 1] && frequency > frequencies[voices - 1] * pow(2, 440/frequencies[voices - 1]/12/2)) { + frequency = frequency * pow(2, -440/frequency/12/2); } else { frequency = frequencies[voices - 1]; } - if (false && vibrato_strength > 0) { - freq = frequency * pow(VIBRATO_LUT[(int)vibrato_counter], vibrato_strength); - vibrato_counter = mod((vibrato_counter + 1 + 440/frequencies[voices - 1]), VIBRATO_LUT_LENGTH); + if (vibrato_strength > 0) { + freq = vibrato(frequency); } else { freq = frequency; } @@ -302,9 +390,8 @@ ISR(TIMER3_COMPA_vect) { if (note_frequency > 0) { float freq; - if (false && vibrato_strength > 0) { - freq = note_frequency * pow(VIBRATO_LUT[(int)vibrato_counter], vibrato_strength); - vibrato_counter = mod((vibrato_counter + 1), VIBRATO_LUT_LENGTH); + if (vibrato_strength > 0) { + freq = vibrato(note_frequency); } else { freq = note_frequency; } @@ -369,7 +456,7 @@ ISR(TIMER3_COMPA_vect) { void play_notes(float (*np)[][2], uint8_t n_count, bool n_repeat, float n_rest) { if (audio_config.enable) { - + cli(); // Cancel note if a note is playing if (note) stop_all_notes(); @@ -398,7 +485,7 @@ if (audio_config.enable) { TIMSK3 |= _BV(OCIE3A); TCCR3A |= _BV(COM3A1); #endif - + sei(); } } @@ -425,7 +512,7 @@ if (audio_config.enable) { void play_note(double freq, int vol) { if (audio_config.enable && voices < 8) { - + cli(); // Cancel notes if notes are playing if (notes) stop_all_notes(); @@ -445,36 +532,9 @@ if (audio_config.enable && voices < 8) { TIMSK3 |= _BV(OCIE3A); TCCR3A |= _BV(COM3A1); #endif - -} - -} - -void set_timbre(float timbre) -{ - note_timbre = timbre; + sei(); } -void set_tempo(float tempo) -{ - note_tempo = tempo; -} - -void decrease_tempo(uint8_t tempo_change) -{ - note_tempo += (float) tempo_change; -} - -void increase_tempo(uint8_t tempo_change) -{ - if (note_tempo - (float) tempo_change < 10) - { - note_tempo = 10; - } - else - { - note_tempo -= (float) tempo_change; - } } //------------------------------------------------------------------------------ diff --git a/quantum/audio.h b/quantum/audio.h index f705341d7..85756af9d 100644 --- a/quantum/audio.h +++ b/quantum/audio.h @@ -8,6 +8,9 @@ #ifndef AUDIO_H #define AUDIO_H +// Enable vibrato strength/amplitude - slows down ISR too much +// #define VIBRATO_STRENGTH_ENABLE + typedef union { uint8_t raw; struct { @@ -20,6 +23,34 @@ void audio_toggle(void); void audio_on(void); void audio_off(void); +// Vibrato rate functions + +void set_vibrato_rate(float rate); +void increase_vibrato_rate(float change); +void decrease_vibrato_rate(float change); + +#ifdef VIBRATO_STRENGTH_ENABLE + +void set_vibrato_strength(float strength); +void increase_vibrato_strength(float change); +void decrease_vibrato_strength(float change); + +#endif + +// Polyphony functions + +void set_polyphony_rate(float rate); +void enable_polyphony(); +void disable_polyphony(); +void increase_polyphony_rate(float change); +void decrease_polyphony_rate(float change); + +void set_timbre(float timbre); +void set_tempo(float tempo); + +void increase_tempo(uint8_t tempo_change); +void decrease_tempo(uint8_t tempo_change); + void play_sample(uint8_t * s, uint16_t l, bool r); void play_note(double freq, int vol); void stop_note(double freq); @@ -27,11 +58,6 @@ void stop_all_notes(void); void init_notes(void); void play_notes(float (*np)[][2], uint8_t n_count, bool n_repeat, float n_rest); -void set_timbre(float timbre); -void set_tempo(float tempo); -void increase_tempo(uint8_t tempo_change); -void decrease_tempo(uint8_t tempo_change); - #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), \ @@ -47,108 +73,4 @@ void decrease_tempo(uint8_t tempo_change); void play_goodbye_tone(void); void play_startup_tone(void); -#define VIBRATO_LUT (float []) { \ -1.00090714186239, \ -1.00181152169061, \ -1.00270955652027, \ -1.00359767896099, \ -1.00447235162891, \ -1.00533008160601, \ -1.00616743486158, \ -1.00698105056935, \ -1.00776765525194, \ -1.00852407668313, \ -1.0092472574777, \ -1.00993426829815, \ -1.01058232060837, \ -1.01118877890462, \ -1.01175117235612, \ -1.01226720578933, \ -1.01273476995269, \ -1.01315195100182, \ -1.0135170391489, \ -1.01382853642434, \ -1.01408516350345, \ -1.01428586555648, \ -1.0144298170856, \ -1.0145164257189, \ -1.01454533493752, \ -1.0145164257189, \ -1.0144298170856, \ -1.01428586555648, \ -1.01408516350345, \ -1.01382853642434, \ -1.0135170391489, \ -1.01315195100182, \ -1.01273476995269, \ -1.01226720578933, \ -1.01175117235612, \ -1.01118877890462, \ -1.01058232060837, \ -1.00993426829815, \ -1.0092472574777, \ -1.00852407668313, \ -1.00776765525194, \ -1.00698105056935, \ -1.00616743486158, \ -1.00533008160601, \ -1.00447235162891, \ -1.00359767896099, \ -1.00270955652027, \ -1.00181152169061, \ -1.00090714186239, \ -1, \ -0.999093680298157, \ -0.998191753986265, \ -0.997297765337276, \ -0.996415217934032, \ -0.995547561242821, \ -0.99469817754036, \ -0.993870369236874, \ -0.993067346634376, \ -0.992292216155724, \ -0.991547969076588, \ -0.990837470789065, \ -0.990163450622494, \ -0.989528492243954, \ -0.988935024658062, \ -0.988385313823004, \ -0.98788145489731, \ -0.987425365129624, \ -0.987018777401739, \ -0.986663234433381, \ -0.986360083655655, \ -0.986110472758728, \ -0.985915345918143, \ -0.985775440703176, \ -0.985691285669809, \ -0.985663198640188, \ -0.985691285669809, \ -0.985775440703176, \ -0.985915345918143, \ -0.986110472758728, \ -0.986360083655655, \ -0.986663234433381, \ -0.987018777401739, \ -0.987425365129624, \ -0.98788145489731, \ -0.988385313823004, \ -0.988935024658062, \ -0.989528492243954, \ -0.990163450622494, \ -0.990837470789065, \ -0.991547969076588, \ -0.992292216155724, \ -0.993067346634376, \ -0.993870369236874, \ -0.99469817754036, \ -0.99554756124282, \ -0.996415217934032, \ -0.997297765337276, \ -0.998191753986265, \ -0.999093680298157, \ -1, \ -} -#define VIBRATO_LUT_LENGTH NOTE_ARRAY_SIZE(VIBRATO_LUT) - #endif \ No newline at end of file diff --git a/quantum/vibrato_lut.h b/quantum/vibrato_lut.h new file mode 100644 index 000000000..4c267a626 --- /dev/null +++ b/quantum/vibrato_lut.h @@ -0,0 +1,108 @@ +#include +#include +#include + +#define VIBRATO_LUT_LENGTH 100 + +const float VIBRATO_LUT[VIBRATO_LUT_LENGTH] = { \ +1.00045346811453, +1.00090535101508, +1.00135386178926, +1.00179722447259, +1.00223368114872, +1.0026614990145, +1.00307897737994, +1.00348445457284, +1.00387631471807, +1.00425299436105, +1.00461298890553, +1.00495485883603, +1.00527723569589, +1.00557882779254, +1.00585842560279, +1.00611490685176, +1.00634724124066, +1.00655449479987, +1.00673583384565, +1.00689052852052, +1.00701795589922, +1.00711760264454, +1.0071890671992, +1.00723206150266, +1.0072464122237, +1.00723206150266, +1.0071890671992, +1.00711760264454, +1.00701795589922, +1.00689052852052, +1.00673583384565, +1.00655449479987, +1.00634724124066, +1.00611490685176, +1.00585842560279, +1.00557882779254, +1.00527723569589, +1.00495485883603, +1.00461298890553, +1.00425299436105, +1.00387631471807, +1.00348445457284, +1.00307897737994, +1.0026614990145, +1.00223368114872, +1.00179722447259, +1.00135386178926, +1.00090535101508, +1.00045346811453, +1, +0.999546737425598, +0.999095467903976, +0.998647968674285, +0.998205999748565, +0.99777129706302, +0.997345565759612, +0.996930473622346, +0.996527644691494, +0.996138653077835, +0.99576501699778, +0.995408193048995, +0.995069570744927, +0.994750467325326, +0.994452122858643, +0.994175695650927, +0.993922257974591, +0.99369279212925, +0.993488186845591, +0.993309234042139, +0.993156625943589, +0.993030952568311, +0.99293269959154, +0.992862246589715, +0.992819865670409, +0.992805720491269, +0.992819865670409, +0.992862246589715, +0.99293269959154, +0.993030952568311, +0.993156625943589, +0.993309234042139, +0.993488186845591, +0.99369279212925, +0.993922257974591, +0.994175695650927, +0.994452122858643, +0.994750467325326, +0.995069570744927, +0.995408193048995, +0.99576501699778, +0.996138653077835, +0.996527644691494, +0.996930473622346, +0.997345565759612, +0.99777129706302, +0.998205999748565, +0.998647968674285, +0.999095467903976, +0.999546737425598, +1 +}; \ No newline at end of file -- cgit v1.2.3-70-g09d2 From 462601f5e8de3476963c6fef44a88653e19fc3fd Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Tue, 19 Apr 2016 21:25:48 -0400 Subject: breaking changes - restructuring audio.c a little --- keyboard/planck/keymaps/default/keymap.c | 24 +++---- keyboard/preonic/keymaps/default/keymap.c | 37 +++++----- quantum/audio.c | 108 +++++++++++++++++------------- quantum/audio.h | 1 - 4 files changed, 94 insertions(+), 76 deletions(-) (limited to 'quantum') diff --git a/keyboard/planck/keymaps/default/keymap.c b/keyboard/planck/keymaps/default/keymap.c index 25a0d78f3..ccf9c7ade 100644 --- a/keyboard/planck/keymaps/default/keymap.c +++ b/keyboard/planck/keymaps/default/keymap.c @@ -145,7 +145,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { {XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, LOWER, XXXXXXX, XXXXXXX, RAISE, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX} }, -/* Plover layer (http://openstenoproject.org) +/* Plover layer (http://opensteno.org) * ,-----------------------------------------------------------------------------------. * | # | # | # | # | # | # | # | # | # | # | # | # | * |------+------+------+------+------+-------------+------+------+------+------+------| @@ -225,16 +225,10 @@ float tone_dvorak[][2] = { {440.0*pow(2.0,(31)/12.0), 8} }; -float tone_music[][2] = { - {440.0*pow(2.0,(12)/12.0), 8}, - {440.0*pow(2.0,(14)/12.0), 8}, - {440.0*pow(2.0,(16)/12.0), 8}, - {440.0*pow(2.0,(17)/12.0), 8}, - {440.0*pow(2.0,(19)/12.0), 8}, - {440.0*pow(2.0,(21)/12.0), 8}, - {440.0*pow(2.0,(23)/12.0), 8}, - {440.0*pow(2.0,(24)/12.0), 8} -}; + +float music_scale[][2] = SONG(MUSIC_SCALE_SOUND); +float goodbye[][2] = SONG(GOODBYE_SOUND); + #endif @@ -324,7 +318,7 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) case 9: if (record->event.pressed) { #ifdef AUDIO_ENABLE - PLAY_NOTE_ARRAY(tone_music, false, 0); + PLAY_NOTE_ARRAY(music_scale, false, 0); layer_on(_MUSIC); #endif } @@ -374,3 +368,9 @@ void matrix_init_user(void) { PLAY_NOTE_ARRAY(tone_startup, false, 0); #endif } + +void play_goodbye_tone() +{ + PLAY_NOTE_ARRAY(goodbye, false, 0); + _delay_ms(150); +} diff --git a/keyboard/preonic/keymaps/default/keymap.c b/keyboard/preonic/keymaps/default/keymap.c index 144e9c308..ecf3400f8 100644 --- a/keyboard/preonic/keymaps/default/keymap.c +++ b/keyboard/preonic/keymaps/default/keymap.c @@ -15,7 +15,7 @@ #define _LOWER 3 #define _RAISE 4 #define _MUSIC 5 -#define _ADJUST 6 +#define _ADJUST 16 // Macro name shortcuts #define QWERTY M(_QWERTY) @@ -142,6 +142,17 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { {_______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY} }, +/* Music (reserved for process_action_user) + * + */ +[_MUSIC] = { + {XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX}, + {XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX}, + {XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX}, + {XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX}, + {XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, LOWER, XXXXXXX, XXXXXXX, RAISE, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX} +}, + /* Adjust (Lower + Raise) * ,-----------------------------------------------------------------------------------. * | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | @@ -161,19 +172,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { {_______, _______, _______, AUD_ON, AUD_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, _______, _______}, {_______, _______, _______, MUS_ON, MUS_OFF, _______, _______, _______, _______, _______, _______, _______}, {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______} -}, - -/* Music (reserved for process_action_user) - * - */ -[_MUSIC] = { - {XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX}, - {XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX}, - {XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX}, - {XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX}, - {XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, LOWER, XXXXXXX, XXXXXXX, RAISE, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX} } + }; const uint16_t PROGMEM fn_actions[] = { @@ -315,7 +316,6 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) case 9: if (record->event.pressed) { #ifdef AUDIO_ENABLE - init_notes(); PLAY_NOTE_ARRAY(music_scale, false, 0); layer_on(_MUSIC); #endif @@ -341,11 +341,12 @@ void process_action_user(keyrecord_t *record) { } void matrix_init_user(void) { - #ifdef AUDIO_ENABLE - init_notes(); - _delay_ms(10); - PLAY_NOTE_ARRAY(start_up, false, 0); - #endif + play_startup_tone(); +} + +void play_startup_tone() +{ + PLAY_NOTE_ARRAY(start_up, false, 0); } void play_goodbye_tone() diff --git a/quantum/audio.c b/quantum/audio.c index 8ea1bf6ff..bbdbc824c 100644 --- a/quantum/audio.c +++ b/quantum/audio.c @@ -74,7 +74,9 @@ float vibrato_counter = 0; float vibrato_strength = .5; float vibrato_rate = 0.125; -float polyphony_rate = .5; +float polyphony_rate = 0; + +bool inited = false; audio_config_t audio_config; @@ -170,7 +172,49 @@ void increase_tempo(uint8_t tempo_change) { } } +void audio_init() { + + /* check signature */ + if (!eeconfig_is_enabled()) { + eeconfig_init(); + } + audio_config.raw = eeconfig_read_audio(); + + #ifdef PWM_AUDIO + PLLFRQ = _BV(PDIV2); + PLLCSR = _BV(PLLE); + while(!(PLLCSR & _BV(PLOCK))); + PLLFRQ |= _BV(PLLTM0); /* PCK 48MHz */ + + /* Init a fast PWM on Timer4 */ + TCCR4A = _BV(COM4A0) | _BV(PWM4A); /* Clear OC4A on Compare Match */ + TCCR4B = _BV(CS40); /* No prescaling => f = PCK/256 = 187500Hz */ + OCR4A = 0; + + /* Enable the OC4A output */ + DDRC |= _BV(PORTC6); + + TIMSK3 &= ~_BV(OCIE3A); // Turn off 3A interputs + + TCCR3A = 0x0; // Options not needed + TCCR3B = _BV(CS31) | _BV(CS30) | _BV(WGM32); // 64th prescaling and CTC + OCR3A = SAMPLE_DIVIDER - 1; // Correct count/compare, related to sample playback + #else + DDRC |= _BV(PORTC6); + + TIMSK3 &= ~_BV(OCIE3A); // Turn off 3A interputs + + TCCR3A = (0 << COM3A1) | (0 << COM3A0) | (1 << WGM31) | (0 << WGM30); + TCCR3B = (1 << WGM33) | (1 << WGM32) | (0 << CS32) | (1 << CS31) | (0 << CS30); + #endif + + inited = true; +} + void stop_all_notes() { + if (!inited) { + audio_init(); + } voices = 0; #ifdef PWM_AUDIO TIMSK3 &= ~_BV(OCIE3A); @@ -191,7 +235,9 @@ void stop_all_notes() { void stop_note(double freq) { if (note) { - cli(); + if (!inited) { + audio_init(); + } #ifdef PWM_AUDIO freq = freq / SAMPLE_RATE; #endif @@ -225,47 +271,9 @@ void stop_note(double freq) { volume = 0; note = false; } - sei(); } } -void init_notes() { - - /* check signature */ - if (!eeconfig_is_enabled()) { - eeconfig_init(); - } - audio_config.raw = eeconfig_read_audio(); - - #ifdef PWM_AUDIO - PLLFRQ = _BV(PDIV2); - PLLCSR = _BV(PLLE); - while(!(PLLCSR & _BV(PLOCK))); - PLLFRQ |= _BV(PLLTM0); /* PCK 48MHz */ - - /* Init a fast PWM on Timer4 */ - TCCR4A = _BV(COM4A0) | _BV(PWM4A); /* Clear OC4A on Compare Match */ - TCCR4B = _BV(CS40); /* No prescaling => f = PCK/256 = 187500Hz */ - OCR4A = 0; - - /* Enable the OC4A output */ - DDRC |= _BV(PORTC6); - - TIMSK3 &= ~_BV(OCIE3A); // Turn off 3A interputs - - TCCR3A = 0x0; // Options not needed - TCCR3B = _BV(CS31) | _BV(CS30) | _BV(WGM32); // 64th prescaling and CTC - OCR3A = SAMPLE_DIVIDER - 1; // Correct count/compare, related to sample playback - #else - DDRC |= _BV(PORTC6); - - TIMSK3 &= ~_BV(OCIE3A); // Turn off 3A interputs - - TCCR3A = (0 << COM3A1) | (0 << COM3A0) | (1 << WGM31) | (0 << WGM30); - TCCR3B = (1 << WGM33) | (1 << WGM32) | (0 << CS32) | (1 << CS31) | (0 << CS30); - #endif -} - float mod(float a, int b) { float r = fmod(a, b); @@ -456,7 +464,10 @@ ISR(TIMER3_COMPA_vect) { void play_notes(float (*np)[][2], uint8_t n_count, bool n_repeat, float n_rest) { if (audio_config.enable) { - cli(); + TIMSK3 &= ~_BV(OCIE3A); + if (!inited) { + audio_init(); + } // Cancel note if a note is playing if (note) stop_all_notes(); @@ -485,7 +496,6 @@ if (audio_config.enable) { TIMSK3 |= _BV(OCIE3A); TCCR3A |= _BV(COM3A1); #endif - sei(); } } @@ -493,7 +503,10 @@ if (audio_config.enable) { void play_sample(uint8_t * s, uint16_t l, bool r) { if (audio_config.enable) { - + TIMSK3 &= ~_BV(OCIE3A); + if (!inited) { + audio_init(); + } stop_all_notes(); place_int = 0; sample = s; @@ -512,7 +525,10 @@ if (audio_config.enable) { void play_note(double freq, int vol) { if (audio_config.enable && voices < 8) { - cli(); + TIMSK3 &= ~_BV(OCIE3A); + if (!inited) { + audio_init(); + } // Cancel notes if notes are playing if (notes) stop_all_notes(); @@ -532,7 +548,6 @@ if (audio_config.enable && voices < 8) { TIMSK3 |= _BV(OCIE3A); TCCR3A |= _BV(COM3A1); #endif - sei(); } } @@ -545,8 +560,11 @@ void play_startup_tone() { } + + __attribute__ ((weak)) void play_goodbye_tone() { + } //------------------------------------------------------------------------------ diff --git a/quantum/audio.h b/quantum/audio.h index 85756af9d..0fe3eac9a 100644 --- a/quantum/audio.h +++ b/quantum/audio.h @@ -55,7 +55,6 @@ void play_sample(uint8_t * s, uint16_t l, bool r); void play_note(double freq, int vol); void stop_note(double freq); void stop_all_notes(void); -void init_notes(void); void play_notes(float (*np)[][2], uint8_t n_count, bool n_repeat, float n_rest); #define SCALE (int []){ 0 + (12*0), 2 + (12*0), 4 + (12*0), 5 + (12*0), 7 + (12*0), 9 + (12*0), 11 + (12*0), \ -- cgit v1.2.3-70-g09d2 From de4690593cec908b19f97509f45c78534fd5440f Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Wed, 20 Apr 2016 01:08:17 -0400 Subject: fixed startup audio with a 500ms delay --- keyboard/planck/keymaps/default/keymap.c | 1 - keyboard/preonic/Makefile | 2 +- keyboard/preonic/keymaps/default/keymap.c | 43 ++-------- quantum/audio.c | 136 +++++++++++++++++------------- quantum/audio.h | 21 ++++- quantum/vibrato_lut.h | 82 +----------------- 6 files changed, 104 insertions(+), 181 deletions(-) (limited to 'quantum') diff --git a/keyboard/planck/keymaps/default/keymap.c b/keyboard/planck/keymaps/default/keymap.c index ccf9c7ade..29a3ccf6a 100644 --- a/keyboard/planck/keymaps/default/keymap.c +++ b/keyboard/planck/keymaps/default/keymap.c @@ -364,7 +364,6 @@ void process_action_user(keyrecord_t *record) { void matrix_init_user(void) { #ifdef AUDIO_ENABLE - init_notes(); PLAY_NOTE_ARRAY(tone_startup, false, 0); #endif } diff --git a/keyboard/preonic/Makefile b/keyboard/preonic/Makefile index 3504e2720..c2648d229 100644 --- a/keyboard/preonic/Makefile +++ b/keyboard/preonic/Makefile @@ -133,7 +133,7 @@ OPT_DEFS += -DBOOTLOADER_SIZE=4096 BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) MOUSEKEY_ENABLE = yes # Mouse keys(+4700) EXTRAKEY_ENABLE = yes # Audio control and System control(+450) -CONSOLE_ENABLE = no # Console for debug(+400) +CONSOLE_ENABLE = on # Console for debug(+400) COMMAND_ENABLE = yes # Commands for debug and configuration NKRO_ENABLE = no # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality diff --git a/keyboard/preonic/keymaps/default/keymap.c b/keyboard/preonic/keymaps/default/keymap.c index ecf3400f8..9ee803b06 100644 --- a/keyboard/preonic/keymaps/default/keymap.c +++ b/keyboard/preonic/keymaps/default/keymap.c @@ -3,6 +3,7 @@ #include "eeconfig.h" #ifdef AUDIO_ENABLE #include "audio.h" + #include "song_list.h" #endif // Each layer gets a name for readability, which is then used in the keymap matrix below. @@ -189,43 +190,10 @@ float start_up[][2] = { {440.0*pow(2.0,(26)/12.0), 8} }; -float tone_qwerty[][2] = { - {440.0*pow(2.0,(23)/12.0), 8}, - {440.0*pow(2.0,(24)/12.0), 8}, - {0, 4}, - {440.0*pow(2.0,(31)/12.0), 16} -}; - -float tone_colemak[][2] = { - {440.0*pow(2.0,(23)/12.0), 8}, - {440.0*pow(2.0,(24)/12.0), 8}, - {0, 4}, - {440.0*pow(2.0,(31)/12.0), 12}, - {0, 4}, - {440.0*pow(2.0,(35)/12.0), 12} -}; +float tone_qwerty[][2] = SONG(QWERTY_SOUND); +float tone_dvorak[][2] = SONG(DVORAK_SOUND); +float tone_colemak[][2] = SONG(COLEMAK_SOUND); -float tone_dvorak[][2] = { - {440.0*pow(2.0,(23)/12.0), 8}, - {440.0*pow(2.0,(24)/12.0), 8}, - {0, 4}, - {440.0*pow(2.0,(31)/12.0), 8}, - {0, 4}, - {440.0*pow(2.0,(33)/12.0), 8}, - {0, 4}, - {440.0*pow(2.0,(31)/12.0), 8} -}; - -float tone_music[][2] = { - {440.0*pow(2.0,(12)/12.0), 8}, - {440.0*pow(2.0,(14)/12.0), 8}, - {440.0*pow(2.0,(16)/12.0), 8}, - {440.0*pow(2.0,(17)/12.0), 8}, - {440.0*pow(2.0,(19)/12.0), 8}, - {440.0*pow(2.0,(21)/12.0), 8}, - {440.0*pow(2.0,(23)/12.0), 8}, - {440.0*pow(2.0,(24)/12.0), 8} -}; float music_scale[][2] = SONG(MUSIC_SCALE_SOUND); float goodbye[][2] = SONG(GOODBYE_SOUND); #endif @@ -341,12 +309,13 @@ void process_action_user(keyrecord_t *record) { } void matrix_init_user(void) { + // audio_init(); play_startup_tone(); } void play_startup_tone() { - PLAY_NOTE_ARRAY(start_up, false, 0); + PLAY_NOTE_ARRAY(music_scale, false, 0); } void play_goodbye_tone() diff --git a/quantum/audio.c b/quantum/audio.c index bbdbc824c..ab3444bc9 100644 --- a/quantum/audio.c +++ b/quantum/audio.c @@ -10,20 +10,23 @@ #include "eeconfig.h" -#include "vibrato_lut.h" +#ifdef VIBRATO_ENABLE + #include "vibrato_lut.h" +#endif #define PI 3.14159265 #define CPU_PRESCALER 8 -// Largely untested PWM audio mode (doesn't sound as good) -// #define PWM_AUDIO - #ifdef PWM_AUDIO #include "wave.h" #define SAMPLE_DIVIDER 39 #define SAMPLE_RATE (2000000.0/SAMPLE_DIVIDER/2048) // Resistor value of 1/ (2 * PI * 10nF * (2000000 hertz / SAMPLE_DIVIDER / 10)) for 10nF cap + + float places[8] = {0, 0, 0, 0, 0, 0, 0, 0}; + uint16_t place_int = 0; + bool repeat = true; #endif void delay_us(int count) { @@ -34,25 +37,21 @@ void delay_us(int count) { int voices = 0; int voice_place = 0; -double frequency = 0; +float frequency = 0; int volume = 0; long position = 0; -double frequencies[8] = {0, 0, 0, 0, 0, 0, 0, 0}; +float frequencies[8] = {0, 0, 0, 0, 0, 0, 0, 0}; int volumes[8] = {0, 0, 0, 0, 0, 0, 0, 0}; bool sliding = false; int max = 0xFF; float sum = 0; -int value = 128; float place = 0; -float places[8] = {0, 0, 0, 0, 0, 0, 0, 0}; -uint16_t place_int = 0; -bool repeat = true; uint8_t * sample; uint16_t sample_length = 0; -double freq = 0; +// float freq = 0; bool notes = false; bool note = false; @@ -62,7 +61,7 @@ float note_tempo = TEMPO_DEFAULT; float note_timbre = TIMBRE_DEFAULT; uint16_t note_position = 0; float (* notes_pointer)[][2]; -uint8_t notes_count; +uint16_t notes_count; bool notes_repeat; float notes_rest; bool note_resting = false; @@ -70,9 +69,11 @@ bool note_resting = false; uint8_t current_note = 0; uint8_t rest_counter = 0; +#ifdef VIBRATO_ENABLE float vibrato_counter = 0; float vibrato_strength = .5; float vibrato_rate = 0.125; +#endif float polyphony_rate = 0; @@ -96,6 +97,7 @@ void audio_off(void) { eeconfig_write_audio(audio_config.raw); } +#ifdef VIBRATO_ENABLE // Vibrato rate functions void set_vibrato_rate(float rate) { @@ -126,6 +128,8 @@ void decrease_vibrato_strength(float change) { #endif +#endif + // Polyphony functions void set_polyphony_rate(float rate) { @@ -209,6 +213,7 @@ void audio_init() { #endif inited = true; + _delay_ms(500); } void stop_all_notes() { @@ -233,7 +238,7 @@ void stop_all_notes() { } } -void stop_note(double freq) { +void stop_note(float freq) { if (note) { if (!inited) { audio_init(); @@ -274,6 +279,8 @@ void stop_note(double freq) { } } +#ifdef VIBRATO_ENABLE + float mod(float a, int b) { float r = fmod(a, b); @@ -290,6 +297,8 @@ float vibrato(float average_freq) { return vibrated_freq; } +#endif + ISR(TIMER3_COMPA_vect) { if (note) { #ifdef PWM_AUDIO @@ -341,6 +350,7 @@ ISR(TIMER3_COMPA_vect) { } #else if (voices > 0) { + float freq; if (polyphony_rate > 0) { if (voices > 1) { voice_place %= voices; @@ -349,9 +359,13 @@ ISR(TIMER3_COMPA_vect) { place = 0.0; } } + #ifdef VIBRATO_ENABLE if (vibrato_strength > 0) { freq = vibrato(frequencies[voice_place]); } else { + #else + { + #endif freq = frequencies[voice_place]; } } else { @@ -363,9 +377,14 @@ ISR(TIMER3_COMPA_vect) { frequency = frequencies[voices - 1]; } + + #ifdef VIBRATO_ENABLE if (vibrato_strength > 0) { freq = vibrato(frequency); } else { + #else + { + #endif freq = frequency; } } @@ -398,9 +417,13 @@ ISR(TIMER3_COMPA_vect) { if (note_frequency > 0) { float freq; + #ifdef VIBRATO_ENABLE if (vibrato_strength > 0) { freq = vibrato(note_frequency); } else { + #else + { + #endif freq = note_frequency; } @@ -461,13 +484,45 @@ ISR(TIMER3_COMPA_vect) { } } -void play_notes(float (*np)[][2], uint8_t n_count, bool n_repeat, float n_rest) { +void play_note(float freq, int vol) { -if (audio_config.enable) { + if (!inited) { + audio_init(); + } + +if (audio_config.enable && voices < 8) { TIMSK3 &= ~_BV(OCIE3A); + // Cancel notes if notes are playing + if (notes) + stop_all_notes(); + note = true; + #ifdef PWM_AUDIO + freq = freq / SAMPLE_RATE; + #endif + if (freq > 0) { + frequencies[voices] = freq; + volumes[voices] = vol; + voices++; + } + + #ifdef PWM_AUDIO + TIMSK3 |= _BV(OCIE3A); + #else + TIMSK3 |= _BV(OCIE3A); + TCCR3A |= _BV(COM3A1); + #endif +} + +} + +void play_notes(float (*np)[][2], uint16_t n_count, bool n_repeat, float n_rest) { + if (!inited) { audio_init(); } + +if (audio_config.enable) { + TIMSK3 &= ~_BV(OCIE3A); // Cancel note if a note is playing if (note) stop_all_notes(); @@ -500,57 +555,24 @@ if (audio_config.enable) { } +#ifdef PWM_AUDIO void play_sample(uint8_t * s, uint16_t l, bool r) { - -if (audio_config.enable) { - TIMSK3 &= ~_BV(OCIE3A); if (!inited) { audio_init(); } - stop_all_notes(); - place_int = 0; - sample = s; - sample_length = l; - repeat = r; - #ifdef PWM_AUDIO - TIMSK3 |= _BV(OCIE3A); - #else - #endif - -} - -} - -void play_note(double freq, int vol) { - -if (audio_config.enable && voices < 8) { - TIMSK3 &= ~_BV(OCIE3A); - if (!inited) { - audio_init(); - } - // Cancel notes if notes are playing - if (notes) + if (audio_config.enable) { + TIMSK3 &= ~_BV(OCIE3A); stop_all_notes(); - note = true; - #ifdef PWM_AUDIO - freq = freq / SAMPLE_RATE; - #endif - if (freq > 0) { - frequencies[voices] = freq; - volumes[voices] = vol; - voices++; - } + place_int = 0; + sample = s; + sample_length = l; + repeat = r; - #ifdef PWM_AUDIO TIMSK3 |= _BV(OCIE3A); - #else - TIMSK3 |= _BV(OCIE3A); - TCCR3A |= _BV(COM3A1); - #endif -} - + } } +#endif //------------------------------------------------------------------------------ // Override these functions in your keymap file to play different tunes on diff --git a/quantum/audio.h b/quantum/audio.h index 0fe3eac9a..2d4d303ce 100644 --- a/quantum/audio.h +++ b/quantum/audio.h @@ -8,6 +8,11 @@ #ifndef AUDIO_H #define AUDIO_H +// Largely untested PWM audio mode (doesn't sound as good) +// #define PWM_AUDIO + +// #define VIBRATO_ENABLE + // Enable vibrato strength/amplitude - slows down ISR too much // #define VIBRATO_STRENGTH_ENABLE @@ -25,6 +30,8 @@ void audio_off(void); // Vibrato rate functions +#ifdef VIBRATO_ENABLE + void set_vibrato_rate(float rate); void increase_vibrato_rate(float change); void decrease_vibrato_rate(float change); @@ -37,6 +44,8 @@ void decrease_vibrato_strength(float change); #endif +#endif + // Polyphony functions void set_polyphony_rate(float rate); @@ -51,11 +60,15 @@ void set_tempo(float tempo); void increase_tempo(uint8_t tempo_change); void decrease_tempo(uint8_t tempo_change); +void audio_init(); + +#ifdef PWM_AUDIO void play_sample(uint8_t * s, uint16_t l, bool r); -void play_note(double freq, int vol); -void stop_note(double freq); +#endif +void play_note(float freq, int vol); +void stop_note(float freq); void stop_all_notes(void); -void play_notes(float (*np)[][2], uint8_t n_count, bool n_repeat, float n_rest); +void play_notes(float (*np)[][2], uint16_t n_count, bool n_repeat, float n_rest); #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), \ @@ -66,7 +79,7 @@ void play_notes(float (*np)[][2], uint8_t n_count, bool n_repeat, float n_rest); // These macros are used to allow play_notes to play an array of indeterminate // length. This works around the limitation of C's sizeof operation on pointers. // The global float array for the song must be used here. -#define NOTE_ARRAY_SIZE(x) ((int)(sizeof(x) / (sizeof(x[0])))) +#define NOTE_ARRAY_SIZE(x) ((int16_t)(sizeof(x) / (sizeof(x[0])))) #define PLAY_NOTE_ARRAY(note_array, note_repeat, note_rest_style) play_notes(¬e_array, NOTE_ARRAY_SIZE((note_array)), (note_repeat), (note_rest_style)); void play_goodbye_tone(void); diff --git a/quantum/vibrato_lut.h b/quantum/vibrato_lut.h index 4c267a626..a2b1f3e5c 100644 --- a/quantum/vibrato_lut.h +++ b/quantum/vibrato_lut.h @@ -2,107 +2,27 @@ #include #include -#define VIBRATO_LUT_LENGTH 100 +#define VIBRATO_LUT_LENGTH 20 const float VIBRATO_LUT[VIBRATO_LUT_LENGTH] = { \ -1.00045346811453, -1.00090535101508, -1.00135386178926, -1.00179722447259, 1.00223368114872, -1.0026614990145, -1.00307897737994, -1.00348445457284, -1.00387631471807, 1.00425299436105, -1.00461298890553, -1.00495485883603, -1.00527723569589, -1.00557882779254, 1.00585842560279, -1.00611490685176, -1.00634724124066, -1.00655449479987, -1.00673583384565, 1.00689052852052, -1.00701795589922, -1.00711760264454, -1.0071890671992, -1.00723206150266, 1.0072464122237, -1.00723206150266, -1.0071890671992, -1.00711760264454, -1.00701795589922, 1.00689052852052, -1.00673583384565, -1.00655449479987, -1.00634724124066, -1.00611490685176, 1.00585842560279, -1.00557882779254, -1.00527723569589, -1.00495485883603, -1.00461298890553, 1.00425299436105, -1.00387631471807, -1.00348445457284, -1.00307897737994, -1.0026614990145, 1.00223368114872, -1.00179722447259, -1.00135386178926, -1.00090535101508, -1.00045346811453, 1, -0.999546737425598, -0.999095467903976, -0.998647968674285, -0.998205999748565, 0.99777129706302, -0.997345565759612, -0.996930473622346, -0.996527644691494, -0.996138653077835, 0.99576501699778, -0.995408193048995, -0.995069570744927, -0.994750467325326, -0.994452122858643, 0.994175695650927, -0.993922257974591, -0.99369279212925, -0.993488186845591, -0.993309234042139, 0.993156625943589, -0.993030952568311, -0.99293269959154, -0.992862246589715, -0.992819865670409, 0.992805720491269, -0.992819865670409, -0.992862246589715, -0.99293269959154, -0.993030952568311, 0.993156625943589, -0.993309234042139, -0.993488186845591, -0.99369279212925, -0.993922257974591, 0.994175695650927, -0.994452122858643, -0.994750467325326, -0.995069570744927, -0.995408193048995, 0.99576501699778, -0.996138653077835, -0.996527644691494, -0.996930473622346, -0.997345565759612, 0.99777129706302, -0.998205999748565, -0.998647968674285, -0.999095467903976, -0.999546737425598, 1 }; \ No newline at end of file -- cgit v1.2.3-70-g09d2 From b0635e58eb33b0ed4f6b4a3846660feae15681ad Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Wed, 20 Apr 2016 18:39:36 -0400 Subject: delay isn't the problem here --- keyboard/preonic/keymaps/default/keymap.c | 2 +- quantum/audio.c | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) (limited to 'quantum') diff --git a/keyboard/preonic/keymaps/default/keymap.c b/keyboard/preonic/keymaps/default/keymap.c index 9ee803b06..16f8a8bf1 100644 --- a/keyboard/preonic/keymaps/default/keymap.c +++ b/keyboard/preonic/keymaps/default/keymap.c @@ -315,7 +315,7 @@ void matrix_init_user(void) { void play_startup_tone() { - PLAY_NOTE_ARRAY(music_scale, false, 0); + PLAY_NOTE_ARRAY(start_up, false, 0); } void play_goodbye_tone() diff --git a/quantum/audio.c b/quantum/audio.c index ab3444bc9..e4f0bf30e 100644 --- a/quantum/audio.c +++ b/quantum/audio.c @@ -213,7 +213,6 @@ void audio_init() { #endif inited = true; - _delay_ms(500); } void stop_all_notes() { -- cgit v1.2.3-70-g09d2 From 7d1a683607a95aa9715b5decb1013f3e644b96c9 Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Wed, 20 Apr 2016 22:28:47 -0400 Subject: sounds for plover layout --- keyboard/planck/keymaps/default/keymap.c | 39 ++++++++++---------------------- quantum/song_list.h | 16 +++++++++++++ 2 files changed, 28 insertions(+), 27 deletions(-) (limited to 'quantum') diff --git a/keyboard/planck/keymaps/default/keymap.c b/keyboard/planck/keymaps/default/keymap.c index 5f8a86c50..3239dda71 100644 --- a/keyboard/planck/keymaps/default/keymap.c +++ b/keyboard/planck/keymaps/default/keymap.c @@ -198,33 +198,11 @@ float tone_startup[][2] = { {440.0*pow(2.0,(28)/12.0), 20} }; -float tone_qwerty[][2] = { - {440.0*pow(2.0,(23)/12.0), 8}, - {440.0*pow(2.0,(24)/12.0), 8}, - {0, 4}, - {440.0*pow(2.0,(31)/12.0), 16} -}; - -float tone_colemak[][2] = { - {440.0*pow(2.0,(23)/12.0), 8}, - {440.0*pow(2.0,(24)/12.0), 8}, - {0, 4}, - {440.0*pow(2.0,(31)/12.0), 12}, - {0, 4}, - {440.0*pow(2.0,(35)/12.0), 12} -}; - -float tone_dvorak[][2] = { - {440.0*pow(2.0,(23)/12.0), 8}, - {440.0*pow(2.0,(24)/12.0), 8}, - {0, 4}, - {440.0*pow(2.0,(31)/12.0), 8}, - {0, 4}, - {440.0*pow(2.0,(33)/12.0), 8}, - {0, 4}, - {440.0*pow(2.0,(31)/12.0), 8} -}; - +float tone_qwerty[][2] = SONG(QWERTY_SOUND); +float tone_dvorak[][2] = SONG(DVORAK_SOUND); +float tone_colemak[][2] = SONG(COLEMAK_SOUND); +float tone_plover[][2] = SONG(PLOVER_SOUND); +float tone_plover_gb[][2] = SONG(PLOVER_GOODBYE_SOUND); float music_scale[][2] = SONG(MUSIC_SCALE_SOUND); float goodbye[][2] = SONG(GOODBYE_SOUND); @@ -325,6 +303,9 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) break; case 10: if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_NOTE_ARRAY(tone_plover, false, 0); + #endif layer_off(_RAISE); layer_off(_LOWER); layer_off(_ADJUST); @@ -339,6 +320,9 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) break; case 11: if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_NOTE_ARRAY(tone_plover_gb, false, 0); + #endif layer_off(_PLOVER); } break; @@ -364,6 +348,7 @@ void process_action_user(keyrecord_t *record) { void matrix_init_user(void) { #ifdef AUDIO_ENABLE + _delay_ms(10); // stops the tick PLAY_NOTE_ARRAY(tone_startup, false, 0); #endif } diff --git a/quantum/song_list.h b/quantum/song_list.h index e992bd18a..fc6fcdeef 100644 --- a/quantum/song_list.h +++ b/quantum/song_list.h @@ -64,6 +64,22 @@ S__NOTE(_REST), \ E__NOTE(_E7 ), +#define PLOVER_SOUND \ + E__NOTE(_GS6 ), \ + E__NOTE(_A6 ), \ + S__NOTE(_REST), \ + ED_NOTE(_E7 ), \ + S__NOTE(_REST), \ + ED_NOTE(_A7 ), + +#define PLOVER_GOODBYE_SOUND \ + E__NOTE(_GS6 ), \ + E__NOTE(_A6 ), \ + S__NOTE(_REST), \ + ED_NOTE(_A7 ), \ + S__NOTE(_REST), \ + ED_NOTE(_E7 ), + #define MUSIC_SCALE_SOUND \ E__NOTE(_A5 ), \ E__NOTE(_B5 ), \ -- cgit v1.2.3-70-g09d2 From 2e303b40aed372ea69b79850dae41e4f8ea457f4 Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Wed, 20 Apr 2016 22:29:01 -0400 Subject: start of envelope function --- quantum/audio.c | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) (limited to 'quantum') diff --git a/quantum/audio.c b/quantum/audio.c index e4f0bf30e..1327887d9 100644 --- a/quantum/audio.c +++ b/quantum/audio.c @@ -81,6 +81,7 @@ bool inited = false; audio_config_t audio_config; +uint16_t envelope_index = 0; void audio_toggle(void) { audio_config.enable ^= 1; @@ -298,6 +299,26 @@ float vibrato(float average_freq) { #endif +float envelope(float f) { + uint16_t compensated_index = (uint16_t)((float)envelope_index * (880.0 / f)); + switch (compensated_index) { + case 0: + note_timbre = TIMBRE_50; + break; + case 20: + note_timbre = TIMBRE_25; + break; + case 32: + note_timbre = TIMBRE_12; + break; + case 40 ... 60: + f = f / 2; + note_timbre = TIMBRE_50; + break; + } + return f; +} + ISR(TIMER3_COMPA_vect) { if (note) { #ifdef PWM_AUDIO @@ -387,6 +408,12 @@ ISR(TIMER3_COMPA_vect) { freq = frequency; } } + + if (envelope_index < 65535) { + envelope_index++; + } + freq = envelope(freq); + ICR3 = (int)(((double)F_CPU) / (freq * CPU_PRESCALER)); // Set max to the period OCR3A = (int)((((double)F_CPU) / (freq * CPU_PRESCALER)) * note_timbre); // Set compare to half the period } @@ -495,6 +522,7 @@ if (audio_config.enable && voices < 8) { if (notes) stop_all_notes(); note = true; + envelope_index = 0; #ifdef PWM_AUDIO freq = freq / SAMPLE_RATE; #endif -- cgit v1.2.3-70-g09d2 From 2e60054951ce08e973c735991bd95390c6aa3842 Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Wed, 20 Apr 2016 23:16:39 -0400 Subject: fade envelope --- quantum/audio.c | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) (limited to 'quantum') diff --git a/quantum/audio.c b/quantum/audio.c index 1327887d9..df421ef99 100644 --- a/quantum/audio.c +++ b/quantum/audio.c @@ -302,18 +302,19 @@ float vibrato(float average_freq) { float envelope(float f) { uint16_t compensated_index = (uint16_t)((float)envelope_index * (880.0 / f)); switch (compensated_index) { - case 0: - note_timbre = TIMBRE_50; - break; - case 20: - note_timbre = TIMBRE_25; - break; - case 32: + case 0 ... 9: + f = f / 4; note_timbre = TIMBRE_12; break; - case 40 ... 60: + case 10 ... 19: f = f / 2; - note_timbre = TIMBRE_50; + note_timbre = TIMBRE_12; + break; + case 20 ... 200: + note_timbre = .125 - pow(((float)compensated_index - 20) / (200 - 20), 2)*.125; + break; + default: + note_timbre = 0; break; } return f; @@ -414,6 +415,8 @@ ISR(TIMER3_COMPA_vect) { } freq = envelope(freq); + if (freq < 30.517578125) + freq = 30.52; ICR3 = (int)(((double)F_CPU) / (freq * CPU_PRESCALER)); // Set max to the period OCR3A = (int)((((double)F_CPU) / (freq * CPU_PRESCALER)) * note_timbre); // Set compare to half the period } -- cgit v1.2.3-70-g09d2 From 73228f5e5d1d4cd31a46e5e93aa893a8f727e3b9 Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Thu, 21 Apr 2016 00:37:45 -0400 Subject: restructures audio, begins voicing --- quantum/audio.c | 622 ------------------------------------------ quantum/audio.h | 88 ------ quantum/audio/audio.c | 607 +++++++++++++++++++++++++++++++++++++++++ quantum/audio/audio.h | 89 ++++++ quantum/audio/musical_notes.h | 217 +++++++++++++++ quantum/audio/song_list.h | 117 ++++++++ quantum/audio/vibrato_lut.h | 28 ++ quantum/audio/voices.c | 60 ++++ quantum/audio/voices.h | 21 ++ quantum/audio/wave.h | 265 ++++++++++++++++++ quantum/musical_notes.h | 217 --------------- quantum/quantum.mk | 3 +- quantum/song_list.h | 117 -------- quantum/vibrato_lut.h | 28 -- quantum/wave.h | 265 ------------------ 15 files changed, 1406 insertions(+), 1338 deletions(-) delete mode 100644 quantum/audio.c delete mode 100644 quantum/audio.h create mode 100644 quantum/audio/audio.c create mode 100644 quantum/audio/audio.h create mode 100644 quantum/audio/musical_notes.h create mode 100644 quantum/audio/song_list.h create mode 100644 quantum/audio/vibrato_lut.h create mode 100644 quantum/audio/voices.c create mode 100644 quantum/audio/voices.h create mode 100644 quantum/audio/wave.h delete mode 100644 quantum/musical_notes.h delete mode 100644 quantum/song_list.h delete mode 100644 quantum/vibrato_lut.h delete mode 100644 quantum/wave.h (limited to 'quantum') diff --git a/quantum/audio.c b/quantum/audio.c deleted file mode 100644 index df421ef99..000000000 --- a/quantum/audio.c +++ /dev/null @@ -1,622 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include "print.h" -#include "audio.h" -#include "keymap_common.h" - -#include "eeconfig.h" - -#ifdef VIBRATO_ENABLE - #include "vibrato_lut.h" -#endif - -#define PI 3.14159265 - -#define CPU_PRESCALER 8 - -#ifdef PWM_AUDIO - #include "wave.h" - #define SAMPLE_DIVIDER 39 - #define SAMPLE_RATE (2000000.0/SAMPLE_DIVIDER/2048) - // Resistor value of 1/ (2 * PI * 10nF * (2000000 hertz / SAMPLE_DIVIDER / 10)) for 10nF cap - - float places[8] = {0, 0, 0, 0, 0, 0, 0, 0}; - uint16_t place_int = 0; - bool repeat = true; -#endif - -void delay_us(int count) { - while(count--) { - _delay_us(1); - } -} - -int voices = 0; -int voice_place = 0; -float frequency = 0; -int volume = 0; -long position = 0; - -float frequencies[8] = {0, 0, 0, 0, 0, 0, 0, 0}; -int volumes[8] = {0, 0, 0, 0, 0, 0, 0, 0}; -bool sliding = false; - -int max = 0xFF; -float sum = 0; -float place = 0; - -uint8_t * sample; -uint16_t sample_length = 0; -// float freq = 0; - -bool notes = false; -bool note = false; -float note_frequency = 0; -float note_length = 0; -float note_tempo = TEMPO_DEFAULT; -float note_timbre = TIMBRE_DEFAULT; -uint16_t note_position = 0; -float (* notes_pointer)[][2]; -uint16_t notes_count; -bool notes_repeat; -float notes_rest; -bool note_resting = false; - -uint8_t current_note = 0; -uint8_t rest_counter = 0; - -#ifdef VIBRATO_ENABLE -float vibrato_counter = 0; -float vibrato_strength = .5; -float vibrato_rate = 0.125; -#endif - -float polyphony_rate = 0; - -bool inited = false; - -audio_config_t audio_config; - -uint16_t envelope_index = 0; - -void audio_toggle(void) { - audio_config.enable ^= 1; - eeconfig_write_audio(audio_config.raw); -} - -void audio_on(void) { - audio_config.enable = 1; - eeconfig_write_audio(audio_config.raw); -} - -void audio_off(void) { - audio_config.enable = 0; - eeconfig_write_audio(audio_config.raw); -} - -#ifdef VIBRATO_ENABLE -// Vibrato rate functions - -void set_vibrato_rate(float rate) { - vibrato_rate = rate; -} - -void increase_vibrato_rate(float change) { - vibrato_rate *= change; -} - -void decrease_vibrato_rate(float change) { - vibrato_rate /= change; -} - -#ifdef VIBRATO_STRENGTH_ENABLE - -void set_vibrato_strength(float strength) { - vibrato_strength = strength; -} - -void increase_vibrato_strength(float change) { - vibrato_strength *= change; -} - -void decrease_vibrato_strength(float change) { - vibrato_strength /= change; -} - -#endif - -#endif - -// Polyphony functions - -void set_polyphony_rate(float rate) { - polyphony_rate = rate; -} - -void enable_polyphony() { - polyphony_rate = 5; -} - -void disable_polyphony() { - polyphony_rate = 0; -} - -void increase_polyphony_rate(float change) { - polyphony_rate *= change; -} - -void decrease_polyphony_rate(float change) { - polyphony_rate /= change; -} - -// Timbre function - -void set_timbre(float timbre) { - note_timbre = timbre; -} - -// Tempo functions - -void set_tempo(float tempo) { - note_tempo = tempo; -} - -void decrease_tempo(uint8_t tempo_change) { - note_tempo += (float) tempo_change; -} - -void increase_tempo(uint8_t tempo_change) { - if (note_tempo - (float) tempo_change < 10) { - note_tempo = 10; - } else { - note_tempo -= (float) tempo_change; - } -} - -void audio_init() { - - /* check signature */ - if (!eeconfig_is_enabled()) { - eeconfig_init(); - } - audio_config.raw = eeconfig_read_audio(); - - #ifdef PWM_AUDIO - PLLFRQ = _BV(PDIV2); - PLLCSR = _BV(PLLE); - while(!(PLLCSR & _BV(PLOCK))); - PLLFRQ |= _BV(PLLTM0); /* PCK 48MHz */ - - /* Init a fast PWM on Timer4 */ - TCCR4A = _BV(COM4A0) | _BV(PWM4A); /* Clear OC4A on Compare Match */ - TCCR4B = _BV(CS40); /* No prescaling => f = PCK/256 = 187500Hz */ - OCR4A = 0; - - /* Enable the OC4A output */ - DDRC |= _BV(PORTC6); - - TIMSK3 &= ~_BV(OCIE3A); // Turn off 3A interputs - - TCCR3A = 0x0; // Options not needed - TCCR3B = _BV(CS31) | _BV(CS30) | _BV(WGM32); // 64th prescaling and CTC - OCR3A = SAMPLE_DIVIDER - 1; // Correct count/compare, related to sample playback - #else - DDRC |= _BV(PORTC6); - - TIMSK3 &= ~_BV(OCIE3A); // Turn off 3A interputs - - TCCR3A = (0 << COM3A1) | (0 << COM3A0) | (1 << WGM31) | (0 << WGM30); - TCCR3B = (1 << WGM33) | (1 << WGM32) | (0 << CS32) | (1 << CS31) | (0 << CS30); - #endif - - inited = true; -} - -void stop_all_notes() { - if (!inited) { - audio_init(); - } - voices = 0; - #ifdef PWM_AUDIO - TIMSK3 &= ~_BV(OCIE3A); - #else - TIMSK3 &= ~_BV(OCIE3A); - TCCR3A &= ~_BV(COM3A1); - #endif - notes = false; - note = false; - frequency = 0; - volume = 0; - - for (int i = 0; i < 8; i++) { - frequencies[i] = 0; - volumes[i] = 0; - } -} - -void stop_note(float freq) { - if (note) { - if (!inited) { - audio_init(); - } - #ifdef PWM_AUDIO - freq = freq / SAMPLE_RATE; - #endif - 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; - } - break; - } - } - voices--; - if (voices < 0) - voices = 0; - if (voice_place >= voices) { - voice_place = 0; - } - if (voices == 0) { - #ifdef PWM_AUDIO - TIMSK3 &= ~_BV(OCIE3A); - #else - TIMSK3 &= ~_BV(OCIE3A); - TCCR3A &= ~_BV(COM3A1); - #endif - frequency = 0; - volume = 0; - note = false; - } - } -} - -#ifdef VIBRATO_ENABLE - -float mod(float a, int b) -{ - float r = fmod(a, b); - return r < 0 ? r + b : r; -} - -float vibrato(float average_freq) { - #ifdef VIBRATO_STRENGTH_ENABLE - float vibrated_freq = average_freq * pow(VIBRATO_LUT[(int)vibrato_counter], vibrato_strength); - #else - float vibrated_freq = average_freq * VIBRATO_LUT[(int)vibrato_counter]; - #endif - vibrato_counter = mod((vibrato_counter + vibrato_rate * (1.0 + 440.0/average_freq)), VIBRATO_LUT_LENGTH); - return vibrated_freq; -} - -#endif - -float envelope(float f) { - uint16_t compensated_index = (uint16_t)((float)envelope_index * (880.0 / f)); - switch (compensated_index) { - case 0 ... 9: - f = f / 4; - note_timbre = TIMBRE_12; - break; - case 10 ... 19: - f = f / 2; - note_timbre = TIMBRE_12; - break; - case 20 ... 200: - note_timbre = .125 - pow(((float)compensated_index - 20) / (200 - 20), 2)*.125; - break; - default: - note_timbre = 0; - break; - } - return f; -} - -ISR(TIMER3_COMPA_vect) { - if (note) { - #ifdef PWM_AUDIO - if (voices == 1) { - // SINE - OCR4A = pgm_read_byte(&sinewave[(uint16_t)place]) >> 2; - - // SQUARE - // if (((int)place) >= 1024){ - // OCR4A = 0xFF >> 2; - // } else { - // OCR4A = 0x00; - // } - - // SAWTOOTH - // OCR4A = (int)place / 4; - - // TRIANGLE - // if (((int)place) >= 1024) { - // OCR4A = (int)place / 2; - // } else { - // OCR4A = 2048 - (int)place / 2; - // } - - place += frequency; - - if (place >= SINE_LENGTH) - place -= SINE_LENGTH; - - } else { - int sum = 0; - for (int i = 0; i < voices; i++) { - // SINE - sum += pgm_read_byte(&sinewave[(uint16_t)places[i]]) >> 2; - - // SQUARE - // if (((int)places[i]) >= 1024){ - // sum += 0xFF >> 2; - // } else { - // sum += 0x00; - // } - - places[i] += frequencies[i]; - - if (places[i] >= SINE_LENGTH) - places[i] -= SINE_LENGTH; - } - OCR4A = sum; - } - #else - if (voices > 0) { - float freq; - if (polyphony_rate > 0) { - if (voices > 1) { - voice_place %= voices; - if (place++ > (frequencies[voice_place] / polyphony_rate / CPU_PRESCALER)) { - voice_place = (voice_place + 1) % voices; - place = 0.0; - } - } - #ifdef VIBRATO_ENABLE - if (vibrato_strength > 0) { - freq = vibrato(frequencies[voice_place]); - } else { - #else - { - #endif - freq = frequencies[voice_place]; - } - } else { - if (frequency != 0 && frequency < frequencies[voices - 1] && frequency < frequencies[voices - 1] * pow(2, -440/frequencies[voices - 1]/12/2)) { - frequency = frequency * pow(2, 440/frequency/12/2); - } else if (frequency != 0 && frequency > frequencies[voices - 1] && frequency > frequencies[voices - 1] * pow(2, 440/frequencies[voices - 1]/12/2)) { - frequency = frequency * pow(2, -440/frequency/12/2); - } else { - frequency = frequencies[voices - 1]; - } - - - #ifdef VIBRATO_ENABLE - if (vibrato_strength > 0) { - freq = vibrato(frequency); - } else { - #else - { - #endif - freq = frequency; - } - } - - if (envelope_index < 65535) { - envelope_index++; - } - freq = envelope(freq); - - if (freq < 30.517578125) - freq = 30.52; - ICR3 = (int)(((double)F_CPU) / (freq * CPU_PRESCALER)); // Set max to the period - OCR3A = (int)((((double)F_CPU) / (freq * CPU_PRESCALER)) * note_timbre); // Set compare to half the period - } - #endif - } - - // SAMPLE - // OCR4A = pgm_read_byte(&sample[(uint16_t)place_int]); - - // place_int++; - - // if (place_int >= sample_length) - // if (repeat) - // place_int -= sample_length; - // else - // TIMSK3 &= ~_BV(OCIE3A); - - - if (notes) { - #ifdef PWM_AUDIO - OCR4A = pgm_read_byte(&sinewave[(uint16_t)place]) >> 0; - - place += note_frequency; - if (place >= SINE_LENGTH) - place -= SINE_LENGTH; - #else - if (note_frequency > 0) { - float freq; - - #ifdef VIBRATO_ENABLE - if (vibrato_strength > 0) { - freq = vibrato(note_frequency); - } else { - #else - { - #endif - freq = note_frequency; - } - - ICR3 = (int)(((double)F_CPU) / (freq * CPU_PRESCALER)); // Set max to the period - OCR3A = (int)((((double)F_CPU) / (freq * CPU_PRESCALER)) * note_timbre); // Set compare to half the period - } else { - ICR3 = 0; - OCR3A = 0; - } - #endif - - - note_position++; - bool end_of_note = false; - if (ICR3 > 0) - end_of_note = (note_position >= (note_length / ICR3 * 0xFFFF)); - else - end_of_note = (note_position >= (note_length * 0x7FF)); - if (end_of_note) { - current_note++; - if (current_note >= notes_count) { - if (notes_repeat) { - current_note = 0; - } else { - #ifdef PWM_AUDIO - TIMSK3 &= ~_BV(OCIE3A); - #else - TIMSK3 &= ~_BV(OCIE3A); - TCCR3A &= ~_BV(COM3A1); - #endif - notes = false; - return; - } - } - if (!note_resting && (notes_rest > 0)) { - note_resting = true; - note_frequency = 0; - note_length = notes_rest; - current_note--; - } else { - note_resting = false; - #ifdef PWM_AUDIO - note_frequency = (*notes_pointer)[current_note][0] / SAMPLE_RATE; - note_length = (*notes_pointer)[current_note][1] * (note_tempo / 100); - #else - note_frequency = (*notes_pointer)[current_note][0]; - note_length = ((*notes_pointer)[current_note][1] / 4) * (note_tempo / 100); - #endif - } - note_position = 0; - } - - } - - if (!audio_config.enable) { - notes = false; - note = false; - } -} - -void play_note(float freq, int vol) { - - if (!inited) { - audio_init(); - } - -if (audio_config.enable && voices < 8) { - TIMSK3 &= ~_BV(OCIE3A); - // Cancel notes if notes are playing - if (notes) - stop_all_notes(); - note = true; - envelope_index = 0; - #ifdef PWM_AUDIO - freq = freq / SAMPLE_RATE; - #endif - if (freq > 0) { - frequencies[voices] = freq; - volumes[voices] = vol; - voices++; - } - - #ifdef PWM_AUDIO - TIMSK3 |= _BV(OCIE3A); - #else - TIMSK3 |= _BV(OCIE3A); - TCCR3A |= _BV(COM3A1); - #endif -} - -} - -void play_notes(float (*np)[][2], uint16_t n_count, bool n_repeat, float n_rest) { - - if (!inited) { - audio_init(); - } - -if (audio_config.enable) { - TIMSK3 &= ~_BV(OCIE3A); - // Cancel note if a note is playing - if (note) - stop_all_notes(); - notes = true; - - notes_pointer = np; - notes_count = n_count; - notes_repeat = n_repeat; - notes_rest = n_rest; - - place = 0; - current_note = 0; - #ifdef PWM_AUDIO - note_frequency = (*notes_pointer)[current_note][0] / SAMPLE_RATE; - note_length = (*notes_pointer)[current_note][1] * (note_tempo / 100); - #else - note_frequency = (*notes_pointer)[current_note][0]; - note_length = ((*notes_pointer)[current_note][1] / 4) * (note_tempo / 100); - #endif - note_position = 0; - - - #ifdef PWM_AUDIO - TIMSK3 |= _BV(OCIE3A); - #else - TIMSK3 |= _BV(OCIE3A); - TCCR3A |= _BV(COM3A1); - #endif -} - -} - -#ifdef PWM_AUDIO -void play_sample(uint8_t * s, uint16_t l, bool r) { - if (!inited) { - audio_init(); - } - - if (audio_config.enable) { - TIMSK3 &= ~_BV(OCIE3A); - stop_all_notes(); - place_int = 0; - sample = s; - sample_length = l; - repeat = r; - - TIMSK3 |= _BV(OCIE3A); - } -} -#endif - -//------------------------------------------------------------------------------ -// Override these functions in your keymap file to play different tunes on -// startup and bootloader jump -__attribute__ ((weak)) -void play_startup_tone() -{ -} - - - -__attribute__ ((weak)) -void play_goodbye_tone() -{ - -} -//------------------------------------------------------------------------------ diff --git a/quantum/audio.h b/quantum/audio.h deleted file mode 100644 index 2d4d303ce..000000000 --- a/quantum/audio.h +++ /dev/null @@ -1,88 +0,0 @@ -#include -#include -#include -#include -#include "musical_notes.h" -#include "song_list.h" - -#ifndef AUDIO_H -#define AUDIO_H - -// Largely untested PWM audio mode (doesn't sound as good) -// #define PWM_AUDIO - -// #define VIBRATO_ENABLE - -// Enable vibrato strength/amplitude - slows down ISR too much -// #define VIBRATO_STRENGTH_ENABLE - -typedef union { - uint8_t raw; - struct { - bool enable :1; - uint8_t level :7; - }; -} audio_config_t; - -void audio_toggle(void); -void audio_on(void); -void audio_off(void); - -// Vibrato rate functions - -#ifdef VIBRATO_ENABLE - -void set_vibrato_rate(float rate); -void increase_vibrato_rate(float change); -void decrease_vibrato_rate(float change); - -#ifdef VIBRATO_STRENGTH_ENABLE - -void set_vibrato_strength(float strength); -void increase_vibrato_strength(float change); -void decrease_vibrato_strength(float change); - -#endif - -#endif - -// Polyphony functions - -void set_polyphony_rate(float rate); -void enable_polyphony(); -void disable_polyphony(); -void increase_polyphony_rate(float change); -void decrease_polyphony_rate(float change); - -void set_timbre(float timbre); -void set_tempo(float tempo); - -void increase_tempo(uint8_t tempo_change); -void decrease_tempo(uint8_t tempo_change); - -void audio_init(); - -#ifdef PWM_AUDIO -void play_sample(uint8_t * s, uint16_t l, bool r); -#endif -void play_note(float freq, int vol); -void stop_note(float freq); -void stop_all_notes(void); -void play_notes(float (*np)[][2], uint16_t n_count, bool n_repeat, float n_rest); - -#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), } - -// These macros are used to allow play_notes to play an array of indeterminate -// length. This works around the limitation of C's sizeof operation on pointers. -// The global float array for the song must be used here. -#define NOTE_ARRAY_SIZE(x) ((int16_t)(sizeof(x) / (sizeof(x[0])))) -#define PLAY_NOTE_ARRAY(note_array, note_repeat, note_rest_style) play_notes(¬e_array, NOTE_ARRAY_SIZE((note_array)), (note_repeat), (note_rest_style)); - -void play_goodbye_tone(void); -void play_startup_tone(void); - -#endif \ No newline at end of file diff --git a/quantum/audio/audio.c b/quantum/audio/audio.c new file mode 100644 index 000000000..3225557ba --- /dev/null +++ b/quantum/audio/audio.c @@ -0,0 +1,607 @@ +#include +#include +#include +#include +#include +#include +#include "print.h" +#include "audio.h" +#include "keymap_common.h" + +#include "eeconfig.h" + +#ifdef VIBRATO_ENABLE + #include "vibrato_lut.h" +#endif + +#define PI 3.14159265 + +#define CPU_PRESCALER 8 + +#ifdef PWM_AUDIO + #include "wave.h" + #define SAMPLE_DIVIDER 39 + #define SAMPLE_RATE (2000000.0/SAMPLE_DIVIDER/2048) + // Resistor value of 1/ (2 * PI * 10nF * (2000000 hertz / SAMPLE_DIVIDER / 10)) for 10nF cap + + float places[8] = {0, 0, 0, 0, 0, 0, 0, 0}; + uint16_t place_int = 0; + bool repeat = true; +#endif + +void delay_us(int count) { + while(count--) { + _delay_us(1); + } +} + +int voices = 0; +int voice_place = 0; +float frequency = 0; +int volume = 0; +long position = 0; + +float frequencies[8] = {0, 0, 0, 0, 0, 0, 0, 0}; +int volumes[8] = {0, 0, 0, 0, 0, 0, 0, 0}; +bool sliding = false; + +int max = 0xFF; +float sum = 0; +float place = 0; + +uint8_t * sample; +uint16_t sample_length = 0; +// float freq = 0; + +bool notes = false; +bool note = false; +float note_frequency = 0; +float note_length = 0; +float note_tempo = TEMPO_DEFAULT; +float note_timbre = TIMBRE_DEFAULT; +uint16_t note_position = 0; +float (* notes_pointer)[][2]; +uint16_t notes_count; +bool notes_repeat; +float notes_rest; +bool note_resting = false; + +uint8_t current_note = 0; +uint8_t rest_counter = 0; + +#ifdef VIBRATO_ENABLE +float vibrato_counter = 0; +float vibrato_strength = .5; +float vibrato_rate = 0.125; +#endif + +float polyphony_rate = 0; + +bool inited = false; + +audio_config_t audio_config; + +uint16_t envelope_index = 0; + +void audio_toggle(void) { + audio_config.enable ^= 1; + eeconfig_write_audio(audio_config.raw); +} + +void audio_on(void) { + audio_config.enable = 1; + eeconfig_write_audio(audio_config.raw); +} + +void audio_off(void) { + audio_config.enable = 0; + eeconfig_write_audio(audio_config.raw); +} + +#ifdef VIBRATO_ENABLE +// Vibrato rate functions + +void set_vibrato_rate(float rate) { + vibrato_rate = rate; +} + +void increase_vibrato_rate(float change) { + vibrato_rate *= change; +} + +void decrease_vibrato_rate(float change) { + vibrato_rate /= change; +} + +#ifdef VIBRATO_STRENGTH_ENABLE + +void set_vibrato_strength(float strength) { + vibrato_strength = strength; +} + +void increase_vibrato_strength(float change) { + vibrato_strength *= change; +} + +void decrease_vibrato_strength(float change) { + vibrato_strength /= change; +} + +#endif + +#endif + +// Polyphony functions + +void set_polyphony_rate(float rate) { + polyphony_rate = rate; +} + +void enable_polyphony() { + polyphony_rate = 5; +} + +void disable_polyphony() { + polyphony_rate = 0; +} + +void increase_polyphony_rate(float change) { + polyphony_rate *= change; +} + +void decrease_polyphony_rate(float change) { + polyphony_rate /= change; +} + +// Timbre function + +void set_timbre(float timbre) { + note_timbre = timbre; +} + +// Tempo functions + +void set_tempo(float tempo) { + note_tempo = tempo; +} + +void decrease_tempo(uint8_t tempo_change) { + note_tempo += (float) tempo_change; +} + +void increase_tempo(uint8_t tempo_change) { + if (note_tempo - (float) tempo_change < 10) { + note_tempo = 10; + } else { + note_tempo -= (float) tempo_change; + } +} + +void audio_init() { + + /* check signature */ + if (!eeconfig_is_enabled()) { + eeconfig_init(); + } + audio_config.raw = eeconfig_read_audio(); + + #ifdef PWM_AUDIO + PLLFRQ = _BV(PDIV2); + PLLCSR = _BV(PLLE); + while(!(PLLCSR & _BV(PLOCK))); + PLLFRQ |= _BV(PLLTM0); /* PCK 48MHz */ + + /* Init a fast PWM on Timer4 */ + TCCR4A = _BV(COM4A0) | _BV(PWM4A); /* Clear OC4A on Compare Match */ + TCCR4B = _BV(CS40); /* No prescaling => f = PCK/256 = 187500Hz */ + OCR4A = 0; + + /* Enable the OC4A output */ + DDRC |= _BV(PORTC6); + + TIMSK3 &= ~_BV(OCIE3A); // Turn off 3A interputs + + TCCR3A = 0x0; // Options not needed + TCCR3B = _BV(CS31) | _BV(CS30) | _BV(WGM32); // 64th prescaling and CTC + OCR3A = SAMPLE_DIVIDER - 1; // Correct count/compare, related to sample playback + #else + DDRC |= _BV(PORTC6); + + TIMSK3 &= ~_BV(OCIE3A); // Turn off 3A interputs + + TCCR3A = (0 << COM3A1) | (0 << COM3A0) | (1 << WGM31) | (0 << WGM30); + TCCR3B = (1 << WGM33) | (1 << WGM32) | (0 << CS32) | (1 << CS31) | (0 << CS30); + #endif + + inited = true; +} + +void stop_all_notes() { + if (!inited) { + audio_init(); + } + voices = 0; + #ifdef PWM_AUDIO + TIMSK3 &= ~_BV(OCIE3A); + #else + TIMSK3 &= ~_BV(OCIE3A); + TCCR3A &= ~_BV(COM3A1); + #endif + notes = false; + note = false; + frequency = 0; + volume = 0; + + for (int i = 0; i < 8; i++) { + frequencies[i] = 0; + volumes[i] = 0; + } +} + +void stop_note(float freq) { + if (note) { + if (!inited) { + audio_init(); + } + #ifdef PWM_AUDIO + freq = freq / SAMPLE_RATE; + #endif + 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; + } + break; + } + } + voices--; + if (voices < 0) + voices = 0; + if (voice_place >= voices) { + voice_place = 0; + } + if (voices == 0) { + #ifdef PWM_AUDIO + TIMSK3 &= ~_BV(OCIE3A); + #else + TIMSK3 &= ~_BV(OCIE3A); + TCCR3A &= ~_BV(COM3A1); + #endif + frequency = 0; + volume = 0; + note = false; + } + } +} + +#ifdef VIBRATO_ENABLE + +float mod(float a, int b) +{ + float r = fmod(a, b); + return r < 0 ? r + b : r; +} + +float vibrato(float average_freq) { + #ifdef VIBRATO_STRENGTH_ENABLE + float vibrated_freq = average_freq * pow(VIBRATO_LUT[(int)vibrato_counter], vibrato_strength); + #else + float vibrated_freq = average_freq * VIBRATO_LUT[(int)vibrato_counter]; + #endif + vibrato_counter = mod((vibrato_counter + vibrato_rate * (1.0 + 440.0/average_freq)), VIBRATO_LUT_LENGTH); + return vibrated_freq; +} + +#endif + +ISR(TIMER3_COMPA_vect) { + if (note) { + #ifdef PWM_AUDIO + if (voices == 1) { + // SINE + OCR4A = pgm_read_byte(&sinewave[(uint16_t)place]) >> 2; + + // SQUARE + // if (((int)place) >= 1024){ + // OCR4A = 0xFF >> 2; + // } else { + // OCR4A = 0x00; + // } + + // SAWTOOTH + // OCR4A = (int)place / 4; + + // TRIANGLE + // if (((int)place) >= 1024) { + // OCR4A = (int)place / 2; + // } else { + // OCR4A = 2048 - (int)place / 2; + // } + + place += frequency; + + if (place >= SINE_LENGTH) + place -= SINE_LENGTH; + + } else { + int sum = 0; + for (int i = 0; i < voices; i++) { + // SINE + sum += pgm_read_byte(&sinewave[(uint16_t)places[i]]) >> 2; + + // SQUARE + // if (((int)places[i]) >= 1024){ + // sum += 0xFF >> 2; + // } else { + // sum += 0x00; + // } + + places[i] += frequencies[i]; + + if (places[i] >= SINE_LENGTH) + places[i] -= SINE_LENGTH; + } + OCR4A = sum; + } + #else + if (voices > 0) { + float freq; + if (polyphony_rate > 0) { + if (voices > 1) { + voice_place %= voices; + if (place++ > (frequencies[voice_place] / polyphony_rate / CPU_PRESCALER)) { + voice_place = (voice_place + 1) % voices; + place = 0.0; + } + } + #ifdef VIBRATO_ENABLE + if (vibrato_strength > 0) { + freq = vibrato(frequencies[voice_place]); + } else { + #else + { + #endif + freq = frequencies[voice_place]; + } + } else { + if (frequency != 0 && frequency < frequencies[voices - 1] && frequency < frequencies[voices - 1] * pow(2, -440/frequencies[voices - 1]/12/2)) { + frequency = frequency * pow(2, 440/frequency/12/2); + } else if (frequency != 0 && frequency > frequencies[voices - 1] && frequency > frequencies[voices - 1] * pow(2, 440/frequencies[voices - 1]/12/2)) { + frequency = frequency * pow(2, -440/frequency/12/2); + } else { + frequency = frequencies[voices - 1]; + } + + + #ifdef VIBRATO_ENABLE + if (vibrato_strength > 0) { + freq = vibrato(frequency); + } else { + #else + { + #endif + freq = frequency; + } + } + + if (envelope_index < 65535) { + envelope_index++; + } + freq = voice_envelope(freq); + + if (freq < 30.517578125) + freq = 30.52; + ICR3 = (int)(((double)F_CPU) / (freq * CPU_PRESCALER)); // Set max to the period + OCR3A = (int)((((double)F_CPU) / (freq * CPU_PRESCALER)) * note_timbre); // Set compare to half the period + } + #endif + } + + // SAMPLE + // OCR4A = pgm_read_byte(&sample[(uint16_t)place_int]); + + // place_int++; + + // if (place_int >= sample_length) + // if (repeat) + // place_int -= sample_length; + // else + // TIMSK3 &= ~_BV(OCIE3A); + + + if (notes) { + #ifdef PWM_AUDIO + OCR4A = pgm_read_byte(&sinewave[(uint16_t)place]) >> 0; + + place += note_frequency; + if (place >= SINE_LENGTH) + place -= SINE_LENGTH; + #else + if (note_frequency > 0) { + float freq; + + #ifdef VIBRATO_ENABLE + if (vibrato_strength > 0) { + freq = vibrato(note_frequency); + } else { + #else + { + #endif + freq = note_frequency; + } + + if (envelope_index < 65535) { + envelope_index++; + } + freq = voice_envelope(freq); + + ICR3 = (int)(((double)F_CPU) / (freq * CPU_PRESCALER)); // Set max to the period + OCR3A = (int)((((double)F_CPU) / (freq * CPU_PRESCALER)) * note_timbre); // Set compare to half the period + } else { + ICR3 = 0; + OCR3A = 0; + } + #endif + + + note_position++; + bool end_of_note = false; + if (ICR3 > 0) + end_of_note = (note_position >= (note_length / ICR3 * 0xFFFF)); + else + end_of_note = (note_position >= (note_length * 0x7FF)); + if (end_of_note) { + current_note++; + if (current_note >= notes_count) { + if (notes_repeat) { + current_note = 0; + } else { + #ifdef PWM_AUDIO + TIMSK3 &= ~_BV(OCIE3A); + #else + TIMSK3 &= ~_BV(OCIE3A); + TCCR3A &= ~_BV(COM3A1); + #endif + notes = false; + return; + } + } + if (!note_resting && (notes_rest > 0)) { + note_resting = true; + note_frequency = 0; + note_length = notes_rest; + current_note--; + } else { + note_resting = false; + #ifdef PWM_AUDIO + note_frequency = (*notes_pointer)[current_note][0] / SAMPLE_RATE; + note_length = (*notes_pointer)[current_note][1] * (note_tempo / 100); + #else + envelope_index = 0; + note_frequency = (*notes_pointer)[current_note][0]; + note_length = ((*notes_pointer)[current_note][1] / 4) * (note_tempo / 100); + #endif + } + note_position = 0; + } + + } + + if (!audio_config.enable) { + notes = false; + note = false; + } +} + +void play_note(float freq, int vol) { + + if (!inited) { + audio_init(); + } + +if (audio_config.enable && voices < 8) { + TIMSK3 &= ~_BV(OCIE3A); + // Cancel notes if notes are playing + if (notes) + stop_all_notes(); + note = true; + envelope_index = 0; + #ifdef PWM_AUDIO + freq = freq / SAMPLE_RATE; + #endif + if (freq > 0) { + frequencies[voices] = freq; + volumes[voices] = vol; + voices++; + } + + #ifdef PWM_AUDIO + TIMSK3 |= _BV(OCIE3A); + #else + TIMSK3 |= _BV(OCIE3A); + TCCR3A |= _BV(COM3A1); + #endif +} + +} + +void play_notes(float (*np)[][2], uint16_t n_count, bool n_repeat, float n_rest) { + + if (!inited) { + audio_init(); + } + +if (audio_config.enable) { + TIMSK3 &= ~_BV(OCIE3A); + // Cancel note if a note is playing + if (note) + stop_all_notes(); + notes = true; + + notes_pointer = np; + notes_count = n_count; + notes_repeat = n_repeat; + notes_rest = n_rest; + + place = 0; + current_note = 0; + #ifdef PWM_AUDIO + note_frequency = (*notes_pointer)[current_note][0] / SAMPLE_RATE; + note_length = (*notes_pointer)[current_note][1] * (note_tempo / 100); + #else + note_frequency = (*notes_pointer)[current_note][0]; + note_length = ((*notes_pointer)[current_note][1] / 4) * (note_tempo / 100); + #endif + note_position = 0; + + + #ifdef PWM_AUDIO + TIMSK3 |= _BV(OCIE3A); + #else + TIMSK3 |= _BV(OCIE3A); + TCCR3A |= _BV(COM3A1); + #endif +} + +} + +#ifdef PWM_AUDIO +void play_sample(uint8_t * s, uint16_t l, bool r) { + if (!inited) { + audio_init(); + } + + if (audio_config.enable) { + TIMSK3 &= ~_BV(OCIE3A); + stop_all_notes(); + place_int = 0; + sample = s; + sample_length = l; + repeat = r; + + TIMSK3 |= _BV(OCIE3A); + } +} +#endif + +//------------------------------------------------------------------------------ +// Override these functions in your keymap file to play different tunes on +// startup and bootloader jump +__attribute__ ((weak)) +void play_startup_tone() +{ +} + + + +__attribute__ ((weak)) +void play_goodbye_tone() +{ + +} +//------------------------------------------------------------------------------ diff --git a/quantum/audio/audio.h b/quantum/audio/audio.h new file mode 100644 index 000000000..d1ccfdb82 --- /dev/null +++ b/quantum/audio/audio.h @@ -0,0 +1,89 @@ +#include +#include +#include +#include +#include "musical_notes.h" +#include "song_list.h" +#include "voices.h" + +#ifndef AUDIO_H +#define AUDIO_H + +// Largely untested PWM audio mode (doesn't sound as good) +// #define PWM_AUDIO + +// #define VIBRATO_ENABLE + +// Enable vibrato strength/amplitude - slows down ISR too much +// #define VIBRATO_STRENGTH_ENABLE + +typedef union { + uint8_t raw; + struct { + bool enable :1; + uint8_t level :7; + }; +} audio_config_t; + +void audio_toggle(void); +void audio_on(void); +void audio_off(void); + +// Vibrato rate functions + +#ifdef VIBRATO_ENABLE + +void set_vibrato_rate(float rate); +void increase_vibrato_rate(float change); +void decrease_vibrato_rate(float change); + +#ifdef VIBRATO_STRENGTH_ENABLE + +void set_vibrato_strength(float strength); +void increase_vibrato_strength(float change); +void decrease_vibrato_strength(float change); + +#endif + +#endif + +// Polyphony functions + +void set_polyphony_rate(float rate); +void enable_polyphony(); +void disable_polyphony(); +void increase_polyphony_rate(float change); +void decrease_polyphony_rate(float change); + +void set_timbre(float timbre); +void set_tempo(float tempo); + +void increase_tempo(uint8_t tempo_change); +void decrease_tempo(uint8_t tempo_change); + +void audio_init(); + +#ifdef PWM_AUDIO +void play_sample(uint8_t * s, uint16_t l, bool r); +#endif +void play_note(float freq, int vol); +void stop_note(float freq); +void stop_all_notes(void); +void play_notes(float (*np)[][2], uint16_t n_count, bool n_repeat, float n_rest); + +#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), } + +// These macros are used to allow play_notes to play an array of indeterminate +// length. This works around the limitation of C's sizeof operation on pointers. +// The global float array for the song must be used here. +#define NOTE_ARRAY_SIZE(x) ((int16_t)(sizeof(x) / (sizeof(x[0])))) +#define PLAY_NOTE_ARRAY(note_array, note_repeat, note_rest_style) play_notes(¬e_array, NOTE_ARRAY_SIZE((note_array)), (note_repeat), (note_rest_style)); + +void play_goodbye_tone(void); +void play_startup_tone(void); + +#endif \ No newline at end of file diff --git a/quantum/audio/musical_notes.h b/quantum/audio/musical_notes.h new file mode 100644 index 000000000..b08d16a6f --- /dev/null +++ b/quantum/audio/musical_notes.h @@ -0,0 +1,217 @@ +#ifndef MUSICAL_NOTES_H +#define MUSICAL_NOTES_H + +// Tempo Placeholder +#define TEMPO_DEFAULT 100 + + +#define SONG(notes...) { notes } + + +// Note Types +#define MUSICAL_NOTE(note, duration) {(NOTE##note), duration} +#define WHOLE_NOTE(note) MUSICAL_NOTE(note, 64) +#define HALF_NOTE(note) MUSICAL_NOTE(note, 32) +#define QUARTER_NOTE(note) MUSICAL_NOTE(note, 16) +#define EIGHTH_NOTE(note) MUSICAL_NOTE(note, 8) +#define SIXTEENTH_NOTE(note) MUSICAL_NOTE(note, 4) + +#define WHOLE_DOT_NOTE(note) MUSICAL_NOTE(note, 64+32) +#define HALF_DOT_NOTE(note) MUSICAL_NOTE(note, 32+16) +#define QUARTER_DOT_NOTE(note) MUSICAL_NOTE(note, 16+8) +#define EIGHTH_DOT_NOTE(note) MUSICAL_NOTE(note, 8+4) +#define SIXTEENTH_DOT_NOTE(note) MUSICAL_NOTE(note, 4+2) + +// Note Type Shortcuts +#define M__NOTE(note, duration) MUSICAL_NOTE(note, duration) +#define W__NOTE(n) WHOLE_NOTE(n) +#define H__NOTE(n) HALF_NOTE(n) +#define Q__NOTE(n) QUARTER_NOTE(n) +#define E__NOTE(n) EIGHTH_NOTE(n) +#define S__NOTE(n) SIXTEENTH_NOTE(n) +#define WD_NOTE(n) WHOLE_DOT_NOTE(n) +#define HD_NOTE(n) HALF_DOT_NOTE(n) +#define QD_NOTE(n) QUARTER_DOT_NOTE(n) +#define ED_NOTE(n) EIGHTH_DOT_NOTE(n) +#define SD_NOTE(n) SIXTEENTH_DOT_NOTE(n) + +// Note Styles +// Staccato makes sure there is a rest between each note. Think: TA TA TA +// Legato makes notes flow together. Think: TAAA +#define STACCATO 0.01 +#define LEGATO 0 + +// Note Timbre +// Changes how the notes sound +#define TIMBRE_12 0.125 +#define TIMBRE_25 0.250 +#define TIMBRE_50 0.500 +#define TIMBRE_75 0.750 +#define TIMBRE_DEFAULT TIMBRE_50 + + +// Notes - # = Octave + +#define NOTE_REST 0.00 + +/* These notes are currently bugged +#define NOTE_C0 16.35 +#define NOTE_CS0 17.32 +#define NOTE_D0 18.35 +#define NOTE_DS0 19.45 +#define NOTE_E0 20.60 +#define NOTE_F0 21.83 +#define NOTE_FS0 23.12 +#define NOTE_G0 24.50 +#define NOTE_GS0 25.96 +#define NOTE_A0 27.50 +#define NOTE_AS0 29.14 +#define NOTE_B0 30.87 +#define NOTE_C1 32.70 +#define NOTE_CS1 34.65 +#define NOTE_D1 36.71 +#define NOTE_DS1 38.89 +#define NOTE_E1 41.20 +#define NOTE_F1 43.65 +#define NOTE_FS1 46.25 +#define NOTE_G1 49.00 +#define NOTE_GS1 51.91 +#define NOTE_A1 55.00 +#define NOTE_AS1 58.27 +*/ + +#define NOTE_B1 61.74 +#define NOTE_C2 65.41 +#define NOTE_CS2 69.30 +#define NOTE_D2 73.42 +#define NOTE_DS2 77.78 +#define NOTE_E2 82.41 +#define NOTE_F2 87.31 +#define NOTE_FS2 92.50 +#define NOTE_G2 98.00 +#define NOTE_GS2 103.83 +#define NOTE_A2 110.00 +#define NOTE_AS2 116.54 +#define NOTE_B2 123.47 +#define NOTE_C3 130.81 +#define NOTE_CS3 138.59 +#define NOTE_D3 146.83 +#define NOTE_DS3 155.56 +#define NOTE_E3 164.81 +#define NOTE_F3 174.61 +#define NOTE_FS3 185.00 +#define NOTE_G3 196.00 +#define NOTE_GS3 207.65 +#define NOTE_A3 220.00 +#define NOTE_AS3 233.08 +#define NOTE_B3 246.94 +#define NOTE_C4 261.63 +#define NOTE_CS4 277.18 +#define NOTE_D4 293.66 +#define NOTE_DS4 311.13 +#define NOTE_E4 329.63 +#define NOTE_F4 349.23 +#define NOTE_FS4 369.99 +#define NOTE_G4 392.00 +#define NOTE_GS4 415.30 +#define NOTE_A4 440.00 +#define NOTE_AS4 466.16 +#define NOTE_B4 493.88 +#define NOTE_C5 523.25 +#define NOTE_CS5 554.37 +#define NOTE_D5 587.33 +#define NOTE_DS5 622.25 +#define NOTE_E5 659.26 +#define NOTE_F5 698.46 +#define NOTE_FS5 739.99 +#define NOTE_G5 783.99 +#define NOTE_GS5 830.61 +#define NOTE_A5 880.00 +#define NOTE_AS5 932.33 +#define NOTE_B5 987.77 +#define NOTE_C6 1046.50 +#define NOTE_CS6 1108.73 +#define NOTE_D6 1174.66 +#define NOTE_DS6 1244.51 +#define NOTE_E6 1318.51 +#define NOTE_F6 1396.91 +#define NOTE_FS6 1479.98 +#define NOTE_G6 1567.98 +#define NOTE_GS6 1661.22 +#define NOTE_A6 1760.00 +#define NOTE_AS6 1864.66 +#define NOTE_B6 1975.53 +#define NOTE_C7 2093.00 +#define NOTE_CS7 2217.46 +#define NOTE_D7 2349.32 +#define NOTE_DS7 2489.02 +#define NOTE_E7 2637.02 +#define NOTE_F7 2793.83 +#define NOTE_FS7 2959.96 +#define NOTE_G7 3135.96 +#define NOTE_GS7 3322.44 +#define NOTE_A7 3520.00 +#define NOTE_AS7 3729.31 +#define NOTE_B7 3951.07 +#define NOTE_C8 4186.01 +#define NOTE_CS8 4434.92 +#define NOTE_D8 4698.64 +#define NOTE_DS8 4978.03 +#define NOTE_E8 5274.04 +#define NOTE_F8 5587.65 +#define NOTE_FS8 5919.91 +#define NOTE_G8 6271.93 +#define NOTE_GS8 6644.88 +#define NOTE_A8 7040.00 +#define NOTE_AS8 7458.62 +#define NOTE_B8 7902.13 + +// Flat Aliases +#define NOTE_DF0 NOTE_CS0 +#define NOTE_EF0 NOTE_DS0 +#define NOTE_GF0 NOTE_FS0 +#define NOTE_AF0 NOTE_GS0 +#define NOTE_BF0 NOTE_AS0 +#define NOTE_DF1 NOTE_CS1 +#define NOTE_EF1 NOTE_DS1 +#define NOTE_GF1 NOTE_FS1 +#define NOTE_AF1 NOTE_GS1 +#define NOTE_BF1 NOTE_AS1 +#define NOTE_DF2 NOTE_CS2 +#define NOTE_EF2 NOTE_DS2 +#define NOTE_GF2 NOTE_FS2 +#define NOTE_AF2 NOTE_GS2 +#define NOTE_BF2 NOTE_AS2 +#define NOTE_DF3 NOTE_CS3 +#define NOTE_EF3 NOTE_DS3 +#define NOTE_GF3 NOTE_FS3 +#define NOTE_AF3 NOTE_GS3 +#define NOTE_BF3 NOTE_AS3 +#define NOTE_DF4 NOTE_CS4 +#define NOTE_EF4 NOTE_DS4 +#define NOTE_GF4 NOTE_FS4 +#define NOTE_AF4 NOTE_GS4 +#define NOTE_BF4 NOTE_AS4 +#define NOTE_DF5 NOTE_CS5 +#define NOTE_EF5 NOTE_DS5 +#define NOTE_GF5 NOTE_FS5 +#define NOTE_AF5 NOTE_GS5 +#define NOTE_BF5 NOTE_AS5 +#define NOTE_DF6 NOTE_CS6 +#define NOTE_EF6 NOTE_DS6 +#define NOTE_GF6 NOTE_FS6 +#define NOTE_AF6 NOTE_GS6 +#define NOTE_BF6 NOTE_AS6 +#define NOTE_DF7 NOTE_CS7 +#define NOTE_EF7 NOTE_DS7 +#define NOTE_GF7 NOTE_FS7 +#define NOTE_AF7 NOTE_GS7 +#define NOTE_BF7 NOTE_AS7 +#define NOTE_DF8 NOTE_CS8 +#define NOTE_EF8 NOTE_DS8 +#define NOTE_GF8 NOTE_FS8 +#define NOTE_AF8 NOTE_GS8 +#define NOTE_BF8 NOTE_AS8 + + +#endif \ No newline at end of file diff --git a/quantum/audio/song_list.h b/quantum/audio/song_list.h new file mode 100644 index 000000000..fc6fcdeef --- /dev/null +++ b/quantum/audio/song_list.h @@ -0,0 +1,117 @@ +#include "musical_notes.h" + +#ifndef SONG_LIST_H +#define SONG_LIST_H + +#define ODE_TO_JOY \ + Q__NOTE(_E4), Q__NOTE(_E4), Q__NOTE(_F4), Q__NOTE(_G4), \ + Q__NOTE(_G4), Q__NOTE(_F4), Q__NOTE(_E4), Q__NOTE(_D4), \ + Q__NOTE(_C4), Q__NOTE(_C4), Q__NOTE(_D4), Q__NOTE(_E4), \ + QD_NOTE(_E4), E__NOTE(_D4), H__NOTE(_D4), + +#define ROCK_A_BYE_BABY \ + QD_NOTE(_B4), E__NOTE(_D4), Q__NOTE(_B5), \ + H__NOTE(_A5), Q__NOTE(_G5), \ + QD_NOTE(_B4), E__NOTE(_D5), Q__NOTE(_G5), \ + H__NOTE(_FS5), + +#define CLOSE_ENCOUNTERS_5_NOTE \ + Q__NOTE(_D5), \ + Q__NOTE(_E5), \ + Q__NOTE(_C5), \ + Q__NOTE(_C4), \ + Q__NOTE(_G4), + +#define DOE_A_DEER \ + QD_NOTE(_C4), E__NOTE(_D4), \ + QD_NOTE(_E4), E__NOTE(_C4), \ + Q__NOTE(_E4), Q__NOTE(_C4), \ + Q__NOTE(_E4), + +#define GOODBYE_SOUND \ + E__NOTE(_E7), \ + E__NOTE(_A6), \ + ED_NOTE(_E6), + +#define STARTUP_SOUND \ + ED_NOTE(_E7 ), \ + E__NOTE(_CS7), \ + E__NOTE(_E6 ), \ + E__NOTE(_A6 ), \ + M__NOTE(_CS7, 20), + +#define QWERTY_SOUND \ + E__NOTE(_GS6 ), \ + E__NOTE(_A6 ), \ + S__NOTE(_REST), \ + Q__NOTE(_E7 ), + +#define COLEMAK_SOUND \ + E__NOTE(_GS6 ), \ + E__NOTE(_A6 ), \ + S__NOTE(_REST), \ + ED_NOTE(_E7 ), \ + S__NOTE(_REST), \ + ED_NOTE(_GS7 ), + +#define DVORAK_SOUND \ + E__NOTE(_GS6 ), \ + E__NOTE(_A6 ), \ + S__NOTE(_REST), \ + E__NOTE(_E7 ), \ + S__NOTE(_REST), \ + E__NOTE(_FS7 ), \ + S__NOTE(_REST), \ + E__NOTE(_E7 ), + +#define PLOVER_SOUND \ + E__NOTE(_GS6 ), \ + E__NOTE(_A6 ), \ + S__NOTE(_REST), \ + ED_NOTE(_E7 ), \ + S__NOTE(_REST), \ + ED_NOTE(_A7 ), + +#define PLOVER_GOODBYE_SOUND \ + E__NOTE(_GS6 ), \ + E__NOTE(_A6 ), \ + S__NOTE(_REST), \ + ED_NOTE(_A7 ), \ + S__NOTE(_REST), \ + ED_NOTE(_E7 ), + +#define MUSIC_SCALE_SOUND \ + E__NOTE(_A5 ), \ + E__NOTE(_B5 ), \ + E__NOTE(_CS6), \ + E__NOTE(_D6 ), \ + E__NOTE(_E6 ), \ + E__NOTE(_FS6), \ + E__NOTE(_GS6), \ + E__NOTE(_A6 ), + +#define CAPS_LOCK_ON_SOUND \ + E__NOTE(_A3), \ + E__NOTE(_B3), + +#define CAPS_LOCK_OFF_SOUND \ + E__NOTE(_B3), \ + E__NOTE(_A3), + +#define SCROLL_LOCK_ON_SOUND \ + E__NOTE(_D4), \ + E__NOTE(_E4), + +#define SCROLL_LOCK_OFF_SOUND \ + E__NOTE(_E4), \ + E__NOTE(_D4), + +#define NUM_LOCK_ON_SOUND \ + E__NOTE(_D5), \ + E__NOTE(_E5), + +#define NUM_LOCK_OFF_SOUND \ + E__NOTE(_E5), \ + E__NOTE(_D5), + +#endif diff --git a/quantum/audio/vibrato_lut.h b/quantum/audio/vibrato_lut.h new file mode 100644 index 000000000..a2b1f3e5c --- /dev/null +++ b/quantum/audio/vibrato_lut.h @@ -0,0 +1,28 @@ +#include +#include +#include + +#define VIBRATO_LUT_LENGTH 20 + +const float VIBRATO_LUT[VIBRATO_LUT_LENGTH] = { \ +1.00223368114872, +1.00425299436105, +1.00585842560279, +1.00689052852052, +1.0072464122237, +1.00689052852052, +1.00585842560279, +1.00425299436105, +1.00223368114872, +1, +0.99777129706302, +0.99576501699778, +0.994175695650927, +0.993156625943589, +0.992805720491269, +0.993156625943589, +0.994175695650927, +0.99576501699778, +0.99777129706302, +1 +}; \ No newline at end of file diff --git a/quantum/audio/voices.c b/quantum/audio/voices.c new file mode 100644 index 000000000..30e8be641 --- /dev/null +++ b/quantum/audio/voices.c @@ -0,0 +1,60 @@ +#include "voices.h" + +extern uint16_t envelope_index; +extern float note_timbre; + +voice_type voice = default_voice; + +void set_voice(voice_type v) { + voice = v; +} + +float voice_envelope(float frequency) { + // envelope_index ranges from 0 to 0xFFFF, which is preserved at 880.0 Hz + uint16_t compensated_index = (uint16_t)((float)envelope_index * (880.0 / frequency)); + + switch (voice) { + case default_voice: + // nothing here on purpose + break; + case butts_fader: + switch (compensated_index) { + case 0 ... 9: + frequency = frequency / 4; + note_timbre = TIMBRE_12; + break; + case 10 ... 19: + frequency = frequency / 2; + note_timbre = TIMBRE_12; + break; + case 20 ... 200: + note_timbre = .125 - pow(((float)compensated_index - 20) / (200 - 20), 2)*.125; + break; + default: + note_timbre = 0; + break; + } + break; + case octave_crunch: + switch (compensated_index) { + case 0 ... 9: + case 20 ... 24: + case 30 ... 32: + frequency = frequency / 2; + note_timbre = TIMBRE_12; + break; + case 10 ... 19: + case 25 ... 29: + case 33 ... 35: + frequency = frequency * 2; + note_timbre = TIMBRE_12; + break; + default: + note_timbre = TIMBRE_12; + break; + } + break; + } + + return frequency; +} \ No newline at end of file diff --git a/quantum/audio/voices.h b/quantum/audio/voices.h new file mode 100644 index 000000000..32135dac7 --- /dev/null +++ b/quantum/audio/voices.h @@ -0,0 +1,21 @@ +#include +#include +#include +#include +#include "musical_notes.h" +#include "song_list.h" + +#ifndef VOICES_H +#define VOICES_H + +float voice_envelope(float frequency); + +typedef enum { + default_voice, + butts_fader, + octave_crunch +} voice_type; + +void set_voice(voice_type v); + +#endif \ No newline at end of file diff --git a/quantum/audio/wave.h b/quantum/audio/wave.h new file mode 100644 index 000000000..6ebc34851 --- /dev/null +++ b/quantum/audio/wave.h @@ -0,0 +1,265 @@ +#include +#include +#include + +#define SINE_LENGTH 2048 + +const uint8_t sinewave[] PROGMEM= //2048 values +{ +0x80,0x80,0x80,0x81,0x81,0x81,0x82,0x82, +0x83,0x83,0x83,0x84,0x84,0x85,0x85,0x85, +0x86,0x86,0x87,0x87,0x87,0x88,0x88,0x88, +0x89,0x89,0x8a,0x8a,0x8a,0x8b,0x8b,0x8c, +0x8c,0x8c,0x8d,0x8d,0x8e,0x8e,0x8e,0x8f, +0x8f,0x8f,0x90,0x90,0x91,0x91,0x91,0x92, +0x92,0x93,0x93,0x93,0x94,0x94,0x95,0x95, +0x95,0x96,0x96,0x96,0x97,0x97,0x98,0x98, +0x98,0x99,0x99,0x9a,0x9a,0x9a,0x9b,0x9b, +0x9b,0x9c,0x9c,0x9d,0x9d,0x9d,0x9e,0x9e, +0x9e,0x9f,0x9f,0xa0,0xa0,0xa0,0xa1,0xa1, +0xa2,0xa2,0xa2,0xa3,0xa3,0xa3,0xa4,0xa4, +0xa5,0xa5,0xa5,0xa6,0xa6,0xa6,0xa7,0xa7, +0xa7,0xa8,0xa8,0xa9,0xa9,0xa9,0xaa,0xaa, +0xaa,0xab,0xab,0xac,0xac,0xac,0xad,0xad, +0xad,0xae,0xae,0xae,0xaf,0xaf,0xb0,0xb0, +0xb0,0xb1,0xb1,0xb1,0xb2,0xb2,0xb2,0xb3, +0xb3,0xb4,0xb4,0xb4,0xb5,0xb5,0xb5,0xb6, +0xb6,0xb6,0xb7,0xb7,0xb7,0xb8,0xb8,0xb8, +0xb9,0xb9,0xba,0xba,0xba,0xbb,0xbb,0xbb, +0xbc,0xbc,0xbc,0xbd,0xbd,0xbd,0xbe,0xbe, +0xbe,0xbf,0xbf,0xbf,0xc0,0xc0,0xc0,0xc1, +0xc1,0xc1,0xc2,0xc2,0xc2,0xc3,0xc3,0xc3, +0xc4,0xc4,0xc4,0xc5,0xc5,0xc5,0xc6,0xc6, +0xc6,0xc7,0xc7,0xc7,0xc8,0xc8,0xc8,0xc9, +0xc9,0xc9,0xca,0xca,0xca,0xcb,0xcb,0xcb, +0xcb,0xcc,0xcc,0xcc,0xcd,0xcd,0xcd,0xce, +0xce,0xce,0xcf,0xcf,0xcf,0xcf,0xd0,0xd0, +0xd0,0xd1,0xd1,0xd1,0xd2,0xd2,0xd2,0xd2, +0xd3,0xd3,0xd3,0xd4,0xd4,0xd4,0xd5,0xd5, +0xd5,0xd5,0xd6,0xd6,0xd6,0xd7,0xd7,0xd7, +0xd7,0xd8,0xd8,0xd8,0xd9,0xd9,0xd9,0xd9, +0xda,0xda,0xda,0xda,0xdb,0xdb,0xdb,0xdc, +0xdc,0xdc,0xdc,0xdd,0xdd,0xdd,0xdd,0xde, +0xde,0xde,0xde,0xdf,0xdf,0xdf,0xe0,0xe0, +0xe0,0xe0,0xe1,0xe1,0xe1,0xe1,0xe2,0xe2, +0xe2,0xe2,0xe3,0xe3,0xe3,0xe3,0xe4,0xe4, +0xe4,0xe4,0xe4,0xe5,0xe5,0xe5,0xe5,0xe6, +0xe6,0xe6,0xe6,0xe7,0xe7,0xe7,0xe7,0xe8, +0xe8,0xe8,0xe8,0xe8,0xe9,0xe9,0xe9,0xe9, +0xea,0xea,0xea,0xea,0xea,0xeb,0xeb,0xeb, +0xeb,0xeb,0xec,0xec,0xec,0xec,0xec,0xed, +0xed,0xed,0xed,0xed,0xee,0xee,0xee,0xee, +0xee,0xef,0xef,0xef,0xef,0xef,0xf0,0xf0, +0xf0,0xf0,0xf0,0xf0,0xf1,0xf1,0xf1,0xf1, +0xf1,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf3, +0xf3,0xf3,0xf3,0xf3,0xf3,0xf4,0xf4,0xf4, +0xf4,0xf4,0xf4,0xf5,0xf5,0xf5,0xf5,0xf5, +0xf5,0xf5,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6, +0xf6,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7, +0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8, +0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9, +0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa, +0xfa,0xfa,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb, +0xfb,0xfb,0xfb,0xfb,0xfc,0xfc,0xfc,0xfc, +0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc, +0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd, +0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfe,0xfe, +0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe, +0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe, +0xfe,0xfe,0xfe,0xfe,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xfe,0xfe,0xfe, +0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe, +0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe, +0xfe,0xfe,0xfe,0xfd,0xfd,0xfd,0xfd,0xfd, +0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd, +0xfd,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc, +0xfc,0xfc,0xfc,0xfc,0xfc,0xfb,0xfb,0xfb, +0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfa, +0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa, +0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9, +0xf9,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8, +0xf8,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7, +0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf5, +0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf4,0xf4, +0xf4,0xf4,0xf4,0xf4,0xf3,0xf3,0xf3,0xf3, +0xf3,0xf3,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2, +0xf1,0xf1,0xf1,0xf1,0xf1,0xf0,0xf0,0xf0, +0xf0,0xf0,0xf0,0xef,0xef,0xef,0xef,0xef, +0xee,0xee,0xee,0xee,0xee,0xed,0xed,0xed, +0xed,0xed,0xec,0xec,0xec,0xec,0xec,0xeb, +0xeb,0xeb,0xeb,0xeb,0xea,0xea,0xea,0xea, +0xea,0xe9,0xe9,0xe9,0xe9,0xe8,0xe8,0xe8, +0xe8,0xe8,0xe7,0xe7,0xe7,0xe7,0xe6,0xe6, +0xe6,0xe6,0xe5,0xe5,0xe5,0xe5,0xe4,0xe4, +0xe4,0xe4,0xe4,0xe3,0xe3,0xe3,0xe3,0xe2, +0xe2,0xe2,0xe2,0xe1,0xe1,0xe1,0xe1,0xe0, +0xe0,0xe0,0xe0,0xdf,0xdf,0xdf,0xde,0xde, +0xde,0xde,0xdd,0xdd,0xdd,0xdd,0xdc,0xdc, +0xdc,0xdc,0xdb,0xdb,0xdb,0xda,0xda,0xda, +0xda,0xd9,0xd9,0xd9,0xd9,0xd8,0xd8,0xd8, +0xd7,0xd7,0xd7,0xd7,0xd6,0xd6,0xd6,0xd5, +0xd5,0xd5,0xd5,0xd4,0xd4,0xd4,0xd3,0xd3, +0xd3,0xd2,0xd2,0xd2,0xd2,0xd1,0xd1,0xd1, +0xd0,0xd0,0xd0,0xcf,0xcf,0xcf,0xcf,0xce, +0xce,0xce,0xcd,0xcd,0xcd,0xcc,0xcc,0xcc, +0xcb,0xcb,0xcb,0xcb,0xca,0xca,0xca,0xc9, +0xc9,0xc9,0xc8,0xc8,0xc8,0xc7,0xc7,0xc7, +0xc6,0xc6,0xc6,0xc5,0xc5,0xc5,0xc4,0xc4, +0xc4,0xc3,0xc3,0xc3,0xc2,0xc2,0xc2,0xc1, +0xc1,0xc1,0xc0,0xc0,0xc0,0xbf,0xbf,0xbf, +0xbe,0xbe,0xbe,0xbd,0xbd,0xbd,0xbc,0xbc, +0xbc,0xbb,0xbb,0xbb,0xba,0xba,0xba,0xb9, +0xb9,0xb8,0xb8,0xb8,0xb7,0xb7,0xb7,0xb6, +0xb6,0xb6,0xb5,0xb5,0xb5,0xb4,0xb4,0xb4, +0xb3,0xb3,0xb2,0xb2,0xb2,0xb1,0xb1,0xb1, +0xb0,0xb0,0xb0,0xaf,0xaf,0xae,0xae,0xae, +0xad,0xad,0xad,0xac,0xac,0xac,0xab,0xab, +0xaa,0xaa,0xaa,0xa9,0xa9,0xa9,0xa8,0xa8, +0xa7,0xa7,0xa7,0xa6,0xa6,0xa6,0xa5,0xa5, +0xa5,0xa4,0xa4,0xa3,0xa3,0xa3,0xa2,0xa2, +0xa2,0xa1,0xa1,0xa0,0xa0,0xa0,0x9f,0x9f, +0x9e,0x9e,0x9e,0x9d,0x9d,0x9d,0x9c,0x9c, +0x9b,0x9b,0x9b,0x9a,0x9a,0x9a,0x99,0x99, +0x98,0x98,0x98,0x97,0x97,0x96,0x96,0x96, +0x95,0x95,0x95,0x94,0x94,0x93,0x93,0x93, +0x92,0x92,0x91,0x91,0x91,0x90,0x90,0x8f, +0x8f,0x8f,0x8e,0x8e,0x8e,0x8d,0x8d,0x8c, +0x8c,0x8c,0x8b,0x8b,0x8a,0x8a,0x8a,0x89, +0x89,0x88,0x88,0x88,0x87,0x87,0x87,0x86, +0x86,0x85,0x85,0x85,0x84,0x84,0x83,0x83, +0x83,0x82,0x82,0x81,0x81,0x81,0x80,0x80, +0x80,0x7f,0x7f,0x7e,0x7e,0x7e,0x7d,0x7d, +0x7c,0x7c,0x7c,0x7b,0x7b,0x7a,0x7a,0x7a, +0x79,0x79,0x78,0x78,0x78,0x77,0x77,0x77, +0x76,0x76,0x75,0x75,0x75,0x74,0x74,0x73, +0x73,0x73,0x72,0x72,0x71,0x71,0x71,0x70, +0x70,0x70,0x6f,0x6f,0x6e,0x6e,0x6e,0x6d, +0x6d,0x6c,0x6c,0x6c,0x6b,0x6b,0x6a,0x6a, +0x6a,0x69,0x69,0x69,0x68,0x68,0x67,0x67, +0x67,0x66,0x66,0x65,0x65,0x65,0x64,0x64, +0x64,0x63,0x63,0x62,0x62,0x62,0x61,0x61, +0x61,0x60,0x60,0x5f,0x5f,0x5f,0x5e,0x5e, +0x5d,0x5d,0x5d,0x5c,0x5c,0x5c,0x5b,0x5b, +0x5a,0x5a,0x5a,0x59,0x59,0x59,0x58,0x58, +0x58,0x57,0x57,0x56,0x56,0x56,0x55,0x55, +0x55,0x54,0x54,0x53,0x53,0x53,0x52,0x52, +0x52,0x51,0x51,0x51,0x50,0x50,0x4f,0x4f, +0x4f,0x4e,0x4e,0x4e,0x4d,0x4d,0x4d,0x4c, +0x4c,0x4b,0x4b,0x4b,0x4a,0x4a,0x4a,0x49, +0x49,0x49,0x48,0x48,0x48,0x47,0x47,0x47, +0x46,0x46,0x45,0x45,0x45,0x44,0x44,0x44, +0x43,0x43,0x43,0x42,0x42,0x42,0x41,0x41, +0x41,0x40,0x40,0x40,0x3f,0x3f,0x3f,0x3e, +0x3e,0x3e,0x3d,0x3d,0x3d,0x3c,0x3c,0x3c, +0x3b,0x3b,0x3b,0x3a,0x3a,0x3a,0x39,0x39, +0x39,0x38,0x38,0x38,0x37,0x37,0x37,0x36, +0x36,0x36,0x35,0x35,0x35,0x34,0x34,0x34, +0x34,0x33,0x33,0x33,0x32,0x32,0x32,0x31, +0x31,0x31,0x30,0x30,0x30,0x30,0x2f,0x2f, +0x2f,0x2e,0x2e,0x2e,0x2d,0x2d,0x2d,0x2d, +0x2c,0x2c,0x2c,0x2b,0x2b,0x2b,0x2a,0x2a, +0x2a,0x2a,0x29,0x29,0x29,0x28,0x28,0x28, +0x28,0x27,0x27,0x27,0x26,0x26,0x26,0x26, +0x25,0x25,0x25,0x25,0x24,0x24,0x24,0x23, +0x23,0x23,0x23,0x22,0x22,0x22,0x22,0x21, +0x21,0x21,0x21,0x20,0x20,0x20,0x1f,0x1f, +0x1f,0x1f,0x1e,0x1e,0x1e,0x1e,0x1d,0x1d, +0x1d,0x1d,0x1c,0x1c,0x1c,0x1c,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1a,0x1a,0x1a,0x1a,0x19, +0x19,0x19,0x19,0x18,0x18,0x18,0x18,0x17, +0x17,0x17,0x17,0x17,0x16,0x16,0x16,0x16, +0x15,0x15,0x15,0x15,0x15,0x14,0x14,0x14, +0x14,0x14,0x13,0x13,0x13,0x13,0x13,0x12, +0x12,0x12,0x12,0x12,0x11,0x11,0x11,0x11, +0x11,0x10,0x10,0x10,0x10,0x10,0xf,0xf, +0xf,0xf,0xf,0xf,0xe,0xe,0xe,0xe, +0xe,0xd,0xd,0xd,0xd,0xd,0xd,0xc, +0xc,0xc,0xc,0xc,0xc,0xb,0xb,0xb, +0xb,0xb,0xb,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0x9,0x9,0x9,0x9,0x9,0x9, +0x9,0x8,0x8,0x8,0x8,0x8,0x8,0x8, +0x7,0x7,0x7,0x7,0x7,0x7,0x7,0x7, +0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x6, +0x5,0x5,0x5,0x5,0x5,0x5,0x5,0x5, +0x5,0x5,0x4,0x4,0x4,0x4,0x4,0x4, +0x4,0x4,0x4,0x4,0x3,0x3,0x3,0x3, +0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3, +0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2, +0x2,0x2,0x2,0x2,0x2,0x2,0x1,0x1, +0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1, +0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1, +0x1,0x1,0x1,0x1,0x0,0x0,0x0,0x0, +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, +0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x1, +0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1, +0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1, +0x1,0x1,0x1,0x2,0x2,0x2,0x2,0x2, +0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2, +0x2,0x3,0x3,0x3,0x3,0x3,0x3,0x3, +0x3,0x3,0x3,0x3,0x3,0x4,0x4,0x4, +0x4,0x4,0x4,0x4,0x4,0x4,0x4,0x5, +0x5,0x5,0x5,0x5,0x5,0x5,0x5,0x5, +0x5,0x6,0x6,0x6,0x6,0x6,0x6,0x6, +0x6,0x7,0x7,0x7,0x7,0x7,0x7,0x7, +0x7,0x8,0x8,0x8,0x8,0x8,0x8,0x8, +0x9,0x9,0x9,0x9,0x9,0x9,0x9,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xb,0xb, +0xb,0xb,0xb,0xb,0xc,0xc,0xc,0xc, +0xc,0xc,0xd,0xd,0xd,0xd,0xd,0xd, +0xe,0xe,0xe,0xe,0xe,0xf,0xf,0xf, +0xf,0xf,0xf,0x10,0x10,0x10,0x10,0x10, +0x11,0x11,0x11,0x11,0x11,0x12,0x12,0x12, +0x12,0x12,0x13,0x13,0x13,0x13,0x13,0x14, +0x14,0x14,0x14,0x14,0x15,0x15,0x15,0x15, +0x15,0x16,0x16,0x16,0x16,0x17,0x17,0x17, +0x17,0x17,0x18,0x18,0x18,0x18,0x19,0x19, +0x19,0x19,0x1a,0x1a,0x1a,0x1a,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1c,0x1c,0x1c,0x1c,0x1d, +0x1d,0x1d,0x1d,0x1e,0x1e,0x1e,0x1e,0x1f, +0x1f,0x1f,0x1f,0x20,0x20,0x20,0x21,0x21, +0x21,0x21,0x22,0x22,0x22,0x22,0x23,0x23, +0x23,0x23,0x24,0x24,0x24,0x25,0x25,0x25, +0x25,0x26,0x26,0x26,0x26,0x27,0x27,0x27, +0x28,0x28,0x28,0x28,0x29,0x29,0x29,0x2a, +0x2a,0x2a,0x2a,0x2b,0x2b,0x2b,0x2c,0x2c, +0x2c,0x2d,0x2d,0x2d,0x2d,0x2e,0x2e,0x2e, +0x2f,0x2f,0x2f,0x30,0x30,0x30,0x30,0x31, +0x31,0x31,0x32,0x32,0x32,0x33,0x33,0x33, +0x34,0x34,0x34,0x34,0x35,0x35,0x35,0x36, +0x36,0x36,0x37,0x37,0x37,0x38,0x38,0x38, +0x39,0x39,0x39,0x3a,0x3a,0x3a,0x3b,0x3b, +0x3b,0x3c,0x3c,0x3c,0x3d,0x3d,0x3d,0x3e, +0x3e,0x3e,0x3f,0x3f,0x3f,0x40,0x40,0x40, +0x41,0x41,0x41,0x42,0x42,0x42,0x43,0x43, +0x43,0x44,0x44,0x44,0x45,0x45,0x45,0x46, +0x46,0x47,0x47,0x47,0x48,0x48,0x48,0x49, +0x49,0x49,0x4a,0x4a,0x4a,0x4b,0x4b,0x4b, +0x4c,0x4c,0x4d,0x4d,0x4d,0x4e,0x4e,0x4e, +0x4f,0x4f,0x4f,0x50,0x50,0x51,0x51,0x51, +0x52,0x52,0x52,0x53,0x53,0x53,0x54,0x54, +0x55,0x55,0x55,0x56,0x56,0x56,0x57,0x57, +0x58,0x58,0x58,0x59,0x59,0x59,0x5a,0x5a, +0x5a,0x5b,0x5b,0x5c,0x5c,0x5c,0x5d,0x5d, +0x5d,0x5e,0x5e,0x5f,0x5f,0x5f,0x60,0x60, +0x61,0x61,0x61,0x62,0x62,0x62,0x63,0x63, +0x64,0x64,0x64,0x65,0x65,0x65,0x66,0x66, +0x67,0x67,0x67,0x68,0x68,0x69,0x69,0x69, +0x6a,0x6a,0x6a,0x6b,0x6b,0x6c,0x6c,0x6c, +0x6d,0x6d,0x6e,0x6e,0x6e,0x6f,0x6f,0x70, +0x70,0x70,0x71,0x71,0x71,0x72,0x72,0x73, +0x73,0x73,0x74,0x74,0x75,0x75,0x75,0x76, +0x76,0x77,0x77,0x77,0x78,0x78,0x78,0x79, +0x79,0x7a,0x7a,0x7a,0x7b,0x7b,0x7c,0x7c, +0x7c,0x7d,0x7d,0x7e,0x7e,0x7e,0x7f,0x7f +}; \ No newline at end of file diff --git a/quantum/musical_notes.h b/quantum/musical_notes.h deleted file mode 100644 index b08d16a6f..000000000 --- a/quantum/musical_notes.h +++ /dev/null @@ -1,217 +0,0 @@ -#ifndef MUSICAL_NOTES_H -#define MUSICAL_NOTES_H - -// Tempo Placeholder -#define TEMPO_DEFAULT 100 - - -#define SONG(notes...) { notes } - - -// Note Types -#define MUSICAL_NOTE(note, duration) {(NOTE##note), duration} -#define WHOLE_NOTE(note) MUSICAL_NOTE(note, 64) -#define HALF_NOTE(note) MUSICAL_NOTE(note, 32) -#define QUARTER_NOTE(note) MUSICAL_NOTE(note, 16) -#define EIGHTH_NOTE(note) MUSICAL_NOTE(note, 8) -#define SIXTEENTH_NOTE(note) MUSICAL_NOTE(note, 4) - -#define WHOLE_DOT_NOTE(note) MUSICAL_NOTE(note, 64+32) -#define HALF_DOT_NOTE(note) MUSICAL_NOTE(note, 32+16) -#define QUARTER_DOT_NOTE(note) MUSICAL_NOTE(note, 16+8) -#define EIGHTH_DOT_NOTE(note) MUSICAL_NOTE(note, 8+4) -#define SIXTEENTH_DOT_NOTE(note) MUSICAL_NOTE(note, 4+2) - -// Note Type Shortcuts -#define M__NOTE(note, duration) MUSICAL_NOTE(note, duration) -#define W__NOTE(n) WHOLE_NOTE(n) -#define H__NOTE(n) HALF_NOTE(n) -#define Q__NOTE(n) QUARTER_NOTE(n) -#define E__NOTE(n) EIGHTH_NOTE(n) -#define S__NOTE(n) SIXTEENTH_NOTE(n) -#define WD_NOTE(n) WHOLE_DOT_NOTE(n) -#define HD_NOTE(n) HALF_DOT_NOTE(n) -#define QD_NOTE(n) QUARTER_DOT_NOTE(n) -#define ED_NOTE(n) EIGHTH_DOT_NOTE(n) -#define SD_NOTE(n) SIXTEENTH_DOT_NOTE(n) - -// Note Styles -// Staccato makes sure there is a rest between each note. Think: TA TA TA -// Legato makes notes flow together. Think: TAAA -#define STACCATO 0.01 -#define LEGATO 0 - -// Note Timbre -// Changes how the notes sound -#define TIMBRE_12 0.125 -#define TIMBRE_25 0.250 -#define TIMBRE_50 0.500 -#define TIMBRE_75 0.750 -#define TIMBRE_DEFAULT TIMBRE_50 - - -// Notes - # = Octave - -#define NOTE_REST 0.00 - -/* These notes are currently bugged -#define NOTE_C0 16.35 -#define NOTE_CS0 17.32 -#define NOTE_D0 18.35 -#define NOTE_DS0 19.45 -#define NOTE_E0 20.60 -#define NOTE_F0 21.83 -#define NOTE_FS0 23.12 -#define NOTE_G0 24.50 -#define NOTE_GS0 25.96 -#define NOTE_A0 27.50 -#define NOTE_AS0 29.14 -#define NOTE_B0 30.87 -#define NOTE_C1 32.70 -#define NOTE_CS1 34.65 -#define NOTE_D1 36.71 -#define NOTE_DS1 38.89 -#define NOTE_E1 41.20 -#define NOTE_F1 43.65 -#define NOTE_FS1 46.25 -#define NOTE_G1 49.00 -#define NOTE_GS1 51.91 -#define NOTE_A1 55.00 -#define NOTE_AS1 58.27 -*/ - -#define NOTE_B1 61.74 -#define NOTE_C2 65.41 -#define NOTE_CS2 69.30 -#define NOTE_D2 73.42 -#define NOTE_DS2 77.78 -#define NOTE_E2 82.41 -#define NOTE_F2 87.31 -#define NOTE_FS2 92.50 -#define NOTE_G2 98.00 -#define NOTE_GS2 103.83 -#define NOTE_A2 110.00 -#define NOTE_AS2 116.54 -#define NOTE_B2 123.47 -#define NOTE_C3 130.81 -#define NOTE_CS3 138.59 -#define NOTE_D3 146.83 -#define NOTE_DS3 155.56 -#define NOTE_E3 164.81 -#define NOTE_F3 174.61 -#define NOTE_FS3 185.00 -#define NOTE_G3 196.00 -#define NOTE_GS3 207.65 -#define NOTE_A3 220.00 -#define NOTE_AS3 233.08 -#define NOTE_B3 246.94 -#define NOTE_C4 261.63 -#define NOTE_CS4 277.18 -#define NOTE_D4 293.66 -#define NOTE_DS4 311.13 -#define NOTE_E4 329.63 -#define NOTE_F4 349.23 -#define NOTE_FS4 369.99 -#define NOTE_G4 392.00 -#define NOTE_GS4 415.30 -#define NOTE_A4 440.00 -#define NOTE_AS4 466.16 -#define NOTE_B4 493.88 -#define NOTE_C5 523.25 -#define NOTE_CS5 554.37 -#define NOTE_D5 587.33 -#define NOTE_DS5 622.25 -#define NOTE_E5 659.26 -#define NOTE_F5 698.46 -#define NOTE_FS5 739.99 -#define NOTE_G5 783.99 -#define NOTE_GS5 830.61 -#define NOTE_A5 880.00 -#define NOTE_AS5 932.33 -#define NOTE_B5 987.77 -#define NOTE_C6 1046.50 -#define NOTE_CS6 1108.73 -#define NOTE_D6 1174.66 -#define NOTE_DS6 1244.51 -#define NOTE_E6 1318.51 -#define NOTE_F6 1396.91 -#define NOTE_FS6 1479.98 -#define NOTE_G6 1567.98 -#define NOTE_GS6 1661.22 -#define NOTE_A6 1760.00 -#define NOTE_AS6 1864.66 -#define NOTE_B6 1975.53 -#define NOTE_C7 2093.00 -#define NOTE_CS7 2217.46 -#define NOTE_D7 2349.32 -#define NOTE_DS7 2489.02 -#define NOTE_E7 2637.02 -#define NOTE_F7 2793.83 -#define NOTE_FS7 2959.96 -#define NOTE_G7 3135.96 -#define NOTE_GS7 3322.44 -#define NOTE_A7 3520.00 -#define NOTE_AS7 3729.31 -#define NOTE_B7 3951.07 -#define NOTE_C8 4186.01 -#define NOTE_CS8 4434.92 -#define NOTE_D8 4698.64 -#define NOTE_DS8 4978.03 -#define NOTE_E8 5274.04 -#define NOTE_F8 5587.65 -#define NOTE_FS8 5919.91 -#define NOTE_G8 6271.93 -#define NOTE_GS8 6644.88 -#define NOTE_A8 7040.00 -#define NOTE_AS8 7458.62 -#define NOTE_B8 7902.13 - -// Flat Aliases -#define NOTE_DF0 NOTE_CS0 -#define NOTE_EF0 NOTE_DS0 -#define NOTE_GF0 NOTE_FS0 -#define NOTE_AF0 NOTE_GS0 -#define NOTE_BF0 NOTE_AS0 -#define NOTE_DF1 NOTE_CS1 -#define NOTE_EF1 NOTE_DS1 -#define NOTE_GF1 NOTE_FS1 -#define NOTE_AF1 NOTE_GS1 -#define NOTE_BF1 NOTE_AS1 -#define NOTE_DF2 NOTE_CS2 -#define NOTE_EF2 NOTE_DS2 -#define NOTE_GF2 NOTE_FS2 -#define NOTE_AF2 NOTE_GS2 -#define NOTE_BF2 NOTE_AS2 -#define NOTE_DF3 NOTE_CS3 -#define NOTE_EF3 NOTE_DS3 -#define NOTE_GF3 NOTE_FS3 -#define NOTE_AF3 NOTE_GS3 -#define NOTE_BF3 NOTE_AS3 -#define NOTE_DF4 NOTE_CS4 -#define NOTE_EF4 NOTE_DS4 -#define NOTE_GF4 NOTE_FS4 -#define NOTE_AF4 NOTE_GS4 -#define NOTE_BF4 NOTE_AS4 -#define NOTE_DF5 NOTE_CS5 -#define NOTE_EF5 NOTE_DS5 -#define NOTE_GF5 NOTE_FS5 -#define NOTE_AF5 NOTE_GS5 -#define NOTE_BF5 NOTE_AS5 -#define NOTE_DF6 NOTE_CS6 -#define NOTE_EF6 NOTE_DS6 -#define NOTE_GF6 NOTE_FS6 -#define NOTE_AF6 NOTE_GS6 -#define NOTE_BF6 NOTE_AS6 -#define NOTE_DF7 NOTE_CS7 -#define NOTE_EF7 NOTE_DS7 -#define NOTE_GF7 NOTE_FS7 -#define NOTE_AF7 NOTE_GS7 -#define NOTE_BF7 NOTE_AS7 -#define NOTE_DF8 NOTE_CS8 -#define NOTE_EF8 NOTE_DS8 -#define NOTE_GF8 NOTE_FS8 -#define NOTE_AF8 NOTE_GS8 -#define NOTE_BF8 NOTE_AS8 - - -#endif \ No newline at end of file diff --git a/quantum/quantum.mk b/quantum/quantum.mk index 1fe7390eb..83c4f1d1d 100644 --- a/quantum/quantum.mk +++ b/quantum/quantum.mk @@ -28,7 +28,7 @@ ifeq ($(strip $(MIDI_ENABLE)), yes) endif ifeq ($(strip $(AUDIO_ENABLE)), yes) - SRC += $(QUANTUM_DIR)/audio.c + SRC += $(QUANTUM_DIR)/audio/audio.c $(QUANTUM_DIR)/audio/voices.c endif ifeq ($(strip $(UNICODE_ENABLE)), yes) @@ -47,6 +47,7 @@ endif # Search Path VPATH += $(TOP_DIR)/$(QUANTUM_DIR) VPATH += $(TOP_DIR)/$(QUANTUM_DIR)/keymap_extras +VPATH += $(TOP_DIR)/$(QUANTUM_DIR)/audio include $(TMK_DIR)/protocol/lufa.mk diff --git a/quantum/song_list.h b/quantum/song_list.h deleted file mode 100644 index fc6fcdeef..000000000 --- a/quantum/song_list.h +++ /dev/null @@ -1,117 +0,0 @@ -#include "musical_notes.h" - -#ifndef SONG_LIST_H -#define SONG_LIST_H - -#define ODE_TO_JOY \ - Q__NOTE(_E4), Q__NOTE(_E4), Q__NOTE(_F4), Q__NOTE(_G4), \ - Q__NOTE(_G4), Q__NOTE(_F4), Q__NOTE(_E4), Q__NOTE(_D4), \ - Q__NOTE(_C4), Q__NOTE(_C4), Q__NOTE(_D4), Q__NOTE(_E4), \ - QD_NOTE(_E4), E__NOTE(_D4), H__NOTE(_D4), - -#define ROCK_A_BYE_BABY \ - QD_NOTE(_B4), E__NOTE(_D4), Q__NOTE(_B5), \ - H__NOTE(_A5), Q__NOTE(_G5), \ - QD_NOTE(_B4), E__NOTE(_D5), Q__NOTE(_G5), \ - H__NOTE(_FS5), - -#define CLOSE_ENCOUNTERS_5_NOTE \ - Q__NOTE(_D5), \ - Q__NOTE(_E5), \ - Q__NOTE(_C5), \ - Q__NOTE(_C4), \ - Q__NOTE(_G4), - -#define DOE_A_DEER \ - QD_NOTE(_C4), E__NOTE(_D4), \ - QD_NOTE(_E4), E__NOTE(_C4), \ - Q__NOTE(_E4), Q__NOTE(_C4), \ - Q__NOTE(_E4), - -#define GOODBYE_SOUND \ - E__NOTE(_E7), \ - E__NOTE(_A6), \ - ED_NOTE(_E6), - -#define STARTUP_SOUND \ - ED_NOTE(_E7 ), \ - E__NOTE(_CS7), \ - E__NOTE(_E6 ), \ - E__NOTE(_A6 ), \ - M__NOTE(_CS7, 20), - -#define QWERTY_SOUND \ - E__NOTE(_GS6 ), \ - E__NOTE(_A6 ), \ - S__NOTE(_REST), \ - Q__NOTE(_E7 ), - -#define COLEMAK_SOUND \ - E__NOTE(_GS6 ), \ - E__NOTE(_A6 ), \ - S__NOTE(_REST), \ - ED_NOTE(_E7 ), \ - S__NOTE(_REST), \ - ED_NOTE(_GS7 ), - -#define DVORAK_SOUND \ - E__NOTE(_GS6 ), \ - E__NOTE(_A6 ), \ - S__NOTE(_REST), \ - E__NOTE(_E7 ), \ - S__NOTE(_REST), \ - E__NOTE(_FS7 ), \ - S__NOTE(_REST), \ - E__NOTE(_E7 ), - -#define PLOVER_SOUND \ - E__NOTE(_GS6 ), \ - E__NOTE(_A6 ), \ - S__NOTE(_REST), \ - ED_NOTE(_E7 ), \ - S__NOTE(_REST), \ - ED_NOTE(_A7 ), - -#define PLOVER_GOODBYE_SOUND \ - E__NOTE(_GS6 ), \ - E__NOTE(_A6 ), \ - S__NOTE(_REST), \ - ED_NOTE(_A7 ), \ - S__NOTE(_REST), \ - ED_NOTE(_E7 ), - -#define MUSIC_SCALE_SOUND \ - E__NOTE(_A5 ), \ - E__NOTE(_B5 ), \ - E__NOTE(_CS6), \ - E__NOTE(_D6 ), \ - E__NOTE(_E6 ), \ - E__NOTE(_FS6), \ - E__NOTE(_GS6), \ - E__NOTE(_A6 ), - -#define CAPS_LOCK_ON_SOUND \ - E__NOTE(_A3), \ - E__NOTE(_B3), - -#define CAPS_LOCK_OFF_SOUND \ - E__NOTE(_B3), \ - E__NOTE(_A3), - -#define SCROLL_LOCK_ON_SOUND \ - E__NOTE(_D4), \ - E__NOTE(_E4), - -#define SCROLL_LOCK_OFF_SOUND \ - E__NOTE(_E4), \ - E__NOTE(_D4), - -#define NUM_LOCK_ON_SOUND \ - E__NOTE(_D5), \ - E__NOTE(_E5), - -#define NUM_LOCK_OFF_SOUND \ - E__NOTE(_E5), \ - E__NOTE(_D5), - -#endif diff --git a/quantum/vibrato_lut.h b/quantum/vibrato_lut.h deleted file mode 100644 index a2b1f3e5c..000000000 --- a/quantum/vibrato_lut.h +++ /dev/null @@ -1,28 +0,0 @@ -#include -#include -#include - -#define VIBRATO_LUT_LENGTH 20 - -const float VIBRATO_LUT[VIBRATO_LUT_LENGTH] = { \ -1.00223368114872, -1.00425299436105, -1.00585842560279, -1.00689052852052, -1.0072464122237, -1.00689052852052, -1.00585842560279, -1.00425299436105, -1.00223368114872, -1, -0.99777129706302, -0.99576501699778, -0.994175695650927, -0.993156625943589, -0.992805720491269, -0.993156625943589, -0.994175695650927, -0.99576501699778, -0.99777129706302, -1 -}; \ No newline at end of file diff --git a/quantum/wave.h b/quantum/wave.h deleted file mode 100644 index 6ebc34851..000000000 --- a/quantum/wave.h +++ /dev/null @@ -1,265 +0,0 @@ -#include -#include -#include - -#define SINE_LENGTH 2048 - -const uint8_t sinewave[] PROGMEM= //2048 values -{ -0x80,0x80,0x80,0x81,0x81,0x81,0x82,0x82, -0x83,0x83,0x83,0x84,0x84,0x85,0x85,0x85, -0x86,0x86,0x87,0x87,0x87,0x88,0x88,0x88, -0x89,0x89,0x8a,0x8a,0x8a,0x8b,0x8b,0x8c, -0x8c,0x8c,0x8d,0x8d,0x8e,0x8e,0x8e,0x8f, -0x8f,0x8f,0x90,0x90,0x91,0x91,0x91,0x92, -0x92,0x93,0x93,0x93,0x94,0x94,0x95,0x95, -0x95,0x96,0x96,0x96,0x97,0x97,0x98,0x98, -0x98,0x99,0x99,0x9a,0x9a,0x9a,0x9b,0x9b, -0x9b,0x9c,0x9c,0x9d,0x9d,0x9d,0x9e,0x9e, -0x9e,0x9f,0x9f,0xa0,0xa0,0xa0,0xa1,0xa1, -0xa2,0xa2,0xa2,0xa3,0xa3,0xa3,0xa4,0xa4, -0xa5,0xa5,0xa5,0xa6,0xa6,0xa6,0xa7,0xa7, -0xa7,0xa8,0xa8,0xa9,0xa9,0xa9,0xaa,0xaa, -0xaa,0xab,0xab,0xac,0xac,0xac,0xad,0xad, -0xad,0xae,0xae,0xae,0xaf,0xaf,0xb0,0xb0, -0xb0,0xb1,0xb1,0xb1,0xb2,0xb2,0xb2,0xb3, -0xb3,0xb4,0xb4,0xb4,0xb5,0xb5,0xb5,0xb6, -0xb6,0xb6,0xb7,0xb7,0xb7,0xb8,0xb8,0xb8, -0xb9,0xb9,0xba,0xba,0xba,0xbb,0xbb,0xbb, -0xbc,0xbc,0xbc,0xbd,0xbd,0xbd,0xbe,0xbe, -0xbe,0xbf,0xbf,0xbf,0xc0,0xc0,0xc0,0xc1, -0xc1,0xc1,0xc2,0xc2,0xc2,0xc3,0xc3,0xc3, -0xc4,0xc4,0xc4,0xc5,0xc5,0xc5,0xc6,0xc6, -0xc6,0xc7,0xc7,0xc7,0xc8,0xc8,0xc8,0xc9, -0xc9,0xc9,0xca,0xca,0xca,0xcb,0xcb,0xcb, -0xcb,0xcc,0xcc,0xcc,0xcd,0xcd,0xcd,0xce, -0xce,0xce,0xcf,0xcf,0xcf,0xcf,0xd0,0xd0, -0xd0,0xd1,0xd1,0xd1,0xd2,0xd2,0xd2,0xd2, -0xd3,0xd3,0xd3,0xd4,0xd4,0xd4,0xd5,0xd5, -0xd5,0xd5,0xd6,0xd6,0xd6,0xd7,0xd7,0xd7, -0xd7,0xd8,0xd8,0xd8,0xd9,0xd9,0xd9,0xd9, -0xda,0xda,0xda,0xda,0xdb,0xdb,0xdb,0xdc, -0xdc,0xdc,0xdc,0xdd,0xdd,0xdd,0xdd,0xde, -0xde,0xde,0xde,0xdf,0xdf,0xdf,0xe0,0xe0, -0xe0,0xe0,0xe1,0xe1,0xe1,0xe1,0xe2,0xe2, -0xe2,0xe2,0xe3,0xe3,0xe3,0xe3,0xe4,0xe4, -0xe4,0xe4,0xe4,0xe5,0xe5,0xe5,0xe5,0xe6, -0xe6,0xe6,0xe6,0xe7,0xe7,0xe7,0xe7,0xe8, -0xe8,0xe8,0xe8,0xe8,0xe9,0xe9,0xe9,0xe9, -0xea,0xea,0xea,0xea,0xea,0xeb,0xeb,0xeb, -0xeb,0xeb,0xec,0xec,0xec,0xec,0xec,0xed, -0xed,0xed,0xed,0xed,0xee,0xee,0xee,0xee, -0xee,0xef,0xef,0xef,0xef,0xef,0xf0,0xf0, -0xf0,0xf0,0xf0,0xf0,0xf1,0xf1,0xf1,0xf1, -0xf1,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf3, -0xf3,0xf3,0xf3,0xf3,0xf3,0xf4,0xf4,0xf4, -0xf4,0xf4,0xf4,0xf5,0xf5,0xf5,0xf5,0xf5, -0xf5,0xf5,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6, -0xf6,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7, -0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8, -0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9, -0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa, -0xfa,0xfa,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb, -0xfb,0xfb,0xfb,0xfb,0xfc,0xfc,0xfc,0xfc, -0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc, -0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd, -0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfe,0xfe, -0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe, -0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe, -0xfe,0xfe,0xfe,0xfe,0xff,0xff,0xff,0xff, -0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, -0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, -0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, -0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, -0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, -0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, -0xff,0xff,0xff,0xff,0xff,0xfe,0xfe,0xfe, -0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe, -0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe, -0xfe,0xfe,0xfe,0xfd,0xfd,0xfd,0xfd,0xfd, -0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd, -0xfd,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc, -0xfc,0xfc,0xfc,0xfc,0xfc,0xfb,0xfb,0xfb, -0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfa, -0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa, -0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9, -0xf9,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8, -0xf8,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7, -0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf5, -0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf4,0xf4, -0xf4,0xf4,0xf4,0xf4,0xf3,0xf3,0xf3,0xf3, -0xf3,0xf3,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2, -0xf1,0xf1,0xf1,0xf1,0xf1,0xf0,0xf0,0xf0, -0xf0,0xf0,0xf0,0xef,0xef,0xef,0xef,0xef, -0xee,0xee,0xee,0xee,0xee,0xed,0xed,0xed, -0xed,0xed,0xec,0xec,0xec,0xec,0xec,0xeb, -0xeb,0xeb,0xeb,0xeb,0xea,0xea,0xea,0xea, -0xea,0xe9,0xe9,0xe9,0xe9,0xe8,0xe8,0xe8, -0xe8,0xe8,0xe7,0xe7,0xe7,0xe7,0xe6,0xe6, -0xe6,0xe6,0xe5,0xe5,0xe5,0xe5,0xe4,0xe4, -0xe4,0xe4,0xe4,0xe3,0xe3,0xe3,0xe3,0xe2, -0xe2,0xe2,0xe2,0xe1,0xe1,0xe1,0xe1,0xe0, -0xe0,0xe0,0xe0,0xdf,0xdf,0xdf,0xde,0xde, -0xde,0xde,0xdd,0xdd,0xdd,0xdd,0xdc,0xdc, -0xdc,0xdc,0xdb,0xdb,0xdb,0xda,0xda,0xda, -0xda,0xd9,0xd9,0xd9,0xd9,0xd8,0xd8,0xd8, -0xd7,0xd7,0xd7,0xd7,0xd6,0xd6,0xd6,0xd5, -0xd5,0xd5,0xd5,0xd4,0xd4,0xd4,0xd3,0xd3, -0xd3,0xd2,0xd2,0xd2,0xd2,0xd1,0xd1,0xd1, -0xd0,0xd0,0xd0,0xcf,0xcf,0xcf,0xcf,0xce, -0xce,0xce,0xcd,0xcd,0xcd,0xcc,0xcc,0xcc, -0xcb,0xcb,0xcb,0xcb,0xca,0xca,0xca,0xc9, -0xc9,0xc9,0xc8,0xc8,0xc8,0xc7,0xc7,0xc7, -0xc6,0xc6,0xc6,0xc5,0xc5,0xc5,0xc4,0xc4, -0xc4,0xc3,0xc3,0xc3,0xc2,0xc2,0xc2,0xc1, -0xc1,0xc1,0xc0,0xc0,0xc0,0xbf,0xbf,0xbf, -0xbe,0xbe,0xbe,0xbd,0xbd,0xbd,0xbc,0xbc, -0xbc,0xbb,0xbb,0xbb,0xba,0xba,0xba,0xb9, -0xb9,0xb8,0xb8,0xb8,0xb7,0xb7,0xb7,0xb6, -0xb6,0xb6,0xb5,0xb5,0xb5,0xb4,0xb4,0xb4, -0xb3,0xb3,0xb2,0xb2,0xb2,0xb1,0xb1,0xb1, -0xb0,0xb0,0xb0,0xaf,0xaf,0xae,0xae,0xae, -0xad,0xad,0xad,0xac,0xac,0xac,0xab,0xab, -0xaa,0xaa,0xaa,0xa9,0xa9,0xa9,0xa8,0xa8, -0xa7,0xa7,0xa7,0xa6,0xa6,0xa6,0xa5,0xa5, -0xa5,0xa4,0xa4,0xa3,0xa3,0xa3,0xa2,0xa2, -0xa2,0xa1,0xa1,0xa0,0xa0,0xa0,0x9f,0x9f, -0x9e,0x9e,0x9e,0x9d,0x9d,0x9d,0x9c,0x9c, -0x9b,0x9b,0x9b,0x9a,0x9a,0x9a,0x99,0x99, -0x98,0x98,0x98,0x97,0x97,0x96,0x96,0x96, -0x95,0x95,0x95,0x94,0x94,0x93,0x93,0x93, -0x92,0x92,0x91,0x91,0x91,0x90,0x90,0x8f, -0x8f,0x8f,0x8e,0x8e,0x8e,0x8d,0x8d,0x8c, -0x8c,0x8c,0x8b,0x8b,0x8a,0x8a,0x8a,0x89, -0x89,0x88,0x88,0x88,0x87,0x87,0x87,0x86, -0x86,0x85,0x85,0x85,0x84,0x84,0x83,0x83, -0x83,0x82,0x82,0x81,0x81,0x81,0x80,0x80, -0x80,0x7f,0x7f,0x7e,0x7e,0x7e,0x7d,0x7d, -0x7c,0x7c,0x7c,0x7b,0x7b,0x7a,0x7a,0x7a, -0x79,0x79,0x78,0x78,0x78,0x77,0x77,0x77, -0x76,0x76,0x75,0x75,0x75,0x74,0x74,0x73, -0x73,0x73,0x72,0x72,0x71,0x71,0x71,0x70, -0x70,0x70,0x6f,0x6f,0x6e,0x6e,0x6e,0x6d, -0x6d,0x6c,0x6c,0x6c,0x6b,0x6b,0x6a,0x6a, -0x6a,0x69,0x69,0x69,0x68,0x68,0x67,0x67, -0x67,0x66,0x66,0x65,0x65,0x65,0x64,0x64, -0x64,0x63,0x63,0x62,0x62,0x62,0x61,0x61, -0x61,0x60,0x60,0x5f,0x5f,0x5f,0x5e,0x5e, -0x5d,0x5d,0x5d,0x5c,0x5c,0x5c,0x5b,0x5b, -0x5a,0x5a,0x5a,0x59,0x59,0x59,0x58,0x58, -0x58,0x57,0x57,0x56,0x56,0x56,0x55,0x55, -0x55,0x54,0x54,0x53,0x53,0x53,0x52,0x52, -0x52,0x51,0x51,0x51,0x50,0x50,0x4f,0x4f, -0x4f,0x4e,0x4e,0x4e,0x4d,0x4d,0x4d,0x4c, -0x4c,0x4b,0x4b,0x4b,0x4a,0x4a,0x4a,0x49, -0x49,0x49,0x48,0x48,0x48,0x47,0x47,0x47, -0x46,0x46,0x45,0x45,0x45,0x44,0x44,0x44, -0x43,0x43,0x43,0x42,0x42,0x42,0x41,0x41, -0x41,0x40,0x40,0x40,0x3f,0x3f,0x3f,0x3e, -0x3e,0x3e,0x3d,0x3d,0x3d,0x3c,0x3c,0x3c, -0x3b,0x3b,0x3b,0x3a,0x3a,0x3a,0x39,0x39, -0x39,0x38,0x38,0x38,0x37,0x37,0x37,0x36, -0x36,0x36,0x35,0x35,0x35,0x34,0x34,0x34, -0x34,0x33,0x33,0x33,0x32,0x32,0x32,0x31, -0x31,0x31,0x30,0x30,0x30,0x30,0x2f,0x2f, -0x2f,0x2e,0x2e,0x2e,0x2d,0x2d,0x2d,0x2d, -0x2c,0x2c,0x2c,0x2b,0x2b,0x2b,0x2a,0x2a, -0x2a,0x2a,0x29,0x29,0x29,0x28,0x28,0x28, -0x28,0x27,0x27,0x27,0x26,0x26,0x26,0x26, -0x25,0x25,0x25,0x25,0x24,0x24,0x24,0x23, -0x23,0x23,0x23,0x22,0x22,0x22,0x22,0x21, -0x21,0x21,0x21,0x20,0x20,0x20,0x1f,0x1f, -0x1f,0x1f,0x1e,0x1e,0x1e,0x1e,0x1d,0x1d, -0x1d,0x1d,0x1c,0x1c,0x1c,0x1c,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1a,0x1a,0x1a,0x1a,0x19, -0x19,0x19,0x19,0x18,0x18,0x18,0x18,0x17, -0x17,0x17,0x17,0x17,0x16,0x16,0x16,0x16, -0x15,0x15,0x15,0x15,0x15,0x14,0x14,0x14, -0x14,0x14,0x13,0x13,0x13,0x13,0x13,0x12, -0x12,0x12,0x12,0x12,0x11,0x11,0x11,0x11, -0x11,0x10,0x10,0x10,0x10,0x10,0xf,0xf, -0xf,0xf,0xf,0xf,0xe,0xe,0xe,0xe, -0xe,0xd,0xd,0xd,0xd,0xd,0xd,0xc, -0xc,0xc,0xc,0xc,0xc,0xb,0xb,0xb, -0xb,0xb,0xb,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0x9,0x9,0x9,0x9,0x9,0x9, -0x9,0x8,0x8,0x8,0x8,0x8,0x8,0x8, -0x7,0x7,0x7,0x7,0x7,0x7,0x7,0x7, -0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x6, -0x5,0x5,0x5,0x5,0x5,0x5,0x5,0x5, -0x5,0x5,0x4,0x4,0x4,0x4,0x4,0x4, -0x4,0x4,0x4,0x4,0x3,0x3,0x3,0x3, -0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3, -0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2, -0x2,0x2,0x2,0x2,0x2,0x2,0x1,0x1, -0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1, -0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1, -0x1,0x1,0x1,0x1,0x0,0x0,0x0,0x0, -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, -0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x1, -0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1, -0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1, -0x1,0x1,0x1,0x2,0x2,0x2,0x2,0x2, -0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2, -0x2,0x3,0x3,0x3,0x3,0x3,0x3,0x3, -0x3,0x3,0x3,0x3,0x3,0x4,0x4,0x4, -0x4,0x4,0x4,0x4,0x4,0x4,0x4,0x5, -0x5,0x5,0x5,0x5,0x5,0x5,0x5,0x5, -0x5,0x6,0x6,0x6,0x6,0x6,0x6,0x6, -0x6,0x7,0x7,0x7,0x7,0x7,0x7,0x7, -0x7,0x8,0x8,0x8,0x8,0x8,0x8,0x8, -0x9,0x9,0x9,0x9,0x9,0x9,0x9,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xb,0xb, -0xb,0xb,0xb,0xb,0xc,0xc,0xc,0xc, -0xc,0xc,0xd,0xd,0xd,0xd,0xd,0xd, -0xe,0xe,0xe,0xe,0xe,0xf,0xf,0xf, -0xf,0xf,0xf,0x10,0x10,0x10,0x10,0x10, -0x11,0x11,0x11,0x11,0x11,0x12,0x12,0x12, -0x12,0x12,0x13,0x13,0x13,0x13,0x13,0x14, -0x14,0x14,0x14,0x14,0x15,0x15,0x15,0x15, -0x15,0x16,0x16,0x16,0x16,0x17,0x17,0x17, -0x17,0x17,0x18,0x18,0x18,0x18,0x19,0x19, -0x19,0x19,0x1a,0x1a,0x1a,0x1a,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1c,0x1c,0x1c,0x1c,0x1d, -0x1d,0x1d,0x1d,0x1e,0x1e,0x1e,0x1e,0x1f, -0x1f,0x1f,0x1f,0x20,0x20,0x20,0x21,0x21, -0x21,0x21,0x22,0x22,0x22,0x22,0x23,0x23, -0x23,0x23,0x24,0x24,0x24,0x25,0x25,0x25, -0x25,0x26,0x26,0x26,0x26,0x27,0x27,0x27, -0x28,0x28,0x28,0x28,0x29,0x29,0x29,0x2a, -0x2a,0x2a,0x2a,0x2b,0x2b,0x2b,0x2c,0x2c, -0x2c,0x2d,0x2d,0x2d,0x2d,0x2e,0x2e,0x2e, -0x2f,0x2f,0x2f,0x30,0x30,0x30,0x30,0x31, -0x31,0x31,0x32,0x32,0x32,0x33,0x33,0x33, -0x34,0x34,0x34,0x34,0x35,0x35,0x35,0x36, -0x36,0x36,0x37,0x37,0x37,0x38,0x38,0x38, -0x39,0x39,0x39,0x3a,0x3a,0x3a,0x3b,0x3b, -0x3b,0x3c,0x3c,0x3c,0x3d,0x3d,0x3d,0x3e, -0x3e,0x3e,0x3f,0x3f,0x3f,0x40,0x40,0x40, -0x41,0x41,0x41,0x42,0x42,0x42,0x43,0x43, -0x43,0x44,0x44,0x44,0x45,0x45,0x45,0x46, -0x46,0x47,0x47,0x47,0x48,0x48,0x48,0x49, -0x49,0x49,0x4a,0x4a,0x4a,0x4b,0x4b,0x4b, -0x4c,0x4c,0x4d,0x4d,0x4d,0x4e,0x4e,0x4e, -0x4f,0x4f,0x4f,0x50,0x50,0x51,0x51,0x51, -0x52,0x52,0x52,0x53,0x53,0x53,0x54,0x54, -0x55,0x55,0x55,0x56,0x56,0x56,0x57,0x57, -0x58,0x58,0x58,0x59,0x59,0x59,0x5a,0x5a, -0x5a,0x5b,0x5b,0x5c,0x5c,0x5c,0x5d,0x5d, -0x5d,0x5e,0x5e,0x5f,0x5f,0x5f,0x60,0x60, -0x61,0x61,0x61,0x62,0x62,0x62,0x63,0x63, -0x64,0x64,0x64,0x65,0x65,0x65,0x66,0x66, -0x67,0x67,0x67,0x68,0x68,0x69,0x69,0x69, -0x6a,0x6a,0x6a,0x6b,0x6b,0x6c,0x6c,0x6c, -0x6d,0x6d,0x6e,0x6e,0x6e,0x6f,0x6f,0x70, -0x70,0x70,0x71,0x71,0x71,0x72,0x72,0x73, -0x73,0x73,0x74,0x74,0x75,0x75,0x75,0x76, -0x76,0x77,0x77,0x77,0x78,0x78,0x78,0x79, -0x79,0x7a,0x7a,0x7a,0x7b,0x7b,0x7c,0x7c, -0x7c,0x7d,0x7d,0x7e,0x7e,0x7e,0x7f,0x7f -}; \ No newline at end of file -- cgit v1.2.3-70-g09d2 From e89b806b850ad1b5484176664288b71b0131683e Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Thu, 21 Apr 2016 00:40:00 -0400 Subject: converts tabs to spaces --- quantum/audio/voices.c | 88 +++++++++++++++++++++++++------------------------- quantum/audio/voices.h | 6 ++-- 2 files changed, 47 insertions(+), 47 deletions(-) (limited to 'quantum') diff --git a/quantum/audio/voices.c b/quantum/audio/voices.c index 30e8be641..51652927b 100644 --- a/quantum/audio/voices.c +++ b/quantum/audio/voices.c @@ -6,55 +6,55 @@ extern float note_timbre; voice_type voice = default_voice; void set_voice(voice_type v) { - voice = v; + voice = v; } float voice_envelope(float frequency) { - // envelope_index ranges from 0 to 0xFFFF, which is preserved at 880.0 Hz + // envelope_index ranges from 0 to 0xFFFF, which is preserved at 880.0 Hz uint16_t compensated_index = (uint16_t)((float)envelope_index * (880.0 / frequency)); switch (voice) { - case default_voice: - // nothing here on purpose - break; - case butts_fader: - switch (compensated_index) { - case 0 ... 9: - frequency = frequency / 4; - note_timbre = TIMBRE_12; - break; - case 10 ... 19: - frequency = frequency / 2; - note_timbre = TIMBRE_12; - break; - case 20 ... 200: - note_timbre = .125 - pow(((float)compensated_index - 20) / (200 - 20), 2)*.125; - break; - default: - note_timbre = 0; - break; - } - break; - case octave_crunch: - switch (compensated_index) { - case 0 ... 9: - case 20 ... 24: - case 30 ... 32: - frequency = frequency / 2; - note_timbre = TIMBRE_12; - break; - case 10 ... 19: - case 25 ... 29: - case 33 ... 35: - frequency = frequency * 2; - note_timbre = TIMBRE_12; - break; - default: - note_timbre = TIMBRE_12; - break; - } - break; - } + case default_voice: + // nothing here on purpose + break; + case butts_fader: + switch (compensated_index) { + case 0 ... 9: + frequency = frequency / 4; + note_timbre = TIMBRE_12; + break; + case 10 ... 19: + frequency = frequency / 2; + note_timbre = TIMBRE_12; + break; + case 20 ... 200: + note_timbre = .125 - pow(((float)compensated_index - 20) / (200 - 20), 2)*.125; + break; + default: + note_timbre = 0; + break; + } + break; + case octave_crunch: + switch (compensated_index) { + case 0 ... 9: + case 20 ... 24: + case 30 ... 32: + frequency = frequency / 2; + note_timbre = TIMBRE_12; + break; + case 10 ... 19: + case 25 ... 29: + case 33 ... 35: + frequency = frequency * 2; + note_timbre = TIMBRE_12; + break; + default: + note_timbre = TIMBRE_12; + break; + } + break; + } - return frequency; + return frequency; } \ No newline at end of file diff --git a/quantum/audio/voices.h b/quantum/audio/voices.h index 32135dac7..317f5d98c 100644 --- a/quantum/audio/voices.h +++ b/quantum/audio/voices.h @@ -11,9 +11,9 @@ float voice_envelope(float frequency); typedef enum { - default_voice, - butts_fader, - octave_crunch + default_voice, + butts_fader, + octave_crunch } voice_type; void set_voice(voice_type v); -- cgit v1.2.3-70-g09d2 From 9828aba2a12f03fccbc1095bc8e4918ae58fa31b Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Thu, 21 Apr 2016 18:14:25 -0400 Subject: adds multiple voices and the ability to iterate/deiterate between them --- keyboard/preonic/keymaps/default/keymap.c | 21 +++++++++++++++++++-- quantum/audio/voices.c | 31 +++++++++++++++++++++++++++++-- quantum/audio/voices.h | 6 +++++- 3 files changed, 53 insertions(+), 5 deletions(-) (limited to 'quantum') diff --git a/keyboard/preonic/keymaps/default/keymap.c b/keyboard/preonic/keymaps/default/keymap.c index 267bfab3d..f0d5ed603 100644 --- a/keyboard/preonic/keymaps/default/keymap.c +++ b/keyboard/preonic/keymaps/default/keymap.c @@ -3,7 +3,6 @@ #include "eeconfig.h" #ifdef AUDIO_ENABLE #include "audio.h" - #include "song_list.h" #endif // Each layer gets a name for readability, which is then used in the keymap matrix below. @@ -31,6 +30,8 @@ #endif #define MUS_OFF M(8) #define MUS_ON M(9) +#define VC_IN M(10) +#define VC_DE M(11) // Fillers to make layering more clear #define _______ KC_TRNS @@ -171,7 +172,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { {KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12}, {_______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL}, {_______, _______, _______, AUD_ON, AUD_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, _______, _______}, - {_______, _______, _______, MUS_ON, MUS_OFF, _______, _______, _______, _______, _______, _______, _______}, + {_______, VC_DE, VC_IN, MUS_ON, MUS_OFF, _______, _______, _______, _______, _______, _______, _______}, {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______} } @@ -289,6 +290,22 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) #endif } break; + case 10: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + voice_iterate(); + PLAY_NOTE_ARRAY(music_scale, false, 0); + #endif + } + break; + case 11: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + voice_deiterate(); + PLAY_NOTE_ARRAY(music_scale, false, 0); + #endif + } + break; } return MACRO_NONE; }; diff --git a/quantum/audio/voices.c b/quantum/audio/voices.c index 51652927b..92ada47f7 100644 --- a/quantum/audio/voices.c +++ b/quantum/audio/voices.c @@ -1,23 +1,35 @@ #include "voices.h" +// these are imported from audio.c extern uint16_t envelope_index; extern float note_timbre; +extern float polyphony_rate; -voice_type voice = default_voice; +voice_type voice = duty_osc; void set_voice(voice_type v) { voice = v; } +void voice_iterate() { + voice = (voice + 1) % number_of_voices; +} + +void voice_deiterate() { + voice = (voice - 1) % number_of_voices; +} + float voice_envelope(float frequency) { // envelope_index ranges from 0 to 0xFFFF, which is preserved at 880.0 Hz uint16_t compensated_index = (uint16_t)((float)envelope_index * (880.0 / frequency)); switch (voice) { case default_voice: - // nothing here on purpose + note_timbre = TIMBRE_50; + polyphony_rate = 0; break; case butts_fader: + polyphony_rate = 0; switch (compensated_index) { case 0 ... 9: frequency = frequency / 4; @@ -36,6 +48,7 @@ float voice_envelope(float frequency) { } break; case octave_crunch: + polyphony_rate = 0; switch (compensated_index) { case 0 ... 9: case 20 ... 24: @@ -54,6 +67,20 @@ float voice_envelope(float frequency) { break; } break; + case duty_osc: + // This slows the loop down a substantial amount, so higher notes may freeze + polyphony_rate = 0; + switch (compensated_index) { + default: + #define SPEED 10 + #define AMP .75 + // sine wave is slow + // note_timbre = (sin((float)compensated_index/10000*SPEED) * AMP / 2) + .5; + // triangle wave is a bit faster + note_timbre = (float)abs((compensated_index*SPEED % 3000) - 1500) * ( AMP / 1500 ) + (1 - AMP) / 2; + break; + } + break; } return frequency; diff --git a/quantum/audio/voices.h b/quantum/audio/voices.h index 317f5d98c..44c5066b5 100644 --- a/quantum/audio/voices.h +++ b/quantum/audio/voices.h @@ -13,9 +13,13 @@ float voice_envelope(float frequency); typedef enum { default_voice, butts_fader, - octave_crunch + octave_crunch, + duty_osc, + number_of_voices // important that this is last } voice_type; void set_voice(voice_type v); +void voice_iterate(); +void voice_deiterate(); #endif \ No newline at end of file -- cgit v1.2.3-70-g09d2 From 620ac4b260fa663d12b11a0b15ac50379523c125 Mon Sep 17 00:00:00 2001 From: Eric Tang Date: Thu, 21 Apr 2016 19:35:18 -0700 Subject: Update functions used to write to EEPROM --- keyboard/atomic/keymaps/pvc/keymap.c | 2 +- keyboard/hhkb/rn42/rn42_task.c | 2 +- keyboard/planck/keymaps/default/keymap.c | 4 +-- keyboard/preonic/keymaps/default/keymap.c | 2 +- quantum/audio/audio.c | 6 ++--- quantum/keymap_common.c | 2 +- quantum/rgblight.c | 20 +++++++-------- quantum/rgblight.h | 4 +-- tmk_core/common/avr/eeconfig.c | 30 +++++++++++----------- tmk_core/common/backlight.c | 10 ++++---- tmk_core/common/bootmagic.c | 6 ++--- tmk_core/common/eeconfig.h | 10 ++++---- .../lufa/LUFA-git/Bootloaders/CDC/BootloaderCDC.c | 4 +-- .../lufa/LUFA-git/Bootloaders/DFU/BootloaderDFU.c | 2 +- 14 files changed, 52 insertions(+), 52 deletions(-) (limited to 'quantum') diff --git a/keyboard/atomic/keymaps/pvc/keymap.c b/keyboard/atomic/keymaps/pvc/keymap.c index 36098f1eb..95a26c5b4 100644 --- a/keyboard/atomic/keymaps/pvc/keymap.c +++ b/keyboard/atomic/keymaps/pvc/keymap.c @@ -233,7 +233,7 @@ void update_quad_layer(uint8_t layer1, uint8_t layer2, uint8_t layer3, uint8_t l void persistant_default_layer_set(uint16_t default_layer) { - eeconfig_write_default_layer(default_layer); + eeconfig_update_default_layer(default_layer); default_layer_set(default_layer); } diff --git a/keyboard/hhkb/rn42/rn42_task.c b/keyboard/hhkb/rn42/rn42_task.c index 5107fef48..84001b3f1 100644 --- a/keyboard/hhkb/rn42/rn42_task.c +++ b/keyboard/hhkb/rn42/rn42_task.c @@ -219,7 +219,7 @@ static void store_link(uint8_t *eeaddr) xprintf("%s(%d)\r\n", s, strlen(s)); if (strlen(s) == 12) { for (int i = 0; i < 12; i++) { - eeprom_write_byte(eeaddr+i, *(s+i)); + eeprom_update_byte(eeaddr+i, *(s+i)); dprintf("%c ", *(s+i)); } dprint("\r\n"); diff --git a/keyboard/planck/keymaps/default/keymap.c b/keyboard/planck/keymaps/default/keymap.c index 3239dda71..19d24f6a0 100644 --- a/keyboard/planck/keymaps/default/keymap.c +++ b/keyboard/planck/keymaps/default/keymap.c @@ -211,7 +211,7 @@ float goodbye[][2] = SONG(GOODBYE_SOUND); void persistant_default_layer_set(uint16_t default_layer) { - eeconfig_write_default_layer(default_layer); + eeconfig_update_default_layer(default_layer); default_layer_set(default_layer); } @@ -315,7 +315,7 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) } keymap_config.raw = eeconfig_read_keymap(); keymap_config.nkro = 1; - eeconfig_write_keymap(keymap_config.raw); + eeconfig_update_keymap(keymap_config.raw); } break; case 11: diff --git a/keyboard/preonic/keymaps/default/keymap.c b/keyboard/preonic/keymaps/default/keymap.c index f0d5ed603..3a6dfa31a 100644 --- a/keyboard/preonic/keymaps/default/keymap.c +++ b/keyboard/preonic/keymaps/default/keymap.c @@ -200,7 +200,7 @@ float goodbye[][2] = SONG(GOODBYE_SOUND); #endif void persistant_default_layer_set(uint16_t default_layer) { - eeconfig_write_default_layer(default_layer); + eeconfig_update_default_layer(default_layer); default_layer_set(default_layer); } diff --git a/quantum/audio/audio.c b/quantum/audio/audio.c index 3225557ba..e85370d95 100644 --- a/quantum/audio/audio.c +++ b/quantum/audio/audio.c @@ -85,17 +85,17 @@ uint16_t envelope_index = 0; void audio_toggle(void) { audio_config.enable ^= 1; - eeconfig_write_audio(audio_config.raw); + eeconfig_update_audio(audio_config.raw); } void audio_on(void) { audio_config.enable = 1; - eeconfig_write_audio(audio_config.raw); + eeconfig_update_audio(audio_config.raw); } void audio_off(void) { audio_config.enable = 0; - eeconfig_write_audio(audio_config.raw); + eeconfig_update_audio(audio_config.raw); } #ifdef VIBRATO_ENABLE diff --git a/quantum/keymap_common.c b/quantum/keymap_common.c index 43debf4ef..4b4bd6210 100644 --- a/quantum/keymap_common.c +++ b/quantum/keymap_common.c @@ -245,7 +245,7 @@ static action_t keycode_to_action(uint16_t keycode) keymap_config.swap_lalt_lgui = 0; keymap_config.swap_ralt_rgui = 0; } - eeconfig_write_keymap(keymap_config.raw); + eeconfig_update_keymap(keymap_config.raw); break; case 0x5100 ... 0x5FFF: ; // Layer movement shortcuts diff --git a/quantum/rgblight.c b/quantum/rgblight.c index 2215cf5cd..5623c65de 100644 --- a/quantum/rgblight.c +++ b/quantum/rgblight.c @@ -107,17 +107,17 @@ void setrgb(uint8_t r, uint8_t g, uint8_t b, struct cRGB *led1) { uint32_t eeconfig_read_rgblight(void) { return eeprom_read_dword(EECONFIG_RGBLIGHT); } -void eeconfig_write_rgblight(uint32_t val) { - eeprom_write_dword(EECONFIG_RGBLIGHT, val); +void eeconfig_update_rgblight(uint32_t val) { + eeprom_update_dword(EECONFIG_RGBLIGHT, val); } -void eeconfig_write_rgblight_default(void) { - dprintf("eeconfig_write_rgblight_default\n"); +void eeconfig_update_rgblight_default(void) { + dprintf("eeconfig_update_rgblight_default\n"); rgblight_config.enable = 1; rgblight_config.mode = 1; rgblight_config.hue = 200; rgblight_config.sat = 204; rgblight_config.val = 204; - eeconfig_write_rgblight(rgblight_config.raw); + eeconfig_update_rgblight(rgblight_config.raw); } void eeconfig_debug_rgblight(void) { dprintf("rgblight_config eprom\n"); @@ -136,12 +136,12 @@ void rgblight_init(void) { if (!eeconfig_is_enabled()) { dprintf("rgblight_init eeconfig is not enabled.\n"); eeconfig_init(); - eeconfig_write_rgblight_default(); + eeconfig_update_rgblight_default(); } rgblight_config.raw = eeconfig_read_rgblight(); if (!rgblight_config.mode) { dprintf("rgblight_init rgblight_config.mode = 0. Write default values to EEPROM.\n"); - eeconfig_write_rgblight_default(); + eeconfig_update_rgblight_default(); rgblight_config.raw = eeconfig_read_rgblight(); } eeconfig_debug_rgblight(); // display current eeprom values @@ -189,7 +189,7 @@ void rgblight_mode(uint8_t mode) { } else { rgblight_config.mode = mode; } - eeconfig_write_rgblight(rgblight_config.raw); + eeconfig_update_rgblight(rgblight_config.raw); dprintf("rgblight mode: %u\n", rgblight_config.mode); if (rgblight_config.mode == 1) { rgblight_timer_disable(); @@ -206,7 +206,7 @@ void rgblight_mode(uint8_t mode) { void rgblight_toggle(void) { rgblight_config.enable ^= 1; - eeconfig_write_rgblight(rgblight_config.raw); + eeconfig_update_rgblight(rgblight_config.raw); dprintf("rgblight toggle: rgblight_config.enable = %u\n", rgblight_config.enable); if (rgblight_config.enable) { rgblight_mode(rgblight_config.mode); @@ -299,7 +299,7 @@ void rgblight_sethsv(uint16_t hue, uint8_t sat, uint8_t val){ rgblight_config.hue = hue; rgblight_config.sat = sat; rgblight_config.val = val; - eeconfig_write_rgblight(rgblight_config.raw); + eeconfig_update_rgblight(rgblight_config.raw); dprintf("rgblight set hsv [EEPROM]: %u,%u,%u\n", rgblight_config.hue, rgblight_config.sat, rgblight_config.val); } } diff --git a/quantum/rgblight.h b/quantum/rgblight.h index 9e1562328..37e207578 100644 --- a/quantum/rgblight.h +++ b/quantum/rgblight.h @@ -66,8 +66,8 @@ void rgblight_setrgb(uint8_t r, uint8_t g, uint8_t b); #define EECONFIG_RGBLIGHT (uint8_t *)7 uint32_t eeconfig_read_rgblight(void); -void eeconfig_write_rgblight(uint32_t val); -void eeconfig_write_rgblight_default(void); +void eeconfig_update_rgblight(uint32_t val); +void eeconfig_update_rgblight_default(void); void eeconfig_debug_rgblight(void); void sethsv(uint16_t hue, uint8_t sat, uint8_t val, struct cRGB *led1); diff --git a/tmk_core/common/avr/eeconfig.c b/tmk_core/common/avr/eeconfig.c index 25bb9e849..c5391f5cf 100644 --- a/tmk_core/common/avr/eeconfig.c +++ b/tmk_core/common/avr/eeconfig.c @@ -5,27 +5,27 @@ void eeconfig_init(void) { - eeprom_write_word(EECONFIG_MAGIC, EECONFIG_MAGIC_NUMBER); - eeprom_write_byte(EECONFIG_DEBUG, 0); - eeprom_write_byte(EECONFIG_DEFAULT_LAYER, 0); - eeprom_write_byte(EECONFIG_KEYMAP, 0); - eeprom_write_byte(EECONFIG_MOUSEKEY_ACCEL, 0); + eeprom_update_word(EECONFIG_MAGIC, EECONFIG_MAGIC_NUMBER); + eeprom_update_byte(EECONFIG_DEBUG, 0); + eeprom_update_byte(EECONFIG_DEFAULT_LAYER, 0); + eeprom_update_byte(EECONFIG_KEYMAP, 0); + eeprom_update_byte(EECONFIG_MOUSEKEY_ACCEL, 0); #ifdef BACKLIGHT_ENABLE - eeprom_write_byte(EECONFIG_BACKLIGHT, 0); + eeprom_update_byte(EECONFIG_BACKLIGHT, 0); #endif #ifdef AUDIO_ENABLE - eeprom_write_byte(EECONFIG_AUDIO, 0xFF); // On by default + eeprom_update_byte(EECONFIG_AUDIO, 0xFF); // On by default #endif } void eeconfig_enable(void) { - eeprom_write_word(EECONFIG_MAGIC, EECONFIG_MAGIC_NUMBER); + eeprom_update_word(EECONFIG_MAGIC, EECONFIG_MAGIC_NUMBER); } void eeconfig_disable(void) { - eeprom_write_word(EECONFIG_MAGIC, 0xFFFF); + eeprom_update_word(EECONFIG_MAGIC, 0xFFFF); } bool eeconfig_is_enabled(void) @@ -34,20 +34,20 @@ bool eeconfig_is_enabled(void) } uint8_t eeconfig_read_debug(void) { return eeprom_read_byte(EECONFIG_DEBUG); } -void eeconfig_write_debug(uint8_t val) { eeprom_write_byte(EECONFIG_DEBUG, val); } +void eeconfig_update_debug(uint8_t val) { eeprom_update_byte(EECONFIG_DEBUG, val); } uint8_t eeconfig_read_default_layer(void) { return eeprom_read_byte(EECONFIG_DEFAULT_LAYER); } -void eeconfig_write_default_layer(uint8_t val) { eeprom_write_byte(EECONFIG_DEFAULT_LAYER, val); } +void eeconfig_update_default_layer(uint8_t val) { eeprom_update_byte(EECONFIG_DEFAULT_LAYER, val); } uint8_t eeconfig_read_keymap(void) { return eeprom_read_byte(EECONFIG_KEYMAP); } -void eeconfig_write_keymap(uint8_t val) { eeprom_write_byte(EECONFIG_KEYMAP, val); } +void eeconfig_update_keymap(uint8_t val) { eeprom_update_byte(EECONFIG_KEYMAP, val); } #ifdef BACKLIGHT_ENABLE uint8_t eeconfig_read_backlight(void) { return eeprom_read_byte(EECONFIG_BACKLIGHT); } -void eeconfig_write_backlight(uint8_t val) { eeprom_write_byte(EECONFIG_BACKLIGHT, val); } +void eeconfig_update_backlight(uint8_t val) { eeprom_update_byte(EECONFIG_BACKLIGHT, val); } #endif #ifdef AUDIO_ENABLE uint8_t eeconfig_read_audio(void) { return eeprom_read_byte(EECONFIG_AUDIO); } -void eeconfig_write_audio(uint8_t val) { eeprom_write_byte(EECONFIG_AUDIO, val); } -#endif \ No newline at end of file +void eeconfig_update_audio(uint8_t val) { eeprom_update_byte(EECONFIG_AUDIO, val); } +#endif diff --git a/tmk_core/common/backlight.c b/tmk_core/common/backlight.c index 558ad9b01..2f6fc1cd6 100644 --- a/tmk_core/common/backlight.c +++ b/tmk_core/common/backlight.c @@ -37,7 +37,7 @@ void backlight_increase(void) { backlight_config.level++; backlight_config.enable = 1; - eeconfig_write_backlight(backlight_config.raw); + eeconfig_update_backlight(backlight_config.raw); } dprintf("backlight increase: %u\n", backlight_config.level); backlight_set(backlight_config.level); @@ -49,7 +49,7 @@ void backlight_decrease(void) { backlight_config.level--; backlight_config.enable = !!backlight_config.level; - eeconfig_write_backlight(backlight_config.raw); + eeconfig_update_backlight(backlight_config.raw); } dprintf("backlight decrease: %u\n", backlight_config.level); backlight_set(backlight_config.level); @@ -58,7 +58,7 @@ void backlight_decrease(void) void backlight_toggle(void) { backlight_config.enable ^= 1; - eeconfig_write_backlight(backlight_config.raw); + eeconfig_update_backlight(backlight_config.raw); dprintf("backlight toggle: %u\n", backlight_config.enable); backlight_set(backlight_config.enable ? backlight_config.level : 0); } @@ -71,7 +71,7 @@ void backlight_step(void) backlight_config.level = 0; } backlight_config.enable = !!backlight_config.level; - eeconfig_write_backlight(backlight_config.raw); + eeconfig_update_backlight(backlight_config.raw); dprintf("backlight step: %u\n", backlight_config.level); backlight_set(backlight_config.level); } @@ -80,6 +80,6 @@ void backlight_level(uint8_t level) { backlight_config.level ^= level; backlight_config.enable = !!backlight_config.level; - eeconfig_write_backlight(backlight_config.raw); + eeconfig_update_backlight(backlight_config.raw); backlight_set(backlight_config.level); } diff --git a/tmk_core/common/bootmagic.c b/tmk_core/common/bootmagic.c index b002a5856..2c1b1adfc 100644 --- a/tmk_core/common/bootmagic.c +++ b/tmk_core/common/bootmagic.c @@ -52,7 +52,7 @@ void bootmagic(void) debug_config.enable = !debug_config.enable; } } - eeconfig_write_debug(debug_config.raw); + eeconfig_update_debug(debug_config.raw); /* keymap config */ keymap_config.raw = eeconfig_read_keymap(); @@ -80,7 +80,7 @@ void bootmagic(void) if (bootmagic_scan_keycode(BOOTMAGIC_HOST_NKRO)) { keymap_config.nkro = !keymap_config.nkro; } - eeconfig_write_keymap(keymap_config.raw); + eeconfig_update_keymap(keymap_config.raw); #ifdef NKRO_ENABLE keyboard_nkro = keymap_config.nkro; @@ -97,7 +97,7 @@ void bootmagic(void) if (bootmagic_scan_keycode(BOOTMAGIC_KEY_DEFAULT_LAYER_6)) { default_layer |= (1<<6); } if (bootmagic_scan_keycode(BOOTMAGIC_KEY_DEFAULT_LAYER_7)) { default_layer |= (1<<7); } if (default_layer) { - eeconfig_write_default_layer(default_layer); + eeconfig_update_default_layer(default_layer); default_layer_set((uint32_t)default_layer); } else { default_layer = eeconfig_read_default_layer(); diff --git a/tmk_core/common/eeconfig.h b/tmk_core/common/eeconfig.h index ddefca134..ca47e0d2f 100644 --- a/tmk_core/common/eeconfig.h +++ b/tmk_core/common/eeconfig.h @@ -60,22 +60,22 @@ void eeconfig_enable(void); void eeconfig_disable(void); uint8_t eeconfig_read_debug(void); -void eeconfig_write_debug(uint8_t val); +void eeconfig_update_debug(uint8_t val); uint8_t eeconfig_read_default_layer(void); -void eeconfig_write_default_layer(uint8_t val); +void eeconfig_update_default_layer(uint8_t val); uint8_t eeconfig_read_keymap(void); -void eeconfig_write_keymap(uint8_t val); +void eeconfig_update_keymap(uint8_t val); #ifdef BACKLIGHT_ENABLE uint8_t eeconfig_read_backlight(void); -void eeconfig_write_backlight(uint8_t val); +void eeconfig_update_backlight(uint8_t val); #endif #ifdef AUDIO_ENABLE uint8_t eeconfig_read_audio(void); -void eeconfig_write_audio(uint8_t val); +void eeconfig_update_audio(uint8_t val); #endif #endif diff --git a/tmk_core/protocol/lufa/LUFA-git/Bootloaders/CDC/BootloaderCDC.c b/tmk_core/protocol/lufa/LUFA-git/Bootloaders/CDC/BootloaderCDC.c index f66a483e6..58bb33892 100644 --- a/tmk_core/protocol/lufa/LUFA-git/Bootloaders/CDC/BootloaderCDC.c +++ b/tmk_core/protocol/lufa/LUFA-git/Bootloaders/CDC/BootloaderCDC.c @@ -327,7 +327,7 @@ static void ReadWriteMemoryBlock(const uint8_t Command) else { /* Write the next EEPROM byte from the endpoint */ - eeprom_write_byte((uint8_t*)((intptr_t)(CurrAddress >> 1)), FetchNextCommandByte()); + eeprom_update_byte((uint8_t*)((intptr_t)(CurrAddress >> 1)), FetchNextCommandByte()); /* Increment the address counter after use */ CurrAddress += 2; @@ -581,7 +581,7 @@ static void CDC_Task(void) else if (Command == AVR109_COMMAND_WriteEEPROM) { /* Read the byte from the endpoint and write it to the EEPROM */ - eeprom_write_byte((uint8_t*)((intptr_t)(CurrAddress >> 1)), FetchNextCommandByte()); + eeprom_update_byte((uint8_t*)((intptr_t)(CurrAddress >> 1)), FetchNextCommandByte()); /* Increment the address after use */ CurrAddress += 2; diff --git a/tmk_core/protocol/lufa/LUFA-git/Bootloaders/DFU/BootloaderDFU.c b/tmk_core/protocol/lufa/LUFA-git/Bootloaders/DFU/BootloaderDFU.c index 0385bfc49..00e673268 100644 --- a/tmk_core/protocol/lufa/LUFA-git/Bootloaders/DFU/BootloaderDFU.c +++ b/tmk_core/protocol/lufa/LUFA-git/Bootloaders/DFU/BootloaderDFU.c @@ -370,7 +370,7 @@ void EVENT_USB_Device_ControlRequest(void) } /* Read the byte from the USB interface and write to to the EEPROM */ - eeprom_write_byte((uint8_t*)StartAddr, Endpoint_Read_8()); + eeprom_update_byte((uint8_t*)StartAddr, Endpoint_Read_8()); /* Adjust counters */ StartAddr++; -- cgit v1.2.3-70-g09d2 From 7b3f212500210ae85063b043952b5b3ef6988ad6 Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Thu, 21 Apr 2016 23:10:47 -0400 Subject: adds more voices, fixes macro redefines --- quantum/audio/voices.c | 12 ++++++++---- quantum/audio/voices.h | 1 + 2 files changed, 9 insertions(+), 4 deletions(-) (limited to 'quantum') diff --git a/quantum/audio/voices.c b/quantum/audio/voices.c index 92ada47f7..98631f0cb 100644 --- a/quantum/audio/voices.c +++ b/quantum/audio/voices.c @@ -72,15 +72,19 @@ float voice_envelope(float frequency) { polyphony_rate = 0; switch (compensated_index) { default: - #define SPEED 10 - #define AMP .75 + #define OCS_SPEED 10 + #define OCS_AMP .25 // sine wave is slow - // note_timbre = (sin((float)compensated_index/10000*SPEED) * AMP / 2) + .5; + // note_timbre = (sin((float)compensated_index/10000*OCS_SPEED) * OCS_AMP / 2) + .5; // triangle wave is a bit faster - note_timbre = (float)abs((compensated_index*SPEED % 3000) - 1500) * ( AMP / 1500 ) + (1 - AMP) / 2; + note_timbre = (float)abs((compensated_index*OCS_SPEED % 3000) - 1500) * ( OCS_AMP / 1500 ) + (1 - OCS_AMP) / 2; break; } break; + case duty_octave_down: + polyphony_rate = 0; + note_timbre = (envelope_index % 2) * .125 + .375 * 2; + break; } return frequency; diff --git a/quantum/audio/voices.h b/quantum/audio/voices.h index 44c5066b5..5aa99f4b1 100644 --- a/quantum/audio/voices.h +++ b/quantum/audio/voices.h @@ -15,6 +15,7 @@ typedef enum { butts_fader, octave_crunch, duty_osc, + duty_octave_down, number_of_voices // important that this is last } voice_type; -- cgit v1.2.3-70-g09d2 From 082a0f313d8c842a5de7bae30ec8a3597e35880b Mon Sep 17 00:00:00 2001 From: IBNobody Date: Fri, 22 Apr 2016 00:01:38 -0500 Subject: fixed compiler warnings (#273) --- keyboard/atomic/keymaps/pvc/config.h | 4 +++ keyboard/atomic/keymaps/pvc/keymap.c | 69 +++++++++++++++++++++++++----------- quantum/audio/audio.h | 6 ++-- quantum/audio/voices.c | 37 ++++++++++++------- quantum/audio/voices.h | 4 +-- 5 files changed, 83 insertions(+), 37 deletions(-) (limited to 'quantum') diff --git a/keyboard/atomic/keymaps/pvc/config.h b/keyboard/atomic/keymaps/pvc/config.h index cb0b78e44..cc9263464 100644 --- a/keyboard/atomic/keymaps/pvc/config.h +++ b/keyboard/atomic/keymaps/pvc/config.h @@ -62,6 +62,10 @@ along with this program. If not, see . /* Locking resynchronize hack */ #define LOCKING_RESYNC_ENABLE +// Enable Keyboard Locking via magic key +#define KEYBOARD_LOCK_ENABLE + + /* * Force NKRO * diff --git a/keyboard/atomic/keymaps/pvc/keymap.c b/keyboard/atomic/keymaps/pvc/keymap.c index 95a26c5b4..c6642919b 100644 --- a/keyboard/atomic/keymaps/pvc/keymap.c +++ b/keyboard/atomic/keymaps/pvc/keymap.c @@ -13,9 +13,9 @@ #define LAYER_DVORAK 2 #define LAYER_LOWER 3 #define LAYER_RAISE 4 -#define LAYER_ADJUST 5 -#define LAYER_FUNCTION 6 -#define LAYER_MUSIC 7 +#define LAYER_FUNCTION 5 +#define LAYER_MUSIC 6 +#define LAYER_ADJUST 7 #define MACRO_QWERTY 0 #define MACRO_COLEMAK 1 @@ -34,6 +34,8 @@ #define MACRO_MUSIC_OFF 14 #define MACRO_AUDIO_ON 15 #define MACRO_AUDIO_OFF 16 +#define MACRO_INC_VOICE 17 +#define MACRO_DEC_VOICE 18 #define M_QWRTY M(MACRO_QWERTY) #define M_COLMK M(MACRO_COLEMAK) @@ -54,6 +56,8 @@ #define MUS_OFF M(MACRO_MUSIC_OFF) #define AUD_OFF M(MACRO_AUDIO_OFF) #define AUD_ON M(MACRO_AUDIO_ON) +#define VC_UP M(MACRO_INC_VOICE) +#define VC_DOWN M(MACRO_DEC_VOICE) #define SC_UNDO LCTL(KC_Z) @@ -164,20 +168,20 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { { _______, _______, _______, _______, _______, KC_BTN1, KC_BTN1, _______, _______, _______, _______, _______, KC_MS_L, KC_MS_D, KC_MS_R }, }, + [LAYER_MUSIC] = { + { XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX }, + { XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX }, + { XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX }, + { XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX }, + { XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, M_RAISE, XXXXXXX, XXXXXXX, M_LOWER, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX }, + }, + [LAYER_ADJUST] = { /* ADJUST */ { _______, TIMBR_1, TIMBR_2, TIMBR_3, TIMBR_4, TMPO_UP, TMPO_DN, TMPO_DF, _______, MUS_ON, MUS_OFF, AUD_ON, AUD_OFF, ___T___, ___T___ }, { _______, M_QWRTY, M_COLMK, M_DVORK, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ }, { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, ___T___, ___T___, _______ }, - { _______, _______, _______, _______, _______, RESET, _______, _______, _______, _______, _______, ___T___, ___T___, _______, _______ }, - { _______, _______, _______, _______, _______, ___T___, ___T___, _______, _______, _______, _______, _______, _______, _______, _______ }, - }, - - [LAYER_MUSIC] = { - { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, ___T___, ___T___ }, - { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ }, - { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, ___T___, ___T___, _______ }, - { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, ___T___, ___T___, _______, _______ }, - { _______, _______, _______, _______, _______, ___T___, ___T___, _______, _______, _______, _______, _______, _______, _______, _______ }, + { _______, _______, _______, _______, _______, RESET, _______, _______, _______, _______, _______, ___T___, ___T___, VC_UP, _______ }, + { _______, _______, _______, _______, _______, ___T___, ___T___, _______, _______, _______, _______, _______, _______, VC_DOWN, _______ }, }, }; @@ -187,8 +191,8 @@ float tone_my_startup[][2] = SONG(ODE_TO_JOY); float tone_my_goodbye[][2] = SONG(ROCK_A_BYE_BABY); float tone_qwerty[][2] = SONG(QWERTY_SOUND); -float tone_dvorak[][2] = SONG(COLEMAK_SOUND); -float tone_colemak[][2] = SONG(DVORAK_SOUND); +float tone_dvorak[][2] = SONG(DVORAK_SOUND); +float tone_colemak[][2] = SONG(COLEMAK_SOUND); float tone_audio_on[][2] = SONG(CLOSE_ENCOUNTERS_5_NOTE); float tone_music_on[][2] = SONG(DOE_A_DEER); @@ -198,6 +202,7 @@ float tone_numlk_on[][2] = SONG(NUM_LOCK_ON_SOUND); float tone_numlk_off[][2] = SONG(NUM_LOCK_OFF_SOUND); float tone_scroll_on[][2] = SONG(SCROLL_LOCK_ON_SOUND); float tone_scroll_off[][2] = SONG(SCROLL_LOCK_OFF_SOUND); +float music_scale[][2] = SONG(MUSIC_SCALE_SOUND); #endif /* AUDIO_ENABLE */ @@ -380,6 +385,26 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) } break; + case MACRO_INC_VOICE: + if (record->event.pressed) + { + #ifdef AUDIO_ENABLE + voice_iterate(); + PLAY_NOTE_ARRAY(music_scale, false, STACCATO); + #endif + } + break; + + case MACRO_DEC_VOICE: + if (record->event.pressed) + { + #ifdef AUDIO_ENABLE + voice_deiterate(); + PLAY_NOTE_ARRAY(music_scale, false, STACCATO); + #endif + } + break; + default: break; @@ -390,12 +415,13 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) #ifdef AUDIO_ENABLE -uint8_t starting_note = 0x0C; -int offset = 7; - void process_action_user(keyrecord_t *record) { + + uint8_t starting_note = 0x0C; + int offset = 7; + if (IS_LAYER_ON(LAYER_MUSIC)) { if (record->event.pressed) @@ -412,7 +438,7 @@ void process_action_user(keyrecord_t *record) void matrix_init_user(void) { - init_notes(); + set_voice(default_voice); play_startup_tone(); println("Matrix Init"); } @@ -421,6 +447,8 @@ void led_set_user(uint8_t usb_led) { static uint8_t old_usb_led = 0; + _delay_ms(10); // gets rid of tick + if ((usb_led & (1< Date: Fri, 22 Apr 2016 01:02:50 -0400 Subject: adds fifth and fourth down voices --- quantum/audio/voices.c | 15 +++++++++++++++ quantum/audio/voices.h | 2 ++ 2 files changed, 17 insertions(+) (limited to 'quantum') diff --git a/quantum/audio/voices.c b/quantum/audio/voices.c index 98631f0cb..8b3978f3d 100644 --- a/quantum/audio/voices.c +++ b/quantum/audio/voices.c @@ -84,6 +84,21 @@ float voice_envelope(float frequency) { case duty_octave_down: polyphony_rate = 0; note_timbre = (envelope_index % 2) * .125 + .375 * 2; + if ((envelope_index % 4) == 0) + note_timbre = 0.5; + if ((envelope_index % 8) == 0) + note_timbre = 0; + break; + case duty_fifth_down: + note_timbre = 0.5; + if ((envelope_index % 5) == 0) + note_timbre = 0.75; + break; + case duty_fourth_down: + if ((envelope_index % 12) == 0) + note_timbre = 0.25; + else + note_timbre = 0.5; break; } diff --git a/quantum/audio/voices.h b/quantum/audio/voices.h index 5aa99f4b1..718671f77 100644 --- a/quantum/audio/voices.h +++ b/quantum/audio/voices.h @@ -16,6 +16,8 @@ typedef enum { octave_crunch, duty_osc, duty_octave_down, + duty_fifth_down, + duty_fourth_down, number_of_voices // important that this is last } voice_type; -- cgit v1.2.3-70-g09d2 From a718c53fe77f0b3b4361c850531eee5f23e3e13d Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Fri, 22 Apr 2016 11:58:29 -0400 Subject: adds more voice harmonics --- quantum/audio/voices.c | 19 ++++++++++++++++--- quantum/audio/voices.h | 2 ++ 2 files changed, 18 insertions(+), 3 deletions(-) (limited to 'quantum') diff --git a/quantum/audio/voices.c b/quantum/audio/voices.c index 886101187..0b4b463c4 100644 --- a/quantum/audio/voices.c +++ b/quantum/audio/voices.c @@ -101,14 +101,27 @@ float voice_envelope(float frequency) { break; case duty_fifth_down: note_timbre = 0.5; - if ((envelope_index % 5) == 0) + if ((envelope_index % 3) == 0) note_timbre = 0.75; break; case duty_fourth_down: + note_timbre = 0.0; if ((envelope_index % 12) == 0) + note_timbre = 0.75; + if (((envelope_index % 12) % 4) != 1) + note_timbre = 0.75; + break; + case duty_third_down: + note_timbre = 0.5; + if ((envelope_index % 5) == 0) + note_timbre = 0.75; + break; + case duty_fifth_third_down: + note_timbre = 0.5; + if ((envelope_index % 5) == 0) + note_timbre = 0.75; + if ((envelope_index % 3) == 0) note_timbre = 0.25; - else - note_timbre = 0.5; break; default: diff --git a/quantum/audio/voices.h b/quantum/audio/voices.h index cdd14798b..66184c3a2 100644 --- a/quantum/audio/voices.h +++ b/quantum/audio/voices.h @@ -18,6 +18,8 @@ typedef enum { duty_octave_down, duty_fifth_down, duty_fourth_down, + duty_third_down, + duty_fifth_third_down, number_of_voices // important that this is last } voice_type; -- cgit v1.2.3-70-g09d2 From eb09c450de2886ce1811929dec8b42ada0227f04 Mon Sep 17 00:00:00 2001 From: Eric Tang Date: Fri, 22 Apr 2016 13:44:50 -0700 Subject: Fix typo (#276) --- quantum/keymap_common.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'quantum') diff --git a/quantum/keymap_common.h b/quantum/keymap_common.h index ce87e4770..0ede0296b 100644 --- a/quantum/keymap_common.h +++ b/quantum/keymap_common.h @@ -213,7 +213,7 @@ extern const uint16_t fn_actions[]; #define GUI_T(kc) MT(0x8, kc) #define C_S_T(kc) MT(0x3, kc) // Control + Shift e.g. for gnome-terminal #define MEH_T(kc) MT(0x7, kc) // Meh is a less hyper version of the Hyper key -- doesn't include Win or Cmd, so just alt+shift+ctrl -#define LCAG_T(kc) MT(0xD, kc) // Left control alt and gui +#define LCAG_T(kc) MT(0xD, kc) // Left control alt and gui #define ALL_T(kc) MT(0xF, kc) // see http://brettterpstra.com/2012/12/08/a-useful-caps-lock-key/ // Dedicated keycode versions for Hyper and Meh, if you want to use them as standalone keys rather than mod-tap @@ -231,8 +231,8 @@ extern const uint16_t fn_actions[]; // For tri-layer void update_tri_layer(uint8_t layer1, uint8_t layer2, uint8_t layer3); -#define IS_LAYER_ON(layer) ((layer_state) & (1UL<<(layer))) -#define IS_LAYER_OFF(layer) ((!layer_state) & (1UL<<(layer))) +#define IS_LAYER_ON(layer) (layer_state & (1UL << (layer))) +#define IS_LAYER_OFF(layer) (~layer_state & (1UL << (layer))) #endif -- cgit v1.2.3-70-g09d2 From 7ccfaf750d08bdb3a25ef2869cac251b7cd4d3ad Mon Sep 17 00:00:00 2001 From: James ‘Twey’ Kay Date: Sat, 23 Apr 2016 18:49:10 +0100 Subject: Add a keymap_extras header for Plover --- quantum/keymap_extras/keymap_plover.h | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 quantum/keymap_extras/keymap_plover.h (limited to 'quantum') diff --git a/quantum/keymap_extras/keymap_plover.h b/quantum/keymap_extras/keymap_plover.h new file mode 100644 index 000000000..98e57ab7b --- /dev/null +++ b/quantum/keymap_extras/keymap_plover.h @@ -0,0 +1,32 @@ +#ifndef KEYMAP_PLOVER_H +#define KEYMAP_PLOVER_H + +#include "keymap_common.h" + +#define PV_NUM KC_1 +#define PV_LS KC_Q +#define PV_LT KC_W +#define PV_LP KC_E +#define PV_LH KC_R +#define PV_LK KC_S +#define PV_LW KC_D +#define PV_LR KC_F + +#define PV_STAR KC_Y +#define PV_RF KC_U +#define PV_RP KC_I +#define PV_RL KC_O +#define PV_RT KC_P +#define PV_RD KC_LBRC +#define PV_RR KC_J +#define PV_RB KC_K +#define PV_RG KC_L +#define PV_RS KC_SCLN +#define PV_RZ KC_QUOT + +#define PV_A KC_C +#define PV_O KC_V +#define PV_E KC_N +#define PV_U KC_M + +#endif -- cgit v1.2.3-70-g09d2 From e7b6bb641c0636c01e3781fe51865fdb20014eeb Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Mon, 25 Apr 2016 00:59:47 -0400 Subject: updates default voice, prunes voices --- quantum/audio/voices.c | 50 +++++++++++++++++++++++++------------------------- quantum/audio/voices.h | 8 ++++---- 2 files changed, 29 insertions(+), 29 deletions(-) (limited to 'quantum') diff --git a/quantum/audio/voices.c b/quantum/audio/voices.c index 0b4b463c4..de9f8ae54 100644 --- a/quantum/audio/voices.c +++ b/quantum/audio/voices.c @@ -6,7 +6,7 @@ extern uint16_t envelope_index; extern float note_timbre; extern float polyphony_rate; -voice_type voice = duty_osc; +voice_type voice = default_voice; void set_voice(voice_type v) { voice = v; @@ -99,30 +99,30 @@ float voice_envelope(float frequency) { if ((envelope_index % 8) == 0) note_timbre = 0; break; - case duty_fifth_down: - note_timbre = 0.5; - if ((envelope_index % 3) == 0) - note_timbre = 0.75; - break; - case duty_fourth_down: - note_timbre = 0.0; - if ((envelope_index % 12) == 0) - note_timbre = 0.75; - if (((envelope_index % 12) % 4) != 1) - note_timbre = 0.75; - break; - case duty_third_down: - note_timbre = 0.5; - if ((envelope_index % 5) == 0) - note_timbre = 0.75; - break; - case duty_fifth_third_down: - note_timbre = 0.5; - if ((envelope_index % 5) == 0) - note_timbre = 0.75; - if ((envelope_index % 3) == 0) - note_timbre = 0.25; - break; + // case duty_fifth_down: + // note_timbre = 0.5; + // if ((envelope_index % 3) == 0) + // note_timbre = 0.75; + // break; + // case duty_fourth_down: + // note_timbre = 0.0; + // if ((envelope_index % 12) == 0) + // note_timbre = 0.75; + // if (((envelope_index % 12) % 4) != 1) + // note_timbre = 0.75; + // break; + // case duty_third_down: + // note_timbre = 0.5; + // if ((envelope_index % 5) == 0) + // note_timbre = 0.75; + // break; + // case duty_fifth_third_down: + // note_timbre = 0.5; + // if ((envelope_index % 5) == 0) + // note_timbre = 0.75; + // if ((envelope_index % 3) == 0) + // note_timbre = 0.25; + // break; default: break; diff --git a/quantum/audio/voices.h b/quantum/audio/voices.h index 66184c3a2..4b894f28d 100644 --- a/quantum/audio/voices.h +++ b/quantum/audio/voices.h @@ -16,10 +16,10 @@ typedef enum { octave_crunch, duty_osc, duty_octave_down, - duty_fifth_down, - duty_fourth_down, - duty_third_down, - duty_fifth_third_down, + // duty_fifth_down, + // duty_fourth_down, + // duty_third_down, + // duty_fifth_third_down, number_of_voices // important that this is last } voice_type; -- cgit v1.2.3-70-g09d2 From 140b97a1cd226432a8ec647004943698e3d87f0b Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Tue, 26 Apr 2016 01:16:47 -0400 Subject: adds delayed vibrato --- quantum/audio/voices.c | 31 +++++++++++++++++++++++++++++++ quantum/audio/voices.h | 2 ++ 2 files changed, 33 insertions(+) (limited to 'quantum') diff --git a/quantum/audio/voices.c b/quantum/audio/voices.c index de9f8ae54..0921bd593 100644 --- a/quantum/audio/voices.c +++ b/quantum/audio/voices.c @@ -1,5 +1,6 @@ #include "voices.h" #include "stdlib.h" +#include "vibrato_lut.h" // these are imported from audio.c extern uint16_t envelope_index; @@ -99,6 +100,36 @@ float voice_envelope(float frequency) { if ((envelope_index % 8) == 0) note_timbre = 0; break; + case delayed_vibrato: + polyphony_rate = 0; + note_timbre = TIMBRE_50; + #define VOICE_VIBRATO_DELAY 150 + #define VOICE_VIBRATO_SPEED 50 + switch (compensated_index) { + case 0 ... VOICE_VIBRATO_DELAY: + break; + default: + frequency = frequency * VIBRATO_LUT[(int)fmod((((float)compensated_index - (VOICE_VIBRATO_DELAY + 1))/1000*VOICE_VIBRATO_SPEED), VIBRATO_LUT_LENGTH)]; + break; + } + break; + // case delayed_vibrato_octave: + // polyphony_rate = 0; + // if ((envelope_index % 2) == 1) { + // note_timbre = 0.55; + // } else { + // note_timbre = 0.45; + // } + // #define VOICE_VIBRATO_DELAY 150 + // #define VOICE_VIBRATO_SPEED 50 + // switch (compensated_index) { + // case 0 ... VOICE_VIBRATO_DELAY: + // break; + // default: + // frequency = frequency * VIBRATO_LUT[(int)fmod((((float)compensated_index - (VOICE_VIBRATO_DELAY + 1))/1000*VOICE_VIBRATO_SPEED), VIBRATO_LUT_LENGTH)]; + // break; + // } + // break; // case duty_fifth_down: // note_timbre = 0.5; // if ((envelope_index % 3) == 0) diff --git a/quantum/audio/voices.h b/quantum/audio/voices.h index 4b894f28d..74c873f42 100644 --- a/quantum/audio/voices.h +++ b/quantum/audio/voices.h @@ -16,6 +16,8 @@ typedef enum { octave_crunch, duty_osc, duty_octave_down, + delayed_vibrato, + // delayed_vibrato_octave, // duty_fifth_down, // duty_fourth_down, // duty_third_down, -- cgit v1.2.3-70-g09d2 From bf56838fe99aafd37559d560e47b707a83c87588 Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Tue, 26 Apr 2016 01:17:00 -0400 Subject: adds freq LUT for future use --- quantum/audio/frequency_lut.h | 357 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 357 insertions(+) create mode 100644 quantum/audio/frequency_lut.h (limited to 'quantum') diff --git a/quantum/audio/frequency_lut.h b/quantum/audio/frequency_lut.h new file mode 100644 index 000000000..e62da5be4 --- /dev/null +++ b/quantum/audio/frequency_lut.h @@ -0,0 +1,357 @@ +#include +#include +#include + +#define FREQUENCY_LUT_LENGTH 349 + +const uint16_t FREQUENCY_LUT[FREQUENCY_LUT_LENGTH] = { +0x8E0B, +0x8C02, +0x8A00, +0x8805, +0x8612, +0x8426, +0x8241, +0x8063, +0x7E8C, +0x7CBB, +0x7AF2, +0x792E, +0x7772, +0x75BB, +0x740B, +0x7261, +0x70BD, +0x6F20, +0x6D88, +0x6BF6, +0x6A69, +0x68E3, +0x6762, +0x65E6, +0x6470, +0x6300, +0x6194, +0x602E, +0x5ECD, +0x5D71, +0x5C1A, +0x5AC8, +0x597B, +0x5833, +0x56EF, +0x55B0, +0x5475, +0x533F, +0x520E, +0x50E1, +0x4FB8, +0x4E93, +0x4D73, +0x4C57, +0x4B3E, +0x4A2A, +0x491A, +0x480E, +0x4705, +0x4601, +0x4500, +0x4402, +0x4309, +0x4213, +0x4120, +0x4031, +0x3F46, +0x3E5D, +0x3D79, +0x3C97, +0x3BB9, +0x3ADD, +0x3A05, +0x3930, +0x385E, +0x3790, +0x36C4, +0x35FB, +0x3534, +0x3471, +0x33B1, +0x32F3, +0x3238, +0x3180, +0x30CA, +0x3017, +0x2F66, +0x2EB8, +0x2E0D, +0x2D64, +0x2CBD, +0x2C19, +0x2B77, +0x2AD8, +0x2A3A, +0x299F, +0x2907, +0x2870, +0x27DC, +0x2749, +0x26B9, +0x262B, +0x259F, +0x2515, +0x248D, +0x2407, +0x2382, +0x2300, +0x2280, +0x2201, +0x2184, +0x2109, +0x2090, +0x2018, +0x1FA3, +0x1F2E, +0x1EBC, +0x1E4B, +0x1DDC, +0x1D6E, +0x1D02, +0x1C98, +0x1C2F, +0x1BC8, +0x1B62, +0x1AFD, +0x1A9A, +0x1A38, +0x19D8, +0x1979, +0x191C, +0x18C0, +0x1865, +0x180B, +0x17B3, +0x175C, +0x1706, +0x16B2, +0x165E, +0x160C, +0x15BB, +0x156C, +0x151D, +0x14CF, +0x1483, +0x1438, +0x13EE, +0x13A4, +0x135C, +0x1315, +0x12CF, +0x128A, +0x1246, +0x1203, +0x11C1, +0x1180, +0x1140, +0x1100, +0x10C2, +0x1084, +0x1048, +0x100C, +0xFD1, +0xF97, +0xF5E, +0xF25, +0xEEE, +0xEB7, +0xE81, +0xE4C, +0xE17, +0xDE4, +0xDB1, +0xD7E, +0xD4D, +0xD1C, +0xCEC, +0xCBC, +0xC8E, +0xC60, +0xC32, +0xC05, +0xBD9, +0xBAE, +0xB83, +0xB59, +0xB2F, +0xB06, +0xADD, +0xAB6, +0xA8E, +0xA67, +0xA41, +0xA1C, +0x9F7, +0x9D2, +0x9AE, +0x98A, +0x967, +0x945, +0x923, +0x901, +0x8E0, +0x8C0, +0x8A0, +0x880, +0x861, +0x842, +0x824, +0x806, +0x7E8, +0x7CB, +0x7AF, +0x792, +0x777, +0x75B, +0x740, +0x726, +0x70B, +0x6F2, +0x6D8, +0x6BF, +0x6A6, +0x68E, +0x676, +0x65E, +0x647, +0x630, +0x619, +0x602, +0x5EC, +0x5D7, +0x5C1, +0x5AC, +0x597, +0x583, +0x56E, +0x55B, +0x547, +0x533, +0x520, +0x50E, +0x4FB, +0x4E9, +0x4D7, +0x4C5, +0x4B3, +0x4A2, +0x491, +0x480, +0x470, +0x460, +0x450, +0x440, +0x430, +0x421, +0x412, +0x403, +0x3F4, +0x3E5, +0x3D7, +0x3C9, +0x3BB, +0x3AD, +0x3A0, +0x393, +0x385, +0x379, +0x36C, +0x35F, +0x353, +0x347, +0x33B, +0x32F, +0x323, +0x318, +0x30C, +0x301, +0x2F6, +0x2EB, +0x2E0, +0x2D6, +0x2CB, +0x2C1, +0x2B7, +0x2AD, +0x2A3, +0x299, +0x290, +0x287, +0x27D, +0x274, +0x26B, +0x262, +0x259, +0x251, +0x248, +0x240, +0x238, +0x230, +0x228, +0x220, +0x218, +0x210, +0x209, +0x201, +0x1FA, +0x1F2, +0x1EB, +0x1E4, +0x1DD, +0x1D6, +0x1D0, +0x1C9, +0x1C2, +0x1BC, +0x1B6, +0x1AF, +0x1A9, +0x1A3, +0x19D, +0x197, +0x191, +0x18C, +0x186, +0x180, +0x17B, +0x175, +0x170, +0x16B, +0x165, +0x160, +0x15B, +0x156, +0x151, +0x14C, +0x148, +0x143, +0x13E, +0x13A, +0x135, +0x131, +0x12C, +0x128, +0x124, +0x120, +0x11C, +0x118, +0x114, +0x110, +0x10C, +0x108, +0x104, +0x100, +0xFD, +0xF9, +0xF5, +0xF2, +0xEE +}; \ No newline at end of file -- cgit v1.2.3-70-g09d2 From e024c11f7a849a38e478cda9fb9939a838cfa2e0 Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Tue, 26 Apr 2016 13:50:04 -0400 Subject: actually resolves conflicts in rgblight.c --- quantum/rgblight.c | 5 ----- 1 file changed, 5 deletions(-) (limited to 'quantum') diff --git a/quantum/rgblight.c b/quantum/rgblight.c index 789af73d8..8c9ad7736 100644 --- a/quantum/rgblight.c +++ b/quantum/rgblight.c @@ -189,13 +189,8 @@ void rgblight_mode(uint8_t mode) { } else { rgblight_config.mode = mode; } -<<<<<<< HEAD eeconfig_update_rgblight(rgblight_config.raw); - dprintf("rgblight mode: %u\n", rgblight_config.mode); -======= - eeconfig_write_rgblight(rgblight_config.raw); xprintf("rgblight mode: %u\n", rgblight_config.mode); ->>>>>>> pr/286 if (rgblight_config.mode == 1) { rgblight_timer_disable(); } else if (rgblight_config.mode >=2 && rgblight_config.mode <=23) { -- cgit v1.2.3-70-g09d2 From 66e0323881a5a3da65e14daeec41a1e9cfbda431 Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Fri, 29 Apr 2016 12:42:55 -0400 Subject: removes extra voices, updates .hex files --- keyboard/planck/keymaps/default/keymap.c | 2 +- keyboard/planck/planck_pcb_r4.hex | 3159 ++++++++++---------- keyboard/planck/planck_pcb_r4_w_bootloader.hex | 3159 ++++++++++---------- keyboard/preonic/keymaps/default/keymap.c | 2 +- keyboard/preonic/preonic_pcb_r1.hex | 3328 +++++++++++----------- keyboard/preonic/preonic_pcb_r1_w_bootloader.hex | 3071 ++++++++++---------- quantum/audio/voices.c | 42 +- 7 files changed, 6370 insertions(+), 6393 deletions(-) (limited to 'quantum') diff --git a/keyboard/planck/keymaps/default/keymap.c b/keyboard/planck/keymaps/default/keymap.c index e120d358a..e7a9ea9e4 100644 --- a/keyboard/planck/keymaps/default/keymap.c +++ b/keyboard/planck/keymaps/default/keymap.c @@ -365,7 +365,7 @@ void play_goodbye_tone() } uint8_t starting_note = 0x0C; -int offset = 7; +int offset = 0; void process_action_user(keyrecord_t *record) { diff --git a/keyboard/planck/planck_pcb_r4.hex b/keyboard/planck/planck_pcb_r4.hex index 889af7f22..bd68d9e90 100644 --- a/keyboard/planck/planck_pcb_r4.hex +++ b/keyboard/planck/planck_pcb_r4.hex @@ -1,73 +1,73 @@ -:100000000C94FE040C9442050C9442050C94420599 -:100010000C9442050C9442050C9442050C94420544 -:100020000C9442050C9442050C94A6180C94781973 -:100030000C94DB270C9442050C9442050C94420569 -:100040000C9442050C9442050C9442050C94420514 -:100050000C9442050C9443280C9442050C944205E0 -:100060000C9442050C9442050C9442050C944205F4 -:100070000C9442050C9442050C9442050C944205E4 -:100080000C94D10E0C9442050C9442050C9442053C -:100090000C9442050C9442050C9442050C944205C4 -:1000A0000C9442050C9442050C9442059D05AD0547 -:1000B000BF05CF05D505E405F005F60504060D06D8 -:1000C0001E062E06340664069013901390139013A8 -:1000D000901390139013901390139013A713A713DA -:1000E000A713A713A713A713A713A713A713A71340 -:1000F00090139013901390139013A713A713A713A3 -:10010000A713A713901390139013A713A713A71364 -:10011000E519071AF51A071AF51A4C1A6F1AF51A83 -:10012000C41AD71ADA1DDA1D171E171E711EAF1E4C -:1001300027212721C81E2721C91FC91F8C20A320C2 -:100140002721122107634236B79BD8A71A39685670 -:1001500018AEBAAB558C1D3CB7CC5763BD6DEDFDE9 -:10016000753EF6177231BF000000803F08000000A6 -:10017000BE922449123EABAAAA2ABECDCCCC4C3E9C -:1001800000000080BEABAAAAAA3E00000000BF008B -:100190000000803F0000000000084178D3BB438787 -:1001A000D1133D190E3CC3BD4282AD2B3E68EC829B -:1001B00076BED98FE1A93E4C80EFFFBE01C4FF7F20 -:1001C0003F00000000002B0014001A00080015007A -:1001D00017001C0018000C00120013002A00290050 -:1001E00004001600070009000A000B000D000E00B5 -:1001F0000F0033003400E1001D001B000600190051 -:1002000005001100100036003700380028000530C6 -:10021000E000E200E30003302C002C00043050002A -:10022000510052004F002B0014001A000900130067 -:100230000A000D000F0018001C0033002A002900DE -:10024000040015001600170007000B00110008003D -:100250000C0012003400E1001D001B000600190014 -:1002600005000E0010003600370038002800053069 -:10027000E000E200E30003302C002C0004305000CA -:10028000510052004F002B0034003600370013009D -:100290001C0009000A00060015000F002A002900B2 -:1002A00004001200080018000C0007000B001700E3 -:1002B000110016003800E100330014000D000E009C -:1002C0001B00050010001A0019001D002800053051 -:1002D000E000E200E30003302C002C00043050006A -:1002E000510052004F0035021E021F02200221025F -:1002F0002202230224022502260227022A004C00A1 -:100300003A003B003C003D003E003F002D022E0223 -:100310002F02300231020100400041004200430040 -:10032000440045000100010001000100010001003E -:100330000100010001000100010001000100AB000B -:10034000AA00A900AE0035001E001F0020002100F9 -:100350002200230024002500260027002A004C004C -:100360003A003B003C003D003E003F002D002E00C7 -:100370002F003000310001004000410042004300E6 -:1003800044004500010001000100010001000100DE -:100390000100010001000100010001000100AB00AB -:1003A000AA00A900AE00000000000000000000004C -:1003B000000000000000000000000000000000003D -:1003C000000000000000000000000000000000002D -:1003D000000000000000000000000000000000001D -:1003E000000000000000000000000000000000000D -:1003F0000000000000000330000000000430000096 -:100400000000000000001E001E001E001E001E0056 -:100410001E001E001E001E001E001E001E0000000A -:1004200014001A000800150017001C0018000C002A -:10043000120013002F00000004001600070009003E -:100440000A000B000D000E000F00330034000D30C9 -:10045000000000000600190000000000110010005C +:100000000C94DA040C941E050C941E050C941E0529 +:100010000C941E050C941E050C941E050C941E05D4 +:100020000C941E050C941E050C94B7180C94891999 +:100030000C94EC270C941E050C941E050C941E05C4 +:100040000C941E050C941E050C941E050C941E05A4 +:100050000C941E050C9454280C941E050C941E053B +:100060000C941E050C941E050C941E050C941E0584 +:100070000C941E050C941E050C941E050C941E0574 +:100080000C94AD0E0C941E050C941E050C941E05CC +:100090000C941E050C941E050C941E050C941E0554 +:1000A0000C941E050C941E050C941E0579058905FB +:1000B0009B05AB05B105C005CC05D205E005E905FA +:1000C000FA050A0610064006F619181A061B181A31 +:1000D000061B5D1A801A061BD51AE81AEB1DEB1DCC +:1000E000281E281E821EC01E38213821D91E382104 +:1000F000DA1FDA1F9D20B4203821232107634236FE +:10010000B79BD8A71A39685618AEBAAB558C1D3CA8 +:10011000B7CC5763BD6DEDFD753EF6177231BF006C +:100120000000803F08000000BE922449123EABAAA6 +:10013000AA2ABECDCCCC4C3E00000080BEABAAAA01 +:10014000AA3E00000000BF000000803F0000000049 +:1001500000084178D3BB4387D1133D190E3CC3BD82 +:100160004282AD2B3E68EC8276BED98FE1A93E4C2F +:1001700080EFFFBE01C4FF7F3F00000000002B00A6 +:1001800014001A000800150017001C0018000C00CD +:10019000120013002A0029000400160007000900BD +:1001A0000A000B000D000E000F0033003400E100C8 +:1001B0001D001B000600190005001100100036008C +:1001C0003700380028000530E000E200E30003308B +:1001D0002C002C0004305000510052004F002B0026 +:1001E00014001A00090013000A000D000F00180087 +:1001F0001C0033002A002900040015001600170017 +:1002000007000B00110008000C0012003400E10090 +:100210001D001B000600190005000E00100036002E +:100220003700380028000530E000E200E30003302A +:100230002C002C0004305000510052004F002B00C5 +:1002400034003600370013001C0009000A000600C5 +:1002500015000F002A0029000400120008001800F1 +:100260000C0007000B001700110016003800E10019 +:10027000330014000D000E001B00050010001A00D2 +:1002800019001D0028000530E000E200E300033003 +:100290002C002C0004305000510052004F00350259 +:1002A0001E021F0220022102220223022402250232 +:1002B000260227022A004C003A003B003C003D0089 +:1002C0003E003F002D022E022F02300231020100BB +:1002D000400041004200430044004500010001008D +:1002E0000100010001000100010001000100010006 +:1002F000010001000100AB00AA00A900AE0035001A +:100300001E001F00200021002200230024002500E1 +:10031000260027002A004C003A003B003C003D002C +:100320003E003F002D002E002F0030003100010064 +:10033000400041004200430044004500010001002C +:1003400001000100010001000100010001000100A5 +:10035000010001000100AB00AA00A900AE000000EE +:10036000000000000000000000000000000000008D +:10037000000000000000000000000000000000007D +:10038000000000000000000000000000000000006D +:10039000000000000000000000000000000000005D +:1003A000000000000000000000000000000003301A +:1003B00000000000043000000000000000001E00EB +:1003C0001E001E001E001E001E001E001E001E003D +:1003D0001E001E001E00000014001A000800150078 +:1003E00017001C0018000C00120013002F00000062 +:1003F00004001600070009000A000B000D000E00A3 +:100400000F00330034000D3000000000060019001A +:1004100000000000110010000000000000000000BB +:1004200000000000000000000000000000000000CC +:1004300000000000000000000000000000000000BC +:1004400000000000000000000000000000000000AC +:10045000000000000000000000000000000000009C :10046000000000000000000000000000000000008C :10047000000000000000000000000000000000007C :10048000000000000000000000000000000000006C @@ -117,1512 +117,1529 @@ :1007400000000000000000000000000000000000A9 :100750000000000000000000000000000000000099 :100760000000000000000000000000000000000089 -:100770000000000000000000000000000000000079 -:100780000000000000000000000000000000000069 -:100790000000000000000000000000000000000059 -:1007A0000000000000000000000000000000000049 -:1007B0000000000000000000000000000000000039 -:1007C00000000000000001000050010001000100D5 -:1007D0000100010001000100010001004C000100C6 -:1007E0000100010007300630135012500030013074 -:1007F00002300C30010001000B300A3009300830A3 -:1008000001000100010001000100010001000100E0 -:1008100001000100010001000100010001000100D0 -:100820000100010001002803540068006500200059 -:1008300050006C0061006E0063006B0020004B00F4 -:100840006500790062006F006100720064000000C2 -:100850002C034F007200740068006F006C00690088 -:100860006E0065006100720020004B006500790099 -:1008700062006F00610072006400730000000403F6 -:10088000090409026D00040100A0FA090400000136 -:1008900003010100092111010001223F0007058128 -:1008A0000308000A090401000103010200092111E3 -:1008B000010001224D000705820308000A09040215 -:1008C0000001030000000921110100012236000788 -:1008D00005830308000A090403000103000000095E -:1008E00021110100012239000705840310000112C3 -:1008F00001100100000008EDFE606001000102002F -:100900000105010906A101050719E029E7150025E0 -:1009100001950875018102050819012905950575DC -:1009200001910295017503910105071900297715B9 -:10093000002501957875018102C005010980A1019A -:10094000850216010026B7001A01002AB7007510AB -:1009500095018100C0050C0901A101850316010064 -:10096000269C021A01002A9C02751095018100C084 -:1009700005010902A1010901A100050919012905C3 -:100980001500250195057501810295017503810109 -:100990000501093009311581257F95027508810609 -:1009A00009381581257F950175088106050C0A38DF -:1009B000021581257F950175088106C0C0050109D2 -:1009C00006A101050719E029E7150025019508751D -:1009D0000181029501750881010508190129059514 -:1009E000057501910295017503910105071900290B -:1009F000FF150025FF950675088100C011241FBE54 -:100A0000CFEFDAE0DEBFCDBF04B603FE24C0809195 -:100A1000190490911A04A0911B04B0911C04873012 -:100A2000904BA740B04BB9F41092190410921A04DD -:100A300010921B0410921C0414BE84B7877F84BFDD -:100A400088E10FB6F89480936000109260000FBEAA -:100A5000E0E0F8E3099513E0A0E0B1E0E4E8F3E6B4 -:100A600002C005900D92A431B107D9F714E0A4E1BA -:100A7000B3E001C01D92A931B107E1F70E94EC1566 -:100A80000C94C0310C940000279A2F988FEF9FEFA1 -:100A900090938700809386008AE08093800089E1AC -:100AA000809381000C94452D282F81110BC08091DB -:100AB0008000877F8093800010928D0010928C00C0 -:100AC0002F9808952F9880918000886080938000EF -:100AD000233019F48FEF9FEF0FC083E090E0821B6B -:100AE0009109880F991F2FEF3FEFA90102C056957A -:100AF00047958A95E2F7CA0190938D0080938C0008 -:100B00000895CF93DF93EC010E94DC28BE0180E0C2 -:100B100090E0DF91CF910C9407250F931F93462F00 -:100B200050E04E30510508F0DEC0DC01FA01EA5A0F -:100B3000FF4F12968C910C948431882309F4D3C012 -:100B400000E010E0980140E064E070E08BE292E0A9 -:100B50000E944F1281E090E00FC0882309F4C3C0C7 -:100B600000E010E0980140E066E070E08BEB91E07F -:100B70000E944F1282E090E00E948105B4C0882359 -:100B800009F4B1C000E010E0980140E068E070E0D6 -:100B90008BEE91E00E944F1284E090E0EDCF88232D -:100BA00011F083E005C083E00CC0882349F084E0A5 -:100BB0000E94842540E164E083E00E94910A93C092 -:100BC00084E00E94A525F6CF882331F085EE0E94AF -:100BD0006E1C0E949C2D87C085EE0E94361D83C02E -:100BE000882309F480C00E94E30D7DC0882309F4A6 -:100BF0007AC00E94DC0D00E010E0980140E065E062 -:100C000070E08BE492E027C0882309F46CC085E093 -:100C10000E94A5250E94040E66C0882309F463C0C3 -:100C200000E010E0980140E068E070E08BE191E0C6 -:100C30000E944F1285E00E94842555C0882309F444 -:100C400052C00E94E21200E010E0980140E068E02B -:100C500070E08BE191E00E944F1245C0882309F4B7 -:100C600042C00E94ED12EFCF8823E9F100E010E0CE -:100C7000980140E066E070E08BE891E00E944F123E -:100C800084E00E94A52583E00E94A52580E10E94C2 -:100C9000A52585E00E94A5250E94040E86E00E94FD -:100CA00084250E94C928811102C00E94A5280E94A3 -:100CB000E12890E090931804809317048068809353 -:100CC00017040E94E5280FC0882369F000E010E0B7 -:100CD000980140E066E070E08BE591E00E944F12E1 -:100CE00086E00E94A52580E090E01F910F91089575 -:100CF0000F931F932FEF89EF90E021508040904099 -:100D0000E1F700C0000000E010E0980140E065E07D -:100D100070E08BE492E00E944F121F910F910895B2 -:100D20000F931F9300E010E0980140E063E070E053 -:100D300083E091E00E944F122FEF82E597E021506F -:100D400080409040E1F700C000001F910F9108958E -:100D5000CF92DF92EF92FF920F931F93CF93DF9387 -:100D6000CDB7DEB7CC58D1090FB6F894DEBF0FBEB1 -:100D7000CDBF2091D10325FFC5C08C01FC0192811C -:100D800080910201992309F460C096E4E0E9F2E061 -:100D9000DE01A95BBF4F01900D929A95E1F7F80132 -:100DA0009081E0910001F0910101E90FF11DEE0F3A -:100DB000FF1F27E430E02C0F3D1FE20FF31F60817F -:100DC0007181680F711D882777FD8095982F0E948B -:100DD000E02E20E030E040E451E40E94452E6B011B -:100DE0007C01F801218184E090E0821B9109BC0123 -:100DF000882777FD8095982F0E94E02E9B01AC01FB -:100E0000C701B6010E94DD2D9B01AC0160E070E0DE -:100E100080E090E40E94F72F20E030E04CE551E4C0 -:100E20000E94942F4FE050E0C457DF4F0FB6F89464 -:100E3000DEBF0FBECDBFDF91CF911F910F91FF900D -:100E4000EF90DF90CF900C94EF1196E4E0E9F2E0A0 -:100E5000DE01119601900D929A95E1F7F8019081CB -:100E6000E0910001F0910101E90FF11DEE0FFF1F6C -:100E700021E030E02C0F3D1FE20FF31F60817181F4 -:100E8000680F711D882777FD8095982F0E94E02EAE -:100E900020E030E040E451E40E94452E6B017C01EB -:100EA000F801218184E090E0821B9109BC01882730 -:100EB00077FD8095982F0E94E02E9B01AC01C70121 -:100EC000B6010E94DD2D9B01AC0160E070E080E086 -:100ED00090E40E94F72F20E030E04CE551E40E94BE -:100EE000942FC457DF4F0FB6F894DEBF0FBECDBFAF -:100EF000DF91CF911F910F91FF90EF90DF90CF90F6 -:100F00000C94370EC457DF4F0FB6F894DEBF0FBEF8 -:100F1000CDBFDF91CF911F910F91FF90EF90DF90A8 -:100F2000CF90089508950E9444056E9A769A0C9485 -:100F300078060C9492070C94A8060895880F991FC0 -:100F4000FC01EA5BFF4F859194910895880F991FEA -:100F5000FC01EA53FE4F8591949108950F931F93DE -:100F6000CF93DF93EC01811520E49207A0F5C11522 -:100F700080E3D80708F0E1C0C83ED105D8F4C03EF0 -:100F8000D10508F0EEC1C83AD10578F4C53AD105CB -:100F900008F074C0C130D10509F46DC008F4DEC199 -:100FA000C430D10508F0DDC1D9C1CB3BD10508F46F -:100FB00070C0D4C1C11590E2D90708F0B9C0C115FD -:100FC00021E0D20708F0CDC1C03FD10508F4C6C169 -:100FD0008E01106506C2C13080E5D80709F4BDC096 -:100FE00068F5C13120E4D20709F4AEC050F4C03135 -:100FF00090E4D90708F0A5C0CF70DD278E01146DED -:10100000F0C1C33120E4D20709F4A4C008F49FC0A2 -:10101000C115D04509F0A2C10E944B210E94040EC7 -:101020000E9490069FEF24E38CE091502040804086 -:10103000E1F700C000000E946828D3C1C11520E676 -:10104000D20730F4C11581E5D80708F48CC02DC152 -:10105000C11590E7D90708F481C1C11520E8D2076E -:1010600008F478C1C11580E9D80708F077C1DF70AE -:101070008E01106AB6C101E010E0B3C1C53AD105D6 -:1010800009F471C1C63AD10509F070C102E810E453 -:10109000A8C1C83AD10509F46CC1C93AD10509F40F -:1010A0006BC1CA3AD10509F46AC1CB3AD10509F43A -:1010B00069C1CC3AD10509F468C1CD3AD10509F42A -:1010C00067C1C03BD10509F466C1CE3AD10509F428 -:1010D00065C1CF3AD10509F464C1C13BD10509F41A -:1010E00063C1C23BD10509F462C1C33BD10509F418 -:1010F00061C1C43BD10509F460C1C53BD10509F408 -:101100005FC1C63BD10509F45EC1C73BD10509F4F7 -:101110005DC1C83BD10509F45CC1C93BD10509F4E7 -:101120005BC1CA3BD10509F45AC100E014E459C1BE -:10113000CE019F700E94A60755C1DD278E01106C5D -:1011400050C100E011ED4DC100E010ED4AC100E0DA -:1011500012ED47C100E013ED44C18091ED038160C1 -:101160008093ED033EC10E94C928811102C00E94F4 -:10117000A5280E94E12890E090931804809317041A -:10118000C23090E5D90721F480911704816086C0B0 -:10119000C43020E5D20721F48091170482607EC01C -:1011A000C63080E5D80721F480911704846076C0AA -:1011B000C83090E5D90719F48091170427C0CA30C8 -:1011C00020E5D20721F480911704806167C0CC30FC -:1011D00080E5D80721F48091170480625FC0CE308B -:1011E00090E5D90721F480911704806457C0C0317D -:1011F00020E5D20721F48091170480684FC0C231E6 -:1012000080E5D80729F4809117048460886046C07F -:10121000C33090E5D90721F4809117048E7F3EC03A -:10122000C53020E5D20721F4809117048D7F36C0A8 -:10123000C73080E5D80721F4809117048B7F2EC03A -:10124000C93090E5D90719F48091170426C0CB3036 -:1012500020E5D20721F4809117048F7E1FC0CD3086 -:1012600080E5D80721F4809117048F7D17C0CF3017 -:1012700090E5D90721F4809117048F7B0FC0C1310D -:1012800020E5D20721F4809117048F7707C0C3317E -:10129000D04531F4809117048B7F877F80931704AA -:1012A000809117040E94E5289CC08D2F99278F708C -:1012B000992781309105D9F49E012370332702C00C -:1012C000880F991F2A95E2F79C688E0144E0000F71 -:1012D000111F4A95E1F700271370802B912B53E0E3 -:1012E000CC0FDD1F5A95E1F7C076DD272FC0823085 -:1012F000910531F4DC2FCC278E01016F106A71C08B -:101300008330910569F4CE018370992701E010E0E4 -:1013100002C0000F111F8A95E2F7C8019C680FC038 -:10132000049709F05EC0CE018370992701E010E0B8 -:1013300002C0000F111F8A95E2F7C8019A6823E0E6 -:10134000CC0FDD1F2A95E1F7C07ED7708C010C2BE6 -:101350001D2B47C0DF708E01106243C000E010E01B -:1013600040C08E013EC001E810E43BC003E810E439 -:1013700038C002EE14E435C009EE14E432C00AEEBF -:1013800014E42FC005EB14E42CC006EB14E429C0D0 -:1013900007EB14E426C00CEC14E423C00DEC14E4B9 -:1013A00020C003E815E41DC00AE815E41AC002E9EC -:1013B00015E417C004E915E414C001E216E411C0F5 -:1013C00003E216E40EC004E216E40BC005E216E4E4 -:1013D00008C006E216E405C007E216E402C00AE20D -:1013E00016E4C801DF91CF911F910F9108959CE001 -:1013F000799FF001112490E3899FE00DF11D1124E4 -:10140000E60FF11DEE0FFF1FEA53FE4F85919491F9 -:10141000803E9105E0F4803C910558F581339105BB -:1014200009F46FC048F48932910509F463C08A3227 -:10143000910509F46DC072C089339105E9F08238D5 -:101440009105D1F08533910509F44DC067C0833E05 -:10145000910581F138F4803E9105B9F0823E910505 -:10146000D9F05CC0863E910561F1873E9105A1F1FE -:1014700055C00E949E0708952091170420FD02C0C8 -:1014800021FF4CC080EE90E049C08091170480FF9E -:10149000F9CF89E390E042C08091170482FF0EC02B -:1014A0008091170484FF03C080E090E037C083EE92 -:1014B00090E034C08091170482FFF2CF82EE90E07A -:1014C0002DC08091170483FF0BC08091170484FD09 -:1014D000EBCF87EE90E022C08091170483FFF5CF19 -:1014E00086EE90E01BC08091170485FF07C089E25B -:1014F00090E014C08091170485FFF9CF85E390E058 -:101500000DC08091170486FF07C08AE290E006C0F4 -:101510008091170486FFF9CF81E390E00E94AE0727 -:101520000895CF92DF92EF92FF920F931F9301E005 -:1015300010E020E030E06801790104C0CC0CDD1C33 -:10154000EE1CFF1C8A95D2F704C0000F111F221F4A -:10155000331F6A95D2F70C291D292E293F29C090E7 -:10156000D103D090D203E090D303F090D403C022F3 -:10157000D122E222F322842FC016D106E206F3061E -:1015800041F41F910F91FF90EF90DF90CF900C945A -:1015900084251F910F91FF90EF90DF90CF900C94D6 -:1015A000A52508950C94D10A5F926F927F928F9235 -:1015B0009F92AF92BF92CF92DF92EF92FF920F93E2 -:1015C0001F93CF93DF93CDB7DEB728970FB6F8946C -:1015D000DEBF0FBECDBFCE0101966C014E0199E07A -:1015E000890E911C20E030E040E050E060E070E0C7 -:1015F00000E010E0E12CF12C6C2C5D2C88E0782EC2 -:10160000AA24A394B12CE6EDF2E0A62DB52D872DEA -:1016100001900D928A95E1F7F601819191916F0108 -:10162000FC01E07FFF27E032F10559F48F70992724 -:10163000F50102C0EE0FFF1F8A95E2F7EE2AFF2A9E -:1016400037C0E033F10559F48F709927F50102C0D6 -:10165000EE0FFF1F8A95E2F70E2B1F2B29C0E034F7 -:10166000F10559F48F709927F50102C0EE0FFF1FA5 -:101670008A95E2F76E2B7F2B1BC0E035F10559F4FC -:101680008F709927F50102C0EE0FFF1F8A95E2F7D0 -:101690004E2B5F2B0DC0E036F10551F48F7099276A -:1016A000F50102C0EE0FFF1F8A95E2F72E2B3F2BAC -:1016B000C814D90409F0A7CF84B19E2D9095892331 -:1016C00084B985B1E82AE5B887B1902F9095892330 -:1016D00087B988B1082B08B98AB1962F90958923CC -:1016E0008AB98BB1682B6BB98DB1942F90958923F2 -:1016F0008DB98EB1482B4EB980B3922F9095892326 -:1017000080BB81B3282B21BB28960FB6F894DEBF8F -:101710000FBECDBFDF91CF911F910F91FF90EF9042 -:10172000DF90CF90BF90AF909F908F907F906F9001 -:101730005F9008955F926F927F928F929F92AF9287 -:10174000BF92CF92DF92EF92FF920F931F93CF93AE -:10175000DF93CDB7DEB768970FB6F894DEBF0FBE44 -:10176000CDBF85B7806885BF85B7806885BF0E947B -:10177000D40ACE0101966C014E0199E1890E911CAB -:1017800020E030E040E050E060E070E000E010E099 -:10179000E12CF12C6C2C5D2C88E1782EAA24A394EA -:1017A000B12CEEEDF2E0A62DB52D872D01900D9216 -:1017B0008A95E1F7F601819191916F01FC01E07F3B -:1017C000FF27E032F10559F48F709927F50102C027 -:1017D000EE0FFF1F8A95E2F7EE2AFF2A37C0E033AB -:1017E000F10559F48F709927F50102C0EE0FFF1F24 -:1017F0008A95E2F70E2B1F2B29C0E034F10559F42E -:101800008F709927F50102C0EE0FFF1F8A95E2F74E -:101810006E2B7F2B1BC0E035F10559F48F70992793 -:10182000F50102C0EE0FFF1F8A95E2F74E2B5F2BEA -:101830000DC0E036F10551F48F709927F50102C013 -:10184000EE0FFF1F8A95E2F72E2B3F2BC814D90409 -:1018500009F0A7CF84B19E2D9095892384B985B1D5 -:10186000E82AE5B887B1902F9095892387B988B188 -:10187000082B08B98AB1962F909589238AB98BB124 -:10188000682B6BB98DB1942F909589238DB98EB14A -:10189000482B4EB980B3922F9095892380BB81B39A -:1018A000282B21BB10921D0310921C0310921503CC -:1018B0001092140310921F0310921E03109217032C -:1018C0001092160310922103109220031092190314 -:1018D00010921803109223031092220310921B03FC -:1018E00010921A0368960FB6F894DEBF0FBECDBFF4 -:1018F000DF91CF911F910F91FF90EF90DF90CF90EC -:10190000BF90AF909F908F907F906F905F900C945E -:1019100093077F928F929F92AF92BF92CF92DF9266 -:10192000EF92FF920F931F93CF93DF93CDB7DEB764 -:10193000A0970FB6F894DEBF0FBECDBF6E0149E190 -:10194000C40ED11C84E1E82E83E0F82E98E0792EB5 -:10195000BC2CAD2C01E010E028E1822E35E0932E66 -:10196000E6EDF2E0AB2DBA2D872D01900D928A9510 -:10197000E1F7F601819191916F019C01207F33275E -:101980002032310591F424B18F709927A80102C04B -:10199000440F551F8A95E2F7CA01922F982B94B9EC -:1019A00095B18095892385B953C02033310591F4D1 -:1019B00027B18F709927F80102C0EE0FFF1F8A959B -:1019C000E2F7CF01922F982B97B998B18095892390 -:1019D00088B93EC02034310591F42AB18F7099271F -:1019E000A80102C0440F551F8A95E2F7CA01922F41 -:1019F000982B9AB99BB1809589238BB929C0203542 -:101A0000310591F42DB18F709927F80102C0EE0FC6 -:101A1000FF1F8A95E2F7CF01922F982B9DB99EB1B7 -:101A2000809589238EB914C02036310589F420B3FE -:101A30008F709927A80102C0440F551F8A95E2F7BD -:101A4000CA01922F982B90BB91B38095892381BBBB -:101A500050EA5A95F1F7BE016F5F7F4F20E030E00A -:101A600040E050E0EEEDF2E0DE011196882D0190AD -:101A70000D928A95E1F7FB0181919191BF01FC01E3 -:101A8000E07FFF27E032F10511F4E3B113C0E0334A -:101A9000F10511F4E6B10EC0E034F10511F4E9B13D -:101AA00009C0E035F10511F4ECB104C0E036F105F0 -:101AB000B9F4EFB1F0E08F70992702C0F595E79582 -:101AC0008A95E2F7E0FD08C0C801042E02C0880F25 -:101AD000991F0A94E2F702C080E090E0282B392B8E -:101AE0004F5F5F4F4C30510509F0BCCFF70180814B -:101AF00091818217930721F03183208390927302A2 -:101B00000E94D40AF2E0EF0EF11C4CE1E41643E02F -:101B1000F40609F025CF80917302882361F181508A -:101B200080937302882339F08FE99FE00197F1F7E2 -:101B300000C0000020C08091140390911503909381 -:101B40001D0380931C0380911603909117039093BB -:101B50001F0380931E0380911803909119039093A3 -:101B600021038093200380911A0390911B0390938B -:101B70002303809322030E94990781E0A0960FB669 -:101B8000F894DEBF0FBECDBFDF91CF911F910F91B3 -:101B9000FF90EF90DF90CF90BF90AF909F908F908D -:101BA0007F900895E82FF0E0EE0FFF1FE45EFC4FFA -:101BB00080819181089508958091020481608093CD -:101BC00002040C94F728809102048E7F8093020413 -:101BD0000C94F7280E94C928811102C00E94A528F0 -:101BE0000E94F328809302043E9A809171008D7FB9 -:101BF0008093710082E0809390008AE1809391004D -:101C000081E080932603089580912603811102C00C -:101C10000E94EA0D10927603109275038091710074 -:101C20008D7F80937100809190008F7780939000DA -:101C3000109238031092370310926F0310927003C2 -:101C4000109271031092720310926E0310926D0342 -:101C5000EDE4F3E0ADE3B3E0119211921192119231 -:101C60001D921D9283E0ED36F807B1F70895CF92EB -:101C7000DF92EF92FF920F931F93CF93DF93209108 -:101C80003703222309F484C06B017C018091260371 -:101C9000811102C00E94EA0D0DE613E0C7E0D0E01A -:101CA000A7019601F80192918291729162918F0140 -:101CB0000E94412E811131C0FE01EE0FFF1FEE0F79 -:101CC000FF1FE35BFC4F1082118212821382DE0140 -:101CD000AA0FBB1FA35CBC4F11961C921E92C7306B -:101CE000D105E9F021964481558166817781408351 -:101CF000518362837383148215821682178212962F -:101D00008D919C91139711969C938E9313961C9290 -:101D10001E92129734961296E2CF219708F6809180 -:101D2000750390917603019797FD05C09093760314 -:101D30008093750304C0109276031092750380910E -:101D400075039091760320917303309174032817E3 -:101D5000390724F01092740310927303892BC1F495 -:101D6000809171008D7F80937100809190008F77BA -:101D70008093900010926F03109270031092710381 -:101D80001092720310926E0310926D03109237033B -:101D9000DF91CF911F910F91FF90EF90DF90CF9047 -:101DA00008951F920F920FB60F9211244F925F92D7 -:101DB0006F927F928F929F92AF92BF92CF92DF925B -:101DC000EF92FF922F933F934F935F936F937F9385 -:101DD0008F939F93AF93BF93CF93DF93EF93FF9333 -:101DE00080913703882309F49BC1C0917503D0917A -:101DF00076031C161D060CF093C1409027035090EB -:101E000028036090290370902A0320E030E0A901A4 -:101E1000C301B2010E94902F18160CF065C0C130AA -:101E2000D10509F452C08091730390917403BE01EF -:101E30000E9470317C0190937403809373038090AF -:101E4000390390903A03A0903B03B0903C0320E00C -:101E500030E040E85FE3C501B4010E94DD2D6093EE -:101E6000390370933A0380933B0390933C03F7014B -:101E7000EE0FFF1FEE0FFF1FE35BFC4FA30192016C -:101E800060817181828193810E94452E20E030E043 -:101E900040E05EE30E94942F9B01AC01C501B401B8 -:101EA0000E94902F18168CF4C7010196BE010E9463 -:101EB00070319093740380937303109239031092DE -:101EC0003A0310923B0310923C03E0917303F091AC -:101ED0007403EE0FFF1FEE0FFF1FE35BFC4F6081EB -:101EE000718182819381D0C0C0906F03D0907003C4 -:101EF000E0907103F090720320E030E0A901C70187 -:101F0000B6010E94412E2197882309F4A2C0FE0148 -:101F1000EE0FFF1FEE0FFF1FE35BFC4F80809180F1 -:101F2000A280B380A5019401C701B6010E94412E91 -:101F300087FF31C0A501940160E070E08CED93EC67 -:101F40000E94452E20E030E040E451E40E94452EFE -:101F500020E030E040E05FE30E94942F9B01AC0161 -:101F600060E070E080E090E40E94F72F9B01AC01FC -:101F7000C501B4010E94942F9B01AC01C701B601B9 -:101F80000E94412E87FF07C0A701960160E070E024 -:101F90008CED93E439C0A5019401C701B6010E94FC -:101FA000902F18160CF055C0A501940160E070E068 -:101FB0008CED93E40E94452E20E030E040E451E4B3 -:101FC0000E94452E20E030E040E05FE30E94942F25 -:101FD0009B01AC0160E070E080E090E40E94F72F8C -:101FE0009B01AC01C501B4010E94942F9B01AC017F -:101FF000C701B6010E94902F18165CF5A701960143 -:1020000060E070E08CED93EC0E94452E20E030E023 -:1020100040E451E40E94452E20E030E040E05FE3E0 -:102020000E94942F9B01AC0160E070E080E090E49E -:102030000E94F72F9B01AC01C701B6010E94942FAB -:1020400060936F0370937003809371039093720396 -:1020500013C0FE01EE0FFF1FEE0FFF1FE35BFC4FEF -:1020600080819181A281B38180936F0390937003EB -:10207000A0937103B093720360916F03709170032A -:102080008091710390917203209124033091250374 -:102090002F3F4FEF340731F02F5F3F4F3093250331 -:1020A000209324030E94F8126B017C0120E034E2AB -:1020B00044EF51E40E94412E87FF08C086EFC82EEE -:1020C00088E2D82E84EFE82E81E4F82E20E030E07C -:1020D00040E051E4C701B6010E94942F9B01AC017E -:1020E00060E074E284E79BE40E94452E6B017C0172 -:1020F0000E94AD2E70939700609396002091740219 -:10210000309175024091760250917702C701B60175 -:102110000E94942F0E94AD2E7093990060939800B6 -:1021200080913803882309F433C1C0903303D090E1 -:102130003403E0903503F090360320E030E0A9014D -:10214000C701B6010E94902F1816D4F58091240380 -:10215000909125038F3F2FEF920729F001969093DE -:10216000250380932403C701B6010E94F81220E0E2 -:1021700030E040E051E40E94942F9B01AC0160E00C -:1021800074E284E79BE40E94452E6B017C010E946F -:10219000AD2E709397006093960020917402309159 -:1021A00075024091760250917702C701B6010E94F4 -:1021B000942F0E94AD2E709399006093980008C0F0 -:1021C0001092970010929600109299001092980029 -:1021D00060912D0370912E036F5F7F4F70932E03DC -:1021E00060932D03209196003091970080E090E05D -:1021F000232BF1F0C0919600D09197000E94DE2E23 -:102200006B017C01BE0180E090E00E94DE2E9B010C -:10221000AC0160912F037091300380913103909154 -:1022200032030E94452E20E03FEF4FE757E410C0F5 -:102230000E94DE2E6B017C0120E030EE4FEF54E473 -:1022400060912F037091300380913103909132039C -:102250000E94942F9B01AC01C701B6010E94902FF0 -:1022600087FD96C080912B038F5F80932B0390E0B6 -:102270002091FE033091FF0382179307A0F0809115 -:102280000904882319F010922B030DC0809171006E -:102290008D7F80937100809190008F778093900064 -:1022A000109238037DC080912C03C0912B038111C3 -:1022B00028C0C0900304D0900404E0900504F0907E -:1022C000060420E030E0A901C701B6010E94902F6A -:1022D0001816BCF481E080932C0310923303109203 -:1022E00034031092350310923603C0922F03D0921C -:1022F0003003E0923103F0923203C150C0932B03BC -:1023000043C010922C031092250310922403E091F5 -:102310000004F091010448E0C49FE00DF11D112478 -:1023200080819181A281B3818093330390933403A0 -:10233000A0933503B093360320E030E040E85EE33D -:1023400064817581868197810E94942F6B017C0145 -:1023500020E030E048EC52E460917802709179021C -:1023600080917A0290917B020E94452E9B01AC01E4 -:10237000C701B6010E94942F60932F03709330031E -:10238000809331039093320310922E0310922D0309 -:102390008091020480FD04C010923803109237032C -:1023A000FF91EF91DF91CF91BF91AF919F918F916D -:1023B0007F916F915F914F913F912F91FF90EF909F -:1023C000DF90CF90BF90AF909F908F907F906F9055 -:1023D0005F904F900F900FBE0F901F901895CF9267 -:1023E000DF92EF92FF92CF93DF936B017C01EA01C2 -:1023F00080912603811102C00E94EA0D809102049F -:1024000080FF46C0809175039091760308970CF089 -:102410003FC0809171008D7F80937100809138035F -:1024200081110E94040E81E08093370310922503EE -:102430001092240320E030E0A901C701B6010E94F8 -:10244000902F1816DCF48091750390917603FC01AF -:10245000EE0FFF1FEE0FFF1FE35BFC4FC082D18228 -:10246000E282F382FC01EE0FFF1FE35CFC4FD1839D -:10247000C0830196909376038093750380917100D9 -:1024800082608093710080919000806880939000BA -:10249000DF91CF91FF90EF90DF90CF9008958F92D2 -:1024A0009F92AF92BF92CF92DF92EF92FF920F93E3 -:1024B0001F93CF93DF93EC017B01D42E4801590188 -:1024C00080912603811102C00E94EA0D80910204CE -:1024D00080FF6BC0809171008D7F8093710080912F -:1024E000370381110E94040E81E080933803D0935A -:1024F0000104C0930004F092FF03E092FE03D09227 -:1025000009048092030490920404A0920504B092FE -:1025100006041092390310923A0310923B03109272 -:102520003C0310922B0388819981AA81BB818093FF -:10253000330390933403A0933503B093360320E024 -:1025400030E040E85EE36C817D818E819F810E9456 -:10255000942F6B017C0120E030E048EC52E4609164 -:1025600078027091790280917A0290917B020E94A8 -:10257000452E9B01AC01C701B6010E94942F6093C8 -:102580002F037093300380933103909332031092A2 -:102590002E0310922D038091710082608093710050 -:1025A00080919000806880939000DF91CF911F917F -:1025B0000F91FF90EF90DF90CF90BF90AF909F90E2 -:1025C0008F9008958091770390E0019665E070E028 -:1025D0000E9470318093770308958091770390E093 -:1025E000019765E070E00E94703180937703089551 -:1025F0008F929F92AF92BF92CF92DF92EF92FF9213 -:10260000CF93DF936B017C01C0912403D09125030C -:10261000BE0180E090E00E94DE2E4B015C01A7012C -:10262000960160E070E08CE594E40E94452E9B01E9 -:10263000AC01C501B4010E94942F0E94B22E4091BA -:102640007703423009F45CC028F4442351F0413050 -:10265000E9F0FBC0433009F481C0443009F4B4C050 -:10266000F4C080E090E0A0E0BFE380937402909318 -:102670007502A0937602B09377021092270310920E -:1026800028031092290310922A03DFC01092270317 -:10269000109228031092290310922A0364317105C5 -:1026A00040F46A307105E0F520E030E040E85EE398 -:1026B0003BC0693C710508F0C0C080E090E00E941A -:1026C000DE2E20E030E040EA51E40E94DC2D20E0E4 -:1026D00030E044E353E40E94452E9B01AC010E948C -:1026E000942F20E030E040E05EE30E94942F9B01B5 -:1026F000AC0160E070E080E09EE30E94DC2D5BC0F6 -:1027000010922703109228031092290310922A0393 -:102710006432710578F4FB01EC59FF4F0C9484315D -:1027200020E030E040E05FE3C701B6010E94942F53 -:102730006B017C0180E090E0A0E0BEE38093740236 -:1027400090937502A0937602B09377027EC0A701A2 -:102750009601C701B6010E94DD2DEACF1092270332 -:10276000109228031092290310922A032AE0269F30 -:10277000A001279F500D1124CA0168EB7BE00E9445 -:102780005C31BC016C5D754077FF03C0719561954C -:102790007109882777FD8095982F0E94E02E2EE3FF -:1027A00033EC4EE259E30E94942F20E030E040ECFD -:1027B0005EE30E94DD2D6093740270937502809336 -:1027C00076029093770241C010922703109228035B -:1027D0001092290310922A03CE0183709927892B26 -:1027E000E1F0BE016170772780E090E00E94DE2E6C -:1027F00020E030E040E05EE30E94942F20E030E0F3 -:1028000040E45FE30E94DD2D6093740270937502D3 -:1028100080937602909377020CC080E090E0A0E075 -:10282000BFE38093740290937502A0937602B093F5 -:102830007702C770DD27CD2B41F4109274021092FD -:1028400075021092760210927702C701B601DF91ED -:10285000CF91FF90EF90DF90CF90BF90AF909F907F -:102860008F900895809188030895CF93DF9300D0CF -:102870001F92CDB7DEB79C0180910E04843019F50C -:1028800093E099833B832A839093E9008FEF9091A3 -:10289000E800815095FD06C095ED9A95F1F700008E -:1028A0008111F5CF8091E80085FF0DC040E050E038 -:1028B00063E070E0CE0101960E9496168091E800D8 -:1028C0008E778093E8000F900F900F90DF91CF915B -:1028D0000895CF93DF9300D01F92CDB7DEB720913C -:1028E0000E04243021F522E029839B838A8383E030 -:1028F0008093E9008FEF9091E800815095FD06C02C -:1029000095ED9A95F1F700008111F5CF8091E800DF -:1029100085FF0DC040E050E063E070E0CE0101961D -:102920000E9496168091E8008E778093E8000F90C1 -:102930000F900F90DF91CF91089520910E042430D5 -:10294000F1F422E02093E9002FEF3091E8002150CC -:1029500035FD06C035ED3A95F1F700002111F5CFB0 -:102960002091E80025FF0BC040E050E065E070E0FA -:102970000E9496168091E8008E778093E800089573 -:10298000CF93DF93EC0190910E04943009F046C090 -:10299000809186028823D9F0809187028823B9F03C -:1029A0009093E9008FEF9091E800815095FD06C06B -:1029B00095E19A95F1F700008111F5CF8091E8003B -:1029C00085FF2CC040E050E060E170E017C081E07E -:1029D0008093E9008FEF9091E800815095FD06C04B -:1029E00095ED9A95F1F700008111F5CF8091E800FF -:1029F00085FF14C040E050E068E070E0CE010E9426 -:102A000096168091E8008E778093E80080E1FE01C1 -:102A1000A8E7B3E001900D928A95E1F7DF91CF919D -:102A2000089580910D04811109C00E942B180E9405 -:102A300088188091E20084608093E20008951092EB -:102A40000D040895089508950C94D02742E061EC98 -:102A500081E00E94A51742E061EC82E00E94A51788 -:102A600042E061EC83E00E94A51742E161EC84E062 -:102A70000C94A51780911004833009F455C030F4EC -:102A8000813071F0823009F48EC008958A3009F4E3 -:102A90007AC08B3009F460C0893009F09CC020C036 -:102AA00080910F04813A09F096C08091E800877FF9 -:102AB0008093E8008091130490911404892B21F4F1 -:102AC00060E188E793E003C060E080E090E070E0C0 -:102AD0000E94E1168091E8008B778093E8000895CA -:102AE00080910F04813209F076C080911304909197 -:102AF0001404009719F0039709F06DC08091E80065 -:102B0000877F8093E8008091E80082FD05C0809176 -:102B10000E048111F8CF5FC08091F100809388038B -:102B20008091E8008B7753C080910F04813A09F0BF -:102B300052C08091130490911404892B09F04BC06A -:102B40008091E800877F8093E8008091E80080FF13 -:102B5000FCCF8091860236C080910F048132D9F576 -:102B60008091130490911404892BA9F58091E800B9 -:102B7000877F8093E8000E94DA1780911104809388 -:102B800086020C944B2180910F04813221F58091B3 -:102B9000E800877F8093E8000E94DA178091120492 -:102BA00080938903089580910F04813AA1F4809164 -:102BB000E800877F8093E8008091E80080FFFCCFE9 -:102BC000809189038093F1008091E8008E77809353 -:102BD000E8000C94DA17089584B7877F84BF88E1F2 -:102BE0000FB6F89480936000109260000FBE90E0E2 -:102BF00080E80FB6F89480936100909361000FBE57 -:102C00000E947D1B0E942B180E9488188091E20070 -:102C100084608093E20078940E940E1B0E947F1BC8 -:102C20008CE792E00E94291B80910E04853069F4A4 -:102C30000E948A2780910C048823B1F30E94B82750 -:102C4000882391F30E948016EFCF0E94871BECCF60 -:102C5000292F332723303105C9F064F421303105A1 -:102C600081F02230310509F043C08DE690E022E882 -:102C700038E042C021323105F1F02232310541F114 -:102C800037C082E190E02FEE38E036C099278130DE -:102C9000910541F08230910541F0892B49F5EEE72D -:102CA000F8E005C0E0E5F8E002C0E6E2F8E0849173 -:102CB00090E09F0121C06430D8F4E62FF0E0EE0FE1 -:102CC000FF1FEE5FFC4F2081318189E090E014C04E -:102CD000643070F470E0FB01EE0FFF1FE650FD4F13 -:102CE00020813181FB01EA50FD4F808190E004C0DA -:102CF00080E090E020E030E0FA0131832083089505 -:102D000080E189BD82E189BD09B400FEFDCF8091DB -:102D1000D8008F7D8093D8008091E00082608093FE -:102D2000E0008091E00081FDFCCF0895CF92DF921A -:102D3000EF92FF920F931F93CF93DF93EC018B01E0 -:102D40006A010E94F917811133C0C114D10439F00E -:102D5000F60180819181081B190BC80FD91FE12C46 -:102D6000F12C0115110519F18091E80085FD16C0BF -:102D70008091E8008E778093E800C114D10449F077 -:102D8000F60180819181E80EF91EF182E08285E0F2 -:102D90000FC00E94F917882321F30AC089918093FC -:102DA000F10001501109FFEFEF1AFF0ADACF80E0BE -:102DB000DF91CF911F910F91FF90EF90DF90CF9017 -:102DC000089520911504309116042617370748F00E -:102DD0006115710539F42091E8002E772093E80001 -:102DE00001C0B90140E061157105A9F120910E04FF -:102DF000222309F443C0253009F442C02091E800A1 -:102E000023FD40C02091E80022FD32C02091E8005F -:102E100020FFE9CF4091F3002091F20030E0342B05 -:102E2000FC01CF016115710559F02830310540F4DE -:102E300081918093F100615071092F5F3F4FF1CF75 -:102E400041E02830310509F040E02091E8002E777C -:102E50002093E800C8CF4111C9CF0AC080910E0469 -:102E6000882361F0853061F08091E80083FD0AC01D -:102E70008091E80082FFF2CF80E0089582E008951B -:102E800083E0089581E0089520911504309116049F -:102E90002617370748F06115710539F42091E800CD -:102EA0002E772093E80001C0B901FC0120E06115F4 -:102EB000710591F180910E04882309F440C085309A -:102EC00009F43FC08091E80083FD3DC08091E80097 -:102ED00082FD2FC08091E80080FFE9CF2091F300B0 -:102EE0008091F20090E0922B6115710559F08830C5 -:102EF000910540F424912093F100319661507109BD -:102F00000196F2CF21E0089709F020E08091E800D7 -:102F10008E778093E800CBCF2111CCCF0AC080916F -:102F20000E04882361F0853061F08091E80083FD14 -:102F30000AC08091E80082FFF2CF80E0089582E02D -:102F4000089583E0089581E00895982F973058F50B -:102F50009093E900981739F07091EC002091ED0002 -:102F60005091F00003C0242F762F50E021FF19C0AC -:102F70003091EB003E7F3093EB003091ED003D7FD0 -:102F80003093ED003091EB0031603093EB007093A3 -:102F9000EC002093ED005093F0002091EE0027FF0D -:102FA00007C09F5FD3CF8F708093E90081E00895C1 -:102FB00080E0089580910F0487FF11C08091E800A0 -:102FC00082FD05C080910E048111F8CF11C080915F -:102FD000E8008B770BC080910E04882349F0809124 -:102FE000E80080FFF8CF8091E8008E778093E800BA -:102FF00008952091E4003091E50095E64091EC00C1 -:10300000842F817040FF22C08091E80080FD1CC0A9 -:1030100080910E04882391F0853091F08091EB002F -:1030200085FD10C04091E4005091E5004217530720 -:1030300029F39A01915011F784E0089582E00895F0 -:1030400083E0089581E0089580E008954091E800CC -:1030500042FFDECF08950E9499180E94A118E0EE69 -:10306000F0E0808181608083E8EDF0E080818F77FF -:10307000808319BCA7EDB0E08C918E7F8C9380810A -:103080008F7E808310920D0408950F931F93CF932A -:10309000DF930E9499180E94A118C8EDD0E08881A2 -:1030A0008F77888388818068888388818F7D8883F3 -:1030B00019BC10920E0410920A0410920C04109283 -:1030C0000B0400EE10E0F80180818B7F8083888103 -:1030D0008160888342E060E080E00E94A517E1EE15 -:1030E000F0E080818E7F8083E2EEF0E0808181607D -:1030F0008083808188608083F80180818E7F8083D7 -:10310000888180618883DF91CF911F910F9108950D -:10311000E8EDF0E080818F7E8083E7EDF0E0808154 -:103120008160808384E082BF81E080930D040C94F1 -:103130004518E8EDF0E080818E7F80831092E200F8 -:1031400008951092DA001092E10008951F920F92F4 -:103150000FB60F9211242F933F934F935F936F936A -:103160007F938F939F93AF93BF93EF93FF93809140 -:10317000E10082FF0BC08091E20082FF07C08091D6 -:10318000E1008B7F8093E1000E940D1B8091DA00AB -:1031900080FF1FC08091D80080FF1BC08091DA00A3 -:1031A0008E7F8093DA008091D90080FF0DC080E18E -:1031B00089BD82E189BD09B400FEFDCF81E0809325 -:1031C0000E040E94111505C019BC10920E040E9435 -:1031D0001F158091E10080FF19C08091E20080FFFF -:1031E00015C08091E2008E7F8093E2008091E20022 -:1031F00080618093E2008091D80080628093D80043 -:1032000019BC85E080930E040E9423158091E10093 -:1032100084FF30C08091E20084FF2CC080E189BD32 -:1032200082E189BD09B400FEFDCF8091D8008F7D79 -:103230008093D8008091E1008F7E8093E10080919F -:10324000E2008F7E8093E2008091E20081608093B3 -:10325000E20080910A04882311F084E007C0809185 -:10326000E30087FD02C081E001C083E080930E048B -:103270000E9424158091E10083FF29C08091E20023 -:1032800083FF25C08091E100877F8093E10082E089 -:1032900080930E0410920A048091E1008E7F809347 -:1032A000E1008091E2008E7F8093E2008091E20055 -:1032B00080618093E20042E060E080E00E94A51718 -:1032C0008091F00088608093F0000E942215FF91A9 -:1032D000EF91BF91AF919F918F917F916F915F918E -:1032E0004F913F912F910F900FBE0F901F90189507 -:1032F0001F920F920FB60F9211242F933F934F936B -:103300005F936F937F938F939F93AF93BF93CF936D -:10331000DF93EF93FF93C091E900CF708091EC00B1 -:10332000D82FD17080FDD0E81092E9008091F00094 -:10333000877F8093F00078940E94BC191092E90076 -:103340008091F00088608093F000CD2BCF70C09307 -:10335000E900FF91EF91DF91CF91BF91AF919F91E4 -:103360008F917F916F915F914F913F912F910F902E -:103370000FBE0F901F9018951F93CF93DF93CDB77B -:10338000DEB7AA970FB6F894DEBF0FBECDBFEFE051 -:10339000F4E088E08E0F9091F10091938E13FBCFB3 -:1033A0000E943A158091E80083FF1FC180910F04AD -:1033B00090911004492F50E04A30510508F015C192 -:1033C000FA01E857FF4F0C948431803881F082383D -:1033D00009F00BC1809113048F708093E9008091F4 -:1033E000EB0085FB882780F91092E90006C08091E8 -:1033F0000B0490910C04911182609091E800977FEA -:103400009093E8008093F1001092F100C8C0282F3B -:103410002D7F09F0EAC0882319F0823061F0E5C001 -:1034200080911104813009F0E0C0933009F080E010 -:1034300080930C042BC080911104811127C08091CE -:1034400013048F7009F4D1C08093E9002091EB0040 -:1034500020FF1CC0933021F48091EB00806214C0E7 -:103460009091EB0090619093EB0021E030E0A90196 -:1034700002C0440F551F8A95E2F74093EA0010926C -:10348000EA008091EB0088608093EB001092E900E5 -:103490008091E800877F86C08111A7C01091110438 -:1034A0001F778091E3008078812B8093E3008091E7 -:1034B000E800877F8093E8000E94DA178091E80097 -:1034C00080FFFCCF8091E30080688093E3001111BE -:1034D00002C082E001C083E080930E0486C0805861 -:1034E000823008F082C080911104909112048C3DCA -:1034F00053E0950779F583E08A838AE289834FB7A1 -:10350000F894DE01139620E03EE051E2E32FF0E074 -:1035100050935700E49120FF03C0E295EF703F5FA6 -:10352000EF708E2F90E0EA3010F0C79601C0C09681 -:103530008D939D932F5F243149F74FBF8091E80011 -:10354000877F8093E8006AE270E0CE0101960E94D6 -:10355000E11614C0AE014F5F5F4F609113040E94EB -:103560002816BC01009709F440C09091E800977FAD -:103570009093E80089819A810E9444178091E80025 -:103580008B778093E80031C0803879F58091E8002E -:10359000877F8093E80080910A048093F1008091F6 -:1035A000E8008E778093E8000E94DA171EC0811130 -:1035B0001CC0909111049230C0F48091E800877F84 -:1035C0008093E80090930A040E94DA1780910A041D -:1035D000811106C08091E30087FD02C081E001C037 -:1035E00084E080930E040E9426158091E80083FFFA -:1035F0000AC08091E800877F8093E8008091EB000B -:1036000080628093EB00AA960FB6F894DEBF0FBEDF -:10361000CDBFDF91CF911F9108950895CF938091F1 -:103620000E048823A1F0C091E900CF709091EC00C6 -:10363000892F817090FD80E8C82B1092E90080915D -:10364000E80083FD0E94BC19CF70C093E900CF91C0 -:10365000089590938F0380938E030895E0918E03D5 -:10366000F0918F03309721F00190F081E02D0994C3 -:1036700080E00895E0918E03F0918F03309721F060 -:103680000280F381E02D09940895E0918E03F0917A -:103690008F03309721F00480F581E02D099408957F -:1036A00020918C0330918D038217930771F09093D2 -:1036B0008D0380938C03E0918E03F0918F033097FC -:1036C00021F00680F781E02D0994089520918A0366 -:1036D00030918B038217930771F090938B03809343 -:1036E0008A03E0918E03F0918F03309721F00084DC -:1036F000F185E02D0994089508950C947C1B0E9497 -:1037000004280E949A0B0E948A280C94452D4F92FF -:103710005F927F928F929F92AF92BF92CF92DF92F1 -:10372000EF92FF920F931F93CF93DF93CDB7DEB746 -:103730002A970FB6F894DEBF0FBECDBF0E94890C4A -:1037400091E9C92E93E0D92E00E010E0AA24A394B9 -:10375000B12C702E802F0E94D20D4C01F6014190A9 -:1037600051906F014826592641145104B1F40F5F5E -:103770001F4F0430110569F78FEF89838A831B82FD -:103780000E940D288160782F9D838C8349815A8106 -:103790006B818D810E94401C3AC08091ED0381FDB8 -:1037A0000E94DB0D20E030E07501022E02C0EE0C1D -:1037B000FF1C0A94E2F7C70184219521892B09F1A6 -:1037C0002E837F828E209F2091E0892809F490E04B -:1037D00098870E940D288160782F9A8789874E816B -:1037E0005F8168858A850E94401C000F111FF801C7 -:1037F000EF56FC4F80819181E826F926F182E08224 -:1038000006C02F5F3F4F2C30310571F6B0CF0E94BC -:10381000762A109190030E942E1B1817D9F00E944F -:103820002E1B809390032A960FB6F894DEBF0FBE2E -:10383000CDBFDF91CF911F910F91FF90EF90DF905F -:10384000CF90BF90AF909F908F907F905F904F9060 -:103850000C94D20A2A960FB6F894DEBF0FBECDBFE5 -:10386000DF91CF911F910F91FF90EF90DF90CF905C -:10387000BF90AF909F908F907F905F904F900895F2 -:10388000CF93DF93CDB7DEB72B970FB6F894DEBF9B -:103890000FBECDBF4F83588769877A878B87DE013C -:1038A000119686E0FD0111928A95E9F785E0FE0107 -:1038B000379601900D928A95E1F749815A816B8183 -:1038C0007C818D819E810E94E5232B960FB6F89412 -:1038D000DEBF0FBECDBFDF91CF910895CF93882378 -:1038E00009F4C2C0C82F823859F40E942E1B81FDF2 -:1038F000BBC089E30E948E260E945B2789E30CC02F -:10390000833879F40E942E1B80FDAEC083E50E94AF -:103910008E260E945B2783E50E94D026CF910C94CF -:103920005B27843859F40E942E1B82FD9DC087E4DA -:103930000E948E260E945B2787E4EECF8CEF8C0FCF -:10394000813A48F48C2F0E94AD2C81118DC08C2FB0 -:103950000E948E26E3CF80E28C0F883048F4C77037 -:1039600081E001C0880FCA95EAF70E941427D6CFDC -:103970008BE58C0F833078F4C53A29F0C63A31F0E4 -:1039800083E890E005C081E890E002C082E890E022 -:10399000CF910C94501B88E58C0F833108F064C0E4 -:1039A000C83A39F1C93A41F1CA3A49F1CB3A51F131 -:1039B000CC3A59F1CD3A61F1C03B69F1CE3A71F19F -:1039C000CF3A79F1C13B81F1C23B89F1C33B91F11F -:1039D000C43B99F1C53BA1F1C63BA9F1C73BB1F18D -:1039E000C83BB9F1C93BC1F1CA3BC9F180E090E0E5 -:1039F00038C082EE90E035C089EE90E032C08AEEA9 -:103A000090E02FC085EB90E02CC086EB90E029C0C1 -:103A100087EB90E026C08CEC90E023C08DEC90E02A -:103A200020C083E891E01DC08AE891E01AC082E9D5 -:103A300091E017C084E991E014C081E292E011C0E6 -:103A400083E292E00EC084E292E00BC085E292E055 -:103A500008C086E292E005C087E292E002C08AE2F6 -:103A600092E0CF910C94661BCF910895882309F4BE -:103A70004BC0823859F40E942E1B81FF45C089E358 -:103A80000E948E260E945B2789E30CC0833871F464 -:103A90000E942E1B80FF38C083E50E948E260E9464 -:103AA0005B2783E50E94D0260C945B27843859F469 -:103AB0000E942E1B82FF28C087E40E948E260E944F -:103AC0005B2787E4EFCF9CEF980F913A58F390E291 -:103AD000980F983050F4877091E001C0990F8A9543 -:103AE000EAF7892F0E941A27DFCF9BE5980F9330C2 -:103AF00020F480E090E00C94501B885A833120F42D -:103B000080E090E00C94661B0895882321F00E94C9 -:103B100014270C945B270895882321F00E941A270C -:103B20000C945B270895BF92CF92DF92EF92FF92A1 -:103B30000F931F93CF93DF9300D000D000D0CDB769 -:103B4000DEB725E0FC01DE01119601900D922A9569 -:103B5000E1F7FC01D08011810281258122952F702F -:103B600043815481452B09F472C31F3F21F4FFEFB9 -:103B7000DF1609F46CC37C012E830E949B07D98257 -:103B80001A8369817A81802F0E948A26182FB92E84 -:103B90000E943F260E9406252E81002319F00E94D4 -:103BA00031272E81EB2DE295EF70F0E0EE56FF4FBE -:103BB0000C9484318B2D807F9B2D9F70F92E882350 -:103BC00019F0F29480EFF822002389F0FF2009F425 -:103BD0007CC280E2810F883020F48F2D0E94142750 -:103BE00003C08F2D0E9424270E945B276EC2812F65 -:103BF0000E94361DFF2009F42AC3105E8F2D183055 -:103C000018F40E941A2702C00E942A2726960FB68F -:103C1000F894DEBF0FBECDBFDF91CF911F910F9102 -:103C2000FF90EF90DF90CF90BF900C945B278B2D8F -:103C3000807F9B2D9F70803211F4892F03C0892FC4 -:103C40008295807F112319F0113011F12BC00023D0 -:103C5000A9F0222389F1213079F526960FB6F89440 -:103C6000DEBF0FBECDBFDF91CF911F910F91FF90AF -:103C7000EF90DF90CF90BF900C944427222319F04F -:103C8000213009F4E4C28E830E9447278E819BC1B4 -:103C9000002321F0263008F0DAC20EC0253008F0EB -:103CA000D6C291C10023C9F0222331F0F7019581DA -:103CB00090FF0BC29F70958326960FB6F894DEBFD7 -:103CC0000FBECDBFDF91CF911F910F91FF90EF906D -:103CD000DF90CF90BF900C94851D222309F473C10F -:103CE00009C22B2D26952695237030E0211531052C -:103CF00021F021303105D1F0AAC2002321F0812F1B -:103D00009B2D937002C080E090E026960FB6F89449 -:103D1000DEBF0FBECDBFDF91CF911F910F91FF90FE -:103D2000EF90DF90CF90BF900C94501B002321F0B8 -:103D3000812F9B2D937002C080E090E026960FB6F5 -:103D4000F894DEBF0FBECDBFDF91CF911F910F91D1 -:103D5000FF90EF90DF90CF90BF900C94661B812F67 -:103D6000002319F00E947E2902C00E94E6292696AF -:103D70000FB6F894DEBF0FBECDBFDF91CF911F917C -:103D80000F91FF90EF90DF90CF90BF900C946B2A33 -:103D90008B2D837009F07BC0011159C2812F829550 -:103DA00086958770880F880F912F9F70C92ED12C10 -:103DB000E12CF12C082E04C0CC0CDD1CEE1CFF1CE9 -:103DC0000A94D2F714FF12C04FE050E060E070E0B8 -:103DD00004C0440F551F661F771F8A95D2F7CB0189 -:103DE000BA01609570958095909503C060E070E091 -:103DF000CB012B2D269526952370422F50E0423083 -:103E00005105D9F04330510569F16C297D298E297E -:103E10009F294130510551F126960FB6F894DEBF27 -:103E20000FBECDBFDF91CF911F910F91FF90EF900B -:103E3000DF90CF90BF900C942D256C297D298E2981 -:103E40009F2926960FB6F894DEBF0FBECDBFDF9137 -:103E5000CF911F910F91FF90EF90DF90CF90BF9087 -:103E60000C9449250E942D25C701B60126960FB650 -:103E7000F894DEBF0FBECDBFDF91CF911F910F91A0 -:103E8000FF90EF90DF90CF90BF900C94112500230E -:103E900019F08B2D817001C08695882309F4D7C154 -:103EA000812F829586958770880F880F912F9F703C -:103EB000C92ED12CE12CF12C082E04C0CC0CDD1C19 -:103EC000EE1CFF1C0A94D2F714FF12C04FE050E022 -:103ED00060E070E004C0440F551F661F771F8A958D -:103EE000D2F7CB01BA01609570958095909503C08B -:103EF00060E070E0CB012B2D269526952370422F94 -:103F000050E042305105D9F04330510569F16C2938 -:103F10007D298E299F294130510551F126960FB6F2 -:103F2000F894DEBF0FBECDBFDF91CF911F910F91EF -:103F3000FF90EF90DF90CF90BF900C9407266C29F4 -:103F40007D298E299F2926960FB6F894DEBF0FBED5 -:103F5000CDBFDF91CF911F910F91FF90EF90DF9038 -:103F6000CF90BF900C9423260E940726C701B6016C -:103F700026960FB6F894DEBF0FBECDBFDF91CF916E -:103F80001F910F91FF90EF90DF90CF90BF900C9416 -:103F9000EB25103F49F118F4103E48F491C0123F50 -:103FA00009F453C0E8F1133F09F464C089C01F70DD -:103FB0008B2D8F71002321F00E948425812F7CCED0 -:103FC0000E94A525812F26960FB6F894DEBF0FBE5E -:103FD000CDBFDF91CF911F910F91FF90EF90DF90B8 -:103FE000CF90BF900C948C1D0023B1F0253008F0C9 -:103FF0002EC18B2D8F7126960FB6F894DEBF0FBEA3 -:10400000CDBFDF91CF911F910F91FF90EF90DF9087 -:10401000CF90BF900C94CA25263008F018C1E9CF84 -:104020000023A9F08B2D8F7126960FB6F894DEBF72 -:104030000FBECDBFDF91CF911F910F91FF90EF90F9 -:10404000DF90CF90BF900C948425002359F38B2DE3 -:104050008F7126960FB6F894DEBF0FBECDBFDF91ED -:10406000CF911F910F91FF90EF90DF90CF90BF9075 -:104070000C94A525002399F08B2D8F7126960FB6F1 -:10408000F894DEBF0FBECDBFDF91CF911F910F918E -:10409000FF90EF90DF90CF90BF900C946F25269605 +:100770000000000000000000000000000000010078 +:100780000050010001000100010001000100010012 +:10079000010001004C00010001000100073006309B +:1007A000135012500030013002300C3001000100B3 +:1007B0000B300A300930083001000100010001004F +:1007C0000100010001000100010001000100010021 +:1007D00001000100010001000100010001002803E7 +:1007E000540068006500200050006C0061006E003D +:1007F00063006B0020004B006500790062006F0011 +:1008000061007200640000002C034F00720074004D +:1008100068006F006C0069006E0065006100720086 +:1008200020004B006500790062006F0061007200DB +:100830006400730000000403090409026D00040150 +:1008400000A0FA09040000010301010009211101BF +:100850000001223F000705810308000A0904010086 +:100860000103010200092111010001224D000705C9 +:10087000820308000A0904020001030000000921A4 +:10088000110100012236000705830308000A09044C +:1008900003000103000000092111010001223900B9 +:1008A000070584031000011201100100000008ED8B +:1008B000FE606001000102000105010906A10105B9 +:1008C0000719E029E7150025019508750181020542 +:1008D0000819012905950575019102950175039186 +:1008E0000105071900297715002501957875018103 +:1008F00002C005010980A101850216010026B7008A +:100900001A01002AB700751095018100C0050C0975 +:1009100001A1018503160100269C021A01002A9CF0 +:1009200002751095018100C005010902A1010901AC +:10093000A100050919012905150025019505750175 +:100940008102950175038101050109300931158185 +:10095000257F95027508810609381581257F950147 +:1009600075088106050C0A38021581257F950175E9 +:10097000088106C0C005010906A101050719E02983 +:10098000E71500250195087501810295017508811B +:100990000105081901290595057501910295017553 +:1009A0000391010507190029FF150025FF9506751C +:1009B000088100C011241FBECFEFDAE0DEBFCDBF3B +:1009C00004B603FE24C08091690490916A04A0914A +:1009D0006B04B0916C048730904BA740B04BB9F4D6 +:1009E0001092690410926A0410926B0410926C04C5 +:1009F00014BE84B7877F84BF88E10FB6F8948093D4 +:100A00006000109260000FBEE0E0F8E3099513E08B +:100A1000A0E0B1E0E2E4F4E602C005900D92A23657 +:100A2000B107D9F714E0A2E6B3E001C01D92A936E0 +:100A3000B107E1F70E94FD150C941F320C940000E1 +:100A4000279A2F988FEF9FEF9093870080938600CF +:100A50008AE08093800089E1809381000C94562D78 +:100A6000282F81110BC080918000877F80938000A8 +:100A700010928D0010928C002F9808952F988091DD +:100A80008000886080938000233019F48FEF9FEFFF +:100A90000FC083E090E0821B9109880F991F2FEF10 +:100AA0003FEFA90102C0569547958A95E2F7CA0122 +:100AB00090938D0080938C000895CF93DF93EC0189 +:100AC0000E94ED28BE0180E090E0DF91CF910C9470 +:100AD00018250F931F93462F50E04E30510508F014 +:100AE000DEC0DC01FA01EA5AFF4F12968C910C9499 +:100AF000E331882309F4D3C000E010E0980140E01E +:100B000064E070E089E292E00E942B1281E090E0C4 +:100B10000FC0882309F4C3C000E010E0980140E052 +:100B200066E070E089EB91E00E942B1282E090E099 +:100B30000E945D05B4C0882309F4B1C000E010E054 +:100B4000980140E068E070E089EE91E00E942B128D +:100B500084E090E0EDCF882311F083E005C083E0CE +:100B60000CC0882349F084E00E94952540E164E0B0 +:100B700083E00E946D0A93C084E00E94B625F6CF00 +:100B8000882331F085EE0E947F1C0E94AD2D87C026 +:100B900085EE0E94471D83C0882309F480C00E940F +:100BA000BF0D7DC0882309F47AC00E94B80D00E013 +:100BB00010E0980140E065E070E089E492E027C031 +:100BC000882309F46CC085E00E94B6250E94E00DE0 +:100BD00066C0882309F463C000E010E0980140E09B +:100BE00068E070E089E191E00E942B1285E00E94AC +:100BF000952555C0882309F452C00E94BE1200E01A +:100C000010E0980140E068E070E089E191E00E9426 +:100C10002B1245C0882309F442C00E94C912EFCFAD +:100C20008823E9F100E010E0980140E066E070E020 +:100C300089E891E00E942B1284E00E94B62583E0AF +:100C40000E94B62580E10E94B62585E00E94B62567 +:100C50000E94E00D86E00E9495250E94DA2881110D +:100C600002C00E94B6280E94F22890E09093680487 +:100C7000809367048068809367040E94F6280FC001 +:100C8000882369F000E010E0980140E066E070E041 +:100C900089E591E00E942B1286E00E94B62580E053 +:100CA00090E01F910F9108950F931F932FEF89EFFD +:100CB00090E0215080409040E1F700C0000000E04B +:100CC00010E0980140E065E070E089E492E00E9465 +:100CD0002B121F910F9108950F931F9300E010E0C6 +:100CE000980140E063E070E081E091E00E942B1207 +:100CF0002FEF82E597E0215080409040E1F700C05F +:100D000000001F910F910895CF92DF92EF92FF9212 +:100D10000F931F93CF93DF93CDB7DEB7CC58D10994 +:100D20000FB6F894DEBF0FBECDBF2091210425FF82 +:100D3000C5C08C01FC01928180910001992309F4C6 +:100D400060C096E4EEE8F2E0DE01A95BBF4F0190DF +:100D50000D929A95E1F7F8019081E0916203F0918C +:100D60006303E90FF11DEE0FFF1F27E430E02C0FA6 +:100D70003D1FE20FF31F60817181680F711D88278D +:100D800077FD8095982F0E94F12E20E030E040E41E +:100D900051E40E94562E6B017C01F801218184E010 +:100DA00090E0821B9109BC01882777FD8095982FE0 +:100DB0000E94F12E9B01AC01C701B6010E94EE2DED +:100DC0009B01AC0160E070E080E090E40E94643040 +:100DD00020E030E04CE551E40E9401304FE050E06B +:100DE000C457DF4F0FB6F894DEBF0FBECDBFDF9103 +:100DF000CF911F910F91FF90EF90DF90CF900C94C7 +:100E0000CB1196E4EEE8F2E0DE01119601900D922E +:100E10009A95E1F7F8019081E0916203F091630304 +:100E2000E90FF11DEE0FFF1F21E030E02C0F3D1FF9 +:100E3000E20FF31F60817181680F711D882777FDB4 +:100E40008095982F0E94F12E20E030E040E451E49C +:100E50000E94562E6B017C01F801218184E090E014 +:100E6000821B9109BC01882777FD8095982F0E94ED +:100E7000F12E9B01AC01C701B6010E94EE2D9B0132 +:100E8000AC0160E070E080E090E40E94643020E01B +:100E900030E04CE551E40E940130C457DF4F0FB6FB +:100EA000F894DEBF0FBECDBFDF91CF911F910F91A0 +:100EB000FF90EF90DF90CF900C94130EC457DF4F4C +:100EC0000FB6F894DEBF0FBECDBFDF91CF911F915B +:100ED0000F91FF90EF90DF90CF90089508950E94BA +:100EE00020056E9A769A0C9454060C946E070C9416 +:100EF00084060895880F991FFC01E250F040859107 +:100F000094910895880F991FFC01E258FE4F859136 +:100F1000949108950F931F93CF93DF93EC01811564 +:100F200020E49207A0F5C11580E3D80708F0E1C0DE +:100F3000C83ED105D8F4C03ED10508F0EEC1C83A8C +:100F4000D10578F4C53AD10508F074C0C130D10597 +:100F500009F46DC008F4DEC1C430D10508F0DDC16C +:100F6000D9C1CB3BD10508F470C0D4C1C11590E202 +:100F7000D90708F0B9C0C11521E0D20708F0CDC1EA +:100F8000C03FD10508F4C6C18E01106506C2C1304C +:100F900080E5D80709F4BDC068F5C13120E4D20767 +:100FA00009F4AEC050F4C03190E4D90708F0A5C0F0 +:100FB000CF70DD278E01146DF0C1C33120E4D2075C +:100FC00009F4A4C008F49FC0C115D04509F0A2C11E +:100FD0000E945C210E94E00D0E946C069FEF24E3BA +:100FE0008CE0915020408040E1F700C000000E945A +:100FF0007928D3C1C11520E6D20730F4C11581E5A7 +:10100000D80708F48CC02DC1C11590E7D90708F4A2 +:1010100081C1C11520E8D20708F478C1C11580E963 +:10102000D80708F077C1DF708E01106AB6C101E001 +:1010300010E0B3C1C53AD10509F471C1C63AD10572 +:1010400009F070C102E810E4A8C1C83AD10509F45A +:101050006CC1C93AD10509F46BC1CA3AD10509F48A +:101060006AC1CB3AD10509F469C1CC3AD10509F47A +:1010700068C1CD3AD10509F467C1C03BD10509F477 +:1010800066C1CE3AD10509F465C1CF3AD10509F45C +:1010900064C1C13BD10509F463C1C23BD10509F468 +:1010A00062C1C33BD10509F461C1C43BD10509F458 +:1010B00060C1C53BD10509F45FC1C63BD10509F448 +:1010C0005EC1C73BD10509F45DC1C83BD10509F438 +:1010D0005CC1C93BD10509F45BC1CA3BD10509F428 +:1010E0005AC100E014E459C1CE019F700E948207EA +:1010F00055C1DD278E01106C50C100E011ED4DC1CE +:1011000000E010ED4AC100E012ED47C100E013ED30 +:1011100044C180913D04816080933D043EC10E94A2 +:10112000DA28811102C00E94B6280E94F22890E0BD +:101130009093680480936704C23090E5D90721F446 +:1011400080916704816086C0C43020E5D20721F415 +:101150008091670482607EC0C63080E5D80721F4A4 +:1011600080916704846076C0C83090E5D90719F48F +:101170008091670427C0CA3020E5D20721F480910E +:101180006704806167C0CC3080E5D80721F4809186 +:10119000670480625FC0CE3090E5D90721F480916A +:1011A0006704806457C0C03120E5D20721F48091E4 +:1011B000670480684FC0C23180E5D80729F4809168 +:1011C00067048460886046C0C33090E5D90721F485 +:1011D000809167048E7F3EC0C53020E5D20721F4A0 +:1011E000809167048D7F36C0C73080E5D80721F431 +:1011F000809167048B7F2EC0C93090E5D90719F420 +:101200008091670426C0CB3020E5D20721F480917D +:1012100067048F7E1FC0CD3080E5D80721F4809110 +:1012200067048F7D17C0CF3090E5D90721F48091F6 +:1012300067048F7B0FC0C13120E5D20721F4809174 +:1012400067048F7707C0C331D04531F480916704BC +:101250008B7F877F80936704809167040E94F628C4 +:101260009CC08D2F99278F70992781309105D9F4D3 +:101270009E012370332702C0880F991F2A95E2F739 +:101280009C688E0144E0000F111F4A95E1F700278A +:101290001370802B912B53E0CC0FDD1F5A95E1F793 +:1012A000C076DD272FC08230910531F4DC2FCC27AA +:1012B0008E01016F106A71C08330910569F4CE010F +:1012C0008370992701E010E002C0000F111F8A957A +:1012D000E2F7C8019C680FC0049709F05EC0CE0118 +:1012E0008370992701E010E002C0000F111F8A955A +:1012F000E2F7C8019A6823E0CC0FDD1F2A95E1F7D9 +:10130000C07ED7708C010C2B1D2B47C0DF708E0167 +:10131000106243C000E010E040C08E013EC001E812 +:1013200010E43BC003E810E438C002EE14E435C01A +:1013300009EE14E432C00AEE14E42FC005EB14E405 +:101340002CC006EB14E429C007EB14E426C00CEC17 +:1013500014E423C00DEC14E420C003E815E41DC020 +:101360000AE815E41AC002E915E417C004E915E417 +:1013700014C001E216E411C003E216E40EC004E258 +:1013800016E40BC005E216E408C006E216E405C048 +:1013900007E216E402C00AE216E4C801DF91CF9129 +:1013A0001F910F9108959CE0799FF001112490E323 +:1013B000899FE00DF11D1124E60FF11DEE0FFF1FB7 +:1013C000E258FE4F85919491803E9105E0F4803C77 +:1013D000910558F58133910509F46FC048F48932BD +:1013E000910509F463C08A32910509F46DC072C099 +:1013F00089339105E9F082389105D1F08533910563 +:1014000009F44DC067C0833E910581F138F4803EF8 +:101410009105B9F0823E9105D9F05CC0863E9105F8 +:1014200061F1873E9105A1F155C00E947A070895A8 +:101430002091670420FD02C021FF4CC080EE90E0A7 +:1014400049C08091670480FFF9CF89E390E042C0F2 +:101450008091670482FF0EC08091670484FF03C0FF +:1014600080E090E037C083EE90E034C08091670464 +:1014700082FFF2CF82EE90E02DC08091670483FF5F +:101480000BC08091670484FDEBCF87EE90E022C013 +:101490008091670483FFF5CF86EE90E01BC08091BA +:1014A000670485FF07C089E290E014C0809167045B +:1014B00085FFF9CF85E390E00DC08091670486FF3A +:1014C00007C08AE290E006C08091670486FFF9CFEA +:1014D00081E390E00E948A070895CF92DF92EF9215 +:1014E000FF920F931F9301E010E020E030E06801CD +:1014F000790104C0CC0CDD1CEE1CFF1C8A95D2F7D0 +:1015000004C0000F111F221F331F6A95D2F70C2948 +:101510001D292E293F29C0902104D0902204E0905B +:101520002304F0902404C022D122E222F322842F4B +:10153000C016D106E206F30641F41F910F91FF9009 +:10154000EF90DF90CF900C9495251F910F91FF9015 +:10155000EF90DF90CF900C94B62508950C94AD0ACF +:101560005F926F927F928F929F92AF92BF92CF9233 +:10157000DF92EF92FF920F931F93CF93DF93CDB73C +:10158000DEB728970FB6F894DEBF0FBECDBFCE01F1 +:1015900001966C014E0199E0890E911C20E030E02B +:1015A00040E050E060E070E000E010E0E12CF12C61 +:1015B0006C2C5D2C88E0782EAA24A394B12CE4ED49 +:1015C000F2E0A62DB52D872D01900D928A95E1F7B9 +:1015D000F601819191916F01FC01E07FFF27E032DC +:1015E000F10559F48F709927F50102C0EE0FFF1F26 +:1015F0008A95E2F7EE2AFF2A37C0E033F10559F465 +:101600008F709927F50102C0EE0FFF1F8A95E2F750 +:101610000E2B1F2B29C0E034F10559F48F70992748 +:10162000F50102C0EE0FFF1F8A95E2F76E2B7F2BAC +:101630001BC0E035F10559F48F709927F50102C000 +:10164000EE0FFF1F8A95E2F74E2B5F2B0DC0E036A1 +:10165000F10551F48F709927F50102C0EE0FFF1FBD +:101660008A95E2F72E2B3F2BC814D90409F0A7CF97 +:1016700084B19E2D9095892384B985B1E82AE5B877 +:1016800087B1902F9095892387B988B1082B08B925 +:101690008AB1962F909589238AB98BB1682B6BB943 +:1016A0008DB1942F909589238DB98EB1482B4EB969 +:1016B00080B3922F9095892380BB81B3282B21BBC7 +:1016C00028960FB6F894DEBF0FBECDBFDF91CF9145 +:1016D0001F910F91FF90EF90DF90CF90BF90AF9050 +:1016E0009F908F907F906F905F9008955F926F9220 +:1016F0007F928F929F92AF92BF92CF92DF92EF92A2 +:10170000FF920F931F93CF93DF93CDB7DEB7689708 +:101710000FB6F894DEBF0FBECDBF85B7806885BF1A +:1017200085B7806885BF0E94B00ACE0101966C0122 +:101730004E0199E1890E911C20E030E040E050E03C +:1017400060E070E000E010E0E12CF12C6C2C5D2CEE +:1017500088E1782EAA24A394B12CECEDF2E0A62D1A +:10176000B52D872D01900D928A95E1F7F6018191B3 +:1017700091916F01FC01E07FFF27E032F10559F400 +:101780008F709927F50102C0EE0FFF1F8A95E2F7CF +:10179000EE2AFF2A37C0E033F10559F48F709927FC +:1017A000F50102C0EE0FFF1F8A95E2F70E2B1F2BEB +:1017B00029C0E034F10559F48F709927F50102C072 +:1017C000EE0FFF1F8A95E2F76E2B7F2B1BC0E035D3 +:1017D000F10559F48F709927F50102C0EE0FFF1F34 +:1017E0008A95E2F74E2B5F2B0DC0E036F10551F4E0 +:1017F0008F709927F50102C0EE0FFF1F8A95E2F75F +:101800002E2B3F2BC814D90409F0A7CF84B19E2DED +:101810009095892384B985B1E82AE5B887B1902FDE +:101820009095892387B988B1082B08B98AB1962F7A +:10183000909589238AB98BB1682B6BB98DB1942FA0 +:10184000909589238DB98EB1482B4EB980B3922FD4 +:101850009095892380BB81B3282B21BB10926D0307 +:1018600010926C03109265031092640310926F0340 +:1018700010926E0310926703109266031092710328 +:101880001092700310926903109268031092730310 +:101890001092720310926B0310926A0368960FB64F +:1018A000F894DEBF0FBECDBFDF91CF911F910F9196 +:1018B000FF90EF90DF90CF90BF90AF909F908F9070 +:1018C0007F906F905F900C946F077F928F929F92A2 +:1018D000AF92BF92CF92DF92EF92FF920F931F933E +:1018E000CF93DF93CDB7DEB7A0970FB6F894DEBFE6 +:1018F0000FBECDBF6E0149E1C40ED11C84E6E82EB7 +:1019000083E0F82E98E0792EBC2CAD2C01E010E09D +:1019100028E1822E35E0932EE4EDF2E0AB2DBA2DD6 +:10192000872D01900D928A95E1F7F60181919191B1 +:101930006F019C01207F33272032310591F424B1BF +:101940008F709927A80102C0440F551F8A95E2F7AE +:10195000CA01922F982B94B995B18095892385B9A6 +:1019600053C02033310591F427B18F709927F801C6 +:1019700002C0EE0FFF1F8A95E2F7CF01922F982B3E +:1019800097B998B18095892388B93EC02034310534 +:1019900091F42AB18F709927A80102C0440F551FF6 +:1019A0008A95E2F7CA01922F982B9AB99BB180953C +:1019B00089238BB929C02035310591F42DB18F7061 +:1019C0009927F80102C0EE0FFF1F8A95E2F7CF01B9 +:1019D000922F982B9DB99EB1809589238EB914C002 +:1019E0002036310589F420B38F709927A80102C0F1 +:1019F000440F551F8A95E2F7CA01922F982B90BB8E +:101A000091B38095892381BB50EA5A95F1F7BE01C5 +:101A10006F5F7F4F20E030E040E050E0ECEDF2E01F +:101A2000DE011196882D01900D928A95E1F7FB0158 +:101A300081919191BF01FC01E07FFF27E032F10528 +:101A400011F4E3B113C0E033F10511F4E6B10EC0B7 +:101A5000E034F10511F4E9B109C0E035F10511F404 +:101A6000ECB104C0E036F105B9F4EFB1F0E08F70ED +:101A7000992702C0F595E7958A95E2F7E0FD08C041 +:101A8000C801042E02C0880F991F0A94E2F702C011 +:101A900080E090E0282B392B4F5F5F4F4C30510591 +:101AA00009F0BCCFF701808191818217930721F063 +:101AB00031832083909271020E94B00AF2E0EF0E0F +:101AC000F11C4CE6E41643E0F40609F025CF8091C2 +:101AD0007102882361F1815080937102882339F06B +:101AE0008FE99FE00197F1F700C0000020C08091CE +:101AF00064039091650390936D0380936C038091D0 +:101B000066039091670390936F0380936E038091B7 +:101B1000680390916903909371038093700380919F +:101B20006A0390916B0390937303809372030E94F6 +:101B3000750781E0A0960FB6F894DEBF0FBECDBF4B +:101B4000DF91CF911F910F91FF90EF90DF90CF9099 +:101B5000BF90AF909F908F907F900895E82FF0E016 +:101B6000EE0FFF1FE459FC4F808191810895089585 +:101B7000809152048160809352040C9408298091D2 +:101B800052048E7F809352040C9408290E94DA2814 +:101B9000811102C00E94B6280E9404298093520439 +:101BA0003E9A809171008D7F8093710082E08093D6 +:101BB00090008AE18093910081E0809376030895FC +:101BC00080917603811102C00E94C60D1092C60357 +:101BD0001092C503809171008D7F80937100809178 +:101BE00090008F7780939000109288031092870363 +:101BF0001092BF031092C0031092C1031092C2034F +:101C00001092BE031092BD03EDE9F3E0ADE8B3E03E +:101C100011921192119211921D921D9283E0ED3B4F +:101C2000F807B1F70895CF92DF92EF92FF920F93EA +:101C30001F93CF93DF9320918703222309F484C05D +:101C40006B017C0180917603811102C00E94C60D58 +:101C50000DEB13E0C7E0D0E0A7019601F8019291E7 +:101C60008291729162918F010E94522E811131C036 +:101C7000FE01EE0FFF1FEE0FFF1FE356FC4F108219 +:101C8000118212821382DE01AA0FBB1FA357BC4F21 +:101C900011961C921E92C730D105E9F0219644811D +:101CA0005581668177814083518362837383148277 +:101CB00015821682178212968D919C911397119618 +:101CC0009C938E9313961C921E92129734961296A2 +:101CD000E2CF219708F68091C5039091C603019742 +:101CE00097FD05C09093C6038093C50304C010926E +:101CF000C6031092C5038091C5039091C60320913D +:101D0000C3033091C4032817390724F01092C40389 +:101D10001092C303892BC1F4809171008D7F809351 +:101D20007100809190008F77809390001092BF0394 +:101D30001092C0031092C1031092C2031092BE030E +:101D40001092BD0310928703DF91CF911F910F91E5 +:101D5000FF90EF90DF90CF9008951F920F920FB6F3 +:101D60000F9211244F925F926F927F928F929F9267 +:101D7000AF92BF92CF92DF92EF92FF922F933F9359 +:101D80004F935F936F937F938F939F93AF93BF9383 +:101D9000CF93DF93EF93FF9380918703882309F418 +:101DA0009BC1C091C503D091C6031C161D060CF043 +:101DB00093C14090770350907803609079037090BE +:101DC0007A0320E030E0A901C301B2010E94FD2F97 +:101DD00018160CF065C0C130D10509F452C08091CD +:101DE000C3039091C403BE010E94CF317C01909344 +:101DF000C4038093C3038090890390908A03A090CA +:101E00008B03B0908C0320E030E040E85FE3C50135 +:101E1000B4010E94EE2D6093890370938A0380932E +:101E20008B0390938C03F701EE0FFF1FEE0FFF1F44 +:101E3000E356FC4FA30192016081718182819381FD +:101E40000E94562E20E030E040E05EE30E94013028 +:101E50009B01AC01C501B4010E94FD2F18168CF442 +:101E6000C7010196BE010E94CF319093C4038093B5 +:101E7000C3031092890310928A0310928B0310926D +:101E80008C03E091C303F091C403EE0FFF1FEE0F2C +:101E9000FF1FE356FC4F6081718182819381D0C026 +:101EA000C090BF03D090C003E090C103F090C20384 +:101EB00020E030E0A901C701B6010E94522E21970F +:101EC000882309F4A2C0FE01EE0FFF1FEE0FFF1FD3 +:101ED000E356FC4F80809180A280B380A5019401DD +:101EE000C701B6010E94522E87FF31C0A50194019F +:101EF00060E070E08CED93EC0E94562E20E030E024 +:101F000040E451E40E94562E20E030E040E05FE3E0 +:101F10000E9401309B01AC0160E070E080E090E441 +:101F20000E9464309B01AC01C501B4010E940130E4 +:101F30009B01AC01C701B6010E94522E87FF07C06A +:101F4000A701960160E070E08CED93E439C0A50133 +:101F50009401C701B6010E94FD2F18160CF055C060 +:101F6000A501940160E070E08CED93E40E94562E90 +:101F700020E030E040E451E40E94562E20E030E0C2 +:101F800040E05FE30E9401309B01AC0160E070E043 +:101F900080E090E40E9464309B01AC01C501B40173 +:101FA0000E9401309B01AC01C701B6010E94FD2FC8 +:101FB00018165CF5A701960160E070E08CED93ECDB +:101FC0000E94562E20E030E040E451E40E94562E5C +:101FD00020E030E040E05FE30E9401309B01AC0173 +:101FE00060E070E080E090E40E9464309B01AC010E +:101FF000C701B6010E9401306093BF037093C00314 +:102000008093C1039093C20313C0FE01EE0FFF1F24 +:10201000EE0FFF1FE356FC4F80819181A281B381B7 +:102020008093BF039093C003A093C103B093C203F6 +:102030006091BF037091C0038091C1039091C2036E +:1020400020917403309175032F3F4FEF340731F027 +:102050002F5F3F4F30937503209374030E94D41277 +:102060006B017C0120E034E244EF51E40E94522EE7 +:1020700087FF08C086EFC82E88E2D82E84EFE82EAE +:1020800081E4F82E20E030E040E051E4C701B601E1 +:102090000E9401309B01AC0160E074E284E79BE4A4 +:1020A0000E94562E6B017C010E94BE2E70939700F9 +:1020B00060939600209172023091730240917402F5 +:1020C00050917502C701B6010E9401300E94BE2ED8 +:1020D000709399006093980080918803882309F495 +:1020E00033C1C0908303D0908403E0908503F090C7 +:1020F000860320E030E0A901C701B6010E94FD2F50 +:102100001816D4F580917403909175038F3F2FEFCB +:10211000920729F001969093750380937403C70189 +:10212000B6010E94D41220E030E040E051E40E9469 +:1021300001309B01AC0160E074E284E79BE40E9403 +:10214000562E6B017C010E94BE2E70939700609307 +:102150009600209172023091730240917402509166 +:102160007502C701B6010E9401300E94BE2E709315 +:1021700099006093980008C0109297001092960002 +:10218000109299001092980060917D0370917E03E7 +:102190006F5F7F4F70937E0360937D032091960065 +:1021A0003091970080E090E0232BF1F0C0919600F1 +:1021B000D09197000E94EF2E6B017C01BE0180E060 +:1021C00090E00E94EF2E9B01AC0160917F03709123 +:1021D000800380918103909182030E94562E20E01B +:1021E0003FEF4FE757E410C00E94EF2E6B017C01D8 +:1021F00020E030EE4FEF54E460917F037091800354 +:1022000080918103909182030E9401309B01AC0177 +:10221000C701B6010E94FD2F87FD96C080917B0308 +:102220008F5F80937B0390E020914E0430914F04A8 +:1022300082179307A0F080915904882319F0109217 +:102240007B030DC0809171008D7F80937100809120 +:1022500090008F7780939000109288037DC08091CA +:102260007C03C0917B03811128C0C0905304D0909F +:102270005404E0905504F090560420E030E0A901A9 +:10228000C701B6010E94FD2F1816BCF481E08093AF +:102290007C031092830310928403109285031092A2 +:1022A0008603C0927F03D0928003E0928103F09274 +:1022B0008203C150C0937B0343C010927C031092F1 +:1022C000750310927403E0915004F091510448E0BA +:1022D000C49FE00DF11D112480819181A281B38101 +:1022E0008093830390938403A0938503B093860324 +:1022F00020E030E040E85EE364817581868197816B +:102300000E9401306B017C0120E030E048EC52E497 +:1023100060917602709177028091780290917902B3 +:102320000E94562E9B01AC01C701B6010E940130EC +:1023300060937F0370938003809381039093820363 +:1023400010927E0310927D038091520480FD04C0A0 +:102350001092880310928703FF91EF91DF91CF9144 +:10236000BF91AF919F918F917F916F915F914F91AD +:102370003F912F91FF90EF90DF90CF90BF90AF9063 +:102380009F908F907F906F905F904F900F900FBEB7 +:102390000F901F901895CF92DF92EF92FF92CF93FC +:1023A000DF936B017C01EA0180917603811102C009 +:1023B0000E94C60D8091520480FF46C08091C503E3 +:1023C0009091C60308970CF03FC0809171008D7FFB +:1023D000809371008091880381110E94E00D81E05B +:1023E00080938703109275031092740320E030E00D +:1023F000A901C701B6010E94FD2F1816DCF48091D7 +:10240000C5039091C603FC01EE0FFF1FEE0FFF1FE7 +:10241000E356FC4FC082D182E282F382FC01EE0FD0 +:10242000FF1FE357FC4FD183C08301969093C603EF +:102430008093C503809171008260809371008091C8 +:102440009000806880939000DF91CF91FF90EF9093 +:10245000DF90CF9008958F929F92AF92BF92CF92CC +:10246000DF92EF92FF920F931F93CF93DF93EC01D4 +:102470007B01D42E4801590180917603811102C05D +:102480000E94C60D8091520480FF6BC08091710044 +:102490008D7F809371008091870381110E94E00DF0 +:1024A00081E080938803D0935104C0935004F0924C +:1024B0004F04E0924E04D0925904809253049092BB +:1024C0005404A0925504B0925604109289031092BD +:1024D0008A0310928B0310928C0310927B038881E5 +:1024E0009981AA81BB818093830390938403A093F5 +:1024F0008503B093860320E030E040E85EE36C8122 +:102500007D818E819F810E9401306B017C0120E0E2 +:1025100030E048EC52E4609176027091770280914D +:102520007802909179020E94562E9B01AC01C7015E +:10253000B6010E94013060937F0370938003809303 +:1025400081039093820310927E0310927D03809109 +:102550007100826080937100809190008068809308 +:102560009000DF91CF911F910F91FF90EF90DF903E +:10257000CF90BF90AF909F908F9008958091C703A8 +:1025800090E0019666E070E00E94CF318093C7032F +:1025900008958091C70390E0019766E070E00E9483 +:1025A000CF318093C70308958F929F92AF92BF92CD +:1025B000CF92DF92EF92FF920F931F93CF93DF930F +:1025C0006B017C01C0917403D0917503BE0180E062 +:1025D00090E00E94EF2E4B015C01A701960160E0A4 +:1025E00070E08CE594E40E94562E9B01AC01C5017D +:1025F000B4010E9401300E94C32E2091C7032330F2 +:1026000009F473C028F4222351F02130E9F02CC1E1 +:10261000243009F4A0C0253009F4E0C025C180E0D1 +:1026200090E0A0E0BFE38093720290937302A093C6 +:102630007402B0937502109277031092780310928F +:10264000790310927A0310C11092770310927803E5 +:102650001092790310927A036431710540F46A3064 +:10266000710560F520E030E040E85EE32BC0693C96 +:10267000710508F0AAC080E090E00E94EF2E20E0F3 +:1026800030E040EA51E40E94ED2D20E030E044E3E8 +:1026900053E40E94562E9B01AC010E94013020E0C1 +:1026A00030E040E05EE30E9401309B01AC0160E05D +:1026B00070E080E09EE30E94ED2D44C020E030E019 +:1026C00040E05FE3C701B6010E9401306B017C016D +:1026D00080E090E0A0E0BEE38093720290937302EA +:1026E000A0937402B0937502BFC01092770310924A +:1026F00078031092790310927A034AE0469F900182 +:10270000479F300D1124C90168EB7BE00E94BB316B +:10271000BC016C5D754077FF03C0719561957109CF +:10272000882777FD8095982F0E94F12E2EE333ECB9 +:102730004EE259E30E94013020E030E040EC5EE3DD +:102740000E94EE2D60937202709373028093740264 +:102750009093750289C010927703109278031092BB +:10276000790310927A03CE0183709927892BE1F0C7 +:10277000BE016170772780E090E00E94EF2E20E09C +:1027800030E040E05EE30E94013020E030E040E4D1 +:102790005FE30E94EE2D6093720270937302809348 +:1027A0007402909375020CC080E090E0A0E0BFE35B +:1027B0008093720290937302A0937402B093750297 +:1027C000C770DD27CD2B09F04FC010927202109216 +:1027D0007302109274021092750246C01092770331 +:1027E000109278031092790310927A0300E010E0BF +:1027F00020E03FE30093720210937302209374026F +:10280000309375026739710578F180E090E00E949D +:10281000EF2E20E030E047E153E40E94ED2D20E070 +:1028200030E04AE754E40E94562E20E030E048E4CD +:1028300052E40E94013020E030E040EA51E40E947E +:10284000332F0E94BE2E660F771F660F771FFB0186 +:10285000EC50FD4F2081318142815381C701B60187 +:102860000E9401306B017C01C701B601DF91CF915D +:102870001F910F91FF90EF90DF90CF90BF90AF909E +:102880009F908F9008958091D8030895CF93DF9300 +:1028900000D01F92CDB7DEB79C0180915E048430DA +:1028A00019F593E099833B832A839093E9008FEF96 +:1028B0009091E800815095FD06C095ED9A95F1F74D +:1028C00000008111F5CF8091E80085FF0DC040E048 +:1028D00050E063E070E0CE0101960E94A71680915F +:1028E000E8008E778093E8000F900F900F90DF91B3 +:1028F000CF910895CF93DF9300D01F92CDB7DEB76D +:1029000020915E04243021F522E029839B838A8371 +:1029100083E08093E9008FEF9091E800815095FD6E +:1029200006C095ED9A95F1F700008111F5CF8091E1 +:10293000E80085FF0DC040E050E063E070E0CE01AC +:1029400001960E94A7168091E8008E778093E80098 +:102950000F900F900F90DF91CF91089520915E041A +:102960002430F1F422E02093E9002FEF3091E800C9 +:10297000215035FD06C035ED3A95F1F700002111E3 +:10298000F5CF2091E80025FF0BC040E050E065E066 +:1029900070E00E94A7168091E8008E778093E8008F +:1029A0000895CF93DF93EC0190915E04943009F089 +:1029B00046C0809184028823D9F0809185028823C3 +:1029C000B9F09093E9008FEF9091E800815095FD68 +:1029D00006C095E19A95F1F700008111F5CF80913D +:1029E000E80085FF2CC040E050E060E170E017C0D7 +:1029F00081E08093E9008FEF9091E800815095FD90 +:102A000006C095ED9A95F1F700008111F5CF809100 +:102A1000E80085FF14C040E050E068E070E0CE01BF +:102A20000E94A7168091E8008E778093E80080E1ED +:102A3000FE01A8ECB3E001900D928A95E1F7DF91D9 +:102A4000CF91089580915D04811109C00E943C18C6 +:102A50000E9499188091E20084608093E2000895BA +:102A600010925D040895089508950C94E12742E0C2 +:102A700061EC81E00E94B61742E061EC82E00E94C6 +:102A8000B61742E061EC83E00E94B61742E161ECC8 +:102A900084E00C94B61780916004833009F455C02B +:102AA00030F4813071F0823009F48EC008958A309C +:102AB00009F47AC08B3009F460C0893009F09CC0F9 +:102AC00020C080915F04813A09F096C08091E800AF +:102AD000877F8093E8008091630490916404892B40 +:102AE00021F460E188EC93E003C060E080E090E0D6 +:102AF00070E00E94F2168091E8008B778093E800E6 +:102B0000089580915F04813209F076C0809163045A +:102B100090916404009719F0039709F06DC08091BB +:102B2000E800877F8093E8008091E80082FD05C07F +:102B300080915E048111F8CF5FC08091F100809395 +:102B4000D8038091E8008B7753C080915F04813A6D +:102B500009F052C08091630490916404892B09F0BC +:102B60004BC08091E800877F8093E8008091E80067 +:102B700080FFFCCF8091840236C080915F04813257 +:102B8000D9F58091630490916404892BA9F5809113 +:102B9000E800877F8093E8000E94EB178091610432 +:102BA000809384020C945C2180915F04813221F532 +:102BB0008091E800877F8093E8000E94EB17809166 +:102BC00062048093D903089580915F04813AA1F44F +:102BD0008091E800877F8093E8008091E80080FF83 +:102BE000FCCF8091D9038093F1008091E8008E772B +:102BF0008093E8000C94EB17089584B7877F84BF17 +:102C000088E10FB6F89480936000109260000FBEC8 +:102C100090E080E80FB6F894809361009093610093 +:102C20000FBE0E948E1B0E943C180E949918809132 +:102C3000E20084608093E20078940E941F1B0E944F +:102C4000901B8AE792E00E943A1B80915E048530D7 +:102C500069F40E949B2780915C048823B1F30E9451 +:102C6000C927882391F30E949116EFCF0E94981BE9 +:102C7000ECCF292F332723303105C9F064F42130FC +:102C8000310581F02230310509F043C08DE690E036 +:102C90002AE338E042C021323105F1F02232310519 +:102CA00041F137C082E190E027EA38E036C0992749 +:102CB0008130910541F08230910541F0892B49F531 +:102CC000E6E3F8E005C0E8E0F8E002C0EEEDF7E08A +:102CD000849190E09F0121C06430D8F4E62FF0E0A9 +:102CE000EE0FFF1FE05BFC4F2081318189E090E017 +:102CF00014C0643070F470E0FB01EE0FFF1FE85B5E +:102D0000FC4F20813181FB01EC5BFC4F808190E026 +:102D100004C080E090E020E030E0FA0131832083BD +:102D2000089580E189BD82E189BD09B400FEFDCF2F +:102D30008091D8008F7D8093D8008091E0008260E0 +:102D40008093E0008091E00081FDFCCF0895CF9258 +:102D5000DF92EF92FF920F931F93CF93DF93EC01DB +:102D60008B016A010E940A18811133C0C114D10479 +:102D700039F0F60180819181081B190BC80FD91F0A +:102D8000E12CF12C0115110519F18091E80085FD68 +:102D900016C08091E8008E778093E800C114D104BA +:102DA00049F0F60180819181E80EF91EF182E082FE +:102DB00085E00FC00E940A18882321F30AC0899178 +:102DC0008093F10001501109FFEFEF1AFF0ADACFEB +:102DD00080E0DF91CF911F910F91FF90EF90DF90F6 +:102DE000CF90089520916504309166042617370727 +:102DF00048F06115710539F42091E8002E77209391 +:102E0000E80001C0B90140E061157105A9F1209108 +:102E10005E04222309F443C0253009F442C0209106 +:102E2000E80023FD40C02091E80022FD32C020913F +:102E3000E80020FFE9CF4091F3002091F20030E05C +:102E4000342BFC01CF016115710559F02830310593 +:102E500040F481918093F100615071092F5F3F4FE1 +:102E6000F1CF41E02830310509F040E02091E80041 +:102E70002E772093E800C8CF4111C9CF0AC08091B6 +:102E80005E04882361F0853061F08091E80083FD65 +:102E90000AC08091E80082FFF2CF80E0089582E0CE +:102EA000089583E0089581E00895209165043091AC +:102EB00066042617370748F06115710539F420912B +:102EC000E8002E772093E80001C0B901FC0120E062 +:102ED0006115710591F180915E04882309F440C069 +:102EE000853009F43FC08091E80083FD3DC08091AA +:102EF000E80082FD2FC08091E80080FFE9CF20919B +:102F0000F3008091F20090E0922B6115710559F069 +:102F10008830910540F424912093F100319661505E +:102F200071090196F2CF21E0089709F020E0809125 +:102F3000E8008E778093E800CBCF2111CCCF0AC078 +:102F400080915E04882361F0853061F08091E80013 +:102F500083FD0AC08091E80082FFF2CF80E00895EF +:102F600082E0089583E0089581E00895982F9730D6 +:102F700058F59093E900981739F07091EC00209182 +:102F8000ED005091F00003C0242F762F50E021FF78 +:102F900019C03091EB003E7F3093EB003091ED0093 +:102FA0003D7F3093ED003091EB0031603093EB00CA +:102FB0007093EC002093ED005093F0002091EE0010 +:102FC00027FF07C09F5FD3CF8F708093E90081E018 +:102FD000089580E0089580915F0487FF11C080917B +:102FE000E80082FD05C080915E048111F8CF11C018 +:102FF0008091E8008B770BC080915E04882349F0B4 +:103000008091E80080FFF8CF8091E8008E77809370 +:10301000E80008952091E4003091E50095E64091A4 +:10302000EC00842F817040FF22C08091E80080FD79 +:103030001CC080915E04882391F0853091F08091CE +:10304000EB0085FD10C04091E4005091E50042176F +:10305000530729F39A01915011F784E0089582E013 +:10306000089583E0089581E0089580E008954091F7 +:10307000E80042FFDECF08950E94AA180E94B2180D +:10308000E0EEF0E0808181608083E8EDF0E0808117 +:103090008F77808319BCA7EDB0E08C918E7F8C93E5 +:1030A00080818F7E808310925D0408950F931F931B +:1030B000CF93DF930E94AA180E94B218C8EDD0E007 +:1030C00088818F77888388818068888388818F7DD5 +:1030D000888319BC10925E0410925A0410925C040A +:1030E00010925B0400EE10E0F80180818B7F8083FA +:1030F00088818160888342E060E080E00E94B617AA +:10310000E1EEF0E080818E7F8083E2EEF0E080816E +:1031100081608083808188608083F80180818E7FD8 +:103120008083888180618883DF91CF911F910F9187 +:103130000895E8EDF0E080818F7E8083E7EDF0E098 +:1031400080818160808384E082BF81E080935D0420 +:103150000C945618E8EDF0E080818E7F8083109209 +:10316000E20008951092DA001092E10008951F9293 +:103170000F920FB60F9211242F933F934F935F93AB +:103180006F937F938F939F93AF93BF93EF93FF932F +:103190008091E10082FF0BC08091E20082FF07C0B6 +:1031A0008091E1008B7F8093E1000E941E1B809143 +:1031B000DA0080FF1FC08091D80080FF1BC0809183 +:1031C000DA008E7F8093DA008091D90080FF0DC0F5 +:1031D00080E189BD82E189BD09B400FEFDCF81E0B7 +:1031E00080935E040E94221505C019BC10925E04F3 +:1031F0000E9430158091E10080FF19C08091E200AB +:1032000080FF15C08091E2008E7F8093E200809164 +:10321000E20080618093E2008091D8008062809318 +:10322000D80019BC85E080935E040E94341580911B +:10323000E10084FF30C08091E20084FF2CC080E177 +:1032400089BD82E189BD09B400FEFDCF8091D8001F +:103250008F7D8093D8008091E1008F7E8093E10084 +:103260008091E2008F7E8093E2008091E200816095 +:103270008093E20080915A04882311F084E007C013 +:103280008091E30087FD02C081E001C083E080936C +:103290005E040E9435158091E10083FF29C0809172 +:1032A000E20083FF25C08091E100877F8093E100E9 +:1032B00082E080935E0410925A048091E1008E7F38 +:1032C0008093E1008091E2008E7F8093E200809104 +:1032D000E20080618093E20042E060E080E00E94D2 +:1032E000B6178091F00088608093F0000E9433153B +:1032F000FF91EF91BF91AF919F918F917F916F91CE +:103300005F914F913F912F910F900FBE0F901F90A3 +:1033100018951F920F920FB60F9211242F933F937F +:103320004F935F936F937F938F939F93AF93BF93CD +:10333000CF93DF93EF93FF93C091E900CF7080911B +:10334000EC00D82FD17080FDD0E81092E900809178 +:10335000F000877F8093F00078940E94CD1910923E +:10336000E9008091F00088608093F000CD2BCF7051 +:10337000C093E900FF91EF91DF91CF91BF91AF91A1 +:103380009F918F917F916F915F914F913F912F917D +:103390000F900FBE0F901F9018951F93CF93DF9340 +:1033A000CDB7DEB7AA970FB6F894DEBF0FBECDBF7C +:1033B000EFE5F4E088E08E0F9091F10091938E1389 +:1033C000FBCF0E944B158091E80083FF1FC18091C5 +:1033D0005F0490916004492F50E04A30510508F095 +:1033E00015C1FA01EC59FF4F0C94E331803881F09C +:1033F000823809F00BC1809163048F708093E900DB +:103400008091EB0085FB882780F91092E90006C0C7 +:1034100080915B0490915C04911182609091E8002E +:10342000977F9093E8008093F1001092F100C8C05C +:10343000282F2D7F09F0EAC0882319F0823061F02F +:10344000E5C080916104813009F0E0C0933009F05B +:1034500080E080935C042BC080916104811127C0BF +:10346000809163048F7009F4D1C08093E9002091AA +:10347000EB0020FF1CC0933021F48091EB008062B0 +:1034800014C09091EB0090619093EB0021E030E04C +:10349000A90102C0440F551F8A95E2F74093EA0044 +:1034A0001092EA008091EB0088608093EB0010920C +:1034B000E9008091E800877F86C08111A7C0109144 +:1034C00061041F778091E3008078812B8093E30073 +:1034D0008091E800877F8093E8000E94EB1780913D +:1034E000E80080FFFCCF8091E30080688093E300D8 +:1034F000111102C082E001C083E080935E0486C0A7 +:103500008058823008F082C08091610490916204FA +:103510008C3D53E0950779F583E08A838AE28983BD +:103520004FB7F894DE01139620E03EE051E2E32F1E +:10353000F0E050935700E49120FF03C0E295EF7054 +:103540003F5FEF708E2F90E0EA3010F0C79601C019 +:10355000C0968D939D932F5F243149F74FBF809183 +:10356000E800877F8093E8006AE270E0CE01019670 +:103570000E94F21614C0AE014F5F5F4F609163046A +:103580000E943916BC01009709F440C09091E800F0 +:10359000977F9093E80089819A810E9455178091C6 +:1035A000E8008B778093E80031C0803879F580910E +:1035B000E800877F8093E80080915A048093F100AF +:1035C0008091E8008E778093E8000E94EB171EC080 +:1035D00081111CC0909161049230C0F48091E80088 +:1035E000877F8093E80090935A040E94EB178091A4 +:1035F0005A04811106C08091E30087FD02C081E07A +:1036000001C084E080935E040E9437158091E80039 +:1036100083FF0AC08091E800877F8093E800809153 +:10362000EB0080628093EB00AA960FB6F894DEBFA1 +:103630000FBECDBFDF91CF911F9108950895CF9315 +:1036400080915E048823A1F0C091E900CF70909131 +:10365000EC00892F817090FD80E8C82B1092E90062 +:103660008091E80083FD0E94CD19CF70C093E900DE +:10367000CF9108959093DF038093DE030895E09146 +:10368000DE03F091DF03309721F00190F081E02D0F +:10369000099480E00895E091DE03F091DF03309714 +:1036A00021F00280F381E02D09940895E091DE037A +:1036B000F091DF03309721F00480F581E02D09942B +:1036C00008952091DC033091DD038217930771F098 +:1036D0009093DD038093DC03E091DE03F091DF0340 +:1036E000309721F00680F781E02D0994089520910C +:1036F000DA033091DB038217930771F09093DB03B9 +:103700008093DA03E091DE03F091DF03309721F03C +:103710000084F185E02D0994089508950C948D1B83 +:103720000E9415280E94760B0E949B280C94562D0F +:103730004F925F927F928F929F92AF92BF92CF9261 +:10374000DF92EF92FF920F931F93CF93DF93CDB74A +:10375000DEB72A970FB6F894DEBF0FBECDBF0E942A +:10376000650C91EEC92E93E0D92E00E010E0AA245A +:10377000A394B12C702E802F0E94AE0D4C01F60147 +:10378000419051906F014826592641145104B1F4DB +:103790000F5F1F4F0430110569F78FEF89838A830C +:1037A0001B820E941E288160782F9D838C83498113 +:1037B0005A816B818D810E94511C3AC080913D04D9 +:1037C00081FD0E94B70D20E030E07501022E02C09D +:1037D000EE0CFF1C0A94E2F7C70184219521892B86 +:1037E00009F12E837F828E209F2091E0892809F4A1 +:1037F00090E098870E941E288160782F9A87898799 +:103800004E815F8168858A850E94511C000F111FBF +:10381000F801EF51FC4F80819181E826F926F18271 +:10382000E08206C02F5F3F4F2C30310571F6B0CFDC +:103830000E94872A1091E0030E943F1B1817D9F0BD +:103840000E943F1B8093E0032A960FB6F894DEBFD8 +:103850000FBECDBFDF91CF911F910F91FF90EF90E1 +:10386000DF90CF90BF90AF909F908F907F905F90B0 +:103870004F900C94AE0A2A960FB6F894DEBF0FBE96 +:10388000CDBFDF91CF911F910F91FF90EF90DF900F +:10389000CF90BF90AF909F908F907F905F904F9010 +:1038A0000895CF93DF93CDB7DEB72B970FB6F8947B +:1038B000DEBF0FBECDBF4F83588769877A878B875E +:1038C000DE01119686E0FD0111928A95E9F785E007 +:1038D000FE01379601900D928A95E1F749815A8150 +:1038E0006B817C818D819E810E94F6232B960FB681 +:1038F000F894DEBF0FBECDBFDF91CF910895CF9377 +:10390000882309F4C2C0C82F823859F40E943F1B93 +:1039100081FDBBC089E30E949F260E946C2789E33A +:103920000CC0833879F40E943F1B80FDAEC083E554 +:103930000E949F260E946C2783E50E94E126CF917A +:103940000C946C27843859F40E943F1B82FD9DC063 +:1039500087E40E949F260E946C2787E4EECF8CEFBD +:103960008C0F813A48F48C2F0E94BE2C81118DC09F +:103970008C2F0E949F26E3CF80E28C0F883048F482 +:10398000C77081E001C0880FCA95EAF70E94252719 +:10399000D6CF8BE58C0F833078F4C53A29F0C63A40 +:1039A00031F083E890E005C081E890E002C082E851 +:1039B00090E0CF910C94611B88E58C0F833108F067 +:1039C00064C0C83A39F1C93A41F1CA3A49F1CB3A2F +:1039D00051F1CC3A59F1CD3A61F1C03B69F1CE3A9F +:1039E00071F1CF3A79F1C13B81F1C23B89F1C33B1F +:1039F00091F1C43B99F1C53BA1F1C63BA9F1C73B8D +:103A0000B1F1C83BB9F1C93BC1F1CA3BC9F180E092 +:103A100090E038C082EE90E035C089EE90E032C090 +:103A20008AEE90E02FC085EB90E02CC086EB90E012 +:103A300029C087EB90E026C08CEC90E023C08DEC91 +:103A400090E020C083E891E01DC08AE891E01AC0B0 +:103A500082E991E017C084E991E014C081E292E02C +:103A600011C083E292E00EC084E292E00BC085E2D6 +:103A700092E008C086E292E005C087E292E002C0D0 +:103A80008AE292E0CF910C94771BCF91089588231E +:103A900009F44BC0823859F40E943F1B81FF45C096 +:103AA00089E30E949F260E946C2789E30CC083381B +:103AB00071F40E943F1B80FF38C083E50E949F265F +:103AC0000E946C2783E50E94E1260C946C278438C1 +:103AD00059F40E943F1B82FF28C087E40E949F2662 +:103AE0000E946C2787E4EFCF9CEF980F913A58F330 +:103AF00090E2980F983050F4877091E001C0990FD0 +:103B00008A95EAF7892F0E942B27DFCF9BE5980F34 +:103B1000933020F480E090E00C94611B885A83314C +:103B200020F480E090E00C94771B0895882321F026 +:103B30000E9425270C946C270895882321F00E9469 +:103B40002B270C946C270895BF92CF92DF92EF92AF +:103B5000FF920F931F93CF93DF9300D000D000D03C +:103B6000CDB7DEB725E0FC01DE01119601900D9284 +:103B70002A95E1F7FC01D0801181028125812295EF +:103B80002F7043815481452B09F472C31F3F21F4E8 +:103B9000FFEFDF1609F46CC37C012E830E947707C8 +:103BA000D9821A8369817A81802F0E949B26182FDF +:103BB000B92E0E9450260E9417252E81002319F04D +:103BC0000E9442272E81EB2DE295EF70F0E0E25942 +:103BD000FF4F0C94E3318B2D807F9B2D9F70F92E2E +:103BE000882319F0F29480EFF822002389F0FF2057 +:103BF00009F47CC280E2810F883020F48F2D0E946E +:103C0000252703C08F2D0E9435270E946C276EC286 +:103C1000812F0E94471DFF2009F42AC3105E8F2DBB +:103C2000183018F40E942B2702C00E943B272696CA +:103C30000FB6F894DEBF0FBECDBFDF91CF911F91BD +:103C40000F91FF90EF90DF90CF90BF900C946C2776 +:103C50008B2D807F9B2D9F70803211F4892F03C0A4 +:103C6000892F8295807F112319F0113011F12BC01B +:103C70000023A9F0222389F1213079F526960FB689 +:103C8000F894DEBF0FBECDBFDF91CF911F910F9192 +:103C9000FF90EF90DF90CF90BF900C945527222398 +:103CA00019F0213009F4E4C28E830E9458278E81D6 +:103CB0009BC1002321F0263008F0DAC20EC0253067 +:103CC00008F0D6C291C10023C9F0222331F0F701D8 +:103CD000958190FF0BC29F70958326960FB6F8943E +:103CE000DEBF0FBECDBFDF91CF911F910F91FF902F +:103CF000EF90DF90CF90BF900C94961D222309F493 +:103D000073C109C22B2D26952695237030E021150D +:103D1000310521F021303105D1F0AAC2002321F074 +:103D2000812F9B2D937002C080E090E026960FB605 +:103D3000F894DEBF0FBECDBFDF91CF911F910F91E1 +:103D4000FF90EF90DF90CF90BF900C94611B002309 +:103D500021F0812F9B2D937002C080E090E0269689 +:103D60000FB6F894DEBF0FBECDBFDF91CF911F918C +:103D70000F91FF90EF90DF90CF90BF900C94771B46 +:103D8000812F002319F00E948F2902C00E94F72979 +:103D900026960FB6F894DEBF0FBECDBFDF91CF9150 +:103DA0001F910F91FF90EF90DF90CF90BF900C94F8 +:103DB0007C2A8B2D837009F07BC0011159C2812FA1 +:103DC000829586958770880F880F912F9F70C92ED6 +:103DD000D12CE12CF12C082E04C0CC0CDD1CEE1CE7 +:103DE000FF1C0A94D2F714FF12C04FE050E060E0CD +:103DF00070E004C0440F551F661F771F8A95D2F7E5 +:103E0000CB01BA01609570958095909503C060E0F4 +:103E100070E0CB012B2D269526952370422F50E084 +:103E200042305105D9F04330510569F16C297D29A3 +:103E30008E299F294130510551F126960FB6F894ED +:103E4000DEBF0FBECDBFDF91CF911F910F91FF90CD +:103E5000EF90DF90CF90BF900C943E256C297D2988 +:103E60008E299F2926960FB6F894DEBF0FBECDBFD0 +:103E7000DF91CF911F910F91FF90EF90DF90CF9046 +:103E8000BF900C945A250E943E25C701B601269684 +:103E90000FB6F894DEBF0FBECDBFDF91CF911F915B +:103EA0000F91FF90EF90DF90CF90BF900C94222560 +:103EB000002319F08B2D817001C08695882309F4A9 +:103EC000D7C1812F829586958770880F880F912F93 +:103ED0009F70C92ED12CE12CF12C082E04C0CC0CE3 +:103EE000DD1CEE1CFF1C0A94D2F714FF12C04FE039 +:103EF00050E060E070E004C0440F551F661F771F5C +:103F00008A95D2F7CB01BA0160957095809590950E +:103F100003C060E070E0CB012B2D26952695237021 +:103F2000422F50E042305105D9F04330510569F13C +:103F30006C297D298E299F294130510551F1269602 +:103F40000FB6F894DEBF0FBECDBFDF91CF911F91AA +:103F50000F91FF90EF90DF90CF90BF900C941826B8 +:103F60006C297D298E299F2926960FB6F894DEBFED +:103F70000FBECDBFDF91CF911F910F91FF90EF90BA +:103F8000DF90CF90BF900C9434260E941826C70172 +:103F9000B60126960FB6F894DEBF0FBECDBFDF91F7 +:103FA000CF911F910F91FF90EF90DF90CF90BF9036 +:103FB0000C94FC25103F49F118F4103E48F491C0D0 +:103FC000123F09F453C0E8F1133F09F464C089C0FB +:103FD0001F708B2D8F71002321F00E949525812F5A +:103FE0007CCE0E94B625812F26960FB6F894DEBFB0 +:103FF0000FBECDBFDF91CF911F910F91FF90EF903A +:10400000DF90CF90BF900C949D1D0023B1F0253020 +:1040100008F02EC18B2D8F7126960FB6F894DEBF57 +:104020000FBECDBFDF91CF911F910F91FF90EF9009 +:10403000DF90CF90BF900C94DB25263008F018C19C +:10404000E9CF0023A9F08B2D8F7126960FB6F89437 +:10405000DEBF0FBECDBFDF91CF911F910F91FF90BB +:10406000EF90DF90CF90BF900C949525002359F3EB +:104070008B2D8F7126960FB6F894DEBF0FBECDBF85 +:10408000DF91CF911F910F91FF90EF90DF90CF9034 +:10409000BF900C94B625002399F08B2D8F71269636 :1040A0000FB6F894DEBF0FBECDBFDF91CF911F9149 -:1040B0000F91FF90EF90DF90CF90BF900C9465250B -:1040C0000023A9F0222309F4ADCF812F26960FB645 -:1040D000F894DEBF0FBECDBFDF91CF911F910F913E -:1040E000FF90EF90DF90CF90BF900C946E1C222336 -:1040F00009F4ADCF812F26960FB6F894DEBF0FBE20 -:10410000CDBFDF91CF911F910F91FF90EF90DF9086 -:10411000CF90BF900C94361D4B2D4F70612FC7016F -:104120000E948D0526960FB6F894DEBF0FBECDBF58 -:10413000DF91CF911F910F91FF90EF90DF90CF9083 -:10414000BF900C948924011182C09B2D9F70492F30 -:1041500050E04230510509F443C0C4F44115510503 -:1041600071F14130510509F072C026960FB6F894EE -:10417000DEBF0FBECDBFDF91CF911F910F91FF909A -:10418000EF90DF90CF90BF900C946D2D4330510590 -:10419000C1F14430510509F05AC0812F26960FB65F -:1041A000F894DEBF0FBECDBFDF91CF911F910F916D -:1041B000FF90EF90DF90CF90BF900C94BF2D26968C +:1040B0000F91FF90EF90DF90CF90BF900C948025F0 +:1040C00026960FB6F894DEBF0FBECDBFDF91CF911D +:1040D0001F910F91FF90EF90DF90CF90BF900C94C5 +:1040E00076250023A9F0222309F4ADCF812F26964F +:1040F0000FB6F894DEBF0FBECDBFDF91CF911F91F9 +:104100000F91FF90EF90DF90CF90BF900C947F1CA9 +:10411000222309F4ADCF812F26960FB6F894DEBF87 +:104120000FBECDBFDF91CF911F910F91FF90EF9008 +:10413000DF90CF90BF900C94471D4B2D4F70612F97 +:10414000C7010E94690526960FB6F894DEBF0FBE20 +:10415000CDBFDF91CF911F910F91FF90EF90DF9036 +:10416000CF90BF900C949A24011182C09B2D9F7018 +:10417000492F50E04230510509F443C0C4F44115C1 +:10418000510571F14130510509F072C026960FB604 +:10419000F894DEBF0FBECDBFDF91CF911F910F917D +:1041A000FF90EF90DF90CF90BF900C947E2D433026 +:1041B0005105C1F14430510509F05AC0812F2696AE :1041C0000FB6F894DEBF0FBECDBFDF91CF911F9128 -:1041D0000F91FF90EF90DF90CF90BF900C94562DF1 +:1041D0000F91FF90EF90DF90CF90BF900C94D02D77 :1041E00026960FB6F894DEBF0FBECDBFDF91CF91FC :1041F0001F910F91FF90EF90DF90CF90BF900C94A4 -:10420000892D26960FB6F894DEBF0FBECDBFDF9185 +:10420000672D26960FB6F894DEBF0FBECDBFDF91A7 :10421000CF911F910F91FF90EF90DF90CF90BF90C3 -:104220000C949C2D4B2D4F70612FC70126960FB615 -:10423000F894DEBF0FBECDBFDF91CF911F910F91DC -:10424000FF90EF90DF90CF90BF900C949D07269643 +:104220000C949A2D26960FB6F894DEBF0FBECDBF24 +:10423000DF91CF911F910F91FF90EF90DF90CF9082 +:10424000BF900C94AD2D4B2D4F70612FC70126965A :104250000FB6F894DEBF0FBECDBFDF91CF911F9197 -:104260000F91FF90EF90DF90CF90BF9008950E9444 -:1042700031270E9441270E9406270E945B270E9447 -:104280001C2B0E946B2A80E090E00E94501B80E073 -:1042900090E00C94661B0E9421270C9437210E9409 -:1042A0007F26292F22952F7030E02C3031054CF4D9 -:1042B0002A3031056CF4225031092230310588F45E -:1042C00007C02C30310549F02F30310531F009C0DD -:1042D000803E48F0803F29F406C093FB882780F990 -:1042E000089580E0089581E00895CF93DF9300D092 -:1042F00000D01F92CDB7DEB70F900F900F900F90A8 -:104300000F90DF91CF910895CF93DF9300D000D02D -:1043100000D0CDB7DEB726960FB6F894DEBF0FBE3D -:10432000CDBFDF91CF9108951F93CF93DF93C091BD -:10433000990316E080919A03C81799F0D0E01C9F6A -:10434000F0011D9FF00D1124E556FC4F4081518175 -:1043500062817381848195810E9484212196C77036 -:10436000E9CFDF91CF911F9108954091CB035091F8 -:10437000CC036091CD037091CE038091CF039091D7 -:10438000D0030C9484218091D00382958F7009F022 -:1043900054C08091CD03882309F44FC080919903C4 -:1043A000A0919A036091CB037091CC034091CE030E -:1043B0005091CF03B6E08A1709F43FC090E0411551 -:1043C0005105C1F17F3F11F46F3FA1F1B89FF0019A -:1043D000B99FF00D1124E556FC4F218172132AC0BC -:1043E0002081621327C02281211124C023813481BE -:1043F0002417350710F421503109241B350B283CB4 -:104400003105C0F42091D0032F7020612093D00398 -:1044100026E0289FF001299FF00D1124E056FC4F63 -:1044200080818F70806180838BEC93E00E94931D6C -:104430000C94942101968770BECF0895CF92DF929D -:10444000EF92FF920F931F93CF93DF93CDB7DEB719 -:1044500062970FB6F894DEBF0FBECDBF8C0185E02A -:10446000F801DE011D9601900D928A95E1F7D801C1 -:104470004C9111965C91119712966C91129713962C -:10448000CD90DC9014973091CB037091CC03809148 -:10449000CE039091CF03009709F46BC17F3F19F4CD -:1044A0003F3F09F466C1E090CD03EE2009F4C0C09F -:1044B0002091D003C816D90628F0F601E81BF90BA5 -:1044C000CF0104C0809590958C0D9D1DFF24F39421 -:1044D000883C910578F0F12C207F09F0C6C07C2D36 -:1044E000D98AC88A89890E9475218BEC93E00E9441 -:1044F000931DB1C0822F807F09F046C0751314C090 -:10450000341312C0611110C02F7020612093D003AA -:104510000E94B5218BEC93E00E94931D8091D00303 -:10452000D80115968C932EC0CD2819F15F3F11F458 -:104530004F3FF9F0F62E61111CC080919903209134 -:104540009A0336E0821709F45AC090E0389FF001D0 -:10455000399FF00D1124E556FC4F7181571306C0A9 -:104560007081471303C07281711103C00196877077 -:10457000E9CFF62E662309F418C18091D00381603B -:104580008093D003F12C11C1751308C0341306C0F9 -:10459000611104C08091D003D801C3C04D875E87EC -:1045A0008D859E856A8B0E944F216A898823E1F15F -:1045B0006623D1F12091D003822F82958F7090E0F5 -:1045C000029774F08091CB039091CC0398878F83EE -:1045D0001986DB86CA862C87CE0107960E94931D1A -:1045E00086E0F801ABECB3E001900D928A95E1F71B -:1045F0000E94C3210E94B521FF24F394D6C04D87A9 -:104600005E878D859E850E947F26292F22952F709B -:1046100030E0223031050CF0BCC09F7009F0B6C00C -:10462000805E883008F4C1C0C8010E94931DE4CFA9 -:10463000C816D90608F453C0F601E81BF90BCF01E0 -:10464000883C910508F450C0F12C7C2DD98AC88A89 -:1046500089890E947521EBECF3E086E0DF011D9271 -:104660008A95E9F70E94B521A0C0751314C03413D0 -:1046700012C0611110C08091D003F8018583C80178 -:104680000E94931D86E0EBECF3E0DF011D928A951A -:10469000E9F7FE2C8AC04D875E878D859E856A8BE3 -:1046A0000E944F216A89882309F4BECF662309F44A -:1046B000BBCF2091D003822F82958F7090E002971C -:1046C0000CF48ECF8091CB039091CC039A83898395 -:1046D0001B82DD82CC822E83CE0101967FCF809516 -:1046E00090958C0D9D1DACCFF62E662309F49CCFC2 -:1046F00075132EC034132CC02091D00320FD1FC091 -:10470000822F82958F70D9F0D80115962C9315972A -:104710008F3049F08F5F982F9295907F822F8F7006 -:10472000892B15968C93C8010E94931D86E0F80191 -:10473000ABECB3E001900D928A95E1F793CF86E060 -:10474000F801ABECB3E001900D928A95E1F72DC032 -:104750004D875E878D859E850E944F21811140CFB8 -:104760008091D00381608093D003C8010E94931D83 -:104770001CC0662309F458CF4D875E878D859E85C2 -:104780000E944F21882309F44FCF2ACF811148CFAF -:104790000CC0243031050CF047CF9F7009F440CF96 -:1047A000F8019581907F09F03BCF8F2D62960FB66F -:1047B000F894DEBF0FBECDBFDF91CF911F910F9157 -:1047C000FF90EF90DF90CF9008951F93CF93DF93EA -:1047D000CDB7DEB72C970FB6F894DEBF0FBECDBFB6 -:1047E0004F83588769877A878B879C87CE01079686 -:1047F0000E941E22882369F08F8198852A853B8537 -:10480000232BF1F19F3F09F063C08F3F09F060C097 -:1048100037C086E0FE013796DE01119601900D92B9 -:104820008A95E1F76F817885EA85FB85309741F1BC -:104830007F3F11F46F3F21F120919A0330E0C901CD -:104840000196877099274091990350E08417950746 -:1048500009F447C069837A83FD83EC8396E0929FD5 -:10486000D001939FB00D1124A556BC4FFE01319687 -:1048700001900D929A95E1F780939A030E949421FA -:1048800016E08091990390919A038917C1F1189FBE -:10489000C001112485569C4F0E941E22882379F165 -:1048A000E09199031E9FF0011124E556FC4F4081D1 -:1048B000518162817381848195810E9484218091DC -:1048C000990390E001968770992780939903D9CF37 -:1048D0004F81588569857A858B859C850E948421C6 -:1048E000CFCF0E944B2110929A0310929903EBECC8 -:1048F000F3E086E0DF011D928A95E9F7C1CF2C969F -:104900000FB6F894DEBF0FBECDBFDF91CF911F91E0 -:104910000895EF92FF920F931F93CF93DF938C0133 -:10492000009709F46CC0F12CEE24E394E801219681 -:10493000F8018491843740F4843008F051C081300C -:1049400081F0823019F15BC0853709F444C0A8F1C9 -:104950009CE7980F903708F052C08F770E94361D61 -:1049600041C00E5F1F4FFE01C49180E28C0F883062 -:1049700048F4C7708E2D01C0880FCA95EAF70E94CF -:10498000342714C08C2F0E946E1C2DC00E5F1F4F49 -:10499000FE01C49180E28C0F883058F4C7708E2DD0 -:1049A00001C0880FCA95EAF70E943A270E945B2748 -:1049B0001AC08C2F0E94361D16C00E5F1F4FFE01BD -:1049C000C491CC2381F08FE99FE00197F1F700C0FB -:1049D0000000C150F6CF0E5F1F4FFE01F49003C0E0 -:1049E0000E946E1C8E018F2D882309F49FCFEFE962 -:1049F000FFE03197F1F700C000008150F5CFDF9163 -:104A0000CF911F910F91FF90EF90089508956093BB -:104A1000D5037093D6038093D7039093D8030C9457 -:104A200037210F931F930091D5031091D603209146 -:104A3000D7033091D803DC01CB01802B912BA22B23 -:104A4000B32B8093D5039093D603A093D703B09351 -:104A5000D8031F910F910C9437210F931F9300914E -:104A6000D5031091D6032091D7033091D803DC01F0 -:104A7000CB0180239123A223B3238093D50390936A -:104A8000D603A093D703B093D8031F910F910C9432 -:104A900037210F931F930091D5031091D6032091D6 -:104AA000D7033091D803DC01CB0180279127A227BF -:104AB000B3278093D5039093D603A093D703B093E5 -:104AC000D8031F910F910C9437211092D1031092AB -:104AD000D2031092D3031092D4030C94372141E0F7 -:104AE00050E060E070E004C0440F551F661F771F60 -:104AF0008A95D2F74093D1035093D2036093D303A6 -:104B00007093D4030C94372141E050E060E070E0F2 -:104B100004C0440F551F661F771F8A95D2F78091F6 -:104B2000D1039091D203A091D303B091D403482B29 -:104B3000592B6A2B7B2B4093D1035093D203609364 -:104B4000D3037093D4030C94372141E050E060E02C -:104B500070E004C0440F551F661F771F8A95D2F777 -:104B600040955095609570958091D1039091D203B6 -:104B7000A091D303B091D403482359236A237B2304 -:104B80004093D1035093D2036093D3037093D40323 -:104B90000C94372141E050E060E070E004C0440F25 -:104BA000551F661F771F8A95D2F78091D103909188 -:104BB000D203A091D303B091D403482759276A2781 -:104BC0007B274093D1035093D2036093D303709318 -:104BD000D4030C9437210F931F930091D1031091AC -:104BE000D2032091D3033091D403DC01CB01802B7D -:104BF000912BA22BB32B8093D1039093D203A0933C -:104C0000D303B093D4031F910F910C9437210F93CA -:104C10001F930091D1031091D2032091D3033091BF -:104C2000D403DC01CB0180239123A223B3238093FF -:104C3000D1039093D203A093D303B093D4031F91D5 -:104C40000F910C9437210F931F930091D103109172 -:104C5000D2032091D3033091D403DC01CB01802710 -:104C60009127A227B3278093D1039093D203A093D7 -:104C7000D303B093D4031F910F910C94372108955F -:104C8000CF92DF92EF92FF920F931F93CF93DF9318 -:104C90008C01C090D503D090D603E090D703F0905C -:104CA000D8038091D1039091D203A091D303B09106 -:104CB000D403C82AD92AEA2AFB2ACFE1D0E0D701B7 -:104CC000C6010C2E04C0B695A795979587950A94B2 -:104CD000D2F780FF06C0B8018C2F0E94F709019718 -:104CE00021F4219760F780E001C08C2FDF91CF91F4 -:104CF0001F910F91FF90EF90DF90CF900895CF9389 -:104D0000DF93EC010E944026BE010E94F709DF916B -:104D1000CF910895CB010E947F260895909186023D -:104D2000992321F090918702911109C02091880266 -:104D300030918902F90132969FEF40E01FC0982F11 -:104D40009695969596959F3050F5E0918802F09152 -:104D50008902E90FF11D877021E030E0A90102C04E -:104D6000440F551F8A95E2F7CA019181892B8183EF -:104D700008959F3F39F04F5F4E3041F051915813E5 -:104D8000F8CF0DC05111F7CF942FF5CF9F3F39F0D9 -:104D9000F901E90FF11D97FDFA95828308950895B1 -:104DA00090918602992321F090918702911109C078 -:104DB0002091880230918902F9013296205F3F4F9D -:104DC0001FC0982F9695969596959F30F0F4E09198 -:104DD0008802F0918902E90FF11D877021E030E02F -:104DE000A90102C0440F551F8A95E2F7CA018095B8 -:104DF00091818923818308953196E217F30729F081 -:104E000090819813F9CF1082F7CF089581E090E058 -:104E1000E0918802F0918902E80FF91F1082019653 -:104E200080319105A9F708959091EC03892B809327 -:104E3000EC03089580959091EC0389238093EC0313 -:104E400008951092EC0308959091EB03892B8093C1 -:104E5000EB03089580959091EB0389238093EB03F6 -:104E600008951092EB0308959091EA03892B8093A3 -:104E7000EA03089580959091EA0389238093EA03D9 -:104E800008951092EA0308958093D903089510922B -:104E9000D90308958091880290918902FC0131968E -:104EA0009C01205F3F4F80E0919191118F5FE2174D -:104EB000F307D1F70895E0918802F091890280917B -:104EC000EC038083E0918802F091890290818091C7 -:104ED000EB03892B8083E0918802F0918902908115 -:104EE0008091EA03892B80838091D903882361F024 -:104EF000E0918802F09189029081892B80830E9441 -:104F00004A2781111092D9038091880290918902D9 -:104F10000C943A1B80910E04843039F11092EE0308 -:104F200020E488E190E00FB6F894A89580936000A3 -:104F30000FBE2093600080E00E94540580E00E9434 -:104F4000D20A83B7817F846083BF83B7816083BFC8 -:104F50007894889583B78E7F83BF88E10FB6F894E5 -:104F600080936000109260000FBE08950895089528 -:104F7000CF9380E00E9454050E94B6270E94890CBE -:104F80000E94B727C0E08C2F0E94D20D892B29F4F4 -:104F9000CF5FC430C1F780E001C081E0CF910895B8 -:104FA0000E944B2180E00E9454050E94452D0E94E2 -:104FB0002E1B0C94D20A1F920F920FB60F9211243F -:104FC0008F939F93AF93BF938091EE03811113C092 -:104FD0008091EF039091F003A091F103B091F2035F -:104FE0004196A11DB11D8093EF039093F003A09310 -:104FF000F103B093F203BF91AF919F918F910F9006 -:105000000FBE0F901F90189582E084BD93E095BD70 -:105010009AEF97BD80936E0008952FB7F894809112 -:10502000EF039091F003A091F103B091F2032FBF31 -:105030000895CF92DF92EF92FF920F931F932FB7B5 -:10504000F8944091EF035091F0036091F103709157 -:10505000F2032FBF6A017B01EE24FF248C0120E0C4 -:1050600030E0C016D106E206F30610F441505109B3 -:105070009A01281B390BC9011F910F91FF90EF90E6 -:10508000DF90CF9008951F920F920FB60F921124C8 -:105090008F939F93AF93BF938091EF039091F00311 -:1050A000A091F103B091F2030196A11DB11D80936F -:1050B000EF039093F003A093F103B093F203BF9139 -:1050C000AF919F918F910F900FBE0F901F901895E9 -:1050D0000E942B18F8942FEF87EA91E62150804028 -:1050E0009040E1F700C0000087E090EBDC01809386 -:1050F000190490931A04A0931B04B0931C049CE021 -:1051000088E10FB6F894A895809360000FBE909345 -:105110006000FFCF0E94C928811102C00E94A5280B -:105120000E94D4288093ED030E94E1288093170405 -:1051300087FB882780F9809387020E94D828682FF0 -:1051400070E080E090E00C9407256DEE7EEF80E04B -:1051500090E00E94AA3160E082E090E00E949831E5 -:1051600060E083E090E00E94983160E084E090E0AD -:105170000E94983160E085E090E00E94983160E004 -:1051800086E090E00E9498316FEF87E090E00C9409 -:10519000983180E090E00E94923121E08D3E9E4F58 -:1051A00009F020E0822F089582E090E00C948A318B -:1051B00083E090E00C948A31682F83E090E00C94B7 -:1051C000983184E090E00C948A31682F84E090E07C -:1051D0000C94983186E090E00C948A31682F86E038 -:1051E00090E00C94983187E090E00C948A31682F1D -:1051F00087E090E00C9498318091F50380FF0BC01C -:1052000060918D0285E0689FB001112475956795C6 -:10521000759567952BC081FF09C060918D0285E06F -:10522000689FB00111247595679520C082FF07C063 -:1052300060918D0285E0689FB001112417C09091A4 -:10524000F6039923D1F060918C02961788F720918C -:105250008D0285E0289F90011124929FA001939FC9 -:10526000500D112470E0CA010E9470316038710540 -:1052700040F46115710539F002C065E070E0862FD9 -:1052800008958FE7089581E008958091F50380FFE8 -:1052900008C060918B0270E075956795759567956C -:1052A00021C081FF06C060918B0270E07595679503 -:1052B00019C082FF04C060918B0270E010C0909111 -:1052C000F6039923C1F060918A029617A0F78091A6 -:1052D0008B02899FC001112470E00E9470316038F8 -:1052E000710528F46115710521F0862F08958FE767 -:1052F000089581E0089561E070E0F4CF803F21F4EB -:105300000E94FC28819504C0813F29F40E94FC285A -:105310008093F9030895823F21F40E94FC2881952F -:1053200004C0833F29F40E94FC288093F803089569 -:10533000893F19F40E94452905C08A3F31F40E9433 -:10534000452981958093FA0308958B3F21F40E94AB -:105350004529819504C08C3F29F40E9445298093FA -:10536000FB030895843F21F48091F703816017C007 -:10537000853F21F48091F703826011C0863F21F4BC -:105380008091F70384600BC0873F21F48091F7037D -:10539000886005C0883F31F48091F7038061809375 -:1053A000F70308958D3F21F48091F50381600BC0D0 -:1053B0008E3F21F48091F503826005C08F3F29F470 -:1053C0008091F50384608093F5030895803F39F45C -:1053D0008091F90387FF6CC01092F90369C0813F87 -:1053E00029F48091F9031816BCF362C09091F80378 -:1053F000823F29F497FF5CC01092F80359C0833FA5 -:1054000019F41916CCF354C0893F41F48091FA0382 -:1054100018160CF04DC01092FA034AC08A3F29F4C6 -:105420008091FA0387FF44C0F6CF8B3F39F4809117 -:10543000FB0387FF3DC01092FB033AC08C3F29F469 -:105440008091FB031816BCF333C0843F21F4809194 -:10545000F7038E7F17C0853F21F48091F7038D7F7E -:1054600011C0863F21F48091F7038B7F0BC0873FEB -:1054700021F48091F703877F05C0883F31F4809144 -:10548000F7038F7E8093F70313C08D3F21F4809143 -:10549000F5038E7F0BC08E3F21F48091F5038D7F45 -:1054A00005C08F3F29F48091F5038B7F8093F5032E -:1054B0008091F80381110EC08091F90381110AC017 -:1054C0008091FA03811106C08091FB03811102C013 -:1054D0001092F603089587EF93E00E94451B0E9407 -:1054E0000D289093F4038093F30308951F93CF93B3 -:1054F000DF938091F3039091F4030E941928AC018B -:105500009091F603992321F020918E0230E006C09D -:1055100020918F028AE0289F90011124421753079F -:1055200008F486C08091F803C091F903D091FA0382 -:105530001091FB03811107C0C11176C0D11174C055 -:10554000111172C075C09F3F19F09F5F9093F603D1 -:10555000181624F40E94FC288093F8038091F80325 -:1055600087FF05C00E94FC2881958093F8031C16D4 -:1055700024F40E94FC288093F9038091F90387FFAB -:1055800005C00E94FC2881958093F9036091F8037F -:10559000662339F1C091F903CC2319F1772767FD10 -:1055A0007095872F972F0E94E02E23E333E343E388 -:1055B0005FE30E94942F0E94AD2E6093F8036C2F3E -:1055C000772767FD7095872F972F0E94E02E23E3A2 -:1055D00033E343E35FE30E94942F0E94AD2E609378 -:1055E000F9031D1624F40E9445298093FA03809143 -:1055F000FA0387FF05C00E94452981958093FA032D -:10560000111624F40E9445298093FB038091FB032B -:1056100087FF05C00E94452981958093FB03DF9198 -:10562000CF911F910C946B2A9F3F09F08ECF96CF9C -:10563000DF91CF911F910895E7EFF3E085E0DF015F -:105640001D928A95E9F71092F6031092F5030895DA -:10565000833081F128F4813059F08230D1F00895FF -:10566000853009F449C0B8F1863009F456C0089570 -:1056700080918F02262F30E0280F311D2F3F3105FA -:1056800024F4680F60938F0208958FEF80938F0248 -:10569000089580918E02262F30E0280F311D2F3F74 -:1056A000310524F4680F60938E0208958FEF809384 -:1056B0008E02089580918D02262F30E0280F311D33 -:1056C0002F3F310524F4680F60938D0208958FEF0A -:1056D00080938D02089580918C02262F30E0280F50 -:1056E000311D2F3F310524F4680F60938C0208951B -:1056F0008FEF80938C02089580918B02262F30E0EB -:10570000280F311D2F3F310524F4680F60938B0261 -:1057100008958FEF80938B02089580918A02262F3F +:104260000F91FF90EF90DF90CF90BF900C94790763 +:1042700026960FB6F894DEBF0FBECDBFDF91CF916B +:104280001F910F91FF90EF90DF90CF90BF90089516 +:104290000E9442270E9452270E9417270E946C27E3 +:1042A0000E942D2B0E947C2A80E090E00E94611BDE +:1042B00080E090E00C94771B0E9432270C944821F8 +:1042C0000E949026292F22952F7030E02C30310546 +:1042D0004CF42A3031056CF422503109223031057A +:1042E00088F407C02C30310549F02F30310531F00A +:1042F00009C0803E48F0803F29F406C093FB882720 +:1043000080F9089580E0089581E00895CF93DF93C8 +:1043100000D000D01F92CDB7DEB70F900F900F9056 +:104320000F900F90DF91CF910895CF93DF9300D03E +:1043300000D000D0CDB7DEB726960FB6F894DEBF1A +:104340000FBECDBFDF91CF9108951F93CF93DF9321 +:10435000C091E90316E08091EA03C81799F0D0E014 +:104360001C9FF0011D9FF00D1124E551FC4F408171 +:10437000518162817381848195810E94952121966A +:10438000C770E9CFDF91CF911F91089540911B0431 +:1043900050911C0460911D0470911E0480911F04B3 +:1043A000909120040C9495218091200482958F7027 +:1043B00009F054C080911D04882309F44FC08091F6 +:1043C000E903A091EA0360911B0470911C044091E1 +:1043D0001E0450911F04B6E08A1709F43FC090E014 +:1043E00041155105C1F17F3F11F46F3FA1F1B89F15 +:1043F000F001B99FF00D1124E551FC4F218172139A +:104400002AC02081621327C02281211124C0238168 +:1044100034812417350710F421503109241B350B42 +:10442000283C3105C0F4209120042F702061209396 +:10443000200426E0289FF001299FF00D1124E0516F +:10444000FC4F80818F70806180838BE194E00E94BB +:10445000A41D0C94A52101968770BECF0895CF921C +:10446000DF92EF92FF920F931F93CF93DF93CDB71D +:10447000DEB762970FB6F894DEBF0FBECDBF8C01DA +:1044800085E0F801DE011D9601900D928A95E1F715 +:10449000D8014C9111965C91119712966C911297DC +:1044A0001396CD90DC90149730911B0470911C04EE +:1044B00080911E0490911F04009709F46BC17F3F07 +:1044C00019F43F3F09F466C1E0901D04EE2009F4A1 +:1044D000C0C020912004C816D90628F0F601E81BB8 +:1044E000F90BCF0104C0809590958C0D9D1DFF2484 +:1044F000F394883C910578F0F12C207F09F0C6C038 +:104500007C2DD98AC88A89890E9486218BE194E012 +:104510000E94A41DB1C0822F807F09F046C0751390 +:1045200014C0341312C0611110C02F702061209389 +:1045300020040E94C6218BE194E00E94A41D80917A +:104540002004D80115968C932EC0CD2819F15F3F19 +:1045500011F44F3FF9F0F62E61111CC08091E90370 +:104560002091EA0336E0821709F45AC090E0389FA0 +:10457000F001399FF00D1124E551FC4F7181571363 +:1045800006C07081471303C07281711103C0019688 +:104590008770E9CFF62E662309F418C180912004B4 +:1045A000816080932004F12C11C1751308C034136D +:1045B00006C0611104C080912004D801C3C04D879A +:1045C0005E878D859E856A8B0E9460216A8988231B +:1045D000E1F16623D1F120912004822F82958F7022 +:1045E00090E0029774F080911B0490911C049887CE +:1045F0008F831986DB86CA862C87CE0107960E9498 +:10460000A41D86E0F801ABE1B4E001900D928A951B +:10461000E1F70E94D4210E94C621FF24F394D6C062 +:104620004D875E878D859E850E949026292F229535 +:104630002F7030E0223031050CF0BCC09F7009F0C3 +:10464000B6C0805E883008F4C1C0C8010E94A41DB5 +:10465000E4CFC816D90608F453C0F601E81BF90BDD +:10466000CF01883C910508F450C0F12C7C2DD98AEB +:10467000C88A89890E948621EBE1F4E086E0DF01A7 +:104680001D928A95E9F70E94C621A0C0751314C037 +:10469000341312C0611110C080912004F801858389 +:1046A000C8010E94A41D86E0EBE1F4E0DF011D9249 +:1046B0008A95E9F7FE2C8AC04D875E878D859E8599 +:1046C0006A8B0E9460216A89882309F4BECF662321 +:1046D00009F4BBCF20912004822F82958F7090E047 +:1046E00002970CF48ECF80911B0490911C049A8346 +:1046F00089831B82DD82CC822E83CE0101967FCFFF +:10470000809590958C0D9D1DACCFF62E662309F4F7 +:104710009CCF75132EC034132CC02091200420FD93 +:104720001FC0822F82958F70D9F0D80115962C93D7 +:1047300015978F3049F08F5F982F9295907F822F39 +:104740008F70892B15968C93C8010E94A41D86E05A +:10475000F801ABE1B4E001900D928A95E1F793CFB7 +:1047600086E0F801ABE1B4E001900D928A95E1F7A3 +:104770002DC04D875E878D859E850E9460218111A9 +:1047800040CF80912004816080932004C8010E9462 +:10479000A41D1CC0662309F458CF4D875E878D8504 +:1047A0009E850E946021882309F44FCF2ACF811172 +:1047B00048CF0CC0243031050CF047CF9F7009F46E +:1047C00040CFF8019581907F09F03BCF8F2D629605 +:1047D0000FB6F894DEBF0FBECDBFDF91CF911F9112 +:1047E0000F91FF90EF90DF90CF9008951F93CF939C +:1047F000DF93CDB7DEB72C970FB6F894DEBF0FBEB0 +:10480000CDBF4F83588769877A878B879C87CE0176 +:1048100007960E942F22882369F08F8198852A8528 +:104820003B85232BF1F19F3F09F063C08F3F09F0D7 +:1048300060C037C086E0FE013796DE011196019018 +:104840000D928A95E1F76F817885EA85FB8530972F +:1048500041F17F3F11F46F3F21F12091EA0330E0F5 +:10486000C9010196877099274091E90350E08417A8 +:10487000950709F447C069837A83FD83EC8396E04A +:10488000929FD001939FB00D1124A551BC4FFE0102 +:10489000319601900D929A95E1F78093EA030E9478 +:1048A000A52116E08091E9039091EA038917C1F1EF +:1048B000189FC001112485519C4F0E942F228823EC +:1048C00079F1E091E9031E9FF0011124E551FC4FBD +:1048D0004081518162817381848195810E949521FB +:1048E0008091E90390E00196877099278093E9030E +:1048F000D9CF4F81588569857A858B859C850E94A3 +:104900009521CFCF0E945C211092EA031092E90317 +:10491000EBE1F4E086E0DF011D928A95E9F7C1CF73 +:104920002C960FB6F894DEBF0FBECDBFDF91CF91AE +:104930001F910895EF92FF920F931F93CF93DF93F0 +:104940008C01009709F46CC0F12CEE24E394E8018B +:104950002196F8018491843740F4843008F051C0E6 +:10496000813081F0823019F15BC0853709F444C091 +:10497000A8F19CE7980F903708F052C08F770E94FB +:10498000471D41C00E5F1F4FFE01C49180E28C0F96 +:10499000883048F4C7708E2D01C0880FCA95EAF799 +:1049A0000E94452714C08C2F0E947F1C2DC00E5FD3 +:1049B0001F4FFE01C49180E28C0F883058F4C770FD +:1049C0008E2D01C0880FCA95EAF70E944B270E94DE +:1049D0006C271AC08C2F0E94471D16C00E5F1F4FF8 +:1049E000FE01C491CC2381F08FE99FE00197F1F79C +:1049F00000C00000C150F6CF0E5F1F4FFE01F490C3 +:104A000003C00E947F1C8E018F2D882309F49FCF45 +:104A1000EFE9FFE03197F1F700C000008150F5CFDA +:104A2000DF91CF911F910F91FF90EF90089508951E +:104A300060932504709326048093270490932804A0 +:104A40000C9448210F931F93009125041091260484 +:104A50002091270430912804DC01CB01802B912B7D +:104A6000A22BB32B8093250490932604A0932704B4 +:104A7000B09328041F910F910C9448210F931F931A +:104A800000912504109126042091270430912804D8 +:104A9000DC01CB0180239123A223B323809325043F +:104AA00090932604A0932704B09328041F910F919C +:104AB0000C9448210F931F93009125041091260414 +:104AC0002091270430912804DC01CB018027912715 +:104AD000A227B3278093250490932604A09327044C +:104AE000B09328041F910F910C9448211092210437 +:104AF0001092220410922304109224040C94482152 +:104B000041E050E060E070E004C0440F551F661FB4 +:104B1000771F8A95D2F74093210450932204609323 +:104B20002304709324040C94482141E050E060E099 +:104B300070E004C0440F551F661F771F8A95D2F797 +:104B40008091210490912204A0912304B091240427 +:104B5000482B592B6A2B7B2B409321045093220422 +:104B600060932304709324040C94482141E050E0A6 +:104B700060E070E004C0440F551F661F771F8A95E0 +:104B8000D2F7409550956095709580912104909151 +:104B90002204A0912304B0912404482359236A23BA +:104BA0007B23409321045093220460932304709349 +:104BB00024040C94482141E050E060E070E004C01F +:104BC000440F551F661F771F8A95D2F780912104E5 +:104BD00090912204A0912304B091240448275927DE +:104BE0006A277B2740932104509322046093230477 +:104BF000709324040C9448210F931F930091210477 +:104C0000109122042091230430912404DC01CB0173 +:104C1000802B912BA22BB32B809321049093220401 +:104C2000A0932304B09324041F910F910C94482166 +:104C30000F931F93009121041091220420912304CB +:104C400030912404DC01CB0180239123A223B323E0 +:104C50008093210490932204A0932304B09324040E +:104C60001F910F910C9448210F931F9300912104E1 +:104C7000109122042091230430912404DC01CB0103 +:104C800080279127A227B3278093210490932204A1 +:104C9000A0932304B09324041F910F910C944821F6 +:104CA0000895CF92DF92EF92FF920F931F93CF93CD +:104CB000DF938C01C0902504D0902604E090270457 +:104CC000F09028048091210490912204A091230463 +:104CD000B0912404C82AD92AEA2AFB2ACFE1D0E0DD +:104CE000D701C6010C2E04C0B695A7959795879558 +:104CF0000A94D2F780FF06C0B8018C2F0E94D30916 +:104D0000019721F4219760F780E001C08C2FDF919B +:104D1000CF911F910F91FF90EF90DF90CF9008956A +:104D2000CF93DF93EC010E945126BE010E94D3096C +:104D3000DF91CF910895CB010E9490260895909124 +:104D40008402992321F090918502911109C020914C +:104D5000860230918702F90132969FEF40E01FC032 +:104D6000982F9695969596959F3050F5E0918602EE +:104D7000F0918702E90FF11D877021E030E0A90171 +:104D800002C0440F551F8A95E2F7CA019181892B11 +:104D9000818308959F3F39F04F5F4E3041F051912C +:104DA0005813F8CF0DC05111F7CF942FF5CF9F3F77 +:104DB00039F0F901E90FF11D97FDFA958283089505 +:104DC000089590918402992321F090918502911188 +:104DD00009C02091860230918702F9013296205F46 +:104DE0003F4F1FC0982F9695969596959F30F0F45B +:104DF000E0918602F0918702E90FF11D877021E0B2 +:104E000030E0A90102C0440F551F8A95E2F7CA019C +:104E1000809591818923818308953196E217F30764 +:104E200029F090819813F9CF1082F7CF089581E08F +:104E300090E0E0918602F0918702E80FF91F10825E +:104E4000019680319105A9F7089590913C04892B32 +:104E500080933C040895809590913C04892380932D +:104E60003C04089510923C04089590913B04892BD2 +:104E700080933B040895809590913B04892380930F +:104E80003B04089510923B04089590913A04892BB5 +:104E900080933A040895809590913A0489238093F1 +:104EA0003A04089510923A040895809329040895CD +:104EB0001092290408958091860290918702FC0146 +:104EC00031969C01205F3F4F80E0919191118F5F5F +:104ED000E217F307D1F70895E0918602F091870277 +:104EE00080913C048083E0918602F091870290815A +:104EF00080913B04892B8083E0918602F0918702A8 +:104F0000908180913A04892B8083809129048823A1 +:104F100061F0E0918602F09187029081892B808375 +:104F20000E945B2781111092290480918602909142 +:104F300087020C944B1B80915E04843039F11092EF +:104F40003E0420E488E190E00FB6F894A8958093A1 +:104F500060000FBE2093600080E00E94300580E07A +:104F60000E94AE0A83B7817F846083BF83B781606C +:104F700083BF7894889583B78E7F83BF88E10FB60F +:104F8000F89480936000109260000FBE0895089519 +:104F90000895CF9380E00E9430050E94C7270E94A9 +:104FA000650C0E94C827C0E08C2F0E94AE0D892B93 +:104FB00029F4CF5FC430C1F780E001C081E0CF9118 +:104FC00008950E945C2180E00E9430050E94562DC9 +:104FD0000E943F1B0C94AE0A1F920F920FB60F92C5 +:104FE00011248F939F93AF93BF9380913E048111BF +:104FF00013C080913F0490914004A0914104B0916E +:1050000042044196A11DB11D80933F04909340043A +:10501000A0934104B0934204BF91AF919F918F91AF +:105020000F900FBE0F901F90189582E084BD93E003 +:1050300095BD9AEF97BD80936E0008952FB7F894B1 +:1050400080913F0490914004A0914104B0914204AA +:105050002FBF0895CF92DF92EF92FF920F931F938D +:105060002FB7F89440913F0450914004609141045F +:10507000709142042FBF6A017B01EE24FF248C0152 +:1050800020E030E0C016D106E206F30610F44150ED +:1050900051099A01281B390BC9011F910F91FF90EB +:1050A000EF90DF90CF9008951F920F920FB60F925E +:1050B00011248F939F93AF93BF9380913F0490915E +:1050C0004004A0914104B09142040196A11DB11D7C +:1050D00080933F0490934004A0934104B093420412 +:1050E000BF91AF919F918F910F900FBE0F901F9026 +:1050F00018950E943C18F8942FEF87EA91E621500A +:1051000080409040E1F700C0000087E090EBDC01B8 +:105110008093690490936A04A0936B04B0936C0429 +:105120009CE088E10FB6F894A895809360000FBECC +:1051300090936000FFCF0E94DA28811102C00E9484 +:10514000B6280E94E52880933D040E94F2288093AF +:10515000670487FB882780F9809385020E94E928ED +:10516000682F70E080E090E00C9418256DEE7EEFE3 +:1051700080E090E00E94093260E082E090E00E94CE +:10518000F73160E083E090E00E94F73160E084E076 +:1051900090E00E94F73160E085E090E00E94F731F6 +:1051A00060E086E090E00E94F7316FEF87E090E0EA +:1051B0000C94F73180E090E00E94F13121E08D3EC7 +:1051C0009E4F09F020E0822F089582E090E00C9439 +:1051D000E93183E090E00C94E931682F83E090E0BE +:1051E0000C94F73184E090E00C94E931682F84E06E +:1051F00090E00C94F73186E090E00C94E931682F50 +:1052000086E090E00C94F73187E090E00C94E9316F +:10521000682F87E090E00C94F7318091450480FF7F +:105220000BC060918B0285E0689FB00111247595D9 +:105230006795759567952BC081FF09C060918B02BA +:1052400085E0689FB00111247595679520C082FFA5 +:1052500007C060918B0285E0689FB001112417C0E0 +:10526000909146049923D1F060918A02961788F7AD +:1052700020918B0285E0289F90011124929FA0012C +:10528000939F500D112470E0CA010E94CF31603805 +:10529000710540F46115710539F002C065E070E0F8 +:1052A000862F08958FE7089581E008958091450441 +:1052B00080FF08C06091890270E0759567957595CB +:1052C000679521C081FF06C06091890270E07595E5 +:1052D000679519C082FF04C06091890270E010C018 +:1052E000909146049923C1F0609188029617A0F727 +:1052F00080918902899FC001112470E00E94CF3102 +:105300006038710528F46115710521F0862F089524 +:105310008FE7089581E0089561E070E0F4CF803F69 +:1053200021F40E940D29819504C0813F29F40E9437 +:105330000D29809349040895823F21F40E940D298C +:10534000819504C0833F29F40E940D29809348046D +:105350000895893F19F40E94562905C08A3F31F407 +:105360000E945629819580934A0408958B3F21F429 +:105370000E945629819504C08C3F29F40E94562929 +:1053800080934B040895843F21F480914704816009 +:1053900017C0853F21F480914704826011C0863F89 +:1053A00021F48091470484600BC0873F21F48091F1 +:1053B0004704886005C0883F31F4809147048061CC +:1053C0008093470408958D3F21F4809145048160C6 +:1053D0000BC08E3F21F480914504826005C08F3F51 +:1053E00029F4809145048460809345040895803FAA +:1053F00039F48091490487FF6CC01092490469C058 +:10540000813F29F4809149041816BCF362C0909141 +:105410004804823F29F497FF5CC01092480459C0A9 +:10542000833F19F41916CCF354C0893F41F480919D +:105430004A0418160CF04DC010924A044AC08A3F24 +:1054400029F480914A0487FF44C0F6CF8B3F39F49A +:1054500080914B0487FF3DC010924B043AC08C3FB3 +:1054600029F480914B041816BCF333C0843F21F417 +:10547000809147048E7F17C0853F21F480914704B7 +:105480008D7F11C0863F21F4809147048B7F0BC034 +:10549000873F21F480914704877F05C0883F31F41E +:1054A000809147048F7E8093470413C08D3F21F481 +:1054B000809145048E7F0BC08E3F21F4809145047E +:1054C0008D7F05C08F3F29F4809145048B7F8093A9 +:1054D00045048091480481110EC0809149048111D6 +:1054E0000AC080914A04811106C080914B04811149 +:1054F00002C010924604089587E494E00E94561B6F +:105500000E941E28909344048093430408951F939F +:10551000CF93DF9380914304909144040E942A2802 +:10552000AC0190914604992321F020918C0230E047 +:1055300006C020918D028AE0289F90011124421715 +:10554000530708F486C080914804C0914904D09163 +:105550004A0410914B04811107C0C11176C0D111CA +:1055600074C0111172C075C09F3F19F09F5F909376 +:105570004604181624F40E940D2980934804809153 +:10558000480487FF05C00E940D2981958093480437 +:105590001C1624F40E940D2980934904809149042B +:1055A00087FF05C00E940D29819580934904609171 +:1055B0004804662339F1C0914904CC2319F17727B7 +:1055C00067FD7095872F972F0E94F12E23E333E319 +:1055D00043E35FE30E9401300E94BE2E60934804C3 +:1055E0006C2F772767FD7095872F972F0E94F12EDC +:1055F00023E333E343E35FE30E9401300E94BE2EC6 +:10560000609349041D1624F40E94562980934A048D +:1056100080914A0487FF05C00E9456298195809396 +:105620004A04111624F40E94562980934B04809159 +:105630004B0487FF05C00E945629819580934B0437 +:10564000DF91CF911F910C947C2A9F3F09F08ECF60 +:1056500096CFDF91CF911F910895E7E4F4E085E0C4 +:10566000DF011D928A95E9F71092460410924504D5 +:105670000895833081F128F4813059F08230D1F0DF +:105680000895853009F449C0B8F1863009F456C050 +:10569000089580918D02262F30E0280F311D2F3F75 +:1056A000310524F4680F60938D0208958FEF809385 +:1056B0008D02089580918C02262F30E0280F311D35 +:1056C0002F3F310524F4680F60938C0208958FEF0B +:1056D00080938C02089580918B02262F30E0280F52 +:1056E000311D2F3F310524F4680F60938B0208951C +:1056F0008FEF80938B02089580918A02262F30E0ED +:10570000280F311D2F3F310524F4680F60938A0262 +:1057100008958FEF80938A02089580918902262F41 :1057200030E0280F311D2F3F310524F4680F6093BE -:105730008A0208958FEF80938A020895833011F1D1 -:1057400028F4813049F0823091F00895853081F15C -:1057500020F18630C1F1089580918F02681720F4FE -:10576000861B80938F02089510928F020895809176 -:105770008E02681720F4861B80938E020895109283 -:105780008E02089580918D02681720F4861B809305 -:105790008D02089510928D02089580918C026817F1 -:1057A00020F4861B80938C02089510928C02089539 -:1057B00080918B02681720F4861B80938B020895DA -:1057C00010928B02089580918A02681720F4861B3C -:1057D00080938A02089510928A0208950F931F936E -:1057E000873208F048C08E3108F094C0803109F447 -:1057F0007EC008F5873009F468C068F4863009F087 -:10580000A4C08091ED03817F8E7F8093ED0381E0C2 -:105810008093FD039BC08B3009F490C08E3009F05B -:1058200094C08091ED0382FB222720F991E092271A -:1058300090FB82F965C0863109F480C060F4813143 -:1058400009F083C00E944B219091870281E0892753 -:105850008093870273C0893109F470C08B3109F0DD -:1058600074C08091ED0381FB222720F991E09227FB -:1058700090FB81F945C0883309F460C050F4893247 -:1058800009F45EC0853309F45BC0873209F458C05F -:105890005CC0833409F454C028F48A3308F455C03A -:1058A000895339C0883409F050C00E944B210E94AE -:1058B00090060FEF13ED20E3015010402040E1F778 -:1058C00000C000000E94682839C09091ED03892F24 -:1058D0008095817080FB90F929F096609860909394 -:1058E000ED0334C0997F977F9093ED0327C080919B -:1058F000ED0383FB222720F991E0922790FB83F9A7 -:105900008093ED039923D1F08091ED038160809322 -:10591000ED0314C08D5141E050E060E070E08A0179 -:105920009B0104C0000F111F221F331F8A95D2F75D -:10593000C901B8010E9407250E944B2181E006C0E1 -:1059400061E070E080E090E0F5CF80E01F910F9182 -:10595000089580E0089580E00895CF93C82F809146 -:10596000FD03813069F018F08230C9F184C0E09104 -:105970008802F09189028081823209F07EC007C0DE -:10598000E0918802F09189028081823261F48C2F4B -:105990000E94A92C811104C08C2F0E94EE2B1DC0E7 -:1059A00081E090E01AC08C2F0E94AB2C811114C0B2 -:1059B000C43179F048F4CB3079F0C03109F061C0DE -:1059C00082E08093FD0308C0C93219F0C83321F08A -:1059D00058C01092FD0355C081E0817054C0C93297 -:1059E00091F120F5C43179F1B0F4C73009F047C026 -:1059F0008EE180938F0282E380938E028AE080930F -:105A00008D0284E180938C0288E080938B0288E28F -:105A100080938A0234C0CE51C63088F5EC2FF0E076 -:105A2000E65FFC4F80818093FC0329C0CE34E9F00F -:105A300020F4CB3421F56AE013C0C13579F0C235CA -:105A4000F1F461E00DC08091FC03882319F01092FD -:105A5000FC0315C081E08093FD0315C061E006C022 -:105A60008091FC030E94282B0AC06AE08091FC030D -:105A70000E949E2B04C01092FD0380E004C081E0D0 -:105A800002C080E0AACFCF9108950E94C928811159 -:105A900002C00E94A5280E94EA288093180480FF73 -:105AA00002C0869501C080E00C94540580911804D2 -:105AB000982F9695292F30E0233031054CF49F5FC5 -:105AC000990F8170892B8160809318040E94EE28C1 -:105AD0008091180486950C94540580911804982F91 -:105AE000969591F09158990F8170892B80931804A5 -:105AF0008E7F91E009F490E08091180490FB80F98A -:105B0000809318040E94EE288091180486950C94C6 -:105B1000540580911804982F909590FB80F98093FC -:105B200018040E94EE288091180480FF02C0869518 -:105B300001C080E00C94540590911804892F86953B -:105B40008F5F8F779170843028F4880F892B809332 -:105B5000180402C090931804809118048E7F91E07D -:105B600009F490E08091180490FB80F98093180468 -:105B70000E94EE288091180486950C94540520917B -:105B80001804922F96958927982F990F822F81704C -:105B9000892B809318048E7F91E009F490E0809126 -:105BA000180490FB80F9809318040E94EE288091DD -:105BB000180486950C9454055058BB27AA270ED07C -:105BC00075C166D130F06BD120F031F49F3F11F4F4 -:105BD0001EF45BC10EF4E095E7FB51C1E92F77D1CC -:105BE00080F3BA17620773078407950718F071F4FA -:105BF0009EF58FC10EF4E0950B2EBA2FA02D0B0150 -:105C0000B90190010C01CA01A0011124FF27591B01 -:105C100099F0593F50F4503E68F11A16F040A22F07 -:105C2000232F342F4427585FF3CF46953795279578 -:105C3000A795F0405395C9F77EF41F16BA0B620B77 -:105C4000730B840BBAF09150A1F0FF0FBB1F661FBE -:105C5000771F881FC2F70EC0BA0F621F731F841F01 -:105C600048F4879577956795B795F7959E3F08F027 -:105C7000B3CF9395880F08F09927EE0F97958795E6 -:105C80000895D9D008F481E008950CD00FC107D150 -:105C900040F0FED030F021F45F3F19F0F0C0511118 -:105CA00039C1F3C014D198F39923C9F35523B1F343 -:105CB000951B550BBB27AA2762177307840738F07B -:105CC0009F5F5F4F220F331F441FAA1FA9F333D0DA -:105CD0000E2E3AF0E0E830D091505040E695001C8E -:105CE000CAF729D0FE2F27D0660F771F881FBB1F4A -:105CF000261737074807AB07B0E809F0BB0B802D24 -:105D0000BF01FF2793585F4F2AF09E3F510568F06F -:105D1000B6C000C15F3FECF3983EDCF38695779503 -:105D20006795B795F7959F5FC9F7880F911D969571 -:105D3000879597F90895E1E0660F771F881FBB1FCD -:105D4000621773078407BA0720F0621B730B840B7A -:105D5000BA0BEE1F88F7E095089504D06894B1114E -:105D6000D9C00895BCD088F09F5790F0B92F9927DB -:105D7000B751A0F0D1F0660F771F881F991F1AF056 -:105D8000BA95C9F712C0B13081F0C3D0B1E008951F -:105D9000C0C0672F782F8827B85F39F0B93FCCF3A0 -:105DA000869577956795B395D9F73EF4909580954C -:105DB000709561957F4F8F4F9F4F0895E89409C06C -:105DC00097FB3EF490958095709561957F4F8F4F2E -:105DD0009F4F9923A9F0F92F96E9BB279395F69544 -:105DE000879577956795B795F111F8CFFAF4BB0FC2 -:105DF00011F460FF1BC06F5F7F4F8F4F9F4F16C026 -:105E0000882311F096E911C0772321F09EE8872FAF -:105E1000762F05C0662371F096E8862F70E060E06B -:105E20002AF09A95660F771F881FDAF7880F9695E4 -:105E3000879597F90895990F0008550FAA0BE0E888 -:105E4000FEEF16161706E807F907C0F0121613063C -:105E5000E407F50798F0621B730B840B950B39F47C -:105E60000A2661F0232B242B252B21F408950A26E2 -:105E700009F4A140A6958FEF811D811D089597F922 -:105E80009F6780E870E060E008959FEF80EC0895E0 -:105E900000240A9416161706180609060895002409 -:105EA0000A9412161306140605060895092E039483 -:105EB000000C11F4882352F0BB0F40F4BF2B11F4F7 -:105EC00060FF04C06F5F7F4F8F4F9F4F089557FD56 -:105ED0009058440F551F59F05F3F71F04795880F58 -:105EE00097FB991F61F09F3F79F0879508951216EF -:105EF00013061406551FF2CF4695F1DF08C016169B -:105F000017061806991FF1CF86957105610508944B -:105F10000895E894BB2766277727CB0197F9089562 -:105F20008ADF08F48FEF08950BD0C0CFB1DF28F0DF -:105F3000B6DF18F0952309F0A2CFA7CF1124EACF3E -:105F4000C6DFA0F3959FD1F3950F50E0551F629FD8 -:105F5000F001729FBB27F00DB11D639FAA27F00DC2 -:105F6000B11DAA1F649F6627B00DA11D661F829FE9 -:105F70002227B00DA11D621F739FB00DA11D621FCE -:105F8000839FA00D611D221F749F3327A00D611DEB -:105F9000231F849F600D211D822F762F6A2F1124CD -:105FA0009F5750408AF0E1F088234AF0EE0FFF1F20 -:105FB000BB1F661F771F881F91505040A9F79E3F57 -:105FC000510570F05CCFA6CF5F3FECF3983EDCF359 -:105FD000869577956795B795F795E7959F5FC1F794 -:105FE000FE2B880F911D9695879597F90895FA01D4 -:105FF000EE0FFF1F30962105310599F161157105EE -:1060000061F48038BFE39B0749F1689490388105BB -:1060100061F08038BFEF9B0741F0992342F5FF3FC5 -:10602000E1053105210511F1E8940894E795D901BE -:10603000AA2329F4AB2FBE2FF85FD0F310C0FF5F67 -:1060400070F4A695E0F7F73950F019F0FF3A38F4FC -:106050009F779F930CD00F9007FC905808953EF0C7 -:1060600014CF60E070E080E89FE308954FE79F77EA -:106070005F934F933F932F939ED02F913F914F91DA -:106080005F9152DF05C019F40EF0F9CE42CFFDCE7C -:1060900026DFC8F39638C0F707F80F92E8942BE391 -:1060A0003AEA48EB5FE74EDF0F920F920F924DB73F -:1060B0005EB70F92C0D0E4E4F1E016D04F915F914B -:1060C000EF91FF91E595EE1FFF1F49F0FE57E06845 -:1060D0004427EE0F441FFA95E1F74195550B32D056 -:1060E0000F9007FE26C00895DF93CF931F930F9361 -:1060F000FF92EF92DF927B018C01689405C0DA2E4B -:10610000EF011EDFFE01E894A5912591359145919F -:106110005591AEF3EF0162DDFE019701A801DA941B -:1061200079F7DF90EF90FF900F911F91CF91DF9162 -:1061300008959B01AC0160E070E080E89FE3A5CD8D -:106140009ECEACC0CCDEE8F39923D9F3940F511D59 -:10615000BBF39150504094F059F0882332F0660F11 -:10616000771F881F91505040C1F79E3F510544F75B -:10617000880F911D9695879597F908955F3FACF02C -:10618000983E9CF0BB27869577956795B79508F460 -:10619000B1609395C1F7BB0F58F711F460FFE8CFDA -:1061A0006F5F7F4F8F4F9F4FE3CFB4CE0EF076C01F -:1061B0006CCE689464CE93DEC8F39923D1F3C6F312 -:1061C000DF93CF931F930F93FF92C92FDD2788236F -:1061D0002AF02197660F771F881FDAF720E030E05A -:1061E00040E85FEB9FE3883920F0803E30F0219655 -:1061F0008F77E3DCECE6F1E003C0DFDCE9E9F1E016 -:1062000073DF8B01BE01EC01FB2E6F577109759591 -:10621000771F880B990BD4DD28E132E741E35FE378 -:106220008FDEAF2D9801AE01FF900F911F91CF919E -:10623000DF91D4DC3BCEFA01DC01AA0FBB1F9B012E -:10624000AC01BF5728F422273327442750781FC0BA -:10625000B75188F4AB2F0024469537952795011C3C -:10626000A395D2F3002069F0220F331F441FB3958A -:10627000DAF30DD0A1CC61307105A0E88A07B946E8 -:1062800030F49B01AC0166277727882790783096F9 -:1062900021F0208331834283538308959F3F31F05F -:1062A000915020F4879577956795B795880F911D44 -:1062B0009695879597F90895AA1BBB1B51E107C0D6 -:1062C000AA1FBB1FA617B70710F0A61BB70B881F86 -:1062D000991F5A95A9F780959095BC01CD01089515 -:1062E00097FB072E16F4009407D077FD09D00E9483 -:1062F0005C3107FC05D03EF4909581959F4F089541 -:10630000709561957F4F0895EE0FFF1F0590F491F2 -:10631000E02D0994F999FECF92BD81BDF89A992795 -:1063200080B50895A8E1B0E042E050E00C94B231AD -:10633000262FF999FECF92BD81BDF89A019700B43E -:10634000021639F01FBA20BD0FB6F894FA9AF99ADE -:106350000FBE08950196272F0E9499310C94983111 -:10636000DC01CB01FC01F999FECF06C0F2BDE1BD15 -:10637000F89A319600B40D9241505040B8F7089504 -:04638000F894FFCFBF -:1063840007000C52D02445000000410000DC44000A -:1063940000004152D0A4440000404100005C44008D -:1063A40000004148F17644000000415C978A4400B3 -:1063B4000000411FD592440000004152D0A4440083 -:1063C4000000415CFFB844000000410AA7CF44002C -:1063D4000000410000DC44000000410AA7CF440053 -:1063E4000000410000DC4400000041000000000007 -:1063F40000804000005C45000040410000000000B7 -:1064040000804052D02445000040410AA7CF4400F8 -:106414000000410000DC44000000410000000000D6 -:1064240000804052D024450000404100000000009C -:1064340000804000005C45000040410AA7CF4400B2 -:106444000000410000DC44000000410000000000A6 -:1064540000804052D024450000404100000000006C -:106464000080400AA74F45000040410AA7CF4400DE -:106474000000410000DC4400000041000000000076 -:1064840000804052D024450000004100000000007C -:106494000080405CFF38450000004100000000001F -:1064A40000804052D02445000000410AA7CF440098 -:1064B4000000410000DC4400000041000000000036 -:1064C40000804052D024450000804153D024450030 -:1064D40000404160970A450000004154D0A44400A4 -:1064E4000000410000DC440000004160970A4500C0 -:1064F40000A041050000003F0000C8423214C0144F -:106504009D14691435140101DA032808140A321E93 -:106514000000020004000500070009000B000C0045 -:106524000E001000110013001500170018001A00C7 -:106534001C001D001F002100230024002600280049 -:1065440029002B002D002F003000320034003500CC -:10655400370039003B00400045002500260061005B -:106564006000200037006400650066006700440096 -:106574004600240047003F4D3639BD0970093A09E9 -:1065840001099408AD08C608DF08010203040506E2 -:0465940007080900EB +:10573000890208958FEF80938902089580918802ED +:10574000262F30E0280F311D2F3F310524F4680F3C +:105750006093880208958FEF8093880208958330C4 +:1057600011F128F4813049F0823091F008958530AC +:1057700081F120F18630C1F1089580918D02681782 +:1057800020F4861B80938D02089510928D02089557 +:1057900080918C02681720F4861B80938C020895F8 +:1057A00010928C02089580918B02681720F4861B5A +:1057B00080938B02089510928B02089580918A0243 +:1057C000681720F4861B80938A02089510928A023B +:1057D000089580918902681720F4861B80938902BE +:1057E000089510928902089580918802681720F424 +:1057F000861B8093880208951092880208950F9363 +:105800001F93873208F048C08E3108F094C0803171 +:1058100009F47EC008F5873009F468C068F4863062 +:1058200009F0A4C080913D04817F8E7F80933D0468 +:1058300081E080934D049BC08B3009F490C08E3082 +:1058400009F094C080913D0482FB222720F991E069 +:10585000922790FB82F965C0863109F480C060F41C +:10586000813109F083C00E945C219091850281E022 +:1058700089278093850273C0893109F470C08B3108 +:1058800009F074C080913D0481FB222720F991E04A +:10589000922790FB81F945C0883309F460C050F429 +:1058A000893209F45EC0853309F45BC0873209F49C +:1058B00058C05CC0833409F454C028F48A3308F417 +:1058C00055C0895339C0883409F050C00E945C210A +:1058D0000E946C060FEF13ED20E3015010402040B2 +:1058E000E1F700C000000E94792839C090913D0482 +:1058F000892F8095817080FB90F929F096609860DF +:1059000090933D0434C0997F977F90933D0427C0C6 +:1059100080913D0483FB222720F991E0922790FBA0 +:1059200083F980933D049923D1F080913D048160F7 +:1059300080933D0414C08D5141E050E060E070E080 +:105940008A019B0104C0000F111F221F331F8A957B +:10595000D2F7C901B8010E9418250E945C2181E09C +:1059600006C061E070E080E090E0F5CF80E01F913C +:105970000F91089580E0089580E00895CF93C82F97 +:1059800080914D04813069F018F08230C9F184C0F3 +:10599000E0918602F09187028081823209F07EC018 +:1059A00007C0E0918602F09187028081823261F423 +:1059B0008C2F0E94BA2C811104C08C2F0E94FF2BC7 +:1059C0001DC081E090E01AC08C2F0E94BC2C811178 +:1059D00014C0C43179F048F4CB3079F0C03109F00B +:1059E00061C082E080934D0408C0C93219F0C83309 +:1059F00021F058C010924D0455C081E0817054C010 +:105A0000C93291F120F5C43179F1B0F4C73009F011 +:105A100047C08EE180938D0282E380938C028AE0FE +:105A200080938B0284E180938A0288E080938902CC +:105A300088E28093880234C0CE51C63088F5EC2FBE +:105A4000F0E0E85AFC4F808180934C0429C0CE34AA +:105A5000E9F020F4CB3421F56AE013C0C13579F0C8 +:105A6000C235F1F461E00DC080914C04882319F037 +:105A700010924C0415C081E080934D0415C061E084 +:105A800006C080914C040E94392B0AC06AE08091C4 +:105A90004C040E94AF2B04C010924D0480E004C05F +:105AA00081E002C080E0AACFCF9108950E94DA2859 +:105AB000811102C00E94B6280E94FB2880936804CE +:105AC00080FF02C0869501C080E00C943005809173 +:105AD0006804982F9695292F30E0233031054CF437 +:105AE0009F5F990F8170892B8160809368040E9469 +:105AF000FF288091680486950C9430058091680495 +:105B0000982F969591F09158990F8170892B8093D9 +:105B100068048E7F91E009F490E08091680490FB26 +:105B200080F9809368040E94FF288091680486951C +:105B30000C94300580916804982F909590FB80F923 +:105B4000809368040E94FF288091680480FF02C04F +:105B5000869501C080E00C94300590916804892FEF +:105B600086958F5F8F779170843028F4880F892B0A +:105B70008093680402C090936804809168048E7FCB +:105B800091E009F490E08091680490FB80F98093A3 +:105B900068040E94FF288091680486950C94300563 +:105BA00020916804922F96958927982F990F822F1C +:105BB0008170892B809368048E7F91E009F490E0D6 +:105BC0008091680490FB80F9809368040E94FF280C +:105BD0008091680486950C9430055058BB27AA27FD +:105BE0000ED0D1C1C2D130F0C7D120F031F49F3FE7 +:105BF00011F41EF4B7C10EF4E095E7FB9FC1E92F45 +:105C0000D3D180F3BA17620773078407950718F09A +:105C100071F49EF5EBC10EF4E0950B2EBA2FA02D7A +:105C20000B01B90190010C01CA01A0011124FF2749 +:105C3000591B99F0593F50F4503E68F11A16F04044 +:105C4000A22F232F342F4427585FF3CF4695379543 +:105C50002795A795F0405395C9F77EF41F16BA0B08 +:105C6000620B730B840BBAF09150A1F0FF0FBB1FB6 +:105C7000661F771F881FC2F70EC0BA0F621F731FFF +:105C8000841F48F4879577956795B795F7959E3F5C +:105C900008F0B3CF9395880F08F09927EE0F9795EA +:105CA0008795089527D108F481E008950CD06BC141 +:105CB00063D140F05AD130F021F45F3F19F03EC17A +:105CC000511195C14FC170D198F39923C9F3552350 +:105CD000B1F3951B550BBB27AA27621773078407DF +:105CE00038F09F5F5F4F220F331F441FAA1FA9F395 +:105CF00033D00E2E3AF0E0E830D091505040E69587 +:105D0000001CCAF729D0FE2F27D0660F771F881FE7 +:105D1000BB1F261737074807AB07B0E809F0BB0BD6 +:105D2000802DBF01FF2793585F4F2AF09E3F5105FA +:105D300068F004C15CC15F3FECF3983EDCF38695EC +:105D400077956795B795F7959F5FC9F7880F911D70 +:105D50009695879597F90895E1E0660F771F881F5C +:105D6000BB1F621773078407BA0720F0621B730B0F +:105D7000840BBA0BEE1F88F7E095089504D0689461 +:105D8000B11135C1089518D188F09F5790F0B92FFF +:105D90009927B751A0F0D1F0660F771F881F991F80 +:105DA0001AF0BA95C9F712C0B13081F01FD1B1E035 +:105DB00008951CC1672F782F8827B85F39F0B93F45 +:105DC000CCF3869577956795B395D9F73EF4909582 +:105DD0008095709561957F4F8F4F9F4F0895E89400 +:105DE00009C097FB3EF490958095709561957F4F23 +:105DF0008F4F9F4F9923A9F0F92F96E9BB279395D1 +:105E0000F695879577956795B795F111F8CFFAF4E0 +:105E1000BB0F11F460FF1BC06F5F7F4F8F4F9F4F11 +:105E200016C0882311F096E911C0772321F09EE86F +:105E3000872F762F05C0662371F096E8862F70E0D5 +:105E400060E02AF09A95660F771F881FDAF7880FAF +:105E50009695879597F9089588D018F011F08CD011 +:105E600038F480C0C4C0E92F9FD0B0F35523C9F3E4 +:105E7000E7FB6217730784079507A8F199F3E92FE9 +:105E8000FF2788232AF03197660F771F881FDAF7DC +:105E9000952F5527442332F091505040220F331F45 +:105EA000441FD2F7BB27E91BF50B621B730B840B56 +:105EB000B109C1F222F4620F731F841FB11D319723 +:105EC0002AF0660F771F881FBB1FEFCF91505040FD +:105ED0005AF041F0882332F0660F771F881F9150E7 +:105EE0005040C1F7939530C08695779567959F5F31 +:105EF000D9F7F8CF990F0008550FAA0BE0E8FEEF8D +:105F000016161706E807F907C0F012161306E4077D +:105F1000F50798F0621B730B840B950B39F40A2676 +:105F200061F0232B242B252B21F408950A2609F454 +:105F3000A140A6958FEF811D811D089597F99F6758 +:105F400080E870E060E008959F3F31F0915020F4C8 +:105F5000879577956795B795880F911D9695879545 +:105F600097F908959FEF80EC089500240A9416167F +:105F7000170618060906089500240A941216130637 +:105F8000140605060895092E0394000C11F48823C5 +:105F900052F0BB0F40F4BF2B11F460FF04C06F5FE1 +:105FA0007F4F8F4F9F4F089557FD9058440F551FB7 +:105FB00059F05F3F71F04795880F97FB991F61F08B +:105FC0009F3F79F087950895121613061406551F02 +:105FD000F2CF4695F1DF08C0161617061806991F6E +:105FE000F1CF86957105610508940895E894BB2763 +:105FF00066277727CB0197F908957CDF08F48FEFA8 +:1060000008950BD0C0CFB1DF28F0B6DF18F095238C +:1060100009F094CFA7CF1124EACFC6DFA0F3959F54 +:10602000D1F3950F50E0551F629FF001729FBB277F +:10603000F00DB11D639FAA27F00DB11DAA1F649F2B +:106040006627B00DA11D661F829F2227B00DA11DDE +:10605000621F739FB00DA11D621F839FA00D611D64 +:10606000221F749F3327A00D611D231F849F600D85 +:10607000211D822F762F6A2F11249F5750408AF0BE +:10608000E1F088234AF0EE0FFF1FBB1F661F771F4A +:10609000881F91505040A9F79E3F510570F04ECF98 +:1060A000A6CF5F3FECF3983EDCF386957795679536 +:1060B000B795F795E7959F5FC1F7FE2B880F911D68 +:1060C0009695879597F90895FA01EE0FFF1F309680 +:1060D0002105310599F16115710561F48038BFE33F +:1060E0009B0749F168949038810561F08038BFEFD3 +:1060F0009B0741F0992342F5FF3FE105310521055A +:1061000011F1E8940894E795D901AA2329F4AB2F5B +:10611000BE2FF85FD0F310C0FF5F70F4A695E0F7D4 +:10612000F73950F019F0FF3A38F49F779F930CD06D +:106130000F9007FC905808953EF014CF60E070E097 +:1061400080E89FE308954FE79F775F934F933F93D6 +:106150002F939ED02F913F914F915F9152DF05C0B9 +:1061600019F40EF0EBCE42CFFDCE26DFC8F3963801 +:10617000C0F707F80F92E8942BE33AEA48EB5FE7A1 +:106180004EDF0F920F920F924DB75EB70F92C0D0B5 +:10619000ECEFF0E016D04F915F91EF91FF91E59514 +:1061A000EE1FFF1F49F0FE57E0684427EE0F441F23 +:1061B000FA95E1F74195550B32D00F9007FE26C0B6 +:1061C0000895DF93CF931F930F93FF92EF92DF9287 +:1061D0007B018C01689405C0DA2EEF011EDFFE0101 +:1061E000E894A5912591359145915591AEF3EF0134 +:1061F00006DDFE019701A801DA9479F7DF90EF90B0 +:10620000FF900F911F91CF91DF9108959B01AC01F9 +:1062100060E070E080E89FE349CD90CE95CECCDE83 +:10622000E8F39923D9F3940F511DBBF391505040DB +:1062300094F059F0882332F0660F771F881F915031 +:106240005040C1F79E3F510544F7880F911D969528 +:10625000879597F908955F3FACF0983E9CF0BB2777 +:10626000869577956795B79508F4B1609395C1F7D2 +:10627000BB0F58F711F460FFE8CF6F5F7F4F8F4F70 +:106280009F4FE3CFB4CE0EF05FCE6CCE689456CE67 +:1062900093DEC8F39923D1F3C6F3DF93CF931F9313 +:1062A0000F93FF92C92FDD2788232AF02197660FCD +:1062B000771F881FDAF720E030E040E85FEB9FE3CC +:1062C000883920F0803E30F021968F7787DCE4E239 +:1062D000F1E003C083DCE1E5F1E073DF8B01BE0197 +:1062E000EC01FB2E6F5771097595771F880B990B81 +:1062F00078DD28E132E741E35FE38FDEAF2D9801DF +:10630000AE01FF900F911F91CF91DF9178DC3BCED2 +:10631000FA01DC01AA0FBB1F9B01AC01BF5728F497 +:1063200022273327442750781FC0B75188F4AB2F5A +:106330000024469537952795011CA395D2F300209C +:1063400069F0220F331F441FB395DAF30DD045CC0B +:1063500061307105A0E88A07B94630F49B01AC01B1 +:106360006627772788279078309621F0208331831D +:10637000428353830895AA1BBB1B51E107C0AA1F88 +:10638000BB1FA617B70710F0A61BB70B881F991FD6 +:106390005A95A9F780959095BC01CD01089597FB7A +:1063A000072E16F4009407D077FD09D00E94BB3168 +:1063B00007FC05D03EF4909581959F4F0895709508 +:1063C00061957F4F0895EE0FFF1F0590F491E02D2A +:1063D0000994F999FECF92BD81BDF89A992780B5AD +:1063E0000895A8E1B0E042E050E00C941132262F6D +:1063F000F999FECF92BD81BDF89A019700B40216BB +:1064000039F01FBA20BD0FB6F894FA9AF99A0FBE68 +:1064100008950196272F0E94F8310C94F731DC0182 +:10642000CB01FC01F999FECF06C0F2BDE1BDF89A9F +:10643000319600B40D9241505040B8F70895F89449 +:02644000FFCF8C +:106442000C52D02445000000410000DC4400000052 +:106452004152D0A4440000404100005C44000000CE +:106462004148F17644000000415C978A44000000F4 +:10647200411FD592440000004152D0A444000000C4 +:10648200415CFFB844000000410AA7CF440000006D +:10649200410000DC44000000410AA7CF4400000094 +:1064A200410000DC440000004100000000000080C8 +:1064B2004000005C450000404100000000000080F8 +:1064C2004052D02445000040410AA7CF44000000BA +:1064D200410000DC44000000410000000000008098 +:1064E2004052D024450000404100000000000080DE +:1064F2004000005C45000040410AA7CF4400000074 +:10650200410000DC44000000410000000000008067 +:106512004052D024450000404100000000000080AD +:10652200400AA74F45000040410AA7CF440000009F +:10653200410000DC44000000410000000000008037 +:106542004052D024450000004100000000000080BD +:10655200405CFF3845000000410000000000008060 +:106562004052D02445000000410AA7CF4400000059 +:10657200410000DC440000004100000000000080F7 +:106582004052D024450000804153D02445000040B1 +:106592004160970A450000004154D0A44400000025 +:1065A200410000DC440000004160970A450000A061 +:1065B20041050000003F0000C8424314D114AE144C +:1065C2007A14461401012A042808140A321E000013 +:1065D200020004000500070009000B000C000E0079 +:1065E2001000110013001500170018001A001C00FB +:1065F2001D001F002100230024002600280029007E +:106602002B002D002F0030003200340035003700FF +:1066120039003B0040004500250026006100600073 +:1066220020003700640065006600670044004600F1 +:10663200240047003149803F5D8B803FF8BF803F97 +:10664200CAE1803F73ED803FCAE1803FF8BF803FDF +:106652005D8B803F3149803F0000803FF16D7F3F7D +:1066620075EA7E3F4C827E3F833F7E3F84287E3F99 +:10667200833F7E3F4C827E3F75EA7E3FF16D7F3FD6 +:106682000000803F3F4D363975092809F208B908E4 +:106692004C0865087E0897080102030405060708EE +:0266A2000900ED :00000001FF diff --git a/keyboard/planck/planck_pcb_r4_w_bootloader.hex b/keyboard/planck/planck_pcb_r4_w_bootloader.hex index f2e9993ac..140bf415f 100644 --- a/keyboard/planck/planck_pcb_r4_w_bootloader.hex +++ b/keyboard/planck/planck_pcb_r4_w_bootloader.hex @@ -250,76 +250,76 @@ :107FE4000C94ED3E0C94113F0C94193F0C94213FDA :0C7FF4000C94F23E0C94033F0C94293FC7 :040000030000700089 -:100000000C94FE040C9442050C9442050C94420599 -:100010000C9442050C9442050C9442050C94420544 -:100020000C9442050C9442050C94A6180C94781973 -:100030000C94DB270C9442050C9442050C94420569 -:100040000C9442050C9442050C9442050C94420514 -:100050000C9442050C9443280C9442050C944205E0 -:100060000C9442050C9442050C9442050C944205F4 -:100070000C9442050C9442050C9442050C944205E4 -:100080000C94D10E0C9442050C9442050C9442053C -:100090000C9442050C9442050C9442050C944205C4 -:1000A0000C9442050C9442050C9442059D05AD0547 -:1000B000BF05CF05D505E405F005F60504060D06D8 -:1000C0001E062E06340664069013901390139013A8 -:1000D000901390139013901390139013A713A713DA -:1000E000A713A713A713A713A713A713A713A71340 -:1000F00090139013901390139013A713A713A713A3 -:10010000A713A713901390139013A713A713A71364 -:10011000E519071AF51A071AF51A4C1A6F1AF51A83 -:10012000C41AD71ADA1DDA1D171E171E711EAF1E4C -:1001300027212721C81E2721C91FC91F8C20A320C2 -:100140002721122107634236B79BD8A71A39685670 -:1001500018AEBAAB558C1D3CB7CC5763BD6DEDFDE9 -:10016000753EF6177231BF000000803F08000000A6 -:10017000BE922449123EABAAAA2ABECDCCCC4C3E9C -:1001800000000080BEABAAAAAA3E00000000BF008B -:100190000000803F0000000000084178D3BB438787 -:1001A000D1133D190E3CC3BD4282AD2B3E68EC829B -:1001B00076BED98FE1A93E4C80EFFFBE01C4FF7F20 -:1001C0003F00000000002B0014001A00080015007A -:1001D00017001C0018000C00120013002A00290050 -:1001E00004001600070009000A000B000D000E00B5 -:1001F0000F0033003400E1001D001B000600190051 -:1002000005001100100036003700380028000530C6 -:10021000E000E200E30003302C002C00043050002A -:10022000510052004F002B0014001A000900130067 -:100230000A000D000F0018001C0033002A002900DE -:10024000040015001600170007000B00110008003D -:100250000C0012003400E1001D001B000600190014 -:1002600005000E0010003600370038002800053069 -:10027000E000E200E30003302C002C0004305000CA -:10028000510052004F002B0034003600370013009D -:100290001C0009000A00060015000F002A002900B2 -:1002A00004001200080018000C0007000B001700E3 -:1002B000110016003800E100330014000D000E009C -:1002C0001B00050010001A0019001D002800053051 -:1002D000E000E200E30003302C002C00043050006A -:1002E000510052004F0035021E021F02200221025F -:1002F0002202230224022502260227022A004C00A1 -:100300003A003B003C003D003E003F002D022E0223 -:100310002F02300231020100400041004200430040 -:10032000440045000100010001000100010001003E -:100330000100010001000100010001000100AB000B -:10034000AA00A900AE0035001E001F0020002100F9 -:100350002200230024002500260027002A004C004C -:100360003A003B003C003D003E003F002D002E00C7 -:100370002F003000310001004000410042004300E6 -:1003800044004500010001000100010001000100DE -:100390000100010001000100010001000100AB00AB -:1003A000AA00A900AE00000000000000000000004C -:1003B000000000000000000000000000000000003D -:1003C000000000000000000000000000000000002D -:1003D000000000000000000000000000000000001D -:1003E000000000000000000000000000000000000D -:1003F0000000000000000330000000000430000096 -:100400000000000000001E001E001E001E001E0056 -:100410001E001E001E001E001E001E001E0000000A -:1004200014001A000800150017001C0018000C002A -:10043000120013002F00000004001600070009003E -:100440000A000B000D000E000F00330034000D30C9 -:10045000000000000600190000000000110010005C +:100000000C94DA040C941E050C941E050C941E0529 +:100010000C941E050C941E050C941E050C941E05D4 +:100020000C941E050C941E050C94B7180C94891999 +:100030000C94EC270C941E050C941E050C941E05C4 +:100040000C941E050C941E050C941E050C941E05A4 +:100050000C941E050C9454280C941E050C941E053B +:100060000C941E050C941E050C941E050C941E0584 +:100070000C941E050C941E050C941E050C941E0574 +:100080000C94AD0E0C941E050C941E050C941E05CC +:100090000C941E050C941E050C941E050C941E0554 +:1000A0000C941E050C941E050C941E0579058905FB +:1000B0009B05AB05B105C005CC05D205E005E905FA +:1000C000FA050A0610064006F619181A061B181A31 +:1000D000061B5D1A801A061BD51AE81AEB1DEB1DCC +:1000E000281E281E821EC01E38213821D91E382104 +:1000F000DA1FDA1F9D20B4203821232107634236FE +:10010000B79BD8A71A39685618AEBAAB558C1D3CA8 +:10011000B7CC5763BD6DEDFD753EF6177231BF006C +:100120000000803F08000000BE922449123EABAAA6 +:10013000AA2ABECDCCCC4C3E00000080BEABAAAA01 +:10014000AA3E00000000BF000000803F0000000049 +:1001500000084178D3BB4387D1133D190E3CC3BD82 +:100160004282AD2B3E68EC8276BED98FE1A93E4C2F +:1001700080EFFFBE01C4FF7F3F00000000002B00A6 +:1001800014001A000800150017001C0018000C00CD +:10019000120013002A0029000400160007000900BD +:1001A0000A000B000D000E000F0033003400E100C8 +:1001B0001D001B000600190005001100100036008C +:1001C0003700380028000530E000E200E30003308B +:1001D0002C002C0004305000510052004F002B0026 +:1001E00014001A00090013000A000D000F00180087 +:1001F0001C0033002A002900040015001600170017 +:1002000007000B00110008000C0012003400E10090 +:100210001D001B000600190005000E00100036002E +:100220003700380028000530E000E200E30003302A +:100230002C002C0004305000510052004F002B00C5 +:1002400034003600370013001C0009000A000600C5 +:1002500015000F002A0029000400120008001800F1 +:100260000C0007000B001700110016003800E10019 +:10027000330014000D000E001B00050010001A00D2 +:1002800019001D0028000530E000E200E300033003 +:100290002C002C0004305000510052004F00350259 +:1002A0001E021F0220022102220223022402250232 +:1002B000260227022A004C003A003B003C003D0089 +:1002C0003E003F002D022E022F02300231020100BB +:1002D000400041004200430044004500010001008D +:1002E0000100010001000100010001000100010006 +:1002F000010001000100AB00AA00A900AE0035001A +:100300001E001F00200021002200230024002500E1 +:10031000260027002A004C003A003B003C003D002C +:100320003E003F002D002E002F0030003100010064 +:10033000400041004200430044004500010001002C +:1003400001000100010001000100010001000100A5 +:10035000010001000100AB00AA00A900AE000000EE +:10036000000000000000000000000000000000008D +:10037000000000000000000000000000000000007D +:10038000000000000000000000000000000000006D +:10039000000000000000000000000000000000005D +:1003A000000000000000000000000000000003301A +:1003B00000000000043000000000000000001E00EB +:1003C0001E001E001E001E001E001E001E001E003D +:1003D0001E001E001E00000014001A000800150078 +:1003E00017001C0018000C00120013002F00000062 +:1003F00004001600070009000A000B000D000E00A3 +:100400000F00330034000D3000000000060019001A +:1004100000000000110010000000000000000000BB +:1004200000000000000000000000000000000000CC +:1004300000000000000000000000000000000000BC +:1004400000000000000000000000000000000000AC +:10045000000000000000000000000000000000009C :10046000000000000000000000000000000000008C :10047000000000000000000000000000000000007C :10048000000000000000000000000000000000006C @@ -369,1512 +369,1529 @@ :1007400000000000000000000000000000000000A9 :100750000000000000000000000000000000000099 :100760000000000000000000000000000000000089 -:100770000000000000000000000000000000000079 -:100780000000000000000000000000000000000069 -:100790000000000000000000000000000000000059 -:1007A0000000000000000000000000000000000049 -:1007B0000000000000000000000000000000000039 -:1007C00000000000000001000050010001000100D5 -:1007D0000100010001000100010001004C000100C6 -:1007E0000100010007300630135012500030013074 -:1007F00002300C30010001000B300A3009300830A3 -:1008000001000100010001000100010001000100E0 -:1008100001000100010001000100010001000100D0 -:100820000100010001002803540068006500200059 -:1008300050006C0061006E0063006B0020004B00F4 -:100840006500790062006F006100720064000000C2 -:100850002C034F007200740068006F006C00690088 -:100860006E0065006100720020004B006500790099 -:1008700062006F00610072006400730000000403F6 -:10088000090409026D00040100A0FA090400000136 -:1008900003010100092111010001223F0007058128 -:1008A0000308000A090401000103010200092111E3 -:1008B000010001224D000705820308000A09040215 -:1008C0000001030000000921110100012236000788 -:1008D00005830308000A090403000103000000095E -:1008E00021110100012239000705840310000112C3 -:1008F00001100100000008EDFE606001000102002F -:100900000105010906A101050719E029E7150025E0 -:1009100001950875018102050819012905950575DC -:1009200001910295017503910105071900297715B9 -:10093000002501957875018102C005010980A1019A -:10094000850216010026B7001A01002AB7007510AB -:1009500095018100C0050C0901A101850316010064 -:10096000269C021A01002A9C02751095018100C084 -:1009700005010902A1010901A100050919012905C3 -:100980001500250195057501810295017503810109 -:100990000501093009311581257F95027508810609 -:1009A00009381581257F950175088106050C0A38DF -:1009B000021581257F950175088106C0C0050109D2 -:1009C00006A101050719E029E7150025019508751D -:1009D0000181029501750881010508190129059514 -:1009E000057501910295017503910105071900290B -:1009F000FF150025FF950675088100C011241FBE54 -:100A0000CFEFDAE0DEBFCDBF04B603FE24C0809195 -:100A1000190490911A04A0911B04B0911C04873012 -:100A2000904BA740B04BB9F41092190410921A04DD -:100A300010921B0410921C0414BE84B7877F84BFDD -:100A400088E10FB6F89480936000109260000FBEAA -:100A5000E0E0F8E3099513E0A0E0B1E0E4E8F3E6B4 -:100A600002C005900D92A431B107D9F714E0A4E1BA -:100A7000B3E001C01D92A931B107E1F70E94EC1566 -:100A80000C94C0310C940000279A2F988FEF9FEFA1 -:100A900090938700809386008AE08093800089E1AC -:100AA000809381000C94452D282F81110BC08091DB -:100AB0008000877F8093800010928D0010928C00C0 -:100AC0002F9808952F9880918000886080938000EF -:100AD000233019F48FEF9FEF0FC083E090E0821B6B -:100AE0009109880F991F2FEF3FEFA90102C056957A -:100AF00047958A95E2F7CA0190938D0080938C0008 -:100B00000895CF93DF93EC010E94DC28BE0180E0C2 -:100B100090E0DF91CF910C9407250F931F93462F00 -:100B200050E04E30510508F0DEC0DC01FA01EA5A0F -:100B3000FF4F12968C910C948431882309F4D3C012 -:100B400000E010E0980140E064E070E08BE292E0A9 -:100B50000E944F1281E090E00FC0882309F4C3C0C7 -:100B600000E010E0980140E066E070E08BEB91E07F -:100B70000E944F1282E090E00E948105B4C0882359 -:100B800009F4B1C000E010E0980140E068E070E0D6 -:100B90008BEE91E00E944F1284E090E0EDCF88232D -:100BA00011F083E005C083E00CC0882349F084E0A5 -:100BB0000E94842540E164E083E00E94910A93C092 -:100BC00084E00E94A525F6CF882331F085EE0E94AF -:100BD0006E1C0E949C2D87C085EE0E94361D83C02E -:100BE000882309F480C00E94E30D7DC0882309F4A6 -:100BF0007AC00E94DC0D00E010E0980140E065E062 -:100C000070E08BE492E027C0882309F46CC085E093 -:100C10000E94A5250E94040E66C0882309F463C0C3 -:100C200000E010E0980140E068E070E08BE191E0C6 -:100C30000E944F1285E00E94842555C0882309F444 -:100C400052C00E94E21200E010E0980140E068E02B -:100C500070E08BE191E00E944F1245C0882309F4B7 -:100C600042C00E94ED12EFCF8823E9F100E010E0CE -:100C7000980140E066E070E08BE891E00E944F123E -:100C800084E00E94A52583E00E94A52580E10E94C2 -:100C9000A52585E00E94A5250E94040E86E00E94FD -:100CA00084250E94C928811102C00E94A5280E94A3 -:100CB000E12890E090931804809317048068809353 -:100CC00017040E94E5280FC0882369F000E010E0B7 -:100CD000980140E066E070E08BE591E00E944F12E1 -:100CE00086E00E94A52580E090E01F910F91089575 -:100CF0000F931F932FEF89EF90E021508040904099 -:100D0000E1F700C0000000E010E0980140E065E07D -:100D100070E08BE492E00E944F121F910F910895B2 -:100D20000F931F9300E010E0980140E063E070E053 -:100D300083E091E00E944F122FEF82E597E021506F -:100D400080409040E1F700C000001F910F9108958E -:100D5000CF92DF92EF92FF920F931F93CF93DF9387 -:100D6000CDB7DEB7CC58D1090FB6F894DEBF0FBEB1 -:100D7000CDBF2091D10325FFC5C08C01FC0192811C -:100D800080910201992309F460C096E4E0E9F2E061 -:100D9000DE01A95BBF4F01900D929A95E1F7F80132 -:100DA0009081E0910001F0910101E90FF11DEE0F3A -:100DB000FF1F27E430E02C0F3D1FE20FF31F60817F -:100DC0007181680F711D882777FD8095982F0E948B -:100DD000E02E20E030E040E451E40E94452E6B011B -:100DE0007C01F801218184E090E0821B9109BC0123 -:100DF000882777FD8095982F0E94E02E9B01AC01FB -:100E0000C701B6010E94DD2D9B01AC0160E070E0DE -:100E100080E090E40E94F72F20E030E04CE551E4C0 -:100E20000E94942F4FE050E0C457DF4F0FB6F89464 -:100E3000DEBF0FBECDBFDF91CF911F910F91FF900D -:100E4000EF90DF90CF900C94EF1196E4E0E9F2E0A0 -:100E5000DE01119601900D929A95E1F7F8019081CB -:100E6000E0910001F0910101E90FF11DEE0FFF1F6C -:100E700021E030E02C0F3D1FE20FF31F60817181F4 -:100E8000680F711D882777FD8095982F0E94E02EAE -:100E900020E030E040E451E40E94452E6B017C01EB -:100EA000F801218184E090E0821B9109BC01882730 -:100EB00077FD8095982F0E94E02E9B01AC01C70121 -:100EC000B6010E94DD2D9B01AC0160E070E080E086 -:100ED00090E40E94F72F20E030E04CE551E40E94BE -:100EE000942FC457DF4F0FB6F894DEBF0FBECDBFAF -:100EF000DF91CF911F910F91FF90EF90DF90CF90F6 -:100F00000C94370EC457DF4F0FB6F894DEBF0FBEF8 -:100F1000CDBFDF91CF911F910F91FF90EF90DF90A8 -:100F2000CF90089508950E9444056E9A769A0C9485 -:100F300078060C9492070C94A8060895880F991FC0 -:100F4000FC01EA5BFF4F859194910895880F991FEA -:100F5000FC01EA53FE4F8591949108950F931F93DE -:100F6000CF93DF93EC01811520E49207A0F5C11522 -:100F700080E3D80708F0E1C0C83ED105D8F4C03EF0 -:100F8000D10508F0EEC1C83AD10578F4C53AD105CB -:100F900008F074C0C130D10509F46DC008F4DEC199 -:100FA000C430D10508F0DDC1D9C1CB3BD10508F46F -:100FB00070C0D4C1C11590E2D90708F0B9C0C115FD -:100FC00021E0D20708F0CDC1C03FD10508F4C6C169 -:100FD0008E01106506C2C13080E5D80709F4BDC096 -:100FE00068F5C13120E4D20709F4AEC050F4C03135 -:100FF00090E4D90708F0A5C0CF70DD278E01146DED -:10100000F0C1C33120E4D20709F4A4C008F49FC0A2 -:10101000C115D04509F0A2C10E944B210E94040EC7 -:101020000E9490069FEF24E38CE091502040804086 -:10103000E1F700C000000E946828D3C1C11520E676 -:10104000D20730F4C11581E5D80708F48CC02DC152 -:10105000C11590E7D90708F481C1C11520E8D2076E -:1010600008F478C1C11580E9D80708F077C1DF70AE -:101070008E01106AB6C101E010E0B3C1C53AD105D6 -:1010800009F471C1C63AD10509F070C102E810E453 -:10109000A8C1C83AD10509F46CC1C93AD10509F40F -:1010A0006BC1CA3AD10509F46AC1CB3AD10509F43A -:1010B00069C1CC3AD10509F468C1CD3AD10509F42A -:1010C00067C1C03BD10509F466C1CE3AD10509F428 -:1010D00065C1CF3AD10509F464C1C13BD10509F41A -:1010E00063C1C23BD10509F462C1C33BD10509F418 -:1010F00061C1C43BD10509F460C1C53BD10509F408 -:101100005FC1C63BD10509F45EC1C73BD10509F4F7 -:101110005DC1C83BD10509F45CC1C93BD10509F4E7 -:101120005BC1CA3BD10509F45AC100E014E459C1BE -:10113000CE019F700E94A60755C1DD278E01106C5D -:1011400050C100E011ED4DC100E010ED4AC100E0DA -:1011500012ED47C100E013ED44C18091ED038160C1 -:101160008093ED033EC10E94C928811102C00E94F4 -:10117000A5280E94E12890E090931804809317041A -:10118000C23090E5D90721F480911704816086C0B0 -:10119000C43020E5D20721F48091170482607EC01C -:1011A000C63080E5D80721F480911704846076C0AA -:1011B000C83090E5D90719F48091170427C0CA30C8 -:1011C00020E5D20721F480911704806167C0CC30FC -:1011D00080E5D80721F48091170480625FC0CE308B -:1011E00090E5D90721F480911704806457C0C0317D -:1011F00020E5D20721F48091170480684FC0C231E6 -:1012000080E5D80729F4809117048460886046C07F -:10121000C33090E5D90721F4809117048E7F3EC03A -:10122000C53020E5D20721F4809117048D7F36C0A8 -:10123000C73080E5D80721F4809117048B7F2EC03A -:10124000C93090E5D90719F48091170426C0CB3036 -:1012500020E5D20721F4809117048F7E1FC0CD3086 -:1012600080E5D80721F4809117048F7D17C0CF3017 -:1012700090E5D90721F4809117048F7B0FC0C1310D -:1012800020E5D20721F4809117048F7707C0C3317E -:10129000D04531F4809117048B7F877F80931704AA -:1012A000809117040E94E5289CC08D2F99278F708C -:1012B000992781309105D9F49E012370332702C00C -:1012C000880F991F2A95E2F79C688E0144E0000F71 -:1012D000111F4A95E1F700271370802B912B53E0E3 -:1012E000CC0FDD1F5A95E1F7C076DD272FC0823085 -:1012F000910531F4DC2FCC278E01016F106A71C08B -:101300008330910569F4CE018370992701E010E0E4 -:1013100002C0000F111F8A95E2F7C8019C680FC038 -:10132000049709F05EC0CE018370992701E010E0B8 -:1013300002C0000F111F8A95E2F7C8019A6823E0E6 -:10134000CC0FDD1F2A95E1F7C07ED7708C010C2BE6 -:101350001D2B47C0DF708E01106243C000E010E01B -:1013600040C08E013EC001E810E43BC003E810E439 -:1013700038C002EE14E435C009EE14E432C00AEEBF -:1013800014E42FC005EB14E42CC006EB14E429C0D0 -:1013900007EB14E426C00CEC14E423C00DEC14E4B9 -:1013A00020C003E815E41DC00AE815E41AC002E9EC -:1013B00015E417C004E915E414C001E216E411C0F5 -:1013C00003E216E40EC004E216E40BC005E216E4E4 -:1013D00008C006E216E405C007E216E402C00AE20D -:1013E00016E4C801DF91CF911F910F9108959CE001 -:1013F000799FF001112490E3899FE00DF11D1124E4 -:10140000E60FF11DEE0FFF1FEA53FE4F85919491F9 -:10141000803E9105E0F4803C910558F581339105BB -:1014200009F46FC048F48932910509F463C08A3227 -:10143000910509F46DC072C089339105E9F08238D5 -:101440009105D1F08533910509F44DC067C0833E05 -:10145000910581F138F4803E9105B9F0823E910505 -:10146000D9F05CC0863E910561F1873E9105A1F1FE -:1014700055C00E949E0708952091170420FD02C0C8 -:1014800021FF4CC080EE90E049C08091170480FF9E -:10149000F9CF89E390E042C08091170482FF0EC02B -:1014A0008091170484FF03C080E090E037C083EE92 -:1014B00090E034C08091170482FFF2CF82EE90E07A -:1014C0002DC08091170483FF0BC08091170484FD09 -:1014D000EBCF87EE90E022C08091170483FFF5CF19 -:1014E00086EE90E01BC08091170485FF07C089E25B -:1014F00090E014C08091170485FFF9CF85E390E058 -:101500000DC08091170486FF07C08AE290E006C0F4 -:101510008091170486FFF9CF81E390E00E94AE0727 -:101520000895CF92DF92EF92FF920F931F9301E005 -:1015300010E020E030E06801790104C0CC0CDD1C33 -:10154000EE1CFF1C8A95D2F704C0000F111F221F4A -:10155000331F6A95D2F70C291D292E293F29C090E7 -:10156000D103D090D203E090D303F090D403C022F3 -:10157000D122E222F322842FC016D106E206F3061E -:1015800041F41F910F91FF90EF90DF90CF900C945A -:1015900084251F910F91FF90EF90DF90CF900C94D6 -:1015A000A52508950C94D10A5F926F927F928F9235 -:1015B0009F92AF92BF92CF92DF92EF92FF920F93E2 -:1015C0001F93CF93DF93CDB7DEB728970FB6F8946C -:1015D000DEBF0FBECDBFCE0101966C014E0199E07A -:1015E000890E911C20E030E040E050E060E070E0C7 -:1015F00000E010E0E12CF12C6C2C5D2C88E0782EC2 -:10160000AA24A394B12CE6EDF2E0A62DB52D872DEA -:1016100001900D928A95E1F7F601819191916F0108 -:10162000FC01E07FFF27E032F10559F48F70992724 -:10163000F50102C0EE0FFF1F8A95E2F7EE2AFF2A9E -:1016400037C0E033F10559F48F709927F50102C0D6 -:10165000EE0FFF1F8A95E2F70E2B1F2B29C0E034F7 -:10166000F10559F48F709927F50102C0EE0FFF1FA5 -:101670008A95E2F76E2B7F2B1BC0E035F10559F4FC -:101680008F709927F50102C0EE0FFF1F8A95E2F7D0 -:101690004E2B5F2B0DC0E036F10551F48F7099276A -:1016A000F50102C0EE0FFF1F8A95E2F72E2B3F2BAC -:1016B000C814D90409F0A7CF84B19E2D9095892331 -:1016C00084B985B1E82AE5B887B1902F9095892330 -:1016D00087B988B1082B08B98AB1962F90958923CC -:1016E0008AB98BB1682B6BB98DB1942F90958923F2 -:1016F0008DB98EB1482B4EB980B3922F9095892326 -:1017000080BB81B3282B21BB28960FB6F894DEBF8F -:101710000FBECDBFDF91CF911F910F91FF90EF9042 -:10172000DF90CF90BF90AF909F908F907F906F9001 -:101730005F9008955F926F927F928F929F92AF9287 -:10174000BF92CF92DF92EF92FF920F931F93CF93AE -:10175000DF93CDB7DEB768970FB6F894DEBF0FBE44 -:10176000CDBF85B7806885BF85B7806885BF0E947B -:10177000D40ACE0101966C014E0199E1890E911CAB -:1017800020E030E040E050E060E070E000E010E099 -:10179000E12CF12C6C2C5D2C88E1782EAA24A394EA -:1017A000B12CEEEDF2E0A62DB52D872D01900D9216 -:1017B0008A95E1F7F601819191916F01FC01E07F3B -:1017C000FF27E032F10559F48F709927F50102C027 -:1017D000EE0FFF1F8A95E2F7EE2AFF2A37C0E033AB -:1017E000F10559F48F709927F50102C0EE0FFF1F24 -:1017F0008A95E2F70E2B1F2B29C0E034F10559F42E -:101800008F709927F50102C0EE0FFF1F8A95E2F74E -:101810006E2B7F2B1BC0E035F10559F48F70992793 -:10182000F50102C0EE0FFF1F8A95E2F74E2B5F2BEA -:101830000DC0E036F10551F48F709927F50102C013 -:10184000EE0FFF1F8A95E2F72E2B3F2BC814D90409 -:1018500009F0A7CF84B19E2D9095892384B985B1D5 -:10186000E82AE5B887B1902F9095892387B988B188 -:10187000082B08B98AB1962F909589238AB98BB124 -:10188000682B6BB98DB1942F909589238DB98EB14A -:10189000482B4EB980B3922F9095892380BB81B39A -:1018A000282B21BB10921D0310921C0310921503CC -:1018B0001092140310921F0310921E03109217032C -:1018C0001092160310922103109220031092190314 -:1018D00010921803109223031092220310921B03FC -:1018E00010921A0368960FB6F894DEBF0FBECDBFF4 -:1018F000DF91CF911F910F91FF90EF90DF90CF90EC -:10190000BF90AF909F908F907F906F905F900C945E -:1019100093077F928F929F92AF92BF92CF92DF9266 -:10192000EF92FF920F931F93CF93DF93CDB7DEB764 -:10193000A0970FB6F894DEBF0FBECDBF6E0149E190 -:10194000C40ED11C84E1E82E83E0F82E98E0792EB5 -:10195000BC2CAD2C01E010E028E1822E35E0932E66 -:10196000E6EDF2E0AB2DBA2D872D01900D928A9510 -:10197000E1F7F601819191916F019C01207F33275E -:101980002032310591F424B18F709927A80102C04B -:10199000440F551F8A95E2F7CA01922F982B94B9EC -:1019A00095B18095892385B953C02033310591F4D1 -:1019B00027B18F709927F80102C0EE0FFF1F8A959B -:1019C000E2F7CF01922F982B97B998B18095892390 -:1019D00088B93EC02034310591F42AB18F7099271F -:1019E000A80102C0440F551F8A95E2F7CA01922F41 -:1019F000982B9AB99BB1809589238BB929C0203542 -:101A0000310591F42DB18F709927F80102C0EE0FC6 -:101A1000FF1F8A95E2F7CF01922F982B9DB99EB1B7 -:101A2000809589238EB914C02036310589F420B3FE -:101A30008F709927A80102C0440F551F8A95E2F7BD -:101A4000CA01922F982B90BB91B38095892381BBBB -:101A500050EA5A95F1F7BE016F5F7F4F20E030E00A -:101A600040E050E0EEEDF2E0DE011196882D0190AD -:101A70000D928A95E1F7FB0181919191BF01FC01E3 -:101A8000E07FFF27E032F10511F4E3B113C0E0334A -:101A9000F10511F4E6B10EC0E034F10511F4E9B13D -:101AA00009C0E035F10511F4ECB104C0E036F105F0 -:101AB000B9F4EFB1F0E08F70992702C0F595E79582 -:101AC0008A95E2F7E0FD08C0C801042E02C0880F25 -:101AD000991F0A94E2F702C080E090E0282B392B8E -:101AE0004F5F5F4F4C30510509F0BCCFF70180814B -:101AF00091818217930721F03183208390927302A2 -:101B00000E94D40AF2E0EF0EF11C4CE1E41643E02F -:101B1000F40609F025CF80917302882361F181508A -:101B200080937302882339F08FE99FE00197F1F7E2 -:101B300000C0000020C08091140390911503909381 -:101B40001D0380931C0380911603909117039093BB -:101B50001F0380931E0380911803909119039093A3 -:101B600021038093200380911A0390911B0390938B -:101B70002303809322030E94990781E0A0960FB669 -:101B8000F894DEBF0FBECDBFDF91CF911F910F91B3 -:101B9000FF90EF90DF90CF90BF90AF909F908F908D -:101BA0007F900895E82FF0E0EE0FFF1FE45EFC4FFA -:101BB00080819181089508958091020481608093CD -:101BC00002040C94F728809102048E7F8093020413 -:101BD0000C94F7280E94C928811102C00E94A528F0 -:101BE0000E94F328809302043E9A809171008D7FB9 -:101BF0008093710082E0809390008AE1809391004D -:101C000081E080932603089580912603811102C00C -:101C10000E94EA0D10927603109275038091710074 -:101C20008D7F80937100809190008F7780939000DA -:101C3000109238031092370310926F0310927003C2 -:101C4000109271031092720310926E0310926D0342 -:101C5000EDE4F3E0ADE3B3E0119211921192119231 -:101C60001D921D9283E0ED36F807B1F70895CF92EB -:101C7000DF92EF92FF920F931F93CF93DF93209108 -:101C80003703222309F484C06B017C018091260371 -:101C9000811102C00E94EA0D0DE613E0C7E0D0E01A -:101CA000A7019601F80192918291729162918F0140 -:101CB0000E94412E811131C0FE01EE0FFF1FEE0F79 -:101CC000FF1FE35BFC4F1082118212821382DE0140 -:101CD000AA0FBB1FA35CBC4F11961C921E92C7306B -:101CE000D105E9F021964481558166817781408351 -:101CF000518362837383148215821682178212962F -:101D00008D919C91139711969C938E9313961C9290 -:101D10001E92129734961296E2CF219708F6809180 -:101D2000750390917603019797FD05C09093760314 -:101D30008093750304C0109276031092750380910E -:101D400075039091760320917303309174032817E3 -:101D5000390724F01092740310927303892BC1F495 -:101D6000809171008D7F80937100809190008F77BA -:101D70008093900010926F03109270031092710381 -:101D80001092720310926E0310926D03109237033B -:101D9000DF91CF911F910F91FF90EF90DF90CF9047 -:101DA00008951F920F920FB60F9211244F925F92D7 -:101DB0006F927F928F929F92AF92BF92CF92DF925B -:101DC000EF92FF922F933F934F935F936F937F9385 -:101DD0008F939F93AF93BF93CF93DF93EF93FF9333 -:101DE00080913703882309F49BC1C0917503D0917A -:101DF00076031C161D060CF093C1409027035090EB -:101E000028036090290370902A0320E030E0A901A4 -:101E1000C301B2010E94902F18160CF065C0C130AA -:101E2000D10509F452C08091730390917403BE01EF -:101E30000E9470317C0190937403809373038090AF -:101E4000390390903A03A0903B03B0903C0320E00C -:101E500030E040E85FE3C501B4010E94DD2D6093EE -:101E6000390370933A0380933B0390933C03F7014B -:101E7000EE0FFF1FEE0FFF1FE35BFC4FA30192016C -:101E800060817181828193810E94452E20E030E043 -:101E900040E05EE30E94942F9B01AC01C501B401B8 -:101EA0000E94902F18168CF4C7010196BE010E9463 -:101EB00070319093740380937303109239031092DE -:101EC0003A0310923B0310923C03E0917303F091AC -:101ED0007403EE0FFF1FEE0FFF1FE35BFC4F6081EB -:101EE000718182819381D0C0C0906F03D0907003C4 -:101EF000E0907103F090720320E030E0A901C70187 -:101F0000B6010E94412E2197882309F4A2C0FE0148 -:101F1000EE0FFF1FEE0FFF1FE35BFC4F80809180F1 -:101F2000A280B380A5019401C701B6010E94412E91 -:101F300087FF31C0A501940160E070E08CED93EC67 -:101F40000E94452E20E030E040E451E40E94452EFE -:101F500020E030E040E05FE30E94942F9B01AC0161 -:101F600060E070E080E090E40E94F72F9B01AC01FC -:101F7000C501B4010E94942F9B01AC01C701B601B9 -:101F80000E94412E87FF07C0A701960160E070E024 -:101F90008CED93E439C0A5019401C701B6010E94FC -:101FA000902F18160CF055C0A501940160E070E068 -:101FB0008CED93E40E94452E20E030E040E451E4B3 -:101FC0000E94452E20E030E040E05FE30E94942F25 -:101FD0009B01AC0160E070E080E090E40E94F72F8C -:101FE0009B01AC01C501B4010E94942F9B01AC017F -:101FF000C701B6010E94902F18165CF5A701960143 -:1020000060E070E08CED93EC0E94452E20E030E023 -:1020100040E451E40E94452E20E030E040E05FE3E0 -:102020000E94942F9B01AC0160E070E080E090E49E -:102030000E94F72F9B01AC01C701B6010E94942FAB -:1020400060936F0370937003809371039093720396 -:1020500013C0FE01EE0FFF1FEE0FFF1FE35BFC4FEF -:1020600080819181A281B38180936F0390937003EB -:10207000A0937103B093720360916F03709170032A -:102080008091710390917203209124033091250374 -:102090002F3F4FEF340731F02F5F3F4F3093250331 -:1020A000209324030E94F8126B017C0120E034E2AB -:1020B00044EF51E40E94412E87FF08C086EFC82EEE -:1020C00088E2D82E84EFE82E81E4F82E20E030E07C -:1020D00040E051E4C701B6010E94942F9B01AC017E -:1020E00060E074E284E79BE40E94452E6B017C0172 -:1020F0000E94AD2E70939700609396002091740219 -:10210000309175024091760250917702C701B60175 -:102110000E94942F0E94AD2E7093990060939800B6 -:1021200080913803882309F433C1C0903303D090E1 -:102130003403E0903503F090360320E030E0A9014D -:10214000C701B6010E94902F1816D4F58091240380 -:10215000909125038F3F2FEF920729F001969093DE -:10216000250380932403C701B6010E94F81220E0E2 -:1021700030E040E051E40E94942F9B01AC0160E00C -:1021800074E284E79BE40E94452E6B017C010E946F -:10219000AD2E709397006093960020917402309159 -:1021A00075024091760250917702C701B6010E94F4 -:1021B000942F0E94AD2E709399006093980008C0F0 -:1021C0001092970010929600109299001092980029 -:1021D00060912D0370912E036F5F7F4F70932E03DC -:1021E00060932D03209196003091970080E090E05D -:1021F000232BF1F0C0919600D09197000E94DE2E23 -:102200006B017C01BE0180E090E00E94DE2E9B010C -:10221000AC0160912F037091300380913103909154 -:1022200032030E94452E20E03FEF4FE757E410C0F5 -:102230000E94DE2E6B017C0120E030EE4FEF54E473 -:1022400060912F037091300380913103909132039C -:102250000E94942F9B01AC01C701B6010E94902FF0 -:1022600087FD96C080912B038F5F80932B0390E0B6 -:102270002091FE033091FF0382179307A0F0809115 -:102280000904882319F010922B030DC0809171006E -:102290008D7F80937100809190008F778093900064 -:1022A000109238037DC080912C03C0912B038111C3 -:1022B00028C0C0900304D0900404E0900504F0907E -:1022C000060420E030E0A901C701B6010E94902F6A -:1022D0001816BCF481E080932C0310923303109203 -:1022E00034031092350310923603C0922F03D0921C -:1022F0003003E0923103F0923203C150C0932B03BC -:1023000043C010922C031092250310922403E091F5 -:102310000004F091010448E0C49FE00DF11D112478 -:1023200080819181A281B3818093330390933403A0 -:10233000A0933503B093360320E030E040E85EE33D -:1023400064817581868197810E94942F6B017C0145 -:1023500020E030E048EC52E460917802709179021C -:1023600080917A0290917B020E94452E9B01AC01E4 -:10237000C701B6010E94942F60932F03709330031E -:10238000809331039093320310922E0310922D0309 -:102390008091020480FD04C010923803109237032C -:1023A000FF91EF91DF91CF91BF91AF919F918F916D -:1023B0007F916F915F914F913F912F91FF90EF909F -:1023C000DF90CF90BF90AF909F908F907F906F9055 -:1023D0005F904F900F900FBE0F901F901895CF9267 -:1023E000DF92EF92FF92CF93DF936B017C01EA01C2 -:1023F00080912603811102C00E94EA0D809102049F -:1024000080FF46C0809175039091760308970CF089 -:102410003FC0809171008D7F80937100809138035F -:1024200081110E94040E81E08093370310922503EE -:102430001092240320E030E0A901C701B6010E94F8 -:10244000902F1816DCF48091750390917603FC01AF -:10245000EE0FFF1FEE0FFF1FE35BFC4FC082D18228 -:10246000E282F382FC01EE0FFF1FE35CFC4FD1839D -:10247000C0830196909376038093750380917100D9 -:1024800082608093710080919000806880939000BA -:10249000DF91CF91FF90EF90DF90CF9008958F92D2 -:1024A0009F92AF92BF92CF92DF92EF92FF920F93E3 -:1024B0001F93CF93DF93EC017B01D42E4801590188 -:1024C00080912603811102C00E94EA0D80910204CE -:1024D00080FF6BC0809171008D7F8093710080912F -:1024E000370381110E94040E81E080933803D0935A -:1024F0000104C0930004F092FF03E092FE03D09227 -:1025000009048092030490920404A0920504B092FE -:1025100006041092390310923A0310923B03109272 -:102520003C0310922B0388819981AA81BB818093FF -:10253000330390933403A0933503B093360320E024 -:1025400030E040E85EE36C817D818E819F810E9456 -:10255000942F6B017C0120E030E048EC52E4609164 -:1025600078027091790280917A0290917B020E94A8 -:10257000452E9B01AC01C701B6010E94942F6093C8 -:102580002F037093300380933103909332031092A2 -:102590002E0310922D038091710082608093710050 -:1025A00080919000806880939000DF91CF911F917F -:1025B0000F91FF90EF90DF90CF90BF90AF909F90E2 -:1025C0008F9008958091770390E0019665E070E028 -:1025D0000E9470318093770308958091770390E093 -:1025E000019765E070E00E94703180937703089551 -:1025F0008F929F92AF92BF92CF92DF92EF92FF9213 -:10260000CF93DF936B017C01C0912403D09125030C -:10261000BE0180E090E00E94DE2E4B015C01A7012C -:10262000960160E070E08CE594E40E94452E9B01E9 -:10263000AC01C501B4010E94942F0E94B22E4091BA -:102640007703423009F45CC028F4442351F0413050 -:10265000E9F0FBC0433009F481C0443009F4B4C050 -:10266000F4C080E090E0A0E0BFE380937402909318 -:102670007502A0937602B09377021092270310920E -:1026800028031092290310922A03DFC01092270317 -:10269000109228031092290310922A0364317105C5 -:1026A00040F46A307105E0F520E030E040E85EE398 -:1026B0003BC0693C710508F0C0C080E090E00E941A -:1026C000DE2E20E030E040EA51E40E94DC2D20E0E4 -:1026D00030E044E353E40E94452E9B01AC010E948C -:1026E000942F20E030E040E05EE30E94942F9B01B5 -:1026F000AC0160E070E080E09EE30E94DC2D5BC0F6 -:1027000010922703109228031092290310922A0393 -:102710006432710578F4FB01EC59FF4F0C9484315D -:1027200020E030E040E05FE3C701B6010E94942F53 -:102730006B017C0180E090E0A0E0BEE38093740236 -:1027400090937502A0937602B09377027EC0A701A2 -:102750009601C701B6010E94DD2DEACF1092270332 -:10276000109228031092290310922A032AE0269F30 -:10277000A001279F500D1124CA0168EB7BE00E9445 -:102780005C31BC016C5D754077FF03C0719561954C -:102790007109882777FD8095982F0E94E02E2EE3FF -:1027A00033EC4EE259E30E94942F20E030E040ECFD -:1027B0005EE30E94DD2D6093740270937502809336 -:1027C00076029093770241C010922703109228035B -:1027D0001092290310922A03CE0183709927892B26 -:1027E000E1F0BE016170772780E090E00E94DE2E6C -:1027F00020E030E040E05EE30E94942F20E030E0F3 -:1028000040E45FE30E94DD2D6093740270937502D3 -:1028100080937602909377020CC080E090E0A0E075 -:10282000BFE38093740290937502A0937602B093F5 -:102830007702C770DD27CD2B41F4109274021092FD -:1028400075021092760210927702C701B601DF91ED -:10285000CF91FF90EF90DF90CF90BF90AF909F907F -:102860008F900895809188030895CF93DF9300D0CF -:102870001F92CDB7DEB79C0180910E04843019F50C -:1028800093E099833B832A839093E9008FEF9091A3 -:10289000E800815095FD06C095ED9A95F1F700008E -:1028A0008111F5CF8091E80085FF0DC040E050E038 -:1028B00063E070E0CE0101960E9496168091E800D8 -:1028C0008E778093E8000F900F900F90DF91CF915B -:1028D0000895CF93DF9300D01F92CDB7DEB720913C -:1028E0000E04243021F522E029839B838A8383E030 -:1028F0008093E9008FEF9091E800815095FD06C02C -:1029000095ED9A95F1F700008111F5CF8091E800DF -:1029100085FF0DC040E050E063E070E0CE0101961D -:102920000E9496168091E8008E778093E8000F90C1 -:102930000F900F90DF91CF91089520910E042430D5 -:10294000F1F422E02093E9002FEF3091E8002150CC -:1029500035FD06C035ED3A95F1F700002111F5CFB0 -:102960002091E80025FF0BC040E050E065E070E0FA -:102970000E9496168091E8008E778093E800089573 -:10298000CF93DF93EC0190910E04943009F046C090 -:10299000809186028823D9F0809187028823B9F03C -:1029A0009093E9008FEF9091E800815095FD06C06B -:1029B00095E19A95F1F700008111F5CF8091E8003B -:1029C00085FF2CC040E050E060E170E017C081E07E -:1029D0008093E9008FEF9091E800815095FD06C04B -:1029E00095ED9A95F1F700008111F5CF8091E800FF -:1029F00085FF14C040E050E068E070E0CE010E9426 -:102A000096168091E8008E778093E80080E1FE01C1 -:102A1000A8E7B3E001900D928A95E1F7DF91CF919D -:102A2000089580910D04811109C00E942B180E9405 -:102A300088188091E20084608093E20008951092EB -:102A40000D040895089508950C94D02742E061EC98 -:102A500081E00E94A51742E061EC82E00E94A51788 -:102A600042E061EC83E00E94A51742E161EC84E062 -:102A70000C94A51780911004833009F455C030F4EC -:102A8000813071F0823009F48EC008958A3009F4E3 -:102A90007AC08B3009F460C0893009F09CC020C036 -:102AA00080910F04813A09F096C08091E800877FF9 -:102AB0008093E8008091130490911404892B21F4F1 -:102AC00060E188E793E003C060E080E090E070E0C0 -:102AD0000E94E1168091E8008B778093E8000895CA -:102AE00080910F04813209F076C080911304909197 -:102AF0001404009719F0039709F06DC08091E80065 -:102B0000877F8093E8008091E80082FD05C0809176 -:102B10000E048111F8CF5FC08091F100809388038B -:102B20008091E8008B7753C080910F04813A09F0BF -:102B300052C08091130490911404892B09F04BC06A -:102B40008091E800877F8093E8008091E80080FF13 -:102B5000FCCF8091860236C080910F048132D9F576 -:102B60008091130490911404892BA9F58091E800B9 -:102B7000877F8093E8000E94DA1780911104809388 -:102B800086020C944B2180910F04813221F58091B3 -:102B9000E800877F8093E8000E94DA178091120492 -:102BA00080938903089580910F04813AA1F4809164 -:102BB000E800877F8093E8008091E80080FFFCCFE9 -:102BC000809189038093F1008091E8008E77809353 -:102BD000E8000C94DA17089584B7877F84BF88E1F2 -:102BE0000FB6F89480936000109260000FBE90E0E2 -:102BF00080E80FB6F89480936100909361000FBE57 -:102C00000E947D1B0E942B180E9488188091E20070 -:102C100084608093E20078940E940E1B0E947F1BC8 -:102C20008CE792E00E94291B80910E04853069F4A4 -:102C30000E948A2780910C048823B1F30E94B82750 -:102C4000882391F30E948016EFCF0E94871BECCF60 -:102C5000292F332723303105C9F064F421303105A1 -:102C600081F02230310509F043C08DE690E022E882 -:102C700038E042C021323105F1F02232310541F114 -:102C800037C082E190E02FEE38E036C099278130DE -:102C9000910541F08230910541F0892B49F5EEE72D -:102CA000F8E005C0E0E5F8E002C0E6E2F8E0849173 -:102CB00090E09F0121C06430D8F4E62FF0E0EE0FE1 -:102CC000FF1FEE5FFC4F2081318189E090E014C04E -:102CD000643070F470E0FB01EE0FFF1FE650FD4F13 -:102CE00020813181FB01EA50FD4F808190E004C0DA -:102CF00080E090E020E030E0FA0131832083089505 -:102D000080E189BD82E189BD09B400FEFDCF8091DB -:102D1000D8008F7D8093D8008091E00082608093FE -:102D2000E0008091E00081FDFCCF0895CF92DF921A -:102D3000EF92FF920F931F93CF93DF93EC018B01E0 -:102D40006A010E94F917811133C0C114D10439F00E -:102D5000F60180819181081B190BC80FD91FE12C46 -:102D6000F12C0115110519F18091E80085FD16C0BF -:102D70008091E8008E778093E800C114D10449F077 -:102D8000F60180819181E80EF91EF182E08285E0F2 -:102D90000FC00E94F917882321F30AC089918093FC -:102DA000F10001501109FFEFEF1AFF0ADACF80E0BE -:102DB000DF91CF911F910F91FF90EF90DF90CF9017 -:102DC000089520911504309116042617370748F00E -:102DD0006115710539F42091E8002E772093E80001 -:102DE00001C0B90140E061157105A9F120910E04FF -:102DF000222309F443C0253009F442C02091E800A1 -:102E000023FD40C02091E80022FD32C02091E8005F -:102E100020FFE9CF4091F3002091F20030E0342B05 -:102E2000FC01CF016115710559F02830310540F4DE -:102E300081918093F100615071092F5F3F4FF1CF75 -:102E400041E02830310509F040E02091E8002E777C -:102E50002093E800C8CF4111C9CF0AC080910E0469 -:102E6000882361F0853061F08091E80083FD0AC01D -:102E70008091E80082FFF2CF80E0089582E008951B -:102E800083E0089581E0089520911504309116049F -:102E90002617370748F06115710539F42091E800CD -:102EA0002E772093E80001C0B901FC0120E06115F4 -:102EB000710591F180910E04882309F440C085309A -:102EC00009F43FC08091E80083FD3DC08091E80097 -:102ED00082FD2FC08091E80080FFE9CF2091F300B0 -:102EE0008091F20090E0922B6115710559F08830C5 -:102EF000910540F424912093F100319661507109BD -:102F00000196F2CF21E0089709F020E08091E800D7 -:102F10008E778093E800CBCF2111CCCF0AC080916F -:102F20000E04882361F0853061F08091E80083FD14 -:102F30000AC08091E80082FFF2CF80E0089582E02D -:102F4000089583E0089581E00895982F973058F50B -:102F50009093E900981739F07091EC002091ED0002 -:102F60005091F00003C0242F762F50E021FF19C0AC -:102F70003091EB003E7F3093EB003091ED003D7FD0 -:102F80003093ED003091EB0031603093EB007093A3 -:102F9000EC002093ED005093F0002091EE0027FF0D -:102FA00007C09F5FD3CF8F708093E90081E00895C1 -:102FB00080E0089580910F0487FF11C08091E800A0 -:102FC00082FD05C080910E048111F8CF11C080915F -:102FD000E8008B770BC080910E04882349F0809124 -:102FE000E80080FFF8CF8091E8008E778093E800BA -:102FF00008952091E4003091E50095E64091EC00C1 -:10300000842F817040FF22C08091E80080FD1CC0A9 -:1030100080910E04882391F0853091F08091EB002F -:1030200085FD10C04091E4005091E5004217530720 -:1030300029F39A01915011F784E0089582E00895F0 -:1030400083E0089581E0089580E008954091E800CC -:1030500042FFDECF08950E9499180E94A118E0EE69 -:10306000F0E0808181608083E8EDF0E080818F77FF -:10307000808319BCA7EDB0E08C918E7F8C9380810A -:103080008F7E808310920D0408950F931F93CF932A -:10309000DF930E9499180E94A118C8EDD0E08881A2 -:1030A0008F77888388818068888388818F7D8883F3 -:1030B00019BC10920E0410920A0410920C04109283 -:1030C0000B0400EE10E0F80180818B7F8083888103 -:1030D0008160888342E060E080E00E94A517E1EE15 -:1030E000F0E080818E7F8083E2EEF0E0808181607D -:1030F0008083808188608083F80180818E7F8083D7 -:10310000888180618883DF91CF911F910F9108950D -:10311000E8EDF0E080818F7E8083E7EDF0E0808154 -:103120008160808384E082BF81E080930D040C94F1 -:103130004518E8EDF0E080818E7F80831092E200F8 -:1031400008951092DA001092E10008951F920F92F4 -:103150000FB60F9211242F933F934F935F936F936A -:103160007F938F939F93AF93BF93EF93FF93809140 -:10317000E10082FF0BC08091E20082FF07C08091D6 -:10318000E1008B7F8093E1000E940D1B8091DA00AB -:1031900080FF1FC08091D80080FF1BC08091DA00A3 -:1031A0008E7F8093DA008091D90080FF0DC080E18E -:1031B00089BD82E189BD09B400FEFDCF81E0809325 -:1031C0000E040E94111505C019BC10920E040E9435 -:1031D0001F158091E10080FF19C08091E20080FFFF -:1031E00015C08091E2008E7F8093E2008091E20022 -:1031F00080618093E2008091D80080628093D80043 -:1032000019BC85E080930E040E9423158091E10093 -:1032100084FF30C08091E20084FF2CC080E189BD32 -:1032200082E189BD09B400FEFDCF8091D8008F7D79 -:103230008093D8008091E1008F7E8093E10080919F -:10324000E2008F7E8093E2008091E20081608093B3 -:10325000E20080910A04882311F084E007C0809185 -:10326000E30087FD02C081E001C083E080930E048B -:103270000E9424158091E10083FF29C08091E20023 -:1032800083FF25C08091E100877F8093E10082E089 -:1032900080930E0410920A048091E1008E7F809347 -:1032A000E1008091E2008E7F8093E2008091E20055 -:1032B00080618093E20042E060E080E00E94A51718 -:1032C0008091F00088608093F0000E942215FF91A9 -:1032D000EF91BF91AF919F918F917F916F915F918E -:1032E0004F913F912F910F900FBE0F901F90189507 -:1032F0001F920F920FB60F9211242F933F934F936B -:103300005F936F937F938F939F93AF93BF93CF936D -:10331000DF93EF93FF93C091E900CF708091EC00B1 -:10332000D82FD17080FDD0E81092E9008091F00094 -:10333000877F8093F00078940E94BC191092E90076 -:103340008091F00088608093F000CD2BCF70C09307 -:10335000E900FF91EF91DF91CF91BF91AF919F91E4 -:103360008F917F916F915F914F913F912F910F902E -:103370000FBE0F901F9018951F93CF93DF93CDB77B -:10338000DEB7AA970FB6F894DEBF0FBECDBFEFE051 -:10339000F4E088E08E0F9091F10091938E13FBCFB3 -:1033A0000E943A158091E80083FF1FC180910F04AD -:1033B00090911004492F50E04A30510508F015C192 -:1033C000FA01E857FF4F0C948431803881F082383D -:1033D00009F00BC1809113048F708093E9008091F4 -:1033E000EB0085FB882780F91092E90006C08091E8 -:1033F0000B0490910C04911182609091E800977FEA -:103400009093E8008093F1001092F100C8C0282F3B -:103410002D7F09F0EAC0882319F0823061F0E5C001 -:1034200080911104813009F0E0C0933009F080E010 -:1034300080930C042BC080911104811127C08091CE -:1034400013048F7009F4D1C08093E9002091EB0040 -:1034500020FF1CC0933021F48091EB00806214C0E7 -:103460009091EB0090619093EB0021E030E0A90196 -:1034700002C0440F551F8A95E2F74093EA0010926C -:10348000EA008091EB0088608093EB001092E900E5 -:103490008091E800877F86C08111A7C01091110438 -:1034A0001F778091E3008078812B8093E3008091E7 -:1034B000E800877F8093E8000E94DA178091E80097 -:1034C00080FFFCCF8091E30080688093E3001111BE -:1034D00002C082E001C083E080930E0486C0805861 -:1034E000823008F082C080911104909112048C3DCA -:1034F00053E0950779F583E08A838AE289834FB7A1 -:10350000F894DE01139620E03EE051E2E32FF0E074 -:1035100050935700E49120FF03C0E295EF703F5FA6 -:10352000EF708E2F90E0EA3010F0C79601C0C09681 -:103530008D939D932F5F243149F74FBF8091E80011 -:10354000877F8093E8006AE270E0CE0101960E94D6 -:10355000E11614C0AE014F5F5F4F609113040E94EB -:103560002816BC01009709F440C09091E800977FAD -:103570009093E80089819A810E9444178091E80025 -:103580008B778093E80031C0803879F58091E8002E -:10359000877F8093E80080910A048093F1008091F6 -:1035A000E8008E778093E8000E94DA171EC0811130 -:1035B0001CC0909111049230C0F48091E800877F84 -:1035C0008093E80090930A040E94DA1780910A041D -:1035D000811106C08091E30087FD02C081E001C037 -:1035E00084E080930E040E9426158091E80083FFFA -:1035F0000AC08091E800877F8093E8008091EB000B -:1036000080628093EB00AA960FB6F894DEBF0FBEDF -:10361000CDBFDF91CF911F9108950895CF938091F1 -:103620000E048823A1F0C091E900CF709091EC00C6 -:10363000892F817090FD80E8C82B1092E90080915D -:10364000E80083FD0E94BC19CF70C093E900CF91C0 -:10365000089590938F0380938E030895E0918E03D5 -:10366000F0918F03309721F00190F081E02D0994C3 -:1036700080E00895E0918E03F0918F03309721F060 -:103680000280F381E02D09940895E0918E03F0917A -:103690008F03309721F00480F581E02D099408957F -:1036A00020918C0330918D038217930771F09093D2 -:1036B0008D0380938C03E0918E03F0918F033097FC -:1036C00021F00680F781E02D0994089520918A0366 -:1036D00030918B038217930771F090938B03809343 -:1036E0008A03E0918E03F0918F03309721F00084DC -:1036F000F185E02D0994089508950C947C1B0E9497 -:1037000004280E949A0B0E948A280C94452D4F92FF -:103710005F927F928F929F92AF92BF92CF92DF92F1 -:10372000EF92FF920F931F93CF93DF93CDB7DEB746 -:103730002A970FB6F894DEBF0FBECDBF0E94890C4A -:1037400091E9C92E93E0D92E00E010E0AA24A394B9 -:10375000B12C702E802F0E94D20D4C01F6014190A9 -:1037600051906F014826592641145104B1F40F5F5E -:103770001F4F0430110569F78FEF89838A831B82FD -:103780000E940D288160782F9D838C8349815A8106 -:103790006B818D810E94401C3AC08091ED0381FDB8 -:1037A0000E94DB0D20E030E07501022E02C0EE0C1D -:1037B000FF1C0A94E2F7C70184219521892B09F1A6 -:1037C0002E837F828E209F2091E0892809F490E04B -:1037D00098870E940D288160782F9A8789874E816B -:1037E0005F8168858A850E94401C000F111FF801C7 -:1037F000EF56FC4F80819181E826F926F182E08224 -:1038000006C02F5F3F4F2C30310571F6B0CF0E94BC -:10381000762A109190030E942E1B1817D9F00E944F -:103820002E1B809390032A960FB6F894DEBF0FBE2E -:10383000CDBFDF91CF911F910F91FF90EF90DF905F -:10384000CF90BF90AF909F908F907F905F904F9060 -:103850000C94D20A2A960FB6F894DEBF0FBECDBFE5 -:10386000DF91CF911F910F91FF90EF90DF90CF905C -:10387000BF90AF909F908F907F905F904F900895F2 -:10388000CF93DF93CDB7DEB72B970FB6F894DEBF9B -:103890000FBECDBF4F83588769877A878B87DE013C -:1038A000119686E0FD0111928A95E9F785E0FE0107 -:1038B000379601900D928A95E1F749815A816B8183 -:1038C0007C818D819E810E94E5232B960FB6F89412 -:1038D000DEBF0FBECDBFDF91CF910895CF93882378 -:1038E00009F4C2C0C82F823859F40E942E1B81FDF2 -:1038F000BBC089E30E948E260E945B2789E30CC02F -:10390000833879F40E942E1B80FDAEC083E50E94AF -:103910008E260E945B2783E50E94D026CF910C94CF -:103920005B27843859F40E942E1B82FD9DC087E4DA -:103930000E948E260E945B2787E4EECF8CEF8C0FCF -:10394000813A48F48C2F0E94AD2C81118DC08C2FB0 -:103950000E948E26E3CF80E28C0F883048F4C77037 -:1039600081E001C0880FCA95EAF70E941427D6CFDC -:103970008BE58C0F833078F4C53A29F0C63A31F0E4 -:1039800083E890E005C081E890E002C082E890E022 -:10399000CF910C94501B88E58C0F833108F064C0E4 -:1039A000C83A39F1C93A41F1CA3A49F1CB3A51F131 -:1039B000CC3A59F1CD3A61F1C03B69F1CE3A71F19F -:1039C000CF3A79F1C13B81F1C23B89F1C33B91F11F -:1039D000C43B99F1C53BA1F1C63BA9F1C73BB1F18D -:1039E000C83BB9F1C93BC1F1CA3BC9F180E090E0E5 -:1039F00038C082EE90E035C089EE90E032C08AEEA9 -:103A000090E02FC085EB90E02CC086EB90E029C0C1 -:103A100087EB90E026C08CEC90E023C08DEC90E02A -:103A200020C083E891E01DC08AE891E01AC082E9D5 -:103A300091E017C084E991E014C081E292E011C0E6 -:103A400083E292E00EC084E292E00BC085E292E055 -:103A500008C086E292E005C087E292E002C08AE2F6 -:103A600092E0CF910C94661BCF910895882309F4BE -:103A70004BC0823859F40E942E1B81FF45C089E358 -:103A80000E948E260E945B2789E30CC0833871F464 -:103A90000E942E1B80FF38C083E50E948E260E9464 -:103AA0005B2783E50E94D0260C945B27843859F469 -:103AB0000E942E1B82FF28C087E40E948E260E944F -:103AC0005B2787E4EFCF9CEF980F913A58F390E291 -:103AD000980F983050F4877091E001C0990F8A9543 -:103AE000EAF7892F0E941A27DFCF9BE5980F9330C2 -:103AF00020F480E090E00C94501B885A833120F42D -:103B000080E090E00C94661B0895882321F00E94C9 -:103B100014270C945B270895882321F00E941A270C -:103B20000C945B270895BF92CF92DF92EF92FF92A1 -:103B30000F931F93CF93DF9300D000D000D0CDB769 -:103B4000DEB725E0FC01DE01119601900D922A9569 -:103B5000E1F7FC01D08011810281258122952F702F -:103B600043815481452B09F472C31F3F21F4FFEFB9 -:103B7000DF1609F46CC37C012E830E949B07D98257 -:103B80001A8369817A81802F0E948A26182FB92E84 -:103B90000E943F260E9406252E81002319F00E94D4 -:103BA00031272E81EB2DE295EF70F0E0EE56FF4FBE -:103BB0000C9484318B2D807F9B2D9F70F92E882350 -:103BC00019F0F29480EFF822002389F0FF2009F425 -:103BD0007CC280E2810F883020F48F2D0E94142750 -:103BE00003C08F2D0E9424270E945B276EC2812F65 -:103BF0000E94361DFF2009F42AC3105E8F2D183055 -:103C000018F40E941A2702C00E942A2726960FB68F -:103C1000F894DEBF0FBECDBFDF91CF911F910F9102 -:103C2000FF90EF90DF90CF90BF900C945B278B2D8F -:103C3000807F9B2D9F70803211F4892F03C0892FC4 -:103C40008295807F112319F0113011F12BC00023D0 -:103C5000A9F0222389F1213079F526960FB6F89440 -:103C6000DEBF0FBECDBFDF91CF911F910F91FF90AF -:103C7000EF90DF90CF90BF900C944427222319F04F -:103C8000213009F4E4C28E830E9447278E819BC1B4 -:103C9000002321F0263008F0DAC20EC0253008F0EB -:103CA000D6C291C10023C9F0222331F0F7019581DA -:103CB00090FF0BC29F70958326960FB6F894DEBFD7 -:103CC0000FBECDBFDF91CF911F910F91FF90EF906D -:103CD000DF90CF90BF900C94851D222309F473C10F -:103CE00009C22B2D26952695237030E0211531052C -:103CF00021F021303105D1F0AAC2002321F0812F1B -:103D00009B2D937002C080E090E026960FB6F89449 -:103D1000DEBF0FBECDBFDF91CF911F910F91FF90FE -:103D2000EF90DF90CF90BF900C94501B002321F0B8 -:103D3000812F9B2D937002C080E090E026960FB6F5 -:103D4000F894DEBF0FBECDBFDF91CF911F910F91D1 -:103D5000FF90EF90DF90CF90BF900C94661B812F67 -:103D6000002319F00E947E2902C00E94E6292696AF -:103D70000FB6F894DEBF0FBECDBFDF91CF911F917C -:103D80000F91FF90EF90DF90CF90BF900C946B2A33 -:103D90008B2D837009F07BC0011159C2812F829550 -:103DA00086958770880F880F912F9F70C92ED12C10 -:103DB000E12CF12C082E04C0CC0CDD1CEE1CFF1CE9 -:103DC0000A94D2F714FF12C04FE050E060E070E0B8 -:103DD00004C0440F551F661F771F8A95D2F7CB0189 -:103DE000BA01609570958095909503C060E070E091 -:103DF000CB012B2D269526952370422F50E0423083 -:103E00005105D9F04330510569F16C297D298E297E -:103E10009F294130510551F126960FB6F894DEBF27 -:103E20000FBECDBFDF91CF911F910F91FF90EF900B -:103E3000DF90CF90BF900C942D256C297D298E2981 -:103E40009F2926960FB6F894DEBF0FBECDBFDF9137 -:103E5000CF911F910F91FF90EF90DF90CF90BF9087 -:103E60000C9449250E942D25C701B60126960FB650 -:103E7000F894DEBF0FBECDBFDF91CF911F910F91A0 -:103E8000FF90EF90DF90CF90BF900C94112500230E -:103E900019F08B2D817001C08695882309F4D7C154 -:103EA000812F829586958770880F880F912F9F703C -:103EB000C92ED12CE12CF12C082E04C0CC0CDD1C19 -:103EC000EE1CFF1C0A94D2F714FF12C04FE050E022 -:103ED00060E070E004C0440F551F661F771F8A958D -:103EE000D2F7CB01BA01609570958095909503C08B -:103EF00060E070E0CB012B2D269526952370422F94 -:103F000050E042305105D9F04330510569F16C2938 -:103F10007D298E299F294130510551F126960FB6F2 -:103F2000F894DEBF0FBECDBFDF91CF911F910F91EF -:103F3000FF90EF90DF90CF90BF900C9407266C29F4 -:103F40007D298E299F2926960FB6F894DEBF0FBED5 -:103F5000CDBFDF91CF911F910F91FF90EF90DF9038 -:103F6000CF90BF900C9423260E940726C701B6016C -:103F700026960FB6F894DEBF0FBECDBFDF91CF916E -:103F80001F910F91FF90EF90DF90CF90BF900C9416 -:103F9000EB25103F49F118F4103E48F491C0123F50 -:103FA00009F453C0E8F1133F09F464C089C01F70DD -:103FB0008B2D8F71002321F00E948425812F7CCED0 -:103FC0000E94A525812F26960FB6F894DEBF0FBE5E -:103FD000CDBFDF91CF911F910F91FF90EF90DF90B8 -:103FE000CF90BF900C948C1D0023B1F0253008F0C9 -:103FF0002EC18B2D8F7126960FB6F894DEBF0FBEA3 -:10400000CDBFDF91CF911F910F91FF90EF90DF9087 -:10401000CF90BF900C94CA25263008F018C1E9CF84 -:104020000023A9F08B2D8F7126960FB6F894DEBF72 -:104030000FBECDBFDF91CF911F910F91FF90EF90F9 -:10404000DF90CF90BF900C948425002359F38B2DE3 -:104050008F7126960FB6F894DEBF0FBECDBFDF91ED -:10406000CF911F910F91FF90EF90DF90CF90BF9075 -:104070000C94A525002399F08B2D8F7126960FB6F1 -:10408000F894DEBF0FBECDBFDF91CF911F910F918E -:10409000FF90EF90DF90CF90BF900C946F25269605 +:100770000000000000000000000000000000010078 +:100780000050010001000100010001000100010012 +:10079000010001004C00010001000100073006309B +:1007A000135012500030013002300C3001000100B3 +:1007B0000B300A300930083001000100010001004F +:1007C0000100010001000100010001000100010021 +:1007D00001000100010001000100010001002803E7 +:1007E000540068006500200050006C0061006E003D +:1007F00063006B0020004B006500790062006F0011 +:1008000061007200640000002C034F00720074004D +:1008100068006F006C0069006E0065006100720086 +:1008200020004B006500790062006F0061007200DB +:100830006400730000000403090409026D00040150 +:1008400000A0FA09040000010301010009211101BF +:100850000001223F000705810308000A0904010086 +:100860000103010200092111010001224D000705C9 +:10087000820308000A0904020001030000000921A4 +:10088000110100012236000705830308000A09044C +:1008900003000103000000092111010001223900B9 +:1008A000070584031000011201100100000008ED8B +:1008B000FE606001000102000105010906A10105B9 +:1008C0000719E029E7150025019508750181020542 +:1008D0000819012905950575019102950175039186 +:1008E0000105071900297715002501957875018103 +:1008F00002C005010980A101850216010026B7008A +:100900001A01002AB700751095018100C0050C0975 +:1009100001A1018503160100269C021A01002A9CF0 +:1009200002751095018100C005010902A1010901AC +:10093000A100050919012905150025019505750175 +:100940008102950175038101050109300931158185 +:10095000257F95027508810609381581257F950147 +:1009600075088106050C0A38021581257F950175E9 +:10097000088106C0C005010906A101050719E02983 +:10098000E71500250195087501810295017508811B +:100990000105081901290595057501910295017553 +:1009A0000391010507190029FF150025FF9506751C +:1009B000088100C011241FBECFEFDAE0DEBFCDBF3B +:1009C00004B603FE24C08091690490916A04A0914A +:1009D0006B04B0916C048730904BA740B04BB9F4D6 +:1009E0001092690410926A0410926B0410926C04C5 +:1009F00014BE84B7877F84BF88E10FB6F8948093D4 +:100A00006000109260000FBEE0E0F8E3099513E08B +:100A1000A0E0B1E0E2E4F4E602C005900D92A23657 +:100A2000B107D9F714E0A2E6B3E001C01D92A936E0 +:100A3000B107E1F70E94FD150C941F320C940000E1 +:100A4000279A2F988FEF9FEF9093870080938600CF +:100A50008AE08093800089E1809381000C94562D78 +:100A6000282F81110BC080918000877F80938000A8 +:100A700010928D0010928C002F9808952F988091DD +:100A80008000886080938000233019F48FEF9FEFFF +:100A90000FC083E090E0821B9109880F991F2FEF10 +:100AA0003FEFA90102C0569547958A95E2F7CA0122 +:100AB00090938D0080938C000895CF93DF93EC0189 +:100AC0000E94ED28BE0180E090E0DF91CF910C9470 +:100AD00018250F931F93462F50E04E30510508F014 +:100AE000DEC0DC01FA01EA5AFF4F12968C910C9499 +:100AF000E331882309F4D3C000E010E0980140E01E +:100B000064E070E089E292E00E942B1281E090E0C4 +:100B10000FC0882309F4C3C000E010E0980140E052 +:100B200066E070E089EB91E00E942B1282E090E099 +:100B30000E945D05B4C0882309F4B1C000E010E054 +:100B4000980140E068E070E089EE91E00E942B128D +:100B500084E090E0EDCF882311F083E005C083E0CE +:100B60000CC0882349F084E00E94952540E164E0B0 +:100B700083E00E946D0A93C084E00E94B625F6CF00 +:100B8000882331F085EE0E947F1C0E94AD2D87C026 +:100B900085EE0E94471D83C0882309F480C00E940F +:100BA000BF0D7DC0882309F47AC00E94B80D00E013 +:100BB00010E0980140E065E070E089E492E027C031 +:100BC000882309F46CC085E00E94B6250E94E00DE0 +:100BD00066C0882309F463C000E010E0980140E09B +:100BE00068E070E089E191E00E942B1285E00E94AC +:100BF000952555C0882309F452C00E94BE1200E01A +:100C000010E0980140E068E070E089E191E00E9426 +:100C10002B1245C0882309F442C00E94C912EFCFAD +:100C20008823E9F100E010E0980140E066E070E020 +:100C300089E891E00E942B1284E00E94B62583E0AF +:100C40000E94B62580E10E94B62585E00E94B62567 +:100C50000E94E00D86E00E9495250E94DA2881110D +:100C600002C00E94B6280E94F22890E09093680487 +:100C7000809367048068809367040E94F6280FC001 +:100C8000882369F000E010E0980140E066E070E041 +:100C900089E591E00E942B1286E00E94B62580E053 +:100CA00090E01F910F9108950F931F932FEF89EFFD +:100CB00090E0215080409040E1F700C0000000E04B +:100CC00010E0980140E065E070E089E492E00E9465 +:100CD0002B121F910F9108950F931F9300E010E0C6 +:100CE000980140E063E070E081E091E00E942B1207 +:100CF0002FEF82E597E0215080409040E1F700C05F +:100D000000001F910F910895CF92DF92EF92FF9212 +:100D10000F931F93CF93DF93CDB7DEB7CC58D10994 +:100D20000FB6F894DEBF0FBECDBF2091210425FF82 +:100D3000C5C08C01FC01928180910001992309F4C6 +:100D400060C096E4EEE8F2E0DE01A95BBF4F0190DF +:100D50000D929A95E1F7F8019081E0916203F0918C +:100D60006303E90FF11DEE0FFF1F27E430E02C0FA6 +:100D70003D1FE20FF31F60817181680F711D88278D +:100D800077FD8095982F0E94F12E20E030E040E41E +:100D900051E40E94562E6B017C01F801218184E010 +:100DA00090E0821B9109BC01882777FD8095982FE0 +:100DB0000E94F12E9B01AC01C701B6010E94EE2DED +:100DC0009B01AC0160E070E080E090E40E94643040 +:100DD00020E030E04CE551E40E9401304FE050E06B +:100DE000C457DF4F0FB6F894DEBF0FBECDBFDF9103 +:100DF000CF911F910F91FF90EF90DF90CF900C94C7 +:100E0000CB1196E4EEE8F2E0DE01119601900D922E +:100E10009A95E1F7F8019081E0916203F091630304 +:100E2000E90FF11DEE0FFF1F21E030E02C0F3D1FF9 +:100E3000E20FF31F60817181680F711D882777FDB4 +:100E40008095982F0E94F12E20E030E040E451E49C +:100E50000E94562E6B017C01F801218184E090E014 +:100E6000821B9109BC01882777FD8095982F0E94ED +:100E7000F12E9B01AC01C701B6010E94EE2D9B0132 +:100E8000AC0160E070E080E090E40E94643020E01B +:100E900030E04CE551E40E940130C457DF4F0FB6FB +:100EA000F894DEBF0FBECDBFDF91CF911F910F91A0 +:100EB000FF90EF90DF90CF900C94130EC457DF4F4C +:100EC0000FB6F894DEBF0FBECDBFDF91CF911F915B +:100ED0000F91FF90EF90DF90CF90089508950E94BA +:100EE00020056E9A769A0C9454060C946E070C9416 +:100EF00084060895880F991FFC01E250F040859107 +:100F000094910895880F991FFC01E258FE4F859136 +:100F1000949108950F931F93CF93DF93EC01811564 +:100F200020E49207A0F5C11580E3D80708F0E1C0DE +:100F3000C83ED105D8F4C03ED10508F0EEC1C83A8C +:100F4000D10578F4C53AD10508F074C0C130D10597 +:100F500009F46DC008F4DEC1C430D10508F0DDC16C +:100F6000D9C1CB3BD10508F470C0D4C1C11590E202 +:100F7000D90708F0B9C0C11521E0D20708F0CDC1EA +:100F8000C03FD10508F4C6C18E01106506C2C1304C +:100F900080E5D80709F4BDC068F5C13120E4D20767 +:100FA00009F4AEC050F4C03190E4D90708F0A5C0F0 +:100FB000CF70DD278E01146DF0C1C33120E4D2075C +:100FC00009F4A4C008F49FC0C115D04509F0A2C11E +:100FD0000E945C210E94E00D0E946C069FEF24E3BA +:100FE0008CE0915020408040E1F700C000000E945A +:100FF0007928D3C1C11520E6D20730F4C11581E5A7 +:10100000D80708F48CC02DC1C11590E7D90708F4A2 +:1010100081C1C11520E8D20708F478C1C11580E963 +:10102000D80708F077C1DF708E01106AB6C101E001 +:1010300010E0B3C1C53AD10509F471C1C63AD10572 +:1010400009F070C102E810E4A8C1C83AD10509F45A +:101050006CC1C93AD10509F46BC1CA3AD10509F48A +:101060006AC1CB3AD10509F469C1CC3AD10509F47A +:1010700068C1CD3AD10509F467C1C03BD10509F477 +:1010800066C1CE3AD10509F465C1CF3AD10509F45C +:1010900064C1C13BD10509F463C1C23BD10509F468 +:1010A00062C1C33BD10509F461C1C43BD10509F458 +:1010B00060C1C53BD10509F45FC1C63BD10509F448 +:1010C0005EC1C73BD10509F45DC1C83BD10509F438 +:1010D0005CC1C93BD10509F45BC1CA3BD10509F428 +:1010E0005AC100E014E459C1CE019F700E948207EA +:1010F00055C1DD278E01106C50C100E011ED4DC1CE +:1011000000E010ED4AC100E012ED47C100E013ED30 +:1011100044C180913D04816080933D043EC10E94A2 +:10112000DA28811102C00E94B6280E94F22890E0BD +:101130009093680480936704C23090E5D90721F446 +:1011400080916704816086C0C43020E5D20721F415 +:101150008091670482607EC0C63080E5D80721F4A4 +:1011600080916704846076C0C83090E5D90719F48F +:101170008091670427C0CA3020E5D20721F480910E +:101180006704806167C0CC3080E5D80721F4809186 +:10119000670480625FC0CE3090E5D90721F480916A +:1011A0006704806457C0C03120E5D20721F48091E4 +:1011B000670480684FC0C23180E5D80729F4809168 +:1011C00067048460886046C0C33090E5D90721F485 +:1011D000809167048E7F3EC0C53020E5D20721F4A0 +:1011E000809167048D7F36C0C73080E5D80721F431 +:1011F000809167048B7F2EC0C93090E5D90719F420 +:101200008091670426C0CB3020E5D20721F480917D +:1012100067048F7E1FC0CD3080E5D80721F4809110 +:1012200067048F7D17C0CF3090E5D90721F48091F6 +:1012300067048F7B0FC0C13120E5D20721F4809174 +:1012400067048F7707C0C331D04531F480916704BC +:101250008B7F877F80936704809167040E94F628C4 +:101260009CC08D2F99278F70992781309105D9F4D3 +:101270009E012370332702C0880F991F2A95E2F739 +:101280009C688E0144E0000F111F4A95E1F700278A +:101290001370802B912B53E0CC0FDD1F5A95E1F793 +:1012A000C076DD272FC08230910531F4DC2FCC27AA +:1012B0008E01016F106A71C08330910569F4CE010F +:1012C0008370992701E010E002C0000F111F8A957A +:1012D000E2F7C8019C680FC0049709F05EC0CE0118 +:1012E0008370992701E010E002C0000F111F8A955A +:1012F000E2F7C8019A6823E0CC0FDD1F2A95E1F7D9 +:10130000C07ED7708C010C2B1D2B47C0DF708E0167 +:10131000106243C000E010E040C08E013EC001E812 +:1013200010E43BC003E810E438C002EE14E435C01A +:1013300009EE14E432C00AEE14E42FC005EB14E405 +:101340002CC006EB14E429C007EB14E426C00CEC17 +:1013500014E423C00DEC14E420C003E815E41DC020 +:101360000AE815E41AC002E915E417C004E915E417 +:1013700014C001E216E411C003E216E40EC004E258 +:1013800016E40BC005E216E408C006E216E405C048 +:1013900007E216E402C00AE216E4C801DF91CF9129 +:1013A0001F910F9108959CE0799FF001112490E323 +:1013B000899FE00DF11D1124E60FF11DEE0FFF1FB7 +:1013C000E258FE4F85919491803E9105E0F4803C77 +:1013D000910558F58133910509F46FC048F48932BD +:1013E000910509F463C08A32910509F46DC072C099 +:1013F00089339105E9F082389105D1F08533910563 +:1014000009F44DC067C0833E910581F138F4803EF8 +:101410009105B9F0823E9105D9F05CC0863E9105F8 +:1014200061F1873E9105A1F155C00E947A070895A8 +:101430002091670420FD02C021FF4CC080EE90E0A7 +:1014400049C08091670480FFF9CF89E390E042C0F2 +:101450008091670482FF0EC08091670484FF03C0FF +:1014600080E090E037C083EE90E034C08091670464 +:1014700082FFF2CF82EE90E02DC08091670483FF5F +:101480000BC08091670484FDEBCF87EE90E022C013 +:101490008091670483FFF5CF86EE90E01BC08091BA +:1014A000670485FF07C089E290E014C0809167045B +:1014B00085FFF9CF85E390E00DC08091670486FF3A +:1014C00007C08AE290E006C08091670486FFF9CFEA +:1014D00081E390E00E948A070895CF92DF92EF9215 +:1014E000FF920F931F9301E010E020E030E06801CD +:1014F000790104C0CC0CDD1CEE1CFF1C8A95D2F7D0 +:1015000004C0000F111F221F331F6A95D2F70C2948 +:101510001D292E293F29C0902104D0902204E0905B +:101520002304F0902404C022D122E222F322842F4B +:10153000C016D106E206F30641F41F910F91FF9009 +:10154000EF90DF90CF900C9495251F910F91FF9015 +:10155000EF90DF90CF900C94B62508950C94AD0ACF +:101560005F926F927F928F929F92AF92BF92CF9233 +:10157000DF92EF92FF920F931F93CF93DF93CDB73C +:10158000DEB728970FB6F894DEBF0FBECDBFCE01F1 +:1015900001966C014E0199E0890E911C20E030E02B +:1015A00040E050E060E070E000E010E0E12CF12C61 +:1015B0006C2C5D2C88E0782EAA24A394B12CE4ED49 +:1015C000F2E0A62DB52D872D01900D928A95E1F7B9 +:1015D000F601819191916F01FC01E07FFF27E032DC +:1015E000F10559F48F709927F50102C0EE0FFF1F26 +:1015F0008A95E2F7EE2AFF2A37C0E033F10559F465 +:101600008F709927F50102C0EE0FFF1F8A95E2F750 +:101610000E2B1F2B29C0E034F10559F48F70992748 +:10162000F50102C0EE0FFF1F8A95E2F76E2B7F2BAC +:101630001BC0E035F10559F48F709927F50102C000 +:10164000EE0FFF1F8A95E2F74E2B5F2B0DC0E036A1 +:10165000F10551F48F709927F50102C0EE0FFF1FBD +:101660008A95E2F72E2B3F2BC814D90409F0A7CF97 +:1016700084B19E2D9095892384B985B1E82AE5B877 +:1016800087B1902F9095892387B988B1082B08B925 +:101690008AB1962F909589238AB98BB1682B6BB943 +:1016A0008DB1942F909589238DB98EB1482B4EB969 +:1016B00080B3922F9095892380BB81B3282B21BBC7 +:1016C00028960FB6F894DEBF0FBECDBFDF91CF9145 +:1016D0001F910F91FF90EF90DF90CF90BF90AF9050 +:1016E0009F908F907F906F905F9008955F926F9220 +:1016F0007F928F929F92AF92BF92CF92DF92EF92A2 +:10170000FF920F931F93CF93DF93CDB7DEB7689708 +:101710000FB6F894DEBF0FBECDBF85B7806885BF1A +:1017200085B7806885BF0E94B00ACE0101966C0122 +:101730004E0199E1890E911C20E030E040E050E03C +:1017400060E070E000E010E0E12CF12C6C2C5D2CEE +:1017500088E1782EAA24A394B12CECEDF2E0A62D1A +:10176000B52D872D01900D928A95E1F7F6018191B3 +:1017700091916F01FC01E07FFF27E032F10559F400 +:101780008F709927F50102C0EE0FFF1F8A95E2F7CF +:10179000EE2AFF2A37C0E033F10559F48F709927FC +:1017A000F50102C0EE0FFF1F8A95E2F70E2B1F2BEB +:1017B00029C0E034F10559F48F709927F50102C072 +:1017C000EE0FFF1F8A95E2F76E2B7F2B1BC0E035D3 +:1017D000F10559F48F709927F50102C0EE0FFF1F34 +:1017E0008A95E2F74E2B5F2B0DC0E036F10551F4E0 +:1017F0008F709927F50102C0EE0FFF1F8A95E2F75F +:101800002E2B3F2BC814D90409F0A7CF84B19E2DED +:101810009095892384B985B1E82AE5B887B1902FDE +:101820009095892387B988B1082B08B98AB1962F7A +:10183000909589238AB98BB1682B6BB98DB1942FA0 +:10184000909589238DB98EB1482B4EB980B3922FD4 +:101850009095892380BB81B3282B21BB10926D0307 +:1018600010926C03109265031092640310926F0340 +:1018700010926E0310926703109266031092710328 +:101880001092700310926903109268031092730310 +:101890001092720310926B0310926A0368960FB64F +:1018A000F894DEBF0FBECDBFDF91CF911F910F9196 +:1018B000FF90EF90DF90CF90BF90AF909F908F9070 +:1018C0007F906F905F900C946F077F928F929F92A2 +:1018D000AF92BF92CF92DF92EF92FF920F931F933E +:1018E000CF93DF93CDB7DEB7A0970FB6F894DEBFE6 +:1018F0000FBECDBF6E0149E1C40ED11C84E6E82EB7 +:1019000083E0F82E98E0792EBC2CAD2C01E010E09D +:1019100028E1822E35E0932EE4EDF2E0AB2DBA2DD6 +:10192000872D01900D928A95E1F7F60181919191B1 +:101930006F019C01207F33272032310591F424B1BF +:101940008F709927A80102C0440F551F8A95E2F7AE +:10195000CA01922F982B94B995B18095892385B9A6 +:1019600053C02033310591F427B18F709927F801C6 +:1019700002C0EE0FFF1F8A95E2F7CF01922F982B3E +:1019800097B998B18095892388B93EC02034310534 +:1019900091F42AB18F709927A80102C0440F551FF6 +:1019A0008A95E2F7CA01922F982B9AB99BB180953C +:1019B00089238BB929C02035310591F42DB18F7061 +:1019C0009927F80102C0EE0FFF1F8A95E2F7CF01B9 +:1019D000922F982B9DB99EB1809589238EB914C002 +:1019E0002036310589F420B38F709927A80102C0F1 +:1019F000440F551F8A95E2F7CA01922F982B90BB8E +:101A000091B38095892381BB50EA5A95F1F7BE01C5 +:101A10006F5F7F4F20E030E040E050E0ECEDF2E01F +:101A2000DE011196882D01900D928A95E1F7FB0158 +:101A300081919191BF01FC01E07FFF27E032F10528 +:101A400011F4E3B113C0E033F10511F4E6B10EC0B7 +:101A5000E034F10511F4E9B109C0E035F10511F404 +:101A6000ECB104C0E036F105B9F4EFB1F0E08F70ED +:101A7000992702C0F595E7958A95E2F7E0FD08C041 +:101A8000C801042E02C0880F991F0A94E2F702C011 +:101A900080E090E0282B392B4F5F5F4F4C30510591 +:101AA00009F0BCCFF701808191818217930721F063 +:101AB00031832083909271020E94B00AF2E0EF0E0F +:101AC000F11C4CE6E41643E0F40609F025CF8091C2 +:101AD0007102882361F1815080937102882339F06B +:101AE0008FE99FE00197F1F700C0000020C08091CE +:101AF00064039091650390936D0380936C038091D0 +:101B000066039091670390936F0380936E038091B7 +:101B1000680390916903909371038093700380919F +:101B20006A0390916B0390937303809372030E94F6 +:101B3000750781E0A0960FB6F894DEBF0FBECDBF4B +:101B4000DF91CF911F910F91FF90EF90DF90CF9099 +:101B5000BF90AF909F908F907F900895E82FF0E016 +:101B6000EE0FFF1FE459FC4F808191810895089585 +:101B7000809152048160809352040C9408298091D2 +:101B800052048E7F809352040C9408290E94DA2814 +:101B9000811102C00E94B6280E9404298093520439 +:101BA0003E9A809171008D7F8093710082E08093D6 +:101BB00090008AE18093910081E0809376030895FC +:101BC00080917603811102C00E94C60D1092C60357 +:101BD0001092C503809171008D7F80937100809178 +:101BE00090008F7780939000109288031092870363 +:101BF0001092BF031092C0031092C1031092C2034F +:101C00001092BE031092BD03EDE9F3E0ADE8B3E03E +:101C100011921192119211921D921D9283E0ED3B4F +:101C2000F807B1F70895CF92DF92EF92FF920F93EA +:101C30001F93CF93DF9320918703222309F484C05D +:101C40006B017C0180917603811102C00E94C60D58 +:101C50000DEB13E0C7E0D0E0A7019601F8019291E7 +:101C60008291729162918F010E94522E811131C036 +:101C7000FE01EE0FFF1FEE0FFF1FE356FC4F108219 +:101C8000118212821382DE01AA0FBB1FA357BC4F21 +:101C900011961C921E92C730D105E9F0219644811D +:101CA0005581668177814083518362837383148277 +:101CB00015821682178212968D919C911397119618 +:101CC0009C938E9313961C921E92129734961296A2 +:101CD000E2CF219708F68091C5039091C603019742 +:101CE00097FD05C09093C6038093C50304C010926E +:101CF000C6031092C5038091C5039091C60320913D +:101D0000C3033091C4032817390724F01092C40389 +:101D10001092C303892BC1F4809171008D7F809351 +:101D20007100809190008F77809390001092BF0394 +:101D30001092C0031092C1031092C2031092BE030E +:101D40001092BD0310928703DF91CF911F910F91E5 +:101D5000FF90EF90DF90CF9008951F920F920FB6F3 +:101D60000F9211244F925F926F927F928F929F9267 +:101D7000AF92BF92CF92DF92EF92FF922F933F9359 +:101D80004F935F936F937F938F939F93AF93BF9383 +:101D9000CF93DF93EF93FF9380918703882309F418 +:101DA0009BC1C091C503D091C6031C161D060CF043 +:101DB00093C14090770350907803609079037090BE +:101DC0007A0320E030E0A901C301B2010E94FD2F97 +:101DD00018160CF065C0C130D10509F452C08091CD +:101DE000C3039091C403BE010E94CF317C01909344 +:101DF000C4038093C3038090890390908A03A090CA +:101E00008B03B0908C0320E030E040E85FE3C50135 +:101E1000B4010E94EE2D6093890370938A0380932E +:101E20008B0390938C03F701EE0FFF1FEE0FFF1F44 +:101E3000E356FC4FA30192016081718182819381FD +:101E40000E94562E20E030E040E05EE30E94013028 +:101E50009B01AC01C501B4010E94FD2F18168CF442 +:101E6000C7010196BE010E94CF319093C4038093B5 +:101E7000C3031092890310928A0310928B0310926D +:101E80008C03E091C303F091C403EE0FFF1FEE0F2C +:101E9000FF1FE356FC4F6081718182819381D0C026 +:101EA000C090BF03D090C003E090C103F090C20384 +:101EB00020E030E0A901C701B6010E94522E21970F +:101EC000882309F4A2C0FE01EE0FFF1FEE0FFF1FD3 +:101ED000E356FC4F80809180A280B380A5019401DD +:101EE000C701B6010E94522E87FF31C0A50194019F +:101EF00060E070E08CED93EC0E94562E20E030E024 +:101F000040E451E40E94562E20E030E040E05FE3E0 +:101F10000E9401309B01AC0160E070E080E090E441 +:101F20000E9464309B01AC01C501B4010E940130E4 +:101F30009B01AC01C701B6010E94522E87FF07C06A +:101F4000A701960160E070E08CED93E439C0A50133 +:101F50009401C701B6010E94FD2F18160CF055C060 +:101F6000A501940160E070E08CED93E40E94562E90 +:101F700020E030E040E451E40E94562E20E030E0C2 +:101F800040E05FE30E9401309B01AC0160E070E043 +:101F900080E090E40E9464309B01AC01C501B40173 +:101FA0000E9401309B01AC01C701B6010E94FD2FC8 +:101FB00018165CF5A701960160E070E08CED93ECDB +:101FC0000E94562E20E030E040E451E40E94562E5C +:101FD00020E030E040E05FE30E9401309B01AC0173 +:101FE00060E070E080E090E40E9464309B01AC010E +:101FF000C701B6010E9401306093BF037093C00314 +:102000008093C1039093C20313C0FE01EE0FFF1F24 +:10201000EE0FFF1FE356FC4F80819181A281B381B7 +:102020008093BF039093C003A093C103B093C203F6 +:102030006091BF037091C0038091C1039091C2036E +:1020400020917403309175032F3F4FEF340731F027 +:102050002F5F3F4F30937503209374030E94D41277 +:102060006B017C0120E034E244EF51E40E94522EE7 +:1020700087FF08C086EFC82E88E2D82E84EFE82EAE +:1020800081E4F82E20E030E040E051E4C701B601E1 +:102090000E9401309B01AC0160E074E284E79BE4A4 +:1020A0000E94562E6B017C010E94BE2E70939700F9 +:1020B00060939600209172023091730240917402F5 +:1020C00050917502C701B6010E9401300E94BE2ED8 +:1020D000709399006093980080918803882309F495 +:1020E00033C1C0908303D0908403E0908503F090C7 +:1020F000860320E030E0A901C701B6010E94FD2F50 +:102100001816D4F580917403909175038F3F2FEFCB +:10211000920729F001969093750380937403C70189 +:10212000B6010E94D41220E030E040E051E40E9469 +:1021300001309B01AC0160E074E284E79BE40E9403 +:10214000562E6B017C010E94BE2E70939700609307 +:102150009600209172023091730240917402509166 +:102160007502C701B6010E9401300E94BE2E709315 +:1021700099006093980008C0109297001092960002 +:10218000109299001092980060917D0370917E03E7 +:102190006F5F7F4F70937E0360937D032091960065 +:1021A0003091970080E090E0232BF1F0C0919600F1 +:1021B000D09197000E94EF2E6B017C01BE0180E060 +:1021C00090E00E94EF2E9B01AC0160917F03709123 +:1021D000800380918103909182030E94562E20E01B +:1021E0003FEF4FE757E410C00E94EF2E6B017C01D8 +:1021F00020E030EE4FEF54E460917F037091800354 +:1022000080918103909182030E9401309B01AC0177 +:10221000C701B6010E94FD2F87FD96C080917B0308 +:102220008F5F80937B0390E020914E0430914F04A8 +:1022300082179307A0F080915904882319F0109217 +:102240007B030DC0809171008D7F80937100809120 +:1022500090008F7780939000109288037DC08091CA +:102260007C03C0917B03811128C0C0905304D0909F +:102270005404E0905504F090560420E030E0A901A9 +:10228000C701B6010E94FD2F1816BCF481E08093AF +:102290007C031092830310928403109285031092A2 +:1022A0008603C0927F03D0928003E0928103F09274 +:1022B0008203C150C0937B0343C010927C031092F1 +:1022C000750310927403E0915004F091510448E0BA +:1022D000C49FE00DF11D112480819181A281B38101 +:1022E0008093830390938403A0938503B093860324 +:1022F00020E030E040E85EE364817581868197816B +:102300000E9401306B017C0120E030E048EC52E497 +:1023100060917602709177028091780290917902B3 +:102320000E94562E9B01AC01C701B6010E940130EC +:1023300060937F0370938003809381039093820363 +:1023400010927E0310927D038091520480FD04C0A0 +:102350001092880310928703FF91EF91DF91CF9144 +:10236000BF91AF919F918F917F916F915F914F91AD +:102370003F912F91FF90EF90DF90CF90BF90AF9063 +:102380009F908F907F906F905F904F900F900FBEB7 +:102390000F901F901895CF92DF92EF92FF92CF93FC +:1023A000DF936B017C01EA0180917603811102C009 +:1023B0000E94C60D8091520480FF46C08091C503E3 +:1023C0009091C60308970CF03FC0809171008D7FFB +:1023D000809371008091880381110E94E00D81E05B +:1023E00080938703109275031092740320E030E00D +:1023F000A901C701B6010E94FD2F1816DCF48091D7 +:10240000C5039091C603FC01EE0FFF1FEE0FFF1FE7 +:10241000E356FC4FC082D182E282F382FC01EE0FD0 +:10242000FF1FE357FC4FD183C08301969093C603EF +:102430008093C503809171008260809371008091C8 +:102440009000806880939000DF91CF91FF90EF9093 +:10245000DF90CF9008958F929F92AF92BF92CF92CC +:10246000DF92EF92FF920F931F93CF93DF93EC01D4 +:102470007B01D42E4801590180917603811102C05D +:102480000E94C60D8091520480FF6BC08091710044 +:102490008D7F809371008091870381110E94E00DF0 +:1024A00081E080938803D0935104C0935004F0924C +:1024B0004F04E0924E04D0925904809253049092BB +:1024C0005404A0925504B0925604109289031092BD +:1024D0008A0310928B0310928C0310927B038881E5 +:1024E0009981AA81BB818093830390938403A093F5 +:1024F0008503B093860320E030E040E85EE36C8122 +:102500007D818E819F810E9401306B017C0120E0E2 +:1025100030E048EC52E4609176027091770280914D +:102520007802909179020E94562E9B01AC01C7015E +:10253000B6010E94013060937F0370938003809303 +:1025400081039093820310927E0310927D03809109 +:102550007100826080937100809190008068809308 +:102560009000DF91CF911F910F91FF90EF90DF903E +:10257000CF90BF90AF909F908F9008958091C703A8 +:1025800090E0019666E070E00E94CF318093C7032F +:1025900008958091C70390E0019766E070E00E9483 +:1025A000CF318093C70308958F929F92AF92BF92CD +:1025B000CF92DF92EF92FF920F931F93CF93DF930F +:1025C0006B017C01C0917403D0917503BE0180E062 +:1025D00090E00E94EF2E4B015C01A701960160E0A4 +:1025E00070E08CE594E40E94562E9B01AC01C5017D +:1025F000B4010E9401300E94C32E2091C7032330F2 +:1026000009F473C028F4222351F02130E9F02CC1E1 +:10261000243009F4A0C0253009F4E0C025C180E0D1 +:1026200090E0A0E0BFE38093720290937302A093C6 +:102630007402B0937502109277031092780310928F +:10264000790310927A0310C11092770310927803E5 +:102650001092790310927A036431710540F46A3064 +:10266000710560F520E030E040E85EE32BC0693C96 +:10267000710508F0AAC080E090E00E94EF2E20E0F3 +:1026800030E040EA51E40E94ED2D20E030E044E3E8 +:1026900053E40E94562E9B01AC010E94013020E0C1 +:1026A00030E040E05EE30E9401309B01AC0160E05D +:1026B00070E080E09EE30E94ED2D44C020E030E019 +:1026C00040E05FE3C701B6010E9401306B017C016D +:1026D00080E090E0A0E0BEE38093720290937302EA +:1026E000A0937402B0937502BFC01092770310924A +:1026F00078031092790310927A034AE0469F900182 +:10270000479F300D1124C90168EB7BE00E94BB316B +:10271000BC016C5D754077FF03C0719561957109CF +:10272000882777FD8095982F0E94F12E2EE333ECB9 +:102730004EE259E30E94013020E030E040EC5EE3DD +:102740000E94EE2D60937202709373028093740264 +:102750009093750289C010927703109278031092BB +:10276000790310927A03CE0183709927892BE1F0C7 +:10277000BE016170772780E090E00E94EF2E20E09C +:1027800030E040E05EE30E94013020E030E040E4D1 +:102790005FE30E94EE2D6093720270937302809348 +:1027A0007402909375020CC080E090E0A0E0BFE35B +:1027B0008093720290937302A0937402B093750297 +:1027C000C770DD27CD2B09F04FC010927202109216 +:1027D0007302109274021092750246C01092770331 +:1027E000109278031092790310927A0300E010E0BF +:1027F00020E03FE30093720210937302209374026F +:10280000309375026739710578F180E090E00E949D +:10281000EF2E20E030E047E153E40E94ED2D20E070 +:1028200030E04AE754E40E94562E20E030E048E4CD +:1028300052E40E94013020E030E040EA51E40E947E +:10284000332F0E94BE2E660F771F660F771FFB0186 +:10285000EC50FD4F2081318142815381C701B60187 +:102860000E9401306B017C01C701B601DF91CF915D +:102870001F910F91FF90EF90DF90CF90BF90AF909E +:102880009F908F9008958091D8030895CF93DF9300 +:1028900000D01F92CDB7DEB79C0180915E048430DA +:1028A00019F593E099833B832A839093E9008FEF96 +:1028B0009091E800815095FD06C095ED9A95F1F74D +:1028C00000008111F5CF8091E80085FF0DC040E048 +:1028D00050E063E070E0CE0101960E94A71680915F +:1028E000E8008E778093E8000F900F900F90DF91B3 +:1028F000CF910895CF93DF9300D01F92CDB7DEB76D +:1029000020915E04243021F522E029839B838A8371 +:1029100083E08093E9008FEF9091E800815095FD6E +:1029200006C095ED9A95F1F700008111F5CF8091E1 +:10293000E80085FF0DC040E050E063E070E0CE01AC +:1029400001960E94A7168091E8008E778093E80098 +:102950000F900F900F90DF91CF91089520915E041A +:102960002430F1F422E02093E9002FEF3091E800C9 +:10297000215035FD06C035ED3A95F1F700002111E3 +:10298000F5CF2091E80025FF0BC040E050E065E066 +:1029900070E00E94A7168091E8008E778093E8008F +:1029A0000895CF93DF93EC0190915E04943009F089 +:1029B00046C0809184028823D9F0809185028823C3 +:1029C000B9F09093E9008FEF9091E800815095FD68 +:1029D00006C095E19A95F1F700008111F5CF80913D +:1029E000E80085FF2CC040E050E060E170E017C0D7 +:1029F00081E08093E9008FEF9091E800815095FD90 +:102A000006C095ED9A95F1F700008111F5CF809100 +:102A1000E80085FF14C040E050E068E070E0CE01BF +:102A20000E94A7168091E8008E778093E80080E1ED +:102A3000FE01A8ECB3E001900D928A95E1F7DF91D9 +:102A4000CF91089580915D04811109C00E943C18C6 +:102A50000E9499188091E20084608093E2000895BA +:102A600010925D040895089508950C94E12742E0C2 +:102A700061EC81E00E94B61742E061EC82E00E94C6 +:102A8000B61742E061EC83E00E94B61742E161ECC8 +:102A900084E00C94B61780916004833009F455C02B +:102AA00030F4813071F0823009F48EC008958A309C +:102AB00009F47AC08B3009F460C0893009F09CC0F9 +:102AC00020C080915F04813A09F096C08091E800AF +:102AD000877F8093E8008091630490916404892B40 +:102AE00021F460E188EC93E003C060E080E090E0D6 +:102AF00070E00E94F2168091E8008B778093E800E6 +:102B0000089580915F04813209F076C0809163045A +:102B100090916404009719F0039709F06DC08091BB +:102B2000E800877F8093E8008091E80082FD05C07F +:102B300080915E048111F8CF5FC08091F100809395 +:102B4000D8038091E8008B7753C080915F04813A6D +:102B500009F052C08091630490916404892B09F0BC +:102B60004BC08091E800877F8093E8008091E80067 +:102B700080FFFCCF8091840236C080915F04813257 +:102B8000D9F58091630490916404892BA9F5809113 +:102B9000E800877F8093E8000E94EB178091610432 +:102BA000809384020C945C2180915F04813221F532 +:102BB0008091E800877F8093E8000E94EB17809166 +:102BC00062048093D903089580915F04813AA1F44F +:102BD0008091E800877F8093E8008091E80080FF83 +:102BE000FCCF8091D9038093F1008091E8008E772B +:102BF0008093E8000C94EB17089584B7877F84BF17 +:102C000088E10FB6F89480936000109260000FBEC8 +:102C100090E080E80FB6F894809361009093610093 +:102C20000FBE0E948E1B0E943C180E949918809132 +:102C3000E20084608093E20078940E941F1B0E944F +:102C4000901B8AE792E00E943A1B80915E048530D7 +:102C500069F40E949B2780915C048823B1F30E9451 +:102C6000C927882391F30E949116EFCF0E94981BE9 +:102C7000ECCF292F332723303105C9F064F42130FC +:102C8000310581F02230310509F043C08DE690E036 +:102C90002AE338E042C021323105F1F02232310519 +:102CA00041F137C082E190E027EA38E036C0992749 +:102CB0008130910541F08230910541F0892B49F531 +:102CC000E6E3F8E005C0E8E0F8E002C0EEEDF7E08A +:102CD000849190E09F0121C06430D8F4E62FF0E0A9 +:102CE000EE0FFF1FE05BFC4F2081318189E090E017 +:102CF00014C0643070F470E0FB01EE0FFF1FE85B5E +:102D0000FC4F20813181FB01EC5BFC4F808190E026 +:102D100004C080E090E020E030E0FA0131832083BD +:102D2000089580E189BD82E189BD09B400FEFDCF2F +:102D30008091D8008F7D8093D8008091E0008260E0 +:102D40008093E0008091E00081FDFCCF0895CF9258 +:102D5000DF92EF92FF920F931F93CF93DF93EC01DB +:102D60008B016A010E940A18811133C0C114D10479 +:102D700039F0F60180819181081B190BC80FD91F0A +:102D8000E12CF12C0115110519F18091E80085FD68 +:102D900016C08091E8008E778093E800C114D104BA +:102DA00049F0F60180819181E80EF91EF182E082FE +:102DB00085E00FC00E940A18882321F30AC0899178 +:102DC0008093F10001501109FFEFEF1AFF0ADACFEB +:102DD00080E0DF91CF911F910F91FF90EF90DF90F6 +:102DE000CF90089520916504309166042617370727 +:102DF00048F06115710539F42091E8002E77209391 +:102E0000E80001C0B90140E061157105A9F1209108 +:102E10005E04222309F443C0253009F442C0209106 +:102E2000E80023FD40C02091E80022FD32C020913F +:102E3000E80020FFE9CF4091F3002091F20030E05C +:102E4000342BFC01CF016115710559F02830310593 +:102E500040F481918093F100615071092F5F3F4FE1 +:102E6000F1CF41E02830310509F040E02091E80041 +:102E70002E772093E800C8CF4111C9CF0AC08091B6 +:102E80005E04882361F0853061F08091E80083FD65 +:102E90000AC08091E80082FFF2CF80E0089582E0CE +:102EA000089583E0089581E00895209165043091AC +:102EB00066042617370748F06115710539F420912B +:102EC000E8002E772093E80001C0B901FC0120E062 +:102ED0006115710591F180915E04882309F440C069 +:102EE000853009F43FC08091E80083FD3DC08091AA +:102EF000E80082FD2FC08091E80080FFE9CF20919B +:102F0000F3008091F20090E0922B6115710559F069 +:102F10008830910540F424912093F100319661505E +:102F200071090196F2CF21E0089709F020E0809125 +:102F3000E8008E778093E800CBCF2111CCCF0AC078 +:102F400080915E04882361F0853061F08091E80013 +:102F500083FD0AC08091E80082FFF2CF80E00895EF +:102F600082E0089583E0089581E00895982F9730D6 +:102F700058F59093E900981739F07091EC00209182 +:102F8000ED005091F00003C0242F762F50E021FF78 +:102F900019C03091EB003E7F3093EB003091ED0093 +:102FA0003D7F3093ED003091EB0031603093EB00CA +:102FB0007093EC002093ED005093F0002091EE0010 +:102FC00027FF07C09F5FD3CF8F708093E90081E018 +:102FD000089580E0089580915F0487FF11C080917B +:102FE000E80082FD05C080915E048111F8CF11C018 +:102FF0008091E8008B770BC080915E04882349F0B4 +:103000008091E80080FFF8CF8091E8008E77809370 +:10301000E80008952091E4003091E50095E64091A4 +:10302000EC00842F817040FF22C08091E80080FD79 +:103030001CC080915E04882391F0853091F08091CE +:10304000EB0085FD10C04091E4005091E50042176F +:10305000530729F39A01915011F784E0089582E013 +:10306000089583E0089581E0089580E008954091F7 +:10307000E80042FFDECF08950E94AA180E94B2180D +:10308000E0EEF0E0808181608083E8EDF0E0808117 +:103090008F77808319BCA7EDB0E08C918E7F8C93E5 +:1030A00080818F7E808310925D0408950F931F931B +:1030B000CF93DF930E94AA180E94B218C8EDD0E007 +:1030C00088818F77888388818068888388818F7DD5 +:1030D000888319BC10925E0410925A0410925C040A +:1030E00010925B0400EE10E0F80180818B7F8083FA +:1030F00088818160888342E060E080E00E94B617AA +:10310000E1EEF0E080818E7F8083E2EEF0E080816E +:1031100081608083808188608083F80180818E7FD8 +:103120008083888180618883DF91CF911F910F9187 +:103130000895E8EDF0E080818F7E8083E7EDF0E098 +:1031400080818160808384E082BF81E080935D0420 +:103150000C945618E8EDF0E080818E7F8083109209 +:10316000E20008951092DA001092E10008951F9293 +:103170000F920FB60F9211242F933F934F935F93AB +:103180006F937F938F939F93AF93BF93EF93FF932F +:103190008091E10082FF0BC08091E20082FF07C0B6 +:1031A0008091E1008B7F8093E1000E941E1B809143 +:1031B000DA0080FF1FC08091D80080FF1BC0809183 +:1031C000DA008E7F8093DA008091D90080FF0DC0F5 +:1031D00080E189BD82E189BD09B400FEFDCF81E0B7 +:1031E00080935E040E94221505C019BC10925E04F3 +:1031F0000E9430158091E10080FF19C08091E200AB +:1032000080FF15C08091E2008E7F8093E200809164 +:10321000E20080618093E2008091D8008062809318 +:10322000D80019BC85E080935E040E94341580911B +:10323000E10084FF30C08091E20084FF2CC080E177 +:1032400089BD82E189BD09B400FEFDCF8091D8001F +:103250008F7D8093D8008091E1008F7E8093E10084 +:103260008091E2008F7E8093E2008091E200816095 +:103270008093E20080915A04882311F084E007C013 +:103280008091E30087FD02C081E001C083E080936C +:103290005E040E9435158091E10083FF29C0809172 +:1032A000E20083FF25C08091E100877F8093E100E9 +:1032B00082E080935E0410925A048091E1008E7F38 +:1032C0008093E1008091E2008E7F8093E200809104 +:1032D000E20080618093E20042E060E080E00E94D2 +:1032E000B6178091F00088608093F0000E9433153B +:1032F000FF91EF91BF91AF919F918F917F916F91CE +:103300005F914F913F912F910F900FBE0F901F90A3 +:1033100018951F920F920FB60F9211242F933F937F +:103320004F935F936F937F938F939F93AF93BF93CD +:10333000CF93DF93EF93FF93C091E900CF7080911B +:10334000EC00D82FD17080FDD0E81092E900809178 +:10335000F000877F8093F00078940E94CD1910923E +:10336000E9008091F00088608093F000CD2BCF7051 +:10337000C093E900FF91EF91DF91CF91BF91AF91A1 +:103380009F918F917F916F915F914F913F912F917D +:103390000F900FBE0F901F9018951F93CF93DF9340 +:1033A000CDB7DEB7AA970FB6F894DEBF0FBECDBF7C +:1033B000EFE5F4E088E08E0F9091F10091938E1389 +:1033C000FBCF0E944B158091E80083FF1FC18091C5 +:1033D0005F0490916004492F50E04A30510508F095 +:1033E00015C1FA01EC59FF4F0C94E331803881F09C +:1033F000823809F00BC1809163048F708093E900DB +:103400008091EB0085FB882780F91092E90006C0C7 +:1034100080915B0490915C04911182609091E8002E +:10342000977F9093E8008093F1001092F100C8C05C +:10343000282F2D7F09F0EAC0882319F0823061F02F +:10344000E5C080916104813009F0E0C0933009F05B +:1034500080E080935C042BC080916104811127C0BF +:10346000809163048F7009F4D1C08093E9002091AA +:10347000EB0020FF1CC0933021F48091EB008062B0 +:1034800014C09091EB0090619093EB0021E030E04C +:10349000A90102C0440F551F8A95E2F74093EA0044 +:1034A0001092EA008091EB0088608093EB0010920C +:1034B000E9008091E800877F86C08111A7C0109144 +:1034C00061041F778091E3008078812B8093E30073 +:1034D0008091E800877F8093E8000E94EB1780913D +:1034E000E80080FFFCCF8091E30080688093E300D8 +:1034F000111102C082E001C083E080935E0486C0A7 +:103500008058823008F082C08091610490916204FA +:103510008C3D53E0950779F583E08A838AE28983BD +:103520004FB7F894DE01139620E03EE051E2E32F1E +:10353000F0E050935700E49120FF03C0E295EF7054 +:103540003F5FEF708E2F90E0EA3010F0C79601C019 +:10355000C0968D939D932F5F243149F74FBF809183 +:10356000E800877F8093E8006AE270E0CE01019670 +:103570000E94F21614C0AE014F5F5F4F609163046A +:103580000E943916BC01009709F440C09091E800F0 +:10359000977F9093E80089819A810E9455178091C6 +:1035A000E8008B778093E80031C0803879F580910E +:1035B000E800877F8093E80080915A048093F100AF +:1035C0008091E8008E778093E8000E94EB171EC080 +:1035D00081111CC0909161049230C0F48091E80088 +:1035E000877F8093E80090935A040E94EB178091A4 +:1035F0005A04811106C08091E30087FD02C081E07A +:1036000001C084E080935E040E9437158091E80039 +:1036100083FF0AC08091E800877F8093E800809153 +:10362000EB0080628093EB00AA960FB6F894DEBFA1 +:103630000FBECDBFDF91CF911F9108950895CF9315 +:1036400080915E048823A1F0C091E900CF70909131 +:10365000EC00892F817090FD80E8C82B1092E90062 +:103660008091E80083FD0E94CD19CF70C093E900DE +:10367000CF9108959093DF038093DE030895E09146 +:10368000DE03F091DF03309721F00190F081E02D0F +:10369000099480E00895E091DE03F091DF03309714 +:1036A00021F00280F381E02D09940895E091DE037A +:1036B000F091DF03309721F00480F581E02D09942B +:1036C00008952091DC033091DD038217930771F098 +:1036D0009093DD038093DC03E091DE03F091DF0340 +:1036E000309721F00680F781E02D0994089520910C +:1036F000DA033091DB038217930771F09093DB03B9 +:103700008093DA03E091DE03F091DF03309721F03C +:103710000084F185E02D0994089508950C948D1B83 +:103720000E9415280E94760B0E949B280C94562D0F +:103730004F925F927F928F929F92AF92BF92CF9261 +:10374000DF92EF92FF920F931F93CF93DF93CDB74A +:10375000DEB72A970FB6F894DEBF0FBECDBF0E942A +:10376000650C91EEC92E93E0D92E00E010E0AA245A +:10377000A394B12C702E802F0E94AE0D4C01F60147 +:10378000419051906F014826592641145104B1F4DB +:103790000F5F1F4F0430110569F78FEF89838A830C +:1037A0001B820E941E288160782F9D838C83498113 +:1037B0005A816B818D810E94511C3AC080913D04D9 +:1037C00081FD0E94B70D20E030E07501022E02C09D +:1037D000EE0CFF1C0A94E2F7C70184219521892B86 +:1037E00009F12E837F828E209F2091E0892809F4A1 +:1037F00090E098870E941E288160782F9A87898799 +:103800004E815F8168858A850E94511C000F111FBF +:10381000F801EF51FC4F80819181E826F926F18271 +:10382000E08206C02F5F3F4F2C30310571F6B0CFDC +:103830000E94872A1091E0030E943F1B1817D9F0BD +:103840000E943F1B8093E0032A960FB6F894DEBFD8 +:103850000FBECDBFDF91CF911F910F91FF90EF90E1 +:10386000DF90CF90BF90AF909F908F907F905F90B0 +:103870004F900C94AE0A2A960FB6F894DEBF0FBE96 +:10388000CDBFDF91CF911F910F91FF90EF90DF900F +:10389000CF90BF90AF909F908F907F905F904F9010 +:1038A0000895CF93DF93CDB7DEB72B970FB6F8947B +:1038B000DEBF0FBECDBF4F83588769877A878B875E +:1038C000DE01119686E0FD0111928A95E9F785E007 +:1038D000FE01379601900D928A95E1F749815A8150 +:1038E0006B817C818D819E810E94F6232B960FB681 +:1038F000F894DEBF0FBECDBFDF91CF910895CF9377 +:10390000882309F4C2C0C82F823859F40E943F1B93 +:1039100081FDBBC089E30E949F260E946C2789E33A +:103920000CC0833879F40E943F1B80FDAEC083E554 +:103930000E949F260E946C2783E50E94E126CF917A +:103940000C946C27843859F40E943F1B82FD9DC063 +:1039500087E40E949F260E946C2787E4EECF8CEFBD +:103960008C0F813A48F48C2F0E94BE2C81118DC09F +:103970008C2F0E949F26E3CF80E28C0F883048F482 +:10398000C77081E001C0880FCA95EAF70E94252719 +:10399000D6CF8BE58C0F833078F4C53A29F0C63A40 +:1039A00031F083E890E005C081E890E002C082E851 +:1039B00090E0CF910C94611B88E58C0F833108F067 +:1039C00064C0C83A39F1C93A41F1CA3A49F1CB3A2F +:1039D00051F1CC3A59F1CD3A61F1C03B69F1CE3A9F +:1039E00071F1CF3A79F1C13B81F1C23B89F1C33B1F +:1039F00091F1C43B99F1C53BA1F1C63BA9F1C73B8D +:103A0000B1F1C83BB9F1C93BC1F1CA3BC9F180E092 +:103A100090E038C082EE90E035C089EE90E032C090 +:103A20008AEE90E02FC085EB90E02CC086EB90E012 +:103A300029C087EB90E026C08CEC90E023C08DEC91 +:103A400090E020C083E891E01DC08AE891E01AC0B0 +:103A500082E991E017C084E991E014C081E292E02C +:103A600011C083E292E00EC084E292E00BC085E2D6 +:103A700092E008C086E292E005C087E292E002C0D0 +:103A80008AE292E0CF910C94771BCF91089588231E +:103A900009F44BC0823859F40E943F1B81FF45C096 +:103AA00089E30E949F260E946C2789E30CC083381B +:103AB00071F40E943F1B80FF38C083E50E949F265F +:103AC0000E946C2783E50E94E1260C946C278438C1 +:103AD00059F40E943F1B82FF28C087E40E949F2662 +:103AE0000E946C2787E4EFCF9CEF980F913A58F330 +:103AF00090E2980F983050F4877091E001C0990FD0 +:103B00008A95EAF7892F0E942B27DFCF9BE5980F34 +:103B1000933020F480E090E00C94611B885A83314C +:103B200020F480E090E00C94771B0895882321F026 +:103B30000E9425270C946C270895882321F00E9469 +:103B40002B270C946C270895BF92CF92DF92EF92AF +:103B5000FF920F931F93CF93DF9300D000D000D03C +:103B6000CDB7DEB725E0FC01DE01119601900D9284 +:103B70002A95E1F7FC01D0801181028125812295EF +:103B80002F7043815481452B09F472C31F3F21F4E8 +:103B9000FFEFDF1609F46CC37C012E830E947707C8 +:103BA000D9821A8369817A81802F0E949B26182FDF +:103BB000B92E0E9450260E9417252E81002319F04D +:103BC0000E9442272E81EB2DE295EF70F0E0E25942 +:103BD000FF4F0C94E3318B2D807F9B2D9F70F92E2E +:103BE000882319F0F29480EFF822002389F0FF2057 +:103BF00009F47CC280E2810F883020F48F2D0E946E +:103C0000252703C08F2D0E9435270E946C276EC286 +:103C1000812F0E94471DFF2009F42AC3105E8F2DBB +:103C2000183018F40E942B2702C00E943B272696CA +:103C30000FB6F894DEBF0FBECDBFDF91CF911F91BD +:103C40000F91FF90EF90DF90CF90BF900C946C2776 +:103C50008B2D807F9B2D9F70803211F4892F03C0A4 +:103C6000892F8295807F112319F0113011F12BC01B +:103C70000023A9F0222389F1213079F526960FB689 +:103C8000F894DEBF0FBECDBFDF91CF911F910F9192 +:103C9000FF90EF90DF90CF90BF900C945527222398 +:103CA00019F0213009F4E4C28E830E9458278E81D6 +:103CB0009BC1002321F0263008F0DAC20EC0253067 +:103CC00008F0D6C291C10023C9F0222331F0F701D8 +:103CD000958190FF0BC29F70958326960FB6F8943E +:103CE000DEBF0FBECDBFDF91CF911F910F91FF902F +:103CF000EF90DF90CF90BF900C94961D222309F493 +:103D000073C109C22B2D26952695237030E021150D +:103D1000310521F021303105D1F0AAC2002321F074 +:103D2000812F9B2D937002C080E090E026960FB605 +:103D3000F894DEBF0FBECDBFDF91CF911F910F91E1 +:103D4000FF90EF90DF90CF90BF900C94611B002309 +:103D500021F0812F9B2D937002C080E090E0269689 +:103D60000FB6F894DEBF0FBECDBFDF91CF911F918C +:103D70000F91FF90EF90DF90CF90BF900C94771B46 +:103D8000812F002319F00E948F2902C00E94F72979 +:103D900026960FB6F894DEBF0FBECDBFDF91CF9150 +:103DA0001F910F91FF90EF90DF90CF90BF900C94F8 +:103DB0007C2A8B2D837009F07BC0011159C2812FA1 +:103DC000829586958770880F880F912F9F70C92ED6 +:103DD000D12CE12CF12C082E04C0CC0CDD1CEE1CE7 +:103DE000FF1C0A94D2F714FF12C04FE050E060E0CD +:103DF00070E004C0440F551F661F771F8A95D2F7E5 +:103E0000CB01BA01609570958095909503C060E0F4 +:103E100070E0CB012B2D269526952370422F50E084 +:103E200042305105D9F04330510569F16C297D29A3 +:103E30008E299F294130510551F126960FB6F894ED +:103E4000DEBF0FBECDBFDF91CF911F910F91FF90CD +:103E5000EF90DF90CF90BF900C943E256C297D2988 +:103E60008E299F2926960FB6F894DEBF0FBECDBFD0 +:103E7000DF91CF911F910F91FF90EF90DF90CF9046 +:103E8000BF900C945A250E943E25C701B601269684 +:103E90000FB6F894DEBF0FBECDBFDF91CF911F915B +:103EA0000F91FF90EF90DF90CF90BF900C94222560 +:103EB000002319F08B2D817001C08695882309F4A9 +:103EC000D7C1812F829586958770880F880F912F93 +:103ED0009F70C92ED12CE12CF12C082E04C0CC0CE3 +:103EE000DD1CEE1CFF1C0A94D2F714FF12C04FE039 +:103EF00050E060E070E004C0440F551F661F771F5C +:103F00008A95D2F7CB01BA0160957095809590950E +:103F100003C060E070E0CB012B2D26952695237021 +:103F2000422F50E042305105D9F04330510569F13C +:103F30006C297D298E299F294130510551F1269602 +:103F40000FB6F894DEBF0FBECDBFDF91CF911F91AA +:103F50000F91FF90EF90DF90CF90BF900C941826B8 +:103F60006C297D298E299F2926960FB6F894DEBFED +:103F70000FBECDBFDF91CF911F910F91FF90EF90BA +:103F8000DF90CF90BF900C9434260E941826C70172 +:103F9000B60126960FB6F894DEBF0FBECDBFDF91F7 +:103FA000CF911F910F91FF90EF90DF90CF90BF9036 +:103FB0000C94FC25103F49F118F4103E48F491C0D0 +:103FC000123F09F453C0E8F1133F09F464C089C0FB +:103FD0001F708B2D8F71002321F00E949525812F5A +:103FE0007CCE0E94B625812F26960FB6F894DEBFB0 +:103FF0000FBECDBFDF91CF911F910F91FF90EF903A +:10400000DF90CF90BF900C949D1D0023B1F0253020 +:1040100008F02EC18B2D8F7126960FB6F894DEBF57 +:104020000FBECDBFDF91CF911F910F91FF90EF9009 +:10403000DF90CF90BF900C94DB25263008F018C19C +:10404000E9CF0023A9F08B2D8F7126960FB6F89437 +:10405000DEBF0FBECDBFDF91CF911F910F91FF90BB +:10406000EF90DF90CF90BF900C949525002359F3EB +:104070008B2D8F7126960FB6F894DEBF0FBECDBF85 +:10408000DF91CF911F910F91FF90EF90DF90CF9034 +:10409000BF900C94B625002399F08B2D8F71269636 :1040A0000FB6F894DEBF0FBECDBFDF91CF911F9149 -:1040B0000F91FF90EF90DF90CF90BF900C9465250B -:1040C0000023A9F0222309F4ADCF812F26960FB645 -:1040D000F894DEBF0FBECDBFDF91CF911F910F913E -:1040E000FF90EF90DF90CF90BF900C946E1C222336 -:1040F00009F4ADCF812F26960FB6F894DEBF0FBE20 -:10410000CDBFDF91CF911F910F91FF90EF90DF9086 -:10411000CF90BF900C94361D4B2D4F70612FC7016F -:104120000E948D0526960FB6F894DEBF0FBECDBF58 -:10413000DF91CF911F910F91FF90EF90DF90CF9083 -:10414000BF900C948924011182C09B2D9F70492F30 -:1041500050E04230510509F443C0C4F44115510503 -:1041600071F14130510509F072C026960FB6F894EE -:10417000DEBF0FBECDBFDF91CF911F910F91FF909A -:10418000EF90DF90CF90BF900C946D2D4330510590 -:10419000C1F14430510509F05AC0812F26960FB65F -:1041A000F894DEBF0FBECDBFDF91CF911F910F916D -:1041B000FF90EF90DF90CF90BF900C94BF2D26968C +:1040B0000F91FF90EF90DF90CF90BF900C948025F0 +:1040C00026960FB6F894DEBF0FBECDBFDF91CF911D +:1040D0001F910F91FF90EF90DF90CF90BF900C94C5 +:1040E00076250023A9F0222309F4ADCF812F26964F +:1040F0000FB6F894DEBF0FBECDBFDF91CF911F91F9 +:104100000F91FF90EF90DF90CF90BF900C947F1CA9 +:10411000222309F4ADCF812F26960FB6F894DEBF87 +:104120000FBECDBFDF91CF911F910F91FF90EF9008 +:10413000DF90CF90BF900C94471D4B2D4F70612F97 +:10414000C7010E94690526960FB6F894DEBF0FBE20 +:10415000CDBFDF91CF911F910F91FF90EF90DF9036 +:10416000CF90BF900C949A24011182C09B2D9F7018 +:10417000492F50E04230510509F443C0C4F44115C1 +:10418000510571F14130510509F072C026960FB604 +:10419000F894DEBF0FBECDBFDF91CF911F910F917D +:1041A000FF90EF90DF90CF90BF900C947E2D433026 +:1041B0005105C1F14430510509F05AC0812F2696AE :1041C0000FB6F894DEBF0FBECDBFDF91CF911F9128 -:1041D0000F91FF90EF90DF90CF90BF900C94562DF1 +:1041D0000F91FF90EF90DF90CF90BF900C94D02D77 :1041E00026960FB6F894DEBF0FBECDBFDF91CF91FC :1041F0001F910F91FF90EF90DF90CF90BF900C94A4 -:10420000892D26960FB6F894DEBF0FBECDBFDF9185 +:10420000672D26960FB6F894DEBF0FBECDBFDF91A7 :10421000CF911F910F91FF90EF90DF90CF90BF90C3 -:104220000C949C2D4B2D4F70612FC70126960FB615 -:10423000F894DEBF0FBECDBFDF91CF911F910F91DC -:10424000FF90EF90DF90CF90BF900C949D07269643 +:104220000C949A2D26960FB6F894DEBF0FBECDBF24 +:10423000DF91CF911F910F91FF90EF90DF90CF9082 +:10424000BF900C94AD2D4B2D4F70612FC70126965A :104250000FB6F894DEBF0FBECDBFDF91CF911F9197 -:104260000F91FF90EF90DF90CF90BF9008950E9444 -:1042700031270E9441270E9406270E945B270E9447 -:104280001C2B0E946B2A80E090E00E94501B80E073 -:1042900090E00C94661B0E9421270C9437210E9409 -:1042A0007F26292F22952F7030E02C3031054CF4D9 -:1042B0002A3031056CF4225031092230310588F45E -:1042C00007C02C30310549F02F30310531F009C0DD -:1042D000803E48F0803F29F406C093FB882780F990 -:1042E000089580E0089581E00895CF93DF9300D092 -:1042F00000D01F92CDB7DEB70F900F900F900F90A8 -:104300000F90DF91CF910895CF93DF9300D000D02D -:1043100000D0CDB7DEB726960FB6F894DEBF0FBE3D -:10432000CDBFDF91CF9108951F93CF93DF93C091BD -:10433000990316E080919A03C81799F0D0E01C9F6A -:10434000F0011D9FF00D1124E556FC4F4081518175 -:1043500062817381848195810E9484212196C77036 -:10436000E9CFDF91CF911F9108954091CB035091F8 -:10437000CC036091CD037091CE038091CF039091D7 -:10438000D0030C9484218091D00382958F7009F022 -:1043900054C08091CD03882309F44FC080919903C4 -:1043A000A0919A036091CB037091CC034091CE030E -:1043B0005091CF03B6E08A1709F43FC090E0411551 -:1043C0005105C1F17F3F11F46F3FA1F1B89FF0019A -:1043D000B99FF00D1124E556FC4F218172132AC0BC -:1043E0002081621327C02281211124C023813481BE -:1043F0002417350710F421503109241B350B283CB4 -:104400003105C0F42091D0032F7020612093D00398 -:1044100026E0289FF001299FF00D1124E056FC4F63 -:1044200080818F70806180838BEC93E00E94931D6C -:104430000C94942101968770BECF0895CF92DF929D -:10444000EF92FF920F931F93CF93DF93CDB7DEB719 -:1044500062970FB6F894DEBF0FBECDBF8C0185E02A -:10446000F801DE011D9601900D928A95E1F7D801C1 -:104470004C9111965C91119712966C91129713962C -:10448000CD90DC9014973091CB037091CC03809148 -:10449000CE039091CF03009709F46BC17F3F19F4CD -:1044A0003F3F09F466C1E090CD03EE2009F4C0C09F -:1044B0002091D003C816D90628F0F601E81BF90BA5 -:1044C000CF0104C0809590958C0D9D1DFF24F39421 -:1044D000883C910578F0F12C207F09F0C6C07C2D36 -:1044E000D98AC88A89890E9475218BEC93E00E9441 -:1044F000931DB1C0822F807F09F046C0751314C090 -:10450000341312C0611110C02F7020612093D003AA -:104510000E94B5218BEC93E00E94931D8091D00303 -:10452000D80115968C932EC0CD2819F15F3F11F458 -:104530004F3FF9F0F62E61111CC080919903209134 -:104540009A0336E0821709F45AC090E0389FF001D0 -:10455000399FF00D1124E556FC4F7181571306C0A9 -:104560007081471303C07281711103C00196877077 -:10457000E9CFF62E662309F418C18091D00381603B -:104580008093D003F12C11C1751308C0341306C0F9 -:10459000611104C08091D003D801C3C04D875E87EC -:1045A0008D859E856A8B0E944F216A898823E1F15F -:1045B0006623D1F12091D003822F82958F7090E0F5 -:1045C000029774F08091CB039091CC0398878F83EE -:1045D0001986DB86CA862C87CE0107960E94931D1A -:1045E00086E0F801ABECB3E001900D928A95E1F71B -:1045F0000E94C3210E94B521FF24F394D6C04D87A9 -:104600005E878D859E850E947F26292F22952F709B -:1046100030E0223031050CF0BCC09F7009F0B6C00C -:10462000805E883008F4C1C0C8010E94931DE4CFA9 -:10463000C816D90608F453C0F601E81BF90BCF01E0 -:10464000883C910508F450C0F12C7C2DD98AC88A89 -:1046500089890E947521EBECF3E086E0DF011D9271 -:104660008A95E9F70E94B521A0C0751314C03413D0 -:1046700012C0611110C08091D003F8018583C80178 -:104680000E94931D86E0EBECF3E0DF011D928A951A -:10469000E9F7FE2C8AC04D875E878D859E856A8BE3 -:1046A0000E944F216A89882309F4BECF662309F44A -:1046B000BBCF2091D003822F82958F7090E002971C -:1046C0000CF48ECF8091CB039091CC039A83898395 -:1046D0001B82DD82CC822E83CE0101967FCF809516 -:1046E00090958C0D9D1DACCFF62E662309F49CCFC2 -:1046F00075132EC034132CC02091D00320FD1FC091 -:10470000822F82958F70D9F0D80115962C9315972A -:104710008F3049F08F5F982F9295907F822F8F7006 -:10472000892B15968C93C8010E94931D86E0F80191 -:10473000ABECB3E001900D928A95E1F793CF86E060 -:10474000F801ABECB3E001900D928A95E1F72DC032 -:104750004D875E878D859E850E944F21811140CFB8 -:104760008091D00381608093D003C8010E94931D83 -:104770001CC0662309F458CF4D875E878D859E85C2 -:104780000E944F21882309F44FCF2ACF811148CFAF -:104790000CC0243031050CF047CF9F7009F440CF96 -:1047A000F8019581907F09F03BCF8F2D62960FB66F -:1047B000F894DEBF0FBECDBFDF91CF911F910F9157 -:1047C000FF90EF90DF90CF9008951F93CF93DF93EA -:1047D000CDB7DEB72C970FB6F894DEBF0FBECDBFB6 -:1047E0004F83588769877A878B879C87CE01079686 -:1047F0000E941E22882369F08F8198852A853B8537 -:10480000232BF1F19F3F09F063C08F3F09F060C097 -:1048100037C086E0FE013796DE01119601900D92B9 -:104820008A95E1F76F817885EA85FB85309741F1BC -:104830007F3F11F46F3F21F120919A0330E0C901CD -:104840000196877099274091990350E08417950746 -:1048500009F447C069837A83FD83EC8396E0929FD5 -:10486000D001939FB00D1124A556BC4FFE01319687 -:1048700001900D929A95E1F780939A030E949421FA -:1048800016E08091990390919A038917C1F1189FBE -:10489000C001112485569C4F0E941E22882379F165 -:1048A000E09199031E9FF0011124E556FC4F4081D1 -:1048B000518162817381848195810E9484218091DC -:1048C000990390E001968770992780939903D9CF37 -:1048D0004F81588569857A858B859C850E948421C6 -:1048E000CFCF0E944B2110929A0310929903EBECC8 -:1048F000F3E086E0DF011D928A95E9F7C1CF2C969F -:104900000FB6F894DEBF0FBECDBFDF91CF911F91E0 -:104910000895EF92FF920F931F93CF93DF938C0133 -:10492000009709F46CC0F12CEE24E394E801219681 -:10493000F8018491843740F4843008F051C081300C -:1049400081F0823019F15BC0853709F444C0A8F1C9 -:104950009CE7980F903708F052C08F770E94361D61 -:1049600041C00E5F1F4FFE01C49180E28C0F883062 -:1049700048F4C7708E2D01C0880FCA95EAF70E94CF -:10498000342714C08C2F0E946E1C2DC00E5F1F4F49 -:10499000FE01C49180E28C0F883058F4C7708E2DD0 -:1049A00001C0880FCA95EAF70E943A270E945B2748 -:1049B0001AC08C2F0E94361D16C00E5F1F4FFE01BD -:1049C000C491CC2381F08FE99FE00197F1F700C0FB -:1049D0000000C150F6CF0E5F1F4FFE01F49003C0E0 -:1049E0000E946E1C8E018F2D882309F49FCFEFE962 -:1049F000FFE03197F1F700C000008150F5CFDF9163 -:104A0000CF911F910F91FF90EF90089508956093BB -:104A1000D5037093D6038093D7039093D8030C9457 -:104A200037210F931F930091D5031091D603209146 -:104A3000D7033091D803DC01CB01802B912BA22B23 -:104A4000B32B8093D5039093D603A093D703B09351 -:104A5000D8031F910F910C9437210F931F9300914E -:104A6000D5031091D6032091D7033091D803DC01F0 -:104A7000CB0180239123A223B3238093D50390936A -:104A8000D603A093D703B093D8031F910F910C9432 -:104A900037210F931F930091D5031091D6032091D6 -:104AA000D7033091D803DC01CB0180279127A227BF -:104AB000B3278093D5039093D603A093D703B093E5 -:104AC000D8031F910F910C9437211092D1031092AB -:104AD000D2031092D3031092D4030C94372141E0F7 -:104AE00050E060E070E004C0440F551F661F771F60 -:104AF0008A95D2F74093D1035093D2036093D303A6 -:104B00007093D4030C94372141E050E060E070E0F2 -:104B100004C0440F551F661F771F8A95D2F78091F6 -:104B2000D1039091D203A091D303B091D403482B29 -:104B3000592B6A2B7B2B4093D1035093D203609364 -:104B4000D3037093D4030C94372141E050E060E02C -:104B500070E004C0440F551F661F771F8A95D2F777 -:104B600040955095609570958091D1039091D203B6 -:104B7000A091D303B091D403482359236A237B2304 -:104B80004093D1035093D2036093D3037093D40323 -:104B90000C94372141E050E060E070E004C0440F25 -:104BA000551F661F771F8A95D2F78091D103909188 -:104BB000D203A091D303B091D403482759276A2781 -:104BC0007B274093D1035093D2036093D303709318 -:104BD000D4030C9437210F931F930091D1031091AC -:104BE000D2032091D3033091D403DC01CB01802B7D -:104BF000912BA22BB32B8093D1039093D203A0933C -:104C0000D303B093D4031F910F910C9437210F93CA -:104C10001F930091D1031091D2032091D3033091BF -:104C2000D403DC01CB0180239123A223B3238093FF -:104C3000D1039093D203A093D303B093D4031F91D5 -:104C40000F910C9437210F931F930091D103109172 -:104C5000D2032091D3033091D403DC01CB01802710 -:104C60009127A227B3278093D1039093D203A093D7 -:104C7000D303B093D4031F910F910C94372108955F -:104C8000CF92DF92EF92FF920F931F93CF93DF9318 -:104C90008C01C090D503D090D603E090D703F0905C -:104CA000D8038091D1039091D203A091D303B09106 -:104CB000D403C82AD92AEA2AFB2ACFE1D0E0D701B7 -:104CC000C6010C2E04C0B695A795979587950A94B2 -:104CD000D2F780FF06C0B8018C2F0E94F709019718 -:104CE00021F4219760F780E001C08C2FDF91CF91F4 -:104CF0001F910F91FF90EF90DF90CF900895CF9389 -:104D0000DF93EC010E944026BE010E94F709DF916B -:104D1000CF910895CB010E947F260895909186023D -:104D2000992321F090918702911109C02091880266 -:104D300030918902F90132969FEF40E01FC0982F11 -:104D40009695969596959F3050F5E0918802F09152 -:104D50008902E90FF11D877021E030E0A90102C04E -:104D6000440F551F8A95E2F7CA019181892B8183EF -:104D700008959F3F39F04F5F4E3041F051915813E5 -:104D8000F8CF0DC05111F7CF942FF5CF9F3F39F0D9 -:104D9000F901E90FF11D97FDFA95828308950895B1 -:104DA00090918602992321F090918702911109C078 -:104DB0002091880230918902F9013296205F3F4F9D -:104DC0001FC0982F9695969596959F30F0F4E09198 -:104DD0008802F0918902E90FF11D877021E030E02F -:104DE000A90102C0440F551F8A95E2F7CA018095B8 -:104DF00091818923818308953196E217F30729F081 -:104E000090819813F9CF1082F7CF089581E090E058 -:104E1000E0918802F0918902E80FF91F1082019653 -:104E200080319105A9F708959091EC03892B809327 -:104E3000EC03089580959091EC0389238093EC0313 -:104E400008951092EC0308959091EB03892B8093C1 -:104E5000EB03089580959091EB0389238093EB03F6 -:104E600008951092EB0308959091EA03892B8093A3 -:104E7000EA03089580959091EA0389238093EA03D9 -:104E800008951092EA0308958093D903089510922B -:104E9000D90308958091880290918902FC0131968E -:104EA0009C01205F3F4F80E0919191118F5FE2174D -:104EB000F307D1F70895E0918802F091890280917B -:104EC000EC038083E0918802F091890290818091C7 -:104ED000EB03892B8083E0918802F0918902908115 -:104EE0008091EA03892B80838091D903882361F024 -:104EF000E0918802F09189029081892B80830E9441 -:104F00004A2781111092D9038091880290918902D9 -:104F10000C943A1B80910E04843039F11092EE0308 -:104F200020E488E190E00FB6F894A89580936000A3 -:104F30000FBE2093600080E00E94540580E00E9434 -:104F4000D20A83B7817F846083BF83B7816083BFC8 -:104F50007894889583B78E7F83BF88E10FB6F894E5 -:104F600080936000109260000FBE08950895089528 -:104F7000CF9380E00E9454050E94B6270E94890CBE -:104F80000E94B727C0E08C2F0E94D20D892B29F4F4 -:104F9000CF5FC430C1F780E001C081E0CF910895B8 -:104FA0000E944B2180E00E9454050E94452D0E94E2 -:104FB0002E1B0C94D20A1F920F920FB60F9211243F -:104FC0008F939F93AF93BF938091EE03811113C092 -:104FD0008091EF039091F003A091F103B091F2035F -:104FE0004196A11DB11D8093EF039093F003A09310 -:104FF000F103B093F203BF91AF919F918F910F9006 -:105000000FBE0F901F90189582E084BD93E095BD70 -:105010009AEF97BD80936E0008952FB7F894809112 -:10502000EF039091F003A091F103B091F2032FBF31 -:105030000895CF92DF92EF92FF920F931F932FB7B5 -:10504000F8944091EF035091F0036091F103709157 -:10505000F2032FBF6A017B01EE24FF248C0120E0C4 -:1050600030E0C016D106E206F30610F441505109B3 -:105070009A01281B390BC9011F910F91FF90EF90E6 -:10508000DF90CF9008951F920F920FB60F921124C8 -:105090008F939F93AF93BF938091EF039091F00311 -:1050A000A091F103B091F2030196A11DB11D80936F -:1050B000EF039093F003A093F103B093F203BF9139 -:1050C000AF919F918F910F900FBE0F901F901895E9 -:1050D0000E942B18F8942FEF87EA91E62150804028 -:1050E0009040E1F700C0000087E090EBDC01809386 -:1050F000190490931A04A0931B04B0931C049CE021 -:1051000088E10FB6F894A895809360000FBE909345 -:105110006000FFCF0E94C928811102C00E94A5280B -:105120000E94D4288093ED030E94E1288093170405 -:1051300087FB882780F9809387020E94D828682FF0 -:1051400070E080E090E00C9407256DEE7EEF80E04B -:1051500090E00E94AA3160E082E090E00E949831E5 -:1051600060E083E090E00E94983160E084E090E0AD -:105170000E94983160E085E090E00E94983160E004 -:1051800086E090E00E9498316FEF87E090E00C9409 -:10519000983180E090E00E94923121E08D3E9E4F58 -:1051A00009F020E0822F089582E090E00C948A318B -:1051B00083E090E00C948A31682F83E090E00C94B7 -:1051C000983184E090E00C948A31682F84E090E07C -:1051D0000C94983186E090E00C948A31682F86E038 -:1051E00090E00C94983187E090E00C948A31682F1D -:1051F00087E090E00C9498318091F50380FF0BC01C -:1052000060918D0285E0689FB001112475956795C6 -:10521000759567952BC081FF09C060918D0285E06F -:10522000689FB00111247595679520C082FF07C063 -:1052300060918D0285E0689FB001112417C09091A4 -:10524000F6039923D1F060918C02961788F720918C -:105250008D0285E0289F90011124929FA001939FC9 -:10526000500D112470E0CA010E9470316038710540 -:1052700040F46115710539F002C065E070E0862FD9 -:1052800008958FE7089581E008958091F50380FFE8 -:1052900008C060918B0270E075956795759567956C -:1052A00021C081FF06C060918B0270E07595679503 -:1052B00019C082FF04C060918B0270E010C0909111 -:1052C000F6039923C1F060918A029617A0F78091A6 -:1052D0008B02899FC001112470E00E9470316038F8 -:1052E000710528F46115710521F0862F08958FE767 -:1052F000089581E0089561E070E0F4CF803F21F4EB -:105300000E94FC28819504C0813F29F40E94FC285A -:105310008093F9030895823F21F40E94FC2881952F -:1053200004C0833F29F40E94FC288093F803089569 -:10533000893F19F40E94452905C08A3F31F40E9433 -:10534000452981958093FA0308958B3F21F40E94AB -:105350004529819504C08C3F29F40E9445298093FA -:10536000FB030895843F21F48091F703816017C007 -:10537000853F21F48091F703826011C0863F21F4BC -:105380008091F70384600BC0873F21F48091F7037D -:10539000886005C0883F31F48091F7038061809375 -:1053A000F70308958D3F21F48091F50381600BC0D0 -:1053B0008E3F21F48091F503826005C08F3F29F470 -:1053C0008091F50384608093F5030895803F39F45C -:1053D0008091F90387FF6CC01092F90369C0813F87 -:1053E00029F48091F9031816BCF362C09091F80378 -:1053F000823F29F497FF5CC01092F80359C0833FA5 -:1054000019F41916CCF354C0893F41F48091FA0382 -:1054100018160CF04DC01092FA034AC08A3F29F4C6 -:105420008091FA0387FF44C0F6CF8B3F39F4809117 -:10543000FB0387FF3DC01092FB033AC08C3F29F469 -:105440008091FB031816BCF333C0843F21F4809194 -:10545000F7038E7F17C0853F21F48091F7038D7F7E -:1054600011C0863F21F48091F7038B7F0BC0873FEB -:1054700021F48091F703877F05C0883F31F4809144 -:10548000F7038F7E8093F70313C08D3F21F4809143 -:10549000F5038E7F0BC08E3F21F48091F5038D7F45 -:1054A00005C08F3F29F48091F5038B7F8093F5032E -:1054B0008091F80381110EC08091F90381110AC017 -:1054C0008091FA03811106C08091FB03811102C013 -:1054D0001092F603089587EF93E00E94451B0E9407 -:1054E0000D289093F4038093F30308951F93CF93B3 -:1054F000DF938091F3039091F4030E941928AC018B -:105500009091F603992321F020918E0230E006C09D -:1055100020918F028AE0289F90011124421753079F -:1055200008F486C08091F803C091F903D091FA0382 -:105530001091FB03811107C0C11176C0D11174C055 -:10554000111172C075C09F3F19F09F5F9093F603D1 -:10555000181624F40E94FC288093F8038091F80325 -:1055600087FF05C00E94FC2881958093F8031C16D4 -:1055700024F40E94FC288093F9038091F90387FFAB -:1055800005C00E94FC2881958093F9036091F8037F -:10559000662339F1C091F903CC2319F1772767FD10 -:1055A0007095872F972F0E94E02E23E333E343E388 -:1055B0005FE30E94942F0E94AD2E6093F8036C2F3E -:1055C000772767FD7095872F972F0E94E02E23E3A2 -:1055D00033E343E35FE30E94942F0E94AD2E609378 -:1055E000F9031D1624F40E9445298093FA03809143 -:1055F000FA0387FF05C00E94452981958093FA032D -:10560000111624F40E9445298093FB038091FB032B -:1056100087FF05C00E94452981958093FB03DF9198 -:10562000CF911F910C946B2A9F3F09F08ECF96CF9C -:10563000DF91CF911F910895E7EFF3E085E0DF015F -:105640001D928A95E9F71092F6031092F5030895DA -:10565000833081F128F4813059F08230D1F00895FF -:10566000853009F449C0B8F1863009F456C0089570 -:1056700080918F02262F30E0280F311D2F3F3105FA -:1056800024F4680F60938F0208958FEF80938F0248 -:10569000089580918E02262F30E0280F311D2F3F74 -:1056A000310524F4680F60938E0208958FEF809384 -:1056B0008E02089580918D02262F30E0280F311D33 -:1056C0002F3F310524F4680F60938D0208958FEF0A -:1056D00080938D02089580918C02262F30E0280F50 -:1056E000311D2F3F310524F4680F60938C0208951B -:1056F0008FEF80938C02089580918B02262F30E0EB -:10570000280F311D2F3F310524F4680F60938B0261 -:1057100008958FEF80938B02089580918A02262F3F +:104260000F91FF90EF90DF90CF90BF900C94790763 +:1042700026960FB6F894DEBF0FBECDBFDF91CF916B +:104280001F910F91FF90EF90DF90CF90BF90089516 +:104290000E9442270E9452270E9417270E946C27E3 +:1042A0000E942D2B0E947C2A80E090E00E94611BDE +:1042B00080E090E00C94771B0E9432270C944821F8 +:1042C0000E949026292F22952F7030E02C30310546 +:1042D0004CF42A3031056CF422503109223031057A +:1042E00088F407C02C30310549F02F30310531F00A +:1042F00009C0803E48F0803F29F406C093FB882720 +:1043000080F9089580E0089581E00895CF93DF93C8 +:1043100000D000D01F92CDB7DEB70F900F900F9056 +:104320000F900F90DF91CF910895CF93DF9300D03E +:1043300000D000D0CDB7DEB726960FB6F894DEBF1A +:104340000FBECDBFDF91CF9108951F93CF93DF9321 +:10435000C091E90316E08091EA03C81799F0D0E014 +:104360001C9FF0011D9FF00D1124E551FC4F408171 +:10437000518162817381848195810E94952121966A +:10438000C770E9CFDF91CF911F91089540911B0431 +:1043900050911C0460911D0470911E0480911F04B3 +:1043A000909120040C9495218091200482958F7027 +:1043B00009F054C080911D04882309F44FC08091F6 +:1043C000E903A091EA0360911B0470911C044091E1 +:1043D0001E0450911F04B6E08A1709F43FC090E014 +:1043E00041155105C1F17F3F11F46F3FA1F1B89F15 +:1043F000F001B99FF00D1124E551FC4F218172139A +:104400002AC02081621327C02281211124C0238168 +:1044100034812417350710F421503109241B350B42 +:10442000283C3105C0F4209120042F702061209396 +:10443000200426E0289FF001299FF00D1124E0516F +:10444000FC4F80818F70806180838BE194E00E94BB +:10445000A41D0C94A52101968770BECF0895CF921C +:10446000DF92EF92FF920F931F93CF93DF93CDB71D +:10447000DEB762970FB6F894DEBF0FBECDBF8C01DA +:1044800085E0F801DE011D9601900D928A95E1F715 +:10449000D8014C9111965C91119712966C911297DC +:1044A0001396CD90DC90149730911B0470911C04EE +:1044B00080911E0490911F04009709F46BC17F3F07 +:1044C00019F43F3F09F466C1E0901D04EE2009F4A1 +:1044D000C0C020912004C816D90628F0F601E81BB8 +:1044E000F90BCF0104C0809590958C0D9D1DFF2484 +:1044F000F394883C910578F0F12C207F09F0C6C038 +:104500007C2DD98AC88A89890E9486218BE194E012 +:104510000E94A41DB1C0822F807F09F046C0751390 +:1045200014C0341312C0611110C02F702061209389 +:1045300020040E94C6218BE194E00E94A41D80917A +:104540002004D80115968C932EC0CD2819F15F3F19 +:1045500011F44F3FF9F0F62E61111CC08091E90370 +:104560002091EA0336E0821709F45AC090E0389FA0 +:10457000F001399FF00D1124E551FC4F7181571363 +:1045800006C07081471303C07281711103C0019688 +:104590008770E9CFF62E662309F418C180912004B4 +:1045A000816080932004F12C11C1751308C034136D +:1045B00006C0611104C080912004D801C3C04D879A +:1045C0005E878D859E856A8B0E9460216A8988231B +:1045D000E1F16623D1F120912004822F82958F7022 +:1045E00090E0029774F080911B0490911C049887CE +:1045F0008F831986DB86CA862C87CE0107960E9498 +:10460000A41D86E0F801ABE1B4E001900D928A951B +:10461000E1F70E94D4210E94C621FF24F394D6C062 +:104620004D875E878D859E850E949026292F229535 +:104630002F7030E0223031050CF0BCC09F7009F0C3 +:10464000B6C0805E883008F4C1C0C8010E94A41DB5 +:10465000E4CFC816D90608F453C0F601E81BF90BDD +:10466000CF01883C910508F450C0F12C7C2DD98AEB +:10467000C88A89890E948621EBE1F4E086E0DF01A7 +:104680001D928A95E9F70E94C621A0C0751314C037 +:10469000341312C0611110C080912004F801858389 +:1046A000C8010E94A41D86E0EBE1F4E0DF011D9249 +:1046B0008A95E9F7FE2C8AC04D875E878D859E8599 +:1046C0006A8B0E9460216A89882309F4BECF662321 +:1046D00009F4BBCF20912004822F82958F7090E047 +:1046E00002970CF48ECF80911B0490911C049A8346 +:1046F00089831B82DD82CC822E83CE0101967FCFFF +:10470000809590958C0D9D1DACCFF62E662309F4F7 +:104710009CCF75132EC034132CC02091200420FD93 +:104720001FC0822F82958F70D9F0D80115962C93D7 +:1047300015978F3049F08F5F982F9295907F822F39 +:104740008F70892B15968C93C8010E94A41D86E05A +:10475000F801ABE1B4E001900D928A95E1F793CFB7 +:1047600086E0F801ABE1B4E001900D928A95E1F7A3 +:104770002DC04D875E878D859E850E9460218111A9 +:1047800040CF80912004816080932004C8010E9462 +:10479000A41D1CC0662309F458CF4D875E878D8504 +:1047A0009E850E946021882309F44FCF2ACF811172 +:1047B00048CF0CC0243031050CF047CF9F7009F46E +:1047C00040CFF8019581907F09F03BCF8F2D629605 +:1047D0000FB6F894DEBF0FBECDBFDF91CF911F9112 +:1047E0000F91FF90EF90DF90CF9008951F93CF939C +:1047F000DF93CDB7DEB72C970FB6F894DEBF0FBEB0 +:10480000CDBF4F83588769877A878B879C87CE0176 +:1048100007960E942F22882369F08F8198852A8528 +:104820003B85232BF1F19F3F09F063C08F3F09F0D7 +:1048300060C037C086E0FE013796DE011196019018 +:104840000D928A95E1F76F817885EA85FB8530972F +:1048500041F17F3F11F46F3F21F12091EA0330E0F5 +:10486000C9010196877099274091E90350E08417A8 +:10487000950709F447C069837A83FD83EC8396E04A +:10488000929FD001939FB00D1124A551BC4FFE0102 +:10489000319601900D929A95E1F78093EA030E9478 +:1048A000A52116E08091E9039091EA038917C1F1EF +:1048B000189FC001112485519C4F0E942F228823EC +:1048C00079F1E091E9031E9FF0011124E551FC4FBD +:1048D0004081518162817381848195810E949521FB +:1048E0008091E90390E00196877099278093E9030E +:1048F000D9CF4F81588569857A858B859C850E94A3 +:104900009521CFCF0E945C211092EA031092E90317 +:10491000EBE1F4E086E0DF011D928A95E9F7C1CF73 +:104920002C960FB6F894DEBF0FBECDBFDF91CF91AE +:104930001F910895EF92FF920F931F93CF93DF93F0 +:104940008C01009709F46CC0F12CEE24E394E8018B +:104950002196F8018491843740F4843008F051C0E6 +:10496000813081F0823019F15BC0853709F444C091 +:10497000A8F19CE7980F903708F052C08F770E94FB +:10498000471D41C00E5F1F4FFE01C49180E28C0F96 +:10499000883048F4C7708E2D01C0880FCA95EAF799 +:1049A0000E94452714C08C2F0E947F1C2DC00E5FD3 +:1049B0001F4FFE01C49180E28C0F883058F4C770FD +:1049C0008E2D01C0880FCA95EAF70E944B270E94DE +:1049D0006C271AC08C2F0E94471D16C00E5F1F4FF8 +:1049E000FE01C491CC2381F08FE99FE00197F1F79C +:1049F00000C00000C150F6CF0E5F1F4FFE01F490C3 +:104A000003C00E947F1C8E018F2D882309F49FCF45 +:104A1000EFE9FFE03197F1F700C000008150F5CFDA +:104A2000DF91CF911F910F91FF90EF90089508951E +:104A300060932504709326048093270490932804A0 +:104A40000C9448210F931F93009125041091260484 +:104A50002091270430912804DC01CB01802B912B7D +:104A6000A22BB32B8093250490932604A0932704B4 +:104A7000B09328041F910F910C9448210F931F931A +:104A800000912504109126042091270430912804D8 +:104A9000DC01CB0180239123A223B323809325043F +:104AA00090932604A0932704B09328041F910F919C +:104AB0000C9448210F931F93009125041091260414 +:104AC0002091270430912804DC01CB018027912715 +:104AD000A227B3278093250490932604A09327044C +:104AE000B09328041F910F910C9448211092210437 +:104AF0001092220410922304109224040C94482152 +:104B000041E050E060E070E004C0440F551F661FB4 +:104B1000771F8A95D2F74093210450932204609323 +:104B20002304709324040C94482141E050E060E099 +:104B300070E004C0440F551F661F771F8A95D2F797 +:104B40008091210490912204A0912304B091240427 +:104B5000482B592B6A2B7B2B409321045093220422 +:104B600060932304709324040C94482141E050E0A6 +:104B700060E070E004C0440F551F661F771F8A95E0 +:104B8000D2F7409550956095709580912104909151 +:104B90002204A0912304B0912404482359236A23BA +:104BA0007B23409321045093220460932304709349 +:104BB00024040C94482141E050E060E070E004C01F +:104BC000440F551F661F771F8A95D2F780912104E5 +:104BD00090912204A0912304B091240448275927DE +:104BE0006A277B2740932104509322046093230477 +:104BF000709324040C9448210F931F930091210477 +:104C0000109122042091230430912404DC01CB0173 +:104C1000802B912BA22BB32B809321049093220401 +:104C2000A0932304B09324041F910F910C94482166 +:104C30000F931F93009121041091220420912304CB +:104C400030912404DC01CB0180239123A223B323E0 +:104C50008093210490932204A0932304B09324040E +:104C60001F910F910C9448210F931F9300912104E1 +:104C7000109122042091230430912404DC01CB0103 +:104C800080279127A227B3278093210490932204A1 +:104C9000A0932304B09324041F910F910C944821F6 +:104CA0000895CF92DF92EF92FF920F931F93CF93CD +:104CB000DF938C01C0902504D0902604E090270457 +:104CC000F09028048091210490912204A091230463 +:104CD000B0912404C82AD92AEA2AFB2ACFE1D0E0DD +:104CE000D701C6010C2E04C0B695A7959795879558 +:104CF0000A94D2F780FF06C0B8018C2F0E94D30916 +:104D0000019721F4219760F780E001C08C2FDF919B +:104D1000CF911F910F91FF90EF90DF90CF9008956A +:104D2000CF93DF93EC010E945126BE010E94D3096C +:104D3000DF91CF910895CB010E9490260895909124 +:104D40008402992321F090918502911109C020914C +:104D5000860230918702F90132969FEF40E01FC032 +:104D6000982F9695969596959F3050F5E0918602EE +:104D7000F0918702E90FF11D877021E030E0A90171 +:104D800002C0440F551F8A95E2F7CA019181892B11 +:104D9000818308959F3F39F04F5F4E3041F051912C +:104DA0005813F8CF0DC05111F7CF942FF5CF9F3F77 +:104DB00039F0F901E90FF11D97FDFA958283089505 +:104DC000089590918402992321F090918502911188 +:104DD00009C02091860230918702F9013296205F46 +:104DE0003F4F1FC0982F9695969596959F30F0F45B +:104DF000E0918602F0918702E90FF11D877021E0B2 +:104E000030E0A90102C0440F551F8A95E2F7CA019C +:104E1000809591818923818308953196E217F30764 +:104E200029F090819813F9CF1082F7CF089581E08F +:104E300090E0E0918602F0918702E80FF91F10825E +:104E4000019680319105A9F7089590913C04892B32 +:104E500080933C040895809590913C04892380932D +:104E60003C04089510923C04089590913B04892BD2 +:104E700080933B040895809590913B04892380930F +:104E80003B04089510923B04089590913A04892BB5 +:104E900080933A040895809590913A0489238093F1 +:104EA0003A04089510923A040895809329040895CD +:104EB0001092290408958091860290918702FC0146 +:104EC00031969C01205F3F4F80E0919191118F5F5F +:104ED000E217F307D1F70895E0918602F091870277 +:104EE00080913C048083E0918602F091870290815A +:104EF00080913B04892B8083E0918602F0918702A8 +:104F0000908180913A04892B8083809129048823A1 +:104F100061F0E0918602F09187029081892B808375 +:104F20000E945B2781111092290480918602909142 +:104F300087020C944B1B80915E04843039F11092EF +:104F40003E0420E488E190E00FB6F894A8958093A1 +:104F500060000FBE2093600080E00E94300580E07A +:104F60000E94AE0A83B7817F846083BF83B781606C +:104F700083BF7894889583B78E7F83BF88E10FB60F +:104F8000F89480936000109260000FBE0895089519 +:104F90000895CF9380E00E9430050E94C7270E94A9 +:104FA000650C0E94C827C0E08C2F0E94AE0D892B93 +:104FB00029F4CF5FC430C1F780E001C081E0CF9118 +:104FC00008950E945C2180E00E9430050E94562DC9 +:104FD0000E943F1B0C94AE0A1F920F920FB60F92C5 +:104FE00011248F939F93AF93BF9380913E048111BF +:104FF00013C080913F0490914004A0914104B0916E +:1050000042044196A11DB11D80933F04909340043A +:10501000A0934104B0934204BF91AF919F918F91AF +:105020000F900FBE0F901F90189582E084BD93E003 +:1050300095BD9AEF97BD80936E0008952FB7F894B1 +:1050400080913F0490914004A0914104B0914204AA +:105050002FBF0895CF92DF92EF92FF920F931F938D +:105060002FB7F89440913F0450914004609141045F +:10507000709142042FBF6A017B01EE24FF248C0152 +:1050800020E030E0C016D106E206F30610F44150ED +:1050900051099A01281B390BC9011F910F91FF90EB +:1050A000EF90DF90CF9008951F920F920FB60F925E +:1050B00011248F939F93AF93BF9380913F0490915E +:1050C0004004A0914104B09142040196A11DB11D7C +:1050D00080933F0490934004A0934104B093420412 +:1050E000BF91AF919F918F910F900FBE0F901F9026 +:1050F00018950E943C18F8942FEF87EA91E621500A +:1051000080409040E1F700C0000087E090EBDC01B8 +:105110008093690490936A04A0936B04B0936C0429 +:105120009CE088E10FB6F894A895809360000FBECC +:1051300090936000FFCF0E94DA28811102C00E9484 +:10514000B6280E94E52880933D040E94F2288093AF +:10515000670487FB882780F9809385020E94E928ED +:10516000682F70E080E090E00C9418256DEE7EEFE3 +:1051700080E090E00E94093260E082E090E00E94CE +:10518000F73160E083E090E00E94F73160E084E076 +:1051900090E00E94F73160E085E090E00E94F731F6 +:1051A00060E086E090E00E94F7316FEF87E090E0EA +:1051B0000C94F73180E090E00E94F13121E08D3EC7 +:1051C0009E4F09F020E0822F089582E090E00C9439 +:1051D000E93183E090E00C94E931682F83E090E0BE +:1051E0000C94F73184E090E00C94E931682F84E06E +:1051F00090E00C94F73186E090E00C94E931682F50 +:1052000086E090E00C94F73187E090E00C94E9316F +:10521000682F87E090E00C94F7318091450480FF7F +:105220000BC060918B0285E0689FB00111247595D9 +:105230006795759567952BC081FF09C060918B02BA +:1052400085E0689FB00111247595679520C082FFA5 +:1052500007C060918B0285E0689FB001112417C0E0 +:10526000909146049923D1F060918A02961788F7AD +:1052700020918B0285E0289F90011124929FA0012C +:10528000939F500D112470E0CA010E94CF31603805 +:10529000710540F46115710539F002C065E070E0F8 +:1052A000862F08958FE7089581E008958091450441 +:1052B00080FF08C06091890270E0759567957595CB +:1052C000679521C081FF06C06091890270E07595E5 +:1052D000679519C082FF04C06091890270E010C018 +:1052E000909146049923C1F0609188029617A0F727 +:1052F00080918902899FC001112470E00E94CF3102 +:105300006038710528F46115710521F0862F089524 +:105310008FE7089581E0089561E070E0F4CF803F69 +:1053200021F40E940D29819504C0813F29F40E9437 +:105330000D29809349040895823F21F40E940D298C +:10534000819504C0833F29F40E940D29809348046D +:105350000895893F19F40E94562905C08A3F31F407 +:105360000E945629819580934A0408958B3F21F429 +:105370000E945629819504C08C3F29F40E94562929 +:1053800080934B040895843F21F480914704816009 +:1053900017C0853F21F480914704826011C0863F89 +:1053A00021F48091470484600BC0873F21F48091F1 +:1053B0004704886005C0883F31F4809147048061CC +:1053C0008093470408958D3F21F4809145048160C6 +:1053D0000BC08E3F21F480914504826005C08F3F51 +:1053E00029F4809145048460809345040895803FAA +:1053F00039F48091490487FF6CC01092490469C058 +:10540000813F29F4809149041816BCF362C0909141 +:105410004804823F29F497FF5CC01092480459C0A9 +:10542000833F19F41916CCF354C0893F41F480919D +:105430004A0418160CF04DC010924A044AC08A3F24 +:1054400029F480914A0487FF44C0F6CF8B3F39F49A +:1054500080914B0487FF3DC010924B043AC08C3FB3 +:1054600029F480914B041816BCF333C0843F21F417 +:10547000809147048E7F17C0853F21F480914704B7 +:105480008D7F11C0863F21F4809147048B7F0BC034 +:10549000873F21F480914704877F05C0883F31F41E +:1054A000809147048F7E8093470413C08D3F21F481 +:1054B000809145048E7F0BC08E3F21F4809145047E +:1054C0008D7F05C08F3F29F4809145048B7F8093A9 +:1054D00045048091480481110EC0809149048111D6 +:1054E0000AC080914A04811106C080914B04811149 +:1054F00002C010924604089587E494E00E94561B6F +:105500000E941E28909344048093430408951F939F +:10551000CF93DF9380914304909144040E942A2802 +:10552000AC0190914604992321F020918C0230E047 +:1055300006C020918D028AE0289F90011124421715 +:10554000530708F486C080914804C0914904D09163 +:105550004A0410914B04811107C0C11176C0D111CA +:1055600074C0111172C075C09F3F19F09F5F909376 +:105570004604181624F40E940D2980934804809153 +:10558000480487FF05C00E940D2981958093480437 +:105590001C1624F40E940D2980934904809149042B +:1055A00087FF05C00E940D29819580934904609171 +:1055B0004804662339F1C0914904CC2319F17727B7 +:1055C00067FD7095872F972F0E94F12E23E333E319 +:1055D00043E35FE30E9401300E94BE2E60934804C3 +:1055E0006C2F772767FD7095872F972F0E94F12EDC +:1055F00023E333E343E35FE30E9401300E94BE2EC6 +:10560000609349041D1624F40E94562980934A048D +:1056100080914A0487FF05C00E9456298195809396 +:105620004A04111624F40E94562980934B04809159 +:105630004B0487FF05C00E945629819580934B0437 +:10564000DF91CF911F910C947C2A9F3F09F08ECF60 +:1056500096CFDF91CF911F910895E7E4F4E085E0C4 +:10566000DF011D928A95E9F71092460410924504D5 +:105670000895833081F128F4813059F08230D1F0DF +:105680000895853009F449C0B8F1863009F456C050 +:10569000089580918D02262F30E0280F311D2F3F75 +:1056A000310524F4680F60938D0208958FEF809385 +:1056B0008D02089580918C02262F30E0280F311D35 +:1056C0002F3F310524F4680F60938C0208958FEF0B +:1056D00080938C02089580918B02262F30E0280F52 +:1056E000311D2F3F310524F4680F60938B0208951C +:1056F0008FEF80938B02089580918A02262F30E0ED +:10570000280F311D2F3F310524F4680F60938A0262 +:1057100008958FEF80938A02089580918902262F41 :1057200030E0280F311D2F3F310524F4680F6093BE -:105730008A0208958FEF80938A020895833011F1D1 -:1057400028F4813049F0823091F00895853081F15C -:1057500020F18630C1F1089580918F02681720F4FE -:10576000861B80938F02089510928F020895809176 -:105770008E02681720F4861B80938E020895109283 -:105780008E02089580918D02681720F4861B809305 -:105790008D02089510928D02089580918C026817F1 -:1057A00020F4861B80938C02089510928C02089539 -:1057B00080918B02681720F4861B80938B020895DA -:1057C00010928B02089580918A02681720F4861B3C -:1057D00080938A02089510928A0208950F931F936E -:1057E000873208F048C08E3108F094C0803109F447 -:1057F0007EC008F5873009F468C068F4863009F087 -:10580000A4C08091ED03817F8E7F8093ED0381E0C2 -:105810008093FD039BC08B3009F490C08E3009F05B -:1058200094C08091ED0382FB222720F991E092271A -:1058300090FB82F965C0863109F480C060F4813143 -:1058400009F083C00E944B219091870281E0892753 -:105850008093870273C0893109F470C08B3109F0DD -:1058600074C08091ED0381FB222720F991E09227FB -:1058700090FB81F945C0883309F460C050F4893247 -:1058800009F45EC0853309F45BC0873209F458C05F -:105890005CC0833409F454C028F48A3308F455C03A -:1058A000895339C0883409F050C00E944B210E94AE -:1058B00090060FEF13ED20E3015010402040E1F778 -:1058C00000C000000E94682839C09091ED03892F24 -:1058D0008095817080FB90F929F096609860909394 -:1058E000ED0334C0997F977F9093ED0327C080919B -:1058F000ED0383FB222720F991E0922790FB83F9A7 -:105900008093ED039923D1F08091ED038160809322 -:10591000ED0314C08D5141E050E060E070E08A0179 -:105920009B0104C0000F111F221F331F8A95D2F75D -:10593000C901B8010E9407250E944B2181E006C0E1 -:1059400061E070E080E090E0F5CF80E01F910F9182 -:10595000089580E0089580E00895CF93C82F809146 -:10596000FD03813069F018F08230C9F184C0E09104 -:105970008802F09189028081823209F07EC007C0DE -:10598000E0918802F09189028081823261F48C2F4B -:105990000E94A92C811104C08C2F0E94EE2B1DC0E7 -:1059A00081E090E01AC08C2F0E94AB2C811114C0B2 -:1059B000C43179F048F4CB3079F0C03109F061C0DE -:1059C00082E08093FD0308C0C93219F0C83321F08A -:1059D00058C01092FD0355C081E0817054C0C93297 -:1059E00091F120F5C43179F1B0F4C73009F047C026 -:1059F0008EE180938F0282E380938E028AE080930F -:105A00008D0284E180938C0288E080938B0288E28F -:105A100080938A0234C0CE51C63088F5EC2FF0E076 -:105A2000E65FFC4F80818093FC0329C0CE34E9F00F -:105A300020F4CB3421F56AE013C0C13579F0C235CA -:105A4000F1F461E00DC08091FC03882319F01092FD -:105A5000FC0315C081E08093FD0315C061E006C022 -:105A60008091FC030E94282B0AC06AE08091FC030D -:105A70000E949E2B04C01092FD0380E004C081E0D0 -:105A800002C080E0AACFCF9108950E94C928811159 -:105A900002C00E94A5280E94EA288093180480FF73 -:105AA00002C0869501C080E00C94540580911804D2 -:105AB000982F9695292F30E0233031054CF49F5FC5 -:105AC000990F8170892B8160809318040E94EE28C1 -:105AD0008091180486950C94540580911804982F91 -:105AE000969591F09158990F8170892B80931804A5 -:105AF0008E7F91E009F490E08091180490FB80F98A -:105B0000809318040E94EE288091180486950C94C6 -:105B1000540580911804982F909590FB80F98093FC -:105B200018040E94EE288091180480FF02C0869518 -:105B300001C080E00C94540590911804892F86953B -:105B40008F5F8F779170843028F4880F892B809332 -:105B5000180402C090931804809118048E7F91E07D -:105B600009F490E08091180490FB80F98093180468 -:105B70000E94EE288091180486950C94540520917B -:105B80001804922F96958927982F990F822F81704C -:105B9000892B809318048E7F91E009F490E0809126 -:105BA000180490FB80F9809318040E94EE288091DD -:105BB000180486950C9454055058BB27AA270ED07C -:105BC00075C166D130F06BD120F031F49F3F11F4F4 -:105BD0001EF45BC10EF4E095E7FB51C1E92F77D1CC -:105BE00080F3BA17620773078407950718F071F4FA -:105BF0009EF58FC10EF4E0950B2EBA2FA02D0B0150 -:105C0000B90190010C01CA01A0011124FF27591B01 -:105C100099F0593F50F4503E68F11A16F040A22F07 -:105C2000232F342F4427585FF3CF46953795279578 -:105C3000A795F0405395C9F77EF41F16BA0B620B77 -:105C4000730B840BBAF09150A1F0FF0FBB1F661FBE -:105C5000771F881FC2F70EC0BA0F621F731F841F01 -:105C600048F4879577956795B795F7959E3F08F027 -:105C7000B3CF9395880F08F09927EE0F97958795E6 -:105C80000895D9D008F481E008950CD00FC107D150 -:105C900040F0FED030F021F45F3F19F0F0C0511118 -:105CA00039C1F3C014D198F39923C9F35523B1F343 -:105CB000951B550BBB27AA2762177307840738F07B -:105CC0009F5F5F4F220F331F441FAA1FA9F333D0DA -:105CD0000E2E3AF0E0E830D091505040E695001C8E -:105CE000CAF729D0FE2F27D0660F771F881FBB1F4A -:105CF000261737074807AB07B0E809F0BB0B802D24 -:105D0000BF01FF2793585F4F2AF09E3F510568F06F -:105D1000B6C000C15F3FECF3983EDCF38695779503 -:105D20006795B795F7959F5FC9F7880F911D969571 -:105D3000879597F90895E1E0660F771F881FBB1FCD -:105D4000621773078407BA0720F0621B730B840B7A -:105D5000BA0BEE1F88F7E095089504D06894B1114E -:105D6000D9C00895BCD088F09F5790F0B92F9927DB -:105D7000B751A0F0D1F0660F771F881F991F1AF056 -:105D8000BA95C9F712C0B13081F0C3D0B1E008951F -:105D9000C0C0672F782F8827B85F39F0B93FCCF3A0 -:105DA000869577956795B395D9F73EF4909580954C -:105DB000709561957F4F8F4F9F4F0895E89409C06C -:105DC00097FB3EF490958095709561957F4F8F4F2E -:105DD0009F4F9923A9F0F92F96E9BB279395F69544 -:105DE000879577956795B795F111F8CFFAF4BB0FC2 -:105DF00011F460FF1BC06F5F7F4F8F4F9F4F16C026 -:105E0000882311F096E911C0772321F09EE8872FAF -:105E1000762F05C0662371F096E8862F70E060E06B -:105E20002AF09A95660F771F881FDAF7880F9695E4 -:105E3000879597F90895990F0008550FAA0BE0E888 -:105E4000FEEF16161706E807F907C0F0121613063C -:105E5000E407F50798F0621B730B840B950B39F47C -:105E60000A2661F0232B242B252B21F408950A26E2 -:105E700009F4A140A6958FEF811D811D089597F922 -:105E80009F6780E870E060E008959FEF80EC0895E0 -:105E900000240A9416161706180609060895002409 -:105EA0000A9412161306140605060895092E039483 -:105EB000000C11F4882352F0BB0F40F4BF2B11F4F7 -:105EC00060FF04C06F5F7F4F8F4F9F4F089557FD56 -:105ED0009058440F551F59F05F3F71F04795880F58 -:105EE00097FB991F61F09F3F79F0879508951216EF -:105EF00013061406551FF2CF4695F1DF08C016169B -:105F000017061806991FF1CF86957105610508944B -:105F10000895E894BB2766277727CB0197F9089562 -:105F20008ADF08F48FEF08950BD0C0CFB1DF28F0DF -:105F3000B6DF18F0952309F0A2CFA7CF1124EACF3E -:105F4000C6DFA0F3959FD1F3950F50E0551F629FD8 -:105F5000F001729FBB27F00DB11D639FAA27F00DC2 -:105F6000B11DAA1F649F6627B00DA11D661F829FE9 -:105F70002227B00DA11D621F739FB00DA11D621FCE -:105F8000839FA00D611D221F749F3327A00D611DEB -:105F9000231F849F600D211D822F762F6A2F1124CD -:105FA0009F5750408AF0E1F088234AF0EE0FFF1F20 -:105FB000BB1F661F771F881F91505040A9F79E3F57 -:105FC000510570F05CCFA6CF5F3FECF3983EDCF359 -:105FD000869577956795B795F795E7959F5FC1F794 -:105FE000FE2B880F911D9695879597F90895FA01D4 -:105FF000EE0FFF1F30962105310599F161157105EE -:1060000061F48038BFE39B0749F1689490388105BB -:1060100061F08038BFEF9B0741F0992342F5FF3FC5 -:10602000E1053105210511F1E8940894E795D901BE -:10603000AA2329F4AB2FBE2FF85FD0F310C0FF5F67 -:1060400070F4A695E0F7F73950F019F0FF3A38F4FC -:106050009F779F930CD00F9007FC905808953EF0C7 -:1060600014CF60E070E080E89FE308954FE79F77EA -:106070005F934F933F932F939ED02F913F914F91DA -:106080005F9152DF05C019F40EF0F9CE42CFFDCE7C -:1060900026DFC8F39638C0F707F80F92E8942BE391 -:1060A0003AEA48EB5FE74EDF0F920F920F924DB73F -:1060B0005EB70F92C0D0E4E4F1E016D04F915F914B -:1060C000EF91FF91E595EE1FFF1F49F0FE57E06845 -:1060D0004427EE0F441FFA95E1F74195550B32D056 -:1060E0000F9007FE26C00895DF93CF931F930F9361 -:1060F000FF92EF92DF927B018C01689405C0DA2E4B -:10610000EF011EDFFE01E894A5912591359145919F -:106110005591AEF3EF0162DDFE019701A801DA941B -:1061200079F7DF90EF90FF900F911F91CF91DF9162 -:1061300008959B01AC0160E070E080E89FE3A5CD8D -:106140009ECEACC0CCDEE8F39923D9F3940F511D59 -:10615000BBF39150504094F059F0882332F0660F11 -:10616000771F881F91505040C1F79E3F510544F75B -:10617000880F911D9695879597F908955F3FACF02C -:10618000983E9CF0BB27869577956795B79508F460 -:10619000B1609395C1F7BB0F58F711F460FFE8CFDA -:1061A0006F5F7F4F8F4F9F4FE3CFB4CE0EF076C01F -:1061B0006CCE689464CE93DEC8F39923D1F3C6F312 -:1061C000DF93CF931F930F93FF92C92FDD2788236F -:1061D0002AF02197660F771F881FDAF720E030E05A -:1061E00040E85FEB9FE3883920F0803E30F0219655 -:1061F0008F77E3DCECE6F1E003C0DFDCE9E9F1E016 -:1062000073DF8B01BE01EC01FB2E6F577109759591 -:10621000771F880B990BD4DD28E132E741E35FE378 -:106220008FDEAF2D9801AE01FF900F911F91CF919E -:10623000DF91D4DC3BCEFA01DC01AA0FBB1F9B012E -:10624000AC01BF5728F422273327442750781FC0BA -:10625000B75188F4AB2F0024469537952795011C3C -:10626000A395D2F3002069F0220F331F441FB3958A -:10627000DAF30DD0A1CC61307105A0E88A07B946E8 -:1062800030F49B01AC0166277727882790783096F9 -:1062900021F0208331834283538308959F3F31F05F -:1062A000915020F4879577956795B795880F911D44 -:1062B0009695879597F90895AA1BBB1B51E107C0D6 -:1062C000AA1FBB1FA617B70710F0A61BB70B881F86 -:1062D000991F5A95A9F780959095BC01CD01089515 -:1062E00097FB072E16F4009407D077FD09D00E9483 -:1062F0005C3107FC05D03EF4909581959F4F089541 -:10630000709561957F4F0895EE0FFF1F0590F491F2 -:10631000E02D0994F999FECF92BD81BDF89A992795 -:1063200080B50895A8E1B0E042E050E00C94B231AD -:10633000262FF999FECF92BD81BDF89A019700B43E -:10634000021639F01FBA20BD0FB6F894FA9AF99ADE -:106350000FBE08950196272F0E9499310C94983111 -:10636000DC01CB01FC01F999FECF06C0F2BDE1BD15 -:10637000F89A319600B40D9241505040B8F7089504 -:04638000F894FFCFBF -:1063840007000C52D02445000000410000DC44000A -:1063940000004152D0A4440000404100005C44008D -:1063A40000004148F17644000000415C978A4400B3 -:1063B4000000411FD592440000004152D0A4440083 -:1063C4000000415CFFB844000000410AA7CF44002C -:1063D4000000410000DC44000000410AA7CF440053 -:1063E4000000410000DC4400000041000000000007 -:1063F40000804000005C45000040410000000000B7 -:1064040000804052D02445000040410AA7CF4400F8 -:106414000000410000DC44000000410000000000D6 -:1064240000804052D024450000404100000000009C -:1064340000804000005C45000040410AA7CF4400B2 -:106444000000410000DC44000000410000000000A6 -:1064540000804052D024450000404100000000006C -:106464000080400AA74F45000040410AA7CF4400DE -:106474000000410000DC4400000041000000000076 -:1064840000804052D024450000004100000000007C -:106494000080405CFF38450000004100000000001F -:1064A40000804052D02445000000410AA7CF440098 -:1064B4000000410000DC4400000041000000000036 -:1064C40000804052D024450000804153D024450030 -:1064D40000404160970A450000004154D0A44400A4 -:1064E4000000410000DC440000004160970A4500C0 -:1064F40000A041050000003F0000C8423214C0144F -:106504009D14691435140101DA032808140A321E93 -:106514000000020004000500070009000B000C0045 -:106524000E001000110013001500170018001A00C7 -:106534001C001D001F002100230024002600280049 -:1065440029002B002D002F003000320034003500CC -:10655400370039003B00400045002500260061005B -:106564006000200037006400650066006700440096 -:106574004600240047003F4D3639BD0970093A09E9 -:1065840001099408AD08C608DF08010203040506E2 -:0465940007080900EB +:10573000890208958FEF80938902089580918802ED +:10574000262F30E0280F311D2F3F310524F4680F3C +:105750006093880208958FEF8093880208958330C4 +:1057600011F128F4813049F0823091F008958530AC +:1057700081F120F18630C1F1089580918D02681782 +:1057800020F4861B80938D02089510928D02089557 +:1057900080918C02681720F4861B80938C020895F8 +:1057A00010928C02089580918B02681720F4861B5A +:1057B00080938B02089510928B02089580918A0243 +:1057C000681720F4861B80938A02089510928A023B +:1057D000089580918902681720F4861B80938902BE +:1057E000089510928902089580918802681720F424 +:1057F000861B8093880208951092880208950F9363 +:105800001F93873208F048C08E3108F094C0803171 +:1058100009F47EC008F5873009F468C068F4863062 +:1058200009F0A4C080913D04817F8E7F80933D0468 +:1058300081E080934D049BC08B3009F490C08E3082 +:1058400009F094C080913D0482FB222720F991E069 +:10585000922790FB82F965C0863109F480C060F41C +:10586000813109F083C00E945C219091850281E022 +:1058700089278093850273C0893109F470C08B3108 +:1058800009F074C080913D0481FB222720F991E04A +:10589000922790FB81F945C0883309F460C050F429 +:1058A000893209F45EC0853309F45BC0873209F49C +:1058B00058C05CC0833409F454C028F48A3308F417 +:1058C00055C0895339C0883409F050C00E945C210A +:1058D0000E946C060FEF13ED20E3015010402040B2 +:1058E000E1F700C000000E94792839C090913D0482 +:1058F000892F8095817080FB90F929F096609860DF +:1059000090933D0434C0997F977F90933D0427C0C6 +:1059100080913D0483FB222720F991E0922790FBA0 +:1059200083F980933D049923D1F080913D048160F7 +:1059300080933D0414C08D5141E050E060E070E080 +:105940008A019B0104C0000F111F221F331F8A957B +:10595000D2F7C901B8010E9418250E945C2181E09C +:1059600006C061E070E080E090E0F5CF80E01F913C +:105970000F91089580E0089580E00895CF93C82F97 +:1059800080914D04813069F018F08230C9F184C0F3 +:10599000E0918602F09187028081823209F07EC018 +:1059A00007C0E0918602F09187028081823261F423 +:1059B0008C2F0E94BA2C811104C08C2F0E94FF2BC7 +:1059C0001DC081E090E01AC08C2F0E94BC2C811178 +:1059D00014C0C43179F048F4CB3079F0C03109F00B +:1059E00061C082E080934D0408C0C93219F0C83309 +:1059F00021F058C010924D0455C081E0817054C010 +:105A0000C93291F120F5C43179F1B0F4C73009F011 +:105A100047C08EE180938D0282E380938C028AE0FE +:105A200080938B0284E180938A0288E080938902CC +:105A300088E28093880234C0CE51C63088F5EC2FBE +:105A4000F0E0E85AFC4F808180934C0429C0CE34AA +:105A5000E9F020F4CB3421F56AE013C0C13579F0C8 +:105A6000C235F1F461E00DC080914C04882319F037 +:105A700010924C0415C081E080934D0415C061E084 +:105A800006C080914C040E94392B0AC06AE08091C4 +:105A90004C040E94AF2B04C010924D0480E004C05F +:105AA00081E002C080E0AACFCF9108950E94DA2859 +:105AB000811102C00E94B6280E94FB2880936804CE +:105AC00080FF02C0869501C080E00C943005809173 +:105AD0006804982F9695292F30E0233031054CF437 +:105AE0009F5F990F8170892B8160809368040E9469 +:105AF000FF288091680486950C9430058091680495 +:105B0000982F969591F09158990F8170892B8093D9 +:105B100068048E7F91E009F490E08091680490FB26 +:105B200080F9809368040E94FF288091680486951C +:105B30000C94300580916804982F909590FB80F923 +:105B4000809368040E94FF288091680480FF02C04F +:105B5000869501C080E00C94300590916804892FEF +:105B600086958F5F8F779170843028F4880F892B0A +:105B70008093680402C090936804809168048E7FCB +:105B800091E009F490E08091680490FB80F98093A3 +:105B900068040E94FF288091680486950C94300563 +:105BA00020916804922F96958927982F990F822F1C +:105BB0008170892B809368048E7F91E009F490E0D6 +:105BC0008091680490FB80F9809368040E94FF280C +:105BD0008091680486950C9430055058BB27AA27FD +:105BE0000ED0D1C1C2D130F0C7D120F031F49F3FE7 +:105BF00011F41EF4B7C10EF4E095E7FB9FC1E92F45 +:105C0000D3D180F3BA17620773078407950718F09A +:105C100071F49EF5EBC10EF4E0950B2EBA2FA02D7A +:105C20000B01B90190010C01CA01A0011124FF2749 +:105C3000591B99F0593F50F4503E68F11A16F04044 +:105C4000A22F232F342F4427585FF3CF4695379543 +:105C50002795A795F0405395C9F77EF41F16BA0B08 +:105C6000620B730B840BBAF09150A1F0FF0FBB1FB6 +:105C7000661F771F881FC2F70EC0BA0F621F731FFF +:105C8000841F48F4879577956795B795F7959E3F5C +:105C900008F0B3CF9395880F08F09927EE0F9795EA +:105CA0008795089527D108F481E008950CD06BC141 +:105CB00063D140F05AD130F021F45F3F19F03EC17A +:105CC000511195C14FC170D198F39923C9F3552350 +:105CD000B1F3951B550BBB27AA27621773078407DF +:105CE00038F09F5F5F4F220F331F441FAA1FA9F395 +:105CF00033D00E2E3AF0E0E830D091505040E69587 +:105D0000001CCAF729D0FE2F27D0660F771F881FE7 +:105D1000BB1F261737074807AB07B0E809F0BB0BD6 +:105D2000802DBF01FF2793585F4F2AF09E3F5105FA +:105D300068F004C15CC15F3FECF3983EDCF38695EC +:105D400077956795B795F7959F5FC9F7880F911D70 +:105D50009695879597F90895E1E0660F771F881F5C +:105D6000BB1F621773078407BA0720F0621B730B0F +:105D7000840BBA0BEE1F88F7E095089504D0689461 +:105D8000B11135C1089518D188F09F5790F0B92FFF +:105D90009927B751A0F0D1F0660F771F881F991F80 +:105DA0001AF0BA95C9F712C0B13081F01FD1B1E035 +:105DB00008951CC1672F782F8827B85F39F0B93F45 +:105DC000CCF3869577956795B395D9F73EF4909582 +:105DD0008095709561957F4F8F4F9F4F0895E89400 +:105DE00009C097FB3EF490958095709561957F4F23 +:105DF0008F4F9F4F9923A9F0F92F96E9BB279395D1 +:105E0000F695879577956795B795F111F8CFFAF4E0 +:105E1000BB0F11F460FF1BC06F5F7F4F8F4F9F4F11 +:105E200016C0882311F096E911C0772321F09EE86F +:105E3000872F762F05C0662371F096E8862F70E0D5 +:105E400060E02AF09A95660F771F881FDAF7880FAF +:105E50009695879597F9089588D018F011F08CD011 +:105E600038F480C0C4C0E92F9FD0B0F35523C9F3E4 +:105E7000E7FB6217730784079507A8F199F3E92FE9 +:105E8000FF2788232AF03197660F771F881FDAF7DC +:105E9000952F5527442332F091505040220F331F45 +:105EA000441FD2F7BB27E91BF50B621B730B840B56 +:105EB000B109C1F222F4620F731F841FB11D319723 +:105EC0002AF0660F771F881FBB1FEFCF91505040FD +:105ED0005AF041F0882332F0660F771F881F9150E7 +:105EE0005040C1F7939530C08695779567959F5F31 +:105EF000D9F7F8CF990F0008550FAA0BE0E8FEEF8D +:105F000016161706E807F907C0F012161306E4077D +:105F1000F50798F0621B730B840B950B39F40A2676 +:105F200061F0232B242B252B21F408950A2609F454 +:105F3000A140A6958FEF811D811D089597F99F6758 +:105F400080E870E060E008959F3F31F0915020F4C8 +:105F5000879577956795B795880F911D9695879545 +:105F600097F908959FEF80EC089500240A9416167F +:105F7000170618060906089500240A941216130637 +:105F8000140605060895092E0394000C11F48823C5 +:105F900052F0BB0F40F4BF2B11F460FF04C06F5FE1 +:105FA0007F4F8F4F9F4F089557FD9058440F551FB7 +:105FB00059F05F3F71F04795880F97FB991F61F08B +:105FC0009F3F79F087950895121613061406551F02 +:105FD000F2CF4695F1DF08C0161617061806991F6E +:105FE000F1CF86957105610508940895E894BB2763 +:105FF00066277727CB0197F908957CDF08F48FEFA8 +:1060000008950BD0C0CFB1DF28F0B6DF18F095238C +:1060100009F094CFA7CF1124EACFC6DFA0F3959F54 +:10602000D1F3950F50E0551F629FF001729FBB277F +:10603000F00DB11D639FAA27F00DB11DAA1F649F2B +:106040006627B00DA11D661F829F2227B00DA11DDE +:10605000621F739FB00DA11D621F839FA00D611D64 +:10606000221F749F3327A00D611D231F849F600D85 +:10607000211D822F762F6A2F11249F5750408AF0BE +:10608000E1F088234AF0EE0FFF1FBB1F661F771F4A +:10609000881F91505040A9F79E3F510570F04ECF98 +:1060A000A6CF5F3FECF3983EDCF386957795679536 +:1060B000B795F795E7959F5FC1F7FE2B880F911D68 +:1060C0009695879597F90895FA01EE0FFF1F309680 +:1060D0002105310599F16115710561F48038BFE33F +:1060E0009B0749F168949038810561F08038BFEFD3 +:1060F0009B0741F0992342F5FF3FE105310521055A +:1061000011F1E8940894E795D901AA2329F4AB2F5B +:10611000BE2FF85FD0F310C0FF5F70F4A695E0F7D4 +:10612000F73950F019F0FF3A38F49F779F930CD06D +:106130000F9007FC905808953EF014CF60E070E097 +:1061400080E89FE308954FE79F775F934F933F93D6 +:106150002F939ED02F913F914F915F9152DF05C0B9 +:1061600019F40EF0EBCE42CFFDCE26DFC8F3963801 +:10617000C0F707F80F92E8942BE33AEA48EB5FE7A1 +:106180004EDF0F920F920F924DB75EB70F92C0D0B5 +:10619000ECEFF0E016D04F915F91EF91FF91E59514 +:1061A000EE1FFF1F49F0FE57E0684427EE0F441F23 +:1061B000FA95E1F74195550B32D00F9007FE26C0B6 +:1061C0000895DF93CF931F930F93FF92EF92DF9287 +:1061D0007B018C01689405C0DA2EEF011EDFFE0101 +:1061E000E894A5912591359145915591AEF3EF0134 +:1061F00006DDFE019701A801DA9479F7DF90EF90B0 +:10620000FF900F911F91CF91DF9108959B01AC01F9 +:1062100060E070E080E89FE349CD90CE95CECCDE83 +:10622000E8F39923D9F3940F511DBBF391505040DB +:1062300094F059F0882332F0660F771F881F915031 +:106240005040C1F79E3F510544F7880F911D969528 +:10625000879597F908955F3FACF0983E9CF0BB2777 +:10626000869577956795B79508F4B1609395C1F7D2 +:10627000BB0F58F711F460FFE8CF6F5F7F4F8F4F70 +:106280009F4FE3CFB4CE0EF05FCE6CCE689456CE67 +:1062900093DEC8F39923D1F3C6F3DF93CF931F9313 +:1062A0000F93FF92C92FDD2788232AF02197660FCD +:1062B000771F881FDAF720E030E040E85FEB9FE3CC +:1062C000883920F0803E30F021968F7787DCE4E239 +:1062D000F1E003C083DCE1E5F1E073DF8B01BE0197 +:1062E000EC01FB2E6F5771097595771F880B990B81 +:1062F00078DD28E132E741E35FE38FDEAF2D9801DF +:10630000AE01FF900F911F91CF91DF9178DC3BCED2 +:10631000FA01DC01AA0FBB1F9B01AC01BF5728F497 +:1063200022273327442750781FC0B75188F4AB2F5A +:106330000024469537952795011CA395D2F300209C +:1063400069F0220F331F441FB395DAF30DD045CC0B +:1063500061307105A0E88A07B94630F49B01AC01B1 +:106360006627772788279078309621F0208331831D +:10637000428353830895AA1BBB1B51E107C0AA1F88 +:10638000BB1FA617B70710F0A61BB70B881F991FD6 +:106390005A95A9F780959095BC01CD01089597FB7A +:1063A000072E16F4009407D077FD09D00E94BB3168 +:1063B00007FC05D03EF4909581959F4F0895709508 +:1063C00061957F4F0895EE0FFF1F0590F491E02D2A +:1063D0000994F999FECF92BD81BDF89A992780B5AD +:1063E0000895A8E1B0E042E050E00C941132262F6D +:1063F000F999FECF92BD81BDF89A019700B40216BB +:1064000039F01FBA20BD0FB6F894FA9AF99A0FBE68 +:1064100008950196272F0E94F8310C94F731DC0182 +:10642000CB01FC01F999FECF06C0F2BDE1BDF89A9F +:10643000319600B40D9241505040B8F70895F89449 +:02644000FFCF8C +:106442000C52D02445000000410000DC4400000052 +:106452004152D0A4440000404100005C44000000CE +:106462004148F17644000000415C978A44000000F4 +:10647200411FD592440000004152D0A444000000C4 +:10648200415CFFB844000000410AA7CF440000006D +:10649200410000DC44000000410AA7CF4400000094 +:1064A200410000DC440000004100000000000080C8 +:1064B2004000005C450000404100000000000080F8 +:1064C2004052D02445000040410AA7CF44000000BA +:1064D200410000DC44000000410000000000008098 +:1064E2004052D024450000404100000000000080DE +:1064F2004000005C45000040410AA7CF4400000074 +:10650200410000DC44000000410000000000008067 +:106512004052D024450000404100000000000080AD +:10652200400AA74F45000040410AA7CF440000009F +:10653200410000DC44000000410000000000008037 +:106542004052D024450000004100000000000080BD +:10655200405CFF3845000000410000000000008060 +:106562004052D02445000000410AA7CF4400000059 +:10657200410000DC440000004100000000000080F7 +:106582004052D024450000804153D02445000040B1 +:106592004160970A450000004154D0A44400000025 +:1065A200410000DC440000004160970A450000A061 +:1065B20041050000003F0000C8424314D114AE144C +:1065C2007A14461401012A042808140A321E000013 +:1065D200020004000500070009000B000C000E0079 +:1065E2001000110013001500170018001A001C00FB +:1065F2001D001F002100230024002600280029007E +:106602002B002D002F0030003200340035003700FF +:1066120039003B0040004500250026006100600073 +:1066220020003700640065006600670044004600F1 +:10663200240047003149803F5D8B803FF8BF803F97 +:10664200CAE1803F73ED803FCAE1803FF8BF803FDF +:106652005D8B803F3149803F0000803FF16D7F3F7D +:1066620075EA7E3F4C827E3F833F7E3F84287E3F99 +:10667200833F7E3F4C827E3F75EA7E3FF16D7F3FD6 +:106682000000803F3F4D363975092809F208B908E4 +:106692004C0865087E0897080102030405060708EE +:0266A2000900ED :00000001FF diff --git a/keyboard/preonic/keymaps/default/keymap.c b/keyboard/preonic/keymaps/default/keymap.c index 95b971876..b3aa14dcb 100644 --- a/keyboard/preonic/keymaps/default/keymap.c +++ b/keyboard/preonic/keymaps/default/keymap.c @@ -319,7 +319,7 @@ void matrix_init_user(void) { #ifdef AUDIO_ENABLE uint8_t starting_note = 0x0C; -int offset = 7; +int offset = 0; void process_action_user(keyrecord_t *record) { diff --git a/keyboard/preonic/preonic_pcb_r1.hex b/keyboard/preonic/preonic_pcb_r1.hex index 5bdc190e1..eda1b1979 100644 --- a/keyboard/preonic/preonic_pcb_r1.hex +++ b/keyboard/preonic/preonic_pcb_r1.hex @@ -1,1702 +1,1628 @@ -:100000000C94D4020C9418030C9418030C94180349 -:100010000C9418030C9418030C9418030C941803F4 -:100020000C9418030C9418030C94E8160C94BA174B -:100030000C946C290C9418030C9418030C9418035A -:100040000C9418030C9418030C9418030C941803C4 -:100050000C9418030C94D9290C9418030C941803CD -:100060000C9418030C9418030C9418030C941803A4 -:100070000C9418030C9418030C9418030C94180394 -:100080000C941C0E0C9418030C9418030C94180375 -:100090000C9418030C9418030C9418030C94180374 -:1000A0000C9418030C9418030C941803076342363D -:1000B000B79BD8A71A39685618AEBAAB558C1D3CF9 -:1000C000B7CC5763BD6DEDFD753EF6177231BF00BD -:1000D0000000803F08000000BE922449123EABAAF7 -:1000E000AA2ABECDCCCC4C3E00000080BEABAAAA52 -:1000F000AA3E00000000BF000000803F000000009A -:1001000000084178D3BB4387D1133D190E3CC3BDD2 -:100110004282AD2B3E68EC8276BED98FE1A93E4C7F -:1001200080EFFFBE01C4FF7F3F00000000003500EC -:100130001E001F00200021002200230024002500B3 -:10014000260027002A002B0014001A0008001500C2 -:1001500017001C0018000C00120013002A002900D0 -:1001600004001600070009000A000B000D000E0035 -:100170000F0033003400E1001D001B0006001900D1 -:10018000050011001000360037003800280000304C -:10019000E000E200E30003522C002C000452500067 -:1001A000510052004F0035001E001F0020002100AA -:1001B0002200230024002500260027002A002B000F -:1001C00014001A00090013000A000D000F001800A7 -:1001D0001C0033002A002900040015001600170037 -:1001E00007000B00110008000C0012003400E100B1 -:1001F0001D001B000600190005000E00100036004F -:100200003700380028000030E000E200E30003522D -:100210002C002C0004525000510052004F003500B9 -:100220001E001F00200021002200230024002500C2 -:10023000260027002A002B00340036003700130068 -:100240001C0009000A00060015000F002A00290002 -:1002500004001200080018000C0007000B00170033 -:10026000110016003800E100330014000D000E00EC -:100270001B00050010001A0019001D0028000030A6 -:10028000E000E200E30003522C002C000452500076 -:10029000510052004F0035001E001F0020002100B9 -:1002A0002200230024002500260027002A00350212 -:1002B0001E021F0220022102220223022402250222 -:1002C000260227022A0001003A003B003C003D00C4 -:1002D0003E003F002D022E022F02300231020100AB -:1002E00040004100420043004400450000530153D8 -:1002F0000253005001000100010001000100010053 -:10030000010001000100AB00AA00A900AE00350009 -:100310001E001F00200021002200230024002500D1 -:10032000260027002A0035001E001F0020002100A3 -:100330002200230024002500260027002A000100B7 -:100340003A003B003C003D003E003F002D002E00E7 -:100350002F00300031000100400041004200430006 -:1003600044004500005301530253005001000100B6 -:100370000100010001000100010001000100AB00CB -:10038000AA00A900AE002A035400680065002000FE -:100390005000720065006F006E006900630020006D -:1003A0004B006500790062006F006100720064001C -:1003B00000002C034F007200740068006F006C0096 -:1003C00069006E0065006100720020004B0065004E -:1003D000790062006F006100720064007300000029 -:1003E000040309040902D000060100A0FA09040070 -:1003F000000103010100092111010001223F000752 -:1004000005810308000A0904010001030102000933 -:100410002111010001224D000705820308000A098D -:10042000040200010300000009211101000122362D -:10043000000705830308000A090403000203000003 -:10044000000921110100012220000705840320007A -:100450000107050403200001090404000001010054 -:100460000009240100010900010509040500020139 -:1004700003000007240100014100062402010100DD -:1004800006240202020009240301030102010009FB -:1004900024030204010101000905060240000500D1 -:1004A0000005250101010905850240000500000540 -:1004B000250101031201100100000008EDFE61603A -:1004C0000100010200010631FF0974A1010975153F -:1004D0000025FF9520750881020976150025FF95F6 -:1004E0002075089102C005010980A101850216014D -:1004F0000026B7001A01002AB70075109501810087 -:10050000C0050C0901A1018503160100269C021AF1 -:1005100001002A9C02751095018100C005010902A5 -:10052000A1010901A10005091901290515002501ED -:100530009505750181029501750381010501093059 -:1005400009311581257F95027508810609381581C5 -:10055000257F950175088106050C0A38021581254D -:100560007F950175088106C0C005010906A1010536 -:100570000719E029E7150025019508750181029505 -:100580000175088101050819012905950575019175 -:10059000029501750391010507190029FF15002532 -:1005A000FF950675088100C011241FBECFEFDAE069 -:1005B000DEBFCDBF04B603FE24C080910404909139 -:1005C0000504A0910604B09107048730904BA74022 -:1005D000B04BB9F410920404109205041092060472 -:1005E0001092070414BE84B7877F84BF88E10FB6DA -:1005F000F89480936000109260000FBEE0E0F8E392 -:10060000099512E0A0E0B1E0EEE1F9E602C0059044 -:100610000D92A832B107D9F714E0A8E2B2E001C008 -:100620001D92A430B107E1F70E94A0130C948D3401 -:100630000C94000061110DC0FC018281882331F00F -:1006400085EE0E94671E0E94683003C085EE0E94FE -:100650002F1F80E090E008950E940F0E40E050E0D0 -:1006600069E070E080E091E00C94600F08950E94D2 -:1006700049036E9A769A8CE293E0892B11F00C94E0 -:100680002C03089586E393E0892B11F00C94360334 -:100690000895279A2F988FEF9FEF9093870080936C -:1006A00086008AE08093800089E1809381000C9429 -:1006B000113081110BC080918000877F8093800072 -:1006C00010928D0010928C002F9808952F988330EF -:1006D00041F4809180008860809380008FEF9FEFCD -:1006E00012C09091800098609093800023E030E0E9 -:1006F000281B3109220F331F8FEF9FEF02C0969501 -:1007000087952A95E2F790938D0080938C00089549 -:100710008B3B910568F4883A910530F5853A91054F -:10072000C0F48430910598F4019709F06FC071C04E -:10073000803E910508F46AC0883E910540F09C0116 -:10074000205F31092031310508F060C05CC09C0198 -:10075000A1C0853A910509F45FC0863A910509F474 -:100760005EC023E830E496C0883A910509F45AC087 -:10077000893A910509F459C08A3A910509F458C09B -:100780008B3A910509F457C08C3A910509F456C08B -:100790008D3A910509F455C0803B910509F454C088 -:1007A0008E3A910509F453C08F3A910509F452C06D -:1007B000813B910509F451C0823B910509F450C079 -:1007C000833B910509F44FC0843B910509F44EC069 -:1007D000853B910509F44DC0863B910509F44CC059 -:1007E000873B910509F44BC0883B910509F44AC049 -:1007F000893B910509F449C08A3B910509F048C03D -:100800002AE236E447C09C01306544C020E030E075 -:1008100041C021E030E03EC021E830E43BC022E8A6 -:1008200030E438C022EE34E435C029EE34E432C07E -:100830002AEE34E42FC025EB34E42CC026EB34E45C -:1008400029C027EB34E426C02CEC34E423C02DEC83 -:1008500034E420C023E835E41DC02AE835E41AC09A -:1008600022E935E417C024E935E414C021E236E476 -:1008700011C023E236E40EC024E236E40BC025E2C8 -:1008800036E408C026E236E405C027E236E402C0BA -:1008900020E034E4C90108959CE0799FF00111241F -:1008A0009CE3899FE00DF11D1124E60FF11DEE0F71 -:1008B000FF1FE25DFE4F25913491C9010895880F15 -:1008C000991F82559040FC0125913491C9010895EA -:1008D000880F991F825D9E4FFC0125913491C901BB -:1008E00008950E944C049C019A9581159F4110F433 -:1008F000C9010895C90190528115904128F4C90198 -:100900009F700E9468040895C90190538115904119 -:1009100020F4C9019927906C0895C901905440971B -:1009200028F4C9018F709927946D0895203180E4CF -:10093000380719F480E091ED0895213190E43907EA -:1009400019F480E090ED0895223140E4340719F461 -:1009500080E092ED0895233180E4380719F480E0B7 -:1009600093ED0895211590E5390799F40E945623D7 -:1009700040E065E088E491E00E94600F2FEF44E3DF -:100980008CE0215040408040E1F700C000000C9412 -:10099000FE29213090E5390731F48091F002816021 -:1009A0008093F0020895C90190558115904108F097 -:1009B00062C0432F55274F70552741305105F9F438 -:1009C000C90174E0880F991F7A95E1F78827937021 -:1009D000B901E3E0660F771FEA95E1F760767727C4 -:1009E000862B972B9C682370332702C0440F551F1A -:1009F0002A95E2F74F715527842B952B08954230A5 -:100A0000510529F4922F8827816F906A0895433009 -:100A10005105B9F4C90153E0880F991F5A95E1F7C0 -:100A2000807E97702370332741E050E002C0440F6E -:100A3000551F2A95E2F74F715527842B952B9C68FB -:100A400008954430510589F5C90143E0880F991F85 -:100A50004A95E1F7807E97702370332741E050E09C -:100A600002C0440F551F2A95E2F74F715527842B7A -:100A7000952B9A680895C90190568115904118F4F4 -:100A8000C901906F0895C90190578115904120F4D4 -:100A9000C9019F7090620895C901905881159041D5 -:100AA00020F4C9019F70906A0895203E3105E0F45A -:100AB000203C310568F52133310509F475C048F44F -:100AC0002932310509F46BC02A32310509F07BC0A7 -:100AD00075C02933310501F122383105E9F025339C -:100AE000310509F070C051C0233E3105B1F140F429 -:100AF000203E3105D1F0223E310509F064C01CC012 -:100B0000263E310579F1273E310509F05CC038C039 -:100B1000C9010E945F0408958091010380FD02C015 -:100B200081FF51C080EE90E04FC08091010380FFB3 -:100B3000F9CF89E390E048C08091010382FF0AC0A9 -:100B40008091010384FF03C080E090E03DC083EE0C -:100B500090E03AC082EE90E037C08091010382FFBE -:100B6000EFCFF8CF8091010383FF07C0809101038D -:100B700084FDEACF87EE90E027C086EE90E024C0A7 -:100B80008091010383FFF2CFF8CF8091010385FFAD -:100B900003C089E290E018C085E390E015C0809121 -:100BA000010385FDF9CFF5CF8091010386FF03C0D6 -:100BB0008AE290E009C081E390E006C080910103E1 -:100BC00086FDF9CFF5CFC9010E94880308950895E5 -:100BD0005F926F927F928F929F92AF92BF92CF92CD -:100BE000DF92EF92FF920F931F93CF93DF93CDB7D6 -:100BF000DEB72A970FB6F894DEBF0FBECDBF9E01B9 -:100C00002F5F3F4F4E018BE0880E911C60E070E03B -:100C100000E010E0E12CF12CC12CD12CA12CB12C46 -:100C20008AE0782E622E532E41E050E0E3E9F1E0B5 -:100C3000A62DB52D872D01900D928A95E1F7F9012A -:100C4000819191919F01FC01E07FFF27E032F10546 -:100C500059F48F709927FA0102C0EE0FFF1F8A9591 -:100C6000E2F7AE2ABF2A37C0E033F10559F48F709E -:100C70009927FA0102C0EE0FFF1F8A95E2F7CE2AEC -:100C8000DF2A29C0E034F10559F48F709927FA0161 -:100C900002C0EE0FFF1F8A95E2F7EE2AFF2A1BC063 -:100CA000E035F10559F48F709927FA0102C0EE0F73 -:100CB000FF1F8A95E2F70E2B1F2B0DC0E036F105C2 -:100CC00051F48F709927FA0102C0EE0FFF1F8A9529 -:100CD000E2F76E2B7F2B2815390509F0A7CF94B1C9 -:100CE0008A2D8095892384B985B18A2985B997B1E0 -:100CF0008C2D8095892387B988B18C2988B99AB1C0 -:100D00008E2D809589238AB98BB18E298BB99DB19F -:100D1000802F809589238DB98EB1802B8EB990B3A9 -:100D2000862F8095892380BB81B3862B81BB2A9631 -:100D30000FB6F894DEBF0FBECDBFDF91CF911F91EC -:100D40000F91FF90EF90DF90CF90BF90AF909F906A -:100D50008F907F906F905F9008955F926F927F92D7 -:100D60008F929F92AF92BF92CF92DF92EF92FF92BB -:100D70000F931F93CF93DF93CDB7DEB768970FB66E -:100D8000F894DEBF0FBECDBF85B7806885BF85B73D -:100D9000806885BF0E94E8059E012F5F3F4F4E018E -:100DA00089E1880E911C60E070E000E010E0E12C29 -:100DB000F12CC12CD12CA12CB12C98E1792E622ED2 -:100DC000532E41E050E0EDE9F1E0A62DB52D872D41 -:100DD00001900D928A95E1F7F901819191919F011E -:100DE000FC01E07FFF27E032F10559F48F7099276D -:100DF000FA0102C0EE0FFF1F8A95E2F7AE2ABF2A62 -:100E000037C0E033F10559F48F709927FA0102C019 -:100E1000EE0FFF1F8A95E2F7CE2ADF2A29C0E034C1 -:100E2000F10559F48F709927FA0102C0EE0FFF1FE8 -:100E30008A95E2F7EE2AFF2A1BC0E035F10559F446 -:100E40008F709927FA0102C0EE0FFF1F8A95E2F713 -:100E50000E2B1F2B0DC0E036F10551F48F70992732 -:100E6000FA0102C0EE0FFF1F8A95E2F76E2B7F2B6F -:100E70002815390509F0A7CF94B18A2D80958923CB -:100E800084B985B18A2985B997B18C2D809589233C -:100E900087B988B18C2988B99AB18E2D809589231C -:100EA0008AB98BB18E298BB99DB1802F809589230A -:100EB0008DB98EB1802B8EB990B3862F8095892302 -:100EC00080BB81B3862B81BB10922902109228022D -:100ED000109233021092320210922B0210922A02C8 -:100EE000109235021092340210922D0210922C02B0 -:100EF000109237021092360210922F0210922E0298 -:100F0000109239021092380210923102109230027F -:100F100010923B0210923A0287E393E0892BB9F0DA -:100F200068960FB6F894DEBF0FBECDBFDF91CF91AC -:100F30001F910F91FF90EF90DF90CF90BF90AF90F7 -:100F40009F908F907F906F905F900C94370368967E -:100F50000FB6F894DEBF0FBECDBFDF91CF911F91CA -:100F60000F91FF90EF90DF90CF90BF90AF909F9048 -:100F70008F907F906F905F9008955F926F927F92B5 -:100F80008F929F92AF92BF92CF92DF92EF92FF9299 -:100F90000F931F93CF93DF93CDB7DEB7A2970FB612 -:100FA000F894DEBF0FBECDBF7E0149E1E40EF11C17 -:100FB00022E3C22E22E0D22E5E0153E2A50EB11C26 -:100FC0003AE0532E470101E010E048E1642E55E07D -:100FD000752EE3E9F1E0D401852D01900D928A95FB -:100FE000E1F7F701819191917F019C01207F3327E7 -:100FF0002032310589F424B18F709927A80102C0ED -:10100000440F551F8A95E2F7CA01242B24B995B1E4 -:101010008095892385B94FC02033310589F427B1E4 -:101020008F709927F80102C0EE0FFF1F8A95E2F733 -:10103000CF012E2B27B998B18095892388B93BC061 -:101040002034310589F42AB18F709927A80102C094 -:10105000440F551F8A95E2F7CA01242B2AB99BB188 -:10106000809589238BB927C02035310589F42DB1AE -:101070008F709927F80102C0EE0FFF1F8A95E2F7E3 -:10108000CF012E2B2DB99EB1809589238EB913C027 -:101090002036310581F420B38F709927A80102C052 -:1010A000440F551F8A95E2F7CA01242B20BB91B348 -:1010B0008095892381BB50EA5A95F1F7BE016F5F95 -:1010C0007F4F80E090E020E030E0EDE9F1E0DE01EC -:1010D0001196462D01900D924A95E1F7FB01419141 -:1010E0005191BF01FA01E07FFF27E032F10511F4D1 -:1010F000E3B113C0E033F10511F4E6B10EC0E03402 -:10110000F10511F4E9B109C0E035F10511F4ECB1D4 -:1011100004C0E036F105B9F4EFB1F0E04F705527A7 -:1011200002C0F595E7954A95E2F7E0FD08C0A801F1 -:10113000022E02C0440F551F0A94E2F702C040E09D -:1011400050E0842B952B2F5F3F4F2C30310509F059 -:10115000BCCFF601208131812817390721F0918316 -:101160008083709270010E94E805F2E0CF0ED11CDE -:10117000EA14FB0409F02DCF809170018823A1F1BE -:10118000815080937001882339F08FE99FE00197A7 -:10119000F1F700C0000028C0809132029091330224 -:1011A0009093290280932802809134029091350215 -:1011B00090932B0280932A028091360290913702FD -:1011C00090932D0280932C028091380290913902E5 -:1011D00090932F0280932E0280913A0290913B02CD -:1011E000909331028093300282E493E0892B11F0D6 -:1011F0000E94420381E0A2960FB6F894DEBF0FBEB4 -:10120000CDBFDF91CF911F910F91FF90EF90DF90B5 -:10121000CF90BF90AF909F908F907F906F905F9096 -:101220000895E82FF0E0EE0FFF1FE85DFD4F80818D -:10123000918108950895CF92DF92EF92FF920F93DC -:101240001F93CF93DF93CDB7DEB7CC5BD2400FB601 -:10125000F894DEBF0FBECDBF8C01862F642F88238C -:1012600079F0F80192812FE7482F992329F083E044 -:1012700093E00E94C41904C083E093E00E94D41953 -:10128000F80180818B3091F59181943009F0A8C2EA -:101290009281809173019923B1F08F5F80937301E4 -:1012A00096E4E5EBF1E0DE01A958BD4F01900D9207 -:1012B0009A95E1F7E0917101F0917201EE0FFF1F35 -:1012C00027E732E036C096E4E5EBF1E0DE01AF5C03 -:1012D000BD4F01900D929A95E1F7E0917101F09167 -:1012E0007201EE0FFF1F21E332E093C08A3009F054 -:1012F000CBC0F8019181943009F072C29281809143 -:101300007301992309F473C081508093730196E4AB -:10131000E5EBF1E0DE01A551BE4F01900D929A95EB -:10132000E1F7E0917101F0917201EE0FFF1F2BEEDA -:1013300031E02C0F3D1FE20FF31F60817181680FB8 -:10134000711D882777FD8095982F0E94AC3120E091 -:1013500030E040E451E40E94113120E030E040E808 -:1013600050E40E94A9309B01AC0160E070E080E095 -:1013700090E40E94C33221E230ED42E053E40E9447 -:1013800060324CE050E00E94BB0F20E04BE760E091 -:1013900083E093E00E94B41920E04BE761E083E032 -:1013A00093E00E94B41920E04BE762E083E093E011 -:1013B0000E94B41920E04BE763E083E093E00E94D1 -:1013C000B41920E04BE764E083E093E0C454DD4FC0 -:1013D0000FB6F894DEBF0FBECDBFDF91CF911F9146 -:1013E0000F91FF90EF90DF90CF900C94B41996E49A -:1013F000E5EBF1E0DE01AB55BE4F01900D929A9501 -:10140000E1F7E0917101F0917201EE0FFF1F25EA03 -:1014100031E02C0F3D1FE20FF31F60817181680FD7 -:10142000711D882777FD8095982F0E94AC3120E0B0 -:1014300030E040E451E40E94113120E030E040E827 -:1014400050E40E94A9309B01AC0160E070E080E0B4 -:1014500090E40E94C33221E230ED42E053E40E9466 -:1014600060320E94EB0CC454DD4F0FB6F894DEBF1F -:101470000FBECDBFDF91CF911F910F91FF90EF90E5 -:10148000DF90CF900C94BE0C893009F0D3C0F801E6 -:101490009181943009F0A4C19281992309F4A0C1EB -:1014A00080917101909172010196909372018093E5 -:1014B000710120E04BE760E083E093E00E94B41903 -:1014C00020E04BE761E083E093E00E94B41920E064 -:1014D0004BE762E083E093E00E94B41920E04BE721 -:1014E00063E083E093E00E94B41920E04BE764E0FE -:1014F00083E093E00E94B4190E94BE0C00E010E06B -:10150000E6E4FE2E80917301E5EBF1E0DE01A15AE5 -:10151000BE4F9F2D01900D929A95E1F7E0917101D8 -:10152000F0917201E00FF11FEE0FFF1F2FE531E088 -:101530002C0F3D1FE20FF31F60817181680F711D39 -:10154000882777FD8095982F0E94AC3120E030E00D -:1015500040E451E40E94113120E030E040E850E4E2 -:101560000E94A9309B01AC0160E070E080E090E453 -:101570000E94C33221E230ED42E053E40E94603227 -:101580004CE050E00E94BB0F3FEF87EE93E03150FC -:1015900080409040E1F700C0000080917301E5EBCE -:1015A000F1E0DE01A75EBE4F9F2D01900D929A954E -:1015B000E1F7E0917101F0917201E00FF11FEE0F80 -:1015C000FF1F29E131E02C0F3D1FE20FF31F608167 -:1015D0007181680F711D882777FD8095982F0E9473 -:1015E000AC3120E030E040E451E40E94113120E0D1 -:1015F00030E040E850E40E94A9309B01AC0160E07B -:1016000070E080E090E40E94C33221E230ED42E0DD -:1016100053E40E9460320E94EB0C8FEF9CE701972D -:10162000F1F700C000000F5F1F4F0830110509F0EF -:1016300069CF94C1883009F0D3C0F801918194300A -:1016400009F0CEC09281992309F4CAC0809171013A -:10165000909172010197909372018093710120E043 -:101660004BE760E083E093E00E94B41920E04BE791 -:1016700061E083E093E00E94B41920E04BE762E070 -:1016800083E093E00E94B41920E04BE763E083E03D -:1016900093E00E94B41920E04BE764E083E093E01C -:1016A0000E94B4190E94BE0C00E010E056E4F52E32 -:1016B00080917301E5EBF1E0DE01AD52BF4F9F2D4C -:1016C00001900D929A95E1F7E0917101F09172010C -:1016D000E00FF11FEE0FFF1F23ED30E02C0F3D1F39 -:1016E000E20FF31F60817181680F711D882777FDFC -:1016F0008095982F0E94AC3120E030E040E451E426 -:101700000E94113120E030E040E850E40E94A9300E -:101710009B01AC0160E070E080E090E40E94C33285 -:1017200021E230ED42E053E40E9460324CE050E0B0 -:101730000E94BB0F3FEF87EE93E031508040904016 -:10174000E1F700C0000080917301E5EBF1E0DE01FC -:10175000A357BF4F9F2D01900D929A95E1F7E0910D -:101760007101F0917201E00FF11FEE0FFF1F2DE8E4 -:1017700030E02C0F3D1FE20FF31F60817181680F75 -:10178000711D882777FD8095982F0E94AC3120E04D -:1017900030E040E451E40E94113120E030E040E8C4 -:1017A00050E40E94A9309B01AC0160E070E080E051 -:1017B00090E40E94C33221E230ED42E053E40E9403 -:1017C00060320E94EB0C8FEF9CE70197F1F700C0AD -:1017D00000000F5F1F4F0830110509F069CFBEC030 -:1017E000F801228190917301222309F45DC026E45F -:1017F000E5EBF1E0DE01A95BBF4F01900D922A9568 -:10180000E1F7E0917101F0917201E80FF11DEE0F27 -:10181000FF1F27E430E02C0F3D1FE20FF31F608114 -:101820007181690F711D882777FD8095982F0E941F -:10183000AC3120E030E040E451E40E9411316B0112 -:101840007C01F801818165E070E0681B71098827DF -:1018500077FD8095982F0E94AC319B01AC01C701A8 -:10186000B6010E94A9309B01AC0160E070E080E00D -:1018700090E40E94C33221E230ED42E053E40E9442 -:1018800060324FE050E0C454DD4F0FB6F894DEBF35 -:101890000FBECDBFDF91CF911F910F91FF90EF90C1 -:1018A000DF90CF900C94BB0F26E4E5EBF1E0DE0176 -:1018B000119601900D922A95E1F7E0917101F09156 -:1018C0007201E80FF11DEE0FFF1F21E030E02C0F39 -:1018D0003D1FE20FF31F60817181690F711D882721 -:1018E00077FD8095982F0E94AC3120E030E040E4F5 -:1018F00051E40E9411316B017C01F801818165E0A6 -:1019000070E0681B7109882777FD8095982F0E94E9 -:10191000AC319B01AC01C701B6010E94A9309B010B -:10192000AC0160E070E080E090E40E94C33221E20C -:1019300030ED42E053E40E946032C454DD4F0FB6F4 -:10194000F894DEBF0FBECDBFDF91CF911F910F91F5 -:10195000FF90EF90DF90CF900C94EB0CC454DD4FD0 -:101960000FB6F894DEBF0FBECDBFDF91CF911F91B0 -:101970000F91FF90EF90DF90CF9008951092870223 -:1019800010928602809171008D7F8093710080910A -:1019900090008F7780939000109248021092470237 -:1019A00010928002109281021092820210928302A1 -:1019B00010927F0210927E02EEE5F2E0AEE4B2E019 -:1019C00011921192119211921D921D9282E0EE37A6 -:1019D000F807B1F708956F927F928F929F92AF921E -:1019E000BF92CF92DF92EF92FF920F931F93CF930C -:1019F000DF936B017C010EE712E04CE5A42E42E080 -:101A0000B42EC7E0D0E0A7019601F801929182912F -:101A1000729162918F010E940D31882349F02197C4 -:101A2000F2E0AF1AB108CF3F8FEFD80761F734C0AB -:101A3000F8011082118212821382F5011182108244 -:101A4000FE01EE0FFF1FEE0FFF1FE25AFD4FDE01FA -:101A5000AA0FBB1FA25BBD4FCE011AC001964481E5 -:101A600055816681778140835183628373831482B9 -:101A700015821682178212962D913C91139711961A -:101A80003C932E9313961C921E92129734961296A4 -:101A90008730910519F7C3CF809186029091870214 -:101AA000019797FD05C0909387028093860204C03A -:101AB0001092870210928602E0918602F0918702CE -:101AC0003097C9F4809171008D7F8093710080916F -:101AD00090008F7780939000109280021092810284 -:101AE000109282021092830210927F0210927E0264 -:101AF0001092470285C03197DF01AA0FBB1FAA0FC2 -:101B0000BB1FA25ABD4FCD90DD90ED90FC90EE0F23 -:101B1000FF1FE25BFD4FC081D18160908002709019 -:101B200081028090820290908302A7019601662D27 -:101B3000772D882D992D0E940D3187FF25C0262DE8 -:101B4000372D482D592DC701B6010E94A83020E03D -:101B500030E04AEF54E40E9411315B018C012A2DE0 -:101B60003B2D402F512F662D772D882D992D0E94CA -:101B7000A9303B014C01A7019601772D992D0E94B8 -:101B80000D31181664F72EC0A7019601662D772D2A -:101B9000882D992D0E945C32181634F5A701960104 -:101BA000662D772D882D992D0E94A83020E030E0F9 -:101BB0004AEF54E40E9411315B018C012A2D3B2D28 -:101BC000402F512F662D772D882D992D0E94A830FA -:101BD0003B014C01A7019601772D992D0E945C32A3 -:101BE00087FFECCF10924D02C0928002D09281020A -:101BF000E0928202F0928302D0937F02C0937E0231 -:101C0000DF91CF911F910F91FF90EF90DF90CF90D8 -:101C1000BF90AF909F908F907F906F9008953E9A65 -:101C2000E1E7F0E080818D7F808382E08093900007 -:101C30008AE18093910008951F920F920FB60F9240 -:101C40001124CF92DF92EF92FF922F933F934F9305 -:101C50005F936F937F938F939F93AF93BF93CF9334 -:101C6000DF93EF93FF9380914702882309F479C0B3 -:101C700020E030E0A90160918002709181028091A2 -:101C80008202909183020E945C3218160CF069C0A7 -:101C900020E030E040E251E46091490270914A0254 -:101CA00080914B0290914C020E945C321816BCF459 -:101CB00080918402909185020196609186027091D4 -:101CC00087020E9448349093850280938402109288 -:101CD000490210924A0210924B0210924C02C0919B -:101CE0008402D0918502CC0FDD1FCC0FDD1FC25ABC -:101CF000DD4F288139814A815B8160E074E284E7AD -:101D00009BE40E9411310E94793170939700609397 -:101D10009600288139814A815B8160E074E284E722 -:101D20009BE40E9411310E947931759567957093FB -:101D300099006093980020E030E040E85FE3609114 -:101D4000490270914A0280914B0290914C020E948C -:101D5000A9306093490270934A0280934B0290939A -:101D60004C0280914802882309F493C0C09043023A -:101D7000D0904402E0904502F090460220E030E02E -:101D8000A901C701B6010E945C321816F4F4A7013C -:101D9000960160E074E284E79BE40E9411310E94A6 -:101DA00079317093970060939600A701960160E0E7 -:101DB00074E284E79BE40E9411310E9479317595A9 -:101DC0006795709399006093980060913D027091BF -:101DD0003E026F5F7F4F70933E0260933D0280E052 -:101DE00090E00E94AA3120913F0230914002409140 -:101DF0004102509142020E945C3287FD4AC08091AC -:101E00003C028F5F80933C029091F0038917A0F011 -:101E10008091F503882319F010923C020DC0809147 -:101E200071008D7F80937100809190008F778093F7 -:101E30009000109248022DC0E091F103F091F2035E -:101E400080913C0298E0899FE00DF11D1124808172 -:101E50009181A281B3818093430290934402A09325 -:101E60004502B093460220E030E040E85EE3648142 -:101E70007581868197810E94603260933F027093E2 -:101E80004002809341029093420210923E021092CF -:101E90003D02FF91EF91DF91CF91BF91AF919F9163 -:101EA0008F917F916F915F914F913F912F91FF9013 -:101EB000EF90DF90CF900F900FBE0F901F9018956E -:101EC0000F931F93CF93DF9300D0CDB7DEB78C0174 -:101ED00080914702882331F04A8369830E94BE0CB7 -:101EE00069814A8181E0809348021093F203009354 -:101EF000F1036093F0034093F503109249021092AE -:101F00004A0210924B0210924C0210923C02F801CD -:101F10004081518162817381409343025093440216 -:101F2000609345027093460220E030E040E85EE3B3 -:101F300064817581868197810E94603260933F023F -:101F400070934002809341029093420210923E02AD -:101F500010923D02809171008260809371008091A7 -:101F600090008068809390000F900F90DF91CF9148 -:101F70001F910F9108956F927F928F929F92AF92CF -:101F8000BF92CF92DF92EF92FF920F931F93CF9366 -:101F9000DF936B017C01EA018091480281110E946C -:101FA000BE0C81E08093470220E030E0A901C70128 -:101FB000B6010E945C3218160CF09AC06090800244 -:101FC00070908102809082029090830220E030E045 -:101FD000A901662D772D882D992D0E940D31811133 -:101FE00028C0C0928002D0928102E0928202F092D8 -:101FF0008302D0937F02C0937E02809186029091EB -:102000008702FC01EE0FFF1FEE0FFF1FE25AFD4F8C -:10201000C082D182E282F382FC01EE0FFF1FE25BFD -:10202000FD4FD183C08301969093870280938602EF -:102030005FC0A7019601662D772D882D992D0E94EE -:102040000D3187FF25C0262D372D482D592DC7016D -:10205000B6010E94A83020E030E04AEF54E40E942C -:1020600011315B018C012A2D3B2D402F512F662D04 -:10207000772D882D992D0E94A9303B014C01A70195 -:102080009601772D992D0E940D31181664F7A9CF6E -:10209000A7019601662D772D882D992D0E945C321F -:1020A00018160CF09ECFA7019601662D772D882D6E -:1020B000992D0E94A83020E030E04AEF54E40E94BD -:1020C00011315B018C012A2D3B2D402F512F662DA4 -:1020D000772D882D992D0E94A8303B014C01A70136 -:1020E0009601772D992D0E945C3287FFECCF79CF36 -:1020F000809171008260809371008091900080686F -:1021000080939000DF91CF911F910F91FF90EF90FE -:10211000DF90CF90BF90AF909F908F907F906F9007 -:102120000895809191020895CF93DF9300D01F927C -:10213000CDB7DEB72091FA03243021F523E02983BF -:102140009B838A832093E9008FEF06C095ED9A95D3 -:10215000F1F70000882329F09091E800815095FF65 -:10216000F5CF8091E80085FF0DC040E050E063E0CE -:1021700070E0CE0101960E947E148091E8008E7777 -:102180008093E8000F900F900F90DF91CF9108950A -:10219000CF93DF9300D01F92CDB7DEB72091FA0323 -:1021A000243029F522E029839B838A8383E080936E -:1021B000E9008FEF06C095ED9A95F1F700008823AE -:1021C00029F09091E800815095FFF5CF8091E800CB -:1021D00085FF0DC040E050E063E070E0CE01019665 -:1021E0000E947E148091E8008E778093E8000F9023 -:1021F0000F900F90DF91CF9108952091FA03243032 -:10220000F9F422E02093E9002FEF06C035ED3A956E -:10221000F1F70000222329F03091E800215035FF2A -:10222000F5CF2091E80025FF0BC040E050E065E0CD -:1022300070E00E947E148091E8008E778093E80021 -:102240000895CF93DF93EC018091FA03843041F538 -:1022500081E08093E9008FEF06C095ED9A95F1F744 -:102260000000882329F09091E800815095FFF5CF78 -:102270008091E80085FF14C040E050E068E070E025 -:10228000CE010E947E148091E8008E778093E80052 -:1022900088E0FE01A9E8B2E001900D928A95E1F78D -:1022A000DF91CF910895BF92CF92DF92EF92FF928C -:1022B0000F931F93CF93DF937C01B62EE90100E0CB -:1022C00010E0C42ED12C0BC04991202F2B0D2F775D -:1022D0004F776FE0C7010E94B4190F5F1F4F0C15B5 -:1022E0001D0594F3DF91CF911F910F91FF90EF9017 -:1022F000DF90CF90BF90089570E06F5F7F4F6F7059 -:1023000077270C94B4190F931F93CF93C42F633086 -:10231000710509F04AC0842F807F803849F18039E7 -:1023200009F043C0622F6F7770E080E090E00E9478 -:10233000AC3120E030E040E451E40E9411319B01D7 -:10234000AC0160E070E080E090E40E94C3320F775F -:1023500010E023E0159507952A95E1F72DEC3CEC6C -:1023600042E053E40E946032A8010E94BB0F1DC0EE -:10237000622F6F7770E080E090E00E94AC3120E047 -:1023800030E040E451E40E9411319B01AC0160E077 -:1023900070E080E090E40E94C3322DEC3CEC42E01F -:1023A00053E40E9460320E94EB0CCC3F29F4CF91A1 -:1023B0001F910F910C94BE0CCF911F910F91089516 -:1023C0000F931F93CF93DF93CDB7DEB727970FB649 -:1023D000F894DEBF0FBECDBF8C0114C08A810E946D -:1023E0008E199A819D839B819E839C819F838111FD -:1023F0001EC089818430B1F08730A1F08630A1F011 -:102400008530A1F0BE016F5F7F4F84E791E00E94AD -:10241000FB1C8111E3CF84E791E00E94EC1C0E9439 -:1024200067190DC083E003C082E001C081E0AE0106 -:102430004B5F5F4F682FC8010E94211AE3CF279698 -:102440000FB6F894DEBF0FBECDBFDF91CF911F91C5 -:102450000F910895EF92FF920F93CF93DF9300D0E7 -:1024600000D000D0CDB7DEB77B014A832B830C832D -:10247000842F2E834D830E948E192E814D818111D0 -:102480001BC082E0E816F10479F083E0E816F1045D -:1024900021F0EA94EF2821F50BC0073F11F487E003 -:1024A00001C084E089830BC0273FD9F786E0FACFCB -:1024B000473FB9F785E0F6CF42954F704983BE019B -:1024C0006F5F7F4F84E791E00E94B11C84E791E049 -:1024D0000E94CF1C84E791E00E94EC1C0E946719C7 -:1024E00026960FB6F894DEBF0FBECDBFDF91CF9119 -:1024F0000F91FF90EF9008958091F903811109C029 -:102500000E946D160E94CA168091E200846080933A -:10251000E20008951092F9030895089508950C9427 -:102520006129809192028F5F8093920262E30E9400 -:102530002834911135C01092920280919302882321 -:1025400079F18091FA03843049F58091E9008F7028 -:102550009091EC0090FF02C090E801C090E0982BB1 -:1025600084E08093E9008091EB0080FF14C08091AB -:10257000EE0087FD03C00FC01092F1008091E800CB -:1025800085FDFACF8091E80080FF05C08091E800CA -:102590008E778093E8009F709093E90010929302E9 -:1025A000089542E061EC81E00E94E31542E061ECB5 -:1025B00082E00E94E31542E061EC83E00E94E315B3 -:1025C00042E261EC84E00E94E31542E361E885E0C9 -:1025D0000E94E31542E360E886E00C94E3158091E5 -:1025E000FC03833009F454C030F4813071F0823040 -:1025F00009F0A5C08CC08A3009F479C08B3009F489 -:102600005FC0893009F09BC020C08091FB03813AF4 -:1026100009F095C08091E800877F8093E800809161 -:10262000FF0390910004892B21F060E080E090E0AE -:1026300003C068E089E892E070E00E941C15809178 -:10264000E8008B778093E80008958091FB03813246 -:1026500009F075C08091FF0390910004892B09F067 -:102660006EC08091E800877F8093E80005C080916C -:10267000FA03882309F463C08091E80082FFF7CF52 -:102680008091F100809391028091E8008B7753C094 -:102690008091FB03813A09F052C08091FF03909131 -:1026A0000004892B09F04BC08091E800877F80935C -:1026B000E8008091E80080FFFCCF80918A0136C05D -:1026C0008091FB038132D9F58091FF039091000442 -:1026D000892BA9F58091E800877F8093E8000E940C -:1026E0001A168091FD0380938A010C9456238091E1 -:1026F000FB03813221F58091E800877F8093E80019 -:102700000E941A168091FE0380938802089580919A -:10271000FB03813AA1F48091E800877F8093E80071 -:102720008091E80080FFFCCF809188028093F100C7 -:102730008091E8008E778093E8000C941A16089533 -:1027400083E093E00E94F0196AE272E183E093E093 -:102750000E94461A60EE71E183E093E00E944A1AFB -:1027600084B7877F84BF88E10FB6F89480936000B8 -:10277000109260000FBE90E080E80FB6F89480934E -:102780006100909361000FBE0E94741D0E946D163F -:102790000E94CA168091E20084608093E2007894DF -:1027A00063E871E183E093E00E94EC196CE771E16A -:1027B00083E093E00E94E41963E571E183E093E034 -:1027C0000E94E8190E940F0E0E9467190E94761D50 -:1027D00080E891E00E94201D0BC00E941E2980917C -:1027E000F803882329F00E94492981110E94681466 -:1027F0008091FA03853089F383E093E00E94F91B0E -:102800000E94801DF5CF292F332723303105B1F0E9 -:102810004CF42130310509F44DC02230310509F066 -:102820004EC007C02132310541F12232310591F10C -:1028300046C0E0EDF0E084EE93E045C0992781309A -:10284000910569F08230910589F0892B09F037C034 -:10285000E0EEF3E0E491F0E080EE93E034C0E2EBF0 -:10286000F3E0E491F0E082EB93E02DC0E6E8F3E0E2 -:10287000E491F0E086E893E026C0643000F5E62FAE -:10288000F0E0EE0FFF1FE550FE4F80819181E9E0FF -:10289000F0E019C0643098F4E62FF0E0DF01AA0FF1 -:1028A000BB1FAD5FBD4F8D919C91E55FFD4FE081FA -:1028B000F0E009C0E2E1F0E084EB94E004C0E0E085 -:1028C000F0E080E090E0DA018D939C93CF010895D1 -:1028D00080E189BD82E189BD09B400FEFDCF809110 -:1028E000D8008F7D8093D8008091E0008260809333 -:1028F000E0008091E00081FDFCCF0895BF92CF926F -:10290000DF92EF92FF920F931F93CF93DF937C019F -:102910008B01EA010E943B16B82E811133C020972B -:1029200031F028813981021B130BE20EF31EC12CFA -:10293000D12C23C08091E80085FD15C08091E8006E -:102940008E778093E800209749F0888199818C0DDB -:102950009D1D9983888325E0B22E14C00E943B16EA -:10296000882359F00EC0F70181917F018093F10017 -:1029700001501109FFEFCF1ADF0A01151105D1F639 -:1029800001C0B82E8B2DDF91CF911F910F91FF9039 -:10299000EF90DF90CF90BF900895BF92CF92DF92DB -:1029A000EF92FF920F931F93CF93DF937C018B01E4 -:1029B000EA010E943B16B82E811133C0209731F0F6 -:1029C00028813981021B130BE20EF31EC12CD12C7E -:1029D00023C08091E80085FD15C08091E8008B77C9 -:1029E0008093E800209749F0888199818C0D9D1D86 -:1029F0009983888345E0B42E14C00E943B16882337 -:102A000059F00EC08091F100F70181937F010150D0 -:102A10001109FFEFCF1ADF0A01151105D1F601C028 -:102A2000B82E8B2DDF91CF911F910F91FF90EF90DA -:102A3000DF90CF90BF90089540910104509102041F -:102A40004617570748F06115710539F44091E800C1 -:102A50004E774093E80001C0BA01FC0140E033C06A -:102A60008091FA03882309F444C0853009F443C0F7 -:102A70008091E80083FD41C08091E80082FD33C071 -:102A80008091E80080FF1FC09091F3008091F200D8 -:102A9000392F20E0A901482BCA0106C0419140937B -:102AA000F1006150710901966115710519F08830C6 -:102AB0009105A0F341E0089709F040E08091E8001B -:102AC0008E778093E8006115710551F64111C8CFEA -:102AD0000AC08091FA03882361F0853061F080910B -:102AE000E80083FD0AC08091E80082FFF2CF80E019 -:102AF000089582E0089583E0089581E0089540916B -:102B00000104509102044617570748F061157105FA -:102B100039F44091E8004E774093E80001C0BA01D3 -:102B2000FC0140E034C08091FA03882309F445C0D9 -:102B3000853009F444C08091E80083FD42C0809153 -:102B4000E80082FD34C08091E80080FF20C09091B1 -:102B5000F3008091F200392F20E0A901482BCA012F -:102B600007C044914093F10031966150710901967C -:102B70006115710519F08830910598F341E00897C7 -:102B800009F040E08091E8008E778093E8006115BD -:102B9000710549F64111C7CF0AC08091FA03882315 -:102BA00061F0853061F08091E80083FD0AC080917A -:102BB000E80082FFF2CF80E0089582E0089583E08C -:102BC000089581E00895982F2CC09093E9009817FC -:102BD00039F07091EC002091ED005091F00003C0AD -:102BE000242F762F50E021FD02C09F5F1AC0309144 -:102BF000EB003E7F3093EB003091ED003D7F309352 -:102C0000ED003091EB0031603093EB007093EC00FD -:102C10002093ED005093F0002091EE0027FDE5CFCA -:102C200007C0973090F28F708093E90081E008959B -:102C300080E008958091FB0387FD05C08091E80046 -:102C400080FF0EC012C08091E80082FD05C0809117 -:102C5000FA038111F8CF08958091E8008B7708C0BE -:102C60008091FA038111EACF08958091E8008E7770 -:102C70008093E80008958091E4009091E50045E696 -:102C80002091EC0020FD1FC023C02091FA032223D5 -:102C900091F0253091F02091EB0025FD10C020919E -:102CA000E4003091E5002817390751F34150C9017C -:102CB00039F784E0089582E0089583E0089581E083 -:102CC000089580E008952091E80020FFDECFF9CF3D -:102CD0002091E80022FFD9CFF4CF0E94DB160E949A -:102CE000E316E0EEF0E0808181608083E8EDF0E0C3 -:102CF00080818F77808319BCA7EDB0E08C918E7FA7 -:102D00008C9380818F7E80831092F90308950F93B6 -:102D10001F93CF93DF930E94DB160E94E316C8ED4A -:102D2000D0E088818F7788838881806888838881D4 -:102D30008F7D888319BC1092FA031092F6031092CB -:102D4000F8031092F70300EE10E0F80180818B7F0A -:102D5000808388818160888342E060E080E00E9417 -:102D6000E315E1EEF0E080818E7F8083E2EEF0E01B -:102D7000808181608083808188608083F801808188 -:102D80008E7F8083888180618883DF91CF911F91BE -:102D90000F910895E8EDF0E080818F7E8083E7ED6C -:102DA000F0E080818160808384E082BF81E0809355 -:102DB000F9030C948716E8EDF0E080818E7F808324 -:102DC0001092E20008951092DA001092E100089546 -:102DD0001F920F920FB60F9211242F933F934F9390 -:102DE0005F936F937F938F939F93AF93BF93EF9373 -:102DF000FF938091E10082FF0BC08091E20082FF8F -:102E000007C08091E1008B7F8093E1000E949112C6 -:102E10008091DA0080FF1FC08091D80080FF1BC026 -:102E20008091DA008E7F8093DA008091D90080FF54 -:102E30000DC080E189BD82E189BD09B400FEFDCFEE -:102E400081E08093FA030E947C1205C019BC1092A5 -:102E5000FA030E948A128091E10080FF19C08091DC -:102E6000E20080FF15C08091E2008E7F8093E20037 -:102E70008091E20080618093E2008091D8008062BE -:102E80008093D80019BC85E08093FA030E948E12CB -:102E90008091E10084FF30C08091E20084FF2CC06B -:102EA00080E189BD82E189BD09B400FEFDCF80913A -:102EB000D8008F7D8093D8008091E1008F7E809331 -:102EC000E1008091E2008F7E8093E2008091E20039 -:102ED00081608093E2008091F603882311F084E002 -:102EE00007C08091E30087FF02C083E001C081E05A -:102EF0008093FA030E948F128091E10083FF29C022 -:102F00008091E20083FF25C08091E100877F80935C -:102F1000E10082E08093FA031092F6038091E100D1 -:102F20008E7F8093E1008091E2008E7F8093E200AB -:102F30008091E20080618093E20042E060E080E006 -:102F40000E94E3158091F00088608093F0000E9459 -:102F50008D12FF91EF91BF91AF919F918F917F91D2 -:102F60006F915F914F913F912F910F900FBE0F90F6 -:102F70001F9018951F920F920FB60F9211242F9346 -:102F80003F934F935F936F937F938F939F93AF93F1 -:102F9000BF93CF93EF93FF938091E9008F7090914F -:102FA000EC0090FF02C090E801C090E0C92FC82B50 -:102FB0001092E9008091F000877F8093F000789470 -:102FC0000E94FE171092E9008091F00088608093C3 -:102FD000F000CF70C093E900FF91EF91CF91BF91C6 -:102FE000AF919F918F917F916F915F914F913F91A1 -:102FF0002F910F900FBE0F901F9018951F93CF9396 -:10300000DF93CDB7DEB7AC970FB6F894DEBF0FBE37 -:10301000CDBFEBEFF3E08091F100819324E0E3304A -:10302000F207C9F70E94EF128091E80083FF37C1D1 -:103030008091FB039091FC03953009F488C038F42B -:103040009130B1F170F0933009F029C131C098305E -:1030500009F4F8C0993009F404C1963009F01FC191 -:103060009DC0803821F0823809F019C108C08091D4 -:10307000F7039091F803992389F082600FC0809143 -:10308000FF03909100048F7099278093E90080914D -:10309000EB0085FB882780F91092E9009091E80009 -:1030A000977F9093E8008093F1001092F100D5C0D3 -:1030B000882319F0823009F0F2C08F7121F082303C -:1030C00009F0EDC00BC08091FD03813009F0E7C02D -:1030D000933009F080E08093F8032FC08091FD03C6 -:1030E00081112BC08091FF03909100048F7099276C -:1030F000009709F4D4C08093E9002091EB0020FFF1 -:103100001CC02091FC03233021F48091EB008062ED -:1031100012C09091EB0090619093EB0021E030E0C1 -:1031200001C0220F8A95EAF72093EA001092EA0084 -:103130008091EB0088608093EB001092E900809111 -:10314000E800877F8093E8000E941A16A8C08111CA -:10315000A6C08091FD039091FE038F779927182FC9 -:103160009091E3009078982B9093E3008091E80091 -:10317000877F8093E8000E941A168091E80080FF04 -:10318000FCCF8091E30080688093E300112311F06D -:1031900083E001C082E08093FA0381C080588230CE -:1031A00008F07DC08091FD039091FE038C3D23E0EB -:1031B000920779F583E08A838AE289834FB7F8948E -:1031C000DE01139620E03EE051E2E32FF0E0509361 -:1031D0005700E49120FF03C0E295EF703F5FEF706E -:1031E0008E2F90E0EA3010F0C79601C0C0968D9304 -:1031F0009D932F5F243149F74FBF8091E800877F6F -:103200008093E8006AE270E0CE0101960E941C15EE -:1032100013C0AE01455D5F4F6091FF030E94031430 -:103220000097E9F12091E800277F2093E800BC0196 -:103230008BA59CA50E947F158091E8008B778093D9 -:10324000E8002DC0803859F58091E800877F809391 -:10325000E8008091F6038093F1008091E8008E777A -:1032600071CF81111CC09091FD039230C0F4809108 -:10327000E800877F8093E8009093F6030E941A1677 -:103280008091F603811104C08091E30087FF02C0A2 -:1032900084E001C081E08093FA030E94D112809102 -:1032A000E80083FF0AC08091E800877F8093E800F0 -:1032B0008091EB0080628093EB00AC960FB6F8949F -:1032C000DEBF0FBECDBFDF91CF911F910895CF9389 -:1032D0008091FA038823B1F08091E9008F7090917A -:1032E000EC0090FF02C090E801C090E0C92FC82B0D -:1032F0001092E9008091E80083FD0E94FE17CF70D4 -:10330000C093E900CF910895881F8827881F0895EA -:1033100091E0883F08F490E0892F0895982F907FDE -:10332000903B99F038F4903981F0903A71F09038F0 -:10333000C9F40BC0903DA1F018F4903C99F410C072 -:10334000903E19F0903F71F402C083E00895E82F99 -:10335000E15FEF3038F4F0E0E15FFD4F80810895E8 -:1033600082E0089580E008950F932F774F776F7074 -:10337000606BDC01ED91FC91022F242F462F63E05E -:1033800070E009950F9108950F932F774F776F7025 -:103390006069DC01ED91FC91022F242F462F63E040 -:1033A00070E009950F9108950F932F774F776F7005 -:1033B0006068DC01ED91FC91022F242F462F63E021 -:1033C00070E009950F910895FC017383628308955D -:1033D000FC01738F628F0895FC01758F648F0895CF -:1033E000CF93DF93EC011DA21FA21EA2BC01685D5A -:1033F0007F4F40EC88519F4F0E942D1C1B821A82E8 -:103400001D821C821F821E82198618861B861A86C0 -:103410001D861C861F861E86198A188A1B8A1A8A90 -:103420001D8A1C8A1F8A1E8A198E188E1B8E1A8E60 -:103430001D8E1C8E1F8E1E8E19A218A2DF91CF9199 -:103440000895CF92DF92FF920F931F93CF93DF9354 -:103450001F92CDB7DEB7F62E6A018C0108511F4FBF -:1034600008C0F60161916F01C80149830E94341CB4 -:1034700049818C2D841B8F15A0F30F90DF91CF9184 -:103480001F910F91FF90DF90CF900895FC01718301 -:1034900060830895FC0171A360A30895AF92BF9269 -:1034A000CF92DF92EF92FF920F931F93CF93DF9310 -:1034B00000D01F92CDB7DEB77C016B01142FB22E66 -:1034C000A02EDC0195968C9195978430F1F45A9654 -:1034D000ED91FC915B97309709F4D8C0CB0101972F -:1034E00063E070E00E943434DB01AA0FBB1FA60F1B -:1034F000B71F49832A830B834C2D4A1B9E012F5FE4 -:103500003F4FBD01C7010995B1C06230710509F493 -:1035100053C06330710529F06130710509F09CC01A -:1035200083C0842F807F803A01F130F48038B9F075 -:10353000803909F0ABC00DC0803EE9F0803F09F151 -:10354000803B09F0A3C0D7011296ED91FC9113972F -:1035500023C0D7011496ED91FC9115971DC0D7019A -:103560001696ED91FC91179717C0D7011896ED911B -:10357000FC91199711C0D7011A96ED91FC911B97F8 -:103580000BC0423F09F082C0D7011C96ED91FC911F -:103590001D97309731F47AC0309709F477C0123F05 -:1035A00021F42A2D4B2D62EF04C0612F6F702A2D5C -:1035B0004B2DC70109955AC0842F807F803D59F05B -:1035C000803F79F0803C09F061C0D7011E96ED91F3 -:1035D000FC911F9719C0D7015096ED91FC9151971E -:1035E00013C0433F31F4D7015296ED91FC915397AC -:1035F00008C0413F09F04AC0D7015496ED91FC91B3 -:103600005597309741F442C0309709F43FC0133FBB -:1036100011F0113F19F44B2D612F03C0612F6F7012 -:103620004B2DC701099522C0842F0E948819882339 -:1036300031F0D7015696ED91FC91579707C0163F90 -:1036400029F5D7015896ED91FC9159973097F1F0F3 -:10365000612FC70109950AC064307105A8F416C02E -:103660000A2D2B2D412FB601C7010995D7015E9672 -:10367000ED91FC915F97309789F00A2D2B2D412F0A -:10368000B601C70109950AC0C12CD12CD7015C969F -:10369000ED91FC915D97309719F7E8CF0F900F905F -:1036A0000F90DF91CF911F910F91FF90EF90DF90DE -:1036B000CF90BF90AF900895EF92FF920F931F931A -:1036C000CF93DF93EC01162F862F0E948819882351 -:1036D00069F0FDA081E08DA300E020E0412F61E0D2 -:1036E00070E0CE010E944E1AFDA27CC0812F0E9484 -:1036F00084194DA1882309F440C0443029F01AA34D -:1037000021E030E03FA32EA3812F0E948E1981304B -:1037100031F070F0823051F0833059F507C08DA33D -:1037200000E020E0412F61E070E01EC08DA35AC090 -:10373000103F19F0173FE9F404C084E08DA31AA3E9 -:103740003FC02EA13FA1C90163E070E00E94343464 -:103750008C0F9D1FFC0112A3B9016F5F7F4F7FA3E8 -:103760006EA30CA12BA14AA1CE010E944E1A1DA24C -:1037700039C01DA21FA21EA235C0442399F12EA15B -:103780003FA1C90163E070E00E9434347C01FE0176 -:10379000E80FF91F12A3B9016F5F7F4F7FA36EA3DC -:1037A0008130910591F082E0E816F104D9F40CA182 -:1037B0002BA14AA1CE010E944E1A8DA1843091F016 -:1037C00081E090E09FA38EA30DC0423059F400E049 -:1037D0002BA14AA1CE010E944E1A8DA1843011F076 -:1037E000FFA2EEA2DF91CF911F910F91FF90EF907A -:1037F0000895CF92DF92EF92FF920F931F93CF9392 -:10380000DF93EC01E8A1F9A1309709F009958E0149 -:1038100008511F4FC8010E94661CE12CF12CC82ED4 -:10382000D12C0FC060E0C8010E947A1C682FCE0125 -:103830000E945C1B61E0C8010E948B1C8FEFE81A9C -:10384000F80AEC14FD0470F3DF91CF911F910F91F2 -:10385000FF90EF90DF90CF900895FC014283748336 -:1038600063831182108208950F931F93CF93DF9388 -:10387000EC01062F0E94AC1C182F298130E0C901F1 -:1038800001966A8170E00E944834488150E08417B4 -:10389000950729F4812F0E94AF1C80E012C0EB81B4 -:1038A000FC81E20FF31F00832981822F90E00196B3 -:1038B0006A8170E00E9448348983812F0E94AF1C86 -:1038C00081E0DF91CF911F910F910895CF93DF9306 -:1038D000EC010E94AC1C29819881291710F0C22F9D -:1038E00002C0CA81C20FC91B0E94AF1C8C2FDF917E -:1038F000CF910895FC012081862F90E0820F911DC9 -:10390000628170E00E9448340380F481E02DE80F6A -:10391000F91F808108950F931F93CF93DF931F9218 -:10392000CDB7DEB78C0169830E94AC1C482FF8012B -:1039300080816981262F30E0280F311D6281C90105 -:1039400070E00E9448348083842F0F90DF91CF91E4 -:103950001F910F910C94AF1C8FB7F89408958FBFEF -:103960000895FC01CB012091FA032430B1F42181A8 -:103970002F702093E90040E050E064E070E00E9486 -:103980007E1481110BC09091E80095FD07C09091C5 -:10399000E8009E779093E800089582E008952091D2 -:1039A000FA032430A9F4FC0181818F708093E9002F -:1039B0003091F3002091F200932F80E0822B892B2D -:1039C00049F08091E8008E778093E8000C943B16D4 -:1039D00082E0089580E008952091FA03243051F4A4 -:1039E000FC0121812F702093E9002091E80020FD47 -:1039F0000C94CF1C0895FC01CB012091FA032430D4 -:103A000011F080E0089526812F702093E900209125 -:103A1000E80022FFF6CF2091E80025FFF2CF40E03A -:103A200050E064E070E00E94CD148091E80085FDD4 -:103A300005C08091E8008B778093E80081E00895CD -:103A400090939502809394020895E0919402F091EE -:103A50009502309721F00190F081E02D099480E0EB -:103A60000895E0919402F0919502309721F0028040 -:103A7000F381E02D09940895E0919402F09195026C -:103A8000309721F00480F581E02D0994089520916C -:103A90009602309197028217930771F090939702E4 -:103AA00080939602E0919402F0919502309721F074 -:103AB0000680F781E02D09940895209198023091B5 -:103AC00099028217930771F090939902809398025C -:103AD000E0919402F0919502309721F00084F185F5 -:103AE000E02D0994089508950C94731D0E94952962 -:103AF0000E94AD060E94692A0C9411300C94E705CF -:103B00005F926F927F928F929F92AF92BF92CF926D -:103B1000DF92EF92FF920F931F93CF93DF93CDB776 -:103B2000DEB72A970FB6F894DEBF0FBECDBF0E9456 -:103B3000BD079AE9C92E92E0D92E00E010E0AA2430 -:103B4000A394B12C502E802F0E9411093C01F60144 -:103B5000E190F1906F01E826F926E114F10431F4C7 -:103B60000F5F1F4F0530110569F73AC08091F002D1 -:103B700081FD0E941A0920E030E04501022E02C0BA -:103B8000880C991C0A94E2F7C4018E219F21892B8D -:103B900009F12E835F826820792081E0672809F48B -:103BA00080E088870E949E298160782F9A87898784 -:103BB0004E815F8168858A850E94391EF801EE0F6B -:103BC000FF1FE656FD4F80819181882599259183BD -:103BD000808316C02F5F3F4F2C30310571F6C0CF68 -:103BE0008FEF89838A831B820E949E298160782FB0 -:103BF0009D838C8349815A816B818D810E94391EFE -:103C00000E94562D1091A4020E94251D1817D9F06C -:103C10000E94251D8093A4022A960FB6F894DEBF59 -:103C20000FBECDBFDF91CF911F910F91FF90EF900D -:103C3000DF90CF90BF90AF909F908F907F906F90CC -:103C40005F900C947E1D2A960FB6F894DEBF0FBECF -:103C5000CDBFDF91CF911F910F91FF90EF90DF903B -:103C6000CF90BF90AF909F908F907F906F905F901C -:103C70000895CF93DF93CDB7DEB72B970FB6F894A7 -:103C8000DEBF0FBECDBF4F83588769877A878B878A -:103C9000DE01119686E0FD0111928A95E9F785E033 -:103CA000FE01379601900D928A95E1F749815A817C -:103CB0006B817C818D819E810E9415262B960FB68B -:103CC000F894DEBF0FBECDBFDF91CF910895CF93A3 -:103CD000C82F882309F4C1C0823859F40E94251DD9 -:103CE00081FDBBC089E30E947C280E94F82889E3FB -:103CF0000CC0833879F40E94251D80FDAEC083E599 -:103D00000E947C280E94F82883E50E949E28CF917B -:103D10000C94F828843859F40E94251D82FD9DC01A -:103D200087E40E947C280E94F82887E4EECF845024 -:103D3000813A48F48C2F0E94732F81118EC08C2FF2 -:103D40000E947C28E4CF8C2F805E883050F4C770AE -:103D500081E090E001C0880FCA95EAF70E94BF2871 -:103D6000D6CF8C2F855A833078F4C53A29F0C63ADD -:103D700031F482E890E005C081E890E002C083E879 -:103D800090E0CF910C94471D8C2F885A833108F016 -:103D900064C0C83A39F1C93A41F1CA3A49F1CB3A5B -:103DA00051F1CC3A59F1CD3A61F1C03B69F1CE3ACB -:103DB00071F1CF3A79F1C13B81F1C23B89F1C33B4B -:103DC00091F1C43B99F1C53BA1F1C63BA9F1C73BB9 -:103DD000B1F1C83BB9F1C93BC1F1CA3BC9F58AE2AF -:103DE00092E038C082EE90E035C089EE90E032C0BB -:103DF0008AEE90E02FC085EB90E02CC086EB90E03F -:103E000029C087EB90E026C08CEC90E023C08DECBD -:103E100090E020C083E891E01DC08AE891E01AC0DC -:103E200082E991E017C084E991E014C081E292E058 -:103E300011C083E292E00EC084E292E00BC085E202 -:103E400092E008C086E292E005C087E292E002C0FC -:103E500080E090E0CF910C945D1DCF910895882370 -:103E600009F44DC0823859F40E94251D81FF47C0D6 -:103E700089E30E947C280E94F82889E30CC08338DB -:103E800071F40E94251D80FF3AC083E50E947C28C2 -:103E90000E94F82883E50E949E280C94F828843814 -:103EA00059F40E94251D82FF2AC087E40E947C28C5 -:103EB0000E94F82887E4EFCF982F9450913A08F4A5 -:103EC000EACF982F905E983058F4282F277081E021 -:103ED00090E001C0880F2A95EAF70E94C528DDCF3F -:103EE000982F955A933020F480E090E00C94471D71 -:103EF000885A833120F480E090E00C945D1D089591 -:103F0000882321F00E94BF280C94F8280895882364 -:103F100021F00E94C5280C94F8280895BF92CF92F2 -:103F2000DF92EF92FF920F931F93CF93DF93CDB762 -:103F3000DEB727970FB6F894DEBF0FBECDBF8C015A -:103F400085E0F801DE01119601900D928A95E1F766 -:103F5000F80130812181F280558152955F70838113 -:103F60009481892B39F02F3F41F481E090E03F3F6D -:103F700031F003C081E090E002C080E090E080FD7D -:103F800073C339832A8389819A815E830E94392889 -:103F9000B92E8F830E9438280E9460272B2D2295EE -:103FA0002F7030E05E816F812530310509F4E6C065 -:103FB0006CF4243031050CF0A2C04B2D407F8B2DCA -:103FC0008F70223031050CF045C017C02C30310500 -:103FD0004CF42A3031050CF0E7C12830310509F0E6 -:103FE00043C3E5C02D30310509F4BAC20CF4A2C2B6 -:103FF0002F30310509F038C323C3182F411101C0F8 -:1040000002C01295107FFF2059F0112309F46BC2F2 -:10401000812F6F830E94CF280E94F8286F8163C28E -:10402000862F0E942F1F112309F41EC3812F0E9487 -:10403000D52827960FB6F894DEBF0FBECDBFDF910F -:10404000CF911F910F91FF90EF90DF90CF90BF9095 -:104050000C94F828403211F08295807F662319F085 -:10406000613071F523C0FF20B1F0511101C032C0A1 -:10407000513081F527960FB6F894DEBF0FBECDBF45 -:10408000DF91CF911F910F91FF90EF90DF90CF9034 -:10409000BF900C94DF28511101C003C0513009F4C6 -:1040A000E3C28E830E94E2288E819AC1FF2021F014 -:1040B000563008F0D9C20EC0553008F0D5C290C1B4 -:1040C000FF20C9F0552331F0F801958190FF0BC214 -:1040D0009F70958327960FB6F894DEBF0FBECDBFB5 -:1040E000DF91CF911F910F91FF90EF90DF90CF90D4 -:1040F000BF900C94801F552309F472C109C22B2D67 -:1041000026952695237030E02115310529F02130C0 -:10411000310509F0A9C219C0FF2021F0862F9B2D7F -:10412000937002C080E090E027960FB6F894DEBF4F -:104130000FBECDBFDF91CF911F910F91FF90EF90F8 -:10414000DF90CF90BF900C94471DFF2021F0862F69 -:104150009B2D937002C080E090E027960FB6F894F4 -:10416000DEBF0FBECDBFDF91CF911F910F91FF90AA -:10417000EF90DF90CF90BF900C945D1D862FFF20B5 -:1041800019F00E945C2C02C00E94C42C27960FB626 -:10419000F894DEBF0FBECDBFDF91CF911F910F917D -:1041A000FF90EF90DF90CF90BF900C944B2D8B2D14 -:1041B000837009F079C0F11057C2262F22952695F9 -:1041C0002770220F220F862F8F70C82ED12CE12C42 -:1041D000F12C022E04C0CC0CDD1CEE1CFF1C0A943A -:1041E000D2F764FF10C06FE070E080E090E004C0A0 -:1041F000660F771F881F991F2A95D2F760957095D3 -:104200008095909503C060E070E0CB012B2D269542 -:1042100026952370422F50E042305105D9F04330AB -:10422000510569F16C297D298E299F29413051055D -:1042300051F127960FB6F894DEBF0FBECDBFDF91C8 -:10424000CF911F910F91FF90EF90DF90CF90BF9093 -:104250000C9475276C297D298E299F2927960FB6E6 -:10426000F894DEBF0FBECDBFDF91CF911F910F91AC -:10427000FF90EF90DF90CF90BF900C9487270E9423 -:104280007527C701B60127960FB6F894DEBF0FBE9B -:10429000CDBFDF91CF911F910F91FF90EF90DF90F5 -:1042A000CF90BF900C946327FF2019F08B2D817065 -:1042B00001C08695882309F4D7C1262F229526951B -:1042C0002770220F220F862F8F70C82ED12CE12C41 -:1042D000F12C022E04C0CC0CDD1CEE1CFF1C0A9439 -:1042E000D2F764FF10C06FE070E080E090E004C09F -:1042F000660F771F881F991F2A95D2F760957095D2 -:104300008095909503C060E070E0CB012B2D269541 -:1043100026952370422F50E042305105D9F04330AA -:10432000510569F16C297D298E299F29413051055C -:1043300051F127960FB6F894DEBF0FBECDBFDF91C7 -:10434000CF911F910F91FF90EF90DF90CF90BF9092 -:104350000C9414286C297D298E299F2927960FB645 -:10436000F894DEBF0FBECDBFDF91CF911F910F91AB -:10437000FF90EF90DF90CF90BF900C9426280E9482 -:104380001428C701B60127960FB6F894DEBF0FBEFA -:10439000CDBFDF91CF911F910F91FF90EF90DF90F4 -:1043A000CF90BF900C940228603F59F120F4603EFA -:1043B00008F494C008C0623F09F467C0F0F1633F9D -:1043C00009F08CC065C0162F1F708B2D8F71FF20D8 -:1043D00021F00E94AD27812F7DCE0E94C827812F1A -:1043E00027960FB6F894DEBF0FBECDBFDF91CF91F9 -:1043F0001F910F91FF90EF90DF90CF90BF900C94A2 -:10440000871FFF20B1F0553008F02EC18B2D8F7122 -:1044100027960FB6F894DEBF0FBECDBFDF91CF91C8 -:104420001F910F91FF90EF90DF90CF90BF900C9471 -:10443000E727563008F018C1E9CFFF2099F08B2DFF -:104440008F7127960FB6F894DEBF0FBECDBFDF91F8 -:10445000CF911F910F91FF90EF90DF90CF90BF9081 -:104460000C94AD278B2D8F7127960FB6F894DEBF75 -:104470000FBECDBFDF91CF911F910F91FF90EF90B5 -:10448000DF90CF90BF900C94C827F110EBCFD7CF1F -:10449000FF2099F08B2D8F7127960FB6F894DEBF11 -:1044A0000FBECDBFDF91CF911F910F91FF90EF9085 -:1044B000DF90CF90BF900C949E2727960FB6F8946C -:1044C000DEBF0FBECDBFDF91CF911F910F91FF9047 -:1044D000EF90DF90CF90BF900C949927FF20A9F028 -:1044E000552309F4ACCF862F27960FB6F894DEBF7C -:1044F0000FBECDBFDF91CF911F910F91FF90EF9035 -:10450000DF90CF90BF900C94671E552309F4AACF7B -:10451000862F27960FB6F894DEBF0FBECDBFDF9172 -:10452000CF911F910F91FF90EF90DF90CF90BF90B0 -:104530000C942F1F4B2D4F70C8010E941A03279611 -:104540000FB6F894DEBF0FBECDBFDF91CF911F91A4 -:104550000F91FF90EF90DF90CF90BF900C94CB26FF -:10456000F11082C09B2D9F70492F50E042305105C1 -:1045700099F144F44115510569F04130510509F0B4 -:1045800073C019C043305105C1F14430510509F0E1 -:104590006BC044C027960FB6F894DEBF0FBECDBFE8 -:1045A000DF91CF911F910F91FF90EF90DF90CF900F -:1045B000BF900C94223027960FB6F894DEBF0FBE42 -:1045C000CDBFDF91CF911F910F91FF90EF90DF90C2 -:1045D000CF90BF900C94393027960FB6F894DEBF79 -:1045E0000FBECDBFDF91CF911F910F91FF90EF9044 -:1045F000DF90CF90BF900C94553027960FB6F8946B -:10460000DEBF0FBECDBFDF91CF911F910F91FF9005 -:10461000EF90DF90CF90BF900C946830862F279654 -:104620000FB6F894DEBF0FBECDBFDF91CF911F91C3 -:104630000F91FF90EF90DF90CF90BF900C948C3053 -:104640004B2D4F70C80127960FB6F894DEBF0FBEF2 -:10465000CDBFDF91CF911F910F91FF90EF90DF9031 -:10466000CF90BF900C941B0927960FB6F894DEBF2D -:104670000FBECDBFDF91CF911F910F91FF90EF90B3 -:10468000DF90CF90BF9008950E94DC280E94B1284F -:104690000E94F8280E94F72D0E944B2D80E090E0A8 -:1046A0000E94471D80E090E00C945D1D0E94CC2884 -:1046B0000C9444230E943928292F22952F7030E032 -:1046C0002C3031054CF42A3031056CF4225031097C -:1046D0002230310590F407C02C30310551F02F30D5 -:1046E000310559F406C0803E10F0803F31F481E07E -:1046F000089593FB882780F9089580E00895CF936B -:10470000DF9300D000D01F92CDB7DEB70F900F908F -:104710000F900F900F90DF91CF910895CF93DF937B -:1047200000D000D000D0CDB7DEB726960FB6F894F3 -:10473000DEBF0FBECDBFDF91CF9108951F93CF9302 -:10474000DF93C091DB0216E012C0D0E01C9FF001A5 -:104750001D9FF00D1124E555FD4F4081518162816F -:104760007381848195810E948E232196C7708091E8 -:10477000DC02C813EACFDF91CF911F9108954091D9 -:10478000A5025091A6026091A7027091A8028091A3 -:10479000A9029091AA020C948E230F931F93CF939A -:1047A000DF938091AA0282958F7009F069C0809191 -:1047B000A702882309F464C0A091DB02D091DC0237 -:1047C000B091A502C091A6028091A8029091A90281 -:1047D00021E030E0BF3F11F020E030E0122FBC01BB -:1047E0006095709506E04AC0009721F0CF3F29F40C -:1047F000212F05C021E030E002C020E030E020FDA4 -:104800003BC04A2F50E0049FF001059FF00D11249A -:10481000E555FD4F2181C2132FC02081B2132CC05A -:104820002281211129C0238134812817390718F0EA -:10483000281B390B02C0260F371F283C3105E0F436 -:104840008091AA028F7080618093AA0286E0849F83 -:10485000F001859FF00D1124E055FD4F80818F7090 -:104860008061808385EA92E00E948E1FDF91CF9164 -:104870001F910F910C949E23AF5FA770AD13B4CF1F -:10488000DF91CF911F910F910895EF92FF920F93B7 -:104890001F93CF93DF93CDB7DEB762970FB6F8942F -:1048A000DEBF0FBECDBF8C0185E0F801DE011D9695 -:1048B00001900D928A95E1F7D8014C9111965C9187 -:1048C000119712966C9112971396ED90FC90149795 -:1048D0007091A502E091A6028091A8029091A90290 -:1048E000009739F0EF3F41F421E030E07F3F31F0B5 -:1048F00003C021E030E002C020E030E020FD5CC1D8 -:104900002091A702222309F4F1C0E816F90628F045 -:104910009701281B390BC90104C0809590958E0D15 -:104920009F1D883C910508F098C08091AA02982F9D -:10493000907F09F064C0E51314C0741312C06111B4 -:1049400010C08F7080618093AA020E94BF2385EA05 -:1049500092E00E948E1F8091AA02D80115968C9336 -:1049600043C1EF2839F05F3F41F481E090E04F3FD1 -:1049700031F003C081E090E002C080E090E080FD73 -:1049800003C081E0862702C080E090E080FF2EC057 -:104990008091DB022091DC0236E013C090E0389F6A -:1049A000F001399FF00D1124E555FD4F718157132A -:1049B00006C07081471303C07281671317C0019648 -:1049C00087708213EBCF12C19F7059F0882309F4CE -:1049D0000BC107C09F7029F0F8019581907F09F401 -:1049E00003C1805E883008F4FFC0D2C0662309F49A -:1049F000FBC08091AA0281608093AA02F5C0E513F2 -:104A000008C0741306C0611104C0D80115968C93B8 -:104A10009DC04D875E878D859E856A8B0E945A2337 -:104A20006A89882309F4B4C0662309F4B1C02091CF -:104A3000AA02822F82958F7090E002970CF4C6C074 -:104A40008091A5029091A60298878F831986FB8694 -:104A5000EA862C87CE01079646C08091AA02982F3D -:104A6000907F59F47E2DF98AE88A89890E947F23F4 -:104A700085EA92E00E948E1F95C0E51311C0741361 -:104A80000FC061110DC0F8018583C8010E948E1FFF -:104A9000E5EAF2E086E0DF011D928A95E9F7A2C01F -:104AA0004D875E878D859E856A8B0E945A236A8911 -:104AB000882309F46DC0662309F46AC02091AA0214 -:104AC000822F82958F7090E002970CF47FC08091C6 -:104AD000A5029091A6029A8389831B82FD82EC82B3 -:104AE0002E83CE0101960E948E1F70C0E816F90633 -:104AF00028F09701281B390BC90104C080959095B7 -:104B00008E0D9F1D883C910508F046C0662309F470 -:104B10003FC0E51330C074132EC02091AA0220FDBF -:104B200021C0322F32953F70832F90E00097D1F053 -:104B3000D80115962C9315970F9741F0832F8F5F0F -:104B40008295807F2F70282B15962C93C8010E9488 -:104B50008E1F86E0F801A5EAB2E001900D928A95D9 -:104B6000E1F73EC086E0F801A5EAB2E001900D92BF -:104B70008A95E1F737C04D875E878D859E850E94B7 -:104B80005A23811123C08091AA0281608093AA02D6 -:104B9000C8010E948E1F26C07E2DF98AE88A898965 -:104BA0000E947F23E5EAF2E086E0DF011D928A950C -:104BB000E9F70E94BF2318C0662351F34D875E8733 -:104BC0008D859E850E945A23882311F386E0F80183 -:104BD000A5EAB2E001900D928A95E1F70E94CD23FB -:104BE0000E94BF2381E014C080E012C04D875E8721 -:104BF0008D859E850E943928292F22952F7030E0BF -:104C0000223031050CF4E0CE243031050CF6E2CE32 -:104C100062960FB6F894DEBF0FBECDBFDF91CF9185 -:104C20001F910F91FF90EF9008951F93CF93DF9303 -:104C3000CDB7DEB72C970FB6F894DEBF0FBECDBF51 -:104C40004F83588769877A878B879C87CE01079621 -:104C50000E9445248823D9F02F8138858A859B8539 -:104C6000892B39F03F3F19F080E090E004C02F3FDE -:104C7000D9F781E090E0892B09F06DC04F8158850C -:104C800069857A858B859C850E948E2364C086E029 -:104C9000FE013796DE01119601900D928A95E1F79B -:104CA000FF81E8854A855B854115510539F0EF3F65 -:104CB00041F481E090E0FF3F31F003C081E090E0FB -:104CC00002C080E090E080FD46C02091DC0230E030 -:104CD000C9010196877099276091DB0270E0861701 -:104CE000970709F440C0F983EA835D834C8396E01B -:104CF000929FD001939FB00D1124A555BD4FFE0189 -:104D0000319601900D929A95E1F78093DC020E9412 -:104D10009E2321C0189FC001112485559D4F0E94DC -:104D20004524882371F1E091DB021E9FF0011124DC -:104D3000E555FD4F40815181628173818481958168 -:104D40000E948E238091DB0290E001968770992764 -:104D50008093DB0201C016E08091DB029091DC02BF -:104D60008913D8CF0EC00E9456231092DC021092F5 -:104D7000DB02E5EAF2E086E0DF011D928A95E9F7C1 -:104D8000EACF2C960FB6F894DEBF0FBECDBFDF91F1 -:104D9000CF911F910895DF92EF92FF920F931F938F -:104DA000CF93DF93EC01009709F46EC0D12CEE2471 -:104DB000E394F12C8E010F5F1F4FFE018491843725 -:104DC00048F4843008F04CC0813071F0823009F032 -:104DD0005BC01EC0853709F43FC080F1982F9458FE -:104DE000903708F051C03FC02296F8018491982F67 -:104DF000905E983050F48770FE2D01C0FF0F8A95A9 -:104E0000EAF78F2F0E94CF2813C00E94671E2FC081 -:104E10002296F8018491982F905E983060F4877004 -:104E2000FE2D01C0FF0F8A95EAF78F2F0E94D5282B -:104E30000E94F8281CC00E942F1F19C02296F8015A -:104E4000049107C08FE99FE00197F1F700C00000CF -:104E500001500111F7CF0BC02296F801D49007C082 -:104E60000E94671E03C08F770E942F1FE8018D2DBF -:104E700007C08150EFE9FFE03197F1F700C0000073 -:104E8000882309F497CFF5CFDF91CF911F910F9130 -:104E9000FF90EF90DF9008956093E1027093E2023B -:104EA0008093E3029093E4020C9444236093DD0228 -:104EB0007093DE028093DF029093E0020C9444230F -:104EC00008950C944C270F931F930091E1021091C9 -:104ED000E2022091E3023091E402602B712B822BDD -:104EE000932B1F910F910C944C270F931F930091BC -:104EF000E1021091E2022091E3023091E40260238A -:104F00007123822393231F910F910C944C270F93AD -:104F10001F930091E1021091E2022091E30230918F -:104F2000E40260277127822793271F910F910C9429 -:104F30004C2760E070E0CB010C94562741E050E034 -:104F400060E070E004C0440F551F661F771F8A950C -:104F5000D2F7CB01BA010C94562741E050E060E053 -:104F600070E004C0440F551F661F771F8A95D2F763 -:104F70008091DD029091DE02A091DF02B091E0020B -:104F8000482B592B6A2B7B2BCB01BA010C9456274B -:104F900041E050E060E070E004C0440F551F661F20 -:104FA000771F8A95D2F740955095609570958091BE -:104FB000DD029091DE02A091DF02B091E002482371 -:104FC00059236A237B23CB01BA010C94562741E075 -:104FD00050E060E070E004C0440F551F661F771F6B -:104FE0008A95D2F78091DD029091DE02A091DF02D6 -:104FF000B091E002482759276A277B27CB01BA01E5 -:105000000C9456270F931F930091DD021091DE023E -:105010002091DF023091E002602B712B822B932BC9 -:105020001F910F910C9456270F931F930091DD024F -:105030001091DE022091DF023091E00260237123A3 -:10504000822393231F910F910C9456270F931F9344 -:105050000091DD021091DE022091DF023091E0022A -:1050600060277127822793271F910F910C94562751 -:105070000895CF92DF92EF92FF920F931F93CF93F9 -:10508000DF93EC01C090E102D090E202E090E302F5 -:10509000F090E4028091DD029091DE02A091DF02A7 -:1050A000B091E002C82AD92AEA2AFB2A0FE110E0CF -:1050B000B701A601002E04C07695679557954795D0 -:1050C0000A94D2F740FF08C0BE01802F0E947104ED -:1050D0008130910509F007C00150110948F7BE0160 -:1050E00080E00E947104DF91CF911F910F91FF909A -:1050F000EF90DF90CF90089540918B0150918C01FB -:1051000020E030E09FEFFA01E20FF31F62816817A1 -:10511000A1F09F3F19F4611101C0922F2F5F3F4F03 -:105120002630310581F707C0FA01E90FF11D97FD1F -:10513000FA95828308959F3FB9F7089540918B01B6 -:1051400050918C0120E030E0FA01E20FF31F9281D0 -:10515000981301C012822F5F3F4F26303105A1F70F -:10516000089581E090E0E0918B01F0918C01E80FCF -:10517000F91F1082019688309105A9F70895909142 -:10518000E502982B9093E502089580959091E502B1 -:1051900098239093E50208951092E5020895909166 -:1051A000E602982B9093E602089580959091E6028E -:1051B00098239093E60208951092E6020895809352 -:1051C000E70208951092E702089540918B015091F3 -:1051D0008C0120E030E080E0FA01E20FF31F9181C2 -:1051E00091118F5F2F5F3F4F27303105A9F7089549 -:1051F000E0918B01F0918C018091E5028083E09138 -:105200008B01F0918C0180819091E602892B808343 -:105210009091E702992361F0E0918B01F0918C016C -:105220008081892B80830E94E52881110E94E228D9 -:1052300080918B0190918C010C94311D8091FA0327 -:10524000843021F11092F10220E488E190E00FB661 -:10525000F894A895809360000FBE2093600080E0D2 -:105260000E94590383B7817F846083BF83B78160C5 -:1052700083BF7894889583B78E7F83BF88E10FB60C -:10528000F89480936000109260000FBE0895089516 -:105290000895CF9380E00E9459030E9447290E94FD -:1052A000BD070E944829C0E08C2F0E941109892B5C -:1052B00029F4CF5FC530C1F780E001C081E0CF9114 -:1052C00008950E94562380E00E9459030E941130E5 -:1052D0000E94251D0C94E7051F920F920FB60F92A6 -:1052E00011248F939F93AF93BF938091F10281110B -:1052F00013C08091F2029091F302A091F402B09158 -:10530000F5024196A11DB11D8093F2029093F30224 -:10531000A093F402B093F502BF91AF919F918F914A -:105320000F900FBE0F901F90189582E084BD93E000 -:1053300095BD9AEF97BD80936E0008958FB7F8944E -:105340004091F2025091F3026091F4027091F502E3 -:105350008FBFCA010895CF92DF92EF92FF920F9311 -:105360001F932FB7F8944091F2025091F30260918D -:10537000F4027091F5022FBF6A017B01EE24FF2435 -:105380008C0120E030E0C016D106E206F30620F0E2 -:105390009A01281B390B05C09C0120953095240FDC -:1053A000351FC9011F910F91FF90EF90DF90CF90B3 -:1053B00008951F920F920FB60F9211248F939F930F -:1053C000AF93BF938091F2029091F302A091F40207 -:1053D000B091F5020196A11DB11D8093F202909348 -:1053E000F302A093F402B093F502BF91AF919F91A5 -:1053F0008F910F900FBE0F901F9018950E946D1601 -:10540000F8942FEF87EA91E6215080409040E1F731 -:1054100000C0000087E090EBDC01809304049093CF -:105420000504A0930604B09307042CE088E190E003 -:105430000FB6F894A895809360000FBE209360008B -:10544000FFCFCF92DF92EF92FF920F931F93CF93F4 -:10545000DF93C82ED12C01E010E08D2D0E941109A0 -:105460007C01C0E0D0E098010C2E02C0220F331F57 -:105470000A94E2F72E213F21232B29F42196CC30E8 -:10548000D10589F708C06C2F7D2D80E00E944C0467 -:10549000C812F4CF06C0D39485E0D812DECF80E0E6 -:1054A00001C081E0DF91CF911F910F91FF90EF90AC -:1054B000DF90CF900895CF93C82F8CE20E94212ACD -:1054C000882321F08C2FCF910C94212A80E0CF915A -:1054D0000895CF930E94AC2B811102C00E948D2BA6 -:1054E000C5E608C00E94BD078FE39CE90197F1F76C -:1054F00000C00000C150B1F789E20E945B2A81110F -:105500000AC18AE20E945B2A81110E948D2B85E0EC -:105510000E945B2A81110E94FE290E94B72B809372 -:10552000F00287E00E945B2A882399F18BE10E94B8 -:105530005B2A882351F09091F00291FB882780F933 -:1055400021E0822780FB91F922C08EE00E945B2A35 -:10555000882351F09091F00292FB882780F921E096 -:10556000822780FB92F913C080E10E945B2A909110 -:10557000F002882341F093FB882780F921E08227FD -:1055800080FB93F904C0892F809580FB90F990935C -:10559000F0028091F0020E94BB2B0E94C92B8093E5 -:1055A000010380EE0E945B2A882341F08091010371 -:1055B000982F909590FB80F98093010389E30E94D6 -:1055C0005B2A882359F09091010391FB882780F989 -:1055D00021E0822780FB91F99093010382EE0E94E3 -:1055E0005B2A882359F09091010392FB882780F968 -:1055F00021E0822780FB92F99093010386EE0E94BE -:105600005B2A882359F09091010393FB882780F946 -:1056100021E0822780FB93F99093010383EE0E949F -:105620005B2A882359F09091010394FB882780F925 -:1056300021E0822780FB94F99093010385E30E9487 -:105640005B2A882359F09091010395FB882780F904 -:1056500021E0822780FB95F99093010381E30E946A -:105660005B2A882359F09091010396FB882780F9E3 -:1056700021E0822780FB96F99093010381E10E944B -:105680005B2A882359F09091010397FB882780F9C2 -:1056900021E0822780FB97F9909301038091010319 -:1056A0000E94CD2B87E20E945B2AC82F8EE10E94C8 -:1056B0005B2A8111C2608FE10E945B2A8111C46064 -:1056C00080E20E945B2A8111C86081E20E945B2A0D -:1056D0008111C06182E20E945B2A8111C06283E273 -:1056E0000E945B2A8111C06484E20E945B2A8823A5 -:1056F00011F0C06802C0CC2329F08C2F0E94C42B6B -:105700006C2F03C00E94C02B682F70E080E090E0F7 -:10571000CF910C946127CF9108956DEE7EEF80E0DC -:1057200090E00E94783460E082E090E00E946A3469 -:1057300060E083E090E00E946A3460E084E090E002 -:105740000E946A3460E085E090E00E946A3460E084 -:1057500086E090E00C946A3480E090E00E9464342B -:1057600021E08D3E9E4F09F020E0822F089582E0D7 -:1057700090E00C945C34682F82E090E00C946A34E2 -:1057800083E090E00C945C34682F83E090E00C940C -:105790006A3484E090E00C945C34682F84E090E0FC -:1057A0000C946A3486E090E00C945C34682F86E0B8 -:1057B00090E00C946A348091FE0280FF0BC06091EF -:1057C000900185E0689FB0011124759567957595E6 -:1057D00067952AC081FF09C06091900185E0689FAC -:1057E000B0011124759567951FC082FF07C06091B5 -:1057F000900185E0689FB001112416C04091F80225 -:105800004423C9F060918F01461788F720919001D9 -:1058100085E0289F90011124429FC001439F900D75 -:10582000112470E00E9448346038710540F461151D -:10583000710539F002C065E070E0862F08958FE7AA -:10584000089581E008958091FE0280FF08C0609174 -:105850008E0170E0759567957595679521C081FFFC -:1058600006C060918E0170E07595679519C082FF42 -:1058700004C060918E0170E010C08091F80288230E -:10588000C1F060918D018617A0F790918E01989FCD -:10589000C001112470E00E9448346038710528F47A -:1058A0006115710521F0862F08958FE7089581E035 -:1058B000089561E070E0F4CF803F21F40E94DB2B7B -:1058C000819504C0813F29F40E94DB2B8093FB0269 -:1058D0000895823F21F40E94DB2B819504C0833F11 -:1058E00029F40E94DB2B8093FA020895893F19F472 -:1058F0000E94232C05C08A3F31F40E94232C8195FD -:105900008093FC0208958B3F21F40E94232C819503 -:1059100004C08C3F29F40E94232C8093FD0208953B -:10592000843F21F48091F902816017C0853F21F402 -:105930008091F902826011C0863F21F48091F902C2 -:1059400084600BC0873F21F48091F902886005C014 -:10595000883F31F48091F90280618093F9020895C3 -:105960008D3F21F48091FE0281600BC08E3F21F4B7 -:105970008091FE02826005C08F3F29F48091FE0273 -:1059800084608093FE020895803F29F48091FB0299 -:1059900087FF6EC007C0813F41F48091FB0218165B -:1059A0000CF066C01092FB0263C09091FA02823F35 -:1059B00019F497FF5DC005C0833F31F419160CF050 -:1059C00057C01092FA0254C0893F31F48091FC0212 -:1059D00018160CF04DC006C08A3F39F48091FC02C5 -:1059E00087FF46C01092FC0243C08B3F29F4809190 -:1059F000FD0287FF3DC006C08C3F39F48091FD0257 -:105A00001816B4F51092FD0233C0843F21F4809142 -:105A1000F9028E7F05C0853F31F48091F9028D7FB8 -:105A20008093F90225C0863F21F48091F9028B7F93 -:105A3000F7CF873F21F48091F902877FF1CF883F2C -:105A400021F48091F9028F7EEBCF8D3F21F480917C -:105A5000FE028E7F0BC08E3F21F48091FE028D7F6F -:105A600005C08F3F29F48091FE028B7F8093FE0258 -:105A70008091FA0281110EC08091FB0281110AC04F -:105A80008091FC02811106C08091FD02811102C04B -:105A90001092F802089589EF92E00E943C1D0E9446 -:105AA0009E299093F7028093F6020895CF938091F8 -:105AB000F6029091F7020E94AB294091F80244232C -:105AC00021F02091910130E006C0209192015AE02E -:105AD000259F900111248217930708F486C08091B6 -:105AE000FA0281110DC09091FB02911109C09091B1 -:105AF000FC02911105C09091FD02992309F475C033 -:105B00004F3F19F04F5F4093F802181624F40E949B -:105B1000DB2B8093FA028091FA0287FF05C00E9476 -:105B2000DB2B81958093FA028091FB02181624F4F6 -:105B30000E94DB2B8093FB028091FB0287FF05C054 -:105B40000E94DB2B81958093FB026091FA02662311 -:105B500039F1C091FB02CC2319F1772767FD7095CD -:105B6000872F972F0E94AC3123E333E343E35FE3B6 -:105B70000E9460320E9479316093FA026C2F77277D -:105B800067FD7095872F972F0E94AC3123E333E395 -:105B900043E35FE30E9460320E9479316093FB022D -:105BA0008091FC02181624F40E94232C8093FC029E -:105BB0008091FC0287FF05C00E94232C8195809371 -:105BC000FC028091FD02181624F40E94232C80937D -:105BD000FD028091FD0287FF05C00E94232C819564 -:105BE0008093FD02CF910C944B2DCF910895E9EF56 -:105BF000F2E085E0DF011D928A95E9F71092F80244 -:105C00001092FE020895833089F130F4813061F002 -:105C1000823009F06EC019C0853009F449C0B8F16E -:105C2000863009F066C055C020919201862F90E021 -:105C3000820F911D8F3F910520F4620F60939201B6 -:105C400008958FEF80939201089520919101862FFE -:105C500090E0820F911D8F3F910520F4620F6093B9 -:105C6000910108958FEF8093910108952091900103 -:105C7000862F90E0820F911D8F3F910520F4620FD7 -:105C80006093900108958FEF809390010895209183 -:105C90008F01862F90E0820F911D8F3F910520F498 -:105CA000620F60938F0108958FEF80938F010895A5 -:105CB00020918E01862F90E0820F911D8F3F9105DC -:105CC00020F4620F60938E0108958FEF80938E0110 -:105CD000089520918D01862F90E0820F911D8F3FB6 -:105CE000910520F4620F60938D0108958FEF8093EA -:105CF0008D010895833021F130F4813059F08230E4 -:105D000009F049C012C0853089F128F1863009F0C8 -:105D100042C037C080919201681720F4861B80939F -:105D2000920108951092920108958091910168174F -:105D300020F4861B8093910108951092910108959B -:105D400080919001681720F4861B8093900108953C -:105D500010929001089580918F01681720F4861B9E -:105D600080938F01089510928F01089580918E0184 -:105D7000681720F4861B80938E01089510928E017F -:105D8000089580918D01681720F4861B80938D0102 -:105D9000089510928D01089541E050E060E070E0B8 -:105DA00004C0440F551F661F771F8A95D2F7CB0199 -:105DB000BA010E9461270C945623873200F58E3178 -:105DC00008F086C08E3009F466C060F4873009F4AC -:105DD0004DC018F4863049F531C0883041F18B3020 -:105DE00021F57BC0863109F478C018F48031E9F4DC -:105DF0005CC0893109F471C08B31B9F442C0883379 -:105E000009F46BC048F4893209F460C0853309F4A1 -:105E10005DC0873251F45AC0833409F457C018F476 -:105E20008A3318F057C0883499F080E008950E94B2 -:105E3000B72B0E94C92B0E94D22B4FC08091F00239 -:105E4000817F8E7F8093F00281E08093FF0208952E -:105E50000E9456232FEF83ED90E321508040904025 -:105E6000E1F700C000000E94FE2937C08091F002D7 -:105E700080FF03C0817F8E7F01C081608093F0022C -:105E80002CC09091F00291FB882780F921E08227B5 -:105E900080FB91F913C09091F00292FB882780F962 -:105EA00021E0822780FB92F909C09091F00293FBD8 -:105EB000882780F921E0822780FB93F99093F002F4 -:105EC000882359F091609093F00207C080E003C0EE -:105ED0008D5101C089530E94CC2E81E0089580E04D -:105EE000089580E00895CF93C82F8091FF028130FC -:105EF00071F020F0823009F089C037C0A0918B0189 -:105F0000B0918C018C91823209F082C007C0A091BF -:105F10008B01B0918C018C91823249F48C2F0E94BC -:105F20006F2F81111EC08C2F0E94DD2E1CC08C2F64 -:105F30000E94712F811115C0C43169F030F4CB304B -:105F400081F0C03109F068C009C0C93221F0C833FE -:105F500009F062C006C01092FF025EC082E080932A -:105F6000FF0281E090E081705AC0C932C9F060F44C -:105F7000C431B1F020F4C73009F04CC034C0CE5168 -:105F8000C63008F047C017C0CE3439F120F4CB3406 -:105F900009F040C01CC0C135C1F0C235D9F513C0ED -:105FA00080910003882319F01092000333C081E030 -:105FB0008093FF0234C0EC2FF0E0E25EFD4F808161 -:105FC0008093000327C061E003C061E007C06AE07E -:105FD000809100030E94032E1DC06AE0809100039F -:105FE0000E947A2E17C08EE18093920182E3809303 -:105FF00091018AE08093900184E180938F0188E091 -:1060000080938E0188E280938D0104C01092FF027C -:1060100080E005C081E003C080E090E0A4CFCF9194 -:1060200008950E94AC2B811102C00E948D2B0E940A -:10603000D22B8093030480FF02C0869501C080E0CC -:106040000C94590380910304982F9695292F30E0E2 -:10605000233031054CF49F5F990F8170892B81604B -:10606000809303040E94D62B8091030486950C94A0 -:10607000590380910304982F969591F09158990FA8 -:106080008170892B809303048E7F91E009F490E066 -:106090008091030490FB80F9809303040E94D62B27 -:1060A0008091030486950C94590380910304982FE2 -:1060B000909590FB80F9809303040E94D62B8091E9 -:1060C000030480FF02C0869501C080E00C94590350 -:1060D00030910304232F26952F5F2F77822F90E096 -:1060E000317004972CF4220F232B2093030402C059 -:1060F0003093030480910304282F2E7F91E009F44C -:1061000090E090FB80F9809303040E94D62B80914D -:10611000030486950C94590320910304922F9695BD -:106120009827990F822F8170892B809303048E7F8B -:1061300091E009F490E08091030490FB80F9809352 -:1061400003040E94D62B8091030486950C94590376 -:106150005058BB27AA270ED075C166D130F06BD13D -:1061600020F031F49F3F11F41EF45BC10EF4E09572 -:10617000E7FB51C1E92F77D180F3BA1762077307A4 -:106180008407950718F071F49EF58FC10EF4E09521 -:106190000B2EBA2FA02D0B01B90190010C01CA01E1 -:1061A000A0011124FF27591B99F0593F50F4503E8C -:1061B00068F11A16F040A22F232F342F4427585F7E -:1061C000F3CF469537952795A795F0405395C9F796 -:1061D0007EF41F16BA0B620B730B840BBAF091504E -:1061E000A1F0FF0FBB1F661F771F881FC2F70EC0ED -:1061F000BA0F621F731F841F48F4879577956795C0 -:10620000B795F7959E3F08F0B3CF9395880F08F0A8 -:106210009927EE0F979587950895D9D008F481E0D6 -:1062200008950CD00FC107D140F0FED030F021F41A -:106230005F3F19F0F0C0511139C1F3C014D198F388 -:106240009923C9F35523B1F3951B550BBB27AA27F7 -:1062500062177307840738F09F5F5F4F220F331F69 -:10626000441FAA1FA9F333D00E2E3AF0E0E830D035 -:1062700091505040E695001CCAF729D0FE2F27D038 -:10628000660F771F881FBB1F261737074807AB0706 -:10629000B0E809F0BB0B802DBF01FF2793585F4F7B -:1062A0002AF09E3F510568F0B6C000C15F3FECF395 -:1062B000983EDCF3869577956795B795F7959F5F40 -:1062C000C9F7880F911D9695879597F90895E1E094 -:1062D000660F771F881FBB1F621773078407BA07F3 -:1062E00020F0621B730B840BBA0BEE1F88F7E0954E -:1062F000089504D06894B111D9C00895BCD088F035 -:106300009F5790F0B92F9927B751A0F0D1F0660FA1 -:10631000771F881F991F1AF0BA95C9F712C0B130BC -:1063200081F0C3D0B1E00895C0C0672F782F8827CF -:10633000B85F39F0B93FCCF3869577956795B395FB -:10634000D9F73EF490958095709561957F4F8F4F6A -:106350009F4F0895E89409C097FB3EF4909580956F -:10636000709561957F4F8F4F9F4F9923A9F0F92F1B -:1063700096E9BB279395F695879577956795B79599 -:10638000F111F8CFFAF4BB0F11F460FF1BC06F5F7F -:106390007F4F8F4F9F4F16C0882311F096E911C091 -:1063A000772321F09EE8872F762F05C0662371F0B2 -:1063B00096E8862F70E060E02AF09A95660F771FC6 -:1063C000881FDAF7880F9695879597F90895990FA2 -:1063D0000008550FAA0BE0E8FEEF16161706E807AF -:1063E000F907C0F012161306E407F50798F0621BD0 -:1063F000730B840B950B39F40A2661F0232B242BA5 -:10640000252B21F408950A2609F4A140A6958FEFC3 -:10641000811D811D089597F99F6780E870E060E015 -:1064200008959FEF80EC089500240A94161617062D -:1064300018060906089500240A9412161306140675 -:1064400005060895092E0394000C11F4882352F0D8 -:10645000BB0F40F4BF2B11F460FF04C06F5F7F4F90 -:106460008F4F9F4F089557FD9058440F551F59F077 -:106470005F3F71F04795880F97FB991F61F09F3F31 -:1064800079F087950895121613061406551FF2CF5A -:106490004695F1DF08C0161617061806991FF1CFAA -:1064A00086957105610508940895E894BB276627D1 -:1064B0007727CB0197F908958ADF08F48FEF0895C5 -:1064C0000BD0C0CFB1DF28F0B6DF18F0952309F06C -:1064D000A2CFA7CF1124EACFC6DFA0F3959FD1F3B7 -:1064E000950F50E0551F629FF001729FBB27F00D82 -:1064F000B11D639FAA27F00DB11DAA1F649F6627D7 -:10650000B00DA11D661F829F2227B00DA11D621F25 -:10651000739FB00DA11D621F839FA00D611D221FDF -:10652000749F3327A00D611D231F849F600D211DC3 -:10653000822F762F6A2F11249F5750408AF0E1F066 -:1065400088234AF0EE0FFF1FBB1F661F771F881FAF -:1065500091505040A9F79E3F510570F05CCFA6CFF7 -:106560005F3FECF3983EDCF3869577956795B7959A -:10657000F795E7959F5FC1F7FE2B880F911D9695C4 -:10658000879597F90895FA01EE0FFF1F30962105C0 -:10659000310599F16115710561F48038BFE39B07FE -:1065A00049F168949038810561F08038BFEF9B070E -:1065B00041F0992342F5FF3FE1053105210511F135 -:1065C000E8940894E795D901AA2329F4AB2FBE2FAC -:1065D000F85FD0F310C0FF5F70F4A695E0F7F739CD -:1065E00050F019F0FF3A38F49F779F930CD00F903A -:1065F00007FC905808953EF014CF60E070E080E80A -:106600009FE308954FE79F775F934F933F932F93B7 -:106610009ED02F913F914F915F9152DF05C019F4A9 -:106620000EF0F9CE42CFFDCE26DFC8F39638C0F784 -:1066300007F80F92E8942BE33AEA48EB5FE74EDF66 -:106640000F920F920F924DB75EB70F92C0D0ECEA47 -:10665000F0E016D04F915F91EF91FF91E595EE1F1D -:10666000FF1F49F0FE57E0684427EE0F441FFA95DC -:10667000E1F74195550B32D00F9007FE26C00895E3 -:10668000DF93CF931F930F93FF92EF92DF927B01E3 -:106690008C01689405C0DA2EEF011EDFFE01E8943C -:1066A000A5912591359145915591AEF3EF0162DDAC -:1066B000FE019701A801DA9479F7DF90EF90FF903F -:1066C0000F911F91CF91DF9108959B01AC0160E084 -:1066D00070E080E89FE3A5CD9ECEACC0CCDEE8F3B1 -:1066E0009923D9F3940F511DBBF39150504094F06E -:1066F00059F0882332F0660F771F881F9150504061 -:10670000C1F79E3F510544F7880F911D96958795D7 -:1067100097F908955F3FACF0983E9CF0BB278695B3 -:1067200077956795B79508F4B1609395C1F7BB0F5E -:1067300058F711F460FFE8CF6F5F7F4F8F4F9F4F87 -:10674000E3CFB4CE0EF076C06CCE689464CE93DE08 -:10675000C8F39923D1F3C6F3DF93CF931F930F931D -:10676000FF92C92FDD2788232AF02197660F771F14 -:10677000881FDAF720E030E040E85FEB9FE38839DC -:1067800020F0803E30F021968F77E3DCE4EDF0E0FE -:1067900003C0DFDCE1E0F1E073DF8B01BE01EC015F -:1067A000FB2E6F5771097595771F880B990BD4DDF8 -:1067B00028E132E741E35FE38FDEAF2D9801AE01C0 -:1067C000FF900F911F91CF91DF91D4DC3BCEFA0166 -:1067D000DC01AA0FBB1F9B01AC01BF5728F4222785 -:1067E0003327442750781FC0B75188F4AB2F0024BB -:1067F000469537952795011CA395D2F3002069F0A3 -:10680000220F331F441FB395DAF30DD0A1CC6130B2 -:106810007105A0E88A07B94630F49B01AC016627F0 -:10682000772788279078309621F020833183428320 -:10683000538308959F3F31F0915020F487957795C9 -:106840006795B795880F911D9695879597F9089547 -:10685000991B79E004C0991F961708F0961B881FB2 -:106860007A95C9F780950895AA1BBB1B51E107C013 -:10687000AA1FBB1FA617B70710F0A61BB70B881FD0 -:10688000991F5A95A9F780959095BC01CD0108955F -:1068900097FB072E16F4009407D077FD09D00E94CD -:1068A000343407FC05D03EF4909581959F4F0895B0 -:1068B000709561957F4F0895F999FECF92BD81BD86 -:1068C000F89A992780B50895A8E1B0E042E050E039 -:1068D0000C947F34262FF999FECF1FBA92BD81BD4B -:1068E00020BD0FB6F894FA9AF99A0FBE0196089552 -:1068F0000E946A34272F0C946B34DC01CB01FC011D -:10690000F999FECF06C0F2BDE1BDF89A319600B408 -:0E6910000D9241505040B8F70895F894FFCF13 -:10691E0055D0A44600001644000000000000484276 -:10692E0061978A460000C8430000000000004842FC -:10693E0055D024460000C843000000000000484225 -:10694E0000005C460000C843000000000000484202 -:10695E0061978A4600007A4455D0A4460000C84389 -:10696E00000000000000484200005C460000C843E2 -:10697E00000000000000484255D024460000164496 -:10698E000507000C058540000001064000000100CF -:10699E0091102111FD10C810941001E8022808145E -:1069AE000A321E42004500250026004300610060A9 -:1069BE000020003700640065006600670044004652 -:1069CE000024004700000002000400050007000933 -:1069DE00000B000C000E0010001100130015001724 -:1069EE000018001A001C001D001F002100230024A7 -:1069FE00002600280029002B002D002F0030003229 -:106A0E000034003500370039003B00F6030F042830 -:106A1E0004410469051C05E604C6043F4D362002F8 -:106A2E000302000001000101010101000101010248 -:086A3E00030405060708090026 +:100000000C947C050C94C0050C94C0050C94C005A0 +:100010000C94C0050C94C0050C94C0050C94C0054C +:100020000C94C0050C94C0050C94C7180C94991935 +:100030000C94B2270C94C0050C94C0050C94C00518 +:100040000C94C0050C94C0050C94C0050C94C0051C +:100050000C94C0050C941A280C94C0050C94C0058F +:100060000C94C0050C94C0050C94C0050C94C005FC +:100070000C94C0050C94C0050C94C0050C94C005EC +:100080000C94E50E0C94C0050C94C0050C94C005AE +:100090000C94C0050C94C0050C94C0050C94C005CC +:1000A0000C94C0050C94C0050C94C0051B062B06CF +:1000B0003D064D06530662066E06730680068806E8 +:1000C00098069D06061A281A161B281A161B6D1A62 +:1000D000901A161BE51AF81AFB1DFB1D381E381E58 +:1000E000921ED01E48214821E91E4821EA1FEA1F1E +:1000F000AD20C4204821332107634236B79BD8A7DF +:100100001A39685618AEBAAB558C1D3CB7CC57633C +:10011000BD6DEDFD753EF6177231BF000000803FEA +:1001200008000000BE922449123EABAAAA2ABECD06 +:10013000CCCC4C3E00000080BEABAAAAAA3E000078 +:100140000000BF000000803F000000000008417870 +:10015000D3BB4387D1133D190E3CC3BD4282AD2BA7 +:100160003E68EC8276BED98FE1A93E4C80EFFFBE9F +:1001700001C4FF7F3F000000000035001E001F008B +:100180002000210022002300240025002600270053 +:100190002A002B0014001A000800150017001C008C +:1001A00018000C00120013004C0029000400160077 +:1001B000070009000A000B000D000E000F003300BD +:1001C0003400E1001D001B000600190005001100AD +:1001D000100036003700380028000530E000E2004B +:1001E000E30003302C002C0004305000510052007A +:1001F0004F0035001E001F002000210022002300B8 +:1002000024002500260027002A002B0014001A00D5 +:10021000090013000A000D000F0018001C00330035 +:100220004C002900040015001600170007000B0001 +:10023000110008000C0012003400E1001D001B003A +:100240000600190005000E001000360037003800C7 +:1002500028000530E000E200E30003302C002C0011 +:1002600004305000510052004F0035001E001F00A6 +:100270002000210022002300240025002600270062 +:100280002A002B0034003600370013001C00090040 +:100290000A00060015000F004C002900040012009F +:1002A000080018000C0007000B00170011001600D2 +:1002B0003800E100330014000D000E001B000500A3 +:1002C00010001A0019001D0028000530E000E200AF +:1002D000E30003302C002C00043050005100520089 +:1002E0004F0035021E021F022002210222022302B9 +:1002F00024022502260227022A0035021E021F02BE +:1003000020022102220223022402250226022702C1 +:100310004C004C003A003B003C003D003E003F00DA +:100320002D022E022F023002310201004000410056 +:1003300042004300440045000100010001000100AB +:1003400001000100010001000100010001000100A5 +:100350000100AB00AA00A900AE0035001E001F007E +:100360002000210022002300240025002600270071 +:100370002A0035001E001F0020002100220023005B +:1003800024002500260027004C004C003A003B00CA +:100390003C003D003E003F002D002E002F003000AD +:1003A000310001004000410042004300440045008C +:1003B0000100010001000100010001000100010035 +:1003C00001000100010001000100AB00AA00A9002A +:1003D000AE0000000000000000000000000000006F +:1003E000000000000000000000000000000000000D +:1003F00000000000000000000000000000000000FD +:1004000000000000000000000000000000000000EC +:1004100000000000000000000000000000000000DC +:1004200000000000000000000000000000000000CC +:100430000000000000000000000003300000000089 +:100440000430000000000000000000000000000078 +:10045000000000000000000000000000000000009C +:10046000000000000000000000000000000000008C +:10047000000000000000000000000000000000007C +:10048000000000000000000000000000000000006C +:10049000000000000000000000000000000000005C +:1004A000000000000000000000000000000000004C +:1004B000000000000000000000000000000000003C +:1004C000000000000000000000000000000000002C +:1004D000000000000000000000000000000000001C +:1004E000000000000000000000000000000000000C +:1004F00000000000000000000000000000000000FC +:1005000000000000000000000000000000000000EB +:1005100000000000000000000000000000000000DB +:1005200000000000000000000000000000000000CB +:1005300000000000000000000000000000000000BB +:1005400000000000000000000000000000000000AB +:10055000000000000000000000000000000000009B +:10056000000000000000000000000000000000008B +:10057000000000000000000000000000000000007B +:10058000000000000000000000000000000000006B +:10059000000000000000000000000000000000005B +:1005A000000000000000000000000000000000004B +:1005B000000000000000000000000000000000003B +:1005C000000000000000000000000000000000002B +:1005D000000000000000000000000000000000001B +:1005E000000000000000000000000000000000000B +:1005F00000000000000000000000000000000000FB +:1006000000000000000000000000000000000000EA +:1006100000000000000000000000000000000000DA +:1006200000000000000000000000000000000000CA +:1006300000000000000000000000000000000000BA +:1006400000000000000000000000000000000000AA +:10065000000000000000000000000000000000009A +:10066000000000000000000000000000000000008A +:10067000000000000000000000000000000000007A +:10068000000000000000000000000000000000006A +:10069000000000000000000000000000000000005A +:1006A000000000000000000000000000000000004A +:1006B000000000000000000000000000000000003A +:1006C000000000000000000000000000000000002A +:1006D000000000000000000000000000000000001A +:1006E000000000000000000000000000000000000A +:1006F00000000000000000000000000000000000FA +:1007000000000000000000000000000000000000E9 +:1007100000000000000000000000000000000000D9 +:1007200000000000000000000000000000000000C9 +:1007300000000000000000000000000000000000B9 +:1007400000000000000000000000000000000000A9 +:100750000000000000000000000000000000000099 +:100760000000000000000000000000000000000089 +:100770000000000000000000000000000000000079 +:100780000000000000000000000000000000000069 +:100790000000000000000000000000000000000059 +:1007A0000000000000000000000000000000000049 +:1007B0000000000000000000000000000000000039 +:1007C0000000000000000000000000000000000029 +:1007D0000000000000000000000000000000000019 +:1007E0000000000000000000000000000000000009 +:1007F00000000000000000000000000000000000F9 +:1008000000000000000000000000000000000000E8 +:1008100000000000000000000000000000000000D8 +:1008200000000000000000000000000000000000C8 +:1008300000000000000000000000000000000000B8 +:1008400000000000000000000000000000000000A8 +:100850000000000000000000000000000000000098 +:100860000000000000000000000000000000000088 +:100870000000000000000000000000000000000078 +:100880000000000000000000000000000000000068 +:100890000000000000000000000000000000000058 +:1008A0000000000000000000000000000000000048 +:1008B0000000000000000000000000000000000038 +:1008C0000000000000000000000000000000000028 +:1008D0000000000000000000000000000000000018 +:1008E0000000000000000000000000000000000008 +:1008F000000000000000000000003A003B003C0047 +:100900003D003E003F0040004100420043004400E3 +:10091000450001000050010001000100010001003C +:1009200001000100010001004C0001000100010074 +:1009300007300630135012500030013002300100F1 +:10094000010001000B300A300930083001000100BD +:10095000010001000100010001000100010001008F +:10096000010001000100010001000100010001007F +:1009700001002A0354006800650020005000720046 +:1009800065006F006E006900630020004B00650089 +:10099000790062006F0061007200640000002C03A7 +:1009A0004F007200740068006F006C0069006E00F8 +:1009B00065006100720020004B0065007900620054 +:1009C0006F006100720064007300000004030904FA +:1009D00009025400030100A0FA0904000001030108 +:1009E0000100092111010001223F000705810308D0 +:1009F000000A09040100010301020009211101009C +:100A000001224D000705820308000A0904020001C3 +:100A100003000000092111010001223600070583AF +:100A20000308000A1201100100000008EDFE6160D9 +:100A300001000102000105010980A10185021601E2 +:100A40000026B7001A01002AB70075109501810031 +:100A5000C0050C0901A1018503160100269C021A9C +:100A600001002A9C02751095018100C00501090250 +:100A7000A1010901A1000509190129051500250198 +:100A80009505750181029501750381010501093004 +:100A900009311581257F9502750881060938158170 +:100AA000257F950175088106050C0A3802158125F8 +:100AB0007F950175088106C0C005010906A10105E1 +:100AC0000719E029E71500250195087501810295B0 +:100AD0000175088101050819012905950575019120 +:100AE000029501750391010507190029FF150025DD +:100AF000FF950675088100C011241FBECFEFDAE014 +:100B0000DEBFCDBF04B603FE24C08091F3039091F5 +:100B1000F403A091F503B091F6038730904BA74002 +:100B2000B04BB9F41092F3031092F4031092F50352 +:100B30001092F60314BE84B7877F84BF88E10FB696 +:100B4000F89480936000109260000FBEE0E0F8E33C +:100B5000099512E0A0E0B1E0E8EAF3E602C00590F2 +:100B60000D92A63FB107D9F713E0A6EFB2E001C09E +:100B70001D92A33FB107E1F70E940D160C94D231EC +:100B80000C940000279A2F988FEF9FEF9093870087 +:100B9000809386008AE08093800089E180938100C1 +:100BA0000C94092D282F81110BC080918000877F24 +:100BB0008093800010928D0010928C002F980895E1 +:100BC0002F9880918000886080938000233019F4F2 +:100BD0008FEF9FEF0FC083E090E0821B9109880F99 +:100BE000991F2FEF3FEFA90102C0569547958A95AF +:100BF000E2F7CA0190938D0080938C000895CF9303 +:100C0000DF93EC010E94AE28BE0180E090E0DF910E +:100C1000CF910C9428250F931F93462F50E04C3012 +:100C2000510508F098C0DC01FA01EA5AFF4F12960C +:100C30008C910C949631882309F48DC000E010E06B +:100C4000980140E064E070E089EC91E00E9463125A +:100C500081E090E00FC0882309F47DC000E010E03F +:100C6000980140E066E070E089E591E00E9463123F +:100C700082E090E00E94FF056EC0882309F46BC0FB +:100C800000E010E0980140E068E070E089E891E061 +:100C90000E94631284E090E0EDCF882311F083E09E +:100CA00005C083E00CC0882349F084E00E94A5259C +:100CB00040E164E083E00E94C90A4DC084E00E94E4 +:100CC000C625F6CF882331F085EE0E948F1C0E9446 +:100CD000602D41C085EE0E94571D3DC08823D9F18B +:100CE0000E94F70D38C08823B1F10E94F00D00E09A +:100CF00010E0980140E064E070E089EE91E029C0E6 +:100D0000882349F185E00E94C6250E94180E23C061 +:100D1000882309F100E010E0980140E068E070E00D +:100D200089E191E00E94631285E00E94A52513C02D +:100D3000882389F00E94F61204C0882361F00E9483 +:100D4000011300E010E0980140E068E070E089E104 +:100D500091E00E94631280E090E01F910F9108954E +:100D60000F931F932FEF89EF90E021508040904028 +:100D7000E1F700C0000000E010E0980140E064E00E +:100D800070E089EE91E00E9463121F910F91089527 +:100D9000CF92DF92EF92FF920F931F93CF93DF9347 +:100DA000CDB7DEB7CC58D1090FB6F894DEBF0FBE71 +:100DB000CDBF2091B30325FFC5C08C01FC019281FA +:100DC00080910001992309F460C096E4E5E2F2E025 +:100DD000DE01A95BBF4F01900D929A95E1F7F801F2 +:100DE0009081E091F602F091F702E90FF11DEE0F0C +:100DF000FF1F27E430E02C0F3D1FE20FF31F60813F +:100E00007181680F711D882777FD8095982F0E944A +:100E1000A42E20E030E040E451E40E94092E6B0152 +:100E20007C01F801218185E090E0821B9109BC01E1 +:100E3000882777FD8095982F0E94A42E9B01AC01F6 +:100E4000C701B6010E94A12D9B01AC0160E070E0DA +:100E500080E090E40E94173020E030E04CE551E45F +:100E60000E94B42F4FE050E0C457DF4F0FB6F89404 +:100E7000DEBF0FBECDBFDF91CF911F910F91FF90CD +:100E8000EF90DF90CF900C94031296E4E5E2F2E04D +:100E9000DE01119601900D929A95E1F7F80190818B +:100EA000E091F602F091F702E90FF11DEE0FFF1F3E +:100EB00021E030E02C0F3D1FE20FF31F60817181B4 +:100EC000680F711D882777FD8095982F0E94A42EAA +:100ED00020E030E040E451E40E94092E6B017C01E7 +:100EE000F801218185E090E0821B9109BC018827EF +:100EF00077FD8095982F0E94A42E9B01AC01C7011D +:100F0000B6010E94A12D9B01AC0160E070E080E081 +:100F100090E40E94173020E030E04CE551E40E945C +:100F2000B42FC457DF4F0FB6F894DEBF0FBECDBF4E +:100F3000DF91CF911F910F91FF90EF90DF90CF90B5 +:100F40000C944B0EC457DF4F0FB6F894DEBF0FBEA4 +:100F5000CDBFDF91CF911F910F91FF90EF90DF9068 +:100F6000CF9008950F931F9300E010E0980140E0A8 +:100F700063E070E081E091E00E9463122FEF82E570 +:100F800097E0215080409040E1F700C000001F91A1 +:100F90000F91089508950E94C2056E9A769A0C9456 +:100FA000B0060C94CA070C94C8060895880F991FC0 +:100FB000FC01E650F040859194910895880F991FA7 +:100FC000FC01E658FE4F8591949108950F931F936D +:100FD000CF93DF93EC01811520E49207A0F5C115B2 +:100FE00080E3D80708F0E1C0C83ED105D8F4C03E80 +:100FF000D10508F0EEC1C83AD10578F4C53AD1055B +:1010000008F074C0C130D10509F46DC008F4DEC128 +:10101000C430D10508F0DDC1D9C1CB3BD10508F4FE +:1010200070C0D4C1C11590E2D90708F0B9C0C1158C +:1010300021E0D20708F0CDC1C03FD10508F4C6C1F8 +:101040008E01106506C2C13080E5D80709F4BDC025 +:1010500068F5C13120E4D20709F4AEC050F4C031C4 +:1010600090E4D90708F0A5C0CF70DD278E01146D7C +:10107000F0C1C33120E4D20709F4A4C008F49FC032 +:10108000C115D04509F0A2C10E946C210E94180E22 +:101090000E94B2079FEF24E38CE0915020408040F3 +:1010A000E1F700C000000E943F28D3C1C11520E62F +:1010B000D20730F4C11581E5D80708F48CC02DC1E2 +:1010C000C11590E7D90708F481C1C11520E8D207FE +:1010D00008F478C1C11580E9D80708F077C1DF703E +:1010E0008E01106AB6C101E010E0B3C1C53AD10566 +:1010F00009F471C1C63AD10509F070C102E810E4E3 +:10110000A8C1C83AD10509F46CC1C93AD10509F49E +:101110006BC1CA3AD10509F46AC1CB3AD10509F4C9 +:1011200069C1CC3AD10509F468C1CD3AD10509F4B9 +:1011300067C1C03BD10509F466C1CE3AD10509F4B7 +:1011400065C1CF3AD10509F464C1C13BD10509F4A9 +:1011500063C1C23BD10509F462C1C33BD10509F4A7 +:1011600061C1C43BD10509F460C1C53BD10509F497 +:101170005FC1C63BD10509F45EC1C73BD10509F487 +:101180005DC1C83BD10509F45CC1C93BD10509F477 +:101190005BC1CA3BD10509F45AC100E014E459C14E +:1011A000CE019F700E94DE0755C1DD278E01106CB5 +:1011B00050C100E011ED4DC100E010ED4AC100E06A +:1011C00012ED47C100E013ED44C18091C703816077 +:1011D0008093C7033EC10E949B28811102C00E94D8 +:1011E00077280E94B32890E09093F2038093F10354 +:1011F000C23090E5D90721F48091F103816086C067 +:10120000C43020E5D20721F48091F10382607EC0D2 +:10121000C63080E5D80721F48091F103846076C060 +:10122000C83090E5D90719F48091F10327C0CA307E +:1012300020E5D20721F48091F103806167C0CC30B2 +:1012400080E5D80721F48091F10380625FC0CE3041 +:1012500090E5D90721F48091F103806457C0C03133 +:1012600020E5D20721F48091F10380684FC0C2319C +:1012700080E5D80729F48091F1038460886046C036 +:10128000C33090E5D90721F48091F1038E7F3EC0F1 +:10129000C53020E5D20721F48091F1038D7F36C05F +:1012A000C73080E5D80721F48091F1038B7F2EC0F1 +:1012B000C93090E5D90719F48091F10326C0CB30ED +:1012C00020E5D20721F48091F1038F7E1FC0CD303D +:1012D00080E5D80721F48091F1038F7D17C0CF30CE +:1012E00090E5D90721F48091F1038F7B0FC0C131C4 +:1012F00020E5D20721F48091F1038F7707C0C33135 +:10130000D04531F48091F1038B7F877F8093F10387 +:101310008091F1030E94B7289CC08D2F99278F7070 +:10132000992781309105D9F49E012370332702C09B +:10133000880F991F2A95E2F79C688E0144E0000F00 +:10134000111F4A95E1F700271370802B912B53E072 +:10135000CC0FDD1F5A95E1F7C076DD272FC0823014 +:10136000910531F4DC2FCC278E01016F106A71C01A +:101370008330910569F4CE018370992701E010E074 +:1013800002C0000F111F8A95E2F7C8019C680FC0C8 +:10139000049709F05EC0CE018370992701E010E048 +:1013A00002C0000F111F8A95E2F7C8019A6823E076 +:1013B000CC0FDD1F2A95E1F7C07ED7708C010C2B76 +:1013C0001D2B47C0DF708E01106243C000E010E0AB +:1013D00040C08E013EC001E810E43BC003E810E4C9 +:1013E00038C002EE14E435C009EE14E432C00AEE4F +:1013F00014E42FC005EB14E42CC006EB14E429C060 +:1014000007EB14E426C00CEC14E423C00DEC14E448 +:1014100020C003E815E41DC00AE815E41AC002E97B +:1014200015E417C004E915E414C001E216E411C084 +:1014300003E216E40EC004E216E40BC005E216E473 +:1014400008C006E216E405C007E216E402C00AE29C +:1014500016E4C801DF91CF911F910F9108959CE090 +:10146000799FF00111249CE3899FE00DF11D112467 +:10147000E60FF11DEE0FFF1FE658FE4F8591949188 +:10148000803E9105E0F4803C910558F5813391054B +:1014900009F46FC048F48932910509F463C08A32B7 +:1014A000910509F46DC072C089339105E9F0823865 +:1014B0009105D1F08533910509F44DC067C0833E95 +:1014C000910581F138F4803E9105B9F0823E910595 +:1014D000D9F05CC0863E910561F1873E9105A1F18E +:1014E00055C00E94D60708952091F10320FD02C047 +:1014F00021FF4CC080EE90E049C08091F10380FF55 +:10150000F9CF89E390E042C08091F10382FF0EC0E1 +:101510008091F10384FF03C080E090E037C083EE48 +:1015200090E034C08091F10382FFF2CF82EE90E030 +:101530002DC08091F10383FF0BC08091F10384FDE6 +:10154000EBCF87EE90E022C08091F10383FFF5CFCF +:1015500086EE90E01BC08091F10385FF07C089E211 +:1015600090E014C08091F10385FFF9CF85E390E00E +:101570000DC08091F10386FF07C08AE290E006C0AB +:101580008091F10386FFF9CF81E390E00E94E607A6 +:101590000895CF92DF92EF92FF920F931F9301E095 +:1015A00010E020E030E06801790104C0CC0CDD1CC3 +:1015B000EE1CFF1C8A95D2F704C0000F111F221FDA +:1015C000331F6A95D2F70C291D292E293F29C09077 +:1015D000B303D090B403E090B503F090B603C022FB +:1015E000D122E222F322842FC016D106E206F306AE +:1015F00041F41F910F91FF90EF90DF90CF900C94EA +:10160000A5251F910F91FF90EF90DF90CF900C9444 +:10161000C62508950C94090B5F926F927F928F926A +:101620009F92AF92BF92CF92DF92EF92FF920F9371 +:101630001F93CF93DF93CDB7DEB72A970FB6F894F9 +:10164000DEBF0FBECDBFCE0101966C014E019BE007 +:10165000890E911C20E030E040E050E060E070E056 +:1016600000E010E0E12CF12C6C2C5D2C8AE0782E4F +:10167000AA24A394B12CEBE6F2E0A62DB52D872D7C +:1016800001900D928A95E1F7F601819191916F0198 +:10169000FC01E07FFF27E032F10559F48F709927B4 +:1016A000F50102C0EE0FFF1F8A95E2F7EE2AFF2A2E +:1016B00037C0E033F10559F48F709927F50102C066 +:1016C000EE0FFF1F8A95E2F70E2B1F2B29C0E03487 +:1016D000F10559F48F709927F50102C0EE0FFF1F35 +:1016E0008A95E2F76E2B7F2B1BC0E035F10559F48C +:1016F0008F709927F50102C0EE0FFF1F8A95E2F760 +:101700004E2B5F2B0DC0E036F10551F48F709927F9 +:10171000F50102C0EE0FFF1F8A95E2F72E2B3F2B3B +:10172000C814D90409F0A7CF84B19E2D90958923C0 +:1017300084B985B1E82AE5B887B1902F90958923BF +:1017400087B988B1082B08B98AB1962F909589235B +:101750008AB98BB1682B6BB98DB1942F9095892381 +:101760008DB98EB1482B4EB980B3922F90958923B5 +:1017700080BB81B3282B21BB2A960FB6F894DEBF1D +:101780000FBECDBFDF91CF911F910F91FF90EF90D2 +:10179000DF90CF90BF90AF909F908F907F906F9091 +:1017A0005F9008955F926F927F928F929F92AF9217 +:1017B000BF92CF92DF92EF92FF920F931F93CF933E +:1017C000DF93CDB7DEB768970FB6F894DEBF0FBED4 +:1017D000CDBF85B7806885BF85B7806885BF0E940B +:1017E0000C0BCE0101966C014E0199E1890E911C02 +:1017F00020E030E040E050E060E070E000E010E029 +:10180000E12CF12C6C2C5D2C88E1782EAA24A39479 +:10181000B12CE5E7F2E0A62DB52D872D01900D92B4 +:101820008A95E1F7F601819191916F01FC01E07FCA +:10183000FF27E032F10559F48F709927F50102C0B6 +:10184000EE0FFF1F8A95E2F7EE2AFF2A37C0E0333A +:10185000F10559F48F709927F50102C0EE0FFF1FB3 +:101860008A95E2F70E2B1F2B29C0E034F10559F4BD +:101870008F709927F50102C0EE0FFF1F8A95E2F7DE +:101880006E2B7F2B1BC0E035F10559F48F70992723 +:10189000F50102C0EE0FFF1F8A95E2F74E2B5F2B7A +:1018A0000DC0E036F10551F48F709927F50102C0A3 +:1018B000EE0FFF1F8A95E2F72E2B3F2BC814D90499 +:1018C00009F0A7CF84B19E2D9095892384B985B165 +:1018D000E82AE5B887B1902F9095892387B988B118 +:1018E000082B08B98AB1962F909589238AB98BB1B4 +:1018F000682B6BB98DB1942F909589238DB98EB1DA +:10190000482B4EB980B3922F9095892380BB81B329 +:10191000282B21BBE2E0F3E0A8EFB2E01192119294 +:101920001D921D9283E0EC30F807C1F768960FB660 +:10193000F894DEBF0FBECDBFDF91CF911F910F9105 +:10194000FF90EF90DF90CF90BF90AF909F908F90DF +:101950007F906F905F900C94CB075F926F927F9215 +:101960008F929F92AF92BF92CF92DF92EF92FF92AF +:101970000F931F93CF93DF93CDB7DEB7A2970FB628 +:10198000F894DEBF0FBECDBF6E0149E1C40ED11C7D +:1019900088EFA82E82E0B82E75019AE0592E4601F4 +:1019A00001E010E028E1622E35E0732EEBE6F2E074 +:1019B000D401852D01900D928A95E1F7D6018D9184 +:1019C0009D916D019C01207F33272032310591F4D8 +:1019D00024B18F709927F80102C0EE0FFF1F8A957E +:1019E000E2F7CF01922F982B94B995B18095892376 +:1019F00085B953C02033310591F427B18F709927F1 +:101A0000A80102C0440F551F8A95E2F7CA01922F20 +:101A1000982B97B998B18095892388B93EC0203416 +:101A2000310591F42AB18F709927D80102C0AA0F0D +:101A3000BB1F8A95E2F7CD01922F982B9AB99BB1E3 +:101A4000809589238BB929C02035310591F42DB1BA +:101A50008F709927F80102C0EE0FFF1F8A95E2F7F9 +:101A6000CF01922F982B9DB99EB1809589238EB975 +:101A700014C02036310589F420B38F709927A8014E +:101A800002C0440F551F8A95E2F7CA01922F982B86 +:101A900090BB91B38095892381BB50EA5A95F1F7A9 +:101AA000BE016F5F7F4F20E030E040E050E0E5E7AF +:101AB000F2E0DE011196862D01900D928A95E1F7F4 +:101AC000DB018D919D91BD01FC01E07FFF27E0329C +:101AD000F10511F4E3B113C0E033F10511F4E6B1FF +:101AE0000EC0E034F10511F4E9B109C0E035F105AB +:101AF00011F4ECB104C0E036F105B9F4EFB1F0E057 +:101B00008F70992702C0F595E7958A95E2F7E0FD79 +:101B100008C0C801042E02C0880F991F0A94E2F77A +:101B200002C080E090E0282B392B4F5F5F4F4C3094 +:101B3000510509F0BCCFF70180819181821793078D +:101B400021F031832083709209020E940C0BF2E095 +:101B5000EF0EF11C42E0E41643E0F40609F026CF54 +:101B6000809109028823C9F081508093090288235B +:101B700039F08FE99FE00197F1F700C000000DC038 +:101B8000E2E0F3E0D5018D919D915D018193919308 +:101B9000B2E0AB16B3E0BB06A9F70E94D10781E023 +:101BA000A2960FB6F894DEBF0FBECDBFDF91CF91E6 +:101BB0001F910F91FF90EF90DF90CF90BF90AF906B +:101BC0009F908F907F906F905F900895E82FF0E046 +:101BD000EE0FFF1FEE5FFC4F808191810895089505 +:101BE0008091DC0381608093DC030C94C928809190 +:101BF000DC038E7F8093DC030C94C9280E949B2811 +:101C0000811102C00E9477280E94C5288093DC03BE +:101C10003E9A809171008D7F8093710082E0809365 +:101C200090008AE18093910081E080930E030895F3 +:101C300080910E03811102C00E94FE0D10925E037E +:101C400010925D03809171008D7F8093710080916F +:101C500090008F77809390001092200310921F03C2 +:101C600010925703109258031092590310925A037E +:101C70001092560310925503E5E3F3E0A5E2B3E0BA +:101C800011921192119211921D921D9283E0E535ED +:101C9000F807B1F70895CF92DF92EF92FF920F937A +:101CA0001F93CF93DF9320911F03222309F484C055 +:101CB0006B017C0180910E03811102C00E94FE0D18 +:101CC00005E513E0C7E0D0E0A7019601F801929185 +:101CD0008291729162918F010E94052E811131C013 +:101CE000FE01EE0FFF1FEE0FFF1FEB5CFC4F10829B +:101CF000118212821382DE01AA0FBB1FAB5DBC4FA3 +:101D000011961C921E92C730D105E9F021964481AC +:101D10005581668177814083518362837383148206 +:101D200015821682178212968D919C9113971196A7 +:101D30009C938E9313961C921E9212973496129631 +:101D4000E2CF219708F680915D0390915E030197A1 +:101D500097FD05C090935E0380935D0304C01092CD +:101D60005E0310925D0380915D0390915E0320916C +:101D70005B0330915C032817390724F010925C0351 +:101D800010925B03892BC1F4809171008D7F809349 +:101D90007100809190008F7780939000109257038C +:101DA000109258031092590310925A03109256033E +:101DB0001092550310921F03DF91CF911F910F9145 +:101DC000FF90EF90DF90CF9008951F920F920FB683 +:101DD0000F9211244F925F926F927F928F929F92F7 +:101DE000AF92BF92CF92DF92EF92FF922F933F93E9 +:101DF0004F935F936F937F938F939F93AF93BF9313 +:101E0000CF93DF93EF93FF9380911F03882309F40F +:101E10009BC1C0915D03D0915E031C161D060CF0A2 +:101E200093C140900F035090100360901103709085 +:101E3000120320E030E0A901C301B2010E94B02FDB +:101E400018160CF065C0C130D10509F452C080915C +:101E50005B0390915C03BE010E9482317C019093F0 +:101E60005C0380935B038090210390902203A090F9 +:101E70002303B090240320E030E040E85FE3C50195 +:101E8000B4010E94A12D60932103709322038093DB +:101E9000230390932403F701EE0FFF1FEE0FFF1FA4 +:101EA000EB5CFC4FA301920160817181828193817F +:101EB0000E94092E20E030E040E05EE30E94B42F53 +:101EC0009B01AC01C501B4010E94B02F18168CF41F +:101ED000C7010196BE010E94823190935C038093FA +:101EE0005B0310922103109222031092230310929D +:101EF0002403E0915B03F0915C03EE0FFF1FEE0FF4 +:101F0000FF1FEB5CFC4F6081718182819381D0C0A7 +:101F1000C0905703D0905803E0905903F0905A03B3 +:101F200020E030E0A901C701B6010E94052E2197EB +:101F3000882309F4A2C0FE01EE0FFF1FEE0FFF1F62 +:101F4000EB5CFC4F80809180A280B380A50194015E +:101F5000C701B6010E94052E87FF31C0A50194017B +:101F600060E070E08CED93EC0E94092E20E030E000 +:101F700040E451E40E94092E20E030E040E05FE3BD +:101F80000E94B42F9B01AC0160E070E080E090E41F +:101F90000E9417309B01AC01C501B4010E94B42F0F +:101FA0009B01AC01C701B6010E94052E87FF07C047 +:101FB000A701960160E070E08CED93E439C0A501C3 +:101FC0009401C701B6010E94B02F18160CF055C03D +:101FD000A501940160E070E08CED93E40E94092E6D +:101FE00020E030E040E451E40E94092E20E030E09F +:101FF00040E05FE30E94B42F9B01AC0160E070E021 +:1020000080E090E40E9417309B01AC01C501B4014F +:102010000E94B42F9B01AC01C701B6010E94B02FF2 +:1020200018165CF5A701960160E070E08CED93EC6A +:102030000E94092E20E030E040E451E40E94092E85 +:1020400020E030E040E05FE30E94B42F9B01AC0150 +:1020500060E070E080E090E40E9417309B01AC01EA +:10206000C701B6010E94B42F6093570370935803C1 +:102070008093590390935A0313C0FE01EE0FFF1F84 +:10208000EE0FFF1FEB5CFC4F80819181A281B38139 +:102090008093570390935803A0935903B0935A0326 +:1020A00060915703709158038091590390915A039E +:1020B00020910C0330910D032F3F4FEF340731F087 +:1020C0002F5F3F4F30930D0320930C030E940C139E +:1020D0006B017C0120E034E244EF51E40E94052EC4 +:1020E00087FF08C086EFC82E88E2D82E84EFE82E3E +:1020F00081E4F82E20E030E040E051E4C701B60171 +:102100000E94B42F9B01AC0160E074E284E79BE481 +:102110000E94092E6B017C010E94712E7093970022 +:102120006093960020910A0230910B0240910C02BC +:1021300050910D02C701B6010E94B42F0E94712E6A +:10214000709399006093980080912003882309F48C +:1021500033C1C0901B03D0901C03E0901D03F0908E +:102160001E0320E030E0A901C701B6010E94B02F94 +:102170001816D4F580910C0390910D038F3F2FEF2B +:10218000920729F0019690930D0380930C03C701E9 +:10219000B6010E940C1320E030E040E051E40E94C0 +:1021A000B42F9B01AC0160E074E284E79BE40E94E1 +:1021B000092E6B017C010E94712E70939700609331 +:1021C000960020910A0230910B0240910C0250912E +:1021D0000D02C701B6010E94B42F0E94712E7093A8 +:1021E00099006093980008C0109297001092960092 +:1021F0001092990010929800609115037091160347 +:102200006F5F7F4F709316036093150320919600C4 +:102210003091970080E090E0232BF1F0C091960080 +:10222000D09197000E94A22E6B017C01BE0180E03C +:1022300090E00E94A22E9B01AC0160911703709167 +:1022400018038091190390911A030E94092E20E02F +:102250003FEF4FE757E410C00E94A22E6B017C01B4 +:1022600020E030EE4FEF54E46091170370911803B3 +:102270008091190390911A030E94B42F9B01AC0125 +:10228000C701B6010E94B02F87FD96C0809113034D +:102290008F5F8093130390E02091D8033091D9038E +:1022A00082179307A0F08091E303882319F010921E +:1022B00013030DC0809171008D7F80937100809118 +:1022C00090008F7780939000109220037DC08091C2 +:1022D0001403C0911303811128C0C090DD03D09076 +:1022E000DE03E090DF03F090E00320E030E0A9019E +:1022F000C701B6010E94B02F1816BCF481E080938C +:10230000140310921B0310921C0310921D031092D1 +:102310001E03C0921703D0921803E0921903F092A3 +:102320001A03C150C093130343C0109214031092B8 +:102330000D0310920C03E091DA03F091DB0348E007 +:10234000C49FE00DF11D112480819181A281B38190 +:1023500080931B0390931C03A0931D03B0931E0353 +:1023600020E030E040E85EE36481758186819781FA +:102370000E94B42F6B017C0120E030E048EC52E475 +:1023800060910E0270910F028091100290911102E3 +:102390000E94092E9B01AC01C701B6010E94B42F17 +:1023A00060931703709318038093190390931A0393 +:1023B00010921603109215038091DC0380FD04C077 +:1023C0001092200310921F03FF91EF91DF91CF91A4 +:1023D000BF91AF919F918F917F916F915F914F913D +:1023E0003F912F91FF90EF90DF90CF90BF90AF90F3 +:1023F0009F908F907F906F905F904F900F900FBE47 +:102400000F901F901895CF92DF92EF92FF92CF938B +:10241000DF936B017C01EA0180910E03811102C000 +:102420000E94FE0D8091DC0380FF46C080915D0319 +:1024300090915E0308970CF03FC0809171008D7FF2 +:10244000809371008091200381110E94180E81E019 +:1024500080931F0310920D0310920C0320E030E0D4 +:10246000A901C701B6010E94B02F1816DCF48091B3 +:102470005D0390915E03FC01EE0FFF1FEE0FFF1F47 +:10248000EB5CFC4FC082D182E282F382FC01EE0F52 +:10249000FF1FEB5DFC4FD183C083019690935E03D9 +:1024A00080935D03809171008260809371008091C0 +:1024B0009000806880939000DF91CF91FF90EF9023 +:1024C000DF90CF9008958F929F92AF92BF92CF925C +:1024D000DF92EF92FF920F931F93CF93DF93EC0164 +:1024E0007B01D42E4801590180910E03811102C055 +:1024F0000E94FE0D8091DC0380FF6BC08091710013 +:102500008D7F8093710080911F0381110E94180EAE +:1025100081E080932003D093DB03C093DA03F09231 +:10252000D903E092D803D092E3038092DD03909226 +:10253000DE03A092DF03B092E00310922103109219 +:102540002203109223031092240310921303888114 +:102550009981AA81BB8180931B0390931C03A09354 +:102560001D03B0931E0320E030E040E85EE36C8181 +:102570007D818E819F810E94B42F6B017C0120E0C0 +:1025800030E048EC52E460910E0270910F028091AD +:102590001002909111020E94092E9B01AC01C7010B +:1025A000B6010E94B42F60931703709318038093B1 +:1025B000190390931A031092160310921503809139 +:1025C0007100826080937100809190008068809398 +:1025D0009000DF91CF911F910F91FF90EF90DF90CE +:1025E000CF90BF90AF909F908F90089580915F03A0 +:1025F00090E0019666E070E00E94823180935F0374 +:10260000089580915F0390E0019766E070E00E947A +:10261000823180935F0308958F929F92AF92BF9211 +:10262000CF92DF92EF92FF920F931F93CF93DF939E +:102630006B017C01C0910C03D0910D03BE0180E0C1 +:1026400090E00E94A22E4B015C01A701960160E080 +:1026500070E08CE594E40E94092E9B01AC01C50159 +:10266000B4010E94B42F0E94762E20915F03233084 +:1026700009F473C028F4222351F02130E9F02CC171 +:10268000243009F4A0C0253009F4E0C025C180E061 +:1026900090E0A0E0BFE380930A0290930B02A09326 +:1026A0000C02B0930D0210920F03109210031092BF +:1026B00011031092120310C110920F031092100315 +:1026C00010921103109212036431710540F46A30C4 +:1026D000710560F520E030E040E85EE32BC0693C26 +:1026E000710508F0AAC080E090E00E94A22E20E0D0 +:1026F00030E040EA51E40E94A02D20E030E044E3C5 +:1027000053E40E94092E9B01AC010E94B42F20E0EB +:1027100030E040E05EE30E94B42F9B01AC0160E03A +:1027200070E080E09EE30E94A02D44C020E030E0F5 +:1027300040E05FE3C701B6010E94B42F6B017C014A +:1027400080E090E0A0E0BEE380930A0290930B0249 +:10275000A0930C02B0930D02BFC010920F03109211 +:10276000100310921103109212034AE0469F900149 +:10277000479F300D1124C90168EB7BE00E946E3148 +:10278000BC016C5D754077FF03C07195619571095F +:10279000882777FD8095982F0E94A42E2EE333EC96 +:1027A0004EE259E30E94B42F20E030E040EC5EE3BB +:1027B0000E94A12D60930A0270930B0280930C0279 +:1027C00090930D0289C010920F0310921003109283 +:1027D000110310921203CE0183709927892BE1F027 +:1027E000BE016170772780E090E00E94A22E20E079 +:1027F00030E040E05EE30E94B42F20E030E040E4AF +:102800005FE30E94A12D60930A0270930B028093F4 +:102810000C0290930D020CC080E090E0A0E0BFE3BA +:1028200080930A0290930B02A0930C02B0930D02C6 +:10283000C770DD27CD2B09F04FC010920A0210920D +:102840000B0210920C0210920D0246C010920F0360 +:1028500010921003109211031092120300E010E086 +:1028600020E03FE300930A0210930B0220930C0236 +:1028700030930D026739710578F180E090E00E9495 +:10288000A22E20E030E047E153E40E94A02D20E09A +:1028900030E04AE754E40E94092E20E030E048E4AA +:1028A00052E40E94B42F20E030E040EA51E40E945C +:1028B000E62E0E94712E660F771F660F771FFB01B1 +:1028C000E357FD4F2081318142815381C701B60119 +:1028D0000E94B42F6B017C01C701B601DF91CF913B +:1028E0001F910F91FF90EF90DF90CF90BF90AF902E +:1028F0009F908F900895809168030895CF93DF9300 +:1029000000D01F92CDB7DEB79C018091E8038430E0 +:1029100019F593E099833B832A839093E9008FEF25 +:102920009091E800815095FD06C095ED9A95F1F7DC +:1029300000008111F5CF8091E80085FF0DC040E0D7 +:1029400050E063E070E0CE0101960E94B7168091DE +:10295000E8008E778093E8000F900F900F90DF9142 +:10296000CF910895CF93DF9300D01F92CDB7DEB7FC +:102970002091E803243021F522E029839B838A8378 +:1029800083E08093E9008FEF9091E800815095FDFE +:1029900006C095ED9A95F1F700008111F5CF809171 +:1029A000E80085FF0DC040E050E063E070E0CE013C +:1029B00001960E94B7168091E8008E778093E80018 +:1029C0000F900F900F90DF91CF9108952091E80321 +:1029D0002430F1F422E02093E9002FEF3091E80059 +:1029E000215035FD06C035ED3A95F1F70000211173 +:1029F000F5CF2091E80025FF0BC040E050E065E0F6 +:102A000070E00E94B7168091E8008E778093E8000E +:102A10000895CF93DF932091E803243039F521E026 +:102A20002093E9002FEF3091E800215035FD06C0DA +:102A300035ED3A95F1F700002111F5CF2091E8002E +:102A400025FF14C0EC0140E050E068E070E00E9417 +:102A5000B7168091E8008E778093E80088E0FE0149 +:102A6000A0E6B3E001900D928A95E1F7DF91CF9156 +:102A700008958091E703811109C00E944C180E94BB +:102A8000A9188091E20084608093E200089510927A +:102A9000E7030895089508950C94A72742E061EC98 +:102AA00081E00E94C61742E061EC82E00E94C617F6 +:102AB00042E061EC83E00C94C6178091EA03833016 +:102AC00009F453C030F4813071F0823009F48CC0C5 +:102AD00008958A3009F478C08B3009F45EC08930DB +:102AE00009F09AC020C08091E903813A09F094C0AE +:102AF0008091E800877F8093E8008091ED039091BA +:102B0000EE03892B21F468E080E693E003C060E0E7 +:102B100080E090E070E00E9402178091E8008B77DF +:102B20008093E80008958091E903813209F074C030 +:102B30008091ED039091EE03892B09F06DC0809197 +:102B4000E800877F8093E8008091E80082FD05C05F +:102B50008091E8038111F8CF5FC08091F1008093EC +:102B600068038091E8008B7753C08091E903813A34 +:102B700009F052C08091ED039091EE03892B09F08A +:102B80004BC08091E800877F8093E8008091E80047 +:102B900080FFFCCF80911C0236C08091E903813216 +:102BA000D9F58091ED039091EE03892BA9F58091E1 +:102BB000E800877F8093E8000E94FB178091EB0379 +:102BC00080931C020C946C218091E903813221F5E1 +:102BD0008091E800877F8093E8000E94FB17809136 +:102BE000EC038093690308958091E903813AA1F48D +:102BF0008091E800877F8093E8008091E80080FF63 +:102C0000FCCF809169038093F1008091E8008E777A +:102C10008093E8000C94FB17089584B7877F84BFE6 +:102C200088E10FB6F89480936000109260000FBEA8 +:102C300090E080E80FB6F894809361009093610073 +:102C40000FBE0E949E1B0E944C180E94A9188091E2 +:102C5000E20084608093E20078940E942F1B0E941F +:102C6000A01B82E192E00E944A1B8091E80385301C +:102C700069F40E9461278091E6038823B1F30E94E2 +:102C80008F27882391F30E94A116EFCF0E94A81BE3 +:102C9000ECCF292F332723303105C9F064F42130DC +:102CA000310581F02230310509F043C084E590E020 +:102CB00020ED39E042C021323105F1F022323105F8 +:102CC00041F137C082E190E024E23AE036C0992732 +:102CD0008130910541F08230910541F0892B49F511 +:102CE000ECECF9E005C0EEE9F9E002C0E2E7F9E05A +:102CF000849190E09F0121C06330D8F4E62FF0E08A +:102D0000EE0FFF1FEA51FD4F2081318189E090E0F5 +:102D100014C0633070F470E0FB01EE0FFF1FE0524F +:102D2000FD4F20813181FB01E352FD4F808190E016 +:102D300004C080E090E020E030E0FA01318320839D +:102D4000089580E189BD82E189BD09B400FEFDCF0F +:102D50008091D8008F7D8093D8008091E0008260C0 +:102D60008093E0008091E00081FDFCCF0895CF9238 +:102D7000DF92EF92FF920F931F93CF93DF93EC01BB +:102D80008B016A010E941A18811133C0C114D10449 +:102D900039F0F60180819181081B190BC80FD91FEA +:102DA000E12CF12C0115110519F18091E80085FD48 +:102DB00016C08091E8008E778093E800C114D1049A +:102DC00049F0F60180819181E80EF91EF182E082DE +:102DD00085E00FC00E941A18882321F30AC0899148 +:102DE0008093F10001501109FFEFEF1AFF0ADACFCB +:102DF00080E0DF91CF911F910F91FF90EF90DF90D6 +:102E0000CF9008952091EF033091F00326173707F4 +:102E100048F06115710539F42091E8002E77209370 +:102E2000E80001C0B90140E061157105A9F12091E8 +:102E3000E803222309F443C0253009F442C020915D +:102E4000E80023FD40C02091E80022FD32C020911F +:102E5000E80020FFE9CF4091F3002091F20030E03C +:102E6000342BFC01CF016115710559F02830310573 +:102E700040F481918093F100615071092F5F3F4FC1 +:102E8000F1CF41E02830310509F040E02091E80021 +:102E90002E772093E800C8CF4111C9CF0AC0809196 +:102EA000E803882361F0853061F08091E80083FDBC +:102EB0000AC08091E80082FFF2CF80E0089582E0AE +:102EC000089583E0089581E008952091EF03309103 +:102ED000F0032617370748F06115710539F4209182 +:102EE000E8002E772093E80001C0B901FC0120E042 +:102EF0006115710591F18091E803882309F440C0C0 +:102F0000853009F43FC08091E80083FD3DC0809189 +:102F1000E80082FD2FC08091E80080FFE9CF20917A +:102F2000F3008091F20090E0922B6115710559F049 +:102F30008830910540F424912093F100319661503E +:102F400071090196F2CF21E0089709F020E0809105 +:102F5000E8008E778093E800CBCF2111CCCF0AC058 +:102F60008091E803882361F0853061F08091E8006A +:102F700083FD0AC08091E80082FFF2CF80E00895CF +:102F800082E0089583E0089581E00895982F9730B6 +:102F900058F59093E900981739F07091EC00209162 +:102FA000ED005091F00003C0242F762F50E021FF58 +:102FB00019C03091EB003E7F3093EB003091ED0073 +:102FC0003D7F3093ED003091EB0031603093EB00AA +:102FD0007093EC002093ED005093F0002091EE00F0 +:102FE00027FF07C09F5FD3CF8F708093E90081E0F8 +:102FF000089580E008958091E90387FF11C08091D2 +:10300000E80082FD05C08091E8038111F8CF11C06E +:103010008091E8008B770BC08091E803882349F00A +:103020008091E80080FFF8CF8091E8008E77809350 +:10303000E80008952091E4003091E50095E6409184 +:10304000EC00842F817040FF22C08091E80080FD59 +:103050001CC08091E803882391F0853091F0809125 +:10306000EB0085FD10C04091E4005091E50042174F +:10307000530729F39A01915011F784E0089582E0F3 +:10308000089583E0089581E0089580E008954091D7 +:10309000E80042FFDECF08950E94BA180E94C218CD +:1030A000E0EEF0E0808181608083E8EDF0E08081F7 +:1030B0008F77808319BCA7EDB0E08C918E7F8C93C5 +:1030C00080818F7E80831092E70308950F931F9372 +:1030D000CF93DF930E94BA180E94C218C8EDD0E0C7 +:1030E00088818F77888388818068888388818F7DB5 +:1030F000888319BC1092E8031092E4031092E6034F +:103100001092E50300EE10E0F80180818B7F808350 +:1031100088818160888342E060E080E00E94C61779 +:10312000E1EEF0E080818E7F8083E2EEF0E080814E +:1031300081608083808188608083F80180818E7FB8 +:103140008083888180618883DF91CF911F910F9167 +:103150000895E8EDF0E080818F7E8083E7EDF0E078 +:1031600080818160808384E082BF81E08093E70377 +:103170000C946618E8EDF0E080818E7F80831092D9 +:10318000E20008951092DA001092E10008951F9273 +:103190000F920FB60F9211242F933F934F935F938B +:1031A0006F937F938F939F93AF93BF93EF93FF930F +:1031B0008091E10082FF0BC08091E20082FF07C096 +:1031C0008091E1008B7F8093E1000E942E1B809113 +:1031D000DA0080FF1FC08091D80080FF1BC0809163 +:1031E000DA008E7F8093DA008091D90080FF0DC0D5 +:1031F00080E189BD82E189BD09B400FEFDCF81E097 +:103200008093E8030E94391505C019BC1092E803A9 +:103210000E9447158091E10080FF19C08091E20073 +:1032200080FF15C08091E2008E7F8093E200809144 +:10323000E20080618093E2008091D80080628093F8 +:10324000D80019BC85E08093E8030E944B1580915B +:10325000E10084FF30C08091E20084FF2CC080E157 +:1032600089BD82E189BD09B400FEFDCF8091D800FF +:103270008F7D8093D8008091E1008F7E8093E10064 +:103280008091E2008F7E8093E2008091E200816075 +:103290008093E2008091E403882311F084E007C06A +:1032A0008091E30087FD02C081E001C083E080934C +:1032B000E8030E944C158091E10083FF29C08091B2 +:1032C000E20083FF25C08091E100877F8093E100C9 +:1032D00082E08093E8031092E4038091E1008E7F06 +:1032E0008093E1008091E2008E7F8093E2008091E4 +:1032F000E20080618093E20042E060E080E00E94B2 +:10330000C6178091F00088608093F0000E944A15F3 +:10331000FF91EF91BF91AF919F918F917F916F91AD +:103320005F914F913F912F910F900FBE0F901F9083 +:1033300018951F920F920FB60F9211242F933F935F +:103340004F935F936F937F938F939F93AF93BF93AD +:10335000CF93DF93EF93FF93C091E900CF708091FB +:10336000EC00D82FD17080FDD0E81092E900809158 +:10337000F000877F8093F00078940E94DD1910920E +:10338000E9008091F00088608093F000CD2BCF7031 +:10339000C093E900FF91EF91DF91CF91BF91AF9181 +:1033A0009F918F917F916F915F914F913F912F915D +:1033B0000F900FBE0F901F9018951F93CF93DF9320 +:1033C000CDB7DEB7AA970FB6F894DEBF0FBECDBF5C +:1033D000E9EEF3E088E08E0F9091F10091938E1367 +:1033E000FBCF0E945D158091E80083FF1FC1809193 +:1033F000E9039091EA03492F50E04A30510508F063 +:1034000015C1FA01EE59FF4F0C949631803881F0C6 +:10341000823809F00BC18091ED038F708093E90031 +:103420008091EB0085FB882780F91092E90006C0A7 +:103430008091E5039091E603911182609091E800FC +:10344000977F9093E8008093F1001092F100C8C03C +:10345000282F2D7F09F0EAC0882319F0823061F00F +:10346000E5C08091EB03813009F0E0C0933009F0B2 +:1034700080E08093E6032BC08091EB03811127C08D +:103480008091ED038F7009F4D1C08093E900209101 +:10349000EB0020FF1CC0933021F48091EB00806290 +:1034A00014C09091EB0090619093EB0021E030E02C +:1034B000A90102C0440F551F8A95E2F74093EA0024 +:1034C0001092EA008091EB0088608093EB001092EC +:1034D000E9008091E800877F86C08111A7C0109124 +:1034E000EB031F778091E3008078812B8093E300CA +:1034F0008091E800877F8093E8000E94FB1780910D +:10350000E80080FFFCCF8091E30080688093E300B7 +:10351000111102C082E001C083E08093E80386C0FD +:103520008058823008F082C08091EB039091EC03C8 +:103530008C3D53E0950779F583E08A838AE289839D +:103540004FB7F894DE01139620E03EE051E2E32FFE +:10355000F0E050935700E49120FF03C0E295EF7034 +:103560003F5FEF708E2F90E0EA3010F0C79601C0F9 +:10357000C0968D939D932F5F243149F74FBF809163 +:10358000E800877F8093E8006AE270E0CE01019650 +:103590000E94021714C0AE014F5F5F4F6091ED03B0 +:1035A0000E944916BC01009709F440C09091E800C0 +:1035B000977F9093E80089819A810E946517809196 +:1035C000E8008B778093E80031C0803879F58091EE +:1035D000E800877F8093E8008091E4038093F10006 +:1035E0008091E8008E778093E8000E94FB171EC050 +:1035F00081111CC09091EB039230C0F48091E800DF +:10360000877F8093E8009093E4030E94FB178091EA +:10361000E403811106C08091E30087FD02C081E0D0 +:1036200001C084E08093E8030E944E158091E80079 +:1036300083FF0AC08091E800877F8093E800809133 +:10364000EB0080628093EB00AA960FB6F894DEBF81 +:103650000FBECDBFDF91CF911F9108950895CF93F5 +:103660008091E8038823A1F0C091E900CF70909188 +:10367000EC00892F817090FD80E8C82B1092E90042 +:103680008091E80083FD0E94DD19CF70C093E900AE +:10369000CF91089590936F0380936E030895E09106 +:1036A0006E03F0916F03309721F00190F081E02DCF +:1036B000099480E00895E0916E03F0916F033097D4 +:1036C00021F00280F381E02D09940895E0916E03CA +:1036D000F0916F03309721F00480F581E02D09947B +:1036E000089520916C0330916D038217930771F058 +:1036F00090936D0380936C03E0916E03F0916F03E0 +:10370000309721F00680F781E02D099408952091EB +:103710006A0330916B038217930771F090936B03E8 +:1037200080936A03E0916E03F0916F03309721F06C +:103730000084F185E02D0994089508950C949D1B53 +:103740000E94DB270E94D20B0E9461280C94092D55 +:103750004F925F927F928F929F92AF92BF92CF9241 +:10376000DF92EF92FF920F931F93CF93DF93CDB72A +:10377000DEB72A970FB6F894DEBF0FBECDBF0E940A +:10378000AD0C91E7C92E93E0D92E00E010E0AA24F9 +:10379000A394B12C702E802F0E94E60D4C01F601EF +:1037A000419051906F014826592641145104B1F4BB +:1037B0000F5F1F4F0530110569F78FEF89838A83EB +:1037C0001B820E94E4278160782F9D838C8349812E +:1037D0005A816B818D810E94611C3AC08091C70320 +:1037E00081FD0E94EF0D20E030E07501022E02C045 +:1037F000EE0CFF1C0A94E2F7C70184219521892B66 +:1038000009F12E837F828E209F2091E0892809F480 +:1038100090E098870E94E4278160782F9A878987B3 +:103820004E815F8168858A850E94611C000F111F8F +:10383000F801EF58FC4F80819181E826F926F1824A +:10384000E08206C02F5F3F4F2C30310571F6B0CFBC +:103850000E94482A109170030E944F1B1817D9F03C +:103860000E944F1B809370032A960FB6F894DEBF18 +:103870000FBECDBFDF91CF911F910F91FF90EF90C1 +:10388000DF90CF90BF90AF909F908F907F905F9090 +:103890004F900C940A0B2A960FB6F894DEBF0FBE19 +:1038A000CDBFDF91CF911F910F91FF90EF90DF90EF +:1038B000CF90BF90AF909F908F907F905F904F90F0 +:1038C0000895CF93DF93CDB7DEB72B970FB6F8945B +:1038D000DEBF0FBECDBF4F83588769877A878B873E +:1038E000DE01119686E0FD0111928A95E9F785E0E7 +:1038F000FE01379601900D928A95E1F749815A8130 +:103900006B817C818D819E810E9406242B960FB64F +:10391000F894DEBF0FBECDBFDF91CF910895CF9356 +:10392000882309F4C2C0C82F823859F40E944F1B63 +:1039300081FDBBC089E30E94AF260E94322789E344 +:103940000CC0833879F40E944F1B80FDAEC083E524 +:103950000E94AF260E94322783E50E94CC26CF9199 +:103960000C943227843859F40E944F1B82FD9DC06D +:1039700087E40E94AF260E94322787E4EECF8CEFC7 +:103980008C0F813A48F48C2F0E94712C81118DC0CC +:103990008C2F0E94AF26E3CF80E28C0F883048F452 +:1039A000C77081E001C0880FCA95EAF70E94EB2634 +:1039B000D6CF8BE58C0F833078F4C53A29F0C63A20 +:1039C00031F083E890E005C081E890E002C082E831 +:1039D00090E0CF910C94711B88E58C0F833108F037 +:1039E00064C0C83A39F1C93A41F1CA3A49F1CB3A0F +:1039F00051F1CC3A59F1CD3A61F1C03B69F1CE3A7F +:103A000071F1CF3A79F1C13B81F1C23B89F1C33BFE +:103A100091F1C43B99F1C53BA1F1C63BA9F1C73B6C +:103A2000B1F1C83BB9F1C93BC1F1CA3BC9F180E072 +:103A300090E038C082EE90E035C089EE90E032C070 +:103A40008AEE90E02FC085EB90E02CC086EB90E0F2 +:103A500029C087EB90E026C08CEC90E023C08DEC71 +:103A600090E020C083E891E01DC08AE891E01AC090 +:103A700082E991E017C084E991E014C081E292E00C +:103A800011C083E292E00EC084E292E00BC085E2B6 +:103A900092E008C086E292E005C087E292E002C0B0 +:103AA0008AE292E0CF910C94871BCF9108958823EE +:103AB00009F44BC0823859F40E944F1B81FF45C066 +:103AC00089E30E94AF260E94322789E30CC0833825 +:103AD00071F40E944F1B80FF38C083E50E94AF261F +:103AE0000E94322783E50E94CC260C94322784382A +:103AF00059F40E944F1B82FF28C087E40E94AF2622 +:103B00000E94322787E4EFCF9CEF980F913A58F349 +:103B100090E2980F983050F4877091E001C0990FAF +:103B20008A95EAF7892F0E94F126DFCF9BE5980F4F +:103B3000933020F480E090E00C94711B885A83311C +:103B400020F480E090E00C94871B0895882321F0F6 +:103B50000E94EB260C9432270895882321F00E94BE +:103B6000F1260C9432270895BF92CF92DF92EF9204 +:103B7000FF920F931F93CF93DF9300D000D000D01C +:103B8000CDB7DEB725E0FC01DE01119601900D9264 +:103B90002A95E1F7FC01D0801181028125812295CF +:103BA0002F7043815481452B09F472C31F3F21F4C8 +:103BB000FFEFDF1609F46CC37C012E830E94D3074C +:103BC000D9821A8369817A81802F0E94AB26182FAF +:103BD000B92E0E9460260E9427252E81002319F00D +:103BE0000E9408272E81EB2DE295EF70F0E0E4595A +:103BF000FF4F0C9496318B2D807F9B2D9F70F92E5B +:103C0000882319F0F29480EFF822002389F0FF2036 +:103C100009F47CC280E2810F883020F48F2D0E944D +:103C2000EB2603C08F2D0E94FB260E9432276EC216 +:103C3000812F0E94571DFF2009F42AC3105E8F2D8B +:103C4000183018F40E94F12602C00E94012726961F +:103C50000FB6F894DEBF0FBECDBFDF91CF911F919D +:103C60000F91FF90EF90DF90CF90BF900C94322790 +:103C70008B2D807F9B2D9F70803211F4892F03C084 +:103C8000892F8295807F112319F0113011F12BC0FB +:103C90000023A9F0222389F1213079F526960FB669 +:103CA000F894DEBF0FBECDBFDF91CF911F910F9172 +:103CB000FF90EF90DF90CF90BF900C941B272223B2 +:103CC00019F0213009F4E4C28E830E941E278E81F0 +:103CD0009BC1002321F0263008F0DAC20EC0253047 +:103CE00008F0D6C291C10023C9F0222331F0F701B8 +:103CF000958190FF0BC29F70958326960FB6F8941E +:103D0000DEBF0FBECDBFDF91CF911F910F91FF900E +:103D1000EF90DF90CF90BF900C94A61D222309F462 +:103D200073C109C22B2D26952695237030E02115ED +:103D3000310521F021303105D1F0AAC2002321F054 +:103D4000812F9B2D937002C080E090E026960FB6E5 +:103D5000F894DEBF0FBECDBFDF91CF911F910F91C1 +:103D6000FF90EF90DF90CF90BF900C94711B0023D9 +:103D700021F0812F9B2D937002C080E090E0269669 +:103D80000FB6F894DEBF0FBECDBFDF91CF911F916C +:103D90000F91FF90EF90DF90CF90BF900C94871B16 +:103DA000812F002319F00E94502902C00E94B829D7 +:103DB00026960FB6F894DEBF0FBECDBFDF91CF9130 +:103DC0001F910F91FF90EF90DF90CF90BF900C94D8 +:103DD0003D2A8B2D837009F07BC0011159C2812FC0 +:103DE000829586958770880F880F912F9F70C92EB6 +:103DF000D12CE12CF12C082E04C0CC0CDD1CEE1CC7 +:103E0000FF1C0A94D2F714FF12C04FE050E060E0AC +:103E100070E004C0440F551F661F771F8A95D2F7C4 +:103E2000CB01BA01609570958095909503C060E0D4 +:103E300070E0CB012B2D269526952370422F50E064 +:103E400042305105D9F04330510569F16C297D2983 +:103E50008E299F294130510551F126960FB6F894CD +:103E6000DEBF0FBECDBFDF91CF911F910F91FF90AD +:103E7000EF90DF90CF90BF900C944E256C297D2958 +:103E80008E299F2926960FB6F894DEBF0FBECDBFB0 +:103E9000DF91CF911F910F91FF90EF90DF90CF9026 +:103EA000BF900C946A250E944E25C701B601269644 +:103EB0000FB6F894DEBF0FBECDBFDF91CF911F913B +:103EC0000F91FF90EF90DF90CF90BF900C94322530 +:103ED000002319F08B2D817001C08695882309F489 +:103EE000D7C1812F829586958770880F880F912F73 +:103EF0009F70C92ED12CE12CF12C082E04C0CC0CC3 +:103F0000DD1CEE1CFF1C0A94D2F714FF12C04FE018 +:103F100050E060E070E004C0440F551F661F771F3B +:103F20008A95D2F7CB01BA016095709580959095EE +:103F300003C060E070E0CB012B2D26952695237001 +:103F4000422F50E042305105D9F04330510569F11C +:103F50006C297D298E299F294130510551F12696E2 +:103F60000FB6F894DEBF0FBECDBFDF91CF911F918A +:103F70000F91FF90EF90DF90CF90BF900C94282688 +:103F80006C297D298E299F2926960FB6F894DEBFCD +:103F90000FBECDBFDF91CF911F910F91FF90EF909A +:103FA000DF90CF90BF900C9444260E942826C70132 +:103FB000B60126960FB6F894DEBF0FBECDBFDF91D7 +:103FC000CF911F910F91FF90EF90DF90CF90BF9016 +:103FD0000C940C26103F49F118F4103E48F491C09F +:103FE000123F09F453C0E8F1133F09F464C089C0DB +:103FF0001F708B2D8F71002321F00E94A525812F2A +:104000007CCE0E94C625812F26960FB6F894DEBF7F +:104010000FBECDBFDF91CF911F910F91FF90EF9019 +:10402000DF90CF90BF900C94AD1D0023B1F02530F0 +:1040300008F02EC18B2D8F7126960FB6F894DEBF37 +:104040000FBECDBFDF91CF911F910F91FF90EF90E9 +:10405000DF90CF90BF900C94EB25263008F018C16C +:10406000E9CF0023A9F08B2D8F7126960FB6F89417 +:10407000DEBF0FBECDBFDF91CF911F910F91FF909B +:10408000EF90DF90CF90BF900C94A525002359F3BB +:104090008B2D8F7126960FB6F894DEBF0FBECDBF65 +:1040A000DF91CF911F910F91FF90EF90DF90CF9014 +:1040B000BF900C94C625002399F08B2D8F71269606 +:1040C0000FB6F894DEBF0FBECDBFDF91CF911F9129 +:1040D0000F91FF90EF90DF90CF90BF900C949025C0 +:1040E00026960FB6F894DEBF0FBECDBFDF91CF91FD +:1040F0001F910F91FF90EF90DF90CF90BF900C94A5 +:1041000086250023A9F0222309F4ADCF812F26961E +:104110000FB6F894DEBF0FBECDBFDF91CF911F91D8 +:104120000F91FF90EF90DF90CF90BF900C948F1C79 +:10413000222309F4ADCF812F26960FB6F894DEBF67 +:104140000FBECDBFDF91CF911F910F91FF90EF90E8 +:10415000DF90CF90BF900C94571D4B2D4F70612F67 +:10416000C7010E940B0626960FB6F894DEBF0FBE5D +:10417000CDBFDF91CF911F910F91FF90EF90DF9016 +:10418000CF90BF900C94AA24011182C09B2D9F70E8 +:10419000492F50E04230510509F443C0C4F44115A1 +:1041A000510571F14130510509F072C026960FB6E4 +:1041B000F894DEBF0FBECDBFDF91CF911F910F915D +:1041C000FF90EF90DF90CF90BF900C94312D433053 +:1041D0005105C1F14430510509F05AC0812F26968E +:1041E0000FB6F894DEBF0FBECDBFDF91CF911F9108 +:1041F0000F91FF90EF90DF90CF90BF900C94832DA4 +:1042000026960FB6F894DEBF0FBECDBFDF91CF91DB +:104210001F910F91FF90EF90DF90CF90BF900C9483 +:104220001A2D26960FB6F894DEBF0FBECDBFDF91D4 +:10423000CF911F910F91FF90EF90DF90CF90BF90A3 +:104240000C944D2D26960FB6F894DEBF0FBECDBF51 +:10425000DF91CF911F910F91FF90EF90DF90CF9062 +:10426000BF900C94602D4B2D4F70612FC701269687 +:104270000FB6F894DEBF0FBECDBFDF91CF911F9177 +:104280000F91FF90EF90DF90CF90BF900C94D507E7 +:1042900026960FB6F894DEBF0FBECDBFDF91CF914B +:1042A0001F910F91FF90EF90DF90CF90BF900895F6 +:1042B0000E9408270E9418270E94DD260E943227AC +:1042C0000E94EE2A0E943D2A80E090E00E94711B2D +:1042D00080E090E00C94871B0E94F8260C945821F3 +:1042E0000E94A026292F22952F7030E02C30310516 +:1042F0004CF42A3031056CF422503109223031055A +:1043000088F407C02C30310549F02F30310531F0E9 +:1043100009C0803E48F0803F29F406C093FB8827FF +:1043200080F9089580E0089581E00895CF93DF93A8 +:1043300000D000D01F92CDB7DEB70F900F900F9036 +:104340000F900F90DF91CF910895CF93DF9300D01E +:1043500000D000D0CDB7DEB726960FB6F894DEBFFA +:104360000FBECDBFDF91CF9108951F93CF93DF9301 +:10437000C0917B0316E080917C03C81799F0D0E0D0 +:104380001C9FF0011D9FF00D1124E358FC4F40814C +:10439000518162817381848195810E94A52121963A +:1043A000C770E9CFDF91CF911F9108954091AD0380 +:1043B0005091AE036091AF037091B0038091B1034F +:1043C0009091B2030C94A5218091B20382958F70D5 +:1043D00009F054C08091AF03882309F44FC0809145 +:1043E0007B03A0917C036091AD037091AE0340917B +:1043F000B0035091B103B6E08A1709F43FC090E0D2 +:1044000041155105C1F17F3F11F46F3FA1F1B89FF4 +:10441000F001B99FF00D1124E358FC4F2181721374 +:104420002AC02081621327C02281211124C0238148 +:1044300034812417350710F421503109241B350B22 +:10444000283C3105C0F42091B2032F7020612093E5 +:10445000B20326E0289FF001299FF00D1124EE57AA +:10446000FC4F80818F70806180838DEA93E00E9491 +:10447000B41D0C94B52101968770BECF0895CF92DC +:10448000DF92EF92FF920F931F93CF93DF93CDB7FD +:10449000DEB762970FB6F894DEBF0FBECDBF8C01BA +:1044A00085E0F801DE011D9601900D928A95E1F7F5 +:1044B000D8014C9111965C91119712966C911297BC +:1044C0001396CD90DC9014973091AD037091AE03AC +:1044D0008091B0039091B103009709F46BC17F3FC5 +:1044E00019F43F3F09F466C1E090AF03EE2009F4F0 +:1044F000C0C02091B203C816D90628F0F601E81B07 +:10450000F90BCF0104C0809590958C0D9D1DFF2463 +:10451000F394883C910578F0F12C207F09F0C6C017 +:104520007C2DD98AC88A89890E9496218DEA93E0D8 +:104530000E94B41DB1C0822F807F09F046C0751360 +:1045400014C0341312C0611110C02F702061209369 +:10455000B2030E94D6218DEA93E00E94B41D80919F +:10456000B203D80115968C932EC0CD2819F15F3F68 +:1045700011F44F3FF9F0F62E61111CC080917B03BE +:1045800020917C0336E0821709F45AC090E0389FEE +:10459000F001399FF00D1124E358FC4F718157133E +:1045A00006C07081471303C07281711103C0019668 +:1045B0008770E9CFF62E662309F418C18091B20303 +:1045C00081608093B203F12C11C1751308C03413BC +:1045D00006C0611104C08091B203D801C3C04D87E9 +:1045E0005E878D859E856A8B0E9470216A898823EB +:1045F000E1F16623D1F12091B203822F82958F7071 +:1046000090E0029774F08091AD039091AE0398878B +:104610008F831986DB86CA862C87CE0107960E9477 +:10462000B41D86E0F801ADEAB3E001900D928A95E1 +:10463000E1F70E94E4210E94D621FF24F394D6C022 +:104640004D875E878D859E850E94A026292F229505 +:104650002F7030E0223031050CF0BCC09F7009F0A3 +:10466000B6C0805E883008F4C1C0C8010E94B41D85 +:10467000E4CFC816D90608F453C0F601E81BF90BBD +:10468000CF01883C910508F450C0F12C7C2DD98ACB +:10469000C88A89890E949621EDEAF3E086E0DF016D +:1046A0001D928A95E9F70E94D621A0C0751314C007 +:1046B000341312C0611110C08091B203F8018583D8 +:1046C000C8010E94B41D86E0EDEAF3E0DF011D920F +:1046D0008A95E9F7FE2C8AC04D875E878D859E8579 +:1046E0006A8B0E9470216A89882309F4BECF6623F1 +:1046F00009F4BBCF2091B203822F82958F7090E096 +:1047000002970CF48ECF8091AD039091AE039A8303 +:1047100089831B82DD82CC822E83CE0101967FCFDE +:10472000809590958C0D9D1DACCFF62E662309F4D7 +:104730009CCF75132EC034132CC02091B20320FDE2 +:104740001FC0822F82958F70D9F0D80115962C93B7 +:1047500015978F3049F08F5F982F9295907F822F19 +:104760008F70892B15968C93C8010E94B41D86E02A +:10477000F801ADEAB3E001900D928A95E1F793CF8D +:1047800086E0F801ADEAB3E001900D928A95E1F779 +:104790002DC04D875E878D859E850E947021811179 +:1047A00040CF8091B20381608093B203C8010E9420 +:1047B000B41D1CC0662309F458CF4D875E878D85D4 +:1047C0009E850E947021882309F44FCF2ACF811142 +:1047D00048CF0CC0243031050CF047CF9F7009F44E +:1047E00040CFF8019581907F09F03BCF8F2D6296E5 +:1047F0000FB6F894DEBF0FBECDBFDF91CF911F91F2 +:104800000F91FF90EF90DF90CF9008951F93CF937B +:10481000DF93CDB7DEB72C970FB6F894DEBF0FBE8F +:10482000CDBF4F83588769877A878B879C87CE0156 +:1048300007960E943F22882369F08F8198852A85F8 +:104840003B85232BF1F19F3F09F063C08F3F09F0B7 +:1048500060C037C086E0FE013796DE0111960190F8 +:104860000D928A95E1F76F817885EA85FB8530970F +:1048700041F17F3F11F46F3F21F120917C0330E043 +:10488000C90101968770992740917B0350E08417F6 +:10489000950709F447C069837A83FD83EC8396E02A +:1048A000929FD001939FB00D1124A358BC4FFE01DD +:1048B000319601900D929A95E1F780937C030E94C6 +:1048C000B52116E080917B0390917C038917C1F19B +:1048D000189FC001112483589C4F0E943F228823B7 +:1048E00079F1E0917B031E9FF0011124E358FC4F06 +:1048F0004081518162817381848195810E94A521CB +:1049000080917B0390E001968770992780937B03C9 +:10491000D9CF4F81588569857A858B859C850E9482 +:10492000A521CFCF0E946C2110927C0310927B03B3 +:10493000EDEAF3E086E0DF011D928A95E9F7C1CF49 +:104940002C960FB6F894DEBF0FBECDBFDF91CF918E +:104950001F910895EF92FF920F931F93CF93DF93D0 +:104960008C01009709F46CC0F12CEE24E394E8016B +:104970002196F8018491843740F4843008F051C0C6 +:10498000813081F0823019F15BC0853709F444C071 +:10499000A8F19CE7980F903708F052C08F770E94DB +:1049A000571D41C00E5F1F4FFE01C49180E28C0F66 +:1049B000883048F4C7708E2D01C0880FCA95EAF779 +:1049C0000E940B2714C08C2F0E948F1C2DC00E5FDD +:1049D0001F4FFE01C49180E28C0F883058F4C770DD +:1049E0008E2D01C0880FCA95EAF70E9411270E94F8 +:1049F00032271AC08C2F0E94571D16C00E5F1F4F02 +:104A0000FE01C491CC2381F08FE99FE00197F1F77B +:104A100000C00000C150F6CF0E5F1F4FFE01F490A2 +:104A200003C00E948F1C8E018F2D882309F49FCF15 +:104A3000EFE9FFE03197F1F700C000008150F5CFBA +:104A4000DF91CF911F910F91FF90EF9008950895FE +:104A50006093B7037093B8038093B9039093BA033C +:104A60000C9458210F931F930091B7031091B80332 +:104A70002091B9033091BA03DC01CB01802B912B3B +:104A8000A22BB32B8093B7039093B803A093B903E1 +:104A9000B093BA031F910F910C9458210F931F9359 +:104AA0000091B7031091B8032091B9033091BA0374 +:104AB000DC01CB0180239123A223B3238093B7038E +:104AC0009093B803A093B903B093BA031F910F91C9 +:104AD0000C9458210F931F930091B7031091B803C2 +:104AE0002091B9033091BA03DC01CB0180279127D3 +:104AF000A227B3278093B7039093B803A093B90379 +:104B0000B093BA031F910F910C9458211092B303E4 +:104B10001092B4031092B5031092B6030C9458216E +:104B200041E050E060E070E004C0440F551F661F94 +:104B3000771F8A95D2F74093B3035093B4036093E1 +:104B4000B5037093B6030C94582141E050E060E047 +:104B500070E004C0440F551F661F771F8A95D2F777 +:104B60008091B3039091B403A091B503B091B603C3 +:104B7000482B592B6A2B7B2B4093B3035093B403E0 +:104B80006093B5037093B6030C94582141E050E054 +:104B900060E070E004C0440F551F661F771F8A95C0 +:104BA000D2F740955095609570958091B3039091A0 +:104BB000B403A091B503B091B603482359236A23E7 +:104BC0007B234093B3035093B4036093B503709376 +:104BD000B6030C94582141E050E060E070E004C05E +:104BE000440F551F661F771F8A95D2F78091B30334 +:104BF0009091B403A091B503B091B603482759270B +:104C00006A277B274093B3035093B4036093B503A3 +:104C10007093B6030C9458210F931F930091B30324 +:104C20001091B4032091B5033091B603DC01CB01A0 +:104C3000802B912BA22BB32B8093B3039093B403BF +:104C4000A093B503B093B6031F910F910C94582114 +:104C50000F931F930091B3031091B4032091B503F8 +:104C60003091B603DC01CB0180239123A223B3232F +:104C70008093B3039093B403A093B503B093B603AA +:104C80001F910F910C9458210F931F930091B30320 +:104C90001091B4032091B5033091B603DC01CB0130 +:104CA00080279127A227B3278093B3039093B4035F +:104CB000A093B503B093B6031F910F910C945821A4 +:104CC0000895CF92DF92EF92FF920F931F93CF93AD +:104CD000DF938C01C090B703D090B803E090B90384 +:104CE000F090BA038091B3039091B403A091B503FF +:104CF000B091B603C82AD92AEA2AFB2ACFE1D0E02C +:104D0000D701C6010C2E04C0B695A7959795879537 +:104D10000A94D2F780FF06C0B8018C2F0E942F0A98 +:104D2000019721F4219760F780E001C08C2FDF917B +:104D3000CF911F910F91FF90EF90DF90CF9008954A +:104D4000CF93DF93EC010E946126BE010E942F0ADF +:104D5000DF91CF910895CB010E94A0260895209164 +:104D60001D0230911E02F90132969FEF40E05191F1 +:104D7000581789F09F3F19F4511101C0942F4F5FCC +:104D80004630A9F79F3F39F0F901E90FF11D97FD72 +:104D9000FA9582830895089520911D0230911E0294 +:104DA000F9013296285F3F4F9081981301C010821D +:104DB0003196E217F307C1F7089581E090E0E091A2 +:104DC0001D02F0911E02E80FF91F10820196883033 +:104DD0009105A9F708959091C603892B8093C60386 +:104DE000089580959091C60389238093C603089502 +:104DF0001092C60308959091C503892B8093C50333 +:104E0000089580959091C50389238093C5030895E3 +:104E10001092C50308959091C403892B8093C40315 +:104E2000089580959091C40389238093C4030895C5 +:104E30001092C40308958093BB0308951092BB039E +:104E4000089580911D0290911E02FC0131969C01F3 +:104E5000285F3F4F80E0919191118F5FE217F30738 +:104E6000D1F70895E0911D02F0911E028091C603D2 +:104E70008083E0911D02F0911E0290818091C50314 +:104E8000892B8083E0911D02F0911E029081809118 +:104E9000C403892B80838091BB03882361F0E09158 +:104EA0001D02F0911E029081892B80830E94212790 +:104EB00081111092BB0380911D0290911E020C94EF +:104EC0005B1B8091E803843039F11092C80320E421 +:104ED00088E190E00FB6F894A895809360000FBE2B +:104EE0002093600080E00E94D20580E00E940A0BBF +:104EF00083B7817F846083BF83B7816083BF7894E9 +:104F0000889583B78E7F83BF88E10FB6F89480932E +:104F10006000109260000FBE089508950895CF9329 +:104F200080E00E94D2050E948D270E94AD0C0E9455 +:104F30008E27C0E08C2F0E94E60D892B29F4CF5FCD +:104F4000C530C1F780E001C081E0CF9108950E9493 +:104F50006C2180E00E94D2050E94092D0E944F1B07 +:104F60000C940A0B1F920F920FB60F9211248F937D +:104F70009F93AF93BF938091C803811113C0809119 +:104F8000C9039091CA03A091CB03B091CC03419681 +:104F9000A11DB11D8093C9039093CA03A093CB03B5 +:104FA000B093CC03BF91AF919F918F910F900FBEA3 +:104FB0000F901F90189582E084BD93E095BD9AEF05 +:104FC00097BD80936E0008952FB7F8948091C90320 +:104FD0009091CA03A091CB03B091CC032FBF089549 +:104FE000CF92DF92EF92FF920F931F932FB7F89417 +:104FF0004091C9035091CA036091CB037091CC03D7 +:105000002FBF6A017B01EE24FF248C0120E030E0F9 +:10501000C016D106E206F30610F4415051099A0178 +:10502000281B390BC9011F910F91FF90EF90DF9062 +:10503000CF9008951F920F920FB60F9211248F9365 +:105040009F93AF93BF938091C9039091CA03A0919E +:10505000CB03B091CC030196A11DB11D8093C90370 +:105060009093CA03A093CB03B093CC03BF91AF91AD +:105070009F918F910F900FBE0F901F9018950E94D7 +:105080004C18F8942FEF87EA91E621508040904029 +:10509000E1F700C0000087E090EBDC018093F303B0 +:1050A0009093F403A093F503B093F6039CE088E19A +:1050B0000FB6F894A895809360000FBE909360009F +:1050C000FFCF0E949B28811102C00E9477280E9476 +:1050D000A6288093C7030E94B3288093F1030E94FF +:1050E000AA28682F70E080E090E00C9428256DEEEF +:1050F0007EEF80E090E00E94BC3160E082E090E0D2 +:105100000E94AA3160E083E090E00E94AA3160E052 +:1051100084E090E00E94AA3160E085E090E00E9487 +:10512000AA3160E086E090E00E94AA316FEF87E04C +:1051300090E00C94AA3180E090E00E94A43121E03C +:105140008D3E9E4F09F020E0822F089582E090E08E +:105150000C949C3183E090E00C949C31682F83E0A8 +:1051600090E00C94AA3184E090E00C949C31682F7C +:1051700084E090E00C94AA3186E090E00C949C319D +:10518000682F86E090E00C94AA3187E090E00C94C0 +:105190009C31682F87E090E00C94AA318091CF0376 +:1051A00080FF0BC06091220285E0689FB00111244E +:1051B00075956795759567952BC081FF09C06091BE +:1051C000220285E0689FB00111247595679520C083 +:1051D00082FF07C06091220285E0689FB001112420 +:1051E00017C09091D0039923D1F0609121029617B6 +:1051F00088F72091220285E0289F90011124929F38 +:10520000A001939F500D112470E0CA010E948231C9 +:105210006038710540F46115710539F002C065E030 +:1052200070E0862F08958FE7089581E008958091BA +:10523000CF0380FF08C06091200270E075956795EC +:105240007595679521C081FF06C06091200270E0CE +:105250007595679519C082FF04C06091200270E0C7 +:1052600010C09091D0039923C1F060911F0296174E +:10527000A0F780912002899FC001112470E00E9454 +:1052800082316038710528F46115710521F0862F8F +:1052900008958FE7089581E0089561E070E0F4CF0C +:1052A000803F21F40E94CE28819504C0813F29F4DB +:1052B0000E94CE288093D3030895823F21F40E9458 +:1052C000CE28819504C0833F29F40E94CE28809384 +:1052D000D2030895893F19F40E94172905C08A3F17 +:1052E00031F40E94172981958093D40308958B3F50 +:1052F00021F40E941729819504C08C3F29F40E9453 +:1053000017298093D5030895843F21F48091D10318 +:10531000816017C0853F21F48091D103826011C064 +:10532000863F21F48091D10384600BC0873F21F434 +:105330008091D103886005C0883F31F48091D1030A +:1053400080618093D10308958D3F21F48091CF0334 +:1053500081600BC08E3F21F48091CF03826005C035 +:105360008F3F29F48091CF0384608093CF03089509 +:10537000803F39F48091D30387FF6CC01092D30330 +:1053800069C0813F29F48091D3031816BCF362C031 +:105390009091D203823F29F497FF5CC01092D20310 +:1053A00059C0833F19F41916CCF354C0893F41F416 +:1053B0008091D40318160CF04DC01092D4034AC04B +:1053C0008A3F29F48091D40387FF44C0F6CF8B3FF6 +:1053D00039F48091D50387FF3DC01092D5033AC0C0 +:1053E0008C3F29F48091D5031816BCF333C0843F59 +:1053F00021F48091D1038E7F17C0853F21F48091E5 +:10540000D1038D7F11C0863F21F48091D1038B7F22 +:105410000BC0873F21F48091D103877F05C0883F6F +:1054200031F48091D1038F7E8093D10313C08D3FDF +:1054300021F48091CF038E7F0BC08E3F21F48091A9 +:10544000CF038D7F05C08F3F29F48091CF038B7FE1 +:105450008093CF038091D20381110EC08091D3033A +:1054600081110AC08091D403811106C08091D503B7 +:10547000811102C01092D003089581ED93E00E9443 +:10548000661B0E94E4279093CE038093CD0308957A +:105490001F93CF93DF938091CD039091CE030E9411 +:1054A000F027AC019091D003992321F020912302A1 +:1054B00030E006C0209124028AE0289F9001112448 +:1054C0004217530708F486C08091D203C091D303DA +:1054D000D091D4031091D503811107C0C11176C0BA +:1054E000D11174C0111172C075C09F3F19F09F5F38 +:1054F0009093D003181624F40E94CE288093D203F0 +:105500008091D20387FF05C00E94CE2881958093A9 +:10551000D2031C1624F40E94CE288093D3038091DA +:10552000D30387FF05C00E94CE2881958093D303C3 +:105530006091D203662339F1C091D303CC2319F1D2 +:10554000772767FD7095872F972F0E94A42E23E35E +:1055500033E343E35FE30E94B42F0E94712E609314 +:10556000D2036C2F772767FD7095872F972F0E94A6 +:10557000A42E23E333E343E35FE30E94B42F0E94AE +:10558000712E6093D3031D1624F40E941729809373 +:10559000D4038091D40387FF05C00E941729819509 +:1055A0008093D403111624F40E9417298093D50305 +:1055B0008091D50387FF05C00E94172981958093AC +:1055C000D503DF91CF911F910C943D2A9F3F09F0A5 +:1055D0008ECF96CFDF91CF911F910895E1EDF3E04B +:1055E00085E0DF011D928A95E9F71092D0031092B1 +:1055F000CF030895833081F128F4813059F082304F +:10560000D1F00895853009F449C0B8F1863009F425 +:1056100056C0089580912402262F30E0280F311DB6 +:105620002F3F310524F4680F6093240208958FEF13 +:1056300080932402089580912302262F30E0280FC2 +:10564000311D2F3F310524F4680F60932302089524 +:105650008FEF80932302089580912202262F30E05D +:10566000280F311D2F3F310524F4680F609322026B +:1056700008958FEF80932202089580912102262FB2 +:1056800030E0280F311D2F3F310524F4680F60935F +:10569000210208958FEF80932102089580912002C6 +:1056A000262F30E0280F311D2F3F310524F4680FDD +:1056B0006093200208958FEF8093200208958091D7 +:1056C0001F02262F30E0280F311D2F3F310524F413 +:1056D000680F60931F0208958FEF80931F02089553 +:1056E000833011F128F4813049F0823091F008952F +:1056F000853081F120F18630C1F108958091240236 +:10570000681720F4861B80932402089510922402C7 +:10571000089580912302681720F4861B809323024A +:10572000089510922302089580912202681720F4B0 +:10573000861B809322020895109222020895809180 +:105740002102681720F4861B80932102089510928D +:105750002102089580912002681720F4861B80930F +:105760002002089510922002089580911F02681768 +:1057700020F4861B80931F02089510921F02089543 +:105780000F931F938732D8F58E3108F087C08E3083 +:1057900009F471C098F4873009F45BC08B3009F4C8 +:1057A00091C0863009F095C08091C703817F8E7FBC +:1057B0008093C70381E08093D7038CC0863109F4BE +:1057C00081C068F4803109F084C08091C70383FBF5 +:1057D000222720F991E0922790FB83F955C0893167 +:1057E00009F470C08B3109F074C08091C70381FB4C +:1057F000222720F991E0922790FB81F945C0883358 +:1058000009F460C050F4893209F45EC0853309F4AC +:105810005BC0873209F458C05CC0833409F454C0BB +:1058200028F48A3308F455C0895339C0883409F004 +:1058300050C00E946C210E94B2070FEF13ED20E3CD +:10584000015010402040E1F700C000000E943F28B6 +:1058500039C09091C703892F8095817080FB90F9A2 +:1058600029F0966098609093C70334C0997F977F22 +:105870009093C70327C08091C70382FB222720F99A +:1058800091E0922790FB82F98093C7039923D1F08E +:105890008091C70381608093C70314C08D5141E09C +:1058A00050E060E070E08A019B0104C0000F111F0E +:1058B000221F331F8A95D2F7C901B8010E942825FB +:1058C0000E946C2181E006C061E070E080E090E021 +:1058D000F5CF80E01F910F91089580E0089580E05A +:1058E0000895CF93C82F8091D703813069F018F0C5 +:1058F0008230C9F184C0E0911D02F0911E028081C6 +:10590000823209F07EC007C0E0911D02F0911E02B4 +:105910008081823261F48C2F0E946D2C811104C031 +:105920008C2F0E94C02B1DC081E090E01AC08C2FEC +:105930000E946F2C811114C0C43179F048F4CB302F +:1059400079F0C03109F061C082E08093D70308C0CC +:10595000C93219F0C83321F058C01092D70355C08E +:1059600081E0817054C0C93291F120F5C43179F1E0 +:10597000B0F4C73009F047C08EE18093240282E37F +:10598000809323028AE08093220284E180932102A3 +:1059900088E08093200288E280931F0234C0CE51B9 +:1059A000C63088F5EC2FF0E0E451FD4F8081809304 +:1059B000D60329C0CE34E9F020F4CB3421F56AE0D7 +:1059C00013C0C13579F0C235F1F461E00DC08091AA +:1059D000D603882319F01092D60315C081E0809376 +:1059E000D70315C061E006C08091D6030E94FA2A51 +:1059F0000AC06AE08091D6030E94702B04C0109206 +:105A0000D70380E004C081E002C080E0AACFCF913C +:105A100008950E949B28811102C00E9477280E944D +:105A2000BC288093F20380FF02C0869501C080E00D +:105A30000C94D2058091F203982F9695292F30E08F +:105A4000233031054CF49F5F990F8170892B816061 +:105A50008093F2030E94C0288091F20386950C94F3 +:105A6000D2058091F203982F969591F09158990F55 +:105A70008170892B8093F2038E7F91E009F490E08E +:105A80008091F20390FB80F98093F2030E94C0287A +:105A90008091F20386950C94D2058091F203982FA1 +:105AA000909590FB80F98093F2030E94C02880912A +:105AB000F20380FF02C0869501C080E00C94D205FD +:105AC0009091F203892F86958F5F8F779170843044 +:105AD00028F4880F892B8093F20302C09093F2037D +:105AE0008091F2038E7F91E009F490E08091F203BF +:105AF00090FB80F98093F2030E94C0288091F2030A +:105B000086950C94D2052091F203922F96958927C1 +:105B1000982F990F822F8170892B8093F2038E7FAB +:105B200091E009F490E08091F20390FB80F980937A +:105B3000F2030E94C0288091F20386950C94D2054E +:105B40005058BB27AA270ED0D1C1C2D130F0C7D13F +:105B500020F031F49F3F11F41EF4B7C10EF4E0952C +:105B6000E7FB9FC1E92FD3D180F3BA176207730710 +:105B70008407950718F071F49EF5EBC10EF4E095DB +:105B80000B2EBA2FA02D0B01B90190010C01CA01F7 +:105B9000A0011124FF27591B99F0593F50F4503EA2 +:105BA00068F11A16F040A22F232F342F4427585F94 +:105BB000F3CF469537952795A795F0405395C9F7AC +:105BC0007EF41F16BA0B620B730B840BBAF0915064 +:105BD000A1F0FF0FBB1F661F771F881FC2F70EC003 +:105BE000BA0F621F731F841F48F4879577956795D6 +:105BF000B795F7959E3F08F0B3CF9395880F08F0BF +:105C00009927EE0F97958795089527D108F481E09D +:105C100008950CD06BC163D140F05AD130F021F41B +:105C20005F3F19F03EC1511195C14FC170D198F33A +:105C30009923C9F35523B1F3951B550BBB27AA270D +:105C400062177307840738F09F5F5F4F220F331F7F +:105C5000441FAA1FA9F333D00E2E3AF0E0E830D04B +:105C600091505040E695001CCAF729D0FE2F27D04E +:105C7000660F771F881FBB1F261737074807AB071C +:105C8000B0E809F0BB0B802DBF01FF2793585F4F91 +:105C90002AF09E3F510568F004C15CC15F3FECF300 +:105CA000983EDCF3869577956795B795F7959F5F56 +:105CB000C9F7880F911D9695879597F90895E1E0AA +:105CC000660F771F881FBB1F621773078407BA0709 +:105CD00020F0621B730B840BBA0BEE1F88F7E09564 +:105CE000089504D06894B11135C1089518D188F091 +:105CF0009F5790F0B92F9927B751A0F0D1F0660FB8 +:105D0000771F881F991F1AF0BA95C9F712C0B130D2 +:105D100081F01FD1B1E008951CC1672F782F88272B +:105D2000B85F39F0B93FCCF3869577956795B39511 +:105D3000D9F73EF490958095709561957F4F8F4F80 +:105D40009F4F0895E89409C097FB3EF49095809585 +:105D5000709561957F4F8F4F9F4F9923A9F0F92F31 +:105D600096E9BB279395F695879577956795B795AF +:105D7000F111F8CFFAF4BB0F11F460FF1BC06F5F95 +:105D80007F4F8F4F9F4F16C0882311F096E911C0A7 +:105D9000772321F09EE8872F762F05C0662371F0C8 +:105DA00096E8862F70E060E02AF09A95660F771FDC +:105DB000881FDAF7880F9695879597F9089588D008 +:105DC00018F011F08CD038F480C0C4C0E92F9FD0F7 +:105DD000B0F35523C9F3E7FB6217730784079507F0 +:105DE000A8F199F3E92FFF2788232AF03197660F4E +:105DF000771F881FDAF7952F5527442332F09150EB +:105E00005040220F331F441FD2F7BB27E91BF50B6D +:105E1000621B730B840BB109C1F222F4620F731F72 +:105E2000841FB11D31972AF0660F771F881FBB1F93 +:105E3000EFCF915050405AF041F0882332F0660F76 +:105E4000771F881F91505040C1F7939530C08695B9 +:105E5000779567959F5FD9F7F8CF990F0008550F91 +:105E6000AA0BE0E8FEEF16161706E807F907C0F0E0 +:105E700012161306E407F50798F0621B730B840BE8 +:105E8000950B39F40A2661F0232B242B252B21F4C2 +:105E900008950A2609F4A140A6958FEF811D811D62 +:105EA000089597F99F6780E870E060E008959F3F4C +:105EB00031F0915020F4879577956795B795880FC5 +:105EC000911D9695879597F908959FEF80EC089519 +:105ED00000240A94161617061806090608950024C9 +:105EE0000A9412161306140605060895092E039443 +:105EF000000C11F4882352F0BB0F40F4BF2B11F4B7 +:105F000060FF04C06F5F7F4F8F4F9F4F089557FD15 +:105F10009058440F551F59F05F3F71F04795880F17 +:105F200097FB991F61F09F3F79F0879508951216AE +:105F300013061406551FF2CF4695F1DF08C016165A +:105F400017061806991FF1CF86957105610508940B +:105F50000895E894BB2766277727CB0197F9089522 +:105F60007CDF08F48FEF08950BD0C0CFB1DF28F0AD +:105F7000B6DF18F0952309F094CFA7CF1124EACF0C +:105F8000C6DFA0F3959FD1F3950F50E0551F629F98 +:105F9000F001729FBB27F00DB11D639FAA27F00D82 +:105FA000B11DAA1F649F6627B00DA11D661F829FA9 +:105FB0002227B00DA11D621F739FB00DA11D621F8E +:105FC000839FA00D611D221F749F3327A00D611DAB +:105FD000231F849F600D211D822F762F6A2F11248D +:105FE0009F5750408AF0E1F088234AF0EE0FFF1FE0 +:105FF000BB1F661F771F881F91505040A9F79E3F17 +:10600000510570F04ECFA6CF5F3FECF3983EDCF326 +:10601000869577956795B795F795E7959F5FC1F753 +:10602000FE2B880F911D9695879597F90895FA0193 +:10603000EE0FFF1F30962105310599F161157105AD +:1060400061F48038BFE39B0749F16894903881057B +:1060500061F08038BFEF9B0741F0992342F5FF3F85 +:10606000E1053105210511F1E8940894E795D9017E +:10607000AA2329F4AB2FBE2FF85FD0F310C0FF5F27 +:1060800070F4A695E0F7F73950F019F0FF3A38F4BC +:106090009F779F930CD00F9007FC905808953EF087 +:1060A00014CF60E070E080E89FE308954FE79F77AA +:1060B0005F934F933F932F939ED02F913F914F919A +:1060C0005F9152DF05C019F40EF0EBCE42CFFDCE4A +:1060D00026DFC8F39638C0F707F80F92E8942BE351 +:1060E0003AEA48EB5FE74EDF0F920F920F924DB7FF +:1060F0005EB70F92C0D0E8EFF0E016D04F915F91FD +:10610000EF91FF91E595EE1FFF1F49F0FE57E06804 +:106110004427EE0F441FFA95E1F74195550B32D015 +:106120000F9007FE26C00895DF93CF931F930F9320 +:10613000FF92EF92DF927B018C01689405C0DA2E0A +:10614000EF011EDFFE01E894A5912591359145915F +:106150005591AEF3EF0106DDFE019701A801DA9437 +:1061600079F7DF90EF90FF900F911F91CF91DF9122 +:1061700008959B01AC0160E070E080E89FE349CDA9 +:1061800090CE95CECCDEE8F39923D9F3940F511D30 +:10619000BBF39150504094F059F0882332F0660FD1 +:1061A000771F881F91505040C1F79E3F510544F71B +:1061B000880F911D9695879597F908955F3FACF0EC +:1061C000983E9CF0BB27869577956795B79508F420 +:1061D000B1609395C1F7BB0F58F711F460FFE8CF9A +:1061E0006F5F7F4F8F4F9F4FE3CFB4CE0EF05FCEE8 +:1061F0006CCE689456CE93DEC8F39923D1F3C6F3E0 +:10620000DF93CF931F930F93FF92C92FDD2788232E +:106210002AF02197660F771F881FDAF720E030E019 +:1062200040E85FEB9FE3883920F0803E30F0219614 +:106230008F7787DCE0E2F1E003C083DCEDE4F1E09E +:1062400073DF8B01BE01EC01FB2E6F577109759551 +:10625000771F880B990B78DD28E132E741E35FE394 +:106260008FDEAF2D9801AE01FF900F911F91CF915E +:10627000DF9178DC3BCEFA01DC01AA0FBB1F9B014A +:10628000AC01BF5728F422273327442750781FC07A +:10629000B75188F4AB2F0024469537952795011CFC +:1062A000A395D2F3002069F0220F331F441FB3954A +:1062B000DAF30DD045CC61307105A0E88A07B94604 +:1062C00030F49B01AC0166277727882790783096B9 +:1062D00021F020833183428353830895AA1BBB1B83 +:1062E00051E107C0AA1FBB1FA617B70710F0A61BD6 +:1062F000B70B881F991F5A95A9F780959095BC01F7 +:10630000CD01089597FB072E16F4009407D077FD72 +:1063100009D00E946E3107FC05D03EF4909581951E +:106320009F4F0895709561957F4F0895EE0FFF1F61 +:106330000590F491E02D0994F999FECF92BD81BDAD +:10634000F89A992780B50895A8E1B0E042E050E0BE +:106350000C94C431262FF999FECF92BD81BDF89AD5 +:10636000019700B4021639F01FBA20BD0FB6F89499 +:10637000FA9AF99A0FBE08950196272F0E94AB3121 +:106380000C94AA31DC01CB01FC01F999FECF06C0C7 +:10639000F2BDE1BDF89A319600B40D9241505040E3 +:0863A000B8F70895F894FFCF4F +:1063A8000C52D02445000000410000DC44000000ED +:1063B8004152D0A4440000404100005C4400000069 +:1063C8004148F17644000000415C978A440000008F +:1063D800411FD592440000004152D0A4440000005F +:1063E800415CFFB844000000410AA7CF4400000008 +:1063F800410000DC44000000410AA7CF440000002F +:10640800410000DC44000000410000000000008062 +:106418004052D024450000404100000000000080A8 +:10642800400AA74F45000040410AA7CF440000009A +:10643800410000DC44000000410000000000008032 +:106448004052D024450000004100000000000080B8 +:10645800405CFF384500000041000000000000805B +:106468004052D02445000000410AA7CF4400000054 +:10647800410000DC440000004100000000000080F2 +:106488004052D024450000804110F176440000A01D +:106498004112F1F6440000004141909B440000A0E5 +:1064A8004112F1F64400000041050000003F0000E1 +:1064B800C8427B140915E614B2147E1401BC0328E3 +:1064C80008140A321E000002000400050007000933 +:1064D800000B000C000E001000110013001500172F +:1064E8000018001A001C001D001F002100230024B2 +:1064F800002600280029002B002D002F0030003234 +:106508000034003500370039003B004200450025C3 +:106518000026004300610060002000370064006529 +:1065280000660067004400460024004700314980A7 +:106538003F5D8B803FF8BF803FCAE1803F73ED80AD +:106548003FCAE1803FF8BF803F5D8B803F31498083 +:106558003F0000803FF16D7F3F75EA7E3F4C827EB1 +:106568003F833F7E3F84287E3F833F7E3F4C827E31 +:106578003F75EA7E3FF16D7F3F0000803F3F4D361B +:10658800B90A6C0A360AE209FB09140A0102030473 +:06659800050607080900DA :00000001FF diff --git a/keyboard/preonic/preonic_pcb_r1_w_bootloader.hex b/keyboard/preonic/preonic_pcb_r1_w_bootloader.hex index a29f23c00..c42365c43 100644 --- a/keyboard/preonic/preonic_pcb_r1_w_bootloader.hex +++ b/keyboard/preonic/preonic_pcb_r1_w_bootloader.hex @@ -250,79 +250,79 @@ :107FE4000C94ED3E0C94113F0C94193F0C94213FDA :0C7FF4000C94F23E0C94033F0C94293FC7 :040000030000700089 -:100000000C94A0050C94E4050C94E4050C94E40510 -:100010000C94E4050C94E4050C94E4050C94E405BC -:100020000C94E4050C94E4050C94B6180C9488190F -:100030000C94A1270C94E4050C94E4050C94E405BD -:100040000C94E4050C94E4050C94E4050C94E4058C -:100050000C94E4050C9409280C94E4050C94E40534 -:100060000C94E4050C94E4050C94E4050C94E4056C -:100070000C94E4050C94E4050C94E4050C94E4055C -:100080000C94090F0C94E4050C94E4050C94E4051D -:100090000C94E4050C94E4050C94E4050C94E4053C -:1000A0000C94E4050C94E4050C94E4053F064F061B -:1000B000610671067706860692069706A406AC06C8 -:1000C000BC06C106C813C813C813C813C813C81385 -:1000D000C813C813C813C813DF13DF13DF13DF13EC -:1000E000DF13DF13DF13DF13DF13DF13C813C813AE -:1000F000C813C813C813DF13DF13DF13DF13DF13B5 -:10010000C813C813C813DF13DF13DF13F519171A49 -:10011000051B171A051B5C1A7F1A051BD41AE71A50 -:10012000EA1DEA1D271E271E811EBF1E372137210B -:10013000D81E3721D91FD91F9C20B3203721222157 -:1001400007634236B79BD8A71A39685618AEBAABC0 -:10015000558C1D3CB7CC5763BD6DEDFD753EF61754 -:100160007231BF000000803F08000000BE922449A9 -:10017000123EABAAAA2ABECDCCCC4C3E00000080D9 -:10018000BEABAAAAAA3E00000000BF000000803F4C -:100190000000000000084178D3BB4387D1133D190C -:1001A0000E3CC3BD4282AD2B3E68EC8276BED98F39 -:1001B000E1A93E4C80EFFFBE01C4FF7F3F0000007D -:1001C000000035001E001F00200021002200230037 -:1001D00024002500260027002A002B0014001A0006 -:1001E0000800150017001C0018000C001200130076 -:1001F0004C00290004001600070009000A000B004B -:100200000D000E000F0033003400E1001D001B0044 -:1002100006001900050011001000360037003800F4 -:1002200028000530E000E200E30003302C002C0041 -:1002300004305000510052004F0035001E001F00D6 -:100240002000210022002300240025002600270092 -:100250002A002B0014001A00090013000A000D00E8 -:100260000F0018001C0033004C002900040015008A -:100270001600170007000B00110008000C00120008 -:100280003400E1001D001B000600190005000E00EF -:10029000100036003700380028000530E000E2008A -:1002A000E30003302C002C000430500051005200B9 -:1002B0004F0035001E001F002000210022002300F7 -:1002C00024002500260027002A002B0034003600D9 -:1002D000370013001C0009000A00060015000F007B -:1002E0004C00290004001200080018000C00070050 -:1002F0000B001700110016003800E1003300140055 -:100300000D000E001B00050010001A0019001D0052 -:1003100028000530E000E200E30003302C002C0050 -:1003200004305000510052004F0035021E021F02DF -:100330002002210222022302240225022602270291 -:100340002A0035021E021F0220022102220223027D -:1003500024022502260227024C004C003A003B00F2 -:100360003C003D003E003F002D022E022F023002D5 -:1003700031020100400041004200430044004500BA -:100380000100010001000100010001000100010065 -:1003900001000100010001000100AB00AA00A9005A -:1003A000AE0035001E001F002000210022002300A7 -:1003B00024002500260027002A0035001E001F000B -:1003C0002000210022002300240025002600270011 -:1003D0004C004C003A003B003C003D003E003F001A -:1003E0002D002E002F0030003100010040004100A0 -:1003F00042004300440045000100010001000100EB -:1004000001000100010001000100010001000100E4 -:100410000100AB00AA00A900AE000000000000002F +:100000000C947C050C94C0050C94C0050C94C005A0 +:100010000C94C0050C94C0050C94C0050C94C0054C +:100020000C94C0050C94C0050C94C7180C94991935 +:100030000C94B2270C94C0050C94C0050C94C00518 +:100040000C94C0050C94C0050C94C0050C94C0051C +:100050000C94C0050C941A280C94C0050C94C0058F +:100060000C94C0050C94C0050C94C0050C94C005FC +:100070000C94C0050C94C0050C94C0050C94C005EC +:100080000C94E50E0C94C0050C94C0050C94C005AE +:100090000C94C0050C94C0050C94C0050C94C005CC +:1000A0000C94C0050C94C0050C94C0051B062B06CF +:1000B0003D064D06530662066E06730680068806E8 +:1000C00098069D06061A281A161B281A161B6D1A62 +:1000D000901A161BE51AF81AFB1DFB1D381E381E58 +:1000E000921ED01E48214821E91E4821EA1FEA1F1E +:1000F000AD20C4204821332107634236B79BD8A7DF +:100100001A39685618AEBAAB558C1D3CB7CC57633C +:10011000BD6DEDFD753EF6177231BF000000803FEA +:1001200008000000BE922449123EABAAAA2ABECD06 +:10013000CCCC4C3E00000080BEABAAAAAA3E000078 +:100140000000BF000000803F000000000008417870 +:10015000D3BB4387D1133D190E3CC3BD4282AD2BA7 +:100160003E68EC8276BED98FE1A93E4C80EFFFBE9F +:1001700001C4FF7F3F000000000035001E001F008B +:100180002000210022002300240025002600270053 +:100190002A002B0014001A000800150017001C008C +:1001A00018000C00120013004C0029000400160077 +:1001B000070009000A000B000D000E000F003300BD +:1001C0003400E1001D001B000600190005001100AD +:1001D000100036003700380028000530E000E2004B +:1001E000E30003302C002C0004305000510052007A +:1001F0004F0035001E001F002000210022002300B8 +:1002000024002500260027002A002B0014001A00D5 +:10021000090013000A000D000F0018001C00330035 +:100220004C002900040015001600170007000B0001 +:10023000110008000C0012003400E1001D001B003A +:100240000600190005000E001000360037003800C7 +:1002500028000530E000E200E30003302C002C0011 +:1002600004305000510052004F0035001E001F00A6 +:100270002000210022002300240025002600270062 +:100280002A002B0034003600370013001C00090040 +:100290000A00060015000F004C002900040012009F +:1002A000080018000C0007000B00170011001600D2 +:1002B0003800E100330014000D000E001B000500A3 +:1002C00010001A0019001D0028000530E000E200AF +:1002D000E30003302C002C00043050005100520089 +:1002E0004F0035021E021F022002210222022302B9 +:1002F00024022502260227022A0035021E021F02BE +:1003000020022102220223022402250226022702C1 +:100310004C004C003A003B003C003D003E003F00DA +:100320002D022E022F023002310201004000410056 +:1003300042004300440045000100010001000100AB +:1003400001000100010001000100010001000100A5 +:100350000100AB00AA00A900AE0035001E001F007E +:100360002000210022002300240025002600270071 +:100370002A0035001E001F0020002100220023005B +:1003800024002500260027004C004C003A003B00CA +:100390003C003D003E003F002D002E002F003000AD +:1003A000310001004000410042004300440045008C +:1003B0000100010001000100010001000100010035 +:1003C00001000100010001000100AB00AA00A9002A +:1003D000AE0000000000000000000000000000006F +:1003E000000000000000000000000000000000000D +:1003F00000000000000000000000000000000000FD +:1004000000000000000000000000000000000000EC +:1004100000000000000000000000000000000000DC :1004200000000000000000000000000000000000CC -:1004300000000000000000000000000000000000BC -:1004400000000000000000000000000000000000AC +:100430000000000000000000000003300000000089 +:100440000430000000000000000000000000000078 :10045000000000000000000000000000000000009C :10046000000000000000000000000000000000008C :10047000000000000000000000000000000000007C -:100480000000033000000000043000000000000005 +:10048000000000000000000000000000000000006C :10049000000000000000000000000000000000005C :1004A000000000000000000000000000000000004C :1004B000000000000000000000000000000000003C @@ -393,1471 +393,1488 @@ :1008C0000000000000000000000000000000000028 :1008D0000000000000000000000000000000000018 :1008E0000000000000000000000000000000000008 -:1008F00000000000000000000000000000000000F8 -:1009000000000000000000000000000000000000E7 -:1009100000000000000000000000000000000000D7 -:1009200000000000000000000000000000000000C7 -:1009300000000000000000000000000000000000B7 -:1009400000003A003B003C003D003E003F004000FC -:1009500041004200430044004500010000500100F6 +:1008F000000000000000000000003A003B003C0047 +:100900003D003E003F0040004100420043004400E3 +:10091000450001000050010001000100010001003C +:1009200001000100010001004C0001000100010074 +:1009300007300630135012500030013002300100F1 +:10094000010001000B300A300930083001000100BD +:10095000010001000100010001000100010001008F :10096000010001000100010001000100010001007F -:100970004C000100010001000730063013501250F6 -:100980000030013002300100010001000B300A305C -:1009900009300830010001000100010001000100E0 -:1009A000010001000100010001000100010001003F -:1009B000010001000100010001002A035400680049 -:1009C000650020005000720065006F006E00690035 -:1009D000630020004B006500790062006F00610039 -:1009E0007200640000002C034F0072007400680065 -:1009F0006F006C0069006E006500610072002000ED -:100A00004B006500790062006F00610072006400B5 -:100A1000730000000403090409025400030100A04C -:100A2000FA0904000001030101000921110100017C -:100A3000223F000705810308000A090401000103A1 -:100A4000010200092111010001224D000705820366 -:100A500008000A0904020001030000000921110135 -:100A600000012236000705830308000A1201100165 -:100A700000000008EDFE61600100010200010501B7 -:100A80000980A101850216010026B7001A01002A7B -:100A9000B700751095018100C0050C0901A1018501 -:100AA00003160100269C021A01002A9C027510956B -:100AB000018100C005010902A1010901A100050988 -:100AC000190129051500250195057501810295017A -:100AD000750381010501093009311581257F9502D2 -:100AE0007508810609381581257F950175088106ED -:100AF000050C0A38021581257F950175088106C00D -:100B0000C005010906A101050719E029E71500251F -:100B10000195087501810295017508810105081983 -:100B2000012905950575019102950175039101054E -:100B300007190029FF150025FF950675088100C0DB -:100B400011241FBECFEFDAE0DEBFCDBF04B603FE37 -:100B500024C08091A3039091A403A091A503B09118 -:100B6000A6038730904BA740B04BB9F41092A30373 -:100B70001092A4031092A5031092A60314BE84B78A -:100B8000877F84BF88E10FB6F8948093600010924D -:100B900060000FBEE0E0F8E3099512E0A0E0B1E0EC -:100BA000EAEEF2E602C005900D92A83AB107D9F735 -:100BB00013E0A8EAB2E001C01D92A33AB107E1F741 -:100BC0000E94FC150C9473310C940000279A2F9806 -:100BD0008FEF9FEF90938700809386008AE0809349 -:100BE000800089E1809381000C94F82C282F8111DA -:100BF0000BC080918000877F8093800010928D00D1 -:100C000010928C002F9808952F9880918000886012 -:100C100080938000233019F48FEF9FEF0FC083E0A3 -:100C200090E0821B9109880F991F2FEF3FEFA901D8 -:100C300002C0569547958A95E2F7CA0190938D00B8 -:100C400080938C000895CF93DF93EC010E949D2840 -:100C5000BE0180E090E0DF91CF910C9417250F93B7 -:100C60001F93462F50E04C30510508F098C0DC012E -:100C7000FA01EA5AFF4F12968C910C94373188236F -:100C800009F48DC000E010E0980140E064E070E0FD -:100C90008BEC91E00E94871281E090E00FC08823E6 -:100CA00009F47DC000E010E0980140E066E070E0EB -:100CB0008BE591E00E94871282E090E00E9423067B -:100CC0006EC0882309F46BC000E010E0980140E09A -:100CD00068E070E08BE891E00E94871284E090E089 -:100CE000EDCF882311F083E005C083E00CC088239A -:100CF00049F084E00E94942540E164E083E00E9492 -:100D0000ED0A4DC084E00E94B525F6CF882331F06E -:100D100085EE0E947E1C0E944F2D41C085EE0E94F0 -:100D2000461D3DC08823D9F10E941B0E38C0882380 -:100D3000B1F10E94140E00E010E0980140E064E080 -:100D400070E08BEE91E029C0882349F185E00E9494 -:100D5000B5250E943C0E23C0882309F100E010E075 -:100D6000980140E068E070E08BE191E00E9487121A -:100D700085E00E94942513C0882389F00E941A13ED -:100D800004C0882361F00E94251300E010E0980160 -:100D900040E068E070E08BE191E00E94871280E023 -:100DA00090E01F910F9108950F931F932FEF89EFFC -:100DB00090E0215080409040E1F700C0000000E04A -:100DC00010E0980140E064E070E08BEE91E00E945A -:100DD00087121F910F910895CF92DF92EF92FF92A9 -:100DE0000F931F93CF93DF93CDB7DEB7CC58D109C4 -:100DF0000FB6F894DEBF0FBECDBF2091630325FF71 -:100E0000C5C08C01FC01928180910201992309F4F3 -:100E100060C096E4E7E2F2E0DE01A95BBF4F01901B -:100E20000D929A95E1F7F8019081E0910001F0911F -:100E30000101E90FF11DEE0FFF1F27E430E02C0F39 -:100E40003D1FE20FF31F60817181680F711D8827BC -:100E500077FD8095982F0E94932E20E030E040E4AB -:100E600051E40E94F82D6B017C01F801218185E09D -:100E700090E0821B9109BC01882777FD8095982F0F -:100E80000E94932E9B01AC01C701B6010E94902DD8 -:100E90009B01AC0160E070E080E090E40E94AA2F2A -:100EA00020E030E04CE551E40E94472F4FE050E055 -:100EB000C457DF4F0FB6F894DEBF0FBECDBFDF9132 -:100EC000CF911F910F91FF90EF90DF90CF900C94F6 -:100ED000271296E4E7E2F2E0DE01119601900D920E -:100EE0009A95E1F7F8019081E0910001F0910101FC -:100EF000E90FF11DEE0FFF1F21E030E02C0F3D1F29 -:100F0000E20FF31F60817181680F711D882777FDE3 -:100F10008095982F0E94932E20E030E040E451E429 -:100F20000E94F82D6B017C01F801218185E090E0A1 -:100F3000821B9109BC01882777FD8095982F0E941C -:100F4000932E9B01AC01C701B6010E94902D9B011D -:100F5000AC0160E070E080E090E40E94AA2F20E005 -:100F600030E04CE551E40E94472FC457DF4F0FB6E5 -:100F7000F894DEBF0FBECDBFDF91CF911F910F91CF -:100F8000FF90EF90DF90CF900C946F0EC457DF4F1F -:100F90000FB6F894DEBF0FBECDBFDF91CF911F918A -:100FA0000F91FF90EF90DF90CF9008950F931F93D4 -:100FB00000E010E0980140E063E070E083E091E041 -:100FC0000E9487122FEF82E597E0215080409040E9 -:100FD000E1F700C000001F910F91089508950E944D -:100FE000E6056E9A769A0C94D4060C94EE070C944F -:100FF000EC060895880F991FFC01EE5BFF4F859169 -:1010000094910895880F991FFC01EE53FE4F85912E -:10101000949108950F931F93CF93DF93EC01811563 -:1010200020E49207A0F5C11580E3D80708F0E1C0DD -:10103000C83ED105D8F4C03ED10508F0EEC1C83A8B -:10104000D10578F4C53AD10508F074C0C130D10596 -:1010500009F46DC008F4DEC1C430D10508F0DDC16B -:10106000D9C1CB3BD10508F470C0D4C1C11590E201 -:10107000D90708F0B9C0C11521E0D20708F0CDC1E9 -:10108000C03FD10508F4C6C18E01106506C2C1304B -:1010900080E5D80709F4BDC068F5C13120E4D20766 -:1010A00009F4AEC050F4C03190E4D90708F0A5C0EF -:1010B000CF70DD278E01146DF0C1C33120E4D2075B -:1010C00009F4A4C008F49FC0C115D04509F0A2C11D -:1010D0000E945B210E943C0E0E94D6079FEF24E3F2 -:1010E0008CE0915020408040E1F700C000000E9459 -:1010F0002E28D3C1C11520E6D20730F4C11581E5F1 -:10110000D80708F48CC02DC1C11590E7D90708F4A1 -:1011100081C1C11520E8D20708F478C1C11580E962 -:10112000D80708F077C1DF708E01106AB6C101E000 -:1011300010E0B3C1C53AD10509F471C1C63AD10571 -:1011400009F070C102E810E4A8C1C83AD10509F459 -:101150006CC1C93AD10509F46BC1CA3AD10509F489 -:101160006AC1CB3AD10509F469C1CC3AD10509F479 -:1011700068C1CD3AD10509F467C1C03BD10509F476 -:1011800066C1CE3AD10509F465C1CF3AD10509F45B -:1011900064C1C13BD10509F463C1C23BD10509F467 -:1011A00062C1C33BD10509F461C1C43BD10509F457 -:1011B00060C1C53BD10509F45FC1C63BD10509F447 -:1011C0005EC1C73BD10509F45DC1C83BD10509F437 -:1011D0005CC1C93BD10509F45BC1CA3BD10509F427 -:1011E0005AC100E014E459C1CE019F700E94020868 -:1011F00055C1DD278E01106C50C100E011ED4DC1CD -:1012000000E010ED4AC100E012ED47C100E013ED2F -:1012100044C1809177038160809377033EC10E942F -:101220008A28811102C00E9466280E94A22890E0AC -:101230009093A2038093A103C23090E5D90721F4D3 -:101240008091A103816086C0C43020E5D20721F4DB -:101250008091A10382607EC0C63080E5D80721F46A -:101260008091A103846076C0C83090E5D90719F455 -:101270008091A10327C0CA3020E5D20721F48091D4 -:10128000A103806167C0CC3080E5D80721F480914C -:10129000A10380625FC0CE3090E5D90721F4809130 -:1012A000A103806457C0C03120E5D20721F48091AA -:1012B000A10380684FC0C23180E5D80729F480912E -:1012C000A1038460886046C0C33090E5D90721F44B -:1012D0008091A1038E7F3EC0C53020E5D20721F466 -:1012E0008091A1038D7F36C0C73080E5D80721F4F7 -:1012F0008091A1038B7F2EC0C93090E5D90719F4E6 -:101300008091A10326C0CB3020E5D20721F4809143 -:10131000A1038F7E1FC0CD3080E5D80721F48091D6 -:10132000A1038F7D17C0CF3090E5D90721F48091BC -:10133000A1038F7B0FC0C13120E5D20721F480913A -:10134000A1038F7707C0C331D04531F48091A10349 -:101350008B7F877F8093A1038091A1030E94A628A1 -:101360009CC08D2F99278F70992781309105D9F4D2 -:101370009E012370332702C0880F991F2A95E2F738 -:101380009C688E0144E0000F111F4A95E1F7002789 -:101390001370802B912B53E0CC0FDD1F5A95E1F792 -:1013A000C076DD272FC08230910531F4DC2FCC27A9 -:1013B0008E01016F106A71C08330910569F4CE010E -:1013C0008370992701E010E002C0000F111F8A9579 -:1013D000E2F7C8019C680FC0049709F05EC0CE0117 -:1013E0008370992701E010E002C0000F111F8A9559 -:1013F000E2F7C8019A6823E0CC0FDD1F2A95E1F7D8 -:10140000C07ED7708C010C2B1D2B47C0DF708E0166 -:10141000106243C000E010E040C08E013EC001E811 -:1014200010E43BC003E810E438C002EE14E435C019 -:1014300009EE14E432C00AEE14E42FC005EB14E404 -:101440002CC006EB14E429C007EB14E426C00CEC16 -:1014500014E423C00DEC14E420C003E815E41DC01F -:101460000AE815E41AC002E915E417C004E915E416 -:1014700014C001E216E411C003E216E40EC004E257 -:1014800016E40BC005E216E408C006E216E405C047 -:1014900007E216E402C00AE216E4C801DF91CF9128 -:1014A0001F910F9108959CE0799FF00111249CE316 -:1014B000899FE00DF11D1124E60FF11DEE0FFF1FB6 -:1014C000EE53FE4F85919491803E9105E0F4803C6F -:1014D000910558F58133910509F46FC048F48932BC -:1014E000910509F463C08A32910509F46DC072C098 -:1014F00089339105E9F082389105D1F08533910562 -:1015000009F44DC067C0833E910581F138F4803EF7 -:101510009105B9F0823E9105D9F05CC0863E9105F7 -:1015200061F1873E9105A1F155C00E94FA07089527 -:101530002091A10320FD02C021FF4CC080EE90E06D -:1015400049C08091A10380FFF9CF89E390E042C0B8 -:101550008091A10382FF0EC08091A10384FF03C08C -:1015600080E090E037C083EE90E034C08091A1032A -:1015700082FFF2CF82EE90E02DC08091A10383FF25 -:101580000BC08091A10384FDEBCF87EE90E022C0D9 -:101590008091A10383FFF5CF86EE90E01BC0809180 -:1015A000A10385FF07C089E290E014C08091A103E8 -:1015B00085FFF9CF85E390E00DC08091A10386FF00 -:1015C00007C08AE290E006C08091A10386FFF9CFB0 -:1015D00081E390E00E940A080895CF92DF92EF9293 -:1015E000FF920F931F9301E010E020E030E06801CC -:1015F000790104C0CC0CDD1CEE1CFF1C8A95D2F7CF -:1016000004C0000F111F221F331F6A95D2F70C2947 -:101610001D292E293F29C0906303D0906403E090D8 -:101620006503F0906603C022D122E222F322842FC8 -:10163000C016D106E206F30641F41F910F91FF9008 -:10164000EF90DF90CF900C9494251F910F91FF9015 -:10165000EF90DF90CF900C94B52508950C942D0B4E -:101660005F926F927F928F929F92AF92BF92CF9232 -:10167000DF92EF92FF920F931F93CF93DF93CDB73B -:10168000DEB72A970FB6F894DEBF0FBECDBFCE01EE -:1016900001966C014E019BE0890E911C20E030E028 -:1016A00040E050E060E070E000E010E0E12CF12C60 -:1016B0006C2C5D2C8AE0782EAA24A394B12CEDE644 -:1016C000F2E0A62DB52D872D01900D928A95E1F7B8 -:1016D000F601819191916F01FC01E07FFF27E032DB -:1016E000F10559F48F709927F50102C0EE0FFF1F25 -:1016F0008A95E2F7EE2AFF2A37C0E033F10559F464 -:101700008F709927F50102C0EE0FFF1F8A95E2F74F -:101710000E2B1F2B29C0E034F10559F48F70992747 -:10172000F50102C0EE0FFF1F8A95E2F76E2B7F2BAB -:101730001BC0E035F10559F48F709927F50102C0FF -:10174000EE0FFF1F8A95E2F74E2B5F2B0DC0E036A0 -:10175000F10551F48F709927F50102C0EE0FFF1FBC -:101760008A95E2F72E2B3F2BC814D90409F0A7CF96 -:1017700084B19E2D9095892384B985B1E82AE5B876 -:1017800087B1902F9095892387B988B1082B08B924 -:101790008AB1962F909589238AB98BB1682B6BB942 -:1017A0008DB1942F909589238DB98EB1482B4EB968 -:1017B00080B3922F9095892380BB81B3282B21BBC6 -:1017C0002A960FB6F894DEBF0FBECDBFDF91CF9142 -:1017D0001F910F91FF90EF90DF90CF90BF90AF904F -:1017E0009F908F907F906F905F9008955F926F921F -:1017F0007F928F929F92AF92BF92CF92DF92EF92A1 -:10180000FF920F931F93CF93DF93CDB7DEB7689707 -:101810000FB6F894DEBF0FBECDBF85B7806885BF19 -:1018200085B7806885BF0E94300BCE0101966C01A0 -:101830004E0199E1890E911C20E030E040E050E03B -:1018400060E070E000E010E0E12CF12C6C2C5D2CED -:1018500088E1782EAA24A394B12CE7E7F2E0A62D24 -:10186000B52D872D01900D928A95E1F7F6018191B2 -:1018700091916F01FC01E07FFF27E032F10559F4FF -:101880008F709927F50102C0EE0FFF1F8A95E2F7CE -:10189000EE2AFF2A37C0E033F10559F48F709927FB -:1018A000F50102C0EE0FFF1F8A95E2F70E2B1F2BEA -:1018B00029C0E034F10559F48F709927F50102C071 -:1018C000EE0FFF1F8A95E2F76E2B7F2B1BC0E035D2 -:1018D000F10559F48F709927F50102C0EE0FFF1F33 -:1018E0008A95E2F74E2B5F2B0DC0E036F10551F4DF -:1018F0008F709927F50102C0EE0FFF1F8A95E2F75E -:101900002E2B3F2BC814D90409F0A7CF84B19E2DEC -:101910009095892384B985B1E82AE5B887B1902FDD -:101920009095892387B988B1082B08B98AB1962F79 -:10193000909589238AB98BB1682B6BB98DB1942F9F -:10194000909589238DB98EB1482B4EB980B3922FD3 -:101950009095892380BB81B3282B21BBE2EBF2E079 -:10196000A8EAB2E0119211921D921D9282E0EC3B26 -:10197000F807C1F768960FB6F894DEBF0FBECDBF6B -:10198000DF91CF911F910F91FF90EF90DF90CF905B -:10199000BF90AF909F908F907F906F905F900C94CE -:1019A000EF075F926F927F928F929F92AF92BF925A -:1019B000CF92DF92EF92FF920F931F93CF93DF931B -:1019C000CDB7DEB7A2970FB6F894DEBF0FBECDBF7E -:1019D0006E0149E1C40ED11C88EAA82E82E0B82E1F -:1019E00075019AE0592E460101E010E028E1622ECF -:1019F00035E0732EEDE6F2E0D401852D01900D92D5 -:101A00008A95E1F7D6018D919D916D019C01207F12 -:101A100033272032310591F424B18F709927F801D2 -:101A200002C0EE0FFF1F8A95E2F7CF01922F982B8D -:101A300094B995B18095892385B953C02033310578 -:101A400091F427B18F709927A80102C0440F551F48 -:101A50008A95E2F7CA01922F982B97B998B1809591 -:101A6000892388B93EC02034310591F42AB18F70A2 -:101A70009927D80102C0AA0FBB1F8A95E2F7CD01B2 -:101A8000922F982B9AB99BB1809589238BB929C045 -:101A90002035310591F42DB18F709927F80102C0DE -:101AA000EE0FFF1F8A95E2F7CF01922F982B9DB979 -:101AB0009EB1809589238EB914C02036310589F4F2 -:101AC00020B38F709927A80102C0440F551F8A9533 -:101AD000E2F7CA01922F982B90BB91B3809589238E -:101AE00081BB50EA5A95F1F7BE016F5F7F4F20E04E -:101AF00030E040E050E0E7E7F2E0DE011196862DAD -:101B000001900D928A95E1F7DB018D919D91BD01C8 -:101B1000FC01E07FFF27E032F10511F4E3B113C0CF -:101B2000E033F10511F4E6B10EC0E034F10511F433 -:101B3000E9B109C0E035F10511F4ECB104C0E036BB -:101B4000F105B9F4EFB1F0E08F70992702C0F59577 -:101B5000E7958A95E2F7E0FD08C0C801042E02C0AF -:101B6000880F991F0A94E2F702C080E090E0282BCA -:101B7000392B4F5F5F4F4C30510509F0BCCFF70157 -:101B8000808191818217930721F0318320837092A5 -:101B90000B020E94300BF2E0EF0EF11C42EBE41658 -:101BA00042E0F40609F026CF80910B028823C9F0A9 -:101BB000815080930B02882339F08FE99FE00197D1 -:101BC000F1F700C000000DC0E2EBF2E0D5018D910D -:101BD0009D915D0181939193B2EBAB16B2E0BB0690 -:101BE000A9F70E94F50781E0A2960FB6F894DEBF30 -:101BF0000FBECDBFDF91CF911F910F91FF90EF905E -:101C0000DF90CF90BF90AF909F908F907F906F901C -:101C10005F900895E82FF0E0EE0FFF1FEE54FD4FA8 -:101C2000808191810895089580918C0381608093D3 -:101C30008C030C94B82880918C038E7F80938C0346 -:101C40000C94B8280E948A28811102C00E9466283C -:101C50000E94B42880938C033E9A809171008D7FFE -:101C60008093710082E0809390008AE180939100DC -:101C700081E08093BE0208958091BE02811102C06E -:101C80000E94220E10920E0310920D03809171009B -:101C90008D7F80937100809190008F77809390006A -:101CA0001092D0021092CF021092070310920803F4 -:101CB0001092090310920A03109206031092050372 -:101CC000E5EEF2E0A5EDB2E01192119211921192BF -:101CD0001D921D9283E0E530F807B1F70895CF9289 -:101CE000DF92EF92FF920F931F93CF93DF93209198 -:101CF000CF02222309F484C06B017C018091BE02D3 -:101D0000811102C00E94220E05E013E0C7E0D0E07E -:101D1000A7019601F80192918291729162918F01CF -:101D20000E94F42D811131C0FE01EE0FFF1FEE0F56 -:101D3000FF1FEB51FD4F1082118212821382DE01D0 -:101D4000AA0FBB1FAB52BD4F11961C921E92C730FB -:101D5000D105E9F0219644815581668177814083E0 -:101D600051836283738314821582168217821296BE -:101D70008D919C91139711969C938E9313961C9220 -:101D80001E92129734961296E2CF219708F6809110 -:101D90000D0390910E03019797FD05C090930E03DC -:101DA00080930D0304C010920E0310920D038091D6 -:101DB0000D0390910E0320910B0330910C03281713 -:101DC000390724F010920C0310920B03892BC1F4F5 -:101DD000809171008D7F80937100809190008F774A -:101DE0008093900010920703109208031092090349 -:101DF00010920A0310920603109205031092CF026C -:101E0000DF91CF911F910F91FF90EF90DF90CF90D6 -:101E100008951F920F920FB60F9211244F925F9266 -:101E20006F927F928F929F92AF92BF92CF92DF92EA -:101E3000EF92FF922F933F934F935F936F937F9314 -:101E40008F939F93AF93BF93CF93DF93EF93FF93C2 -:101E50008091CF02882309F49BC1C0910D03D091DA -:101E60000E031C161D060CF093C14090BF0250904B -:101E7000C0026090C1027090C20220E030E0A9016F -:101E8000C301B2010E94432F18160CF065C0C13087 -:101E9000D10509F452C080910B0390910C03BE014F -:101EA0000E9423317C0190930C0380930B0380905C -:101EB000D1029090D202A090D302B090D40220E040 -:101EC00030E040E85FE3C501B4010E94902D6093CB -:101ED000D1027093D2028093D3029093D402F7017F -:101EE000EE0FFF1FEE0FFF1FEB51FD4FA3019201FD -:101EF00060817181828193810E94F82D20E030E021 -:101F000040E05EE30E94472F9B01AC01C501B40194 -:101F10000E94432F18168CF4C7010196BE010E943F -:101F2000233190930C0380930B031092D1021092F3 -:101F3000D2021092D3021092D402E0910B03F091DE -:101F40000C03EE0FFF1FEE0FFF1FEB51FD4F6081E3 -:101F5000718182819381D0C0C0900703D090080323 -:101F6000E0900903F0900A0320E030E0A901C701E6 -:101F7000B6010E94F42D2197882309F4A2C0FE0126 -:101F8000EE0FFF1FEE0FFF1FEB51FD4F8080918082 -:101F9000A280B380A5019401C701B6010E94F42D6F -:101FA00087FF31C0A501940160E070E08CED93ECF7 -:101FB0000E94F82D20E030E040E451E40E94F82D2A -:101FC00020E030E040E05FE30E94472F9B01AC013E -:101FD00060E070E080E090E40E94AA2F9B01AC01D9 -:101FE000C501B4010E94472F9B01AC01C701B60196 -:101FF0000E94F42D87FF07C0A701960160E070E002 -:102000008CED93E439C0A5019401C701B6010E948B -:10201000432F18160CF055C0A501940160E070E044 -:102020008CED93E40E94F82D20E030E040E451E490 -:102030000E94F82D20E030E040E05FE30E94472F4F -:102040009B01AC0160E070E080E090E40E94AA2F68 -:102050009B01AC01C501B4010E94472F9B01AC015B -:10206000C701B6010E94432F18165CF5A70196011F -:1020700060E070E08CED93EC0E94F82D20E030E001 -:1020800040E451E40E94F82D20E030E040E05FE3BE -:102090000E94472F9B01AC0160E070E080E090E47B -:1020A0000E94AA2F9B01AC01C701B6010E94472FD5 -:1020B00060930703709308038093090390930A03C6 -:1020C00013C0FE01EE0FFF1FEE0FFF1FEB51FD4F80 -:1020D00080819181A281B38180930703909308034B -:1020E000A0930903B0930A0360910703709108035A -:1020F0008091090390910A032091BC023091BD02A6 -:102100002F3F4FEF340731F02F5F3F4F3093BD0229 -:102110002093BC020E9430136B017C0120E034E26A -:1021200044EF51E40E94F42D87FF08C086EFC82ECB -:1021300088E2D82E84EFE82E81E4F82E20E030E00B -:1021400040E051E4C701B6010E94472F9B01AC015A -:1021500060E074E284E79BE40E94F82D6B017C014F -:102160000E94602E709397006093960020910C025D -:1021700030910D0240910E0250910F02C701B6013D -:102180000E94472F0E94602E7093990060939800E0 -:102190008091D002882309F433C1C090CB02D09043 -:1021A000CC02E090CD02F090CE0220E030E0A90118 -:1021B000C701B6010E94432F1816D4F58091BC02C6 -:1021C0009091BD028F3F2FEF920729F001969093D7 -:1021D000BD028093BC02C701B6010E94301320E00B -:1021E00030E040E051E40E94472F9B01AC0160E0E9 -:1021F00074E284E79BE40E94F82D6B017C010E944D -:10220000602E709397006093960020910C0230919D -:102210000D0240910E0250910F02C701B6010E94BB -:10222000472F0E94602E709399006093980008C019 -:1022300010929700109296001092990010929800B8 -:102240006091C5027091C6026F5F7F4F7093C602A6 -:102250006093C502209196003091970080E090E055 -:10226000232BF1F0C0919600D09197000E94912EFF -:102270006B017C01BE0180E090E00E94912E9B01E9 -:10228000AC016091C7027091C8028091C90290911F -:10229000CA020E94F82D20E03FEF4FE757E410C03C -:1022A0000E94912E6B017C0120E030EE4FEF54E450 -:1022B0006091C7027091C8028091C9029091CA02D0 -:1022C0000E94472F9B01AC01C701B6010E94432F1A -:1022D00087FD96C08091C3028F5F8093C30290E018 -:1022E000209188033091890382179307A0F0809191 -:1022F0009303882319F01092C3020DC080917100DE -:102300008D7F80937100809190008F7780939000F3 -:102310001092D0027DC08091C402C091C30281118D -:1023200028C0C0908D03D0908E03E0908F03F09072 -:10233000900320E030E0A901C701B6010E94432FBD -:102340001816BCF481E08093C4021092CB02109264 -:10235000CC021092CD021092CE02C092C702D0924F -:10236000C802E092C902F092CA02C150C093C302EF -:1023700043C01092C4021092BD021092BC02E091C0 -:102380008A03F0918B0348E0C49FE00DF11D1124F6 -:1023900080819181A281B3818093CB029093CC0202 -:1023A000A093CD02B093CE0220E030E040E85EE39F -:1023B00064817581868197810E94472F6B017C0122 -:1023C00020E030E048EC52E460911002709111027C -:1023D00080911202909113020E94F82D9B01AC0192 -:1023E000C701B6010E94472F6093C7027093C802CD -:1023F0008093C9029093CA021092C6021092C5023D -:1024000080918C0380FD04C01092D0021092CF0204 -:10241000FF91EF91DF91CF91BF91AF919F918F91FC -:102420007F916F915F914F913F912F91FF90EF902E -:10243000DF90CF90BF90AF909F908F907F906F90E4 -:102440005F904F900F900FBE0F901F901895CF92F6 -:10245000DF92EF92FF92CF93DF936B017C01EA0151 -:102460008091BE02811102C00E94220E80918C03D5 -:1024700080FF46C080910D0390910E0308970CF0E9 -:102480003FC0809171008D7F809371008091D00258 -:1024900081110E943C0E81E08093CF021092BD0218 -:1024A0001092BC0220E030E0A901C701B6010E94F1 -:1024B000432F1816DCF480910D0390910E03FC015C -:1024C000EE0FFF1FEE0FFF1FEB51FD4FC082D182B9 -:1024D000E282F382FC01EE0FFF1FEB52FD4FD1832E -:1024E000C083019690930E0380930D038091710039 -:1024F000826080937100809190008068809390004A -:10250000DF91CF91FF90EF90DF90CF9008958F9261 -:102510009F92AF92BF92CF92DF92EF92FF920F9372 -:102520001F93CF93DF93EC017B01D42E4801590117 -:102530008091BE02811102C00E94220E80918C0304 -:1025400080FF6BC0809171008D7F809371008091BE -:10255000CF0281110E943C0E81E08093D002D09383 -:102560008B03C0938A03F0928903E0928803D09290 -:10257000930380928D0390928E03A0928F03B0926A -:1025800090031092D1021092D2021092D3021092B4 -:10259000D4021092C30288819981AA81BB81809361 -:1025A000CB029093CC02A093CD02B093CE0220E058 -:1025B00030E040E85EE36C817D818E819F810E94E6 -:1025C000472F6B017C0120E030E048EC52E4609141 -:1025D00010027091110280911202909113020E94D8 -:1025E000F82D9B01AC01C701B6010E94472F6093F3 -:1025F000C7027093C8028093C9029093CA021092D6 -:10260000C6021092C50280917100826080937100B1 -:1026100080919000806880939000DF91CF911F910E -:102620000F91FF90EF90DF90CF90BF90AF909F9071 -:102630008F90089580910F0390E0019665E070E01F -:102640000E94233180930F03089580910F0390E03F -:10265000019765E070E00E94233180930F03089595 -:102660008F929F92AF92BF92CF92DF92EF92FF92A2 -:10267000CF93DF936B017C01C091BC02D091BD026E -:10268000BE0180E090E00E94912E4B015C01A70109 -:10269000960160E070E08CE594E40E94F82D9B01C7 -:1026A000AC01C501B4010E94472F0E94652E4091E4 -:1026B0000F03423009F45CC028F4442351F0413048 -:1026C000E9F0FBC0433009F481C0443009F4B4C0E0 -:1026D000F4C080E090E0A0E0BFE380930C02909310 -:1026E0000D02A0930E02B0930F021092BF0210923F -:1026F000C0021092C1021092C202DFC01092BF024B -:102700001092C0021092C1021092C202643171058F -:1027100040F46A307105E0F520E030E040E85EE327 -:102720003BC0693C710508F0C0C080E090E00E94A9 -:10273000912E20E030E040EA51E40E948F2D20E00D -:1027400030E044E353E40E94F82D9B01AC010E9469 -:10275000472F20E030E040E05EE30E94472F9B01DE -:10276000AC0160E070E080E09EE30E948F2D5BC0D2 -:102770001092BF021092C0021092C1021092C202C7 -:102780006432710578F4FB01EE59FF4F0C94373138 -:1027900020E030E040E05FE3C701B6010E94472F30 -:1027A0006B017C0180E090E0A0E0BEE380930C022E -:1027B00090930D02A0930E02B0930F027EC0A7016A -:1027C0009601C701B6010E94902DEACF1092BF0278 -:1027D0001092C0021092C1021092C2022AE0269FFB -:1027E000A001279F500D1124CA0168EB7BE00E94D5 -:1027F0000F31BC016C5D754077FF03C07195619529 -:102800007109882777FD8095982F0E94932E2EE3DB -:1028100033EC4EE259E30E94472F20E030E040ECD9 -:102820005EE30E94902D60930C0270930D028093E2 -:102830000E0290930F0241C01092BF021092C0028C -:102840001092C1021092C202CE0183709927892B87 -:10285000E1F0BE016170772780E090E00E94912E48 -:1028600020E030E040E05EE30E94472F20E030E0CF -:1028700040E45FE30E94902D60930C0270930D0280 -:1028800080930E0290930F020CC080E090E0A0E0D5 -:10289000BFE380930C0290930D02A0930E02B093BD -:1028A0000F02C770DD27CD2B41F410920C0210925D -:1028B0000D0210920E0210920F02C701B601DF91B5 -:1028C000CF91FF90EF90DF90CF90BF90AF909F900F -:1028D0008F900895809118030895CF93DF9300D0CF -:1028E0001F92CDB7DEB79C0180919803843019F513 -:1028F00093E099833B832A839093E9008FEF909133 -:10290000E800815095FD06C095ED9A95F1F700001D -:102910008111F5CF8091E80085FF0DC040E050E0C7 -:1029200063E070E0CE0101960E94A6168091E80057 -:102930008E778093E8000F900F900F90DF91CF91EA -:102940000895CF93DF9300D01F92CDB7DEB72091CB -:102950009803243021F522E029839B838A8383E036 -:102960008093E9008FEF9091E800815095FD06C0BB -:1029700095ED9A95F1F700008111F5CF8091E8006F -:1029800085FF0DC040E050E063E070E0CE010196AD -:102990000E94A6168091E8008E778093E8000F9041 -:1029A0000F900F90DF91CF910895209198032430DC -:1029B000F1F422E02093E9002FEF3091E80021505C -:1029C00035FD06C035ED3A95F1F700002111F5CF40 -:1029D0002091E80025FF0BC040E050E065E070E08A -:1029E0000E94A6168091E8008E778093E8000895F3 -:1029F000CF93DF9320919803243039F521E0209381 -:102A0000E9002FEF3091E800215035FD06C035ED8B -:102A10003A95F1F700002111F5CF2091E80025FF4C -:102A200014C0EC0140E050E068E070E00E94A6169F -:102A30008091E8008E778093E80088E0FE01A0E1B5 -:102A4000B3E001900D928A95E1F7DF91CF9108955F -:102A500080919703811109C00E943B180E94981829 -:102A60008091E20084608093E200089510929703C1 -:102A70000895089508950C94962742E061EC81E052 -:102A80000E94B51742E061EC82E00E94B51742E077 -:102A900061EC83E00C94B51780919A03833009F4BC -:102AA00053C030F4813071F0823009F48CC0089545 -:102AB0008A3009F478C08B3009F45EC0893009F09F -:102AC0009AC020C080919903813A09F094C0809106 -:102AD000E800877F8093E80080919D0390919E039A -:102AE000892B21F468E080E193E003C060E080E09E -:102AF00090E070E00E94F1168091E8008B7780935F -:102B0000E800089580919903813209F074C08091A2 -:102B10009D0390919E03892B09F06DC08091E80080 -:102B2000877F8093E8008091E80082FD05C0809156 -:102B300098038111F8CF5FC08091F1008093180352 -:102B40008091E8008B7753C080919903813A09F016 -:102B500052C080919D0390919E03892B09F04BC038 -:102B60008091E800877F8093E8008091E80080FFF3 -:102B7000FCCF80911E0236C0809199038132D9F535 -:102B800080919D0390919E03892BA9F58091E80087 -:102B9000877F8093E8000E94EA1780919B038093CF -:102BA0001E020C945B2180919903813221F5809162 -:102BB000E800877F8093E8000E94EA1780919C03D9 -:102BC00080931903089580919903813AA1F480912B -:102BD000E800877F8093E8008091E80080FFFCCFC9 -:102BE000809119038093F1008091E8008E778093A3 -:102BF000E8000C94EA17089584B7877F84BF88E1C2 -:102C00000FB6F89480936000109260000FBE90E0C1 -:102C100080E80FB6F89480936100909361000FBE36 -:102C20000E948D1B0E943B180E9498188091E20020 -:102C300084608093E20078940E941E1B0E948F1B88 -:102C400084E192E00E94391B80919803853069F4F9 -:102C50000E945027809196038823B1F30E947E271B -:102C6000882391F30E949016EFCF0E94971BECCF20 -:102C7000292F332723303105C9F064F42130310581 -:102C800081F02230310509F043C084E590E028E16D -:102C90003AE042C021323105F1F02232310541F1F2 -:102CA00037C082E190E02CE63AE036C099278130C7 -:102CB000910541F08230910541F0892B49F5E4E11D -:102CC000FAE005C0E6EEF9E002C0EAEBF9E0849133 -:102CD00090E09F0121C06330D8F4E62FF0E0EE0FC2 -:102CE000FF1FE856FD4F2081318189E090E014C03C -:102CF000633070F470E0FB01EE0FFF1FEE56FD4FE6 -:102D000020813181FB01E157FD4F808190E004C0BB -:102D100080E090E020E030E0FA01318320830895E4 -:102D200080E189BD82E189BD09B400FEFDCF8091BB -:102D3000D8008F7D8093D8008091E00082608093DE -:102D4000E0008091E00081FDFCCF0895CF92DF92FA -:102D5000EF92FF920F931F93CF93DF93EC018B01C0 -:102D60006A010E940918811133C0C114D10439F0DD -:102D7000F60180819181081B190BC80FD91FE12C26 -:102D8000F12C0115110519F18091E80085FD16C09F -:102D90008091E8008E778093E800C114D10449F057 -:102DA000F60180819181E80EF91EF182E08285E0D2 -:102DB0000FC00E940918882321F30AC089918093CB -:102DC000F10001501109FFEFEF1AFF0ADACF80E09E -:102DD000DF91CF911F910F91FF90EF90DF90CF90F7 -:102DE000089520919F033091A0032617370748F0DC -:102DF0006115710539F42091E8002E772093E800E1 -:102E000001C0B90140E061157105A9F12091980355 -:102E1000222309F443C0253009F442C02091E80080 -:102E200023FD40C02091E80022FD32C02091E8003F -:102E300020FFE9CF4091F3002091F20030E0342BE5 -:102E4000FC01CF016115710559F02830310540F4BE -:102E500081918093F100615071092F5F3F4FF1CF55 -:102E600041E02830310509F040E02091E8002E775C -:102E70002093E800C8CF4111C9CF0AC080919803C0 -:102E8000882361F0853061F08091E80083FD0AC0FD -:102E90008091E80082FFF2CF80E0089582E00895FB -:102EA00083E0089581E0089520919F033091A0036D -:102EB0002617370748F06115710539F42091E800AD -:102EC0002E772093E80001C0B901FC0120E06115D4 -:102ED000710591F180919803882309F440C08530F1 -:102EE00009F43FC08091E80083FD3DC08091E80077 -:102EF00082FD2FC08091E80080FFE9CF2091F30090 -:102F00008091F20090E0922B6115710559F08830A4 -:102F1000910540F424912093F1003196615071099C -:102F20000196F2CF21E0089709F020E08091E800B7 -:102F30008E778093E800CBCF2111CCCF0AC080914F -:102F40009803882361F0853061F08091E80083FD6B -:102F50000AC08091E80082FFF2CF80E0089582E00D -:102F6000089583E0089581E00895982F973058F5EB -:102F70009093E900981739F07091EC002091ED00E2 -:102F80005091F00003C0242F762F50E021FF19C08C -:102F90003091EB003E7F3093EB003091ED003D7FB0 -:102FA0003093ED003091EB0031603093EB00709383 -:102FB000EC002093ED005093F0002091EE0027FFED -:102FC00007C09F5FD3CF8F708093E90081E00895A1 -:102FD00080E008958091990387FF11C08091E800F7 -:102FE00082FD05C0809198038111F8CF11C08091B6 -:102FF000E8008B770BC080919803882349F080917B -:10300000E80080FFF8CF8091E8008E778093E80099 -:1030100008952091E4003091E50095E64091EC00A0 -:10302000842F817040FF22C08091E80080FD1CC089 -:1030300080919803882391F0853091F08091EB0086 -:1030400085FD10C04091E4005091E5004217530700 -:1030500029F39A01915011F784E0089582E00895D0 -:1030600083E0089581E0089580E008954091E800AC -:1030700042FFDECF08950E94A9180E94B118E0EE29 -:10308000F0E0808181608083E8EDF0E080818F77DF -:10309000808319BCA7EDB0E08C918E7F8C938081EA -:1030A0008F7E80831092970308950F931F93CF9381 -:1030B000DF930E94A9180E94B118C8EDD0E0888162 -:1030C0008F77888388818068888388818F7D8883D3 -:1030D00019BC1092980310929403109296031092C8 -:1030E000950300EE10E0F80180818B7F808388815A -:1030F0008160888342E060E080E00E94B517E1EEE5 -:10310000F0E080818E7F8083E2EEF0E0808181605C -:103110008083808188608083F80180818E7F8083B6 -:10312000888180618883DF91CF911F910F910895ED -:10313000E8EDF0E080818F7E8083E7EDF0E0808134 -:103140008160808384E082BF81E0809397030C9448 -:103150005518E8EDF0E080818E7F80831092E200C8 -:1031600008951092DA001092E10008951F920F92D4 -:103170000FB60F9211242F933F934F935F936F934A -:103180007F938F939F93AF93BF93EF93FF93809120 -:10319000E10082FF0BC08091E20082FF07C08091B6 -:1031A000E1008B7F8093E1000E941D1B8091DA007B -:1031B00080FF1FC08091D80080FF1BC08091DA0083 -:1031C0008E7F8093DA008091D90080FF0DC080E16E -:1031D00089BD82E189BD09B400FEFDCF81E0809305 -:1031E00098030E94281505C019BC109298030E94EC -:1031F00036158091E10080FF19C08091E20080FFC8 -:1032000015C08091E2008E7F8093E2008091E20001 -:1032100080618093E2008091D80080628093D80022 -:1032200019BC85E0809398030E943A158091E100D3 -:1032300084FF30C08091E20084FF2CC080E189BD12 -:1032400082E189BD09B400FEFDCF8091D8008F7D59 -:103250008093D8008091E1008F7E8093E10080917F -:10326000E2008F7E8093E2008091E2008160809393 -:10327000E20080919403882311F084E007C08091DC -:10328000E30087FD02C081E001C083E080939803E2 -:103290000E943B158091E10083FF29C08091E200EC -:1032A00083FF25C08091E100877F8093E10082E069 -:1032B00080939803109294038091E1008E7F809315 -:1032C000E1008091E2008E7F8093E2008091E20035 -:1032D00080618093E20042E060E080E00E94B517E8 -:1032E0008091F00088608093F0000E943915FF9172 -:1032F000EF91BF91AF919F918F917F916F915F916E -:103300004F913F912F910F900FBE0F901F901895E6 -:103310001F920F920FB60F9211242F933F934F934A -:103320005F936F937F938F939F93AF93BF93CF934D -:10333000DF93EF93FF93C091E900CF708091EC0091 -:10334000D82FD17080FDD0E81092E9008091F00074 -:10335000877F8093F00078940E94CC191092E90046 -:103360008091F00088608093F000CD2BCF70C093E7 -:10337000E900FF91EF91DF91CF91BF91AF919F91C4 -:103380008F917F916F915F914F913F912F910F900E -:103390000FBE0F901F9018951F93CF93DF93CDB75B -:1033A000DEB7AA970FB6F894DEBF0FBECDBFE9E92E -:1033B000F3E088E08E0F9091F10091938E13FBCF94 -:1033C0000E944C158091E80083FF1FC180919903F2 -:1033D00090919A03492F50E04A30510508F015C1E9 -:1033E000FA01EA57FF4F0C943731803881F0823868 -:1033F00009F00BC180919D038F708093E90080914B -:10340000EB0085FB882780F91092E90006C08091C7 -:10341000950390919603911182609091E800977FB7 -:103420009093E8008093F1001092F100C8C0282F1B -:103430002D7F09F0EAC0882319F0823061F0E5C0E1 -:1034400080919B03813009F0E0C0933009F080E067 -:10345000809396032BC080919B03811127C080919C -:103460009D038F7009F4D1C08093E9002091EB0097 -:1034700020FF1CC0933021F48091EB00806214C0C7 -:103480009091EB0090619093EB0021E030E0A90176 -:1034900002C0440F551F8A95E2F74093EA0010924C -:1034A000EA008091EB0088608093EB001092E900C5 -:1034B0008091E800877F86C08111A7C010919B038F -:1034C0001F778091E3008078812B8093E3008091C7 -:1034D000E800877F8093E8000E94EA178091E80067 -:1034E00080FFFCCF8091E30080688093E30011119E -:1034F00002C082E001C083E08093980386C08058B8 -:10350000823008F082C080919B0390919C038C3D97 -:1035100053E0950779F583E08A838AE289834FB780 -:10352000F894DE01139620E03EE051E2E32FF0E054 -:1035300050935700E49120FF03C0E295EF703F5F86 -:10354000EF708E2F90E0EA3010F0C79601C0C09661 -:103550008D939D932F5F243149F74FBF8091E800F1 -:10356000877F8093E8006AE270E0CE0101960E94B6 -:10357000F11614C0AE014F5F5F4F60919D030E9432 -:103580003816BC01009709F440C09091E800977F7D -:103590009093E80089819A810E9454178091E800F5 -:1035A0008B778093E80031C0803879F58091E8000E -:1035B000877F8093E800809194038093F10080914D -:1035C000E8008E778093E8000E94EA171EC0811100 -:1035D0001CC090919B039230C0F48091E800877FDB -:1035E0008093E800909394030E94EA1780919403DB -:1035F000811106C08091E30087FD02C081E001C017 -:1036000084E0809398030E943D158091E80083FF39 -:103610000AC08091E800877F8093E8008091EB00EA -:1036200080628093EB00AA960FB6F894DEBF0FBEBF -:10363000CDBFDF91CF911F9108950895CF938091D1 -:1036400098038823A1F0C091E900CF709091EC001D -:10365000892F817090FD80E8C82B1092E90080913D -:10366000E80083FD0E94CC19CF70C093E900CF9190 -:10367000089590931F0380931E030895E0911E0305 -:10368000F0911F03309721F00190F081E02D099413 -:1036900080E00895E0911E03F0911F03309721F020 -:1036A0000280F381E02D09940895E0911E03F091CA -:1036B0001F03309721F00480F581E02D09940895CF -:1036C00020911C0330911D038217930771F0909392 -:1036D0001D0380931C03E0911E03F0911F0330979C -:1036E00021F00680F781E02D0994089520911A03B6 -:1036F00030911B038217930771F090931B03809303 -:103700001A03E0911E03F0911F03309721F000840B -:10371000F185E02D0994089508950C948C1B0E9466 -:10372000CA270E94F60B0E9450280C94F82C4F9246 -:103730005F927F928F929F92AF92BF92CF92DF92D1 -:10374000EF92FF920F931F93CF93DF93CDB7DEB726 -:103750002A970FB6F894DEBF0FBECDBF0E94D10CE2 -:1037600091E2C92E93E0D92E00E010E0AA24A394A0 -:10377000B12C702E802F0E940A0E4C01F601419050 -:1037800051906F014826592641145104B1F40F5F3E -:103790001F4F0530110569F78FEF89838A831B82DC -:1037A0000E94D3278160782F9D838C8349815A8121 -:1037B0006B818D810E94501C3AC08091770381FDFE -:1037C0000E94130E20E030E07501022E02C0EE0CC4 -:1037D000FF1C0A94E2F7C70184219521892B09F186 -:1037E0002E837F828E209F2091E0892809F490E02B -:1037F00098870E94D3278160782F9A8789874E8186 -:103800005F8168858A850E94501C000F111FF80196 -:10381000EF5DFC4F80819181E826F926F182E082FC -:1038200006C02F5F3F4F2C30310571F6B0CF0E949C -:10383000372A109120030E943E1B1817D9F00E94CE -:103840003E1B809320032A960FB6F894DEBF0FBE6E -:10385000CDBFDF91CF911F910F91FF90EF90DF903F -:10386000CF90BF90AF909F908F907F905F904F9040 -:103870000C942E0B2A960FB6F894DEBF0FBECDBF68 -:10388000DF91CF911F910F91FF90EF90DF90CF903C -:10389000BF90AF909F908F907F905F904F900895D2 -:1038A000CF93DF93CDB7DEB72B970FB6F894DEBF7B -:1038B0000FBECDBF4F83588769877A878B87DE011C -:1038C000119686E0FD0111928A95E9F785E0FE01E7 -:1038D000379601900D928A95E1F749815A816B8163 -:1038E0007C818D819E810E94F5232B960FB6F894E2 -:1038F000DEBF0FBECDBFDF91CF910895CF93882358 -:1039000009F4C2C0C82F823859F40E943E1B81FDC1 -:10391000BBC089E30E949E260E94212789E30CC038 -:10392000833879F40E943E1B80FDAEC083E50E947F -:103930009E260E94212783E50E94BB26CF910C94EE -:103940002127843859F40E943E1B82FD9DC087E4E4 -:103950000E949E260E94212787E4EECF8CEF8C0FD9 -:10396000813A48F48C2F0E94602C81118DC08C2FDD -:103970000E949E26E3CF80E28C0F883048F4C77007 -:1039800081E001C0880FCA95EAF70E94DA26D6CFF7 -:103990008BE58C0F833078F4C53A29F0C63A31F0C4 -:1039A00083E890E005C081E890E002C082E890E002 -:1039B000CF910C94601B88E58C0F833108F064C0B4 -:1039C000C83A39F1C93A41F1CA3A49F1CB3A51F111 -:1039D000CC3A59F1CD3A61F1C03B69F1CE3A71F17F -:1039E000CF3A79F1C13B81F1C23B89F1C33B91F1FF -:1039F000C43B99F1C53BA1F1C63BA9F1C73BB1F16D -:103A0000C83BB9F1C93BC1F1CA3BC9F180E090E0C4 -:103A100038C082EE90E035C089EE90E032C08AEE88 -:103A200090E02FC085EB90E02CC086EB90E029C0A1 -:103A300087EB90E026C08CEC90E023C08DEC90E00A -:103A400020C083E891E01DC08AE891E01AC082E9B5 -:103A500091E017C084E991E014C081E292E011C0C6 -:103A600083E292E00EC084E292E00BC085E292E035 -:103A700008C086E292E005C087E292E002C08AE2D6 -:103A800092E0CF910C94761BCF910895882309F48E -:103A90004BC0823859F40E943E1B81FF45C089E328 -:103AA0000E949E260E94212789E30CC0833871F46E -:103AB0000E943E1B80FF38C083E50E949E260E9424 -:103AC000212783E50E94BB260C942127843859F4D2 -:103AD0000E943E1B82FF28C087E40E949E260E940F -:103AE000212787E4EFCF9CEF980F913A58F390E2AB -:103AF000980F983050F4877091E001C0990F8A9523 -:103B0000EAF7892F0E94E026DFCF9BE5980F9330DC -:103B100020F480E090E00C94601B885A833120F4FC -:103B200080E090E00C94761B0895882321F00E9499 -:103B3000DA260C9421270895882321F00E94E0269C -:103B40000C9421270895BF92CF92DF92EF92FF92BB -:103B50000F931F93CF93DF9300D000D000D0CDB749 -:103B6000DEB725E0FC01DE01119601900D922A9549 -:103B7000E1F7FC01D08011810281258122952F700F -:103B800043815481452B09F472C31F3F21F4FFEF99 -:103B9000DF1609F46CC37C012E830E94F707D982DB -:103BA0001A8369817A81802F0E949A26182FB92E54 -:103BB0000E944F260E9416252E81002319F00E9494 -:103BC000F7262E81EB2DE295EF70F0E0E057FF4FE6 -:103BD0000C9437318B2D807F9B2D9F70F92E88237D -:103BE00019F0F29480EFF822002389F0FF2009F405 -:103BF0007CC280E2810F883020F48F2D0E94DA266B -:103C000003C08F2D0E94EA260E9421276EC2812FB9 -:103C10000E94461DFF2009F42AC3105E8F2D183024 -:103C200018F40E94E02602C00E94F02626960FB6E5 -:103C3000F894DEBF0FBECDBFDF91CF911F910F91E2 -:103C4000FF90EF90DF90CF90BF900C9421278B2DA9 -:103C5000807F9B2D9F70803211F4892F03C0892FA4 -:103C60008295807F112319F0113011F12BC00023B0 -:103C7000A9F0222389F1213079F526960FB6F89420 -:103C8000DEBF0FBECDBFDF91CF911F910F91FF908F -:103C9000EF90DF90CF90BF900C940A27222319F069 -:103CA000213009F4E4C28E830E940D278E819BC1CE -:103CB000002321F0263008F0DAC20EC0253008F0CB -:103CC000D6C291C10023C9F0222331F0F7019581BA -:103CD00090FF0BC29F70958326960FB6F894DEBFB7 -:103CE0000FBECDBFDF91CF911F910F91FF90EF904D -:103CF000DF90CF90BF900C94951D222309F473C1DF -:103D000009C22B2D26952695237030E0211531050B -:103D100021F021303105D1F0AAC2002321F0812FFA -:103D20009B2D937002C080E090E026960FB6F89429 -:103D3000DEBF0FBECDBFDF91CF911F910F91FF90DE -:103D4000EF90DF90CF90BF900C94601B002321F088 -:103D5000812F9B2D937002C080E090E026960FB6D5 -:103D6000F894DEBF0FBECDBFDF91CF911F910F91B1 -:103D7000FF90EF90DF90CF90BF900C94761B812F37 -:103D8000002319F00E943F2902C00E94A72926960D -:103D90000FB6F894DEBF0FBECDBFDF91CF911F915C -:103DA0000F91FF90EF90DF90CF90BF900C942C2A52 -:103DB0008B2D837009F07BC0011159C2812F829530 -:103DC00086958770880F880F912F9F70C92ED12CF0 -:103DD000E12CF12C082E04C0CC0CDD1CEE1CFF1CC9 -:103DE0000A94D2F714FF12C04FE050E060E070E098 -:103DF00004C0440F551F661F771F8A95D2F7CB0169 -:103E0000BA01609570958095909503C060E070E070 -:103E1000CB012B2D269526952370422F50E0423062 -:103E20005105D9F04330510569F16C297D298E295E -:103E30009F294130510551F126960FB6F894DEBF07 -:103E40000FBECDBFDF91CF911F910F91FF90EF90EB -:103E5000DF90CF90BF900C943D256C297D298E2951 -:103E60009F2926960FB6F894DEBF0FBECDBFDF9117 -:103E7000CF911F910F91FF90EF90DF90CF90BF9067 -:103E80000C9459250E943D25C701B60126960FB610 -:103E9000F894DEBF0FBECDBFDF91CF911F910F9180 -:103EA000FF90EF90DF90CF90BF900C9421250023DE -:103EB00019F08B2D817001C08695882309F4D7C134 -:103EC000812F829586958770880F880F912F9F701C -:103ED000C92ED12CE12CF12C082E04C0CC0CDD1CF9 -:103EE000EE1CFF1C0A94D2F714FF12C04FE050E002 -:103EF00060E070E004C0440F551F661F771F8A956D -:103F0000D2F7CB01BA01609570958095909503C06A -:103F100060E070E0CB012B2D269526952370422F73 -:103F200050E042305105D9F04330510569F16C2918 -:103F30007D298E299F294130510551F126960FB6D2 -:103F4000F894DEBF0FBECDBFDF91CF911F910F91CF -:103F5000FF90EF90DF90CF90BF900C9417266C29C4 -:103F60007D298E299F2926960FB6F894DEBF0FBEB5 -:103F7000CDBFDF91CF911F910F91FF90EF90DF9018 -:103F8000CF90BF900C9433260E941726C701B6012C -:103F900026960FB6F894DEBF0FBECDBFDF91CF914E -:103FA0001F910F91FF90EF90DF90CF90BF900C94F6 -:103FB000FB25103F49F118F4103E48F491C0123F20 -:103FC00009F453C0E8F1133F09F464C089C01F70BD -:103FD0008B2D8F71002321F00E949425812F7CCEA0 -:103FE0000E94B525812F26960FB6F894DEBF0FBE2E -:103FF000CDBFDF91CF911F910F91FF90EF90DF9098 -:10400000CF90BF900C949C1D0023B1F0253008F098 -:104010002EC18B2D8F7126960FB6F894DEBF0FBE82 -:10402000CDBFDF91CF911F910F91FF90EF90DF9067 -:10403000CF90BF900C94DA25263008F018C1E9CF54 -:104040000023A9F08B2D8F7126960FB6F894DEBF52 -:104050000FBECDBFDF91CF911F910F91FF90EF90D9 -:10406000DF90CF90BF900C949425002359F38B2DB3 -:104070008F7126960FB6F894DEBF0FBECDBFDF91CD -:10408000CF911F910F91FF90EF90DF90CF90BF9055 -:104090000C94B525002399F08B2D8F7126960FB6C1 -:1040A000F894DEBF0FBECDBFDF91CF911F910F916E -:1040B000FF90EF90DF90CF90BF900C947F252696D5 +:1009700001002A0354006800650020005000720046 +:1009800065006F006E006900630020004B00650089 +:10099000790062006F0061007200640000002C03A7 +:1009A0004F007200740068006F006C0069006E00F8 +:1009B00065006100720020004B0065007900620054 +:1009C0006F006100720064007300000004030904FA +:1009D00009025400030100A0FA0904000001030108 +:1009E0000100092111010001223F000705810308D0 +:1009F000000A09040100010301020009211101009C +:100A000001224D000705820308000A0904020001C3 +:100A100003000000092111010001223600070583AF +:100A20000308000A1201100100000008EDFE6160D9 +:100A300001000102000105010980A10185021601E2 +:100A40000026B7001A01002AB70075109501810031 +:100A5000C0050C0901A1018503160100269C021A9C +:100A600001002A9C02751095018100C00501090250 +:100A7000A1010901A1000509190129051500250198 +:100A80009505750181029501750381010501093004 +:100A900009311581257F9502750881060938158170 +:100AA000257F950175088106050C0A3802158125F8 +:100AB0007F950175088106C0C005010906A10105E1 +:100AC0000719E029E71500250195087501810295B0 +:100AD0000175088101050819012905950575019120 +:100AE000029501750391010507190029FF150025DD +:100AF000FF950675088100C011241FBECFEFDAE014 +:100B0000DEBFCDBF04B603FE24C08091F3039091F5 +:100B1000F403A091F503B091F6038730904BA74002 +:100B2000B04BB9F41092F3031092F4031092F50352 +:100B30001092F60314BE84B7877F84BF88E10FB696 +:100B4000F89480936000109260000FBEE0E0F8E33C +:100B5000099512E0A0E0B1E0E8EAF3E602C00590F2 +:100B60000D92A63FB107D9F713E0A6EFB2E001C09E +:100B70001D92A33FB107E1F70E940D160C94D231EC +:100B80000C940000279A2F988FEF9FEF9093870087 +:100B9000809386008AE08093800089E180938100C1 +:100BA0000C94092D282F81110BC080918000877F24 +:100BB0008093800010928D0010928C002F980895E1 +:100BC0002F9880918000886080938000233019F4F2 +:100BD0008FEF9FEF0FC083E090E0821B9109880F99 +:100BE000991F2FEF3FEFA90102C0569547958A95AF +:100BF000E2F7CA0190938D0080938C000895CF9303 +:100C0000DF93EC010E94AE28BE0180E090E0DF910E +:100C1000CF910C9428250F931F93462F50E04C3012 +:100C2000510508F098C0DC01FA01EA5AFF4F12960C +:100C30008C910C949631882309F48DC000E010E06B +:100C4000980140E064E070E089EC91E00E9463125A +:100C500081E090E00FC0882309F47DC000E010E03F +:100C6000980140E066E070E089E591E00E9463123F +:100C700082E090E00E94FF056EC0882309F46BC0FB +:100C800000E010E0980140E068E070E089E891E061 +:100C90000E94631284E090E0EDCF882311F083E09E +:100CA00005C083E00CC0882349F084E00E94A5259C +:100CB00040E164E083E00E94C90A4DC084E00E94E4 +:100CC000C625F6CF882331F085EE0E948F1C0E9446 +:100CD000602D41C085EE0E94571D3DC08823D9F18B +:100CE0000E94F70D38C08823B1F10E94F00D00E09A +:100CF00010E0980140E064E070E089EE91E029C0E6 +:100D0000882349F185E00E94C6250E94180E23C061 +:100D1000882309F100E010E0980140E068E070E00D +:100D200089E191E00E94631285E00E94A52513C02D +:100D3000882389F00E94F61204C0882361F00E9483 +:100D4000011300E010E0980140E068E070E089E104 +:100D500091E00E94631280E090E01F910F9108954E +:100D60000F931F932FEF89EF90E021508040904028 +:100D7000E1F700C0000000E010E0980140E064E00E +:100D800070E089EE91E00E9463121F910F91089527 +:100D9000CF92DF92EF92FF920F931F93CF93DF9347 +:100DA000CDB7DEB7CC58D1090FB6F894DEBF0FBE71 +:100DB000CDBF2091B30325FFC5C08C01FC019281FA +:100DC00080910001992309F460C096E4E5E2F2E025 +:100DD000DE01A95BBF4F01900D929A95E1F7F801F2 +:100DE0009081E091F602F091F702E90FF11DEE0F0C +:100DF000FF1F27E430E02C0F3D1FE20FF31F60813F +:100E00007181680F711D882777FD8095982F0E944A +:100E1000A42E20E030E040E451E40E94092E6B0152 +:100E20007C01F801218185E090E0821B9109BC01E1 +:100E3000882777FD8095982F0E94A42E9B01AC01F6 +:100E4000C701B6010E94A12D9B01AC0160E070E0DA +:100E500080E090E40E94173020E030E04CE551E45F +:100E60000E94B42F4FE050E0C457DF4F0FB6F89404 +:100E7000DEBF0FBECDBFDF91CF911F910F91FF90CD +:100E8000EF90DF90CF900C94031296E4E5E2F2E04D +:100E9000DE01119601900D929A95E1F7F80190818B +:100EA000E091F602F091F702E90FF11DEE0FFF1F3E +:100EB00021E030E02C0F3D1FE20FF31F60817181B4 +:100EC000680F711D882777FD8095982F0E94A42EAA +:100ED00020E030E040E451E40E94092E6B017C01E7 +:100EE000F801218185E090E0821B9109BC018827EF +:100EF00077FD8095982F0E94A42E9B01AC01C7011D +:100F0000B6010E94A12D9B01AC0160E070E080E081 +:100F100090E40E94173020E030E04CE551E40E945C +:100F2000B42FC457DF4F0FB6F894DEBF0FBECDBF4E +:100F3000DF91CF911F910F91FF90EF90DF90CF90B5 +:100F40000C944B0EC457DF4F0FB6F894DEBF0FBEA4 +:100F5000CDBFDF91CF911F910F91FF90EF90DF9068 +:100F6000CF9008950F931F9300E010E0980140E0A8 +:100F700063E070E081E091E00E9463122FEF82E570 +:100F800097E0215080409040E1F700C000001F91A1 +:100F90000F91089508950E94C2056E9A769A0C9456 +:100FA000B0060C94CA070C94C8060895880F991FC0 +:100FB000FC01E650F040859194910895880F991FA7 +:100FC000FC01E658FE4F8591949108950F931F936D +:100FD000CF93DF93EC01811520E49207A0F5C115B2 +:100FE00080E3D80708F0E1C0C83ED105D8F4C03E80 +:100FF000D10508F0EEC1C83AD10578F4C53AD1055B +:1010000008F074C0C130D10509F46DC008F4DEC128 +:10101000C430D10508F0DDC1D9C1CB3BD10508F4FE +:1010200070C0D4C1C11590E2D90708F0B9C0C1158C +:1010300021E0D20708F0CDC1C03FD10508F4C6C1F8 +:101040008E01106506C2C13080E5D80709F4BDC025 +:1010500068F5C13120E4D20709F4AEC050F4C031C4 +:1010600090E4D90708F0A5C0CF70DD278E01146D7C +:10107000F0C1C33120E4D20709F4A4C008F49FC032 +:10108000C115D04509F0A2C10E946C210E94180E22 +:101090000E94B2079FEF24E38CE0915020408040F3 +:1010A000E1F700C000000E943F28D3C1C11520E62F +:1010B000D20730F4C11581E5D80708F48CC02DC1E2 +:1010C000C11590E7D90708F481C1C11520E8D207FE +:1010D00008F478C1C11580E9D80708F077C1DF703E +:1010E0008E01106AB6C101E010E0B3C1C53AD10566 +:1010F00009F471C1C63AD10509F070C102E810E4E3 +:10110000A8C1C83AD10509F46CC1C93AD10509F49E +:101110006BC1CA3AD10509F46AC1CB3AD10509F4C9 +:1011200069C1CC3AD10509F468C1CD3AD10509F4B9 +:1011300067C1C03BD10509F466C1CE3AD10509F4B7 +:1011400065C1CF3AD10509F464C1C13BD10509F4A9 +:1011500063C1C23BD10509F462C1C33BD10509F4A7 +:1011600061C1C43BD10509F460C1C53BD10509F497 +:101170005FC1C63BD10509F45EC1C73BD10509F487 +:101180005DC1C83BD10509F45CC1C93BD10509F477 +:101190005BC1CA3BD10509F45AC100E014E459C14E +:1011A000CE019F700E94DE0755C1DD278E01106CB5 +:1011B00050C100E011ED4DC100E010ED4AC100E06A +:1011C00012ED47C100E013ED44C18091C703816077 +:1011D0008093C7033EC10E949B28811102C00E94D8 +:1011E00077280E94B32890E09093F2038093F10354 +:1011F000C23090E5D90721F48091F103816086C067 +:10120000C43020E5D20721F48091F10382607EC0D2 +:10121000C63080E5D80721F48091F103846076C060 +:10122000C83090E5D90719F48091F10327C0CA307E +:1012300020E5D20721F48091F103806167C0CC30B2 +:1012400080E5D80721F48091F10380625FC0CE3041 +:1012500090E5D90721F48091F103806457C0C03133 +:1012600020E5D20721F48091F10380684FC0C2319C +:1012700080E5D80729F48091F1038460886046C036 +:10128000C33090E5D90721F48091F1038E7F3EC0F1 +:10129000C53020E5D20721F48091F1038D7F36C05F +:1012A000C73080E5D80721F48091F1038B7F2EC0F1 +:1012B000C93090E5D90719F48091F10326C0CB30ED +:1012C00020E5D20721F48091F1038F7E1FC0CD303D +:1012D00080E5D80721F48091F1038F7D17C0CF30CE +:1012E00090E5D90721F48091F1038F7B0FC0C131C4 +:1012F00020E5D20721F48091F1038F7707C0C33135 +:10130000D04531F48091F1038B7F877F8093F10387 +:101310008091F1030E94B7289CC08D2F99278F7070 +:10132000992781309105D9F49E012370332702C09B +:10133000880F991F2A95E2F79C688E0144E0000F00 +:10134000111F4A95E1F700271370802B912B53E072 +:10135000CC0FDD1F5A95E1F7C076DD272FC0823014 +:10136000910531F4DC2FCC278E01016F106A71C01A +:101370008330910569F4CE018370992701E010E074 +:1013800002C0000F111F8A95E2F7C8019C680FC0C8 +:10139000049709F05EC0CE018370992701E010E048 +:1013A00002C0000F111F8A95E2F7C8019A6823E076 +:1013B000CC0FDD1F2A95E1F7C07ED7708C010C2B76 +:1013C0001D2B47C0DF708E01106243C000E010E0AB +:1013D00040C08E013EC001E810E43BC003E810E4C9 +:1013E00038C002EE14E435C009EE14E432C00AEE4F +:1013F00014E42FC005EB14E42CC006EB14E429C060 +:1014000007EB14E426C00CEC14E423C00DEC14E448 +:1014100020C003E815E41DC00AE815E41AC002E97B +:1014200015E417C004E915E414C001E216E411C084 +:1014300003E216E40EC004E216E40BC005E216E473 +:1014400008C006E216E405C007E216E402C00AE29C +:1014500016E4C801DF91CF911F910F9108959CE090 +:10146000799FF00111249CE3899FE00DF11D112467 +:10147000E60FF11DEE0FFF1FE658FE4F8591949188 +:10148000803E9105E0F4803C910558F5813391054B +:1014900009F46FC048F48932910509F463C08A32B7 +:1014A000910509F46DC072C089339105E9F0823865 +:1014B0009105D1F08533910509F44DC067C0833E95 +:1014C000910581F138F4803E9105B9F0823E910595 +:1014D000D9F05CC0863E910561F1873E9105A1F18E +:1014E00055C00E94D60708952091F10320FD02C047 +:1014F00021FF4CC080EE90E049C08091F10380FF55 +:10150000F9CF89E390E042C08091F10382FF0EC0E1 +:101510008091F10384FF03C080E090E037C083EE48 +:1015200090E034C08091F10382FFF2CF82EE90E030 +:101530002DC08091F10383FF0BC08091F10384FDE6 +:10154000EBCF87EE90E022C08091F10383FFF5CFCF +:1015500086EE90E01BC08091F10385FF07C089E211 +:1015600090E014C08091F10385FFF9CF85E390E00E +:101570000DC08091F10386FF07C08AE290E006C0AB +:101580008091F10386FFF9CF81E390E00E94E607A6 +:101590000895CF92DF92EF92FF920F931F9301E095 +:1015A00010E020E030E06801790104C0CC0CDD1CC3 +:1015B000EE1CFF1C8A95D2F704C0000F111F221FDA +:1015C000331F6A95D2F70C291D292E293F29C09077 +:1015D000B303D090B403E090B503F090B603C022FB +:1015E000D122E222F322842FC016D106E206F306AE +:1015F00041F41F910F91FF90EF90DF90CF900C94EA +:10160000A5251F910F91FF90EF90DF90CF900C9444 +:10161000C62508950C94090B5F926F927F928F926A +:101620009F92AF92BF92CF92DF92EF92FF920F9371 +:101630001F93CF93DF93CDB7DEB72A970FB6F894F9 +:10164000DEBF0FBECDBFCE0101966C014E019BE007 +:10165000890E911C20E030E040E050E060E070E056 +:1016600000E010E0E12CF12C6C2C5D2C8AE0782E4F +:10167000AA24A394B12CEBE6F2E0A62DB52D872D7C +:1016800001900D928A95E1F7F601819191916F0198 +:10169000FC01E07FFF27E032F10559F48F709927B4 +:1016A000F50102C0EE0FFF1F8A95E2F7EE2AFF2A2E +:1016B00037C0E033F10559F48F709927F50102C066 +:1016C000EE0FFF1F8A95E2F70E2B1F2B29C0E03487 +:1016D000F10559F48F709927F50102C0EE0FFF1F35 +:1016E0008A95E2F76E2B7F2B1BC0E035F10559F48C +:1016F0008F709927F50102C0EE0FFF1F8A95E2F760 +:101700004E2B5F2B0DC0E036F10551F48F709927F9 +:10171000F50102C0EE0FFF1F8A95E2F72E2B3F2B3B +:10172000C814D90409F0A7CF84B19E2D90958923C0 +:1017300084B985B1E82AE5B887B1902F90958923BF +:1017400087B988B1082B08B98AB1962F909589235B +:101750008AB98BB1682B6BB98DB1942F9095892381 +:101760008DB98EB1482B4EB980B3922F90958923B5 +:1017700080BB81B3282B21BB2A960FB6F894DEBF1D +:101780000FBECDBFDF91CF911F910F91FF90EF90D2 +:10179000DF90CF90BF90AF909F908F907F906F9091 +:1017A0005F9008955F926F927F928F929F92AF9217 +:1017B000BF92CF92DF92EF92FF920F931F93CF933E +:1017C000DF93CDB7DEB768970FB6F894DEBF0FBED4 +:1017D000CDBF85B7806885BF85B7806885BF0E940B +:1017E0000C0BCE0101966C014E0199E1890E911C02 +:1017F00020E030E040E050E060E070E000E010E029 +:10180000E12CF12C6C2C5D2C88E1782EAA24A39479 +:10181000B12CE5E7F2E0A62DB52D872D01900D92B4 +:101820008A95E1F7F601819191916F01FC01E07FCA +:10183000FF27E032F10559F48F709927F50102C0B6 +:10184000EE0FFF1F8A95E2F7EE2AFF2A37C0E0333A +:10185000F10559F48F709927F50102C0EE0FFF1FB3 +:101860008A95E2F70E2B1F2B29C0E034F10559F4BD +:101870008F709927F50102C0EE0FFF1F8A95E2F7DE +:101880006E2B7F2B1BC0E035F10559F48F70992723 +:10189000F50102C0EE0FFF1F8A95E2F74E2B5F2B7A +:1018A0000DC0E036F10551F48F709927F50102C0A3 +:1018B000EE0FFF1F8A95E2F72E2B3F2BC814D90499 +:1018C00009F0A7CF84B19E2D9095892384B985B165 +:1018D000E82AE5B887B1902F9095892387B988B118 +:1018E000082B08B98AB1962F909589238AB98BB1B4 +:1018F000682B6BB98DB1942F909589238DB98EB1DA +:10190000482B4EB980B3922F9095892380BB81B329 +:10191000282B21BBE2E0F3E0A8EFB2E01192119294 +:101920001D921D9283E0EC30F807C1F768960FB660 +:10193000F894DEBF0FBECDBFDF91CF911F910F9105 +:10194000FF90EF90DF90CF90BF90AF909F908F90DF +:101950007F906F905F900C94CB075F926F927F9215 +:101960008F929F92AF92BF92CF92DF92EF92FF92AF +:101970000F931F93CF93DF93CDB7DEB7A2970FB628 +:10198000F894DEBF0FBECDBF6E0149E1C40ED11C7D +:1019900088EFA82E82E0B82E75019AE0592E4601F4 +:1019A00001E010E028E1622E35E0732EEBE6F2E074 +:1019B000D401852D01900D928A95E1F7D6018D9184 +:1019C0009D916D019C01207F33272032310591F4D8 +:1019D00024B18F709927F80102C0EE0FFF1F8A957E +:1019E000E2F7CF01922F982B94B995B18095892376 +:1019F00085B953C02033310591F427B18F709927F1 +:101A0000A80102C0440F551F8A95E2F7CA01922F20 +:101A1000982B97B998B18095892388B93EC0203416 +:101A2000310591F42AB18F709927D80102C0AA0F0D +:101A3000BB1F8A95E2F7CD01922F982B9AB99BB1E3 +:101A4000809589238BB929C02035310591F42DB1BA +:101A50008F709927F80102C0EE0FFF1F8A95E2F7F9 +:101A6000CF01922F982B9DB99EB1809589238EB975 +:101A700014C02036310589F420B38F709927A8014E +:101A800002C0440F551F8A95E2F7CA01922F982B86 +:101A900090BB91B38095892381BB50EA5A95F1F7A9 +:101AA000BE016F5F7F4F20E030E040E050E0E5E7AF +:101AB000F2E0DE011196862D01900D928A95E1F7F4 +:101AC000DB018D919D91BD01FC01E07FFF27E0329C +:101AD000F10511F4E3B113C0E033F10511F4E6B1FF +:101AE0000EC0E034F10511F4E9B109C0E035F105AB +:101AF00011F4ECB104C0E036F105B9F4EFB1F0E057 +:101B00008F70992702C0F595E7958A95E2F7E0FD79 +:101B100008C0C801042E02C0880F991F0A94E2F77A +:101B200002C080E090E0282B392B4F5F5F4F4C3094 +:101B3000510509F0BCCFF70180819181821793078D +:101B400021F031832083709209020E940C0BF2E095 +:101B5000EF0EF11C42E0E41643E0F40609F026CF54 +:101B6000809109028823C9F081508093090288235B +:101B700039F08FE99FE00197F1F700C000000DC038 +:101B8000E2E0F3E0D5018D919D915D018193919308 +:101B9000B2E0AB16B3E0BB06A9F70E94D10781E023 +:101BA000A2960FB6F894DEBF0FBECDBFDF91CF91E6 +:101BB0001F910F91FF90EF90DF90CF90BF90AF906B +:101BC0009F908F907F906F905F900895E82FF0E046 +:101BD000EE0FFF1FEE5FFC4F808191810895089505 +:101BE0008091DC0381608093DC030C94C928809190 +:101BF000DC038E7F8093DC030C94C9280E949B2811 +:101C0000811102C00E9477280E94C5288093DC03BE +:101C10003E9A809171008D7F8093710082E0809365 +:101C200090008AE18093910081E080930E030895F3 +:101C300080910E03811102C00E94FE0D10925E037E +:101C400010925D03809171008D7F8093710080916F +:101C500090008F77809390001092200310921F03C2 +:101C600010925703109258031092590310925A037E +:101C70001092560310925503E5E3F3E0A5E2B3E0BA +:101C800011921192119211921D921D9283E0E535ED +:101C9000F807B1F70895CF92DF92EF92FF920F937A +:101CA0001F93CF93DF9320911F03222309F484C055 +:101CB0006B017C0180910E03811102C00E94FE0D18 +:101CC00005E513E0C7E0D0E0A7019601F801929185 +:101CD0008291729162918F010E94052E811131C013 +:101CE000FE01EE0FFF1FEE0FFF1FEB5CFC4F10829B +:101CF000118212821382DE01AA0FBB1FAB5DBC4FA3 +:101D000011961C921E92C730D105E9F021964481AC +:101D10005581668177814083518362837383148206 +:101D200015821682178212968D919C9113971196A7 +:101D30009C938E9313961C921E9212973496129631 +:101D4000E2CF219708F680915D0390915E030197A1 +:101D500097FD05C090935E0380935D0304C01092CD +:101D60005E0310925D0380915D0390915E0320916C +:101D70005B0330915C032817390724F010925C0351 +:101D800010925B03892BC1F4809171008D7F809349 +:101D90007100809190008F7780939000109257038C +:101DA000109258031092590310925A03109256033E +:101DB0001092550310921F03DF91CF911F910F9145 +:101DC000FF90EF90DF90CF9008951F920F920FB683 +:101DD0000F9211244F925F926F927F928F929F92F7 +:101DE000AF92BF92CF92DF92EF92FF922F933F93E9 +:101DF0004F935F936F937F938F939F93AF93BF9313 +:101E0000CF93DF93EF93FF9380911F03882309F40F +:101E10009BC1C0915D03D0915E031C161D060CF0A2 +:101E200093C140900F035090100360901103709085 +:101E3000120320E030E0A901C301B2010E94B02FDB +:101E400018160CF065C0C130D10509F452C080915C +:101E50005B0390915C03BE010E9482317C019093F0 +:101E60005C0380935B038090210390902203A090F9 +:101E70002303B090240320E030E040E85FE3C50195 +:101E8000B4010E94A12D60932103709322038093DB +:101E9000230390932403F701EE0FFF1FEE0FFF1FA4 +:101EA000EB5CFC4FA301920160817181828193817F +:101EB0000E94092E20E030E040E05EE30E94B42F53 +:101EC0009B01AC01C501B4010E94B02F18168CF41F +:101ED000C7010196BE010E94823190935C038093FA +:101EE0005B0310922103109222031092230310929D +:101EF0002403E0915B03F0915C03EE0FFF1FEE0FF4 +:101F0000FF1FEB5CFC4F6081718182819381D0C0A7 +:101F1000C0905703D0905803E0905903F0905A03B3 +:101F200020E030E0A901C701B6010E94052E2197EB +:101F3000882309F4A2C0FE01EE0FFF1FEE0FFF1F62 +:101F4000EB5CFC4F80809180A280B380A50194015E +:101F5000C701B6010E94052E87FF31C0A50194017B +:101F600060E070E08CED93EC0E94092E20E030E000 +:101F700040E451E40E94092E20E030E040E05FE3BD +:101F80000E94B42F9B01AC0160E070E080E090E41F +:101F90000E9417309B01AC01C501B4010E94B42F0F +:101FA0009B01AC01C701B6010E94052E87FF07C047 +:101FB000A701960160E070E08CED93E439C0A501C3 +:101FC0009401C701B6010E94B02F18160CF055C03D +:101FD000A501940160E070E08CED93E40E94092E6D +:101FE00020E030E040E451E40E94092E20E030E09F +:101FF00040E05FE30E94B42F9B01AC0160E070E021 +:1020000080E090E40E9417309B01AC01C501B4014F +:102010000E94B42F9B01AC01C701B6010E94B02FF2 +:1020200018165CF5A701960160E070E08CED93EC6A +:102030000E94092E20E030E040E451E40E94092E85 +:1020400020E030E040E05FE30E94B42F9B01AC0150 +:1020500060E070E080E090E40E9417309B01AC01EA +:10206000C701B6010E94B42F6093570370935803C1 +:102070008093590390935A0313C0FE01EE0FFF1F84 +:10208000EE0FFF1FEB5CFC4F80819181A281B38139 +:102090008093570390935803A0935903B0935A0326 +:1020A00060915703709158038091590390915A039E +:1020B00020910C0330910D032F3F4FEF340731F087 +:1020C0002F5F3F4F30930D0320930C030E940C139E +:1020D0006B017C0120E034E244EF51E40E94052EC4 +:1020E00087FF08C086EFC82E88E2D82E84EFE82E3E +:1020F00081E4F82E20E030E040E051E4C701B60171 +:102100000E94B42F9B01AC0160E074E284E79BE481 +:102110000E94092E6B017C010E94712E7093970022 +:102120006093960020910A0230910B0240910C02BC +:1021300050910D02C701B6010E94B42F0E94712E6A +:10214000709399006093980080912003882309F48C +:1021500033C1C0901B03D0901C03E0901D03F0908E +:102160001E0320E030E0A901C701B6010E94B02F94 +:102170001816D4F580910C0390910D038F3F2FEF2B +:10218000920729F0019690930D0380930C03C701E9 +:10219000B6010E940C1320E030E040E051E40E94C0 +:1021A000B42F9B01AC0160E074E284E79BE40E94E1 +:1021B000092E6B017C010E94712E70939700609331 +:1021C000960020910A0230910B0240910C0250912E +:1021D0000D02C701B6010E94B42F0E94712E7093A8 +:1021E00099006093980008C0109297001092960092 +:1021F0001092990010929800609115037091160347 +:102200006F5F7F4F709316036093150320919600C4 +:102210003091970080E090E0232BF1F0C091960080 +:10222000D09197000E94A22E6B017C01BE0180E03C +:1022300090E00E94A22E9B01AC0160911703709167 +:1022400018038091190390911A030E94092E20E02F +:102250003FEF4FE757E410C00E94A22E6B017C01B4 +:1022600020E030EE4FEF54E46091170370911803B3 +:102270008091190390911A030E94B42F9B01AC0125 +:10228000C701B6010E94B02F87FD96C0809113034D +:102290008F5F8093130390E02091D8033091D9038E +:1022A00082179307A0F08091E303882319F010921E +:1022B00013030DC0809171008D7F80937100809118 +:1022C00090008F7780939000109220037DC08091C2 +:1022D0001403C0911303811128C0C090DD03D09076 +:1022E000DE03E090DF03F090E00320E030E0A9019E +:1022F000C701B6010E94B02F1816BCF481E080938C +:10230000140310921B0310921C0310921D031092D1 +:102310001E03C0921703D0921803E0921903F092A3 +:102320001A03C150C093130343C0109214031092B8 +:102330000D0310920C03E091DA03F091DB0348E007 +:10234000C49FE00DF11D112480819181A281B38190 +:1023500080931B0390931C03A0931D03B0931E0353 +:1023600020E030E040E85EE36481758186819781FA +:102370000E94B42F6B017C0120E030E048EC52E475 +:1023800060910E0270910F028091100290911102E3 +:102390000E94092E9B01AC01C701B6010E94B42F17 +:1023A00060931703709318038093190390931A0393 +:1023B00010921603109215038091DC0380FD04C077 +:1023C0001092200310921F03FF91EF91DF91CF91A4 +:1023D000BF91AF919F918F917F916F915F914F913D +:1023E0003F912F91FF90EF90DF90CF90BF90AF90F3 +:1023F0009F908F907F906F905F904F900F900FBE47 +:102400000F901F901895CF92DF92EF92FF92CF938B +:10241000DF936B017C01EA0180910E03811102C000 +:102420000E94FE0D8091DC0380FF46C080915D0319 +:1024300090915E0308970CF03FC0809171008D7FF2 +:10244000809371008091200381110E94180E81E019 +:1024500080931F0310920D0310920C0320E030E0D4 +:10246000A901C701B6010E94B02F1816DCF48091B3 +:102470005D0390915E03FC01EE0FFF1FEE0FFF1F47 +:10248000EB5CFC4FC082D182E282F382FC01EE0F52 +:10249000FF1FEB5DFC4FD183C083019690935E03D9 +:1024A00080935D03809171008260809371008091C0 +:1024B0009000806880939000DF91CF91FF90EF9023 +:1024C000DF90CF9008958F929F92AF92BF92CF925C +:1024D000DF92EF92FF920F931F93CF93DF93EC0164 +:1024E0007B01D42E4801590180910E03811102C055 +:1024F0000E94FE0D8091DC0380FF6BC08091710013 +:102500008D7F8093710080911F0381110E94180EAE +:1025100081E080932003D093DB03C093DA03F09231 +:10252000D903E092D803D092E3038092DD03909226 +:10253000DE03A092DF03B092E00310922103109219 +:102540002203109223031092240310921303888114 +:102550009981AA81BB8180931B0390931C03A09354 +:102560001D03B0931E0320E030E040E85EE36C8181 +:102570007D818E819F810E94B42F6B017C0120E0C0 +:1025800030E048EC52E460910E0270910F028091AD +:102590001002909111020E94092E9B01AC01C7010B +:1025A000B6010E94B42F60931703709318038093B1 +:1025B000190390931A031092160310921503809139 +:1025C0007100826080937100809190008068809398 +:1025D0009000DF91CF911F910F91FF90EF90DF90CE +:1025E000CF90BF90AF909F908F90089580915F03A0 +:1025F00090E0019666E070E00E94823180935F0374 +:10260000089580915F0390E0019766E070E00E947A +:10261000823180935F0308958F929F92AF92BF9211 +:10262000CF92DF92EF92FF920F931F93CF93DF939E +:102630006B017C01C0910C03D0910D03BE0180E0C1 +:1026400090E00E94A22E4B015C01A701960160E080 +:1026500070E08CE594E40E94092E9B01AC01C50159 +:10266000B4010E94B42F0E94762E20915F03233084 +:1026700009F473C028F4222351F02130E9F02CC171 +:10268000243009F4A0C0253009F4E0C025C180E061 +:1026900090E0A0E0BFE380930A0290930B02A09326 +:1026A0000C02B0930D0210920F03109210031092BF +:1026B00011031092120310C110920F031092100315 +:1026C00010921103109212036431710540F46A30C4 +:1026D000710560F520E030E040E85EE32BC0693C26 +:1026E000710508F0AAC080E090E00E94A22E20E0D0 +:1026F00030E040EA51E40E94A02D20E030E044E3C5 +:1027000053E40E94092E9B01AC010E94B42F20E0EB +:1027100030E040E05EE30E94B42F9B01AC0160E03A +:1027200070E080E09EE30E94A02D44C020E030E0F5 +:1027300040E05FE3C701B6010E94B42F6B017C014A +:1027400080E090E0A0E0BEE380930A0290930B0249 +:10275000A0930C02B0930D02BFC010920F03109211 +:10276000100310921103109212034AE0469F900149 +:10277000479F300D1124C90168EB7BE00E946E3148 +:10278000BC016C5D754077FF03C07195619571095F +:10279000882777FD8095982F0E94A42E2EE333EC96 +:1027A0004EE259E30E94B42F20E030E040EC5EE3BB +:1027B0000E94A12D60930A0270930B0280930C0279 +:1027C00090930D0289C010920F0310921003109283 +:1027D000110310921203CE0183709927892BE1F027 +:1027E000BE016170772780E090E00E94A22E20E079 +:1027F00030E040E05EE30E94B42F20E030E040E4AF +:102800005FE30E94A12D60930A0270930B028093F4 +:102810000C0290930D020CC080E090E0A0E0BFE3BA +:1028200080930A0290930B02A0930C02B0930D02C6 +:10283000C770DD27CD2B09F04FC010920A0210920D +:102840000B0210920C0210920D0246C010920F0360 +:1028500010921003109211031092120300E010E086 +:1028600020E03FE300930A0210930B0220930C0236 +:1028700030930D026739710578F180E090E00E9495 +:10288000A22E20E030E047E153E40E94A02D20E09A +:1028900030E04AE754E40E94092E20E030E048E4AA +:1028A00052E40E94B42F20E030E040EA51E40E945C +:1028B000E62E0E94712E660F771F660F771FFB01B1 +:1028C000E357FD4F2081318142815381C701B60119 +:1028D0000E94B42F6B017C01C701B601DF91CF913B +:1028E0001F910F91FF90EF90DF90CF90BF90AF902E +:1028F0009F908F900895809168030895CF93DF9300 +:1029000000D01F92CDB7DEB79C018091E8038430E0 +:1029100019F593E099833B832A839093E9008FEF25 +:102920009091E800815095FD06C095ED9A95F1F7DC +:1029300000008111F5CF8091E80085FF0DC040E0D7 +:1029400050E063E070E0CE0101960E94B7168091DE +:10295000E8008E778093E8000F900F900F90DF9142 +:10296000CF910895CF93DF9300D01F92CDB7DEB7FC +:102970002091E803243021F522E029839B838A8378 +:1029800083E08093E9008FEF9091E800815095FDFE +:1029900006C095ED9A95F1F700008111F5CF809171 +:1029A000E80085FF0DC040E050E063E070E0CE013C +:1029B00001960E94B7168091E8008E778093E80018 +:1029C0000F900F900F90DF91CF9108952091E80321 +:1029D0002430F1F422E02093E9002FEF3091E80059 +:1029E000215035FD06C035ED3A95F1F70000211173 +:1029F000F5CF2091E80025FF0BC040E050E065E0F6 +:102A000070E00E94B7168091E8008E778093E8000E +:102A10000895CF93DF932091E803243039F521E026 +:102A20002093E9002FEF3091E800215035FD06C0DA +:102A300035ED3A95F1F700002111F5CF2091E8002E +:102A400025FF14C0EC0140E050E068E070E00E9417 +:102A5000B7168091E8008E778093E80088E0FE0149 +:102A6000A0E6B3E001900D928A95E1F7DF91CF9156 +:102A700008958091E703811109C00E944C180E94BB +:102A8000A9188091E20084608093E200089510927A +:102A9000E7030895089508950C94A72742E061EC98 +:102AA00081E00E94C61742E061EC82E00E94C617F6 +:102AB00042E061EC83E00C94C6178091EA03833016 +:102AC00009F453C030F4813071F0823009F48CC0C5 +:102AD00008958A3009F478C08B3009F45EC08930DB +:102AE00009F09AC020C08091E903813A09F094C0AE +:102AF0008091E800877F8093E8008091ED039091BA +:102B0000EE03892B21F468E080E693E003C060E0E7 +:102B100080E090E070E00E9402178091E8008B77DF +:102B20008093E80008958091E903813209F074C030 +:102B30008091ED039091EE03892B09F06DC0809197 +:102B4000E800877F8093E8008091E80082FD05C05F +:102B50008091E8038111F8CF5FC08091F1008093EC +:102B600068038091E8008B7753C08091E903813A34 +:102B700009F052C08091ED039091EE03892B09F08A +:102B80004BC08091E800877F8093E8008091E80047 +:102B900080FFFCCF80911C0236C08091E903813216 +:102BA000D9F58091ED039091EE03892BA9F58091E1 +:102BB000E800877F8093E8000E94FB178091EB0379 +:102BC00080931C020C946C218091E903813221F5E1 +:102BD0008091E800877F8093E8000E94FB17809136 +:102BE000EC038093690308958091E903813AA1F48D +:102BF0008091E800877F8093E8008091E80080FF63 +:102C0000FCCF809169038093F1008091E8008E777A +:102C10008093E8000C94FB17089584B7877F84BFE6 +:102C200088E10FB6F89480936000109260000FBEA8 +:102C300090E080E80FB6F894809361009093610073 +:102C40000FBE0E949E1B0E944C180E94A9188091E2 +:102C5000E20084608093E20078940E942F1B0E941F +:102C6000A01B82E192E00E944A1B8091E80385301C +:102C700069F40E9461278091E6038823B1F30E94E2 +:102C80008F27882391F30E94A116EFCF0E94A81BE3 +:102C9000ECCF292F332723303105C9F064F42130DC +:102CA000310581F02230310509F043C084E590E020 +:102CB00020ED39E042C021323105F1F022323105F8 +:102CC00041F137C082E190E024E23AE036C0992732 +:102CD0008130910541F08230910541F0892B49F511 +:102CE000ECECF9E005C0EEE9F9E002C0E2E7F9E05A +:102CF000849190E09F0121C06330D8F4E62FF0E08A +:102D0000EE0FFF1FEA51FD4F2081318189E090E0F5 +:102D100014C0633070F470E0FB01EE0FFF1FE0524F +:102D2000FD4F20813181FB01E352FD4F808190E016 +:102D300004C080E090E020E030E0FA01318320839D +:102D4000089580E189BD82E189BD09B400FEFDCF0F +:102D50008091D8008F7D8093D8008091E0008260C0 +:102D60008093E0008091E00081FDFCCF0895CF9238 +:102D7000DF92EF92FF920F931F93CF93DF93EC01BB +:102D80008B016A010E941A18811133C0C114D10449 +:102D900039F0F60180819181081B190BC80FD91FEA +:102DA000E12CF12C0115110519F18091E80085FD48 +:102DB00016C08091E8008E778093E800C114D1049A +:102DC00049F0F60180819181E80EF91EF182E082DE +:102DD00085E00FC00E941A18882321F30AC0899148 +:102DE0008093F10001501109FFEFEF1AFF0ADACFCB +:102DF00080E0DF91CF911F910F91FF90EF90DF90D6 +:102E0000CF9008952091EF033091F00326173707F4 +:102E100048F06115710539F42091E8002E77209370 +:102E2000E80001C0B90140E061157105A9F12091E8 +:102E3000E803222309F443C0253009F442C020915D +:102E4000E80023FD40C02091E80022FD32C020911F +:102E5000E80020FFE9CF4091F3002091F20030E03C +:102E6000342BFC01CF016115710559F02830310573 +:102E700040F481918093F100615071092F5F3F4FC1 +:102E8000F1CF41E02830310509F040E02091E80021 +:102E90002E772093E800C8CF4111C9CF0AC0809196 +:102EA000E803882361F0853061F08091E80083FDBC +:102EB0000AC08091E80082FFF2CF80E0089582E0AE +:102EC000089583E0089581E008952091EF03309103 +:102ED000F0032617370748F06115710539F4209182 +:102EE000E8002E772093E80001C0B901FC0120E042 +:102EF0006115710591F18091E803882309F440C0C0 +:102F0000853009F43FC08091E80083FD3DC0809189 +:102F1000E80082FD2FC08091E80080FFE9CF20917A +:102F2000F3008091F20090E0922B6115710559F049 +:102F30008830910540F424912093F100319661503E +:102F400071090196F2CF21E0089709F020E0809105 +:102F5000E8008E778093E800CBCF2111CCCF0AC058 +:102F60008091E803882361F0853061F08091E8006A +:102F700083FD0AC08091E80082FFF2CF80E00895CF +:102F800082E0089583E0089581E00895982F9730B6 +:102F900058F59093E900981739F07091EC00209162 +:102FA000ED005091F00003C0242F762F50E021FF58 +:102FB00019C03091EB003E7F3093EB003091ED0073 +:102FC0003D7F3093ED003091EB0031603093EB00AA +:102FD0007093EC002093ED005093F0002091EE00F0 +:102FE00027FF07C09F5FD3CF8F708093E90081E0F8 +:102FF000089580E008958091E90387FF11C08091D2 +:10300000E80082FD05C08091E8038111F8CF11C06E +:103010008091E8008B770BC08091E803882349F00A +:103020008091E80080FFF8CF8091E8008E77809350 +:10303000E80008952091E4003091E50095E6409184 +:10304000EC00842F817040FF22C08091E80080FD59 +:103050001CC08091E803882391F0853091F0809125 +:10306000EB0085FD10C04091E4005091E50042174F +:10307000530729F39A01915011F784E0089582E0F3 +:10308000089583E0089581E0089580E008954091D7 +:10309000E80042FFDECF08950E94BA180E94C218CD +:1030A000E0EEF0E0808181608083E8EDF0E08081F7 +:1030B0008F77808319BCA7EDB0E08C918E7F8C93C5 +:1030C00080818F7E80831092E70308950F931F9372 +:1030D000CF93DF930E94BA180E94C218C8EDD0E0C7 +:1030E00088818F77888388818068888388818F7DB5 +:1030F000888319BC1092E8031092E4031092E6034F +:103100001092E50300EE10E0F80180818B7F808350 +:1031100088818160888342E060E080E00E94C61779 +:10312000E1EEF0E080818E7F8083E2EEF0E080814E +:1031300081608083808188608083F80180818E7FB8 +:103140008083888180618883DF91CF911F910F9167 +:103150000895E8EDF0E080818F7E8083E7EDF0E078 +:1031600080818160808384E082BF81E08093E70377 +:103170000C946618E8EDF0E080818E7F80831092D9 +:10318000E20008951092DA001092E10008951F9273 +:103190000F920FB60F9211242F933F934F935F938B +:1031A0006F937F938F939F93AF93BF93EF93FF930F +:1031B0008091E10082FF0BC08091E20082FF07C096 +:1031C0008091E1008B7F8093E1000E942E1B809113 +:1031D000DA0080FF1FC08091D80080FF1BC0809163 +:1031E000DA008E7F8093DA008091D90080FF0DC0D5 +:1031F00080E189BD82E189BD09B400FEFDCF81E097 +:103200008093E8030E94391505C019BC1092E803A9 +:103210000E9447158091E10080FF19C08091E20073 +:1032200080FF15C08091E2008E7F8093E200809144 +:10323000E20080618093E2008091D80080628093F8 +:10324000D80019BC85E08093E8030E944B1580915B +:10325000E10084FF30C08091E20084FF2CC080E157 +:1032600089BD82E189BD09B400FEFDCF8091D800FF +:103270008F7D8093D8008091E1008F7E8093E10064 +:103280008091E2008F7E8093E2008091E200816075 +:103290008093E2008091E403882311F084E007C06A +:1032A0008091E30087FD02C081E001C083E080934C +:1032B000E8030E944C158091E10083FF29C08091B2 +:1032C000E20083FF25C08091E100877F8093E100C9 +:1032D00082E08093E8031092E4038091E1008E7F06 +:1032E0008093E1008091E2008E7F8093E2008091E4 +:1032F000E20080618093E20042E060E080E00E94B2 +:10330000C6178091F00088608093F0000E944A15F3 +:10331000FF91EF91BF91AF919F918F917F916F91AD +:103320005F914F913F912F910F900FBE0F901F9083 +:1033300018951F920F920FB60F9211242F933F935F +:103340004F935F936F937F938F939F93AF93BF93AD +:10335000CF93DF93EF93FF93C091E900CF708091FB +:10336000EC00D82FD17080FDD0E81092E900809158 +:10337000F000877F8093F00078940E94DD1910920E +:10338000E9008091F00088608093F000CD2BCF7031 +:10339000C093E900FF91EF91DF91CF91BF91AF9181 +:1033A0009F918F917F916F915F914F913F912F915D +:1033B0000F900FBE0F901F9018951F93CF93DF9320 +:1033C000CDB7DEB7AA970FB6F894DEBF0FBECDBF5C +:1033D000E9EEF3E088E08E0F9091F10091938E1367 +:1033E000FBCF0E945D158091E80083FF1FC1809193 +:1033F000E9039091EA03492F50E04A30510508F063 +:1034000015C1FA01EE59FF4F0C949631803881F0C6 +:10341000823809F00BC18091ED038F708093E90031 +:103420008091EB0085FB882780F91092E90006C0A7 +:103430008091E5039091E603911182609091E800FC +:10344000977F9093E8008093F1001092F100C8C03C +:10345000282F2D7F09F0EAC0882319F0823061F00F +:10346000E5C08091EB03813009F0E0C0933009F0B2 +:1034700080E08093E6032BC08091EB03811127C08D +:103480008091ED038F7009F4D1C08093E900209101 +:10349000EB0020FF1CC0933021F48091EB00806290 +:1034A00014C09091EB0090619093EB0021E030E02C +:1034B000A90102C0440F551F8A95E2F74093EA0024 +:1034C0001092EA008091EB0088608093EB001092EC +:1034D000E9008091E800877F86C08111A7C0109124 +:1034E000EB031F778091E3008078812B8093E300CA +:1034F0008091E800877F8093E8000E94FB1780910D +:10350000E80080FFFCCF8091E30080688093E300B7 +:10351000111102C082E001C083E08093E80386C0FD +:103520008058823008F082C08091EB039091EC03C8 +:103530008C3D53E0950779F583E08A838AE289839D +:103540004FB7F894DE01139620E03EE051E2E32FFE +:10355000F0E050935700E49120FF03C0E295EF7034 +:103560003F5FEF708E2F90E0EA3010F0C79601C0F9 +:10357000C0968D939D932F5F243149F74FBF809163 +:10358000E800877F8093E8006AE270E0CE01019650 +:103590000E94021714C0AE014F5F5F4F6091ED03B0 +:1035A0000E944916BC01009709F440C09091E800C0 +:1035B000977F9093E80089819A810E946517809196 +:1035C000E8008B778093E80031C0803879F58091EE +:1035D000E800877F8093E8008091E4038093F10006 +:1035E0008091E8008E778093E8000E94FB171EC050 +:1035F00081111CC09091EB039230C0F48091E800DF +:10360000877F8093E8009093E4030E94FB178091EA +:10361000E403811106C08091E30087FD02C081E0D0 +:1036200001C084E08093E8030E944E158091E80079 +:1036300083FF0AC08091E800877F8093E800809133 +:10364000EB0080628093EB00AA960FB6F894DEBF81 +:103650000FBECDBFDF91CF911F9108950895CF93F5 +:103660008091E8038823A1F0C091E900CF70909188 +:10367000EC00892F817090FD80E8C82B1092E90042 +:103680008091E80083FD0E94DD19CF70C093E900AE +:10369000CF91089590936F0380936E030895E09106 +:1036A0006E03F0916F03309721F00190F081E02DCF +:1036B000099480E00895E0916E03F0916F033097D4 +:1036C00021F00280F381E02D09940895E0916E03CA +:1036D000F0916F03309721F00480F581E02D09947B +:1036E000089520916C0330916D038217930771F058 +:1036F00090936D0380936C03E0916E03F0916F03E0 +:10370000309721F00680F781E02D099408952091EB +:103710006A0330916B038217930771F090936B03E8 +:1037200080936A03E0916E03F0916F03309721F06C +:103730000084F185E02D0994089508950C949D1B53 +:103740000E94DB270E94D20B0E9461280C94092D55 +:103750004F925F927F928F929F92AF92BF92CF9241 +:10376000DF92EF92FF920F931F93CF93DF93CDB72A +:10377000DEB72A970FB6F894DEBF0FBECDBF0E940A +:10378000AD0C91E7C92E93E0D92E00E010E0AA24F9 +:10379000A394B12C702E802F0E94E60D4C01F601EF +:1037A000419051906F014826592641145104B1F4BB +:1037B0000F5F1F4F0530110569F78FEF89838A83EB +:1037C0001B820E94E4278160782F9D838C8349812E +:1037D0005A816B818D810E94611C3AC08091C70320 +:1037E00081FD0E94EF0D20E030E07501022E02C045 +:1037F000EE0CFF1C0A94E2F7C70184219521892B66 +:1038000009F12E837F828E209F2091E0892809F480 +:1038100090E098870E94E4278160782F9A878987B3 +:103820004E815F8168858A850E94611C000F111F8F +:10383000F801EF58FC4F80819181E826F926F1824A +:10384000E08206C02F5F3F4F2C30310571F6B0CFBC +:103850000E94482A109170030E944F1B1817D9F03C +:103860000E944F1B809370032A960FB6F894DEBF18 +:103870000FBECDBFDF91CF911F910F91FF90EF90C1 +:10388000DF90CF90BF90AF909F908F907F905F9090 +:103890004F900C940A0B2A960FB6F894DEBF0FBE19 +:1038A000CDBFDF91CF911F910F91FF90EF90DF90EF +:1038B000CF90BF90AF909F908F907F905F904F90F0 +:1038C0000895CF93DF93CDB7DEB72B970FB6F8945B +:1038D000DEBF0FBECDBF4F83588769877A878B873E +:1038E000DE01119686E0FD0111928A95E9F785E0E7 +:1038F000FE01379601900D928A95E1F749815A8130 +:103900006B817C818D819E810E9406242B960FB64F +:10391000F894DEBF0FBECDBFDF91CF910895CF9356 +:10392000882309F4C2C0C82F823859F40E944F1B63 +:1039300081FDBBC089E30E94AF260E94322789E344 +:103940000CC0833879F40E944F1B80FDAEC083E524 +:103950000E94AF260E94322783E50E94CC26CF9199 +:103960000C943227843859F40E944F1B82FD9DC06D +:1039700087E40E94AF260E94322787E4EECF8CEFC7 +:103980008C0F813A48F48C2F0E94712C81118DC0CC +:103990008C2F0E94AF26E3CF80E28C0F883048F452 +:1039A000C77081E001C0880FCA95EAF70E94EB2634 +:1039B000D6CF8BE58C0F833078F4C53A29F0C63A20 +:1039C00031F083E890E005C081E890E002C082E831 +:1039D00090E0CF910C94711B88E58C0F833108F037 +:1039E00064C0C83A39F1C93A41F1CA3A49F1CB3A0F +:1039F00051F1CC3A59F1CD3A61F1C03B69F1CE3A7F +:103A000071F1CF3A79F1C13B81F1C23B89F1C33BFE +:103A100091F1C43B99F1C53BA1F1C63BA9F1C73B6C +:103A2000B1F1C83BB9F1C93BC1F1CA3BC9F180E072 +:103A300090E038C082EE90E035C089EE90E032C070 +:103A40008AEE90E02FC085EB90E02CC086EB90E0F2 +:103A500029C087EB90E026C08CEC90E023C08DEC71 +:103A600090E020C083E891E01DC08AE891E01AC090 +:103A700082E991E017C084E991E014C081E292E00C +:103A800011C083E292E00EC084E292E00BC085E2B6 +:103A900092E008C086E292E005C087E292E002C0B0 +:103AA0008AE292E0CF910C94871BCF9108958823EE +:103AB00009F44BC0823859F40E944F1B81FF45C066 +:103AC00089E30E94AF260E94322789E30CC0833825 +:103AD00071F40E944F1B80FF38C083E50E94AF261F +:103AE0000E94322783E50E94CC260C94322784382A +:103AF00059F40E944F1B82FF28C087E40E94AF2622 +:103B00000E94322787E4EFCF9CEF980F913A58F349 +:103B100090E2980F983050F4877091E001C0990FAF +:103B20008A95EAF7892F0E94F126DFCF9BE5980F4F +:103B3000933020F480E090E00C94711B885A83311C +:103B400020F480E090E00C94871B0895882321F0F6 +:103B50000E94EB260C9432270895882321F00E94BE +:103B6000F1260C9432270895BF92CF92DF92EF9204 +:103B7000FF920F931F93CF93DF9300D000D000D01C +:103B8000CDB7DEB725E0FC01DE01119601900D9264 +:103B90002A95E1F7FC01D0801181028125812295CF +:103BA0002F7043815481452B09F472C31F3F21F4C8 +:103BB000FFEFDF1609F46CC37C012E830E94D3074C +:103BC000D9821A8369817A81802F0E94AB26182FAF +:103BD000B92E0E9460260E9427252E81002319F00D +:103BE0000E9408272E81EB2DE295EF70F0E0E4595A +:103BF000FF4F0C9496318B2D807F9B2D9F70F92E5B +:103C0000882319F0F29480EFF822002389F0FF2036 +:103C100009F47CC280E2810F883020F48F2D0E944D +:103C2000EB2603C08F2D0E94FB260E9432276EC216 +:103C3000812F0E94571DFF2009F42AC3105E8F2D8B +:103C4000183018F40E94F12602C00E94012726961F +:103C50000FB6F894DEBF0FBECDBFDF91CF911F919D +:103C60000F91FF90EF90DF90CF90BF900C94322790 +:103C70008B2D807F9B2D9F70803211F4892F03C084 +:103C8000892F8295807F112319F0113011F12BC0FB +:103C90000023A9F0222389F1213079F526960FB669 +:103CA000F894DEBF0FBECDBFDF91CF911F910F9172 +:103CB000FF90EF90DF90CF90BF900C941B272223B2 +:103CC00019F0213009F4E4C28E830E941E278E81F0 +:103CD0009BC1002321F0263008F0DAC20EC0253047 +:103CE00008F0D6C291C10023C9F0222331F0F701B8 +:103CF000958190FF0BC29F70958326960FB6F8941E +:103D0000DEBF0FBECDBFDF91CF911F910F91FF900E +:103D1000EF90DF90CF90BF900C94A61D222309F462 +:103D200073C109C22B2D26952695237030E02115ED +:103D3000310521F021303105D1F0AAC2002321F054 +:103D4000812F9B2D937002C080E090E026960FB6E5 +:103D5000F894DEBF0FBECDBFDF91CF911F910F91C1 +:103D6000FF90EF90DF90CF90BF900C94711B0023D9 +:103D700021F0812F9B2D937002C080E090E0269669 +:103D80000FB6F894DEBF0FBECDBFDF91CF911F916C +:103D90000F91FF90EF90DF90CF90BF900C94871B16 +:103DA000812F002319F00E94502902C00E94B829D7 +:103DB00026960FB6F894DEBF0FBECDBFDF91CF9130 +:103DC0001F910F91FF90EF90DF90CF90BF900C94D8 +:103DD0003D2A8B2D837009F07BC0011159C2812FC0 +:103DE000829586958770880F880F912F9F70C92EB6 +:103DF000D12CE12CF12C082E04C0CC0CDD1CEE1CC7 +:103E0000FF1C0A94D2F714FF12C04FE050E060E0AC +:103E100070E004C0440F551F661F771F8A95D2F7C4 +:103E2000CB01BA01609570958095909503C060E0D4 +:103E300070E0CB012B2D269526952370422F50E064 +:103E400042305105D9F04330510569F16C297D2983 +:103E50008E299F294130510551F126960FB6F894CD +:103E6000DEBF0FBECDBFDF91CF911F910F91FF90AD +:103E7000EF90DF90CF90BF900C944E256C297D2958 +:103E80008E299F2926960FB6F894DEBF0FBECDBFB0 +:103E9000DF91CF911F910F91FF90EF90DF90CF9026 +:103EA000BF900C946A250E944E25C701B601269644 +:103EB0000FB6F894DEBF0FBECDBFDF91CF911F913B +:103EC0000F91FF90EF90DF90CF90BF900C94322530 +:103ED000002319F08B2D817001C08695882309F489 +:103EE000D7C1812F829586958770880F880F912F73 +:103EF0009F70C92ED12CE12CF12C082E04C0CC0CC3 +:103F0000DD1CEE1CFF1C0A94D2F714FF12C04FE018 +:103F100050E060E070E004C0440F551F661F771F3B +:103F20008A95D2F7CB01BA016095709580959095EE +:103F300003C060E070E0CB012B2D26952695237001 +:103F4000422F50E042305105D9F04330510569F11C +:103F50006C297D298E299F294130510551F12696E2 +:103F60000FB6F894DEBF0FBECDBFDF91CF911F918A +:103F70000F91FF90EF90DF90CF90BF900C94282688 +:103F80006C297D298E299F2926960FB6F894DEBFCD +:103F90000FBECDBFDF91CF911F910F91FF90EF909A +:103FA000DF90CF90BF900C9444260E942826C70132 +:103FB000B60126960FB6F894DEBF0FBECDBFDF91D7 +:103FC000CF911F910F91FF90EF90DF90CF90BF9016 +:103FD0000C940C26103F49F118F4103E48F491C09F +:103FE000123F09F453C0E8F1133F09F464C089C0DB +:103FF0001F708B2D8F71002321F00E94A525812F2A +:104000007CCE0E94C625812F26960FB6F894DEBF7F +:104010000FBECDBFDF91CF911F910F91FF90EF9019 +:10402000DF90CF90BF900C94AD1D0023B1F02530F0 +:1040300008F02EC18B2D8F7126960FB6F894DEBF37 +:104040000FBECDBFDF91CF911F910F91FF90EF90E9 +:10405000DF90CF90BF900C94EB25263008F018C16C +:10406000E9CF0023A9F08B2D8F7126960FB6F89417 +:10407000DEBF0FBECDBFDF91CF911F910F91FF909B +:10408000EF90DF90CF90BF900C94A525002359F3BB +:104090008B2D8F7126960FB6F894DEBF0FBECDBF65 +:1040A000DF91CF911F910F91FF90EF90DF90CF9014 +:1040B000BF900C94C625002399F08B2D8F71269606 :1040C0000FB6F894DEBF0FBECDBFDF91CF911F9129 -:1040D0000F91FF90EF90DF90CF90BF900C947525DB -:1040E0000023A9F0222309F4ADCF812F26960FB625 -:1040F000F894DEBF0FBECDBFDF91CF911F910F911E -:10410000FF90EF90DF90CF90BF900C947E1C222305 -:1041100009F4ADCF812F26960FB6F894DEBF0FBEFF -:10412000CDBFDF91CF911F910F91FF90EF90DF9066 -:10413000CF90BF900C94461D4B2D4F70612FC7013F -:104140000E942F0626960FB6F894DEBF0FBECDBF95 -:10415000DF91CF911F910F91FF90EF90DF90CF9063 -:10416000BF900C949924011182C09B2D9F70492F00 -:1041700050E04230510509F443C0C4F441155105E3 -:1041800071F14130510509F072C026960FB6F894CE -:10419000DEBF0FBECDBFDF91CF911F910F91FF907A -:1041A000EF90DF90CF90BF900C94202D43305105BD -:1041B000C1F14430510509F05AC0812F26960FB63F -:1041C000F894DEBF0FBECDBFDF91CF911F910F914D -:1041D000FF90EF90DF90CF90BF900C94722D2696B9 +:1040D0000F91FF90EF90DF90CF90BF900C949025C0 +:1040E00026960FB6F894DEBF0FBECDBFDF91CF91FD +:1040F0001F910F91FF90EF90DF90CF90BF900C94A5 +:1041000086250023A9F0222309F4ADCF812F26961E +:104110000FB6F894DEBF0FBECDBFDF91CF911F91D8 +:104120000F91FF90EF90DF90CF90BF900C948F1C79 +:10413000222309F4ADCF812F26960FB6F894DEBF67 +:104140000FBECDBFDF91CF911F910F91FF90EF90E8 +:10415000DF90CF90BF900C94571D4B2D4F70612F67 +:10416000C7010E940B0626960FB6F894DEBF0FBE5D +:10417000CDBFDF91CF911F910F91FF90EF90DF9016 +:10418000CF90BF900C94AA24011182C09B2D9F70E8 +:10419000492F50E04230510509F443C0C4F44115A1 +:1041A000510571F14130510509F072C026960FB6E4 +:1041B000F894DEBF0FBECDBFDF91CF911F910F915D +:1041C000FF90EF90DF90CF90BF900C94312D433053 +:1041D0005105C1F14430510509F05AC0812F26968E :1041E0000FB6F894DEBF0FBECDBFDF91CF911F9108 -:1041F0000F91FF90EF90DF90CF90BF900C94092D1E +:1041F0000F91FF90EF90DF90CF90BF900C94832DA4 :1042000026960FB6F894DEBF0FBECDBFDF91CF91DB :104210001F910F91FF90EF90DF90CF90BF900C9483 -:104220003C2D26960FB6F894DEBF0FBECDBFDF91B2 +:104220001A2D26960FB6F894DEBF0FBECDBFDF91D4 :10423000CF911F910F91FF90EF90DF90CF90BF90A3 -:104240000C944F2D4B2D4F70612FC70126960FB642 -:10425000F894DEBF0FBECDBFDF91CF911F910F91BC -:10426000FF90EF90DF90CF90BF900C94F9072696C7 +:104240000C944D2D26960FB6F894DEBF0FBECDBF51 +:10425000DF91CF911F910F91FF90EF90DF90CF9062 +:10426000BF900C94602D4B2D4F70612FC701269687 :104270000FB6F894DEBF0FBECDBFDF91CF911F9177 -:104280000F91FF90EF90DF90CF90BF9008950E9424 -:10429000F7260E9407270E94CC260E9421270E9411 -:1042A000DD2A0E942C2A80E090E00E94601B80E0C2 -:1042B00090E00C94761B0E94E7260C9447210E9404 -:1042C0008F26292F22952F7030E02C3031054CF4A9 -:1042D0002A3031056CF4225031092230310588F43E -:1042E00007C02C30310549F02F30310531F009C0BD -:1042F000803E48F0803F29F406C093FB882780F970 -:10430000089580E0089581E00895CF93DF9300D071 -:1043100000D01F92CDB7DEB70F900F900F900F9087 -:104320000F90DF91CF910895CF93DF9300D000D00D -:1043300000D0CDB7DEB726960FB6F894DEBF0FBE1D -:10434000CDBFDF91CF9108951F93CF93DF93C0919D -:104350002B0316E080912C03C81799F0D0E01C9F26 -:10436000F0011D9FF00D1124E35DFC4F4081518150 -:1043700062817381848195810E9494212196C77006 -:10438000E9CFDF91CF911F91089540915D03509146 -:104390005E0360915F03709160038091610390916F -:1043A00062030C9494218091620382958F7009F0CE -:1043B00054C080915F03882309F44FC080912B0380 -:1043C000A0912C0360915D0370915E0340916003A6 -:1043D00050916103B6E08A1709F43FC090E041159F -:1043E0005105C1F17F3F11F46F3FA1F1B89FF0017A -:1043F000B99FF00D1124E35DFC4F218172132AC097 -:104400002081621327C02281211124C0238134819D -:104410002417350710F421503109241B350B283C93 -:104420003105C0F4209162032F7020612093620354 -:1044300026E0289FF001299FF00D1124EE5CFC4F2F -:1044400080818F70806180838DE593E00E94A31D41 -:104450000C94A42101968770BECF0895CF92DF926D -:10446000EF92FF920F931F93CF93DF93CDB7DEB7F9 -:1044700062970FB6F894DEBF0FBECDBF8C0185E00A -:10448000F801DE011D9601900D928A95E1F7D801A1 -:104490004C9111965C91119712966C91129713960C -:1044A000CD90DC90149730915D0370915E03809104 -:1044B000600390916103009709F46BC17F3F19F489 -:1044C0003F3F09F466C1E0905F03EE2009F4C0C0ED -:1044D00020916203C816D90628F0F601E81BF90BF3 -:1044E000CF0104C0809590958C0D9D1DFF24F39401 -:1044F000883C910578F0F12C207F09F0C6C07C2D16 -:10450000D98AC88A89890E9485218DE593E00E9415 -:10451000A31DB1C0822F807F09F046C0751314C05F -:10452000341312C0611110C02F70206120936203F8 -:104530000E94C5218DE593E00E94A31D8091620336 -:10454000D80115968C932EC0CD2819F15F3F11F438 -:104550004F3FF9F0F62E61111CC080912B03209182 -:104560002C0336E0821709F45AC090E0389FF0011E -:10457000399FF00D1124E35DFC4F7181571306C084 -:104580007081471303C07281711103C00196877057 -:10459000E9CFF62E662309F418C180916203816089 -:1045A00080936203F12C11C1751308C0341306C047 -:1045B000611104C080916203D801C3C04D875E873A -:1045C0008D859E856A8B0E945F216A898823E1F12F -:1045D0006623D1F120916203822F82958F7090E043 -:1045E000029774F080915D0390915E0398878F83AA -:1045F0001986DB86CA862C87CE0107960E94A31DEA -:1046000086E0F801ADE5B3E001900D928A95E1F7FF -:104610000E94D3210E94C521FF24F394D6C04D8768 -:104620005E878D859E850E948F26292F22952F706B -:1046300030E0223031050CF0BCC09F7009F0B6C0EC -:10464000805E883008F4C1C0C8010E94A31DE4CF79 -:10465000C816D90608F453C0F601E81BF90BCF01C0 -:10466000883C910508F450C0F12C7C2DD98AC88A69 -:1046700089890E948521EDE5F3E086E0DF011D9246 -:104680008A95E9F70E94C521A0C0751314C03413A0 -:1046900012C0611110C080916203F8018583C801C6 -:1046A0000E94A31D86E0EDE5F3E0DF011D928A95EF -:1046B000E9F7FE2C8AC04D875E878D859E856A8BC3 -:1046C0000E945F216A89882309F4BECF662309F41A -:1046D000BBCF20916203822F82958F7090E002976A -:1046E0000CF48ECF80915D0390915E039A83898351 -:1046F0001B82DD82CC822E83CE0101967FCF8095F6 -:1047000090958C0D9D1DACCFF62E662309F49CCFA1 -:1047100075132EC034132CC02091620320FD1FC0DE -:10472000822F82958F70D9F0D80115962C9315970A -:104730008F3049F08F5F982F9295907F822F8F70E6 -:10474000892B15968C93C8010E94A31D86E0F80161 -:10475000ADE5B3E001900D928A95E1F793CF86E045 -:10476000F801ADE5B3E001900D928A95E1F72DC017 -:104770004D875E878D859E850E945F21811140CF88 -:1047800080916203816080936203C8010E94A31D2F -:104790001CC0662309F458CF4D875E878D859E85A2 -:1047A0000E945F21882309F44FCF2ACF811148CF7F -:1047B0000CC0243031050CF047CF9F7009F440CF76 -:1047C000F8019581907F09F03BCF8F2D62960FB64F -:1047D000F894DEBF0FBECDBFDF91CF911F910F9137 -:1047E000FF90EF90DF90CF9008951F93CF93DF93CA -:1047F000CDB7DEB72C970FB6F894DEBF0FBECDBF96 -:104800004F83588769877A878B879C87CE01079665 -:104810000E942E22882369F08F8198852A853B8506 -:10482000232BF1F19F3F09F063C08F3F09F060C077 -:1048300037C086E0FE013796DE01119601900D9299 -:104840008A95E1F76F817885EA85FB85309741F19C -:104850007F3F11F46F3F21F120912C0330E0C9011B -:1048600001968770992740912B0350E08417950794 -:1048700009F447C069837A83FD83EC8396E0929FB5 -:10488000D001939FB00D1124A35DBC4FFE01319662 -:1048900001900D929A95E1F780932C030E94A42138 -:1048A00016E080912B0390912C038917C1F1189F7A -:1048B000C0011124835D9C4F0E942E22882379F130 -:1048C000E0912B031E9FF0011124E35DFC4F40811A -:1048D000518162817381848195810E9494218091AC -:1048E0002B0390E001968770992780932B03D9CFF3 -:1048F0004F81588569857A858B859C850E94942196 -:10490000CFCF0E945B2110922C0310922B03EDE578 -:10491000F3E086E0DF011D928A95E9F7C1CF2C967E -:104920000FB6F894DEBF0FBECDBFDF91CF911F91C0 -:104930000895EF92FF920F931F93CF93DF938C0113 -:10494000009709F46CC0F12CEE24E394E801219661 -:10495000F8018491843740F4843008F051C08130EC -:1049600081F0823019F15BC0853709F444C0A8F1A9 -:104970009CE7980F903708F052C08F770E94461D31 -:1049800041C00E5F1F4FFE01C49180E28C0F883042 -:1049900048F4C7708E2D01C0880FCA95EAF70E94AF -:1049A000FA2614C08C2F0E947E1C2DC00E5F1F4F54 -:1049B000FE01C49180E28C0F883058F4C7708E2DB0 -:1049C00001C0880FCA95EAF70E9400270E9421279C -:1049D0001AC08C2F0E94461D16C00E5F1F4FFE018D -:1049E000C491CC2381F08FE99FE00197F1F700C0DB -:1049F0000000C150F6CF0E5F1F4FFE01F49003C0C0 -:104A00000E947E1C8E018F2D882309F49FCFEFE931 -:104A1000FFE03197F1F700C000008150F5CFDF9142 -:104A2000CF911F910F91FF90EF900895089560939B -:104A30006703709368038093690390936A030C94EF -:104A400047210F931F9300916703109168032091F2 -:104A5000690330916A03DC01CB01802B912BA22BDF -:104A6000B32B8093670390936803A0936903B0937B -:104A70006A031F910F910C9447210F931F9300918C -:104A80006703109168032091690330916A03DC0188 -:104A9000CB0180239123A223B323809367039093B8 -:104AA0006803A0936903B0936A031F910F910C945C -:104AB00047210F931F930091670310916803209182 -:104AC000690330916A03DC01CB0180279127A2277B -:104AD000B3278093670390936803A0936903B0930F -:104AE0006A031F910F910C94472110926303109257 -:104AF000640310926503109266030C94472141E011 -:104B000050E060E070E004C0440F551F661F771F3F -:104B10008A95D2F7409363035093640360936503CF -:104B2000709366030C94472141E050E060E070E030 -:104B300004C0440F551F661F771F8A95D2F78091D6 -:104B4000630390916403A0916503B0916603482BC1 -:104B5000592B6A2B7B2B4093630350936403609320 -:104B60006503709366030C94472141E050E060E0D8 -:104B700070E004C0440F551F661F771F8A95D2F757 -:104B80004095509560957095809163039091640372 -:104B9000A0916503B0916603482359236A237B23C0 -:104BA00040936303509364036093650370936603BB -:104BB0000C94472141E050E060E070E004C0440FF5 -:104BC000551F661F771F8A95D2F7809163039091D6 -:104BD0006403A0916503B0916603482759276A27AB -:104BE0007B27409363035093640360936503709342 -:104BF00066030C9447210F931F9300916303109158 -:104C000064032091650330916603DC01CB01802BA6 -:104C1000912BA22BB32B8093630390936403A093F7 -:104C20006503B09366031F910F910C9447210F9376 -:104C30001F930091630310916403209165033091E9 -:104C40006603DC01CB0180239123A223B32380934D -:104C5000630390936403A0936503B09366031F916D -:104C60000F910C9447210F931F93009163031091B0 -:104C700064032091650330916603DC01CB0180273A -:104C80009127A227B3278093630390936403A09393 -:104C90006503B09366031F910F910C94472108950B -:104CA000CF92DF92EF92FF920F931F93CF93DF93F8 -:104CB0008C01C0906703D0906803E0906903F09086 -:104CC0006A038091630390916403A0916503B0919E -:104CD0006603C82AD92AEA2AFB2ACFE1D0E0D70105 -:104CE000C6010C2E04C0B695A795979587950A9492 -:104CF000D2F780FF06C0B8018C2F0E94530A01979B -:104D000021F4219760F780E001C08C2FDF91CF91D3 -:104D10001F910F91FF90EF90DF90CF900895CF9368 -:104D2000DF93EC010E945026BE010E94530ADF91DE -:104D3000CF910895CB010E948F26089520911F02E4 -:104D400030912002F90132969FEF40E051915817BF -:104D500089F09F3F19F4511101C0942F4F5F4630E5 -:104D6000A9F79F3F39F0F901E90FF11D97FDFA9579 -:104D700082830895089520911F0230912002F90145 -:104D80003296285F3F4F9081981301C01082319670 -:104D9000E217F307C1F7089581E090E0E0911F0268 -:104DA000F0912002E80FF91F1082019688309105DA -:104DB000A9F7089590917603892B8093760308953F -:104DC00080959091760389238093760308951092BD -:104DD0007603089590917503892B80937503089548 -:104DE000809590917503892380937503089510929F -:104DF0007503089590917403892B8093740308952B -:104E00008095909174038923809374030895109280 -:104E10007403089580936B03089510926B030895B3 -:104E200080911F0290912002FC0131969C01285F25 -:104E30003F4F80E0919191118F5FE217F307D1F717 -:104E40000895E0911F02F091200280917603808303 -:104E5000E0911F02F0912002908180917503892BCF -:104E60008083E0911F02F091200290818091740371 -:104E7000892B808380916B03882361F0E0911F026E -:104E8000F09120029081892B80830E94102781114C -:104E900010926B0380911F02909120020C944A1B88 -:104EA00080919803843039F11092780320E488E1EE -:104EB00090E00FB6F894A895809360000FBE209301 -:104EC000600080E00E94F60580E00E942E0B83B710 -:104ED000817F846083BF83B7816083BF7894889526 -:104EE00083B78E7F83BF88E10FB6F894809360000C -:104EF000109260000FBE089508950895CF9380E04A -:104F00000E94F6050E947C270E94D10C0E947D27FA -:104F1000C0E08C2F0E940A0E892B29F4CF5FC53088 -:104F2000C1F780E001C081E0CF9108950E945B212C -:104F300080E00E94F6050E94F82C0E943E1B0C9413 -:104F40002E0B1F920F920FB60F9211248F939F93E7 -:104F5000AF93BF9380917803811113C0809179033F -:104F600090917A03A0917B03B0917C034196A11D9F -:104F7000B11D8093790390937A03A0937B03B09340 -:104F80007C03BF91AF919F918F910F900FBE0F90B7 -:104F90001F90189582E084BD93E095BD9AEF97BD70 -:104FA00080936E0008952FB7F894809179039091C3 -:104FB0007A03A0917B03B0917C032FBF0895CF9219 -:104FC000DF92EF92FF920F931F932FB7F8944091C7 -:104FD000790350917A0360917B0370917C032FBF1A -:104FE0006A017B01EE24FF248C0120E030E0C01632 -:104FF000D106E206F30610F4415051099A01281B2C -:10500000390BC9011F910F91FF90EF90DF90CF9066 -:1050100008951F920F920FB60F9211248F939F93B2 -:10502000AF93BF938091790390917A03A0917B0312 -:10503000B0917C030196A11DB11D809379039093DB -:105040007A03A0937B03B0937C03BF91AF919F91B0 -:105050008F910F900FBE0F901F9018950E943B18D4 -:10506000F8942FEF87EA91E6215080409040E1F7D5 -:1050700000C0000087E090EBDC018093A3039093D5 -:10508000A403A093A503B093A6039CE088E10FB608 -:10509000F894A895809360000FBE90936000FFCFB6 -:1050A0000E948A28811102C00E9466280E949528C9 -:1050B000809377030E94A2288093A1030E949928DD -:1050C000682F70E080E090E00C9417256DEE7EEF85 -:1050D00080E090E00E945D3160E082E090E00E941C -:1050E0004B3160E083E090E00E944B3160E084E06F -:1050F00090E00E944B3160E085E090E00E944B31EF -:1051000060E086E090E00E944B316FEF87E090E036 -:105110000C944B3180E090E00E94453121E08D3EBF -:105120009E4F09F020E0822F089582E090E00C94D9 -:105130003D3183E090E00C943D31682F83E090E0B6 -:105140000C944B3184E090E00C943D31682F84E066 -:1051500090E00C944B3186E090E00C943D31682F48 -:1051600086E090E00C944B3187E090E00C943D3168 -:10517000682F87E090E00C944B3180917F0380FF93 -:105180000BC06091240285E0689FB00111247595E1 -:105190006795759567952BC081FF09C060912402C2 -:1051A00085E0689FB00111247595679520C082FF46 -:1051B00007C06091240285E0689FB001112417C0E8 -:1051C000909180039923D1F060912302961788F77C -:1051D0002091240285E0289F90011124929FA00134 -:1051E000939F500D112470E0CA010E942331603852 -:1051F000710540F46115710539F002C065E070E099 -:10520000862F08958FE7089581E0089580917F03A8 -:1052100080FF08C06091220270E0759567957595D2 -:10522000679521C081FF06C06091220270E07595EC -:10523000679519C082FF04C06091220270E010C01F -:10524000909180039923C1F0609121029617A0F7F5 -:1052500080912202899FC001112470E00E942331B5 -:105260006038710528F46115710521F0862F0895C5 -:105270008FE7089581E0089561E070E0F4CF803F0A -:1052800021F40E94BD28819504C0813F29F40E9429 -:10529000BD28809383030895823F21F40E94BD2896 -:1052A000819504C0833F29F40E94BD288093820326 -:1052B0000895893F19F40E94062905C08A3F31F4F8 -:1052C0000E94062981958093840308958B3F21F4E1 -:1052D0000E940629819504C08C3F29F40E9406296A -:1052E000809385030895843F21F480918103816038 -:1052F00017C0853F21F480918103826011C0863FF1 -:1053000021F48091810384600BC0873F21F4809158 -:105310008103886005C0883F31F4809181038061FA -:105320008093810308958D3F21F480917F038160F4 -:105330000BC08E3F21F480917F03826005C08F3FB8 -:1053400029F480917F03846080937F030895803FD8 -:1053500039F48091830387FF6CC01092830369C086 -:10536000813F29F4809183031816BCF362C09091A9 -:105370008203823F29F497FF5CC01092820359C0D8 -:10538000833F19F41916CCF354C0893F41F480913E -:10539000840318160CF04DC0109284034AC08A3F53 -:1053A00029F48091840387FF44C0F6CF8B3F39F402 -:1053B0008091850387FF3DC0109285033AC08C3FE2 -:1053C00029F4809185031816BCF333C0843F21F47F -:1053D000809181038E7F17C0853F21F480918103E6 -:1053E0008D7F11C0863F21F4809181038B7F0BC09C -:1053F000873F21F480918103877F05C0883F31F486 -:10540000809181038F7E8093810313C08D3F21F4AF -:1054100080917F038E7F0BC08E3F21F480917F03AC -:105420008D7F05C08F3F29F480917F038B7F809310 -:105430007F038091820381110EC0809183038111CB -:105440000AC080918403811106C080918503811177 -:1054500002C010928003089581E893E00E94551BDA -:105460000E94D32790937E0380937D0308951F931A -:10547000CF93DF9380917D0390917E030E94DF277D -:10548000AC0190918003992321F02091250230E016 -:1054900006C0209126028AE0289F9001112442171D -:1054A000530708F486C080918203C0918303D09192 -:1054B000840310918503811107C0C11176C0D111F9 -:1054C00074C0111172C075C09F3F19F09F5F909317 -:1054D0008003181624F40E94BD28809382038091D3 -:1054E000820387FF05C00E94BD28819580938203B7 -:1054F0001C1624F40E94BD288093830380918303AB -:1055000087FF05C00E94BD28819580938303609129 -:105510008203662339F1C0918303CC2319F17727E5 -:1055200067FD7095872F972F0E94932E23E333E317 -:1055300043E35FE30E94472F0E94602E6093820343 -:105540006C2F772767FD7095872F972F0E94932EDA -:1055500023E333E343E35FE30E94472F0E94602E7F -:10556000609383031D1624F40E940629809384030C -:105570008091840387FF05C00E940629819580934E -:105580008403111624F40E940629809385038091D8 -:10559000850387FF05C00E940629819580938503B6 -:1055A000DF91CF911F910C942C2A9F3F09F08ECF51 -:1055B00096CFDF91CF911F910895E1E8F3E085E068 -:1055C000DF011D928A95E9F71092800310927F0304 -:1055D0000895833081F128F4813059F08230D1F080 -:1055E0000895853009F449C0B8F1863009F456C0F1 -:1055F000089580912602262F30E0280F311D2F3F7D -:10560000310524F4680F6093260208958FEF80938C -:105610002602089580912502262F30E0280F311DA3 -:105620002F3F310524F4680F6093250208958FEF12 -:1056300080932502089580912402262F30E0280FC0 -:10564000311D2F3F310524F4680F60932402089523 -:105650008FEF80932402089580912302262F30E05B -:10566000280F311D2F3F310524F4680F609323026A -:1056700008958FEF80932302089580912202262FB0 +:104280000F91FF90EF90DF90CF90BF900C94D507E7 +:1042900026960FB6F894DEBF0FBECDBFDF91CF914B +:1042A0001F910F91FF90EF90DF90CF90BF900895F6 +:1042B0000E9408270E9418270E94DD260E943227AC +:1042C0000E94EE2A0E943D2A80E090E00E94711B2D +:1042D00080E090E00C94871B0E94F8260C945821F3 +:1042E0000E94A026292F22952F7030E02C30310516 +:1042F0004CF42A3031056CF422503109223031055A +:1043000088F407C02C30310549F02F30310531F0E9 +:1043100009C0803E48F0803F29F406C093FB8827FF +:1043200080F9089580E0089581E00895CF93DF93A8 +:1043300000D000D01F92CDB7DEB70F900F900F9036 +:104340000F900F90DF91CF910895CF93DF9300D01E +:1043500000D000D0CDB7DEB726960FB6F894DEBFFA +:104360000FBECDBFDF91CF9108951F93CF93DF9301 +:10437000C0917B0316E080917C03C81799F0D0E0D0 +:104380001C9FF0011D9FF00D1124E358FC4F40814C +:10439000518162817381848195810E94A52121963A +:1043A000C770E9CFDF91CF911F9108954091AD0380 +:1043B0005091AE036091AF037091B0038091B1034F +:1043C0009091B2030C94A5218091B20382958F70D5 +:1043D00009F054C08091AF03882309F44FC0809145 +:1043E0007B03A0917C036091AD037091AE0340917B +:1043F000B0035091B103B6E08A1709F43FC090E0D2 +:1044000041155105C1F17F3F11F46F3FA1F1B89FF4 +:10441000F001B99FF00D1124E358FC4F2181721374 +:104420002AC02081621327C02281211124C0238148 +:1044300034812417350710F421503109241B350B22 +:10444000283C3105C0F42091B2032F7020612093E5 +:10445000B20326E0289FF001299FF00D1124EE57AA +:10446000FC4F80818F70806180838DEA93E00E9491 +:10447000B41D0C94B52101968770BECF0895CF92DC +:10448000DF92EF92FF920F931F93CF93DF93CDB7FD +:10449000DEB762970FB6F894DEBF0FBECDBF8C01BA +:1044A00085E0F801DE011D9601900D928A95E1F7F5 +:1044B000D8014C9111965C91119712966C911297BC +:1044C0001396CD90DC9014973091AD037091AE03AC +:1044D0008091B0039091B103009709F46BC17F3FC5 +:1044E00019F43F3F09F466C1E090AF03EE2009F4F0 +:1044F000C0C02091B203C816D90628F0F601E81B07 +:10450000F90BCF0104C0809590958C0D9D1DFF2463 +:10451000F394883C910578F0F12C207F09F0C6C017 +:104520007C2DD98AC88A89890E9496218DEA93E0D8 +:104530000E94B41DB1C0822F807F09F046C0751360 +:1045400014C0341312C0611110C02F702061209369 +:10455000B2030E94D6218DEA93E00E94B41D80919F +:10456000B203D80115968C932EC0CD2819F15F3F68 +:1045700011F44F3FF9F0F62E61111CC080917B03BE +:1045800020917C0336E0821709F45AC090E0389FEE +:10459000F001399FF00D1124E358FC4F718157133E +:1045A00006C07081471303C07281711103C0019668 +:1045B0008770E9CFF62E662309F418C18091B20303 +:1045C00081608093B203F12C11C1751308C03413BC +:1045D00006C0611104C08091B203D801C3C04D87E9 +:1045E0005E878D859E856A8B0E9470216A898823EB +:1045F000E1F16623D1F12091B203822F82958F7071 +:1046000090E0029774F08091AD039091AE0398878B +:104610008F831986DB86CA862C87CE0107960E9477 +:10462000B41D86E0F801ADEAB3E001900D928A95E1 +:10463000E1F70E94E4210E94D621FF24F394D6C022 +:104640004D875E878D859E850E94A026292F229505 +:104650002F7030E0223031050CF0BCC09F7009F0A3 +:10466000B6C0805E883008F4C1C0C8010E94B41D85 +:10467000E4CFC816D90608F453C0F601E81BF90BBD +:10468000CF01883C910508F450C0F12C7C2DD98ACB +:10469000C88A89890E949621EDEAF3E086E0DF016D +:1046A0001D928A95E9F70E94D621A0C0751314C007 +:1046B000341312C0611110C08091B203F8018583D8 +:1046C000C8010E94B41D86E0EDEAF3E0DF011D920F +:1046D0008A95E9F7FE2C8AC04D875E878D859E8579 +:1046E0006A8B0E9470216A89882309F4BECF6623F1 +:1046F00009F4BBCF2091B203822F82958F7090E096 +:1047000002970CF48ECF8091AD039091AE039A8303 +:1047100089831B82DD82CC822E83CE0101967FCFDE +:10472000809590958C0D9D1DACCFF62E662309F4D7 +:104730009CCF75132EC034132CC02091B20320FDE2 +:104740001FC0822F82958F70D9F0D80115962C93B7 +:1047500015978F3049F08F5F982F9295907F822F19 +:104760008F70892B15968C93C8010E94B41D86E02A +:10477000F801ADEAB3E001900D928A95E1F793CF8D +:1047800086E0F801ADEAB3E001900D928A95E1F779 +:104790002DC04D875E878D859E850E947021811179 +:1047A00040CF8091B20381608093B203C8010E9420 +:1047B000B41D1CC0662309F458CF4D875E878D85D4 +:1047C0009E850E947021882309F44FCF2ACF811142 +:1047D00048CF0CC0243031050CF047CF9F7009F44E +:1047E00040CFF8019581907F09F03BCF8F2D6296E5 +:1047F0000FB6F894DEBF0FBECDBFDF91CF911F91F2 +:104800000F91FF90EF90DF90CF9008951F93CF937B +:10481000DF93CDB7DEB72C970FB6F894DEBF0FBE8F +:10482000CDBF4F83588769877A878B879C87CE0156 +:1048300007960E943F22882369F08F8198852A85F8 +:104840003B85232BF1F19F3F09F063C08F3F09F0B7 +:1048500060C037C086E0FE013796DE0111960190F8 +:104860000D928A95E1F76F817885EA85FB8530970F +:1048700041F17F3F11F46F3F21F120917C0330E043 +:10488000C90101968770992740917B0350E08417F6 +:10489000950709F447C069837A83FD83EC8396E02A +:1048A000929FD001939FB00D1124A358BC4FFE01DD +:1048B000319601900D929A95E1F780937C030E94C6 +:1048C000B52116E080917B0390917C038917C1F19B +:1048D000189FC001112483589C4F0E943F228823B7 +:1048E00079F1E0917B031E9FF0011124E358FC4F06 +:1048F0004081518162817381848195810E94A521CB +:1049000080917B0390E001968770992780937B03C9 +:10491000D9CF4F81588569857A858B859C850E9482 +:10492000A521CFCF0E946C2110927C0310927B03B3 +:10493000EDEAF3E086E0DF011D928A95E9F7C1CF49 +:104940002C960FB6F894DEBF0FBECDBFDF91CF918E +:104950001F910895EF92FF920F931F93CF93DF93D0 +:104960008C01009709F46CC0F12CEE24E394E8016B +:104970002196F8018491843740F4843008F051C0C6 +:10498000813081F0823019F15BC0853709F444C071 +:10499000A8F19CE7980F903708F052C08F770E94DB +:1049A000571D41C00E5F1F4FFE01C49180E28C0F66 +:1049B000883048F4C7708E2D01C0880FCA95EAF779 +:1049C0000E940B2714C08C2F0E948F1C2DC00E5FDD +:1049D0001F4FFE01C49180E28C0F883058F4C770DD +:1049E0008E2D01C0880FCA95EAF70E9411270E94F8 +:1049F00032271AC08C2F0E94571D16C00E5F1F4F02 +:104A0000FE01C491CC2381F08FE99FE00197F1F77B +:104A100000C00000C150F6CF0E5F1F4FFE01F490A2 +:104A200003C00E948F1C8E018F2D882309F49FCF15 +:104A3000EFE9FFE03197F1F700C000008150F5CFBA +:104A4000DF91CF911F910F91FF90EF9008950895FE +:104A50006093B7037093B8038093B9039093BA033C +:104A60000C9458210F931F930091B7031091B80332 +:104A70002091B9033091BA03DC01CB01802B912B3B +:104A8000A22BB32B8093B7039093B803A093B903E1 +:104A9000B093BA031F910F910C9458210F931F9359 +:104AA0000091B7031091B8032091B9033091BA0374 +:104AB000DC01CB0180239123A223B3238093B7038E +:104AC0009093B803A093B903B093BA031F910F91C9 +:104AD0000C9458210F931F930091B7031091B803C2 +:104AE0002091B9033091BA03DC01CB0180279127D3 +:104AF000A227B3278093B7039093B803A093B90379 +:104B0000B093BA031F910F910C9458211092B303E4 +:104B10001092B4031092B5031092B6030C9458216E +:104B200041E050E060E070E004C0440F551F661F94 +:104B3000771F8A95D2F74093B3035093B4036093E1 +:104B4000B5037093B6030C94582141E050E060E047 +:104B500070E004C0440F551F661F771F8A95D2F777 +:104B60008091B3039091B403A091B503B091B603C3 +:104B7000482B592B6A2B7B2B4093B3035093B403E0 +:104B80006093B5037093B6030C94582141E050E054 +:104B900060E070E004C0440F551F661F771F8A95C0 +:104BA000D2F740955095609570958091B3039091A0 +:104BB000B403A091B503B091B603482359236A23E7 +:104BC0007B234093B3035093B4036093B503709376 +:104BD000B6030C94582141E050E060E070E004C05E +:104BE000440F551F661F771F8A95D2F78091B30334 +:104BF0009091B403A091B503B091B603482759270B +:104C00006A277B274093B3035093B4036093B503A3 +:104C10007093B6030C9458210F931F930091B30324 +:104C20001091B4032091B5033091B603DC01CB01A0 +:104C3000802B912BA22BB32B8093B3039093B403BF +:104C4000A093B503B093B6031F910F910C94582114 +:104C50000F931F930091B3031091B4032091B503F8 +:104C60003091B603DC01CB0180239123A223B3232F +:104C70008093B3039093B403A093B503B093B603AA +:104C80001F910F910C9458210F931F930091B30320 +:104C90001091B4032091B5033091B603DC01CB0130 +:104CA00080279127A227B3278093B3039093B4035F +:104CB000A093B503B093B6031F910F910C945821A4 +:104CC0000895CF92DF92EF92FF920F931F93CF93AD +:104CD000DF938C01C090B703D090B803E090B90384 +:104CE000F090BA038091B3039091B403A091B503FF +:104CF000B091B603C82AD92AEA2AFB2ACFE1D0E02C +:104D0000D701C6010C2E04C0B695A7959795879537 +:104D10000A94D2F780FF06C0B8018C2F0E942F0A98 +:104D2000019721F4219760F780E001C08C2FDF917B +:104D3000CF911F910F91FF90EF90DF90CF9008954A +:104D4000CF93DF93EC010E946126BE010E942F0ADF +:104D5000DF91CF910895CB010E94A0260895209164 +:104D60001D0230911E02F90132969FEF40E05191F1 +:104D7000581789F09F3F19F4511101C0942F4F5FCC +:104D80004630A9F79F3F39F0F901E90FF11D97FD72 +:104D9000FA9582830895089520911D0230911E0294 +:104DA000F9013296285F3F4F9081981301C010821D +:104DB0003196E217F307C1F7089581E090E0E091A2 +:104DC0001D02F0911E02E80FF91F10820196883033 +:104DD0009105A9F708959091C603892B8093C60386 +:104DE000089580959091C60389238093C603089502 +:104DF0001092C60308959091C503892B8093C50333 +:104E0000089580959091C50389238093C5030895E3 +:104E10001092C50308959091C403892B8093C40315 +:104E2000089580959091C40389238093C4030895C5 +:104E30001092C40308958093BB0308951092BB039E +:104E4000089580911D0290911E02FC0131969C01F3 +:104E5000285F3F4F80E0919191118F5FE217F30738 +:104E6000D1F70895E0911D02F0911E028091C603D2 +:104E70008083E0911D02F0911E0290818091C50314 +:104E8000892B8083E0911D02F0911E029081809118 +:104E9000C403892B80838091BB03882361F0E09158 +:104EA0001D02F0911E029081892B80830E94212790 +:104EB00081111092BB0380911D0290911E020C94EF +:104EC0005B1B8091E803843039F11092C80320E421 +:104ED00088E190E00FB6F894A895809360000FBE2B +:104EE0002093600080E00E94D20580E00E940A0BBF +:104EF00083B7817F846083BF83B7816083BF7894E9 +:104F0000889583B78E7F83BF88E10FB6F89480932E +:104F10006000109260000FBE089508950895CF9329 +:104F200080E00E94D2050E948D270E94AD0C0E9455 +:104F30008E27C0E08C2F0E94E60D892B29F4CF5FCD +:104F4000C530C1F780E001C081E0CF9108950E9493 +:104F50006C2180E00E94D2050E94092D0E944F1B07 +:104F60000C940A0B1F920F920FB60F9211248F937D +:104F70009F93AF93BF938091C803811113C0809119 +:104F8000C9039091CA03A091CB03B091CC03419681 +:104F9000A11DB11D8093C9039093CA03A093CB03B5 +:104FA000B093CC03BF91AF919F918F910F900FBEA3 +:104FB0000F901F90189582E084BD93E095BD9AEF05 +:104FC00097BD80936E0008952FB7F8948091C90320 +:104FD0009091CA03A091CB03B091CC032FBF089549 +:104FE000CF92DF92EF92FF920F931F932FB7F89417 +:104FF0004091C9035091CA036091CB037091CC03D7 +:105000002FBF6A017B01EE24FF248C0120E030E0F9 +:10501000C016D106E206F30610F4415051099A0178 +:10502000281B390BC9011F910F91FF90EF90DF9062 +:10503000CF9008951F920F920FB60F9211248F9365 +:105040009F93AF93BF938091C9039091CA03A0919E +:10505000CB03B091CC030196A11DB11D8093C90370 +:105060009093CA03A093CB03B093CC03BF91AF91AD +:105070009F918F910F900FBE0F901F9018950E94D7 +:105080004C18F8942FEF87EA91E621508040904029 +:10509000E1F700C0000087E090EBDC018093F303B0 +:1050A0009093F403A093F503B093F6039CE088E19A +:1050B0000FB6F894A895809360000FBE909360009F +:1050C000FFCF0E949B28811102C00E9477280E9476 +:1050D000A6288093C7030E94B3288093F1030E94FF +:1050E000AA28682F70E080E090E00C9428256DEEEF +:1050F0007EEF80E090E00E94BC3160E082E090E0D2 +:105100000E94AA3160E083E090E00E94AA3160E052 +:1051100084E090E00E94AA3160E085E090E00E9487 +:10512000AA3160E086E090E00E94AA316FEF87E04C +:1051300090E00C94AA3180E090E00E94A43121E03C +:105140008D3E9E4F09F020E0822F089582E090E08E +:105150000C949C3183E090E00C949C31682F83E0A8 +:1051600090E00C94AA3184E090E00C949C31682F7C +:1051700084E090E00C94AA3186E090E00C949C319D +:10518000682F86E090E00C94AA3187E090E00C94C0 +:105190009C31682F87E090E00C94AA318091CF0376 +:1051A00080FF0BC06091220285E0689FB00111244E +:1051B00075956795759567952BC081FF09C06091BE +:1051C000220285E0689FB00111247595679520C083 +:1051D00082FF07C06091220285E0689FB001112420 +:1051E00017C09091D0039923D1F0609121029617B6 +:1051F00088F72091220285E0289F90011124929F38 +:10520000A001939F500D112470E0CA010E948231C9 +:105210006038710540F46115710539F002C065E030 +:1052200070E0862F08958FE7089581E008958091BA +:10523000CF0380FF08C06091200270E075956795EC +:105240007595679521C081FF06C06091200270E0CE +:105250007595679519C082FF04C06091200270E0C7 +:1052600010C09091D0039923C1F060911F0296174E +:10527000A0F780912002899FC001112470E00E9454 +:1052800082316038710528F46115710521F0862F8F +:1052900008958FE7089581E0089561E070E0F4CF0C +:1052A000803F21F40E94CE28819504C0813F29F4DB +:1052B0000E94CE288093D3030895823F21F40E9458 +:1052C000CE28819504C0833F29F40E94CE28809384 +:1052D000D2030895893F19F40E94172905C08A3F17 +:1052E00031F40E94172981958093D40308958B3F50 +:1052F00021F40E941729819504C08C3F29F40E9453 +:1053000017298093D5030895843F21F48091D10318 +:10531000816017C0853F21F48091D103826011C064 +:10532000863F21F48091D10384600BC0873F21F434 +:105330008091D103886005C0883F31F48091D1030A +:1053400080618093D10308958D3F21F48091CF0334 +:1053500081600BC08E3F21F48091CF03826005C035 +:105360008F3F29F48091CF0384608093CF03089509 +:10537000803F39F48091D30387FF6CC01092D30330 +:1053800069C0813F29F48091D3031816BCF362C031 +:105390009091D203823F29F497FF5CC01092D20310 +:1053A00059C0833F19F41916CCF354C0893F41F416 +:1053B0008091D40318160CF04DC01092D4034AC04B +:1053C0008A3F29F48091D40387FF44C0F6CF8B3FF6 +:1053D00039F48091D50387FF3DC01092D5033AC0C0 +:1053E0008C3F29F48091D5031816BCF333C0843F59 +:1053F00021F48091D1038E7F17C0853F21F48091E5 +:10540000D1038D7F11C0863F21F48091D1038B7F22 +:105410000BC0873F21F48091D103877F05C0883F6F +:1054200031F48091D1038F7E8093D10313C08D3FDF +:1054300021F48091CF038E7F0BC08E3F21F48091A9 +:10544000CF038D7F05C08F3F29F48091CF038B7FE1 +:105450008093CF038091D20381110EC08091D3033A +:1054600081110AC08091D403811106C08091D503B7 +:10547000811102C01092D003089581ED93E00E9443 +:10548000661B0E94E4279093CE038093CD0308957A +:105490001F93CF93DF938091CD039091CE030E9411 +:1054A000F027AC019091D003992321F020912302A1 +:1054B00030E006C0209124028AE0289F9001112448 +:1054C0004217530708F486C08091D203C091D303DA +:1054D000D091D4031091D503811107C0C11176C0BA +:1054E000D11174C0111172C075C09F3F19F09F5F38 +:1054F0009093D003181624F40E94CE288093D203F0 +:105500008091D20387FF05C00E94CE2881958093A9 +:10551000D2031C1624F40E94CE288093D3038091DA +:10552000D30387FF05C00E94CE2881958093D303C3 +:105530006091D203662339F1C091D303CC2319F1D2 +:10554000772767FD7095872F972F0E94A42E23E35E +:1055500033E343E35FE30E94B42F0E94712E609314 +:10556000D2036C2F772767FD7095872F972F0E94A6 +:10557000A42E23E333E343E35FE30E94B42F0E94AE +:10558000712E6093D3031D1624F40E941729809373 +:10559000D4038091D40387FF05C00E941729819509 +:1055A0008093D403111624F40E9417298093D50305 +:1055B0008091D50387FF05C00E94172981958093AC +:1055C000D503DF91CF911F910C943D2A9F3F09F0A5 +:1055D0008ECF96CFDF91CF911F910895E1EDF3E04B +:1055E00085E0DF011D928A95E9F71092D0031092B1 +:1055F000CF030895833081F128F4813059F082304F +:10560000D1F00895853009F449C0B8F1863009F425 +:1056100056C0089580912402262F30E0280F311DB6 +:105620002F3F310524F4680F6093240208958FEF13 +:1056300080932402089580912302262F30E0280FC2 +:10564000311D2F3F310524F4680F60932302089524 +:105650008FEF80932302089580912202262F30E05D +:10566000280F311D2F3F310524F4680F609322026B +:1056700008958FEF80932202089580912102262FB2 :1056800030E0280F311D2F3F310524F4680F60935F -:10569000220208958FEF80932202089580912102C3 +:10569000210208958FEF80932102089580912002C6 :1056A000262F30E0280F311D2F3F310524F4680FDD -:1056B0006093210208958FEF809321020895833033 -:1056C00011F128F4813049F0823091F0089585304D -:1056D00081F120F18630C1F108958091260268178A -:1056E00020F4861B809326020895109226020895C6 -:1056F00080912502681720F4861B80932502089567 -:1057000010922502089580912402681720F4861BC8 -:105710008093240208951092240208958091230218 -:10572000681720F4861B80932302089510922302A9 -:10573000089580912202681720F4861B809322022C -:10574000089510922202089580912102681720F492 -:10575000861B8093210208951092210208950F93D1 -:105760001F938732D8F58E3108F087C08E3009F448 -:1057700071C098F4873009F45BC08B3009F491C094 -:10578000863009F095C080917703817F8E7F80936A -:10579000770381E0809387038CC0863109F481C050 -:1057A00068F4803109F084C08091770383FB22275D -:1057B00020F991E0922790FB83F955C0893109F4D3 -:1057C00070C08B3109F074C08091770381FB222770 -:1057D00020F991E0922790FB81F945C0883309F4C4 -:1057E00060C050F4893209F45EC0853309F45BC0AF -:1057F000873209F458C05CC0833409F454C028F4DB -:105800008A3308F455C0895339C0883409F050C030 -:105810000E945B210E94D6070FEF13ED20E3015099 -:1058200010402040E1F700C000000E942E2839C03F -:1058300090917703892F8095817080FB90F929F0F2 -:10584000966098609093770334C0997F977F909388 -:10585000770327C08091770382FB222720F991E00C -:10586000922790FB82F9809377039923D1F080915E -:10587000770381608093770314C08D5141E050E03D -:1058800060E070E08A019B0104C0000F111F221F1D -:10589000331F8A95D2F7C901B8010E9417250E94CB -:1058A0005B2181E006C061E070E080E090E0F5CF30 -:1058B00080E01F910F91089580E0089580E00895A1 -:1058C000CF93C82F80918703813069F018F0823020 -:1058D000C9F184C0E0911F02F091200280818232E0 -:1058E00009F07EC007C0E0911F02F0912002808184 -:1058F000823261F48C2F0E945C2C811104C08C2FA9 -:105900000E94AF2B1DC081E090E01AC08C2F0E9436 -:105910005E2C811114C0C43179F048F4CB3079F099 -:10592000C03109F061C082E08093870308C0C932AA -:1059300019F0C83321F058C01092870355C081E098 -:10594000817054C0C93291F120F5C43179F1B0F4BD -:10595000C73009F047C08EE18093260282E380932E -:1059600025028AE08093240284E18093230288E068 -:105970008093220288E28093210234C0CE51C63047 -:1059800088F5EC2FF0E0E256FD4F8081809386038E -:1059900029C0CE34E9F020F4CB3421F56AE013C0FD -:1059A000C13579F0C235F1F461E00DC08091860314 -:1059B000882319F01092860315C081E08093870335 -:1059C00015C061E006C0809186030E94E92A0AC0E2 -:1059D0006AE0809186030E945F2B04C010928703C7 -:1059E00080E004C081E002C080E0AACFCF9108959A -:1059F0000E948A28811102C00E9466280E94AB285A -:105A00008093A20380FF02C0869501C080E00C94C1 -:105A1000F6058091A203982F9695292F30E0233028 -:105A200031054CF49F5F990F8170892B81608093C1 -:105A3000A2030E94AF288091A20386950C94F605DC -:105A40008091A203982F969591F09158990F8170AB -:105A5000892B8093A2038E7F91E009F490E08091DE -:105A6000A20390FB80F98093A2030E94AF2880914B -:105A7000A20386950C94F6058091A203982F909529 -:105A800090FB80F98093A2030E94AF288091A2032B -:105A900080FF02C0869501C080E00C94F6059091CD -:105AA000A203892F86958F5F8F779170843028F4B9 -:105AB000880F892B8093A20302C09093A203809148 -:105AC000A2038E7F91E009F490E08091A20390FB05 -:105AD00080F98093A2030E94AF288091A20386954B -:105AE0000C94F6052091A203922F96958927982F62 -:105AF000990F822F8170892B8093A2038E7F91E072 -:105B000009F490E08091A20390FB80F98093A203B6 -:105B10000E94AF288091A20386950C94F6055058F8 -:105B2000BB27AA270ED075C166D130F06BD120F00B -:105B300031F49F3F11F41EF45BC10EF4E095E7FBD6 -:105B400051C1E92F77D180F3BA1762077307840731 -:105B5000950718F071F49EF58FC10EF4E0950B2EA9 -:105B6000BA2FA02D0B01B90190010C01CA01A001AF -:105B70001124FF27591B99F0593F50F4503E68F10A -:105B80001A16F040A22F232F342F4427585FF3CF4B -:105B9000469537952795A795F0405395C9F77EF41C -:105BA0001F16BA0B620B730B840BBAF09150A1F065 -:105BB000FF0FBB1F661F771F881FC2F70EC0BA0FEB -:105BC000621F731F841F48F4879577956795B79573 -:105BD000F7959E3F08F0B3CF9395880F08F099276B -:105BE000EE0F979587950895D9D008F481E0089530 -:105BF0000CD00FC107D140F0FED030F021F45F3F50 -:105C000019F0F0C0511139C1F3C014D198F39923A0 -:105C1000C9F35523B1F3951B550BBB27AA27621770 -:105C20007307840738F09F5F5F4F220F331F441FB5 -:105C3000AA1FA9F333D00E2E3AF0E0E830D09150ED -:105C40005040E695001CCAF729D0FE2F27D0660FDA -:105C5000771F881FBB1F261737074807AB07B0E819 -:105C600009F0BB0B802DBF01FF2793585F4F2AF02F -:105C70009E3F510568F0B6C000C15F3FECF3983E0F -:105C8000DCF3869577956795B795F7959F5FC9F78C -:105C9000880F911D9695879597F90895E1E0660F15 -:105CA000771F881FBB1F621773078407BA0720F08E -:105CB000621B730B840BBA0BEE1F88F7E0950895F7 -:105CC00004D06894B111D9C00895BCD088F09F5712 -:105CD00090F0B92F9927B751A0F0D1F0660F771F38 -:105CE000881F991F1AF0BA95C9F712C0B13081F018 -:105CF000C3D0B1E00895C0C0672F782F8827B85F60 -:105D000039F0B93FCCF3869577956795B395D9F778 -:105D10003EF490958095709561957F4F8F4F9F4F82 -:105D20000895E89409C097FB3EF49095809570958E -:105D300061957F4F8F4F9F4F9923A9F0F92F96E9D7 -:105D4000BB279395F695879577956795B795F1114C -:105D5000F8CFFAF4BB0F11F460FF1BC06F5F7F4FE9 -:105D60008F4F9F4F16C0882311F096E911C07723FB -:105D700021F09EE8872F762F05C0662371F096E804 -:105D8000862F70E060E02AF09A95660F771F881FD3 -:105D9000DAF7880F9695879597F90895990F000877 -:105DA000550FAA0BE0E8FEEF16161706E807F907ED -:105DB000C0F012161306E407F50798F0621B730B88 -:105DC000840B950B39F40A2661F0232B242B252B09 -:105DD00021F408950A2609F4A140A6958FEF811DAC -:105DE000811D089597F99F6780E870E060E008954D -:105DF0009FEF80EC089500240A94161617061806E3 -:105E00000906089500240A941216130614060506BE -:105E10000895092E0394000C11F4882352F0BB0F4F -:105E200040F4BF2B11F460FF04C06F5F7F4F8F4FB2 -:105E30009F4F089557FD9058440F551F59F05F3FED -:105E400071F04795880F97FB991F61F09F3F79F09C -:105E500087950895121613061406551FF2CF46951E -:105E6000F1DF08C0161617061806991FF1CF8695A0 -:105E70007105610508940895E894BB276627772784 -:105E8000CB0197F908958ADF08F48FEF08950BD0BE -:105E9000C0CFB1DF28F0B6DF18F0952309F0A2CF0C -:105EA000A7CF1124EACFC6DFA0F3959FD1F3950FBA -:105EB00050E0551F629FF001729FBB27F00DB11D8E -:105EC000639FAA27F00DB11DAA1F649F6627B00D1E -:105ED000A11D661F829F2227B00DA11D621F739F07 -:105EE000B00DA11D621F839FA00D611D221F749F15 -:105EF0003327A00D611D231F849F600D211D822F5C -:105F0000762F6A2F11249F5750408AF0E1F08823A2 -:105F10004AF0EE0FFF1FBB1F661F771F881F9150AF -:105F20005040A9F79E3F510570F05CCFA6CF5F3F70 -:105F3000ECF3983EDCF3869577956795B795F795E2 -:105F4000E7959F5FC1F7FE2B880F911D969587956A -:105F500097F90895FA01EE0FFF1F309621053105DC -:105F600099F16115710561F48038BFE39B0749F130 -:105F700068949038810561F08038BFEF9B0741F04D -:105F8000992342F5FF3FE1053105210511F1E89420 -:105F90000894E795D901AA2329F4AB2FBE2FF85F07 -:105FA000D0F310C0FF5F70F4A695E0F7F73950F01A -:105FB00019F0FF3A38F49F779F930CD00F9007FCAD -:105FC000905808953EF014CF60E070E080E89FE3C1 -:105FD00008954FE79F775F934F933F932F939ED002 -:105FE0002F913F914F915F9152DF05C019F40EF050 -:105FF000F9CE42CFFDCE26DFC8F39638C0F707F8BA -:106000000F92E8942BE33AEA48EB5FE74EDF0F92FA -:106010000F920F924DB75EB70F92C0D0E0E4F1E05F -:1060200016D04F915F91EF91FF91E595EE1FFF1F05 -:1060300049F0FE57E0684427EE0F441FFA95E1F758 -:106040004195550B32D00F9007FE26C00895DF937F -:10605000CF931F930F93FF92EF92DF927B018C01FE -:10606000689405C0DA2EEF011EDFFE01E894A591C9 -:106070002591359145915591AEF3EF0162DDFE0119 -:106080009701A801DA9479F7DF90EF90FF900F91D4 -:106090001F91CF91DF9108959B01AC0160E070E00A -:1060A00080E89FE3A5CD9ECEACC0CCDEE8F399237B -:1060B000D9F3940F511DBBF39150504094F059F017 -:1060C000882332F0660F771F881F91505040C1F728 -:1060D0009E3F510544F7880F911D9695879597F936 -:1060E00008955F3FACF0983E9CF0BB27869577956E -:1060F0006795B79508F4B1609395C1F7BB0F58F752 -:1061000011F460FFE8CF6F5F7F4F8F4F9F4FE3CF5A -:10611000B4CE0EF076C06CCE689464CE93DEC8F335 -:106120009923D1F3C6F3DF93CF931F930F93FF927D -:10613000C92FDD2788232AF02197660F771F881F34 -:10614000DAF720E030E040E85FEB9FE3883920F0A9 -:10615000803E30F021968F77E3DCE8E6F1E003C083 -:10616000DFDCE5E9F1E073DF8B01BE01EC01FB2E22 -:106170006F5771097595771F880B990BD4DD28E14E -:1061800032E741E35FE38FDEAF2D9801AE01FF9070 -:106190000F911F91CF91DF91D4DC3BCEFA01DC014E -:1061A000AA0FBB1F9B01AC01BF5728F4222733273E -:1061B000442750781FC0B75188F4AB2F0024469570 -:1061C00037952795011CA395D2F3002069F0220F83 -:1061D000331F441FB395DAF30DD0A1CC61307105A4 -:1061E000A0E88A07B94630F49B01AC0166277727FF -:1061F00088279078309621F020833183428353831F -:1062000008959F3F31F0915020F4879577956795D9 -:10621000B795880F911D9695879597F90895AA1BB4 -:10622000BB1B51E107C0AA1FBB1FA617B70710F081 -:10623000A61BB70B881F991F5A95A9F780959095B3 -:10624000BC01CD01089597FB072E16F4009407D0EA -:1062500077FD09D00E940F3107FC05D03EF49095E0 -:1062600081959F4F0895709561957F4F0895EE0F2A -:10627000FF1F0590F491E02D0994F999FECF92BD8E -:1062800081BDF89A992780B50895A8E1B0E042E071 -:1062900050E00C946531262FF999FECF92BD81BD57 -:1062A000F89A019700B4021639F01FBA20BD0FB654 -:1062B000F894FA9AF99A0FBE08950196272F0E9432 -:1062C0004C310C944B31DC01CB01FC01F999FECF30 -:1062D00006C0F2BDE1BDF89A319600B40D9241506E -:0A62E0005040B8F70895F894FFCF7E -:1062EA0007000C52D02445000000410000DC4400A5 -:1062FA0000004152D0A4440000404100005C440028 -:10630A0000004148F17644000000415C978A44004D -:10631A000000411FD592440000004152D0A444001D -:10632A000000415CFFB844000000410AA7CF4400C6 -:10633A000000410000DC44000000410AA7CF4400ED -:10634A000000410000DC44000000410000000000A1 -:10635A0000804052D0244500004041000000000067 -:10636A000080400AA74F45000040410AA7CF4400D9 -:10637A000000410000DC4400000041000000000071 -:10638A0000804052D0244500000041000000000077 -:10639A000080405CFF38450000004100000000001A -:1063AA0000804052D02445000000410AA7CF440093 -:1063BA000000410000DC4400000041000000000031 -:1063CA0000804052D024450000804110F1764400FC -:1063DA0000A04112F1F6440000004141909B4400A4 -:1063EA0000A04112F1F64400000041050000003F00 -:1063FA000000C8426A14F814D514A1146D14016C73 -:10640A00032808140A321E000002000400050007CF -:10641A000009000B000C000E0010001100130015FB -:10642A0000170018001A001C001D001F002100237D -:10643A000024002600280029002B002D002F003000 -:10644A0000320034003500370039003B0042004575 -:10645A000025002600430061006000200037006428 -:10646A000065006600670044004600240047003FBC -:10647A004D36010BB40A7E0A2A0A430A5C0A010253 -:08648A000304050607080900E0 +:1056B0006093200208958FEF8093200208958091D7 +:1056C0001F02262F30E0280F311D2F3F310524F413 +:1056D000680F60931F0208958FEF80931F02089553 +:1056E000833011F128F4813049F0823091F008952F +:1056F000853081F120F18630C1F108958091240236 +:10570000681720F4861B80932402089510922402C7 +:10571000089580912302681720F4861B809323024A +:10572000089510922302089580912202681720F4B0 +:10573000861B809322020895109222020895809180 +:105740002102681720F4861B80932102089510928D +:105750002102089580912002681720F4861B80930F +:105760002002089510922002089580911F02681768 +:1057700020F4861B80931F02089510921F02089543 +:105780000F931F938732D8F58E3108F087C08E3083 +:1057900009F471C098F4873009F45BC08B3009F4C8 +:1057A00091C0863009F095C08091C703817F8E7FBC +:1057B0008093C70381E08093D7038CC0863109F4BE +:1057C00081C068F4803109F084C08091C70383FBF5 +:1057D000222720F991E0922790FB83F955C0893167 +:1057E00009F470C08B3109F074C08091C70381FB4C +:1057F000222720F991E0922790FB81F945C0883358 +:1058000009F460C050F4893209F45EC0853309F4AC +:105810005BC0873209F458C05CC0833409F454C0BB +:1058200028F48A3308F455C0895339C0883409F004 +:1058300050C00E946C210E94B2070FEF13ED20E3CD +:10584000015010402040E1F700C000000E943F28B6 +:1058500039C09091C703892F8095817080FB90F9A2 +:1058600029F0966098609093C70334C0997F977F22 +:105870009093C70327C08091C70382FB222720F99A +:1058800091E0922790FB82F98093C7039923D1F08E +:105890008091C70381608093C70314C08D5141E09C +:1058A00050E060E070E08A019B0104C0000F111F0E +:1058B000221F331F8A95D2F7C901B8010E942825FB +:1058C0000E946C2181E006C061E070E080E090E021 +:1058D000F5CF80E01F910F91089580E0089580E05A +:1058E0000895CF93C82F8091D703813069F018F0C5 +:1058F0008230C9F184C0E0911D02F0911E028081C6 +:10590000823209F07EC007C0E0911D02F0911E02B4 +:105910008081823261F48C2F0E946D2C811104C031 +:105920008C2F0E94C02B1DC081E090E01AC08C2FEC +:105930000E946F2C811114C0C43179F048F4CB302F +:1059400079F0C03109F061C082E08093D70308C0CC +:10595000C93219F0C83321F058C01092D70355C08E +:1059600081E0817054C0C93291F120F5C43179F1E0 +:10597000B0F4C73009F047C08EE18093240282E37F +:10598000809323028AE08093220284E180932102A3 +:1059900088E08093200288E280931F0234C0CE51B9 +:1059A000C63088F5EC2FF0E0E451FD4F8081809304 +:1059B000D60329C0CE34E9F020F4CB3421F56AE0D7 +:1059C00013C0C13579F0C235F1F461E00DC08091AA +:1059D000D603882319F01092D60315C081E0809376 +:1059E000D70315C061E006C08091D6030E94FA2A51 +:1059F0000AC06AE08091D6030E94702B04C0109206 +:105A0000D70380E004C081E002C080E0AACFCF913C +:105A100008950E949B28811102C00E9477280E944D +:105A2000BC288093F20380FF02C0869501C080E00D +:105A30000C94D2058091F203982F9695292F30E08F +:105A4000233031054CF49F5F990F8170892B816061 +:105A50008093F2030E94C0288091F20386950C94F3 +:105A6000D2058091F203982F969591F09158990F55 +:105A70008170892B8093F2038E7F91E009F490E08E +:105A80008091F20390FB80F98093F2030E94C0287A +:105A90008091F20386950C94D2058091F203982FA1 +:105AA000909590FB80F98093F2030E94C02880912A +:105AB000F20380FF02C0869501C080E00C94D205FD +:105AC0009091F203892F86958F5F8F779170843044 +:105AD00028F4880F892B8093F20302C09093F2037D +:105AE0008091F2038E7F91E009F490E08091F203BF +:105AF00090FB80F98093F2030E94C0288091F2030A +:105B000086950C94D2052091F203922F96958927C1 +:105B1000982F990F822F8170892B8093F2038E7FAB +:105B200091E009F490E08091F20390FB80F980937A +:105B3000F2030E94C0288091F20386950C94D2054E +:105B40005058BB27AA270ED0D1C1C2D130F0C7D13F +:105B500020F031F49F3F11F41EF4B7C10EF4E0952C +:105B6000E7FB9FC1E92FD3D180F3BA176207730710 +:105B70008407950718F071F49EF5EBC10EF4E095DB +:105B80000B2EBA2FA02D0B01B90190010C01CA01F7 +:105B9000A0011124FF27591B99F0593F50F4503EA2 +:105BA00068F11A16F040A22F232F342F4427585F94 +:105BB000F3CF469537952795A795F0405395C9F7AC +:105BC0007EF41F16BA0B620B730B840BBAF0915064 +:105BD000A1F0FF0FBB1F661F771F881FC2F70EC003 +:105BE000BA0F621F731F841F48F4879577956795D6 +:105BF000B795F7959E3F08F0B3CF9395880F08F0BF +:105C00009927EE0F97958795089527D108F481E09D +:105C100008950CD06BC163D140F05AD130F021F41B +:105C20005F3F19F03EC1511195C14FC170D198F33A +:105C30009923C9F35523B1F3951B550BBB27AA270D +:105C400062177307840738F09F5F5F4F220F331F7F +:105C5000441FAA1FA9F333D00E2E3AF0E0E830D04B +:105C600091505040E695001CCAF729D0FE2F27D04E +:105C7000660F771F881FBB1F261737074807AB071C +:105C8000B0E809F0BB0B802DBF01FF2793585F4F91 +:105C90002AF09E3F510568F004C15CC15F3FECF300 +:105CA000983EDCF3869577956795B795F7959F5F56 +:105CB000C9F7880F911D9695879597F90895E1E0AA +:105CC000660F771F881FBB1F621773078407BA0709 +:105CD00020F0621B730B840BBA0BEE1F88F7E09564 +:105CE000089504D06894B11135C1089518D188F091 +:105CF0009F5790F0B92F9927B751A0F0D1F0660FB8 +:105D0000771F881F991F1AF0BA95C9F712C0B130D2 +:105D100081F01FD1B1E008951CC1672F782F88272B +:105D2000B85F39F0B93FCCF3869577956795B39511 +:105D3000D9F73EF490958095709561957F4F8F4F80 +:105D40009F4F0895E89409C097FB3EF49095809585 +:105D5000709561957F4F8F4F9F4F9923A9F0F92F31 +:105D600096E9BB279395F695879577956795B795AF +:105D7000F111F8CFFAF4BB0F11F460FF1BC06F5F95 +:105D80007F4F8F4F9F4F16C0882311F096E911C0A7 +:105D9000772321F09EE8872F762F05C0662371F0C8 +:105DA00096E8862F70E060E02AF09A95660F771FDC +:105DB000881FDAF7880F9695879597F9089588D008 +:105DC00018F011F08CD038F480C0C4C0E92F9FD0F7 +:105DD000B0F35523C9F3E7FB6217730784079507F0 +:105DE000A8F199F3E92FFF2788232AF03197660F4E +:105DF000771F881FDAF7952F5527442332F09150EB +:105E00005040220F331F441FD2F7BB27E91BF50B6D +:105E1000621B730B840BB109C1F222F4620F731F72 +:105E2000841FB11D31972AF0660F771F881FBB1F93 +:105E3000EFCF915050405AF041F0882332F0660F76 +:105E4000771F881F91505040C1F7939530C08695B9 +:105E5000779567959F5FD9F7F8CF990F0008550F91 +:105E6000AA0BE0E8FEEF16161706E807F907C0F0E0 +:105E700012161306E407F50798F0621B730B840BE8 +:105E8000950B39F40A2661F0232B242B252B21F4C2 +:105E900008950A2609F4A140A6958FEF811D811D62 +:105EA000089597F99F6780E870E060E008959F3F4C +:105EB00031F0915020F4879577956795B795880FC5 +:105EC000911D9695879597F908959FEF80EC089519 +:105ED00000240A94161617061806090608950024C9 +:105EE0000A9412161306140605060895092E039443 +:105EF000000C11F4882352F0BB0F40F4BF2B11F4B7 +:105F000060FF04C06F5F7F4F8F4F9F4F089557FD15 +:105F10009058440F551F59F05F3F71F04795880F17 +:105F200097FB991F61F09F3F79F0879508951216AE +:105F300013061406551FF2CF4695F1DF08C016165A +:105F400017061806991FF1CF86957105610508940B +:105F50000895E894BB2766277727CB0197F9089522 +:105F60007CDF08F48FEF08950BD0C0CFB1DF28F0AD +:105F7000B6DF18F0952309F094CFA7CF1124EACF0C +:105F8000C6DFA0F3959FD1F3950F50E0551F629F98 +:105F9000F001729FBB27F00DB11D639FAA27F00D82 +:105FA000B11DAA1F649F6627B00DA11D661F829FA9 +:105FB0002227B00DA11D621F739FB00DA11D621F8E +:105FC000839FA00D611D221F749F3327A00D611DAB +:105FD000231F849F600D211D822F762F6A2F11248D +:105FE0009F5750408AF0E1F088234AF0EE0FFF1FE0 +:105FF000BB1F661F771F881F91505040A9F79E3F17 +:10600000510570F04ECFA6CF5F3FECF3983EDCF326 +:10601000869577956795B795F795E7959F5FC1F753 +:10602000FE2B880F911D9695879597F90895FA0193 +:10603000EE0FFF1F30962105310599F161157105AD +:1060400061F48038BFE39B0749F16894903881057B +:1060500061F08038BFEF9B0741F0992342F5FF3F85 +:10606000E1053105210511F1E8940894E795D9017E +:10607000AA2329F4AB2FBE2FF85FD0F310C0FF5F27 +:1060800070F4A695E0F7F73950F019F0FF3A38F4BC +:106090009F779F930CD00F9007FC905808953EF087 +:1060A00014CF60E070E080E89FE308954FE79F77AA +:1060B0005F934F933F932F939ED02F913F914F919A +:1060C0005F9152DF05C019F40EF0EBCE42CFFDCE4A +:1060D00026DFC8F39638C0F707F80F92E8942BE351 +:1060E0003AEA48EB5FE74EDF0F920F920F924DB7FF +:1060F0005EB70F92C0D0E8EFF0E016D04F915F91FD +:10610000EF91FF91E595EE1FFF1F49F0FE57E06804 +:106110004427EE0F441FFA95E1F74195550B32D015 +:106120000F9007FE26C00895DF93CF931F930F9320 +:10613000FF92EF92DF927B018C01689405C0DA2E0A +:10614000EF011EDFFE01E894A5912591359145915F +:106150005591AEF3EF0106DDFE019701A801DA9437 +:1061600079F7DF90EF90FF900F911F91CF91DF9122 +:1061700008959B01AC0160E070E080E89FE349CDA9 +:1061800090CE95CECCDEE8F39923D9F3940F511D30 +:10619000BBF39150504094F059F0882332F0660FD1 +:1061A000771F881F91505040C1F79E3F510544F71B +:1061B000880F911D9695879597F908955F3FACF0EC +:1061C000983E9CF0BB27869577956795B79508F420 +:1061D000B1609395C1F7BB0F58F711F460FFE8CF9A +:1061E0006F5F7F4F8F4F9F4FE3CFB4CE0EF05FCEE8 +:1061F0006CCE689456CE93DEC8F39923D1F3C6F3E0 +:10620000DF93CF931F930F93FF92C92FDD2788232E +:106210002AF02197660F771F881FDAF720E030E019 +:1062200040E85FEB9FE3883920F0803E30F0219614 +:106230008F7787DCE0E2F1E003C083DCEDE4F1E09E +:1062400073DF8B01BE01EC01FB2E6F577109759551 +:10625000771F880B990B78DD28E132E741E35FE394 +:106260008FDEAF2D9801AE01FF900F911F91CF915E +:10627000DF9178DC3BCEFA01DC01AA0FBB1F9B014A +:10628000AC01BF5728F422273327442750781FC07A +:10629000B75188F4AB2F0024469537952795011CFC +:1062A000A395D2F3002069F0220F331F441FB3954A +:1062B000DAF30DD045CC61307105A0E88A07B94604 +:1062C00030F49B01AC0166277727882790783096B9 +:1062D00021F020833183428353830895AA1BBB1B83 +:1062E00051E107C0AA1FBB1FA617B70710F0A61BD6 +:1062F000B70B881F991F5A95A9F780959095BC01F7 +:10630000CD01089597FB072E16F4009407D077FD72 +:1063100009D00E946E3107FC05D03EF4909581951E +:106320009F4F0895709561957F4F0895EE0FFF1F61 +:106330000590F491E02D0994F999FECF92BD81BDAD +:10634000F89A992780B50895A8E1B0E042E050E0BE +:106350000C94C431262FF999FECF92BD81BDF89AD5 +:10636000019700B4021639F01FBA20BD0FB6F89499 +:10637000FA9AF99A0FBE08950196272F0E94AB3121 +:106380000C94AA31DC01CB01FC01F999FECF06C0C7 +:10639000F2BDE1BDF89A319600B40D9241505040E3 +:0863A000B8F70895F894FFCF4F +:1063A8000C52D02445000000410000DC44000000ED +:1063B8004152D0A4440000404100005C4400000069 +:1063C8004148F17644000000415C978A440000008F +:1063D800411FD592440000004152D0A4440000005F +:1063E800415CFFB844000000410AA7CF4400000008 +:1063F800410000DC44000000410AA7CF440000002F +:10640800410000DC44000000410000000000008062 +:106418004052D024450000404100000000000080A8 +:10642800400AA74F45000040410AA7CF440000009A +:10643800410000DC44000000410000000000008032 +:106448004052D024450000004100000000000080B8 +:10645800405CFF384500000041000000000000805B +:106468004052D02445000000410AA7CF4400000054 +:10647800410000DC440000004100000000000080F2 +:106488004052D024450000804110F176440000A01D +:106498004112F1F6440000004141909B440000A0E5 +:1064A8004112F1F64400000041050000003F0000E1 +:1064B800C8427B140915E614B2147E1401BC0328E3 +:1064C80008140A321E000002000400050007000933 +:1064D800000B000C000E001000110013001500172F +:1064E8000018001A001C001D001F002100230024B2 +:1064F800002600280029002B002D002F0030003234 +:106508000034003500370039003B004200450025C3 +:106518000026004300610060002000370064006529 +:1065280000660067004400460024004700314980A7 +:106538003F5D8B803FF8BF803FCAE1803F73ED80AD +:106548003FCAE1803FF8BF803F5D8B803F31498083 +:106558003F0000803FF16D7F3F75EA7E3F4C827EB1 +:106568003F833F7E3F84287E3F833F7E3F4C827E31 +:106578003F75EA7E3FF16D7F3F0000803F3F4D361B +:10658800B90A6C0A360AE209FB09140A0102030473 +:06659800050607080900DA :00000001FF diff --git a/quantum/audio/voices.c b/quantum/audio/voices.c index 0921bd593..d2316ba1b 100644 --- a/quantum/audio/voices.c +++ b/quantum/audio/voices.c @@ -54,28 +54,28 @@ float voice_envelope(float frequency) { } break; - case octave_crunch: - polyphony_rate = 0; - switch (compensated_index) { - case 0 ... 9: - case 20 ... 24: - case 30 ... 32: - frequency = frequency / 2; - note_timbre = TIMBRE_12; - break; - - case 10 ... 19: - case 25 ... 29: - case 33 ... 35: - frequency = frequency * 2; - note_timbre = TIMBRE_12; - break; + // case octave_crunch: + // polyphony_rate = 0; + // switch (compensated_index) { + // case 0 ... 9: + // case 20 ... 24: + // case 30 ... 32: + // frequency = frequency / 2; + // note_timbre = TIMBRE_12; + // break; + + // case 10 ... 19: + // case 25 ... 29: + // case 33 ... 35: + // frequency = frequency * 2; + // note_timbre = TIMBRE_12; + // break; - default: - note_timbre = TIMBRE_12; - break; - } - break; + // default: + // note_timbre = TIMBRE_12; + // break; + // } + // break; case duty_osc: // This slows the loop down a substantial amount, so higher notes may freeze -- cgit v1.2.3-70-g09d2 From 0656f2fa10e25e160617c3e5d14cfbae35dd9c8d Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Fri, 29 Apr 2016 22:19:40 -0400 Subject: moves backlight functionality to keyboard files and updates template makefile previously there were two backlight.c files (bad) --- keyboard/atomic/Makefile | 4 --- keyboard/atomic/atomic.c | 61 ++++++++++++++++++++++++++++++++++++++++++ keyboard/atomic/atomic.h | 5 +++- keyboard/atomic/backlight.c | 63 -------------------------------------------- keyboard/planck/Makefile | 4 --- keyboard/planck/backlight.c | 61 ------------------------------------------ keyboard/planck/planck.c | 61 ++++++++++++++++++++++++++++++++++++++++++ keyboard/planck/planck.h | 1 + keyboard/preonic/Makefile | 5 ---- keyboard/preonic/backlight.c | 61 ------------------------------------------ keyboard/preonic/preonic.c | 63 +++++++++++++++++++++++++++++++++++++++++++- keyboard/preonic/preonic.h | 1 + quantum/template/Makefile | 46 ++++++++++++++++++++++---------- quantum/template/template.c | 61 ++++++++++++++++++++++++++++++++++++++++++ quantum/template/template.h | 5 +++- 15 files changed, 287 insertions(+), 215 deletions(-) delete mode 100644 keyboard/atomic/backlight.c delete mode 100644 keyboard/planck/backlight.c delete mode 100644 keyboard/preonic/backlight.c (limited to 'quantum') diff --git a/keyboard/atomic/Makefile b/keyboard/atomic/Makefile index 1d91c34b7..c1a0a6db4 100644 --- a/keyboard/atomic/Makefile +++ b/keyboard/atomic/Makefile @@ -171,10 +171,6 @@ endif endif -ifeq ($(strip $(BACKLIGHT_ENABLE)), yes) - SRC := backlight.c $(SRC) -endif - # Optimize size but this may cause error "relocation truncated to fit" #EXTRALDFLAGS = -Wl,--relax diff --git a/keyboard/atomic/atomic.c b/keyboard/atomic/atomic.c index 5e31264e6..399649716 100644 --- a/keyboard/atomic/atomic.c +++ b/keyboard/atomic/atomic.c @@ -57,3 +57,64 @@ void led_set_kb(uint8_t usb_led) { led_set_user(usb_led); } + +#ifdef BACKLIGHT_ENABLE +#define CHANNEL OCR1C + +void backlight_init_ports() +{ + + // Setup PB7 as output and output low. + 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; + + backlight_init(); +} + +void backlight_set(uint8_t level) +{ + if ( level == 0 ) + { + // Turn off PWM control on PB7, revert to output low. + TCCR1A &= ~(_BV(COM1C1)); + CHANNEL = 0x0; + // Prevent backlight blink on lowest level + PORTB &= ~(_BV(PORTB7)); + } + else if ( level == BACKLIGHT_LEVELS ) + { + // Prevent backlight blink on lowest level + PORTB &= ~(_BV(PORTB7)); + // Turn on PWM control of PB7 + TCCR1A |= _BV(COM1C1); + // Set the brightness + CHANNEL = 0xFFFF; + } + else + { + // Prevent backlight blink on lowest level + PORTB &= ~(_BV(PORTB7)); + // Turn on PWM control of PB7 + TCCR1A |= _BV(COM1C1); + // Set the brightness + CHANNEL = 0xFFFF >> ((BACKLIGHT_LEVELS - level) * ((BACKLIGHT_LEVELS + 1) / 2)); + } +} + +#endif \ No newline at end of file diff --git a/keyboard/atomic/atomic.h b/keyboard/atomic/atomic.h index d5461e424..0c7aeb1cc 100644 --- a/keyboard/atomic/atomic.h +++ b/keyboard/atomic/atomic.h @@ -3,8 +3,11 @@ #include "matrix.h" #include "keymap_common.h" -#include "backlight.h" +#ifdef BACKLIGHT_ENABLE + #include "backlight.h" +#endif #include +#include // This a shortcut to help you visually see your layout. // The following is an example using the Planck MIT layout diff --git a/keyboard/atomic/backlight.c b/keyboard/atomic/backlight.c deleted file mode 100644 index 647b57e71..000000000 --- a/keyboard/atomic/backlight.c +++ /dev/null @@ -1,63 +0,0 @@ - -#include -#include "backlight.h" -#include "atomic.h" - - -#define CHANNEL OCR1C - -void backlight_init_ports() -{ - - // Setup PB7 as output and output low. - 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; - - backlight_init(); -} - -void backlight_set(uint8_t level) -{ - if ( level == 0 ) - { - // Turn off PWM control on PB7, revert to output low. - TCCR1A &= ~(_BV(COM1C1)); - CHANNEL = 0x0; - // Prevent backlight blink on lowest level - PORTB &= ~(_BV(PORTB7)); - } - else if ( level == BACKLIGHT_LEVELS ) - { - // Prevent backlight blink on lowest level - PORTB &= ~(_BV(PORTB7)); - // Turn on PWM control of PB7 - TCCR1A |= _BV(COM1C1); - // Set the brightness - CHANNEL = 0xFFFF; - } - else - { - // Prevent backlight blink on lowest level - PORTB &= ~(_BV(PORTB7)); - // Turn on PWM control of PB7 - TCCR1A |= _BV(COM1C1); - // Set the brightness - CHANNEL = 0xFFFF >> ((BACKLIGHT_LEVELS - level) * ((BACKLIGHT_LEVELS + 1) / 2)); - } -} \ No newline at end of file diff --git a/keyboard/planck/Makefile b/keyboard/planck/Makefile index 01d9e3ce9..c0c6201cb 100644 --- a/keyboard/planck/Makefile +++ b/keyboard/planck/Makefile @@ -171,10 +171,6 @@ endif endif -ifeq ($(strip $(BACKLIGHT_ENABLE)), yes) - SRC := backlight.c $(SRC) -endif - # Optimize size but this may cause error "relocation truncated to fit" #EXTRALDFLAGS = -Wl,--relax diff --git a/keyboard/planck/backlight.c b/keyboard/planck/backlight.c deleted file mode 100644 index f69364b2a..000000000 --- a/keyboard/planck/backlight.c +++ /dev/null @@ -1,61 +0,0 @@ - -#include -#include "backlight.h" - -#define CHANNEL OCR1C - -void backlight_init_ports() -{ - - // Setup PB7 as output and output low. - 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; - - backlight_init(); -} - -void backlight_set(uint8_t level) -{ - if ( level == 0 ) - { - // Turn off PWM control on PB7, revert to output low. - TCCR1A &= ~(_BV(COM1C1)); - CHANNEL = 0x0; - // Prevent backlight blink on lowest level - PORTB &= ~(_BV(PORTB7)); - } - else if ( level == BACKLIGHT_LEVELS ) - { - // Prevent backlight blink on lowest level - PORTB &= ~(_BV(PORTB7)); - // Turn on PWM control of PB7 - TCCR1A |= _BV(COM1C1); - // Set the brightness - CHANNEL = 0xFFFF; - } - else - { - // Prevent backlight blink on lowest level - PORTB &= ~(_BV(PORTB7)); - // Turn on PWM control of PB7 - TCCR1A |= _BV(COM1C1); - // Set the brightness - CHANNEL = 0xFFFF >> ((BACKLIGHT_LEVELS - level) * ((BACKLIGHT_LEVELS + 1) / 2)); - } -} \ No newline at end of file diff --git a/keyboard/planck/planck.c b/keyboard/planck/planck.c index 4b39cf1e8..655850150 100644 --- a/keyboard/planck/planck.c +++ b/keyboard/planck/planck.c @@ -32,3 +32,64 @@ void matrix_scan_kb(void) { void process_action_kb(keyrecord_t *record) { process_action_user(record); } + +#ifdef BACKLIGHT_ENABLE +#define CHANNEL OCR1C + +void backlight_init_ports() +{ + + // Setup PB7 as output and output low. + 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; + + backlight_init(); +} + +void backlight_set(uint8_t level) +{ + if ( level == 0 ) + { + // Turn off PWM control on PB7, revert to output low. + TCCR1A &= ~(_BV(COM1C1)); + CHANNEL = 0x0; + // Prevent backlight blink on lowest level + PORTB &= ~(_BV(PORTB7)); + } + else if ( level == BACKLIGHT_LEVELS ) + { + // Prevent backlight blink on lowest level + PORTB &= ~(_BV(PORTB7)); + // Turn on PWM control of PB7 + TCCR1A |= _BV(COM1C1); + // Set the brightness + CHANNEL = 0xFFFF; + } + else + { + // Prevent backlight blink on lowest level + PORTB &= ~(_BV(PORTB7)); + // Turn on PWM control of PB7 + TCCR1A |= _BV(COM1C1); + // Set the brightness + CHANNEL = 0xFFFF >> ((BACKLIGHT_LEVELS - level) * ((BACKLIGHT_LEVELS + 1) / 2)); + } +} + +#endif \ No newline at end of file diff --git a/keyboard/planck/planck.h b/keyboard/planck/planck.h index edcb5fbff..c5b59d999 100644 --- a/keyboard/planck/planck.h +++ b/keyboard/planck/planck.h @@ -10,6 +10,7 @@ #include "rgblight.h" #endif #include +#include #ifdef MIDI_ENABLE #include #endif diff --git a/keyboard/preonic/Makefile b/keyboard/preonic/Makefile index 3504e2720..259dd6686 100644 --- a/keyboard/preonic/Makefile +++ b/keyboard/preonic/Makefile @@ -162,11 +162,6 @@ endif endif -ifeq ($(strip $(BACKLIGHT_ENABLE)), yes) - SRC := backlight.c $(SRC) -endif - - # Optimize size but this may cause error "relocation truncated to fit" #EXTRALDFLAGS = -Wl,--relax diff --git a/keyboard/preonic/backlight.c b/keyboard/preonic/backlight.c deleted file mode 100644 index f69364b2a..000000000 --- a/keyboard/preonic/backlight.c +++ /dev/null @@ -1,61 +0,0 @@ - -#include -#include "backlight.h" - -#define CHANNEL OCR1C - -void backlight_init_ports() -{ - - // Setup PB7 as output and output low. - 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; - - backlight_init(); -} - -void backlight_set(uint8_t level) -{ - if ( level == 0 ) - { - // Turn off PWM control on PB7, revert to output low. - TCCR1A &= ~(_BV(COM1C1)); - CHANNEL = 0x0; - // Prevent backlight blink on lowest level - PORTB &= ~(_BV(PORTB7)); - } - else if ( level == BACKLIGHT_LEVELS ) - { - // Prevent backlight blink on lowest level - PORTB &= ~(_BV(PORTB7)); - // Turn on PWM control of PB7 - TCCR1A |= _BV(COM1C1); - // Set the brightness - CHANNEL = 0xFFFF; - } - else - { - // Prevent backlight blink on lowest level - PORTB &= ~(_BV(PORTB7)); - // Turn on PWM control of PB7 - TCCR1A |= _BV(COM1C1); - // Set the brightness - CHANNEL = 0xFFFF >> ((BACKLIGHT_LEVELS - level) * ((BACKLIGHT_LEVELS + 1) / 2)); - } -} \ No newline at end of file diff --git a/keyboard/preonic/preonic.c b/keyboard/preonic/preonic.c index f639f247a..211f8d029 100644 --- a/keyboard/preonic/preonic.c +++ b/keyboard/preonic/preonic.c @@ -38,4 +38,65 @@ void matrix_scan_kb(void) { void process_action_kb(keyrecord_t *record) { process_action_user(record); -} \ No newline at end of file +} + +#ifdef BACKLIGHT_ENABLE +#define CHANNEL OCR1C + +void backlight_init_ports() +{ + + // Setup PB7 as output and output low. + 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; + + backlight_init(); +} + +void backlight_set(uint8_t level) +{ + if ( level == 0 ) + { + // Turn off PWM control on PB7, revert to output low. + TCCR1A &= ~(_BV(COM1C1)); + CHANNEL = 0x0; + // Prevent backlight blink on lowest level + PORTB &= ~(_BV(PORTB7)); + } + else if ( level == BACKLIGHT_LEVELS ) + { + // Prevent backlight blink on lowest level + PORTB &= ~(_BV(PORTB7)); + // Turn on PWM control of PB7 + TCCR1A |= _BV(COM1C1); + // Set the brightness + CHANNEL = 0xFFFF; + } + else + { + // Prevent backlight blink on lowest level + PORTB &= ~(_BV(PORTB7)); + // Turn on PWM control of PB7 + TCCR1A |= _BV(COM1C1); + // Set the brightness + CHANNEL = 0xFFFF >> ((BACKLIGHT_LEVELS - level) * ((BACKLIGHT_LEVELS + 1) / 2)); + } +} + +#endif \ No newline at end of file diff --git a/keyboard/preonic/preonic.h b/keyboard/preonic/preonic.h index 51ed9ba39..030acdadb 100644 --- a/keyboard/preonic/preonic.h +++ b/keyboard/preonic/preonic.h @@ -10,6 +10,7 @@ #include "rgblight.h" #endif #include +#include #ifdef MIDI_ENABLE #include #endif diff --git a/quantum/template/Makefile b/quantum/template/Makefile index 4fa195468..1a535ef2c 100644 --- a/quantum/template/Makefile +++ b/quantum/template/Makefile @@ -111,23 +111,41 @@ OPT_DEFS += -DBOOTLOADER_SIZE=512 # Build Options -# comment out to disable the options. -# -BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000) -MOUSEKEY_ENABLE = yes # Mouse keys(+4700) -EXTRAKEY_ENABLE = yes # Audio control and System control(+450) -CONSOLE_ENABLE = yes # Console for debug(+400) -COMMAND_ENABLE = yes # Commands for debug and configuration -KEYBOARD_LOCK_ENABLE = yes # Allow locking of keyboard via magic key +# change yes to no to disable +# +BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = yes # Console for debug(+400) +COMMAND_ENABLE = yes # Commands for debug and configuration +KEYBOARD_LOCK_ENABLE = yes # Allow locking of keyboard via magic key # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE -# SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend -#NKRO_ENABLE = yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work -# BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality -# MIDI_ENABLE = YES # MIDI controls -# UNICODE_ENABLE = YES # Unicode -# BLUETOOTH_ENABLE = yes # Enable Bluetooth with the Adafruit EZ-Key HID +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend +# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +NKRO_ENABLE = no # USB Nkey Rollover +BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality +MIDI_ENABLE = no # MIDI controls +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +AUDIO_ENABLE = no # Audio output on port C6 +ifdef KEYMAP + +ifeq ("$(wildcard keymaps/$(KEYMAP).c)","") +ifneq ("$(wildcard keymaps/$(KEYMAP)/makefile.mk)","") + include keymaps/$(KEYMAP)/makefile.mk +endif +endif + +else + +ifneq ("$(wildcard keymaps/default/makefile.mk)","") + include keymaps/default/makefile.mk +endif + +endif + # Optimize size but this may cause error "relocation truncated to fit" #EXTRALDFLAGS = -Wl,--relax diff --git a/quantum/template/template.c b/quantum/template/template.c index cc52e496f..6050a2d20 100644 --- a/quantum/template/template.c +++ b/quantum/template/template.c @@ -46,3 +46,64 @@ void led_set_kb(uint8_t usb_led) { led_set_user(usb_led); } + +#ifdef BACKLIGHT_ENABLE +#define CHANNEL OCR1C + +void backlight_init_ports() +{ + + // Setup PB7 as output and output low. + 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; + + backlight_init(); +} + +void backlight_set(uint8_t level) +{ + if ( level == 0 ) + { + // Turn off PWM control on PB7, revert to output low. + TCCR1A &= ~(_BV(COM1C1)); + CHANNEL = 0x0; + // Prevent backlight blink on lowest level + PORTB &= ~(_BV(PORTB7)); + } + else if ( level == BACKLIGHT_LEVELS ) + { + // Prevent backlight blink on lowest level + PORTB &= ~(_BV(PORTB7)); + // Turn on PWM control of PB7 + TCCR1A |= _BV(COM1C1); + // Set the brightness + CHANNEL = 0xFFFF; + } + else + { + // Prevent backlight blink on lowest level + PORTB &= ~(_BV(PORTB7)); + // Turn on PWM control of PB7 + TCCR1A |= _BV(COM1C1); + // Set the brightness + CHANNEL = 0xFFFF >> ((BACKLIGHT_LEVELS - level) * ((BACKLIGHT_LEVELS + 1) / 2)); + } +} + +#endif \ No newline at end of file diff --git a/quantum/template/template.h b/quantum/template/template.h index b1c34d3cb..22742105a 100644 --- a/quantum/template/template.h +++ b/quantum/template/template.h @@ -3,7 +3,10 @@ #include "matrix.h" #include "keymap_common.h" -#include "backlight.h" +#ifdef BACKLIGHT_ENABLE + #include "backlight.h" +#endif +#include #include // This a shortcut to help you visually see your layout. -- cgit v1.2.3-70-g09d2